{"version":3,"sources":["scripts/vendor.js"],"names":["ChartAxes","require","restrict","scope","replace","link","element","attrs","chartCtrl","x","valuesX","xs","addXAxisValues","valuesXs","xsValues","xsI","xsItems","split","xsItem","addXSValues","y","y2","yAxis","item","items","yItem","yItems","addYAxis","ChartAxis","transclude","template","axisRotate","rotateAxis","ChartAxisX","position","axisPosition","axis","label","text","axisLabel","paddingLeft","paddingRight","height","padding","left","parseInt","right","axisHeight","max","show","axisLocaltime","localtime","axisMax","min","axisMin","type","axisType","xFormat","addAxisProperties","axisXFormat","setXFormat","ChartAxisXTick","tickFormatFunction","tick","count","tickCount","culling","tickCulling","cullingMax","angular","lowercase","tickCullingMax","multiline","tickMultiline","centered","tickCentered","rotate","tickRotate","fit","tickFit","tickValues","outer","indexOf","values","tickOuter","format","tickFormat","formatTime","d3","tickFormatTime","time","addXTick","addXTickFormatFunction","ChartAxisY","id","axisId","undefined","paddingTop","paddingBottom","top","bottom","axisCenter","axisInverted","inverted","axisInner","inner","center","ChartAxisYTick","addYTick","addYTickFormatFunction","ChartBar","bar","width","ratio","parseFloat","zerobased","addBar","C3Chart","$timeout","controller","bindto","showLabels","labelsFormatFunction","onZoomEndFunction","showSubchart","subchartOnBrushFunction","enableZoom","rescaleZoom","chartData","chartColumns","chartX","callbackFunction","emptyLabel","sortData","transitionDuration","initialConfig","interactionEnabled","addInteractionEnabled","addPadding","addSorting","addDataLabelsFormatFunction","addOnZoomEndFunction","addSubchartOnBrushFunction","addChartCallbackFunction","addTransitionDuration","addInitialConfig","showGraph","ChartColors","colorFunction","pattern","colorPattern","thresholds","addColorPatterns","addColorThresholds","addColorFunction","ChartColumn","column","columnValues","unshift","columnId","addColumn","columnType","columnName","columnColor","ChartController","$scope","resetVars","chart","columns","types","regions","axes","xValues","xTick","yTick","names","grid","legend","tooltip","chartSize","colors","colorThresholds","gauge","jsonKeys","groups","sorting","selection","addColumnProperties","this","config","data","empty","order","transition","duration","labels","dataLabelsFormatFunction","subchart","onbrush","zoom","enabled","rescale","onzoomend","xTickFormatFunction","xType","yTickFormatFunction","tooltipTitleFormatFunction","title","tooltipNameFormatFunction","name","tooltipValueFormatFunction","value","tooltipContentFormatFunction","contents","size","color","colorPatterns","threshold","gaugeLabelFormatFunction","point","line","pie","pieLabelFormatFunction","donut","donutLabelFormatFunction","onInit","oninit","onMouseover","onmouseover","onMouseout","onmouseout","onRendered","onrendered","onResize","onresize","onResized","onresized","dataOnClick","onclick","$apply","dataOnMouseover","dataOnMouseout","interaction","$watch","forEach","push","keys","json","chartIsGenerated","unload","load","c3","generate","chartCallbackFunction","$on","isDefined","destroy","rotated","side","amount","addSize","addEmptyLabel","addGrid","addGridLine","gridClass","lines","theGridLine","isNaN","class","hideGridFocus","addLegend","addTooltip","addTooltipTitleFormatFunction","addTooltipNameFormatFunction","addTooltipValueFormatFunction","addTooltipContentFormatFunction","addXType","addGauge","addGaugeLabelFormatFunction","addLine","addRegion","intervals","addPie","addPieLabelFormatFunction","addDonut","addDonutLabelFormatFunction","addGroup","group","addPoint","addOnInitFunction","onInitFunction","addOnMouseoverFunction","onMouseoverFunction","addOnMouseoutFunction","onMouseoutFunction","addOnRenderedFunction","onRederedFunction","addOnResizeFunction","onResizeFunction","addOnResizedFunction","onResizedFuncton","addDataOnClickFunction","theFunction","addDataOnMouseoverFunction","addDataOnMouseoutFunction","addSelection","ChartDonut","labelFormatFunction","showLabel","thresholdLabel","expand","ChartEvents","onClickData","onMouseoverData","onMouseoutData","ChartGauge","units","ChartGrid","showX","showY","showY2","showFocus","ChartGridOptional","gridValue","gridText","ChartGroup","groupValues","ChartLegend","onClick","showLegend","legendPosition","inset","legendInset","anchor","insetX","legendInsetX","insetY","legendInsetY","insetStep","legendInsetStep","step","ChartLine","stepType","connectNull","ChartPie","ChartPoints","showPoint","pointExpandEnabled","focus","pointsFocusEnabled","pointExpandRadius","r","pointFocusRadius","pointRadius","pointSelectRadius","select","ChartRegion","style","starts","ends","regionStyle","regionStarts","regionEnds","length","start","pop","end","shift","i","regionId","Selection","grouped","multiple","ChartSize","chartWidth","chartHeight","ChartTooltip","valueFormatFunction","nameFormatFunction","titleFormatFunction","contentFormatFunction","showTooltip","joined","hideTooltipTitle","joinedTooltip","groupTooltip","d","defaultTitleFormat","defaultValueFormat","bgcolor","titleFormat","tooltip_format_title","nameFormat","tooltip_format_name","valueFormat","tooltip_format_value","CLASS","tooltipContainer","tooltipName","index","levelColor","global","factory","module","exports","document","w","Error","window","noGlobal","arr","getProto","Object","getPrototypeOf","slice","concat","class2type","toString","hasOwn","hasOwnProperty","fnToString","ObjectFunctionString","call","support","DOMEval","code","doc","script","createElement","head","appendChild","parentNode","removeChild","fcamelCase","all","letter","toUpperCase","version","jQuery","selector","context","fn","init","rtrim","rmsPrefix","rdashAlpha","isArrayLike","obj","isWindow","prototype","jquery","constructor","toArray","get","num","pushStack","elems","ret","merge","prevObject","each","callback","map","elem","apply","arguments","first","eq","last","len","j","sort","splice","extend","options","copy","copyIsArray","clone","target","deep","isFunction","src","isPlainObject","isArray","expando","Math","random","isReady","error","msg","noop","Array","isNumeric","proto","Ctor","isEmptyObject","globalEval","camelCase","string","nodeName","toLowerCase","trim","makeArray","results","inArray","second","grep","invert","matches","callbackExpect","arg","guid","proxy","args","tmp","now","Date","Symbol","iterator","dir","until","matched","truncate","nodeType","is","siblings","n","nextSibling","Sizzle","funescape","_","escaped","escapedWhitespace","high","String","fromCharCode","fcssescape","ch","asCodePoint","charCodeAt","unloadHandler","setDocument","Expr","getText","isXML","tokenize","compile","outermostContext","sortInput","hasDuplicate","docElem","documentIsHTML","rbuggyQSA","rbuggyMatches","contains","preferredDoc","dirruns","done","classCache","createCache","tokenCache","compilerCache","sortOrder","a","b","push_native","list","booleans","whitespace","identifier","attributes","pseudos","rwhitespace","RegExp","rcomma","rcombinators","rattributeQuotes","rpseudo","ridentifier","matchExpr","ID","TAG","ATTR","PSEUDO","CHILD","bool","needsContext","rinputs","rheader","rnative","rquickExpr","rsibling","runescape","rcssescape","disabledAncestor","addCombinator","disabled","next","childNodes","e","els","seed","m","nid","match","newSelector","newContext","ownerDocument","exec","getElementById","getElementsByTagName","getElementsByClassName","qsa","test","getAttribute","setAttribute","toSelector","join","testContext","querySelectorAll","qsaError","removeAttribute","cache","key","cacheLength","markFunction","assert","el","addHandle","handler","attrHandle","siblingCheck","cur","diff","sourceIndex","createDisabledPseudo","isDisabled","createPositionalPseudo","argument","matchIndexes","documentElement","node","subWindow","defaultView","addEventListener","attachEvent","className","createComment","getById","getElementsByName","filter","attrId","find","getAttributeNode","tag","innerHTML","input","matchesSelector","webkitMatchesSelector","mozMatchesSelector","oMatchesSelector","msMatchesSelector","disconnectedMatch","hasCompare","compareDocumentPosition","adown","bup","compare","sortDetached","aup","ap","bp","expr","elements","attr","val","specified","escape","sel","uniqueSort","duplicates","detectDuplicates","sortStable","textContent","firstChild","nodeValue","selectors","createPseudo","relative",">"," ","+","~","preFilter","excess","unquoted","nodeNameSelector","operator","check","result","what","simple","forward","ofType","xml","uniqueCache","outerCache","nodeIndex","parent","useCache","lastChild","uniqueID","pseudo","setFilters","idx","not","matcher","unmatched","has","innerText","lang","elemLang","hash","location","root","activeElement","hasFocus","href","tabIndex","checked","selected","selectedIndex","header","button","even","odd","lt","gt","radio","checkbox","file","password","image","submit","reset","tokens","combinator","base","skip","checkNonElements","doneName","oldCache","newCache","elementMatcher","matchers","condense","newUnmatched","mapped","setMatcher","postFilter","postFinder","postSelector","temp","preMap","postMap","preexisting","contexts","matcherIn","matcherOut","matcherFromGroupMatchers","elementMatchers","setMatchers","superMatcher","outermost","matchedCount","setMatched","contextBackup","byElement","dirrunsUnique","bySet","filters","parseOnly","soFar","preFilters","cached","matcherFromTokens","checkContext","leadingRelative","implicitRelative","matchContext","matchAnyContext","token","compiled","defaultValue","rneedsContext","unique","isXMLDoc","escapeSelector","rsingleTag","risSimple","winnow","qualifier","self","rootjQuery","rparentsprev","ready","parseHTML","guaranteedUnique","children","prev","sibling","targets","l","closest","prevAll","add","addBack","parents","parentsUntil","nextAll","nextUntil","prevUntil","contentDocument","reverse","rnothtmlwhite","Identity","v","Thrower","ex","adoptValue","resolve","reject","method","promise","fail","then","Callbacks","object","flag","fire","locked","once","fired","firing","queue","firingIndex","memory","stopOnFalse","remove","disable","lock","fireWith","Deferred","func","tuples","state","always","deferred","catch","pipe","fns","newDefer","tuple","returned","progress","notify","onFulfilled","onRejected","onProgress","maxDepth","depth","special","mightThrow","that","TypeError","notifyWith","resolveWith","process","exceptionHook","stackTrace","rejectWith","getStackHook","setTimeout","stateString","when","singleValue","updateFunc","resolveContexts","resolveValues","remaining","master","rerrorNames","readyList","stack","console","warn","message","readyException","completed","removeEventListener","readyWait","holdReady","hold","wait","readyState","doScroll","access","chainable","emptyGet","raw","bulk","acceptData","owner","Data","uid","defineProperty","configurable","set","prop","hasData","dataPriv","dataUser","rbrace","rmultiDash","dataAttr","JSON","parse","removeData","_data","_removeData","dequeue","startLength","hooks","_queueHooks","stop","setter","clearQueue","defer","isHiddenWithinTree","display","css","swap","old","pnum","source","rcssNum","cssExpand","adjustCSS","valueParts","tween","adjusted","scale","maxIterations","currentValue","initial","unit","cssNumber","initialInUnit","defaultDisplayMap","showHide","body","hide","toggle","rcheckableType","rtagName","rscriptType","wrapMap","option","thead","col","tr","td","_default","getAll","setGlobalEval","refElements","optgroup","tbody","tfoot","colgroup","caption","th","rhtml","buildFragment","scripts","ignored","wrap","fragment","createDocumentFragment","nodes","htmlPrefilter","createTextNode","div","checkClone","cloneNode","noCloneChecked","rkeyEvent","rmouseEvent","rtypenamespace","returnTrue","returnFalse","safeActiveElement","err","on","one","origFn","event","off","handleObjIn","eventHandle","events","t","handlers","namespaces","origType","elemData","handle","triggered","dispatch","delegateType","bindType","handleObj","namespace","delegateCount","setup","mappedTypes","origCount","teardown","removeEvent","nativeEvent","handlerQueue","fix","delegateTarget","preDispatch","isPropagationStopped","currentTarget","isImmediatePropagationStopped","rnamespace","preventDefault","stopPropagation","postDispatch","matchedHandlers","matchedSelectors","addProp","hook","Event","enumerable","originalEvent","writable","noBubble","trigger","blur","click","beforeunload","returnValue","props","isDefaultPrevented","defaultPrevented","relatedTarget","timeStamp","isSimulated","stopImmediatePropagation","altKey","bubbles","cancelable","changedTouches","ctrlKey","detail","eventPhase","metaKey","pageX","pageY","shiftKey","view","char","charCode","keyCode","buttons","clientX","clientY","offsetX","offsetY","pointerId","pointerType","screenX","screenY","targetTouches","toElement","touches","which","mouseenter","mouseleave","pointerenter","pointerleave","orig","related","rxhtmlTag","rnoInnerhtml","rchecked","rscriptTypeMasked","rcleanScript","manipulationTarget","content","disableScript","restoreScript","cloneCopyEvent","dest","udataOld","udataCur","pdataOld","pdataCur","domManip","collection","hasScripts","iNoClone","html","_evalUrl","keepData","cleanData","dataAndEvents","deepDataAndEvents","srcElements","destElements","inPage","detach","append","prepend","insertBefore","before","after","replaceWith","replaceChild","appendTo","prependTo","insertAfter","replaceAll","original","insert","getStyles","opener","getComputedStyle","pixelPositionVal","boxSizingReliableVal","pixelMarginRightVal","reliableMarginLeftVal","container","rmargin","rnumnonpx","computeStyleTests","divStyle","cssText","marginLeft","marginRight","curCSS","computed","maxWidth","getPropertyValue","pixelMarginRight","minWidth","addGetHookIf","conditionFn","hookFn","backgroundClip","clearCloneStyle","pixelPosition","boxSizingReliable","reliableMarginLeft","rdisplayswap","cssShow","visibility","cssNormalTransform","letterSpacing","fontWeight","cssPrefixes","emptyStyle","vendorPropName","capName","setPositiveNumber","subtract","augmentWidthOrHeight","extra","isBorderBox","styles","getWidthOrHeight","valueIsBorderBox","getClientRects","getBoundingClientRect","Tween","easing","cssHooks","opacity","animationIterationCount","columnCount","fillOpacity","flexGrow","flexShrink","lineHeight","orphans","widows","zIndex","cssProps","float","origName","isFinite","margin","border","prefix","suffix","expanded","parts","propHooks","run","percent","eased","pos","fx","scrollTop","scrollLeft","linear","p","swing","cos","PI","fxNow","timerId","rfxtypes","rrun","raf","requestAnimationFrame","createFxNow","genFx","includeWidth","createTween","animation","Animation","tweeners","properties","stopped","prefilters","currentTime","startTime","tweens","opts","specialEasing","originalProperties","originalOptions","gotoEnd","timer","anim","complete","*","tweener","oldfire","propTween","restoreDisplay","isBox","hidden","dataShow","unqueued","overflow","overflowX","overflowY","prefilter","speed","opt","speeds","fadeTo","to","animate","doAnimation","optall","finish","stopQueue","timers","cssFn","slideDown","slideUp","slideToggle","fadeIn","fadeOut","fadeToggle","interval","setInterval","cancelAnimationFrame","clearInterval","slow","fast","delay","timeout","clearTimeout","checkOn","optSelected","radioValue","boolHook","rfocusable","removeAttr","nType","attrHooks","attrNames","getter","lowercaseName","rclickable","stripAndCollapse","getClass","removeProp","propFix","tabindex","for","addClass","classes","clazz","finalValue","curValue","removeClass","toggleClass","stateVal","classNames","hasClass","rreturn","rfocusMorph","valHooks","optionSet","onlyHandlers","bubbleType","ontype","eventPath","isTrigger","parentWindow","simulate","triggerHandler","hover","fnOver","fnOut","focusin","attaches","nonce","rquery","rbracket","parseXML","DOMParser","parseFromString","rCRLF","rsubmitterTypes","rsubmittable","param","traditional","valueOrFunction","s","encodeURIComponent","buildParams","serialize","serializeArray","r20","rhash","rantiCache","rheaders","rnoContent","rprotocol","transports","allTypes","originAnchor","addToPrefiltersOrTransports","structure","dataTypeExpression","dataType","dataTypes","inspectPrefiltersOrTransports","jqXHR","inspected","seekingTransport","inspect","prefilterOrFactory","dataTypeOrTransport","ajaxExtend","flatOptions","ajaxSettings","active","lastModified","etag","url","isLocal","protocol","processData","async","contentType","accepts","responseFields","converters","* text","text html","text json","text xml","ajaxSetup","settings","ajaxPrefilter","ajaxTransport","ajax","transport","cacheURL","responseHeadersString","responseHeaders","timeoutTimer","fireGlobals","callbackContext","globalEventContext","completeDeferred","statusCode","requestHeaders","requestHeadersNames","strAbort","getResponseHeader","getAllResponseHeaders","setRequestHeader","overrideMimeType","mimeType","status","abort","statusText","finalText","crossDomain","urlAnchor","host","hasContent","uncached","ifModified","headers","beforeSend","success","send","nativeStatusText","responses","response","isSuccess","ct","finalDataType","firstDataType","conv2","current","conv","dataFilter","throws","modified","getJSON","getScript","wrapAll","firstElementChild","wrapInner","unwrap","visible","offsetWidth","offsetHeight","xhr","XMLHttpRequest","xhrSuccessStatus","0","1223","xhrSupported","oldCallbacks","cors","errorCallback","open","username","xhrFields","onload","onerror","onabort","onreadystatechange","responseType","responseText","binary","text script","charset","scriptCharset","evt","rjsonp","getWindow","jsonp","jsonpCallback","originalSettings","callbackName","overwritten","responseContainer","jsonProp","createHTMLDocument","implementation","keepScripts","parsed","params","animated","offset","setOffset","curCSSTop","curTop","curOffset","curCSSLeft","curElem","curLeft","curPosition","using","win","rect","pageYOffset","clientTop","pageXOffset","clientLeft","offsetParent","parentOffset","scrollTo","Height","Width","","defaultExtra","funcName","bind","unbind","delegate","undelegate","parseJSON","define","amd","_jQuery","_$","$","noConflict","minErr","ErrorConstructor","templateArgs","sliceArgs","toDebugString","minErrConfig","objectMaxDepth","paramPrefix","REGEX_STRING_REGEXP","VALIDITY_STATE_PROPERTY","errorHandlingConfig","isObject","isValidObjectMaxDepth","NaN","isNumber","isString","uppercase","jqLite","angularModule","ngMinErr","isPrimitive","isBlankObject","forEachSorted","reverseParams","iteratorFn","nextUid","setHashKey","h","$$hashKey","baseExtend","dst","objs","ii","jj","isDate","valueOf","isRegExp","isElement","toInt","str","msie","documentMode","isNumberNaN","Number","inherit","create","identity","valueFn","hasCustomToString","isUndefined","$inject","isScope","$evalAsync","isBoolean","isPromiseLike","TYPED_ARRAY_REGEXP","escapeForRegexp","nodeName_","includes","array","arrayRemove","destination","stackSource","stackDest","copyRecurse","copyElement","needsRecurse","buffer","byteOffset","copied","ArrayBuffer","byteLength","Uint8Array","re","lastIndex","simpleCompare","equals","o1","o2","keySet","t1","getTime","createMap","charAt","csp","ngCspAttribute","rules","ngCspElement","querySelector","noUnsafeEval","noInlineStyle","Function","jq","name_","ngAttrPrefixes","array1","array2","startIndex","curryArgs","toJsonReplacer","toJson","pretty","stringify","fromJson","ALL_COLONS","timezoneToOffset","timezone","fallback","requestedTimezoneOffset","convertTimezoneToLocal","date","dateTimezoneOffset","getTimezoneOffset","timezoneOffset","minutes","setMinutes","getMinutes","startingTag","elemHtml","NODE_TYPE_TEXT","tryDecodeURIComponent","decodeURIComponent","parseKeyValue","keyValue","splitPoint","substring","toKeyValue","arrayValue","encodeUriQuery","encodeUriSegment","pctEncodeSpaces","isAutoBootstrapAllowed","currentScript","HTMLScriptElement","SVGScriptElement","getNamedItem","every","origin","angularInit","bootstrap","appElement","hasAttribute","candidate","strictDi","ngAttr","modules","doBootstrap","injector","$provide","debugInfoEnabled","$compileProvider","createInjector","invoke","NG_ENABLE_DEBUG_INFO","NG_DEFER_BOOTSTRAP","resumeBootstrap","extraModules","resumeDeferredBootstrap","reloadWithDebugInfo","reload","getTestability","rootElement","SNAKE_CASE_REGEXP","snake_case","separator","bindJQueryFired","assertArg","reason","assertArgFn","acceptArrayAnnotation","assertNotHasOwnProperty","path","bindFnToScope","lastInstance","getBlockNodes","blockNodes","endNode","NODE_TYPE_ELEMENT","NODE_TYPE_COMMENT","NODE_TYPE_DOCUMENT","setupModuleLoader","$injectorMinErr","ensure","$$minErr","requires","configFn","info","invokeQueue","configBlocks","runBlocks","moduleInstance","invokeLater","_invokeQueue","_configBlocks","_runBlocks","provider","invokeLaterAndSetModuleName","service","constant","decorator","directive","component","block","insertMethod","recipeName","factoryFunction","$$moduleName","shallowCopy","seen","full","major","minor","dot","codeName","JQLite","jqCache","jqId","DASH_LOWERCASE_REGEXP","MS_HACK_REGEXP","MOUSE_EVENT_MAP","jqLiteMinErr","fnCamelCaseReplace","kebabToCamel","SINGLE_TAG_REGEXP","HTML_REGEXP","TAG_NAME_REGEXP","XHTML_TAG_REGEXP","jqLiteIsTextNode","jqLiteAcceptsData","jqLiteBuildFragment","jqLiteContains","Node","argIsString","jqLiteAddNodes","jqLiteReady","jqLiteClone","jqLiteDealoc","onlyDescendants","jqLiteOff","unsupported","expandoStore","jqLiteExpandoStore","removeHandler","listenerFns","jqLiteRemoveData","expandoId","ng339","$destroy","createIfNecessary","jqLiteData","isSimpleSetter","isSimpleGetter","massGetter","jqLiteHasClass","jqLiteRemoveClass","cssClasses","cssClass","jqLiteAddClass","existingClasses","jqLiteController","jqLiteInheritedData","jqLiteEmpty","jqLiteRemove","JQLitePrototype","BOOLEAN_ATTR","BOOLEAN_ELEMENTS","ALIASED_ATTR","ngMinlength","ngMaxlength","ngMin","ngMax","ngPattern","ngStep","getBooleanAttrName","booleanAttr","createEventHandler","eventHandler","eventFns","eventFnsLength","immediatePropagationStopped","originalStopImmediatePropagation","handlerWrapper","specialHandlerWrapper","defaultHandlerWrapper","specialMouseHandlerWrapper","$$jqLiteProvider","$get","hashKey","nextUidFn","objType","inheritedData","isolateScope","isBooleanAttr","lowercasedName","$dv","arg1","arg2","nodeCount","addHandler","noEventListener","onFn","replaceNode","child","wrapNode","wrapper","newElement","condition","classCondition","nextElementSibling","extraParameters","dummyEvent","handlerArgs","eventName","eventFnsCopy","arg3","nanKey","NgMapShim","_keys","_values","_lastKey","_lastIndex","_idx","_transformKey","delete","NgMap","$$MapProvider","ARROW_ARG","FN_ARGS","FN_ARG_SPLIT","FN_ARG","STRIP_COMMENTS","stringifyFn","extractArgs","fnText","modulesToLoad","INSTANTIATING","providerSuffix","loadedModules","providerCache","supportObject","$injector","instantiate","instanceCache","serviceName","decorFn","origProvider","providerInjector","orig$get","origInstance","instanceInjector","$delegate","createInternalInjector","caller","protoInstanceInjector","loadModules","moduleFn","runInvokeQueue","invokeArgs","provider_","factoryFn","enforce","getService","injectionArgs","locals","$$annotate","$$ngIsClass","Type","ctor","annotate","$AnchorScrollProvider","autoScrollingEnabled","disableAutoScrolling","$window","$location","$rootScope","scrollIntoView","scroll","yOffset","elemTop","scrollBy","elm","some","newVal","oldVal","action","underscore","$animateMinErr","ELEMENT_NODE","NG_ANIMATE_CLASSNAME","mergeClasses","prepareAnimateOptions","$$CoreAnimateJsProvider","$$CoreAnimateQueueProvider","postDigestQueue","postDigestElements","$$AnimateRunner","pin","domOperation","from","classesAdded","updateData","classesRemoved","$$postDigest","handleCSSClassChanges","runner","changed","existing","toAdd","toRemove","klass","$$AnimateAsyncRunFactoryProvider","$$rAF","waitQueue","waitForTick","passed","$$AnimateRunnerFactoryProvider","$q","$sniffer","$$animateAsyncRun","$$isDocumentHidden","AnimateRunner","setHost","rafTick","_doneCallbacks","_tick","_state","chain","runners","getPromise","resolveHandler","rejectHandler","finally","pause","resume","_resolve","cancel","$CoreAnimateCssProvider","initialOptions","$$prepared","cleanupStyles","closed","$AnimateProvider","classNameFilter","$$registeredAnimations","register","substr","expression","$$animateQueue","domInsert","parentElement","afterElement","afterNode","previousElementSibling","enter","move","leave","addclass","setClass","tempClasses","Browser","$log","history","pendingDeferIds","outstandingRequestCount","isMock","outstandingRequestCallbacks","completeOutstandingRequest","$$completeOutstandingRequest","$$incOutstandingRequestCount","notifyWhenNoOutstandingRequests","cachedState","lastHistoryState","lastBrowserUrl","baseElement","pendingLocation","getCurrentState","urlChangeListeners","cacheState","sameState","sameBase","stripHash","urlChangeInit","cacheStateAndFireUrlChange","fireStateOrUrlChange","lastCachedState","prevLastHistoryState","listener","onUrlChange","$$applicationDestroyed","$$checkUrlChange","baseHref","timeoutId","deferId","$BrowserProvider","$document","$CacheFactoryProvider","caches","cacheFactory","cacheId","stats","capacity","MAX_VALUE","lruHash","freshEnd","staleEnd","put","refresh","lruEntry","removeAll","entry","nextEntry","prevEntry","$TemplateCacheProvider","$cacheFactory","$compileMinErr","_UNINITIALIZED_VALUE","$CompileProvider","$$sanitizeUriProvider","hasDirectives","Suffix","COMMENT_DIRECTIVE_REGEXP","CLASS_DIRECTIVE_REGEXP","ALL_OR_NOTHING_ATTRS","REQUIRE_PREFIX_REGEXP","EVENT_HANDLER_ATTR_REGEXP","bindingCache","parseIsolateBindings","directiveName","isController","LOCAL_REGEXP","bindings","definition","scopeName","mode","optional","attrName","registerDirective","directiveFactory","assertValidDirectiveName","$exceptionHandler","directives","priority","makeInjectable","tElement","tAttrs","$element","$attrs","templateUrl","ddo","controllerAs","ident","CNTRL_REG","bindToController","aHrefSanitizationWhitelist","regexp","imgSrcSanitizationWhitelist","preAssignBindingsEnabled","TTL","commentDirectivesEnabledConfig","onChangesTtl","cssClassDirectivesEnabledConfig","commentDirectivesEnabled","cssClassDirectivesEnabled","$interpolate","$templateRequest","$parse","$controller","$sce","$animate","$$sanitizeUri","onChangesQueue","SIMPLE_ATTR_NAME","specialAttrHolder","flushOnChangesQueue","errors","Attributes","attributesToCopy","$attr","$$element","safeAddClass","$normalize","directiveNormalize","$addClass","classVal","$removeClass","$updateClass","newClasses","oldClasses","tokenDifference","$set","writeAttr","booleanKey","aliasedKey","observer","trimmedSrcset","rawUris","nbrUrisWith2parts","floor","innerIdx","lastTuple","attribute","removeNamedItem","setNamedItem","$$observers","$observe","listeners","$$inter","startSymbol","endSymbol","denormalizeTemplate","NG_ATTR_BINDING","MULTI_ELEMENT_DIR_RE","$$addBindingInfo","binding","$$addBindingClass","$$addScopeInfo","isolated","noTemplate","$$addScopeClass","$$createComment","comment","$compileNodes","transcludeFn","maxPriority","ignoreDirective","previousCompileContext","compositeLinkFn","compileNodes","cloneConnectFn","needsNewScope","$parent","$new","$linkNode","parentBoundTranscludeFn","transcludeControllers","futureParentElement","$$boundTransclude","wrapTemplate","controllerName","instance","nodeList","$rootElement","nodeLinkFn","childLinkFn","linkFnFound","nodeLinkFnFound","linkFns","notLiveList","mergeConsecutiveTextNodes","collectDirectives","applyDirectivesToNode","terminal","transcludeOnThisElement","templateOnThisElement","childScope","childBoundTranscludeFn","stableNodeList","nodeListLength","createBoundTranscludeFn","previousBoundTranscludeFn","boundTranscludeFn","transcludedScope","cloneFn","controllers","containingScope","$$transcluded","slotName","boundSlots","$$slots","interpolateFn","attrsMap","addDirective","nName","nAttrs","isNgAttr","attrStartName","attrEndName","ngAttrName","multiElementMatch","PREFIX_REGEXP","multiElement","addAttrInterpolateDirective","trustedContext","attrNormalizedName","HTML","RESOURCE_URL","mustHaveExpression","allOrNothing","pre","newValue","$$scope","oldValue","animVal","templateNode","templateNodeParent","hasCompileParent","expressions","collectCommentDirectives","byPriority","groupScan","attrStart","attrEnd","groupElementsLinkFnWrapper","linkFn","compilationGenerator","eager","compileNode","templateAttrs","jqCollection","originalReplaceDirective","preLinkFns","postLinkFns","directiveValue","terminalPriority","newScopeDirective","controllerDirectives","newIsolateScopeDirective","templateDirective","nonTlbTranscludeDirective","hasTranscludeDirective","hasTemplate","hasElementTranscludeDirective","$compileNode","replaceDirective","childTranscludeFn","didScanForMultipleTransclusion","mightHaveMultipleTransclusionError","$$start","$$end","$template","assertNoDuplicate","$$tlb","candidateDirective","scanningIndex","$$parentNode","slots","slotMap","filledSlots","elementSelector","filled","$$isolateScope","$$newScope","removeComments","templateNamespace","newTemplateAttrs","templateDirectives","unprocessedDirectives","markDirectiveScope","mergeTemplateAttributes","afterTemplateNodeLinkFn","afterTemplateChildLinkFn","linkQueue","beforeTemplateCompileNode","origAsyncDirective","derivedSyncDirective","$$originalDirective","tempTemplateAttrs","beforeTemplateLinkNode","linkRootElement","linkNode","$$destroyed","ignoreChildLinkFn","addLinkFns","post","cloneAndAnnotateFn","controllerScope","elementControllers","scopeBindingInfo","cloneAttachFn","scopeToChild","slotTranscludeFn","isSlotFilled","controllerKey","$transclude","controllerInstance","$$isolateBindings","initializeDirectiveBindings","removeWatches","controllerResult","controllerDirective","$$bindings","bindingInfo","getControllers","$onChanges","initialChanges","$onInit","$doCheck","$onDestroy","invokeLinkFn","$postLink","dataName","inheritType","property","newScope","tDirectives","startAttrName","endAttrName","srcAttr","dstAttr","previousDirective","wrapModuleNameIfDefined","moduleName","elementsToRemove","newNode","firstElementToRemove","removeCount","j2","annotation","changes","removeWatchCollection","recordChanges","previousValue","triggerOnChangesHook","SimpleChange","removeWatch","parentGet","parentSet","lastValue","parentValueWatch","deepWatch","initialValue","literal","assign","parentValue","$stateful","$watchCollection","previous","isFirstChange","SPECIAL_CHARS_REGEXP","str1","str2","tokens1","tokens2","jqNodes","$controllerMinErr","$ControllerProvider","globals","allowGlobals","later","controllerPrototype","addIdentifier","$DocumentProvider","$$IsDocumentHiddenProvider","changeListener","$ExceptionHandlerProvider","exception","cause","$$ForceReflowProvider","domNode","APPLICATION_JSON","CONTENT_TYPE_APPLICATION_JSON","Content-Type","JSON_START","JSON_ENDS","[","{","JSON_PROTECTION_PREFIX","$httpMinErr","serializeValue","toISOString","$HttpParamSerializerProvider","$HttpParamSerializerJQLikeProvider","toSerialize","topLevel","defaultHttpResponseTransform","tempData","jsonStart","parseHeaders","fillInParsed","headerVal","headerKey","headersGetter","headersObj","transformData","$HttpProvider","defaults","transformResponse","transformRequest","common","Accept","patch","xsrfCookieName","xsrfHeaderName","paramSerializer","jsonpCallbackParam","useApplyAsync","interceptorFactories","interceptors","$browser","$httpBackend","$$cookieReader","defaultCache","reversedInterceptors","$http","requestConfig","requestInterceptors","responseInterceptors","defHeaderName","lowercaseDefHeaderName","reqHeaderName","defHeaders","reqHeaders","defaultHeadersIteration","headerContent","processedHeaders","headerFn","interceptor","request","requestError","responseError","chainInterceptors","reqData","withCredentials","cachedResp","isJsonp","getTrustedResourceUrl","serializedParams","pendingRequests","removePendingReq","resolvePromiseWithResult","resolvePromise","xsrfValue","urlIsSameOrigin","headersString","resolveHttpPromise","$applyAsync","$$phase","createApplyHandlers","eventHandlers","uploadEventHandlers","applyHandlers","callEventHandler","thenFn","rejectFn","resp","interceptorFactory","$xhrFactoryProvider","$HttpBackendProvider","$jsonpCallbacks","$xhrFactory","createXhr","$browserDefer","callbacks","rawDocument","callbackPath","createCallback","jsonpDone","getResponse","completeRequest","removeCallback","wasCalled","urlResolve","ontimeout","upload","timeoutRequest","$interpolateMinErr","$InterpolateProvider","startSymbolLength","endSymbolLength","escapedStartRegexp","escapedEndRegexp","unescapeText","constantWatchDelegate","objectEquality","constantInterp","unwatch","exp","$$watchDelegate","endIndex","compute","getValue","parseFns","textLength","expressionPositions","parseStringifyInterceptor","throwNoconcat","getTrusted","interr","$watchGroup","oldValues","currValue","$IntervalProvider","$$q","invokeApply","hasParams","iteration","skipApply","$$intervalId","$jsonpCallbacksProvider","callbackMap","callbackId","called","$$counter","PATH_MATCH","DEFAULT_PORTS","http","https","ftp","$locationMinErr","encodePath","segments","parseAbsoluteUrl","absoluteUrl","locationObj","parsedUrl","$$protocol","$$host","hostname","$$port","port","DOUBLE_SLASH_REGEX","parseAppUrl","prefixed","$$path","pathname","$$search","search","$$hash","startsWith","stripBaseUrl","trimEmptyHash","LocationHtml5Url","appBase","appBaseNoFile","basePrefix","$$html5","$$parse","pathUrl","$$compose","$$url","$$absUrl","$$urlUpdatedByLocation","$$parseLinkUrl","relHref","rewrittenUrl","appUrl","prevAppUrl","LocationHashbangUrl","hashPrefix","withoutHashUrl","withoutBaseUrl","windowsFilePathExp","firstPathSegmentMatch","LocationHashbangInHtml5Url","locationPrototype","$$replace","absUrl","locationGetter","locationGetterSetter","paramValue","preprocess","$LocationProvider","html5Mode","requireBase","rewriteLinks","LocationMode","initialUrl","lastIndexOf","IGNORE_URI_REGEXP","$$state","setBrowserUrlWithFallback","oldUrl","oldState","absHref","initializing","newUrl","newState","$broadcast","afterLocationChange","$digest","currentReplace","urlOrStateChanged","$LogProvider","debug","debugEnabled","formatStackTrace","navigator","userAgent","log","consoleLog","logFn","hasApply","sourceURL","Location","$parseMinErr","objectValueOf","getStringValue","AST","lexer","OPERATORS","ESCAPE","f","'","\"","Lexer","lex","ch2","ch3","op2","op3","readString","peek","readNumber","isIdentifierStart","peekMultichar","readIdent","isWhitespace","op1","throwError","chars","codePointAt","isValidIdentifierStart","isIdentifierContinue","isValidIdentifierContinue","cp","cp1","cp2","isExpOperator","colStr","number","peekCh","quote","rawString","hex","ifDefined","plusFn","findConstantAndWatchExpressions","ast","$filter","allConstants","argsToWatch","filterName","Program","Literal","toWatch","UnaryExpression","BinaryExpression","LogicalExpression","ConditionalExpression","alternate","consequent","Identifier","MemberExpression","CallExpression","isStatelessFilter","callee","AssignmentExpression","ArrayExpression","ObjectExpression","ThisExpression","LocalsExpression","getInputs","lastExpression","isAssignable","assignableAST","NGValueParameter","ASTCompiler","ASTInterpreter","Parser","astCompiler","getValueOf","$ParseProvider","identStart","identContinue","literals","true","false","null","addLiteral","literalName","literalValue","setIdentifierFns","identifierStart","identifierContinue","$parseOptions","interceptorFn","parsedExpression","oneTime","cacheKey","parser","oneTimeWatchDelegate","inputs","inputsWatchDelegate","addInterceptor","expressionInputDirtyCheck","oldValueOfValue","compareObjectIdentity","prettyPrintExpression","lastResult","oldInputValueOf","inputExpressions","newInputValue","oldInputValueOfValues","oldInputValues","isDone","isAllDefined","oneTimeListener","allDefined","watchDelegate","useInputs","$QProvider","errorOnUnhandledRejections","qFactory","$$QProvider","nextTick","exceptionHandler","$qMinErr","queueSize","checkQueue","Promise","rejectPromise","notifyPromise","processChecks","errorMessage","toCheck","pur","scheduleProcessQueue","pending","processScheduled","processQueue","$$reject","$$resolve","doResolve","doReject","doNotify","handleCallback","resolver","callbackOutput","errback","progressBack","$Q","promises","counter","race","$$RAFProvider","webkitRequestAnimationFrame","webkitCancelAnimationFrame","webkitCancelRequestAnimationFrame","rafSupported","supported","$RootScopeProvider","$rootScopeMinErr","lastDirtyWatch","applyAsyncId","digestTtl","destroyChildScope","$event","currentScope","Scope","$id","$$watchers","$$nextSibling","$$prevSibling","$$childHead","$$childTail","$root","$$listeners","$$listenerCount","$$watchersCount","isolate","ChildScope","$$ChildScope","watchExp","watcher","initWatchVal","$$digestWatchIndex","incrementWatchersCount","watchExpressions","shouldCall","newValues","deregisterFns","changeReactionScheduled","firstRun","unwatchFn","watchGroupAction","$watchCollectionInterceptor","veryOldValue","trackVeryOldValue","changeDetected","changeDetector","internalArray","internalObject","initRun","oldLength","_value","newLength","newItem","oldItem","watch","watchers","logIdx","asyncTask","ttl","watchLog","beginPhase","flushApplyAsync","dirty","asyncQueuePosition","asyncQueue","traverseScopesLoop","clearPhase","postDigestQueuePosition","decrementListenerCount","cleanUpScope","$eval","applyAsyncQueue","namedListeners","indexOfListener","$emit","targetScope","listenerArgs","$$asyncQueue","$$postDigestQueue","$$applyAsyncQueue","phase","$$SanitizeUriProvider","uri","isImage","regex","normalizedVal","ExpressionStatement","Property","program","expressionStatement","expect","filterChain","assignment","ternary","logicalOR","consume","logicalAND","equality","relational","additive","multiplicative","unary","primary","arrayDeclaration","selfReferential","parseArguments","baseExpression","peekToken","kind","e1","e2","e3","e4","peekAhead","$locals","nextId","vars","own","stage","assignable","computing","recurse","return_","generateFunction","fnString","fnKey","intoId","watchId","USE","STRICT","filterPrefix","watchFns","varsPrefix","section","nameId","recursionFn","skipWatchIdCheck","if_","lazyAssign","computedMember","lazyRecurse","plus","getHasOwnProperty","isNull","nonComputedMember","notNull","member","stringEscapeFn","stringEscapeRegex","c","rhs","lhs","unary+","unary-","unary!","binary+","binary-","binary*","binary/","binary%","binary===","binary!==","binary==","binary!=","binary<","binary>","binary<=","binary>=","binary&&","binary||","ternary?:","$sceMinErr","SCE_CONTEXTS","CSS","URL","JS","UNDERSCORE_LOWERCASE_REGEXP","snakeToCamel","adjustMatchers","adjustedMatchers","$SceDelegateProvider","resourceUrlWhitelist","resourceUrlBlacklist","htmlSanitizer","matchUrl","generateHolderType","Base","holderType","trustedValue","$$unwrapTrustedValue","trustedValueHolderBase","byType","trustAs","Constructor","maybeTrusted","allowed","$SceProvider","$sceDelegate","sce","isEnabled","parseAs","enumValue","lName","$SnifferProvider","eventSupport","hasHistoryPushState","nw","chrome","app","runtime","pushState","android","boxee","bodyStyle","transitions","animations","hasEvent","divElm","$templateRequestMinErr","$TemplateRequestProvider","httpOptions","$templateCache","handleRequestFn","tpl","ignoreRequestError","totalPendingRequests","transformer","$$TestabilityProvider","testability","findBindings","opt_exactMatch","dataBinding","bindingName","findModels","prefixes","getLocation","setLocation","whenStable","$TimeoutProvider","deferreds","$$timeoutId","urlParsingNode","originUrl","requestUrl","$WindowProvider","$$CookieReader","lastCookies","lastCookieString","safeDecodeURIComponent","cookieArray","cookie","currentCookieString","$$CookieReaderProvider","$FilterProvider","currencyFilter","dateFilter","filterFilter","jsonFilter","limitToFilter","lowercaseFilter","numberFilter","orderByFilter","uppercaseFilter","comparator","anyPropertyKey","predicateFn","matchAgainstAnyProp","getTypeForFilter","shouldMatchPrimitives","actual","expected","deepCompare","dontMatchWholeObject","actualType","expectedType","expectedVal","matchAnyProperty","ZERO_CHAR","$locale","formats","NUMBER_FORMATS","currencySymbol","fractionSize","CURRENCY_SYM","PATTERNS","maxFrac","formatNumber","GROUP_SEP","DECIMAL_SEP","groupSep","decimalSep","isInfinity","isZero","numStr","abs","formattedText","roundNumber","parsedNumber","digits","numberOfIntegerDigits","zeros","exponent","MAX_DIGITS","minFrac","fractionLen","roundAt","digit","k","carry","reduceRight","integerLen","decimals","reduce","lgSize","gSize","negPre","negSuf","posPre","posSuf","padNumber","negWrap","neg","dateGetter","dateStrGetter","shortForm","standAlone","getFirstThursdayOfYear","year","dayOfWeekOnFirst","getDay","weekGetter","firstThurs","getFullYear","thisThurs","datetime","getMonth","getDate","round","eraGetter","ERAS","DATE_FORMATS","yyyy","yy","MMMM","MMM","MM","M","LLLL","dd","HH","H","hh","mm","ss","sss","EEEE","EEE","getHours","AMPMS","Z","paddedZone","zone","ww","G","GG","GGG","GGGG","ERANAMES","DATE_FORMATS_SPLIT","NUMBER_STRING","R_ISO8601_STR","timeSetter","ms","DATETIME_FORMATS","tzMin","tzHour","dateSetter","setUTCFullYear","setFullYear","setUTCHours","setHours","spacing","limit","begin","Infinity","sliceFn","sortPredicate","reverseOrder","compareFn","predicates","predicate","descending","defaultCompare","compareValues","tieBreaker","predicateValues","getPredicateValue","v1","v2","value1","value2","type1","type2","ngDirective","htmlAnchorDirective","xlinkHref","ngAttributeAliasDirectives","nullFormCtrl","propName","normalized","defaultLinkFn","ngModel","htmlAttr","$addControl","$$renameControl","control","$name","$removeControl","$setValidity","$setDirty","$setPristine","$setSubmitted","PENDING_CLASS","SUBMITTED_CLASS","FormController","$$controls","$error","$$success","$pending","ngForm","$dirty","$pristine","$valid","$invalid","$submitted","$$parentForm","$$animate","setupValidity","$rollbackViewValue","$commitViewValue","newName","oldName","PRISTINE_CLASS","DIRTY_CLASS","$setUntouched","addSetValidityMethod","unset","formDirectiveFactory","isNgForm","formElement","VALID_CLASS","nameAttr","ctrls","handleFormSubmission","getSetter","formDirective","ngFormDirective","$$classCache","INVALID_CLASS","cachedToggleClass","ctrl","switchValue","toggleValidationCss","validationErrorKey","isValid","isObjectEmpty","combinedState","ISO_DATE_REGEXP","URL_REGEXP","EMAIL_REGEXP","NUMBER_REGEXP","DATE_REGEXP","DATETIMELOCAL_REGEXP","WEEK_REGEXP","MONTH_REGEXP","TIME_REGEXP","PARTIAL_VALIDATION_EVENTS","PARTIAL_VALIDATION_TYPES","inputType","baseInputType","stringBasedInputType","createDateInputType","createDateParser","datetime-local","week","isoWeek","existingDate","hours","seconds","milliseconds","addDays","getSeconds","getMilliseconds","month","minVal","maxVal","stepVal","badInputChecker","numberFormatterParser","$validators","$isEmpty","parseNumberAttrVal","$validate","modelValue","viewValue","isValidForStep","$$parserName","email","doTrim","ngTrim","ev","$setViewValue","$render","$viewValue","range","supportsRange","$$hasNativeValidators","validity","hasMinAttr","hasMaxAttr","hasStepAttr","originalRender","rangeUnderflow","rangeOverflow","setInitialValueAndObserver","$modelValue","elVal","stepMismatch","htmlAttrName","changeFn","trueValue","parseConstantExpr","ngTrueValue","falseValue","ngFalseValue","$formatters","$parsers","composing","deferListener","origValue","origBadInput","origTypeMismatch","badInput","typeMismatch","mapping","iso","part","parseDate","previousDate","$options","getOption","isValidDate","parseObservedDateValue","parsedDate","ngModelMinErr","isNumberInteger","countDecimals","numString","decimalSymbolIndex","stepBase","stepDecimals","decimalCount","multiplier","isNonIntegerValue","isNonIntegerStepBase","isNonIntegerStep","valueDecimals","stepBaseDecimals","pow","parseFn","ngValueDirective","updateElementValue","propValue","tplAttr","CONSTANT_VALUE_REGEXP","ngValue","inputDirective","ngBindDirective","$compile","templateElement","ngBind","ngBindTemplateDirective","ngBindTemplate","ngBindHtmlDirective","ngBindHtmlGetter","ngBindHtml","ngBindHtmlWatch","getTrustedHtml","ngChangeDirective","$viewChangeListeners","ngChange","classDirective","indexWatchExpression","oldClassString","classCounts","oldModulo","digestClassCounts","classArray","classesToUpdate","$index","newModulo","classString","toClassString","newClassString","updateClasses","oldClassArray","newClassArray","toRemoveArray","arrayDifference","toAddArray","toRemoveString","toAddString","classValue","ngListDirective","ngList","trimValues","ngClassDirective","ngClassOddDirective","ngClassEvenDirective","ngCloakDirective","ngControllerDirective","ngEventDirectives","forceAsyncEvents","ngIfDirective","previousElements","ngIf","ngIncludeDirective","$anchorScroll","srcExp","ngInclude","onloadExp","autoScrollExp","autoscroll","cleanupLastIncludeContent","previousElement","currentElement","changeCounter","afterAnimation","thisChangeId","ngIncludeFillContentDirective","ngInitDirective","ngInit","UNTOUCHED_CLASS","TOUCHED_CLASS","EMPTY_CLASS","NOT_EMPTY_CLASS","NgModelController","$$rawModelValue","$asyncValidators","$untouched","$touched","defaultModelOptions","$$parsedNgModel","$$parsedNgModelAssign","$$ngModelGet","$$ngModelSet","$$pendingDebounce","$$parserValid","$$currentValidationRunId","$$attr","$$timeout","$$exceptionHandler","formatters","$$updateEmptyClasses","$$lastCommittedViewValue","$$runValidators","$$initGetterSetters","invokeModelGetter","invokeModelSetter","$$$p","$setTouched","prevValid","prevModelValue","allowInvalid","allValid","$$writeModelToScope","doneCallback","syncValidatorsValid","validatorPromises","localValidationRunId","setValidity","validationDone","processParseErrors","errorKey","validator","Boolean","$$parseAndValidate","writeToModelIfNeeded","$$debounceViewValueCommit","debounceDelay","$overrideModelOptions","createChild","ngModelDirective","modelCtrl","formCtrl","optionsCtrl","setTouched","DEFAULT_REGEXP","ModelOptions","$$options","inheritAll","updateOnDefault","ngModelOptionsDirective","NgModelOptionsController","$$attrs","parentOptions","parentCtrl","modelOptionsDefinition","ngModelOptions","updateOn","debounce","getterSetter","ngNonBindableDirective","ngOptionsMinErr","NG_OPTIONS_REGEXP","ngOptionsDirective","optionTemplate","optGroupTemplate","selectElement","registerOption","selectCtrl","ngModelCtrl","hasEmptyOption","emptyOption","providedEmptyOption","ngOptions","optionsExp","valueName","keyName","selectAs","trackBy","viewValueFn","trackByFn","getTrackByValueFn","getTrackByValue","displayFn","groupByFn","disableWhenFn","valuesFn","getLocals","getWatchables","optionValues","watchedArray","optionValuesKeys","getOptionValuesKeys","optionValuesLength","selectValue","disableWhen","getOptions","optionItems","selectValueMap","optionItem","Option","getOptionFromViewValue","getViewValueFromOption","itemKey","listFragment","addOptionElement","optionElement","getAndUpdateSelectedOption","updateOptions","readValue","nextValue","groupElementMap","groupElement","generateUnknownOptionValue","writeValue","selectedOptions","selectedValues","selections","selectedOption","removeUnknownOption","unselectEmptyOption","selectEmptyOption","unknownOption","updateUnknownOption","renderUnknownOption","optionScope","optionEl","ngPluralizeDirective","BRACE","IS_WHEN","lastCount","numberExp","whenExp","whens","whensExpFns","braceReplacement","watchRemover","updateElementText","newText","attributeName","tmpMatch","whenKey","countIsNaN","pluralCat","whenExpFn","ngRepeatDirective","updateScope","valueIdentifier","keyIdentifier","arrayLength","$first","$last","$middle","$odd","$even","NG_REMOVED","ngRepeatMinErr","ngRepeat","ngRepeatEndComment","aliasAs","trackByExp","trackByExpGetter","trackByIdExpFn","trackByIdArrayFn","trackByIdObjFn","hashFnLocals","lastBlockMap","nextNode","collectionLength","trackById","trackByIdFn","collectionKeys","nextBlockOrder","blockKey","previousNode","nextBlockMap","NG_HIDE_CLASS","NG_HIDE_IN_PROGRESS_CLASS","ngShowDirective","ngShow","ngHideDirective","ngHide","ngStyleDirective","ngStyle","newStyles","oldStyles","ngSwitchDirective","cases","ngSwitchController","selectedTranscludes","watchExpr","ngSwitch","selectedElements","previousLeaveAnimations","selectedScopes","selectedTransclude","caseElement","selectedScope","ngSwitchWhenDirective","ngSwitchWhen","ngSwitchWhenSeparator","whenCase","ngSwitchDefaultDirective","ngTranscludeMinErr","ngTranscludeDirective","fallbackLinkFn","ngTransclude","ngTranscludeSlot","useFallbackContent","scriptDirective","noopNgModelController","setOptionSelectedStatus","selectDirective","SelectController","lastView","lastViewRef","shouldBeSelected","requiredDirective","required","patternDirective","patternExp","maxlengthDirective","maxlength","intVal","minlengthDirective","minlength","originalCleanData","optionsMap","renderScheduled","unknownVal","realVal","hasOption","currentlySelectedOption","hashedVal","addOption","scheduleRender","removeOption","updateScheduled","scheduleViewValueUpdate","renderAfter","optionAttrs","interpolateValueFn","interpolateTextFn","removal","previouslySelected","removeValue","optionDirective","selectCtrlName","jqName","$$csp","$$encodeUriSegment","$$encodeUriQuery","$$stringify","textarea","form","ngClass","ngClassEven","ngClassOdd","ngCloak","ngController","ngNonBindable","ngPluralize","ngSwitchDefault","ngRequired","$animateCss","$$animateJs","$$forceReflow","$interval","$httpParamSerializer","$httpParamSerializerJQLike","$$testability","$$jqLite","$$Map","angularVersion","PLURAL_CATEGORY","DAY","FIRSTDAYOFWEEK","MONTH","SHORTDAY","SHORTMONTH","STANDALONEMONTH","WEEKENDRANGE","fullDate","longDate","medium","mediumDate","mediumTime","short","shortDate","shortTime","minInt","localeID","opt_precision","TRANSITION_PROP","ANIMATION_PROP","ADD_CLASS_SUFFIX","REMOVE_CLASS_SUFFIX","EVENT_CLASS_PREFIX","NG_ANIMATE_CHILDREN_DATA","TRANSITIONEND_EVENT","ontransitionend","onwebkittransitionend","ANIMATIONEND_EVENT","onanimationend","onwebkitanimationend","DURATION_KEY","TIMING_KEY","ANIMATION_PLAYSTATE_KEY","ANIMATION_DELAY_PROP","ANIMATION_DURATION_PROP","TRANSITION_DELAY_PROP","TRANSITION_DURATION_PROP","pendClasses","isPrefix","stripCommentsFromElement","extractElementNode","applyAnimationClassesFactory","prepareAnimationOptions","$$domOperationFired","applyAnimationStyles","applyAnimationFromStyles","applyAnimationToStyles","mergeAnimationDetails","oldAnimation","newAnimation","flags","newOptions","splitClassesToLookup","allow","preparationClasses","concatWithSpace","realDomOperation","getDomNode","blockTransitions","applyInlineStyle","blockKeyframeAnimations","applyBlock","styleTuple","$$AnimateChildrenDirective","ngAnimateChildren","setData","ANIMATE_TIMER_KEY","DETECT_CSS_PROPERTIES","transitionDelay","transitionProperty","animationDuration","animationDelay","DETECT_STAGGER_CSS_PROPERTIES","getCssDelayStyle","isKeyframeAnimation","computeCssStyles","detectedStyles","formalStyleName","actualStyleName","maxValue","truthyTimingValue","getCssTransitionDurationStyle","applyOnlyDuration","createLocalCacheLookup","flush","total","registerRestorableStyles","backup","$AnimateCssProvider","$animateProvider","gcsLookup","gcsStaggerLookup","$$rAFScheduler","applyAnimationClasses","parentCounter","gcsHashFn","extraClasses","KEY","rafWaitQueue","waitUntilQuiet","pageWidth","computeTimings","timings","aD","tD","maxDelay","maxDuration","restoreStyles","closeAndReturnNoopAnimator","animationClosed","animationPaused","animationCompleted","runnerHost","maxDelayTime","maxDurationTime","temporaryStyles","stagger","transitionStyle","structuralClassName","addRemoveClassName","structural","applyClassesEarly","fullClassName","activeClasses","hasToStyles","keyframeStyle","staggerVal","staggerClassName","$$skipPreparationClasses","durationStyle","delayStyle","itemIndex","staggerIndex","isFirst","skipBlocking","relativeDelay","hasTransitions","hasAnimations","hasTransitionAll","applyTransitionDuration","applyAnimationDuration","applyTransitionDelay","applyAnimationDelay","recalculateTimingStyles","blockTransition","blockKeyframeAnimation","applyBlocking","$$willAnimate","endFn","cancelFn","close","rejected","animationTimerData","setProperty","removeProperty","onDone","onAnimationProgress","$manualTimeStamp","elapsedTime","toFixed","playPause","maxStagger","triggerAnimationStart","easeVal","easeProp","timerTime","endTime","animationsData","setupFallbackTimer","currentTimerData","expectedEndTime","onAnimationExpired","playAnimation","$$AnimateCssDriverProvider","$$animationProvider","drivers","NG_ANIMATE_SHIM_CLASS_NAME","NG_OUT_ANCHOR_CLASS_NAME","bodyNode","rootBodyElement","rootNode","animationDetails","anchors","fromAnimation","toAnimation","anchorAnimations","prepareRegularAnimation","animator","outAnchor","inAnchor","startingClasses","filterCssClasses","getClassVal","animatorIn","animatorOut","calculateAnchorStyles","prepareInAnimation","startingAnimator","currentAnimation","coords","endingClasses","getUniqueValues","NG_IN_ANCHOR_CLASS_NAME","animationRunners","$$AnimateJsProvider","beforeFn","afterFn","classesToAdd","classesToRemove","flagMap","animationFactory","packageAnimations","closeActiveAnimations","applyOptions","endAnimations","onComplete","cancelled","groupEventedAnimations","fnName","operations","ani","onAnimationComplete","resolved","endProgressCb","animateFn","$$AnimateJsDriverProvider","prepareAnimation","endFnFactory","NG_ANIMATE_ATTR_NAME","NG_ANIMATE_PIN_DATA","$$AnimateQueueProvider","ONE_SPACE","hasMatchingClasses","currentClassString","currentClassMap","isAllowed","ruleType","previousAnimation","hasAnimationClasses","and","nA","cA","nR","cR","$$animation","activeAnimationsLookup","disabledElementsLookup","animationsEnabled","deregisterWatch","isEmpty","callbackRegistry","isAnimatableClassName","normalizeAnimationDetails","filterFromRegistry","matchContainer","matchCallback","containerNode","cleanupEventListeners","entries","eventType","queueAnimation","originalElement","runInNextPostDigestOrNow","postDigestCalled","isStructural","documentHidden","skipAnimations","existingAnimation","hasExistingAnimation","animateChildren","bodyNodeDetected","rootNodeDetected","parentAnimationDetected","elementDisabled","parentHost","details","parentNodeDisabled","notifyProgress","closeChildAnimations","cancelAnimationFlag","isValidAnimation","markElementAnimationState","animationCancelled","clearElementAnimationState","realRunner","targetParentNode","targetNode","argCount","$$AnimationProvider","NG_ANIMATE_REF_ATTR","RUNNER_STORAGE_KEY","getRunner","animationQueue","sortAnimations","tree","lookup","processNode","processed","elementNode","parentEntry","flatten","remainingLevelEntries","nextLevelEntries","row","childEntry","prepareClassName","beforeStart","handleDestroyedElement","preparedAnimations","refLookup","usedIndicesLookup","anchorGroups","groupedAnimations","direction","enterOrMove","anchorNodes","animationID","lookupKey","aa","out","in","indexKey","toBeSortedAnimations","animationEntry","animationRunner","newRunner","closeFn","update","startAnimationFn","operation","driverName","driver","previousScope","ngAnimateSwap","scheduler","tasks","ngAriaModule","ariaHidden","ariaChecked","ariaReadonly","ariaDisabled","ariaRequired","ariaInvalid","ariaValue","bindKeydown","bindRoleForClick","ariaAttr","nodeBlackList","negate","ariaCamelName","isNodeOneOf","boolVal","newConfig","$$watchExpr","nodeTypeArray","$aria","shouldAttachAttr","normalizedAttr","allowBlacklistEls","shouldAttachRole","role","shape","needsAriaValuemin","needsAriaValuemax","needsAriaValuenow","needsTabIndex","ngAriaWatchModelValue","ngMessages","ngClick","ngKeydown","ngKeypress","ngKeyup","$$CookieWriter","cookiePath","expires","cookieLength","domain","toUTCString","secure","calcOptions","$$cookieWriter","getObject","putObject","$cookies","ngMessageDirectiveFactory","ngMessagesCtrl","assignRecords","records","reRender","messageCtrl","commentNode","staticExp","ngMessage","dynamicExp","ngMessageExp","attach","$$attachId","getAttachId","deregister","INACTIVE_CLASS","renderLater","cachedCollection","latestKey","nextAttachId","messages","findPreviousMessage","prevNode","parentLookup","prevKey","$$ngMessageNode","previousSibling","render","isAttrTruthy","ngMessagesMultiple","unmatchedMessages","matchedKeys","messageItem","messageFound","totalMessages","messageUsed","truthy","nextKey","messageNode","ngMessagesInclude","replaceElementWithMarker","marker","DetectNgTouch","MdCoreConfigure","$mdThemingProvider","rAFDecorator","qDecorator","theme","primaryPalette","accentPalette","warnPalette","backgroundPalette","throttle","cb","queuedArgs","alreadyQueued","queueCb","MdAutofocusDirective","attrExp","mdAutoFocus","mdAutofocus","mdSidenavFocus","updateExpression","MdIterator","reloop","trueFn","_items","inRange","itemAt","findBy","findSubsequentItem","hasPrevious","hasNext","backwards","validate","curIndex","nextIndex","foundItem","mdMediaFactory","$mdConstant","queries","mqls","normalizeCache","$mdMedia","getResponsiveAttribute","MEDIA_PRIORITY","mediaName","normalizedName","getNormalizedName","getQuery","watchResponsiveAttributes","watchFn","unwatchFns","MEDIA","query","validated","matchMedia","addListener","onQueryChange","media","MdPrefixer","initialAttributes","buildSelector","PREFIXES","_buildSelector","_buildList","buildList","_getNativeElement","prefixedAttrs","prefixedAttribute","UtilFactory","$$mdAnimate","hasComputedStyle","hasValue","computedStyles","usesStandardSymbols","validateCssValue","$mdUtil","dom","performance","getModelOption","optionName","bidi","lValue","rValue","ltr","bidiProperty","lProperty","rProperty","clientRect","isOffsetRect","getNode","nodeRect","offsetRect","nodesToArray","getViewportTop","scrollY","findFocusTarget","containerEl","attributeVal","AUTO_FOCUS","prefixer","elToFocus","scanForFocusable","elFound","it","disableScrollAround","restoreBody","restoreElement","_count","_restoreScroll","prevDocumentStyle","prevBodyStyle","viewportTop","clientWidth","hasVerticalScrollbar","scrollHeight","clientHeight","scrollMask","disableScrollMask","enableScrolling","restoreFn","floatingScrollbars","tempNode","z-index","overflow-y","forceFocus","newEvent","focusOnClick","$focus","createEvent","initMouseEvent","$material","dispatchEvent","createBackdrop","supplant","fakeNgModel","$fake","recent","valueOnUse","nextUniqueId","disconnectScope","$$disconnected","reconnectScope","getClosest","validateWith","onlyParent","tagName","elementContains","extractElementByName","scanDeep","warnNotFound","found","scanTree","outerHTML","numChild","initOptionalProperties","attrIsDefined","digest","queueItem","processTemplate","getParentWithPointerEvents","getNearestContentElement","checkStickySupport","stickyProp","testEl","stickyProps","parseAttributeBoolean","negatedCheck","isParentFormSubmitted","animateScrollTo","scrollEnd","scrollStart","scrollChange","scrollingDown","calculateNewPosition","easeDuration","change","ts","scrollChunk","newPosition","uniq","pointer","lastPointer","HANDLERS","forceSkipClickHijack","lastLabelClickPos","isInitialized","API_WITH_VALUES","API_NO_VALUES","SUFFIXES","WHITESPACE","FLEX_OPTIONS","LAYOUT_OPTIONS","ALIGNMENT_MAIN_AXIS","ALIGNMENT_CROSS_AXIS","PALETTES","GENERATED","DARK_FOREGROUND","LIGHT_FOREGROUND","DARK_SHADOW","LIGHT_SHADOW","DARK_CONTRAST_COLOR","LIGHT_CONTRAST_COLOR","STRONG_LIGHT_CONTRAST_COLOR","THEME_COLOR_TYPES","DEFAULT_COLOR_TYPE","LIGHT_DEFAULT_HUES","DARK_DEFAULT_HUES","VALID_HUE_VALUES","themeConfig","rulesByType","WEBKIT","PREFIX","TRANSITION_EVENTS","ANIMATION_EVENTS","STATIC_COLOR_EXPRESSION","colorPalettes","cssAnimationDuration","inputModule","visibilityDirectives","MD_PANEL_Z_INDEX","MD_PANEL_HIDDEN","FOCUS_TRAP_TEMPLATE","_presets","SELECT_EDGE_MARGIN","selectNextId","CHECKBOX_SELECTION_INDICATOR","ITEM_HEIGHT","MAX_ITEMS","MENU_PADDING","INPUT_PADDING","DELETE_HINT_TEMPLATE","DEFAULT_CHIP_APPEND_DELAY","MD_CHIPS_TEMPLATE","CHIP_INPUT_TEMPLATE","CHIP_DEFAULT_TEMPLATE","CHIP_REMOVE_TEMPLATE","MD_CONTACT_CHIPS_TEMPLATE","TBODY_HEIGHT","TBODY_SINGLE_ROW_HEIGHT","OPEN_CLASS","INPUT_CONTAINER_CLASS","HAS_CALENDAR_ICON_CLASS","HAS_TRIANGLE_ICON_CLASS","IS_MOBILE_REGEX","BOUND_MENU_METHODS","MdCompilerService","MdAriaService","showWarnings","expectAsync","expectWithText","expectWithoutText","hasAriaLabel","parentHasAriaLabel","level","performCheck","hasChildren","hasChildNodes","hasAttr","isHidden","currentStyle","defaultValueGetter","walker","createTreeWalker","NodeFilter","SHOW_TEXT","isAriaHiddenNode","MdInteractionService","bodyElement","isBuffering","bufferTimeout","lastInteractionType","lastInteractionTime","inputEventMap","keydown","mousedown","touchstart","pointerdown","MSPointerDown","iePointerMap","2","3","4","initializeEvents","MdGestureProvider","MdGesture","$$MdGestureHandler","vendor","opera","isIos","isAndroid","touchActionProperty","vendorPrefixes","hasJQuery","handlerName","registerElement","isHijackingClicks","checkDistanceAndEmit","distance","maxDistance","onEnd","isContentEditable","onStart","onCancel","registeredParent","onMove","dx","dy","sqrt","minDistance","horizontal","cancelMultiplier","onSetup","oldTouchAction","onCleanup","shouldStartDrag","dragPointer","dispatchDragMove","shouldCancel","distanceX","distanceY","makeStartPointer","updatePointerState","isRunning","minVelocity","velocityX","directionX","velocityY","directionY","GestureHandler","attachToDocument","$mdGesture","mouseInputHijacker","isIonicTap","isInputEventFromLabelClick","isKeyClick","isSubmitEvent","runHandlers","handlerEvent","typesMatch","getEventPoint","startPointer","startX","startY","detectDisabledLayouts","disableLayoutDirective","attributeWithoutValue","_$mdUtil_","_$interpolate_","_$log_","validateAttributeValue","getNormalizedAttrValue","buildUpdateFn","translateToCssClass","warnAttrNotSupported","validateAttributeUsage","updateFn","needsInterpolation","findIn","attrValue","main","cross","defaultVal","MdLiveAnnouncer","_$timeout","_liveElement","_createLiveElement","_announceTimeout","ComponentRegistry","instances","pendings","notFoundError","msgContext","getInstances","isValidID","$$mdHandle","dfd","MdButtonInkRipple","$mdInkRipple","isMenuItem","fitRipple","dimBackground","MdCheckboxInkRipple","MdListInkRipple","outline","rippleSize","InkRippleDirective","$mdButtonInkRipple","$mdCheckboxInkRipple","InkRippleCtrl","rippleOptions","$mdColorUtil","ripples","lastRipple","createContainer","createRipple","setColor","bindEvents","autoCleanup","cleanupFn","attrNoDirective","MdTabInkRipple","detectDisabledThemes","disableTheming","ThemingProvider","$mdColorPalette","$$mdMetaProvider","ThemingService","themingProvider","THEMES","alwaysWatchTheme","defaultTheme","enableBrowserColor","removeChrome","removeWindows","hue","palette","setMeta","definePalette","checkPaletteValid","extendPalette","registerTheme","configuration","registeredStyles","registerStyles","setNonce","nonceValue","generateThemesOnDemand","onDemand","generateOnDemand","setDefaultTheme","alwaysWatch","_LIGHT_DEFAULT_HUES","_DARK_DEFAULT_HUES","_PALETTES","_THEMES","_parseRules","parseRules","_rgba","rgba","missingColors","field","inheritFrom","parentTheme","Theme","colorType","hues","setDark","isDark","oldDefaultHues","foregroundPalette","foregroundShadow","newDefaultHues","newDefaults","oldDefaults","hueName","dark","defaultHues","paletteName","hueValue","applyTheme","watchTheme","updateThemeClass","$mdTheme","$shouldWatch","registerChanges","oldTheme","registered","generateTheme","defineTheme","accent","background","setBrowserColor","themeName","ThemingDirective","$mdTheming","getTheme","interpolation","mdTheme","setParsedTheme","$setTheme","registeredCallbacks","hasInterpolation","oneTimeBind","ALWAYS_WATCH","ThemableDirective","checkValidPalette","generatedRules","themeNameRegex","hueRegex","contrast","newRule","hueType","generateAllThemes","ruleMatchRegex","themeCss","defaultContrast","contrastDefaultColor","lightColors","contrastLightColors","strongLightColors","contrastStrongLightColors","darkColors","contrastDarkColors","rgbValue","colorToRgbaArray","rule","styleStrings","styleContent","clr","dig","red","grn","blu","rgbArray","MdBottomSheetDirective","$mdBottomSheet","MdBottomSheetProvider","$$interimElementProvider","bottomSheetDefaults","CLOSING_VELOCITY","PADDING","setDefaults","methods","backdrop","themable","onShow","disableBackdrop","clickOutsideToClose","bottomSheet","BottomSheet","disableParentScroll","restoreScroll","focusable","escapeToClose","rootElementKeyupCallback","KEY_CODE","onRemove","cleanup","onDragStart","onDrag","onDragEnd","TRANSITION_DURATION","transform","TRANSFORM","distanceRemaining","MdAnchorDirective","MdButtonDirective","$mdAria","$mdInteraction","isAnchor","ngDisabled","isUserInvoked","getLastInteractionType","ngHref","ngLink","uiSref","mdCardDirective","MdCheckboxDirective","BEFORE_NG_ARIA","isIndeterminate","containerCtrl","isErrorGetter","setInvalid","mdIndeterminate","setIndeterminateState","ngChecked","skipToggle","valueOpts","SPACE","ENTER","MdColorsService","applyThemeColors","colorExpression","themeColors","rgbColors","hasColorProperty","extractColorOptions","hasBackground","parseColor","getThemeColor","hasTheme","rgbValues","isTwoWord","scheme","hueNumber","availableThemes","usedTheme","MdColorsDirective","$mdColors","tElem","rawColorExpression","mdColors","bindOnce","isStatic","hasWatchAttr","mdColorsWatch","shouldWatch","parseColors","mdThemeController","cleanElement","lastColors","unregisterChanges","mdContentDirective","$materialScrollFixed","MdDialogDirective","$mdDialog","images","addOverflowClass","MdDialogProvider","topFocusTrap","bottomFocusTrap","advancedDialogOptions","dialogDefaultOptions","addPreset","isPrompt","$type","keypress","hasBackdrop","onCompiling","targetEvent","targetEl","themeCtrl","themeWatch","newTheme","dialogElement","bounds","getDomElement","closeTo","openFrom","originInteraction","hasFn","defaultElement","dialogContent","existingDialogId","dialogContentId","ariaLabel","words","classList","focusHandler","hideBackdrop","smartClose","sourceElem","onWindowResize","stretchDialogContainerToViewport","removeListeners","parentTarget","keyHandlerFn","mousedownHandler","mouseupHandler","deactivateListeners","removeFn","reverseContainerStretch","dialogEl","buildTranslateToOrigin","calculateZoomToOrigin","translateOptions","transitionInClass","transitionOutClass","toTransformCss","fullscreen","translate3d","animateReversal","reverseAnimate","clearAnimate","walkDOM","unlockScreenReader","focusOnOpen","onShowing","mdHtmlContent","htmlContent","mdTextContent","detachAndClean","contentElement","cleanupElement","autoWrap","transformTemplate","isFixed","ceil","previousStyles","parentTop","MdDividerDirective","MdFabActionsDirective","MdFabController","closeTimeout","vm","initialAnimationAttempts","parseEvents","resetActionIndex","currentActionIndex","fireInitialAnimations","disableKeyboard","keyPressed","checkForOutsideClick","closestTrigger","closestActions","LEFT_ARROW","doActionNext","doActionPrev","UP_ARROW","RIGHT_ARROW","DOWN_ARROW","focusAction","actions","getActionsElement","focusElement","eventTypes","isOpen","newDir","oldDir","MdFabSpeedDialFlingAnimation","delayDone","runAnimation","triggerElement","startZIndex","variablesElement","webkitTransform","triggerItemHeightOffset","triggerItemWidthOffset","scrollWidth","MdFabSpeedDialScaleAnimation","offsetDelay","MdFabToolbarAnimation","backgroundElement","toolbarElement","iconElement","backgroundColor","borderRadius","pointerEvents","GridListDirective","$mdGridLayout","GridListController","mdOnLayout","layoutDelegate","tilesInvalidated","tiles","ele","$$mdDestroyed","tileSpans","tileElements","colCount","rowMode","getRowMode","rowHeight","applyDefaultUnit","whRatio","gutter","lastLayoutProps","tilePositions","rowCount","DIMENSION","span","vUnit","UNIT","share","gutterShare","ps","spans","hShare","hGutterShare","hUnit","POSITION","marginTop","reflow","invalidateLayout","unwatchAttrs","layoutIfMediaMatch","removeListener","exprStr","layoutInvalidated","$timeout_","GridLayoutFactory","defaultAnimator","GridTileAnimator","GridLayout","animateWith","customAnimator","layoutInfo","gridStyles","mapTime","reflowTime","layoutTime","nextRow","curRow","adjustRow","curCol","cols","by","spaceTracker","tracker","positioning","animatorFn","tileCount","totalTime","GridTileDirective","gridCtrl","invalidateTiles","newIdx","oldIdx","GridTileCaptionDirective","mdInputContainerDirective","ContainerCtrl","INPUT_TAGS","LEFT_SELECTORS","isel","RIGHT_SELECTORS","leftIcon","rightIcon","mdIsError","delegateClick","setFocused","isFocused","setHasValue","setHasPlaceholder","hasPlaceholder","isInvalid","hasLabelAndInput","inputTextareaDirective","hasNgModel","parentForm","isReadonly","readonly","mdNoAsterisk","errorsSpacer","placeholder","minRows","maxRows","scopeResizeListener","handleHiddenChange","isAutogrowing","growTextarea","maxHeight","originalPadding","formattersListener","disableAutogrow","listenerIndex","isDragging","startHeight","dragGestureHandler","onMouseDown","rows","wasHidden","inputCheckValue","ngModelPipelineCheckValue","mdMaxlengthDirective","charCountEl","renderCharCount","mdMaxlength","placeholderDirective","inputContainer","noFloat","newLabel","mdSelectOnFocusDirective","preventMouseUp","onFocus","onMouseUp","ngMessageDirective","isInsideInputContainer","initMessageElement","DOCUMENT_FRAGMENT_NODE","mdInputInvalidMessagesAnimation","saveSharedServices","showInputMessages","ngMessagesAnimation","hideInputMessages","ngMessageAnimation","showMessage","hideMessage","animators","getMessagesElement","topMargin","margin-top","_$$AnimateRunner_","_$animateCss_","mdListDirective","tEl","mdListItemDirective","proxiedTypes","hasProxiedElement","proxyElement","secondaryItemsWrapper","isEndAligned","xAxisPosition","secondaryItems","itemContainer","ngDblclick","ngAttrUiSref","wrapIn","buttonWrap","copyAttributes","extraAttrs","copiedAttrs","hasClickEvent","secondaryItem","wrapSecondaryItem","buttonWrapper","toggleType","toggleTypes","menuEl","menuOpenButton","proxies","firstElement","clickChild","hasClick","noProxies","attachRipple","mouseActive","proxyOnBlur","clickChildKeypressListener","isEventFromControl","forbiddenControls","maxPath","MdListController","$mdListInkRipple","MdNavBar","MdNavBarController","mdSelectedNavItem","mdNoInkBar","navBarAriaLabel","_$scope","_$mdConstant","_navBarEl","_inkbar","deregisterTabWatch","_initTabs","MdNavItem","MdNavItemController","navigationAttribute","buttonTemplate","hasNavClick","mdNavClick","hasNavHref","mdNavHref","hasNavSref","mdNavSref","hasSrefOpts","srefOpts","mdNavItem","mdNavBar","navButton","_$element","_selected","_focused","definePreset","preset","getAllPresets","clearPresets","MdPanelService","presets","_defaultConfigOptions","propagateContainerEvents","_wrapTemplate","trapFocus","_config","_$rootElement","_$rootScope","_$injector","_$window","_$mdUtil","_trackedPanels","_groups","MdPanelAnimation","xPosition","MdPanelPosition","yPosition","interceptorTypes","MdPanelRef","closeReasons","absPosition","_$q","_$mdCompiler","_$mdTheming","_$animate","_$mdPanel","_$log","_$$rAF","panelContainer","panelEl","isAttached","_removeListeners","_topFocusTrap","_bottomFocusTrap","_backdropRef","_interceptors","_compilerCleanup","_restoreCache","_isRTL","_absolute","_relativeToEl","_top","_bottom","_left","_right","_translateX","_translateY","_positions","_actualPosition","_openFrom","_closeTo","_animationClass","_openDuration","_closeDuration","_rawDuration","getElement","queryResult","MdProgressLinearDirective","MODE_DETERMINATE","MODE_INDETERMINATE","MODE_BUFFER","MODE_QUERY","DISABLED_CLASS","postLink","lastMode","toVendorCSS","toCss","bar1","bar2","mdMode","animateIndicator","percentValue","clamp","mdRadioGroupDirective","RadioGroupController","_ngModelCtrl","rbRender","_radioButtonRenderFns","setViewValue","getViewValue","selectNext","changeSelectedButton","selectPrevious","setActiveDescendant","radioId","rgCtrl","setFocus","increment","mdRadioButtonDirective","CHECKED_CSS","lastChecked","aria-checked","initialize","createDirective","targetValue","unregister","cachedTransitionStyles","waitTransitionEnd","SidenavService","$mdComponentRegistry","errorMsg","shouldWait","waitFor","waitForInstance","enableWait","isLockedOpen","falseFn","onClose","SidenavDirective","sidenavCtrl","lastParentOverFlow","triggeringInteractionType","previousContainerStyles","disableScrollTarget","triggeringElement","isLockedOpenParsed","mdIsLockedOpen","ngWindow","onKeyDown","mdDisableScrollTarget","$media","isLocked","focusEl","restorePositioning","willOpen","drawerEl","positionStyle","$toggleOpen","onCloseCb","SidenavController","rawId","mdComponentId","hasDataBinding","componentId","SelectDirective","$mdSelect","keyCodes","valueEl","mdOnOpen","autofillClone","aria-hidden","newEl","isMultiple","multipleContent","selectTemplate","ariaLabelBase","selectContainer","selectScope","selectMenuCtrl","untouched","mdSelectCtrl","disableAsterisk","mdContainerClass","deregisterWatcher","syncLabelText","setLabelText","selectedLabels","syncAriaLabel","ariaLabels","setIsPlaceholder","isSelectLabelFromUser","mdSelectedText","mdSelectedHtml","isPlaceholder","_mdSelectIsOpen","triggerClose","mdOnClose","labelText","prevVal","setMultiple","aria-disabled","openSelect","handleKeypress","ariaAttrs","aria-expanded","aria-multiselectable","ngMultiple","containerId","isNavigationKey","shouldHandleKey","optNodeForKeyboardSearch","optionCtrl","deselect","refreshViewValue","preserveScope","skipCompile","preserveElement","loadingAsync","SelectMenuDirective","SelectMenuController","clickListener","optionHashKey","isSelected","hashGetter","defaultIsEmpty","clearSearchTimeout","optNodes","optText","searchStr","validateArray","renderMultiple","modelBinding","renderSingular","oldSelected","newSelectedHashes","newSelectedValues","isNumPadKey","trackByLocals","trackByParsed","trackByOption","valueScope","$value","$$mdSelectId","mapFn","selectedOptionEls","checkboxContainer","rippleContainer","hashedValue","setSelected","usingTrackBy","OptionDirective","OptionController","setOptionValue","aria-selected","prevAttempt","oldHashKey","newHashKey","SelectProvider","selectDefaultOptions","isRemoved","$$loadingAsyncDone","positionAndFocusMenu","selectEl","contentEl","optionNodes","debouncedOnResize","alreadyOpen","cleanupInteraction","dropDown","onBackdropClick","onMenuKeyDown","checkCloseMenu","restoreFocus","focusOption","TAB","optNode","focusedNode","newOption","optionsArray","mouseOnScrollbar","clickOnScrollbar","cleanupResizing","updates","calculateMenuPositions","mdSelect","menuController","selectNode","contentNode","parentRect","targetRect","spaceAvailable","selectedNode","optgroupNodes","isScrollable","oldDisplay","centeredNode","selectMenuRect","centeredRect","offsetLeft","offsetTop","containerRect","centeredStyle","scrollBuffer","transformOrigin","fontSize","scaleX","scaleY","min-width","font-size","isNonUsefulKey","isMetaKey","isFnLockKey","hasModifierKey","SliderDirective","thumb","thumbText","thumbContainer","trackContainer","activeTrack","tickContainer","throttledRefreshDimensions","refreshSliderDimensions","vertical","mdVertical","discrete","mdDiscrete","mdInvert","updateMin","updateMax","updateStep","updateRound","updateAll","ngModelRender","changeAmount","setModelValue","numSteps","dimensions","tickCanvas","tickCtx","getContext","getSliderDimensions","sliderDimensions","trackTicksStyle","fillStyle","fillRect","clearRect","closestVal","minMaxValidator","stepValidator","percentToValue","positionToPercent","setSliderPercent","valueToPercent","setSliderFromEvent","debouncedUpdateAll","minValue","formattedValue","fitInputWidthToTextLength","thumbPosition","activeTrackPercent","calc","MdSticky","browserStickySupport","stickyClone","$$sticky","isScrolling","lastScrollTime","debouncedRefreshElements","contentCtrl","loopScrollEvent","refreshElements","refreshPosition","currentScrollTop","setCurrentItem","onScroll","isScrollingDown","prevScrollTop","translate","setStickyState","translateY","cloneElement","MdSubheaderDirective","$mdSticky","getContent","MdSwitch","mdCheckboxDirective","checkboxDirective","checkboxLink","drag","disabledGetter","switchContainer","labelContainer","isInverted","srcEvent","getDirective","DirectiveFactory","MdToastDirective","$mdToast","MdToastProvider","toastDefaultOptions","activeToastContent","updateTextContent","newContent","argOption","highlightAction","highlightClasses","highlightClass","addMethod","SWIPE_EVENTS","isSmScreen","onSwipe","gesture","swipe","openClass","toastClass","hideDelay","templateRoot","mdToolbarDirective","onMdContentLoad","newContentEl","debouncedContentScroll","disableScrollShrink","enableScrollShrink","onContentScroll","debouncedUpdateHeight","toolbarHeight","shrinkSpeedFactor","hasWhiteFrame","updateToolbarHeight","margin-bottom","mdScrollShrink","mdShrinkSpeedFactor","shrinkWithScroll","closestContent","MdTooltipDirective","$mdPanel","$$mdTooltipRegistry","ENTER_EVENTS","LEAVE_EVENTS","TOOLTIP_DIRECTIONS","CENTER","ABOVE","OFFSET_END","BELOW","OFFSET_START","mdZIndex","mdDelay","mdVisible","mdAutohide","mdDirection","panelPosition","panelRef","showTimeout","tooltipId","updatePosition","elementFocusedOnWindowBlur","addAriaLabel","interpolatedText","newPanelPosition","relativeTo","addPanelPosition","setVisible","queued","visibleWatcher","onVisibleChanged","isVisible","panelAnimation","attachTo","newPanelAnimation","withAnimation","panelConfig","panelClass","attributeObserver","windowScrollEventHandler","windowBlurEventHandler","enterEventHandler","leaveEventHandler","mousedownEventHandler","MutationObserver","mutations","mutation","observe","disconnect","onElementDestroy","MdTruncateController","virtualRepeatContainerTemplate","VirtualRepeatContainerController","scrollSize","scrollOffset","repeater","autoShrink","autoShrinkMin","mdAutoShrinkMin","originalSize","offsetSize","mdOffsetSize","oldElementSize","maxElementPixels","ELEMENT_MAX_PIXELS","mdTopIndex","bindTopIndex","topIndex","newIndex","scrollToIndex","scroller","sizer","offsetter","boundUpdateSize","updateSize","debouncedUpdateSize","jWindow","VirtualRepeatDirective","VirtualRepeatController","mdVirtualRepeat","repeatName","repeatListExpression","extraName","mdExtraName","link_","mdOnDemand","browserCheckUrlChange","newStartIndex","newEndIndex","newVisibleEnd","itemSize","mdItemSize","isFirstRender","isVirtualRepeatUpdating_","itemsLength","unwatchItemSize_","blocks","pooledBlocks","cleanupBlocks_","VirtualRepeatModelArrayLike","model","getItemAtIndex","getLength","MdWhiteframeDirective","oldClass","elevation","newClass","MdAutocompleteCtrl","$mdLiveAnnouncer","itemParts","itemsExpr","itemExpr","noBlur","selectedItemWatchers","fetchesInProgress","enableWrapScroll","inputModelCtrl","positionDropdown","ReportType","oldHidden","reportMessages","Count","Selected","ul","itemName","loading","isRequired","hasNotFound","updateScroll","onListLeave","hasSelection","hasEscapeOption","searchText","clearSelectedItem","clearSearchText","doBlur","forceBlur","shouldHide","evalAttr","isSearchable","isMinLengthMet","handleQuery","clear","listEnter","listLeave","mouseUp","getCurrentDisplayValue","registerSelectedItemWatcher","unregisterSelectedItemWatcher","notFoundVisible","loadingIsVisible","selectedItem","clearButton","updateModelValidators","requireMatch","dropdownHeight","dropdownItems","hrect","vrect","snap","bot","dropdownPosition","mdFloatingLabel","bottomSpace","scrollContainer","dropdown","focusInputElement","selectedItemChange","previousSelectedItem","getDisplayValue","displayValue","itemChange","getItemAsNameVal","handleSearchText","previousSearchText","autoselect","textChange","setLoading","getMinLength","minLength","itemText","hasMatches","escapeOptions","eventObj","initCustomEvent","fetchResults","term","isList","isPromise","onResultsRetrieved","handleResults","isPolite","politeness","announce","hgt","li","noCache","selectOnMatch","isMatching","matchInsensitive","snapWrap","autofocus","MdAutocomplete","$$mdSvgRegistry","inputName","inputMinlength","inputMaxlength","floatingLabel","menuClass","inputId","mdClearButton","noItemsTemplate","templateTag","itemTemplate","leftover","mdClose","MdAutocompleteItemScopeDirective","tAttr","scopeDigesting","newScopeDigesting","$mdAutocompleteCtrl","watchVariable","variable","alias","MdHighlightCtrl","MdHighlight","termExpr","mdHighlightText","unsafeContentExpr","MdChipCtrl","isEditting","parentController","enableChipEdit","MdChip","deleteHintTemplate","chipsController","chipController","chipContentElement","resetSelectedChip","shouldFocusLastChip","focusLastChipThenInput","MdChipRemove","removeChip","$$replacedScope","MdChipTransclude","$mdChipsCtrl","newHtml","$chip","mdChipTransclude","MdChipsCtrl","userInputNgModelCtrl","autocompleteCtrl","userInputElement","selectedChip","mdEnableChipEdit","addOnBlur","mdAddOnBlur","inputAriaLabel","containerHint","deleteHint","deleteButtonLabel","chipBuffer","useTransformChip","useOnAdd","useOnRemove","wrapperId","contentIds","ariaTabIndex","chipAppendDelay","MdChips","templates","chips","default","userTemplate","chipTemplate","getTemplateByQuery","chipRemoveTemplate","chipContentsTemplate","chipInputTemplate","staticChips","compiledStaticChips","mdChipsCtrl","mdCloseIcon","configureNgModel","mdTransformChip","useTransformChipExpression","mdOnAppend","useOnAppendExpression","mdOnAdd","useOnAddExpression","mdOnRemove","useOnRemoveExpression","mdOnSelect","useOnSelectExpression","autocompleteEl","configureAutocomplete","configureUserInput","removable","secondaryPlaceholder","maxChips","transformChip","onAppend","onAdd","onSelect","separatorKeys","chipAppendDelayString","MdContactChipsCtrl","MdContactChips","contactChipsController","contactQuery","contactName","contactImage","contactEmail","contacts","highlightFlags","CalendarCtrl","$$mdDateUtil","$mdDateLocale","dateUtil","today","createDateAtMidnight","SELECTED_DATE_CLASS","TODAY_CLASS","FOCUSED_DATE_CLASS","displayDate","selectedDate","firstRenderableDate","lastRenderableDate","scrollbarWidth","boundKeyHandler","handleKeyEvent","handleKeyElement","CalendarMonthCtrl","dateLocale","calendarScroller","isMonthTransitionInProgress","cellClickHandler","timestamp","getTimestampFromNode","calendarCtrl","setNgModelValue","headerClickHandler","setCurrentView","mdCalendarMonthBodyDirective","ARROW_ICON","mdTabsArrow","CalendarMonthBodyCtrl","monthCtrl","monthBodyCtrl","arrowIcon","generateContent","focusAfterAppend","CalendarYearCtrl","CalendarYearBodyCtrl","yearCtrl","datePickerDirective","hiddenIcons","mdHideIcons","ariaLabelValue","mdPlaceholder","calendarButton","mdCalendar","triangleButton","minDate","maxDate","currentView","debounceInterval","DatePickerCtrl","spacer","parentSubmittedWatcher","mdDatePickerCtrl","mdInputContainer","isSubmitted","updateErrorState","inputElement","ngInputElement","calendarPane","inputMask","setDisabled","isCalendarOpen","openOnFocus","calendarPaneOpenedFrom","calendarPaneId","bodyClickHandler","handleBodyClick","windowEventName","windowEventHandler","closeCalendarPane","windowBlurHandler","handleWindowBlur","ngDateFilter","leftMargin","detachCalendarPane","mdIsOpen","shouldBeOpen","openCalendarPane","MdIconProvider","ConfigurationItem","viewBoxSize","defaultViewBoxSize","MdIconService","iconCache","svgCache","urlRegex","dataUrlRegex","Icon","prepare","preserveAspectRatio","viewBox","getIcon","fontSet","fontSets","defaultFontSet","getTrustedUrl","cacheElement","cacheSuffix","loadByURL","loadByID","loadFromIconSet","cacheIcon","icon","iconConfig","setName","iconSetConfig","iconName","announceIdNotFound","atob","MenuController","$mdMenu","menuContainer","nestLevel","mdNestLevel","setMenuContainer","isInMenuBar","nestedMenus","onIsOpenChanged","menuContainerId","aria-owns","aria-haspopup","disableHoverListener","openMenuTimeout","menuItems","deregisterScopeListeners","enableHoverListener","currentlyOpenMenu","isAlreadyOpening","registerContainerProxy","triggerContainerProxy","handleMenuItemHover","handleMenuItemMouseLeave","nestedMenu","focusableTarget","mdMenuCtrl","$mdMenuIsOpen","focusMenuContainer","containerProxy","skipFocus","closeOpts","eventDetails","restoreFocusTo","positionMode","attachment","mdPositionMode","offsets","mdOffset","$mdOpenMenu","MenuDirective","INVALID_PREFIX","triggerEl","isButtonTrigger","nestingDepth","menuContents","MenuProvider","menuDefaultOptions","MENU_EDGE_MARGIN","menuContentEl","repositionMenu","calculateMenuPosition","captureClickListener","focusTarget","childrenLen","childIndex","handled","closeAll","focusMenuItem","parentMenu","hasAnyAttribute","closestMenu","cleanupBackdrop","toNode","didFocus","currentItem","openMenuNode","openMenuNodeRect","boundryNodeRect","menuStyle","originNode","originNodeRect","alignTargetRect","existingOffsets","alignTarget","rtl","willFitRight","MenuBarController","methodName","MenuBarDirective","templateEl","ariaRole","contentEls","MenuItemController","MenuItemDirective","buttonEl","iconTemplate","inMenuBarClass","setDefault","mdChecked","MdProgressCircularDirective","$mdProgressCircular","rAF","cAF","INDETERMINATE_CLASS","mdDiameter","aria-valuemin","aria-valuemax","MdProgressCircularLink","lastDrawFrame","svg","startIndeterminate","endIndeterminate","iterationCount","lastAnimationId","renderCircle","animateFrom","animateTo","changeInValue","diameter","getSize","strokeWidth","getStroke","ease","easeFn","rotation","dashLimit","renderFrame","getDashLength","animateIndeterminate","easeFnIndeterminate","durationIndeterminate","startIndeterminateAnimation","cleanupIndeterminateAnimation","getSvgArc","indeterminate","radius","arcRadius","progressSize","MdTabScroll","mdTabScroll","MdTabsController","$mdTabInkRipple","getElements","destroyed","loaded","defineBooleanAttribute","updateValue","handleWindowResize","handleStretchTabs","stretchTabs","shouldPaginate","updateInkBarStyles","handleCenterTabs","shouldCenterTabs","handleMaxTabWidth","newWidth","oldWidth","tabs","tab","handleShouldPaginate","maxTabWidth","getMaxTabWidth","adjustOffset","handleHasContent","handleOffsetChange","paging","handleFocusIndexChange","oldIndex","redirectFocus","handleSelectedIndexChange","getNearestSafeIndex","lastSelectedIndex","updateHeightFromContent","handleResizeWhenVisible","canSkipClick","focusIndex","noSelectClick","fixOffset","updatePagination","handleInkBar","inkBar","handleDynamicHeight","canvas","dummies","centerTabs","maxOffset","getIndex","canvasWidth","noPagination","calcTabsWidth","incrementIndex","inc","styleTabItemFocus","refreshIndex","currentHeight","fromHeight","toHeight","dynamicHeight","newHeight","tabContent","tabsHeight","totalWidth","ink","lastTab","tabContentPrefix","$mdTabsTemplate","colorElement","insertTab","tabData","hasLoaded","isActive","isLeft","isRight","shouldRender","noDisconnect","setAriaControls","removeTab","wheelDelta","nextPage","viewportWidth","previousPage","canPageForward","canPageBack","getTabElementIndex","tabEl","updateTabOrder","focusItem","getFocusedTabId","focusedTab","MdTabs","MdTabsDummyWrapper","mutationCallback","debounced","childList","subtree","characterData","MdTabsTemplate","compileScope","enableDisconnect","reconnect","connected","rgbaToHex","hexToRgba","green","blue","rgbToRgba","rgbaToRgb","prefixTestEl","vendorPrefix","testElement","vendorRegex","isWebkit","vendorProperty","ucPrefix","lcPrefix","hasStyleProperty","isInputKey","kc","COMMA","SEMICOLON","PAGE_UP","PAGE_DOWN","END","HOME","BACKSPACE","DELETE","TRANSITIONEND","ANIMATIONEND","TRANSFORM_ORIGIN","TRANSITION","ANIMATION_PLAY_STATE","ANIMATION_DURATION","ANIMATION_NAME","ANIMATION_TIMING","ANIMATION_DIRECTION","gt-xs","sm","gt-sm","md","gt-md","lg","gt-lg","xl","landscape","portrait","print","_prepareContentElement","_compileTemplate","_fetchContentElement","restore","$$ngTemplate","_compileElement","ngLinkFn","compileData","injectLocals","invokeCtrl","createRestoreFn","disableWarnings","pointerEvent","onInputEvent","onBufferInputEvent","checkDelay","eventPointer","parentTargetOptions","getNearestParent","onDestroy","skipClickHijack","InterimElementFactory","createInterimElementProvider","interimFactoryName","EXPOSED_METHODS","customMethods","providerConfig","optionsFactory","$$interimElement","interimElementService","publicService","_options","defaultOptions","defaultMethods","invokeFactory","presetDefaults","presetMethods","Preset","$mdCompiler","SHOW_CANCELLED","showPromises","hidePromises","showingInterims","interimElement","InterimElement","hideAction","promiseArray","showAction","fault","waitForInterim","closeElement","interim","cancelAction","parentEl","filtered","$injector_","callbackFn","fnArguments","cancelAutoHide","rejectAll","compiledData","notifyShowing","notifyComplete","autoHideTimer","isCancelled","hideElement","resolveAll","announceRemoving","onRemoving","breakpoints","mqb","fullName","translateWithValueToCssClass","lastClass","disableLayouts","liveEl","metaElements","mapExistingElement","newMeta","getMeta","isDisabledGlobally","disableInkRipple","_color","_parseColor","inkRipple","calculateColor","colorUtil","handleMousedown","handleMouseup","handleTouchmove","layerX","layerY","srcElement","layerRect","clearRipples","deleteRipples","fadeInComplete","isRippleAllowed","ripple","borderColor","DURATION","removeRipple","fadeOutComplete","50","100","200","300","400","500","600","700","800","900","A100","A200","A400","A700","pink","purple","deep-purple","indigo","light-blue","cyan","teal","light-green","lime","yellow","amber","orange","deep-orange","brown","grey","blue-grey","1","hue-1","hue-2","hue-3","defaultDefaultHues","reverseTranslate","newFrom","TIMEOUT","finished","calculateTransformValues","originator","originCenterPt","originBnds","cntr","copyRect","dialogRect","dialogCenterPt","centerPointFor","centerX","centerY","calculateSlideToOrigin","convertToVendor","addTransition","WebkitAppearance","$$AnimateRunnerFactory","$$rAFMutex","_runInAnimationFrame","applyClasses","parseMaxTime","cancelLastRAFRequest","eventFn","areAnimationsAllowed","hasCompleteStyles","hasCompleteClasses","hasCompleteAnimation","cs","tdr","adr","tdy","ady","moreStyles","bodyStyles","resize","viewportHeight","resizeHandler","layout","mdNoFloat","mdAutoHide","hasVisibiltyDirective","_mdMocksIncluded","_updateTabs","newTab","_getTabs","_getTabByName","oldTab","_updateInkBarStyles","getButtonEl","_findTab","getName","_getSelectedTab","getFocusedTab","_moveFocus","onKeydown","focusedTabIndex","getNgClassMap","md-active","md-primary","md-unselected","md-focused","trackedPanel","_getPresetByName","groupName","addToGroup","newPanelGroup","panels","openPanels","maxOpen","setGroupMaxOpen","_openCountExceedsMaxOpen","_closeFirstOpenedPanel","origTemplate","_wrapContentElement","CLOSE","_done","_simpleBind","closeReason","_callInterceptors","onCloseSuccess","onDomAdded","_createBackdrop","_createPanel","_addEventListeners","onDomRemoved","_removeEventListeners","removeFromGroup","onOpenComplete","_animateOpen","_focusOnOpen","_animateClose","fromElement","onElement","_compile","mdPanelRef","_configureTrapFocus","_addStyles","hideAndResolve","_setTheming","_updatePosition","positionConfig","_setPanelPosition","TOP","getTop","BOTTOM","getBottom","LEFT","getLeft","RIGHT","getRight","backdropConfig","backdropAnimation","_configureEscapeToClose","_configureClickOutsideToClose","_configureScrollListener","sourceEl","CLICK_OUTSIDE","debouncedUpdatePosition","updateAnimation","animationConfig","animateOpen","animateClose","registerInterceptor","removeInterceptor","removeAllInterceptors","ALIGN_START","ALIGN_END","ALIGN_TOPS","ALIGN_BOTTOMS","viewportMargin","absolute","_setPosition","positions","centerHorizontally","centerVertically","_validateXPosition","_validateYPosition","positionKeys","positionValues","withOffsetX","withOffsetY","getTransform","_reduceTranslateValues","_setTransform","_isOnscreen","openIndex","closeIndex","output","parsedValues","innerHeight","innerWidth","getActualPosition","translateFn","translation","translationValue","_calculatePanelPosition","_constrainToViewport","initialTop","initialLeft","_reverseXPosition","_bidi","panelBounds","panelWidth","panelHeight","targetBounds","targetLeft","targetRight","targetWidth","targetTop","targetBottom","targetHeight","SLIDE","SCALE","FADE","_getPanelAnimationTarget","toSeconds","_getBoundingClientRect","animationOptions","_fixBounds","panelTransform","openTo","openSlide","openScale","reverseAnimationOptions","closeFrom","closeSlide","closeScale","setupLabelElement","labelElement","slider","setDisable","initialMaxWidth","stopDisabledWatch","newMaxWidth","computedStyle","useCapture","globalEventHandler","currentHandler","repeaterCtrl","handleScroll_","isHorizontal","setSize_","dimension","getDimensionName_","unsetSize_","containerUpdated","getScrollSize","sizeScroller_","crossDimension","numChildren","sizerChild","autoShrink_","_originalSize","shrinkSize","getItemSize","currentSize","setScrollSize","itemsSize","getScrollOffset","resetScroll","maxSize","numItems","getItemCount","rawRepeatListExpression","sized","repeatListExpression_","readItemSize_","getBlock_","poolBlock_","virtualList","repeatList","$$includeIndexes","oldItems","virtualRepeatUpdate_","updateIndexes_","firstRenderStartIndex","lengthChanged","cleanupFirstRender","previousScrollOffset","mdStartIndex","blockIndex","newStartBlocks","newEndBlocks","updateBlock_","maxIndex","domFragmentFromBlocks_","new","updateScope_","containerLength","unsafeTermFn","unsafeContentFn","mdHighlightFlags","unregisterFn","contentText","onRender","prevState","createRegex","applyRegex","resolveTokens","tokenEl","isMatch","appendToken","targetText","startFlag","endFlag","regexTerm","sanitizeRegex","chipKeyDown","chipMouseDown","getChipContent","chipContents","getContentElement","getChipIndex","goOutOfEditMode","chipIndex","contentEditable","updateChipContents","focusChip","removeChipAndFocusInput","selectNodeContents","createTextRange","moveToElementText","getSelection","createRange","removeAllRanges","addRange","goInEditMode","setupInputAria","setupWrapperAria","inputKeydown","getChipBuffer","getCursorPosition","selectAndFocusChipSafe","hasMaxChipsReached","appendChip","resetChipBuffer","selectionStart","selectionEnd","isEditingChip","isRemovable","chipKeydown","removeAndSelectAdjacentChip","getPlaceholder","selIndex","getAdjacentChipIndex","newChip","transformedChip","validateModel","useOnSelect","removed","focusInput","selectChip","selectAndFocusChip","chipContent","onInputFocus","inputHasFocus","onInputBlur","shouldAddOnBlur","scopeApplyFn","isModelValid","isAutocompleteShowing","contentIdFor","queryContact","$query","_currentView","newView","previousFocus","cellId","getDateId","cell","getActionFromKeyEvent","hideVerticalScrollbar","childCtrl","setWidth","updateVirtualRepeat","virtualRepeatResizeListener","getMonthDistance","attachScopeListeners","getSelectedMonthIndex","changeSelectedDate","previousSelectedDate","changeDisplayDate","dateCell","selectedDateClass","prevDateCell","buildWeekHeader","animationPromise","animateDateChange","monthDistance","firstDayOfWeek","shortDays","incrementDays","incrementMonths","getFirstDateOfMonth","getLastDateOfMonth","clampDate","buildCalendarForMonth","buildDateCell","opt_date","cellText","selectionIndicator","longDateFormatter","isSameDay","dates","isDateEnabled","isDateWithinRange","buildDateRow","rowNumber","weekNumberFormatter","opt_dateInMonth","firstDayOfMonth","firstDayOfTheWeek","getLocaleDay_","numberOfDaysInMonth","getNumberOfDaysInMonth","monthBody","isFinalMonth","blankCellOffset","monthLabelCell","monthLabelCellContent","monthHeaderFormatter","monthFormatter","monthLabelRow","dayOfWeek","iterationDate","setDate","whitespaceRow","getYearDistance","getFocusedYearIndex","changeDate","yearBodyCtrl","incrementYears","buildCalendarForYear","buildMonthCell","buildBlankCell","firstOfMonth","isSameMonthAndYear","shortMonths","isMonthWithinRange","yearBody","firstRow","labelCell","secondRow","DateLocaleProvider","months","days","formatDate","msgCalendar","msgOpenCalendar","defaultShortDays","day","defaultDates","defaultFirstRenderableDate","defaultLastRendereableDate","localeTime","toLocaleTimeString","dateString","isDateComplete","getDateInNextMonth","getDateInPreviousMonth","isInNextMonth","startDate","endDate","isInPreviousMonth","previousMonth","getDateMidpoint","d1","d2","getWeekOfMonth","numberOfDays","setDateTimeToMidnight","dateAtMidnight","minDateAtMidnight","maxDateAtMidnight","numberOfYears","boundDate","numberOfMonths","dateInTargetMonth","opt_value","locale","installPropertyInterceptors","attachChangeListeners","attachInteractionListeners","parsedValue","onExternalChange","resizeInputElement","handleInputEvent","clearErrorState","inputString","attachCalendarPane","elementRect","bodyRect","paneTop","paneLeft","viewportLeft","viewportBottom","viewportRight","inputFocusedOnWindowBlur","focusCalendar","getCalendarCtrl","$mdIcon","lastFontIcon","mdFontIcon","lastFontSet","mdFontSet","mdSvgIcon","mdSvgSrc","fontIconChanged","alt","attrVal","mdCancel","mdMenu","mdToggleArrow","iconSet","defaultIconSet","defaultIconSize","iconSize","handleKeyDown","parentToolbar","getMenus","enableOpenOnHover","rootMenus","disableOpenOnHover","setKeyboardMode","openOnHoverEnabled","handleParentClick","handleMenuHover","scheduleOpenHoveredMenu","menuCtrl","scheduleOpenMenu","pendingMenuOpen","newMenu","newMenuCtrl","currentMenu","wasOpen","openFocusedMenu","focusMenu","menus","focusedIndex","getFocusedMenuIndex","getOpenMenuIndex","menu","getFocusedMenu","focusedEl","openMenu","iconEl","initClickListeners","clearNgAria","handleClick","progressConfig","linearEase","materialEase","easingPresets","configure","tc","ngMaterial","$resourceMinErr","MEMBER_NAME_REGEX","lookupDottedPath","shallowClearAndCopy","PROTOCOL_AND_IPV6_REGEX","stripTrailingSlashes","cancellable","save","Route","urlParams","setUrlParams","actionUrl","encodedVal","protocolAndIpv6","isQueryParamValue","paramInfo","urlParam","p1","leadingSlashes","tail","resourceFactory","paramDefaults","route","defaultResponseInterceptor","resource","Resource","toJSON","$promise","$resolved","$cancelRequest","hasBody","numericTimeout","a1","a2","a3","a4","timeoutDeferred","numericTimeoutPromise","actionParams","ids","isInstanceCall","httpConfig","responseInterceptor","responseErrorInterceptor","hasError","hasResponseErrorInterceptor","additionalParamDefaults","extendedParamDefaults","nodeContains","htmlParser","htmlSanitizeWriter","$sanitizeMinErr","inertBodyElement","svgEnabled","SURROGATE_PAIR_REGEXP","validElements","svgElements","buf","enableSvg","mXSSAttempts","stripCustomNsAttrs","attrNode","removeAttributeNode","getNonDescendant","uriValidator","ignoreCurrentElement","blockedElements","lkey","validAttrs","uriAttrs","encodeEntities","voidElements","NON_ALPHANUMERIC_REGEXP","toMap","optionalEndTagBlockElements","optionalEndTagInlineElements","optionalEndTagElements","blockElements","inlineElements","htmlAttrs","svgAttrs","lowercaseKeys","outerText","bodyElements","getDocumentElement","$sanitize","LINKY_URL_REGEXP","MAILTO_REGEXP","linkyMinErr","attributesFn","addText","linkAttributes","addLink","runTranslate","$translate","fallbackFromIncorrectStorageValue","preferred","preferredLanguage","use","storage","storageKey","displayName","$STORAGE_KEY","$windowProvider","$translateSanitizationProvider","pascalprechtTranslateOverrider","getFirstBrowserLanguage","getLocale","language","nav","browserLanguagePropertyKeys","languages","languageTagResolver","uniformLanguageTagResolver","searchElement","negotiateLocale","langKeyAlias","avail","$availableLanguageKeys","$languageKeyAliases","hasWildcardKey","hasExactKey","translations","langKey","translationTable","$translationTable","flatObject","$storageKey","$storagePrefix","$preferredLanguage","$fallbackLanguage","$fallbackWasString","$uses","$nextLang","$storageFactory","$missingTranslationHandlerFactory","$interpolationFactory","$loaderFactory","$loaderOptions","$notFoundIndicatorLeft","$notFoundIndicatorRight","loaderCache","postProcessFn","$interpolatorFactories","$cloakClassName","$postCompilingEnabled","$forceAsyncReloadEnabled","$nestedObjectDelimeter","$isReady","$keepContent","directivePriority","statefulFilter","java","bcp47","iso639-1","cloakClassName","nestedObjectDelimeter","delimiter","keyWithPath","setupPreferredLanguage","addInterpolation","useMessageFormatInterpolation","useInterpolation","useSanitizeValueStrategy","useStrategy","fallbackStack","translationNotFoundIndicator","indicator","translationNotFoundIndicatorLeft","translationNotFoundIndicatorRight","fallbackLanguage","resolveClientLocale","useUrlLoader","useLoader","useStaticFilesLoader","loaderFactory","useLocalStorage","useStorage","useCookieStorage","storageFactory","storagePrefix","useMissingTranslationHandlerLog","useMissingTranslationHandler","usePostCompiling","forceAsyncReload","uniformLanguageTag","standard","determinePreferredLanguage","registerAvailableLanguageKeys","languageKeys","aliases","useLoaderCache","postProcess","keepContent","useLanguage","eachInterpolator","interpolator","interpolatorHashMap","setLocale","Storage","defaultInterpolator","fallbackIndex","startFallbackIteration","eachInterpolationFactory","pendingLoader","langPromises","translationId","interpolateParams","interpolationId","defaultTranslationText","forceLanguage","uses","loadTranslationsIfMissing","translationIds","regardless","promiseResolved","promiseToWaitFor","determineTranslation","applyNotFoundIndicators","loadAsync","loaderOptions","onLoaderSuccess","onLoaderError","table","interpolatorFactory","getInterpolationIdentifier","getFallbackTranslation","Interpolator","onResolve","interpolatedValue","interpolate","applyPostProcessing","getFallbackTranslationInstant","sanitizeStrategy","result2","resolveForFallbackLanguage","fallbackLanguageIndex","missingTranslationHandlerTranslation","translateByHandler","resolveForFallbackLanguageInstant","fallbackTranslationInstant","resolvedTranslation","_translationId","determineTranslationInstant","$onReadyDeferred","useFallbackLanguage","langKeyPosition","proposedLanguage","isPostCompilingEnabled","isForceAsyncReloadEnabled","isKeepContent","oneTranslationsLoaded","tables","loadingKeys","allTranslationsLoaded","tableData","instant","possibleLangKeys","possibleLangKey","versionInfo","globalOnReadyListener","onReady","getAvailableLanguageKeys","getTranslationTable","globalOnChangeListener","processAsyncResult","fallbackLanguageId","$translateDefaultInterpolation","$translateSanitization","$translateInterpolator","interpolationParams","sanitize","translateDirective","translateValuesExist","translateInterpolation","translateValueExist","interpolateRegExp","watcherRegExp","iElement","iAttr","preText","postText","translateNamespace","getTranslateNamespace","observeElementTranslation","iElementText","watcherMatches","_unwatchOld","interpolateMatches","updateTranslations","translateValues","translateAttr","firstAttributeChangedEvent","observeAttributeTranslation","defaultText","observeValueAttribute","applyTranslation","successful","locallyDefined","locallyEnabled","translateKeepContent","globallyEnabled","translateCompile","updateTranslation","translateLanguage","translateDefault","translateAttrDirective","previousAttributes","watchAttribute","valueCallback","changeCallback","translateCloakDirective","applyCloak","removeCloak","translateCloak","translateNamespaceDirective","iAttrs","translateLanguageDirective","newTranslateLanguage","translateFilterFactory","translateFilter","$translationCache","strategies","currentStrategy","hasConfiguredStrategy","hasShownNoStrategyConfiguredWarning","htmlEscapeValue","htmlSanitizeValue","sanitizeParameters","mapInterpolationParameters","escapeParameters","htmlTrustValue","sceParameters","addStrategy","strategyName","strategyFunction","removeStrategy","strategy","cachedStrategyMap","selectedStrategies","selectedStrategy","trustAsHtml","iteratee","propertyValue","propertyKey","$translatePartialLoader","Part","parseUrl","urlTemplate","targetLang","getTable","$httpOptions","errorHandler","hasPart","isStringValid","isPartAvailable","getPrioritizedParts","prioritizedParts","addPart","setPart","deletePart","loadFailureHandler","loaders","deepExtend","wasActive","isPartLoaded","getRegisteredParts","registeredParts","$$UMFP","objectKeys","inheritParams","currentParams","newParams","$current","$to","parentParams","inherited","inheritList","equalForKeys","filterByKeys","pick","omit","silenceUncaughtInPromise","$Resolve","NOTHING","NO_DEPENDENCIES","NO_LOCALS","NO_PARENT","$$promises","$$values","study","invocables","invocableKeys","plan","cycle","visited","visit","isResolve","resolution","merged","$$inheritedValues","$$failure","invocable","invocation","waitParams","onfailure","dep","proceed","$TemplateFactory","fromConfig","fromString","fromUrl","templateProvider","fromProvider","UrlMatcher","parentMatcher","searchPlaceholder","$$new","ParamSet","paramNames","addParameter","Param","quoteRegExp","squash","surroundPattern","matchDetails","isSearch","cfg","segment","caseInsensitive","isOptional","sourceSearch","sourcePath","strict","$$paramNames","$UrlMatcherFactory","isCaseInsensitive","isStrictMode","defaultSquashPolicy","valToString","/","$types","enqueue","typeQueue","defaultTypes","encode","decode","~~","~2F","int","capture","any","isInjectable","flushTypeQueue","def","$$getDefaultValue","strictMode","isMatcher","o","definitionFn","arrayMode","$$fn","urlType","arrayDefaults","arrayParamNomenclature","$asArray","configuredKeys","defaultPolicy","replacement","dynamic","$$parent","$$keys","ignore","paramset","paramValues","$$equals","paramValues1","paramValues2","equal","$$validates","rawVal","encoded","$UrlRouterProvider","$locationProvider","$urlMatcherFactory","otherwise","interceptDeferred","handleIfMatch","$match","lastPushedUrl","listen","sync","read","urlMatcher","$$avoidResync","isHtml5","slash","validates","redirect","handlerIsString","sticky","deferIntercept","$StateProvider","$urlRouterProvider","$state","states","abstractKey","stateBuilder","findState","compositeName","navigable","ownParams","views","resolveAs","$delegates","stateOrName","isStr","stateName","rel","pathLength","registerState","parentName","$stateParams","transitionTo","flushQueuedChildren","$view","$resolve","$urlRouter","TransitionSupersededError","TransitionSuperseded","TransitionPrevented","TransitionAborted","TransitionFailed","go","toParams","$retry","retryTransition","fromParams","fromPath","toState","redirectResult","retry","toPath","keep","toLocals","reloadState","nonSearchParamsEqual","fromAndToState","nonQueryParamKeys","nonQueryParams","reloadOnSearch","paramsAreFiltered","viewsPromises","injectables","controllerProvider","$$controller","$$controllerAs","$$resolveAs","entering","exiting","onExit","onEnter","glob","globSegments","paramDef","lossy","abstract","$ViewProvider","$templateFactory","$ViewDirective","$uiViewScroll","$animator","previousEl","currentEl","latestLocals","renderer","updateView","firstTime","getUiViewName","previousLocals","$uiViewData","animEnter","animLeave","viewAnimData","$animEnter","$animLeave","$$animLeave","$ViewDirectiveFill","resolveData","uiView","uiViewCreatedBy","parseStateRef","ref","preparsed","paramExpr","stateContext","stateData","getTypeInfo","isSvg","isForm","clickable","clickHook","ignorePreventDefaultCount","$StateRefDirective","uiSrefActive","unlinkInfoFn","$$addStateInfo","uiSrefOpts","$StateRefDynamicDirective","uiState","uiStateParams","uiStateOpts","runStateRefLink","$StateRefActiveDirective","activeEqClass","uiSrefActiveEq","addState","stateParams","activeClass","stateHash","stateInfo","$IsStateFilter","isFilter","$IncludedByStateFilter","includesFilter","defaultConfig","searchParams","paramName","paramVal","parameters","nTotal","nPath","decodePathArray","reverseString","allReversed","encodeDashes","isFinalPathParam","isPathParam","isDefaultValue","nextSegment","$subPattern","sub","bindTo","arrayWrap","falsey","arrayHandler","allTruthyMode","arrayUnwrap","val1","val2","$arrayMode","autoinject","useAnchorScroll","MobileDetect","impl","mobileDetectRules","phones","iPhone","BlackBerry","HTC","Nexus","Dell","Motorola","Samsung","LG","Sony","Asus","NokiaLumia","Micromax","Palm","Vertu","Pantech","Fly","Wiko","iMobile","SimValley","Wolfgang","Alcatel","Nintendo","Amoi","INQ","GenericPhone","tablets","iPad","NexusTablet","SamsungTablet","Kindle","SurfaceTablet","HPTablet","AsusTablet","BlackBerryTablet","HTCtablet","MotorolaTablet","NookTablet","AcerTablet","ToshibaTablet","LGTablet","FujitsuTablet","PrestigioTablet","LenovoTablet","DellTablet","YarvikTablet","MedionTablet","ArnovaTablet","IntensoTablet","IRUTablet","MegafonTablet","EbodaTablet","AllViewTablet","ArchosTablet","AinolTablet","NokiaLumiaTablet","SonyTablet","PhilipsTablet","CubeTablet","CobyTablet","MIDTablet","MSITablet","SMiTTablet","RockChipTablet","FlyTablet","bqTablet","HuaweiTablet","NecTablet","PantechTablet","BronchoTablet","VersusTablet","ZyncTablet","PositivoTablet","NabiTablet","KoboTablet","DanewTablet","TexetTablet","PlaystationTablet","TrekstorTablet","PyleAudioTablet","AdvanTablet","DanyTechTablet","GalapadTablet","MicromaxTablet","KarbonnTablet","AllFineTablet","PROSCANTablet","YONESTablet","ChangJiaTablet","GUTablet","PointOfViewTablet","OvermaxTablet","HCLTablet","DPSTablet","VistureTablet","CrestaTablet","MediatekTablet","ConcordeTablet","GoCleverTablet","ModecomTablet","VoninoTablet","ECSTablet","StorexTablet","VodafoneTablet","EssentielBTablet","RossMoorTablet","iMobileTablet","TolinoTablet","AudioSonicTablet","AMPETablet","SkkTablet","TecnoTablet","JXDTablet","iJoyTablet","FX2Tablet","XoroTablet","ViewsonicTablet","OdysTablet","CaptivaTablet","IconbitTablet","TeclastTablet","OndaTablet","JaytechTablet","BlaupunktTablet","DigmaTablet","EvolioTablet","LavaTablet","AocTablet","MpmanTablet","CelkonTablet","WolderTablet","MiTablet","NibiruTablet","NexoTablet","LeaderTablet","UbislateTablet","PocketBookTablet","KocasoTablet","HisenseTablet","Hudl","TelstraTablet","GenericTablet","oss","AndroidOS","BlackBerryOS","PalmOS","SymbianOS","WindowsMobileOS","WindowsPhoneOS","iOS","MeeGoOS","MaemoOS","JavaOS","webOS","badaOS","BREWOS","uas","Chrome","Dolfin","Opera","Skyfire","Edge","IE","Firefox","Bolt","TeaShark","Blazer","Safari","UCBrowser","baiduboxapp","baidubrowser","DiigoBrowser","Puffin","Mercury","ObigoBrowser","NetFront","GenericBrowser","PaleMoon","Mobile","Build","Version","VendorID","iPod","Coast","Fennec","NokiaBrowser","Opera Mini","Opera Mobi","UC Browser","MQQBrowser","MicroMessenger","SamsungBrowser","Iron","Tizen","Webkit","Gecko","Trident","Presto","Goanna","Android","BREW","Java","Windows Phone OS","Windows Phone","Windows CE","Windows NT","Symbian","utils","Bot","MobileBot","DesktopMode","TV","WebKit","Console","Watch","detectMobileBrowsers","fullPattern","shortPattern","tabletPattern","hasOwnProp","equalIC","containsIC","valueLC","convertPropsToRegExp","FALLBACK_PHONE","FALLBACK_TABLET","FALLBACK_MOBILE","verPos","maxPhoneWidth","ua","_cache","oss0","findMatch","findMatches","getVersionStr","propertyName","patterns","getVersion","prepareVersionNo","numbers","isMobileFallback","isTabletFallback","prepareDetectionCache","tablet","mobile","phone","phoneSized","isPhoneSized","mobileGrade","$isMobile","os","detectOS","getDeviceSmallerSide","screen","userAgents","versionStr","grade","_impl","moment","hookCallback","res","createUTC","createLocalOrUTC","utc","getParsingFlags","_pf","unusedTokens","unusedInput","charsLeftOver","nullInput","invalidMonth","invalidFormat","userInvalidated","parsedDateParts","meridiem","some$1","fun","_isValid","parsedParts","isNowValid","_d","invalidWeekday","_strict","bigHour","isFrozen","createInvalid","momentProperties","copyConfig","_isAMomentObject","_i","_f","_l","_tzm","_isUTC","_offset","_locale","updateInProgress","Moment","updateOffset","isMoment","absFloor","argumentForCoercion","coercedNumber","compareArrays","dontConvert","lengthDiff","diffs","suppressDeprecationWarnings","deprecate","deprecationHandler","deprecations","deprecateSimple","mergeConfigs","parentConfig","childConfig","Locale","keys$1","addUnitAlias","shorthand","lowerCase","normalizeUnits","normalizeObjectUnits","inputObject","normalizedProp","normalizedInput","priorities","addUnitPriority","makeGetSet","keepTime","set$1","mom","zeroFill","targetLength","forceSign","absNumber","formattingTokens","localFormattingTokens","formatFunctions","formatTokenFunctions","addFormatToken","padded","ordinal","localeData","formatMoment","expandFormat","invalidDate","replaceLongDateFormatTokens","longDateFormat","match1","match2","match3","match4","match6","match1to2","match3to4","match5to6","match1to3","match1to4","match1to6","matchUnsigned","matchSigned","matchOffset","matchShortOffset","matchWord","regexes","addRegexToken","strictRegex","isStrict","getParseRegexForToken","regexEscape","p2","p3","p4","addParseToken","addWeekParseToken","_w","YEAR","DATE","HOUR","MINUTE","SECOND","MILLISECOND","WEEK","WEEKDAY","indexOf$1","daysInMonth","UTC","getUTCDate","monthsShort","monthsShortRegex","monthsRegex","monthsParse","MONTHS_IN_FORMAT","defaultLocaleMonths","defaultLocaleMonthsShort","setMonth","dayOfMonth","getSetMonth","defaultMonthsShortRegex","defaultMonthsRegex","computeMonthsParse","cmpLenRev","shortPieces","longPieces","mixedPieces","_monthsRegex","_monthsShortRegex","_monthsStrictRegex","_monthsShortStrictRegex","daysInYear","isLeapYear","parseTwoDigitYear","getSetYear","createDate","createUTCDate","getUTCFullYear","firstWeekOffset","dow","doy","fwd","getUTCDay","dayOfYearFromWeeks","weekday","resYear","dayOfYear","resDayOfYear","weekOfYear","resWeek","weekOffset","weeksInYear","weekOffsetNext","weekdaysMin","weekdaysShort","weekdays","weekdaysMinRegex","weekdaysShortRegex","weekdaysRegex","weekdaysParse","defaultLocaleWeekdays","defaultLocaleWeekdaysShort","defaultLocaleWeekdaysMin","defaultWeekdaysRegex","defaultWeekdaysShortRegex","defaultWeekdaysMinRegex","computeWeekdaysParse","minp","shortp","longp","minPieces","_weekdaysRegex","_weekdaysShortRegex","_weekdaysMinRegex","_weekdaysStrictRegex","_weekdaysShortStrictRegex","_weekdaysMinStrictRegex","hFormat","matchMeridiem","_meridiemParse","_isPm","isPM","_meridiem","pos1","pos2","globalLocale","getSetHour","baseConfig","calendar","sameDay","nextDay","nextWeek","lastDay","lastWeek","sameElse","LTS","LT","L","LL","LLL","ordinalParse","relativeTime","future","past","meridiemParse","locales","localeFamilies","normalizeLocale","loadLocale","oldLocale","_abbr","getSetGlobalLocale","defineLocale","abbr","parentLocale","chooseLocale","checkOverflow","_a","_overflowDayOfYear","_overflowWeeks","_overflowWeekday","extendedIsoRegex","basicIsoRegex","tzRegex","isoDates","isoTimes","aspNetJsonRegex","configFromISO","allowTime","dateFormat","timeFormat","tzFormat","configFromStringAndFormat","configFromArray","currentDate","weekYear","weekdayOverflow","curWeek","nowValue","_useUTC","getUTCMonth","W","E","createLocal","_week","gg","_dayOfYear","yearToUse","_nextDay","setUTCMinutes","getUTCMinutes","ISO_8601","parsedInput","stringLength","totalParsedInputLength","skipped","hour","meridiemHour","isPm","prepareConfig","preparse","configFromStringAndArray","tempConfig","bestMoment","scoreToBeat","currentScore","score","createFromInputFallback","minute","millisecond","isUTC","prototypeMin","other","prototypeMax","pickBy","moments","Duration","years","quarters","quarter","weeks","_milliseconds","_days","_months","_bubble","isDuration","absRound","utcOffset","sign","offsetFromString","chunkOffset","cloneWithOffset","setTime","local","getDateOffset","isUtc","aspNetRegex","isoRegex","createDuration","parseIso","diffRes","isBefore","positiveMomentsDifference","inp","isAfter","createAdder","period","addSubtract","isAdding","newLocaleData","defaultFormat","defaultFormatUtc","addWeekYearFormatToken","getSetWeekYearHelper","weeksTarget","dayOfYearData","isoWeekYear","_ordinalParse","_ordinalParseLenient","getSetDayOfMonth","getSetMinute","getSetSecond","parseMs","getSetMillisecond","preParsePostFormat","sod","startOf","calendarFormat","asFloat","zoneDelta","anchor2","wholeMonthDiff","adjust","delta","endOf","postformat","withoutSuffix","humanize","fromNow","toNow","invalidAt","localInput","isBetween","inclusivity","isSame","inputMs","isSameOrAfter","isSameOrBefore","parsingFlags","prioritized","unitsObj","u","isoWeekday","toObject","toDate","unix","creationData","isoWeeks","weekInfo","isoWeeksInYear","keepLocalTime","localAdjust","_changeInProgress","parseZone","tZone","hasAlignedHourOffset","isDST","isUtcOffset","zoneAbbr","zoneName","isDSTShifted","_isDSTShifted","proto$1","get$1","listMonthsImpl","listWeekdaysImpl","localeSorted","_calendar","_longDateFormat","formatUpper","_invalidDate","_ordinal","isFuture","_relativeTime","pastFuture","isFormat","_monthsShort","monthName","_monthsParseExact","llc","toLocaleLowerCase","_monthsParse","_longMonthsParse","_shortMonthsParse","firstDayOfYear","_weekdays","_weekdaysMin","_weekdaysShort","weekdayName","_weekdaysParseExact","_weekdaysParse","_shortWeekdaysParse","_minWeekdaysParse","_fullWeekdaysParse","isLower","langData","mathAbs","addSubtract$1","absCeil","daysToMonths","monthsToDays","makeAs","as","asMilliseconds","asSeconds","asMinutes","asHours","asDays","asWeeks","asMonths","asYears","makeGetter","relativeTime$1","posNegDuration","abs$1","toISOString$1","Y","D","proto$2","monthsFromDays","withSuffix","toIsoString","invalid","updateLocale","relativeTimeRounding","roundingFunction","relativeTimeThreshold","myMoment","PerfectScrollbar","Ps","../main","DOM","styleNameOrObject","styleValue","styleName","cssMultiSet","queryChildren","EventElement","EventManager","eventElements","isHandlerProvided","hdlr","unbindAll","eventElement","ee","onceHandler","5","s4","6","cls","isEditable","removePsClasses","clsList","outerWidth","startScrolling","stopScrolling","env","isWebKit","supportsTouch","DocumentTouch","supportsIePointer","msMaxTouchPoints","./class","./dom","7","./plugin/destroy","./plugin/initialize","./plugin/update","8","maxScrollbarLength","minScrollbarLength","scrollXMarginOffset","scrollYMarginOffset","suppressScrollX","suppressScrollY","swipePropagation","useBothWheelAxes","wheelPropagation","wheelSpeed","9","scrollbarX","scrollbarY","scrollbarXRail","scrollbarYRail","../lib/dom","../lib/helper","./instances","10","updateGeometry","bindClickRailHandler","pageOffset","scrollbarYTop","containerHeight","scrollbarXLeft","containerWidth","../instances","../update-geometry","../update-scroll","11","bindMouseScrollXHandler","currentPageX","currentLeft","mouseMoveHandler","deltaX","maxLeft","newLeft","railXRatio","railXWidth","scrollbarXWidth","contentWidth","negativeScrollAdjustment","mouseUpHandler","bindMouseScrollYHandler","currentPageY","currentTop","deltaY","maxTop","newTop","railYRatio","railYHeight","scrollbarYHeight","contentHeight","../../lib/dom","../../lib/helper","12","bindKeyboardHandler","hovered","focused","shadowRoot","scrollbarYActive","scrollbarXActive","13","bindMouseWheelHandler","shouldPrevent","mousewheelHandler","wheelDeltaX","wheelDeltaY","deltaMode","shouldBeConsumedByChild","maxScrollTop","maxScrollLeft","onwheel","onmousewheel","14","15","bindSelectionHandler","scrollingLoop","scrollDiff","getRangeAt","commonAncestorContainer","mousePosition","containerGeometry","16","bindTouchHandler","applyTouchMove","differenceX","differenceY","startOffset","easingLoop","inGlobalTouch","inLocalTouch","globalTouchStart","globalTouchEnd","getTouch","shouldHandle","MSPOINTER_TYPE_MOUSE","touchStart","touch","touchMove","timeGap","currentOffset","magnitudeX","magnitudeY","touchEnd","PointerEvent","MSPointerEvent","17","click-rail","drag-scrollbar","keyboard","wheel","nativeScrollHandler","userSettings","../lib/class","./handler/click-rail","./handler/drag-scrollbar","./handler/keyboard","./handler/mouse-wheel","./handler/native-scroll","./handler/selection","./handler/touch","./update-geometry","18","defaultSettings","Instance","originalScrollLeft","isRtl","isNegativeScroll","scrollbarXBottom","isScrollbarXUsingBottom","scrollbarXTop","railBorderXWidth","railXMarginWidth","scrollbarYRight","isScrollbarYUsingRight","scrollbarYLeft","scrollbarYOuterWidth","railBorderYWidth","railYMarginHeight","getId","newId","../lib/event-manager","../lib/guid","./default-setting","19","getThumbSize","thumbSize","xRailOffset","existingRails","rail","yRailOffset","./update-scroll","20","createDOMEvent","initEvent","lastTop","lastLeft","21","DataTable","_intVal","integer","_isNumber","decimalPoint","formatted","strType","_empty","_numToDecimal","_re_formatted_numeric","_htmlNumeric","_re_html","_pluck_order","prop2","ien","_range","_removeEmpty","_includes","_ext","_api_register","_api_registerPlural","sSelector","oOpts","api","_Api","_fnSettingsFromNode","iApiIndex","fnAddData","redraw","draw","fnAdjustColumnSizing","bRedraw","oScroll","sX","sY","_fnScrollDraw","fnClearTable","fnClose","nTr","fnDeleteRow","aoData","fnDestroy","fnDraw","fnFilter","sInput","iColumn","bRegex","bSmart","bShowGlobal","bCaseInsensitive","fnGetData","fnGetNodes","iRow","fnGetPosition","columnVisible","fnIsOpen","isShown","fnOpen","mHtml","sClass","fnPageChange","mAction","page","fnSetColumnVis","iCol","bShow","fnSettings","fnSort","aaSort","fnSortListener","nNode","fnCallback","fnUpdate","mData","mRow","bAction","fnVersionCheck","_that","emptyInit","oApi","internal","ext","_fnExternApiFunc","oInit","_fnExtend","sId","bInitHandedOff","$this","_fnLog","_fnCompatOpts","_fnCompatCols","_fnCamelToHungarian","allSettings","iLen","nTable","nTHead","nTFoot","bRetrieve","bDestroy","oInstance","sTableId","_unique","aoColumnsInit","oSettings","models","sDestroyWidth","sInstance","oClasses","dataTable","_fnLanguageCompat","oLanguage","aLengthMenu","iDisplayLength","_fnMap","oFeatures","_fnCallbackReg","fnDrawCallback","fnServerParams","fnStateSaveParams","fnStateLoadParams","fnStateLoaded","fnRowCallback","fnCreatedRow","fnHeaderCallback","fnFooterCallback","fnInitComplete","fnPreDrawCallback","rowIdFn","_fnGetObjectDataFn","rowId","_fnBrowserDetect","sTable","iInitDisplayStart","iDisplayStart","_iDisplayStart","iDeferLoading","bDeferLoading","_iRecordsDisplay","_iRecordsTotal","stripeClasses","sUrl","_fnCallbackFire","_fnInitialise","asStripeClasses","sStripeOdd","sStripeEven","rowOne","anThs","asDestroyStripes","nThead","_fnDetectHeader","aoHeader","_fnGetUniqueThs","aoColumns","_fnAddColumn","_fnApplyColumnDefs","aoColumnDefs","oDef","_fnColumnOptions","features","loadedInit","aaSorting","asSorting","_fnSortingClasses","bSort","aSort","sortedColumns","bSorted","_fnSortFlatten","_fnSortAria","_fnDataSource","bDeferRender","captions","_captionSide","nTBody","sNoFooter","aoFooter","aaData","_fnAddData","_fnAddTr","aiDisplay","aiDisplayMaster","bInitialised","_fnSaveState","bStateSave","_fnLoadState","_re_dic","_re_new_lines","_re_date","_re_escape_regex","_fnEscapeRegex","_pluck","_areAllUnique","sorted","again","_flatten","_fnHungarianMap","newKey","_hungarianMap","user","force","hungarianKey","decimal","defaultDecimal","sDecimal","_addNumericSort","zeroRecords","sZeroRecords","sEmptyTable","sLoadingRecords","sInfoThousands","sThousands","util","freq","frequency","escapeRegex","meta","arrayNotation","funcNotation","innerSrc","_fnSplitObjNotation","aLast","__reArray","__reFn","jLen","fetchData","_fnCompatMap","knew","sScrollX","scrollX","searchCols","aoSearchCols","oSearch","dataSort","aDataSort","browser","__browser","barWidth","bScrollOversize","bScrollbarLeft","bBounding","oBrowser","iBarWidth","_fnReduce","isSet","nTh","oDefaults","oCol","oColumn","sTitle","aoPreSearchCols","oOptions","attrTest","mDataSrc","sWidthOrig","mDataProp","sType","_sManualType","iDataSort","mRender","bAsc","_bAttrSrc","_setter","rowData","innerData","fnSetData","_fnSetObjectDataFn","_rowReadObject","bSortable","sSortableNone","bDesc","sSortingClass","sSortableAsc","sSortingClassJUI","sSortJUIAscAllowed","sSortableDesc","sSortJUIDescAllowed","sSortable","sSortJUI","_fnAdjustColumnSizing","bAutoWidth","_fnCalculateColumnWidths","sWidth","_fnVisibleToColumnIndex","iMatch","aiVis","_fnGetColumns","_fnColumnIndexToVisible","iPos","_fnVisbleColumns","vis","bVisible","sParam","_fnColumnTypes","jen","ken","detectedType","detect","_fnGetCellData","aoColDefs","aoCols","kLen","aTargets","aDataIn","anTds","oData","oRow","_aData","aIds","_fnCreateTr","trs","_fnGetRowElements","cells","rowIdx","colIdx","iDraw","defaultContent","sDefaultContent","cellData","iDrawError","fomatters","_fnSetCellData","_fnGetDataMaster","_fnClearTable","_fnDeleteIndex","iTarget","iTargetIndex","_fnInvalidate","cellWrite","anCells","_aSortData","_aFilterData","_fnRowAttributes","cellProcess","objectRead","tds","rowNode","nTrIn","nTd","_DT_RowIndex","sCellType","_DT_CellIndex","fnCreatedCell","DT_RowClass","__rowc","DT_RowAttr","DT_RowData","_fnBuildHead","createHeader","iTabIndex","_fnSortAttachListener","_fnRenderer","sHeaderTH","sFooterTH","nTf","_fnDrawHead","aoSource","bIncludeHidden","nLocalTr","iRowspan","iColspan","aoLocal","aApplied","iColumns","_fnDraw","ajaxComplete","bServerSide","fnRecordsDisplay","aPreDraw","_fnProcessingDisplay","anRows","iRowCount","iStripes","oLang","iDisplayEnd","fnDisplayEnd","bDrawing","bDestroying","_fnAjaxUpdate","iEnd","sStripe","iDataIndex","nRow","_sRowStripe","sZero","fnRecordsTotal","valign","colSpan","sRowEmpty","bFiltered","_fnReDraw","holdPosition","bFilter","_fnSort","_fnFilterComplete","oPreviousSearch","_drawHold","_fnAddOptionsHtml","featureNode","cOption","nNewNode","cNext","sAttr","aanFeatures","holding","sWrapper","aDom","nHolding","nTableWrapper","nTableReinsertBefore","sDom","sJUIHeader","sJUIFooter","aSplit","bPaginate","bLengthChange","_fnFeatureHtmlLength","_fnFeatureHtmlFilter","bProcessing","_fnFeatureHtmlProcessing","_fnFeatureHtmlTable","bInfo","_fnFeatureHtmlInfo","_fnFeatureHtmlPaginate","feature","aoFeatures","cFeature","fnInit","aLayout","nCell","iColShifted","bUnique","nTrs","nHeader","aReturn","bSortCellsTop","_fnBuildAjax","_fnAjaxDataSrc","sError","ajaxData","baseAjax","newData","sServerMethod","thrown","oAjaxData","fnServerData","sAjaxSource","_fnAjaxParameters","_fnAjaxUpdateDraw","dataProp","columnSearch","preSearch","preColSearch","displayStart","displayLength","_iDisplayLength","sSearch","sName","searchable","bSearchable","orderable","legacy","compat","modern","recordsTotal","recordsFiltered","_bInitComplete","_fnInitComplete","write","dataSrc","sAjaxDataProp","searchFn","previousSearch","return","tableId","sFilterInput","sFilter","searchDelay","jqFilter","sSearchPlaceholder","_fnThrottle","oInput","iForce","fnSaveFilter","oFilter","oPrevSearch","fnRegex","bEscapeRegex","aoPrevSearch","_fnFilter","_fnFilterColumn","_fnFilterCustom","displayRows","smart","rpSearch","_fnFilterCreateSearch","invalidated","prevSearch","displayMaster","_fnFilterData","_sFilterRow","word","__filter_div","__filter_div_textContent","filterData","wasInvalidated","_fnSearchToCamel","_fnSearchToHung","tid","sInfo","aoDrawCallback","_fnUpdateInfo","sInfoEmpty","sInfoFiltered","_fnInfoMacros","sInfoPostFix","fnInfoCallback","formatter","fnFormatNumber","iAjaxStart","deferLoading","_fnStringToCss","aData","_fnLengthChange","_fnLengthOverflow","lengths","aria-controls","sLengthSelect","sLength","sLengthMenu","sPaginationType","plugin","pager","sPaging","visRecords","pages","_fnPageChange","sProcessing","captionSide","footerClone","footer","scrollHead","scrollBody","scrollFoot","headerClone","_div","sScrollWrapper","sScrollHead","sScrollHeadInner","box-sizing","sXInner","sScrollBody","sScrollFoot","sScrollFootInner","bCollapse","nScrollHead","nScrollBody","nScrollFoot","zeroOut","nSizer","borderTopWidth","borderBottomWidth","headerSrcEls","footerSrcEls","correction","scrollXInner","divHeader","divHeaderStyle","divHeaderInner","divHeaderInnerStyle","divHeaderTable","divBodyEl","divBody","divBodyStyle","divFooterInner","divFooterTable","tableEl","tableStyle","ie67","headerWidths","footerWidths","footerContent","scrollBarVis","footerCopy","footerTrgEls","headerCopy","headerTrgEls","_fnApplyToChildren","sanityWidth","nToSize","iOuterWidth","bScrolling","an1","an2","nNode1","nNode2","__re_html_remove","columnIdx","visibleColumns","headerCells","tableWidthAttr","tableContainer","userInputs","styleWidth","_fnConvertToWidth","tmpTable","_fnGetWidestNode","sContentPadding","holder","bounding","_reszEvt","bindResize","_fnGetMaxLenString","maxIdx","nestedSort","srcCol","fixed","aaSortingFixed","fixedObj","sortCol","aiOrig","oExtSort","_fnSortData","dataA","dataB","oAria","ariaTitle","sSortAscending","sSortDescending","_fnSortListener","nextSortIdx","bSortMulti","sortIdx","_fnBindAction","oldSort","aLastSort","sortClass","sSortColumn","bSortClasses","customData","customSort","sSortDataType","_bLoadingState","oSavedState","fnStateSaveCallback","fnStateLoadCallback","_fnImplementState","Api","abStateLoad","iStateDuration","oLoadedState","tn","sErrMode","errMode","alert","mappedName","extender","breakRefs","sStore","callbackArr","__table_selector","__reload","_selector_run","selectFn","selectorType","_selector_opts","_selector_first","inst","__details_add","ctx","addRow","created","_details","_detailsShow","__details_display","__details_events","drawEvent","colvisEvent","destroyEvent","__details_remove","__details_state","__columnData","r1","r2","__apiStruct","__arrayProto","ctxSettings","mixed","_selector_row_indexes","alwaysNew","apiInst","apiSelector","pluck","to$","toJQuery","__dt_wrapper","struct","struc","methodExt","propExt","heir","registerPlural","pluralName","singularName","recordsDisplay","serverSide","resetPaging","displayFiltered","displayFilteredMap","selInt","cellIdx","rowObj","thatIdx","loopRow","loopCells","newRows","modRows","idFn","childRows","_child_obj","_child_mth","__re_column_selector","extPagination","visColumns","jqResult","__setColumnVis","rowSelector","columnSelector","allCells","fnSelector","internalOpts","cellsNoOpts","caseInsen","versionCheck","iThis","iThat","aThis","aThat","isDataTable","fnIsDataTable","foot","fnTables","camelToHungarian","jqRows","jqTable","jqTbody","jqWrapper","removedMethod","arg4","plural","bScrollCollapse","toFormat","sessionStorage","localStorage","getItem","setItem","oPaginate","sFirst","sLast","sNext","sPrevious","sScrollXInner","sScrollY","aoRowCallback","aoHeaderCallback","aoFooterCallback","aoRowCreatedCallback","aoPreDrawCallback","aoInitComplete","aoStateSaveParams","aoStateLoadParams","aoStateLoaded","aoOpenRows","aoStateSave","aoStateLoad","aoServerParams","aoDestroyCallback","paginate","oPlugins","builder","pageButton","oJUIClasses","sVersion","afnFiltering","aTypes","ofnSearch","oSort","afnSortData","oStdClasses","oPagination","sPageButton","sPageButtonActive","sPageButtonDisabled","sSortAsc","sSortDesc","sSortJUIAsc","sSortJUIDesc","sSortJUIWrapper","sSortIcon","_numbers","numbers_length","half","DT_el","simple_numbers","full_numbers","first_last_numbers","disabledClass","clickHandler","btnDisplay","btnClass","aria-label","aria","data-dt-idx","activeEl","__numericReplace","decimalPlace","re1","re2","num-fmt","html-num","html-num-fmt","date-pre","html-pre","string-pre","string-asc","string-desc","jqueryui","__htmlEscapeEntities","thousands","precision","postfix","negative","flo","intPart","floatPart","_fnNodeToDataIndex","_fnNodeToColumnIndex","_fnCalculateEnd","dataTableSettings","dataTableExt","DTRendererFactory","DTRendererService","DTPropertyUtil","compileDirective","ControllerDirective","dtOptions","dtColumns","dtColumnDefs","datatable","dtInstance","tElm","_staticHTML","$elem","handleChanges","buildOptionsPromise","watchFunction","dtDisableDeepWatchers","tableDefField","showLoading","_dtInstance","_setDTInstance","languageDefer","languageUrl","deleteProperty","resolveObjectPromises","optionsPromise","staticHTML","preRender","isNgDisplay","_renderer","withOptions","fromOptions","dtColumnDefBuilder","DTColumnBuilder","newColumnDef","DTColumn","dtLoadingTemplate","DTDefaultOptions","DT_LOADING_CLASS","compileHtml","loadingTemplate","isLoading","dtRendererService","DTLoadingTemplate","plugins","rendererService","$loading","hideLoading","renderDataTable","dtId","DT","dt","postRender","hideLoadingAndRenderDataTable","registerPlugin","dtDefaultRenderer","DTRenderer","DTInstanceFactory","_oTable","_$elem","newDTInstance","copyDTProperties","reloadData","changeData","rerender","dtNGRenderer","_parentScope","_newParentScope","_alreadyRendered","_expression","_match","_ngRepeatAttr","_destroyAndCompile","ngDestroy","dtPromiseRenderer","_loadedPromise","fnPromise","_redrawRows","_startLoading","dtAjaxRenderer","DT_DEFAULT_OPTIONS","dtRendererFactory","DTDefaultRenderer","DTNGRenderer","DTPromiseRenderer","DTAjaxRenderer","dtPropertyUtil","overrideProperties","resolveArrayPromises","excludedPropertiesName","resolvedObj","excludedProp","resolveArray","DTOptions","withOption","withSource","withDataProp","withFnServerData","withPaginationType","withLanguage","withLanguageSource","languageSource","withDisplayLength","withFnPromise","withDOM","fromSource","fromFnPromise","withTitle","withClass","notVisible","notSortable","renderWith","newColumn","DTInstance","bJUI","bootstrapOptions","setLoadingTemplate","setLanguageSource","sLanguageSource","setLanguage","setDisplayLength","setBootstrapOptions","oBootstrapOptions","setDOM","setOption","dtBootstrapColVis","DTBootstrapDefaultOptions","_initializedColVis","integrate","addDrawCallbackFunction","colVisProperties","ColVis","masterButton","deIntegrate","dtBootstrapConfig","dtOptionsBuilderDecorator","_decorateOptions","withBootstrap","hasBootstrap","withBootstrapOptions","initBootstrapPlugin","DTBootstrap","dtBootstrap","DTBootstrapTableTools","DTBootstrapColVis","_initialized","_drawCallbackFunctionList","_savedFn","fnPagingInfo","TableTools","oTags","DEFAULTS","iStart","iLength","iTotal","iFilteredTotal","iPage","iTotalPages","paginationClasses","pagination","$paginationContainer","$paginationBtn","_addDrawCallbackFunction","dtBootstrapDefaultOptions","DT_BOOTSTRAP_DEFAULT_OPTIONS","dtBootstrapTableTools","_initializedTableTools","tableToolsOptions","normal","liner","dtColReorderConfig","withColReorder","hasColReorder","withColReorderOption","oColReorder","withColReorderOrder","aiOrder","withColReorderCallback","fnReorderCallback","dtColumnFilterConfig","withColumnFilter","columnFilterOptions","hasColumnFilter","initColumnFilterPlugin","columnFilter","dtLightColumnFilterConfig","withLightColumnFilter","lightColumnFilterOptions","hasLightColumnFilter","initLightColumnFilterPlugin","ColumnFilter","dtColVisConfig","withColVis","hasColVis","withColVisOption","oColVis","withColVisStateChange","fnStateChange","dtFixedColumnsConfig","withFixedColumns","fixedColumnsOptions","fixedColumns","dtFixedHeaderConfig","withFixedHeader","fixedHeaderOptions","hasFixedHeader","initFixedHeaderPlugin","FixedHeader","dtScrollerConfig","withScroller","dtTableToolsConfig","withTableTools","sSwfPath","hasTableTools","withTableToolsOption","oTableTools","withTableToolsButtons","aButtons","dtButtonsConfig","withButtons","buttonsOptions","initButtonsPlugin","buttonsTmp","dtSelectConfig","withSelect","selectOptions","d3_arraySlice","d3_array","d3_document","d3_documentElement","d3_window","d3_element_prototype","Element","d3_element_setAttribute","d3_element_setAttributeNS","setAttributeNS","d3_style_prototype","CSSStyleDeclaration","d3_style_setProperty","space","d3_ascending","d3_number","d3_numeric","d3_bisector","lo","hi","mid","ascending","extent","sum","mean","quantile","median","variance","deviation","d3_bisect","d3_transposeLength","bisectLeft","bisect","bisectRight","bisector","shuffle","i0","i1","permute","indexes","permutes","pairs","transpose","matrix","zip","arrays","d3_class","d3_Map","d3_map_proto","d3_map_zero","d3_map_escape","d3_map_unescape","d3_map_has","d3_map_remove","d3_map_keys","d3_map_size","d3_map_empty","d3_Set","d3_identity","d3_vendorSymbol","d3_vendorPrefixes","prefixName","nest","sortValues","rollup","sortKeys","mapType","valuesByKey","sortKey","keyMap","behavior","rebind","d3_noop","d3_dispatch","d3_dispatch_event","listenerByName","z","d3_eventPreventDefault","d3_eventSource","sourceEvent","d3_eventDispatch","of","thiz","argumentz","e0","requote","d3_requote_re","d3_subclass","__proto__","d3_selection","d3_selectionPrototype","d3_select","d3_selectAll","d3_selectMatches","d3_selectMatcher","d3_selection_selector","d3_selection_selectorAll","subgroup","subnode","subgroups","__data__","selectAll","d3_nsXhtml","d3_nsPrefix","xhtml","xlink","xmlns","d3_selection_attr","ns","qualify","removeAttributeNS","d3_collapse","d3_selection_classedRe","d3_selection_classes","d3_selection_classed","d3_selection_classedName","d3_selection_style","d3_selection_property","d3_selection_creator","createElementNS","namespaceURI","d3_selectionRemove","d3_selection_dataNode","d3_selection_filter","d3_selection_each","d3_selection_enter","d3_selection_enterPrototype","getAttributeNS","classed","groupData","nodeData","n0","updateNodes","enterNodes","exitNodes","nodeByKeyValue","keyValues","exit","datum","d3_selection_on","d3_selection_onListener","d3_selection_onFilters","d3_selection_onFilter","upgroup","j0","d3_event_dragSelect","d3_event_dragId","d3_event_dragSuppress","suppressClick","mouse","d3_mousePoint","d3_mouse_bug44083","ownerSVGElement","createSVGPoint","ctm","getScreenCTM","matrixTransform","inverse","d3_behavior_dragTouchId","dragstart","subject","dragOffset","correspondingElement","dragged","dragId","dragName","dragSubject","position1","position0","dragRestore","ε","ε2","π","τ","τε","halfπ","d3_radians","d3_degrees","d3_sgn","d3_cross2d","d3_acos","acos","d3_asin","asin","d3_cosh","d3_haversin","sin","d3_behavior_zoomDelta","d3_behavior_zoomWheel","ρ","SQRT2","d3_behavior_zoomInfinity","interpolateZoom","p0","r0","S","ux0","uy0","w0","ux1","uy1","w1","b0","b1","coshr0","translate0","center0","mousewheelTimer","touchtime","x0","x1","y0","y1","scaleExtent","zooming","mousemove","mouseup","g","mousedowned","mousewheeled","dblclicked","touchstarted","scaleTo","translateTo","zoomTo","__chart__","zoomstarted","zoomed","zoomended","location0","d3_selection_interrupt","scale0","locations0","distance0","zoomName","touchmove","touchend","relocate","started","moved","ended","LN2","q","l1","scale1","l0","distance1","view1","d3_transitionInheritId","cx","cy","d3_color","d3_hsl","d3_rgb_parse","d3_rgb_hsl","rgb","d3_hslPrototype","hsl","d3_hsl_rgb","m1","m2","vv","d3_rgb","d3_hcl","d3_lab_hcl","d3_lab","d3_rgb_lab","brighter","darker","d3_hclPrototype","hcl","d3_hcl_lab","d3_lab_K","lab","d3_lab_X","d3_lab_Y","d3_lab_Z","d3_labPrototype","d3_lab_rgb","d3_xyz_rgb","d3_lab_xyz","atan2","d3_xyz_lab","d3_rgbNumber","d3_rgbString","d3_rgbPrototype","d3_rgb_hex","d3_rgb_parseNumber","d3_rgb_names","d3_rgb_xyz","aliceblue","antiquewhite","aqua","aquamarine","azure","beige","bisque","black","blanchedalmond","blueviolet","burlywood","cadetblue","chartreuse","chocolate","coral","cornflowerblue","cornsilk","crimson","darkblue","darkcyan","darkgoldenrod","darkgray","darkgreen","darkgrey","darkkhaki","darkmagenta","darkolivegreen","darkorange","darkorchid","darkred","darksalmon","darkseagreen","darkslateblue","darkslategray","darkslategrey","darkturquoise","darkviolet","deeppink","deepskyblue","dimgray","dimgrey","dodgerblue","firebrick","floralwhite","forestgreen","fuchsia","gainsboro","ghostwhite","gold","goldenrod","gray","greenyellow","honeydew","hotpink","indianred","ivory","khaki","lavender","lavenderblush","lawngreen","lemonchiffon","lightblue","lightcoral","lightcyan","lightgoldenrodyellow","lightgray","lightgreen","lightgrey","lightpink","lightsalmon","lightseagreen","lightskyblue","lightslategray","lightslategrey","lightsteelblue","lightyellow","limegreen","linen","magenta","maroon","mediumaquamarine","mediumblue","mediumorchid","mediumpurple","mediumseagreen","mediumslateblue","mediumspringgreen","mediumturquoise","mediumvioletred","midnightblue","mintcream","mistyrose","moccasin","navajowhite","navy","oldlace","olive","olivedrab","orangered","orchid","palegoldenrod","palegreen","paleturquoise","palevioletred","papayawhip","peachpuff","peru","plum","powderblue","rebeccapurple","rosybrown","royalblue","saddlebrown","salmon","sandybrown","seagreen","seashell","sienna","silver","skyblue","slateblue","slategray","slategrey","snow","springgreen","steelblue","tan","thistle","tomato","turquoise","violet","wheat","white","whitesmoke","yellowgreen","d3_functor","d3_xhrType","d3_xhr","respond","XDomainRequest","onprogress","beforesend","functor","dsv","reFormat","delimiterCode","typedResponse","formatRow","formatValue","parseRows","eol","EOL","EOF","N","I","fieldSet","fields","formatRows","csv","tsv","d3_timer_queueHead","d3_timer_queueTail","d3_timer_interval","d3_timer_timeout","d3_timer_frame","d3_timer","d3_timer_step","d3_timer_mark","d3_timer_sweep","t0","d3_format_precision","LN10","d3_formatPrefixes","symbol","formatPrefix","d3_format_re","d3_format_types","X","toPrecision","toExponential","d3_format_typeDefault","d3_time","d3_date","d3_date_utc","getUTCHours","getUTCMilliseconds","getUTCSeconds","d3_time_prototype","setUTCDate","setDay","setUTCDay","setMilliseconds","setUTCMilliseconds","setUTCMonth","setSeconds","setUTCSeconds","d3_time_interval","d0","times","d3_time_interval_utc","d3_locale_timeFormat","locale_dateTime","dateTime","locale_date","locale_time","locale_periods","periods","locale_days","locale_shortDays","locale_months","locale_shortMonths","d3_time_format","d3_time_formatPads","d3_time_formats","d3_time_parse","localZ","U","d3_time_parsers","multi","d3_time_formatMulti","d3_time_periodLookup","d3_time_dayRe","d3_time_formatRe","d3_time_dayLookup","d3_time_formatLookup","d3_time_dayAbbrevRe","d3_time_dayAbbrevLookup","d3_time_monthRe","d3_time_monthLookup","d3_time_monthAbbrevRe","d3_time_monthAbbrevLookup","A","B","d3_time_formatPad","sundayOfYear","mondayOfYear","d3_time_zone","%","d3_time_parseDay","d3_time_parseHour24","d3_time_parseDayOfYear","d3_time_parseMilliseconds","d3_time_parseMonthNumber","d3_time_parseMinutes","d3_time_parseSeconds","d3_time_parseWeekNumberSunday","d3_time_parseWeekdayNumber","d3_time_parseWeekNumberMonday","d3_time_parseYear","d3_time_parseFullYear","d3_time_parseZone","d3_time_parseLiteralPercent","sunday","-","d3_time_numberRe","d3_time_percentRe","fill","zs","zh","zm","numberFormat","locale_decimal","locale_thousands","locale_grouping","grouping","locale_currency","currency","formatGroup","specifier","align","zfill","comma","zcomma","fullSuffix","d3_locale_enUS","d3_adder","geo","d3_adderSum","d3_adderTemp","bv","d3_geo_streamGeometry","geometry","d3_geo_streamGeometryType","stream","d3_geo_streamObjectType","Feature","FeatureCollection","Sphere","sphere","Point","coordinates","MultiPoint","LineString","d3_geo_streamLine","MultiLineString","Polygon","d3_geo_streamPolygon","MultiPolygon","GeometryCollection","geometries","coordinate","lineStart","lineEnd","polygonStart","polygonEnd","area","d3_geo_areaSum","d3_geo_area","λ0","φ0","λ1","φ1","λ_","λ__","φ__","dλSum","ranges","bound","d3_geo_centroidW0","d3_geo_centroidW1","d3_geo_centroidX0","d3_geo_centroidY0","d3_geo_centroidZ0","d3_geo_centroidX1","d3_geo_centroidY1","d3_geo_centroidZ1","d3_geo_centroidX2","d3_geo_centroidY2","d3_geo_centroidZ2","d3_geo_areaRingSum","d3_geo_areaRingStart","λ00","φ00","cosφ0","sinφ0","nextPoint","λ","φ","dλ","sdλ","adλ","cosφ","sinφ","d3_geo_cartesian","spherical","d3_geo_cartesianDot","d3_geo_cartesianCross","d3_geo_cartesianAdd","d3_geo_cartesianScale","vector","d3_geo_cartesianNormalize","d3_geo_spherical","cartesian","d3_geo_sphericalEqual","linePoint","inflection","λi","antimeridian","φi","angle","ringPoint","ringStart","ringEnd","compareRanges","withinRange","best","centroid","d3_geo_centroid","d3_geo_centroidPoint","d3_geo_centroidLineStart","d3_geo_centroidLineEnd","d3_geo_centroidRingStart","d3_geo_centroidPointXYZ","z0","cz","d3_geo_compose","compose","d3_true","d3_geo_clipPolygon","clipStartInside","clip","d3_geo_clipPolygonIntersection","d3_geo_clipPolygonLinkCircular","isSubject","points","d3_geo_clip","pointVisible","clipLine","clipStart","rotatedClipStart","pointRing","polygon","meridian","parallel","meridianNormal","polarAngle","winding","ring","point0","arc","intersection","φarc","polygonStarted","d3_geo_clipSort","pointLine","d3_geo_clipBufferListener","ringListener","clean","ringSegments","d3_geo_clipSegmentLength1","rejoin","d3_geo_clipAntimeridian","sλ0","cosφ1","sinλ0_λ1","sλ1","atan","d3_geo_clipCircle","cr","smallRadius","notHemisphere","c0","v0","v00","point2","point1","intersect","d3_geo_circleInterpolate","two","δλ","polar","q1","n1","n2","n2n2","n1n2","determinant","n1xn2","t2","uu","d3_geom_clipLine","ax","ay","d3_geo_clipExtentMAX","d3_geo_clipExtent","x__","y__","v__","x_","y_","v_","listener_","bufferListener","wn","inside","corner","comparePoints","ca","d3_geo_conic","projectAt","d3_geo_projectionMutator","parallels","d3_geo_conicEqualArea","C","ρ0","ρ0_y","clipExtent","valid","conicEqualArea","albers","albersUsa","lower48Point","alaskaPoint","hawaiiPoint","lower48","alaska","hawaii","pointStream","lower48Stream","alaskaStream","hawaiiStream","d3_geo_pathAreaSum","d3_geo_pathAreaPolygon","d3_geo_pathBoundsX0","d3_geo_pathBoundsY0","d3_geo_pathBoundsX1","d3_geo_pathBoundsY1","d3_geo_pathArea","d3_geo_pathAreaRingStart","x00","y00","d3_geo_pathBounds","d3_geo_pathBuffer","pointCircle","d3_geo_pathBufferCircle","pointLineStart","lineEndPolygon","d3_geo_lengthSum","d3_geo_pathCentroid","d3_geo_pathCentroidPoint","d3_geo_pathCentroidLineStart","d3_geo_pathCentroidLineEnd","d3_geo_pathCentroidRingStart","d3_geo_pathContext","moveTo","lineTo","closePath","d3_geo_resample","project","δ2","cosMinDistance","resample","resampleRecursive","resampleNone","d3_geo_transformPoint","a00","b00","c00","a0","resampleLineTo","c1","λ2","x2","dx2","dy2","dz","φ2","d3_geo_transform","d3_geo_projection","projectRotate","δx","δy","projectResample","δφ","δγ","preclip","postclip","clipAngle","projection","d3_geo_rotation","invalidate","d3_geo_projectionRadians","d3_geo_equirectangular","d3_geo_identityRotation","d3_geo_rotationλ","d3_geo_rotationφγ","d3_geo_forwardRotationλ","cosδφ","sinδφ","cosδγ","sinδγ","sr","d3_geo_circleAngle","d3_geo_graticuleX","d3_geo_graticuleY","d3_source","d3_target","projectStream","contextStream","cacheStream","projectionMutator","equirectangular","circle","Δλ","sinΔλ","cosΔλ","sinφ1","graticule","X1","X0","Y1","Y0","DX","DY","majorExtent","minorExtent","majorStep","minorStep","greatArc","source_","target_","cy0","sy0","cy1","sy1","kx0","ky0","kx1","ky1","d3_geo_length","d3_geo_azimuthal","azimuthal","cosλ","sinc","cosc","d3_geo_azimuthalEqualArea","cosλcosφ","d3_geo_azimuthalEquidistant","azimuthalEqualArea","d3_geo_conicConformal","F","d3_geo_mercator","d3_geo_conicEquidistant","azimuthalEquidistant","conicConformal","conicEquidistant","d3_geo_gnomonic","d3_geo_mercatorProjection","clipAuto","gnomonic","mercator","d3_geo_orthographic","d3_geo_stereographic","orthographic","d3_geo_transverseMercator","d3_geom_pointX","d3_geom_pointY","d3_geom_hullUpper","hull","hs","d3_geom_hullOrder","stereographic","transverseMercator","geom","vertices","fy","flippedPoints","upper","lower","skipLeft","skipRight","d3_geom_polygonPrototype","d3_geom_polygonInside","d3_geom_polygonIntersect","x3","x21","x43","y3","y21","y43","d3_geom_polygonClosed","d3_geom_voronoiEdges","d3_geom_voronoiCells","d3_geom_voronoiBeaches","d3_geom_voronoiFirstCircle","d3_geom_voronoiCircles","d3_geom_voronoiBeachPool","d3_geom_voronoiCirclePool","d3_geom_voronoiBeach","d3_geom_voronoiRedBlackNode","edge","site","d3_geom_voronoiCreateBeach","beach","d3_geom_voronoiDetachBeach","d3_geom_voronoiDetachCircle","d3_geom_voronoiAddBeach","lArc","rArc","dxl","directrix","d3_geom_voronoiLeftBreakPoint","dxr","P","R","lSite","bx","rSite","hb","hc","vertex","newArc","d3_geom_voronoiCreateEdge","d3_geom_voronoiAttachCircle","d3_geom_voronoiSetEdgeEnd","hl","aby2","rfocx","rfocy","pby2","lfocx","plby2","lfocy","d3_geom_voronoiCell","edges","d3_geom_voronoiCloseCells","iHalfEdge","halfEdges","nHalfEdges","iCell","d3_geom_voronoiHalfEdge","va","vb","d3_geom_voronoiEdge","d3_geom_voronoiHalfEdgeOrder","d3_geom_voronoiCircle","cSite","ha","d3_geom_voronoiClipEdges","lx","ly","rx","ry","fb","fm","d3_geom_voronoiRedBlackTree","d3_geom_voronoiRedBlackRotateLeft","d3_geom_voronoiRedBlackRotateRight","d3_geom_voronoiRedBlackFirst","d3_geom_voronoi","sites","bbox","d3_geom_voronoiVertexOrder","iArc","nArcs","disappearing","d3_geom_voronoiRemoveBeach","diagram","grandpa","uncle","voronoi","d3_geom_voronoiClipExtent","links","triangles","s0","s1","polygons","d3_geom_quadtreeCompatX","d3_geom_quadtreeCompatY","d3_geom_quadtreeNode","leaf","d3_interpolateRgb","ar","ag","ab","br","bg","bb","d3_interpolateObject","d3_interpolate","d3_interpolateNumber","d3_interpolateString","am","bm","bs","bi","d3_interpolate_numberA","d3_interpolate_numberB","delaunay","quadtree","ys","x1_","y1_","x2_","y2_","nx","ny","nPoint","insertChild","xm","ym","below","d3_geom_quadtreeVisit","sx","sy","minDistance2","distance2","closestPoint","interpolateRgb","interpolateObject","interpolateNumber","interpolateString","interpolators","d3_interpolateArray","na","nb","interpolateArray","d3_ease_default","d3_ease","poly","quad","d3_ease_quad","cubic","d3_ease_cubic","d3_ease_sin","d3_ease_exp","d3_ease_circle","elastic","back","bounce","d3_ease_bounce","d3_ease_mode","d3_ease_reverse","in-out","d3_ease_reflect","out-in","d3_ease_cubicInOut","t3","d3_interpolateRound","d3_transform","kx","d3_transformNormalize","kz","d3_transformDot","ky","skew","interpolateHcl","ah","ac","al","bh","bc","bl","interpolateHsl","interpolateLab","ba","interpolateRound","baseVal","consolidate","d3_transformIdentity","d3_interpolateTransformPop","d3_interpolateTransform","rb","ka","kb","ta","tb","ra","wa","wb","d3_uninterpolateNumber","d3_uninterpolateClamp","d3_layout_bundleAncestors","ancestors","d3_layout_forceDragstart","d3_layout_forceDragend","d3_layout_forceMouseover","px","py","d3_layout_forceMouseout","interpolateTransform","bundle","paths","lca","aNodes","bNodes","aNode","bNode","sharedNode","chord","chords","sortGroups","sortSubgroups","sortChords","relayout","groupSums","groupIndex","subgroupIndex","di","dj","subindex","startAngle","endAngle","resort","alpha","distances","strengths","charges","friction","linkDistance","d3_layout_forceLinkDistance","linkStrength","d3_layout_forceLinkStrength","charge","chargeDistance2","d3_layout_forceChargeDistance2","gravity","theta2","dragmove","weight","d3_layout_forceAccumulate","pointCharge","dw","dn","chargeDistance","theta","neighbors","candidates","d3_layout_hierarchyRebind","hierarchy","d3_layout_hierarchyLinks","d3_layout_hierarchyVisitBefore","d3_layout_hierarchyVisitAfter","nodes2","d3_layout_hierarchyChildren","d3_layout_hierarchyValue","d3_layout_hierarchySort","childs","revalue","partition","d3_layout_pieSortByValue","padAngle","da","pa","arcs","d3_layout_stackX","d3_layout_stackY","d3_layout_stackOut","d3_layout_stackOrderDefault","d3_layout_stackOffsetZero","series","orders","d3_layout_stackOrders","d3_layout_stackOffsets","inside-out","d3_layout_stackMaxIndex","sums","d3_layout_stackReduceSum","tops","bottoms","silhouette","wiggle","s2","s3","o0","zero","d3_layout_stackSum","d3_layout_histogramBinSturges","d3_layout_histogramBinFixed","d3_layout_histogramRange","d3_layout_packSort","d3_layout_packInsert","_pack_next","_pack_prev","d3_layout_packSplice","d3_layout_packIntersects","dr","d3_layout_packSiblings","xMin","xMax","yMin","yMax","d3_layout_packLink","d3_layout_packPlace","isect","d3_layout_packUnlink","dc","db","d3_layout_treeSeparation","d3_layout_treeLeft","d3_layout_treeRight","d3_layout_treemapPadNull","d3_layout_treemapPad","d3_scaleExtent","d3_scaleRange","rangeExtent","d3_scale_bilinear","uninterpolate","d3_scale_nice","nice","d3_scale_niceStep","d3_scale_niceIdentity","histogram","valuer","ranger","binner","bin","bins","pack","d3_layout_packTransform","separation","nodeSize","tx","root0","root1","node1","firstWalk","secondWalk","sizeNode","d3_layout_treeShift","midpoint","ancestor","vip","vop","vim","vom","sip","sop","sim","som","wm","wp","cluster","d3_layout_clusterLeft","d3_layout_clusterRight","treemap","stickies","pad","squarify","rmax","rmin","stickify","padConstant","µ","σ","logNormal","bates","irwinHall","d3_scale_polylinear","d3_scale_linearRebind","d3_scale_linearNice","d3_scale_linearTickRange","d3_scale_linearTicks","d3_scale_linearTickFormat","d3_scale_linearPrecision","d3_scale_linearFormatSignificant","d3_scale_linear","rangeRound","ticks","d3_scale_log","positive","niced","d3_scale_logNiceNegative","d3_scale_logFormat","d3_scale_powPow","d3_scale_pow","powp","powb","d3_scale_ordinal","rangeBand","steps","xi","rangePoints","rangeRoundPoints","rangeBands","outerPadding","rangeRoundBands","category10","d3_category10","category20","d3_category20","category20b","d3_category20b","category20c","d3_category20c","d3_zero","d3_scale_quantile","quantiles","invertExtent","quantize","d3_scale_quantize","d3_scale_threshold","d3_scale_identity","innerRadius","d3_svg_arcInnerRadius","outerRadius","d3_svg_arcOuterRadius","cornerRadius","padRadius","d3_svg_arcAuto","d3_svg_arcStartAngle","d3_svg_arcEndAngle","d3_svg_arcPadAngle","rc","rc0","rc1","t12","t21","cw","circleSegment","rp","d3_svg_arcSweep","h1","h0","oc","lc","t30","d3_svg_arcCornerTangents","t03","x01","y01","ox","oy","cx0","cx1","dx0","dy0","dx1","dy1","d3_svg_line","defined","d3_svg_lineLinear","interpolateKey","tension","d3_svg_lineInterpolators","linear-closed","d3_svg_lineLinearClosed","step-before","d3_svg_lineStepBefore","step-after","d3_svg_lineStepAfter","basis","d3_svg_lineBasis","basis-open","pi","d3_svg_lineDot4","d3_svg_lineBasisBezier3","d3_svg_lineBasisBezier","basis-closed","cardinal","d3_svg_lineHermite","d3_svg_lineCardinalTangents","cardinal-open","cardinal-closed","monotone","tangents","d3_svg_lineSlope","lp","d3_svg_lineBasisBezier1","d3_svg_lineBasisBezier2","d3_svg_lineRadial","d3_svg_area","interpolateReverse","points0","points1","fx0","fy0","fx1","fy1","d3_svg_chordRadius","d3_svg_diagonalProjection","d3_svg_symbolSize","d3_svg_symbolType","d3_svg_symbolCircle","radial","curve","diagonal","projection_","d3_svg_symbols","diamond","d3_svg_symbolTan30","square","triangle-down","d3_svg_symbolSqrt3","triangle-up","symbolTypes","d3_transitionId","d3_transitionNamespace","d3_transitionInherit","d3_transitionNode","d3_transition","interrupt","d3_selection_interruptNS","activeId","d3_transitionPrototype","d3_transition_tween","d3_transition_text","elapsed","cancelId","subnodes","nameNS","attrNull","attrNullNS","attrTween","styleNull","styleTween","inheritId","id0","id1","tickFormat_","orient","d3_svg_axisDefaultOrient","innerTickSize","outerTickSize","tickPadding","tickArguments_","tickTransform","tickEnter","tickExit","tickUpdate","tickSpacing","pathUpdate","lineEnter","lineUpdate","textEnter","textUpdate","d3_svg_axisX","d3_svg_axisY","d3_svg_axisOrients","tickSize","tickSubdivide","brush","xExtentDomain","yExtentDomain","xExtent","yExtent","xClamp","yClamp","resizes","d3_svg_brushResizes","brushstart","gUpdate","d3_svg_brushCursor","backgroundUpdate","redrawX","redrawY","eventTarget","event_","resizing","resizingX","resizingY","dragging","brushmove","move1","brushend","ey","extent1","extent0","yi","ne","se","sw","d3_time_formatUtc","d3_time_formatIso","d3_time_formatIsoNative","d3_time_scale","tickMethod","d3_time_scaleSteps","d3_time_scaleMilliseconds","d3_time_scaleDate","d3_time_scaleLocalMethods","d3_time_scaleLocalFormat","d3_time_scaleUtcMethods","d3_time_scaleUtcFormat","d3_json","d3_html","createContextualFragment","responseXML","nv","dev","charts","logs","oThis","fBound","fToBind","fNOP","aArgs","deprecated","render_start","renderLoop","graph","render_end","addGraph","fastdom","interactiveGuideline","_isInteractiveLayer","xScale","showGuideLine","svgContainer","isMSIE","layer","availableWidth","availableHeight","mouseHandler","d3mouse","mouseX","mouseY","subtractMargin","mouseOutAnyReason","nvPointerEventsClass","elementMouseout","renderGuideLine","pointXValue","elementMousemove","elementDblclick","elementClick","guideLine","NaNtoZero","interactiveBisect","searchVal","xAccessor","_xAccessor","nearestValueIndex","yDistMax","indexToHighlight","calcTooltipPosition","tooltipElem","tooltipTop","Elem","tooltipLeft","tLeft","tTop","windowWidth","windowSize","windowHeight","box","old_translate","new_translate","translateInterpolator","is_hidden","snapDistance","fixedTop","chartContainer","headerEnabled","isInteractiveLayer","valueFormatter","headerFormatter","keyFormatter","contentGenerator","trowEnter","highlight","opacityScale","nvtooltip","chartBound","containerBound","svgBoundTop","svgComp","svgOffset","svgBound","optionsFunc","initOptions","compatMode","windowResize","getColor","color_scale","defaultColor","customTheme","dictionary","getKey","defaultColors","defIndex","pjax","calcApproxTextWidth","svgTextElem","watchTransition","renderWatch","_duration","renderStack","__rendered","renderEnd","srcObj","_setState","_getState","calcTicksX","numTicks","numValues","stream_len","calcTicksY","initOption","_calls","_overrides","ops","getOwnPropertyNames","calls","inheritOptionsD3","oplist","_d3options","arrayUnique","symbolMap","inheritOptions","_inherited","d3ops","initSVG","nvd3-svg","sanitizeHeight","sanitizeWidth","noData","noDataText","axisLabelText","showMaxMin","rotateLabels","rotateYLabel","staggerLabels","isOrdinal","axisLabelDistance","axisMaxMin","maxMinRange","fmt","xLabelMargin","maxTextWidth","textHeight","xTicks","rotateLabelsRule","boxPlot","xDomain","yDomain","xRange","yRange","getX","getY","maxBoxWidth","box_left","box_width","box_right","yData","min_arr","Q1","whisker_low","outliers","max_arr","Q3","whisker_high","boxplots","boxEnter","elementMouseover","endpoint","Q2","yScale","boxPlotChart","boxplot","xAxis","showXAxis","showYAxis","rightAlignYAxis","beforeUpdate","gEnter","defsEnter","tooltips","tooltipContent","bullet","markers","measures","forceX","xp1","rangez","markerz","measurez","rangeLabelz","rangeLabels","markerLabelz","markerLabels","measureLabelz","measureLabels","rangeMin","rangeMax","rangeAvg","h3","markerData","bulletChart","bulletWrap","subtitle","candlestickBar","getOpen","getClose","getHigh","getLow","low","forceY","padData","clipEdge","interactive","wrapEnter","chartClick","tickGroups","highlightPoint","pointIndex","isHoverOver","clearHighlights","cumulativeLineChart","controls","interactiveLayer","showControls","useInteractiveGuideline","rescaleY","defaultState","average","noErrorCheck","updateState","indexDrag","updateZero","stateChange","seriesDomains","initialDomain","completeDomain","getAvgLineY","yVal","indexifyYGetter","indexValue","tempDisabled","interactivePointerEvents","controlsData","rightAlign","linesWrap","avgLineData","seriesIndex","avgLines","indexLine","oldDuration","_ticks","singlePoint","pointXLocation","allData","xValue","yValue","useVoronoi","discreteBar","showValues","rectClass","seriesData","bars","barsEnter","elementDblClick","discreteBarChart","discretebar","distribution","getData","naxis","distWrap","dist","furiousLegend","radioButtonMode","vers","setTextColor","disengaged","setBGColor","seriesShape","versPadding","seriesEnter","seriesText","legendMouseover","legendMouseout","legendClick","userDisabled","legendDblclick","seriesWidths","seriesPerRow","nodeTextLength","legendText","getComputedTextLength","legendWidth","columnWidths","xPositions","curX","xpos","ypos","newxpos","maxwidth","historicalBar","rval","historicalBarChart","bar_model","tooltipHide","ohlcBarChart","ohlcBar","candlestickBarChart","setBGOpacity","scatter","isArea","pointSize","pointDomain","scatterWrap","areaPaths","linePaths","lineChart","pointYValue","yPos","linePlusBarChart","y4","lines2","bars2","x2Axis","y1Axis","y2Axis","y3Axis","y4Axis","margin2","focusEnable","focusShowAxisY","focusShowAxisX","focusHeight","brushExtent","legendLeftAxisHint","legendRightAxisHint","availableHeight1","availableHeight2","dataBars","dataLines","series1","series2","focusEnter","contextEnter","bars2Wrap","legendXPosition","originalKey","lines2Wrap","brushBG","onBrush","brushBGenter","gBrush","leftWidth","rightWidth","focusBarsWrap","focusLinesWrap","lineWithFocusChart","height2","contextLinesWrap","currentValues","xTickFormat","yTickFormat","multiBar","stacked","stackOffset","hideable","barColor","groupSpacing","last_datalength","nonStackableCount","nonStackable","nonStackableSeries","posBase","negBase","exitTransition","barSelection","multiBarChart","controlWidth","multibar","controlLabels","reduceXTicks","getTranslate","totalInBetweenTicks","multiBarHorizontal","getYerr","yErr","valuePadding","xerr","yerr","multiBarHorizontalChart","multiChart","yDomain1","yDomain2","yScale1","yScale2","lines1","bars1","stack1","stackedArea","stack2","yAxis1","yAxis2","dataLines1","dataLines2","dataBars1","dataBars2","dataStack1","dataStack2","color_array","lines1Wrap","bars1Wrap","stack1Wrap","stack2Wrap","extraValue1","aVal","extraValue2","mouseover_line","yaxis","mouseover_stack","mouseover_bar","parallelCoordinates","dimensionNames","dimensionFormats","lineTension","missingValueslineText","axisDrag","__origin__","foreground","axisWithMissingValues","lineData","missingValuesline","dimensionsEnter","newscale","actives","extents","dim","labelsOutside","labelType","labelThreshold","growOnHover","titleOffset","labelSunbeamLayout","donutRatio","arcsRadius","arcsOver","arcsRadiusOuter","arcsRadiusInner","g_pie","arcOver","slices","pieLabels","ae","_current","labelsArc","rotateAngle","labelLocationHash","avgHeight","avgWidth","createHashKey","pieLabelsOutside","donutLabelsOutside","labelFormat","pieChart","pieWrap","timeoutID","getShape","forceSize","pointActive","notActive","padDataOuter","clipVoronoi","showVoronoi","clipRadius","sizeDomain","sizeRange","needsUpdate","_sizeRange_def","pointArray","pX","pY","pointPaths","vPointPaths","mouseEventCallback","mDispatch","pointScale","pointRange","forcePoint","pointShape","scatterChart","distX","distY","showDistX","showDistY","regWrap","regLine","intercept","slope","tooltipXContent","tooltipYContent","sparkline","yValues","maxPoint","sparklinePlus","paused","showLastValue","alignValue","rightAlignValue","sparklineWrap","updateValueLine","hoverValue","hoverEnter","closestIndex","dataRaw","dataFiltered","aseries","zeroArea","areaMouseover","areaMouseout","areaClick","d3_stackedOffset_stackPercent","stackData","stackedAreaChart","controlOptions","oldYTickFormat","oldValueFormatter","percentFormatter","stack_percent","currentFormat","tooltipValue","stackedValue","stackedY0","stackedY","sunburst","modes","stash","arcTweenZoom","xd","yd","yr","sunburstChart","sunWrap","nvd3Utils","extended","refreshDataOnly","deepWatchOptions","deepWatchData","deepWatchDataDepth","debounceImmediate","configureEvents","configureWrapper","enable","textAlign","wrapElement","dataWatchFn","oldData","updateWithOptions","refreshWithTimeout","updateWithTimeout","clearElement","chartType","updateWithData","configureStyles","with-3d-shadow","with-transitions","gallery","graphs","getScope","oldConfig","immediate","callNow","me","x_boundary","y_boundary","useFixedDomain","horizontalOff","verticalOff","unzoomEventType","fixDomain","d3zoom","unzoomed","zoomend","useNiceScale","boundary","domains","icon_set","blurElem","blurForm","activate","activationEvent","editableDirectiveFactory","inputTpl","inputDatePicker","buttonDatePicker","eDatepickerPopupXEditable","eIsOpen","eDateDisabled","eDatepickerPopup","eMinDate","eMaxDate","eYearRange","eShowButtonBar","eCurrentText","eClearText","eCloseText","eCloseOnDateSelection","eDatePickerAppendToBody","eName","dateOptions","formatDay","eFormatDay","formatMonth","eFormatMonth","formatYear","eFormatYear","formatDayHeader","eFormatDayHeader","formatDayTitle","eFormatDayTitle","formatMonthTitle","eFormatMonthTitle","showWeeks","eShowWeeks","startingDay","eStartingDay","minMode","eMinMode","maxMode","eMaxMode","initDate","eInitDate","datepickerMode","eDatepickerMode","eNgClick","inputEl","eNgChange","eTitle","autosubmit","$form","$submit","editableNgOptionsParser","useCopy","eNgOptions","editableCombodate","$data","combodate","getInstance","$widget","eNgDisabled","addListeners","single","rename","choices","linkOrg","matchEl","choicesEl","editableUtils","EditableController","editableThemes","editableIcons","editableOptions","valueGetter","inWaiting","editorEl","external","onshow","catchError","onhide","oncancel","onbeforesave","onaftersave","setLocalValue","handleEmpty","transferAttr","controlsEl","controlsTpl","buttonsEl","buttonsTpl","submitEl","submitTpl","cancelEl","cancelTpl","ok","errorEl","errorTpl","formTpl","noformTpl","nextLetter","camelToDash","postrender","$cancel","$visible","_clicked","setWaiting","onfocus","setSelectionRange","setError","noPromise","editableController","editableFormController","overwrites","eFormCtrl","eCtrl","hasForm","eSingle","eForm","forms","editDisabled","$editable","$addEditable","$$editableBuffer","eClickable","editable","$show","editablePromiseCollection","isBlur","shown","editables","$editables","isSelfOrDescendant","toCancel","toSubmit","$waiting","_blur","$hide","$removeEditable","pc","$onshow","$setError","onWait","$setWaiting","onTrue","$activate","onFalse","onString","$onhide","$oncancel","checkSelf","childrenTrue","$onbeforesave","$save","$onaftersave","editableForm","ngSubmit","hasFalse","hasString","applyCallback","dashToCamel","track","trackFn","Combodate","currentYear","minYear","maxYear","yearDescending","minuteStep","secondStep","firstItem","errorClass","customClass","roundTime","smartDays","combo","ampm","getTemplate","initCombos","fillCombo","setValue","$combo","fillCommon","relTime","fillDay","twoDigit","daysCount","$month","$year","leadZero","fillMonth","longNames","shortNames","fillYear","fillHour","h12","fillMinute","fillSecond","fillAmpm","ampmL","notSelected","$ampm","getNearest","$select","optValue","bs2","bs3","font-awesome","buttonsClass","inputClass","semantic","ie10plus","Flow","File","Blob","FileList","webkitSlice","mozSlice","supportDirectory","files","chunkSize","forceChunkSize","simultaneousUploads","singleFile","fileParameterName","progressCallbacksInterval","speedSmoothingFactor","changeRawDataBeforeSend","testMethod","uploadMethod","prioritizeFirstAndLastChunk","allowDuplicateUploads","testChunks","generateUniqueIdentifier","maxChunkRetries","chunkRetryInterval","permanentErrors","successStatuses","onDropStopPropagation","initFileFn","readFileFn","webAPIFileRead","onDrop","dataTransfer","webkitGetAsEntry","webkitReadDataTransfer","addFiles","preventEvent","FlowFile","flowObj","uniqueIdentifier","bytes","fileName","relativePath","webkitRelativePath","chunks","averageSpeed","currentSpeed","_lastProgressCallback","_prevUploadedSize","_prevProgress","fileObj","startByte","endByte","fileType","chunk","function_name","readFinished","FlowChunk","tested","retries","pendingRetry","preprocessState","readState","filename","computeEndByte","chunkEvent","progressHandler","lengthComputable","testHandler","uploadNextChunk","doneHandler","retryInterval","evalOpts","msPointerEnabled","fileReadSuccess","fullPath","decrement","readError","fileError","isFile","getAsFile","readDirectory","reader","readEntries","isDirectory","createReader","custom","preventEvents","outstanding","isComplete","assignBrowse","domNodes","assignDrop","unAssignDrop","isUploading","uploading","_shouldUploadNext","should","totalDone","totalSize","addFile","fileList","getFromUniqueIdentifier","removeFile","sizeUploaded","timeRemaining","sizeDelta","POSITIVE_INFINITY","measureSpeed","smoothingFactor","uploaded","timeSpan","bytesLoaded","getType","getExtension","getParams","flowChunkNumber","flowChunkSize","flowCurrentChunkSize","flowTotalSize","flowIdentifier","flowFilename","flowRelativePath","flowTotalChunks","getTarget","prepareXhrRequest","preprocessFinished","isTest","paramsMethod","blob","FormData","flow","flowFactory","catchAllHandler","filesSubmitted","fileSuccess","flowInit","flowObject","$flow","flowName","isSingleFile","inputAttrs","flowAttrs","dragEvent","fileDrag","flowDragEnter","flowDragLeave","flowDropEnabled","fileProgress","fileAdded","filesAdded","fileRetry","uploadStart","eventArgs","funcArgs","flowImg","fileReader","FileReader","readAsDataURL","transfers","isValue","ceil10","asHalfPixel","diffDomain","_typeof","notEmpty","c3_chart_internal_fn","dict","sanitise","getPathBox","pathSegList","c3_axis_internal_fn","chartLine","chartLines","chartBar","chartBars","chartText","chartTexts","chartArc","chartArcs","chartArcsTitle","chartArcsBackground","chartArcsGaugeUnit","chartArcsGaugeMax","chartArcsGaugeMin","selectedCircle","selectedCircles","eventRect","eventRects","eventRectsSingle","eventRectsMultiple","zoomRect","defocused","region","shapes","circles","areas","texts","gaugeValue","gridLines","xgrid","xgrids","xgridLine","xgridLines","xgridFocus","ygrid","ygrids","ygridLine","ygridLines","axisX","axisXLabel","axisY","axisYLabel","axisY2","axisY2Label","legendBackground","legendItem","legendItemEvent","legendItemTile","legendItemHidden","legendItemFocused","dragarea","EXPANDED","SELECTED","INCLUDED","AxisInternal","withOuterTick","tickArguments","tickOffset","tickTextCharSize","tickTextRotate","tickLength","generateAxis","generateTicks","copyScale","newScale","isCategory","textFormatted","updateRange","updateTickTextCharSize","transitionise","withoutTransition","isVertical","tspanData","splitted","splitTickText","spaceIndex","textWidth","tickText","tickWidth","subtext","updateTickLength","lineY2","tickPosition","textY","textTransform","textTextAnchor","tspanDx","tspanDy","tickX","tickY","tspanUpdate","isCentered","tickInterval","getTotalLength","c3_axis_fn","c3_chart_fn","Axis","inherits","subClass","superClass","Component","classCallCheck","_this","ReferenceError","setPrototypeOf","c3$1","$$","clipPathForXAxis","axis_x_show","axis_rotated","textAnchorForXAxisLabel","axis_y_inner","clipPathForYAxis","axis_y_show","textAnchorForYAxisLabel","axis_y2_show","textAnchorForY2AxisLabel","getXAxis","withoutRotateTickText","axisParams","isCategorized","axis_x_tick_multiline","axis_x_tick_width","axis_x_tick_rotate","isTimeSeries","axis_x_tick_centered","axis_x_tick_culling","updateXAxisTickValues","axis_x_tick_fit","axis_x_tick_count","generateTickValues","mapTargetsToUniqueXs","subXAxis","getYAxis","axis_y_tick_rotate","isTimeSeriesY","axis_y_tick_time_value","axis_y_tick_time_interval","data_axes","getXAxisTickFormat","defaultAxisTimeFormat","categoryName","axis_x_tick_format","axisTimeFormat","getTickValues","getXAxisTickValues","axis_x_tick_values","getYAxisTickValues","axis_y_tick_values","getY2AxisTickValues","axis_y2_tick_values","getLabelOptionByAxisId","axis_y_label","axis_y2_label","axis_x_label","getLabelText","getLabelPosition","defaultPosition","isInner","isOuter","isCenter","isTop","isMiddle","isBottom","getXAxisLabelPosition","getYAxisLabelPosition","getY2AxisLabelPosition","getLabelPositionById","textForXAxisLabel","textForYAxisLabel","textForY2AxisLabel","xForAxisLabel","forHorizontal","dxForAxisLabel","textAnchorForAxisLabel","xForXAxisLabel","xForYAxisLabel","xForY2AxisLabel","dxForXAxisLabel","dxForYAxisLabel","dxForY2AxisLabel","dyForXAxisLabel","getMaxTickWidth","axis_x_height","dyForYAxisLabel","dyForY2AxisLabel","axis_y2_inner","withoutRecompute","dummy","currentMaxTickWidths","targetsToShow","filterTargetsToShow","getYDomain","yOrient","axis_y_tick_format","yAxisTickValues","y2Orient","axis_y2_tick_format","y2AxisTickValues","getXDomain","xOrient","xAxisTickFormat","xAxisTickValues","updateLabels","withTransition","getPadding","domainLength","convertPixelsToAxisPadding","pixels","forTimeSeries","tickValue","targetCount","generateTransitions","axisSubX","subx","componentKey","Chart","ChartInternal","loadConfig","beforeInit","afterInit","bindThis","argThis","getDefaultConfig","initParams","data_url","convertUrlToData","data_mimeType","data_headers","data_keys","initWithData","data_json","convertJsonToData","data_rows","convertRowsToData","data_columns","convertColumnsToData","clipId","clipIdForXAxis","clipIdForYAxis","clipIdForGrid","clipIdForSubchart","clipPath","getClipPath","clipPathForGrid","clipPathForSubchart","dragStart","flowing","cancelClick","mouseover","transiting","generateColor","generateLevelColor","dataTimeFormat","data_xLocaltime","axis_x_localtime","hiddenTargetIds","hiddenLegendIds","focusedTargetIds","defocusedTargetIds","subXOrient","isLegendRight","legend_position","isLegendInset","isLegendTop","legend_inset_anchor","isLegendLeft","legendStep","legendItemWidth","legendItemHeight","rotated_padding_left","rotated_padding_right","rotated_padding_top","withoutFadeIn","intervalForObserveInserted","initChartElements","initBar","initLine","initArc","initGauge","initText","initPie","initBrush","initZoom","selectChart","observeInserted","convertDataToTargets","data_filter","data_hide","addHiddenTargetIds","mapToIds","legend_hide","addHiddenLegendIds","hasType","legend_show","updateSizes","updateScales","subX","subY","subY2","orgXDomain","zoom_enabled","svg_classname","defs","clipChart","appendClip","clipXAxis","clipYAxis","clipGrid","clipSubchart","updateSvgSize","initSubchart","initTooltip","initLegend","initTitle","initRegion","initGrid","grid_lines_front","initGridLines","initEventRect","zoom_privileged","axis_x_extent","getDefaultExtent","updateTargets","updateDimension","withTransform","withUpdateXDomain","withUpdateOrgXDomain","withTransitionForAxis","smoothLines","legendHeight","getLegendHeight","getLegendWidth","legendHeightForBottom","hasArc","hasArcType","xAxisHeight","getHorizontalAxisHeight","subchartHeight","subchart_show","subchart_size_height","currentWidth","getCurrentWidth","getCurrentHeight","getCurrentPaddingTop","getCurrentPaddingRight","getCurrentPaddingBottom","getCurrentPaddingLeft","margin3","updateSizeForLegend","width2","arcWidth","arcHeight","gauge_fullCircle","getGaugeLabelHeight","updateRadius","radiusExpanded","updateTargetsForText","updateTargetsForBar","updateTargetsForLine","updateTargetsForArc","updateTargetsForSubchart","showTargets","isTargetToShow","transition_duration","drawArea","drawBar","drawLine","xForText","yForText","waitForDraw","intervalForCulling","xDomainForZoom","areaIndices","getShapeIndices","isAreaType","barIndices","isBarType","lineIndices","isLineType","hideAxis","xv","withY","withSubchart","withTrimXDomain","withUpdateXAxis","withLegend","withEventRect","withDimension","withTransitionForExit","durationForExit","updateLegend","updateXDomain","zoom_rescale","orgDomain","axis_y_tick_count","axis_y2_tick_count","axis_x_tick_culling_max","generateDrawArea","generateDrawBar","generateDrawLine","generateXYForText","updateXgridFocus","data_empty_label_text","updateGrid","updateRegion","updateBar","updateLine","updateArea","updateCircle","hasDataLabel","updateText","redrawTitle","redrawArc","redrawSubchart","interaction_enabled","redrawEventRect","updateZoom","updateCircleY","circleY","circleX","generateFlow","isTabVisible","transitionsToWait","redrawBar","redrawLine","redrawArea","redrawCircle","redrawText","redrawRegion","redrawGrid","generateWait","updateAndRedraw","withTransitionForTransform","transformAll","redrawWithoutRescale","axis_x_type","isCustomX","data_x","data_xs","axis_y_type","initialOpacity","initialOpacityForCircle","opacityForCircle","point_show","isScatterType","opacityForText","xx","axis_x_categories","yv","subxx","transformMain","transformContext","transformLegend","getXAxisClipX","getXAxisClipY","getXAxisClipWidth","getXAxisClipHeight","getYAxisClipX","getYAxisClipY","getYAxisClipWidth","getYAxisClipHeight","withoutAxis","resizeFunction","generateResize","resize_auto","resizeTimeout","resizeFunctions","callResizeFunctions","endall","data_xFormat","mozHidden","msHidden","webkitHidden","SVGPathSeg","typeAsLetter","owningPathSegList","pathSegType","pathSegTypeAsLetter","_owningPathSegList","classname","PATHSEG_UNKNOWN","PATHSEG_CLOSEPATH","PATHSEG_MOVETO_ABS","PATHSEG_MOVETO_REL","PATHSEG_LINETO_ABS","PATHSEG_LINETO_REL","PATHSEG_CURVETO_CUBIC_ABS","PATHSEG_CURVETO_CUBIC_REL","PATHSEG_CURVETO_QUADRATIC_ABS","PATHSEG_CURVETO_QUADRATIC_REL","PATHSEG_ARC_ABS","PATHSEG_ARC_REL","PATHSEG_LINETO_HORIZONTAL_ABS","PATHSEG_LINETO_HORIZONTAL_REL","PATHSEG_LINETO_VERTICAL_ABS","PATHSEG_LINETO_VERTICAL_REL","PATHSEG_CURVETO_CUBIC_SMOOTH_ABS","PATHSEG_CURVETO_CUBIC_SMOOTH_REL","PATHSEG_CURVETO_QUADRATIC_SMOOTH_ABS","PATHSEG_CURVETO_QUADRATIC_SMOOTH_REL","_segmentChanged","segmentChanged","SVGPathSegClosePath","_asPathString","SVGPathSegMovetoAbs","_x","_y","SVGPathSegMovetoRel","SVGPathSegLinetoAbs","SVGPathSegLinetoRel","SVGPathSegCurvetoCubicAbs","_x1","_y1","_x2","_y2","SVGPathSegCurvetoCubicRel","SVGPathSegCurvetoQuadraticAbs","SVGPathSegCurvetoQuadraticRel","SVGPathSegArcAbs","largeArcFlag","sweepFlag","_r1","_r2","_angle","_largeArcFlag","_sweepFlag","SVGPathSegArcRel","SVGPathSegLinetoHorizontalAbs","SVGPathSegLinetoHorizontalRel","SVGPathSegLinetoVerticalAbs","SVGPathSegLinetoVerticalRel","SVGPathSegCurvetoCubicSmoothAbs","SVGPathSegCurvetoCubicSmoothRel","SVGPathSegCurvetoQuadraticSmoothAbs","SVGPathSegCurvetoQuadraticSmoothRel","SVGPathElement","createSVGPathSegClosePath","createSVGPathSegMovetoAbs","createSVGPathSegMovetoRel","createSVGPathSegLinetoAbs","createSVGPathSegLinetoRel","createSVGPathSegCurvetoCubicAbs","createSVGPathSegCurvetoCubicRel","createSVGPathSegCurvetoQuadraticAbs","createSVGPathSegCurvetoQuadraticRel","createSVGPathSegArcAbs","createSVGPathSegArcRel","createSVGPathSegLinetoHorizontalAbs","createSVGPathSegLinetoHorizontalRel","createSVGPathSegLinetoVerticalAbs","createSVGPathSegLinetoVerticalRel","createSVGPathSegCurvetoCubicSmoothAbs","createSVGPathSegCurvetoCubicSmoothRel","createSVGPathSegCurvetoQuadraticSmoothAbs","createSVGPathSegCurvetoQuadraticSmoothRel","getPathSegAtLength","measurementElement","lastPathSegment","numberOfItems","removeItem","SVGPathSegList","pathElement","_pathElement","_list","_parsePath","_mutationObserverConfig","attributeFilter","_pathElementMutationObserver","_updateListFromPathMutations","_checkPathSynchronizedToList","_pathSegList","takeRecords","mutationRecords","hasPathMutations","record","_writeListToPath","_pathSegArrayAsString","pathSeg","_checkValidIndex","insertItemBefore","replaceItem","appendItem","pathSegArray","Builder","Source","_string","_currentIndex","_endIndex","_previousCommand","_skipOptionalSpaces","appendSegment","_isCurrentSpace","character","_skipOptionalSpacesOrDelimiter","hasMoreData","peekSegmentType","lookahead","_pathSegTypeFromChar","_nextCommandHelper","previousCommand","initialCommandIsMoveTo","command","_parseNumber","frac","expsign","startIntPartIndex","scanIntPartIndex","_parseArcFlag","flagChar","parseSegment","arcAngle","arcLarge","arcSweep","axis_x_max","axis_y_max","axis_y2_max","axis_x_min","axis_y_min","axis_y2_min","category","categories","size_width","size_height","detachEvent","targetIds","targetId","clearLegendItemTextBoxCache","updateDataAttributes","baseTarget","baseValue","notfoundIds","orgDataCount","getMaxDataCount","getOtherTargetX","missing","flowIndex","flowLength","flowStart","getValueOnIndex","flowEnd","durationForFlow","mainRegion","mainText","mainBar","mainLine","mainArea","mainCircle","updateXGrid","translateX","hideXGridFocus","isRegionOnX","xgridAttr","regionX","regionWidth","mapToTargetIds","selectorTargets","revert","defocus","expandArc","toggleFocusLegend","unexpandArc","isLegendToShow","selectorLegends","grids","grid_x_lines","removeGridLines","grid_y_lines","data_groups","hideLegend","addXs","data_classes","data_colors","hasCaches","cacheIds","getCaches","loadFromArgs","getTargetSelectorSuffix","indices","resetOther","data_selection_enabled","getToggle","isTargetId","data_selection_grouped","isTargetIndex","data_selection_isselectable","unselect","removeHiddenTargetIds","isMultipleX","getYScale","getIndexByX","tooltip_onshow","tooltip_onhide","transformTo","optionsForRedraw","setTargetType","updateTargetX","updateTargetXs","zoom_onzoom","unzoom","zoom_x_max","zoom_x_min","getOrderFunction","gauge_width","donut_width","innerRadiusRatio","updateArc","svgArc","svgArcExpanded","getSvgArcExpanded","svgArcExpandedSub","updateAngle","gMin","gTic","gValue","isGaugeType","gauge_min","gMax","gauge_max","gauge_startingAngle","withoutUpdate","updated","rate","getArc","isArcType","transformForArcLabel","donut_label_ratio","pie_label_ratio","getArcRatio","whole","convertToArcData","addName","textForArcLabel","shouldShowArcLabel","meetsArcLabelThreshold","getArcLabelFormat","defaultArcValueFormat","textForGaugeMinMax","isMax","getGaugeLabelExtents","shouldExpand","expandDuration","isDonutType","donut_expand_duration","gauge_expand_duration","isPieType","pie_expand_duration","donut_expand","gauge_expand","pie_expand","shouldShow","donut_label_show","pie_label_show","donut_label_threshold","pie_label_threshold","pie_label_format","gauge_label_format","donut_label_format","gauge_label_extents","getArcTitle","donut_title","classChartArc","classArcs","classFocus","mainPieEnter","mainArc","arcData","classArc","data_onmouseover","revertLegend","hideTooltip","data_onmouseout","toggleShape","data_onclick","interpolated","gauge_label_show","gauge_units","addCache","cloneTarget","generateClass","classText","classTexts","classShape","classShapes","classLine","classLines","classCircle","classCircles","classBar","classBars","classArea","classAreas","classRegion","classEvent","classTarget","additionalClassSuffix","additionalClass","classFocused","classDefocused","classChartText","classChartLine","classChartBar","selectorTarget","selectorLegend","appVersion","getAxisClipX","getAxisClipY","getAxisClipWidth","getAxisClipHeight","color_pattern","data_color","color_threshold","asValue","padding_left","padding_right","padding_top","padding_bottom","zoom_extent","zoom_onzoomstart","zoom_onzoomend","interaction_brighten","data_xSort","data_idConverter","data_names","data_type","data_types","data_labels","data_order","data_regions","data_selection_multiple","data_selection_draggable","data_onselected","data_onunselected","subchart_axis_x_show","subchart_onbrush","legend_inset_x","legend_inset_y","legend_inset_step","legend_item_onclick","legend_item_onmouseover","legend_item_onmouseout","legend_equally","legend_padding","legend_item_tile_width","legend_item_tile_height","axis_x_tick_outer","axis_x_padding","axis_y_inverted","axis_y_center","axis_y_tick_outer","axis_y_padding","axis_y_default","axis_y2_inverted","axis_y2_center","axis_y2_tick_outer","axis_y2_padding","axis_y2_default","grid_x_show","grid_x_type","grid_y_show","grid_y_ticks","grid_focus_show","point_r","point_sensitivity","point_focus_expand_enabled","point_focus_expand_r","point_select_r","line_connectNull","line_step_type","bar_width","bar_width_ratio","bar_width_max","bar_zerobased","bar_space","area_zerobased","area_above","spline_interpolation_type","tooltip_show","tooltip_grouped","tooltip_order","tooltip_position","tooltip_contents","getTooltipContent","tooltip_init_show","tooltip_init_x","tooltip_init_position","title_text","title_padding","title_position","additionalConfig","this_config","req","dataResponse","responseURL","convertTsvToData","convertCsvToData","convertXsvToData","xsv","targetKeys","new_rows","new_row","findValueInJson","pathArray","newRow","appendXs","isNotX","isX","xKey","getXKey","rawX","generateTargetX","getOtherTargetXs","getXValuesOfXKey","convertedId","id_org","hasNegativeValue","hasNegativeValueInTargets","hasPositiveValue","hasPositiveValueInTargets","filterByX","getXValue","idsForX","hasMultipleX","valueOnIndex","updateXs","getPrevX","getNextX","getMaxDataCountTarget","maxTarget","getEdgeX","hasTarget","removeHiddenLegendIds","getValuesAsIdKeyed","checkValueInTargets","checker","isOrderDesc","isOrderAsc","orderAsc","orderDesc","reducer","t1Sum","t2Sum","orderTargets","fct","filterRemoveNull","filterByXDomain","getDataLabelLength","dataLabelFormat","isNoneArc","isArc","findSameXOfValues","targetX","sames","findClosestFromTargets","findClosest","minDist","isWithinBar","xIndex","yIndex","convertValuesToStep","converted","getYDomainMin","baseId","idsInGroup","getYDomainMax","isAllNegative","targetsByAxisId","yTargets","yDomainMin","yDomainMax","isZeroBased","showHorizontalDataLabel","showVerticalDataLabel","isAllPositive","yDomainAbs","getXDomainMin","getXDomainMax","getXDomainPadding","maxDataCount","firstX","lastX","withTrim","updateScaleExtent","trimXDomain","zoomDomain","getZoomDomain","mx","minX","maxX","minY","maxY","altDomain","my","isIncluded","isWithin","togglePoint","_h","togglePath","dragend","getYFormat","forArc","formatForY","yFormat","formatForY2","y2Format","xgridData","generateGridData","updateYGrid","gridValues","gridTextAnchor","gridTextDx","xGridTextX","yGridTextX","showXGridFocus","selectedData","dataToShow","firstYear","lastYear","gridData","tickNum","getGridFilterToRemove","forX","toShow","eventRectUpdate","generateEventRectsForMultipleXs","updateEventRect","maxDataCountTarget","generateEventRectsForSingleX","rectW","rectX","getEventRectWidth","prevX","nextX","thisX","eventRectEnter","expandCircles","expandBars","unexpandCircles","unexpandBars","isStepType","isWithinShape","mouseout","legendItemTextBox","legendHasRendered","updateLegendWithDefaults","insetLegendPosition","updateLegendStep","updateLegendItemWidth","updateLegendItemHeight","opacityForLegend","opacityForUnfocusedLegend","xForLegend","xForLegendRect","yForLegend","yForLegendText","yForLegendRect","x1ForLegendTile","x2ForLegendTile","yForLegendTile","rects","posMin","tileWidth","totalLength","widths","heights","margins","updatePositions","textElement","isLast","getTextRect","itemWidth","itemHeight","itemLength","areaLength","updateValues","withoutStep","maxLength","xForLegendText","parentData","regionY","regionHeight","xPos","getScale","forTimeseries","_scale","getSubYScale","forInit","subXMin","subXMax","subYMin","subYMax","selectPoint","pointSelectR","unselectPoint","selectPath","unselectPath","barData","getBarW","barTargetsNum","getBars","isSub","getPoints","generateGetBarPoints","indexX","indexY","__max__","barW","barX","getShapeX","barY","getShapeY","barOffset","getShapeOffset","barSpaceOffset","posX","posY","seg0","seg1","typeFilter","targetsNum","isWithinStep","isWithinCircle","getInterpolate","isInterpolationType","isSplineType","mainLineEnter","yScaleGetter","generateGetLinePoints","lineWithRegions","lineTargetsNum","lineOffset","_regions","sWithRegion","xp","yp","diffx2","xOffset","generateM","x_diff","xv0","xv1","orgAreaOpacity","value0","getAreaBaseValue","generateGetAreaPoints","areaTargetsNum","areaOffset","lineOrScatterData","pointR","getCircles","pointExpandedR","d3_this","getParentWidth","getParentHeight","getTitlePadding","getAxisWidthByAxisId","legendWidthOnRight","getParentRectValue","getSvgLeft","hasLeftAxisRect","leftAxisClass","leftAxis","svgRect","chartRect","svgLeft","redrawForBrush","contextLineEnter","updateBarForSubchart","contextBar","redrawBarForSubchart","drawBarOnSub","updateLineForSubchart","contextLine","redrawLineForSubchart","drawLineOnSub","updateAreaForSubchart","contextArea","redrawAreaForSubchart","drawAreaOnSub","barOrLineData","forFlow","font","getAreaPoints","getBarPoints","getLinePoints","getXForText","getYForText","isSafari","isChrome","xForTitle","yForTitle","getTooltipSortFunction","sortFunction","tooltipSortFunction","tooltipPosition","tWidth","tHeight","tooltipRight","chartRight","positionFunction","startEvent","redrawForZoom","orgScaleExtent","mSource","bAjaxDataGet","dtHeaderCells","Responsive","responsive","_constructor","dtPrivateSettings","oldWindowWidth","_responsive","_resize","_setColumnVis","_classLogic","_resizeAuto","_detailsInit","_redrawChildren","_columnsVisiblity","breakpoint","auto","includeIn","requiredWidth","scrolling","usedWidth","showControl","never","_find","responsivePriority","dataPriority","brokenPoint","_detailsDisplay","_detailsObj","_tabIndexes","targetIdx","orthogonal","columnIndex","rowIndex","oldVis","columnsVis","collapsedClass","clonedTable","clonedHeader","clonedFooter","inserted","clonedBody","footerCells","childRow","childRowImmediate","hasHidden","modal","listHidden","tableAll","tableClass","rangy","OBJECT","FUNCTION","UNDEFINED","domRangeProperties","domRangeMethods","textRangeProperties","textRangeMethods","isHostMethod","isHostObject","isHostProperty","createMultiplePropertyTest","testFunc","areHostMethods","areHostObjects","areHostProperties","isTextRange","getBody","isBrowser","initialized","alertOnFail","alertOnWarn","preferTextRange","autoInitialize","rangyAutoInitialize","alertOrLog","shouldAlert","createOptions","optionsParam","arrayLike","initListeners","getErrorDesc","description","testRange","implementsDomRange","implementsTextRange","Module","deprecationNotice","createAliasForDeprecatedMethod","addInitListener","shimListeners","dependencies","initializer","createModule","initFunc","newModule","RangePrototype","addShimListener","shim","createMissingNativeApi","requiredModule","requiredModuleNames","createError","createCoreModule","rangePrototype","selectionPrototype","arrayContains","UNDEF","textNode","getNodeIndex","getCommonAncestor","node2","isAncestorOf","descendant","selfIsAncestor","getClosestAncestorIn","isCharacterDataNode","precedingNode","getDocument","getIframeDocument","iframeEl","contentWindow","crashyTextNodes","getComputedStyleProperty","isBrokenNode","inspectNode","idAttr","NodeIterator","_next","DomPosition","DOMException","INDEX_SIZE_ERR","HIERARCHY_REQUEST_ERR","WRONG_DOCUMENT_ERR","NO_MODIFICATION_ALLOWED_ERR","NOT_FOUND_ERR","NOT_SUPPORTED_ERR","INVALID_STATE_ERR","INVALID_NODE_TYPE_ERR","isHtmlNamespace","getNodeLength","isOrIsAncestorOf","isTextOrCommentNode","splitDataNode","positionsToPreserve","deleteData","getIframeWindow","getContentDocument","getRootContainer","nodeA","offsetA","nodeB","offsetB","nodeC","childA","childB","createTestElement","bodyFirstChild","removeNode","fragmentFromNodeChildren","createIterator","isNonTextPartiallySelected","startContainer","endContainer","getRangeDocument","getBoundaryBeforeNode","getBoundaryAfterNode","insertNodeAtPosition","firstNodeInserted","rangesIntersect","rangeA","rangeB","touchingIsIntersecting","assertRangeValid","startComparison","endOffset","endComparison","iterateSubtree","rangeIterator","iteratorState","subRangeIterator","isPartiallySelectedSubtree","getSubtreeIterator","deleteSubtree","subIterator","extractSubtree","frag","RangeIterator","clonePartiallySelectedTextNodes","collapsed","sc","so","ec","eo","isSingleCharacterDataNode","_first","_last","subRange","cloneRange","collapse","Range","updateBoundaries","beforeAfterNodeTypes","rootContainerNodeTypes","insertableNodeTypes","surroundNodeTypes","createAncestorFinder","nodeTypes","getDocumentOrFragmentContainer","getReadonlyAncestor","getDocTypeNotationEntityAncestor","getElementAncestor","assertNoDocTypeNotationEntityAncestor","allowSelf","assertValidNodeType","invalidTypes","assertValidOffset","assertSameDocumentOrFragment","assertNodeNotReadOnly","assertNode","isValidOffset","isRangeValid","styleEl","htmlParsingConforms","splitRangeBoundaries","startEndSame","setStartAndEnd","rangeToHtml","cloneContents","rangeProperties","s2s","s2e","e2e","e2s","n_b","n_a","n_b_a","n_i","copyComparisonConstantsToObject","START_TO_START","START_TO_END","END_TO_END","END_TO_START","NODE_BEFORE","NODE_AFTER","NODE_BEFORE_AND_AFTER","NODE_INSIDE","copyComparisonConstants","createRangeContentRemover","remover","boundaryUpdater","createPrototypeRange","createBeforeAfterNodeSetter","isStart","setRangeStart","setRangeEnd","setStart","setEnd","setBoundary","setStartBefore","setStartAfter","setEndBefore","setEndAfter","extractContents","deleteContents","canSurroundContents","boundariesInvalid","splitBoundaries","splitBoundariesPreservingPositions","normalizeBoundaries","mergeForward","appendData","mergeBackward","nodeLength","insertData","startNode","normalizeStart","collapseToPoint","compareBoundaryPoints","how","prefixA","prefixB","insertNode","cloneSubtree","partiallySelected","surroundContents","textParts","compareNode","comparePoint","fragmentStr","toHtml","intersectsNode","isPointInRange","intersectsRange","intersectsOrTouchesRange","intersectionRange","union","unionRange","containsNode","allowPartial","containsNodeContents","containsRange","containsNodeText","nodeRange","textNodes","getNodes","lastTextNode","filterNodeTypes","filterExists","collapseBefore","collapseAfter","getBookmark","preSelectionRange","moveToBookmark","bookmark","nextCharIndex","charIndex","nodeStack","foundStart","rangesEqual","DomRange","WrappedRange","getTextRangeBoundaryPosition","createBoundaryTextRange","rangeToTextRange","rangeProto","updateRangeProperties","nativeRange","startMoved","endMoved","nativeRangeDifferent","testTextNode","oppositeName","range2","createNativeRange","textRange","wholeRangeContainerElement","isCollapsed","startInfo","workingRange","duplicate","containerElement","canHaveHTML","boundaryPosition","nodeInfo","workingNode","comparison","workingComparisonType","childNodeCount","compareEndPoints","boundaryNode","setEndPoint","tempRange","rangeLength","moveStart","boundaryOffset","nodeIsDataNode","boundaryParent","WrappedTextRange","startEl","endEl","rangeContainerElement","startEndContainer","startBoundary","startRange","endRange","toTextRange","globalObj","createRangyRange","checkSelectionRanges","getNativeSelection","selectionIsCollapsed","NUMBER","CONTROL","isDirectionBackward","WrappedSelection","getDocSelection","winParam","winSelectionIsBackward","backward","anchorNode","anchorOffset","focusNode","focusOffset","implementsWinGetSelection","implementsDocSelection","useDocumentSelection","isSelectionValid","nativeSel","testSelection","selectionHasAnchorAndFocus","selectionHasExtend","selectionHasSetBaseAndExtent","selectionHasRangeCount","rangeCount","selectionSupportsMultipleRanges","collapsedNonEditableSelectionsSupported","addRangeBackwardToNative","nativeSelection","getNativeRange","originalSelectionRangeCount","selectionHasMultipleRanges","originalSelectionRanges","originalSelectionBackward","chromeMatch","getSelectionRangeAt","implementsControlRange","updateAnchorAndFocusFromRange","anchorPrefix","focusPrefix","updateEmptySelection","_ranges","updateType","getSingleElementFromRange","rangeNodes","updateFromTextRange","wrappedRange","updateControlSelection","docSelection","controlRange","addRangeToControlSelection","rangeElement","newControlRange","createControlRange","deleteProperties","detached","testControlRange","cachedRangySelections","actOnCachedSelection","docSel","refreshSelection","selProto","createControlSelection","addRangeBackward","previousRangeCount","clonedNativeRange","selectionIsBackward","setRanges","checkForChanges","oldRanges","oldAnchorNode","oldAnchorOffset","removeRangeManually","getAllRanges","assertNodeInSameDocument","createStartOrEndSetter","setSingleRange","isBackward","rangeInspects","removeRange","isBackwards","rangeTexts","collapseToStart","collapseToEnd","selectAllChildren","setBaseAndExtent","deleteFromDocument","eachRange","callMethodOnEachRange","changeEachRange","rangeBookmarks","rangeBookmark","selRanges","saveRanges","restoreRanges","rangeHtmls","getNativeTextRange","detachAll","loadHandler","docReady","createElementNSSupported","classNameContainsClass","classNameSupported","elClass","replacer","whiteSpaceBefore","whiteSpaceAfter","sortClassName","getSortedClassName","haveSameClasses","el1","el2","hasAllClasses","movePreservingPositions","newParent","oldParent","posNode","posOffset","newOffset","removePreservingPositions","replaceWithOwnChildrenPreservingPositions","moveChildrenPreservingPositions","rangeSelectsAnyText","textNodeRange","getEffectiveTextNodes","elementsHaveSameNonClassAttributes","attr1","attr2","elementHasNonClassAttributes","exceptions","isEditableElement","isEditingHost","designMode","inlineDisplayRegex","isNonInlineElement","htmlNonWhiteSpaceRegex","getRangeBoundaries","updateRangesFromBoundaries","splitNodeAt","descendantNode","descendantOffset","splitAtStart","descendantIndex","newChildIndex","newNodeIndex","createAdjacentMergeableTextNodeGetter","siblingPropName","checkParentElement","adjacentNode","adjacentNodeChild","getPreviousMergeableTextNode","getNextMergeableTextNode","Merge","firstNode","isElementMerge","firstTextNode","optionProperties","attrNamesForProperties","ClassApplier","tagNames","applier","elementPropertiesFromOptions","elementAttributes","elementTagName","elementProperties","normalize","attrExceptions","copyPropertiesToElement","elementSortedClassName","applyToAnyTagName","ignoreWhiteSpace","applyToEditableOnly","doMerge","firstTextNodeIndex","combinedTextLength","useExistingElements","removeEmptyElements","onElementCreate","createCopy","elStyle","elPropsStyle","elProps","elPropValue","copyAttributesToElement","appliesToElement","getEmptyElements","getSelfOrAncestorWithClass","isModifiable","isIgnorableWhiteSpaceNode","postApply","isUndo","currentMerge","precedingTextNode","lastNode","merges","rangeStartNode","rangeEndNode","rangeStartOffset","rangeEndOffset","nextTextNode","elementHasProperties","elementHasAttributes","applyToTextNode","textNodeParent","isEmptyContainer","removeEmptyContainers","nodesToRemove","rangesToPreserve","undoToTextNode","ancestorWithClass","ancestorRange","splitAncestorWithClass","undoToAncestor","applyToRange","emptyElements","applyToRanges","applyToSelection","undoToRange","undoToRanges","undoToSelection","isAppliedToRange","isAppliedToRanges","isAppliedToSelection","toggleRange","toggleSelection","getElementsWithClassIntersectingRange","hasSameClasses","replaceWithOwnChildren","CssClassApplier","createClassApplier","nextHighlightId","compareHighlights","h2","characterRange","getContainerElement","highlighterTypes","HighlighterType","converterCreator","registerHighlighterType","getConverter","highlighterType","CharacterRange","converter","intersects","charRange","isContiguousWith","getComplements","fromCharacterRange","textContentConverter","rangeToCharacterRange","characterRangeToRange","serializeSelection","rangeInfos","restoreSelection","savedSelection","rangeInfo","Highlight","classApplier","containerElementId","applied","Highlighter","classAppliers","highlights","textRangeModule","TextRange","toCharacterRange","selectCharacters","saveCharacterRanges","restoreCharacterRanges","getRange","fromRange","containsElement","unapply","getHighlightElements","addClassApplier","getHighlightForElement","removeHighlights","removeAllHighlights","getIntersectingHighlights","intersectingHighlights","highlightCharacterRanges","charRanges","containerElementCharRange","highlightCharRange","removeHighlight","isSameClassApplier","highlightsToKeep","splitHighlight","highlightsToRemove","exclusive","containerElementRange","rangeToAdd","highlightToRemove","newHighlights","highlightRanges","selCharRanges","scopedRange","highlightSelection","serializedSelection","unhighlightSelection","getHighlightsInSelection","selectionOverlapsHighlight","serializedType","serializedHighlights","convertType","serializationConverter","highlighter","serializeHighlightText","deserialize","serialized","regexResult","firstHighlight","serializationType","createHighlighter","rangeCharacterOffsetConverterType","markerTextChar","gEBI","insertRangeBoundaryMarker","atStart","markerId","boundaryRange","markerEl","setRangeBoundary","saveRange","startMarkerId","endMarkerId","restoreRange","removeMarkerElement","saveSelection","restored","preserveDirection","removeMarkers","cachedCrcTable","crc32","utf8CharCodes","crc","crcTable","getCrcTable","escapeTextForHtml","nodeToInfoString","infoParts","childCount","getElementChecksum","serializePosition","pathParts","deserializePosition","nodeIndices","serializeRange","omitChecksum","deserializeRegex","deserializeRange","checksum","rootNodeChecksum","canDeserializeRange","serializedRanges","deserializeSelection","cookieName","canDeserializeSelection","restoreSelectionFromCookie","nameVal","saveSelectionCookie","CHARACTER","WORD","spacesRegex","spacesMinusLineBreaksRegex","allWhiteSpaceRegex","nonLineBreakWhiteSpaceRegex","defaultLanguage","wordOptions","tokenizer","tokenRange","tokenRanges","tokenChars","isWord","trailingSpaceBeforeBrCollapses","trailingSpaceBeforeBlockCollapses","defaultCharacterOptions","includeBlockContentTrailingSpace","includeSpaceBeforeBr","includeSpaceBeforeBlock","includePreLineTrailingSpace","ignoreCharacters","defaultCaretCharacterOptions","defaultWordOptions","en","wordRegex","includeTrailingSpace","createTokenRange","wordStart","wordEnd","lastWordEnd","defaultFindOptions","caseSensitive","wholeWordsOnly","characterOptions","defaultMoveOptions","defaultExpandOptions","trimStart","trimEnd","defaultWordIteratorOptions","createNestedOptions","tableCssDisplayBlock","defaultDisplayValueForTag","getComputedDisplay","excludeChildren","nextNodeDescendants","isWhitespaceNode","computedWhiteSpace","isCollapsedWhitespaceNode","isCollapsedNode","isIgnoredNode","Cache","store","createCachingGetter","objProperty","NodeWrapper","session","nodeProto","getPosition","Position","NON_SPACE","UNCOLLAPSIBLE_SPACE","COLLAPSIBLE_SPACE","TRAILING_SPACE_BEFORE_BLOCK","TRAILING_SPACE_IN_BLOCK","TRAILING_SPACE_BEFORE_BR","PRE_LINE_TRAILING_SPACE_BEFORE_LINE_BREAK","INCLUDED_TRAILING_LINE_BREAK_AFTER_BR","nodeWrapper","containsPositions","isCollapsedWhitespace","isIgnored","getTextNodeInfo","spaceRegex","collapseSpaces","cssWhitespace","preLine","hasInnerText","posAfterEl","firstPosInEl","endPos","prepopulateChar","isDefinitelyNonEmpty","previousVisible","nextVisible","isRenderedBlock","brs","getTrailingSpace","getNodeWrapper","getLeadingSpace","uniqueIDSupported","positionProto","characterType","isBr","visibleChar","charType","finalizedChar","textChar","nodePassed","prepopulatedChar","checkForTrailingSpace","checkForLeadingSpace","isCharInvariant","resolveLeadingAndTrailingSpaces","leadingSpace","trailingSpace","isTrailingSpace","isLeadingSpace","getPrecedingUncollapsedPosition","getCharacter","nextPos","previousPos","gotPreviousPos","thisChar","ignoredChars","ignoredCharsArray","ignoredCharacters","char1","char2","isIgnoredCharacter","cachedChar","collapsible","getPreviousPos","nextUncollapsed","currentSession","nextOffset","previousOffset","newPos","Session","initCaches","elementsCache","elementCache","elWrapper","createWrapperCache","textNodeCache","otherNodeCache","wrapperCache","getRangeBoundaryPosition","nodeProperty","wrappersByProperty","getSession","endSession","createCharacterIterator","startPos","previousTextPos","returnPreviousTextPos","charPos","rewind","dispose","arrayIndexOf","createTokenizedTextProvider","forwardIterator","backwardIterator","consumeWord","newChars","passedWordBoundary","insideWord","forwardChars","backwardChars","forwardTokensBuffer","backwardTokensBuffer","nextEndToken","lastToken","previousStartToken","createRangeCharacterIterator","rangeStart","rangeEnd","findTextFromPosition","initialPos","searchTerm","isRegex","searchScopeRange","findOptions","currentChar","matchStartIndex","matchEndIndex","insideRegexMatch","handleMatch","createEntryPointFunction","sessionRunning","createRangeBoundaryMover","moveOptions","boundaryIsStart","moveResult","currentPos","charIterator","unitsMoved","absCount","tokenizedTextProvider","createRangeTrimmer","trimCharCount","trimmed","createSelectionTrimmer","moveEnd","startTrimmed","endTrimmed","expandOptions","newStartPos","endToken","startToken","newEndPos","rangeStartsBeforeNode","rangeBetween","findText","searchTermParam","findResult","wrappedAround","pasteHtml","saved","createWordIterator","iteratorOptions","noMutation","isBlockNode","createPosition","textAngularVersion","_browserDetect","ie","undef","webkit","isFirefox","stripHtmlToText","getDomFromHtml","mozNow","msNow","oNow","webkitNow","sheet","addCSSRule","removeCSSRule","_addCSSRule","_removeCSSRule","_getRuleIndex","BLOCKELEMENTS","LISTELEMENTS","VALIDELEMENTS","_sheets","styleSheets","mediaText","_sheet","insertIndex","insertedRule","cssRules","insertRule","addRule","ruleIndex","removeRule","deleteRule","taCustomRenderers","taDOM","customAttribute","getByAttribute","_element","renderLogic","keepStyles","styleVal","appleSpaceVal","betterSpanMatch","appleConvertedSpaceMatch","finalHtml","convert_infos","styleMatch","_partialStyle","styleRegexString","wrapNested","wrapTag","tagRegex","rsb1","rsb2","rsb3","unsafe","oldsafe","transformLegacyStyles","subMatch","styleElementMatch","lastNewTag","styleRegex","newTag","styleRegexExec","attrElementMatch","safe","origTag","_preTags","processedSafe","editor","$editor","_editor","startAction","endAction","exc","taSelection","taBrowserTag","listToDefault","listElement","defaultWrap","$target","setSelectionToElementEnd","listElementToSelfTag","selfTag","bDefault","priorElement","nextElement","foundIndex","html1","listTag","html2","selectLi","liElement","setSelectionBeforeElement","listToList","newListTag","childElementsToList","turnBlockIntoBlocks","_n","taDefaultWrap","topNode","showUI","defaultTagAttributes","selectedElement","defaultWrapper","ourSelection","getSelectionElement","__h","__","_innerNode","$selected","childBlockElements","getOnlySelectedElements","listElementsToSelfTag","listElements","foundIndexes","isEqualNode","_nodes","$n","$nodes","$node","optionsTagName","hasBlock","getStateShiftKey","newBlock","blockElement","tagBegin","insertHtml","execCommand","brException","bShiftState","_document","updateLeftArrowKey","getFlattenedDom","findIndex","nextNodeToRight","nextNodeToLeft","_node","indexStartContainer","nn","updateRightArrowKey","addNodes","_set","_t","getAllSelectedElements","selectedNodes","setSelection","elStart","elEnd","setSelectionAfterElement","setSelectionToElementStart","setStateShiftKey","bS","_childI","_tempFrag","isInline","_cnode","secondParent","splitNodes","_lastSecondParent","transferChildNodes","transferNodeAttributes","resultingElements","target1","target2","splitNode","subSplitIndex","splitIndex","startNodes","endNodes","taMaxText","taMinText","_blankVal","eventData","taSanitize","taFixChrome","taSelectableElements","taApplyCustomRenderers","taOptions","_taBlankTest","textAngularManager","_pasteHandler","_defaultVal","_isContentEditable","_isInputFriendly","_isReadonly","_focussed","_skipRender","_disableSanitizer","taUnsafeSanitizer","disableSanitizer","_keepStyles","taKeepStyles","BLOCKED_KEYS","UNDO_TRIGGER_KEYS","_keyMappings","specialKey","forbiddenModifiers","_ALT_KEY","mustHaveModifiers","_META_KEY","_ensureContentWrapped","domTest","_children","_foundBlockElement","_subVal","_compileHtml","selectorClickHandler","taPaste","$undoManager","_stack","_index","_max","_undoKeyupTimeout","undo","setToIndex","redo","_setViewValue","_val","triggerUndo","skipRender","_reApplyOnSelectorHandlers","_setInnerHTML","newval","_sanitize","$oldViewValue","_redoUndoTimeout","_undo","_redo","processpaste","_isOneNote","textFragment","_resetList","isUl","lastIndent","lastLevelMatch","targetDom","lastLi","_listMatch","_indentMatch","indent","_levelMatch","_unwrapElement","_el","_b","binds","_target","_c","$html","_processingPaste","_keyupTimeout","_inputTimeout","paste","pastedContent","clipboardData","_types","_savedSelection","_tempDiv","cut","userSpecialKey","_new","$selection","_parent","netModifiers","modifier","keyMappings","commandKeyCode","testForKey","enablePropagation","sendKeyCommand","keyup","_selection","_linebreak","_tab","_repeat","recursiveListFormat","listNode","tablevel","_html","_subnodes","htmlValue","fileDropHandler","dropFired","_renderTimeout","_renderInProgress","taReadonly","textAngular","validElementString","taTools","taExecCommand","oneEvent","_originalContents","_editorFunctions","_resizeMouseDown","_updateSelectedStylesTimeout","_resizeTimeout","_serial","_taExecCommand","_name","wrapSelection","isSelectableElementTool","displayElements","showHtml","taShowHtml","taFocussedClass","focussed","taTextEditorClass","textEditor","taHtmlEditorClass","htmlEditor","taDefaultTagAttributes","taTextEditorSetup","textEditorSetup","taHtmlEditorSetup","htmlEditorSetup","taFileDrop","defaultFileDropHandler","forminput","scrollWindow","popover","popoverArrow","popoverContainer","overlay","handlePopoverEvents","reflowPopover","resizeElement","reflowResizeOverlay","testAndSet","choice","beforeState","queryCommandState","getScrollTop","bAddListener","_notScrollable","_scrollListener","showPopover","hidePopover","_maxLeft","_targetLeft","_rleft","_marginLeft","showResizeOverlay","_body","startPosition","bForceAspectRatio","taResizeForceAspectRatio","bFlipKeyBinding","taResizeMaintainAspectRatio","roundedMaxVal","newRatio","updateTaBindtaTextElement","hideResizeOverlay","ng-show","ta-bind","ng-model","ng-model-options","ng-hide","taDisabled","updateTaBindtaHtmlElement","_firstRun","_toolbar","_actionRunning","_beforeStateBold","_beforeStateItalic","_beforeStateUnderline","_beforeStateStrikethough","updateSelectedStyles","_focusin","_bUpdateSelectedStyles","_focusout","unfocus","queryFormatBlockState","queryCommandValue","switchView","taTargetToolbars","registerEditor","taToolbar","taToolbarClass","taToolbarGroupClass","taToolbarButtonClass","taToolbarActiveButtonClass","unregisterEditor","triggerElementSelect","dropEvent","_keydown","_keyup","_keypress","_mouseup","taToolExecuteAction","taRegisterTool","touchModification","timeRecentModification","triggerInterval","triggerIntervalTimer","updateStyles","toolbars","editors","editorFunctions","editorName","editorScope","targetToolbars","toolbarScopes","_registerToolbarScope","toolbarScope","tools","toolScope","activeState","tool","elementHasAttrs","workerTools","unfilteredTools","onlyWithAttrsFilter","onElementSelect","onlyWithAttrs","retrieveEditor","registerToolbar","retrieveToolbar","retrieveToolbarsViaEditor","unregisterToolbar","updateToolsDisplay","newTaTools","_newTool","updateToolDisplay","resetToolsDisplay","resetToolDisplay","toolKey","toolbarKey","updateToolbarToolDisplay","resetToolbarToolDisplay","removeTool","toolbar","toolbarIndex","addTool","toolDefinition","addToolToToolbar","refreshEditor","getToolbarScopes","toolbarGroup","toolbarButton","toolbarButtonActive","setupToolElement","toolElement","tooltiptext","_display","buttontext","iconclass","_lastToolDefinition","defaultChildScope","displayActiveToolClass","executeAction","forceNew","toolInstance","START_TAG_REGEXP","END_TAG_REGEXP","ATTR_REGEXP","BEGIN_TAG_REGEXP","BEGING_END_TAGE_REGEXP","COMMENT_REGEXP","SINGLE_COMMENT_REGEXP","DOCTYPE_REGEXP","CDATA_REGEXP","WHITE_SPACE_REGEXP","makeMap","specialElements","hiddenPre","spaceRe","decodeEntities","spaceBefore","spaceAfter","styleAttr","styleArray","com","ws","parseEndTag","parseStartTag","rest","doubleQuotedValue","singleQuotedValue","unquotedValue","registerTextAngularTool","forceTextAngularSanitize","insertAction","iframe","heading","ol","bold","italic","underline","strikeThrough","justifyLeft","justifyRight","justifyFull","justifyCenter","outdent","insertImage","dialogPrompt","hotkey","insertVideo","insertLink","editLink","reLinkButton","unLinkButton","targetToggle","wordcount","charcount","taTranslations","imgOnSelectAction","finishEdit","buttonGroup","fullButton","halfButton","quartButton","resetButton","floatLeft","floatRight","floatNone","aOnSelectAction","max-width","text-overflow","white-space","vertical-align","urlLink","prompt","extractYoutubeVideoId","taToolFunctions","gv","headerAction","blockJavascript","commonElement","possibleNodes","removeListElements","pe","prevElement","liElem","newElem","recursiveRemoveClass","imageLink","embed","urlPrompt","videoId","workingHTML","noOfWords","noOfChars","dndLists","MIME_TYPE","EDGE_MIME_TYPE","MSIE_MIME_TYPE","ALL_EFFECTS","filterEffects","effects","effectAllowed","effect","dndDisableIf","dndState","itemType","dndType","dropEffect","dndEffectAllowed","dndDraggable","effectsAllowed","_dndHandle","setDragImage","dndDragstart","dndCallback","none","dndDragend","dndSelected","dragDrop","childNode","placeholderNode","listSettings","getMimeType","getItemType","isDropAllowed","externalSources","allowedTypes","getDropEffect","ignoreDataTransfer","stopDragover","invokeCallback","getPlaceholderIndex","dndAllowedTypes","dndExternalSources","dndHorizontalList","listItemNode","isFirstHalf","dndDragover","dndDrop","dndList","dndInserted","newTarget","elementFromPoint","_dndPhShown","ngTouch","$TouchProvider","ngClickOverrideEnabled","ngClickDirectiveAdded","ngTouchClickDirectiveFactory","POINTER_EVENTS","getCoordinates","getEvents","pointerTypes","totalX","totalY","startCoords","lastPos","lastPreventedTime","touchCoordinates","lastLabelClickCoordinates","PREVENT_DURATION","CLICKBUSTER_THRESHOLD","ACTIVE_CLASS_NAME","checkAllowableRegions","onTouchStart","tapElement","touchStartX","touchStartY","tapping","resetState","makeSwipeDirective","$swipe","swipeHandler","validSwipe","wipImageZoomDirective","selectedModel","wipImageZoom","immersive","wipImageZoomConfig","evPosX","evPosY","trackerW","trackerH","trackerL","trackerT","maskW","maskH","zoomImgW","zoomImgH","lensW","lensH","lensPosX","lensPosY","zoomLevelRatio","defaultOpts","updateTimeout","large","mainImage","defaultIndex","initThumbs","updateThumbsPos","zoomEnable","initSizes","zoomTracker","cursor","lens","zoomLens","removeEventListeners","immersiveModeActive","immersiveMode","enableImmersiveMode","zoomStateEnable","zoomStateDisable","setZoomImagePosition","immersedImageOpt","immersiveModeOptions","immersedEl","thumbsWrapperWidth","thumbsWrapper","thumbWidth","thumbColPadding","thumbCol","thumbsWidth","maxPosX","thumbsPos","thumbsEl","scrollThumbs","newPosX","zoomMaskEl","boxW","boxH","zoomLevel","zoomImageEl","te","zoomActive","largeImageLoading","prevThumbActive","nextThumbActive","largeImageLoaded","updateMainImage","nextThumb","prevThumb","disableImmersiveMode","imageOnLoadDirective","imageOnLoad","boxPos","immersiveModeMessage","prevThumbButton","nextThumbButton","installedModules","__webpack_require__","moduleId","IBAN","parseIban","electronicFormat","isValidIban","iban","ngIban","printFormat","__WEBPACK_AMD_DEFINE_FACTORY__","__WEBPACK_AMD_DEFINE_RESULT__","thisArg","iso13616Prepare","iso7064Mod97_10","remainder","NON_ALPHANUM","Specification","countryCode","example","_regex","_cachedRegex","repeats","toBBAN","fromBBAN","bban","checkDigit","isValidBBAN","countries","addSpecification","EVERY_FOUR_CHARS","countryStructure","includeCheatSheet","useNgRoute","templateTitle","templateHeader","templateFooter","cheatSheetHotkey","cheatSheetDescription","mouseTrapEnabled","Hotkey","allowIn","persistent","_formated","Mousetrap","stopCallback","sequence","up","down","backspace","platform","helpMenu","boundScopes","hotkeys","helpVisible","toggleCheatSheet","purgeHotkeys","_del","_add","previousEsc","_get","preventIn","_callback","shouldExecute","wrapApply","retStatus","boundScope","scopeIndex","funcString","del","unpause","hotkeyAllowIn","hotkeyDescription","hotkeyAction","_REVERSE_MAP","_MAP","27","32","33","34","35","36","37","38","39","40","45","46","91","93","224","_KEYCODE_MAP","106","107","109","110","111","186","187","188","189","190","191","192","219","220","221","222","_SHIFT_MAP","!","@","#","^","&","(",")",":","<","?","|","_SPECIAL_ALIASES","mod","_addEvent","_characterFromEvent","_isModifier","_pickBestAction","modifiers","_getKeyInfo","combination","targetElement","_callbacks","_directMap","_resetTimer","_sequenceLevels","_ignoreNextKeyup","_ignoreNextKeypress","_nextExpectedAction","_resetSequences","doNotReset","activeSequences","_getMatches","sequenceName","deleteCombo","deleteSequence","seq","modifiers1","modifiers2","_fireCallback","cancelBubble","_handleKeyEvent","handleKey","_bindSequence","_increaseSequence","nextAction","_callbackAndReset","wrappedCallback","_bindSingle","_handleKey","maxLevel","processedSequenceCallback","ignoreThisKeypress","_bindMultiple","combinations","_belongsTo","documentMousetrap","quite","lineColor","textBaseline","fillText","toDataURL","calculateCode128","encodingById","weightByCharacter","encodingByChar","toStringTag","__esModule","SET_A","SET_B","SET_C","SHIFT","START_A","START_B","START_C","MODULO","STOP","FNC1","SET_BY_CODE","SWAP","101","99","A_START_CHAR","B_START_CHAR","C_START_CHAR","A_CHARS","B_CHARS","C_CHARS","BARS","SIDE_BIN","MIDDLE_BIN","BINARIES","O","EAN2_STRUCTURE","EAN5_STRUCTURE","EAN13_STRUCTURE","RangeError","shouldEncodeAsEan128","getBar","ean128","correctIndex","mod10","mod11","flat","guardHeight","textMargin","encodeFlat","encodeGuarded","leftEncode","leftText","rightEncode","rightText","flatEncoding","guardedEncoding","encodePair","START_BIN","END_BIN","flatMap","MULTI_SYMBOLS","getEncoding","symbolValue","SYMBOLS","getSymbol","fontOptions","textPosition","marginBottom","getTotalWidthOfEncodings","calculateEncodingAttributes","getBarcodePadding","getEncodingHeight","getMaximumHeightOfEncodings","measureText","barcodePadding","symbology","InvalidInputException","InvalidElementException","NoElementException","_renderProperties","_encodings","_errorHandler","getModule","wrapBarcodeCall","CODE128","afterRender","blank","_defaults","JsBarcode","CODE39","CODE128A","CODE128B","CODE128C","EAN13","EAN8","EAN5","EAN2","UPC","UPCE","ITF14","ITF","MSI","MSI10","MSI11","MSI1010","MSI1110","pharmacode","codabar","CODE93","CODE93FullASCII","GenericBarcode","mod43","getOwnPropertyDescriptor","lastChar","middleDigits","upcA","encodeMiddleDigits","getEncodings",".","\u0000","\u0001","\u0002","\u0003","\u0004","\u0005","\u0006","\u0007","\b","\t","\n","\u000b","\f","\r","\u000e","\u000f","\u0010","\u0011","\u0012","\u0013","\u0014","\u0015","\u0016","\u0017","\u0018","\u0019","\u001a","\u001b","\u001c","\u001d","\u001e","\u001f",",",";","=","\\","]","`","}","","HTMLCanvasElement","HTMLImageElement","CanvasRenderer","SVGElement","SVGRenderer","ObjectRenderer","prepareCanvas","encodings","drawCanvasBarcode","drawCanvasText","moveCanvasDrawing","restoreCanvas","prepareSVG","createGroup","setGroupOptions","drawSvgBarcode","drawSVGText","setSvgAttributes","drawRect","xmlDocument","handleCatch","Raven","_dereq_","RavenConfigError","wrapMethod","sentryLevel","originalConsoleLevel","originalConsole","safeJoin","logger","TraceKit","md5","isErrorEvent","isDOMError","isDOMException","isError","objectMerge","objectFrozen","hasKey","joinRegExp","urlencode","uuid4","htmlTreeAsString","isSameException","isSameStacktrace","supportsFetch","supportsReferrerPolicy","serializeKeysForMessage","serializeException","wrapConsoleMethod","dsnKeys","dsnPattern","_window","_navigator","keepOriginalCallback","_hasJSON","_hasDocument","_hasNavigator","_lastCapturedException","_lastData","_lastEventId","_globalServer","_globalKey","_globalProject","_globalContext","_globalOptions","release","SENTRY_RELEASE","ignoreErrors","ignoreUrls","whitelistUrls","includePaths","collectWindowErrors","captureUnhandledRejections","maxMessageLength","maxUrlLength","stackTraceLimit","autoBreadcrumbs","instrument","sampleRate","sanitizeKeys","_fetchDefaults","referrerPolicy","_ignoreOnError","_isRavenInstalled","_originalErrorStackTraceLimit","_originalConsole","_originalConsoleMethods","_plugins","_startTime","_wrappedBuiltIns","_breadcrumbs","_lastCapturedEvent","_keypressTimeout","_location","_lastHref","_resetBackoff","VERSION","dsn","globalOptions","_logDebug","setDSN","maxBreadcrumbs","autoBreadcrumbDefaults","sentry","instrumentDefaults","tryCatch","install","isSetup","report","subscribe","_handleOnErrorStackInfo","_attachPromiseRejectionHandler","_patchFunctionToString","_instrumentTryCatch","_instrumentBreadcrumbs","_drainPlugins","_parseDSN","lastSlash","_dsn","_globalSecret","pass","_getGlobalServer","_globalEndpoint","_before","__raven__","__raven_wrapper__","wrapped","_ignoreNextOnError","captureException","__orig__","uninstall","_detachPromiseRejectionHandler","_unpatchFunctionToString","_restoreBuiltIns","_restoreConsole","_promiseRejectionHandler","mechanism","trimHeadFrames","captureMessage","stacktrace","_getCaptureExceptionOptionsFromPlainObject","computeStackTrace","_handleStackInfo","ex1","currentOptions","exKeys","fingerprint","__serialized__","initialCall","fileurl","frames","_prepareFrames","_send","captureBreadcrumb","crumb","breadcrumbCallback","addPlugin","pluginArgs","setUserContext","setExtraContext","_mergeContext","setTagsContext","tags","clearContext","setEnvironment","environment","setRelease","setDataCallback","dataCallback","setBreadcrumbCallback","setShouldSendCallback","shouldSendCallback","setTransport","lastException","lastEventId","ravenNotConfiguredError","afterLoad","RavenConfig","showReportDialog","eventId","encodedOptions","globalServer","_triggerEvent","createEventObject","fireEvent","_breadcrumbEventHandler","evtName","_keypressEventHandler","_captureUrlChange","parsedLoc","parsedTo","parsedFrom","_originalFunctionToString","wrappedBuiltIns","wrapTimeFn","originalCallback","function","eventTargets","wrapEventTarget","handleEvent","keypressHandler","xhrproto","origOpen","__raven_xhr","status_code","origSend","onreadystatechangeHandler","wrapProp","origFetch","fetchInput","Request","oldOnPopState","consoleMethodCallback","hasPushAndReplaceState","replaceState","onpopstate","currentHref","historyReplacementFunction","origHistFunction","builtin","installer","allowSecretKey","stackInfo","_processException","lineno","frame","_normalizeFrame","in_app","stackInfoUrl","colno","prefixedMessage","transaction","_trimPacket","Referer","breadcrumbs","_trimBreadcrumbs","urlProp","urlProps","_getHttpData","httpData","User-Agent","referrer","_backoffDuration","_backoffStart","_shouldBackoff","_isRepeatData","_setBackoffState","baseData","serverName","server_name","_sanitizeData","_sendProcessedPayload","_getUuid","auth","allowDuplicates","event_id","sentry_version","sentry_client","sentry_key","sentry_secret","_makeRequest","onSuccess","onError","fetchOptions","evaluatedHeaders","evaluatedFetchParameters","_evaluateHash","fetchParameters","defaultFetchOptions","fetch","evaluated","setUser","setReleaseContext","RavenConstructor","_Raven","Client","Headers","Response","sources","htmlElementAsString","attrWhitelist","frames1","frames2","jsonSize","encodeURI","supportsErrorEvent","ErrorEvent","supportsDOMError","DOMError","supportsDOMException","supportsPromiseRejectionEvent","PromiseRejectionEvent","normalizedData","obj1","obj2","crypto","msCrypto","getRandomValues","Uint16Array","nextStr","sepLength","ex2","serializeObject","acc","usedKeys","safeInput","sanitizeRegExp","o_O","sanitizeWorker","workerInput","_oldOnerrorHandler","_onErrorHandlerInstalled","lastArgs","lastExceptionStack","_slice","ERROR_TYPES_RE","getLocationHref","notifyHandlers","isWindowError","traceKitWindowOnError","lineNo","colNo","augmentStackTraceWithInitialElement","processLastException","_lastExceptionStack","_lastArgs","rethrow","incomplete","computeStackTraceFromStackProp","submatch","sourceMapAddress","winjs","gecko","geckoEval","chromeEval","isNative","columnNumber","sourceMaps","partial","computeStackTraceByWalkingCallerChain","functionName","funcs","recursion","curr","lineNumber","unsubscribe","haystack","needle","serializer","cycleReplacer","thisPos","stringifyError","spaces","getSerialize","safeAdd","lsw","md5cmn","md5ff","md5gg","md5hh","md5ii","binlMD5","olda","oldb","oldc","oldd","binl2rstr","length32","rstr2binl","length8","rstr2hex","hexTab","str2rstrUTF8","unescape","rawMD5","rawHMACMD5","rstrHMACMD5","bkey","ipad","opad","mdDateRangePickerDirective","$mdDateRangePicker","selectedTemplate","selectedTemplateName","dateStart","dateEnd","showTemplate","localizationMap","customTemplates","disableTemplates","maxRange","onePanel","isDisabledDate","autoFocusDateStart","actionByKey","eventKey","eventParam","handleClickPrevMonth","runIfNotInDigest","handleClickNextMonth","handleClickDate","triggerChange","dates2","handleClickSelectToday","handleClickSelectYesterday","handleClickSelectThisWeek","handleClickSelectLastWeek","handleClickSelectThisMonth","handleClickSelectLastMonth","handleClickSelectThisYear","handleClickSelectLastYear","$dates","getSelectedDate","mdDateRangePickerCtrl","SELECTION_TEMPLATES","TD","getLocalizationVal","YD","TW","LW","TM","LM","TY","LY","START_OF_WEEK","SELECTION_TEMPLATES_CUSTOM","isMenuContainer","numberOfMonthToDisplay","lastDayOfMonth","activeDate","activeDate2","activeMonth","activeYear","activeMonth2","activeYear2","inCurrentMonth","isSecondMonth","isToday","getDateDiff","shouldConfirm","$date","selectedDateText","inSelectedDateRange","isSelectedStartDate","isSelectedEndDate","updateActiveDate","focusToDate","fillDateGrid","getFirstDayOfWeek","selectCustomRange","tmpltKey","tmpltObj","isInMaxRange","selectionTemplate","currTmpl","mctr","tmplKey","yctr","monthEndDate","firstDay","ctr","date1","date2","_d1","mdDateRangePickerService","mdDateRangePickerServiceModel","mdDateRangePickerServiceConfig","handleOnSelect","autoConfirm","isDisabledDateCallback","offlineQueue","setAccount","trackEvent","trackPages","trackPrefix","setDomainName","useDisplayFeatures","useAnalytics","useEnhancedLinkAttribution","useCrossDomainLinker","setCrossLinkDomains","setPageEvent","setCookieConfig","useECommerce","setCurrency","setRemoveRegExp","setExperimentId","ignoreFirstPageLoad","trackUrlParams","disableAnalytics","setHybridMobileSupport","startOffline","delayScriptTag","logAllCalls","enterTestMode","enterDebugMode","readFromRoute","J","pageTrack","affiliation","revenue","tax","shipping","coupon","T","_gaq","V","ga","K","_log","_createScriptTag","_registerScriptTags","_registerTrackers","_createAnalyticsScriptTag","GoogleAnalyticsObject","ga_debug","trace","crossDomainLinker","crossLinkDomains","displayFeatures","enhancedLinkAttribution","trackEcommerce","cookieConfig","cookieDomain","allowLinker","_ecommerceEnabled","_enhancedEcommerceEnabled","_trackPage","utm_source","utm_medium","utm_term","utm_content","utm_campaign","_trackEvent","nonInteraction","_addTrans","_addItem","sku","price","quantity","_trackTrans","_clearTrans","_addProduct","brand","variant","_addImpression","_addPromo","creative","_setAction","_trackTransaction","_trackRefund","_trackCheckOut","_trackDetail","_pageView","_trackCart","_promoClick","_productClick","_trackTimings","_trackException","exDescription","exFatal","doNotTrack","accounts","universalAnalytics","debugMode","domainName","ecommerce","enhancedEcommerce","experimentId","hybridMobileSupport","pageEvent","removeRegExp","testMode","traceDebuggingMode","trackRoutes","getUrl","_setCookieConfig","getCookieConfig","createAnalyticsScriptTag","createScriptTag","registerScriptTags","registerTrackers","offline","trackPage","addTrans","addItem","trackTrans","clearTrans","addProduct","addPromo","addImpression","productClick","promoClick","trackDetail","trackCart","trackCheckout","trackTimings","trackTransaction","trackException","setAction","pageView","gaTrackEvent","gaTrackEventIf","globalThis","echarts","extendStatics","__extends","firefox","newEdge","weChat","wxa","worker","svgSupported","touchEventsSupported","pointerEventsSupported","domSupported","transformSupported","transform3dSupported","hasGlobalWindow","wx","getSystemInfoSync","SVGRect","WebKitCSSMatrix","DEFAULT_FONT_SIZE","DEFAULT_FONT_FAMILY","DEFAULT_FONT","_ctx","_cachedFont","DEFAULT_TEXT_WIDTH_MAP","mapStr","platformApi","createCanvas","preCalcWidth","loadImage","Image","setPlatformAPI","newPlatformApis","BUILTIN_OBJECT","TYPED_ARRAY","objToString","arrayProto","nativeForEach","nativeFilter","nativeSlice","nativeMap","ctorFunction","protoFunction","protoKey","idStart","logError","typeStr","isDom","overwrite","targetProp","sourceProp","isBuiltInObject","mergeAll","targetAndSources","keysArr","baseClazz","clazzPrototype","mixin","override","keyList","memo","curry","isStringSafe","isTypedArray","isGradientObject","colorStops","isImagePatternObject","eqNaN","retrieve","retrieve2","retrieve3","normalizeCssArray","primitiveKey","setAsPrimitive","MapPolyfill","existed","isNativeMapSupported","Map","HashMap","removeKey","isArr","thisMap","createHashMap","concatArray","newArray","createObject","StyleCtor","disableUserSelect","domStyle","webkitUserSelect","userSelect","webkitTapHighlightColor","RADIAN_TO_DEGREE","freeze","clone$1","scaleAndAdd","lenSquare","distanceSquare","distSquare","lerp","applyTransform","lengthSquare","mul","topTarget","Draggable","_dragStart","draggingTarget","draggable","__hostTarget","_draggingTarget","dispatchToElement","_drag","dropTarget","lastDropTarget","drift","findHover","_dropTarget","_dragEnd","Eventful","_$handlers","eventProcessor","_$eventProcessor","normalizeQuery","callAtLast","zrEventfulCallAtLast","lastWrap","isSilent","newList","argLen","hItem","afterTrigger","triggerWithContext","eventProcessors","rank","rowStart","rowMask","colMask","detCache","colStart","fullRank","subRowMask","subRowStart","colLocalIdx","colTag","buildTransformer","mA","det","vh","srcPointX","srcPointY","pk","EVENT_SAVED_PROP","_calcOut","transformCoordWithViewport","inX","inY","isCanvasEl","transformerName","oldSrcCoords","srcCoords","destCoords","oldCoordTheSame","propLR","propTB","stl","idxLR","idxTB","replaceReg","replaceMap","encodeHTML","MOUSE_EVENT_REG","_calcOut$1","firefoxNotSupportOffsetXY","clientToLocal","calculate","calculateZrXY","zrX","zrY","getNativeEvent","normalizeEvent","rawWheelDelta","zrDelta","isMiddleOrRightButtonOnMouseUpDown","GestureMgr","recognize","_doTrack","_recognize","_track","trackItem","recognizers","gestureInfo","dist$1","pointPair","pinch","tracks","pinchEnd","trackLen","pinchPre","pinchScale","pinchCenter","pinchX","pinchY","create$1","copy$1","mul$1","out0","out1","out2","out3","out4","out5","rad","pivot","atx","ad","aty","st","scale$1","vx","vy","clone$2","scalar","fromArray","onet","mathMin","mathMax","lb","rt","minTv","maxTv","BoundingRect","calculateTransform","mtv","dMin","dMax","ax0","ax1","ay0","ay1","bx0","bx1","by0","by1","overlap","contain","plain","ty","SILENT","stopEvent","EmptyProxy","_super","setCursor","HoveredResult","handlerNames","tmpRect","Handler","setHandlerProxy","isOutside","isOutsideBoundary","lastHovered","_hovered","lastHoveredTarget","__zr","hoveredTarget","eventControl","zrEventControl","painter","setCursorStyle","cursorStyle","targetInfo","silent","eventPacket","gestureEvent","zrByTouch","eachOtherLayer","exclude","getDisplayList","setHoverTarget","_pointerSize","pointerSize","targetSizeHalf","pointerRect","ignoreCoarsePointer","getBoundingRect","thetaStep","PI2","processGesture","_gestureMgr","gestureMgr","painterRoot","_draggingMgr","hoverCheckResult","displayable","rectHover","ignoreClip","hostEl","handlerInstance","getWidth","getHeight","_downEl","_downPoint","_upEl","DEFAULT_MIN_MERGE","DEFAULT_MIN_GALLOPING","makeAscendingRun","runHi","reverseRun","binaryInsertionSort","gallopLeft","hint","lastOffset","gallopRight","TimSort","runStart","runLength","minGallop","stackSize","mergeAt","start1","length1","start2","length2","mergeLow","cursor1","cursor2","count1","count2","_minGallop","mergeHigh","customCursor","customDest","mergeRuns","forceMergeRuns","pushRun","_runStart","_runLength","minRun","REDRAW_BIT","SHAPE_CHANGED_BIT","invalidZErrorLogged","logInvalidZError","shapeCompareFunc","zlevel","z2","traverse","_roots","includeIgnore","displayList","_displayList","updateDisplayList","_displayListLen","roots","_updateAndAddDisplayable","clipPaths","afterUpdate","userSetClipPath","currentClipPath","parentClipPath","updateTransform","childrenRef","__dirty","disp","__clipPaths","decalEl","getDecalElement","textGuide","getTextGuideLine","textEl","getTextContent","addRoot","delRoot","delAllRoots","getRoots","displayableSortFunc","requestAnimationFrame$1","msRequestAnimationFrame","mozRequestAnimationFrame","easingFuncs","quadraticIn","quadraticOut","quadraticInOut","cubicIn","cubicOut","cubicInOut","quarticIn","quarticOut","quarticInOut","quinticIn","quinticOut","quinticInOut","sinusoidalIn","sinusoidalOut","sinusoidalInOut","exponentialIn","exponentialOut","exponentialInOut","circularIn","circularOut","circularInOut","elasticIn","elasticOut","elasticInOut","backIn","backOut","backInOut","bounceIn","bounceOut","bounceInOut","mathPow","mathSqrt","EPSILON","EPSILON_NUMERIC","THREE_SQRT","ONE_THIRD","_v0","_v1","_v2","isAroundZero","isNotAroundZero","cubicAt","cubicDerivativeAt","cubicRootAt","disc","Y2","discSqrt","ASqrt","cubicExtrema","extrema","cubicSubdivide","p01","p12","p23","p012","p123","p0123","cubicProjectPoint","quadraticAt","quadraticDerivativeAt","quadraticExtremum","divider","quadraticSubdivide","quadraticProjectPoint","createCubicEasingFunc","cubicEasingStr","roots_1","a_1","b_1","c_1","d_1","Clip","globalTime","deltaTime","_inited","_delay","_paused","life","_life","_pausedTime","easingFunc","schedule","onframe","loop","onrestart","setEasing","ondestroy","Entry","LinkedList","insertEntry","_len","LRU","leastUsedEntry","_map","_lastRemovedEntry","_maxSize","kCSSColorTable","transparent","clampCssByte","clampCssFloat","parseCssInt","parseCssFloat","cssHueToRgb","lerpNumber","setRgba","copyRgba","colorCache","lastRemovedArr","putToCache","colorStr","rgbaArr","strLen","iv","op","ep","fname","hsla2rgba","hsla","lift","colorArr","fastLerp","normalizedValue","leftIndex","leftColor","dv","rightIndex","rightColor","fastMapToColor","lerp$1","fullOutput","mapToColor","modifyHSL","vMax","deltaR","deltaG","deltaB","vMin","modifyAlpha","arrColor","lum","backgroundLum","liftedColorCache","liftColor","liftedColor","toHex","mathRound","normalizeColor","isAroundZero$1","round3","round4","TEXT_ALIGN_TO_ANCHOR","middle","isImagePattern","isPattern","svgElement","isLinearGradient","isRadialGradient","isGradient","getIdURL","getPathPrecision","getGlobalScale","getSRTTransformString","skewX","skewY","encodeBase64","btoa","Buffer","arraySlice","interpolate1DArray","add1DArray","add2DArray","len2","cloneValue","rgba2String","isGradientValueType","valType","isArrayValueType","tmpRgba","Track","isFinished","_finished","setFinished","_additiveTrack","needsAnimate","keyframes","getAdditiveTrack","addKeyframe","rawValue","_needsSort","kf","arrayDim","colorArray","parsedGradient","colorStop","maxTime","additiveTrack","kfs","kfsLen","lastKf","isDiscrete","arr1Len","arr1","arr0","arrDim","val0","fillArray","arr0Len","shorterArr","len1","len0","fillColorStops","shorterLen","startValue","additiveValue","nextFrame","nextVal_1","isAdditive","valueKey","kfsNum","isValueColor","lastFrame","_lastFr","frameIdx","_lastFrP","targetArr","_additiveValue","isLinearGradient_1","nextColorStop","_addToTarget","_invalid","Animator","getMaxTime","_maxTime","getDelay","getLoop","_loop","changeTarget","whenWithKeys","propNames","_tracks","lastFinalKf","_getAdditiveTrack","addtiveTrackKfs","_trackKeys","_clip","isPaused","_force","_doneCallback","_setTracksFinished","doneList","_doneCbs","_abortedCallback","abortedList","_abortedCbs","removeClip","tracksKeys","trackName","additiveAnimators","_additiveAnimators","getTrack","_started","_allowDiscrete","stillHasAdditiveAnimator","onframeList","_onframeCbs","addClip","forwardToLast","during","aborted","getClip","getTracks","stopTracks","allAborted","saveTo","trackKeys","firstOrLast","__changeFinalValue","finalProps","allowDiscreteAnimation","additiveTo","_head","_tail","addAnimator","removeAnimator","notTriggerFrameAndStageUpdate","_time","nextClip","_startLoop","_running","_pauseStart","pointerEventNameMap","globalEventSupported","localNativeListenerNames","pointerup","pointermove","pointerout","mouseHandlerNames","nm","globalNativeListenerNames","wheelEventSupported","isPointerFromTouch","markTouch","isLocalEl","elTmp","domBelongToZr","FakeGlobalEvent","localDOMHandlers","__mayPointerCapture","downPoint","__togglePointerCapture","__pointerCapturing","mousewheel","__lastTouchMoment","globalDOMHandlers","pointerCaptureReleasing","mountLocalDOMEventListeners","domHandlers","nativeEventName","mountSingleDOMEventListener","touching","touchTimer","mountGlobalDOMEventListeners","mount","mounted","listenerOpts","domTarget","unmountDOMEventListeners","DOMHandlerScope","HandlerDomProxy","_localHandlerScope","_globalHandlerScope","isPointerCapturing","globalHandlerScope","dpr","devicePixelRatio","deviceXDPI","logicalXDPI","mIdentity","isNotAroundZero$1","scaleTmp","tmpTransform","originTransform","Transformable","getLocalTransform","setPosition","setScale","setSkew","setOrigin","originX","originY","needLocalTransform","parentTransform","_resolveGlobalScaleRatio","invTransform","relX","globalScaleRatio","relY","getComputedTransform","transformNode","setLocalTransform","shearX","decomposeTransform","transformCoordToLocal","transformCoordToGlobal","getLineScale","copyTransform","anchorX","anchorY","initDefaultProps","TRANSFORMABLE_PROPS","textWidthCache","cacheOfFont","innerGetBoundingRect","getLineHeight","adjustTextX","adjustTextY$1","textLines","uniondRect","verticalAlign","parsePercent","calculateTextPosition","halfHeight","textVerticalAlign","elProto","PRESERVED_NORMAL_STATE","PRIMARY_STATES_KEYS","DEFAULT_ANIMATABLE_MAP","tmpTextPosCalcRes","tmpBoundingRect","_init","markRedraw","updateInnerText","forceUpdate","innerTransformable","textStyleChanged","textOffset","isInside","innerTextDefaultStyle","textFill","textStroke","autoStroke","_textContent","textConfig","innerOrigin","layoutRect","textOrigin","relOriginY","relOriginX","_innerTextDefaultStyle","canBeInsideText","insideFill","insideStroke","getInsideTextFill","getInsideTextStroke","outsideFill","outsideStroke","getOutsideFill","getOutsideStroke","stroke","setDefaultTextStyle","dirtyStyle","isDarkMode","getBackgroundColor","attrKV","setTextConfig","setTextContent","setClipPath","keyOrObj","saveCurrentToNormalState","_innerSaveToNormal","normalState","_normalState","fromStateTransition","__fromStateTransition","targetName","_savePrimaryToNormal","primaryKeys","hasState","currentStates","getState","ensureState","clearStates","noAnimation","useState","keepCurrentStates","forceUseHoverLayer","toNormalState","hasStates","animationCfg","stateTransition","stateProxy","useHoverLayer","hoverLayer","_toggleHoverLayerFlag","_applyStateObj","__inHover","_textGuide","_updateAnimationTargets","useStates","stateObjects","notChange","stateObj","lastStateObj","mergedState","_mergeStates","removeState","forceAdd","newStateExists","toggleState","mergedTextConfig","needsRestoreToNormal","transitionTarget","hasTransition","propNeedsTransition","_transitionState","_attachComponent","componentEl","zr","addSelfToZr","_detachComponent","removeSelfFromZr","_clipPath","removeClipPath","previousTextContent","removeTextContent","removeTextConfig","setTextGuideLine","removeTextGuideLine","refreshHover","inHover","updateDuringAnimation","wakeUp","stopAnimation","leftAnimators","animationProps","getPaintRect","isGroup","createLegacyProperty","logDeprecatedError","yKey","privateKey","enhanceArray","animatable","doneCb","doneHappened","finishCount","cfgDone","cfgAborted","abortedCb","animateToShallow","topKey","animateObj","setToFinal","animateAll","existsAnimators","animationKeys","innerKey","targetVal","keyLen","isValueSame","revertedSource","reversedTarget","sourceClone","copyValue","copyArrShallow","sourceArr","Group","childAt","childOfName","_doAdd","addBefore","oldChild","newChild","replaceAt","eachChild","includeChildren","tmpMat","childRect","invisible","painterCtors","ZRender","_disposed","configLayer","zLevel","setBackgroundColor","_backgroundColor","_darkMode","totalLum","setDarkMode","darkMode","refreshImmediately","fromInside","_needsRefresh","_flush","triggerRendered","_needsRefreshHover","refreshHoverImmediately","_stillFrameAccum","_sleepAfterStill","setSleepAfterStill","stillFramesCount","clearAnimation","ssrDataGetter","rendererType","useDirtyRect","ssrMode","ssr","ssrOnly","handlerProxy","getViewportRoot","useCoarsePointer","registerPainter","getElementSSRData","registerSSRDataGetter","zrender","disposeAll","ROUND_SUPPORTED_PRECISION_MAX","linearMap","subDomain","parsePercent$1","returnStr","asc","getPrecision","getPrecisionSafe","eIndex","significandPartLen","dotIndex","getPixelPrecision","dataExtent","pixelExtent","dataQuantity","sizeQuantity","getPercentSeats","valueList","votesPerQuota","targetSeats","seats","votes","currentSum","NEGATIVE_INFINITY","maxId","seat","MAX_SAFE_INTEGER","remRadian","radian","pi2","isRadianAroundZero","TIME_REG","quantityExponent","exp10","nf","ascArr","reformIntervals","littleThan","currClose","close_1","numericToNumber","valFloat","getRandomIdBase","getLeastCommonMultiple","getGreatestCommonDividor","ECHARTS_PREFIX","storedLogs","hasConsole","outputLog","onlyOnce","deprecateLog","deprecateReplaceLog","oldOpt","newOpt","makePrintable","hintInfo","makePrintableStringIfPossible_1","printableStr","interpolateNumber$1","DUMMY_COMPONENT_NAME_PREFIX","INTERNAL_COMPONENT_ID_PREFIX","normalizeToArray","defaultEmphasis","subOpts","emphasis","subOptName","TEXT_STYLE_OPTIONS","getDataItemValue","dataItem","mappingToExists","existings","newCmptOptions","existingIdIdxMap","brandNew","idMap","isNormalMergeMode","isReplaceMergeMode","isReplaceAllMode","cmptOption","isValidIdOrName","warnInvalidateIdOrName","isComponentIdInternal","keyInfo","optionId","existingIdx","resultItem","makeComparableKey","keyExistAndEqual","nextIdx","mapResult","idNum","key1","convertOptionIdName","key2","idOrName","isNameSpecified","componentModel","setComponentTypeToKeyInfo","mappingResult","mainType","componentModelCtor","subType","newCmptOption","existComponent","determineSubType","queryDataIndex","payload","dataIndexInside","dataIndex","indexOfRawIndex","indexOfName","makeInner","innerUniqueIndex","hostObj","parseFinder","ecModel","finderInput","preParseFinder","mainTypeSpecified","queryOptionMap","others","defaultMainType","queryOption","queryReferringComponents","useDefault","enableAll","enableNone","finder","parsedKey","queryType","includeMainTypes","SINGLE_REFERRING","MULTIPLE_REFERRING","userOption","indexOption","idOption","nameOption","queryComponents","firstCmpt","getComponent","buckets","interpolateRawValues","sourceValue","isAutoPrecision","leftArr","rightArr","length_1","rightVal","getDimensionInfo","leftVal","TYPE_DELIMITER","IS_CONTAINER","IS_EXTENDED_CLASS","parseClassType","componentType","typeArr","enableClassExtend","rootClz","mandatoryMethods","$constructor","ExtendedClass","class_1","superCall","superApply","mountExtend","SubClz","SupperClz","classBase","enableClassManagement","registerClass","clz","componentFullType","componentTypeInfo","___EC__COMPONENT__CONTAINER___","throwWhenNotFound","getClassesByMainType","getAllClassMainTypes","hasSubTypes","makeStyleMapper","ignoreParent","excludes","getShallow","getAreaStyle","AreaStyleMixin","globalImageCache","createOrUpdateImage","newImageOrSrc","cbPayload","__zrImageSrc","pendingWrap","cachedImgObj","isImageReady","__cachedImgObj","STYLE_REG","truncateText2","ellipsis","isTruncated","prepareTruncateOptions","truncateOut","truncateSingleLine","textLine","preparedOpts","minChar","ascCharWidth","cnCharWidth","ellipsisWidth","lineWidth","subLength","RichTextToken","RichTextLine","RichTextContentBlock","outerHeight","parseRichText","contentBlock","topWidth","topHeight","wrapInfo","accumWidth","breakAll","matchedIndex","pushTokens","pendingList","calculatedHeight","calculatedWidth","stlPadding","truncateLine","lineOverflow","tmpTruncateOut","tokenStyle","rich","textPadding","paddingH","tokenHeight","originalLength","finishLine","remainTruncWidth","styleTokenWidth","tokenWidthNotSpecified","percentWidth","bgImg","textBackgroundColor","truncateMinChar","strLines","linesWidths","isEmptyStr","newLine","tokenPaddingH","tokenPadding","outerWidth_1","wrapText","tokensLen","isLineHolder","breakCharMap","isBreakAll","lastAccumWidth","currentWord","currentWordWidth","chWidth","inWord","STYLE_MAGIC_KEY","DEFAULT_COMMON_STYLE","shadowBlur","shadowOffsetX","shadowOffsetY","shadowColor","blend","DEFAULT_COMMON_ANIMATION_PROPS","PRIMARY_STATES_KEYS$1","PRIMARY_STATES_KEYS_IN_HOVER_LAYER","Displayable","useStyle","beforeBrush","afterBrush","innerBeforeBrush","innerAfterBrush","shouldBePainted","viewWidth","viewHeight","considerClipPath","considerAncestors","tmpRect$1","viewRect","isZeroArea","parent_1","rectContain","coord","elRect","shadowSize","tolerance","_paintRect","dirtyRectTolerance","setPrevPaintRect","paintRect","_prevPaintRect","getPrevPaintRect","animateStyle","targetKey","setStyle","notRedraw","_rect","styleChanged","styleUpdated","createStyle","__hoverStyle","isStyleObject","_mergeStyle","targetStyle","sourceStyle","changedKeys","getAnimationStyleProps","statesKeys","mergedStyle","dispProto","incremental","mathMin$1","mathMax$1","mathSin","mathCos","extremity","fromPoints","fromLine","xDim","yDim","CMD","Q","tmpOutX","tmpOutY","min$1","max$1","min2","max2","mathMin$2","mathMax$2","mathCos$1","mathSin$1","PI2$1","hasTypedArray","Float32Array","tmpAngles","modPI2","normalizeArcAngles","angles","anticlockwise","newStartAngle","newEndAngle","PathProxy","increaseVersion","_version","segmentIgnoreThreshold","_ux","_uy","setDPR","setContext","beginPath","_saveData","_pathSegLen","_pathLen","_drawPendingPt","addData","_x0","_y0","_xi","_yi","exceedUnit","_pendingPtDist","_pendingPtX","_pendingPtY","bezierCurveTo","quadraticCurveTo","arcTo","toStatic","appendPath","appendSize","appendPathData","cmd","_expandData","cubicAt$1","cubicExtrema$1","fromCubic","quadraticAt$1","quadraticExtremum$1","vec2Max","vec2Min","_calculateLength","ux","uy","pathSegLen","pathTotalLen","segCount","rebuildPath","displayedLength","pendingPtX","pendingPtY","drawPart","accumLength","pendingPtDist","psi","isEllipse","breakBuild","ellipse","newProxy","notSaveData","containStroke","containStroke$2","PI2$2","normalizeRadian","PI2$3","windingLine","CMD$1","PI2$4","EPSILON$3","windingCubic","nRoots","nExtrema","y0_","windingQuadratic","containPath","isStroke","dTheta","tmp_1","DEFAULT_PATH_STYLE","strokePercent","strokeOpacity","lineDashOffset","lineCap","miterLimit","strokeNoScale","strokeFirst","DEFAULT_PATH_ANIMATION_PROPS","pathCopyParams","Path","decal","_decalEl","decalElStyle","buildPath","defaultStyle","getDefaultShape","getDefaultStyle","hasFill","fillLum","pathFill","shapeCfg","inBatch","pathUpdated","getUpdatedPathProxy","createPathProxy","hasStroke","rectStroke","lineScale","needsUpdateRect","firstInvoke","_rectStroke","strokeContainThreshold","localPos","pathProxy","dirtyShape","animateShape","setShape","shapeChanged","targetShape","targetShapePrimaryProps","shapeKeys","mergedShape","defaultProps","Sub","pathProto","subPixelOptimize","autoBatch","DEFAULT_TSPAN_STYLE","TSpan","setBoundingRect","tspanProto","DEFAULT_IMAGE_STYLE","DEFAULT_IMAGE_ANIMATION_PROPS","sHeight","ZRImage","_getSize","otherDimSize","imageSource","__image","otherDim","round$1","subPixelOptimizeLine","outputShape","inputShape","subPixelOptimizeRect","originWidth","originHeight","positiveOrNegative","doubledPosition","RectShape","subPixelOptimizeOutputShape","Rect","r3","r4","optimizedShape","DEFAULT_RICH_TEXT_COLOR","DEFAULT_TEXT_ANIMATION_PROPS","textShadowColor","textShadowBlur","textShadowOffsetX","textShadowOffsetY","borderWidth","ZRText","_updateSubTexts","_childCursor","normalizeStyle","_updateRichTexts","_updatePlainTexts","defaultTextStyle","_defaultStyle","sourceRich","targetRich","_mergeRich","richNames","richName","_getOrCreateChild","boxX","textFont","calculatedLineHeight","bgColorDrawn","truncateLineOverflow","lineCount","singleOut","getStyleText","needDrawBg","needDrawBackground","baseX","baseY","textX","defaultLineWidth","boxY","_renderBackground","getTextXForPadding","useDefaultFill","getFill","hasShadow","fixedBoundingRect","subElStyle","lineDash","setSeparateFont","xLeft","lineTop","xRight","tokenCount","remainedWidth","lineXLeft","lineXRight","_placeToken","parentBgColorDrawn","topStyle","rectEl","imgEl","imgStyle","rectStyle","textBorderWidth","textBorderColor","isImageBg","isPlainOrGradientBg","textBorderRadius","commonStyle","rectShape","borderDash","borderDashOffset","makeFont","hasSeparateFont","fontStyle","parseFontSize","fontFamily","VALID_TEXT_ALIGN","VALID_TEXT_VERTICAL_ALIGN","FONT_PARTS","fontProp","setCommonECData","dataIdx","ecData","getECData","ssrType","childECData","_highlightNextDigit","_highlightKeyMap","getSavedStates","getComponentStates","HOVER_STATE_NORMAL","HOVER_STATE_BLUR","HOVER_STATE_EMPHASIS","SPECIAL_STATES","DISPLAY_STATES","HIGHLIGHT_ACTION_TYPE","DOWNPLAY_ACTION_TYPE","SELECT_ACTION_TYPE","UNSELECT_ACTION_TYPE","TOGGLE_SELECT_ACTION_TYPE","hasFillOrStroke","fillOrStroke","doChangeHoverState","hoverStateEnum","onHoverStateChange","hoverState","singleEnterEmphasis","singleLeaveEmphasis","singleEnterBlur","singleLeaveBlur","singleEnterSelect","singleLeaveSelect","updateElementState","updater","commonParam","traverseUpdateState","setStatesFlag","createBlurDefaultState","hasBlur","currentOpacity","fromState","toStateName","blurStyle","elementStateProxy","targetStates","emphasisStyle","z2EmphasisLift","cloned","hasSelect","fromFill","selectFill","normalFill","fromStroke","selectStroke","normalStroke","z2SelectLift","setDefaultStateProxy","enterEmphasisWhenMouseOver","shouldSilent","__highByOuter","leaveEmphasisWhenMouseOut","enterEmphasis","highlightDigit","leaveEmphasis","enterBlur","leaveBlur","enterSelect","leaveSelect","__highDownSilentOnTouch","allLeaveBlur","getModel","leaveBlurredSeries","allComponentViews","eachComponent","componentStates","isSeries","getViewOfSeriesModel","getViewOfComponentModel","isBlured","toggleBlurSeries","blurSeries","targetSeriesIndex","blurScope","targetSeriesModel","targetCoordSys","blurredSeries","leaveBlurOfIndices","dataIndices","itemEl","getItemGraphicEl","getSeriesByIndex","coordinateSystem","eachSeries","seriesModel","sameSeries","coordSys","sameCoordSys","blurComponent","componentMainType","componentIndex","focusBlurEnabled","findComponentHighDownDispatchers","focusSelf","dispatchers","findHighDownDispatchers","isHighDownDispatcher","updateSeriesElementSelection","getAllData","eachItemGraphicEl","enableHoverEmphasis","setAsHighDownDispatcher","enableHoverFocus","toggleHoverEmphasis","OTHER_STATES","defaultStyleGetterMap","itemStyle","lineStyle","areaStyle","setStatesStylesFromModel","itemModel","styleType","asDispatcher","extendedEl","highDownSilentOnTouch","__highDownDispatcher","isSelectChangePayload","payloadType","isHighDownPayload","CMD$2","mathSqrt$1","mathAtan2","transformPath","p_1","mathSqrt$2","mathSin$2","mathCos$2","PI$1","vMag","vRatio","vAngle","processArc","fa","fs","psiDeg","lambda","cxp","cyp","commandReg","numberReg","SVGPath","isPathProxy","createPathOptions","prevCmd","cpx","cpy","subpathX","subpathY","cmdList","cmdText","cmdStr","pLen","ctlPtx","ctlPty","pathData","innerOpts","createFromString","clonePath","bakeTransform","toLocal","CircleShape","Circle","EllipseShape","Ellipse","PI$2","PI2$5","mathSin$3","mathCos$3","mathACos","mathATan2","mathAbs$1","mathSqrt$3","mathMax$3","mathMin$3","computeCornerTangents","clockwise","x11","y11","x10","y10","buildPath$1","icrStart","icrEnd","ocrStart","ocrEnd","ocrMax","icrMax","xrs","yrs","xire","yire","limitedOcrMax","limitedIcrMax","xre","yre","xirs","yirs","ocrs","ocre","icrs","icre","crStart","crEnd","ct0","ct1","hasRadius","halfRd","it_1","dy32","dx10","dx32","dy10","SectorShape","Sector","RingShape","Ring","buildPath$2","smooth","controlPoints","isLoop","constraint","prevPoint","cps","cp0","smoothConstraint","PolygonShape","PolylineShape","Polyline","subPixelOptimizeOutputShape$1","LineShape","Line","pointAt","BezierCurveShape","cpx1","cpy1","someVectorAt","isTangent","cpx2","cpy2","BezierCurve","tangentAt","ArcShape","Arc","unitX","unitY","CompoundPath","_updatePathDirty","dirtyPath","Gradient","addColorStop","LinearGradient","globalCoord","RadialGradient","extent2","minTv$1","maxTv$1","OrientedBoundingRect","fromBoundingRect","corners","_corners","_axes","_origin","overlapped","noMtv","_intersectCheckOneSide","_getProjMinMaxOnAxis","dist0","dist1","proj","proj_1","IncrementalDisplayable","getCursor","_cursor","_displayables","clearDisplaybles","_temporaryDisplayables","notClear","clearTemporalDisplayables","addDisplayable","notPersistent","addDisplayables","displayables","getDisplayables","getTemporalDisplayables","eachPendingDisplayable","transitionStore","getAnimationConfig","animationType","animatableModel","extraOpts","extraDelayParams","animationPayload","updatePayload","getUpdatePayload","isUpdate","isAnimationEnabled","animateOrSetProps","isFrom","isRemove","removeOpt","getAnimationDelayParams","animateConfig","updateProps","initProps","isElementRemoved","removeElement","fadeOutDisplayable","removeElementWithFadeOut","doRemove","saveOldStyle","oldStyle","mathMax$4","mathMin$4","_customShapeMap","extendShape","extendPathFromString","extendPath","registerShape","ShapeClass","getShapeClass","makePath","centerGraphic","resizePath","makeImage","imageUrl","zrImg","img","boundingRect","aspect","mergePath$1","pathEls","pathList","pathEl","pathBundle","subPixelOptimizeLine$1","subPixelOptimize$1","mat","applyTransform$1","invert$1","transformDirection","hBase","vBase","isNotGroup","groupTransition","g1","g2","elMap1","elMap","getAnimatableProps","anid","oldEl","newProp","clipPointsByRect","clipRectByRect","createIcon","iconStr","linePolygonIntersect","a1x","a1y","a2x","a2y","lineLineIntersect","b1x","b1y","b2x","b2y","b1a1x","nmCrossProduct","b1a1y","setTooltipConfig","itemTooltipOption","itemTooltipOptionObj","formatterParams","$vars","formatterParamsExtra","tooltipConfig","encodeHTMLContent","traverseElement","traverseElements","graphic","mergePath","Text","EMPTY_OBJ","labelTexts","oldStates","stateModels","baseText","labelFetcher","labelDataIndex","labelDimIndex","normalModel","statesText","getFormattedLabel","stateModel","setLabelStyle","labelStatesModels","stateSpecified","isSetOnText","needsCreateText","labelStatesTexts","showNormal","normalStyle","createTextStyle","createTextConfig","stateShow","enableTextSetter","labelInner","getLabelStatesModels","labelName","statesModels","textStyleModel","specifiedTextStyle","isNotNormal","richTextStyle","textStyle","richResult","globalTextStyle","richItemNames","richItemNameMap","richKeys","richKey","parentModel","name_1","setTokenTextStyle","labelRotate","labelDistance","labelOffset","labelPosition","defaultOutsidePosition","inheritColor","TEXT_PROPS_WITH_GLOBAL","TEXT_PROPS_SELF","TEXT_PROPS_BOX","isBlock","inRich","fillColor","strokeColor","textBorderType","textBorderDashOffset","defaultOpacity","baseline","disableBox","borderType","getFont","gTextStyleModel","setLabelValueAnimation","getDefaultText","prevValue","normalLabelModel","valueAnimation","defaultInterpolatedText","animateLabelValue","labelInnerStore","PATH_COLOR","textStyleParams","tmpText","TextStyleMixin","getTextColor","isEmphasis","LINE_STYLE_KEY_MAP","getLineStyle","LineStyleMixin","ITEM_STYLE_KEY_MAP","getItemStyle","ItemStyleMixin","Model","mergeOption","_doGet","parsePath","hasPath","pathFinal","resolveParentPath","restoreData","pathArr","classAttr","isInstance","getUID","inheritDefaultOption","superOption","subOption","LOCALE_ZH","LOCALE_EN","DEFAULT_LOCALE","localeStorage","localeModels","SYSTEM_LANG","browserLanguage","registerLocale","localeObj","getLocaleModel","monthAbbr","dayOfWeekAbbr","toolbox","lineX","lineY","dataView","dataZoom","magicType","tiled","saveAsImage","typeNames","effectScatter","radar","candlestick","heatmap","sankey","funnel","pictorialBar","themeRiver","general","withoutTitle","withName","withoutName","partialData","ONE_SECOND","ONE_MINUTE","ONE_HOUR","ONE_DAY","ONE_YEAR","defaultLeveledFormatter","fullDayFormatter","fullLeveledFormatter","primaryTimeUnits","timeUnits","getPrimaryTimeUnit","timeUnit","fullYearGetterName","monthGetterName","dateGetterName","hoursGetterName","minutesGetterName","secondsGetterName","millisecondsGetterName","timeModel","getUnitFromValue","isSecond","isMinute","isHour","isDay","isMonth","getUnitValue","monthSetterName","dateSetterName","hoursSetterName","minutesSetterName","secondsSetterName","millisecondsSetterName","addCommas","toCamelCase","upperCaseFirst","group1","normalizeCssArray$1","makeValueReadable","valueType","useUTC","stringToUserReadable","isNumberUserReadable","isTypeTime","isValueDate","numericResult","wrapVar","varName","seriesIdx","TPL_VAR_ALIAS","formatTpl","paramsList","seriesLen","getTooltipMarker","inOpt","extraCssText","renderMode","convertToColorString","windowOpen","each$1","LOCATION_PARAMS","HV_NAMES","boxLayout","gap","currentLineMaxSize","moveY","nextY","nextChild","nextChildRect","moveX","newline","getLayoutRect","positionInfo","verticalMargin","horizontalMargin","positionElement","hv","boundingMode","fetchLayoutMode","ins","layoutMode","mergeLayoutParam","targetOption","ignoreSize","hResult","vResult","hvIdx","newValueCount","mergedValueCount","hasProp","getLayoutParams","copyLayoutParams","subTypeDefaulters","dependencyGetter","ComponentModel","mergeDefaultAndTheme","inputPositionParams","getDefaultOption","optionUpdated","newCptOption","isInit","defaultOption","optList","getReferringComponents","idKey","getBoxLayoutParams","getZLevelKey","setZLevel","protoInitialize","createDependencyGraphItem","predecessor","successor","registerSubTypeDefaulter","defaulter","componentTypeMain","deps","topologicalTravel","targetNameList","fullNameList","noEntryList","availableDeps","thisItem","originalDeps","entryCount","dependentName","thatItem","targetNameSet","currComponentType","currVertex","isInTargetNameSet","removeEdgeAndAdd","removeEdge","errMsg","succComponentType","decalColor","globalDefault","colorBy","gradientColor","decals","dashArrayX","dashArrayY","symbolSize","blendMode","stateAnimation","animationDurationUpdate","animationEasing","animationEasingUpdate","animationThreshold","progressiveThreshold","progressive","hoverLayerThreshold","VISUAL_DIMENSIONS","SOURCE_FORMAT_ORIGINAL","SOURCE_FORMAT_ARRAY_ROWS","SOURCE_FORMAT_OBJECT_ROWS","SOURCE_FORMAT_KEYED_COLUMNS","SOURCE_FORMAT_TYPED_ARRAY","SOURCE_FORMAT_UNKNOWN","SERIES_LAYOUT_BY_COLUMN","SERIES_LAYOUT_BY_ROW","BE_ORDINAL","Must","Might","Not","innerGlobalModel","makeSeriesEncodeForAxisCoordSys","coordDimensions","encodeItemName","encodeSeriesName","baseCategoryDimIndex","categoryWayValueDimStart","datasetRecord","datasetModel","querySeriesUpstreamDatasetModel","datasetMap","seriesLayoutBy","coordDimInfoLoose","coordDimIdx","coordDimInfo","getDataDimCountOnCoordDim","categoryWayDim","valueWayDim","coordDimName","pushDim","seriesName","dimIdxArr","idxFrom","idxCount","dimsDef","makeSeriesEncodeForNameBased","dimCount","sourceFormat","dimensionsDefine","potentialNameDimIndex","idxResult","idxRes0","idxRes1","guessRecords","guessResult","doGuessOrdinal","isPureNumber","fulfilled","nameDimIndex","guessOrdinal","dimIndex","dimName","dimType","dimDefItem","dataArrayRows","sample","detectValue","dataObjectRows","dataOriginal","beStr","internalOptionCreatorMap","reCreateSeriesIndices","assertSeriesInitialized","initBase","innerColor","innerDecal","PaletteMixin","getColorFromPalette","requestNum","defaultPalette","layeredPalette","getFromPalette","clearColorPalette","paletteIdx","paletteNameMap","getDecalFromPalette","defaultDecals","scopeFields","palettes","requestColorNum","paletteNum","pickedPaletteItem","OPTION_INNER_KEY","BUITIN_COMPONENTS_MAP","singleAxis","axisPointer","timeline","markPoint","markLine","markArea","visualMap","angleAxis","radiusAxis","BUILTIN_CHARTS_MAP","componetsMissingLogPrinted","GlobalModel","optionManager","_theme","_optionManager","optionPreprocessorFuncs","innerOpt","normalizeSetOptionInput","_resetOption","resetOption","timelineOption","optionChanged","baseOption","mountOption","componentOption","componentImportName","_mergeOption","getTimelineOption","mediaOptions","getMediaOption","mediaOption","componentsMap","_componentsMap","componentsCount","_componentsCount","newCmptTypes","newCmptTypeMap","replaceMergeMainTypeMap","mainTypeInReplaceMerge","tooltipExists","tooltipWarningLogged","newCmptOptionList","internalOptionCreator","internalOptions","oldCmptList","mergeMode","optionsByMainType","cmptsByMainType","cmptsCountByMainType","extraOpt","ComponentModelClass","seriesImportName","__requireNewView","_seriesIndices","optInMainType","realLen","metNonInner","setUpdatePayload","_payload","cmpt","cmpts","queryByIdOrName","filterBySubType","findComponents","queryCond","indexAttr","ctxForAll_1","cbForAll_1","getSeriesByName","nameStr","oneSeries","getSeriesByType","getSeries","getSeriesCount","rawSeriesIndex","eachRawSeries","eachSeriesByType","eachRawSeriesByType","isSeriesFiltered","_seriesIndicesMap","getCurrentSeriesIndices","filterSeries","newSeriesIndices","seriesRawIdx","componentTypes","components","seriesId","internalField","seriesIndices","notMergeColorLayer","airaOption","colorLayer","themeItem","keyMap_1","idName_1","idOrNameItem","replaceMerge","ExtensionAPI","ecInstance","availableMethods","coordinateSystemCreators","CoordinateSystemManager","coordinateSystems","creator","_coordinateSystems","getCoordinateSystems","QUERY_REG","OptionManager","rawOption","dataset","optionBackup","_optionBackup","newParsedOption","isNew","mediaDefault","mediaList","declaredBaseOption","timelineOnRoot","timelineOptionsOnRoot","mediaOnRoot","hasMedia","hasTimeline","singleMedia","doPreprocess","preProcess","timelineOptions","_newBaseOption","isRecreate","_timelineOptions","_mediaList","_mediaDefault","_currentMediaIndices","timelineModel","getCurrentIndex","ecWidth","_api","ecHeight","indices1","indices2","applyMediaQuery","realMap","aspectratio","applicable","realAttr","real","each$2","isObject$1","POSSIBLE_STYLES","compatEC2ItemStyle","itemStyleOpt","normalItemStyleOpt","emphasisItemStyleOpt","convertNormalEmphasis","optType","useExtend","normalOpt","emphasisOpt","removeEC3NormalStatus","compatTextStyle","labelOptSingle","textPropName","compatEC3CommonStyles","toArr","toObj","globalCompatStyle","isTheme","seriesOpt","edgeData","mpData","mlData","breadcrumb","levels","leaves","axisName","axisOpt","parallelOpt","parallelAxisDefault","calendarOpt","radarOpt","nameGap","axisNameGap","indicatorOpt","geoOpt","regionObj","timelineOpt","toolboxOpt","featureOpt","compatLayoutProperties","LAYOUT_PROPERTIES","COMPATITABLE_COMPONENTS","BAR_ITEM_STYLE_MAP","compatBarItemStyle","compatPieLabel","alignTo","edgeDistance","compatSunburstState","downplay","globalBackwardCompat","seriesType","clipOverflow","clockWise","hoverOffset","scaleSize","pointerColor","backgroundStyle","highlightPolicy","traverseTree","focusNodeAdjacency","mapLocation","hoverAnimation","dataRange","componentName","calculateStack","stackInfoList","targetStackInfo","idxInStack","resultVal","resultNaN","dims","stackResultDimension","stackedOverDimension","targetData","isStackedByIndex","stackStrategy","modify","byValue","stackedDataRawIndex","stackedDimension","getRawIndex","stackedByDimension","maxPrecision","stackedOver","rawIndexOf","getByRawIndex","providerMethods","mountMethods","SourceImpl","dimensionsDetectedCount","metaRawOption","isSourceInstance","createSource","sourceData","thisMetaRawOption","detectSourceFormat","determined","sourceHeader","normalizeDimensionsOption","arrayRowsTravelFirst","firstIndex","colArr","createSourceFromSeriesDataOption","nameMap","rawItem","exist","maxLoop","shouldRetrieveDataByName","DefaultDataProvider","getSource","_source","pure","getMethodMapKey","getItemForTypedArray","countForTypedArray","fillStorage","fillStorageForTypedArray","rawItemGetter","getRawSourceItemGetter","rawCounter","getRawSourceDataCounter","dimSize","_dimSize","dimExtent","appendDataSimply","newCol","oldCol","sourceParam","getItemSimply","rawData","rawSourceItemGetterMap","countSimply","rawSourceDataCounterMap","getRawValueSimply","rawSourceValueGetterMap","getRawSourceValueGetter","retrieveRawValue","getRawDataItem","getStore","getDimensionIndex","getDimensionProperty","DIMENSION_LABEL_REG","DataFormatMixin","getDataParams","getRawValue","rawDataIndex","itemOpt","getItemVisual","userOutput","componentSubType","fullDimensions","extendParams","getItemModel","dimensionIndex","dimStr","dimLoose","formatTooltip","multipleSeries","normalizeTooltipFormatResult","markupText","markupFragment","createTask","Task","perform","performArgs","planResult","forceFirstProgress","upTask","_upstream","lastModBy","_dirty","outputData","__pipeline","currentTask","_plan","normalizeModBy","_modBy","lastModDataCount","_modDataCount","modBy","modDataCount","_doReset","_outputDueEnd","_dueEnd","_progress","_dueIndex","_doProgress","outputDueEnd","_settedOutputEnd","unfinished","_onDirty","_callingProgress","_reset","downstream","_downstream","downTask","getUpstream","getDownstream","setOutputEnd","onDirty","winCount","sStep","sCount","modNext","sequentialNext","parseDataValue","valueParserMap","getRawValueParser","ORDER_COMPARISON_OP_MAP","lval","lte","gte","FilterOrderComparator","evaluate","_opFn","_rvalFloat","SortOrderComparator","lvalFloat","rvalFloat","lvalNotNumeric","rvalNotNumeric","_incomparable","lvalIsStr","rvalIsStr","_resultLT","incomparable","isDesc","FilterEqualityComparator","lvalTypeof","eqResult","_rval","_rvalTypeof","_isEQ","isEq","ExternalSource","getRawData","cloneRawData","cloneAllDimensionInfo","retrieveValue","retrieveValueFromItem","convertValue","upstream","isSupportedSourceFormat","dimsByName","externalTransformMap","applyDataTransform","rawTransOption","sourceList","infoForPrint","pipedTransOption","pipeLen","transOption","upSourceList","pipeIndex","transType","externalTransform","extUpSourceList","upSource","createExternalSource","internalSource","extSource","sourceHeaderCount","dimDef","dimDefExt","__isBuiltIn","rawValueGetter","resultList","upstreamList","datasetIndex","resultIndex","firstUpSource","resultMetaRawOption","defaultDimValueGetters","CtorUint32Array","Uint32Array","CtorUint16Array","CtorInt32Array","Int32Array","CtorFloat64Array","Float64Array","dataCtors","getIndicesCtor","rawCount","getInitialExtent","prepareStore","dimIdx","DataCtor","oldStore","oldLen","newStore","DataStore","initData","inputDimensions","dimValueGetter","_provider","_chunks","_indices","_getRawIdxIdentity","defaultGetter","defaultDimValueGetter","willRetrieveDataByName","_dimValueGetter","_rawExtent","_dimensions","_initDataFromProvider","getProvider","ensureCalculationDimension","calcDimNameToIdx","_calcDimNameToIdx","calcDimIdx","_rawCount","collectOrdinalMeta","ordinalMeta","rawExtents","ordinalOffset","dimRawExtent","parseAndCollect","getOrdinalMeta","appendValues","minFillLen","dimLen","rawExtent","emptyDataItem","sourceIdx","arrayRows","dimNames","dimStorage","_extent","dimStore","getValues","dimArr","rawIdx","getSum","getMedian","dimDataArray","sortedDimDataArray","rawIndex","indicesOfNearest","dimData","nearestIndices","minDiff","nearestIndicesLen","getIndices","thisCount","newIndices","dim0","_updateGetRawIdx","selectRange","originalCount","storeArr","quickFinished","dimStorage2","dimk","_updateDims","targetChunks","tmpRetValue","dataCount","retValue","rawExtentOnDim","lttbDownSample","valueDimension","sampledIndex","frameSize","currentRawIndex","nextFrameStart","nextFrameEnd","avgX","avgY","frameStart","frameEnd","pointAX","pointAY","maxArea","nextRawIndex","firstNaNIndex","countNaN","_getRawIdx","minmaxDownSample","targetStorage","minIndex","thisFrameSize","rawMinIndex","rawMaxIndex","downSample","sampleValue","sampleIndex","frameValues","sampleFrameIdx","getDataExtent","initialExtent","currEnd","clonedDims","ignoreIndices","originalChunk","clonedDimsMap","_copyCommonProps","_cloneIndices","getDimValueSimply","objectRows","keyedColumns","typedArray","SourceManager","_setLocalSource","_storeList","upstreamSignList","_sourceList","_upstreamSignList","_versionSignBase","_getVersionSign","_sourceHost","prepareSource","_isDirty","_createSource","resultSourceList","sourceHost","upSourceMgrList","_getUpstreamSourceManagers","hasUpstream","upSourceMgr","newMetaRawOption","_getSourceMetaRawOption","upMetaRawOption","_applyTransform","upMgrList","transformOption","fromTransformResult","doThrow","upMgr","upSrcMgr","getSharedDataStore","seriesDimRequest","schema","makeStoreSchema","_innerGetDataStore","storeDims","seriesSource","sourceReadKey","storeList","cachedStoreMap","cachedStore","getSourceManager","disableTransformOptionMerge","TOOLTIP_LINE_HEIGHT_CSS","getTooltipLineHeight","getTooltipTextStyle","nameFontColor","nameFontSize","nameFontWeight","valueFontColor","valueFontSize","valueFontWeight","nameStyle","valueStyle","HTML_GAPS","RICH_TEXT_GAPS","createTooltipMarkup","isSectionFragment","getBuilder","buildSection","buildNameValue","topMarginForOuterGap","toolTipTextStyle","comparator_1","noHeader","gaps","gapLevel","getBlockGapLevel","gapLevel_1","subBlockLen","hasInnerGap_1","subBlock","subGapLevel","richText","subMarkupTextList","subBlocks","orderMode","subMarkupText","sortBlocks","orderMap","valueAsc","valueDesc","sortParam","wrapBlockHTML","displayableHeader","tooltipLineHeight","wrapInlineNameRichText","markerStr","valueTypeOption","valueCloseToMarker","noName","noValue","noMarker","markerType","markupStyleCreator","makeTooltipMarker","markerColor","readableName","readableValueList","valueAlignRight","alignRight","wrapRichTextStyle","paddingStr","alignCSS","buildTooltipMarkup","encodedContent","topGap","retrieveVisualColorForTooltipMarker","visualDrawType","getPaddingFromTooltipModel","TooltipMarkupStyleCreator","_generateStyleName","_nextStyleNameId","richTextStyles","finalStl","defaultSeriesFormatTooltip","tooltipDims","isValueMultipleLine","inlineValues","inlineValueTypes","mapDimensionsAll","tooltipDimLen","isValueArr","setEachItem","dimInfo","otherDims","dimItem","inlineValueType","formatArrResult","inlineValue","seriesNameSpecified","inlineName","inner$1","getSelectionKey","SERIES_UNIVERSAL_TRANSITION_PROP","SeriesModel","dataTask","dataTaskCount","dataTaskReset","sourceManager","getInitialData","wrapData","dataBeforeProcessed","autoSeriesName","_initSelectedMapFromData","themeSubType","fillDataTextStyle","newSeriesOption","task","getCurrentTask","getLinkedData","mainData","getLinkedDataAll","getEncode","getColorBy","isColorBySeries","getBaseAxis","animationEnabled","coordDimToDataDim","coordDim","getProgressive","getProgressiveThreshold","innerDataIndices","_innerSelect","selectedMap","selectedMode","_selectedDataIndicesMap","nameOrId","toggleSelect","tmpArr","getSelectedDataIndices","selectedDataIndicesMap","nameOrIds","isUniversalTransitionEnabled","universalTransitionOpt","universalTransition","lastDataIndex","hasItemOption","ignoreStyleOnData","hasSymbolVisual","defaultSymbol","visualStyleAccessPath","nameArr","dataDims","dataDim","cloneShallow","dataTaskProgress","CHANGABLE_METHODS","DOWNSAMPLE_METHODS","onDataChange","agentStubMap","pipeline","getPipeline","ComponentView","updateLayout","updateVisual","seriesModels","eachRendered","createRenderPlanner","pipelineContext","originalLarge","originalProgressive","progressiveRender","inner$2","renderPlanner","ChartView","toggleHighlight","markUpdateMethod","updateMethod","renderTask","renderTaskPlan","renderTaskReset","elSetState","highlightKey","progressMethodMap","incrementalPrepareRender","incrementalRender","ORIGIN_METHOD","RATE","THROTTLE_TYPE","currCall","debounceNextCall","lastCall","lastExec","cbArgs","thisDelay","thisDebounce","createOrUpdate","fnAttr","throttleType","originFn","lastThrottleType","inner$3","defaultStyleMappers","defaultColorKey","getStyleMapper","stylePath","styleMapper","visualStyleMapper","getDefaultColorKey","colorKey","seriesStyleTask","createOnAllSeries","performRawSeries","styleModel","globalStyle","decalOption","setVisual","colorCallback","hasAutoColor","colorPalette","dataEach","dataParams","setItemVisual","sharedModel","dataStyleTask","getStyle","getVisual","ensureUniqueItemVisual","dataColorPaletteTask","overallReset","paletteScopeGroupByType","colorScope","dataAll","idxMap","PI$3","Scheduler","_stageTaskMap","taskRecord","overallTask","getPerformArgs","pCtx","_pipelineMap","progressiveEnabled","__idxInPipeline","pipelineId","updateStreamModes","dataLen","restorePipelines","pipelineMap","preventIncremental","_pipe","prepareStageTasks","stageTaskMap","_allHandlers","_createSeriesStageTask","_createOverallStageTask","prepareView","__block","performDataProcessorTasks","_performStageTasks","_dataProcessorHandlers","performVisualTasks","_visualHandlers","stageHandlers","needSetDirty","setDirty","dirtyMap","stageHandler","seriesTaskMap","overallNeedDirty_1","performArgs_1","visualType","stageHandlerRecord","stub","performSeriesTasks","oldSeriesTaskMap","newSeriesTaskMap","getTargetSeries","seriesTaskPlan","seriesTaskReset","seriesTaskCount","useClearVisual","isVisual","isLayout","overallTaskReset","oldAgentStubMap","newAgentStubMap","overallProgress","shouldOverallTaskDirty","createStub","stubReset","stubOnDirty","agent","wrapStageHandler","legacyFunc","ecModelMock","apiMock","dataProcessorHandlers","visualHandlers","stubProgress","clearAllVisual","resetDefines","makeSeriesTaskProgress","singleSeriesTaskProgress","resetDefineIdx","resetDefine","mockMethods","Clz","cond","axisCommon","axisLine","contrastColor","splitLine","splitArea","minorSplitLine","colorAll","lightTheme","crossStyle","pageTextStyle","subtextStyle","iconStyle","brushStyle","handleStyle","moveHandleStyle","fillerColor","dataBackground","selectedDataBackground","controlStyle","dayLabel","monthLabel","yearLabel","timeAxis","logAxis","valueAxis","categoryAxis","color0","borderColor0","ECEventProcessor","condCptType","suffixes_1","dataKeys_1","cptQuery","dataQuery","otherQuery","reserved","propSuffix","suffixPos","packedEvent","eventInfo","filterForExposedEvent","propOnHost","SYMBOL_PROPS_WITH_CB","SYMBOL_PROPS","seriesSymbolTask","legendIcon","symbolPropsCb","symbolOptions","symbolOptionsCb","hasCallback","symbolPropName","symbolKeepAspect","dataSymbolTask","getItemVisualFromData","getVisualFromData","setItemVisualFromData","createLegacyDataSelectAction","ecRegisterAction","eventsMap","dispatchAction","handleSeriesLegacySelectEvents","eventPostfix","ecIns","legacyEventName","fromActionPayload","findEventDispatcher","returnFirstMatch","wmUniqueIndex","supportDefineProperty","WeakMap","_guard","_id","Triangle","Diamond","Pin","tanX","tanY","cpLen","cpLen2","Arrow","symbolShapeMakers","roundRect","arrow","triangle","symbolBuildProxies","SymbolClz","symbolType","inBundle","proxySymbol","symbolPathSetColor","symbolStyle","__isEmptyBrush","createSymbol","keepAspect","symbolPath","normalizeSymbolSize","normalizeSymbolOffset","symbolOffset","isSafeNum","getCanvasGradient","canvasGradient","createRadialGradient","createLinearGradient","parseInt10","whIdx","wh","cwh","plt","prb","getLineDash","lineScale_1","lineType","pathProxyForDraw","styleHasStroke","isValidStrokeFillStyle","strokeOrFill","styleHasFill","doFillPath","originalGlobalAlpha","globalAlpha","doStrokePath","createCanvasPattern","canvasPattern","createPattern","repeat","DOMMatrix","setTransform","translateSelf","rotateSelf","scaleSelf","SHADOW_NUMBER_PROPS","STROKE_PROPS","bindCommonProps","prevStyle","forceSetAll","flushPathDrawn","globalCompositeOperation","bindPathAndTextCommonStyle","prevEl","strokeStyle","newLineWidth","setContextTransform","DRAW_TYPE_PATH","DRAW_TYPE_IMAGE","DRAW_TYPE_TEXT","DRAW_TYPE_INCREMENTAL","batchFill","batchStroke","brushSingle","prevElClipPaths","forceSetTransform","forceSetStyle","prevClipPaths","allClipped","updateClipStatus","__isRendered","m0","hasFillGradient","hasStrokeGradient","hasFillPattern","hasStrokePattern","fillGradient","strokeGradient","fillPattern","strokePattern","strokePart","firstDraw","dirtyFlag","needsRebuild","canBatchPath","lastDrawType","__canvasFillGradient","__canvasStrokeGradient","__canvasFillPattern","__canvasStrokePattern","setLineDash","strokeText","drawImage","brushIncremental","temporalDisplayables","innerScope","i_1","len_1","decalMap","decalCache","decalKeys","createOrUpdatePatternFromDecal","decalObject","getDevicePixelRatio","getZr","isSVG","oldPattern","decalOpt","maxTileWidth","maxTileHeight","isValidKey","normalizeDashArrayX","dash","dashValue","isAllNumber","dashValue_1","symbolArray","normalizeSymbolArray","isAllString","lineBlockLengthsX","getLineBlockLengthY","lineBlockLengthY","svgRoot","pSize","xlen","symbolRepeats","ySum","yId","yIdTotal","xId0","symbolYId","xId1","xId1Total","top_1","symbolXId","xSum","symbolVNode","renderOneToVNode","svgWidth","svgHeight","blockLength","lifecycle","implsStore","getImpl","PRIORITY","PROCESSOR","FILTER","SERIES_FILTER","STATISTIC","VISUAL","LAYOUT","PROGRESSIVE_LAYOUT","GLOBAL","CHART","POST_CHART_LAYOUT","COMPONENT","BRUSH","CHART_ITEM","ARIA","DECAL","IN_MAIN_PROCESS_KEY","PENDING_UPDATE","STATUS_NEEDS_UPDATE_KEY","ACTION_REG","CONNECT_STATUS_KEY","createRegisterEventWithLowercaseECharts","isDisposed","toLowercaseNameAndCallEventful","disposedWarning","createRegisterEventWithLowercaseMessageCenter","MessageCenter","updateDirectly","updateMethods","doConvertPixel","doDispatchAction","flushPendingActions","triggerUpdatedEvent","bindRenderedEvent","bindMouseEvent","renderComponents","renderSeries","createExtensionAPI","enableConnect","markStatusToUpdate","applyChangedStates","messageCenterProto","ECharts","_onframe","_scheduler","updateParams","_zr","remainTime","_model","getDom","_dom","isSSR","_ssr","notMerge","lazyUpdate","transitionOpt","seriesTransition","setTheme","getRenderedCanvas","renderToCanvas","pixelRatio","renderToSVGString","renderToString","useViewBox","getSvgDataURL","getDataURL","excludesComponentViews","excludeComponents","__viewId","getConnectedDataURL","groupId","left_1","right_1","bottom_1","canvasList_1","dpr_1","targetCanvas","zr_1","content_1","connectedGroups","instances$1","getSvgDom","getSvgRoot","connectedBackgroundColor","convertToPixel","convertFromPixel","containPixel","containPoint","_chartsMap","parsedFinder","_initEvents","messageCenter","MOUSE_EVENT_NAMES","eveName","isGlobalOut","dataModel","eventActionMap","actionType","_messageCenter","isFromClick","fromAction","DOM_ATTRIBUTE_KEY","_componentsViews","_chartsViews","_throttledZrFlush","_coordSysMgr","_loadingFX","needPrepare","loadingEffects","makeActionFromEvent","_pendingActions","updateLabelLayout","updatedSeries","isComponent","viewList","viewMap","__alive","doPrepare","classType","Clazz","requireNewView","viewId","__id","__model","__ecComponentInfo","excludeSeriesIdMap","callView","excludeSeriesId","modelId","isExcluded","notBlur","blurSeriesFromHighlightPayload","focus_1","dispatcher","prepareAndUpdate","coordSysMgr","componentDirtyList","seriesDirtyMap","componentView","chartView","coordSysList","chartsMap","escapeConnect","actionWrap","actionInfo","cptTypeTmp","cptType","payloads","batched","eventObjBatch","batch","isSelectChange","isHighDown","batchItem","newObj","pendingActions","componentHighDownName","zLevels","lastSeriesZLevel_1","lastSeriesKey_1","componentZLevels","seriesZLevels","hasSeparateZLevel","zlevelKey","dirtyList","updateZ","updateStates","elCount","preventUsingHoverLayer","applyElementStates","getComponentByElement","modelInfo","updateConnectedChartsStatus","action_1","otherCharts_1","otherChart","defaultRenderer","themeStorage","defaultCoarsePointer","defaultUseDirtyRect","__ECHARTS__DEFAULT__RENDERER__","__ECHARTS__DEFAULT__COARSE_POINTER","__ECHARTS__DEFAULT__USE_DIRTY_RECT__","hashMap","prioritySortFunc","__prio","visualFuncs","dataProcessorFuncs","newStates","preventAutoZ","doUpdateZ","maxZ2","labelLine","textGuideLineConfig","showAbove","prevStates","stateAnimationModel","enableAnimation","selectState","echartsProto","args2","idBase","groupIdBase","disConnect","getInstanceByDom","registerPreprocessor","preprocessorFunc","registerProcessor","processor","normalizeRegister","registerPostInit","postInitFunc","registerUpdateLifecycle","registerPostUpdate","postUpdateFunc","registerAction","registerCoordinateSystem","coordSysCreator","registerLayout","layoutTask","registerVisual","visualTask","registeredTasks","targetList","defaultPriority","__raw","registerLoading","loadingFx","registerMap","mapName","geoJson","specialAreas","registerTransform","typeParsed","isBuiltIn","hasItemVisual","stackInfoMap","getCalculationInfo","setCalculationInfo","textColor","maskColor","showSpinner","spinnerRadius","mask","labelRect","extensions","extensionRegisters","registerImpl","registerComponentModel","registerComponentView","ComponentViewClass","registerSeriesModel","SeriesModelClass","registerChartView","ChartViewClass","painterType","PainterCtor","singleExt","dataIndexMapValueLength","valNumOrArrLengthMoreThan2","defaultKeyGetter","DataDiffer","_update","updateManyToOne","_updateManyToOne","updateOneToMany","_updateOneToMany","updateManyToMany","_updateManyToMany","_remove","execute","_diffModeMultiple","_executeOneToOne","oldArr","_old","newArr","newDataIndexMap","oldDataKeyArr","newDataKeyArr","_initIndexMap","oldKey","newIdxMapVal","newIdxMapValLen","_performRestAdd","_executeMultiple","oldDataIndexMap","oldIdxMapVal","oldIdxMapValLen","idxMapValLen","keyArr","keyGetterName","cbModeMultiple","idxMapVal","oldKeyGetter","newKeyGetter","diffMode","_oldKeyGetter","_newKeyGetter","DimensionUserOuput","_getFullDimensionNames","_encode","_cachedDimNames","_schema","makeOutputDimensionNames","dimRequest","summarizeDimensions","summary","notExtraCoordDimMap","defaultedLabel","defaultedTooltip","userOutputEncode","dataDimsOnCoord","coordDimIndex","getOrCreateEncodeArr","isExtraCoord","defaultTooltip","encodeArr","encodeFirstDimNotExtra","encodeLabel","dataDimIndicesOnCoord","storeDimIndex","encodeTooltip","getDimensionTypeByAxis","SeriesDimensionDefine","inner$4","dimTypeShort","SeriesDataSchema","isDimensionOmitted","_dimOmitted","_updateDimOmitted","dimensionOmitted","_dimNameMap","ensureSourceDimNameMap","getSourceDimensionIndex","getSourceDimension","_fullDimCount","makeHashStrict","dimHash","fullDimIdx","seriesDimIdx","sourceDimDef","seriesDimDef","isCalculationCoord","appendCalculationDimension","fullDimensionCount","isSeriesDataSchema","createDimNameMap","dataDimNameMap","dimDefItemRaw","userDimName","innerSource","dimNameMap","prepareInvertedIndex","getIdNameFromStore","normalizeDimensions","transferProperties","cloneListForMapAndSample","makeIdFromName","isObject$2","map$1","CtorInt32Array$1","TRANSFERABLE_PROPERTIES","CLONE_PROPERTIES","SeriesData","getDimension","_recognizeDimIndex","_dimIdxToName","_getDimInfo","_getStoreDimIndex","_initGetDimensionInfo","needsHasOwn","dimensionInfos","_dimInfos","getDimensionsOnCoord","_dimSummary","mapDimension","dimensionsSummary","_store","nameList","_nameList","_idList","_nameRepeatCount","_doInit","shouldMakeIdFromName","_shouldMakeIdFromName","_updateOrdinalMeta","_idDimIdx","idList","sharedDataItem","itemId","getApproximateExtent","_approximateExtent","setApproximateExtent","_calculationInfo","_nameDimIdx","_getCategory","invertedIndices","_invertedIndicesMap","fCtx","dimIndices","filterSelf","innerRange","mapArray","ctxCompat","hostModel","otherList","thisList","visual","_visual","kvObj","itemVisual","_itemVisuals","itemVisuals","setLayout","_layout","getLayout","getItemLayout","_itemLayouts","setItemLayout","clearItemLayouts","setItemGraphicEl","_graphicEls","injectFunction","originalMethod","__wrappedMethods","invertedIndicesMap","nameDimIdx","idDimIdx","nmCnt","nameRepeatCount","dimensionsInput","TRANSFERABLE_METHODS","dimIdxToName_1","assignStoreDimIdx","emptyObj","dimInfoInput","dimensionInfo","dimensionName","createInvertedIndices","prepareSeriesDataSchema","sysDims","coordDimNameMap","optDimCount","dimensionsCount","sysDimItem","sysDimItemDimsDef","omitUnusedDimensions","canOmitUnusedDimensions","isUsingSourceDimensionsDef","encodeDef","encodeDefine","encodeDefMap","encodeDefaulter","indicesMap","getResultItem","dataDimsRaw","validDataDims","resultDimIdxOrName","resultDimIdx","applyDim","availDimIdx","sysDimItemRaw","sysDimItemOtherDims","sysDimItemDimsDefItem","generateCoord","fromZero","generateCoordCount","ifNoNameFillWithCoordName","item0","item1","removeDuplication","duplicationMap","dimOriginalName","CoordSysInfo","coordSysName","coordSysDims","axisMap","categoryAxisMap","fetchers","cartesian2d","xAxisModel","yAxisModel","firstCategoryDimIndex","singleAxisModel","polarModel","radiusAxisModel","findAxisModel","angleAxisModel","parallelModel","parallelAxisIndex","axisIndex","axisModel","axisDim","enableDataStack","dimensionDefineList","stackedByDimInfo","stackedDimInfo","stackedDimCoordDim_1","stackedDimCoordIndex_1","byIndex","stackedCoordDimension","mayStack","stackedDimType","stackedOverDimensionDefine","stackResultDimensionDefine","isDimensionStacked","stackedDim","getStackedDimension","targetDim","createSeriesData","sourceRaw","coordSysInfo","hasNameEncode","isOriginalSource","coordSysDimDefs","registeredCoordSys","getDimensionsInfo","useEncodeDefaulter","createDimensionOptions","dimInfoList","categoryAxisModel","stackCalculationInfo","Scale","getSetting","_setting","unionExtent","unionExtentFromData","getExtent","setExtent","thisExtent","isInExtentRange","isBlank","_isBlank","setBlank","setting","uidBase","OrdinalMeta","createByAxisModel","needCollect","deduplication","dedplication","getOrdinal","_getOrCreateMap","_needCollect","_deduplication","isIntervalOrLogScale","intervalScaleNiceTicks","splitNumber","minInterval","maxInterval","intervalPrecision","getIntervalPrecision","niceTickExtent","increaseInterval","contain$1","normalize$1","scale$2","OrdinalScale","_ordinalMeta","_getTickNumber","getRawOrdinalNumber","getTicks","getMinorTicks","setSortInfo","_ordinalNumbersByTick","_ticksByOrdinalNumber","infoOrdinalNumbers","ordinalNumbers","ordinalsByTick","ticksByOrdinal","allCategoryLen","ordinalNumber","unusedOrdinal","ticksByOrdinalNumber","tickNumber","ordinalNumbersByTick","getLabel","cateogry","calcNiceTicks","calcNiceExtent","IntervalScale","getInterval","_interval","_niceExtent","_intervalPrecision","expandToNicedExtent","lastNiceTick","minorTicks","prevTick","minorTicksGroup","minorInterval","minorTick","expandSize","fixMax","fixMin","setNiceExtent","supportFloat32Array","Float32ArrayCtor","createFloat32Array","STACK_PREFIX","getSeriesStackId","getAxisKey","prepareLayoutBarSeries","isOnCartesian","makeColumnLayout","barSeries","axisMinGaps","axisValues","baseAxis","cnt","valuesInAxis","seriesInfoList","bandWidth","axisExtent","getBandWidth","minGap","extentSpan","scaleSpan","barMaxWidth","barMinWidth","isInLargeMode","barGap","barCategoryGap","axisKey","stackId","doCalBarWidthAndOffset","columnsMap","seriesInfo","columnsOnAxis","autoWidthCount","categoryGap","stacks","lastColumn","categoryGapPercent","barGapPercent","autoWidth","widthSum","finalWidth","barWidthAndOffset","columnLayoutInfo","columnOffset","columnWidth","createProgressiveLayout","valueDimIdx","baseDimIdx","drawBackground","valueDim","stackResultDim","isValueAxisH","valueAxisStart","isLarge","barMinHeight","stackedDimIdx","getOtherAxis","toGlobalCoord","dataToCoord","largePoints","largeBackgroundPoints","largeDataIndices","coordLayout","getRect","bgSize","idxOffset","baseCoord","stackStartValue","dataToPoint","valueAxisHorizontal","TimeScale","_minLevelUnit","labelFormatter","defaults$1","mergedFormatter","levelId","innerTicks","bottomUnitName","approxInterval","unitNames","iter","addLevelTicks","unitName","lastLevelTicks","levelTicks","newAddedTicks","isFirstLevel","isUnitValueSame","valueA","valueB","dateA","dateB","isSameYear","isSameMonth","isSameHour","isSameMinute","isSameSecond","outDate","startTick","endTick","getterName","setterName","getMinutesAndSecondsInterval","setMethodName","getMethodName","maxTimestamp","minTimestamp","addTicksInSpan","notAdd","levelsTicks","currentLevelTicks","lastLevelTickCount","primaryTimeUnit","nextPrimaryTimeUnit","levelTicksRemoveDuplicated","targetTickNum","levelsTicksInExtent","_approxInterval","approxTickNum","scaleIntervalsLen","scaleIntervals","isMinutes","scaleProto","intervalScaleProto","roundingErrorFix","mathFloor","mathCeil","mathPow$1","mathLog","LogScale","originalScale","_originalScale","originalExtent","powVal","_fixMin","fixRoundingError","_fixMax","niceExtent","originalVal","ScaleRawExtentInfo","_prepareParams","_dataMin","_dataMax","_isOrdinal","axisMinValue","_needCrossZero","getNeedCrossZero","modelMinRaw","_modelMinRaw","modelMaxRaw","_modelMinNum","parseAxisModelMinMax","_modelMaxRaw","_modelMaxNum","_axisDataLen","getCategories","boundaryGapArr","boundaryGap","_boundaryGapInner","dataMin","dataMax","axisDataLen","boundaryGapInner","minFixed","maxFixed","determinedMin","_determinedMin","determinedMax","_determinedMax","modifyDataMinMax","minMaxName","frozen","DATA_MIN_MAX_ATTR","setDeterminedMinMax","DETERMINED_MIN_MAX_ATTR","ensureScaleRawExtentInfo","rawExtentInfo","minMax","getScaleExtent","isBaseAxisAndHasBarSeries_1","minOverflow","maxOverflow","scaleType","rawExtentResult","barSeriesModels","axisLength","barsOnCurrentAxis","totalOverFlow","overflowBuffer","oldRange","adjustedScale","niceScaleExtent","inModel","extentInfo","isIntervalOrTime","createScaleByModel","makeLabelFormatter","getLabelModel","categoryTickStart","getAxisRawValue","estimateLabelUnionRect","realNumberScaleTicks","categoryScaleExtent","axisLabelModel","beforeWidth","afterWidth","unrotatedSingleRect","singleRect","textRect","afterHeight","beforeHeight","rotateRadians","getOptionCategoryInterval","shouldShowAllLabels","getDataDimensionsOnAxis","dataDimMap","AxisModelCommonMixin","getCoordSysModel","helper","createList","dataStack","createScale","mixinAxisModelCommonMethods","createDimensions","EPSILON$4","isAroundEqual$1","contain$2","TMP_TRANSFORM","transformPoints","updateBBoxFromPoints","Region","setCenter","_center","getCenter","calcCenter","GeoJSONPolygonGeometry","exterior","interiors","GeoJSONLineStringGeometry","GeoJSONRegion","largestGeo","largestGeoSize","signedArea","loopGeo","interior","newRegion","GeoSVGRegion","_elOnlyForCalculate","isGeoSVGGraphicRoot","elOnlyForCalculate","decodeRings","rings","encodeOffsets","encodeScale","decodeRing","prevY","parseGeoJSON","nameProperty","jsonCompressed","UTF8Encoding","UTF8Scale","featureObj","getPercentWithPrecision","graphic$1","format$1","getUTC","capitalFirst","truncateText","util$1","inner$5","tickValuesToNumbers","nums","createAxisLabels","labelFormatter_1","extent_1","labelModel","numval","formattedLabel","rawLabel","makeCategoryLabelsActually","labelCategoryInterval","createAxisTicks","tickModel","extent_2","tickCategoryInterval","ticksCache","optionTickInterval","getTickModel","getListCache","listCacheGet","makeLabelsByCustomizedCategoryInterval","labelsResult","labelItem","makeLabelsByNumericCategoryInterval","listCacheSet","numericLabelInterval","labelsCache","optionLabelInterval","autoInterval","calculateCategoryInterval","categoryInterval","onlyTick","ordinalScale","ordinalExtent","showAllLabel","includeMinLabel","includeMaxLabel","tickObj","NORMALIZED_EXTENT","containData","onBand","fixExtentWithBands","coordToData","pointToData","getTicksCoords","ticksCoords","shift_1","ticksLen","tickVal","alignWithLabel","crossLen","ticksItem","diffSize","getMinorTicksCoords","getViewLabels","getRotate","unitSpan","unitW","unitH","maxW","maxH","dh","lastAutoInterval","lastTickCount","axisExtent0","axisExtent1","nTick","PI2$6","CMD$3","DEFAULT_SEARCH_SPACE","projectPointToLine","limitToEnds","lineLen","projectPointToRect","tmpPt","nearestPointOnPath","pt","pt0","pt1","pt2","dir2","updateLabelLinePoints","labelLineModel","labelGuideConfig","searchSpace","anchorPoint","targetTransform","targetInversedTransform","outDir","outPt","limitTurnAngle","tmpProjPoint","linePoints","minTurnAngle","angleCos","setLabelLineState","isNormal","styleObj","buildLabelLinePath","moveLen","midPoint0","midPoint2","midPoint1","setLabelLineStyle","labelIgnoreNormal","getLabelLineStatesModels","labelLineName","prepareLayoutList","localRect","isAxisAligned","globalRect","obb","defaultAttr","minMargin","layoutOption","computedLayoutOption","axisAligned","shiftLayout","xyDim","sizeDim","minBound","maxBound","balanceShift","totalShifts","shiftList","maxGap","updateMinMaxGap","squeezeGaps","takeBoundsGap","squeezeWhenBailout","gapThisBound","gapOtherBound","moveDir","moveFromMaxGap","remained","maxSqeezePercent","totalGaps","prevItemRect","squeezePercent","moveForEachLabel","shiftLayoutOnY","topBound","bottomBound","hideOverlap","labelList","displayedLabels","hideEl","emphasisState","existsTextCfg","labelGuideIgnore","prepareLayoutCallbackParams","hostRect","labelLinePoints","newPoints","LABEL_OPTION_TO_STYLE_KEYS","dummyTransformable","labelLayoutInnerStore","labelLineAnimationStore","extendWithKeys","LABEL_LAYOUT_PROPS","LabelManager","clearLabels","_labelList","_chartViewList","_addLabel","labelStyle","labelTransform","labelGuide","attachedPos","attachedRot","addLabelsOfSeries","disableLabelLayout","updateLayoutConfig","defaultLabelAttr","degreeToRadian","needsUpdateLabelLine","labelsNeedsAdjustOnX","moveOverlap","labelsNeedsAdjustOnY","processLabelsOverall","ignoreLabelLineUpdate","forceLabelAnimation","_updateLabelLine","_animateLabels","visualStyle","layoutStore","oldLayout","newLayout","disableLabelAnimation","newProps","oldLayoutSelect","oldLayoutEmphasis","oldOpacity","layoutSelect","layoutEmphasis","getLabelManager","mathSin$4","mathCos$4","PI$4","PI2$7","degree","SVGPathRebuilder","_start","_str","_p","dThetaPositive","isCircle","xRot","dTheta_1","vals","generateStr","getStr","NONE","mathRound$1","strokeProps","svgStrokeProps","mapStyleToAttrs","updateAttr","strokeScale","SVGNS","XLINKNS","XMLNS","XML_NAMESPACE","META_DATA_PREFIX","createVNode","vNodeToString","convertElToString","attrsStr","createBrushScope","zrId","shadowCache","patternCache","gradientCache","clipPathCache","cssNodes","cssAnims","cssStyleCache","cssAnimIdx","shadowIdx","gradientIdx","patternIdx","clipPathIdx","createSVGVNode","xmlns:xlink","baseProfile","cssClassIdx","EASING_MAP","transformOriginKey","ANIMATE_STYLE_MAP","addAnimation","cssAnim","animationName","getEasingFunc","createCSSAnimation","onlyShape","cssAnimations","cssAnimationCfg","cssAnimationName","composedAnim","subScope","animNames","lastAnim","groupAnimators","cfgArr","createSingleCSSAnimation","groupAnimator","transformKfs","shapeKfs","finalKfs","animationTimingFunctionAttrName","saveAnimatorTrackToCssKfs","cssKfs","toCssAttrName","kfEasing","timingFunction","kfShape","canAnimateShape","newLen","svgPathBuilder","percents","allTransformOriginSame","setClassAttribute","withHover","styleKey","round$2","isImageLike$1","isCanvasLike","setStyleAttrs","isFillStroke","setGradient","setPattern","setShadow","shadowKey","globalScale","shadowId","blur_1","stdDeviation","flood-color","flood-opacity","setMetaData","metaData","noRotateScale","compress","convertPolyShape","strArr","validatePolyShape","normalizedDesc","builtinShapesDef","polyline","brushSVGPath","builtinShpDef","svgElType","willUpdate","needBuildPath","pathVersion","elExt","__svgPathBuilder","__svgPathVersion","__svgPathStrokePercent","pointer-events","brush$1","brushSVGImage","brushSVGTSpan","dominant-baseline","text-anchor","separatedFontStr","gradientTag","gradientAttrs","gradientUnits","stopsAttrs","gradientKey","gradientId","imageWidth_1","imageHeight_1","setSizeToVNode_1","patternHeight","patternVNode","patternKey","patternId","patternAttrs","noRepeat","repeatX","repeatY","imageWidth","imageHeight","imageSrc","patternImage","vNode","svgEl","createdImage","patternWidth","patternUnits","patternTransform","referenceNode","colonChar","xChar","emptyNode","isUndef","isDef","sameVnode","vnode1","vnode2","isSameKey","createElm","vnode","updateAttrs","addVnodes","parentElm","vnodes","startIdx","endIdx","removeVnodes","oldVnode","oldAttrs","updateChildren","oldCh","newCh","oldKeyToIdx","idxInOld","elmToMove","oldStartIdx","newStartIdx","oldEndIdx","oldStartVnode","oldEndVnode","newEndIdx","newStartVnode","newEndVnode","patchVnode","beginIdx","svgId","SVGPainter","_viewport","getViewportRootOffset","viewportRoot","_svgDom","parent_2","renderToVNode","_oldVNode","selectorNodes","animationNodes","bracketBegin","bracketEnd","_width","_height","_opts","bgVNode","_bgVNode","mainVNode","_mainVNode","_paintList","animationCssStr","styleNode","cssAnimation","cssEmphasis","currentClipPathGroup","clipPathAttrs","clipPathId","listLen","clipPathsGroupsStack","clipPathsGroupsStackDepth","clipGroupNodeIdx","prevLen","i_2","groupAttrs","viewport","viewportStyle","svgDom","bgEl","base64","createMethodNotSupport","createDom","newDom","newDomStyle","Layer","getElementCount","__endIndex","__startIndex","__prevStartIndex","__prevEndIndex","initContext","setUnpainted","__firstTimePaint","createBackBuffer","domBack","ctxBack","createRepaintRects","prevList","mergedRepaintRects","maxRepaintRectCount","pendingRect","addRectToMergePool","isMerged","minDeltaArea","bestRectToMergeIdx","mergedRect","pendingRect_1","aArea","bArea","deltaArea","curRect","shouldPaint","prevRect","hasIntersections","_paintRects","debugGetPaintRects","clearAll","clearColor","repaintRects","haveMotionBLur","motionBlur","lastFrameAlpha","doClear","clearColorGradientOrPattern","__width","__height","__canvasGradient","virtual","__used","__drawIndex","onselectstart","CANVAS_ZLEVEL","CanvasPainter","isSingleCanvas","_singleCanvas","_domRoot","paintAll","_prevDisplayList","zlevelList","_zlevelList","_redrawId","_layers","__builtin__","_paintHoverList","_hoverlayer","getLayer","getHoverLayer","paintOne","redrawId","needsRefreshHover","self_1","_updateLayerStatus","_doPaintList","_needsManuallyCompositing","_compositeManually","eachLayer","eachBuiltinLayer","layerList","zi","_loop_1","repaint","repaintRect","_doPaintEl","useTimer","firstEl","this_1","currentLayer","_layerConfig","insertLayer","prevDom","layersMap","domRoot","prevLayer","getLayers","updatePrevLayer","prevZlevel","incrementalLayerCount","_clearLayer","layerConfig","_zlevel","delLayer","layers","clearLayer","imageLayer","width_1","height_1","singleCanvas","rootCanvas","mainLayer","LineSeriesModel","getLegendIcon","visualRotate","symbolRotate","iconRotate","legendHoverLink","endLabel","smoothMonotone","showSymbol","showAllSymbol","connectNulls","sampling","divideShape","triggerLineEvent","getDefaultLabel","labelDims","getDefaultInterpolatedLabel","_createSymbol","driftSymbol","_symbolType","stopSymbolAnimation","toLastFrame","getSymbolType","getSymbolPath","setZ","setDraggable","hasCursorOption","seriesScope","getSymbolSize","disableAnimation","_updateCommon","_sizeX","_sizeY","emphasisItemStyle","selectItemStyle","blurItemStyle","emphasisDisabled","hoverScale","emphasisModel","visualColor","liftZ","pathStyle","symbolInnerColor","z2Origin","_z2","useNameLabel","scaleRatio","setSymbolScale","animationOpt","fadeLabel","symbolNeedsDraw","isIgnore","clipShape","normalizeUpdateOpt","makeSeriesScope","SymbolDraw","_progressiveEls","SymbolCtor","_SymbolCtor","symbolUpdateOpt","getSymbolPoint","symbolEl","newSymbolType","oldSymbolType","_getSymbolPoint","incrementalPrepareUpdate","_seriesScope","incrementalUpdate","taskParams","updateIncrementalAndHover","prepareDataCoordInfo","valueOrigin","valueStart","baseAxisDim","valueAxisDim","baseDim","baseDataOffset","dataDimsForPoint","getStackedOnPoint","dataCoordInfo","stackedData","mathMin$5","mathMax$5","isPointNull","drawSegment","segLen","allLen","cpx0","cpy0","tmpK","lenPrevSeg","lenNextSeg","dir_2","nextCpx0","nextCpy0","dir_1","ratioNextSeg","ECPolylineShape","ECPolyline","getPointOn","xOrY","isDimX","nRoot","t_1","ECPolygonShape","ECPolygon","stackedOnPoints","stackedOnSmooth","createGridClipPath","hasAnimation","getArea","isAxisInversed","duringCb","createPolarClipPath","sectorArea","createClipPath","isCoordinateSystemType","isPointsSame","points2","bboxFromPoints","getBoundingDiff","min1","max1","getSmooth","turnPointsIntoStep","basePoints","stepTurnAt","baseIndex","stepPoints","stepPt","nextPt","filteredPoints","reference","stepPt2","getVisualGradient","visualMetaList","visualMeta","getAxis","stops","stopLen","outerColors","colorStopsInRange","prevOutOfRangeColorStop","prevInRangeColorStop","newColorStops","lerpStop","stop0","stop1","clippedCoord","coord0","stop_1","inRangeStopLen","minCoord","maxCoord","coordSpan","gradient","getIsIgnoreFunc","isAuto","categoryDataDim","labelMap","getAxesByScale","canShowAllSymbolForCategory","availSize","getLastIndexNotNull","getPointAtIndex","anyStateShowEndLabel","createLineClipPath","lineView","endLabelModel_1","valueAnimation_1","data_1","labelAnimationRecord_1","lastFrameIndex","clipRect","_endLabelOnDuring","_endLabel","originalX","originalY","LineView","lineGroup","symbolDraw","_symbolDraw","_lineGroup","_changePolyState","stackedOnSeries","lineStyleModel","areaStyleModel","isCoordSysPolar","prevCoordSys","_coordSys","_polyline","_polygon","isAreaChart","isIgnoreFunc","__temp","clipShapeForSymbol","_clipShapeForSymbol","_step","_newPolygon","_initOrUpdateEndLabel","oldClipPath","_stackedOnPoints","_points","_doUpdateAnimation","_initSymbolLabelAnimation","_newPolyline","lineJoin","changePolyState","_valueOrigin","packEventData","symbolLabel","isHorizontalOrRadial","isAxisInverse","seriesDuration","seriesDelay","seriesDelayValue","polarClip","pointToCoord","data_2","endLabelModel","isBaseInversed","animationRecord","dataIndexRange","endValue","prevIndex","oldStackedOnPoints","newStackedOnPoints","oldCoordSys","oldValueOrigin","diffResult","idx1","currPoints","nextPoints","currStackedPoints","nextStackedPoints","sortedIndices","rawIndices","newDataOldCoordInfo","oldPoints","diffItem","pointAdded","newIdx2","oldIdx2","currentX","currentY","newDataDimsForPoint","oldPt","stackedOnPoint","sortedCurrPoints","sortedNextPoints","sortedCurrStackedPoints","sortedNextStackedPoints","sortedStatus","i2","idx2","stackedOnCurrent","stackedOnNext","__points","updatedDataInfo","diffStatus","ptIdx","pointsLayout","forceStoreInTypedArray","dimIdx0","dimIdx1","useTypedArray","tmpIn","tmpOut","samplers","nearest","indexSampler","dataSample","sampler","BaseBarSeriesModel","getMarkerPosition","startingAtTick","clampData_1","pt_1","clampData","getAxes","tickCoords","alignTicksWithLabel","targetTickId","isEnd","leftCoord","stepTickValue","tickCoord","offsetIndex","barMinAngle","largeThreshold","progressiveChunkMode","BarSeriesModel","brushSelector","roundCap","showBackground","realtimeSort","SausageShape","SausagePath","rCenter","lessThanCircle","unitStartX","unitStartY","unitEndX","unitEndY","adjustAngleDistanceX","adjustAngleDistanceY","getSectorCornerRadius","zeroIfNull","mathMax$6","mathMin$6","BarView","_removeOnRenderedListener","_updateDrawMode","coordinateSystemType","_isLargeDraw","_renderLarge","_renderNormal","_clear","_updateLargeClip","_incrementalRenderLarge","isLargeDraw","coordSysClipArea","animationModel","realtimeSortCfg","realtimeSortOption","otherAxis","needsClip","_enableRealtimeSort","expandWidth","backgroundModel","barBorderRadius","bgEls","oldBgEls","_backgroundEls","isInitSort","isChangeOrder","createBackground","bgLayout","createBackgroundShape","isClipped","isValidLayout","elementCreator","updateStyle","updateRealtimeAnimation","bgGroup","_backgroundGroup","createLarge","_removeBackground","orderMapping_1","_isFirstFrame","_dispatchInitSort","_onRendered","_updateSortWithinSameData","_dataSort","orderMapping","mappedValue","_isOrderChangedWithinSameData","ordinalDataDim","MIN_VALUE","_isOrderDifferentInView","orderInfo","tickMax","sortInfo","sortResult","coordSysBoundingRect","signWidth","signHeight","coordSysX2","coordSysY2","xClipped","yClipped","signR","clipped","__dataIndex","isRadial","positionMapping","isRoundCap","sector","positionMap","createPolarPositionMapping","mappedSectorPosition","middleR","middleAngle","extraDist","animateTarget","animateProperty","seriesAnimationModel","axisTarget","seriesTarget","checkPropertiesNotValid","rectPropties","polarPropties","fixedLineWidth","rawLayout","signX","signY","arcOrAngle","isPolar","sectorShape","labelPositionOutside","rotateType","anchorAngle","LagePathShape","LargePath","startPoint","progressiveEls","bgPoints","largePathUpdateDataIndex","largePath","PI2$8","RADIAN","getViewRect","getBasicPieLayout","pieLayout","angle_1","minAndPadAngle","validDataCount","unitRadian","roseType","stillShowZeroSum","halfPadAngle","layoutData","getSeriesLayoutData","angleRange","restAngle","valueSumLargerThanMinAngle","currentAngle","actualStartAngle","actualEndAngle","layout_1","layout_2","legendModels","RADIAN$1","adjustSingleSide","viewLeft","viewTop","farthestX","labelAlignTo","recalculateX","semi","rA","rB","topSemi","bottomSemi","recalculateXOnSemiToAlignOnEllipseCurve","rB2","newX","constrainTextWidth","targetTextWidth","forceRecalculate","oldOuterWidth","oldHeight","availableInnerWidth","newRect","labelStyleWidth","bgColor","innerRect","unconstrainedWidth","isPositionCenter","pieLabelLayout","labelLayoutList","hasLabelRotate","minShowLabelRadian","setNotShow","isLabelInside","bleedMargin","labelLineLen","labelLineLen2","midAngle","maxSurfaceAngle","surfaceNormal","avoidOverlap","leftList","rightList","leftmostX","rightmostX","isAlignToEdge","realTextWidth","extraPaddingH","notShowLabel","HALF_PI","newAngle","PiePiece","firstCreate","_updateLabel","visualOpacity","PieView","_emptyCircleSector","piePiece","itemLayout","createSeriesDataSimply","LegendVisualProvider","getAllNames","_getRawData","containName","_getDataWithEncodedVisual","getDataWithEncodedVisual","PieSeriesModel","legendVisualProvider","_defaultLabelLine","valueList_1","dataInner","labelLineNormalOpt","labelLineEmphasisOpt","minAngle","minShowLabelAngle","selectedOffset","percentPrecision","distanceToLabelLine","borderJoin","showEmptyCircle","emptyCircleStyle","labelLayout","avoidLabelOverlap","animationTypeUpdate","ScatterSeriesModel","LargeSymbolPathShape","LargeSymbolPath","_off","symbolProxy","symbolProxyShape","canBoost","softClipShape","findDataIndex","hoverDataIdx","LargeSymbolDraw","_create","_setCommon","lastAdded","_newAdded","extrudeShadow","ScatterView","_updateSymbolDraw","_getClipShape","GridModel","containLabel","CartesianAxisModel","nameLocation","nameRotate","nameTruncate","nameTextStyle","triggerEvent","onZero","onZeroAxisIndex","axisTick","showMinLabel","showMaxLabel","showMinLine","showMaxLine","axisDefault","logBase","AXIS_TYPES","axisModelCreator","registers","BaseAxisModelClass","extraDefaultOption","AxisModel","getAxisType","__ordinalMeta","Cartesian","_dimList","addAxis","cartesian2DDimensions","canCalculateAffineTransform","Cartesian2D","calcAffineTransform","_transform","_invTransform","xAxisScale","yAxisScale","xScaleExtent","yScaleExtent","xScaleSpan","yScaleSpan","toLocalCoord","containZone","data1","data2","zoneDiag1","zoneDiag2","xVal","xAxisExtent","yAxisExtent","getGlobalExtent","Axis2D","setCategorySortInfo","categorySortInfo","coordExtent","layout$1","gridModel","otherAxisOnZeroOf","getAxesOnZeroOf","rawAxisPosition","rectBound","axisOffset","posBound","onZeroCoord","labelDirection","tickDirection","nameDirection","labelInside","isCartesian2DSeries","findAxisModels","axisModelMap","mathLog$1","alignScaleTicks","alignToScale","alignToTicks","alignToNicedTicks","alignToSplitNumber","alignToInterval","isMinFixed","isMaxFixed","Grid","axesMap","_axesMap","updateAxisTicks","axesIndices","axisNeedsAlign","_updateScale","onZeroRecords","fixAxisOnZero","ignoreContainLabel","boxLayoutParams","isContainLabel","gridRect","axesList","_axesList","adjustAxes","coordBase","axisExtentSum","labelUnionRect","_coordsList","axesMapOnDim","getCartesian","xAxisIndex","yAxisIndex","_coordsMap","coordList","getCartesians","_findConvertTarget","coordsList","_initCartesian","axisPositionUsed","axesCount","createAxisCreator","isAxisUsedInTheGrid","axesModelMap","getTooltipAxes","baseAxes","otherAxes","axisPointerEnabled","otherAxisDim","canOnZeroToAxis","getOnZeroRecordKey","PI$5","AxisBuilder","hasBuilder","builders","_transformGroup","getGroup","innerTextLayout","axisRotation","textRotation","rotationDiff","makeAxisEventDataBase","isLabelSilent","tooltipOpt","handleAutoShown","transformGroup","arrows","symbolWidth_1","symbolHeight_1","arrowSize","arrowOffset","axisTickLabel","labelEls","lastLabel","firstTick","lastTick","ticksEls","tickEndCoord","createTicks","labelMargin","rawCategoryData","axisLabelShow","labelRotation","itemLabelModel","rawCategoryItem","alignMin","alignMax","verticalAlignMin","verticalAlignMax","tickIndex","targetType","tickEls","firstLabel","nextLabel","prevLabel","ignoreEl","isTwoLabelOverlapped","minorTickModel","minorTicksCoords","minorTickLineStyle","minorTicksEls","axisNameAvailableWidth","gapSignal","isNameLocationCenter","nameRotation","textRotate","onLeft","truncateOpt","nameTruncateMaxWidth","__fullText","mRotationBack","firstRect","nextRect","tickLineStyle","anidPrefix","tickEl","collect","globalTooltipModel","globalAxisPointerModel","linksOption","linkGroups","axesInfo","seriesInvolved","coordSysAxesInfo","coordSysMap","axesInfoInCoordSys","baseTooltipModel","triggerAxis","tooltipAxes","saveTooltipAxisInfo","fromTooltip","triggerTooltip","involveSeries","axisPointerModel","axisPointerShow","isHandleTrigger","tooltipAxisPointerModel","volatileOption","labelOption","tooltipAxisPointerLabelShow","triggerEmphasis","makeKey","axisInfo","useHandle","linkGroup","linkOption","checkPropInLink","mapper","coordSysKey","seriesTooltipTrigger","seriesTooltipShow","seriesDataCount","linkPropValue","axisPropValue","getAxisInfo","axisPointerClazz","AxisView","axisPointerClass","_doUpdateAxisPointerClass","updateAxisPointer","_axisPointer","_disposeAxisPointer","forceRender","getAxisPointerClass","registerAxisPointerClass","inner$6","rectCoordAxisBuildSplitArea","axisView","axisGroup","splitAreaModel","areaColors","areaColorsLen","lastSplitAreaColors","splitAreaColors","newSplitAreaColors","colorIndex","cIndex","rectCoordAxisHandleRemove","axisBuilderAttrs","selfBuilderAttrs","CartesianAxisView","axisBuilder","oldAxisGroup","_axisGroup","elementType","cartesians","axisElementBuilders","splitLineModel","lineColors","CartesianXAxisView","CartesianYAxisView","GridView","extraOption","install$5","radarLayout","getIndicatorAxes","isValidPoint","getValueMissingPoint","firstPoint","radarBackwardCompat","polarNotRadar_1","polarOptArr","polarOpt","polarIndex","radarIndex","RadarView","updateSymbols","symbolGroup","__dimIdx","getInitialPoints","itemGroup","polygonIgnore","stateIgnore","itemHoverStyle","RadarSeriesModel","indicatorAxes","nameToDisplay","getTooltipPosition","coordToPoint","valueAxisDefault","defaultsShow","RadarModel","showName","nameFormatter","indicatorModels","iNameTextStyle","innerIndicatorOpt","indName","_indicatorModels","getIndicatorModels","axisBuilderAttrs$1","RadarView$1","radarModel","_buildAxes","_buildSplitLineAndArea","indicatorAxis","showSplitLine","showSplitArea","splitLineColors","splitLineColorsArr","splitAreaColorsArr","splitLines","splitAreas","ticksRadius","getColorIndex","realSplitNumber_1","axesTicksPoints","prevPoints","areaOrLine","areaOrLineColorList","IndicatorAxis","radiusExtent","Radar","_indicatorAxes","indicatorIndex","closestAxis","minRadianDiff","closestAxisIdx","viewSize","radarSeries","dummyScale","pixel","radarList","indicatorModel","install$7","isTaken","resourceKey","RoamController","_dragging","isPinching","_pinching","setPointerChecker","pointerChecker","_mousedownHandler","_mousemoveHandler","oldX","oldY","isAvailableBehavior","_opt","preventDefaultMouseMove","newY","_mouseupHandler","_mousewheelHandler","shouldZoom","shouldMove","absWheelDeltaDelta","factor","checkPointerAndTrigger","scrollDelta","absDelta","_pinchHandler","mousemoveHandler","pinchHandler","controlType","zoomOnMouseWheel","moveOnMouseMove","moveOnMouseWheel","behaviorToCheck","contollerEvent","updateViewOnPan","controllerHost","updateViewOnZoom","zoomDelta","zoomX","zoomY","zoomLimit","newZoom","zoomScale","zoomMin","zoomMax","nodeParsers","IRRELEVANT_EXCLUDES","onIrrelevantElement","targetCoordSysModel","svgNode","INHERITABLE_STYLE_ATTRIBUTES_MAP","stroke-width","fill-opacity","stroke-opacity","stroke-dasharray","stroke-dashoffset","stroke-linecap","stroke-linejoin","stroke-miterlimit","font-family","font-style","font-weight","INHERITABLE_STYLE_ATTRIBUTES_MAP_KEYS","SELF_STYLE_ATTRIBUTES_MAP","alignment-baseline","stop-color","SELF_STYLE_ATTRIBUTES_MAP_KEYS","SVGParser","_defsUsePending","viewBoxRect","viewBoxTransform","named","_root","parseAttributes","_parseNode","applyDefs","_defs","defsUsePending","viewBoxArr","splitNumberSequence","makeViewBoxTransform","ignoreViewBox","elRoot","ignoreRootClip","xmlNode","parentGroup","namedFrom","isInDefs","isInText","namedFromForSub","parser_1","newNamed","svgNodeTagLower","paintServerParsers","_parseText","_textX","_textY","inheritStyle","parentSelfStyle","__selfStyle","zrTextBaseline","parentInheritedStyle","__inheritedStyle","zrTextAlign","pointsArr","pointsStr","parsePoints","tspan","lineargradient","parsePaintServerUnit","parseGradientColorStops","radialgradient","stopColor","offsetStr","parseInlineStyle","styleVals","pointsString","onlyInlineStyle","isTextGroup","inheritedStyle","selfStyle","parseTransformAttribute","transformOps_1","mt","transformRegex","valueArr","DEGREE_TO_ANGLE","parseAttributeStyle","inheritableStyleResult","selfStyleResult","svgAttrName","getFillStrokeStyle","urlMatch","numberReg$1","rawStr","styleRegResult","svgStlAttr","zrInheritableStlAttr","zrSelfStlAttr","REGION_AVAILABLE_SVG_TAG_MAP","GeoSVGResource","regionsMap","_firstGraphic","firstGraphic","_buildGraphic","_parsedXML","_freedGraphics","_boundingRect","namedItem","_regionsMap","svgXML","rootFromParse","bRectX","bRectY","bRectWidth","bRectHeight","calculatedBoundingRect","useGraphic","hostKey","usedRootMap","_usedGraphicMap","svgGraphic","freeGraphic","_mapName","geoCoord","points$1","coordsOffsetMap","南海诸岛","广东","香港","澳门","天津","points$2","GeoJSONResource","rawRegions","_parsedMap","_parseToRegions","regionRect","finalRegions","regionName","geoJSON","_geoJSON","specialArea","coordFix","_specialAreas","getMapForUser","geoSourceManager","rawDef","rawSpecialAreas","getGeoResource","OPTION_STYLE_ENABLED_TAGS","OPTION_STYLE_ENABLED_TAG_MAP","STATE_TRIGGER_TAG_MAP","LABEL_HOST_MAP","mapLabelRaw","getFixedItemStyle","areaColor","fixLineStyle","styleHost","MapDraw","mapOrGeoModel","fromView","isGeo","mapSeries","getHostGeoModel","regionsGroup","_regionsGroup","transformInfo","getTransformInfo","transformInfoRaw","transformInfoRoam","roam","isVisualEncodedByVisualMap","viewBuildCtx","resourceType","_buildGeoJSON","_buildSVG","_updateController","_updateMapSelectHandler","regionsGroupByName","_regionsGroupByName","regionsInfoByName","projectionStream","transformPoint","getPolyShape","inPoints","outPoints","newPt","regionGroup","regionModel","polygonSubpaths","getRegionModel","polylineSubpaths","centerPt","polys","projectPolys","createCompoundPath","subpaths","isLine","compoundPath","applyOptionStyleForRegion","resetLabelForRegion","resetEventTriggerForRegion","resetTooltipForRegion","resetStateTriggerForRegion","svgDispatcherMap","_svgGroup","_svgResourceChanged","_freeSVG","_useSVG","_svgDispatcherMap","_svgGraphicRecord","_enableBlurEntireSVG","opacity_1","_controller","_controllerHost","geoModel","_svgMapName","getZoom","makeActionBase","_mouseDownFlag","totalZoom","resetForLabelLayout","mapDraw","normalStyleModel","emphasisStyleModel","blurStyleModel","selectStyleModel","selectStyle","labelXY","isDataNaN","specifiedTextOpt","eventTrigger","geoIndex","createStream","curPoly","startPolygon","endPolygon","MapView","mapModel","_mapDraw","needsDrawMap","_renderSymbols","originalData","originalDataIndex","fullIndex_1","Z2_EMPHASIS_LIFT","fullData","mainSeries","MapSeries","dataNameIndexMap","toAppendItems","name_2","getMapType","dataNameIdx","specifiedGeoJSONRegionStyle","echartsStyle","seriesGroup","seriesNames","otherIndex","setZoom","iconType","aspectScale","showLegendSymbol","boundingCoords","scaleLimit","getRegion","mapDataStatistic","seriesGroups","hostGeoModel","seriesList","datas","statisticType","dataNameMap","mapKey","mapSymbolLayout","processedMapType","mapSymbolOffsets","subMapSeries","v2ApplyTransform","View","setViewRect","_transformTo","_viewRect","rawTransform","_rawTransformable","rawParent","_updateTransform","centerCoord","_updateCenterAndZoom","_zoom","getDefaultCenter","rawRect","getRoamTransform","_roamTransformable","rawTransformMatrix","roamTransform","defaultCenter","roamTransformable","rawTransformable","_rawTransform","getViewRectAfterRoam","noRoam","getCoordSys","GEO_DEFAULT_PARAMS","invertLongitute","geoSVG","geo2DDimensions","Geo","_invertLongitute","getRegionByCoord","addGeoCoord","_nameCoordMap","getGeoCoord","projectedToPoint","unproject","pointToProjected","projected","getCoordSys$1","defaultParams","resizeGeo","projection_1","leftTop_1","rightBottom_1","sampleLine","centerOption","sizeOption","useCenterAndSize","boxLayoutOption","GeoCreator","geoList","getCommonGeoProperties","mapModelGroupBySeries","nameMapList","singleMapSeries","getFilledRegions","originRegionArr","regionsArr","regionOption","geoCreator","GeoModel","_optionModelMap","optionModelMap","regionOpt","unSelect","toggleSelected","getCenterCoord","updateCenterAndZoom","fixY","previousZoom","fixX","GeoView","_handleRegionClick","updateSelectStatus","geoId","registerMap$1","install$9","makeAction","allSelected","isExpand","subtreeW","hierNode","executeShifts","prelim","midPoint","defaultAncestor","subtreeV","nodeOutRight","nodeInRight","nodeOutLeft","nodeInLeft","sumOutRight","sumInRight","sumOutLeft","sumInLeft","nextRight","nextLeft","moveSubtree","wl","wr","thread","nodeX","defaultSeparation","radialCoordinate","TreeEdgeShape","parentPoint","childPoints","TreePath","childLen","firstChildPos","lastChildPos","forkDim","forkPosition","tmpPoint","TreeView","_mainGroup","_updateViewCoordSys","symbolNeedsDraw$1","updateNode","_nodeScaleRatio","_updateNodeAndLinkScale","oldMin","_min","oldMax","viewCoordSys","nodeScale","_getNodeGlobalScale","nodeScaleRatio","groupZoom","getNodeByDataIndex","virtualRoot","sourceSymbolEl","sourceLayout","sourceOldLayout","__oldX","__oldY","__radialOldRawX","rawY","__radialOldRawY","targetLayout","__radialRawX","__radialRawY","rootLayout","realRoot","labelRotateRadian","focusDataIndices","getAncestorsIndices","getDescendantIndices","edgeShape","getOrient","curvature","edgeForkPosition","__edge","getEdgeShape","childLayout","removeNodeEdge","removeAnimationOpt","getSourceNode","sourceEdge","layoutOpt","radialCoor2","radialCoor3","radialCoor4","radialCoor1","inner$7","linkSeriesData","datasAttr","linkAll","transferInjection","cloneShallowInjection","changeInjection","linkSingle","structAttr","TreeNode","eachNode","suppressVisitSub","updateDepthAndHeight","getNodeById","getAncestors","includeSelf","currNode","hostTree","getLevelModel","levelModels","getChildIndex","isDescendantOf","viewChildren","Tree","clearLayouts","createTree","dataRoot","beforeLink","listData","dimMax","buildHierarchy","dataNode","addChild","retrieveTargetInfo","validPayloadTypes","targetNodeId","getPathToRoot","aboveViewRoot","viewRoot","wrapTreePathInfo","treePathInfo","nodeDataIndex","TreeSeriesModel","leavesModel","treeDepth","expandTreeDepth","expandAndCollapse","initialTreeDepth","treeAncestors","curveness","eachBefore","treeLayout","commonLayout","separation$1","tx_1","kx_1","ky_1","coorX_1","coorY_1","orient_1","init$2","inRoot","eachAfter","finalCoor","treeVisual","actionTypes","installTreemapAction","originViewRoot","getViewRoot","resetViewRoot","enableAriaDecalForTree","decalPaletteScope","TreemapSeriesModel","completeTreeValue","childValue","thisValue","designatedVisualItemStyle","designatedVisualModel","hasColorDefine","hasDecalDefine","level0","globalColorList","globalDecalList","levelDefine","modelColor","modelDecal","levelModel","setLayoutInfo","mapIdToIndex","idIndexMap","_idIndexMap","_idIndexMapCount","_viewRoot","enableAriaDecal","clipWindow","squareRatio","leafDepth","drillDownIcon","zoomToNodeRatio","nodeClick","emptyItemWidth","upperLabel","colorAlpha","colorSaturation","gapWidth","borderColorSaturation","visualDimension","visualMin","visualMax","colorMappingBy","visibleMin","childrenVisibleMin","Breadcrumb","emphasisTextStyleModel","thisGroup","layoutParam","renderList","_prepare","_renderContent","TEXT_PADDING","availableSize","itemNode","selfType","containerGroup","AnimationWrap","_elExistsMap","_storage","_finishedCallback","checkTerminate","Group$1","Rect$1","PATH_LABEL_NOAMAL","PATH_UPPERLABEL_NORMAL","Z2_BASE","Z2_BG","Z2_CONTENT","getStateItemStyle","getItemStyleNormal","inner$8","TreemapView","reRoot","renderResult","_oldTree","thisStorage","rootNodeGroup","nodeGroup","_giveContainerGroup","_doRender","renderFinally","_doAnimation","_resetController","_renderBreadcrumb","_containerGroup","thisTree","oldTree","lastsForAnimation","createStorage","oldStorage","willInvisibleEls","doRenderNode","thisNode","oldNode","renderNode","thisLayout","nodeModel","isInView","focusOrIndices","thisWidth","thisHeight","thisInvisible","thisRawIndex","oldRawIndex","thisViewChildren","upperHeight","isParent","itemStyleNormalModel","itemStyleEmphasisModel","itemStyleBlurModel","itemStyleSelectModel","giveGraphic","nodeWidth","nodeHeight","isAboveViewRoot","useUpperLabel","visualBorderColor","processInvisible","upperLabelWidth","prepareText","upperLabelHeight","nodeStyle","disableMorphing","upperLabelRect","isShow","addDrillDownIcon","textEmphasisState","isLeafRoot","iconChar","storageName","lastCfg","lasts","oldShape","parentOldY","parentOldX","parentOldBg","fadein","dualTravel","oldViewChildren","sameTree","willDeleteEls","delEls","willDelete","_oldRootLayout","durationOption","easingOption","animationWrap","targetY","innerStore","_onPan","_onZoom","_clearController","rootRect","findTarget","_rootToNode","_zoomToNode","linkTarget","_breadcrumb","each$3","isObject$3","CATEGORY_DEFAULT_VISUAL_INDEX","VisualMapping","mapValueToVisual","_normalizeData","_normalizedToVisual","getNormalizer","listVisualTypes","isValidType","eachVisual","mapVisual","isPrimary","newVisual","retrieveVisuals","hasVisual","prepareVisualTypes","visualTypes","types_1","dependsOn","visualType1","visualType2","findPieceIndex","pieceList","findClosestWhenOutside","possibleI","pieceValue","updatePossible","piece","newAbs","applyVisual","makeApplyVisual","getColorMapper","thisOption","mappingMethod","isNormalized","doMapCategory","returnRGBArray","parsedVisual","piecewise","getSpecifiedVisual","doMapFixed","colorHue","makePartialColorVisualHandler","color$1","colorLightness","createNormalizedToNumericVisual","doMapToArray","visualHandler","normalizers","normalizeVisualRange","hasSpecialVisual","originIndex","preprocessForSpecifiedCategory","visualArr_1","categoryMap","cate","setVisualToOption","visualArr","applyValue","colorChannel","sourceExtent","pieceIndex","inner$9","treemapVisual","travelTree","designatedVisual","viewRootAncestors","nodeLayout","nodeItemStyleModel","visuals","buildVisuals","existsStyle","thisNodeColor","calculateBorderColor","mapping_1","buildVisualMapping","childVisual","visualName","getValueVisualDefine","rangeVisual","getRangeVisual","drColorMappingBy","mappingType","childVisuals","mathMax$7","mathMin$7","each$4","PATH_BORDER_WIDTH","PATH_GAP_WIDTH","PATH_UPPER_LABEL_SHOW","PATH_UPPER_LABEL_HEIGHT","treemapLayout","viewRootLayout_1","seriesOption","viewAbovePath","treeRoot","rootSize","defaultSize","viewArea","currNodeValue","getUpperLabelHeight","sort_1","hideChildren","halfGapWidth","layoutOffset","layoutOffsetUpper","totalArea","initChildren","rowFixedLength","worst","targetCenter","prunning","nodeInViewAbovePath","childClipRect","orderBy","overLeafDepth","orderedChildren","deletePoint","areaMax","areaMin","squareArea","idx0WhenH","idx1WhenH","xy","rowOtherLength","rowLen","wh1","remain","modWH","wh0","categoryFilter","graphSeries","categoriesData","getCategoriesData","getGraph","categoryNames","categoryVisual","paletteScope","categoryNameIdxMap","symbolVisualList","symbolVisual","categoryIdx","categoryStyle","visualList","normalize$2","graphEdgeVisual","getEdgeData","getEdgeByIndex","KEY_DELIMITER","getAutoCurvenessParams","createCurveness","appendLength","autoCurvenessParmas","curvenessList","__curvenessList","getKeyOfEdges","getOppositeKey","getEdgeFromMap","__edgeMap","getTotalLengthBetweenNodes","getEdgeMapLengthWithKey","edgeMap","getCurvenessForEdge","needReverse","autoCurvenessParams","isArrayParam","edgeArray","edgeIndex","totalLen","curKey","parityCorrection","isForward","oppositeKey","resValue","simpleLayout","simpleLayoutEdge","eachEdge","graphSimpleLayout","dimensions_1","getNodeGlobalScale","PI$6","_symbolRadiansHalf","circularLayout","basedOn","draggingNode","tempX","tempY","rotateNodeLabel","_layoutNodesBasedOn","x12","y12","unitAngle","radianHalf","sumRadian","halfRemainRadian","symbolRadianHalf","circularRotateLabel","getGraphicEl","graphCircularLayout","scaleAndAdd$1","graphForceLayout","preservedPoints_1","graph_1","nodeData_1","forceModel","nodeDataExtent_1","edgeDataExtent_1","repulsionArr_1","edgeLengthArr_1","nodes_1","forceInstance","preservedPoints","initLayout","repulsion","edgeLength","rep","edgeModel","ignoreForceLayout","inNodes","inEdges","pp","beforeStepCallback","afterStepCallback","initialFriction","warmUp","setFixed","setUnfixed","beforeStep","afterStep","v12","nLen","repFact","getNodeByIndex","forceLayout","createViewCoordSys","bbHeight","coordSysType","bbWidth","straightLineProto","bezierCurveProto","StraightLineShape","CurveShape","isStraightLine","ECLinePath","SYMBOL_CATEGORIES","makeSymbolTypeKey","symbolCategory","makeSymbolTypeValue","symbolSizeArr","createSymbol$1","symbolOffsetArr","__specifiedRotation","setLinePoints","_createLine","_updateCommonStl","getLinePath","emphasisLineStyle","blurLineStyle","selectLineStyle","lineState","lineStateStyle","stateStyle","labelNormalModel","__align","__verticalAlign","__position","__labelDistance","linePath","symbolFrom","symbolTo","invScale","fromPos","toPos","setSymbolRotation","halfPercent","tangent","specifiedRotation","Line$1","LineDraw","oldLineData","_lineData","makeSeriesScope$1","_doUpdate","lineNeedsDraw","_LineCtor","newLineData","LineCtor","isPointNaN","pts","v3","v2DistSquare","mathAbs$2","intersectCurveCircle","curvePoints","radiusSquare","nextDiff","adjustEdge","tmp0","quadraticSubdivide$1","pts2","fromSymbol","toSymbol","originalPoints","__original","isViewCoordSys","GraphView","lineDraw","_lineDraw","_firstRender","groupNewProp","_layoutTimeout","layoutAnimation","_startForceLayoutIteration","_layouting","getAdjacentDataIndices","generateNodeKey","Graph","isDirected","_directed","addNode","nodesMap","_nodesMap","GraphNode","hostGraph","addEdge","edgesMap","_edgesMap","GraphEdge","outEdges","getEdge","breadthFirstTraverse","edgeType","__visited","currentNode","otherNode","directed","inDegree","outDegree","adjacentEdge","getTrajectoryDataIndices","connectedEdgesMap","connectedNodesMap","sourceNodesQueue","targetNodesQueue","nodeIteratorIndex","sourceNode","sourceNodes","targetNodes","createGraphDataProxyMixin","hostName","createGraphFromNodeEdge","linkNameList","validEdges","linkCount","coordSysCtor","GraphSeriesModel","_categoriesData","_updateCategoriesData","categoryModel","_categoriesModels","oldGetModel","newGetModel","newPathArr","oppositeEdges","sourceName","circular","rotateLabel","edgeSymbol","edgeSymbolSize","edgeLabel","PointerShape","PointerPath","formatLabel","GaugeView","colorList","posInfo","_renderMain","axisLineModel","MainPath","showAxis","axisLineWidth","angleRangeSpan","prevEndAngle","sectors","_renderTicks","_renderTitleAndDetail","_renderAnchor","_renderPointer","autoColor","textStyleX","textStyleY","subSplitNumber","splitLineLen","tickLen","subStep","splitLineStyle","splitLineDistance","tickLine","oldProgressData","_progressEls","progressList","showPointer","progressModel","showProgress","valueExtent","angleExtent","createPointer","pointerModel","pointerWidth","pointerLength","pointerStr","pointerOffset","pointerOffsetX","pointerOffsetY","pointerKeepAspect","createProgress","ProgressPath","isOverlap","progressWidth","isClip","previousProgress","previousRotate","previousPointer","anchorSize","offsetCenter","anchorKeepAspect","anchorModel","anchorType","contentGroup","newTitleEls","newDetailEls","showPointerAbove","_titleEls","_detailEls","detailX","labelEl","formatter_1","itemTitleModel","itemDetailModel","titleOffsetCenter","titleX","titleY","detailOffsetCenter","detailY","detailColor","GaugeSeriesModel","opacityAccessPath","FunnelPiece","FunnelView","funnelPiece","FunnelSeriesModel","minSize","funnelAlign","funnelLayout","sizeExtent","isAscending","ParallelView","_dataGroup","dataGroup","makeSeriesScope$2","newDataIndex","updateElCommon","addEl","oldDataIndex","createLinePoints","ParallelSeriesModel","makeDefaultEncode","getRawIndicesByActiveState","eachActiveState","theActiveState","parallelIndex","inactiveOpacity","activeOpacity","dataDimIndex","opacityAccessPath$1","parallelVisual","opacityMap","inactive","itemOpacity","parallelPreprocessor","hasParallelSeries","parallelAxis","axisOption","parallelOption","_handlers","_throttledDispatchExpand","_dispatchExpand","ParallelView$1","checkTrigger","_mouseDownPoint","mouseDownPoint","getSlidedAxisExpandWindow","axisExpandWindow","triggerOn","ParallelModel","_initDimensions","setAxisExpand","axisExpandable","axisExpandCenter","axisExpandCount","axisExpandWidth","axisExpandRate","axisExpandDebounce","axisExpandSlideTriggerArea","axisExpandTriggerOn","ParallelAxis","sliderMove","handleEnds","handleIndex","minSpan","maxSpan","originalDistSign","handleSpan","getSpanSign","extentMinSpan","realExtent","currDistSign","each$5","mathMin$8","mathMax$8","mathFloor$1","mathCeil$1","round$3","PI$7","Parallel","_updateAxesFromSeries","_makeLayoutInfo","axisBase","layoutBase","pixelDimIndex","pAxis","pLayout","layoutLength","_layoutAxes","layoutExtent","axisCount","restrict$1","axisCollapseWidth","winSize","winInnerIndices","axisExpandWindow0Pos","positionTable","_axesLayout","axisCoordToPoint","dataDimensions","axisModels","hasActiveSet","hasAxisBrushed","lenj","getActiveState","getAxisLayout","triggerArea","winSize2","pointCoord","useJump","parallelCoordSysCreator","ParallelAxisModel","getAreaSelectStyle","setActiveIntervals","activeIntervals","BRUSH_PANEL_GLOBAL","mathMin$9","mathMax$9","mathPow$2","COVER_Z","UNSELECT_THRESHOLD","MIN_RESIZE_LINE_WIDTH","DIRECTION_MAP","CURSOR_MAP","DEFAULT_BRUSH_OPT","transformable","brushMode","removeOnClick","baseUID","BrushController","enableBrush","brushOption","_mounted","_brushType","_doDisableBrush","brushType","_doEnableBrush","userKey","_enableGlobalPan","_uid","_brushOption","setPanels","panelOpts","panels_1","_panels","panelId","enableGlobalPan","updateCovers","coverConfigList","coverConfig","tmpIdPrefix","oldCovers","_covers","newCovers","creatingCover","_creatingCover","cover","__brushOption","addOrUpdate","newBrushInternal","endCreating","createCover","updateCoverAfterCreation","unmount","clearCovers","pointerHandlers","coverRenderers","coverRenderer","getCoverRenderer","updateCoverShape","updateCommon","getPanelByPoint","localCursorPoint","panel","pn","isTargetByCursor","getPanelByCover","covers","trigger$1","getTrackEnds","createBaseRectCover","rectRangeConverter","edgeNameSequences","makeStyle","driftRect","ondragend","nameSequence","updateBaseRect","localRange","handleSize","xa","ya","x2a","y2a","widtha","heighta","updateRectShape","mainEl","globalDir","getGlobalDirection1","localDirNameSeq","clipByPanel","xmin","ymin","xmax","ymax","formatRectRange","localDirName","dirNameSequence","rectRange","toRectRange","localDelta","toLocalDelta","dirName","ind","fromRectRange","driftPolygon","localD","localZero","resetCursor","isOutsideZrArea","currPanel","rawE","mainShapeContain","updateCoverByMouse","eventParams","_creatingPanel","thisBrushOption","determineBrushType","getCreatingRange","defaultBrushType","handleDragEnd","getLineRenderer","returnInput","localTrack","xyIndex","getLinearBrushOtherExtent","makeRectPanelClipPath","normalizeRect","localPoints","makeLinearBrushOtherExtent","specifiedXYIndex","brushWidth","makeRectIsTargetByCursor","targetModel","elementList","ParallelAxisView","_brushController","_onBrush","areaWidth","builderOpt","coordSysModel","areaSelectStyle","_refreshBrushController","extentLen","coverInfoList","coverInfo","realtime","parallelAxisId","actionInfo$1","defaultAxisOption","install$g","parallelAxisModel","SankeyPathShape","SankeyPath","SankeyView","sankeyView","n1Layout","node1Model","dragX1","dragY1","n2Layout","node2Model","dragX2","dragY2","edgeLayout","defaultEdgeLabelText","applyCurveStyle","edgeLabelStateModels","dragX","dragY","_focusAdjacencyDisabled","localX","localY","curveProps","sourceColor","targetColor","SankeySeriesModel","nodeDepth","setNodePosition","localPosition","rawDataOpt","edgeValue","nodeGap","layoutIterations","nodeAlign","sankeyLayout","getEdgeValue","nodeRawValue","iterations","remainEdges","indegreeArr","zeroIndegrees","nextTargetNode","maxNodeDepth","isItemDepth","edgeIdx","indexEdge","adjustNodeWithNodeAlign","nextSourceNode","remainNodes","skNodeHeight","isNodeDepth","moveSinksRight","scaleNodeBreadths","computeNodeDepths","nodesByBreadth","keyAttr","groupResult","minKy","nodeDy","edgeDy","resolveCollisions","relaxRightToLeft","nodeY","weightedTarget","centerTarget","center$1","weightedSource","centerSource","computeEdgeDepths","nodeDyAttr","sankeyVisual","minValue_1","maxValue_1","mapValueToColor","customColor","edgeStyle","WhiskerBoxCommonMixin","_hasEncodeRule","encodeRules","newOptionData_1","xAxisType","yAxisType","coordDims","addOrdinal","baseAxisDimIndex","_baseAxisDim","baseAxisType","otherAxisType","defaultValueDimensions","BoxplotSeriesModel","boxWidth","BoxplotView","constDim","createNormalBox","updateNormalBoxData","BoxPathShape","BoxPath","initBaseline","each$6","boxplotLayout","axisList","groupItem","seriesCount","boxWidthList","boxOffsetList","boundList","maxDataCount_1","boxGap","boxWidthBound","layoutSingleSeries","halfWidth","cDimIdx","vDimIdx","cDim","vDims","axisDimVal","getPoint","end1","end2","end4","end5","addBodyEnd","layEndLine","endCenter","boxplotTransform","boxData","boundIQR","useExtreme","ascList","itemNameFormatter","positiveBorderColorQuery","negativeBorderColorQuery","dojiBorderColorQuery","positiveColorQuery","negativeColorQuery","getBorderColor","candlestickVisual","SKIP_PROPS","CandlestickView","_incrementalRenderNormal","isSimpleBox","clipArea","isNormalBoxClipped","createNormalBox$1","setBoxCommon","createLarge$1","NormalBoxPathShape","NormalBoxPath","__simpleBox","LargeBoxPathShape","LargeBoxPath","__sign","elP","elN","elDoji","setLargeStyle","CandlestickSeriesModel","getShadowDim","brushRect","borderColorDoji","candlestickPreprocessor","seriesItem","candlestickLayout","candleWidth","cDimI","vDimsI","openDimI","closeDimI","lowestDimI","highestDimI","hasDojiColor","openVal","closeVal","lowestVal","highestVal","getSign","ocLow","ocHigh","ocLowPoint","ocHighPoint","lowestPoint","highestPoint","subPixelOptimizePoint","pmin","pmax","updateRipplePath","rippleGroup","effectCfg","rippleEffectColor","ripplePath","EffectSymbol","stopEffectAnimation","startEffectAnimation","rippleNumber","effectOffset","rippleScale","updateEffectAnimation","oldEffectCfg","_effectCfg","DIFFICULT_PROPS","showEffectOn","EffectScatterView","effectSymbolDraw","_updateGroupTransform","EffectScatterSeriesModel","effectType","rippleEffect","EffectLine","createLine","_updateEffectSymbol","effectModel","_symbolScale","_updateEffectAnimation","roundTrip","constantSpeed","delayNum","delayExpr","_updateAnimationPoints","_getLineLength","_period","_roundTrip","__t","_animateSymbol","_updateSymbolPosition","__p1","__cp1","__p2","quadraticDerivativeAt$1","__lastT","Polyline$1","_createPolyline","EffectPolyline","accLenArr","_length","_offsets","_lastFrame","_lastFramePercent","LargeLinesPathShape","segs","LargeLinesPath","LargeLineDraw","lineEl","newSegs","oldSegs","isIncremental","linesLayout","isPolyline","lineCoords","totalCoordsCount","getLineCoordsCount","getLineCoords","LinesView","_updateLineDraw","trailLength","_lastZlevel","_showEffect","hasEffect","_hasEffet","_isPolyline","Uint32Arr","Float64Arr","compatEc2","fromName","toName","LinesSeriesModel","_processFlatCoordsArray","_flatCoords","flatCoords","_flatCoordsOffset","flatCoordsOffset","_getCoordsFromItemModel","coordsOffsetAndLenStorage","coordsStorage","coordsCursor","offsetCursor","normalize$3","linesVisual","HeatmapLayer","colorFunc","isInRange","_getBrush","gradientInRange","_getGradient","gradientOutOfRange","blurSize","imageData","getImageData","pixelLen","minOpacity","diffOpacity","maxOpacity","gradientOffset","putImageData","brushCanvas","_brushCanvas","gradientPixels","_gradientPixels","pixelsSingleState","Uint8ClampedArray","outOfRange","isGeoCoordSys","HeatmapView","visualMapOfThisSeries","eachTargetSeries","targetSeries","_renderOnCartesianAndCalendar","_renderOnGeo","isCartesian2d","dataDimX","dataDimY","dataToRect","contentShape","emphasisModel_1","visualMapModel","dataSpan","inRangeVisuals","targetVisuals","outOfRangeVisuals","hmLayer","_hmLayer","lng","lat","getPieceList","HeatmapSeriesModel","BAR_BORDER_WIDTH_QUERY","LAYOUT_ATTRS","posDesc","pathForLineWidth","PictorialBarView","coordSysRect","ecSize","coordSysExtent","categoryDim","symbolMeta","getSymbolMeta","createBar","updateCommon$1","pictorialShapeStr","getShapeStr","__pictorialShapeStr","__pictorialBundle","bundlePosition","symbolRepeat","createOrUpdateRepeatSymbols","createOrUpdateSingleSymbol","createOrUpdateBarRect","createOrUpdateClip","__pictorialSymbolMeta","removeBar","symbolClip","symbolPosition","symbolPatternSize","symbolRepeatDirection","outputSymbolMeta","symbolBoundingData","zeroPx","pxSignIdx","boundingLength","symbolBoundingExtent","convertToCoordOnAxis","repeatCutLength","isXAxis","isInverse","pxSign","categorySize","parsedSymbolSize","symbolScale","valueLineWidth","pathLen","unitLength","sizeFix","absBoundingLength","symbolMargin","hasEndGap","symbolMarginNumeric","uLenWithMargin","endFix","repeatSpecified","repeatTimes","toIntTimes","pathPosition","barRectShape","createPath","eachPath","__pictorialAnimationIndex","__pictorialRepeatTimes","makeTarget","mainPath","__pictorialMainPath","barRect","__pictorialBarRect","__pictorialClipPath","immediateAttrs","animationAttrs","barPositionOutside","roundedTimes","PictorialBarSeriesModel","ThemeRiverView","layersSeries","getLayerSeries","keyGetter","dataDiffer","_layersSeries","newLayersGroups","oldLayersGroups","layerGroup","textLayout","ThemeRiverSeriesModel","fixData","rawDataLength","timeValueKeys","layerData","layerNum","dataList","timeValue","lenCount","indexArr","timeDim","layerSeries","index1","index2","getAxisTooltipData","nestestValue","nearestIdx","pointNum","theValue","singleAxisIndex","themeRiverLayout","doThemeRiverLayout","baseY0","layerPoints","singleLayer","baseLine","layerIndex","SunburstPiece","_seriesModel","_ecModel","itemStyleModel","labelMinAngle","isNormalShown","getLabelAttr","stateAttr","labelStateModel","sectorState","labelColor","labelPadding","flipStartAngle","flipEndAngle","midAngleNormal","needsFlip","ROOT_TO_NODE_ACTION","HIGHLIGHT_ACTION","UNHIGHLIGHT_ACTION","installSunburstAction","SunburstView","newChildren","oldChildren","newRoot","renderLabelForZeroData","_oldChildren","virtualPiece","targetFound","SunburstSeriesModel","completeTreeValue$1","_levelModels","RADIAN$2","sunburstLayout","rootDepth","initChildren$1","sort$2","renderRollupNode","rPerLevel","rStart","rEnd","r0_1","r_1","radius_1","siblingAngle_1","sortTargets","isAsc_1","sunburstVisual","treeHeight","STYLE_VISUAL_TYPE","NON_STYLE_VISUAL_PROPS","customInnerStore","CustomSeriesModel","currentZLevel","currentZ","dataToCoordSize","dataSize","halfSize","dataToCoordSize$1","dataToCoordSize$2","dataToCoordSize$3","deprecatedLogs","isEC4CompatibleStyle","elType","hasOwnTextContentOption","hasOwnTextConfig","convertFromEC4CompatibleStyle","hostStyle","textContentStyle","srcStyle","hasOwnPos","textDistance","convertEC4CompatibleRichItem","richItem","textStrokeWidth","textLineHeight","textBoxShadowColor","textBoxShadowBlur","textBoxShadowOffsetX","textBoxShadowOffsetY","convertToEC4StyleForCustomSerise","itemStl","txStl","txCfg","hostFill","textFillNotSet","convertToEC4RichItem","warnDeprecated","insteadApproach","LEGACY_TRANSFORM_PROPS_MAP","LEGACY_TRANSFORM_PROPS","TRANSFORM_PROPS_MAP","transformPropNamesStr","ELEMENT_ANIMATABLE_PROPS","transitionInnerStore","getElementAnimationConfig","elOption","animationProp","userDuring","duringCall","applyUpdateTransition","enterFromProps_1","clearStyle","styleOpt","transFromProps","propsToSet","allProps","legacyName","xyName","legacyArr","prepareShapeOrExtraAllPropsFinal","prepareTransformTransitionFrom","transitionKeys","isTransitionAll","checkTransformPropRefer","prepareShapeOrExtraTransitionFrom","prepareStyleTransitionFrom","fromEl","transFromStyleProps","fromElStyle","styleTransition","elTransition","animationStyleProps","styleKeys","applyPropsDirectly","allPropsFinal","enterFrom","updateLeaveTo","leaveToProps","leaveTo","applyLeaveTransition","tmpDuringScope","transitionDuringAPI","assertNotReserved","setExtra","getExtra","scopeUserDuring","mainAttr","attrOpt","optVal","elPropsInAttr","attrTransition","transFromPropsInAttr","elPropsInAttrKeys","allPropsInAttr","keysInAttr","usedIn","getStateToRestore","KEYFRAME_EXCLUDE_KEYS","stopPreviousKeyframeAnimationAndRestore","applyKeyframeAnimation","animationOpts","stateToRestore","singleAnimationOpts","targetPropName","endFrameIsSet","kfValues","propKeys","savedTarget","EMPHASIS","NORMAL","SELECT","STATES","PATH_ITEM_STYLE","PATH_LABEL","DEFAULT_TRANSITION","GROUP_DIFF_PREFIX","attachedTxInfoTmp","prepareCustoms","getRadiusAxis","getAngleAxis","dataToRadius","dataToAngle","getRangeInfo","cellWidth","getCellWidth","cellHeight","getCellHeight","dayCount","allDay","isPath$1","isDisplayable","CustomChartView","customSeries","renderItem","makeRenderItem","createOrUpdateItem","setIncrementalAndHoverLayer","elementName","createEl","graphicType","pathRect","getPathData","customPathData","customImagePath","customGraphicType","updateElNormal","attachedTxInfo","decalObj","decalPattern","txCfgOpt","textOptionStyle","__decalPattern","keyframeAnimation","updateElOnState","elStateOpt","elDisplayable","existingEmphasisState","updateZ$1","optZ2","retrieveStateOption","currDataIndexInside","currItemModel","prepareResult","userAPI","userProps","getItemStyleModel","preFetchFromExtra","applyUserPropsAfter","ordinalRawValue","styleEmphasis","style_1","barLayout","widthAndOffsets","currentSeriesIndices","userParams","dataInsideLength","currItemStyleModels","currLabelModels","seriesItemStyleModels","seriesLabelModels","existsEl","doCreateOrUpdateEl","toBeReplacedIdx","doesElNeedRecreate","morph","conOpt","isLegacy","processTxInfo","txConOptNormal","txConOptEmphasis","txConOptBlur","txConOptSelect","txConStlOptNormal","txConOptOtherState","retrieveStyleOptionOnState","clipPathOpt","otherStyleOpt","otherStateOpt","mergeChildren","byName","$mergeChildren","diffChildrenByName","diffGroupChildren","processAddUpdate","processRemove","removeChildFromGroup","elInner","elOptionType","elOptionShape","elOptionStyle","stateOpt","txConOpt","convertResult","txConOptNormal_1","stateOptionNormal","stateOption","childOption","inner$a","clone$3","bind$1","BaseAxisPointer","doUpdateProps","_axisModel","_axisPointerModel","_lastValue","_lastStatus","_group","_handle","makeElOption","graphicKey","_lastGraphicKey","moveAnimation","_moveAnimation","determineAnimation","updateProps$1","updatePointerEl","updateLabelEl","createPointerEl","createLabelEl","updateMandatoryProps","_renderHandle","isCategoryAxis","useSnap","pointerOption","pointerEl","updateLabelShowHide","handleModel","updateHandleTransform","onmousemove","onmousedown","_onHandleDragMove","_onHandleDragEnd","_moveHandleToValue","getHandleTransProps","getHandleTransform","trans","_payloadInfo","lastProp","_doDispatchAxisPointer","payloadInfo","cursorPoint","tooltipOption","buildLabel","xDimIndex","propsEqual","lastProps","equals_1","buildElStyle","axisPointerType","buildLabelElOption","labelPos","getValueLabel","paddings","seriesDataIndices","params_1","axisDimension","idxItem","getTransformedPosition","buildCartesianSingleLabelElOption","makeLineShape","makeRectShape","makeSectorShape","CartesianAxisPointer","otherExtent","pixelValue","pointerShapeBuilder","currPosition","cursorOtherValue","getAxisDimIndex","shadow","AxisPointerModel","shadowStyle","inner$b","each$7","useHandler","dis","showTip","hideTip","dispatchTooltipFinally","actuallyPayload","showLen","hideLen","doEnter","onLeave","currTrigger","AxisPointerView","findPointFromSeries","isStacked","inner$c","axisTrigger","isIllegalPoint","inputAxesInfo","outputPayload","showValueMap","updaters","linkTriggers","outputAxesInfo","lastHighlights","toHighlight","toDownplay","illegalPoint","dataByCoordSys","coordSysContainsPoint","inputAxisInfo","processOnAxis","tarAxisInfo","tarKey","srcAxisInfo","srcKey","srcValItem","makeMapperParam","valItem","payloadBatch","sampleItem","dataByAxis","highDownKey","noSnap","outputFinder","snapToValue","seriesNestestValue","coordSysItem","coordSysId","coordSysIndex","coordSysMainType","valueLabelOpt","install$s","PolarAxisPointer","coordValue","pointerShapeBuilder$1","axisAngle","PolarModel","foundAxisModel","PolarAxisModel","AngleAxisModel","RadiusAxisModel","RadiusAxis","radiusToData","inner$d","AngleAxis","angleToData","polarDimensions","Polar","_radiusAxis","_angleAxis","maxAngle","getCoordSys$2","updatePolarScale","setAxis","polarCreator","polarList","parsedRadius","elementList$1","getAxisLineShape","rExtent","getRadiusIdx","fixAngleOverlap","lastItem","AngleAxisView","ticksAngles","minorTickAngles","angelAxisElementsBuilders","rId","r0Id","shapeType","tickAngleItem","tickAngles","commonLabelModel","labelTextAlign","labelTextVerticalAlign","prevAngle","axisBuilderAttrs$2","selfBuilderAttrs$1","RadiusAxisView","newAxisGroup","axisElementBuilders$1","prevRadius","getSeriesStackId$1","getAxisKey$1","barLayoutPolar","lastStackCoords","clampLayout","angleSpan","radiusSpan","angleAxisExtraOption","radiusAxisExtraOption","PolarView","layout$2","axisBuilderAttrs$3","selfBuilderAttrs$2","SingleAxisView","axisElementBuilders$2","SingleAxisModel","SingleAxis","singleDimensions","Single","_axis","_adjustAxis","_updateAxisTransform","extentSum","getCoordSys$3","singleModel","singleCreator","singles","XY","WH","SingleAxisPointer","getPointDimIndex","pointerShapeBuilder$2","SingleView","CalendarModel","mergeAndNormalizeLayoutParams","getCellSize","cellSize","cellSizeArr","CalendarView","calendarModel","rangeData","localeModel","_renderDayRect","_renderLines","_renderYearText","_renderMonthText","_renderWeekText","itemRectStyleModel","sh","getNextNDay","tl","_tlpoints","_blpoints","_firstDayOfMonth","_firstDayPoints","addPoints","formatedDate","getDateInfo","_getLinePointsOfOneWeek","_drawSplitline","_getEdgesPoints","rs","poyline","tmpD","_formatterLabel","_yearTextPositionControl","aligns","posPoints","yearText","xc","yc","_monthTextPositionControl","vAlign","termPoints","labelSilent","firstDayPoints","monthText","_weekTextPositionControl","lweek","fweek","weekText","Calendar","_rangeInfo","_sw","_sh","_orient","_firstDayOfWeek","mStr","dStr","_lineWidth","_getRangeInfo","_initRangeOption","whNames","layoutParams","cellNumbers","whGlobal","cellSizeSpecified","calendarRect","dayInfo","nthWeek","pointToDate","nthX","nthY","_getDateByWeeksAndDay","getCoordSys$4","rangeStr","normalizedRange","reversed","dateNum","parsedRange","startDateNum","endDateNum","nthDay","calendarList","calendarSeries","isSetLoc","TRANSITION_PROPS_TO_COPY","ROOT_TRANSITION_PROPS_TO_COPY","copyTransitionInfo","GraphicComponentModel","existList","flattenedList","elOptionsToUpdate","_elOptionsToUpdate","newElOptCopy","existElOption","$action","existItem","newElOption","parentId","newElParentOption","parentOption","newType","newGroupOpt","existingGroupOpt","optionList","useElOptionsToUpdate","nonShapeGraphicElements","inner$e","GraphicComponentView","_elMap","graphicModel","_lastGraphicModel","_updateElements","_relocate","rootGroup","globalZ","globalZLevel","clipPathOption","elExisting","targetElParent","textContentOption","elOptionCleaned","isMerge","isReplace","el_1","createEl$1","updateCommonAttrs","removeEl","el_2","textContentExisting","clipPathType","isParentRoot","elOptions","apiWidth","apiHeight","parentElInner","layoutPos","layouted","animatePos","defaultZ","defaultZlevel","DATA_ZOOM_AXIS_DIMENSIONS","SERIES_COORDS","getAxisMainType","findEffectedDataZooms","foundNewLink","axisRecords","effectedModels","effectedModelMap","dataZoomModel","addToEffected","processSingle","isLink","eachTargetAxis","axisIdxArr","collectReferCoordSysModelInfo","coordSysInfoWrap","infoList","infoMap","coordSysUid","DataZoomAxisInfo","axisCmptIdx","indexMap","indexList","DataZoomModel","inputRawOption","retrieveRawOption","settledOption","_setDefaultThrottle","_updateRangeUse","_rangePropMode","_resetTarget","optionOrient","targetAxisIndexMap","_targetAxisInfoMap","_fillSpecifiedTargetAxis","_makeAutoOrientByTargetAxis","_fillAutoTargetAxisByOrient","_noTarget","hasAxisSpecified","refering","needAuto","setParallelAxis","gridModel_1","axModel","_autoThrottle","globalOption","rangePropMode","rangeModeInOption","percentSpecified","valueSpecified","noTarget","getFirstTargetAxisModel","firstAxisModel","getAxisProxy","getAxisModel","__dzAxisProxy","setRawRange","setCalculatedRange","getPercentRange","axisProxy","findRepresentativeAxisProxy","getDataPercentWindow","getValueRange","getDataValueWindow","firstProxy","axisDimList","hostedBy","getRangePropMode","filterMode","SelectDataZoomModel","DataZoomView","SelectDataZoomView","each$8","asc$1","AxisProxy","_dataZoomModel","_valueWindow","_percentWindow","getTargetSeriesModels","coordType","axisMainType","_dimName","_axisIndex","getMinMaxSpan","_minMaxSpan","calculateDataWindow","hasPropModeValue","_dataExtent","percentExtent","percentWindow","valueWindow","boundPercent","boundValue","restrictSet","fromWindow","toWindow","fromExtent","toExtent","toValue","dataWindow","seriesExtent","_updateMinMaxSpan","_setAxisModel","store_1","dataDimIndices_1","leftOut","rightOut","thisHasValue","thisLeftOut","thisRightOut","minMaxSpan","percentSpan","valueSpan","dataZoomProcessor","eachAxisModel","proxyList","seriesModelMap","percentRange","valueRange","installed","installCommon","install$y","ToolboxFeature","registerFeature","getFeature","ToolboxModel","featureName","itemGap","showTitle","makeBackground","ToolboxView","toolboxModel","featureOpts","featureNames","processFeature","featureModel","newTitle","iconsMap","titlesMap","iconStyleModel","iconStyleEmphasisModel","iconPaths","isToolboxFeature","unusable","icons","getIcons","titles","__title","hoverStyle","defaultTextPosition","setIconStatus","iconStatus","_features","_featureNames","viewportSize","needPutOnTop","titleText","emphasisTextConfig","emphasisTextState","emphasisTextStyle","topOffset","SaveAsImage","MouseEvent","msSaveOrOpenBlob","base64Encoded","bstr","u8arr","$a","download","INNER_STACK_KEYWORD","radioTypes","MagicType","availableIcons","seriesOptGenreator","newSeriesOpt","currentType","isStack","BLOCK_SPLITER","ITEM_SPLITER","getContentFromModel","seriesGroupByCategoryAxis","otherSeries","trim$1","itemSplitRegex","parseContents","blockMetaList","tsvLines","blockMeta","hasName","DataView","viewMain","optionToContent","contentToOption","htmlOrDom","readOnly","buttonContainer","buttonStyle","closeButton","refreshButton","textareaColor","textareaBorderColor","buttonColor","buttonTextColor","newSeriesOptList","shouldDeleteName","each$9","inner$f","getStoreSnapshots","snapshots","RestoreOption","INCLUDE_FINDER_MAIN_TYPES","BrushTargetManager","setOutputRanges","matchOutputRanges","coordRange","coordRanges","coordConvert","__rangeOffset","diffProcessor","xyMinMax","findTargetInfo","coordSyses","setInputRanges","rangeOffset","xyMinMaxCurr","xyMinMaxOrigin","sizeCurr","getSize$1","sizeOrigin","scales","makePanelOpts","getDefaultBrushType","_targetInfoList","getPanelRect","controlSeries","targetInfoList","foundCpts","parseFinder$1","areaPanelId","targetInfoMatchers","targetInfoBuilders","include","formatMinMax","xAxisModels","yAxisModels","gridModels","gridModelMap","xAxesHas","yAxesHas","panelRectBuilders","xAxisDeclared","yAxisDeclared","geoModels","axisConvert","rangeOrCoordRange","xminymin","xmaxymax","axisNameIndex","axisDiffProcessor","refer","each$a","DATA_ZOOM_ID_BASE","DataZoomFeature","updateZoomBtnStatus","_isZoomActive","dataZoomSelectActive","makeAxisFinder","handlers$1","snapshot","storedSnapshots","setBatch","dzModel","minValueSpan","maxValueSpan","dataZoomId","newSnapshot","_dispatchZoomAction","nextActive","dzFeatureModel","xAxisId","yAxisId","dzOptions","featureDataZoomPath","finderResult","buildInternalOptions","axisIndexPropName","$fromToolbox","TooltipModel","showContent","alwaysShowContent","displayMode","confine","showDelay","enterable","shouldTooltipConfine","tooltipModel","confineOption","testStyle","styleProps","TRANSFORM_VENDOR","toCSSVendorPrefix","styleVendor","styleProp","CSS_TRANSITION_VENDOR","CSS_TRANSFORM_VENDOR","gCssText","assembleTransform","is3d","assembleCssText","enableTransition","onlyFade","transitionText","transitionOption","transitionCurve","borderName","makeStyleCoord","viewportRootOffset","zrPainter","zrViewportRoot","elTarget","TooltipHTMLContent","_container","_moveIfResized","_alwaysShowContent","nearPointColor","_hideTimeout","_longHideTimeout","styleCoord","_styleCoord","_firstShow","_longHide","_enterable","_show","setContent","arrowPosition","transformStyle","arrowWH","rotatedWH","arrowPos","rotateDeg","rotateRadian","borderStyle","arrowEl","setEnterable","ratioX","ratioY","willChange","hideLater","_inContent","_hideDelay","onmouseenter","onmouseleave","TooltipRichContent","shadowOuterSize","calcShadowOuterSize","makeStyleCoord$1","mathMaxWith0","proxyRect","TooltipView","renderModeOption","_renderMode","_tooltipContent","_tooltipModel","_initGlobalListener","_keepShow","_tryShow","_hide","_lastX","_lastY","_refreshUpdateTimeout","manuallyShowTip","_lastDataByCoordSys","pointInfo","makeDispatchAction$1","_ticket","cmptRef","subEl","positionDefault","_manuallyAxisShowTip","manuallyHideTip","tooltipCascadedModel","buildTooltipModel","seriesDispatcher_1","cmptDispatcher_1","_showAxisTooltip","_showSeriesItemTooltip","_showComponentItemTooltip","_showOrMove","_showTimout","singleTooltipModel","cbParamsList","articleMarkup","markupTextArrLegacy","positionExpr","itemCoordSys","axisItem","axisValueLabel","axisSectionMarkup","axisValue","cbParams","seriesTooltipResult","builtMarkupText","blockBreak","allMarkupText","_updateContentNotChangedOnAxis","_showTooltipContent","asyncTicket","tooltipTrigger","isHTMLRenderMode","tooltipModelCascade","subTooltipModel","defaultHtml","_getNearestPoint","params0","cbTicket","tooltipDataParams","contentSize","boxLayoutPosition","domWidth","domHeight","rectWidth","rectHeight","gapH","gapV","isCenterAlign","lastCoordSys","lastCbParamsList","_cbParamsList","contentNotChanged","lastItemCoordSys","indexCoordSys","lastDataByAxis","thisDataByAxis","indexAxis","lastIndices","lastIdxItem","newIdxItem","lastCbParams","modelCascade","defaultTooltipOption","resultModel","DEFAULT_TOOLBOX_BTNS","brushPreprocessor","brushComponentSpecifiedBtns","brushComponents","brushOpt","tbs","toolboxBrush","toolboxFeature","brushTypes","each$b","hasKeys","createVisualMappings","stateList","supplementVisualOption","visualMappings","mappings","Creater","__hidden","visualData","mappingOption","__alphaForOpacity","replaceVisualOption","getLineSelectors","inLineRange","layoutRange","STATE_LIST","DISPATCH_METHOD","DISPATCH_FLAG","layoutCovers","brushModel","brushTargetManager","brushVisual","throttleDelay","brushSelected","setBrushOption","brushIndex","thisBrushSelected","brushId","brushName","brushLink","linkedSeriesMap","selectedDataIndexForLink","rangeInfoBySeries","hasBrushExists","boundingRectBuilders","selectableArea","linkOthers","brushed","rangeInfoList","brushModelNotControll","checkInRange","getValueState","visualTypesMap","seriesBrushSelected","eachItem","valueOrIndex","rawDataItem","valueState","doDispatch","getBoundingRectFromMinMax","rg","BrushView","$from","BrushModel","inBrush","outOfBrush","setAreas","generateBrushOption","ICON_TYPES","BrushFeature","isBrushed","_brushMode","TitleModel","subtarget","TitleView","titleModel","subTextEl","sublink","groupRect","subtextStyleModel","subText","alignStyle","TimelineModel","_initData","setCurrentIndex","currentIndex","isIndexMax","setPlayState","autoPlay","getPlayState","processedDataArr","dataArr","_names","controlPosition","playInterval","SliderTimelineModel","checkpointStyle","showPlayBtn","showPrevBtn","showNextBtn","playIcon","stopIcon","nextIcon","prevIcon","prevBtnSize","nextBtnSize","TimelineView","TimelineAxis","PI$8","labelDataIndexStore","SliderTimelineView","layoutInfo_1","mainGroup_1","axis_1","_createGroup","labelGroup","_createAxis","_renderAxisLabel","_position","_doPlayStop","_updateTicksStatus","_clearTimer","playPosition","prevBtnPosition","nextBtnPosition","labelPosOpt","parsedLabelPos","labelAlignMap","labelBaselineMap","rotationMap","mainLength","controlModel","controlSize","controlGap","sizePlusGap","labelAlign","labelBaseline","mainBoundIdx","mainGroup","_labelGroup","viewBound","rotateOriginX","rotateOriginY","getBound","mainBound","labelBound","mainPosition","labelsPosition","targetGroup","toBound","boundIdx","newGroup","_renderAxisLine","progressLine","_progressLine","_currentPointer","_renderAxisTick","_tickSymbols","hoverStyleModel","progressStyleModel","symbolOpt","_changeTimeline","giveSymbol","_tickLabels","hoverLabelModel","progressLabelModel","_renderControl","playState","makeBtn","willRotate","btn","objPath","_handlePlayClick","_renderCurrentPointer","onCreate","_handlePointerDrag","_handlePointerDragend","pointerMoveTo","onUpdate","nextState","_pointerChangeTimeline","mousePos","toCoord","_toAxisCoord","targetDataIndex","_findNearestTick","_timer","axisCoord","tickSymbols","tickLabels","timelinePreprocessor","ec2Types","transferItem","itemStyleEmphasis","labelNormal","excludeLabelAttr","checkMarkerInSeries","seriesOpts","seriesOptArr","fillLabel","inner$g","MarkerModel","hostSeries","__hostSeries","createdBySelf","markerOpt","markerModel","createMarkerModelFromSeries","getMarkerModelFromSeries","MarkPointModel","masterMarkerModel","hasXOrY","markerTypeCalculatorWithExtent","otherDataDim","targetDataDim","otherCoordIndex","targetCoordIndex","coordArr","calcDataDim","numCalculate","coordArrValue","markerTypeCalculator","dataTransform","getAxisInfo$1","coordInfo","baseDataDim","valueDataDim","valueIndex","dataFilter$1","createMarkerDimValueGetter","inCoordSys","sum_1","count_1","inner$h","MarkerView","markerGroupMap","markKeep","drawGroup","seriesModelList","updateMarkerLayout","xPx","yPx","MarkPointView","markPointModel","mpModel","symbolDrawMap","coordDimsInfos","dataOpt","MarkLineModel","markLineTransform","mlModel","mlType","mlFrom","mlTo","normalizedItem","itemArray","inner$i","ifMarkLineHasOnlyDim","fromCoord","otherDimIndex","markLineFilter","updateSingleMarkerEndLayout","MarkLineView","markLineModel","mlData_1","fromData_1","toData_1","lineDrawMap","fromData","toData","optData","updateDataVisualAndLayout","fromSymbolKeepAspect","fromSymbolOffset","fromSymbolRotate","fromSymbolSize","toSymbolKeepAspect","toSymbolOffset","toSymbolRotate","toSymbolSize","MarkAreaModel","markAreaTransform","maModel","rbCoord","ltCoord","inner$j","isInfinity$1","ifMarkAreaHasOnlyDim","markAreaFilter","item2","getSingleMarkerEndPoint","pointValue","pointValue0","pointValue1","clampPointValue0","clampPointValue1","dimPermutations","MarkAreaView","markAreaModel","areaData_1","areaGroupMap","polygonGroup","areaData","coordDimsInfos_1","xPointExtent","yPointExtent","LegendModel","_updateSelector","_updateData","legendData","hasSelected","potentialData","availableNames","isPotential","_availableNames","legendNameMap","allSelect","inverseSelect","inactiveColor","inactiveBorderColor","inactiveBorderWidth","borderCap","borderMiterLimit","inactiveWidth","cap","dashOffset","selectorLabel","selectorPosition","selectorItemGap","selectorButtonGap","curry$1","each$c","Group$2","LegendView","_contentGroup","_selectorGroup","_isFirstRender","getContentGroup","getSelectorGroup","legendModel","mainRect","resetInner","itemAlign","renderInner","layoutInner","_backgroundEl","legendDrawnMap","selectMode","legendItemModel","newlineDisabled","lineVisualStyle","_createItem","dispatchSelectAction","dispatchHighlightAction","dispatchDownplayAction","_createSelector","selectorGroup","selectorItem","legendId","itemVisualStyle","drawType","legendIconType","handleCommonProps","propVal","iconBrushType","decalStyle","legendLineModel","visualHasBorder","symboType","hitRect","__legendDataIndex","selectorPos","hw","yx","contentRect","contentPos","selectorRect","orientIdx","isUseHoverLayer","legendFilter","legendSelectActionHandler","isAllSelect","actionLegendIndices","allSelectedMap","makeSelectedMap","legendIndex","isItemSelected","install$H","ScrollableLegendModel","setScrollDataIndex","scrollDataIndex","mergeAndNormalizeLayoutParams$1","pageButtonItemGap","pageButtonGap","pageButtonPosition","pageFormatter","pageIcons","pageIconColor","pageIconInactiveColor","pageIconSize","Group$3","WH$1","XY$1","ScrollableLegendView","_controllerGroup","__rectSize","controllerGroup","pageIconSizeArr","pageTextStyleModel","createPageButton","iconIdx","pageDataIndexName","_pageGo","processMaxSize","_layoutContentAndController","controllerRect","showController","_showController","containerPos","controllerPos","pageInfo","_getPageInfo","pageIndex","contentPosition","_updatePageInfoView","pageText","canJump","pageCount","containerRectSize","targetItemIndex","_findTargetItemIndex","targetItem","itemCount","pCount","pagePrevDataIndex","pageNextDataIndex","targetItemInfo","getItemInfo","winStartItemInfo","winEndItemInfo","currItemInfo","itemRect","itemInfo","winStart","legendDataIdx","install$I","InsideZoomModel","zoomLock","inner$k","disposeCoordSysRecord","coordSysRecordMap","coordSysRecord","dispatchAction$1","containsPoint","installDataZoomRoamProcessor","apiInner","dataZoomInfoMap","dzCoordSysInfo","dzInfo","dzReferCoordSysInfo","firstDzInfo","controllerParams","typePriority","firstDzKey","type_true","type_move","type_false","type_undefined","dataZoomInfo","oneType","InsideZoomView","pan","getRangeHandlers","scrollMove","disposeCoordSysRecordIfNeeded","coordSysKeyArr","dzUid","lastRange","percentPoint","directionInfo","getDirectionInfo","signal","pixelStart","pixelLength","makeMover","getPercentDelta","oldPoint","newPoint","install$K","SliderZoomModel","handleIcon","moveHandleSize","moveHandleIcon","showDetail","showDataShadow","brushSelect","handleLabel","Rect$2","HORIZONTAL","SHOW_DATA_SHADOW_SERIES_TYPE","REALTIME_ANIMATION_CONFIG","SliderZoomView","_onBrushEnd","_buildView","_updateView","barGroup","_brushing","_resetLocation","_resetInterval","sliderGroup","_renderDataShadow","_positionGroup","coordRect","_findCoordRect","_size","targetAxisModel","otherAxisInverse","_dataShadowInfo","_getViewExtent","clickPanel","_onClickPanel","_onBrushStart","_prepareDataShadowInfo","dataShadowSegs","oldSize","_shadowSize","candlestickDim","otherDataExtent_1","otherShadowExtent_1","areaPoints_1","linePoints_1","step_1","thisCoord_1","stride_1","lastIsEmpty_1","isSelectedArea","polygonPts","_shadowPolygonPts","polylinePts","_shadowPolylinePts","_shadowData","_shadowDim","otherOffset","thisShadowExtent","otherCoord","thisAxis","thisDim","moveHandle_1","moveZoneExpandSize","handles","handleLabels","filler","actualMoveZone","bRect","_onDragMove","_onDragEnd","_showDataInfo","handleColor","_handleHeight","_handleWidth","handleLabelShow","moveHandleHeight","moveHandle","moveZone","ondragstart","viewExtent","_handleEnds","_updateInterval","viewExtend","nonRealtime","displaybles","handleInterval","handleHeight","segIntervals","segGroup","_updateDataInfo","orderedHandleEnds","dataInterval","_formatLabel","setLabel","barTransform","textPoint","labelPrecision","valueStr","normalShow","emphasisShow","localPoint","_brushStart","_brushStartTime","brushShape","_updateBrushRect","brushStart","endPoint","coordSysInfoList","install$L","visualDefault","defaultOption$1","mapVisual$1","isArray$1","each$d","asc$2","linearMap$1","VisualMapModel","replacableOptionKeys","resetItemSize","completeVisualOption","resetVisual","controllerVisuals","getItemSymbol","getTargetSeriesIndices","optionSeriesIndex","isTargetSeries","formatValueText","edgeSymbols","isMinMax","dataBound","textValue","resetExtent","getDataDimensionIndex","optDim","completeSingle","stateExist","stateAbsent","optExist","optAbsent","defa","symbolExists","symbolSizeExists","max_1","getSelected","getVisualMeta","getColorVisual","contentColor","textGap","DEFAULT_BAR_BOUND","ContinuousModel","_resetRange","findTargetDataIndices","oVals","getColorStopValues","iVals","setStop","iIdx","oIdx","oLen","stopsLen","calculable","hoverLink","indicatorIcon","indicatorSize","indicatorStyle","stopValues","VisualMapView","doRender","renderBackground","getControllerVisual","visualCluster","forceState","visualObj","visualMapping","convertOpacityToAlpha","positionGroup","autoPositionValues","paramsSet","getItemAlign","modelOption","realIndex","reals","fakeValue","layoutInput","rParam","makeHighDownBatch","linearMap$2","each$e","mathMin$a","mathMax$a","ContinuousView","_hoverLinkFromSeriesMouseOver","_hideIndicator","dataRangeText","_useHandle","_renderBar","_renderEndsText","_enableHoverLinkToSeries","_enableHoverLinkFromSeries","endsIndex","_shapes","_createBarGroup","gradientBarGroup","createPolygon","getCursor$1","_dragHandle","textSize","handleThumbs","handleLabelPoints","_createHandle","_createIndicator","onDrift","handleThumb","handleLabelPoint","indicatorLabel","indicatorLabelPoint","_firstShowIndicator","visualMapId","_dataInterval","_hovering","_clearHoverLinkToSeries","useHoverLinkOnHandle","_doHoverLinkToSeries","forSketch","outOfRangeHandleEnds","inRangeHandleEnds","visualInRange","_createBarVisual","visualOutOfRange","barPoints","_updateHandle","_makeColorGradient","symbolSizes","_createBarPoints","handlesColor","minimumOffset","_showIndicator","cursorValue","rangeSymbol","halfHoverLinkSize","oldIndicatorPos","indicatorNewProps","labelNewProps","_clearHoverLinkFromSeries","cursorPos","hoverOnBar","newBatch","resultBatches","mapB","sourceBatch","otherMap","otherDataIndices","mapToArray","isData","hoverRange","HOVER_LINK_SIZE","hoverLinkDataSize","oldBatch","_hoverLinkDataIndices","batchB","mapA","_dispatchHighDown","currECData","hoverLinkOnHandle","visualMapActionHander","visualMapActionInfo","visualMapEncodingHandlers","resultVisual","each$f","visualMapPreprocessor","has$1","pieces","splitList","installed$1","installCommon$1","install$N","PiecewiseModel","_mode","_determineMode","_pieceList","resetMethods","_resetSelected","visualTypesInPieces","exists","hasSel_1","getSelectedMapKey","getRepresentValue","pieceInterval","representValue","minOpen","itemSymbol","outPieceList","splitStep","normalizeReverse","pieceListItem","closeList","infinityList","useMinMax","PiecewiseVisualMapView","_getItemAlign","viewData","_getViewData","endsText","viewPieceList","_onItemClick","_enableHoverLink","indexInModelPieceList","_createItemSymbol","visualState","onHoverLink","shapeParam","install$O","DEFAULT_OPTION","inner$l","ariaVisual","paletteScopeGroupByType_1","seriesCnt","maxDataCnt","displaySeriesCnt","seriesLabels_1","middleSeparator","ariaModel","decalScope","paletteDecal","specifiedDecal","dataAll_1","idxMap_1","decalScope_1","dataCount_1","mergeDecal","resultDecal","labelLocale","maxSeriesCnt","seriesLabel","dataLabel","middleSeparator_1","displayCnt","endSeparator_1","excludeDimensionId_1","dataLabels","separatorModel","endSeparator","ariaPreprocessor","RELATIONAL_EXPRESSION_OP_ALIAS_MAP","<=",">=","!=","<>","RegExpEvaluator","lVal","_condVal","rVal","ConstConditionInternal","AndConditionInternal","OrConditionInternal","NotConditionInternal","RelationalConditionInternal","needParse","valueParser","tarValRaw","valueGetterParam","tarValParsed","subCondList","parseOption","exprOption","getters","isObjectNotArray","parseAndOrOption","or","parseRelationalOption","prepareGetValue","exprKeys","parserName","condValueParsed","evaluator","keyRaw","valueGetterAttrMap","condValueRaw","subOptionArr","ConditionalExpressionParsed","_cond","filterTransform","resultData","sampleLog","sortTransform","orderExprList","orderDefList","orderExpr","orderDef","DatasetModel","_sourceManager","DatasetView","CMD$4","aroundEqual","pathToBezierCurves","currentSubpath","bezierArrayGroups","createNewSubpath","c2","x4","hx","nextAngle","hy","pathToPolygons","beziers","adpativeBezier","PIXEL_DISTANCE_SQR","cp2LenSqr","projLen1","projLen2","tmpSegX","tmpSegY","PIXEL_DISTANCE","cp1LenSqr","getDividingGrids","rowDim","rowSize","columnSize","divideSector","outShapes","arcLen","isAngleRow","newShape","addToPoly","splitPolygonByLine","lineA","lineB","intersections","intersectionPt","projPt","splitPt0","splitPt1","splitPt0Arr","splitPt1Arr","newPolyA","newPolyB","binaryDividePolygon","polygonShape","binaryDivideRecursive","OutShapeCtor","divideRect","isHorizontalRow","rowSizeDim","columnSizeDim","columnDim","polygonConvert","polygonCount","totalArea_1","selfCount","clone$4","subPath","createSubpath","lastSubpathSubpath","otherSubpath","lastY","newSubpath","alignBezierCurves","lastSubpath1","lastSubpath2","newArray1","newArray2","subpath1","subpath2","newSubpath1","newSubpath2","shorterPath","eachCurveSubDivCount","actualSubDivCount","centroid$1","findBestMorphingRotation","fromArr","searchAngleIteration","searchAngleRange","fromNeedsReverse","fromSubpathBezier","toSubpathBezier","fromCp","toCp","newFromSubpathBezier","newToSubpathBezier","bestAngle","bestScore","fromSubBeziers","toSubBeziers","bezierCount","bestOffset","cursorOffset","sa","newX1","newY1","isCombineMorphing","__isCombineMorphing","SAVED_METHOD_PREFIX","saveAndModifyMethod","savedMethodName","restoreMethod","applyTransformOnBeziers","bezierCurves","subBeziers","prepareMorphPath","fromPathProxy","toPathProxy","fromBezierCurves","toBezierCurves","fromPathTransform","toPathTransform","morphingData","__morphT","newCp","x0_1","y0_1","morphPath","oldDone","oldDuring","sortPaths","defaultDividePath","createEmptyReturn","fromIndividuals","toIndividuals","combineMorph","fromList","fromPathList","addFromPath","separateCount","dividePath","toSubPathList","individualDelay","identityTransform","addToSubPathListToZr","restoreToPath","toLen","animating_1","eachDone","indivdualAnimationOpts","separateMorph","toPathList","fromLen","prepareMorphBatches","many","batches","batchCount","moveFrom","pathDividers","approxOpacity","applyMorphAnimation","animateOtherProps","updateAnimationCfg","fromIsMany","morphBatches","animateCount","animateIndex","morphOneBatch","forceManyOne","batchMany","batchOne","separateAnimationCfg","individualAnimationCfg","batchFrom","batchTo","getPathList","pathList_1","DATA_COUNT_THRESHOLD","TRANSITION_NONE","TRANSITION_P2C","TRANSITION_C2P","getUniversalTransitionGlobalStore","getGroupId","dataGroupId","isChild","dimOrdinalMeta","groupIdDim","getValueByDimension","flattenDataDiffItems","childGroupId","divide","fadeInElement","newSeries","removeEl$1","computedTransform","animateElementStyles","transitionBetween","oldList","oldDiffItems","newDiffItems","updateMorphingPathProps","rawFrom","rawTo","hasMorphAnimation","oldGroupIds","oldChildGroupIds","newGroupId","newChildGroupId","createKeyGetter","isOld","onlyGetId","useId","isElementStillInChart","updateOneToOne","oldIndices","oldElsList","newElsList","newSeris","getSeriesTransitionKey","seriesKey","convertArraySeriesKeyToString","getDivideShapeFromData","querySeries","graphicOption","ecMOdel","transOpt","updateBatches_1","globalStore","updateBatches","oldDataMap","oldDataMapForSplit","checkTransitionSeriesKeyDuplicated","transitionKeyStr","oldSeries","oldDataGroupIds","oldDataGroupId","transitionKey","newDataGroupId","oldSeries_1","oldData_1","allSeries","savedSeries","savedDataGroupIds","savedData","labelManager","List","connect","dataTool","extendChartView","extendComponentModel","extendComponentView","extendSeriesModel","getCoordinateSystemDimensions","getInstanceById","getMap","isClient","existInstance","innerDrawElementOnCanvas","parseGeoJson","setCanvasCreator","zrUtil","makeStateful","STORAGE_KEY","defaultLocale","nodeToAppend","activeLocale","localeLocationPattern","storageGet","storagePut","promiseCache","extraProperties","localeUrl","localeId","localeCache","overrideValues","oldObject","newObject","cachedLocale","externalLocale","appendScriptTo","nodeElement","addLocalePatternValue","tmhDynamicLocaleCache","localeLocation","initialLocale","loadLocaleFn","baseProperties","fc","fullCalendar","fcViews","complexOptions","singleRes","CalendarBase","mergeOptions","combinedVal","complexVals","compensateScroll","rowEls","scrollbarWidths","border-left-width","margin-left","border-right-width","margin-right","uncompensateScroll","disableCursor","enableCursor","distributeHeight","shouldRedistribute","minOffset1","minOffset2","flexEls","flexOffsets","flexHeights","usedHeight","undistributeHeight","minOffset","naturalOffset","matchCellWidths","maxInnerWidth","innerEl","setPotentialScroller","unsetScroller","getScrollParent","scrollParent","getOuterRect","getClientRect","getScrollbarWidths","getCssFloat","leftRightWidth","getIsLeftRtlScrollbars","_isLeftRtlScrollbars","intersectionToSeg","applyAll","isInt","htmlEscape","cssToStr","getContentRect","isPrimaryMouseButton","subjectRange","constraintRange","segStart","segEnd","subjectStart","subjectEnd","constraintStart","constraintEnd","computeIntervalUnit","durationHasTime","dayIDs","intervalUnits","diffDayTime","stripTime","diffByUnit","dur","isTimeString","hasOwnPropMethod","copyOwnProps","functions","thisObj","firstDefined","stripHtmlEntities","statements","compareNumbers","ambigDateOfMonthRegex","ambigTimeOrZoneRegex","newMomentProto","oldMomentProto","makeMoment","parseAsUTC","isAmbigZone","ambigMatch","isSingleString","transferAmbigs","isAmbigTime","_ambigTime","_ambigZone","_fullCalendar","commonlyAmbiguate","preserveTime","anyAmbigTime","anyAmbigZone","moms","stripZone","setMomentValues","oldMomentFormat","formatStr","formatDateWithChunks","formatDateWithChunk","hasTime","weekCalc","_lang","_fullCalendar_weekCalc","dayHours","setUTCValues","wasAmbigTime","hasZone","wasAmbigZone","setLocalValues","tzo","getFormatStringChunks","allowValueOptimization","tokenOverrides","maybeStr","maybe","formatRange","isRTL","chunkStr","leftI","rightI","middleI","leftStr","rightStr","middleStr1","middleStr2","middleStr","formatSimilarChunk","similarUnitMap","formatStringChunkCache","chunkFormatString","chunker","Class","members","Popover","documentMousedownProxy","autoHide","documentMousedown","windowEl","viewportEl","viewportOffset","viewportConstrain","GridCoordMap","rowCoords","colCoords","build","computeRowCoords","computeColCoords","computeBounds","getCell","rowCnt","colCnt","hitRow","hitCol","inBounds","ComboCoordMap","coordMaps","DragListener","isListening","mousemoveProxy","mouseupProxy","subjectEl","subjectHref","scrollEl","scrollBounds","scrollTopVel","scrollLeftVel","scrollIntervalId","scrollHandlerProxy","scrollSensitivity","scrollSpeed","scrollIntervalMs","startListening","startDrag","listenStart","stopListening","stopDrag","dragStop","listenStop","computeScrollBounds","topCloseness","bottomCloseness","leftCloseness","sensitivity","topVel","leftVel","rightCloseness","setScrollVel","constrainScrollVel","scrollIntervalFunc","scrollStop","scrollHandler","CellDragListener","coordMap","origCell","coordAdjust","subjectRect","computeCoords","origPoint","subjectCenter","rect1","rect2","cellOver","isCellsEqual","cellOut","cellDone","cell1","cell2","MouseFollower","top0","left0","mouseY0","mouseX0","topDelta","leftDelta","isFollowing","isAnimating","shouldRevert","revertDuration","destroyEl","getEl","sourceOffset","RowRenderer","cellHtml","rowHtml","rowType","renderCell","getHtmlRenderer","rowCellHtml","bookendCells","intro","outro","prependHtml","appendHtml","rendererName","specificName","generalName","colData","elsByFill","externalDragStartProxy","colHeadFormat","eventTimeFormat","displayEventTime","displayEventEnd","cellDuration","largeUnit","computeColHeadFormat","computeEventTimeFormat","computeDisplayEventTime","computeDisplayEventEnd","setRange","updateCells","rangeToSegs","diffDates","getRowData","getColData","computeCellRange","computeCellDate","getRowEl","getColEl","getCellDayEl","setElement","dayMousedown","bindSegHandlers","bindGlobalHandlers","unbindGlobalHandlers","renderSkeleton","renderDates","destroyDates","dayClickCell","selectionRange","isSelectable","isOrig","computeSelection","renderSelection","destroySelection","reportSelection","renderRangeHelper","sourceSeg","fakeEvent","fabricateHelperEvent","renderHelper","normalizeEventRange","destroyHelper","renderHighlight","destroyHighlight","firstCell","lastCell","isSelectionRangeAllowed","renderFill","destroyFill","highlightSegClasses","renderFillSegEls","segElMethod","renderedSegs","fillSegHtml","seg","fillSegTag","classesMethod","cssMethod","headHtml","widgetHeaderClass","headCellHtml","bgCellHtml","getDayClasses","widgetContentClass","getNow","intervalDuration","intervalStart","highlightStateClass","getEventRendering","rendering","compareNormalRanges","range1","eventStartMS","compareSegs","seg2","eventDurationMS","localeCompare","mousedOverSeg","isDraggingSeg","isResizingSeg","isDraggingExternal","renderEvents","eventsToSegs","bgSegs","fgSegs","isBgEvent","renderBgSegs","renderFgSegs","destroyEvents","triggerSegMouseout","destroyFgSegs","destroyBgSegs","getEventSegs","renderFgSegEls","disableResizing","fgSegHtml","resolveEventEl","bgEventSegEl","bgEventSegClasses","bgEventSegCss","background-color","businessHoursSegClasses","triggerSegMouseover","isEventResizable","segResizeMousedown","isEventDraggable","segDragMousedown","dropLocation","mouseFollower","segDragStart","hideEvent","computeEventDrop","isEventRangeAllowed","renderDrag","destroyDrag","showEvent","segDragStop","reportEventDrop","startCell","endCell","dragEnd","getEventEnd","normalizeEventRangeTimes","applyDragOpacity","externalDragStart","ui","accept","listenToExternalDrag","eventProps","stick","dataAttrPrefix","computeExternalDrop","reportExternalDrop","isExternalDropRangeAllowed","resizeLocation","eventEnd","segResizeStart","computeEventStartResize","computeEventEndResize","renderEventResize","destroyEventResize","segResizeStop","reportEventResize","computeEventResize","defaultDuration","defaultAllDayEventDuration","defaultTimedEventDuration","getEventTimeText","displayEnd","getSegClasses","isDraggable","isResizable","getEventSkinCss","eventColor","optionColor","border-color","rangeToSegsFunc","eventRanges","eventsToRanges","eventRangeToSegs","eventsById","eventGroup","eventsToInverseRanges","eventsToNormalRanges","eventStart","normalRange","viewStart","viewEnd","normalRanges","inverseRanges","event0","eventRange","DayGrid","numbersVisible","bottomCoordPadding","breakOnWeeks","cellDates","dayToCellOffsets","dayEls","helperEls","isRigid","cellCnt","dayRowHtml","destroySegPopover","renderBusinessHours","getBusinessHoursEvents","dayCellHtml","updateCellDates","isHiddenDay","segFirst","segLast","computeDayRange","dateToCellOffset","rowLast","rowFirst","leftCol","rightCol","ensureVisibleEventRange","helperNodes","rowStructs","renderSegRows","rowEl","skeletonEl","skeletonTop","tbodyEl","renderFillRow","trEl","startCol","endCol","compareDaySegCols","popoverSegs","allDaySegs","rowStruct","segRows","groupSegRows","renderSegRow","isResizableFromStart","isEventResizableFromStart","isResizableFromEnd","isEventResizableFromEnd","skinCss","timeHtml","timeText","titleHtml","rowSegs","levelSegs","segLevels","buildSegLevels","levelCnt","segMatrix","cellMatrix","loneCellMatrix","emptyCellsUntil","otherSegs","otherSeg","segPopover","limitRows","levelLimit","rowLevelLimit","unlimitRow","computeRowLevelLimit","limitRow","trHeight","trEls","iterInnerHeights","limitedNodes","segsBelow","totalSegsBelow","colSegsBelow","rowspan","segMoreNodes","moreTd","moreWrap","moreLink","moreNodes","getCellSegs","renderMoreLink","moreEls","limitedEls","hiddenSegs","getMoreLinkText","clickOption","moreEl","dayEl","allSegs","reslicedAllSegs","resliceDaySegs","reslicedHiddenSegs","showSegPopover","topEl","renderSegPopoverContent","segContainer","dayDate","dayStart","dayEnd","dayRange","startLevel","TimeGrid","slotDuration","snapDuration","minTime","axisFormat","slatEls","slatTops","helperEl","businessHourSegs","processOptions","renderHtml","slatRowHtml","slotBgCellHtml","axisHtml","slotNormal","slotTime","slotDate","axisStyleAttr","skipHiddenDays","computeSnapTime","rezoneDate","colDate","isResize","computeSlatTops","updateSegVerticals","originTop","computeTimeTop","computeDateTop","startOfDayDate","slatIndex","slatTop","slatCoverage","slatRemainder","renderSegTable","segCols","colSegs","tdEl","groupSegCols","computeSlotSegCollisions","compareForwardSlotSegs","forwardPressure","backwardCoord","eventSkeletonEl","computeSegVerticals","placeSlotSegs","forwardSegs","computeSlotSegPressures","forwardSeg","computeSlotSegCoords","seriesBackwardPressure","seriesBackwardCoord","forwardCoord","generateSegPositionCss","generateSegVerticalCss","fullTimeText","startTimeText","isMultiDayEvent","shouldOverlap","isDisplayed","isSkeletonRendered","isEventsRendered","intervalEnd","intervalUnit","scrollerEl","nextDayThreshold","isHiddenDayHash","initThemingProps","initHiddenDays","computeRange","updateTitle","computePrevDate","massageCurrentDate","computeNextDate","computeTitle","computeTitleFormat","destroySkeleton","scrollState","queryScroll","computeInitialScroll","forceScroll","triggerRender","clearEvents","triggerDestroy","destroyBusinessHours","tm","updateHeight","updateWidth","setScroll","setHeight","getSuggestedViewHeight","isHeightAuto","computeScrollerHeight","totalHeight","both","otherHeight","previousScrollState","displayEvents","triggerEventRender","triggerEventDestroy","renderedEventSegEach","startEditable","mutateResult","mutateEvent","triggerEventDrop","dateDelta","reportEventChange","undoFunc","eventInput","renderEvent","triggerExternalDrop","durationEditable","triggerEventResize","durationDelta","hiddenDays","dayCnt","isExclusive","endTimeMS","startDay","endDay","dirDefaults","langDefaults","overrides","viewSpecCache","elementVisible","calcSize","renderView","Header","headerElement","windowResizeProxy","windowResizeDelay","refetchEvents","freezeContentHeight","unfreezeContentHeight","fetchAndRenderEvents","reportEvents","_events","rerenderEvents","changeView","prevYear","nextYear","gotoDate","dateInput","incrementDate","newDate","viewType","spec","getViewSpec","getUnitViewSpec","getCalendar","getView","getMomentLocaleData","monthNames","monthNamesShort","dayNames","dayNamesShort","weekNumberCalculation","getIsAmbigTimezone","getDefaultEventEnd","humanizeDuration","isFetchNeeded","fetchEvents","fetchID","currentFetchID","pendingSourceCnt","fetchEventSource","addEventSource","sourceInput","buildEventSource","removeEventSource","isSourcesEqual","updateEvent","isMiscEventPropName","abstractEvent","buildEventFromInput","expandEvent","stickySource","removeEvents","eventID","clientEvents","loadingLevel","_fetchEventSource","sourceFetchers","startParam","endParam","timezoneParam","pushLoading","popLoading","ajaxDefaults","eventInputs","isArraySource","sourceNormalizers","origArray","source1","source2","getSourcePrimitive","googleCalendarId","eventDataTransform","eventGUID","_recurring","assignDatesToEvent","allDayDefault","backupEventDates","forceEventDuration","_rangeStart","_rangeEnd","dowHash","clearEnd","startDelta","miscProps","date0","oldProps","_end","_allDay","isAmbigTimezone","undoFunctions","wholeDay","optionVal","businessHours","eventConstraint","eventOverlap","isRangeAllowed","selectConstraint","selectOverlap","constraintEvents","anyContainment","peerEvents","peerEvent","constraintInput","getPeerEvents","peerOverlap","eventSources","getEventCache","suggestedViewHeight","viewsByType","ignoreWindowResize","defaultDate","deactivateButton","instantiateView","activateButton","disableButton","enableButton","lazyFetching","shouldRecalc","_calcSize","aspectRatio","subObj","subName","subVal","langOptionHash","rtlDefaults","populateInstanceComputableOptions","buildViewSpec","viewTypes","getViewsWithButtons","singleUnit","requestedViewType","viewClass","viewOverrides","defaultsChain","overridesChain","buildViewSpecOptions","buildViewSpecButtonText","queryButtonText","buttonText","buttonTextOverride","buttonTextDefault","isValidViewType","titleRangeSeparator","monthYearFormat","weekends","weekNumbers","weekNumberTitle","buttonIcons","themeButtonIcons","dragOpacity","dragRevertDuration","dragScroll","unselectAuto","dropAccept","eventLimit","eventLimitText","eventLimitClick","dayPopoverFormat","englishDefaults","langs","dpComputableOptions","datepickerLang","langCode","dpLangCode","dpOptions","fcOptions","weekHeader","datepicker","regional","newFcOptions","momOptions","momComputableOptions","prevText","nextText","currentText","showMonthAfterYear","yearSuffix","dayOfMonthFormat","mediumTimeFormat","smallTimeFormat","extraSmallTimeFormat","hourFormat","noMeridiemTimeFormat","instanceComputableOptions","smallDayDateFormat","weekFormat","smallWeekFormat","sections","renderSection","buttonName","viewsWithButtons","sectionEl","buttonStr","groupEl","groupChildren","isOnlyButtons","buttonClick","themeIcon","normalIcon","innerHtml","viewSpec","overrideText","otherEvent","BasicView","basic","dayGrid","dayNumbersVisible","weekNumbersVisible","weekNumberWidth","headRowEl","hasRigidRows","headIntroHtml","weekNumberStyleAttr","numberIntroHtml","dayIntroHtml","introHtml","numberCellHtml","scrollerHeight","setGridHeight","MonthView","isFixedWeeks","weekMode","fixedWeekCount","basicWeek","basicDay","agenda","timeGrid","axisWidth","noScrollRowEls","bottomRuleEl","bottomRuleHeight","slotBgIntroHtml","scrollTime","dayEvents","timedEvents","allDaySlot","allDayText","slotEventOverlap","agendaWeek","agendaDay","calendars","extraEventSignature","calendarWatchEvent","eventSerialId","sourceSerialId","eventFingerprint","sourceEventsSerialId","sourceFingerprint","fp","allEvents","arraySources","srcLen","extEvent","eI","changeWatcher","arraySource","tokenFn","getTokens","subtractAsSets","inB","onArrayChanged","newTokens","oldTokens","applyChanges","replacedTokens","removedTokens","removedToken","newToken","onRemoved","onChanged","addedTokens","onAdded","getFullCalendarConfig","calendarSettings","uiCalendarConfig","functionToWrap","getLocaleConfig","fullCalendarConfig","dtf","useNgLocale","tValues","sourcesChanged","eventSourcesWatcher","eventsWatcher","clientEvent","uiCalendar","localeFullCalendarConfig","options2","newO","oldO","treeClass","emptyTreeClass","dropzoneClass","hiddenClass","nodesClass","nodeClass","handleClass","placeholderClass","dragClass","dragThreshold","defaultCollapsed","appendChildOnHover","$nodeScope","$parentNodeScope","$childNodesScope","$parentNodesScope","$treeScope","$handleScope","$$allowNodeDrop","expandOnHover","controllersArr","treeNodesCtrl","initSubNode","destroySubNode","dragEnabled","isSibling","childNodesCount","hasChild","destIndex","$callbacks","maxSubDepth","countSubTreeDepth","childDepth","thisLevelDepth","$nodesMap","nodropEnabled","cloneEnabled","subNode","beforeDrag","outOfDepth","$nodesScope","$emptyElm","$dropzoneElm","emptyPlaceholderEnabled","dragDelay","dropzoneEnabled","place","placeElm","resetEmptyElement","resetDropzoneElement","treeConfig","emptyElmColspan","$trElm","tdElm","sourceNodeScope","destNodesScope","expandTimeoutStart","expandTimeoutCancel","expandTimeoutEnd","dropped","dragMove","beforeDrop","uiTree","treeNodeCtrl","UiTreeHelper","firstMoving","dragInfo","hiddenPlaceElm","dragElm","scrollContainerElm","unhover","document_height","document_width","dragStartEvent","dragMoveEvent","dragEndEvent","dragCancelEvent","bindDragStartEvents","bindDragMoveEvents","unbindDragMoveEvents","keydownHandler","isHandleChild","isUiTreeRoot","treeOfOrigin","hasTouch","treeScope","getNodeAttribute","sourceOnly","setNodeAttribute","uiTreeDragging","isTreeNode","isTreeNodeHandle","eventElm","treeNodeHandlerContainerOfElement","cloneElm","elementIsTreeNode","elementIsTreeNodeHandle","elementContainsTreeNodeHandler","eventElmTagName","nodrag","positionStarted","hStyle","isClone","targetElm","scrollDownBy","targetOffset","targetBefore","targetBeforeBuffer","targetChildElm","isDropzone","leftElmPos","topElmPos","scrollContainerElmRect","bottom_scroll","top_scroll","scrollUpBy","positionMoved","displayElm","elementIsTree","elementIsTreeNodes","elementIsPlaceholder","elementIsDropzone","dirAx","expandTimeoutOn","expandTimeout","dragEventArgs","allowDrop","oldCur","treeCtrl","nodesData","sourceInfo","cloneModel","nodeScope","nodesScope","resetParent","clonedNode","isDirty","isForeign","boundingClientRect","nowX","nowY","dirX","dirY","lastDirX","lastDirY","distAxX","distAxY","newAx","moving","findFirstParentElementWithAttribute","childObj","testObj","enablejsapi","autoplay","ccloadpolicy","disablekb","ivloadpolicy","playlistArray","playsinline","showinfo","modestbranding","listType","onNgYtIframeLoad","videoid","onYouTubeIframeAPIReady","youtubeEmbedFrame","setReadyState","player","getPlayerById","getVideoIdByUrl","video","onready","onstatechange","onplaybackqualitychange","onplaybackratechange","onapichange","playlist","listtype","onStateChange","onPlaybackQualityChange","onPlaybackRateChange","onApiChange","YT","Player","gridUtil","$elm","uiGridCtrl","debouncedRefresh","prevWidth","prevHeight","gridWidth","gridHeight","queueGridRefresh","core","raise","gridDimensionChanged","elementWidth","elementHeight","FEATURE_NAME","CELL_NAV_EVENT","UP","DOWN","PG_UP","PG_DOWN","EVENT_TYPE","KEYDOWN","CLICK","CLEAR","uiGridCellNavConstants","GridRowColumn","UiGridCellNav","rowContainer","colContainer","leftColContainer","rightColContainer","visibleRowCache","visibleColumnCache","leftColumns","rightColumns","bodyContainer","getFocusableCols","colDef","allowCellFocus","getFocusableRows","getNextRowCol","getRowColLeft","getRowColRight","getRowColUp","getRowColDown","getRowColPageUp","getRowColPageDown","initializeSelection","focusableCols","focusableRows","curColIndex","curRowIndex","nextColIndex","pageSize","minRowsToRender","uiGridConstants","initializeGrid","registerColumnBuilder","cellNavColumnBuilder","cellNav","lastRowCol","focusedCells","defaultGridOptions","publicApi","navigate","newRowCol","oldRowCol","viewPortKeyDown","rowCol","viewPortKeyPress","scrollToFocus","rowEntity","getFocusedCell","getCurrentSelection","rowColSelectIndex","registerEventsFromObject","registerMethodsFromObject","gridOptions","modifierKeysToMultiSelectCells","keyDownOverrides","decorateRenderContainers","rightContainer","hasRightContainer","renderContainers","leftContainer","hasLeftContainer","getDirection","keymap","gridRow","gridCol","getRow","getColumn","scrollToIfNecessary","broadcastCellNav","getLeftWidth","upToCol","drawnWidth","percentage","uiGridCellNavService","i18nService","_scope","makeRowCol","getActiveCell","elms","modifierDown","originEvt","broadcastFocus","clearFocus","enableCellEditOnFocus","uiGridTargetRenderContainerId","usesAria","addAriaLiveRegion","ariaNotifierDomElt","ariaNotifier","currentSelection","currentRowColumn","cellDisplayValue","getSafeText","getCellDisplayValue","focuser","viewPortKeyDownWasRaisedForRowCol","renderContainerCtrl","uiGridCellnavCtrl","setAriaActivedescendant","removeAriaActivedescendant","scrollBegin","containsColumn","dataChangeDereg","preventMouseDown","refreshCellFocus","focusedRowCol","edit","beginCellEdit","afterCellEdit","cancelCellEdit","registerDataChangeCallback","dataChange","ROW","LOG_DEBUG_MESSAGES","LOG_WARN_MESSAGES","LOG_ERROR_MESSAGES","CUSTOM_FILTERS","COL_FIELD","MODEL_COL_FIELD","TOOLTIP","DISPLAY_CELL_TEMPLATE","TEMPLATE_REGEXP","FUNC_REGEXP","DOT_REGEXP","APOS_REGEXP","BRACKET_REGEXP","COL_CLASS_PREFIX","ENTITY_BINDING","GRID_SCROLL","COLUMN_MENU_SHOWN","ITEM_DRAGGING","COLUMN_HEADER_CLICK","STRG","CAPSLOCK","CTRL","CTRLRIGHT","CTRLR","RETURN","BCKSP","ALT","ALTR","ALTRIGHT","WIN","MAC","FN","ESC","DEL","F1","F2","F3","F4","F5","F6","F7","F8","F9","F10","F11","F12","ASC","DESC","STARTS_WITH","ENDS_WITH","EXACT","CONTAINS","GREATER_THAN","GREATER_THAN_OR_EQUAL","LESS_THAN","LESS_THAN_OR_EQUAL","NOT_EQUAL","INPUT","aggregationTypes","avg","CURRENCY_SYMBOLS","scrollDirection","ALL","EDIT","COLUMN","OPTIONS","scrollbars","NEVER","ALWAYS","WHEN_NEEDED","compiledElementFn","clonedElement","getCompiledElementFn","cellTemplate","preEval","cellElement","classAdded","initColClass","getColClass","updateClass","cellClass","rowRenderIndex","colRenderIndex","rowWatchDereg","newColClass","deregisterFunction","columnMenuScope","menuShown","setColMenuItemWatch","deregFunction","defaultMenuItems","getGridOption","sortable","enableSorting","isActiveSort","suppressRemoveSort","enableHiding","getDefaultMenuItems","sortColumn","unsortColumn","hideColumn","getColumnElementPosition","$columnElement","positionData","parentLeft","renderContainerElm","closestElm","renderContainerOffset","containerScrollLeft","myWidth","lastMenuPaddingRight","uiGridColumnMenuService","updateCurrentColStatus","showMenu","colElementPosition","colElement","hideThenShow","hideMenu","broadcastTrigger","bySelector","onkeydown","visibleMenuItems","circularFocusHandler","isSingleItem","shiftKeyStatus","menuItem","columnElement","unsort","notifyDataChange","columnVisibilityChanged","focusToGridMenu","byId","thisIndex","previousVisibleCol","colClass","updateFilters","filterable","filterHeaderTemplate","providedFilterHeaderTemplate","filterHeaderTemplatePromise","removeFilter","colFilter","renderIndex","footerCellTemplate","providedFooterCellTemplate","footerCellTemplatePromise","footerCellClass","updateAggregationValue","rowsRendered","footerTemplate","newElm","footerViewport","disableAnimations","gridFooterTemplate","ScrollEvent","headerCellTemplate","providedHeaderCellTemplate","headerCellTemplatePromise","setFilter","filterDeregisters","filterChanged","filterDeregister","updateHeaderOptions","oldFilterable","headerCellClass","rightMostContainer","isLastCol","enableGridMenu","enableFiltering","colMenu","enableColumnMenus","enableColumnMenu","offAllEvents","onDownEvents","previousMouseX","i18n","headerCell","isSortPriorityVisible","getSortDirectionAriaLabel","renderContainer","$contentsElm","desc","downFn","mousedownStartTime","mousedownTimeout","upFn","moveFn","clickFn","filterContainer","headerCellArrowKeyDown","toggleMenu","updateHeaderReferences","headerCanvases","headerCanvas","newScrollLeft","horizScrollPercentage","scrollEvent","isScrollingHorizontally","normalizeScrollLeft","headerViewport","scrollHorizontal","Sources","ViewPortScroll","scrollContainers","headerTemplate","showHeader","queueRefresh","registerStyleComputation","columnCache","getColClassDefinition","gridMenuScope","registeredMenuItems","registerMethod","addToGridMenu","removeFromGridMenu","getMenuItems","clearFilters","gridMenuCustomItems","clearAllFilters","gridMenuShowHideColumns","showHideColumns","columnDefs","gridMenuTitleFilter","getColumnIcon","toggleColumnVisibility","leaveOpen","setMenuItemTitle","readableColumnName","successValue","errorValue","uiGridGridMenuService","toggleOnKeydown","setupHeightStyle","gridMenuMaxHeight","headerHeight","dynamicStyles","gridMenuTemplate","oldGridHeight","oldGridWidth","newGridHeight","newGridWidth","shownMid","docEventType","applyHideMenu","disableGridMenuHideOnScroll","checkKeyDown","firstMenuItem","menuItemButtons","lastMenuItem","screenReaderOnly","itemShown","itemAction","correctParent","toBeDisplayed","oneBinders","appendGridId","baseDirectiveName","rmWatcher","newV","newIdString","idRegex","nonNullFound","rowContainerName","colContainerName","bindScrollHorizontal","bindScrollVertical","enableVerticalScrollbar","enableHorizontalScrollbar","scrollXAmount","scrollXPercentage","RenderContainerMouseWheel","scrollYAmount","deltaFactor","verticalScrollLength","getVerticalScrollLength","scrollYPercentage","horizontalScrollLength","getCanvasWidth","getViewportWidth","atTop","atBottom","atLeft","atRight","fireThrottledScrollingEvent","headerViewportWidth","footerViewportWidth","canvasHeight","getCanvasHeight","getViewportHeight","needsHScrollbarPlaceholder","scrollbarHeight","getHeaderViewportWidth","explicitHeaderCanvasHeight","reHCHeight","cloneScope","compileTemplate","getRowTemplateFn","newFunc","oldFunc","customScroller","newScrollTop","vertScrollPercentage","scrollVertical","addVerticalScrollSync","prevScrollArgs","getNewScrollTop","addHorizontalScrollSync","getNewScrollLeft","denormalizeScrollLeft","rowStyle","currentTopRow","currentFirstColumn","uiGridVisible","uiGridDirective","uiGrid","deregisterLeftWatcher","deregisterRightWatcher","sizeCheckInterval","maxSizeChecks","sizeChecks","footerHeight","maxNumberOfFilters","enableMinHeightCheck","minRowsToShow","headerRowHeight","calcFooterHeight","getScrollbarWidth","refreshCanvas","gridResize","renderingComplete","checkSize","gridClassFactory","mostRecentData","deregFunctions","columnDefsWatchFunction","callDataChangeCallbacks","orderByColumnDefs","preCompileCellTemplates","dataWatchFunction","hasColumns","fastWatch","appScope","rowHeaderColumns","uiGridColumns","buildColumnDefsFromData","buildColumns","modifyRows","redrawInPlace","createGrid","styleWatchDereg","styleComputations","deregFn","innerCompile","updateContainerWidth","adjustment","getViewportAdjustment","registerViewportAdjuster","defaultFilterLabel","columnMenuButtonLabel","filterLabel","aggregate","groupPanel","showingItems","selectedItems","totalItems","aggregation","pinning","pinLeft","pinRight","unpin","columnMenu","gridMenu","buttonLabel","importerTitle","exporterAllAsCsv","exporterVisibleAsCsv","exporterSelectedAsCsv","exporterAllAsPdf","exporterVisibleAsPdf","exporterSelectedAsPdf","exporterAllAsExcel","exporterVisibleAsExcel","exporterSelectedAsExcel","importer","noHeaders","noObjects","invalidCsv","invalidJson","jsonNotArray","pageToFirst","pageBack","pageSelected","pageForward","pageToLast","sizes","through","ungroup","aggregate_count","aggregate_sum","aggregate_max","aggregate_min","aggregate_avg","aggregate_remove","GridOptions","GridColumn","GridRow","GridApi","rowSorter","rowSearcher","GridRenderContainer","isScrollingVertically","appScopeProvider","columnFooterHeight","calcColumnFooterHeight","columnBuilders","rowBuilders","rowsProcessors","columnsProcessors","viewportAdjusters","dataChangeCallbacks","verticalScrollSyncCallBackFns","horizontalScrollSyncCallBackFns","cellValueGetterCache","disableScrolling","debouncedVertical","scrollDebounce","debouncedVerticalMinDelay","debouncedHorizontal","debouncedHorizontalMinDelay","flagScrollingVertically","withDelay","flagScrollingHorizontally","refreshRows","addRowHeaderColumn","registerRowsProcessor","registerColumnsProcessor","handleNulls","registerEvent","columnRefreshCallback","processRowsCallback","updateFooterHeightCallback","getFooterStyles","hasFooter","showGridFooter","gridFooterHeight","showColumnFooter","columnBuilder","dataRows","getColumnsFromData","excludeProperties","registerRowBuilder","rowBuilder","constants","rowColumnFinder","getColDef","assignTypes","guessType","getCellValue","isRowHeaderColumn","stopColumnBuild","rowHeaderCol","isRowHeader","createRightContainer","createLeftContainer","headerPriority","getOnlyDataColumns","builderPromises","headerOffset","preprocessColDef","updateColumnDef","preCompileCellTemplate","getQualifiedColField","compiledElementFnDefer","cellTemplatePromise","disableColumnOffset","newInN","oAccessor","nAccessor","nV","oV","rowEquality","removeSortOfColumn","lookInRows","entity","getRowsByKey","isInEntity","findRowByKey","newRawData","oldRows","oldRowHash","rowHashMap","createRowHashMap","allRowsSelected","newEntity","oldRow","enableRowHashing","processRowBuilders","processRowsProcessors","renderableRows","setVisibleRows","processColumnsProcessors","renderableColumns","setVisibleColumns","addRows","existingRowCount","styleComputationInfo","removeRowsProcessor","rowsProcessor","myRenderableRows","startProcessor","renderedRowsToProcess","processedRows","canvasHeightShouldUpdate","ri","targetContainer","rowsVisibleChanged","removeColumnsProcessor","myRenderableColumns","renderedColumnsToProcess","processedColumns","ci","refreshCanceller","gridRefreshCanceller","updateCanvasHeight","buildStyles","customStyles","compInfo","minColumnsToRender","currWidth","getBodyHeight","viewPortHeight","viewPortWidth","callBackFn","sourceContainerId","verts","horizs","idh","removeViewportAdjuster","getVisibleRowCount","getVisibleRows","getVisibleColumnCount","searchRows","sortByColumn","rendered","flatEntityAccess","getEntityQualifiedColField","cellDisplayGetterCache","custom_filter","cellFilter","colField","rowWithCol","getNextColumnSortPriority","resetColumnSorting","excludeCol","getColumnSorting","sortedCols","prioritySort","directionOrAdd","suppressMultiSort","sortDirectionCycle","sortChanged","getPrevScrollValue","rowsAdded","prevScrollVal","getScrollPercentage","scrollPixels","scrollLength","getScrollY","prevScrolltopPercentage","getScrollX","horizScrollPixels","horizScrollLength","prevScrollleftPercentage","horizPercentage","RowHashMap","onRegisterApi","rowsAltered","containerHeadersToRecalc","explicitHeaderHeight","rebuildStyles","bottomBorder","innerHeaderHeight","headerCanvasHeight","maxHeaderHeight","maxHeaderCanvasHeight","outerElementHeight","topBorder","getBorderSize","prevScrollLeft","adjustRows","adjustColumns","hasLeftContainerColumns","renderedColumns","hasRightContainerColumns","visRowCache","visColCache","leftBound","rightBound","seekRowIndex","pixelsToSeeRow","seekColumnIndex","columnLeftEdge","columnRightEdge","dereg","clearConditions","clearFlags","rowIdentity","setRowInvisible","clearRowInvisible","registerEventWithAngular","suppressEvents","listenerFuncs","foundListeners","eventObjectMap","featProp","featPropName","createBoundedWrapper","methodMap","aggregationValue","visibleRows","cellValues","aggregationType","cellValue","cellNumber","getAggregationValue","getDisplayName","setPropertyOrDefault","hasCustomWidth","allowCustomWidthOverride","colDefWidth","parseErrorMsg","endsWith","percentStr","isValidWidthValue","minOrMaxWidth","minimumColumnSize","cellTooltip","headerTooltip","sortCellFiltered","filterCellFiltered","headerCellFilter","footerCellFilter","isNullOrUndefined","headerClass","sortingAlgorithm","defaultFilters","thisPriority","prefixDot","isPinnedLeft","isPinnedRight","getRenderContainer","showColumn","getAggregationText","aggregationHideLabel","aggregationLabel","getCellTemplate","baseOptions","getRowIdentity","maxVisibleColumnCount","virtualizationThreshold","columnVirtualizationThreshold","excessRows","scrollThreshold","excessColumns","aggregationCalcThrottle","wheelScrollThrottle","entityA","entityB","rowTemplate","menuButtonTemplate","menuItemTemplate","renderedRows","prevRowScrollIndex","prevColumnScrollIndex","columnStyles","hasHScrollbar","hasVScrollbar","$$canvasHeight","updateColumnWidths","rowAddedHeight","getMargin","oldCanvasHeight","canvasHeightChanged","getHorizontalScrollLength","setRenderedRows","setRenderedColumns","newColumns","updateColumnOffset","hiddenColumnsWidth","yDiff","adjustScrollVertical","xDiff","adjustScrollHorizontal","scrollPercentage","postDataLoaded","rowCache","maxRowIndex","newRange","suppressParentScrollDown","suppressParentScrollUp","maxLen","updateViewableRowRange","minCols","maxColumnIndex","colIndex","getLeftIndex","updateViewableColumnRange","wholeLeftWidth","renderedRange","rowArr","columnArr","headerCellWrapperStyle","asteriskVal","variableWidthColumnArray","asterisksArray","asteriskNum","usedWidthSum","pinRightColumn","fixedNumberArray","percentageArray","totalPercentage","remainingWidth","percentageIntegerValue","pinnedRight","allowFloatWidth","processColumnUpwards","leftoverWidth","columnsToChange","processColumnDownwards","excessWidth","containerBody","getViewportStyle","scrollbarVisibility","$$height","setThisRowInvisible","clearThisRowInvisible","fromRowsProcessor","invisibleReason","evaluateRowVisibility","fromRowProcessor","newVisibility","getIntersectionValueRaw","sourceRowContainer","sourceColContainer","trailing","oldScrollLeft","oldScrollTop","RenderContainerTouchMove","Other","rowTemplateFnPromise","rowTemplateFn","defaultColumnBuilder","rowTemplateAssigner","externalSort","templateType","providedType","defaultTemplate","filterType","tooltipType","templatePromise","tooltipCall","postProcessTemplate","templateGetPromises","perRowTemplateFnPromise","escapeRegExp","defaultCondition","getTerm","stripTerm","guessCondition","reText","regexpFlags","setupFilters","newFilters","noTerm","newFilter","rawTerm","startswithRE","endswithRE","exactRE","containsRE","runColumnFilter","conditionType","tempFloat","searchColumn","useExternalFiltering","hasTerm","foreachFilterCol","colSortFnCache","parseNumStr","guessSortFn","sortNumber","sortNumberStr","sortBool","sortAlpha","sortDate","basicSort","nulls","badB","numA","numB","badA","strA","strB","timeA","timeB","getSortFn","sortFn","useExternalSorting","sortCols","defaultSortCols","ignoreSort","defaultSort","$$uiGridIndex","rowA","rowB","tem","propA","propB","bindPolyfill","sides","padd","nocontentPad","marg","bordermarg","nocontentnopad","uidPrefix","seedId","nullLowestDeltaTimeout","lowestDelta","templateHtml","startSym","endSym","widthNoScroll","msOverflowStyle","widthWithScroll","fakeElement","normalizeWheelEvent","lowestDeltaXY","orgEvent","HORIZONTAL_AXIS","absDeltaXY","isTouchEnabled","arrayContainsObjectWithProperty","numericAndNullSort","enableAnimations","resetUids","logMessage","logWarn","logDebug","mouseWheeltoBind","_purgeQueue","elementID","aSync","focusBySelector","capsName","matchesFn","detectBrowser","browsers","safari","rtlScrollType","definer","runFunc","sinceLast","addOff","removeAt","pageHeight","nullLowestDelta","cbs","DIRECTIVE_ALIASES","uitDirective","i18nConstants","alias1","alias2","translateToken","safeText","UPDATE_EVENT","uitFilter","MISSING","LOCALE_DIRECTIVE_ALIAS","DEFAULT_LANG","langCache","_langs","fallbackLang","getFallbackLang","strings","getAllLangs","setCurrent","setFallback","getCurrentLang","getMissingText","stringMaps","setCurrentLang","setFallbackLang","EDITABLE_CELL_TEMPLATE","EDITABLE_CELL_DIRECTIVE","BEGIN_CELL_EDIT","END_CELL_EDIT","CANCEL_CELL_EDIT","editColumnBuilder","cellEditableCondition","enableCellEdit","editableCellTemplate","isStartEditKey","uiGridEditService","uiGridEditConstants","origCellValue","cellModel","cancelTouchstartTimeout","editCellScope","cellNavNavigateDereg","viewPortKeyDownDereg","setEditable","inEdit","registerBeginEditEvents","beginEdit","beginEditKeyDown","beginEditEventsWired","cancelBeginEditEvents","beginEditAfterScroll","isSaving","modelField","optionFilter","editModelField","editDropdownFilter","editDropdownOptionsFunction","createEditor","editDropdownOptionsArray","editDropdownRowEntityOptionsArrayPath","editDropdownIdLabel","editDropdownValueLabel","deregOnGridScroll","endEdit","deregOnEndCellEdit","deregOnCancelCellEdit","gridCellContentsEl","viewPortKeyDownUnregister","stopEdit","deepEdit","inputForm","dateValue","handleFileSelect","editFileChooserCallback","disableEmptyBaseLayer","baseLayer","emptyRows","enableEmptyGridBaseLayer","setNumberOfEmptyRows","uiGridBaseLayerService","uiGridEmptyBaseLayer","renderBodyContainer","newViewPortHeight","emptyBaseLayerContainer","expandable","expandedAll","enableOnDblClickExpand","enableExpandable","showExpandAllButton","expandableRowHeight","expandableRowHeaderWidth","expandableRowTemplate","rowExpandedBeforeStateChanged","rowExpandedStateChanged","rowExpandedRendered","toggleRowExpansion","expandAllRows","collapseAllRows","toggleAllRows","expandRow","isExpanded","collapseRow","getExpandedRows","expandedRowHeight","_tWatcher","expandedRendered","subGridOptions","disableRowExpandable","uiGridExpandableService","expandableRowHeaderColDef","enableExpandableRowHeader","exporterSuppressExport","enableColumnResizing","parentRow","expandableRowScope","expandedRowElement","expandableRow","shouldRenderExpand","shouldRenderFiller","rowRepeatDiv","expandedRowFillerElement","rowHeaderColName","selectionRowHeaderColName","VISIBLE","CSV_CONTENT","BUTTON_LABEL","FILE_NAME","uiGridExporterConstants","exporter","csvExport","rowTypes","colTypes","pdfExport","excelExport","addToMenu","exporterSuppressMenu","exporterMenuLabel","exporterSuppressColumns","exporterCsvColumnSeparator","exporterCsvFilename","exporterPdfFilename","exporterExcelFilename","exporterExcelSheetName","exporterOlderExcelCompatibility","exporterIsExcelCompatible","exporterMenuItemOrder","exporterPdfDefaultStyle","exporterPdfTableStyle","exporterPdfTableHeaderStyle","exporterPdfHeader","exporterPdfFooter","exporterPdfOrientation","exporterPdfPageSize","exporterPdfMaxGridWidth","exporterMenuAllData","exporterMenuVisibleData","exporterMenuSelectedData","exporterMenuCsv","exporterMenuPdf","exporterMenuExcel","exporterPdfCustomFormatter","docDef","exporterHeaderFilterUseName","exporterFieldCallback","defaultExporterFieldCallback","exporterFieldFormatCallback","exporterExcelCustomFormatters","workbook","docDefinition","exporterExcelHeader","exporterColumnScaleFactor","exporterFieldApplyFilters","exporterAllDataFn","exporterAllDataPromise","getSelectedRows","loadAllDataIfNeeded","exportColumnHeaders","getColumnHeaders","exportData","csvContent","formatAsCsv","downloadFile","bodyColumns","headerEntry","exporterHeaderFilter","getRowsFromNode","nodeKeys","getDataSorted","treeBase","numberLevels","nodeRows","applyCellFilters","getSelectedGridRows","extractedRow","exporterEnableExporting","extractedField","extension","exporterPdfAlign","alignment","bareHeaders","formatRowAsCsv","formatFieldAsCsv","isIE","columnSeparator","rawFile","strMimeType","ieVersion","msSaveBlob","createObjectURL","prepareAsPdf","downloadPDF","pdfMake","createPdf","getBuffer","calculatePdfHeaderWidths","headerColumns","stringData","formatRowAsPdf","pageOrientation","headerRows","tableHeader","exporterPdfLayout","exportHeaders","baseGridWidth","extraColumns","formatFieldAsPdfString","returnVal","formatAsExcel","sheetData","headerData","exportStyle","metadata","formatRowAsExcel","formatFieldAsExcel","prepareAsExcel","headerText","aName","ExcelBuilder","Worksheet","Workbook","addWorksheet","colWidths","enableRowSelection","setColumns","excelContent","createFile","uiGridExporterService","COLLAPSED","COUNT","SUM","MAX","MIN","AVG","uiGridGroupingConstants","uiGridTreeBaseService","groupHeaderCache","groupRows","groupingColumnBuilder","groupingColumnProcessor","aggregationChanged","groupingChanged","getGrouping","getExpanded","colName","aggregations","rowExpandedStates","getRowExpandedStates","groupingHeaderCache","setGrouping","groupColumn","ungroupColumn","clearGrouping","aggregateColumn","aggregationDef","tidyPriorities","enableGrouping","groupingShowCounts","groupingNullLabel","enableGroupHeaderSelection","aggregateRemove","addAggregationMenu","groupPriority","treeAggregationFn","nativeAggregations","aggregationFn","treeAggregationFinalizerFn","groupedFinalizerFn","treeAggregation","groupingShowGroupingMenu","groupingShowAggregationMenu","treeCustomAggregations","menuTitle","moveGroupColumns","groupVal","groupingPosition","a_group","b_group","existingGrouping","previousSort","customTreeAggregationFn","customTreeAggregationFinalizer","finalizerFn","applyRowExpandedStates","currentGrouping","groupArray","sortArray","processingState","oldGroupingHeaderCache","initialiseProcessingState","updateProcessingState","groupFieldState","stateIndex","fieldValue","initialised","insertGroupHeader","fieldName","currentRow","aggregateArray","newDisplayValue","getKeyAsValueForCacheMap","headerRow","cacheItem","treeLevel","groupHeader","internalRow","enableSelection","finaliseProcessingState","treeChildren","treeNode","expandedStates","uiGridGroupingService","uiGridImporterConstants","importFile","fileObject","importThisFile","enableImporter","importerShowMenu","importerProcessHeaders","processHeaders","importerHeaderFilter","importerErrorCallback","importerDataAddCallback","importerObjectCallback","importAFile","importJsonClosure","importCsvClosure","readAsText","newObjects","importArray","parseJson","addObjects","loadedObjects","alertError","parseCsv","createCsvObjects","CSV","headerMapping","lookupHash","flattenColumnDefs","flattenedHash","columnDef","rowEdit","setRowsDirty","importerNewObject","alertI18nToken","consoleMessage","uiGridImporterService","fileChooser","enableInfiniteScroll","infiniteScroll","dataLoading","setScrollDirections","infiniteScrollUp","infiniteScrollDown","handleScroll","dataLoaded","scrollUp","scrollDown","adjustScroll","adjustInfiniteScrollPosition","saveScrollPercentage","previousVisibleRows","dataRemovedTop","dataRemovedBottom","needLoadMoreData","needLoadMoreDataTop","infiniteScrollRowsFromEnd","targetPercentage","loadData","newVisibleRows","oldTop","uiGridInfiniteScrollService","registerPublicApi","moveColumns","orderCache","movableColumnBuilder","verifyColumnOrder","colMovable","columnPositionChanged","originalPosition","moveColumn","finalPosition","findPositionForRenderIndex","nonMovableColumns","redrawColumnAtPosition","enableColumnMoving","updateColumnCache","headerRowOffset","cacheCol","cacheIndex","originalColumn","uiGridMoveColumnService","gridLeft","totalMouseMovement","rightMoveLimit","elmCloned","movingElm","reducedWidth","moveOccurred","moveElement","changeValue","targetIndex","il","totalColumnsLeftWidth","ir","totalColumnsRightWidth","movingElementStyles","gridRight","elmRight","totalColumnWidth","currentElmLeft","currentElmRight","newElementLeft","paginationChanged","currentPage","getPage","enablePagination","paginationCurrentPage","getFirstRowIndex","useCustomPagination","paginationPageSizes","paginationPageSize","getLastRowIndex","getTotalPages","seek","lastRow","useExternalPagination","enablePaginationControls","paginationTemplate","onPaginationChanged","uiGridPaginationService","paginationApi","sizesLabel","totalItemsLabel","paginationOf","paginationThrough","focusToInputIf","deregP","cantPageForward","cantPageToLast","totalPages","cantPageBackward","pageFirstPageClick","pagePreviousPageClick","pageNextPageClick","pageLastPageClick","uiGridPinningConstants","pinningColumnBuilder","columnPinned","pinColumn","enablePinning","hidePinLeft","hidePinRight","pinColumnRightAction","removePinAction","pinnedLeft","pinColumnLeftAction","uiGridPinningService","enableColumnResize","colResizerColumnBuilder","colResizable","columnSizeChanged","deltaChange","fireColumnSizeChanged","findTargetCol","rtlMultiplier","uiGridResizeColumnsService","columnResizerElm","displayResizers","resizers","otherCol","resizerLeft","resizerRight","resizeOverlay","constrainWidth","moveFunction","upFunction","dblClickFn","menuButton","downFunction","uiGridRowEditConstants","saveRow","setSavePromise","savePromise","getDirtyRows","dirtyRows","getErrorRows","errorRows","flushDirtyRows","setRowsClean","gridApi","endEditCell","beginEditCell","cancelEditCell","rowEditSavePromise","processSuccessPromise","processErrorPromise","rowEditSaveTimer","removeRow","isRowPresent","rowArray","removeGridRow","present","cancelTimer","considerSetTimer","waitTime","rowEditWaitInterval","myDataRows","uiGridRowEditService","existingNgClass","newNgClass","saveState","saveWidths","saveOrder","saveScroll","saveFocus","saveVisible","saveSort","saveFilter","saveGrouping","saveGroupingExpandedStates","savePinning","saveTreeView","savedState","saveColumns","scrollFocus","saveScrollFocus","treeView","savePagination","restoreColumns","restoreScrollFocus","restoreGrouping","restoreTreeView","restorePagination","savedColumn","copiedFilter","pinned","rowVal","getRowVal","prevColScrollIndex","getTreeView","saveRowIdentity","columnsState","isSortChanged","columnState","currentCol","scrollFocusState","colDefs","findRowByIdentity","selectionState","clearSelectedRows","foundRow","selectRow","selectRowByVisibleIndex","groupingState","treeViewState","setTreeView","filteredRows","uiGridSaveStateConstants","uiGridSaveStateService","selectedCount","focusedRow","lastSelectedRow","rowFocusChanged","rowSelectionChanged","rowSelectionChangedBatch","toggleRowSelection","multiSelect","noUnselect","rowNum","selectRowByKey","unSelectRow","unSelectRowByVisibleIndex","unSelectRowByKey","selectAllRows","changedRows","isRowSelectable","decideRaiseSelectionEvent","decideRaiseSelectionBatchEvent","selectAllVisibleRows","mapAndFilterRowsByEntity","getUnSelectedRows","getUnSelectedGridRows","getSelectedCount","setMultiSelect","setModifierKeysToMultiSelect","modifierKeysToMultiSelect","getSelectAllState","enableRowHeaderSelection","enableFullRowSelection","enableFocusRowOnRowHeaderClick","enableSelectRowOnFocus","enableSelectAll","enableSelectionBatchEvent","selectionRowHeaderWidth","enableFooterTotalSelected","canBeInvisible","shiftSelect","fromRow","toRow","rowToSelect","gridRows","previousVal","uiGridSelectionConstants","uiGridSelectionService","processSelectableRows","processorSet","selectionRowHeaderDef","selectButtonClick","selectButtonKeyDown","headerButtonKeyDown","headerButtonClick","touchStartTime","touchStartPos","selectCells","touchTimeout","touchPosDiff","touchEndTime","touchEndPos","touchTime","touchXDiff","touchYDiff","registerRowSelectionEvents","dataChangeUnreg","uiGridTreeBaseConstants","expandAll","treeRows","treeBaseColumnBuilder","createRowHeader","rowExpanded","rowCollapsed","toggleRowTreeState","recursive","expandRowChildren","collapseRowChildren","getTreeExpandedState","expandedState","getTreeState","setTreeState","getRowChildren","treeRowHeaderBaseWidth","treeIndent","showTreeRowHeader","showTreeExpandNoChildren","treeRowHeaderAlwaysVisible","enableExpandAll","treeAggregationType","treeAggregationLabel","treeAggregationUpdateEntity","customTreeAggregationFinalizerFn","rowHeaderColumnDef","setAllNodes","targetState","allExpanded","allExpandedInternal","updateRowHeaderWidth","sortTree","fixFilter","renderTree","rowHeader","currentLevel","parentsCache","getAggregations","$$treeLevel","lastParent","finaliseAggregations","setCurrentState","addOrUseNode","aggregationBase","newAggregations","buildAggregationObject","currentState","sortInternal","treeList","treeNodes","parentsVisible","fixFilterInternal","setParentsVisible","newAggregation","treeFooterAggregation","treeFooterAggregationType","numValue","finaliseAggregation","aggregationCopy","treeButtonClass","treeButtonClick","treeButtonKeyDown","headerButtonClass","uiGridTreeViewConstants","adjustSorting","enableTreeView","uiGridTreeViewService","validatorFactories","setExternalFactoryFunction","externalFactoryFunction","clearExternalFactory","getValidatorFromExternalFactory","validatorFactory","getMessageFromExternalFactory","messageFunction","setValidator","getValidator","getMessage","setValid","validatorName","clearError","getErrorMessages","validators","getFormattedErrors","msgString","getTitleFormattedErrors","runValidators","validatorFunction","validationFailed","createDefaultValidators","uiGridValidateService"],"mappings":"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C,IAAI,cAAc,IAAI,CAAC,IAAI,cAAc,IAAI,CAAC,IAAI,cAAc,IAAI,CAAC,IAAI,cAAc,IAAI,CAAC,IAAI,cAAc,IAAI,CAAC,IAAI,cAAc,IAAI,CAAC,IAAI,cAAc,IAAI,CAAC,IAAI,cAAc,IAAI,CAAC,IAAI,cAAc,IAAI,CAAC,IAAI,cAAc,IAAI,CAAC,IAAI,cAAc,IAAI,CAAC,IAAI,cAAc,IAAI,CAAC,IAAI,cAAc,IAAI,CAAC,IAAI,cAAc,IAAI,CAAC,IAAI,cAAc,IAAI,CAAC,IAAI,cAAc,IAAI,CAAC,IAAI,cAAc,IAAI,CAAC,IAAI,cAAc,IAAI,CAAC,IAAI,cAAc,IAAI,CAAC,IAAI,cAAc,IAAI,CAAC,IAAI,cAAc,IAAI,CAAC,IAAI,cAAc,IAAI,CAAC,IAAI,cAAc,IAAI,CAAC,IAAI,cAAc,IAAI,CAAC,IAAI,cAAc,IAAI,CAAC,IAAI,cAAc,IAAI,CAAC,IAAI,cAAc,IAAI,CAAC,IAAI,cAAc,IAAI,CAAC,IAAI,cAAc,IAAI,CAAC,IAAI,cAAc,IAAI,CAAC,IAAI,cAAc,IAAI,CAAC,IAAI,cAAc,IAAI,CAAC,KAAK,cAAc,IAAI,CAAC,IAAI,cAAc,IAAI,CAAC,IAAI,cAAc,IAAI,CAAC,IAAI,cAAc,IAAI,CAAC,IAAI,cAAc,IAAI,CAAC,IAAI,cAAc,IAAI,CAAC,IAAI,cAAc,IAAI,CAAC,IAAI,cAAc,IAAI,CAAC,IAAI,cAAc,IAAI,CAAC,IAAI,cAAc,IAAI,CAAC,IAAI,cAAc,IAAI,CAAC,IAAI,cAAc,IAAI,CAAC,IAAI,cAAc,IAAI,CAAC,IAAI,cAAc,IAAI,CAAC,IAAI,cAAc,IAAI,CAAC,IAAI,cAAc,IAAI,CAAC,IAAI,cAAc,IAAI,CAAC,IAAI,cAAc,IAAI,CAAC,IAAI,cAAc,IAAI,CAAC,IAAI,cAAc,IAAI,CAAC,IAAI,cAAc,IAAI,CAAC,IAAI,cAAc,IAAI,CAAC,IAAI,cAAc,IAAI,CAAC,IAAI,cAAc,IAAI,CAAC,IAAI,cAAc,IAAI,CAAC,IAAI,cAAc,IAAI,CAAC,IAAI,cAAc,IAAI,CAAC,IAAI,cAAc,IAAI,CAA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","file":"scripts/vendor-fba4f15e6f.0ab8d180.js","sourcesContent":["/*!\n * jQuery JavaScript Library v3.1.1\n * https://jquery.com/\n *\n * Includes Sizzle.js\n * https://sizzlejs.com/\n *\n * Copyright jQuery Foundation and other contributors\n * Released under the MIT license\n * https://jquery.org/license\n *\n * Date: 2016-09-22T22:30Z\n */\n( function( global, factory ) {\n\n\t\"use strict\";\n\n\tif ( typeof module === \"object\" && typeof module.exports === \"object\" ) {\n\n\t\t// For CommonJS and CommonJS-like environments where a proper `window`\n\t\t// is present, execute the factory and get jQuery.\n\t\t// For environments that do not have a `window` with a `document`\n\t\t// (such as Node.js), expose a factory as module.exports.\n\t\t// This accentuates the need for the creation of a real `window`.\n\t\t// e.g. var jQuery = require(\"jquery\")(window);\n\t\t// See ticket #14549 for more info.\n\t\tmodule.exports = global.document ?\n\t\t\tfactory( global, true ) :\n\t\t\tfunction( w ) {\n\t\t\t\tif ( !w.document ) {\n\t\t\t\t\tthrow new Error( \"jQuery requires a window with a document\" );\n\t\t\t\t}\n\t\t\t\treturn factory( w );\n\t\t\t};\n\t} else {\n\t\tfactory( global );\n\t}\n\n// Pass this if window is not defined yet\n} )( typeof window !== \"undefined\" ? window : this, function( window, noGlobal ) {\n\n// Edge <= 12 - 13+, Firefox <=18 - 45+, IE 10 - 11, Safari 5.1 - 9+, iOS 6 - 9.1\n// throw exceptions when non-strict code (e.g., ASP.NET 4.5) accesses strict mode\n// arguments.callee.caller (trac-13335). But as of jQuery 3.0 (2016), strict mode should be common\n// enough that all such attempts are guarded in a try block.\n\"use strict\";\n\nvar arr = [];\n\nvar document = window.document;\n\nvar getProto = Object.getPrototypeOf;\n\nvar slice = arr.slice;\n\nvar concat = arr.concat;\n\nvar push = arr.push;\n\nvar indexOf = arr.indexOf;\n\nvar class2type = {};\n\nvar toString = class2type.toString;\n\nvar hasOwn = class2type.hasOwnProperty;\n\nvar fnToString = hasOwn.toString;\n\nvar ObjectFunctionString = fnToString.call( Object );\n\nvar support = {};\n\n\n\n\tfunction DOMEval( code, doc ) {\n\t\tdoc = doc || document;\n\n\t\tvar script = doc.createElement( \"script\" );\n\n\t\tscript.text = code;\n\t\tdoc.head.appendChild( script ).parentNode.removeChild( script );\n\t}\n/* global Symbol */\n// Defining this global in .eslintrc.json would create a danger of using the global\n// unguarded in another place, it seems safer to define global only for this module\n\n\n\nvar\n\tversion = \"3.1.1\",\n\n\t// Define a local copy of jQuery\n\tjQuery = function( selector, context ) {\n\n\t\t// The jQuery object is actually just the init constructor 'enhanced'\n\t\t// Need init if jQuery is called (just allow error to be thrown if not included)\n\t\treturn new jQuery.fn.init( selector, context );\n\t},\n\n\t// Support: Android <=4.0 only\n\t// Make sure we trim BOM and NBSP\n\trtrim = /^[\\s\\uFEFF\\xA0]+|[\\s\\uFEFF\\xA0]+$/g,\n\n\t// Matches dashed string for camelizing\n\trmsPrefix = /^-ms-/,\n\trdashAlpha = /-([a-z])/g,\n\n\t// Used by jQuery.camelCase as callback to replace()\n\tfcamelCase = function( all, letter ) {\n\t\treturn letter.toUpperCase();\n\t};\n\njQuery.fn = jQuery.prototype = {\n\n\t// The current version of jQuery being used\n\tjquery: version,\n\n\tconstructor: jQuery,\n\n\t// The default length of a jQuery object is 0\n\tlength: 0,\n\n\ttoArray: function() {\n\t\treturn slice.call( this );\n\t},\n\n\t// Get the Nth element in the matched element set OR\n\t// Get the whole matched element set as a clean array\n\tget: function( num ) {\n\n\t\t// Return all the elements in a clean array\n\t\tif ( num == null ) {\n\t\t\treturn slice.call( this );\n\t\t}\n\n\t\t// Return just the one element from the set\n\t\treturn num < 0 ? this[ num + this.length ] : this[ num ];\n\t},\n\n\t// Take an array of elements and push it onto the stack\n\t// (returning the new matched element set)\n\tpushStack: function( elems ) {\n\n\t\t// Build a new jQuery matched element set\n\t\tvar ret = jQuery.merge( this.constructor(), elems );\n\n\t\t// Add the old object onto the stack (as a reference)\n\t\tret.prevObject = this;\n\n\t\t// Return the newly-formed element set\n\t\treturn ret;\n\t},\n\n\t// Execute a callback for every element in the matched set.\n\teach: function( callback ) {\n\t\treturn jQuery.each( this, callback );\n\t},\n\n\tmap: function( callback ) {\n\t\treturn this.pushStack( jQuery.map( this, function( elem, i ) {\n\t\t\treturn callback.call( elem, i, elem );\n\t\t} ) );\n\t},\n\n\tslice: function() {\n\t\treturn this.pushStack( slice.apply( this, arguments ) );\n\t},\n\n\tfirst: function() {\n\t\treturn this.eq( 0 );\n\t},\n\n\tlast: function() {\n\t\treturn this.eq( -1 );\n\t},\n\n\teq: function( i ) {\n\t\tvar len = this.length,\n\t\t\tj = +i + ( i < 0 ? len : 0 );\n\t\treturn this.pushStack( j >= 0 && j < len ? [ this[ j ] ] : [] );\n\t},\n\n\tend: function() {\n\t\treturn this.prevObject || this.constructor();\n\t},\n\n\t// For internal use only.\n\t// Behaves like an Array's method, not like a jQuery method.\n\tpush: push,\n\tsort: arr.sort,\n\tsplice: arr.splice\n};\n\njQuery.extend = jQuery.fn.extend = function() {\n\tvar options, name, src, copy, copyIsArray, clone,\n\t\ttarget = arguments[ 0 ] || {},\n\t\ti = 1,\n\t\tlength = arguments.length,\n\t\tdeep = false;\n\n\t// Handle a deep copy situation\n\tif ( typeof target === \"boolean\" ) {\n\t\tdeep = target;\n\n\t\t// Skip the boolean and the target\n\t\ttarget = arguments[ i ] || {};\n\t\ti++;\n\t}\n\n\t// Handle case when target is a string or something (possible in deep copy)\n\tif ( typeof target !== \"object\" && !jQuery.isFunction( target ) ) {\n\t\ttarget = {};\n\t}\n\n\t// Extend jQuery itself if only one argument is passed\n\tif ( i === length ) {\n\t\ttarget = this;\n\t\ti--;\n\t}\n\n\tfor ( ; i < length; i++ ) {\n\n\t\t// Only deal with non-null/undefined values\n\t\tif ( ( options = arguments[ i ] ) != null ) {\n\n\t\t\t// Extend the base object\n\t\t\tfor ( name in options ) {\n\t\t\t\tsrc = target[ name ];\n\t\t\t\tcopy = options[ name ];\n\n\t\t\t\t// Prevent never-ending loop\n\t\t\t\tif ( target === copy ) {\n\t\t\t\t\tcontinue;\n\t\t\t\t}\n\n\t\t\t\t// Recurse if we're merging plain objects or arrays\n\t\t\t\tif ( deep && copy && ( jQuery.isPlainObject( copy ) ||\n\t\t\t\t\t( copyIsArray = jQuery.isArray( copy ) ) ) ) {\n\n\t\t\t\t\tif ( copyIsArray ) {\n\t\t\t\t\t\tcopyIsArray = false;\n\t\t\t\t\t\tclone = src && jQuery.isArray( src ) ? src : [];\n\n\t\t\t\t\t} else {\n\t\t\t\t\t\tclone = src && jQuery.isPlainObject( src ) ? src : {};\n\t\t\t\t\t}\n\n\t\t\t\t\t// Never move original objects, clone them\n\t\t\t\t\ttarget[ name ] = jQuery.extend( deep, clone, copy );\n\n\t\t\t\t// Don't bring in undefined values\n\t\t\t\t} else if ( copy !== undefined ) {\n\t\t\t\t\ttarget[ name ] = copy;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\n\t// Return the modified object\n\treturn target;\n};\n\njQuery.extend( {\n\n\t// Unique for each copy of jQuery on the page\n\texpando: \"jQuery\" + ( version + Math.random() ).replace( /\\D/g, \"\" ),\n\n\t// Assume jQuery is ready without the ready module\n\tisReady: true,\n\n\terror: function( msg ) {\n\t\tthrow new Error( msg );\n\t},\n\n\tnoop: function() {},\n\n\tisFunction: function( obj ) {\n\t\treturn jQuery.type( obj ) === \"function\";\n\t},\n\n\tisArray: Array.isArray,\n\n\tisWindow: function( obj ) {\n\t\treturn obj != null && obj === obj.window;\n\t},\n\n\tisNumeric: function( obj ) {\n\n\t\t// As of jQuery 3.0, isNumeric is limited to\n\t\t// strings and numbers (primitives or objects)\n\t\t// that can be coerced to finite numbers (gh-2662)\n\t\tvar type = jQuery.type( obj );\n\t\treturn ( type === \"number\" || type === \"string\" ) &&\n\n\t\t\t// parseFloat NaNs numeric-cast false positives (\"\")\n\t\t\t// ...but misinterprets leading-number strings, particularly hex literals (\"0x...\")\n\t\t\t// subtraction forces infinities to NaN\n\t\t\t!isNaN( obj - parseFloat( obj ) );\n\t},\n\n\tisPlainObject: function( obj ) {\n\t\tvar proto, Ctor;\n\n\t\t// Detect obvious negatives\n\t\t// Use toString instead of jQuery.type to catch host objects\n\t\tif ( !obj || toString.call( obj ) !== \"[object Object]\" ) {\n\t\t\treturn false;\n\t\t}\n\n\t\tproto = getProto( obj );\n\n\t\t// Objects with no prototype (e.g., `Object.create( null )`) are plain\n\t\tif ( !proto ) {\n\t\t\treturn true;\n\t\t}\n\n\t\t// Objects with prototype are plain iff they were constructed by a global Object function\n\t\tCtor = hasOwn.call( proto, \"constructor\" ) && proto.constructor;\n\t\treturn typeof Ctor === \"function\" && fnToString.call( Ctor ) === ObjectFunctionString;\n\t},\n\n\tisEmptyObject: function( obj ) {\n\n\t\t/* eslint-disable no-unused-vars */\n\t\t// See https://github.com/eslint/eslint/issues/6125\n\t\tvar name;\n\n\t\tfor ( name in obj ) {\n\t\t\treturn false;\n\t\t}\n\t\treturn true;\n\t},\n\n\ttype: function( obj ) {\n\t\tif ( obj == null ) {\n\t\t\treturn obj + \"\";\n\t\t}\n\n\t\t// Support: Android <=2.3 only (functionish RegExp)\n\t\treturn typeof obj === \"object\" || typeof obj === \"function\" ?\n\t\t\tclass2type[ toString.call( obj ) ] || \"object\" :\n\t\t\ttypeof obj;\n\t},\n\n\t// Evaluates a script in a global context\n\tglobalEval: function( code ) {\n\t\tDOMEval( code );\n\t},\n\n\t// Convert dashed to camelCase; used by the css and data modules\n\t// Support: IE <=9 - 11, Edge 12 - 13\n\t// Microsoft forgot to hump their vendor prefix (#9572)\n\tcamelCase: function( string ) {\n\t\treturn string.replace( rmsPrefix, \"ms-\" ).replace( rdashAlpha, fcamelCase );\n\t},\n\n\tnodeName: function( elem, name ) {\n\t\treturn elem.nodeName && elem.nodeName.toLowerCase() === name.toLowerCase();\n\t},\n\n\teach: function( obj, callback ) {\n\t\tvar length, i = 0;\n\n\t\tif ( isArrayLike( obj ) ) {\n\t\t\tlength = obj.length;\n\t\t\tfor ( ; i < length; i++ ) {\n\t\t\t\tif ( callback.call( obj[ i ], i, obj[ i ] ) === false ) {\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t}\n\t\t} else {\n\t\t\tfor ( i in obj ) {\n\t\t\t\tif ( callback.call( obj[ i ], i, obj[ i ] ) === false ) {\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\treturn obj;\n\t},\n\n\t// Support: Android <=4.0 only\n\ttrim: function( text ) {\n\t\treturn text == null ?\n\t\t\t\"\" :\n\t\t\t( text + \"\" ).replace( rtrim, \"\" );\n\t},\n\n\t// results is for internal usage only\n\tmakeArray: function( arr, results ) {\n\t\tvar ret = results || [];\n\n\t\tif ( arr != null ) {\n\t\t\tif ( isArrayLike( Object( arr ) ) ) {\n\t\t\t\tjQuery.merge( ret,\n\t\t\t\t\ttypeof arr === \"string\" ?\n\t\t\t\t\t[ arr ] : arr\n\t\t\t\t);\n\t\t\t} else {\n\t\t\t\tpush.call( ret, arr );\n\t\t\t}\n\t\t}\n\n\t\treturn ret;\n\t},\n\n\tinArray: function( elem, arr, i ) {\n\t\treturn arr == null ? -1 : indexOf.call( arr, elem, i );\n\t},\n\n\t// Support: Android <=4.0 only, PhantomJS 1 only\n\t// push.apply(_, arraylike) throws on ancient WebKit\n\tmerge: function( first, second ) {\n\t\tvar len = +second.length,\n\t\t\tj = 0,\n\t\t\ti = first.length;\n\n\t\tfor ( ; j < len; j++ ) {\n\t\t\tfirst[ i++ ] = second[ j ];\n\t\t}\n\n\t\tfirst.length = i;\n\n\t\treturn first;\n\t},\n\n\tgrep: function( elems, callback, invert ) {\n\t\tvar callbackInverse,\n\t\t\tmatches = [],\n\t\t\ti = 0,\n\t\t\tlength = elems.length,\n\t\t\tcallbackExpect = !invert;\n\n\t\t// Go through the array, only saving the items\n\t\t// that pass the validator function\n\t\tfor ( ; i < length; i++ ) {\n\t\t\tcallbackInverse = !callback( elems[ i ], i );\n\t\t\tif ( callbackInverse !== callbackExpect ) {\n\t\t\t\tmatches.push( elems[ i ] );\n\t\t\t}\n\t\t}\n\n\t\treturn matches;\n\t},\n\n\t// arg is for internal usage only\n\tmap: function( elems, callback, arg ) {\n\t\tvar length, value,\n\t\t\ti = 0,\n\t\t\tret = [];\n\n\t\t// Go through the array, translating each of the items to their new values\n\t\tif ( isArrayLike( elems ) ) {\n\t\t\tlength = elems.length;\n\t\t\tfor ( ; i < length; i++ ) {\n\t\t\t\tvalue = callback( elems[ i ], i, arg );\n\n\t\t\t\tif ( value != null ) {\n\t\t\t\t\tret.push( value );\n\t\t\t\t}\n\t\t\t}\n\n\t\t// Go through every key on the object,\n\t\t} else {\n\t\t\tfor ( i in elems ) {\n\t\t\t\tvalue = callback( elems[ i ], i, arg );\n\n\t\t\t\tif ( value != null ) {\n\t\t\t\t\tret.push( value );\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\t// Flatten any nested arrays\n\t\treturn concat.apply( [], ret );\n\t},\n\n\t// A global GUID counter for objects\n\tguid: 1,\n\n\t// Bind a function to a context, optionally partially applying any\n\t// arguments.\n\tproxy: function( fn, context ) {\n\t\tvar tmp, args, proxy;\n\n\t\tif ( typeof context === \"string\" ) {\n\t\t\ttmp = fn[ context ];\n\t\t\tcontext = fn;\n\t\t\tfn = tmp;\n\t\t}\n\n\t\t// Quick check to determine if target is callable, in the spec\n\t\t// this throws a TypeError, but we will just return undefined.\n\t\tif ( !jQuery.isFunction( fn ) ) {\n\t\t\treturn undefined;\n\t\t}\n\n\t\t// Simulated bind\n\t\targs = slice.call( arguments, 2 );\n\t\tproxy = function() {\n\t\t\treturn fn.apply( context || this, args.concat( slice.call( arguments ) ) );\n\t\t};\n\n\t\t// Set the guid of unique handler to the same of original handler, so it can be removed\n\t\tproxy.guid = fn.guid = fn.guid || jQuery.guid++;\n\n\t\treturn proxy;\n\t},\n\n\tnow: Date.now,\n\n\t// jQuery.support is not used in Core but other projects attach their\n\t// properties to it so it needs to exist.\n\tsupport: support\n} );\n\nif ( typeof Symbol === \"function\" ) {\n\tjQuery.fn[ Symbol.iterator ] = arr[ Symbol.iterator ];\n}\n\n// Populate the class2type map\njQuery.each( \"Boolean Number String Function Array Date RegExp Object Error Symbol\".split( \" \" ),\nfunction( i, name ) {\n\tclass2type[ \"[object \" + name + \"]\" ] = name.toLowerCase();\n} );\n\nfunction isArrayLike( obj ) {\n\n\t// Support: real iOS 8.2 only (not reproducible in simulator)\n\t// `in` check used to prevent JIT error (gh-2145)\n\t// hasOwn isn't used here due to false negatives\n\t// regarding Nodelist length in IE\n\tvar length = !!obj && \"length\" in obj && obj.length,\n\t\ttype = jQuery.type( obj );\n\n\tif ( type === \"function\" || jQuery.isWindow( obj ) ) {\n\t\treturn false;\n\t}\n\n\treturn type === \"array\" || length === 0 ||\n\t\ttypeof length === \"number\" && length > 0 && ( length - 1 ) in obj;\n}\nvar Sizzle =\n/*!\n * Sizzle CSS Selector Engine v2.3.3\n * https://sizzlejs.com/\n *\n * Copyright jQuery Foundation and other contributors\n * Released under the MIT license\n * http://jquery.org/license\n *\n * Date: 2016-08-08\n */\n(function( window ) {\n\nvar i,\n\tsupport,\n\tExpr,\n\tgetText,\n\tisXML,\n\ttokenize,\n\tcompile,\n\tselect,\n\toutermostContext,\n\tsortInput,\n\thasDuplicate,\n\n\t// Local document vars\n\tsetDocument,\n\tdocument,\n\tdocElem,\n\tdocumentIsHTML,\n\trbuggyQSA,\n\trbuggyMatches,\n\tmatches,\n\tcontains,\n\n\t// Instance-specific data\n\texpando = \"sizzle\" + 1 * new Date(),\n\tpreferredDoc = window.document,\n\tdirruns = 0,\n\tdone = 0,\n\tclassCache = createCache(),\n\ttokenCache = createCache(),\n\tcompilerCache = createCache(),\n\tsortOrder = function( a, b ) {\n\t\tif ( a === b ) {\n\t\t\thasDuplicate = true;\n\t\t}\n\t\treturn 0;\n\t},\n\n\t// Instance methods\n\thasOwn = ({}).hasOwnProperty,\n\tarr = [],\n\tpop = arr.pop,\n\tpush_native = arr.push,\n\tpush = arr.push,\n\tslice = arr.slice,\n\t// Use a stripped-down indexOf as it's faster than native\n\t// https://jsperf.com/thor-indexof-vs-for/5\n\tindexOf = function( list, elem ) {\n\t\tvar i = 0,\n\t\t\tlen = list.length;\n\t\tfor ( ; i < len; i++ ) {\n\t\t\tif ( list[i] === elem ) {\n\t\t\t\treturn i;\n\t\t\t}\n\t\t}\n\t\treturn -1;\n\t},\n\n\tbooleans = \"checked|selected|async|autofocus|autoplay|controls|defer|disabled|hidden|ismap|loop|multiple|open|readonly|required|scoped\",\n\n\t// Regular expressions\n\n\t// http://www.w3.org/TR/css3-selectors/#whitespace\n\twhitespace = \"[\\\\x20\\\\t\\\\r\\\\n\\\\f]\",\n\n\t// http://www.w3.org/TR/CSS21/syndata.html#value-def-identifier\n\tidentifier = \"(?:\\\\\\\\.|[\\\\w-]|[^\\0-\\\\xa0])+\",\n\n\t// Attribute selectors: http://www.w3.org/TR/selectors/#attribute-selectors\n\tattributes = \"\\\\[\" + whitespace + \"*(\" + identifier + \")(?:\" + whitespace +\n\t\t// Operator (capture 2)\n\t\t\"*([*^$|!~]?=)\" + whitespace +\n\t\t// \"Attribute values must be CSS identifiers [capture 5] or strings [capture 3 or capture 4]\"\n\t\t\"*(?:'((?:\\\\\\\\.|[^\\\\\\\\'])*)'|\\\"((?:\\\\\\\\.|[^\\\\\\\\\\\"])*)\\\"|(\" + identifier + \"))|)\" + whitespace +\n\t\t\"*\\\\]\",\n\n\tpseudos = \":(\" + identifier + \")(?:\\\\((\" +\n\t\t// To reduce the number of selectors needing tokenize in the preFilter, prefer arguments:\n\t\t// 1. quoted (capture 3; capture 4 or capture 5)\n\t\t\"('((?:\\\\\\\\.|[^\\\\\\\\'])*)'|\\\"((?:\\\\\\\\.|[^\\\\\\\\\\\"])*)\\\")|\" +\n\t\t// 2. simple (capture 6)\n\t\t\"((?:\\\\\\\\.|[^\\\\\\\\()[\\\\]]|\" + attributes + \")*)|\" +\n\t\t// 3. anything else (capture 2)\n\t\t\".*\" +\n\t\t\")\\\\)|)\",\n\n\t// Leading and non-escaped trailing whitespace, capturing some non-whitespace characters preceding the latter\n\trwhitespace = new RegExp( whitespace + \"+\", \"g\" ),\n\trtrim = new RegExp( \"^\" + whitespace + \"+|((?:^|[^\\\\\\\\])(?:\\\\\\\\.)*)\" + whitespace + \"+$\", \"g\" ),\n\n\trcomma = new RegExp( \"^\" + whitespace + \"*,\" + whitespace + \"*\" ),\n\trcombinators = new RegExp( \"^\" + whitespace + \"*([>+~]|\" + whitespace + \")\" + whitespace + \"*\" ),\n\n\trattributeQuotes = new RegExp( \"=\" + whitespace + \"*([^\\\\]'\\\"]*?)\" + whitespace + \"*\\\\]\", \"g\" ),\n\n\trpseudo = new RegExp( pseudos ),\n\tridentifier = new RegExp( \"^\" + identifier + \"$\" ),\n\n\tmatchExpr = {\n\t\t\"ID\": new RegExp( \"^#(\" + identifier + \")\" ),\n\t\t\"CLASS\": new RegExp( \"^\\\\.(\" + identifier + \")\" ),\n\t\t\"TAG\": new RegExp( \"^(\" + identifier + \"|[*])\" ),\n\t\t\"ATTR\": new RegExp( \"^\" + attributes ),\n\t\t\"PSEUDO\": new RegExp( \"^\" + pseudos ),\n\t\t\"CHILD\": new RegExp( \"^:(only|first|last|nth|nth-last)-(child|of-type)(?:\\\\(\" + whitespace +\n\t\t\t\"*(even|odd|(([+-]|)(\\\\d*)n|)\" + whitespace + \"*(?:([+-]|)\" + whitespace +\n\t\t\t\"*(\\\\d+)|))\" + whitespace + \"*\\\\)|)\", \"i\" ),\n\t\t\"bool\": new RegExp( \"^(?:\" + booleans + \")$\", \"i\" ),\n\t\t// For use in libraries implementing .is()\n\t\t// We use this for POS matching in `select`\n\t\t\"needsContext\": new RegExp( \"^\" + whitespace + \"*[>+~]|:(even|odd|eq|gt|lt|nth|first|last)(?:\\\\(\" +\n\t\t\twhitespace + \"*((?:-\\\\d)?\\\\d*)\" + whitespace + \"*\\\\)|)(?=[^-]|$)\", \"i\" )\n\t},\n\n\trinputs = /^(?:input|select|textarea|button)$/i,\n\trheader = /^h\\d$/i,\n\n\trnative = /^[^{]+\\{\\s*\\[native \\w/,\n\n\t// Easily-parseable/retrievable ID or TAG or CLASS selectors\n\trquickExpr = /^(?:#([\\w-]+)|(\\w+)|\\.([\\w-]+))$/,\n\n\trsibling = /[+~]/,\n\n\t// CSS escapes\n\t// http://www.w3.org/TR/CSS21/syndata.html#escaped-characters\n\trunescape = new RegExp( \"\\\\\\\\([\\\\da-f]{1,6}\" + whitespace + \"?|(\" + whitespace + \")|.)\", \"ig\" ),\n\tfunescape = function( _, escaped, escapedWhitespace ) {\n\t\tvar high = \"0x\" + escaped - 0x10000;\n\t\t// NaN means non-codepoint\n\t\t// Support: Firefox<24\n\t\t// Workaround erroneous numeric interpretation of +\"0x\"\n\t\treturn high !== high || escapedWhitespace ?\n\t\t\tescaped :\n\t\t\thigh < 0 ?\n\t\t\t\t// BMP codepoint\n\t\t\t\tString.fromCharCode( high + 0x10000 ) :\n\t\t\t\t// Supplemental Plane codepoint (surrogate pair)\n\t\t\t\tString.fromCharCode( high >> 10 | 0xD800, high & 0x3FF | 0xDC00 );\n\t},\n\n\t// CSS string/identifier serialization\n\t// https://drafts.csswg.org/cssom/#common-serializing-idioms\n\trcssescape = /([\\0-\\x1f\\x7f]|^-?\\d)|^-$|[^\\0-\\x1f\\x7f-\\uFFFF\\w-]/g,\n\tfcssescape = function( ch, asCodePoint ) {\n\t\tif ( asCodePoint ) {\n\n\t\t\t// U+0000 NULL becomes U+FFFD REPLACEMENT CHARACTER\n\t\t\tif ( ch === \"\\0\" ) {\n\t\t\t\treturn \"\\uFFFD\";\n\t\t\t}\n\n\t\t\t// Control characters and (dependent upon position) numbers get escaped as code points\n\t\t\treturn ch.slice( 0, -1 ) + \"\\\\\" + ch.charCodeAt( ch.length - 1 ).toString( 16 ) + \" \";\n\t\t}\n\n\t\t// Other potentially-special ASCII characters get backslash-escaped\n\t\treturn \"\\\\\" + ch;\n\t},\n\n\t// Used for iframes\n\t// See setDocument()\n\t// Removing the function wrapper causes a \"Permission Denied\"\n\t// error in IE\n\tunloadHandler = function() {\n\t\tsetDocument();\n\t},\n\n\tdisabledAncestor = addCombinator(\n\t\tfunction( elem ) {\n\t\t\treturn elem.disabled === true && (\"form\" in elem || \"label\" in elem);\n\t\t},\n\t\t{ dir: \"parentNode\", next: \"legend\" }\n\t);\n\n// Optimize for push.apply( _, NodeList )\ntry {\n\tpush.apply(\n\t\t(arr = slice.call( preferredDoc.childNodes )),\n\t\tpreferredDoc.childNodes\n\t);\n\t// Support: Android<4.0\n\t// Detect silently failing push.apply\n\tarr[ preferredDoc.childNodes.length ].nodeType;\n} catch ( e ) {\n\tpush = { apply: arr.length ?\n\n\t\t// Leverage slice if possible\n\t\tfunction( target, els ) {\n\t\t\tpush_native.apply( target, slice.call(els) );\n\t\t} :\n\n\t\t// Support: IE<9\n\t\t// Otherwise append directly\n\t\tfunction( target, els ) {\n\t\t\tvar j = target.length,\n\t\t\t\ti = 0;\n\t\t\t// Can't trust NodeList.length\n\t\t\twhile ( (target[j++] = els[i++]) ) {}\n\t\t\ttarget.length = j - 1;\n\t\t}\n\t};\n}\n\nfunction Sizzle( selector, context, results, seed ) {\n\tvar m, i, elem, nid, match, groups, newSelector,\n\t\tnewContext = context && context.ownerDocument,\n\n\t\t// nodeType defaults to 9, since context defaults to document\n\t\tnodeType = context ? context.nodeType : 9;\n\n\tresults = results || [];\n\n\t// Return early from calls with invalid selector or context\n\tif ( typeof selector !== \"string\" || !selector ||\n\t\tnodeType !== 1 && nodeType !== 9 && nodeType !== 11 ) {\n\n\t\treturn results;\n\t}\n\n\t// Try to shortcut find operations (as opposed to filters) in HTML documents\n\tif ( !seed ) {\n\n\t\tif ( ( context ? context.ownerDocument || context : preferredDoc ) !== document ) {\n\t\t\tsetDocument( context );\n\t\t}\n\t\tcontext = context || document;\n\n\t\tif ( documentIsHTML ) {\n\n\t\t\t// If the selector is sufficiently simple, try using a \"get*By*\" DOM method\n\t\t\t// (excepting DocumentFragment context, where the methods don't exist)\n\t\t\tif ( nodeType !== 11 && (match = rquickExpr.exec( selector )) ) {\n\n\t\t\t\t// ID selector\n\t\t\t\tif ( (m = match[1]) ) {\n\n\t\t\t\t\t// Document context\n\t\t\t\t\tif ( nodeType === 9 ) {\n\t\t\t\t\t\tif ( (elem = context.getElementById( m )) ) {\n\n\t\t\t\t\t\t\t// Support: IE, Opera, Webkit\n\t\t\t\t\t\t\t// TODO: identify versions\n\t\t\t\t\t\t\t// getElementById can match elements by name instead of ID\n\t\t\t\t\t\t\tif ( elem.id === m ) {\n\t\t\t\t\t\t\t\tresults.push( elem );\n\t\t\t\t\t\t\t\treturn results;\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\treturn results;\n\t\t\t\t\t\t}\n\n\t\t\t\t\t// Element context\n\t\t\t\t\t} else {\n\n\t\t\t\t\t\t// Support: IE, Opera, Webkit\n\t\t\t\t\t\t// TODO: identify versions\n\t\t\t\t\t\t// getElementById can match elements by name instead of ID\n\t\t\t\t\t\tif ( newContext && (elem = newContext.getElementById( m )) &&\n\t\t\t\t\t\t\tcontains( context, elem ) &&\n\t\t\t\t\t\t\telem.id === m ) {\n\n\t\t\t\t\t\t\tresults.push( elem );\n\t\t\t\t\t\t\treturn results;\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\n\t\t\t\t// Type selector\n\t\t\t\t} else if ( match[2] ) {\n\t\t\t\t\tpush.apply( results, context.getElementsByTagName( selector ) );\n\t\t\t\t\treturn results;\n\n\t\t\t\t// Class selector\n\t\t\t\t} else if ( (m = match[3]) && support.getElementsByClassName &&\n\t\t\t\t\tcontext.getElementsByClassName ) {\n\n\t\t\t\t\tpush.apply( results, context.getElementsByClassName( m ) );\n\t\t\t\t\treturn results;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t// Take advantage of querySelectorAll\n\t\t\tif ( support.qsa &&\n\t\t\t\t!compilerCache[ selector + \" \" ] &&\n\t\t\t\t(!rbuggyQSA || !rbuggyQSA.test( selector )) ) {\n\n\t\t\t\tif ( nodeType !== 1 ) {\n\t\t\t\t\tnewContext = context;\n\t\t\t\t\tnewSelector = selector;\n\n\t\t\t\t// qSA looks outside Element context, which is not what we want\n\t\t\t\t// Thanks to Andrew Dupont for this workaround technique\n\t\t\t\t// Support: IE <=8\n\t\t\t\t// Exclude object elements\n\t\t\t\t} else if ( context.nodeName.toLowerCase() !== \"object\" ) {\n\n\t\t\t\t\t// Capture the context ID, setting it first if necessary\n\t\t\t\t\tif ( (nid = context.getAttribute( \"id\" )) ) {\n\t\t\t\t\t\tnid = nid.replace( rcssescape, fcssescape );\n\t\t\t\t\t} else {\n\t\t\t\t\t\tcontext.setAttribute( \"id\", (nid = expando) );\n\t\t\t\t\t}\n\n\t\t\t\t\t// Prefix every selector in the list\n\t\t\t\t\tgroups = tokenize( selector );\n\t\t\t\t\ti = groups.length;\n\t\t\t\t\twhile ( i-- ) {\n\t\t\t\t\t\tgroups[i] = \"#\" + nid + \" \" + toSelector( groups[i] );\n\t\t\t\t\t}\n\t\t\t\t\tnewSelector = groups.join( \",\" );\n\n\t\t\t\t\t// Expand context for sibling selectors\n\t\t\t\t\tnewContext = rsibling.test( selector ) && testContext( context.parentNode ) ||\n\t\t\t\t\t\tcontext;\n\t\t\t\t}\n\n\t\t\t\tif ( newSelector ) {\n\t\t\t\t\ttry {\n\t\t\t\t\t\tpush.apply( results,\n\t\t\t\t\t\t\tnewContext.querySelectorAll( newSelector )\n\t\t\t\t\t\t);\n\t\t\t\t\t\treturn results;\n\t\t\t\t\t} catch ( qsaError ) {\n\t\t\t\t\t} finally {\n\t\t\t\t\t\tif ( nid === expando ) {\n\t\t\t\t\t\t\tcontext.removeAttribute( \"id\" );\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\n\t// All others\n\treturn select( selector.replace( rtrim, \"$1\" ), context, results, seed );\n}\n\n/**\n * Create key-value caches of limited size\n * @returns {function(string, object)} Returns the Object data after storing it on itself with\n *\tproperty name the (space-suffixed) string and (if the cache is larger than Expr.cacheLength)\n *\tdeleting the oldest entry\n */\nfunction createCache() {\n\tvar keys = [];\n\n\tfunction cache( key, value ) {\n\t\t// Use (key + \" \") to avoid collision with native prototype properties (see Issue #157)\n\t\tif ( keys.push( key + \" \" ) > Expr.cacheLength ) {\n\t\t\t// Only keep the most recent entries\n\t\t\tdelete cache[ keys.shift() ];\n\t\t}\n\t\treturn (cache[ key + \" \" ] = value);\n\t}\n\treturn cache;\n}\n\n/**\n * Mark a function for special use by Sizzle\n * @param {Function} fn The function to mark\n */\nfunction markFunction( fn ) {\n\tfn[ expando ] = true;\n\treturn fn;\n}\n\n/**\n * Support testing using an element\n * @param {Function} fn Passed the created element and returns a boolean result\n */\nfunction assert( fn ) {\n\tvar el = document.createElement(\"fieldset\");\n\n\ttry {\n\t\treturn !!fn( el );\n\t} catch (e) {\n\t\treturn false;\n\t} finally {\n\t\t// Remove from its parent by default\n\t\tif ( el.parentNode ) {\n\t\t\tel.parentNode.removeChild( el );\n\t\t}\n\t\t// release memory in IE\n\t\tel = null;\n\t}\n}\n\n/**\n * Adds the same handler for all of the specified attrs\n * @param {String} attrs Pipe-separated list of attributes\n * @param {Function} handler The method that will be applied\n */\nfunction addHandle( attrs, handler ) {\n\tvar arr = attrs.split(\"|\"),\n\t\ti = arr.length;\n\n\twhile ( i-- ) {\n\t\tExpr.attrHandle[ arr[i] ] = handler;\n\t}\n}\n\n/**\n * Checks document order of two siblings\n * @param {Element} a\n * @param {Element} b\n * @returns {Number} Returns less than 0 if a precedes b, greater than 0 if a follows b\n */\nfunction siblingCheck( a, b ) {\n\tvar cur = b && a,\n\t\tdiff = cur && a.nodeType === 1 && b.nodeType === 1 &&\n\t\t\ta.sourceIndex - b.sourceIndex;\n\n\t// Use IE sourceIndex if available on both nodes\n\tif ( diff ) {\n\t\treturn diff;\n\t}\n\n\t// Check if b follows a\n\tif ( cur ) {\n\t\twhile ( (cur = cur.nextSibling) ) {\n\t\t\tif ( cur === b ) {\n\t\t\t\treturn -1;\n\t\t\t}\n\t\t}\n\t}\n\n\treturn a ? 1 : -1;\n}\n\n/**\n * Returns a function to use in pseudos for input types\n * @param {String} type\n */\nfunction createInputPseudo( type ) {\n\treturn function( elem ) {\n\t\tvar name = elem.nodeName.toLowerCase();\n\t\treturn name === \"input\" && elem.type === type;\n\t};\n}\n\n/**\n * Returns a function to use in pseudos for buttons\n * @param {String} type\n */\nfunction createButtonPseudo( type ) {\n\treturn function( elem ) {\n\t\tvar name = elem.nodeName.toLowerCase();\n\t\treturn (name === \"input\" || name === \"button\") && elem.type === type;\n\t};\n}\n\n/**\n * Returns a function to use in pseudos for :enabled/:disabled\n * @param {Boolean} disabled true for :disabled; false for :enabled\n */\nfunction createDisabledPseudo( disabled ) {\n\n\t// Known :disabled false positives: fieldset[disabled] > legend:nth-of-type(n+2) :can-disable\n\treturn function( elem ) {\n\n\t\t// Only certain elements can match :enabled or :disabled\n\t\t// https://html.spec.whatwg.org/multipage/scripting.html#selector-enabled\n\t\t// https://html.spec.whatwg.org/multipage/scripting.html#selector-disabled\n\t\tif ( \"form\" in elem ) {\n\n\t\t\t// Check for inherited disabledness on relevant non-disabled elements:\n\t\t\t// * listed form-associated elements in a disabled fieldset\n\t\t\t//   https://html.spec.whatwg.org/multipage/forms.html#category-listed\n\t\t\t//   https://html.spec.whatwg.org/multipage/forms.html#concept-fe-disabled\n\t\t\t// * option elements in a disabled optgroup\n\t\t\t//   https://html.spec.whatwg.org/multipage/forms.html#concept-option-disabled\n\t\t\t// All such elements have a \"form\" property.\n\t\t\tif ( elem.parentNode && elem.disabled === false ) {\n\n\t\t\t\t// Option elements defer to a parent optgroup if present\n\t\t\t\tif ( \"label\" in elem ) {\n\t\t\t\t\tif ( \"label\" in elem.parentNode ) {\n\t\t\t\t\t\treturn elem.parentNode.disabled === disabled;\n\t\t\t\t\t} else {\n\t\t\t\t\t\treturn elem.disabled === disabled;\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\t// Support: IE 6 - 11\n\t\t\t\t// Use the isDisabled shortcut property to check for disabled fieldset ancestors\n\t\t\t\treturn elem.isDisabled === disabled ||\n\n\t\t\t\t\t// Where there is no isDisabled, check manually\n\t\t\t\t\t/* jshint -W018 */\n\t\t\t\t\telem.isDisabled !== !disabled &&\n\t\t\t\t\t\tdisabledAncestor( elem ) === disabled;\n\t\t\t}\n\n\t\t\treturn elem.disabled === disabled;\n\n\t\t// Try to winnow out elements that can't be disabled before trusting the disabled property.\n\t\t// Some victims get caught in our net (label, legend, menu, track), but it shouldn't\n\t\t// even exist on them, let alone have a boolean value.\n\t\t} else if ( \"label\" in elem ) {\n\t\t\treturn elem.disabled === disabled;\n\t\t}\n\n\t\t// Remaining elements are neither :enabled nor :disabled\n\t\treturn false;\n\t};\n}\n\n/**\n * Returns a function to use in pseudos for positionals\n * @param {Function} fn\n */\nfunction createPositionalPseudo( fn ) {\n\treturn markFunction(function( argument ) {\n\t\targument = +argument;\n\t\treturn markFunction(function( seed, matches ) {\n\t\t\tvar j,\n\t\t\t\tmatchIndexes = fn( [], seed.length, argument ),\n\t\t\t\ti = matchIndexes.length;\n\n\t\t\t// Match elements found at the specified indexes\n\t\t\twhile ( i-- ) {\n\t\t\t\tif ( seed[ (j = matchIndexes[i]) ] ) {\n\t\t\t\t\tseed[j] = !(matches[j] = seed[j]);\n\t\t\t\t}\n\t\t\t}\n\t\t});\n\t});\n}\n\n/**\n * Checks a node for validity as a Sizzle context\n * @param {Element|Object=} context\n * @returns {Element|Object|Boolean} The input node if acceptable, otherwise a falsy value\n */\nfunction testContext( context ) {\n\treturn context && typeof context.getElementsByTagName !== \"undefined\" && context;\n}\n\n// Expose support vars for convenience\nsupport = Sizzle.support = {};\n\n/**\n * Detects XML nodes\n * @param {Element|Object} elem An element or a document\n * @returns {Boolean} True iff elem is a non-HTML XML node\n */\nisXML = Sizzle.isXML = function( elem ) {\n\t// documentElement is verified for cases where it doesn't yet exist\n\t// (such as loading iframes in IE - #4833)\n\tvar documentElement = elem && (elem.ownerDocument || elem).documentElement;\n\treturn documentElement ? documentElement.nodeName !== \"HTML\" : false;\n};\n\n/**\n * Sets document-related variables once based on the current document\n * @param {Element|Object} [doc] An element or document object to use to set the document\n * @returns {Object} Returns the current document\n */\nsetDocument = Sizzle.setDocument = function( node ) {\n\tvar hasCompare, subWindow,\n\t\tdoc = node ? node.ownerDocument || node : preferredDoc;\n\n\t// Return early if doc is invalid or already selected\n\tif ( doc === document || doc.nodeType !== 9 || !doc.documentElement ) {\n\t\treturn document;\n\t}\n\n\t// Update global variables\n\tdocument = doc;\n\tdocElem = document.documentElement;\n\tdocumentIsHTML = !isXML( document );\n\n\t// Support: IE 9-11, Edge\n\t// Accessing iframe documents after unload throws \"permission denied\" errors (jQuery #13936)\n\tif ( preferredDoc !== document &&\n\t\t(subWindow = document.defaultView) && subWindow.top !== subWindow ) {\n\n\t\t// Support: IE 11, Edge\n\t\tif ( subWindow.addEventListener ) {\n\t\t\tsubWindow.addEventListener( \"unload\", unloadHandler, false );\n\n\t\t// Support: IE 9 - 10 only\n\t\t} else if ( subWindow.attachEvent ) {\n\t\t\tsubWindow.attachEvent( \"onunload\", unloadHandler );\n\t\t}\n\t}\n\n\t/* Attributes\n\t---------------------------------------------------------------------- */\n\n\t// Support: IE<8\n\t// Verify that getAttribute really returns attributes and not properties\n\t// (excepting IE8 booleans)\n\tsupport.attributes = assert(function( el ) {\n\t\tel.className = \"i\";\n\t\treturn !el.getAttribute(\"className\");\n\t});\n\n\t/* getElement(s)By*\n\t---------------------------------------------------------------------- */\n\n\t// Check if getElementsByTagName(\"*\") returns only elements\n\tsupport.getElementsByTagName = assert(function( el ) {\n\t\tel.appendChild( document.createComment(\"\") );\n\t\treturn !el.getElementsByTagName(\"*\").length;\n\t});\n\n\t// Support: IE<9\n\tsupport.getElementsByClassName = rnative.test( document.getElementsByClassName );\n\n\t// Support: IE<10\n\t// Check if getElementById returns elements by name\n\t// The broken getElementById methods don't pick up programmatically-set names,\n\t// so use a roundabout getElementsByName test\n\tsupport.getById = assert(function( el ) {\n\t\tdocElem.appendChild( el ).id = expando;\n\t\treturn !document.getElementsByName || !document.getElementsByName( expando ).length;\n\t});\n\n\t// ID filter and find\n\tif ( support.getById ) {\n\t\tExpr.filter[\"ID\"] = function( id ) {\n\t\t\tvar attrId = id.replace( runescape, funescape );\n\t\t\treturn function( elem ) {\n\t\t\t\treturn elem.getAttribute(\"id\") === attrId;\n\t\t\t};\n\t\t};\n\t\tExpr.find[\"ID\"] = function( id, context ) {\n\t\t\tif ( typeof context.getElementById !== \"undefined\" && documentIsHTML ) {\n\t\t\t\tvar elem = context.getElementById( id );\n\t\t\t\treturn elem ? [ elem ] : [];\n\t\t\t}\n\t\t};\n\t} else {\n\t\tExpr.filter[\"ID\"] =  function( id ) {\n\t\t\tvar attrId = id.replace( runescape, funescape );\n\t\t\treturn function( elem ) {\n\t\t\t\tvar node = typeof elem.getAttributeNode !== \"undefined\" &&\n\t\t\t\t\telem.getAttributeNode(\"id\");\n\t\t\t\treturn node && node.value === attrId;\n\t\t\t};\n\t\t};\n\n\t\t// Support: IE 6 - 7 only\n\t\t// getElementById is not reliable as a find shortcut\n\t\tExpr.find[\"ID\"] = function( id, context ) {\n\t\t\tif ( typeof context.getElementById !== \"undefined\" && documentIsHTML ) {\n\t\t\t\tvar node, i, elems,\n\t\t\t\t\telem = context.getElementById( id );\n\n\t\t\t\tif ( elem ) {\n\n\t\t\t\t\t// Verify the id attribute\n\t\t\t\t\tnode = elem.getAttributeNode(\"id\");\n\t\t\t\t\tif ( node && node.value === id ) {\n\t\t\t\t\t\treturn [ elem ];\n\t\t\t\t\t}\n\n\t\t\t\t\t// Fall back on getElementsByName\n\t\t\t\t\telems = context.getElementsByName( id );\n\t\t\t\t\ti = 0;\n\t\t\t\t\twhile ( (elem = elems[i++]) ) {\n\t\t\t\t\t\tnode = elem.getAttributeNode(\"id\");\n\t\t\t\t\t\tif ( node && node.value === id ) {\n\t\t\t\t\t\t\treturn [ elem ];\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\treturn [];\n\t\t\t}\n\t\t};\n\t}\n\n\t// Tag\n\tExpr.find[\"TAG\"] = support.getElementsByTagName ?\n\t\tfunction( tag, context ) {\n\t\t\tif ( typeof context.getElementsByTagName !== \"undefined\" ) {\n\t\t\t\treturn context.getElementsByTagName( tag );\n\n\t\t\t// DocumentFragment nodes don't have gEBTN\n\t\t\t} else if ( support.qsa ) {\n\t\t\t\treturn context.querySelectorAll( tag );\n\t\t\t}\n\t\t} :\n\n\t\tfunction( tag, context ) {\n\t\t\tvar elem,\n\t\t\t\ttmp = [],\n\t\t\t\ti = 0,\n\t\t\t\t// By happy coincidence, a (broken) gEBTN appears on DocumentFragment nodes too\n\t\t\t\tresults = context.getElementsByTagName( tag );\n\n\t\t\t// Filter out possible comments\n\t\t\tif ( tag === \"*\" ) {\n\t\t\t\twhile ( (elem = results[i++]) ) {\n\t\t\t\t\tif ( elem.nodeType === 1 ) {\n\t\t\t\t\t\ttmp.push( elem );\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\treturn tmp;\n\t\t\t}\n\t\t\treturn results;\n\t\t};\n\n\t// Class\n\tExpr.find[\"CLASS\"] = support.getElementsByClassName && function( className, context ) {\n\t\tif ( typeof context.getElementsByClassName !== \"undefined\" && documentIsHTML ) {\n\t\t\treturn context.getElementsByClassName( className );\n\t\t}\n\t};\n\n\t/* QSA/matchesSelector\n\t---------------------------------------------------------------------- */\n\n\t// QSA and matchesSelector support\n\n\t// matchesSelector(:active) reports false when true (IE9/Opera 11.5)\n\trbuggyMatches = [];\n\n\t// qSa(:focus) reports false when true (Chrome 21)\n\t// We allow this because of a bug in IE8/9 that throws an error\n\t// whenever `document.activeElement` is accessed on an iframe\n\t// So, we allow :focus to pass through QSA all the time to avoid the IE error\n\t// See https://bugs.jquery.com/ticket/13378\n\trbuggyQSA = [];\n\n\tif ( (support.qsa = rnative.test( document.querySelectorAll )) ) {\n\t\t// Build QSA regex\n\t\t// Regex strategy adopted from Diego Perini\n\t\tassert(function( el ) {\n\t\t\t// Select is set to empty string on purpose\n\t\t\t// This is to test IE's treatment of not explicitly\n\t\t\t// setting a boolean content attribute,\n\t\t\t// since its presence should be enough\n\t\t\t// https://bugs.jquery.com/ticket/12359\n\t\t\tdocElem.appendChild( el ).innerHTML = \"<a id='\" + expando + \"'></a>\" +\n\t\t\t\t\"<select id='\" + expando + \"-\\r\\\\' msallowcapture=''>\" +\n\t\t\t\t\"<option selected=''></option></select>\";\n\n\t\t\t// Support: IE8, Opera 11-12.16\n\t\t\t// Nothing should be selected when empty strings follow ^= or $= or *=\n\t\t\t// The test attribute must be unknown in Opera but \"safe\" for WinRT\n\t\t\t// https://msdn.microsoft.com/en-us/library/ie/hh465388.aspx#attribute_section\n\t\t\tif ( el.querySelectorAll(\"[msallowcapture^='']\").length ) {\n\t\t\t\trbuggyQSA.push( \"[*^$]=\" + whitespace + \"*(?:''|\\\"\\\")\" );\n\t\t\t}\n\n\t\t\t// Support: IE8\n\t\t\t// Boolean attributes and \"value\" are not treated correctly\n\t\t\tif ( !el.querySelectorAll(\"[selected]\").length ) {\n\t\t\t\trbuggyQSA.push( \"\\\\[\" + whitespace + \"*(?:value|\" + booleans + \")\" );\n\t\t\t}\n\n\t\t\t// Support: Chrome<29, Android<4.4, Safari<7.0+, iOS<7.0+, PhantomJS<1.9.8+\n\t\t\tif ( !el.querySelectorAll( \"[id~=\" + expando + \"-]\" ).length ) {\n\t\t\t\trbuggyQSA.push(\"~=\");\n\t\t\t}\n\n\t\t\t// Webkit/Opera - :checked should return selected option elements\n\t\t\t// http://www.w3.org/TR/2011/REC-css3-selectors-20110929/#checked\n\t\t\t// IE8 throws error here and will not see later tests\n\t\t\tif ( !el.querySelectorAll(\":checked\").length ) {\n\t\t\t\trbuggyQSA.push(\":checked\");\n\t\t\t}\n\n\t\t\t// Support: Safari 8+, iOS 8+\n\t\t\t// https://bugs.webkit.org/show_bug.cgi?id=136851\n\t\t\t// In-page `selector#id sibling-combinator selector` fails\n\t\t\tif ( !el.querySelectorAll( \"a#\" + expando + \"+*\" ).length ) {\n\t\t\t\trbuggyQSA.push(\".#.+[+~]\");\n\t\t\t}\n\t\t});\n\n\t\tassert(function( el ) {\n\t\t\tel.innerHTML = \"<a href='' disabled='disabled'></a>\" +\n\t\t\t\t\"<select disabled='disabled'><option/></select>\";\n\n\t\t\t// Support: Windows 8 Native Apps\n\t\t\t// The type and name attributes are restricted during .innerHTML assignment\n\t\t\tvar input = document.createElement(\"input\");\n\t\t\tinput.setAttribute( \"type\", \"hidden\" );\n\t\t\tel.appendChild( input ).setAttribute( \"name\", \"D\" );\n\n\t\t\t// Support: IE8\n\t\t\t// Enforce case-sensitivity of name attribute\n\t\t\tif ( el.querySelectorAll(\"[name=d]\").length ) {\n\t\t\t\trbuggyQSA.push( \"name\" + whitespace + \"*[*^$|!~]?=\" );\n\t\t\t}\n\n\t\t\t// FF 3.5 - :enabled/:disabled and hidden elements (hidden elements are still enabled)\n\t\t\t// IE8 throws error here and will not see later tests\n\t\t\tif ( el.querySelectorAll(\":enabled\").length !== 2 ) {\n\t\t\t\trbuggyQSA.push( \":enabled\", \":disabled\" );\n\t\t\t}\n\n\t\t\t// Support: IE9-11+\n\t\t\t// IE's :disabled selector does not pick up the children of disabled fieldsets\n\t\t\tdocElem.appendChild( el ).disabled = true;\n\t\t\tif ( el.querySelectorAll(\":disabled\").length !== 2 ) {\n\t\t\t\trbuggyQSA.push( \":enabled\", \":disabled\" );\n\t\t\t}\n\n\t\t\t// Opera 10-11 does not throw on post-comma invalid pseudos\n\t\t\tel.querySelectorAll(\"*,:x\");\n\t\t\trbuggyQSA.push(\",.*:\");\n\t\t});\n\t}\n\n\tif ( (support.matchesSelector = rnative.test( (matches = docElem.matches ||\n\t\tdocElem.webkitMatchesSelector ||\n\t\tdocElem.mozMatchesSelector ||\n\t\tdocElem.oMatchesSelector ||\n\t\tdocElem.msMatchesSelector) )) ) {\n\n\t\tassert(function( el ) {\n\t\t\t// Check to see if it's possible to do matchesSelector\n\t\t\t// on a disconnected node (IE 9)\n\t\t\tsupport.disconnectedMatch = matches.call( el, \"*\" );\n\n\t\t\t// This should fail with an exception\n\t\t\t// Gecko does not error, returns false instead\n\t\t\tmatches.call( el, \"[s!='']:x\" );\n\t\t\trbuggyMatches.push( \"!=\", pseudos );\n\t\t});\n\t}\n\n\trbuggyQSA = rbuggyQSA.length && new RegExp( rbuggyQSA.join(\"|\") );\n\trbuggyMatches = rbuggyMatches.length && new RegExp( rbuggyMatches.join(\"|\") );\n\n\t/* Contains\n\t---------------------------------------------------------------------- */\n\thasCompare = rnative.test( docElem.compareDocumentPosition );\n\n\t// Element contains another\n\t// Purposefully self-exclusive\n\t// As in, an element does not contain itself\n\tcontains = hasCompare || rnative.test( docElem.contains ) ?\n\t\tfunction( a, b ) {\n\t\t\tvar adown = a.nodeType === 9 ? a.documentElement : a,\n\t\t\t\tbup = b && b.parentNode;\n\t\t\treturn a === bup || !!( bup && bup.nodeType === 1 && (\n\t\t\t\tadown.contains ?\n\t\t\t\t\tadown.contains( bup ) :\n\t\t\t\t\ta.compareDocumentPosition && a.compareDocumentPosition( bup ) & 16\n\t\t\t));\n\t\t} :\n\t\tfunction( a, b ) {\n\t\t\tif ( b ) {\n\t\t\t\twhile ( (b = b.parentNode) ) {\n\t\t\t\t\tif ( b === a ) {\n\t\t\t\t\t\treturn true;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t\treturn false;\n\t\t};\n\n\t/* Sorting\n\t---------------------------------------------------------------------- */\n\n\t// Document order sorting\n\tsortOrder = hasCompare ?\n\tfunction( a, b ) {\n\n\t\t// Flag for duplicate removal\n\t\tif ( a === b ) {\n\t\t\thasDuplicate = true;\n\t\t\treturn 0;\n\t\t}\n\n\t\t// Sort on method existence if only one input has compareDocumentPosition\n\t\tvar compare = !a.compareDocumentPosition - !b.compareDocumentPosition;\n\t\tif ( compare ) {\n\t\t\treturn compare;\n\t\t}\n\n\t\t// Calculate position if both inputs belong to the same document\n\t\tcompare = ( a.ownerDocument || a ) === ( b.ownerDocument || b ) ?\n\t\t\ta.compareDocumentPosition( b ) :\n\n\t\t\t// Otherwise we know they are disconnected\n\t\t\t1;\n\n\t\t// Disconnected nodes\n\t\tif ( compare & 1 ||\n\t\t\t(!support.sortDetached && b.compareDocumentPosition( a ) === compare) ) {\n\n\t\t\t// Choose the first element that is related to our preferred document\n\t\t\tif ( a === document || a.ownerDocument === preferredDoc && contains(preferredDoc, a) ) {\n\t\t\t\treturn -1;\n\t\t\t}\n\t\t\tif ( b === document || b.ownerDocument === preferredDoc && contains(preferredDoc, b) ) {\n\t\t\t\treturn 1;\n\t\t\t}\n\n\t\t\t// Maintain original order\n\t\t\treturn sortInput ?\n\t\t\t\t( indexOf( sortInput, a ) - indexOf( sortInput, b ) ) :\n\t\t\t\t0;\n\t\t}\n\n\t\treturn compare & 4 ? -1 : 1;\n\t} :\n\tfunction( a, b ) {\n\t\t// Exit early if the nodes are identical\n\t\tif ( a === b ) {\n\t\t\thasDuplicate = true;\n\t\t\treturn 0;\n\t\t}\n\n\t\tvar cur,\n\t\t\ti = 0,\n\t\t\taup = a.parentNode,\n\t\t\tbup = b.parentNode,\n\t\t\tap = [ a ],\n\t\t\tbp = [ b ];\n\n\t\t// Parentless nodes are either documents or disconnected\n\t\tif ( !aup || !bup ) {\n\t\t\treturn a === document ? -1 :\n\t\t\t\tb === document ? 1 :\n\t\t\t\taup ? -1 :\n\t\t\t\tbup ? 1 :\n\t\t\t\tsortInput ?\n\t\t\t\t( indexOf( sortInput, a ) - indexOf( sortInput, b ) ) :\n\t\t\t\t0;\n\n\t\t// If the nodes are siblings, we can do a quick check\n\t\t} else if ( aup === bup ) {\n\t\t\treturn siblingCheck( a, b );\n\t\t}\n\n\t\t// Otherwise we need full lists of their ancestors for comparison\n\t\tcur = a;\n\t\twhile ( (cur = cur.parentNode) ) {\n\t\t\tap.unshift( cur );\n\t\t}\n\t\tcur = b;\n\t\twhile ( (cur = cur.parentNode) ) {\n\t\t\tbp.unshift( cur );\n\t\t}\n\n\t\t// Walk down the tree looking for a discrepancy\n\t\twhile ( ap[i] === bp[i] ) {\n\t\t\ti++;\n\t\t}\n\n\t\treturn i ?\n\t\t\t// Do a sibling check if the nodes have a common ancestor\n\t\t\tsiblingCheck( ap[i], bp[i] ) :\n\n\t\t\t// Otherwise nodes in our document sort first\n\t\t\tap[i] === preferredDoc ? -1 :\n\t\t\tbp[i] === preferredDoc ? 1 :\n\t\t\t0;\n\t};\n\n\treturn document;\n};\n\nSizzle.matches = function( expr, elements ) {\n\treturn Sizzle( expr, null, null, elements );\n};\n\nSizzle.matchesSelector = function( elem, expr ) {\n\t// Set document vars if needed\n\tif ( ( elem.ownerDocument || elem ) !== document ) {\n\t\tsetDocument( elem );\n\t}\n\n\t// Make sure that attribute selectors are quoted\n\texpr = expr.replace( rattributeQuotes, \"='$1']\" );\n\n\tif ( support.matchesSelector && documentIsHTML &&\n\t\t!compilerCache[ expr + \" \" ] &&\n\t\t( !rbuggyMatches || !rbuggyMatches.test( expr ) ) &&\n\t\t( !rbuggyQSA     || !rbuggyQSA.test( expr ) ) ) {\n\n\t\ttry {\n\t\t\tvar ret = matches.call( elem, expr );\n\n\t\t\t// IE 9's matchesSelector returns false on disconnected nodes\n\t\t\tif ( ret || support.disconnectedMatch ||\n\t\t\t\t\t// As well, disconnected nodes are said to be in a document\n\t\t\t\t\t// fragment in IE 9\n\t\t\t\t\telem.document && elem.document.nodeType !== 11 ) {\n\t\t\t\treturn ret;\n\t\t\t}\n\t\t} catch (e) {}\n\t}\n\n\treturn Sizzle( expr, document, null, [ elem ] ).length > 0;\n};\n\nSizzle.contains = function( context, elem ) {\n\t// Set document vars if needed\n\tif ( ( context.ownerDocument || context ) !== document ) {\n\t\tsetDocument( context );\n\t}\n\treturn contains( context, elem );\n};\n\nSizzle.attr = function( elem, name ) {\n\t// Set document vars if needed\n\tif ( ( elem.ownerDocument || elem ) !== document ) {\n\t\tsetDocument( elem );\n\t}\n\n\tvar fn = Expr.attrHandle[ name.toLowerCase() ],\n\t\t// Don't get fooled by Object.prototype properties (jQuery #13807)\n\t\tval = fn && hasOwn.call( Expr.attrHandle, name.toLowerCase() ) ?\n\t\t\tfn( elem, name, !documentIsHTML ) :\n\t\t\tundefined;\n\n\treturn val !== undefined ?\n\t\tval :\n\t\tsupport.attributes || !documentIsHTML ?\n\t\t\telem.getAttribute( name ) :\n\t\t\t(val = elem.getAttributeNode(name)) && val.specified ?\n\t\t\t\tval.value :\n\t\t\t\tnull;\n};\n\nSizzle.escape = function( sel ) {\n\treturn (sel + \"\").replace( rcssescape, fcssescape );\n};\n\nSizzle.error = function( msg ) {\n\tthrow new Error( \"Syntax error, unrecognized expression: \" + msg );\n};\n\n/**\n * Document sorting and removing duplicates\n * @param {ArrayLike} results\n */\nSizzle.uniqueSort = function( results ) {\n\tvar elem,\n\t\tduplicates = [],\n\t\tj = 0,\n\t\ti = 0;\n\n\t// Unless we *know* we can detect duplicates, assume their presence\n\thasDuplicate = !support.detectDuplicates;\n\tsortInput = !support.sortStable && results.slice( 0 );\n\tresults.sort( sortOrder );\n\n\tif ( hasDuplicate ) {\n\t\twhile ( (elem = results[i++]) ) {\n\t\t\tif ( elem === results[ i ] ) {\n\t\t\t\tj = duplicates.push( i );\n\t\t\t}\n\t\t}\n\t\twhile ( j-- ) {\n\t\t\tresults.splice( duplicates[ j ], 1 );\n\t\t}\n\t}\n\n\t// Clear input after sorting to release objects\n\t// See https://github.com/jquery/sizzle/pull/225\n\tsortInput = null;\n\n\treturn results;\n};\n\n/**\n * Utility function for retrieving the text value of an array of DOM nodes\n * @param {Array|Element} elem\n */\ngetText = Sizzle.getText = function( elem ) {\n\tvar node,\n\t\tret = \"\",\n\t\ti = 0,\n\t\tnodeType = elem.nodeType;\n\n\tif ( !nodeType ) {\n\t\t// If no nodeType, this is expected to be an array\n\t\twhile ( (node = elem[i++]) ) {\n\t\t\t// Do not traverse comment nodes\n\t\t\tret += getText( node );\n\t\t}\n\t} else if ( nodeType === 1 || nodeType === 9 || nodeType === 11 ) {\n\t\t// Use textContent for elements\n\t\t// innerText usage removed for consistency of new lines (jQuery #11153)\n\t\tif ( typeof elem.textContent === \"string\" ) {\n\t\t\treturn elem.textContent;\n\t\t} else {\n\t\t\t// Traverse its children\n\t\t\tfor ( elem = elem.firstChild; elem; elem = elem.nextSibling ) {\n\t\t\t\tret += getText( elem );\n\t\t\t}\n\t\t}\n\t} else if ( nodeType === 3 || nodeType === 4 ) {\n\t\treturn elem.nodeValue;\n\t}\n\t// Do not include comment or processing instruction nodes\n\n\treturn ret;\n};\n\nExpr = Sizzle.selectors = {\n\n\t// Can be adjusted by the user\n\tcacheLength: 50,\n\n\tcreatePseudo: markFunction,\n\n\tmatch: matchExpr,\n\n\tattrHandle: {},\n\n\tfind: {},\n\n\trelative: {\n\t\t\">\": { dir: \"parentNode\", first: true },\n\t\t\" \": { dir: \"parentNode\" },\n\t\t\"+\": { dir: \"previousSibling\", first: true },\n\t\t\"~\": { dir: \"previousSibling\" }\n\t},\n\n\tpreFilter: {\n\t\t\"ATTR\": function( match ) {\n\t\t\tmatch[1] = match[1].replace( runescape, funescape );\n\n\t\t\t// Move the given value to match[3] whether quoted or unquoted\n\t\t\tmatch[3] = ( match[3] || match[4] || match[5] || \"\" ).replace( runescape, funescape );\n\n\t\t\tif ( match[2] === \"~=\" ) {\n\t\t\t\tmatch[3] = \" \" + match[3] + \" \";\n\t\t\t}\n\n\t\t\treturn match.slice( 0, 4 );\n\t\t},\n\n\t\t\"CHILD\": function( match ) {\n\t\t\t/* matches from matchExpr[\"CHILD\"]\n\t\t\t\t1 type (only|nth|...)\n\t\t\t\t2 what (child|of-type)\n\t\t\t\t3 argument (even|odd|\\d*|\\d*n([+-]\\d+)?|...)\n\t\t\t\t4 xn-component of xn+y argument ([+-]?\\d*n|)\n\t\t\t\t5 sign of xn-component\n\t\t\t\t6 x of xn-component\n\t\t\t\t7 sign of y-component\n\t\t\t\t8 y of y-component\n\t\t\t*/\n\t\t\tmatch[1] = match[1].toLowerCase();\n\n\t\t\tif ( match[1].slice( 0, 3 ) === \"nth\" ) {\n\t\t\t\t// nth-* requires argument\n\t\t\t\tif ( !match[3] ) {\n\t\t\t\t\tSizzle.error( match[0] );\n\t\t\t\t}\n\n\t\t\t\t// numeric x and y parameters for Expr.filter.CHILD\n\t\t\t\t// remember that false/true cast respectively to 0/1\n\t\t\t\tmatch[4] = +( match[4] ? match[5] + (match[6] || 1) : 2 * ( match[3] === \"even\" || match[3] === \"odd\" ) );\n\t\t\t\tmatch[5] = +( ( match[7] + match[8] ) || match[3] === \"odd\" );\n\n\t\t\t// other types prohibit arguments\n\t\t\t} else if ( match[3] ) {\n\t\t\t\tSizzle.error( match[0] );\n\t\t\t}\n\n\t\t\treturn match;\n\t\t},\n\n\t\t\"PSEUDO\": function( match ) {\n\t\t\tvar excess,\n\t\t\t\tunquoted = !match[6] && match[2];\n\n\t\t\tif ( matchExpr[\"CHILD\"].test( match[0] ) ) {\n\t\t\t\treturn null;\n\t\t\t}\n\n\t\t\t// Accept quoted arguments as-is\n\t\t\tif ( match[3] ) {\n\t\t\t\tmatch[2] = match[4] || match[5] || \"\";\n\n\t\t\t// Strip excess characters from unquoted arguments\n\t\t\t} else if ( unquoted && rpseudo.test( unquoted ) &&\n\t\t\t\t// Get excess from tokenize (recursively)\n\t\t\t\t(excess = tokenize( unquoted, true )) &&\n\t\t\t\t// advance to the next closing parenthesis\n\t\t\t\t(excess = unquoted.indexOf( \")\", unquoted.length - excess ) - unquoted.length) ) {\n\n\t\t\t\t// excess is a negative index\n\t\t\t\tmatch[0] = match[0].slice( 0, excess );\n\t\t\t\tmatch[2] = unquoted.slice( 0, excess );\n\t\t\t}\n\n\t\t\t// Return only captures needed by the pseudo filter method (type and argument)\n\t\t\treturn match.slice( 0, 3 );\n\t\t}\n\t},\n\n\tfilter: {\n\n\t\t\"TAG\": function( nodeNameSelector ) {\n\t\t\tvar nodeName = nodeNameSelector.replace( runescape, funescape ).toLowerCase();\n\t\t\treturn nodeNameSelector === \"*\" ?\n\t\t\t\tfunction() { return true; } :\n\t\t\t\tfunction( elem ) {\n\t\t\t\t\treturn elem.nodeName && elem.nodeName.toLowerCase() === nodeName;\n\t\t\t\t};\n\t\t},\n\n\t\t\"CLASS\": function( className ) {\n\t\t\tvar pattern = classCache[ className + \" \" ];\n\n\t\t\treturn pattern ||\n\t\t\t\t(pattern = new RegExp( \"(^|\" + whitespace + \")\" + className + \"(\" + whitespace + \"|$)\" )) &&\n\t\t\t\tclassCache( className, function( elem ) {\n\t\t\t\t\treturn pattern.test( typeof elem.className === \"string\" && elem.className || typeof elem.getAttribute !== \"undefined\" && elem.getAttribute(\"class\") || \"\" );\n\t\t\t\t});\n\t\t},\n\n\t\t\"ATTR\": function( name, operator, check ) {\n\t\t\treturn function( elem ) {\n\t\t\t\tvar result = Sizzle.attr( elem, name );\n\n\t\t\t\tif ( result == null ) {\n\t\t\t\t\treturn operator === \"!=\";\n\t\t\t\t}\n\t\t\t\tif ( !operator ) {\n\t\t\t\t\treturn true;\n\t\t\t\t}\n\n\t\t\t\tresult += \"\";\n\n\t\t\t\treturn operator === \"=\" ? result === check :\n\t\t\t\t\toperator === \"!=\" ? result !== check :\n\t\t\t\t\toperator === \"^=\" ? check && result.indexOf( check ) === 0 :\n\t\t\t\t\toperator === \"*=\" ? check && result.indexOf( check ) > -1 :\n\t\t\t\t\toperator === \"$=\" ? check && result.slice( -check.length ) === check :\n\t\t\t\t\toperator === \"~=\" ? ( \" \" + result.replace( rwhitespace, \" \" ) + \" \" ).indexOf( check ) > -1 :\n\t\t\t\t\toperator === \"|=\" ? result === check || result.slice( 0, check.length + 1 ) === check + \"-\" :\n\t\t\t\t\tfalse;\n\t\t\t};\n\t\t},\n\n\t\t\"CHILD\": function( type, what, argument, first, last ) {\n\t\t\tvar simple = type.slice( 0, 3 ) !== \"nth\",\n\t\t\t\tforward = type.slice( -4 ) !== \"last\",\n\t\t\t\tofType = what === \"of-type\";\n\n\t\t\treturn first === 1 && last === 0 ?\n\n\t\t\t\t// Shortcut for :nth-*(n)\n\t\t\t\tfunction( elem ) {\n\t\t\t\t\treturn !!elem.parentNode;\n\t\t\t\t} :\n\n\t\t\t\tfunction( elem, context, xml ) {\n\t\t\t\t\tvar cache, uniqueCache, outerCache, node, nodeIndex, start,\n\t\t\t\t\t\tdir = simple !== forward ? \"nextSibling\" : \"previousSibling\",\n\t\t\t\t\t\tparent = elem.parentNode,\n\t\t\t\t\t\tname = ofType && elem.nodeName.toLowerCase(),\n\t\t\t\t\t\tuseCache = !xml && !ofType,\n\t\t\t\t\t\tdiff = false;\n\n\t\t\t\t\tif ( parent ) {\n\n\t\t\t\t\t\t// :(first|last|only)-(child|of-type)\n\t\t\t\t\t\tif ( simple ) {\n\t\t\t\t\t\t\twhile ( dir ) {\n\t\t\t\t\t\t\t\tnode = elem;\n\t\t\t\t\t\t\t\twhile ( (node = node[ dir ]) ) {\n\t\t\t\t\t\t\t\t\tif ( ofType ?\n\t\t\t\t\t\t\t\t\t\tnode.nodeName.toLowerCase() === name :\n\t\t\t\t\t\t\t\t\t\tnode.nodeType === 1 ) {\n\n\t\t\t\t\t\t\t\t\t\treturn false;\n\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t// Reverse direction for :only-* (if we haven't yet done so)\n\t\t\t\t\t\t\t\tstart = dir = type === \"only\" && !start && \"nextSibling\";\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\treturn true;\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tstart = [ forward ? parent.firstChild : parent.lastChild ];\n\n\t\t\t\t\t\t// non-xml :nth-child(...) stores cache data on `parent`\n\t\t\t\t\t\tif ( forward && useCache ) {\n\n\t\t\t\t\t\t\t// Seek `elem` from a previously-cached index\n\n\t\t\t\t\t\t\t// ...in a gzip-friendly way\n\t\t\t\t\t\t\tnode = parent;\n\t\t\t\t\t\t\touterCache = node[ expando ] || (node[ expando ] = {});\n\n\t\t\t\t\t\t\t// Support: IE <9 only\n\t\t\t\t\t\t\t// Defend against cloned attroperties (jQuery gh-1709)\n\t\t\t\t\t\t\tuniqueCache = outerCache[ node.uniqueID ] ||\n\t\t\t\t\t\t\t\t(outerCache[ node.uniqueID ] = {});\n\n\t\t\t\t\t\t\tcache = uniqueCache[ type ] || [];\n\t\t\t\t\t\t\tnodeIndex = cache[ 0 ] === dirruns && cache[ 1 ];\n\t\t\t\t\t\t\tdiff = nodeIndex && cache[ 2 ];\n\t\t\t\t\t\t\tnode = nodeIndex && parent.childNodes[ nodeIndex ];\n\n\t\t\t\t\t\t\twhile ( (node = ++nodeIndex && node && node[ dir ] ||\n\n\t\t\t\t\t\t\t\t// Fallback to seeking `elem` from the start\n\t\t\t\t\t\t\t\t(diff = nodeIndex = 0) || start.pop()) ) {\n\n\t\t\t\t\t\t\t\t// When found, cache indexes on `parent` and break\n\t\t\t\t\t\t\t\tif ( node.nodeType === 1 && ++diff && node === elem ) {\n\t\t\t\t\t\t\t\t\tuniqueCache[ type ] = [ dirruns, nodeIndex, diff ];\n\t\t\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\t// Use previously-cached element index if available\n\t\t\t\t\t\t\tif ( useCache ) {\n\t\t\t\t\t\t\t\t// ...in a gzip-friendly way\n\t\t\t\t\t\t\t\tnode = elem;\n\t\t\t\t\t\t\t\touterCache = node[ expando ] || (node[ expando ] = {});\n\n\t\t\t\t\t\t\t\t// Support: IE <9 only\n\t\t\t\t\t\t\t\t// Defend against cloned attroperties (jQuery gh-1709)\n\t\t\t\t\t\t\t\tuniqueCache = outerCache[ node.uniqueID ] ||\n\t\t\t\t\t\t\t\t\t(outerCache[ node.uniqueID ] = {});\n\n\t\t\t\t\t\t\t\tcache = uniqueCache[ type ] || [];\n\t\t\t\t\t\t\t\tnodeIndex = cache[ 0 ] === dirruns && cache[ 1 ];\n\t\t\t\t\t\t\t\tdiff = nodeIndex;\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t// xml :nth-child(...)\n\t\t\t\t\t\t\t// or :nth-last-child(...) or :nth(-last)?-of-type(...)\n\t\t\t\t\t\t\tif ( diff === false ) {\n\t\t\t\t\t\t\t\t// Use the same loop as above to seek `elem` from the start\n\t\t\t\t\t\t\t\twhile ( (node = ++nodeIndex && node && node[ dir ] ||\n\t\t\t\t\t\t\t\t\t(diff = nodeIndex = 0) || start.pop()) ) {\n\n\t\t\t\t\t\t\t\t\tif ( ( ofType ?\n\t\t\t\t\t\t\t\t\t\tnode.nodeName.toLowerCase() === name :\n\t\t\t\t\t\t\t\t\t\tnode.nodeType === 1 ) &&\n\t\t\t\t\t\t\t\t\t\t++diff ) {\n\n\t\t\t\t\t\t\t\t\t\t// Cache the index of each encountered element\n\t\t\t\t\t\t\t\t\t\tif ( useCache ) {\n\t\t\t\t\t\t\t\t\t\t\touterCache = node[ expando ] || (node[ expando ] = {});\n\n\t\t\t\t\t\t\t\t\t\t\t// Support: IE <9 only\n\t\t\t\t\t\t\t\t\t\t\t// Defend against cloned attroperties (jQuery gh-1709)\n\t\t\t\t\t\t\t\t\t\t\tuniqueCache = outerCache[ node.uniqueID ] ||\n\t\t\t\t\t\t\t\t\t\t\t\t(outerCache[ node.uniqueID ] = {});\n\n\t\t\t\t\t\t\t\t\t\t\tuniqueCache[ type ] = [ dirruns, diff ];\n\t\t\t\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t\t\t\tif ( node === elem ) {\n\t\t\t\t\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\t// Incorporate the offset, then check against cycle size\n\t\t\t\t\t\tdiff -= last;\n\t\t\t\t\t\treturn diff === first || ( diff % first === 0 && diff / first >= 0 );\n\t\t\t\t\t}\n\t\t\t\t};\n\t\t},\n\n\t\t\"PSEUDO\": function( pseudo, argument ) {\n\t\t\t// pseudo-class names are case-insensitive\n\t\t\t// http://www.w3.org/TR/selectors/#pseudo-classes\n\t\t\t// Prioritize by case sensitivity in case custom pseudos are added with uppercase letters\n\t\t\t// Remember that setFilters inherits from pseudos\n\t\t\tvar args,\n\t\t\t\tfn = Expr.pseudos[ pseudo ] || Expr.setFilters[ pseudo.toLowerCase() ] ||\n\t\t\t\t\tSizzle.error( \"unsupported pseudo: \" + pseudo );\n\n\t\t\t// The user may use createPseudo to indicate that\n\t\t\t// arguments are needed to create the filter function\n\t\t\t// just as Sizzle does\n\t\t\tif ( fn[ expando ] ) {\n\t\t\t\treturn fn( argument );\n\t\t\t}\n\n\t\t\t// But maintain support for old signatures\n\t\t\tif ( fn.length > 1 ) {\n\t\t\t\targs = [ pseudo, pseudo, \"\", argument ];\n\t\t\t\treturn Expr.setFilters.hasOwnProperty( pseudo.toLowerCase() ) ?\n\t\t\t\t\tmarkFunction(function( seed, matches ) {\n\t\t\t\t\t\tvar idx,\n\t\t\t\t\t\t\tmatched = fn( seed, argument ),\n\t\t\t\t\t\t\ti = matched.length;\n\t\t\t\t\t\twhile ( i-- ) {\n\t\t\t\t\t\t\tidx = indexOf( seed, matched[i] );\n\t\t\t\t\t\t\tseed[ idx ] = !( matches[ idx ] = matched[i] );\n\t\t\t\t\t\t}\n\t\t\t\t\t}) :\n\t\t\t\t\tfunction( elem ) {\n\t\t\t\t\t\treturn fn( elem, 0, args );\n\t\t\t\t\t};\n\t\t\t}\n\n\t\t\treturn fn;\n\t\t}\n\t},\n\n\tpseudos: {\n\t\t// Potentially complex pseudos\n\t\t\"not\": markFunction(function( selector ) {\n\t\t\t// Trim the selector passed to compile\n\t\t\t// to avoid treating leading and trailing\n\t\t\t// spaces as combinators\n\t\t\tvar input = [],\n\t\t\t\tresults = [],\n\t\t\t\tmatcher = compile( selector.replace( rtrim, \"$1\" ) );\n\n\t\t\treturn matcher[ expando ] ?\n\t\t\t\tmarkFunction(function( seed, matches, context, xml ) {\n\t\t\t\t\tvar elem,\n\t\t\t\t\t\tunmatched = matcher( seed, null, xml, [] ),\n\t\t\t\t\t\ti = seed.length;\n\n\t\t\t\t\t// Match elements unmatched by `matcher`\n\t\t\t\t\twhile ( i-- ) {\n\t\t\t\t\t\tif ( (elem = unmatched[i]) ) {\n\t\t\t\t\t\t\tseed[i] = !(matches[i] = elem);\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}) :\n\t\t\t\tfunction( elem, context, xml ) {\n\t\t\t\t\tinput[0] = elem;\n\t\t\t\t\tmatcher( input, null, xml, results );\n\t\t\t\t\t// Don't keep the element (issue #299)\n\t\t\t\t\tinput[0] = null;\n\t\t\t\t\treturn !results.pop();\n\t\t\t\t};\n\t\t}),\n\n\t\t\"has\": markFunction(function( selector ) {\n\t\t\treturn function( elem ) {\n\t\t\t\treturn Sizzle( selector, elem ).length > 0;\n\t\t\t};\n\t\t}),\n\n\t\t\"contains\": markFunction(function( text ) {\n\t\t\ttext = text.replace( runescape, funescape );\n\t\t\treturn function( elem ) {\n\t\t\t\treturn ( elem.textContent || elem.innerText || getText( elem ) ).indexOf( text ) > -1;\n\t\t\t};\n\t\t}),\n\n\t\t// \"Whether an element is represented by a :lang() selector\n\t\t// is based solely on the element's language value\n\t\t// being equal to the identifier C,\n\t\t// or beginning with the identifier C immediately followed by \"-\".\n\t\t// The matching of C against the element's language value is performed case-insensitively.\n\t\t// The identifier C does not have to be a valid language name.\"\n\t\t// http://www.w3.org/TR/selectors/#lang-pseudo\n\t\t\"lang\": markFunction( function( lang ) {\n\t\t\t// lang value must be a valid identifier\n\t\t\tif ( !ridentifier.test(lang || \"\") ) {\n\t\t\t\tSizzle.error( \"unsupported lang: \" + lang );\n\t\t\t}\n\t\t\tlang = lang.replace( runescape, funescape ).toLowerCase();\n\t\t\treturn function( elem ) {\n\t\t\t\tvar elemLang;\n\t\t\t\tdo {\n\t\t\t\t\tif ( (elemLang = documentIsHTML ?\n\t\t\t\t\t\telem.lang :\n\t\t\t\t\t\telem.getAttribute(\"xml:lang\") || elem.getAttribute(\"lang\")) ) {\n\n\t\t\t\t\t\telemLang = elemLang.toLowerCase();\n\t\t\t\t\t\treturn elemLang === lang || elemLang.indexOf( lang + \"-\" ) === 0;\n\t\t\t\t\t}\n\t\t\t\t} while ( (elem = elem.parentNode) && elem.nodeType === 1 );\n\t\t\t\treturn false;\n\t\t\t};\n\t\t}),\n\n\t\t// Miscellaneous\n\t\t\"target\": function( elem ) {\n\t\t\tvar hash = window.location && window.location.hash;\n\t\t\treturn hash && hash.slice( 1 ) === elem.id;\n\t\t},\n\n\t\t\"root\": function( elem ) {\n\t\t\treturn elem === docElem;\n\t\t},\n\n\t\t\"focus\": function( elem ) {\n\t\t\treturn elem === document.activeElement && (!document.hasFocus || document.hasFocus()) && !!(elem.type || elem.href || ~elem.tabIndex);\n\t\t},\n\n\t\t// Boolean properties\n\t\t\"enabled\": createDisabledPseudo( false ),\n\t\t\"disabled\": createDisabledPseudo( true ),\n\n\t\t\"checked\": function( elem ) {\n\t\t\t// In CSS3, :checked should return both checked and selected elements\n\t\t\t// http://www.w3.org/TR/2011/REC-css3-selectors-20110929/#checked\n\t\t\tvar nodeName = elem.nodeName.toLowerCase();\n\t\t\treturn (nodeName === \"input\" && !!elem.checked) || (nodeName === \"option\" && !!elem.selected);\n\t\t},\n\n\t\t\"selected\": function( elem ) {\n\t\t\t// Accessing this property makes selected-by-default\n\t\t\t// options in Safari work properly\n\t\t\tif ( elem.parentNode ) {\n\t\t\t\telem.parentNode.selectedIndex;\n\t\t\t}\n\n\t\t\treturn elem.selected === true;\n\t\t},\n\n\t\t// Contents\n\t\t\"empty\": function( elem ) {\n\t\t\t// http://www.w3.org/TR/selectors/#empty-pseudo\n\t\t\t// :empty is negated by element (1) or content nodes (text: 3; cdata: 4; entity ref: 5),\n\t\t\t//   but not by others (comment: 8; processing instruction: 7; etc.)\n\t\t\t// nodeType < 6 works because attributes (2) do not appear as children\n\t\t\tfor ( elem = elem.firstChild; elem; elem = elem.nextSibling ) {\n\t\t\t\tif ( elem.nodeType < 6 ) {\n\t\t\t\t\treturn false;\n\t\t\t\t}\n\t\t\t}\n\t\t\treturn true;\n\t\t},\n\n\t\t\"parent\": function( elem ) {\n\t\t\treturn !Expr.pseudos[\"empty\"]( elem );\n\t\t},\n\n\t\t// Element/input types\n\t\t\"header\": function( elem ) {\n\t\t\treturn rheader.test( elem.nodeName );\n\t\t},\n\n\t\t\"input\": function( elem ) {\n\t\t\treturn rinputs.test( elem.nodeName );\n\t\t},\n\n\t\t\"button\": function( elem ) {\n\t\t\tvar name = elem.nodeName.toLowerCase();\n\t\t\treturn name === \"input\" && elem.type === \"button\" || name === \"button\";\n\t\t},\n\n\t\t\"text\": function( elem ) {\n\t\t\tvar attr;\n\t\t\treturn elem.nodeName.toLowerCase() === \"input\" &&\n\t\t\t\telem.type === \"text\" &&\n\n\t\t\t\t// Support: IE<8\n\t\t\t\t// New HTML5 attribute values (e.g., \"search\") appear with elem.type === \"text\"\n\t\t\t\t( (attr = elem.getAttribute(\"type\")) == null || attr.toLowerCase() === \"text\" );\n\t\t},\n\n\t\t// Position-in-collection\n\t\t\"first\": createPositionalPseudo(function() {\n\t\t\treturn [ 0 ];\n\t\t}),\n\n\t\t\"last\": createPositionalPseudo(function( matchIndexes, length ) {\n\t\t\treturn [ length - 1 ];\n\t\t}),\n\n\t\t\"eq\": createPositionalPseudo(function( matchIndexes, length, argument ) {\n\t\t\treturn [ argument < 0 ? argument + length : argument ];\n\t\t}),\n\n\t\t\"even\": createPositionalPseudo(function( matchIndexes, length ) {\n\t\t\tvar i = 0;\n\t\t\tfor ( ; i < length; i += 2 ) {\n\t\t\t\tmatchIndexes.push( i );\n\t\t\t}\n\t\t\treturn matchIndexes;\n\t\t}),\n\n\t\t\"odd\": createPositionalPseudo(function( matchIndexes, length ) {\n\t\t\tvar i = 1;\n\t\t\tfor ( ; i < length; i += 2 ) {\n\t\t\t\tmatchIndexes.push( i );\n\t\t\t}\n\t\t\treturn matchIndexes;\n\t\t}),\n\n\t\t\"lt\": createPositionalPseudo(function( matchIndexes, length, argument ) {\n\t\t\tvar i = argument < 0 ? argument + length : argument;\n\t\t\tfor ( ; --i >= 0; ) {\n\t\t\t\tmatchIndexes.push( i );\n\t\t\t}\n\t\t\treturn matchIndexes;\n\t\t}),\n\n\t\t\"gt\": createPositionalPseudo(function( matchIndexes, length, argument ) {\n\t\t\tvar i = argument < 0 ? argument + length : argument;\n\t\t\tfor ( ; ++i < length; ) {\n\t\t\t\tmatchIndexes.push( i );\n\t\t\t}\n\t\t\treturn matchIndexes;\n\t\t})\n\t}\n};\n\nExpr.pseudos[\"nth\"] = Expr.pseudos[\"eq\"];\n\n// Add button/input type pseudos\nfor ( i in { radio: true, checkbox: true, file: true, password: true, image: true } ) {\n\tExpr.pseudos[ i ] = createInputPseudo( i );\n}\nfor ( i in { submit: true, reset: true } ) {\n\tExpr.pseudos[ i ] = createButtonPseudo( i );\n}\n\n// Easy API for creating new setFilters\nfunction setFilters() {}\nsetFilters.prototype = Expr.filters = Expr.pseudos;\nExpr.setFilters = new setFilters();\n\ntokenize = Sizzle.tokenize = function( selector, parseOnly ) {\n\tvar matched, match, tokens, type,\n\t\tsoFar, groups, preFilters,\n\t\tcached = tokenCache[ selector + \" \" ];\n\n\tif ( cached ) {\n\t\treturn parseOnly ? 0 : cached.slice( 0 );\n\t}\n\n\tsoFar = selector;\n\tgroups = [];\n\tpreFilters = Expr.preFilter;\n\n\twhile ( soFar ) {\n\n\t\t// Comma and first run\n\t\tif ( !matched || (match = rcomma.exec( soFar )) ) {\n\t\t\tif ( match ) {\n\t\t\t\t// Don't consume trailing commas as valid\n\t\t\t\tsoFar = soFar.slice( match[0].length ) || soFar;\n\t\t\t}\n\t\t\tgroups.push( (tokens = []) );\n\t\t}\n\n\t\tmatched = false;\n\n\t\t// Combinators\n\t\tif ( (match = rcombinators.exec( soFar )) ) {\n\t\t\tmatched = match.shift();\n\t\t\ttokens.push({\n\t\t\t\tvalue: matched,\n\t\t\t\t// Cast descendant combinators to space\n\t\t\t\ttype: match[0].replace( rtrim, \" \" )\n\t\t\t});\n\t\t\tsoFar = soFar.slice( matched.length );\n\t\t}\n\n\t\t// Filters\n\t\tfor ( type in Expr.filter ) {\n\t\t\tif ( (match = matchExpr[ type ].exec( soFar )) && (!preFilters[ type ] ||\n\t\t\t\t(match = preFilters[ type ]( match ))) ) {\n\t\t\t\tmatched = match.shift();\n\t\t\t\ttokens.push({\n\t\t\t\t\tvalue: matched,\n\t\t\t\t\ttype: type,\n\t\t\t\t\tmatches: match\n\t\t\t\t});\n\t\t\t\tsoFar = soFar.slice( matched.length );\n\t\t\t}\n\t\t}\n\n\t\tif ( !matched ) {\n\t\t\tbreak;\n\t\t}\n\t}\n\n\t// Return the length of the invalid excess\n\t// if we're just parsing\n\t// Otherwise, throw an error or return tokens\n\treturn parseOnly ?\n\t\tsoFar.length :\n\t\tsoFar ?\n\t\t\tSizzle.error( selector ) :\n\t\t\t// Cache the tokens\n\t\t\ttokenCache( selector, groups ).slice( 0 );\n};\n\nfunction toSelector( tokens ) {\n\tvar i = 0,\n\t\tlen = tokens.length,\n\t\tselector = \"\";\n\tfor ( ; i < len; i++ ) {\n\t\tselector += tokens[i].value;\n\t}\n\treturn selector;\n}\n\nfunction addCombinator( matcher, combinator, base ) {\n\tvar dir = combinator.dir,\n\t\tskip = combinator.next,\n\t\tkey = skip || dir,\n\t\tcheckNonElements = base && key === \"parentNode\",\n\t\tdoneName = done++;\n\n\treturn combinator.first ?\n\t\t// Check against closest ancestor/preceding element\n\t\tfunction( elem, context, xml ) {\n\t\t\twhile ( (elem = elem[ dir ]) ) {\n\t\t\t\tif ( elem.nodeType === 1 || checkNonElements ) {\n\t\t\t\t\treturn matcher( elem, context, xml );\n\t\t\t\t}\n\t\t\t}\n\t\t\treturn false;\n\t\t} :\n\n\t\t// Check against all ancestor/preceding elements\n\t\tfunction( elem, context, xml ) {\n\t\t\tvar oldCache, uniqueCache, outerCache,\n\t\t\t\tnewCache = [ dirruns, doneName ];\n\n\t\t\t// We can't set arbitrary data on XML nodes, so they don't benefit from combinator caching\n\t\t\tif ( xml ) {\n\t\t\t\twhile ( (elem = elem[ dir ]) ) {\n\t\t\t\t\tif ( elem.nodeType === 1 || checkNonElements ) {\n\t\t\t\t\t\tif ( matcher( elem, context, xml ) ) {\n\t\t\t\t\t\t\treturn true;\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\twhile ( (elem = elem[ dir ]) ) {\n\t\t\t\t\tif ( elem.nodeType === 1 || checkNonElements ) {\n\t\t\t\t\t\touterCache = elem[ expando ] || (elem[ expando ] = {});\n\n\t\t\t\t\t\t// Support: IE <9 only\n\t\t\t\t\t\t// Defend against cloned attroperties (jQuery gh-1709)\n\t\t\t\t\t\tuniqueCache = outerCache[ elem.uniqueID ] || (outerCache[ elem.uniqueID ] = {});\n\n\t\t\t\t\t\tif ( skip && skip === elem.nodeName.toLowerCase() ) {\n\t\t\t\t\t\t\telem = elem[ dir ] || elem;\n\t\t\t\t\t\t} else if ( (oldCache = uniqueCache[ key ]) &&\n\t\t\t\t\t\t\toldCache[ 0 ] === dirruns && oldCache[ 1 ] === doneName ) {\n\n\t\t\t\t\t\t\t// Assign to newCache so results back-propagate to previous elements\n\t\t\t\t\t\t\treturn (newCache[ 2 ] = oldCache[ 2 ]);\n\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\t// Reuse newcache so results back-propagate to previous elements\n\t\t\t\t\t\t\tuniqueCache[ key ] = newCache;\n\n\t\t\t\t\t\t\t// A match means we're done; a fail means we have to keep checking\n\t\t\t\t\t\t\tif ( (newCache[ 2 ] = matcher( elem, context, xml )) ) {\n\t\t\t\t\t\t\t\treturn true;\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t\treturn false;\n\t\t};\n}\n\nfunction elementMatcher( matchers ) {\n\treturn matchers.length > 1 ?\n\t\tfunction( elem, context, xml ) {\n\t\t\tvar i = matchers.length;\n\t\t\twhile ( i-- ) {\n\t\t\t\tif ( !matchers[i]( elem, context, xml ) ) {\n\t\t\t\t\treturn false;\n\t\t\t\t}\n\t\t\t}\n\t\t\treturn true;\n\t\t} :\n\t\tmatchers[0];\n}\n\nfunction multipleContexts( selector, contexts, results ) {\n\tvar i = 0,\n\t\tlen = contexts.length;\n\tfor ( ; i < len; i++ ) {\n\t\tSizzle( selector, contexts[i], results );\n\t}\n\treturn results;\n}\n\nfunction condense( unmatched, map, filter, context, xml ) {\n\tvar elem,\n\t\tnewUnmatched = [],\n\t\ti = 0,\n\t\tlen = unmatched.length,\n\t\tmapped = map != null;\n\n\tfor ( ; i < len; i++ ) {\n\t\tif ( (elem = unmatched[i]) ) {\n\t\t\tif ( !filter || filter( elem, context, xml ) ) {\n\t\t\t\tnewUnmatched.push( elem );\n\t\t\t\tif ( mapped ) {\n\t\t\t\t\tmap.push( i );\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\n\treturn newUnmatched;\n}\n\nfunction setMatcher( preFilter, selector, matcher, postFilter, postFinder, postSelector ) {\n\tif ( postFilter && !postFilter[ expando ] ) {\n\t\tpostFilter = setMatcher( postFilter );\n\t}\n\tif ( postFinder && !postFinder[ expando ] ) {\n\t\tpostFinder = setMatcher( postFinder, postSelector );\n\t}\n\treturn markFunction(function( seed, results, context, xml ) {\n\t\tvar temp, i, elem,\n\t\t\tpreMap = [],\n\t\t\tpostMap = [],\n\t\t\tpreexisting = results.length,\n\n\t\t\t// Get initial elements from seed or context\n\t\t\telems = seed || multipleContexts( selector || \"*\", context.nodeType ? [ context ] : context, [] ),\n\n\t\t\t// Prefilter to get matcher input, preserving a map for seed-results synchronization\n\t\t\tmatcherIn = preFilter && ( seed || !selector ) ?\n\t\t\t\tcondense( elems, preMap, preFilter, context, xml ) :\n\t\t\t\telems,\n\n\t\t\tmatcherOut = matcher ?\n\t\t\t\t// If we have a postFinder, or filtered seed, or non-seed postFilter or preexisting results,\n\t\t\t\tpostFinder || ( seed ? preFilter : preexisting || postFilter ) ?\n\n\t\t\t\t\t// ...intermediate processing is necessary\n\t\t\t\t\t[] :\n\n\t\t\t\t\t// ...otherwise use results directly\n\t\t\t\t\tresults :\n\t\t\t\tmatcherIn;\n\n\t\t// Find primary matches\n\t\tif ( matcher ) {\n\t\t\tmatcher( matcherIn, matcherOut, context, xml );\n\t\t}\n\n\t\t// Apply postFilter\n\t\tif ( postFilter ) {\n\t\t\ttemp = condense( matcherOut, postMap );\n\t\t\tpostFilter( temp, [], context, xml );\n\n\t\t\t// Un-match failing elements by moving them back to matcherIn\n\t\t\ti = temp.length;\n\t\t\twhile ( i-- ) {\n\t\t\t\tif ( (elem = temp[i]) ) {\n\t\t\t\t\tmatcherOut[ postMap[i] ] = !(matcherIn[ postMap[i] ] = elem);\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\tif ( seed ) {\n\t\t\tif ( postFinder || preFilter ) {\n\t\t\t\tif ( postFinder ) {\n\t\t\t\t\t// Get the final matcherOut by condensing this intermediate into postFinder contexts\n\t\t\t\t\ttemp = [];\n\t\t\t\t\ti = matcherOut.length;\n\t\t\t\t\twhile ( i-- ) {\n\t\t\t\t\t\tif ( (elem = matcherOut[i]) ) {\n\t\t\t\t\t\t\t// Restore matcherIn since elem is not yet a final match\n\t\t\t\t\t\t\ttemp.push( (matcherIn[i] = elem) );\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t\tpostFinder( null, (matcherOut = []), temp, xml );\n\t\t\t\t}\n\n\t\t\t\t// Move matched elements from seed to results to keep them synchronized\n\t\t\t\ti = matcherOut.length;\n\t\t\t\twhile ( i-- ) {\n\t\t\t\t\tif ( (elem = matcherOut[i]) &&\n\t\t\t\t\t\t(temp = postFinder ? indexOf( seed, elem ) : preMap[i]) > -1 ) {\n\n\t\t\t\t\t\tseed[temp] = !(results[temp] = elem);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\n\t\t// Add elements to results, through postFinder if defined\n\t\t} else {\n\t\t\tmatcherOut = condense(\n\t\t\t\tmatcherOut === results ?\n\t\t\t\t\tmatcherOut.splice( preexisting, matcherOut.length ) :\n\t\t\t\t\tmatcherOut\n\t\t\t);\n\t\t\tif ( postFinder ) {\n\t\t\t\tpostFinder( null, results, matcherOut, xml );\n\t\t\t} else {\n\t\t\t\tpush.apply( results, matcherOut );\n\t\t\t}\n\t\t}\n\t});\n}\n\nfunction matcherFromTokens( tokens ) {\n\tvar checkContext, matcher, j,\n\t\tlen = tokens.length,\n\t\tleadingRelative = Expr.relative[ tokens[0].type ],\n\t\timplicitRelative = leadingRelative || Expr.relative[\" \"],\n\t\ti = leadingRelative ? 1 : 0,\n\n\t\t// The foundational matcher ensures that elements are reachable from top-level context(s)\n\t\tmatchContext = addCombinator( function( elem ) {\n\t\t\treturn elem === checkContext;\n\t\t}, implicitRelative, true ),\n\t\tmatchAnyContext = addCombinator( function( elem ) {\n\t\t\treturn indexOf( checkContext, elem ) > -1;\n\t\t}, implicitRelative, true ),\n\t\tmatchers = [ function( elem, context, xml ) {\n\t\t\tvar ret = ( !leadingRelative && ( xml || context !== outermostContext ) ) || (\n\t\t\t\t(checkContext = context).nodeType ?\n\t\t\t\t\tmatchContext( elem, context, xml ) :\n\t\t\t\t\tmatchAnyContext( elem, context, xml ) );\n\t\t\t// Avoid hanging onto element (issue #299)\n\t\t\tcheckContext = null;\n\t\t\treturn ret;\n\t\t} ];\n\n\tfor ( ; i < len; i++ ) {\n\t\tif ( (matcher = Expr.relative[ tokens[i].type ]) ) {\n\t\t\tmatchers = [ addCombinator(elementMatcher( matchers ), matcher) ];\n\t\t} else {\n\t\t\tmatcher = Expr.filter[ tokens[i].type ].apply( null, tokens[i].matches );\n\n\t\t\t// Return special upon seeing a positional matcher\n\t\t\tif ( matcher[ expando ] ) {\n\t\t\t\t// Find the next relative operator (if any) for proper handling\n\t\t\t\tj = ++i;\n\t\t\t\tfor ( ; j < len; j++ ) {\n\t\t\t\t\tif ( Expr.relative[ tokens[j].type ] ) {\n\t\t\t\t\t\tbreak;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\treturn setMatcher(\n\t\t\t\t\ti > 1 && elementMatcher( matchers ),\n\t\t\t\t\ti > 1 && toSelector(\n\t\t\t\t\t\t// If the preceding token was a descendant combinator, insert an implicit any-element `*`\n\t\t\t\t\t\ttokens.slice( 0, i - 1 ).concat({ value: tokens[ i - 2 ].type === \" \" ? \"*\" : \"\" })\n\t\t\t\t\t).replace( rtrim, \"$1\" ),\n\t\t\t\t\tmatcher,\n\t\t\t\t\ti < j && matcherFromTokens( tokens.slice( i, j ) ),\n\t\t\t\t\tj < len && matcherFromTokens( (tokens = tokens.slice( j )) ),\n\t\t\t\t\tj < len && toSelector( tokens )\n\t\t\t\t);\n\t\t\t}\n\t\t\tmatchers.push( matcher );\n\t\t}\n\t}\n\n\treturn elementMatcher( matchers );\n}\n\nfunction matcherFromGroupMatchers( elementMatchers, setMatchers ) {\n\tvar bySet = setMatchers.length > 0,\n\t\tbyElement = elementMatchers.length > 0,\n\t\tsuperMatcher = function( seed, context, xml, results, outermost ) {\n\t\t\tvar elem, j, matcher,\n\t\t\t\tmatchedCount = 0,\n\t\t\t\ti = \"0\",\n\t\t\t\tunmatched = seed && [],\n\t\t\t\tsetMatched = [],\n\t\t\t\tcontextBackup = outermostContext,\n\t\t\t\t// We must always have either seed elements or outermost context\n\t\t\t\telems = seed || byElement && Expr.find[\"TAG\"]( \"*\", outermost ),\n\t\t\t\t// Use integer dirruns iff this is the outermost matcher\n\t\t\t\tdirrunsUnique = (dirruns += contextBackup == null ? 1 : Math.random() || 0.1),\n\t\t\t\tlen = elems.length;\n\n\t\t\tif ( outermost ) {\n\t\t\t\toutermostContext = context === document || context || outermost;\n\t\t\t}\n\n\t\t\t// Add elements passing elementMatchers directly to results\n\t\t\t// Support: IE<9, Safari\n\t\t\t// Tolerate NodeList properties (IE: \"length\"; Safari: <number>) matching elements by id\n\t\t\tfor ( ; i !== len && (elem = elems[i]) != null; i++ ) {\n\t\t\t\tif ( byElement && elem ) {\n\t\t\t\t\tj = 0;\n\t\t\t\t\tif ( !context && elem.ownerDocument !== document ) {\n\t\t\t\t\t\tsetDocument( elem );\n\t\t\t\t\t\txml = !documentIsHTML;\n\t\t\t\t\t}\n\t\t\t\t\twhile ( (matcher = elementMatchers[j++]) ) {\n\t\t\t\t\t\tif ( matcher( elem, context || document, xml) ) {\n\t\t\t\t\t\t\tresults.push( elem );\n\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t\tif ( outermost ) {\n\t\t\t\t\t\tdirruns = dirrunsUnique;\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\t// Track unmatched elements for set filters\n\t\t\t\tif ( bySet ) {\n\t\t\t\t\t// They will have gone through all possible matchers\n\t\t\t\t\tif ( (elem = !matcher && elem) ) {\n\t\t\t\t\t\tmatchedCount--;\n\t\t\t\t\t}\n\n\t\t\t\t\t// Lengthen the array for every element, matched or not\n\t\t\t\t\tif ( seed ) {\n\t\t\t\t\t\tunmatched.push( elem );\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t// `i` is now the count of elements visited above, and adding it to `matchedCount`\n\t\t\t// makes the latter nonnegative.\n\t\t\tmatchedCount += i;\n\n\t\t\t// Apply set filters to unmatched elements\n\t\t\t// NOTE: This can be skipped if there are no unmatched elements (i.e., `matchedCount`\n\t\t\t// equals `i`), unless we didn't visit _any_ elements in the above loop because we have\n\t\t\t// no element matchers and no seed.\n\t\t\t// Incrementing an initially-string \"0\" `i` allows `i` to remain a string only in that\n\t\t\t// case, which will result in a \"00\" `matchedCount` that differs from `i` but is also\n\t\t\t// numerically zero.\n\t\t\tif ( bySet && i !== matchedCount ) {\n\t\t\t\tj = 0;\n\t\t\t\twhile ( (matcher = setMatchers[j++]) ) {\n\t\t\t\t\tmatcher( unmatched, setMatched, context, xml );\n\t\t\t\t}\n\n\t\t\t\tif ( seed ) {\n\t\t\t\t\t// Reintegrate element matches to eliminate the need for sorting\n\t\t\t\t\tif ( matchedCount > 0 ) {\n\t\t\t\t\t\twhile ( i-- ) {\n\t\t\t\t\t\t\tif ( !(unmatched[i] || setMatched[i]) ) {\n\t\t\t\t\t\t\t\tsetMatched[i] = pop.call( results );\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\n\t\t\t\t\t// Discard index placeholder values to get only actual matches\n\t\t\t\t\tsetMatched = condense( setMatched );\n\t\t\t\t}\n\n\t\t\t\t// Add matches to results\n\t\t\t\tpush.apply( results, setMatched );\n\n\t\t\t\t// Seedless set matches succeeding multiple successful matchers stipulate sorting\n\t\t\t\tif ( outermost && !seed && setMatched.length > 0 &&\n\t\t\t\t\t( matchedCount + setMatchers.length ) > 1 ) {\n\n\t\t\t\t\tSizzle.uniqueSort( results );\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t// Override manipulation of globals by nested matchers\n\t\t\tif ( outermost ) {\n\t\t\t\tdirruns = dirrunsUnique;\n\t\t\t\toutermostContext = contextBackup;\n\t\t\t}\n\n\t\t\treturn unmatched;\n\t\t};\n\n\treturn bySet ?\n\t\tmarkFunction( superMatcher ) :\n\t\tsuperMatcher;\n}\n\ncompile = Sizzle.compile = function( selector, match /* Internal Use Only */ ) {\n\tvar i,\n\t\tsetMatchers = [],\n\t\telementMatchers = [],\n\t\tcached = compilerCache[ selector + \" \" ];\n\n\tif ( !cached ) {\n\t\t// Generate a function of recursive functions that can be used to check each element\n\t\tif ( !match ) {\n\t\t\tmatch = tokenize( selector );\n\t\t}\n\t\ti = match.length;\n\t\twhile ( i-- ) {\n\t\t\tcached = matcherFromTokens( match[i] );\n\t\t\tif ( cached[ expando ] ) {\n\t\t\t\tsetMatchers.push( cached );\n\t\t\t} else {\n\t\t\t\telementMatchers.push( cached );\n\t\t\t}\n\t\t}\n\n\t\t// Cache the compiled function\n\t\tcached = compilerCache( selector, matcherFromGroupMatchers( elementMatchers, setMatchers ) );\n\n\t\t// Save selector and tokenization\n\t\tcached.selector = selector;\n\t}\n\treturn cached;\n};\n\n/**\n * A low-level selection function that works with Sizzle's compiled\n *  selector functions\n * @param {String|Function} selector A selector or a pre-compiled\n *  selector function built with Sizzle.compile\n * @param {Element} context\n * @param {Array} [results]\n * @param {Array} [seed] A set of elements to match against\n */\nselect = Sizzle.select = function( selector, context, results, seed ) {\n\tvar i, tokens, token, type, find,\n\t\tcompiled = typeof selector === \"function\" && selector,\n\t\tmatch = !seed && tokenize( (selector = compiled.selector || selector) );\n\n\tresults = results || [];\n\n\t// Try to minimize operations if there is only one selector in the list and no seed\n\t// (the latter of which guarantees us context)\n\tif ( match.length === 1 ) {\n\n\t\t// Reduce context if the leading compound selector is an ID\n\t\ttokens = match[0] = match[0].slice( 0 );\n\t\tif ( tokens.length > 2 && (token = tokens[0]).type === \"ID\" &&\n\t\t\t\tcontext.nodeType === 9 && documentIsHTML && Expr.relative[ tokens[1].type ] ) {\n\n\t\t\tcontext = ( Expr.find[\"ID\"]( token.matches[0].replace(runescape, funescape), context ) || [] )[0];\n\t\t\tif ( !context ) {\n\t\t\t\treturn results;\n\n\t\t\t// Precompiled matchers will still verify ancestry, so step up a level\n\t\t\t} else if ( compiled ) {\n\t\t\t\tcontext = context.parentNode;\n\t\t\t}\n\n\t\t\tselector = selector.slice( tokens.shift().value.length );\n\t\t}\n\n\t\t// Fetch a seed set for right-to-left matching\n\t\ti = matchExpr[\"needsContext\"].test( selector ) ? 0 : tokens.length;\n\t\twhile ( i-- ) {\n\t\t\ttoken = tokens[i];\n\n\t\t\t// Abort if we hit a combinator\n\t\t\tif ( Expr.relative[ (type = token.type) ] ) {\n\t\t\t\tbreak;\n\t\t\t}\n\t\t\tif ( (find = Expr.find[ type ]) ) {\n\t\t\t\t// Search, expanding context for leading sibling combinators\n\t\t\t\tif ( (seed = find(\n\t\t\t\t\ttoken.matches[0].replace( runescape, funescape ),\n\t\t\t\t\trsibling.test( tokens[0].type ) && testContext( context.parentNode ) || context\n\t\t\t\t)) ) {\n\n\t\t\t\t\t// If seed is empty or no tokens remain, we can return early\n\t\t\t\t\ttokens.splice( i, 1 );\n\t\t\t\t\tselector = seed.length && toSelector( tokens );\n\t\t\t\t\tif ( !selector ) {\n\t\t\t\t\t\tpush.apply( results, seed );\n\t\t\t\t\t\treturn results;\n\t\t\t\t\t}\n\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\n\t// Compile and execute a filtering function if one is not provided\n\t// Provide `match` to avoid retokenization if we modified the selector above\n\t( compiled || compile( selector, match ) )(\n\t\tseed,\n\t\tcontext,\n\t\t!documentIsHTML,\n\t\tresults,\n\t\t!context || rsibling.test( selector ) && testContext( context.parentNode ) || context\n\t);\n\treturn results;\n};\n\n// One-time assignments\n\n// Sort stability\nsupport.sortStable = expando.split(\"\").sort( sortOrder ).join(\"\") === expando;\n\n// Support: Chrome 14-35+\n// Always assume duplicates if they aren't passed to the comparison function\nsupport.detectDuplicates = !!hasDuplicate;\n\n// Initialize against the default document\nsetDocument();\n\n// Support: Webkit<537.32 - Safari 6.0.3/Chrome 25 (fixed in Chrome 27)\n// Detached nodes confoundingly follow *each other*\nsupport.sortDetached = assert(function( el ) {\n\t// Should return 1, but returns 4 (following)\n\treturn el.compareDocumentPosition( document.createElement(\"fieldset\") ) & 1;\n});\n\n// Support: IE<8\n// Prevent attribute/property \"interpolation\"\n// https://msdn.microsoft.com/en-us/library/ms536429%28VS.85%29.aspx\nif ( !assert(function( el ) {\n\tel.innerHTML = \"<a href='#'></a>\";\n\treturn el.firstChild.getAttribute(\"href\") === \"#\" ;\n}) ) {\n\taddHandle( \"type|href|height|width\", function( elem, name, isXML ) {\n\t\tif ( !isXML ) {\n\t\t\treturn elem.getAttribute( name, name.toLowerCase() === \"type\" ? 1 : 2 );\n\t\t}\n\t});\n}\n\n// Support: IE<9\n// Use defaultValue in place of getAttribute(\"value\")\nif ( !support.attributes || !assert(function( el ) {\n\tel.innerHTML = \"<input/>\";\n\tel.firstChild.setAttribute( \"value\", \"\" );\n\treturn el.firstChild.getAttribute( \"value\" ) === \"\";\n}) ) {\n\taddHandle( \"value\", function( elem, name, isXML ) {\n\t\tif ( !isXML && elem.nodeName.toLowerCase() === \"input\" ) {\n\t\t\treturn elem.defaultValue;\n\t\t}\n\t});\n}\n\n// Support: IE<9\n// Use getAttributeNode to fetch booleans when getAttribute lies\nif ( !assert(function( el ) {\n\treturn el.getAttribute(\"disabled\") == null;\n}) ) {\n\taddHandle( booleans, function( elem, name, isXML ) {\n\t\tvar val;\n\t\tif ( !isXML ) {\n\t\t\treturn elem[ name ] === true ? name.toLowerCase() :\n\t\t\t\t\t(val = elem.getAttributeNode( name )) && val.specified ?\n\t\t\t\t\tval.value :\n\t\t\t\tnull;\n\t\t}\n\t});\n}\n\nreturn Sizzle;\n\n})( window );\n\n\n\njQuery.find = Sizzle;\njQuery.expr = Sizzle.selectors;\n\n// Deprecated\njQuery.expr[ \":\" ] = jQuery.expr.pseudos;\njQuery.uniqueSort = jQuery.unique = Sizzle.uniqueSort;\njQuery.text = Sizzle.getText;\njQuery.isXMLDoc = Sizzle.isXML;\njQuery.contains = Sizzle.contains;\njQuery.escapeSelector = Sizzle.escape;\n\n\n\n\nvar dir = function( elem, dir, until ) {\n\tvar matched = [],\n\t\ttruncate = until !== undefined;\n\n\twhile ( ( elem = elem[ dir ] ) && elem.nodeType !== 9 ) {\n\t\tif ( elem.nodeType === 1 ) {\n\t\t\tif ( truncate && jQuery( elem ).is( until ) ) {\n\t\t\t\tbreak;\n\t\t\t}\n\t\t\tmatched.push( elem );\n\t\t}\n\t}\n\treturn matched;\n};\n\n\nvar siblings = function( n, elem ) {\n\tvar matched = [];\n\n\tfor ( ; n; n = n.nextSibling ) {\n\t\tif ( n.nodeType === 1 && n !== elem ) {\n\t\t\tmatched.push( n );\n\t\t}\n\t}\n\n\treturn matched;\n};\n\n\nvar rneedsContext = jQuery.expr.match.needsContext;\n\nvar rsingleTag = ( /^<([a-z][^\\/\\0>:\\x20\\t\\r\\n\\f]*)[\\x20\\t\\r\\n\\f]*\\/?>(?:<\\/\\1>|)$/i );\n\n\n\nvar risSimple = /^.[^:#\\[\\.,]*$/;\n\n// Implement the identical functionality for filter and not\nfunction winnow( elements, qualifier, not ) {\n\tif ( jQuery.isFunction( qualifier ) ) {\n\t\treturn jQuery.grep( elements, function( elem, i ) {\n\t\t\treturn !!qualifier.call( elem, i, elem ) !== not;\n\t\t} );\n\t}\n\n\t// Single element\n\tif ( qualifier.nodeType ) {\n\t\treturn jQuery.grep( elements, function( elem ) {\n\t\t\treturn ( elem === qualifier ) !== not;\n\t\t} );\n\t}\n\n\t// Arraylike of elements (jQuery, arguments, Array)\n\tif ( typeof qualifier !== \"string\" ) {\n\t\treturn jQuery.grep( elements, function( elem ) {\n\t\t\treturn ( indexOf.call( qualifier, elem ) > -1 ) !== not;\n\t\t} );\n\t}\n\n\t// Simple selector that can be filtered directly, removing non-Elements\n\tif ( risSimple.test( qualifier ) ) {\n\t\treturn jQuery.filter( qualifier, elements, not );\n\t}\n\n\t// Complex selector, compare the two sets, removing non-Elements\n\tqualifier = jQuery.filter( qualifier, elements );\n\treturn jQuery.grep( elements, function( elem ) {\n\t\treturn ( indexOf.call( qualifier, elem ) > -1 ) !== not && elem.nodeType === 1;\n\t} );\n}\n\njQuery.filter = function( expr, elems, not ) {\n\tvar elem = elems[ 0 ];\n\n\tif ( not ) {\n\t\texpr = \":not(\" + expr + \")\";\n\t}\n\n\tif ( elems.length === 1 && elem.nodeType === 1 ) {\n\t\treturn jQuery.find.matchesSelector( elem, expr ) ? [ elem ] : [];\n\t}\n\n\treturn jQuery.find.matches( expr, jQuery.grep( elems, function( elem ) {\n\t\treturn elem.nodeType === 1;\n\t} ) );\n};\n\njQuery.fn.extend( {\n\tfind: function( selector ) {\n\t\tvar i, ret,\n\t\t\tlen = this.length,\n\t\t\tself = this;\n\n\t\tif ( typeof selector !== \"string\" ) {\n\t\t\treturn this.pushStack( jQuery( selector ).filter( function() {\n\t\t\t\tfor ( i = 0; i < len; i++ ) {\n\t\t\t\t\tif ( jQuery.contains( self[ i ], this ) ) {\n\t\t\t\t\t\treturn true;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t} ) );\n\t\t}\n\n\t\tret = this.pushStack( [] );\n\n\t\tfor ( i = 0; i < len; i++ ) {\n\t\t\tjQuery.find( selector, self[ i ], ret );\n\t\t}\n\n\t\treturn len > 1 ? jQuery.uniqueSort( ret ) : ret;\n\t},\n\tfilter: function( selector ) {\n\t\treturn this.pushStack( winnow( this, selector || [], false ) );\n\t},\n\tnot: function( selector ) {\n\t\treturn this.pushStack( winnow( this, selector || [], true ) );\n\t},\n\tis: function( selector ) {\n\t\treturn !!winnow(\n\t\t\tthis,\n\n\t\t\t// If this is a positional/relative selector, check membership in the returned set\n\t\t\t// so $(\"p:first\").is(\"p:last\") won't return true for a doc with two \"p\".\n\t\t\ttypeof selector === \"string\" && rneedsContext.test( selector ) ?\n\t\t\t\tjQuery( selector ) :\n\t\t\t\tselector || [],\n\t\t\tfalse\n\t\t).length;\n\t}\n} );\n\n\n// Initialize a jQuery object\n\n\n// A central reference to the root jQuery(document)\nvar rootjQuery,\n\n\t// A simple way to check for HTML strings\n\t// Prioritize #id over <tag> to avoid XSS via location.hash (#9521)\n\t// Strict HTML recognition (#11290: must start with <)\n\t// Shortcut simple #id case for speed\n\trquickExpr = /^(?:\\s*(<[\\w\\W]+>)[^>]*|#([\\w-]+))$/,\n\n\tinit = jQuery.fn.init = function( selector, context, root ) {\n\t\tvar match, elem;\n\n\t\t// HANDLE: $(\"\"), $(null), $(undefined), $(false)\n\t\tif ( !selector ) {\n\t\t\treturn this;\n\t\t}\n\n\t\t// Method init() accepts an alternate rootjQuery\n\t\t// so migrate can support jQuery.sub (gh-2101)\n\t\troot = root || rootjQuery;\n\n\t\t// Handle HTML strings\n\t\tif ( typeof selector === \"string\" ) {\n\t\t\tif ( selector[ 0 ] === \"<\" &&\n\t\t\t\tselector[ selector.length - 1 ] === \">\" &&\n\t\t\t\tselector.length >= 3 ) {\n\n\t\t\t\t// Assume that strings that start and end with <> are HTML and skip the regex check\n\t\t\t\tmatch = [ null, selector, null ];\n\n\t\t\t} else {\n\t\t\t\tmatch = rquickExpr.exec( selector );\n\t\t\t}\n\n\t\t\t// Match html or make sure no context is specified for #id\n\t\t\tif ( match && ( match[ 1 ] || !context ) ) {\n\n\t\t\t\t// HANDLE: $(html) -> $(array)\n\t\t\t\tif ( match[ 1 ] ) {\n\t\t\t\t\tcontext = context instanceof jQuery ? context[ 0 ] : context;\n\n\t\t\t\t\t// Option to run scripts is true for back-compat\n\t\t\t\t\t// Intentionally let the error be thrown if parseHTML is not present\n\t\t\t\t\tjQuery.merge( this, jQuery.parseHTML(\n\t\t\t\t\t\tmatch[ 1 ],\n\t\t\t\t\t\tcontext && context.nodeType ? context.ownerDocument || context : document,\n\t\t\t\t\t\ttrue\n\t\t\t\t\t) );\n\n\t\t\t\t\t// HANDLE: $(html, props)\n\t\t\t\t\tif ( rsingleTag.test( match[ 1 ] ) && jQuery.isPlainObject( context ) ) {\n\t\t\t\t\t\tfor ( match in context ) {\n\n\t\t\t\t\t\t\t// Properties of context are called as methods if possible\n\t\t\t\t\t\t\tif ( jQuery.isFunction( this[ match ] ) ) {\n\t\t\t\t\t\t\t\tthis[ match ]( context[ match ] );\n\n\t\t\t\t\t\t\t// ...and otherwise set as attributes\n\t\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\t\tthis.attr( match, context[ match ] );\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\n\t\t\t\t\treturn this;\n\n\t\t\t\t// HANDLE: $(#id)\n\t\t\t\t} else {\n\t\t\t\t\telem = document.getElementById( match[ 2 ] );\n\n\t\t\t\t\tif ( elem ) {\n\n\t\t\t\t\t\t// Inject the element directly into the jQuery object\n\t\t\t\t\t\tthis[ 0 ] = elem;\n\t\t\t\t\t\tthis.length = 1;\n\t\t\t\t\t}\n\t\t\t\t\treturn this;\n\t\t\t\t}\n\n\t\t\t// HANDLE: $(expr, $(...))\n\t\t\t} else if ( !context || context.jquery ) {\n\t\t\t\treturn ( context || root ).find( selector );\n\n\t\t\t// HANDLE: $(expr, context)\n\t\t\t// (which is just equivalent to: $(context).find(expr)\n\t\t\t} else {\n\t\t\t\treturn this.constructor( context ).find( selector );\n\t\t\t}\n\n\t\t// HANDLE: $(DOMElement)\n\t\t} else if ( selector.nodeType ) {\n\t\t\tthis[ 0 ] = selector;\n\t\t\tthis.length = 1;\n\t\t\treturn this;\n\n\t\t// HANDLE: $(function)\n\t\t// Shortcut for document ready\n\t\t} else if ( jQuery.isFunction( selector ) ) {\n\t\t\treturn root.ready !== undefined ?\n\t\t\t\troot.ready( selector ) :\n\n\t\t\t\t// Execute immediately if ready is not present\n\t\t\t\tselector( jQuery );\n\t\t}\n\n\t\treturn jQuery.makeArray( selector, this );\n\t};\n\n// Give the init function the jQuery prototype for later instantiation\ninit.prototype = jQuery.fn;\n\n// Initialize central reference\nrootjQuery = jQuery( document );\n\n\nvar rparentsprev = /^(?:parents|prev(?:Until|All))/,\n\n\t// Methods guaranteed to produce a unique set when starting from a unique set\n\tguaranteedUnique = {\n\t\tchildren: true,\n\t\tcontents: true,\n\t\tnext: true,\n\t\tprev: true\n\t};\n\njQuery.fn.extend( {\n\thas: function( target ) {\n\t\tvar targets = jQuery( target, this ),\n\t\t\tl = targets.length;\n\n\t\treturn this.filter( function() {\n\t\t\tvar i = 0;\n\t\t\tfor ( ; i < l; i++ ) {\n\t\t\t\tif ( jQuery.contains( this, targets[ i ] ) ) {\n\t\t\t\t\treturn true;\n\t\t\t\t}\n\t\t\t}\n\t\t} );\n\t},\n\n\tclosest: function( selectors, context ) {\n\t\tvar cur,\n\t\t\ti = 0,\n\t\t\tl = this.length,\n\t\t\tmatched = [],\n\t\t\ttargets = typeof selectors !== \"string\" && jQuery( selectors );\n\n\t\t// Positional selectors never match, since there's no _selection_ context\n\t\tif ( !rneedsContext.test( selectors ) ) {\n\t\t\tfor ( ; i < l; i++ ) {\n\t\t\t\tfor ( cur = this[ i ]; cur && cur !== context; cur = cur.parentNode ) {\n\n\t\t\t\t\t// Always skip document fragments\n\t\t\t\t\tif ( cur.nodeType < 11 && ( targets ?\n\t\t\t\t\t\ttargets.index( cur ) > -1 :\n\n\t\t\t\t\t\t// Don't pass non-elements to Sizzle\n\t\t\t\t\t\tcur.nodeType === 1 &&\n\t\t\t\t\t\t\tjQuery.find.matchesSelector( cur, selectors ) ) ) {\n\n\t\t\t\t\t\tmatched.push( cur );\n\t\t\t\t\t\tbreak;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\treturn this.pushStack( matched.length > 1 ? jQuery.uniqueSort( matched ) : matched );\n\t},\n\n\t// Determine the position of an element within the set\n\tindex: function( elem ) {\n\n\t\t// No argument, return index in parent\n\t\tif ( !elem ) {\n\t\t\treturn ( this[ 0 ] && this[ 0 ].parentNode ) ? this.first().prevAll().length : -1;\n\t\t}\n\n\t\t// Index in selector\n\t\tif ( typeof elem === \"string\" ) {\n\t\t\treturn indexOf.call( jQuery( elem ), this[ 0 ] );\n\t\t}\n\n\t\t// Locate the position of the desired element\n\t\treturn indexOf.call( this,\n\n\t\t\t// If it receives a jQuery object, the first element is used\n\t\t\telem.jquery ? elem[ 0 ] : elem\n\t\t);\n\t},\n\n\tadd: function( selector, context ) {\n\t\treturn this.pushStack(\n\t\t\tjQuery.uniqueSort(\n\t\t\t\tjQuery.merge( this.get(), jQuery( selector, context ) )\n\t\t\t)\n\t\t);\n\t},\n\n\taddBack: function( selector ) {\n\t\treturn this.add( selector == null ?\n\t\t\tthis.prevObject : this.prevObject.filter( selector )\n\t\t);\n\t}\n} );\n\nfunction sibling( cur, dir ) {\n\twhile ( ( cur = cur[ dir ] ) && cur.nodeType !== 1 ) {}\n\treturn cur;\n}\n\njQuery.each( {\n\tparent: function( elem ) {\n\t\tvar parent = elem.parentNode;\n\t\treturn parent && parent.nodeType !== 11 ? parent : null;\n\t},\n\tparents: function( elem ) {\n\t\treturn dir( elem, \"parentNode\" );\n\t},\n\tparentsUntil: function( elem, i, until ) {\n\t\treturn dir( elem, \"parentNode\", until );\n\t},\n\tnext: function( elem ) {\n\t\treturn sibling( elem, \"nextSibling\" );\n\t},\n\tprev: function( elem ) {\n\t\treturn sibling( elem, \"previousSibling\" );\n\t},\n\tnextAll: function( elem ) {\n\t\treturn dir( elem, \"nextSibling\" );\n\t},\n\tprevAll: function( elem ) {\n\t\treturn dir( elem, \"previousSibling\" );\n\t},\n\tnextUntil: function( elem, i, until ) {\n\t\treturn dir( elem, \"nextSibling\", until );\n\t},\n\tprevUntil: function( elem, i, until ) {\n\t\treturn dir( elem, \"previousSibling\", until );\n\t},\n\tsiblings: function( elem ) {\n\t\treturn siblings( ( elem.parentNode || {} ).firstChild, elem );\n\t},\n\tchildren: function( elem ) {\n\t\treturn siblings( elem.firstChild );\n\t},\n\tcontents: function( elem ) {\n\t\treturn elem.contentDocument || jQuery.merge( [], elem.childNodes );\n\t}\n}, function( name, fn ) {\n\tjQuery.fn[ name ] = function( until, selector ) {\n\t\tvar matched = jQuery.map( this, fn, until );\n\n\t\tif ( name.slice( -5 ) !== \"Until\" ) {\n\t\t\tselector = until;\n\t\t}\n\n\t\tif ( selector && typeof selector === \"string\" ) {\n\t\t\tmatched = jQuery.filter( selector, matched );\n\t\t}\n\n\t\tif ( this.length > 1 ) {\n\n\t\t\t// Remove duplicates\n\t\t\tif ( !guaranteedUnique[ name ] ) {\n\t\t\t\tjQuery.uniqueSort( matched );\n\t\t\t}\n\n\t\t\t// Reverse order for parents* and prev-derivatives\n\t\t\tif ( rparentsprev.test( name ) ) {\n\t\t\t\tmatched.reverse();\n\t\t\t}\n\t\t}\n\n\t\treturn this.pushStack( matched );\n\t};\n} );\nvar rnothtmlwhite = ( /[^\\x20\\t\\r\\n\\f]+/g );\n\n\n\n// Convert String-formatted options into Object-formatted ones\nfunction createOptions( options ) {\n\tvar object = {};\n\tjQuery.each( options.match( rnothtmlwhite ) || [], function( _, flag ) {\n\t\tobject[ flag ] = true;\n\t} );\n\treturn object;\n}\n\n/*\n * Create a callback list using the following parameters:\n *\n *\toptions: an optional list of space-separated options that will change how\n *\t\t\tthe callback list behaves or a more traditional option object\n *\n * By default a callback list will act like an event callback list and can be\n * \"fired\" multiple times.\n *\n * Possible options:\n *\n *\tonce:\t\t\twill ensure the callback list can only be fired once (like a Deferred)\n *\n *\tmemory:\t\t\twill keep track of previous values and will call any callback added\n *\t\t\t\t\tafter the list has been fired right away with the latest \"memorized\"\n *\t\t\t\t\tvalues (like a Deferred)\n *\n *\tunique:\t\t\twill ensure a callback can only be added once (no duplicate in the list)\n *\n *\tstopOnFalse:\tinterrupt callings when a callback returns false\n *\n */\njQuery.Callbacks = function( options ) {\n\n\t// Convert options from String-formatted to Object-formatted if needed\n\t// (we check in cache first)\n\toptions = typeof options === \"string\" ?\n\t\tcreateOptions( options ) :\n\t\tjQuery.extend( {}, options );\n\n\tvar // Flag to know if list is currently firing\n\t\tfiring,\n\n\t\t// Last fire value for non-forgettable lists\n\t\tmemory,\n\n\t\t// Flag to know if list was already fired\n\t\tfired,\n\n\t\t// Flag to prevent firing\n\t\tlocked,\n\n\t\t// Actual callback list\n\t\tlist = [],\n\n\t\t// Queue of execution data for repeatable lists\n\t\tqueue = [],\n\n\t\t// Index of currently firing callback (modified by add/remove as needed)\n\t\tfiringIndex = -1,\n\n\t\t// Fire callbacks\n\t\tfire = function() {\n\n\t\t\t// Enforce single-firing\n\t\t\tlocked = options.once;\n\n\t\t\t// Execute callbacks for all pending executions,\n\t\t\t// respecting firingIndex overrides and runtime changes\n\t\t\tfired = firing = true;\n\t\t\tfor ( ; queue.length; firingIndex = -1 ) {\n\t\t\t\tmemory = queue.shift();\n\t\t\t\twhile ( ++firingIndex < list.length ) {\n\n\t\t\t\t\t// Run callback and check for early termination\n\t\t\t\t\tif ( list[ firingIndex ].apply( memory[ 0 ], memory[ 1 ] ) === false &&\n\t\t\t\t\t\toptions.stopOnFalse ) {\n\n\t\t\t\t\t\t// Jump to end and forget the data so .add doesn't re-fire\n\t\t\t\t\t\tfiringIndex = list.length;\n\t\t\t\t\t\tmemory = false;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t// Forget the data if we're done with it\n\t\t\tif ( !options.memory ) {\n\t\t\t\tmemory = false;\n\t\t\t}\n\n\t\t\tfiring = false;\n\n\t\t\t// Clean up if we're done firing for good\n\t\t\tif ( locked ) {\n\n\t\t\t\t// Keep an empty list if we have data for future add calls\n\t\t\t\tif ( memory ) {\n\t\t\t\t\tlist = [];\n\n\t\t\t\t// Otherwise, this object is spent\n\t\t\t\t} else {\n\t\t\t\t\tlist = \"\";\n\t\t\t\t}\n\t\t\t}\n\t\t},\n\n\t\t// Actual Callbacks object\n\t\tself = {\n\n\t\t\t// Add a callback or a collection of callbacks to the list\n\t\t\tadd: function() {\n\t\t\t\tif ( list ) {\n\n\t\t\t\t\t// If we have memory from a past run, we should fire after adding\n\t\t\t\t\tif ( memory && !firing ) {\n\t\t\t\t\t\tfiringIndex = list.length - 1;\n\t\t\t\t\t\tqueue.push( memory );\n\t\t\t\t\t}\n\n\t\t\t\t\t( function add( args ) {\n\t\t\t\t\t\tjQuery.each( args, function( _, arg ) {\n\t\t\t\t\t\t\tif ( jQuery.isFunction( arg ) ) {\n\t\t\t\t\t\t\t\tif ( !options.unique || !self.has( arg ) ) {\n\t\t\t\t\t\t\t\t\tlist.push( arg );\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t} else if ( arg && arg.length && jQuery.type( arg ) !== \"string\" ) {\n\n\t\t\t\t\t\t\t\t// Inspect recursively\n\t\t\t\t\t\t\t\tadd( arg );\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t} );\n\t\t\t\t\t} )( arguments );\n\n\t\t\t\t\tif ( memory && !firing ) {\n\t\t\t\t\t\tfire();\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\treturn this;\n\t\t\t},\n\n\t\t\t// Remove a callback from the list\n\t\t\tremove: function() {\n\t\t\t\tjQuery.each( arguments, function( _, arg ) {\n\t\t\t\t\tvar index;\n\t\t\t\t\twhile ( ( index = jQuery.inArray( arg, list, index ) ) > -1 ) {\n\t\t\t\t\t\tlist.splice( index, 1 );\n\n\t\t\t\t\t\t// Handle firing indexes\n\t\t\t\t\t\tif ( index <= firingIndex ) {\n\t\t\t\t\t\t\tfiringIndex--;\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t} );\n\t\t\t\treturn this;\n\t\t\t},\n\n\t\t\t// Check if a given callback is in the list.\n\t\t\t// If no argument is given, return whether or not list has callbacks attached.\n\t\t\thas: function( fn ) {\n\t\t\t\treturn fn ?\n\t\t\t\t\tjQuery.inArray( fn, list ) > -1 :\n\t\t\t\t\tlist.length > 0;\n\t\t\t},\n\n\t\t\t// Remove all callbacks from the list\n\t\t\tempty: function() {\n\t\t\t\tif ( list ) {\n\t\t\t\t\tlist = [];\n\t\t\t\t}\n\t\t\t\treturn this;\n\t\t\t},\n\n\t\t\t// Disable .fire and .add\n\t\t\t// Abort any current/pending executions\n\t\t\t// Clear all callbacks and values\n\t\t\tdisable: function() {\n\t\t\t\tlocked = queue = [];\n\t\t\t\tlist = memory = \"\";\n\t\t\t\treturn this;\n\t\t\t},\n\t\t\tdisabled: function() {\n\t\t\t\treturn !list;\n\t\t\t},\n\n\t\t\t// Disable .fire\n\t\t\t// Also disable .add unless we have memory (since it would have no effect)\n\t\t\t// Abort any pending executions\n\t\t\tlock: function() {\n\t\t\t\tlocked = queue = [];\n\t\t\t\tif ( !memory && !firing ) {\n\t\t\t\t\tlist = memory = \"\";\n\t\t\t\t}\n\t\t\t\treturn this;\n\t\t\t},\n\t\t\tlocked: function() {\n\t\t\t\treturn !!locked;\n\t\t\t},\n\n\t\t\t// Call all callbacks with the given context and arguments\n\t\t\tfireWith: function( context, args ) {\n\t\t\t\tif ( !locked ) {\n\t\t\t\t\targs = args || [];\n\t\t\t\t\targs = [ context, args.slice ? args.slice() : args ];\n\t\t\t\t\tqueue.push( args );\n\t\t\t\t\tif ( !firing ) {\n\t\t\t\t\t\tfire();\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\treturn this;\n\t\t\t},\n\n\t\t\t// Call all the callbacks with the given arguments\n\t\t\tfire: function() {\n\t\t\t\tself.fireWith( this, arguments );\n\t\t\t\treturn this;\n\t\t\t},\n\n\t\t\t// To know if the callbacks have already been called at least once\n\t\t\tfired: function() {\n\t\t\t\treturn !!fired;\n\t\t\t}\n\t\t};\n\n\treturn self;\n};\n\n\nfunction Identity( v ) {\n\treturn v;\n}\nfunction Thrower( ex ) {\n\tthrow ex;\n}\n\nfunction adoptValue( value, resolve, reject ) {\n\tvar method;\n\n\ttry {\n\n\t\t// Check for promise aspect first to privilege synchronous behavior\n\t\tif ( value && jQuery.isFunction( ( method = value.promise ) ) ) {\n\t\t\tmethod.call( value ).done( resolve ).fail( reject );\n\n\t\t// Other thenables\n\t\t} else if ( value && jQuery.isFunction( ( method = value.then ) ) ) {\n\t\t\tmethod.call( value, resolve, reject );\n\n\t\t// Other non-thenables\n\t\t} else {\n\n\t\t\t// Support: Android 4.0 only\n\t\t\t// Strict mode functions invoked without .call/.apply get global-object context\n\t\t\tresolve.call( undefined, value );\n\t\t}\n\n\t// For Promises/A+, convert exceptions into rejections\n\t// Since jQuery.when doesn't unwrap thenables, we can skip the extra checks appearing in\n\t// Deferred#then to conditionally suppress rejection.\n\t} catch ( value ) {\n\n\t\t// Support: Android 4.0 only\n\t\t// Strict mode functions invoked without .call/.apply get global-object context\n\t\treject.call( undefined, value );\n\t}\n}\n\njQuery.extend( {\n\n\tDeferred: function( func ) {\n\t\tvar tuples = [\n\n\t\t\t\t// action, add listener, callbacks,\n\t\t\t\t// ... .then handlers, argument index, [final state]\n\t\t\t\t[ \"notify\", \"progress\", jQuery.Callbacks( \"memory\" ),\n\t\t\t\t\tjQuery.Callbacks( \"memory\" ), 2 ],\n\t\t\t\t[ \"resolve\", \"done\", jQuery.Callbacks( \"once memory\" ),\n\t\t\t\t\tjQuery.Callbacks( \"once memory\" ), 0, \"resolved\" ],\n\t\t\t\t[ \"reject\", \"fail\", jQuery.Callbacks( \"once memory\" ),\n\t\t\t\t\tjQuery.Callbacks( \"once memory\" ), 1, \"rejected\" ]\n\t\t\t],\n\t\t\tstate = \"pending\",\n\t\t\tpromise = {\n\t\t\t\tstate: function() {\n\t\t\t\t\treturn state;\n\t\t\t\t},\n\t\t\t\talways: function() {\n\t\t\t\t\tdeferred.done( arguments ).fail( arguments );\n\t\t\t\t\treturn this;\n\t\t\t\t},\n\t\t\t\t\"catch\": function( fn ) {\n\t\t\t\t\treturn promise.then( null, fn );\n\t\t\t\t},\n\n\t\t\t\t// Keep pipe for back-compat\n\t\t\t\tpipe: function( /* fnDone, fnFail, fnProgress */ ) {\n\t\t\t\t\tvar fns = arguments;\n\n\t\t\t\t\treturn jQuery.Deferred( function( newDefer ) {\n\t\t\t\t\t\tjQuery.each( tuples, function( i, tuple ) {\n\n\t\t\t\t\t\t\t// Map tuples (progress, done, fail) to arguments (done, fail, progress)\n\t\t\t\t\t\t\tvar fn = jQuery.isFunction( fns[ tuple[ 4 ] ] ) && fns[ tuple[ 4 ] ];\n\n\t\t\t\t\t\t\t// deferred.progress(function() { bind to newDefer or newDefer.notify })\n\t\t\t\t\t\t\t// deferred.done(function() { bind to newDefer or newDefer.resolve })\n\t\t\t\t\t\t\t// deferred.fail(function() { bind to newDefer or newDefer.reject })\n\t\t\t\t\t\t\tdeferred[ tuple[ 1 ] ]( function() {\n\t\t\t\t\t\t\t\tvar returned = fn && fn.apply( this, arguments );\n\t\t\t\t\t\t\t\tif ( returned && jQuery.isFunction( returned.promise ) ) {\n\t\t\t\t\t\t\t\t\treturned.promise()\n\t\t\t\t\t\t\t\t\t\t.progress( newDefer.notify )\n\t\t\t\t\t\t\t\t\t\t.done( newDefer.resolve )\n\t\t\t\t\t\t\t\t\t\t.fail( newDefer.reject );\n\t\t\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\t\t\tnewDefer[ tuple[ 0 ] + \"With\" ](\n\t\t\t\t\t\t\t\t\t\tthis,\n\t\t\t\t\t\t\t\t\t\tfn ? [ returned ] : arguments\n\t\t\t\t\t\t\t\t\t);\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t} );\n\t\t\t\t\t\t} );\n\t\t\t\t\t\tfns = null;\n\t\t\t\t\t} ).promise();\n\t\t\t\t},\n\t\t\t\tthen: function( onFulfilled, onRejected, onProgress ) {\n\t\t\t\t\tvar maxDepth = 0;\n\t\t\t\t\tfunction resolve( depth, deferred, handler, special ) {\n\t\t\t\t\t\treturn function() {\n\t\t\t\t\t\t\tvar that = this,\n\t\t\t\t\t\t\t\targs = arguments,\n\t\t\t\t\t\t\t\tmightThrow = function() {\n\t\t\t\t\t\t\t\t\tvar returned, then;\n\n\t\t\t\t\t\t\t\t\t// Support: Promises/A+ section 2.3.3.3.3\n\t\t\t\t\t\t\t\t\t// https://promisesaplus.com/#point-59\n\t\t\t\t\t\t\t\t\t// Ignore double-resolution attempts\n\t\t\t\t\t\t\t\t\tif ( depth < maxDepth ) {\n\t\t\t\t\t\t\t\t\t\treturn;\n\t\t\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t\t\treturned = handler.apply( that, args );\n\n\t\t\t\t\t\t\t\t\t// Support: Promises/A+ section 2.3.1\n\t\t\t\t\t\t\t\t\t// https://promisesaplus.com/#point-48\n\t\t\t\t\t\t\t\t\tif ( returned === deferred.promise() ) {\n\t\t\t\t\t\t\t\t\t\tthrow new TypeError( \"Thenable self-resolution\" );\n\t\t\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t\t\t// Support: Promises/A+ sections 2.3.3.1, 3.5\n\t\t\t\t\t\t\t\t\t// https://promisesaplus.com/#point-54\n\t\t\t\t\t\t\t\t\t// https://promisesaplus.com/#point-75\n\t\t\t\t\t\t\t\t\t// Retrieve `then` only once\n\t\t\t\t\t\t\t\t\tthen = returned &&\n\n\t\t\t\t\t\t\t\t\t\t// Support: Promises/A+ section 2.3.4\n\t\t\t\t\t\t\t\t\t\t// https://promisesaplus.com/#point-64\n\t\t\t\t\t\t\t\t\t\t// Only check objects and functions for thenability\n\t\t\t\t\t\t\t\t\t\t( typeof returned === \"object\" ||\n\t\t\t\t\t\t\t\t\t\t\ttypeof returned === \"function\" ) &&\n\t\t\t\t\t\t\t\t\t\treturned.then;\n\n\t\t\t\t\t\t\t\t\t// Handle a returned thenable\n\t\t\t\t\t\t\t\t\tif ( jQuery.isFunction( then ) ) {\n\n\t\t\t\t\t\t\t\t\t\t// Special processors (notify) just wait for resolution\n\t\t\t\t\t\t\t\t\t\tif ( special ) {\n\t\t\t\t\t\t\t\t\t\t\tthen.call(\n\t\t\t\t\t\t\t\t\t\t\t\treturned,\n\t\t\t\t\t\t\t\t\t\t\t\tresolve( maxDepth, deferred, Identity, special ),\n\t\t\t\t\t\t\t\t\t\t\t\tresolve( maxDepth, deferred, Thrower, special )\n\t\t\t\t\t\t\t\t\t\t\t);\n\n\t\t\t\t\t\t\t\t\t\t// Normal processors (resolve) also hook into progress\n\t\t\t\t\t\t\t\t\t\t} else {\n\n\t\t\t\t\t\t\t\t\t\t\t// ...and disregard older resolution values\n\t\t\t\t\t\t\t\t\t\t\tmaxDepth++;\n\n\t\t\t\t\t\t\t\t\t\t\tthen.call(\n\t\t\t\t\t\t\t\t\t\t\t\treturned,\n\t\t\t\t\t\t\t\t\t\t\t\tresolve( maxDepth, deferred, Identity, special ),\n\t\t\t\t\t\t\t\t\t\t\t\tresolve( maxDepth, deferred, Thrower, special ),\n\t\t\t\t\t\t\t\t\t\t\t\tresolve( maxDepth, deferred, Identity,\n\t\t\t\t\t\t\t\t\t\t\t\t\tdeferred.notifyWith )\n\t\t\t\t\t\t\t\t\t\t\t);\n\t\t\t\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t\t\t// Handle all other returned values\n\t\t\t\t\t\t\t\t\t} else {\n\n\t\t\t\t\t\t\t\t\t\t// Only substitute handlers pass on context\n\t\t\t\t\t\t\t\t\t\t// and multiple values (non-spec behavior)\n\t\t\t\t\t\t\t\t\t\tif ( handler !== Identity ) {\n\t\t\t\t\t\t\t\t\t\t\tthat = undefined;\n\t\t\t\t\t\t\t\t\t\t\targs = [ returned ];\n\t\t\t\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t\t\t\t// Process the value(s)\n\t\t\t\t\t\t\t\t\t\t// Default process is resolve\n\t\t\t\t\t\t\t\t\t\t( special || deferred.resolveWith )( that, args );\n\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t},\n\n\t\t\t\t\t\t\t\t// Only normal processors (resolve) catch and reject exceptions\n\t\t\t\t\t\t\t\tprocess = special ?\n\t\t\t\t\t\t\t\t\tmightThrow :\n\t\t\t\t\t\t\t\t\tfunction() {\n\t\t\t\t\t\t\t\t\t\ttry {\n\t\t\t\t\t\t\t\t\t\t\tmightThrow();\n\t\t\t\t\t\t\t\t\t\t} catch ( e ) {\n\n\t\t\t\t\t\t\t\t\t\t\tif ( jQuery.Deferred.exceptionHook ) {\n\t\t\t\t\t\t\t\t\t\t\t\tjQuery.Deferred.exceptionHook( e,\n\t\t\t\t\t\t\t\t\t\t\t\t\tprocess.stackTrace );\n\t\t\t\t\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t\t\t\t\t// Support: Promises/A+ section 2.3.3.3.4.1\n\t\t\t\t\t\t\t\t\t\t\t// https://promisesaplus.com/#point-61\n\t\t\t\t\t\t\t\t\t\t\t// Ignore post-resolution exceptions\n\t\t\t\t\t\t\t\t\t\t\tif ( depth + 1 >= maxDepth ) {\n\n\t\t\t\t\t\t\t\t\t\t\t\t// Only substitute handlers pass on context\n\t\t\t\t\t\t\t\t\t\t\t\t// and multiple values (non-spec behavior)\n\t\t\t\t\t\t\t\t\t\t\t\tif ( handler !== Thrower ) {\n\t\t\t\t\t\t\t\t\t\t\t\t\tthat = undefined;\n\t\t\t\t\t\t\t\t\t\t\t\t\targs = [ e ];\n\t\t\t\t\t\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t\t\t\t\t\tdeferred.rejectWith( that, args );\n\t\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t};\n\n\t\t\t\t\t\t\t// Support: Promises/A+ section 2.3.3.3.1\n\t\t\t\t\t\t\t// https://promisesaplus.com/#point-57\n\t\t\t\t\t\t\t// Re-resolve promises immediately to dodge false rejection from\n\t\t\t\t\t\t\t// subsequent errors\n\t\t\t\t\t\t\tif ( depth ) {\n\t\t\t\t\t\t\t\tprocess();\n\t\t\t\t\t\t\t} else {\n\n\t\t\t\t\t\t\t\t// Call an optional hook to record the stack, in case of exception\n\t\t\t\t\t\t\t\t// since it's otherwise lost when execution goes async\n\t\t\t\t\t\t\t\tif ( jQuery.Deferred.getStackHook ) {\n\t\t\t\t\t\t\t\t\tprocess.stackTrace = jQuery.Deferred.getStackHook();\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\twindow.setTimeout( process );\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t};\n\t\t\t\t\t}\n\n\t\t\t\t\treturn jQuery.Deferred( function( newDefer ) {\n\n\t\t\t\t\t\t// progress_handlers.add( ... )\n\t\t\t\t\t\ttuples[ 0 ][ 3 ].add(\n\t\t\t\t\t\t\tresolve(\n\t\t\t\t\t\t\t\t0,\n\t\t\t\t\t\t\t\tnewDefer,\n\t\t\t\t\t\t\t\tjQuery.isFunction( onProgress ) ?\n\t\t\t\t\t\t\t\t\tonProgress :\n\t\t\t\t\t\t\t\t\tIdentity,\n\t\t\t\t\t\t\t\tnewDefer.notifyWith\n\t\t\t\t\t\t\t)\n\t\t\t\t\t\t);\n\n\t\t\t\t\t\t// fulfilled_handlers.add( ... )\n\t\t\t\t\t\ttuples[ 1 ][ 3 ].add(\n\t\t\t\t\t\t\tresolve(\n\t\t\t\t\t\t\t\t0,\n\t\t\t\t\t\t\t\tnewDefer,\n\t\t\t\t\t\t\t\tjQuery.isFunction( onFulfilled ) ?\n\t\t\t\t\t\t\t\t\tonFulfilled :\n\t\t\t\t\t\t\t\t\tIdentity\n\t\t\t\t\t\t\t)\n\t\t\t\t\t\t);\n\n\t\t\t\t\t\t// rejected_handlers.add( ... )\n\t\t\t\t\t\ttuples[ 2 ][ 3 ].add(\n\t\t\t\t\t\t\tresolve(\n\t\t\t\t\t\t\t\t0,\n\t\t\t\t\t\t\t\tnewDefer,\n\t\t\t\t\t\t\t\tjQuery.isFunction( onRejected ) ?\n\t\t\t\t\t\t\t\t\tonRejected :\n\t\t\t\t\t\t\t\t\tThrower\n\t\t\t\t\t\t\t)\n\t\t\t\t\t\t);\n\t\t\t\t\t} ).promise();\n\t\t\t\t},\n\n\t\t\t\t// Get a promise for this deferred\n\t\t\t\t// If obj is provided, the promise aspect is added to the object\n\t\t\t\tpromise: function( obj ) {\n\t\t\t\t\treturn obj != null ? jQuery.extend( obj, promise ) : promise;\n\t\t\t\t}\n\t\t\t},\n\t\t\tdeferred = {};\n\n\t\t// Add list-specific methods\n\t\tjQuery.each( tuples, function( i, tuple ) {\n\t\t\tvar list = tuple[ 2 ],\n\t\t\t\tstateString = tuple[ 5 ];\n\n\t\t\t// promise.progress = list.add\n\t\t\t// promise.done = list.add\n\t\t\t// promise.fail = list.add\n\t\t\tpromise[ tuple[ 1 ] ] = list.add;\n\n\t\t\t// Handle state\n\t\t\tif ( stateString ) {\n\t\t\t\tlist.add(\n\t\t\t\t\tfunction() {\n\n\t\t\t\t\t\t// state = \"resolved\" (i.e., fulfilled)\n\t\t\t\t\t\t// state = \"rejected\"\n\t\t\t\t\t\tstate = stateString;\n\t\t\t\t\t},\n\n\t\t\t\t\t// rejected_callbacks.disable\n\t\t\t\t\t// fulfilled_callbacks.disable\n\t\t\t\t\ttuples[ 3 - i ][ 2 ].disable,\n\n\t\t\t\t\t// progress_callbacks.lock\n\t\t\t\t\ttuples[ 0 ][ 2 ].lock\n\t\t\t\t);\n\t\t\t}\n\n\t\t\t// progress_handlers.fire\n\t\t\t// fulfilled_handlers.fire\n\t\t\t// rejected_handlers.fire\n\t\t\tlist.add( tuple[ 3 ].fire );\n\n\t\t\t// deferred.notify = function() { deferred.notifyWith(...) }\n\t\t\t// deferred.resolve = function() { deferred.resolveWith(...) }\n\t\t\t// deferred.reject = function() { deferred.rejectWith(...) }\n\t\t\tdeferred[ tuple[ 0 ] ] = function() {\n\t\t\t\tdeferred[ tuple[ 0 ] + \"With\" ]( this === deferred ? undefined : this, arguments );\n\t\t\t\treturn this;\n\t\t\t};\n\n\t\t\t// deferred.notifyWith = list.fireWith\n\t\t\t// deferred.resolveWith = list.fireWith\n\t\t\t// deferred.rejectWith = list.fireWith\n\t\t\tdeferred[ tuple[ 0 ] + \"With\" ] = list.fireWith;\n\t\t} );\n\n\t\t// Make the deferred a promise\n\t\tpromise.promise( deferred );\n\n\t\t// Call given func if any\n\t\tif ( func ) {\n\t\t\tfunc.call( deferred, deferred );\n\t\t}\n\n\t\t// All done!\n\t\treturn deferred;\n\t},\n\n\t// Deferred helper\n\twhen: function( singleValue ) {\n\t\tvar\n\n\t\t\t// count of uncompleted subordinates\n\t\t\tremaining = arguments.length,\n\n\t\t\t// count of unprocessed arguments\n\t\t\ti = remaining,\n\n\t\t\t// subordinate fulfillment data\n\t\t\tresolveContexts = Array( i ),\n\t\t\tresolveValues = slice.call( arguments ),\n\n\t\t\t// the master Deferred\n\t\t\tmaster = jQuery.Deferred(),\n\n\t\t\t// subordinate callback factory\n\t\t\tupdateFunc = function( i ) {\n\t\t\t\treturn function( value ) {\n\t\t\t\t\tresolveContexts[ i ] = this;\n\t\t\t\t\tresolveValues[ i ] = arguments.length > 1 ? slice.call( arguments ) : value;\n\t\t\t\t\tif ( !( --remaining ) ) {\n\t\t\t\t\t\tmaster.resolveWith( resolveContexts, resolveValues );\n\t\t\t\t\t}\n\t\t\t\t};\n\t\t\t};\n\n\t\t// Single- and empty arguments are adopted like Promise.resolve\n\t\tif ( remaining <= 1 ) {\n\t\t\tadoptValue( singleValue, master.done( updateFunc( i ) ).resolve, master.reject );\n\n\t\t\t// Use .then() to unwrap secondary thenables (cf. gh-3000)\n\t\t\tif ( master.state() === \"pending\" ||\n\t\t\t\tjQuery.isFunction( resolveValues[ i ] && resolveValues[ i ].then ) ) {\n\n\t\t\t\treturn master.then();\n\t\t\t}\n\t\t}\n\n\t\t// Multiple arguments are aggregated like Promise.all array elements\n\t\twhile ( i-- ) {\n\t\t\tadoptValue( resolveValues[ i ], updateFunc( i ), master.reject );\n\t\t}\n\n\t\treturn master.promise();\n\t}\n} );\n\n\n// These usually indicate a programmer mistake during development,\n// warn about them ASAP rather than swallowing them by default.\nvar rerrorNames = /^(Eval|Internal|Range|Reference|Syntax|Type|URI)Error$/;\n\njQuery.Deferred.exceptionHook = function( error, stack ) {\n\n\t// Support: IE 8 - 9 only\n\t// Console exists when dev tools are open, which can happen at any time\n\tif ( window.console && window.console.warn && error && rerrorNames.test( error.name ) ) {\n\t\twindow.console.warn( \"jQuery.Deferred exception: \" + error.message, error.stack, stack );\n\t}\n};\n\n\n\n\njQuery.readyException = function( error ) {\n\twindow.setTimeout( function() {\n\t\tthrow error;\n\t} );\n};\n\n\n\n\n// The deferred used on DOM ready\nvar readyList = jQuery.Deferred();\n\njQuery.fn.ready = function( fn ) {\n\n\treadyList\n\t\t.then( fn )\n\n\t\t// Wrap jQuery.readyException in a function so that the lookup\n\t\t// happens at the time of error handling instead of callback\n\t\t// registration.\n\t\t.catch( function( error ) {\n\t\t\tjQuery.readyException( error );\n\t\t} );\n\n\treturn this;\n};\n\njQuery.extend( {\n\n\t// Is the DOM ready to be used? Set to true once it occurs.\n\tisReady: false,\n\n\t// A counter to track how many items to wait for before\n\t// the ready event fires. See #6781\n\treadyWait: 1,\n\n\t// Hold (or release) the ready event\n\tholdReady: function( hold ) {\n\t\tif ( hold ) {\n\t\t\tjQuery.readyWait++;\n\t\t} else {\n\t\t\tjQuery.ready( true );\n\t\t}\n\t},\n\n\t// Handle when the DOM is ready\n\tready: function( wait ) {\n\n\t\t// Abort if there are pending holds or we're already ready\n\t\tif ( wait === true ? --jQuery.readyWait : jQuery.isReady ) {\n\t\t\treturn;\n\t\t}\n\n\t\t// Remember that the DOM is ready\n\t\tjQuery.isReady = true;\n\n\t\t// If a normal DOM Ready event fired, decrement, and wait if need be\n\t\tif ( wait !== true && --jQuery.readyWait > 0 ) {\n\t\t\treturn;\n\t\t}\n\n\t\t// If there are functions bound, to execute\n\t\treadyList.resolveWith( document, [ jQuery ] );\n\t}\n} );\n\njQuery.ready.then = readyList.then;\n\n// The ready event handler and self cleanup method\nfunction completed() {\n\tdocument.removeEventListener( \"DOMContentLoaded\", completed );\n\twindow.removeEventListener( \"load\", completed );\n\tjQuery.ready();\n}\n\n// Catch cases where $(document).ready() is called\n// after the browser event has already occurred.\n// Support: IE <=9 - 10 only\n// Older IE sometimes signals \"interactive\" too soon\nif ( document.readyState === \"complete\" ||\n\t( document.readyState !== \"loading\" && !document.documentElement.doScroll ) ) {\n\n\t// Handle it asynchronously to allow scripts the opportunity to delay ready\n\twindow.setTimeout( jQuery.ready );\n\n} else {\n\n\t// Use the handy event callback\n\tdocument.addEventListener( \"DOMContentLoaded\", completed );\n\n\t// A fallback to window.onload, that will always work\n\twindow.addEventListener( \"load\", completed );\n}\n\n\n\n\n// Multifunctional method to get and set values of a collection\n// The value/s can optionally be executed if it's a function\nvar access = function( elems, fn, key, value, chainable, emptyGet, raw ) {\n\tvar i = 0,\n\t\tlen = elems.length,\n\t\tbulk = key == null;\n\n\t// Sets many values\n\tif ( jQuery.type( key ) === \"object\" ) {\n\t\tchainable = true;\n\t\tfor ( i in key ) {\n\t\t\taccess( elems, fn, i, key[ i ], true, emptyGet, raw );\n\t\t}\n\n\t// Sets one value\n\t} else if ( value !== undefined ) {\n\t\tchainable = true;\n\n\t\tif ( !jQuery.isFunction( value ) ) {\n\t\t\traw = true;\n\t\t}\n\n\t\tif ( bulk ) {\n\n\t\t\t// Bulk operations run against the entire set\n\t\t\tif ( raw ) {\n\t\t\t\tfn.call( elems, value );\n\t\t\t\tfn = null;\n\n\t\t\t// ...except when executing function values\n\t\t\t} else {\n\t\t\t\tbulk = fn;\n\t\t\t\tfn = function( elem, key, value ) {\n\t\t\t\t\treturn bulk.call( jQuery( elem ), value );\n\t\t\t\t};\n\t\t\t}\n\t\t}\n\n\t\tif ( fn ) {\n\t\t\tfor ( ; i < len; i++ ) {\n\t\t\t\tfn(\n\t\t\t\t\telems[ i ], key, raw ?\n\t\t\t\t\tvalue :\n\t\t\t\t\tvalue.call( elems[ i ], i, fn( elems[ i ], key ) )\n\t\t\t\t);\n\t\t\t}\n\t\t}\n\t}\n\n\tif ( chainable ) {\n\t\treturn elems;\n\t}\n\n\t// Gets\n\tif ( bulk ) {\n\t\treturn fn.call( elems );\n\t}\n\n\treturn len ? fn( elems[ 0 ], key ) : emptyGet;\n};\nvar acceptData = function( owner ) {\n\n\t// Accepts only:\n\t//  - Node\n\t//    - Node.ELEMENT_NODE\n\t//    - Node.DOCUMENT_NODE\n\t//  - Object\n\t//    - Any\n\treturn owner.nodeType === 1 || owner.nodeType === 9 || !( +owner.nodeType );\n};\n\n\n\n\nfunction Data() {\n\tthis.expando = jQuery.expando + Data.uid++;\n}\n\nData.uid = 1;\n\nData.prototype = {\n\n\tcache: function( owner ) {\n\n\t\t// Check if the owner object already has a cache\n\t\tvar value = owner[ this.expando ];\n\n\t\t// If not, create one\n\t\tif ( !value ) {\n\t\t\tvalue = {};\n\n\t\t\t// We can accept data for non-element nodes in modern browsers,\n\t\t\t// but we should not, see #8335.\n\t\t\t// Always return an empty object.\n\t\t\tif ( acceptData( owner ) ) {\n\n\t\t\t\t// If it is a node unlikely to be stringify-ed or looped over\n\t\t\t\t// use plain assignment\n\t\t\t\tif ( owner.nodeType ) {\n\t\t\t\t\towner[ this.expando ] = value;\n\n\t\t\t\t// Otherwise secure it in a non-enumerable property\n\t\t\t\t// configurable must be true to allow the property to be\n\t\t\t\t// deleted when data is removed\n\t\t\t\t} else {\n\t\t\t\t\tObject.defineProperty( owner, this.expando, {\n\t\t\t\t\t\tvalue: value,\n\t\t\t\t\t\tconfigurable: true\n\t\t\t\t\t} );\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\treturn value;\n\t},\n\tset: function( owner, data, value ) {\n\t\tvar prop,\n\t\t\tcache = this.cache( owner );\n\n\t\t// Handle: [ owner, key, value ] args\n\t\t// Always use camelCase key (gh-2257)\n\t\tif ( typeof data === \"string\" ) {\n\t\t\tcache[ jQuery.camelCase( data ) ] = value;\n\n\t\t// Handle: [ owner, { properties } ] args\n\t\t} else {\n\n\t\t\t// Copy the properties one-by-one to the cache object\n\t\t\tfor ( prop in data ) {\n\t\t\t\tcache[ jQuery.camelCase( prop ) ] = data[ prop ];\n\t\t\t}\n\t\t}\n\t\treturn cache;\n\t},\n\tget: function( owner, key ) {\n\t\treturn key === undefined ?\n\t\t\tthis.cache( owner ) :\n\n\t\t\t// Always use camelCase key (gh-2257)\n\t\t\towner[ this.expando ] && owner[ this.expando ][ jQuery.camelCase( key ) ];\n\t},\n\taccess: function( owner, key, value ) {\n\n\t\t// In cases where either:\n\t\t//\n\t\t//   1. No key was specified\n\t\t//   2. A string key was specified, but no value provided\n\t\t//\n\t\t// Take the \"read\" path and allow the get method to determine\n\t\t// which value to return, respectively either:\n\t\t//\n\t\t//   1. The entire cache object\n\t\t//   2. The data stored at the key\n\t\t//\n\t\tif ( key === undefined ||\n\t\t\t\t( ( key && typeof key === \"string\" ) && value === undefined ) ) {\n\n\t\t\treturn this.get( owner, key );\n\t\t}\n\n\t\t// When the key is not a string, or both a key and value\n\t\t// are specified, set or extend (existing objects) with either:\n\t\t//\n\t\t//   1. An object of properties\n\t\t//   2. A key and value\n\t\t//\n\t\tthis.set( owner, key, value );\n\n\t\t// Since the \"set\" path can have two possible entry points\n\t\t// return the expected data based on which path was taken[*]\n\t\treturn value !== undefined ? value : key;\n\t},\n\tremove: function( owner, key ) {\n\t\tvar i,\n\t\t\tcache = owner[ this.expando ];\n\n\t\tif ( cache === undefined ) {\n\t\t\treturn;\n\t\t}\n\n\t\tif ( key !== undefined ) {\n\n\t\t\t// Support array or space separated string of keys\n\t\t\tif ( jQuery.isArray( key ) ) {\n\n\t\t\t\t// If key is an array of keys...\n\t\t\t\t// We always set camelCase keys, so remove that.\n\t\t\t\tkey = key.map( jQuery.camelCase );\n\t\t\t} else {\n\t\t\t\tkey = jQuery.camelCase( key );\n\n\t\t\t\t// If a key with the spaces exists, use it.\n\t\t\t\t// Otherwise, create an array by matching non-whitespace\n\t\t\t\tkey = key in cache ?\n\t\t\t\t\t[ key ] :\n\t\t\t\t\t( key.match( rnothtmlwhite ) || [] );\n\t\t\t}\n\n\t\t\ti = key.length;\n\n\t\t\twhile ( i-- ) {\n\t\t\t\tdelete cache[ key[ i ] ];\n\t\t\t}\n\t\t}\n\n\t\t// Remove the expando if there's no more data\n\t\tif ( key === undefined || jQuery.isEmptyObject( cache ) ) {\n\n\t\t\t// Support: Chrome <=35 - 45\n\t\t\t// Webkit & Blink performance suffers when deleting properties\n\t\t\t// from DOM nodes, so set to undefined instead\n\t\t\t// https://bugs.chromium.org/p/chromium/issues/detail?id=378607 (bug restricted)\n\t\t\tif ( owner.nodeType ) {\n\t\t\t\towner[ this.expando ] = undefined;\n\t\t\t} else {\n\t\t\t\tdelete owner[ this.expando ];\n\t\t\t}\n\t\t}\n\t},\n\thasData: function( owner ) {\n\t\tvar cache = owner[ this.expando ];\n\t\treturn cache !== undefined && !jQuery.isEmptyObject( cache );\n\t}\n};\nvar dataPriv = new Data();\n\nvar dataUser = new Data();\n\n\n\n//\tImplementation Summary\n//\n//\t1. Enforce API surface and semantic compatibility with 1.9.x branch\n//\t2. Improve the module's maintainability by reducing the storage\n//\t\tpaths to a single mechanism.\n//\t3. Use the same single mechanism to support \"private\" and \"user\" data.\n//\t4. _Never_ expose \"private\" data to user code (TODO: Drop _data, _removeData)\n//\t5. Avoid exposing implementation details on user objects (eg. expando properties)\n//\t6. Provide a clear path for implementation upgrade to WeakMap in 2014\n\nvar rbrace = /^(?:\\{[\\w\\W]*\\}|\\[[\\w\\W]*\\])$/,\n\trmultiDash = /[A-Z]/g;\n\nfunction getData( data ) {\n\tif ( data === \"true\" ) {\n\t\treturn true;\n\t}\n\n\tif ( data === \"false\" ) {\n\t\treturn false;\n\t}\n\n\tif ( data === \"null\" ) {\n\t\treturn null;\n\t}\n\n\t// Only convert to a number if it doesn't change the string\n\tif ( data === +data + \"\" ) {\n\t\treturn +data;\n\t}\n\n\tif ( rbrace.test( data ) ) {\n\t\treturn JSON.parse( data );\n\t}\n\n\treturn data;\n}\n\nfunction dataAttr( elem, key, data ) {\n\tvar name;\n\n\t// If nothing was found internally, try to fetch any\n\t// data from the HTML5 data-* attribute\n\tif ( data === undefined && elem.nodeType === 1 ) {\n\t\tname = \"data-\" + key.replace( rmultiDash, \"-$&\" ).toLowerCase();\n\t\tdata = elem.getAttribute( name );\n\n\t\tif ( typeof data === \"string\" ) {\n\t\t\ttry {\n\t\t\t\tdata = getData( data );\n\t\t\t} catch ( e ) {}\n\n\t\t\t// Make sure we set the data so it isn't changed later\n\t\t\tdataUser.set( elem, key, data );\n\t\t} else {\n\t\t\tdata = undefined;\n\t\t}\n\t}\n\treturn data;\n}\n\njQuery.extend( {\n\thasData: function( elem ) {\n\t\treturn dataUser.hasData( elem ) || dataPriv.hasData( elem );\n\t},\n\n\tdata: function( elem, name, data ) {\n\t\treturn dataUser.access( elem, name, data );\n\t},\n\n\tremoveData: function( elem, name ) {\n\t\tdataUser.remove( elem, name );\n\t},\n\n\t// TODO: Now that all calls to _data and _removeData have been replaced\n\t// with direct calls to dataPriv methods, these can be deprecated.\n\t_data: function( elem, name, data ) {\n\t\treturn dataPriv.access( elem, name, data );\n\t},\n\n\t_removeData: function( elem, name ) {\n\t\tdataPriv.remove( elem, name );\n\t}\n} );\n\njQuery.fn.extend( {\n\tdata: function( key, value ) {\n\t\tvar i, name, data,\n\t\t\telem = this[ 0 ],\n\t\t\tattrs = elem && elem.attributes;\n\n\t\t// Gets all values\n\t\tif ( key === undefined ) {\n\t\t\tif ( this.length ) {\n\t\t\t\tdata = dataUser.get( elem );\n\n\t\t\t\tif ( elem.nodeType === 1 && !dataPriv.get( elem, \"hasDataAttrs\" ) ) {\n\t\t\t\t\ti = attrs.length;\n\t\t\t\t\twhile ( i-- ) {\n\n\t\t\t\t\t\t// Support: IE 11 only\n\t\t\t\t\t\t// The attrs elements can be null (#14894)\n\t\t\t\t\t\tif ( attrs[ i ] ) {\n\t\t\t\t\t\t\tname = attrs[ i ].name;\n\t\t\t\t\t\t\tif ( name.indexOf( \"data-\" ) === 0 ) {\n\t\t\t\t\t\t\t\tname = jQuery.camelCase( name.slice( 5 ) );\n\t\t\t\t\t\t\t\tdataAttr( elem, name, data[ name ] );\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t\tdataPriv.set( elem, \"hasDataAttrs\", true );\n\t\t\t\t}\n\t\t\t}\n\n\t\t\treturn data;\n\t\t}\n\n\t\t// Sets multiple values\n\t\tif ( typeof key === \"object\" ) {\n\t\t\treturn this.each( function() {\n\t\t\t\tdataUser.set( this, key );\n\t\t\t} );\n\t\t}\n\n\t\treturn access( this, function( value ) {\n\t\t\tvar data;\n\n\t\t\t// The calling jQuery object (element matches) is not empty\n\t\t\t// (and therefore has an element appears at this[ 0 ]) and the\n\t\t\t// `value` parameter was not undefined. An empty jQuery object\n\t\t\t// will result in `undefined` for elem = this[ 0 ] which will\n\t\t\t// throw an exception if an attempt to read a data cache is made.\n\t\t\tif ( elem && value === undefined ) {\n\n\t\t\t\t// Attempt to get data from the cache\n\t\t\t\t// The key will always be camelCased in Data\n\t\t\t\tdata = dataUser.get( elem, key );\n\t\t\t\tif ( data !== undefined ) {\n\t\t\t\t\treturn data;\n\t\t\t\t}\n\n\t\t\t\t// Attempt to \"discover\" the data in\n\t\t\t\t// HTML5 custom data-* attrs\n\t\t\t\tdata = dataAttr( elem, key );\n\t\t\t\tif ( data !== undefined ) {\n\t\t\t\t\treturn data;\n\t\t\t\t}\n\n\t\t\t\t// We tried really hard, but the data doesn't exist.\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\t// Set the data...\n\t\t\tthis.each( function() {\n\n\t\t\t\t// We always store the camelCased key\n\t\t\t\tdataUser.set( this, key, value );\n\t\t\t} );\n\t\t}, null, value, arguments.length > 1, null, true );\n\t},\n\n\tremoveData: function( key ) {\n\t\treturn this.each( function() {\n\t\t\tdataUser.remove( this, key );\n\t\t} );\n\t}\n} );\n\n\njQuery.extend( {\n\tqueue: function( elem, type, data ) {\n\t\tvar queue;\n\n\t\tif ( elem ) {\n\t\t\ttype = ( type || \"fx\" ) + \"queue\";\n\t\t\tqueue = dataPriv.get( elem, type );\n\n\t\t\t// Speed up dequeue by getting out quickly if this is just a lookup\n\t\t\tif ( data ) {\n\t\t\t\tif ( !queue || jQuery.isArray( data ) ) {\n\t\t\t\t\tqueue = dataPriv.access( elem, type, jQuery.makeArray( data ) );\n\t\t\t\t} else {\n\t\t\t\t\tqueue.push( data );\n\t\t\t\t}\n\t\t\t}\n\t\t\treturn queue || [];\n\t\t}\n\t},\n\n\tdequeue: function( elem, type ) {\n\t\ttype = type || \"fx\";\n\n\t\tvar queue = jQuery.queue( elem, type ),\n\t\t\tstartLength = queue.length,\n\t\t\tfn = queue.shift(),\n\t\t\thooks = jQuery._queueHooks( elem, type ),\n\t\t\tnext = function() {\n\t\t\t\tjQuery.dequeue( elem, type );\n\t\t\t};\n\n\t\t// If the fx queue is dequeued, always remove the progress sentinel\n\t\tif ( fn === \"inprogress\" ) {\n\t\t\tfn = queue.shift();\n\t\t\tstartLength--;\n\t\t}\n\n\t\tif ( fn ) {\n\n\t\t\t// Add a progress sentinel to prevent the fx queue from being\n\t\t\t// automatically dequeued\n\t\t\tif ( type === \"fx\" ) {\n\t\t\t\tqueue.unshift( \"inprogress\" );\n\t\t\t}\n\n\t\t\t// Clear up the last queue stop function\n\t\t\tdelete hooks.stop;\n\t\t\tfn.call( elem, next, hooks );\n\t\t}\n\n\t\tif ( !startLength && hooks ) {\n\t\t\thooks.empty.fire();\n\t\t}\n\t},\n\n\t// Not public - generate a queueHooks object, or return the current one\n\t_queueHooks: function( elem, type ) {\n\t\tvar key = type + \"queueHooks\";\n\t\treturn dataPriv.get( elem, key ) || dataPriv.access( elem, key, {\n\t\t\tempty: jQuery.Callbacks( \"once memory\" ).add( function() {\n\t\t\t\tdataPriv.remove( elem, [ type + \"queue\", key ] );\n\t\t\t} )\n\t\t} );\n\t}\n} );\n\njQuery.fn.extend( {\n\tqueue: function( type, data ) {\n\t\tvar setter = 2;\n\n\t\tif ( typeof type !== \"string\" ) {\n\t\t\tdata = type;\n\t\t\ttype = \"fx\";\n\t\t\tsetter--;\n\t\t}\n\n\t\tif ( arguments.length < setter ) {\n\t\t\treturn jQuery.queue( this[ 0 ], type );\n\t\t}\n\n\t\treturn data === undefined ?\n\t\t\tthis :\n\t\t\tthis.each( function() {\n\t\t\t\tvar queue = jQuery.queue( this, type, data );\n\n\t\t\t\t// Ensure a hooks for this queue\n\t\t\t\tjQuery._queueHooks( this, type );\n\n\t\t\t\tif ( type === \"fx\" && queue[ 0 ] !== \"inprogress\" ) {\n\t\t\t\t\tjQuery.dequeue( this, type );\n\t\t\t\t}\n\t\t\t} );\n\t},\n\tdequeue: function( type ) {\n\t\treturn this.each( function() {\n\t\t\tjQuery.dequeue( this, type );\n\t\t} );\n\t},\n\tclearQueue: function( type ) {\n\t\treturn this.queue( type || \"fx\", [] );\n\t},\n\n\t// Get a promise resolved when queues of a certain type\n\t// are emptied (fx is the type by default)\n\tpromise: function( type, obj ) {\n\t\tvar tmp,\n\t\t\tcount = 1,\n\t\t\tdefer = jQuery.Deferred(),\n\t\t\telements = this,\n\t\t\ti = this.length,\n\t\t\tresolve = function() {\n\t\t\t\tif ( !( --count ) ) {\n\t\t\t\t\tdefer.resolveWith( elements, [ elements ] );\n\t\t\t\t}\n\t\t\t};\n\n\t\tif ( typeof type !== \"string\" ) {\n\t\t\tobj = type;\n\t\t\ttype = undefined;\n\t\t}\n\t\ttype = type || \"fx\";\n\n\t\twhile ( i-- ) {\n\t\t\ttmp = dataPriv.get( elements[ i ], type + \"queueHooks\" );\n\t\t\tif ( tmp && tmp.empty ) {\n\t\t\t\tcount++;\n\t\t\t\ttmp.empty.add( resolve );\n\t\t\t}\n\t\t}\n\t\tresolve();\n\t\treturn defer.promise( obj );\n\t}\n} );\nvar pnum = ( /[+-]?(?:\\d*\\.|)\\d+(?:[eE][+-]?\\d+|)/ ).source;\n\nvar rcssNum = new RegExp( \"^(?:([+-])=|)(\" + pnum + \")([a-z%]*)$\", \"i\" );\n\n\nvar cssExpand = [ \"Top\", \"Right\", \"Bottom\", \"Left\" ];\n\nvar isHiddenWithinTree = function( elem, el ) {\n\n\t\t// isHiddenWithinTree might be called from jQuery#filter function;\n\t\t// in that case, element will be second argument\n\t\telem = el || elem;\n\n\t\t// Inline style trumps all\n\t\treturn elem.style.display === \"none\" ||\n\t\t\telem.style.display === \"\" &&\n\n\t\t\t// Otherwise, check computed style\n\t\t\t// Support: Firefox <=43 - 45\n\t\t\t// Disconnected elements can have computed display: none, so first confirm that elem is\n\t\t\t// in the document.\n\t\t\tjQuery.contains( elem.ownerDocument, elem ) &&\n\n\t\t\tjQuery.css( elem, \"display\" ) === \"none\";\n\t};\n\nvar swap = function( elem, options, callback, args ) {\n\tvar ret, name,\n\t\told = {};\n\n\t// Remember the old values, and insert the new ones\n\tfor ( name in options ) {\n\t\told[ name ] = elem.style[ name ];\n\t\telem.style[ name ] = options[ name ];\n\t}\n\n\tret = callback.apply( elem, args || [] );\n\n\t// Revert the old values\n\tfor ( name in options ) {\n\t\telem.style[ name ] = old[ name ];\n\t}\n\n\treturn ret;\n};\n\n\n\n\nfunction adjustCSS( elem, prop, valueParts, tween ) {\n\tvar adjusted,\n\t\tscale = 1,\n\t\tmaxIterations = 20,\n\t\tcurrentValue = tween ?\n\t\t\tfunction() {\n\t\t\t\treturn tween.cur();\n\t\t\t} :\n\t\t\tfunction() {\n\t\t\t\treturn jQuery.css( elem, prop, \"\" );\n\t\t\t},\n\t\tinitial = currentValue(),\n\t\tunit = valueParts && valueParts[ 3 ] || ( jQuery.cssNumber[ prop ] ? \"\" : \"px\" ),\n\n\t\t// Starting value computation is required for potential unit mismatches\n\t\tinitialInUnit = ( jQuery.cssNumber[ prop ] || unit !== \"px\" && +initial ) &&\n\t\t\trcssNum.exec( jQuery.css( elem, prop ) );\n\n\tif ( initialInUnit && initialInUnit[ 3 ] !== unit ) {\n\n\t\t// Trust units reported by jQuery.css\n\t\tunit = unit || initialInUnit[ 3 ];\n\n\t\t// Make sure we update the tween properties later on\n\t\tvalueParts = valueParts || [];\n\n\t\t// Iteratively approximate from a nonzero starting point\n\t\tinitialInUnit = +initial || 1;\n\n\t\tdo {\n\n\t\t\t// If previous iteration zeroed out, double until we get *something*.\n\t\t\t// Use string for doubling so we don't accidentally see scale as unchanged below\n\t\t\tscale = scale || \".5\";\n\n\t\t\t// Adjust and apply\n\t\t\tinitialInUnit = initialInUnit / scale;\n\t\t\tjQuery.style( elem, prop, initialInUnit + unit );\n\n\t\t// Update scale, tolerating zero or NaN from tween.cur()\n\t\t// Break the loop if scale is unchanged or perfect, or if we've just had enough.\n\t\t} while (\n\t\t\tscale !== ( scale = currentValue() / initial ) && scale !== 1 && --maxIterations\n\t\t);\n\t}\n\n\tif ( valueParts ) {\n\t\tinitialInUnit = +initialInUnit || +initial || 0;\n\n\t\t// Apply relative offset (+=/-=) if specified\n\t\tadjusted = valueParts[ 1 ] ?\n\t\t\tinitialInUnit + ( valueParts[ 1 ] + 1 ) * valueParts[ 2 ] :\n\t\t\t+valueParts[ 2 ];\n\t\tif ( tween ) {\n\t\t\ttween.unit = unit;\n\t\t\ttween.start = initialInUnit;\n\t\t\ttween.end = adjusted;\n\t\t}\n\t}\n\treturn adjusted;\n}\n\n\nvar defaultDisplayMap = {};\n\nfunction getDefaultDisplay( elem ) {\n\tvar temp,\n\t\tdoc = elem.ownerDocument,\n\t\tnodeName = elem.nodeName,\n\t\tdisplay = defaultDisplayMap[ nodeName ];\n\n\tif ( display ) {\n\t\treturn display;\n\t}\n\n\ttemp = doc.body.appendChild( doc.createElement( nodeName ) );\n\tdisplay = jQuery.css( temp, \"display\" );\n\n\ttemp.parentNode.removeChild( temp );\n\n\tif ( display === \"none\" ) {\n\t\tdisplay = \"block\";\n\t}\n\tdefaultDisplayMap[ nodeName ] = display;\n\n\treturn display;\n}\n\nfunction showHide( elements, show ) {\n\tvar display, elem,\n\t\tvalues = [],\n\t\tindex = 0,\n\t\tlength = elements.length;\n\n\t// Determine new display value for elements that need to change\n\tfor ( ; index < length; index++ ) {\n\t\telem = elements[ index ];\n\t\tif ( !elem.style ) {\n\t\t\tcontinue;\n\t\t}\n\n\t\tdisplay = elem.style.display;\n\t\tif ( show ) {\n\n\t\t\t// Since we force visibility upon cascade-hidden elements, an immediate (and slow)\n\t\t\t// check is required in this first loop unless we have a nonempty display value (either\n\t\t\t// inline or about-to-be-restored)\n\t\t\tif ( display === \"none\" ) {\n\t\t\t\tvalues[ index ] = dataPriv.get( elem, \"display\" ) || null;\n\t\t\t\tif ( !values[ index ] ) {\n\t\t\t\t\telem.style.display = \"\";\n\t\t\t\t}\n\t\t\t}\n\t\t\tif ( elem.style.display === \"\" && isHiddenWithinTree( elem ) ) {\n\t\t\t\tvalues[ index ] = getDefaultDisplay( elem );\n\t\t\t}\n\t\t} else {\n\t\t\tif ( display !== \"none\" ) {\n\t\t\t\tvalues[ index ] = \"none\";\n\n\t\t\t\t// Remember what we're overwriting\n\t\t\t\tdataPriv.set( elem, \"display\", display );\n\t\t\t}\n\t\t}\n\t}\n\n\t// Set the display of the elements in a second loop to avoid constant reflow\n\tfor ( index = 0; index < length; index++ ) {\n\t\tif ( values[ index ] != null ) {\n\t\t\telements[ index ].style.display = values[ index ];\n\t\t}\n\t}\n\n\treturn elements;\n}\n\njQuery.fn.extend( {\n\tshow: function() {\n\t\treturn showHide( this, true );\n\t},\n\thide: function() {\n\t\treturn showHide( this );\n\t},\n\ttoggle: function( state ) {\n\t\tif ( typeof state === \"boolean\" ) {\n\t\t\treturn state ? this.show() : this.hide();\n\t\t}\n\n\t\treturn this.each( function() {\n\t\t\tif ( isHiddenWithinTree( this ) ) {\n\t\t\t\tjQuery( this ).show();\n\t\t\t} else {\n\t\t\t\tjQuery( this ).hide();\n\t\t\t}\n\t\t} );\n\t}\n} );\nvar rcheckableType = ( /^(?:checkbox|radio)$/i );\n\nvar rtagName = ( /<([a-z][^\\/\\0>\\x20\\t\\r\\n\\f]+)/i );\n\nvar rscriptType = ( /^$|\\/(?:java|ecma)script/i );\n\n\n\n// We have to close these tags to support XHTML (#13200)\nvar wrapMap = {\n\n\t// Support: IE <=9 only\n\toption: [ 1, \"<select multiple='multiple'>\", \"</select>\" ],\n\n\t// XHTML parsers do not magically insert elements in the\n\t// same way that tag soup parsers do. So we cannot shorten\n\t// this by omitting <tbody> or other required elements.\n\tthead: [ 1, \"<table>\", \"</table>\" ],\n\tcol: [ 2, \"<table><colgroup>\", \"</colgroup></table>\" ],\n\ttr: [ 2, \"<table><tbody>\", \"</tbody></table>\" ],\n\ttd: [ 3, \"<table><tbody><tr>\", \"</tr></tbody></table>\" ],\n\n\t_default: [ 0, \"\", \"\" ]\n};\n\n// Support: IE <=9 only\nwrapMap.optgroup = wrapMap.option;\n\nwrapMap.tbody = wrapMap.tfoot = wrapMap.colgroup = wrapMap.caption = wrapMap.thead;\nwrapMap.th = wrapMap.td;\n\n\nfunction getAll( context, tag ) {\n\n\t// Support: IE <=9 - 11 only\n\t// Use typeof to avoid zero-argument method invocation on host objects (#15151)\n\tvar ret;\n\n\tif ( typeof context.getElementsByTagName !== \"undefined\" ) {\n\t\tret = context.getElementsByTagName( tag || \"*\" );\n\n\t} else if ( typeof context.querySelectorAll !== \"undefined\" ) {\n\t\tret = context.querySelectorAll( tag || \"*\" );\n\n\t} else {\n\t\tret = [];\n\t}\n\n\tif ( tag === undefined || tag && jQuery.nodeName( context, tag ) ) {\n\t\treturn jQuery.merge( [ context ], ret );\n\t}\n\n\treturn ret;\n}\n\n\n// Mark scripts as having already been evaluated\nfunction setGlobalEval( elems, refElements ) {\n\tvar i = 0,\n\t\tl = elems.length;\n\n\tfor ( ; i < l; i++ ) {\n\t\tdataPriv.set(\n\t\t\telems[ i ],\n\t\t\t\"globalEval\",\n\t\t\t!refElements || dataPriv.get( refElements[ i ], \"globalEval\" )\n\t\t);\n\t}\n}\n\n\nvar rhtml = /<|&#?\\w+;/;\n\nfunction buildFragment( elems, context, scripts, selection, ignored ) {\n\tvar elem, tmp, tag, wrap, contains, j,\n\t\tfragment = context.createDocumentFragment(),\n\t\tnodes = [],\n\t\ti = 0,\n\t\tl = elems.length;\n\n\tfor ( ; i < l; i++ ) {\n\t\telem = elems[ i ];\n\n\t\tif ( elem || elem === 0 ) {\n\n\t\t\t// Add nodes directly\n\t\t\tif ( jQuery.type( elem ) === \"object\" ) {\n\n\t\t\t\t// Support: Android <=4.0 only, PhantomJS 1 only\n\t\t\t\t// push.apply(_, arraylike) throws on ancient WebKit\n\t\t\t\tjQuery.merge( nodes, elem.nodeType ? [ elem ] : elem );\n\n\t\t\t// Convert non-html into a text node\n\t\t\t} else if ( !rhtml.test( elem ) ) {\n\t\t\t\tnodes.push( context.createTextNode( elem ) );\n\n\t\t\t// Convert html into DOM nodes\n\t\t\t} else {\n\t\t\t\ttmp = tmp || fragment.appendChild( context.createElement( \"div\" ) );\n\n\t\t\t\t// Deserialize a standard representation\n\t\t\t\ttag = ( rtagName.exec( elem ) || [ \"\", \"\" ] )[ 1 ].toLowerCase();\n\t\t\t\twrap = wrapMap[ tag ] || wrapMap._default;\n\t\t\t\ttmp.innerHTML = wrap[ 1 ] + jQuery.htmlPrefilter( elem ) + wrap[ 2 ];\n\n\t\t\t\t// Descend through wrappers to the right content\n\t\t\t\tj = wrap[ 0 ];\n\t\t\t\twhile ( j-- ) {\n\t\t\t\t\ttmp = tmp.lastChild;\n\t\t\t\t}\n\n\t\t\t\t// Support: Android <=4.0 only, PhantomJS 1 only\n\t\t\t\t// push.apply(_, arraylike) throws on ancient WebKit\n\t\t\t\tjQuery.merge( nodes, tmp.childNodes );\n\n\t\t\t\t// Remember the top-level container\n\t\t\t\ttmp = fragment.firstChild;\n\n\t\t\t\t// Ensure the created nodes are orphaned (#12392)\n\t\t\t\ttmp.textContent = \"\";\n\t\t\t}\n\t\t}\n\t}\n\n\t// Remove wrapper from fragment\n\tfragment.textContent = \"\";\n\n\ti = 0;\n\twhile ( ( elem = nodes[ i++ ] ) ) {\n\n\t\t// Skip elements already in the context collection (trac-4087)\n\t\tif ( selection && jQuery.inArray( elem, selection ) > -1 ) {\n\t\t\tif ( ignored ) {\n\t\t\t\tignored.push( elem );\n\t\t\t}\n\t\t\tcontinue;\n\t\t}\n\n\t\tcontains = jQuery.contains( elem.ownerDocument, elem );\n\n\t\t// Append to fragment\n\t\ttmp = getAll( fragment.appendChild( elem ), \"script\" );\n\n\t\t// Preserve script evaluation history\n\t\tif ( contains ) {\n\t\t\tsetGlobalEval( tmp );\n\t\t}\n\n\t\t// Capture executables\n\t\tif ( scripts ) {\n\t\t\tj = 0;\n\t\t\twhile ( ( elem = tmp[ j++ ] ) ) {\n\t\t\t\tif ( rscriptType.test( elem.type || \"\" ) ) {\n\t\t\t\t\tscripts.push( elem );\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\n\treturn fragment;\n}\n\n\n( function() {\n\tvar fragment = document.createDocumentFragment(),\n\t\tdiv = fragment.appendChild( document.createElement( \"div\" ) ),\n\t\tinput = document.createElement( \"input\" );\n\n\t// Support: Android 4.0 - 4.3 only\n\t// Check state lost if the name is set (#11217)\n\t// Support: Windows Web Apps (WWA)\n\t// `name` and `type` must use .setAttribute for WWA (#14901)\n\tinput.setAttribute( \"type\", \"radio\" );\n\tinput.setAttribute( \"checked\", \"checked\" );\n\tinput.setAttribute( \"name\", \"t\" );\n\n\tdiv.appendChild( input );\n\n\t// Support: Android <=4.1 only\n\t// Older WebKit doesn't clone checked state correctly in fragments\n\tsupport.checkClone = div.cloneNode( true ).cloneNode( true ).lastChild.checked;\n\n\t// Support: IE <=11 only\n\t// Make sure textarea (and checkbox) defaultValue is properly cloned\n\tdiv.innerHTML = \"<textarea>x</textarea>\";\n\tsupport.noCloneChecked = !!div.cloneNode( true ).lastChild.defaultValue;\n} )();\nvar documentElement = document.documentElement;\n\n\n\nvar\n\trkeyEvent = /^key/,\n\trmouseEvent = /^(?:mouse|pointer|contextmenu|drag|drop)|click/,\n\trtypenamespace = /^([^.]*)(?:\\.(.+)|)/;\n\nfunction returnTrue() {\n\treturn true;\n}\n\nfunction returnFalse() {\n\treturn false;\n}\n\n// Support: IE <=9 only\n// See #13393 for more info\nfunction safeActiveElement() {\n\ttry {\n\t\treturn document.activeElement;\n\t} catch ( err ) { }\n}\n\nfunction on( elem, types, selector, data, fn, one ) {\n\tvar origFn, type;\n\n\t// Types can be a map of types/handlers\n\tif ( typeof types === \"object\" ) {\n\n\t\t// ( types-Object, selector, data )\n\t\tif ( typeof selector !== \"string\" ) {\n\n\t\t\t// ( types-Object, data )\n\t\t\tdata = data || selector;\n\t\t\tselector = undefined;\n\t\t}\n\t\tfor ( type in types ) {\n\t\t\ton( elem, type, selector, data, types[ type ], one );\n\t\t}\n\t\treturn elem;\n\t}\n\n\tif ( data == null && fn == null ) {\n\n\t\t// ( types, fn )\n\t\tfn = selector;\n\t\tdata = selector = undefined;\n\t} else if ( fn == null ) {\n\t\tif ( typeof selector === \"string\" ) {\n\n\t\t\t// ( types, selector, fn )\n\t\t\tfn = data;\n\t\t\tdata = undefined;\n\t\t} else {\n\n\t\t\t// ( types, data, fn )\n\t\t\tfn = data;\n\t\t\tdata = selector;\n\t\t\tselector = undefined;\n\t\t}\n\t}\n\tif ( fn === false ) {\n\t\tfn = returnFalse;\n\t} else if ( !fn ) {\n\t\treturn elem;\n\t}\n\n\tif ( one === 1 ) {\n\t\torigFn = fn;\n\t\tfn = function( event ) {\n\n\t\t\t// Can use an empty set, since event contains the info\n\t\t\tjQuery().off( event );\n\t\t\treturn origFn.apply( this, arguments );\n\t\t};\n\n\t\t// Use same guid so caller can remove using origFn\n\t\tfn.guid = origFn.guid || ( origFn.guid = jQuery.guid++ );\n\t}\n\treturn elem.each( function() {\n\t\tjQuery.event.add( this, types, fn, data, selector );\n\t} );\n}\n\n/*\n * Helper functions for managing events -- not part of the public interface.\n * Props to Dean Edwards' addEvent library for many of the ideas.\n */\njQuery.event = {\n\n\tglobal: {},\n\n\tadd: function( elem, types, handler, data, selector ) {\n\n\t\tvar handleObjIn, eventHandle, tmp,\n\t\t\tevents, t, handleObj,\n\t\t\tspecial, handlers, type, namespaces, origType,\n\t\t\telemData = dataPriv.get( elem );\n\n\t\t// Don't attach events to noData or text/comment nodes (but allow plain objects)\n\t\tif ( !elemData ) {\n\t\t\treturn;\n\t\t}\n\n\t\t// Caller can pass in an object of custom data in lieu of the handler\n\t\tif ( handler.handler ) {\n\t\t\thandleObjIn = handler;\n\t\t\thandler = handleObjIn.handler;\n\t\t\tselector = handleObjIn.selector;\n\t\t}\n\n\t\t// Ensure that invalid selectors throw exceptions at attach time\n\t\t// Evaluate against documentElement in case elem is a non-element node (e.g., document)\n\t\tif ( selector ) {\n\t\t\tjQuery.find.matchesSelector( documentElement, selector );\n\t\t}\n\n\t\t// Make sure that the handler has a unique ID, used to find/remove it later\n\t\tif ( !handler.guid ) {\n\t\t\thandler.guid = jQuery.guid++;\n\t\t}\n\n\t\t// Init the element's event structure and main handler, if this is the first\n\t\tif ( !( events = elemData.events ) ) {\n\t\t\tevents = elemData.events = {};\n\t\t}\n\t\tif ( !( eventHandle = elemData.handle ) ) {\n\t\t\teventHandle = elemData.handle = function( e ) {\n\n\t\t\t\t// Discard the second event of a jQuery.event.trigger() and\n\t\t\t\t// when an event is called after a page has unloaded\n\t\t\t\treturn typeof jQuery !== \"undefined\" && jQuery.event.triggered !== e.type ?\n\t\t\t\t\tjQuery.event.dispatch.apply( elem, arguments ) : undefined;\n\t\t\t};\n\t\t}\n\n\t\t// Handle multiple events separated by a space\n\t\ttypes = ( types || \"\" ).match( rnothtmlwhite ) || [ \"\" ];\n\t\tt = types.length;\n\t\twhile ( t-- ) {\n\t\t\ttmp = rtypenamespace.exec( types[ t ] ) || [];\n\t\t\ttype = origType = tmp[ 1 ];\n\t\t\tnamespaces = ( tmp[ 2 ] || \"\" ).split( \".\" ).sort();\n\n\t\t\t// There *must* be a type, no attaching namespace-only handlers\n\t\t\tif ( !type ) {\n\t\t\t\tcontinue;\n\t\t\t}\n\n\t\t\t// If event changes its type, use the special event handlers for the changed type\n\t\t\tspecial = jQuery.event.special[ type ] || {};\n\n\t\t\t// If selector defined, determine special event api type, otherwise given type\n\t\t\ttype = ( selector ? special.delegateType : special.bindType ) || type;\n\n\t\t\t// Update special based on newly reset type\n\t\t\tspecial = jQuery.event.special[ type ] || {};\n\n\t\t\t// handleObj is passed to all event handlers\n\t\t\thandleObj = jQuery.extend( {\n\t\t\t\ttype: type,\n\t\t\t\torigType: origType,\n\t\t\t\tdata: data,\n\t\t\t\thandler: handler,\n\t\t\t\tguid: handler.guid,\n\t\t\t\tselector: selector,\n\t\t\t\tneedsContext: selector && jQuery.expr.match.needsContext.test( selector ),\n\t\t\t\tnamespace: namespaces.join( \".\" )\n\t\t\t}, handleObjIn );\n\n\t\t\t// Init the event handler queue if we're the first\n\t\t\tif ( !( handlers = events[ type ] ) ) {\n\t\t\t\thandlers = events[ type ] = [];\n\t\t\t\thandlers.delegateCount = 0;\n\n\t\t\t\t// Only use addEventListener if the special events handler returns false\n\t\t\t\tif ( !special.setup ||\n\t\t\t\t\tspecial.setup.call( elem, data, namespaces, eventHandle ) === false ) {\n\n\t\t\t\t\tif ( elem.addEventListener ) {\n\t\t\t\t\t\telem.addEventListener( type, eventHandle );\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tif ( special.add ) {\n\t\t\t\tspecial.add.call( elem, handleObj );\n\n\t\t\t\tif ( !handleObj.handler.guid ) {\n\t\t\t\t\thandleObj.handler.guid = handler.guid;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t// Add to the element's handler list, delegates in front\n\t\t\tif ( selector ) {\n\t\t\t\thandlers.splice( handlers.delegateCount++, 0, handleObj );\n\t\t\t} else {\n\t\t\t\thandlers.push( handleObj );\n\t\t\t}\n\n\t\t\t// Keep track of which events have ever been used, for event optimization\n\t\t\tjQuery.event.global[ type ] = true;\n\t\t}\n\n\t},\n\n\t// Detach an event or set of events from an element\n\tremove: function( elem, types, handler, selector, mappedTypes ) {\n\n\t\tvar j, origCount, tmp,\n\t\t\tevents, t, handleObj,\n\t\t\tspecial, handlers, type, namespaces, origType,\n\t\t\telemData = dataPriv.hasData( elem ) && dataPriv.get( elem );\n\n\t\tif ( !elemData || !( events = elemData.events ) ) {\n\t\t\treturn;\n\t\t}\n\n\t\t// Once for each type.namespace in types; type may be omitted\n\t\ttypes = ( types || \"\" ).match( rnothtmlwhite ) || [ \"\" ];\n\t\tt = types.length;\n\t\twhile ( t-- ) {\n\t\t\ttmp = rtypenamespace.exec( types[ t ] ) || [];\n\t\t\ttype = origType = tmp[ 1 ];\n\t\t\tnamespaces = ( tmp[ 2 ] || \"\" ).split( \".\" ).sort();\n\n\t\t\t// Unbind all events (on this namespace, if provided) for the element\n\t\t\tif ( !type ) {\n\t\t\t\tfor ( type in events ) {\n\t\t\t\t\tjQuery.event.remove( elem, type + types[ t ], handler, selector, true );\n\t\t\t\t}\n\t\t\t\tcontinue;\n\t\t\t}\n\n\t\t\tspecial = jQuery.event.special[ type ] || {};\n\t\t\ttype = ( selector ? special.delegateType : special.bindType ) || type;\n\t\t\thandlers = events[ type ] || [];\n\t\t\ttmp = tmp[ 2 ] &&\n\t\t\t\tnew RegExp( \"(^|\\\\.)\" + namespaces.join( \"\\\\.(?:.*\\\\.|)\" ) + \"(\\\\.|$)\" );\n\n\t\t\t// Remove matching events\n\t\t\torigCount = j = handlers.length;\n\t\t\twhile ( j-- ) {\n\t\t\t\thandleObj = handlers[ j ];\n\n\t\t\t\tif ( ( mappedTypes || origType === handleObj.origType ) &&\n\t\t\t\t\t( !handler || handler.guid === handleObj.guid ) &&\n\t\t\t\t\t( !tmp || tmp.test( handleObj.namespace ) ) &&\n\t\t\t\t\t( !selector || selector === handleObj.selector ||\n\t\t\t\t\t\tselector === \"**\" && handleObj.selector ) ) {\n\t\t\t\t\thandlers.splice( j, 1 );\n\n\t\t\t\t\tif ( handleObj.selector ) {\n\t\t\t\t\t\thandlers.delegateCount--;\n\t\t\t\t\t}\n\t\t\t\t\tif ( special.remove ) {\n\t\t\t\t\t\tspecial.remove.call( elem, handleObj );\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t// Remove generic event handler if we removed something and no more handlers exist\n\t\t\t// (avoids potential for endless recursion during removal of special event handlers)\n\t\t\tif ( origCount && !handlers.length ) {\n\t\t\t\tif ( !special.teardown ||\n\t\t\t\t\tspecial.teardown.call( elem, namespaces, elemData.handle ) === false ) {\n\n\t\t\t\t\tjQuery.removeEvent( elem, type, elemData.handle );\n\t\t\t\t}\n\n\t\t\t\tdelete events[ type ];\n\t\t\t}\n\t\t}\n\n\t\t// Remove data and the expando if it's no longer used\n\t\tif ( jQuery.isEmptyObject( events ) ) {\n\t\t\tdataPriv.remove( elem, \"handle events\" );\n\t\t}\n\t},\n\n\tdispatch: function( nativeEvent ) {\n\n\t\t// Make a writable jQuery.Event from the native event object\n\t\tvar event = jQuery.event.fix( nativeEvent );\n\n\t\tvar i, j, ret, matched, handleObj, handlerQueue,\n\t\t\targs = new Array( arguments.length ),\n\t\t\thandlers = ( dataPriv.get( this, \"events\" ) || {} )[ event.type ] || [],\n\t\t\tspecial = jQuery.event.special[ event.type ] || {};\n\n\t\t// Use the fix-ed jQuery.Event rather than the (read-only) native event\n\t\targs[ 0 ] = event;\n\n\t\tfor ( i = 1; i < arguments.length; i++ ) {\n\t\t\targs[ i ] = arguments[ i ];\n\t\t}\n\n\t\tevent.delegateTarget = this;\n\n\t\t// Call the preDispatch hook for the mapped type, and let it bail if desired\n\t\tif ( special.preDispatch && special.preDispatch.call( this, event ) === false ) {\n\t\t\treturn;\n\t\t}\n\n\t\t// Determine handlers\n\t\thandlerQueue = jQuery.event.handlers.call( this, event, handlers );\n\n\t\t// Run delegates first; they may want to stop propagation beneath us\n\t\ti = 0;\n\t\twhile ( ( matched = handlerQueue[ i++ ] ) && !event.isPropagationStopped() ) {\n\t\t\tevent.currentTarget = matched.elem;\n\n\t\t\tj = 0;\n\t\t\twhile ( ( handleObj = matched.handlers[ j++ ] ) &&\n\t\t\t\t!event.isImmediatePropagationStopped() ) {\n\n\t\t\t\t// Triggered event must either 1) have no namespace, or 2) have namespace(s)\n\t\t\t\t// a subset or equal to those in the bound event (both can have no namespace).\n\t\t\t\tif ( !event.rnamespace || event.rnamespace.test( handleObj.namespace ) ) {\n\n\t\t\t\t\tevent.handleObj = handleObj;\n\t\t\t\t\tevent.data = handleObj.data;\n\n\t\t\t\t\tret = ( ( jQuery.event.special[ handleObj.origType ] || {} ).handle ||\n\t\t\t\t\t\thandleObj.handler ).apply( matched.elem, args );\n\n\t\t\t\t\tif ( ret !== undefined ) {\n\t\t\t\t\t\tif ( ( event.result = ret ) === false ) {\n\t\t\t\t\t\t\tevent.preventDefault();\n\t\t\t\t\t\t\tevent.stopPropagation();\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\t// Call the postDispatch hook for the mapped type\n\t\tif ( special.postDispatch ) {\n\t\t\tspecial.postDispatch.call( this, event );\n\t\t}\n\n\t\treturn event.result;\n\t},\n\n\thandlers: function( event, handlers ) {\n\t\tvar i, handleObj, sel, matchedHandlers, matchedSelectors,\n\t\t\thandlerQueue = [],\n\t\t\tdelegateCount = handlers.delegateCount,\n\t\t\tcur = event.target;\n\n\t\t// Find delegate handlers\n\t\tif ( delegateCount &&\n\n\t\t\t// Support: IE <=9\n\t\t\t// Black-hole SVG <use> instance trees (trac-13180)\n\t\t\tcur.nodeType &&\n\n\t\t\t// Support: Firefox <=42\n\t\t\t// Suppress spec-violating clicks indicating a non-primary pointer button (trac-3861)\n\t\t\t// https://www.w3.org/TR/DOM-Level-3-Events/#event-type-click\n\t\t\t// Support: IE 11 only\n\t\t\t// ...but not arrow key \"clicks\" of radio inputs, which can have `button` -1 (gh-2343)\n\t\t\t!( event.type === \"click\" && event.button >= 1 ) ) {\n\n\t\t\tfor ( ; cur !== this; cur = cur.parentNode || this ) {\n\n\t\t\t\t// Don't check non-elements (#13208)\n\t\t\t\t// Don't process clicks on disabled elements (#6911, #8165, #11382, #11764)\n\t\t\t\tif ( cur.nodeType === 1 && !( event.type === \"click\" && cur.disabled === true ) ) {\n\t\t\t\t\tmatchedHandlers = [];\n\t\t\t\t\tmatchedSelectors = {};\n\t\t\t\t\tfor ( i = 0; i < delegateCount; i++ ) {\n\t\t\t\t\t\thandleObj = handlers[ i ];\n\n\t\t\t\t\t\t// Don't conflict with Object.prototype properties (#13203)\n\t\t\t\t\t\tsel = handleObj.selector + \" \";\n\n\t\t\t\t\t\tif ( matchedSelectors[ sel ] === undefined ) {\n\t\t\t\t\t\t\tmatchedSelectors[ sel ] = handleObj.needsContext ?\n\t\t\t\t\t\t\t\tjQuery( sel, this ).index( cur ) > -1 :\n\t\t\t\t\t\t\t\tjQuery.find( sel, this, null, [ cur ] ).length;\n\t\t\t\t\t\t}\n\t\t\t\t\t\tif ( matchedSelectors[ sel ] ) {\n\t\t\t\t\t\t\tmatchedHandlers.push( handleObj );\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t\tif ( matchedHandlers.length ) {\n\t\t\t\t\t\thandlerQueue.push( { elem: cur, handlers: matchedHandlers } );\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\t// Add the remaining (directly-bound) handlers\n\t\tcur = this;\n\t\tif ( delegateCount < handlers.length ) {\n\t\t\thandlerQueue.push( { elem: cur, handlers: handlers.slice( delegateCount ) } );\n\t\t}\n\n\t\treturn handlerQueue;\n\t},\n\n\taddProp: function( name, hook ) {\n\t\tObject.defineProperty( jQuery.Event.prototype, name, {\n\t\t\tenumerable: true,\n\t\t\tconfigurable: true,\n\n\t\t\tget: jQuery.isFunction( hook ) ?\n\t\t\t\tfunction() {\n\t\t\t\t\tif ( this.originalEvent ) {\n\t\t\t\t\t\t\treturn hook( this.originalEvent );\n\t\t\t\t\t}\n\t\t\t\t} :\n\t\t\t\tfunction() {\n\t\t\t\t\tif ( this.originalEvent ) {\n\t\t\t\t\t\t\treturn this.originalEvent[ name ];\n\t\t\t\t\t}\n\t\t\t\t},\n\n\t\t\tset: function( value ) {\n\t\t\t\tObject.defineProperty( this, name, {\n\t\t\t\t\tenumerable: true,\n\t\t\t\t\tconfigurable: true,\n\t\t\t\t\twritable: true,\n\t\t\t\t\tvalue: value\n\t\t\t\t} );\n\t\t\t}\n\t\t} );\n\t},\n\n\tfix: function( originalEvent ) {\n\t\treturn originalEvent[ jQuery.expando ] ?\n\t\t\toriginalEvent :\n\t\t\tnew jQuery.Event( originalEvent );\n\t},\n\n\tspecial: {\n\t\tload: {\n\n\t\t\t// Prevent triggered image.load events from bubbling to window.load\n\t\t\tnoBubble: true\n\t\t},\n\t\tfocus: {\n\n\t\t\t// Fire native event if possible so blur/focus sequence is correct\n\t\t\ttrigger: function() {\n\t\t\t\tif ( this !== safeActiveElement() && this.focus ) {\n\t\t\t\t\tthis.focus();\n\t\t\t\t\treturn false;\n\t\t\t\t}\n\t\t\t},\n\t\t\tdelegateType: \"focusin\"\n\t\t},\n\t\tblur: {\n\t\t\ttrigger: function() {\n\t\t\t\tif ( this === safeActiveElement() && this.blur ) {\n\t\t\t\t\tthis.blur();\n\t\t\t\t\treturn false;\n\t\t\t\t}\n\t\t\t},\n\t\t\tdelegateType: \"focusout\"\n\t\t},\n\t\tclick: {\n\n\t\t\t// For checkbox, fire native event so checked state will be right\n\t\t\ttrigger: function() {\n\t\t\t\tif ( this.type === \"checkbox\" && this.click && jQuery.nodeName( this, \"input\" ) ) {\n\t\t\t\t\tthis.click();\n\t\t\t\t\treturn false;\n\t\t\t\t}\n\t\t\t},\n\n\t\t\t// For cross-browser consistency, don't fire native .click() on links\n\t\t\t_default: function( event ) {\n\t\t\t\treturn jQuery.nodeName( event.target, \"a\" );\n\t\t\t}\n\t\t},\n\n\t\tbeforeunload: {\n\t\t\tpostDispatch: function( event ) {\n\n\t\t\t\t// Support: Firefox 20+\n\t\t\t\t// Firefox doesn't alert if the returnValue field is not set.\n\t\t\t\tif ( event.result !== undefined && event.originalEvent ) {\n\t\t\t\t\tevent.originalEvent.returnValue = event.result;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n};\n\njQuery.removeEvent = function( elem, type, handle ) {\n\n\t// This \"if\" is needed for plain objects\n\tif ( elem.removeEventListener ) {\n\t\telem.removeEventListener( type, handle );\n\t}\n};\n\njQuery.Event = function( src, props ) {\n\n\t// Allow instantiation without the 'new' keyword\n\tif ( !( this instanceof jQuery.Event ) ) {\n\t\treturn new jQuery.Event( src, props );\n\t}\n\n\t// Event object\n\tif ( src && src.type ) {\n\t\tthis.originalEvent = src;\n\t\tthis.type = src.type;\n\n\t\t// Events bubbling up the document may have been marked as prevented\n\t\t// by a handler lower down the tree; reflect the correct value.\n\t\tthis.isDefaultPrevented = src.defaultPrevented ||\n\t\t\t\tsrc.defaultPrevented === undefined &&\n\n\t\t\t\t// Support: Android <=2.3 only\n\t\t\t\tsrc.returnValue === false ?\n\t\t\treturnTrue :\n\t\t\treturnFalse;\n\n\t\t// Create target properties\n\t\t// Support: Safari <=6 - 7 only\n\t\t// Target should not be a text node (#504, #13143)\n\t\tthis.target = ( src.target && src.target.nodeType === 3 ) ?\n\t\t\tsrc.target.parentNode :\n\t\t\tsrc.target;\n\n\t\tthis.currentTarget = src.currentTarget;\n\t\tthis.relatedTarget = src.relatedTarget;\n\n\t// Event type\n\t} else {\n\t\tthis.type = src;\n\t}\n\n\t// Put explicitly provided properties onto the event object\n\tif ( props ) {\n\t\tjQuery.extend( this, props );\n\t}\n\n\t// Create a timestamp if incoming event doesn't have one\n\tthis.timeStamp = src && src.timeStamp || jQuery.now();\n\n\t// Mark it as fixed\n\tthis[ jQuery.expando ] = true;\n};\n\n// jQuery.Event is based on DOM3 Events as specified by the ECMAScript Language Binding\n// https://www.w3.org/TR/2003/WD-DOM-Level-3-Events-20030331/ecma-script-binding.html\njQuery.Event.prototype = {\n\tconstructor: jQuery.Event,\n\tisDefaultPrevented: returnFalse,\n\tisPropagationStopped: returnFalse,\n\tisImmediatePropagationStopped: returnFalse,\n\tisSimulated: false,\n\n\tpreventDefault: function() {\n\t\tvar e = this.originalEvent;\n\n\t\tthis.isDefaultPrevented = returnTrue;\n\n\t\tif ( e && !this.isSimulated ) {\n\t\t\te.preventDefault();\n\t\t}\n\t},\n\tstopPropagation: function() {\n\t\tvar e = this.originalEvent;\n\n\t\tthis.isPropagationStopped = returnTrue;\n\n\t\tif ( e && !this.isSimulated ) {\n\t\t\te.stopPropagation();\n\t\t}\n\t},\n\tstopImmediatePropagation: function() {\n\t\tvar e = this.originalEvent;\n\n\t\tthis.isImmediatePropagationStopped = returnTrue;\n\n\t\tif ( e && !this.isSimulated ) {\n\t\t\te.stopImmediatePropagation();\n\t\t}\n\n\t\tthis.stopPropagation();\n\t}\n};\n\n// Includes all common event props including KeyEvent and MouseEvent specific props\njQuery.each( {\n\taltKey: true,\n\tbubbles: true,\n\tcancelable: true,\n\tchangedTouches: true,\n\tctrlKey: true,\n\tdetail: true,\n\teventPhase: true,\n\tmetaKey: true,\n\tpageX: true,\n\tpageY: true,\n\tshiftKey: true,\n\tview: true,\n\t\"char\": true,\n\tcharCode: true,\n\tkey: true,\n\tkeyCode: true,\n\tbutton: true,\n\tbuttons: true,\n\tclientX: true,\n\tclientY: true,\n\toffsetX: true,\n\toffsetY: true,\n\tpointerId: true,\n\tpointerType: true,\n\tscreenX: true,\n\tscreenY: true,\n\ttargetTouches: true,\n\ttoElement: true,\n\ttouches: true,\n\n\twhich: function( event ) {\n\t\tvar button = event.button;\n\n\t\t// Add which for key events\n\t\tif ( event.which == null && rkeyEvent.test( event.type ) ) {\n\t\t\treturn event.charCode != null ? event.charCode : event.keyCode;\n\t\t}\n\n\t\t// Add which for click: 1 === left; 2 === middle; 3 === right\n\t\tif ( !event.which && button !== undefined && rmouseEvent.test( event.type ) ) {\n\t\t\tif ( button & 1 ) {\n\t\t\t\treturn 1;\n\t\t\t}\n\n\t\t\tif ( button & 2 ) {\n\t\t\t\treturn 3;\n\t\t\t}\n\n\t\t\tif ( button & 4 ) {\n\t\t\t\treturn 2;\n\t\t\t}\n\n\t\t\treturn 0;\n\t\t}\n\n\t\treturn event.which;\n\t}\n}, jQuery.event.addProp );\n\n// Create mouseenter/leave events using mouseover/out and event-time checks\n// so that event delegation works in jQuery.\n// Do the same for pointerenter/pointerleave and pointerover/pointerout\n//\n// Support: Safari 7 only\n// Safari sends mouseenter too often; see:\n// https://bugs.chromium.org/p/chromium/issues/detail?id=470258\n// for the description of the bug (it existed in older Chrome versions as well).\njQuery.each( {\n\tmouseenter: \"mouseover\",\n\tmouseleave: \"mouseout\",\n\tpointerenter: \"pointerover\",\n\tpointerleave: \"pointerout\"\n}, function( orig, fix ) {\n\tjQuery.event.special[ orig ] = {\n\t\tdelegateType: fix,\n\t\tbindType: fix,\n\n\t\thandle: function( event ) {\n\t\t\tvar ret,\n\t\t\t\ttarget = this,\n\t\t\t\trelated = event.relatedTarget,\n\t\t\t\thandleObj = event.handleObj;\n\n\t\t\t// For mouseenter/leave call the handler if related is outside the target.\n\t\t\t// NB: No relatedTarget if the mouse left/entered the browser window\n\t\t\tif ( !related || ( related !== target && !jQuery.contains( target, related ) ) ) {\n\t\t\t\tevent.type = handleObj.origType;\n\t\t\t\tret = handleObj.handler.apply( this, arguments );\n\t\t\t\tevent.type = fix;\n\t\t\t}\n\t\t\treturn ret;\n\t\t}\n\t};\n} );\n\njQuery.fn.extend( {\n\n\ton: function( types, selector, data, fn ) {\n\t\treturn on( this, types, selector, data, fn );\n\t},\n\tone: function( types, selector, data, fn ) {\n\t\treturn on( this, types, selector, data, fn, 1 );\n\t},\n\toff: function( types, selector, fn ) {\n\t\tvar handleObj, type;\n\t\tif ( types && types.preventDefault && types.handleObj ) {\n\n\t\t\t// ( event )  dispatched jQuery.Event\n\t\t\thandleObj = types.handleObj;\n\t\t\tjQuery( types.delegateTarget ).off(\n\t\t\t\thandleObj.namespace ?\n\t\t\t\t\thandleObj.origType + \".\" + handleObj.namespace :\n\t\t\t\t\thandleObj.origType,\n\t\t\t\thandleObj.selector,\n\t\t\t\thandleObj.handler\n\t\t\t);\n\t\t\treturn this;\n\t\t}\n\t\tif ( typeof types === \"object\" ) {\n\n\t\t\t// ( types-object [, selector] )\n\t\t\tfor ( type in types ) {\n\t\t\t\tthis.off( type, selector, types[ type ] );\n\t\t\t}\n\t\t\treturn this;\n\t\t}\n\t\tif ( selector === false || typeof selector === \"function\" ) {\n\n\t\t\t// ( types [, fn] )\n\t\t\tfn = selector;\n\t\t\tselector = undefined;\n\t\t}\n\t\tif ( fn === false ) {\n\t\t\tfn = returnFalse;\n\t\t}\n\t\treturn this.each( function() {\n\t\t\tjQuery.event.remove( this, types, fn, selector );\n\t\t} );\n\t}\n} );\n\n\nvar\n\n\t/* eslint-disable max-len */\n\n\t// See https://github.com/eslint/eslint/issues/3229\n\trxhtmlTag = /<(?!area|br|col|embed|hr|img|input|link|meta|param)(([a-z][^\\/\\0>\\x20\\t\\r\\n\\f]*)[^>]*)\\/>/gi,\n\n\t/* eslint-enable */\n\n\t// Support: IE <=10 - 11, Edge 12 - 13\n\t// In IE/Edge using regex groups here causes severe slowdowns.\n\t// See https://connect.microsoft.com/IE/feedback/details/1736512/\n\trnoInnerhtml = /<script|<style|<link/i,\n\n\t// checked=\"checked\" or checked\n\trchecked = /checked\\s*(?:[^=]|=\\s*.checked.)/i,\n\trscriptTypeMasked = /^true\\/(.*)/,\n\trcleanScript = /^\\s*<!(?:\\[CDATA\\[|--)|(?:\\]\\]|--)>\\s*$/g;\n\nfunction manipulationTarget( elem, content ) {\n\tif ( jQuery.nodeName( elem, \"table\" ) &&\n\t\tjQuery.nodeName( content.nodeType !== 11 ? content : content.firstChild, \"tr\" ) ) {\n\n\t\treturn elem.getElementsByTagName( \"tbody\" )[ 0 ] || elem;\n\t}\n\n\treturn elem;\n}\n\n// Replace/restore the type attribute of script elements for safe DOM manipulation\nfunction disableScript( elem ) {\n\telem.type = ( elem.getAttribute( \"type\" ) !== null ) + \"/\" + elem.type;\n\treturn elem;\n}\nfunction restoreScript( elem ) {\n\tvar match = rscriptTypeMasked.exec( elem.type );\n\n\tif ( match ) {\n\t\telem.type = match[ 1 ];\n\t} else {\n\t\telem.removeAttribute( \"type\" );\n\t}\n\n\treturn elem;\n}\n\nfunction cloneCopyEvent( src, dest ) {\n\tvar i, l, type, pdataOld, pdataCur, udataOld, udataCur, events;\n\n\tif ( dest.nodeType !== 1 ) {\n\t\treturn;\n\t}\n\n\t// 1. Copy private data: events, handlers, etc.\n\tif ( dataPriv.hasData( src ) ) {\n\t\tpdataOld = dataPriv.access( src );\n\t\tpdataCur = dataPriv.set( dest, pdataOld );\n\t\tevents = pdataOld.events;\n\n\t\tif ( events ) {\n\t\t\tdelete pdataCur.handle;\n\t\t\tpdataCur.events = {};\n\n\t\t\tfor ( type in events ) {\n\t\t\t\tfor ( i = 0, l = events[ type ].length; i < l; i++ ) {\n\t\t\t\t\tjQuery.event.add( dest, type, events[ type ][ i ] );\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\n\t// 2. Copy user data\n\tif ( dataUser.hasData( src ) ) {\n\t\tudataOld = dataUser.access( src );\n\t\tudataCur = jQuery.extend( {}, udataOld );\n\n\t\tdataUser.set( dest, udataCur );\n\t}\n}\n\n// Fix IE bugs, see support tests\nfunction fixInput( src, dest ) {\n\tvar nodeName = dest.nodeName.toLowerCase();\n\n\t// Fails to persist the checked state of a cloned checkbox or radio button.\n\tif ( nodeName === \"input\" && rcheckableType.test( src.type ) ) {\n\t\tdest.checked = src.checked;\n\n\t// Fails to return the selected option to the default selected state when cloning options\n\t} else if ( nodeName === \"input\" || nodeName === \"textarea\" ) {\n\t\tdest.defaultValue = src.defaultValue;\n\t}\n}\n\nfunction domManip( collection, args, callback, ignored ) {\n\n\t// Flatten any nested arrays\n\targs = concat.apply( [], args );\n\n\tvar fragment, first, scripts, hasScripts, node, doc,\n\t\ti = 0,\n\t\tl = collection.length,\n\t\tiNoClone = l - 1,\n\t\tvalue = args[ 0 ],\n\t\tisFunction = jQuery.isFunction( value );\n\n\t// We can't cloneNode fragments that contain checked, in WebKit\n\tif ( isFunction ||\n\t\t\t( l > 1 && typeof value === \"string\" &&\n\t\t\t\t!support.checkClone && rchecked.test( value ) ) ) {\n\t\treturn collection.each( function( index ) {\n\t\t\tvar self = collection.eq( index );\n\t\t\tif ( isFunction ) {\n\t\t\t\targs[ 0 ] = value.call( this, index, self.html() );\n\t\t\t}\n\t\t\tdomManip( self, args, callback, ignored );\n\t\t} );\n\t}\n\n\tif ( l ) {\n\t\tfragment = buildFragment( args, collection[ 0 ].ownerDocument, false, collection, ignored );\n\t\tfirst = fragment.firstChild;\n\n\t\tif ( fragment.childNodes.length === 1 ) {\n\t\t\tfragment = first;\n\t\t}\n\n\t\t// Require either new content or an interest in ignored elements to invoke the callback\n\t\tif ( first || ignored ) {\n\t\t\tscripts = jQuery.map( getAll( fragment, \"script\" ), disableScript );\n\t\t\thasScripts = scripts.length;\n\n\t\t\t// Use the original fragment for the last item\n\t\t\t// instead of the first because it can end up\n\t\t\t// being emptied incorrectly in certain situations (#8070).\n\t\t\tfor ( ; i < l; i++ ) {\n\t\t\t\tnode = fragment;\n\n\t\t\t\tif ( i !== iNoClone ) {\n\t\t\t\t\tnode = jQuery.clone( node, true, true );\n\n\t\t\t\t\t// Keep references to cloned scripts for later restoration\n\t\t\t\t\tif ( hasScripts ) {\n\n\t\t\t\t\t\t// Support: Android <=4.0 only, PhantomJS 1 only\n\t\t\t\t\t\t// push.apply(_, arraylike) throws on ancient WebKit\n\t\t\t\t\t\tjQuery.merge( scripts, getAll( node, \"script\" ) );\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\tcallback.call( collection[ i ], node, i );\n\t\t\t}\n\n\t\t\tif ( hasScripts ) {\n\t\t\t\tdoc = scripts[ scripts.length - 1 ].ownerDocument;\n\n\t\t\t\t// Reenable scripts\n\t\t\t\tjQuery.map( scripts, restoreScript );\n\n\t\t\t\t// Evaluate executable scripts on first document insertion\n\t\t\t\tfor ( i = 0; i < hasScripts; i++ ) {\n\t\t\t\t\tnode = scripts[ i ];\n\t\t\t\t\tif ( rscriptType.test( node.type || \"\" ) &&\n\t\t\t\t\t\t!dataPriv.access( node, \"globalEval\" ) &&\n\t\t\t\t\t\tjQuery.contains( doc, node ) ) {\n\n\t\t\t\t\t\tif ( node.src ) {\n\n\t\t\t\t\t\t\t// Optional AJAX dependency, but won't run scripts if not present\n\t\t\t\t\t\t\tif ( jQuery._evalUrl ) {\n\t\t\t\t\t\t\t\tjQuery._evalUrl( node.src );\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\tDOMEval( node.textContent.replace( rcleanScript, \"\" ), doc );\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\n\treturn collection;\n}\n\nfunction remove( elem, selector, keepData ) {\n\tvar node,\n\t\tnodes = selector ? jQuery.filter( selector, elem ) : elem,\n\t\ti = 0;\n\n\tfor ( ; ( node = nodes[ i ] ) != null; i++ ) {\n\t\tif ( !keepData && node.nodeType === 1 ) {\n\t\t\tjQuery.cleanData( getAll( node ) );\n\t\t}\n\n\t\tif ( node.parentNode ) {\n\t\t\tif ( keepData && jQuery.contains( node.ownerDocument, node ) ) {\n\t\t\t\tsetGlobalEval( getAll( node, \"script\" ) );\n\t\t\t}\n\t\t\tnode.parentNode.removeChild( node );\n\t\t}\n\t}\n\n\treturn elem;\n}\n\njQuery.extend( {\n\thtmlPrefilter: function( html ) {\n\t\treturn html.replace( rxhtmlTag, \"<$1></$2>\" );\n\t},\n\n\tclone: function( elem, dataAndEvents, deepDataAndEvents ) {\n\t\tvar i, l, srcElements, destElements,\n\t\t\tclone = elem.cloneNode( true ),\n\t\t\tinPage = jQuery.contains( elem.ownerDocument, elem );\n\n\t\t// Fix IE cloning issues\n\t\tif ( !support.noCloneChecked && ( elem.nodeType === 1 || elem.nodeType === 11 ) &&\n\t\t\t\t!jQuery.isXMLDoc( elem ) ) {\n\n\t\t\t// We eschew Sizzle here for performance reasons: https://jsperf.com/getall-vs-sizzle/2\n\t\t\tdestElements = getAll( clone );\n\t\t\tsrcElements = getAll( elem );\n\n\t\t\tfor ( i = 0, l = srcElements.length; i < l; i++ ) {\n\t\t\t\tfixInput( srcElements[ i ], destElements[ i ] );\n\t\t\t}\n\t\t}\n\n\t\t// Copy the events from the original to the clone\n\t\tif ( dataAndEvents ) {\n\t\t\tif ( deepDataAndEvents ) {\n\t\t\t\tsrcElements = srcElements || getAll( elem );\n\t\t\t\tdestElements = destElements || getAll( clone );\n\n\t\t\t\tfor ( i = 0, l = srcElements.length; i < l; i++ ) {\n\t\t\t\t\tcloneCopyEvent( srcElements[ i ], destElements[ i ] );\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\tcloneCopyEvent( elem, clone );\n\t\t\t}\n\t\t}\n\n\t\t// Preserve script evaluation history\n\t\tdestElements = getAll( clone, \"script\" );\n\t\tif ( destElements.length > 0 ) {\n\t\t\tsetGlobalEval( destElements, !inPage && getAll( elem, \"script\" ) );\n\t\t}\n\n\t\t// Return the cloned set\n\t\treturn clone;\n\t},\n\n\tcleanData: function( elems ) {\n\t\tvar data, elem, type,\n\t\t\tspecial = jQuery.event.special,\n\t\t\ti = 0;\n\n\t\tfor ( ; ( elem = elems[ i ] ) !== undefined; i++ ) {\n\t\t\tif ( acceptData( elem ) ) {\n\t\t\t\tif ( ( data = elem[ dataPriv.expando ] ) ) {\n\t\t\t\t\tif ( data.events ) {\n\t\t\t\t\t\tfor ( type in data.events ) {\n\t\t\t\t\t\t\tif ( special[ type ] ) {\n\t\t\t\t\t\t\t\tjQuery.event.remove( elem, type );\n\n\t\t\t\t\t\t\t// This is a shortcut to avoid jQuery.event.remove's overhead\n\t\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\t\tjQuery.removeEvent( elem, type, data.handle );\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\n\t\t\t\t\t// Support: Chrome <=35 - 45+\n\t\t\t\t\t// Assign undefined instead of using delete, see Data#remove\n\t\t\t\t\telem[ dataPriv.expando ] = undefined;\n\t\t\t\t}\n\t\t\t\tif ( elem[ dataUser.expando ] ) {\n\n\t\t\t\t\t// Support: Chrome <=35 - 45+\n\t\t\t\t\t// Assign undefined instead of using delete, see Data#remove\n\t\t\t\t\telem[ dataUser.expando ] = undefined;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n} );\n\njQuery.fn.extend( {\n\tdetach: function( selector ) {\n\t\treturn remove( this, selector, true );\n\t},\n\n\tremove: function( selector ) {\n\t\treturn remove( this, selector );\n\t},\n\n\ttext: function( value ) {\n\t\treturn access( this, function( value ) {\n\t\t\treturn value === undefined ?\n\t\t\t\tjQuery.text( this ) :\n\t\t\t\tthis.empty().each( function() {\n\t\t\t\t\tif ( this.nodeType === 1 || this.nodeType === 11 || this.nodeType === 9 ) {\n\t\t\t\t\t\tthis.textContent = value;\n\t\t\t\t\t}\n\t\t\t\t} );\n\t\t}, null, value, arguments.length );\n\t},\n\n\tappend: function() {\n\t\treturn domManip( this, arguments, function( elem ) {\n\t\t\tif ( this.nodeType === 1 || this.nodeType === 11 || this.nodeType === 9 ) {\n\t\t\t\tvar target = manipulationTarget( this, elem );\n\t\t\t\ttarget.appendChild( elem );\n\t\t\t}\n\t\t} );\n\t},\n\n\tprepend: function() {\n\t\treturn domManip( this, arguments, function( elem ) {\n\t\t\tif ( this.nodeType === 1 || this.nodeType === 11 || this.nodeType === 9 ) {\n\t\t\t\tvar target = manipulationTarget( this, elem );\n\t\t\t\ttarget.insertBefore( elem, target.firstChild );\n\t\t\t}\n\t\t} );\n\t},\n\n\tbefore: function() {\n\t\treturn domManip( this, arguments, function( elem ) {\n\t\t\tif ( this.parentNode ) {\n\t\t\t\tthis.parentNode.insertBefore( elem, this );\n\t\t\t}\n\t\t} );\n\t},\n\n\tafter: function() {\n\t\treturn domManip( this, arguments, function( elem ) {\n\t\t\tif ( this.parentNode ) {\n\t\t\t\tthis.parentNode.insertBefore( elem, this.nextSibling );\n\t\t\t}\n\t\t} );\n\t},\n\n\tempty: function() {\n\t\tvar elem,\n\t\t\ti = 0;\n\n\t\tfor ( ; ( elem = this[ i ] ) != null; i++ ) {\n\t\t\tif ( elem.nodeType === 1 ) {\n\n\t\t\t\t// Prevent memory leaks\n\t\t\t\tjQuery.cleanData( getAll( elem, false ) );\n\n\t\t\t\t// Remove any remaining nodes\n\t\t\t\telem.textContent = \"\";\n\t\t\t}\n\t\t}\n\n\t\treturn this;\n\t},\n\n\tclone: function( dataAndEvents, deepDataAndEvents ) {\n\t\tdataAndEvents = dataAndEvents == null ? false : dataAndEvents;\n\t\tdeepDataAndEvents = deepDataAndEvents == null ? dataAndEvents : deepDataAndEvents;\n\n\t\treturn this.map( function() {\n\t\t\treturn jQuery.clone( this, dataAndEvents, deepDataAndEvents );\n\t\t} );\n\t},\n\n\thtml: function( value ) {\n\t\treturn access( this, function( value ) {\n\t\t\tvar elem = this[ 0 ] || {},\n\t\t\t\ti = 0,\n\t\t\t\tl = this.length;\n\n\t\t\tif ( value === undefined && elem.nodeType === 1 ) {\n\t\t\t\treturn elem.innerHTML;\n\t\t\t}\n\n\t\t\t// See if we can take a shortcut and just use innerHTML\n\t\t\tif ( typeof value === \"string\" && !rnoInnerhtml.test( value ) &&\n\t\t\t\t!wrapMap[ ( rtagName.exec( value ) || [ \"\", \"\" ] )[ 1 ].toLowerCase() ] ) {\n\n\t\t\t\tvalue = jQuery.htmlPrefilter( value );\n\n\t\t\t\ttry {\n\t\t\t\t\tfor ( ; i < l; i++ ) {\n\t\t\t\t\t\telem = this[ i ] || {};\n\n\t\t\t\t\t\t// Remove element nodes and prevent memory leaks\n\t\t\t\t\t\tif ( elem.nodeType === 1 ) {\n\t\t\t\t\t\t\tjQuery.cleanData( getAll( elem, false ) );\n\t\t\t\t\t\t\telem.innerHTML = value;\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\n\t\t\t\t\telem = 0;\n\n\t\t\t\t// If using innerHTML throws an exception, use the fallback method\n\t\t\t\t} catch ( e ) {}\n\t\t\t}\n\n\t\t\tif ( elem ) {\n\t\t\t\tthis.empty().append( value );\n\t\t\t}\n\t\t}, null, value, arguments.length );\n\t},\n\n\treplaceWith: function() {\n\t\tvar ignored = [];\n\n\t\t// Make the changes, replacing each non-ignored context element with the new content\n\t\treturn domManip( this, arguments, function( elem ) {\n\t\t\tvar parent = this.parentNode;\n\n\t\t\tif ( jQuery.inArray( this, ignored ) < 0 ) {\n\t\t\t\tjQuery.cleanData( getAll( this ) );\n\t\t\t\tif ( parent ) {\n\t\t\t\t\tparent.replaceChild( elem, this );\n\t\t\t\t}\n\t\t\t}\n\n\t\t// Force callback invocation\n\t\t}, ignored );\n\t}\n} );\n\njQuery.each( {\n\tappendTo: \"append\",\n\tprependTo: \"prepend\",\n\tinsertBefore: \"before\",\n\tinsertAfter: \"after\",\n\treplaceAll: \"replaceWith\"\n}, function( name, original ) {\n\tjQuery.fn[ name ] = function( selector ) {\n\t\tvar elems,\n\t\t\tret = [],\n\t\t\tinsert = jQuery( selector ),\n\t\t\tlast = insert.length - 1,\n\t\t\ti = 0;\n\n\t\tfor ( ; i <= last; i++ ) {\n\t\t\telems = i === last ? this : this.clone( true );\n\t\t\tjQuery( insert[ i ] )[ original ]( elems );\n\n\t\t\t// Support: Android <=4.0 only, PhantomJS 1 only\n\t\t\t// .get() because push.apply(_, arraylike) throws on ancient WebKit\n\t\t\tpush.apply( ret, elems.get() );\n\t\t}\n\n\t\treturn this.pushStack( ret );\n\t};\n} );\nvar rmargin = ( /^margin/ );\n\nvar rnumnonpx = new RegExp( \"^(\" + pnum + \")(?!px)[a-z%]+$\", \"i\" );\n\nvar getStyles = function( elem ) {\n\n\t\t// Support: IE <=11 only, Firefox <=30 (#15098, #14150)\n\t\t// IE throws on elements created in popups\n\t\t// FF meanwhile throws on frame elements through \"defaultView.getComputedStyle\"\n\t\tvar view = elem.ownerDocument.defaultView;\n\n\t\tif ( !view || !view.opener ) {\n\t\t\tview = window;\n\t\t}\n\n\t\treturn view.getComputedStyle( elem );\n\t};\n\n\n\n( function() {\n\n\t// Executing both pixelPosition & boxSizingReliable tests require only one layout\n\t// so they're executed at the same time to save the second computation.\n\tfunction computeStyleTests() {\n\n\t\t// This is a singleton, we need to execute it only once\n\t\tif ( !div ) {\n\t\t\treturn;\n\t\t}\n\n\t\tdiv.style.cssText =\n\t\t\t\"box-sizing:border-box;\" +\n\t\t\t\"position:relative;display:block;\" +\n\t\t\t\"margin:auto;border:1px;padding:1px;\" +\n\t\t\t\"top:1%;width:50%\";\n\t\tdiv.innerHTML = \"\";\n\t\tdocumentElement.appendChild( container );\n\n\t\tvar divStyle = window.getComputedStyle( div );\n\t\tpixelPositionVal = divStyle.top !== \"1%\";\n\n\t\t// Support: Android 4.0 - 4.3 only, Firefox <=3 - 44\n\t\treliableMarginLeftVal = divStyle.marginLeft === \"2px\";\n\t\tboxSizingReliableVal = divStyle.width === \"4px\";\n\n\t\t// Support: Android 4.0 - 4.3 only\n\t\t// Some styles come back with percentage values, even though they shouldn't\n\t\tdiv.style.marginRight = \"50%\";\n\t\tpixelMarginRightVal = divStyle.marginRight === \"4px\";\n\n\t\tdocumentElement.removeChild( container );\n\n\t\t// Nullify the div so it wouldn't be stored in the memory and\n\t\t// it will also be a sign that checks already performed\n\t\tdiv = null;\n\t}\n\n\tvar pixelPositionVal, boxSizingReliableVal, pixelMarginRightVal, reliableMarginLeftVal,\n\t\tcontainer = document.createElement( \"div\" ),\n\t\tdiv = document.createElement( \"div\" );\n\n\t// Finish early in limited (non-browser) environments\n\tif ( !div.style ) {\n\t\treturn;\n\t}\n\n\t// Support: IE <=9 - 11 only\n\t// Style of cloned element affects source element cloned (#8908)\n\tdiv.style.backgroundClip = \"content-box\";\n\tdiv.cloneNode( true ).style.backgroundClip = \"\";\n\tsupport.clearCloneStyle = div.style.backgroundClip === \"content-box\";\n\n\tcontainer.style.cssText = \"border:0;width:8px;height:0;top:0;left:-9999px;\" +\n\t\t\"padding:0;margin-top:1px;position:absolute\";\n\tcontainer.appendChild( div );\n\n\tjQuery.extend( support, {\n\t\tpixelPosition: function() {\n\t\t\tcomputeStyleTests();\n\t\t\treturn pixelPositionVal;\n\t\t},\n\t\tboxSizingReliable: function() {\n\t\t\tcomputeStyleTests();\n\t\t\treturn boxSizingReliableVal;\n\t\t},\n\t\tpixelMarginRight: function() {\n\t\t\tcomputeStyleTests();\n\t\t\treturn pixelMarginRightVal;\n\t\t},\n\t\treliableMarginLeft: function() {\n\t\t\tcomputeStyleTests();\n\t\t\treturn reliableMarginLeftVal;\n\t\t}\n\t} );\n} )();\n\n\nfunction curCSS( elem, name, computed ) {\n\tvar width, minWidth, maxWidth, ret,\n\t\tstyle = elem.style;\n\n\tcomputed = computed || getStyles( elem );\n\n\t// Support: IE <=9 only\n\t// getPropertyValue is only needed for .css('filter') (#12537)\n\tif ( computed ) {\n\t\tret = computed.getPropertyValue( name ) || computed[ name ];\n\n\t\tif ( ret === \"\" && !jQuery.contains( elem.ownerDocument, elem ) ) {\n\t\t\tret = jQuery.style( elem, name );\n\t\t}\n\n\t\t// A tribute to the \"awesome hack by Dean Edwards\"\n\t\t// Android Browser returns percentage for some values,\n\t\t// but width seems to be reliably pixels.\n\t\t// This is against the CSSOM draft spec:\n\t\t// https://drafts.csswg.org/cssom/#resolved-values\n\t\tif ( !support.pixelMarginRight() && rnumnonpx.test( ret ) && rmargin.test( name ) ) {\n\n\t\t\t// Remember the original values\n\t\t\twidth = style.width;\n\t\t\tminWidth = style.minWidth;\n\t\t\tmaxWidth = style.maxWidth;\n\n\t\t\t// Put in the new values to get a computed value out\n\t\t\tstyle.minWidth = style.maxWidth = style.width = ret;\n\t\t\tret = computed.width;\n\n\t\t\t// Revert the changed values\n\t\t\tstyle.width = width;\n\t\t\tstyle.minWidth = minWidth;\n\t\t\tstyle.maxWidth = maxWidth;\n\t\t}\n\t}\n\n\treturn ret !== undefined ?\n\n\t\t// Support: IE <=9 - 11 only\n\t\t// IE returns zIndex value as an integer.\n\t\tret + \"\" :\n\t\tret;\n}\n\n\nfunction addGetHookIf( conditionFn, hookFn ) {\n\n\t// Define the hook, we'll check on the first run if it's really needed.\n\treturn {\n\t\tget: function() {\n\t\t\tif ( conditionFn() ) {\n\n\t\t\t\t// Hook not needed (or it's not possible to use it due\n\t\t\t\t// to missing dependency), remove it.\n\t\t\t\tdelete this.get;\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\t// Hook needed; redefine it so that the support test is not executed again.\n\t\t\treturn ( this.get = hookFn ).apply( this, arguments );\n\t\t}\n\t};\n}\n\n\nvar\n\n\t// Swappable if display is none or starts with table\n\t// except \"table\", \"table-cell\", or \"table-caption\"\n\t// See here for display values: https://developer.mozilla.org/en-US/docs/CSS/display\n\trdisplayswap = /^(none|table(?!-c[ea]).+)/,\n\tcssShow = { position: \"absolute\", visibility: \"hidden\", display: \"block\" },\n\tcssNormalTransform = {\n\t\tletterSpacing: \"0\",\n\t\tfontWeight: \"400\"\n\t},\n\n\tcssPrefixes = [ \"Webkit\", \"Moz\", \"ms\" ],\n\temptyStyle = document.createElement( \"div\" ).style;\n\n// Return a css property mapped to a potentially vendor prefixed property\nfunction vendorPropName( name ) {\n\n\t// Shortcut for names that are not vendor prefixed\n\tif ( name in emptyStyle ) {\n\t\treturn name;\n\t}\n\n\t// Check for vendor prefixed names\n\tvar capName = name[ 0 ].toUpperCase() + name.slice( 1 ),\n\t\ti = cssPrefixes.length;\n\n\twhile ( i-- ) {\n\t\tname = cssPrefixes[ i ] + capName;\n\t\tif ( name in emptyStyle ) {\n\t\t\treturn name;\n\t\t}\n\t}\n}\n\nfunction setPositiveNumber( elem, value, subtract ) {\n\n\t// Any relative (+/-) values have already been\n\t// normalized at this point\n\tvar matches = rcssNum.exec( value );\n\treturn matches ?\n\n\t\t// Guard against undefined \"subtract\", e.g., when used as in cssHooks\n\t\tMath.max( 0, matches[ 2 ] - ( subtract || 0 ) ) + ( matches[ 3 ] || \"px\" ) :\n\t\tvalue;\n}\n\nfunction augmentWidthOrHeight( elem, name, extra, isBorderBox, styles ) {\n\tvar i,\n\t\tval = 0;\n\n\t// If we already have the right measurement, avoid augmentation\n\tif ( extra === ( isBorderBox ? \"border\" : \"content\" ) ) {\n\t\ti = 4;\n\n\t// Otherwise initialize for horizontal or vertical properties\n\t} else {\n\t\ti = name === \"width\" ? 1 : 0;\n\t}\n\n\tfor ( ; i < 4; i += 2 ) {\n\n\t\t// Both box models exclude margin, so add it if we want it\n\t\tif ( extra === \"margin\" ) {\n\t\t\tval += jQuery.css( elem, extra + cssExpand[ i ], true, styles );\n\t\t}\n\n\t\tif ( isBorderBox ) {\n\n\t\t\t// border-box includes padding, so remove it if we want content\n\t\t\tif ( extra === \"content\" ) {\n\t\t\t\tval -= jQuery.css( elem, \"padding\" + cssExpand[ i ], true, styles );\n\t\t\t}\n\n\t\t\t// At this point, extra isn't border nor margin, so remove border\n\t\t\tif ( extra !== \"margin\" ) {\n\t\t\t\tval -= jQuery.css( elem, \"border\" + cssExpand[ i ] + \"Width\", true, styles );\n\t\t\t}\n\t\t} else {\n\n\t\t\t// At this point, extra isn't content, so add padding\n\t\t\tval += jQuery.css( elem, \"padding\" + cssExpand[ i ], true, styles );\n\n\t\t\t// At this point, extra isn't content nor padding, so add border\n\t\t\tif ( extra !== \"padding\" ) {\n\t\t\t\tval += jQuery.css( elem, \"border\" + cssExpand[ i ] + \"Width\", true, styles );\n\t\t\t}\n\t\t}\n\t}\n\n\treturn val;\n}\n\nfunction getWidthOrHeight( elem, name, extra ) {\n\n\t// Start with offset property, which is equivalent to the border-box value\n\tvar val,\n\t\tvalueIsBorderBox = true,\n\t\tstyles = getStyles( elem ),\n\t\tisBorderBox = jQuery.css( elem, \"boxSizing\", false, styles ) === \"border-box\";\n\n\t// Support: IE <=11 only\n\t// Running getBoundingClientRect on a disconnected node\n\t// in IE throws an error.\n\tif ( elem.getClientRects().length ) {\n\t\tval = elem.getBoundingClientRect()[ name ];\n\t}\n\n\t// Some non-html elements return undefined for offsetWidth, so check for null/undefined\n\t// svg - https://bugzilla.mozilla.org/show_bug.cgi?id=649285\n\t// MathML - https://bugzilla.mozilla.org/show_bug.cgi?id=491668\n\tif ( val <= 0 || val == null ) {\n\n\t\t// Fall back to computed then uncomputed css if necessary\n\t\tval = curCSS( elem, name, styles );\n\t\tif ( val < 0 || val == null ) {\n\t\t\tval = elem.style[ name ];\n\t\t}\n\n\t\t// Computed unit is not pixels. Stop here and return.\n\t\tif ( rnumnonpx.test( val ) ) {\n\t\t\treturn val;\n\t\t}\n\n\t\t// Check for style in case a browser which returns unreliable values\n\t\t// for getComputedStyle silently falls back to the reliable elem.style\n\t\tvalueIsBorderBox = isBorderBox &&\n\t\t\t( support.boxSizingReliable() || val === elem.style[ name ] );\n\n\t\t// Normalize \"\", auto, and prepare for extra\n\t\tval = parseFloat( val ) || 0;\n\t}\n\n\t// Use the active box-sizing model to add/subtract irrelevant styles\n\treturn ( val +\n\t\taugmentWidthOrHeight(\n\t\t\telem,\n\t\t\tname,\n\t\t\textra || ( isBorderBox ? \"border\" : \"content\" ),\n\t\t\tvalueIsBorderBox,\n\t\t\tstyles\n\t\t)\n\t) + \"px\";\n}\n\njQuery.extend( {\n\n\t// Add in style property hooks for overriding the default\n\t// behavior of getting and setting a style property\n\tcssHooks: {\n\t\topacity: {\n\t\t\tget: function( elem, computed ) {\n\t\t\t\tif ( computed ) {\n\n\t\t\t\t\t// We should always get a number back from opacity\n\t\t\t\t\tvar ret = curCSS( elem, \"opacity\" );\n\t\t\t\t\treturn ret === \"\" ? \"1\" : ret;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t},\n\n\t// Don't automatically add \"px\" to these possibly-unitless properties\n\tcssNumber: {\n\t\t\"animationIterationCount\": true,\n\t\t\"columnCount\": true,\n\t\t\"fillOpacity\": true,\n\t\t\"flexGrow\": true,\n\t\t\"flexShrink\": true,\n\t\t\"fontWeight\": true,\n\t\t\"lineHeight\": true,\n\t\t\"opacity\": true,\n\t\t\"order\": true,\n\t\t\"orphans\": true,\n\t\t\"widows\": true,\n\t\t\"zIndex\": true,\n\t\t\"zoom\": true\n\t},\n\n\t// Add in properties whose names you wish to fix before\n\t// setting or getting the value\n\tcssProps: {\n\t\t\"float\": \"cssFloat\"\n\t},\n\n\t// Get and set the style property on a DOM Node\n\tstyle: function( elem, name, value, extra ) {\n\n\t\t// Don't set styles on text and comment nodes\n\t\tif ( !elem || elem.nodeType === 3 || elem.nodeType === 8 || !elem.style ) {\n\t\t\treturn;\n\t\t}\n\n\t\t// Make sure that we're working with the right name\n\t\tvar ret, type, hooks,\n\t\t\torigName = jQuery.camelCase( name ),\n\t\t\tstyle = elem.style;\n\n\t\tname = jQuery.cssProps[ origName ] ||\n\t\t\t( jQuery.cssProps[ origName ] = vendorPropName( origName ) || origName );\n\n\t\t// Gets hook for the prefixed version, then unprefixed version\n\t\thooks = jQuery.cssHooks[ name ] || jQuery.cssHooks[ origName ];\n\n\t\t// Check if we're setting a value\n\t\tif ( value !== undefined ) {\n\t\t\ttype = typeof value;\n\n\t\t\t// Convert \"+=\" or \"-=\" to relative numbers (#7345)\n\t\t\tif ( type === \"string\" && ( ret = rcssNum.exec( value ) ) && ret[ 1 ] ) {\n\t\t\t\tvalue = adjustCSS( elem, name, ret );\n\n\t\t\t\t// Fixes bug #9237\n\t\t\t\ttype = \"number\";\n\t\t\t}\n\n\t\t\t// Make sure that null and NaN values aren't set (#7116)\n\t\t\tif ( value == null || value !== value ) {\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\t// If a number was passed in, add the unit (except for certain CSS properties)\n\t\t\tif ( type === \"number\" ) {\n\t\t\t\tvalue += ret && ret[ 3 ] || ( jQuery.cssNumber[ origName ] ? \"\" : \"px\" );\n\t\t\t}\n\n\t\t\t// background-* props affect original clone's values\n\t\t\tif ( !support.clearCloneStyle && value === \"\" && name.indexOf( \"background\" ) === 0 ) {\n\t\t\t\tstyle[ name ] = \"inherit\";\n\t\t\t}\n\n\t\t\t// If a hook was provided, use that value, otherwise just set the specified value\n\t\t\tif ( !hooks || !( \"set\" in hooks ) ||\n\t\t\t\t( value = hooks.set( elem, value, extra ) ) !== undefined ) {\n\n\t\t\t\tstyle[ name ] = value;\n\t\t\t}\n\n\t\t} else {\n\n\t\t\t// If a hook was provided get the non-computed value from there\n\t\t\tif ( hooks && \"get\" in hooks &&\n\t\t\t\t( ret = hooks.get( elem, false, extra ) ) !== undefined ) {\n\n\t\t\t\treturn ret;\n\t\t\t}\n\n\t\t\t// Otherwise just get the value from the style object\n\t\t\treturn style[ name ];\n\t\t}\n\t},\n\n\tcss: function( elem, name, extra, styles ) {\n\t\tvar val, num, hooks,\n\t\t\torigName = jQuery.camelCase( name );\n\n\t\t// Make sure that we're working with the right name\n\t\tname = jQuery.cssProps[ origName ] ||\n\t\t\t( jQuery.cssProps[ origName ] = vendorPropName( origName ) || origName );\n\n\t\t// Try prefixed name followed by the unprefixed name\n\t\thooks = jQuery.cssHooks[ name ] || jQuery.cssHooks[ origName ];\n\n\t\t// If a hook was provided get the computed value from there\n\t\tif ( hooks && \"get\" in hooks ) {\n\t\t\tval = hooks.get( elem, true, extra );\n\t\t}\n\n\t\t// Otherwise, if a way to get the computed value exists, use that\n\t\tif ( val === undefined ) {\n\t\t\tval = curCSS( elem, name, styles );\n\t\t}\n\n\t\t// Convert \"normal\" to computed value\n\t\tif ( val === \"normal\" && name in cssNormalTransform ) {\n\t\t\tval = cssNormalTransform[ name ];\n\t\t}\n\n\t\t// Make numeric if forced or a qualifier was provided and val looks numeric\n\t\tif ( extra === \"\" || extra ) {\n\t\t\tnum = parseFloat( val );\n\t\t\treturn extra === true || isFinite( num ) ? num || 0 : val;\n\t\t}\n\t\treturn val;\n\t}\n} );\n\njQuery.each( [ \"height\", \"width\" ], function( i, name ) {\n\tjQuery.cssHooks[ name ] = {\n\t\tget: function( elem, computed, extra ) {\n\t\t\tif ( computed ) {\n\n\t\t\t\t// Certain elements can have dimension info if we invisibly show them\n\t\t\t\t// but it must have a current display style that would benefit\n\t\t\t\treturn rdisplayswap.test( jQuery.css( elem, \"display\" ) ) &&\n\n\t\t\t\t\t// Support: Safari 8+\n\t\t\t\t\t// Table columns in Safari have non-zero offsetWidth & zero\n\t\t\t\t\t// getBoundingClientRect().width unless display is changed.\n\t\t\t\t\t// Support: IE <=11 only\n\t\t\t\t\t// Running getBoundingClientRect on a disconnected node\n\t\t\t\t\t// in IE throws an error.\n\t\t\t\t\t( !elem.getClientRects().length || !elem.getBoundingClientRect().width ) ?\n\t\t\t\t\t\tswap( elem, cssShow, function() {\n\t\t\t\t\t\t\treturn getWidthOrHeight( elem, name, extra );\n\t\t\t\t\t\t} ) :\n\t\t\t\t\t\tgetWidthOrHeight( elem, name, extra );\n\t\t\t}\n\t\t},\n\n\t\tset: function( elem, value, extra ) {\n\t\t\tvar matches,\n\t\t\t\tstyles = extra && getStyles( elem ),\n\t\t\t\tsubtract = extra && augmentWidthOrHeight(\n\t\t\t\t\telem,\n\t\t\t\t\tname,\n\t\t\t\t\textra,\n\t\t\t\t\tjQuery.css( elem, \"boxSizing\", false, styles ) === \"border-box\",\n\t\t\t\t\tstyles\n\t\t\t\t);\n\n\t\t\t// Convert to pixels if value adjustment is needed\n\t\t\tif ( subtract && ( matches = rcssNum.exec( value ) ) &&\n\t\t\t\t( matches[ 3 ] || \"px\" ) !== \"px\" ) {\n\n\t\t\t\telem.style[ name ] = value;\n\t\t\t\tvalue = jQuery.css( elem, name );\n\t\t\t}\n\n\t\t\treturn setPositiveNumber( elem, value, subtract );\n\t\t}\n\t};\n} );\n\njQuery.cssHooks.marginLeft = addGetHookIf( support.reliableMarginLeft,\n\tfunction( elem, computed ) {\n\t\tif ( computed ) {\n\t\t\treturn ( parseFloat( curCSS( elem, \"marginLeft\" ) ) ||\n\t\t\t\telem.getBoundingClientRect().left -\n\t\t\t\t\tswap( elem, { marginLeft: 0 }, function() {\n\t\t\t\t\t\treturn elem.getBoundingClientRect().left;\n\t\t\t\t\t} )\n\t\t\t\t) + \"px\";\n\t\t}\n\t}\n);\n\n// These hooks are used by animate to expand properties\njQuery.each( {\n\tmargin: \"\",\n\tpadding: \"\",\n\tborder: \"Width\"\n}, function( prefix, suffix ) {\n\tjQuery.cssHooks[ prefix + suffix ] = {\n\t\texpand: function( value ) {\n\t\t\tvar i = 0,\n\t\t\t\texpanded = {},\n\n\t\t\t\t// Assumes a single number if not a string\n\t\t\t\tparts = typeof value === \"string\" ? value.split( \" \" ) : [ value ];\n\n\t\t\tfor ( ; i < 4; i++ ) {\n\t\t\t\texpanded[ prefix + cssExpand[ i ] + suffix ] =\n\t\t\t\t\tparts[ i ] || parts[ i - 2 ] || parts[ 0 ];\n\t\t\t}\n\n\t\t\treturn expanded;\n\t\t}\n\t};\n\n\tif ( !rmargin.test( prefix ) ) {\n\t\tjQuery.cssHooks[ prefix + suffix ].set = setPositiveNumber;\n\t}\n} );\n\njQuery.fn.extend( {\n\tcss: function( name, value ) {\n\t\treturn access( this, function( elem, name, value ) {\n\t\t\tvar styles, len,\n\t\t\t\tmap = {},\n\t\t\t\ti = 0;\n\n\t\t\tif ( jQuery.isArray( name ) ) {\n\t\t\t\tstyles = getStyles( elem );\n\t\t\t\tlen = name.length;\n\n\t\t\t\tfor ( ; i < len; i++ ) {\n\t\t\t\t\tmap[ name[ i ] ] = jQuery.css( elem, name[ i ], false, styles );\n\t\t\t\t}\n\n\t\t\t\treturn map;\n\t\t\t}\n\n\t\t\treturn value !== undefined ?\n\t\t\t\tjQuery.style( elem, name, value ) :\n\t\t\t\tjQuery.css( elem, name );\n\t\t}, name, value, arguments.length > 1 );\n\t}\n} );\n\n\nfunction Tween( elem, options, prop, end, easing ) {\n\treturn new Tween.prototype.init( elem, options, prop, end, easing );\n}\njQuery.Tween = Tween;\n\nTween.prototype = {\n\tconstructor: Tween,\n\tinit: function( elem, options, prop, end, easing, unit ) {\n\t\tthis.elem = elem;\n\t\tthis.prop = prop;\n\t\tthis.easing = easing || jQuery.easing._default;\n\t\tthis.options = options;\n\t\tthis.start = this.now = this.cur();\n\t\tthis.end = end;\n\t\tthis.unit = unit || ( jQuery.cssNumber[ prop ] ? \"\" : \"px\" );\n\t},\n\tcur: function() {\n\t\tvar hooks = Tween.propHooks[ this.prop ];\n\n\t\treturn hooks && hooks.get ?\n\t\t\thooks.get( this ) :\n\t\t\tTween.propHooks._default.get( this );\n\t},\n\trun: function( percent ) {\n\t\tvar eased,\n\t\t\thooks = Tween.propHooks[ this.prop ];\n\n\t\tif ( this.options.duration ) {\n\t\t\tthis.pos = eased = jQuery.easing[ this.easing ](\n\t\t\t\tpercent, this.options.duration * percent, 0, 1, this.options.duration\n\t\t\t);\n\t\t} else {\n\t\t\tthis.pos = eased = percent;\n\t\t}\n\t\tthis.now = ( this.end - this.start ) * eased + this.start;\n\n\t\tif ( this.options.step ) {\n\t\t\tthis.options.step.call( this.elem, this.now, this );\n\t\t}\n\n\t\tif ( hooks && hooks.set ) {\n\t\t\thooks.set( this );\n\t\t} else {\n\t\t\tTween.propHooks._default.set( this );\n\t\t}\n\t\treturn this;\n\t}\n};\n\nTween.prototype.init.prototype = Tween.prototype;\n\nTween.propHooks = {\n\t_default: {\n\t\tget: function( tween ) {\n\t\t\tvar result;\n\n\t\t\t// Use a property on the element directly when it is not a DOM element,\n\t\t\t// or when there is no matching style property that exists.\n\t\t\tif ( tween.elem.nodeType !== 1 ||\n\t\t\t\ttween.elem[ tween.prop ] != null && tween.elem.style[ tween.prop ] == null ) {\n\t\t\t\treturn tween.elem[ tween.prop ];\n\t\t\t}\n\n\t\t\t// Passing an empty string as a 3rd parameter to .css will automatically\n\t\t\t// attempt a parseFloat and fallback to a string if the parse fails.\n\t\t\t// Simple values such as \"10px\" are parsed to Float;\n\t\t\t// complex values such as \"rotate(1rad)\" are returned as-is.\n\t\t\tresult = jQuery.css( tween.elem, tween.prop, \"\" );\n\n\t\t\t// Empty strings, null, undefined and \"auto\" are converted to 0.\n\t\t\treturn !result || result === \"auto\" ? 0 : result;\n\t\t},\n\t\tset: function( tween ) {\n\n\t\t\t// Use step hook for back compat.\n\t\t\t// Use cssHook if its there.\n\t\t\t// Use .style if available and use plain properties where available.\n\t\t\tif ( jQuery.fx.step[ tween.prop ] ) {\n\t\t\t\tjQuery.fx.step[ tween.prop ]( tween );\n\t\t\t} else if ( tween.elem.nodeType === 1 &&\n\t\t\t\t( tween.elem.style[ jQuery.cssProps[ tween.prop ] ] != null ||\n\t\t\t\t\tjQuery.cssHooks[ tween.prop ] ) ) {\n\t\t\t\tjQuery.style( tween.elem, tween.prop, tween.now + tween.unit );\n\t\t\t} else {\n\t\t\t\ttween.elem[ tween.prop ] = tween.now;\n\t\t\t}\n\t\t}\n\t}\n};\n\n// Support: IE <=9 only\n// Panic based approach to setting things on disconnected nodes\nTween.propHooks.scrollTop = Tween.propHooks.scrollLeft = {\n\tset: function( tween ) {\n\t\tif ( tween.elem.nodeType && tween.elem.parentNode ) {\n\t\t\ttween.elem[ tween.prop ] = tween.now;\n\t\t}\n\t}\n};\n\njQuery.easing = {\n\tlinear: function( p ) {\n\t\treturn p;\n\t},\n\tswing: function( p ) {\n\t\treturn 0.5 - Math.cos( p * Math.PI ) / 2;\n\t},\n\t_default: \"swing\"\n};\n\njQuery.fx = Tween.prototype.init;\n\n// Back compat <1.8 extension point\njQuery.fx.step = {};\n\n\n\n\nvar\n\tfxNow, timerId,\n\trfxtypes = /^(?:toggle|show|hide)$/,\n\trrun = /queueHooks$/;\n\nfunction raf() {\n\tif ( timerId ) {\n\t\twindow.requestAnimationFrame( raf );\n\t\tjQuery.fx.tick();\n\t}\n}\n\n// Animations created synchronously will run synchronously\nfunction createFxNow() {\n\twindow.setTimeout( function() {\n\t\tfxNow = undefined;\n\t} );\n\treturn ( fxNow = jQuery.now() );\n}\n\n// Generate parameters to create a standard animation\nfunction genFx( type, includeWidth ) {\n\tvar which,\n\t\ti = 0,\n\t\tattrs = { height: type };\n\n\t// If we include width, step value is 1 to do all cssExpand values,\n\t// otherwise step value is 2 to skip over Left and Right\n\tincludeWidth = includeWidth ? 1 : 0;\n\tfor ( ; i < 4; i += 2 - includeWidth ) {\n\t\twhich = cssExpand[ i ];\n\t\tattrs[ \"margin\" + which ] = attrs[ \"padding\" + which ] = type;\n\t}\n\n\tif ( includeWidth ) {\n\t\tattrs.opacity = attrs.width = type;\n\t}\n\n\treturn attrs;\n}\n\nfunction createTween( value, prop, animation ) {\n\tvar tween,\n\t\tcollection = ( Animation.tweeners[ prop ] || [] ).concat( Animation.tweeners[ \"*\" ] ),\n\t\tindex = 0,\n\t\tlength = collection.length;\n\tfor ( ; index < length; index++ ) {\n\t\tif ( ( tween = collection[ index ].call( animation, prop, value ) ) ) {\n\n\t\t\t// We're done with this property\n\t\t\treturn tween;\n\t\t}\n\t}\n}\n\nfunction defaultPrefilter( elem, props, opts ) {\n\tvar prop, value, toggle, hooks, oldfire, propTween, restoreDisplay, display,\n\t\tisBox = \"width\" in props || \"height\" in props,\n\t\tanim = this,\n\t\torig = {},\n\t\tstyle = elem.style,\n\t\thidden = elem.nodeType && isHiddenWithinTree( elem ),\n\t\tdataShow = dataPriv.get( elem, \"fxshow\" );\n\n\t// Queue-skipping animations hijack the fx hooks\n\tif ( !opts.queue ) {\n\t\thooks = jQuery._queueHooks( elem, \"fx\" );\n\t\tif ( hooks.unqueued == null ) {\n\t\t\thooks.unqueued = 0;\n\t\t\toldfire = hooks.empty.fire;\n\t\t\thooks.empty.fire = function() {\n\t\t\t\tif ( !hooks.unqueued ) {\n\t\t\t\t\toldfire();\n\t\t\t\t}\n\t\t\t};\n\t\t}\n\t\thooks.unqueued++;\n\n\t\tanim.always( function() {\n\n\t\t\t// Ensure the complete handler is called before this completes\n\t\t\tanim.always( function() {\n\t\t\t\thooks.unqueued--;\n\t\t\t\tif ( !jQuery.queue( elem, \"fx\" ).length ) {\n\t\t\t\t\thooks.empty.fire();\n\t\t\t\t}\n\t\t\t} );\n\t\t} );\n\t}\n\n\t// Detect show/hide animations\n\tfor ( prop in props ) {\n\t\tvalue = props[ prop ];\n\t\tif ( rfxtypes.test( value ) ) {\n\t\t\tdelete props[ prop ];\n\t\t\ttoggle = toggle || value === \"toggle\";\n\t\t\tif ( value === ( hidden ? \"hide\" : \"show\" ) ) {\n\n\t\t\t\t// Pretend to be hidden if this is a \"show\" and\n\t\t\t\t// there is still data from a stopped show/hide\n\t\t\t\tif ( value === \"show\" && dataShow && dataShow[ prop ] !== undefined ) {\n\t\t\t\t\thidden = true;\n\n\t\t\t\t// Ignore all other no-op show/hide data\n\t\t\t\t} else {\n\t\t\t\t\tcontinue;\n\t\t\t\t}\n\t\t\t}\n\t\t\torig[ prop ] = dataShow && dataShow[ prop ] || jQuery.style( elem, prop );\n\t\t}\n\t}\n\n\t// Bail out if this is a no-op like .hide().hide()\n\tpropTween = !jQuery.isEmptyObject( props );\n\tif ( !propTween && jQuery.isEmptyObject( orig ) ) {\n\t\treturn;\n\t}\n\n\t// Restrict \"overflow\" and \"display\" styles during box animations\n\tif ( isBox && elem.nodeType === 1 ) {\n\n\t\t// Support: IE <=9 - 11, Edge 12 - 13\n\t\t// Record all 3 overflow attributes because IE does not infer the shorthand\n\t\t// from identically-valued overflowX and overflowY\n\t\topts.overflow = [ style.overflow, style.overflowX, style.overflowY ];\n\n\t\t// Identify a display type, preferring old show/hide data over the CSS cascade\n\t\trestoreDisplay = dataShow && dataShow.display;\n\t\tif ( restoreDisplay == null ) {\n\t\t\trestoreDisplay = dataPriv.get( elem, \"display\" );\n\t\t}\n\t\tdisplay = jQuery.css( elem, \"display\" );\n\t\tif ( display === \"none\" ) {\n\t\t\tif ( restoreDisplay ) {\n\t\t\t\tdisplay = restoreDisplay;\n\t\t\t} else {\n\n\t\t\t\t// Get nonempty value(s) by temporarily forcing visibility\n\t\t\t\tshowHide( [ elem ], true );\n\t\t\t\trestoreDisplay = elem.style.display || restoreDisplay;\n\t\t\t\tdisplay = jQuery.css( elem, \"display\" );\n\t\t\t\tshowHide( [ elem ] );\n\t\t\t}\n\t\t}\n\n\t\t// Animate inline elements as inline-block\n\t\tif ( display === \"inline\" || display === \"inline-block\" && restoreDisplay != null ) {\n\t\t\tif ( jQuery.css( elem, \"float\" ) === \"none\" ) {\n\n\t\t\t\t// Restore the original display value at the end of pure show/hide animations\n\t\t\t\tif ( !propTween ) {\n\t\t\t\t\tanim.done( function() {\n\t\t\t\t\t\tstyle.display = restoreDisplay;\n\t\t\t\t\t} );\n\t\t\t\t\tif ( restoreDisplay == null ) {\n\t\t\t\t\t\tdisplay = style.display;\n\t\t\t\t\t\trestoreDisplay = display === \"none\" ? \"\" : display;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\tstyle.display = \"inline-block\";\n\t\t\t}\n\t\t}\n\t}\n\n\tif ( opts.overflow ) {\n\t\tstyle.overflow = \"hidden\";\n\t\tanim.always( function() {\n\t\t\tstyle.overflow = opts.overflow[ 0 ];\n\t\t\tstyle.overflowX = opts.overflow[ 1 ];\n\t\t\tstyle.overflowY = opts.overflow[ 2 ];\n\t\t} );\n\t}\n\n\t// Implement show/hide animations\n\tpropTween = false;\n\tfor ( prop in orig ) {\n\n\t\t// General show/hide setup for this element animation\n\t\tif ( !propTween ) {\n\t\t\tif ( dataShow ) {\n\t\t\t\tif ( \"hidden\" in dataShow ) {\n\t\t\t\t\thidden = dataShow.hidden;\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\tdataShow = dataPriv.access( elem, \"fxshow\", { display: restoreDisplay } );\n\t\t\t}\n\n\t\t\t// Store hidden/visible for toggle so `.stop().toggle()` \"reverses\"\n\t\t\tif ( toggle ) {\n\t\t\t\tdataShow.hidden = !hidden;\n\t\t\t}\n\n\t\t\t// Show elements before animating them\n\t\t\tif ( hidden ) {\n\t\t\t\tshowHide( [ elem ], true );\n\t\t\t}\n\n\t\t\t/* eslint-disable no-loop-func */\n\n\t\t\tanim.done( function() {\n\n\t\t\t/* eslint-enable no-loop-func */\n\n\t\t\t\t// The final step of a \"hide\" animation is actually hiding the element\n\t\t\t\tif ( !hidden ) {\n\t\t\t\t\tshowHide( [ elem ] );\n\t\t\t\t}\n\t\t\t\tdataPriv.remove( elem, \"fxshow\" );\n\t\t\t\tfor ( prop in orig ) {\n\t\t\t\t\tjQuery.style( elem, prop, orig[ prop ] );\n\t\t\t\t}\n\t\t\t} );\n\t\t}\n\n\t\t// Per-property setup\n\t\tpropTween = createTween( hidden ? dataShow[ prop ] : 0, prop, anim );\n\t\tif ( !( prop in dataShow ) ) {\n\t\t\tdataShow[ prop ] = propTween.start;\n\t\t\tif ( hidden ) {\n\t\t\t\tpropTween.end = propTween.start;\n\t\t\t\tpropTween.start = 0;\n\t\t\t}\n\t\t}\n\t}\n}\n\nfunction propFilter( props, specialEasing ) {\n\tvar index, name, easing, value, hooks;\n\n\t// camelCase, specialEasing and expand cssHook pass\n\tfor ( index in props ) {\n\t\tname = jQuery.camelCase( index );\n\t\teasing = specialEasing[ name ];\n\t\tvalue = props[ index ];\n\t\tif ( jQuery.isArray( value ) ) {\n\t\t\teasing = value[ 1 ];\n\t\t\tvalue = props[ index ] = value[ 0 ];\n\t\t}\n\n\t\tif ( index !== name ) {\n\t\t\tprops[ name ] = value;\n\t\t\tdelete props[ index ];\n\t\t}\n\n\t\thooks = jQuery.cssHooks[ name ];\n\t\tif ( hooks && \"expand\" in hooks ) {\n\t\t\tvalue = hooks.expand( value );\n\t\t\tdelete props[ name ];\n\n\t\t\t// Not quite $.extend, this won't overwrite existing keys.\n\t\t\t// Reusing 'index' because we have the correct \"name\"\n\t\t\tfor ( index in value ) {\n\t\t\t\tif ( !( index in props ) ) {\n\t\t\t\t\tprops[ index ] = value[ index ];\n\t\t\t\t\tspecialEasing[ index ] = easing;\n\t\t\t\t}\n\t\t\t}\n\t\t} else {\n\t\t\tspecialEasing[ name ] = easing;\n\t\t}\n\t}\n}\n\nfunction Animation( elem, properties, options ) {\n\tvar result,\n\t\tstopped,\n\t\tindex = 0,\n\t\tlength = Animation.prefilters.length,\n\t\tdeferred = jQuery.Deferred().always( function() {\n\n\t\t\t// Don't match elem in the :animated selector\n\t\t\tdelete tick.elem;\n\t\t} ),\n\t\ttick = function() {\n\t\t\tif ( stopped ) {\n\t\t\t\treturn false;\n\t\t\t}\n\t\t\tvar currentTime = fxNow || createFxNow(),\n\t\t\t\tremaining = Math.max( 0, animation.startTime + animation.duration - currentTime ),\n\n\t\t\t\t// Support: Android 2.3 only\n\t\t\t\t// Archaic crash bug won't allow us to use `1 - ( 0.5 || 0 )` (#12497)\n\t\t\t\ttemp = remaining / animation.duration || 0,\n\t\t\t\tpercent = 1 - temp,\n\t\t\t\tindex = 0,\n\t\t\t\tlength = animation.tweens.length;\n\n\t\t\tfor ( ; index < length; index++ ) {\n\t\t\t\tanimation.tweens[ index ].run( percent );\n\t\t\t}\n\n\t\t\tdeferred.notifyWith( elem, [ animation, percent, remaining ] );\n\n\t\t\tif ( percent < 1 && length ) {\n\t\t\t\treturn remaining;\n\t\t\t} else {\n\t\t\t\tdeferred.resolveWith( elem, [ animation ] );\n\t\t\t\treturn false;\n\t\t\t}\n\t\t},\n\t\tanimation = deferred.promise( {\n\t\t\telem: elem,\n\t\t\tprops: jQuery.extend( {}, properties ),\n\t\t\topts: jQuery.extend( true, {\n\t\t\t\tspecialEasing: {},\n\t\t\t\teasing: jQuery.easing._default\n\t\t\t}, options ),\n\t\t\toriginalProperties: properties,\n\t\t\toriginalOptions: options,\n\t\t\tstartTime: fxNow || createFxNow(),\n\t\t\tduration: options.duration,\n\t\t\ttweens: [],\n\t\t\tcreateTween: function( prop, end ) {\n\t\t\t\tvar tween = jQuery.Tween( elem, animation.opts, prop, end,\n\t\t\t\t\t\tanimation.opts.specialEasing[ prop ] || animation.opts.easing );\n\t\t\t\tanimation.tweens.push( tween );\n\t\t\t\treturn tween;\n\t\t\t},\n\t\t\tstop: function( gotoEnd ) {\n\t\t\t\tvar index = 0,\n\n\t\t\t\t\t// If we are going to the end, we want to run all the tweens\n\t\t\t\t\t// otherwise we skip this part\n\t\t\t\t\tlength = gotoEnd ? animation.tweens.length : 0;\n\t\t\t\tif ( stopped ) {\n\t\t\t\t\treturn this;\n\t\t\t\t}\n\t\t\t\tstopped = true;\n\t\t\t\tfor ( ; index < length; index++ ) {\n\t\t\t\t\tanimation.tweens[ index ].run( 1 );\n\t\t\t\t}\n\n\t\t\t\t// Resolve when we played the last frame; otherwise, reject\n\t\t\t\tif ( gotoEnd ) {\n\t\t\t\t\tdeferred.notifyWith( elem, [ animation, 1, 0 ] );\n\t\t\t\t\tdeferred.resolveWith( elem, [ animation, gotoEnd ] );\n\t\t\t\t} else {\n\t\t\t\t\tdeferred.rejectWith( elem, [ animation, gotoEnd ] );\n\t\t\t\t}\n\t\t\t\treturn this;\n\t\t\t}\n\t\t} ),\n\t\tprops = animation.props;\n\n\tpropFilter( props, animation.opts.specialEasing );\n\n\tfor ( ; index < length; index++ ) {\n\t\tresult = Animation.prefilters[ index ].call( animation, elem, props, animation.opts );\n\t\tif ( result ) {\n\t\t\tif ( jQuery.isFunction( result.stop ) ) {\n\t\t\t\tjQuery._queueHooks( animation.elem, animation.opts.queue ).stop =\n\t\t\t\t\tjQuery.proxy( result.stop, result );\n\t\t\t}\n\t\t\treturn result;\n\t\t}\n\t}\n\n\tjQuery.map( props, createTween, animation );\n\n\tif ( jQuery.isFunction( animation.opts.start ) ) {\n\t\tanimation.opts.start.call( elem, animation );\n\t}\n\n\tjQuery.fx.timer(\n\t\tjQuery.extend( tick, {\n\t\t\telem: elem,\n\t\t\tanim: animation,\n\t\t\tqueue: animation.opts.queue\n\t\t} )\n\t);\n\n\t// attach callbacks from options\n\treturn animation.progress( animation.opts.progress )\n\t\t.done( animation.opts.done, animation.opts.complete )\n\t\t.fail( animation.opts.fail )\n\t\t.always( animation.opts.always );\n}\n\njQuery.Animation = jQuery.extend( Animation, {\n\n\ttweeners: {\n\t\t\"*\": [ function( prop, value ) {\n\t\t\tvar tween = this.createTween( prop, value );\n\t\t\tadjustCSS( tween.elem, prop, rcssNum.exec( value ), tween );\n\t\t\treturn tween;\n\t\t} ]\n\t},\n\n\ttweener: function( props, callback ) {\n\t\tif ( jQuery.isFunction( props ) ) {\n\t\t\tcallback = props;\n\t\t\tprops = [ \"*\" ];\n\t\t} else {\n\t\t\tprops = props.match( rnothtmlwhite );\n\t\t}\n\n\t\tvar prop,\n\t\t\tindex = 0,\n\t\t\tlength = props.length;\n\n\t\tfor ( ; index < length; index++ ) {\n\t\t\tprop = props[ index ];\n\t\t\tAnimation.tweeners[ prop ] = Animation.tweeners[ prop ] || [];\n\t\t\tAnimation.tweeners[ prop ].unshift( callback );\n\t\t}\n\t},\n\n\tprefilters: [ defaultPrefilter ],\n\n\tprefilter: function( callback, prepend ) {\n\t\tif ( prepend ) {\n\t\t\tAnimation.prefilters.unshift( callback );\n\t\t} else {\n\t\t\tAnimation.prefilters.push( callback );\n\t\t}\n\t}\n} );\n\njQuery.speed = function( speed, easing, fn ) {\n\tvar opt = speed && typeof speed === \"object\" ? jQuery.extend( {}, speed ) : {\n\t\tcomplete: fn || !fn && easing ||\n\t\t\tjQuery.isFunction( speed ) && speed,\n\t\tduration: speed,\n\t\teasing: fn && easing || easing && !jQuery.isFunction( easing ) && easing\n\t};\n\n\t// Go to the end state if fx are off or if document is hidden\n\tif ( jQuery.fx.off || document.hidden ) {\n\t\topt.duration = 0;\n\n\t} else {\n\t\tif ( typeof opt.duration !== \"number\" ) {\n\t\t\tif ( opt.duration in jQuery.fx.speeds ) {\n\t\t\t\topt.duration = jQuery.fx.speeds[ opt.duration ];\n\n\t\t\t} else {\n\t\t\t\topt.duration = jQuery.fx.speeds._default;\n\t\t\t}\n\t\t}\n\t}\n\n\t// Normalize opt.queue - true/undefined/null -> \"fx\"\n\tif ( opt.queue == null || opt.queue === true ) {\n\t\topt.queue = \"fx\";\n\t}\n\n\t// Queueing\n\topt.old = opt.complete;\n\n\topt.complete = function() {\n\t\tif ( jQuery.isFunction( opt.old ) ) {\n\t\t\topt.old.call( this );\n\t\t}\n\n\t\tif ( opt.queue ) {\n\t\t\tjQuery.dequeue( this, opt.queue );\n\t\t}\n\t};\n\n\treturn opt;\n};\n\njQuery.fn.extend( {\n\tfadeTo: function( speed, to, easing, callback ) {\n\n\t\t// Show any hidden elements after setting opacity to 0\n\t\treturn this.filter( isHiddenWithinTree ).css( \"opacity\", 0 ).show()\n\n\t\t\t// Animate to the value specified\n\t\t\t.end().animate( { opacity: to }, speed, easing, callback );\n\t},\n\tanimate: function( prop, speed, easing, callback ) {\n\t\tvar empty = jQuery.isEmptyObject( prop ),\n\t\t\toptall = jQuery.speed( speed, easing, callback ),\n\t\t\tdoAnimation = function() {\n\n\t\t\t\t// Operate on a copy of prop so per-property easing won't be lost\n\t\t\t\tvar anim = Animation( this, jQuery.extend( {}, prop ), optall );\n\n\t\t\t\t// Empty animations, or finishing resolves immediately\n\t\t\t\tif ( empty || dataPriv.get( this, \"finish\" ) ) {\n\t\t\t\t\tanim.stop( true );\n\t\t\t\t}\n\t\t\t};\n\t\t\tdoAnimation.finish = doAnimation;\n\n\t\treturn empty || optall.queue === false ?\n\t\t\tthis.each( doAnimation ) :\n\t\t\tthis.queue( optall.queue, doAnimation );\n\t},\n\tstop: function( type, clearQueue, gotoEnd ) {\n\t\tvar stopQueue = function( hooks ) {\n\t\t\tvar stop = hooks.stop;\n\t\t\tdelete hooks.stop;\n\t\t\tstop( gotoEnd );\n\t\t};\n\n\t\tif ( typeof type !== \"string\" ) {\n\t\t\tgotoEnd = clearQueue;\n\t\t\tclearQueue = type;\n\t\t\ttype = undefined;\n\t\t}\n\t\tif ( clearQueue && type !== false ) {\n\t\t\tthis.queue( type || \"fx\", [] );\n\t\t}\n\n\t\treturn this.each( function() {\n\t\t\tvar dequeue = true,\n\t\t\t\tindex = type != null && type + \"queueHooks\",\n\t\t\t\ttimers = jQuery.timers,\n\t\t\t\tdata = dataPriv.get( this );\n\n\t\t\tif ( index ) {\n\t\t\t\tif ( data[ index ] && data[ index ].stop ) {\n\t\t\t\t\tstopQueue( data[ index ] );\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\tfor ( index in data ) {\n\t\t\t\t\tif ( data[ index ] && data[ index ].stop && rrun.test( index ) ) {\n\t\t\t\t\t\tstopQueue( data[ index ] );\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tfor ( index = timers.length; index--; ) {\n\t\t\t\tif ( timers[ index ].elem === this &&\n\t\t\t\t\t( type == null || timers[ index ].queue === type ) ) {\n\n\t\t\t\t\ttimers[ index ].anim.stop( gotoEnd );\n\t\t\t\t\tdequeue = false;\n\t\t\t\t\ttimers.splice( index, 1 );\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t// Start the next in the queue if the last step wasn't forced.\n\t\t\t// Timers currently will call their complete callbacks, which\n\t\t\t// will dequeue but only if they were gotoEnd.\n\t\t\tif ( dequeue || !gotoEnd ) {\n\t\t\t\tjQuery.dequeue( this, type );\n\t\t\t}\n\t\t} );\n\t},\n\tfinish: function( type ) {\n\t\tif ( type !== false ) {\n\t\t\ttype = type || \"fx\";\n\t\t}\n\t\treturn this.each( function() {\n\t\t\tvar index,\n\t\t\t\tdata = dataPriv.get( this ),\n\t\t\t\tqueue = data[ type + \"queue\" ],\n\t\t\t\thooks = data[ type + \"queueHooks\" ],\n\t\t\t\ttimers = jQuery.timers,\n\t\t\t\tlength = queue ? queue.length : 0;\n\n\t\t\t// Enable finishing flag on private data\n\t\t\tdata.finish = true;\n\n\t\t\t// Empty the queue first\n\t\t\tjQuery.queue( this, type, [] );\n\n\t\t\tif ( hooks && hooks.stop ) {\n\t\t\t\thooks.stop.call( this, true );\n\t\t\t}\n\n\t\t\t// Look for any active animations, and finish them\n\t\t\tfor ( index = timers.length; index--; ) {\n\t\t\t\tif ( timers[ index ].elem === this && timers[ index ].queue === type ) {\n\t\t\t\t\ttimers[ index ].anim.stop( true );\n\t\t\t\t\ttimers.splice( index, 1 );\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t// Look for any animations in the old queue and finish them\n\t\t\tfor ( index = 0; index < length; index++ ) {\n\t\t\t\tif ( queue[ index ] && queue[ index ].finish ) {\n\t\t\t\t\tqueue[ index ].finish.call( this );\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t// Turn off finishing flag\n\t\t\tdelete data.finish;\n\t\t} );\n\t}\n} );\n\njQuery.each( [ \"toggle\", \"show\", \"hide\" ], function( i, name ) {\n\tvar cssFn = jQuery.fn[ name ];\n\tjQuery.fn[ name ] = function( speed, easing, callback ) {\n\t\treturn speed == null || typeof speed === \"boolean\" ?\n\t\t\tcssFn.apply( this, arguments ) :\n\t\t\tthis.animate( genFx( name, true ), speed, easing, callback );\n\t};\n} );\n\n// Generate shortcuts for custom animations\njQuery.each( {\n\tslideDown: genFx( \"show\" ),\n\tslideUp: genFx( \"hide\" ),\n\tslideToggle: genFx( \"toggle\" ),\n\tfadeIn: { opacity: \"show\" },\n\tfadeOut: { opacity: \"hide\" },\n\tfadeToggle: { opacity: \"toggle\" }\n}, function( name, props ) {\n\tjQuery.fn[ name ] = function( speed, easing, callback ) {\n\t\treturn this.animate( props, speed, easing, callback );\n\t};\n} );\n\njQuery.timers = [];\njQuery.fx.tick = function() {\n\tvar timer,\n\t\ti = 0,\n\t\ttimers = jQuery.timers;\n\n\tfxNow = jQuery.now();\n\n\tfor ( ; i < timers.length; i++ ) {\n\t\ttimer = timers[ i ];\n\n\t\t// Checks the timer has not already been removed\n\t\tif ( !timer() && timers[ i ] === timer ) {\n\t\t\ttimers.splice( i--, 1 );\n\t\t}\n\t}\n\n\tif ( !timers.length ) {\n\t\tjQuery.fx.stop();\n\t}\n\tfxNow = undefined;\n};\n\njQuery.fx.timer = function( timer ) {\n\tjQuery.timers.push( timer );\n\tif ( timer() ) {\n\t\tjQuery.fx.start();\n\t} else {\n\t\tjQuery.timers.pop();\n\t}\n};\n\njQuery.fx.interval = 13;\njQuery.fx.start = function() {\n\tif ( !timerId ) {\n\t\ttimerId = window.requestAnimationFrame ?\n\t\t\twindow.requestAnimationFrame( raf ) :\n\t\t\twindow.setInterval( jQuery.fx.tick, jQuery.fx.interval );\n\t}\n};\n\njQuery.fx.stop = function() {\n\tif ( window.cancelAnimationFrame ) {\n\t\twindow.cancelAnimationFrame( timerId );\n\t} else {\n\t\twindow.clearInterval( timerId );\n\t}\n\n\ttimerId = null;\n};\n\njQuery.fx.speeds = {\n\tslow: 600,\n\tfast: 200,\n\n\t// Default speed\n\t_default: 400\n};\n\n\n// Based off of the plugin by Clint Helfers, with permission.\n// https://web.archive.org/web/20100324014747/http://blindsignals.com/index.php/2009/07/jquery-delay/\njQuery.fn.delay = function( time, type ) {\n\ttime = jQuery.fx ? jQuery.fx.speeds[ time ] || time : time;\n\ttype = type || \"fx\";\n\n\treturn this.queue( type, function( next, hooks ) {\n\t\tvar timeout = window.setTimeout( next, time );\n\t\thooks.stop = function() {\n\t\t\twindow.clearTimeout( timeout );\n\t\t};\n\t} );\n};\n\n\n( function() {\n\tvar input = document.createElement( \"input\" ),\n\t\tselect = document.createElement( \"select\" ),\n\t\topt = select.appendChild( document.createElement( \"option\" ) );\n\n\tinput.type = \"checkbox\";\n\n\t// Support: Android <=4.3 only\n\t// Default value for a checkbox should be \"on\"\n\tsupport.checkOn = input.value !== \"\";\n\n\t// Support: IE <=11 only\n\t// Must access selectedIndex to make default options select\n\tsupport.optSelected = opt.selected;\n\n\t// Support: IE <=11 only\n\t// An input loses its value after becoming a radio\n\tinput = document.createElement( \"input\" );\n\tinput.value = \"t\";\n\tinput.type = \"radio\";\n\tsupport.radioValue = input.value === \"t\";\n} )();\n\n\nvar boolHook,\n\tattrHandle = jQuery.expr.attrHandle;\n\njQuery.fn.extend( {\n\tattr: function( name, value ) {\n\t\treturn access( this, jQuery.attr, name, value, arguments.length > 1 );\n\t},\n\n\tremoveAttr: function( name ) {\n\t\treturn this.each( function() {\n\t\t\tjQuery.removeAttr( this, name );\n\t\t} );\n\t}\n} );\n\njQuery.extend( {\n\tattr: function( elem, name, value ) {\n\t\tvar ret, hooks,\n\t\t\tnType = elem.nodeType;\n\n\t\t// Don't get/set attributes on text, comment and attribute nodes\n\t\tif ( nType === 3 || nType === 8 || nType === 2 ) {\n\t\t\treturn;\n\t\t}\n\n\t\t// Fallback to prop when attributes are not supported\n\t\tif ( typeof elem.getAttribute === \"undefined\" ) {\n\t\t\treturn jQuery.prop( elem, name, value );\n\t\t}\n\n\t\t// Attribute hooks are determined by the lowercase version\n\t\t// Grab necessary hook if one is defined\n\t\tif ( nType !== 1 || !jQuery.isXMLDoc( elem ) ) {\n\t\t\thooks = jQuery.attrHooks[ name.toLowerCase() ] ||\n\t\t\t\t( jQuery.expr.match.bool.test( name ) ? boolHook : undefined );\n\t\t}\n\n\t\tif ( value !== undefined ) {\n\t\t\tif ( value === null ) {\n\t\t\t\tjQuery.removeAttr( elem, name );\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tif ( hooks && \"set\" in hooks &&\n\t\t\t\t( ret = hooks.set( elem, value, name ) ) !== undefined ) {\n\t\t\t\treturn ret;\n\t\t\t}\n\n\t\t\telem.setAttribute( name, value + \"\" );\n\t\t\treturn value;\n\t\t}\n\n\t\tif ( hooks && \"get\" in hooks && ( ret = hooks.get( elem, name ) ) !== null ) {\n\t\t\treturn ret;\n\t\t}\n\n\t\tret = jQuery.find.attr( elem, name );\n\n\t\t// Non-existent attributes return null, we normalize to undefined\n\t\treturn ret == null ? undefined : ret;\n\t},\n\n\tattrHooks: {\n\t\ttype: {\n\t\t\tset: function( elem, value ) {\n\t\t\t\tif ( !support.radioValue && value === \"radio\" &&\n\t\t\t\t\tjQuery.nodeName( elem, \"input\" ) ) {\n\t\t\t\t\tvar val = elem.value;\n\t\t\t\t\telem.setAttribute( \"type\", value );\n\t\t\t\t\tif ( val ) {\n\t\t\t\t\t\telem.value = val;\n\t\t\t\t\t}\n\t\t\t\t\treturn value;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t},\n\n\tremoveAttr: function( elem, value ) {\n\t\tvar name,\n\t\t\ti = 0,\n\n\t\t\t// Attribute names can contain non-HTML whitespace characters\n\t\t\t// https://html.spec.whatwg.org/multipage/syntax.html#attributes-2\n\t\t\tattrNames = value && value.match( rnothtmlwhite );\n\n\t\tif ( attrNames && elem.nodeType === 1 ) {\n\t\t\twhile ( ( name = attrNames[ i++ ] ) ) {\n\t\t\t\telem.removeAttribute( name );\n\t\t\t}\n\t\t}\n\t}\n} );\n\n// Hooks for boolean attributes\nboolHook = {\n\tset: function( elem, value, name ) {\n\t\tif ( value === false ) {\n\n\t\t\t// Remove boolean attributes when set to false\n\t\t\tjQuery.removeAttr( elem, name );\n\t\t} else {\n\t\t\telem.setAttribute( name, name );\n\t\t}\n\t\treturn name;\n\t}\n};\n\njQuery.each( jQuery.expr.match.bool.source.match( /\\w+/g ), function( i, name ) {\n\tvar getter = attrHandle[ name ] || jQuery.find.attr;\n\n\tattrHandle[ name ] = function( elem, name, isXML ) {\n\t\tvar ret, handle,\n\t\t\tlowercaseName = name.toLowerCase();\n\n\t\tif ( !isXML ) {\n\n\t\t\t// Avoid an infinite loop by temporarily removing this function from the getter\n\t\t\thandle = attrHandle[ lowercaseName ];\n\t\t\tattrHandle[ lowercaseName ] = ret;\n\t\t\tret = getter( elem, name, isXML ) != null ?\n\t\t\t\tlowercaseName :\n\t\t\t\tnull;\n\t\t\tattrHandle[ lowercaseName ] = handle;\n\t\t}\n\t\treturn ret;\n\t};\n} );\n\n\n\n\nvar rfocusable = /^(?:input|select|textarea|button)$/i,\n\trclickable = /^(?:a|area)$/i;\n\njQuery.fn.extend( {\n\tprop: function( name, value ) {\n\t\treturn access( this, jQuery.prop, name, value, arguments.length > 1 );\n\t},\n\n\tremoveProp: function( name ) {\n\t\treturn this.each( function() {\n\t\t\tdelete this[ jQuery.propFix[ name ] || name ];\n\t\t} );\n\t}\n} );\n\njQuery.extend( {\n\tprop: function( elem, name, value ) {\n\t\tvar ret, hooks,\n\t\t\tnType = elem.nodeType;\n\n\t\t// Don't get/set properties on text, comment and attribute nodes\n\t\tif ( nType === 3 || nType === 8 || nType === 2 ) {\n\t\t\treturn;\n\t\t}\n\n\t\tif ( nType !== 1 || !jQuery.isXMLDoc( elem ) ) {\n\n\t\t\t// Fix name and attach hooks\n\t\t\tname = jQuery.propFix[ name ] || name;\n\t\t\thooks = jQuery.propHooks[ name ];\n\t\t}\n\n\t\tif ( value !== undefined ) {\n\t\t\tif ( hooks && \"set\" in hooks &&\n\t\t\t\t( ret = hooks.set( elem, value, name ) ) !== undefined ) {\n\t\t\t\treturn ret;\n\t\t\t}\n\n\t\t\treturn ( elem[ name ] = value );\n\t\t}\n\n\t\tif ( hooks && \"get\" in hooks && ( ret = hooks.get( elem, name ) ) !== null ) {\n\t\t\treturn ret;\n\t\t}\n\n\t\treturn elem[ name ];\n\t},\n\n\tpropHooks: {\n\t\ttabIndex: {\n\t\t\tget: function( elem ) {\n\n\t\t\t\t// Support: IE <=9 - 11 only\n\t\t\t\t// elem.tabIndex doesn't always return the\n\t\t\t\t// correct value when it hasn't been explicitly set\n\t\t\t\t// https://web.archive.org/web/20141116233347/http://fluidproject.org/blog/2008/01/09/getting-setting-and-removing-tabindex-values-with-javascript/\n\t\t\t\t// Use proper attribute retrieval(#12072)\n\t\t\t\tvar tabindex = jQuery.find.attr( elem, \"tabindex\" );\n\n\t\t\t\tif ( tabindex ) {\n\t\t\t\t\treturn parseInt( tabindex, 10 );\n\t\t\t\t}\n\n\t\t\t\tif (\n\t\t\t\t\trfocusable.test( elem.nodeName ) ||\n\t\t\t\t\trclickable.test( elem.nodeName ) &&\n\t\t\t\t\telem.href\n\t\t\t\t) {\n\t\t\t\t\treturn 0;\n\t\t\t\t}\n\n\t\t\t\treturn -1;\n\t\t\t}\n\t\t}\n\t},\n\n\tpropFix: {\n\t\t\"for\": \"htmlFor\",\n\t\t\"class\": \"className\"\n\t}\n} );\n\n// Support: IE <=11 only\n// Accessing the selectedIndex property\n// forces the browser to respect setting selected\n// on the option\n// The getter ensures a default option is selected\n// when in an optgroup\n// eslint rule \"no-unused-expressions\" is disabled for this code\n// since it considers such accessions noop\nif ( !support.optSelected ) {\n\tjQuery.propHooks.selected = {\n\t\tget: function( elem ) {\n\n\t\t\t/* eslint no-unused-expressions: \"off\" */\n\n\t\t\tvar parent = elem.parentNode;\n\t\t\tif ( parent && parent.parentNode ) {\n\t\t\t\tparent.parentNode.selectedIndex;\n\t\t\t}\n\t\t\treturn null;\n\t\t},\n\t\tset: function( elem ) {\n\n\t\t\t/* eslint no-unused-expressions: \"off\" */\n\n\t\t\tvar parent = elem.parentNode;\n\t\t\tif ( parent ) {\n\t\t\t\tparent.selectedIndex;\n\n\t\t\t\tif ( parent.parentNode ) {\n\t\t\t\t\tparent.parentNode.selectedIndex;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t};\n}\n\njQuery.each( [\n\t\"tabIndex\",\n\t\"readOnly\",\n\t\"maxLength\",\n\t\"cellSpacing\",\n\t\"cellPadding\",\n\t\"rowSpan\",\n\t\"colSpan\",\n\t\"useMap\",\n\t\"frameBorder\",\n\t\"contentEditable\"\n], function() {\n\tjQuery.propFix[ this.toLowerCase() ] = this;\n} );\n\n\n\n\n\t// Strip and collapse whitespace according to HTML spec\n\t// https://html.spec.whatwg.org/multipage/infrastructure.html#strip-and-collapse-whitespace\n\tfunction stripAndCollapse( value ) {\n\t\tvar tokens = value.match( rnothtmlwhite ) || [];\n\t\treturn tokens.join( \" \" );\n\t}\n\n\nfunction getClass( elem ) {\n\treturn elem.getAttribute && elem.getAttribute( \"class\" ) || \"\";\n}\n\njQuery.fn.extend( {\n\taddClass: function( value ) {\n\t\tvar classes, elem, cur, curValue, clazz, j, finalValue,\n\t\t\ti = 0;\n\n\t\tif ( jQuery.isFunction( value ) ) {\n\t\t\treturn this.each( function( j ) {\n\t\t\t\tjQuery( this ).addClass( value.call( this, j, getClass( this ) ) );\n\t\t\t} );\n\t\t}\n\n\t\tif ( typeof value === \"string\" && value ) {\n\t\t\tclasses = value.match( rnothtmlwhite ) || [];\n\n\t\t\twhile ( ( elem = this[ i++ ] ) ) {\n\t\t\t\tcurValue = getClass( elem );\n\t\t\t\tcur = elem.nodeType === 1 && ( \" \" + stripAndCollapse( curValue ) + \" \" );\n\n\t\t\t\tif ( cur ) {\n\t\t\t\t\tj = 0;\n\t\t\t\t\twhile ( ( clazz = classes[ j++ ] ) ) {\n\t\t\t\t\t\tif ( cur.indexOf( \" \" + clazz + \" \" ) < 0 ) {\n\t\t\t\t\t\t\tcur += clazz + \" \";\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\n\t\t\t\t\t// Only assign if different to avoid unneeded rendering.\n\t\t\t\t\tfinalValue = stripAndCollapse( cur );\n\t\t\t\t\tif ( curValue !== finalValue ) {\n\t\t\t\t\t\telem.setAttribute( \"class\", finalValue );\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\treturn this;\n\t},\n\n\tremoveClass: function( value ) {\n\t\tvar classes, elem, cur, curValue, clazz, j, finalValue,\n\t\t\ti = 0;\n\n\t\tif ( jQuery.isFunction( value ) ) {\n\t\t\treturn this.each( function( j ) {\n\t\t\t\tjQuery( this ).removeClass( value.call( this, j, getClass( this ) ) );\n\t\t\t} );\n\t\t}\n\n\t\tif ( !arguments.length ) {\n\t\t\treturn this.attr( \"class\", \"\" );\n\t\t}\n\n\t\tif ( typeof value === \"string\" && value ) {\n\t\t\tclasses = value.match( rnothtmlwhite ) || [];\n\n\t\t\twhile ( ( elem = this[ i++ ] ) ) {\n\t\t\t\tcurValue = getClass( elem );\n\n\t\t\t\t// This expression is here for better compressibility (see addClass)\n\t\t\t\tcur = elem.nodeType === 1 && ( \" \" + stripAndCollapse( curValue ) + \" \" );\n\n\t\t\t\tif ( cur ) {\n\t\t\t\t\tj = 0;\n\t\t\t\t\twhile ( ( clazz = classes[ j++ ] ) ) {\n\n\t\t\t\t\t\t// Remove *all* instances\n\t\t\t\t\t\twhile ( cur.indexOf( \" \" + clazz + \" \" ) > -1 ) {\n\t\t\t\t\t\t\tcur = cur.replace( \" \" + clazz + \" \", \" \" );\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\n\t\t\t\t\t// Only assign if different to avoid unneeded rendering.\n\t\t\t\t\tfinalValue = stripAndCollapse( cur );\n\t\t\t\t\tif ( curValue !== finalValue ) {\n\t\t\t\t\t\telem.setAttribute( \"class\", finalValue );\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\treturn this;\n\t},\n\n\ttoggleClass: function( value, stateVal ) {\n\t\tvar type = typeof value;\n\n\t\tif ( typeof stateVal === \"boolean\" && type === \"string\" ) {\n\t\t\treturn stateVal ? this.addClass( value ) : this.removeClass( value );\n\t\t}\n\n\t\tif ( jQuery.isFunction( value ) ) {\n\t\t\treturn this.each( function( i ) {\n\t\t\t\tjQuery( this ).toggleClass(\n\t\t\t\t\tvalue.call( this, i, getClass( this ), stateVal ),\n\t\t\t\t\tstateVal\n\t\t\t\t);\n\t\t\t} );\n\t\t}\n\n\t\treturn this.each( function() {\n\t\t\tvar className, i, self, classNames;\n\n\t\t\tif ( type === \"string\" ) {\n\n\t\t\t\t// Toggle individual class names\n\t\t\t\ti = 0;\n\t\t\t\tself = jQuery( this );\n\t\t\t\tclassNames = value.match( rnothtmlwhite ) || [];\n\n\t\t\t\twhile ( ( className = classNames[ i++ ] ) ) {\n\n\t\t\t\t\t// Check each className given, space separated list\n\t\t\t\t\tif ( self.hasClass( className ) ) {\n\t\t\t\t\t\tself.removeClass( className );\n\t\t\t\t\t} else {\n\t\t\t\t\t\tself.addClass( className );\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t// Toggle whole class name\n\t\t\t} else if ( value === undefined || type === \"boolean\" ) {\n\t\t\t\tclassName = getClass( this );\n\t\t\t\tif ( className ) {\n\n\t\t\t\t\t// Store className if set\n\t\t\t\t\tdataPriv.set( this, \"__className__\", className );\n\t\t\t\t}\n\n\t\t\t\t// If the element has a class name or if we're passed `false`,\n\t\t\t\t// then remove the whole classname (if there was one, the above saved it).\n\t\t\t\t// Otherwise bring back whatever was previously saved (if anything),\n\t\t\t\t// falling back to the empty string if nothing was stored.\n\t\t\t\tif ( this.setAttribute ) {\n\t\t\t\t\tthis.setAttribute( \"class\",\n\t\t\t\t\t\tclassName || value === false ?\n\t\t\t\t\t\t\"\" :\n\t\t\t\t\t\tdataPriv.get( this, \"__className__\" ) || \"\"\n\t\t\t\t\t);\n\t\t\t\t}\n\t\t\t}\n\t\t} );\n\t},\n\n\thasClass: function( selector ) {\n\t\tvar className, elem,\n\t\t\ti = 0;\n\n\t\tclassName = \" \" + selector + \" \";\n\t\twhile ( ( elem = this[ i++ ] ) ) {\n\t\t\tif ( elem.nodeType === 1 &&\n\t\t\t\t( \" \" + stripAndCollapse( getClass( elem ) ) + \" \" ).indexOf( className ) > -1 ) {\n\t\t\t\t\treturn true;\n\t\t\t}\n\t\t}\n\n\t\treturn false;\n\t}\n} );\n\n\n\n\nvar rreturn = /\\r/g;\n\njQuery.fn.extend( {\n\tval: function( value ) {\n\t\tvar hooks, ret, isFunction,\n\t\t\telem = this[ 0 ];\n\n\t\tif ( !arguments.length ) {\n\t\t\tif ( elem ) {\n\t\t\t\thooks = jQuery.valHooks[ elem.type ] ||\n\t\t\t\t\tjQuery.valHooks[ elem.nodeName.toLowerCase() ];\n\n\t\t\t\tif ( hooks &&\n\t\t\t\t\t\"get\" in hooks &&\n\t\t\t\t\t( ret = hooks.get( elem, \"value\" ) ) !== undefined\n\t\t\t\t) {\n\t\t\t\t\treturn ret;\n\t\t\t\t}\n\n\t\t\t\tret = elem.value;\n\n\t\t\t\t// Handle most common string cases\n\t\t\t\tif ( typeof ret === \"string\" ) {\n\t\t\t\t\treturn ret.replace( rreturn, \"\" );\n\t\t\t\t}\n\n\t\t\t\t// Handle cases where value is null/undef or number\n\t\t\t\treturn ret == null ? \"\" : ret;\n\t\t\t}\n\n\t\t\treturn;\n\t\t}\n\n\t\tisFunction = jQuery.isFunction( value );\n\n\t\treturn this.each( function( i ) {\n\t\t\tvar val;\n\n\t\t\tif ( this.nodeType !== 1 ) {\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tif ( isFunction ) {\n\t\t\t\tval = value.call( this, i, jQuery( this ).val() );\n\t\t\t} else {\n\t\t\t\tval = value;\n\t\t\t}\n\n\t\t\t// Treat null/undefined as \"\"; convert numbers to string\n\t\t\tif ( val == null ) {\n\t\t\t\tval = \"\";\n\n\t\t\t} else if ( typeof val === \"number\" ) {\n\t\t\t\tval += \"\";\n\n\t\t\t} else if ( jQuery.isArray( val ) ) {\n\t\t\t\tval = jQuery.map( val, function( value ) {\n\t\t\t\t\treturn value == null ? \"\" : value + \"\";\n\t\t\t\t} );\n\t\t\t}\n\n\t\t\thooks = jQuery.valHooks[ this.type ] || jQuery.valHooks[ this.nodeName.toLowerCase() ];\n\n\t\t\t// If set returns undefined, fall back to normal setting\n\t\t\tif ( !hooks || !( \"set\" in hooks ) || hooks.set( this, val, \"value\" ) === undefined ) {\n\t\t\t\tthis.value = val;\n\t\t\t}\n\t\t} );\n\t}\n} );\n\njQuery.extend( {\n\tvalHooks: {\n\t\toption: {\n\t\t\tget: function( elem ) {\n\n\t\t\t\tvar val = jQuery.find.attr( elem, \"value\" );\n\t\t\t\treturn val != null ?\n\t\t\t\t\tval :\n\n\t\t\t\t\t// Support: IE <=10 - 11 only\n\t\t\t\t\t// option.text throws exceptions (#14686, #14858)\n\t\t\t\t\t// Strip and collapse whitespace\n\t\t\t\t\t// https://html.spec.whatwg.org/#strip-and-collapse-whitespace\n\t\t\t\t\tstripAndCollapse( jQuery.text( elem ) );\n\t\t\t}\n\t\t},\n\t\tselect: {\n\t\t\tget: function( elem ) {\n\t\t\t\tvar value, option, i,\n\t\t\t\t\toptions = elem.options,\n\t\t\t\t\tindex = elem.selectedIndex,\n\t\t\t\t\tone = elem.type === \"select-one\",\n\t\t\t\t\tvalues = one ? null : [],\n\t\t\t\t\tmax = one ? index + 1 : options.length;\n\n\t\t\t\tif ( index < 0 ) {\n\t\t\t\t\ti = max;\n\n\t\t\t\t} else {\n\t\t\t\t\ti = one ? index : 0;\n\t\t\t\t}\n\n\t\t\t\t// Loop through all the selected options\n\t\t\t\tfor ( ; i < max; i++ ) {\n\t\t\t\t\toption = options[ i ];\n\n\t\t\t\t\t// Support: IE <=9 only\n\t\t\t\t\t// IE8-9 doesn't update selected after form reset (#2551)\n\t\t\t\t\tif ( ( option.selected || i === index ) &&\n\n\t\t\t\t\t\t\t// Don't return options that are disabled or in a disabled optgroup\n\t\t\t\t\t\t\t!option.disabled &&\n\t\t\t\t\t\t\t( !option.parentNode.disabled ||\n\t\t\t\t\t\t\t\t!jQuery.nodeName( option.parentNode, \"optgroup\" ) ) ) {\n\n\t\t\t\t\t\t// Get the specific value for the option\n\t\t\t\t\t\tvalue = jQuery( option ).val();\n\n\t\t\t\t\t\t// We don't need an array for one selects\n\t\t\t\t\t\tif ( one ) {\n\t\t\t\t\t\t\treturn value;\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\t// Multi-Selects return an array\n\t\t\t\t\t\tvalues.push( value );\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\treturn values;\n\t\t\t},\n\n\t\t\tset: function( elem, value ) {\n\t\t\t\tvar optionSet, option,\n\t\t\t\t\toptions = elem.options,\n\t\t\t\t\tvalues = jQuery.makeArray( value ),\n\t\t\t\t\ti = options.length;\n\n\t\t\t\twhile ( i-- ) {\n\t\t\t\t\toption = options[ i ];\n\n\t\t\t\t\t/* eslint-disable no-cond-assign */\n\n\t\t\t\t\tif ( option.selected =\n\t\t\t\t\t\tjQuery.inArray( jQuery.valHooks.option.get( option ), values ) > -1\n\t\t\t\t\t) {\n\t\t\t\t\t\toptionSet = true;\n\t\t\t\t\t}\n\n\t\t\t\t\t/* eslint-enable no-cond-assign */\n\t\t\t\t}\n\n\t\t\t\t// Force browsers to behave consistently when non-matching value is set\n\t\t\t\tif ( !optionSet ) {\n\t\t\t\t\telem.selectedIndex = -1;\n\t\t\t\t}\n\t\t\t\treturn values;\n\t\t\t}\n\t\t}\n\t}\n} );\n\n// Radios and checkboxes getter/setter\njQuery.each( [ \"radio\", \"checkbox\" ], function() {\n\tjQuery.valHooks[ this ] = {\n\t\tset: function( elem, value ) {\n\t\t\tif ( jQuery.isArray( value ) ) {\n\t\t\t\treturn ( elem.checked = jQuery.inArray( jQuery( elem ).val(), value ) > -1 );\n\t\t\t}\n\t\t}\n\t};\n\tif ( !support.checkOn ) {\n\t\tjQuery.valHooks[ this ].get = function( elem ) {\n\t\t\treturn elem.getAttribute( \"value\" ) === null ? \"on\" : elem.value;\n\t\t};\n\t}\n} );\n\n\n\n\n// Return jQuery for attributes-only inclusion\n\n\nvar rfocusMorph = /^(?:focusinfocus|focusoutblur)$/;\n\njQuery.extend( jQuery.event, {\n\n\ttrigger: function( event, data, elem, onlyHandlers ) {\n\n\t\tvar i, cur, tmp, bubbleType, ontype, handle, special,\n\t\t\teventPath = [ elem || document ],\n\t\t\ttype = hasOwn.call( event, \"type\" ) ? event.type : event,\n\t\t\tnamespaces = hasOwn.call( event, \"namespace\" ) ? event.namespace.split( \".\" ) : [];\n\n\t\tcur = tmp = elem = elem || document;\n\n\t\t// Don't do events on text and comment nodes\n\t\tif ( elem.nodeType === 3 || elem.nodeType === 8 ) {\n\t\t\treturn;\n\t\t}\n\n\t\t// focus/blur morphs to focusin/out; ensure we're not firing them right now\n\t\tif ( rfocusMorph.test( type + jQuery.event.triggered ) ) {\n\t\t\treturn;\n\t\t}\n\n\t\tif ( type.indexOf( \".\" ) > -1 ) {\n\n\t\t\t// Namespaced trigger; create a regexp to match event type in handle()\n\t\t\tnamespaces = type.split( \".\" );\n\t\t\ttype = namespaces.shift();\n\t\t\tnamespaces.sort();\n\t\t}\n\t\tontype = type.indexOf( \":\" ) < 0 && \"on\" + type;\n\n\t\t// Caller can pass in a jQuery.Event object, Object, or just an event type string\n\t\tevent = event[ jQuery.expando ] ?\n\t\t\tevent :\n\t\t\tnew jQuery.Event( type, typeof event === \"object\" && event );\n\n\t\t// Trigger bitmask: & 1 for native handlers; & 2 for jQuery (always true)\n\t\tevent.isTrigger = onlyHandlers ? 2 : 3;\n\t\tevent.namespace = namespaces.join( \".\" );\n\t\tevent.rnamespace = event.namespace ?\n\t\t\tnew RegExp( \"(^|\\\\.)\" + namespaces.join( \"\\\\.(?:.*\\\\.|)\" ) + \"(\\\\.|$)\" ) :\n\t\t\tnull;\n\n\t\t// Clean up the event in case it is being reused\n\t\tevent.result = undefined;\n\t\tif ( !event.target ) {\n\t\t\tevent.target = elem;\n\t\t}\n\n\t\t// Clone any incoming data and prepend the event, creating the handler arg list\n\t\tdata = data == null ?\n\t\t\t[ event ] :\n\t\t\tjQuery.makeArray( data, [ event ] );\n\n\t\t// Allow special events to draw outside the lines\n\t\tspecial = jQuery.event.special[ type ] || {};\n\t\tif ( !onlyHandlers && special.trigger && special.trigger.apply( elem, data ) === false ) {\n\t\t\treturn;\n\t\t}\n\n\t\t// Determine event propagation path in advance, per W3C events spec (#9951)\n\t\t// Bubble up to document, then to window; watch for a global ownerDocument var (#9724)\n\t\tif ( !onlyHandlers && !special.noBubble && !jQuery.isWindow( elem ) ) {\n\n\t\t\tbubbleType = special.delegateType || type;\n\t\t\tif ( !rfocusMorph.test( bubbleType + type ) ) {\n\t\t\t\tcur = cur.parentNode;\n\t\t\t}\n\t\t\tfor ( ; cur; cur = cur.parentNode ) {\n\t\t\t\teventPath.push( cur );\n\t\t\t\ttmp = cur;\n\t\t\t}\n\n\t\t\t// Only add window if we got to document (e.g., not plain obj or detached DOM)\n\t\t\tif ( tmp === ( elem.ownerDocument || document ) ) {\n\t\t\t\teventPath.push( tmp.defaultView || tmp.parentWindow || window );\n\t\t\t}\n\t\t}\n\n\t\t// Fire handlers on the event path\n\t\ti = 0;\n\t\twhile ( ( cur = eventPath[ i++ ] ) && !event.isPropagationStopped() ) {\n\n\t\t\tevent.type = i > 1 ?\n\t\t\t\tbubbleType :\n\t\t\t\tspecial.bindType || type;\n\n\t\t\t// jQuery handler\n\t\t\thandle = ( dataPriv.get( cur, \"events\" ) || {} )[ event.type ] &&\n\t\t\t\tdataPriv.get( cur, \"handle\" );\n\t\t\tif ( handle ) {\n\t\t\t\thandle.apply( cur, data );\n\t\t\t}\n\n\t\t\t// Native handler\n\t\t\thandle = ontype && cur[ ontype ];\n\t\t\tif ( handle && handle.apply && acceptData( cur ) ) {\n\t\t\t\tevent.result = handle.apply( cur, data );\n\t\t\t\tif ( event.result === false ) {\n\t\t\t\t\tevent.preventDefault();\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\tevent.type = type;\n\n\t\t// If nobody prevented the default action, do it now\n\t\tif ( !onlyHandlers && !event.isDefaultPrevented() ) {\n\n\t\t\tif ( ( !special._default ||\n\t\t\t\tspecial._default.apply( eventPath.pop(), data ) === false ) &&\n\t\t\t\tacceptData( elem ) ) {\n\n\t\t\t\t// Call a native DOM method on the target with the same name as the event.\n\t\t\t\t// Don't do default actions on window, that's where global variables be (#6170)\n\t\t\t\tif ( ontype && jQuery.isFunction( elem[ type ] ) && !jQuery.isWindow( elem ) ) {\n\n\t\t\t\t\t// Don't re-trigger an onFOO event when we call its FOO() method\n\t\t\t\t\ttmp = elem[ ontype ];\n\n\t\t\t\t\tif ( tmp ) {\n\t\t\t\t\t\telem[ ontype ] = null;\n\t\t\t\t\t}\n\n\t\t\t\t\t// Prevent re-triggering of the same event, since we already bubbled it above\n\t\t\t\t\tjQuery.event.triggered = type;\n\t\t\t\t\telem[ type ]();\n\t\t\t\t\tjQuery.event.triggered = undefined;\n\n\t\t\t\t\tif ( tmp ) {\n\t\t\t\t\t\telem[ ontype ] = tmp;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\treturn event.result;\n\t},\n\n\t// Piggyback on a donor event to simulate a different one\n\t// Used only for `focus(in | out)` events\n\tsimulate: function( type, elem, event ) {\n\t\tvar e = jQuery.extend(\n\t\t\tnew jQuery.Event(),\n\t\t\tevent,\n\t\t\t{\n\t\t\t\ttype: type,\n\t\t\t\tisSimulated: true\n\t\t\t}\n\t\t);\n\n\t\tjQuery.event.trigger( e, null, elem );\n\t}\n\n} );\n\njQuery.fn.extend( {\n\n\ttrigger: function( type, data ) {\n\t\treturn this.each( function() {\n\t\t\tjQuery.event.trigger( type, data, this );\n\t\t} );\n\t},\n\ttriggerHandler: function( type, data ) {\n\t\tvar elem = this[ 0 ];\n\t\tif ( elem ) {\n\t\t\treturn jQuery.event.trigger( type, data, elem, true );\n\t\t}\n\t}\n} );\n\n\njQuery.each( ( \"blur focus focusin focusout resize scroll click dblclick \" +\n\t\"mousedown mouseup mousemove mouseover mouseout mouseenter mouseleave \" +\n\t\"change select submit keydown keypress keyup contextmenu\" ).split( \" \" ),\n\tfunction( i, name ) {\n\n\t// Handle event binding\n\tjQuery.fn[ name ] = function( data, fn ) {\n\t\treturn arguments.length > 0 ?\n\t\t\tthis.on( name, null, data, fn ) :\n\t\t\tthis.trigger( name );\n\t};\n} );\n\njQuery.fn.extend( {\n\thover: function( fnOver, fnOut ) {\n\t\treturn this.mouseenter( fnOver ).mouseleave( fnOut || fnOver );\n\t}\n} );\n\n\n\n\nsupport.focusin = \"onfocusin\" in window;\n\n\n// Support: Firefox <=44\n// Firefox doesn't have focus(in | out) events\n// Related ticket - https://bugzilla.mozilla.org/show_bug.cgi?id=687787\n//\n// Support: Chrome <=48 - 49, Safari <=9.0 - 9.1\n// focus(in | out) events fire after focus & blur events,\n// which is spec violation - http://www.w3.org/TR/DOM-Level-3-Events/#events-focusevent-event-order\n// Related ticket - https://bugs.chromium.org/p/chromium/issues/detail?id=449857\nif ( !support.focusin ) {\n\tjQuery.each( { focus: \"focusin\", blur: \"focusout\" }, function( orig, fix ) {\n\n\t\t// Attach a single capturing handler on the document while someone wants focusin/focusout\n\t\tvar handler = function( event ) {\n\t\t\tjQuery.event.simulate( fix, event.target, jQuery.event.fix( event ) );\n\t\t};\n\n\t\tjQuery.event.special[ fix ] = {\n\t\t\tsetup: function() {\n\t\t\t\tvar doc = this.ownerDocument || this,\n\t\t\t\t\tattaches = dataPriv.access( doc, fix );\n\n\t\t\t\tif ( !attaches ) {\n\t\t\t\t\tdoc.addEventListener( orig, handler, true );\n\t\t\t\t}\n\t\t\t\tdataPriv.access( doc, fix, ( attaches || 0 ) + 1 );\n\t\t\t},\n\t\t\tteardown: function() {\n\t\t\t\tvar doc = this.ownerDocument || this,\n\t\t\t\t\tattaches = dataPriv.access( doc, fix ) - 1;\n\n\t\t\t\tif ( !attaches ) {\n\t\t\t\t\tdoc.removeEventListener( orig, handler, true );\n\t\t\t\t\tdataPriv.remove( doc, fix );\n\n\t\t\t\t} else {\n\t\t\t\t\tdataPriv.access( doc, fix, attaches );\n\t\t\t\t}\n\t\t\t}\n\t\t};\n\t} );\n}\nvar location = window.location;\n\nvar nonce = jQuery.now();\n\nvar rquery = ( /\\?/ );\n\n\n\n// Cross-browser xml parsing\njQuery.parseXML = function( data ) {\n\tvar xml;\n\tif ( !data || typeof data !== \"string\" ) {\n\t\treturn null;\n\t}\n\n\t// Support: IE 9 - 11 only\n\t// IE throws on parseFromString with invalid input.\n\ttry {\n\t\txml = ( new window.DOMParser() ).parseFromString( data, \"text/xml\" );\n\t} catch ( e ) {\n\t\txml = undefined;\n\t}\n\n\tif ( !xml || xml.getElementsByTagName( \"parsererror\" ).length ) {\n\t\tjQuery.error( \"Invalid XML: \" + data );\n\t}\n\treturn xml;\n};\n\n\nvar\n\trbracket = /\\[\\]$/,\n\trCRLF = /\\r?\\n/g,\n\trsubmitterTypes = /^(?:submit|button|image|reset|file)$/i,\n\trsubmittable = /^(?:input|select|textarea|keygen)/i;\n\nfunction buildParams( prefix, obj, traditional, add ) {\n\tvar name;\n\n\tif ( jQuery.isArray( obj ) ) {\n\n\t\t// Serialize array item.\n\t\tjQuery.each( obj, function( i, v ) {\n\t\t\tif ( traditional || rbracket.test( prefix ) ) {\n\n\t\t\t\t// Treat each array item as a scalar.\n\t\t\t\tadd( prefix, v );\n\n\t\t\t} else {\n\n\t\t\t\t// Item is non-scalar (array or object), encode its numeric index.\n\t\t\t\tbuildParams(\n\t\t\t\t\tprefix + \"[\" + ( typeof v === \"object\" && v != null ? i : \"\" ) + \"]\",\n\t\t\t\t\tv,\n\t\t\t\t\ttraditional,\n\t\t\t\t\tadd\n\t\t\t\t);\n\t\t\t}\n\t\t} );\n\n\t} else if ( !traditional && jQuery.type( obj ) === \"object\" ) {\n\n\t\t// Serialize object item.\n\t\tfor ( name in obj ) {\n\t\t\tbuildParams( prefix + \"[\" + name + \"]\", obj[ name ], traditional, add );\n\t\t}\n\n\t} else {\n\n\t\t// Serialize scalar item.\n\t\tadd( prefix, obj );\n\t}\n}\n\n// Serialize an array of form elements or a set of\n// key/values into a query string\njQuery.param = function( a, traditional ) {\n\tvar prefix,\n\t\ts = [],\n\t\tadd = function( key, valueOrFunction ) {\n\n\t\t\t// If value is a function, invoke it and use its return value\n\t\t\tvar value = jQuery.isFunction( valueOrFunction ) ?\n\t\t\t\tvalueOrFunction() :\n\t\t\t\tvalueOrFunction;\n\n\t\t\ts[ s.length ] = encodeURIComponent( key ) + \"=\" +\n\t\t\t\tencodeURIComponent( value == null ? \"\" : value );\n\t\t};\n\n\t// If an array was passed in, assume that it is an array of form elements.\n\tif ( jQuery.isArray( a ) || ( a.jquery && !jQuery.isPlainObject( a ) ) ) {\n\n\t\t// Serialize the form elements\n\t\tjQuery.each( a, function() {\n\t\t\tadd( this.name, this.value );\n\t\t} );\n\n\t} else {\n\n\t\t// If traditional, encode the \"old\" way (the way 1.3.2 or older\n\t\t// did it), otherwise encode params recursively.\n\t\tfor ( prefix in a ) {\n\t\t\tbuildParams( prefix, a[ prefix ], traditional, add );\n\t\t}\n\t}\n\n\t// Return the resulting serialization\n\treturn s.join( \"&\" );\n};\n\njQuery.fn.extend( {\n\tserialize: function() {\n\t\treturn jQuery.param( this.serializeArray() );\n\t},\n\tserializeArray: function() {\n\t\treturn this.map( function() {\n\n\t\t\t// Can add propHook for \"elements\" to filter or add form elements\n\t\t\tvar elements = jQuery.prop( this, \"elements\" );\n\t\t\treturn elements ? jQuery.makeArray( elements ) : this;\n\t\t} )\n\t\t.filter( function() {\n\t\t\tvar type = this.type;\n\n\t\t\t// Use .is( \":disabled\" ) so that fieldset[disabled] works\n\t\t\treturn this.name && !jQuery( this ).is( \":disabled\" ) &&\n\t\t\t\trsubmittable.test( this.nodeName ) && !rsubmitterTypes.test( type ) &&\n\t\t\t\t( this.checked || !rcheckableType.test( type ) );\n\t\t} )\n\t\t.map( function( i, elem ) {\n\t\t\tvar val = jQuery( this ).val();\n\n\t\t\tif ( val == null ) {\n\t\t\t\treturn null;\n\t\t\t}\n\n\t\t\tif ( jQuery.isArray( val ) ) {\n\t\t\t\treturn jQuery.map( val, function( val ) {\n\t\t\t\t\treturn { name: elem.name, value: val.replace( rCRLF, \"\\r\\n\" ) };\n\t\t\t\t} );\n\t\t\t}\n\n\t\t\treturn { name: elem.name, value: val.replace( rCRLF, \"\\r\\n\" ) };\n\t\t} ).get();\n\t}\n} );\n\n\nvar\n\tr20 = /%20/g,\n\trhash = /#.*$/,\n\trantiCache = /([?&])_=[^&]*/,\n\trheaders = /^(.*?):[ \\t]*([^\\r\\n]*)$/mg,\n\n\t// #7653, #8125, #8152: local protocol detection\n\trlocalProtocol = /^(?:about|app|app-storage|.+-extension|file|res|widget):$/,\n\trnoContent = /^(?:GET|HEAD)$/,\n\trprotocol = /^\\/\\//,\n\n\t/* Prefilters\n\t * 1) They are useful to introduce custom dataTypes (see ajax/jsonp.js for an example)\n\t * 2) These are called:\n\t *    - BEFORE asking for a transport\n\t *    - AFTER param serialization (s.data is a string if s.processData is true)\n\t * 3) key is the dataType\n\t * 4) the catchall symbol \"*\" can be used\n\t * 5) execution will start with transport dataType and THEN continue down to \"*\" if needed\n\t */\n\tprefilters = {},\n\n\t/* Transports bindings\n\t * 1) key is the dataType\n\t * 2) the catchall symbol \"*\" can be used\n\t * 3) selection will start with transport dataType and THEN go to \"*\" if needed\n\t */\n\ttransports = {},\n\n\t// Avoid comment-prolog char sequence (#10098); must appease lint and evade compression\n\tallTypes = \"*/\".concat( \"*\" ),\n\n\t// Anchor tag for parsing the document origin\n\toriginAnchor = document.createElement( \"a\" );\n\toriginAnchor.href = location.href;\n\n// Base \"constructor\" for jQuery.ajaxPrefilter and jQuery.ajaxTransport\nfunction addToPrefiltersOrTransports( structure ) {\n\n\t// dataTypeExpression is optional and defaults to \"*\"\n\treturn function( dataTypeExpression, func ) {\n\n\t\tif ( typeof dataTypeExpression !== \"string\" ) {\n\t\t\tfunc = dataTypeExpression;\n\t\t\tdataTypeExpression = \"*\";\n\t\t}\n\n\t\tvar dataType,\n\t\t\ti = 0,\n\t\t\tdataTypes = dataTypeExpression.toLowerCase().match( rnothtmlwhite ) || [];\n\n\t\tif ( jQuery.isFunction( func ) ) {\n\n\t\t\t// For each dataType in the dataTypeExpression\n\t\t\twhile ( ( dataType = dataTypes[ i++ ] ) ) {\n\n\t\t\t\t// Prepend if requested\n\t\t\t\tif ( dataType[ 0 ] === \"+\" ) {\n\t\t\t\t\tdataType = dataType.slice( 1 ) || \"*\";\n\t\t\t\t\t( structure[ dataType ] = structure[ dataType ] || [] ).unshift( func );\n\n\t\t\t\t// Otherwise append\n\t\t\t\t} else {\n\t\t\t\t\t( structure[ dataType ] = structure[ dataType ] || [] ).push( func );\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t};\n}\n\n// Base inspection function for prefilters and transports\nfunction inspectPrefiltersOrTransports( structure, options, originalOptions, jqXHR ) {\n\n\tvar inspected = {},\n\t\tseekingTransport = ( structure === transports );\n\n\tfunction inspect( dataType ) {\n\t\tvar selected;\n\t\tinspected[ dataType ] = true;\n\t\tjQuery.each( structure[ dataType ] || [], function( _, prefilterOrFactory ) {\n\t\t\tvar dataTypeOrTransport = prefilterOrFactory( options, originalOptions, jqXHR );\n\t\t\tif ( typeof dataTypeOrTransport === \"string\" &&\n\t\t\t\t!seekingTransport && !inspected[ dataTypeOrTransport ] ) {\n\n\t\t\t\toptions.dataTypes.unshift( dataTypeOrTransport );\n\t\t\t\tinspect( dataTypeOrTransport );\n\t\t\t\treturn false;\n\t\t\t} else if ( seekingTransport ) {\n\t\t\t\treturn !( selected = dataTypeOrTransport );\n\t\t\t}\n\t\t} );\n\t\treturn selected;\n\t}\n\n\treturn inspect( options.dataTypes[ 0 ] ) || !inspected[ \"*\" ] && inspect( \"*\" );\n}\n\n// A special extend for ajax options\n// that takes \"flat\" options (not to be deep extended)\n// Fixes #9887\nfunction ajaxExtend( target, src ) {\n\tvar key, deep,\n\t\tflatOptions = jQuery.ajaxSettings.flatOptions || {};\n\n\tfor ( key in src ) {\n\t\tif ( src[ key ] !== undefined ) {\n\t\t\t( flatOptions[ key ] ? target : ( deep || ( deep = {} ) ) )[ key ] = src[ key ];\n\t\t}\n\t}\n\tif ( deep ) {\n\t\tjQuery.extend( true, target, deep );\n\t}\n\n\treturn target;\n}\n\n/* Handles responses to an ajax request:\n * - finds the right dataType (mediates between content-type and expected dataType)\n * - returns the corresponding response\n */\nfunction ajaxHandleResponses( s, jqXHR, responses ) {\n\n\tvar ct, type, finalDataType, firstDataType,\n\t\tcontents = s.contents,\n\t\tdataTypes = s.dataTypes;\n\n\t// Remove auto dataType and get content-type in the process\n\twhile ( dataTypes[ 0 ] === \"*\" ) {\n\t\tdataTypes.shift();\n\t\tif ( ct === undefined ) {\n\t\t\tct = s.mimeType || jqXHR.getResponseHeader( \"Content-Type\" );\n\t\t}\n\t}\n\n\t// Check if we're dealing with a known content-type\n\tif ( ct ) {\n\t\tfor ( type in contents ) {\n\t\t\tif ( contents[ type ] && contents[ type ].test( ct ) ) {\n\t\t\t\tdataTypes.unshift( type );\n\t\t\t\tbreak;\n\t\t\t}\n\t\t}\n\t}\n\n\t// Check to see if we have a response for the expected dataType\n\tif ( dataTypes[ 0 ] in responses ) {\n\t\tfinalDataType = dataTypes[ 0 ];\n\t} else {\n\n\t\t// Try convertible dataTypes\n\t\tfor ( type in responses ) {\n\t\t\tif ( !dataTypes[ 0 ] || s.converters[ type + \" \" + dataTypes[ 0 ] ] ) {\n\t\t\t\tfinalDataType = type;\n\t\t\t\tbreak;\n\t\t\t}\n\t\t\tif ( !firstDataType ) {\n\t\t\t\tfirstDataType = type;\n\t\t\t}\n\t\t}\n\n\t\t// Or just use first one\n\t\tfinalDataType = finalDataType || firstDataType;\n\t}\n\n\t// If we found a dataType\n\t// We add the dataType to the list if needed\n\t// and return the corresponding response\n\tif ( finalDataType ) {\n\t\tif ( finalDataType !== dataTypes[ 0 ] ) {\n\t\t\tdataTypes.unshift( finalDataType );\n\t\t}\n\t\treturn responses[ finalDataType ];\n\t}\n}\n\n/* Chain conversions given the request and the original response\n * Also sets the responseXXX fields on the jqXHR instance\n */\nfunction ajaxConvert( s, response, jqXHR, isSuccess ) {\n\tvar conv2, current, conv, tmp, prev,\n\t\tconverters = {},\n\n\t\t// Work with a copy of dataTypes in case we need to modify it for conversion\n\t\tdataTypes = s.dataTypes.slice();\n\n\t// Create converters map with lowercased keys\n\tif ( dataTypes[ 1 ] ) {\n\t\tfor ( conv in s.converters ) {\n\t\t\tconverters[ conv.toLowerCase() ] = s.converters[ conv ];\n\t\t}\n\t}\n\n\tcurrent = dataTypes.shift();\n\n\t// Convert to each sequential dataType\n\twhile ( current ) {\n\n\t\tif ( s.responseFields[ current ] ) {\n\t\t\tjqXHR[ s.responseFields[ current ] ] = response;\n\t\t}\n\n\t\t// Apply the dataFilter if provided\n\t\tif ( !prev && isSuccess && s.dataFilter ) {\n\t\t\tresponse = s.dataFilter( response, s.dataType );\n\t\t}\n\n\t\tprev = current;\n\t\tcurrent = dataTypes.shift();\n\n\t\tif ( current ) {\n\n\t\t\t// There's only work to do if current dataType is non-auto\n\t\t\tif ( current === \"*\" ) {\n\n\t\t\t\tcurrent = prev;\n\n\t\t\t// Convert response if prev dataType is non-auto and differs from current\n\t\t\t} else if ( prev !== \"*\" && prev !== current ) {\n\n\t\t\t\t// Seek a direct converter\n\t\t\t\tconv = converters[ prev + \" \" + current ] || converters[ \"* \" + current ];\n\n\t\t\t\t// If none found, seek a pair\n\t\t\t\tif ( !conv ) {\n\t\t\t\t\tfor ( conv2 in converters ) {\n\n\t\t\t\t\t\t// If conv2 outputs current\n\t\t\t\t\t\ttmp = conv2.split( \" \" );\n\t\t\t\t\t\tif ( tmp[ 1 ] === current ) {\n\n\t\t\t\t\t\t\t// If prev can be converted to accepted input\n\t\t\t\t\t\t\tconv = converters[ prev + \" \" + tmp[ 0 ] ] ||\n\t\t\t\t\t\t\t\tconverters[ \"* \" + tmp[ 0 ] ];\n\t\t\t\t\t\t\tif ( conv ) {\n\n\t\t\t\t\t\t\t\t// Condense equivalence converters\n\t\t\t\t\t\t\t\tif ( conv === true ) {\n\t\t\t\t\t\t\t\t\tconv = converters[ conv2 ];\n\n\t\t\t\t\t\t\t\t// Otherwise, insert the intermediate dataType\n\t\t\t\t\t\t\t\t} else if ( converters[ conv2 ] !== true ) {\n\t\t\t\t\t\t\t\t\tcurrent = tmp[ 0 ];\n\t\t\t\t\t\t\t\t\tdataTypes.unshift( tmp[ 1 ] );\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\t// Apply converter (if not an equivalence)\n\t\t\t\tif ( conv !== true ) {\n\n\t\t\t\t\t// Unless errors are allowed to bubble, catch and return them\n\t\t\t\t\tif ( conv && s.throws ) {\n\t\t\t\t\t\tresponse = conv( response );\n\t\t\t\t\t} else {\n\t\t\t\t\t\ttry {\n\t\t\t\t\t\t\tresponse = conv( response );\n\t\t\t\t\t\t} catch ( e ) {\n\t\t\t\t\t\t\treturn {\n\t\t\t\t\t\t\t\tstate: \"parsererror\",\n\t\t\t\t\t\t\t\terror: conv ? e : \"No conversion from \" + prev + \" to \" + current\n\t\t\t\t\t\t\t};\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\n\treturn { state: \"success\", data: response };\n}\n\njQuery.extend( {\n\n\t// Counter for holding the number of active queries\n\tactive: 0,\n\n\t// Last-Modified header cache for next request\n\tlastModified: {},\n\tetag: {},\n\n\tajaxSettings: {\n\t\turl: location.href,\n\t\ttype: \"GET\",\n\t\tisLocal: rlocalProtocol.test( location.protocol ),\n\t\tglobal: true,\n\t\tprocessData: true,\n\t\tasync: true,\n\t\tcontentType: \"application/x-www-form-urlencoded; charset=UTF-8\",\n\n\t\t/*\n\t\ttimeout: 0,\n\t\tdata: null,\n\t\tdataType: null,\n\t\tusername: null,\n\t\tpassword: null,\n\t\tcache: null,\n\t\tthrows: false,\n\t\ttraditional: false,\n\t\theaders: {},\n\t\t*/\n\n\t\taccepts: {\n\t\t\t\"*\": allTypes,\n\t\t\ttext: \"text/plain\",\n\t\t\thtml: \"text/html\",\n\t\t\txml: \"application/xml, text/xml\",\n\t\t\tjson: \"application/json, text/javascript\"\n\t\t},\n\n\t\tcontents: {\n\t\t\txml: /\\bxml\\b/,\n\t\t\thtml: /\\bhtml/,\n\t\t\tjson: /\\bjson\\b/\n\t\t},\n\n\t\tresponseFields: {\n\t\t\txml: \"responseXML\",\n\t\t\ttext: \"responseText\",\n\t\t\tjson: \"responseJSON\"\n\t\t},\n\n\t\t// Data converters\n\t\t// Keys separate source (or catchall \"*\") and destination types with a single space\n\t\tconverters: {\n\n\t\t\t// Convert anything to text\n\t\t\t\"* text\": String,\n\n\t\t\t// Text to html (true = no transformation)\n\t\t\t\"text html\": true,\n\n\t\t\t// Evaluate text as a json expression\n\t\t\t\"text json\": JSON.parse,\n\n\t\t\t// Parse text as xml\n\t\t\t\"text xml\": jQuery.parseXML\n\t\t},\n\n\t\t// For options that shouldn't be deep extended:\n\t\t// you can add your own custom options here if\n\t\t// and when you create one that shouldn't be\n\t\t// deep extended (see ajaxExtend)\n\t\tflatOptions: {\n\t\t\turl: true,\n\t\t\tcontext: true\n\t\t}\n\t},\n\n\t// Creates a full fledged settings object into target\n\t// with both ajaxSettings and settings fields.\n\t// If target is omitted, writes into ajaxSettings.\n\tajaxSetup: function( target, settings ) {\n\t\treturn settings ?\n\n\t\t\t// Building a settings object\n\t\t\tajaxExtend( ajaxExtend( target, jQuery.ajaxSettings ), settings ) :\n\n\t\t\t// Extending ajaxSettings\n\t\t\tajaxExtend( jQuery.ajaxSettings, target );\n\t},\n\n\tajaxPrefilter: addToPrefiltersOrTransports( prefilters ),\n\tajaxTransport: addToPrefiltersOrTransports( transports ),\n\n\t// Main method\n\tajax: function( url, options ) {\n\n\t\t// If url is an object, simulate pre-1.5 signature\n\t\tif ( typeof url === \"object\" ) {\n\t\t\toptions = url;\n\t\t\turl = undefined;\n\t\t}\n\n\t\t// Force options to be an object\n\t\toptions = options || {};\n\n\t\tvar transport,\n\n\t\t\t// URL without anti-cache param\n\t\t\tcacheURL,\n\n\t\t\t// Response headers\n\t\t\tresponseHeadersString,\n\t\t\tresponseHeaders,\n\n\t\t\t// timeout handle\n\t\t\ttimeoutTimer,\n\n\t\t\t// Url cleanup var\n\t\t\turlAnchor,\n\n\t\t\t// Request state (becomes false upon send and true upon completion)\n\t\t\tcompleted,\n\n\t\t\t// To know if global events are to be dispatched\n\t\t\tfireGlobals,\n\n\t\t\t// Loop variable\n\t\t\ti,\n\n\t\t\t// uncached part of the url\n\t\t\tuncached,\n\n\t\t\t// Create the final options object\n\t\t\ts = jQuery.ajaxSetup( {}, options ),\n\n\t\t\t// Callbacks context\n\t\t\tcallbackContext = s.context || s,\n\n\t\t\t// Context for global events is callbackContext if it is a DOM node or jQuery collection\n\t\t\tglobalEventContext = s.context &&\n\t\t\t\t( callbackContext.nodeType || callbackContext.jquery ) ?\n\t\t\t\t\tjQuery( callbackContext ) :\n\t\t\t\t\tjQuery.event,\n\n\t\t\t// Deferreds\n\t\t\tdeferred = jQuery.Deferred(),\n\t\t\tcompleteDeferred = jQuery.Callbacks( \"once memory\" ),\n\n\t\t\t// Status-dependent callbacks\n\t\t\tstatusCode = s.statusCode || {},\n\n\t\t\t// Headers (they are sent all at once)\n\t\t\trequestHeaders = {},\n\t\t\trequestHeadersNames = {},\n\n\t\t\t// Default abort message\n\t\t\tstrAbort = \"canceled\",\n\n\t\t\t// Fake xhr\n\t\t\tjqXHR = {\n\t\t\t\treadyState: 0,\n\n\t\t\t\t// Builds headers hashtable if needed\n\t\t\t\tgetResponseHeader: function( key ) {\n\t\t\t\t\tvar match;\n\t\t\t\t\tif ( completed ) {\n\t\t\t\t\t\tif ( !responseHeaders ) {\n\t\t\t\t\t\t\tresponseHeaders = {};\n\t\t\t\t\t\t\twhile ( ( match = rheaders.exec( responseHeadersString ) ) ) {\n\t\t\t\t\t\t\t\tresponseHeaders[ match[ 1 ].toLowerCase() ] = match[ 2 ];\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t\tmatch = responseHeaders[ key.toLowerCase() ];\n\t\t\t\t\t}\n\t\t\t\t\treturn match == null ? null : match;\n\t\t\t\t},\n\n\t\t\t\t// Raw string\n\t\t\t\tgetAllResponseHeaders: function() {\n\t\t\t\t\treturn completed ? responseHeadersString : null;\n\t\t\t\t},\n\n\t\t\t\t// Caches the header\n\t\t\t\tsetRequestHeader: function( name, value ) {\n\t\t\t\t\tif ( completed == null ) {\n\t\t\t\t\t\tname = requestHeadersNames[ name.toLowerCase() ] =\n\t\t\t\t\t\t\trequestHeadersNames[ name.toLowerCase() ] || name;\n\t\t\t\t\t\trequestHeaders[ name ] = value;\n\t\t\t\t\t}\n\t\t\t\t\treturn this;\n\t\t\t\t},\n\n\t\t\t\t// Overrides response content-type header\n\t\t\t\toverrideMimeType: function( type ) {\n\t\t\t\t\tif ( completed == null ) {\n\t\t\t\t\t\ts.mimeType = type;\n\t\t\t\t\t}\n\t\t\t\t\treturn this;\n\t\t\t\t},\n\n\t\t\t\t// Status-dependent callbacks\n\t\t\t\tstatusCode: function( map ) {\n\t\t\t\t\tvar code;\n\t\t\t\t\tif ( map ) {\n\t\t\t\t\t\tif ( completed ) {\n\n\t\t\t\t\t\t\t// Execute the appropriate callbacks\n\t\t\t\t\t\t\tjqXHR.always( map[ jqXHR.status ] );\n\t\t\t\t\t\t} else {\n\n\t\t\t\t\t\t\t// Lazy-add the new callbacks in a way that preserves old ones\n\t\t\t\t\t\t\tfor ( code in map ) {\n\t\t\t\t\t\t\t\tstatusCode[ code ] = [ statusCode[ code ], map[ code ] ];\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t\treturn this;\n\t\t\t\t},\n\n\t\t\t\t// Cancel the request\n\t\t\t\tabort: function( statusText ) {\n\t\t\t\t\tvar finalText = statusText || strAbort;\n\t\t\t\t\tif ( transport ) {\n\t\t\t\t\t\ttransport.abort( finalText );\n\t\t\t\t\t}\n\t\t\t\t\tdone( 0, finalText );\n\t\t\t\t\treturn this;\n\t\t\t\t}\n\t\t\t};\n\n\t\t// Attach deferreds\n\t\tdeferred.promise( jqXHR );\n\n\t\t// Add protocol if not provided (prefilters might expect it)\n\t\t// Handle falsy url in the settings object (#10093: consistency with old signature)\n\t\t// We also use the url parameter if available\n\t\ts.url = ( ( url || s.url || location.href ) + \"\" )\n\t\t\t.replace( rprotocol, location.protocol + \"//\" );\n\n\t\t// Alias method option to type as per ticket #12004\n\t\ts.type = options.method || options.type || s.method || s.type;\n\n\t\t// Extract dataTypes list\n\t\ts.dataTypes = ( s.dataType || \"*\" ).toLowerCase().match( rnothtmlwhite ) || [ \"\" ];\n\n\t\t// A cross-domain request is in order when the origin doesn't match the current origin.\n\t\tif ( s.crossDomain == null ) {\n\t\t\turlAnchor = document.createElement( \"a\" );\n\n\t\t\t// Support: IE <=8 - 11, Edge 12 - 13\n\t\t\t// IE throws exception on accessing the href property if url is malformed,\n\t\t\t// e.g. http://example.com:80x/\n\t\t\ttry {\n\t\t\t\turlAnchor.href = s.url;\n\n\t\t\t\t// Support: IE <=8 - 11 only\n\t\t\t\t// Anchor's host property isn't correctly set when s.url is relative\n\t\t\t\turlAnchor.href = urlAnchor.href;\n\t\t\t\ts.crossDomain = originAnchor.protocol + \"//\" + originAnchor.host !==\n\t\t\t\t\turlAnchor.protocol + \"//\" + urlAnchor.host;\n\t\t\t} catch ( e ) {\n\n\t\t\t\t// If there is an error parsing the URL, assume it is crossDomain,\n\t\t\t\t// it can be rejected by the transport if it is invalid\n\t\t\t\ts.crossDomain = true;\n\t\t\t}\n\t\t}\n\n\t\t// Convert data if not already a string\n\t\tif ( s.data && s.processData && typeof s.data !== \"string\" ) {\n\t\t\ts.data = jQuery.param( s.data, s.traditional );\n\t\t}\n\n\t\t// Apply prefilters\n\t\tinspectPrefiltersOrTransports( prefilters, s, options, jqXHR );\n\n\t\t// If request was aborted inside a prefilter, stop there\n\t\tif ( completed ) {\n\t\t\treturn jqXHR;\n\t\t}\n\n\t\t// We can fire global events as of now if asked to\n\t\t// Don't fire events if jQuery.event is undefined in an AMD-usage scenario (#15118)\n\t\tfireGlobals = jQuery.event && s.global;\n\n\t\t// Watch for a new set of requests\n\t\tif ( fireGlobals && jQuery.active++ === 0 ) {\n\t\t\tjQuery.event.trigger( \"ajaxStart\" );\n\t\t}\n\n\t\t// Uppercase the type\n\t\ts.type = s.type.toUpperCase();\n\n\t\t// Determine if request has content\n\t\ts.hasContent = !rnoContent.test( s.type );\n\n\t\t// Save the URL in case we're toying with the If-Modified-Since\n\t\t// and/or If-None-Match header later on\n\t\t// Remove hash to simplify url manipulation\n\t\tcacheURL = s.url.replace( rhash, \"\" );\n\n\t\t// More options handling for requests with no content\n\t\tif ( !s.hasContent ) {\n\n\t\t\t// Remember the hash so we can put it back\n\t\t\tuncached = s.url.slice( cacheURL.length );\n\n\t\t\t// If data is available, append data to url\n\t\t\tif ( s.data ) {\n\t\t\t\tcacheURL += ( rquery.test( cacheURL ) ? \"&\" : \"?\" ) + s.data;\n\n\t\t\t\t// #9682: remove data so that it's not used in an eventual retry\n\t\t\t\tdelete s.data;\n\t\t\t}\n\n\t\t\t// Add or update anti-cache param if needed\n\t\t\tif ( s.cache === false ) {\n\t\t\t\tcacheURL = cacheURL.replace( rantiCache, \"$1\" );\n\t\t\t\tuncached = ( rquery.test( cacheURL ) ? \"&\" : \"?\" ) + \"_=\" + ( nonce++ ) + uncached;\n\t\t\t}\n\n\t\t\t// Put hash and anti-cache on the URL that will be requested (gh-1732)\n\t\t\ts.url = cacheURL + uncached;\n\n\t\t// Change '%20' to '+' if this is encoded form body content (gh-2658)\n\t\t} else if ( s.data && s.processData &&\n\t\t\t( s.contentType || \"\" ).indexOf( \"application/x-www-form-urlencoded\" ) === 0 ) {\n\t\t\ts.data = s.data.replace( r20, \"+\" );\n\t\t}\n\n\t\t// Set the If-Modified-Since and/or If-None-Match header, if in ifModified mode.\n\t\tif ( s.ifModified ) {\n\t\t\tif ( jQuery.lastModified[ cacheURL ] ) {\n\t\t\t\tjqXHR.setRequestHeader( \"If-Modified-Since\", jQuery.lastModified[ cacheURL ] );\n\t\t\t}\n\t\t\tif ( jQuery.etag[ cacheURL ] ) {\n\t\t\t\tjqXHR.setRequestHeader( \"If-None-Match\", jQuery.etag[ cacheURL ] );\n\t\t\t}\n\t\t}\n\n\t\t// Set the correct header, if data is being sent\n\t\tif ( s.data && s.hasContent && s.contentType !== false || options.contentType ) {\n\t\t\tjqXHR.setRequestHeader( \"Content-Type\", s.contentType );\n\t\t}\n\n\t\t// Set the Accepts header for the server, depending on the dataType\n\t\tjqXHR.setRequestHeader(\n\t\t\t\"Accept\",\n\t\t\ts.dataTypes[ 0 ] && s.accepts[ s.dataTypes[ 0 ] ] ?\n\t\t\t\ts.accepts[ s.dataTypes[ 0 ] ] +\n\t\t\t\t\t( s.dataTypes[ 0 ] !== \"*\" ? \", \" + allTypes + \"; q=0.01\" : \"\" ) :\n\t\t\t\ts.accepts[ \"*\" ]\n\t\t);\n\n\t\t// Check for headers option\n\t\tfor ( i in s.headers ) {\n\t\t\tjqXHR.setRequestHeader( i, s.headers[ i ] );\n\t\t}\n\n\t\t// Allow custom headers/mimetypes and early abort\n\t\tif ( s.beforeSend &&\n\t\t\t( s.beforeSend.call( callbackContext, jqXHR, s ) === false || completed ) ) {\n\n\t\t\t// Abort if not done already and return\n\t\t\treturn jqXHR.abort();\n\t\t}\n\n\t\t// Aborting is no longer a cancellation\n\t\tstrAbort = \"abort\";\n\n\t\t// Install callbacks on deferreds\n\t\tcompleteDeferred.add( s.complete );\n\t\tjqXHR.done( s.success );\n\t\tjqXHR.fail( s.error );\n\n\t\t// Get transport\n\t\ttransport = inspectPrefiltersOrTransports( transports, s, options, jqXHR );\n\n\t\t// If no transport, we auto-abort\n\t\tif ( !transport ) {\n\t\t\tdone( -1, \"No Transport\" );\n\t\t} else {\n\t\t\tjqXHR.readyState = 1;\n\n\t\t\t// Send global event\n\t\t\tif ( fireGlobals ) {\n\t\t\t\tglobalEventContext.trigger( \"ajaxSend\", [ jqXHR, s ] );\n\t\t\t}\n\n\t\t\t// If request was aborted inside ajaxSend, stop there\n\t\t\tif ( completed ) {\n\t\t\t\treturn jqXHR;\n\t\t\t}\n\n\t\t\t// Timeout\n\t\t\tif ( s.async && s.timeout > 0 ) {\n\t\t\t\ttimeoutTimer = window.setTimeout( function() {\n\t\t\t\t\tjqXHR.abort( \"timeout\" );\n\t\t\t\t}, s.timeout );\n\t\t\t}\n\n\t\t\ttry {\n\t\t\t\tcompleted = false;\n\t\t\t\ttransport.send( requestHeaders, done );\n\t\t\t} catch ( e ) {\n\n\t\t\t\t// Rethrow post-completion exceptions\n\t\t\t\tif ( completed ) {\n\t\t\t\t\tthrow e;\n\t\t\t\t}\n\n\t\t\t\t// Propagate others as results\n\t\t\t\tdone( -1, e );\n\t\t\t}\n\t\t}\n\n\t\t// Callback for when everything is done\n\t\tfunction done( status, nativeStatusText, responses, headers ) {\n\t\t\tvar isSuccess, success, error, response, modified,\n\t\t\t\tstatusText = nativeStatusText;\n\n\t\t\t// Ignore repeat invocations\n\t\t\tif ( completed ) {\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tcompleted = true;\n\n\t\t\t// Clear timeout if it exists\n\t\t\tif ( timeoutTimer ) {\n\t\t\t\twindow.clearTimeout( timeoutTimer );\n\t\t\t}\n\n\t\t\t// Dereference transport for early garbage collection\n\t\t\t// (no matter how long the jqXHR object will be used)\n\t\t\ttransport = undefined;\n\n\t\t\t// Cache response headers\n\t\t\tresponseHeadersString = headers || \"\";\n\n\t\t\t// Set readyState\n\t\t\tjqXHR.readyState = status > 0 ? 4 : 0;\n\n\t\t\t// Determine if successful\n\t\t\tisSuccess = status >= 200 && status < 300 || status === 304;\n\n\t\t\t// Get response data\n\t\t\tif ( responses ) {\n\t\t\t\tresponse = ajaxHandleResponses( s, jqXHR, responses );\n\t\t\t}\n\n\t\t\t// Convert no matter what (that way responseXXX fields are always set)\n\t\t\tresponse = ajaxConvert( s, response, jqXHR, isSuccess );\n\n\t\t\t// If successful, handle type chaining\n\t\t\tif ( isSuccess ) {\n\n\t\t\t\t// Set the If-Modified-Since and/or If-None-Match header, if in ifModified mode.\n\t\t\t\tif ( s.ifModified ) {\n\t\t\t\t\tmodified = jqXHR.getResponseHeader( \"Last-Modified\" );\n\t\t\t\t\tif ( modified ) {\n\t\t\t\t\t\tjQuery.lastModified[ cacheURL ] = modified;\n\t\t\t\t\t}\n\t\t\t\t\tmodified = jqXHR.getResponseHeader( \"etag\" );\n\t\t\t\t\tif ( modified ) {\n\t\t\t\t\t\tjQuery.etag[ cacheURL ] = modified;\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\t// if no content\n\t\t\t\tif ( status === 204 || s.type === \"HEAD\" ) {\n\t\t\t\t\tstatusText = \"nocontent\";\n\n\t\t\t\t// if not modified\n\t\t\t\t} else if ( status === 304 ) {\n\t\t\t\t\tstatusText = \"notmodified\";\n\n\t\t\t\t// If we have data, let's convert it\n\t\t\t\t} else {\n\t\t\t\t\tstatusText = response.state;\n\t\t\t\t\tsuccess = response.data;\n\t\t\t\t\terror = response.error;\n\t\t\t\t\tisSuccess = !error;\n\t\t\t\t}\n\t\t\t} else {\n\n\t\t\t\t// Extract error from statusText and normalize for non-aborts\n\t\t\t\terror = statusText;\n\t\t\t\tif ( status || !statusText ) {\n\t\t\t\t\tstatusText = \"error\";\n\t\t\t\t\tif ( status < 0 ) {\n\t\t\t\t\t\tstatus = 0;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t// Set data for the fake xhr object\n\t\t\tjqXHR.status = status;\n\t\t\tjqXHR.statusText = ( nativeStatusText || statusText ) + \"\";\n\n\t\t\t// Success/Error\n\t\t\tif ( isSuccess ) {\n\t\t\t\tdeferred.resolveWith( callbackContext, [ success, statusText, jqXHR ] );\n\t\t\t} else {\n\t\t\t\tdeferred.rejectWith( callbackContext, [ jqXHR, statusText, error ] );\n\t\t\t}\n\n\t\t\t// Status-dependent callbacks\n\t\t\tjqXHR.statusCode( statusCode );\n\t\t\tstatusCode = undefined;\n\n\t\t\tif ( fireGlobals ) {\n\t\t\t\tglobalEventContext.trigger( isSuccess ? \"ajaxSuccess\" : \"ajaxError\",\n\t\t\t\t\t[ jqXHR, s, isSuccess ? success : error ] );\n\t\t\t}\n\n\t\t\t// Complete\n\t\t\tcompleteDeferred.fireWith( callbackContext, [ jqXHR, statusText ] );\n\n\t\t\tif ( fireGlobals ) {\n\t\t\t\tglobalEventContext.trigger( \"ajaxComplete\", [ jqXHR, s ] );\n\n\t\t\t\t// Handle the global AJAX counter\n\t\t\t\tif ( !( --jQuery.active ) ) {\n\t\t\t\t\tjQuery.event.trigger( \"ajaxStop\" );\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\treturn jqXHR;\n\t},\n\n\tgetJSON: function( url, data, callback ) {\n\t\treturn jQuery.get( url, data, callback, \"json\" );\n\t},\n\n\tgetScript: function( url, callback ) {\n\t\treturn jQuery.get( url, undefined, callback, \"script\" );\n\t}\n} );\n\njQuery.each( [ \"get\", \"post\" ], function( i, method ) {\n\tjQuery[ method ] = function( url, data, callback, type ) {\n\n\t\t// Shift arguments if data argument was omitted\n\t\tif ( jQuery.isFunction( data ) ) {\n\t\t\ttype = type || callback;\n\t\t\tcallback = data;\n\t\t\tdata = undefined;\n\t\t}\n\n\t\t// The url can be an options object (which then must have .url)\n\t\treturn jQuery.ajax( jQuery.extend( {\n\t\t\turl: url,\n\t\t\ttype: method,\n\t\t\tdataType: type,\n\t\t\tdata: data,\n\t\t\tsuccess: callback\n\t\t}, jQuery.isPlainObject( url ) && url ) );\n\t};\n} );\n\n\njQuery._evalUrl = function( url ) {\n\treturn jQuery.ajax( {\n\t\turl: url,\n\n\t\t// Make this explicit, since user can override this through ajaxSetup (#11264)\n\t\ttype: \"GET\",\n\t\tdataType: \"script\",\n\t\tcache: true,\n\t\tasync: false,\n\t\tglobal: false,\n\t\t\"throws\": true\n\t} );\n};\n\n\njQuery.fn.extend( {\n\twrapAll: function( html ) {\n\t\tvar wrap;\n\n\t\tif ( this[ 0 ] ) {\n\t\t\tif ( jQuery.isFunction( html ) ) {\n\t\t\t\thtml = html.call( this[ 0 ] );\n\t\t\t}\n\n\t\t\t// The elements to wrap the target around\n\t\t\twrap = jQuery( html, this[ 0 ].ownerDocument ).eq( 0 ).clone( true );\n\n\t\t\tif ( this[ 0 ].parentNode ) {\n\t\t\t\twrap.insertBefore( this[ 0 ] );\n\t\t\t}\n\n\t\t\twrap.map( function() {\n\t\t\t\tvar elem = this;\n\n\t\t\t\twhile ( elem.firstElementChild ) {\n\t\t\t\t\telem = elem.firstElementChild;\n\t\t\t\t}\n\n\t\t\t\treturn elem;\n\t\t\t} ).append( this );\n\t\t}\n\n\t\treturn this;\n\t},\n\n\twrapInner: function( html ) {\n\t\tif ( jQuery.isFunction( html ) ) {\n\t\t\treturn this.each( function( i ) {\n\t\t\t\tjQuery( this ).wrapInner( html.call( this, i ) );\n\t\t\t} );\n\t\t}\n\n\t\treturn this.each( function() {\n\t\t\tvar self = jQuery( this ),\n\t\t\t\tcontents = self.contents();\n\n\t\t\tif ( contents.length ) {\n\t\t\t\tcontents.wrapAll( html );\n\n\t\t\t} else {\n\t\t\t\tself.append( html );\n\t\t\t}\n\t\t} );\n\t},\n\n\twrap: function( html ) {\n\t\tvar isFunction = jQuery.isFunction( html );\n\n\t\treturn this.each( function( i ) {\n\t\t\tjQuery( this ).wrapAll( isFunction ? html.call( this, i ) : html );\n\t\t} );\n\t},\n\n\tunwrap: function( selector ) {\n\t\tthis.parent( selector ).not( \"body\" ).each( function() {\n\t\t\tjQuery( this ).replaceWith( this.childNodes );\n\t\t} );\n\t\treturn this;\n\t}\n} );\n\n\njQuery.expr.pseudos.hidden = function( elem ) {\n\treturn !jQuery.expr.pseudos.visible( elem );\n};\njQuery.expr.pseudos.visible = function( elem ) {\n\treturn !!( elem.offsetWidth || elem.offsetHeight || elem.getClientRects().length );\n};\n\n\n\n\njQuery.ajaxSettings.xhr = function() {\n\ttry {\n\t\treturn new window.XMLHttpRequest();\n\t} catch ( e ) {}\n};\n\nvar xhrSuccessStatus = {\n\n\t\t// File protocol always yields status code 0, assume 200\n\t\t0: 200,\n\n\t\t// Support: IE <=9 only\n\t\t// #1450: sometimes IE returns 1223 when it should be 204\n\t\t1223: 204\n\t},\n\txhrSupported = jQuery.ajaxSettings.xhr();\n\nsupport.cors = !!xhrSupported && ( \"withCredentials\" in xhrSupported );\nsupport.ajax = xhrSupported = !!xhrSupported;\n\njQuery.ajaxTransport( function( options ) {\n\tvar callback, errorCallback;\n\n\t// Cross domain only allowed if supported through XMLHttpRequest\n\tif ( support.cors || xhrSupported && !options.crossDomain ) {\n\t\treturn {\n\t\t\tsend: function( headers, complete ) {\n\t\t\t\tvar i,\n\t\t\t\t\txhr = options.xhr();\n\n\t\t\t\txhr.open(\n\t\t\t\t\toptions.type,\n\t\t\t\t\toptions.url,\n\t\t\t\t\toptions.async,\n\t\t\t\t\toptions.username,\n\t\t\t\t\toptions.password\n\t\t\t\t);\n\n\t\t\t\t// Apply custom fields if provided\n\t\t\t\tif ( options.xhrFields ) {\n\t\t\t\t\tfor ( i in options.xhrFields ) {\n\t\t\t\t\t\txhr[ i ] = options.xhrFields[ i ];\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\t// Override mime type if needed\n\t\t\t\tif ( options.mimeType && xhr.overrideMimeType ) {\n\t\t\t\t\txhr.overrideMimeType( options.mimeType );\n\t\t\t\t}\n\n\t\t\t\t// X-Requested-With header\n\t\t\t\t// For cross-domain requests, seeing as conditions for a preflight are\n\t\t\t\t// akin to a jigsaw puzzle, we simply never set it to be sure.\n\t\t\t\t// (it can always be set on a per-request basis or even using ajaxSetup)\n\t\t\t\t// For same-domain requests, won't change header if already provided.\n\t\t\t\tif ( !options.crossDomain && !headers[ \"X-Requested-With\" ] ) {\n\t\t\t\t\theaders[ \"X-Requested-With\" ] = \"XMLHttpRequest\";\n\t\t\t\t}\n\n\t\t\t\t// Set headers\n\t\t\t\tfor ( i in headers ) {\n\t\t\t\t\txhr.setRequestHeader( i, headers[ i ] );\n\t\t\t\t}\n\n\t\t\t\t// Callback\n\t\t\t\tcallback = function( type ) {\n\t\t\t\t\treturn function() {\n\t\t\t\t\t\tif ( callback ) {\n\t\t\t\t\t\t\tcallback = errorCallback = xhr.onload =\n\t\t\t\t\t\t\t\txhr.onerror = xhr.onabort = xhr.onreadystatechange = null;\n\n\t\t\t\t\t\t\tif ( type === \"abort\" ) {\n\t\t\t\t\t\t\t\txhr.abort();\n\t\t\t\t\t\t\t} else if ( type === \"error\" ) {\n\n\t\t\t\t\t\t\t\t// Support: IE <=9 only\n\t\t\t\t\t\t\t\t// On a manual native abort, IE9 throws\n\t\t\t\t\t\t\t\t// errors on any property access that is not readyState\n\t\t\t\t\t\t\t\tif ( typeof xhr.status !== \"number\" ) {\n\t\t\t\t\t\t\t\t\tcomplete( 0, \"error\" );\n\t\t\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\t\t\tcomplete(\n\n\t\t\t\t\t\t\t\t\t\t// File: protocol always yields status 0; see #8605, #14207\n\t\t\t\t\t\t\t\t\t\txhr.status,\n\t\t\t\t\t\t\t\t\t\txhr.statusText\n\t\t\t\t\t\t\t\t\t);\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\t\tcomplete(\n\t\t\t\t\t\t\t\t\txhrSuccessStatus[ xhr.status ] || xhr.status,\n\t\t\t\t\t\t\t\t\txhr.statusText,\n\n\t\t\t\t\t\t\t\t\t// Support: IE <=9 only\n\t\t\t\t\t\t\t\t\t// IE9 has no XHR2 but throws on binary (trac-11426)\n\t\t\t\t\t\t\t\t\t// For XHR2 non-text, let the caller handle it (gh-2498)\n\t\t\t\t\t\t\t\t\t( xhr.responseType || \"text\" ) !== \"text\"  ||\n\t\t\t\t\t\t\t\t\ttypeof xhr.responseText !== \"string\" ?\n\t\t\t\t\t\t\t\t\t\t{ binary: xhr.response } :\n\t\t\t\t\t\t\t\t\t\t{ text: xhr.responseText },\n\t\t\t\t\t\t\t\t\txhr.getAllResponseHeaders()\n\t\t\t\t\t\t\t\t);\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t};\n\t\t\t\t};\n\n\t\t\t\t// Listen to events\n\t\t\t\txhr.onload = callback();\n\t\t\t\terrorCallback = xhr.onerror = callback( \"error\" );\n\n\t\t\t\t// Support: IE 9 only\n\t\t\t\t// Use onreadystatechange to replace onabort\n\t\t\t\t// to handle uncaught aborts\n\t\t\t\tif ( xhr.onabort !== undefined ) {\n\t\t\t\t\txhr.onabort = errorCallback;\n\t\t\t\t} else {\n\t\t\t\t\txhr.onreadystatechange = function() {\n\n\t\t\t\t\t\t// Check readyState before timeout as it changes\n\t\t\t\t\t\tif ( xhr.readyState === 4 ) {\n\n\t\t\t\t\t\t\t// Allow onerror to be called first,\n\t\t\t\t\t\t\t// but that will not handle a native abort\n\t\t\t\t\t\t\t// Also, save errorCallback to a variable\n\t\t\t\t\t\t\t// as xhr.onerror cannot be accessed\n\t\t\t\t\t\t\twindow.setTimeout( function() {\n\t\t\t\t\t\t\t\tif ( callback ) {\n\t\t\t\t\t\t\t\t\terrorCallback();\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t} );\n\t\t\t\t\t\t}\n\t\t\t\t\t};\n\t\t\t\t}\n\n\t\t\t\t// Create the abort callback\n\t\t\t\tcallback = callback( \"abort\" );\n\n\t\t\t\ttry {\n\n\t\t\t\t\t// Do send the request (this may raise an exception)\n\t\t\t\t\txhr.send( options.hasContent && options.data || null );\n\t\t\t\t} catch ( e ) {\n\n\t\t\t\t\t// #14683: Only rethrow if this hasn't been notified as an error yet\n\t\t\t\t\tif ( callback ) {\n\t\t\t\t\t\tthrow e;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t},\n\n\t\t\tabort: function() {\n\t\t\t\tif ( callback ) {\n\t\t\t\t\tcallback();\n\t\t\t\t}\n\t\t\t}\n\t\t};\n\t}\n} );\n\n\n\n\n// Prevent auto-execution of scripts when no explicit dataType was provided (See gh-2432)\njQuery.ajaxPrefilter( function( s ) {\n\tif ( s.crossDomain ) {\n\t\ts.contents.script = false;\n\t}\n} );\n\n// Install script dataType\njQuery.ajaxSetup( {\n\taccepts: {\n\t\tscript: \"text/javascript, application/javascript, \" +\n\t\t\t\"application/ecmascript, application/x-ecmascript\"\n\t},\n\tcontents: {\n\t\tscript: /\\b(?:java|ecma)script\\b/\n\t},\n\tconverters: {\n\t\t\"text script\": function( text ) {\n\t\t\tjQuery.globalEval( text );\n\t\t\treturn text;\n\t\t}\n\t}\n} );\n\n// Handle cache's special case and crossDomain\njQuery.ajaxPrefilter( \"script\", function( s ) {\n\tif ( s.cache === undefined ) {\n\t\ts.cache = false;\n\t}\n\tif ( s.crossDomain ) {\n\t\ts.type = \"GET\";\n\t}\n} );\n\n// Bind script tag hack transport\njQuery.ajaxTransport( \"script\", function( s ) {\n\n\t// This transport only deals with cross domain requests\n\tif ( s.crossDomain ) {\n\t\tvar script, callback;\n\t\treturn {\n\t\t\tsend: function( _, complete ) {\n\t\t\t\tscript = jQuery( \"<script>\" ).prop( {\n\t\t\t\t\tcharset: s.scriptCharset,\n\t\t\t\t\tsrc: s.url\n\t\t\t\t} ).on(\n\t\t\t\t\t\"load error\",\n\t\t\t\t\tcallback = function( evt ) {\n\t\t\t\t\t\tscript.remove();\n\t\t\t\t\t\tcallback = null;\n\t\t\t\t\t\tif ( evt ) {\n\t\t\t\t\t\t\tcomplete( evt.type === \"error\" ? 404 : 200, evt.type );\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t);\n\n\t\t\t\t// Use native DOM manipulation to avoid our domManip AJAX trickery\n\t\t\t\tdocument.head.appendChild( script[ 0 ] );\n\t\t\t},\n\t\t\tabort: function() {\n\t\t\t\tif ( callback ) {\n\t\t\t\t\tcallback();\n\t\t\t\t}\n\t\t\t}\n\t\t};\n\t}\n} );\n\n\n\n\nvar oldCallbacks = [],\n\trjsonp = /(=)\\?(?=&|$)|\\?\\?/;\n\n// Default jsonp settings\njQuery.ajaxSetup( {\n\tjsonp: \"callback\",\n\tjsonpCallback: function() {\n\t\tvar callback = oldCallbacks.pop() || ( jQuery.expando + \"_\" + ( nonce++ ) );\n\t\tthis[ callback ] = true;\n\t\treturn callback;\n\t}\n} );\n\n// Detect, normalize options and install callbacks for jsonp requests\njQuery.ajaxPrefilter( \"json jsonp\", function( s, originalSettings, jqXHR ) {\n\n\tvar callbackName, overwritten, responseContainer,\n\t\tjsonProp = s.jsonp !== false && ( rjsonp.test( s.url ) ?\n\t\t\t\"url\" :\n\t\t\ttypeof s.data === \"string\" &&\n\t\t\t\t( s.contentType || \"\" )\n\t\t\t\t\t.indexOf( \"application/x-www-form-urlencoded\" ) === 0 &&\n\t\t\t\trjsonp.test( s.data ) && \"data\"\n\t\t);\n\n\t// Handle iff the expected data type is \"jsonp\" or we have a parameter to set\n\tif ( jsonProp || s.dataTypes[ 0 ] === \"jsonp\" ) {\n\n\t\t// Get callback name, remembering preexisting value associated with it\n\t\tcallbackName = s.jsonpCallback = jQuery.isFunction( s.jsonpCallback ) ?\n\t\t\ts.jsonpCallback() :\n\t\t\ts.jsonpCallback;\n\n\t\t// Insert callback into url or form data\n\t\tif ( jsonProp ) {\n\t\t\ts[ jsonProp ] = s[ jsonProp ].replace( rjsonp, \"$1\" + callbackName );\n\t\t} else if ( s.jsonp !== false ) {\n\t\t\ts.url += ( rquery.test( s.url ) ? \"&\" : \"?\" ) + s.jsonp + \"=\" + callbackName;\n\t\t}\n\n\t\t// Use data converter to retrieve json after script execution\n\t\ts.converters[ \"script json\" ] = function() {\n\t\t\tif ( !responseContainer ) {\n\t\t\t\tjQuery.error( callbackName + \" was not called\" );\n\t\t\t}\n\t\t\treturn responseContainer[ 0 ];\n\t\t};\n\n\t\t// Force json dataType\n\t\ts.dataTypes[ 0 ] = \"json\";\n\n\t\t// Install callback\n\t\toverwritten = window[ callbackName ];\n\t\twindow[ callbackName ] = function() {\n\t\t\tresponseContainer = arguments;\n\t\t};\n\n\t\t// Clean-up function (fires after converters)\n\t\tjqXHR.always( function() {\n\n\t\t\t// If previous value didn't exist - remove it\n\t\t\tif ( overwritten === undefined ) {\n\t\t\t\tjQuery( window ).removeProp( callbackName );\n\n\t\t\t// Otherwise restore preexisting value\n\t\t\t} else {\n\t\t\t\twindow[ callbackName ] = overwritten;\n\t\t\t}\n\n\t\t\t// Save back as free\n\t\t\tif ( s[ callbackName ] ) {\n\n\t\t\t\t// Make sure that re-using the options doesn't screw things around\n\t\t\t\ts.jsonpCallback = originalSettings.jsonpCallback;\n\n\t\t\t\t// Save the callback name for future use\n\t\t\t\toldCallbacks.push( callbackName );\n\t\t\t}\n\n\t\t\t// Call if it was a function and we have a response\n\t\t\tif ( responseContainer && jQuery.isFunction( overwritten ) ) {\n\t\t\t\toverwritten( responseContainer[ 0 ] );\n\t\t\t}\n\n\t\t\tresponseContainer = overwritten = undefined;\n\t\t} );\n\n\t\t// Delegate to script\n\t\treturn \"script\";\n\t}\n} );\n\n\n\n\n// Support: Safari 8 only\n// In Safari 8 documents created via document.implementation.createHTMLDocument\n// collapse sibling forms: the second one becomes a child of the first one.\n// Because of that, this security measure has to be disabled in Safari 8.\n// https://bugs.webkit.org/show_bug.cgi?id=137337\nsupport.createHTMLDocument = ( function() {\n\tvar body = document.implementation.createHTMLDocument( \"\" ).body;\n\tbody.innerHTML = \"<form></form><form></form>\";\n\treturn body.childNodes.length === 2;\n} )();\n\n\n// Argument \"data\" should be string of html\n// context (optional): If specified, the fragment will be created in this context,\n// defaults to document\n// keepScripts (optional): If true, will include scripts passed in the html string\njQuery.parseHTML = function( data, context, keepScripts ) {\n\tif ( typeof data !== \"string\" ) {\n\t\treturn [];\n\t}\n\tif ( typeof context === \"boolean\" ) {\n\t\tkeepScripts = context;\n\t\tcontext = false;\n\t}\n\n\tvar base, parsed, scripts;\n\n\tif ( !context ) {\n\n\t\t// Stop scripts or inline event handlers from being executed immediately\n\t\t// by using document.implementation\n\t\tif ( support.createHTMLDocument ) {\n\t\t\tcontext = document.implementation.createHTMLDocument( \"\" );\n\n\t\t\t// Set the base href for the created document\n\t\t\t// so any parsed elements with URLs\n\t\t\t// are based on the document's URL (gh-2965)\n\t\t\tbase = context.createElement( \"base\" );\n\t\t\tbase.href = document.location.href;\n\t\t\tcontext.head.appendChild( base );\n\t\t} else {\n\t\t\tcontext = document;\n\t\t}\n\t}\n\n\tparsed = rsingleTag.exec( data );\n\tscripts = !keepScripts && [];\n\n\t// Single tag\n\tif ( parsed ) {\n\t\treturn [ context.createElement( parsed[ 1 ] ) ];\n\t}\n\n\tparsed = buildFragment( [ data ], context, scripts );\n\n\tif ( scripts && scripts.length ) {\n\t\tjQuery( scripts ).remove();\n\t}\n\n\treturn jQuery.merge( [], parsed.childNodes );\n};\n\n\n/**\n * Load a url into a page\n */\njQuery.fn.load = function( url, params, callback ) {\n\tvar selector, type, response,\n\t\tself = this,\n\t\toff = url.indexOf( \" \" );\n\n\tif ( off > -1 ) {\n\t\tselector = stripAndCollapse( url.slice( off ) );\n\t\turl = url.slice( 0, off );\n\t}\n\n\t// If it's a function\n\tif ( jQuery.isFunction( params ) ) {\n\n\t\t// We assume that it's the callback\n\t\tcallback = params;\n\t\tparams = undefined;\n\n\t// Otherwise, build a param string\n\t} else if ( params && typeof params === \"object\" ) {\n\t\ttype = \"POST\";\n\t}\n\n\t// If we have elements to modify, make the request\n\tif ( self.length > 0 ) {\n\t\tjQuery.ajax( {\n\t\t\turl: url,\n\n\t\t\t// If \"type\" variable is undefined, then \"GET\" method will be used.\n\t\t\t// Make value of this field explicit since\n\t\t\t// user can override it through ajaxSetup method\n\t\t\ttype: type || \"GET\",\n\t\t\tdataType: \"html\",\n\t\t\tdata: params\n\t\t} ).done( function( responseText ) {\n\n\t\t\t// Save response for use in complete callback\n\t\t\tresponse = arguments;\n\n\t\t\tself.html( selector ?\n\n\t\t\t\t// If a selector was specified, locate the right elements in a dummy div\n\t\t\t\t// Exclude scripts to avoid IE 'Permission Denied' errors\n\t\t\t\tjQuery( \"<div>\" ).append( jQuery.parseHTML( responseText ) ).find( selector ) :\n\n\t\t\t\t// Otherwise use the full result\n\t\t\t\tresponseText );\n\n\t\t// If the request succeeds, this function gets \"data\", \"status\", \"jqXHR\"\n\t\t// but they are ignored because response was set above.\n\t\t// If it fails, this function gets \"jqXHR\", \"status\", \"error\"\n\t\t} ).always( callback && function( jqXHR, status ) {\n\t\t\tself.each( function() {\n\t\t\t\tcallback.apply( this, response || [ jqXHR.responseText, status, jqXHR ] );\n\t\t\t} );\n\t\t} );\n\t}\n\n\treturn this;\n};\n\n\n\n\n// Attach a bunch of functions for handling common AJAX events\njQuery.each( [\n\t\"ajaxStart\",\n\t\"ajaxStop\",\n\t\"ajaxComplete\",\n\t\"ajaxError\",\n\t\"ajaxSuccess\",\n\t\"ajaxSend\"\n], function( i, type ) {\n\tjQuery.fn[ type ] = function( fn ) {\n\t\treturn this.on( type, fn );\n\t};\n} );\n\n\n\n\njQuery.expr.pseudos.animated = function( elem ) {\n\treturn jQuery.grep( jQuery.timers, function( fn ) {\n\t\treturn elem === fn.elem;\n\t} ).length;\n};\n\n\n\n\n/**\n * Gets a window from an element\n */\nfunction getWindow( elem ) {\n\treturn jQuery.isWindow( elem ) ? elem : elem.nodeType === 9 && elem.defaultView;\n}\n\njQuery.offset = {\n\tsetOffset: function( elem, options, i ) {\n\t\tvar curPosition, curLeft, curCSSTop, curTop, curOffset, curCSSLeft, calculatePosition,\n\t\t\tposition = jQuery.css( elem, \"position\" ),\n\t\t\tcurElem = jQuery( elem ),\n\t\t\tprops = {};\n\n\t\t// Set position first, in-case top/left are set even on static elem\n\t\tif ( position === \"static\" ) {\n\t\t\telem.style.position = \"relative\";\n\t\t}\n\n\t\tcurOffset = curElem.offset();\n\t\tcurCSSTop = jQuery.css( elem, \"top\" );\n\t\tcurCSSLeft = jQuery.css( elem, \"left\" );\n\t\tcalculatePosition = ( position === \"absolute\" || position === \"fixed\" ) &&\n\t\t\t( curCSSTop + curCSSLeft ).indexOf( \"auto\" ) > -1;\n\n\t\t// Need to be able to calculate position if either\n\t\t// top or left is auto and position is either absolute or fixed\n\t\tif ( calculatePosition ) {\n\t\t\tcurPosition = curElem.position();\n\t\t\tcurTop = curPosition.top;\n\t\t\tcurLeft = curPosition.left;\n\n\t\t} else {\n\t\t\tcurTop = parseFloat( curCSSTop ) || 0;\n\t\t\tcurLeft = parseFloat( curCSSLeft ) || 0;\n\t\t}\n\n\t\tif ( jQuery.isFunction( options ) ) {\n\n\t\t\t// Use jQuery.extend here to allow modification of coordinates argument (gh-1848)\n\t\t\toptions = options.call( elem, i, jQuery.extend( {}, curOffset ) );\n\t\t}\n\n\t\tif ( options.top != null ) {\n\t\t\tprops.top = ( options.top - curOffset.top ) + curTop;\n\t\t}\n\t\tif ( options.left != null ) {\n\t\t\tprops.left = ( options.left - curOffset.left ) + curLeft;\n\t\t}\n\n\t\tif ( \"using\" in options ) {\n\t\t\toptions.using.call( elem, props );\n\n\t\t} else {\n\t\t\tcurElem.css( props );\n\t\t}\n\t}\n};\n\njQuery.fn.extend( {\n\toffset: function( options ) {\n\n\t\t// Preserve chaining for setter\n\t\tif ( arguments.length ) {\n\t\t\treturn options === undefined ?\n\t\t\t\tthis :\n\t\t\t\tthis.each( function( i ) {\n\t\t\t\t\tjQuery.offset.setOffset( this, options, i );\n\t\t\t\t} );\n\t\t}\n\n\t\tvar docElem, win, rect, doc,\n\t\t\telem = this[ 0 ];\n\n\t\tif ( !elem ) {\n\t\t\treturn;\n\t\t}\n\n\t\t// Support: IE <=11 only\n\t\t// Running getBoundingClientRect on a\n\t\t// disconnected node in IE throws an error\n\t\tif ( !elem.getClientRects().length ) {\n\t\t\treturn { top: 0, left: 0 };\n\t\t}\n\n\t\trect = elem.getBoundingClientRect();\n\n\t\t// Make sure element is not hidden (display: none)\n\t\tif ( rect.width || rect.height ) {\n\t\t\tdoc = elem.ownerDocument;\n\t\t\twin = getWindow( doc );\n\t\t\tdocElem = doc.documentElement;\n\n\t\t\treturn {\n\t\t\t\ttop: rect.top + win.pageYOffset - docElem.clientTop,\n\t\t\t\tleft: rect.left + win.pageXOffset - docElem.clientLeft\n\t\t\t};\n\t\t}\n\n\t\t// Return zeros for disconnected and hidden elements (gh-2310)\n\t\treturn rect;\n\t},\n\n\tposition: function() {\n\t\tif ( !this[ 0 ] ) {\n\t\t\treturn;\n\t\t}\n\n\t\tvar offsetParent, offset,\n\t\t\telem = this[ 0 ],\n\t\t\tparentOffset = { top: 0, left: 0 };\n\n\t\t// Fixed elements are offset from window (parentOffset = {top:0, left: 0},\n\t\t// because it is its only offset parent\n\t\tif ( jQuery.css( elem, \"position\" ) === \"fixed\" ) {\n\n\t\t\t// Assume getBoundingClientRect is there when computed position is fixed\n\t\t\toffset = elem.getBoundingClientRect();\n\n\t\t} else {\n\n\t\t\t// Get *real* offsetParent\n\t\t\toffsetParent = this.offsetParent();\n\n\t\t\t// Get correct offsets\n\t\t\toffset = this.offset();\n\t\t\tif ( !jQuery.nodeName( offsetParent[ 0 ], \"html\" ) ) {\n\t\t\t\tparentOffset = offsetParent.offset();\n\t\t\t}\n\n\t\t\t// Add offsetParent borders\n\t\t\tparentOffset = {\n\t\t\t\ttop: parentOffset.top + jQuery.css( offsetParent[ 0 ], \"borderTopWidth\", true ),\n\t\t\t\tleft: parentOffset.left + jQuery.css( offsetParent[ 0 ], \"borderLeftWidth\", true )\n\t\t\t};\n\t\t}\n\n\t\t// Subtract parent offsets and element margins\n\t\treturn {\n\t\t\ttop: offset.top - parentOffset.top - jQuery.css( elem, \"marginTop\", true ),\n\t\t\tleft: offset.left - parentOffset.left - jQuery.css( elem, \"marginLeft\", true )\n\t\t};\n\t},\n\n\t// This method will return documentElement in the following cases:\n\t// 1) For the element inside the iframe without offsetParent, this method will return\n\t//    documentElement of the parent window\n\t// 2) For the hidden or detached element\n\t// 3) For body or html element, i.e. in case of the html node - it will return itself\n\t//\n\t// but those exceptions were never presented as a real life use-cases\n\t// and might be considered as more preferable results.\n\t//\n\t// This logic, however, is not guaranteed and can change at any point in the future\n\toffsetParent: function() {\n\t\treturn this.map( function() {\n\t\t\tvar offsetParent = this.offsetParent;\n\n\t\t\twhile ( offsetParent && jQuery.css( offsetParent, \"position\" ) === \"static\" ) {\n\t\t\t\toffsetParent = offsetParent.offsetParent;\n\t\t\t}\n\n\t\t\treturn offsetParent || documentElement;\n\t\t} );\n\t}\n} );\n\n// Create scrollLeft and scrollTop methods\njQuery.each( { scrollLeft: \"pageXOffset\", scrollTop: \"pageYOffset\" }, function( method, prop ) {\n\tvar top = \"pageYOffset\" === prop;\n\n\tjQuery.fn[ method ] = function( val ) {\n\t\treturn access( this, function( elem, method, val ) {\n\t\t\tvar win = getWindow( elem );\n\n\t\t\tif ( val === undefined ) {\n\t\t\t\treturn win ? win[ prop ] : elem[ method ];\n\t\t\t}\n\n\t\t\tif ( win ) {\n\t\t\t\twin.scrollTo(\n\t\t\t\t\t!top ? val : win.pageXOffset,\n\t\t\t\t\ttop ? val : win.pageYOffset\n\t\t\t\t);\n\n\t\t\t} else {\n\t\t\t\telem[ method ] = val;\n\t\t\t}\n\t\t}, method, val, arguments.length );\n\t};\n} );\n\n// Support: Safari <=7 - 9.1, Chrome <=37 - 49\n// Add the top/left cssHooks using jQuery.fn.position\n// Webkit bug: https://bugs.webkit.org/show_bug.cgi?id=29084\n// Blink bug: https://bugs.chromium.org/p/chromium/issues/detail?id=589347\n// getComputedStyle returns percent when specified for top/left/bottom/right;\n// rather than make the css module depend on the offset module, just check for it here\njQuery.each( [ \"top\", \"left\" ], function( i, prop ) {\n\tjQuery.cssHooks[ prop ] = addGetHookIf( support.pixelPosition,\n\t\tfunction( elem, computed ) {\n\t\t\tif ( computed ) {\n\t\t\t\tcomputed = curCSS( elem, prop );\n\n\t\t\t\t// If curCSS returns percentage, fallback to offset\n\t\t\t\treturn rnumnonpx.test( computed ) ?\n\t\t\t\t\tjQuery( elem ).position()[ prop ] + \"px\" :\n\t\t\t\t\tcomputed;\n\t\t\t}\n\t\t}\n\t);\n} );\n\n\n// Create innerHeight, innerWidth, height, width, outerHeight and outerWidth methods\njQuery.each( { Height: \"height\", Width: \"width\" }, function( name, type ) {\n\tjQuery.each( { padding: \"inner\" + name, content: type, \"\": \"outer\" + name },\n\t\tfunction( defaultExtra, funcName ) {\n\n\t\t// Margin is only for outerHeight, outerWidth\n\t\tjQuery.fn[ funcName ] = function( margin, value ) {\n\t\t\tvar chainable = arguments.length && ( defaultExtra || typeof margin !== \"boolean\" ),\n\t\t\t\textra = defaultExtra || ( margin === true || value === true ? \"margin\" : \"border\" );\n\n\t\t\treturn access( this, function( elem, type, value ) {\n\t\t\t\tvar doc;\n\n\t\t\t\tif ( jQuery.isWindow( elem ) ) {\n\n\t\t\t\t\t// $( window ).outerWidth/Height return w/h including scrollbars (gh-1729)\n\t\t\t\t\treturn funcName.indexOf( \"outer\" ) === 0 ?\n\t\t\t\t\t\telem[ \"inner\" + name ] :\n\t\t\t\t\t\telem.document.documentElement[ \"client\" + name ];\n\t\t\t\t}\n\n\t\t\t\t// Get document width or height\n\t\t\t\tif ( elem.nodeType === 9 ) {\n\t\t\t\t\tdoc = elem.documentElement;\n\n\t\t\t\t\t// Either scroll[Width/Height] or offset[Width/Height] or client[Width/Height],\n\t\t\t\t\t// whichever is greatest\n\t\t\t\t\treturn Math.max(\n\t\t\t\t\t\telem.body[ \"scroll\" + name ], doc[ \"scroll\" + name ],\n\t\t\t\t\t\telem.body[ \"offset\" + name ], doc[ \"offset\" + name ],\n\t\t\t\t\t\tdoc[ \"client\" + name ]\n\t\t\t\t\t);\n\t\t\t\t}\n\n\t\t\t\treturn value === undefined ?\n\n\t\t\t\t\t// Get width or height on the element, requesting but not forcing parseFloat\n\t\t\t\t\tjQuery.css( elem, type, extra ) :\n\n\t\t\t\t\t// Set width or height on the element\n\t\t\t\t\tjQuery.style( elem, type, value, extra );\n\t\t\t}, type, chainable ? margin : undefined, chainable );\n\t\t};\n\t} );\n} );\n\n\njQuery.fn.extend( {\n\n\tbind: function( types, data, fn ) {\n\t\treturn this.on( types, null, data, fn );\n\t},\n\tunbind: function( types, fn ) {\n\t\treturn this.off( types, null, fn );\n\t},\n\n\tdelegate: function( selector, types, data, fn ) {\n\t\treturn this.on( types, selector, data, fn );\n\t},\n\tundelegate: function( selector, types, fn ) {\n\n\t\t// ( namespace ) or ( selector, types [, fn] )\n\t\treturn arguments.length === 1 ?\n\t\t\tthis.off( selector, \"**\" ) :\n\t\t\tthis.off( types, selector || \"**\", fn );\n\t}\n} );\n\njQuery.parseJSON = JSON.parse;\n\n\n\n\n// Register as a named AMD module, since jQuery can be concatenated with other\n// files that may use define, but not via a proper concatenation script that\n// understands anonymous AMD modules. A named AMD is safest and most robust\n// way to register. Lowercase jquery is used because AMD module names are\n// derived from file names, and jQuery is normally delivered in a lowercase\n// file name. Do this after creating the global so that if an AMD module wants\n// to call noConflict to hide this version of jQuery, it will work.\n\n// Note that for maximum portability, libraries that are not jQuery should\n// declare themselves as anonymous modules, and avoid setting a global if an\n// AMD loader is present. jQuery is a special case. For more information, see\n// https://github.com/jrburke/requirejs/wiki/Updating-existing-libraries#wiki-anon\n\nif ( typeof define === \"function\" && define.amd ) {\n\tdefine( \"jquery\", [], function() {\n\t\treturn jQuery;\n\t} );\n}\n\n\n\n\nvar\n\n\t// Map over jQuery in case of overwrite\n\t_jQuery = window.jQuery,\n\n\t// Map over the $ in case of overwrite\n\t_$ = window.$;\n\njQuery.noConflict = function( deep ) {\n\tif ( window.$ === jQuery ) {\n\t\twindow.$ = _$;\n\t}\n\n\tif ( deep && window.jQuery === jQuery ) {\n\t\twindow.jQuery = _jQuery;\n\t}\n\n\treturn jQuery;\n};\n\n// Expose jQuery and $ identifiers, even in AMD\n// (#7102#comment:10, https://github.com/jquery/jquery/pull/557)\n// and CommonJS for browser emulators (#13566)\nif ( !noGlobal ) {\n\twindow.jQuery = window.$ = jQuery;\n}\n\n\n\n\n\nreturn jQuery;\n} );\n\n/**\n * @license AngularJS v1.6.4\n * (c) 2010-2017 Google, Inc. http://angularjs.org\n * License: MIT\n */\n(function(window) {'use strict';\n\n/**\n * @description\n *\n * This object provides a utility for producing rich Error messages within\n * Angular. It can be called as follows:\n *\n * var exampleMinErr = minErr('example');\n * throw exampleMinErr('one', 'This {0} is {1}', foo, bar);\n *\n * The above creates an instance of minErr in the example namespace. The\n * resulting error will have a namespaced error code of example.one.  The\n * resulting error will replace {0} with the value of foo, and {1} with the\n * value of bar. The object is not restricted in the number of arguments it can\n * take.\n *\n * If fewer arguments are specified than necessary for interpolation, the extra\n * interpolation markers will be preserved in the final string.\n *\n * Since data will be parsed statically during a build step, some restrictions\n * are applied with respect to how minErr instances are created and called.\n * Instances should have names of the form namespaceMinErr for a minErr created\n * using minErr('namespace') . Error codes, namespaces and template strings\n * should all be static strings, not variables or general expressions.\n *\n * @param {string} module The namespace to use for the new minErr instance.\n * @param {function} ErrorConstructor Custom error constructor to be instantiated when returning\n *   error from returned function, for cases when a particular type of error is useful.\n * @returns {function(code:string, template:string, ...templateArgs): Error} minErr instance\n */\n\nfunction minErr(module, ErrorConstructor) {\n  ErrorConstructor = ErrorConstructor || Error;\n  return function() {\n    var code = arguments[0],\n      template = arguments[1],\n      message = '[' + (module ? module + ':' : '') + code + '] ',\n      templateArgs = sliceArgs(arguments, 2).map(function(arg) {\n        return toDebugString(arg, minErrConfig.objectMaxDepth);\n      }),\n      paramPrefix, i;\n\n    message += template.replace(/\\{\\d+\\}/g, function(match) {\n      var index = +match.slice(1, -1);\n\n      if (index < templateArgs.length) {\n        return templateArgs[index];\n      }\n\n      return match;\n    });\n\n    message += '\\nhttp://errors.angularjs.org/1.6.4/' +\n      (module ? module + '/' : '') + code;\n\n    for (i = 0, paramPrefix = '?'; i < templateArgs.length; i++, paramPrefix = '&') {\n      message += paramPrefix + 'p' + i + '=' + encodeURIComponent(templateArgs[i]);\n    }\n\n    return new ErrorConstructor(message);\n  };\n}\n\n/* We need to tell ESLint what variables are being exported */\n/* exported\n  angular,\n  msie,\n  jqLite,\n  jQuery,\n  slice,\n  splice,\n  push,\n  toString,\n  minErrConfig,\n  errorHandlingConfig,\n  isValidObjectMaxDepth,\n  ngMinErr,\n  angularModule,\n  uid,\n  REGEX_STRING_REGEXP,\n  VALIDITY_STATE_PROPERTY,\n\n  lowercase,\n  uppercase,\n  manualLowercase,\n  manualUppercase,\n  nodeName_,\n  isArrayLike,\n  forEach,\n  forEachSorted,\n  reverseParams,\n  nextUid,\n  setHashKey,\n  extend,\n  toInt,\n  inherit,\n  merge,\n  noop,\n  identity,\n  valueFn,\n  isUndefined,\n  isDefined,\n  isObject,\n  isBlankObject,\n  isString,\n  isNumber,\n  isNumberNaN,\n  isDate,\n  isArray,\n  isFunction,\n  isRegExp,\n  isWindow,\n  isScope,\n  isFile,\n  isFormData,\n  isBlob,\n  isBoolean,\n  isPromiseLike,\n  trim,\n  escapeForRegexp,\n  isElement,\n  makeMap,\n  includes,\n  arrayRemove,\n  copy,\n  simpleCompare,\n  equals,\n  csp,\n  jq,\n  concat,\n  sliceArgs,\n  bind,\n  toJsonReplacer,\n  toJson,\n  fromJson,\n  convertTimezoneToLocal,\n  timezoneToOffset,\n  startingTag,\n  tryDecodeURIComponent,\n  parseKeyValue,\n  toKeyValue,\n  encodeUriSegment,\n  encodeUriQuery,\n  angularInit,\n  bootstrap,\n  getTestability,\n  snake_case,\n  bindJQuery,\n  assertArg,\n  assertArgFn,\n  assertNotHasOwnProperty,\n  getter,\n  getBlockNodes,\n  hasOwnProperty,\n  createMap,\n  stringify,\n\n  NODE_TYPE_ELEMENT,\n  NODE_TYPE_ATTRIBUTE,\n  NODE_TYPE_TEXT,\n  NODE_TYPE_COMMENT,\n  NODE_TYPE_DOCUMENT,\n  NODE_TYPE_DOCUMENT_FRAGMENT\n*/\n\n////////////////////////////////////\n\n/**\n * @ngdoc module\n * @name ng\n * @module ng\n * @installation\n * @description\n *\n * # ng (core module)\n * The ng module is loaded by default when an AngularJS application is started. The module itself\n * contains the essential components for an AngularJS application to function. The table below\n * lists a high level breakdown of each of the services/factories, filters, directives and testing\n * components available within this core module.\n *\n * <div doc-module-components=\"ng\"></div>\n */\n\nvar REGEX_STRING_REGEXP = /^\\/(.+)\\/([a-z]*)$/;\n\n// The name of a form control's ValidityState property.\n// This is used so that it's possible for internal tests to create mock ValidityStates.\nvar VALIDITY_STATE_PROPERTY = 'validity';\n\n\nvar hasOwnProperty = Object.prototype.hasOwnProperty;\n\nvar minErrConfig = {\n  objectMaxDepth: 5\n};\n\n /**\n * @ngdoc function\n * @name angular.errorHandlingConfig\n * @module ng\n * @kind function\n *\n * @description\n * Configure several aspects of error handling in AngularJS if used as a setter or return the\n * current configuration if used as a getter. The following options are supported:\n *\n * - **objectMaxDepth**: The maximum depth to which objects are traversed when stringified for error messages.\n *\n * Omitted or undefined options will leave the corresponding configuration values unchanged.\n *\n * @param {Object=} config - The configuration object. May only contain the options that need to be\n *     updated. Supported keys:\n *\n * * `objectMaxDepth`  **{Number}** - The max depth for stringifying objects. Setting to a\n *   non-positive or non-numeric value, removes the max depth limit.\n *   Default: 5\n */\nfunction errorHandlingConfig(config) {\n  if (isObject(config)) {\n    if (isDefined(config.objectMaxDepth)) {\n      minErrConfig.objectMaxDepth = isValidObjectMaxDepth(config.objectMaxDepth) ? config.objectMaxDepth : NaN;\n    }\n  } else {\n    return minErrConfig;\n  }\n}\n\n/**\n * @private\n * @param {Number} maxDepth\n * @return {boolean}\n */\nfunction isValidObjectMaxDepth(maxDepth) {\n  return isNumber(maxDepth) && maxDepth > 0;\n}\n\n/**\n * @ngdoc function\n * @name angular.lowercase\n * @module ng\n * @kind function\n *\n * @deprecated\n * sinceVersion=\"1.5.0\"\n * removeVersion=\"1.7.0\"\n * Use [String.prototype.toLowerCase](https://developer.mozilla.org/docs/Web/JavaScript/Reference/Global_Objects/String/toLowerCase) instead.\n *\n * @description Converts the specified string to lowercase.\n * @param {string} string String to be converted to lowercase.\n * @returns {string} Lowercased string.\n */\nvar lowercase = function(string) {return isString(string) ? string.toLowerCase() : string;};\n\n/**\n * @ngdoc function\n * @name angular.uppercase\n * @module ng\n * @kind function\n *\n * @deprecated\n * sinceVersion=\"1.5.0\"\n * removeVersion=\"1.7.0\"\n * Use [String.prototype.toUpperCase](https://developer.mozilla.org/docs/Web/JavaScript/Reference/Global_Objects/String/toUpperCase) instead.\n *\n * @description Converts the specified string to uppercase.\n * @param {string} string String to be converted to uppercase.\n * @returns {string} Uppercased string.\n */\nvar uppercase = function(string) {return isString(string) ? string.toUpperCase() : string;};\n\n\nvar manualLowercase = function(s) {\n  /* eslint-disable no-bitwise */\n  return isString(s)\n      ? s.replace(/[A-Z]/g, function(ch) {return String.fromCharCode(ch.charCodeAt(0) | 32);})\n      : s;\n  /* eslint-enable */\n};\nvar manualUppercase = function(s) {\n  /* eslint-disable no-bitwise */\n  return isString(s)\n      ? s.replace(/[a-z]/g, function(ch) {return String.fromCharCode(ch.charCodeAt(0) & ~32);})\n      : s;\n  /* eslint-enable */\n};\n\n\n// String#toLowerCase and String#toUpperCase don't produce correct results in browsers with Turkish\n// locale, for this reason we need to detect this case and redefine lowercase/uppercase methods\n// with correct but slower alternatives. See https://github.com/angular/angular.js/issues/11387\nif ('i' !== 'I'.toLowerCase()) {\n  lowercase = manualLowercase;\n  uppercase = manualUppercase;\n}\n\n\nvar\n    msie,             // holds major version number for IE, or NaN if UA is not IE.\n    jqLite,           // delay binding since jQuery could be loaded after us.\n    jQuery,           // delay binding\n    slice             = [].slice,\n    splice            = [].splice,\n    push              = [].push,\n    toString          = Object.prototype.toString,\n    getPrototypeOf    = Object.getPrototypeOf,\n    ngMinErr          = minErr('ng'),\n\n    /** @name angular */\n    angular           = window.angular || (window.angular = {}),\n    angularModule,\n    uid               = 0;\n\n// Support: IE 9-11 only\n/**\n * documentMode is an IE-only property\n * http://msdn.microsoft.com/en-us/library/ie/cc196988(v=vs.85).aspx\n */\nmsie = window.document.documentMode;\n\n\n/**\n * @private\n * @param {*} obj\n * @return {boolean} Returns true if `obj` is an array or array-like object (NodeList, Arguments,\n *                   String ...)\n */\nfunction isArrayLike(obj) {\n\n  // `null`, `undefined` and `window` are not array-like\n  if (obj == null || isWindow(obj)) return false;\n\n  // arrays, strings and jQuery/jqLite objects are array like\n  // * jqLite is either the jQuery or jqLite constructor function\n  // * we have to check the existence of jqLite first as this method is called\n  //   via the forEach method when constructing the jqLite object in the first place\n  if (isArray(obj) || isString(obj) || (jqLite && obj instanceof jqLite)) return true;\n\n  // Support: iOS 8.2 (not reproducible in simulator)\n  // \"length\" in obj used to prevent JIT error (gh-11508)\n  var length = 'length' in Object(obj) && obj.length;\n\n  // NodeList objects (with `item` method) and\n  // other objects with suitable length characteristics are array-like\n  return isNumber(length) &&\n    (length >= 0 && ((length - 1) in obj || obj instanceof Array) || typeof obj.item === 'function');\n\n}\n\n/**\n * @ngdoc function\n * @name angular.forEach\n * @module ng\n * @kind function\n *\n * @description\n * Invokes the `iterator` function once for each item in `obj` collection, which can be either an\n * object or an array. The `iterator` function is invoked with `iterator(value, key, obj)`, where `value`\n * is the value of an object property or an array element, `key` is the object property key or\n * array element index and obj is the `obj` itself. Specifying a `context` for the function is optional.\n *\n * It is worth noting that `.forEach` does not iterate over inherited properties because it filters\n * using the `hasOwnProperty` method.\n *\n * Unlike ES262's\n * [Array.prototype.forEach](http://www.ecma-international.org/ecma-262/5.1/#sec-15.4.4.18),\n * providing 'undefined' or 'null' values for `obj` will not throw a TypeError, but rather just\n * return the value provided.\n *\n   ```js\n     var values = {name: 'misko', gender: 'male'};\n     var log = [];\n     angular.forEach(values, function(value, key) {\n       this.push(key + ': ' + value);\n     }, log);\n     expect(log).toEqual(['name: misko', 'gender: male']);\n   ```\n *\n * @param {Object|Array} obj Object to iterate over.\n * @param {Function} iterator Iterator function.\n * @param {Object=} context Object to become context (`this`) for the iterator function.\n * @returns {Object|Array} Reference to `obj`.\n */\n\nfunction forEach(obj, iterator, context) {\n  var key, length;\n  if (obj) {\n    if (isFunction(obj)) {\n      for (key in obj) {\n        if (key !== 'prototype' && key !== 'length' && key !== 'name' && obj.hasOwnProperty(key)) {\n          iterator.call(context, obj[key], key, obj);\n        }\n      }\n    } else if (isArray(obj) || isArrayLike(obj)) {\n      var isPrimitive = typeof obj !== 'object';\n      for (key = 0, length = obj.length; key < length; key++) {\n        if (isPrimitive || key in obj) {\n          iterator.call(context, obj[key], key, obj);\n        }\n      }\n    } else if (obj.forEach && obj.forEach !== forEach) {\n        obj.forEach(iterator, context, obj);\n    } else if (isBlankObject(obj)) {\n      // createMap() fast path --- Safe to avoid hasOwnProperty check because prototype chain is empty\n      for (key in obj) {\n        iterator.call(context, obj[key], key, obj);\n      }\n    } else if (typeof obj.hasOwnProperty === 'function') {\n      // Slow path for objects inheriting Object.prototype, hasOwnProperty check needed\n      for (key in obj) {\n        if (obj.hasOwnProperty(key)) {\n          iterator.call(context, obj[key], key, obj);\n        }\n      }\n    } else {\n      // Slow path for objects which do not have a method `hasOwnProperty`\n      for (key in obj) {\n        if (hasOwnProperty.call(obj, key)) {\n          iterator.call(context, obj[key], key, obj);\n        }\n      }\n    }\n  }\n  return obj;\n}\n\nfunction forEachSorted(obj, iterator, context) {\n  var keys = Object.keys(obj).sort();\n  for (var i = 0; i < keys.length; i++) {\n    iterator.call(context, obj[keys[i]], keys[i]);\n  }\n  return keys;\n}\n\n\n/**\n * when using forEach the params are value, key, but it is often useful to have key, value.\n * @param {function(string, *)} iteratorFn\n * @returns {function(*, string)}\n */\nfunction reverseParams(iteratorFn) {\n  return function(value, key) {iteratorFn(key, value);};\n}\n\n/**\n * A consistent way of creating unique IDs in angular.\n *\n * Using simple numbers allows us to generate 28.6 million unique ids per second for 10 years before\n * we hit number precision issues in JavaScript.\n *\n * Math.pow(2,53) / 60 / 60 / 24 / 365 / 10 = 28.6M\n *\n * @returns {number} an unique alpha-numeric string\n */\nfunction nextUid() {\n  return ++uid;\n}\n\n\n/**\n * Set or clear the hashkey for an object.\n * @param obj object\n * @param h the hashkey (!truthy to delete the hashkey)\n */\nfunction setHashKey(obj, h) {\n  if (h) {\n    obj.$$hashKey = h;\n  } else {\n    delete obj.$$hashKey;\n  }\n}\n\n\nfunction baseExtend(dst, objs, deep) {\n  var h = dst.$$hashKey;\n\n  for (var i = 0, ii = objs.length; i < ii; ++i) {\n    var obj = objs[i];\n    if (!isObject(obj) && !isFunction(obj)) continue;\n    var keys = Object.keys(obj);\n    for (var j = 0, jj = keys.length; j < jj; j++) {\n      var key = keys[j];\n      var src = obj[key];\n\n      if (deep && isObject(src)) {\n        if (isDate(src)) {\n          dst[key] = new Date(src.valueOf());\n        } else if (isRegExp(src)) {\n          dst[key] = new RegExp(src);\n        } else if (src.nodeName) {\n          dst[key] = src.cloneNode(true);\n        } else if (isElement(src)) {\n          dst[key] = src.clone();\n        } else {\n          if (!isObject(dst[key])) dst[key] = isArray(src) ? [] : {};\n          baseExtend(dst[key], [src], true);\n        }\n      } else {\n        dst[key] = src;\n      }\n    }\n  }\n\n  setHashKey(dst, h);\n  return dst;\n}\n\n/**\n * @ngdoc function\n * @name angular.extend\n * @module ng\n * @kind function\n *\n * @description\n * Extends the destination object `dst` by copying own enumerable properties from the `src` object(s)\n * to `dst`. You can specify multiple `src` objects. If you want to preserve original objects, you can do so\n * by passing an empty object as the target: `var object = angular.extend({}, object1, object2)`.\n *\n * **Note:** Keep in mind that `angular.extend` does not support recursive merge (deep copy). Use\n * {@link angular.merge} for this.\n *\n * @param {Object} dst Destination object.\n * @param {...Object} src Source object(s).\n * @returns {Object} Reference to `dst`.\n */\nfunction extend(dst) {\n  return baseExtend(dst, slice.call(arguments, 1), false);\n}\n\n\n/**\n* @ngdoc function\n* @name angular.merge\n* @module ng\n* @kind function\n*\n* @description\n* Deeply extends the destination object `dst` by copying own enumerable properties from the `src` object(s)\n* to `dst`. You can specify multiple `src` objects. If you want to preserve original objects, you can do so\n* by passing an empty object as the target: `var object = angular.merge({}, object1, object2)`.\n*\n* Unlike {@link angular.extend extend()}, `merge()` recursively descends into object properties of source\n* objects, performing a deep copy.\n*\n* @param {Object} dst Destination object.\n* @param {...Object} src Source object(s).\n* @returns {Object} Reference to `dst`.\n*/\nfunction merge(dst) {\n  return baseExtend(dst, slice.call(arguments, 1), true);\n}\n\n\n\nfunction toInt(str) {\n  return parseInt(str, 10);\n}\n\nvar isNumberNaN = Number.isNaN || function isNumberNaN(num) {\n  // eslint-disable-next-line no-self-compare\n  return num !== num;\n};\n\n\nfunction inherit(parent, extra) {\n  return extend(Object.create(parent), extra);\n}\n\n/**\n * @ngdoc function\n * @name angular.noop\n * @module ng\n * @kind function\n *\n * @description\n * A function that performs no operations. This function can be useful when writing code in the\n * functional style.\n   ```js\n     function foo(callback) {\n       var result = calculateResult();\n       (callback || angular.noop)(result);\n     }\n   ```\n */\nfunction noop() {}\nnoop.$inject = [];\n\n\n/**\n * @ngdoc function\n * @name angular.identity\n * @module ng\n * @kind function\n *\n * @description\n * A function that returns its first argument. This function is useful when writing code in the\n * functional style.\n *\n   ```js\n   function transformer(transformationFn, value) {\n     return (transformationFn || angular.identity)(value);\n   };\n\n   // E.g.\n   function getResult(fn, input) {\n     return (fn || angular.identity)(input);\n   };\n\n   getResult(function(n) { return n * 2; }, 21);   // returns 42\n   getResult(null, 21);                            // returns 21\n   getResult(undefined, 21);                       // returns 21\n   ```\n *\n * @param {*} value to be returned.\n * @returns {*} the value passed in.\n */\nfunction identity($) {return $;}\nidentity.$inject = [];\n\n\nfunction valueFn(value) {return function valueRef() {return value;};}\n\nfunction hasCustomToString(obj) {\n  return isFunction(obj.toString) && obj.toString !== toString;\n}\n\n\n/**\n * @ngdoc function\n * @name angular.isUndefined\n * @module ng\n * @kind function\n *\n * @description\n * Determines if a reference is undefined.\n *\n * @param {*} value Reference to check.\n * @returns {boolean} True if `value` is undefined.\n */\nfunction isUndefined(value) {return typeof value === 'undefined';}\n\n\n/**\n * @ngdoc function\n * @name angular.isDefined\n * @module ng\n * @kind function\n *\n * @description\n * Determines if a reference is defined.\n *\n * @param {*} value Reference to check.\n * @returns {boolean} True if `value` is defined.\n */\nfunction isDefined(value) {return typeof value !== 'undefined';}\n\n\n/**\n * @ngdoc function\n * @name angular.isObject\n * @module ng\n * @kind function\n *\n * @description\n * Determines if a reference is an `Object`. Unlike `typeof` in JavaScript, `null`s are not\n * considered to be objects. Note that JavaScript arrays are objects.\n *\n * @param {*} value Reference to check.\n * @returns {boolean} True if `value` is an `Object` but not `null`.\n */\nfunction isObject(value) {\n  // http://jsperf.com/isobject4\n  return value !== null && typeof value === 'object';\n}\n\n\n/**\n * Determine if a value is an object with a null prototype\n *\n * @returns {boolean} True if `value` is an `Object` with a null prototype\n */\nfunction isBlankObject(value) {\n  return value !== null && typeof value === 'object' && !getPrototypeOf(value);\n}\n\n\n/**\n * @ngdoc function\n * @name angular.isString\n * @module ng\n * @kind function\n *\n * @description\n * Determines if a reference is a `String`.\n *\n * @param {*} value Reference to check.\n * @returns {boolean} True if `value` is a `String`.\n */\nfunction isString(value) {return typeof value === 'string';}\n\n\n/**\n * @ngdoc function\n * @name angular.isNumber\n * @module ng\n * @kind function\n *\n * @description\n * Determines if a reference is a `Number`.\n *\n * This includes the \"special\" numbers `NaN`, `+Infinity` and `-Infinity`.\n *\n * If you wish to exclude these then you can use the native\n * [`isFinite'](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/isFinite)\n * method.\n *\n * @param {*} value Reference to check.\n * @returns {boolean} True if `value` is a `Number`.\n */\nfunction isNumber(value) {return typeof value === 'number';}\n\n\n/**\n * @ngdoc function\n * @name angular.isDate\n * @module ng\n * @kind function\n *\n * @description\n * Determines if a value is a date.\n *\n * @param {*} value Reference to check.\n * @returns {boolean} True if `value` is a `Date`.\n */\nfunction isDate(value) {\n  return toString.call(value) === '[object Date]';\n}\n\n\n/**\n * @ngdoc function\n * @name angular.isArray\n * @module ng\n * @kind function\n *\n * @description\n * Determines if a reference is an `Array`. Alias of Array.isArray.\n *\n * @param {*} value Reference to check.\n * @returns {boolean} True if `value` is an `Array`.\n */\nvar isArray = Array.isArray;\n\n/**\n * @ngdoc function\n * @name angular.isFunction\n * @module ng\n * @kind function\n *\n * @description\n * Determines if a reference is a `Function`.\n *\n * @param {*} value Reference to check.\n * @returns {boolean} True if `value` is a `Function`.\n */\nfunction isFunction(value) {return typeof value === 'function';}\n\n\n/**\n * Determines if a value is a regular expression object.\n *\n * @private\n * @param {*} value Reference to check.\n * @returns {boolean} True if `value` is a `RegExp`.\n */\nfunction isRegExp(value) {\n  return toString.call(value) === '[object RegExp]';\n}\n\n\n/**\n * Checks if `obj` is a window object.\n *\n * @private\n * @param {*} obj Object to check\n * @returns {boolean} True if `obj` is a window obj.\n */\nfunction isWindow(obj) {\n  return obj && obj.window === obj;\n}\n\n\nfunction isScope(obj) {\n  return obj && obj.$evalAsync && obj.$watch;\n}\n\n\nfunction isFile(obj) {\n  return toString.call(obj) === '[object File]';\n}\n\n\nfunction isFormData(obj) {\n  return toString.call(obj) === '[object FormData]';\n}\n\n\nfunction isBlob(obj) {\n  return toString.call(obj) === '[object Blob]';\n}\n\n\nfunction isBoolean(value) {\n  return typeof value === 'boolean';\n}\n\n\nfunction isPromiseLike(obj) {\n  return obj && isFunction(obj.then);\n}\n\n\nvar TYPED_ARRAY_REGEXP = /^\\[object (?:Uint8|Uint8Clamped|Uint16|Uint32|Int8|Int16|Int32|Float32|Float64)Array]$/;\nfunction isTypedArray(value) {\n  return value && isNumber(value.length) && TYPED_ARRAY_REGEXP.test(toString.call(value));\n}\n\nfunction isArrayBuffer(obj) {\n  return toString.call(obj) === '[object ArrayBuffer]';\n}\n\n\nvar trim = function(value) {\n  return isString(value) ? value.trim() : value;\n};\n\n// Copied from:\n// http://docs.closure-library.googlecode.com/git/local_closure_goog_string_string.js.source.html#line1021\n// Prereq: s is a string.\nvar escapeForRegexp = function(s) {\n  return s\n    .replace(/([-()[\\]{}+?*.$^|,:#<!\\\\])/g, '\\\\$1')\n    // eslint-disable-next-line no-control-regex\n    .replace(/\\x08/g, '\\\\x08');\n};\n\n\n/**\n * @ngdoc function\n * @name angular.isElement\n * @module ng\n * @kind function\n *\n * @description\n * Determines if a reference is a DOM element (or wrapped jQuery element).\n *\n * @param {*} value Reference to check.\n * @returns {boolean} True if `value` is a DOM element (or wrapped jQuery element).\n */\nfunction isElement(node) {\n  return !!(node &&\n    (node.nodeName  // We are a direct element.\n    || (node.prop && node.attr && node.find)));  // We have an on and find method part of jQuery API.\n}\n\n/**\n * @param str 'key1,key2,...'\n * @returns {object} in the form of {key1:true, key2:true, ...}\n */\nfunction makeMap(str) {\n  var obj = {}, items = str.split(','), i;\n  for (i = 0; i < items.length; i++) {\n    obj[items[i]] = true;\n  }\n  return obj;\n}\n\n\nfunction nodeName_(element) {\n  return lowercase(element.nodeName || (element[0] && element[0].nodeName));\n}\n\nfunction includes(array, obj) {\n  return Array.prototype.indexOf.call(array, obj) !== -1;\n}\n\nfunction arrayRemove(array, value) {\n  var index = array.indexOf(value);\n  if (index >= 0) {\n    array.splice(index, 1);\n  }\n  return index;\n}\n\n/**\n * @ngdoc function\n * @name angular.copy\n * @module ng\n * @kind function\n *\n * @description\n * Creates a deep copy of `source`, which should be an object or an array.\n *\n * * If no destination is supplied, a copy of the object or array is created.\n * * If a destination is provided, all of its elements (for arrays) or properties (for objects)\n *   are deleted and then all elements/properties from the source are copied to it.\n * * If `source` is not an object or array (inc. `null` and `undefined`), `source` is returned.\n * * If `source` is identical to `destination` an exception will be thrown.\n *\n * <br />\n * <div class=\"alert alert-warning\">\n *   Only enumerable properties are taken into account. Non-enumerable properties (both on `source`\n *   and on `destination`) will be ignored.\n * </div>\n *\n * @param {*} source The source that will be used to make a copy.\n *                   Can be any type, including primitives, `null`, and `undefined`.\n * @param {(Object|Array)=} destination Destination into which the source is copied. If\n *     provided, must be of the same type as `source`.\n * @returns {*} The copy or updated `destination`, if `destination` was specified.\n *\n * @example\n  <example module=\"copyExample\" name=\"angular-copy\">\n    <file name=\"index.ced81ed4.html\">\n      <div ng-controller=\"ExampleController\">\n        <form novalidate class=\"simple-form\">\n          <label>Name: <input type=\"text\" ng-model=\"user.name\" /></label><br />\n          <label>Age:  <input type=\"number\" ng-model=\"user.age\" /></label><br />\n          Gender: <label><input type=\"radio\" ng-model=\"user.gender\" value=\"male\" />male</label>\n                  <label><input type=\"radio\" ng-model=\"user.gender\" value=\"female\" />female</label><br />\n          <button ng-click=\"reset()\">RESET</button>\n          <button ng-click=\"update(user)\">SAVE</button>\n        </form>\n        <pre>form = {{user | json}}</pre>\n        <pre>master = {{master | json}}</pre>\n      </div>\n    </file>\n    <file name=\"script.js\">\n      // Module: copyExample\n      angular.\n        module('copyExample', []).\n        controller('ExampleController', ['$scope', function($scope) {\n          $scope.master = {};\n\n          $scope.reset = function() {\n            // Example with 1 argument\n            $scope.user = angular.copy($scope.master);\n          };\n\n          $scope.update = function(user) {\n            // Example with 2 arguments\n            angular.copy(user, $scope.master);\n          };\n\n          $scope.reset();\n        }]);\n    </file>\n  </example>\n */\nfunction copy(source, destination, maxDepth) {\n  var stackSource = [];\n  var stackDest = [];\n  maxDepth = isValidObjectMaxDepth(maxDepth) ? maxDepth : NaN;\n\n  if (destination) {\n    if (isTypedArray(destination) || isArrayBuffer(destination)) {\n      throw ngMinErr('cpta', 'Can\\'t copy! TypedArray destination cannot be mutated.');\n    }\n    if (source === destination) {\n      throw ngMinErr('cpi', 'Can\\'t copy! Source and destination are identical.');\n    }\n\n    // Empty the destination object\n    if (isArray(destination)) {\n      destination.length = 0;\n    } else {\n      forEach(destination, function(value, key) {\n        if (key !== '$$hashKey') {\n          delete destination[key];\n        }\n      });\n    }\n\n    stackSource.push(source);\n    stackDest.push(destination);\n    return copyRecurse(source, destination, maxDepth);\n  }\n\n  return copyElement(source, maxDepth);\n\n  function copyRecurse(source, destination, maxDepth) {\n    maxDepth--;\n    if (maxDepth < 0) {\n      return '...';\n    }\n    var h = destination.$$hashKey;\n    var key;\n    if (isArray(source)) {\n      for (var i = 0, ii = source.length; i < ii; i++) {\n        destination.push(copyElement(source[i], maxDepth));\n      }\n    } else if (isBlankObject(source)) {\n      // createMap() fast path --- Safe to avoid hasOwnProperty check because prototype chain is empty\n      for (key in source) {\n        destination[key] = copyElement(source[key], maxDepth);\n      }\n    } else if (source && typeof source.hasOwnProperty === 'function') {\n      // Slow path, which must rely on hasOwnProperty\n      for (key in source) {\n        if (source.hasOwnProperty(key)) {\n          destination[key] = copyElement(source[key], maxDepth);\n        }\n      }\n    } else {\n      // Slowest path --- hasOwnProperty can't be called as a method\n      for (key in source) {\n        if (hasOwnProperty.call(source, key)) {\n          destination[key] = copyElement(source[key], maxDepth);\n        }\n      }\n    }\n    setHashKey(destination, h);\n    return destination;\n  }\n\n  function copyElement(source, maxDepth) {\n    // Simple values\n    if (!isObject(source)) {\n      return source;\n    }\n\n    // Already copied values\n    var index = stackSource.indexOf(source);\n    if (index !== -1) {\n      return stackDest[index];\n    }\n\n    if (isWindow(source) || isScope(source)) {\n      throw ngMinErr('cpws',\n        'Can\\'t copy! Making copies of Window or Scope instances is not supported.');\n    }\n\n    var needsRecurse = false;\n    var destination = copyType(source);\n\n    if (destination === undefined) {\n      destination = isArray(source) ? [] : Object.create(getPrototypeOf(source));\n      needsRecurse = true;\n    }\n\n    stackSource.push(source);\n    stackDest.push(destination);\n\n    return needsRecurse\n      ? copyRecurse(source, destination, maxDepth)\n      : destination;\n  }\n\n  function copyType(source) {\n    switch (toString.call(source)) {\n      case '[object Int8Array]':\n      case '[object Int16Array]':\n      case '[object Int32Array]':\n      case '[object Float32Array]':\n      case '[object Float64Array]':\n      case '[object Uint8Array]':\n      case '[object Uint8ClampedArray]':\n      case '[object Uint16Array]':\n      case '[object Uint32Array]':\n        return new source.constructor(copyElement(source.buffer), source.byteOffset, source.length);\n\n      case '[object ArrayBuffer]':\n        // Support: IE10\n        if (!source.slice) {\n          // If we're in this case we know the environment supports ArrayBuffer\n          /* eslint-disable no-undef */\n          var copied = new ArrayBuffer(source.byteLength);\n          new Uint8Array(copied).set(new Uint8Array(source));\n          /* eslint-enable */\n          return copied;\n        }\n        return source.slice(0);\n\n      case '[object Boolean]':\n      case '[object Number]':\n      case '[object String]':\n      case '[object Date]':\n        return new source.constructor(source.valueOf());\n\n      case '[object RegExp]':\n        var re = new RegExp(source.source, source.toString().match(/[^/]*$/)[0]);\n        re.lastIndex = source.lastIndex;\n        return re;\n\n      case '[object Blob]':\n        return new source.constructor([source], {type: source.type});\n    }\n\n    if (isFunction(source.cloneNode)) {\n      return source.cloneNode(true);\n    }\n  }\n}\n\n\n// eslint-disable-next-line no-self-compare\nfunction simpleCompare(a, b) { return a === b || (a !== a && b !== b); }\n\n\n/**\n * @ngdoc function\n * @name angular.equals\n * @module ng\n * @kind function\n *\n * @description\n * Determines if two objects or two values are equivalent. Supports value types, regular\n * expressions, arrays and objects.\n *\n * Two objects or values are considered equivalent if at least one of the following is true:\n *\n * * Both objects or values pass `===` comparison.\n * * Both objects or values are of the same type and all of their properties are equal by\n *   comparing them with `angular.equals`.\n * * Both values are NaN. (In JavaScript, NaN == NaN => false. But we consider two NaN as equal)\n * * Both values represent the same regular expression (In JavaScript,\n *   /abc/ == /abc/ => false. But we consider two regular expressions as equal when their textual\n *   representation matches).\n *\n * During a property comparison, properties of `function` type and properties with names\n * that begin with `$` are ignored.\n *\n * Scope and DOMWindow objects are being compared only by identify (`===`).\n *\n * @param {*} o1 Object or value to compare.\n * @param {*} o2 Object or value to compare.\n * @returns {boolean} True if arguments are equal.\n *\n * @example\n   <example module=\"equalsExample\" name=\"equalsExample\">\n     <file name=\"index.ced81ed4.html\">\n      <div ng-controller=\"ExampleController\">\n        <form novalidate>\n          <h3>User 1</h3>\n          Name: <input type=\"text\" ng-model=\"user1.name\">\n          Age: <input type=\"number\" ng-model=\"user1.age\">\n\n          <h3>User 2</h3>\n          Name: <input type=\"text\" ng-model=\"user2.name\">\n          Age: <input type=\"number\" ng-model=\"user2.age\">\n\n          <div>\n            <br/>\n            <input type=\"button\" value=\"Compare\" ng-click=\"compare()\">\n          </div>\n          User 1: <pre>{{user1 | json}}</pre>\n          User 2: <pre>{{user2 | json}}</pre>\n          Equal: <pre>{{result}}</pre>\n        </form>\n      </div>\n    </file>\n    <file name=\"script.js\">\n        angular.module('equalsExample', []).controller('ExampleController', ['$scope', function($scope) {\n          $scope.user1 = {};\n          $scope.user2 = {};\n          $scope.compare = function() {\n            $scope.result = angular.equals($scope.user1, $scope.user2);\n          };\n        }]);\n    </file>\n  </example>\n */\nfunction equals(o1, o2) {\n  if (o1 === o2) return true;\n  if (o1 === null || o2 === null) return false;\n  // eslint-disable-next-line no-self-compare\n  if (o1 !== o1 && o2 !== o2) return true; // NaN === NaN\n  var t1 = typeof o1, t2 = typeof o2, length, key, keySet;\n  if (t1 === t2 && t1 === 'object') {\n    if (isArray(o1)) {\n      if (!isArray(o2)) return false;\n      if ((length = o1.length) === o2.length) {\n        for (key = 0; key < length; key++) {\n          if (!equals(o1[key], o2[key])) return false;\n        }\n        return true;\n      }\n    } else if (isDate(o1)) {\n      if (!isDate(o2)) return false;\n      return simpleCompare(o1.getTime(), o2.getTime());\n    } else if (isRegExp(o1)) {\n      if (!isRegExp(o2)) return false;\n      return o1.toString() === o2.toString();\n    } else {\n      if (isScope(o1) || isScope(o2) || isWindow(o1) || isWindow(o2) ||\n        isArray(o2) || isDate(o2) || isRegExp(o2)) return false;\n      keySet = createMap();\n      for (key in o1) {\n        if (key.charAt(0) === '$' || isFunction(o1[key])) continue;\n        if (!equals(o1[key], o2[key])) return false;\n        keySet[key] = true;\n      }\n      for (key in o2) {\n        if (!(key in keySet) &&\n            key.charAt(0) !== '$' &&\n            isDefined(o2[key]) &&\n            !isFunction(o2[key])) return false;\n      }\n      return true;\n    }\n  }\n  return false;\n}\n\nvar csp = function() {\n  if (!isDefined(csp.rules)) {\n\n\n    var ngCspElement = (window.document.querySelector('[ng-csp]') ||\n                    window.document.querySelector('[data-ng-csp]'));\n\n    if (ngCspElement) {\n      var ngCspAttribute = ngCspElement.getAttribute('ng-csp') ||\n                    ngCspElement.getAttribute('data-ng-csp');\n      csp.rules = {\n        noUnsafeEval: !ngCspAttribute || (ngCspAttribute.indexOf('no-unsafe-eval') !== -1),\n        noInlineStyle: !ngCspAttribute || (ngCspAttribute.indexOf('no-inline-style') !== -1)\n      };\n    } else {\n      csp.rules = {\n        noUnsafeEval: noUnsafeEval(),\n        noInlineStyle: false\n      };\n    }\n  }\n\n  return csp.rules;\n\n  function noUnsafeEval() {\n    try {\n      // eslint-disable-next-line no-new, no-new-func\n      new Function('');\n      return false;\n    } catch (e) {\n      return true;\n    }\n  }\n};\n\n/**\n * @ngdoc directive\n * @module ng\n * @name ngJq\n *\n * @element ANY\n * @param {string=} ngJq the name of the library available under `window`\n * to be used for angular.element\n * @description\n * Use this directive to force the angular.element library.  This should be\n * used to force either jqLite by leaving ng-jq blank or setting the name of\n * the jquery variable under window (eg. jQuery).\n *\n * Since angular looks for this directive when it is loaded (doesn't wait for the\n * DOMContentLoaded event), it must be placed on an element that comes before the script\n * which loads angular. Also, only the first instance of `ng-jq` will be used and all\n * others ignored.\n *\n * @example\n * This example shows how to force jqLite using the `ngJq` directive to the `html` tag.\n ```html\n <!doctype html>\n <html ng-app ng-jq>\n ...\n ...\n </html>\n ```\n * @example\n * This example shows how to use a jQuery based library of a different name.\n * The library name must be available at the top most 'window'.\n ```html\n <!doctype html>\n <html ng-app ng-jq=\"jQueryLib\">\n ...\n ...\n </html>\n ```\n */\nvar jq = function() {\n  if (isDefined(jq.name_)) return jq.name_;\n  var el;\n  var i, ii = ngAttrPrefixes.length, prefix, name;\n  for (i = 0; i < ii; ++i) {\n    prefix = ngAttrPrefixes[i];\n    el = window.document.querySelector('[' + prefix.replace(':', '\\\\:') + 'jq]');\n    if (el) {\n      name = el.getAttribute(prefix + 'jq');\n      break;\n    }\n  }\n\n  return (jq.name_ = name);\n};\n\nfunction concat(array1, array2, index) {\n  return array1.concat(slice.call(array2, index));\n}\n\nfunction sliceArgs(args, startIndex) {\n  return slice.call(args, startIndex || 0);\n}\n\n\n/**\n * @ngdoc function\n * @name angular.bind\n * @module ng\n * @kind function\n *\n * @description\n * Returns a function which calls function `fn` bound to `self` (`self` becomes the `this` for\n * `fn`). You can supply optional `args` that are prebound to the function. This feature is also\n * known as [partial application](http://en.wikipedia.org/wiki/Partial_application), as\n * distinguished from [function currying](http://en.wikipedia.org/wiki/Currying#Contrast_with_partial_function_application).\n *\n * @param {Object} self Context which `fn` should be evaluated in.\n * @param {function()} fn Function to be bound.\n * @param {...*} args Optional arguments to be prebound to the `fn` function call.\n * @returns {function()} Function that wraps the `fn` with all the specified bindings.\n */\nfunction bind(self, fn) {\n  var curryArgs = arguments.length > 2 ? sliceArgs(arguments, 2) : [];\n  if (isFunction(fn) && !(fn instanceof RegExp)) {\n    return curryArgs.length\n      ? function() {\n          return arguments.length\n            ? fn.apply(self, concat(curryArgs, arguments, 0))\n            : fn.apply(self, curryArgs);\n        }\n      : function() {\n          return arguments.length\n            ? fn.apply(self, arguments)\n            : fn.call(self);\n        };\n  } else {\n    // In IE, native methods are not functions so they cannot be bound (note: they don't need to be).\n    return fn;\n  }\n}\n\n\nfunction toJsonReplacer(key, value) {\n  var val = value;\n\n  if (typeof key === 'string' && key.charAt(0) === '$' && key.charAt(1) === '$') {\n    val = undefined;\n  } else if (isWindow(value)) {\n    val = '$WINDOW';\n  } else if (value &&  window.document === value) {\n    val = '$DOCUMENT';\n  } else if (isScope(value)) {\n    val = '$SCOPE';\n  }\n\n  return val;\n}\n\n\n/**\n * @ngdoc function\n * @name angular.toJson\n * @module ng\n * @kind function\n *\n * @description\n * Serializes input into a JSON-formatted string. Properties with leading $$ characters will be\n * stripped since angular uses this notation internally.\n *\n * @param {Object|Array|Date|string|number|boolean} obj Input to be serialized into JSON.\n * @param {boolean|number} [pretty=2] If set to true, the JSON output will contain newlines and whitespace.\n *    If set to an integer, the JSON output will contain that many spaces per indentation.\n * @returns {string|undefined} JSON-ified string representing `obj`.\n * @knownIssue\n *\n * The Safari browser throws a `RangeError` instead of returning `null` when it tries to stringify a `Date`\n * object with an invalid date value. The only reliable way to prevent this is to monkeypatch the\n * `Date.prototype.toJSON` method as follows:\n *\n * ```\n * var _DatetoJSON = Date.prototype.toJSON;\n * Date.prototype.toJSON = function() {\n *   try {\n *     return _DatetoJSON.call(this);\n *   } catch(e) {\n *     if (e instanceof RangeError) {\n *       return null;\n *     }\n *     throw e;\n *   }\n * };\n * ```\n *\n * See https://github.com/angular/angular.js/pull/14221 for more information.\n */\nfunction toJson(obj, pretty) {\n  if (isUndefined(obj)) return undefined;\n  if (!isNumber(pretty)) {\n    pretty = pretty ? 2 : null;\n  }\n  return JSON.stringify(obj, toJsonReplacer, pretty);\n}\n\n\n/**\n * @ngdoc function\n * @name angular.fromJson\n * @module ng\n * @kind function\n *\n * @description\n * Deserializes a JSON string.\n *\n * @param {string} json JSON string to deserialize.\n * @returns {Object|Array|string|number} Deserialized JSON string.\n */\nfunction fromJson(json) {\n  return isString(json)\n      ? JSON.parse(json)\n      : json;\n}\n\n\nvar ALL_COLONS = /:/g;\nfunction timezoneToOffset(timezone, fallback) {\n  // Support: IE 9-11 only, Edge 13-14+\n  // IE/Edge do not \"understand\" colon (`:`) in timezone\n  timezone = timezone.replace(ALL_COLONS, '');\n  var requestedTimezoneOffset = Date.parse('Jan 01, 1970 00:00:00 ' + timezone) / 60000;\n  return isNumberNaN(requestedTimezoneOffset) ? fallback : requestedTimezoneOffset;\n}\n\n\nfunction addDateMinutes(date, minutes) {\n  date = new Date(date.getTime());\n  date.setMinutes(date.getMinutes() + minutes);\n  return date;\n}\n\n\nfunction convertTimezoneToLocal(date, timezone, reverse) {\n  reverse = reverse ? -1 : 1;\n  var dateTimezoneOffset = date.getTimezoneOffset();\n  var timezoneOffset = timezoneToOffset(timezone, dateTimezoneOffset);\n  return addDateMinutes(date, reverse * (timezoneOffset - dateTimezoneOffset));\n}\n\n\n/**\n * @returns {string} Returns the string representation of the element.\n */\nfunction startingTag(element) {\n  element = jqLite(element).clone();\n  try {\n    // turns out IE does not let you set .html() on elements which\n    // are not allowed to have children. So we just ignore it.\n    element.empty();\n  } catch (e) { /* empty */ }\n  var elemHtml = jqLite('<div>').append(element).html();\n  try {\n    return element[0].nodeType === NODE_TYPE_TEXT ? lowercase(elemHtml) :\n        elemHtml.\n          match(/^(<[^>]+>)/)[1].\n          replace(/^<([\\w-]+)/, function(match, nodeName) {return '<' + lowercase(nodeName);});\n  } catch (e) {\n    return lowercase(elemHtml);\n  }\n\n}\n\n\n/////////////////////////////////////////////////\n\n/**\n * Tries to decode the URI component without throwing an exception.\n *\n * @private\n * @param str value potential URI component to check.\n * @returns {boolean} True if `value` can be decoded\n * with the decodeURIComponent function.\n */\nfunction tryDecodeURIComponent(value) {\n  try {\n    return decodeURIComponent(value);\n  } catch (e) {\n    // Ignore any invalid uri component.\n  }\n}\n\n\n/**\n * Parses an escaped url query string into key-value pairs.\n * @returns {Object.<string,boolean|Array>}\n */\nfunction parseKeyValue(/**string*/keyValue) {\n  var obj = {};\n  forEach((keyValue || '').split('&'), function(keyValue) {\n    var splitPoint, key, val;\n    if (keyValue) {\n      key = keyValue = keyValue.replace(/\\+/g,'%20');\n      splitPoint = keyValue.indexOf('=');\n      if (splitPoint !== -1) {\n        key = keyValue.substring(0, splitPoint);\n        val = keyValue.substring(splitPoint + 1);\n      }\n      key = tryDecodeURIComponent(key);\n      if (isDefined(key)) {\n        val = isDefined(val) ? tryDecodeURIComponent(val) : true;\n        if (!hasOwnProperty.call(obj, key)) {\n          obj[key] = val;\n        } else if (isArray(obj[key])) {\n          obj[key].push(val);\n        } else {\n          obj[key] = [obj[key],val];\n        }\n      }\n    }\n  });\n  return obj;\n}\n\nfunction toKeyValue(obj) {\n  var parts = [];\n  forEach(obj, function(value, key) {\n    if (isArray(value)) {\n      forEach(value, function(arrayValue) {\n        parts.push(encodeUriQuery(key, true) +\n                   (arrayValue === true ? '' : '=' + encodeUriQuery(arrayValue, true)));\n      });\n    } else {\n    parts.push(encodeUriQuery(key, true) +\n               (value === true ? '' : '=' + encodeUriQuery(value, true)));\n    }\n  });\n  return parts.length ? parts.join('&') : '';\n}\n\n\n/**\n * We need our custom method because encodeURIComponent is too aggressive and doesn't follow\n * http://www.ietf.org/rfc/rfc3986.txt with regards to the character set (pchar) allowed in path\n * segments:\n *    segment       = *pchar\n *    pchar         = unreserved / pct-encoded / sub-delims / \":\" / \"@\"\n *    pct-encoded   = \"%\" HEXDIG HEXDIG\n *    unreserved    = ALPHA / DIGIT / \"-\" / \".\" / \"_\" / \"~\"\n *    sub-delims    = \"!\" / \"$\" / \"&\" / \"'\" / \"(\" / \")\"\n *                     / \"*\" / \"+\" / \",\" / \";\" / \"=\"\n */\nfunction encodeUriSegment(val) {\n  return encodeUriQuery(val, true).\n             replace(/%26/gi, '&').\n             replace(/%3D/gi, '=').\n             replace(/%2B/gi, '+');\n}\n\n\n/**\n * This method is intended for encoding *key* or *value* parts of query component. We need a custom\n * method because encodeURIComponent is too aggressive and encodes stuff that doesn't have to be\n * encoded per http://tools.ietf.org/html/rfc3986:\n *    query         = *( pchar / \"/\" / \"?\" )\n *    pchar         = unreserved / pct-encoded / sub-delims / \":\" / \"@\"\n *    unreserved    = ALPHA / DIGIT / \"-\" / \".\" / \"_\" / \"~\"\n *    pct-encoded   = \"%\" HEXDIG HEXDIG\n *    sub-delims    = \"!\" / \"$\" / \"&\" / \"'\" / \"(\" / \")\"\n *                     / \"*\" / \"+\" / \",\" / \";\" / \"=\"\n */\nfunction encodeUriQuery(val, pctEncodeSpaces) {\n  return encodeURIComponent(val).\n             replace(/%40/gi, '@').\n             replace(/%3A/gi, ':').\n             replace(/%24/g, '$').\n             replace(/%2C/gi, ',').\n             replace(/%3B/gi, ';').\n             replace(/%20/g, (pctEncodeSpaces ? '%20' : '+'));\n}\n\nvar ngAttrPrefixes = ['ng-', 'data-ng-', 'ng:', 'x-ng-'];\n\nfunction getNgAttribute(element, ngAttr) {\n  var attr, i, ii = ngAttrPrefixes.length;\n  for (i = 0; i < ii; ++i) {\n    attr = ngAttrPrefixes[i] + ngAttr;\n    if (isString(attr = element.getAttribute(attr))) {\n      return attr;\n    }\n  }\n  return null;\n}\n\nfunction allowAutoBootstrap(document) {\n  var script = document.currentScript;\n\n  if (!script) {\n    // IE does not have `document.currentScript`\n    return true;\n  }\n\n  // If the `currentScript` property has been clobbered just return false, since this indicates a probable attack\n  if (!(script instanceof window.HTMLScriptElement || script instanceof window.SVGScriptElement)) {\n    return false;\n  }\n\n  var attributes = script.attributes;\n  var srcs = [attributes.getNamedItem('src'), attributes.getNamedItem('href'), attributes.getNamedItem('xlink:href')];\n\n  return srcs.every(function(src) {\n    if (!src) {\n      return true;\n    }\n    if (!src.value) {\n      return false;\n    }\n\n    var link = document.createElement('a');\n    link.href = src.value;\n\n    if (document.location.origin === link.origin) {\n      // Same-origin resources are always allowed, even for non-whitelisted schemes.\n      return true;\n    }\n    // Disabled bootstrapping unless angular.js was loaded from a known scheme used on the web.\n    // This is to prevent angular.js bundled with browser extensions from being used to bypass the\n    // content security policy in web pages and other browser extensions.\n    switch (link.protocol) {\n      case 'http:':\n      case 'https:':\n      case 'ftp:':\n      case 'blob:':\n      case 'file:':\n      case 'data:':\n        return true;\n      default:\n        return false;\n    }\n  });\n}\n\n// Cached as it has to run during loading so that document.currentScript is available.\nvar isAutoBootstrapAllowed = allowAutoBootstrap(window.document);\n\n/**\n * @ngdoc directive\n * @name ngApp\n * @module ng\n *\n * @element ANY\n * @param {angular.Module} ngApp an optional application\n *   {@link angular.module module} name to load.\n * @param {boolean=} ngStrictDi if this attribute is present on the app element, the injector will be\n *   created in \"strict-di\" mode. This means that the application will fail to invoke functions which\n *   do not use explicit function annotation (and are thus unsuitable for minification), as described\n *   in {@link guide/di the Dependency Injection guide}, and useful debugging info will assist in\n *   tracking down the root of these bugs.\n *\n * @description\n *\n * Use this directive to **auto-bootstrap** an AngularJS application. The `ngApp` directive\n * designates the **root element** of the application and is typically placed near the root element\n * of the page - e.g. on the `<body>` or `<html>` tags.\n *\n * There are a few things to keep in mind when using `ngApp`:\n * - only one AngularJS application can be auto-bootstrapped per HTML document. The first `ngApp`\n *   found in the document will be used to define the root element to auto-bootstrap as an\n *   application. To run multiple applications in an HTML document you must manually bootstrap them using\n *   {@link angular.bootstrap} instead.\n * - AngularJS applications cannot be nested within each other.\n * - Do not use a directive that uses {@link ng.$compile#transclusion transclusion} on the same element as `ngApp`.\n *   This includes directives such as {@link ng.ngIf `ngIf`}, {@link ng.ngInclude `ngInclude`} and\n *   {@link ngRoute.ngView `ngView`}.\n *   Doing this misplaces the app {@link ng.$rootElement `$rootElement`} and the app's {@link auto.$injector injector},\n *   causing animations to stop working and making the injector inaccessible from outside the app.\n *\n * You can specify an **AngularJS module** to be used as the root module for the application.  This\n * module will be loaded into the {@link auto.$injector} when the application is bootstrapped. It\n * should contain the application code needed or have dependencies on other modules that will\n * contain the code. See {@link angular.module} for more information.\n *\n * In the example below if the `ngApp` directive were not placed on the `html` element then the\n * document would not be compiled, the `AppController` would not be instantiated and the `{{ a+b }}`\n * would not be resolved to `3`.\n *\n * `ngApp` is the easiest, and most common way to bootstrap an application.\n *\n <example module=\"ngAppDemo\" name=\"ng-app\">\n   <file name=\"index.ced81ed4.html\">\n   <div ng-controller=\"ngAppDemoController\">\n     I can add: {{a}} + {{b}} =  {{ a+b }}\n   </div>\n   </file>\n   <file name=\"script.js\">\n   angular.module('ngAppDemo', []).controller('ngAppDemoController', function($scope) {\n     $scope.a = 1;\n     $scope.b = 2;\n   });\n   </file>\n </example>\n *\n * Using `ngStrictDi`, you would see something like this:\n *\n <example ng-app-included=\"true\" name=\"strict-di\">\n   <file name=\"index.ced81ed4.html\">\n   <div ng-app=\"ngAppStrictDemo\" ng-strict-di>\n       <div ng-controller=\"GoodController1\">\n           I can add: {{a}} + {{b}} =  {{ a+b }}\n\n           <p>This renders because the controller does not fail to\n              instantiate, by using explicit annotation style (see\n              script.js for details)\n           </p>\n       </div>\n\n       <div ng-controller=\"GoodController2\">\n           Name: <input ng-model=\"name\"><br />\n           Hello, {{name}}!\n\n           <p>This renders because the controller does not fail to\n              instantiate, by using explicit annotation style\n              (see script.js for details)\n           </p>\n       </div>\n\n       <div ng-controller=\"BadController\">\n           I can add: {{a}} + {{b}} =  {{ a+b }}\n\n           <p>The controller could not be instantiated, due to relying\n              on automatic function annotations (which are disabled in\n              strict mode). As such, the content of this section is not\n              interpolated, and there should be an error in your web console.\n           </p>\n       </div>\n   </div>\n   </file>\n   <file name=\"script.js\">\n   angular.module('ngAppStrictDemo', [])\n     // BadController will fail to instantiate, due to relying on automatic function annotation,\n     // rather than an explicit annotation\n     .controller('BadController', function($scope) {\n       $scope.a = 1;\n       $scope.b = 2;\n     })\n     // Unlike BadController, GoodController1 and GoodController2 will not fail to be instantiated,\n     // due to using explicit annotations using the array style and $inject property, respectively.\n     .controller('GoodController1', ['$scope', function($scope) {\n       $scope.a = 1;\n       $scope.b = 2;\n     }])\n     .controller('GoodController2', GoodController2);\n     function GoodController2($scope) {\n       $scope.name = 'World';\n     }\n     GoodController2.$inject = ['$scope'];\n   </file>\n   <file name=\"style.css\">\n   div[ng-controller] {\n       margin-bottom: 1em;\n       -webkit-border-radius: 4px;\n       border-radius: 4px;\n       border: 1px solid;\n       padding: .5em;\n   }\n   div[ng-controller^=Good] {\n       border-color: #d6e9c6;\n       background-color: #dff0d8;\n       color: #3c763d;\n   }\n   div[ng-controller^=Bad] {\n       border-color: #ebccd1;\n       background-color: #f2dede;\n       color: #a94442;\n       margin-bottom: 0;\n   }\n   </file>\n </example>\n */\nfunction angularInit(element, bootstrap) {\n  var appElement,\n      module,\n      config = {};\n\n  // The element `element` has priority over any other element.\n  forEach(ngAttrPrefixes, function(prefix) {\n    var name = prefix + 'app';\n\n    if (!appElement && element.hasAttribute && element.hasAttribute(name)) {\n      appElement = element;\n      module = element.getAttribute(name);\n    }\n  });\n  forEach(ngAttrPrefixes, function(prefix) {\n    var name = prefix + 'app';\n    var candidate;\n\n    if (!appElement && (candidate = element.querySelector('[' + name.replace(':', '\\\\:') + ']'))) {\n      appElement = candidate;\n      module = candidate.getAttribute(name);\n    }\n  });\n  if (appElement) {\n    if (!isAutoBootstrapAllowed) {\n      window.console.error('Angular: disabling automatic bootstrap. <script> protocol indicates ' +\n          'an extension, document.location.href does not match.');\n      return;\n    }\n    config.strictDi = getNgAttribute(appElement, 'strict-di') !== null;\n    bootstrap(appElement, module ? [module] : [], config);\n  }\n}\n\n/**\n * @ngdoc function\n * @name angular.bootstrap\n * @module ng\n * @description\n * Use this function to manually start up angular application.\n *\n * For more information, see the {@link guide/bootstrap Bootstrap guide}.\n *\n * Angular will detect if it has been loaded into the browser more than once and only allow the\n * first loaded script to be bootstrapped and will report a warning to the browser console for\n * each of the subsequent scripts. This prevents strange results in applications, where otherwise\n * multiple instances of Angular try to work on the DOM.\n *\n * <div class=\"alert alert-warning\">\n * **Note:** Protractor based end-to-end tests cannot use this function to bootstrap manually.\n * They must use {@link ng.directive:ngApp ngApp}.\n * </div>\n *\n * <div class=\"alert alert-warning\">\n * **Note:** Do not bootstrap the app on an element with a directive that uses {@link ng.$compile#transclusion transclusion},\n * such as {@link ng.ngIf `ngIf`}, {@link ng.ngInclude `ngInclude`} and {@link ngRoute.ngView `ngView`}.\n * Doing this misplaces the app {@link ng.$rootElement `$rootElement`} and the app's {@link auto.$injector injector},\n * causing animations to stop working and making the injector inaccessible from outside the app.\n * </div>\n *\n * ```html\n * <!doctype html>\n * <html>\n * <body>\n * <div ng-controller=\"WelcomeController\">\n *   {{greeting}}\n * </div>\n *\n * <script src=\"angular.js\"></script>\n * <script>\n *   var app = angular.module('demo', [])\n *   .controller('WelcomeController', function($scope) {\n *       $scope.greeting = 'Welcome!';\n *   });\n *   angular.bootstrap(document, ['demo']);\n * </script>\n * </body>\n * </html>\n * ```\n *\n * @param {DOMElement} element DOM element which is the root of angular application.\n * @param {Array<String|Function|Array>=} modules an array of modules to load into the application.\n *     Each item in the array should be the name of a predefined module or a (DI annotated)\n *     function that will be invoked by the injector as a `config` block.\n *     See: {@link angular.module modules}\n * @param {Object=} config an object for defining configuration options for the application. The\n *     following keys are supported:\n *\n * * `strictDi` - disable automatic function annotation for the application. This is meant to\n *   assist in finding bugs which break minified code. Defaults to `false`.\n *\n * @returns {auto.$injector} Returns the newly created injector for this app.\n */\nfunction bootstrap(element, modules, config) {\n  if (!isObject(config)) config = {};\n  var defaultConfig = {\n    strictDi: false\n  };\n  config = extend(defaultConfig, config);\n  var doBootstrap = function() {\n    element = jqLite(element);\n\n    if (element.injector()) {\n      var tag = (element[0] === window.document) ? 'document' : startingTag(element);\n      // Encode angle brackets to prevent input from being sanitized to empty string #8683.\n      throw ngMinErr(\n          'btstrpd',\n          'App already bootstrapped with this element \\'{0}\\'',\n          tag.replace(/</,'&lt;').replace(/>/,'&gt;'));\n    }\n\n    modules = modules || [];\n    modules.unshift(['$provide', function($provide) {\n      $provide.value('$rootElement', element);\n    }]);\n\n    if (config.debugInfoEnabled) {\n      // Pushing so that this overrides `debugInfoEnabled` setting defined in user's `modules`.\n      modules.push(['$compileProvider', function($compileProvider) {\n        $compileProvider.debugInfoEnabled(true);\n      }]);\n    }\n\n    modules.unshift('ng');\n    var injector = createInjector(modules, config.strictDi);\n    injector.invoke(['$rootScope', '$rootElement', '$compile', '$injector',\n       function bootstrapApply(scope, element, compile, injector) {\n        scope.$apply(function() {\n          element.data('$injector', injector);\n          compile(element)(scope);\n        });\n      }]\n    );\n    return injector;\n  };\n\n  var NG_ENABLE_DEBUG_INFO = /^NG_ENABLE_DEBUG_INFO!/;\n  var NG_DEFER_BOOTSTRAP = /^NG_DEFER_BOOTSTRAP!/;\n\n  if (window && NG_ENABLE_DEBUG_INFO.test(window.name)) {\n    config.debugInfoEnabled = true;\n    window.name = window.name.replace(NG_ENABLE_DEBUG_INFO, '');\n  }\n\n  if (window && !NG_DEFER_BOOTSTRAP.test(window.name)) {\n    return doBootstrap();\n  }\n\n  window.name = window.name.replace(NG_DEFER_BOOTSTRAP, '');\n  angular.resumeBootstrap = function(extraModules) {\n    forEach(extraModules, function(module) {\n      modules.push(module);\n    });\n    return doBootstrap();\n  };\n\n  if (isFunction(angular.resumeDeferredBootstrap)) {\n    angular.resumeDeferredBootstrap();\n  }\n}\n\n/**\n * @ngdoc function\n * @name angular.reloadWithDebugInfo\n * @module ng\n * @description\n * Use this function to reload the current application with debug information turned on.\n * This takes precedence over a call to `$compileProvider.debugInfoEnabled(false)`.\n *\n * See {@link ng.$compileProvider#debugInfoEnabled} for more.\n */\nfunction reloadWithDebugInfo() {\n  window.name = 'NG_ENABLE_DEBUG_INFO!' + window.name;\n  window.location.reload();\n}\n\n/**\n * @name angular.getTestability\n * @module ng\n * @description\n * Get the testability service for the instance of Angular on the given\n * element.\n * @param {DOMElement} element DOM element which is the root of angular application.\n */\nfunction getTestability(rootElement) {\n  var injector = angular.element(rootElement).injector();\n  if (!injector) {\n    throw ngMinErr('test',\n      'no injector found for element argument to getTestability');\n  }\n  return injector.get('$$testability');\n}\n\nvar SNAKE_CASE_REGEXP = /[A-Z]/g;\nfunction snake_case(name, separator) {\n  separator = separator || '_';\n  return name.replace(SNAKE_CASE_REGEXP, function(letter, pos) {\n    return (pos ? separator : '') + letter.toLowerCase();\n  });\n}\n\nvar bindJQueryFired = false;\nfunction bindJQuery() {\n  var originalCleanData;\n\n  if (bindJQueryFired) {\n    return;\n  }\n\n  // bind to jQuery if present;\n  var jqName = jq();\n  jQuery = isUndefined(jqName) ? window.jQuery :   // use jQuery (if present)\n           !jqName             ? undefined     :   // use jqLite\n                                 window[jqName];   // use jQuery specified by `ngJq`\n\n  // Use jQuery if it exists with proper functionality, otherwise default to us.\n  // Angular 1.2+ requires jQuery 1.7+ for on()/off() support.\n  // Angular 1.3+ technically requires at least jQuery 2.1+ but it may work with older\n  // versions. It will not work for sure with jQuery <1.7, though.\n  if (jQuery && jQuery.fn.on) {\n    jqLite = jQuery;\n    extend(jQuery.fn, {\n      scope: JQLitePrototype.scope,\n      isolateScope: JQLitePrototype.isolateScope,\n      controller: /** @type {?} */ (JQLitePrototype).controller,\n      injector: JQLitePrototype.injector,\n      inheritedData: JQLitePrototype.inheritedData\n    });\n\n    // All nodes removed from the DOM via various jQuery APIs like .remove()\n    // are passed through jQuery.cleanData. Monkey-patch this method to fire\n    // the $destroy event on all removed nodes.\n    originalCleanData = jQuery.cleanData;\n    jQuery.cleanData = function(elems) {\n      var events;\n      for (var i = 0, elem; (elem = elems[i]) != null; i++) {\n        events = jQuery._data(elem, 'events');\n        if (events && events.$destroy) {\n          jQuery(elem).triggerHandler('$destroy');\n        }\n      }\n      originalCleanData(elems);\n    };\n  } else {\n    jqLite = JQLite;\n  }\n\n  angular.element = jqLite;\n\n  // Prevent double-proxying.\n  bindJQueryFired = true;\n}\n\n/**\n * throw error if the argument is falsy.\n */\nfunction assertArg(arg, name, reason) {\n  if (!arg) {\n    throw ngMinErr('areq', 'Argument \\'{0}\\' is {1}', (name || '?'), (reason || 'required'));\n  }\n  return arg;\n}\n\nfunction assertArgFn(arg, name, acceptArrayAnnotation) {\n  if (acceptArrayAnnotation && isArray(arg)) {\n      arg = arg[arg.length - 1];\n  }\n\n  assertArg(isFunction(arg), name, 'not a function, got ' +\n      (arg && typeof arg === 'object' ? arg.constructor.name || 'Object' : typeof arg));\n  return arg;\n}\n\n/**\n * throw error if the name given is hasOwnProperty\n * @param  {String} name    the name to test\n * @param  {String} context the context in which the name is used, such as module or directive\n */\nfunction assertNotHasOwnProperty(name, context) {\n  if (name === 'hasOwnProperty') {\n    throw ngMinErr('badname', 'hasOwnProperty is not a valid {0} name', context);\n  }\n}\n\n/**\n * Return the value accessible from the object by path. Any undefined traversals are ignored\n * @param {Object} obj starting object\n * @param {String} path path to traverse\n * @param {boolean} [bindFnToScope=true]\n * @returns {Object} value as accessible by path\n */\n//TODO(misko): this function needs to be removed\nfunction getter(obj, path, bindFnToScope) {\n  if (!path) return obj;\n  var keys = path.split('.');\n  var key;\n  var lastInstance = obj;\n  var len = keys.length;\n\n  for (var i = 0; i < len; i++) {\n    key = keys[i];\n    if (obj) {\n      obj = (lastInstance = obj)[key];\n    }\n  }\n  if (!bindFnToScope && isFunction(obj)) {\n    return bind(lastInstance, obj);\n  }\n  return obj;\n}\n\n/**\n * Return the DOM siblings between the first and last node in the given array.\n * @param {Array} array like object\n * @returns {Array} the inputted object or a jqLite collection containing the nodes\n */\nfunction getBlockNodes(nodes) {\n  // TODO(perf): update `nodes` instead of creating a new object?\n  var node = nodes[0];\n  var endNode = nodes[nodes.length - 1];\n  var blockNodes;\n\n  for (var i = 1; node !== endNode && (node = node.nextSibling); i++) {\n    if (blockNodes || nodes[i] !== node) {\n      if (!blockNodes) {\n        blockNodes = jqLite(slice.call(nodes, 0, i));\n      }\n      blockNodes.push(node);\n    }\n  }\n\n  return blockNodes || nodes;\n}\n\n\n/**\n * Creates a new object without a prototype. This object is useful for lookup without having to\n * guard against prototypically inherited properties via hasOwnProperty.\n *\n * Related micro-benchmarks:\n * - http://jsperf.com/object-create2\n * - http://jsperf.com/proto-map-lookup/2\n * - http://jsperf.com/for-in-vs-object-keys2\n *\n * @returns {Object}\n */\nfunction createMap() {\n  return Object.create(null);\n}\n\nfunction stringify(value) {\n  if (value == null) { // null || undefined\n    return '';\n  }\n  switch (typeof value) {\n    case 'string':\n      break;\n    case 'number':\n      value = '' + value;\n      break;\n    default:\n      if (hasCustomToString(value) && !isArray(value) && !isDate(value)) {\n        value = value.toString();\n      } else {\n        value = toJson(value);\n      }\n  }\n\n  return value;\n}\n\nvar NODE_TYPE_ELEMENT = 1;\nvar NODE_TYPE_ATTRIBUTE = 2;\nvar NODE_TYPE_TEXT = 3;\nvar NODE_TYPE_COMMENT = 8;\nvar NODE_TYPE_DOCUMENT = 9;\nvar NODE_TYPE_DOCUMENT_FRAGMENT = 11;\n\n/**\n * @ngdoc type\n * @name angular.Module\n * @module ng\n * @description\n *\n * Interface for configuring angular {@link angular.module modules}.\n */\n\nfunction setupModuleLoader(window) {\n\n  var $injectorMinErr = minErr('$injector');\n  var ngMinErr = minErr('ng');\n\n  function ensure(obj, name, factory) {\n    return obj[name] || (obj[name] = factory());\n  }\n\n  var angular = ensure(window, 'angular', Object);\n\n  // We need to expose `angular.$$minErr` to modules such as `ngResource` that reference it during bootstrap\n  angular.$$minErr = angular.$$minErr || minErr;\n\n  return ensure(angular, 'module', function() {\n    /** @type {Object.<string, angular.Module>} */\n    var modules = {};\n\n    /**\n     * @ngdoc function\n     * @name angular.module\n     * @module ng\n     * @description\n     *\n     * The `angular.module` is a global place for creating, registering and retrieving Angular\n     * modules.\n     * All modules (angular core or 3rd party) that should be available to an application must be\n     * registered using this mechanism.\n     *\n     * Passing one argument retrieves an existing {@link angular.Module},\n     * whereas passing more than one argument creates a new {@link angular.Module}\n     *\n     *\n     * # Module\n     *\n     * A module is a collection of services, directives, controllers, filters, and configuration information.\n     * `angular.module` is used to configure the {@link auto.$injector $injector}.\n     *\n     * ```js\n     * // Create a new module\n     * var myModule = angular.module('myModule', []);\n     *\n     * // register a new service\n     * myModule.value('appName', 'MyCoolApp');\n     *\n     * // configure existing services inside initialization blocks.\n     * myModule.config(['$locationProvider', function($locationProvider) {\n     *   // Configure existing providers\n     *   $locationProvider.hashPrefix('!');\n     * }]);\n     * ```\n     *\n     * Then you can create an injector and load your modules like this:\n     *\n     * ```js\n     * var injector = angular.injector(['ng', 'myModule'])\n     * ```\n     *\n     * However it's more likely that you'll just use\n     * {@link ng.directive:ngApp ngApp} or\n     * {@link angular.bootstrap} to simplify this process for you.\n     *\n     * @param {!string} name The name of the module to create or retrieve.\n     * @param {!Array.<string>=} requires If specified then new module is being created. If\n     *        unspecified then the module is being retrieved for further configuration.\n     * @param {Function=} configFn Optional configuration function for the module. Same as\n     *        {@link angular.Module#config Module#config()}.\n     * @returns {angular.Module} new module with the {@link angular.Module} api.\n     */\n    return function module(name, requires, configFn) {\n\n      var info = {};\n\n      var assertNotHasOwnProperty = function(name, context) {\n        if (name === 'hasOwnProperty') {\n          throw ngMinErr('badname', 'hasOwnProperty is not a valid {0} name', context);\n        }\n      };\n\n      assertNotHasOwnProperty(name, 'module');\n      if (requires && modules.hasOwnProperty(name)) {\n        modules[name] = null;\n      }\n      return ensure(modules, name, function() {\n        if (!requires) {\n          throw $injectorMinErr('nomod', 'Module \\'{0}\\' is not available! You either misspelled ' +\n             'the module name or forgot to load it. If registering a module ensure that you ' +\n             'specify the dependencies as the second argument.', name);\n        }\n\n        /** @type {!Array.<Array.<*>>} */\n        var invokeQueue = [];\n\n        /** @type {!Array.<Function>} */\n        var configBlocks = [];\n\n        /** @type {!Array.<Function>} */\n        var runBlocks = [];\n\n        var config = invokeLater('$injector', 'invoke', 'push', configBlocks);\n\n        /** @type {angular.Module} */\n        var moduleInstance = {\n          // Private state\n          _invokeQueue: invokeQueue,\n          _configBlocks: configBlocks,\n          _runBlocks: runBlocks,\n\n          /**\n           * @ngdoc method\n           * @name angular.Module#info\n           * @module ng\n           *\n           * @param {Object=} info Information about the module\n           * @returns {Object|Module} The current info object for this module if called as a getter,\n           *                          or `this` if called as a setter.\n           *\n           * @description\n           * Read and write custom information about this module.\n           * For example you could put the version of the module in here.\n           *\n           * ```js\n           * angular.module('myModule', []).info({ version: '1.0.0' });\n           * ```\n           *\n           * The version could then be read back out by accessing the module elsewhere:\n           *\n           * ```\n           * var version = angular.module('myModule').info().version;\n           * ```\n           *\n           * You can also retrieve this information during runtime via the\n           * {@link $injector#modules `$injector.modules`} property:\n           *\n           * ```js\n           * var version = $injector.modules['myModule'].info().version;\n           * ```\n           */\n          info: function(value) {\n            if (isDefined(value)) {\n              if (!isObject(value)) throw ngMinErr('aobj', 'Argument \\'{0}\\' must be an object', 'value');\n              info = value;\n              return this;\n            }\n            return info;\n          },\n\n          /**\n           * @ngdoc property\n           * @name angular.Module#requires\n           * @module ng\n           *\n           * @description\n           * Holds the list of modules which the injector will load before the current module is\n           * loaded.\n           */\n          requires: requires,\n\n          /**\n           * @ngdoc property\n           * @name angular.Module#name\n           * @module ng\n           *\n           * @description\n           * Name of the module.\n           */\n          name: name,\n\n\n          /**\n           * @ngdoc method\n           * @name angular.Module#provider\n           * @module ng\n           * @param {string} name service name\n           * @param {Function} providerType Construction function for creating new instance of the\n           *                                service.\n           * @description\n           * See {@link auto.$provide#provider $provide.provider()}.\n           */\n          provider: invokeLaterAndSetModuleName('$provide', 'provider'),\n\n          /**\n           * @ngdoc method\n           * @name angular.Module#factory\n           * @module ng\n           * @param {string} name service name\n           * @param {Function} providerFunction Function for creating new instance of the service.\n           * @description\n           * See {@link auto.$provide#factory $provide.factory()}.\n           */\n          factory: invokeLaterAndSetModuleName('$provide', 'factory'),\n\n          /**\n           * @ngdoc method\n           * @name angular.Module#service\n           * @module ng\n           * @param {string} name service name\n           * @param {Function} constructor A constructor function that will be instantiated.\n           * @description\n           * See {@link auto.$provide#service $provide.service()}.\n           */\n          service: invokeLaterAndSetModuleName('$provide', 'service'),\n\n          /**\n           * @ngdoc method\n           * @name angular.Module#value\n           * @module ng\n           * @param {string} name service name\n           * @param {*} object Service instance object.\n           * @description\n           * See {@link auto.$provide#value $provide.value()}.\n           */\n          value: invokeLater('$provide', 'value'),\n\n          /**\n           * @ngdoc method\n           * @name angular.Module#constant\n           * @module ng\n           * @param {string} name constant name\n           * @param {*} object Constant value.\n           * @description\n           * Because the constants are fixed, they get applied before other provide methods.\n           * See {@link auto.$provide#constant $provide.constant()}.\n           */\n          constant: invokeLater('$provide', 'constant', 'unshift'),\n\n           /**\n           * @ngdoc method\n           * @name angular.Module#decorator\n           * @module ng\n           * @param {string} name The name of the service to decorate.\n           * @param {Function} decorFn This function will be invoked when the service needs to be\n           *                           instantiated and should return the decorated service instance.\n           * @description\n           * See {@link auto.$provide#decorator $provide.decorator()}.\n           */\n          decorator: invokeLaterAndSetModuleName('$provide', 'decorator', configBlocks),\n\n          /**\n           * @ngdoc method\n           * @name angular.Module#animation\n           * @module ng\n           * @param {string} name animation name\n           * @param {Function} animationFactory Factory function for creating new instance of an\n           *                                    animation.\n           * @description\n           *\n           * **NOTE**: animations take effect only if the **ngAnimate** module is loaded.\n           *\n           *\n           * Defines an animation hook that can be later used with\n           * {@link $animate $animate} service and directives that use this service.\n           *\n           * ```js\n           * module.animation('.animation-name', function($inject1, $inject2) {\n           *   return {\n           *     eventName : function(element, done) {\n           *       //code to run the animation\n           *       //once complete, then run done()\n           *       return function cancellationFunction(element) {\n           *         //code to cancel the animation\n           *       }\n           *     }\n           *   }\n           * })\n           * ```\n           *\n           * See {@link ng.$animateProvider#register $animateProvider.register()} and\n           * {@link ngAnimate ngAnimate module} for more information.\n           */\n          animation: invokeLaterAndSetModuleName('$animateProvider', 'register'),\n\n          /**\n           * @ngdoc method\n           * @name angular.Module#filter\n           * @module ng\n           * @param {string} name Filter name - this must be a valid angular expression identifier\n           * @param {Function} filterFactory Factory function for creating new instance of filter.\n           * @description\n           * See {@link ng.$filterProvider#register $filterProvider.register()}.\n           *\n           * <div class=\"alert alert-warning\">\n           * **Note:** Filter names must be valid angular {@link expression} identifiers, such as `uppercase` or `orderBy`.\n           * Names with special characters, such as hyphens and dots, are not allowed. If you wish to namespace\n           * your filters, then you can use capitalization (`myappSubsectionFilterx`) or underscores\n           * (`myapp_subsection_filterx`).\n           * </div>\n           */\n          filter: invokeLaterAndSetModuleName('$filterProvider', 'register'),\n\n          /**\n           * @ngdoc method\n           * @name angular.Module#controller\n           * @module ng\n           * @param {string|Object} name Controller name, or an object map of controllers where the\n           *    keys are the names and the values are the constructors.\n           * @param {Function} constructor Controller constructor function.\n           * @description\n           * See {@link ng.$controllerProvider#register $controllerProvider.register()}.\n           */\n          controller: invokeLaterAndSetModuleName('$controllerProvider', 'register'),\n\n          /**\n           * @ngdoc method\n           * @name angular.Module#directive\n           * @module ng\n           * @param {string|Object} name Directive name, or an object map of directives where the\n           *    keys are the names and the values are the factories.\n           * @param {Function} directiveFactory Factory function for creating new instance of\n           * directives.\n           * @description\n           * See {@link ng.$compileProvider#directive $compileProvider.directive()}.\n           */\n          directive: invokeLaterAndSetModuleName('$compileProvider', 'directive'),\n\n          /**\n           * @ngdoc method\n           * @name angular.Module#component\n           * @module ng\n           * @param {string} name Name of the component in camel-case (i.e. myComp which will match as my-comp)\n           * @param {Object} options Component definition object (a simplified\n           *    {@link ng.$compile#directive-definition-object directive definition object})\n           *\n           * @description\n           * See {@link ng.$compileProvider#component $compileProvider.component()}.\n           */\n          component: invokeLaterAndSetModuleName('$compileProvider', 'component'),\n\n          /**\n           * @ngdoc method\n           * @name angular.Module#config\n           * @module ng\n           * @param {Function} configFn Execute this function on module load. Useful for service\n           *    configuration.\n           * @description\n           * Use this method to register work which needs to be performed on module loading.\n           * For more about how to configure services, see\n           * {@link providers#provider-recipe Provider Recipe}.\n           */\n          config: config,\n\n          /**\n           * @ngdoc method\n           * @name angular.Module#run\n           * @module ng\n           * @param {Function} initializationFn Execute this function after injector creation.\n           *    Useful for application initialization.\n           * @description\n           * Use this method to register work which should be performed when the injector is done\n           * loading all modules.\n           */\n          run: function(block) {\n            runBlocks.push(block);\n            return this;\n          }\n        };\n\n        if (configFn) {\n          config(configFn);\n        }\n\n        return moduleInstance;\n\n        /**\n         * @param {string} provider\n         * @param {string} method\n         * @param {String=} insertMethod\n         * @returns {angular.Module}\n         */\n        function invokeLater(provider, method, insertMethod, queue) {\n          if (!queue) queue = invokeQueue;\n          return function() {\n            queue[insertMethod || 'push']([provider, method, arguments]);\n            return moduleInstance;\n          };\n        }\n\n        /**\n         * @param {string} provider\n         * @param {string} method\n         * @returns {angular.Module}\n         */\n        function invokeLaterAndSetModuleName(provider, method, queue) {\n          if (!queue) queue = invokeQueue;\n          return function(recipeName, factoryFunction) {\n            if (factoryFunction && isFunction(factoryFunction)) factoryFunction.$$moduleName = name;\n            queue.push([provider, method, arguments]);\n            return moduleInstance;\n          };\n        }\n      });\n    };\n  });\n\n}\n\n/* global shallowCopy: true */\n\n/**\n * Creates a shallow copy of an object, an array or a primitive.\n *\n * Assumes that there are no proto properties for objects.\n */\nfunction shallowCopy(src, dst) {\n  if (isArray(src)) {\n    dst = dst || [];\n\n    for (var i = 0, ii = src.length; i < ii; i++) {\n      dst[i] = src[i];\n    }\n  } else if (isObject(src)) {\n    dst = dst || {};\n\n    for (var key in src) {\n      if (!(key.charAt(0) === '$' && key.charAt(1) === '$')) {\n        dst[key] = src[key];\n      }\n    }\n  }\n\n  return dst || src;\n}\n\n/* global toDebugString: true */\n\nfunction serializeObject(obj, maxDepth) {\n  var seen = [];\n\n  // There is no direct way to stringify object until reaching a specific depth\n  // and a very deep object can cause a performance issue, so we copy the object\n  // based on this specific depth and then stringify it.\n  if (isValidObjectMaxDepth(maxDepth)) {\n    obj = copy(obj, null, maxDepth);\n  }\n  return JSON.stringify(obj, function(key, val) {\n    val = toJsonReplacer(key, val);\n    if (isObject(val)) {\n\n      if (seen.indexOf(val) >= 0) return '...';\n\n      seen.push(val);\n    }\n    return val;\n  });\n}\n\nfunction toDebugString(obj, maxDepth) {\n  if (typeof obj === 'function') {\n    return obj.toString().replace(/ \\{[\\s\\S]*$/, '');\n  } else if (isUndefined(obj)) {\n    return 'undefined';\n  } else if (typeof obj !== 'string') {\n    return serializeObject(obj, maxDepth);\n  }\n  return obj;\n}\n\n/* global angularModule: true,\n  version: true,\n\n  $CompileProvider,\n\n  htmlAnchorDirective,\n  inputDirective,\n  inputDirective,\n  formDirective,\n  scriptDirective,\n  selectDirective,\n  optionDirective,\n  ngBindDirective,\n  ngBindHtmlDirective,\n  ngBindTemplateDirective,\n  ngClassDirective,\n  ngClassEvenDirective,\n  ngClassOddDirective,\n  ngCloakDirective,\n  ngControllerDirective,\n  ngFormDirective,\n  ngHideDirective,\n  ngIfDirective,\n  ngIncludeDirective,\n  ngIncludeFillContentDirective,\n  ngInitDirective,\n  ngNonBindableDirective,\n  ngPluralizeDirective,\n  ngRepeatDirective,\n  ngShowDirective,\n  ngStyleDirective,\n  ngSwitchDirective,\n  ngSwitchWhenDirective,\n  ngSwitchDefaultDirective,\n  ngOptionsDirective,\n  ngTranscludeDirective,\n  ngModelDirective,\n  ngListDirective,\n  ngChangeDirective,\n  patternDirective,\n  patternDirective,\n  requiredDirective,\n  requiredDirective,\n  minlengthDirective,\n  minlengthDirective,\n  maxlengthDirective,\n  maxlengthDirective,\n  ngValueDirective,\n  ngModelOptionsDirective,\n  ngAttributeAliasDirectives,\n  ngEventDirectives,\n\n  $AnchorScrollProvider,\n  $AnimateProvider,\n  $CoreAnimateCssProvider,\n  $$CoreAnimateJsProvider,\n  $$CoreAnimateQueueProvider,\n  $$AnimateRunnerFactoryProvider,\n  $$AnimateAsyncRunFactoryProvider,\n  $BrowserProvider,\n  $CacheFactoryProvider,\n  $ControllerProvider,\n  $DateProvider,\n  $DocumentProvider,\n  $$IsDocumentHiddenProvider,\n  $ExceptionHandlerProvider,\n  $FilterProvider,\n  $$ForceReflowProvider,\n  $InterpolateProvider,\n  $IntervalProvider,\n  $HttpProvider,\n  $HttpParamSerializerProvider,\n  $HttpParamSerializerJQLikeProvider,\n  $HttpBackendProvider,\n  $xhrFactoryProvider,\n  $jsonpCallbacksProvider,\n  $LocationProvider,\n  $LogProvider,\n  $$MapProvider,\n  $ParseProvider,\n  $RootScopeProvider,\n  $QProvider,\n  $$QProvider,\n  $$SanitizeUriProvider,\n  $SceProvider,\n  $SceDelegateProvider,\n  $SnifferProvider,\n  $TemplateCacheProvider,\n  $TemplateRequestProvider,\n  $$TestabilityProvider,\n  $TimeoutProvider,\n  $$RAFProvider,\n  $WindowProvider,\n  $$jqLiteProvider,\n  $$CookieReaderProvider\n*/\n\n\n/**\n * @ngdoc object\n * @name angular.version\n * @module ng\n * @description\n * An object that contains information about the current AngularJS version.\n *\n * This object has the following properties:\n *\n * - `full` – `{string}` – Full version string, such as \"0.9.18\".\n * - `major` – `{number}` – Major version number, such as \"0\".\n * - `minor` – `{number}` – Minor version number, such as \"9\".\n * - `dot` – `{number}` – Dot version number, such as \"18\".\n * - `codeName` – `{string}` – Code name of the release, such as \"jiggling-armfat\".\n */\nvar version = {\n  // These placeholder strings will be replaced by grunt's `build` task.\n  // They need to be double- or single-quoted.\n  full: '1.6.4',\n  major: 1,\n  minor: 6,\n  dot: 4,\n  codeName: 'phenomenal-footnote'\n};\n\n\nfunction publishExternalAPI(angular) {\n  extend(angular, {\n    'errorHandlingConfig': errorHandlingConfig,\n    'bootstrap': bootstrap,\n    'copy': copy,\n    'extend': extend,\n    'merge': merge,\n    'equals': equals,\n    'element': jqLite,\n    'forEach': forEach,\n    'injector': createInjector,\n    'noop': noop,\n    'bind': bind,\n    'toJson': toJson,\n    'fromJson': fromJson,\n    'identity': identity,\n    'isUndefined': isUndefined,\n    'isDefined': isDefined,\n    'isString': isString,\n    'isFunction': isFunction,\n    'isObject': isObject,\n    'isNumber': isNumber,\n    'isElement': isElement,\n    'isArray': isArray,\n    'version': version,\n    'isDate': isDate,\n    'lowercase': lowercase,\n    'uppercase': uppercase,\n    'callbacks': {$$counter: 0},\n    'getTestability': getTestability,\n    'reloadWithDebugInfo': reloadWithDebugInfo,\n    '$$minErr': minErr,\n    '$$csp': csp,\n    '$$encodeUriSegment': encodeUriSegment,\n    '$$encodeUriQuery': encodeUriQuery,\n    '$$stringify': stringify\n  });\n\n  angularModule = setupModuleLoader(window);\n\n  angularModule('ng', ['ngLocale'], ['$provide',\n    function ngModule($provide) {\n      // $$sanitizeUriProvider needs to be before $compileProvider as it is used by it.\n      $provide.provider({\n        $$sanitizeUri: $$SanitizeUriProvider\n      });\n      $provide.provider('$compile', $CompileProvider).\n        directive({\n            a: htmlAnchorDirective,\n            input: inputDirective,\n            textarea: inputDirective,\n            form: formDirective,\n            script: scriptDirective,\n            select: selectDirective,\n            option: optionDirective,\n            ngBind: ngBindDirective,\n            ngBindHtml: ngBindHtmlDirective,\n            ngBindTemplate: ngBindTemplateDirective,\n            ngClass: ngClassDirective,\n            ngClassEven: ngClassEvenDirective,\n            ngClassOdd: ngClassOddDirective,\n            ngCloak: ngCloakDirective,\n            ngController: ngControllerDirective,\n            ngForm: ngFormDirective,\n            ngHide: ngHideDirective,\n            ngIf: ngIfDirective,\n            ngInclude: ngIncludeDirective,\n            ngInit: ngInitDirective,\n            ngNonBindable: ngNonBindableDirective,\n            ngPluralize: ngPluralizeDirective,\n            ngRepeat: ngRepeatDirective,\n            ngShow: ngShowDirective,\n            ngStyle: ngStyleDirective,\n            ngSwitch: ngSwitchDirective,\n            ngSwitchWhen: ngSwitchWhenDirective,\n            ngSwitchDefault: ngSwitchDefaultDirective,\n            ngOptions: ngOptionsDirective,\n            ngTransclude: ngTranscludeDirective,\n            ngModel: ngModelDirective,\n            ngList: ngListDirective,\n            ngChange: ngChangeDirective,\n            pattern: patternDirective,\n            ngPattern: patternDirective,\n            required: requiredDirective,\n            ngRequired: requiredDirective,\n            minlength: minlengthDirective,\n            ngMinlength: minlengthDirective,\n            maxlength: maxlengthDirective,\n            ngMaxlength: maxlengthDirective,\n            ngValue: ngValueDirective,\n            ngModelOptions: ngModelOptionsDirective\n        }).\n        directive({\n          ngInclude: ngIncludeFillContentDirective\n        }).\n        directive(ngAttributeAliasDirectives).\n        directive(ngEventDirectives);\n      $provide.provider({\n        $anchorScroll: $AnchorScrollProvider,\n        $animate: $AnimateProvider,\n        $animateCss: $CoreAnimateCssProvider,\n        $$animateJs: $$CoreAnimateJsProvider,\n        $$animateQueue: $$CoreAnimateQueueProvider,\n        $$AnimateRunner: $$AnimateRunnerFactoryProvider,\n        $$animateAsyncRun: $$AnimateAsyncRunFactoryProvider,\n        $browser: $BrowserProvider,\n        $cacheFactory: $CacheFactoryProvider,\n        $controller: $ControllerProvider,\n        $document: $DocumentProvider,\n        $$isDocumentHidden: $$IsDocumentHiddenProvider,\n        $exceptionHandler: $ExceptionHandlerProvider,\n        $filter: $FilterProvider,\n        $$forceReflow: $$ForceReflowProvider,\n        $interpolate: $InterpolateProvider,\n        $interval: $IntervalProvider,\n        $http: $HttpProvider,\n        $httpParamSerializer: $HttpParamSerializerProvider,\n        $httpParamSerializerJQLike: $HttpParamSerializerJQLikeProvider,\n        $httpBackend: $HttpBackendProvider,\n        $xhrFactory: $xhrFactoryProvider,\n        $jsonpCallbacks: $jsonpCallbacksProvider,\n        $location: $LocationProvider,\n        $log: $LogProvider,\n        $parse: $ParseProvider,\n        $rootScope: $RootScopeProvider,\n        $q: $QProvider,\n        $$q: $$QProvider,\n        $sce: $SceProvider,\n        $sceDelegate: $SceDelegateProvider,\n        $sniffer: $SnifferProvider,\n        $templateCache: $TemplateCacheProvider,\n        $templateRequest: $TemplateRequestProvider,\n        $$testability: $$TestabilityProvider,\n        $timeout: $TimeoutProvider,\n        $window: $WindowProvider,\n        $$rAF: $$RAFProvider,\n        $$jqLite: $$jqLiteProvider,\n        $$Map: $$MapProvider,\n        $$cookieReader: $$CookieReaderProvider\n      });\n    }\n  ])\n  .info({ angularVersion: '1.6.4' });\n}\n\n/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *\n *     Any commits to this file should be reviewed with security in mind.  *\n *   Changes to this file can potentially create security vulnerabilities. *\n *          An approval from 2 Core members with history of modifying      *\n *                         this file is required.                          *\n *                                                                         *\n *  Does the change somehow allow for arbitrary javascript to be executed? *\n *    Or allows for someone to change the prototype of built-in objects?   *\n *     Or gives undesired access to variables likes document or window?    *\n * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */\n\n/* global\n  JQLitePrototype: true,\n  BOOLEAN_ATTR: true,\n  ALIASED_ATTR: true\n*/\n\n//////////////////////////////////\n//JQLite\n//////////////////////////////////\n\n/**\n * @ngdoc function\n * @name angular.element\n * @module ng\n * @kind function\n *\n * @description\n * Wraps a raw DOM element or HTML string as a [jQuery](http://jquery.com) element.\n *\n * If jQuery is available, `angular.element` is an alias for the\n * [jQuery](http://api.jquery.com/jQuery/) function. If jQuery is not available, `angular.element`\n * delegates to Angular's built-in subset of jQuery, called \"jQuery lite\" or **jqLite**.\n *\n * jqLite is a tiny, API-compatible subset of jQuery that allows\n * Angular to manipulate the DOM in a cross-browser compatible way. jqLite implements only the most\n * commonly needed functionality with the goal of having a very small footprint.\n *\n * To use `jQuery`, simply ensure it is loaded before the `angular.js` file. You can also use the\n * {@link ngJq `ngJq`} directive to specify that jqlite should be used over jQuery, or to use a\n * specific version of jQuery if multiple versions exist on the page.\n *\n * <div class=\"alert alert-info\">**Note:** All element references in Angular are always wrapped with jQuery or\n * jqLite (such as the element argument in a directive's compile / link function). They are never raw DOM references.</div>\n *\n * <div class=\"alert alert-warning\">**Note:** Keep in mind that this function will not find elements\n * by tag name / CSS selector. For lookups by tag name, try instead `angular.element(document).find(...)`\n * or `$document.find()`, or use the standard DOM APIs, e.g. `document.querySelectorAll()`.</div>\n *\n * ## Angular's jqLite\n * jqLite provides only the following jQuery methods:\n *\n * - [`addClass()`](http://api.jquery.com/addClass/) - Does not support a function as first argument\n * - [`after()`](http://api.jquery.com/after/)\n * - [`append()`](http://api.jquery.com/append/)\n * - [`attr()`](http://api.jquery.com/attr/) - Does not support functions as parameters\n * - [`bind()`](http://api.jquery.com/bind/) (_deprecated_, use [`on()`](http://api.jquery.com/on/)) - Does not support namespaces, selectors or eventData\n * - [`children()`](http://api.jquery.com/children/) - Does not support selectors\n * - [`clone()`](http://api.jquery.com/clone/)\n * - [`contents()`](http://api.jquery.com/contents/)\n * - [`css()`](http://api.jquery.com/css/) - Only retrieves inline-styles, does not call `getComputedStyle()`.\n *   As a setter, does not convert numbers to strings or append 'px', and also does not have automatic property prefixing.\n * - [`data()`](http://api.jquery.com/data/)\n * - [`detach()`](http://api.jquery.com/detach/)\n * - [`empty()`](http://api.jquery.com/empty/)\n * - [`eq()`](http://api.jquery.com/eq/)\n * - [`find()`](http://api.jquery.com/find/) - Limited to lookups by tag name\n * - [`hasClass()`](http://api.jquery.com/hasClass/)\n * - [`html()`](http://api.jquery.com/html/)\n * - [`next()`](http://api.jquery.com/next/) - Does not support selectors\n * - [`on()`](http://api.jquery.com/on/) - Does not support namespaces, selectors or eventData\n * - [`off()`](http://api.jquery.com/off/) - Does not support namespaces, selectors or event object as parameter\n * - [`one()`](http://api.jquery.com/one/) - Does not support namespaces or selectors\n * - [`parent()`](http://api.jquery.com/parent/) - Does not support selectors\n * - [`prepend()`](http://api.jquery.com/prepend/)\n * - [`prop()`](http://api.jquery.com/prop/)\n * - [`ready()`](http://api.jquery.com/ready/) (_deprecated_, use `angular.element(callback)` instead of `angular.element(document).ready(callback)`)\n * - [`remove()`](http://api.jquery.com/remove/)\n * - [`removeAttr()`](http://api.jquery.com/removeAttr/) - Does not support multiple attributes\n * - [`removeClass()`](http://api.jquery.com/removeClass/) - Does not support a function as first argument\n * - [`removeData()`](http://api.jquery.com/removeData/)\n * - [`replaceWith()`](http://api.jquery.com/replaceWith/)\n * - [`text()`](http://api.jquery.com/text/)\n * - [`toggleClass()`](http://api.jquery.com/toggleClass/) - Does not support a function as first argument\n * - [`triggerHandler()`](http://api.jquery.com/triggerHandler/) - Passes a dummy event object to handlers\n * - [`unbind()`](http://api.jquery.com/unbind/) (_deprecated_, use [`off()`](http://api.jquery.com/off/)) - Does not support namespaces or event object as parameter\n * - [`val()`](http://api.jquery.com/val/)\n * - [`wrap()`](http://api.jquery.com/wrap/)\n *\n * ## jQuery/jqLite Extras\n * Angular also provides the following additional methods and events to both jQuery and jqLite:\n *\n * ### Events\n * - `$destroy` - AngularJS intercepts all jqLite/jQuery's DOM destruction apis and fires this event\n *    on all DOM nodes being removed.  This can be used to clean up any 3rd party bindings to the DOM\n *    element before it is removed.\n *\n * ### Methods\n * - `controller(name)` - retrieves the controller of the current element or its parent. By default\n *   retrieves controller associated with the `ngController` directive. If `name` is provided as\n *   camelCase directive name, then the controller for this directive will be retrieved (e.g.\n *   `'ngModel'`).\n * - `injector()` - retrieves the injector of the current element or its parent.\n * - `scope()` - retrieves the {@link ng.$rootScope.Scope scope} of the current\n *   element or its parent. Requires {@link guide/production#disabling-debug-data Debug Data} to\n *   be enabled.\n * - `isolateScope()` - retrieves an isolate {@link ng.$rootScope.Scope scope} if one is attached directly to the\n *   current element. This getter should be used only on elements that contain a directive which starts a new isolate\n *   scope. Calling `scope()` on this element always returns the original non-isolate scope.\n *   Requires {@link guide/production#disabling-debug-data Debug Data} to be enabled.\n * - `inheritedData()` - same as `data()`, but walks up the DOM until a value is found or the top\n *   parent element is reached.\n *\n * @knownIssue You cannot spy on `angular.element` if you are using Jasmine version 1.x. See\n * https://github.com/angular/angular.js/issues/14251 for more information.\n *\n * @param {string|DOMElement} element HTML string or DOMElement to be wrapped into jQuery.\n * @returns {Object} jQuery object.\n */\n\nJQLite.expando = 'ng339';\n\nvar jqCache = JQLite.cache = {},\n    jqId = 1;\n\n/*\n * !!! This is an undocumented \"private\" function !!!\n */\nJQLite._data = function(node) {\n  //jQuery always returns an object on cache miss\n  return this.cache[node[this.expando]] || {};\n};\n\nfunction jqNextId() { return ++jqId; }\n\n\nvar DASH_LOWERCASE_REGEXP = /-([a-z])/g;\nvar MS_HACK_REGEXP = /^-ms-/;\nvar MOUSE_EVENT_MAP = { mouseleave: 'mouseout', mouseenter: 'mouseover' };\nvar jqLiteMinErr = minErr('jqLite');\n\n/**\n * Converts kebab-case to camelCase.\n * There is also a special case for the ms prefix starting with a lowercase letter.\n * @param name Name to normalize\n */\nfunction cssKebabToCamel(name) {\n    return kebabToCamel(name.replace(MS_HACK_REGEXP, 'ms-'));\n}\n\nfunction fnCamelCaseReplace(all, letter) {\n  return letter.toUpperCase();\n}\n\n/**\n * Converts kebab-case to camelCase.\n * @param name Name to normalize\n */\nfunction kebabToCamel(name) {\n  return name\n    .replace(DASH_LOWERCASE_REGEXP, fnCamelCaseReplace);\n}\n\nvar SINGLE_TAG_REGEXP = /^<([\\w-]+)\\s*\\/?>(?:<\\/\\1>|)$/;\nvar HTML_REGEXP = /<|&#?\\w+;/;\nvar TAG_NAME_REGEXP = /<([\\w:-]+)/;\nvar XHTML_TAG_REGEXP = /<(?!area|br|col|embed|hr|img|input|link|meta|param)(([\\w:-]+)[^>]*)\\/>/gi;\n\nvar wrapMap = {\n  'option': [1, '<select multiple=\"multiple\">', '</select>'],\n\n  'thead': [1, '<table>', '</table>'],\n  'col': [2, '<table><colgroup>', '</colgroup></table>'],\n  'tr': [2, '<table><tbody>', '</tbody></table>'],\n  'td': [3, '<table><tbody><tr>', '</tr></tbody></table>'],\n  '_default': [0, '', '']\n};\n\nwrapMap.optgroup = wrapMap.option;\nwrapMap.tbody = wrapMap.tfoot = wrapMap.colgroup = wrapMap.caption = wrapMap.thead;\nwrapMap.th = wrapMap.td;\n\n\nfunction jqLiteIsTextNode(html) {\n  return !HTML_REGEXP.test(html);\n}\n\nfunction jqLiteAcceptsData(node) {\n  // The window object can accept data but has no nodeType\n  // Otherwise we are only interested in elements (1) and documents (9)\n  var nodeType = node.nodeType;\n  return nodeType === NODE_TYPE_ELEMENT || !nodeType || nodeType === NODE_TYPE_DOCUMENT;\n}\n\nfunction jqLiteHasData(node) {\n  for (var key in jqCache[node.ng339]) {\n    return true;\n  }\n  return false;\n}\n\nfunction jqLiteBuildFragment(html, context) {\n  var tmp, tag, wrap,\n      fragment = context.createDocumentFragment(),\n      nodes = [], i;\n\n  if (jqLiteIsTextNode(html)) {\n    // Convert non-html into a text node\n    nodes.push(context.createTextNode(html));\n  } else {\n    // Convert html into DOM nodes\n    tmp = fragment.appendChild(context.createElement('div'));\n    tag = (TAG_NAME_REGEXP.exec(html) || ['', ''])[1].toLowerCase();\n    wrap = wrapMap[tag] || wrapMap._default;\n    tmp.innerHTML = wrap[1] + html.replace(XHTML_TAG_REGEXP, '<$1></$2>') + wrap[2];\n\n    // Descend through wrappers to the right content\n    i = wrap[0];\n    while (i--) {\n      tmp = tmp.lastChild;\n    }\n\n    nodes = concat(nodes, tmp.childNodes);\n\n    tmp = fragment.firstChild;\n    tmp.textContent = '';\n  }\n\n  // Remove wrapper from fragment\n  fragment.textContent = '';\n  fragment.innerHTML = ''; // Clear inner HTML\n  forEach(nodes, function(node) {\n    fragment.appendChild(node);\n  });\n\n  return fragment;\n}\n\nfunction jqLiteParseHTML(html, context) {\n  context = context || window.document;\n  var parsed;\n\n  if ((parsed = SINGLE_TAG_REGEXP.exec(html))) {\n    return [context.createElement(parsed[1])];\n  }\n\n  if ((parsed = jqLiteBuildFragment(html, context))) {\n    return parsed.childNodes;\n  }\n\n  return [];\n}\n\nfunction jqLiteWrapNode(node, wrapper) {\n  var parent = node.parentNode;\n\n  if (parent) {\n    parent.replaceChild(wrapper, node);\n  }\n\n  wrapper.appendChild(node);\n}\n\n\n// IE9-11 has no method \"contains\" in SVG element and in Node.prototype. Bug #10259.\nvar jqLiteContains = window.Node.prototype.contains || /** @this */ function(arg) {\n  // eslint-disable-next-line no-bitwise\n  return !!(this.compareDocumentPosition(arg) & 16);\n};\n\n/////////////////////////////////////////////\nfunction JQLite(element) {\n  if (element instanceof JQLite) {\n    return element;\n  }\n\n  var argIsString;\n\n  if (isString(element)) {\n    element = trim(element);\n    argIsString = true;\n  }\n  if (!(this instanceof JQLite)) {\n    if (argIsString && element.charAt(0) !== '<') {\n      throw jqLiteMinErr('nosel', 'Looking up elements via selectors is not supported by jqLite! See: http://docs.angularjs.org/api/angular.element');\n    }\n    return new JQLite(element);\n  }\n\n  if (argIsString) {\n    jqLiteAddNodes(this, jqLiteParseHTML(element));\n  } else if (isFunction(element)) {\n    jqLiteReady(element);\n  } else {\n    jqLiteAddNodes(this, element);\n  }\n}\n\nfunction jqLiteClone(element) {\n  return element.cloneNode(true);\n}\n\nfunction jqLiteDealoc(element, onlyDescendants) {\n  if (!onlyDescendants && jqLiteAcceptsData(element)) jqLite.cleanData([element]);\n\n  if (element.querySelectorAll) {\n    jqLite.cleanData(element.querySelectorAll('*'));\n  }\n}\n\nfunction jqLiteOff(element, type, fn, unsupported) {\n  if (isDefined(unsupported)) throw jqLiteMinErr('offargs', 'jqLite#off() does not support the `selector` argument');\n\n  var expandoStore = jqLiteExpandoStore(element);\n  var events = expandoStore && expandoStore.events;\n  var handle = expandoStore && expandoStore.handle;\n\n  if (!handle) return; //no listeners registered\n\n  if (!type) {\n    for (type in events) {\n      if (type !== '$destroy') {\n        element.removeEventListener(type, handle);\n      }\n      delete events[type];\n    }\n  } else {\n\n    var removeHandler = function(type) {\n      var listenerFns = events[type];\n      if (isDefined(fn)) {\n        arrayRemove(listenerFns || [], fn);\n      }\n      if (!(isDefined(fn) && listenerFns && listenerFns.length > 0)) {\n        element.removeEventListener(type, handle);\n        delete events[type];\n      }\n    };\n\n    forEach(type.split(' '), function(type) {\n      removeHandler(type);\n      if (MOUSE_EVENT_MAP[type]) {\n        removeHandler(MOUSE_EVENT_MAP[type]);\n      }\n    });\n  }\n}\n\nfunction jqLiteRemoveData(element, name) {\n  var expandoId = element.ng339;\n  var expandoStore = expandoId && jqCache[expandoId];\n\n  if (expandoStore) {\n    if (name) {\n      delete expandoStore.data[name];\n      return;\n    }\n\n    if (expandoStore.handle) {\n      if (expandoStore.events.$destroy) {\n        expandoStore.handle({}, '$destroy');\n      }\n      jqLiteOff(element);\n    }\n    delete jqCache[expandoId];\n    element.ng339 = undefined; // don't delete DOM expandos. IE and Chrome don't like it\n  }\n}\n\n\nfunction jqLiteExpandoStore(element, createIfNecessary) {\n  var expandoId = element.ng339,\n      expandoStore = expandoId && jqCache[expandoId];\n\n  if (createIfNecessary && !expandoStore) {\n    element.ng339 = expandoId = jqNextId();\n    expandoStore = jqCache[expandoId] = {events: {}, data: {}, handle: undefined};\n  }\n\n  return expandoStore;\n}\n\n\nfunction jqLiteData(element, key, value) {\n  if (jqLiteAcceptsData(element)) {\n    var prop;\n\n    var isSimpleSetter = isDefined(value);\n    var isSimpleGetter = !isSimpleSetter && key && !isObject(key);\n    var massGetter = !key;\n    var expandoStore = jqLiteExpandoStore(element, !isSimpleGetter);\n    var data = expandoStore && expandoStore.data;\n\n    if (isSimpleSetter) { // data('key', value)\n      data[kebabToCamel(key)] = value;\n    } else {\n      if (massGetter) {  // data()\n        return data;\n      } else {\n        if (isSimpleGetter) { // data('key')\n          // don't force creation of expandoStore if it doesn't exist yet\n          return data && data[kebabToCamel(key)];\n        } else { // mass-setter: data({key1: val1, key2: val2})\n          for (prop in key) {\n            data[kebabToCamel(prop)] = key[prop];\n          }\n        }\n      }\n    }\n  }\n}\n\nfunction jqLiteHasClass(element, selector) {\n  if (!element.getAttribute) return false;\n  return ((' ' + (element.getAttribute('class') || '') + ' ').replace(/[\\n\\t]/g, ' ').\n      indexOf(' ' + selector + ' ') > -1);\n}\n\nfunction jqLiteRemoveClass(element, cssClasses) {\n  if (cssClasses && element.setAttribute) {\n    forEach(cssClasses.split(' '), function(cssClass) {\n      element.setAttribute('class', trim(\n          (' ' + (element.getAttribute('class') || '') + ' ')\n          .replace(/[\\n\\t]/g, ' ')\n          .replace(' ' + trim(cssClass) + ' ', ' '))\n      );\n    });\n  }\n}\n\nfunction jqLiteAddClass(element, cssClasses) {\n  if (cssClasses && element.setAttribute) {\n    var existingClasses = (' ' + (element.getAttribute('class') || '') + ' ')\n                            .replace(/[\\n\\t]/g, ' ');\n\n    forEach(cssClasses.split(' '), function(cssClass) {\n      cssClass = trim(cssClass);\n      if (existingClasses.indexOf(' ' + cssClass + ' ') === -1) {\n        existingClasses += cssClass + ' ';\n      }\n    });\n\n    element.setAttribute('class', trim(existingClasses));\n  }\n}\n\n\nfunction jqLiteAddNodes(root, elements) {\n  // THIS CODE IS VERY HOT. Don't make changes without benchmarking.\n\n  if (elements) {\n\n    // if a Node (the most common case)\n    if (elements.nodeType) {\n      root[root.length++] = elements;\n    } else {\n      var length = elements.length;\n\n      // if an Array or NodeList and not a Window\n      if (typeof length === 'number' && elements.window !== elements) {\n        if (length) {\n          for (var i = 0; i < length; i++) {\n            root[root.length++] = elements[i];\n          }\n        }\n      } else {\n        root[root.length++] = elements;\n      }\n    }\n  }\n}\n\n\nfunction jqLiteController(element, name) {\n  return jqLiteInheritedData(element, '$' + (name || 'ngController') + 'Controller');\n}\n\nfunction jqLiteInheritedData(element, name, value) {\n  // if element is the document object work with the html element instead\n  // this makes $(document).scope() possible\n  if (element.nodeType === NODE_TYPE_DOCUMENT) {\n    element = element.documentElement;\n  }\n  var names = isArray(name) ? name : [name];\n\n  while (element) {\n    for (var i = 0, ii = names.length; i < ii; i++) {\n      if (isDefined(value = jqLite.data(element, names[i]))) return value;\n    }\n\n    // If dealing with a document fragment node with a host element, and no parent, use the host\n    // element as the parent. This enables directives within a Shadow DOM or polyfilled Shadow DOM\n    // to lookup parent controllers.\n    element = element.parentNode || (element.nodeType === NODE_TYPE_DOCUMENT_FRAGMENT && element.host);\n  }\n}\n\nfunction jqLiteEmpty(element) {\n  jqLiteDealoc(element, true);\n  while (element.firstChild) {\n    element.removeChild(element.firstChild);\n  }\n}\n\nfunction jqLiteRemove(element, keepData) {\n  if (!keepData) jqLiteDealoc(element);\n  var parent = element.parentNode;\n  if (parent) parent.removeChild(element);\n}\n\n\nfunction jqLiteDocumentLoaded(action, win) {\n  win = win || window;\n  if (win.document.readyState === 'complete') {\n    // Force the action to be run async for consistent behavior\n    // from the action's point of view\n    // i.e. it will definitely not be in a $apply\n    win.setTimeout(action);\n  } else {\n    // No need to unbind this handler as load is only ever called once\n    jqLite(win).on('load', action);\n  }\n}\n\nfunction jqLiteReady(fn) {\n  function trigger() {\n    window.document.removeEventListener('DOMContentLoaded', trigger);\n    window.removeEventListener('load', trigger);\n    fn();\n  }\n\n  // check if document is already loaded\n  if (window.document.readyState === 'complete') {\n    window.setTimeout(fn);\n  } else {\n    // We can not use jqLite since we are not done loading and jQuery could be loaded later.\n\n    // Works for modern browsers and IE9\n    window.document.addEventListener('DOMContentLoaded', trigger);\n\n    // Fallback to window.onload for others\n    window.addEventListener('load', trigger);\n  }\n}\n\n//////////////////////////////////////////\n// Functions which are declared directly.\n//////////////////////////////////////////\nvar JQLitePrototype = JQLite.prototype = {\n  ready: jqLiteReady,\n  toString: function() {\n    var value = [];\n    forEach(this, function(e) { value.push('' + e);});\n    return '[' + value.join(', ') + ']';\n  },\n\n  eq: function(index) {\n      return (index >= 0) ? jqLite(this[index]) : jqLite(this[this.length + index]);\n  },\n\n  length: 0,\n  push: push,\n  sort: [].sort,\n  splice: [].splice\n};\n\n//////////////////////////////////////////\n// Functions iterating getter/setters.\n// these functions return self on setter and\n// value on get.\n//////////////////////////////////////////\nvar BOOLEAN_ATTR = {};\nforEach('multiple,selected,checked,disabled,readOnly,required,open'.split(','), function(value) {\n  BOOLEAN_ATTR[lowercase(value)] = value;\n});\nvar BOOLEAN_ELEMENTS = {};\nforEach('input,select,option,textarea,button,form,details'.split(','), function(value) {\n  BOOLEAN_ELEMENTS[value] = true;\n});\nvar ALIASED_ATTR = {\n  'ngMinlength': 'minlength',\n  'ngMaxlength': 'maxlength',\n  'ngMin': 'min',\n  'ngMax': 'max',\n  'ngPattern': 'pattern',\n  'ngStep': 'step'\n};\n\nfunction getBooleanAttrName(element, name) {\n  // check dom last since we will most likely fail on name\n  var booleanAttr = BOOLEAN_ATTR[name.toLowerCase()];\n\n  // booleanAttr is here twice to minimize DOM access\n  return booleanAttr && BOOLEAN_ELEMENTS[nodeName_(element)] && booleanAttr;\n}\n\nfunction getAliasedAttrName(name) {\n  return ALIASED_ATTR[name];\n}\n\nforEach({\n  data: jqLiteData,\n  removeData: jqLiteRemoveData,\n  hasData: jqLiteHasData,\n  cleanData: function jqLiteCleanData(nodes) {\n    for (var i = 0, ii = nodes.length; i < ii; i++) {\n      jqLiteRemoveData(nodes[i]);\n    }\n  }\n}, function(fn, name) {\n  JQLite[name] = fn;\n});\n\nforEach({\n  data: jqLiteData,\n  inheritedData: jqLiteInheritedData,\n\n  scope: function(element) {\n    // Can't use jqLiteData here directly so we stay compatible with jQuery!\n    return jqLite.data(element, '$scope') || jqLiteInheritedData(element.parentNode || element, ['$isolateScope', '$scope']);\n  },\n\n  isolateScope: function(element) {\n    // Can't use jqLiteData here directly so we stay compatible with jQuery!\n    return jqLite.data(element, '$isolateScope') || jqLite.data(element, '$isolateScopeNoTemplate');\n  },\n\n  controller: jqLiteController,\n\n  injector: function(element) {\n    return jqLiteInheritedData(element, '$injector');\n  },\n\n  removeAttr: function(element, name) {\n    element.removeAttribute(name);\n  },\n\n  hasClass: jqLiteHasClass,\n\n  css: function(element, name, value) {\n    name = cssKebabToCamel(name);\n\n    if (isDefined(value)) {\n      element.style[name] = value;\n    } else {\n      return element.style[name];\n    }\n  },\n\n  attr: function(element, name, value) {\n    var ret;\n    var nodeType = element.nodeType;\n    if (nodeType === NODE_TYPE_TEXT || nodeType === NODE_TYPE_ATTRIBUTE || nodeType === NODE_TYPE_COMMENT ||\n      !element.getAttribute) {\n      return;\n    }\n\n    var lowercasedName = lowercase(name);\n    var isBooleanAttr = BOOLEAN_ATTR[lowercasedName];\n\n    if (isDefined(value)) {\n      // setter\n\n      if (value === null || (value === false && isBooleanAttr)) {\n        element.removeAttribute(name);\n      } else {\n        element.setAttribute(name, isBooleanAttr ? lowercasedName : value);\n      }\n    } else {\n      // getter\n\n      ret = element.getAttribute(name);\n\n      if (isBooleanAttr && ret !== null) {\n        ret = lowercasedName;\n      }\n      // Normalize non-existing attributes to undefined (as jQuery).\n      return ret === null ? undefined : ret;\n    }\n  },\n\n  prop: function(element, name, value) {\n    if (isDefined(value)) {\n      element[name] = value;\n    } else {\n      return element[name];\n    }\n  },\n\n  text: (function() {\n    getText.$dv = '';\n    return getText;\n\n    function getText(element, value) {\n      if (isUndefined(value)) {\n        var nodeType = element.nodeType;\n        return (nodeType === NODE_TYPE_ELEMENT || nodeType === NODE_TYPE_TEXT) ? element.textContent : '';\n      }\n      element.textContent = value;\n    }\n  })(),\n\n  val: function(element, value) {\n    if (isUndefined(value)) {\n      if (element.multiple && nodeName_(element) === 'select') {\n        var result = [];\n        forEach(element.options, function(option) {\n          if (option.selected) {\n            result.push(option.value || option.text);\n          }\n        });\n        return result;\n      }\n      return element.value;\n    }\n    element.value = value;\n  },\n\n  html: function(element, value) {\n    if (isUndefined(value)) {\n      return element.innerHTML;\n    }\n    jqLiteDealoc(element, true);\n    element.innerHTML = value;\n  },\n\n  empty: jqLiteEmpty\n}, function(fn, name) {\n  /**\n   * Properties: writes return selection, reads return first value\n   */\n  JQLite.prototype[name] = function(arg1, arg2) {\n    var i, key;\n    var nodeCount = this.length;\n\n    // jqLiteHasClass has only two arguments, but is a getter-only fn, so we need to special-case it\n    // in a way that survives minification.\n    // jqLiteEmpty takes no arguments but is a setter.\n    if (fn !== jqLiteEmpty &&\n        (isUndefined((fn.length === 2 && (fn !== jqLiteHasClass && fn !== jqLiteController)) ? arg1 : arg2))) {\n      if (isObject(arg1)) {\n\n        // we are a write, but the object properties are the key/values\n        for (i = 0; i < nodeCount; i++) {\n          if (fn === jqLiteData) {\n            // data() takes the whole object in jQuery\n            fn(this[i], arg1);\n          } else {\n            for (key in arg1) {\n              fn(this[i], key, arg1[key]);\n            }\n          }\n        }\n        // return self for chaining\n        return this;\n      } else {\n        // we are a read, so read the first child.\n        // TODO: do we still need this?\n        var value = fn.$dv;\n        // Only if we have $dv do we iterate over all, otherwise it is just the first element.\n        var jj = (isUndefined(value)) ? Math.min(nodeCount, 1) : nodeCount;\n        for (var j = 0; j < jj; j++) {\n          var nodeValue = fn(this[j], arg1, arg2);\n          value = value ? value + nodeValue : nodeValue;\n        }\n        return value;\n      }\n    } else {\n      // we are a write, so apply to all children\n      for (i = 0; i < nodeCount; i++) {\n        fn(this[i], arg1, arg2);\n      }\n      // return self for chaining\n      return this;\n    }\n  };\n});\n\nfunction createEventHandler(element, events) {\n  var eventHandler = function(event, type) {\n    // jQuery specific api\n    event.isDefaultPrevented = function() {\n      return event.defaultPrevented;\n    };\n\n    var eventFns = events[type || event.type];\n    var eventFnsLength = eventFns ? eventFns.length : 0;\n\n    if (!eventFnsLength) return;\n\n    if (isUndefined(event.immediatePropagationStopped)) {\n      var originalStopImmediatePropagation = event.stopImmediatePropagation;\n      event.stopImmediatePropagation = function() {\n        event.immediatePropagationStopped = true;\n\n        if (event.stopPropagation) {\n          event.stopPropagation();\n        }\n\n        if (originalStopImmediatePropagation) {\n          originalStopImmediatePropagation.call(event);\n        }\n      };\n    }\n\n    event.isImmediatePropagationStopped = function() {\n      return event.immediatePropagationStopped === true;\n    };\n\n    // Some events have special handlers that wrap the real handler\n    var handlerWrapper = eventFns.specialHandlerWrapper || defaultHandlerWrapper;\n\n    // Copy event handlers in case event handlers array is modified during execution.\n    if ((eventFnsLength > 1)) {\n      eventFns = shallowCopy(eventFns);\n    }\n\n    for (var i = 0; i < eventFnsLength; i++) {\n      if (!event.isImmediatePropagationStopped()) {\n        handlerWrapper(element, event, eventFns[i]);\n      }\n    }\n  };\n\n  // TODO: this is a hack for angularMocks/clearDataCache that makes it possible to deregister all\n  //       events on `element`\n  eventHandler.elem = element;\n  return eventHandler;\n}\n\nfunction defaultHandlerWrapper(element, event, handler) {\n  handler.call(element, event);\n}\n\nfunction specialMouseHandlerWrapper(target, event, handler) {\n  // Refer to jQuery's implementation of mouseenter & mouseleave\n  // Read about mouseenter and mouseleave:\n  // http://www.quirksmode.org/js/events_mouse.html#link8\n  var related = event.relatedTarget;\n  // For mousenter/leave call the handler if related is outside the target.\n  // NB: No relatedTarget if the mouse left/entered the browser window\n  if (!related || (related !== target && !jqLiteContains.call(target, related))) {\n    handler.call(target, event);\n  }\n}\n\n//////////////////////////////////////////\n// Functions iterating traversal.\n// These functions chain results into a single\n// selector.\n//////////////////////////////////////////\nforEach({\n  removeData: jqLiteRemoveData,\n\n  on: function jqLiteOn(element, type, fn, unsupported) {\n    if (isDefined(unsupported)) throw jqLiteMinErr('onargs', 'jqLite#on() does not support the `selector` or `eventData` parameters');\n\n    // Do not add event handlers to non-elements because they will not be cleaned up.\n    if (!jqLiteAcceptsData(element)) {\n      return;\n    }\n\n    var expandoStore = jqLiteExpandoStore(element, true);\n    var events = expandoStore.events;\n    var handle = expandoStore.handle;\n\n    if (!handle) {\n      handle = expandoStore.handle = createEventHandler(element, events);\n    }\n\n    // http://jsperf.com/string-indexof-vs-split\n    var types = type.indexOf(' ') >= 0 ? type.split(' ') : [type];\n    var i = types.length;\n\n    var addHandler = function(type, specialHandlerWrapper, noEventListener) {\n      var eventFns = events[type];\n\n      if (!eventFns) {\n        eventFns = events[type] = [];\n        eventFns.specialHandlerWrapper = specialHandlerWrapper;\n        if (type !== '$destroy' && !noEventListener) {\n          element.addEventListener(type, handle);\n        }\n      }\n\n      eventFns.push(fn);\n    };\n\n    while (i--) {\n      type = types[i];\n      if (MOUSE_EVENT_MAP[type]) {\n        addHandler(MOUSE_EVENT_MAP[type], specialMouseHandlerWrapper);\n        addHandler(type, undefined, true);\n      } else {\n        addHandler(type);\n      }\n    }\n  },\n\n  off: jqLiteOff,\n\n  one: function(element, type, fn) {\n    element = jqLite(element);\n\n    //add the listener twice so that when it is called\n    //you can remove the original function and still be\n    //able to call element.off(ev, fn) normally\n    element.on(type, function onFn() {\n      element.off(type, fn);\n      element.off(type, onFn);\n    });\n    element.on(type, fn);\n  },\n\n  replaceWith: function(element, replaceNode) {\n    var index, parent = element.parentNode;\n    jqLiteDealoc(element);\n    forEach(new JQLite(replaceNode), function(node) {\n      if (index) {\n        parent.insertBefore(node, index.nextSibling);\n      } else {\n        parent.replaceChild(node, element);\n      }\n      index = node;\n    });\n  },\n\n  children: function(element) {\n    var children = [];\n    forEach(element.childNodes, function(element) {\n      if (element.nodeType === NODE_TYPE_ELEMENT) {\n        children.push(element);\n      }\n    });\n    return children;\n  },\n\n  contents: function(element) {\n    return element.contentDocument || element.childNodes || [];\n  },\n\n  append: function(element, node) {\n    var nodeType = element.nodeType;\n    if (nodeType !== NODE_TYPE_ELEMENT && nodeType !== NODE_TYPE_DOCUMENT_FRAGMENT) return;\n\n    node = new JQLite(node);\n\n    for (var i = 0, ii = node.length; i < ii; i++) {\n      var child = node[i];\n      element.appendChild(child);\n    }\n  },\n\n  prepend: function(element, node) {\n    if (element.nodeType === NODE_TYPE_ELEMENT) {\n      var index = element.firstChild;\n      forEach(new JQLite(node), function(child) {\n        element.insertBefore(child, index);\n      });\n    }\n  },\n\n  wrap: function(element, wrapNode) {\n    jqLiteWrapNode(element, jqLite(wrapNode).eq(0).clone()[0]);\n  },\n\n  remove: jqLiteRemove,\n\n  detach: function(element) {\n    jqLiteRemove(element, true);\n  },\n\n  after: function(element, newElement) {\n    var index = element, parent = element.parentNode;\n\n    if (parent) {\n      newElement = new JQLite(newElement);\n\n      for (var i = 0, ii = newElement.length; i < ii; i++) {\n        var node = newElement[i];\n        parent.insertBefore(node, index.nextSibling);\n        index = node;\n      }\n    }\n  },\n\n  addClass: jqLiteAddClass,\n  removeClass: jqLiteRemoveClass,\n\n  toggleClass: function(element, selector, condition) {\n    if (selector) {\n      forEach(selector.split(' '), function(className) {\n        var classCondition = condition;\n        if (isUndefined(classCondition)) {\n          classCondition = !jqLiteHasClass(element, className);\n        }\n        (classCondition ? jqLiteAddClass : jqLiteRemoveClass)(element, className);\n      });\n    }\n  },\n\n  parent: function(element) {\n    var parent = element.parentNode;\n    return parent && parent.nodeType !== NODE_TYPE_DOCUMENT_FRAGMENT ? parent : null;\n  },\n\n  next: function(element) {\n    return element.nextElementSibling;\n  },\n\n  find: function(element, selector) {\n    if (element.getElementsByTagName) {\n      return element.getElementsByTagName(selector);\n    } else {\n      return [];\n    }\n  },\n\n  clone: jqLiteClone,\n\n  triggerHandler: function(element, event, extraParameters) {\n\n    var dummyEvent, eventFnsCopy, handlerArgs;\n    var eventName = event.type || event;\n    var expandoStore = jqLiteExpandoStore(element);\n    var events = expandoStore && expandoStore.events;\n    var eventFns = events && events[eventName];\n\n    if (eventFns) {\n      // Create a dummy event to pass to the handlers\n      dummyEvent = {\n        preventDefault: function() { this.defaultPrevented = true; },\n        isDefaultPrevented: function() { return this.defaultPrevented === true; },\n        stopImmediatePropagation: function() { this.immediatePropagationStopped = true; },\n        isImmediatePropagationStopped: function() { return this.immediatePropagationStopped === true; },\n        stopPropagation: noop,\n        type: eventName,\n        target: element\n      };\n\n      // If a custom event was provided then extend our dummy event with it\n      if (event.type) {\n        dummyEvent = extend(dummyEvent, event);\n      }\n\n      // Copy event handlers in case event handlers array is modified during execution.\n      eventFnsCopy = shallowCopy(eventFns);\n      handlerArgs = extraParameters ? [dummyEvent].concat(extraParameters) : [dummyEvent];\n\n      forEach(eventFnsCopy, function(fn) {\n        if (!dummyEvent.isImmediatePropagationStopped()) {\n          fn.apply(element, handlerArgs);\n        }\n      });\n    }\n  }\n}, function(fn, name) {\n  /**\n   * chaining functions\n   */\n  JQLite.prototype[name] = function(arg1, arg2, arg3) {\n    var value;\n\n    for (var i = 0, ii = this.length; i < ii; i++) {\n      if (isUndefined(value)) {\n        value = fn(this[i], arg1, arg2, arg3);\n        if (isDefined(value)) {\n          // any function which returns a value needs to be wrapped\n          value = jqLite(value);\n        }\n      } else {\n        jqLiteAddNodes(value, fn(this[i], arg1, arg2, arg3));\n      }\n    }\n    return isDefined(value) ? value : this;\n  };\n});\n\n// bind legacy bind/unbind to on/off\nJQLite.prototype.bind = JQLite.prototype.on;\nJQLite.prototype.unbind = JQLite.prototype.off;\n\n\n// Provider for private $$jqLite service\n/** @this */\nfunction $$jqLiteProvider() {\n  this.$get = function $$jqLite() {\n    return extend(JQLite, {\n      hasClass: function(node, classes) {\n        if (node.attr) node = node[0];\n        return jqLiteHasClass(node, classes);\n      },\n      addClass: function(node, classes) {\n        if (node.attr) node = node[0];\n        return jqLiteAddClass(node, classes);\n      },\n      removeClass: function(node, classes) {\n        if (node.attr) node = node[0];\n        return jqLiteRemoveClass(node, classes);\n      }\n    });\n  };\n}\n\n/**\n * Computes a hash of an 'obj'.\n * Hash of a:\n *  string is string\n *  number is number as string\n *  object is either result of calling $$hashKey function on the object or uniquely generated id,\n *         that is also assigned to the $$hashKey property of the object.\n *\n * @param obj\n * @returns {string} hash string such that the same input will have the same hash string.\n *         The resulting string key is in 'type:hashKey' format.\n */\nfunction hashKey(obj, nextUidFn) {\n  var key = obj && obj.$$hashKey;\n\n  if (key) {\n    if (typeof key === 'function') {\n      key = obj.$$hashKey();\n    }\n    return key;\n  }\n\n  var objType = typeof obj;\n  if (objType === 'function' || (objType === 'object' && obj !== null)) {\n    key = obj.$$hashKey = objType + ':' + (nextUidFn || nextUid)();\n  } else {\n    key = objType + ':' + obj;\n  }\n\n  return key;\n}\n\n// A minimal ES2015 Map implementation.\n// Should be bug/feature equivalent to the native implementations of supported browsers\n// (for the features required in Angular).\n// See https://kangax.github.io/compat-table/es6/#test-Map\nvar nanKey = Object.create(null);\nfunction NgMapShim() {\n  this._keys = [];\n  this._values = [];\n  this._lastKey = NaN;\n  this._lastIndex = -1;\n}\nNgMapShim.prototype = {\n  _idx: function(key) {\n    if (key === this._lastKey) {\n      return this._lastIndex;\n    }\n    this._lastKey = key;\n    this._lastIndex = this._keys.indexOf(key);\n    return this._lastIndex;\n  },\n  _transformKey: function(key) {\n    return isNumberNaN(key) ? nanKey : key;\n  },\n  get: function(key) {\n    key = this._transformKey(key);\n    var idx = this._idx(key);\n    if (idx !== -1) {\n      return this._values[idx];\n    }\n  },\n  set: function(key, value) {\n    key = this._transformKey(key);\n    var idx = this._idx(key);\n    if (idx === -1) {\n      idx = this._lastIndex = this._keys.length;\n    }\n    this._keys[idx] = key;\n    this._values[idx] = value;\n\n    // Support: IE11\n    // Do not `return this` to simulate the partial IE11 implementation\n  },\n  delete: function(key) {\n    key = this._transformKey(key);\n    var idx = this._idx(key);\n    if (idx === -1) {\n      return false;\n    }\n    this._keys.splice(idx, 1);\n    this._values.splice(idx, 1);\n    this._lastKey = NaN;\n    this._lastIndex = -1;\n    return true;\n  }\n};\n\n// For now, always use `NgMapShim`, even if `window.Map` is available. Some native implementations\n// are still buggy (often in subtle ways) and can cause hard-to-debug failures. When native `Map`\n// implementations get more stable, we can reconsider switching to `window.Map` (when available).\nvar NgMap = NgMapShim;\n\nvar $$MapProvider = [/** @this */function() {\n  this.$get = [function() {\n    return NgMap;\n  }];\n}];\n\n/**\n * @ngdoc function\n * @module ng\n * @name angular.injector\n * @kind function\n *\n * @description\n * Creates an injector object that can be used for retrieving services as well as for\n * dependency injection (see {@link guide/di dependency injection}).\n *\n * @param {Array.<string|Function>} modules A list of module functions or their aliases. See\n *     {@link angular.module}. The `ng` module must be explicitly added.\n * @param {boolean=} [strictDi=false] Whether the injector should be in strict mode, which\n *     disallows argument name annotation inference.\n * @returns {injector} Injector object. See {@link auto.$injector $injector}.\n *\n * @example\n * Typical usage\n * ```js\n *   // create an injector\n *   var $injector = angular.injector(['ng']);\n *\n *   // use the injector to kick off your application\n *   // use the type inference to auto inject arguments, or use implicit injection\n *   $injector.invoke(function($rootScope, $compile, $document) {\n *     $compile($document)($rootScope);\n *     $rootScope.$digest();\n *   });\n * ```\n *\n * Sometimes you want to get access to the injector of a currently running Angular app\n * from outside Angular. Perhaps, you want to inject and compile some markup after the\n * application has been bootstrapped. You can do this using the extra `injector()` added\n * to JQuery/jqLite elements. See {@link angular.element}.\n *\n * *This is fairly rare but could be the case if a third party library is injecting the\n * markup.*\n *\n * In the following example a new block of HTML containing a `ng-controller`\n * directive is added to the end of the document body by JQuery. We then compile and link\n * it into the current AngularJS scope.\n *\n * ```js\n * var $div = $('<div ng-controller=\"MyCtrl\">{{content.label}}</div>');\n * $(document.body).append($div);\n *\n * angular.element(document).injector().invoke(function($compile) {\n *   var scope = angular.element($div).scope();\n *   $compile($div)(scope);\n * });\n * ```\n */\n\n\n/**\n * @ngdoc module\n * @name auto\n * @installation\n * @description\n *\n * Implicit module which gets automatically added to each {@link auto.$injector $injector}.\n */\n\nvar ARROW_ARG = /^([^(]+?)=>/;\nvar FN_ARGS = /^[^(]*\\(\\s*([^)]*)\\)/m;\nvar FN_ARG_SPLIT = /,/;\nvar FN_ARG = /^\\s*(_?)(\\S+?)\\1\\s*$/;\nvar STRIP_COMMENTS = /((\\/\\/.*$)|(\\/\\*[\\s\\S]*?\\*\\/))/mg;\nvar $injectorMinErr = minErr('$injector');\n\nfunction stringifyFn(fn) {\n  return Function.prototype.toString.call(fn);\n}\n\nfunction extractArgs(fn) {\n  var fnText = stringifyFn(fn).replace(STRIP_COMMENTS, ''),\n      args = fnText.match(ARROW_ARG) || fnText.match(FN_ARGS);\n  return args;\n}\n\nfunction anonFn(fn) {\n  // For anonymous functions, showing at the very least the function signature can help in\n  // debugging.\n  var args = extractArgs(fn);\n  if (args) {\n    return 'function(' + (args[1] || '').replace(/[\\s\\r\\n]+/, ' ') + ')';\n  }\n  return 'fn';\n}\n\nfunction annotate(fn, strictDi, name) {\n  var $inject,\n      argDecl,\n      last;\n\n  if (typeof fn === 'function') {\n    if (!($inject = fn.$inject)) {\n      $inject = [];\n      if (fn.length) {\n        if (strictDi) {\n          if (!isString(name) || !name) {\n            name = fn.name || anonFn(fn);\n          }\n          throw $injectorMinErr('strictdi',\n            '{0} is not using explicit annotation and cannot be invoked in strict mode', name);\n        }\n        argDecl = extractArgs(fn);\n        forEach(argDecl[1].split(FN_ARG_SPLIT), function(arg) {\n          arg.replace(FN_ARG, function(all, underscore, name) {\n            $inject.push(name);\n          });\n        });\n      }\n      fn.$inject = $inject;\n    }\n  } else if (isArray(fn)) {\n    last = fn.length - 1;\n    assertArgFn(fn[last], 'fn');\n    $inject = fn.slice(0, last);\n  } else {\n    assertArgFn(fn, 'fn', true);\n  }\n  return $inject;\n}\n\n///////////////////////////////////////\n\n/**\n * @ngdoc service\n * @name $injector\n *\n * @description\n *\n * `$injector` is used to retrieve object instances as defined by\n * {@link auto.$provide provider}, instantiate types, invoke methods,\n * and load modules.\n *\n * The following always holds true:\n *\n * ```js\n *   var $injector = angular.injector();\n *   expect($injector.get('$injector')).toBe($injector);\n *   expect($injector.invoke(function($injector) {\n *     return $injector;\n *   })).toBe($injector);\n * ```\n *\n * # Injection Function Annotation\n *\n * JavaScript does not have annotations, and annotations are needed for dependency injection. The\n * following are all valid ways of annotating function with injection arguments and are equivalent.\n *\n * ```js\n *   // inferred (only works if code not minified/obfuscated)\n *   $injector.invoke(function(serviceA){});\n *\n *   // annotated\n *   function explicit(serviceA) {};\n *   explicit.$inject = ['serviceA'];\n *   $injector.invoke(explicit);\n *\n *   // inline\n *   $injector.invoke(['serviceA', function(serviceA){}]);\n * ```\n *\n * ## Inference\n *\n * In JavaScript calling `toString()` on a function returns the function definition. The definition\n * can then be parsed and the function arguments can be extracted. This method of discovering\n * annotations is disallowed when the injector is in strict mode.\n * *NOTE:* This does not work with minification, and obfuscation tools since these tools change the\n * argument names.\n *\n * ## `$inject` Annotation\n * By adding an `$inject` property onto a function the injection parameters can be specified.\n *\n * ## Inline\n * As an array of injection names, where the last item in the array is the function to call.\n */\n\n/**\n * @ngdoc property\n * @name $injector#modules\n * @type {Object}\n * @description\n * A hash containing all the modules that have been loaded into the\n * $injector.\n *\n * You can use this property to find out information about a module via the\n * {@link angular.Module#info `myModule.info(...)`} method.\n *\n * For example:\n *\n * ```\n * var info = $injector.modules['ngAnimate'].info();\n * ```\n *\n * **Do not use this property to attempt to modify the modules after the application\n * has been bootstrapped.**\n */\n\n\n/**\n * @ngdoc method\n * @name $injector#get\n *\n * @description\n * Return an instance of the service.\n *\n * @param {string} name The name of the instance to retrieve.\n * @param {string=} caller An optional string to provide the origin of the function call for error messages.\n * @return {*} The instance.\n */\n\n/**\n * @ngdoc method\n * @name $injector#invoke\n *\n * @description\n * Invoke the method and supply the method arguments from the `$injector`.\n *\n * @param {Function|Array.<string|Function>} fn The injectable function to invoke. Function parameters are\n *   injected according to the {@link guide/di $inject Annotation} rules.\n * @param {Object=} self The `this` for the invoked method.\n * @param {Object=} locals Optional object. If preset then any argument names are read from this\n *                         object first, before the `$injector` is consulted.\n * @returns {*} the value returned by the invoked `fn` function.\n */\n\n/**\n * @ngdoc method\n * @name $injector#has\n *\n * @description\n * Allows the user to query if the particular service exists.\n *\n * @param {string} name Name of the service to query.\n * @returns {boolean} `true` if injector has given service.\n */\n\n/**\n * @ngdoc method\n * @name $injector#instantiate\n * @description\n * Create a new instance of JS type. The method takes a constructor function, invokes the new\n * operator, and supplies all of the arguments to the constructor function as specified by the\n * constructor annotation.\n *\n * @param {Function} Type Annotated constructor function.\n * @param {Object=} locals Optional object. If preset then any argument names are read from this\n * object first, before the `$injector` is consulted.\n * @returns {Object} new instance of `Type`.\n */\n\n/**\n * @ngdoc method\n * @name $injector#annotate\n *\n * @description\n * Returns an array of service names which the function is requesting for injection. This API is\n * used by the injector to determine which services need to be injected into the function when the\n * function is invoked. There are three ways in which the function can be annotated with the needed\n * dependencies.\n *\n * # Argument names\n *\n * The simplest form is to extract the dependencies from the arguments of the function. This is done\n * by converting the function into a string using `toString()` method and extracting the argument\n * names.\n * ```js\n *   // Given\n *   function MyController($scope, $route) {\n *     // ...\n *   }\n *\n *   // Then\n *   expect(injector.annotate(MyController)).toEqual(['$scope', '$route']);\n * ```\n *\n * You can disallow this method by using strict injection mode.\n *\n * This method does not work with code minification / obfuscation. For this reason the following\n * annotation strategies are supported.\n *\n * # The `$inject` property\n *\n * If a function has an `$inject` property and its value is an array of strings, then the strings\n * represent names of services to be injected into the function.\n * ```js\n *   // Given\n *   var MyController = function(obfuscatedScope, obfuscatedRoute) {\n *     // ...\n *   }\n *   // Define function dependencies\n *   MyController['$inject'] = ['$scope', '$route'];\n *\n *   // Then\n *   expect(injector.annotate(MyController)).toEqual(['$scope', '$route']);\n * ```\n *\n * # The array notation\n *\n * It is often desirable to inline Injected functions and that's when setting the `$inject` property\n * is very inconvenient. In these situations using the array notation to specify the dependencies in\n * a way that survives minification is a better choice:\n *\n * ```js\n *   // We wish to write this (not minification / obfuscation safe)\n *   injector.invoke(function($compile, $rootScope) {\n *     // ...\n *   });\n *\n *   // We are forced to write break inlining\n *   var tmpFn = function(obfuscatedCompile, obfuscatedRootScope) {\n *     // ...\n *   };\n *   tmpFn.$inject = ['$compile', '$rootScope'];\n *   injector.invoke(tmpFn);\n *\n *   // To better support inline function the inline annotation is supported\n *   injector.invoke(['$compile', '$rootScope', function(obfCompile, obfRootScope) {\n *     // ...\n *   }]);\n *\n *   // Therefore\n *   expect(injector.annotate(\n *      ['$compile', '$rootScope', function(obfus_$compile, obfus_$rootScope) {}])\n *    ).toEqual(['$compile', '$rootScope']);\n * ```\n *\n * @param {Function|Array.<string|Function>} fn Function for which dependent service names need to\n * be retrieved as described above.\n *\n * @param {boolean=} [strictDi=false] Disallow argument name annotation inference.\n *\n * @returns {Array.<string>} The names of the services which the function requires.\n */\n\n\n\n/**\n * @ngdoc service\n * @name $provide\n *\n * @description\n *\n * The {@link auto.$provide $provide} service has a number of methods for registering components\n * with the {@link auto.$injector $injector}. Many of these functions are also exposed on\n * {@link angular.Module}.\n *\n * An Angular **service** is a singleton object created by a **service factory**.  These **service\n * factories** are functions which, in turn, are created by a **service provider**.\n * The **service providers** are constructor functions. When instantiated they must contain a\n * property called `$get`, which holds the **service factory** function.\n *\n * When you request a service, the {@link auto.$injector $injector} is responsible for finding the\n * correct **service provider**, instantiating it and then calling its `$get` **service factory**\n * function to get the instance of the **service**.\n *\n * Often services have no configuration options and there is no need to add methods to the service\n * provider.  The provider will be no more than a constructor function with a `$get` property. For\n * these cases the {@link auto.$provide $provide} service has additional helper methods to register\n * services without specifying a provider.\n *\n * * {@link auto.$provide#provider provider(name, provider)} - registers a **service provider** with the\n *     {@link auto.$injector $injector}\n * * {@link auto.$provide#constant constant(name, obj)} - registers a value/object that can be accessed by\n *     providers and services.\n * * {@link auto.$provide#value value(name, obj)} - registers a value/object that can only be accessed by\n *     services, not providers.\n * * {@link auto.$provide#factory factory(name, fn)} - registers a service **factory function**\n *     that will be wrapped in a **service provider** object, whose `$get` property will contain the\n *     given factory function.\n * * {@link auto.$provide#service service(name, Fn)} - registers a **constructor function**\n *     that will be wrapped in a **service provider** object, whose `$get` property will instantiate\n *      a new object using the given constructor function.\n * * {@link auto.$provide#decorator decorator(name, decorFn)} - registers a **decorator function** that\n *      will be able to modify or replace the implementation of another service.\n *\n * See the individual methods for more information and examples.\n */\n\n/**\n * @ngdoc method\n * @name $provide#provider\n * @description\n *\n * Register a **provider function** with the {@link auto.$injector $injector}. Provider functions\n * are constructor functions, whose instances are responsible for \"providing\" a factory for a\n * service.\n *\n * Service provider names start with the name of the service they provide followed by `Provider`.\n * For example, the {@link ng.$log $log} service has a provider called\n * {@link ng.$logProvider $logProvider}.\n *\n * Service provider objects can have additional methods which allow configuration of the provider\n * and its service. Importantly, you can configure what kind of service is created by the `$get`\n * method, or how that service will act. For example, the {@link ng.$logProvider $logProvider} has a\n * method {@link ng.$logProvider#debugEnabled debugEnabled}\n * which lets you specify whether the {@link ng.$log $log} service will log debug messages to the\n * console or not.\n *\n * @param {string} name The name of the instance. NOTE: the provider will be available under `name +\n                        'Provider'` key.\n * @param {(Object|function())} provider If the provider is:\n *\n *   - `Object`: then it should have a `$get` method. The `$get` method will be invoked using\n *     {@link auto.$injector#invoke $injector.invoke()} when an instance needs to be created.\n *   - `Constructor`: a new instance of the provider will be created using\n *     {@link auto.$injector#instantiate $injector.instantiate()}, then treated as `object`.\n *\n * @returns {Object} registered provider instance\n\n * @example\n *\n * The following example shows how to create a simple event tracking service and register it using\n * {@link auto.$provide#provider $provide.provider()}.\n *\n * ```js\n *  // Define the eventTracker provider\n *  function EventTrackerProvider() {\n *    var trackingUrl = '/track';\n *\n *    // A provider method for configuring where the tracked events should been saved\n *    this.setTrackingUrl = function(url) {\n *      trackingUrl = url;\n *    };\n *\n *    // The service factory function\n *    this.$get = ['$http', function($http) {\n *      var trackedEvents = {};\n *      return {\n *        // Call this to track an event\n *        event: function(event) {\n *          var count = trackedEvents[event] || 0;\n *          count += 1;\n *          trackedEvents[event] = count;\n *          return count;\n *        },\n *        // Call this to save the tracked events to the trackingUrl\n *        save: function() {\n *          $http.post(trackingUrl, trackedEvents);\n *        }\n *      };\n *    }];\n *  }\n *\n *  describe('eventTracker', function() {\n *    var postSpy;\n *\n *    beforeEach(module(function($provide) {\n *      // Register the eventTracker provider\n *      $provide.provider('eventTracker', EventTrackerProvider);\n *    }));\n *\n *    beforeEach(module(function(eventTrackerProvider) {\n *      // Configure eventTracker provider\n *      eventTrackerProvider.setTrackingUrl('/custom-track');\n *    }));\n *\n *    it('tracks events', inject(function(eventTracker) {\n *      expect(eventTracker.event('login')).toEqual(1);\n *      expect(eventTracker.event('login')).toEqual(2);\n *    }));\n *\n *    it('saves to the tracking url', inject(function(eventTracker, $http) {\n *      postSpy = spyOn($http, 'post');\n *      eventTracker.event('login');\n *      eventTracker.save();\n *      expect(postSpy).toHaveBeenCalled();\n *      expect(postSpy.mostRecentCall.args[0]).not.toEqual('/track');\n *      expect(postSpy.mostRecentCall.args[0]).toEqual('/custom-track');\n *      expect(postSpy.mostRecentCall.args[1]).toEqual({ 'login': 1 });\n *    }));\n *  });\n * ```\n */\n\n/**\n * @ngdoc method\n * @name $provide#factory\n * @description\n *\n * Register a **service factory**, which will be called to return the service instance.\n * This is short for registering a service where its provider consists of only a `$get` property,\n * which is the given service factory function.\n * You should use {@link auto.$provide#factory $provide.factory(getFn)} if you do not need to\n * configure your service in a provider.\n *\n * @param {string} name The name of the instance.\n * @param {Function|Array.<string|Function>} $getFn The injectable $getFn for the instance creation.\n *                      Internally this is a short hand for `$provide.provider(name, {$get: $getFn})`.\n * @returns {Object} registered provider instance\n *\n * @example\n * Here is an example of registering a service\n * ```js\n *   $provide.factory('ping', ['$http', function($http) {\n *     return function ping() {\n *       return $http.send('/ping');\n *     };\n *   }]);\n * ```\n * You would then inject and use this service like this:\n * ```js\n *   someModule.controller('Ctrl', ['ping', function(ping) {\n *     ping();\n *   }]);\n * ```\n */\n\n\n/**\n * @ngdoc method\n * @name $provide#service\n * @description\n *\n * Register a **service constructor**, which will be invoked with `new` to create the service\n * instance.\n * This is short for registering a service where its provider's `$get` property is a factory\n * function that returns an instance instantiated by the injector from the service constructor\n * function.\n *\n * Internally it looks a bit like this:\n *\n * ```\n * {\n *   $get: function() {\n *     return $injector.instantiate(constructor);\n *   }\n * }\n * ```\n *\n *\n * You should use {@link auto.$provide#service $provide.service(class)} if you define your service\n * as a type/class.\n *\n * @param {string} name The name of the instance.\n * @param {Function|Array.<string|Function>} constructor An injectable class (constructor function)\n *     that will be instantiated.\n * @returns {Object} registered provider instance\n *\n * @example\n * Here is an example of registering a service using\n * {@link auto.$provide#service $provide.service(class)}.\n * ```js\n *   var Ping = function($http) {\n *     this.$http = $http;\n *   };\n *\n *   Ping.$inject = ['$http'];\n *\n *   Ping.prototype.send = function() {\n *     return this.$http.get('/ping');\n *   };\n *   $provide.service('ping', Ping);\n * ```\n * You would then inject and use this service like this:\n * ```js\n *   someModule.controller('Ctrl', ['ping', function(ping) {\n *     ping.send();\n *   }]);\n * ```\n */\n\n\n/**\n * @ngdoc method\n * @name $provide#value\n * @description\n *\n * Register a **value service** with the {@link auto.$injector $injector}, such as a string, a\n * number, an array, an object or a function. This is short for registering a service where its\n * provider's `$get` property is a factory function that takes no arguments and returns the **value\n * service**. That also means it is not possible to inject other services into a value service.\n *\n * Value services are similar to constant services, except that they cannot be injected into a\n * module configuration function (see {@link angular.Module#config}) but they can be overridden by\n * an Angular {@link auto.$provide#decorator decorator}.\n *\n * @param {string} name The name of the instance.\n * @param {*} value The value.\n * @returns {Object} registered provider instance\n *\n * @example\n * Here are some examples of creating value services.\n * ```js\n *   $provide.value('ADMIN_USER', 'admin');\n *\n *   $provide.value('RoleLookup', { admin: 0, writer: 1, reader: 2 });\n *\n *   $provide.value('halfOf', function(value) {\n *     return value / 2;\n *   });\n * ```\n */\n\n\n/**\n * @ngdoc method\n * @name $provide#constant\n * @description\n *\n * Register a **constant service** with the {@link auto.$injector $injector}, such as a string,\n * a number, an array, an object or a function. Like the {@link auto.$provide#value value}, it is not\n * possible to inject other services into a constant.\n *\n * But unlike {@link auto.$provide#value value}, a constant can be\n * injected into a module configuration function (see {@link angular.Module#config}) and it cannot\n * be overridden by an Angular {@link auto.$provide#decorator decorator}.\n *\n * @param {string} name The name of the constant.\n * @param {*} value The constant value.\n * @returns {Object} registered instance\n *\n * @example\n * Here a some examples of creating constants:\n * ```js\n *   $provide.constant('SHARD_HEIGHT', 306);\n *\n *   $provide.constant('MY_COLOURS', ['red', 'blue', 'grey']);\n *\n *   $provide.constant('double', function(value) {\n *     return value * 2;\n *   });\n * ```\n */\n\n\n/**\n * @ngdoc method\n * @name $provide#decorator\n * @description\n *\n * Register a **decorator function** with the {@link auto.$injector $injector}. A decorator function\n * intercepts the creation of a service, allowing it to override or modify the behavior of the\n * service. The return value of the decorator function may be the original service, or a new service\n * that replaces (or wraps and delegates to) the original service.\n *\n * You can find out more about using decorators in the {@link guide/decorators} guide.\n *\n * @param {string} name The name of the service to decorate.\n * @param {Function|Array.<string|Function>} decorator This function will be invoked when the service needs to be\n *    provided and should return the decorated service instance. The function is called using\n *    the {@link auto.$injector#invoke injector.invoke} method and is therefore fully injectable.\n *    Local injection arguments:\n *\n *    * `$delegate` - The original service instance, which can be replaced, monkey patched, configured,\n *      decorated or delegated to.\n *\n * @example\n * Here we decorate the {@link ng.$log $log} service to convert warnings to errors by intercepting\n * calls to {@link ng.$log#error $log.warn()}.\n * ```js\n *   $provide.decorator('$log', ['$delegate', function($delegate) {\n *     $delegate.warn = $delegate.error;\n *     return $delegate;\n *   }]);\n * ```\n */\n\n\nfunction createInjector(modulesToLoad, strictDi) {\n  strictDi = (strictDi === true);\n  var INSTANTIATING = {},\n      providerSuffix = 'Provider',\n      path = [],\n      loadedModules = new NgMap(),\n      providerCache = {\n        $provide: {\n            provider: supportObject(provider),\n            factory: supportObject(factory),\n            service: supportObject(service),\n            value: supportObject(value),\n            constant: supportObject(constant),\n            decorator: decorator\n          }\n      },\n      providerInjector = (providerCache.$injector =\n          createInternalInjector(providerCache, function(serviceName, caller) {\n            if (angular.isString(caller)) {\n              path.push(caller);\n            }\n            throw $injectorMinErr('unpr', 'Unknown provider: {0}', path.join(' <- '));\n          })),\n      instanceCache = {},\n      protoInstanceInjector =\n          createInternalInjector(instanceCache, function(serviceName, caller) {\n            var provider = providerInjector.get(serviceName + providerSuffix, caller);\n            return instanceInjector.invoke(\n                provider.$get, provider, undefined, serviceName);\n          }),\n      instanceInjector = protoInstanceInjector;\n\n  providerCache['$injector' + providerSuffix] = { $get: valueFn(protoInstanceInjector) };\n  instanceInjector.modules = providerInjector.modules = createMap();\n  var runBlocks = loadModules(modulesToLoad);\n  instanceInjector = protoInstanceInjector.get('$injector');\n  instanceInjector.strictDi = strictDi;\n  forEach(runBlocks, function(fn) { if (fn) instanceInjector.invoke(fn); });\n\n  return instanceInjector;\n\n  ////////////////////////////////////\n  // $provider\n  ////////////////////////////////////\n\n  function supportObject(delegate) {\n    return function(key, value) {\n      if (isObject(key)) {\n        forEach(key, reverseParams(delegate));\n      } else {\n        return delegate(key, value);\n      }\n    };\n  }\n\n  function provider(name, provider_) {\n    assertNotHasOwnProperty(name, 'service');\n    if (isFunction(provider_) || isArray(provider_)) {\n      provider_ = providerInjector.instantiate(provider_);\n    }\n    if (!provider_.$get) {\n      throw $injectorMinErr('pget', 'Provider \\'{0}\\' must define $get factory method.', name);\n    }\n    return (providerCache[name + providerSuffix] = provider_);\n  }\n\n  function enforceReturnValue(name, factory) {\n    return /** @this */ function enforcedReturnValue() {\n      var result = instanceInjector.invoke(factory, this);\n      if (isUndefined(result)) {\n        throw $injectorMinErr('undef', 'Provider \\'{0}\\' must return a value from $get factory method.', name);\n      }\n      return result;\n    };\n  }\n\n  function factory(name, factoryFn, enforce) {\n    return provider(name, {\n      $get: enforce !== false ? enforceReturnValue(name, factoryFn) : factoryFn\n    });\n  }\n\n  function service(name, constructor) {\n    return factory(name, ['$injector', function($injector) {\n      return $injector.instantiate(constructor);\n    }]);\n  }\n\n  function value(name, val) { return factory(name, valueFn(val), false); }\n\n  function constant(name, value) {\n    assertNotHasOwnProperty(name, 'constant');\n    providerCache[name] = value;\n    instanceCache[name] = value;\n  }\n\n  function decorator(serviceName, decorFn) {\n    var origProvider = providerInjector.get(serviceName + providerSuffix),\n        orig$get = origProvider.$get;\n\n    origProvider.$get = function() {\n      var origInstance = instanceInjector.invoke(orig$get, origProvider);\n      return instanceInjector.invoke(decorFn, null, {$delegate: origInstance});\n    };\n  }\n\n  ////////////////////////////////////\n  // Module Loading\n  ////////////////////////////////////\n  function loadModules(modulesToLoad) {\n    assertArg(isUndefined(modulesToLoad) || isArray(modulesToLoad), 'modulesToLoad', 'not an array');\n    var runBlocks = [], moduleFn;\n    forEach(modulesToLoad, function(module) {\n      if (loadedModules.get(module)) return;\n      loadedModules.set(module, true);\n\n      function runInvokeQueue(queue) {\n        var i, ii;\n        for (i = 0, ii = queue.length; i < ii; i++) {\n          var invokeArgs = queue[i],\n              provider = providerInjector.get(invokeArgs[0]);\n\n          provider[invokeArgs[1]].apply(provider, invokeArgs[2]);\n        }\n      }\n\n      try {\n        if (isString(module)) {\n          moduleFn = angularModule(module);\n          instanceInjector.modules[module] = moduleFn;\n          runBlocks = runBlocks.concat(loadModules(moduleFn.requires)).concat(moduleFn._runBlocks);\n          runInvokeQueue(moduleFn._invokeQueue);\n          runInvokeQueue(moduleFn._configBlocks);\n        } else if (isFunction(module)) {\n            runBlocks.push(providerInjector.invoke(module));\n        } else if (isArray(module)) {\n            runBlocks.push(providerInjector.invoke(module));\n        } else {\n          assertArgFn(module, 'module');\n        }\n      } catch (e) {\n        if (isArray(module)) {\n          module = module[module.length - 1];\n        }\n        if (e.message && e.stack && e.stack.indexOf(e.message) === -1) {\n          // Safari & FF's stack traces don't contain error.message content\n          // unlike those of Chrome and IE\n          // So if stack doesn't contain message, we create a new string that contains both.\n          // Since error.stack is read-only in Safari, I'm overriding e and not e.stack here.\n          // eslint-disable-next-line no-ex-assign\n          e = e.message + '\\n' + e.stack;\n        }\n        throw $injectorMinErr('modulerr', 'Failed to instantiate module {0} due to:\\n{1}',\n                  module, e.stack || e.message || e);\n      }\n    });\n    return runBlocks;\n  }\n\n  ////////////////////////////////////\n  // internal Injector\n  ////////////////////////////////////\n\n  function createInternalInjector(cache, factory) {\n\n    function getService(serviceName, caller) {\n      if (cache.hasOwnProperty(serviceName)) {\n        if (cache[serviceName] === INSTANTIATING) {\n          throw $injectorMinErr('cdep', 'Circular dependency found: {0}',\n                    serviceName + ' <- ' + path.join(' <- '));\n        }\n        return cache[serviceName];\n      } else {\n        try {\n          path.unshift(serviceName);\n          cache[serviceName] = INSTANTIATING;\n          cache[serviceName] = factory(serviceName, caller);\n          return cache[serviceName];\n        } catch (err) {\n          if (cache[serviceName] === INSTANTIATING) {\n            delete cache[serviceName];\n          }\n          throw err;\n        } finally {\n          path.shift();\n        }\n      }\n    }\n\n\n    function injectionArgs(fn, locals, serviceName) {\n      var args = [],\n          $inject = createInjector.$$annotate(fn, strictDi, serviceName);\n\n      for (var i = 0, length = $inject.length; i < length; i++) {\n        var key = $inject[i];\n        if (typeof key !== 'string') {\n          throw $injectorMinErr('itkn',\n                  'Incorrect injection token! Expected service name as string, got {0}', key);\n        }\n        args.push(locals && locals.hasOwnProperty(key) ? locals[key] :\n                                                         getService(key, serviceName));\n      }\n      return args;\n    }\n\n    function isClass(func) {\n      // Support: IE 9-11 only\n      // IE 9-11 do not support classes and IE9 leaks with the code below.\n      if (msie || typeof func !== 'function') {\n        return false;\n      }\n      var result = func.$$ngIsClass;\n      if (!isBoolean(result)) {\n        // Support: Edge 12-13 only\n        // See: https://developer.microsoft.com/en-us/microsoft-edge/platform/issues/6156135/\n        result = func.$$ngIsClass = /^(?:class\\b|constructor\\()/.test(stringifyFn(func));\n      }\n      return result;\n    }\n\n    function invoke(fn, self, locals, serviceName) {\n      if (typeof locals === 'string') {\n        serviceName = locals;\n        locals = null;\n      }\n\n      var args = injectionArgs(fn, locals, serviceName);\n      if (isArray(fn)) {\n        fn = fn[fn.length - 1];\n      }\n\n      if (!isClass(fn)) {\n        // http://jsperf.com/angularjs-invoke-apply-vs-switch\n        // #5388\n        return fn.apply(self, args);\n      } else {\n        args.unshift(null);\n        return new (Function.prototype.bind.apply(fn, args))();\n      }\n    }\n\n\n    function instantiate(Type, locals, serviceName) {\n      // Check if Type is annotated and use just the given function at n-1 as parameter\n      // e.g. someModule.factory('greeter', ['$window', function(renamed$window) {}]);\n      var ctor = (isArray(Type) ? Type[Type.length - 1] : Type);\n      var args = injectionArgs(Type, locals, serviceName);\n      // Empty object at position 0 is ignored for invocation with `new`, but required.\n      args.unshift(null);\n      return new (Function.prototype.bind.apply(ctor, args))();\n    }\n\n\n    return {\n      invoke: invoke,\n      instantiate: instantiate,\n      get: getService,\n      annotate: createInjector.$$annotate,\n      has: function(name) {\n        return providerCache.hasOwnProperty(name + providerSuffix) || cache.hasOwnProperty(name);\n      }\n    };\n  }\n}\n\ncreateInjector.$$annotate = annotate;\n\n/**\n * @ngdoc provider\n * @name $anchorScrollProvider\n * @this\n *\n * @description\n * Use `$anchorScrollProvider` to disable automatic scrolling whenever\n * {@link ng.$location#hash $location.hash()} changes.\n */\nfunction $AnchorScrollProvider() {\n\n  var autoScrollingEnabled = true;\n\n  /**\n   * @ngdoc method\n   * @name $anchorScrollProvider#disableAutoScrolling\n   *\n   * @description\n   * By default, {@link ng.$anchorScroll $anchorScroll()} will automatically detect changes to\n   * {@link ng.$location#hash $location.hash()} and scroll to the element matching the new hash.<br />\n   * Use this method to disable automatic scrolling.\n   *\n   * If automatic scrolling is disabled, one must explicitly call\n   * {@link ng.$anchorScroll $anchorScroll()} in order to scroll to the element related to the\n   * current hash.\n   */\n  this.disableAutoScrolling = function() {\n    autoScrollingEnabled = false;\n  };\n\n  /**\n   * @ngdoc service\n   * @name $anchorScroll\n   * @kind function\n   * @requires $window\n   * @requires $location\n   * @requires $rootScope\n   *\n   * @description\n   * When called, it scrolls to the element related to the specified `hash` or (if omitted) to the\n   * current value of {@link ng.$location#hash $location.hash()}, according to the rules specified\n   * in the\n   * [HTML5 spec](http://www.w3.org/html/wg/drafts/html/master/browsers.html#an-indicated-part-of-the-document).\n   *\n   * It also watches the {@link ng.$location#hash $location.hash()} and automatically scrolls to\n   * match any anchor whenever it changes. This can be disabled by calling\n   * {@link ng.$anchorScrollProvider#disableAutoScrolling $anchorScrollProvider.disableAutoScrolling()}.\n   *\n   * Additionally, you can use its {@link ng.$anchorScroll#yOffset yOffset} property to specify a\n   * vertical scroll-offset (either fixed or dynamic).\n   *\n   * @param {string=} hash The hash specifying the element to scroll to. If omitted, the value of\n   *                       {@link ng.$location#hash $location.hash()} will be used.\n   *\n   * @property {(number|function|jqLite)} yOffset\n   * If set, specifies a vertical scroll-offset. This is often useful when there are fixed\n   * positioned elements at the top of the page, such as navbars, headers etc.\n   *\n   * `yOffset` can be specified in various ways:\n   * - **number**: A fixed number of pixels to be used as offset.<br /><br />\n   * - **function**: A getter function called everytime `$anchorScroll()` is executed. Must return\n   *   a number representing the offset (in pixels).<br /><br />\n   * - **jqLite**: A jqLite/jQuery element to be used for specifying the offset. The distance from\n   *   the top of the page to the element's bottom will be used as offset.<br />\n   *   **Note**: The element will be taken into account only as long as its `position` is set to\n   *   `fixed`. This option is useful, when dealing with responsive navbars/headers that adjust\n   *   their height and/or positioning according to the viewport's size.\n   *\n   * <br />\n   * <div class=\"alert alert-warning\">\n   * In order for `yOffset` to work properly, scrolling should take place on the document's root and\n   * not some child element.\n   * </div>\n   *\n   * @example\n     <example module=\"anchorScrollExample\" name=\"anchor-scroll\">\n       <file name=\"index.ced81ed4.html\">\n         <div id=\"scrollArea\" ng-controller=\"ScrollController\">\n           <a ng-click=\"gotoBottom()\">Go to bottom</a>\n           <a id=\"bottom\"></a> You're at the bottom!\n         </div>\n       </file>\n       <file name=\"script.js\">\n         angular.module('anchorScrollExample', [])\n           .controller('ScrollController', ['$scope', '$location', '$anchorScroll',\n             function($scope, $location, $anchorScroll) {\n               $scope.gotoBottom = function() {\n                 // set the location.hash to the id of\n                 // the element you wish to scroll to.\n                 $location.hash('bottom');\n\n                 // call $anchorScroll()\n                 $anchorScroll();\n               };\n             }]);\n       </file>\n       <file name=\"style.css\">\n         #scrollArea {\n           height: 280px;\n           overflow: auto;\n         }\n\n         #bottom {\n           display: block;\n           margin-top: 2000px;\n         }\n       </file>\n     </example>\n   *\n   * <hr />\n   * The example below illustrates the use of a vertical scroll-offset (specified as a fixed value).\n   * See {@link ng.$anchorScroll#yOffset $anchorScroll.yOffset} for more details.\n   *\n   * @example\n     <example module=\"anchorScrollOffsetExample\" name=\"anchor-scroll-offset\">\n       <file name=\"index.ced81ed4.html\">\n         <div class=\"fixed-header\" ng-controller=\"headerCtrl\">\n           <a href=\"\" ng-click=\"gotoAnchor(x)\" ng-repeat=\"x in [1,2,3,4,5]\">\n             Go to anchor {{x}}\n           </a>\n         </div>\n         <div id=\"anchor{{x}}\" class=\"anchor\" ng-repeat=\"x in [1,2,3,4,5]\">\n           Anchor {{x}} of 5\n         </div>\n       </file>\n       <file name=\"script.js\">\n         angular.module('anchorScrollOffsetExample', [])\n           .run(['$anchorScroll', function($anchorScroll) {\n             $anchorScroll.yOffset = 50;   // always scroll by 50 extra pixels\n           }])\n           .controller('headerCtrl', ['$anchorScroll', '$location', '$scope',\n             function($anchorScroll, $location, $scope) {\n               $scope.gotoAnchor = function(x) {\n                 var newHash = 'anchor' + x;\n                 if ($location.hash() !== newHash) {\n                   // set the $location.hash to `newHash` and\n                   // $anchorScroll will automatically scroll to it\n                   $location.hash('anchor' + x);\n                 } else {\n                   // call $anchorScroll() explicitly,\n                   // since $location.hash hasn't changed\n                   $anchorScroll();\n                 }\n               };\n             }\n           ]);\n       </file>\n       <file name=\"style.css\">\n         body {\n           padding-top: 50px;\n         }\n\n         .anchor {\n           border: 2px dashed DarkOrchid;\n           padding: 10px 10px 200px 10px;\n         }\n\n         .fixed-header {\n           background-color: rgba(0, 0, 0, 0.2);\n           height: 50px;\n           position: fixed;\n           top: 0; left: 0; right: 0;\n         }\n\n         .fixed-header > a {\n           display: inline-block;\n           margin: 5px 15px;\n         }\n       </file>\n     </example>\n   */\n  this.$get = ['$window', '$location', '$rootScope', function($window, $location, $rootScope) {\n    var document = $window.document;\n\n    // Helper function to get first anchor from a NodeList\n    // (using `Array#some()` instead of `angular#forEach()` since it's more performant\n    //  and working in all supported browsers.)\n    function getFirstAnchor(list) {\n      var result = null;\n      Array.prototype.some.call(list, function(element) {\n        if (nodeName_(element) === 'a') {\n          result = element;\n          return true;\n        }\n      });\n      return result;\n    }\n\n    function getYOffset() {\n\n      var offset = scroll.yOffset;\n\n      if (isFunction(offset)) {\n        offset = offset();\n      } else if (isElement(offset)) {\n        var elem = offset[0];\n        var style = $window.getComputedStyle(elem);\n        if (style.position !== 'fixed') {\n          offset = 0;\n        } else {\n          offset = elem.getBoundingClientRect().bottom;\n        }\n      } else if (!isNumber(offset)) {\n        offset = 0;\n      }\n\n      return offset;\n    }\n\n    function scrollTo(elem) {\n      if (elem) {\n        elem.scrollIntoView();\n\n        var offset = getYOffset();\n\n        if (offset) {\n          // `offset` is the number of pixels we should scroll UP in order to align `elem` properly.\n          // This is true ONLY if the call to `elem.scrollIntoView()` initially aligns `elem` at the\n          // top of the viewport.\n          //\n          // IF the number of pixels from the top of `elem` to the end of the page's content is less\n          // than the height of the viewport, then `elem.scrollIntoView()` will align the `elem` some\n          // way down the page.\n          //\n          // This is often the case for elements near the bottom of the page.\n          //\n          // In such cases we do not need to scroll the whole `offset` up, just the difference between\n          // the top of the element and the offset, which is enough to align the top of `elem` at the\n          // desired position.\n          var elemTop = elem.getBoundingClientRect().top;\n          $window.scrollBy(0, elemTop - offset);\n        }\n      } else {\n        $window.scrollTo(0, 0);\n      }\n    }\n\n    function scroll(hash) {\n      // Allow numeric hashes\n      hash = isString(hash) ? hash : isNumber(hash) ? hash.toString() : $location.hash();\n      var elm;\n\n      // empty hash, scroll to the top of the page\n      if (!hash) scrollTo(null);\n\n      // element with given id\n      else if ((elm = document.getElementById(hash))) scrollTo(elm);\n\n      // first anchor with given name :-D\n      else if ((elm = getFirstAnchor(document.getElementsByName(hash)))) scrollTo(elm);\n\n      // no element and hash === 'top', scroll to the top of the page\n      else if (hash === 'top') scrollTo(null);\n    }\n\n    // does not scroll when user clicks on anchor link that is currently on\n    // (no url change, no $location.hash() change), browser native does scroll\n    if (autoScrollingEnabled) {\n      $rootScope.$watch(function autoScrollWatch() {return $location.hash();},\n        function autoScrollWatchAction(newVal, oldVal) {\n          // skip the initial scroll if $location.hash is empty\n          if (newVal === oldVal && newVal === '') return;\n\n          jqLiteDocumentLoaded(function() {\n            $rootScope.$evalAsync(scroll);\n          });\n        });\n    }\n\n    return scroll;\n  }];\n}\n\nvar $animateMinErr = minErr('$animate');\nvar ELEMENT_NODE = 1;\nvar NG_ANIMATE_CLASSNAME = 'ng-animate';\n\nfunction mergeClasses(a,b) {\n  if (!a && !b) return '';\n  if (!a) return b;\n  if (!b) return a;\n  if (isArray(a)) a = a.join(' ');\n  if (isArray(b)) b = b.join(' ');\n  return a + ' ' + b;\n}\n\nfunction extractElementNode(element) {\n  for (var i = 0; i < element.length; i++) {\n    var elm = element[i];\n    if (elm.nodeType === ELEMENT_NODE) {\n      return elm;\n    }\n  }\n}\n\nfunction splitClasses(classes) {\n  if (isString(classes)) {\n    classes = classes.split(' ');\n  }\n\n  // Use createMap() to prevent class assumptions involving property names in\n  // Object.prototype\n  var obj = createMap();\n  forEach(classes, function(klass) {\n    // sometimes the split leaves empty string values\n    // incase extra spaces were applied to the options\n    if (klass.length) {\n      obj[klass] = true;\n    }\n  });\n  return obj;\n}\n\n// if any other type of options value besides an Object value is\n// passed into the $animate.method() animation then this helper code\n// will be run which will ignore it. While this patch is not the\n// greatest solution to this, a lot of existing plugins depend on\n// $animate to either call the callback (< 1.2) or return a promise\n// that can be changed. This helper function ensures that the options\n// are wiped clean incase a callback function is provided.\nfunction prepareAnimateOptions(options) {\n  return isObject(options)\n      ? options\n      : {};\n}\n\nvar $$CoreAnimateJsProvider = /** @this */ function() {\n  this.$get = noop;\n};\n\n// this is prefixed with Core since it conflicts with\n// the animateQueueProvider defined in ngAnimate/animateQueue.js\nvar $$CoreAnimateQueueProvider = /** @this */ function() {\n  var postDigestQueue = new NgMap();\n  var postDigestElements = [];\n\n  this.$get = ['$$AnimateRunner', '$rootScope',\n       function($$AnimateRunner,   $rootScope) {\n    return {\n      enabled: noop,\n      on: noop,\n      off: noop,\n      pin: noop,\n\n      push: function(element, event, options, domOperation) {\n        if (domOperation) {\n          domOperation();\n        }\n\n        options = options || {};\n        if (options.from) {\n          element.css(options.from);\n        }\n        if (options.to) {\n          element.css(options.to);\n        }\n\n        if (options.addClass || options.removeClass) {\n          addRemoveClassesPostDigest(element, options.addClass, options.removeClass);\n        }\n\n        var runner = new $$AnimateRunner();\n\n        // since there are no animations to run the runner needs to be\n        // notified that the animation call is complete.\n        runner.complete();\n        return runner;\n      }\n    };\n\n\n    function updateData(data, classes, value) {\n      var changed = false;\n      if (classes) {\n        classes = isString(classes) ? classes.split(' ') :\n                  isArray(classes) ? classes : [];\n        forEach(classes, function(className) {\n          if (className) {\n            changed = true;\n            data[className] = value;\n          }\n        });\n      }\n      return changed;\n    }\n\n    function handleCSSClassChanges() {\n      forEach(postDigestElements, function(element) {\n        var data = postDigestQueue.get(element);\n        if (data) {\n          var existing = splitClasses(element.attr('class'));\n          var toAdd = '';\n          var toRemove = '';\n          forEach(data, function(status, className) {\n            var hasClass = !!existing[className];\n            if (status !== hasClass) {\n              if (status) {\n                toAdd += (toAdd.length ? ' ' : '') + className;\n              } else {\n                toRemove += (toRemove.length ? ' ' : '') + className;\n              }\n            }\n          });\n\n          forEach(element, function(elm) {\n            if (toAdd) {\n              jqLiteAddClass(elm, toAdd);\n            }\n            if (toRemove) {\n              jqLiteRemoveClass(elm, toRemove);\n            }\n          });\n          postDigestQueue.delete(element);\n        }\n      });\n      postDigestElements.length = 0;\n    }\n\n\n    function addRemoveClassesPostDigest(element, add, remove) {\n      var data = postDigestQueue.get(element) || {};\n\n      var classesAdded = updateData(data, add, true);\n      var classesRemoved = updateData(data, remove, false);\n\n      if (classesAdded || classesRemoved) {\n\n        postDigestQueue.set(element, data);\n        postDigestElements.push(element);\n\n        if (postDigestElements.length === 1) {\n          $rootScope.$$postDigest(handleCSSClassChanges);\n        }\n      }\n    }\n  }];\n};\n\n/**\n * @ngdoc provider\n * @name $animateProvider\n *\n * @description\n * Default implementation of $animate that doesn't perform any animations, instead just\n * synchronously performs DOM updates and resolves the returned runner promise.\n *\n * In order to enable animations the `ngAnimate` module has to be loaded.\n *\n * To see the functional implementation check out `src/ngAnimate/animate.js`.\n */\nvar $AnimateProvider = ['$provide', /** @this */ function($provide) {\n  var provider = this;\n  var classNameFilter = null;\n\n  this.$$registeredAnimations = Object.create(null);\n\n   /**\n   * @ngdoc method\n   * @name $animateProvider#register\n   *\n   * @description\n   * Registers a new injectable animation factory function. The factory function produces the\n   * animation object which contains callback functions for each event that is expected to be\n   * animated.\n   *\n   *   * `eventFn`: `function(element, ... , doneFunction, options)`\n   *   The element to animate, the `doneFunction` and the options fed into the animation. Depending\n   *   on the type of animation additional arguments will be injected into the animation function. The\n   *   list below explains the function signatures for the different animation methods:\n   *\n   *   - setClass: function(element, addedClasses, removedClasses, doneFunction, options)\n   *   - addClass: function(element, addedClasses, doneFunction, options)\n   *   - removeClass: function(element, removedClasses, doneFunction, options)\n   *   - enter, leave, move: function(element, doneFunction, options)\n   *   - animate: function(element, fromStyles, toStyles, doneFunction, options)\n   *\n   *   Make sure to trigger the `doneFunction` once the animation is fully complete.\n   *\n   * ```js\n   *   return {\n   *     //enter, leave, move signature\n   *     eventFn : function(element, done, options) {\n   *       //code to run the animation\n   *       //once complete, then run done()\n   *       return function endFunction(wasCancelled) {\n   *         //code to cancel the animation\n   *       }\n   *     }\n   *   }\n   * ```\n   *\n   * @param {string} name The name of the animation (this is what the class-based CSS value will be compared to).\n   * @param {Function} factory The factory function that will be executed to return the animation\n   *                           object.\n   */\n  this.register = function(name, factory) {\n    if (name && name.charAt(0) !== '.') {\n      throw $animateMinErr('notcsel', 'Expecting class selector starting with \\'.\\' got \\'{0}\\'.', name);\n    }\n\n    var key = name + '-animation';\n    provider.$$registeredAnimations[name.substr(1)] = key;\n    $provide.factory(key, factory);\n  };\n\n  /**\n   * @ngdoc method\n   * @name $animateProvider#classNameFilter\n   *\n   * @description\n   * Sets and/or returns the CSS class regular expression that is checked when performing\n   * an animation. Upon bootstrap the classNameFilter value is not set at all and will\n   * therefore enable $animate to attempt to perform an animation on any element that is triggered.\n   * When setting the `classNameFilter` value, animations will only be performed on elements\n   * that successfully match the filter expression. This in turn can boost performance\n   * for low-powered devices as well as applications containing a lot of structural operations.\n   * @param {RegExp=} expression The className expression which will be checked against all animations\n   * @return {RegExp} The current CSS className expression value. If null then there is no expression value\n   */\n  this.classNameFilter = function(expression) {\n    if (arguments.length === 1) {\n      classNameFilter = (expression instanceof RegExp) ? expression : null;\n      if (classNameFilter) {\n        var reservedRegex = new RegExp('[(\\\\s|\\\\/)]' + NG_ANIMATE_CLASSNAME + '[(\\\\s|\\\\/)]');\n        if (reservedRegex.test(classNameFilter.toString())) {\n          classNameFilter = null;\n          throw $animateMinErr('nongcls', '$animateProvider.classNameFilter(regex) prohibits accepting a regex value which matches/contains the \"{0}\" CSS class.', NG_ANIMATE_CLASSNAME);\n        }\n      }\n    }\n    return classNameFilter;\n  };\n\n  this.$get = ['$$animateQueue', function($$animateQueue) {\n    function domInsert(element, parentElement, afterElement) {\n      // if for some reason the previous element was removed\n      // from the dom sometime before this code runs then let's\n      // just stick to using the parent element as the anchor\n      if (afterElement) {\n        var afterNode = extractElementNode(afterElement);\n        if (afterNode && !afterNode.parentNode && !afterNode.previousElementSibling) {\n          afterElement = null;\n        }\n      }\n      if (afterElement) {\n        afterElement.after(element);\n      } else {\n        parentElement.prepend(element);\n      }\n    }\n\n    /**\n     * @ngdoc service\n     * @name $animate\n     * @description The $animate service exposes a series of DOM utility methods that provide support\n     * for animation hooks. The default behavior is the application of DOM operations, however,\n     * when an animation is detected (and animations are enabled), $animate will do the heavy lifting\n     * to ensure that animation runs with the triggered DOM operation.\n     *\n     * By default $animate doesn't trigger any animations. This is because the `ngAnimate` module isn't\n     * included and only when it is active then the animation hooks that `$animate` triggers will be\n     * functional. Once active then all structural `ng-` directives will trigger animations as they perform\n     * their DOM-related operations (enter, leave and move). Other directives such as `ngClass`,\n     * `ngShow`, `ngHide` and `ngMessages` also provide support for animations.\n     *\n     * It is recommended that the`$animate` service is always used when executing DOM-related procedures within directives.\n     *\n     * To learn more about enabling animation support, click here to visit the\n     * {@link ngAnimate ngAnimate module page}.\n     */\n    return {\n      // we don't call it directly since non-existant arguments may\n      // be interpreted as null within the sub enabled function\n\n      /**\n       *\n       * @ngdoc method\n       * @name $animate#on\n       * @kind function\n       * @description Sets up an event listener to fire whenever the animation event (enter, leave, move, etc...)\n       *    has fired on the given element or among any of its children. Once the listener is fired, the provided callback\n       *    is fired with the following params:\n       *\n       * ```js\n       * $animate.on('enter', container,\n       *    function callback(element, phase) {\n       *      // cool we detected an enter animation within the container\n       *    }\n       * );\n       * ```\n       *\n       * @param {string} event the animation event that will be captured (e.g. enter, leave, move, addClass, removeClass, etc...)\n       * @param {DOMElement} container the container element that will capture each of the animation events that are fired on itself\n       *     as well as among its children\n       * @param {Function} callback the callback function that will be fired when the listener is triggered\n       *\n       * The arguments present in the callback function are:\n       * * `element` - The captured DOM element that the animation was fired on.\n       * * `phase` - The phase of the animation. The two possible phases are **start** (when the animation starts) and **close** (when it ends).\n       */\n      on: $$animateQueue.on,\n\n      /**\n       *\n       * @ngdoc method\n       * @name $animate#off\n       * @kind function\n       * @description Deregisters an event listener based on the event which has been associated with the provided element. This method\n       * can be used in three different ways depending on the arguments:\n       *\n       * ```js\n       * // remove all the animation event listeners listening for `enter`\n       * $animate.off('enter');\n       *\n       * // remove listeners for all animation events from the container element\n       * $animate.off(container);\n       *\n       * // remove all the animation event listeners listening for `enter` on the given element and its children\n       * $animate.off('enter', container);\n       *\n       * // remove the event listener function provided by `callback` that is set\n       * // to listen for `enter` on the given `container` as well as its children\n       * $animate.off('enter', container, callback);\n       * ```\n       *\n       * @param {string|DOMElement} event|container the animation event (e.g. enter, leave, move,\n       * addClass, removeClass, etc...), or the container element. If it is the element, all other\n       * arguments are ignored.\n       * @param {DOMElement=} container the container element the event listener was placed on\n       * @param {Function=} callback the callback function that was registered as the listener\n       */\n      off: $$animateQueue.off,\n\n      /**\n       * @ngdoc method\n       * @name $animate#pin\n       * @kind function\n       * @description Associates the provided element with a host parent element to allow the element to be animated even if it exists\n       *    outside of the DOM structure of the Angular application. By doing so, any animation triggered via `$animate` can be issued on the\n       *    element despite being outside the realm of the application or within another application. Say for example if the application\n       *    was bootstrapped on an element that is somewhere inside of the `<body>` tag, but we wanted to allow for an element to be situated\n       *    as a direct child of `document.body`, then this can be achieved by pinning the element via `$animate.pin(element)`. Keep in mind\n       *    that calling `$animate.pin(element, parentElement)` will not actually insert into the DOM anywhere; it will just create the association.\n       *\n       *    Note that this feature is only active when the `ngAnimate` module is used.\n       *\n       * @param {DOMElement} element the external element that will be pinned\n       * @param {DOMElement} parentElement the host parent element that will be associated with the external element\n       */\n      pin: $$animateQueue.pin,\n\n      /**\n       *\n       * @ngdoc method\n       * @name $animate#enabled\n       * @kind function\n       * @description Used to get and set whether animations are enabled or not on the entire application or on an element and its children. This\n       * function can be called in four ways:\n       *\n       * ```js\n       * // returns true or false\n       * $animate.enabled();\n       *\n       * // changes the enabled state for all animations\n       * $animate.enabled(false);\n       * $animate.enabled(true);\n       *\n       * // returns true or false if animations are enabled for an element\n       * $animate.enabled(element);\n       *\n       * // changes the enabled state for an element and its children\n       * $animate.enabled(element, true);\n       * $animate.enabled(element, false);\n       * ```\n       *\n       * @param {DOMElement=} element the element that will be considered for checking/setting the enabled state\n       * @param {boolean=} enabled whether or not the animations will be enabled for the element\n       *\n       * @return {boolean} whether or not animations are enabled\n       */\n      enabled: $$animateQueue.enabled,\n\n      /**\n       * @ngdoc method\n       * @name $animate#cancel\n       * @kind function\n       * @description Cancels the provided animation.\n       *\n       * @param {Promise} animationPromise The animation promise that is returned when an animation is started.\n       */\n      cancel: function(runner) {\n        if (runner.end) {\n          runner.end();\n        }\n      },\n\n      /**\n       *\n       * @ngdoc method\n       * @name $animate#enter\n       * @kind function\n       * @description Inserts the element into the DOM either after the `after` element (if provided) or\n       *   as the first child within the `parent` element and then triggers an animation.\n       *   A promise is returned that will be resolved during the next digest once the animation\n       *   has completed.\n       *\n       * @param {DOMElement} element the element which will be inserted into the DOM\n       * @param {DOMElement} parent the parent element which will append the element as\n       *   a child (so long as the after element is not present)\n       * @param {DOMElement=} after the sibling element after which the element will be appended\n       * @param {object=} options an optional collection of options/styles that will be applied to the element.\n       *   The object can have the following properties:\n       *\n       *   - **addClass** - `{string}` - space-separated CSS classes to add to element\n       *   - **from** - `{Object}` - CSS properties & values at the beginning of animation. Must have matching `to`\n       *   - **removeClass** - `{string}` - space-separated CSS classes to remove from element\n       *   - **to** - `{Object}` - CSS properties & values at end of animation. Must have matching `from`\n       *\n       * @return {Promise} the animation callback promise\n       */\n      enter: function(element, parent, after, options) {\n        parent = parent && jqLite(parent);\n        after = after && jqLite(after);\n        parent = parent || after.parent();\n        domInsert(element, parent, after);\n        return $$animateQueue.push(element, 'enter', prepareAnimateOptions(options));\n      },\n\n      /**\n       *\n       * @ngdoc method\n       * @name $animate#move\n       * @kind function\n       * @description Inserts (moves) the element into its new position in the DOM either after\n       *   the `after` element (if provided) or as the first child within the `parent` element\n       *   and then triggers an animation. A promise is returned that will be resolved\n       *   during the next digest once the animation has completed.\n       *\n       * @param {DOMElement} element the element which will be moved into the new DOM position\n       * @param {DOMElement} parent the parent element which will append the element as\n       *   a child (so long as the after element is not present)\n       * @param {DOMElement=} after the sibling element after which the element will be appended\n       * @param {object=} options an optional collection of options/styles that will be applied to the element.\n       *   The object can have the following properties:\n       *\n       *   - **addClass** - `{string}` - space-separated CSS classes to add to element\n       *   - **from** - `{Object}` - CSS properties & values at the beginning of animation. Must have matching `to`\n       *   - **removeClass** - `{string}` - space-separated CSS classes to remove from element\n       *   - **to** - `{Object}` - CSS properties & values at end of animation. Must have matching `from`\n       *\n       * @return {Promise} the animation callback promise\n       */\n      move: function(element, parent, after, options) {\n        parent = parent && jqLite(parent);\n        after = after && jqLite(after);\n        parent = parent || after.parent();\n        domInsert(element, parent, after);\n        return $$animateQueue.push(element, 'move', prepareAnimateOptions(options));\n      },\n\n      /**\n       * @ngdoc method\n       * @name $animate#leave\n       * @kind function\n       * @description Triggers an animation and then removes the element from the DOM.\n       * When the function is called a promise is returned that will be resolved during the next\n       * digest once the animation has completed.\n       *\n       * @param {DOMElement} element the element which will be removed from the DOM\n       * @param {object=} options an optional collection of options/styles that will be applied to the element.\n       *   The object can have the following properties:\n       *\n       *   - **addClass** - `{string}` - space-separated CSS classes to add to element\n       *   - **from** - `{Object}` - CSS properties & values at the beginning of animation. Must have matching `to`\n       *   - **removeClass** - `{string}` - space-separated CSS classes to remove from element\n       *   - **to** - `{Object}` - CSS properties & values at end of animation. Must have matching `from`\n       *\n       * @return {Promise} the animation callback promise\n       */\n      leave: function(element, options) {\n        return $$animateQueue.push(element, 'leave', prepareAnimateOptions(options), function() {\n          element.remove();\n        });\n      },\n\n      /**\n       * @ngdoc method\n       * @name $animate#addClass\n       * @kind function\n       *\n       * @description Triggers an addClass animation surrounding the addition of the provided CSS class(es). Upon\n       *   execution, the addClass operation will only be handled after the next digest and it will not trigger an\n       *   animation if element already contains the CSS class or if the class is removed at a later step.\n       *   Note that class-based animations are treated differently compared to structural animations\n       *   (like enter, move and leave) since the CSS classes may be added/removed at different points\n       *   depending if CSS or JavaScript animations are used.\n       *\n       * @param {DOMElement} element the element which the CSS classes will be applied to\n       * @param {string} className the CSS class(es) that will be added (multiple classes are separated via spaces)\n       * @param {object=} options an optional collection of options/styles that will be applied to the element.\n       *   The object can have the following properties:\n       *\n       *   - **addClass** - `{string}` - space-separated CSS classes to add to element\n       *   - **from** - `{Object}` - CSS properties & values at the beginning of animation. Must have matching `to`\n       *   - **removeClass** - `{string}` - space-separated CSS classes to remove from element\n       *   - **to** - `{Object}` - CSS properties & values at end of animation. Must have matching `from`\n       *\n       * @return {Promise} the animation callback promise\n       */\n      addClass: function(element, className, options) {\n        options = prepareAnimateOptions(options);\n        options.addClass = mergeClasses(options.addclass, className);\n        return $$animateQueue.push(element, 'addClass', options);\n      },\n\n      /**\n       * @ngdoc method\n       * @name $animate#removeClass\n       * @kind function\n       *\n       * @description Triggers a removeClass animation surrounding the removal of the provided CSS class(es). Upon\n       *   execution, the removeClass operation will only be handled after the next digest and it will not trigger an\n       *   animation if element does not contain the CSS class or if the class is added at a later step.\n       *   Note that class-based animations are treated differently compared to structural animations\n       *   (like enter, move and leave) since the CSS classes may be added/removed at different points\n       *   depending if CSS or JavaScript animations are used.\n       *\n       * @param {DOMElement} element the element which the CSS classes will be applied to\n       * @param {string} className the CSS class(es) that will be removed (multiple classes are separated via spaces)\n       * @param {object=} options an optional collection of options/styles that will be applied to the element.\n       *   The object can have the following properties:\n       *\n       *   - **addClass** - `{string}` - space-separated CSS classes to add to element\n       *   - **from** - `{Object}` - CSS properties & values at the beginning of animation. Must have matching `to`\n       *   - **removeClass** - `{string}` - space-separated CSS classes to remove from element\n       *   - **to** - `{Object}` - CSS properties & values at end of animation. Must have matching `from`\n       *\n       * @return {Promise} the animation callback promise\n       */\n      removeClass: function(element, className, options) {\n        options = prepareAnimateOptions(options);\n        options.removeClass = mergeClasses(options.removeClass, className);\n        return $$animateQueue.push(element, 'removeClass', options);\n      },\n\n      /**\n       * @ngdoc method\n       * @name $animate#setClass\n       * @kind function\n       *\n       * @description Performs both the addition and removal of a CSS classes on an element and (during the process)\n       *    triggers an animation surrounding the class addition/removal. Much like `$animate.addClass` and\n       *    `$animate.removeClass`, `setClass` will only evaluate the classes being added/removed once a digest has\n       *    passed. Note that class-based animations are treated differently compared to structural animations\n       *    (like enter, move and leave) since the CSS classes may be added/removed at different points\n       *    depending if CSS or JavaScript animations are used.\n       *\n       * @param {DOMElement} element the element which the CSS classes will be applied to\n       * @param {string} add the CSS class(es) that will be added (multiple classes are separated via spaces)\n       * @param {string} remove the CSS class(es) that will be removed (multiple classes are separated via spaces)\n       * @param {object=} options an optional collection of options/styles that will be applied to the element.\n       *   The object can have the following properties:\n       *\n       *   - **addClass** - `{string}` - space-separated CSS classes to add to element\n       *   - **from** - `{Object}` - CSS properties & values at the beginning of animation. Must have matching `to`\n       *   - **removeClass** - `{string}` - space-separated CSS classes to remove from element\n       *   - **to** - `{Object}` - CSS properties & values at end of animation. Must have matching `from`\n       *\n       * @return {Promise} the animation callback promise\n       */\n      setClass: function(element, add, remove, options) {\n        options = prepareAnimateOptions(options);\n        options.addClass = mergeClasses(options.addClass, add);\n        options.removeClass = mergeClasses(options.removeClass, remove);\n        return $$animateQueue.push(element, 'setClass', options);\n      },\n\n      /**\n       * @ngdoc method\n       * @name $animate#animate\n       * @kind function\n       *\n       * @description Performs an inline animation on the element which applies the provided to and from CSS styles to the element.\n       * If any detected CSS transition, keyframe or JavaScript matches the provided className value, then the animation will take\n       * on the provided styles. For example, if a transition animation is set for the given className, then the provided `from` and\n       * `to` styles will be applied alongside the given transition. If the CSS style provided in `from` does not have a corresponding\n       * style in `to`, the style in `from` is applied immediately, and no animation is run.\n       * If a JavaScript animation is detected then the provided styles will be given in as function parameters into the `animate`\n       * method (or as part of the `options` parameter):\n       *\n       * ```js\n       * ngModule.animation('.my-inline-animation', function() {\n       *   return {\n       *     animate : function(element, from, to, done, options) {\n       *       //animation\n       *       done();\n       *     }\n       *   }\n       * });\n       * ```\n       *\n       * @param {DOMElement} element the element which the CSS styles will be applied to\n       * @param {object} from the from (starting) CSS styles that will be applied to the element and across the animation.\n       * @param {object} to the to (destination) CSS styles that will be applied to the element and across the animation.\n       * @param {string=} className an optional CSS class that will be applied to the element for the duration of the animation. If\n       *    this value is left as empty then a CSS class of `ng-inline-animate` will be applied to the element.\n       *    (Note that if no animation is detected then this value will not be applied to the element.)\n       * @param {object=} options an optional collection of options/styles that will be applied to the element.\n       *   The object can have the following properties:\n       *\n       *   - **addClass** - `{string}` - space-separated CSS classes to add to element\n       *   - **from** - `{Object}` - CSS properties & values at the beginning of animation. Must have matching `to`\n       *   - **removeClass** - `{string}` - space-separated CSS classes to remove from element\n       *   - **to** - `{Object}` - CSS properties & values at end of animation. Must have matching `from`\n       *\n       * @return {Promise} the animation callback promise\n       */\n      animate: function(element, from, to, className, options) {\n        options = prepareAnimateOptions(options);\n        options.from = options.from ? extend(options.from, from) : from;\n        options.to   = options.to   ? extend(options.to, to)     : to;\n\n        className = className || 'ng-inline-animate';\n        options.tempClasses = mergeClasses(options.tempClasses, className);\n        return $$animateQueue.push(element, 'animate', options);\n      }\n    };\n  }];\n}];\n\nvar $$AnimateAsyncRunFactoryProvider = /** @this */ function() {\n  this.$get = ['$$rAF', function($$rAF) {\n    var waitQueue = [];\n\n    function waitForTick(fn) {\n      waitQueue.push(fn);\n      if (waitQueue.length > 1) return;\n      $$rAF(function() {\n        for (var i = 0; i < waitQueue.length; i++) {\n          waitQueue[i]();\n        }\n        waitQueue = [];\n      });\n    }\n\n    return function() {\n      var passed = false;\n      waitForTick(function() {\n        passed = true;\n      });\n      return function(callback) {\n        if (passed) {\n          callback();\n        } else {\n          waitForTick(callback);\n        }\n      };\n    };\n  }];\n};\n\nvar $$AnimateRunnerFactoryProvider = /** @this */ function() {\n  this.$get = ['$q', '$sniffer', '$$animateAsyncRun', '$$isDocumentHidden', '$timeout',\n       function($q,   $sniffer,   $$animateAsyncRun,   $$isDocumentHidden,   $timeout) {\n\n    var INITIAL_STATE = 0;\n    var DONE_PENDING_STATE = 1;\n    var DONE_COMPLETE_STATE = 2;\n\n    AnimateRunner.chain = function(chain, callback) {\n      var index = 0;\n\n      next();\n      function next() {\n        if (index === chain.length) {\n          callback(true);\n          return;\n        }\n\n        chain[index](function(response) {\n          if (response === false) {\n            callback(false);\n            return;\n          }\n          index++;\n          next();\n        });\n      }\n    };\n\n    AnimateRunner.all = function(runners, callback) {\n      var count = 0;\n      var status = true;\n      forEach(runners, function(runner) {\n        runner.done(onProgress);\n      });\n\n      function onProgress(response) {\n        status = status && response;\n        if (++count === runners.length) {\n          callback(status);\n        }\n      }\n    };\n\n    function AnimateRunner(host) {\n      this.setHost(host);\n\n      var rafTick = $$animateAsyncRun();\n      var timeoutTick = function(fn) {\n        $timeout(fn, 0, false);\n      };\n\n      this._doneCallbacks = [];\n      this._tick = function(fn) {\n        if ($$isDocumentHidden()) {\n          timeoutTick(fn);\n        } else {\n          rafTick(fn);\n        }\n      };\n      this._state = 0;\n    }\n\n    AnimateRunner.prototype = {\n      setHost: function(host) {\n        this.host = host || {};\n      },\n\n      done: function(fn) {\n        if (this._state === DONE_COMPLETE_STATE) {\n          fn();\n        } else {\n          this._doneCallbacks.push(fn);\n        }\n      },\n\n      progress: noop,\n\n      getPromise: function() {\n        if (!this.promise) {\n          var self = this;\n          this.promise = $q(function(resolve, reject) {\n            self.done(function(status) {\n              if (status === false) {\n                reject();\n              } else {\n                resolve();\n              }\n            });\n          });\n        }\n        return this.promise;\n      },\n\n      then: function(resolveHandler, rejectHandler) {\n        return this.getPromise().then(resolveHandler, rejectHandler);\n      },\n\n      'catch': function(handler) {\n        return this.getPromise()['catch'](handler);\n      },\n\n      'finally': function(handler) {\n        return this.getPromise()['finally'](handler);\n      },\n\n      pause: function() {\n        if (this.host.pause) {\n          this.host.pause();\n        }\n      },\n\n      resume: function() {\n        if (this.host.resume) {\n          this.host.resume();\n        }\n      },\n\n      end: function() {\n        if (this.host.end) {\n          this.host.end();\n        }\n        this._resolve(true);\n      },\n\n      cancel: function() {\n        if (this.host.cancel) {\n          this.host.cancel();\n        }\n        this._resolve(false);\n      },\n\n      complete: function(response) {\n        var self = this;\n        if (self._state === INITIAL_STATE) {\n          self._state = DONE_PENDING_STATE;\n          self._tick(function() {\n            self._resolve(response);\n          });\n        }\n      },\n\n      _resolve: function(response) {\n        if (this._state !== DONE_COMPLETE_STATE) {\n          forEach(this._doneCallbacks, function(fn) {\n            fn(response);\n          });\n          this._doneCallbacks.length = 0;\n          this._state = DONE_COMPLETE_STATE;\n        }\n      }\n    };\n\n    return AnimateRunner;\n  }];\n};\n\n/* exported $CoreAnimateCssProvider */\n\n/**\n * @ngdoc service\n * @name $animateCss\n * @kind object\n * @this\n *\n * @description\n * This is the core version of `$animateCss`. By default, only when the `ngAnimate` is included,\n * then the `$animateCss` service will actually perform animations.\n *\n * Click here {@link ngAnimate.$animateCss to read the documentation for $animateCss}.\n */\nvar $CoreAnimateCssProvider = function() {\n  this.$get = ['$$rAF', '$q', '$$AnimateRunner', function($$rAF, $q, $$AnimateRunner) {\n\n    return function(element, initialOptions) {\n      // all of the animation functions should create\n      // a copy of the options data, however, if a\n      // parent service has already created a copy then\n      // we should stick to using that\n      var options = initialOptions || {};\n      if (!options.$$prepared) {\n        options = copy(options);\n      }\n\n      // there is no point in applying the styles since\n      // there is no animation that goes on at all in\n      // this version of $animateCss.\n      if (options.cleanupStyles) {\n        options.from = options.to = null;\n      }\n\n      if (options.from) {\n        element.css(options.from);\n        options.from = null;\n      }\n\n      var closed, runner = new $$AnimateRunner();\n      return {\n        start: run,\n        end: run\n      };\n\n      function run() {\n        $$rAF(function() {\n          applyAnimationContents();\n          if (!closed) {\n            runner.complete();\n          }\n          closed = true;\n        });\n        return runner;\n      }\n\n      function applyAnimationContents() {\n        if (options.addClass) {\n          element.addClass(options.addClass);\n          options.addClass = null;\n        }\n        if (options.removeClass) {\n          element.removeClass(options.removeClass);\n          options.removeClass = null;\n        }\n        if (options.to) {\n          element.css(options.to);\n          options.to = null;\n        }\n      }\n    };\n  }];\n};\n\n/* global stripHash: true */\n\n/**\n * ! This is a private undocumented service !\n *\n * @name $browser\n * @requires $log\n * @description\n * This object has two goals:\n *\n * - hide all the global state in the browser caused by the window object\n * - abstract away all the browser specific features and inconsistencies\n *\n * For tests we provide {@link ngMock.$browser mock implementation} of the `$browser`\n * service, which can be used for convenient testing of the application without the interaction with\n * the real browser apis.\n */\n/**\n * @param {object} window The global window object.\n * @param {object} document jQuery wrapped document.\n * @param {object} $log window.console or an object with the same interface.\n * @param {object} $sniffer $sniffer service\n */\nfunction Browser(window, document, $log, $sniffer) {\n  var self = this,\n      location = window.location,\n      history = window.history,\n      setTimeout = window.setTimeout,\n      clearTimeout = window.clearTimeout,\n      pendingDeferIds = {};\n\n  self.isMock = false;\n\n  var outstandingRequestCount = 0;\n  var outstandingRequestCallbacks = [];\n\n  // TODO(vojta): remove this temporary api\n  self.$$completeOutstandingRequest = completeOutstandingRequest;\n  self.$$incOutstandingRequestCount = function() { outstandingRequestCount++; };\n\n  /**\n   * Executes the `fn` function(supports currying) and decrements the `outstandingRequestCallbacks`\n   * counter. If the counter reaches 0, all the `outstandingRequestCallbacks` are executed.\n   */\n  function completeOutstandingRequest(fn) {\n    try {\n      fn.apply(null, sliceArgs(arguments, 1));\n    } finally {\n      outstandingRequestCount--;\n      if (outstandingRequestCount === 0) {\n        while (outstandingRequestCallbacks.length) {\n          try {\n            outstandingRequestCallbacks.pop()();\n          } catch (e) {\n            $log.error(e);\n          }\n        }\n      }\n    }\n  }\n\n  function getHash(url) {\n    var index = url.indexOf('#');\n    return index === -1 ? '' : url.substr(index);\n  }\n\n  /**\n   * @private\n   * Note: this method is used only by scenario runner\n   * TODO(vojta): prefix this method with $$ ?\n   * @param {function()} callback Function that will be called when no outstanding request\n   */\n  self.notifyWhenNoOutstandingRequests = function(callback) {\n    if (outstandingRequestCount === 0) {\n      callback();\n    } else {\n      outstandingRequestCallbacks.push(callback);\n    }\n  };\n\n  //////////////////////////////////////////////////////////////\n  // URL API\n  //////////////////////////////////////////////////////////////\n\n  var cachedState, lastHistoryState,\n      lastBrowserUrl = location.href,\n      baseElement = document.find('base'),\n      pendingLocation = null,\n      getCurrentState = !$sniffer.history ? noop : function getCurrentState() {\n        try {\n          return history.state;\n        } catch (e) {\n          // MSIE can reportedly throw when there is no state (UNCONFIRMED).\n        }\n      };\n\n  cacheState();\n\n  /**\n   * @name $browser#url\n   *\n   * @description\n   * GETTER:\n   * Without any argument, this method just returns current value of location.href.\n   *\n   * SETTER:\n   * With at least one argument, this method sets url to new value.\n   * If html5 history api supported, pushState/replaceState is used, otherwise\n   * location.href/location.replace is used.\n   * Returns its own instance to allow chaining\n   *\n   * NOTE: this api is intended for use only by the $location service. Please use the\n   * {@link ng.$location $location service} to change url.\n   *\n   * @param {string} url New url (when used as setter)\n   * @param {boolean=} replace Should new url replace current history record?\n   * @param {object=} state object to use with pushState/replaceState\n   */\n  self.url = function(url, replace, state) {\n    // In modern browsers `history.state` is `null` by default; treating it separately\n    // from `undefined` would cause `$browser.url('/foo')` to change `history.state`\n    // to undefined via `pushState`. Instead, let's change `undefined` to `null` here.\n    if (isUndefined(state)) {\n      state = null;\n    }\n\n    // Android Browser BFCache causes location, history reference to become stale.\n    if (location !== window.location) location = window.location;\n    if (history !== window.history) history = window.history;\n\n    // setter\n    if (url) {\n      var sameState = lastHistoryState === state;\n\n      // Don't change anything if previous and current URLs and states match. This also prevents\n      // IE<10 from getting into redirect loop when in LocationHashbangInHtml5Url mode.\n      // See https://github.com/angular/angular.js/commit/ffb2701\n      if (lastBrowserUrl === url && (!$sniffer.history || sameState)) {\n        return self;\n      }\n      var sameBase = lastBrowserUrl && stripHash(lastBrowserUrl) === stripHash(url);\n      lastBrowserUrl = url;\n      lastHistoryState = state;\n      // Don't use history API if only the hash changed\n      // due to a bug in IE10/IE11 which leads\n      // to not firing a `hashchange` nor `popstate` event\n      // in some cases (see #9143).\n      if ($sniffer.history && (!sameBase || !sameState)) {\n        history[replace ? 'replaceState' : 'pushState'](state, '', url);\n        cacheState();\n      } else {\n        if (!sameBase) {\n          pendingLocation = url;\n        }\n        if (replace) {\n          location.replace(url);\n        } else if (!sameBase) {\n          location.href = url;\n        } else {\n          location.hash = getHash(url);\n        }\n        if (location.href !== url) {\n          pendingLocation = url;\n        }\n      }\n      if (pendingLocation) {\n        pendingLocation = url;\n      }\n      return self;\n    // getter\n    } else {\n      // - pendingLocation is needed as browsers don't allow to read out\n      //   the new location.href if a reload happened or if there is a bug like in iOS 9 (see\n      //   https://openradar.appspot.com/22186109).\n      // - the replacement is a workaround for https://bugzilla.mozilla.org/show_bug.cgi?id=407172\n      return pendingLocation || location.href.replace(/%27/g,'\\'');\n    }\n  };\n\n  /**\n   * @name $browser#state\n   *\n   * @description\n   * This method is a getter.\n   *\n   * Return history.state or null if history.state is undefined.\n   *\n   * @returns {object} state\n   */\n  self.state = function() {\n    return cachedState;\n  };\n\n  var urlChangeListeners = [],\n      urlChangeInit = false;\n\n  function cacheStateAndFireUrlChange() {\n    pendingLocation = null;\n    fireStateOrUrlChange();\n  }\n\n  // This variable should be used *only* inside the cacheState function.\n  var lastCachedState = null;\n  function cacheState() {\n    // This should be the only place in $browser where `history.state` is read.\n    cachedState = getCurrentState();\n    cachedState = isUndefined(cachedState) ? null : cachedState;\n\n    // Prevent callbacks fo fire twice if both hashchange & popstate were fired.\n    if (equals(cachedState, lastCachedState)) {\n      cachedState = lastCachedState;\n    }\n\n    lastCachedState = cachedState;\n    lastHistoryState = cachedState;\n  }\n\n  function fireStateOrUrlChange() {\n    var prevLastHistoryState = lastHistoryState;\n    cacheState();\n\n    if (lastBrowserUrl === self.url() && prevLastHistoryState === cachedState) {\n      return;\n    }\n\n    lastBrowserUrl = self.url();\n    lastHistoryState = cachedState;\n    forEach(urlChangeListeners, function(listener) {\n      listener(self.url(), cachedState);\n    });\n  }\n\n  /**\n   * @name $browser#onUrlChange\n   *\n   * @description\n   * Register callback function that will be called, when url changes.\n   *\n   * It's only called when the url is changed from outside of angular:\n   * - user types different url into address bar\n   * - user clicks on history (forward/back) button\n   * - user clicks on a link\n   *\n   * It's not called when url is changed by $browser.url() method\n   *\n   * The listener gets called with new url as parameter.\n   *\n   * NOTE: this api is intended for use only by the $location service. Please use the\n   * {@link ng.$location $location service} to monitor url changes in angular apps.\n   *\n   * @param {function(string)} listener Listener function to be called when url changes.\n   * @return {function(string)} Returns the registered listener fn - handy if the fn is anonymous.\n   */\n  self.onUrlChange = function(callback) {\n    // TODO(vojta): refactor to use node's syntax for events\n    if (!urlChangeInit) {\n      // We listen on both (hashchange/popstate) when available, as some browsers don't\n      // fire popstate when user changes the address bar and don't fire hashchange when url\n      // changed by push/replaceState\n\n      // html5 history api - popstate event\n      if ($sniffer.history) jqLite(window).on('popstate', cacheStateAndFireUrlChange);\n      // hashchange event\n      jqLite(window).on('hashchange', cacheStateAndFireUrlChange);\n\n      urlChangeInit = true;\n    }\n\n    urlChangeListeners.push(callback);\n    return callback;\n  };\n\n  /**\n   * @private\n   * Remove popstate and hashchange handler from window.\n   *\n   * NOTE: this api is intended for use only by $rootScope.\n   */\n  self.$$applicationDestroyed = function() {\n    jqLite(window).off('hashchange popstate', cacheStateAndFireUrlChange);\n  };\n\n  /**\n   * Checks whether the url has changed outside of Angular.\n   * Needs to be exported to be able to check for changes that have been done in sync,\n   * as hashchange/popstate events fire in async.\n   */\n  self.$$checkUrlChange = fireStateOrUrlChange;\n\n  //////////////////////////////////////////////////////////////\n  // Misc API\n  //////////////////////////////////////////////////////////////\n\n  /**\n   * @name $browser#baseHref\n   *\n   * @description\n   * Returns current <base href>\n   * (always relative - without domain)\n   *\n   * @returns {string} The current base href\n   */\n  self.baseHref = function() {\n    var href = baseElement.attr('href');\n    return href ? href.replace(/^(https?:)?\\/\\/[^/]*/, '') : '';\n  };\n\n  /**\n   * @name $browser#defer\n   * @param {function()} fn A function, who's execution should be deferred.\n   * @param {number=} [delay=0] of milliseconds to defer the function execution.\n   * @returns {*} DeferId that can be used to cancel the task via `$browser.defer.cancel()`.\n   *\n   * @description\n   * Executes a fn asynchronously via `setTimeout(fn, delay)`.\n   *\n   * Unlike when calling `setTimeout` directly, in test this function is mocked and instead of using\n   * `setTimeout` in tests, the fns are queued in an array, which can be programmatically flushed\n   * via `$browser.defer.flush()`.\n   *\n   */\n  self.defer = function(fn, delay) {\n    var timeoutId;\n    outstandingRequestCount++;\n    timeoutId = setTimeout(function() {\n      delete pendingDeferIds[timeoutId];\n      completeOutstandingRequest(fn);\n    }, delay || 0);\n    pendingDeferIds[timeoutId] = true;\n    return timeoutId;\n  };\n\n\n  /**\n   * @name $browser#defer.cancel\n   *\n   * @description\n   * Cancels a deferred task identified with `deferId`.\n   *\n   * @param {*} deferId Token returned by the `$browser.defer` function.\n   * @returns {boolean} Returns `true` if the task hasn't executed yet and was successfully\n   *                    canceled.\n   */\n  self.defer.cancel = function(deferId) {\n    if (pendingDeferIds[deferId]) {\n      delete pendingDeferIds[deferId];\n      clearTimeout(deferId);\n      completeOutstandingRequest(noop);\n      return true;\n    }\n    return false;\n  };\n\n}\n\n/** @this */\nfunction $BrowserProvider() {\n  this.$get = ['$window', '$log', '$sniffer', '$document',\n      function($window, $log, $sniffer, $document) {\n        return new Browser($window, $document, $log, $sniffer);\n      }];\n}\n\n/**\n * @ngdoc service\n * @name $cacheFactory\n * @this\n *\n * @description\n * Factory that constructs {@link $cacheFactory.Cache Cache} objects and gives access to\n * them.\n *\n * ```js\n *\n *  var cache = $cacheFactory('cacheId');\n *  expect($cacheFactory.get('cacheId')).toBe(cache);\n *  expect($cacheFactory.get('noSuchCacheId')).not.toBeDefined();\n *\n *  cache.put(\"key\", \"value\");\n *  cache.put(\"another key\", \"another value\");\n *\n *  // We've specified no options on creation\n *  expect(cache.info()).toEqual({id: 'cacheId', size: 2});\n *\n * ```\n *\n *\n * @param {string} cacheId Name or id of the newly created cache.\n * @param {object=} options Options object that specifies the cache behavior. Properties:\n *\n *   - `{number=}` `capacity` — turns the cache into LRU cache.\n *\n * @returns {object} Newly created cache object with the following set of methods:\n *\n * - `{object}` `info()` — Returns id, size, and options of cache.\n * - `{{*}}` `put({string} key, {*} value)` — Puts a new key-value pair into the cache and returns\n *   it.\n * - `{{*}}` `get({string} key)` — Returns cached value for `key` or undefined for cache miss.\n * - `{void}` `remove({string} key)` — Removes a key-value pair from the cache.\n * - `{void}` `removeAll()` — Removes all cached values.\n * - `{void}` `destroy()` — Removes references to this cache from $cacheFactory.\n *\n * @example\n   <example module=\"cacheExampleApp\" name=\"cache-factory\">\n     <file name=\"index.ced81ed4.html\">\n       <div ng-controller=\"CacheController\">\n         <input ng-model=\"newCacheKey\" placeholder=\"Key\">\n         <input ng-model=\"newCacheValue\" placeholder=\"Value\">\n         <button ng-click=\"put(newCacheKey, newCacheValue)\">Cache</button>\n\n         <p ng-if=\"keys.length\">Cached Values</p>\n         <div ng-repeat=\"key in keys\">\n           <span ng-bind=\"key\"></span>\n           <span>: </span>\n           <b ng-bind=\"cache.get(key)\"></b>\n         </div>\n\n         <p>Cache Info</p>\n         <div ng-repeat=\"(key, value) in cache.info()\">\n           <span ng-bind=\"key\"></span>\n           <span>: </span>\n           <b ng-bind=\"value\"></b>\n         </div>\n       </div>\n     </file>\n     <file name=\"script.js\">\n       angular.module('cacheExampleApp', []).\n         controller('CacheController', ['$scope', '$cacheFactory', function($scope, $cacheFactory) {\n           $scope.keys = [];\n           $scope.cache = $cacheFactory('cacheId');\n           $scope.put = function(key, value) {\n             if (angular.isUndefined($scope.cache.get(key))) {\n               $scope.keys.push(key);\n             }\n             $scope.cache.put(key, angular.isUndefined(value) ? null : value);\n           };\n         }]);\n     </file>\n     <file name=\"style.css\">\n       p {\n         margin: 10px 0 3px;\n       }\n     </file>\n   </example>\n */\nfunction $CacheFactoryProvider() {\n\n  this.$get = function() {\n    var caches = {};\n\n    function cacheFactory(cacheId, options) {\n      if (cacheId in caches) {\n        throw minErr('$cacheFactory')('iid', 'CacheId \\'{0}\\' is already taken!', cacheId);\n      }\n\n      var size = 0,\n          stats = extend({}, options, {id: cacheId}),\n          data = createMap(),\n          capacity = (options && options.capacity) || Number.MAX_VALUE,\n          lruHash = createMap(),\n          freshEnd = null,\n          staleEnd = null;\n\n      /**\n       * @ngdoc type\n       * @name $cacheFactory.Cache\n       *\n       * @description\n       * A cache object used to store and retrieve data, primarily used by\n       * {@link $http $http} and the {@link ng.directive:script script} directive to cache\n       * templates and other data.\n       *\n       * ```js\n       *  angular.module('superCache')\n       *    .factory('superCache', ['$cacheFactory', function($cacheFactory) {\n       *      return $cacheFactory('super-cache');\n       *    }]);\n       * ```\n       *\n       * Example test:\n       *\n       * ```js\n       *  it('should behave like a cache', inject(function(superCache) {\n       *    superCache.put('key', 'value');\n       *    superCache.put('another key', 'another value');\n       *\n       *    expect(superCache.info()).toEqual({\n       *      id: 'super-cache',\n       *      size: 2\n       *    });\n       *\n       *    superCache.remove('another key');\n       *    expect(superCache.get('another key')).toBeUndefined();\n       *\n       *    superCache.removeAll();\n       *    expect(superCache.info()).toEqual({\n       *      id: 'super-cache',\n       *      size: 0\n       *    });\n       *  }));\n       * ```\n       */\n      return (caches[cacheId] = {\n\n        /**\n         * @ngdoc method\n         * @name $cacheFactory.Cache#put\n         * @kind function\n         *\n         * @description\n         * Inserts a named entry into the {@link $cacheFactory.Cache Cache} object to be\n         * retrieved later, and incrementing the size of the cache if the key was not already\n         * present in the cache. If behaving like an LRU cache, it will also remove stale\n         * entries from the set.\n         *\n         * It will not insert undefined values into the cache.\n         *\n         * @param {string} key the key under which the cached data is stored.\n         * @param {*} value the value to store alongside the key. If it is undefined, the key\n         *    will not be stored.\n         * @returns {*} the value stored.\n         */\n        put: function(key, value) {\n          if (isUndefined(value)) return;\n          if (capacity < Number.MAX_VALUE) {\n            var lruEntry = lruHash[key] || (lruHash[key] = {key: key});\n\n            refresh(lruEntry);\n          }\n\n          if (!(key in data)) size++;\n          data[key] = value;\n\n          if (size > capacity) {\n            this.remove(staleEnd.key);\n          }\n\n          return value;\n        },\n\n        /**\n         * @ngdoc method\n         * @name $cacheFactory.Cache#get\n         * @kind function\n         *\n         * @description\n         * Retrieves named data stored in the {@link $cacheFactory.Cache Cache} object.\n         *\n         * @param {string} key the key of the data to be retrieved\n         * @returns {*} the value stored.\n         */\n        get: function(key) {\n          if (capacity < Number.MAX_VALUE) {\n            var lruEntry = lruHash[key];\n\n            if (!lruEntry) return;\n\n            refresh(lruEntry);\n          }\n\n          return data[key];\n        },\n\n\n        /**\n         * @ngdoc method\n         * @name $cacheFactory.Cache#remove\n         * @kind function\n         *\n         * @description\n         * Removes an entry from the {@link $cacheFactory.Cache Cache} object.\n         *\n         * @param {string} key the key of the entry to be removed\n         */\n        remove: function(key) {\n          if (capacity < Number.MAX_VALUE) {\n            var lruEntry = lruHash[key];\n\n            if (!lruEntry) return;\n\n            if (lruEntry === freshEnd) freshEnd = lruEntry.p;\n            if (lruEntry === staleEnd) staleEnd = lruEntry.n;\n            link(lruEntry.n,lruEntry.p);\n\n            delete lruHash[key];\n          }\n\n          if (!(key in data)) return;\n\n          delete data[key];\n          size--;\n        },\n\n\n        /**\n         * @ngdoc method\n         * @name $cacheFactory.Cache#removeAll\n         * @kind function\n         *\n         * @description\n         * Clears the cache object of any entries.\n         */\n        removeAll: function() {\n          data = createMap();\n          size = 0;\n          lruHash = createMap();\n          freshEnd = staleEnd = null;\n        },\n\n\n        /**\n         * @ngdoc method\n         * @name $cacheFactory.Cache#destroy\n         * @kind function\n         *\n         * @description\n         * Destroys the {@link $cacheFactory.Cache Cache} object entirely,\n         * removing it from the {@link $cacheFactory $cacheFactory} set.\n         */\n        destroy: function() {\n          data = null;\n          stats = null;\n          lruHash = null;\n          delete caches[cacheId];\n        },\n\n\n        /**\n         * @ngdoc method\n         * @name $cacheFactory.Cache#info\n         * @kind function\n         *\n         * @description\n         * Retrieve information regarding a particular {@link $cacheFactory.Cache Cache}.\n         *\n         * @returns {object} an object with the following properties:\n         *   <ul>\n         *     <li>**id**: the id of the cache instance</li>\n         *     <li>**size**: the number of entries kept in the cache instance</li>\n         *     <li>**...**: any additional properties from the options object when creating the\n         *       cache.</li>\n         *   </ul>\n         */\n        info: function() {\n          return extend({}, stats, {size: size});\n        }\n      });\n\n\n      /**\n       * makes the `entry` the freshEnd of the LRU linked list\n       */\n      function refresh(entry) {\n        if (entry !== freshEnd) {\n          if (!staleEnd) {\n            staleEnd = entry;\n          } else if (staleEnd === entry) {\n            staleEnd = entry.n;\n          }\n\n          link(entry.n, entry.p);\n          link(entry, freshEnd);\n          freshEnd = entry;\n          freshEnd.n = null;\n        }\n      }\n\n\n      /**\n       * bidirectionally links two entries of the LRU linked list\n       */\n      function link(nextEntry, prevEntry) {\n        if (nextEntry !== prevEntry) {\n          if (nextEntry) nextEntry.p = prevEntry; //p stands for previous, 'prev' didn't minify\n          if (prevEntry) prevEntry.n = nextEntry; //n stands for next, 'next' didn't minify\n        }\n      }\n    }\n\n\n  /**\n   * @ngdoc method\n   * @name $cacheFactory#info\n   *\n   * @description\n   * Get information about all the caches that have been created\n   *\n   * @returns {Object} - key-value map of `cacheId` to the result of calling `cache#info`\n   */\n    cacheFactory.info = function() {\n      var info = {};\n      forEach(caches, function(cache, cacheId) {\n        info[cacheId] = cache.info();\n      });\n      return info;\n    };\n\n\n  /**\n   * @ngdoc method\n   * @name $cacheFactory#get\n   *\n   * @description\n   * Get access to a cache object by the `cacheId` used when it was created.\n   *\n   * @param {string} cacheId Name or id of a cache to access.\n   * @returns {object} Cache object identified by the cacheId or undefined if no such cache.\n   */\n    cacheFactory.get = function(cacheId) {\n      return caches[cacheId];\n    };\n\n\n    return cacheFactory;\n  };\n}\n\n/**\n * @ngdoc service\n * @name $templateCache\n * @this\n *\n * @description\n * The first time a template is used, it is loaded in the template cache for quick retrieval. You\n * can load templates directly into the cache in a `script` tag, or by consuming the\n * `$templateCache` service directly.\n *\n * Adding via the `script` tag:\n *\n * ```html\n *   <script type=\"text/ng-template\" id=\"templateId.html\">\n *     <p>This is the content of the template</p>\n *   </script>\n * ```\n *\n * **Note:** the `script` tag containing the template does not need to be included in the `head` of\n * the document, but it must be a descendent of the {@link ng.$rootElement $rootElement} (IE,\n * element with ng-app attribute), otherwise the template will be ignored.\n *\n * Adding via the `$templateCache` service:\n *\n * ```js\n * var myApp = angular.module('myApp', []);\n * myApp.run(function($templateCache) {\n *   $templateCache.put('templateId.html', 'This is the content of the template');\n * });\n * ```\n *\n * To retrieve the template later, simply use it in your component:\n * ```js\n * myApp.component('myComponent', {\n *    templateUrl: 'templateId.html'\n * });\n * ```\n *\n * or get it via the `$templateCache` service:\n * ```js\n * $templateCache.get('templateId.html')\n * ```\n *\n * See {@link ng.$cacheFactory $cacheFactory}.\n *\n */\nfunction $TemplateCacheProvider() {\n  this.$get = ['$cacheFactory', function($cacheFactory) {\n    return $cacheFactory('templates');\n  }];\n}\n\n/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *\n *     Any commits to this file should be reviewed with security in mind.  *\n *   Changes to this file can potentially create security vulnerabilities. *\n *          An approval from 2 Core members with history of modifying      *\n *                         this file is required.                          *\n *                                                                         *\n *  Does the change somehow allow for arbitrary javascript to be executed? *\n *    Or allows for someone to change the prototype of built-in objects?   *\n *     Or gives undesired access to variables like document or window?    *\n * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */\n\n/* ! VARIABLE/FUNCTION NAMING CONVENTIONS THAT APPLY TO THIS FILE!\n *\n * DOM-related variables:\n *\n * - \"node\" - DOM Node\n * - \"element\" - DOM Element or Node\n * - \"$node\" or \"$element\" - jqLite-wrapped node or element\n *\n *\n * Compiler related stuff:\n *\n * - \"linkFn\" - linking fn of a single directive\n * - \"nodeLinkFn\" - function that aggregates all linking fns for a particular node\n * - \"childLinkFn\" -  function that aggregates all linking fns for child nodes of a particular node\n * - \"compositeLinkFn\" - function that aggregates all linking fns for a compilation root (nodeList)\n */\n\n\n/**\n * @ngdoc service\n * @name $compile\n * @kind function\n *\n * @description\n * Compiles an HTML string or DOM into a template and produces a template function, which\n * can then be used to link {@link ng.$rootScope.Scope `scope`} and the template together.\n *\n * The compilation is a process of walking the DOM tree and matching DOM elements to\n * {@link ng.$compileProvider#directive directives}.\n *\n * <div class=\"alert alert-warning\">\n * **Note:** This document is an in-depth reference of all directive options.\n * For a gentle introduction to directives with examples of common use cases,\n * see the {@link guide/directive directive guide}.\n * </div>\n *\n * ## Comprehensive Directive API\n *\n * There are many different options for a directive.\n *\n * The difference resides in the return value of the factory function.\n * You can either return a {@link $compile#directive-definition-object Directive Definition Object (see below)}\n * that defines the directive properties, or just the `postLink` function (all other properties will have\n * the default values).\n *\n * <div class=\"alert alert-success\">\n * **Best Practice:** It's recommended to use the \"directive definition object\" form.\n * </div>\n *\n * Here's an example directive declared with a Directive Definition Object:\n *\n * ```js\n *   var myModule = angular.module(...);\n *\n *   myModule.directive('directiveName', function factory(injectables) {\n *     var directiveDefinitionObject = {\n *       {@link $compile#-priority- priority}: 0,\n *       {@link $compile#-template- template}: '<div></div>', // or // function(tElement, tAttrs) { ... },\n *       // or\n *       // {@link $compile#-templateurl- templateUrl}: 'directive.html', // or // function(tElement, tAttrs) { ... },\n *       {@link $compile#-transclude- transclude}: false,\n *       {@link $compile#-restrict- restrict}: 'A',\n *       {@link $compile#-templatenamespace- templateNamespace}: 'html',\n *       {@link $compile#-scope- scope}: false,\n *       {@link $compile#-controller- controller}: function($scope, $element, $attrs, $transclude, otherInjectables) { ... },\n *       {@link $compile#-controlleras- controllerAs}: 'stringIdentifier',\n *       {@link $compile#-bindtocontroller- bindToController}: false,\n *       {@link $compile#-require- require}: 'siblingDirectiveName', // or // ['^parentDirectiveName', '?optionalDirectiveName', '?^optionalParent'],\n *       {@link $compile#-multielement- multiElement}: false,\n *       {@link $compile#-compile- compile}: function compile(tElement, tAttrs, transclude) {\n *         return {\n *            {@link $compile#pre-linking-function pre}: function preLink(scope, iElement, iAttrs, controller) { ... },\n *            {@link $compile#post-linking-function post}: function postLink(scope, iElement, iAttrs, controller) { ... }\n *         }\n *         // or\n *         // return function postLink( ... ) { ... }\n *       },\n *       // or\n *       // {@link $compile#-link- link}: {\n *       //  {@link $compile#pre-linking-function pre}: function preLink(scope, iElement, iAttrs, controller) { ... },\n *       //  {@link $compile#post-linking-function post}: function postLink(scope, iElement, iAttrs, controller) { ... }\n *       // }\n *       // or\n *       // {@link $compile#-link- link}: function postLink( ... ) { ... }\n *     };\n *     return directiveDefinitionObject;\n *   });\n * ```\n *\n * <div class=\"alert alert-warning\">\n * **Note:** Any unspecified options will use the default value. You can see the default values below.\n * </div>\n *\n * Therefore the above can be simplified as:\n *\n * ```js\n *   var myModule = angular.module(...);\n *\n *   myModule.directive('directiveName', function factory(injectables) {\n *     var directiveDefinitionObject = {\n *       link: function postLink(scope, iElement, iAttrs) { ... }\n *     };\n *     return directiveDefinitionObject;\n *     // or\n *     // return function postLink(scope, iElement, iAttrs) { ... }\n *   });\n * ```\n *\n * ### Life-cycle hooks\n * Directive controllers can provide the following methods that are called by Angular at points in the life-cycle of the\n * directive:\n * * `$onInit()` - Called on each controller after all the controllers on an element have been constructed and\n *   had their bindings initialized (and before the pre &amp; post linking functions for the directives on\n *   this element). This is a good place to put initialization code for your controller.\n * * `$onChanges(changesObj)` - Called whenever one-way (`<`) or interpolation (`@`) bindings are updated. The\n *   `changesObj` is a hash whose keys are the names of the bound properties that have changed, and the values are an\n *   object of the form `{ currentValue, previousValue, isFirstChange() }`. Use this hook to trigger updates within a\n *   component such as cloning the bound value to prevent accidental mutation of the outer value. Note that this will\n *   also be called when your bindings are initialized.\n * * `$doCheck()` - Called on each turn of the digest cycle. Provides an opportunity to detect and act on\n *   changes. Any actions that you wish to take in response to the changes that you detect must be\n *   invoked from this hook; implementing this has no effect on when `$onChanges` is called. For example, this hook\n *   could be useful if you wish to perform a deep equality check, or to check a Date object, changes to which would not\n *   be detected by Angular's change detector and thus not trigger `$onChanges`. This hook is invoked with no arguments;\n *   if detecting changes, you must store the previous value(s) for comparison to the current values.\n * * `$onDestroy()` - Called on a controller when its containing scope is destroyed. Use this hook for releasing\n *   external resources, watches and event handlers. Note that components have their `$onDestroy()` hooks called in\n *   the same order as the `$scope.$broadcast` events are triggered, which is top down. This means that parent\n *   components will have their `$onDestroy()` hook called before child components.\n * * `$postLink()` - Called after this controller's element and its children have been linked. Similar to the post-link\n *   function this hook can be used to set up DOM event handlers and do direct DOM manipulation.\n *   Note that child elements that contain `templateUrl` directives will not have been compiled and linked since\n *   they are waiting for their template to load asynchronously and their own compilation and linking has been\n *   suspended until that occurs.\n *\n * #### Comparison with Angular 2 life-cycle hooks\n * Angular 2 also uses life-cycle hooks for its components. While the Angular 1 life-cycle hooks are similar there are\n * some differences that you should be aware of, especially when it comes to moving your code from Angular 1 to Angular 2:\n *\n * * Angular 1 hooks are prefixed with `$`, such as `$onInit`. Angular 2 hooks are prefixed with `ng`, such as `ngOnInit`.\n * * Angular 1 hooks can be defined on the controller prototype or added to the controller inside its constructor.\n *   In Angular 2 you can only define hooks on the prototype of the Component class.\n * * Due to the differences in change-detection, you may get many more calls to `$doCheck` in Angular 1 than you would to\n *   `ngDoCheck` in Angular 2\n * * Changes to the model inside `$doCheck` will trigger new turns of the digest loop, which will cause the changes to be\n *   propagated throughout the application.\n *   Angular 2 does not allow the `ngDoCheck` hook to trigger a change outside of the component. It will either throw an\n *   error or do nothing depending upon the state of `enableProdMode()`.\n *\n * #### Life-cycle hook examples\n *\n * This example shows how you can check for mutations to a Date object even though the identity of the object\n * has not changed.\n *\n * <example name=\"doCheckDateExample\" module=\"do-check-module\">\n *   <file name=\"app.js\">\n *     angular.module('do-check-module', [])\n *       .component('app', {\n *         template:\n *           'Month: <input ng-model=\"$ctrl.month\" ng-change=\"$ctrl.updateDate()\">' +\n *           'Date: {{ $ctrl.date }}' +\n *           '<test date=\"$ctrl.date\"></test>',\n *         controller: function() {\n *           this.date = new Date();\n *           this.month = this.date.getMonth();\n *           this.updateDate = function() {\n *             this.date.setMonth(this.month);\n *           };\n *         }\n *       })\n *       .component('test', {\n *         bindings: { date: '<' },\n *         template:\n *           '<pre>{{ $ctrl.log | json }}</pre>',\n *         controller: function() {\n *           var previousValue;\n *           this.log = [];\n *           this.$doCheck = function() {\n *             var currentValue = this.date && this.date.valueOf();\n *             if (previousValue !== currentValue) {\n *               this.log.push('doCheck: date mutated: ' + this.date);\n *               previousValue = currentValue;\n *             }\n *           };\n *         }\n *       });\n *   </file>\n *   <file name=\"index.ced81ed4.html\">\n *     <app></app>\n *   </file>\n * </example>\n *\n * This example show how you might use `$doCheck` to trigger changes in your component's inputs even if the\n * actual identity of the component doesn't change. (Be aware that cloning and deep equality checks on large\n * arrays or objects can have a negative impact on your application performance)\n *\n * <example name=\"doCheckArrayExample\" module=\"do-check-module\">\n *   <file name=\"index.ced81ed4.html\">\n *     <div ng-init=\"items = []\">\n *       <button ng-click=\"items.push(items.length)\">Add Item</button>\n *       <button ng-click=\"items = []\">Reset Items</button>\n *       <pre>{{ items }}</pre>\n *       <test items=\"items\"></test>\n *     </div>\n *   </file>\n *   <file name=\"app.js\">\n *      angular.module('do-check-module', [])\n *        .component('test', {\n *          bindings: { items: '<' },\n *          template:\n *            '<pre>{{ $ctrl.log | json }}</pre>',\n *          controller: function() {\n *            this.log = [];\n *\n *            this.$doCheck = function() {\n *              if (this.items_ref !== this.items) {\n *                this.log.push('doCheck: items changed');\n *                this.items_ref = this.items;\n *              }\n *              if (!angular.equals(this.items_clone, this.items)) {\n *                this.log.push('doCheck: items mutated');\n *                this.items_clone = angular.copy(this.items);\n *              }\n *            };\n *          }\n *        });\n *   </file>\n * </example>\n *\n *\n * ### Directive Definition Object\n *\n * The directive definition object provides instructions to the {@link ng.$compile\n * compiler}. The attributes are:\n *\n * #### `multiElement`\n * When this property is set to true (default is `false`), the HTML compiler will collect DOM nodes between\n * nodes with the attributes `directive-name-start` and `directive-name-end`, and group them\n * together as the directive elements. It is recommended that this feature be used on directives\n * which are not strictly behavioral (such as {@link ngClick}), and which\n * do not manipulate or replace child nodes (such as {@link ngInclude}).\n *\n * #### `priority`\n * When there are multiple directives defined on a single DOM element, sometimes it\n * is necessary to specify the order in which the directives are applied. The `priority` is used\n * to sort the directives before their `compile` functions get called. Priority is defined as a\n * number. Directives with greater numerical `priority` are compiled first. Pre-link functions\n * are also run in priority order, but post-link functions are run in reverse order. The order\n * of directives with the same priority is undefined. The default priority is `0`.\n *\n * #### `terminal`\n * If set to true then the current `priority` will be the last set of directives\n * which will execute (any directives at the current priority will still execute\n * as the order of execution on same `priority` is undefined). Note that expressions\n * and other directives used in the directive's template will also be excluded from execution.\n *\n * #### `scope`\n * The scope property can be `false`, `true`, or an object:\n *\n * * **`false` (default):** No scope will be created for the directive. The directive will use its\n * parent's scope.\n *\n * * **`true`:** A new child scope that prototypically inherits from its parent will be created for\n * the directive's element. If multiple directives on the same element request a new scope,\n * only one new scope is created.\n *\n * * **`{...}` (an object hash):** A new \"isolate\" scope is created for the directive's template.\n * The 'isolate' scope differs from normal scope in that it does not prototypically\n * inherit from its parent scope. This is useful when creating reusable components, which should not\n * accidentally read or modify data in the parent scope. Note that an isolate scope\n * directive without a `template` or `templateUrl` will not apply the isolate scope\n * to its children elements.\n *\n * The 'isolate' scope object hash defines a set of local scope properties derived from attributes on the\n * directive's element. These local properties are useful for aliasing values for templates. The keys in\n * the object hash map to the name of the property on the isolate scope; the values define how the property\n * is bound to the parent scope, via matching attributes on the directive's element:\n *\n * * `@` or `@attr` - bind a local scope property to the value of DOM attribute. The result is\n *   always a string since DOM attributes are strings. If no `attr` name is specified then the\n *   attribute name is assumed to be the same as the local name. Given `<my-component\n *   my-attr=\"hello {{name}}\">` and the isolate scope definition `scope: { localName:'@myAttr' }`,\n *   the directive's scope property `localName` will reflect the interpolated value of `hello\n *   {{name}}`. As the `name` attribute changes so will the `localName` property on the directive's\n *   scope. The `name` is read from the parent scope (not the directive's scope).\n *\n * * `=` or `=attr` - set up a bidirectional binding between a local scope property and an expression\n *   passed via the attribute `attr`. The expression is evaluated in the context of the parent scope.\n *   If no `attr` name is specified then the attribute name is assumed to be the same as the local\n *   name. Given `<my-component my-attr=\"parentModel\">` and the isolate scope definition `scope: {\n *   localModel: '=myAttr' }`, the property `localModel` on the directive's scope will reflect the\n *   value of `parentModel` on the parent scope. Changes to `parentModel` will be reflected in\n *   `localModel` and vice versa. Optional attributes should be marked as such with a question mark:\n *   `=?` or `=?attr`. If the binding expression is non-assignable, or if the attribute isn't\n *   optional and doesn't exist, an exception ({@link error/$compile/nonassign `$compile:nonassign`})\n *   will be thrown upon discovering changes to the local value, since it will be impossible to sync\n *   them back to the parent scope. By default, the {@link ng.$rootScope.Scope#$watch `$watch`}\n *   method is used for tracking changes, and the equality check is based on object identity.\n *   However, if an object literal or an array literal is passed as the binding expression, the\n *   equality check is done by value (using the {@link angular.equals} function). It's also possible\n *   to watch the evaluated value shallowly with {@link ng.$rootScope.Scope#$watchCollection\n *   `$watchCollection`}: use `=*` or `=*attr` (`=*?` or `=*?attr` if the attribute is optional).\n *\n  * * `<` or `<attr` - set up a one-way (one-directional) binding between a local scope property and an\n *   expression passed via the attribute `attr`. The expression is evaluated in the context of the\n *   parent scope. If no `attr` name is specified then the attribute name is assumed to be the same as the\n *   local name. You can also make the binding optional by adding `?`: `<?` or `<?attr`.\n *\n *   For example, given `<my-component my-attr=\"parentModel\">` and directive definition of\n *   `scope: { localModel:'<myAttr' }`, then the isolated scope property `localModel` will reflect the\n *   value of `parentModel` on the parent scope. Any changes to `parentModel` will be reflected\n *   in `localModel`, but changes in `localModel` will not reflect in `parentModel`. There are however\n *   two caveats:\n *     1. one-way binding does not copy the value from the parent to the isolate scope, it simply\n *     sets the same value. That means if your bound value is an object, changes to its properties\n *     in the isolated scope will be reflected in the parent scope (because both reference the same object).\n *     2. one-way binding watches changes to the **identity** of the parent value. That means the\n *     {@link ng.$rootScope.Scope#$watch `$watch`} on the parent value only fires if the reference\n *     to the value has changed. In most cases, this should not be of concern, but can be important\n *     to know if you one-way bind to an object, and then replace that object in the isolated scope.\n *     If you now change a property of the object in your parent scope, the change will not be\n *     propagated to the isolated scope, because the identity of the object on the parent scope\n *     has not changed. Instead you must assign a new object.\n *\n *   One-way binding is useful if you do not plan to propagate changes to your isolated scope bindings\n *   back to the parent. However, it does not make this completely impossible.\n *\n * * `&` or `&attr` - provides a way to execute an expression in the context of the parent scope. If\n *   no `attr` name is specified then the attribute name is assumed to be the same as the local name.\n *   Given `<my-component my-attr=\"count = count + value\">` and the isolate scope definition `scope: {\n *   localFn:'&myAttr' }`, the isolate scope property `localFn` will point to a function wrapper for\n *   the `count = count + value` expression. Often it's desirable to pass data from the isolated scope\n *   via an expression to the parent scope. This can be done by passing a map of local variable names\n *   and values into the expression wrapper fn. For example, if the expression is `increment(amount)`\n *   then we can specify the amount value by calling the `localFn` as `localFn({amount: 22})`.\n *\n * In general it's possible to apply more than one directive to one element, but there might be limitations\n * depending on the type of scope required by the directives. The following points will help explain these limitations.\n * For simplicity only two directives are taken into account, but it is also applicable for several directives:\n *\n * * **no scope** + **no scope** => Two directives which don't require their own scope will use their parent's scope\n * * **child scope** + **no scope** =>  Both directives will share one single child scope\n * * **child scope** + **child scope** =>  Both directives will share one single child scope\n * * **isolated scope** + **no scope** =>  The isolated directive will use it's own created isolated scope. The other directive will use\n * its parent's scope\n * * **isolated scope** + **child scope** =>  **Won't work!** Only one scope can be related to one element. Therefore these directives cannot\n * be applied to the same element.\n * * **isolated scope** + **isolated scope**  =>  **Won't work!** Only one scope can be related to one element. Therefore these directives\n * cannot be applied to the same element.\n *\n *\n * #### `bindToController`\n * This property is used to bind scope properties directly to the controller. It can be either\n * `true` or an object hash with the same format as the `scope` property.\n *\n * When an isolate scope is used for a directive (see above), `bindToController: true` will\n * allow a component to have its properties bound to the controller, rather than to scope.\n *\n * After the controller is instantiated, the initial values of the isolate scope bindings will be bound to the controller\n * properties. You can access these bindings once they have been initialized by providing a controller method called\n * `$onInit`, which is called after all the controllers on an element have been constructed and had their bindings\n * initialized.\n *\n * <div class=\"alert alert-warning\">\n * **Deprecation warning:** if `$compileProcvider.preAssignBindingsEnabled(true)` was called, bindings for non-ES6 class\n * controllers are bound to `this` before the controller constructor is called but this use is now deprecated. Please\n * place initialization code that relies upon bindings inside a `$onInit` method on the controller, instead.\n * </div>\n *\n * It is also possible to set `bindToController` to an object hash with the same format as the `scope` property.\n * This will set up the scope bindings to the controller directly. Note that `scope` can still be used\n * to define which kind of scope is created. By default, no scope is created. Use `scope: {}` to create an isolate\n * scope (useful for component directives).\n *\n * If both `bindToController` and `scope` are defined and have object hashes, `bindToController` overrides `scope`.\n *\n *\n * #### `controller`\n * Controller constructor function. The controller is instantiated before the\n * pre-linking phase and can be accessed by other directives (see\n * `require` attribute). This allows the directives to communicate with each other and augment\n * each other's behavior. The controller is injectable (and supports bracket notation) with the following locals:\n *\n * * `$scope` - Current scope associated with the element\n * * `$element` - Current element\n * * `$attrs` - Current attributes object for the element\n * * `$transclude` - A transclude linking function pre-bound to the correct transclusion scope:\n *   `function([scope], cloneLinkingFn, futureParentElement, slotName)`:\n *    * `scope`: (optional) override the scope.\n *    * `cloneLinkingFn`: (optional) argument to create clones of the original transcluded content.\n *    * `futureParentElement` (optional):\n *        * defines the parent to which the `cloneLinkingFn` will add the cloned elements.\n *        * default: `$element.parent()` resp. `$element` for `transclude:'element'` resp. `transclude:true`.\n *        * only needed for transcludes that are allowed to contain non html elements (e.g. SVG elements)\n *          and when the `cloneLinkingFn` is passed,\n *          as those elements need to created and cloned in a special way when they are defined outside their\n *          usual containers (e.g. like `<svg>`).\n *        * See also the `directive.templateNamespace` property.\n *    * `slotName`: (optional) the name of the slot to transclude. If falsy (e.g. `null`, `undefined` or `''`)\n *      then the default transclusion is provided.\n *    The `$transclude` function also has a method on it, `$transclude.isSlotFilled(slotName)`, which returns\n *    `true` if the specified slot contains content (i.e. one or more DOM nodes).\n *\n * #### `require`\n * Require another directive and inject its controller as the fourth argument to the linking function. The\n * `require` property can be a string, an array or an object:\n * * a **string** containing the name of the directive to pass to the linking function\n * * an **array** containing the names of directives to pass to the linking function. The argument passed to the\n * linking function will be an array of controllers in the same order as the names in the `require` property\n * * an **object** whose property values are the names of the directives to pass to the linking function. The argument\n * passed to the linking function will also be an object with matching keys, whose values will hold the corresponding\n * controllers.\n *\n * If the `require` property is an object and `bindToController` is truthy, then the required controllers are\n * bound to the controller using the keys of the `require` property. This binding occurs after all the controllers\n * have been constructed but before `$onInit` is called.\n * If the name of the required controller is the same as the local name (the key), the name can be\n * omitted. For example, `{parentDir: '^^'}` is equivalent to `{parentDir: '^^parentDir'}`.\n * See the {@link $compileProvider#component} helper for an example of how this can be used.\n * If no such required directive(s) can be found, or if the directive does not have a controller, then an error is\n * raised (unless no link function is specified and the required controllers are not being bound to the directive\n * controller, in which case error checking is skipped). The name can be prefixed with:\n *\n * * (no prefix) - Locate the required controller on the current element. Throw an error if not found.\n * * `?` - Attempt to locate the required controller or pass `null` to the `link` fn if not found.\n * * `^` - Locate the required controller by searching the element and its parents. Throw an error if not found.\n * * `^^` - Locate the required controller by searching the element's parents. Throw an error if not found.\n * * `?^` - Attempt to locate the required controller by searching the element and its parents or pass\n *   `null` to the `link` fn if not found.\n * * `?^^` - Attempt to locate the required controller by searching the element's parents, or pass\n *   `null` to the `link` fn if not found.\n *\n *\n * #### `controllerAs`\n * Identifier name for a reference to the controller in the directive's scope.\n * This allows the controller to be referenced from the directive template. This is especially\n * useful when a directive is used as component, i.e. with an `isolate` scope. It's also possible\n * to use it in a directive without an `isolate` / `new` scope, but you need to be aware that the\n * `controllerAs` reference might overwrite a property that already exists on the parent scope.\n *\n *\n * #### `restrict`\n * String of subset of `EACM` which restricts the directive to a specific directive\n * declaration style. If omitted, the defaults (elements and attributes) are used.\n *\n * * `E` - Element name (default): `<my-directive></my-directive>`\n * * `A` - Attribute (default): `<div my-directive=\"exp\"></div>`\n * * `C` - Class: `<div class=\"my-directive: exp;\"></div>`\n * * `M` - Comment: `<!-- directive: my-directive exp -->`\n *\n *\n * #### `templateNamespace`\n * String representing the document type used by the markup in the template.\n * AngularJS needs this information as those elements need to be created and cloned\n * in a special way when they are defined outside their usual containers like `<svg>` and `<math>`.\n *\n * * `html` - All root nodes in the template are HTML. Root nodes may also be\n *   top-level elements such as `<svg>` or `<math>`.\n * * `svg` - The root nodes in the template are SVG elements (excluding `<math>`).\n * * `math` - The root nodes in the template are MathML elements (excluding `<svg>`).\n *\n * If no `templateNamespace` is specified, then the namespace is considered to be `html`.\n *\n * #### `template`\n * HTML markup that may:\n * * Replace the contents of the directive's element (default).\n * * Replace the directive's element itself (if `replace` is true - DEPRECATED).\n * * Wrap the contents of the directive's element (if `transclude` is true).\n *\n * Value may be:\n *\n * * A string. For example `<div red-on-hover>{{delete_str}}</div>`.\n * * A function which takes two arguments `tElement` and `tAttrs` (described in the `compile`\n *   function api below) and returns a string value.\n *\n *\n * #### `templateUrl`\n * This is similar to `template` but the template is loaded from the specified URL, asynchronously.\n *\n * Because template loading is asynchronous the compiler will suspend compilation of directives on that element\n * for later when the template has been resolved.  In the meantime it will continue to compile and link\n * sibling and parent elements as though this element had not contained any directives.\n *\n * The compiler does not suspend the entire compilation to wait for templates to be loaded because this\n * would result in the whole app \"stalling\" until all templates are loaded asynchronously - even in the\n * case when only one deeply nested directive has `templateUrl`.\n *\n * Template loading is asynchronous even if the template has been preloaded into the {@link $templateCache}\n *\n * You can specify `templateUrl` as a string representing the URL or as a function which takes two\n * arguments `tElement` and `tAttrs` (described in the `compile` function api below) and returns\n * a string value representing the url.  In either case, the template URL is passed through {@link\n * $sce#getTrustedResourceUrl $sce.getTrustedResourceUrl}.\n *\n *\n * #### `replace` ([*DEPRECATED*!], will be removed in next major release - i.e. v2.0)\n * specify what the template should replace. Defaults to `false`.\n *\n * * `true` - the template will replace the directive's element.\n * * `false` - the template will replace the contents of the directive's element.\n *\n * The replacement process migrates all of the attributes / classes from the old element to the new\n * one. See the {@link guide/directive#template-expanding-directive\n * Directives Guide} for an example.\n *\n * There are very few scenarios where element replacement is required for the application function,\n * the main one being reusable custom components that are used within SVG contexts\n * (because SVG doesn't work with custom elements in the DOM tree).\n *\n * #### `transclude`\n * Extract the contents of the element where the directive appears and make it available to the directive.\n * The contents are compiled and provided to the directive as a **transclusion function**. See the\n * {@link $compile#transclusion Transclusion} section below.\n *\n *\n * #### `compile`\n *\n * ```js\n *   function compile(tElement, tAttrs, transclude) { ... }\n * ```\n *\n * The compile function deals with transforming the template DOM. Since most directives do not do\n * template transformation, it is not used often. The compile function takes the following arguments:\n *\n *   * `tElement` - template element - The element where the directive has been declared. It is\n *     safe to do template transformation on the element and child elements only.\n *\n *   * `tAttrs` - template attributes - Normalized list of attributes declared on this element shared\n *     between all directive compile functions.\n *\n *   * `transclude` -  [*DEPRECATED*!] A transclude linking function: `function(scope, cloneLinkingFn)`\n *\n * <div class=\"alert alert-warning\">\n * **Note:** The template instance and the link instance may be different objects if the template has\n * been cloned. For this reason it is **not** safe to do anything other than DOM transformations that\n * apply to all cloned DOM nodes within the compile function. Specifically, DOM listener registration\n * should be done in a linking function rather than in a compile function.\n * </div>\n\n * <div class=\"alert alert-warning\">\n * **Note:** The compile function cannot handle directives that recursively use themselves in their\n * own templates or compile functions. Compiling these directives results in an infinite loop and\n * stack overflow errors.\n *\n * This can be avoided by manually using $compile in the postLink function to imperatively compile\n * a directive's template instead of relying on automatic template compilation via `template` or\n * `templateUrl` declaration or manual compilation inside the compile function.\n * </div>\n *\n * <div class=\"alert alert-danger\">\n * **Note:** The `transclude` function that is passed to the compile function is deprecated, as it\n *   e.g. does not know about the right outer scope. Please use the transclude function that is passed\n *   to the link function instead.\n * </div>\n\n * A compile function can have a return value which can be either a function or an object.\n *\n * * returning a (post-link) function - is equivalent to registering the linking function via the\n *   `link` property of the config object when the compile function is empty.\n *\n * * returning an object with function(s) registered via `pre` and `post` properties - allows you to\n *   control when a linking function should be called during the linking phase. See info about\n *   pre-linking and post-linking functions below.\n *\n *\n * #### `link`\n * This property is used only if the `compile` property is not defined.\n *\n * ```js\n *   function link(scope, iElement, iAttrs, controller, transcludeFn) { ... }\n * ```\n *\n * The link function is responsible for registering DOM listeners as well as updating the DOM. It is\n * executed after the template has been cloned. This is where most of the directive logic will be\n * put.\n *\n *   * `scope` - {@link ng.$rootScope.Scope Scope} - The scope to be used by the\n *     directive for registering {@link ng.$rootScope.Scope#$watch watches}.\n *\n *   * `iElement` - instance element - The element where the directive is to be used. It is safe to\n *     manipulate the children of the element only in `postLink` function since the children have\n *     already been linked.\n *\n *   * `iAttrs` - instance attributes - Normalized list of attributes declared on this element shared\n *     between all directive linking functions.\n *\n *   * `controller` - the directive's required controller instance(s) - Instances are shared\n *     among all directives, which allows the directives to use the controllers as a communication\n *     channel. The exact value depends on the directive's `require` property:\n *       * no controller(s) required: the directive's own controller, or `undefined` if it doesn't have one\n *       * `string`: the controller instance\n *       * `array`: array of controller instances\n *\n *     If a required controller cannot be found, and it is optional, the instance is `null`,\n *     otherwise the {@link error:$compile:ctreq Missing Required Controller} error is thrown.\n *\n *     Note that you can also require the directive's own controller - it will be made available like\n *     any other controller.\n *\n *   * `transcludeFn` - A transclude linking function pre-bound to the correct transclusion scope.\n *     This is the same as the `$transclude` parameter of directive controllers,\n *     see {@link ng.$compile#-controller- the controller section for details}.\n *     `function([scope], cloneLinkingFn, futureParentElement)`.\n *\n * #### Pre-linking function\n *\n * Executed before the child elements are linked. Not safe to do DOM transformation since the\n * compiler linking function will fail to locate the correct elements for linking.\n *\n * #### Post-linking function\n *\n * Executed after the child elements are linked.\n *\n * Note that child elements that contain `templateUrl` directives will not have been compiled\n * and linked since they are waiting for their template to load asynchronously and their own\n * compilation and linking has been suspended until that occurs.\n *\n * It is safe to do DOM transformation in the post-linking function on elements that are not waiting\n * for their async templates to be resolved.\n *\n *\n * ### Transclusion\n *\n * Transclusion is the process of extracting a collection of DOM elements from one part of the DOM and\n * copying them to another part of the DOM, while maintaining their connection to the original AngularJS\n * scope from where they were taken.\n *\n * Transclusion is used (often with {@link ngTransclude}) to insert the\n * original contents of a directive's element into a specified place in the template of the directive.\n * The benefit of transclusion, over simply moving the DOM elements manually, is that the transcluded\n * content has access to the properties on the scope from which it was taken, even if the directive\n * has isolated scope.\n * See the {@link guide/directive#creating-a-directive-that-wraps-other-elements Directives Guide}.\n *\n * This makes it possible for the widget to have private state for its template, while the transcluded\n * content has access to its originating scope.\n *\n * <div class=\"alert alert-warning\">\n * **Note:** When testing an element transclude directive you must not place the directive at the root of the\n * DOM fragment that is being compiled. See {@link guide/unit-testing#testing-transclusion-directives\n * Testing Transclusion Directives}.\n * </div>\n *\n * There are three kinds of transclusion depending upon whether you want to transclude just the contents of the\n * directive's element, the entire element or multiple parts of the element contents:\n *\n * * `true` - transclude the content (i.e. the child nodes) of the directive's element.\n * * `'element'` - transclude the whole of the directive's element including any directives on this\n *   element that defined at a lower priority than this directive. When used, the `template`\n *   property is ignored.\n * * **`{...}` (an object hash):** - map elements of the content onto transclusion \"slots\" in the template.\n *\n * **Mult-slot transclusion** is declared by providing an object for the `transclude` property.\n *\n * This object is a map where the keys are the name of the slot to fill and the value is an element selector\n * used to match the HTML to the slot. The element selector should be in normalized form (e.g. `myElement`)\n * and will match the standard element variants (e.g. `my-element`, `my:element`, `data-my-element`, etc).\n *\n * For further information check out the guide on {@link guide/directive#matching-directives Matching Directives}\n *\n * If the element selector is prefixed with a `?` then that slot is optional.\n *\n * For example, the transclude object `{ slotA: '?myCustomElement' }` maps `<my-custom-element>` elements to\n * the `slotA` slot, which can be accessed via the `$transclude` function or via the {@link ngTransclude} directive.\n *\n * Slots that are not marked as optional (`?`) will trigger a compile time error if there are no matching elements\n * in the transclude content. If you wish to know if an optional slot was filled with content, then you can call\n * `$transclude.isSlotFilled(slotName)` on the transclude function passed to the directive's link function and\n * injectable into the directive's controller.\n *\n *\n * #### Transclusion Functions\n *\n * When a directive requests transclusion, the compiler extracts its contents and provides a **transclusion\n * function** to the directive's `link` function and `controller`. This transclusion function is a special\n * **linking function** that will return the compiled contents linked to a new transclusion scope.\n *\n * <div class=\"alert alert-info\">\n * If you are just using {@link ngTransclude} then you don't need to worry about this function, since\n * ngTransclude will deal with it for us.\n * </div>\n *\n * If you want to manually control the insertion and removal of the transcluded content in your directive\n * then you must use this transclude function. When you call a transclude function it returns a a jqLite/JQuery\n * object that contains the compiled DOM, which is linked to the correct transclusion scope.\n *\n * When you call a transclusion function you can pass in a **clone attach function**. This function accepts\n * two parameters, `function(clone, scope) { ... }`, where the `clone` is a fresh compiled copy of your transcluded\n * content and the `scope` is the newly created transclusion scope, which the clone will be linked to.\n *\n * <div class=\"alert alert-info\">\n * **Best Practice**: Always provide a `cloneFn` (clone attach function) when you call a transclude function\n * since you then get a fresh clone of the original DOM and also have access to the new transclusion scope.\n * </div>\n *\n * It is normal practice to attach your transcluded content (`clone`) to the DOM inside your **clone\n * attach function**:\n *\n * ```js\n * var transcludedContent, transclusionScope;\n *\n * $transclude(function(clone, scope) {\n *   element.append(clone);\n *   transcludedContent = clone;\n *   transclusionScope = scope;\n * });\n * ```\n *\n * Later, if you want to remove the transcluded content from your DOM then you should also destroy the\n * associated transclusion scope:\n *\n * ```js\n * transcludedContent.remove();\n * transclusionScope.$destroy();\n * ```\n *\n * <div class=\"alert alert-info\">\n * **Best Practice**: if you intend to add and remove transcluded content manually in your directive\n * (by calling the transclude function to get the DOM and calling `element.remove()` to remove it),\n * then you are also responsible for calling `$destroy` on the transclusion scope.\n * </div>\n *\n * The built-in DOM manipulation directives, such as {@link ngIf}, {@link ngSwitch} and {@link ngRepeat}\n * automatically destroy their transcluded clones as necessary so you do not need to worry about this if\n * you are simply using {@link ngTransclude} to inject the transclusion into your directive.\n *\n *\n * #### Transclusion Scopes\n *\n * When you call a transclude function it returns a DOM fragment that is pre-bound to a **transclusion\n * scope**. This scope is special, in that it is a child of the directive's scope (and so gets destroyed\n * when the directive's scope gets destroyed) but it inherits the properties of the scope from which it\n * was taken.\n *\n * For example consider a directive that uses transclusion and isolated scope. The DOM hierarchy might look\n * like this:\n *\n * ```html\n * <div ng-app>\n *   <div isolate>\n *     <div transclusion>\n *     </div>\n *   </div>\n * </div>\n * ```\n *\n * The `$parent` scope hierarchy will look like this:\n *\n   ```\n   - $rootScope\n     - isolate\n       - transclusion\n   ```\n *\n * but the scopes will inherit prototypically from different scopes to their `$parent`.\n *\n   ```\n   - $rootScope\n     - transclusion\n   - isolate\n   ```\n *\n *\n * ### Attributes\n *\n * The {@link ng.$compile.directive.Attributes Attributes} object - passed as a parameter in the\n * `link()` or `compile()` functions. It has a variety of uses.\n *\n * * *Accessing normalized attribute names:* Directives like 'ngBind' can be expressed in many ways:\n *   'ng:bind', `data-ng-bind`, or 'x-ng-bind'. The attributes object allows for normalized access\n *   to the attributes.\n *\n * * *Directive inter-communication:* All directives share the same instance of the attributes\n *   object which allows the directives to use the attributes object as inter directive\n *   communication.\n *\n * * *Supports interpolation:* Interpolation attributes are assigned to the attribute object\n *   allowing other directives to read the interpolated value.\n *\n * * *Observing interpolated attributes:* Use `$observe` to observe the value changes of attributes\n *   that contain interpolation (e.g. `src=\"{{bar}}\"`). Not only is this very efficient but it's also\n *   the only way to easily get the actual value because during the linking phase the interpolation\n *   hasn't been evaluated yet and so the value is at this time set to `undefined`.\n *\n * ```js\n * function linkingFn(scope, elm, attrs, ctrl) {\n *   // get the attribute value\n *   console.log(attrs.ngModel);\n *\n *   // change the attribute\n *   attrs.$set('ngModel', 'new value');\n *\n *   // observe changes to interpolated attribute\n *   attrs.$observe('ngModel', function(value) {\n *     console.log('ngModel has changed value to ' + value);\n *   });\n * }\n * ```\n *\n * ## Example\n *\n * <div class=\"alert alert-warning\">\n * **Note**: Typically directives are registered with `module.directive`. The example below is\n * to illustrate how `$compile` works.\n * </div>\n *\n <example module=\"compileExample\" name=\"compile\">\n   <file name=\"index.ced81ed4.html\">\n    <script>\n      angular.module('compileExample', [], function($compileProvider) {\n        // configure new 'compile' directive by passing a directive\n        // factory function. The factory function injects the '$compile'\n        $compileProvider.directive('compile', function($compile) {\n          // directive factory creates a link function\n          return function(scope, element, attrs) {\n            scope.$watch(\n              function(scope) {\n                 // watch the 'compile' expression for changes\n                return scope.$eval(attrs.compile);\n              },\n              function(value) {\n                // when the 'compile' expression changes\n                // assign it into the current DOM\n                element.html(value);\n\n                // compile the new DOM and link it to the current\n                // scope.\n                // NOTE: we only compile .childNodes so that\n                // we don't get into infinite loop compiling ourselves\n                $compile(element.contents())(scope);\n              }\n            );\n          };\n        });\n      })\n      .controller('GreeterController', ['$scope', function($scope) {\n        $scope.name = 'Angular';\n        $scope.html = 'Hello {{name}}';\n      }]);\n    </script>\n    <div ng-controller=\"GreeterController\">\n      <input ng-model=\"name\"> <br/>\n      <textarea ng-model=\"html\"></textarea> <br/>\n      <div compile=\"html\"></div>\n    </div>\n   </file>\n   <file name=\"protractor.js\" type=\"protractor\">\n     it('should auto compile', function() {\n       var textarea = $('textarea');\n       var output = $('div[compile]');\n       // The initial state reads 'Hello Angular'.\n       expect(output.getText()).toBe('Hello Angular');\n       textarea.clear();\n       textarea.sendKeys('{{name}}!');\n       expect(output.getText()).toBe('Angular!');\n     });\n   </file>\n </example>\n\n *\n *\n * @param {string|DOMElement} element Element or HTML string to compile into a template function.\n * @param {function(angular.Scope, cloneAttachFn=)} transclude function available to directives - DEPRECATED.\n *\n * <div class=\"alert alert-danger\">\n * **Note:** Passing a `transclude` function to the $compile function is deprecated, as it\n *   e.g. will not use the right outer scope. Please pass the transclude function as a\n *   `parentBoundTranscludeFn` to the link function instead.\n * </div>\n *\n * @param {number} maxPriority only apply directives lower than given priority (Only effects the\n *                 root element(s), not their children)\n * @returns {function(scope, cloneAttachFn=, options=)} a link function which is used to bind template\n * (a DOM element/tree) to a scope. Where:\n *\n *  * `scope` - A {@link ng.$rootScope.Scope Scope} to bind to.\n *  * `cloneAttachFn` - If `cloneAttachFn` is provided, then the link function will clone the\n *  `template` and call the `cloneAttachFn` function allowing the caller to attach the\n *  cloned elements to the DOM document at the appropriate place. The `cloneAttachFn` is\n *  called as: <br/> `cloneAttachFn(clonedElement, scope)` where:\n *\n *      * `clonedElement` - is a clone of the original `element` passed into the compiler.\n *      * `scope` - is the current scope with which the linking function is working with.\n *\n *  * `options` - An optional object hash with linking options. If `options` is provided, then the following\n *  keys may be used to control linking behavior:\n *\n *      * `parentBoundTranscludeFn` - the transclude function made available to\n *        directives; if given, it will be passed through to the link functions of\n *        directives found in `element` during compilation.\n *      * `transcludeControllers` - an object hash with keys that map controller names\n *        to a hash with the key `instance`, which maps to the controller instance;\n *        if given, it will make the controllers available to directives on the compileNode:\n *        ```\n *        {\n *          parent: {\n *            instance: parentControllerInstance\n *          }\n *        }\n *        ```\n *      * `futureParentElement` - defines the parent to which the `cloneAttachFn` will add\n *        the cloned elements; only needed for transcludes that are allowed to contain non html\n *        elements (e.g. SVG elements). See also the directive.controller property.\n *\n * Calling the linking function returns the element of the template. It is either the original\n * element passed in, or the clone of the element if the `cloneAttachFn` is provided.\n *\n * After linking the view is not updated until after a call to $digest which typically is done by\n * Angular automatically.\n *\n * If you need access to the bound view, there are two ways to do it:\n *\n * - If you are not asking the linking function to clone the template, create the DOM element(s)\n *   before you send them to the compiler and keep this reference around.\n *   ```js\n *     var element = $compile('<p>{{total}}</p>')(scope);\n *   ```\n *\n * - if on the other hand, you need the element to be cloned, the view reference from the original\n *   example would not point to the clone, but rather to the original template that was cloned. In\n *   this case, you can access the clone via the cloneAttachFn:\n *   ```js\n *     var templateElement = angular.element('<p>{{total}}</p>'),\n *         scope = ....;\n *\n *     var clonedElement = $compile(templateElement)(scope, function(clonedElement, scope) {\n *       //attach the clone to DOM document at the right place\n *     });\n *\n *     //now we have reference to the cloned DOM via `clonedElement`\n *   ```\n *\n *\n * For information on how the compiler works, see the\n * {@link guide/compiler Angular HTML Compiler} section of the Developer Guide.\n *\n * @knownIssue\n *\n * ### Double Compilation\n *\n   Double compilation occurs when an already compiled part of the DOM gets\n   compiled again. This is an undesired effect and can lead to misbehaving directives, performance issues,\n   and memory leaks. Refer to the Compiler Guide {@link guide/compiler#double-compilation-and-how-to-avoid-it\n   section on double compilation} for an in-depth explanation and ways to avoid it.\n *\n */\n\nvar $compileMinErr = minErr('$compile');\n\nfunction UNINITIALIZED_VALUE() {}\nvar _UNINITIALIZED_VALUE = new UNINITIALIZED_VALUE();\n\n/**\n * @ngdoc provider\n * @name $compileProvider\n *\n * @description\n */\n$CompileProvider.$inject = ['$provide', '$$sanitizeUriProvider'];\n/** @this */\nfunction $CompileProvider($provide, $$sanitizeUriProvider) {\n  var hasDirectives = {},\n      Suffix = 'Directive',\n      COMMENT_DIRECTIVE_REGEXP = /^\\s*directive:\\s*([\\w-]+)\\s+(.*)$/,\n      CLASS_DIRECTIVE_REGEXP = /(([\\w-]+)(?::([^;]+))?;?)/,\n      ALL_OR_NOTHING_ATTRS = makeMap('ngSrc,ngSrcset,src,srcset'),\n      REQUIRE_PREFIX_REGEXP = /^(?:(\\^\\^?)?(\\?)?(\\^\\^?)?)?/;\n\n  // Ref: http://developers.whatwg.org/webappapis.html#event-handler-idl-attributes\n  // The assumption is that future DOM event attribute names will begin with\n  // 'on' and be composed of only English letters.\n  var EVENT_HANDLER_ATTR_REGEXP = /^(on[a-z]+|formaction)$/;\n  var bindingCache = createMap();\n\n  function parseIsolateBindings(scope, directiveName, isController) {\n    var LOCAL_REGEXP = /^\\s*([@&<]|=(\\*?))(\\??)\\s*([\\w$]*)\\s*$/;\n\n    var bindings = createMap();\n\n    forEach(scope, function(definition, scopeName) {\n      if (definition in bindingCache) {\n        bindings[scopeName] = bindingCache[definition];\n        return;\n      }\n      var match = definition.match(LOCAL_REGEXP);\n\n      if (!match) {\n        throw $compileMinErr('iscp',\n            'Invalid {3} for directive \\'{0}\\'.' +\n            ' Definition: {... {1}: \\'{2}\\' ...}',\n            directiveName, scopeName, definition,\n            (isController ? 'controller bindings definition' :\n            'isolate scope definition'));\n      }\n\n      bindings[scopeName] = {\n        mode: match[1][0],\n        collection: match[2] === '*',\n        optional: match[3] === '?',\n        attrName: match[4] || scopeName\n      };\n      if (match[4]) {\n        bindingCache[definition] = bindings[scopeName];\n      }\n    });\n\n    return bindings;\n  }\n\n  function parseDirectiveBindings(directive, directiveName) {\n    var bindings = {\n      isolateScope: null,\n      bindToController: null\n    };\n    if (isObject(directive.scope)) {\n      if (directive.bindToController === true) {\n        bindings.bindToController = parseIsolateBindings(directive.scope,\n                                                         directiveName, true);\n        bindings.isolateScope = {};\n      } else {\n        bindings.isolateScope = parseIsolateBindings(directive.scope,\n                                                     directiveName, false);\n      }\n    }\n    if (isObject(directive.bindToController)) {\n      bindings.bindToController =\n          parseIsolateBindings(directive.bindToController, directiveName, true);\n    }\n    if (bindings.bindToController && !directive.controller) {\n      // There is no controller\n      throw $compileMinErr('noctrl',\n            'Cannot bind to controller without directive \\'{0}\\'s controller.',\n            directiveName);\n    }\n    return bindings;\n  }\n\n  function assertValidDirectiveName(name) {\n    var letter = name.charAt(0);\n    if (!letter || letter !== lowercase(letter)) {\n      throw $compileMinErr('baddir', 'Directive/Component name \\'{0}\\' is invalid. The first character must be a lowercase letter', name);\n    }\n    if (name !== name.trim()) {\n      throw $compileMinErr('baddir',\n            'Directive/Component name \\'{0}\\' is invalid. The name should not contain leading or trailing whitespaces',\n            name);\n    }\n  }\n\n  function getDirectiveRequire(directive) {\n    var require = directive.require || (directive.controller && directive.name);\n\n    if (!isArray(require) && isObject(require)) {\n      forEach(require, function(value, key) {\n        var match = value.match(REQUIRE_PREFIX_REGEXP);\n        var name = value.substring(match[0].length);\n        if (!name) require[key] = match[0] + key;\n      });\n    }\n\n    return require;\n  }\n\n  function getDirectiveRestrict(restrict, name) {\n    if (restrict && !(isString(restrict) && /[EACM]/.test(restrict))) {\n      throw $compileMinErr('badrestrict',\n          'Restrict property \\'{0}\\' of directive \\'{1}\\' is invalid',\n          restrict,\n          name);\n    }\n\n    return restrict || 'EA';\n  }\n\n  /**\n   * @ngdoc method\n   * @name $compileProvider#directive\n   * @kind function\n   *\n   * @description\n   * Register a new directive with the compiler.\n   *\n   * @param {string|Object} name Name of the directive in camel-case (i.e. <code>ngBind</code> which\n   *    will match as <code>ng-bind</code>), or an object map of directives where the keys are the\n   *    names and the values are the factories.\n   * @param {Function|Array} directiveFactory An injectable directive factory function. See the\n   *    {@link guide/directive directive guide} and the {@link $compile compile API} for more info.\n   * @returns {ng.$compileProvider} Self for chaining.\n   */\n  this.directive = function registerDirective(name, directiveFactory) {\n    assertArg(name, 'name');\n    assertNotHasOwnProperty(name, 'directive');\n    if (isString(name)) {\n      assertValidDirectiveName(name);\n      assertArg(directiveFactory, 'directiveFactory');\n      if (!hasDirectives.hasOwnProperty(name)) {\n        hasDirectives[name] = [];\n        $provide.factory(name + Suffix, ['$injector', '$exceptionHandler',\n          function($injector, $exceptionHandler) {\n            var directives = [];\n            forEach(hasDirectives[name], function(directiveFactory, index) {\n              try {\n                var directive = $injector.invoke(directiveFactory);\n                if (isFunction(directive)) {\n                  directive = { compile: valueFn(directive) };\n                } else if (!directive.compile && directive.link) {\n                  directive.compile = valueFn(directive.link);\n                }\n                directive.priority = directive.priority || 0;\n                directive.index = index;\n                directive.name = directive.name || name;\n                directive.require = getDirectiveRequire(directive);\n                directive.restrict = getDirectiveRestrict(directive.restrict, name);\n                directive.$$moduleName = directiveFactory.$$moduleName;\n                directives.push(directive);\n              } catch (e) {\n                $exceptionHandler(e);\n              }\n            });\n            return directives;\n          }]);\n      }\n      hasDirectives[name].push(directiveFactory);\n    } else {\n      forEach(name, reverseParams(registerDirective));\n    }\n    return this;\n  };\n\n  /**\n   * @ngdoc method\n   * @name $compileProvider#component\n   * @module ng\n   * @param {string} name Name of the component in camelCase (i.e. `myComp` which will match `<my-comp>`)\n   * @param {Object} options Component definition object (a simplified\n   *    {@link ng.$compile#directive-definition-object directive definition object}),\n   *    with the following properties (all optional):\n   *\n   *    - `controller` – `{(string|function()=}` – controller constructor function that should be\n   *      associated with newly created scope or the name of a {@link ng.$compile#-controller-\n   *      registered controller} if passed as a string. An empty `noop` function by default.\n   *    - `controllerAs` – `{string=}` – identifier name for to reference the controller in the component's scope.\n   *      If present, the controller will be published to scope under the `controllerAs` name.\n   *      If not present, this will default to be `$ctrl`.\n   *    - `template` – `{string=|function()=}` – html template as a string or a function that\n   *      returns an html template as a string which should be used as the contents of this component.\n   *      Empty string by default.\n   *\n   *      If `template` is a function, then it is {@link auto.$injector#invoke injected} with\n   *      the following locals:\n   *\n   *      - `$element` - Current element\n   *      - `$attrs` - Current attributes object for the element\n   *\n   *    - `templateUrl` – `{string=|function()=}` – path or function that returns a path to an html\n   *      template that should be used  as the contents of this component.\n   *\n   *      If `templateUrl` is a function, then it is {@link auto.$injector#invoke injected} with\n   *      the following locals:\n   *\n   *      - `$element` - Current element\n   *      - `$attrs` - Current attributes object for the element\n   *\n   *    - `bindings` – `{object=}` – defines bindings between DOM attributes and component properties.\n   *      Component properties are always bound to the component controller and not to the scope.\n   *      See {@link ng.$compile#-bindtocontroller- `bindToController`}.\n   *    - `transclude` – `{boolean=}` – whether {@link $compile#transclusion content transclusion} is enabled.\n   *      Disabled by default.\n   *    - `require` - `{Object<string, string>=}` - requires the controllers of other directives and binds them to\n   *      this component's controller. The object keys specify the property names under which the required\n   *      controllers (object values) will be bound. See {@link ng.$compile#-require- `require`}.\n   *    - `$...` – additional properties to attach to the directive factory function and the controller\n   *      constructor function. (This is used by the component router to annotate)\n   *\n   * @returns {ng.$compileProvider} the compile provider itself, for chaining of function calls.\n   * @description\n   * Register a **component definition** with the compiler. This is a shorthand for registering a special\n   * type of directive, which represents a self-contained UI component in your application. Such components\n   * are always isolated (i.e. `scope: {}`) and are always restricted to elements (i.e. `restrict: 'E'`).\n   *\n   * Component definitions are very simple and do not require as much configuration as defining general\n   * directives. Component definitions usually consist only of a template and a controller backing it.\n   *\n   * In order to make the definition easier, components enforce best practices like use of `controllerAs`,\n   * `bindToController`. They always have **isolate scope** and are restricted to elements.\n   *\n   * Here are a few examples of how you would usually define components:\n   *\n   * ```js\n   *   var myMod = angular.module(...);\n   *   myMod.component('myComp', {\n   *     template: '<div>My name is {{$ctrl.name}}</div>',\n   *     controller: function() {\n   *       this.name = 'shahar';\n   *     }\n   *   });\n   *\n   *   myMod.component('myComp', {\n   *     template: '<div>My name is {{$ctrl.name}}</div>',\n   *     bindings: {name: '@'}\n   *   });\n   *\n   *   myMod.component('myComp', {\n   *     templateUrl: 'views/my-comp.html',\n   *     controller: 'MyCtrl',\n   *     controllerAs: 'ctrl',\n   *     bindings: {name: '@'}\n   *   });\n   *\n   * ```\n   * For more examples, and an in-depth guide, see the {@link guide/component component guide}.\n   *\n   * <br />\n   * See also {@link ng.$compileProvider#directive $compileProvider.directive()}.\n   */\n  this.component = function registerComponent(name, options) {\n    var controller = options.controller || function() {};\n\n    function factory($injector) {\n      function makeInjectable(fn) {\n        if (isFunction(fn) || isArray(fn)) {\n          return /** @this */ function(tElement, tAttrs) {\n            return $injector.invoke(fn, this, {$element: tElement, $attrs: tAttrs});\n          };\n        } else {\n          return fn;\n        }\n      }\n\n      var template = (!options.template && !options.templateUrl ? '' : options.template);\n      var ddo = {\n        controller: controller,\n        controllerAs: identifierForController(options.controller) || options.controllerAs || '$ctrl',\n        template: makeInjectable(template),\n        templateUrl: makeInjectable(options.templateUrl),\n        transclude: options.transclude,\n        scope: {},\n        bindToController: options.bindings || {},\n        restrict: 'E',\n        require: options.require\n      };\n\n      // Copy annotations (starting with $) over to the DDO\n      forEach(options, function(val, key) {\n        if (key.charAt(0) === '$') ddo[key] = val;\n      });\n\n      return ddo;\n    }\n\n    // TODO(pete) remove the following `forEach` before we release 1.6.0\n    // The component-router@0.2.0 looks for the annotations on the controller constructor\n    // Nothing in Angular looks for annotations on the factory function but we can't remove\n    // it from 1.5.x yet.\n\n    // Copy any annotation properties (starting with $) over to the factory and controller constructor functions\n    // These could be used by libraries such as the new component router\n    forEach(options, function(val, key) {\n      if (key.charAt(0) === '$') {\n        factory[key] = val;\n        // Don't try to copy over annotations to named controller\n        if (isFunction(controller)) controller[key] = val;\n      }\n    });\n\n    factory.$inject = ['$injector'];\n\n    return this.directive(name, factory);\n  };\n\n\n  /**\n   * @ngdoc method\n   * @name $compileProvider#aHrefSanitizationWhitelist\n   * @kind function\n   *\n   * @description\n   * Retrieves or overrides the default regular expression that is used for whitelisting of safe\n   * urls during a[href] sanitization.\n   *\n   * The sanitization is a security measure aimed at preventing XSS attacks via html links.\n   *\n   * Any url about to be assigned to a[href] via data-binding is first normalized and turned into\n   * an absolute url. Afterwards, the url is matched against the `aHrefSanitizationWhitelist`\n   * regular expression. If a match is found, the original url is written into the dom. Otherwise,\n   * the absolute url is prefixed with `'unsafe:'` string and only then is it written into the DOM.\n   *\n   * @param {RegExp=} regexp New regexp to whitelist urls with.\n   * @returns {RegExp|ng.$compileProvider} Current RegExp if called without value or self for\n   *    chaining otherwise.\n   */\n  this.aHrefSanitizationWhitelist = function(regexp) {\n    if (isDefined(regexp)) {\n      $$sanitizeUriProvider.aHrefSanitizationWhitelist(regexp);\n      return this;\n    } else {\n      return $$sanitizeUriProvider.aHrefSanitizationWhitelist();\n    }\n  };\n\n\n  /**\n   * @ngdoc method\n   * @name $compileProvider#imgSrcSanitizationWhitelist\n   * @kind function\n   *\n   * @description\n   * Retrieves or overrides the default regular expression that is used for whitelisting of safe\n   * urls during img[src] sanitization.\n   *\n   * The sanitization is a security measure aimed at prevent XSS attacks via html links.\n   *\n   * Any url about to be assigned to img[src] via data-binding is first normalized and turned into\n   * an absolute url. Afterwards, the url is matched against the `imgSrcSanitizationWhitelist`\n   * regular expression. If a match is found, the original url is written into the dom. Otherwise,\n   * the absolute url is prefixed with `'unsafe:'` string and only then is it written into the DOM.\n   *\n   * @param {RegExp=} regexp New regexp to whitelist urls with.\n   * @returns {RegExp|ng.$compileProvider} Current RegExp if called without value or self for\n   *    chaining otherwise.\n   */\n  this.imgSrcSanitizationWhitelist = function(regexp) {\n    if (isDefined(regexp)) {\n      $$sanitizeUriProvider.imgSrcSanitizationWhitelist(regexp);\n      return this;\n    } else {\n      return $$sanitizeUriProvider.imgSrcSanitizationWhitelist();\n    }\n  };\n\n  /**\n   * @ngdoc method\n   * @name  $compileProvider#debugInfoEnabled\n   *\n   * @param {boolean=} enabled update the debugInfoEnabled state if provided, otherwise just return the\n   * current debugInfoEnabled state\n   * @returns {*} current value if used as getter or itself (chaining) if used as setter\n   *\n   * @kind function\n   *\n   * @description\n   * Call this method to enable/disable various debug runtime information in the compiler such as adding\n   * binding information and a reference to the current scope on to DOM elements.\n   * If enabled, the compiler will add the following to DOM elements that have been bound to the scope\n   * * `ng-binding` CSS class\n   * * `$binding` data property containing an array of the binding expressions\n   *\n   * You may want to disable this in production for a significant performance boost. See\n   * {@link guide/production#disabling-debug-data Disabling Debug Data} for more.\n   *\n   * The default value is true.\n   */\n  var debugInfoEnabled = true;\n  this.debugInfoEnabled = function(enabled) {\n    if (isDefined(enabled)) {\n      debugInfoEnabled = enabled;\n      return this;\n    }\n    return debugInfoEnabled;\n  };\n\n  /**\n   * @ngdoc method\n   * @name  $compileProvider#preAssignBindingsEnabled\n   *\n   * @param {boolean=} enabled update the preAssignBindingsEnabled state if provided, otherwise just return the\n   * current preAssignBindingsEnabled state\n   * @returns {*} current value if used as getter or itself (chaining) if used as setter\n   *\n   * @kind function\n   *\n   * @description\n   * Call this method to enable/disable whether directive controllers are assigned bindings before\n   * calling the controller's constructor.\n   * If enabled (true), the compiler assigns the value of each of the bindings to the\n   * properties of the controller object before the constructor of this object is called.\n   *\n   * If disabled (false), the compiler calls the constructor first before assigning bindings.\n   *\n   * The default value is false.\n   *\n   * @deprecated\n   * sinceVersion=\"1.6.0\"\n   * removeVersion=\"1.7.0\"\n   *\n   * This method and the option to assign the bindings before calling the controller's constructor\n   * will be removed in v1.7.0.\n   */\n  var preAssignBindingsEnabled = false;\n  this.preAssignBindingsEnabled = function(enabled) {\n    if (isDefined(enabled)) {\n      preAssignBindingsEnabled = enabled;\n      return this;\n    }\n    return preAssignBindingsEnabled;\n  };\n\n\n  var TTL = 10;\n  /**\n   * @ngdoc method\n   * @name $compileProvider#onChangesTtl\n   * @description\n   *\n   * Sets the number of times `$onChanges` hooks can trigger new changes before giving up and\n   * assuming that the model is unstable.\n   *\n   * The current default is 10 iterations.\n   *\n   * In complex applications it's possible that dependencies between `$onChanges` hooks and bindings will result\n   * in several iterations of calls to these hooks. However if an application needs more than the default 10\n   * iterations to stabilize then you should investigate what is causing the model to continuously change during\n   * the `$onChanges` hook execution.\n   *\n   * Increasing the TTL could have performance implications, so you should not change it without proper justification.\n   *\n   * @param {number} limit The number of `$onChanges` hook iterations.\n   * @returns {number|object} the current limit (or `this` if called as a setter for chaining)\n   */\n  this.onChangesTtl = function(value) {\n    if (arguments.length) {\n      TTL = value;\n      return this;\n    }\n    return TTL;\n  };\n\n  var commentDirectivesEnabledConfig = true;\n  /**\n   * @ngdoc method\n   * @name $compileProvider#commentDirectivesEnabled\n   * @description\n   *\n   * It indicates to the compiler\n   * whether or not directives on comments should be compiled.\n   * Defaults to `true`.\n   *\n   * Calling this function with false disables the compilation of directives\n   * on comments for the whole application.\n   * This results in a compilation performance gain,\n   * as the compiler doesn't have to check comments when looking for directives.\n   * This should however only be used if you are sure that no comment directives are used in\n   * the application (including any 3rd party directives).\n   *\n   * @param {boolean} enabled `false` if the compiler may ignore directives on comments\n   * @returns {boolean|object} the current value (or `this` if called as a setter for chaining)\n   */\n  this.commentDirectivesEnabled = function(value) {\n    if (arguments.length) {\n      commentDirectivesEnabledConfig = value;\n      return this;\n    }\n    return commentDirectivesEnabledConfig;\n  };\n\n\n  var cssClassDirectivesEnabledConfig = true;\n  /**\n   * @ngdoc method\n   * @name $compileProvider#cssClassDirectivesEnabled\n   * @description\n   *\n   * It indicates to the compiler\n   * whether or not directives on element classes should be compiled.\n   * Defaults to `true`.\n   *\n   * Calling this function with false disables the compilation of directives\n   * on element classes for the whole application.\n   * This results in a compilation performance gain,\n   * as the compiler doesn't have to check element classes when looking for directives.\n   * This should however only be used if you are sure that no class directives are used in\n   * the application (including any 3rd party directives).\n   *\n   * @param {boolean} enabled `false` if the compiler may ignore directives on element classes\n   * @returns {boolean|object} the current value (or `this` if called as a setter for chaining)\n   */\n  this.cssClassDirectivesEnabled = function(value) {\n    if (arguments.length) {\n      cssClassDirectivesEnabledConfig = value;\n      return this;\n    }\n    return cssClassDirectivesEnabledConfig;\n  };\n\n  this.$get = [\n            '$injector', '$interpolate', '$exceptionHandler', '$templateRequest', '$parse',\n            '$controller', '$rootScope', '$sce', '$animate', '$$sanitizeUri',\n    function($injector,   $interpolate,   $exceptionHandler,   $templateRequest,   $parse,\n             $controller,   $rootScope,   $sce,   $animate,   $$sanitizeUri) {\n\n    var SIMPLE_ATTR_NAME = /^\\w/;\n    var specialAttrHolder = window.document.createElement('div');\n\n\n    var commentDirectivesEnabled = commentDirectivesEnabledConfig;\n    var cssClassDirectivesEnabled = cssClassDirectivesEnabledConfig;\n\n\n    var onChangesTtl = TTL;\n    // The onChanges hooks should all be run together in a single digest\n    // When changes occur, the call to trigger their hooks will be added to this queue\n    var onChangesQueue;\n\n    // This function is called in a $$postDigest to trigger all the onChanges hooks in a single digest\n    function flushOnChangesQueue() {\n      try {\n        if (!(--onChangesTtl)) {\n          // We have hit the TTL limit so reset everything\n          onChangesQueue = undefined;\n          throw $compileMinErr('infchng', '{0} $onChanges() iterations reached. Aborting!\\n', TTL);\n        }\n        // We must run this hook in an apply since the $$postDigest runs outside apply\n        $rootScope.$apply(function() {\n          var errors = [];\n          for (var i = 0, ii = onChangesQueue.length; i < ii; ++i) {\n            try {\n              onChangesQueue[i]();\n            } catch (e) {\n              errors.push(e);\n            }\n          }\n          // Reset the queue to trigger a new schedule next time there is a change\n          onChangesQueue = undefined;\n          if (errors.length) {\n            throw errors;\n          }\n        });\n      } finally {\n        onChangesTtl++;\n      }\n    }\n\n\n    function Attributes(element, attributesToCopy) {\n      if (attributesToCopy) {\n        var keys = Object.keys(attributesToCopy);\n        var i, l, key;\n\n        for (i = 0, l = keys.length; i < l; i++) {\n          key = keys[i];\n          this[key] = attributesToCopy[key];\n        }\n      } else {\n        this.$attr = {};\n      }\n\n      this.$$element = element;\n    }\n\n    Attributes.prototype = {\n      /**\n       * @ngdoc method\n       * @name $compile.directive.Attributes#$normalize\n       * @kind function\n       *\n       * @description\n       * Converts an attribute name (e.g. dash/colon/underscore-delimited string, optionally prefixed with `x-` or\n       * `data-`) to its normalized, camelCase form.\n       *\n       * Also there is special case for Moz prefix starting with upper case letter.\n       *\n       * For further information check out the guide on {@link guide/directive#matching-directives Matching Directives}\n       *\n       * @param {string} name Name to normalize\n       */\n      $normalize: directiveNormalize,\n\n\n      /**\n       * @ngdoc method\n       * @name $compile.directive.Attributes#$addClass\n       * @kind function\n       *\n       * @description\n       * Adds the CSS class value specified by the classVal parameter to the element. If animations\n       * are enabled then an animation will be triggered for the class addition.\n       *\n       * @param {string} classVal The className value that will be added to the element\n       */\n      $addClass: function(classVal) {\n        if (classVal && classVal.length > 0) {\n          $animate.addClass(this.$$element, classVal);\n        }\n      },\n\n      /**\n       * @ngdoc method\n       * @name $compile.directive.Attributes#$removeClass\n       * @kind function\n       *\n       * @description\n       * Removes the CSS class value specified by the classVal parameter from the element. If\n       * animations are enabled then an animation will be triggered for the class removal.\n       *\n       * @param {string} classVal The className value that will be removed from the element\n       */\n      $removeClass: function(classVal) {\n        if (classVal && classVal.length > 0) {\n          $animate.removeClass(this.$$element, classVal);\n        }\n      },\n\n      /**\n       * @ngdoc method\n       * @name $compile.directive.Attributes#$updateClass\n       * @kind function\n       *\n       * @description\n       * Adds and removes the appropriate CSS class values to the element based on the difference\n       * between the new and old CSS class values (specified as newClasses and oldClasses).\n       *\n       * @param {string} newClasses The current CSS className value\n       * @param {string} oldClasses The former CSS className value\n       */\n      $updateClass: function(newClasses, oldClasses) {\n        var toAdd = tokenDifference(newClasses, oldClasses);\n        if (toAdd && toAdd.length) {\n          $animate.addClass(this.$$element, toAdd);\n        }\n\n        var toRemove = tokenDifference(oldClasses, newClasses);\n        if (toRemove && toRemove.length) {\n          $animate.removeClass(this.$$element, toRemove);\n        }\n      },\n\n      /**\n       * Set a normalized attribute on the element in a way such that all directives\n       * can share the attribute. This function properly handles boolean attributes.\n       * @param {string} key Normalized key. (ie ngAttribute)\n       * @param {string|boolean} value The value to set. If `null` attribute will be deleted.\n       * @param {boolean=} writeAttr If false, does not write the value to DOM element attribute.\n       *     Defaults to true.\n       * @param {string=} attrName Optional none normalized name. Defaults to key.\n       */\n      $set: function(key, value, writeAttr, attrName) {\n        // TODO: decide whether or not to throw an error if \"class\"\n        //is set through this function since it may cause $updateClass to\n        //become unstable.\n\n        var node = this.$$element[0],\n            booleanKey = getBooleanAttrName(node, key),\n            aliasedKey = getAliasedAttrName(key),\n            observer = key,\n            nodeName;\n\n        if (booleanKey) {\n          this.$$element.prop(key, value);\n          attrName = booleanKey;\n        } else if (aliasedKey) {\n          this[aliasedKey] = value;\n          observer = aliasedKey;\n        }\n\n        this[key] = value;\n\n        // translate normalized key to actual key\n        if (attrName) {\n          this.$attr[key] = attrName;\n        } else {\n          attrName = this.$attr[key];\n          if (!attrName) {\n            this.$attr[key] = attrName = snake_case(key, '-');\n          }\n        }\n\n        nodeName = nodeName_(this.$$element);\n\n        if ((nodeName === 'a' && (key === 'href' || key === 'xlinkHref')) ||\n            (nodeName === 'img' && key === 'src')) {\n          // sanitize a[href] and img[src] values\n          this[key] = value = $$sanitizeUri(value, key === 'src');\n        } else if (nodeName === 'img' && key === 'srcset' && isDefined(value)) {\n          // sanitize img[srcset] values\n          var result = '';\n\n          // first check if there are spaces because it's not the same pattern\n          var trimmedSrcset = trim(value);\n          //                (   999x   ,|   999w   ,|   ,|,   )\n          var srcPattern = /(\\s+\\d+x\\s*,|\\s+\\d+w\\s*,|\\s+,|,\\s+)/;\n          var pattern = /\\s/.test(trimmedSrcset) ? srcPattern : /(,)/;\n\n          // split srcset into tuple of uri and descriptor except for the last item\n          var rawUris = trimmedSrcset.split(pattern);\n\n          // for each tuples\n          var nbrUrisWith2parts = Math.floor(rawUris.length / 2);\n          for (var i = 0; i < nbrUrisWith2parts; i++) {\n            var innerIdx = i * 2;\n            // sanitize the uri\n            result += $$sanitizeUri(trim(rawUris[innerIdx]), true);\n            // add the descriptor\n            result += (' ' + trim(rawUris[innerIdx + 1]));\n          }\n\n          // split the last item into uri and descriptor\n          var lastTuple = trim(rawUris[i * 2]).split(/\\s/);\n\n          // sanitize the last uri\n          result += $$sanitizeUri(trim(lastTuple[0]), true);\n\n          // and add the last descriptor if any\n          if (lastTuple.length === 2) {\n            result += (' ' + trim(lastTuple[1]));\n          }\n          this[key] = value = result;\n        }\n\n        if (writeAttr !== false) {\n          if (value === null || isUndefined(value)) {\n            this.$$element.removeAttr(attrName);\n          } else {\n            if (SIMPLE_ATTR_NAME.test(attrName)) {\n              this.$$element.attr(attrName, value);\n            } else {\n              setSpecialAttr(this.$$element[0], attrName, value);\n            }\n          }\n        }\n\n        // fire observers\n        var $$observers = this.$$observers;\n        if ($$observers) {\n          forEach($$observers[observer], function(fn) {\n            try {\n              fn(value);\n            } catch (e) {\n              $exceptionHandler(e);\n            }\n          });\n        }\n      },\n\n\n      /**\n       * @ngdoc method\n       * @name $compile.directive.Attributes#$observe\n       * @kind function\n       *\n       * @description\n       * Observes an interpolated attribute.\n       *\n       * The observer function will be invoked once during the next `$digest` following\n       * compilation. The observer is then invoked whenever the interpolated value\n       * changes.\n       *\n       * @param {string} key Normalized key. (ie ngAttribute) .\n       * @param {function(interpolatedValue)} fn Function that will be called whenever\n                the interpolated value of the attribute changes.\n       *        See the {@link guide/interpolation#how-text-and-attribute-bindings-work Interpolation\n       *        guide} for more info.\n       * @returns {function()} Returns a deregistration function for this observer.\n       */\n      $observe: function(key, fn) {\n        var attrs = this,\n            $$observers = (attrs.$$observers || (attrs.$$observers = createMap())),\n            listeners = ($$observers[key] || ($$observers[key] = []));\n\n        listeners.push(fn);\n        $rootScope.$evalAsync(function() {\n          if (!listeners.$$inter && attrs.hasOwnProperty(key) && !isUndefined(attrs[key])) {\n            // no one registered attribute interpolation function, so lets call it manually\n            fn(attrs[key]);\n          }\n        });\n\n        return function() {\n          arrayRemove(listeners, fn);\n        };\n      }\n    };\n\n    function setSpecialAttr(element, attrName, value) {\n      // Attributes names that do not start with letters (such as `(click)`) cannot be set using `setAttribute`\n      // so we have to jump through some hoops to get such an attribute\n      // https://github.com/angular/angular.js/pull/13318\n      specialAttrHolder.innerHTML = '<span ' + attrName + '>';\n      var attributes = specialAttrHolder.firstChild.attributes;\n      var attribute = attributes[0];\n      // We have to remove the attribute from its container element before we can add it to the destination element\n      attributes.removeNamedItem(attribute.name);\n      attribute.value = value;\n      element.attributes.setNamedItem(attribute);\n    }\n\n    function safeAddClass($element, className) {\n      try {\n        $element.addClass(className);\n      } catch (e) {\n        // ignore, since it means that we are trying to set class on\n        // SVG element, where class name is read-only.\n      }\n    }\n\n\n    var startSymbol = $interpolate.startSymbol(),\n        endSymbol = $interpolate.endSymbol(),\n        denormalizeTemplate = (startSymbol === '{{' && endSymbol  === '}}')\n            ? identity\n            : function denormalizeTemplate(template) {\n              return template.replace(/\\{\\{/g, startSymbol).replace(/}}/g, endSymbol);\n        },\n        NG_ATTR_BINDING = /^ngAttr[A-Z]/;\n    var MULTI_ELEMENT_DIR_RE = /^(.+)Start$/;\n\n    compile.$$addBindingInfo = debugInfoEnabled ? function $$addBindingInfo($element, binding) {\n      var bindings = $element.data('$binding') || [];\n\n      if (isArray(binding)) {\n        bindings = bindings.concat(binding);\n      } else {\n        bindings.push(binding);\n      }\n\n      $element.data('$binding', bindings);\n    } : noop;\n\n    compile.$$addBindingClass = debugInfoEnabled ? function $$addBindingClass($element) {\n      safeAddClass($element, 'ng-binding');\n    } : noop;\n\n    compile.$$addScopeInfo = debugInfoEnabled ? function $$addScopeInfo($element, scope, isolated, noTemplate) {\n      var dataName = isolated ? (noTemplate ? '$isolateScopeNoTemplate' : '$isolateScope') : '$scope';\n      $element.data(dataName, scope);\n    } : noop;\n\n    compile.$$addScopeClass = debugInfoEnabled ? function $$addScopeClass($element, isolated) {\n      safeAddClass($element, isolated ? 'ng-isolate-scope' : 'ng-scope');\n    } : noop;\n\n    compile.$$createComment = function(directiveName, comment) {\n      var content = '';\n      if (debugInfoEnabled) {\n        content = ' ' + (directiveName || '') + ': ';\n        if (comment) content += comment + ' ';\n      }\n      return window.document.createComment(content);\n    };\n\n    return compile;\n\n    //================================\n\n    function compile($compileNodes, transcludeFn, maxPriority, ignoreDirective,\n                        previousCompileContext) {\n      if (!($compileNodes instanceof jqLite)) {\n        // jquery always rewraps, whereas we need to preserve the original selector so that we can\n        // modify it.\n        $compileNodes = jqLite($compileNodes);\n      }\n      var compositeLinkFn =\n              compileNodes($compileNodes, transcludeFn, $compileNodes,\n                           maxPriority, ignoreDirective, previousCompileContext);\n      compile.$$addScopeClass($compileNodes);\n      var namespace = null;\n      return function publicLinkFn(scope, cloneConnectFn, options) {\n        if (!$compileNodes) {\n          throw $compileMinErr('multilink', 'This element has already been linked.');\n        }\n        assertArg(scope, 'scope');\n\n        if (previousCompileContext && previousCompileContext.needsNewScope) {\n          // A parent directive did a replace and a directive on this element asked\n          // for transclusion, which caused us to lose a layer of element on which\n          // we could hold the new transclusion scope, so we will create it manually\n          // here.\n          scope = scope.$parent.$new();\n        }\n\n        options = options || {};\n        var parentBoundTranscludeFn = options.parentBoundTranscludeFn,\n          transcludeControllers = options.transcludeControllers,\n          futureParentElement = options.futureParentElement;\n\n        // When `parentBoundTranscludeFn` is passed, it is a\n        // `controllersBoundTransclude` function (it was previously passed\n        // as `transclude` to directive.link) so we must unwrap it to get\n        // its `boundTranscludeFn`\n        if (parentBoundTranscludeFn && parentBoundTranscludeFn.$$boundTransclude) {\n          parentBoundTranscludeFn = parentBoundTranscludeFn.$$boundTransclude;\n        }\n\n        if (!namespace) {\n          namespace = detectNamespaceForChildElements(futureParentElement);\n        }\n        var $linkNode;\n        if (namespace !== 'html') {\n          // When using a directive with replace:true and templateUrl the $compileNodes\n          // (or a child element inside of them)\n          // might change, so we need to recreate the namespace adapted compileNodes\n          // for call to the link function.\n          // Note: This will already clone the nodes...\n          $linkNode = jqLite(\n            wrapTemplate(namespace, jqLite('<div>').append($compileNodes).html())\n          );\n        } else if (cloneConnectFn) {\n          // important!!: we must call our jqLite.clone() since the jQuery one is trying to be smart\n          // and sometimes changes the structure of the DOM.\n          $linkNode = JQLitePrototype.clone.call($compileNodes);\n        } else {\n          $linkNode = $compileNodes;\n        }\n\n        if (transcludeControllers) {\n          for (var controllerName in transcludeControllers) {\n            $linkNode.data('$' + controllerName + 'Controller', transcludeControllers[controllerName].instance);\n          }\n        }\n\n        compile.$$addScopeInfo($linkNode, scope);\n\n        if (cloneConnectFn) cloneConnectFn($linkNode, scope);\n        if (compositeLinkFn) compositeLinkFn(scope, $linkNode, $linkNode, parentBoundTranscludeFn);\n\n        if (!cloneConnectFn) {\n          $compileNodes = compositeLinkFn = null;\n        }\n        return $linkNode;\n      };\n    }\n\n    function detectNamespaceForChildElements(parentElement) {\n      // TODO: Make this detect MathML as well...\n      var node = parentElement && parentElement[0];\n      if (!node) {\n        return 'html';\n      } else {\n        return nodeName_(node) !== 'foreignobject' && toString.call(node).match(/SVG/) ? 'svg' : 'html';\n      }\n    }\n\n    /**\n     * Compile function matches each node in nodeList against the directives. Once all directives\n     * for a particular node are collected their compile functions are executed. The compile\n     * functions return values - the linking functions - are combined into a composite linking\n     * function, which is the a linking function for the node.\n     *\n     * @param {NodeList} nodeList an array of nodes or NodeList to compile\n     * @param {function(angular.Scope, cloneAttachFn=)} transcludeFn A linking function, where the\n     *        scope argument is auto-generated to the new child of the transcluded parent scope.\n     * @param {DOMElement=} $rootElement If the nodeList is the root of the compilation tree then\n     *        the rootElement must be set the jqLite collection of the compile root. This is\n     *        needed so that the jqLite collection items can be replaced with widgets.\n     * @param {number=} maxPriority Max directive priority.\n     * @returns {Function} A composite linking function of all of the matched directives or null.\n     */\n    function compileNodes(nodeList, transcludeFn, $rootElement, maxPriority, ignoreDirective,\n                            previousCompileContext) {\n      var linkFns = [],\n          // `nodeList` can be either an element's `.childNodes` (live NodeList)\n          // or a jqLite/jQuery collection or an array\n          notLiveList = isArray(nodeList) || (nodeList instanceof jqLite),\n          attrs, directives, nodeLinkFn, childNodes, childLinkFn, linkFnFound, nodeLinkFnFound;\n\n\n      for (var i = 0; i < nodeList.length; i++) {\n        attrs = new Attributes();\n\n        // Support: IE 11 only\n        // Workaround for #11781 and #14924\n        if (msie === 11) {\n          mergeConsecutiveTextNodes(nodeList, i, notLiveList);\n        }\n\n        // We must always refer to `nodeList[i]` hereafter,\n        // since the nodes can be replaced underneath us.\n        directives = collectDirectives(nodeList[i], [], attrs, i === 0 ? maxPriority : undefined,\n                                        ignoreDirective);\n\n        nodeLinkFn = (directives.length)\n            ? applyDirectivesToNode(directives, nodeList[i], attrs, transcludeFn, $rootElement,\n                                      null, [], [], previousCompileContext)\n            : null;\n\n        if (nodeLinkFn && nodeLinkFn.scope) {\n          compile.$$addScopeClass(attrs.$$element);\n        }\n\n        childLinkFn = (nodeLinkFn && nodeLinkFn.terminal ||\n                      !(childNodes = nodeList[i].childNodes) ||\n                      !childNodes.length)\n            ? null\n            : compileNodes(childNodes,\n                 nodeLinkFn ? (\n                  (nodeLinkFn.transcludeOnThisElement || !nodeLinkFn.templateOnThisElement)\n                     && nodeLinkFn.transclude) : transcludeFn);\n\n        if (nodeLinkFn || childLinkFn) {\n          linkFns.push(i, nodeLinkFn, childLinkFn);\n          linkFnFound = true;\n          nodeLinkFnFound = nodeLinkFnFound || nodeLinkFn;\n        }\n\n        //use the previous context only for the first element in the virtual group\n        previousCompileContext = null;\n      }\n\n      // return a linking function if we have found anything, null otherwise\n      return linkFnFound ? compositeLinkFn : null;\n\n      function compositeLinkFn(scope, nodeList, $rootElement, parentBoundTranscludeFn) {\n        var nodeLinkFn, childLinkFn, node, childScope, i, ii, idx, childBoundTranscludeFn;\n        var stableNodeList;\n\n\n        if (nodeLinkFnFound) {\n          // copy nodeList so that if a nodeLinkFn removes or adds an element at this DOM level our\n          // offsets don't get screwed up\n          var nodeListLength = nodeList.length;\n          stableNodeList = new Array(nodeListLength);\n\n          // create a sparse array by only copying the elements which have a linkFn\n          for (i = 0; i < linkFns.length; i += 3) {\n            idx = linkFns[i];\n            stableNodeList[idx] = nodeList[idx];\n          }\n        } else {\n          stableNodeList = nodeList;\n        }\n\n        for (i = 0, ii = linkFns.length; i < ii;) {\n          node = stableNodeList[linkFns[i++]];\n          nodeLinkFn = linkFns[i++];\n          childLinkFn = linkFns[i++];\n\n          if (nodeLinkFn) {\n            if (nodeLinkFn.scope) {\n              childScope = scope.$new();\n              compile.$$addScopeInfo(jqLite(node), childScope);\n            } else {\n              childScope = scope;\n            }\n\n            if (nodeLinkFn.transcludeOnThisElement) {\n              childBoundTranscludeFn = createBoundTranscludeFn(\n                  scope, nodeLinkFn.transclude, parentBoundTranscludeFn);\n\n            } else if (!nodeLinkFn.templateOnThisElement && parentBoundTranscludeFn) {\n              childBoundTranscludeFn = parentBoundTranscludeFn;\n\n            } else if (!parentBoundTranscludeFn && transcludeFn) {\n              childBoundTranscludeFn = createBoundTranscludeFn(scope, transcludeFn);\n\n            } else {\n              childBoundTranscludeFn = null;\n            }\n\n            nodeLinkFn(childLinkFn, childScope, node, $rootElement, childBoundTranscludeFn);\n\n          } else if (childLinkFn) {\n            childLinkFn(scope, node.childNodes, undefined, parentBoundTranscludeFn);\n          }\n        }\n      }\n    }\n\n    function mergeConsecutiveTextNodes(nodeList, idx, notLiveList) {\n      var node = nodeList[idx];\n      var parent = node.parentNode;\n      var sibling;\n\n      if (node.nodeType !== NODE_TYPE_TEXT) {\n        return;\n      }\n\n      while (true) {\n        sibling = parent ? node.nextSibling : nodeList[idx + 1];\n        if (!sibling || sibling.nodeType !== NODE_TYPE_TEXT) {\n          break;\n        }\n\n        node.nodeValue = node.nodeValue + sibling.nodeValue;\n\n        if (sibling.parentNode) {\n          sibling.parentNode.removeChild(sibling);\n        }\n        if (notLiveList && sibling === nodeList[idx + 1]) {\n          nodeList.splice(idx + 1, 1);\n        }\n      }\n    }\n\n    function createBoundTranscludeFn(scope, transcludeFn, previousBoundTranscludeFn) {\n      function boundTranscludeFn(transcludedScope, cloneFn, controllers, futureParentElement, containingScope) {\n\n        if (!transcludedScope) {\n          transcludedScope = scope.$new(false, containingScope);\n          transcludedScope.$$transcluded = true;\n        }\n\n        return transcludeFn(transcludedScope, cloneFn, {\n          parentBoundTranscludeFn: previousBoundTranscludeFn,\n          transcludeControllers: controllers,\n          futureParentElement: futureParentElement\n        });\n      }\n\n      // We need  to attach the transclusion slots onto the `boundTranscludeFn`\n      // so that they are available inside the `controllersBoundTransclude` function\n      var boundSlots = boundTranscludeFn.$$slots = createMap();\n      for (var slotName in transcludeFn.$$slots) {\n        if (transcludeFn.$$slots[slotName]) {\n          boundSlots[slotName] = createBoundTranscludeFn(scope, transcludeFn.$$slots[slotName], previousBoundTranscludeFn);\n        } else {\n          boundSlots[slotName] = null;\n        }\n      }\n\n      return boundTranscludeFn;\n    }\n\n    /**\n     * Looks for directives on the given node and adds them to the directive collection which is\n     * sorted.\n     *\n     * @param node Node to search.\n     * @param directives An array to which the directives are added to. This array is sorted before\n     *        the function returns.\n     * @param attrs The shared attrs object which is used to populate the normalized attributes.\n     * @param {number=} maxPriority Max directive priority.\n     */\n    function collectDirectives(node, directives, attrs, maxPriority, ignoreDirective) {\n      var nodeType = node.nodeType,\n          attrsMap = attrs.$attr,\n          match,\n          nodeName,\n          className;\n\n      switch (nodeType) {\n        case NODE_TYPE_ELEMENT: /* Element */\n\n          nodeName = nodeName_(node);\n\n          // use the node name: <directive>\n          addDirective(directives,\n              directiveNormalize(nodeName), 'E', maxPriority, ignoreDirective);\n\n          // iterate over the attributes\n          for (var attr, name, nName, ngAttrName, value, isNgAttr, nAttrs = node.attributes,\n                   j = 0, jj = nAttrs && nAttrs.length; j < jj; j++) {\n            var attrStartName = false;\n            var attrEndName = false;\n\n            attr = nAttrs[j];\n            name = attr.name;\n            value = attr.value;\n\n            // support ngAttr attribute binding\n            ngAttrName = directiveNormalize(name);\n            isNgAttr = NG_ATTR_BINDING.test(ngAttrName);\n            if (isNgAttr) {\n              name = name.replace(PREFIX_REGEXP, '')\n                .substr(8).replace(/_(.)/g, function(match, letter) {\n                  return letter.toUpperCase();\n                });\n            }\n\n            var multiElementMatch = ngAttrName.match(MULTI_ELEMENT_DIR_RE);\n            if (multiElementMatch && directiveIsMultiElement(multiElementMatch[1])) {\n              attrStartName = name;\n              attrEndName = name.substr(0, name.length - 5) + 'end';\n              name = name.substr(0, name.length - 6);\n            }\n\n            nName = directiveNormalize(name.toLowerCase());\n            attrsMap[nName] = name;\n            if (isNgAttr || !attrs.hasOwnProperty(nName)) {\n                attrs[nName] = value;\n                if (getBooleanAttrName(node, nName)) {\n                  attrs[nName] = true; // presence means true\n                }\n            }\n            addAttrInterpolateDirective(node, directives, value, nName, isNgAttr);\n            addDirective(directives, nName, 'A', maxPriority, ignoreDirective, attrStartName,\n                          attrEndName);\n          }\n\n          if (nodeName === 'input' && node.getAttribute('type') === 'hidden') {\n            // Hidden input elements can have strange behaviour when navigating back to the page\n            // This tells the browser not to try to cache and reinstate previous values\n            node.setAttribute('autocomplete', 'off');\n          }\n\n          // use class as directive\n          if (!cssClassDirectivesEnabled) break;\n          className = node.className;\n          if (isObject(className)) {\n              // Maybe SVGAnimatedString\n              className = className.animVal;\n          }\n          if (isString(className) && className !== '') {\n            while ((match = CLASS_DIRECTIVE_REGEXP.exec(className))) {\n              nName = directiveNormalize(match[2]);\n              if (addDirective(directives, nName, 'C', maxPriority, ignoreDirective)) {\n                attrs[nName] = trim(match[3]);\n              }\n              className = className.substr(match.index + match[0].length);\n            }\n          }\n          break;\n        case NODE_TYPE_TEXT: /* Text Node */\n          addTextInterpolateDirective(directives, node.nodeValue);\n          break;\n        case NODE_TYPE_COMMENT: /* Comment */\n          if (!commentDirectivesEnabled) break;\n          collectCommentDirectives(node, directives, attrs, maxPriority, ignoreDirective);\n          break;\n      }\n\n      directives.sort(byPriority);\n      return directives;\n    }\n\n    function collectCommentDirectives(node, directives, attrs, maxPriority, ignoreDirective) {\n      // function created because of performance, try/catch disables\n      // the optimization of the whole function #14848\n      try {\n        var match = COMMENT_DIRECTIVE_REGEXP.exec(node.nodeValue);\n        if (match) {\n          var nName = directiveNormalize(match[1]);\n          if (addDirective(directives, nName, 'M', maxPriority, ignoreDirective)) {\n            attrs[nName] = trim(match[2]);\n          }\n        }\n      } catch (e) {\n        // turns out that under some circumstances IE9 throws errors when one attempts to read\n        // comment's node value.\n        // Just ignore it and continue. (Can't seem to reproduce in test case.)\n      }\n    }\n\n    /**\n     * Given a node with a directive-start it collects all of the siblings until it finds\n     * directive-end.\n     * @param node\n     * @param attrStart\n     * @param attrEnd\n     * @returns {*}\n     */\n    function groupScan(node, attrStart, attrEnd) {\n      var nodes = [];\n      var depth = 0;\n      if (attrStart && node.hasAttribute && node.hasAttribute(attrStart)) {\n        do {\n          if (!node) {\n            throw $compileMinErr('uterdir',\n                      'Unterminated attribute, found \\'{0}\\' but no matching \\'{1}\\' found.',\n                      attrStart, attrEnd);\n          }\n          if (node.nodeType === NODE_TYPE_ELEMENT) {\n            if (node.hasAttribute(attrStart)) depth++;\n            if (node.hasAttribute(attrEnd)) depth--;\n          }\n          nodes.push(node);\n          node = node.nextSibling;\n        } while (depth > 0);\n      } else {\n        nodes.push(node);\n      }\n\n      return jqLite(nodes);\n    }\n\n    /**\n     * Wrapper for linking function which converts normal linking function into a grouped\n     * linking function.\n     * @param linkFn\n     * @param attrStart\n     * @param attrEnd\n     * @returns {Function}\n     */\n    function groupElementsLinkFnWrapper(linkFn, attrStart, attrEnd) {\n      return function groupedElementsLink(scope, element, attrs, controllers, transcludeFn) {\n        element = groupScan(element[0], attrStart, attrEnd);\n        return linkFn(scope, element, attrs, controllers, transcludeFn);\n      };\n    }\n\n    /**\n     * A function generator that is used to support both eager and lazy compilation\n     * linking function.\n     * @param eager\n     * @param $compileNodes\n     * @param transcludeFn\n     * @param maxPriority\n     * @param ignoreDirective\n     * @param previousCompileContext\n     * @returns {Function}\n     */\n    function compilationGenerator(eager, $compileNodes, transcludeFn, maxPriority, ignoreDirective, previousCompileContext) {\n      var compiled;\n\n      if (eager) {\n        return compile($compileNodes, transcludeFn, maxPriority, ignoreDirective, previousCompileContext);\n      }\n      return /** @this */ function lazyCompilation() {\n        if (!compiled) {\n          compiled = compile($compileNodes, transcludeFn, maxPriority, ignoreDirective, previousCompileContext);\n\n          // Null out all of these references in order to make them eligible for garbage collection\n          // since this is a potentially long lived closure\n          $compileNodes = transcludeFn = previousCompileContext = null;\n        }\n        return compiled.apply(this, arguments);\n      };\n    }\n\n    /**\n     * Once the directives have been collected, their compile functions are executed. This method\n     * is responsible for inlining directive templates as well as terminating the application\n     * of the directives if the terminal directive has been reached.\n     *\n     * @param {Array} directives Array of collected directives to execute their compile function.\n     *        this needs to be pre-sorted by priority order.\n     * @param {Node} compileNode The raw DOM node to apply the compile functions to\n     * @param {Object} templateAttrs The shared attribute function\n     * @param {function(angular.Scope, cloneAttachFn=)} transcludeFn A linking function, where the\n     *                                                  scope argument is auto-generated to the new\n     *                                                  child of the transcluded parent scope.\n     * @param {JQLite} jqCollection If we are working on the root of the compile tree then this\n     *                              argument has the root jqLite array so that we can replace nodes\n     *                              on it.\n     * @param {Object=} originalReplaceDirective An optional directive that will be ignored when\n     *                                           compiling the transclusion.\n     * @param {Array.<Function>} preLinkFns\n     * @param {Array.<Function>} postLinkFns\n     * @param {Object} previousCompileContext Context used for previous compilation of the current\n     *                                        node\n     * @returns {Function} linkFn\n     */\n    function applyDirectivesToNode(directives, compileNode, templateAttrs, transcludeFn,\n                                   jqCollection, originalReplaceDirective, preLinkFns, postLinkFns,\n                                   previousCompileContext) {\n      previousCompileContext = previousCompileContext || {};\n\n      var terminalPriority = -Number.MAX_VALUE,\n          newScopeDirective = previousCompileContext.newScopeDirective,\n          controllerDirectives = previousCompileContext.controllerDirectives,\n          newIsolateScopeDirective = previousCompileContext.newIsolateScopeDirective,\n          templateDirective = previousCompileContext.templateDirective,\n          nonTlbTranscludeDirective = previousCompileContext.nonTlbTranscludeDirective,\n          hasTranscludeDirective = false,\n          hasTemplate = false,\n          hasElementTranscludeDirective = previousCompileContext.hasElementTranscludeDirective,\n          $compileNode = templateAttrs.$$element = jqLite(compileNode),\n          directive,\n          directiveName,\n          $template,\n          replaceDirective = originalReplaceDirective,\n          childTranscludeFn = transcludeFn,\n          linkFn,\n          didScanForMultipleTransclusion = false,\n          mightHaveMultipleTransclusionError = false,\n          directiveValue;\n\n      // executes all directives on the current element\n      for (var i = 0, ii = directives.length; i < ii; i++) {\n        directive = directives[i];\n        var attrStart = directive.$$start;\n        var attrEnd = directive.$$end;\n\n        // collect multiblock sections\n        if (attrStart) {\n          $compileNode = groupScan(compileNode, attrStart, attrEnd);\n        }\n        $template = undefined;\n\n        if (terminalPriority > directive.priority) {\n          break; // prevent further processing of directives\n        }\n\n        directiveValue = directive.scope;\n\n        if (directiveValue) {\n\n          // skip the check for directives with async templates, we'll check the derived sync\n          // directive when the template arrives\n          if (!directive.templateUrl) {\n            if (isObject(directiveValue)) {\n              // This directive is trying to add an isolated scope.\n              // Check that there is no scope of any kind already\n              assertNoDuplicate('new/isolated scope', newIsolateScopeDirective || newScopeDirective,\n                                directive, $compileNode);\n              newIsolateScopeDirective = directive;\n            } else {\n              // This directive is trying to add a child scope.\n              // Check that there is no isolated scope already\n              assertNoDuplicate('new/isolated scope', newIsolateScopeDirective, directive,\n                                $compileNode);\n            }\n          }\n\n          newScopeDirective = newScopeDirective || directive;\n        }\n\n        directiveName = directive.name;\n\n        // If we encounter a condition that can result in transclusion on the directive,\n        // then scan ahead in the remaining directives for others that may cause a multiple\n        // transclusion error to be thrown during the compilation process.  If a matching directive\n        // is found, then we know that when we encounter a transcluded directive, we need to eagerly\n        // compile the `transclude` function rather than doing it lazily in order to throw\n        // exceptions at the correct time\n        if (!didScanForMultipleTransclusion && ((directive.replace && (directive.templateUrl || directive.template))\n            || (directive.transclude && !directive.$$tlb))) {\n                var candidateDirective;\n\n                for (var scanningIndex = i + 1; (candidateDirective = directives[scanningIndex++]);) {\n                    if ((candidateDirective.transclude && !candidateDirective.$$tlb)\n                        || (candidateDirective.replace && (candidateDirective.templateUrl || candidateDirective.template))) {\n                        mightHaveMultipleTransclusionError = true;\n                        break;\n                    }\n                }\n\n                didScanForMultipleTransclusion = true;\n        }\n\n        if (!directive.templateUrl && directive.controller) {\n          controllerDirectives = controllerDirectives || createMap();\n          assertNoDuplicate('\\'' + directiveName + '\\' controller',\n              controllerDirectives[directiveName], directive, $compileNode);\n          controllerDirectives[directiveName] = directive;\n        }\n\n        directiveValue = directive.transclude;\n\n        if (directiveValue) {\n          hasTranscludeDirective = true;\n\n          // Special case ngIf and ngRepeat so that we don't complain about duplicate transclusion.\n          // This option should only be used by directives that know how to safely handle element transclusion,\n          // where the transcluded nodes are added or replaced after linking.\n          if (!directive.$$tlb) {\n            assertNoDuplicate('transclusion', nonTlbTranscludeDirective, directive, $compileNode);\n            nonTlbTranscludeDirective = directive;\n          }\n\n          if (directiveValue === 'element') {\n            hasElementTranscludeDirective = true;\n            terminalPriority = directive.priority;\n            $template = $compileNode;\n            $compileNode = templateAttrs.$$element =\n                jqLite(compile.$$createComment(directiveName, templateAttrs[directiveName]));\n            compileNode = $compileNode[0];\n            replaceWith(jqCollection, sliceArgs($template), compileNode);\n\n            // Support: Chrome < 50\n            // https://github.com/angular/angular.js/issues/14041\n\n            // In the versions of V8 prior to Chrome 50, the document fragment that is created\n            // in the `replaceWith` function is improperly garbage collected despite still\n            // being referenced by the `parentNode` property of all of the child nodes.  By adding\n            // a reference to the fragment via a different property, we can avoid that incorrect\n            // behavior.\n            // TODO: remove this line after Chrome 50 has been released\n            $template[0].$$parentNode = $template[0].parentNode;\n\n            childTranscludeFn = compilationGenerator(mightHaveMultipleTransclusionError, $template, transcludeFn, terminalPriority,\n                                        replaceDirective && replaceDirective.name, {\n                                          // Don't pass in:\n                                          // - controllerDirectives - otherwise we'll create duplicates controllers\n                                          // - newIsolateScopeDirective or templateDirective - combining templates with\n                                          //   element transclusion doesn't make sense.\n                                          //\n                                          // We need only nonTlbTranscludeDirective so that we prevent putting transclusion\n                                          // on the same element more than once.\n                                          nonTlbTranscludeDirective: nonTlbTranscludeDirective\n                                        });\n          } else {\n\n            var slots = createMap();\n\n            if (!isObject(directiveValue)) {\n              $template = jqLite(jqLiteClone(compileNode)).contents();\n            } else {\n\n              // We have transclusion slots,\n              // collect them up, compile them and store their transclusion functions\n              $template = [];\n\n              var slotMap = createMap();\n              var filledSlots = createMap();\n\n              // Parse the element selectors\n              forEach(directiveValue, function(elementSelector, slotName) {\n                // If an element selector starts with a ? then it is optional\n                var optional = (elementSelector.charAt(0) === '?');\n                elementSelector = optional ? elementSelector.substring(1) : elementSelector;\n\n                slotMap[elementSelector] = slotName;\n\n                // We explicitly assign `null` since this implies that a slot was defined but not filled.\n                // Later when calling boundTransclusion functions with a slot name we only error if the\n                // slot is `undefined`\n                slots[slotName] = null;\n\n                // filledSlots contains `true` for all slots that are either optional or have been\n                // filled. This is used to check that we have not missed any required slots\n                filledSlots[slotName] = optional;\n              });\n\n              // Add the matching elements into their slot\n              forEach($compileNode.contents(), function(node) {\n                var slotName = slotMap[directiveNormalize(nodeName_(node))];\n                if (slotName) {\n                  filledSlots[slotName] = true;\n                  slots[slotName] = slots[slotName] || [];\n                  slots[slotName].push(node);\n                } else {\n                  $template.push(node);\n                }\n              });\n\n              // Check for required slots that were not filled\n              forEach(filledSlots, function(filled, slotName) {\n                if (!filled) {\n                  throw $compileMinErr('reqslot', 'Required transclusion slot `{0}` was not filled.', slotName);\n                }\n              });\n\n              for (var slotName in slots) {\n                if (slots[slotName]) {\n                  // Only define a transclusion function if the slot was filled\n                  slots[slotName] = compilationGenerator(mightHaveMultipleTransclusionError, slots[slotName], transcludeFn);\n                }\n              }\n            }\n\n            $compileNode.empty(); // clear contents\n            childTranscludeFn = compilationGenerator(mightHaveMultipleTransclusionError, $template, transcludeFn, undefined,\n                undefined, { needsNewScope: directive.$$isolateScope || directive.$$newScope});\n            childTranscludeFn.$$slots = slots;\n          }\n        }\n\n        if (directive.template) {\n          hasTemplate = true;\n          assertNoDuplicate('template', templateDirective, directive, $compileNode);\n          templateDirective = directive;\n\n          directiveValue = (isFunction(directive.template))\n              ? directive.template($compileNode, templateAttrs)\n              : directive.template;\n\n          directiveValue = denormalizeTemplate(directiveValue);\n\n          if (directive.replace) {\n            replaceDirective = directive;\n            if (jqLiteIsTextNode(directiveValue)) {\n              $template = [];\n            } else {\n              $template = removeComments(wrapTemplate(directive.templateNamespace, trim(directiveValue)));\n            }\n            compileNode = $template[0];\n\n            if ($template.length !== 1 || compileNode.nodeType !== NODE_TYPE_ELEMENT) {\n              throw $compileMinErr('tplrt',\n                  'Template for directive \\'{0}\\' must have exactly one root element. {1}',\n                  directiveName, '');\n            }\n\n            replaceWith(jqCollection, $compileNode, compileNode);\n\n            var newTemplateAttrs = {$attr: {}};\n\n            // combine directives from the original node and from the template:\n            // - take the array of directives for this element\n            // - split it into two parts, those that already applied (processed) and those that weren't (unprocessed)\n            // - collect directives from the template and sort them by priority\n            // - combine directives as: processed + template + unprocessed\n            var templateDirectives = collectDirectives(compileNode, [], newTemplateAttrs);\n            var unprocessedDirectives = directives.splice(i + 1, directives.length - (i + 1));\n\n            if (newIsolateScopeDirective || newScopeDirective) {\n              // The original directive caused the current element to be replaced but this element\n              // also needs to have a new scope, so we need to tell the template directives\n              // that they would need to get their scope from further up, if they require transclusion\n              markDirectiveScope(templateDirectives, newIsolateScopeDirective, newScopeDirective);\n            }\n            directives = directives.concat(templateDirectives).concat(unprocessedDirectives);\n            mergeTemplateAttributes(templateAttrs, newTemplateAttrs);\n\n            ii = directives.length;\n          } else {\n            $compileNode.html(directiveValue);\n          }\n        }\n\n        if (directive.templateUrl) {\n          hasTemplate = true;\n          assertNoDuplicate('template', templateDirective, directive, $compileNode);\n          templateDirective = directive;\n\n          if (directive.replace) {\n            replaceDirective = directive;\n          }\n\n          // eslint-disable-next-line no-func-assign\n          nodeLinkFn = compileTemplateUrl(directives.splice(i, directives.length - i), $compileNode,\n              templateAttrs, jqCollection, hasTranscludeDirective && childTranscludeFn, preLinkFns, postLinkFns, {\n                controllerDirectives: controllerDirectives,\n                newScopeDirective: (newScopeDirective !== directive) && newScopeDirective,\n                newIsolateScopeDirective: newIsolateScopeDirective,\n                templateDirective: templateDirective,\n                nonTlbTranscludeDirective: nonTlbTranscludeDirective\n              });\n          ii = directives.length;\n        } else if (directive.compile) {\n          try {\n            linkFn = directive.compile($compileNode, templateAttrs, childTranscludeFn);\n            var context = directive.$$originalDirective || directive;\n            if (isFunction(linkFn)) {\n              addLinkFns(null, bind(context, linkFn), attrStart, attrEnd);\n            } else if (linkFn) {\n              addLinkFns(bind(context, linkFn.pre), bind(context, linkFn.post), attrStart, attrEnd);\n            }\n          } catch (e) {\n            $exceptionHandler(e, startingTag($compileNode));\n          }\n        }\n\n        if (directive.terminal) {\n          nodeLinkFn.terminal = true;\n          terminalPriority = Math.max(terminalPriority, directive.priority);\n        }\n\n      }\n\n      nodeLinkFn.scope = newScopeDirective && newScopeDirective.scope === true;\n      nodeLinkFn.transcludeOnThisElement = hasTranscludeDirective;\n      nodeLinkFn.templateOnThisElement = hasTemplate;\n      nodeLinkFn.transclude = childTranscludeFn;\n\n      previousCompileContext.hasElementTranscludeDirective = hasElementTranscludeDirective;\n\n      // might be normal or delayed nodeLinkFn depending on if templateUrl is present\n      return nodeLinkFn;\n\n      ////////////////////\n\n      function addLinkFns(pre, post, attrStart, attrEnd) {\n        if (pre) {\n          if (attrStart) pre = groupElementsLinkFnWrapper(pre, attrStart, attrEnd);\n          pre.require = directive.require;\n          pre.directiveName = directiveName;\n          if (newIsolateScopeDirective === directive || directive.$$isolateScope) {\n            pre = cloneAndAnnotateFn(pre, {isolateScope: true});\n          }\n          preLinkFns.push(pre);\n        }\n        if (post) {\n          if (attrStart) post = groupElementsLinkFnWrapper(post, attrStart, attrEnd);\n          post.require = directive.require;\n          post.directiveName = directiveName;\n          if (newIsolateScopeDirective === directive || directive.$$isolateScope) {\n            post = cloneAndAnnotateFn(post, {isolateScope: true});\n          }\n          postLinkFns.push(post);\n        }\n      }\n\n      function nodeLinkFn(childLinkFn, scope, linkNode, $rootElement, boundTranscludeFn) {\n        var i, ii, linkFn, isolateScope, controllerScope, elementControllers, transcludeFn, $element,\n            attrs, scopeBindingInfo;\n\n        if (compileNode === linkNode) {\n          attrs = templateAttrs;\n          $element = templateAttrs.$$element;\n        } else {\n          $element = jqLite(linkNode);\n          attrs = new Attributes($element, templateAttrs);\n        }\n\n        controllerScope = scope;\n        if (newIsolateScopeDirective) {\n          isolateScope = scope.$new(true);\n        } else if (newScopeDirective) {\n          controllerScope = scope.$parent;\n        }\n\n        if (boundTranscludeFn) {\n          // track `boundTranscludeFn` so it can be unwrapped if `transcludeFn`\n          // is later passed as `parentBoundTranscludeFn` to `publicLinkFn`\n          transcludeFn = controllersBoundTransclude;\n          transcludeFn.$$boundTransclude = boundTranscludeFn;\n          // expose the slots on the `$transclude` function\n          transcludeFn.isSlotFilled = function(slotName) {\n            return !!boundTranscludeFn.$$slots[slotName];\n          };\n        }\n\n        if (controllerDirectives) {\n          elementControllers = setupControllers($element, attrs, transcludeFn, controllerDirectives, isolateScope, scope, newIsolateScopeDirective);\n        }\n\n        if (newIsolateScopeDirective) {\n          // Initialize isolate scope bindings for new isolate scope directive.\n          compile.$$addScopeInfo($element, isolateScope, true, !(templateDirective && (templateDirective === newIsolateScopeDirective ||\n              templateDirective === newIsolateScopeDirective.$$originalDirective)));\n          compile.$$addScopeClass($element, true);\n          isolateScope.$$isolateBindings =\n              newIsolateScopeDirective.$$isolateBindings;\n          scopeBindingInfo = initializeDirectiveBindings(scope, attrs, isolateScope,\n                                        isolateScope.$$isolateBindings,\n                                        newIsolateScopeDirective);\n          if (scopeBindingInfo.removeWatches) {\n            isolateScope.$on('$destroy', scopeBindingInfo.removeWatches);\n          }\n        }\n\n        // Initialize bindToController bindings\n        for (var name in elementControllers) {\n          var controllerDirective = controllerDirectives[name];\n          var controller = elementControllers[name];\n          var bindings = controllerDirective.$$bindings.bindToController;\n\n          if (preAssignBindingsEnabled) {\n            if (bindings) {\n              controller.bindingInfo =\n                initializeDirectiveBindings(controllerScope, attrs, controller.instance, bindings, controllerDirective);\n            } else {\n              controller.bindingInfo = {};\n            }\n\n            var controllerResult = controller();\n            if (controllerResult !== controller.instance) {\n              // If the controller constructor has a return value, overwrite the instance\n              // from setupControllers\n              controller.instance = controllerResult;\n              $element.data('$' + controllerDirective.name + 'Controller', controllerResult);\n              if (controller.bindingInfo.removeWatches) {\n                controller.bindingInfo.removeWatches();\n              }\n              controller.bindingInfo =\n                initializeDirectiveBindings(controllerScope, attrs, controller.instance, bindings, controllerDirective);\n            }\n          } else {\n            controller.instance = controller();\n            $element.data('$' + controllerDirective.name + 'Controller', controller.instance);\n            controller.bindingInfo =\n              initializeDirectiveBindings(controllerScope, attrs, controller.instance, bindings, controllerDirective);\n          }\n        }\n\n        // Bind the required controllers to the controller, if `require` is an object and `bindToController` is truthy\n        forEach(controllerDirectives, function(controllerDirective, name) {\n          var require = controllerDirective.require;\n          if (controllerDirective.bindToController && !isArray(require) && isObject(require)) {\n            extend(elementControllers[name].instance, getControllers(name, require, $element, elementControllers));\n          }\n        });\n\n        // Handle the init and destroy lifecycle hooks on all controllers that have them\n        forEach(elementControllers, function(controller) {\n          var controllerInstance = controller.instance;\n          if (isFunction(controllerInstance.$onChanges)) {\n            try {\n              controllerInstance.$onChanges(controller.bindingInfo.initialChanges);\n            } catch (e) {\n              $exceptionHandler(e);\n            }\n          }\n          if (isFunction(controllerInstance.$onInit)) {\n            try {\n              controllerInstance.$onInit();\n            } catch (e) {\n              $exceptionHandler(e);\n            }\n          }\n          if (isFunction(controllerInstance.$doCheck)) {\n            controllerScope.$watch(function() { controllerInstance.$doCheck(); });\n            controllerInstance.$doCheck();\n          }\n          if (isFunction(controllerInstance.$onDestroy)) {\n            controllerScope.$on('$destroy', function callOnDestroyHook() {\n              controllerInstance.$onDestroy();\n            });\n          }\n        });\n\n        // PRELINKING\n        for (i = 0, ii = preLinkFns.length; i < ii; i++) {\n          linkFn = preLinkFns[i];\n          invokeLinkFn(linkFn,\n              linkFn.isolateScope ? isolateScope : scope,\n              $element,\n              attrs,\n              linkFn.require && getControllers(linkFn.directiveName, linkFn.require, $element, elementControllers),\n              transcludeFn\n          );\n        }\n\n        // RECURSION\n        // We only pass the isolate scope, if the isolate directive has a template,\n        // otherwise the child elements do not belong to the isolate directive.\n        var scopeToChild = scope;\n        if (newIsolateScopeDirective && (newIsolateScopeDirective.template || newIsolateScopeDirective.templateUrl === null)) {\n          scopeToChild = isolateScope;\n        }\n        if (childLinkFn) {\n          childLinkFn(scopeToChild, linkNode.childNodes, undefined, boundTranscludeFn);\n        }\n\n        // POSTLINKING\n        for (i = postLinkFns.length - 1; i >= 0; i--) {\n          linkFn = postLinkFns[i];\n          invokeLinkFn(linkFn,\n              linkFn.isolateScope ? isolateScope : scope,\n              $element,\n              attrs,\n              linkFn.require && getControllers(linkFn.directiveName, linkFn.require, $element, elementControllers),\n              transcludeFn\n          );\n        }\n\n        // Trigger $postLink lifecycle hooks\n        forEach(elementControllers, function(controller) {\n          var controllerInstance = controller.instance;\n          if (isFunction(controllerInstance.$postLink)) {\n            controllerInstance.$postLink();\n          }\n        });\n\n        // This is the function that is injected as `$transclude`.\n        // Note: all arguments are optional!\n        function controllersBoundTransclude(scope, cloneAttachFn, futureParentElement, slotName) {\n          var transcludeControllers;\n          // No scope passed in:\n          if (!isScope(scope)) {\n            slotName = futureParentElement;\n            futureParentElement = cloneAttachFn;\n            cloneAttachFn = scope;\n            scope = undefined;\n          }\n\n          if (hasElementTranscludeDirective) {\n            transcludeControllers = elementControllers;\n          }\n          if (!futureParentElement) {\n            futureParentElement = hasElementTranscludeDirective ? $element.parent() : $element;\n          }\n          if (slotName) {\n            // slotTranscludeFn can be one of three things:\n            //  * a transclude function - a filled slot\n            //  * `null` - an optional slot that was not filled\n            //  * `undefined` - a slot that was not declared (i.e. invalid)\n            var slotTranscludeFn = boundTranscludeFn.$$slots[slotName];\n            if (slotTranscludeFn) {\n              return slotTranscludeFn(scope, cloneAttachFn, transcludeControllers, futureParentElement, scopeToChild);\n            } else if (isUndefined(slotTranscludeFn)) {\n              throw $compileMinErr('noslot',\n               'No parent directive that requires a transclusion with slot name \"{0}\". ' +\n               'Element: {1}',\n               slotName, startingTag($element));\n            }\n          } else {\n            return boundTranscludeFn(scope, cloneAttachFn, transcludeControllers, futureParentElement, scopeToChild);\n          }\n        }\n      }\n    }\n\n    function getControllers(directiveName, require, $element, elementControllers) {\n      var value;\n\n      if (isString(require)) {\n        var match = require.match(REQUIRE_PREFIX_REGEXP);\n        var name = require.substring(match[0].length);\n        var inheritType = match[1] || match[3];\n        var optional = match[2] === '?';\n\n        //If only parents then start at the parent element\n        if (inheritType === '^^') {\n          $element = $element.parent();\n        //Otherwise attempt getting the controller from elementControllers in case\n        //the element is transcluded (and has no data) and to avoid .data if possible\n        } else {\n          value = elementControllers && elementControllers[name];\n          value = value && value.instance;\n        }\n\n        if (!value) {\n          var dataName = '$' + name + 'Controller';\n          value = inheritType ? $element.inheritedData(dataName) : $element.data(dataName);\n        }\n\n        if (!value && !optional) {\n          throw $compileMinErr('ctreq',\n              'Controller \\'{0}\\', required by directive \\'{1}\\', can\\'t be found!',\n              name, directiveName);\n        }\n      } else if (isArray(require)) {\n        value = [];\n        for (var i = 0, ii = require.length; i < ii; i++) {\n          value[i] = getControllers(directiveName, require[i], $element, elementControllers);\n        }\n      } else if (isObject(require)) {\n        value = {};\n        forEach(require, function(controller, property) {\n          value[property] = getControllers(directiveName, controller, $element, elementControllers);\n        });\n      }\n\n      return value || null;\n    }\n\n    function setupControllers($element, attrs, transcludeFn, controllerDirectives, isolateScope, scope, newIsolateScopeDirective) {\n      var elementControllers = createMap();\n      for (var controllerKey in controllerDirectives) {\n        var directive = controllerDirectives[controllerKey];\n        var locals = {\n          $scope: directive === newIsolateScopeDirective || directive.$$isolateScope ? isolateScope : scope,\n          $element: $element,\n          $attrs: attrs,\n          $transclude: transcludeFn\n        };\n\n        var controller = directive.controller;\n        if (controller === '@') {\n          controller = attrs[directive.name];\n        }\n\n        var controllerInstance = $controller(controller, locals, true, directive.controllerAs);\n\n        // For directives with element transclusion the element is a comment.\n        // In this case .data will not attach any data.\n        // Instead, we save the controllers for the element in a local hash and attach to .data\n        // later, once we have the actual element.\n        elementControllers[directive.name] = controllerInstance;\n        $element.data('$' + directive.name + 'Controller', controllerInstance.instance);\n      }\n      return elementControllers;\n    }\n\n    // Depending upon the context in which a directive finds itself it might need to have a new isolated\n    // or child scope created. For instance:\n    // * if the directive has been pulled into a template because another directive with a higher priority\n    // asked for element transclusion\n    // * if the directive itself asks for transclusion but it is at the root of a template and the original\n    // element was replaced. See https://github.com/angular/angular.js/issues/12936\n    function markDirectiveScope(directives, isolateScope, newScope) {\n      for (var j = 0, jj = directives.length; j < jj; j++) {\n        directives[j] = inherit(directives[j], {$$isolateScope: isolateScope, $$newScope: newScope});\n      }\n    }\n\n    /**\n     * looks up the directive and decorates it with exception handling and proper parameters. We\n     * call this the boundDirective.\n     *\n     * @param {string} name name of the directive to look up.\n     * @param {string} location The directive must be found in specific format.\n     *   String containing any of theses characters:\n     *\n     *   * `E`: element name\n     *   * `A': attribute\n     *   * `C`: class\n     *   * `M`: comment\n     * @returns {boolean} true if directive was added.\n     */\n    function addDirective(tDirectives, name, location, maxPriority, ignoreDirective, startAttrName,\n                          endAttrName) {\n      if (name === ignoreDirective) return null;\n      var match = null;\n      if (hasDirectives.hasOwnProperty(name)) {\n        for (var directive, directives = $injector.get(name + Suffix),\n            i = 0, ii = directives.length; i < ii; i++) {\n          directive = directives[i];\n          if ((isUndefined(maxPriority) || maxPriority > directive.priority) &&\n               directive.restrict.indexOf(location) !== -1) {\n            if (startAttrName) {\n              directive = inherit(directive, {$$start: startAttrName, $$end: endAttrName});\n            }\n            if (!directive.$$bindings) {\n              var bindings = directive.$$bindings =\n                  parseDirectiveBindings(directive, directive.name);\n              if (isObject(bindings.isolateScope)) {\n                directive.$$isolateBindings = bindings.isolateScope;\n              }\n            }\n            tDirectives.push(directive);\n            match = directive;\n          }\n        }\n      }\n      return match;\n    }\n\n\n    /**\n     * looks up the directive and returns true if it is a multi-element directive,\n     * and therefore requires DOM nodes between -start and -end markers to be grouped\n     * together.\n     *\n     * @param {string} name name of the directive to look up.\n     * @returns true if directive was registered as multi-element.\n     */\n    function directiveIsMultiElement(name) {\n      if (hasDirectives.hasOwnProperty(name)) {\n        for (var directive, directives = $injector.get(name + Suffix),\n            i = 0, ii = directives.length; i < ii; i++) {\n          directive = directives[i];\n          if (directive.multiElement) {\n            return true;\n          }\n        }\n      }\n      return false;\n    }\n\n    /**\n     * When the element is replaced with HTML template then the new attributes\n     * on the template need to be merged with the existing attributes in the DOM.\n     * The desired effect is to have both of the attributes present.\n     *\n     * @param {object} dst destination attributes (original DOM)\n     * @param {object} src source attributes (from the directive template)\n     */\n    function mergeTemplateAttributes(dst, src) {\n      var srcAttr = src.$attr,\n          dstAttr = dst.$attr;\n\n      // reapply the old attributes to the new element\n      forEach(dst, function(value, key) {\n        if (key.charAt(0) !== '$') {\n          if (src[key] && src[key] !== value) {\n            if (value.length) {\n              value += (key === 'style' ? ';' : ' ') + src[key];\n            } else {\n              value = src[key];\n            }\n          }\n          dst.$set(key, value, true, srcAttr[key]);\n        }\n      });\n\n      // copy the new attributes on the old attrs object\n      forEach(src, function(value, key) {\n        // Check if we already set this attribute in the loop above.\n        // `dst` will never contain hasOwnProperty as DOM parser won't let it.\n        // You will get an \"InvalidCharacterError: DOM Exception 5\" error if you\n        // have an attribute like \"has-own-property\" or \"data-has-own-property\", etc.\n        if (!dst.hasOwnProperty(key) && key.charAt(0) !== '$') {\n          dst[key] = value;\n\n          if (key !== 'class' && key !== 'style') {\n            dstAttr[key] = srcAttr[key];\n          }\n        }\n      });\n    }\n\n\n    function compileTemplateUrl(directives, $compileNode, tAttrs,\n        $rootElement, childTranscludeFn, preLinkFns, postLinkFns, previousCompileContext) {\n      var linkQueue = [],\n          afterTemplateNodeLinkFn,\n          afterTemplateChildLinkFn,\n          beforeTemplateCompileNode = $compileNode[0],\n          origAsyncDirective = directives.shift(),\n          derivedSyncDirective = inherit(origAsyncDirective, {\n            templateUrl: null, transclude: null, replace: null, $$originalDirective: origAsyncDirective\n          }),\n          templateUrl = (isFunction(origAsyncDirective.templateUrl))\n              ? origAsyncDirective.templateUrl($compileNode, tAttrs)\n              : origAsyncDirective.templateUrl,\n          templateNamespace = origAsyncDirective.templateNamespace;\n\n      $compileNode.empty();\n\n      $templateRequest(templateUrl)\n        .then(function(content) {\n          var compileNode, tempTemplateAttrs, $template, childBoundTranscludeFn;\n\n          content = denormalizeTemplate(content);\n\n          if (origAsyncDirective.replace) {\n            if (jqLiteIsTextNode(content)) {\n              $template = [];\n            } else {\n              $template = removeComments(wrapTemplate(templateNamespace, trim(content)));\n            }\n            compileNode = $template[0];\n\n            if ($template.length !== 1 || compileNode.nodeType !== NODE_TYPE_ELEMENT) {\n              throw $compileMinErr('tplrt',\n                  'Template for directive \\'{0}\\' must have exactly one root element. {1}',\n                  origAsyncDirective.name, templateUrl);\n            }\n\n            tempTemplateAttrs = {$attr: {}};\n            replaceWith($rootElement, $compileNode, compileNode);\n            var templateDirectives = collectDirectives(compileNode, [], tempTemplateAttrs);\n\n            if (isObject(origAsyncDirective.scope)) {\n              // the original directive that caused the template to be loaded async required\n              // an isolate scope\n              markDirectiveScope(templateDirectives, true);\n            }\n            directives = templateDirectives.concat(directives);\n            mergeTemplateAttributes(tAttrs, tempTemplateAttrs);\n          } else {\n            compileNode = beforeTemplateCompileNode;\n            $compileNode.html(content);\n          }\n\n          directives.unshift(derivedSyncDirective);\n\n          afterTemplateNodeLinkFn = applyDirectivesToNode(directives, compileNode, tAttrs,\n              childTranscludeFn, $compileNode, origAsyncDirective, preLinkFns, postLinkFns,\n              previousCompileContext);\n          forEach($rootElement, function(node, i) {\n            if (node === compileNode) {\n              $rootElement[i] = $compileNode[0];\n            }\n          });\n          afterTemplateChildLinkFn = compileNodes($compileNode[0].childNodes, childTranscludeFn);\n\n          while (linkQueue.length) {\n            var scope = linkQueue.shift(),\n                beforeTemplateLinkNode = linkQueue.shift(),\n                linkRootElement = linkQueue.shift(),\n                boundTranscludeFn = linkQueue.shift(),\n                linkNode = $compileNode[0];\n\n            if (scope.$$destroyed) continue;\n\n            if (beforeTemplateLinkNode !== beforeTemplateCompileNode) {\n              var oldClasses = beforeTemplateLinkNode.className;\n\n              if (!(previousCompileContext.hasElementTranscludeDirective &&\n                  origAsyncDirective.replace)) {\n                // it was cloned therefore we have to clone as well.\n                linkNode = jqLiteClone(compileNode);\n              }\n              replaceWith(linkRootElement, jqLite(beforeTemplateLinkNode), linkNode);\n\n              // Copy in CSS classes from original node\n              safeAddClass(jqLite(linkNode), oldClasses);\n            }\n            if (afterTemplateNodeLinkFn.transcludeOnThisElement) {\n              childBoundTranscludeFn = createBoundTranscludeFn(scope, afterTemplateNodeLinkFn.transclude, boundTranscludeFn);\n            } else {\n              childBoundTranscludeFn = boundTranscludeFn;\n            }\n            afterTemplateNodeLinkFn(afterTemplateChildLinkFn, scope, linkNode, $rootElement,\n              childBoundTranscludeFn);\n          }\n          linkQueue = null;\n        }).catch(function(error) {\n          if (error instanceof Error) {\n            $exceptionHandler(error);\n          }\n        });\n\n      return function delayedNodeLinkFn(ignoreChildLinkFn, scope, node, rootElement, boundTranscludeFn) {\n        var childBoundTranscludeFn = boundTranscludeFn;\n        if (scope.$$destroyed) return;\n        if (linkQueue) {\n          linkQueue.push(scope,\n                         node,\n                         rootElement,\n                         childBoundTranscludeFn);\n        } else {\n          if (afterTemplateNodeLinkFn.transcludeOnThisElement) {\n            childBoundTranscludeFn = createBoundTranscludeFn(scope, afterTemplateNodeLinkFn.transclude, boundTranscludeFn);\n          }\n          afterTemplateNodeLinkFn(afterTemplateChildLinkFn, scope, node, rootElement, childBoundTranscludeFn);\n        }\n      };\n    }\n\n\n    /**\n     * Sorting function for bound directives.\n     */\n    function byPriority(a, b) {\n      var diff = b.priority - a.priority;\n      if (diff !== 0) return diff;\n      if (a.name !== b.name) return (a.name < b.name) ? -1 : 1;\n      return a.index - b.index;\n    }\n\n    function assertNoDuplicate(what, previousDirective, directive, element) {\n\n      function wrapModuleNameIfDefined(moduleName) {\n        return moduleName ?\n          (' (module: ' + moduleName + ')') :\n          '';\n      }\n\n      if (previousDirective) {\n        throw $compileMinErr('multidir', 'Multiple directives [{0}{1}, {2}{3}] asking for {4} on: {5}',\n            previousDirective.name, wrapModuleNameIfDefined(previousDirective.$$moduleName),\n            directive.name, wrapModuleNameIfDefined(directive.$$moduleName), what, startingTag(element));\n      }\n    }\n\n\n    function addTextInterpolateDirective(directives, text) {\n      var interpolateFn = $interpolate(text, true);\n      if (interpolateFn) {\n        directives.push({\n          priority: 0,\n          compile: function textInterpolateCompileFn(templateNode) {\n            var templateNodeParent = templateNode.parent(),\n                hasCompileParent = !!templateNodeParent.length;\n\n            // When transcluding a template that has bindings in the root\n            // we don't have a parent and thus need to add the class during linking fn.\n            if (hasCompileParent) compile.$$addBindingClass(templateNodeParent);\n\n            return function textInterpolateLinkFn(scope, node) {\n              var parent = node.parent();\n              if (!hasCompileParent) compile.$$addBindingClass(parent);\n              compile.$$addBindingInfo(parent, interpolateFn.expressions);\n              scope.$watch(interpolateFn, function interpolateFnWatchAction(value) {\n                node[0].nodeValue = value;\n              });\n            };\n          }\n        });\n      }\n    }\n\n\n    function wrapTemplate(type, template) {\n      type = lowercase(type || 'html');\n      switch (type) {\n      case 'svg':\n      case 'math':\n        var wrapper = window.document.createElement('div');\n        wrapper.innerHTML = '<' + type + '>' + template + '</' + type + '>';\n        return wrapper.childNodes[0].childNodes;\n      default:\n        return template;\n      }\n    }\n\n\n    function getTrustedContext(node, attrNormalizedName) {\n      if (attrNormalizedName === 'srcdoc') {\n        return $sce.HTML;\n      }\n      var tag = nodeName_(node);\n      // All tags with src attributes require a RESOURCE_URL value, except for\n      // img and various html5 media tags.\n      if (attrNormalizedName === 'src' || attrNormalizedName === 'ngSrc') {\n        if (['img', 'video', 'audio', 'source', 'track'].indexOf(tag) === -1) {\n          return $sce.RESOURCE_URL;\n        }\n      // maction[xlink:href] can source SVG.  It's not limited to <maction>.\n      } else if (attrNormalizedName === 'xlinkHref' ||\n          (tag === 'form' && attrNormalizedName === 'action') ||\n          // links can be stylesheets or imports, which can run script in the current origin\n          (tag === 'link' && attrNormalizedName === 'href')\n      ) {\n        return $sce.RESOURCE_URL;\n      }\n    }\n\n\n    function addAttrInterpolateDirective(node, directives, value, name, isNgAttr) {\n      var trustedContext = getTrustedContext(node, name);\n      var mustHaveExpression = !isNgAttr;\n      var allOrNothing = ALL_OR_NOTHING_ATTRS[name] || isNgAttr;\n\n      var interpolateFn = $interpolate(value, mustHaveExpression, trustedContext, allOrNothing);\n\n      // no interpolation found -> ignore\n      if (!interpolateFn) return;\n\n      if (name === 'multiple' && nodeName_(node) === 'select') {\n        throw $compileMinErr('selmulti',\n            'Binding to the \\'multiple\\' attribute is not supported. Element: {0}',\n            startingTag(node));\n      }\n\n      if (EVENT_HANDLER_ATTR_REGEXP.test(name)) {\n        throw $compileMinErr('nodomevents',\n            'Interpolations for HTML DOM event attributes are disallowed.  Please use the ' +\n                'ng- versions (such as ng-click instead of onclick) instead.');\n      }\n\n      directives.push({\n        priority: 100,\n        compile: function() {\n            return {\n              pre: function attrInterpolatePreLinkFn(scope, element, attr) {\n                var $$observers = (attr.$$observers || (attr.$$observers = createMap()));\n\n                // If the attribute has changed since last $interpolate()ed\n                var newValue = attr[name];\n                if (newValue !== value) {\n                  // we need to interpolate again since the attribute value has been updated\n                  // (e.g. by another directive's compile function)\n                  // ensure unset/empty values make interpolateFn falsy\n                  interpolateFn = newValue && $interpolate(newValue, true, trustedContext, allOrNothing);\n                  value = newValue;\n                }\n\n                // if attribute was updated so that there is no interpolation going on we don't want to\n                // register any observers\n                if (!interpolateFn) return;\n\n                // initialize attr object so that it's ready in case we need the value for isolate\n                // scope initialization, otherwise the value would not be available from isolate\n                // directive's linking fn during linking phase\n                attr[name] = interpolateFn(scope);\n\n                ($$observers[name] || ($$observers[name] = [])).$$inter = true;\n                (attr.$$observers && attr.$$observers[name].$$scope || scope).\n                  $watch(interpolateFn, function interpolateFnWatchAction(newValue, oldValue) {\n                    //special case for class attribute addition + removal\n                    //so that class changes can tap into the animation\n                    //hooks provided by the $animate service. Be sure to\n                    //skip animations when the first digest occurs (when\n                    //both the new and the old values are the same) since\n                    //the CSS classes are the non-interpolated values\n                    if (name === 'class' && newValue !== oldValue) {\n                      attr.$updateClass(newValue, oldValue);\n                    } else {\n                      attr.$set(name, newValue);\n                    }\n                  });\n              }\n            };\n          }\n      });\n    }\n\n\n    /**\n     * This is a special jqLite.replaceWith, which can replace items which\n     * have no parents, provided that the containing jqLite collection is provided.\n     *\n     * @param {JqLite=} $rootElement The root of the compile tree. Used so that we can replace nodes\n     *                               in the root of the tree.\n     * @param {JqLite} elementsToRemove The jqLite element which we are going to replace. We keep\n     *                                  the shell, but replace its DOM node reference.\n     * @param {Node} newNode The new DOM node.\n     */\n    function replaceWith($rootElement, elementsToRemove, newNode) {\n      var firstElementToRemove = elementsToRemove[0],\n          removeCount = elementsToRemove.length,\n          parent = firstElementToRemove.parentNode,\n          i, ii;\n\n      if ($rootElement) {\n        for (i = 0, ii = $rootElement.length; i < ii; i++) {\n          if ($rootElement[i] === firstElementToRemove) {\n            $rootElement[i++] = newNode;\n            for (var j = i, j2 = j + removeCount - 1,\n                     jj = $rootElement.length;\n                 j < jj; j++, j2++) {\n              if (j2 < jj) {\n                $rootElement[j] = $rootElement[j2];\n              } else {\n                delete $rootElement[j];\n              }\n            }\n            $rootElement.length -= removeCount - 1;\n\n            // If the replaced element is also the jQuery .context then replace it\n            // .context is a deprecated jQuery api, so we should set it only when jQuery set it\n            // http://api.jquery.com/context/\n            if ($rootElement.context === firstElementToRemove) {\n              $rootElement.context = newNode;\n            }\n            break;\n          }\n        }\n      }\n\n      if (parent) {\n        parent.replaceChild(newNode, firstElementToRemove);\n      }\n\n      // Append all the `elementsToRemove` to a fragment. This will...\n      // - remove them from the DOM\n      // - allow them to still be traversed with .nextSibling\n      // - allow a single fragment.qSA to fetch all elements being removed\n      var fragment = window.document.createDocumentFragment();\n      for (i = 0; i < removeCount; i++) {\n        fragment.appendChild(elementsToRemove[i]);\n      }\n\n      if (jqLite.hasData(firstElementToRemove)) {\n        // Copy over user data (that includes Angular's $scope etc.). Don't copy private\n        // data here because there's no public interface in jQuery to do that and copying over\n        // event listeners (which is the main use of private data) wouldn't work anyway.\n        jqLite.data(newNode, jqLite.data(firstElementToRemove));\n\n        // Remove $destroy event listeners from `firstElementToRemove`\n        jqLite(firstElementToRemove).off('$destroy');\n      }\n\n      // Cleanup any data/listeners on the elements and children.\n      // This includes invoking the $destroy event on any elements with listeners.\n      jqLite.cleanData(fragment.querySelectorAll('*'));\n\n      // Update the jqLite collection to only contain the `newNode`\n      for (i = 1; i < removeCount; i++) {\n        delete elementsToRemove[i];\n      }\n      elementsToRemove[0] = newNode;\n      elementsToRemove.length = 1;\n    }\n\n\n    function cloneAndAnnotateFn(fn, annotation) {\n      return extend(function() { return fn.apply(null, arguments); }, fn, annotation);\n    }\n\n\n    function invokeLinkFn(linkFn, scope, $element, attrs, controllers, transcludeFn) {\n      try {\n        linkFn(scope, $element, attrs, controllers, transcludeFn);\n      } catch (e) {\n        $exceptionHandler(e, startingTag($element));\n      }\n    }\n\n\n    // Set up $watches for isolate scope and controller bindings.\n    function initializeDirectiveBindings(scope, attrs, destination, bindings, directive) {\n      var removeWatchCollection = [];\n      var initialChanges = {};\n      var changes;\n      forEach(bindings, function initializeBinding(definition, scopeName) {\n        var attrName = definition.attrName,\n        optional = definition.optional,\n        mode = definition.mode, // @, =, <, or &\n        lastValue,\n        parentGet, parentSet, compare, removeWatch;\n\n        switch (mode) {\n\n          case '@':\n            if (!optional && !hasOwnProperty.call(attrs, attrName)) {\n              destination[scopeName] = attrs[attrName] = undefined;\n            }\n            removeWatch = attrs.$observe(attrName, function(value) {\n              if (isString(value) || isBoolean(value)) {\n                var oldValue = destination[scopeName];\n                recordChanges(scopeName, value, oldValue);\n                destination[scopeName] = value;\n              }\n            });\n            attrs.$$observers[attrName].$$scope = scope;\n            lastValue = attrs[attrName];\n            if (isString(lastValue)) {\n              // If the attribute has been provided then we trigger an interpolation to ensure\n              // the value is there for use in the link fn\n              destination[scopeName] = $interpolate(lastValue)(scope);\n            } else if (isBoolean(lastValue)) {\n              // If the attributes is one of the BOOLEAN_ATTR then Angular will have converted\n              // the value to boolean rather than a string, so we special case this situation\n              destination[scopeName] = lastValue;\n            }\n            initialChanges[scopeName] = new SimpleChange(_UNINITIALIZED_VALUE, destination[scopeName]);\n            removeWatchCollection.push(removeWatch);\n            break;\n\n          case '=':\n            if (!hasOwnProperty.call(attrs, attrName)) {\n              if (optional) break;\n              attrs[attrName] = undefined;\n            }\n            if (optional && !attrs[attrName]) break;\n\n            parentGet = $parse(attrs[attrName]);\n            if (parentGet.literal) {\n              compare = equals;\n            } else {\n              compare = simpleCompare;\n            }\n            parentSet = parentGet.assign || function() {\n              // reset the change, or we will throw this exception on every $digest\n              lastValue = destination[scopeName] = parentGet(scope);\n              throw $compileMinErr('nonassign',\n                  'Expression \\'{0}\\' in attribute \\'{1}\\' used with directive \\'{2}\\' is non-assignable!',\n                  attrs[attrName], attrName, directive.name);\n            };\n            lastValue = destination[scopeName] = parentGet(scope);\n            var parentValueWatch = function parentValueWatch(parentValue) {\n              if (!compare(parentValue, destination[scopeName])) {\n                // we are out of sync and need to copy\n                if (!compare(parentValue, lastValue)) {\n                  // parent changed and it has precedence\n                  destination[scopeName] = parentValue;\n                } else {\n                  // if the parent can be assigned then do so\n                  parentSet(scope, parentValue = destination[scopeName]);\n                }\n              }\n              lastValue = parentValue;\n              return lastValue;\n            };\n            parentValueWatch.$stateful = true;\n            if (definition.collection) {\n              removeWatch = scope.$watchCollection(attrs[attrName], parentValueWatch);\n            } else {\n              removeWatch = scope.$watch($parse(attrs[attrName], parentValueWatch), null, parentGet.literal);\n            }\n            removeWatchCollection.push(removeWatch);\n            break;\n\n          case '<':\n            if (!hasOwnProperty.call(attrs, attrName)) {\n              if (optional) break;\n              attrs[attrName] = undefined;\n            }\n            if (optional && !attrs[attrName]) break;\n\n            parentGet = $parse(attrs[attrName]);\n            var deepWatch = parentGet.literal;\n\n            var initialValue = destination[scopeName] = parentGet(scope);\n            initialChanges[scopeName] = new SimpleChange(_UNINITIALIZED_VALUE, destination[scopeName]);\n\n            removeWatch = scope.$watch(parentGet, function parentValueWatchAction(newValue, oldValue) {\n              if (oldValue === newValue) {\n                if (oldValue === initialValue || (deepWatch && equals(oldValue, initialValue))) {\n                  return;\n                }\n                oldValue = initialValue;\n              }\n              recordChanges(scopeName, newValue, oldValue);\n              destination[scopeName] = newValue;\n            }, deepWatch);\n\n            removeWatchCollection.push(removeWatch);\n            break;\n\n          case '&':\n            // Don't assign Object.prototype method to scope\n            parentGet = attrs.hasOwnProperty(attrName) ? $parse(attrs[attrName]) : noop;\n\n            // Don't assign noop to destination if expression is not valid\n            if (parentGet === noop && optional) break;\n\n            destination[scopeName] = function(locals) {\n              return parentGet(scope, locals);\n            };\n            break;\n        }\n      });\n\n      function recordChanges(key, currentValue, previousValue) {\n        if (isFunction(destination.$onChanges) && !simpleCompare(currentValue, previousValue)) {\n          // If we have not already scheduled the top level onChangesQueue handler then do so now\n          if (!onChangesQueue) {\n            scope.$$postDigest(flushOnChangesQueue);\n            onChangesQueue = [];\n          }\n          // If we have not already queued a trigger of onChanges for this controller then do so now\n          if (!changes) {\n            changes = {};\n            onChangesQueue.push(triggerOnChangesHook);\n          }\n          // If the has been a change on this property already then we need to reuse the previous value\n          if (changes[key]) {\n            previousValue = changes[key].previousValue;\n          }\n          // Store this change\n          changes[key] = new SimpleChange(previousValue, currentValue);\n        }\n      }\n\n      function triggerOnChangesHook() {\n        destination.$onChanges(changes);\n        // Now clear the changes so that we schedule onChanges when more changes arrive\n        changes = undefined;\n      }\n\n      return {\n        initialChanges: initialChanges,\n        removeWatches: removeWatchCollection.length && function removeWatches() {\n          for (var i = 0, ii = removeWatchCollection.length; i < ii; ++i) {\n            removeWatchCollection[i]();\n          }\n        }\n      };\n    }\n  }];\n}\n\nfunction SimpleChange(previous, current) {\n  this.previousValue = previous;\n  this.currentValue = current;\n}\nSimpleChange.prototype.isFirstChange = function() { return this.previousValue === _UNINITIALIZED_VALUE; };\n\n\nvar PREFIX_REGEXP = /^((?:x|data)[:\\-_])/i;\nvar SPECIAL_CHARS_REGEXP = /[:\\-_]+(.)/g;\n\n/**\n * Converts all accepted directives format into proper directive name.\n * @param name Name to normalize\n */\nfunction directiveNormalize(name) {\n  return name\n    .replace(PREFIX_REGEXP, '')\n    .replace(SPECIAL_CHARS_REGEXP, fnCamelCaseReplace);\n}\n\n/**\n * @ngdoc type\n * @name $compile.directive.Attributes\n *\n * @description\n * A shared object between directive compile / linking functions which contains normalized DOM\n * element attributes. The values reflect current binding state `{{ }}`. The normalization is\n * needed since all of these are treated as equivalent in Angular:\n *\n * ```\n *    <span ng:bind=\"a\" ng-bind=\"a\" data-ng-bind=\"a\" x-ng-bind=\"a\">\n * ```\n */\n\n/**\n * @ngdoc property\n * @name $compile.directive.Attributes#$attr\n *\n * @description\n * A map of DOM element attribute names to the normalized name. This is\n * needed to do reverse lookup from normalized name back to actual name.\n */\n\n\n/**\n * @ngdoc method\n * @name $compile.directive.Attributes#$set\n * @kind function\n *\n * @description\n * Set DOM element attribute value.\n *\n *\n * @param {string} name Normalized element attribute name of the property to modify. The name is\n *          reverse-translated using the {@link ng.$compile.directive.Attributes#$attr $attr}\n *          property to the original name.\n * @param {string} value Value to set the attribute to. The value can be an interpolated string.\n */\n\n\n\n/**\n * Closure compiler type information\n */\n\nfunction nodesetLinkingFn(\n  /* angular.Scope */ scope,\n  /* NodeList */ nodeList,\n  /* Element */ rootElement,\n  /* function(Function) */ boundTranscludeFn\n) {}\n\nfunction directiveLinkingFn(\n  /* nodesetLinkingFn */ nodesetLinkingFn,\n  /* angular.Scope */ scope,\n  /* Node */ node,\n  /* Element */ rootElement,\n  /* function(Function) */ boundTranscludeFn\n) {}\n\nfunction tokenDifference(str1, str2) {\n  var values = '',\n      tokens1 = str1.split(/\\s+/),\n      tokens2 = str2.split(/\\s+/);\n\n  outer:\n  for (var i = 0; i < tokens1.length; i++) {\n    var token = tokens1[i];\n    for (var j = 0; j < tokens2.length; j++) {\n      if (token === tokens2[j]) continue outer;\n    }\n    values += (values.length > 0 ? ' ' : '') + token;\n  }\n  return values;\n}\n\nfunction removeComments(jqNodes) {\n  jqNodes = jqLite(jqNodes);\n  var i = jqNodes.length;\n\n  if (i <= 1) {\n    return jqNodes;\n  }\n\n  while (i--) {\n    var node = jqNodes[i];\n    if (node.nodeType === NODE_TYPE_COMMENT ||\n       (node.nodeType === NODE_TYPE_TEXT && node.nodeValue.trim() === '')) {\n         splice.call(jqNodes, i, 1);\n    }\n  }\n  return jqNodes;\n}\n\nvar $controllerMinErr = minErr('$controller');\n\n\nvar CNTRL_REG = /^(\\S+)(\\s+as\\s+([\\w$]+))?$/;\nfunction identifierForController(controller, ident) {\n  if (ident && isString(ident)) return ident;\n  if (isString(controller)) {\n    var match = CNTRL_REG.exec(controller);\n    if (match) return match[3];\n  }\n}\n\n\n/**\n * @ngdoc provider\n * @name $controllerProvider\n * @this\n *\n * @description\n * The {@link ng.$controller $controller service} is used by Angular to create new\n * controllers.\n *\n * This provider allows controller registration via the\n * {@link ng.$controllerProvider#register register} method.\n */\nfunction $ControllerProvider() {\n  var controllers = {},\n      globals = false;\n\n  /**\n   * @ngdoc method\n   * @name $controllerProvider#has\n   * @param {string} name Controller name to check.\n   */\n  this.has = function(name) {\n    return controllers.hasOwnProperty(name);\n  };\n\n  /**\n   * @ngdoc method\n   * @name $controllerProvider#register\n   * @param {string|Object} name Controller name, or an object map of controllers where the keys are\n   *    the names and the values are the constructors.\n   * @param {Function|Array} constructor Controller constructor fn (optionally decorated with DI\n   *    annotations in the array notation).\n   */\n  this.register = function(name, constructor) {\n    assertNotHasOwnProperty(name, 'controller');\n    if (isObject(name)) {\n      extend(controllers, name);\n    } else {\n      controllers[name] = constructor;\n    }\n  };\n\n  /**\n   * @ngdoc method\n   * @name $controllerProvider#allowGlobals\n   * @description If called, allows `$controller` to find controller constructors on `window`\n   *\n   * @deprecated\n   * sinceVersion=\"v1.3.0\"\n   * removeVersion=\"v1.7.0\"\n   * This method of finding controllers has been deprecated.\n   */\n  this.allowGlobals = function() {\n    globals = true;\n  };\n\n\n  this.$get = ['$injector', '$window', function($injector, $window) {\n\n    /**\n     * @ngdoc service\n     * @name $controller\n     * @requires $injector\n     *\n     * @param {Function|string} constructor If called with a function then it's considered to be the\n     *    controller constructor function. Otherwise it's considered to be a string which is used\n     *    to retrieve the controller constructor using the following steps:\n     *\n     *    * check if a controller with given name is registered via `$controllerProvider`\n     *    * check if evaluating the string on the current scope returns a constructor\n     *    * if $controllerProvider#allowGlobals, check `window[constructor]` on the global\n     *      `window` object (deprecated, not recommended)\n     *\n     *    The string can use the `controller as property` syntax, where the controller instance is published\n     *    as the specified property on the `scope`; the `scope` must be injected into `locals` param for this\n     *    to work correctly.\n     *\n     * @param {Object} locals Injection locals for Controller.\n     * @return {Object} Instance of given controller.\n     *\n     * @description\n     * `$controller` service is responsible for instantiating controllers.\n     *\n     * It's just a simple call to {@link auto.$injector $injector}, but extracted into\n     * a service, so that one can override this service with [BC version](https://gist.github.com/1649788).\n     */\n    return function $controller(expression, locals, later, ident) {\n      // PRIVATE API:\n      //   param `later` --- indicates that the controller's constructor is invoked at a later time.\n      //                     If true, $controller will allocate the object with the correct\n      //                     prototype chain, but will not invoke the controller until a returned\n      //                     callback is invoked.\n      //   param `ident` --- An optional label which overrides the label parsed from the controller\n      //                     expression, if any.\n      var instance, match, constructor, identifier;\n      later = later === true;\n      if (ident && isString(ident)) {\n        identifier = ident;\n      }\n\n      if (isString(expression)) {\n        match = expression.match(CNTRL_REG);\n        if (!match) {\n          throw $controllerMinErr('ctrlfmt',\n            'Badly formed controller string \\'{0}\\'. ' +\n            'Must match `__name__ as __id__` or `__name__`.', expression);\n        }\n        constructor = match[1];\n        identifier = identifier || match[3];\n        expression = controllers.hasOwnProperty(constructor)\n            ? controllers[constructor]\n            : getter(locals.$scope, constructor, true) ||\n                (globals ? getter($window, constructor, true) : undefined);\n\n        if (!expression) {\n          throw $controllerMinErr('ctrlreg',\n            'The controller with the name \\'{0}\\' is not registered.', constructor);\n        }\n\n        assertArgFn(expression, constructor, true);\n      }\n\n      if (later) {\n        // Instantiate controller later:\n        // This machinery is used to create an instance of the object before calling the\n        // controller's constructor itself.\n        //\n        // This allows properties to be added to the controller before the constructor is\n        // invoked. Primarily, this is used for isolate scope bindings in $compile.\n        //\n        // This feature is not intended for use by applications, and is thus not documented\n        // publicly.\n        // Object creation: http://jsperf.com/create-constructor/2\n        var controllerPrototype = (isArray(expression) ?\n          expression[expression.length - 1] : expression).prototype;\n        instance = Object.create(controllerPrototype || null);\n\n        if (identifier) {\n          addIdentifier(locals, identifier, instance, constructor || expression.name);\n        }\n\n        return extend(function $controllerInit() {\n          var result = $injector.invoke(expression, instance, locals, constructor);\n          if (result !== instance && (isObject(result) || isFunction(result))) {\n            instance = result;\n            if (identifier) {\n              // If result changed, re-assign controllerAs value to scope.\n              addIdentifier(locals, identifier, instance, constructor || expression.name);\n            }\n          }\n          return instance;\n        }, {\n          instance: instance,\n          identifier: identifier\n        });\n      }\n\n      instance = $injector.instantiate(expression, locals, constructor);\n\n      if (identifier) {\n        addIdentifier(locals, identifier, instance, constructor || expression.name);\n      }\n\n      return instance;\n    };\n\n    function addIdentifier(locals, identifier, instance, name) {\n      if (!(locals && isObject(locals.$scope))) {\n        throw minErr('$controller')('noscp',\n          'Cannot export controller \\'{0}\\' as \\'{1}\\'! No $scope object provided via `locals`.',\n          name, identifier);\n      }\n\n      locals.$scope[identifier] = instance;\n    }\n  }];\n}\n\n/**\n * @ngdoc service\n * @name $document\n * @requires $window\n * @this\n *\n * @description\n * A {@link angular.element jQuery or jqLite} wrapper for the browser's `window.document` object.\n *\n * @example\n   <example module=\"documentExample\" name=\"document\">\n     <file name=\"index.ced81ed4.html\">\n       <div ng-controller=\"ExampleController\">\n         <p>$document title: <b ng-bind=\"title\"></b></p>\n         <p>window.document title: <b ng-bind=\"windowTitle\"></b></p>\n       </div>\n     </file>\n     <file name=\"script.js\">\n       angular.module('documentExample', [])\n         .controller('ExampleController', ['$scope', '$document', function($scope, $document) {\n           $scope.title = $document[0].title;\n           $scope.windowTitle = angular.element(window.document)[0].title;\n         }]);\n     </file>\n   </example>\n */\nfunction $DocumentProvider() {\n  this.$get = ['$window', function(window) {\n    return jqLite(window.document);\n  }];\n}\n\n\n/**\n * @private\n * @this\n * Listens for document visibility change and makes the current status accessible.\n */\nfunction $$IsDocumentHiddenProvider() {\n  this.$get = ['$document', '$rootScope', function($document, $rootScope) {\n    var doc = $document[0];\n    var hidden = doc && doc.hidden;\n\n    $document.on('visibilitychange', changeListener);\n\n    $rootScope.$on('$destroy', function() {\n      $document.off('visibilitychange', changeListener);\n    });\n\n    function changeListener() {\n      hidden = doc.hidden;\n    }\n\n    return function() {\n      return hidden;\n    };\n  }];\n}\n\n/**\n * @ngdoc service\n * @name $exceptionHandler\n * @requires ng.$log\n * @this\n *\n * @description\n * Any uncaught exception in angular expressions is delegated to this service.\n * The default implementation simply delegates to `$log.error` which logs it into\n * the browser console.\n *\n * In unit tests, if `angular-mocks.js` is loaded, this service is overridden by\n * {@link ngMock.$exceptionHandler mock $exceptionHandler} which aids in testing.\n *\n * ## Example:\n *\n * The example below will overwrite the default `$exceptionHandler` in order to (a) log uncaught\n * errors to the backend for later inspection by the developers and (b) to use `$log.warn()` instead\n * of `$log.error()`.\n *\n * ```js\n *   angular.\n *     module('exceptionOverwrite', []).\n *     factory('$exceptionHandler', ['$log', 'logErrorsToBackend', function($log, logErrorsToBackend) {\n *       return function myExceptionHandler(exception, cause) {\n *         logErrorsToBackend(exception, cause);\n *         $log.warn(exception, cause);\n *       };\n *     }]);\n * ```\n *\n * <hr />\n * Note, that code executed in event-listeners (even those registered using jqLite's `on`/`bind`\n * methods) does not delegate exceptions to the {@link ng.$exceptionHandler $exceptionHandler}\n * (unless executed during a digest).\n *\n * If you wish, you can manually delegate exceptions, e.g.\n * `try { ... } catch(e) { $exceptionHandler(e); }`\n *\n * @param {Error} exception Exception associated with the error.\n * @param {string=} cause Optional information about the context in which\n *       the error was thrown.\n *\n */\nfunction $ExceptionHandlerProvider() {\n  this.$get = ['$log', function($log) {\n    return function(exception, cause) {\n      $log.error.apply($log, arguments);\n    };\n  }];\n}\n\nvar $$ForceReflowProvider = /** @this */ function() {\n  this.$get = ['$document', function($document) {\n    return function(domNode) {\n      //the line below will force the browser to perform a repaint so\n      //that all the animated elements within the animation frame will\n      //be properly updated and drawn on screen. This is required to\n      //ensure that the preparation animation is properly flushed so that\n      //the active state picks up from there. DO NOT REMOVE THIS LINE.\n      //DO NOT OPTIMIZE THIS LINE. THE MINIFIER WILL REMOVE IT OTHERWISE WHICH\n      //WILL RESULT IN AN UNPREDICTABLE BUG THAT IS VERY HARD TO TRACK DOWN AND\n      //WILL TAKE YEARS AWAY FROM YOUR LIFE.\n      if (domNode) {\n        if (!domNode.nodeType && domNode instanceof jqLite) {\n          domNode = domNode[0];\n        }\n      } else {\n        domNode = $document[0].body;\n      }\n      return domNode.offsetWidth + 1;\n    };\n  }];\n};\n\nvar APPLICATION_JSON = 'application/json';\nvar CONTENT_TYPE_APPLICATION_JSON = {'Content-Type': APPLICATION_JSON + ';charset=utf-8'};\nvar JSON_START = /^\\[|^\\{(?!\\{)/;\nvar JSON_ENDS = {\n  '[': /]$/,\n  '{': /}$/\n};\nvar JSON_PROTECTION_PREFIX = /^\\)]\\}',?\\n/;\nvar $httpMinErr = minErr('$http');\n\nfunction serializeValue(v) {\n  if (isObject(v)) {\n    return isDate(v) ? v.toISOString() : toJson(v);\n  }\n  return v;\n}\n\n\n/** @this */\nfunction $HttpParamSerializerProvider() {\n  /**\n   * @ngdoc service\n   * @name $httpParamSerializer\n   * @description\n   *\n   * Default {@link $http `$http`} params serializer that converts objects to strings\n   * according to the following rules:\n   *\n   * * `{'foo': 'bar'}` results in `foo=bar`\n   * * `{'foo': Date.now()}` results in `foo=2015-04-01T09%3A50%3A49.262Z` (`toISOString()` and encoded representation of a Date object)\n   * * `{'foo': ['bar', 'baz']}` results in `foo=bar&foo=baz` (repeated key for each array element)\n   * * `{'foo': {'bar':'baz'}}` results in `foo=%7B%22bar%22%3A%22baz%22%7D` (stringified and encoded representation of an object)\n   *\n   * Note that serializer will sort the request parameters alphabetically.\n   * */\n\n  this.$get = function() {\n    return function ngParamSerializer(params) {\n      if (!params) return '';\n      var parts = [];\n      forEachSorted(params, function(value, key) {\n        if (value === null || isUndefined(value)) return;\n        if (isArray(value)) {\n          forEach(value, function(v) {\n            parts.push(encodeUriQuery(key)  + '=' + encodeUriQuery(serializeValue(v)));\n          });\n        } else {\n          parts.push(encodeUriQuery(key) + '=' + encodeUriQuery(serializeValue(value)));\n        }\n      });\n\n      return parts.join('&');\n    };\n  };\n}\n\n/** @this */\nfunction $HttpParamSerializerJQLikeProvider() {\n  /**\n   * @ngdoc service\n   * @name $httpParamSerializerJQLike\n   *\n   * @description\n   *\n   * Alternative {@link $http `$http`} params serializer that follows\n   * jQuery's [`param()`](http://api.jquery.com/jquery.param/) method logic.\n   * The serializer will also sort the params alphabetically.\n   *\n   * To use it for serializing `$http` request parameters, set it as the `paramSerializer` property:\n   *\n   * ```js\n   * $http({\n   *   url: myUrl,\n   *   method: 'GET',\n   *   params: myParams,\n   *   paramSerializer: '$httpParamSerializerJQLike'\n   * });\n   * ```\n   *\n   * It is also possible to set it as the default `paramSerializer` in the\n   * {@link $httpProvider#defaults `$httpProvider`}.\n   *\n   * Additionally, you can inject the serializer and use it explicitly, for example to serialize\n   * form data for submission:\n   *\n   * ```js\n   * .controller(function($http, $httpParamSerializerJQLike) {\n   *   //...\n   *\n   *   $http({\n   *     url: myUrl,\n   *     method: 'POST',\n   *     data: $httpParamSerializerJQLike(myData),\n   *     headers: {\n   *       'Content-Type': 'application/x-www-form-urlencoded'\n   *     }\n   *   });\n   *\n   * });\n   * ```\n   *\n   * */\n  this.$get = function() {\n    return function jQueryLikeParamSerializer(params) {\n      if (!params) return '';\n      var parts = [];\n      serialize(params, '', true);\n      return parts.join('&');\n\n      function serialize(toSerialize, prefix, topLevel) {\n        if (toSerialize === null || isUndefined(toSerialize)) return;\n        if (isArray(toSerialize)) {\n          forEach(toSerialize, function(value, index) {\n            serialize(value, prefix + '[' + (isObject(value) ? index : '') + ']');\n          });\n        } else if (isObject(toSerialize) && !isDate(toSerialize)) {\n          forEachSorted(toSerialize, function(value, key) {\n            serialize(value, prefix +\n                (topLevel ? '' : '[') +\n                key +\n                (topLevel ? '' : ']'));\n          });\n        } else {\n          parts.push(encodeUriQuery(prefix) + '=' + encodeUriQuery(serializeValue(toSerialize)));\n        }\n      }\n    };\n  };\n}\n\nfunction defaultHttpResponseTransform(data, headers) {\n  if (isString(data)) {\n    // Strip json vulnerability protection prefix and trim whitespace\n    var tempData = data.replace(JSON_PROTECTION_PREFIX, '').trim();\n\n    if (tempData) {\n      var contentType = headers('Content-Type');\n      if ((contentType && (contentType.indexOf(APPLICATION_JSON) === 0)) || isJsonLike(tempData)) {\n        try {\n          data = fromJson(tempData);\n        } catch (e) {\n          throw $httpMinErr('baddata', 'Data must be a valid JSON object. Received: \"{0}\". ' +\n          'Parse error: \"{1}\"', data, e);\n        }\n      }\n    }\n  }\n\n  return data;\n}\n\nfunction isJsonLike(str) {\n    var jsonStart = str.match(JSON_START);\n    return jsonStart && JSON_ENDS[jsonStart[0]].test(str);\n}\n\n/**\n * Parse headers into key value object\n *\n * @param {string} headers Raw headers as a string\n * @returns {Object} Parsed headers as key value object\n */\nfunction parseHeaders(headers) {\n  var parsed = createMap(), i;\n\n  function fillInParsed(key, val) {\n    if (key) {\n      parsed[key] = parsed[key] ? parsed[key] + ', ' + val : val;\n    }\n  }\n\n  if (isString(headers)) {\n    forEach(headers.split('\\n'), function(line) {\n      i = line.indexOf(':');\n      fillInParsed(lowercase(trim(line.substr(0, i))), trim(line.substr(i + 1)));\n    });\n  } else if (isObject(headers)) {\n    forEach(headers, function(headerVal, headerKey) {\n      fillInParsed(lowercase(headerKey), trim(headerVal));\n    });\n  }\n\n  return parsed;\n}\n\n\n/**\n * Returns a function that provides access to parsed headers.\n *\n * Headers are lazy parsed when first requested.\n * @see parseHeaders\n *\n * @param {(string|Object)} headers Headers to provide access to.\n * @returns {function(string=)} Returns a getter function which if called with:\n *\n *   - if called with an argument returns a single header value or null\n *   - if called with no arguments returns an object containing all headers.\n */\nfunction headersGetter(headers) {\n  var headersObj;\n\n  return function(name) {\n    if (!headersObj) headersObj =  parseHeaders(headers);\n\n    if (name) {\n      var value = headersObj[lowercase(name)];\n      if (value === undefined) {\n        value = null;\n      }\n      return value;\n    }\n\n    return headersObj;\n  };\n}\n\n\n/**\n * Chain all given functions\n *\n * This function is used for both request and response transforming\n *\n * @param {*} data Data to transform.\n * @param {function(string=)} headers HTTP headers getter fn.\n * @param {number} status HTTP status code of the response.\n * @param {(Function|Array.<Function>)} fns Function or an array of functions.\n * @returns {*} Transformed data.\n */\nfunction transformData(data, headers, status, fns) {\n  if (isFunction(fns)) {\n    return fns(data, headers, status);\n  }\n\n  forEach(fns, function(fn) {\n    data = fn(data, headers, status);\n  });\n\n  return data;\n}\n\n\nfunction isSuccess(status) {\n  return 200 <= status && status < 300;\n}\n\n\n/**\n * @ngdoc provider\n * @name $httpProvider\n * @this\n *\n * @description\n * Use `$httpProvider` to change the default behavior of the {@link ng.$http $http} service.\n * */\nfunction $HttpProvider() {\n  /**\n   * @ngdoc property\n   * @name $httpProvider#defaults\n   * @description\n   *\n   * Object containing default values for all {@link ng.$http $http} requests.\n   *\n   * - **`defaults.cache`** - {boolean|Object} - A boolean value or object created with\n   * {@link ng.$cacheFactory `$cacheFactory`} to enable or disable caching of HTTP responses\n   * by default. See {@link $http#caching $http Caching} for more information.\n   *\n   * - **`defaults.xsrfCookieName`** - {string} - Name of cookie containing the XSRF token.\n   * Defaults value is `'XSRF-TOKEN'`.\n   *\n   * - **`defaults.xsrfHeaderName`** - {string} - Name of HTTP header to populate with the\n   * XSRF token. Defaults value is `'X-XSRF-TOKEN'`.\n   *\n   * - **`defaults.headers`** - {Object} - Default headers for all $http requests.\n   * Refer to {@link ng.$http#setting-http-headers $http} for documentation on\n   * setting default headers.\n   *     - **`defaults.headers.common`**\n   *     - **`defaults.headers.post`**\n   *     - **`defaults.headers.put`**\n   *     - **`defaults.headers.patch`**\n   *\n   *\n   * - **`defaults.paramSerializer`** - `{string|function(Object<string,string>):string}` - A function\n   *  used to the prepare string representation of request parameters (specified as an object).\n   *  If specified as string, it is interpreted as a function registered with the {@link auto.$injector $injector}.\n   *  Defaults to {@link ng.$httpParamSerializer $httpParamSerializer}.\n   *\n   * - **`defaults.jsonpCallbackParam`** - `{string}` - the name of the query parameter that passes the name of the\n   * callback in a JSONP request. The value of this parameter will be replaced with the expression generated by the\n   * {@link $jsonpCallbacks} service. Defaults to `'callback'`.\n   *\n   **/\n  var defaults = this.defaults = {\n    // transform incoming response data\n    transformResponse: [defaultHttpResponseTransform],\n\n    // transform outgoing request data\n    transformRequest: [function(d) {\n      return isObject(d) && !isFile(d) && !isBlob(d) && !isFormData(d) ? toJson(d) : d;\n    }],\n\n    // default headers\n    headers: {\n      common: {\n        'Accept': 'application/json, text/plain, */*'\n      },\n      post:   shallowCopy(CONTENT_TYPE_APPLICATION_JSON),\n      put:    shallowCopy(CONTENT_TYPE_APPLICATION_JSON),\n      patch:  shallowCopy(CONTENT_TYPE_APPLICATION_JSON)\n    },\n\n    xsrfCookieName: 'XSRF-TOKEN',\n    xsrfHeaderName: 'X-XSRF-TOKEN',\n\n    paramSerializer: '$httpParamSerializer',\n\n    jsonpCallbackParam: 'callback'\n  };\n\n  var useApplyAsync = false;\n  /**\n   * @ngdoc method\n   * @name $httpProvider#useApplyAsync\n   * @description\n   *\n   * Configure $http service to combine processing of multiple http responses received at around\n   * the same time via {@link ng.$rootScope.Scope#$applyAsync $rootScope.$applyAsync}. This can result in\n   * significant performance improvement for bigger applications that make many HTTP requests\n   * concurrently (common during application bootstrap).\n   *\n   * Defaults to false. If no value is specified, returns the current configured value.\n   *\n   * @param {boolean=} value If true, when requests are loaded, they will schedule a deferred\n   *    \"apply\" on the next tick, giving time for subsequent requests in a roughly ~10ms window\n   *    to load and share the same digest cycle.\n   *\n   * @returns {boolean|Object} If a value is specified, returns the $httpProvider for chaining.\n   *    otherwise, returns the current configured value.\n   **/\n  this.useApplyAsync = function(value) {\n    if (isDefined(value)) {\n      useApplyAsync = !!value;\n      return this;\n    }\n    return useApplyAsync;\n  };\n\n  /**\n   * @ngdoc property\n   * @name $httpProvider#interceptors\n   * @description\n   *\n   * Array containing service factories for all synchronous or asynchronous {@link ng.$http $http}\n   * pre-processing of request or postprocessing of responses.\n   *\n   * These service factories are ordered by request, i.e. they are applied in the same order as the\n   * array, on request, but reverse order, on response.\n   *\n   * {@link ng.$http#interceptors Interceptors detailed info}\n   **/\n  var interceptorFactories = this.interceptors = [];\n\n  this.$get = ['$browser', '$httpBackend', '$$cookieReader', '$cacheFactory', '$rootScope', '$q', '$injector', '$sce',\n      function($browser, $httpBackend, $$cookieReader, $cacheFactory, $rootScope, $q, $injector, $sce) {\n\n    var defaultCache = $cacheFactory('$http');\n\n    /**\n     * Make sure that default param serializer is exposed as a function\n     */\n    defaults.paramSerializer = isString(defaults.paramSerializer) ?\n      $injector.get(defaults.paramSerializer) : defaults.paramSerializer;\n\n    /**\n     * Interceptors stored in reverse order. Inner interceptors before outer interceptors.\n     * The reversal is needed so that we can build up the interception chain around the\n     * server request.\n     */\n    var reversedInterceptors = [];\n\n    forEach(interceptorFactories, function(interceptorFactory) {\n      reversedInterceptors.unshift(isString(interceptorFactory)\n          ? $injector.get(interceptorFactory) : $injector.invoke(interceptorFactory));\n    });\n\n    /**\n     * @ngdoc service\n     * @kind function\n     * @name $http\n     * @requires ng.$httpBackend\n     * @requires $cacheFactory\n     * @requires $rootScope\n     * @requires $q\n     * @requires $injector\n     *\n     * @description\n     * The `$http` service is a core Angular service that facilitates communication with the remote\n     * HTTP servers via the browser's [XMLHttpRequest](https://developer.mozilla.org/en/xmlhttprequest)\n     * object or via [JSONP](http://en.wikipedia.org/wiki/JSONP).\n     *\n     * For unit testing applications that use `$http` service, see\n     * {@link ngMock.$httpBackend $httpBackend mock}.\n     *\n     * For a higher level of abstraction, please check out the {@link ngResource.$resource\n     * $resource} service.\n     *\n     * The $http API is based on the {@link ng.$q deferred/promise APIs} exposed by\n     * the $q service. While for simple usage patterns this doesn't matter much, for advanced usage\n     * it is important to familiarize yourself with these APIs and the guarantees they provide.\n     *\n     *\n     * ## General usage\n     * The `$http` service is a function which takes a single argument — a {@link $http#usage configuration object} —\n     * that is used to generate an HTTP request and returns  a {@link ng.$q promise}.\n     *\n     * ```js\n     *   // Simple GET request example:\n     *   $http({\n     *     method: 'GET',\n     *     url: '/someUrl'\n     *   }).then(function successCallback(response) {\n     *       // this callback will be called asynchronously\n     *       // when the response is available\n     *     }, function errorCallback(response) {\n     *       // called asynchronously if an error occurs\n     *       // or server returns response with an error status.\n     *     });\n     * ```\n     *\n     * The response object has these properties:\n     *\n     *   - **data** – `{string|Object}` – The response body transformed with the transform\n     *     functions.\n     *   - **status** – `{number}` – HTTP status code of the response.\n     *   - **headers** – `{function([headerName])}` – Header getter function.\n     *   - **config** – `{Object}` – The configuration object that was used to generate the request.\n     *   - **statusText** – `{string}` – HTTP status text of the response.\n     *\n     * A response status code between 200 and 299 is considered a success status and will result in\n     * the success callback being called. Any response status code outside of that range is\n     * considered an error status and will result in the error callback being called.\n     * Also, status codes less than -1 are normalized to zero. -1 usually means the request was\n     * aborted, e.g. using a `config.timeout`.\n     * Note that if the response is a redirect, XMLHttpRequest will transparently follow it, meaning\n     * that the outcome (success or error) will be determined by the final response status code.\n     *\n     *\n     * ## Shortcut methods\n     *\n     * Shortcut methods are also available. All shortcut methods require passing in the URL, and\n     * request data must be passed in for POST/PUT requests. An optional config can be passed as the\n     * last argument.\n     *\n     * ```js\n     *   $http.get('/someUrl', config).then(successCallback, errorCallback);\n     *   $http.post('/someUrl', data, config).then(successCallback, errorCallback);\n     * ```\n     *\n     * Complete list of shortcut methods:\n     *\n     * - {@link ng.$http#get $http.get}\n     * - {@link ng.$http#head $http.head}\n     * - {@link ng.$http#post $http.post}\n     * - {@link ng.$http#put $http.put}\n     * - {@link ng.$http#delete $http.delete}\n     * - {@link ng.$http#jsonp $http.jsonp}\n     * - {@link ng.$http#patch $http.patch}\n     *\n     *\n     * ## Writing Unit Tests that use $http\n     * When unit testing (using {@link ngMock ngMock}), it is necessary to call\n     * {@link ngMock.$httpBackend#flush $httpBackend.flush()} to flush each pending\n     * request using trained responses.\n     *\n     * ```\n     * $httpBackend.expectGET(...);\n     * $http.get(...);\n     * $httpBackend.flush();\n     * ```\n     *\n     * ## Setting HTTP Headers\n     *\n     * The $http service will automatically add certain HTTP headers to all requests. These defaults\n     * can be fully configured by accessing the `$httpProvider.defaults.headers` configuration\n     * object, which currently contains this default configuration:\n     *\n     * - `$httpProvider.defaults.headers.common` (headers that are common for all requests):\n     *   - <code>Accept: application/json, text/plain, \\*&#65279;/&#65279;\\*</code>\n     * - `$httpProvider.defaults.headers.post`: (header defaults for POST requests)\n     *   - `Content-Type: application/json`\n     * - `$httpProvider.defaults.headers.put` (header defaults for PUT requests)\n     *   - `Content-Type: application/json`\n     *\n     * To add or overwrite these defaults, simply add or remove a property from these configuration\n     * objects. To add headers for an HTTP method other than POST or PUT, simply add a new object\n     * with the lowercased HTTP method name as the key, e.g.\n     * `$httpProvider.defaults.headers.get = { 'My-Header' : 'value' }`.\n     *\n     * The defaults can also be set at runtime via the `$http.defaults` object in the same\n     * fashion. For example:\n     *\n     * ```\n     * module.run(function($http) {\n     *   $http.defaults.headers.common.Authorization = 'Basic YmVlcDpib29w';\n     * });\n     * ```\n     *\n     * In addition, you can supply a `headers` property in the config object passed when\n     * calling `$http(config)`, which overrides the defaults without changing them globally.\n     *\n     * To explicitly remove a header automatically added via $httpProvider.defaults.headers on a per request basis,\n     * Use the `headers` property, setting the desired header to `undefined`. For example:\n     *\n     * ```js\n     * var req = {\n     *  method: 'POST',\n     *  url: 'http://example.com',\n     *  headers: {\n     *    'Content-Type': undefined\n     *  },\n     *  data: { test: 'test' }\n     * }\n     *\n     * $http(req).then(function(){...}, function(){...});\n     * ```\n     *\n     * ## Transforming Requests and Responses\n     *\n     * Both requests and responses can be transformed using transformation functions: `transformRequest`\n     * and `transformResponse`. These properties can be a single function that returns\n     * the transformed value (`function(data, headersGetter, status)`) or an array of such transformation functions,\n     * which allows you to `push` or `unshift` a new transformation function into the transformation chain.\n     *\n     * <div class=\"alert alert-warning\">\n     * **Note:** Angular does not make a copy of the `data` parameter before it is passed into the `transformRequest` pipeline.\n     * That means changes to the properties of `data` are not local to the transform function (since Javascript passes objects by reference).\n     * For example, when calling `$http.get(url, $scope.myObject)`, modifications to the object's properties in a transformRequest\n     * function will be reflected on the scope and in any templates where the object is data-bound.\n     * To prevent this, transform functions should have no side-effects.\n     * If you need to modify properties, it is recommended to make a copy of the data, or create new object to return.\n     * </div>\n     *\n     * ### Default Transformations\n     *\n     * The `$httpProvider` provider and `$http` service expose `defaults.transformRequest` and\n     * `defaults.transformResponse` properties. If a request does not provide its own transformations\n     * then these will be applied.\n     *\n     * You can augment or replace the default transformations by modifying these properties by adding to or\n     * replacing the array.\n     *\n     * Angular provides the following default transformations:\n     *\n     * Request transformations (`$httpProvider.defaults.transformRequest` and `$http.defaults.transformRequest`):\n     *\n     * - If the `data` property of the request configuration object contains an object, serialize it\n     *   into JSON format.\n     *\n     * Response transformations (`$httpProvider.defaults.transformResponse` and `$http.defaults.transformResponse`):\n     *\n     *  - If XSRF prefix is detected, strip it (see Security Considerations section below).\n     *  - If JSON response is detected, deserialize it using a JSON parser.\n     *\n     *\n     * ### Overriding the Default Transformations Per Request\n     *\n     * If you wish to override the request/response transformations only for a single request then provide\n     * `transformRequest` and/or `transformResponse` properties on the configuration object passed\n     * into `$http`.\n     *\n     * Note that if you provide these properties on the config object the default transformations will be\n     * overwritten. If you wish to augment the default transformations then you must include them in your\n     * local transformation array.\n     *\n     * The following code demonstrates adding a new response transformation to be run after the default response\n     * transformations have been run.\n     *\n     * ```js\n     * function appendTransform(defaults, transform) {\n     *\n     *   // We can't guarantee that the default transformation is an array\n     *   defaults = angular.isArray(defaults) ? defaults : [defaults];\n     *\n     *   // Append the new transformation to the defaults\n     *   return defaults.concat(transform);\n     * }\n     *\n     * $http({\n     *   url: '...',\n     *   method: 'GET',\n     *   transformResponse: appendTransform($http.defaults.transformResponse, function(value) {\n     *     return doTransform(value);\n     *   })\n     * });\n     * ```\n     *\n     *\n     * ## Caching\n     *\n     * {@link ng.$http `$http`} responses are not cached by default. To enable caching, you must\n     * set the config.cache value or the default cache value to TRUE or to a cache object (created\n     * with {@link ng.$cacheFactory `$cacheFactory`}). If defined, the value of config.cache takes\n     * precedence over the default cache value.\n     *\n     * In order to:\n     *   * cache all responses - set the default cache value to TRUE or to a cache object\n     *   * cache a specific response - set config.cache value to TRUE or to a cache object\n     *\n     * If caching is enabled, but neither the default cache nor config.cache are set to a cache object,\n     * then the default `$cacheFactory(\"$http\")` object is used.\n     *\n     * The default cache value can be set by updating the\n     * {@link ng.$http#defaults `$http.defaults.cache`} property or the\n     * {@link $httpProvider#defaults `$httpProvider.defaults.cache`} property.\n     *\n     * When caching is enabled, {@link ng.$http `$http`} stores the response from the server using\n     * the relevant cache object. The next time the same request is made, the response is returned\n     * from the cache without sending a request to the server.\n     *\n     * Take note that:\n     *\n     *   * Only GET and JSONP requests are cached.\n     *   * The cache key is the request URL including search parameters; headers are not considered.\n     *   * Cached responses are returned asynchronously, in the same way as responses from the server.\n     *   * If multiple identical requests are made using the same cache, which is not yet populated,\n     *     one request will be made to the server and remaining requests will return the same response.\n     *   * A cache-control header on the response does not affect if or how responses are cached.\n     *\n     *\n     * ## Interceptors\n     *\n     * Before you start creating interceptors, be sure to understand the\n     * {@link ng.$q $q and deferred/promise APIs}.\n     *\n     * For purposes of global error handling, authentication, or any kind of synchronous or\n     * asynchronous pre-processing of request or postprocessing of responses, it is desirable to be\n     * able to intercept requests before they are handed to the server and\n     * responses before they are handed over to the application code that\n     * initiated these requests. The interceptors leverage the {@link ng.$q\n     * promise APIs} to fulfill this need for both synchronous and asynchronous pre-processing.\n     *\n     * The interceptors are service factories that are registered with the `$httpProvider` by\n     * adding them to the `$httpProvider.interceptors` array. The factory is called and\n     * injected with dependencies (if specified) and returns the interceptor.\n     *\n     * There are two kinds of interceptors (and two kinds of rejection interceptors):\n     *\n     *   * `request`: interceptors get called with a http {@link $http#usage config} object. The function is free to\n     *     modify the `config` object or create a new one. The function needs to return the `config`\n     *     object directly, or a promise containing the `config` or a new `config` object.\n     *   * `requestError`: interceptor gets called when a previous interceptor threw an error or\n     *     resolved with a rejection.\n     *   * `response`: interceptors get called with http `response` object. The function is free to\n     *     modify the `response` object or create a new one. The function needs to return the `response`\n     *     object directly, or as a promise containing the `response` or a new `response` object.\n     *   * `responseError`: interceptor gets called when a previous interceptor threw an error or\n     *     resolved with a rejection.\n     *\n     *\n     * ```js\n     *   // register the interceptor as a service\n     *   $provide.factory('myHttpInterceptor', function($q, dependency1, dependency2) {\n     *     return {\n     *       // optional method\n     *       'request': function(config) {\n     *         // do something on success\n     *         return config;\n     *       },\n     *\n     *       // optional method\n     *      'requestError': function(rejection) {\n     *         // do something on error\n     *         if (canRecover(rejection)) {\n     *           return responseOrNewPromise\n     *         }\n     *         return $q.reject(rejection);\n     *       },\n     *\n     *\n     *\n     *       // optional method\n     *       'response': function(response) {\n     *         // do something on success\n     *         return response;\n     *       },\n     *\n     *       // optional method\n     *      'responseError': function(rejection) {\n     *         // do something on error\n     *         if (canRecover(rejection)) {\n     *           return responseOrNewPromise\n     *         }\n     *         return $q.reject(rejection);\n     *       }\n     *     };\n     *   });\n     *\n     *   $httpProvider.interceptors.push('myHttpInterceptor');\n     *\n     *\n     *   // alternatively, register the interceptor via an anonymous factory\n     *   $httpProvider.interceptors.push(function($q, dependency1, dependency2) {\n     *     return {\n     *      'request': function(config) {\n     *          // same as above\n     *       },\n     *\n     *       'response': function(response) {\n     *          // same as above\n     *       }\n     *     };\n     *   });\n     * ```\n     *\n     * ## Security Considerations\n     *\n     * When designing web applications, consider security threats from:\n     *\n     * - [JSON vulnerability](http://haacked.com/archive/2008/11/20/anatomy-of-a-subtle-json-vulnerability.aspx)\n     * - [XSRF](http://en.wikipedia.org/wiki/Cross-site_request_forgery)\n     *\n     * Both server and the client must cooperate in order to eliminate these threats. Angular comes\n     * pre-configured with strategies that address these issues, but for this to work backend server\n     * cooperation is required.\n     *\n     * ### JSON Vulnerability Protection\n     *\n     * A [JSON vulnerability](http://haacked.com/archive/2008/11/20/anatomy-of-a-subtle-json-vulnerability.aspx)\n     * allows third party website to turn your JSON resource URL into\n     * [JSONP](http://en.wikipedia.org/wiki/JSONP) request under some conditions. To\n     * counter this your server can prefix all JSON requests with following string `\")]}',\\n\"`.\n     * Angular will automatically strip the prefix before processing it as JSON.\n     *\n     * For example if your server needs to return:\n     * ```js\n     * ['one','two']\n     * ```\n     *\n     * which is vulnerable to attack, your server can return:\n     * ```js\n     * )]}',\n     * ['one','two']\n     * ```\n     *\n     * Angular will strip the prefix, before processing the JSON.\n     *\n     *\n     * ### Cross Site Request Forgery (XSRF) Protection\n     *\n     * [XSRF](http://en.wikipedia.org/wiki/Cross-site_request_forgery) is an attack technique by\n     * which the attacker can trick an authenticated user into unknowingly executing actions on your\n     * website. Angular provides a mechanism to counter XSRF. When performing XHR requests, the\n     * $http service reads a token from a cookie (by default, `XSRF-TOKEN`) and sets it as an HTTP\n     * header (`X-XSRF-TOKEN`). Since only JavaScript that runs on your domain could read the\n     * cookie, your server can be assured that the XHR came from JavaScript running on your domain.\n     * The header will not be set for cross-domain requests.\n     *\n     * To take advantage of this, your server needs to set a token in a JavaScript readable session\n     * cookie called `XSRF-TOKEN` on the first HTTP GET request. On subsequent XHR requests the\n     * server can verify that the cookie matches `X-XSRF-TOKEN` HTTP header, and therefore be sure\n     * that only JavaScript running on your domain could have sent the request. The token must be\n     * unique for each user and must be verifiable by the server (to prevent the JavaScript from\n     * making up its own tokens). We recommend that the token is a digest of your site's\n     * authentication cookie with a [salt](https://en.wikipedia.org/wiki/Salt_(cryptography&#41;)\n     * for added security.\n     *\n     * The name of the headers can be specified using the xsrfHeaderName and xsrfCookieName\n     * properties of either $httpProvider.defaults at config-time, $http.defaults at run-time,\n     * or the per-request config object.\n     *\n     * In order to prevent collisions in environments where multiple Angular apps share the\n     * same domain or subdomain, we recommend that each application uses unique cookie name.\n     *\n     * @param {object} config Object describing the request to be made and how it should be\n     *    processed. The object has following properties:\n     *\n     *    - **method** – `{string}` – HTTP method (e.g. 'GET', 'POST', etc)\n     *    - **url** – `{string|TrustedObject}` – Absolute or relative URL of the resource that is being requested;\n     *      or an object created by a call to `$sce.trustAsResourceUrl(url)`.\n     *    - **params** – `{Object.<string|Object>}` – Map of strings or objects which will be serialized\n     *      with the `paramSerializer` and appended as GET parameters.\n     *    - **data** – `{string|Object}` – Data to be sent as the request message data.\n     *    - **headers** – `{Object}` – Map of strings or functions which return strings representing\n     *      HTTP headers to send to the server. If the return value of a function is null, the\n     *      header will not be sent. Functions accept a config object as an argument.\n     *    - **eventHandlers** - `{Object}` - Event listeners to be bound to the XMLHttpRequest object.\n     *      To bind events to the XMLHttpRequest upload object, use `uploadEventHandlers`.\n     *      The handler will be called in the context of a `$apply` block.\n     *    - **uploadEventHandlers** - `{Object}` - Event listeners to be bound to the XMLHttpRequest upload\n     *      object. To bind events to the XMLHttpRequest object, use `eventHandlers`.\n     *      The handler will be called in the context of a `$apply` block.\n     *    - **xsrfHeaderName** – `{string}` – Name of HTTP header to populate with the XSRF token.\n     *    - **xsrfCookieName** – `{string}` – Name of cookie containing the XSRF token.\n     *    - **transformRequest** –\n     *      `{function(data, headersGetter)|Array.<function(data, headersGetter)>}` –\n     *      transform function or an array of such functions. The transform function takes the http\n     *      request body and headers and returns its transformed (typically serialized) version.\n     *      See {@link ng.$http#overriding-the-default-transformations-per-request\n     *      Overriding the Default Transformations}\n     *    - **transformResponse** –\n     *      `{function(data, headersGetter, status)|Array.<function(data, headersGetter, status)>}` –\n     *      transform function or an array of such functions. The transform function takes the http\n     *      response body, headers and status and returns its transformed (typically deserialized) version.\n     *      See {@link ng.$http#overriding-the-default-transformations-per-request\n     *      Overriding the Default Transformations}\n     *    - **paramSerializer** - `{string|function(Object<string,string>):string}` - A function used to\n     *      prepare the string representation of request parameters (specified as an object).\n     *      If specified as string, it is interpreted as function registered with the\n     *      {@link $injector $injector}, which means you can create your own serializer\n     *      by registering it as a {@link auto.$provide#service service}.\n     *      The default serializer is the {@link $httpParamSerializer $httpParamSerializer};\n     *      alternatively, you can use the {@link $httpParamSerializerJQLike $httpParamSerializerJQLike}\n     *    - **cache** – `{boolean|Object}` – A boolean value or object created with\n     *      {@link ng.$cacheFactory `$cacheFactory`} to enable or disable caching of the HTTP response.\n     *      See {@link $http#caching $http Caching} for more information.\n     *    - **timeout** – `{number|Promise}` – timeout in milliseconds, or {@link ng.$q promise}\n     *      that should abort the request when resolved.\n     *    - **withCredentials** - `{boolean}` - whether to set the `withCredentials` flag on the\n     *      XHR object. See [requests with credentials](https://developer.mozilla.org/docs/Web/HTTP/Access_control_CORS#Requests_with_credentials)\n     *      for more information.\n     *    - **responseType** - `{string}` - see\n     *      [XMLHttpRequest.responseType](https://developer.mozilla.org/en-US/docs/Web/API/XMLHttpRequest#xmlhttprequest-responsetype).\n     *\n     * @returns {HttpPromise} Returns a {@link ng.$q `Promise}` that will be resolved to a response object\n     *                        when the request succeeds or fails.\n     *\n     *\n     * @property {Array.<Object>} pendingRequests Array of config objects for currently pending\n     *   requests. This is primarily meant to be used for debugging purposes.\n     *\n     *\n     * @example\n<example module=\"httpExample\" name=\"http-service\">\n<file name=\"index.ced81ed4.html\">\n  <div ng-controller=\"FetchController\">\n    <select ng-model=\"method\" aria-label=\"Request method\">\n      <option>GET</option>\n      <option>JSONP</option>\n    </select>\n    <input type=\"text\" ng-model=\"url\" size=\"80\" aria-label=\"URL\" />\n    <button id=\"fetchbtn\" ng-click=\"fetch()\">fetch</button><br>\n    <button id=\"samplegetbtn\" ng-click=\"updateModel('GET', 'http-hello.html')\">Sample GET</button>\n    <button id=\"samplejsonpbtn\"\n      ng-click=\"updateModel('JSONP',\n                    'https://angularjs.org/greet.php?name=Super%20Hero')\">\n      Sample JSONP\n    </button>\n    <button id=\"invalidjsonpbtn\"\n      ng-click=\"updateModel('JSONP', 'https://angularjs.org/doesntexist')\">\n        Invalid JSONP\n      </button>\n    <pre>http status code: {{status}}</pre>\n    <pre>http response data: {{data}}</pre>\n  </div>\n</file>\n<file name=\"script.js\">\n  angular.module('httpExample', [])\n    .config(['$sceDelegateProvider', function($sceDelegateProvider) {\n      // We must whitelist the JSONP endpoint that we are using to show that we trust it\n      $sceDelegateProvider.resourceUrlWhitelist([\n        'self',\n        'https://angularjs.org/**'\n      ]);\n    }])\n    .controller('FetchController', ['$scope', '$http', '$templateCache',\n      function($scope, $http, $templateCache) {\n        $scope.method = 'GET';\n        $scope.url = 'http-hello.html';\n\n        $scope.fetch = function() {\n          $scope.code = null;\n          $scope.response = null;\n\n          $http({method: $scope.method, url: $scope.url, cache: $templateCache}).\n            then(function(response) {\n              $scope.status = response.status;\n              $scope.data = response.data;\n            }, function(response) {\n              $scope.data = response.data || 'Request failed';\n              $scope.status = response.status;\n          });\n        };\n\n        $scope.updateModel = function(method, url) {\n          $scope.method = method;\n          $scope.url = url;\n        };\n      }]);\n</file>\n<file name=\"http-hello.html\">\n  Hello, $http!\n</file>\n<file name=\"protractor.js\" type=\"protractor\">\n  var status = element(by.binding('status'));\n  var data = element(by.binding('data'));\n  var fetchBtn = element(by.id('fetchbtn'));\n  var sampleGetBtn = element(by.id('samplegetbtn'));\n  var invalidJsonpBtn = element(by.id('invalidjsonpbtn'));\n\n  it('should make an xhr GET request', function() {\n    sampleGetBtn.click();\n    fetchBtn.click();\n    expect(status.getText()).toMatch('200');\n    expect(data.getText()).toMatch(/Hello, \\$http!/);\n  });\n\n// Commented out due to flakes. See https://github.com/angular/angular.js/issues/9185\n// it('should make a JSONP request to angularjs.org', function() {\n//   var sampleJsonpBtn = element(by.id('samplejsonpbtn'));\n//   sampleJsonpBtn.click();\n//   fetchBtn.click();\n//   expect(status.getText()).toMatch('200');\n//   expect(data.getText()).toMatch(/Super Hero!/);\n// });\n\n  it('should make JSONP request to invalid URL and invoke the error handler',\n      function() {\n    invalidJsonpBtn.click();\n    fetchBtn.click();\n    expect(status.getText()).toMatch('0');\n    expect(data.getText()).toMatch('Request failed');\n  });\n</file>\n</example>\n     */\n    function $http(requestConfig) {\n\n      if (!isObject(requestConfig)) {\n        throw minErr('$http')('badreq', 'Http request configuration must be an object.  Received: {0}', requestConfig);\n      }\n\n      if (!isString($sce.valueOf(requestConfig.url))) {\n        throw minErr('$http')('badreq', 'Http request configuration url must be a string or a $sce trusted object.  Received: {0}', requestConfig.url);\n      }\n\n      var config = extend({\n        method: 'get',\n        transformRequest: defaults.transformRequest,\n        transformResponse: defaults.transformResponse,\n        paramSerializer: defaults.paramSerializer,\n        jsonpCallbackParam: defaults.jsonpCallbackParam\n      }, requestConfig);\n\n      config.headers = mergeHeaders(requestConfig);\n      config.method = uppercase(config.method);\n      config.paramSerializer = isString(config.paramSerializer) ?\n          $injector.get(config.paramSerializer) : config.paramSerializer;\n\n      $browser.$$incOutstandingRequestCount();\n\n      var requestInterceptors = [];\n      var responseInterceptors = [];\n      var promise = $q.resolve(config);\n\n      // apply interceptors\n      forEach(reversedInterceptors, function(interceptor) {\n        if (interceptor.request || interceptor.requestError) {\n          requestInterceptors.unshift(interceptor.request, interceptor.requestError);\n        }\n        if (interceptor.response || interceptor.responseError) {\n          responseInterceptors.push(interceptor.response, interceptor.responseError);\n        }\n      });\n\n      promise = chainInterceptors(promise, requestInterceptors);\n      promise = promise.then(serverRequest);\n      promise = chainInterceptors(promise, responseInterceptors);\n      promise = promise.finally(completeOutstandingRequest);\n\n      return promise;\n\n\n      function chainInterceptors(promise, interceptors) {\n        for (var i = 0, ii = interceptors.length; i < ii;) {\n          var thenFn = interceptors[i++];\n          var rejectFn = interceptors[i++];\n\n          promise = promise.then(thenFn, rejectFn);\n        }\n\n        interceptors.length = 0;\n\n        return promise;\n      }\n\n      function completeOutstandingRequest() {\n        $browser.$$completeOutstandingRequest(noop);\n      }\n\n      function executeHeaderFns(headers, config) {\n        var headerContent, processedHeaders = {};\n\n        forEach(headers, function(headerFn, header) {\n          if (isFunction(headerFn)) {\n            headerContent = headerFn(config);\n            if (headerContent != null) {\n              processedHeaders[header] = headerContent;\n            }\n          } else {\n            processedHeaders[header] = headerFn;\n          }\n        });\n\n        return processedHeaders;\n      }\n\n      function mergeHeaders(config) {\n        var defHeaders = defaults.headers,\n            reqHeaders = extend({}, config.headers),\n            defHeaderName, lowercaseDefHeaderName, reqHeaderName;\n\n        defHeaders = extend({}, defHeaders.common, defHeaders[lowercase(config.method)]);\n\n        // using for-in instead of forEach to avoid unnecessary iteration after header has been found\n        defaultHeadersIteration:\n        for (defHeaderName in defHeaders) {\n          lowercaseDefHeaderName = lowercase(defHeaderName);\n\n          for (reqHeaderName in reqHeaders) {\n            if (lowercase(reqHeaderName) === lowercaseDefHeaderName) {\n              continue defaultHeadersIteration;\n            }\n          }\n\n          reqHeaders[defHeaderName] = defHeaders[defHeaderName];\n        }\n\n        // execute if header value is a function for merged headers\n        return executeHeaderFns(reqHeaders, shallowCopy(config));\n      }\n\n      function serverRequest(config) {\n        var headers = config.headers;\n        var reqData = transformData(config.data, headersGetter(headers), undefined, config.transformRequest);\n\n        // strip content-type if data is undefined\n        if (isUndefined(reqData)) {\n          forEach(headers, function(value, header) {\n            if (lowercase(header) === 'content-type') {\n              delete headers[header];\n            }\n          });\n        }\n\n        if (isUndefined(config.withCredentials) && !isUndefined(defaults.withCredentials)) {\n          config.withCredentials = defaults.withCredentials;\n        }\n\n        // send request\n        return sendReq(config, reqData).then(transformResponse, transformResponse);\n      }\n\n      function transformResponse(response) {\n        // make a copy since the response must be cacheable\n        var resp = extend({}, response);\n        resp.data = transformData(response.data, response.headers, response.status,\n                                  config.transformResponse);\n        return (isSuccess(response.status))\n          ? resp\n          : $q.reject(resp);\n      }\n    }\n\n    $http.pendingRequests = [];\n\n    /**\n     * @ngdoc method\n     * @name $http#get\n     *\n     * @description\n     * Shortcut method to perform `GET` request.\n     *\n     * @param {string|TrustedObject} url Absolute or relative URL of the resource that is being requested;\n     *                                   or an object created by a call to `$sce.trustAsResourceUrl(url)`.\n     * @param {Object=} config Optional configuration object\n     * @returns {HttpPromise} Future object\n     */\n\n    /**\n     * @ngdoc method\n     * @name $http#delete\n     *\n     * @description\n     * Shortcut method to perform `DELETE` request.\n     *\n     * @param {string|TrustedObject} url Absolute or relative URL of the resource that is being requested;\n     *                                   or an object created by a call to `$sce.trustAsResourceUrl(url)`.\n     * @param {Object=} config Optional configuration object\n     * @returns {HttpPromise} Future object\n     */\n\n    /**\n     * @ngdoc method\n     * @name $http#head\n     *\n     * @description\n     * Shortcut method to perform `HEAD` request.\n     *\n     * @param {string|TrustedObject} url Absolute or relative URL of the resource that is being requested;\n     *                                   or an object created by a call to `$sce.trustAsResourceUrl(url)`.\n     * @param {Object=} config Optional configuration object\n     * @returns {HttpPromise} Future object\n     */\n\n    /**\n     * @ngdoc method\n     * @name $http#jsonp\n     *\n     * @description\n     * Shortcut method to perform `JSONP` request.\n     *\n     * Note that, since JSONP requests are sensitive because the response is given full access to the browser,\n     * the url must be declared, via {@link $sce} as a trusted resource URL.\n     * You can trust a URL by adding it to the whitelist via\n     * {@link $sceDelegateProvider#resourceUrlWhitelist  `$sceDelegateProvider.resourceUrlWhitelist`} or\n     * by explicitly trusting the URL via {@link $sce#trustAsResourceUrl `$sce.trustAsResourceUrl(url)`}.\n     *\n     * JSONP requests must specify a callback to be used in the response from the server. This callback\n     * is passed as a query parameter in the request. You must specify the name of this parameter by\n     * setting the `jsonpCallbackParam` property on the request config object.\n     *\n     * ```\n     * $http.jsonp('some/trusted/url', {jsonpCallbackParam: 'callback'})\n     * ```\n     *\n     * You can also specify a default callback parameter name in `$http.defaults.jsonpCallbackParam`.\n     * Initially this is set to `'callback'`.\n     *\n     * <div class=\"alert alert-danger\">\n     * You can no longer use the `JSON_CALLBACK` string as a placeholder for specifying where the callback\n     * parameter value should go.\n     * </div>\n     *\n     * If you would like to customise where and how the callbacks are stored then try overriding\n     * or decorating the {@link $jsonpCallbacks} service.\n     *\n     * @param {string|TrustedObject} url Absolute or relative URL of the resource that is being requested;\n     *                                   or an object created by a call to `$sce.trustAsResourceUrl(url)`.\n     * @param {Object=} config Optional configuration object\n     * @returns {HttpPromise} Future object\n     */\n    createShortMethods('get', 'delete', 'head', 'jsonp');\n\n    /**\n     * @ngdoc method\n     * @name $http#post\n     *\n     * @description\n     * Shortcut method to perform `POST` request.\n     *\n     * @param {string} url Relative or absolute URL specifying the destination of the request\n     * @param {*} data Request content\n     * @param {Object=} config Optional configuration object\n     * @returns {HttpPromise} Future object\n     */\n\n    /**\n     * @ngdoc method\n     * @name $http#put\n     *\n     * @description\n     * Shortcut method to perform `PUT` request.\n     *\n     * @param {string} url Relative or absolute URL specifying the destination of the request\n     * @param {*} data Request content\n     * @param {Object=} config Optional configuration object\n     * @returns {HttpPromise} Future object\n     */\n\n     /**\n      * @ngdoc method\n      * @name $http#patch\n      *\n      * @description\n      * Shortcut method to perform `PATCH` request.\n      *\n      * @param {string} url Relative or absolute URL specifying the destination of the request\n      * @param {*} data Request content\n      * @param {Object=} config Optional configuration object\n      * @returns {HttpPromise} Future object\n      */\n    createShortMethodsWithData('post', 'put', 'patch');\n\n        /**\n         * @ngdoc property\n         * @name $http#defaults\n         *\n         * @description\n         * Runtime equivalent of the `$httpProvider.defaults` property. Allows configuration of\n         * default headers, withCredentials as well as request and response transformations.\n         *\n         * See \"Setting HTTP Headers\" and \"Transforming Requests and Responses\" sections above.\n         */\n    $http.defaults = defaults;\n\n\n    return $http;\n\n\n    function createShortMethods(names) {\n      forEach(arguments, function(name) {\n        $http[name] = function(url, config) {\n          return $http(extend({}, config || {}, {\n            method: name,\n            url: url\n          }));\n        };\n      });\n    }\n\n\n    function createShortMethodsWithData(name) {\n      forEach(arguments, function(name) {\n        $http[name] = function(url, data, config) {\n          return $http(extend({}, config || {}, {\n            method: name,\n            url: url,\n            data: data\n          }));\n        };\n      });\n    }\n\n\n    /**\n     * Makes the request.\n     *\n     * !!! ACCESSES CLOSURE VARS:\n     * $httpBackend, defaults, $log, $rootScope, defaultCache, $http.pendingRequests\n     */\n    function sendReq(config, reqData) {\n      var deferred = $q.defer(),\n          promise = deferred.promise,\n          cache,\n          cachedResp,\n          reqHeaders = config.headers,\n          isJsonp = lowercase(config.method) === 'jsonp',\n          url = config.url;\n\n      if (isJsonp) {\n        // JSONP is a pretty sensitive operation where we're allowing a script to have full access to\n        // our DOM and JS space.  So we require that the URL satisfies SCE.RESOURCE_URL.\n        url = $sce.getTrustedResourceUrl(url);\n      } else if (!isString(url)) {\n        // If it is not a string then the URL must be a $sce trusted object\n        url = $sce.valueOf(url);\n      }\n\n      url = buildUrl(url, config.paramSerializer(config.params));\n\n      if (isJsonp) {\n        // Check the url and add the JSONP callback placeholder\n        url = sanitizeJsonpCallbackParam(url, config.jsonpCallbackParam);\n      }\n\n      $http.pendingRequests.push(config);\n      promise.then(removePendingReq, removePendingReq);\n\n      if ((config.cache || defaults.cache) && config.cache !== false &&\n          (config.method === 'GET' || config.method === 'JSONP')) {\n        cache = isObject(config.cache) ? config.cache\n            : isObject(/** @type {?} */ (defaults).cache)\n              ? /** @type {?} */ (defaults).cache\n              : defaultCache;\n      }\n\n      if (cache) {\n        cachedResp = cache.get(url);\n        if (isDefined(cachedResp)) {\n          if (isPromiseLike(cachedResp)) {\n            // cached request has already been sent, but there is no response yet\n            cachedResp.then(resolvePromiseWithResult, resolvePromiseWithResult);\n          } else {\n            // serving from cache\n            if (isArray(cachedResp)) {\n              resolvePromise(cachedResp[1], cachedResp[0], shallowCopy(cachedResp[2]), cachedResp[3]);\n            } else {\n              resolvePromise(cachedResp, 200, {}, 'OK');\n            }\n          }\n        } else {\n          // put the promise for the non-transformed response into cache as a placeholder\n          cache.put(url, promise);\n        }\n      }\n\n\n      // if we won't have the response in cache, set the xsrf headers and\n      // send the request to the backend\n      if (isUndefined(cachedResp)) {\n        var xsrfValue = urlIsSameOrigin(config.url)\n            ? $$cookieReader()[config.xsrfCookieName || defaults.xsrfCookieName]\n            : undefined;\n        if (xsrfValue) {\n          reqHeaders[(config.xsrfHeaderName || defaults.xsrfHeaderName)] = xsrfValue;\n        }\n\n        $httpBackend(config.method, url, reqData, done, reqHeaders, config.timeout,\n            config.withCredentials, config.responseType,\n            createApplyHandlers(config.eventHandlers),\n            createApplyHandlers(config.uploadEventHandlers));\n      }\n\n      return promise;\n\n      function createApplyHandlers(eventHandlers) {\n        if (eventHandlers) {\n          var applyHandlers = {};\n          forEach(eventHandlers, function(eventHandler, key) {\n            applyHandlers[key] = function(event) {\n              if (useApplyAsync) {\n                $rootScope.$applyAsync(callEventHandler);\n              } else if ($rootScope.$$phase) {\n                callEventHandler();\n              } else {\n                $rootScope.$apply(callEventHandler);\n              }\n\n              function callEventHandler() {\n                eventHandler(event);\n              }\n            };\n          });\n          return applyHandlers;\n        }\n      }\n\n\n      /**\n       * Callback registered to $httpBackend():\n       *  - caches the response if desired\n       *  - resolves the raw $http promise\n       *  - calls $apply\n       */\n      function done(status, response, headersString, statusText) {\n        if (cache) {\n          if (isSuccess(status)) {\n            cache.put(url, [status, response, parseHeaders(headersString), statusText]);\n          } else {\n            // remove promise from the cache\n            cache.remove(url);\n          }\n        }\n\n        function resolveHttpPromise() {\n          resolvePromise(response, status, headersString, statusText);\n        }\n\n        if (useApplyAsync) {\n          $rootScope.$applyAsync(resolveHttpPromise);\n        } else {\n          resolveHttpPromise();\n          if (!$rootScope.$$phase) $rootScope.$apply();\n        }\n      }\n\n\n      /**\n       * Resolves the raw $http promise.\n       */\n      function resolvePromise(response, status, headers, statusText) {\n        //status: HTTP response status code, 0, -1 (aborted by timeout / promise)\n        status = status >= -1 ? status : 0;\n\n        (isSuccess(status) ? deferred.resolve : deferred.reject)({\n          data: response,\n          status: status,\n          headers: headersGetter(headers),\n          config: config,\n          statusText: statusText\n        });\n      }\n\n      function resolvePromiseWithResult(result) {\n        resolvePromise(result.data, result.status, shallowCopy(result.headers()), result.statusText);\n      }\n\n      function removePendingReq() {\n        var idx = $http.pendingRequests.indexOf(config);\n        if (idx !== -1) $http.pendingRequests.splice(idx, 1);\n      }\n    }\n\n\n    function buildUrl(url, serializedParams) {\n      if (serializedParams.length > 0) {\n        url += ((url.indexOf('?') === -1) ? '?' : '&') + serializedParams;\n      }\n      return url;\n    }\n\n    function sanitizeJsonpCallbackParam(url, key) {\n      if (/[&?][^=]+=JSON_CALLBACK/.test(url)) {\n        // Throw if the url already contains a reference to JSON_CALLBACK\n        throw $httpMinErr('badjsonp', 'Illegal use of JSON_CALLBACK in url, \"{0}\"', url);\n      }\n\n      var callbackParamRegex = new RegExp('[&?]' + key + '=');\n      if (callbackParamRegex.test(url)) {\n        // Throw if the callback param was already provided\n        throw $httpMinErr('badjsonp', 'Illegal use of callback param, \"{0}\", in url, \"{1}\"', key, url);\n      }\n\n      // Add in the JSON_CALLBACK callback param value\n      url += ((url.indexOf('?') === -1) ? '?' : '&') + key + '=JSON_CALLBACK';\n\n      return url;\n    }\n  }];\n}\n\n/**\n * @ngdoc service\n * @name $xhrFactory\n * @this\n *\n * @description\n * Factory function used to create XMLHttpRequest objects.\n *\n * Replace or decorate this service to create your own custom XMLHttpRequest objects.\n *\n * ```\n * angular.module('myApp', [])\n * .factory('$xhrFactory', function() {\n *   return function createXhr(method, url) {\n *     return new window.XMLHttpRequest({mozSystem: true});\n *   };\n * });\n * ```\n *\n * @param {string} method HTTP method of the request (GET, POST, PUT, ..)\n * @param {string} url URL of the request.\n */\nfunction $xhrFactoryProvider() {\n  this.$get = function() {\n    return function createXhr() {\n      return new window.XMLHttpRequest();\n    };\n  };\n}\n\n/**\n * @ngdoc service\n * @name $httpBackend\n * @requires $jsonpCallbacks\n * @requires $document\n * @requires $xhrFactory\n * @this\n *\n * @description\n * HTTP backend used by the {@link ng.$http service} that delegates to\n * XMLHttpRequest object or JSONP and deals with browser incompatibilities.\n *\n * You should never need to use this service directly, instead use the higher-level abstractions:\n * {@link ng.$http $http} or {@link ngResource.$resource $resource}.\n *\n * During testing this implementation is swapped with {@link ngMock.$httpBackend mock\n * $httpBackend} which can be trained with responses.\n */\nfunction $HttpBackendProvider() {\n  this.$get = ['$browser', '$jsonpCallbacks', '$document', '$xhrFactory', function($browser, $jsonpCallbacks, $document, $xhrFactory) {\n    return createHttpBackend($browser, $xhrFactory, $browser.defer, $jsonpCallbacks, $document[0]);\n  }];\n}\n\nfunction createHttpBackend($browser, createXhr, $browserDefer, callbacks, rawDocument) {\n  // TODO(vojta): fix the signature\n  return function(method, url, post, callback, headers, timeout, withCredentials, responseType, eventHandlers, uploadEventHandlers) {\n    url = url || $browser.url();\n\n    if (lowercase(method) === 'jsonp') {\n      var callbackPath = callbacks.createCallback(url);\n      var jsonpDone = jsonpReq(url, callbackPath, function(status, text) {\n        // jsonpReq only ever sets status to 200 (OK), 404 (ERROR) or -1 (WAITING)\n        var response = (status === 200) && callbacks.getResponse(callbackPath);\n        completeRequest(callback, status, response, '', text);\n        callbacks.removeCallback(callbackPath);\n      });\n    } else {\n\n      var xhr = createXhr(method, url);\n\n      xhr.open(method, url, true);\n      forEach(headers, function(value, key) {\n        if (isDefined(value)) {\n            xhr.setRequestHeader(key, value);\n        }\n      });\n\n      xhr.onload = function requestLoaded() {\n        var statusText = xhr.statusText || '';\n\n        // responseText is the old-school way of retrieving response (supported by IE9)\n        // response/responseType properties were introduced in XHR Level2 spec (supported by IE10)\n        var response = ('response' in xhr) ? xhr.response : xhr.responseText;\n\n        // normalize IE9 bug (http://bugs.jquery.com/ticket/1450)\n        var status = xhr.status === 1223 ? 204 : xhr.status;\n\n        // fix status code when it is 0 (0 status is undocumented).\n        // Occurs when accessing file resources or on Android 4.1 stock browser\n        // while retrieving files from application cache.\n        if (status === 0) {\n          status = response ? 200 : urlResolve(url).protocol === 'file' ? 404 : 0;\n        }\n\n        completeRequest(callback,\n            status,\n            response,\n            xhr.getAllResponseHeaders(),\n            statusText);\n      };\n\n      var requestError = function() {\n        // The response is always empty\n        // See https://xhr.spec.whatwg.org/#request-error-steps and https://fetch.spec.whatwg.org/#concept-network-error\n        completeRequest(callback, -1, null, null, '');\n      };\n\n      xhr.onerror = requestError;\n      xhr.onabort = requestError;\n      xhr.ontimeout = requestError;\n\n      forEach(eventHandlers, function(value, key) {\n          xhr.addEventListener(key, value);\n      });\n\n      forEach(uploadEventHandlers, function(value, key) {\n        xhr.upload.addEventListener(key, value);\n      });\n\n      if (withCredentials) {\n        xhr.withCredentials = true;\n      }\n\n      if (responseType) {\n        try {\n          xhr.responseType = responseType;\n        } catch (e) {\n          // WebKit added support for the json responseType value on 09/03/2013\n          // https://bugs.webkit.org/show_bug.cgi?id=73648. Versions of Safari prior to 7 are\n          // known to throw when setting the value \"json\" as the response type. Other older\n          // browsers implementing the responseType\n          //\n          // The json response type can be ignored if not supported, because JSON payloads are\n          // parsed on the client-side regardless.\n          if (responseType !== 'json') {\n            throw e;\n          }\n        }\n      }\n\n      xhr.send(isUndefined(post) ? null : post);\n    }\n\n    if (timeout > 0) {\n      var timeoutId = $browserDefer(timeoutRequest, timeout);\n    } else if (isPromiseLike(timeout)) {\n      timeout.then(timeoutRequest);\n    }\n\n\n    function timeoutRequest() {\n      if (jsonpDone) {\n        jsonpDone();\n      }\n      if (xhr) {\n        xhr.abort();\n      }\n    }\n\n    function completeRequest(callback, status, response, headersString, statusText) {\n      // cancel timeout and subsequent timeout promise resolution\n      if (isDefined(timeoutId)) {\n        $browserDefer.cancel(timeoutId);\n      }\n      jsonpDone = xhr = null;\n\n      callback(status, response, headersString, statusText);\n    }\n  };\n\n  function jsonpReq(url, callbackPath, done) {\n    url = url.replace('JSON_CALLBACK', callbackPath);\n    // we can't use jQuery/jqLite here because jQuery does crazy stuff with script elements, e.g.:\n    // - fetches local scripts via XHR and evals them\n    // - adds and immediately removes script elements from the document\n    var script = rawDocument.createElement('script'), callback = null;\n    script.type = 'text/javascript';\n    script.src = url;\n    script.async = true;\n\n    callback = function(event) {\n      script.removeEventListener('load', callback);\n      script.removeEventListener('error', callback);\n      rawDocument.body.removeChild(script);\n      script = null;\n      var status = -1;\n      var text = 'unknown';\n\n      if (event) {\n        if (event.type === 'load' && !callbacks.wasCalled(callbackPath)) {\n          event = { type: 'error' };\n        }\n        text = event.type;\n        status = event.type === 'error' ? 404 : 200;\n      }\n\n      if (done) {\n        done(status, text);\n      }\n    };\n\n    script.addEventListener('load', callback);\n    script.addEventListener('error', callback);\n    rawDocument.body.appendChild(script);\n    return callback;\n  }\n}\n\nvar $interpolateMinErr = angular.$interpolateMinErr = minErr('$interpolate');\n$interpolateMinErr.throwNoconcat = function(text) {\n  throw $interpolateMinErr('noconcat',\n      'Error while interpolating: {0}\\nStrict Contextual Escaping disallows ' +\n      'interpolations that concatenate multiple expressions when a trusted value is ' +\n      'required.  See http://docs.angularjs.org/api/ng.$sce', text);\n};\n\n$interpolateMinErr.interr = function(text, err) {\n  return $interpolateMinErr('interr', 'Can\\'t interpolate: {0}\\n{1}', text, err.toString());\n};\n\n/**\n * @ngdoc provider\n * @name $interpolateProvider\n * @this\n *\n * @description\n *\n * Used for configuring the interpolation markup. Defaults to `{{` and `}}`.\n *\n * <div class=\"alert alert-danger\">\n * This feature is sometimes used to mix different markup languages, e.g. to wrap an Angular\n * template within a Python Jinja template (or any other template language). Mixing templating\n * languages is **very dangerous**. The embedding template language will not safely escape Angular\n * expressions, so any user-controlled values in the template will cause Cross Site Scripting (XSS)\n * security bugs!\n * </div>\n *\n * @example\n<example name=\"custom-interpolation-markup\" module=\"customInterpolationApp\">\n<file name=\"index.ced81ed4.html\">\n<script>\n  var customInterpolationApp = angular.module('customInterpolationApp', []);\n\n  customInterpolationApp.config(function($interpolateProvider) {\n    $interpolateProvider.startSymbol('//');\n    $interpolateProvider.endSymbol('//');\n  });\n\n\n  customInterpolationApp.controller('DemoController', function() {\n      this.label = \"This binding is brought you by // interpolation symbols.\";\n  });\n</script>\n<div ng-controller=\"DemoController as demo\">\n    //demo.label//\n</div>\n</file>\n<file name=\"protractor.js\" type=\"protractor\">\n  it('should interpolate binding with custom symbols', function() {\n    expect(element(by.binding('demo.label')).getText()).toBe('This binding is brought you by // interpolation symbols.');\n  });\n</file>\n</example>\n */\nfunction $InterpolateProvider() {\n  var startSymbol = '{{';\n  var endSymbol = '}}';\n\n  /**\n   * @ngdoc method\n   * @name $interpolateProvider#startSymbol\n   * @description\n   * Symbol to denote start of expression in the interpolated string. Defaults to `{{`.\n   *\n   * @param {string=} value new value to set the starting symbol to.\n   * @returns {string|self} Returns the symbol when used as getter and self if used as setter.\n   */\n  this.startSymbol = function(value) {\n    if (value) {\n      startSymbol = value;\n      return this;\n    } else {\n      return startSymbol;\n    }\n  };\n\n  /**\n   * @ngdoc method\n   * @name $interpolateProvider#endSymbol\n   * @description\n   * Symbol to denote the end of expression in the interpolated string. Defaults to `}}`.\n   *\n   * @param {string=} value new value to set the ending symbol to.\n   * @returns {string|self} Returns the symbol when used as getter and self if used as setter.\n   */\n  this.endSymbol = function(value) {\n    if (value) {\n      endSymbol = value;\n      return this;\n    } else {\n      return endSymbol;\n    }\n  };\n\n\n  this.$get = ['$parse', '$exceptionHandler', '$sce', function($parse, $exceptionHandler, $sce) {\n    var startSymbolLength = startSymbol.length,\n        endSymbolLength = endSymbol.length,\n        escapedStartRegexp = new RegExp(startSymbol.replace(/./g, escape), 'g'),\n        escapedEndRegexp = new RegExp(endSymbol.replace(/./g, escape), 'g');\n\n    function escape(ch) {\n      return '\\\\\\\\\\\\' + ch;\n    }\n\n    function unescapeText(text) {\n      return text.replace(escapedStartRegexp, startSymbol).\n        replace(escapedEndRegexp, endSymbol);\n    }\n\n    // TODO: this is the same as the constantWatchDelegate in parse.js\n    function constantWatchDelegate(scope, listener, objectEquality, constantInterp) {\n      var unwatch = scope.$watch(function constantInterpolateWatch(scope) {\n        unwatch();\n        return constantInterp(scope);\n      }, listener, objectEquality);\n      return unwatch;\n    }\n\n    /**\n     * @ngdoc service\n     * @name $interpolate\n     * @kind function\n     *\n     * @requires $parse\n     * @requires $sce\n     *\n     * @description\n     *\n     * Compiles a string with markup into an interpolation function. This service is used by the\n     * HTML {@link ng.$compile $compile} service for data binding. See\n     * {@link ng.$interpolateProvider $interpolateProvider} for configuring the\n     * interpolation markup.\n     *\n     *\n     * ```js\n     *   var $interpolate = ...; // injected\n     *   var exp = $interpolate('Hello {{name | uppercase}}!');\n     *   expect(exp({name:'Angular'})).toEqual('Hello ANGULAR!');\n     * ```\n     *\n     * `$interpolate` takes an optional fourth argument, `allOrNothing`. If `allOrNothing` is\n     * `true`, the interpolation function will return `undefined` unless all embedded expressions\n     * evaluate to a value other than `undefined`.\n     *\n     * ```js\n     *   var $interpolate = ...; // injected\n     *   var context = {greeting: 'Hello', name: undefined };\n     *\n     *   // default \"forgiving\" mode\n     *   var exp = $interpolate('{{greeting}} {{name}}!');\n     *   expect(exp(context)).toEqual('Hello !');\n     *\n     *   // \"allOrNothing\" mode\n     *   exp = $interpolate('{{greeting}} {{name}}!', false, null, true);\n     *   expect(exp(context)).toBeUndefined();\n     *   context.name = 'Angular';\n     *   expect(exp(context)).toEqual('Hello Angular!');\n     * ```\n     *\n     * `allOrNothing` is useful for interpolating URLs. `ngSrc` and `ngSrcset` use this behavior.\n     *\n     * #### Escaped Interpolation\n     * $interpolate provides a mechanism for escaping interpolation markers. Start and end markers\n     * can be escaped by preceding each of their characters with a REVERSE SOLIDUS U+005C (backslash).\n     * It will be rendered as a regular start/end marker, and will not be interpreted as an expression\n     * or binding.\n     *\n     * This enables web-servers to prevent script injection attacks and defacing attacks, to some\n     * degree, while also enabling code examples to work without relying on the\n     * {@link ng.directive:ngNonBindable ngNonBindable} directive.\n     *\n     * **For security purposes, it is strongly encouraged that web servers escape user-supplied data,\n     * replacing angle brackets (&lt;, &gt;) with &amp;lt; and &amp;gt; respectively, and replacing all\n     * interpolation start/end markers with their escaped counterparts.**\n     *\n     * Escaped interpolation markers are only replaced with the actual interpolation markers in rendered\n     * output when the $interpolate service processes the text. So, for HTML elements interpolated\n     * by {@link ng.$compile $compile}, or otherwise interpolated with the `mustHaveExpression` parameter\n     * set to `true`, the interpolated text must contain an unescaped interpolation expression. As such,\n     * this is typically useful only when user-data is used in rendering a template from the server, or\n     * when otherwise untrusted data is used by a directive.\n     *\n     * <example name=\"interpolation\">\n     *  <file name=\"index.ced81ed4.html\">\n     *    <div ng-init=\"username='A user'\">\n     *      <p ng-init=\"apptitle='Escaping demo'\">{{apptitle}}: \\{\\{ username = \"defaced value\"; \\}\\}\n     *        </p>\n     *      <p><strong>{{username}}</strong> attempts to inject code which will deface the\n     *        application, but fails to accomplish their task, because the server has correctly\n     *        escaped the interpolation start/end markers with REVERSE SOLIDUS U+005C (backslash)\n     *        characters.</p>\n     *      <p>Instead, the result of the attempted script injection is visible, and can be removed\n     *        from the database by an administrator.</p>\n     *    </div>\n     *  </file>\n     * </example>\n     *\n     * @knownIssue\n     * It is currently not possible for an interpolated expression to contain the interpolation end\n     * symbol. For example, `{{ '}}' }}` will be incorrectly interpreted as `{{ ' }}` + `' }}`, i.e.\n     * an interpolated expression consisting of a single-quote (`'`) and the `' }}` string.\n     *\n     * @knownIssue\n     * All directives and components must use the standard `{{` `}}` interpolation symbols\n     * in their templates. If you change the application interpolation symbols the {@link $compile}\n     * service will attempt to denormalize the standard symbols to the custom symbols.\n     * The denormalization process is not clever enough to know not to replace instances of the standard\n     * symbols where they would not normally be treated as interpolation symbols. For example in the following\n     * code snippet the closing braces of the literal object will get incorrectly denormalized:\n     *\n     * ```\n     * <div data-context='{\"context\":{\"id\":3,\"type\":\"page\"}}\">\n     * ```\n     *\n     * The workaround is to ensure that such instances are separated by whitespace:\n     * ```\n     * <div data-context='{\"context\":{\"id\":3,\"type\":\"page\"} }\">\n     * ```\n     *\n     * See https://github.com/angular/angular.js/pull/14610#issuecomment-219401099 for more information.\n     *\n     * @param {string} text The text with markup to interpolate.\n     * @param {boolean=} mustHaveExpression if set to true then the interpolation string must have\n     *    embedded expression in order to return an interpolation function. Strings with no\n     *    embedded expression will return null for the interpolation function.\n     * @param {string=} trustedContext when provided, the returned function passes the interpolated\n     *    result through {@link ng.$sce#getTrusted $sce.getTrusted(interpolatedResult,\n     *    trustedContext)} before returning it.  Refer to the {@link ng.$sce $sce} service that\n     *    provides Strict Contextual Escaping for details.\n     * @param {boolean=} allOrNothing if `true`, then the returned function returns undefined\n     *    unless all embedded expressions evaluate to a value other than `undefined`.\n     * @returns {function(context)} an interpolation function which is used to compute the\n     *    interpolated string. The function has these parameters:\n     *\n     * - `context`: evaluation context for all expressions embedded in the interpolated text\n     */\n    function $interpolate(text, mustHaveExpression, trustedContext, allOrNothing) {\n      // Provide a quick exit and simplified result function for text with no interpolation\n      if (!text.length || text.indexOf(startSymbol) === -1) {\n        var constantInterp;\n        if (!mustHaveExpression) {\n          var unescapedText = unescapeText(text);\n          constantInterp = valueFn(unescapedText);\n          constantInterp.exp = text;\n          constantInterp.expressions = [];\n          constantInterp.$$watchDelegate = constantWatchDelegate;\n        }\n        return constantInterp;\n      }\n\n      allOrNothing = !!allOrNothing;\n      var startIndex,\n          endIndex,\n          index = 0,\n          expressions = [],\n          parseFns = [],\n          textLength = text.length,\n          exp,\n          concat = [],\n          expressionPositions = [];\n\n      while (index < textLength) {\n        if (((startIndex = text.indexOf(startSymbol, index)) !== -1) &&\n             ((endIndex = text.indexOf(endSymbol, startIndex + startSymbolLength)) !== -1)) {\n          if (index !== startIndex) {\n            concat.push(unescapeText(text.substring(index, startIndex)));\n          }\n          exp = text.substring(startIndex + startSymbolLength, endIndex);\n          expressions.push(exp);\n          parseFns.push($parse(exp, parseStringifyInterceptor));\n          index = endIndex + endSymbolLength;\n          expressionPositions.push(concat.length);\n          concat.push('');\n        } else {\n          // we did not find an interpolation, so we have to add the remainder to the separators array\n          if (index !== textLength) {\n            concat.push(unescapeText(text.substring(index)));\n          }\n          break;\n        }\n      }\n\n      // Concatenating expressions makes it hard to reason about whether some combination of\n      // concatenated values are unsafe to use and could easily lead to XSS.  By requiring that a\n      // single expression be used for iframe[src], object[src], etc., we ensure that the value\n      // that's used is assigned or constructed by some JS code somewhere that is more testable or\n      // make it obvious that you bound the value to some user controlled value.  This helps reduce\n      // the load when auditing for XSS issues.\n      if (trustedContext && concat.length > 1) {\n          $interpolateMinErr.throwNoconcat(text);\n      }\n\n      if (!mustHaveExpression || expressions.length) {\n        var compute = function(values) {\n          for (var i = 0, ii = expressions.length; i < ii; i++) {\n            if (allOrNothing && isUndefined(values[i])) return;\n            concat[expressionPositions[i]] = values[i];\n          }\n          return concat.join('');\n        };\n\n        var getValue = function(value) {\n          return trustedContext ?\n            $sce.getTrusted(trustedContext, value) :\n            $sce.valueOf(value);\n        };\n\n        return extend(function interpolationFn(context) {\n            var i = 0;\n            var ii = expressions.length;\n            var values = new Array(ii);\n\n            try {\n              for (; i < ii; i++) {\n                values[i] = parseFns[i](context);\n              }\n\n              return compute(values);\n            } catch (err) {\n              $exceptionHandler($interpolateMinErr.interr(text, err));\n            }\n\n          }, {\n          // all of these properties are undocumented for now\n          exp: text, //just for compatibility with regular watchers created via $watch\n          expressions: expressions,\n          $$watchDelegate: function(scope, listener) {\n            var lastValue;\n            return scope.$watchGroup(parseFns, /** @this */ function interpolateFnWatcher(values, oldValues) {\n              var currValue = compute(values);\n              if (isFunction(listener)) {\n                listener.call(this, currValue, values !== oldValues ? lastValue : currValue, scope);\n              }\n              lastValue = currValue;\n            });\n          }\n        });\n      }\n\n      function parseStringifyInterceptor(value) {\n        try {\n          value = getValue(value);\n          return allOrNothing && !isDefined(value) ? value : stringify(value);\n        } catch (err) {\n          $exceptionHandler($interpolateMinErr.interr(text, err));\n        }\n      }\n    }\n\n\n    /**\n     * @ngdoc method\n     * @name $interpolate#startSymbol\n     * @description\n     * Symbol to denote the start of expression in the interpolated string. Defaults to `{{`.\n     *\n     * Use {@link ng.$interpolateProvider#startSymbol `$interpolateProvider.startSymbol`} to change\n     * the symbol.\n     *\n     * @returns {string} start symbol.\n     */\n    $interpolate.startSymbol = function() {\n      return startSymbol;\n    };\n\n\n    /**\n     * @ngdoc method\n     * @name $interpolate#endSymbol\n     * @description\n     * Symbol to denote the end of expression in the interpolated string. Defaults to `}}`.\n     *\n     * Use {@link ng.$interpolateProvider#endSymbol `$interpolateProvider.endSymbol`} to change\n     * the symbol.\n     *\n     * @returns {string} end symbol.\n     */\n    $interpolate.endSymbol = function() {\n      return endSymbol;\n    };\n\n    return $interpolate;\n  }];\n}\n\n/** @this */\nfunction $IntervalProvider() {\n  this.$get = ['$rootScope', '$window', '$q', '$$q', '$browser',\n       function($rootScope,   $window,   $q,   $$q,   $browser) {\n    var intervals = {};\n\n\n     /**\n      * @ngdoc service\n      * @name $interval\n      *\n      * @description\n      * Angular's wrapper for `window.setInterval`. The `fn` function is executed every `delay`\n      * milliseconds.\n      *\n      * The return value of registering an interval function is a promise. This promise will be\n      * notified upon each tick of the interval, and will be resolved after `count` iterations, or\n      * run indefinitely if `count` is not defined. The value of the notification will be the\n      * number of iterations that have run.\n      * To cancel an interval, call `$interval.cancel(promise)`.\n      *\n      * In tests you can use {@link ngMock.$interval#flush `$interval.flush(millis)`} to\n      * move forward by `millis` milliseconds and trigger any functions scheduled to run in that\n      * time.\n      *\n      * <div class=\"alert alert-warning\">\n      * **Note**: Intervals created by this service must be explicitly destroyed when you are finished\n      * with them.  In particular they are not automatically destroyed when a controller's scope or a\n      * directive's element are destroyed.\n      * You should take this into consideration and make sure to always cancel the interval at the\n      * appropriate moment.  See the example below for more details on how and when to do this.\n      * </div>\n      *\n      * @param {function()} fn A function that should be called repeatedly. If no additional arguments\n      *   are passed (see below), the function is called with the current iteration count.\n      * @param {number} delay Number of milliseconds between each function call.\n      * @param {number=} [count=0] Number of times to repeat. If not set, or 0, will repeat\n      *   indefinitely.\n      * @param {boolean=} [invokeApply=true] If set to `false` skips model dirty checking, otherwise\n      *   will invoke `fn` within the {@link ng.$rootScope.Scope#$apply $apply} block.\n      * @param {...*=} Pass additional parameters to the executed function.\n      * @returns {promise} A promise which will be notified on each iteration. It will resolve once all iterations of the interval complete.\n      *\n      * @example\n      * <example module=\"intervalExample\" name=\"interval-service\">\n      * <file name=\"index.ced81ed4.html\">\n      *   <script>\n      *     angular.module('intervalExample', [])\n      *       .controller('ExampleController', ['$scope', '$interval',\n      *         function($scope, $interval) {\n      *           $scope.format = 'M/d/yy h:mm:ss a';\n      *           $scope.blood_1 = 100;\n      *           $scope.blood_2 = 120;\n      *\n      *           var stop;\n      *           $scope.fight = function() {\n      *             // Don't start a new fight if we are already fighting\n      *             if ( angular.isDefined(stop) ) return;\n      *\n      *             stop = $interval(function() {\n      *               if ($scope.blood_1 > 0 && $scope.blood_2 > 0) {\n      *                 $scope.blood_1 = $scope.blood_1 - 3;\n      *                 $scope.blood_2 = $scope.blood_2 - 4;\n      *               } else {\n      *                 $scope.stopFight();\n      *               }\n      *             }, 100);\n      *           };\n      *\n      *           $scope.stopFight = function() {\n      *             if (angular.isDefined(stop)) {\n      *               $interval.cancel(stop);\n      *               stop = undefined;\n      *             }\n      *           };\n      *\n      *           $scope.resetFight = function() {\n      *             $scope.blood_1 = 100;\n      *             $scope.blood_2 = 120;\n      *           };\n      *\n      *           $scope.$on('$destroy', function() {\n      *             // Make sure that the interval is destroyed too\n      *             $scope.stopFight();\n      *           });\n      *         }])\n      *       // Register the 'myCurrentTime' directive factory method.\n      *       // We inject $interval and dateFilter service since the factory method is DI.\n      *       .directive('myCurrentTime', ['$interval', 'dateFilter',\n      *         function($interval, dateFilter) {\n      *           // return the directive link function. (compile function not needed)\n      *           return function(scope, element, attrs) {\n      *             var format,  // date format\n      *                 stopTime; // so that we can cancel the time updates\n      *\n      *             // used to update the UI\n      *             function updateTime() {\n      *               element.text(dateFilter(new Date(), format));\n      *             }\n      *\n      *             // watch the expression, and update the UI on change.\n      *             scope.$watch(attrs.myCurrentTime, function(value) {\n      *               format = value;\n      *               updateTime();\n      *             });\n      *\n      *             stopTime = $interval(updateTime, 1000);\n      *\n      *             // listen on DOM destroy (removal) event, and cancel the next UI update\n      *             // to prevent updating time after the DOM element was removed.\n      *             element.on('$destroy', function() {\n      *               $interval.cancel(stopTime);\n      *             });\n      *           }\n      *         }]);\n      *   </script>\n      *\n      *   <div>\n      *     <div ng-controller=\"ExampleController\">\n      *       <label>Date format: <input ng-model=\"format\"></label> <hr/>\n      *       Current time is: <span my-current-time=\"format\"></span>\n      *       <hr/>\n      *       Blood 1 : <font color='red'>{{blood_1}}</font>\n      *       Blood 2 : <font color='red'>{{blood_2}}</font>\n      *       <button type=\"button\" data-ng-click=\"fight()\">Fight</button>\n      *       <button type=\"button\" data-ng-click=\"stopFight()\">StopFight</button>\n      *       <button type=\"button\" data-ng-click=\"resetFight()\">resetFight</button>\n      *     </div>\n      *   </div>\n      *\n      * </file>\n      * </example>\n      */\n    function interval(fn, delay, count, invokeApply) {\n      var hasParams = arguments.length > 4,\n          args = hasParams ? sliceArgs(arguments, 4) : [],\n          setInterval = $window.setInterval,\n          clearInterval = $window.clearInterval,\n          iteration = 0,\n          skipApply = (isDefined(invokeApply) && !invokeApply),\n          deferred = (skipApply ? $$q : $q).defer(),\n          promise = deferred.promise;\n\n      count = isDefined(count) ? count : 0;\n\n      promise.$$intervalId = setInterval(function tick() {\n        if (skipApply) {\n          $browser.defer(callback);\n        } else {\n          $rootScope.$evalAsync(callback);\n        }\n        deferred.notify(iteration++);\n\n        if (count > 0 && iteration >= count) {\n          deferred.resolve(iteration);\n          clearInterval(promise.$$intervalId);\n          delete intervals[promise.$$intervalId];\n        }\n\n        if (!skipApply) $rootScope.$apply();\n\n      }, delay);\n\n      intervals[promise.$$intervalId] = deferred;\n\n      return promise;\n\n      function callback() {\n        if (!hasParams) {\n          fn(iteration);\n        } else {\n          fn.apply(null, args);\n        }\n      }\n    }\n\n\n     /**\n      * @ngdoc method\n      * @name $interval#cancel\n      *\n      * @description\n      * Cancels a task associated with the `promise`.\n      *\n      * @param {Promise=} promise returned by the `$interval` function.\n      * @returns {boolean} Returns `true` if the task was successfully canceled.\n      */\n    interval.cancel = function(promise) {\n      if (promise && promise.$$intervalId in intervals) {\n        // Interval cancels should not report as unhandled promise.\n        intervals[promise.$$intervalId].promise.catch(noop);\n        intervals[promise.$$intervalId].reject('canceled');\n        $window.clearInterval(promise.$$intervalId);\n        delete intervals[promise.$$intervalId];\n        return true;\n      }\n      return false;\n    };\n\n    return interval;\n  }];\n}\n\n/**\n * @ngdoc service\n * @name $jsonpCallbacks\n * @requires $window\n * @description\n * This service handles the lifecycle of callbacks to handle JSONP requests.\n * Override this service if you wish to customise where the callbacks are stored and\n * how they vary compared to the requested url.\n */\nvar $jsonpCallbacksProvider = /** @this */ function() {\n  this.$get = function() {\n    var callbacks = angular.callbacks;\n    var callbackMap = {};\n\n    function createCallback(callbackId) {\n      var callback = function(data) {\n        callback.data = data;\n        callback.called = true;\n      };\n      callback.id = callbackId;\n      return callback;\n    }\n\n    return {\n      /**\n       * @ngdoc method\n       * @name $jsonpCallbacks#createCallback\n       * @param {string} url the url of the JSONP request\n       * @returns {string} the callback path to send to the server as part of the JSONP request\n       * @description\n       * {@link $httpBackend} calls this method to create a callback and get hold of the path to the callback\n       * to pass to the server, which will be used to call the callback with its payload in the JSONP response.\n       */\n      createCallback: function(url) {\n        var callbackId = '_' + (callbacks.$$counter++).toString(36);\n        var callbackPath = 'angular.callbacks.' + callbackId;\n        var callback = createCallback(callbackId);\n        callbackMap[callbackPath] = callbacks[callbackId] = callback;\n        return callbackPath;\n      },\n      /**\n       * @ngdoc method\n       * @name $jsonpCallbacks#wasCalled\n       * @param {string} callbackPath the path to the callback that was sent in the JSONP request\n       * @returns {boolean} whether the callback has been called, as a result of the JSONP response\n       * @description\n       * {@link $httpBackend} calls this method to find out whether the JSONP response actually called the\n       * callback that was passed in the request.\n       */\n      wasCalled: function(callbackPath) {\n        return callbackMap[callbackPath].called;\n      },\n      /**\n       * @ngdoc method\n       * @name $jsonpCallbacks#getResponse\n       * @param {string} callbackPath the path to the callback that was sent in the JSONP request\n       * @returns {*} the data received from the response via the registered callback\n       * @description\n       * {@link $httpBackend} calls this method to get hold of the data that was provided to the callback\n       * in the JSONP response.\n       */\n      getResponse: function(callbackPath) {\n        return callbackMap[callbackPath].data;\n      },\n      /**\n       * @ngdoc method\n       * @name $jsonpCallbacks#removeCallback\n       * @param {string} callbackPath the path to the callback that was sent in the JSONP request\n       * @description\n       * {@link $httpBackend} calls this method to remove the callback after the JSONP request has\n       * completed or timed-out.\n       */\n      removeCallback: function(callbackPath) {\n        var callback = callbackMap[callbackPath];\n        delete callbacks[callback.id];\n        delete callbackMap[callbackPath];\n      }\n    };\n  };\n};\n\n/**\n * @ngdoc service\n * @name $locale\n *\n * @description\n * $locale service provides localization rules for various Angular components. As of right now the\n * only public api is:\n *\n * * `id` – `{string}` – locale id formatted as `languageId-countryId` (e.g. `en-us`)\n */\n\nvar PATH_MATCH = /^([^?#]*)(\\?([^#]*))?(#(.*))?$/,\n    DEFAULT_PORTS = {'http': 80, 'https': 443, 'ftp': 21};\nvar $locationMinErr = minErr('$location');\n\n\n/**\n * Encode path using encodeUriSegment, ignoring forward slashes\n *\n * @param {string} path Path to encode\n * @returns {string}\n */\nfunction encodePath(path) {\n  var segments = path.split('/'),\n      i = segments.length;\n\n  while (i--) {\n    segments[i] = encodeUriSegment(segments[i]);\n  }\n\n  return segments.join('/');\n}\n\nfunction parseAbsoluteUrl(absoluteUrl, locationObj) {\n  var parsedUrl = urlResolve(absoluteUrl);\n\n  locationObj.$$protocol = parsedUrl.protocol;\n  locationObj.$$host = parsedUrl.hostname;\n  locationObj.$$port = toInt(parsedUrl.port) || DEFAULT_PORTS[parsedUrl.protocol] || null;\n}\n\nvar DOUBLE_SLASH_REGEX = /^\\s*[\\\\/]{2,}/;\nfunction parseAppUrl(url, locationObj) {\n\n  if (DOUBLE_SLASH_REGEX.test(url)) {\n    throw $locationMinErr('badpath', 'Invalid url \"{0}\".', url);\n  }\n\n  var prefixed = (url.charAt(0) !== '/');\n  if (prefixed) {\n    url = '/' + url;\n  }\n  var match = urlResolve(url);\n  locationObj.$$path = decodeURIComponent(prefixed && match.pathname.charAt(0) === '/' ?\n      match.pathname.substring(1) : match.pathname);\n  locationObj.$$search = parseKeyValue(match.search);\n  locationObj.$$hash = decodeURIComponent(match.hash);\n\n  // make sure path starts with '/';\n  if (locationObj.$$path && locationObj.$$path.charAt(0) !== '/') {\n    locationObj.$$path = '/' + locationObj.$$path;\n  }\n}\n\nfunction startsWith(str, search) {\n  return str.slice(0, search.length) === search;\n}\n\n/**\n *\n * @param {string} base\n * @param {string} url\n * @returns {string} returns text from `url` after `base` or `undefined` if it does not begin with\n *                   the expected string.\n */\nfunction stripBaseUrl(base, url) {\n  if (startsWith(url, base)) {\n    return url.substr(base.length);\n  }\n}\n\n\nfunction stripHash(url) {\n  var index = url.indexOf('#');\n  return index === -1 ? url : url.substr(0, index);\n}\n\nfunction trimEmptyHash(url) {\n  return url.replace(/(#.+)|#$/, '$1');\n}\n\n\nfunction stripFile(url) {\n  return url.substr(0, stripHash(url).lastIndexOf('/') + 1);\n}\n\n/* return the server only (scheme://host:port) */\nfunction serverBase(url) {\n  return url.substring(0, url.indexOf('/', url.indexOf('//') + 2));\n}\n\n\n/**\n * LocationHtml5Url represents a URL\n * This object is exposed as $location service when HTML5 mode is enabled and supported\n *\n * @constructor\n * @param {string} appBase application base URL\n * @param {string} appBaseNoFile application base URL stripped of any filename\n * @param {string} basePrefix URL path prefix\n */\nfunction LocationHtml5Url(appBase, appBaseNoFile, basePrefix) {\n  this.$$html5 = true;\n  basePrefix = basePrefix || '';\n  parseAbsoluteUrl(appBase, this);\n\n\n  /**\n   * Parse given HTML5 (regular) URL string into properties\n   * @param {string} url HTML5 URL\n   * @private\n   */\n  this.$$parse = function(url) {\n    var pathUrl = stripBaseUrl(appBaseNoFile, url);\n    if (!isString(pathUrl)) {\n      throw $locationMinErr('ipthprfx', 'Invalid url \"{0}\", missing path prefix \"{1}\".', url,\n          appBaseNoFile);\n    }\n\n    parseAppUrl(pathUrl, this);\n\n    if (!this.$$path) {\n      this.$$path = '/';\n    }\n\n    this.$$compose();\n  };\n\n  /**\n   * Compose url and update `absUrl` property\n   * @private\n   */\n  this.$$compose = function() {\n    var search = toKeyValue(this.$$search),\n        hash = this.$$hash ? '#' + encodeUriSegment(this.$$hash) : '';\n\n    this.$$url = encodePath(this.$$path) + (search ? '?' + search : '') + hash;\n    this.$$absUrl = appBaseNoFile + this.$$url.substr(1); // first char is always '/'\n\n    this.$$urlUpdatedByLocation = true;\n  };\n\n  this.$$parseLinkUrl = function(url, relHref) {\n    if (relHref && relHref[0] === '#') {\n      // special case for links to hash fragments:\n      // keep the old url and only replace the hash fragment\n      this.hash(relHref.slice(1));\n      return true;\n    }\n    var appUrl, prevAppUrl;\n    var rewrittenUrl;\n\n\n    if (isDefined(appUrl = stripBaseUrl(appBase, url))) {\n      prevAppUrl = appUrl;\n      if (basePrefix && isDefined(appUrl = stripBaseUrl(basePrefix, appUrl))) {\n        rewrittenUrl = appBaseNoFile + (stripBaseUrl('/', appUrl) || appUrl);\n      } else {\n        rewrittenUrl = appBase + prevAppUrl;\n      }\n    } else if (isDefined(appUrl = stripBaseUrl(appBaseNoFile, url))) {\n      rewrittenUrl = appBaseNoFile + appUrl;\n    } else if (appBaseNoFile === url + '/') {\n      rewrittenUrl = appBaseNoFile;\n    }\n    if (rewrittenUrl) {\n      this.$$parse(rewrittenUrl);\n    }\n    return !!rewrittenUrl;\n  };\n}\n\n\n/**\n * LocationHashbangUrl represents URL\n * This object is exposed as $location service when developer doesn't opt into html5 mode.\n * It also serves as the base class for html5 mode fallback on legacy browsers.\n *\n * @constructor\n * @param {string} appBase application base URL\n * @param {string} appBaseNoFile application base URL stripped of any filename\n * @param {string} hashPrefix hashbang prefix\n */\nfunction LocationHashbangUrl(appBase, appBaseNoFile, hashPrefix) {\n\n  parseAbsoluteUrl(appBase, this);\n\n\n  /**\n   * Parse given hashbang URL into properties\n   * @param {string} url Hashbang URL\n   * @private\n   */\n  this.$$parse = function(url) {\n    var withoutBaseUrl = stripBaseUrl(appBase, url) || stripBaseUrl(appBaseNoFile, url);\n    var withoutHashUrl;\n\n    if (!isUndefined(withoutBaseUrl) && withoutBaseUrl.charAt(0) === '#') {\n\n      // The rest of the URL starts with a hash so we have\n      // got either a hashbang path or a plain hash fragment\n      withoutHashUrl = stripBaseUrl(hashPrefix, withoutBaseUrl);\n      if (isUndefined(withoutHashUrl)) {\n        // There was no hashbang prefix so we just have a hash fragment\n        withoutHashUrl = withoutBaseUrl;\n      }\n\n    } else {\n      // There was no hashbang path nor hash fragment:\n      // If we are in HTML5 mode we use what is left as the path;\n      // Otherwise we ignore what is left\n      if (this.$$html5) {\n        withoutHashUrl = withoutBaseUrl;\n      } else {\n        withoutHashUrl = '';\n        if (isUndefined(withoutBaseUrl)) {\n          appBase = url;\n          /** @type {?} */ (this).replace();\n        }\n      }\n    }\n\n    parseAppUrl(withoutHashUrl, this);\n\n    this.$$path = removeWindowsDriveName(this.$$path, withoutHashUrl, appBase);\n\n    this.$$compose();\n\n    /*\n     * In Windows, on an anchor node on documents loaded from\n     * the filesystem, the browser will return a pathname\n     * prefixed with the drive name ('/C:/path') when a\n     * pathname without a drive is set:\n     *  * a.setAttribute('href', '/foo')\n     *   * a.pathname === '/C:/foo' //true\n     *\n     * Inside of Angular, we're always using pathnames that\n     * do not include drive names for routing.\n     */\n    function removeWindowsDriveName(path, url, base) {\n      /*\n      Matches paths for file protocol on windows,\n      such as /C:/foo/bar, and captures only /foo/bar.\n      */\n      var windowsFilePathExp = /^\\/[A-Z]:(\\/.*)/;\n\n      var firstPathSegmentMatch;\n\n      //Get the relative path from the input URL.\n      if (startsWith(url, base)) {\n        url = url.replace(base, '');\n      }\n\n      // The input URL intentionally contains a first path segment that ends with a colon.\n      if (windowsFilePathExp.exec(url)) {\n        return path;\n      }\n\n      firstPathSegmentMatch = windowsFilePathExp.exec(path);\n      return firstPathSegmentMatch ? firstPathSegmentMatch[1] : path;\n    }\n  };\n\n  /**\n   * Compose hashbang URL and update `absUrl` property\n   * @private\n   */\n  this.$$compose = function() {\n    var search = toKeyValue(this.$$search),\n        hash = this.$$hash ? '#' + encodeUriSegment(this.$$hash) : '';\n\n    this.$$url = encodePath(this.$$path) + (search ? '?' + search : '') + hash;\n    this.$$absUrl = appBase + (this.$$url ? hashPrefix + this.$$url : '');\n\n    this.$$urlUpdatedByLocation = true;\n  };\n\n  this.$$parseLinkUrl = function(url, relHref) {\n    if (stripHash(appBase) === stripHash(url)) {\n      this.$$parse(url);\n      return true;\n    }\n    return false;\n  };\n}\n\n\n/**\n * LocationHashbangUrl represents URL\n * This object is exposed as $location service when html5 history api is enabled but the browser\n * does not support it.\n *\n * @constructor\n * @param {string} appBase application base URL\n * @param {string} appBaseNoFile application base URL stripped of any filename\n * @param {string} hashPrefix hashbang prefix\n */\nfunction LocationHashbangInHtml5Url(appBase, appBaseNoFile, hashPrefix) {\n  this.$$html5 = true;\n  LocationHashbangUrl.apply(this, arguments);\n\n  this.$$parseLinkUrl = function(url, relHref) {\n    if (relHref && relHref[0] === '#') {\n      // special case for links to hash fragments:\n      // keep the old url and only replace the hash fragment\n      this.hash(relHref.slice(1));\n      return true;\n    }\n\n    var rewrittenUrl;\n    var appUrl;\n\n    if (appBase === stripHash(url)) {\n      rewrittenUrl = url;\n    } else if ((appUrl = stripBaseUrl(appBaseNoFile, url))) {\n      rewrittenUrl = appBase + hashPrefix + appUrl;\n    } else if (appBaseNoFile === url + '/') {\n      rewrittenUrl = appBaseNoFile;\n    }\n    if (rewrittenUrl) {\n      this.$$parse(rewrittenUrl);\n    }\n    return !!rewrittenUrl;\n  };\n\n  this.$$compose = function() {\n    var search = toKeyValue(this.$$search),\n        hash = this.$$hash ? '#' + encodeUriSegment(this.$$hash) : '';\n\n    this.$$url = encodePath(this.$$path) + (search ? '?' + search : '') + hash;\n    // include hashPrefix in $$absUrl when $$url is empty so IE9 does not reload page because of removal of '#'\n    this.$$absUrl = appBase + hashPrefix + this.$$url;\n\n    this.$$urlUpdatedByLocation = true;\n  };\n\n}\n\n\nvar locationPrototype = {\n\n  /**\n   * Ensure absolute URL is initialized.\n   * @private\n   */\n  $$absUrl:'',\n\n  /**\n   * Are we in html5 mode?\n   * @private\n   */\n  $$html5: false,\n\n  /**\n   * Has any change been replacing?\n   * @private\n   */\n  $$replace: false,\n\n  /**\n   * @ngdoc method\n   * @name $location#absUrl\n   *\n   * @description\n   * This method is getter only.\n   *\n   * Return full URL representation with all segments encoded according to rules specified in\n   * [RFC 3986](http://www.ietf.org/rfc/rfc3986.txt).\n   *\n   *\n   * ```js\n   * // given URL http://example.com/#/some/path?foo=bar&baz=xoxo\n   * var absUrl = $location.absUrl();\n   * // => \"http://example.com/#/some/path?foo=bar&baz=xoxo\"\n   * ```\n   *\n   * @return {string} full URL\n   */\n  absUrl: locationGetter('$$absUrl'),\n\n  /**\n   * @ngdoc method\n   * @name $location#url\n   *\n   * @description\n   * This method is getter / setter.\n   *\n   * Return URL (e.g. `/path?a=b#hash`) when called without any parameter.\n   *\n   * Change path, search and hash, when called with parameter and return `$location`.\n   *\n   *\n   * ```js\n   * // given URL http://example.com/#/some/path?foo=bar&baz=xoxo\n   * var url = $location.url();\n   * // => \"/some/path?foo=bar&baz=xoxo\"\n   * ```\n   *\n   * @param {string=} url New URL without base prefix (e.g. `/path?a=b#hash`)\n   * @return {string} url\n   */\n  url: function(url) {\n    if (isUndefined(url)) {\n      return this.$$url;\n    }\n\n    var match = PATH_MATCH.exec(url);\n    if (match[1] || url === '') this.path(decodeURIComponent(match[1]));\n    if (match[2] || match[1] || url === '') this.search(match[3] || '');\n    this.hash(match[5] || '');\n\n    return this;\n  },\n\n  /**\n   * @ngdoc method\n   * @name $location#protocol\n   *\n   * @description\n   * This method is getter only.\n   *\n   * Return protocol of current URL.\n   *\n   *\n   * ```js\n   * // given URL http://example.com/#/some/path?foo=bar&baz=xoxo\n   * var protocol = $location.protocol();\n   * // => \"http\"\n   * ```\n   *\n   * @return {string} protocol of current URL\n   */\n  protocol: locationGetter('$$protocol'),\n\n  /**\n   * @ngdoc method\n   * @name $location#host\n   *\n   * @description\n   * This method is getter only.\n   *\n   * Return host of current URL.\n   *\n   * Note: compared to the non-angular version `location.host` which returns `hostname:port`, this returns the `hostname` portion only.\n   *\n   *\n   * ```js\n   * // given URL http://example.com/#/some/path?foo=bar&baz=xoxo\n   * var host = $location.host();\n   * // => \"example.com\"\n   *\n   * // given URL http://user:password@example.com:8080/#/some/path?foo=bar&baz=xoxo\n   * host = $location.host();\n   * // => \"example.com\"\n   * host = location.host;\n   * // => \"example.com:8080\"\n   * ```\n   *\n   * @return {string} host of current URL.\n   */\n  host: locationGetter('$$host'),\n\n  /**\n   * @ngdoc method\n   * @name $location#port\n   *\n   * @description\n   * This method is getter only.\n   *\n   * Return port of current URL.\n   *\n   *\n   * ```js\n   * // given URL http://example.com/#/some/path?foo=bar&baz=xoxo\n   * var port = $location.port();\n   * // => 80\n   * ```\n   *\n   * @return {Number} port\n   */\n  port: locationGetter('$$port'),\n\n  /**\n   * @ngdoc method\n   * @name $location#path\n   *\n   * @description\n   * This method is getter / setter.\n   *\n   * Return path of current URL when called without any parameter.\n   *\n   * Change path when called with parameter and return `$location`.\n   *\n   * Note: Path should always begin with forward slash (/), this method will add the forward slash\n   * if it is missing.\n   *\n   *\n   * ```js\n   * // given URL http://example.com/#/some/path?foo=bar&baz=xoxo\n   * var path = $location.path();\n   * // => \"/some/path\"\n   * ```\n   *\n   * @param {(string|number)=} path New path\n   * @return {(string|object)} path if called with no parameters, or `$location` if called with a parameter\n   */\n  path: locationGetterSetter('$$path', function(path) {\n    path = path !== null ? path.toString() : '';\n    return path.charAt(0) === '/' ? path : '/' + path;\n  }),\n\n  /**\n   * @ngdoc method\n   * @name $location#search\n   *\n   * @description\n   * This method is getter / setter.\n   *\n   * Return search part (as object) of current URL when called without any parameter.\n   *\n   * Change search part when called with parameter and return `$location`.\n   *\n   *\n   * ```js\n   * // given URL http://example.com/#/some/path?foo=bar&baz=xoxo\n   * var searchObject = $location.search();\n   * // => {foo: 'bar', baz: 'xoxo'}\n   *\n   * // set foo to 'yipee'\n   * $location.search('foo', 'yipee');\n   * // $location.search() => {foo: 'yipee', baz: 'xoxo'}\n   * ```\n   *\n   * @param {string|Object.<string>|Object.<Array.<string>>} search New search params - string or\n   * hash object.\n   *\n   * When called with a single argument the method acts as a setter, setting the `search` component\n   * of `$location` to the specified value.\n   *\n   * If the argument is a hash object containing an array of values, these values will be encoded\n   * as duplicate search parameters in the URL.\n   *\n   * @param {(string|Number|Array<string>|boolean)=} paramValue If `search` is a string or number, then `paramValue`\n   * will override only a single search property.\n   *\n   * If `paramValue` is an array, it will override the property of the `search` component of\n   * `$location` specified via the first argument.\n   *\n   * If `paramValue` is `null`, the property specified via the first argument will be deleted.\n   *\n   * If `paramValue` is `true`, the property specified via the first argument will be added with no\n   * value nor trailing equal sign.\n   *\n   * @return {Object} If called with no arguments returns the parsed `search` object. If called with\n   * one or more arguments returns `$location` object itself.\n   */\n  search: function(search, paramValue) {\n    switch (arguments.length) {\n      case 0:\n        return this.$$search;\n      case 1:\n        if (isString(search) || isNumber(search)) {\n          search = search.toString();\n          this.$$search = parseKeyValue(search);\n        } else if (isObject(search)) {\n          search = copy(search, {});\n          // remove object undefined or null properties\n          forEach(search, function(value, key) {\n            if (value == null) delete search[key];\n          });\n\n          this.$$search = search;\n        } else {\n          throw $locationMinErr('isrcharg',\n              'The first argument of the `$location#search()` call must be a string or an object.');\n        }\n        break;\n      default:\n        if (isUndefined(paramValue) || paramValue === null) {\n          delete this.$$search[search];\n        } else {\n          this.$$search[search] = paramValue;\n        }\n    }\n\n    this.$$compose();\n    return this;\n  },\n\n  /**\n   * @ngdoc method\n   * @name $location#hash\n   *\n   * @description\n   * This method is getter / setter.\n   *\n   * Returns the hash fragment when called without any parameters.\n   *\n   * Changes the hash fragment when called with a parameter and returns `$location`.\n   *\n   *\n   * ```js\n   * // given URL http://example.com/#/some/path?foo=bar&baz=xoxo#hashValue\n   * var hash = $location.hash();\n   * // => \"hashValue\"\n   * ```\n   *\n   * @param {(string|number)=} hash New hash fragment\n   * @return {string} hash\n   */\n  hash: locationGetterSetter('$$hash', function(hash) {\n    return hash !== null ? hash.toString() : '';\n  }),\n\n  /**\n   * @ngdoc method\n   * @name $location#replace\n   *\n   * @description\n   * If called, all changes to $location during the current `$digest` will replace the current history\n   * record, instead of adding a new one.\n   */\n  replace: function() {\n    this.$$replace = true;\n    return this;\n  }\n};\n\nforEach([LocationHashbangInHtml5Url, LocationHashbangUrl, LocationHtml5Url], function(Location) {\n  Location.prototype = Object.create(locationPrototype);\n\n  /**\n   * @ngdoc method\n   * @name $location#state\n   *\n   * @description\n   * This method is getter / setter.\n   *\n   * Return the history state object when called without any parameter.\n   *\n   * Change the history state object when called with one parameter and return `$location`.\n   * The state object is later passed to `pushState` or `replaceState`.\n   *\n   * NOTE: This method is supported only in HTML5 mode and only in browsers supporting\n   * the HTML5 History API (i.e. methods `pushState` and `replaceState`). If you need to support\n   * older browsers (like IE9 or Android < 4.0), don't use this method.\n   *\n   * @param {object=} state State object for pushState or replaceState\n   * @return {object} state\n   */\n  Location.prototype.state = function(state) {\n    if (!arguments.length) {\n      return this.$$state;\n    }\n\n    if (Location !== LocationHtml5Url || !this.$$html5) {\n      throw $locationMinErr('nostate', 'History API state support is available only ' +\n        'in HTML5 mode and only in browsers supporting HTML5 History API');\n    }\n    // The user might modify `stateObject` after invoking `$location.state(stateObject)`\n    // but we're changing the $$state reference to $browser.state() during the $digest\n    // so the modification window is narrow.\n    this.$$state = isUndefined(state) ? null : state;\n    this.$$urlUpdatedByLocation = true;\n\n    return this;\n  };\n});\n\n\nfunction locationGetter(property) {\n  return /** @this */ function() {\n    return this[property];\n  };\n}\n\n\nfunction locationGetterSetter(property, preprocess) {\n  return /** @this */ function(value) {\n    if (isUndefined(value)) {\n      return this[property];\n    }\n\n    this[property] = preprocess(value);\n    this.$$compose();\n\n    return this;\n  };\n}\n\n\n/**\n * @ngdoc service\n * @name $location\n *\n * @requires $rootElement\n *\n * @description\n * The $location service parses the URL in the browser address bar (based on the\n * [window.location](https://developer.mozilla.org/en/window.location)) and makes the URL\n * available to your application. Changes to the URL in the address bar are reflected into\n * $location service and changes to $location are reflected into the browser address bar.\n *\n * **The $location service:**\n *\n * - Exposes the current URL in the browser address bar, so you can\n *   - Watch and observe the URL.\n *   - Change the URL.\n * - Synchronizes the URL with the browser when the user\n *   - Changes the address bar.\n *   - Clicks the back or forward button (or clicks a History link).\n *   - Clicks on a link.\n * - Represents the URL object as a set of methods (protocol, host, port, path, search, hash).\n *\n * For more information see {@link guide/$location Developer Guide: Using $location}\n */\n\n/**\n * @ngdoc provider\n * @name $locationProvider\n * @this\n *\n * @description\n * Use the `$locationProvider` to configure how the application deep linking paths are stored.\n */\nfunction $LocationProvider() {\n  var hashPrefix = '!',\n      html5Mode = {\n        enabled: false,\n        requireBase: true,\n        rewriteLinks: true\n      };\n\n  /**\n   * @ngdoc method\n   * @name $locationProvider#hashPrefix\n   * @description\n   * The default value for the prefix is `'!'`.\n   * @param {string=} prefix Prefix for hash part (containing path and search)\n   * @returns {*} current value if used as getter or itself (chaining) if used as setter\n   */\n  this.hashPrefix = function(prefix) {\n    if (isDefined(prefix)) {\n      hashPrefix = prefix;\n      return this;\n    } else {\n      return hashPrefix;\n    }\n  };\n\n  /**\n   * @ngdoc method\n   * @name $locationProvider#html5Mode\n   * @description\n   * @param {(boolean|Object)=} mode If boolean, sets `html5Mode.enabled` to value.\n   *   If object, sets `enabled`, `requireBase` and `rewriteLinks` to respective values. Supported\n   *   properties:\n   *   - **enabled** – `{boolean}` – (default: false) If true, will rely on `history.pushState` to\n   *     change urls where supported. Will fall back to hash-prefixed paths in browsers that do not\n   *     support `pushState`.\n   *   - **requireBase** - `{boolean}` - (default: `true`) When html5Mode is enabled, specifies\n   *     whether or not a <base> tag is required to be present. If `enabled` and `requireBase` are\n   *     true, and a base tag is not present, an error will be thrown when `$location` is injected.\n   *     See the {@link guide/$location $location guide for more information}\n   *   - **rewriteLinks** - `{boolean|string}` - (default: `true`) When html5Mode is enabled,\n   *     enables/disables URL rewriting for relative links. If set to a string, URL rewriting will\n   *     only happen on links with an attribute that matches the given string. For example, if set\n   *     to `'internal-link'`, then the URL will only be rewritten for `<a internal-link>` links.\n   *     Note that [attribute name normalization](guide/directive#normalization) does not apply\n   *     here, so `'internalLink'` will **not** match `'internal-link'`.\n   *\n   * @returns {Object} html5Mode object if used as getter or itself (chaining) if used as setter\n   */\n  this.html5Mode = function(mode) {\n    if (isBoolean(mode)) {\n      html5Mode.enabled = mode;\n      return this;\n    } else if (isObject(mode)) {\n\n      if (isBoolean(mode.enabled)) {\n        html5Mode.enabled = mode.enabled;\n      }\n\n      if (isBoolean(mode.requireBase)) {\n        html5Mode.requireBase = mode.requireBase;\n      }\n\n      if (isBoolean(mode.rewriteLinks) || isString(mode.rewriteLinks)) {\n        html5Mode.rewriteLinks = mode.rewriteLinks;\n      }\n\n      return this;\n    } else {\n      return html5Mode;\n    }\n  };\n\n  /**\n   * @ngdoc event\n   * @name $location#$locationChangeStart\n   * @eventType broadcast on root scope\n   * @description\n   * Broadcasted before a URL will change.\n   *\n   * This change can be prevented by calling\n   * `preventDefault` method of the event. See {@link ng.$rootScope.Scope#$on} for more\n   * details about event object. Upon successful change\n   * {@link ng.$location#$locationChangeSuccess $locationChangeSuccess} is fired.\n   *\n   * The `newState` and `oldState` parameters may be defined only in HTML5 mode and when\n   * the browser supports the HTML5 History API.\n   *\n   * @param {Object} angularEvent Synthetic event object.\n   * @param {string} newUrl New URL\n   * @param {string=} oldUrl URL that was before it was changed.\n   * @param {string=} newState New history state object\n   * @param {string=} oldState History state object that was before it was changed.\n   */\n\n  /**\n   * @ngdoc event\n   * @name $location#$locationChangeSuccess\n   * @eventType broadcast on root scope\n   * @description\n   * Broadcasted after a URL was changed.\n   *\n   * The `newState` and `oldState` parameters may be defined only in HTML5 mode and when\n   * the browser supports the HTML5 History API.\n   *\n   * @param {Object} angularEvent Synthetic event object.\n   * @param {string} newUrl New URL\n   * @param {string=} oldUrl URL that was before it was changed.\n   * @param {string=} newState New history state object\n   * @param {string=} oldState History state object that was before it was changed.\n   */\n\n  this.$get = ['$rootScope', '$browser', '$sniffer', '$rootElement', '$window',\n      function($rootScope, $browser, $sniffer, $rootElement, $window) {\n    var $location,\n        LocationMode,\n        baseHref = $browser.baseHref(), // if base[href] is undefined, it defaults to ''\n        initialUrl = $browser.url(),\n        appBase;\n\n    if (html5Mode.enabled) {\n      if (!baseHref && html5Mode.requireBase) {\n        throw $locationMinErr('nobase',\n          '$location in HTML5 mode requires a <base> tag to be present!');\n      }\n      appBase = serverBase(initialUrl) + (baseHref || '/');\n      LocationMode = $sniffer.history ? LocationHtml5Url : LocationHashbangInHtml5Url;\n    } else {\n      appBase = stripHash(initialUrl);\n      LocationMode = LocationHashbangUrl;\n    }\n    var appBaseNoFile = stripFile(appBase);\n\n    $location = new LocationMode(appBase, appBaseNoFile, '#' + hashPrefix);\n    $location.$$parseLinkUrl(initialUrl, initialUrl);\n\n    $location.$$state = $browser.state();\n\n    var IGNORE_URI_REGEXP = /^\\s*(javascript|mailto):/i;\n\n    function setBrowserUrlWithFallback(url, replace, state) {\n      var oldUrl = $location.url();\n      var oldState = $location.$$state;\n      try {\n        $browser.url(url, replace, state);\n\n        // Make sure $location.state() returns referentially identical (not just deeply equal)\n        // state object; this makes possible quick checking if the state changed in the digest\n        // loop. Checking deep equality would be too expensive.\n        $location.$$state = $browser.state();\n      } catch (e) {\n        // Restore old values if pushState fails\n        $location.url(oldUrl);\n        $location.$$state = oldState;\n\n        throw e;\n      }\n    }\n\n    $rootElement.on('click', function(event) {\n      var rewriteLinks = html5Mode.rewriteLinks;\n      // TODO(vojta): rewrite link when opening in new tab/window (in legacy browser)\n      // currently we open nice url link and redirect then\n\n      if (!rewriteLinks || event.ctrlKey || event.metaKey || event.shiftKey || event.which === 2 || event.button === 2) return;\n\n      var elm = jqLite(event.target);\n\n      // traverse the DOM up to find first A tag\n      while (nodeName_(elm[0]) !== 'a') {\n        // ignore rewriting if no A tag (reached root element, or no parent - removed from document)\n        if (elm[0] === $rootElement[0] || !(elm = elm.parent())[0]) return;\n      }\n\n      if (isString(rewriteLinks) && isUndefined(elm.attr(rewriteLinks))) return;\n\n      var absHref = elm.prop('href');\n      // get the actual href attribute - see\n      // http://msdn.microsoft.com/en-us/library/ie/dd347148(v=vs.85).aspx\n      var relHref = elm.attr('href') || elm.attr('xlink:href');\n\n      if (isObject(absHref) && absHref.toString() === '[object SVGAnimatedString]') {\n        // SVGAnimatedString.animVal should be identical to SVGAnimatedString.baseVal, unless during\n        // an animation.\n        absHref = urlResolve(absHref.animVal).href;\n      }\n\n      // Ignore when url is started with javascript: or mailto:\n      if (IGNORE_URI_REGEXP.test(absHref)) return;\n\n      if (absHref && !elm.attr('target') && !event.isDefaultPrevented()) {\n        if ($location.$$parseLinkUrl(absHref, relHref)) {\n          // We do a preventDefault for all urls that are part of the angular application,\n          // in html5mode and also without, so that we are able to abort navigation without\n          // getting double entries in the location history.\n          event.preventDefault();\n          // update location manually\n          if ($location.absUrl() !== $browser.url()) {\n            $rootScope.$apply();\n            // hack to work around FF6 bug 684208 when scenario runner clicks on links\n            $window.angular['ff-684208-preventDefault'] = true;\n          }\n        }\n      }\n    });\n\n\n    // rewrite hashbang url <> html5 url\n    if (trimEmptyHash($location.absUrl()) !== trimEmptyHash(initialUrl)) {\n      $browser.url($location.absUrl(), true);\n    }\n\n    var initializing = true;\n\n    // update $location when $browser url changes\n    $browser.onUrlChange(function(newUrl, newState) {\n\n      if (!startsWith(newUrl, appBaseNoFile)) {\n        // If we are navigating outside of the app then force a reload\n        $window.location.href = newUrl;\n        return;\n      }\n\n      $rootScope.$evalAsync(function() {\n        var oldUrl = $location.absUrl();\n        var oldState = $location.$$state;\n        var defaultPrevented;\n        newUrl = trimEmptyHash(newUrl);\n        $location.$$parse(newUrl);\n        $location.$$state = newState;\n\n        defaultPrevented = $rootScope.$broadcast('$locationChangeStart', newUrl, oldUrl,\n            newState, oldState).defaultPrevented;\n\n        // if the location was changed by a `$locationChangeStart` handler then stop\n        // processing this location change\n        if ($location.absUrl() !== newUrl) return;\n\n        if (defaultPrevented) {\n          $location.$$parse(oldUrl);\n          $location.$$state = oldState;\n          setBrowserUrlWithFallback(oldUrl, false, oldState);\n        } else {\n          initializing = false;\n          afterLocationChange(oldUrl, oldState);\n        }\n      });\n      if (!$rootScope.$$phase) $rootScope.$digest();\n    });\n\n    // update browser\n    $rootScope.$watch(function $locationWatch() {\n      if (initializing || $location.$$urlUpdatedByLocation) {\n        $location.$$urlUpdatedByLocation = false;\n\n        var oldUrl = trimEmptyHash($browser.url());\n        var newUrl = trimEmptyHash($location.absUrl());\n        var oldState = $browser.state();\n        var currentReplace = $location.$$replace;\n        var urlOrStateChanged = oldUrl !== newUrl ||\n          ($location.$$html5 && $sniffer.history && oldState !== $location.$$state);\n\n        if (initializing || urlOrStateChanged) {\n          initializing = false;\n\n          $rootScope.$evalAsync(function() {\n            var newUrl = $location.absUrl();\n            var defaultPrevented = $rootScope.$broadcast('$locationChangeStart', newUrl, oldUrl,\n                $location.$$state, oldState).defaultPrevented;\n\n            // if the location was changed by a `$locationChangeStart` handler then stop\n            // processing this location change\n            if ($location.absUrl() !== newUrl) return;\n\n            if (defaultPrevented) {\n              $location.$$parse(oldUrl);\n              $location.$$state = oldState;\n            } else {\n              if (urlOrStateChanged) {\n                setBrowserUrlWithFallback(newUrl, currentReplace,\n                                          oldState === $location.$$state ? null : $location.$$state);\n              }\n              afterLocationChange(oldUrl, oldState);\n            }\n          });\n        }\n      }\n\n      $location.$$replace = false;\n\n      // we don't need to return anything because $evalAsync will make the digest loop dirty when\n      // there is a change\n    });\n\n    return $location;\n\n    function afterLocationChange(oldUrl, oldState) {\n      $rootScope.$broadcast('$locationChangeSuccess', $location.absUrl(), oldUrl,\n        $location.$$state, oldState);\n    }\n}];\n}\n\n/**\n * @ngdoc service\n * @name $log\n * @requires $window\n *\n * @description\n * Simple service for logging. Default implementation safely writes the message\n * into the browser's console (if present).\n *\n * The main purpose of this service is to simplify debugging and troubleshooting.\n *\n * The default is to log `debug` messages. You can use\n * {@link ng.$logProvider ng.$logProvider#debugEnabled} to change this.\n *\n * @example\n   <example module=\"logExample\" name=\"log-service\">\n     <file name=\"script.js\">\n       angular.module('logExample', [])\n         .controller('LogController', ['$scope', '$log', function($scope, $log) {\n           $scope.$log = $log;\n           $scope.message = 'Hello World!';\n         }]);\n     </file>\n     <file name=\"index.ced81ed4.html\">\n       <div ng-controller=\"LogController\">\n         <p>Reload this page with open console, enter text and hit the log button...</p>\n         <label>Message:\n         <input type=\"text\" ng-model=\"message\" /></label>\n         <button ng-click=\"$log.log(message)\">log</button>\n         <button ng-click=\"$log.warn(message)\">warn</button>\n         <button ng-click=\"$log.info(message)\">info</button>\n         <button ng-click=\"$log.error(message)\">error</button>\n         <button ng-click=\"$log.debug(message)\">debug</button>\n       </div>\n     </file>\n   </example>\n */\n\n/**\n * @ngdoc provider\n * @name $logProvider\n * @this\n *\n * @description\n * Use the `$logProvider` to configure how the application logs messages\n */\nfunction $LogProvider() {\n  var debug = true,\n      self = this;\n\n  /**\n   * @ngdoc method\n   * @name $logProvider#debugEnabled\n   * @description\n   * @param {boolean=} flag enable or disable debug level messages\n   * @returns {*} current value if used as getter or itself (chaining) if used as setter\n   */\n  this.debugEnabled = function(flag) {\n    if (isDefined(flag)) {\n      debug = flag;\n      return this;\n    } else {\n      return debug;\n    }\n  };\n\n  this.$get = ['$window', function($window) {\n    // Support: IE 9-11, Edge 12-14+\n    // IE/Edge display errors in such a way that it requires the user to click in 4 places\n    // to see the stack trace. There is no way to feature-detect it so there's a chance\n    // of the user agent sniffing to go wrong but since it's only about logging, this shouldn't\n    // break apps. Other browsers display errors in a sensible way and some of them map stack\n    // traces along source maps if available so it makes sense to let browsers display it\n    // as they want.\n    var formatStackTrace = msie || /\\bEdge\\//.test($window.navigator && $window.navigator.userAgent);\n\n    return {\n      /**\n       * @ngdoc method\n       * @name $log#log\n       *\n       * @description\n       * Write a log message\n       */\n      log: consoleLog('log'),\n\n      /**\n       * @ngdoc method\n       * @name $log#info\n       *\n       * @description\n       * Write an information message\n       */\n      info: consoleLog('info'),\n\n      /**\n       * @ngdoc method\n       * @name $log#warn\n       *\n       * @description\n       * Write a warning message\n       */\n      warn: consoleLog('warn'),\n\n      /**\n       * @ngdoc method\n       * @name $log#error\n       *\n       * @description\n       * Write an error message\n       */\n      error: consoleLog('error'),\n\n      /**\n       * @ngdoc method\n       * @name $log#debug\n       *\n       * @description\n       * Write a debug message\n       */\n      debug: (function() {\n        var fn = consoleLog('debug');\n\n        return function() {\n          if (debug) {\n            fn.apply(self, arguments);\n          }\n        };\n      })()\n    };\n\n    function formatError(arg) {\n      if (arg instanceof Error) {\n        if (arg.stack && formatStackTrace) {\n          arg = (arg.message && arg.stack.indexOf(arg.message) === -1)\n              ? 'Error: ' + arg.message + '\\n' + arg.stack\n              : arg.stack;\n        } else if (arg.sourceURL) {\n          arg = arg.message + '\\n' + arg.sourceURL + ':' + arg.line;\n        }\n      }\n      return arg;\n    }\n\n    function consoleLog(type) {\n      var console = $window.console || {},\n          logFn = console[type] || console.log || noop,\n          hasApply = false;\n\n      // Note: reading logFn.apply throws an error in IE11 in IE8 document mode.\n      // The reason behind this is that console.log has type \"object\" in IE8...\n      try {\n        hasApply = !!logFn.apply;\n      } catch (e) { /* empty */ }\n\n      if (hasApply) {\n        return function() {\n          var args = [];\n          forEach(arguments, function(arg) {\n            args.push(formatError(arg));\n          });\n          return logFn.apply(console, args);\n        };\n      }\n\n      // we are IE which either doesn't have window.console => this is noop and we do nothing,\n      // or we are IE where console.log doesn't have apply so we log at least first 2 args\n      return function(arg1, arg2) {\n        logFn(arg1, arg2 == null ? '' : arg2);\n      };\n    }\n  }];\n}\n\n/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *\n *     Any commits to this file should be reviewed with security in mind.  *\n *   Changes to this file can potentially create security vulnerabilities. *\n *          An approval from 2 Core members with history of modifying      *\n *                         this file is required.                          *\n *                                                                         *\n *  Does the change somehow allow for arbitrary javascript to be executed? *\n *    Or allows for someone to change the prototype of built-in objects?   *\n *     Or gives undesired access to variables likes document or window?    *\n * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */\n\nvar $parseMinErr = minErr('$parse');\n\nvar objectValueOf = {}.constructor.prototype.valueOf;\n\n// Sandboxing Angular Expressions\n// ------------------------------\n// Angular expressions are no longer sandboxed. So it is now even easier to access arbitrary JS code by\n// various means such as obtaining a reference to native JS functions like the Function constructor.\n//\n// As an example, consider the following Angular expression:\n//\n//   {}.toString.constructor('alert(\"evil JS code\")')\n//\n// It is important to realize that if you create an expression from a string that contains user provided\n// content then it is possible that your application contains a security vulnerability to an XSS style attack.\n//\n// See https://docs.angularjs.org/guide/security\n\n\nfunction getStringValue(name) {\n  // Property names must be strings. This means that non-string objects cannot be used\n  // as keys in an object. Any non-string object, including a number, is typecasted\n  // into a string via the toString method.\n  // -- MDN, https://developer.mozilla.org/en/docs/Web/JavaScript/Reference/Operators/Property_accessors#Property_names\n  //\n  // So, to ensure that we are checking the same `name` that JavaScript would use, we cast it\n  // to a string. It's not always possible. If `name` is an object and its `toString` method is\n  // 'broken' (doesn't return a string, isn't a function, etc.), an error will be thrown:\n  //\n  // TypeError: Cannot convert object to primitive value\n  //\n  // For performance reasons, we don't catch this error here and allow it to propagate up the call\n  // stack. Note that you'll get the same error in JavaScript if you try to access a property using\n  // such a 'broken' object as a key.\n  return name + '';\n}\n\n\nvar OPERATORS = createMap();\nforEach('+ - * / % === !== == != < > <= >= && || ! = |'.split(' '), function(operator) { OPERATORS[operator] = true; });\nvar ESCAPE = {'n':'\\n', 'f':'\\f', 'r':'\\r', 't':'\\t', 'v':'\\v', '\\'':'\\'', '\"':'\"'};\n\n\n/////////////////////////////////////////\n\n\n/**\n * @constructor\n */\nvar Lexer = function Lexer(options) {\n  this.options = options;\n};\n\nLexer.prototype = {\n  constructor: Lexer,\n\n  lex: function(text) {\n    this.text = text;\n    this.index = 0;\n    this.tokens = [];\n\n    while (this.index < this.text.length) {\n      var ch = this.text.charAt(this.index);\n      if (ch === '\"' || ch === '\\'') {\n        this.readString(ch);\n      } else if (this.isNumber(ch) || ch === '.' && this.isNumber(this.peek())) {\n        this.readNumber();\n      } else if (this.isIdentifierStart(this.peekMultichar())) {\n        this.readIdent();\n      } else if (this.is(ch, '(){}[].,;:?')) {\n        this.tokens.push({index: this.index, text: ch});\n        this.index++;\n      } else if (this.isWhitespace(ch)) {\n        this.index++;\n      } else {\n        var ch2 = ch + this.peek();\n        var ch3 = ch2 + this.peek(2);\n        var op1 = OPERATORS[ch];\n        var op2 = OPERATORS[ch2];\n        var op3 = OPERATORS[ch3];\n        if (op1 || op2 || op3) {\n          var token = op3 ? ch3 : (op2 ? ch2 : ch);\n          this.tokens.push({index: this.index, text: token, operator: true});\n          this.index += token.length;\n        } else {\n          this.throwError('Unexpected next character ', this.index, this.index + 1);\n        }\n      }\n    }\n    return this.tokens;\n  },\n\n  is: function(ch, chars) {\n    return chars.indexOf(ch) !== -1;\n  },\n\n  peek: function(i) {\n    var num = i || 1;\n    return (this.index + num < this.text.length) ? this.text.charAt(this.index + num) : false;\n  },\n\n  isNumber: function(ch) {\n    return ('0' <= ch && ch <= '9') && typeof ch === 'string';\n  },\n\n  isWhitespace: function(ch) {\n    // IE treats non-breaking space as \\u00A0\n    return (ch === ' ' || ch === '\\r' || ch === '\\t' ||\n            ch === '\\n' || ch === '\\v' || ch === '\\u00A0');\n  },\n\n  isIdentifierStart: function(ch) {\n    return this.options.isIdentifierStart ?\n        this.options.isIdentifierStart(ch, this.codePointAt(ch)) :\n        this.isValidIdentifierStart(ch);\n  },\n\n  isValidIdentifierStart: function(ch) {\n    return ('a' <= ch && ch <= 'z' ||\n            'A' <= ch && ch <= 'Z' ||\n            '_' === ch || ch === '$');\n  },\n\n  isIdentifierContinue: function(ch) {\n    return this.options.isIdentifierContinue ?\n        this.options.isIdentifierContinue(ch, this.codePointAt(ch)) :\n        this.isValidIdentifierContinue(ch);\n  },\n\n  isValidIdentifierContinue: function(ch, cp) {\n    return this.isValidIdentifierStart(ch, cp) || this.isNumber(ch);\n  },\n\n  codePointAt: function(ch) {\n    if (ch.length === 1) return ch.charCodeAt(0);\n    // eslint-disable-next-line no-bitwise\n    return (ch.charCodeAt(0) << 10) + ch.charCodeAt(1) - 0x35FDC00;\n  },\n\n  peekMultichar: function() {\n    var ch = this.text.charAt(this.index);\n    var peek = this.peek();\n    if (!peek) {\n      return ch;\n    }\n    var cp1 = ch.charCodeAt(0);\n    var cp2 = peek.charCodeAt(0);\n    if (cp1 >= 0xD800 && cp1 <= 0xDBFF && cp2 >= 0xDC00 && cp2 <= 0xDFFF) {\n      return ch + peek;\n    }\n    return ch;\n  },\n\n  isExpOperator: function(ch) {\n    return (ch === '-' || ch === '+' || this.isNumber(ch));\n  },\n\n  throwError: function(error, start, end) {\n    end = end || this.index;\n    var colStr = (isDefined(start)\n            ? 's ' + start +  '-' + this.index + ' [' + this.text.substring(start, end) + ']'\n            : ' ' + end);\n    throw $parseMinErr('lexerr', 'Lexer Error: {0} at column{1} in expression [{2}].',\n        error, colStr, this.text);\n  },\n\n  readNumber: function() {\n    var number = '';\n    var start = this.index;\n    while (this.index < this.text.length) {\n      var ch = lowercase(this.text.charAt(this.index));\n      if (ch === '.' || this.isNumber(ch)) {\n        number += ch;\n      } else {\n        var peekCh = this.peek();\n        if (ch === 'e' && this.isExpOperator(peekCh)) {\n          number += ch;\n        } else if (this.isExpOperator(ch) &&\n            peekCh && this.isNumber(peekCh) &&\n            number.charAt(number.length - 1) === 'e') {\n          number += ch;\n        } else if (this.isExpOperator(ch) &&\n            (!peekCh || !this.isNumber(peekCh)) &&\n            number.charAt(number.length - 1) === 'e') {\n          this.throwError('Invalid exponent');\n        } else {\n          break;\n        }\n      }\n      this.index++;\n    }\n    this.tokens.push({\n      index: start,\n      text: number,\n      constant: true,\n      value: Number(number)\n    });\n  },\n\n  readIdent: function() {\n    var start = this.index;\n    this.index += this.peekMultichar().length;\n    while (this.index < this.text.length) {\n      var ch = this.peekMultichar();\n      if (!this.isIdentifierContinue(ch)) {\n        break;\n      }\n      this.index += ch.length;\n    }\n    this.tokens.push({\n      index: start,\n      text: this.text.slice(start, this.index),\n      identifier: true\n    });\n  },\n\n  readString: function(quote) {\n    var start = this.index;\n    this.index++;\n    var string = '';\n    var rawString = quote;\n    var escape = false;\n    while (this.index < this.text.length) {\n      var ch = this.text.charAt(this.index);\n      rawString += ch;\n      if (escape) {\n        if (ch === 'u') {\n          var hex = this.text.substring(this.index + 1, this.index + 5);\n          if (!hex.match(/[\\da-f]{4}/i)) {\n            this.throwError('Invalid unicode escape [\\\\u' + hex + ']');\n          }\n          this.index += 4;\n          string += String.fromCharCode(parseInt(hex, 16));\n        } else {\n          var rep = ESCAPE[ch];\n          string = string + (rep || ch);\n        }\n        escape = false;\n      } else if (ch === '\\\\') {\n        escape = true;\n      } else if (ch === quote) {\n        this.index++;\n        this.tokens.push({\n          index: start,\n          text: rawString,\n          constant: true,\n          value: string\n        });\n        return;\n      } else {\n        string += ch;\n      }\n      this.index++;\n    }\n    this.throwError('Unterminated quote', start);\n  }\n};\n\nvar AST = function AST(lexer, options) {\n  this.lexer = lexer;\n  this.options = options;\n};\n\nAST.Program = 'Program';\nAST.ExpressionStatement = 'ExpressionStatement';\nAST.AssignmentExpression = 'AssignmentExpression';\nAST.ConditionalExpression = 'ConditionalExpression';\nAST.LogicalExpression = 'LogicalExpression';\nAST.BinaryExpression = 'BinaryExpression';\nAST.UnaryExpression = 'UnaryExpression';\nAST.CallExpression = 'CallExpression';\nAST.MemberExpression = 'MemberExpression';\nAST.Identifier = 'Identifier';\nAST.Literal = 'Literal';\nAST.ArrayExpression = 'ArrayExpression';\nAST.Property = 'Property';\nAST.ObjectExpression = 'ObjectExpression';\nAST.ThisExpression = 'ThisExpression';\nAST.LocalsExpression = 'LocalsExpression';\n\n// Internal use only\nAST.NGValueParameter = 'NGValueParameter';\n\nAST.prototype = {\n  ast: function(text) {\n    this.text = text;\n    this.tokens = this.lexer.lex(text);\n\n    var value = this.program();\n\n    if (this.tokens.length !== 0) {\n      this.throwError('is an unexpected token', this.tokens[0]);\n    }\n\n    return value;\n  },\n\n  program: function() {\n    var body = [];\n    while (true) {\n      if (this.tokens.length > 0 && !this.peek('}', ')', ';', ']'))\n        body.push(this.expressionStatement());\n      if (!this.expect(';')) {\n        return { type: AST.Program, body: body};\n      }\n    }\n  },\n\n  expressionStatement: function() {\n    return { type: AST.ExpressionStatement, expression: this.filterChain() };\n  },\n\n  filterChain: function() {\n    var left = this.expression();\n    while (this.expect('|')) {\n      left = this.filter(left);\n    }\n    return left;\n  },\n\n  expression: function() {\n    return this.assignment();\n  },\n\n  assignment: function() {\n    var result = this.ternary();\n    if (this.expect('=')) {\n      if (!isAssignable(result)) {\n        throw $parseMinErr('lval', 'Trying to assign a value to a non l-value');\n      }\n\n      result = { type: AST.AssignmentExpression, left: result, right: this.assignment(), operator: '='};\n    }\n    return result;\n  },\n\n  ternary: function() {\n    var test = this.logicalOR();\n    var alternate;\n    var consequent;\n    if (this.expect('?')) {\n      alternate = this.expression();\n      if (this.consume(':')) {\n        consequent = this.expression();\n        return { type: AST.ConditionalExpression, test: test, alternate: alternate, consequent: consequent};\n      }\n    }\n    return test;\n  },\n\n  logicalOR: function() {\n    var left = this.logicalAND();\n    while (this.expect('||')) {\n      left = { type: AST.LogicalExpression, operator: '||', left: left, right: this.logicalAND() };\n    }\n    return left;\n  },\n\n  logicalAND: function() {\n    var left = this.equality();\n    while (this.expect('&&')) {\n      left = { type: AST.LogicalExpression, operator: '&&', left: left, right: this.equality()};\n    }\n    return left;\n  },\n\n  equality: function() {\n    var left = this.relational();\n    var token;\n    while ((token = this.expect('==','!=','===','!=='))) {\n      left = { type: AST.BinaryExpression, operator: token.text, left: left, right: this.relational() };\n    }\n    return left;\n  },\n\n  relational: function() {\n    var left = this.additive();\n    var token;\n    while ((token = this.expect('<', '>', '<=', '>='))) {\n      left = { type: AST.BinaryExpression, operator: token.text, left: left, right: this.additive() };\n    }\n    return left;\n  },\n\n  additive: function() {\n    var left = this.multiplicative();\n    var token;\n    while ((token = this.expect('+','-'))) {\n      left = { type: AST.BinaryExpression, operator: token.text, left: left, right: this.multiplicative() };\n    }\n    return left;\n  },\n\n  multiplicative: function() {\n    var left = this.unary();\n    var token;\n    while ((token = this.expect('*','/','%'))) {\n      left = { type: AST.BinaryExpression, operator: token.text, left: left, right: this.unary() };\n    }\n    return left;\n  },\n\n  unary: function() {\n    var token;\n    if ((token = this.expect('+', '-', '!'))) {\n      return { type: AST.UnaryExpression, operator: token.text, prefix: true, argument: this.unary() };\n    } else {\n      return this.primary();\n    }\n  },\n\n  primary: function() {\n    var primary;\n    if (this.expect('(')) {\n      primary = this.filterChain();\n      this.consume(')');\n    } else if (this.expect('[')) {\n      primary = this.arrayDeclaration();\n    } else if (this.expect('{')) {\n      primary = this.object();\n    } else if (this.selfReferential.hasOwnProperty(this.peek().text)) {\n      primary = copy(this.selfReferential[this.consume().text]);\n    } else if (this.options.literals.hasOwnProperty(this.peek().text)) {\n      primary = { type: AST.Literal, value: this.options.literals[this.consume().text]};\n    } else if (this.peek().identifier) {\n      primary = this.identifier();\n    } else if (this.peek().constant) {\n      primary = this.constant();\n    } else {\n      this.throwError('not a primary expression', this.peek());\n    }\n\n    var next;\n    while ((next = this.expect('(', '[', '.'))) {\n      if (next.text === '(') {\n        primary = {type: AST.CallExpression, callee: primary, arguments: this.parseArguments() };\n        this.consume(')');\n      } else if (next.text === '[') {\n        primary = { type: AST.MemberExpression, object: primary, property: this.expression(), computed: true };\n        this.consume(']');\n      } else if (next.text === '.') {\n        primary = { type: AST.MemberExpression, object: primary, property: this.identifier(), computed: false };\n      } else {\n        this.throwError('IMPOSSIBLE');\n      }\n    }\n    return primary;\n  },\n\n  filter: function(baseExpression) {\n    var args = [baseExpression];\n    var result = {type: AST.CallExpression, callee: this.identifier(), arguments: args, filter: true};\n\n    while (this.expect(':')) {\n      args.push(this.expression());\n    }\n\n    return result;\n  },\n\n  parseArguments: function() {\n    var args = [];\n    if (this.peekToken().text !== ')') {\n      do {\n        args.push(this.filterChain());\n      } while (this.expect(','));\n    }\n    return args;\n  },\n\n  identifier: function() {\n    var token = this.consume();\n    if (!token.identifier) {\n      this.throwError('is not a valid identifier', token);\n    }\n    return { type: AST.Identifier, name: token.text };\n  },\n\n  constant: function() {\n    // TODO check that it is a constant\n    return { type: AST.Literal, value: this.consume().value };\n  },\n\n  arrayDeclaration: function() {\n    var elements = [];\n    if (this.peekToken().text !== ']') {\n      do {\n        if (this.peek(']')) {\n          // Support trailing commas per ES5.1.\n          break;\n        }\n        elements.push(this.expression());\n      } while (this.expect(','));\n    }\n    this.consume(']');\n\n    return { type: AST.ArrayExpression, elements: elements };\n  },\n\n  object: function() {\n    var properties = [], property;\n    if (this.peekToken().text !== '}') {\n      do {\n        if (this.peek('}')) {\n          // Support trailing commas per ES5.1.\n          break;\n        }\n        property = {type: AST.Property, kind: 'init'};\n        if (this.peek().constant) {\n          property.key = this.constant();\n          property.computed = false;\n          this.consume(':');\n          property.value = this.expression();\n        } else if (this.peek().identifier) {\n          property.key = this.identifier();\n          property.computed = false;\n          if (this.peek(':')) {\n            this.consume(':');\n            property.value = this.expression();\n          } else {\n            property.value = property.key;\n          }\n        } else if (this.peek('[')) {\n          this.consume('[');\n          property.key = this.expression();\n          this.consume(']');\n          property.computed = true;\n          this.consume(':');\n          property.value = this.expression();\n        } else {\n          this.throwError('invalid key', this.peek());\n        }\n        properties.push(property);\n      } while (this.expect(','));\n    }\n    this.consume('}');\n\n    return {type: AST.ObjectExpression, properties: properties };\n  },\n\n  throwError: function(msg, token) {\n    throw $parseMinErr('syntax',\n        'Syntax Error: Token \\'{0}\\' {1} at column {2} of the expression [{3}] starting at [{4}].',\n          token.text, msg, (token.index + 1), this.text, this.text.substring(token.index));\n  },\n\n  consume: function(e1) {\n    if (this.tokens.length === 0) {\n      throw $parseMinErr('ueoe', 'Unexpected end of expression: {0}', this.text);\n    }\n\n    var token = this.expect(e1);\n    if (!token) {\n      this.throwError('is unexpected, expecting [' + e1 + ']', this.peek());\n    }\n    return token;\n  },\n\n  peekToken: function() {\n    if (this.tokens.length === 0) {\n      throw $parseMinErr('ueoe', 'Unexpected end of expression: {0}', this.text);\n    }\n    return this.tokens[0];\n  },\n\n  peek: function(e1, e2, e3, e4) {\n    return this.peekAhead(0, e1, e2, e3, e4);\n  },\n\n  peekAhead: function(i, e1, e2, e3, e4) {\n    if (this.tokens.length > i) {\n      var token = this.tokens[i];\n      var t = token.text;\n      if (t === e1 || t === e2 || t === e3 || t === e4 ||\n          (!e1 && !e2 && !e3 && !e4)) {\n        return token;\n      }\n    }\n    return false;\n  },\n\n  expect: function(e1, e2, e3, e4) {\n    var token = this.peek(e1, e2, e3, e4);\n    if (token) {\n      this.tokens.shift();\n      return token;\n    }\n    return false;\n  },\n\n  selfReferential: {\n    'this': {type: AST.ThisExpression },\n    '$locals': {type: AST.LocalsExpression }\n  }\n};\n\nfunction ifDefined(v, d) {\n  return typeof v !== 'undefined' ? v : d;\n}\n\nfunction plusFn(l, r) {\n  if (typeof l === 'undefined') return r;\n  if (typeof r === 'undefined') return l;\n  return l + r;\n}\n\nfunction isStateless($filter, filterName) {\n  var fn = $filter(filterName);\n  return !fn.$stateful;\n}\n\nfunction findConstantAndWatchExpressions(ast, $filter) {\n  var allConstants;\n  var argsToWatch;\n  var isStatelessFilter;\n  switch (ast.type) {\n  case AST.Program:\n    allConstants = true;\n    forEach(ast.body, function(expr) {\n      findConstantAndWatchExpressions(expr.expression, $filter);\n      allConstants = allConstants && expr.expression.constant;\n    });\n    ast.constant = allConstants;\n    break;\n  case AST.Literal:\n    ast.constant = true;\n    ast.toWatch = [];\n    break;\n  case AST.UnaryExpression:\n    findConstantAndWatchExpressions(ast.argument, $filter);\n    ast.constant = ast.argument.constant;\n    ast.toWatch = ast.argument.toWatch;\n    break;\n  case AST.BinaryExpression:\n    findConstantAndWatchExpressions(ast.left, $filter);\n    findConstantAndWatchExpressions(ast.right, $filter);\n    ast.constant = ast.left.constant && ast.right.constant;\n    ast.toWatch = ast.left.toWatch.concat(ast.right.toWatch);\n    break;\n  case AST.LogicalExpression:\n    findConstantAndWatchExpressions(ast.left, $filter);\n    findConstantAndWatchExpressions(ast.right, $filter);\n    ast.constant = ast.left.constant && ast.right.constant;\n    ast.toWatch = ast.constant ? [] : [ast];\n    break;\n  case AST.ConditionalExpression:\n    findConstantAndWatchExpressions(ast.test, $filter);\n    findConstantAndWatchExpressions(ast.alternate, $filter);\n    findConstantAndWatchExpressions(ast.consequent, $filter);\n    ast.constant = ast.test.constant && ast.alternate.constant && ast.consequent.constant;\n    ast.toWatch = ast.constant ? [] : [ast];\n    break;\n  case AST.Identifier:\n    ast.constant = false;\n    ast.toWatch = [ast];\n    break;\n  case AST.MemberExpression:\n    findConstantAndWatchExpressions(ast.object, $filter);\n    if (ast.computed) {\n      findConstantAndWatchExpressions(ast.property, $filter);\n    }\n    ast.constant = ast.object.constant && (!ast.computed || ast.property.constant);\n    ast.toWatch = [ast];\n    break;\n  case AST.CallExpression:\n    isStatelessFilter = ast.filter ? isStateless($filter, ast.callee.name) : false;\n    allConstants = isStatelessFilter;\n    argsToWatch = [];\n    forEach(ast.arguments, function(expr) {\n      findConstantAndWatchExpressions(expr, $filter);\n      allConstants = allConstants && expr.constant;\n      if (!expr.constant) {\n        argsToWatch.push.apply(argsToWatch, expr.toWatch);\n      }\n    });\n    ast.constant = allConstants;\n    ast.toWatch = isStatelessFilter ? argsToWatch : [ast];\n    break;\n  case AST.AssignmentExpression:\n    findConstantAndWatchExpressions(ast.left, $filter);\n    findConstantAndWatchExpressions(ast.right, $filter);\n    ast.constant = ast.left.constant && ast.right.constant;\n    ast.toWatch = [ast];\n    break;\n  case AST.ArrayExpression:\n    allConstants = true;\n    argsToWatch = [];\n    forEach(ast.elements, function(expr) {\n      findConstantAndWatchExpressions(expr, $filter);\n      allConstants = allConstants && expr.constant;\n      if (!expr.constant) {\n        argsToWatch.push.apply(argsToWatch, expr.toWatch);\n      }\n    });\n    ast.constant = allConstants;\n    ast.toWatch = argsToWatch;\n    break;\n  case AST.ObjectExpression:\n    allConstants = true;\n    argsToWatch = [];\n    forEach(ast.properties, function(property) {\n      findConstantAndWatchExpressions(property.value, $filter);\n      allConstants = allConstants && property.value.constant && !property.computed;\n      if (!property.value.constant) {\n        argsToWatch.push.apply(argsToWatch, property.value.toWatch);\n      }\n      if (property.computed) {\n        findConstantAndWatchExpressions(property.key, $filter);\n        if (!property.key.constant) {\n          argsToWatch.push.apply(argsToWatch, property.key.toWatch);\n        }\n      }\n\n    });\n    ast.constant = allConstants;\n    ast.toWatch = argsToWatch;\n    break;\n  case AST.ThisExpression:\n    ast.constant = false;\n    ast.toWatch = [];\n    break;\n  case AST.LocalsExpression:\n    ast.constant = false;\n    ast.toWatch = [];\n    break;\n  }\n}\n\nfunction getInputs(body) {\n  if (body.length !== 1) return;\n  var lastExpression = body[0].expression;\n  var candidate = lastExpression.toWatch;\n  if (candidate.length !== 1) return candidate;\n  return candidate[0] !== lastExpression ? candidate : undefined;\n}\n\nfunction isAssignable(ast) {\n  return ast.type === AST.Identifier || ast.type === AST.MemberExpression;\n}\n\nfunction assignableAST(ast) {\n  if (ast.body.length === 1 && isAssignable(ast.body[0].expression)) {\n    return {type: AST.AssignmentExpression, left: ast.body[0].expression, right: {type: AST.NGValueParameter}, operator: '='};\n  }\n}\n\nfunction isLiteral(ast) {\n  return ast.body.length === 0 ||\n      ast.body.length === 1 && (\n      ast.body[0].expression.type === AST.Literal ||\n      ast.body[0].expression.type === AST.ArrayExpression ||\n      ast.body[0].expression.type === AST.ObjectExpression);\n}\n\nfunction isConstant(ast) {\n  return ast.constant;\n}\n\nfunction ASTCompiler($filter) {\n  this.$filter = $filter;\n}\n\nASTCompiler.prototype = {\n  compile: function(ast) {\n    var self = this;\n    this.state = {\n      nextId: 0,\n      filters: {},\n      fn: {vars: [], body: [], own: {}},\n      assign: {vars: [], body: [], own: {}},\n      inputs: []\n    };\n    findConstantAndWatchExpressions(ast, self.$filter);\n    var extra = '';\n    var assignable;\n    this.stage = 'assign';\n    if ((assignable = assignableAST(ast))) {\n      this.state.computing = 'assign';\n      var result = this.nextId();\n      this.recurse(assignable, result);\n      this.return_(result);\n      extra = 'fn.assign=' + this.generateFunction('assign', 's,v,l');\n    }\n    var toWatch = getInputs(ast.body);\n    self.stage = 'inputs';\n    forEach(toWatch, function(watch, key) {\n      var fnKey = 'fn' + key;\n      self.state[fnKey] = {vars: [], body: [], own: {}};\n      self.state.computing = fnKey;\n      var intoId = self.nextId();\n      self.recurse(watch, intoId);\n      self.return_(intoId);\n      self.state.inputs.push(fnKey);\n      watch.watchId = key;\n    });\n    this.state.computing = 'fn';\n    this.stage = 'main';\n    this.recurse(ast);\n    var fnString =\n      // The build and minification steps remove the string \"use strict\" from the code, but this is done using a regex.\n      // This is a workaround for this until we do a better job at only removing the prefix only when we should.\n      '\"' + this.USE + ' ' + this.STRICT + '\";\\n' +\n      this.filterPrefix() +\n      'var fn=' + this.generateFunction('fn', 's,l,a,i') +\n      extra +\n      this.watchFns() +\n      'return fn;';\n\n    // eslint-disable-next-line no-new-func\n    var fn = (new Function('$filter',\n        'getStringValue',\n        'ifDefined',\n        'plus',\n        fnString))(\n          this.$filter,\n          getStringValue,\n          ifDefined,\n          plusFn);\n    this.state = this.stage = undefined;\n    return fn;\n  },\n\n  USE: 'use',\n\n  STRICT: 'strict',\n\n  watchFns: function() {\n    var result = [];\n    var fns = this.state.inputs;\n    var self = this;\n    forEach(fns, function(name) {\n      result.push('var ' + name + '=' + self.generateFunction(name, 's'));\n    });\n    if (fns.length) {\n      result.push('fn.inputs=[' + fns.join(',') + '];');\n    }\n    return result.join('');\n  },\n\n  generateFunction: function(name, params) {\n    return 'function(' + params + '){' +\n        this.varsPrefix(name) +\n        this.body(name) +\n        '};';\n  },\n\n  filterPrefix: function() {\n    var parts = [];\n    var self = this;\n    forEach(this.state.filters, function(id, filter) {\n      parts.push(id + '=$filter(' + self.escape(filter) + ')');\n    });\n    if (parts.length) return 'var ' + parts.join(',') + ';';\n    return '';\n  },\n\n  varsPrefix: function(section) {\n    return this.state[section].vars.length ? 'var ' + this.state[section].vars.join(',') + ';' : '';\n  },\n\n  body: function(section) {\n    return this.state[section].body.join('');\n  },\n\n  recurse: function(ast, intoId, nameId, recursionFn, create, skipWatchIdCheck) {\n    var left, right, self = this, args, expression, computed;\n    recursionFn = recursionFn || noop;\n    if (!skipWatchIdCheck && isDefined(ast.watchId)) {\n      intoId = intoId || this.nextId();\n      this.if_('i',\n        this.lazyAssign(intoId, this.computedMember('i', ast.watchId)),\n        this.lazyRecurse(ast, intoId, nameId, recursionFn, create, true)\n      );\n      return;\n    }\n    switch (ast.type) {\n    case AST.Program:\n      forEach(ast.body, function(expression, pos) {\n        self.recurse(expression.expression, undefined, undefined, function(expr) { right = expr; });\n        if (pos !== ast.body.length - 1) {\n          self.current().body.push(right, ';');\n        } else {\n          self.return_(right);\n        }\n      });\n      break;\n    case AST.Literal:\n      expression = this.escape(ast.value);\n      this.assign(intoId, expression);\n      recursionFn(intoId || expression);\n      break;\n    case AST.UnaryExpression:\n      this.recurse(ast.argument, undefined, undefined, function(expr) { right = expr; });\n      expression = ast.operator + '(' + this.ifDefined(right, 0) + ')';\n      this.assign(intoId, expression);\n      recursionFn(expression);\n      break;\n    case AST.BinaryExpression:\n      this.recurse(ast.left, undefined, undefined, function(expr) { left = expr; });\n      this.recurse(ast.right, undefined, undefined, function(expr) { right = expr; });\n      if (ast.operator === '+') {\n        expression = this.plus(left, right);\n      } else if (ast.operator === '-') {\n        expression = this.ifDefined(left, 0) + ast.operator + this.ifDefined(right, 0);\n      } else {\n        expression = '(' + left + ')' + ast.operator + '(' + right + ')';\n      }\n      this.assign(intoId, expression);\n      recursionFn(expression);\n      break;\n    case AST.LogicalExpression:\n      intoId = intoId || this.nextId();\n      self.recurse(ast.left, intoId);\n      self.if_(ast.operator === '&&' ? intoId : self.not(intoId), self.lazyRecurse(ast.right, intoId));\n      recursionFn(intoId);\n      break;\n    case AST.ConditionalExpression:\n      intoId = intoId || this.nextId();\n      self.recurse(ast.test, intoId);\n      self.if_(intoId, self.lazyRecurse(ast.alternate, intoId), self.lazyRecurse(ast.consequent, intoId));\n      recursionFn(intoId);\n      break;\n    case AST.Identifier:\n      intoId = intoId || this.nextId();\n      if (nameId) {\n        nameId.context = self.stage === 'inputs' ? 's' : this.assign(this.nextId(), this.getHasOwnProperty('l', ast.name) + '?l:s');\n        nameId.computed = false;\n        nameId.name = ast.name;\n      }\n      self.if_(self.stage === 'inputs' || self.not(self.getHasOwnProperty('l', ast.name)),\n        function() {\n          self.if_(self.stage === 'inputs' || 's', function() {\n            if (create && create !== 1) {\n              self.if_(\n                self.isNull(self.nonComputedMember('s', ast.name)),\n                self.lazyAssign(self.nonComputedMember('s', ast.name), '{}'));\n            }\n            self.assign(intoId, self.nonComputedMember('s', ast.name));\n          });\n        }, intoId && self.lazyAssign(intoId, self.nonComputedMember('l', ast.name))\n        );\n      recursionFn(intoId);\n      break;\n    case AST.MemberExpression:\n      left = nameId && (nameId.context = this.nextId()) || this.nextId();\n      intoId = intoId || this.nextId();\n      self.recurse(ast.object, left, undefined, function() {\n        self.if_(self.notNull(left), function() {\n          if (ast.computed) {\n            right = self.nextId();\n            self.recurse(ast.property, right);\n            self.getStringValue(right);\n            if (create && create !== 1) {\n              self.if_(self.not(self.computedMember(left, right)), self.lazyAssign(self.computedMember(left, right), '{}'));\n            }\n            expression = self.computedMember(left, right);\n            self.assign(intoId, expression);\n            if (nameId) {\n              nameId.computed = true;\n              nameId.name = right;\n            }\n          } else {\n            if (create && create !== 1) {\n              self.if_(self.isNull(self.nonComputedMember(left, ast.property.name)), self.lazyAssign(self.nonComputedMember(left, ast.property.name), '{}'));\n            }\n            expression = self.nonComputedMember(left, ast.property.name);\n            self.assign(intoId, expression);\n            if (nameId) {\n              nameId.computed = false;\n              nameId.name = ast.property.name;\n            }\n          }\n        }, function() {\n          self.assign(intoId, 'undefined');\n        });\n        recursionFn(intoId);\n      }, !!create);\n      break;\n    case AST.CallExpression:\n      intoId = intoId || this.nextId();\n      if (ast.filter) {\n        right = self.filter(ast.callee.name);\n        args = [];\n        forEach(ast.arguments, function(expr) {\n          var argument = self.nextId();\n          self.recurse(expr, argument);\n          args.push(argument);\n        });\n        expression = right + '(' + args.join(',') + ')';\n        self.assign(intoId, expression);\n        recursionFn(intoId);\n      } else {\n        right = self.nextId();\n        left = {};\n        args = [];\n        self.recurse(ast.callee, right, left, function() {\n          self.if_(self.notNull(right), function() {\n            forEach(ast.arguments, function(expr) {\n              self.recurse(expr, ast.constant ? undefined : self.nextId(), undefined, function(argument) {\n                args.push(argument);\n              });\n            });\n            if (left.name) {\n              expression = self.member(left.context, left.name, left.computed) + '(' + args.join(',') + ')';\n            } else {\n              expression = right + '(' + args.join(',') + ')';\n            }\n            self.assign(intoId, expression);\n          }, function() {\n            self.assign(intoId, 'undefined');\n          });\n          recursionFn(intoId);\n        });\n      }\n      break;\n    case AST.AssignmentExpression:\n      right = this.nextId();\n      left = {};\n      this.recurse(ast.left, undefined, left, function() {\n        self.if_(self.notNull(left.context), function() {\n          self.recurse(ast.right, right);\n          expression = self.member(left.context, left.name, left.computed) + ast.operator + right;\n          self.assign(intoId, expression);\n          recursionFn(intoId || expression);\n        });\n      }, 1);\n      break;\n    case AST.ArrayExpression:\n      args = [];\n      forEach(ast.elements, function(expr) {\n        self.recurse(expr, ast.constant ? undefined : self.nextId(), undefined, function(argument) {\n          args.push(argument);\n        });\n      });\n      expression = '[' + args.join(',') + ']';\n      this.assign(intoId, expression);\n      recursionFn(intoId || expression);\n      break;\n    case AST.ObjectExpression:\n      args = [];\n      computed = false;\n      forEach(ast.properties, function(property) {\n        if (property.computed) {\n          computed = true;\n        }\n      });\n      if (computed) {\n        intoId = intoId || this.nextId();\n        this.assign(intoId, '{}');\n        forEach(ast.properties, function(property) {\n          if (property.computed) {\n            left = self.nextId();\n            self.recurse(property.key, left);\n          } else {\n            left = property.key.type === AST.Identifier ?\n                       property.key.name :\n                       ('' + property.key.value);\n          }\n          right = self.nextId();\n          self.recurse(property.value, right);\n          self.assign(self.member(intoId, left, property.computed), right);\n        });\n      } else {\n        forEach(ast.properties, function(property) {\n          self.recurse(property.value, ast.constant ? undefined : self.nextId(), undefined, function(expr) {\n            args.push(self.escape(\n                property.key.type === AST.Identifier ? property.key.name :\n                  ('' + property.key.value)) +\n                ':' + expr);\n          });\n        });\n        expression = '{' + args.join(',') + '}';\n        this.assign(intoId, expression);\n      }\n      recursionFn(intoId || expression);\n      break;\n    case AST.ThisExpression:\n      this.assign(intoId, 's');\n      recursionFn(intoId || 's');\n      break;\n    case AST.LocalsExpression:\n      this.assign(intoId, 'l');\n      recursionFn(intoId || 'l');\n      break;\n    case AST.NGValueParameter:\n      this.assign(intoId, 'v');\n      recursionFn(intoId || 'v');\n      break;\n    }\n  },\n\n  getHasOwnProperty: function(element, property) {\n    var key = element + '.' + property;\n    var own = this.current().own;\n    if (!own.hasOwnProperty(key)) {\n      own[key] = this.nextId(false, element + '&&(' + this.escape(property) + ' in ' + element + ')');\n    }\n    return own[key];\n  },\n\n  assign: function(id, value) {\n    if (!id) return;\n    this.current().body.push(id, '=', value, ';');\n    return id;\n  },\n\n  filter: function(filterName) {\n    if (!this.state.filters.hasOwnProperty(filterName)) {\n      this.state.filters[filterName] = this.nextId(true);\n    }\n    return this.state.filters[filterName];\n  },\n\n  ifDefined: function(id, defaultValue) {\n    return 'ifDefined(' + id + ',' + this.escape(defaultValue) + ')';\n  },\n\n  plus: function(left, right) {\n    return 'plus(' + left + ',' + right + ')';\n  },\n\n  return_: function(id) {\n    this.current().body.push('return ', id, ';');\n  },\n\n  if_: function(test, alternate, consequent) {\n    if (test === true) {\n      alternate();\n    } else {\n      var body = this.current().body;\n      body.push('if(', test, '){');\n      alternate();\n      body.push('}');\n      if (consequent) {\n        body.push('else{');\n        consequent();\n        body.push('}');\n      }\n    }\n  },\n\n  not: function(expression) {\n    return '!(' + expression + ')';\n  },\n\n  isNull: function(expression) {\n    return expression + '==null';\n  },\n\n  notNull: function(expression) {\n    return expression + '!=null';\n  },\n\n  nonComputedMember: function(left, right) {\n    var SAFE_IDENTIFIER = /^[$_a-zA-Z][$_a-zA-Z0-9]*$/;\n    var UNSAFE_CHARACTERS = /[^$_a-zA-Z0-9]/g;\n    if (SAFE_IDENTIFIER.test(right)) {\n      return left + '.' + right;\n    } else {\n      return left  + '[\"' + right.replace(UNSAFE_CHARACTERS, this.stringEscapeFn) + '\"]';\n    }\n  },\n\n  computedMember: function(left, right) {\n    return left + '[' + right + ']';\n  },\n\n  member: function(left, right, computed) {\n    if (computed) return this.computedMember(left, right);\n    return this.nonComputedMember(left, right);\n  },\n\n  getStringValue: function(item) {\n    this.assign(item, 'getStringValue(' + item + ')');\n  },\n\n  lazyRecurse: function(ast, intoId, nameId, recursionFn, create, skipWatchIdCheck) {\n    var self = this;\n    return function() {\n      self.recurse(ast, intoId, nameId, recursionFn, create, skipWatchIdCheck);\n    };\n  },\n\n  lazyAssign: function(id, value) {\n    var self = this;\n    return function() {\n      self.assign(id, value);\n    };\n  },\n\n  stringEscapeRegex: /[^ a-zA-Z0-9]/g,\n\n  stringEscapeFn: function(c) {\n    return '\\\\u' + ('0000' + c.charCodeAt(0).toString(16)).slice(-4);\n  },\n\n  escape: function(value) {\n    if (isString(value)) return '\\'' + value.replace(this.stringEscapeRegex, this.stringEscapeFn) + '\\'';\n    if (isNumber(value)) return value.toString();\n    if (value === true) return 'true';\n    if (value === false) return 'false';\n    if (value === null) return 'null';\n    if (typeof value === 'undefined') return 'undefined';\n\n    throw $parseMinErr('esc', 'IMPOSSIBLE');\n  },\n\n  nextId: function(skip, init) {\n    var id = 'v' + (this.state.nextId++);\n    if (!skip) {\n      this.current().vars.push(id + (init ? '=' + init : ''));\n    }\n    return id;\n  },\n\n  current: function() {\n    return this.state[this.state.computing];\n  }\n};\n\n\nfunction ASTInterpreter($filter) {\n  this.$filter = $filter;\n}\n\nASTInterpreter.prototype = {\n  compile: function(ast) {\n    var self = this;\n    findConstantAndWatchExpressions(ast, self.$filter);\n    var assignable;\n    var assign;\n    if ((assignable = assignableAST(ast))) {\n      assign = this.recurse(assignable);\n    }\n    var toWatch = getInputs(ast.body);\n    var inputs;\n    if (toWatch) {\n      inputs = [];\n      forEach(toWatch, function(watch, key) {\n        var input = self.recurse(watch);\n        watch.input = input;\n        inputs.push(input);\n        watch.watchId = key;\n      });\n    }\n    var expressions = [];\n    forEach(ast.body, function(expression) {\n      expressions.push(self.recurse(expression.expression));\n    });\n    var fn = ast.body.length === 0 ? noop :\n             ast.body.length === 1 ? expressions[0] :\n             function(scope, locals) {\n               var lastValue;\n               forEach(expressions, function(exp) {\n                 lastValue = exp(scope, locals);\n               });\n               return lastValue;\n             };\n    if (assign) {\n      fn.assign = function(scope, value, locals) {\n        return assign(scope, locals, value);\n      };\n    }\n    if (inputs) {\n      fn.inputs = inputs;\n    }\n    return fn;\n  },\n\n  recurse: function(ast, context, create) {\n    var left, right, self = this, args;\n    if (ast.input) {\n      return this.inputs(ast.input, ast.watchId);\n    }\n    switch (ast.type) {\n    case AST.Literal:\n      return this.value(ast.value, context);\n    case AST.UnaryExpression:\n      right = this.recurse(ast.argument);\n      return this['unary' + ast.operator](right, context);\n    case AST.BinaryExpression:\n      left = this.recurse(ast.left);\n      right = this.recurse(ast.right);\n      return this['binary' + ast.operator](left, right, context);\n    case AST.LogicalExpression:\n      left = this.recurse(ast.left);\n      right = this.recurse(ast.right);\n      return this['binary' + ast.operator](left, right, context);\n    case AST.ConditionalExpression:\n      return this['ternary?:'](\n        this.recurse(ast.test),\n        this.recurse(ast.alternate),\n        this.recurse(ast.consequent),\n        context\n      );\n    case AST.Identifier:\n      return self.identifier(ast.name, context, create);\n    case AST.MemberExpression:\n      left = this.recurse(ast.object, false, !!create);\n      if (!ast.computed) {\n        right = ast.property.name;\n      }\n      if (ast.computed) right = this.recurse(ast.property);\n      return ast.computed ?\n        this.computedMember(left, right, context, create) :\n        this.nonComputedMember(left, right, context, create);\n    case AST.CallExpression:\n      args = [];\n      forEach(ast.arguments, function(expr) {\n        args.push(self.recurse(expr));\n      });\n      if (ast.filter) right = this.$filter(ast.callee.name);\n      if (!ast.filter) right = this.recurse(ast.callee, true);\n      return ast.filter ?\n        function(scope, locals, assign, inputs) {\n          var values = [];\n          for (var i = 0; i < args.length; ++i) {\n            values.push(args[i](scope, locals, assign, inputs));\n          }\n          var value = right.apply(undefined, values, inputs);\n          return context ? {context: undefined, name: undefined, value: value} : value;\n        } :\n        function(scope, locals, assign, inputs) {\n          var rhs = right(scope, locals, assign, inputs);\n          var value;\n          if (rhs.value != null) {\n            var values = [];\n            for (var i = 0; i < args.length; ++i) {\n              values.push(args[i](scope, locals, assign, inputs));\n            }\n            value = rhs.value.apply(rhs.context, values);\n          }\n          return context ? {value: value} : value;\n        };\n    case AST.AssignmentExpression:\n      left = this.recurse(ast.left, true, 1);\n      right = this.recurse(ast.right);\n      return function(scope, locals, assign, inputs) {\n        var lhs = left(scope, locals, assign, inputs);\n        var rhs = right(scope, locals, assign, inputs);\n        lhs.context[lhs.name] = rhs;\n        return context ? {value: rhs} : rhs;\n      };\n    case AST.ArrayExpression:\n      args = [];\n      forEach(ast.elements, function(expr) {\n        args.push(self.recurse(expr));\n      });\n      return function(scope, locals, assign, inputs) {\n        var value = [];\n        for (var i = 0; i < args.length; ++i) {\n          value.push(args[i](scope, locals, assign, inputs));\n        }\n        return context ? {value: value} : value;\n      };\n    case AST.ObjectExpression:\n      args = [];\n      forEach(ast.properties, function(property) {\n        if (property.computed) {\n          args.push({key: self.recurse(property.key),\n                     computed: true,\n                     value: self.recurse(property.value)\n          });\n        } else {\n          args.push({key: property.key.type === AST.Identifier ?\n                          property.key.name :\n                          ('' + property.key.value),\n                     computed: false,\n                     value: self.recurse(property.value)\n          });\n        }\n      });\n      return function(scope, locals, assign, inputs) {\n        var value = {};\n        for (var i = 0; i < args.length; ++i) {\n          if (args[i].computed) {\n            value[args[i].key(scope, locals, assign, inputs)] = args[i].value(scope, locals, assign, inputs);\n          } else {\n            value[args[i].key] = args[i].value(scope, locals, assign, inputs);\n          }\n        }\n        return context ? {value: value} : value;\n      };\n    case AST.ThisExpression:\n      return function(scope) {\n        return context ? {value: scope} : scope;\n      };\n    case AST.LocalsExpression:\n      return function(scope, locals) {\n        return context ? {value: locals} : locals;\n      };\n    case AST.NGValueParameter:\n      return function(scope, locals, assign) {\n        return context ? {value: assign} : assign;\n      };\n    }\n  },\n\n  'unary+': function(argument, context) {\n    return function(scope, locals, assign, inputs) {\n      var arg = argument(scope, locals, assign, inputs);\n      if (isDefined(arg)) {\n        arg = +arg;\n      } else {\n        arg = 0;\n      }\n      return context ? {value: arg} : arg;\n    };\n  },\n  'unary-': function(argument, context) {\n    return function(scope, locals, assign, inputs) {\n      var arg = argument(scope, locals, assign, inputs);\n      if (isDefined(arg)) {\n        arg = -arg;\n      } else {\n        arg = -0;\n      }\n      return context ? {value: arg} : arg;\n    };\n  },\n  'unary!': function(argument, context) {\n    return function(scope, locals, assign, inputs) {\n      var arg = !argument(scope, locals, assign, inputs);\n      return context ? {value: arg} : arg;\n    };\n  },\n  'binary+': function(left, right, context) {\n    return function(scope, locals, assign, inputs) {\n      var lhs = left(scope, locals, assign, inputs);\n      var rhs = right(scope, locals, assign, inputs);\n      var arg = plusFn(lhs, rhs);\n      return context ? {value: arg} : arg;\n    };\n  },\n  'binary-': function(left, right, context) {\n    return function(scope, locals, assign, inputs) {\n      var lhs = left(scope, locals, assign, inputs);\n      var rhs = right(scope, locals, assign, inputs);\n      var arg = (isDefined(lhs) ? lhs : 0) - (isDefined(rhs) ? rhs : 0);\n      return context ? {value: arg} : arg;\n    };\n  },\n  'binary*': function(left, right, context) {\n    return function(scope, locals, assign, inputs) {\n      var arg = left(scope, locals, assign, inputs) * right(scope, locals, assign, inputs);\n      return context ? {value: arg} : arg;\n    };\n  },\n  'binary/': function(left, right, context) {\n    return function(scope, locals, assign, inputs) {\n      var arg = left(scope, locals, assign, inputs) / right(scope, locals, assign, inputs);\n      return context ? {value: arg} : arg;\n    };\n  },\n  'binary%': function(left, right, context) {\n    return function(scope, locals, assign, inputs) {\n      var arg = left(scope, locals, assign, inputs) % right(scope, locals, assign, inputs);\n      return context ? {value: arg} : arg;\n    };\n  },\n  'binary===': function(left, right, context) {\n    return function(scope, locals, assign, inputs) {\n      var arg = left(scope, locals, assign, inputs) === right(scope, locals, assign, inputs);\n      return context ? {value: arg} : arg;\n    };\n  },\n  'binary!==': function(left, right, context) {\n    return function(scope, locals, assign, inputs) {\n      var arg = left(scope, locals, assign, inputs) !== right(scope, locals, assign, inputs);\n      return context ? {value: arg} : arg;\n    };\n  },\n  'binary==': function(left, right, context) {\n    return function(scope, locals, assign, inputs) {\n      // eslint-disable-next-line eqeqeq\n      var arg = left(scope, locals, assign, inputs) == right(scope, locals, assign, inputs);\n      return context ? {value: arg} : arg;\n    };\n  },\n  'binary!=': function(left, right, context) {\n    return function(scope, locals, assign, inputs) {\n      // eslint-disable-next-line eqeqeq\n      var arg = left(scope, locals, assign, inputs) != right(scope, locals, assign, inputs);\n      return context ? {value: arg} : arg;\n    };\n  },\n  'binary<': function(left, right, context) {\n    return function(scope, locals, assign, inputs) {\n      var arg = left(scope, locals, assign, inputs) < right(scope, locals, assign, inputs);\n      return context ? {value: arg} : arg;\n    };\n  },\n  'binary>': function(left, right, context) {\n    return function(scope, locals, assign, inputs) {\n      var arg = left(scope, locals, assign, inputs) > right(scope, locals, assign, inputs);\n      return context ? {value: arg} : arg;\n    };\n  },\n  'binary<=': function(left, right, context) {\n    return function(scope, locals, assign, inputs) {\n      var arg = left(scope, locals, assign, inputs) <= right(scope, locals, assign, inputs);\n      return context ? {value: arg} : arg;\n    };\n  },\n  'binary>=': function(left, right, context) {\n    return function(scope, locals, assign, inputs) {\n      var arg = left(scope, locals, assign, inputs) >= right(scope, locals, assign, inputs);\n      return context ? {value: arg} : arg;\n    };\n  },\n  'binary&&': function(left, right, context) {\n    return function(scope, locals, assign, inputs) {\n      var arg = left(scope, locals, assign, inputs) && right(scope, locals, assign, inputs);\n      return context ? {value: arg} : arg;\n    };\n  },\n  'binary||': function(left, right, context) {\n    return function(scope, locals, assign, inputs) {\n      var arg = left(scope, locals, assign, inputs) || right(scope, locals, assign, inputs);\n      return context ? {value: arg} : arg;\n    };\n  },\n  'ternary?:': function(test, alternate, consequent, context) {\n    return function(scope, locals, assign, inputs) {\n      var arg = test(scope, locals, assign, inputs) ? alternate(scope, locals, assign, inputs) : consequent(scope, locals, assign, inputs);\n      return context ? {value: arg} : arg;\n    };\n  },\n  value: function(value, context) {\n    return function() { return context ? {context: undefined, name: undefined, value: value} : value; };\n  },\n  identifier: function(name, context, create) {\n    return function(scope, locals, assign, inputs) {\n      var base = locals && (name in locals) ? locals : scope;\n      if (create && create !== 1 && base && base[name] == null) {\n        base[name] = {};\n      }\n      var value = base ? base[name] : undefined;\n      if (context) {\n        return {context: base, name: name, value: value};\n      } else {\n        return value;\n      }\n    };\n  },\n  computedMember: function(left, right, context, create) {\n    return function(scope, locals, assign, inputs) {\n      var lhs = left(scope, locals, assign, inputs);\n      var rhs;\n      var value;\n      if (lhs != null) {\n        rhs = right(scope, locals, assign, inputs);\n        rhs = getStringValue(rhs);\n        if (create && create !== 1) {\n          if (lhs && !(lhs[rhs])) {\n            lhs[rhs] = {};\n          }\n        }\n        value = lhs[rhs];\n      }\n      if (context) {\n        return {context: lhs, name: rhs, value: value};\n      } else {\n        return value;\n      }\n    };\n  },\n  nonComputedMember: function(left, right, context, create) {\n    return function(scope, locals, assign, inputs) {\n      var lhs = left(scope, locals, assign, inputs);\n      if (create && create !== 1) {\n        if (lhs && lhs[right] == null) {\n          lhs[right] = {};\n        }\n      }\n      var value = lhs != null ? lhs[right] : undefined;\n      if (context) {\n        return {context: lhs, name: right, value: value};\n      } else {\n        return value;\n      }\n    };\n  },\n  inputs: function(input, watchId) {\n    return function(scope, value, locals, inputs) {\n      if (inputs) return inputs[watchId];\n      return input(scope, value, locals);\n    };\n  }\n};\n\n/**\n * @constructor\n */\nfunction Parser(lexer, $filter, options) {\n  this.ast = new AST(lexer, options);\n  this.astCompiler = options.csp ? new ASTInterpreter($filter) :\n                                   new ASTCompiler($filter);\n}\n\nParser.prototype = {\n  constructor: Parser,\n\n  parse: function(text) {\n    var ast = this.ast.ast(text);\n    var fn = this.astCompiler.compile(ast);\n    fn.literal = isLiteral(ast);\n    fn.constant = isConstant(ast);\n    return fn;\n  }\n};\n\nfunction getValueOf(value) {\n  return isFunction(value.valueOf) ? value.valueOf() : objectValueOf.call(value);\n}\n\n///////////////////////////////////\n\n/**\n * @ngdoc service\n * @name $parse\n * @kind function\n *\n * @description\n *\n * Converts Angular {@link guide/expression expression} into a function.\n *\n * ```js\n *   var getter = $parse('user.name');\n *   var setter = getter.assign;\n *   var context = {user:{name:'angular'}};\n *   var locals = {user:{name:'local'}};\n *\n *   expect(getter(context)).toEqual('angular');\n *   setter(context, 'newValue');\n *   expect(context.user.name).toEqual('newValue');\n *   expect(getter(context, locals)).toEqual('local');\n * ```\n *\n *\n * @param {string} expression String expression to compile.\n * @returns {function(context, locals)} a function which represents the compiled expression:\n *\n *    * `context` – `{object}` – an object against which any expressions embedded in the strings\n *      are evaluated against (typically a scope object).\n *    * `locals` – `{object=}` – local variables context object, useful for overriding values in\n *      `context`.\n *\n *    The returned function also has the following properties:\n *      * `literal` – `{boolean}` – whether the expression's top-level node is a JavaScript\n *        literal.\n *      * `constant` – `{boolean}` – whether the expression is made entirely of JavaScript\n *        constant literals.\n *      * `assign` – `{?function(context, value)}` – if the expression is assignable, this will be\n *        set to a function to change its value on the given context.\n *\n */\n\n\n/**\n * @ngdoc provider\n * @name $parseProvider\n * @this\n *\n * @description\n * `$parseProvider` can be used for configuring the default behavior of the {@link ng.$parse $parse}\n *  service.\n */\nfunction $ParseProvider() {\n  var cache = createMap();\n  var literals = {\n    'true': true,\n    'false': false,\n    'null': null,\n    'undefined': undefined\n  };\n  var identStart, identContinue;\n\n  /**\n   * @ngdoc method\n   * @name $parseProvider#addLiteral\n   * @description\n   *\n   * Configure $parse service to add literal values that will be present as literal at expressions.\n   *\n   * @param {string} literalName Token for the literal value. The literal name value must be a valid literal name.\n   * @param {*} literalValue Value for this literal. All literal values must be primitives or `undefined`.\n   *\n   **/\n  this.addLiteral = function(literalName, literalValue) {\n    literals[literalName] = literalValue;\n  };\n\n /**\n  * @ngdoc method\n  * @name $parseProvider#setIdentifierFns\n  *\n  * @description\n  *\n  * Allows defining the set of characters that are allowed in Angular expressions. The function\n  * `identifierStart` will get called to know if a given character is a valid character to be the\n  * first character for an identifier. The function `identifierContinue` will get called to know if\n  * a given character is a valid character to be a follow-up identifier character. The functions\n  * `identifierStart` and `identifierContinue` will receive as arguments the single character to be\n  * identifier and the character code point. These arguments will be `string` and `numeric`. Keep in\n  * mind that the `string` parameter can be two characters long depending on the character\n  * representation. It is expected for the function to return `true` or `false`, whether that\n  * character is allowed or not.\n  *\n  * Since this function will be called extensively, keep the implementation of these functions fast,\n  * as the performance of these functions have a direct impact on the expressions parsing speed.\n  *\n  * @param {function=} identifierStart The function that will decide whether the given character is\n  *   a valid identifier start character.\n  * @param {function=} identifierContinue The function that will decide whether the given character is\n  *   a valid identifier continue character.\n  */\n  this.setIdentifierFns = function(identifierStart, identifierContinue) {\n    identStart = identifierStart;\n    identContinue = identifierContinue;\n    return this;\n  };\n\n  this.$get = ['$filter', function($filter) {\n    var noUnsafeEval = csp().noUnsafeEval;\n    var $parseOptions = {\n          csp: noUnsafeEval,\n          literals: copy(literals),\n          isIdentifierStart: isFunction(identStart) && identStart,\n          isIdentifierContinue: isFunction(identContinue) && identContinue\n        };\n    return $parse;\n\n    function $parse(exp, interceptorFn) {\n      var parsedExpression, oneTime, cacheKey;\n\n      switch (typeof exp) {\n        case 'string':\n          exp = exp.trim();\n          cacheKey = exp;\n\n          parsedExpression = cache[cacheKey];\n\n          if (!parsedExpression) {\n            if (exp.charAt(0) === ':' && exp.charAt(1) === ':') {\n              oneTime = true;\n              exp = exp.substring(2);\n            }\n            var lexer = new Lexer($parseOptions);\n            var parser = new Parser(lexer, $filter, $parseOptions);\n            parsedExpression = parser.parse(exp);\n            if (parsedExpression.constant) {\n              parsedExpression.$$watchDelegate = constantWatchDelegate;\n            } else if (oneTime) {\n              parsedExpression.oneTime = true;\n              parsedExpression.$$watchDelegate = oneTimeWatchDelegate;\n            } else if (parsedExpression.inputs) {\n              parsedExpression.$$watchDelegate = inputsWatchDelegate;\n            }\n            cache[cacheKey] = parsedExpression;\n          }\n          return addInterceptor(parsedExpression, interceptorFn);\n\n        case 'function':\n          return addInterceptor(exp, interceptorFn);\n\n        default:\n          return addInterceptor(noop, interceptorFn);\n      }\n    }\n\n    function expressionInputDirtyCheck(newValue, oldValueOfValue, compareObjectIdentity) {\n\n      if (newValue == null || oldValueOfValue == null) { // null/undefined\n        return newValue === oldValueOfValue;\n      }\n\n      if (typeof newValue === 'object') {\n\n        // attempt to convert the value to a primitive type\n        // TODO(docs): add a note to docs that by implementing valueOf even objects and arrays can\n        //             be cheaply dirty-checked\n        newValue = getValueOf(newValue);\n\n        if (typeof newValue === 'object' && !compareObjectIdentity) {\n          // objects/arrays are not supported - deep-watching them would be too expensive\n          return false;\n        }\n\n        // fall-through to the primitive equality check\n      }\n\n      //Primitive or NaN\n      // eslint-disable-next-line no-self-compare\n      return newValue === oldValueOfValue || (newValue !== newValue && oldValueOfValue !== oldValueOfValue);\n    }\n\n    function inputsWatchDelegate(scope, listener, objectEquality, parsedExpression, prettyPrintExpression) {\n      var inputExpressions = parsedExpression.inputs;\n      var lastResult;\n\n      if (inputExpressions.length === 1) {\n        var oldInputValueOf = expressionInputDirtyCheck; // init to something unique so that equals check fails\n        inputExpressions = inputExpressions[0];\n        return scope.$watch(function expressionInputWatch(scope) {\n          var newInputValue = inputExpressions(scope);\n          if (!expressionInputDirtyCheck(newInputValue, oldInputValueOf, parsedExpression.literal)) {\n            lastResult = parsedExpression(scope, undefined, undefined, [newInputValue]);\n            oldInputValueOf = newInputValue && getValueOf(newInputValue);\n          }\n          return lastResult;\n        }, listener, objectEquality, prettyPrintExpression);\n      }\n\n      var oldInputValueOfValues = [];\n      var oldInputValues = [];\n      for (var i = 0, ii = inputExpressions.length; i < ii; i++) {\n        oldInputValueOfValues[i] = expressionInputDirtyCheck; // init to something unique so that equals check fails\n        oldInputValues[i] = null;\n      }\n\n      return scope.$watch(function expressionInputsWatch(scope) {\n        var changed = false;\n\n        for (var i = 0, ii = inputExpressions.length; i < ii; i++) {\n          var newInputValue = inputExpressions[i](scope);\n          if (changed || (changed = !expressionInputDirtyCheck(newInputValue, oldInputValueOfValues[i], parsedExpression.literal))) {\n            oldInputValues[i] = newInputValue;\n            oldInputValueOfValues[i] = newInputValue && getValueOf(newInputValue);\n          }\n        }\n\n        if (changed) {\n          lastResult = parsedExpression(scope, undefined, undefined, oldInputValues);\n        }\n\n        return lastResult;\n      }, listener, objectEquality, prettyPrintExpression);\n    }\n\n    function oneTimeWatchDelegate(scope, listener, objectEquality, parsedExpression, prettyPrintExpression) {\n      var isDone = parsedExpression.literal ? isAllDefined : isDefined;\n      var unwatch, lastValue;\n      if (parsedExpression.inputs) {\n        unwatch = inputsWatchDelegate(scope, oneTimeListener, objectEquality, parsedExpression, prettyPrintExpression);\n      } else {\n        unwatch = scope.$watch(oneTimeWatch, oneTimeListener, objectEquality);\n      }\n      return unwatch;\n\n      function oneTimeWatch(scope) {\n        return parsedExpression(scope);\n      }\n      function oneTimeListener(value, old, scope) {\n        lastValue = value;\n        if (isFunction(listener)) {\n          listener(value, old, scope);\n        }\n        if (isDone(value)) {\n          scope.$$postDigest(function() {\n            if (isDone(lastValue)) {\n              unwatch();\n            }\n          });\n        }\n      }\n    }\n\n    function isAllDefined(value) {\n      var allDefined = true;\n      forEach(value, function(val) {\n        if (!isDefined(val)) allDefined = false;\n      });\n      return allDefined;\n    }\n\n    function constantWatchDelegate(scope, listener, objectEquality, parsedExpression) {\n      var unwatch = scope.$watch(function constantWatch(scope) {\n        unwatch();\n        return parsedExpression(scope);\n      }, listener, objectEquality);\n      return unwatch;\n    }\n\n    function addInterceptor(parsedExpression, interceptorFn) {\n      if (!interceptorFn) return parsedExpression;\n      var watchDelegate = parsedExpression.$$watchDelegate;\n      var useInputs = false;\n\n      var isDone = parsedExpression.literal ? isAllDefined : isDefined;\n\n      function regularInterceptedExpression(scope, locals, assign, inputs) {\n        var value = useInputs && inputs ? inputs[0] : parsedExpression(scope, locals, assign, inputs);\n        return interceptorFn(value, scope, locals);\n      }\n\n      function oneTimeInterceptedExpression(scope, locals, assign, inputs) {\n        var value = useInputs && inputs ? inputs[0] : parsedExpression(scope, locals, assign, inputs);\n        var result = interceptorFn(value, scope, locals);\n        // we only return the interceptor's result if the\n        // initial value is defined (for bind-once)\n        return isDone(value) ? result : value;\n      }\n\n      var fn = parsedExpression.oneTime ? oneTimeInterceptedExpression : regularInterceptedExpression;\n\n      // Propogate the literal/oneTime attributes\n      fn.literal = parsedExpression.literal;\n      fn.oneTime = parsedExpression.oneTime;\n\n      // Propagate or create inputs / $$watchDelegates\n      useInputs = !parsedExpression.inputs;\n      if (watchDelegate && watchDelegate !== inputsWatchDelegate) {\n        fn.$$watchDelegate = watchDelegate;\n        fn.inputs = parsedExpression.inputs;\n      } else if (!interceptorFn.$stateful) {\n        // If there is an interceptor, but no watchDelegate then treat the interceptor like\n        // we treat filters - it is assumed to be a pure function unless flagged with $stateful\n        fn.$$watchDelegate = inputsWatchDelegate;\n        fn.inputs = parsedExpression.inputs ? parsedExpression.inputs : [parsedExpression];\n      }\n\n      return fn;\n    }\n  }];\n}\n\n/**\n * @ngdoc service\n * @name $q\n * @requires $rootScope\n *\n * @description\n * A service that helps you run functions asynchronously, and use their return values (or exceptions)\n * when they are done processing.\n *\n * This is a [Promises/A+](https://promisesaplus.com/)-compliant implementation of promises/deferred\n * objects inspired by [Kris Kowal's Q](https://github.com/kriskowal/q).\n *\n * $q can be used in two fashions --- one which is more similar to Kris Kowal's Q or jQuery's Deferred\n * implementations, and the other which resembles ES6 (ES2015) promises to some degree.\n *\n * # $q constructor\n *\n * The streamlined ES6 style promise is essentially just using $q as a constructor which takes a `resolver`\n * function as the first argument. This is similar to the native Promise implementation from ES6,\n * see [MDN](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Promise).\n *\n * While the constructor-style use is supported, not all of the supporting methods from ES6 promises are\n * available yet.\n *\n * It can be used like so:\n *\n * ```js\n *   // for the purpose of this example let's assume that variables `$q` and `okToGreet`\n *   // are available in the current lexical scope (they could have been injected or passed in).\n *\n *   function asyncGreet(name) {\n *     // perform some asynchronous operation, resolve or reject the promise when appropriate.\n *     return $q(function(resolve, reject) {\n *       setTimeout(function() {\n *         if (okToGreet(name)) {\n *           resolve('Hello, ' + name + '!');\n *         } else {\n *           reject('Greeting ' + name + ' is not allowed.');\n *         }\n *       }, 1000);\n *     });\n *   }\n *\n *   var promise = asyncGreet('Robin Hood');\n *   promise.then(function(greeting) {\n *     alert('Success: ' + greeting);\n *   }, function(reason) {\n *     alert('Failed: ' + reason);\n *   });\n * ```\n *\n * Note: progress/notify callbacks are not currently supported via the ES6-style interface.\n *\n * Note: unlike ES6 behavior, an exception thrown in the constructor function will NOT implicitly reject the promise.\n *\n * However, the more traditional CommonJS-style usage is still available, and documented below.\n *\n * [The CommonJS Promise proposal](http://wiki.commonjs.org/wiki/Promises) describes a promise as an\n * interface for interacting with an object that represents the result of an action that is\n * performed asynchronously, and may or may not be finished at any given point in time.\n *\n * From the perspective of dealing with error handling, deferred and promise APIs are to\n * asynchronous programming what `try`, `catch` and `throw` keywords are to synchronous programming.\n *\n * ```js\n *   // for the purpose of this example let's assume that variables `$q` and `okToGreet`\n *   // are available in the current lexical scope (they could have been injected or passed in).\n *\n *   function asyncGreet(name) {\n *     var deferred = $q.defer();\n *\n *     setTimeout(function() {\n *       deferred.notify('About to greet ' + name + '.');\n *\n *       if (okToGreet(name)) {\n *         deferred.resolve('Hello, ' + name + '!');\n *       } else {\n *         deferred.reject('Greeting ' + name + ' is not allowed.');\n *       }\n *     }, 1000);\n *\n *     return deferred.promise;\n *   }\n *\n *   var promise = asyncGreet('Robin Hood');\n *   promise.then(function(greeting) {\n *     alert('Success: ' + greeting);\n *   }, function(reason) {\n *     alert('Failed: ' + reason);\n *   }, function(update) {\n *     alert('Got notification: ' + update);\n *   });\n * ```\n *\n * At first it might not be obvious why this extra complexity is worth the trouble. The payoff\n * comes in the way of guarantees that promise and deferred APIs make, see\n * https://github.com/kriskowal/uncommonjs/blob/master/promises/specification.md.\n *\n * Additionally the promise api allows for composition that is very hard to do with the\n * traditional callback ([CPS](http://en.wikipedia.org/wiki/Continuation-passing_style)) approach.\n * For more on this please see the [Q documentation](https://github.com/kriskowal/q) especially the\n * section on serial or parallel joining of promises.\n *\n * # The Deferred API\n *\n * A new instance of deferred is constructed by calling `$q.defer()`.\n *\n * The purpose of the deferred object is to expose the associated Promise instance as well as APIs\n * that can be used for signaling the successful or unsuccessful completion, as well as the status\n * of the task.\n *\n * **Methods**\n *\n * - `resolve(value)` – resolves the derived promise with the `value`. If the value is a rejection\n *   constructed via `$q.reject`, the promise will be rejected instead.\n * - `reject(reason)` – rejects the derived promise with the `reason`. This is equivalent to\n *   resolving it with a rejection constructed via `$q.reject`.\n * - `notify(value)` - provides updates on the status of the promise's execution. This may be called\n *   multiple times before the promise is either resolved or rejected.\n *\n * **Properties**\n *\n * - promise – `{Promise}` – promise object associated with this deferred.\n *\n *\n * # The Promise API\n *\n * A new promise instance is created when a deferred instance is created and can be retrieved by\n * calling `deferred.promise`.\n *\n * The purpose of the promise object is to allow for interested parties to get access to the result\n * of the deferred task when it completes.\n *\n * **Methods**\n *\n * - `then(successCallback, [errorCallback], [notifyCallback])` – regardless of when the promise was or\n *   will be resolved or rejected, `then` calls one of the success or error callbacks asynchronously\n *   as soon as the result is available. The callbacks are called with a single argument: the result\n *   or rejection reason. Additionally, the notify callback may be called zero or more times to\n *   provide a progress indication, before the promise is resolved or rejected.\n *\n *   This method *returns a new promise* which is resolved or rejected via the return value of the\n *   `successCallback`, `errorCallback` (unless that value is a promise, in which case it is resolved\n *   with the value which is resolved in that promise using\n *   [promise chaining](http://www.html5rocks.com/en/tutorials/es6/promises/#toc-promises-queues)).\n *   It also notifies via the return value of the `notifyCallback` method. The promise cannot be\n *   resolved or rejected from the notifyCallback method. The errorCallback and notifyCallback\n *   arguments are optional.\n *\n * - `catch(errorCallback)` – shorthand for `promise.then(null, errorCallback)`\n *\n * - `finally(callback, notifyCallback)` – allows you to observe either the fulfillment or rejection of a promise,\n *   but to do so without modifying the final value. This is useful to release resources or do some\n *   clean-up that needs to be done whether the promise was rejected or resolved. See the [full\n *   specification](https://github.com/kriskowal/q/wiki/API-Reference#promisefinallycallback) for\n *   more information.\n *\n * # Chaining promises\n *\n * Because calling the `then` method of a promise returns a new derived promise, it is easily\n * possible to create a chain of promises:\n *\n * ```js\n *   promiseB = promiseA.then(function(result) {\n *     return result + 1;\n *   });\n *\n *   // promiseB will be resolved immediately after promiseA is resolved and its value\n *   // will be the result of promiseA incremented by 1\n * ```\n *\n * It is possible to create chains of any length and since a promise can be resolved with another\n * promise (which will defer its resolution further), it is possible to pause/defer resolution of\n * the promises at any point in the chain. This makes it possible to implement powerful APIs like\n * $http's response interceptors.\n *\n *\n * # Differences between Kris Kowal's Q and $q\n *\n *  There are two main differences:\n *\n * - $q is integrated with the {@link ng.$rootScope.Scope} Scope model observation\n *   mechanism in angular, which means faster propagation of resolution or rejection into your\n *   models and avoiding unnecessary browser repaints, which would result in flickering UI.\n * - Q has many more features than $q, but that comes at a cost of bytes. $q is tiny, but contains\n *   all the important functionality needed for common async tasks.\n *\n * # Testing\n *\n *  ```js\n *    it('should simulate promise', inject(function($q, $rootScope) {\n *      var deferred = $q.defer();\n *      var promise = deferred.promise;\n *      var resolvedValue;\n *\n *      promise.then(function(value) { resolvedValue = value; });\n *      expect(resolvedValue).toBeUndefined();\n *\n *      // Simulate resolving of promise\n *      deferred.resolve(123);\n *      // Note that the 'then' function does not get called synchronously.\n *      // This is because we want the promise API to always be async, whether or not\n *      // it got called synchronously or asynchronously.\n *      expect(resolvedValue).toBeUndefined();\n *\n *      // Propagate promise resolution to 'then' functions using $apply().\n *      $rootScope.$apply();\n *      expect(resolvedValue).toEqual(123);\n *    }));\n *  ```\n *\n * @param {function(function, function)} resolver Function which is responsible for resolving or\n *   rejecting the newly created promise. The first parameter is a function which resolves the\n *   promise, the second parameter is a function which rejects the promise.\n *\n * @returns {Promise} The newly created promise.\n */\n/**\n * @ngdoc provider\n * @name $qProvider\n * @this\n *\n * @description\n */\nfunction $QProvider() {\n  var errorOnUnhandledRejections = true;\n  this.$get = ['$rootScope', '$exceptionHandler', function($rootScope, $exceptionHandler) {\n    return qFactory(function(callback) {\n      $rootScope.$evalAsync(callback);\n    }, $exceptionHandler, errorOnUnhandledRejections);\n  }];\n\n  /**\n   * @ngdoc method\n   * @name $qProvider#errorOnUnhandledRejections\n   * @kind function\n   *\n   * @description\n   * Retrieves or overrides whether to generate an error when a rejected promise is not handled.\n   * This feature is enabled by default.\n   *\n   * @param {boolean=} value Whether to generate an error when a rejected promise is not handled.\n   * @returns {boolean|ng.$qProvider} Current value when called without a new value or self for\n   *    chaining otherwise.\n   */\n  this.errorOnUnhandledRejections = function(value) {\n    if (isDefined(value)) {\n      errorOnUnhandledRejections = value;\n      return this;\n    } else {\n      return errorOnUnhandledRejections;\n    }\n  };\n}\n\n/** @this */\nfunction $$QProvider() {\n  var errorOnUnhandledRejections = true;\n  this.$get = ['$browser', '$exceptionHandler', function($browser, $exceptionHandler) {\n    return qFactory(function(callback) {\n      $browser.defer(callback);\n    }, $exceptionHandler, errorOnUnhandledRejections);\n  }];\n\n  this.errorOnUnhandledRejections = function(value) {\n    if (isDefined(value)) {\n      errorOnUnhandledRejections = value;\n      return this;\n    } else {\n      return errorOnUnhandledRejections;\n    }\n  };\n}\n\n/**\n * Constructs a promise manager.\n *\n * @param {function(function)} nextTick Function for executing functions in the next turn.\n * @param {function(...*)} exceptionHandler Function into which unexpected exceptions are passed for\n *     debugging purposes.\n @ param {=boolean} errorOnUnhandledRejections Whether an error should be generated on unhandled\n *     promises rejections.\n * @returns {object} Promise manager.\n */\nfunction qFactory(nextTick, exceptionHandler, errorOnUnhandledRejections) {\n  var $qMinErr = minErr('$q', TypeError);\n  var queueSize = 0;\n  var checkQueue = [];\n\n  /**\n   * @ngdoc method\n   * @name ng.$q#defer\n   * @kind function\n   *\n   * @description\n   * Creates a `Deferred` object which represents a task which will finish in the future.\n   *\n   * @returns {Deferred} Returns a new instance of deferred.\n   */\n  function defer() {\n    return new Deferred();\n  }\n\n  function Deferred() {\n    var promise = this.promise = new Promise();\n    //Non prototype methods necessary to support unbound execution :/\n    this.resolve = function(val) { resolvePromise(promise, val); };\n    this.reject = function(reason) { rejectPromise(promise, reason); };\n    this.notify = function(progress) { notifyPromise(promise, progress); };\n  }\n\n\n  function Promise() {\n    this.$$state = { status: 0 };\n  }\n\n  extend(Promise.prototype, {\n    then: function(onFulfilled, onRejected, progressBack) {\n      if (isUndefined(onFulfilled) && isUndefined(onRejected) && isUndefined(progressBack)) {\n        return this;\n      }\n      var result = new Promise();\n\n      this.$$state.pending = this.$$state.pending || [];\n      this.$$state.pending.push([result, onFulfilled, onRejected, progressBack]);\n      if (this.$$state.status > 0) scheduleProcessQueue(this.$$state);\n\n      return result;\n    },\n\n    'catch': function(callback) {\n      return this.then(null, callback);\n    },\n\n    'finally': function(callback, progressBack) {\n      return this.then(function(value) {\n        return handleCallback(value, resolve, callback);\n      }, function(error) {\n        return handleCallback(error, reject, callback);\n      }, progressBack);\n    }\n  });\n\n  function processQueue(state) {\n    var fn, promise, pending;\n\n    pending = state.pending;\n    state.processScheduled = false;\n    state.pending = undefined;\n    try {\n      for (var i = 0, ii = pending.length; i < ii; ++i) {\n        state.pur = true;\n        promise = pending[i][0];\n        fn = pending[i][state.status];\n        try {\n          if (isFunction(fn)) {\n            resolvePromise(promise, fn(state.value));\n          } else if (state.status === 1) {\n            resolvePromise(promise, state.value);\n          } else {\n            rejectPromise(promise, state.value);\n          }\n        } catch (e) {\n          rejectPromise(promise, e);\n        }\n      }\n    } finally {\n      --queueSize;\n      if (errorOnUnhandledRejections && queueSize === 0) {\n        nextTick(processChecks);\n      }\n    }\n  }\n\n  function processChecks() {\n    // eslint-disable-next-line no-unmodified-loop-condition\n    while (!queueSize && checkQueue.length) {\n      var toCheck = checkQueue.shift();\n      if (!toCheck.pur) {\n        toCheck.pur = true;\n        var errorMessage = 'Possibly unhandled rejection: ' + toDebugString(toCheck.value);\n        if (toCheck.value instanceof Error) {\n          exceptionHandler(toCheck.value, errorMessage);\n        } else {\n          exceptionHandler(errorMessage);\n        }\n      }\n    }\n  }\n\n  function scheduleProcessQueue(state) {\n    if (errorOnUnhandledRejections && !state.pending && state.status === 2 && !state.pur) {\n      if (queueSize === 0 && checkQueue.length === 0) {\n        nextTick(processChecks);\n      }\n      checkQueue.push(state);\n    }\n    if (state.processScheduled || !state.pending) return;\n    state.processScheduled = true;\n    ++queueSize;\n    nextTick(function() { processQueue(state); });\n  }\n\n  function resolvePromise(promise, val) {\n    if (promise.$$state.status) return;\n    if (val === promise) {\n      $$reject(promise, $qMinErr(\n        'qcycle',\n        'Expected promise to be resolved with value other than itself \\'{0}\\'',\n        val));\n    } else {\n      $$resolve(promise, val);\n    }\n\n  }\n\n  function $$resolve(promise, val) {\n    var then;\n    var done = false;\n    try {\n      if (isObject(val) || isFunction(val)) then = val.then;\n      if (isFunction(then)) {\n        promise.$$state.status = -1;\n        then.call(val, doResolve, doReject, doNotify);\n      } else {\n        promise.$$state.value = val;\n        promise.$$state.status = 1;\n        scheduleProcessQueue(promise.$$state);\n      }\n    } catch (e) {\n      doReject(e);\n    }\n\n    function doResolve(val) {\n      if (done) return;\n      done = true;\n      $$resolve(promise, val);\n    }\n    function doReject(val) {\n      if (done) return;\n      done = true;\n      $$reject(promise, val);\n    }\n    function doNotify(progress) {\n      notifyPromise(promise, progress);\n    }\n  }\n\n  function rejectPromise(promise, reason) {\n    if (promise.$$state.status) return;\n    $$reject(promise, reason);\n  }\n\n  function $$reject(promise, reason) {\n    promise.$$state.value = reason;\n    promise.$$state.status = 2;\n    scheduleProcessQueue(promise.$$state);\n  }\n\n  function notifyPromise(promise, progress) {\n    var callbacks = promise.$$state.pending;\n\n    if ((promise.$$state.status <= 0) && callbacks && callbacks.length) {\n      nextTick(function() {\n        var callback, result;\n        for (var i = 0, ii = callbacks.length; i < ii; i++) {\n          result = callbacks[i][0];\n          callback = callbacks[i][3];\n          try {\n            notifyPromise(result, isFunction(callback) ? callback(progress) : progress);\n          } catch (e) {\n            exceptionHandler(e);\n          }\n        }\n      });\n    }\n  }\n\n  /**\n   * @ngdoc method\n   * @name $q#reject\n   * @kind function\n   *\n   * @description\n   * Creates a promise that is resolved as rejected with the specified `reason`. This api should be\n   * used to forward rejection in a chain of promises. If you are dealing with the last promise in\n   * a promise chain, you don't need to worry about it.\n   *\n   * When comparing deferreds/promises to the familiar behavior of try/catch/throw, think of\n   * `reject` as the `throw` keyword in JavaScript. This also means that if you \"catch\" an error via\n   * a promise error callback and you want to forward the error to the promise derived from the\n   * current promise, you have to \"rethrow\" the error by returning a rejection constructed via\n   * `reject`.\n   *\n   * ```js\n   *   promiseB = promiseA.then(function(result) {\n   *     // success: do something and resolve promiseB\n   *     //          with the old or a new result\n   *     return result;\n   *   }, function(reason) {\n   *     // error: handle the error if possible and\n   *     //        resolve promiseB with newPromiseOrValue,\n   *     //        otherwise forward the rejection to promiseB\n   *     if (canHandle(reason)) {\n   *      // handle the error and recover\n   *      return newPromiseOrValue;\n   *     }\n   *     return $q.reject(reason);\n   *   });\n   * ```\n   *\n   * @param {*} reason Constant, message, exception or an object representing the rejection reason.\n   * @returns {Promise} Returns a promise that was already resolved as rejected with the `reason`.\n   */\n  function reject(reason) {\n    var result = new Promise();\n    rejectPromise(result, reason);\n    return result;\n  }\n\n  function handleCallback(value, resolver, callback) {\n    var callbackOutput = null;\n    try {\n      if (isFunction(callback)) callbackOutput = callback();\n    } catch (e) {\n      return reject(e);\n    }\n    if (isPromiseLike(callbackOutput)) {\n      return callbackOutput.then(function() {\n        return resolver(value);\n      }, reject);\n    } else {\n      return resolver(value);\n    }\n  }\n\n  /**\n   * @ngdoc method\n   * @name $q#when\n   * @kind function\n   *\n   * @description\n   * Wraps an object that might be a value or a (3rd party) then-able promise into a $q promise.\n   * This is useful when you are dealing with an object that might or might not be a promise, or if\n   * the promise comes from a source that can't be trusted.\n   *\n   * @param {*} value Value or a promise\n   * @param {Function=} successCallback\n   * @param {Function=} errorCallback\n   * @param {Function=} progressCallback\n   * @returns {Promise} Returns a promise of the passed value or promise\n   */\n\n\n  function when(value, callback, errback, progressBack) {\n    var result = new Promise();\n    resolvePromise(result, value);\n    return result.then(callback, errback, progressBack);\n  }\n\n  /**\n   * @ngdoc method\n   * @name $q#resolve\n   * @kind function\n   *\n   * @description\n   * Alias of {@link ng.$q#when when} to maintain naming consistency with ES6.\n   *\n   * @param {*} value Value or a promise\n   * @param {Function=} successCallback\n   * @param {Function=} errorCallback\n   * @param {Function=} progressCallback\n   * @returns {Promise} Returns a promise of the passed value or promise\n   */\n  var resolve = when;\n\n  /**\n   * @ngdoc method\n   * @name $q#all\n   * @kind function\n   *\n   * @description\n   * Combines multiple promises into a single promise that is resolved when all of the input\n   * promises are resolved.\n   *\n   * @param {Array.<Promise>|Object.<Promise>} promises An array or hash of promises.\n   * @returns {Promise} Returns a single promise that will be resolved with an array/hash of values,\n   *   each value corresponding to the promise at the same index/key in the `promises` array/hash.\n   *   If any of the promises is resolved with a rejection, this resulting promise will be rejected\n   *   with the same rejection value.\n   */\n\n  function all(promises) {\n    var result = new Promise(),\n        counter = 0,\n        results = isArray(promises) ? [] : {};\n\n    forEach(promises, function(promise, key) {\n      counter++;\n      when(promise).then(function(value) {\n        results[key] = value;\n        if (!(--counter)) resolvePromise(result, results);\n      }, function(reason) {\n        rejectPromise(result, reason);\n      });\n    });\n\n    if (counter === 0) {\n      resolvePromise(result, results);\n    }\n\n    return result;\n  }\n\n  /**\n   * @ngdoc method\n   * @name $q#race\n   * @kind function\n   *\n   * @description\n   * Returns a promise that resolves or rejects as soon as one of those promises\n   * resolves or rejects, with the value or reason from that promise.\n   *\n   * @param {Array.<Promise>|Object.<Promise>} promises An array or hash of promises.\n   * @returns {Promise} a promise that resolves or rejects as soon as one of the `promises`\n   * resolves or rejects, with the value or reason from that promise.\n   */\n\n  function race(promises) {\n    var deferred = defer();\n\n    forEach(promises, function(promise) {\n      when(promise).then(deferred.resolve, deferred.reject);\n    });\n\n    return deferred.promise;\n  }\n\n  function $Q(resolver) {\n    if (!isFunction(resolver)) {\n      throw $qMinErr('norslvr', 'Expected resolverFn, got \\'{0}\\'', resolver);\n    }\n\n    var promise = new Promise();\n\n    function resolveFn(value) {\n      resolvePromise(promise, value);\n    }\n\n    function rejectFn(reason) {\n      rejectPromise(promise, reason);\n    }\n\n    resolver(resolveFn, rejectFn);\n\n    return promise;\n  }\n\n  // Let's make the instanceof operator work for promises, so that\n  // `new $q(fn) instanceof $q` would evaluate to true.\n  $Q.prototype = Promise.prototype;\n\n  $Q.defer = defer;\n  $Q.reject = reject;\n  $Q.when = when;\n  $Q.resolve = resolve;\n  $Q.all = all;\n  $Q.race = race;\n\n  return $Q;\n}\n\n/** @this */\nfunction $$RAFProvider() { //rAF\n  this.$get = ['$window', '$timeout', function($window, $timeout) {\n    var requestAnimationFrame = $window.requestAnimationFrame ||\n                                $window.webkitRequestAnimationFrame;\n\n    var cancelAnimationFrame = $window.cancelAnimationFrame ||\n                               $window.webkitCancelAnimationFrame ||\n                               $window.webkitCancelRequestAnimationFrame;\n\n    var rafSupported = !!requestAnimationFrame;\n    var raf = rafSupported\n      ? function(fn) {\n          var id = requestAnimationFrame(fn);\n          return function() {\n            cancelAnimationFrame(id);\n          };\n        }\n      : function(fn) {\n          var timer = $timeout(fn, 16.66, false); // 1000 / 60 = 16.666\n          return function() {\n            $timeout.cancel(timer);\n          };\n        };\n\n    raf.supported = rafSupported;\n\n    return raf;\n  }];\n}\n\n/**\n * DESIGN NOTES\n *\n * The design decisions behind the scope are heavily favored for speed and memory consumption.\n *\n * The typical use of scope is to watch the expressions, which most of the time return the same\n * value as last time so we optimize the operation.\n *\n * Closures construction is expensive in terms of speed as well as memory:\n *   - No closures, instead use prototypical inheritance for API\n *   - Internal state needs to be stored on scope directly, which means that private state is\n *     exposed as $$____ properties\n *\n * Loop operations are optimized by using while(count--) { ... }\n *   - This means that in order to keep the same order of execution as addition we have to add\n *     items to the array at the beginning (unshift) instead of at the end (push)\n *\n * Child scopes are created and removed often\n *   - Using an array would be slow since inserts in the middle are expensive; so we use linked lists\n *\n * There are fewer watches than observers. This is why you don't want the observer to be implemented\n * in the same way as watch. Watch requires return of the initialization function which is expensive\n * to construct.\n */\n\n\n/**\n * @ngdoc provider\n * @name $rootScopeProvider\n * @description\n *\n * Provider for the $rootScope service.\n */\n\n/**\n * @ngdoc method\n * @name $rootScopeProvider#digestTtl\n * @description\n *\n * Sets the number of `$digest` iterations the scope should attempt to execute before giving up and\n * assuming that the model is unstable.\n *\n * The current default is 10 iterations.\n *\n * In complex applications it's possible that the dependencies between `$watch`s will result in\n * several digest iterations. However if an application needs more than the default 10 digest\n * iterations for its model to stabilize then you should investigate what is causing the model to\n * continuously change during the digest.\n *\n * Increasing the TTL could have performance implications, so you should not change it without\n * proper justification.\n *\n * @param {number} limit The number of digest iterations.\n */\n\n\n/**\n * @ngdoc service\n * @name $rootScope\n * @this\n *\n * @description\n *\n * Every application has a single root {@link ng.$rootScope.Scope scope}.\n * All other scopes are descendant scopes of the root scope. Scopes provide separation\n * between the model and the view, via a mechanism for watching the model for changes.\n * They also provide event emission/broadcast and subscription facility. See the\n * {@link guide/scope developer guide on scopes}.\n */\nfunction $RootScopeProvider() {\n  var TTL = 10;\n  var $rootScopeMinErr = minErr('$rootScope');\n  var lastDirtyWatch = null;\n  var applyAsyncId = null;\n\n  this.digestTtl = function(value) {\n    if (arguments.length) {\n      TTL = value;\n    }\n    return TTL;\n  };\n\n  function createChildScopeClass(parent) {\n    function ChildScope() {\n      this.$$watchers = this.$$nextSibling =\n          this.$$childHead = this.$$childTail = null;\n      this.$$listeners = {};\n      this.$$listenerCount = {};\n      this.$$watchersCount = 0;\n      this.$id = nextUid();\n      this.$$ChildScope = null;\n    }\n    ChildScope.prototype = parent;\n    return ChildScope;\n  }\n\n  this.$get = ['$exceptionHandler', '$parse', '$browser',\n      function($exceptionHandler, $parse, $browser) {\n\n    function destroyChildScope($event) {\n        $event.currentScope.$$destroyed = true;\n    }\n\n    function cleanUpScope($scope) {\n\n      // Support: IE 9 only\n      if (msie === 9) {\n        // There is a memory leak in IE9 if all child scopes are not disconnected\n        // completely when a scope is destroyed. So this code will recurse up through\n        // all this scopes children\n        //\n        // See issue https://github.com/angular/angular.js/issues/10706\n        if ($scope.$$childHead) {\n          cleanUpScope($scope.$$childHead);\n        }\n        if ($scope.$$nextSibling) {\n          cleanUpScope($scope.$$nextSibling);\n        }\n      }\n\n      // The code below works around IE9 and V8's memory leaks\n      //\n      // See:\n      // - https://code.google.com/p/v8/issues/detail?id=2073#c26\n      // - https://github.com/angular/angular.js/issues/6794#issuecomment-38648909\n      // - https://github.com/angular/angular.js/issues/1313#issuecomment-10378451\n\n      $scope.$parent = $scope.$$nextSibling = $scope.$$prevSibling = $scope.$$childHead =\n          $scope.$$childTail = $scope.$root = $scope.$$watchers = null;\n    }\n\n    /**\n     * @ngdoc type\n     * @name $rootScope.Scope\n     *\n     * @description\n     * A root scope can be retrieved using the {@link ng.$rootScope $rootScope} key from the\n     * {@link auto.$injector $injector}. Child scopes are created using the\n     * {@link ng.$rootScope.Scope#$new $new()} method. (Most scopes are created automatically when\n     * compiled HTML template is executed.) See also the {@link guide/scope Scopes guide} for\n     * an in-depth introduction and usage examples.\n     *\n     *\n     * # Inheritance\n     * A scope can inherit from a parent scope, as in this example:\n     * ```js\n         var parent = $rootScope;\n         var child = parent.$new();\n\n         parent.salutation = \"Hello\";\n         expect(child.salutation).toEqual('Hello');\n\n         child.salutation = \"Welcome\";\n         expect(child.salutation).toEqual('Welcome');\n         expect(parent.salutation).toEqual('Hello');\n     * ```\n     *\n     * When interacting with `Scope` in tests, additional helper methods are available on the\n     * instances of `Scope` type. See {@link ngMock.$rootScope.Scope ngMock Scope} for additional\n     * details.\n     *\n     *\n     * @param {Object.<string, function()>=} providers Map of service factory which need to be\n     *                                       provided for the current scope. Defaults to {@link ng}.\n     * @param {Object.<string, *>=} instanceCache Provides pre-instantiated services which should\n     *                              append/override services provided by `providers`. This is handy\n     *                              when unit-testing and having the need to override a default\n     *                              service.\n     * @returns {Object} Newly created scope.\n     *\n     */\n    function Scope() {\n      this.$id = nextUid();\n      this.$$phase = this.$parent = this.$$watchers =\n                     this.$$nextSibling = this.$$prevSibling =\n                     this.$$childHead = this.$$childTail = null;\n      this.$root = this;\n      this.$$destroyed = false;\n      this.$$listeners = {};\n      this.$$listenerCount = {};\n      this.$$watchersCount = 0;\n      this.$$isolateBindings = null;\n    }\n\n    /**\n     * @ngdoc property\n     * @name $rootScope.Scope#$id\n     *\n     * @description\n     * Unique scope ID (monotonically increasing) useful for debugging.\n     */\n\n     /**\n      * @ngdoc property\n      * @name $rootScope.Scope#$parent\n      *\n      * @description\n      * Reference to the parent scope.\n      */\n\n      /**\n       * @ngdoc property\n       * @name $rootScope.Scope#$root\n       *\n       * @description\n       * Reference to the root scope.\n       */\n\n    Scope.prototype = {\n      constructor: Scope,\n      /**\n       * @ngdoc method\n       * @name $rootScope.Scope#$new\n       * @kind function\n       *\n       * @description\n       * Creates a new child {@link ng.$rootScope.Scope scope}.\n       *\n       * The parent scope will propagate the {@link ng.$rootScope.Scope#$digest $digest()} event.\n       * The scope can be removed from the scope hierarchy using {@link ng.$rootScope.Scope#$destroy $destroy()}.\n       *\n       * {@link ng.$rootScope.Scope#$destroy $destroy()} must be called on a scope when it is\n       * desired for the scope and its child scopes to be permanently detached from the parent and\n       * thus stop participating in model change detection and listener notification by invoking.\n       *\n       * @param {boolean} isolate If true, then the scope does not prototypically inherit from the\n       *         parent scope. The scope is isolated, as it can not see parent scope properties.\n       *         When creating widgets, it is useful for the widget to not accidentally read parent\n       *         state.\n       *\n       * @param {Scope} [parent=this] The {@link ng.$rootScope.Scope `Scope`} that will be the `$parent`\n       *                              of the newly created scope. Defaults to `this` scope if not provided.\n       *                              This is used when creating a transclude scope to correctly place it\n       *                              in the scope hierarchy while maintaining the correct prototypical\n       *                              inheritance.\n       *\n       * @returns {Object} The newly created child scope.\n       *\n       */\n      $new: function(isolate, parent) {\n        var child;\n\n        parent = parent || this;\n\n        if (isolate) {\n          child = new Scope();\n          child.$root = this.$root;\n        } else {\n          // Only create a child scope class if somebody asks for one,\n          // but cache it to allow the VM to optimize lookups.\n          if (!this.$$ChildScope) {\n            this.$$ChildScope = createChildScopeClass(this);\n          }\n          child = new this.$$ChildScope();\n        }\n        child.$parent = parent;\n        child.$$prevSibling = parent.$$childTail;\n        if (parent.$$childHead) {\n          parent.$$childTail.$$nextSibling = child;\n          parent.$$childTail = child;\n        } else {\n          parent.$$childHead = parent.$$childTail = child;\n        }\n\n        // When the new scope is not isolated or we inherit from `this`, and\n        // the parent scope is destroyed, the property `$$destroyed` is inherited\n        // prototypically. In all other cases, this property needs to be set\n        // when the parent scope is destroyed.\n        // The listener needs to be added after the parent is set\n        if (isolate || parent !== this) child.$on('$destroy', destroyChildScope);\n\n        return child;\n      },\n\n      /**\n       * @ngdoc method\n       * @name $rootScope.Scope#$watch\n       * @kind function\n       *\n       * @description\n       * Registers a `listener` callback to be executed whenever the `watchExpression` changes.\n       *\n       * - The `watchExpression` is called on every call to {@link ng.$rootScope.Scope#$digest\n       *   $digest()} and should return the value that will be watched. (`watchExpression` should not change\n       *   its value when executed multiple times with the same input because it may be executed multiple\n       *   times by {@link ng.$rootScope.Scope#$digest $digest()}. That is, `watchExpression` should be\n       *   [idempotent](http://en.wikipedia.org/wiki/Idempotence).)\n       * - The `listener` is called only when the value from the current `watchExpression` and the\n       *   previous call to `watchExpression` are not equal (with the exception of the initial run,\n       *   see below). Inequality is determined according to reference inequality,\n       *   [strict comparison](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Operators/Comparison_Operators)\n       *    via the `!==` Javascript operator, unless `objectEquality == true`\n       *   (see next point)\n       * - When `objectEquality == true`, inequality of the `watchExpression` is determined\n       *   according to the {@link angular.equals} function. To save the value of the object for\n       *   later comparison, the {@link angular.copy} function is used. This therefore means that\n       *   watching complex objects will have adverse memory and performance implications.\n       * - This should not be used to watch for changes in objects that are\n       *   or contain [File](https://developer.mozilla.org/docs/Web/API/File) objects due to limitations with {@link angular.copy `angular.copy`}.\n       * - The watch `listener` may change the model, which may trigger other `listener`s to fire.\n       *   This is achieved by rerunning the watchers until no changes are detected. The rerun\n       *   iteration limit is 10 to prevent an infinite loop deadlock.\n       *\n       *\n       * If you want to be notified whenever {@link ng.$rootScope.Scope#$digest $digest} is called,\n       * you can register a `watchExpression` function with no `listener`. (Be prepared for\n       * multiple calls to your `watchExpression` because it will execute multiple times in a\n       * single {@link ng.$rootScope.Scope#$digest $digest} cycle if a change is detected.)\n       *\n       * After a watcher is registered with the scope, the `listener` fn is called asynchronously\n       * (via {@link ng.$rootScope.Scope#$evalAsync $evalAsync}) to initialize the\n       * watcher. In rare cases, this is undesirable because the listener is called when the result\n       * of `watchExpression` didn't change. To detect this scenario within the `listener` fn, you\n       * can compare the `newVal` and `oldVal`. If these two values are identical (`===`) then the\n       * listener was called due to initialization.\n       *\n       *\n       *\n       * # Example\n       * ```js\n           // let's assume that scope was dependency injected as the $rootScope\n           var scope = $rootScope;\n           scope.name = 'misko';\n           scope.counter = 0;\n\n           expect(scope.counter).toEqual(0);\n           scope.$watch('name', function(newValue, oldValue) {\n             scope.counter = scope.counter + 1;\n           });\n           expect(scope.counter).toEqual(0);\n\n           scope.$digest();\n           // the listener is always called during the first $digest loop after it was registered\n           expect(scope.counter).toEqual(1);\n\n           scope.$digest();\n           // but now it will not be called unless the value changes\n           expect(scope.counter).toEqual(1);\n\n           scope.name = 'adam';\n           scope.$digest();\n           expect(scope.counter).toEqual(2);\n\n\n\n           // Using a function as a watchExpression\n           var food;\n           scope.foodCounter = 0;\n           expect(scope.foodCounter).toEqual(0);\n           scope.$watch(\n             // This function returns the value being watched. It is called for each turn of the $digest loop\n             function() { return food; },\n             // This is the change listener, called when the value returned from the above function changes\n             function(newValue, oldValue) {\n               if ( newValue !== oldValue ) {\n                 // Only increment the counter if the value changed\n                 scope.foodCounter = scope.foodCounter + 1;\n               }\n             }\n           );\n           // No digest has been run so the counter will be zero\n           expect(scope.foodCounter).toEqual(0);\n\n           // Run the digest but since food has not changed count will still be zero\n           scope.$digest();\n           expect(scope.foodCounter).toEqual(0);\n\n           // Update food and run digest.  Now the counter will increment\n           food = 'cheeseburger';\n           scope.$digest();\n           expect(scope.foodCounter).toEqual(1);\n\n       * ```\n       *\n       *\n       *\n       * @param {(function()|string)} watchExpression Expression that is evaluated on each\n       *    {@link ng.$rootScope.Scope#$digest $digest} cycle. A change in the return value triggers\n       *    a call to the `listener`.\n       *\n       *    - `string`: Evaluated as {@link guide/expression expression}\n       *    - `function(scope)`: called with current `scope` as a parameter.\n       * @param {function(newVal, oldVal, scope)} listener Callback called whenever the value\n       *    of `watchExpression` changes.\n       *\n       *    - `newVal` contains the current value of the `watchExpression`\n       *    - `oldVal` contains the previous value of the `watchExpression`\n       *    - `scope` refers to the current scope\n       * @param {boolean=} [objectEquality=false] Compare for object equality using {@link angular.equals} instead of\n       *     comparing for reference equality.\n       * @returns {function()} Returns a deregistration function for this listener.\n       */\n      $watch: function(watchExp, listener, objectEquality, prettyPrintExpression) {\n        var get = $parse(watchExp);\n\n        if (get.$$watchDelegate) {\n          return get.$$watchDelegate(this, listener, objectEquality, get, watchExp);\n        }\n        var scope = this,\n            array = scope.$$watchers,\n            watcher = {\n              fn: listener,\n              last: initWatchVal,\n              get: get,\n              exp: prettyPrintExpression || watchExp,\n              eq: !!objectEquality\n            };\n\n        lastDirtyWatch = null;\n\n        if (!isFunction(listener)) {\n          watcher.fn = noop;\n        }\n\n        if (!array) {\n          array = scope.$$watchers = [];\n          array.$$digestWatchIndex = -1;\n        }\n        // we use unshift since we use a while loop in $digest for speed.\n        // the while loop reads in reverse order.\n        array.unshift(watcher);\n        array.$$digestWatchIndex++;\n        incrementWatchersCount(this, 1);\n\n        return function deregisterWatch() {\n          var index = arrayRemove(array, watcher);\n          if (index >= 0) {\n            incrementWatchersCount(scope, -1);\n            if (index < array.$$digestWatchIndex) {\n              array.$$digestWatchIndex--;\n            }\n          }\n          lastDirtyWatch = null;\n        };\n      },\n\n      /**\n       * @ngdoc method\n       * @name $rootScope.Scope#$watchGroup\n       * @kind function\n       *\n       * @description\n       * A variant of {@link ng.$rootScope.Scope#$watch $watch()} where it watches an array of `watchExpressions`.\n       * If any one expression in the collection changes the `listener` is executed.\n       *\n       * - The items in the `watchExpressions` array are observed via the standard `$watch` operation. Their return\n       *   values are examined for changes on every call to `$digest`.\n       * - The `listener` is called whenever any expression in the `watchExpressions` array changes.\n       *\n       * @param {Array.<string|Function(scope)>} watchExpressions Array of expressions that will be individually\n       * watched using {@link ng.$rootScope.Scope#$watch $watch()}\n       *\n       * @param {function(newValues, oldValues, scope)} listener Callback called whenever the return value of any\n       *    expression in `watchExpressions` changes\n       *    The `newValues` array contains the current values of the `watchExpressions`, with the indexes matching\n       *    those of `watchExpression`\n       *    and the `oldValues` array contains the previous values of the `watchExpressions`, with the indexes matching\n       *    those of `watchExpression`\n       *    The `scope` refers to the current scope.\n       * @returns {function()} Returns a de-registration function for all listeners.\n       */\n      $watchGroup: function(watchExpressions, listener) {\n        var oldValues = new Array(watchExpressions.length);\n        var newValues = new Array(watchExpressions.length);\n        var deregisterFns = [];\n        var self = this;\n        var changeReactionScheduled = false;\n        var firstRun = true;\n\n        if (!watchExpressions.length) {\n          // No expressions means we call the listener ASAP\n          var shouldCall = true;\n          self.$evalAsync(function() {\n            if (shouldCall) listener(newValues, newValues, self);\n          });\n          return function deregisterWatchGroup() {\n            shouldCall = false;\n          };\n        }\n\n        if (watchExpressions.length === 1) {\n          // Special case size of one\n          return this.$watch(watchExpressions[0], function watchGroupAction(value, oldValue, scope) {\n            newValues[0] = value;\n            oldValues[0] = oldValue;\n            listener(newValues, (value === oldValue) ? newValues : oldValues, scope);\n          });\n        }\n\n        forEach(watchExpressions, function(expr, i) {\n          var unwatchFn = self.$watch(expr, function watchGroupSubAction(value, oldValue) {\n            newValues[i] = value;\n            oldValues[i] = oldValue;\n            if (!changeReactionScheduled) {\n              changeReactionScheduled = true;\n              self.$evalAsync(watchGroupAction);\n            }\n          });\n          deregisterFns.push(unwatchFn);\n        });\n\n        function watchGroupAction() {\n          changeReactionScheduled = false;\n\n          if (firstRun) {\n            firstRun = false;\n            listener(newValues, newValues, self);\n          } else {\n            listener(newValues, oldValues, self);\n          }\n        }\n\n        return function deregisterWatchGroup() {\n          while (deregisterFns.length) {\n            deregisterFns.shift()();\n          }\n        };\n      },\n\n\n      /**\n       * @ngdoc method\n       * @name $rootScope.Scope#$watchCollection\n       * @kind function\n       *\n       * @description\n       * Shallow watches the properties of an object and fires whenever any of the properties change\n       * (for arrays, this implies watching the array items; for object maps, this implies watching\n       * the properties). If a change is detected, the `listener` callback is fired.\n       *\n       * - The `obj` collection is observed via standard $watch operation and is examined on every\n       *   call to $digest() to see if any items have been added, removed, or moved.\n       * - The `listener` is called whenever anything within the `obj` has changed. Examples include\n       *   adding, removing, and moving items belonging to an object or array.\n       *\n       *\n       * # Example\n       * ```js\n          $scope.names = ['igor', 'matias', 'misko', 'james'];\n          $scope.dataCount = 4;\n\n          $scope.$watchCollection('names', function(newNames, oldNames) {\n            $scope.dataCount = newNames.length;\n          });\n\n          expect($scope.dataCount).toEqual(4);\n          $scope.$digest();\n\n          //still at 4 ... no changes\n          expect($scope.dataCount).toEqual(4);\n\n          $scope.names.pop();\n          $scope.$digest();\n\n          //now there's been a change\n          expect($scope.dataCount).toEqual(3);\n       * ```\n       *\n       *\n       * @param {string|function(scope)} obj Evaluated as {@link guide/expression expression}. The\n       *    expression value should evaluate to an object or an array which is observed on each\n       *    {@link ng.$rootScope.Scope#$digest $digest} cycle. Any shallow change within the\n       *    collection will trigger a call to the `listener`.\n       *\n       * @param {function(newCollection, oldCollection, scope)} listener a callback function called\n       *    when a change is detected.\n       *    - The `newCollection` object is the newly modified data obtained from the `obj` expression\n       *    - The `oldCollection` object is a copy of the former collection data.\n       *      Due to performance considerations, the`oldCollection` value is computed only if the\n       *      `listener` function declares two or more arguments.\n       *    - The `scope` argument refers to the current scope.\n       *\n       * @returns {function()} Returns a de-registration function for this listener. When the\n       *    de-registration function is executed, the internal watch operation is terminated.\n       */\n      $watchCollection: function(obj, listener) {\n        $watchCollectionInterceptor.$stateful = true;\n\n        var self = this;\n        // the current value, updated on each dirty-check run\n        var newValue;\n        // a shallow copy of the newValue from the last dirty-check run,\n        // updated to match newValue during dirty-check run\n        var oldValue;\n        // a shallow copy of the newValue from when the last change happened\n        var veryOldValue;\n        // only track veryOldValue if the listener is asking for it\n        var trackVeryOldValue = (listener.length > 1);\n        var changeDetected = 0;\n        var changeDetector = $parse(obj, $watchCollectionInterceptor);\n        var internalArray = [];\n        var internalObject = {};\n        var initRun = true;\n        var oldLength = 0;\n\n        function $watchCollectionInterceptor(_value) {\n          newValue = _value;\n          var newLength, key, bothNaN, newItem, oldItem;\n\n          // If the new value is undefined, then return undefined as the watch may be a one-time watch\n          if (isUndefined(newValue)) return;\n\n          if (!isObject(newValue)) { // if primitive\n            if (oldValue !== newValue) {\n              oldValue = newValue;\n              changeDetected++;\n            }\n          } else if (isArrayLike(newValue)) {\n            if (oldValue !== internalArray) {\n              // we are transitioning from something which was not an array into array.\n              oldValue = internalArray;\n              oldLength = oldValue.length = 0;\n              changeDetected++;\n            }\n\n            newLength = newValue.length;\n\n            if (oldLength !== newLength) {\n              // if lengths do not match we need to trigger change notification\n              changeDetected++;\n              oldValue.length = oldLength = newLength;\n            }\n            // copy the items to oldValue and look for changes.\n            for (var i = 0; i < newLength; i++) {\n              oldItem = oldValue[i];\n              newItem = newValue[i];\n\n              // eslint-disable-next-line no-self-compare\n              bothNaN = (oldItem !== oldItem) && (newItem !== newItem);\n              if (!bothNaN && (oldItem !== newItem)) {\n                changeDetected++;\n                oldValue[i] = newItem;\n              }\n            }\n          } else {\n            if (oldValue !== internalObject) {\n              // we are transitioning from something which was not an object into object.\n              oldValue = internalObject = {};\n              oldLength = 0;\n              changeDetected++;\n            }\n            // copy the items to oldValue and look for changes.\n            newLength = 0;\n            for (key in newValue) {\n              if (hasOwnProperty.call(newValue, key)) {\n                newLength++;\n                newItem = newValue[key];\n                oldItem = oldValue[key];\n\n                if (key in oldValue) {\n                  // eslint-disable-next-line no-self-compare\n                  bothNaN = (oldItem !== oldItem) && (newItem !== newItem);\n                  if (!bothNaN && (oldItem !== newItem)) {\n                    changeDetected++;\n                    oldValue[key] = newItem;\n                  }\n                } else {\n                  oldLength++;\n                  oldValue[key] = newItem;\n                  changeDetected++;\n                }\n              }\n            }\n            if (oldLength > newLength) {\n              // we used to have more keys, need to find them and destroy them.\n              changeDetected++;\n              for (key in oldValue) {\n                if (!hasOwnProperty.call(newValue, key)) {\n                  oldLength--;\n                  delete oldValue[key];\n                }\n              }\n            }\n          }\n          return changeDetected;\n        }\n\n        function $watchCollectionAction() {\n          if (initRun) {\n            initRun = false;\n            listener(newValue, newValue, self);\n          } else {\n            listener(newValue, veryOldValue, self);\n          }\n\n          // make a copy for the next time a collection is changed\n          if (trackVeryOldValue) {\n            if (!isObject(newValue)) {\n              //primitive\n              veryOldValue = newValue;\n            } else if (isArrayLike(newValue)) {\n              veryOldValue = new Array(newValue.length);\n              for (var i = 0; i < newValue.length; i++) {\n                veryOldValue[i] = newValue[i];\n              }\n            } else { // if object\n              veryOldValue = {};\n              for (var key in newValue) {\n                if (hasOwnProperty.call(newValue, key)) {\n                  veryOldValue[key] = newValue[key];\n                }\n              }\n            }\n          }\n        }\n\n        return this.$watch(changeDetector, $watchCollectionAction);\n      },\n\n      /**\n       * @ngdoc method\n       * @name $rootScope.Scope#$digest\n       * @kind function\n       *\n       * @description\n       * Processes all of the {@link ng.$rootScope.Scope#$watch watchers} of the current scope and\n       * its children. Because a {@link ng.$rootScope.Scope#$watch watcher}'s listener can change\n       * the model, the `$digest()` keeps calling the {@link ng.$rootScope.Scope#$watch watchers}\n       * until no more listeners are firing. This means that it is possible to get into an infinite\n       * loop. This function will throw `'Maximum iteration limit exceeded.'` if the number of\n       * iterations exceeds 10.\n       *\n       * Usually, you don't call `$digest()` directly in\n       * {@link ng.directive:ngController controllers} or in\n       * {@link ng.$compileProvider#directive directives}.\n       * Instead, you should call {@link ng.$rootScope.Scope#$apply $apply()} (typically from within\n       * a {@link ng.$compileProvider#directive directive}), which will force a `$digest()`.\n       *\n       * If you want to be notified whenever `$digest()` is called,\n       * you can register a `watchExpression` function with\n       * {@link ng.$rootScope.Scope#$watch $watch()} with no `listener`.\n       *\n       * In unit tests, you may need to call `$digest()` to simulate the scope life cycle.\n       *\n       * # Example\n       * ```js\n           var scope = ...;\n           scope.name = 'misko';\n           scope.counter = 0;\n\n           expect(scope.counter).toEqual(0);\n           scope.$watch('name', function(newValue, oldValue) {\n             scope.counter = scope.counter + 1;\n           });\n           expect(scope.counter).toEqual(0);\n\n           scope.$digest();\n           // the listener is always called during the first $digest loop after it was registered\n           expect(scope.counter).toEqual(1);\n\n           scope.$digest();\n           // but now it will not be called unless the value changes\n           expect(scope.counter).toEqual(1);\n\n           scope.name = 'adam';\n           scope.$digest();\n           expect(scope.counter).toEqual(2);\n       * ```\n       *\n       */\n      $digest: function() {\n        var watch, value, last, fn, get,\n            watchers,\n            dirty, ttl = TTL,\n            next, current, target = this,\n            watchLog = [],\n            logIdx, asyncTask;\n\n        beginPhase('$digest');\n        // Check for changes to browser url that happened in sync before the call to $digest\n        $browser.$$checkUrlChange();\n\n        if (this === $rootScope && applyAsyncId !== null) {\n          // If this is the root scope, and $applyAsync has scheduled a deferred $apply(), then\n          // cancel the scheduled $apply and flush the queue of expressions to be evaluated.\n          $browser.defer.cancel(applyAsyncId);\n          flushApplyAsync();\n        }\n\n        lastDirtyWatch = null;\n\n        do { // \"while dirty\" loop\n          dirty = false;\n          current = target;\n\n          // It's safe for asyncQueuePosition to be a local variable here because this loop can't\n          // be reentered recursively. Calling $digest from a function passed to $evalAsync would\n          // lead to a '$digest already in progress' error.\n          for (var asyncQueuePosition = 0; asyncQueuePosition < asyncQueue.length; asyncQueuePosition++) {\n            try {\n              asyncTask = asyncQueue[asyncQueuePosition];\n              fn = asyncTask.fn;\n              fn(asyncTask.scope, asyncTask.locals);\n            } catch (e) {\n              $exceptionHandler(e);\n            }\n            lastDirtyWatch = null;\n          }\n          asyncQueue.length = 0;\n\n          traverseScopesLoop:\n          do { // \"traverse the scopes\" loop\n            if ((watchers = current.$$watchers)) {\n              // process our watches\n              watchers.$$digestWatchIndex = watchers.length;\n              while (watchers.$$digestWatchIndex--) {\n                try {\n                  watch = watchers[watchers.$$digestWatchIndex];\n                  // Most common watches are on primitives, in which case we can short\n                  // circuit it with === operator, only when === fails do we use .equals\n                  if (watch) {\n                    get = watch.get;\n                    if ((value = get(current)) !== (last = watch.last) &&\n                        !(watch.eq\n                            ? equals(value, last)\n                            : (isNumberNaN(value) && isNumberNaN(last)))) {\n                      dirty = true;\n                      lastDirtyWatch = watch;\n                      watch.last = watch.eq ? copy(value, null) : value;\n                      fn = watch.fn;\n                      fn(value, ((last === initWatchVal) ? value : last), current);\n                      if (ttl < 5) {\n                        logIdx = 4 - ttl;\n                        if (!watchLog[logIdx]) watchLog[logIdx] = [];\n                        watchLog[logIdx].push({\n                          msg: isFunction(watch.exp) ? 'fn: ' + (watch.exp.name || watch.exp.toString()) : watch.exp,\n                          newVal: value,\n                          oldVal: last\n                        });\n                      }\n                    } else if (watch === lastDirtyWatch) {\n                      // If the most recently dirty watcher is now clean, short circuit since the remaining watchers\n                      // have already been tested.\n                      dirty = false;\n                      break traverseScopesLoop;\n                    }\n                  }\n                } catch (e) {\n                  $exceptionHandler(e);\n                }\n              }\n            }\n\n            // Insanity Warning: scope depth-first traversal\n            // yes, this code is a bit crazy, but it works and we have tests to prove it!\n            // this piece should be kept in sync with the traversal in $broadcast\n            if (!(next = ((current.$$watchersCount && current.$$childHead) ||\n                (current !== target && current.$$nextSibling)))) {\n              while (current !== target && !(next = current.$$nextSibling)) {\n                current = current.$parent;\n              }\n            }\n          } while ((current = next));\n\n          // `break traverseScopesLoop;` takes us to here\n\n          if ((dirty || asyncQueue.length) && !(ttl--)) {\n            clearPhase();\n            throw $rootScopeMinErr('infdig',\n                '{0} $digest() iterations reached. Aborting!\\n' +\n                'Watchers fired in the last 5 iterations: {1}',\n                TTL, watchLog);\n          }\n\n        } while (dirty || asyncQueue.length);\n\n        clearPhase();\n\n        // postDigestQueuePosition isn't local here because this loop can be reentered recursively.\n        while (postDigestQueuePosition < postDigestQueue.length) {\n          try {\n            postDigestQueue[postDigestQueuePosition++]();\n          } catch (e) {\n            $exceptionHandler(e);\n          }\n        }\n        postDigestQueue.length = postDigestQueuePosition = 0;\n\n        // Check for changes to browser url that happened during the $digest\n        // (for which no event is fired; e.g. via `history.pushState()`)\n        $browser.$$checkUrlChange();\n      },\n\n\n      /**\n       * @ngdoc event\n       * @name $rootScope.Scope#$destroy\n       * @eventType broadcast on scope being destroyed\n       *\n       * @description\n       * Broadcasted when a scope and its children are being destroyed.\n       *\n       * Note that, in AngularJS, there is also a `$destroy` jQuery event, which can be used to\n       * clean up DOM bindings before an element is removed from the DOM.\n       */\n\n      /**\n       * @ngdoc method\n       * @name $rootScope.Scope#$destroy\n       * @kind function\n       *\n       * @description\n       * Removes the current scope (and all of its children) from the parent scope. Removal implies\n       * that calls to {@link ng.$rootScope.Scope#$digest $digest()} will no longer\n       * propagate to the current scope and its children. Removal also implies that the current\n       * scope is eligible for garbage collection.\n       *\n       * The `$destroy()` is usually used by directives such as\n       * {@link ng.directive:ngRepeat ngRepeat} for managing the\n       * unrolling of the loop.\n       *\n       * Just before a scope is destroyed, a `$destroy` event is broadcasted on this scope.\n       * Application code can register a `$destroy` event handler that will give it a chance to\n       * perform any necessary cleanup.\n       *\n       * Note that, in AngularJS, there is also a `$destroy` jQuery event, which can be used to\n       * clean up DOM bindings before an element is removed from the DOM.\n       */\n      $destroy: function() {\n        // We can't destroy a scope that has been already destroyed.\n        if (this.$$destroyed) return;\n        var parent = this.$parent;\n\n        this.$broadcast('$destroy');\n        this.$$destroyed = true;\n\n        if (this === $rootScope) {\n          //Remove handlers attached to window when $rootScope is removed\n          $browser.$$applicationDestroyed();\n        }\n\n        incrementWatchersCount(this, -this.$$watchersCount);\n        for (var eventName in this.$$listenerCount) {\n          decrementListenerCount(this, this.$$listenerCount[eventName], eventName);\n        }\n\n        // sever all the references to parent scopes (after this cleanup, the current scope should\n        // not be retained by any of our references and should be eligible for garbage collection)\n        if (parent && parent.$$childHead === this) parent.$$childHead = this.$$nextSibling;\n        if (parent && parent.$$childTail === this) parent.$$childTail = this.$$prevSibling;\n        if (this.$$prevSibling) this.$$prevSibling.$$nextSibling = this.$$nextSibling;\n        if (this.$$nextSibling) this.$$nextSibling.$$prevSibling = this.$$prevSibling;\n\n        // Disable listeners, watchers and apply/digest methods\n        this.$destroy = this.$digest = this.$apply = this.$evalAsync = this.$applyAsync = noop;\n        this.$on = this.$watch = this.$watchGroup = function() { return noop; };\n        this.$$listeners = {};\n\n        // Disconnect the next sibling to prevent `cleanUpScope` destroying those too\n        this.$$nextSibling = null;\n        cleanUpScope(this);\n      },\n\n      /**\n       * @ngdoc method\n       * @name $rootScope.Scope#$eval\n       * @kind function\n       *\n       * @description\n       * Executes the `expression` on the current scope and returns the result. Any exceptions in\n       * the expression are propagated (uncaught). This is useful when evaluating Angular\n       * expressions.\n       *\n       * # Example\n       * ```js\n           var scope = ng.$rootScope.Scope();\n           scope.a = 1;\n           scope.b = 2;\n\n           expect(scope.$eval('a+b')).toEqual(3);\n           expect(scope.$eval(function(scope){ return scope.a + scope.b; })).toEqual(3);\n       * ```\n       *\n       * @param {(string|function())=} expression An angular expression to be executed.\n       *\n       *    - `string`: execute using the rules as defined in  {@link guide/expression expression}.\n       *    - `function(scope)`: execute the function with the current `scope` parameter.\n       *\n       * @param {(object)=} locals Local variables object, useful for overriding values in scope.\n       * @returns {*} The result of evaluating the expression.\n       */\n      $eval: function(expr, locals) {\n        return $parse(expr)(this, locals);\n      },\n\n      /**\n       * @ngdoc method\n       * @name $rootScope.Scope#$evalAsync\n       * @kind function\n       *\n       * @description\n       * Executes the expression on the current scope at a later point in time.\n       *\n       * The `$evalAsync` makes no guarantees as to when the `expression` will be executed, only\n       * that:\n       *\n       *   - it will execute after the function that scheduled the evaluation (preferably before DOM\n       *     rendering).\n       *   - at least one {@link ng.$rootScope.Scope#$digest $digest cycle} will be performed after\n       *     `expression` execution.\n       *\n       * Any exceptions from the execution of the expression are forwarded to the\n       * {@link ng.$exceptionHandler $exceptionHandler} service.\n       *\n       * __Note:__ if this function is called outside of a `$digest` cycle, a new `$digest` cycle\n       * will be scheduled. However, it is encouraged to always call code that changes the model\n       * from within an `$apply` call. That includes code evaluated via `$evalAsync`.\n       *\n       * @param {(string|function())=} expression An angular expression to be executed.\n       *\n       *    - `string`: execute using the rules as defined in {@link guide/expression expression}.\n       *    - `function(scope)`: execute the function with the current `scope` parameter.\n       *\n       * @param {(object)=} locals Local variables object, useful for overriding values in scope.\n       */\n      $evalAsync: function(expr, locals) {\n        // if we are outside of an $digest loop and this is the first time we are scheduling async\n        // task also schedule async auto-flush\n        if (!$rootScope.$$phase && !asyncQueue.length) {\n          $browser.defer(function() {\n            if (asyncQueue.length) {\n              $rootScope.$digest();\n            }\n          });\n        }\n\n        asyncQueue.push({scope: this, fn: $parse(expr), locals: locals});\n      },\n\n      $$postDigest: function(fn) {\n        postDigestQueue.push(fn);\n      },\n\n      /**\n       * @ngdoc method\n       * @name $rootScope.Scope#$apply\n       * @kind function\n       *\n       * @description\n       * `$apply()` is used to execute an expression in angular from outside of the angular\n       * framework. (For example from browser DOM events, setTimeout, XHR or third party libraries).\n       * Because we are calling into the angular framework we need to perform proper scope life\n       * cycle of {@link ng.$exceptionHandler exception handling},\n       * {@link ng.$rootScope.Scope#$digest executing watches}.\n       *\n       * ## Life cycle\n       *\n       * # Pseudo-Code of `$apply()`\n       * ```js\n           function $apply(expr) {\n             try {\n               return $eval(expr);\n             } catch (e) {\n               $exceptionHandler(e);\n             } finally {\n               $root.$digest();\n             }\n           }\n       * ```\n       *\n       *\n       * Scope's `$apply()` method transitions through the following stages:\n       *\n       * 1. The {@link guide/expression expression} is executed using the\n       *    {@link ng.$rootScope.Scope#$eval $eval()} method.\n       * 2. Any exceptions from the execution of the expression are forwarded to the\n       *    {@link ng.$exceptionHandler $exceptionHandler} service.\n       * 3. The {@link ng.$rootScope.Scope#$watch watch} listeners are fired immediately after the\n       *    expression was executed using the {@link ng.$rootScope.Scope#$digest $digest()} method.\n       *\n       *\n       * @param {(string|function())=} exp An angular expression to be executed.\n       *\n       *    - `string`: execute using the rules as defined in {@link guide/expression expression}.\n       *    - `function(scope)`: execute the function with current `scope` parameter.\n       *\n       * @returns {*} The result of evaluating the expression.\n       */\n      $apply: function(expr) {\n        try {\n          beginPhase('$apply');\n          try {\n            return this.$eval(expr);\n          } finally {\n            clearPhase();\n          }\n        } catch (e) {\n          $exceptionHandler(e);\n        } finally {\n          try {\n            $rootScope.$digest();\n          } catch (e) {\n            $exceptionHandler(e);\n            // eslint-disable-next-line no-unsafe-finally\n            throw e;\n          }\n        }\n      },\n\n      /**\n       * @ngdoc method\n       * @name $rootScope.Scope#$applyAsync\n       * @kind function\n       *\n       * @description\n       * Schedule the invocation of $apply to occur at a later time. The actual time difference\n       * varies across browsers, but is typically around ~10 milliseconds.\n       *\n       * This can be used to queue up multiple expressions which need to be evaluated in the same\n       * digest.\n       *\n       * @param {(string|function())=} exp An angular expression to be executed.\n       *\n       *    - `string`: execute using the rules as defined in {@link guide/expression expression}.\n       *    - `function(scope)`: execute the function with current `scope` parameter.\n       */\n      $applyAsync: function(expr) {\n        var scope = this;\n        if (expr) {\n          applyAsyncQueue.push($applyAsyncExpression);\n        }\n        expr = $parse(expr);\n        scheduleApplyAsync();\n\n        function $applyAsyncExpression() {\n          scope.$eval(expr);\n        }\n      },\n\n      /**\n       * @ngdoc method\n       * @name $rootScope.Scope#$on\n       * @kind function\n       *\n       * @description\n       * Listens on events of a given type. See {@link ng.$rootScope.Scope#$emit $emit} for\n       * discussion of event life cycle.\n       *\n       * The event listener function format is: `function(event, args...)`. The `event` object\n       * passed into the listener has the following attributes:\n       *\n       *   - `targetScope` - `{Scope}`: the scope on which the event was `$emit`-ed or\n       *     `$broadcast`-ed.\n       *   - `currentScope` - `{Scope}`: the scope that is currently handling the event. Once the\n       *     event propagates through the scope hierarchy, this property is set to null.\n       *   - `name` - `{string}`: name of the event.\n       *   - `stopPropagation` - `{function=}`: calling `stopPropagation` function will cancel\n       *     further event propagation (available only for events that were `$emit`-ed).\n       *   - `preventDefault` - `{function}`: calling `preventDefault` sets `defaultPrevented` flag\n       *     to true.\n       *   - `defaultPrevented` - `{boolean}`: true if `preventDefault` was called.\n       *\n       * @param {string} name Event name to listen on.\n       * @param {function(event, ...args)} listener Function to call when the event is emitted.\n       * @returns {function()} Returns a deregistration function for this listener.\n       */\n      $on: function(name, listener) {\n        var namedListeners = this.$$listeners[name];\n        if (!namedListeners) {\n          this.$$listeners[name] = namedListeners = [];\n        }\n        namedListeners.push(listener);\n\n        var current = this;\n        do {\n          if (!current.$$listenerCount[name]) {\n            current.$$listenerCount[name] = 0;\n          }\n          current.$$listenerCount[name]++;\n        } while ((current = current.$parent));\n\n        var self = this;\n        return function() {\n          var indexOfListener = namedListeners.indexOf(listener);\n          if (indexOfListener !== -1) {\n            namedListeners[indexOfListener] = null;\n            decrementListenerCount(self, 1, name);\n          }\n        };\n      },\n\n\n      /**\n       * @ngdoc method\n       * @name $rootScope.Scope#$emit\n       * @kind function\n       *\n       * @description\n       * Dispatches an event `name` upwards through the scope hierarchy notifying the\n       * registered {@link ng.$rootScope.Scope#$on} listeners.\n       *\n       * The event life cycle starts at the scope on which `$emit` was called. All\n       * {@link ng.$rootScope.Scope#$on listeners} listening for `name` event on this scope get\n       * notified. Afterwards, the event traverses upwards toward the root scope and calls all\n       * registered listeners along the way. The event will stop propagating if one of the listeners\n       * cancels it.\n       *\n       * Any exception emitted from the {@link ng.$rootScope.Scope#$on listeners} will be passed\n       * onto the {@link ng.$exceptionHandler $exceptionHandler} service.\n       *\n       * @param {string} name Event name to emit.\n       * @param {...*} args Optional one or more arguments which will be passed onto the event listeners.\n       * @return {Object} Event object (see {@link ng.$rootScope.Scope#$on}).\n       */\n      $emit: function(name, args) {\n        var empty = [],\n            namedListeners,\n            scope = this,\n            stopPropagation = false,\n            event = {\n              name: name,\n              targetScope: scope,\n              stopPropagation: function() {stopPropagation = true;},\n              preventDefault: function() {\n                event.defaultPrevented = true;\n              },\n              defaultPrevented: false\n            },\n            listenerArgs = concat([event], arguments, 1),\n            i, length;\n\n        do {\n          namedListeners = scope.$$listeners[name] || empty;\n          event.currentScope = scope;\n          for (i = 0, length = namedListeners.length; i < length; i++) {\n\n            // if listeners were deregistered, defragment the array\n            if (!namedListeners[i]) {\n              namedListeners.splice(i, 1);\n              i--;\n              length--;\n              continue;\n            }\n            try {\n              //allow all listeners attached to the current scope to run\n              namedListeners[i].apply(null, listenerArgs);\n            } catch (e) {\n              $exceptionHandler(e);\n            }\n          }\n          //if any listener on the current scope stops propagation, prevent bubbling\n          if (stopPropagation) {\n            event.currentScope = null;\n            return event;\n          }\n          //traverse upwards\n          scope = scope.$parent;\n        } while (scope);\n\n        event.currentScope = null;\n\n        return event;\n      },\n\n\n      /**\n       * @ngdoc method\n       * @name $rootScope.Scope#$broadcast\n       * @kind function\n       *\n       * @description\n       * Dispatches an event `name` downwards to all child scopes (and their children) notifying the\n       * registered {@link ng.$rootScope.Scope#$on} listeners.\n       *\n       * The event life cycle starts at the scope on which `$broadcast` was called. All\n       * {@link ng.$rootScope.Scope#$on listeners} listening for `name` event on this scope get\n       * notified. Afterwards, the event propagates to all direct and indirect scopes of the current\n       * scope and calls all registered listeners along the way. The event cannot be canceled.\n       *\n       * Any exception emitted from the {@link ng.$rootScope.Scope#$on listeners} will be passed\n       * onto the {@link ng.$exceptionHandler $exceptionHandler} service.\n       *\n       * @param {string} name Event name to broadcast.\n       * @param {...*} args Optional one or more arguments which will be passed onto the event listeners.\n       * @return {Object} Event object, see {@link ng.$rootScope.Scope#$on}\n       */\n      $broadcast: function(name, args) {\n        var target = this,\n            current = target,\n            next = target,\n            event = {\n              name: name,\n              targetScope: target,\n              preventDefault: function() {\n                event.defaultPrevented = true;\n              },\n              defaultPrevented: false\n            };\n\n        if (!target.$$listenerCount[name]) return event;\n\n        var listenerArgs = concat([event], arguments, 1),\n            listeners, i, length;\n\n        //down while you can, then up and next sibling or up and next sibling until back at root\n        while ((current = next)) {\n          event.currentScope = current;\n          listeners = current.$$listeners[name] || [];\n          for (i = 0, length = listeners.length; i < length; i++) {\n            // if listeners were deregistered, defragment the array\n            if (!listeners[i]) {\n              listeners.splice(i, 1);\n              i--;\n              length--;\n              continue;\n            }\n\n            try {\n              listeners[i].apply(null, listenerArgs);\n            } catch (e) {\n              $exceptionHandler(e);\n            }\n          }\n\n          // Insanity Warning: scope depth-first traversal\n          // yes, this code is a bit crazy, but it works and we have tests to prove it!\n          // this piece should be kept in sync with the traversal in $digest\n          // (though it differs due to having the extra check for $$listenerCount)\n          if (!(next = ((current.$$listenerCount[name] && current.$$childHead) ||\n              (current !== target && current.$$nextSibling)))) {\n            while (current !== target && !(next = current.$$nextSibling)) {\n              current = current.$parent;\n            }\n          }\n        }\n\n        event.currentScope = null;\n        return event;\n      }\n    };\n\n    var $rootScope = new Scope();\n\n    //The internal queues. Expose them on the $rootScope for debugging/testing purposes.\n    var asyncQueue = $rootScope.$$asyncQueue = [];\n    var postDigestQueue = $rootScope.$$postDigestQueue = [];\n    var applyAsyncQueue = $rootScope.$$applyAsyncQueue = [];\n\n    var postDigestQueuePosition = 0;\n\n    return $rootScope;\n\n\n    function beginPhase(phase) {\n      if ($rootScope.$$phase) {\n        throw $rootScopeMinErr('inprog', '{0} already in progress', $rootScope.$$phase);\n      }\n\n      $rootScope.$$phase = phase;\n    }\n\n    function clearPhase() {\n      $rootScope.$$phase = null;\n    }\n\n    function incrementWatchersCount(current, count) {\n      do {\n        current.$$watchersCount += count;\n      } while ((current = current.$parent));\n    }\n\n    function decrementListenerCount(current, count, name) {\n      do {\n        current.$$listenerCount[name] -= count;\n\n        if (current.$$listenerCount[name] === 0) {\n          delete current.$$listenerCount[name];\n        }\n      } while ((current = current.$parent));\n    }\n\n    /**\n     * function used as an initial value for watchers.\n     * because it's unique we can easily tell it apart from other values\n     */\n    function initWatchVal() {}\n\n    function flushApplyAsync() {\n      while (applyAsyncQueue.length) {\n        try {\n          applyAsyncQueue.shift()();\n        } catch (e) {\n          $exceptionHandler(e);\n        }\n      }\n      applyAsyncId = null;\n    }\n\n    function scheduleApplyAsync() {\n      if (applyAsyncId === null) {\n        applyAsyncId = $browser.defer(function() {\n          $rootScope.$apply(flushApplyAsync);\n        });\n      }\n    }\n  }];\n}\n\n/**\n * @ngdoc service\n * @name $rootElement\n *\n * @description\n * The root element of Angular application. This is either the element where {@link\n * ng.directive:ngApp ngApp} was declared or the element passed into\n * {@link angular.bootstrap}. The element represents the root element of application. It is also the\n * location where the application's {@link auto.$injector $injector} service gets\n * published, and can be retrieved using `$rootElement.injector()`.\n */\n\n\n// the implementation is in angular.bootstrap\n\n/**\n * @this\n * @description\n * Private service to sanitize uris for links and images. Used by $compile and $sanitize.\n */\nfunction $$SanitizeUriProvider() {\n  var aHrefSanitizationWhitelist = /^\\s*(https?|ftp|mailto|tel|file):/,\n    imgSrcSanitizationWhitelist = /^\\s*((https?|ftp|file|blob):|data:image\\/)/;\n\n  /**\n   * @description\n   * Retrieves or overrides the default regular expression that is used for whitelisting of safe\n   * urls during a[href] sanitization.\n   *\n   * The sanitization is a security measure aimed at prevent XSS attacks via html links.\n   *\n   * Any url about to be assigned to a[href] via data-binding is first normalized and turned into\n   * an absolute url. Afterwards, the url is matched against the `aHrefSanitizationWhitelist`\n   * regular expression. If a match is found, the original url is written into the dom. Otherwise,\n   * the absolute url is prefixed with `'unsafe:'` string and only then is it written into the DOM.\n   *\n   * @param {RegExp=} regexp New regexp to whitelist urls with.\n   * @returns {RegExp|ng.$compileProvider} Current RegExp if called without value or self for\n   *    chaining otherwise.\n   */\n  this.aHrefSanitizationWhitelist = function(regexp) {\n    if (isDefined(regexp)) {\n      aHrefSanitizationWhitelist = regexp;\n      return this;\n    }\n    return aHrefSanitizationWhitelist;\n  };\n\n\n  /**\n   * @description\n   * Retrieves or overrides the default regular expression that is used for whitelisting of safe\n   * urls during img[src] sanitization.\n   *\n   * The sanitization is a security measure aimed at prevent XSS attacks via html links.\n   *\n   * Any url about to be assigned to img[src] via data-binding is first normalized and turned into\n   * an absolute url. Afterwards, the url is matched against the `imgSrcSanitizationWhitelist`\n   * regular expression. If a match is found, the original url is written into the dom. Otherwise,\n   * the absolute url is prefixed with `'unsafe:'` string and only then is it written into the DOM.\n   *\n   * @param {RegExp=} regexp New regexp to whitelist urls with.\n   * @returns {RegExp|ng.$compileProvider} Current RegExp if called without value or self for\n   *    chaining otherwise.\n   */\n  this.imgSrcSanitizationWhitelist = function(regexp) {\n    if (isDefined(regexp)) {\n      imgSrcSanitizationWhitelist = regexp;\n      return this;\n    }\n    return imgSrcSanitizationWhitelist;\n  };\n\n  this.$get = function() {\n    return function sanitizeUri(uri, isImage) {\n      var regex = isImage ? imgSrcSanitizationWhitelist : aHrefSanitizationWhitelist;\n      var normalizedVal;\n      normalizedVal = urlResolve(uri).href;\n      if (normalizedVal !== '' && !normalizedVal.match(regex)) {\n        return 'unsafe:' + normalizedVal;\n      }\n      return uri;\n    };\n  };\n}\n\n/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *\n *     Any commits to this file should be reviewed with security in mind.  *\n *   Changes to this file can potentially create security vulnerabilities. *\n *          An approval from 2 Core members with history of modifying      *\n *                         this file is required.                          *\n *                                                                         *\n *  Does the change somehow allow for arbitrary javascript to be executed? *\n *    Or allows for someone to change the prototype of built-in objects?   *\n *     Or gives undesired access to variables likes document or window?    *\n * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */\n\n/* exported $SceProvider, $SceDelegateProvider */\n\nvar $sceMinErr = minErr('$sce');\n\nvar SCE_CONTEXTS = {\n  // HTML is used when there's HTML rendered (e.g. ng-bind-html, iframe srcdoc binding).\n  HTML: 'html',\n\n  // Style statements or stylesheets. Currently unused in AngularJS.\n  CSS: 'css',\n\n  // An URL used in a context where it does not refer to a resource that loads code. Currently\n  // unused in AngularJS.\n  URL: 'url',\n\n  // RESOURCE_URL is a subtype of URL used where the referred-to resource could be interpreted as\n  // code. (e.g. ng-include, script src binding, templateUrl)\n  RESOURCE_URL: 'resourceUrl',\n\n  // Script. Currently unused in AngularJS.\n  JS: 'js'\n};\n\n// Helper functions follow.\n\nvar UNDERSCORE_LOWERCASE_REGEXP = /_([a-z])/g;\n\nfunction snakeToCamel(name) {\n  return name\n    .replace(UNDERSCORE_LOWERCASE_REGEXP, fnCamelCaseReplace);\n}\n\nfunction adjustMatcher(matcher) {\n  if (matcher === 'self') {\n    return matcher;\n  } else if (isString(matcher)) {\n    // Strings match exactly except for 2 wildcards - '*' and '**'.\n    // '*' matches any character except those from the set ':/.?&'.\n    // '**' matches any character (like .* in a RegExp).\n    // More than 2 *'s raises an error as it's ill defined.\n    if (matcher.indexOf('***') > -1) {\n      throw $sceMinErr('iwcard',\n          'Illegal sequence *** in string matcher.  String: {0}', matcher);\n    }\n    matcher = escapeForRegexp(matcher).\n                  replace(/\\\\\\*\\\\\\*/g, '.*').\n                  replace(/\\\\\\*/g, '[^:/.?&;]*');\n    return new RegExp('^' + matcher + '$');\n  } else if (isRegExp(matcher)) {\n    // The only other type of matcher allowed is a Regexp.\n    // Match entire URL / disallow partial matches.\n    // Flags are reset (i.e. no global, ignoreCase or multiline)\n    return new RegExp('^' + matcher.source + '$');\n  } else {\n    throw $sceMinErr('imatcher',\n        'Matchers may only be \"self\", string patterns or RegExp objects');\n  }\n}\n\n\nfunction adjustMatchers(matchers) {\n  var adjustedMatchers = [];\n  if (isDefined(matchers)) {\n    forEach(matchers, function(matcher) {\n      adjustedMatchers.push(adjustMatcher(matcher));\n    });\n  }\n  return adjustedMatchers;\n}\n\n\n/**\n * @ngdoc service\n * @name $sceDelegate\n * @kind function\n *\n * @description\n *\n * `$sceDelegate` is a service that is used by the `$sce` service to provide {@link ng.$sce Strict\n * Contextual Escaping (SCE)} services to AngularJS.\n *\n * For an overview of this service and the functionnality it provides in AngularJS, see the main\n * page for {@link ng.$sce SCE}. The current page is targeted for developers who need to alter how\n * SCE works in their application, which shouldn't be needed in most cases.\n *\n * <div class=\"alert alert-danger\">\n * AngularJS strongly relies on contextual escaping for the security of bindings: disabling or\n * modifying this might cause cross site scripting (XSS) vulnerabilities. For libraries owners,\n * changes to this service will also influence users, so be extra careful and document your changes.\n * </div>\n *\n * Typically, you would configure or override the {@link ng.$sceDelegate $sceDelegate} instead of\n * the `$sce` service to customize the way Strict Contextual Escaping works in AngularJS.  This is\n * because, while the `$sce` provides numerous shorthand methods, etc., you really only need to\n * override 3 core functions (`trustAs`, `getTrusted` and `valueOf`) to replace the way things\n * work because `$sce` delegates to `$sceDelegate` for these operations.\n *\n * Refer {@link ng.$sceDelegateProvider $sceDelegateProvider} to configure this service.\n *\n * The default instance of `$sceDelegate` should work out of the box with little pain.  While you\n * can override it completely to change the behavior of `$sce`, the common case would\n * involve configuring the {@link ng.$sceDelegateProvider $sceDelegateProvider} instead by setting\n * your own whitelists and blacklists for trusting URLs used for loading AngularJS resources such as\n * templates.  Refer {@link ng.$sceDelegateProvider#resourceUrlWhitelist\n * $sceDelegateProvider.resourceUrlWhitelist} and {@link\n * ng.$sceDelegateProvider#resourceUrlBlacklist $sceDelegateProvider.resourceUrlBlacklist}\n */\n\n/**\n * @ngdoc provider\n * @name $sceDelegateProvider\n * @this\n *\n * @description\n *\n * The `$sceDelegateProvider` provider allows developers to configure the {@link ng.$sceDelegate\n * $sceDelegate service}, used as a delegate for {@link ng.$sce Strict Contextual Escaping (SCE)}.\n *\n * The `$sceDelegateProvider` allows one to get/set the whitelists and blacklists used to ensure\n * that the URLs used for sourcing AngularJS templates and other script-running URLs are safe (all\n * places that use the `$sce.RESOURCE_URL` context). See\n * {@link ng.$sceDelegateProvider#resourceUrlWhitelist $sceDelegateProvider.resourceUrlWhitelist}\n * and\n * {@link ng.$sceDelegateProvider#resourceUrlBlacklist $sceDelegateProvider.resourceUrlBlacklist},\n *\n * For the general details about this service in Angular, read the main page for {@link ng.$sce\n * Strict Contextual Escaping (SCE)}.\n *\n * **Example**:  Consider the following case. <a name=\"example\"></a>\n *\n * - your app is hosted at url `http://myapp.example.com/`\n * - but some of your templates are hosted on other domains you control such as\n *   `http://srv01.assets.example.com/`, `http://srv02.assets.example.com/`, etc.\n * - and you have an open redirect at `http://myapp.example.com/clickThru?...`.\n *\n * Here is what a secure configuration for this scenario might look like:\n *\n * ```\n *  angular.module('myApp', []).config(function($sceDelegateProvider) {\n *    $sceDelegateProvider.resourceUrlWhitelist([\n *      // Allow same origin resource loads.\n *      'self',\n *      // Allow loading from our assets domain.  Notice the difference between * and **.\n *      'http://srv*.assets.example.com/**'\n *    ]);\n *\n *    // The blacklist overrides the whitelist so the open redirect here is blocked.\n *    $sceDelegateProvider.resourceUrlBlacklist([\n *      'http://myapp.example.com/clickThru**'\n *    ]);\n *  });\n * ```\n * Note that an empty whitelist will block every resource URL from being loaded, and will require\n * you to manually mark each one as trusted with `$sce.trustAsResourceUrl`. However, templates\n * requested by {@link ng.$templateRequest $templateRequest} that are present in\n * {@link ng.$templateCache $templateCache} will not go through this check. If you have a mechanism\n * to populate your templates in that cache at config time, then it is a good idea to remove 'self'\n * from that whitelist. This helps to mitigate the security impact of certain types of issues, like\n * for instance attacker-controlled `ng-includes`.\n */\n\nfunction $SceDelegateProvider() {\n  this.SCE_CONTEXTS = SCE_CONTEXTS;\n\n  // Resource URLs can also be trusted by policy.\n  var resourceUrlWhitelist = ['self'],\n      resourceUrlBlacklist = [];\n\n  /**\n   * @ngdoc method\n   * @name $sceDelegateProvider#resourceUrlWhitelist\n   * @kind function\n   *\n   * @param {Array=} whitelist When provided, replaces the resourceUrlWhitelist with the value\n   *     provided.  This must be an array or null.  A snapshot of this array is used so further\n   *     changes to the array are ignored.\n   *     Follow {@link ng.$sce#resourceUrlPatternItem this link} for a description of the items\n   *     allowed in this array.\n   *\n   * @return {Array} The currently set whitelist array.\n   *\n   * @description\n   * Sets/Gets the whitelist of trusted resource URLs.\n   *\n   * The **default value** when no whitelist has been explicitly set is `['self']` allowing only\n   * same origin resource requests.\n   *\n   * <div class=\"alert alert-warning\">\n   * **Note:** the default whitelist of 'self' is not recommended if your app shares its origin\n   * with other apps! It is a good idea to limit it to only your application's directory.\n   * </div>\n   */\n  this.resourceUrlWhitelist = function(value) {\n    if (arguments.length) {\n      resourceUrlWhitelist = adjustMatchers(value);\n    }\n    return resourceUrlWhitelist;\n  };\n\n  /**\n   * @ngdoc method\n   * @name $sceDelegateProvider#resourceUrlBlacklist\n   * @kind function\n   *\n   * @param {Array=} blacklist When provided, replaces the resourceUrlBlacklist with the value\n   *     provided.  This must be an array or null.  A snapshot of this array is used so further\n   *     changes to the array are ignored.</p><p>\n   *     Follow {@link ng.$sce#resourceUrlPatternItem this link} for a description of the items\n   *     allowed in this array.</p><p>\n   *     The typical usage for the blacklist is to **block\n   *     [open redirects](http://cwe.mitre.org/data/definitions/601.html)** served by your domain as\n   *     these would otherwise be trusted but actually return content from the redirected domain.\n   *     </p><p>\n   *     Finally, **the blacklist overrides the whitelist** and has the final say.\n   *\n   * @return {Array} The currently set blacklist array.\n   *\n   * @description\n   * Sets/Gets the blacklist of trusted resource URLs.\n   *\n   * The **default value** when no whitelist has been explicitly set is the empty array (i.e. there\n   * is no blacklist.)\n   */\n\n  this.resourceUrlBlacklist = function(value) {\n    if (arguments.length) {\n      resourceUrlBlacklist = adjustMatchers(value);\n    }\n    return resourceUrlBlacklist;\n  };\n\n  this.$get = ['$injector', function($injector) {\n\n    var htmlSanitizer = function htmlSanitizer(html) {\n      throw $sceMinErr('unsafe', 'Attempting to use an unsafe value in a safe context.');\n    };\n\n    if ($injector.has('$sanitize')) {\n      htmlSanitizer = $injector.get('$sanitize');\n    }\n\n\n    function matchUrl(matcher, parsedUrl) {\n      if (matcher === 'self') {\n        return urlIsSameOrigin(parsedUrl);\n      } else {\n        // definitely a regex.  See adjustMatchers()\n        return !!matcher.exec(parsedUrl.href);\n      }\n    }\n\n    function isResourceUrlAllowedByPolicy(url) {\n      var parsedUrl = urlResolve(url.toString());\n      var i, n, allowed = false;\n      // Ensure that at least one item from the whitelist allows this url.\n      for (i = 0, n = resourceUrlWhitelist.length; i < n; i++) {\n        if (matchUrl(resourceUrlWhitelist[i], parsedUrl)) {\n          allowed = true;\n          break;\n        }\n      }\n      if (allowed) {\n        // Ensure that no item from the blacklist blocked this url.\n        for (i = 0, n = resourceUrlBlacklist.length; i < n; i++) {\n          if (matchUrl(resourceUrlBlacklist[i], parsedUrl)) {\n            allowed = false;\n            break;\n          }\n        }\n      }\n      return allowed;\n    }\n\n    function generateHolderType(Base) {\n      var holderType = function TrustedValueHolderType(trustedValue) {\n        this.$$unwrapTrustedValue = function() {\n          return trustedValue;\n        };\n      };\n      if (Base) {\n        holderType.prototype = new Base();\n      }\n      holderType.prototype.valueOf = function sceValueOf() {\n        return this.$$unwrapTrustedValue();\n      };\n      holderType.prototype.toString = function sceToString() {\n        return this.$$unwrapTrustedValue().toString();\n      };\n      return holderType;\n    }\n\n    var trustedValueHolderBase = generateHolderType(),\n        byType = {};\n\n    byType[SCE_CONTEXTS.HTML] = generateHolderType(trustedValueHolderBase);\n    byType[SCE_CONTEXTS.CSS] = generateHolderType(trustedValueHolderBase);\n    byType[SCE_CONTEXTS.URL] = generateHolderType(trustedValueHolderBase);\n    byType[SCE_CONTEXTS.JS] = generateHolderType(trustedValueHolderBase);\n    byType[SCE_CONTEXTS.RESOURCE_URL] = generateHolderType(byType[SCE_CONTEXTS.URL]);\n\n    /**\n     * @ngdoc method\n     * @name $sceDelegate#trustAs\n     *\n     * @description\n     * Returns a trusted representation of the parameter for the specified context. This trusted\n     * object will later on be used as-is, without any security check, by bindings or directives\n     * that require this security context.\n     * For instance, marking a string as trusted for the `$sce.HTML` context will entirely bypass\n     * the potential `$sanitize` call in corresponding `$sce.HTML` bindings or directives, such as\n     * `ng-bind-html`. Note that in most cases you won't need to call this function: if you have the\n     * sanitizer loaded, passing the value itself will render all the HTML that does not pose a\n     * security risk.\n     *\n     * See {@link ng.$sceDelegate#getTrusted getTrusted} for the function that will consume those\n     * trusted values, and {@link ng.$sce $sce} for general documentation about strict contextual\n     * escaping.\n     *\n     * @param {string} type The context in which this value is safe for use, e.g. `$sce.URL`,\n     *     `$sce.RESOURCE_URL`, `$sce.HTML`, `$sce.JS` or `$sce.CSS`.\n     *\n     * @param {*} value The value that should be considered trusted.\n     * @return {*} A trusted representation of value, that can be used in the given context.\n     */\n    function trustAs(type, trustedValue) {\n      var Constructor = (byType.hasOwnProperty(type) ? byType[type] : null);\n      if (!Constructor) {\n        throw $sceMinErr('icontext',\n            'Attempted to trust a value in invalid context. Context: {0}; Value: {1}',\n            type, trustedValue);\n      }\n      if (trustedValue === null || isUndefined(trustedValue) || trustedValue === '') {\n        return trustedValue;\n      }\n      // All the current contexts in SCE_CONTEXTS happen to be strings.  In order to avoid trusting\n      // mutable objects, we ensure here that the value passed in is actually a string.\n      if (typeof trustedValue !== 'string') {\n        throw $sceMinErr('itype',\n            'Attempted to trust a non-string value in a content requiring a string: Context: {0}',\n            type);\n      }\n      return new Constructor(trustedValue);\n    }\n\n    /**\n     * @ngdoc method\n     * @name $sceDelegate#valueOf\n     *\n     * @description\n     * If the passed parameter had been returned by a prior call to {@link ng.$sceDelegate#trustAs\n     * `$sceDelegate.trustAs`}, returns the value that had been passed to {@link\n     * ng.$sceDelegate#trustAs `$sceDelegate.trustAs`}.\n     *\n     * If the passed parameter is not a value that had been returned by {@link\n     * ng.$sceDelegate#trustAs `$sceDelegate.trustAs`}, it must be returned as-is.\n     *\n     * @param {*} value The result of a prior {@link ng.$sceDelegate#trustAs `$sceDelegate.trustAs`}\n     *     call or anything else.\n     * @return {*} The `value` that was originally provided to {@link ng.$sceDelegate#trustAs\n     *     `$sceDelegate.trustAs`} if `value` is the result of such a call.  Otherwise, returns\n     *     `value` unchanged.\n     */\n    function valueOf(maybeTrusted) {\n      if (maybeTrusted instanceof trustedValueHolderBase) {\n        return maybeTrusted.$$unwrapTrustedValue();\n      } else {\n        return maybeTrusted;\n      }\n    }\n\n    /**\n     * @ngdoc method\n     * @name $sceDelegate#getTrusted\n     *\n     * @description\n     * Takes any input, and either returns a value that's safe to use in the specified context, or\n     * throws an exception.\n     *\n     * In practice, there are several cases. When given a string, this function runs checks\n     * and sanitization to make it safe without prior assumptions. When given the result of a {@link\n     * ng.$sceDelegate#trustAs `$sceDelegate.trustAs`} call, it returns the originally supplied\n     * value if that value's context is valid for this call's context. Finally, this function can\n     * also throw when there is no way to turn `maybeTrusted` in a safe value (e.g., no sanitization\n     * is available or possible.)\n     *\n     * @param {string} type The context in which this value is to be used (such as `$sce.HTML`).\n     * @param {*} maybeTrusted The result of a prior {@link ng.$sceDelegate#trustAs\n     *     `$sceDelegate.trustAs`} call, or anything else (which will not be considered trusted.)\n     * @return {*} A version of the value that's safe to use in the given context, or throws an\n     *     exception if this is impossible.\n     */\n    function getTrusted(type, maybeTrusted) {\n      if (maybeTrusted === null || isUndefined(maybeTrusted) || maybeTrusted === '') {\n        return maybeTrusted;\n      }\n      var constructor = (byType.hasOwnProperty(type) ? byType[type] : null);\n      // If maybeTrusted is a trusted class instance or subclass instance, then unwrap and return\n      // as-is.\n      if (constructor && maybeTrusted instanceof constructor) {\n        return maybeTrusted.$$unwrapTrustedValue();\n      }\n      // Otherwise, if we get here, then we may either make it safe, or throw an exception. This\n      // depends on the context: some are sanitizatible (HTML), some use whitelists (RESOURCE_URL),\n      // some are impossible to do (JS). This step isn't implemented for CSS and URL, as AngularJS\n      // has no corresponding sinks.\n      if (type === SCE_CONTEXTS.RESOURCE_URL) {\n        // RESOURCE_URL uses a whitelist.\n        if (isResourceUrlAllowedByPolicy(maybeTrusted)) {\n          return maybeTrusted;\n        } else {\n          throw $sceMinErr('insecurl',\n              'Blocked loading resource from url not allowed by $sceDelegate policy.  URL: {0}',\n              maybeTrusted.toString());\n        }\n      } else if (type === SCE_CONTEXTS.HTML) {\n        // htmlSanitizer throws its own error when no sanitizer is available.\n        return htmlSanitizer(maybeTrusted);\n      }\n      // Default error when the $sce service has no way to make the input safe.\n      throw $sceMinErr('unsafe', 'Attempting to use an unsafe value in a safe context.');\n    }\n\n    return { trustAs: trustAs,\n             getTrusted: getTrusted,\n             valueOf: valueOf };\n  }];\n}\n\n\n/**\n * @ngdoc provider\n * @name $sceProvider\n * @this\n *\n * @description\n *\n * The $sceProvider provider allows developers to configure the {@link ng.$sce $sce} service.\n * -   enable/disable Strict Contextual Escaping (SCE) in a module\n * -   override the default implementation with a custom delegate\n *\n * Read more about {@link ng.$sce Strict Contextual Escaping (SCE)}.\n */\n\n/**\n * @ngdoc service\n * @name $sce\n * @kind function\n *\n * @description\n *\n * `$sce` is a service that provides Strict Contextual Escaping services to AngularJS.\n *\n * # Strict Contextual Escaping\n *\n * Strict Contextual Escaping (SCE) is a mode in which AngularJS constrains bindings to only render\n * trusted values. Its goal is to assist in writing code in a way that (a) is secure by default, and\n * (b) makes auditing for security vulnerabilities such as XSS, clickjacking, etc. a lot easier.\n *\n * ## Overview\n *\n * To systematically block XSS security bugs, AngularJS treats all values as untrusted by default in\n * HTML or sensitive URL bindings. When binding untrusted values, AngularJS will automatically\n * run security checks on them (sanitizations, whitelists, depending on context), or throw when it\n * cannot guarantee the security of the result. That behavior depends strongly on contexts: HTML\n * can be sanitized, but template URLs cannot, for instance.\n *\n * To illustrate this, consider the `ng-bind-html` directive. It renders its value directly as HTML:\n * we call that the *context*. When given an untrusted input, AngularJS will attempt to sanitize it\n * before rendering if a sanitizer is available, and throw otherwise. To bypass sanitization and\n * render the input as-is, you will need to mark it as trusted for that context before attempting\n * to bind it.\n *\n * As of version 1.2, AngularJS ships with SCE enabled by default.\n *\n * ## In practice\n *\n * Here's an example of a binding in a privileged context:\n *\n * ```\n * <input ng-model=\"userHtml\" aria-label=\"User input\">\n * <div ng-bind-html=\"userHtml\"></div>\n * ```\n *\n * Notice that `ng-bind-html` is bound to `userHtml` controlled by the user.  With SCE\n * disabled, this application allows the user to render arbitrary HTML into the DIV, which would\n * be an XSS security bug. In a more realistic example, one may be rendering user comments, blog\n * articles, etc. via bindings. (HTML is just one example of a context where rendering user\n * controlled input creates security vulnerabilities.)\n *\n * For the case of HTML, you might use a library, either on the client side, or on the server side,\n * to sanitize unsafe HTML before binding to the value and rendering it in the document.\n *\n * How would you ensure that every place that used these types of bindings was bound to a value that\n * was sanitized by your library (or returned as safe for rendering by your server?)  How can you\n * ensure that you didn't accidentally delete the line that sanitized the value, or renamed some\n * properties/fields and forgot to update the binding to the sanitized value?\n *\n * To be secure by default, AngularJS makes sure bindings go through that sanitization, or\n * any similar validation process, unless there's a good reason to trust the given value in this\n * context.  That trust is formalized with a function call. This means that as a developer, you\n * can assume all untrusted bindings are safe. Then, to audit your code for binding security issues,\n * you just need to ensure the values you mark as trusted indeed are safe - because they were\n * received from your server, sanitized by your library, etc. You can organize your codebase to\n * help with this - perhaps allowing only the files in a specific directory to do this.\n * Ensuring that the internal API exposed by that code doesn't markup arbitrary values as safe then\n * becomes a more manageable task.\n *\n * In the case of AngularJS' SCE service, one uses {@link ng.$sce#trustAs $sce.trustAs}\n * (and shorthand methods such as {@link ng.$sce#trustAsHtml $sce.trustAsHtml}, etc.) to\n * build the trusted versions of your values.\n *\n * ## How does it work?\n *\n * In privileged contexts, directives and code will bind to the result of {@link ng.$sce#getTrusted\n * $sce.getTrusted(context, value)} rather than to the value directly.  Think of this function as\n * a way to enforce the required security context in your data sink. Directives use {@link\n * ng.$sce#parseAs $sce.parseAs} rather than `$parse` to watch attribute bindings, which performs\n * the {@link ng.$sce#getTrusted $sce.getTrusted} behind the scenes on non-constant literals. Also,\n * when binding without directives, AngularJS will understand the context of your bindings\n * automatically.\n *\n * As an example, {@link ng.directive:ngBindHtml ngBindHtml} uses {@link\n * ng.$sce#parseAsHtml $sce.parseAsHtml(binding expression)}.  Here's the actual code (slightly\n * simplified):\n *\n * ```\n * var ngBindHtmlDirective = ['$sce', function($sce) {\n *   return function(scope, element, attr) {\n *     scope.$watch($sce.parseAsHtml(attr.ngBindHtml), function(value) {\n *       element.html(value || '');\n *     });\n *   };\n * }];\n * ```\n *\n * ## Impact on loading templates\n *\n * This applies both to the {@link ng.directive:ngInclude `ng-include`} directive as well as\n * `templateUrl`'s specified by {@link guide/directive directives}.\n *\n * By default, Angular only loads templates from the same domain and protocol as the application\n * document.  This is done by calling {@link ng.$sce#getTrustedResourceUrl\n * $sce.getTrustedResourceUrl} on the template URL.  To load templates from other domains and/or\n * protocols, you may either {@link ng.$sceDelegateProvider#resourceUrlWhitelist whitelist\n * them} or {@link ng.$sce#trustAsResourceUrl wrap it} into a trusted value.\n *\n * *Please note*:\n * The browser's\n * [Same Origin Policy](https://code.google.com/p/browsersec/wiki/Part2#Same-origin_policy_for_XMLHttpRequest)\n * and [Cross-Origin Resource Sharing (CORS)](http://www.w3.org/TR/cors/)\n * policy apply in addition to this and may further restrict whether the template is successfully\n * loaded.  This means that without the right CORS policy, loading templates from a different domain\n * won't work on all browsers.  Also, loading templates from `file://` URL does not work on some\n * browsers.\n *\n * ## This feels like too much overhead\n *\n * It's important to remember that SCE only applies to interpolation expressions.\n *\n * If your expressions are constant literals, they're automatically trusted and you don't need to\n * call `$sce.trustAs` on them (e.g.\n * `<div ng-bind-html=\"'<b>implicitly trusted</b>'\"></div>`) just works. The `$sceDelegate` will\n * also use the `$sanitize` service if it is available when binding untrusted values to\n * `$sce.HTML` context. AngularJS provides an implementation in `angular-sanitize.js`, and if you\n * wish to use it, you will also need to depend on the {@link ngSanitize `ngSanitize`} module in\n * your application.\n *\n * The included {@link ng.$sceDelegate $sceDelegate} comes with sane defaults to allow you to load\n * templates in `ng-include` from your application's domain without having to even know about SCE.\n * It blocks loading templates from other domains or loading templates over http from an https\n * served document.  You can change these by setting your own custom {@link\n * ng.$sceDelegateProvider#resourceUrlWhitelist whitelists} and {@link\n * ng.$sceDelegateProvider#resourceUrlBlacklist blacklists} for matching such URLs.\n *\n * This significantly reduces the overhead.  It is far easier to pay the small overhead and have an\n * application that's secure and can be audited to verify that with much more ease than bolting\n * security onto an application later.\n *\n * <a name=\"contexts\"></a>\n * ## What trusted context types are supported?\n *\n * | Context             | Notes          |\n * |---------------------|----------------|\n * | `$sce.HTML`         | For HTML that's safe to source into the application.  The {@link ng.directive:ngBindHtml ngBindHtml} directive uses this context for bindings. If an unsafe value is encountered, and the {@link ngSanitize.$sanitize $sanitize} service is available (implemented by the {@link ngSanitize ngSanitize} module) this will sanitize the value instead of throwing an error. |\n * | `$sce.CSS`          | For CSS that's safe to source into the application.  Currently, no bindings require this context. Feel free to use it in your own directives. |\n * | `$sce.URL`          | For URLs that are safe to follow as links.  Currently unused (`<a href=`, `<img src=`, and some others sanitize their urls and don't constitute an SCE context.) |\n * | `$sce.RESOURCE_URL` | For URLs that are not only safe to follow as links, but whose contents are also safe to include in your application.  Examples include `ng-include`, `src` / `ngSrc` bindings for tags other than `IMG`, `VIDEO`, `AUDIO`, `SOURCE`, and `TRACK` (e.g. `IFRAME`, `OBJECT`, etc.)  <br><br>Note that `$sce.RESOURCE_URL` makes a stronger statement about the URL than `$sce.URL` does (it's not just the URL that matters, but also what is at the end of it), and therefore contexts requiring values trusted for `$sce.RESOURCE_URL` can be used anywhere that values trusted for `$sce.URL` are required. |\n * | `$sce.JS`           | For JavaScript that is safe to execute in your application's context.  Currently, no bindings require this context.  Feel free to use it in your own directives. |\n *\n *\n * Be aware that `a[href]` and `img[src]` automatically sanitize their URLs and do not pass them\n * through {@link ng.$sce#getTrusted $sce.getTrusted}. There's no CSS-, URL-, or JS-context bindings\n * in AngularJS currently, so their corresponding `$sce.trustAs` functions aren't useful yet. This\n * might evolve.\n *\n * ## Format of items in {@link ng.$sceDelegateProvider#resourceUrlWhitelist resourceUrlWhitelist}/{@link ng.$sceDelegateProvider#resourceUrlBlacklist Blacklist} <a name=\"resourceUrlPatternItem\"></a>\n *\n *  Each element in these arrays must be one of the following:\n *\n *  - **'self'**\n *    - The special **string**, `'self'`, can be used to match against all URLs of the **same\n *      domain** as the application document using the **same protocol**.\n *  - **String** (except the special value `'self'`)\n *    - The string is matched against the full *normalized / absolute URL* of the resource\n *      being tested (substring matches are not good enough.)\n *    - There are exactly **two wildcard sequences** - `*` and `**`.  All other characters\n *      match themselves.\n *    - `*`: matches zero or more occurrences of any character other than one of the following 6\n *      characters: '`:`', '`/`', '`.`', '`?`', '`&`' and '`;`'.  It's a useful wildcard for use\n *      in a whitelist.\n *    - `**`: matches zero or more occurrences of *any* character.  As such, it's not\n *      appropriate for use in a scheme, domain, etc. as it would match too much.  (e.g.\n *      http://**.example.com/ would match http://evil.com/?ignore=.example.com/ and that might\n *      not have been the intention.)  Its usage at the very end of the path is ok.  (e.g.\n *      http://foo.example.com/templates/**).\n *  - **RegExp** (*see caveat below*)\n *    - *Caveat*:  While regular expressions are powerful and offer great flexibility,  their syntax\n *      (and all the inevitable escaping) makes them *harder to maintain*.  It's easy to\n *      accidentally introduce a bug when one updates a complex expression (imho, all regexes should\n *      have good test coverage).  For instance, the use of `.` in the regex is correct only in a\n *      small number of cases.  A `.` character in the regex used when matching the scheme or a\n *      subdomain could be matched against a `:` or literal `.` that was likely not intended.   It\n *      is highly recommended to use the string patterns and only fall back to regular expressions\n *      as a last resort.\n *    - The regular expression must be an instance of RegExp (i.e. not a string.)  It is\n *      matched against the **entire** *normalized / absolute URL* of the resource being tested\n *      (even when the RegExp did not have the `^` and `$` codes.)  In addition, any flags\n *      present on the RegExp (such as multiline, global, ignoreCase) are ignored.\n *    - If you are generating your JavaScript from some other templating engine (not\n *      recommended, e.g. in issue [#4006](https://github.com/angular/angular.js/issues/4006)),\n *      remember to escape your regular expression (and be aware that you might need more than\n *      one level of escaping depending on your templating engine and the way you interpolated\n *      the value.)  Do make use of your platform's escaping mechanism as it might be good\n *      enough before coding your own.  E.g. Ruby has\n *      [Regexp.escape(str)](http://www.ruby-doc.org/core-2.0.0/Regexp.html#method-c-escape)\n *      and Python has [re.escape](http://docs.python.org/library/re.html#re.escape).\n *      Javascript lacks a similar built in function for escaping.  Take a look at Google\n *      Closure library's [goog.string.regExpEscape(s)](\n *      http://docs.closure-library.googlecode.com/git/closure_goog_string_string.js.source.html#line962).\n *\n * Refer {@link ng.$sceDelegateProvider $sceDelegateProvider} for an example.\n *\n * ## Show me an example using SCE.\n *\n * <example module=\"mySceApp\" deps=\"angular-sanitize.js\" name=\"sce-service\">\n * <file name=\"index.ced81ed4.html\">\n *   <div ng-controller=\"AppController as myCtrl\">\n *     <i ng-bind-html=\"myCtrl.explicitlyTrustedHtml\" id=\"explicitlyTrustedHtml\"></i><br><br>\n *     <b>User comments</b><br>\n *     By default, HTML that isn't explicitly trusted (e.g. Alice's comment) is sanitized when\n *     $sanitize is available.  If $sanitize isn't available, this results in an error instead of an\n *     exploit.\n *     <div class=\"well\">\n *       <div ng-repeat=\"userComment in myCtrl.userComments\">\n *         <b>{{userComment.name}}</b>:\n *         <span ng-bind-html=\"userComment.htmlComment\" class=\"htmlComment\"></span>\n *         <br>\n *       </div>\n *     </div>\n *   </div>\n * </file>\n *\n * <file name=\"script.js\">\n *   angular.module('mySceApp', ['ngSanitize'])\n *     .controller('AppController', ['$http', '$templateCache', '$sce',\n *       function AppController($http, $templateCache, $sce) {\n *         var self = this;\n *         $http.get('test_data.json', {cache: $templateCache}).then(function(response) {\n *           self.userComments = response.data;\n *         });\n *         self.explicitlyTrustedHtml = $sce.trustAsHtml(\n *             '<span onmouseover=\"this.textContent=&quot;Explicitly trusted HTML bypasses ' +\n *             'sanitization.&quot;\">Hover over this text.</span>');\n *       }]);\n * </file>\n *\n * <file name=\"test_data.json\">\n * [\n *   { \"name\": \"Alice\",\n *     \"htmlComment\":\n *         \"<span onmouseover='this.textContent=\\\"PWN3D!\\\"'>Is <i>anyone</i> reading this?</span>\"\n *   },\n *   { \"name\": \"Bob\",\n *     \"htmlComment\": \"<i>Yes!</i>  Am I the only other one?\"\n *   }\n * ]\n * </file>\n *\n * <file name=\"protractor.js\" type=\"protractor\">\n *   describe('SCE doc demo', function() {\n *     it('should sanitize untrusted values', function() {\n *       expect(element.all(by.css('.htmlComment')).first().getAttribute('innerHTML'))\n *           .toBe('<span>Is <i>anyone</i> reading this?</span>');\n *     });\n *\n *     it('should NOT sanitize explicitly trusted values', function() {\n *       expect(element(by.id('explicitlyTrustedHtml')).getAttribute('innerHTML')).toBe(\n *           '<span onmouseover=\"this.textContent=&quot;Explicitly trusted HTML bypasses ' +\n *           'sanitization.&quot;\">Hover over this text.</span>');\n *     });\n *   });\n * </file>\n * </example>\n *\n *\n *\n * ## Can I disable SCE completely?\n *\n * Yes, you can.  However, this is strongly discouraged.  SCE gives you a lot of security benefits\n * for little coding overhead.  It will be much harder to take an SCE disabled application and\n * either secure it on your own or enable SCE at a later stage.  It might make sense to disable SCE\n * for cases where you have a lot of existing code that was written before SCE was introduced and\n * you're migrating them a module at a time. Also do note that this is an app-wide setting, so if\n * you are writing a library, you will cause security bugs applications using it.\n *\n * That said, here's how you can completely disable SCE:\n *\n * ```\n * angular.module('myAppWithSceDisabledmyApp', []).config(function($sceProvider) {\n *   // Completely disable SCE.  For demonstration purposes only!\n *   // Do not use in new projects or libraries.\n *   $sceProvider.enabled(false);\n * });\n * ```\n *\n */\n\nfunction $SceProvider() {\n  var enabled = true;\n\n  /**\n   * @ngdoc method\n   * @name $sceProvider#enabled\n   * @kind function\n   *\n   * @param {boolean=} value If provided, then enables/disables SCE application-wide.\n   * @return {boolean} True if SCE is enabled, false otherwise.\n   *\n   * @description\n   * Enables/disables SCE and returns the current value.\n   */\n  this.enabled = function(value) {\n    if (arguments.length) {\n      enabled = !!value;\n    }\n    return enabled;\n  };\n\n\n  /* Design notes on the default implementation for SCE.\n   *\n   * The API contract for the SCE delegate\n   * -------------------------------------\n   * The SCE delegate object must provide the following 3 methods:\n   *\n   * - trustAs(contextEnum, value)\n   *     This method is used to tell the SCE service that the provided value is OK to use in the\n   *     contexts specified by contextEnum.  It must return an object that will be accepted by\n   *     getTrusted() for a compatible contextEnum and return this value.\n   *\n   * - valueOf(value)\n   *     For values that were not produced by trustAs(), return them as is.  For values that were\n   *     produced by trustAs(), return the corresponding input value to trustAs.  Basically, if\n   *     trustAs is wrapping the given values into some type, this operation unwraps it when given\n   *     such a value.\n   *\n   * - getTrusted(contextEnum, value)\n   *     This function should return the a value that is safe to use in the context specified by\n   *     contextEnum or throw and exception otherwise.\n   *\n   * NOTE: This contract deliberately does NOT state that values returned by trustAs() must be\n   * opaque or wrapped in some holder object.  That happens to be an implementation detail.  For\n   * instance, an implementation could maintain a registry of all trusted objects by context.  In\n   * such a case, trustAs() would return the same object that was passed in.  getTrusted() would\n   * return the same object passed in if it was found in the registry under a compatible context or\n   * throw an exception otherwise.  An implementation might only wrap values some of the time based\n   * on some criteria.  getTrusted() might return a value and not throw an exception for special\n   * constants or objects even if not wrapped.  All such implementations fulfill this contract.\n   *\n   *\n   * A note on the inheritance model for SCE contexts\n   * ------------------------------------------------\n   * I've used inheritance and made RESOURCE_URL wrapped types a subtype of URL wrapped types.  This\n   * is purely an implementation details.\n   *\n   * The contract is simply this:\n   *\n   *     getTrusted($sce.RESOURCE_URL, value) succeeding implies that getTrusted($sce.URL, value)\n   *     will also succeed.\n   *\n   * Inheritance happens to capture this in a natural way. In some future, we may not use\n   * inheritance anymore. That is OK because no code outside of sce.js and sceSpecs.js would need to\n   * be aware of this detail.\n   */\n\n  this.$get = ['$parse', '$sceDelegate', function(\n                $parse,   $sceDelegate) {\n    // Support: IE 9-11 only\n    // Prereq: Ensure that we're not running in IE<11 quirks mode.  In that mode, IE < 11 allow\n    // the \"expression(javascript expression)\" syntax which is insecure.\n    if (enabled && msie < 8) {\n      throw $sceMinErr('iequirks',\n        'Strict Contextual Escaping does not support Internet Explorer version < 11 in quirks ' +\n        'mode.  You can fix this by adding the text <!doctype html> to the top of your HTML ' +\n        'document.  See http://docs.angularjs.org/api/ng.$sce for more information.');\n    }\n\n    var sce = shallowCopy(SCE_CONTEXTS);\n\n    /**\n     * @ngdoc method\n     * @name $sce#isEnabled\n     * @kind function\n     *\n     * @return {Boolean} True if SCE is enabled, false otherwise.  If you want to set the value, you\n     *     have to do it at module config time on {@link ng.$sceProvider $sceProvider}.\n     *\n     * @description\n     * Returns a boolean indicating if SCE is enabled.\n     */\n    sce.isEnabled = function() {\n      return enabled;\n    };\n    sce.trustAs = $sceDelegate.trustAs;\n    sce.getTrusted = $sceDelegate.getTrusted;\n    sce.valueOf = $sceDelegate.valueOf;\n\n    if (!enabled) {\n      sce.trustAs = sce.getTrusted = function(type, value) { return value; };\n      sce.valueOf = identity;\n    }\n\n    /**\n     * @ngdoc method\n     * @name $sce#parseAs\n     *\n     * @description\n     * Converts Angular {@link guide/expression expression} into a function.  This is like {@link\n     * ng.$parse $parse} and is identical when the expression is a literal constant.  Otherwise, it\n     * wraps the expression in a call to {@link ng.$sce#getTrusted $sce.getTrusted(*type*,\n     * *result*)}\n     *\n     * @param {string} type The SCE context in which this result will be used.\n     * @param {string} expression String expression to compile.\n     * @return {function(context, locals)} A function which represents the compiled expression:\n     *\n     *    * `context` – `{object}` – an object against which any expressions embedded in the\n     *      strings are evaluated against (typically a scope object).\n     *    * `locals` – `{object=}` – local variables context object, useful for overriding values\n     *      in `context`.\n     */\n    sce.parseAs = function sceParseAs(type, expr) {\n      var parsed = $parse(expr);\n      if (parsed.literal && parsed.constant) {\n        return parsed;\n      } else {\n        return $parse(expr, function(value) {\n          return sce.getTrusted(type, value);\n        });\n      }\n    };\n\n    /**\n     * @ngdoc method\n     * @name $sce#trustAs\n     *\n     * @description\n     * Delegates to {@link ng.$sceDelegate#trustAs `$sceDelegate.trustAs`}. As such, returns a\n     * wrapped object that represents your value, and the trust you have in its safety for the given\n     * context. AngularJS can then use that value as-is in bindings of the specified secure context.\n     * This is used in bindings for `ng-bind-html`, `ng-include`, and most `src` attribute\n     * interpolations. See {@link ng.$sce $sce} for strict contextual escaping.\n     *\n     * @param {string} type The context in which this value is safe for use, e.g. `$sce.URL`,\n     *     `$sce.RESOURCE_URL`, `$sce.HTML`, `$sce.JS` or `$sce.CSS`.\n     *\n     * @param {*} value The value that that should be considered trusted.\n     * @return {*} A wrapped version of value that can be used as a trusted variant of your `value`\n     *     in the context you specified.\n     */\n\n    /**\n     * @ngdoc method\n     * @name $sce#trustAsHtml\n     *\n     * @description\n     * Shorthand method.  `$sce.trustAsHtml(value)` →\n     *     {@link ng.$sceDelegate#trustAs `$sceDelegate.trustAs($sce.HTML, value)`}\n     *\n     * @param {*} value The value to mark as trusted for `$sce.HTML` context.\n     * @return {*} A wrapped version of value that can be used as a trusted variant of your `value`\n     *     in `$sce.HTML` context (like `ng-bind-html`).\n     */\n\n    /**\n     * @ngdoc method\n     * @name $sce#trustAsCss\n     *\n     * @description\n     * Shorthand method.  `$sce.trustAsCss(value)` →\n     *     {@link ng.$sceDelegate#trustAs `$sceDelegate.trustAs($sce.CSS, value)`}\n     *\n     * @param {*} value The value to mark as trusted for `$sce.CSS` context.\n     * @return {*} A wrapped version of value that can be used as a trusted variant\n     *     of your `value` in `$sce.CSS` context. This context is currently unused, so there are\n     *     almost no reasons to use this function so far.\n     */\n\n    /**\n     * @ngdoc method\n     * @name $sce#trustAsUrl\n     *\n     * @description\n     * Shorthand method.  `$sce.trustAsUrl(value)` →\n     *     {@link ng.$sceDelegate#trustAs `$sceDelegate.trustAs($sce.URL, value)`}\n     *\n     * @param {*} value The value to mark as trusted for `$sce.URL` context.\n     * @return {*} A wrapped version of value that can be used as a trusted variant of your `value`\n     *     in `$sce.URL` context. That context is currently unused, so there are almost no reasons\n     *     to use this function so far.\n     */\n\n    /**\n     * @ngdoc method\n     * @name $sce#trustAsResourceUrl\n     *\n     * @description\n     * Shorthand method.  `$sce.trustAsResourceUrl(value)` →\n     *     {@link ng.$sceDelegate#trustAs `$sceDelegate.trustAs($sce.RESOURCE_URL, value)`}\n     *\n     * @param {*} value The value to mark as trusted for `$sce.RESOURCE_URL` context.\n     * @return {*} A wrapped version of value that can be used as a trusted variant of your `value`\n     *     in `$sce.RESOURCE_URL` context (template URLs in `ng-include`, most `src` attribute\n     *     bindings, ...)\n     */\n\n    /**\n     * @ngdoc method\n     * @name $sce#trustAsJs\n     *\n     * @description\n     * Shorthand method.  `$sce.trustAsJs(value)` →\n     *     {@link ng.$sceDelegate#trustAs `$sceDelegate.trustAs($sce.JS, value)`}\n     *\n     * @param {*} value The value to mark as trusted for `$sce.JS` context.\n     * @return {*} A wrapped version of value that can be used as a trusted variant of your `value`\n     *     in `$sce.JS` context. That context is currently unused, so there are almost no reasons to\n     *     use this function so far.\n     */\n\n    /**\n     * @ngdoc method\n     * @name $sce#getTrusted\n     *\n     * @description\n     * Delegates to {@link ng.$sceDelegate#getTrusted `$sceDelegate.getTrusted`}.  As such,\n     * takes any input, and either returns a value that's safe to use in the specified context,\n     * or throws an exception. This function is aware of trusted values created by the `trustAs`\n     * function and its shorthands, and when contexts are appropriate, returns the unwrapped value\n     * as-is. Finally, this function can also throw when there is no way to turn `maybeTrusted` in a\n     * safe value (e.g., no sanitization is available or possible.)\n     *\n     * @param {string} type The context in which this value is to be used.\n     * @param {*} maybeTrusted The result of a prior {@link ng.$sce#trustAs\n     *     `$sce.trustAs`} call, or anything else (which will not be considered trusted.)\n     * @return {*} A version of the value that's safe to use in the given context, or throws an\n     *     exception if this is impossible.\n     */\n\n    /**\n     * @ngdoc method\n     * @name $sce#getTrustedHtml\n     *\n     * @description\n     * Shorthand method.  `$sce.getTrustedHtml(value)` →\n     *     {@link ng.$sceDelegate#getTrusted `$sceDelegate.getTrusted($sce.HTML, value)`}\n     *\n     * @param {*} value The value to pass to `$sce.getTrusted`.\n     * @return {*} The return value of `$sce.getTrusted($sce.HTML, value)`\n     */\n\n    /**\n     * @ngdoc method\n     * @name $sce#getTrustedCss\n     *\n     * @description\n     * Shorthand method.  `$sce.getTrustedCss(value)` →\n     *     {@link ng.$sceDelegate#getTrusted `$sceDelegate.getTrusted($sce.CSS, value)`}\n     *\n     * @param {*} value The value to pass to `$sce.getTrusted`.\n     * @return {*} The return value of `$sce.getTrusted($sce.CSS, value)`\n     */\n\n    /**\n     * @ngdoc method\n     * @name $sce#getTrustedUrl\n     *\n     * @description\n     * Shorthand method.  `$sce.getTrustedUrl(value)` →\n     *     {@link ng.$sceDelegate#getTrusted `$sceDelegate.getTrusted($sce.URL, value)`}\n     *\n     * @param {*} value The value to pass to `$sce.getTrusted`.\n     * @return {*} The return value of `$sce.getTrusted($sce.URL, value)`\n     */\n\n    /**\n     * @ngdoc method\n     * @name $sce#getTrustedResourceUrl\n     *\n     * @description\n     * Shorthand method.  `$sce.getTrustedResourceUrl(value)` →\n     *     {@link ng.$sceDelegate#getTrusted `$sceDelegate.getTrusted($sce.RESOURCE_URL, value)`}\n     *\n     * @param {*} value The value to pass to `$sceDelegate.getTrusted`.\n     * @return {*} The return value of `$sce.getTrusted($sce.RESOURCE_URL, value)`\n     */\n\n    /**\n     * @ngdoc method\n     * @name $sce#getTrustedJs\n     *\n     * @description\n     * Shorthand method.  `$sce.getTrustedJs(value)` →\n     *     {@link ng.$sceDelegate#getTrusted `$sceDelegate.getTrusted($sce.JS, value)`}\n     *\n     * @param {*} value The value to pass to `$sce.getTrusted`.\n     * @return {*} The return value of `$sce.getTrusted($sce.JS, value)`\n     */\n\n    /**\n     * @ngdoc method\n     * @name $sce#parseAsHtml\n     *\n     * @description\n     * Shorthand method.  `$sce.parseAsHtml(expression string)` →\n     *     {@link ng.$sce#parseAs `$sce.parseAs($sce.HTML, value)`}\n     *\n     * @param {string} expression String expression to compile.\n     * @return {function(context, locals)} A function which represents the compiled expression:\n     *\n     *    * `context` – `{object}` – an object against which any expressions embedded in the\n     *      strings are evaluated against (typically a scope object).\n     *    * `locals` – `{object=}` – local variables context object, useful for overriding values\n     *      in `context`.\n     */\n\n    /**\n     * @ngdoc method\n     * @name $sce#parseAsCss\n     *\n     * @description\n     * Shorthand method.  `$sce.parseAsCss(value)` →\n     *     {@link ng.$sce#parseAs `$sce.parseAs($sce.CSS, value)`}\n     *\n     * @param {string} expression String expression to compile.\n     * @return {function(context, locals)} A function which represents the compiled expression:\n     *\n     *    * `context` – `{object}` – an object against which any expressions embedded in the\n     *      strings are evaluated against (typically a scope object).\n     *    * `locals` – `{object=}` – local variables context object, useful for overriding values\n     *      in `context`.\n     */\n\n    /**\n     * @ngdoc method\n     * @name $sce#parseAsUrl\n     *\n     * @description\n     * Shorthand method.  `$sce.parseAsUrl(value)` →\n     *     {@link ng.$sce#parseAs `$sce.parseAs($sce.URL, value)`}\n     *\n     * @param {string} expression String expression to compile.\n     * @return {function(context, locals)} A function which represents the compiled expression:\n     *\n     *    * `context` – `{object}` – an object against which any expressions embedded in the\n     *      strings are evaluated against (typically a scope object).\n     *    * `locals` – `{object=}` – local variables context object, useful for overriding values\n     *      in `context`.\n     */\n\n    /**\n     * @ngdoc method\n     * @name $sce#parseAsResourceUrl\n     *\n     * @description\n     * Shorthand method.  `$sce.parseAsResourceUrl(value)` →\n     *     {@link ng.$sce#parseAs `$sce.parseAs($sce.RESOURCE_URL, value)`}\n     *\n     * @param {string} expression String expression to compile.\n     * @return {function(context, locals)} A function which represents the compiled expression:\n     *\n     *    * `context` – `{object}` – an object against which any expressions embedded in the\n     *      strings are evaluated against (typically a scope object).\n     *    * `locals` – `{object=}` – local variables context object, useful for overriding values\n     *      in `context`.\n     */\n\n    /**\n     * @ngdoc method\n     * @name $sce#parseAsJs\n     *\n     * @description\n     * Shorthand method.  `$sce.parseAsJs(value)` →\n     *     {@link ng.$sce#parseAs `$sce.parseAs($sce.JS, value)`}\n     *\n     * @param {string} expression String expression to compile.\n     * @return {function(context, locals)} A function which represents the compiled expression:\n     *\n     *    * `context` – `{object}` – an object against which any expressions embedded in the\n     *      strings are evaluated against (typically a scope object).\n     *    * `locals` – `{object=}` – local variables context object, useful for overriding values\n     *      in `context`.\n     */\n\n    // Shorthand delegations.\n    var parse = sce.parseAs,\n        getTrusted = sce.getTrusted,\n        trustAs = sce.trustAs;\n\n    forEach(SCE_CONTEXTS, function(enumValue, name) {\n      var lName = lowercase(name);\n      sce[snakeToCamel('parse_as_' + lName)] = function(expr) {\n        return parse(enumValue, expr);\n      };\n      sce[snakeToCamel('get_trusted_' + lName)] = function(value) {\n        return getTrusted(enumValue, value);\n      };\n      sce[snakeToCamel('trust_as_' + lName)] = function(value) {\n        return trustAs(enumValue, value);\n      };\n    });\n\n    return sce;\n  }];\n}\n\n/* exported $SnifferProvider */\n\n/**\n * !!! This is an undocumented \"private\" service !!!\n *\n * @name $sniffer\n * @requires $window\n * @requires $document\n * @this\n *\n * @property {boolean} history Does the browser support html5 history api ?\n * @property {boolean} transitions Does the browser support CSS transition events ?\n * @property {boolean} animations Does the browser support CSS animation events ?\n *\n * @description\n * This is very simple implementation of testing browser's features.\n */\nfunction $SnifferProvider() {\n  this.$get = ['$window', '$document', function($window, $document) {\n    var eventSupport = {},\n        // Chrome Packaged Apps are not allowed to access `history.pushState`.\n        // If not sandboxed, they can be detected by the presence of `chrome.app.runtime`\n        // (see https://developer.chrome.com/apps/api_index). If sandboxed, they can be detected by\n        // the presence of an extension runtime ID and the absence of other Chrome runtime APIs\n        // (see https://developer.chrome.com/apps/manifest/sandbox).\n        // (NW.js apps have access to Chrome APIs, but do support `history`.)\n        isNw = $window.nw && $window.nw.process,\n        isChromePackagedApp =\n            !isNw &&\n            $window.chrome &&\n            ($window.chrome.app && $window.chrome.app.runtime ||\n                !$window.chrome.app && $window.chrome.runtime && $window.chrome.runtime.id),\n        hasHistoryPushState = !isChromePackagedApp && $window.history && $window.history.pushState,\n        android =\n          toInt((/android (\\d+)/.exec(lowercase(($window.navigator || {}).userAgent)) || [])[1]),\n        boxee = /Boxee/i.test(($window.navigator || {}).userAgent),\n        document = $document[0] || {},\n        bodyStyle = document.body && document.body.style,\n        transitions = false,\n        animations = false;\n\n    if (bodyStyle) {\n      // Support: Android <5, Blackberry Browser 10, default Chrome in Android 4.4.x\n      // Mentioned browsers need a -webkit- prefix for transitions & animations.\n      transitions = !!('transition' in bodyStyle || 'webkitTransition' in bodyStyle);\n      animations = !!('animation' in bodyStyle || 'webkitAnimation' in bodyStyle);\n    }\n\n\n    return {\n      // Android has history.pushState, but it does not update location correctly\n      // so let's not use the history API at all.\n      // http://code.google.com/p/android/issues/detail?id=17471\n      // https://github.com/angular/angular.js/issues/904\n\n      // older webkit browser (533.9) on Boxee box has exactly the same problem as Android has\n      // so let's not use the history API also\n      // We are purposefully using `!(android < 4)` to cover the case when `android` is undefined\n      history: !!(hasHistoryPushState && !(android < 4) && !boxee),\n      hasEvent: function(event) {\n        // Support: IE 9-11 only\n        // IE9 implements 'input' event it's so fubared that we rather pretend that it doesn't have\n        // it. In particular the event is not fired when backspace or delete key are pressed or\n        // when cut operation is performed.\n        // IE10+ implements 'input' event but it erroneously fires under various situations,\n        // e.g. when placeholder changes, or a form is focused.\n        if (event === 'input' && msie) return false;\n\n        if (isUndefined(eventSupport[event])) {\n          var divElm = document.createElement('div');\n          eventSupport[event] = 'on' + event in divElm;\n        }\n\n        return eventSupport[event];\n      },\n      csp: csp(),\n      transitions: transitions,\n      animations: animations,\n      android: android\n    };\n  }];\n}\n\nvar $templateRequestMinErr = minErr('$compile');\n\n/**\n * @ngdoc provider\n * @name $templateRequestProvider\n * @this\n *\n * @description\n * Used to configure the options passed to the {@link $http} service when making a template request.\n *\n * For example, it can be used for specifying the \"Accept\" header that is sent to the server, when\n * requesting a template.\n */\nfunction $TemplateRequestProvider() {\n\n  var httpOptions;\n\n  /**\n   * @ngdoc method\n   * @name $templateRequestProvider#httpOptions\n   * @description\n   * The options to be passed to the {@link $http} service when making the request.\n   * You can use this to override options such as the \"Accept\" header for template requests.\n   *\n   * The {@link $templateRequest} will set the `cache` and the `transformResponse` properties of the\n   * options if not overridden here.\n   *\n   * @param {string=} value new value for the {@link $http} options.\n   * @returns {string|self} Returns the {@link $http} options when used as getter and self if used as setter.\n   */\n  this.httpOptions = function(val) {\n    if (val) {\n      httpOptions = val;\n      return this;\n    }\n    return httpOptions;\n  };\n\n  /**\n   * @ngdoc service\n   * @name $templateRequest\n   *\n   * @description\n   * The `$templateRequest` service runs security checks then downloads the provided template using\n   * `$http` and, upon success, stores the contents inside of `$templateCache`. If the HTTP request\n   * fails or the response data of the HTTP request is empty, a `$compile` error will be thrown (the\n   * exception can be thwarted by setting the 2nd parameter of the function to true). Note that the\n   * contents of `$templateCache` are trusted, so the call to `$sce.getTrustedUrl(tpl)` is omitted\n   * when `tpl` is of type string and `$templateCache` has the matching entry.\n   *\n   * If you want to pass custom options to the `$http` service, such as setting the Accept header you\n   * can configure this via {@link $templateRequestProvider#httpOptions}.\n   *\n   * @param {string|TrustedResourceUrl} tpl The HTTP request template URL\n   * @param {boolean=} ignoreRequestError Whether or not to ignore the exception when the request fails or the template is empty\n   *\n   * @return {Promise} a promise for the HTTP response data of the given URL.\n   *\n   * @property {number} totalPendingRequests total amount of pending template requests being downloaded.\n   */\n  this.$get = ['$exceptionHandler', '$templateCache', '$http', '$q', '$sce',\n    function($exceptionHandler, $templateCache, $http, $q, $sce) {\n\n      function handleRequestFn(tpl, ignoreRequestError) {\n        handleRequestFn.totalPendingRequests++;\n\n        // We consider the template cache holds only trusted templates, so\n        // there's no need to go through whitelisting again for keys that already\n        // are included in there. This also makes Angular accept any script\n        // directive, no matter its name. However, we still need to unwrap trusted\n        // types.\n        if (!isString(tpl) || isUndefined($templateCache.get(tpl))) {\n          tpl = $sce.getTrustedResourceUrl(tpl);\n        }\n\n        var transformResponse = $http.defaults && $http.defaults.transformResponse;\n\n        if (isArray(transformResponse)) {\n          transformResponse = transformResponse.filter(function(transformer) {\n            return transformer !== defaultHttpResponseTransform;\n          });\n        } else if (transformResponse === defaultHttpResponseTransform) {\n          transformResponse = null;\n        }\n\n        return $http.get(tpl, extend({\n            cache: $templateCache,\n            transformResponse: transformResponse\n          }, httpOptions))\n          .finally(function() {\n            handleRequestFn.totalPendingRequests--;\n          })\n          .then(function(response) {\n            $templateCache.put(tpl, response.data);\n            return response.data;\n          }, handleError);\n\n        function handleError(resp) {\n          if (!ignoreRequestError) {\n            resp = $templateRequestMinErr('tpload',\n                'Failed to load template: {0} (HTTP status: {1} {2})',\n                tpl, resp.status, resp.statusText);\n\n            $exceptionHandler(resp);\n          }\n\n          return $q.reject(resp);\n        }\n      }\n\n      handleRequestFn.totalPendingRequests = 0;\n\n      return handleRequestFn;\n    }\n  ];\n}\n\n/** @this */\nfunction $$TestabilityProvider() {\n  this.$get = ['$rootScope', '$browser', '$location',\n       function($rootScope,   $browser,   $location) {\n\n    /**\n     * @name $testability\n     *\n     * @description\n     * The private $$testability service provides a collection of methods for use when debugging\n     * or by automated test and debugging tools.\n     */\n    var testability = {};\n\n    /**\n     * @name $$testability#findBindings\n     *\n     * @description\n     * Returns an array of elements that are bound (via ng-bind or {{}})\n     * to expressions matching the input.\n     *\n     * @param {Element} element The element root to search from.\n     * @param {string} expression The binding expression to match.\n     * @param {boolean} opt_exactMatch If true, only returns exact matches\n     *     for the expression. Filters and whitespace are ignored.\n     */\n    testability.findBindings = function(element, expression, opt_exactMatch) {\n      var bindings = element.getElementsByClassName('ng-binding');\n      var matches = [];\n      forEach(bindings, function(binding) {\n        var dataBinding = angular.element(binding).data('$binding');\n        if (dataBinding) {\n          forEach(dataBinding, function(bindingName) {\n            if (opt_exactMatch) {\n              var matcher = new RegExp('(^|\\\\s)' + escapeForRegexp(expression) + '(\\\\s|\\\\||$)');\n              if (matcher.test(bindingName)) {\n                matches.push(binding);\n              }\n            } else {\n              if (bindingName.indexOf(expression) !== -1) {\n                matches.push(binding);\n              }\n            }\n          });\n        }\n      });\n      return matches;\n    };\n\n    /**\n     * @name $$testability#findModels\n     *\n     * @description\n     * Returns an array of elements that are two-way found via ng-model to\n     * expressions matching the input.\n     *\n     * @param {Element} element The element root to search from.\n     * @param {string} expression The model expression to match.\n     * @param {boolean} opt_exactMatch If true, only returns exact matches\n     *     for the expression.\n     */\n    testability.findModels = function(element, expression, opt_exactMatch) {\n      var prefixes = ['ng-', 'data-ng-', 'ng\\\\:'];\n      for (var p = 0; p < prefixes.length; ++p) {\n        var attributeEquals = opt_exactMatch ? '=' : '*=';\n        var selector = '[' + prefixes[p] + 'model' + attributeEquals + '\"' + expression + '\"]';\n        var elements = element.querySelectorAll(selector);\n        if (elements.length) {\n          return elements;\n        }\n      }\n    };\n\n    /**\n     * @name $$testability#getLocation\n     *\n     * @description\n     * Shortcut for getting the location in a browser agnostic way. Returns\n     *     the path, search, and hash. (e.g. /path?a=b#hash)\n     */\n    testability.getLocation = function() {\n      return $location.url();\n    };\n\n    /**\n     * @name $$testability#setLocation\n     *\n     * @description\n     * Shortcut for navigating to a location without doing a full page reload.\n     *\n     * @param {string} url The location url (path, search and hash,\n     *     e.g. /path?a=b#hash) to go to.\n     */\n    testability.setLocation = function(url) {\n      if (url !== $location.url()) {\n        $location.url(url);\n        $rootScope.$digest();\n      }\n    };\n\n    /**\n     * @name $$testability#whenStable\n     *\n     * @description\n     * Calls the callback when $timeout and $http requests are completed.\n     *\n     * @param {function} callback\n     */\n    testability.whenStable = function(callback) {\n      $browser.notifyWhenNoOutstandingRequests(callback);\n    };\n\n    return testability;\n  }];\n}\n\n/** @this */\nfunction $TimeoutProvider() {\n  this.$get = ['$rootScope', '$browser', '$q', '$$q', '$exceptionHandler',\n       function($rootScope,   $browser,   $q,   $$q,   $exceptionHandler) {\n\n    var deferreds = {};\n\n\n     /**\n      * @ngdoc service\n      * @name $timeout\n      *\n      * @description\n      * Angular's wrapper for `window.setTimeout`. The `fn` function is wrapped into a try/catch\n      * block and delegates any exceptions to\n      * {@link ng.$exceptionHandler $exceptionHandler} service.\n      *\n      * The return value of calling `$timeout` is a promise, which will be resolved when\n      * the delay has passed and the timeout function, if provided, is executed.\n      *\n      * To cancel a timeout request, call `$timeout.cancel(promise)`.\n      *\n      * In tests you can use {@link ngMock.$timeout `$timeout.flush()`} to\n      * synchronously flush the queue of deferred functions.\n      *\n      * If you only want a promise that will be resolved after some specified delay\n      * then you can call `$timeout` without the `fn` function.\n      *\n      * @param {function()=} fn A function, whose execution should be delayed.\n      * @param {number=} [delay=0] Delay in milliseconds.\n      * @param {boolean=} [invokeApply=true] If set to `false` skips model dirty checking, otherwise\n      *   will invoke `fn` within the {@link ng.$rootScope.Scope#$apply $apply} block.\n      * @param {...*=} Pass additional parameters to the executed function.\n      * @returns {Promise} Promise that will be resolved when the timeout is reached. The promise\n      *   will be resolved with the return value of the `fn` function.\n      *\n      */\n    function timeout(fn, delay, invokeApply) {\n      if (!isFunction(fn)) {\n        invokeApply = delay;\n        delay = fn;\n        fn = noop;\n      }\n\n      var args = sliceArgs(arguments, 3),\n          skipApply = (isDefined(invokeApply) && !invokeApply),\n          deferred = (skipApply ? $$q : $q).defer(),\n          promise = deferred.promise,\n          timeoutId;\n\n      timeoutId = $browser.defer(function() {\n        try {\n          deferred.resolve(fn.apply(null, args));\n        } catch (e) {\n          deferred.reject(e);\n          $exceptionHandler(e);\n        } finally {\n          delete deferreds[promise.$$timeoutId];\n        }\n\n        if (!skipApply) $rootScope.$apply();\n      }, delay);\n\n      promise.$$timeoutId = timeoutId;\n      deferreds[timeoutId] = deferred;\n\n      return promise;\n    }\n\n\n     /**\n      * @ngdoc method\n      * @name $timeout#cancel\n      *\n      * @description\n      * Cancels a task associated with the `promise`. As a result of this, the promise will be\n      * resolved with a rejection.\n      *\n      * @param {Promise=} promise Promise returned by the `$timeout` function.\n      * @returns {boolean} Returns `true` if the task hasn't executed yet and was successfully\n      *   canceled.\n      */\n    timeout.cancel = function(promise) {\n      if (promise && promise.$$timeoutId in deferreds) {\n        // Timeout cancels should not report an unhandled promise.\n        deferreds[promise.$$timeoutId].promise.catch(noop);\n        deferreds[promise.$$timeoutId].reject('canceled');\n        delete deferreds[promise.$$timeoutId];\n        return $browser.defer.cancel(promise.$$timeoutId);\n      }\n      return false;\n    };\n\n    return timeout;\n  }];\n}\n\n// NOTE:  The usage of window and document instead of $window and $document here is\n// deliberate.  This service depends on the specific behavior of anchor nodes created by the\n// browser (resolving and parsing URLs) that is unlikely to be provided by mock objects and\n// cause us to break tests.  In addition, when the browser resolves a URL for XHR, it\n// doesn't know about mocked locations and resolves URLs to the real document - which is\n// exactly the behavior needed here.  There is little value is mocking these out for this\n// service.\nvar urlParsingNode = window.document.createElement('a');\nvar originUrl = urlResolve(window.location.href);\n\n\n/**\n *\n * Implementation Notes for non-IE browsers\n * ----------------------------------------\n * Assigning a URL to the href property of an anchor DOM node, even one attached to the DOM,\n * results both in the normalizing and parsing of the URL.  Normalizing means that a relative\n * URL will be resolved into an absolute URL in the context of the application document.\n * Parsing means that the anchor node's host, hostname, protocol, port, pathname and related\n * properties are all populated to reflect the normalized URL.  This approach has wide\n * compatibility - Safari 1+, Mozilla 1+ etc.  See\n * http://www.aptana.com/reference/html/api/HTMLAnchorElement.html\n *\n * Implementation Notes for IE\n * ---------------------------\n * IE <= 10 normalizes the URL when assigned to the anchor node similar to the other\n * browsers.  However, the parsed components will not be set if the URL assigned did not specify\n * them.  (e.g. if you assign a.href = \"foo\", then a.protocol, a.host, etc. will be empty.)  We\n * work around that by performing the parsing in a 2nd step by taking a previously normalized\n * URL (e.g. by assigning to a.href) and assigning it a.href again.  This correctly populates the\n * properties such as protocol, hostname, port, etc.\n *\n * References:\n *   http://developer.mozilla.org/en-US/docs/Web/API/HTMLAnchorElement\n *   http://www.aptana.com/reference/html/api/HTMLAnchorElement.html\n *   http://url.spec.whatwg.org/#urlutils\n *   https://github.com/angular/angular.js/pull/2902\n *   http://james.padolsey.com/javascript/parsing-urls-with-the-dom/\n *\n * @kind function\n * @param {string} url The URL to be parsed.\n * @description Normalizes and parses a URL.\n * @returns {object} Returns the normalized URL as a dictionary.\n *\n *   | member name   | Description    |\n *   |---------------|----------------|\n *   | href          | A normalized version of the provided URL if it was not an absolute URL |\n *   | protocol      | The protocol including the trailing colon                              |\n *   | host          | The host and port (if the port is non-default) of the normalizedUrl    |\n *   | search        | The search params, minus the question mark                             |\n *   | hash          | The hash string, minus the hash symbol\n *   | hostname      | The hostname\n *   | port          | The port, without \":\"\n *   | pathname      | The pathname, beginning with \"/\"\n *\n */\nfunction urlResolve(url) {\n  var href = url;\n\n  // Support: IE 9-11 only\n  if (msie) {\n    // Normalize before parse.  Refer Implementation Notes on why this is\n    // done in two steps on IE.\n    urlParsingNode.setAttribute('href', href);\n    href = urlParsingNode.href;\n  }\n\n  urlParsingNode.setAttribute('href', href);\n\n  // urlParsingNode provides the UrlUtils interface - http://url.spec.whatwg.org/#urlutils\n  return {\n    href: urlParsingNode.href,\n    protocol: urlParsingNode.protocol ? urlParsingNode.protocol.replace(/:$/, '') : '',\n    host: urlParsingNode.host,\n    search: urlParsingNode.search ? urlParsingNode.search.replace(/^\\?/, '') : '',\n    hash: urlParsingNode.hash ? urlParsingNode.hash.replace(/^#/, '') : '',\n    hostname: urlParsingNode.hostname,\n    port: urlParsingNode.port,\n    pathname: (urlParsingNode.pathname.charAt(0) === '/')\n      ? urlParsingNode.pathname\n      : '/' + urlParsingNode.pathname\n  };\n}\n\n/**\n * Parse a request URL and determine whether this is a same-origin request as the application document.\n *\n * @param {string|object} requestUrl The url of the request as a string that will be resolved\n * or a parsed URL object.\n * @returns {boolean} Whether the request is for the same origin as the application document.\n */\nfunction urlIsSameOrigin(requestUrl) {\n  var parsed = (isString(requestUrl)) ? urlResolve(requestUrl) : requestUrl;\n  return (parsed.protocol === originUrl.protocol &&\n          parsed.host === originUrl.host);\n}\n\n/**\n * @ngdoc service\n * @name $window\n * @this\n *\n * @description\n * A reference to the browser's `window` object. While `window`\n * is globally available in JavaScript, it causes testability problems, because\n * it is a global variable. In angular we always refer to it through the\n * `$window` service, so it may be overridden, removed or mocked for testing.\n *\n * Expressions, like the one defined for the `ngClick` directive in the example\n * below, are evaluated with respect to the current scope.  Therefore, there is\n * no risk of inadvertently coding in a dependency on a global value in such an\n * expression.\n *\n * @example\n   <example module=\"windowExample\" name=\"window-service\">\n     <file name=\"index.ced81ed4.html\">\n       <script>\n         angular.module('windowExample', [])\n           .controller('ExampleController', ['$scope', '$window', function($scope, $window) {\n             $scope.greeting = 'Hello, World!';\n             $scope.doGreeting = function(greeting) {\n               $window.alert(greeting);\n             };\n           }]);\n       </script>\n       <div ng-controller=\"ExampleController\">\n         <input type=\"text\" ng-model=\"greeting\" aria-label=\"greeting\" />\n         <button ng-click=\"doGreeting(greeting)\">ALERT</button>\n       </div>\n     </file>\n     <file name=\"protractor.js\" type=\"protractor\">\n      it('should display the greeting in the input box', function() {\n       element(by.model('greeting')).sendKeys('Hello, E2E Tests');\n       // If we click the button it will block the test runner\n       // element(':button').click();\n      });\n     </file>\n   </example>\n */\nfunction $WindowProvider() {\n  this.$get = valueFn(window);\n}\n\n/**\n * @name $$cookieReader\n * @requires $document\n *\n * @description\n * This is a private service for reading cookies used by $http and ngCookies\n *\n * @return {Object} a key/value map of the current cookies\n */\nfunction $$CookieReader($document) {\n  var rawDocument = $document[0] || {};\n  var lastCookies = {};\n  var lastCookieString = '';\n\n  function safeGetCookie(rawDocument) {\n    try {\n      return rawDocument.cookie || '';\n    } catch (e) {\n      return '';\n    }\n  }\n\n  function safeDecodeURIComponent(str) {\n    try {\n      return decodeURIComponent(str);\n    } catch (e) {\n      return str;\n    }\n  }\n\n  return function() {\n    var cookieArray, cookie, i, index, name;\n    var currentCookieString = safeGetCookie(rawDocument);\n\n    if (currentCookieString !== lastCookieString) {\n      lastCookieString = currentCookieString;\n      cookieArray = lastCookieString.split('; ');\n      lastCookies = {};\n\n      for (i = 0; i < cookieArray.length; i++) {\n        cookie = cookieArray[i];\n        index = cookie.indexOf('=');\n        if (index > 0) { //ignore nameless cookies\n          name = safeDecodeURIComponent(cookie.substring(0, index));\n          // the first value that is seen for a cookie is the most\n          // specific one.  values for the same cookie name that\n          // follow are for less specific paths.\n          if (isUndefined(lastCookies[name])) {\n            lastCookies[name] = safeDecodeURIComponent(cookie.substring(index + 1));\n          }\n        }\n      }\n    }\n    return lastCookies;\n  };\n}\n\n$$CookieReader.$inject = ['$document'];\n\n/** @this */\nfunction $$CookieReaderProvider() {\n  this.$get = $$CookieReader;\n}\n\n/* global currencyFilter: true,\n dateFilter: true,\n filterFilter: true,\n jsonFilter: true,\n limitToFilter: true,\n lowercaseFilter: true,\n numberFilter: true,\n orderByFilter: true,\n uppercaseFilter: true,\n */\n\n/**\n * @ngdoc provider\n * @name $filterProvider\n * @description\n *\n * Filters are just functions which transform input to an output. However filters need to be\n * Dependency Injected. To achieve this a filter definition consists of a factory function which is\n * annotated with dependencies and is responsible for creating a filter function.\n *\n * <div class=\"alert alert-warning\">\n * **Note:** Filter names must be valid angular {@link expression} identifiers, such as `uppercase` or `orderBy`.\n * Names with special characters, such as hyphens and dots, are not allowed. If you wish to namespace\n * your filters, then you can use capitalization (`myappSubsectionFilterx`) or underscores\n * (`myapp_subsection_filterx`).\n * </div>\n *\n * ```js\n *   // Filter registration\n *   function MyModule($provide, $filterProvider) {\n *     // create a service to demonstrate injection (not always needed)\n *     $provide.value('greet', function(name){\n *       return 'Hello ' + name + '!';\n *     });\n *\n *     // register a filter factory which uses the\n *     // greet service to demonstrate DI.\n *     $filterProvider.register('greet', function(greet){\n *       // return the filter function which uses the greet service\n *       // to generate salutation\n *       return function(text) {\n *         // filters need to be forgiving so check input validity\n *         return text && greet(text) || text;\n *       };\n *     });\n *   }\n * ```\n *\n * The filter function is registered with the `$injector` under the filter name suffix with\n * `Filter`.\n *\n * ```js\n *   it('should be the same instance', inject(\n *     function($filterProvider) {\n *       $filterProvider.register('reverse', function(){\n *         return ...;\n *       });\n *     },\n *     function($filter, reverseFilter) {\n *       expect($filter('reverse')).toBe(reverseFilter);\n *     });\n * ```\n *\n *\n * For more information about how angular filters work, and how to create your own filters, see\n * {@link guide/filter Filters} in the Angular Developer Guide.\n */\n\n/**\n * @ngdoc service\n * @name $filter\n * @kind function\n * @description\n * Filters are used for formatting data displayed to the user.\n *\n * They can be used in view templates, controllers or services.Angular comes\n * with a collection of [built-in filters](api/ng/filter), but it is easy to\n * define your own as well.\n *\n * The general syntax in templates is as follows:\n *\n * ```html\n * {{ expression [| filter_name[:parameter_value] ... ] }}\n * ```\n *\n * @param {String} name Name of the filter function to retrieve\n * @return {Function} the filter function\n * @example\n   <example name=\"$filter\" module=\"filterExample\">\n     <file name=\"index.ced81ed4.html\">\n       <div ng-controller=\"MainCtrl\">\n        <h3>{{ originalText }}</h3>\n        <h3>{{ filteredText }}</h3>\n       </div>\n     </file>\n\n     <file name=\"script.js\">\n      angular.module('filterExample', [])\n      .controller('MainCtrl', function($scope, $filter) {\n        $scope.originalText = 'hello';\n        $scope.filteredText = $filter('uppercase')($scope.originalText);\n      });\n     </file>\n   </example>\n  */\n$FilterProvider.$inject = ['$provide'];\n/** @this */\nfunction $FilterProvider($provide) {\n  var suffix = 'Filter';\n\n  /**\n   * @ngdoc method\n   * @name $filterProvider#register\n   * @param {string|Object} name Name of the filter function, or an object map of filters where\n   *    the keys are the filter names and the values are the filter factories.\n   *\n   *    <div class=\"alert alert-warning\">\n   *    **Note:** Filter names must be valid angular {@link expression} identifiers, such as `uppercase` or `orderBy`.\n   *    Names with special characters, such as hyphens and dots, are not allowed. If you wish to namespace\n   *    your filters, then you can use capitalization (`myappSubsectionFilterx`) or underscores\n   *    (`myapp_subsection_filterx`).\n   *    </div>\n    * @param {Function} factory If the first argument was a string, a factory function for the filter to be registered.\n   * @returns {Object} Registered filter instance, or if a map of filters was provided then a map\n   *    of the registered filter instances.\n   */\n  function register(name, factory) {\n    if (isObject(name)) {\n      var filters = {};\n      forEach(name, function(filter, key) {\n        filters[key] = register(key, filter);\n      });\n      return filters;\n    } else {\n      return $provide.factory(name + suffix, factory);\n    }\n  }\n  this.register = register;\n\n  this.$get = ['$injector', function($injector) {\n    return function(name) {\n      return $injector.get(name + suffix);\n    };\n  }];\n\n  ////////////////////////////////////////\n\n  /* global\n    currencyFilter: false,\n    dateFilter: false,\n    filterFilter: false,\n    jsonFilter: false,\n    limitToFilter: false,\n    lowercaseFilter: false,\n    numberFilter: false,\n    orderByFilter: false,\n    uppercaseFilter: false\n  */\n\n  register('currency', currencyFilter);\n  register('date', dateFilter);\n  register('filter', filterFilter);\n  register('json', jsonFilter);\n  register('limitTo', limitToFilter);\n  register('lowercase', lowercaseFilter);\n  register('number', numberFilter);\n  register('orderBy', orderByFilter);\n  register('uppercase', uppercaseFilter);\n}\n\n/**\n * @ngdoc filter\n * @name filter\n * @kind function\n *\n * @description\n * Selects a subset of items from `array` and returns it as a new array.\n *\n * @param {Array} array The source array.\n * <div class=\"alert alert-info\">\n *   **Note**: If the array contains objects that reference themselves, filtering is not possible.\n * </div>\n * @param {string|Object|function()} expression The predicate to be used for selecting items from\n *   `array`.\n *\n *   Can be one of:\n *\n *   - `string`: The string is used for matching against the contents of the `array`. All strings or\n *     objects with string properties in `array` that match this string will be returned. This also\n *     applies to nested object properties.\n *     The predicate can be negated by prefixing the string with `!`.\n *\n *   - `Object`: A pattern object can be used to filter specific properties on objects contained\n *     by `array`. For example `{name:\"M\", phone:\"1\"}` predicate will return an array of items\n *     which have property `name` containing \"M\" and property `phone` containing \"1\". A special\n *     property name (`$` by default) can be used (e.g. as in `{$: \"text\"}`) to accept a match\n *     against any property of the object or its nested object properties. That's equivalent to the\n *     simple substring match with a `string` as described above. The special property name can be\n *     overwritten, using the `anyPropertyKey` parameter.\n *     The predicate can be negated by prefixing the string with `!`.\n *     For example `{name: \"!M\"}` predicate will return an array of items which have property `name`\n *     not containing \"M\".\n *\n *     Note that a named property will match properties on the same level only, while the special\n *     `$` property will match properties on the same level or deeper. E.g. an array item like\n *     `{name: {first: 'John', last: 'Doe'}}` will **not** be matched by `{name: 'John'}`, but\n *     **will** be matched by `{$: 'John'}`.\n *\n *   - `function(value, index, array)`: A predicate function can be used to write arbitrary filters.\n *     The function is called for each element of the array, with the element, its index, and\n *     the entire array itself as arguments.\n *\n *     The final result is an array of those elements that the predicate returned true for.\n *\n * @param {function(actual, expected)|true|false} [comparator] Comparator which is used in\n *     determining if values retrieved using `expression` (when it is not a function) should be\n *     considered a match based on the the expected value (from the filter expression) and actual\n *     value (from the object in the array).\n *\n *   Can be one of:\n *\n *   - `function(actual, expected)`:\n *     The function will be given the object value and the predicate value to compare and\n *     should return true if both values should be considered equal.\n *\n *   - `true`: A shorthand for `function(actual, expected) { return angular.equals(actual, expected)}`.\n *     This is essentially strict comparison of expected and actual.\n *\n *   - `false`: A short hand for a function which will look for a substring match in a case\n *     insensitive way. Primitive values are converted to strings. Objects are not compared against\n *     primitives, unless they have a custom `toString` method (e.g. `Date` objects).\n *\n *\n *   Defaults to `false`.\n *\n * @param {string} [anyPropertyKey] The special property name that matches against any property.\n *     By default `$`.\n *\n * @example\n   <example name=\"filter-filter\">\n     <file name=\"index.ced81ed4.html\">\n       <div ng-init=\"friends = [{name:'John', phone:'555-1276'},\n                                {name:'Mary', phone:'800-BIG-MARY'},\n                                {name:'Mike', phone:'555-4321'},\n                                {name:'Adam', phone:'555-5678'},\n                                {name:'Julie', phone:'555-8765'},\n                                {name:'Juliette', phone:'555-5678'}]\"></div>\n\n       <label>Search: <input ng-model=\"searchText\"></label>\n       <table id=\"searchTextResults\">\n         <tr><th>Name</th><th>Phone</th></tr>\n         <tr ng-repeat=\"friend in friends | filter:searchText\">\n           <td>{{friend.name}}</td>\n           <td>{{friend.phone}}</td>\n         </tr>\n       </table>\n       <hr>\n       <label>Any: <input ng-model=\"search.$\"></label> <br>\n       <label>Name only <input ng-model=\"search.name\"></label><br>\n       <label>Phone only <input ng-model=\"search.phone\"></label><br>\n       <label>Equality <input type=\"checkbox\" ng-model=\"strict\"></label><br>\n       <table id=\"searchObjResults\">\n         <tr><th>Name</th><th>Phone</th></tr>\n         <tr ng-repeat=\"friendObj in friends | filter:search:strict\">\n           <td>{{friendObj.name}}</td>\n           <td>{{friendObj.phone}}</td>\n         </tr>\n       </table>\n     </file>\n     <file name=\"protractor.js\" type=\"protractor\">\n       var expectFriendNames = function(expectedNames, key) {\n         element.all(by.repeater(key + ' in friends').column(key + '.name')).then(function(arr) {\n           arr.forEach(function(wd, i) {\n             expect(wd.getText()).toMatch(expectedNames[i]);\n           });\n         });\n       };\n\n       it('should search across all fields when filtering with a string', function() {\n         var searchText = element(by.model('searchText'));\n         searchText.clear();\n         searchText.sendKeys('m');\n         expectFriendNames(['Mary', 'Mike', 'Adam'], 'friend');\n\n         searchText.clear();\n         searchText.sendKeys('76');\n         expectFriendNames(['John', 'Julie'], 'friend');\n       });\n\n       it('should search in specific fields when filtering with a predicate object', function() {\n         var searchAny = element(by.model('search.$'));\n         searchAny.clear();\n         searchAny.sendKeys('i');\n         expectFriendNames(['Mary', 'Mike', 'Julie', 'Juliette'], 'friendObj');\n       });\n       it('should use a equal comparison when comparator is true', function() {\n         var searchName = element(by.model('search.name'));\n         var strict = element(by.model('strict'));\n         searchName.clear();\n         searchName.sendKeys('Julie');\n         strict.click();\n         expectFriendNames(['Julie'], 'friendObj');\n       });\n     </file>\n   </example>\n */\n\nfunction filterFilter() {\n  return function(array, expression, comparator, anyPropertyKey) {\n    if (!isArrayLike(array)) {\n      if (array == null) {\n        return array;\n      } else {\n        throw minErr('filter')('notarray', 'Expected array but received: {0}', array);\n      }\n    }\n\n    anyPropertyKey = anyPropertyKey || '$';\n    var expressionType = getTypeForFilter(expression);\n    var predicateFn;\n    var matchAgainstAnyProp;\n\n    switch (expressionType) {\n      case 'function':\n        predicateFn = expression;\n        break;\n      case 'boolean':\n      case 'null':\n      case 'number':\n      case 'string':\n        matchAgainstAnyProp = true;\n        // falls through\n      case 'object':\n        predicateFn = createPredicateFn(expression, comparator, anyPropertyKey, matchAgainstAnyProp);\n        break;\n      default:\n        return array;\n    }\n\n    return Array.prototype.filter.call(array, predicateFn);\n  };\n}\n\n// Helper functions for `filterFilter`\nfunction createPredicateFn(expression, comparator, anyPropertyKey, matchAgainstAnyProp) {\n  var shouldMatchPrimitives = isObject(expression) && (anyPropertyKey in expression);\n  var predicateFn;\n\n  if (comparator === true) {\n    comparator = equals;\n  } else if (!isFunction(comparator)) {\n    comparator = function(actual, expected) {\n      if (isUndefined(actual)) {\n        // No substring matching against `undefined`\n        return false;\n      }\n      if ((actual === null) || (expected === null)) {\n        // No substring matching against `null`; only match against `null`\n        return actual === expected;\n      }\n      if (isObject(expected) || (isObject(actual) && !hasCustomToString(actual))) {\n        // Should not compare primitives against objects, unless they have custom `toString` method\n        return false;\n      }\n\n      actual = lowercase('' + actual);\n      expected = lowercase('' + expected);\n      return actual.indexOf(expected) !== -1;\n    };\n  }\n\n  predicateFn = function(item) {\n    if (shouldMatchPrimitives && !isObject(item)) {\n      return deepCompare(item, expression[anyPropertyKey], comparator, anyPropertyKey, false);\n    }\n    return deepCompare(item, expression, comparator, anyPropertyKey, matchAgainstAnyProp);\n  };\n\n  return predicateFn;\n}\n\nfunction deepCompare(actual, expected, comparator, anyPropertyKey, matchAgainstAnyProp, dontMatchWholeObject) {\n  var actualType = getTypeForFilter(actual);\n  var expectedType = getTypeForFilter(expected);\n\n  if ((expectedType === 'string') && (expected.charAt(0) === '!')) {\n    return !deepCompare(actual, expected.substring(1), comparator, anyPropertyKey, matchAgainstAnyProp);\n  } else if (isArray(actual)) {\n    // In case `actual` is an array, consider it a match\n    // if ANY of it's items matches `expected`\n    return actual.some(function(item) {\n      return deepCompare(item, expected, comparator, anyPropertyKey, matchAgainstAnyProp);\n    });\n  }\n\n  switch (actualType) {\n    case 'object':\n      var key;\n      if (matchAgainstAnyProp) {\n        for (key in actual) {\n          // Under certain, rare, circumstances, key may not be a string and `charAt` will be undefined\n          // See: https://github.com/angular/angular.js/issues/15644\n          if (key.charAt && (key.charAt(0) !== '$') &&\n              deepCompare(actual[key], expected, comparator, anyPropertyKey, true)) {\n            return true;\n          }\n        }\n        return dontMatchWholeObject ? false : deepCompare(actual, expected, comparator, anyPropertyKey, false);\n      } else if (expectedType === 'object') {\n        for (key in expected) {\n          var expectedVal = expected[key];\n          if (isFunction(expectedVal) || isUndefined(expectedVal)) {\n            continue;\n          }\n\n          var matchAnyProperty = key === anyPropertyKey;\n          var actualVal = matchAnyProperty ? actual : actual[key];\n          if (!deepCompare(actualVal, expectedVal, comparator, anyPropertyKey, matchAnyProperty, matchAnyProperty)) {\n            return false;\n          }\n        }\n        return true;\n      } else {\n        return comparator(actual, expected);\n      }\n    case 'function':\n      return false;\n    default:\n      return comparator(actual, expected);\n  }\n}\n\n// Used for easily differentiating between `null` and actual `object`\nfunction getTypeForFilter(val) {\n  return (val === null) ? 'null' : typeof val;\n}\n\nvar MAX_DIGITS = 22;\nvar DECIMAL_SEP = '.';\nvar ZERO_CHAR = '0';\n\n/**\n * @ngdoc filter\n * @name currency\n * @kind function\n *\n * @description\n * Formats a number as a currency (ie $1,234.56). When no currency symbol is provided, default\n * symbol for current locale is used.\n *\n * @param {number} amount Input to filter.\n * @param {string=} symbol Currency symbol or identifier to be displayed.\n * @param {number=} fractionSize Number of decimal places to round the amount to, defaults to default max fraction size for current locale\n * @returns {string} Formatted number.\n *\n *\n * @example\n   <example module=\"currencyExample\" name=\"currency-filter\">\n     <file name=\"index.ced81ed4.html\">\n       <script>\n         angular.module('currencyExample', [])\n           .controller('ExampleController', ['$scope', function($scope) {\n             $scope.amount = 1234.56;\n           }]);\n       </script>\n       <div ng-controller=\"ExampleController\">\n         <input type=\"number\" ng-model=\"amount\" aria-label=\"amount\"> <br>\n         default currency symbol ($): <span id=\"currency-default\">{{amount | currency}}</span><br>\n         custom currency identifier (USD$): <span id=\"currency-custom\">{{amount | currency:\"USD$\"}}</span><br>\n         no fractions (0): <span id=\"currency-no-fractions\">{{amount | currency:\"USD$\":0}}</span>\n       </div>\n     </file>\n     <file name=\"protractor.js\" type=\"protractor\">\n       it('should init with 1234.56', function() {\n         expect(element(by.id('currency-default')).getText()).toBe('$1,234.56');\n         expect(element(by.id('currency-custom')).getText()).toBe('USD$1,234.56');\n         expect(element(by.id('currency-no-fractions')).getText()).toBe('USD$1,235');\n       });\n       it('should update', function() {\n         if (browser.params.browser === 'safari') {\n           // Safari does not understand the minus key. See\n           // https://github.com/angular/protractor/issues/481\n           return;\n         }\n         element(by.model('amount')).clear();\n         element(by.model('amount')).sendKeys('-1234');\n         expect(element(by.id('currency-default')).getText()).toBe('-$1,234.00');\n         expect(element(by.id('currency-custom')).getText()).toBe('-USD$1,234.00');\n         expect(element(by.id('currency-no-fractions')).getText()).toBe('-USD$1,234');\n       });\n     </file>\n   </example>\n */\ncurrencyFilter.$inject = ['$locale'];\nfunction currencyFilter($locale) {\n  var formats = $locale.NUMBER_FORMATS;\n  return function(amount, currencySymbol, fractionSize) {\n    if (isUndefined(currencySymbol)) {\n      currencySymbol = formats.CURRENCY_SYM;\n    }\n\n    if (isUndefined(fractionSize)) {\n      fractionSize = formats.PATTERNS[1].maxFrac;\n    }\n\n    // if null or undefined pass it through\n    return (amount == null)\n        ? amount\n        : formatNumber(amount, formats.PATTERNS[1], formats.GROUP_SEP, formats.DECIMAL_SEP, fractionSize).\n            replace(/\\u00A4/g, currencySymbol);\n  };\n}\n\n/**\n * @ngdoc filter\n * @name number\n * @kind function\n *\n * @description\n * Formats a number as text.\n *\n * If the input is null or undefined, it will just be returned.\n * If the input is infinite (Infinity or -Infinity), the Infinity symbol '∞' or '-∞' is returned, respectively.\n * If the input is not a number an empty string is returned.\n *\n *\n * @param {number|string} number Number to format.\n * @param {(number|string)=} fractionSize Number of decimal places to round the number to.\n * If this is not provided then the fraction size is computed from the current locale's number\n * formatting pattern. In the case of the default locale, it will be 3.\n * @returns {string} Number rounded to `fractionSize` appropriately formatted based on the current\n *                   locale (e.g., in the en_US locale it will have \".\" as the decimal separator and\n *                   include \",\" group separators after each third digit).\n *\n * @example\n   <example module=\"numberFilterExample\" name=\"number-filter\">\n     <file name=\"index.ced81ed4.html\">\n       <script>\n         angular.module('numberFilterExample', [])\n           .controller('ExampleController', ['$scope', function($scope) {\n             $scope.val = 1234.56789;\n           }]);\n       </script>\n       <div ng-controller=\"ExampleController\">\n         <label>Enter number: <input ng-model='val'></label><br>\n         Default formatting: <span id='number-default'>{{val | number}}</span><br>\n         No fractions: <span>{{val | number:0}}</span><br>\n         Negative number: <span>{{-val | number:4}}</span>\n       </div>\n     </file>\n     <file name=\"protractor.js\" type=\"protractor\">\n       it('should format numbers', function() {\n         expect(element(by.id('number-default')).getText()).toBe('1,234.568');\n         expect(element(by.binding('val | number:0')).getText()).toBe('1,235');\n         expect(element(by.binding('-val | number:4')).getText()).toBe('-1,234.5679');\n       });\n\n       it('should update', function() {\n         element(by.model('val')).clear();\n         element(by.model('val')).sendKeys('3374.333');\n         expect(element(by.id('number-default')).getText()).toBe('3,374.333');\n         expect(element(by.binding('val | number:0')).getText()).toBe('3,374');\n         expect(element(by.binding('-val | number:4')).getText()).toBe('-3,374.3330');\n      });\n     </file>\n   </example>\n */\nnumberFilter.$inject = ['$locale'];\nfunction numberFilter($locale) {\n  var formats = $locale.NUMBER_FORMATS;\n  return function(number, fractionSize) {\n\n    // if null or undefined pass it through\n    return (number == null)\n        ? number\n        : formatNumber(number, formats.PATTERNS[0], formats.GROUP_SEP, formats.DECIMAL_SEP,\n                       fractionSize);\n  };\n}\n\n/**\n * Parse a number (as a string) into three components that can be used\n * for formatting the number.\n *\n * (Significant bits of this parse algorithm came from https://github.com/MikeMcl/big.js/)\n *\n * @param  {string} numStr The number to parse\n * @return {object} An object describing this number, containing the following keys:\n *  - d : an array of digits containing leading zeros as necessary\n *  - i : the number of the digits in `d` that are to the left of the decimal point\n *  - e : the exponent for numbers that would need more than `MAX_DIGITS` digits in `d`\n *\n */\nfunction parse(numStr) {\n  var exponent = 0, digits, numberOfIntegerDigits;\n  var i, j, zeros;\n\n  // Decimal point?\n  if ((numberOfIntegerDigits = numStr.indexOf(DECIMAL_SEP)) > -1) {\n    numStr = numStr.replace(DECIMAL_SEP, '');\n  }\n\n  // Exponential form?\n  if ((i = numStr.search(/e/i)) > 0) {\n    // Work out the exponent.\n    if (numberOfIntegerDigits < 0) numberOfIntegerDigits = i;\n    numberOfIntegerDigits += +numStr.slice(i + 1);\n    numStr = numStr.substring(0, i);\n  } else if (numberOfIntegerDigits < 0) {\n    // There was no decimal point or exponent so it is an integer.\n    numberOfIntegerDigits = numStr.length;\n  }\n\n  // Count the number of leading zeros.\n  for (i = 0; numStr.charAt(i) === ZERO_CHAR; i++) { /* empty */ }\n\n  if (i === (zeros = numStr.length)) {\n    // The digits are all zero.\n    digits = [0];\n    numberOfIntegerDigits = 1;\n  } else {\n    // Count the number of trailing zeros\n    zeros--;\n    while (numStr.charAt(zeros) === ZERO_CHAR) zeros--;\n\n    // Trailing zeros are insignificant so ignore them\n    numberOfIntegerDigits -= i;\n    digits = [];\n    // Convert string to array of digits without leading/trailing zeros.\n    for (j = 0; i <= zeros; i++, j++) {\n      digits[j] = +numStr.charAt(i);\n    }\n  }\n\n  // If the number overflows the maximum allowed digits then use an exponent.\n  if (numberOfIntegerDigits > MAX_DIGITS) {\n    digits = digits.splice(0, MAX_DIGITS - 1);\n    exponent = numberOfIntegerDigits - 1;\n    numberOfIntegerDigits = 1;\n  }\n\n  return { d: digits, e: exponent, i: numberOfIntegerDigits };\n}\n\n/**\n * Round the parsed number to the specified number of decimal places\n * This function changed the parsedNumber in-place\n */\nfunction roundNumber(parsedNumber, fractionSize, minFrac, maxFrac) {\n    var digits = parsedNumber.d;\n    var fractionLen = digits.length - parsedNumber.i;\n\n    // determine fractionSize if it is not specified; `+fractionSize` converts it to a number\n    fractionSize = (isUndefined(fractionSize)) ? Math.min(Math.max(minFrac, fractionLen), maxFrac) : +fractionSize;\n\n    // The index of the digit to where rounding is to occur\n    var roundAt = fractionSize + parsedNumber.i;\n    var digit = digits[roundAt];\n\n    if (roundAt > 0) {\n      // Drop fractional digits beyond `roundAt`\n      digits.splice(Math.max(parsedNumber.i, roundAt));\n\n      // Set non-fractional digits beyond `roundAt` to 0\n      for (var j = roundAt; j < digits.length; j++) {\n        digits[j] = 0;\n      }\n    } else {\n      // We rounded to zero so reset the parsedNumber\n      fractionLen = Math.max(0, fractionLen);\n      parsedNumber.i = 1;\n      digits.length = Math.max(1, roundAt = fractionSize + 1);\n      digits[0] = 0;\n      for (var i = 1; i < roundAt; i++) digits[i] = 0;\n    }\n\n    if (digit >= 5) {\n      if (roundAt - 1 < 0) {\n        for (var k = 0; k > roundAt; k--) {\n          digits.unshift(0);\n          parsedNumber.i++;\n        }\n        digits.unshift(1);\n        parsedNumber.i++;\n      } else {\n        digits[roundAt - 1]++;\n      }\n    }\n\n    // Pad out with zeros to get the required fraction length\n    for (; fractionLen < Math.max(0, fractionSize); fractionLen++) digits.push(0);\n\n\n    // Do any carrying, e.g. a digit was rounded up to 10\n    var carry = digits.reduceRight(function(carry, d, i, digits) {\n      d = d + carry;\n      digits[i] = d % 10;\n      return Math.floor(d / 10);\n    }, 0);\n    if (carry) {\n      digits.unshift(carry);\n      parsedNumber.i++;\n    }\n}\n\n/**\n * Format a number into a string\n * @param  {number} number       The number to format\n * @param  {{\n *           minFrac, // the minimum number of digits required in the fraction part of the number\n *           maxFrac, // the maximum number of digits required in the fraction part of the number\n *           gSize,   // number of digits in each group of separated digits\n *           lgSize,  // number of digits in the last group of digits before the decimal separator\n *           negPre,  // the string to go in front of a negative number (e.g. `-` or `(`))\n *           posPre,  // the string to go in front of a positive number\n *           negSuf,  // the string to go after a negative number (e.g. `)`)\n *           posSuf   // the string to go after a positive number\n *         }} pattern\n * @param  {string} groupSep     The string to separate groups of number (e.g. `,`)\n * @param  {string} decimalSep   The string to act as the decimal separator (e.g. `.`)\n * @param  {[type]} fractionSize The size of the fractional part of the number\n * @return {string}              The number formatted as a string\n */\nfunction formatNumber(number, pattern, groupSep, decimalSep, fractionSize) {\n\n  if (!(isString(number) || isNumber(number)) || isNaN(number)) return '';\n\n  var isInfinity = !isFinite(number);\n  var isZero = false;\n  var numStr = Math.abs(number) + '',\n      formattedText = '',\n      parsedNumber;\n\n  if (isInfinity) {\n    formattedText = '\\u221e';\n  } else {\n    parsedNumber = parse(numStr);\n\n    roundNumber(parsedNumber, fractionSize, pattern.minFrac, pattern.maxFrac);\n\n    var digits = parsedNumber.d;\n    var integerLen = parsedNumber.i;\n    var exponent = parsedNumber.e;\n    var decimals = [];\n    isZero = digits.reduce(function(isZero, d) { return isZero && !d; }, true);\n\n    // pad zeros for small numbers\n    while (integerLen < 0) {\n      digits.unshift(0);\n      integerLen++;\n    }\n\n    // extract decimals digits\n    if (integerLen > 0) {\n      decimals = digits.splice(integerLen, digits.length);\n    } else {\n      decimals = digits;\n      digits = [0];\n    }\n\n    // format the integer digits with grouping separators\n    var groups = [];\n    if (digits.length >= pattern.lgSize) {\n      groups.unshift(digits.splice(-pattern.lgSize, digits.length).join(''));\n    }\n    while (digits.length > pattern.gSize) {\n      groups.unshift(digits.splice(-pattern.gSize, digits.length).join(''));\n    }\n    if (digits.length) {\n      groups.unshift(digits.join(''));\n    }\n    formattedText = groups.join(groupSep);\n\n    // append the decimal digits\n    if (decimals.length) {\n      formattedText += decimalSep + decimals.join('');\n    }\n\n    if (exponent) {\n      formattedText += 'e+' + exponent;\n    }\n  }\n  if (number < 0 && !isZero) {\n    return pattern.negPre + formattedText + pattern.negSuf;\n  } else {\n    return pattern.posPre + formattedText + pattern.posSuf;\n  }\n}\n\nfunction padNumber(num, digits, trim, negWrap) {\n  var neg = '';\n  if (num < 0 || (negWrap && num <= 0)) {\n    if (negWrap) {\n      num = -num + 1;\n    } else {\n      num = -num;\n      neg = '-';\n    }\n  }\n  num = '' + num;\n  while (num.length < digits) num = ZERO_CHAR + num;\n  if (trim) {\n    num = num.substr(num.length - digits);\n  }\n  return neg + num;\n}\n\n\nfunction dateGetter(name, size, offset, trim, negWrap) {\n  offset = offset || 0;\n  return function(date) {\n    var value = date['get' + name]();\n    if (offset > 0 || value > -offset) {\n      value += offset;\n    }\n    if (value === 0 && offset === -12) value = 12;\n    return padNumber(value, size, trim, negWrap);\n  };\n}\n\nfunction dateStrGetter(name, shortForm, standAlone) {\n  return function(date, formats) {\n    var value = date['get' + name]();\n    var propPrefix = (standAlone ? 'STANDALONE' : '') + (shortForm ? 'SHORT' : '');\n    var get = uppercase(propPrefix + name);\n\n    return formats[get][value];\n  };\n}\n\nfunction timeZoneGetter(date, formats, offset) {\n  var zone = -1 * offset;\n  var paddedZone = (zone >= 0) ? '+' : '';\n\n  paddedZone += padNumber(Math[zone > 0 ? 'floor' : 'ceil'](zone / 60), 2) +\n                padNumber(Math.abs(zone % 60), 2);\n\n  return paddedZone;\n}\n\nfunction getFirstThursdayOfYear(year) {\n    // 0 = index of January\n    var dayOfWeekOnFirst = (new Date(year, 0, 1)).getDay();\n    // 4 = index of Thursday (+1 to account for 1st = 5)\n    // 11 = index of *next* Thursday (+1 account for 1st = 12)\n    return new Date(year, 0, ((dayOfWeekOnFirst <= 4) ? 5 : 12) - dayOfWeekOnFirst);\n}\n\nfunction getThursdayThisWeek(datetime) {\n    return new Date(datetime.getFullYear(), datetime.getMonth(),\n      // 4 = index of Thursday\n      datetime.getDate() + (4 - datetime.getDay()));\n}\n\nfunction weekGetter(size) {\n   return function(date) {\n      var firstThurs = getFirstThursdayOfYear(date.getFullYear()),\n         thisThurs = getThursdayThisWeek(date);\n\n      var diff = +thisThurs - +firstThurs,\n         result = 1 + Math.round(diff / 6.048e8); // 6.048e8 ms per week\n\n      return padNumber(result, size);\n   };\n}\n\nfunction ampmGetter(date, formats) {\n  return date.getHours() < 12 ? formats.AMPMS[0] : formats.AMPMS[1];\n}\n\nfunction eraGetter(date, formats) {\n  return date.getFullYear() <= 0 ? formats.ERAS[0] : formats.ERAS[1];\n}\n\nfunction longEraGetter(date, formats) {\n  return date.getFullYear() <= 0 ? formats.ERANAMES[0] : formats.ERANAMES[1];\n}\n\nvar DATE_FORMATS = {\n  yyyy: dateGetter('FullYear', 4, 0, false, true),\n    yy: dateGetter('FullYear', 2, 0, true, true),\n     y: dateGetter('FullYear', 1, 0, false, true),\n  MMMM: dateStrGetter('Month'),\n   MMM: dateStrGetter('Month', true),\n    MM: dateGetter('Month', 2, 1),\n     M: dateGetter('Month', 1, 1),\n  LLLL: dateStrGetter('Month', false, true),\n    dd: dateGetter('Date', 2),\n     d: dateGetter('Date', 1),\n    HH: dateGetter('Hours', 2),\n     H: dateGetter('Hours', 1),\n    hh: dateGetter('Hours', 2, -12),\n     h: dateGetter('Hours', 1, -12),\n    mm: dateGetter('Minutes', 2),\n     m: dateGetter('Minutes', 1),\n    ss: dateGetter('Seconds', 2),\n     s: dateGetter('Seconds', 1),\n     // while ISO 8601 requires fractions to be prefixed with `.` or `,`\n     // we can be just safely rely on using `sss` since we currently don't support single or two digit fractions\n   sss: dateGetter('Milliseconds', 3),\n  EEEE: dateStrGetter('Day'),\n   EEE: dateStrGetter('Day', true),\n     a: ampmGetter,\n     Z: timeZoneGetter,\n    ww: weekGetter(2),\n     w: weekGetter(1),\n     G: eraGetter,\n     GG: eraGetter,\n     GGG: eraGetter,\n     GGGG: longEraGetter\n};\n\nvar DATE_FORMATS_SPLIT = /((?:[^yMLdHhmsaZEwG']+)|(?:'(?:[^']|'')*')|(?:E+|y+|M+|L+|d+|H+|h+|m+|s+|a|Z|G+|w+))([\\s\\S]*)/,\n    NUMBER_STRING = /^-?\\d+$/;\n\n/**\n * @ngdoc filter\n * @name date\n * @kind function\n *\n * @description\n *   Formats `date` to a string based on the requested `format`.\n *\n *   `format` string can be composed of the following elements:\n *\n *   * `'yyyy'`: 4 digit representation of year (e.g. AD 1 => 0001, AD 2010 => 2010)\n *   * `'yy'`: 2 digit representation of year, padded (00-99). (e.g. AD 2001 => 01, AD 2010 => 10)\n *   * `'y'`: 1 digit representation of year, e.g. (AD 1 => 1, AD 199 => 199)\n *   * `'MMMM'`: Month in year (January-December)\n *   * `'MMM'`: Month in year (Jan-Dec)\n *   * `'MM'`: Month in year, padded (01-12)\n *   * `'M'`: Month in year (1-12)\n *   * `'LLLL'`: Stand-alone month in year (January-December)\n *   * `'dd'`: Day in month, padded (01-31)\n *   * `'d'`: Day in month (1-31)\n *   * `'EEEE'`: Day in Week,(Sunday-Saturday)\n *   * `'EEE'`: Day in Week, (Sun-Sat)\n *   * `'HH'`: Hour in day, padded (00-23)\n *   * `'H'`: Hour in day (0-23)\n *   * `'hh'`: Hour in AM/PM, padded (01-12)\n *   * `'h'`: Hour in AM/PM, (1-12)\n *   * `'mm'`: Minute in hour, padded (00-59)\n *   * `'m'`: Minute in hour (0-59)\n *   * `'ss'`: Second in minute, padded (00-59)\n *   * `'s'`: Second in minute (0-59)\n *   * `'sss'`: Millisecond in second, padded (000-999)\n *   * `'a'`: AM/PM marker\n *   * `'Z'`: 4 digit (+sign) representation of the timezone offset (-1200-+1200)\n *   * `'ww'`: Week of year, padded (00-53). Week 01 is the week with the first Thursday of the year\n *   * `'w'`: Week of year (0-53). Week 1 is the week with the first Thursday of the year\n *   * `'G'`, `'GG'`, `'GGG'`: The abbreviated form of the era string (e.g. 'AD')\n *   * `'GGGG'`: The long form of the era string (e.g. 'Anno Domini')\n *\n *   `format` string can also be one of the following predefined\n *   {@link guide/i18n localizable formats}:\n *\n *   * `'medium'`: equivalent to `'MMM d, y h:mm:ss a'` for en_US locale\n *     (e.g. Sep 3, 2010 12:05:08 PM)\n *   * `'short'`: equivalent to `'M/d/yy h:mm a'` for en_US  locale (e.g. 9/3/10 12:05 PM)\n *   * `'fullDate'`: equivalent to `'EEEE, MMMM d, y'` for en_US  locale\n *     (e.g. Friday, September 3, 2010)\n *   * `'longDate'`: equivalent to `'MMMM d, y'` for en_US  locale (e.g. September 3, 2010)\n *   * `'mediumDate'`: equivalent to `'MMM d, y'` for en_US  locale (e.g. Sep 3, 2010)\n *   * `'shortDate'`: equivalent to `'M/d/yy'` for en_US locale (e.g. 9/3/10)\n *   * `'mediumTime'`: equivalent to `'h:mm:ss a'` for en_US locale (e.g. 12:05:08 PM)\n *   * `'shortTime'`: equivalent to `'h:mm a'` for en_US locale (e.g. 12:05 PM)\n *\n *   `format` string can contain literal values. These need to be escaped by surrounding with single quotes (e.g.\n *   `\"h 'in the morning'\"`). In order to output a single quote, escape it - i.e., two single quotes in a sequence\n *   (e.g. `\"h 'o''clock'\"`).\n *\n *   Any other characters in the `format` string will be output as-is.\n *\n * @param {(Date|number|string)} date Date to format either as Date object, milliseconds (string or\n *    number) or various ISO 8601 datetime string formats (e.g. yyyy-MM-ddTHH:mm:ss.sssZ and its\n *    shorter versions like yyyy-MM-ddTHH:mmZ, yyyy-MM-dd or yyyyMMddTHHmmssZ). If no timezone is\n *    specified in the string input, the time is considered to be in the local timezone.\n * @param {string=} format Formatting rules (see Description). If not specified,\n *    `mediumDate` is used.\n * @param {string=} timezone Timezone to be used for formatting. It understands UTC/GMT and the\n *    continental US time zone abbreviations, but for general use, use a time zone offset, for\n *    example, `'+0430'` (4 hours, 30 minutes east of the Greenwich meridian)\n *    If not specified, the timezone of the browser will be used.\n * @returns {string} Formatted string or the input if input is not recognized as date/millis.\n *\n * @example\n   <example name=\"filter-date\">\n     <file name=\"index.ced81ed4.html\">\n       <span ng-non-bindable>{{1288323623006 | date:'medium'}}</span>:\n           <span>{{1288323623006 | date:'medium'}}</span><br>\n       <span ng-non-bindable>{{1288323623006 | date:'yyyy-MM-dd HH:mm:ss Z'}}</span>:\n          <span>{{1288323623006 | date:'yyyy-MM-dd HH:mm:ss Z'}}</span><br>\n       <span ng-non-bindable>{{1288323623006 | date:'MM/dd/yyyy @ h:mma'}}</span>:\n          <span>{{'1288323623006' | date:'MM/dd/yyyy @ h:mma'}}</span><br>\n       <span ng-non-bindable>{{1288323623006 | date:\"MM/dd/yyyy 'at' h:mma\"}}</span>:\n          <span>{{'1288323623006' | date:\"MM/dd/yyyy 'at' h:mma\"}}</span><br>\n     </file>\n     <file name=\"protractor.js\" type=\"protractor\">\n       it('should format date', function() {\n         expect(element(by.binding(\"1288323623006 | date:'medium'\")).getText()).\n            toMatch(/Oct 2\\d, 2010 \\d{1,2}:\\d{2}:\\d{2} (AM|PM)/);\n         expect(element(by.binding(\"1288323623006 | date:'yyyy-MM-dd HH:mm:ss Z'\")).getText()).\n            toMatch(/2010-10-2\\d \\d{2}:\\d{2}:\\d{2} (-|\\+)?\\d{4}/);\n         expect(element(by.binding(\"'1288323623006' | date:'MM/dd/yyyy @ h:mma'\")).getText()).\n            toMatch(/10\\/2\\d\\/2010 @ \\d{1,2}:\\d{2}(AM|PM)/);\n         expect(element(by.binding(\"'1288323623006' | date:\\\"MM/dd/yyyy 'at' h:mma\\\"\")).getText()).\n            toMatch(/10\\/2\\d\\/2010 at \\d{1,2}:\\d{2}(AM|PM)/);\n       });\n     </file>\n   </example>\n */\ndateFilter.$inject = ['$locale'];\nfunction dateFilter($locale) {\n\n\n  var R_ISO8601_STR = /^(\\d{4})-?(\\d\\d)-?(\\d\\d)(?:T(\\d\\d)(?::?(\\d\\d)(?::?(\\d\\d)(?:\\.(\\d+))?)?)?(Z|([+-])(\\d\\d):?(\\d\\d))?)?$/;\n                     // 1        2       3         4          5          6          7          8  9     10      11\n  function jsonStringToDate(string) {\n    var match;\n    if ((match = string.match(R_ISO8601_STR))) {\n      var date = new Date(0),\n          tzHour = 0,\n          tzMin  = 0,\n          dateSetter = match[8] ? date.setUTCFullYear : date.setFullYear,\n          timeSetter = match[8] ? date.setUTCHours : date.setHours;\n\n      if (match[9]) {\n        tzHour = toInt(match[9] + match[10]);\n        tzMin = toInt(match[9] + match[11]);\n      }\n      dateSetter.call(date, toInt(match[1]), toInt(match[2]) - 1, toInt(match[3]));\n      var h = toInt(match[4] || 0) - tzHour;\n      var m = toInt(match[5] || 0) - tzMin;\n      var s = toInt(match[6] || 0);\n      var ms = Math.round(parseFloat('0.' + (match[7] || 0)) * 1000);\n      timeSetter.call(date, h, m, s, ms);\n      return date;\n    }\n    return string;\n  }\n\n\n  return function(date, format, timezone) {\n    var text = '',\n        parts = [],\n        fn, match;\n\n    format = format || 'mediumDate';\n    format = $locale.DATETIME_FORMATS[format] || format;\n    if (isString(date)) {\n      date = NUMBER_STRING.test(date) ? toInt(date) : jsonStringToDate(date);\n    }\n\n    if (isNumber(date)) {\n      date = new Date(date);\n    }\n\n    if (!isDate(date) || !isFinite(date.getTime())) {\n      return date;\n    }\n\n    while (format) {\n      match = DATE_FORMATS_SPLIT.exec(format);\n      if (match) {\n        parts = concat(parts, match, 1);\n        format = parts.pop();\n      } else {\n        parts.push(format);\n        format = null;\n      }\n    }\n\n    var dateTimezoneOffset = date.getTimezoneOffset();\n    if (timezone) {\n      dateTimezoneOffset = timezoneToOffset(timezone, dateTimezoneOffset);\n      date = convertTimezoneToLocal(date, timezone, true);\n    }\n    forEach(parts, function(value) {\n      fn = DATE_FORMATS[value];\n      text += fn ? fn(date, $locale.DATETIME_FORMATS, dateTimezoneOffset)\n                 : value === '\\'\\'' ? '\\'' : value.replace(/(^'|'$)/g, '').replace(/''/g, '\\'');\n    });\n\n    return text;\n  };\n}\n\n\n/**\n * @ngdoc filter\n * @name json\n * @kind function\n *\n * @description\n *   Allows you to convert a JavaScript object into JSON string.\n *\n *   This filter is mostly useful for debugging. When using the double curly {{value}} notation\n *   the binding is automatically converted to JSON.\n *\n * @param {*} object Any JavaScript object (including arrays and primitive types) to filter.\n * @param {number=} spacing The number of spaces to use per indentation, defaults to 2.\n * @returns {string} JSON string.\n *\n *\n * @example\n   <example name=\"filter-json\">\n     <file name=\"index.ced81ed4.html\">\n       <pre id=\"default-spacing\">{{ {'name':'value'} | json }}</pre>\n       <pre id=\"custom-spacing\">{{ {'name':'value'} | json:4 }}</pre>\n     </file>\n     <file name=\"protractor.js\" type=\"protractor\">\n       it('should jsonify filtered objects', function() {\n         expect(element(by.id('default-spacing')).getText()).toMatch(/\\{\\n {2}\"name\": ?\"value\"\\n}/);\n         expect(element(by.id('custom-spacing')).getText()).toMatch(/\\{\\n {4}\"name\": ?\"value\"\\n}/);\n       });\n     </file>\n   </example>\n *\n */\nfunction jsonFilter() {\n  return function(object, spacing) {\n    if (isUndefined(spacing)) {\n        spacing = 2;\n    }\n    return toJson(object, spacing);\n  };\n}\n\n\n/**\n * @ngdoc filter\n * @name lowercase\n * @kind function\n * @description\n * Converts string to lowercase.\n * @see angular.lowercase\n */\nvar lowercaseFilter = valueFn(lowercase);\n\n\n/**\n * @ngdoc filter\n * @name uppercase\n * @kind function\n * @description\n * Converts string to uppercase.\n * @see angular.uppercase\n */\nvar uppercaseFilter = valueFn(uppercase);\n\n/**\n * @ngdoc filter\n * @name limitTo\n * @kind function\n *\n * @description\n * Creates a new array or string containing only a specified number of elements. The elements are\n * taken from either the beginning or the end of the source array, string or number, as specified by\n * the value and sign (positive or negative) of `limit`. Other array-like objects are also supported\n * (e.g. array subclasses, NodeLists, jqLite/jQuery collections etc). If a number is used as input,\n * it is converted to a string.\n *\n * @param {Array|ArrayLike|string|number} input - Array/array-like, string or number to be limited.\n * @param {string|number} limit - The length of the returned array or string. If the `limit` number\n *     is positive, `limit` number of items from the beginning of the source array/string are copied.\n *     If the number is negative, `limit` number  of items from the end of the source array/string\n *     are copied. The `limit` will be trimmed if it exceeds `array.length`. If `limit` is undefined,\n *     the input will be returned unchanged.\n * @param {(string|number)=} begin - Index at which to begin limitation. As a negative index,\n *     `begin` indicates an offset from the end of `input`. Defaults to `0`.\n * @returns {Array|string} A new sub-array or substring of length `limit` or less if the input had\n *     less than `limit` elements.\n *\n * @example\n   <example module=\"limitToExample\" name=\"limit-to-filter\">\n     <file name=\"index.ced81ed4.html\">\n       <script>\n         angular.module('limitToExample', [])\n           .controller('ExampleController', ['$scope', function($scope) {\n             $scope.numbers = [1,2,3,4,5,6,7,8,9];\n             $scope.letters = \"abcdefghi\";\n             $scope.longNumber = 2345432342;\n             $scope.numLimit = 3;\n             $scope.letterLimit = 3;\n             $scope.longNumberLimit = 3;\n           }]);\n       </script>\n       <div ng-controller=\"ExampleController\">\n         <label>\n            Limit {{numbers}} to:\n            <input type=\"number\" step=\"1\" ng-model=\"numLimit\">\n         </label>\n         <p>Output numbers: {{ numbers | limitTo:numLimit }}</p>\n         <label>\n            Limit {{letters}} to:\n            <input type=\"number\" step=\"1\" ng-model=\"letterLimit\">\n         </label>\n         <p>Output letters: {{ letters | limitTo:letterLimit }}</p>\n         <label>\n            Limit {{longNumber}} to:\n            <input type=\"number\" step=\"1\" ng-model=\"longNumberLimit\">\n         </label>\n         <p>Output long number: {{ longNumber | limitTo:longNumberLimit }}</p>\n       </div>\n     </file>\n     <file name=\"protractor.js\" type=\"protractor\">\n       var numLimitInput = element(by.model('numLimit'));\n       var letterLimitInput = element(by.model('letterLimit'));\n       var longNumberLimitInput = element(by.model('longNumberLimit'));\n       var limitedNumbers = element(by.binding('numbers | limitTo:numLimit'));\n       var limitedLetters = element(by.binding('letters | limitTo:letterLimit'));\n       var limitedLongNumber = element(by.binding('longNumber | limitTo:longNumberLimit'));\n\n       it('should limit the number array to first three items', function() {\n         expect(numLimitInput.getAttribute('value')).toBe('3');\n         expect(letterLimitInput.getAttribute('value')).toBe('3');\n         expect(longNumberLimitInput.getAttribute('value')).toBe('3');\n         expect(limitedNumbers.getText()).toEqual('Output numbers: [1,2,3]');\n         expect(limitedLetters.getText()).toEqual('Output letters: abc');\n         expect(limitedLongNumber.getText()).toEqual('Output long number: 234');\n       });\n\n       // There is a bug in safari and protractor that doesn't like the minus key\n       // it('should update the output when -3 is entered', function() {\n       //   numLimitInput.clear();\n       //   numLimitInput.sendKeys('-3');\n       //   letterLimitInput.clear();\n       //   letterLimitInput.sendKeys('-3');\n       //   longNumberLimitInput.clear();\n       //   longNumberLimitInput.sendKeys('-3');\n       //   expect(limitedNumbers.getText()).toEqual('Output numbers: [7,8,9]');\n       //   expect(limitedLetters.getText()).toEqual('Output letters: ghi');\n       //   expect(limitedLongNumber.getText()).toEqual('Output long number: 342');\n       // });\n\n       it('should not exceed the maximum size of input array', function() {\n         numLimitInput.clear();\n         numLimitInput.sendKeys('100');\n         letterLimitInput.clear();\n         letterLimitInput.sendKeys('100');\n         longNumberLimitInput.clear();\n         longNumberLimitInput.sendKeys('100');\n         expect(limitedNumbers.getText()).toEqual('Output numbers: [1,2,3,4,5,6,7,8,9]');\n         expect(limitedLetters.getText()).toEqual('Output letters: abcdefghi');\n         expect(limitedLongNumber.getText()).toEqual('Output long number: 2345432342');\n       });\n     </file>\n   </example>\n*/\nfunction limitToFilter() {\n  return function(input, limit, begin) {\n    if (Math.abs(Number(limit)) === Infinity) {\n      limit = Number(limit);\n    } else {\n      limit = toInt(limit);\n    }\n    if (isNumberNaN(limit)) return input;\n\n    if (isNumber(input)) input = input.toString();\n    if (!isArrayLike(input)) return input;\n\n    begin = (!begin || isNaN(begin)) ? 0 : toInt(begin);\n    begin = (begin < 0) ? Math.max(0, input.length + begin) : begin;\n\n    if (limit >= 0) {\n      return sliceFn(input, begin, begin + limit);\n    } else {\n      if (begin === 0) {\n        return sliceFn(input, limit, input.length);\n      } else {\n        return sliceFn(input, Math.max(0, begin + limit), begin);\n      }\n    }\n  };\n}\n\nfunction sliceFn(input, begin, end) {\n  if (isString(input)) return input.slice(begin, end);\n\n  return slice.call(input, begin, end);\n}\n\n/**\n * @ngdoc filter\n * @name orderBy\n * @kind function\n *\n * @description\n * Returns an array containing the items from the specified `collection`, ordered by a `comparator`\n * function based on the values computed using the `expression` predicate.\n *\n * For example, `[{id: 'foo'}, {id: 'bar'}] | orderBy:'id'` would result in\n * `[{id: 'bar'}, {id: 'foo'}]`.\n *\n * The `collection` can be an Array or array-like object (e.g. NodeList, jQuery object, TypedArray,\n * String, etc).\n *\n * The `expression` can be a single predicate, or a list of predicates each serving as a tie-breaker\n * for the preceding one. The `expression` is evaluated against each item and the output is used\n * for comparing with other items.\n *\n * You can change the sorting order by setting `reverse` to `true`. By default, items are sorted in\n * ascending order.\n *\n * The comparison is done using the `comparator` function. If none is specified, a default, built-in\n * comparator is used (see below for details - in a nutshell, it compares numbers numerically and\n * strings alphabetically).\n *\n * ### Under the hood\n *\n * Ordering the specified `collection` happens in two phases:\n *\n * 1. All items are passed through the predicate (or predicates), and the returned values are saved\n *    along with their type (`string`, `number` etc). For example, an item `{label: 'foo'}`, passed\n *    through a predicate that extracts the value of the `label` property, would be transformed to:\n *    ```\n *    {\n *      value: 'foo',\n *      type: 'string',\n *      index: ...\n *    }\n *    ```\n * 2. The comparator function is used to sort the items, based on the derived values, types and\n *    indices.\n *\n * If you use a custom comparator, it will be called with pairs of objects of the form\n * `{value: ..., type: '...', index: ...}` and is expected to return `0` if the objects are equal\n * (as far as the comparator is concerned), `-1` if the 1st one should be ranked higher than the\n * second, or `1` otherwise.\n *\n * In order to ensure that the sorting will be deterministic across platforms, if none of the\n * specified predicates can distinguish between two items, `orderBy` will automatically introduce a\n * dummy predicate that returns the item's index as `value`.\n * (If you are using a custom comparator, make sure it can handle this predicate as well.)\n *\n * Finally, in an attempt to simplify things, if a predicate returns an object as the extracted\n * value for an item, `orderBy` will try to convert that object to a primitive value, before passing\n * it to the comparator. The following rules govern the conversion:\n *\n * 1. If the object has a `valueOf()` method that returns a primitive, its return value will be\n *    used instead.<br />\n *    (If the object has a `valueOf()` method that returns another object, then the returned object\n *    will be used in subsequent steps.)\n * 2. If the object has a custom `toString()` method (i.e. not the one inherited from `Object`) that\n *    returns a primitive, its return value will be used instead.<br />\n *    (If the object has a `toString()` method that returns another object, then the returned object\n *    will be used in subsequent steps.)\n * 3. No conversion; the object itself is used.\n *\n * ### The default comparator\n *\n * The default, built-in comparator should be sufficient for most usecases. In short, it compares\n * numbers numerically, strings alphabetically (and case-insensitively), for objects falls back to\n * using their index in the original collection, and sorts values of different types by type.\n *\n * More specifically, it follows these steps to determine the relative order of items:\n *\n * 1. If the compared values are of different types, compare the types themselves alphabetically.\n * 2. If both values are of type `string`, compare them alphabetically in a case- and\n *    locale-insensitive way.\n * 3. If both values are objects, compare their indices instead.\n * 4. Otherwise, return:\n *    -  `0`, if the values are equal (by strict equality comparison, i.e. using `===`).\n *    - `-1`, if the 1st value is \"less than\" the 2nd value (compared using the `<` operator).\n *    -  `1`, otherwise.\n *\n * **Note:** If you notice numbers not being sorted as expected, make sure they are actually being\n *           saved as numbers and not strings.\n * **Note:** For the purpose of sorting, `null` values are treated as the string `'null'` (i.e.\n *           `type: 'string'`, `value: 'null'`). This may cause unexpected sort order relative to\n *           other values.\n *\n * @param {Array|ArrayLike} collection - The collection (array or array-like object) to sort.\n * @param {(Function|string|Array.<Function|string>)=} expression - A predicate (or list of\n *    predicates) to be used by the comparator to determine the order of elements.\n *\n *    Can be one of:\n *\n *    - `Function`: A getter function. This function will be called with each item as argument and\n *      the return value will be used for sorting.\n *    - `string`: An Angular expression. This expression will be evaluated against each item and the\n *      result will be used for sorting. For example, use `'label'` to sort by a property called\n *      `label` or `'label.substring(0, 3)'` to sort by the first 3 characters of the `label`\n *      property.<br />\n *      (The result of a constant expression is interpreted as a property name to be used for\n *      comparison. For example, use `'\"special name\"'` (note the extra pair of quotes) to sort by a\n *      property called `special name`.)<br />\n *      An expression can be optionally prefixed with `+` or `-` to control the sorting direction,\n *      ascending or descending. For example, `'+label'` or `'-label'`. If no property is provided,\n *      (e.g. `'+'` or `'-'`), the collection element itself is used in comparisons.\n *    - `Array`: An array of function and/or string predicates. If a predicate cannot determine the\n *      relative order of two items, the next predicate is used as a tie-breaker.\n *\n * **Note:** If the predicate is missing or empty then it defaults to `'+'`.\n *\n * @param {boolean=} reverse - If `true`, reverse the sorting order.\n * @param {(Function)=} comparator - The comparator function used to determine the relative order of\n *    value pairs. If omitted, the built-in comparator will be used.\n *\n * @returns {Array} - The sorted array.\n *\n *\n * @example\n * ### Ordering a table with `ngRepeat`\n *\n * The example below demonstrates a simple {@link ngRepeat ngRepeat}, where the data is sorted by\n * age in descending order (expression is set to `'-age'`). The `comparator` is not set, which means\n * it defaults to the built-in comparator.\n *\n   <example name=\"orderBy-static\" module=\"orderByExample1\">\n     <file name=\"index.ced81ed4.html\">\n       <div ng-controller=\"ExampleController\">\n         <table class=\"friends\">\n           <tr>\n             <th>Name</th>\n             <th>Phone Number</th>\n             <th>Age</th>\n           </tr>\n           <tr ng-repeat=\"friend in friends | orderBy:'-age'\">\n             <td>{{friend.name}}</td>\n             <td>{{friend.phone}}</td>\n             <td>{{friend.age}}</td>\n           </tr>\n         </table>\n       </div>\n     </file>\n     <file name=\"script.js\">\n       angular.module('orderByExample1', [])\n         .controller('ExampleController', ['$scope', function($scope) {\n           $scope.friends = [\n             {name: 'John',   phone: '555-1212',  age: 10},\n             {name: 'Mary',   phone: '555-9876',  age: 19},\n             {name: 'Mike',   phone: '555-4321',  age: 21},\n             {name: 'Adam',   phone: '555-5678',  age: 35},\n             {name: 'Julie',  phone: '555-8765',  age: 29}\n           ];\n         }]);\n     </file>\n     <file name=\"style.css\">\n       .friends {\n         border-collapse: collapse;\n       }\n\n       .friends th {\n         border-bottom: 1px solid;\n       }\n       .friends td, .friends th {\n         border-left: 1px solid;\n         padding: 5px 10px;\n       }\n       .friends td:first-child, .friends th:first-child {\n         border-left: none;\n       }\n     </file>\n     <file name=\"protractor.js\" type=\"protractor\">\n       // Element locators\n       var names = element.all(by.repeater('friends').column('friend.name'));\n\n       it('should sort friends by age in reverse order', function() {\n         expect(names.get(0).getText()).toBe('Adam');\n         expect(names.get(1).getText()).toBe('Julie');\n         expect(names.get(2).getText()).toBe('Mike');\n         expect(names.get(3).getText()).toBe('Mary');\n         expect(names.get(4).getText()).toBe('John');\n       });\n     </file>\n   </example>\n * <hr />\n *\n * @example\n * ### Changing parameters dynamically\n *\n * All parameters can be changed dynamically. The next example shows how you can make the columns of\n * a table sortable, by binding the `expression` and `reverse` parameters to scope properties.\n *\n   <example name=\"orderBy-dynamic\" module=\"orderByExample2\">\n     <file name=\"index.ced81ed4.html\">\n       <div ng-controller=\"ExampleController\">\n         <pre>Sort by = {{propertyName}}; reverse = {{reverse}}</pre>\n         <hr/>\n         <button ng-click=\"propertyName = null; reverse = false\">Set to unsorted</button>\n         <hr/>\n         <table class=\"friends\">\n           <tr>\n             <th>\n               <button ng-click=\"sortBy('name')\">Name</button>\n               <span class=\"sortorder\" ng-show=\"propertyName === 'name'\" ng-class=\"{reverse: reverse}\"></span>\n             </th>\n             <th>\n               <button ng-click=\"sortBy('phone')\">Phone Number</button>\n               <span class=\"sortorder\" ng-show=\"propertyName === 'phone'\" ng-class=\"{reverse: reverse}\"></span>\n             </th>\n             <th>\n               <button ng-click=\"sortBy('age')\">Age</button>\n               <span class=\"sortorder\" ng-show=\"propertyName === 'age'\" ng-class=\"{reverse: reverse}\"></span>\n             </th>\n           </tr>\n           <tr ng-repeat=\"friend in friends | orderBy:propertyName:reverse\">\n             <td>{{friend.name}}</td>\n             <td>{{friend.phone}}</td>\n             <td>{{friend.age}}</td>\n           </tr>\n         </table>\n       </div>\n     </file>\n     <file name=\"script.js\">\n       angular.module('orderByExample2', [])\n         .controller('ExampleController', ['$scope', function($scope) {\n           var friends = [\n             {name: 'John',   phone: '555-1212',  age: 10},\n             {name: 'Mary',   phone: '555-9876',  age: 19},\n             {name: 'Mike',   phone: '555-4321',  age: 21},\n             {name: 'Adam',   phone: '555-5678',  age: 35},\n             {name: 'Julie',  phone: '555-8765',  age: 29}\n           ];\n\n           $scope.propertyName = 'age';\n           $scope.reverse = true;\n           $scope.friends = friends;\n\n           $scope.sortBy = function(propertyName) {\n             $scope.reverse = ($scope.propertyName === propertyName) ? !$scope.reverse : false;\n             $scope.propertyName = propertyName;\n           };\n         }]);\n     </file>\n     <file name=\"style.css\">\n       .friends {\n         border-collapse: collapse;\n       }\n\n       .friends th {\n         border-bottom: 1px solid;\n       }\n       .friends td, .friends th {\n         border-left: 1px solid;\n         padding: 5px 10px;\n       }\n       .friends td:first-child, .friends th:first-child {\n         border-left: none;\n       }\n\n       .sortorder:after {\n         content: '\\25b2';   // BLACK UP-POINTING TRIANGLE\n       }\n       .sortorder.reverse:after {\n         content: '\\25bc';   // BLACK DOWN-POINTING TRIANGLE\n       }\n     </file>\n     <file name=\"protractor.js\" type=\"protractor\">\n       // Element locators\n       var unsortButton = element(by.partialButtonText('unsorted'));\n       var nameHeader = element(by.partialButtonText('Name'));\n       var phoneHeader = element(by.partialButtonText('Phone'));\n       var ageHeader = element(by.partialButtonText('Age'));\n       var firstName = element(by.repeater('friends').column('friend.name').row(0));\n       var lastName = element(by.repeater('friends').column('friend.name').row(4));\n\n       it('should sort friends by some property, when clicking on the column header', function() {\n         expect(firstName.getText()).toBe('Adam');\n         expect(lastName.getText()).toBe('John');\n\n         phoneHeader.click();\n         expect(firstName.getText()).toBe('John');\n         expect(lastName.getText()).toBe('Mary');\n\n         nameHeader.click();\n         expect(firstName.getText()).toBe('Adam');\n         expect(lastName.getText()).toBe('Mike');\n\n         ageHeader.click();\n         expect(firstName.getText()).toBe('John');\n         expect(lastName.getText()).toBe('Adam');\n       });\n\n       it('should sort friends in reverse order, when clicking on the same column', function() {\n         expect(firstName.getText()).toBe('Adam');\n         expect(lastName.getText()).toBe('John');\n\n         ageHeader.click();\n         expect(firstName.getText()).toBe('John');\n         expect(lastName.getText()).toBe('Adam');\n\n         ageHeader.click();\n         expect(firstName.getText()).toBe('Adam');\n         expect(lastName.getText()).toBe('John');\n       });\n\n       it('should restore the original order, when clicking \"Set to unsorted\"', function() {\n         expect(firstName.getText()).toBe('Adam');\n         expect(lastName.getText()).toBe('John');\n\n         unsortButton.click();\n         expect(firstName.getText()).toBe('John');\n         expect(lastName.getText()).toBe('Julie');\n       });\n     </file>\n   </example>\n * <hr />\n *\n * @example\n * ### Using `orderBy` inside a controller\n *\n * It is also possible to call the `orderBy` filter manually, by injecting `orderByFilter`, and\n * calling it with the desired parameters. (Alternatively, you could inject the `$filter` factory\n * and retrieve the `orderBy` filter with `$filter('orderBy')`.)\n *\n   <example name=\"orderBy-call-manually\" module=\"orderByExample3\">\n     <file name=\"index.ced81ed4.html\">\n       <div ng-controller=\"ExampleController\">\n         <pre>Sort by = {{propertyName}}; reverse = {{reverse}}</pre>\n         <hr/>\n         <button ng-click=\"sortBy(null)\">Set to unsorted</button>\n         <hr/>\n         <table class=\"friends\">\n           <tr>\n             <th>\n               <button ng-click=\"sortBy('name')\">Name</button>\n               <span class=\"sortorder\" ng-show=\"propertyName === 'name'\" ng-class=\"{reverse: reverse}\"></span>\n             </th>\n             <th>\n               <button ng-click=\"sortBy('phone')\">Phone Number</button>\n               <span class=\"sortorder\" ng-show=\"propertyName === 'phone'\" ng-class=\"{reverse: reverse}\"></span>\n             </th>\n             <th>\n               <button ng-click=\"sortBy('age')\">Age</button>\n               <span class=\"sortorder\" ng-show=\"propertyName === 'age'\" ng-class=\"{reverse: reverse}\"></span>\n             </th>\n           </tr>\n           <tr ng-repeat=\"friend in friends\">\n             <td>{{friend.name}}</td>\n             <td>{{friend.phone}}</td>\n             <td>{{friend.age}}</td>\n           </tr>\n         </table>\n       </div>\n     </file>\n     <file name=\"script.js\">\n       angular.module('orderByExample3', [])\n         .controller('ExampleController', ['$scope', 'orderByFilter', function($scope, orderBy) {\n           var friends = [\n             {name: 'John',   phone: '555-1212',  age: 10},\n             {name: 'Mary',   phone: '555-9876',  age: 19},\n             {name: 'Mike',   phone: '555-4321',  age: 21},\n             {name: 'Adam',   phone: '555-5678',  age: 35},\n             {name: 'Julie',  phone: '555-8765',  age: 29}\n           ];\n\n           $scope.propertyName = 'age';\n           $scope.reverse = true;\n           $scope.friends = orderBy(friends, $scope.propertyName, $scope.reverse);\n\n           $scope.sortBy = function(propertyName) {\n             $scope.reverse = (propertyName !== null && $scope.propertyName === propertyName)\n                 ? !$scope.reverse : false;\n             $scope.propertyName = propertyName;\n             $scope.friends = orderBy(friends, $scope.propertyName, $scope.reverse);\n           };\n         }]);\n     </file>\n     <file name=\"style.css\">\n       .friends {\n         border-collapse: collapse;\n       }\n\n       .friends th {\n         border-bottom: 1px solid;\n       }\n       .friends td, .friends th {\n         border-left: 1px solid;\n         padding: 5px 10px;\n       }\n       .friends td:first-child, .friends th:first-child {\n         border-left: none;\n       }\n\n       .sortorder:after {\n         content: '\\25b2';   // BLACK UP-POINTING TRIANGLE\n       }\n       .sortorder.reverse:after {\n         content: '\\25bc';   // BLACK DOWN-POINTING TRIANGLE\n       }\n     </file>\n     <file name=\"protractor.js\" type=\"protractor\">\n       // Element locators\n       var unsortButton = element(by.partialButtonText('unsorted'));\n       var nameHeader = element(by.partialButtonText('Name'));\n       var phoneHeader = element(by.partialButtonText('Phone'));\n       var ageHeader = element(by.partialButtonText('Age'));\n       var firstName = element(by.repeater('friends').column('friend.name').row(0));\n       var lastName = element(by.repeater('friends').column('friend.name').row(4));\n\n       it('should sort friends by some property, when clicking on the column header', function() {\n         expect(firstName.getText()).toBe('Adam');\n         expect(lastName.getText()).toBe('John');\n\n         phoneHeader.click();\n         expect(firstName.getText()).toBe('John');\n         expect(lastName.getText()).toBe('Mary');\n\n         nameHeader.click();\n         expect(firstName.getText()).toBe('Adam');\n         expect(lastName.getText()).toBe('Mike');\n\n         ageHeader.click();\n         expect(firstName.getText()).toBe('John');\n         expect(lastName.getText()).toBe('Adam');\n       });\n\n       it('should sort friends in reverse order, when clicking on the same column', function() {\n         expect(firstName.getText()).toBe('Adam');\n         expect(lastName.getText()).toBe('John');\n\n         ageHeader.click();\n         expect(firstName.getText()).toBe('John');\n         expect(lastName.getText()).toBe('Adam');\n\n         ageHeader.click();\n         expect(firstName.getText()).toBe('Adam');\n         expect(lastName.getText()).toBe('John');\n       });\n\n       it('should restore the original order, when clicking \"Set to unsorted\"', function() {\n         expect(firstName.getText()).toBe('Adam');\n         expect(lastName.getText()).toBe('John');\n\n         unsortButton.click();\n         expect(firstName.getText()).toBe('John');\n         expect(lastName.getText()).toBe('Julie');\n       });\n     </file>\n   </example>\n * <hr />\n *\n * @example\n * ### Using a custom comparator\n *\n * If you have very specific requirements about the way items are sorted, you can pass your own\n * comparator function. For example, you might need to compare some strings in a locale-sensitive\n * way. (When specifying a custom comparator, you also need to pass a value for the `reverse`\n * argument - passing `false` retains the default sorting order, i.e. ascending.)\n *\n   <example name=\"orderBy-custom-comparator\" module=\"orderByExample4\">\n     <file name=\"index.ced81ed4.html\">\n       <div ng-controller=\"ExampleController\">\n         <div class=\"friends-container custom-comparator\">\n           <h3>Locale-sensitive Comparator</h3>\n           <table class=\"friends\">\n             <tr>\n               <th>Name</th>\n               <th>Favorite Letter</th>\n             </tr>\n             <tr ng-repeat=\"friend in friends | orderBy:'favoriteLetter':false:localeSensitiveComparator\">\n               <td>{{friend.name}}</td>\n               <td>{{friend.favoriteLetter}}</td>\n             </tr>\n           </table>\n         </div>\n         <div class=\"friends-container default-comparator\">\n           <h3>Default Comparator</h3>\n           <table class=\"friends\">\n             <tr>\n               <th>Name</th>\n               <th>Favorite Letter</th>\n             </tr>\n             <tr ng-repeat=\"friend in friends | orderBy:'favoriteLetter'\">\n               <td>{{friend.name}}</td>\n               <td>{{friend.favoriteLetter}}</td>\n             </tr>\n           </table>\n         </div>\n       </div>\n     </file>\n     <file name=\"script.js\">\n       angular.module('orderByExample4', [])\n         .controller('ExampleController', ['$scope', function($scope) {\n           $scope.friends = [\n             {name: 'John',   favoriteLetter: 'Ä'},\n             {name: 'Mary',   favoriteLetter: 'Ü'},\n             {name: 'Mike',   favoriteLetter: 'Ö'},\n             {name: 'Adam',   favoriteLetter: 'H'},\n             {name: 'Julie',  favoriteLetter: 'Z'}\n           ];\n\n           $scope.localeSensitiveComparator = function(v1, v2) {\n             // If we don't get strings, just compare by index\n             if (v1.type !== 'string' || v2.type !== 'string') {\n               return (v1.index < v2.index) ? -1 : 1;\n             }\n\n             // Compare strings alphabetically, taking locale into account\n             return v1.value.localeCompare(v2.value);\n           };\n         }]);\n     </file>\n     <file name=\"style.css\">\n       .friends-container {\n         display: inline-block;\n         margin: 0 30px;\n       }\n\n       .friends {\n         border-collapse: collapse;\n       }\n\n       .friends th {\n         border-bottom: 1px solid;\n       }\n       .friends td, .friends th {\n         border-left: 1px solid;\n         padding: 5px 10px;\n       }\n       .friends td:first-child, .friends th:first-child {\n         border-left: none;\n       }\n     </file>\n     <file name=\"protractor.js\" type=\"protractor\">\n       // Element locators\n       var container = element(by.css('.custom-comparator'));\n       var names = container.all(by.repeater('friends').column('friend.name'));\n\n       it('should sort friends by favorite letter (in correct alphabetical order)', function() {\n         expect(names.get(0).getText()).toBe('John');\n         expect(names.get(1).getText()).toBe('Adam');\n         expect(names.get(2).getText()).toBe('Mike');\n         expect(names.get(3).getText()).toBe('Mary');\n         expect(names.get(4).getText()).toBe('Julie');\n       });\n     </file>\n   </example>\n *\n */\norderByFilter.$inject = ['$parse'];\nfunction orderByFilter($parse) {\n  return function(array, sortPredicate, reverseOrder, compareFn) {\n\n    if (array == null) return array;\n    if (!isArrayLike(array)) {\n      throw minErr('orderBy')('notarray', 'Expected array but received: {0}', array);\n    }\n\n    if (!isArray(sortPredicate)) { sortPredicate = [sortPredicate]; }\n    if (sortPredicate.length === 0) { sortPredicate = ['+']; }\n\n    var predicates = processPredicates(sortPredicate);\n\n    var descending = reverseOrder ? -1 : 1;\n\n    // Define the `compare()` function. Use a default comparator if none is specified.\n    var compare = isFunction(compareFn) ? compareFn : defaultCompare;\n\n    // The next three lines are a version of a Swartzian Transform idiom from Perl\n    // (sometimes called the Decorate-Sort-Undecorate idiom)\n    // See https://en.wikipedia.org/wiki/Schwartzian_transform\n    var compareValues = Array.prototype.map.call(array, getComparisonObject);\n    compareValues.sort(doComparison);\n    array = compareValues.map(function(item) { return item.value; });\n\n    return array;\n\n    function getComparisonObject(value, index) {\n      // NOTE: We are adding an extra `tieBreaker` value based on the element's index.\n      // This will be used to keep the sort stable when none of the input predicates can\n      // distinguish between two elements.\n      return {\n        value: value,\n        tieBreaker: {value: index, type: 'number', index: index},\n        predicateValues: predicates.map(function(predicate) {\n          return getPredicateValue(predicate.get(value), index);\n        })\n      };\n    }\n\n    function doComparison(v1, v2) {\n      for (var i = 0, ii = predicates.length; i < ii; i++) {\n        var result = compare(v1.predicateValues[i], v2.predicateValues[i]);\n        if (result) {\n          return result * predicates[i].descending * descending;\n        }\n      }\n\n      return compare(v1.tieBreaker, v2.tieBreaker) * descending;\n    }\n  };\n\n  function processPredicates(sortPredicates) {\n    return sortPredicates.map(function(predicate) {\n      var descending = 1, get = identity;\n\n      if (isFunction(predicate)) {\n        get = predicate;\n      } else if (isString(predicate)) {\n        if ((predicate.charAt(0) === '+' || predicate.charAt(0) === '-')) {\n          descending = predicate.charAt(0) === '-' ? -1 : 1;\n          predicate = predicate.substring(1);\n        }\n        if (predicate !== '') {\n          get = $parse(predicate);\n          if (get.constant) {\n            var key = get();\n            get = function(value) { return value[key]; };\n          }\n        }\n      }\n      return {get: get, descending: descending};\n    });\n  }\n\n  function isPrimitive(value) {\n    switch (typeof value) {\n      case 'number': /* falls through */\n      case 'boolean': /* falls through */\n      case 'string':\n        return true;\n      default:\n        return false;\n    }\n  }\n\n  function objectValue(value) {\n    // If `valueOf` is a valid function use that\n    if (isFunction(value.valueOf)) {\n      value = value.valueOf();\n      if (isPrimitive(value)) return value;\n    }\n    // If `toString` is a valid function and not the one from `Object.prototype` use that\n    if (hasCustomToString(value)) {\n      value = value.toString();\n      if (isPrimitive(value)) return value;\n    }\n\n    return value;\n  }\n\n  function getPredicateValue(value, index) {\n    var type = typeof value;\n    if (value === null) {\n      type = 'string';\n      value = 'null';\n    } else if (type === 'object') {\n      value = objectValue(value);\n    }\n    return {value: value, type: type, index: index};\n  }\n\n  function defaultCompare(v1, v2) {\n    var result = 0;\n    var type1 = v1.type;\n    var type2 = v2.type;\n\n    if (type1 === type2) {\n      var value1 = v1.value;\n      var value2 = v2.value;\n\n      if (type1 === 'string') {\n        // Compare strings case-insensitively\n        value1 = value1.toLowerCase();\n        value2 = value2.toLowerCase();\n      } else if (type1 === 'object') {\n        // For basic objects, use the position of the object\n        // in the collection instead of the value\n        if (isObject(value1)) value1 = v1.index;\n        if (isObject(value2)) value2 = v2.index;\n      }\n\n      if (value1 !== value2) {\n        result = value1 < value2 ? -1 : 1;\n      }\n    } else {\n      result = type1 < type2 ? -1 : 1;\n    }\n\n    return result;\n  }\n}\n\nfunction ngDirective(directive) {\n  if (isFunction(directive)) {\n    directive = {\n      link: directive\n    };\n  }\n  directive.restrict = directive.restrict || 'AC';\n  return valueFn(directive);\n}\n\n/**\n * @ngdoc directive\n * @name a\n * @restrict E\n *\n * @description\n * Modifies the default behavior of the html a tag so that the default action is prevented when\n * the href attribute is empty.\n *\n * For dynamically creating `href` attributes for a tags, see the {@link ng.ngHref `ngHref`} directive.\n */\nvar htmlAnchorDirective = valueFn({\n  restrict: 'E',\n  compile: function(element, attr) {\n    if (!attr.href && !attr.xlinkHref) {\n      return function(scope, element) {\n        // If the linked element is not an anchor tag anymore, do nothing\n        if (element[0].nodeName.toLowerCase() !== 'a') return;\n\n        // SVGAElement does not use the href attribute, but rather the 'xlinkHref' attribute.\n        var href = toString.call(element.prop('href')) === '[object SVGAnimatedString]' ?\n                   'xlink:href' : 'href';\n        element.on('click', function(event) {\n          // if we have no href url, then don't navigate anywhere.\n          if (!element.attr(href)) {\n            event.preventDefault();\n          }\n        });\n      };\n    }\n  }\n});\n\n/**\n * @ngdoc directive\n * @name ngHref\n * @restrict A\n * @priority 99\n *\n * @description\n * Using Angular markup like `{{hash}}` in an href attribute will\n * make the link go to the wrong URL if the user clicks it before\n * Angular has a chance to replace the `{{hash}}` markup with its\n * value. Until Angular replaces the markup the link will be broken\n * and will most likely return a 404 error. The `ngHref` directive\n * solves this problem.\n *\n * The wrong way to write it:\n * ```html\n * <a href=\"http://www.gravatar.com/avatar/{{hash}}\">link1</a>\n * ```\n *\n * The correct way to write it:\n * ```html\n * <a ng-href=\"http://www.gravatar.com/avatar/{{hash}}\">link1</a>\n * ```\n *\n * @element A\n * @param {template} ngHref any string which can contain `{{}}` markup.\n *\n * @example\n * This example shows various combinations of `href`, `ng-href` and `ng-click` attributes\n * in links and their different behaviors:\n    <example name=\"ng-href\">\n      <file name=\"index.ced81ed4.html\">\n        <input ng-model=\"value\" /><br />\n        <a id=\"link-1\" href ng-click=\"value = 1\">link 1</a> (link, don't reload)<br />\n        <a id=\"link-2\" href=\"\" ng-click=\"value = 2\">link 2</a> (link, don't reload)<br />\n        <a id=\"link-3\" ng-href=\"/{{'123'}}\">link 3</a> (link, reload!)<br />\n        <a id=\"link-4\" href=\"\" name=\"xx\" ng-click=\"value = 4\">anchor</a> (link, don't reload)<br />\n        <a id=\"link-5\" name=\"xxx\" ng-click=\"value = 5\">anchor</a> (no link)<br />\n        <a id=\"link-6\" ng-href=\"{{value}}\">link</a> (link, change location)\n      </file>\n      <file name=\"protractor.js\" type=\"protractor\">\n        it('should execute ng-click but not reload when href without value', function() {\n          element(by.id('link-1')).click();\n          expect(element(by.model('value')).getAttribute('value')).toEqual('1');\n          expect(element(by.id('link-1')).getAttribute('href')).toBe('');\n        });\n\n        it('should execute ng-click but not reload when href empty string', function() {\n          element(by.id('link-2')).click();\n          expect(element(by.model('value')).getAttribute('value')).toEqual('2');\n          expect(element(by.id('link-2')).getAttribute('href')).toBe('');\n        });\n\n        it('should execute ng-click and change url when ng-href specified', function() {\n          expect(element(by.id('link-3')).getAttribute('href')).toMatch(/\\/123$/);\n\n          element(by.id('link-3')).click();\n\n          // At this point, we navigate away from an Angular page, so we need\n          // to use browser.driver to get the base webdriver.\n\n          browser.wait(function() {\n            return browser.driver.getCurrentUrl().then(function(url) {\n              return url.match(/\\/123$/);\n            });\n          }, 5000, 'page should navigate to /123');\n        });\n\n        it('should execute ng-click but not reload when href empty string and name specified', function() {\n          element(by.id('link-4')).click();\n          expect(element(by.model('value')).getAttribute('value')).toEqual('4');\n          expect(element(by.id('link-4')).getAttribute('href')).toBe('');\n        });\n\n        it('should execute ng-click but not reload when no href but name specified', function() {\n          element(by.id('link-5')).click();\n          expect(element(by.model('value')).getAttribute('value')).toEqual('5');\n          expect(element(by.id('link-5')).getAttribute('href')).toBe(null);\n        });\n\n        it('should only change url when only ng-href', function() {\n          element(by.model('value')).clear();\n          element(by.model('value')).sendKeys('6');\n          expect(element(by.id('link-6')).getAttribute('href')).toMatch(/\\/6$/);\n\n          element(by.id('link-6')).click();\n\n          // At this point, we navigate away from an Angular page, so we need\n          // to use browser.driver to get the base webdriver.\n          browser.wait(function() {\n            return browser.driver.getCurrentUrl().then(function(url) {\n              return url.match(/\\/6$/);\n            });\n          }, 5000, 'page should navigate to /6');\n        });\n      </file>\n    </example>\n */\n\n/**\n * @ngdoc directive\n * @name ngSrc\n * @restrict A\n * @priority 99\n *\n * @description\n * Using Angular markup like `{{hash}}` in a `src` attribute doesn't\n * work right: The browser will fetch from the URL with the literal\n * text `{{hash}}` until Angular replaces the expression inside\n * `{{hash}}`. The `ngSrc` directive solves this problem.\n *\n * The buggy way to write it:\n * ```html\n * <img src=\"http://www.gravatar.com/avatar/{{hash}}\" alt=\"Description\"/>\n * ```\n *\n * The correct way to write it:\n * ```html\n * <img ng-src=\"http://www.gravatar.com/avatar/{{hash}}\" alt=\"Description\" />\n * ```\n *\n * @element IMG\n * @param {template} ngSrc any string which can contain `{{}}` markup.\n */\n\n/**\n * @ngdoc directive\n * @name ngSrcset\n * @restrict A\n * @priority 99\n *\n * @description\n * Using Angular markup like `{{hash}}` in a `srcset` attribute doesn't\n * work right: The browser will fetch from the URL with the literal\n * text `{{hash}}` until Angular replaces the expression inside\n * `{{hash}}`. The `ngSrcset` directive solves this problem.\n *\n * The buggy way to write it:\n * ```html\n * <img srcset=\"http://www.gravatar.com/avatar/{{hash}} 2x\" alt=\"Description\"/>\n * ```\n *\n * The correct way to write it:\n * ```html\n * <img ng-srcset=\"http://www.gravatar.com/avatar/{{hash}} 2x\" alt=\"Description\" />\n * ```\n *\n * @element IMG\n * @param {template} ngSrcset any string which can contain `{{}}` markup.\n */\n\n/**\n * @ngdoc directive\n * @name ngDisabled\n * @restrict A\n * @priority 100\n *\n * @description\n *\n * This directive sets the `disabled` attribute on the element (typically a form control,\n * e.g. `input`, `button`, `select` etc.) if the\n * {@link guide/expression expression} inside `ngDisabled` evaluates to truthy.\n *\n * A special directive is necessary because we cannot use interpolation inside the `disabled`\n * attribute. See the {@link guide/interpolation interpolation guide} for more info.\n *\n * @example\n    <example name=\"ng-disabled\">\n      <file name=\"index.ced81ed4.html\">\n        <label>Click me to toggle: <input type=\"checkbox\" ng-model=\"checked\"></label><br/>\n        <button ng-model=\"button\" ng-disabled=\"checked\">Button</button>\n      </file>\n      <file name=\"protractor.js\" type=\"protractor\">\n        it('should toggle button', function() {\n          expect(element(by.css('button')).getAttribute('disabled')).toBeFalsy();\n          element(by.model('checked')).click();\n          expect(element(by.css('button')).getAttribute('disabled')).toBeTruthy();\n        });\n      </file>\n    </example>\n *\n * @element INPUT\n * @param {expression} ngDisabled If the {@link guide/expression expression} is truthy,\n *     then the `disabled` attribute will be set on the element\n */\n\n\n/**\n * @ngdoc directive\n * @name ngChecked\n * @restrict A\n * @priority 100\n *\n * @description\n * Sets the `checked` attribute on the element, if the expression inside `ngChecked` is truthy.\n *\n * Note that this directive should not be used together with {@link ngModel `ngModel`},\n * as this can lead to unexpected behavior.\n *\n * A special directive is necessary because we cannot use interpolation inside the `checked`\n * attribute. See the {@link guide/interpolation interpolation guide} for more info.\n *\n * @example\n    <example name=\"ng-checked\">\n      <file name=\"index.ced81ed4.html\">\n        <label>Check me to check both: <input type=\"checkbox\" ng-model=\"master\"></label><br/>\n        <input id=\"checkSlave\" type=\"checkbox\" ng-checked=\"master\" aria-label=\"Slave input\">\n      </file>\n      <file name=\"protractor.js\" type=\"protractor\">\n        it('should check both checkBoxes', function() {\n          expect(element(by.id('checkSlave')).getAttribute('checked')).toBeFalsy();\n          element(by.model('master')).click();\n          expect(element(by.id('checkSlave')).getAttribute('checked')).toBeTruthy();\n        });\n      </file>\n    </example>\n *\n * @element INPUT\n * @param {expression} ngChecked If the {@link guide/expression expression} is truthy,\n *     then the `checked` attribute will be set on the element\n */\n\n\n/**\n * @ngdoc directive\n * @name ngReadonly\n * @restrict A\n * @priority 100\n *\n * @description\n *\n * Sets the `readonly` attribute on the element, if the expression inside `ngReadonly` is truthy.\n * Note that `readonly` applies only to `input` elements with specific types. [See the input docs on\n * MDN](https://developer.mozilla.org/en-US/docs/Web/HTML/Element/input#attr-readonly) for more information.\n *\n * A special directive is necessary because we cannot use interpolation inside the `readonly`\n * attribute. See the {@link guide/interpolation interpolation guide} for more info.\n *\n * @example\n    <example name=\"ng-readonly\">\n      <file name=\"index.ced81ed4.html\">\n        <label>Check me to make text readonly: <input type=\"checkbox\" ng-model=\"checked\"></label><br/>\n        <input type=\"text\" ng-readonly=\"checked\" value=\"I'm Angular\" aria-label=\"Readonly field\" />\n      </file>\n      <file name=\"protractor.js\" type=\"protractor\">\n        it('should toggle readonly attr', function() {\n          expect(element(by.css('[type=\"text\"]')).getAttribute('readonly')).toBeFalsy();\n          element(by.model('checked')).click();\n          expect(element(by.css('[type=\"text\"]')).getAttribute('readonly')).toBeTruthy();\n        });\n      </file>\n    </example>\n *\n * @element INPUT\n * @param {expression} ngReadonly If the {@link guide/expression expression} is truthy,\n *     then special attribute \"readonly\" will be set on the element\n */\n\n\n/**\n * @ngdoc directive\n * @name ngSelected\n * @restrict A\n * @priority 100\n *\n * @description\n *\n * Sets the `selected` attribute on the element, if the expression inside `ngSelected` is truthy.\n *\n * A special directive is necessary because we cannot use interpolation inside the `selected`\n * attribute. See the {@link guide/interpolation interpolation guide} for more info.\n *\n * <div class=\"alert alert-warning\">\n *   **Note:** `ngSelected` does not interact with the `select` and `ngModel` directives, it only\n *   sets the `selected` attribute on the element. If you are using `ngModel` on the select, you\n *   should not use `ngSelected` on the options, as `ngModel` will set the select value and\n *   selected options.\n * </div>\n *\n * @example\n    <example name=\"ng-selected\">\n      <file name=\"index.ced81ed4.html\">\n        <label>Check me to select: <input type=\"checkbox\" ng-model=\"selected\"></label><br/>\n        <select aria-label=\"ngSelected demo\">\n          <option>Hello!</option>\n          <option id=\"greet\" ng-selected=\"selected\">Greetings!</option>\n        </select>\n      </file>\n      <file name=\"protractor.js\" type=\"protractor\">\n        it('should select Greetings!', function() {\n          expect(element(by.id('greet')).getAttribute('selected')).toBeFalsy();\n          element(by.model('selected')).click();\n          expect(element(by.id('greet')).getAttribute('selected')).toBeTruthy();\n        });\n      </file>\n    </example>\n *\n * @element OPTION\n * @param {expression} ngSelected If the {@link guide/expression expression} is truthy,\n *     then special attribute \"selected\" will be set on the element\n */\n\n/**\n * @ngdoc directive\n * @name ngOpen\n * @restrict A\n * @priority 100\n *\n * @description\n *\n * Sets the `open` attribute on the element, if the expression inside `ngOpen` is truthy.\n *\n * A special directive is necessary because we cannot use interpolation inside the `open`\n * attribute. See the {@link guide/interpolation interpolation guide} for more info.\n *\n * ## A note about browser compatibility\n *\n * Edge, Firefox, and Internet Explorer do not support the `details` element, it is\n * recommended to use {@link ng.ngShow} and {@link ng.ngHide} instead.\n *\n * @example\n     <example name=\"ng-open\">\n       <file name=\"index.ced81ed4.html\">\n         <label>Check me check multiple: <input type=\"checkbox\" ng-model=\"open\"></label><br/>\n         <details id=\"details\" ng-open=\"open\">\n            <summary>Show/Hide me</summary>\n         </details>\n       </file>\n       <file name=\"protractor.js\" type=\"protractor\">\n         it('should toggle open', function() {\n           expect(element(by.id('details')).getAttribute('open')).toBeFalsy();\n           element(by.model('open')).click();\n           expect(element(by.id('details')).getAttribute('open')).toBeTruthy();\n         });\n       </file>\n     </example>\n *\n * @element DETAILS\n * @param {expression} ngOpen If the {@link guide/expression expression} is truthy,\n *     then special attribute \"open\" will be set on the element\n */\n\nvar ngAttributeAliasDirectives = {};\n\n// boolean attrs are evaluated\nforEach(BOOLEAN_ATTR, function(propName, attrName) {\n  // binding to multiple is not supported\n  if (propName === 'multiple') return;\n\n  function defaultLinkFn(scope, element, attr) {\n    scope.$watch(attr[normalized], function ngBooleanAttrWatchAction(value) {\n      attr.$set(attrName, !!value);\n    });\n  }\n\n  var normalized = directiveNormalize('ng-' + attrName);\n  var linkFn = defaultLinkFn;\n\n  if (propName === 'checked') {\n    linkFn = function(scope, element, attr) {\n      // ensuring ngChecked doesn't interfere with ngModel when both are set on the same input\n      if (attr.ngModel !== attr[normalized]) {\n        defaultLinkFn(scope, element, attr);\n      }\n    };\n  }\n\n  ngAttributeAliasDirectives[normalized] = function() {\n    return {\n      restrict: 'A',\n      priority: 100,\n      link: linkFn\n    };\n  };\n});\n\n// aliased input attrs are evaluated\nforEach(ALIASED_ATTR, function(htmlAttr, ngAttr) {\n  ngAttributeAliasDirectives[ngAttr] = function() {\n    return {\n      priority: 100,\n      link: function(scope, element, attr) {\n        //special case ngPattern when a literal regular expression value\n        //is used as the expression (this way we don't have to watch anything).\n        if (ngAttr === 'ngPattern' && attr.ngPattern.charAt(0) === '/') {\n          var match = attr.ngPattern.match(REGEX_STRING_REGEXP);\n          if (match) {\n            attr.$set('ngPattern', new RegExp(match[1], match[2]));\n            return;\n          }\n        }\n\n        scope.$watch(attr[ngAttr], function ngAttrAliasWatchAction(value) {\n          attr.$set(ngAttr, value);\n        });\n      }\n    };\n  };\n});\n\n// ng-src, ng-srcset, ng-href are interpolated\nforEach(['src', 'srcset', 'href'], function(attrName) {\n  var normalized = directiveNormalize('ng-' + attrName);\n  ngAttributeAliasDirectives[normalized] = function() {\n    return {\n      priority: 99, // it needs to run after the attributes are interpolated\n      link: function(scope, element, attr) {\n        var propName = attrName,\n            name = attrName;\n\n        if (attrName === 'href' &&\n            toString.call(element.prop('href')) === '[object SVGAnimatedString]') {\n          name = 'xlinkHref';\n          attr.$attr[name] = 'xlink:href';\n          propName = null;\n        }\n\n        attr.$observe(normalized, function(value) {\n          if (!value) {\n            if (attrName === 'href') {\n              attr.$set(name, null);\n            }\n            return;\n          }\n\n          attr.$set(name, value);\n\n          // Support: IE 9-11 only\n          // On IE, if \"ng:src\" directive declaration is used and \"src\" attribute doesn't exist\n          // then calling element.setAttribute('src', 'foo') doesn't do anything, so we need\n          // to set the property as well to achieve the desired effect.\n          // We use attr[attrName] value since $set can sanitize the url.\n          if (msie && propName) element.prop(propName, attr[name]);\n        });\n      }\n    };\n  };\n});\n\n/* global -nullFormCtrl, -PENDING_CLASS, -SUBMITTED_CLASS\n */\nvar nullFormCtrl = {\n  $addControl: noop,\n  $$renameControl: nullFormRenameControl,\n  $removeControl: noop,\n  $setValidity: noop,\n  $setDirty: noop,\n  $setPristine: noop,\n  $setSubmitted: noop\n},\nPENDING_CLASS = 'ng-pending',\nSUBMITTED_CLASS = 'ng-submitted';\n\nfunction nullFormRenameControl(control, name) {\n  control.$name = name;\n}\n\n/**\n * @ngdoc type\n * @name form.FormController\n *\n * @property {boolean} $pristine True if user has not interacted with the form yet.\n * @property {boolean} $dirty True if user has already interacted with the form.\n * @property {boolean} $valid True if all of the containing forms and controls are valid.\n * @property {boolean} $invalid True if at least one containing control or form is invalid.\n * @property {boolean} $pending True if at least one containing control or form is pending.\n * @property {boolean} $submitted True if user has submitted the form even if its invalid.\n *\n * @property {Object} $error Is an object hash, containing references to controls or\n *  forms with failing validators, where:\n *\n *  - keys are validation tokens (error names),\n *  - values are arrays of controls or forms that have a failing validator for given error name.\n *\n *  Built-in validation tokens:\n *\n *  - `email`\n *  - `max`\n *  - `maxlength`\n *  - `min`\n *  - `minlength`\n *  - `number`\n *  - `pattern`\n *  - `required`\n *  - `url`\n *  - `date`\n *  - `datetimelocal`\n *  - `time`\n *  - `week`\n *  - `month`\n *\n * @description\n * `FormController` keeps track of all its controls and nested forms as well as the state of them,\n * such as being valid/invalid or dirty/pristine.\n *\n * Each {@link ng.directive:form form} directive creates an instance\n * of `FormController`.\n *\n */\n//asks for $scope to fool the BC controller module\nFormController.$inject = ['$element', '$attrs', '$scope', '$animate', '$interpolate'];\nfunction FormController($element, $attrs, $scope, $animate, $interpolate) {\n  this.$$controls = [];\n\n  // init state\n  this.$error = {};\n  this.$$success = {};\n  this.$pending = undefined;\n  this.$name = $interpolate($attrs.name || $attrs.ngForm || '')($scope);\n  this.$dirty = false;\n  this.$pristine = true;\n  this.$valid = true;\n  this.$invalid = false;\n  this.$submitted = false;\n  this.$$parentForm = nullFormCtrl;\n\n  this.$$element = $element;\n  this.$$animate = $animate;\n\n  setupValidity(this);\n}\n\nFormController.prototype = {\n  /**\n   * @ngdoc method\n   * @name form.FormController#$rollbackViewValue\n   *\n   * @description\n   * Rollback all form controls pending updates to the `$modelValue`.\n   *\n   * Updates may be pending by a debounced event or because the input is waiting for a some future\n   * event defined in `ng-model-options`. This method is typically needed by the reset button of\n   * a form that uses `ng-model-options` to pend updates.\n   */\n  $rollbackViewValue: function() {\n    forEach(this.$$controls, function(control) {\n      control.$rollbackViewValue();\n    });\n  },\n\n  /**\n   * @ngdoc method\n   * @name form.FormController#$commitViewValue\n   *\n   * @description\n   * Commit all form controls pending updates to the `$modelValue`.\n   *\n   * Updates may be pending by a debounced event or because the input is waiting for a some future\n   * event defined in `ng-model-options`. This method is rarely needed as `NgModelController`\n   * usually handles calling this in response to input events.\n   */\n  $commitViewValue: function() {\n    forEach(this.$$controls, function(control) {\n      control.$commitViewValue();\n    });\n  },\n\n  /**\n   * @ngdoc method\n   * @name form.FormController#$addControl\n   * @param {object} control control object, either a {@link form.FormController} or an\n   * {@link ngModel.NgModelController}\n   *\n   * @description\n   * Register a control with the form. Input elements using ngModelController do this automatically\n   * when they are linked.\n   *\n   * Note that the current state of the control will not be reflected on the new parent form. This\n   * is not an issue with normal use, as freshly compiled and linked controls are in a `$pristine`\n   * state.\n   *\n   * However, if the method is used programmatically, for example by adding dynamically created controls,\n   * or controls that have been previously removed without destroying their corresponding DOM element,\n   * it's the developers responsibility to make sure the current state propagates to the parent form.\n   *\n   * For example, if an input control is added that is already `$dirty` and has `$error` properties,\n   * calling `$setDirty()` and `$validate()` afterwards will propagate the state to the parent form.\n   */\n  $addControl: function(control) {\n    // Breaking change - before, inputs whose name was \"hasOwnProperty\" were quietly ignored\n    // and not added to the scope.  Now we throw an error.\n    assertNotHasOwnProperty(control.$name, 'input');\n    this.$$controls.push(control);\n\n    if (control.$name) {\n      this[control.$name] = control;\n    }\n\n    control.$$parentForm = this;\n  },\n\n  // Private API: rename a form control\n  $$renameControl: function(control, newName) {\n    var oldName = control.$name;\n\n    if (this[oldName] === control) {\n      delete this[oldName];\n    }\n    this[newName] = control;\n    control.$name = newName;\n  },\n\n  /**\n   * @ngdoc method\n   * @name form.FormController#$removeControl\n   * @param {object} control control object, either a {@link form.FormController} or an\n   * {@link ngModel.NgModelController}\n   *\n   * @description\n   * Deregister a control from the form.\n   *\n   * Input elements using ngModelController do this automatically when they are destroyed.\n   *\n   * Note that only the removed control's validation state (`$errors`etc.) will be removed from the\n   * form. `$dirty`, `$submitted` states will not be changed, because the expected behavior can be\n   * different from case to case. For example, removing the only `$dirty` control from a form may or\n   * may not mean that the form is still `$dirty`.\n   */\n  $removeControl: function(control) {\n    if (control.$name && this[control.$name] === control) {\n      delete this[control.$name];\n    }\n    forEach(this.$pending, function(value, name) {\n      // eslint-disable-next-line no-invalid-this\n      this.$setValidity(name, null, control);\n    }, this);\n    forEach(this.$error, function(value, name) {\n      // eslint-disable-next-line no-invalid-this\n      this.$setValidity(name, null, control);\n    }, this);\n    forEach(this.$$success, function(value, name) {\n      // eslint-disable-next-line no-invalid-this\n      this.$setValidity(name, null, control);\n    }, this);\n\n    arrayRemove(this.$$controls, control);\n    control.$$parentForm = nullFormCtrl;\n  },\n\n  /**\n   * @ngdoc method\n   * @name form.FormController#$setDirty\n   *\n   * @description\n   * Sets the form to a dirty state.\n   *\n   * This method can be called to add the 'ng-dirty' class and set the form to a dirty\n   * state (ng-dirty class). This method will also propagate to parent forms.\n   */\n  $setDirty: function() {\n    this.$$animate.removeClass(this.$$element, PRISTINE_CLASS);\n    this.$$animate.addClass(this.$$element, DIRTY_CLASS);\n    this.$dirty = true;\n    this.$pristine = false;\n    this.$$parentForm.$setDirty();\n  },\n\n  /**\n   * @ngdoc method\n   * @name form.FormController#$setPristine\n   *\n   * @description\n   * Sets the form to its pristine state.\n   *\n   * This method sets the form's `$pristine` state to true, the `$dirty` state to false, removes\n   * the `ng-dirty` class and adds the `ng-pristine` class. Additionally, it sets the `$submitted`\n   * state to false.\n   *\n   * This method will also propagate to all the controls contained in this form.\n   *\n   * Setting a form back to a pristine state is often useful when we want to 'reuse' a form after\n   * saving or resetting it.\n   */\n  $setPristine: function() {\n    this.$$animate.setClass(this.$$element, PRISTINE_CLASS, DIRTY_CLASS + ' ' + SUBMITTED_CLASS);\n    this.$dirty = false;\n    this.$pristine = true;\n    this.$submitted = false;\n    forEach(this.$$controls, function(control) {\n      control.$setPristine();\n    });\n  },\n\n  /**\n   * @ngdoc method\n   * @name form.FormController#$setUntouched\n   *\n   * @description\n   * Sets the form to its untouched state.\n   *\n   * This method can be called to remove the 'ng-touched' class and set the form controls to their\n   * untouched state (ng-untouched class).\n   *\n   * Setting a form controls back to their untouched state is often useful when setting the form\n   * back to its pristine state.\n   */\n  $setUntouched: function() {\n    forEach(this.$$controls, function(control) {\n      control.$setUntouched();\n    });\n  },\n\n  /**\n   * @ngdoc method\n   * @name form.FormController#$setSubmitted\n   *\n   * @description\n   * Sets the form to its submitted state.\n   */\n  $setSubmitted: function() {\n    this.$$animate.addClass(this.$$element, SUBMITTED_CLASS);\n    this.$submitted = true;\n    this.$$parentForm.$setSubmitted();\n  }\n};\n\n/**\n * @ngdoc method\n * @name form.FormController#$setValidity\n *\n * @description\n * Sets the validity of a form control.\n *\n * This method will also propagate to parent forms.\n */\naddSetValidityMethod({\n  clazz: FormController,\n  set: function(object, property, controller) {\n    var list = object[property];\n    if (!list) {\n      object[property] = [controller];\n    } else {\n      var index = list.indexOf(controller);\n      if (index === -1) {\n        list.push(controller);\n      }\n    }\n  },\n  unset: function(object, property, controller) {\n    var list = object[property];\n    if (!list) {\n      return;\n    }\n    arrayRemove(list, controller);\n    if (list.length === 0) {\n      delete object[property];\n    }\n  }\n});\n\n/**\n * @ngdoc directive\n * @name ngForm\n * @restrict EAC\n *\n * @description\n * Nestable alias of {@link ng.directive:form `form`} directive. HTML\n * does not allow nesting of form elements. It is useful to nest forms, for example if the validity of a\n * sub-group of controls needs to be determined.\n *\n * Note: the purpose of `ngForm` is to group controls,\n * but not to be a replacement for the `<form>` tag with all of its capabilities\n * (e.g. posting to the server, ...).\n *\n * @param {string=} ngForm|name Name of the form. If specified, the form controller will be published into\n *                       related scope, under this name.\n *\n */\n\n /**\n * @ngdoc directive\n * @name form\n * @restrict E\n *\n * @description\n * Directive that instantiates\n * {@link form.FormController FormController}.\n *\n * If the `name` attribute is specified, the form controller is published onto the current scope under\n * this name.\n *\n * # Alias: {@link ng.directive:ngForm `ngForm`}\n *\n * In Angular, forms can be nested. This means that the outer form is valid when all of the child\n * forms are valid as well. However, browsers do not allow nesting of `<form>` elements, so\n * Angular provides the {@link ng.directive:ngForm `ngForm`} directive, which behaves identically to\n * `form` but can be nested. Nested forms can be useful, for example, if the validity of a sub-group\n * of controls needs to be determined.\n *\n * # CSS classes\n *  - `ng-valid` is set if the form is valid.\n *  - `ng-invalid` is set if the form is invalid.\n *  - `ng-pending` is set if the form is pending.\n *  - `ng-pristine` is set if the form is pristine.\n *  - `ng-dirty` is set if the form is dirty.\n *  - `ng-submitted` is set if the form was submitted.\n *\n * Keep in mind that ngAnimate can detect each of these classes when added and removed.\n *\n *\n * # Submitting a form and preventing the default action\n *\n * Since the role of forms in client-side Angular applications is different than in classical\n * roundtrip apps, it is desirable for the browser not to translate the form submission into a full\n * page reload that sends the data to the server. Instead some javascript logic should be triggered\n * to handle the form submission in an application-specific way.\n *\n * For this reason, Angular prevents the default action (form submission to the server) unless the\n * `<form>` element has an `action` attribute specified.\n *\n * You can use one of the following two ways to specify what javascript method should be called when\n * a form is submitted:\n *\n * - {@link ng.directive:ngSubmit ngSubmit} directive on the form element\n * - {@link ng.directive:ngClick ngClick} directive on the first\n  *  button or input field of type submit (input[type=submit])\n *\n * To prevent double execution of the handler, use only one of the {@link ng.directive:ngSubmit ngSubmit}\n * or {@link ng.directive:ngClick ngClick} directives.\n * This is because of the following form submission rules in the HTML specification:\n *\n * - If a form has only one input field then hitting enter in this field triggers form submit\n * (`ngSubmit`)\n * - if a form has 2+ input fields and no buttons or input[type=submit] then hitting enter\n * doesn't trigger submit\n * - if a form has one or more input fields and one or more buttons or input[type=submit] then\n * hitting enter in any of the input fields will trigger the click handler on the *first* button or\n * input[type=submit] (`ngClick`) *and* a submit handler on the enclosing form (`ngSubmit`)\n *\n * Any pending `ngModelOptions` changes will take place immediately when an enclosing form is\n * submitted. Note that `ngClick` events will occur before the model is updated. Use `ngSubmit`\n * to have access to the updated model.\n *\n * ## Animation Hooks\n *\n * Animations in ngForm are triggered when any of the associated CSS classes are added and removed.\n * These classes are: `.ng-pristine`, `.ng-dirty`, `.ng-invalid` and `.ng-valid` as well as any\n * other validations that are performed within the form. Animations in ngForm are similar to how\n * they work in ngClass and animations can be hooked into using CSS transitions, keyframes as well\n * as JS animations.\n *\n * The following example shows a simple way to utilize CSS transitions to style a form element\n * that has been rendered as invalid after it has been validated:\n *\n * <pre>\n * //be sure to include ngAnimate as a module to hook into more\n * //advanced animations\n * .my-form {\n *   transition:0.5s linear all;\n *   background: white;\n * }\n * .my-form.ng-invalid {\n *   background: red;\n *   color:white;\n * }\n * </pre>\n *\n * @example\n    <example name=\"ng-form\" deps=\"angular-animate.js\" animations=\"true\" fixBase=\"true\" module=\"formExample\">\n      <file name=\"index.ced81ed4.html\">\n       <script>\n         angular.module('formExample', [])\n           .controller('FormController', ['$scope', function($scope) {\n             $scope.userType = 'guest';\n           }]);\n       </script>\n       <style>\n        .my-form {\n          transition:all linear 0.5s;\n          background: transparent;\n        }\n        .my-form.ng-invalid {\n          background: red;\n        }\n       </style>\n       <form name=\"myForm\" ng-controller=\"FormController\" class=\"my-form\">\n         userType: <input name=\"input\" ng-model=\"userType\" required>\n         <span class=\"error\" ng-show=\"myForm.input.$error.required\">Required!</span><br>\n         <code>userType = {{userType}}</code><br>\n         <code>myForm.input.$valid = {{myForm.input.$valid}}</code><br>\n         <code>myForm.input.$error = {{myForm.input.$error}}</code><br>\n         <code>myForm.$valid = {{myForm.$valid}}</code><br>\n         <code>myForm.$error.required = {{!!myForm.$error.required}}</code><br>\n        </form>\n      </file>\n      <file name=\"protractor.js\" type=\"protractor\">\n        it('should initialize to model', function() {\n          var userType = element(by.binding('userType'));\n          var valid = element(by.binding('myForm.input.$valid'));\n\n          expect(userType.getText()).toContain('guest');\n          expect(valid.getText()).toContain('true');\n        });\n\n        it('should be invalid if empty', function() {\n          var userType = element(by.binding('userType'));\n          var valid = element(by.binding('myForm.input.$valid'));\n          var userInput = element(by.model('userType'));\n\n          userInput.clear();\n          userInput.sendKeys('');\n\n          expect(userType.getText()).toEqual('userType =');\n          expect(valid.getText()).toContain('false');\n        });\n      </file>\n    </example>\n *\n * @param {string=} name Name of the form. If specified, the form controller will be published into\n *                       related scope, under this name.\n */\nvar formDirectiveFactory = function(isNgForm) {\n  return ['$timeout', '$parse', function($timeout, $parse) {\n    var formDirective = {\n      name: 'form',\n      restrict: isNgForm ? 'EAC' : 'E',\n      require: ['form', '^^?form'], //first is the form's own ctrl, second is an optional parent form\n      controller: FormController,\n      compile: function ngFormCompile(formElement, attr) {\n        // Setup initial state of the control\n        formElement.addClass(PRISTINE_CLASS).addClass(VALID_CLASS);\n\n        var nameAttr = attr.name ? 'name' : (isNgForm && attr.ngForm ? 'ngForm' : false);\n\n        return {\n          pre: function ngFormPreLink(scope, formElement, attr, ctrls) {\n            var controller = ctrls[0];\n\n            // if `action` attr is not present on the form, prevent the default action (submission)\n            if (!('action' in attr)) {\n              // we can't use jq events because if a form is destroyed during submission the default\n              // action is not prevented. see #1238\n              //\n              // IE 9 is not affected because it doesn't fire a submit event and try to do a full\n              // page reload if the form was destroyed by submission of the form via a click handler\n              // on a button in the form. Looks like an IE9 specific bug.\n              var handleFormSubmission = function(event) {\n                scope.$apply(function() {\n                  controller.$commitViewValue();\n                  controller.$setSubmitted();\n                });\n\n                event.preventDefault();\n              };\n\n              formElement[0].addEventListener('submit', handleFormSubmission);\n\n              // unregister the preventDefault listener so that we don't not leak memory but in a\n              // way that will achieve the prevention of the default action.\n              formElement.on('$destroy', function() {\n                $timeout(function() {\n                  formElement[0].removeEventListener('submit', handleFormSubmission);\n                }, 0, false);\n              });\n            }\n\n            var parentFormCtrl = ctrls[1] || controller.$$parentForm;\n            parentFormCtrl.$addControl(controller);\n\n            var setter = nameAttr ? getSetter(controller.$name) : noop;\n\n            if (nameAttr) {\n              setter(scope, controller);\n              attr.$observe(nameAttr, function(newValue) {\n                if (controller.$name === newValue) return;\n                setter(scope, undefined);\n                controller.$$parentForm.$$renameControl(controller, newValue);\n                setter = getSetter(controller.$name);\n                setter(scope, controller);\n              });\n            }\n            formElement.on('$destroy', function() {\n              controller.$$parentForm.$removeControl(controller);\n              setter(scope, undefined);\n              extend(controller, nullFormCtrl); //stop propagating child destruction handlers upwards\n            });\n          }\n        };\n      }\n    };\n\n    return formDirective;\n\n    function getSetter(expression) {\n      if (expression === '') {\n        //create an assignable expression, so forms with an empty name can be renamed later\n        return $parse('this[\"\"]').assign;\n      }\n      return $parse(expression).assign || noop;\n    }\n  }];\n};\n\nvar formDirective = formDirectiveFactory();\nvar ngFormDirective = formDirectiveFactory(true);\n\n\n\n// helper methods\nfunction setupValidity(instance) {\n  instance.$$classCache = {};\n  instance.$$classCache[INVALID_CLASS] = !(instance.$$classCache[VALID_CLASS] = instance.$$element.hasClass(VALID_CLASS));\n}\nfunction addSetValidityMethod(context) {\n  var clazz = context.clazz,\n      set = context.set,\n      unset = context.unset;\n\n  clazz.prototype.$setValidity = function(validationErrorKey, state, controller) {\n    if (isUndefined(state)) {\n      createAndSet(this, '$pending', validationErrorKey, controller);\n    } else {\n      unsetAndCleanup(this, '$pending', validationErrorKey, controller);\n    }\n    if (!isBoolean(state)) {\n      unset(this.$error, validationErrorKey, controller);\n      unset(this.$$success, validationErrorKey, controller);\n    } else {\n      if (state) {\n        unset(this.$error, validationErrorKey, controller);\n        set(this.$$success, validationErrorKey, controller);\n      } else {\n        set(this.$error, validationErrorKey, controller);\n        unset(this.$$success, validationErrorKey, controller);\n      }\n    }\n    if (this.$pending) {\n      cachedToggleClass(this, PENDING_CLASS, true);\n      this.$valid = this.$invalid = undefined;\n      toggleValidationCss(this, '', null);\n    } else {\n      cachedToggleClass(this, PENDING_CLASS, false);\n      this.$valid = isObjectEmpty(this.$error);\n      this.$invalid = !this.$valid;\n      toggleValidationCss(this, '', this.$valid);\n    }\n\n    // re-read the state as the set/unset methods could have\n    // combined state in this.$error[validationError] (used for forms),\n    // where setting/unsetting only increments/decrements the value,\n    // and does not replace it.\n    var combinedState;\n    if (this.$pending && this.$pending[validationErrorKey]) {\n      combinedState = undefined;\n    } else if (this.$error[validationErrorKey]) {\n      combinedState = false;\n    } else if (this.$$success[validationErrorKey]) {\n      combinedState = true;\n    } else {\n      combinedState = null;\n    }\n\n    toggleValidationCss(this, validationErrorKey, combinedState);\n    this.$$parentForm.$setValidity(validationErrorKey, combinedState, this);\n  };\n\n  function createAndSet(ctrl, name, value, controller) {\n    if (!ctrl[name]) {\n      ctrl[name] = {};\n    }\n    set(ctrl[name], value, controller);\n  }\n\n  function unsetAndCleanup(ctrl, name, value, controller) {\n    if (ctrl[name]) {\n      unset(ctrl[name], value, controller);\n    }\n    if (isObjectEmpty(ctrl[name])) {\n      ctrl[name] = undefined;\n    }\n  }\n\n  function cachedToggleClass(ctrl, className, switchValue) {\n    if (switchValue && !ctrl.$$classCache[className]) {\n      ctrl.$$animate.addClass(ctrl.$$element, className);\n      ctrl.$$classCache[className] = true;\n    } else if (!switchValue && ctrl.$$classCache[className]) {\n      ctrl.$$animate.removeClass(ctrl.$$element, className);\n      ctrl.$$classCache[className] = false;\n    }\n  }\n\n  function toggleValidationCss(ctrl, validationErrorKey, isValid) {\n    validationErrorKey = validationErrorKey ? '-' + snake_case(validationErrorKey, '-') : '';\n\n    cachedToggleClass(ctrl, VALID_CLASS + validationErrorKey, isValid === true);\n    cachedToggleClass(ctrl, INVALID_CLASS + validationErrorKey, isValid === false);\n  }\n}\n\nfunction isObjectEmpty(obj) {\n  if (obj) {\n    for (var prop in obj) {\n      if (obj.hasOwnProperty(prop)) {\n        return false;\n      }\n    }\n  }\n  return true;\n}\n\n/* global\n  VALID_CLASS: false,\n  INVALID_CLASS: false,\n  PRISTINE_CLASS: false,\n  DIRTY_CLASS: false,\n  ngModelMinErr: false\n*/\n\n// Regex code was initially obtained from SO prior to modification: https://stackoverflow.com/questions/3143070/javascript-regex-iso-datetime#answer-3143231\nvar ISO_DATE_REGEXP = /^\\d{4,}-[01]\\d-[0-3]\\dT[0-2]\\d:[0-5]\\d:[0-5]\\d\\.\\d+(?:[+-][0-2]\\d:[0-5]\\d|Z)$/;\n// See valid URLs in RFC3987 (http://tools.ietf.org/html/rfc3987)\n// Note: We are being more lenient, because browsers are too.\n//   1. Scheme\n//   2. Slashes\n//   3. Username\n//   4. Password\n//   5. Hostname\n//   6. Port\n//   7. Path\n//   8. Query\n//   9. Fragment\n//                 1111111111111111 222   333333    44444        55555555555555555555555     666     77777777     8888888     999\nvar URL_REGEXP = /^[a-z][a-z\\d.+-]*:\\/*(?:[^:@]+(?::[^@]+)?@)?(?:[^\\s:/?#]+|\\[[a-f\\d:]+])(?::\\d+)?(?:\\/[^?#]*)?(?:\\?[^#]*)?(?:#.*)?$/i;\n// eslint-disable-next-line max-len\nvar EMAIL_REGEXP = /^(?=.{1,254}$)(?=.{1,64}@)[-!#$%&'*+/0-9=?A-Z^_`a-z{|}~]+(\\.[-!#$%&'*+/0-9=?A-Z^_`a-z{|}~]+)*@[A-Za-z0-9]([A-Za-z0-9-]{0,61}[A-Za-z0-9])?(\\.[A-Za-z0-9]([A-Za-z0-9-]{0,61}[A-Za-z0-9])?)*$/;\nvar NUMBER_REGEXP = /^\\s*(-|\\+)?(\\d+|(\\d*(\\.\\d*)))([eE][+-]?\\d+)?\\s*$/;\nvar DATE_REGEXP = /^(\\d{4,})-(\\d{2})-(\\d{2})$/;\nvar DATETIMELOCAL_REGEXP = /^(\\d{4,})-(\\d\\d)-(\\d\\d)T(\\d\\d):(\\d\\d)(?::(\\d\\d)(\\.\\d{1,3})?)?$/;\nvar WEEK_REGEXP = /^(\\d{4,})-W(\\d\\d)$/;\nvar MONTH_REGEXP = /^(\\d{4,})-(\\d\\d)$/;\nvar TIME_REGEXP = /^(\\d\\d):(\\d\\d)(?::(\\d\\d)(\\.\\d{1,3})?)?$/;\n\nvar PARTIAL_VALIDATION_EVENTS = 'keydown wheel mousedown';\nvar PARTIAL_VALIDATION_TYPES = createMap();\nforEach('date,datetime-local,month,time,week'.split(','), function(type) {\n  PARTIAL_VALIDATION_TYPES[type] = true;\n});\n\nvar inputType = {\n\n  /**\n   * @ngdoc input\n   * @name input[text]\n   *\n   * @description\n   * Standard HTML text input with angular data binding, inherited by most of the `input` elements.\n   *\n   *\n   * @param {string} ngModel Assignable angular expression to data-bind to.\n   * @param {string=} name Property name of the form under which the control is published.\n   * @param {string=} required Adds `required` validation error key if the value is not entered.\n   * @param {string=} ngRequired Adds `required` attribute and `required` validation constraint to\n   *    the element when the ngRequired expression evaluates to true. Use `ngRequired` instead of\n   *    `required` when you want to data-bind to the `required` attribute.\n   * @param {number=} ngMinlength Sets `minlength` validation error key if the value is shorter than\n   *    minlength.\n   * @param {number=} ngMaxlength Sets `maxlength` validation error key if the value is longer than\n   *    maxlength. Setting the attribute to a negative or non-numeric value, allows view values of\n   *    any length.\n   * @param {string=} pattern Similar to `ngPattern` except that the attribute value is the actual string\n   *    that contains the regular expression body that will be converted to a regular expression\n   *    as in the ngPattern directive.\n   * @param {string=} ngPattern Sets `pattern` validation error key if the ngModel {@link ngModel.NgModelController#$viewValue $viewValue}\n   *    does not match a RegExp found by evaluating the Angular expression given in the attribute value.\n   *    If the expression evaluates to a RegExp object, then this is used directly.\n   *    If the expression evaluates to a string, then it will be converted to a RegExp\n   *    after wrapping it in `^` and `$` characters. For instance, `\"abc\"` will be converted to\n   *    `new RegExp('^abc$')`.<br />\n   *    **Note:** Avoid using the `g` flag on the RegExp, as it will cause each successive search to\n   *    start at the index of the last search's match, thus not taking the whole input value into\n   *    account.\n   * @param {string=} ngChange Angular expression to be executed when input changes due to user\n   *    interaction with the input element.\n   * @param {boolean=} [ngTrim=true] If set to false Angular will not automatically trim the input.\n   *    This parameter is ignored for input[type=password] controls, which will never trim the\n   *    input.\n   *\n   * @example\n      <example name=\"text-input-directive\" module=\"textInputExample\">\n        <file name=\"index.ced81ed4.html\">\n         <script>\n           angular.module('textInputExample', [])\n             .controller('ExampleController', ['$scope', function($scope) {\n               $scope.example = {\n                 text: 'guest',\n                 word: /^\\s*\\w*\\s*$/\n               };\n             }]);\n         </script>\n         <form name=\"myForm\" ng-controller=\"ExampleController\">\n           <label>Single word:\n             <input type=\"text\" name=\"input\" ng-model=\"example.text\"\n                    ng-pattern=\"example.word\" required ng-trim=\"false\">\n           </label>\n           <div role=\"alert\">\n             <span class=\"error\" ng-show=\"myForm.input.$error.required\">\n               Required!</span>\n             <span class=\"error\" ng-show=\"myForm.input.$error.pattern\">\n               Single word only!</span>\n           </div>\n           <code>text = {{example.text}}</code><br/>\n           <code>myForm.input.$valid = {{myForm.input.$valid}}</code><br/>\n           <code>myForm.input.$error = {{myForm.input.$error}}</code><br/>\n           <code>myForm.$valid = {{myForm.$valid}}</code><br/>\n           <code>myForm.$error.required = {{!!myForm.$error.required}}</code><br/>\n          </form>\n        </file>\n        <file name=\"protractor.js\" type=\"protractor\">\n          var text = element(by.binding('example.text'));\n          var valid = element(by.binding('myForm.input.$valid'));\n          var input = element(by.model('example.text'));\n\n          it('should initialize to model', function() {\n            expect(text.getText()).toContain('guest');\n            expect(valid.getText()).toContain('true');\n          });\n\n          it('should be invalid if empty', function() {\n            input.clear();\n            input.sendKeys('');\n\n            expect(text.getText()).toEqual('text =');\n            expect(valid.getText()).toContain('false');\n          });\n\n          it('should be invalid if multi word', function() {\n            input.clear();\n            input.sendKeys('hello world');\n\n            expect(valid.getText()).toContain('false');\n          });\n        </file>\n      </example>\n   */\n  'text': textInputType,\n\n    /**\n     * @ngdoc input\n     * @name input[date]\n     *\n     * @description\n     * Input with date validation and transformation. In browsers that do not yet support\n     * the HTML5 date input, a text element will be used. In that case, text must be entered in a valid ISO-8601\n     * date format (yyyy-MM-dd), for example: `2009-01-06`. Since many\n     * modern browsers do not yet support this input type, it is important to provide cues to users on the\n     * expected input format via a placeholder or label.\n     *\n     * The model must always be a Date object, otherwise Angular will throw an error.\n     * Invalid `Date` objects (dates whose `getTime()` is `NaN`) will be rendered as an empty string.\n     *\n     * The timezone to be used to read/write the `Date` instance in the model can be defined using\n     * {@link ng.directive:ngModelOptions ngModelOptions}. By default, this is the timezone of the browser.\n     *\n     * @param {string} ngModel Assignable angular expression to data-bind to.\n     * @param {string=} name Property name of the form under which the control is published.\n     * @param {string=} min Sets the `min` validation error key if the value entered is less than `min`. This must be a\n     *   valid ISO date string (yyyy-MM-dd). You can also use interpolation inside this attribute\n     *   (e.g. `min=\"{{minDate | date:'yyyy-MM-dd'}}\"`). Note that `min` will also add native HTML5\n     *   constraint validation.\n     * @param {string=} max Sets the `max` validation error key if the value entered is greater than `max`. This must be\n     *   a valid ISO date string (yyyy-MM-dd). You can also use interpolation inside this attribute\n     *   (e.g. `max=\"{{maxDate | date:'yyyy-MM-dd'}}\"`). Note that `max` will also add native HTML5\n     *   constraint validation.\n     * @param {(date|string)=} ngMin Sets the `min` validation constraint to the Date / ISO date string\n     *   the `ngMin` expression evaluates to. Note that it does not set the `min` attribute.\n     * @param {(date|string)=} ngMax Sets the `max` validation constraint to the Date / ISO date string\n     *   the `ngMax` expression evaluates to. Note that it does not set the `max` attribute.\n     * @param {string=} required Sets `required` validation error key if the value is not entered.\n     * @param {string=} ngRequired Adds `required` attribute and `required` validation constraint to\n     *    the element when the ngRequired expression evaluates to true. Use `ngRequired` instead of\n     *    `required` when you want to data-bind to the `required` attribute.\n     * @param {string=} ngChange Angular expression to be executed when input changes due to user\n     *    interaction with the input element.\n     *\n     * @example\n     <example name=\"date-input-directive\" module=\"dateInputExample\">\n     <file name=\"index.ced81ed4.html\">\n       <script>\n          angular.module('dateInputExample', [])\n            .controller('DateController', ['$scope', function($scope) {\n              $scope.example = {\n                value: new Date(2013, 9, 22)\n              };\n            }]);\n       </script>\n       <form name=\"myForm\" ng-controller=\"DateController as dateCtrl\">\n          <label for=\"exampleInput\">Pick a date in 2013:</label>\n          <input type=\"date\" id=\"exampleInput\" name=\"input\" ng-model=\"example.value\"\n              placeholder=\"yyyy-MM-dd\" min=\"2013-01-01\" max=\"2013-12-31\" required />\n          <div role=\"alert\">\n            <span class=\"error\" ng-show=\"myForm.input.$error.required\">\n                Required!</span>\n            <span class=\"error\" ng-show=\"myForm.input.$error.date\">\n                Not a valid date!</span>\n           </div>\n           <tt>value = {{example.value | date: \"yyyy-MM-dd\"}}</tt><br/>\n           <tt>myForm.input.$valid = {{myForm.input.$valid}}</tt><br/>\n           <tt>myForm.input.$error = {{myForm.input.$error}}</tt><br/>\n           <tt>myForm.$valid = {{myForm.$valid}}</tt><br/>\n           <tt>myForm.$error.required = {{!!myForm.$error.required}}</tt><br/>\n       </form>\n     </file>\n     <file name=\"protractor.js\" type=\"protractor\">\n        var value = element(by.binding('example.value | date: \"yyyy-MM-dd\"'));\n        var valid = element(by.binding('myForm.input.$valid'));\n\n        // currently protractor/webdriver does not support\n        // sending keys to all known HTML5 input controls\n        // for various browsers (see https://github.com/angular/protractor/issues/562).\n        function setInput(val) {\n          // set the value of the element and force validation.\n          var scr = \"var ipt = document.getElementById('exampleInput'); \" +\n          \"ipt.value = '\" + val + \"';\" +\n          \"angular.element(ipt).scope().$apply(function(s) { s.myForm[ipt.name].$setViewValue('\" + val + \"'); });\";\n          browser.executeScript(scr);\n        }\n\n        it('should initialize to model', function() {\n          expect(value.getText()).toContain('2013-10-22');\n          expect(valid.getText()).toContain('myForm.input.$valid = true');\n        });\n\n        it('should be invalid if empty', function() {\n          setInput('');\n          expect(value.getText()).toEqual('value =');\n          expect(valid.getText()).toContain('myForm.input.$valid = false');\n        });\n\n        it('should be invalid if over max', function() {\n          setInput('2015-01-01');\n          expect(value.getText()).toContain('');\n          expect(valid.getText()).toContain('myForm.input.$valid = false');\n        });\n     </file>\n     </example>\n     */\n  'date': createDateInputType('date', DATE_REGEXP,\n         createDateParser(DATE_REGEXP, ['yyyy', 'MM', 'dd']),\n         'yyyy-MM-dd'),\n\n   /**\n    * @ngdoc input\n    * @name input[datetime-local]\n    *\n    * @description\n    * Input with datetime validation and transformation. In browsers that do not yet support\n    * the HTML5 date input, a text element will be used. In that case, the text must be entered in a valid ISO-8601\n    * local datetime format (yyyy-MM-ddTHH:mm:ss), for example: `2010-12-28T14:57:00`.\n    *\n    * The model must always be a Date object, otherwise Angular will throw an error.\n    * Invalid `Date` objects (dates whose `getTime()` is `NaN`) will be rendered as an empty string.\n    *\n    * The timezone to be used to read/write the `Date` instance in the model can be defined using\n    * {@link ng.directive:ngModelOptions ngModelOptions}. By default, this is the timezone of the browser.\n    *\n    * @param {string} ngModel Assignable angular expression to data-bind to.\n    * @param {string=} name Property name of the form under which the control is published.\n    * @param {string=} min Sets the `min` validation error key if the value entered is less than `min`.\n    *   This must be a valid ISO datetime format (yyyy-MM-ddTHH:mm:ss). You can also use interpolation\n    *   inside this attribute (e.g. `min=\"{{minDatetimeLocal | date:'yyyy-MM-ddTHH:mm:ss'}}\"`).\n    *   Note that `min` will also add native HTML5 constraint validation.\n    * @param {string=} max Sets the `max` validation error key if the value entered is greater than `max`.\n    *   This must be a valid ISO datetime format (yyyy-MM-ddTHH:mm:ss). You can also use interpolation\n    *   inside this attribute (e.g. `max=\"{{maxDatetimeLocal | date:'yyyy-MM-ddTHH:mm:ss'}}\"`).\n    *   Note that `max` will also add native HTML5 constraint validation.\n    * @param {(date|string)=} ngMin Sets the `min` validation error key to the Date / ISO datetime string\n    *   the `ngMin` expression evaluates to. Note that it does not set the `min` attribute.\n    * @param {(date|string)=} ngMax Sets the `max` validation error key to the Date / ISO datetime string\n    *   the `ngMax` expression evaluates to. Note that it does not set the `max` attribute.\n    * @param {string=} required Sets `required` validation error key if the value is not entered.\n    * @param {string=} ngRequired Adds `required` attribute and `required` validation constraint to\n    *    the element when the ngRequired expression evaluates to true. Use `ngRequired` instead of\n    *    `required` when you want to data-bind to the `required` attribute.\n    * @param {string=} ngChange Angular expression to be executed when input changes due to user\n    *    interaction with the input element.\n    *\n    * @example\n    <example name=\"datetimelocal-input-directive\" module=\"dateExample\">\n    <file name=\"index.ced81ed4.html\">\n      <script>\n        angular.module('dateExample', [])\n          .controller('DateController', ['$scope', function($scope) {\n            $scope.example = {\n              value: new Date(2010, 11, 28, 14, 57)\n            };\n          }]);\n      </script>\n      <form name=\"myForm\" ng-controller=\"DateController as dateCtrl\">\n        <label for=\"exampleInput\">Pick a date between in 2013:</label>\n        <input type=\"datetime-local\" id=\"exampleInput\" name=\"input\" ng-model=\"example.value\"\n            placeholder=\"yyyy-MM-ddTHH:mm:ss\" min=\"2001-01-01T00:00:00\" max=\"2013-12-31T00:00:00\" required />\n        <div role=\"alert\">\n          <span class=\"error\" ng-show=\"myForm.input.$error.required\">\n              Required!</span>\n          <span class=\"error\" ng-show=\"myForm.input.$error.datetimelocal\">\n              Not a valid date!</span>\n        </div>\n        <tt>value = {{example.value | date: \"yyyy-MM-ddTHH:mm:ss\"}}</tt><br/>\n        <tt>myForm.input.$valid = {{myForm.input.$valid}}</tt><br/>\n        <tt>myForm.input.$error = {{myForm.input.$error}}</tt><br/>\n        <tt>myForm.$valid = {{myForm.$valid}}</tt><br/>\n        <tt>myForm.$error.required = {{!!myForm.$error.required}}</tt><br/>\n      </form>\n    </file>\n    <file name=\"protractor.js\" type=\"protractor\">\n      var value = element(by.binding('example.value | date: \"yyyy-MM-ddTHH:mm:ss\"'));\n      var valid = element(by.binding('myForm.input.$valid'));\n\n      // currently protractor/webdriver does not support\n      // sending keys to all known HTML5 input controls\n      // for various browsers (https://github.com/angular/protractor/issues/562).\n      function setInput(val) {\n        // set the value of the element and force validation.\n        var scr = \"var ipt = document.getElementById('exampleInput'); \" +\n        \"ipt.value = '\" + val + \"';\" +\n        \"angular.element(ipt).scope().$apply(function(s) { s.myForm[ipt.name].$setViewValue('\" + val + \"'); });\";\n        browser.executeScript(scr);\n      }\n\n      it('should initialize to model', function() {\n        expect(value.getText()).toContain('2010-12-28T14:57:00');\n        expect(valid.getText()).toContain('myForm.input.$valid = true');\n      });\n\n      it('should be invalid if empty', function() {\n        setInput('');\n        expect(value.getText()).toEqual('value =');\n        expect(valid.getText()).toContain('myForm.input.$valid = false');\n      });\n\n      it('should be invalid if over max', function() {\n        setInput('2015-01-01T23:59:00');\n        expect(value.getText()).toContain('');\n        expect(valid.getText()).toContain('myForm.input.$valid = false');\n      });\n    </file>\n    </example>\n    */\n  'datetime-local': createDateInputType('datetimelocal', DATETIMELOCAL_REGEXP,\n      createDateParser(DATETIMELOCAL_REGEXP, ['yyyy', 'MM', 'dd', 'HH', 'mm', 'ss', 'sss']),\n      'yyyy-MM-ddTHH:mm:ss.sss'),\n\n  /**\n   * @ngdoc input\n   * @name input[time]\n   *\n   * @description\n   * Input with time validation and transformation. In browsers that do not yet support\n   * the HTML5 time input, a text element will be used. In that case, the text must be entered in a valid ISO-8601\n   * local time format (HH:mm:ss), for example: `14:57:00`. Model must be a Date object. This binding will always output a\n   * Date object to the model of January 1, 1970, or local date `new Date(1970, 0, 1, HH, mm, ss)`.\n   *\n   * The model must always be a Date object, otherwise Angular will throw an error.\n   * Invalid `Date` objects (dates whose `getTime()` is `NaN`) will be rendered as an empty string.\n   *\n   * The timezone to be used to read/write the `Date` instance in the model can be defined using\n   * {@link ng.directive:ngModelOptions ngModelOptions}. By default, this is the timezone of the browser.\n   *\n   * @param {string} ngModel Assignable angular expression to data-bind to.\n   * @param {string=} name Property name of the form under which the control is published.\n   * @param {string=} min Sets the `min` validation error key if the value entered is less than `min`.\n   *   This must be a valid ISO time format (HH:mm:ss). You can also use interpolation inside this\n   *   attribute (e.g. `min=\"{{minTime | date:'HH:mm:ss'}}\"`). Note that `min` will also add\n   *   native HTML5 constraint validation.\n   * @param {string=} max Sets the `max` validation error key if the value entered is greater than `max`.\n   *   This must be a valid ISO time format (HH:mm:ss). You can also use interpolation inside this\n   *   attribute (e.g. `max=\"{{maxTime | date:'HH:mm:ss'}}\"`). Note that `max` will also add\n   *   native HTML5 constraint validation.\n   * @param {(date|string)=} ngMin Sets the `min` validation constraint to the Date / ISO time string the\n   *   `ngMin` expression evaluates to. Note that it does not set the `min` attribute.\n   * @param {(date|string)=} ngMax Sets the `max` validation constraint to the Date / ISO time string the\n   *   `ngMax` expression evaluates to. Note that it does not set the `max` attribute.\n   * @param {string=} required Sets `required` validation error key if the value is not entered.\n   * @param {string=} ngRequired Adds `required` attribute and `required` validation constraint to\n   *    the element when the ngRequired expression evaluates to true. Use `ngRequired` instead of\n   *    `required` when you want to data-bind to the `required` attribute.\n   * @param {string=} ngChange Angular expression to be executed when input changes due to user\n   *    interaction with the input element.\n   *\n   * @example\n   <example name=\"time-input-directive\" module=\"timeExample\">\n   <file name=\"index.ced81ed4.html\">\n     <script>\n      angular.module('timeExample', [])\n        .controller('DateController', ['$scope', function($scope) {\n          $scope.example = {\n            value: new Date(1970, 0, 1, 14, 57, 0)\n          };\n        }]);\n     </script>\n     <form name=\"myForm\" ng-controller=\"DateController as dateCtrl\">\n        <label for=\"exampleInput\">Pick a time between 8am and 5pm:</label>\n        <input type=\"time\" id=\"exampleInput\" name=\"input\" ng-model=\"example.value\"\n            placeholder=\"HH:mm:ss\" min=\"08:00:00\" max=\"17:00:00\" required />\n        <div role=\"alert\">\n          <span class=\"error\" ng-show=\"myForm.input.$error.required\">\n              Required!</span>\n          <span class=\"error\" ng-show=\"myForm.input.$error.time\">\n              Not a valid date!</span>\n        </div>\n        <tt>value = {{example.value | date: \"HH:mm:ss\"}}</tt><br/>\n        <tt>myForm.input.$valid = {{myForm.input.$valid}}</tt><br/>\n        <tt>myForm.input.$error = {{myForm.input.$error}}</tt><br/>\n        <tt>myForm.$valid = {{myForm.$valid}}</tt><br/>\n        <tt>myForm.$error.required = {{!!myForm.$error.required}}</tt><br/>\n     </form>\n   </file>\n   <file name=\"protractor.js\" type=\"protractor\">\n      var value = element(by.binding('example.value | date: \"HH:mm:ss\"'));\n      var valid = element(by.binding('myForm.input.$valid'));\n\n      // currently protractor/webdriver does not support\n      // sending keys to all known HTML5 input controls\n      // for various browsers (https://github.com/angular/protractor/issues/562).\n      function setInput(val) {\n        // set the value of the element and force validation.\n        var scr = \"var ipt = document.getElementById('exampleInput'); \" +\n        \"ipt.value = '\" + val + \"';\" +\n        \"angular.element(ipt).scope().$apply(function(s) { s.myForm[ipt.name].$setViewValue('\" + val + \"'); });\";\n        browser.executeScript(scr);\n      }\n\n      it('should initialize to model', function() {\n        expect(value.getText()).toContain('14:57:00');\n        expect(valid.getText()).toContain('myForm.input.$valid = true');\n      });\n\n      it('should be invalid if empty', function() {\n        setInput('');\n        expect(value.getText()).toEqual('value =');\n        expect(valid.getText()).toContain('myForm.input.$valid = false');\n      });\n\n      it('should be invalid if over max', function() {\n        setInput('23:59:00');\n        expect(value.getText()).toContain('');\n        expect(valid.getText()).toContain('myForm.input.$valid = false');\n      });\n   </file>\n   </example>\n   */\n  'time': createDateInputType('time', TIME_REGEXP,\n      createDateParser(TIME_REGEXP, ['HH', 'mm', 'ss', 'sss']),\n     'HH:mm:ss.sss'),\n\n   /**\n    * @ngdoc input\n    * @name input[week]\n    *\n    * @description\n    * Input with week-of-the-year validation and transformation to Date. In browsers that do not yet support\n    * the HTML5 week input, a text element will be used. In that case, the text must be entered in a valid ISO-8601\n    * week format (yyyy-W##), for example: `2013-W02`.\n    *\n    * The model must always be a Date object, otherwise Angular will throw an error.\n    * Invalid `Date` objects (dates whose `getTime()` is `NaN`) will be rendered as an empty string.\n    *\n    * The timezone to be used to read/write the `Date` instance in the model can be defined using\n    * {@link ng.directive:ngModelOptions ngModelOptions}. By default, this is the timezone of the browser.\n    *\n    * @param {string} ngModel Assignable angular expression to data-bind to.\n    * @param {string=} name Property name of the form under which the control is published.\n    * @param {string=} min Sets the `min` validation error key if the value entered is less than `min`.\n    *   This must be a valid ISO week format (yyyy-W##). You can also use interpolation inside this\n    *   attribute (e.g. `min=\"{{minWeek | date:'yyyy-Www'}}\"`). Note that `min` will also add\n    *   native HTML5 constraint validation.\n    * @param {string=} max Sets the `max` validation error key if the value entered is greater than `max`.\n    *   This must be a valid ISO week format (yyyy-W##). You can also use interpolation inside this\n    *   attribute (e.g. `max=\"{{maxWeek | date:'yyyy-Www'}}\"`). Note that `max` will also add\n    *   native HTML5 constraint validation.\n    * @param {(date|string)=} ngMin Sets the `min` validation constraint to the Date / ISO week string\n    *   the `ngMin` expression evaluates to. Note that it does not set the `min` attribute.\n    * @param {(date|string)=} ngMax Sets the `max` validation constraint to the Date / ISO week string\n    *   the `ngMax` expression evaluates to. Note that it does not set the `max` attribute.\n    * @param {string=} required Sets `required` validation error key if the value is not entered.\n    * @param {string=} ngRequired Adds `required` attribute and `required` validation constraint to\n    *    the element when the ngRequired expression evaluates to true. Use `ngRequired` instead of\n    *    `required` when you want to data-bind to the `required` attribute.\n    * @param {string=} ngChange Angular expression to be executed when input changes due to user\n    *    interaction with the input element.\n    *\n    * @example\n    <example name=\"week-input-directive\" module=\"weekExample\">\n    <file name=\"index.ced81ed4.html\">\n      <script>\n      angular.module('weekExample', [])\n        .controller('DateController', ['$scope', function($scope) {\n          $scope.example = {\n            value: new Date(2013, 0, 3)\n          };\n        }]);\n      </script>\n      <form name=\"myForm\" ng-controller=\"DateController as dateCtrl\">\n        <label>Pick a date between in 2013:\n          <input id=\"exampleInput\" type=\"week\" name=\"input\" ng-model=\"example.value\"\n                 placeholder=\"YYYY-W##\" min=\"2012-W32\"\n                 max=\"2013-W52\" required />\n        </label>\n        <div role=\"alert\">\n          <span class=\"error\" ng-show=\"myForm.input.$error.required\">\n              Required!</span>\n          <span class=\"error\" ng-show=\"myForm.input.$error.week\">\n              Not a valid date!</span>\n        </div>\n        <tt>value = {{example.value | date: \"yyyy-Www\"}}</tt><br/>\n        <tt>myForm.input.$valid = {{myForm.input.$valid}}</tt><br/>\n        <tt>myForm.input.$error = {{myForm.input.$error}}</tt><br/>\n        <tt>myForm.$valid = {{myForm.$valid}}</tt><br/>\n        <tt>myForm.$error.required = {{!!myForm.$error.required}}</tt><br/>\n      </form>\n    </file>\n    <file name=\"protractor.js\" type=\"protractor\">\n      var value = element(by.binding('example.value | date: \"yyyy-Www\"'));\n      var valid = element(by.binding('myForm.input.$valid'));\n\n      // currently protractor/webdriver does not support\n      // sending keys to all known HTML5 input controls\n      // for various browsers (https://github.com/angular/protractor/issues/562).\n      function setInput(val) {\n        // set the value of the element and force validation.\n        var scr = \"var ipt = document.getElementById('exampleInput'); \" +\n        \"ipt.value = '\" + val + \"';\" +\n        \"angular.element(ipt).scope().$apply(function(s) { s.myForm[ipt.name].$setViewValue('\" + val + \"'); });\";\n        browser.executeScript(scr);\n      }\n\n      it('should initialize to model', function() {\n        expect(value.getText()).toContain('2013-W01');\n        expect(valid.getText()).toContain('myForm.input.$valid = true');\n      });\n\n      it('should be invalid if empty', function() {\n        setInput('');\n        expect(value.getText()).toEqual('value =');\n        expect(valid.getText()).toContain('myForm.input.$valid = false');\n      });\n\n      it('should be invalid if over max', function() {\n        setInput('2015-W01');\n        expect(value.getText()).toContain('');\n        expect(valid.getText()).toContain('myForm.input.$valid = false');\n      });\n    </file>\n    </example>\n    */\n  'week': createDateInputType('week', WEEK_REGEXP, weekParser, 'yyyy-Www'),\n\n  /**\n   * @ngdoc input\n   * @name input[month]\n   *\n   * @description\n   * Input with month validation and transformation. In browsers that do not yet support\n   * the HTML5 month input, a text element will be used. In that case, the text must be entered in a valid ISO-8601\n   * month format (yyyy-MM), for example: `2009-01`.\n   *\n   * The model must always be a Date object, otherwise Angular will throw an error.\n   * Invalid `Date` objects (dates whose `getTime()` is `NaN`) will be rendered as an empty string.\n   * If the model is not set to the first of the month, the next view to model update will set it\n   * to the first of the month.\n   *\n   * The timezone to be used to read/write the `Date` instance in the model can be defined using\n   * {@link ng.directive:ngModelOptions ngModelOptions}. By default, this is the timezone of the browser.\n   *\n   * @param {string} ngModel Assignable angular expression to data-bind to.\n   * @param {string=} name Property name of the form under which the control is published.\n   * @param {string=} min Sets the `min` validation error key if the value entered is less than `min`.\n   *   This must be a valid ISO month format (yyyy-MM). You can also use interpolation inside this\n   *   attribute (e.g. `min=\"{{minMonth | date:'yyyy-MM'}}\"`). Note that `min` will also add\n   *   native HTML5 constraint validation.\n   * @param {string=} max Sets the `max` validation error key if the value entered is greater than `max`.\n   *   This must be a valid ISO month format (yyyy-MM). You can also use interpolation inside this\n   *   attribute (e.g. `max=\"{{maxMonth | date:'yyyy-MM'}}\"`). Note that `max` will also add\n   *   native HTML5 constraint validation.\n   * @param {(date|string)=} ngMin Sets the `min` validation constraint to the Date / ISO week string\n   *   the `ngMin` expression evaluates to. Note that it does not set the `min` attribute.\n   * @param {(date|string)=} ngMax Sets the `max` validation constraint to the Date / ISO week string\n   *   the `ngMax` expression evaluates to. Note that it does not set the `max` attribute.\n\n   * @param {string=} required Sets `required` validation error key if the value is not entered.\n   * @param {string=} ngRequired Adds `required` attribute and `required` validation constraint to\n   *    the element when the ngRequired expression evaluates to true. Use `ngRequired` instead of\n   *    `required` when you want to data-bind to the `required` attribute.\n   * @param {string=} ngChange Angular expression to be executed when input changes due to user\n   *    interaction with the input element.\n   *\n   * @example\n   <example name=\"month-input-directive\" module=\"monthExample\">\n   <file name=\"index.ced81ed4.html\">\n     <script>\n      angular.module('monthExample', [])\n        .controller('DateController', ['$scope', function($scope) {\n          $scope.example = {\n            value: new Date(2013, 9, 1)\n          };\n        }]);\n     </script>\n     <form name=\"myForm\" ng-controller=\"DateController as dateCtrl\">\n       <label for=\"exampleInput\">Pick a month in 2013:</label>\n       <input id=\"exampleInput\" type=\"month\" name=\"input\" ng-model=\"example.value\"\n          placeholder=\"yyyy-MM\" min=\"2013-01\" max=\"2013-12\" required />\n       <div role=\"alert\">\n         <span class=\"error\" ng-show=\"myForm.input.$error.required\">\n            Required!</span>\n         <span class=\"error\" ng-show=\"myForm.input.$error.month\">\n            Not a valid month!</span>\n       </div>\n       <tt>value = {{example.value | date: \"yyyy-MM\"}}</tt><br/>\n       <tt>myForm.input.$valid = {{myForm.input.$valid}}</tt><br/>\n       <tt>myForm.input.$error = {{myForm.input.$error}}</tt><br/>\n       <tt>myForm.$valid = {{myForm.$valid}}</tt><br/>\n       <tt>myForm.$error.required = {{!!myForm.$error.required}}</tt><br/>\n     </form>\n   </file>\n   <file name=\"protractor.js\" type=\"protractor\">\n      var value = element(by.binding('example.value | date: \"yyyy-MM\"'));\n      var valid = element(by.binding('myForm.input.$valid'));\n\n      // currently protractor/webdriver does not support\n      // sending keys to all known HTML5 input controls\n      // for various browsers (https://github.com/angular/protractor/issues/562).\n      function setInput(val) {\n        // set the value of the element and force validation.\n        var scr = \"var ipt = document.getElementById('exampleInput'); \" +\n        \"ipt.value = '\" + val + \"';\" +\n        \"angular.element(ipt).scope().$apply(function(s) { s.myForm[ipt.name].$setViewValue('\" + val + \"'); });\";\n        browser.executeScript(scr);\n      }\n\n      it('should initialize to model', function() {\n        expect(value.getText()).toContain('2013-10');\n        expect(valid.getText()).toContain('myForm.input.$valid = true');\n      });\n\n      it('should be invalid if empty', function() {\n        setInput('');\n        expect(value.getText()).toEqual('value =');\n        expect(valid.getText()).toContain('myForm.input.$valid = false');\n      });\n\n      it('should be invalid if over max', function() {\n        setInput('2015-01');\n        expect(value.getText()).toContain('');\n        expect(valid.getText()).toContain('myForm.input.$valid = false');\n      });\n   </file>\n   </example>\n   */\n  'month': createDateInputType('month', MONTH_REGEXP,\n     createDateParser(MONTH_REGEXP, ['yyyy', 'MM']),\n     'yyyy-MM'),\n\n  /**\n   * @ngdoc input\n   * @name input[number]\n   *\n   * @description\n   * Text input with number validation and transformation. Sets the `number` validation\n   * error if not a valid number.\n   *\n   * <div class=\"alert alert-warning\">\n   * The model must always be of type `number` otherwise Angular will throw an error.\n   * Be aware that a string containing a number is not enough. See the {@link ngModel:numfmt}\n   * error docs for more information and an example of how to convert your model if necessary.\n   * </div>\n   *\n   * ## Issues with HTML5 constraint validation\n   *\n   * In browsers that follow the\n   * [HTML5 specification](https://html.spec.whatwg.org/multipage/forms.html#number-state-%28type=number%29),\n   * `input[number]` does not work as expected with {@link ngModelOptions `ngModelOptions.allowInvalid`}.\n   * If a non-number is entered in the input, the browser will report the value as an empty string,\n   * which means the view / model values in `ngModel` and subsequently the scope value\n   * will also be an empty string.\n   *\n   *\n   * @param {string} ngModel Assignable angular expression to data-bind to.\n   * @param {string=} name Property name of the form under which the control is published.\n   * @param {string=} min Sets the `min` validation error key if the value entered is less than `min`.\n   *    Can be interpolated.\n   * @param {string=} max Sets the `max` validation error key if the value entered is greater than `max`.\n   *    Can be interpolated.\n   * @param {string=} ngMin Like `min`, sets the `min` validation error key if the value entered is less than `ngMin`,\n   *    but does not trigger HTML5 native validation. Takes an expression.\n   * @param {string=} ngMax Like `max`, sets the `max` validation error key if the value entered is greater than `ngMax`,\n   *    but does not trigger HTML5 native validation. Takes an expression.\n   * @param {string=} step Sets the `step` validation error key if the value entered does not fit the `step` constraint.\n   *    Can be interpolated.\n   * @param {string=} ngStep Like `step`, sets the `step` validation error key if the value entered does not fit the `ngStep` constraint,\n   *    but does not trigger HTML5 native validation. Takes an expression.\n   * @param {string=} required Sets `required` validation error key if the value is not entered.\n   * @param {string=} ngRequired Adds `required` attribute and `required` validation constraint to\n   *    the element when the ngRequired expression evaluates to true. Use `ngRequired` instead of\n   *    `required` when you want to data-bind to the `required` attribute.\n   * @param {number=} ngMinlength Sets `minlength` validation error key if the value is shorter than\n   *    minlength.\n   * @param {number=} ngMaxlength Sets `maxlength` validation error key if the value is longer than\n   *    maxlength. Setting the attribute to a negative or non-numeric value, allows view values of\n   *    any length.\n   * @param {string=} pattern Similar to `ngPattern` except that the attribute value is the actual string\n   *    that contains the regular expression body that will be converted to a regular expression\n   *    as in the ngPattern directive.\n   * @param {string=} ngPattern Sets `pattern` validation error key if the ngModel {@link ngModel.NgModelController#$viewValue $viewValue}\n   *    does not match a RegExp found by evaluating the Angular expression given in the attribute value.\n   *    If the expression evaluates to a RegExp object, then this is used directly.\n   *    If the expression evaluates to a string, then it will be converted to a RegExp\n   *    after wrapping it in `^` and `$` characters. For instance, `\"abc\"` will be converted to\n   *    `new RegExp('^abc$')`.<br />\n   *    **Note:** Avoid using the `g` flag on the RegExp, as it will cause each successive search to\n   *    start at the index of the last search's match, thus not taking the whole input value into\n   *    account.\n   * @param {string=} ngChange Angular expression to be executed when input changes due to user\n   *    interaction with the input element.\n   *\n   * @example\n      <example name=\"number-input-directive\" module=\"numberExample\">\n        <file name=\"index.ced81ed4.html\">\n         <script>\n           angular.module('numberExample', [])\n             .controller('ExampleController', ['$scope', function($scope) {\n               $scope.example = {\n                 value: 12\n               };\n             }]);\n         </script>\n         <form name=\"myForm\" ng-controller=\"ExampleController\">\n           <label>Number:\n             <input type=\"number\" name=\"input\" ng-model=\"example.value\"\n                    min=\"0\" max=\"99\" required>\n          </label>\n           <div role=\"alert\">\n             <span class=\"error\" ng-show=\"myForm.input.$error.required\">\n               Required!</span>\n             <span class=\"error\" ng-show=\"myForm.input.$error.number\">\n               Not valid number!</span>\n           </div>\n           <tt>value = {{example.value}}</tt><br/>\n           <tt>myForm.input.$valid = {{myForm.input.$valid}}</tt><br/>\n           <tt>myForm.input.$error = {{myForm.input.$error}}</tt><br/>\n           <tt>myForm.$valid = {{myForm.$valid}}</tt><br/>\n           <tt>myForm.$error.required = {{!!myForm.$error.required}}</tt><br/>\n          </form>\n        </file>\n        <file name=\"protractor.js\" type=\"protractor\">\n          var value = element(by.binding('example.value'));\n          var valid = element(by.binding('myForm.input.$valid'));\n          var input = element(by.model('example.value'));\n\n          it('should initialize to model', function() {\n            expect(value.getText()).toContain('12');\n            expect(valid.getText()).toContain('true');\n          });\n\n          it('should be invalid if empty', function() {\n            input.clear();\n            input.sendKeys('');\n            expect(value.getText()).toEqual('value =');\n            expect(valid.getText()).toContain('false');\n          });\n\n          it('should be invalid if over max', function() {\n            input.clear();\n            input.sendKeys('123');\n            expect(value.getText()).toEqual('value =');\n            expect(valid.getText()).toContain('false');\n          });\n        </file>\n      </example>\n   */\n  'number': numberInputType,\n\n\n  /**\n   * @ngdoc input\n   * @name input[url]\n   *\n   * @description\n   * Text input with URL validation. Sets the `url` validation error key if the content is not a\n   * valid URL.\n   *\n   * <div class=\"alert alert-warning\">\n   * **Note:** `input[url]` uses a regex to validate urls that is derived from the regex\n   * used in Chromium. If you need stricter validation, you can use `ng-pattern` or modify\n   * the built-in validators (see the {@link guide/forms Forms guide})\n   * </div>\n   *\n   * @param {string} ngModel Assignable angular expression to data-bind to.\n   * @param {string=} name Property name of the form under which the control is published.\n   * @param {string=} required Sets `required` validation error key if the value is not entered.\n   * @param {string=} ngRequired Adds `required` attribute and `required` validation constraint to\n   *    the element when the ngRequired expression evaluates to true. Use `ngRequired` instead of\n   *    `required` when you want to data-bind to the `required` attribute.\n   * @param {number=} ngMinlength Sets `minlength` validation error key if the value is shorter than\n   *    minlength.\n   * @param {number=} ngMaxlength Sets `maxlength` validation error key if the value is longer than\n   *    maxlength. Setting the attribute to a negative or non-numeric value, allows view values of\n   *    any length.\n   * @param {string=} pattern Similar to `ngPattern` except that the attribute value is the actual string\n   *    that contains the regular expression body that will be converted to a regular expression\n   *    as in the ngPattern directive.\n   * @param {string=} ngPattern Sets `pattern` validation error key if the ngModel {@link ngModel.NgModelController#$viewValue $viewValue}\n   *    does not match a RegExp found by evaluating the Angular expression given in the attribute value.\n   *    If the expression evaluates to a RegExp object, then this is used directly.\n   *    If the expression evaluates to a string, then it will be converted to a RegExp\n   *    after wrapping it in `^` and `$` characters. For instance, `\"abc\"` will be converted to\n   *    `new RegExp('^abc$')`.<br />\n   *    **Note:** Avoid using the `g` flag on the RegExp, as it will cause each successive search to\n   *    start at the index of the last search's match, thus not taking the whole input value into\n   *    account.\n   * @param {string=} ngChange Angular expression to be executed when input changes due to user\n   *    interaction with the input element.\n   *\n   * @example\n      <example name=\"url-input-directive\" module=\"urlExample\">\n        <file name=\"index.ced81ed4.html\">\n         <script>\n           angular.module('urlExample', [])\n             .controller('ExampleController', ['$scope', function($scope) {\n               $scope.url = {\n                 text: 'http://google.com'\n               };\n             }]);\n         </script>\n         <form name=\"myForm\" ng-controller=\"ExampleController\">\n           <label>URL:\n             <input type=\"url\" name=\"input\" ng-model=\"url.text\" required>\n           <label>\n           <div role=\"alert\">\n             <span class=\"error\" ng-show=\"myForm.input.$error.required\">\n               Required!</span>\n             <span class=\"error\" ng-show=\"myForm.input.$error.url\">\n               Not valid url!</span>\n           </div>\n           <tt>text = {{url.text}}</tt><br/>\n           <tt>myForm.input.$valid = {{myForm.input.$valid}}</tt><br/>\n           <tt>myForm.input.$error = {{myForm.input.$error}}</tt><br/>\n           <tt>myForm.$valid = {{myForm.$valid}}</tt><br/>\n           <tt>myForm.$error.required = {{!!myForm.$error.required}}</tt><br/>\n           <tt>myForm.$error.url = {{!!myForm.$error.url}}</tt><br/>\n          </form>\n        </file>\n        <file name=\"protractor.js\" type=\"protractor\">\n          var text = element(by.binding('url.text'));\n          var valid = element(by.binding('myForm.input.$valid'));\n          var input = element(by.model('url.text'));\n\n          it('should initialize to model', function() {\n            expect(text.getText()).toContain('http://google.com');\n            expect(valid.getText()).toContain('true');\n          });\n\n          it('should be invalid if empty', function() {\n            input.clear();\n            input.sendKeys('');\n\n            expect(text.getText()).toEqual('text =');\n            expect(valid.getText()).toContain('false');\n          });\n\n          it('should be invalid if not url', function() {\n            input.clear();\n            input.sendKeys('box');\n\n            expect(valid.getText()).toContain('false');\n          });\n        </file>\n      </example>\n   */\n  'url': urlInputType,\n\n\n  /**\n   * @ngdoc input\n   * @name input[email]\n   *\n   * @description\n   * Text input with email validation. Sets the `email` validation error key if not a valid email\n   * address.\n   *\n   * <div class=\"alert alert-warning\">\n   * **Note:** `input[email]` uses a regex to validate email addresses that is derived from the regex\n   * used in Chromium. If you need stricter validation (e.g. requiring a top-level domain), you can\n   * use `ng-pattern` or modify the built-in validators (see the {@link guide/forms Forms guide})\n   * </div>\n   *\n   * @param {string} ngModel Assignable angular expression to data-bind to.\n   * @param {string=} name Property name of the form under which the control is published.\n   * @param {string=} required Sets `required` validation error key if the value is not entered.\n   * @param {string=} ngRequired Adds `required` attribute and `required` validation constraint to\n   *    the element when the ngRequired expression evaluates to true. Use `ngRequired` instead of\n   *    `required` when you want to data-bind to the `required` attribute.\n   * @param {number=} ngMinlength Sets `minlength` validation error key if the value is shorter than\n   *    minlength.\n   * @param {number=} ngMaxlength Sets `maxlength` validation error key if the value is longer than\n   *    maxlength. Setting the attribute to a negative or non-numeric value, allows view values of\n   *    any length.\n   * @param {string=} pattern Similar to `ngPattern` except that the attribute value is the actual string\n   *    that contains the regular expression body that will be converted to a regular expression\n   *    as in the ngPattern directive.\n   * @param {string=} ngPattern Sets `pattern` validation error key if the ngModel {@link ngModel.NgModelController#$viewValue $viewValue}\n   *    does not match a RegExp found by evaluating the Angular expression given in the attribute value.\n   *    If the expression evaluates to a RegExp object, then this is used directly.\n   *    If the expression evaluates to a string, then it will be converted to a RegExp\n   *    after wrapping it in `^` and `$` characters. For instance, `\"abc\"` will be converted to\n   *    `new RegExp('^abc$')`.<br />\n   *    **Note:** Avoid using the `g` flag on the RegExp, as it will cause each successive search to\n   *    start at the index of the last search's match, thus not taking the whole input value into\n   *    account.\n   * @param {string=} ngChange Angular expression to be executed when input changes due to user\n   *    interaction with the input element.\n   *\n   * @example\n      <example name=\"email-input-directive\" module=\"emailExample\">\n        <file name=\"index.ced81ed4.html\">\n         <script>\n           angular.module('emailExample', [])\n             .controller('ExampleController', ['$scope', function($scope) {\n               $scope.email = {\n                 text: 'me@example.com'\n               };\n             }]);\n         </script>\n           <form name=\"myForm\" ng-controller=\"ExampleController\">\n             <label>Email:\n               <input type=\"email\" name=\"input\" ng-model=\"email.text\" required>\n             </label>\n             <div role=\"alert\">\n               <span class=\"error\" ng-show=\"myForm.input.$error.required\">\n                 Required!</span>\n               <span class=\"error\" ng-show=\"myForm.input.$error.email\">\n                 Not valid email!</span>\n             </div>\n             <tt>text = {{email.text}}</tt><br/>\n             <tt>myForm.input.$valid = {{myForm.input.$valid}}</tt><br/>\n             <tt>myForm.input.$error = {{myForm.input.$error}}</tt><br/>\n             <tt>myForm.$valid = {{myForm.$valid}}</tt><br/>\n             <tt>myForm.$error.required = {{!!myForm.$error.required}}</tt><br/>\n             <tt>myForm.$error.email = {{!!myForm.$error.email}}</tt><br/>\n           </form>\n         </file>\n        <file name=\"protractor.js\" type=\"protractor\">\n          var text = element(by.binding('email.text'));\n          var valid = element(by.binding('myForm.input.$valid'));\n          var input = element(by.model('email.text'));\n\n          it('should initialize to model', function() {\n            expect(text.getText()).toContain('me@example.com');\n            expect(valid.getText()).toContain('true');\n          });\n\n          it('should be invalid if empty', function() {\n            input.clear();\n            input.sendKeys('');\n            expect(text.getText()).toEqual('text =');\n            expect(valid.getText()).toContain('false');\n          });\n\n          it('should be invalid if not email', function() {\n            input.clear();\n            input.sendKeys('xxx');\n\n            expect(valid.getText()).toContain('false');\n          });\n        </file>\n      </example>\n   */\n  'email': emailInputType,\n\n\n  /**\n   * @ngdoc input\n   * @name input[radio]\n   *\n   * @description\n   * HTML radio button.\n   *\n   * @param {string} ngModel Assignable angular expression to data-bind to.\n   * @param {string} value The value to which the `ngModel` expression should be set when selected.\n   *    Note that `value` only supports `string` values, i.e. the scope model needs to be a string,\n   *    too. Use `ngValue` if you need complex models (`number`, `object`, ...).\n   * @param {string=} name Property name of the form under which the control is published.\n   * @param {string=} ngChange Angular expression to be executed when input changes due to user\n   *    interaction with the input element.\n   * @param {string} ngValue Angular expression to which `ngModel` will be be set when the radio\n   *    is selected. Should be used instead of the `value` attribute if you need\n   *    a non-string `ngModel` (`boolean`, `array`, ...).\n   *\n   * @example\n      <example name=\"radio-input-directive\" module=\"radioExample\">\n        <file name=\"index.ced81ed4.html\">\n         <script>\n           angular.module('radioExample', [])\n             .controller('ExampleController', ['$scope', function($scope) {\n               $scope.color = {\n                 name: 'blue'\n               };\n               $scope.specialValue = {\n                 \"id\": \"12345\",\n                 \"value\": \"green\"\n               };\n             }]);\n         </script>\n         <form name=\"myForm\" ng-controller=\"ExampleController\">\n           <label>\n             <input type=\"radio\" ng-model=\"color.name\" value=\"red\">\n             Red\n           </label><br/>\n           <label>\n             <input type=\"radio\" ng-model=\"color.name\" ng-value=\"specialValue\">\n             Green\n           </label><br/>\n           <label>\n             <input type=\"radio\" ng-model=\"color.name\" value=\"blue\">\n             Blue\n           </label><br/>\n           <tt>color = {{color.name | json}}</tt><br/>\n          </form>\n          Note that `ng-value=\"specialValue\"` sets radio item's value to be the value of `$scope.specialValue`.\n        </file>\n        <file name=\"protractor.js\" type=\"protractor\">\n          it('should change state', function() {\n            var inputs = element.all(by.model('color.name'));\n            var color = element(by.binding('color.name'));\n\n            expect(color.getText()).toContain('blue');\n\n            inputs.get(0).click();\n            expect(color.getText()).toContain('red');\n\n            inputs.get(1).click();\n            expect(color.getText()).toContain('green');\n          });\n        </file>\n      </example>\n   */\n  'radio': radioInputType,\n\n  /**\n   * @ngdoc input\n   * @name input[range]\n   *\n   * @description\n   * Native range input with validation and transformation.\n   *\n   * The model for the range input must always be a `Number`.\n   *\n   * IE9 and other browsers that do not support the `range` type fall back\n   * to a text input without any default values for `min`, `max` and `step`. Model binding,\n   * validation and number parsing are nevertheless supported.\n   *\n   * Browsers that support range (latest Chrome, Safari, Firefox, Edge) treat `input[range]`\n   * in a way that never allows the input to hold an invalid value. That means:\n   * - any non-numerical value is set to `(max + min) / 2`.\n   * - any numerical value that is less than the current min val, or greater than the current max val\n   * is set to the min / max val respectively.\n   * - additionally, the current `step` is respected, so the nearest value that satisfies a step\n   * is used.\n   *\n   * See the [HTML Spec on input[type=range]](https://www.w3.org/TR/html5/forms.html#range-state-(type=range))\n   * for more info.\n   *\n   * This has the following consequences for Angular:\n   *\n   * Since the element value should always reflect the current model value, a range input\n   * will set the bound ngModel expression to the value that the browser has set for the\n   * input element. For example, in the following input `<input type=\"range\" ng-model=\"model.value\">`,\n   * if the application sets `model.value = null`, the browser will set the input to `'50'`.\n   * Angular will then set the model to `50`, to prevent input and model value being out of sync.\n   *\n   * That means the model for range will immediately be set to `50` after `ngModel` has been\n   * initialized. It also means a range input can never have the required error.\n   *\n   * This does not only affect changes to the model value, but also to the values of the `min`,\n   * `max`, and `step` attributes. When these change in a way that will cause the browser to modify\n   * the input value, Angular will also update the model value.\n   *\n   * Automatic value adjustment also means that a range input element can never have the `required`,\n   * `min`, or `max` errors.\n   *\n   * However, `step` is currently only fully implemented by Firefox. Other browsers have problems\n   * when the step value changes dynamically - they do not adjust the element value correctly, but\n   * instead may set the `stepMismatch` error. If that's the case, the Angular will set the `step`\n   * error on the input, and set the model to `undefined`.\n   *\n   * Note that `input[range]` is not compatible with`ngMax`, `ngMin`, and `ngStep`, because they do\n   * not set the `min` and `max` attributes, which means that the browser won't automatically adjust\n   * the input value based on their values, and will always assume min = 0, max = 100, and step = 1.\n   *\n   * @param {string}  ngModel Assignable angular expression to data-bind to.\n   * @param {string=} name Property name of the form under which the control is published.\n   * @param {string=} min Sets the `min` validation to ensure that the value entered is greater\n   *                  than `min`. Can be interpolated.\n   * @param {string=} max Sets the `max` validation to ensure that the value entered is less than `max`.\n   *                  Can be interpolated.\n   * @param {string=} step Sets the `step` validation to ensure that the value entered matches the `step`\n   *                  Can be interpolated.\n   * @param {string=} ngChange Angular expression to be executed when the ngModel value changes due\n   *                  to user interaction with the input element.\n   * @param {expression=} ngChecked If the expression is truthy, then the `checked` attribute will be set on the\n   *                      element. **Note** : `ngChecked` should not be used alongside `ngModel`.\n   *                      Checkout {@link ng.directive:ngChecked ngChecked} for usage.\n   *\n   * @example\n      <example name=\"range-input-directive\" module=\"rangeExample\">\n        <file name=\"index.ced81ed4.html\">\n          <script>\n            angular.module('rangeExample', [])\n              .controller('ExampleController', ['$scope', function($scope) {\n                $scope.value = 75;\n                $scope.min = 10;\n                $scope.max = 90;\n              }]);\n          </script>\n          <form name=\"myForm\" ng-controller=\"ExampleController\">\n\n            Model as range: <input type=\"range\" name=\"range\" ng-model=\"value\" min=\"{{min}}\"  max=\"{{max}}\">\n            <hr>\n            Model as number: <input type=\"number\" ng-model=\"value\"><br>\n            Min: <input type=\"number\" ng-model=\"min\"><br>\n            Max: <input type=\"number\" ng-model=\"max\"><br>\n            value = <code>{{value}}</code><br/>\n            myForm.range.$valid = <code>{{myForm.range.$valid}}</code><br/>\n            myForm.range.$error = <code>{{myForm.range.$error}}</code>\n          </form>\n        </file>\n      </example>\n\n   * ## Range Input with ngMin & ngMax attributes\n\n   * @example\n      <example name=\"range-input-directive-ng\" module=\"rangeExample\">\n        <file name=\"index.ced81ed4.html\">\n          <script>\n            angular.module('rangeExample', [])\n              .controller('ExampleController', ['$scope', function($scope) {\n                $scope.value = 75;\n                $scope.min = 10;\n                $scope.max = 90;\n              }]);\n          </script>\n          <form name=\"myForm\" ng-controller=\"ExampleController\">\n            Model as range: <input type=\"range\" name=\"range\" ng-model=\"value\" ng-min=\"min\" ng-max=\"max\">\n            <hr>\n            Model as number: <input type=\"number\" ng-model=\"value\"><br>\n            Min: <input type=\"number\" ng-model=\"min\"><br>\n            Max: <input type=\"number\" ng-model=\"max\"><br>\n            value = <code>{{value}}</code><br/>\n            myForm.range.$valid = <code>{{myForm.range.$valid}}</code><br/>\n            myForm.range.$error = <code>{{myForm.range.$error}}</code>\n          </form>\n        </file>\n      </example>\n\n   */\n  'range': rangeInputType,\n\n  /**\n   * @ngdoc input\n   * @name input[checkbox]\n   *\n   * @description\n   * HTML checkbox.\n   *\n   * @param {string} ngModel Assignable angular expression to data-bind to.\n   * @param {string=} name Property name of the form under which the control is published.\n   * @param {expression=} ngTrueValue The value to which the expression should be set when selected.\n   * @param {expression=} ngFalseValue The value to which the expression should be set when not selected.\n   * @param {string=} ngChange Angular expression to be executed when input changes due to user\n   *    interaction with the input element.\n   *\n   * @example\n      <example name=\"checkbox-input-directive\" module=\"checkboxExample\">\n        <file name=\"index.ced81ed4.html\">\n         <script>\n           angular.module('checkboxExample', [])\n             .controller('ExampleController', ['$scope', function($scope) {\n               $scope.checkboxModel = {\n                value1 : true,\n                value2 : 'YES'\n              };\n             }]);\n         </script>\n         <form name=\"myForm\" ng-controller=\"ExampleController\">\n           <label>Value1:\n             <input type=\"checkbox\" ng-model=\"checkboxModel.value1\">\n           </label><br/>\n           <label>Value2:\n             <input type=\"checkbox\" ng-model=\"checkboxModel.value2\"\n                    ng-true-value=\"'YES'\" ng-false-value=\"'NO'\">\n            </label><br/>\n           <tt>value1 = {{checkboxModel.value1}}</tt><br/>\n           <tt>value2 = {{checkboxModel.value2}}</tt><br/>\n          </form>\n        </file>\n        <file name=\"protractor.js\" type=\"protractor\">\n          it('should change state', function() {\n            var value1 = element(by.binding('checkboxModel.value1'));\n            var value2 = element(by.binding('checkboxModel.value2'));\n\n            expect(value1.getText()).toContain('true');\n            expect(value2.getText()).toContain('YES');\n\n            element(by.model('checkboxModel.value1')).click();\n            element(by.model('checkboxModel.value2')).click();\n\n            expect(value1.getText()).toContain('false');\n            expect(value2.getText()).toContain('NO');\n          });\n        </file>\n      </example>\n   */\n  'checkbox': checkboxInputType,\n\n  'hidden': noop,\n  'button': noop,\n  'submit': noop,\n  'reset': noop,\n  'file': noop\n};\n\nfunction stringBasedInputType(ctrl) {\n  ctrl.$formatters.push(function(value) {\n    return ctrl.$isEmpty(value) ? value : value.toString();\n  });\n}\n\nfunction textInputType(scope, element, attr, ctrl, $sniffer, $browser) {\n  baseInputType(scope, element, attr, ctrl, $sniffer, $browser);\n  stringBasedInputType(ctrl);\n}\n\nfunction baseInputType(scope, element, attr, ctrl, $sniffer, $browser) {\n  var type = lowercase(element[0].type);\n\n  // In composition mode, users are still inputting intermediate text buffer,\n  // hold the listener until composition is done.\n  // More about composition events: https://developer.mozilla.org/en-US/docs/Web/API/CompositionEvent\n  if (!$sniffer.android) {\n    var composing = false;\n\n    element.on('compositionstart', function() {\n      composing = true;\n    });\n\n    element.on('compositionend', function() {\n      composing = false;\n      listener();\n    });\n  }\n\n  var timeout;\n\n  var listener = function(ev) {\n    if (timeout) {\n      $browser.defer.cancel(timeout);\n      timeout = null;\n    }\n    if (composing) return;\n    var value = element.val(),\n        event = ev && ev.type;\n\n    // By default we will trim the value\n    // If the attribute ng-trim exists we will avoid trimming\n    // If input type is 'password', the value is never trimmed\n    if (type !== 'password' && (!attr.ngTrim || attr.ngTrim !== 'false')) {\n      value = trim(value);\n    }\n\n    // If a control is suffering from bad input (due to native validators), browsers discard its\n    // value, so it may be necessary to revalidate (by calling $setViewValue again) even if the\n    // control's value is the same empty value twice in a row.\n    if (ctrl.$viewValue !== value || (value === '' && ctrl.$$hasNativeValidators)) {\n      ctrl.$setViewValue(value, event);\n    }\n  };\n\n  // if the browser does support \"input\" event, we are fine - except on IE9 which doesn't fire the\n  // input event on backspace, delete or cut\n  if ($sniffer.hasEvent('input')) {\n    element.on('input', listener);\n  } else {\n    var deferListener = function(ev, input, origValue) {\n      if (!timeout) {\n        timeout = $browser.defer(function() {\n          timeout = null;\n          if (!input || input.value !== origValue) {\n            listener(ev);\n          }\n        });\n      }\n    };\n\n    element.on('keydown', /** @this */ function(event) {\n      var key = event.keyCode;\n\n      // ignore\n      //    command            modifiers                   arrows\n      if (key === 91 || (15 < key && key < 19) || (37 <= key && key <= 40)) return;\n\n      deferListener(event, this, this.value);\n    });\n\n    // if user modifies input value using context menu in IE, we need \"paste\" and \"cut\" events to catch it\n    if ($sniffer.hasEvent('paste')) {\n      element.on('paste cut', deferListener);\n    }\n  }\n\n  // if user paste into input using mouse on older browser\n  // or form autocomplete on newer browser, we need \"change\" event to catch it\n  element.on('change', listener);\n\n  // Some native input types (date-family) have the ability to change validity without\n  // firing any input/change events.\n  // For these event types, when native validators are present and the browser supports the type,\n  // check for validity changes on various DOM events.\n  if (PARTIAL_VALIDATION_TYPES[type] && ctrl.$$hasNativeValidators && type === attr.type) {\n    element.on(PARTIAL_VALIDATION_EVENTS, /** @this */ function(ev) {\n      if (!timeout) {\n        var validity = this[VALIDITY_STATE_PROPERTY];\n        var origBadInput = validity.badInput;\n        var origTypeMismatch = validity.typeMismatch;\n        timeout = $browser.defer(function() {\n          timeout = null;\n          if (validity.badInput !== origBadInput || validity.typeMismatch !== origTypeMismatch) {\n            listener(ev);\n          }\n        });\n      }\n    });\n  }\n\n  ctrl.$render = function() {\n    // Workaround for Firefox validation #12102.\n    var value = ctrl.$isEmpty(ctrl.$viewValue) ? '' : ctrl.$viewValue;\n    if (element.val() !== value) {\n      element.val(value);\n    }\n  };\n}\n\nfunction weekParser(isoWeek, existingDate) {\n  if (isDate(isoWeek)) {\n    return isoWeek;\n  }\n\n  if (isString(isoWeek)) {\n    WEEK_REGEXP.lastIndex = 0;\n    var parts = WEEK_REGEXP.exec(isoWeek);\n    if (parts) {\n      var year = +parts[1],\n          week = +parts[2],\n          hours = 0,\n          minutes = 0,\n          seconds = 0,\n          milliseconds = 0,\n          firstThurs = getFirstThursdayOfYear(year),\n          addDays = (week - 1) * 7;\n\n      if (existingDate) {\n        hours = existingDate.getHours();\n        minutes = existingDate.getMinutes();\n        seconds = existingDate.getSeconds();\n        milliseconds = existingDate.getMilliseconds();\n      }\n\n      return new Date(year, 0, firstThurs.getDate() + addDays, hours, minutes, seconds, milliseconds);\n    }\n  }\n\n  return NaN;\n}\n\nfunction createDateParser(regexp, mapping) {\n  return function(iso, date) {\n    var parts, map;\n\n    if (isDate(iso)) {\n      return iso;\n    }\n\n    if (isString(iso)) {\n      // When a date is JSON'ified to wraps itself inside of an extra\n      // set of double quotes. This makes the date parsing code unable\n      // to match the date string and parse it as a date.\n      if (iso.charAt(0) === '\"' && iso.charAt(iso.length - 1) === '\"') {\n        iso = iso.substring(1, iso.length - 1);\n      }\n      if (ISO_DATE_REGEXP.test(iso)) {\n        return new Date(iso);\n      }\n      regexp.lastIndex = 0;\n      parts = regexp.exec(iso);\n\n      if (parts) {\n        parts.shift();\n        if (date) {\n          map = {\n            yyyy: date.getFullYear(),\n            MM: date.getMonth() + 1,\n            dd: date.getDate(),\n            HH: date.getHours(),\n            mm: date.getMinutes(),\n            ss: date.getSeconds(),\n            sss: date.getMilliseconds() / 1000\n          };\n        } else {\n          map = { yyyy: 1970, MM: 1, dd: 1, HH: 0, mm: 0, ss: 0, sss: 0 };\n        }\n\n        forEach(parts, function(part, index) {\n          if (index < mapping.length) {\n            map[mapping[index]] = +part;\n          }\n        });\n        return new Date(map.yyyy, map.MM - 1, map.dd, map.HH, map.mm, map.ss || 0, map.sss * 1000 || 0);\n      }\n    }\n\n    return NaN;\n  };\n}\n\nfunction createDateInputType(type, regexp, parseDate, format) {\n  return function dynamicDateInputType(scope, element, attr, ctrl, $sniffer, $browser, $filter) {\n    badInputChecker(scope, element, attr, ctrl);\n    baseInputType(scope, element, attr, ctrl, $sniffer, $browser);\n    var timezone = ctrl && ctrl.$options.getOption('timezone');\n    var previousDate;\n\n    ctrl.$$parserName = type;\n    ctrl.$parsers.push(function(value) {\n      if (ctrl.$isEmpty(value)) return null;\n      if (regexp.test(value)) {\n        // Note: We cannot read ctrl.$modelValue, as there might be a different\n        // parser/formatter in the processing chain so that the model\n        // contains some different data format!\n        var parsedDate = parseDate(value, previousDate);\n        if (timezone) {\n          parsedDate = convertTimezoneToLocal(parsedDate, timezone);\n        }\n        return parsedDate;\n      }\n      return undefined;\n    });\n\n    ctrl.$formatters.push(function(value) {\n      if (value && !isDate(value)) {\n        throw ngModelMinErr('datefmt', 'Expected `{0}` to be a date', value);\n      }\n      if (isValidDate(value)) {\n        previousDate = value;\n        if (previousDate && timezone) {\n          previousDate = convertTimezoneToLocal(previousDate, timezone, true);\n        }\n        return $filter('date')(value, format, timezone);\n      } else {\n        previousDate = null;\n        return '';\n      }\n    });\n\n    if (isDefined(attr.min) || attr.ngMin) {\n      var minVal;\n      ctrl.$validators.min = function(value) {\n        return !isValidDate(value) || isUndefined(minVal) || parseDate(value) >= minVal;\n      };\n      attr.$observe('min', function(val) {\n        minVal = parseObservedDateValue(val);\n        ctrl.$validate();\n      });\n    }\n\n    if (isDefined(attr.max) || attr.ngMax) {\n      var maxVal;\n      ctrl.$validators.max = function(value) {\n        return !isValidDate(value) || isUndefined(maxVal) || parseDate(value) <= maxVal;\n      };\n      attr.$observe('max', function(val) {\n        maxVal = parseObservedDateValue(val);\n        ctrl.$validate();\n      });\n    }\n\n    function isValidDate(value) {\n      // Invalid Date: getTime() returns NaN\n      return value && !(value.getTime && value.getTime() !== value.getTime());\n    }\n\n    function parseObservedDateValue(val) {\n      return isDefined(val) && !isDate(val) ? parseDate(val) || undefined : val;\n    }\n  };\n}\n\nfunction badInputChecker(scope, element, attr, ctrl) {\n  var node = element[0];\n  var nativeValidation = ctrl.$$hasNativeValidators = isObject(node.validity);\n  if (nativeValidation) {\n    ctrl.$parsers.push(function(value) {\n      var validity = element.prop(VALIDITY_STATE_PROPERTY) || {};\n      return validity.badInput || validity.typeMismatch ? undefined : value;\n    });\n  }\n}\n\nfunction numberFormatterParser(ctrl) {\n  ctrl.$$parserName = 'number';\n  ctrl.$parsers.push(function(value) {\n    if (ctrl.$isEmpty(value))      return null;\n    if (NUMBER_REGEXP.test(value)) return parseFloat(value);\n    return undefined;\n  });\n\n  ctrl.$formatters.push(function(value) {\n    if (!ctrl.$isEmpty(value)) {\n      if (!isNumber(value)) {\n        throw ngModelMinErr('numfmt', 'Expected `{0}` to be a number', value);\n      }\n      value = value.toString();\n    }\n    return value;\n  });\n}\n\nfunction parseNumberAttrVal(val) {\n  if (isDefined(val) && !isNumber(val)) {\n    val = parseFloat(val);\n  }\n  return !isNumberNaN(val) ? val : undefined;\n}\n\nfunction isNumberInteger(num) {\n  // See http://stackoverflow.com/questions/14636536/how-to-check-if-a-variable-is-an-integer-in-javascript#14794066\n  // (minus the assumption that `num` is a number)\n\n  // eslint-disable-next-line no-bitwise\n  return (num | 0) === num;\n}\n\nfunction countDecimals(num) {\n  var numString = num.toString();\n  var decimalSymbolIndex = numString.indexOf('.');\n\n  if (decimalSymbolIndex === -1) {\n    if (-1 < num && num < 1) {\n      // It may be in the exponential notation format (`1e-X`)\n      var match = /e-(\\d+)$/.exec(numString);\n\n      if (match) {\n        return Number(match[1]);\n      }\n    }\n\n    return 0;\n  }\n\n  return numString.length - decimalSymbolIndex - 1;\n}\n\nfunction isValidForStep(viewValue, stepBase, step) {\n  // At this point `stepBase` and `step` are expected to be non-NaN values\n  // and `viewValue` is expected to be a valid stringified number.\n  var value = Number(viewValue);\n\n  var isNonIntegerValue = !isNumberInteger(value);\n  var isNonIntegerStepBase = !isNumberInteger(stepBase);\n  var isNonIntegerStep = !isNumberInteger(step);\n\n  // Due to limitations in Floating Point Arithmetic (e.g. `0.3 - 0.2 !== 0.1` or\n  // `0.5 % 0.1 !== 0`), we need to convert all numbers to integers.\n  if (isNonIntegerValue || isNonIntegerStepBase || isNonIntegerStep) {\n    var valueDecimals = isNonIntegerValue ? countDecimals(value) : 0;\n    var stepBaseDecimals = isNonIntegerStepBase ? countDecimals(stepBase) : 0;\n    var stepDecimals = isNonIntegerStep ? countDecimals(step) : 0;\n\n    var decimalCount = Math.max(valueDecimals, stepBaseDecimals, stepDecimals);\n    var multiplier = Math.pow(10, decimalCount);\n\n    value = value * multiplier;\n    stepBase = stepBase * multiplier;\n    step = step * multiplier;\n\n    if (isNonIntegerValue) value = Math.round(value);\n    if (isNonIntegerStepBase) stepBase = Math.round(stepBase);\n    if (isNonIntegerStep) step = Math.round(step);\n  }\n\n  return (value - stepBase) % step === 0;\n}\n\nfunction numberInputType(scope, element, attr, ctrl, $sniffer, $browser) {\n  badInputChecker(scope, element, attr, ctrl);\n  numberFormatterParser(ctrl);\n  baseInputType(scope, element, attr, ctrl, $sniffer, $browser);\n\n  var minVal;\n  var maxVal;\n\n  if (isDefined(attr.min) || attr.ngMin) {\n    ctrl.$validators.min = function(value) {\n      return ctrl.$isEmpty(value) || isUndefined(minVal) || value >= minVal;\n    };\n\n    attr.$observe('min', function(val) {\n      minVal = parseNumberAttrVal(val);\n      // TODO(matsko): implement validateLater to reduce number of validations\n      ctrl.$validate();\n    });\n  }\n\n  if (isDefined(attr.max) || attr.ngMax) {\n    ctrl.$validators.max = function(value) {\n      return ctrl.$isEmpty(value) || isUndefined(maxVal) || value <= maxVal;\n    };\n\n    attr.$observe('max', function(val) {\n      maxVal = parseNumberAttrVal(val);\n      // TODO(matsko): implement validateLater to reduce number of validations\n      ctrl.$validate();\n    });\n  }\n\n  if (isDefined(attr.step) || attr.ngStep) {\n    var stepVal;\n    ctrl.$validators.step = function(modelValue, viewValue) {\n      return ctrl.$isEmpty(viewValue) || isUndefined(stepVal) ||\n             isValidForStep(viewValue, minVal || 0, stepVal);\n    };\n\n    attr.$observe('step', function(val) {\n      stepVal = parseNumberAttrVal(val);\n      // TODO(matsko): implement validateLater to reduce number of validations\n      ctrl.$validate();\n    });\n  }\n}\n\nfunction rangeInputType(scope, element, attr, ctrl, $sniffer, $browser) {\n  badInputChecker(scope, element, attr, ctrl);\n  numberFormatterParser(ctrl);\n  baseInputType(scope, element, attr, ctrl, $sniffer, $browser);\n\n  var supportsRange = ctrl.$$hasNativeValidators && element[0].type === 'range',\n      minVal = supportsRange ? 0 : undefined,\n      maxVal = supportsRange ? 100 : undefined,\n      stepVal = supportsRange ? 1 : undefined,\n      validity = element[0].validity,\n      hasMinAttr = isDefined(attr.min),\n      hasMaxAttr = isDefined(attr.max),\n      hasStepAttr = isDefined(attr.step);\n\n  var originalRender = ctrl.$render;\n\n  ctrl.$render = supportsRange && isDefined(validity.rangeUnderflow) && isDefined(validity.rangeOverflow) ?\n    //Browsers that implement range will set these values automatically, but reading the adjusted values after\n    //$render would cause the min / max validators to be applied with the wrong value\n    function rangeRender() {\n      originalRender();\n      ctrl.$setViewValue(element.val());\n    } :\n    originalRender;\n\n  if (hasMinAttr) {\n    ctrl.$validators.min = supportsRange ?\n      // Since all browsers set the input to a valid value, we don't need to check validity\n      function noopMinValidator() { return true; } :\n      // non-support browsers validate the min val\n      function minValidator(modelValue, viewValue) {\n        return ctrl.$isEmpty(viewValue) || isUndefined(minVal) || viewValue >= minVal;\n      };\n\n    setInitialValueAndObserver('min', minChange);\n  }\n\n  if (hasMaxAttr) {\n    ctrl.$validators.max = supportsRange ?\n      // Since all browsers set the input to a valid value, we don't need to check validity\n      function noopMaxValidator() { return true; } :\n      // non-support browsers validate the max val\n      function maxValidator(modelValue, viewValue) {\n        return ctrl.$isEmpty(viewValue) || isUndefined(maxVal) || viewValue <= maxVal;\n      };\n\n    setInitialValueAndObserver('max', maxChange);\n  }\n\n  if (hasStepAttr) {\n    ctrl.$validators.step = supportsRange ?\n      function nativeStepValidator() {\n        // Currently, only FF implements the spec on step change correctly (i.e. adjusting the\n        // input element value to a valid value). It's possible that other browsers set the stepMismatch\n        // validity error instead, so we can at least report an error in that case.\n        return !validity.stepMismatch;\n      } :\n      // ngStep doesn't set the setp attr, so the browser doesn't adjust the input value as setting step would\n      function stepValidator(modelValue, viewValue) {\n        return ctrl.$isEmpty(viewValue) || isUndefined(stepVal) ||\n               isValidForStep(viewValue, minVal || 0, stepVal);\n      };\n\n    setInitialValueAndObserver('step', stepChange);\n  }\n\n  function setInitialValueAndObserver(htmlAttrName, changeFn) {\n    // interpolated attributes set the attribute value only after a digest, but we need the\n    // attribute value when the input is first rendered, so that the browser can adjust the\n    // input value based on the min/max value\n    element.attr(htmlAttrName, attr[htmlAttrName]);\n    attr.$observe(htmlAttrName, changeFn);\n  }\n\n  function minChange(val) {\n    minVal = parseNumberAttrVal(val);\n    // ignore changes before model is initialized\n    if (isNumberNaN(ctrl.$modelValue)) {\n      return;\n    }\n\n    if (supportsRange) {\n      var elVal = element.val();\n      // IE11 doesn't set the el val correctly if the minVal is greater than the element value\n      if (minVal > elVal) {\n        elVal = minVal;\n        element.val(elVal);\n      }\n      ctrl.$setViewValue(elVal);\n    } else {\n      // TODO(matsko): implement validateLater to reduce number of validations\n      ctrl.$validate();\n    }\n  }\n\n  function maxChange(val) {\n    maxVal = parseNumberAttrVal(val);\n    // ignore changes before model is initialized\n    if (isNumberNaN(ctrl.$modelValue)) {\n      return;\n    }\n\n    if (supportsRange) {\n      var elVal = element.val();\n      // IE11 doesn't set the el val correctly if the maxVal is less than the element value\n      if (maxVal < elVal) {\n        element.val(maxVal);\n        // IE11 and Chrome don't set the value to the minVal when max < min\n        elVal = maxVal < minVal ? minVal : maxVal;\n      }\n      ctrl.$setViewValue(elVal);\n    } else {\n      // TODO(matsko): implement validateLater to reduce number of validations\n      ctrl.$validate();\n    }\n  }\n\n  function stepChange(val) {\n    stepVal = parseNumberAttrVal(val);\n    // ignore changes before model is initialized\n    if (isNumberNaN(ctrl.$modelValue)) {\n      return;\n    }\n\n    // Some browsers don't adjust the input value correctly, but set the stepMismatch error\n    if (supportsRange && ctrl.$viewValue !== element.val()) {\n      ctrl.$setViewValue(element.val());\n    } else {\n      // TODO(matsko): implement validateLater to reduce number of validations\n      ctrl.$validate();\n    }\n  }\n}\n\nfunction urlInputType(scope, element, attr, ctrl, $sniffer, $browser) {\n  // Note: no badInputChecker here by purpose as `url` is only a validation\n  // in browsers, i.e. we can always read out input.value even if it is not valid!\n  baseInputType(scope, element, attr, ctrl, $sniffer, $browser);\n  stringBasedInputType(ctrl);\n\n  ctrl.$$parserName = 'url';\n  ctrl.$validators.url = function(modelValue, viewValue) {\n    var value = modelValue || viewValue;\n    return ctrl.$isEmpty(value) || URL_REGEXP.test(value);\n  };\n}\n\nfunction emailInputType(scope, element, attr, ctrl, $sniffer, $browser) {\n  // Note: no badInputChecker here by purpose as `url` is only a validation\n  // in browsers, i.e. we can always read out input.value even if it is not valid!\n  baseInputType(scope, element, attr, ctrl, $sniffer, $browser);\n  stringBasedInputType(ctrl);\n\n  ctrl.$$parserName = 'email';\n  ctrl.$validators.email = function(modelValue, viewValue) {\n    var value = modelValue || viewValue;\n    return ctrl.$isEmpty(value) || EMAIL_REGEXP.test(value);\n  };\n}\n\nfunction radioInputType(scope, element, attr, ctrl) {\n  var doTrim = !attr.ngTrim || trim(attr.ngTrim) !== 'false';\n  // make the name unique, if not defined\n  if (isUndefined(attr.name)) {\n    element.attr('name', nextUid());\n  }\n\n  var listener = function(ev) {\n    var value;\n    if (element[0].checked) {\n      value = attr.value;\n      if (doTrim) {\n        value = trim(value);\n      }\n      ctrl.$setViewValue(value, ev && ev.type);\n    }\n  };\n\n  element.on('click', listener);\n\n  ctrl.$render = function() {\n    var value = attr.value;\n    if (doTrim) {\n      value = trim(value);\n    }\n    element[0].checked = (value === ctrl.$viewValue);\n  };\n\n  attr.$observe('value', ctrl.$render);\n}\n\nfunction parseConstantExpr($parse, context, name, expression, fallback) {\n  var parseFn;\n  if (isDefined(expression)) {\n    parseFn = $parse(expression);\n    if (!parseFn.constant) {\n      throw ngModelMinErr('constexpr', 'Expected constant expression for `{0}`, but saw ' +\n                                   '`{1}`.', name, expression);\n    }\n    return parseFn(context);\n  }\n  return fallback;\n}\n\nfunction checkboxInputType(scope, element, attr, ctrl, $sniffer, $browser, $filter, $parse) {\n  var trueValue = parseConstantExpr($parse, scope, 'ngTrueValue', attr.ngTrueValue, true);\n  var falseValue = parseConstantExpr($parse, scope, 'ngFalseValue', attr.ngFalseValue, false);\n\n  var listener = function(ev) {\n    ctrl.$setViewValue(element[0].checked, ev && ev.type);\n  };\n\n  element.on('click', listener);\n\n  ctrl.$render = function() {\n    element[0].checked = ctrl.$viewValue;\n  };\n\n  // Override the standard `$isEmpty` because the $viewValue of an empty checkbox is always set to `false`\n  // This is because of the parser below, which compares the `$modelValue` with `trueValue` to convert\n  // it to a boolean.\n  ctrl.$isEmpty = function(value) {\n    return value === false;\n  };\n\n  ctrl.$formatters.push(function(value) {\n    return equals(value, trueValue);\n  });\n\n  ctrl.$parsers.push(function(value) {\n    return value ? trueValue : falseValue;\n  });\n}\n\n\n/**\n * @ngdoc directive\n * @name textarea\n * @restrict E\n *\n * @description\n * HTML textarea element control with angular data-binding. The data-binding and validation\n * properties of this element are exactly the same as those of the\n * {@link ng.directive:input input element}.\n *\n * @param {string} ngModel Assignable angular expression to data-bind to.\n * @param {string=} name Property name of the form under which the control is published.\n * @param {string=} required Sets `required` validation error key if the value is not entered.\n * @param {string=} ngRequired Adds `required` attribute and `required` validation constraint to\n *    the element when the ngRequired expression evaluates to true. Use `ngRequired` instead of\n *    `required` when you want to data-bind to the `required` attribute.\n * @param {number=} ngMinlength Sets `minlength` validation error key if the value is shorter than\n *    minlength.\n * @param {number=} ngMaxlength Sets `maxlength` validation error key if the value is longer than\n *    maxlength. Setting the attribute to a negative or non-numeric value, allows view values of any\n *    length.\n * @param {string=} ngPattern Sets `pattern` validation error key if the ngModel {@link ngModel.NgModelController#$viewValue $viewValue}\n *    does not match a RegExp found by evaluating the Angular expression given in the attribute value.\n *    If the expression evaluates to a RegExp object, then this is used directly.\n *    If the expression evaluates to a string, then it will be converted to a RegExp\n *    after wrapping it in `^` and `$` characters. For instance, `\"abc\"` will be converted to\n *    `new RegExp('^abc$')`.<br />\n *    **Note:** Avoid using the `g` flag on the RegExp, as it will cause each successive search to\n *    start at the index of the last search's match, thus not taking the whole input value into\n *    account.\n * @param {string=} ngChange Angular expression to be executed when input changes due to user\n *    interaction with the input element.\n * @param {boolean=} [ngTrim=true] If set to false Angular will not automatically trim the input.\n *\n * @knownIssue\n *\n * When specifying the `placeholder` attribute of `<textarea>`, Internet Explorer will temporarily\n * insert the placeholder value as the textarea's content. If the placeholder value contains\n * interpolation (`{{ ... }}`), an error will be logged in the console when Angular tries to update\n * the value of the by-then-removed text node. This doesn't affect the functionality of the\n * textarea, but can be undesirable.\n *\n * You can work around this Internet Explorer issue by using `ng-attr-placeholder` instead of\n * `placeholder` on textareas, whenever you need interpolation in the placeholder value. You can\n * find more details on `ngAttr` in the\n * [Interpolation](guide/interpolation#-ngattr-for-binding-to-arbitrary-attributes) section of the\n * Developer Guide.\n */\n\n\n/**\n * @ngdoc directive\n * @name input\n * @restrict E\n *\n * @description\n * HTML input element control. When used together with {@link ngModel `ngModel`}, it provides data-binding,\n * input state control, and validation.\n * Input control follows HTML5 input types and polyfills the HTML5 validation behavior for older browsers.\n *\n * <div class=\"alert alert-warning\">\n * **Note:** Not every feature offered is available for all input types.\n * Specifically, data binding and event handling via `ng-model` is unsupported for `input[file]`.\n * </div>\n *\n * @param {string} ngModel Assignable angular expression to data-bind to.\n * @param {string=} name Property name of the form under which the control is published.\n * @param {string=} required Sets `required` validation error key if the value is not entered.\n * @param {boolean=} ngRequired Sets `required` attribute if set to true\n * @param {number=} ngMinlength Sets `minlength` validation error key if the value is shorter than\n *    minlength.\n * @param {number=} ngMaxlength Sets `maxlength` validation error key if the value is longer than\n *    maxlength. Setting the attribute to a negative or non-numeric value, allows view values of any\n *    length.\n * @param {string=} ngPattern Sets `pattern` validation error key if the ngModel {@link ngModel.NgModelController#$viewValue $viewValue}\n *    value does not match a RegExp found by evaluating the Angular expression given in the attribute value.\n *    If the expression evaluates to a RegExp object, then this is used directly.\n *    If the expression evaluates to a string, then it will be converted to a RegExp\n *    after wrapping it in `^` and `$` characters. For instance, `\"abc\"` will be converted to\n *    `new RegExp('^abc$')`.<br />\n *    **Note:** Avoid using the `g` flag on the RegExp, as it will cause each successive search to\n *    start at the index of the last search's match, thus not taking the whole input value into\n *    account.\n * @param {string=} ngChange Angular expression to be executed when input changes due to user\n *    interaction with the input element.\n * @param {boolean=} [ngTrim=true] If set to false Angular will not automatically trim the input.\n *    This parameter is ignored for input[type=password] controls, which will never trim the\n *    input.\n *\n * @example\n    <example name=\"input-directive\" module=\"inputExample\">\n      <file name=\"index.ced81ed4.html\">\n       <script>\n          angular.module('inputExample', [])\n            .controller('ExampleController', ['$scope', function($scope) {\n              $scope.user = {name: 'guest', last: 'visitor'};\n            }]);\n       </script>\n       <div ng-controller=\"ExampleController\">\n         <form name=\"myForm\">\n           <label>\n              User name:\n              <input type=\"text\" name=\"userName\" ng-model=\"user.name\" required>\n           </label>\n           <div role=\"alert\">\n             <span class=\"error\" ng-show=\"myForm.userName.$error.required\">\n              Required!</span>\n           </div>\n           <label>\n              Last name:\n              <input type=\"text\" name=\"lastName\" ng-model=\"user.last\"\n              ng-minlength=\"3\" ng-maxlength=\"10\">\n           </label>\n           <div role=\"alert\">\n             <span class=\"error\" ng-show=\"myForm.lastName.$error.minlength\">\n               Too short!</span>\n             <span class=\"error\" ng-show=\"myForm.lastName.$error.maxlength\">\n               Too long!</span>\n           </div>\n         </form>\n         <hr>\n         <tt>user = {{user}}</tt><br/>\n         <tt>myForm.userName.$valid = {{myForm.userName.$valid}}</tt><br/>\n         <tt>myForm.userName.$error = {{myForm.userName.$error}}</tt><br/>\n         <tt>myForm.lastName.$valid = {{myForm.lastName.$valid}}</tt><br/>\n         <tt>myForm.lastName.$error = {{myForm.lastName.$error}}</tt><br/>\n         <tt>myForm.$valid = {{myForm.$valid}}</tt><br/>\n         <tt>myForm.$error.required = {{!!myForm.$error.required}}</tt><br/>\n         <tt>myForm.$error.minlength = {{!!myForm.$error.minlength}}</tt><br/>\n         <tt>myForm.$error.maxlength = {{!!myForm.$error.maxlength}}</tt><br/>\n       </div>\n      </file>\n      <file name=\"protractor.js\" type=\"protractor\">\n        var user = element(by.exactBinding('user'));\n        var userNameValid = element(by.binding('myForm.userName.$valid'));\n        var lastNameValid = element(by.binding('myForm.lastName.$valid'));\n        var lastNameError = element(by.binding('myForm.lastName.$error'));\n        var formValid = element(by.binding('myForm.$valid'));\n        var userNameInput = element(by.model('user.name'));\n        var userLastInput = element(by.model('user.last'));\n\n        it('should initialize to model', function() {\n          expect(user.getText()).toContain('{\"name\":\"guest\",\"last\":\"visitor\"}');\n          expect(userNameValid.getText()).toContain('true');\n          expect(formValid.getText()).toContain('true');\n        });\n\n        it('should be invalid if empty when required', function() {\n          userNameInput.clear();\n          userNameInput.sendKeys('');\n\n          expect(user.getText()).toContain('{\"last\":\"visitor\"}');\n          expect(userNameValid.getText()).toContain('false');\n          expect(formValid.getText()).toContain('false');\n        });\n\n        it('should be valid if empty when min length is set', function() {\n          userLastInput.clear();\n          userLastInput.sendKeys('');\n\n          expect(user.getText()).toContain('{\"name\":\"guest\",\"last\":\"\"}');\n          expect(lastNameValid.getText()).toContain('true');\n          expect(formValid.getText()).toContain('true');\n        });\n\n        it('should be invalid if less than required min length', function() {\n          userLastInput.clear();\n          userLastInput.sendKeys('xx');\n\n          expect(user.getText()).toContain('{\"name\":\"guest\"}');\n          expect(lastNameValid.getText()).toContain('false');\n          expect(lastNameError.getText()).toContain('minlength');\n          expect(formValid.getText()).toContain('false');\n        });\n\n        it('should be invalid if longer than max length', function() {\n          userLastInput.clear();\n          userLastInput.sendKeys('some ridiculously long name');\n\n          expect(user.getText()).toContain('{\"name\":\"guest\"}');\n          expect(lastNameValid.getText()).toContain('false');\n          expect(lastNameError.getText()).toContain('maxlength');\n          expect(formValid.getText()).toContain('false');\n        });\n      </file>\n    </example>\n */\nvar inputDirective = ['$browser', '$sniffer', '$filter', '$parse',\n    function($browser, $sniffer, $filter, $parse) {\n  return {\n    restrict: 'E',\n    require: ['?ngModel'],\n    link: {\n      pre: function(scope, element, attr, ctrls) {\n        if (ctrls[0]) {\n          (inputType[lowercase(attr.type)] || inputType.text)(scope, element, attr, ctrls[0], $sniffer,\n                                                              $browser, $filter, $parse);\n        }\n      }\n    }\n  };\n}];\n\n\n\nvar CONSTANT_VALUE_REGEXP = /^(true|false|\\d+)$/;\n/**\n * @ngdoc directive\n * @name ngValue\n *\n * @description\n * Binds the given expression to the value of the element.\n *\n * It is mainly used on {@link input[radio] `input[radio]`} and option elements,\n * so that when the element is selected, the {@link ngModel `ngModel`} of that element (or its\n * {@link select `select`} parent element) is set to the bound value. It is especially useful\n * for dynamically generated lists using {@link ngRepeat `ngRepeat`}, as shown below.\n *\n * It can also be used to achieve one-way binding of a given expression to an input element\n * such as an `input[text]` or a `textarea`, when that element does not use ngModel.\n *\n * @element input\n * @param {string=} ngValue angular expression, whose value will be bound to the `value` attribute\n * and `value` property of the element.\n *\n * @example\n    <example name=\"ngValue-directive\" module=\"valueExample\">\n      <file name=\"index.ced81ed4.html\">\n       <script>\n          angular.module('valueExample', [])\n            .controller('ExampleController', ['$scope', function($scope) {\n              $scope.names = ['pizza', 'unicorns', 'robots'];\n              $scope.my = { favorite: 'unicorns' };\n            }]);\n       </script>\n        <form ng-controller=\"ExampleController\">\n          <h2>Which is your favorite?</h2>\n            <label ng-repeat=\"name in names\" for=\"{{name}}\">\n              {{name}}\n              <input type=\"radio\"\n                     ng-model=\"my.favorite\"\n                     ng-value=\"name\"\n                     id=\"{{name}}\"\n                     name=\"favorite\">\n            </label>\n          <div>You chose {{my.favorite}}</div>\n        </form>\n      </file>\n      <file name=\"protractor.js\" type=\"protractor\">\n        var favorite = element(by.binding('my.favorite'));\n\n        it('should initialize to model', function() {\n          expect(favorite.getText()).toContain('unicorns');\n        });\n        it('should bind the values to the inputs', function() {\n          element.all(by.model('my.favorite')).get(0).click();\n          expect(favorite.getText()).toContain('pizza');\n        });\n      </file>\n    </example>\n */\nvar ngValueDirective = function() {\n  /**\n   *  inputs use the value attribute as their default value if the value property is not set.\n   *  Once the value property has been set (by adding input), it will not react to changes to\n   *  the value attribute anymore. Setting both attribute and property fixes this behavior, and\n   *  makes it possible to use ngValue as a sort of one-way bind.\n   */\n  function updateElementValue(element, attr, value) {\n    // Support: IE9 only\n    // In IE9 values are converted to string (e.g. `input.value = null` results in `input.value === 'null'`).\n    var propValue = isDefined(value) ? value : (msie === 9) ? '' : null;\n    element.prop('value', propValue);\n    attr.$set('value', value);\n  }\n\n  return {\n    restrict: 'A',\n    priority: 100,\n    compile: function(tpl, tplAttr) {\n      if (CONSTANT_VALUE_REGEXP.test(tplAttr.ngValue)) {\n        return function ngValueConstantLink(scope, elm, attr) {\n          var value = scope.$eval(attr.ngValue);\n          updateElementValue(elm, attr, value);\n        };\n      } else {\n        return function ngValueLink(scope, elm, attr) {\n          scope.$watch(attr.ngValue, function valueWatchAction(value) {\n            updateElementValue(elm, attr, value);\n          });\n        };\n      }\n    }\n  };\n};\n\n/**\n * @ngdoc directive\n * @name ngBind\n * @restrict AC\n *\n * @description\n * The `ngBind` attribute tells Angular to replace the text content of the specified HTML element\n * with the value of a given expression, and to update the text content when the value of that\n * expression changes.\n *\n * Typically, you don't use `ngBind` directly, but instead you use the double curly markup like\n * `{{ expression }}` which is similar but less verbose.\n *\n * It is preferable to use `ngBind` instead of `{{ expression }}` if a template is momentarily\n * displayed by the browser in its raw state before Angular compiles it. Since `ngBind` is an\n * element attribute, it makes the bindings invisible to the user while the page is loading.\n *\n * An alternative solution to this problem would be using the\n * {@link ng.directive:ngCloak ngCloak} directive.\n *\n *\n * @element ANY\n * @param {expression} ngBind {@link guide/expression Expression} to evaluate.\n *\n * @example\n * Enter a name in the Live Preview text box; the greeting below the text box changes instantly.\n   <example module=\"bindExample\" name=\"ng-bind\">\n     <file name=\"index.ced81ed4.html\">\n       <script>\n         angular.module('bindExample', [])\n           .controller('ExampleController', ['$scope', function($scope) {\n             $scope.name = 'Whirled';\n           }]);\n       </script>\n       <div ng-controller=\"ExampleController\">\n         <label>Enter name: <input type=\"text\" ng-model=\"name\"></label><br>\n         Hello <span ng-bind=\"name\"></span>!\n       </div>\n     </file>\n     <file name=\"protractor.js\" type=\"protractor\">\n       it('should check ng-bind', function() {\n         var nameInput = element(by.model('name'));\n\n         expect(element(by.binding('name')).getText()).toBe('Whirled');\n         nameInput.clear();\n         nameInput.sendKeys('world');\n         expect(element(by.binding('name')).getText()).toBe('world');\n       });\n     </file>\n   </example>\n */\nvar ngBindDirective = ['$compile', function($compile) {\n  return {\n    restrict: 'AC',\n    compile: function ngBindCompile(templateElement) {\n      $compile.$$addBindingClass(templateElement);\n      return function ngBindLink(scope, element, attr) {\n        $compile.$$addBindingInfo(element, attr.ngBind);\n        element = element[0];\n        scope.$watch(attr.ngBind, function ngBindWatchAction(value) {\n          element.textContent = stringify(value);\n        });\n      };\n    }\n  };\n}];\n\n\n/**\n * @ngdoc directive\n * @name ngBindTemplate\n *\n * @description\n * The `ngBindTemplate` directive specifies that the element\n * text content should be replaced with the interpolation of the template\n * in the `ngBindTemplate` attribute.\n * Unlike `ngBind`, the `ngBindTemplate` can contain multiple `{{` `}}`\n * expressions. This directive is needed since some HTML elements\n * (such as TITLE and OPTION) cannot contain SPAN elements.\n *\n * @element ANY\n * @param {string} ngBindTemplate template of form\n *   <tt>{{</tt> <tt>expression</tt> <tt>}}</tt> to eval.\n *\n * @example\n * Try it here: enter text in text box and watch the greeting change.\n   <example module=\"bindExample\" name=\"ng-bind-template\">\n     <file name=\"index.ced81ed4.html\">\n       <script>\n         angular.module('bindExample', [])\n           .controller('ExampleController', ['$scope', function($scope) {\n             $scope.salutation = 'Hello';\n             $scope.name = 'World';\n           }]);\n       </script>\n       <div ng-controller=\"ExampleController\">\n        <label>Salutation: <input type=\"text\" ng-model=\"salutation\"></label><br>\n        <label>Name: <input type=\"text\" ng-model=\"name\"></label><br>\n        <pre ng-bind-template=\"{{salutation}} {{name}}!\"></pre>\n       </div>\n     </file>\n     <file name=\"protractor.js\" type=\"protractor\">\n       it('should check ng-bind', function() {\n         var salutationElem = element(by.binding('salutation'));\n         var salutationInput = element(by.model('salutation'));\n         var nameInput = element(by.model('name'));\n\n         expect(salutationElem.getText()).toBe('Hello World!');\n\n         salutationInput.clear();\n         salutationInput.sendKeys('Greetings');\n         nameInput.clear();\n         nameInput.sendKeys('user');\n\n         expect(salutationElem.getText()).toBe('Greetings user!');\n       });\n     </file>\n   </example>\n */\nvar ngBindTemplateDirective = ['$interpolate', '$compile', function($interpolate, $compile) {\n  return {\n    compile: function ngBindTemplateCompile(templateElement) {\n      $compile.$$addBindingClass(templateElement);\n      return function ngBindTemplateLink(scope, element, attr) {\n        var interpolateFn = $interpolate(element.attr(attr.$attr.ngBindTemplate));\n        $compile.$$addBindingInfo(element, interpolateFn.expressions);\n        element = element[0];\n        attr.$observe('ngBindTemplate', function(value) {\n          element.textContent = isUndefined(value) ? '' : value;\n        });\n      };\n    }\n  };\n}];\n\n\n/**\n * @ngdoc directive\n * @name ngBindHtml\n *\n * @description\n * Evaluates the expression and inserts the resulting HTML into the element in a secure way. By default,\n * the resulting HTML content will be sanitized using the {@link ngSanitize.$sanitize $sanitize} service.\n * To utilize this functionality, ensure that `$sanitize` is available, for example, by including {@link\n * ngSanitize} in your module's dependencies (not in core Angular). In order to use {@link ngSanitize}\n * in your module's dependencies, you need to include \"angular-sanitize.js\" in your application.\n *\n * You may also bypass sanitization for values you know are safe. To do so, bind to\n * an explicitly trusted value via {@link ng.$sce#trustAsHtml $sce.trustAsHtml}.  See the example\n * under {@link ng.$sce#show-me-an-example-using-sce- Strict Contextual Escaping (SCE)}.\n *\n * Note: If a `$sanitize` service is unavailable and the bound value isn't explicitly trusted, you\n * will have an exception (instead of an exploit.)\n *\n * @element ANY\n * @param {expression} ngBindHtml {@link guide/expression Expression} to evaluate.\n *\n * @example\n\n   <example module=\"bindHtmlExample\" deps=\"angular-sanitize.js\" name=\"ng-bind-html\">\n     <file name=\"index.ced81ed4.html\">\n       <div ng-controller=\"ExampleController\">\n        <p ng-bind-html=\"myHTML\"></p>\n       </div>\n     </file>\n\n     <file name=\"script.js\">\n       angular.module('bindHtmlExample', ['ngSanitize'])\n         .controller('ExampleController', ['$scope', function($scope) {\n           $scope.myHTML =\n              'I am an <code>HTML</code>string with ' +\n              '<a href=\"#\">links!</a> and other <em>stuff</em>';\n         }]);\n     </file>\n\n     <file name=\"protractor.js\" type=\"protractor\">\n       it('should check ng-bind-html', function() {\n         expect(element(by.binding('myHTML')).getText()).toBe(\n             'I am an HTMLstring with links! and other stuff');\n       });\n     </file>\n   </example>\n */\nvar ngBindHtmlDirective = ['$sce', '$parse', '$compile', function($sce, $parse, $compile) {\n  return {\n    restrict: 'A',\n    compile: function ngBindHtmlCompile(tElement, tAttrs) {\n      var ngBindHtmlGetter = $parse(tAttrs.ngBindHtml);\n      var ngBindHtmlWatch = $parse(tAttrs.ngBindHtml, function sceValueOf(val) {\n        // Unwrap the value to compare the actual inner safe value, not the wrapper object.\n        return $sce.valueOf(val);\n      });\n      $compile.$$addBindingClass(tElement);\n\n      return function ngBindHtmlLink(scope, element, attr) {\n        $compile.$$addBindingInfo(element, attr.ngBindHtml);\n\n        scope.$watch(ngBindHtmlWatch, function ngBindHtmlWatchAction() {\n          // The watched value is the unwrapped value. To avoid re-escaping, use the direct getter.\n          var value = ngBindHtmlGetter(scope);\n          element.html($sce.getTrustedHtml(value) || '');\n        });\n      };\n    }\n  };\n}];\n\n/**\n * @ngdoc directive\n * @name ngChange\n *\n * @description\n * Evaluate the given expression when the user changes the input.\n * The expression is evaluated immediately, unlike the JavaScript onchange event\n * which only triggers at the end of a change (usually, when the user leaves the\n * form element or presses the return key).\n *\n * The `ngChange` expression is only evaluated when a change in the input value causes\n * a new value to be committed to the model.\n *\n * It will not be evaluated:\n * * if the value returned from the `$parsers` transformation pipeline has not changed\n * * if the input has continued to be invalid since the model will stay `null`\n * * if the model is changed programmatically and not by a change to the input value\n *\n *\n * Note, this directive requires `ngModel` to be present.\n *\n * @element input\n * @param {expression} ngChange {@link guide/expression Expression} to evaluate upon change\n * in input value.\n *\n * @example\n * <example name=\"ngChange-directive\" module=\"changeExample\">\n *   <file name=\"index.ced81ed4.html\">\n *     <script>\n *       angular.module('changeExample', [])\n *         .controller('ExampleController', ['$scope', function($scope) {\n *           $scope.counter = 0;\n *           $scope.change = function() {\n *             $scope.counter++;\n *           };\n *         }]);\n *     </script>\n *     <div ng-controller=\"ExampleController\">\n *       <input type=\"checkbox\" ng-model=\"confirmed\" ng-change=\"change()\" id=\"ng-change-example1\" />\n *       <input type=\"checkbox\" ng-model=\"confirmed\" id=\"ng-change-example2\" />\n *       <label for=\"ng-change-example2\">Confirmed</label><br />\n *       <tt>debug = {{confirmed}}</tt><br/>\n *       <tt>counter = {{counter}}</tt><br/>\n *     </div>\n *   </file>\n *   <file name=\"protractor.js\" type=\"protractor\">\n *     var counter = element(by.binding('counter'));\n *     var debug = element(by.binding('confirmed'));\n *\n *     it('should evaluate the expression if changing from view', function() {\n *       expect(counter.getText()).toContain('0');\n *\n *       element(by.id('ng-change-example1')).click();\n *\n *       expect(counter.getText()).toContain('1');\n *       expect(debug.getText()).toContain('true');\n *     });\n *\n *     it('should not evaluate the expression if changing from model', function() {\n *       element(by.id('ng-change-example2')).click();\n\n *       expect(counter.getText()).toContain('0');\n *       expect(debug.getText()).toContain('true');\n *     });\n *   </file>\n * </example>\n */\nvar ngChangeDirective = valueFn({\n  restrict: 'A',\n  require: 'ngModel',\n  link: function(scope, element, attr, ctrl) {\n    ctrl.$viewChangeListeners.push(function() {\n      scope.$eval(attr.ngChange);\n    });\n  }\n});\n\n/* exported\n  ngClassDirective,\n  ngClassEvenDirective,\n  ngClassOddDirective\n*/\n\nfunction classDirective(name, selector) {\n  name = 'ngClass' + name;\n  var indexWatchExpression;\n\n  return ['$parse', function($parse) {\n    return {\n      restrict: 'AC',\n      link: function(scope, element, attr) {\n        var classCounts = element.data('$classCounts');\n        var oldModulo = true;\n        var oldClassString;\n\n        if (!classCounts) {\n          // Use createMap() to prevent class assumptions involving property\n          // names in Object.prototype\n          classCounts = createMap();\n          element.data('$classCounts', classCounts);\n        }\n\n        if (name !== 'ngClass') {\n          if (!indexWatchExpression) {\n            indexWatchExpression = $parse('$index', function moduloTwo($index) {\n              // eslint-disable-next-line no-bitwise\n              return $index & 1;\n            });\n          }\n\n          scope.$watch(indexWatchExpression, ngClassIndexWatchAction);\n        }\n\n        scope.$watch($parse(attr[name], toClassString), ngClassWatchAction);\n\n        function addClasses(classString) {\n          classString = digestClassCounts(split(classString), 1);\n          attr.$addClass(classString);\n        }\n\n        function removeClasses(classString) {\n          classString = digestClassCounts(split(classString), -1);\n          attr.$removeClass(classString);\n        }\n\n        function updateClasses(oldClassString, newClassString) {\n          var oldClassArray = split(oldClassString);\n          var newClassArray = split(newClassString);\n\n          var toRemoveArray = arrayDifference(oldClassArray, newClassArray);\n          var toAddArray = arrayDifference(newClassArray, oldClassArray);\n\n          var toRemoveString = digestClassCounts(toRemoveArray, -1);\n          var toAddString = digestClassCounts(toAddArray, 1);\n\n          attr.$addClass(toAddString);\n          attr.$removeClass(toRemoveString);\n        }\n\n        function digestClassCounts(classArray, count) {\n          var classesToUpdate = [];\n\n          forEach(classArray, function(className) {\n            if (count > 0 || classCounts[className]) {\n              classCounts[className] = (classCounts[className] || 0) + count;\n              if (classCounts[className] === +(count > 0)) {\n                classesToUpdate.push(className);\n              }\n            }\n          });\n\n          return classesToUpdate.join(' ');\n        }\n\n        function ngClassIndexWatchAction(newModulo) {\n          // This watch-action should run before the `ngClassWatchAction()`, thus it\n          // adds/removes `oldClassString`. If the `ngClass` expression has changed as well, the\n          // `ngClassWatchAction()` will update the classes.\n          if (newModulo === selector) {\n            addClasses(oldClassString);\n          } else {\n            removeClasses(oldClassString);\n          }\n\n          oldModulo = newModulo;\n        }\n\n        function ngClassWatchAction(newClassString) {\n          // When using a one-time binding the newClassString will return\n          // the pre-interceptor value until the one-time is complete\n          if (!isString(newClassString)) {\n            newClassString = toClassString(newClassString);\n          }\n\n          if (oldModulo === selector) {\n            updateClasses(oldClassString, newClassString);\n          }\n\n          oldClassString = newClassString;\n        }\n      }\n    };\n  }];\n\n  // Helpers\n  function arrayDifference(tokens1, tokens2) {\n    if (!tokens1 || !tokens1.length) return [];\n    if (!tokens2 || !tokens2.length) return tokens1;\n\n    var values = [];\n\n    outer:\n    for (var i = 0; i < tokens1.length; i++) {\n      var token = tokens1[i];\n      for (var j = 0; j < tokens2.length; j++) {\n        if (token === tokens2[j]) continue outer;\n      }\n      values.push(token);\n    }\n\n    return values;\n  }\n\n  function split(classString) {\n    return classString && classString.split(' ');\n  }\n\n  function toClassString(classValue) {\n    var classString = classValue;\n\n    if (isArray(classValue)) {\n      classString = classValue.map(toClassString).join(' ');\n    } else if (isObject(classValue)) {\n      classString = Object.keys(classValue).\n        filter(function(key) { return classValue[key]; }).\n        join(' ');\n    }\n\n    return classString;\n  }\n}\n\n/**\n * @ngdoc directive\n * @name ngClass\n * @restrict AC\n *\n * @description\n * The `ngClass` directive allows you to dynamically set CSS classes on an HTML element by databinding\n * an expression that represents all classes to be added.\n *\n * The directive operates in three different ways, depending on which of three types the expression\n * evaluates to:\n *\n * 1. If the expression evaluates to a string, the string should be one or more space-delimited class\n * names.\n *\n * 2. If the expression evaluates to an object, then for each key-value pair of the\n * object with a truthy value the corresponding key is used as a class name.\n *\n * 3. If the expression evaluates to an array, each element of the array should either be a string as in\n * type 1 or an object as in type 2. This means that you can mix strings and objects together in an array\n * to give you more control over what CSS classes appear. See the code below for an example of this.\n *\n *\n * The directive won't add duplicate classes if a particular class was already set.\n *\n * When the expression changes, the previously added classes are removed and only then are the\n * new classes added.\n *\n * @knownIssue\n * You should not use {@link guide/interpolation interpolation} in the value of the `class`\n * attribute, when using the `ngClass` directive on the same element.\n * See {@link guide/interpolation#known-issues here} for more info.\n *\n * @animations\n * | Animation                        | Occurs                              |\n * |----------------------------------|-------------------------------------|\n * | {@link ng.$animate#addClass addClass}       | just before the class is applied to the element   |\n * | {@link ng.$animate#removeClass removeClass} | just before the class is removed from the element |\n *\n * @element ANY\n * @param {expression} ngClass {@link guide/expression Expression} to eval. The result\n *   of the evaluation can be a string representing space delimited class\n *   names, an array, or a map of class names to boolean values. In the case of a map, the\n *   names of the properties whose values are truthy will be added as css classes to the\n *   element.\n *\n * @example Example that demonstrates basic bindings via ngClass directive.\n   <example name=\"ng-class\">\n     <file name=\"index.ced81ed4.html\">\n       <p ng-class=\"{strike: deleted, bold: important, 'has-error': error}\">Map Syntax Example</p>\n       <label>\n          <input type=\"checkbox\" ng-model=\"deleted\">\n          deleted (apply \"strike\" class)\n       </label><br>\n       <label>\n          <input type=\"checkbox\" ng-model=\"important\">\n          important (apply \"bold\" class)\n       </label><br>\n       <label>\n          <input type=\"checkbox\" ng-model=\"error\">\n          error (apply \"has-error\" class)\n       </label>\n       <hr>\n       <p ng-class=\"style\">Using String Syntax</p>\n       <input type=\"text\" ng-model=\"style\"\n              placeholder=\"Type: bold strike red\" aria-label=\"Type: bold strike red\">\n       <hr>\n       <p ng-class=\"[style1, style2, style3]\">Using Array Syntax</p>\n       <input ng-model=\"style1\"\n              placeholder=\"Type: bold, strike or red\" aria-label=\"Type: bold, strike or red\"><br>\n       <input ng-model=\"style2\"\n              placeholder=\"Type: bold, strike or red\" aria-label=\"Type: bold, strike or red 2\"><br>\n       <input ng-model=\"style3\"\n              placeholder=\"Type: bold, strike or red\" aria-label=\"Type: bold, strike or red 3\"><br>\n       <hr>\n       <p ng-class=\"[style4, {orange: warning}]\">Using Array and Map Syntax</p>\n       <input ng-model=\"style4\" placeholder=\"Type: bold, strike\" aria-label=\"Type: bold, strike\"><br>\n       <label><input type=\"checkbox\" ng-model=\"warning\"> warning (apply \"orange\" class)</label>\n     </file>\n     <file name=\"style.css\">\n       .strike {\n           text-decoration: line-through;\n       }\n       .bold {\n           font-weight: bold;\n       }\n       .red {\n           color: red;\n       }\n       .has-error {\n           color: red;\n           background-color: yellow;\n       }\n       .orange {\n           color: orange;\n       }\n     </file>\n     <file name=\"protractor.js\" type=\"protractor\">\n       var ps = element.all(by.css('p'));\n\n       it('should let you toggle the class', function() {\n\n         expect(ps.first().getAttribute('class')).not.toMatch(/bold/);\n         expect(ps.first().getAttribute('class')).not.toMatch(/has-error/);\n\n         element(by.model('important')).click();\n         expect(ps.first().getAttribute('class')).toMatch(/bold/);\n\n         element(by.model('error')).click();\n         expect(ps.first().getAttribute('class')).toMatch(/has-error/);\n       });\n\n       it('should let you toggle string example', function() {\n         expect(ps.get(1).getAttribute('class')).toBe('');\n         element(by.model('style')).clear();\n         element(by.model('style')).sendKeys('red');\n         expect(ps.get(1).getAttribute('class')).toBe('red');\n       });\n\n       it('array example should have 3 classes', function() {\n         expect(ps.get(2).getAttribute('class')).toBe('');\n         element(by.model('style1')).sendKeys('bold');\n         element(by.model('style2')).sendKeys('strike');\n         element(by.model('style3')).sendKeys('red');\n         expect(ps.get(2).getAttribute('class')).toBe('bold strike red');\n       });\n\n       it('array with map example should have 2 classes', function() {\n         expect(ps.last().getAttribute('class')).toBe('');\n         element(by.model('style4')).sendKeys('bold');\n         element(by.model('warning')).click();\n         expect(ps.last().getAttribute('class')).toBe('bold orange');\n       });\n     </file>\n   </example>\n\n   ## Animations\n\n   The example below demonstrates how to perform animations using ngClass.\n\n   <example module=\"ngAnimate\" deps=\"angular-animate.js\" animations=\"true\" name=\"ng-class\">\n     <file name=\"index.ced81ed4.html\">\n      <input id=\"setbtn\" type=\"button\" value=\"set\" ng-click=\"myVar='my-class'\">\n      <input id=\"clearbtn\" type=\"button\" value=\"clear\" ng-click=\"myVar=''\">\n      <br>\n      <span class=\"base-class\" ng-class=\"myVar\">Sample Text</span>\n     </file>\n     <file name=\"style.css\">\n       .base-class {\n         transition:all cubic-bezier(0.250, 0.460, 0.450, 0.940) 0.5s;\n       }\n\n       .base-class.my-class {\n         color: red;\n         font-size:3em;\n       }\n     </file>\n     <file name=\"protractor.js\" type=\"protractor\">\n       it('should check ng-class', function() {\n         expect(element(by.css('.base-class')).getAttribute('class')).not.\n           toMatch(/my-class/);\n\n         element(by.id('setbtn')).click();\n\n         expect(element(by.css('.base-class')).getAttribute('class')).\n           toMatch(/my-class/);\n\n         element(by.id('clearbtn')).click();\n\n         expect(element(by.css('.base-class')).getAttribute('class')).not.\n           toMatch(/my-class/);\n       });\n     </file>\n   </example>\n\n\n   ## ngClass and pre-existing CSS3 Transitions/Animations\n   The ngClass directive still supports CSS3 Transitions/Animations even if they do not follow the ngAnimate CSS naming structure.\n   Upon animation ngAnimate will apply supplementary CSS classes to track the start and end of an animation, but this will not hinder\n   any pre-existing CSS transitions already on the element. To get an idea of what happens during a class-based animation, be sure\n   to view the step by step details of {@link $animate#addClass $animate.addClass} and\n   {@link $animate#removeClass $animate.removeClass}.\n */\nvar ngClassDirective = classDirective('', true);\n\n/**\n * @ngdoc directive\n * @name ngClassOdd\n * @restrict AC\n *\n * @description\n * The `ngClassOdd` and `ngClassEven` directives work exactly as\n * {@link ng.directive:ngClass ngClass}, except they work in\n * conjunction with `ngRepeat` and take effect only on odd (even) rows.\n *\n * This directive can be applied only within the scope of an\n * {@link ng.directive:ngRepeat ngRepeat}.\n *\n * @element ANY\n * @param {expression} ngClassOdd {@link guide/expression Expression} to eval. The result\n *   of the evaluation can be a string representing space delimited class names or an array.\n *\n * @example\n   <example name=\"ng-class-odd\">\n     <file name=\"index.ced81ed4.html\">\n        <ol ng-init=\"names=['John', 'Mary', 'Cate', 'Suz']\">\n          <li ng-repeat=\"name in names\">\n           <span ng-class-odd=\"'odd'\" ng-class-even=\"'even'\">\n             {{name}}\n           </span>\n          </li>\n        </ol>\n     </file>\n     <file name=\"style.css\">\n       .odd {\n         color: red;\n       }\n       .even {\n         color: blue;\n       }\n     </file>\n     <file name=\"protractor.js\" type=\"protractor\">\n       it('should check ng-class-odd and ng-class-even', function() {\n         expect(element(by.repeater('name in names').row(0).column('name')).getAttribute('class')).\n           toMatch(/odd/);\n         expect(element(by.repeater('name in names').row(1).column('name')).getAttribute('class')).\n           toMatch(/even/);\n       });\n     </file>\n   </example>\n */\nvar ngClassOddDirective = classDirective('Odd', 0);\n\n/**\n * @ngdoc directive\n * @name ngClassEven\n * @restrict AC\n *\n * @description\n * The `ngClassOdd` and `ngClassEven` directives work exactly as\n * {@link ng.directive:ngClass ngClass}, except they work in\n * conjunction with `ngRepeat` and take effect only on odd (even) rows.\n *\n * This directive can be applied only within the scope of an\n * {@link ng.directive:ngRepeat ngRepeat}.\n *\n * @element ANY\n * @param {expression} ngClassEven {@link guide/expression Expression} to eval. The\n *   result of the evaluation can be a string representing space delimited class names or an array.\n *\n * @example\n   <example name=\"ng-class-even\">\n     <file name=\"index.ced81ed4.html\">\n        <ol ng-init=\"names=['John', 'Mary', 'Cate', 'Suz']\">\n          <li ng-repeat=\"name in names\">\n           <span ng-class-odd=\"'odd'\" ng-class-even=\"'even'\">\n             {{name}} &nbsp; &nbsp; &nbsp;\n           </span>\n          </li>\n        </ol>\n     </file>\n     <file name=\"style.css\">\n       .odd {\n         color: red;\n       }\n       .even {\n         color: blue;\n       }\n     </file>\n     <file name=\"protractor.js\" type=\"protractor\">\n       it('should check ng-class-odd and ng-class-even', function() {\n         expect(element(by.repeater('name in names').row(0).column('name')).getAttribute('class')).\n           toMatch(/odd/);\n         expect(element(by.repeater('name in names').row(1).column('name')).getAttribute('class')).\n           toMatch(/even/);\n       });\n     </file>\n   </example>\n */\nvar ngClassEvenDirective = classDirective('Even', 1);\n\n/**\n * @ngdoc directive\n * @name ngCloak\n * @restrict AC\n *\n * @description\n * The `ngCloak` directive is used to prevent the Angular html template from being briefly\n * displayed by the browser in its raw (uncompiled) form while your application is loading. Use this\n * directive to avoid the undesirable flicker effect caused by the html template display.\n *\n * The directive can be applied to the `<body>` element, but the preferred usage is to apply\n * multiple `ngCloak` directives to small portions of the page to permit progressive rendering\n * of the browser view.\n *\n * `ngCloak` works in cooperation with the following css rule embedded within `angular.js` and\n * `angular.min.js`.\n * For CSP mode please add `angular-csp.css` to your html file (see {@link ng.directive:ngCsp ngCsp}).\n *\n * ```css\n * [ng\\:cloak], [ng-cloak], [data-ng-cloak], [x-ng-cloak], .ng-cloak, .x-ng-cloak {\n *   display: none !important;\n * }\n * ```\n *\n * When this css rule is loaded by the browser, all html elements (including their children) that\n * are tagged with the `ngCloak` directive are hidden. When Angular encounters this directive\n * during the compilation of the template it deletes the `ngCloak` element attribute, making\n * the compiled element visible.\n *\n * For the best result, the `angular.js` script must be loaded in the head section of the html\n * document; alternatively, the css rule above must be included in the external stylesheet of the\n * application.\n *\n * @element ANY\n *\n * @example\n   <example name=\"ng-cloak\">\n     <file name=\"index.ced81ed4.html\">\n        <div id=\"template1\" ng-cloak>{{ 'hello' }}</div>\n        <div id=\"template2\" class=\"ng-cloak\">{{ 'world' }}</div>\n     </file>\n     <file name=\"protractor.js\" type=\"protractor\">\n       it('should remove the template directive and css class', function() {\n         expect($('#template1').getAttribute('ng-cloak')).\n           toBeNull();\n         expect($('#template2').getAttribute('ng-cloak')).\n           toBeNull();\n       });\n     </file>\n   </example>\n *\n */\nvar ngCloakDirective = ngDirective({\n  compile: function(element, attr) {\n    attr.$set('ngCloak', undefined);\n    element.removeClass('ng-cloak');\n  }\n});\n\n/**\n * @ngdoc directive\n * @name ngController\n *\n * @description\n * The `ngController` directive attaches a controller class to the view. This is a key aspect of how angular\n * supports the principles behind the Model-View-Controller design pattern.\n *\n * MVC components in angular:\n *\n * * Model — Models are the properties of a scope; scopes are attached to the DOM where scope properties\n *   are accessed through bindings.\n * * View — The template (HTML with data bindings) that is rendered into the View.\n * * Controller — The `ngController` directive specifies a Controller class; the class contains business\n *   logic behind the application to decorate the scope with functions and values\n *\n * Note that you can also attach controllers to the DOM by declaring it in a route definition\n * via the {@link ngRoute.$route $route} service. A common mistake is to declare the controller\n * again using `ng-controller` in the template itself.  This will cause the controller to be attached\n * and executed twice.\n *\n * @element ANY\n * @scope\n * @priority 500\n * @param {expression} ngController Name of a constructor function registered with the current\n * {@link ng.$controllerProvider $controllerProvider} or an {@link guide/expression expression}\n * that on the current scope evaluates to a constructor function.\n *\n * The controller instance can be published into a scope property by specifying\n * `ng-controller=\"as propertyName\"`.\n *\n * If the current `$controllerProvider` is configured to use globals (via\n * {@link ng.$controllerProvider#allowGlobals `$controllerProvider.allowGlobals()` }), this may\n * also be the name of a globally accessible constructor function (deprecated, not recommended).\n *\n * @example\n * Here is a simple form for editing user contact information. Adding, removing, clearing, and\n * greeting are methods declared on the controller (see source tab). These methods can\n * easily be called from the angular markup. Any changes to the data are automatically reflected\n * in the View without the need for a manual update.\n *\n * Two different declaration styles are included below:\n *\n * * one binds methods and properties directly onto the controller using `this`:\n * `ng-controller=\"SettingsController1 as settings\"`\n * * one injects `$scope` into the controller:\n * `ng-controller=\"SettingsController2\"`\n *\n * The second option is more common in the Angular community, and is generally used in boilerplates\n * and in this guide. However, there are advantages to binding properties directly to the controller\n * and avoiding scope.\n *\n * * Using `controller as` makes it obvious which controller you are accessing in the template when\n * multiple controllers apply to an element.\n * * If you are writing your controllers as classes you have easier access to the properties and\n * methods, which will appear on the scope, from inside the controller code.\n * * Since there is always a `.` in the bindings, you don't have to worry about prototypal\n * inheritance masking primitives.\n *\n * This example demonstrates the `controller as` syntax.\n *\n * <example name=\"ngControllerAs\" module=\"controllerAsExample\">\n *   <file name=\"index.ced81ed4.html\">\n *    <div id=\"ctrl-as-exmpl\" ng-controller=\"SettingsController1 as settings\">\n *      <label>Name: <input type=\"text\" ng-model=\"settings.name\"/></label>\n *      <button ng-click=\"settings.greet()\">greet</button><br/>\n *      Contact:\n *      <ul>\n *        <li ng-repeat=\"contact in settings.contacts\">\n *          <select ng-model=\"contact.type\" aria-label=\"Contact method\" id=\"select_{{$index}}\">\n *             <option>phone</option>\n *             <option>email</option>\n *          </select>\n *          <input type=\"text\" ng-model=\"contact.value\" aria-labelledby=\"select_{{$index}}\" />\n *          <button ng-click=\"settings.clearContact(contact)\">clear</button>\n *          <button ng-click=\"settings.removeContact(contact)\" aria-label=\"Remove\">X</button>\n *        </li>\n *        <li><button ng-click=\"settings.addContact()\">add</button></li>\n *     </ul>\n *    </div>\n *   </file>\n *   <file name=\"app.js\">\n *    angular.module('controllerAsExample', [])\n *      .controller('SettingsController1', SettingsController1);\n *\n *    function SettingsController1() {\n *      this.name = 'John Smith';\n *      this.contacts = [\n *        {type: 'phone', value: '408 555 1212'},\n *        {type: 'email', value: 'john.smith@example.org'}\n *      ];\n *    }\n *\n *    SettingsController1.prototype.greet = function() {\n *      alert(this.name);\n *    };\n *\n *    SettingsController1.prototype.addContact = function() {\n *      this.contacts.push({type: 'email', value: 'yourname@example.org'});\n *    };\n *\n *    SettingsController1.prototype.removeContact = function(contactToRemove) {\n *     var index = this.contacts.indexOf(contactToRemove);\n *      this.contacts.splice(index, 1);\n *    };\n *\n *    SettingsController1.prototype.clearContact = function(contact) {\n *      contact.type = 'phone';\n *      contact.value = '';\n *    };\n *   </file>\n *   <file name=\"protractor.js\" type=\"protractor\">\n *     it('should check controller as', function() {\n *       var container = element(by.id('ctrl-as-exmpl'));\n *         expect(container.element(by.model('settings.name'))\n *           .getAttribute('value')).toBe('John Smith');\n *\n *       var firstRepeat =\n *           container.element(by.repeater('contact in settings.contacts').row(0));\n *       var secondRepeat =\n *           container.element(by.repeater('contact in settings.contacts').row(1));\n *\n *       expect(firstRepeat.element(by.model('contact.value')).getAttribute('value'))\n *           .toBe('408 555 1212');\n *\n *       expect(secondRepeat.element(by.model('contact.value')).getAttribute('value'))\n *           .toBe('john.smith@example.org');\n *\n *       firstRepeat.element(by.buttonText('clear')).click();\n *\n *       expect(firstRepeat.element(by.model('contact.value')).getAttribute('value'))\n *           .toBe('');\n *\n *       container.element(by.buttonText('add')).click();\n *\n *       expect(container.element(by.repeater('contact in settings.contacts').row(2))\n *           .element(by.model('contact.value'))\n *           .getAttribute('value'))\n *           .toBe('yourname@example.org');\n *     });\n *   </file>\n * </example>\n *\n * This example demonstrates the \"attach to `$scope`\" style of controller.\n *\n * <example name=\"ngController\" module=\"controllerExample\">\n *  <file name=\"index.ced81ed4.html\">\n *   <div id=\"ctrl-exmpl\" ng-controller=\"SettingsController2\">\n *     <label>Name: <input type=\"text\" ng-model=\"name\"/></label>\n *     <button ng-click=\"greet()\">greet</button><br/>\n *     Contact:\n *     <ul>\n *       <li ng-repeat=\"contact in contacts\">\n *         <select ng-model=\"contact.type\" id=\"select_{{$index}}\">\n *            <option>phone</option>\n *            <option>email</option>\n *         </select>\n *         <input type=\"text\" ng-model=\"contact.value\" aria-labelledby=\"select_{{$index}}\" />\n *         <button ng-click=\"clearContact(contact)\">clear</button>\n *         <button ng-click=\"removeContact(contact)\">X</button>\n *       </li>\n *       <li>[ <button ng-click=\"addContact()\">add</button> ]</li>\n *    </ul>\n *   </div>\n *  </file>\n *  <file name=\"app.js\">\n *   angular.module('controllerExample', [])\n *     .controller('SettingsController2', ['$scope', SettingsController2]);\n *\n *   function SettingsController2($scope) {\n *     $scope.name = 'John Smith';\n *     $scope.contacts = [\n *       {type:'phone', value:'408 555 1212'},\n *       {type:'email', value:'john.smith@example.org'}\n *     ];\n *\n *     $scope.greet = function() {\n *       alert($scope.name);\n *     };\n *\n *     $scope.addContact = function() {\n *       $scope.contacts.push({type:'email', value:'yourname@example.org'});\n *     };\n *\n *     $scope.removeContact = function(contactToRemove) {\n *       var index = $scope.contacts.indexOf(contactToRemove);\n *       $scope.contacts.splice(index, 1);\n *     };\n *\n *     $scope.clearContact = function(contact) {\n *       contact.type = 'phone';\n *       contact.value = '';\n *     };\n *   }\n *  </file>\n *  <file name=\"protractor.js\" type=\"protractor\">\n *    it('should check controller', function() {\n *      var container = element(by.id('ctrl-exmpl'));\n *\n *      expect(container.element(by.model('name'))\n *          .getAttribute('value')).toBe('John Smith');\n *\n *      var firstRepeat =\n *          container.element(by.repeater('contact in contacts').row(0));\n *      var secondRepeat =\n *          container.element(by.repeater('contact in contacts').row(1));\n *\n *      expect(firstRepeat.element(by.model('contact.value')).getAttribute('value'))\n *          .toBe('408 555 1212');\n *      expect(secondRepeat.element(by.model('contact.value')).getAttribute('value'))\n *          .toBe('john.smith@example.org');\n *\n *      firstRepeat.element(by.buttonText('clear')).click();\n *\n *      expect(firstRepeat.element(by.model('contact.value')).getAttribute('value'))\n *          .toBe('');\n *\n *      container.element(by.buttonText('add')).click();\n *\n *      expect(container.element(by.repeater('contact in contacts').row(2))\n *          .element(by.model('contact.value'))\n *          .getAttribute('value'))\n *          .toBe('yourname@example.org');\n *    });\n *  </file>\n *</example>\n\n */\nvar ngControllerDirective = [function() {\n  return {\n    restrict: 'A',\n    scope: true,\n    controller: '@',\n    priority: 500\n  };\n}];\n\n/**\n * @ngdoc directive\n * @name ngCsp\n *\n * @restrict A\n * @element ANY\n * @description\n *\n * Angular has some features that can conflict with certain restrictions that are applied when using\n * [CSP (Content Security Policy)](https://developer.mozilla.org/en/Security/CSP) rules.\n *\n * If you intend to implement CSP with these rules then you must tell Angular not to use these\n * features.\n *\n * This is necessary when developing things like Google Chrome Extensions or Universal Windows Apps.\n *\n *\n * The following default rules in CSP affect Angular:\n *\n * * The use of `eval()`, `Function(string)` and similar functions to dynamically create and execute\n * code from strings is forbidden. Angular makes use of this in the {@link $parse} service to\n * provide a 30% increase in the speed of evaluating Angular expressions. (This CSP rule can be\n * disabled with the CSP keyword `unsafe-eval`, but it is generally not recommended as it would\n * weaken the protections offered by CSP.)\n *\n * * The use of inline resources, such as inline `<script>` and `<style>` elements, are forbidden.\n * This prevents apps from injecting custom styles directly into the document. Angular makes use of\n * this to include some CSS rules (e.g. {@link ngCloak} and {@link ngHide}). To make these\n * directives work when a CSP rule is blocking inline styles, you must link to the `angular-csp.css`\n * in your HTML manually. (This CSP rule can be disabled with the CSP keyword `unsafe-inline`, but\n * it is generally not recommended as it would weaken the protections offered by CSP.)\n *\n * If you do not provide `ngCsp` then Angular tries to autodetect if CSP is blocking dynamic code\n * creation from strings (e.g., `unsafe-eval` not specified in CSP header) and automatically\n * deactivates this feature in the {@link $parse} service. This autodetection, however, triggers a\n * CSP error to be logged in the console:\n *\n * ```\n * Refused to evaluate a string as JavaScript because 'unsafe-eval' is not an allowed source of\n * script in the following Content Security Policy directive: \"default-src 'self'\". Note that\n * 'script-src' was not explicitly set, so 'default-src' is used as a fallback.\n * ```\n *\n * This error is harmless but annoying. To prevent the error from showing up, put the `ngCsp`\n * directive on an element of the HTML document that appears before the `<script>` tag that loads\n * the `angular.js` file.\n *\n * *Note: This directive is only available in the `ng-csp` and `data-ng-csp` attribute form.*\n *\n * You can specify which of the CSP related Angular features should be deactivated by providing\n * a value for the `ng-csp` attribute. The options are as follows:\n *\n * * no-inline-style: this stops Angular from injecting CSS styles into the DOM\n *\n * * no-unsafe-eval: this stops Angular from optimizing $parse with unsafe eval of strings\n *\n * You can use these values in the following combinations:\n *\n *\n * * No declaration means that Angular will assume that you can do inline styles, but it will do\n * a runtime check for unsafe-eval. E.g. `<body>`. This is backwardly compatible with previous\n * versions of Angular.\n *\n * * A simple `ng-csp` (or `data-ng-csp`) attribute will tell Angular to deactivate both inline\n * styles and unsafe eval. E.g. `<body ng-csp>`. This is backwardly compatible with previous\n * versions of Angular.\n *\n * * Specifying only `no-unsafe-eval` tells Angular that we must not use eval, but that we can\n * inject inline styles. E.g. `<body ng-csp=\"no-unsafe-eval\">`.\n *\n * * Specifying only `no-inline-style` tells Angular that we must not inject styles, but that we can\n * run eval - no automatic check for unsafe eval will occur. E.g. `<body ng-csp=\"no-inline-style\">`\n *\n * * Specifying both `no-unsafe-eval` and `no-inline-style` tells Angular that we must not inject\n * styles nor use eval, which is the same as an empty: ng-csp.\n * E.g.`<body ng-csp=\"no-inline-style;no-unsafe-eval\">`\n *\n * @example\n * This example shows how to apply the `ngCsp` directive to the `html` tag.\n   ```html\n     <!doctype html>\n     <html ng-app ng-csp>\n     ...\n     ...\n     </html>\n   ```\n  * @example\n      <!-- Note: the `.csp` suffix in the example name triggers CSP mode in our http server! -->\n      <example name=\"example.csp\" module=\"cspExample\" ng-csp=\"true\">\n        <file name=\"index.ced81ed4.html\">\n          <div ng-controller=\"MainController as ctrl\">\n            <div>\n              <button ng-click=\"ctrl.inc()\" id=\"inc\">Increment</button>\n              <span id=\"counter\">\n                {{ctrl.counter}}\n              </span>\n            </div>\n\n            <div>\n              <button ng-click=\"ctrl.evil()\" id=\"evil\">Evil</button>\n              <span id=\"evilError\">\n                {{ctrl.evilError}}\n              </span>\n            </div>\n          </div>\n        </file>\n        <file name=\"script.js\">\n           angular.module('cspExample', [])\n             .controller('MainController', function MainController() {\n                this.counter = 0;\n                this.inc = function() {\n                  this.counter++;\n                };\n                this.evil = function() {\n                  try {\n                    eval('1+2'); // eslint-disable-line no-eval\n                  } catch (e) {\n                    this.evilError = e.message;\n                  }\n                };\n              });\n        </file>\n        <file name=\"protractor.js\" type=\"protractor\">\n          var util, webdriver;\n\n          var incBtn = element(by.id('inc'));\n          var counter = element(by.id('counter'));\n          var evilBtn = element(by.id('evil'));\n          var evilError = element(by.id('evilError'));\n\n          function getAndClearSevereErrors() {\n            return browser.manage().logs().get('browser').then(function(browserLog) {\n              return browserLog.filter(function(logEntry) {\n                return logEntry.level.value > webdriver.logging.Level.WARNING.value;\n              });\n            });\n          }\n\n          function clearErrors() {\n            getAndClearSevereErrors();\n          }\n\n          function expectNoErrors() {\n            getAndClearSevereErrors().then(function(filteredLog) {\n              expect(filteredLog.length).toEqual(0);\n              if (filteredLog.length) {\n                console.log('browser console errors: ' + util.inspect(filteredLog));\n              }\n            });\n          }\n\n          function expectError(regex) {\n            getAndClearSevereErrors().then(function(filteredLog) {\n              var found = false;\n              filteredLog.forEach(function(log) {\n                if (log.message.match(regex)) {\n                  found = true;\n                }\n              });\n              if (!found) {\n                throw new Error('expected an error that matches ' + regex);\n              }\n            });\n          }\n\n          beforeEach(function() {\n            util = require('util');\n            webdriver = require('selenium-webdriver');\n          });\n\n          // For now, we only test on Chrome,\n          // as Safari does not load the page with Protractor's injected scripts,\n          // and Firefox webdriver always disables content security policy (#6358)\n          if (browser.params.browser !== 'chrome') {\n            return;\n          }\n\n          it('should not report errors when the page is loaded', function() {\n            // clear errors so we are not dependent on previous tests\n            clearErrors();\n            // Need to reload the page as the page is already loaded when\n            // we come here\n            browser.driver.getCurrentUrl().then(function(url) {\n              browser.get(url);\n            });\n            expectNoErrors();\n          });\n\n          it('should evaluate expressions', function() {\n            expect(counter.getText()).toEqual('0');\n            incBtn.click();\n            expect(counter.getText()).toEqual('1');\n            expectNoErrors();\n          });\n\n          it('should throw and report an error when using \"eval\"', function() {\n            evilBtn.click();\n            expect(evilError.getText()).toMatch(/Content Security Policy/);\n            expectError(/Content Security Policy/);\n          });\n        </file>\n      </example>\n  */\n\n// `ngCsp` is not implemented as a proper directive any more, because we need it be processed while\n// we bootstrap the app (before `$parse` is instantiated). For this reason, we just have the `csp()`\n// fn that looks for the `ng-csp` attribute anywhere in the current doc.\n\n/**\n * @ngdoc directive\n * @name ngClick\n *\n * @description\n * The ngClick directive allows you to specify custom behavior when\n * an element is clicked.\n *\n * @element ANY\n * @priority 0\n * @param {expression} ngClick {@link guide/expression Expression} to evaluate upon\n * click. ({@link guide/expression#-event- Event object is available as `$event`})\n *\n * @example\n   <example name=\"ng-click\">\n     <file name=\"index.ced81ed4.html\">\n      <button ng-click=\"count = count + 1\" ng-init=\"count=0\">\n        Increment\n      </button>\n      <span>\n        count: {{count}}\n      </span>\n     </file>\n     <file name=\"protractor.js\" type=\"protractor\">\n       it('should check ng-click', function() {\n         expect(element(by.binding('count')).getText()).toMatch('0');\n         element(by.css('button')).click();\n         expect(element(by.binding('count')).getText()).toMatch('1');\n       });\n     </file>\n   </example>\n */\n/*\n * A collection of directives that allows creation of custom event handlers that are defined as\n * angular expressions and are compiled and executed within the current scope.\n */\nvar ngEventDirectives = {};\n\n// For events that might fire synchronously during DOM manipulation\n// we need to execute their event handlers asynchronously using $evalAsync,\n// so that they are not executed in an inconsistent state.\nvar forceAsyncEvents = {\n  'blur': true,\n  'focus': true\n};\nforEach(\n  'click dblclick mousedown mouseup mouseover mouseout mousemove mouseenter mouseleave keydown keyup keypress submit focus blur copy cut paste'.split(' '),\n  function(eventName) {\n    var directiveName = directiveNormalize('ng-' + eventName);\n    ngEventDirectives[directiveName] = ['$parse', '$rootScope', function($parse, $rootScope) {\n      return {\n        restrict: 'A',\n        compile: function($element, attr) {\n          // NOTE:\n          // We expose the powerful `$event` object on the scope that provides access to the Window,\n          // etc. This is OK, because expressions are not sandboxed any more (and the expression\n          // sandbox was never meant to be a security feature anyway).\n          var fn = $parse(attr[directiveName]);\n          return function ngEventHandler(scope, element) {\n            element.on(eventName, function(event) {\n              var callback = function() {\n                fn(scope, {$event: event});\n              };\n              if (forceAsyncEvents[eventName] && $rootScope.$$phase) {\n                scope.$evalAsync(callback);\n              } else {\n                scope.$apply(callback);\n              }\n            });\n          };\n        }\n      };\n    }];\n  }\n);\n\n/**\n * @ngdoc directive\n * @name ngDblclick\n *\n * @description\n * The `ngDblclick` directive allows you to specify custom behavior on a dblclick event.\n *\n * @element ANY\n * @priority 0\n * @param {expression} ngDblclick {@link guide/expression Expression} to evaluate upon\n * a dblclick. (The Event object is available as `$event`)\n *\n * @example\n   <example name=\"ng-dblclick\">\n     <file name=\"index.ced81ed4.html\">\n      <button ng-dblclick=\"count = count + 1\" ng-init=\"count=0\">\n        Increment (on double click)\n      </button>\n      count: {{count}}\n     </file>\n   </example>\n */\n\n\n/**\n * @ngdoc directive\n * @name ngMousedown\n *\n * @description\n * The ngMousedown directive allows you to specify custom behavior on mousedown event.\n *\n * @element ANY\n * @priority 0\n * @param {expression} ngMousedown {@link guide/expression Expression} to evaluate upon\n * mousedown. ({@link guide/expression#-event- Event object is available as `$event`})\n *\n * @example\n   <example name=\"ng-mousedown\">\n     <file name=\"index.ced81ed4.html\">\n      <button ng-mousedown=\"count = count + 1\" ng-init=\"count=0\">\n        Increment (on mouse down)\n      </button>\n      count: {{count}}\n     </file>\n   </example>\n */\n\n\n/**\n * @ngdoc directive\n * @name ngMouseup\n *\n * @description\n * Specify custom behavior on mouseup event.\n *\n * @element ANY\n * @priority 0\n * @param {expression} ngMouseup {@link guide/expression Expression} to evaluate upon\n * mouseup. ({@link guide/expression#-event- Event object is available as `$event`})\n *\n * @example\n   <example name=\"ng-mouseup\">\n     <file name=\"index.ced81ed4.html\">\n      <button ng-mouseup=\"count = count + 1\" ng-init=\"count=0\">\n        Increment (on mouse up)\n      </button>\n      count: {{count}}\n     </file>\n   </example>\n */\n\n/**\n * @ngdoc directive\n * @name ngMouseover\n *\n * @description\n * Specify custom behavior on mouseover event.\n *\n * @element ANY\n * @priority 0\n * @param {expression} ngMouseover {@link guide/expression Expression} to evaluate upon\n * mouseover. ({@link guide/expression#-event- Event object is available as `$event`})\n *\n * @example\n   <example name=\"ng-mouseover\">\n     <file name=\"index.ced81ed4.html\">\n      <button ng-mouseover=\"count = count + 1\" ng-init=\"count=0\">\n        Increment (when mouse is over)\n      </button>\n      count: {{count}}\n     </file>\n   </example>\n */\n\n\n/**\n * @ngdoc directive\n * @name ngMouseenter\n *\n * @description\n * Specify custom behavior on mouseenter event.\n *\n * @element ANY\n * @priority 0\n * @param {expression} ngMouseenter {@link guide/expression Expression} to evaluate upon\n * mouseenter. ({@link guide/expression#-event- Event object is available as `$event`})\n *\n * @example\n   <example name=\"ng-mouseenter\">\n     <file name=\"index.ced81ed4.html\">\n      <button ng-mouseenter=\"count = count + 1\" ng-init=\"count=0\">\n        Increment (when mouse enters)\n      </button>\n      count: {{count}}\n     </file>\n   </example>\n */\n\n\n/**\n * @ngdoc directive\n * @name ngMouseleave\n *\n * @description\n * Specify custom behavior on mouseleave event.\n *\n * @element ANY\n * @priority 0\n * @param {expression} ngMouseleave {@link guide/expression Expression} to evaluate upon\n * mouseleave. ({@link guide/expression#-event- Event object is available as `$event`})\n *\n * @example\n   <example name=\"ng-mouseleave\">\n     <file name=\"index.ced81ed4.html\">\n      <button ng-mouseleave=\"count = count + 1\" ng-init=\"count=0\">\n        Increment (when mouse leaves)\n      </button>\n      count: {{count}}\n     </file>\n   </example>\n */\n\n\n/**\n * @ngdoc directive\n * @name ngMousemove\n *\n * @description\n * Specify custom behavior on mousemove event.\n *\n * @element ANY\n * @priority 0\n * @param {expression} ngMousemove {@link guide/expression Expression} to evaluate upon\n * mousemove. ({@link guide/expression#-event- Event object is available as `$event`})\n *\n * @example\n   <example name=\"ng-mousemove\">\n     <file name=\"index.ced81ed4.html\">\n      <button ng-mousemove=\"count = count + 1\" ng-init=\"count=0\">\n        Increment (when mouse moves)\n      </button>\n      count: {{count}}\n     </file>\n   </example>\n */\n\n\n/**\n * @ngdoc directive\n * @name ngKeydown\n *\n * @description\n * Specify custom behavior on keydown event.\n *\n * @element ANY\n * @priority 0\n * @param {expression} ngKeydown {@link guide/expression Expression} to evaluate upon\n * keydown. (Event object is available as `$event` and can be interrogated for keyCode, altKey, etc.)\n *\n * @example\n   <example name=\"ng-keydown\">\n     <file name=\"index.ced81ed4.html\">\n      <input ng-keydown=\"count = count + 1\" ng-init=\"count=0\">\n      key down count: {{count}}\n     </file>\n   </example>\n */\n\n\n/**\n * @ngdoc directive\n * @name ngKeyup\n *\n * @description\n * Specify custom behavior on keyup event.\n *\n * @element ANY\n * @priority 0\n * @param {expression} ngKeyup {@link guide/expression Expression} to evaluate upon\n * keyup. (Event object is available as `$event` and can be interrogated for keyCode, altKey, etc.)\n *\n * @example\n   <example name=\"ng-keyup\">\n     <file name=\"index.ced81ed4.html\">\n       <p>Typing in the input box below updates the key count</p>\n       <input ng-keyup=\"count = count + 1\" ng-init=\"count=0\"> key up count: {{count}}\n\n       <p>Typing in the input box below updates the keycode</p>\n       <input ng-keyup=\"event=$event\">\n       <p>event keyCode: {{ event.keyCode }}</p>\n       <p>event altKey: {{ event.altKey }}</p>\n     </file>\n   </example>\n */\n\n\n/**\n * @ngdoc directive\n * @name ngKeypress\n *\n * @description\n * Specify custom behavior on keypress event.\n *\n * @element ANY\n * @param {expression} ngKeypress {@link guide/expression Expression} to evaluate upon\n * keypress. ({@link guide/expression#-event- Event object is available as `$event`}\n * and can be interrogated for keyCode, altKey, etc.)\n *\n * @example\n   <example name=\"ng-keypress\">\n     <file name=\"index.ced81ed4.html\">\n      <input ng-keypress=\"count = count + 1\" ng-init=\"count=0\">\n      key press count: {{count}}\n     </file>\n   </example>\n */\n\n\n/**\n * @ngdoc directive\n * @name ngSubmit\n *\n * @description\n * Enables binding angular expressions to onsubmit events.\n *\n * Additionally it prevents the default action (which for form means sending the request to the\n * server and reloading the current page), but only if the form does not contain `action`,\n * `data-action`, or `x-action` attributes.\n *\n * <div class=\"alert alert-warning\">\n * **Warning:** Be careful not to cause \"double-submission\" by using both the `ngClick` and\n * `ngSubmit` handlers together. See the\n * {@link form#submitting-a-form-and-preventing-the-default-action `form` directive documentation}\n * for a detailed discussion of when `ngSubmit` may be triggered.\n * </div>\n *\n * @element form\n * @priority 0\n * @param {expression} ngSubmit {@link guide/expression Expression} to eval.\n * ({@link guide/expression#-event- Event object is available as `$event`})\n *\n * @example\n   <example module=\"submitExample\" name=\"ng-submit\">\n     <file name=\"index.ced81ed4.html\">\n      <script>\n        angular.module('submitExample', [])\n          .controller('ExampleController', ['$scope', function($scope) {\n            $scope.list = [];\n            $scope.text = 'hello';\n            $scope.submit = function() {\n              if ($scope.text) {\n                $scope.list.push(this.text);\n                $scope.text = '';\n              }\n            };\n          }]);\n      </script>\n      <form ng-submit=\"submit()\" ng-controller=\"ExampleController\">\n        Enter text and hit enter:\n        <input type=\"text\" ng-model=\"text\" name=\"text\" />\n        <input type=\"submit\" id=\"submit\" value=\"Submit\" />\n        <pre>list={{list}}</pre>\n      </form>\n     </file>\n     <file name=\"protractor.js\" type=\"protractor\">\n       it('should check ng-submit', function() {\n         expect(element(by.binding('list')).getText()).toBe('list=[]');\n         element(by.css('#submit')).click();\n         expect(element(by.binding('list')).getText()).toContain('hello');\n         expect(element(by.model('text')).getAttribute('value')).toBe('');\n       });\n       it('should ignore empty strings', function() {\n         expect(element(by.binding('list')).getText()).toBe('list=[]');\n         element(by.css('#submit')).click();\n         element(by.css('#submit')).click();\n         expect(element(by.binding('list')).getText()).toContain('hello');\n        });\n     </file>\n   </example>\n */\n\n/**\n * @ngdoc directive\n * @name ngFocus\n *\n * @description\n * Specify custom behavior on focus event.\n *\n * Note: As the `focus` event is executed synchronously when calling `input.focus()`\n * AngularJS executes the expression using `scope.$evalAsync` if the event is fired\n * during an `$apply` to ensure a consistent state.\n *\n * @element window, input, select, textarea, a\n * @priority 0\n * @param {expression} ngFocus {@link guide/expression Expression} to evaluate upon\n * focus. ({@link guide/expression#-event- Event object is available as `$event`})\n *\n * @example\n * See {@link ng.directive:ngClick ngClick}\n */\n\n/**\n * @ngdoc directive\n * @name ngBlur\n *\n * @description\n * Specify custom behavior on blur event.\n *\n * A [blur event](https://developer.mozilla.org/en-US/docs/Web/Events/blur) fires when\n * an element has lost focus.\n *\n * Note: As the `blur` event is executed synchronously also during DOM manipulations\n * (e.g. removing a focussed input),\n * AngularJS executes the expression using `scope.$evalAsync` if the event is fired\n * during an `$apply` to ensure a consistent state.\n *\n * @element window, input, select, textarea, a\n * @priority 0\n * @param {expression} ngBlur {@link guide/expression Expression} to evaluate upon\n * blur. ({@link guide/expression#-event- Event object is available as `$event`})\n *\n * @example\n * See {@link ng.directive:ngClick ngClick}\n */\n\n/**\n * @ngdoc directive\n * @name ngCopy\n *\n * @description\n * Specify custom behavior on copy event.\n *\n * @element window, input, select, textarea, a\n * @priority 0\n * @param {expression} ngCopy {@link guide/expression Expression} to evaluate upon\n * copy. ({@link guide/expression#-event- Event object is available as `$event`})\n *\n * @example\n   <example name=\"ng-copy\">\n     <file name=\"index.ced81ed4.html\">\n      <input ng-copy=\"copied=true\" ng-init=\"copied=false; value='copy me'\" ng-model=\"value\">\n      copied: {{copied}}\n     </file>\n   </example>\n */\n\n/**\n * @ngdoc directive\n * @name ngCut\n *\n * @description\n * Specify custom behavior on cut event.\n *\n * @element window, input, select, textarea, a\n * @priority 0\n * @param {expression} ngCut {@link guide/expression Expression} to evaluate upon\n * cut. ({@link guide/expression#-event- Event object is available as `$event`})\n *\n * @example\n   <example name=\"ng-cut\">\n     <file name=\"index.ced81ed4.html\">\n      <input ng-cut=\"cut=true\" ng-init=\"cut=false; value='cut me'\" ng-model=\"value\">\n      cut: {{cut}}\n     </file>\n   </example>\n */\n\n/**\n * @ngdoc directive\n * @name ngPaste\n *\n * @description\n * Specify custom behavior on paste event.\n *\n * @element window, input, select, textarea, a\n * @priority 0\n * @param {expression} ngPaste {@link guide/expression Expression} to evaluate upon\n * paste. ({@link guide/expression#-event- Event object is available as `$event`})\n *\n * @example\n   <example name=\"ng-paste\">\n     <file name=\"index.ced81ed4.html\">\n      <input ng-paste=\"paste=true\" ng-init=\"paste=false\" placeholder='paste here'>\n      pasted: {{paste}}\n     </file>\n   </example>\n */\n\n/**\n * @ngdoc directive\n * @name ngIf\n * @restrict A\n * @multiElement\n *\n * @description\n * The `ngIf` directive removes or recreates a portion of the DOM tree based on an\n * {expression}. If the expression assigned to `ngIf` evaluates to a false\n * value then the element is removed from the DOM, otherwise a clone of the\n * element is reinserted into the DOM.\n *\n * `ngIf` differs from `ngShow` and `ngHide` in that `ngIf` completely removes and recreates the\n * element in the DOM rather than changing its visibility via the `display` css property.  A common\n * case when this difference is significant is when using css selectors that rely on an element's\n * position within the DOM, such as the `:first-child` or `:last-child` pseudo-classes.\n *\n * Note that when an element is removed using `ngIf` its scope is destroyed and a new scope\n * is created when the element is restored.  The scope created within `ngIf` inherits from\n * its parent scope using\n * [prototypal inheritance](https://github.com/angular/angular.js/wiki/Understanding-Scopes#javascript-prototypal-inheritance).\n * An important implication of this is if `ngModel` is used within `ngIf` to bind to\n * a javascript primitive defined in the parent scope. In this case any modifications made to the\n * variable within the child scope will override (hide) the value in the parent scope.\n *\n * Also, `ngIf` recreates elements using their compiled state. An example of this behavior\n * is if an element's class attribute is directly modified after it's compiled, using something like\n * jQuery's `.addClass()` method, and the element is later removed. When `ngIf` recreates the element\n * the added class will be lost because the original compiled state is used to regenerate the element.\n *\n * Additionally, you can provide animations via the `ngAnimate` module to animate the `enter`\n * and `leave` effects.\n *\n * @animations\n * | Animation                        | Occurs                               |\n * |----------------------------------|-------------------------------------|\n * | {@link ng.$animate#enter enter}  | just after the `ngIf` contents change and a new DOM element is created and injected into the `ngIf` container |\n * | {@link ng.$animate#leave leave}  | just before the `ngIf` contents are removed from the DOM |\n *\n * @element ANY\n * @scope\n * @priority 600\n * @param {expression} ngIf If the {@link guide/expression expression} is falsy then\n *     the element is removed from the DOM tree. If it is truthy a copy of the compiled\n *     element is added to the DOM tree.\n *\n * @example\n  <example module=\"ngAnimate\" deps=\"angular-animate.js\" animations=\"true\" name=\"ng-if\">\n    <file name=\"index.ced81ed4.html\">\n      <label>Click me: <input type=\"checkbox\" ng-model=\"checked\" ng-init=\"checked=true\" /></label><br/>\n      Show when checked:\n      <span ng-if=\"checked\" class=\"animate-if\">\n        This is removed when the checkbox is unchecked.\n      </span>\n    </file>\n    <file name=\"animations.css\">\n      .animate-if {\n        background:white;\n        border:1px solid black;\n        padding:10px;\n      }\n\n      .animate-if.ng-enter, .animate-if.ng-leave {\n        transition:all cubic-bezier(0.250, 0.460, 0.450, 0.940) 0.5s;\n      }\n\n      .animate-if.ng-enter,\n      .animate-if.ng-leave.ng-leave-active {\n        opacity:0;\n      }\n\n      .animate-if.ng-leave,\n      .animate-if.ng-enter.ng-enter-active {\n        opacity:1;\n      }\n    </file>\n  </example>\n */\nvar ngIfDirective = ['$animate', '$compile', function($animate, $compile) {\n  return {\n    multiElement: true,\n    transclude: 'element',\n    priority: 600,\n    terminal: true,\n    restrict: 'A',\n    $$tlb: true,\n    link: function($scope, $element, $attr, ctrl, $transclude) {\n        var block, childScope, previousElements;\n        $scope.$watch($attr.ngIf, function ngIfWatchAction(value) {\n\n          if (value) {\n            if (!childScope) {\n              $transclude(function(clone, newScope) {\n                childScope = newScope;\n                clone[clone.length++] = $compile.$$createComment('end ngIf', $attr.ngIf);\n                // Note: We only need the first/last node of the cloned nodes.\n                // However, we need to keep the reference to the jqlite wrapper as it might be changed later\n                // by a directive with templateUrl when its template arrives.\n                block = {\n                  clone: clone\n                };\n                $animate.enter(clone, $element.parent(), $element);\n              });\n            }\n          } else {\n            if (previousElements) {\n              previousElements.remove();\n              previousElements = null;\n            }\n            if (childScope) {\n              childScope.$destroy();\n              childScope = null;\n            }\n            if (block) {\n              previousElements = getBlockNodes(block.clone);\n              $animate.leave(previousElements).done(function(response) {\n                if (response !== false) previousElements = null;\n              });\n              block = null;\n            }\n          }\n        });\n    }\n  };\n}];\n\n/**\n * @ngdoc directive\n * @name ngInclude\n * @restrict ECA\n *\n * @description\n * Fetches, compiles and includes an external HTML fragment.\n *\n * By default, the template URL is restricted to the same domain and protocol as the\n * application document. This is done by calling {@link $sce#getTrustedResourceUrl\n * $sce.getTrustedResourceUrl} on it. To load templates from other domains or protocols\n * you may either {@link ng.$sceDelegateProvider#resourceUrlWhitelist whitelist them} or\n * {@link $sce#trustAsResourceUrl wrap them} as trusted values. Refer to Angular's {@link\n * ng.$sce Strict Contextual Escaping}.\n *\n * In addition, the browser's\n * [Same Origin Policy](https://code.google.com/p/browsersec/wiki/Part2#Same-origin_policy_for_XMLHttpRequest)\n * and [Cross-Origin Resource Sharing (CORS)](http://www.w3.org/TR/cors/)\n * policy may further restrict whether the template is successfully loaded.\n * For example, `ngInclude` won't work for cross-domain requests on all browsers and for `file://`\n * access on some browsers.\n *\n * @animations\n * | Animation                        | Occurs                              |\n * |----------------------------------|-------------------------------------|\n * | {@link ng.$animate#enter enter}  | when the expression changes, on the new include |\n * | {@link ng.$animate#leave leave}  | when the expression changes, on the old include |\n *\n * The enter and leave animation occur concurrently.\n *\n * @scope\n * @priority 400\n *\n * @param {string} ngInclude|src angular expression evaluating to URL. If the source is a string constant,\n *                 make sure you wrap it in **single** quotes, e.g. `src=\"'myPartialTemplate.html'\"`.\n * @param {string=} onload Expression to evaluate when a new partial is loaded.\n *                  <div class=\"alert alert-warning\">\n *                  **Note:** When using onload on SVG elements in IE11, the browser will try to call\n *                  a function with the name on the window element, which will usually throw a\n *                  \"function is undefined\" error. To fix this, you can instead use `data-onload` or a\n *                  different form that {@link guide/directive#normalization matches} `onload`.\n *                  </div>\n   *\n * @param {string=} autoscroll Whether `ngInclude` should call {@link ng.$anchorScroll\n *                  $anchorScroll} to scroll the viewport after the content is loaded.\n *\n *                  - If the attribute is not set, disable scrolling.\n *                  - If the attribute is set without value, enable scrolling.\n *                  - Otherwise enable scrolling only if the expression evaluates to truthy value.\n *\n * @example\n  <example module=\"includeExample\" deps=\"angular-animate.js\" animations=\"true\" name=\"ng-include\">\n    <file name=\"index.ced81ed4.html\">\n     <div ng-controller=\"ExampleController\">\n       <select ng-model=\"template\" ng-options=\"t.name for t in templates\">\n        <option value=\"\">(blank)</option>\n       </select>\n       url of the template: <code>{{template.url}}</code>\n       <hr/>\n       <div class=\"slide-animate-container\">\n         <div class=\"slide-animate\" ng-include=\"template.url\"></div>\n       </div>\n     </div>\n    </file>\n    <file name=\"script.js\">\n      angular.module('includeExample', ['ngAnimate'])\n        .controller('ExampleController', ['$scope', function($scope) {\n          $scope.templates =\n            [{ name: 'template1.html', url: 'template1.html'},\n             { name: 'template2.html', url: 'template2.html'}];\n          $scope.template = $scope.templates[0];\n        }]);\n     </file>\n    <file name=\"template1.html\">\n      Content of template1.html\n    </file>\n    <file name=\"template2.html\">\n      Content of template2.html\n    </file>\n    <file name=\"animations.css\">\n      .slide-animate-container {\n        position:relative;\n        background:white;\n        border:1px solid black;\n        height:40px;\n        overflow:hidden;\n      }\n\n      .slide-animate {\n        padding:10px;\n      }\n\n      .slide-animate.ng-enter, .slide-animate.ng-leave {\n        transition:all cubic-bezier(0.250, 0.460, 0.450, 0.940) 0.5s;\n\n        position:absolute;\n        top:0;\n        left:0;\n        right:0;\n        bottom:0;\n        display:block;\n        padding:10px;\n      }\n\n      .slide-animate.ng-enter {\n        top:-50px;\n      }\n      .slide-animate.ng-enter.ng-enter-active {\n        top:0;\n      }\n\n      .slide-animate.ng-leave {\n        top:0;\n      }\n      .slide-animate.ng-leave.ng-leave-active {\n        top:50px;\n      }\n    </file>\n    <file name=\"protractor.js\" type=\"protractor\">\n      var templateSelect = element(by.model('template'));\n      var includeElem = element(by.css('[ng-include]'));\n\n      it('should load template1.html', function() {\n        expect(includeElem.getText()).toMatch(/Content of template1.html/);\n      });\n\n      it('should load template2.html', function() {\n        if (browser.params.browser === 'firefox') {\n          // Firefox can't handle using selects\n          // See https://github.com/angular/protractor/issues/480\n          return;\n        }\n        templateSelect.click();\n        templateSelect.all(by.css('option')).get(2).click();\n        expect(includeElem.getText()).toMatch(/Content of template2.html/);\n      });\n\n      it('should change to blank', function() {\n        if (browser.params.browser === 'firefox') {\n          // Firefox can't handle using selects\n          return;\n        }\n        templateSelect.click();\n        templateSelect.all(by.css('option')).get(0).click();\n        expect(includeElem.isPresent()).toBe(false);\n      });\n    </file>\n  </example>\n */\n\n\n/**\n * @ngdoc event\n * @name ngInclude#$includeContentRequested\n * @eventType emit on the scope ngInclude was declared in\n * @description\n * Emitted every time the ngInclude content is requested.\n *\n * @param {Object} angularEvent Synthetic event object.\n * @param {String} src URL of content to load.\n */\n\n\n/**\n * @ngdoc event\n * @name ngInclude#$includeContentLoaded\n * @eventType emit on the current ngInclude scope\n * @description\n * Emitted every time the ngInclude content is reloaded.\n *\n * @param {Object} angularEvent Synthetic event object.\n * @param {String} src URL of content to load.\n */\n\n\n/**\n * @ngdoc event\n * @name ngInclude#$includeContentError\n * @eventType emit on the scope ngInclude was declared in\n * @description\n * Emitted when a template HTTP request yields an erroneous response (status < 200 || status > 299)\n *\n * @param {Object} angularEvent Synthetic event object.\n * @param {String} src URL of content to load.\n */\nvar ngIncludeDirective = ['$templateRequest', '$anchorScroll', '$animate',\n                  function($templateRequest,   $anchorScroll,   $animate) {\n  return {\n    restrict: 'ECA',\n    priority: 400,\n    terminal: true,\n    transclude: 'element',\n    controller: angular.noop,\n    compile: function(element, attr) {\n      var srcExp = attr.ngInclude || attr.src,\n          onloadExp = attr.onload || '',\n          autoScrollExp = attr.autoscroll;\n\n      return function(scope, $element, $attr, ctrl, $transclude) {\n        var changeCounter = 0,\n            currentScope,\n            previousElement,\n            currentElement;\n\n        var cleanupLastIncludeContent = function() {\n          if (previousElement) {\n            previousElement.remove();\n            previousElement = null;\n          }\n          if (currentScope) {\n            currentScope.$destroy();\n            currentScope = null;\n          }\n          if (currentElement) {\n            $animate.leave(currentElement).done(function(response) {\n              if (response !== false) previousElement = null;\n            });\n            previousElement = currentElement;\n            currentElement = null;\n          }\n        };\n\n        scope.$watch(srcExp, function ngIncludeWatchAction(src) {\n          var afterAnimation = function(response) {\n            if (response !== false && isDefined(autoScrollExp) &&\n              (!autoScrollExp || scope.$eval(autoScrollExp))) {\n                $anchorScroll();\n            }\n          };\n          var thisChangeId = ++changeCounter;\n\n          if (src) {\n            //set the 2nd param to true to ignore the template request error so that the inner\n            //contents and scope can be cleaned up.\n            $templateRequest(src, true).then(function(response) {\n              if (scope.$$destroyed) return;\n\n              if (thisChangeId !== changeCounter) return;\n              var newScope = scope.$new();\n              ctrl.template = response;\n\n              // Note: This will also link all children of ng-include that were contained in the original\n              // html. If that content contains controllers, ... they could pollute/change the scope.\n              // However, using ng-include on an element with additional content does not make sense...\n              // Note: We can't remove them in the cloneAttchFn of $transclude as that\n              // function is called before linking the content, which would apply child\n              // directives to non existing elements.\n              var clone = $transclude(newScope, function(clone) {\n                cleanupLastIncludeContent();\n                $animate.enter(clone, null, $element).done(afterAnimation);\n              });\n\n              currentScope = newScope;\n              currentElement = clone;\n\n              currentScope.$emit('$includeContentLoaded', src);\n              scope.$eval(onloadExp);\n            }, function() {\n              if (scope.$$destroyed) return;\n\n              if (thisChangeId === changeCounter) {\n                cleanupLastIncludeContent();\n                scope.$emit('$includeContentError', src);\n              }\n            });\n            scope.$emit('$includeContentRequested', src);\n          } else {\n            cleanupLastIncludeContent();\n            ctrl.template = null;\n          }\n        });\n      };\n    }\n  };\n}];\n\n// This directive is called during the $transclude call of the first `ngInclude` directive.\n// It will replace and compile the content of the element with the loaded template.\n// We need this directive so that the element content is already filled when\n// the link function of another directive on the same element as ngInclude\n// is called.\nvar ngIncludeFillContentDirective = ['$compile',\n  function($compile) {\n    return {\n      restrict: 'ECA',\n      priority: -400,\n      require: 'ngInclude',\n      link: function(scope, $element, $attr, ctrl) {\n        if (toString.call($element[0]).match(/SVG/)) {\n          // WebKit: https://bugs.webkit.org/show_bug.cgi?id=135698 --- SVG elements do not\n          // support innerHTML, so detect this here and try to generate the contents\n          // specially.\n          $element.empty();\n          $compile(jqLiteBuildFragment(ctrl.template, window.document).childNodes)(scope,\n              function namespaceAdaptedClone(clone) {\n            $element.append(clone);\n          }, {futureParentElement: $element});\n          return;\n        }\n\n        $element.html(ctrl.template);\n        $compile($element.contents())(scope);\n      }\n    };\n  }];\n\n/**\n * @ngdoc directive\n * @name ngInit\n * @restrict AC\n *\n * @description\n * The `ngInit` directive allows you to evaluate an expression in the\n * current scope.\n *\n * <div class=\"alert alert-danger\">\n * This directive can be abused to add unnecessary amounts of logic into your templates.\n * There are only a few appropriate uses of `ngInit`, such as for aliasing special properties of\n * {@link ng.directive:ngRepeat `ngRepeat`}, as seen in the demo below; and for injecting data via\n * server side scripting. Besides these few cases, you should use {@link guide/controller controllers}\n * rather than `ngInit` to initialize values on a scope.\n * </div>\n *\n * <div class=\"alert alert-warning\">\n * **Note**: If you have assignment in `ngInit` along with a {@link ng.$filter `filter`}, make\n * sure you have parentheses to ensure correct operator precedence:\n * <pre class=\"prettyprint\">\n * `<div ng-init=\"test1 = ($index | toString)\"></div>`\n * </pre>\n * </div>\n *\n * @priority 450\n *\n * @element ANY\n * @param {expression} ngInit {@link guide/expression Expression} to eval.\n *\n * @example\n   <example module=\"initExample\" name=\"ng-init\">\n     <file name=\"index.ced81ed4.html\">\n   <script>\n     angular.module('initExample', [])\n       .controller('ExampleController', ['$scope', function($scope) {\n         $scope.list = [['a', 'b'], ['c', 'd']];\n       }]);\n   </script>\n   <div ng-controller=\"ExampleController\">\n     <div ng-repeat=\"innerList in list\" ng-init=\"outerIndex = $index\">\n       <div ng-repeat=\"value in innerList\" ng-init=\"innerIndex = $index\">\n          <span class=\"example-init\">list[ {{outerIndex}} ][ {{innerIndex}} ] = {{value}};</span>\n       </div>\n     </div>\n   </div>\n     </file>\n     <file name=\"protractor.js\" type=\"protractor\">\n       it('should alias index positions', function() {\n         var elements = element.all(by.css('.example-init'));\n         expect(elements.get(0).getText()).toBe('list[ 0 ][ 0 ] = a;');\n         expect(elements.get(1).getText()).toBe('list[ 0 ][ 1 ] = b;');\n         expect(elements.get(2).getText()).toBe('list[ 1 ][ 0 ] = c;');\n         expect(elements.get(3).getText()).toBe('list[ 1 ][ 1 ] = d;');\n       });\n     </file>\n   </example>\n */\nvar ngInitDirective = ngDirective({\n  priority: 450,\n  compile: function() {\n    return {\n      pre: function(scope, element, attrs) {\n        scope.$eval(attrs.ngInit);\n      }\n    };\n  }\n});\n\n/**\n * @ngdoc directive\n * @name ngList\n *\n * @description\n * Text input that converts between a delimited string and an array of strings. The default\n * delimiter is a comma followed by a space - equivalent to `ng-list=\", \"`. You can specify a custom\n * delimiter as the value of the `ngList` attribute - for example, `ng-list=\" | \"`.\n *\n * The behaviour of the directive is affected by the use of the `ngTrim` attribute.\n * * If `ngTrim` is set to `\"false\"` then whitespace around both the separator and each\n *   list item is respected. This implies that the user of the directive is responsible for\n *   dealing with whitespace but also allows you to use whitespace as a delimiter, such as a\n *   tab or newline character.\n * * Otherwise whitespace around the delimiter is ignored when splitting (although it is respected\n *   when joining the list items back together) and whitespace around each list item is stripped\n *   before it is added to the model.\n *\n * ### Example with Validation\n *\n * <example name=\"ngList-directive\" module=\"listExample\">\n *   <file name=\"app.js\">\n *      angular.module('listExample', [])\n *        .controller('ExampleController', ['$scope', function($scope) {\n *          $scope.names = ['morpheus', 'neo', 'trinity'];\n *        }]);\n *   </file>\n *   <file name=\"index.ced81ed4.html\">\n *    <form name=\"myForm\" ng-controller=\"ExampleController\">\n *      <label>List: <input name=\"namesInput\" ng-model=\"names\" ng-list required></label>\n *      <span role=\"alert\">\n *        <span class=\"error\" ng-show=\"myForm.namesInput.$error.required\">\n *        Required!</span>\n *      </span>\n *      <br>\n *      <tt>names = {{names}}</tt><br/>\n *      <tt>myForm.namesInput.$valid = {{myForm.namesInput.$valid}}</tt><br/>\n *      <tt>myForm.namesInput.$error = {{myForm.namesInput.$error}}</tt><br/>\n *      <tt>myForm.$valid = {{myForm.$valid}}</tt><br/>\n *      <tt>myForm.$error.required = {{!!myForm.$error.required}}</tt><br/>\n *     </form>\n *   </file>\n *   <file name=\"protractor.js\" type=\"protractor\">\n *     var listInput = element(by.model('names'));\n *     var names = element(by.exactBinding('names'));\n *     var valid = element(by.binding('myForm.namesInput.$valid'));\n *     var error = element(by.css('span.error'));\n *\n *     it('should initialize to model', function() {\n *       expect(names.getText()).toContain('[\"morpheus\",\"neo\",\"trinity\"]');\n *       expect(valid.getText()).toContain('true');\n *       expect(error.getCssValue('display')).toBe('none');\n *     });\n *\n *     it('should be invalid if empty', function() {\n *       listInput.clear();\n *       listInput.sendKeys('');\n *\n *       expect(names.getText()).toContain('');\n *       expect(valid.getText()).toContain('false');\n *       expect(error.getCssValue('display')).not.toBe('none');\n *     });\n *   </file>\n * </example>\n *\n * ### Example - splitting on newline\n * <example name=\"ngList-directive-newlines\">\n *   <file name=\"index.ced81ed4.html\">\n *    <textarea ng-model=\"list\" ng-list=\"&#10;\" ng-trim=\"false\"></textarea>\n *    <pre>{{ list | json }}</pre>\n *   </file>\n *   <file name=\"protractor.js\" type=\"protractor\">\n *     it(\"should split the text by newlines\", function() {\n *       var listInput = element(by.model('list'));\n *       var output = element(by.binding('list | json'));\n *       listInput.sendKeys('abc\\ndef\\nghi');\n *       expect(output.getText()).toContain('[\\n  \"abc\",\\n  \"def\",\\n  \"ghi\"\\n]');\n *     });\n *   </file>\n * </example>\n *\n * @element input\n * @param {string=} ngList optional delimiter that should be used to split the value.\n */\nvar ngListDirective = function() {\n  return {\n    restrict: 'A',\n    priority: 100,\n    require: 'ngModel',\n    link: function(scope, element, attr, ctrl) {\n      var ngList = attr.ngList || ', ';\n      var trimValues = attr.ngTrim !== 'false';\n      var separator = trimValues ? trim(ngList) : ngList;\n\n      var parse = function(viewValue) {\n        // If the viewValue is invalid (say required but empty) it will be `undefined`\n        if (isUndefined(viewValue)) return;\n\n        var list = [];\n\n        if (viewValue) {\n          forEach(viewValue.split(separator), function(value) {\n            if (value) list.push(trimValues ? trim(value) : value);\n          });\n        }\n\n        return list;\n      };\n\n      ctrl.$parsers.push(parse);\n      ctrl.$formatters.push(function(value) {\n        if (isArray(value)) {\n          return value.join(ngList);\n        }\n\n        return undefined;\n      });\n\n      // Override the standard $isEmpty because an empty array means the input is empty.\n      ctrl.$isEmpty = function(value) {\n        return !value || !value.length;\n      };\n    }\n  };\n};\n\n/* global VALID_CLASS: true,\n  INVALID_CLASS: true,\n  PRISTINE_CLASS: true,\n  DIRTY_CLASS: true,\n  UNTOUCHED_CLASS: true,\n  TOUCHED_CLASS: true,\n  PENDING_CLASS: true,\n  addSetValidityMethod: true,\n  setupValidity: true,\n  defaultModelOptions: false\n*/\n\n\nvar VALID_CLASS = 'ng-valid',\n    INVALID_CLASS = 'ng-invalid',\n    PRISTINE_CLASS = 'ng-pristine',\n    DIRTY_CLASS = 'ng-dirty',\n    UNTOUCHED_CLASS = 'ng-untouched',\n    TOUCHED_CLASS = 'ng-touched',\n    EMPTY_CLASS = 'ng-empty',\n    NOT_EMPTY_CLASS = 'ng-not-empty';\n\nvar ngModelMinErr = minErr('ngModel');\n\n/**\n * @ngdoc type\n * @name ngModel.NgModelController\n *\n * @property {*} $viewValue The actual value from the control's view. For `input` elements, this is a\n * String. See {@link ngModel.NgModelController#$setViewValue} for information about when the $viewValue\n * is set.\n *\n * @property {*} $modelValue The value in the model that the control is bound to.\n *\n * @property {Array.<Function>} $parsers Array of functions to execute, as a pipeline, whenever\n *  the control updates the ngModelController with a new {@link ngModel.NgModelController#$viewValue\n    `$viewValue`} from the DOM, usually via user input.\n    See {@link ngModel.NgModelController#$setViewValue `$setViewValue()`} for a detailed lifecycle explanation.\n    Note that the `$parsers` are not called when the bound ngModel expression changes programmatically.\n\n  The functions are called in array order, each passing\n    its return value through to the next. The last return value is forwarded to the\n    {@link ngModel.NgModelController#$validators `$validators`} collection.\n\n  Parsers are used to sanitize / convert the {@link ngModel.NgModelController#$viewValue\n    `$viewValue`}.\n\n  Returning `undefined` from a parser means a parse error occurred. In that case,\n    no {@link ngModel.NgModelController#$validators `$validators`} will run and the `ngModel`\n    will be set to `undefined` unless {@link ngModelOptions `ngModelOptions.allowInvalid`}\n    is set to `true`. The parse error is stored in `ngModel.$error.parse`.\n\n  This simple example shows a parser that would convert text input value to lowercase:\n * ```js\n * function parse(value) {\n *   if (value) {\n *     return value.toLowerCase();\n *   }\n * }\n * ngModelController.$parsers.push(parse);\n * ```\n\n *\n * @property {Array.<Function>} $formatters Array of functions to execute, as a pipeline, whenever\n    the bound ngModel expression changes programmatically. The `$formatters` are not called when the\n    value of the control is changed by user interaction.\n\n  Formatters are used to format / convert the {@link ngModel.NgModelController#$modelValue\n    `$modelValue`} for display in the control.\n\n  The functions are called in reverse array order, each passing the value through to the\n    next. The last return value is used as the actual DOM value.\n\n  This simple example shows a formatter that would convert the model value to uppercase:\n\n * ```js\n * function format(value) {\n *   if (value) {\n *     return value.toUpperCase();\n *   }\n * }\n * ngModel.$formatters.push(format);\n * ```\n *\n * @property {Object.<string, function>} $validators A collection of validators that are applied\n *      whenever the model value changes. The key value within the object refers to the name of the\n *      validator while the function refers to the validation operation. The validation operation is\n *      provided with the model value as an argument and must return a true or false value depending\n *      on the response of that validation.\n *\n * ```js\n * ngModel.$validators.validCharacters = function(modelValue, viewValue) {\n *   var value = modelValue || viewValue;\n *   return /[0-9]+/.test(value) &&\n *          /[a-z]+/.test(value) &&\n *          /[A-Z]+/.test(value) &&\n *          /\\W+/.test(value);\n * };\n * ```\n *\n * @property {Object.<string, function>} $asyncValidators A collection of validations that are expected to\n *      perform an asynchronous validation (e.g. a HTTP request). The validation function that is provided\n *      is expected to return a promise when it is run during the model validation process. Once the promise\n *      is delivered then the validation status will be set to true when fulfilled and false when rejected.\n *      When the asynchronous validators are triggered, each of the validators will run in parallel and the model\n *      value will only be updated once all validators have been fulfilled. As long as an asynchronous validator\n *      is unfulfilled, its key will be added to the controllers `$pending` property. Also, all asynchronous validators\n *      will only run once all synchronous validators have passed.\n *\n * Please note that if $http is used then it is important that the server returns a success HTTP response code\n * in order to fulfill the validation and a status level of `4xx` in order to reject the validation.\n *\n * ```js\n * ngModel.$asyncValidators.uniqueUsername = function(modelValue, viewValue) {\n *   var value = modelValue || viewValue;\n *\n *   // Lookup user by username\n *   return $http.get('/api/users/' + value).\n *      then(function resolved() {\n *        //username exists, this means validation fails\n *        return $q.reject('exists');\n *      }, function rejected() {\n *        //username does not exist, therefore this validation passes\n *        return true;\n *      });\n * };\n * ```\n *\n * @property {Array.<Function>} $viewChangeListeners Array of functions to execute whenever the\n *     view value has changed. It is called with no arguments, and its return value is ignored.\n *     This can be used in place of additional $watches against the model value.\n *\n * @property {Object} $error An object hash with all failing validator ids as keys.\n * @property {Object} $pending An object hash with all pending validator ids as keys.\n *\n * @property {boolean} $untouched True if control has not lost focus yet.\n * @property {boolean} $touched True if control has lost focus.\n * @property {boolean} $pristine True if user has not interacted with the control yet.\n * @property {boolean} $dirty True if user has already interacted with the control.\n * @property {boolean} $valid True if there is no error.\n * @property {boolean} $invalid True if at least one error on the control.\n * @property {string} $name The name attribute of the control.\n *\n * @description\n *\n * `NgModelController` provides API for the {@link ngModel `ngModel`} directive.\n * The controller contains services for data-binding, validation, CSS updates, and value formatting\n * and parsing. It purposefully does not contain any logic which deals with DOM rendering or\n * listening to DOM events.\n * Such DOM related logic should be provided by other directives which make use of\n * `NgModelController` for data-binding to control elements.\n * Angular provides this DOM logic for most {@link input `input`} elements.\n * At the end of this page you can find a {@link ngModel.NgModelController#custom-control-example\n * custom control example} that uses `ngModelController` to bind to `contenteditable` elements.\n *\n * @example\n * ### Custom Control Example\n * This example shows how to use `NgModelController` with a custom control to achieve\n * data-binding. Notice how different directives (`contenteditable`, `ng-model`, and `required`)\n * collaborate together to achieve the desired result.\n *\n * `contenteditable` is an HTML5 attribute, which tells the browser to let the element\n * contents be edited in place by the user.\n *\n * We are using the {@link ng.service:$sce $sce} service here and include the {@link ngSanitize $sanitize}\n * module to automatically remove \"bad\" content like inline event listener (e.g. `<span onclick=\"...\">`).\n * However, as we are using `$sce` the model can still decide to provide unsafe content if it marks\n * that content using the `$sce` service.\n *\n * <example name=\"NgModelController\" module=\"customControl\" deps=\"angular-sanitize.js\">\n    <file name=\"style.css\">\n      [contenteditable] {\n        border: 1px solid black;\n        background-color: white;\n        min-height: 20px;\n      }\n\n      .ng-invalid {\n        border: 1px solid red;\n      }\n\n    </file>\n    <file name=\"script.js\">\n      angular.module('customControl', ['ngSanitize']).\n        directive('contenteditable', ['$sce', function($sce) {\n          return {\n            restrict: 'A', // only activate on element attribute\n            require: '?ngModel', // get a hold of NgModelController\n            link: function(scope, element, attrs, ngModel) {\n              if (!ngModel) return; // do nothing if no ng-model\n\n              // Specify how UI should be updated\n              ngModel.$render = function() {\n                element.html($sce.getTrustedHtml(ngModel.$viewValue || ''));\n              };\n\n              // Listen for change events to enable binding\n              element.on('blur keyup change', function() {\n                scope.$evalAsync(read);\n              });\n              read(); // initialize\n\n              // Write data to the model\n              function read() {\n                var html = element.html();\n                // When we clear the content editable the browser leaves a <br> behind\n                // If strip-br attribute is provided then we strip this out\n                if (attrs.stripBr && html === '<br>') {\n                  html = '';\n                }\n                ngModel.$setViewValue(html);\n              }\n            }\n          };\n        }]);\n    </file>\n    <file name=\"index.ced81ed4.html\">\n      <form name=\"myForm\">\n       <div contenteditable\n            name=\"myWidget\" ng-model=\"userContent\"\n            strip-br=\"true\"\n            required>Change me!</div>\n        <span ng-show=\"myForm.myWidget.$error.required\">Required!</span>\n       <hr>\n       <textarea ng-model=\"userContent\" aria-label=\"Dynamic textarea\"></textarea>\n      </form>\n    </file>\n    <file name=\"protractor.js\" type=\"protractor\">\n    it('should data-bind and become invalid', function() {\n      if (browser.params.browser === 'safari' || browser.params.browser === 'firefox') {\n        // SafariDriver can't handle contenteditable\n        // and Firefox driver can't clear contenteditables very well\n        return;\n      }\n      var contentEditable = element(by.css('[contenteditable]'));\n      var content = 'Change me!';\n\n      expect(contentEditable.getText()).toEqual(content);\n\n      contentEditable.clear();\n      contentEditable.sendKeys(protractor.Key.BACK_SPACE);\n      expect(contentEditable.getText()).toEqual('');\n      expect(contentEditable.getAttribute('class')).toMatch(/ng-invalid-required/);\n    });\n    </file>\n * </example>\n *\n *\n */\nNgModelController.$inject = ['$scope', '$exceptionHandler', '$attrs', '$element', '$parse', '$animate', '$timeout', '$q', '$interpolate'];\nfunction NgModelController($scope, $exceptionHandler, $attr, $element, $parse, $animate, $timeout, $q, $interpolate) {\n  this.$viewValue = Number.NaN;\n  this.$modelValue = Number.NaN;\n  this.$$rawModelValue = undefined; // stores the parsed modelValue / model set from scope regardless of validity.\n  this.$validators = {};\n  this.$asyncValidators = {};\n  this.$parsers = [];\n  this.$formatters = [];\n  this.$viewChangeListeners = [];\n  this.$untouched = true;\n  this.$touched = false;\n  this.$pristine = true;\n  this.$dirty = false;\n  this.$valid = true;\n  this.$invalid = false;\n  this.$error = {}; // keep invalid keys here\n  this.$$success = {}; // keep valid keys here\n  this.$pending = undefined; // keep pending keys here\n  this.$name = $interpolate($attr.name || '', false)($scope);\n  this.$$parentForm = nullFormCtrl;\n  this.$options = defaultModelOptions;\n\n  this.$$parsedNgModel = $parse($attr.ngModel);\n  this.$$parsedNgModelAssign = this.$$parsedNgModel.assign;\n  this.$$ngModelGet = this.$$parsedNgModel;\n  this.$$ngModelSet = this.$$parsedNgModelAssign;\n  this.$$pendingDebounce = null;\n  this.$$parserValid = undefined;\n\n  this.$$currentValidationRunId = 0;\n\n  // https://github.com/angular/angular.js/issues/15833\n  // Prevent `$$scope` from being iterated over by `copy` when NgModelController is deep watched\n  Object.defineProperty(this, '$$scope', {value: $scope});\n  this.$$attr = $attr;\n  this.$$element = $element;\n  this.$$animate = $animate;\n  this.$$timeout = $timeout;\n  this.$$parse = $parse;\n  this.$$q = $q;\n  this.$$exceptionHandler = $exceptionHandler;\n\n  setupValidity(this);\n  setupModelWatcher(this);\n}\n\nNgModelController.prototype = {\n  $$initGetterSetters: function() {\n    if (this.$options.getOption('getterSetter')) {\n      var invokeModelGetter = this.$$parse(this.$$attr.ngModel + '()'),\n          invokeModelSetter = this.$$parse(this.$$attr.ngModel + '($$$p)');\n\n      this.$$ngModelGet = function($scope) {\n        var modelValue = this.$$parsedNgModel($scope);\n        if (isFunction(modelValue)) {\n          modelValue = invokeModelGetter($scope);\n        }\n        return modelValue;\n      };\n      this.$$ngModelSet = function($scope, newValue) {\n        if (isFunction(this.$$parsedNgModel($scope))) {\n          invokeModelSetter($scope, {$$$p: newValue});\n        } else {\n          this.$$parsedNgModelAssign($scope, newValue);\n        }\n      };\n    } else if (!this.$$parsedNgModel.assign) {\n      throw ngModelMinErr('nonassign', 'Expression \\'{0}\\' is non-assignable. Element: {1}',\n          this.$$attr.ngModel, startingTag(this.$$element));\n    }\n  },\n\n\n  /**\n   * @ngdoc method\n   * @name ngModel.NgModelController#$render\n   *\n   * @description\n   * Called when the view needs to be updated. It is expected that the user of the ng-model\n   * directive will implement this method.\n   *\n   * The `$render()` method is invoked in the following situations:\n   *\n   * * `$rollbackViewValue()` is called.  If we are rolling back the view value to the last\n   *   committed value then `$render()` is called to update the input control.\n   * * The value referenced by `ng-model` is changed programmatically and both the `$modelValue` and\n   *   the `$viewValue` are different from last time.\n   *\n   * Since `ng-model` does not do a deep watch, `$render()` is only invoked if the values of\n   * `$modelValue` and `$viewValue` are actually different from their previous values. If `$modelValue`\n   * or `$viewValue` are objects (rather than a string or number) then `$render()` will not be\n   * invoked if you only change a property on the objects.\n   */\n  $render: noop,\n\n  /**\n   * @ngdoc method\n   * @name ngModel.NgModelController#$isEmpty\n   *\n   * @description\n   * This is called when we need to determine if the value of an input is empty.\n   *\n   * For instance, the required directive does this to work out if the input has data or not.\n   *\n   * The default `$isEmpty` function checks whether the value is `undefined`, `''`, `null` or `NaN`.\n   *\n   * You can override this for input directives whose concept of being empty is different from the\n   * default. The `checkboxInputType` directive does this because in its case a value of `false`\n   * implies empty.\n   *\n   * @param {*} value The value of the input to check for emptiness.\n   * @returns {boolean} True if `value` is \"empty\".\n   */\n  $isEmpty: function(value) {\n    // eslint-disable-next-line no-self-compare\n    return isUndefined(value) || value === '' || value === null || value !== value;\n  },\n\n  $$updateEmptyClasses: function(value) {\n    if (this.$isEmpty(value)) {\n      this.$$animate.removeClass(this.$$element, NOT_EMPTY_CLASS);\n      this.$$animate.addClass(this.$$element, EMPTY_CLASS);\n    } else {\n      this.$$animate.removeClass(this.$$element, EMPTY_CLASS);\n      this.$$animate.addClass(this.$$element, NOT_EMPTY_CLASS);\n    }\n  },\n\n  /**\n   * @ngdoc method\n   * @name ngModel.NgModelController#$setPristine\n   *\n   * @description\n   * Sets the control to its pristine state.\n   *\n   * This method can be called to remove the `ng-dirty` class and set the control to its pristine\n   * state (`ng-pristine` class). A model is considered to be pristine when the control\n   * has not been changed from when first compiled.\n   */\n  $setPristine: function() {\n    this.$dirty = false;\n    this.$pristine = true;\n    this.$$animate.removeClass(this.$$element, DIRTY_CLASS);\n    this.$$animate.addClass(this.$$element, PRISTINE_CLASS);\n  },\n\n  /**\n   * @ngdoc method\n   * @name ngModel.NgModelController#$setDirty\n   *\n   * @description\n   * Sets the control to its dirty state.\n   *\n   * This method can be called to remove the `ng-pristine` class and set the control to its dirty\n   * state (`ng-dirty` class). A model is considered to be dirty when the control has been changed\n   * from when first compiled.\n   */\n  $setDirty: function() {\n    this.$dirty = true;\n    this.$pristine = false;\n    this.$$animate.removeClass(this.$$element, PRISTINE_CLASS);\n    this.$$animate.addClass(this.$$element, DIRTY_CLASS);\n    this.$$parentForm.$setDirty();\n  },\n\n  /**\n   * @ngdoc method\n   * @name ngModel.NgModelController#$setUntouched\n   *\n   * @description\n   * Sets the control to its untouched state.\n   *\n   * This method can be called to remove the `ng-touched` class and set the control to its\n   * untouched state (`ng-untouched` class). Upon compilation, a model is set as untouched\n   * by default, however this function can be used to restore that state if the model has\n   * already been touched by the user.\n   */\n  $setUntouched: function() {\n    this.$touched = false;\n    this.$untouched = true;\n    this.$$animate.setClass(this.$$element, UNTOUCHED_CLASS, TOUCHED_CLASS);\n  },\n\n  /**\n   * @ngdoc method\n   * @name ngModel.NgModelController#$setTouched\n   *\n   * @description\n   * Sets the control to its touched state.\n   *\n   * This method can be called to remove the `ng-untouched` class and set the control to its\n   * touched state (`ng-touched` class). A model is considered to be touched when the user has\n   * first focused the control element and then shifted focus away from the control (blur event).\n   */\n  $setTouched: function() {\n    this.$touched = true;\n    this.$untouched = false;\n    this.$$animate.setClass(this.$$element, TOUCHED_CLASS, UNTOUCHED_CLASS);\n  },\n\n  /**\n   * @ngdoc method\n   * @name ngModel.NgModelController#$rollbackViewValue\n   *\n   * @description\n   * Cancel an update and reset the input element's value to prevent an update to the `$modelValue`,\n   * which may be caused by a pending debounced event or because the input is waiting for some\n   * future event.\n   *\n   * If you have an input that uses `ng-model-options` to set up debounced updates or updates that\n   * depend on special events such as `blur`, there can be a period when the `$viewValue` is out of\n   * sync with the ngModel's `$modelValue`.\n   *\n   * In this case, you can use `$rollbackViewValue()` to manually cancel the debounced / future update\n   * and reset the input to the last committed view value.\n   *\n   * It is also possible that you run into difficulties if you try to update the ngModel's `$modelValue`\n   * programmatically before these debounced/future events have resolved/occurred, because Angular's\n   * dirty checking mechanism is not able to tell whether the model has actually changed or not.\n   *\n   * The `$rollbackViewValue()` method should be called before programmatically changing the model of an\n   * input which may have such events pending. This is important in order to make sure that the\n   * input field will be updated with the new model value and any pending operations are cancelled.\n   *\n   * <example name=\"ng-model-cancel-update\" module=\"cancel-update-example\">\n   *   <file name=\"app.js\">\n   *     angular.module('cancel-update-example', [])\n   *\n   *     .controller('CancelUpdateController', ['$scope', function($scope) {\n   *       $scope.model = {value1: '', value2: ''};\n   *\n   *       $scope.setEmpty = function(e, value, rollback) {\n   *         if (e.keyCode === 27) {\n   *           e.preventDefault();\n   *           if (rollback) {\n   *             $scope.myForm[value].$rollbackViewValue();\n   *           }\n   *           $scope.model[value] = '';\n   *         }\n   *       };\n   *     }]);\n   *   </file>\n   *   <file name=\"index.ced81ed4.html\">\n   *     <div ng-controller=\"CancelUpdateController\">\n   *       <p>Both of these inputs are only updated if they are blurred. Hitting escape should\n   *       empty them. Follow these steps and observe the difference:</p>\n   *       <ol>\n   *         <li>Type something in the input. You will see that the model is not yet updated</li>\n   *         <li>Press the Escape key.\n   *           <ol>\n   *             <li> In the first example, nothing happens, because the model is already '', and no\n   *             update is detected. If you blur the input, the model will be set to the current view.\n   *             </li>\n   *             <li> In the second example, the pending update is cancelled, and the input is set back\n   *             to the last committed view value (''). Blurring the input does nothing.\n   *             </li>\n   *           </ol>\n   *         </li>\n   *       </ol>\n   *\n   *       <form name=\"myForm\" ng-model-options=\"{ updateOn: 'blur' }\">\n   *         <div>\n   *           <p id=\"inputDescription1\">Without $rollbackViewValue():</p>\n   *           <input name=\"value1\" aria-describedby=\"inputDescription1\" ng-model=\"model.value1\"\n   *                  ng-keydown=\"setEmpty($event, 'value1')\">\n   *           value1: \"{{ model.value1 }}\"\n   *         </div>\n   *\n   *         <div>\n   *           <p id=\"inputDescription2\">With $rollbackViewValue():</p>\n   *           <input name=\"value2\" aria-describedby=\"inputDescription2\" ng-model=\"model.value2\"\n   *                  ng-keydown=\"setEmpty($event, 'value2', true)\">\n   *           value2: \"{{ model.value2 }}\"\n   *         </div>\n   *       </form>\n   *     </div>\n   *   </file>\n       <file name=\"style.css\">\n          div {\n            display: table-cell;\n          }\n          div:nth-child(1) {\n            padding-right: 30px;\n          }\n\n        </file>\n   * </example>\n   */\n  $rollbackViewValue: function() {\n    this.$$timeout.cancel(this.$$pendingDebounce);\n    this.$viewValue = this.$$lastCommittedViewValue;\n    this.$render();\n  },\n\n  /**\n   * @ngdoc method\n   * @name ngModel.NgModelController#$validate\n   *\n   * @description\n   * Runs each of the registered validators (first synchronous validators and then\n   * asynchronous validators).\n   * If the validity changes to invalid, the model will be set to `undefined`,\n   * unless {@link ngModelOptions `ngModelOptions.allowInvalid`} is `true`.\n   * If the validity changes to valid, it will set the model to the last available valid\n   * `$modelValue`, i.e. either the last parsed value or the last value set from the scope.\n   */\n  $validate: function() {\n    // ignore $validate before model is initialized\n    if (isNumberNaN(this.$modelValue)) {\n      return;\n    }\n\n    var viewValue = this.$$lastCommittedViewValue;\n    // Note: we use the $$rawModelValue as $modelValue might have been\n    // set to undefined during a view -> model update that found validation\n    // errors. We can't parse the view here, since that could change\n    // the model although neither viewValue nor the model on the scope changed\n    var modelValue = this.$$rawModelValue;\n\n    var prevValid = this.$valid;\n    var prevModelValue = this.$modelValue;\n\n    var allowInvalid = this.$options.getOption('allowInvalid');\n\n    var that = this;\n    this.$$runValidators(modelValue, viewValue, function(allValid) {\n      // If there was no change in validity, don't update the model\n      // This prevents changing an invalid modelValue to undefined\n      if (!allowInvalid && prevValid !== allValid) {\n        // Note: Don't check this.$valid here, as we could have\n        // external validators (e.g. calculated on the server),\n        // that just call $setValidity and need the model value\n        // to calculate their validity.\n        that.$modelValue = allValid ? modelValue : undefined;\n\n        if (that.$modelValue !== prevModelValue) {\n          that.$$writeModelToScope();\n        }\n      }\n    });\n  },\n\n  $$runValidators: function(modelValue, viewValue, doneCallback) {\n    this.$$currentValidationRunId++;\n    var localValidationRunId = this.$$currentValidationRunId;\n    var that = this;\n\n    // check parser error\n    if (!processParseErrors()) {\n      validationDone(false);\n      return;\n    }\n    if (!processSyncValidators()) {\n      validationDone(false);\n      return;\n    }\n    processAsyncValidators();\n\n    function processParseErrors() {\n      var errorKey = that.$$parserName || 'parse';\n      if (isUndefined(that.$$parserValid)) {\n        setValidity(errorKey, null);\n      } else {\n        if (!that.$$parserValid) {\n          forEach(that.$validators, function(v, name) {\n            setValidity(name, null);\n          });\n          forEach(that.$asyncValidators, function(v, name) {\n            setValidity(name, null);\n          });\n        }\n        // Set the parse error last, to prevent unsetting it, should a $validators key == parserName\n        setValidity(errorKey, that.$$parserValid);\n        return that.$$parserValid;\n      }\n      return true;\n    }\n\n    function processSyncValidators() {\n      var syncValidatorsValid = true;\n      forEach(that.$validators, function(validator, name) {\n        var result = Boolean(validator(modelValue, viewValue));\n        syncValidatorsValid = syncValidatorsValid && result;\n        setValidity(name, result);\n      });\n      if (!syncValidatorsValid) {\n        forEach(that.$asyncValidators, function(v, name) {\n          setValidity(name, null);\n        });\n        return false;\n      }\n      return true;\n    }\n\n    function processAsyncValidators() {\n      var validatorPromises = [];\n      var allValid = true;\n      forEach(that.$asyncValidators, function(validator, name) {\n        var promise = validator(modelValue, viewValue);\n        if (!isPromiseLike(promise)) {\n          throw ngModelMinErr('nopromise',\n            'Expected asynchronous validator to return a promise but got \\'{0}\\' instead.', promise);\n        }\n        setValidity(name, undefined);\n        validatorPromises.push(promise.then(function() {\n          setValidity(name, true);\n        }, function() {\n          allValid = false;\n          setValidity(name, false);\n        }));\n      });\n      if (!validatorPromises.length) {\n        validationDone(true);\n      } else {\n        that.$$q.all(validatorPromises).then(function() {\n          validationDone(allValid);\n        }, noop);\n      }\n    }\n\n    function setValidity(name, isValid) {\n      if (localValidationRunId === that.$$currentValidationRunId) {\n        that.$setValidity(name, isValid);\n      }\n    }\n\n    function validationDone(allValid) {\n      if (localValidationRunId === that.$$currentValidationRunId) {\n\n        doneCallback(allValid);\n      }\n    }\n  },\n\n  /**\n   * @ngdoc method\n   * @name ngModel.NgModelController#$commitViewValue\n   *\n   * @description\n   * Commit a pending update to the `$modelValue`.\n   *\n   * Updates may be pending by a debounced event or because the input is waiting for a some future\n   * event defined in `ng-model-options`. this method is rarely needed as `NgModelController`\n   * usually handles calling this in response to input events.\n   */\n  $commitViewValue: function() {\n    var viewValue = this.$viewValue;\n\n    this.$$timeout.cancel(this.$$pendingDebounce);\n\n    // If the view value has not changed then we should just exit, except in the case where there is\n    // a native validator on the element. In this case the validation state may have changed even though\n    // the viewValue has stayed empty.\n    if (this.$$lastCommittedViewValue === viewValue && (viewValue !== '' || !this.$$hasNativeValidators)) {\n      return;\n    }\n    this.$$updateEmptyClasses(viewValue);\n    this.$$lastCommittedViewValue = viewValue;\n\n    // change to dirty\n    if (this.$pristine) {\n      this.$setDirty();\n    }\n    this.$$parseAndValidate();\n  },\n\n  $$parseAndValidate: function() {\n    var viewValue = this.$$lastCommittedViewValue;\n    var modelValue = viewValue;\n    var that = this;\n\n    this.$$parserValid = isUndefined(modelValue) ? undefined : true;\n\n    if (this.$$parserValid) {\n      for (var i = 0; i < this.$parsers.length; i++) {\n        modelValue = this.$parsers[i](modelValue);\n        if (isUndefined(modelValue)) {\n          this.$$parserValid = false;\n          break;\n        }\n      }\n    }\n    if (isNumberNaN(this.$modelValue)) {\n      // this.$modelValue has not been touched yet...\n      this.$modelValue = this.$$ngModelGet(this.$$scope);\n    }\n    var prevModelValue = this.$modelValue;\n    var allowInvalid = this.$options.getOption('allowInvalid');\n    this.$$rawModelValue = modelValue;\n\n    if (allowInvalid) {\n      this.$modelValue = modelValue;\n      writeToModelIfNeeded();\n    }\n\n    // Pass the $$lastCommittedViewValue here, because the cached viewValue might be out of date.\n    // This can happen if e.g. $setViewValue is called from inside a parser\n    this.$$runValidators(modelValue, this.$$lastCommittedViewValue, function(allValid) {\n      if (!allowInvalid) {\n        // Note: Don't check this.$valid here, as we could have\n        // external validators (e.g. calculated on the server),\n        // that just call $setValidity and need the model value\n        // to calculate their validity.\n        that.$modelValue = allValid ? modelValue : undefined;\n        writeToModelIfNeeded();\n      }\n    });\n\n    function writeToModelIfNeeded() {\n      if (that.$modelValue !== prevModelValue) {\n        that.$$writeModelToScope();\n      }\n    }\n  },\n\n  $$writeModelToScope: function() {\n    this.$$ngModelSet(this.$$scope, this.$modelValue);\n    forEach(this.$viewChangeListeners, function(listener) {\n      try {\n        listener();\n      } catch (e) {\n        // eslint-disable-next-line no-invalid-this\n        this.$$exceptionHandler(e);\n      }\n    }, this);\n  },\n\n  /**\n   * @ngdoc method\n   * @name ngModel.NgModelController#$setViewValue\n   *\n   * @description\n   * Update the view value.\n   *\n   * This method should be called when a control wants to change the view value; typically,\n   * this is done from within a DOM event handler. For example, the {@link ng.directive:input input}\n   * directive calls it when the value of the input changes and {@link ng.directive:select select}\n   * calls it when an option is selected.\n   *\n   * When `$setViewValue` is called, the new `value` will be staged for committing through the `$parsers`\n   * and `$validators` pipelines. If there are no special {@link ngModelOptions} specified then the staged\n   * value is sent directly for processing through the `$parsers` pipeline. After this, the `$validators` and\n   * `$asyncValidators` are called and the value is applied to `$modelValue`.\n   * Finally, the value is set to the **expression** specified in the `ng-model` attribute and\n   * all the registered change listeners, in the `$viewChangeListeners` list are called.\n   *\n   * In case the {@link ng.directive:ngModelOptions ngModelOptions} directive is used with `updateOn`\n   * and the `default` trigger is not listed, all those actions will remain pending until one of the\n   * `updateOn` events is triggered on the DOM element.\n   * All these actions will be debounced if the {@link ng.directive:ngModelOptions ngModelOptions}\n   * directive is used with a custom debounce for this particular event.\n   * Note that a `$digest` is only triggered once the `updateOn` events are fired, or if `debounce`\n   * is specified, once the timer runs out.\n   *\n   * When used with standard inputs, the view value will always be a string (which is in some cases\n   * parsed into another type, such as a `Date` object for `input[date]`.)\n   * However, custom controls might also pass objects to this method. In this case, we should make\n   * a copy of the object before passing it to `$setViewValue`. This is because `ngModel` does not\n   * perform a deep watch of objects, it only looks for a change of identity. If you only change\n   * the property of the object then ngModel will not realize that the object has changed and\n   * will not invoke the `$parsers` and `$validators` pipelines. For this reason, you should\n   * not change properties of the copy once it has been passed to `$setViewValue`.\n   * Otherwise you may cause the model value on the scope to change incorrectly.\n   *\n   * <div class=\"alert alert-info\">\n   * In any case, the value passed to the method should always reflect the current value\n   * of the control. For example, if you are calling `$setViewValue` for an input element,\n   * you should pass the input DOM value. Otherwise, the control and the scope model become\n   * out of sync. It's also important to note that `$setViewValue` does not call `$render` or change\n   * the control's DOM value in any way. If we want to change the control's DOM value\n   * programmatically, we should update the `ngModel` scope expression. Its new value will be\n   * picked up by the model controller, which will run it through the `$formatters`, `$render` it\n   * to update the DOM, and finally call `$validate` on it.\n   * </div>\n   *\n   * @param {*} value value from the view.\n   * @param {string} trigger Event that triggered the update.\n   */\n  $setViewValue: function(value, trigger) {\n    this.$viewValue = value;\n    if (this.$options.getOption('updateOnDefault')) {\n      this.$$debounceViewValueCommit(trigger);\n    }\n  },\n\n  $$debounceViewValueCommit: function(trigger) {\n    var debounceDelay = this.$options.getOption('debounce');\n\n    if (isNumber(debounceDelay[trigger])) {\n      debounceDelay = debounceDelay[trigger];\n    } else if (isNumber(debounceDelay['default'])) {\n      debounceDelay = debounceDelay['default'];\n    }\n\n    this.$$timeout.cancel(this.$$pendingDebounce);\n    var that = this;\n    if (debounceDelay > 0) { // this fails if debounceDelay is an object\n      this.$$pendingDebounce = this.$$timeout(function() {\n        that.$commitViewValue();\n      }, debounceDelay);\n    } else if (this.$$scope.$root.$$phase) {\n      this.$commitViewValue();\n    } else {\n      this.$$scope.$apply(function() {\n        that.$commitViewValue();\n      });\n    }\n  },\n\n  /**\n   * @ngdoc method\n   *\n   * @name ngModel.NgModelController#$overrideModelOptions\n   *\n   * @description\n   *\n   * Override the current model options settings programmatically.\n   *\n   * The previous `ModelOptions` value will not be modified. Instead, a\n   * new `ModelOptions` object will inherit from the previous one overriding\n   * or inheriting settings that are defined in the given parameter.\n   *\n   * See {@link ngModelOptions} for information about what options can be specified\n   * and how model option inheritance works.\n   *\n   * @param {Object} options a hash of settings to override the previous options\n   *\n   */\n  $overrideModelOptions: function(options) {\n    this.$options = this.$options.createChild(options);\n  }\n};\n\nfunction setupModelWatcher(ctrl) {\n  // model -> value\n  // Note: we cannot use a normal scope.$watch as we want to detect the following:\n  // 1. scope value is 'a'\n  // 2. user enters 'b'\n  // 3. ng-change kicks in and reverts scope value to 'a'\n  //    -> scope value did not change since the last digest as\n  //       ng-change executes in apply phase\n  // 4. view should be changed back to 'a'\n  ctrl.$$scope.$watch(function ngModelWatch(scope) {\n    var modelValue = ctrl.$$ngModelGet(scope);\n\n    // if scope model value and ngModel value are out of sync\n    // TODO(perf): why not move this to the action fn?\n    if (modelValue !== ctrl.$modelValue &&\n       // checks for NaN is needed to allow setting the model to NaN when there's an asyncValidator\n        // eslint-disable-next-line no-self-compare\n       (ctrl.$modelValue === ctrl.$modelValue || modelValue === modelValue)\n    ) {\n      ctrl.$modelValue = ctrl.$$rawModelValue = modelValue;\n      ctrl.$$parserValid = undefined;\n\n      var formatters = ctrl.$formatters,\n          idx = formatters.length;\n\n      var viewValue = modelValue;\n      while (idx--) {\n        viewValue = formatters[idx](viewValue);\n      }\n      if (ctrl.$viewValue !== viewValue) {\n        ctrl.$$updateEmptyClasses(viewValue);\n        ctrl.$viewValue = ctrl.$$lastCommittedViewValue = viewValue;\n        ctrl.$render();\n\n        // It is possible that model and view value have been updated during render\n        ctrl.$$runValidators(ctrl.$modelValue, ctrl.$viewValue, noop);\n      }\n    }\n\n    return modelValue;\n  });\n}\n\n/**\n * @ngdoc method\n * @name ngModel.NgModelController#$setValidity\n *\n * @description\n * Change the validity state, and notify the form.\n *\n * This method can be called within $parsers/$formatters or a custom validation implementation.\n * However, in most cases it should be sufficient to use the `ngModel.$validators` and\n * `ngModel.$asyncValidators` collections which will call `$setValidity` automatically.\n *\n * @param {string} validationErrorKey Name of the validator. The `validationErrorKey` will be assigned\n *        to either `$error[validationErrorKey]` or `$pending[validationErrorKey]`\n *        (for unfulfilled `$asyncValidators`), so that it is available for data-binding.\n *        The `validationErrorKey` should be in camelCase and will get converted into dash-case\n *        for class name. Example: `myError` will result in `ng-valid-my-error` and `ng-invalid-my-error`\n *        class and can be bound to as  `{{someForm.someControl.$error.myError}}` .\n * @param {boolean} isValid Whether the current state is valid (true), invalid (false), pending (undefined),\n *                          or skipped (null). Pending is used for unfulfilled `$asyncValidators`.\n *                          Skipped is used by Angular when validators do not run because of parse errors and\n *                          when `$asyncValidators` do not run because any of the `$validators` failed.\n */\naddSetValidityMethod({\n  clazz: NgModelController,\n  set: function(object, property) {\n    object[property] = true;\n  },\n  unset: function(object, property) {\n    delete object[property];\n  }\n});\n\n\n/**\n * @ngdoc directive\n * @name ngModel\n *\n * @element input\n * @priority 1\n *\n * @description\n * The `ngModel` directive binds an `input`,`select`, `textarea` (or custom form control) to a\n * property on the scope using {@link ngModel.NgModelController NgModelController},\n * which is created and exposed by this directive.\n *\n * `ngModel` is responsible for:\n *\n * - Binding the view into the model, which other directives such as `input`, `textarea` or `select`\n *   require.\n * - Providing validation behavior (i.e. required, number, email, url).\n * - Keeping the state of the control (valid/invalid, dirty/pristine, touched/untouched, validation errors).\n * - Setting related css classes on the element (`ng-valid`, `ng-invalid`, `ng-dirty`, `ng-pristine`, `ng-touched`,\n *   `ng-untouched`, `ng-empty`, `ng-not-empty`) including animations.\n * - Registering the control with its parent {@link ng.directive:form form}.\n *\n * Note: `ngModel` will try to bind to the property given by evaluating the expression on the\n * current scope. If the property doesn't already exist on this scope, it will be created\n * implicitly and added to the scope.\n *\n * For best practices on using `ngModel`, see:\n *\n *  - [Understanding Scopes](https://github.com/angular/angular.js/wiki/Understanding-Scopes)\n *\n * For basic examples, how to use `ngModel`, see:\n *\n *  - {@link ng.directive:input input}\n *    - {@link input[text] text}\n *    - {@link input[checkbox] checkbox}\n *    - {@link input[radio] radio}\n *    - {@link input[number] number}\n *    - {@link input[email] email}\n *    - {@link input[url] url}\n *    - {@link input[date] date}\n *    - {@link input[datetime-local] datetime-local}\n *    - {@link input[time] time}\n *    - {@link input[month] month}\n *    - {@link input[week] week}\n *  - {@link ng.directive:select select}\n *  - {@link ng.directive:textarea textarea}\n *\n * # Complex Models (objects or collections)\n *\n * By default, `ngModel` watches the model by reference, not value. This is important to know when\n * binding inputs to models that are objects (e.g. `Date`) or collections (e.g. arrays). If only properties of the\n * object or collection change, `ngModel` will not be notified and so the input will not be  re-rendered.\n *\n * The model must be assigned an entirely new object or collection before a re-rendering will occur.\n *\n * Some directives have options that will cause them to use a custom `$watchCollection` on the model expression\n * - for example, `ngOptions` will do so when a `track by` clause is included in the comprehension expression or\n * if the select is given the `multiple` attribute.\n *\n * The `$watchCollection()` method only does a shallow comparison, meaning that changing properties deeper than the\n * first level of the object (or only changing the properties of an item in the collection if it's an array) will still\n * not trigger a re-rendering of the model.\n *\n * # CSS classes\n * The following CSS classes are added and removed on the associated input/select/textarea element\n * depending on the validity of the model.\n *\n *  - `ng-valid`: the model is valid\n *  - `ng-invalid`: the model is invalid\n *  - `ng-valid-[key]`: for each valid key added by `$setValidity`\n *  - `ng-invalid-[key]`: for each invalid key added by `$setValidity`\n *  - `ng-pristine`: the control hasn't been interacted with yet\n *  - `ng-dirty`: the control has been interacted with\n *  - `ng-touched`: the control has been blurred\n *  - `ng-untouched`: the control hasn't been blurred\n *  - `ng-pending`: any `$asyncValidators` are unfulfilled\n *  - `ng-empty`: the view does not contain a value or the value is deemed \"empty\", as defined\n *     by the {@link ngModel.NgModelController#$isEmpty} method\n *  - `ng-not-empty`: the view contains a non-empty value\n *\n * Keep in mind that ngAnimate can detect each of these classes when added and removed.\n *\n * ## Animation Hooks\n *\n * Animations within models are triggered when any of the associated CSS classes are added and removed\n * on the input element which is attached to the model. These classes include: `.ng-pristine`, `.ng-dirty`,\n * `.ng-invalid` and `.ng-valid` as well as any other validations that are performed on the model itself.\n * The animations that are triggered within ngModel are similar to how they work in ngClass and\n * animations can be hooked into using CSS transitions, keyframes as well as JS animations.\n *\n * The following example shows a simple way to utilize CSS transitions to style an input element\n * that has been rendered as invalid after it has been validated:\n *\n * <pre>\n * //be sure to include ngAnimate as a module to hook into more\n * //advanced animations\n * .my-input {\n *   transition:0.5s linear all;\n *   background: white;\n * }\n * .my-input.ng-invalid {\n *   background: red;\n *   color:white;\n * }\n * </pre>\n *\n * @example\n * <example deps=\"angular-animate.js\" animations=\"true\" fixBase=\"true\" module=\"inputExample\" name=\"ng-model\">\n     <file name=\"index.ced81ed4.html\">\n       <script>\n        angular.module('inputExample', [])\n          .controller('ExampleController', ['$scope', function($scope) {\n            $scope.val = '1';\n          }]);\n       </script>\n       <style>\n         .my-input {\n           transition:all linear 0.5s;\n           background: transparent;\n         }\n         .my-input.ng-invalid {\n           color:white;\n           background: red;\n         }\n       </style>\n       <p id=\"inputDescription\">\n        Update input to see transitions when valid/invalid.\n        Integer is a valid value.\n       </p>\n       <form name=\"testForm\" ng-controller=\"ExampleController\">\n         <input ng-model=\"val\" ng-pattern=\"/^\\d+$/\" name=\"anim\" class=\"my-input\"\n                aria-describedby=\"inputDescription\" />\n       </form>\n     </file>\n * </example>\n *\n * ## Binding to a getter/setter\n *\n * Sometimes it's helpful to bind `ngModel` to a getter/setter function.  A getter/setter is a\n * function that returns a representation of the model when called with zero arguments, and sets\n * the internal state of a model when called with an argument. It's sometimes useful to use this\n * for models that have an internal representation that's different from what the model exposes\n * to the view.\n *\n * <div class=\"alert alert-success\">\n * **Best Practice:** It's best to keep getters fast because Angular is likely to call them more\n * frequently than other parts of your code.\n * </div>\n *\n * You use this behavior by adding `ng-model-options=\"{ getterSetter: true }\"` to an element that\n * has `ng-model` attached to it. You can also add `ng-model-options=\"{ getterSetter: true }\"` to\n * a `<form>`, which will enable this behavior for all `<input>`s within it. See\n * {@link ng.directive:ngModelOptions `ngModelOptions`} for more.\n *\n * The following example shows how to use `ngModel` with a getter/setter:\n *\n * @example\n * <example name=\"ngModel-getter-setter\" module=\"getterSetterExample\">\n     <file name=\"index.ced81ed4.html\">\n       <div ng-controller=\"ExampleController\">\n         <form name=\"userForm\">\n           <label>Name:\n             <input type=\"text\" name=\"userName\"\n                    ng-model=\"user.name\"\n                    ng-model-options=\"{ getterSetter: true }\" />\n           </label>\n         </form>\n         <pre>user.name = <span ng-bind=\"user.name()\"></span></pre>\n       </div>\n     </file>\n     <file name=\"app.js\">\n       angular.module('getterSetterExample', [])\n         .controller('ExampleController', ['$scope', function($scope) {\n           var _name = 'Brian';\n           $scope.user = {\n             name: function(newName) {\n              // Note that newName can be undefined for two reasons:\n              // 1. Because it is called as a getter and thus called with no arguments\n              // 2. Because the property should actually be set to undefined. This happens e.g. if the\n              //    input is invalid\n              return arguments.length ? (_name = newName) : _name;\n             }\n           };\n         }]);\n     </file>\n * </example>\n */\nvar ngModelDirective = ['$rootScope', function($rootScope) {\n  return {\n    restrict: 'A',\n    require: ['ngModel', '^?form', '^?ngModelOptions'],\n    controller: NgModelController,\n    // Prelink needs to run before any input directive\n    // so that we can set the NgModelOptions in NgModelController\n    // before anyone else uses it.\n    priority: 1,\n    compile: function ngModelCompile(element) {\n      // Setup initial state of the control\n      element.addClass(PRISTINE_CLASS).addClass(UNTOUCHED_CLASS).addClass(VALID_CLASS);\n\n      return {\n        pre: function ngModelPreLink(scope, element, attr, ctrls) {\n          var modelCtrl = ctrls[0],\n              formCtrl = ctrls[1] || modelCtrl.$$parentForm,\n              optionsCtrl = ctrls[2];\n\n          if (optionsCtrl) {\n            modelCtrl.$options = optionsCtrl.$options;\n          }\n\n          modelCtrl.$$initGetterSetters();\n\n          // notify others, especially parent forms\n          formCtrl.$addControl(modelCtrl);\n\n          attr.$observe('name', function(newValue) {\n            if (modelCtrl.$name !== newValue) {\n              modelCtrl.$$parentForm.$$renameControl(modelCtrl, newValue);\n            }\n          });\n\n          scope.$on('$destroy', function() {\n            modelCtrl.$$parentForm.$removeControl(modelCtrl);\n          });\n        },\n        post: function ngModelPostLink(scope, element, attr, ctrls) {\n          var modelCtrl = ctrls[0];\n          if (modelCtrl.$options.getOption('updateOn')) {\n            element.on(modelCtrl.$options.getOption('updateOn'), function(ev) {\n              modelCtrl.$$debounceViewValueCommit(ev && ev.type);\n            });\n          }\n\n          function setTouched() {\n            modelCtrl.$setTouched();\n          }\n\n          element.on('blur', function() {\n            if (modelCtrl.$touched) return;\n\n            if ($rootScope.$$phase) {\n              scope.$evalAsync(setTouched);\n            } else {\n              scope.$apply(setTouched);\n            }\n          });\n        }\n      };\n    }\n  };\n}];\n\n/* exported defaultModelOptions */\nvar defaultModelOptions;\nvar DEFAULT_REGEXP = /(\\s+|^)default(\\s+|$)/;\n\n/**\n * @ngdoc type\n * @name ModelOptions\n * @description\n * A container for the options set by the {@link ngModelOptions} directive\n */\nfunction ModelOptions(options) {\n  this.$$options = options;\n}\n\nModelOptions.prototype = {\n\n  /**\n   * @ngdoc method\n   * @name ModelOptions#getOption\n   * @param {string} name the name of the option to retrieve\n   * @returns {*} the value of the option\n   * @description\n   * Returns the value of the given option\n   */\n  getOption: function(name) {\n    return this.$$options[name];\n  },\n\n  /**\n   * @ngdoc method\n   * @name ModelOptions#createChild\n   * @param {Object} options a hash of options for the new child that will override the parent's options\n   * @return {ModelOptions} a new `ModelOptions` object initialized with the given options.\n   */\n  createChild: function(options) {\n    var inheritAll = false;\n\n    // make a shallow copy\n    options = extend({}, options);\n\n    // Inherit options from the parent if specified by the value `\"$inherit\"`\n    forEach(options, /* @this */ function(option, key) {\n      if (option === '$inherit') {\n        if (key === '*') {\n          inheritAll = true;\n        } else {\n          options[key] = this.$$options[key];\n          // `updateOn` is special so we must also inherit the `updateOnDefault` option\n          if (key === 'updateOn') {\n            options.updateOnDefault = this.$$options.updateOnDefault;\n          }\n        }\n      } else {\n        if (key === 'updateOn') {\n          // If the `updateOn` property contains the `default` event then we have to remove\n          // it from the event list and set the `updateOnDefault` flag.\n          options.updateOnDefault = false;\n          options[key] = trim(option.replace(DEFAULT_REGEXP, function() {\n            options.updateOnDefault = true;\n            return ' ';\n          }));\n        }\n      }\n    }, this);\n\n    if (inheritAll) {\n      // We have a property of the form: `\"*\": \"$inherit\"`\n      delete options['*'];\n      defaults(options, this.$$options);\n    }\n\n    // Finally add in any missing defaults\n    defaults(options, defaultModelOptions.$$options);\n\n    return new ModelOptions(options);\n  }\n};\n\n\ndefaultModelOptions = new ModelOptions({\n  updateOn: '',\n  updateOnDefault: true,\n  debounce: 0,\n  getterSetter: false,\n  allowInvalid: false,\n  timezone: null\n});\n\n\n/**\n * @ngdoc directive\n * @name ngModelOptions\n *\n * @description\n * This directive allows you to modify the behaviour of {@link ngModel} directives within your\n * application. You can specify an `ngModelOptions` directive on any element. All {@link ngModel}\n * directives will use the options of their nearest `ngModelOptions` ancestor.\n *\n * The `ngModelOptions` settings are found by evaluating the value of the attribute directive as\n * an Angular expression. This expression should evaluate to an object, whose properties contain\n * the settings. For example: `<div \"ng-model-options\"=\"{ debounce: 100 }\"`.\n *\n * ## Inheriting Options\n *\n * You can specify that an `ngModelOptions` setting should be inherited from a parent `ngModelOptions`\n * directive by giving it the value of `\"$inherit\"`.\n * Then it will inherit that setting from the first `ngModelOptions` directive found by traversing up the\n * DOM tree. If there is no ancestor element containing an `ngModelOptions` directive then default settings\n * will be used.\n *\n * For example given the following fragment of HTML\n *\n *\n * ```html\n * <div ng-model-options=\"{ allowInvalid: true, debounce: 200 }\">\n *   <form ng-model-options=\"{ updateOn: 'blur', allowInvalid: '$inherit' }\">\n *     <input ng-model-options=\"{ updateOn: 'default', allowInvalid: '$inherit' }\" />\n *   </form>\n * </div>\n * ```\n *\n * the `input` element will have the following settings\n *\n * ```js\n * { allowInvalid: true, updateOn: 'default', debounce: 0 }\n * ```\n *\n * Notice that the `debounce` setting was not inherited and used the default value instead.\n *\n * You can specify that all undefined settings are automatically inherited from an ancestor by\n * including a property with key of `\"*\"` and value of `\"$inherit\"`.\n *\n * For example given the following fragment of HTML\n *\n *\n * ```html\n * <div ng-model-options=\"{ allowInvalid: true, debounce: 200 }\">\n *   <form ng-model-options=\"{ updateOn: 'blur', \"*\": '$inherit' }\">\n *     <input ng-model-options=\"{ updateOn: 'default', \"*\": '$inherit' }\" />\n *   </form>\n * </div>\n * ```\n *\n * the `input` element will have the following settings\n *\n * ```js\n * { allowInvalid: true, updateOn: 'default', debounce: 200 }\n * ```\n *\n * Notice that the `debounce` setting now inherits the value from the outer `<div>` element.\n *\n * If you are creating a reusable component then you should be careful when using `\"*\": \"$inherit\"`\n * since you may inadvertently inherit a setting in the future that changes the behavior of your component.\n *\n *\n * ## Triggering and debouncing model updates\n *\n * The `updateOn` and `debounce` properties allow you to specify a custom list of events that will\n * trigger a model update and/or a debouncing delay so that the actual update only takes place when\n * a timer expires; this timer will be reset after another change takes place.\n *\n * Given the nature of `ngModelOptions`, the value displayed inside input fields in the view might\n * be different from the value in the actual model. This means that if you update the model you\n * should also invoke {@link ngModel.NgModelController#$rollbackViewValue} on the relevant input field in\n * order to make sure it is synchronized with the model and that any debounced action is canceled.\n *\n * The easiest way to reference the control's {@link ngModel.NgModelController#$rollbackViewValue}\n * method is by making sure the input is placed inside a form that has a `name` attribute. This is\n * important because `form` controllers are published to the related scope under the name in their\n * `name` attribute.\n *\n * Any pending changes will take place immediately when an enclosing form is submitted via the\n * `submit` event. Note that `ngClick` events will occur before the model is updated. Use `ngSubmit`\n * to have access to the updated model.\n *\n * The following example shows how to override immediate updates. Changes on the inputs within the\n * form will update the model only when the control loses focus (blur event). If `escape` key is\n * pressed while the input field is focused, the value is reset to the value in the current model.\n *\n * <example name=\"ngModelOptions-directive-blur\" module=\"optionsExample\">\n *   <file name=\"index.ced81ed4.html\">\n *     <div ng-controller=\"ExampleController\">\n *       <form name=\"userForm\">\n *         <label>\n *           Name:\n *           <input type=\"text\" name=\"userName\"\n *                  ng-model=\"user.name\"\n *                  ng-model-options=\"{ updateOn: 'blur' }\"\n *                  ng-keyup=\"cancel($event)\" />\n *         </label><br />\n *         <label>\n *           Other data:\n *           <input type=\"text\" ng-model=\"user.data\" />\n *         </label><br />\n *       </form>\n *       <pre>user.name = <span ng-bind=\"user.name\"></span></pre>\n *     </div>\n *   </file>\n *   <file name=\"app.js\">\n *     angular.module('optionsExample', [])\n *       .controller('ExampleController', ['$scope', function($scope) {\n *         $scope.user = { name: 'say', data: '' };\n *\n *         $scope.cancel = function(e) {\n *           if (e.keyCode === 27) {\n *             $scope.userForm.userName.$rollbackViewValue();\n *           }\n *         };\n *       }]);\n *   </file>\n *   <file name=\"protractor.js\" type=\"protractor\">\n *     var model = element(by.binding('user.name'));\n *     var input = element(by.model('user.name'));\n *     var other = element(by.model('user.data'));\n *\n *     it('should allow custom events', function() {\n *       input.sendKeys(' hello');\n *       input.click();\n *       expect(model.getText()).toEqual('say');\n *       other.click();\n *       expect(model.getText()).toEqual('say hello');\n *     });\n *\n *     it('should $rollbackViewValue when model changes', function() {\n *       input.sendKeys(' hello');\n *       expect(input.getAttribute('value')).toEqual('say hello');\n *       input.sendKeys(protractor.Key.ESCAPE);\n *       expect(input.getAttribute('value')).toEqual('say');\n *       other.click();\n *       expect(model.getText()).toEqual('say');\n *     });\n *   </file>\n * </example>\n *\n * The next example shows how to debounce model changes. Model will be updated only 1 sec after last change.\n * If the `Clear` button is pressed, any debounced action is canceled and the value becomes empty.\n *\n * <example name=\"ngModelOptions-directive-debounce\" module=\"optionsExample\">\n *   <file name=\"index.ced81ed4.html\">\n *     <div ng-controller=\"ExampleController\">\n *       <form name=\"userForm\">\n *         Name:\n *         <input type=\"text\" name=\"userName\"\n *                ng-model=\"user.name\"\n *                ng-model-options=\"{ debounce: 1000 }\" />\n *         <button ng-click=\"userForm.userName.$rollbackViewValue(); user.name=''\">Clear</button><br />\n *       </form>\n *       <pre>user.name = <span ng-bind=\"user.name\"></span></pre>\n *     </div>\n *   </file>\n *   <file name=\"app.js\">\n *     angular.module('optionsExample', [])\n *       .controller('ExampleController', ['$scope', function($scope) {\n *         $scope.user = { name: 'say' };\n *       }]);\n *   </file>\n * </example>\n *\n * ## Model updates and validation\n *\n * The default behaviour in `ngModel` is that the model value is set to `undefined` when the\n * validation determines that the value is invalid. By setting the `allowInvalid` property to true,\n * the model will still be updated even if the value is invalid.\n *\n *\n * ## Connecting to the scope\n *\n * By setting the `getterSetter` property to true you are telling ngModel that the `ngModel` expression\n * on the scope refers to a \"getter/setter\" function rather than the value itself.\n *\n * The following example shows how to bind to getter/setters:\n *\n * <example name=\"ngModelOptions-directive-getter-setter\" module=\"getterSetterExample\">\n *   <file name=\"index.ced81ed4.html\">\n *     <div ng-controller=\"ExampleController\">\n *       <form name=\"userForm\">\n *         <label>\n *           Name:\n *           <input type=\"text\" name=\"userName\"\n *                  ng-model=\"user.name\"\n *                  ng-model-options=\"{ getterSetter: true }\" />\n *         </label>\n *       </form>\n *       <pre>user.name = <span ng-bind=\"user.name()\"></span></pre>\n *     </div>\n *   </file>\n *   <file name=\"app.js\">\n *     angular.module('getterSetterExample', [])\n *       .controller('ExampleController', ['$scope', function($scope) {\n *         var _name = 'Brian';\n *         $scope.user = {\n *           name: function(newName) {\n *             return angular.isDefined(newName) ? (_name = newName) : _name;\n *           }\n *         };\n *       }]);\n *   </file>\n * </example>\n *\n *\n * ## Specifying timezones\n *\n * You can specify the timezone that date/time input directives expect by providing its name in the\n * `timezone` property.\n *\n * @param {Object} ngModelOptions options to apply to {@link ngModel} directives on this element and\n *   and its descendents. Valid keys are:\n *   - `updateOn`: string specifying which event should the input be bound to. You can set several\n *     events using an space delimited list. There is a special event called `default` that\n *     matches the default events belonging to the control.\n *   - `debounce`: integer value which contains the debounce model update value in milliseconds. A\n *     value of 0 triggers an immediate update. If an object is supplied instead, you can specify a\n *     custom value for each event. For example:\n *     ```\n *     ng-model-options=\"{\n *       updateOn: 'default blur',\n *       debounce: { 'default': 500, 'blur': 0 }\n *     }\"\n *     ```\n *   - `allowInvalid`: boolean value which indicates that the model can be set with values that did\n *     not validate correctly instead of the default behavior of setting the model to undefined.\n *   - `getterSetter`: boolean value which determines whether or not to treat functions bound to\n *     `ngModel` as getters/setters.\n *   - `timezone`: Defines the timezone to be used to read/write the `Date` instance in the model for\n *     `<input type=\"date\" />`, `<input type=\"time\" />`, ... . It understands UTC/GMT and the\n *     continental US time zone abbreviations, but for general use, use a time zone offset, for\n *     example, `'+0430'` (4 hours, 30 minutes east of the Greenwich meridian)\n *     If not specified, the timezone of the browser will be used.\n *\n */\nvar ngModelOptionsDirective = function() {\n  NgModelOptionsController.$inject = ['$attrs', '$scope'];\n  function NgModelOptionsController($attrs, $scope) {\n    this.$$attrs = $attrs;\n    this.$$scope = $scope;\n  }\n  NgModelOptionsController.prototype = {\n    $onInit: function() {\n      var parentOptions = this.parentCtrl ? this.parentCtrl.$options : defaultModelOptions;\n      var modelOptionsDefinition = this.$$scope.$eval(this.$$attrs.ngModelOptions);\n\n      this.$options = parentOptions.createChild(modelOptionsDefinition);\n    }\n  };\n\n  return {\n    restrict: 'A',\n    // ngModelOptions needs to run before ngModel and input directives\n    priority: 10,\n    require: {parentCtrl: '?^^ngModelOptions'},\n    bindToController: true,\n    controller: NgModelOptionsController\n  };\n};\n\n\n// shallow copy over values from `src` that are not already specified on `dst`\nfunction defaults(dst, src) {\n  forEach(src, function(value, key) {\n    if (!isDefined(dst[key])) {\n      dst[key] = value;\n    }\n  });\n}\n\n/**\n * @ngdoc directive\n * @name ngNonBindable\n * @restrict AC\n * @priority 1000\n *\n * @description\n * The `ngNonBindable` directive tells Angular not to compile or bind the contents of the current\n * DOM element. This is useful if the element contains what appears to be Angular directives and\n * bindings but which should be ignored by Angular. This could be the case if you have a site that\n * displays snippets of code, for instance.\n *\n * @element ANY\n *\n * @example\n * In this example there are two locations where a simple interpolation binding (`{{}}`) is present,\n * but the one wrapped in `ngNonBindable` is left alone.\n *\n * @example\n    <example name=\"ng-non-bindable\">\n      <file name=\"index.ced81ed4.html\">\n        <div>Normal: {{1 + 2}}</div>\n        <div ng-non-bindable>Ignored: {{1 + 2}}</div>\n      </file>\n      <file name=\"protractor.js\" type=\"protractor\">\n       it('should check ng-non-bindable', function() {\n         expect(element(by.binding('1 + 2')).getText()).toContain('3');\n         expect(element.all(by.css('div')).last().getText()).toMatch(/1 \\+ 2/);\n       });\n      </file>\n    </example>\n */\nvar ngNonBindableDirective = ngDirective({ terminal: true, priority: 1000 });\n\n/* exported ngOptionsDirective */\n\n/* global jqLiteRemove */\n\nvar ngOptionsMinErr = minErr('ngOptions');\n\n/**\n * @ngdoc directive\n * @name ngOptions\n * @restrict A\n *\n * @description\n *\n * The `ngOptions` attribute can be used to dynamically generate a list of `<option>`\n * elements for the `<select>` element using the array or object obtained by evaluating the\n * `ngOptions` comprehension expression.\n *\n * In many cases, {@link ng.directive:ngRepeat ngRepeat} can be used on `<option>` elements instead of\n * `ngOptions` to achieve a similar result. However, `ngOptions` provides some benefits:\n * - more flexibility in how the `<select>`'s model is assigned via the `select` **`as`** part of the\n * comprehension expression\n * - reduced memory consumption by not creating a new scope for each repeated instance\n * - increased render speed by creating the options in a documentFragment instead of individually\n *\n * When an item in the `<select>` menu is selected, the array element or object property\n * represented by the selected option will be bound to the model identified by the `ngModel`\n * directive.\n *\n * Optionally, a single hard-coded `<option>` element, with the value set to an empty string, can\n * be nested into the `<select>` element. This element will then represent the `null` or \"not selected\"\n * option. See example below for demonstration.\n *\n * ## Complex Models (objects or collections)\n *\n * By default, `ngModel` watches the model by reference, not value. This is important to know when\n * binding the select to a model that is an object or a collection.\n *\n * One issue occurs if you want to preselect an option. For example, if you set\n * the model to an object that is equal to an object in your collection, `ngOptions` won't be able to set the selection,\n * because the objects are not identical. So by default, you should always reference the item in your collection\n * for preselections, e.g.: `$scope.selected = $scope.collection[3]`.\n *\n * Another solution is to use a `track by` clause, because then `ngOptions` will track the identity\n * of the item not by reference, but by the result of the `track by` expression. For example, if your\n * collection items have an id property, you would `track by item.id`.\n *\n * A different issue with objects or collections is that ngModel won't detect if an object property or\n * a collection item changes. For that reason, `ngOptions` additionally watches the model using\n * `$watchCollection`, when the expression contains a `track by` clause or the the select has the `multiple` attribute.\n * This allows ngOptions to trigger a re-rendering of the options even if the actual object/collection\n * has not changed identity, but only a property on the object or an item in the collection changes.\n *\n * Note that `$watchCollection` does a shallow comparison of the properties of the object (or the items in the collection\n * if the model is an array). This means that changing a property deeper than the first level inside the\n * object/collection will not trigger a re-rendering.\n *\n * ## `select` **`as`**\n *\n * Using `select` **`as`** will bind the result of the `select` expression to the model, but\n * the value of the `<select>` and `<option>` html elements will be either the index (for array data sources)\n * or property name (for object data sources) of the value within the collection. If a **`track by`** expression\n * is used, the result of that expression will be set as the value of the `option` and `select` elements.\n *\n *\n * ### `select` **`as`** and **`track by`**\n *\n * <div class=\"alert alert-warning\">\n * Be careful when using `select` **`as`** and **`track by`** in the same expression.\n * </div>\n *\n * Given this array of items on the $scope:\n *\n * ```js\n * $scope.items = [{\n *   id: 1,\n *   label: 'aLabel',\n *   subItem: { name: 'aSubItem' }\n * }, {\n *   id: 2,\n *   label: 'bLabel',\n *   subItem: { name: 'bSubItem' }\n * }];\n * ```\n *\n * This will work:\n *\n * ```html\n * <select ng-options=\"item as item.label for item in items track by item.id\" ng-model=\"selected\"></select>\n * ```\n * ```js\n * $scope.selected = $scope.items[0];\n * ```\n *\n * but this will not work:\n *\n * ```html\n * <select ng-options=\"item.subItem as item.label for item in items track by item.id\" ng-model=\"selected\"></select>\n * ```\n * ```js\n * $scope.selected = $scope.items[0].subItem;\n * ```\n *\n * In both examples, the **`track by`** expression is applied successfully to each `item` in the\n * `items` array. Because the selected option has been set programmatically in the controller, the\n * **`track by`** expression is also applied to the `ngModel` value. In the first example, the\n * `ngModel` value is `items[0]` and the **`track by`** expression evaluates to `items[0].id` with\n * no issue. In the second example, the `ngModel` value is `items[0].subItem` and the **`track by`**\n * expression evaluates to `items[0].subItem.id` (which is undefined). As a result, the model value\n * is not matched against any `<option>` and the `<select>` appears as having no selected value.\n *\n *\n * @param {string} ngModel Assignable AngularJS expression to data-bind to.\n * @param {comprehension_expression} ngOptions in one of the following forms:\n *\n *   * for array data sources:\n *     * `label` **`for`** `value` **`in`** `array`\n *     * `select` **`as`** `label` **`for`** `value` **`in`** `array`\n *     * `label` **`group by`** `group` **`for`** `value` **`in`** `array`\n *     * `label` **`disable when`** `disable` **`for`** `value` **`in`** `array`\n *     * `label` **`group by`** `group` **`for`** `value` **`in`** `array` **`track by`** `trackexpr`\n *     * `label` **`disable when`** `disable` **`for`** `value` **`in`** `array` **`track by`** `trackexpr`\n *     * `label` **`for`** `value` **`in`** `array` | orderBy:`orderexpr` **`track by`** `trackexpr`\n *        (for including a filter with `track by`)\n *   * for object data sources:\n *     * `label` **`for (`**`key` **`,`** `value`**`) in`** `object`\n *     * `select` **`as`** `label` **`for (`**`key` **`,`** `value`**`) in`** `object`\n *     * `label` **`group by`** `group` **`for (`**`key`**`,`** `value`**`) in`** `object`\n *     * `label` **`disable when`** `disable` **`for (`**`key`**`,`** `value`**`) in`** `object`\n *     * `select` **`as`** `label` **`group by`** `group`\n *         **`for` `(`**`key`**`,`** `value`**`) in`** `object`\n *     * `select` **`as`** `label` **`disable when`** `disable`\n *         **`for` `(`**`key`**`,`** `value`**`) in`** `object`\n *\n * Where:\n *\n *   * `array` / `object`: an expression which evaluates to an array / object to iterate over.\n *   * `value`: local variable which will refer to each item in the `array` or each property value\n *      of `object` during iteration.\n *   * `key`: local variable which will refer to a property name in `object` during iteration.\n *   * `label`: The result of this expression will be the label for `<option>` element. The\n *     `expression` will most likely refer to the `value` variable (e.g. `value.propertyName`).\n *   * `select`: The result of this expression will be bound to the model of the parent `<select>`\n *      element. If not specified, `select` expression will default to `value`.\n *   * `group`: The result of this expression will be used to group options using the `<optgroup>`\n *      DOM element.\n *   * `disable`: The result of this expression will be used to disable the rendered `<option>`\n *      element. Return `true` to disable.\n *   * `trackexpr`: Used when working with an array of objects. The result of this expression will be\n *      used to identify the objects in the array. The `trackexpr` will most likely refer to the\n *     `value` variable (e.g. `value.propertyName`). With this the selection is preserved\n *      even when the options are recreated (e.g. reloaded from the server).\n * @param {string=} name Property name of the form under which the control is published.\n * @param {string=} required The control is considered valid only if value is entered.\n * @param {string=} ngRequired Adds `required` attribute and `required` validation constraint to\n *    the element when the ngRequired expression evaluates to true. Use `ngRequired` instead of\n *    `required` when you want to data-bind to the `required` attribute.\n * @param {string=} ngAttrSize sets the size of the select element dynamically. Uses the\n * {@link guide/interpolation#-ngattr-for-binding-to-arbitrary-attributes ngAttr} directive.\n *\n * @example\n    <example module=\"selectExample\" name=\"select\">\n      <file name=\"index.ced81ed4.html\">\n        <script>\n        angular.module('selectExample', [])\n          .controller('ExampleController', ['$scope', function($scope) {\n            $scope.colors = [\n              {name:'black', shade:'dark'},\n              {name:'white', shade:'light', notAnOption: true},\n              {name:'red', shade:'dark'},\n              {name:'blue', shade:'dark', notAnOption: true},\n              {name:'yellow', shade:'light', notAnOption: false}\n            ];\n            $scope.myColor = $scope.colors[2]; // red\n          }]);\n        </script>\n        <div ng-controller=\"ExampleController\">\n          <ul>\n            <li ng-repeat=\"color in colors\">\n              <label>Name: <input ng-model=\"color.name\"></label>\n              <label><input type=\"checkbox\" ng-model=\"color.notAnOption\"> Disabled?</label>\n              <button ng-click=\"colors.splice($index, 1)\" aria-label=\"Remove\">X</button>\n            </li>\n            <li>\n              <button ng-click=\"colors.push({})\">add</button>\n            </li>\n          </ul>\n          <hr/>\n          <label>Color (null not allowed):\n            <select ng-model=\"myColor\" ng-options=\"color.name for color in colors\"></select>\n          </label><br/>\n          <label>Color (null allowed):\n          <span  class=\"nullable\">\n            <select ng-model=\"myColor\" ng-options=\"color.name for color in colors\">\n              <option value=\"\">-- choose color --</option>\n            </select>\n          </span></label><br/>\n\n          <label>Color grouped by shade:\n            <select ng-model=\"myColor\" ng-options=\"color.name group by color.shade for color in colors\">\n            </select>\n          </label><br/>\n\n          <label>Color grouped by shade, with some disabled:\n            <select ng-model=\"myColor\"\n                  ng-options=\"color.name group by color.shade disable when color.notAnOption for color in colors\">\n            </select>\n          </label><br/>\n\n\n\n          Select <button ng-click=\"myColor = { name:'not in list', shade: 'other' }\">bogus</button>.\n          <br/>\n          <hr/>\n          Currently selected: {{ {selected_color:myColor} }}\n          <div style=\"border:solid 1px black; height:20px\"\n               ng-style=\"{'background-color':myColor.name}\">\n          </div>\n        </div>\n      </file>\n      <file name=\"protractor.js\" type=\"protractor\">\n         it('should check ng-options', function() {\n           expect(element(by.binding('{selected_color:myColor}')).getText()).toMatch('red');\n           element.all(by.model('myColor')).first().click();\n           element.all(by.css('select[ng-model=\"myColor\"] option')).first().click();\n           expect(element(by.binding('{selected_color:myColor}')).getText()).toMatch('black');\n           element(by.css('.nullable select[ng-model=\"myColor\"]')).click();\n           element.all(by.css('.nullable select[ng-model=\"myColor\"] option')).first().click();\n           expect(element(by.binding('{selected_color:myColor}')).getText()).toMatch('null');\n         });\n      </file>\n    </example>\n */\n\n/* eslint-disable max-len */\n//                     //00001111111111000000000002222222222000000000000000000000333333333300000000000000000000000004444444444400000000000005555555555555000000000666666666666600000007777777777777000000000000000888888888800000000000000000009999999999\nvar NG_OPTIONS_REGEXP = /^\\s*([\\s\\S]+?)(?:\\s+as\\s+([\\s\\S]+?))?(?:\\s+group\\s+by\\s+([\\s\\S]+?))?(?:\\s+disable\\s+when\\s+([\\s\\S]+?))?\\s+for\\s+(?:([$\\w][$\\w]*)|(?:\\(\\s*([$\\w][$\\w]*)\\s*,\\s*([$\\w][$\\w]*)\\s*\\)))\\s+in\\s+([\\s\\S]+?)(?:\\s+track\\s+by\\s+([\\s\\S]+?))?$/;\n                        // 1: value expression (valueFn)\n                        // 2: label expression (displayFn)\n                        // 3: group by expression (groupByFn)\n                        // 4: disable when expression (disableWhenFn)\n                        // 5: array item variable name\n                        // 6: object item key variable name\n                        // 7: object item value variable name\n                        // 8: collection expression\n                        // 9: track by expression\n/* eslint-enable */\n\n\nvar ngOptionsDirective = ['$compile', '$document', '$parse', function($compile, $document, $parse) {\n\n  function parseOptionsExpression(optionsExp, selectElement, scope) {\n\n    var match = optionsExp.match(NG_OPTIONS_REGEXP);\n    if (!(match)) {\n      throw ngOptionsMinErr('iexp',\n        'Expected expression in form of ' +\n        '\\'_select_ (as _label_)? for (_key_,)?_value_ in _collection_\\'' +\n        ' but got \\'{0}\\'. Element: {1}',\n        optionsExp, startingTag(selectElement));\n    }\n\n    // Extract the parts from the ngOptions expression\n\n    // The variable name for the value of the item in the collection\n    var valueName = match[5] || match[7];\n    // The variable name for the key of the item in the collection\n    var keyName = match[6];\n\n    // An expression that generates the viewValue for an option if there is a label expression\n    var selectAs = / as /.test(match[0]) && match[1];\n    // An expression that is used to track the id of each object in the options collection\n    var trackBy = match[9];\n    // An expression that generates the viewValue for an option if there is no label expression\n    var valueFn = $parse(match[2] ? match[1] : valueName);\n    var selectAsFn = selectAs && $parse(selectAs);\n    var viewValueFn = selectAsFn || valueFn;\n    var trackByFn = trackBy && $parse(trackBy);\n\n    // Get the value by which we are going to track the option\n    // if we have a trackFn then use that (passing scope and locals)\n    // otherwise just hash the given viewValue\n    var getTrackByValueFn = trackBy ?\n                              function(value, locals) { return trackByFn(scope, locals); } :\n                              function getHashOfValue(value) { return hashKey(value); };\n    var getTrackByValue = function(value, key) {\n      return getTrackByValueFn(value, getLocals(value, key));\n    };\n\n    var displayFn = $parse(match[2] || match[1]);\n    var groupByFn = $parse(match[3] || '');\n    var disableWhenFn = $parse(match[4] || '');\n    var valuesFn = $parse(match[8]);\n\n    var locals = {};\n    var getLocals = keyName ? function(value, key) {\n      locals[keyName] = key;\n      locals[valueName] = value;\n      return locals;\n    } : function(value) {\n      locals[valueName] = value;\n      return locals;\n    };\n\n\n    function Option(selectValue, viewValue, label, group, disabled) {\n      this.selectValue = selectValue;\n      this.viewValue = viewValue;\n      this.label = label;\n      this.group = group;\n      this.disabled = disabled;\n    }\n\n    function getOptionValuesKeys(optionValues) {\n      var optionValuesKeys;\n\n      if (!keyName && isArrayLike(optionValues)) {\n        optionValuesKeys = optionValues;\n      } else {\n        // if object, extract keys, in enumeration order, unsorted\n        optionValuesKeys = [];\n        for (var itemKey in optionValues) {\n          if (optionValues.hasOwnProperty(itemKey) && itemKey.charAt(0) !== '$') {\n            optionValuesKeys.push(itemKey);\n          }\n        }\n      }\n      return optionValuesKeys;\n    }\n\n    return {\n      trackBy: trackBy,\n      getTrackByValue: getTrackByValue,\n      getWatchables: $parse(valuesFn, function(optionValues) {\n        // Create a collection of things that we would like to watch (watchedArray)\n        // so that they can all be watched using a single $watchCollection\n        // that only runs the handler once if anything changes\n        var watchedArray = [];\n        optionValues = optionValues || [];\n\n        var optionValuesKeys = getOptionValuesKeys(optionValues);\n        var optionValuesLength = optionValuesKeys.length;\n        for (var index = 0; index < optionValuesLength; index++) {\n          var key = (optionValues === optionValuesKeys) ? index : optionValuesKeys[index];\n          var value = optionValues[key];\n\n          var locals = getLocals(value, key);\n          var selectValue = getTrackByValueFn(value, locals);\n          watchedArray.push(selectValue);\n\n          // Only need to watch the displayFn if there is a specific label expression\n          if (match[2] || match[1]) {\n            var label = displayFn(scope, locals);\n            watchedArray.push(label);\n          }\n\n          // Only need to watch the disableWhenFn if there is a specific disable expression\n          if (match[4]) {\n            var disableWhen = disableWhenFn(scope, locals);\n            watchedArray.push(disableWhen);\n          }\n        }\n        return watchedArray;\n      }),\n\n      getOptions: function() {\n\n        var optionItems = [];\n        var selectValueMap = {};\n\n        // The option values were already computed in the `getWatchables` fn,\n        // which must have been called to trigger `getOptions`\n        var optionValues = valuesFn(scope) || [];\n        var optionValuesKeys = getOptionValuesKeys(optionValues);\n        var optionValuesLength = optionValuesKeys.length;\n\n        for (var index = 0; index < optionValuesLength; index++) {\n          var key = (optionValues === optionValuesKeys) ? index : optionValuesKeys[index];\n          var value = optionValues[key];\n          var locals = getLocals(value, key);\n          var viewValue = viewValueFn(scope, locals);\n          var selectValue = getTrackByValueFn(viewValue, locals);\n          var label = displayFn(scope, locals);\n          var group = groupByFn(scope, locals);\n          var disabled = disableWhenFn(scope, locals);\n          var optionItem = new Option(selectValue, viewValue, label, group, disabled);\n\n          optionItems.push(optionItem);\n          selectValueMap[selectValue] = optionItem;\n        }\n\n        return {\n          items: optionItems,\n          selectValueMap: selectValueMap,\n          getOptionFromViewValue: function(value) {\n            return selectValueMap[getTrackByValue(value)];\n          },\n          getViewValueFromOption: function(option) {\n            // If the viewValue could be an object that may be mutated by the application,\n            // we need to make a copy and not return the reference to the value on the option.\n            return trackBy ? copy(option.viewValue) : option.viewValue;\n          }\n        };\n      }\n    };\n  }\n\n\n  // we can't just jqLite('<option>') since jqLite is not smart enough\n  // to create it in <select> and IE barfs otherwise.\n  var optionTemplate = window.document.createElement('option'),\n      optGroupTemplate = window.document.createElement('optgroup');\n\n    function ngOptionsPostLink(scope, selectElement, attr, ctrls) {\n\n      var selectCtrl = ctrls[0];\n      var ngModelCtrl = ctrls[1];\n      var multiple = attr.multiple;\n\n      // The emptyOption allows the application developer to provide their own custom \"empty\"\n      // option when the viewValue does not match any of the option values.\n      for (var i = 0, children = selectElement.children(), ii = children.length; i < ii; i++) {\n        if (children[i].value === '') {\n          selectCtrl.hasEmptyOption = true;\n          selectCtrl.emptyOption = children.eq(i);\n          break;\n        }\n      }\n\n      var providedEmptyOption = !!selectCtrl.emptyOption;\n\n      var unknownOption = jqLite(optionTemplate.cloneNode(false));\n      unknownOption.val('?');\n\n      var options;\n      var ngOptions = parseOptionsExpression(attr.ngOptions, selectElement, scope);\n      // This stores the newly created options before they are appended to the select.\n      // Since the contents are removed from the fragment when it is appended,\n      // we only need to create it once.\n      var listFragment = $document[0].createDocumentFragment();\n\n      // Overwrite the implementation. ngOptions doesn't use hashes\n      selectCtrl.generateUnknownOptionValue = function(val) {\n        return '?';\n      };\n\n      // Update the controller methods for multiple selectable options\n      if (!multiple) {\n\n        selectCtrl.writeValue = function writeNgOptionsValue(value) {\n          var selectedOption = options.selectValueMap[selectElement.val()];\n          var option = options.getOptionFromViewValue(value);\n\n          // Make sure to remove the selected attribute from the previously selected option\n          // Otherwise, screen readers might get confused\n          if (selectedOption) selectedOption.element.removeAttribute('selected');\n\n          if (option) {\n            // Don't update the option when it is already selected.\n            // For example, the browser will select the first option by default. In that case,\n            // most properties are set automatically - except the `selected` attribute, which we\n            // set always\n\n            if (selectElement[0].value !== option.selectValue) {\n              selectCtrl.removeUnknownOption();\n              selectCtrl.unselectEmptyOption();\n\n              selectElement[0].value = option.selectValue;\n              option.element.selected = true;\n            }\n\n            option.element.setAttribute('selected', 'selected');\n          } else {\n\n            if (providedEmptyOption) {\n              selectCtrl.selectEmptyOption();\n            } else if (selectCtrl.unknownOption.parent().length) {\n              selectCtrl.updateUnknownOption(value);\n            } else {\n              selectCtrl.renderUnknownOption(value);\n            }\n          }\n        };\n\n        selectCtrl.readValue = function readNgOptionsValue() {\n\n          var selectedOption = options.selectValueMap[selectElement.val()];\n\n          if (selectedOption && !selectedOption.disabled) {\n            selectCtrl.unselectEmptyOption();\n            selectCtrl.removeUnknownOption();\n            return options.getViewValueFromOption(selectedOption);\n          }\n          return null;\n        };\n\n        // If we are using `track by` then we must watch the tracked value on the model\n        // since ngModel only watches for object identity change\n        // FIXME: When a user selects an option, this watch will fire needlessly\n        if (ngOptions.trackBy) {\n          scope.$watch(\n            function() { return ngOptions.getTrackByValue(ngModelCtrl.$viewValue); },\n            function() { ngModelCtrl.$render(); }\n          );\n        }\n\n      } else {\n\n        selectCtrl.writeValue = function writeNgOptionsMultiple(values) {\n          // Only set `<option>.selected` if necessary, in order to prevent some browsers from\n          // scrolling to `<option>` elements that are outside the `<select>` element's viewport.\n\n          var selectedOptions = values && values.map(getAndUpdateSelectedOption) || [];\n\n          options.items.forEach(function(option) {\n            if (option.element.selected && !includes(selectedOptions, option)) {\n              option.element.selected = false;\n            }\n          });\n        };\n\n\n        selectCtrl.readValue = function readNgOptionsMultiple() {\n          var selectedValues = selectElement.val() || [],\n              selections = [];\n\n          forEach(selectedValues, function(value) {\n            var option = options.selectValueMap[value];\n            if (option && !option.disabled) selections.push(options.getViewValueFromOption(option));\n          });\n\n          return selections;\n        };\n\n        // If we are using `track by` then we must watch these tracked values on the model\n        // since ngModel only watches for object identity change\n        if (ngOptions.trackBy) {\n\n          scope.$watchCollection(function() {\n            if (isArray(ngModelCtrl.$viewValue)) {\n              return ngModelCtrl.$viewValue.map(function(value) {\n                return ngOptions.getTrackByValue(value);\n              });\n            }\n          }, function() {\n            ngModelCtrl.$render();\n          });\n\n        }\n      }\n\n      if (providedEmptyOption) {\n\n        // we need to remove it before calling selectElement.empty() because otherwise IE will\n        // remove the label from the element. wtf?\n        selectCtrl.emptyOption.remove();\n\n        // compile the element since there might be bindings in it\n        $compile(selectCtrl.emptyOption)(scope);\n\n        if (selectCtrl.emptyOption[0].nodeType === NODE_TYPE_COMMENT) {\n          // This means the empty option has currently no actual DOM node, probably because\n          // it has been modified by a transclusion directive.\n          selectCtrl.hasEmptyOption = false;\n\n          // Redefine the registerOption function, which will catch\n          // options that are added by ngIf etc. (rendering of the node is async because of\n          // lazy transclusion)\n          selectCtrl.registerOption = function(optionScope, optionEl) {\n            if (optionEl.val() === '') {\n              selectCtrl.hasEmptyOption = true;\n              selectCtrl.emptyOption = optionEl;\n              selectCtrl.emptyOption.removeClass('ng-scope');\n              // This ensures the new empty option is selected if previously no option was selected\n              ngModelCtrl.$render();\n\n              optionEl.on('$destroy', function() {\n                selectCtrl.hasEmptyOption = false;\n                selectCtrl.emptyOption = undefined;\n              });\n            }\n          };\n\n        } else {\n          // remove the class, which is added automatically because we recompile the element and it\n          // becomes the compilation root\n          selectCtrl.emptyOption.removeClass('ng-scope');\n        }\n\n      }\n\n      selectElement.empty();\n\n      // We need to do this here to ensure that the options object is defined\n      // when we first hit it in writeNgOptionsValue\n      updateOptions();\n\n      // We will re-render the option elements if the option values or labels change\n      scope.$watchCollection(ngOptions.getWatchables, updateOptions);\n\n      // ------------------------------------------------------------------ //\n\n      function addOptionElement(option, parent) {\n        var optionElement = optionTemplate.cloneNode(false);\n        parent.appendChild(optionElement);\n        updateOptionElement(option, optionElement);\n      }\n\n      function getAndUpdateSelectedOption(viewValue) {\n        var option = options.getOptionFromViewValue(viewValue);\n        var element = option && option.element;\n\n        if (element && !element.selected) element.selected = true;\n\n        return option;\n      }\n\n      function updateOptionElement(option, element) {\n        option.element = element;\n        element.disabled = option.disabled;\n        // NOTE: The label must be set before the value, otherwise IE10/11/EDGE create unresponsive\n        // selects in certain circumstances when multiple selects are next to each other and display\n        // the option list in listbox style, i.e. the select is [multiple], or specifies a [size].\n        // See https://github.com/angular/angular.js/issues/11314 for more info.\n        // This is unfortunately untestable with unit / e2e tests\n        if (option.label !== element.label) {\n          element.label = option.label;\n          element.textContent = option.label;\n        }\n        element.value = option.selectValue;\n      }\n\n      function updateOptions() {\n        var previousValue = options && selectCtrl.readValue();\n\n        // We must remove all current options, but cannot simply set innerHTML = null\n        // since the providedEmptyOption might have an ngIf on it that inserts comments which we\n        // must preserve.\n        // Instead, iterate over the current option elements and remove them or their optgroup\n        // parents\n        if (options) {\n\n          for (var i = options.items.length - 1; i >= 0; i--) {\n            var option = options.items[i];\n            if (isDefined(option.group)) {\n              jqLiteRemove(option.element.parentNode);\n            } else {\n              jqLiteRemove(option.element);\n            }\n          }\n        }\n\n        options = ngOptions.getOptions();\n\n        var groupElementMap = {};\n\n        // Ensure that the empty option is always there if it was explicitly provided\n        if (providedEmptyOption) {\n          selectElement.prepend(selectCtrl.emptyOption);\n        }\n\n        options.items.forEach(function addOption(option) {\n          var groupElement;\n\n          if (isDefined(option.group)) {\n\n            // This option is to live in a group\n            // See if we have already created this group\n            groupElement = groupElementMap[option.group];\n\n            if (!groupElement) {\n\n              groupElement = optGroupTemplate.cloneNode(false);\n              listFragment.appendChild(groupElement);\n\n              // Update the label on the group element\n              // \"null\" is special cased because of Safari\n              groupElement.label = option.group === null ? 'null' : option.group;\n\n              // Store it for use later\n              groupElementMap[option.group] = groupElement;\n            }\n\n            addOptionElement(option, groupElement);\n\n          } else {\n\n            // This option is not in a group\n            addOptionElement(option, listFragment);\n          }\n        });\n\n        selectElement[0].appendChild(listFragment);\n\n        ngModelCtrl.$render();\n\n        // Check to see if the value has changed due to the update to the options\n        if (!ngModelCtrl.$isEmpty(previousValue)) {\n          var nextValue = selectCtrl.readValue();\n          var isNotPrimitive = ngOptions.trackBy || multiple;\n          if (isNotPrimitive ? !equals(previousValue, nextValue) : previousValue !== nextValue) {\n            ngModelCtrl.$setViewValue(nextValue);\n            ngModelCtrl.$render();\n          }\n        }\n\n      }\n  }\n\n  return {\n    restrict: 'A',\n    terminal: true,\n    require: ['select', 'ngModel'],\n    link: {\n      pre: function ngOptionsPreLink(scope, selectElement, attr, ctrls) {\n        // Deactivate the SelectController.register method to prevent\n        // option directives from accidentally registering themselves\n        // (and unwanted $destroy handlers etc.)\n        ctrls[0].registerOption = noop;\n      },\n      post: ngOptionsPostLink\n    }\n  };\n}];\n\n/**\n * @ngdoc directive\n * @name ngPluralize\n * @restrict EA\n *\n * @description\n * `ngPluralize` is a directive that displays messages according to en-US localization rules.\n * These rules are bundled with angular.js, but can be overridden\n * (see {@link guide/i18n Angular i18n} dev guide). You configure ngPluralize directive\n * by specifying the mappings between\n * [plural categories](http://unicode.org/repos/cldr-tmp/trunk/diff/supplemental/language_plural_rules.html)\n * and the strings to be displayed.\n *\n * # Plural categories and explicit number rules\n * There are two\n * [plural categories](http://unicode.org/repos/cldr-tmp/trunk/diff/supplemental/language_plural_rules.html)\n * in Angular's default en-US locale: \"one\" and \"other\".\n *\n * While a plural category may match many numbers (for example, in en-US locale, \"other\" can match\n * any number that is not 1), an explicit number rule can only match one number. For example, the\n * explicit number rule for \"3\" matches the number 3. There are examples of plural categories\n * and explicit number rules throughout the rest of this documentation.\n *\n * # Configuring ngPluralize\n * You configure ngPluralize by providing 2 attributes: `count` and `when`.\n * You can also provide an optional attribute, `offset`.\n *\n * The value of the `count` attribute can be either a string or an {@link guide/expression\n * Angular expression}; these are evaluated on the current scope for its bound value.\n *\n * The `when` attribute specifies the mappings between plural categories and the actual\n * string to be displayed. The value of the attribute should be a JSON object.\n *\n * The following example shows how to configure ngPluralize:\n *\n * ```html\n * <ng-pluralize count=\"personCount\"\n                 when=\"{'0': 'Nobody is viewing.',\n *                      'one': '1 person is viewing.',\n *                      'other': '{} people are viewing.'}\">\n * </ng-pluralize>\n *```\n *\n * In the example, `\"0: Nobody is viewing.\"` is an explicit number rule. If you did not\n * specify this rule, 0 would be matched to the \"other\" category and \"0 people are viewing\"\n * would be shown instead of \"Nobody is viewing\". You can specify an explicit number rule for\n * other numbers, for example 12, so that instead of showing \"12 people are viewing\", you can\n * show \"a dozen people are viewing\".\n *\n * You can use a set of closed braces (`{}`) as a placeholder for the number that you want substituted\n * into pluralized strings. In the previous example, Angular will replace `{}` with\n * <span ng-non-bindable>`{{personCount}}`</span>. The closed braces `{}` is a placeholder\n * for <span ng-non-bindable>{{numberExpression}}</span>.\n *\n * If no rule is defined for a category, then an empty string is displayed and a warning is generated.\n * Note that some locales define more categories than `one` and `other`. For example, fr-fr defines `few` and `many`.\n *\n * # Configuring ngPluralize with offset\n * The `offset` attribute allows further customization of pluralized text, which can result in\n * a better user experience. For example, instead of the message \"4 people are viewing this document\",\n * you might display \"John, Kate and 2 others are viewing this document\".\n * The offset attribute allows you to offset a number by any desired value.\n * Let's take a look at an example:\n *\n * ```html\n * <ng-pluralize count=\"personCount\" offset=2\n *               when=\"{'0': 'Nobody is viewing.',\n *                      '1': '{{person1}} is viewing.',\n *                      '2': '{{person1}} and {{person2}} are viewing.',\n *                      'one': '{{person1}}, {{person2}} and one other person are viewing.',\n *                      'other': '{{person1}}, {{person2}} and {} other people are viewing.'}\">\n * </ng-pluralize>\n * ```\n *\n * Notice that we are still using two plural categories(one, other), but we added\n * three explicit number rules 0, 1 and 2.\n * When one person, perhaps John, views the document, \"John is viewing\" will be shown.\n * When three people view the document, no explicit number rule is found, so\n * an offset of 2 is taken off 3, and Angular uses 1 to decide the plural category.\n * In this case, plural category 'one' is matched and \"John, Mary and one other person are viewing\"\n * is shown.\n *\n * Note that when you specify offsets, you must provide explicit number rules for\n * numbers from 0 up to and including the offset. If you use an offset of 3, for example,\n * you must provide explicit number rules for 0, 1, 2 and 3. You must also provide plural strings for\n * plural categories \"one\" and \"other\".\n *\n * @param {string|expression} count The variable to be bound to.\n * @param {string} when The mapping between plural category to its corresponding strings.\n * @param {number=} offset Offset to deduct from the total number.\n *\n * @example\n    <example module=\"pluralizeExample\" name=\"ng-pluralize\">\n      <file name=\"index.ced81ed4.html\">\n        <script>\n          angular.module('pluralizeExample', [])\n            .controller('ExampleController', ['$scope', function($scope) {\n              $scope.person1 = 'Igor';\n              $scope.person2 = 'Misko';\n              $scope.personCount = 1;\n            }]);\n        </script>\n        <div ng-controller=\"ExampleController\">\n          <label>Person 1:<input type=\"text\" ng-model=\"person1\" value=\"Igor\" /></label><br/>\n          <label>Person 2:<input type=\"text\" ng-model=\"person2\" value=\"Misko\" /></label><br/>\n          <label>Number of People:<input type=\"text\" ng-model=\"personCount\" value=\"1\" /></label><br/>\n\n          <!--- Example with simple pluralization rules for en locale --->\n          Without Offset:\n          <ng-pluralize count=\"personCount\"\n                        when=\"{'0': 'Nobody is viewing.',\n                               'one': '1 person is viewing.',\n                               'other': '{} people are viewing.'}\">\n          </ng-pluralize><br>\n\n          <!--- Example with offset --->\n          With Offset(2):\n          <ng-pluralize count=\"personCount\" offset=2\n                        when=\"{'0': 'Nobody is viewing.',\n                               '1': '{{person1}} is viewing.',\n                               '2': '{{person1}} and {{person2}} are viewing.',\n                               'one': '{{person1}}, {{person2}} and one other person are viewing.',\n                               'other': '{{person1}}, {{person2}} and {} other people are viewing.'}\">\n          </ng-pluralize>\n        </div>\n      </file>\n      <file name=\"protractor.js\" type=\"protractor\">\n        it('should show correct pluralized string', function() {\n          var withoutOffset = element.all(by.css('ng-pluralize')).get(0);\n          var withOffset = element.all(by.css('ng-pluralize')).get(1);\n          var countInput = element(by.model('personCount'));\n\n          expect(withoutOffset.getText()).toEqual('1 person is viewing.');\n          expect(withOffset.getText()).toEqual('Igor is viewing.');\n\n          countInput.clear();\n          countInput.sendKeys('0');\n\n          expect(withoutOffset.getText()).toEqual('Nobody is viewing.');\n          expect(withOffset.getText()).toEqual('Nobody is viewing.');\n\n          countInput.clear();\n          countInput.sendKeys('2');\n\n          expect(withoutOffset.getText()).toEqual('2 people are viewing.');\n          expect(withOffset.getText()).toEqual('Igor and Misko are viewing.');\n\n          countInput.clear();\n          countInput.sendKeys('3');\n\n          expect(withoutOffset.getText()).toEqual('3 people are viewing.');\n          expect(withOffset.getText()).toEqual('Igor, Misko and one other person are viewing.');\n\n          countInput.clear();\n          countInput.sendKeys('4');\n\n          expect(withoutOffset.getText()).toEqual('4 people are viewing.');\n          expect(withOffset.getText()).toEqual('Igor, Misko and 2 other people are viewing.');\n        });\n        it('should show data-bound names', function() {\n          var withOffset = element.all(by.css('ng-pluralize')).get(1);\n          var personCount = element(by.model('personCount'));\n          var person1 = element(by.model('person1'));\n          var person2 = element(by.model('person2'));\n          personCount.clear();\n          personCount.sendKeys('4');\n          person1.clear();\n          person1.sendKeys('Di');\n          person2.clear();\n          person2.sendKeys('Vojta');\n          expect(withOffset.getText()).toEqual('Di, Vojta and 2 other people are viewing.');\n        });\n      </file>\n    </example>\n */\nvar ngPluralizeDirective = ['$locale', '$interpolate', '$log', function($locale, $interpolate, $log) {\n  var BRACE = /{}/g,\n      IS_WHEN = /^when(Minus)?(.+)$/;\n\n  return {\n    link: function(scope, element, attr) {\n      var numberExp = attr.count,\n          whenExp = attr.$attr.when && element.attr(attr.$attr.when), // we have {{}} in attrs\n          offset = attr.offset || 0,\n          whens = scope.$eval(whenExp) || {},\n          whensExpFns = {},\n          startSymbol = $interpolate.startSymbol(),\n          endSymbol = $interpolate.endSymbol(),\n          braceReplacement = startSymbol + numberExp + '-' + offset + endSymbol,\n          watchRemover = angular.noop,\n          lastCount;\n\n      forEach(attr, function(expression, attributeName) {\n        var tmpMatch = IS_WHEN.exec(attributeName);\n        if (tmpMatch) {\n          var whenKey = (tmpMatch[1] ? '-' : '') + lowercase(tmpMatch[2]);\n          whens[whenKey] = element.attr(attr.$attr[attributeName]);\n        }\n      });\n      forEach(whens, function(expression, key) {\n        whensExpFns[key] = $interpolate(expression.replace(BRACE, braceReplacement));\n\n      });\n\n      scope.$watch(numberExp, function ngPluralizeWatchAction(newVal) {\n        var count = parseFloat(newVal);\n        var countIsNaN = isNumberNaN(count);\n\n        if (!countIsNaN && !(count in whens)) {\n          // If an explicit number rule such as 1, 2, 3... is defined, just use it.\n          // Otherwise, check it against pluralization rules in $locale service.\n          count = $locale.pluralCat(count - offset);\n        }\n\n        // If both `count` and `lastCount` are NaN, we don't need to re-register a watch.\n        // In JS `NaN !== NaN`, so we have to explicitly check.\n        if ((count !== lastCount) && !(countIsNaN && isNumberNaN(lastCount))) {\n          watchRemover();\n          var whenExpFn = whensExpFns[count];\n          if (isUndefined(whenExpFn)) {\n            if (newVal != null) {\n              $log.debug('ngPluralize: no rule defined for \\'' + count + '\\' in ' + whenExp);\n            }\n            watchRemover = noop;\n            updateElementText();\n          } else {\n            watchRemover = scope.$watch(whenExpFn, updateElementText);\n          }\n          lastCount = count;\n        }\n      });\n\n      function updateElementText(newText) {\n        element.text(newText || '');\n      }\n    }\n  };\n}];\n\n/* exported ngRepeatDirective */\n\n/**\n * @ngdoc directive\n * @name ngRepeat\n * @multiElement\n * @restrict A\n *\n * @description\n * The `ngRepeat` directive instantiates a template once per item from a collection. Each template\n * instance gets its own scope, where the given loop variable is set to the current collection item,\n * and `$index` is set to the item index or key.\n *\n * Special properties are exposed on the local scope of each template instance, including:\n *\n * | Variable  | Type            | Details                                                                     |\n * |-----------|-----------------|-----------------------------------------------------------------------------|\n * | `$index`  | {@type number}  | iterator offset of the repeated element (0..length-1)                       |\n * | `$first`  | {@type boolean} | true if the repeated element is first in the iterator.                      |\n * | `$middle` | {@type boolean} | true if the repeated element is between the first and last in the iterator. |\n * | `$last`   | {@type boolean} | true if the repeated element is last in the iterator.                       |\n * | `$even`   | {@type boolean} | true if the iterator position `$index` is even (otherwise false).           |\n * | `$odd`    | {@type boolean} | true if the iterator position `$index` is odd (otherwise false).            |\n *\n * <div class=\"alert alert-info\">\n *   Creating aliases for these properties is possible with {@link ng.directive:ngInit `ngInit`}.\n *   This may be useful when, for instance, nesting ngRepeats.\n * </div>\n *\n *\n * # Iterating over object properties\n *\n * It is possible to get `ngRepeat` to iterate over the properties of an object using the following\n * syntax:\n *\n * ```js\n * <div ng-repeat=\"(key, value) in myObj\"> ... </div>\n * ```\n *\n * However, there are a few limitations compared to array iteration:\n *\n * - The JavaScript specification does not define the order of keys\n *   returned for an object, so Angular relies on the order returned by the browser\n *   when running `for key in myObj`. Browsers generally follow the strategy of providing\n *   keys in the order in which they were defined, although there are exceptions when keys are deleted\n *   and reinstated. See the\n *   [MDN page on `delete` for more info](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Operators/delete#Cross-browser_notes).\n *\n * - `ngRepeat` will silently *ignore* object keys starting with `$`, because\n *   it's a prefix used by Angular for public (`$`) and private (`$$`) properties.\n *\n * - The built-in filters {@link ng.orderBy orderBy} and {@link ng.filter filter} do not work with\n *   objects, and will throw an error if used with one.\n *\n * If you are hitting any of these limitations, the recommended workaround is to convert your object into an array\n * that is sorted into the order that you prefer before providing it to `ngRepeat`. You could\n * do this with a filter such as [toArrayFilter](http://ngmodules.org/modules/angular-toArrayFilter)\n * or implement a `$watch` on the object yourself.\n *\n *\n * # Tracking and Duplicates\n *\n * `ngRepeat` uses {@link $rootScope.Scope#$watchCollection $watchCollection} to detect changes in\n * the collection. When a change happens, `ngRepeat` then makes the corresponding changes to the DOM:\n *\n * * When an item is added, a new instance of the template is added to the DOM.\n * * When an item is removed, its template instance is removed from the DOM.\n * * When items are reordered, their respective templates are reordered in the DOM.\n *\n * To minimize creation of DOM elements, `ngRepeat` uses a function\n * to \"keep track\" of all items in the collection and their corresponding DOM elements.\n * For example, if an item is added to the collection, `ngRepeat` will know that all other items\n * already have DOM elements, and will not re-render them.\n *\n * The default tracking function (which tracks items by their identity) does not allow\n * duplicate items in arrays. This is because when there are duplicates, it is not possible\n * to maintain a one-to-one mapping between collection items and DOM elements.\n *\n * If you do need to repeat duplicate items, you can substitute the default tracking behavior\n * with your own using the `track by` expression.\n *\n * For example, you may track items by the index of each item in the collection, using the\n * special scope property `$index`:\n * ```html\n *    <div ng-repeat=\"n in [42, 42, 43, 43] track by $index\">\n *      {{n}}\n *    </div>\n * ```\n *\n * You may also use arbitrary expressions in `track by`, including references to custom functions\n * on the scope:\n * ```html\n *    <div ng-repeat=\"n in [42, 42, 43, 43] track by myTrackingFunction(n)\">\n *      {{n}}\n *    </div>\n * ```\n *\n * <div class=\"alert alert-success\">\n * If you are working with objects that have a unique identifier property, you should track\n * by this identifier instead of the object instance. Should you reload your data later, `ngRepeat`\n * will not have to rebuild the DOM elements for items it has already rendered, even if the\n * JavaScript objects in the collection have been substituted for new ones. For large collections,\n * this significantly improves rendering performance. If you don't have a unique identifier,\n * `track by $index` can also provide a performance boost.\n * </div>\n *\n * ```html\n *    <div ng-repeat=\"model in collection track by model.id\">\n *      {{model.name}}\n *    </div>\n * ```\n *\n * <br />\n * <div class=\"alert alert-warning\">\n * Avoid using `track by $index` when the repeated template contains\n * {@link guide/expression#one-time-binding one-time bindings}. In such cases, the `nth` DOM\n * element will always be matched with the `nth` item of the array, so the bindings on that element\n * will not be updated even when the corresponding item changes, essentially causing the view to get\n * out-of-sync with the underlying data.\n * </div>\n *\n * When no `track by` expression is provided, it is equivalent to tracking by the built-in\n * `$id` function, which tracks items by their identity:\n * ```html\n *    <div ng-repeat=\"obj in collection track by $id(obj)\">\n *      {{obj.prop}}\n *    </div>\n * ```\n *\n * <br />\n * <div class=\"alert alert-warning\">\n * **Note:** `track by` must always be the last expression:\n * </div>\n * ```\n *    <div ng-repeat=\"model in collection | orderBy: 'id' as filtered_result track by model.id\">\n *      {{model.name}}\n *    </div>\n * ```\n *\n *\n * # Special repeat start and end points\n * To repeat a series of elements instead of just one parent element, ngRepeat (as well as other ng directives) supports extending\n * the range of the repeater by defining explicit start and end points by using **ng-repeat-start** and **ng-repeat-end** respectively.\n * The **ng-repeat-start** directive works the same as **ng-repeat**, but will repeat all the HTML code (including the tag it's defined on)\n * up to and including the ending HTML tag where **ng-repeat-end** is placed.\n *\n * The example below makes use of this feature:\n * ```html\n *   <header ng-repeat-start=\"item in items\">\n *     Header {{ item }}\n *   </header>\n *   <div class=\"body\">\n *     Body {{ item }}\n *   </div>\n *   <footer ng-repeat-end>\n *     Footer {{ item }}\n *   </footer>\n * ```\n *\n * And with an input of {@type ['A','B']} for the items variable in the example above, the output will evaluate to:\n * ```html\n *   <header>\n *     Header A\n *   </header>\n *   <div class=\"body\">\n *     Body A\n *   </div>\n *   <footer>\n *     Footer A\n *   </footer>\n *   <header>\n *     Header B\n *   </header>\n *   <div class=\"body\">\n *     Body B\n *   </div>\n *   <footer>\n *     Footer B\n *   </footer>\n * ```\n *\n * The custom start and end points for ngRepeat also support all other HTML directive syntax flavors provided in AngularJS (such\n * as **data-ng-repeat-start**, **x-ng-repeat-start** and **ng:repeat-start**).\n *\n * @animations\n * | Animation                        | Occurs                              |\n * |----------------------------------|-------------------------------------|\n * | {@link ng.$animate#enter enter} | when a new item is added to the list or when an item is revealed after a filter |\n * | {@link ng.$animate#leave leave} | when an item is removed from the list or when an item is filtered out |\n * | {@link ng.$animate#move move } | when an adjacent item is filtered out causing a reorder or when the item contents are reordered |\n *\n * See the example below for defining CSS animations with ngRepeat.\n *\n * @element ANY\n * @scope\n * @priority 1000\n * @param {repeat_expression} ngRepeat The expression indicating how to enumerate a collection. These\n *   formats are currently supported:\n *\n *   * `variable in expression` – where variable is the user defined loop variable and `expression`\n *     is a scope expression giving the collection to enumerate.\n *\n *     For example: `album in artist.albums`.\n *\n *   * `(key, value) in expression` – where `key` and `value` can be any user defined identifiers,\n *     and `expression` is the scope expression giving the collection to enumerate.\n *\n *     For example: `(name, age) in {'adam':10, 'amalie':12}`.\n *\n *   * `variable in expression track by tracking_expression` – You can also provide an optional tracking expression\n *     which can be used to associate the objects in the collection with the DOM elements. If no tracking expression\n *     is specified, ng-repeat associates elements by identity. It is an error to have\n *     more than one tracking expression value resolve to the same key. (This would mean that two distinct objects are\n *     mapped to the same DOM element, which is not possible.)\n *\n *     Note that the tracking expression must come last, after any filters, and the alias expression.\n *\n *     For example: `item in items` is equivalent to `item in items track by $id(item)`. This implies that the DOM elements\n *     will be associated by item identity in the array.\n *\n *     For example: `item in items track by $id(item)`. A built in `$id()` function can be used to assign a unique\n *     `$$hashKey` property to each item in the array. This property is then used as a key to associated DOM elements\n *     with the corresponding item in the array by identity. Moving the same object in array would move the DOM\n *     element in the same way in the DOM.\n *\n *     For example: `item in items track by item.id` is a typical pattern when the items come from the database. In this\n *     case the object identity does not matter. Two objects are considered equivalent as long as their `id`\n *     property is same.\n *\n *     For example: `item in items | filter:searchText track by item.id` is a pattern that might be used to apply a filter\n *     to items in conjunction with a tracking expression.\n *\n *   * `variable in expression as alias_expression` – You can also provide an optional alias expression which will then store the\n *     intermediate results of the repeater after the filters have been applied. Typically this is used to render a special message\n *     when a filter is active on the repeater, but the filtered result set is empty.\n *\n *     For example: `item in items | filter:x as results` will store the fragment of the repeated items as `results`, but only after\n *     the items have been processed through the filter.\n *\n *     Please note that `as [variable name] is not an operator but rather a part of ngRepeat micro-syntax so it can be used only at the end\n *     (and not as operator, inside an expression).\n *\n *     For example: `item in items | filter : x | orderBy : order | limitTo : limit as results` .\n *\n * @example\n * This example uses `ngRepeat` to display a list of people. A filter is used to restrict the displayed\n * results by name or by age. New (entering) and removed (leaving) items are animated.\n  <example module=\"ngRepeat\" name=\"ngRepeat\" deps=\"angular-animate.js\" animations=\"true\" name=\"ng-repeat\">\n    <file name=\"index.ced81ed4.html\">\n      <div ng-controller=\"repeatController\">\n        I have {{friends.length}} friends. They are:\n        <input type=\"search\" ng-model=\"q\" placeholder=\"filter friends...\" aria-label=\"filter friends\" />\n        <ul class=\"example-animate-container\">\n          <li class=\"animate-repeat\" ng-repeat=\"friend in friends | filter:q as results\">\n            [{{$index + 1}}] {{friend.name}} who is {{friend.age}} years old.\n          </li>\n          <li class=\"animate-repeat\" ng-if=\"results.length === 0\">\n            <strong>No results found...</strong>\n          </li>\n        </ul>\n      </div>\n    </file>\n    <file name=\"script.js\">\n      angular.module('ngRepeat', ['ngAnimate']).controller('repeatController', function($scope) {\n        $scope.friends = [\n          {name:'John', age:25, gender:'boy'},\n          {name:'Jessie', age:30, gender:'girl'},\n          {name:'Johanna', age:28, gender:'girl'},\n          {name:'Joy', age:15, gender:'girl'},\n          {name:'Mary', age:28, gender:'girl'},\n          {name:'Peter', age:95, gender:'boy'},\n          {name:'Sebastian', age:50, gender:'boy'},\n          {name:'Erika', age:27, gender:'girl'},\n          {name:'Patrick', age:40, gender:'boy'},\n          {name:'Samantha', age:60, gender:'girl'}\n        ];\n      });\n    </file>\n    <file name=\"animations.css\">\n      .example-animate-container {\n        background:white;\n        border:1px solid black;\n        list-style:none;\n        margin:0;\n        padding:0 10px;\n      }\n\n      .animate-repeat {\n        line-height:30px;\n        list-style:none;\n        box-sizing:border-box;\n      }\n\n      .animate-repeat.ng-move,\n      .animate-repeat.ng-enter,\n      .animate-repeat.ng-leave {\n        transition:all linear 0.5s;\n      }\n\n      .animate-repeat.ng-leave.ng-leave-active,\n      .animate-repeat.ng-move,\n      .animate-repeat.ng-enter {\n        opacity:0;\n        max-height:0;\n      }\n\n      .animate-repeat.ng-leave,\n      .animate-repeat.ng-move.ng-move-active,\n      .animate-repeat.ng-enter.ng-enter-active {\n        opacity:1;\n        max-height:30px;\n      }\n    </file>\n    <file name=\"protractor.js\" type=\"protractor\">\n      var friends = element.all(by.repeater('friend in friends'));\n\n      it('should render initial data set', function() {\n        expect(friends.count()).toBe(10);\n        expect(friends.get(0).getText()).toEqual('[1] John who is 25 years old.');\n        expect(friends.get(1).getText()).toEqual('[2] Jessie who is 30 years old.');\n        expect(friends.last().getText()).toEqual('[10] Samantha who is 60 years old.');\n        expect(element(by.binding('friends.length')).getText())\n            .toMatch(\"I have 10 friends. They are:\");\n      });\n\n       it('should update repeater when filter predicate changes', function() {\n         expect(friends.count()).toBe(10);\n\n         element(by.model('q')).sendKeys('ma');\n\n         expect(friends.count()).toBe(2);\n         expect(friends.get(0).getText()).toEqual('[1] Mary who is 28 years old.');\n         expect(friends.last().getText()).toEqual('[2] Samantha who is 60 years old.');\n       });\n      </file>\n    </example>\n */\nvar ngRepeatDirective = ['$parse', '$animate', '$compile', function($parse, $animate, $compile) {\n  var NG_REMOVED = '$$NG_REMOVED';\n  var ngRepeatMinErr = minErr('ngRepeat');\n\n  var updateScope = function(scope, index, valueIdentifier, value, keyIdentifier, key, arrayLength) {\n    // TODO(perf): generate setters to shave off ~40ms or 1-1.5%\n    scope[valueIdentifier] = value;\n    if (keyIdentifier) scope[keyIdentifier] = key;\n    scope.$index = index;\n    scope.$first = (index === 0);\n    scope.$last = (index === (arrayLength - 1));\n    scope.$middle = !(scope.$first || scope.$last);\n    // eslint-disable-next-line no-bitwise\n    scope.$odd = !(scope.$even = (index & 1) === 0);\n  };\n\n  var getBlockStart = function(block) {\n    return block.clone[0];\n  };\n\n  var getBlockEnd = function(block) {\n    return block.clone[block.clone.length - 1];\n  };\n\n\n  return {\n    restrict: 'A',\n    multiElement: true,\n    transclude: 'element',\n    priority: 1000,\n    terminal: true,\n    $$tlb: true,\n    compile: function ngRepeatCompile($element, $attr) {\n      var expression = $attr.ngRepeat;\n      var ngRepeatEndComment = $compile.$$createComment('end ngRepeat', expression);\n\n      var match = expression.match(/^\\s*([\\s\\S]+?)\\s+in\\s+([\\s\\S]+?)(?:\\s+as\\s+([\\s\\S]+?))?(?:\\s+track\\s+by\\s+([\\s\\S]+?))?\\s*$/);\n\n      if (!match) {\n        throw ngRepeatMinErr('iexp', 'Expected expression in form of \\'_item_ in _collection_[ track by _id_]\\' but got \\'{0}\\'.',\n            expression);\n      }\n\n      var lhs = match[1];\n      var rhs = match[2];\n      var aliasAs = match[3];\n      var trackByExp = match[4];\n\n      match = lhs.match(/^(?:(\\s*[$\\w]+)|\\(\\s*([$\\w]+)\\s*,\\s*([$\\w]+)\\s*\\))$/);\n\n      if (!match) {\n        throw ngRepeatMinErr('iidexp', '\\'_item_\\' in \\'_item_ in _collection_\\' should be an identifier or \\'(_key_, _value_)\\' expression, but got \\'{0}\\'.',\n            lhs);\n      }\n      var valueIdentifier = match[3] || match[1];\n      var keyIdentifier = match[2];\n\n      if (aliasAs && (!/^[$a-zA-Z_][$a-zA-Z0-9_]*$/.test(aliasAs) ||\n          /^(null|undefined|this|\\$index|\\$first|\\$middle|\\$last|\\$even|\\$odd|\\$parent|\\$root|\\$id)$/.test(aliasAs))) {\n        throw ngRepeatMinErr('badident', 'alias \\'{0}\\' is invalid --- must be a valid JS identifier which is not a reserved name.',\n          aliasAs);\n      }\n\n      var trackByExpGetter, trackByIdExpFn, trackByIdArrayFn, trackByIdObjFn;\n      var hashFnLocals = {$id: hashKey};\n\n      if (trackByExp) {\n        trackByExpGetter = $parse(trackByExp);\n      } else {\n        trackByIdArrayFn = function(key, value) {\n          return hashKey(value);\n        };\n        trackByIdObjFn = function(key) {\n          return key;\n        };\n      }\n\n      return function ngRepeatLink($scope, $element, $attr, ctrl, $transclude) {\n\n        if (trackByExpGetter) {\n          trackByIdExpFn = function(key, value, index) {\n            // assign key, value, and $index to the locals so that they can be used in hash functions\n            if (keyIdentifier) hashFnLocals[keyIdentifier] = key;\n            hashFnLocals[valueIdentifier] = value;\n            hashFnLocals.$index = index;\n            return trackByExpGetter($scope, hashFnLocals);\n          };\n        }\n\n        // Store a list of elements from previous run. This is a hash where key is the item from the\n        // iterator, and the value is objects with following properties.\n        //   - scope: bound scope\n        //   - element: previous element.\n        //   - index: position\n        //\n        // We are using no-proto object so that we don't need to guard against inherited props via\n        // hasOwnProperty.\n        var lastBlockMap = createMap();\n\n        //watch props\n        $scope.$watchCollection(rhs, function ngRepeatAction(collection) {\n          var index, length,\n              previousNode = $element[0],     // node that cloned nodes should be inserted after\n                                              // initialized to the comment node anchor\n              nextNode,\n              // Same as lastBlockMap but it has the current state. It will become the\n              // lastBlockMap on the next iteration.\n              nextBlockMap = createMap(),\n              collectionLength,\n              key, value, // key/value of iteration\n              trackById,\n              trackByIdFn,\n              collectionKeys,\n              block,       // last object information {scope, element, id}\n              nextBlockOrder,\n              elementsToRemove;\n\n          if (aliasAs) {\n            $scope[aliasAs] = collection;\n          }\n\n          if (isArrayLike(collection)) {\n            collectionKeys = collection;\n            trackByIdFn = trackByIdExpFn || trackByIdArrayFn;\n          } else {\n            trackByIdFn = trackByIdExpFn || trackByIdObjFn;\n            // if object, extract keys, in enumeration order, unsorted\n            collectionKeys = [];\n            for (var itemKey in collection) {\n              if (hasOwnProperty.call(collection, itemKey) && itemKey.charAt(0) !== '$') {\n                collectionKeys.push(itemKey);\n              }\n            }\n          }\n\n          collectionLength = collectionKeys.length;\n          nextBlockOrder = new Array(collectionLength);\n\n          // locate existing items\n          for (index = 0; index < collectionLength; index++) {\n            key = (collection === collectionKeys) ? index : collectionKeys[index];\n            value = collection[key];\n            trackById = trackByIdFn(key, value, index);\n            if (lastBlockMap[trackById]) {\n              // found previously seen block\n              block = lastBlockMap[trackById];\n              delete lastBlockMap[trackById];\n              nextBlockMap[trackById] = block;\n              nextBlockOrder[index] = block;\n            } else if (nextBlockMap[trackById]) {\n              // if collision detected. restore lastBlockMap and throw an error\n              forEach(nextBlockOrder, function(block) {\n                if (block && block.scope) lastBlockMap[block.id] = block;\n              });\n              throw ngRepeatMinErr('dupes',\n                  'Duplicates in a repeater are not allowed. Use \\'track by\\' expression to specify unique keys. Repeater: {0}, Duplicate key: {1}, Duplicate value: {2}',\n                  expression, trackById, value);\n            } else {\n              // new never before seen block\n              nextBlockOrder[index] = {id: trackById, scope: undefined, clone: undefined};\n              nextBlockMap[trackById] = true;\n            }\n          }\n\n          // remove leftover items\n          for (var blockKey in lastBlockMap) {\n            block = lastBlockMap[blockKey];\n            elementsToRemove = getBlockNodes(block.clone);\n            $animate.leave(elementsToRemove);\n            if (elementsToRemove[0].parentNode) {\n              // if the element was not removed yet because of pending animation, mark it as deleted\n              // so that we can ignore it later\n              for (index = 0, length = elementsToRemove.length; index < length; index++) {\n                elementsToRemove[index][NG_REMOVED] = true;\n              }\n            }\n            block.scope.$destroy();\n          }\n\n          // we are not using forEach for perf reasons (trying to avoid #call)\n          for (index = 0; index < collectionLength; index++) {\n            key = (collection === collectionKeys) ? index : collectionKeys[index];\n            value = collection[key];\n            block = nextBlockOrder[index];\n\n            if (block.scope) {\n              // if we have already seen this object, then we need to reuse the\n              // associated scope/element\n\n              nextNode = previousNode;\n\n              // skip nodes that are already pending removal via leave animation\n              do {\n                nextNode = nextNode.nextSibling;\n              } while (nextNode && nextNode[NG_REMOVED]);\n\n              if (getBlockStart(block) !== nextNode) {\n                // existing item which got moved\n                $animate.move(getBlockNodes(block.clone), null, previousNode);\n              }\n              previousNode = getBlockEnd(block);\n              updateScope(block.scope, index, valueIdentifier, value, keyIdentifier, key, collectionLength);\n            } else {\n              // new item which we don't know about\n              $transclude(function ngRepeatTransclude(clone, scope) {\n                block.scope = scope;\n                // http://jsperf.com/clone-vs-createcomment\n                var endNode = ngRepeatEndComment.cloneNode(false);\n                clone[clone.length++] = endNode;\n\n                $animate.enter(clone, null, previousNode);\n                previousNode = endNode;\n                // Note: We only need the first/last node of the cloned nodes.\n                // However, we need to keep the reference to the jqlite wrapper as it might be changed later\n                // by a directive with templateUrl when its template arrives.\n                block.clone = clone;\n                nextBlockMap[block.id] = block;\n                updateScope(block.scope, index, valueIdentifier, value, keyIdentifier, key, collectionLength);\n              });\n            }\n          }\n          lastBlockMap = nextBlockMap;\n        });\n      };\n    }\n  };\n}];\n\nvar NG_HIDE_CLASS = 'ng-hide';\nvar NG_HIDE_IN_PROGRESS_CLASS = 'ng-hide-animate';\n/**\n * @ngdoc directive\n * @name ngShow\n * @multiElement\n *\n * @description\n * The `ngShow` directive shows or hides the given HTML element based on the expression provided to\n * the `ngShow` attribute.\n *\n * The element is shown or hidden by removing or adding the `.ng-hide` CSS class onto the element.\n * The `.ng-hide` CSS class is predefined in AngularJS and sets the display style to none (using an\n * `!important` flag). For CSP mode please add `angular-csp.css` to your HTML file (see\n * {@link ng.directive:ngCsp ngCsp}).\n *\n * ```html\n * <!-- when $scope.myValue is truthy (element is visible) -->\n * <div ng-show=\"myValue\"></div>\n *\n * <!-- when $scope.myValue is falsy (element is hidden) -->\n * <div ng-show=\"myValue\" class=\"ng-hide\"></div>\n * ```\n *\n * When the `ngShow` expression evaluates to a falsy value then the `.ng-hide` CSS class is added\n * to the class attribute on the element causing it to become hidden. When truthy, the `.ng-hide`\n * CSS class is removed from the element causing the element not to appear hidden.\n *\n * ## Why is `!important` used?\n *\n * You may be wondering why `!important` is used for the `.ng-hide` CSS class. This is because the\n * `.ng-hide` selector can be easily overridden by heavier selectors. For example, something as\n * simple as changing the display style on a HTML list item would make hidden elements appear\n * visible. This also becomes a bigger issue when dealing with CSS frameworks.\n *\n * By using `!important`, the show and hide behavior will work as expected despite any clash between\n * CSS selector specificity (when `!important` isn't used with any conflicting styles). If a\n * developer chooses to override the styling to change how to hide an element then it is just a\n * matter of using `!important` in their own CSS code.\n *\n * ### Overriding `.ng-hide`\n *\n * By default, the `.ng-hide` class will style the element with `display: none !important`. If you\n * wish to change the hide behavior with `ngShow`/`ngHide`, you can simply overwrite the styles for\n * the `.ng-hide` CSS class. Note that the selector that needs to be used is actually\n * `.ng-hide:not(.ng-hide-animate)` to cope with extra animation classes that can be added.\n *\n * ```css\n * .ng-hide:not(.ng-hide-animate) {\n *   /&#42; These are just alternative ways of hiding an element &#42;/\n *   display: block!important;\n *   position: absolute;\n *   top: -9999px;\n *   left: -9999px;\n * }\n * ```\n *\n * By default you don't need to override anything in CSS and the animations will work around the\n * display style.\n *\n * ## A note about animations with `ngShow`\n *\n * Animations in `ngShow`/`ngHide` work with the show and hide events that are triggered when the\n * directive expression is true and false. This system works like the animation system present with\n * `ngClass` except that you must also include the `!important` flag to override the display\n * property so that the elements are not actually hidden during the animation.\n *\n * ```css\n * /&#42; A working example can be found at the bottom of this page. &#42;/\n * .my-element.ng-hide-add, .my-element.ng-hide-remove {\n *   transition: all 0.5s linear;\n * }\n *\n * .my-element.ng-hide-add { ... }\n * .my-element.ng-hide-add.ng-hide-add-active { ... }\n * .my-element.ng-hide-remove { ... }\n * .my-element.ng-hide-remove.ng-hide-remove-active { ... }\n * ```\n *\n * Keep in mind that, as of AngularJS version 1.3, there is no need to change the display property\n * to block during animation states - ngAnimate will automatically handle the style toggling for you.\n *\n * @animations\n * | Animation                                           | Occurs                                                                                                        |\n * |-----------------------------------------------------|---------------------------------------------------------------------------------------------------------------|\n * | {@link $animate#addClass addClass} `.ng-hide`       | After the `ngShow` expression evaluates to a non truthy value and just before the contents are set to hidden. |\n * | {@link $animate#removeClass removeClass} `.ng-hide` | After the `ngShow` expression evaluates to a truthy value and just before contents are set to visible.        |\n *\n * @element ANY\n * @param {expression} ngShow If the {@link guide/expression expression} is truthy/falsy then the\n *                            element is shown/hidden respectively.\n *\n * @example\n * A simple example, animating the element's opacity:\n *\n  <example module=\"ngAnimate\" deps=\"angular-animate.js\" animations=\"true\" name=\"ng-show-simple\">\n    <file name=\"index.ced81ed4.html\">\n      Show: <input type=\"checkbox\" ng-model=\"checked\" aria-label=\"Toggle ngShow\"><br />\n      <div class=\"check-element animate-show-hide\" ng-show=\"checked\">\n        I show up when your checkbox is checked.\n      </div>\n    </file>\n    <file name=\"animations.css\">\n      .animate-show-hide.ng-hide {\n        opacity: 0;\n      }\n\n      .animate-show-hide.ng-hide-add,\n      .animate-show-hide.ng-hide-remove {\n        transition: all linear 0.5s;\n      }\n\n      .check-element {\n        border: 1px solid black;\n        opacity: 1;\n        padding: 10px;\n      }\n    </file>\n    <file name=\"protractor.js\" type=\"protractor\">\n      it('should check ngShow', function() {\n        var checkbox = element(by.model('checked'));\n        var checkElem = element(by.css('.check-element'));\n\n        expect(checkElem.isDisplayed()).toBe(false);\n        checkbox.click();\n        expect(checkElem.isDisplayed()).toBe(true);\n      });\n    </file>\n  </example>\n *\n * <hr />\n * @example\n * A more complex example, featuring different show/hide animations:\n *\n  <example module=\"ngAnimate\" deps=\"angular-animate.js\" animations=\"true\" name=\"ng-show-complex\">\n    <file name=\"index.ced81ed4.html\">\n      Show: <input type=\"checkbox\" ng-model=\"checked\" aria-label=\"Toggle ngShow\"><br />\n      <div class=\"check-element funky-show-hide\" ng-show=\"checked\">\n        I show up when your checkbox is checked.\n      </div>\n    </file>\n    <file name=\"animations.css\">\n      body {\n        overflow: hidden;\n        perspective: 1000px;\n      }\n\n      .funky-show-hide.ng-hide-add {\n        transform: rotateZ(0);\n        transform-origin: right;\n        transition: all 0.5s ease-in-out;\n      }\n\n      .funky-show-hide.ng-hide-add.ng-hide-add-active {\n        transform: rotateZ(-135deg);\n      }\n\n      .funky-show-hide.ng-hide-remove {\n        transform: rotateY(90deg);\n        transform-origin: left;\n        transition: all 0.5s ease;\n      }\n\n      .funky-show-hide.ng-hide-remove.ng-hide-remove-active {\n        transform: rotateY(0);\n      }\n\n      .check-element {\n        border: 1px solid black;\n        opacity: 1;\n        padding: 10px;\n      }\n    </file>\n    <file name=\"protractor.js\" type=\"protractor\">\n      it('should check ngShow', function() {\n        var checkbox = element(by.model('checked'));\n        var checkElem = element(by.css('.check-element'));\n\n        expect(checkElem.isDisplayed()).toBe(false);\n        checkbox.click();\n        expect(checkElem.isDisplayed()).toBe(true);\n      });\n    </file>\n  </example>\n */\nvar ngShowDirective = ['$animate', function($animate) {\n  return {\n    restrict: 'A',\n    multiElement: true,\n    link: function(scope, element, attr) {\n      scope.$watch(attr.ngShow, function ngShowWatchAction(value) {\n        // we're adding a temporary, animation-specific class for ng-hide since this way\n        // we can control when the element is actually displayed on screen without having\n        // to have a global/greedy CSS selector that breaks when other animations are run.\n        // Read: https://github.com/angular/angular.js/issues/9103#issuecomment-58335845\n        $animate[value ? 'removeClass' : 'addClass'](element, NG_HIDE_CLASS, {\n          tempClasses: NG_HIDE_IN_PROGRESS_CLASS\n        });\n      });\n    }\n  };\n}];\n\n\n/**\n * @ngdoc directive\n * @name ngHide\n * @multiElement\n *\n * @description\n * The `ngHide` directive shows or hides the given HTML element based on the expression provided to\n * the `ngHide` attribute.\n *\n * The element is shown or hidden by removing or adding the `.ng-hide` CSS class onto the element.\n * The `.ng-hide` CSS class is predefined in AngularJS and sets the display style to none (using an\n * `!important` flag). For CSP mode please add `angular-csp.css` to your HTML file (see\n * {@link ng.directive:ngCsp ngCsp}).\n *\n * ```html\n * <!-- when $scope.myValue is truthy (element is hidden) -->\n * <div ng-hide=\"myValue\" class=\"ng-hide\"></div>\n *\n * <!-- when $scope.myValue is falsy (element is visible) -->\n * <div ng-hide=\"myValue\"></div>\n * ```\n *\n * When the `ngHide` expression evaluates to a truthy value then the `.ng-hide` CSS class is added\n * to the class attribute on the element causing it to become hidden. When falsy, the `.ng-hide`\n * CSS class is removed from the element causing the element not to appear hidden.\n *\n * ## Why is `!important` used?\n *\n * You may be wondering why `!important` is used for the `.ng-hide` CSS class. This is because the\n * `.ng-hide` selector can be easily overridden by heavier selectors. For example, something as\n * simple as changing the display style on a HTML list item would make hidden elements appear\n * visible. This also becomes a bigger issue when dealing with CSS frameworks.\n *\n * By using `!important`, the show and hide behavior will work as expected despite any clash between\n * CSS selector specificity (when `!important` isn't used with any conflicting styles). If a\n * developer chooses to override the styling to change how to hide an element then it is just a\n * matter of using `!important` in their own CSS code.\n *\n * ### Overriding `.ng-hide`\n *\n * By default, the `.ng-hide` class will style the element with `display: none !important`. If you\n * wish to change the hide behavior with `ngShow`/`ngHide`, you can simply overwrite the styles for\n * the `.ng-hide` CSS class. Note that the selector that needs to be used is actually\n * `.ng-hide:not(.ng-hide-animate)` to cope with extra animation classes that can be added.\n *\n * ```css\n * .ng-hide:not(.ng-hide-animate) {\n *   /&#42; These are just alternative ways of hiding an element &#42;/\n *   display: block!important;\n *   position: absolute;\n *   top: -9999px;\n *   left: -9999px;\n * }\n * ```\n *\n * By default you don't need to override in CSS anything and the animations will work around the\n * display style.\n *\n * ## A note about animations with `ngHide`\n *\n * Animations in `ngShow`/`ngHide` work with the show and hide events that are triggered when the\n * directive expression is true and false. This system works like the animation system present with\n * `ngClass` except that you must also include the `!important` flag to override the display\n * property so that the elements are not actually hidden during the animation.\n *\n * ```css\n * /&#42; A working example can be found at the bottom of this page. &#42;/\n * .my-element.ng-hide-add, .my-element.ng-hide-remove {\n *   transition: all 0.5s linear;\n * }\n *\n * .my-element.ng-hide-add { ... }\n * .my-element.ng-hide-add.ng-hide-add-active { ... }\n * .my-element.ng-hide-remove { ... }\n * .my-element.ng-hide-remove.ng-hide-remove-active { ... }\n * ```\n *\n * Keep in mind that, as of AngularJS version 1.3, there is no need to change the display property\n * to block during animation states - ngAnimate will automatically handle the style toggling for you.\n *\n * @animations\n * | Animation                                           | Occurs                                                                                                     |\n * |-----------------------------------------------------|------------------------------------------------------------------------------------------------------------|\n * | {@link $animate#addClass addClass} `.ng-hide`       | After the `ngHide` expression evaluates to a truthy value and just before the contents are set to hidden.  |\n * | {@link $animate#removeClass removeClass} `.ng-hide` | After the `ngHide` expression evaluates to a non truthy value and just before contents are set to visible. |\n *\n *\n * @element ANY\n * @param {expression} ngHide If the {@link guide/expression expression} is truthy/falsy then the\n *                            element is hidden/shown respectively.\n *\n * @example\n * A simple example, animating the element's opacity:\n *\n  <example module=\"ngAnimate\" deps=\"angular-animate.js\" animations=\"true\" name=\"ng-hide-simple\">\n    <file name=\"index.ced81ed4.html\">\n      Hide: <input type=\"checkbox\" ng-model=\"checked\" aria-label=\"Toggle ngHide\"><br />\n      <div class=\"check-element animate-show-hide\" ng-hide=\"checked\">\n        I hide when your checkbox is checked.\n      </div>\n    </file>\n    <file name=\"animations.css\">\n      .animate-show-hide.ng-hide {\n        opacity: 0;\n      }\n\n      .animate-show-hide.ng-hide-add,\n      .animate-show-hide.ng-hide-remove {\n        transition: all linear 0.5s;\n      }\n\n      .check-element {\n        border: 1px solid black;\n        opacity: 1;\n        padding: 10px;\n      }\n    </file>\n    <file name=\"protractor.js\" type=\"protractor\">\n      it('should check ngHide', function() {\n        var checkbox = element(by.model('checked'));\n        var checkElem = element(by.css('.check-element'));\n\n        expect(checkElem.isDisplayed()).toBe(true);\n        checkbox.click();\n        expect(checkElem.isDisplayed()).toBe(false);\n      });\n    </file>\n  </example>\n *\n * <hr />\n * @example\n * A more complex example, featuring different show/hide animations:\n *\n  <example module=\"ngAnimate\" deps=\"angular-animate.js\" animations=\"true\" name=\"ng-hide-complex\">\n    <file name=\"index.ced81ed4.html\">\n      Hide: <input type=\"checkbox\" ng-model=\"checked\" aria-label=\"Toggle ngHide\"><br />\n      <div class=\"check-element funky-show-hide\" ng-hide=\"checked\">\n        I hide when your checkbox is checked.\n      </div>\n    </file>\n    <file name=\"animations.css\">\n      body {\n        overflow: hidden;\n        perspective: 1000px;\n      }\n\n      .funky-show-hide.ng-hide-add {\n        transform: rotateZ(0);\n        transform-origin: right;\n        transition: all 0.5s ease-in-out;\n      }\n\n      .funky-show-hide.ng-hide-add.ng-hide-add-active {\n        transform: rotateZ(-135deg);\n      }\n\n      .funky-show-hide.ng-hide-remove {\n        transform: rotateY(90deg);\n        transform-origin: left;\n        transition: all 0.5s ease;\n      }\n\n      .funky-show-hide.ng-hide-remove.ng-hide-remove-active {\n        transform: rotateY(0);\n      }\n\n      .check-element {\n        border: 1px solid black;\n        opacity: 1;\n        padding: 10px;\n      }\n    </file>\n    <file name=\"protractor.js\" type=\"protractor\">\n      it('should check ngHide', function() {\n        var checkbox = element(by.model('checked'));\n        var checkElem = element(by.css('.check-element'));\n\n        expect(checkElem.isDisplayed()).toBe(true);\n        checkbox.click();\n        expect(checkElem.isDisplayed()).toBe(false);\n      });\n    </file>\n  </example>\n */\nvar ngHideDirective = ['$animate', function($animate) {\n  return {\n    restrict: 'A',\n    multiElement: true,\n    link: function(scope, element, attr) {\n      scope.$watch(attr.ngHide, function ngHideWatchAction(value) {\n        // The comment inside of the ngShowDirective explains why we add and\n        // remove a temporary class for the show/hide animation\n        $animate[value ? 'addClass' : 'removeClass'](element,NG_HIDE_CLASS, {\n          tempClasses: NG_HIDE_IN_PROGRESS_CLASS\n        });\n      });\n    }\n  };\n}];\n\n/**\n * @ngdoc directive\n * @name ngStyle\n * @restrict AC\n *\n * @description\n * The `ngStyle` directive allows you to set CSS style on an HTML element conditionally.\n *\n * @knownIssue\n * You should not use {@link guide/interpolation interpolation} in the value of the `style`\n * attribute, when using the `ngStyle` directive on the same element.\n * See {@link guide/interpolation#known-issues here} for more info.\n *\n * @element ANY\n * @param {expression} ngStyle\n *\n * {@link guide/expression Expression} which evals to an\n * object whose keys are CSS style names and values are corresponding values for those CSS\n * keys.\n *\n * Since some CSS style names are not valid keys for an object, they must be quoted.\n * See the 'background-color' style in the example below.\n *\n * @example\n   <example name=\"ng-style\">\n     <file name=\"index.ced81ed4.html\">\n        <input type=\"button\" value=\"set color\" ng-click=\"myStyle={color:'red'}\">\n        <input type=\"button\" value=\"set background\" ng-click=\"myStyle={'background-color':'blue'}\">\n        <input type=\"button\" value=\"clear\" ng-click=\"myStyle={}\">\n        <br/>\n        <span ng-style=\"myStyle\">Sample Text</span>\n        <pre>myStyle={{myStyle}}</pre>\n     </file>\n     <file name=\"style.css\">\n       span {\n         color: black;\n       }\n     </file>\n     <file name=\"protractor.js\" type=\"protractor\">\n       var colorSpan = element(by.css('span'));\n\n       it('should check ng-style', function() {\n         expect(colorSpan.getCssValue('color')).toBe('rgba(0, 0, 0, 1)');\n         element(by.css('input[value=\\'set color\\']')).click();\n         expect(colorSpan.getCssValue('color')).toBe('rgba(255, 0, 0, 1)');\n         element(by.css('input[value=clear]')).click();\n         expect(colorSpan.getCssValue('color')).toBe('rgba(0, 0, 0, 1)');\n       });\n     </file>\n   </example>\n */\nvar ngStyleDirective = ngDirective(function(scope, element, attr) {\n  scope.$watch(attr.ngStyle, function ngStyleWatchAction(newStyles, oldStyles) {\n    if (oldStyles && (newStyles !== oldStyles)) {\n      forEach(oldStyles, function(val, style) { element.css(style, '');});\n    }\n    if (newStyles) element.css(newStyles);\n  }, true);\n});\n\n/**\n * @ngdoc directive\n * @name ngSwitch\n * @restrict EA\n *\n * @description\n * The `ngSwitch` directive is used to conditionally swap DOM structure on your template based on a scope expression.\n * Elements within `ngSwitch` but without `ngSwitchWhen` or `ngSwitchDefault` directives will be preserved at the location\n * as specified in the template.\n *\n * The directive itself works similar to ngInclude, however, instead of downloading template code (or loading it\n * from the template cache), `ngSwitch` simply chooses one of the nested elements and makes it visible based on which element\n * matches the value obtained from the evaluated expression. In other words, you define a container element\n * (where you place the directive), place an expression on the **`on=\"...\"` attribute**\n * (or the **`ng-switch=\"...\"` attribute**), define any inner elements inside of the directive and place\n * a when attribute per element. The when attribute is used to inform ngSwitch which element to display when the on\n * expression is evaluated. If a matching expression is not found via a when attribute then an element with the default\n * attribute is displayed.\n *\n * <div class=\"alert alert-info\">\n * Be aware that the attribute values to match against cannot be expressions. They are interpreted\n * as literal string values to match against.\n * For example, **`ng-switch-when=\"someVal\"`** will match against the string `\"someVal\"` not against the\n * value of the expression `$scope.someVal`.\n * </div>\n\n * @animations\n * | Animation                        | Occurs                              |\n * |----------------------------------|-------------------------------------|\n * | {@link ng.$animate#enter enter}  | after the ngSwitch contents change and the matched child element is placed inside the container |\n * | {@link ng.$animate#leave leave}  | after the ngSwitch contents change and just before the former contents are removed from the DOM |\n *\n * @usage\n *\n * ```\n * <ANY ng-switch=\"expression\">\n *   <ANY ng-switch-when=\"matchValue1\">...</ANY>\n *   <ANY ng-switch-when=\"matchValue2\">...</ANY>\n *   <ANY ng-switch-default>...</ANY>\n * </ANY>\n * ```\n *\n *\n * @scope\n * @priority 1200\n * @param {*} ngSwitch|on expression to match against <code>ng-switch-when</code>.\n * On child elements add:\n *\n * * `ngSwitchWhen`: the case statement to match against. If match then this\n *   case will be displayed. If the same match appears multiple times, all the\n *   elements will be displayed. It is possible to associate multiple values to\n *   the same `ngSwitchWhen` by defining the optional attribute\n *   `ngSwitchWhenSeparator`. The separator will be used to split the value of\n *   the `ngSwitchWhen` attribute into multiple tokens, and the element will show\n *   if any of the `ngSwitch` evaluates to any of these tokens.\n * * `ngSwitchDefault`: the default case when no other case match. If there\n *   are multiple default cases, all of them will be displayed when no other\n *   case match.\n *\n *\n * @example\n  <example module=\"switchExample\" deps=\"angular-animate.js\" animations=\"true\" name=\"ng-switch\">\n    <file name=\"index.ced81ed4.html\">\n      <div ng-controller=\"ExampleController\">\n        <select ng-model=\"selection\" ng-options=\"item for item in items\">\n        </select>\n        <code>selection={{selection}}</code>\n        <hr/>\n        <div class=\"animate-switch-container\"\n          ng-switch on=\"selection\">\n            <div class=\"animate-switch\" ng-switch-when=\"settings|options\" ng-switch-when-separator=\"|\">Settings Div</div>\n            <div class=\"animate-switch\" ng-switch-when=\"home\">Home Span</div>\n            <div class=\"animate-switch\" ng-switch-default>default</div>\n        </div>\n      </div>\n    </file>\n    <file name=\"script.js\">\n      angular.module('switchExample', ['ngAnimate'])\n        .controller('ExampleController', ['$scope', function($scope) {\n          $scope.items = ['settings', 'home', 'options', 'other'];\n          $scope.selection = $scope.items[0];\n        }]);\n    </file>\n    <file name=\"animations.css\">\n      .animate-switch-container {\n        position:relative;\n        background:white;\n        border:1px solid black;\n        height:40px;\n        overflow:hidden;\n      }\n\n      .animate-switch {\n        padding:10px;\n      }\n\n      .animate-switch.ng-animate {\n        transition:all cubic-bezier(0.250, 0.460, 0.450, 0.940) 0.5s;\n\n        position:absolute;\n        top:0;\n        left:0;\n        right:0;\n        bottom:0;\n      }\n\n      .animate-switch.ng-leave.ng-leave-active,\n      .animate-switch.ng-enter {\n        top:-50px;\n      }\n      .animate-switch.ng-leave,\n      .animate-switch.ng-enter.ng-enter-active {\n        top:0;\n      }\n    </file>\n    <file name=\"protractor.js\" type=\"protractor\">\n      var switchElem = element(by.css('[ng-switch]'));\n      var select = element(by.model('selection'));\n\n      it('should start in settings', function() {\n        expect(switchElem.getText()).toMatch(/Settings Div/);\n      });\n      it('should change to home', function() {\n        select.all(by.css('option')).get(1).click();\n        expect(switchElem.getText()).toMatch(/Home Span/);\n      });\n      it('should change to settings via \"options\"', function() {\n        select.all(by.css('option')).get(2).click();\n        expect(switchElem.getText()).toMatch(/Settings Div/);\n      });\n      it('should select default', function() {\n        select.all(by.css('option')).get(3).click();\n        expect(switchElem.getText()).toMatch(/default/);\n      });\n    </file>\n  </example>\n */\nvar ngSwitchDirective = ['$animate', '$compile', function($animate, $compile) {\n  return {\n    require: 'ngSwitch',\n\n    // asks for $scope to fool the BC controller module\n    controller: ['$scope', function NgSwitchController() {\n     this.cases = {};\n    }],\n    link: function(scope, element, attr, ngSwitchController) {\n      var watchExpr = attr.ngSwitch || attr.on,\n          selectedTranscludes = [],\n          selectedElements = [],\n          previousLeaveAnimations = [],\n          selectedScopes = [];\n\n      var spliceFactory = function(array, index) {\n          return function(response) {\n            if (response !== false) array.splice(index, 1);\n          };\n      };\n\n      scope.$watch(watchExpr, function ngSwitchWatchAction(value) {\n        var i, ii;\n\n        // Start with the last, in case the array is modified during the loop\n        while (previousLeaveAnimations.length) {\n          $animate.cancel(previousLeaveAnimations.pop());\n        }\n\n        for (i = 0, ii = selectedScopes.length; i < ii; ++i) {\n          var selected = getBlockNodes(selectedElements[i].clone);\n          selectedScopes[i].$destroy();\n          var runner = previousLeaveAnimations[i] = $animate.leave(selected);\n          runner.done(spliceFactory(previousLeaveAnimations, i));\n        }\n\n        selectedElements.length = 0;\n        selectedScopes.length = 0;\n\n        if ((selectedTranscludes = ngSwitchController.cases['!' + value] || ngSwitchController.cases['?'])) {\n          forEach(selectedTranscludes, function(selectedTransclude) {\n            selectedTransclude.transclude(function(caseElement, selectedScope) {\n              selectedScopes.push(selectedScope);\n              var anchor = selectedTransclude.element;\n              caseElement[caseElement.length++] = $compile.$$createComment('end ngSwitchWhen');\n              var block = { clone: caseElement };\n\n              selectedElements.push(block);\n              $animate.enter(caseElement, anchor.parent(), anchor);\n            });\n          });\n        }\n      });\n    }\n  };\n}];\n\nvar ngSwitchWhenDirective = ngDirective({\n  transclude: 'element',\n  priority: 1200,\n  require: '^ngSwitch',\n  multiElement: true,\n  link: function(scope, element, attrs, ctrl, $transclude) {\n\n    var cases = attrs.ngSwitchWhen.split(attrs.ngSwitchWhenSeparator).sort().filter(\n      // Filter duplicate cases\n      function(element, index, array) { return array[index - 1] !== element; }\n    );\n\n    forEach(cases, function(whenCase) {\n      ctrl.cases['!' + whenCase] = (ctrl.cases['!' + whenCase] || []);\n      ctrl.cases['!' + whenCase].push({ transclude: $transclude, element: element });\n    });\n  }\n});\n\nvar ngSwitchDefaultDirective = ngDirective({\n  transclude: 'element',\n  priority: 1200,\n  require: '^ngSwitch',\n  multiElement: true,\n  link: function(scope, element, attr, ctrl, $transclude) {\n    ctrl.cases['?'] = (ctrl.cases['?'] || []);\n    ctrl.cases['?'].push({ transclude: $transclude, element: element });\n   }\n});\n\n/**\n * @ngdoc directive\n * @name ngTransclude\n * @restrict EAC\n *\n * @description\n * Directive that marks the insertion point for the transcluded DOM of the nearest parent directive that uses transclusion.\n *\n * You can specify that you want to insert a named transclusion slot, instead of the default slot, by providing the slot name\n * as the value of the `ng-transclude` or `ng-transclude-slot` attribute.\n *\n * If the transcluded content is not empty (i.e. contains one or more DOM nodes, including whitespace text nodes), any existing\n * content of this element will be removed before the transcluded content is inserted.\n * If the transcluded content is empty (or only whitespace), the existing content is left intact. This lets you provide fallback\n * content in the case that no transcluded content is provided.\n *\n * @element ANY\n *\n * @param {string} ngTransclude|ngTranscludeSlot the name of the slot to insert at this point. If this is not provided, is empty\n *                                               or its value is the same as the name of the attribute then the default slot is used.\n *\n * @example\n * ### Basic transclusion\n * This example demonstrates basic transclusion of content into a component directive.\n * <example name=\"simpleTranscludeExample\" module=\"transcludeExample\">\n *   <file name=\"index.ced81ed4.html\">\n *     <script>\n *       angular.module('transcludeExample', [])\n *        .directive('pane', function(){\n *           return {\n *             restrict: 'E',\n *             transclude: true,\n *             scope: { title:'@' },\n *             template: '<div style=\"border: 1px solid black;\">' +\n *                         '<div style=\"background-color: gray\">{{title}}</div>' +\n *                         '<ng-transclude></ng-transclude>' +\n *                       '</div>'\n *           };\n *       })\n *       .controller('ExampleController', ['$scope', function($scope) {\n *         $scope.title = 'Lorem Ipsum';\n *         $scope.text = 'Neque porro quisquam est qui dolorem ipsum quia dolor...';\n *       }]);\n *     </script>\n *     <div ng-controller=\"ExampleController\">\n *       <input ng-model=\"title\" aria-label=\"title\"> <br/>\n *       <textarea ng-model=\"text\" aria-label=\"text\"></textarea> <br/>\n *       <pane title=\"{{title}}\"><span>{{text}}</span></pane>\n *     </div>\n *   </file>\n *   <file name=\"protractor.js\" type=\"protractor\">\n *      it('should have transcluded', function() {\n *        var titleElement = element(by.model('title'));\n *        titleElement.clear();\n *        titleElement.sendKeys('TITLE');\n *        var textElement = element(by.model('text'));\n *        textElement.clear();\n *        textElement.sendKeys('TEXT');\n *        expect(element(by.binding('title')).getText()).toEqual('TITLE');\n *        expect(element(by.binding('text')).getText()).toEqual('TEXT');\n *      });\n *   </file>\n * </example>\n *\n * @example\n * ### Transclude fallback content\n * This example shows how to use `NgTransclude` with fallback content, that\n * is displayed if no transcluded content is provided.\n *\n * <example module=\"transcludeFallbackContentExample\" name=\"ng-transclude\">\n * <file name=\"index.ced81ed4.html\">\n * <script>\n * angular.module('transcludeFallbackContentExample', [])\n * .directive('myButton', function(){\n *             return {\n *               restrict: 'E',\n *               transclude: true,\n *               scope: true,\n *               template: '<button style=\"cursor: pointer;\">' +\n *                           '<ng-transclude>' +\n *                             '<b style=\"color: red;\">Button1</b>' +\n *                           '</ng-transclude>' +\n *                         '</button>'\n *             };\n *         });\n * </script>\n * <!-- fallback button content -->\n * <my-button id=\"fallback\"></my-button>\n * <!-- modified button content -->\n * <my-button id=\"modified\">\n *   <i style=\"color: green;\">Button2</i>\n * </my-button>\n * </file>\n * <file name=\"protractor.js\" type=\"protractor\">\n * it('should have different transclude element content', function() {\n *          expect(element(by.id('fallback')).getText()).toBe('Button1');\n *          expect(element(by.id('modified')).getText()).toBe('Button2');\n *        });\n * </file>\n * </example>\n *\n * @example\n * ### Multi-slot transclusion\n * This example demonstrates using multi-slot transclusion in a component directive.\n * <example name=\"multiSlotTranscludeExample\" module=\"multiSlotTranscludeExample\">\n *   <file name=\"index.ced81ed4.html\">\n *    <style>\n *      .title, .footer {\n *        background-color: gray\n *      }\n *    </style>\n *    <div ng-controller=\"ExampleController\">\n *      <input ng-model=\"title\" aria-label=\"title\"> <br/>\n *      <textarea ng-model=\"text\" aria-label=\"text\"></textarea> <br/>\n *      <pane>\n *        <pane-title><a ng-href=\"{{link}}\">{{title}}</a></pane-title>\n *        <pane-body><p>{{text}}</p></pane-body>\n *      </pane>\n *    </div>\n *   </file>\n *   <file name=\"app.js\">\n *    angular.module('multiSlotTranscludeExample', [])\n *     .directive('pane', function() {\n *        return {\n *          restrict: 'E',\n *          transclude: {\n *            'title': '?paneTitle',\n *            'body': 'paneBody',\n *            'footer': '?paneFooter'\n *          },\n *          template: '<div style=\"border: 1px solid black;\">' +\n *                      '<div class=\"title\" ng-transclude=\"title\">Fallback Title</div>' +\n *                      '<div ng-transclude=\"body\"></div>' +\n *                      '<div class=\"footer\" ng-transclude=\"footer\">Fallback Footer</div>' +\n *                    '</div>'\n *        };\n *    })\n *    .controller('ExampleController', ['$scope', function($scope) {\n *      $scope.title = 'Lorem Ipsum';\n *      $scope.link = 'https://google.com';\n *      $scope.text = 'Neque porro quisquam est qui dolorem ipsum quia dolor...';\n *    }]);\n *   </file>\n *   <file name=\"protractor.js\" type=\"protractor\">\n *      it('should have transcluded the title and the body', function() {\n *        var titleElement = element(by.model('title'));\n *        titleElement.clear();\n *        titleElement.sendKeys('TITLE');\n *        var textElement = element(by.model('text'));\n *        textElement.clear();\n *        textElement.sendKeys('TEXT');\n *        expect(element(by.css('.title')).getText()).toEqual('TITLE');\n *        expect(element(by.binding('text')).getText()).toEqual('TEXT');\n *        expect(element(by.css('.footer')).getText()).toEqual('Fallback Footer');\n *      });\n *   </file>\n * </example>\n */\nvar ngTranscludeMinErr = minErr('ngTransclude');\nvar ngTranscludeDirective = ['$compile', function($compile) {\n  return {\n    restrict: 'EAC',\n    terminal: true,\n    compile: function ngTranscludeCompile(tElement) {\n\n      // Remove and cache any original content to act as a fallback\n      var fallbackLinkFn = $compile(tElement.contents());\n      tElement.empty();\n\n      return function ngTranscludePostLink($scope, $element, $attrs, controller, $transclude) {\n\n        if (!$transclude) {\n          throw ngTranscludeMinErr('orphan',\n          'Illegal use of ngTransclude directive in the template! ' +\n          'No parent directive that requires a transclusion found. ' +\n          'Element: {0}',\n          startingTag($element));\n        }\n\n\n        // If the attribute is of the form: `ng-transclude=\"ng-transclude\"` then treat it like the default\n        if ($attrs.ngTransclude === $attrs.$attr.ngTransclude) {\n          $attrs.ngTransclude = '';\n        }\n        var slotName = $attrs.ngTransclude || $attrs.ngTranscludeSlot;\n\n        // If the slot is required and no transclusion content is provided then this call will throw an error\n        $transclude(ngTranscludeCloneAttachFn, null, slotName);\n\n        // If the slot is optional and no transclusion content is provided then use the fallback content\n        if (slotName && !$transclude.isSlotFilled(slotName)) {\n          useFallbackContent();\n        }\n\n        function ngTranscludeCloneAttachFn(clone, transcludedScope) {\n          if (clone.length && notWhitespace(clone)) {\n            $element.append(clone);\n          } else {\n            useFallbackContent();\n            // There is nothing linked against the transcluded scope since no content was available,\n            // so it should be safe to clean up the generated scope.\n            transcludedScope.$destroy();\n          }\n        }\n\n        function useFallbackContent() {\n          // Since this is the fallback content rather than the transcluded content,\n          // we link against the scope of this directive rather than the transcluded scope\n          fallbackLinkFn($scope, function(clone) {\n            $element.append(clone);\n          });\n        }\n\n        function notWhitespace(nodes) {\n          for (var i = 0, ii = nodes.length; i < ii; i++) {\n            var node = nodes[i];\n            if (node.nodeType !== NODE_TYPE_TEXT || node.nodeValue.trim()) {\n              return true;\n            }\n          }\n        }\n      };\n    }\n  };\n}];\n\n/**\n * @ngdoc directive\n * @name script\n * @restrict E\n *\n * @description\n * Load the content of a `<script>` element into {@link ng.$templateCache `$templateCache`}, so that the\n * template can be used by {@link ng.directive:ngInclude `ngInclude`},\n * {@link ngRoute.directive:ngView `ngView`}, or {@link guide/directive directives}. The type of the\n * `<script>` element must be specified as `text/ng-template`, and a cache name for the template must be\n * assigned through the element's `id`, which can then be used as a directive's `templateUrl`.\n *\n * @param {string} type Must be set to `'text/ng-template'`.\n * @param {string} id Cache name of the template.\n *\n * @example\n  <example  name=\"script-tag\">\n    <file name=\"index.ced81ed4.html\">\n      <script type=\"text/ng-template\" id=\"/tpl.html\">\n        Content of the template.\n      </script>\n\n      <a ng-click=\"currentTpl='/tpl.html'\" id=\"tpl-link\">Load inlined template</a>\n      <div id=\"tpl-content\" ng-include src=\"currentTpl\"></div>\n    </file>\n    <file name=\"protractor.js\" type=\"protractor\">\n      it('should load template defined inside script tag', function() {\n        element(by.css('#tpl-link')).click();\n        expect(element(by.css('#tpl-content')).getText()).toMatch(/Content of the template/);\n      });\n    </file>\n  </example>\n */\nvar scriptDirective = ['$templateCache', function($templateCache) {\n  return {\n    restrict: 'E',\n    terminal: true,\n    compile: function(element, attr) {\n      if (attr.type === 'text/ng-template') {\n        var templateUrl = attr.id,\n            text = element[0].text;\n\n        $templateCache.put(templateUrl, text);\n      }\n    }\n  };\n}];\n\n/* exported selectDirective, optionDirective */\n\nvar noopNgModelController = { $setViewValue: noop, $render: noop };\n\nfunction setOptionSelectedStatus(optionEl, value) {\n  optionEl.prop('selected', value); // needed for IE\n  /**\n   * When unselecting an option, setting the property to null / false should be enough\n   * However, screenreaders might react to the selected attribute instead, see\n   * https://github.com/angular/angular.js/issues/14419\n   * Note: \"selected\" is a boolean attr and will be removed when the \"value\" arg in attr() is false\n   * or null\n   */\n  optionEl.attr('selected', value);\n}\n\n/**\n * @ngdoc type\n * @name  select.SelectController\n * @description\n * The controller for the `<select>` directive. This provides support for reading\n * and writing the selected value(s) of the control and also coordinates dynamically\n * added `<option>` elements, perhaps by an `ngRepeat` directive.\n */\nvar SelectController =\n        ['$element', '$scope', /** @this */ function($element, $scope) {\n\n  var self = this,\n      optionsMap = new NgMap();\n\n  self.selectValueMap = {}; // Keys are the hashed values, values the original values\n\n  // If the ngModel doesn't get provided then provide a dummy noop version to prevent errors\n  self.ngModelCtrl = noopNgModelController;\n  self.multiple = false;\n\n  // The \"unknown\" option is one that is prepended to the list if the viewValue\n  // does not match any of the options. When it is rendered the value of the unknown\n  // option is '? XXX ?' where XXX is the hashKey of the value that is not known.\n  //\n  // We can't just jqLite('<option>') since jqLite is not smart enough\n  // to create it in <select> and IE barfs otherwise.\n  self.unknownOption = jqLite(window.document.createElement('option'));\n\n  // The empty option is an option with the value '' that te application developer can\n  // provide inside the select. When the model changes to a value that doesn't match an option,\n  // it is selected - so if an empty option is provided, no unknown option is generated.\n  // However, the empty option is not removed when the model matches an option. It is always selectable\n  // and indicates that a \"null\" selection has been made.\n  self.hasEmptyOption = false;\n  self.emptyOption = undefined;\n\n  self.renderUnknownOption = function(val) {\n    var unknownVal = self.generateUnknownOptionValue(val);\n    self.unknownOption.val(unknownVal);\n    $element.prepend(self.unknownOption);\n    setOptionSelectedStatus(self.unknownOption, true);\n    $element.val(unknownVal);\n  };\n\n  self.updateUnknownOption = function(val) {\n    var unknownVal = self.generateUnknownOptionValue(val);\n    self.unknownOption.val(unknownVal);\n    setOptionSelectedStatus(self.unknownOption, true);\n    $element.val(unknownVal);\n  };\n\n  self.generateUnknownOptionValue = function(val) {\n    return '? ' + hashKey(val) + ' ?';\n  };\n\n  self.removeUnknownOption = function() {\n    if (self.unknownOption.parent()) self.unknownOption.remove();\n  };\n\n  self.selectEmptyOption = function() {\n    if (self.emptyOption) {\n      $element.val('');\n      setOptionSelectedStatus(self.emptyOption, true);\n    }\n  };\n\n  self.unselectEmptyOption = function() {\n    if (self.hasEmptyOption) {\n      self.emptyOption.removeAttr('selected');\n    }\n  };\n\n  $scope.$on('$destroy', function() {\n    // disable unknown option so that we don't do work when the whole select is being destroyed\n    self.renderUnknownOption = noop;\n  });\n\n  // Read the value of the select control, the implementation of this changes depending\n  // upon whether the select can have multiple values and whether ngOptions is at work.\n  self.readValue = function readSingleValue() {\n    var val = $element.val();\n    // ngValue added option values are stored in the selectValueMap, normal interpolations are not\n    var realVal = val in self.selectValueMap ? self.selectValueMap[val] : val;\n\n    if (self.hasOption(realVal)) {\n      return realVal;\n    }\n\n    return null;\n  };\n\n\n  // Write the value to the select control, the implementation of this changes depending\n  // upon whether the select can have multiple values and whether ngOptions is at work.\n  self.writeValue = function writeSingleValue(value) {\n    // Make sure to remove the selected attribute from the previously selected option\n    // Otherwise, screen readers might get confused\n    var currentlySelectedOption = $element[0].options[$element[0].selectedIndex];\n    if (currentlySelectedOption) setOptionSelectedStatus(jqLite(currentlySelectedOption), false);\n\n    if (self.hasOption(value)) {\n      self.removeUnknownOption();\n\n      var hashedVal = hashKey(value);\n      $element.val(hashedVal in self.selectValueMap ? hashedVal : value);\n\n      // Set selected attribute and property on selected option for screen readers\n      var selectedOption = $element[0].options[$element[0].selectedIndex];\n      setOptionSelectedStatus(jqLite(selectedOption), true);\n    } else {\n      if (value == null && self.emptyOption) {\n        self.removeUnknownOption();\n        self.selectEmptyOption();\n      } else if (self.unknownOption.parent().length) {\n        self.updateUnknownOption(value);\n      } else {\n        self.renderUnknownOption(value);\n      }\n    }\n  };\n\n\n  // Tell the select control that an option, with the given value, has been added\n  self.addOption = function(value, element) {\n    // Skip comment nodes, as they only pollute the `optionsMap`\n    if (element[0].nodeType === NODE_TYPE_COMMENT) return;\n\n    assertNotHasOwnProperty(value, '\"option value\"');\n    if (value === '') {\n      self.hasEmptyOption = true;\n      self.emptyOption = element;\n    }\n    var count = optionsMap.get(value) || 0;\n    optionsMap.set(value, count + 1);\n    // Only render at the end of a digest. This improves render performance when many options\n    // are added during a digest and ensures all relevant options are correctly marked as selected\n    scheduleRender();\n  };\n\n  // Tell the select control that an option, with the given value, has been removed\n  self.removeOption = function(value) {\n    var count = optionsMap.get(value);\n    if (count) {\n      if (count === 1) {\n        optionsMap.delete(value);\n        if (value === '') {\n          self.hasEmptyOption = false;\n          self.emptyOption = undefined;\n        }\n      } else {\n        optionsMap.set(value, count - 1);\n      }\n    }\n  };\n\n  // Check whether the select control has an option matching the given value\n  self.hasOption = function(value) {\n    return !!optionsMap.get(value);\n  };\n\n\n  var renderScheduled = false;\n  function scheduleRender() {\n    if (renderScheduled) return;\n    renderScheduled = true;\n    $scope.$$postDigest(function() {\n      renderScheduled = false;\n      self.ngModelCtrl.$render();\n    });\n  }\n\n  var updateScheduled = false;\n  function scheduleViewValueUpdate(renderAfter) {\n    if (updateScheduled) return;\n\n    updateScheduled = true;\n\n    $scope.$$postDigest(function() {\n      if ($scope.$$destroyed) return;\n\n      updateScheduled = false;\n      self.ngModelCtrl.$setViewValue(self.readValue());\n      if (renderAfter) self.ngModelCtrl.$render();\n    });\n  }\n\n\n  self.registerOption = function(optionScope, optionElement, optionAttrs, interpolateValueFn, interpolateTextFn) {\n\n    if (optionAttrs.$attr.ngValue) {\n      // The value attribute is set by ngValue\n      var oldVal, hashedVal = NaN;\n      optionAttrs.$observe('value', function valueAttributeObserveAction(newVal) {\n\n        var removal;\n        var previouslySelected = optionElement.prop('selected');\n\n        if (isDefined(hashedVal)) {\n          self.removeOption(oldVal);\n          delete self.selectValueMap[hashedVal];\n          removal = true;\n        }\n\n        hashedVal = hashKey(newVal);\n        oldVal = newVal;\n        self.selectValueMap[hashedVal] = newVal;\n        self.addOption(newVal, optionElement);\n        // Set the attribute directly instead of using optionAttrs.$set - this stops the observer\n        // from firing a second time. Other $observers on value will also get the result of the\n        // ngValue expression, not the hashed value\n        optionElement.attr('value', hashedVal);\n\n        if (removal && previouslySelected) {\n          scheduleViewValueUpdate();\n        }\n\n      });\n    } else if (interpolateValueFn) {\n      // The value attribute is interpolated\n      optionAttrs.$observe('value', function valueAttributeObserveAction(newVal) {\n        // This method is overwritten in ngOptions and has side-effects!\n        self.readValue();\n\n        var removal;\n        var previouslySelected = optionElement.prop('selected');\n\n        if (isDefined(oldVal)) {\n          self.removeOption(oldVal);\n          removal = true;\n        }\n        oldVal = newVal;\n        self.addOption(newVal, optionElement);\n\n        if (removal && previouslySelected) {\n          scheduleViewValueUpdate();\n        }\n      });\n    } else if (interpolateTextFn) {\n      // The text content is interpolated\n      optionScope.$watch(interpolateTextFn, function interpolateWatchAction(newVal, oldVal) {\n        optionAttrs.$set('value', newVal);\n        var previouslySelected = optionElement.prop('selected');\n        if (oldVal !== newVal) {\n          self.removeOption(oldVal);\n        }\n        self.addOption(newVal, optionElement);\n\n        if (oldVal && previouslySelected) {\n          scheduleViewValueUpdate();\n        }\n      });\n    } else {\n      // The value attribute is static\n      self.addOption(optionAttrs.value, optionElement);\n    }\n\n\n    optionAttrs.$observe('disabled', function(newVal) {\n\n      // Since model updates will also select disabled options (like ngOptions),\n      // we only have to handle options becoming disabled, not enabled\n\n      if (newVal === 'true' || newVal && optionElement.prop('selected')) {\n        if (self.multiple) {\n          scheduleViewValueUpdate(true);\n        } else {\n          self.ngModelCtrl.$setViewValue(null);\n          self.ngModelCtrl.$render();\n        }\n      }\n    });\n\n    optionElement.on('$destroy', function() {\n      var currentValue = self.readValue();\n      var removeValue = optionAttrs.value;\n\n      self.removeOption(removeValue);\n      scheduleRender();\n\n      if (self.multiple && currentValue && currentValue.indexOf(removeValue) !== -1 ||\n          currentValue === removeValue\n      ) {\n        // When multiple (selected) options are destroyed at the same time, we don't want\n        // to run a model update for each of them. Instead, run a single update in the $$postDigest\n        scheduleViewValueUpdate(true);\n      }\n    });\n  };\n}];\n\n/**\n * @ngdoc directive\n * @name select\n * @restrict E\n *\n * @description\n * HTML `select` element with angular data-binding.\n *\n * The `select` directive is used together with {@link ngModel `ngModel`} to provide data-binding\n * between the scope and the `<select>` control (including setting default values).\n * It also handles dynamic `<option>` elements, which can be added using the {@link ngRepeat `ngRepeat}` or\n * {@link ngOptions `ngOptions`} directives.\n *\n * When an item in the `<select>` menu is selected, the value of the selected option will be bound\n * to the model identified by the `ngModel` directive. With static or repeated options, this is\n * the content of the `value` attribute or the textContent of the `<option>`, if the value attribute is missing.\n * Value and textContent can be interpolated.\n *\n * ## Matching model and option values\n *\n * In general, the match between the model and an option is evaluated by strictly comparing the model\n * value against the value of the available options.\n *\n * If you are setting the option value with the option's `value` attribute, or textContent, the\n * value will always be a `string` which means that the model value must also be a string.\n * Otherwise the `select` directive cannot match them correctly.\n *\n * To bind the model to a non-string value, you can use one of the following strategies:\n * - the {@link ng.ngOptions `ngOptions`} directive\n *   ({@link ng.select#using-select-with-ngoptions-and-setting-a-default-value})\n * - the {@link ng.ngValue `ngValue`} directive, which allows arbitrary expressions to be\n *   option values ({@link ng.select#using-ngvalue-to-bind-the-model-to-an-array-of-objects Example})\n * - model $parsers / $formatters to convert the string value\n *   ({@link ng.select#binding-select-to-a-non-string-value-via-ngmodel-parsing-formatting Example})\n *\n * If the viewValue of `ngModel` does not match any of the options, then the control\n * will automatically add an \"unknown\" option, which it then removes when the mismatch is resolved.\n *\n * Optionally, a single hard-coded `<option>` element, with the value set to an empty string, can\n * be nested into the `<select>` element. This element will then represent the `null` or \"not selected\"\n * option. See example below for demonstration.\n *\n * ## Choosing between `ngRepeat` and `ngOptions`\n *\n * In many cases, `ngRepeat` can be used on `<option>` elements instead of {@link ng.directive:ngOptions\n * ngOptions} to achieve a similar result. However, `ngOptions` provides some benefits:\n * - more flexibility in how the `<select>`'s model is assigned via the `select` **`as`** part of the\n * comprehension expression\n * - reduced memory consumption by not creating a new scope for each repeated instance\n * - increased render speed by creating the options in a documentFragment instead of individually\n *\n * Specifically, select with repeated options slows down significantly starting at 2000 options in\n * Chrome and Internet Explorer / Edge.\n *\n *\n * @param {string} ngModel Assignable angular expression to data-bind to.\n * @param {string=} name Property name of the form under which the control is published.\n * @param {string=} multiple Allows multiple options to be selected. The selected values will be\n *     bound to the model as an array.\n * @param {string=} required Sets `required` validation error key if the value is not entered.\n * @param {string=} ngRequired Adds required attribute and required validation constraint to\n * the element when the ngRequired expression evaluates to true. Use ngRequired instead of required\n * when you want to data-bind to the required attribute.\n * @param {string=} ngChange Angular expression to be executed when selected option(s) changes due to user\n *    interaction with the select element.\n * @param {string=} ngOptions sets the options that the select is populated with and defines what is\n * set on the model on selection. See {@link ngOptions `ngOptions`}.\n * @param {string=} ngAttrSize sets the size of the select element dynamically. Uses the\n * {@link guide/interpolation#-ngattr-for-binding-to-arbitrary-attributes ngAttr} directive.\n *\n * @example\n * ### Simple `select` elements with static options\n *\n * <example name=\"static-select\" module=\"staticSelect\">\n * <file name=\"index.ced81ed4.html\">\n * <div ng-controller=\"ExampleController\">\n *   <form name=\"myForm\">\n *     <label for=\"singleSelect\"> Single select: </label><br>\n *     <select name=\"singleSelect\" ng-model=\"data.singleSelect\">\n *       <option value=\"option-1\">Option 1</option>\n *       <option value=\"option-2\">Option 2</option>\n *     </select><br>\n *\n *     <label for=\"singleSelect\"> Single select with \"not selected\" option and dynamic option values: </label><br>\n *     <select name=\"singleSelect\" id=\"singleSelect\" ng-model=\"data.singleSelect\">\n *       <option value=\"\">---Please select---</option> <!-- not selected / blank option -->\n *       <option value=\"{{data.option1}}\">Option 1</option> <!-- interpolation -->\n *       <option value=\"option-2\">Option 2</option>\n *     </select><br>\n *     <button ng-click=\"forceUnknownOption()\">Force unknown option</button><br>\n *     <tt>singleSelect = {{data.singleSelect}}</tt>\n *\n *     <hr>\n *     <label for=\"multipleSelect\"> Multiple select: </label><br>\n *     <select name=\"multipleSelect\" id=\"multipleSelect\" ng-model=\"data.multipleSelect\" multiple>\n *       <option value=\"option-1\">Option 1</option>\n *       <option value=\"option-2\">Option 2</option>\n *       <option value=\"option-3\">Option 3</option>\n *     </select><br>\n *     <tt>multipleSelect = {{data.multipleSelect}}</tt><br/>\n *   </form>\n * </div>\n * </file>\n * <file name=\"app.js\">\n *  angular.module('staticSelect', [])\n *    .controller('ExampleController', ['$scope', function($scope) {\n *      $scope.data = {\n *       singleSelect: null,\n *       multipleSelect: [],\n *       option1: 'option-1'\n *      };\n *\n *      $scope.forceUnknownOption = function() {\n *        $scope.data.singleSelect = 'nonsense';\n *      };\n *   }]);\n * </file>\n *</example>\n *\n * ### Using `ngRepeat` to generate `select` options\n * <example name=\"select-ngrepeat\" module=\"ngrepeatSelect\">\n * <file name=\"index.ced81ed4.html\">\n * <div ng-controller=\"ExampleController\">\n *   <form name=\"myForm\">\n *     <label for=\"repeatSelect\"> Repeat select: </label>\n *     <select name=\"repeatSelect\" id=\"repeatSelect\" ng-model=\"data.model\">\n *       <option ng-repeat=\"option in data.availableOptions\" value=\"{{option.id}}\">{{option.name}}</option>\n *     </select>\n *   </form>\n *   <hr>\n *   <tt>model = {{data.model}}</tt><br/>\n * </div>\n * </file>\n * <file name=\"app.js\">\n *  angular.module('ngrepeatSelect', [])\n *    .controller('ExampleController', ['$scope', function($scope) {\n *      $scope.data = {\n *       model: null,\n *       availableOptions: [\n *         {id: '1', name: 'Option A'},\n *         {id: '2', name: 'Option B'},\n *         {id: '3', name: 'Option C'}\n *       ]\n *      };\n *   }]);\n * </file>\n *</example>\n *\n * ### Using `ngValue` to bind the model to an array of objects\n * <example name=\"select-ngvalue\" module=\"ngvalueSelect\">\n * <file name=\"index.ced81ed4.html\">\n * <div ng-controller=\"ExampleController\">\n *   <form name=\"myForm\">\n *     <label for=\"ngvalueselect\"> ngvalue select: </label>\n *     <select size=\"6\" name=\"ngvalueselect\" ng-model=\"data.model\" multiple>\n *       <option ng-repeat=\"option in data.availableOptions\" ng-value=\"option.value\">{{option.name}}</option>\n *     </select>\n *   </form>\n *   <hr>\n *   <pre>model = {{data.model | json}}</pre><br/>\n * </div>\n * </file>\n * <file name=\"app.js\">\n *  angular.module('ngvalueSelect', [])\n *    .controller('ExampleController', ['$scope', function($scope) {\n *      $scope.data = {\n *       model: null,\n *       availableOptions: [\n           {value: 'myString', name: 'string'},\n           {value: 1, name: 'integer'},\n           {value: true, name: 'boolean'},\n           {value: null, name: 'null'},\n           {value: {prop: 'value'}, name: 'object'},\n           {value: ['a'], name: 'array'}\n *       ]\n *      };\n *   }]);\n * </file>\n *</example>\n *\n * ### Using `select` with `ngOptions` and setting a default value\n * See the {@link ngOptions ngOptions documentation} for more `ngOptions` usage examples.\n *\n * <example name=\"select-with-default-values\" module=\"defaultValueSelect\">\n * <file name=\"index.ced81ed4.html\">\n * <div ng-controller=\"ExampleController\">\n *   <form name=\"myForm\">\n *     <label for=\"mySelect\">Make a choice:</label>\n *     <select name=\"mySelect\" id=\"mySelect\"\n *       ng-options=\"option.name for option in data.availableOptions track by option.id\"\n *       ng-model=\"data.selectedOption\"></select>\n *   </form>\n *   <hr>\n *   <tt>option = {{data.selectedOption}}</tt><br/>\n * </div>\n * </file>\n * <file name=\"app.js\">\n *  angular.module('defaultValueSelect', [])\n *    .controller('ExampleController', ['$scope', function($scope) {\n *      $scope.data = {\n *       availableOptions: [\n *         {id: '1', name: 'Option A'},\n *         {id: '2', name: 'Option B'},\n *         {id: '3', name: 'Option C'}\n *       ],\n *       selectedOption: {id: '3', name: 'Option C'} //This sets the default value of the select in the ui\n *       };\n *   }]);\n * </file>\n *</example>\n *\n *\n * ### Binding `select` to a non-string value via `ngModel` parsing / formatting\n *\n * <example name=\"select-with-non-string-options\" module=\"nonStringSelect\">\n *   <file name=\"index.ced81ed4.html\">\n *     <select ng-model=\"model.id\" convert-to-number>\n *       <option value=\"0\">Zero</option>\n *       <option value=\"1\">One</option>\n *       <option value=\"2\">Two</option>\n *     </select>\n *     {{ model }}\n *   </file>\n *   <file name=\"app.js\">\n *     angular.module('nonStringSelect', [])\n *       .run(function($rootScope) {\n *         $rootScope.model = { id: 2 };\n *       })\n *       .directive('convertToNumber', function() {\n *         return {\n *           require: 'ngModel',\n *           link: function(scope, element, attrs, ngModel) {\n *             ngModel.$parsers.push(function(val) {\n *               return parseInt(val, 10);\n *             });\n *             ngModel.$formatters.push(function(val) {\n *               return '' + val;\n *             });\n *           }\n *         };\n *       });\n *   </file>\n *   <file name=\"protractor.js\" type=\"protractor\">\n *     it('should initialize to model', function() {\n *       expect(element(by.model('model.id')).$('option:checked').getText()).toEqual('Two');\n *     });\n *   </file>\n * </example>\n *\n */\nvar selectDirective = function() {\n\n  return {\n    restrict: 'E',\n    require: ['select', '?ngModel'],\n    controller: SelectController,\n    priority: 1,\n    link: {\n      pre: selectPreLink,\n      post: selectPostLink\n    }\n  };\n\n  function selectPreLink(scope, element, attr, ctrls) {\n\n      var selectCtrl = ctrls[0];\n      var ngModelCtrl = ctrls[1];\n\n      // if ngModel is not defined, we don't need to do anything but set the registerOption\n      // function to noop, so options don't get added internally\n      if (!ngModelCtrl) {\n        selectCtrl.registerOption = noop;\n        return;\n      }\n\n\n      selectCtrl.ngModelCtrl = ngModelCtrl;\n\n      // When the selected item(s) changes we delegate getting the value of the select control\n      // to the `readValue` method, which can be changed if the select can have multiple\n      // selected values or if the options are being generated by `ngOptions`\n      element.on('change', function() {\n        selectCtrl.removeUnknownOption();\n        scope.$apply(function() {\n          ngModelCtrl.$setViewValue(selectCtrl.readValue());\n        });\n      });\n\n      // If the select allows multiple values then we need to modify how we read and write\n      // values from and to the control; also what it means for the value to be empty and\n      // we have to add an extra watch since ngModel doesn't work well with arrays - it\n      // doesn't trigger rendering if only an item in the array changes.\n      if (attr.multiple) {\n        selectCtrl.multiple = true;\n\n        // Read value now needs to check each option to see if it is selected\n        selectCtrl.readValue = function readMultipleValue() {\n          var array = [];\n          forEach(element.find('option'), function(option) {\n            if (option.selected && !option.disabled) {\n              var val = option.value;\n              array.push(val in selectCtrl.selectValueMap ? selectCtrl.selectValueMap[val] : val);\n            }\n          });\n          return array;\n        };\n\n        // Write value now needs to set the selected property of each matching option\n        selectCtrl.writeValue = function writeMultipleValue(value) {\n          forEach(element.find('option'), function(option) {\n            var shouldBeSelected = !!value && (includes(value, option.value) ||\n                                               includes(value, selectCtrl.selectValueMap[option.value]));\n            var currentlySelected = option.selected;\n\n            // IE and Edge, adding options to the selection via shift+click/UP/DOWN,\n            // will de-select already selected options if \"selected\" on those options was set\n            // more than once (i.e. when the options were already selected)\n            // So we only modify the selected property if neccessary.\n            // Note: this behavior cannot be replicated via unit tests because it only shows in the\n            // actual user interface.\n            if (shouldBeSelected !== currentlySelected) {\n              setOptionSelectedStatus(jqLite(option), shouldBeSelected);\n            }\n\n          });\n        };\n\n        // we have to do it on each watch since ngModel watches reference, but\n        // we need to work of an array, so we need to see if anything was inserted/removed\n        var lastView, lastViewRef = NaN;\n        scope.$watch(function selectMultipleWatch() {\n          if (lastViewRef === ngModelCtrl.$viewValue && !equals(lastView, ngModelCtrl.$viewValue)) {\n            lastView = shallowCopy(ngModelCtrl.$viewValue);\n            ngModelCtrl.$render();\n          }\n          lastViewRef = ngModelCtrl.$viewValue;\n        });\n\n        // If we are a multiple select then value is now a collection\n        // so the meaning of $isEmpty changes\n        ngModelCtrl.$isEmpty = function(value) {\n          return !value || value.length === 0;\n        };\n\n      }\n    }\n\n    function selectPostLink(scope, element, attrs, ctrls) {\n      // if ngModel is not defined, we don't need to do anything\n      var ngModelCtrl = ctrls[1];\n      if (!ngModelCtrl) return;\n\n      var selectCtrl = ctrls[0];\n\n      // We delegate rendering to the `writeValue` method, which can be changed\n      // if the select can have multiple selected values or if the options are being\n      // generated by `ngOptions`.\n      // This must be done in the postLink fn to prevent $render to be called before\n      // all nodes have been linked correctly.\n      ngModelCtrl.$render = function() {\n        selectCtrl.writeValue(ngModelCtrl.$viewValue);\n      };\n    }\n};\n\n\n// The option directive is purely designed to communicate the existence (or lack of)\n// of dynamically created (and destroyed) option elements to their containing select\n// directive via its controller.\nvar optionDirective = ['$interpolate', function($interpolate) {\n  return {\n    restrict: 'E',\n    priority: 100,\n    compile: function(element, attr) {\n      var interpolateValueFn, interpolateTextFn;\n\n      if (isDefined(attr.ngValue)) {\n        // Will be handled by registerOption\n      } else if (isDefined(attr.value)) {\n        // If the value attribute is defined, check if it contains an interpolation\n        interpolateValueFn = $interpolate(attr.value, true);\n      } else {\n        // If the value attribute is not defined then we fall back to the\n        // text content of the option element, which may be interpolated\n        interpolateTextFn = $interpolate(element.text(), true);\n        if (!interpolateTextFn) {\n          attr.$set('value', element.text());\n        }\n      }\n\n      return function(scope, element, attr) {\n        // This is an optimization over using ^^ since we don't want to have to search\n        // all the way to the root of the DOM for every single option element\n        var selectCtrlName = '$selectController',\n            parent = element.parent(),\n            selectCtrl = parent.data(selectCtrlName) ||\n              parent.parent().data(selectCtrlName); // in case we are in optgroup\n\n        if (selectCtrl) {\n          selectCtrl.registerOption(scope, element, attr, interpolateValueFn, interpolateTextFn);\n        }\n      };\n    }\n  };\n}];\n\n/**\n * @ngdoc directive\n * @name ngRequired\n * @restrict A\n *\n * @description\n *\n * ngRequired adds the required {@link ngModel.NgModelController#$validators `validator`} to {@link ngModel `ngModel`}.\n * It is most often used for {@link input `input`} and {@link select `select`} controls, but can also be\n * applied to custom controls.\n *\n * The directive sets the `required` attribute on the element if the Angular expression inside\n * `ngRequired` evaluates to true. A special directive for setting `required` is necessary because we\n * cannot use interpolation inside `required`. See the {@link guide/interpolation interpolation guide}\n * for more info.\n *\n * The validator will set the `required` error key to true if the `required` attribute is set and\n * calling {@link ngModel.NgModelController#$isEmpty `NgModelController.$isEmpty`} with the\n * {@link ngModel.NgModelController#$viewValue `ngModel.$viewValue`} returns `true`. For example, the\n * `$isEmpty()` implementation for `input[text]` checks the length of the `$viewValue`. When developing\n * custom controls, `$isEmpty()` can be overwritten to account for a $viewValue that is not string-based.\n *\n * @example\n * <example name=\"ngRequiredDirective\" module=\"ngRequiredExample\">\n *   <file name=\"index.ced81ed4.html\">\n *     <script>\n *       angular.module('ngRequiredExample', [])\n *         .controller('ExampleController', ['$scope', function($scope) {\n *           $scope.required = true;\n *         }]);\n *     </script>\n *     <div ng-controller=\"ExampleController\">\n *       <form name=\"form\">\n *         <label for=\"required\">Toggle required: </label>\n *         <input type=\"checkbox\" ng-model=\"required\" id=\"required\" />\n *         <br>\n *         <label for=\"input\">This input must be filled if `required` is true: </label>\n *         <input type=\"text\" ng-model=\"model\" id=\"input\" name=\"input\" ng-required=\"required\" /><br>\n *         <hr>\n *         required error set? = <code>{{form.input.$error.required}}</code><br>\n *         model = <code>{{model}}</code>\n *       </form>\n *     </div>\n *   </file>\n *   <file name=\"protractor.js\" type=\"protractor\">\n       var required = element(by.binding('form.input.$error.required'));\n       var model = element(by.binding('model'));\n       var input = element(by.id('input'));\n\n       it('should set the required error', function() {\n         expect(required.getText()).toContain('true');\n\n         input.sendKeys('123');\n         expect(required.getText()).not.toContain('true');\n         expect(model.getText()).toContain('123');\n       });\n *   </file>\n * </example>\n */\nvar requiredDirective = function() {\n  return {\n    restrict: 'A',\n    require: '?ngModel',\n    link: function(scope, elm, attr, ctrl) {\n      if (!ctrl) return;\n      attr.required = true; // force truthy in case we are on non input element\n\n      ctrl.$validators.required = function(modelValue, viewValue) {\n        return !attr.required || !ctrl.$isEmpty(viewValue);\n      };\n\n      attr.$observe('required', function() {\n        ctrl.$validate();\n      });\n    }\n  };\n};\n\n/**\n * @ngdoc directive\n * @name ngPattern\n *\n * @description\n *\n * ngPattern adds the pattern {@link ngModel.NgModelController#$validators `validator`} to {@link ngModel `ngModel`}.\n * It is most often used for text-based {@link input `input`} controls, but can also be applied to custom text-based controls.\n *\n * The validator sets the `pattern` error key if the {@link ngModel.NgModelController#$viewValue `ngModel.$viewValue`}\n * does not match a RegExp which is obtained by evaluating the Angular expression given in the\n * `ngPattern` attribute value:\n * * If the expression evaluates to a RegExp object, then this is used directly.\n * * If the expression evaluates to a string, then it will be converted to a RegExp after wrapping it\n * in `^` and `$` characters. For instance, `\"abc\"` will be converted to `new RegExp('^abc$')`.\n *\n * <div class=\"alert alert-info\">\n * **Note:** Avoid using the `g` flag on the RegExp, as it will cause each successive search to\n * start at the index of the last search's match, thus not taking the whole input value into\n * account.\n * </div>\n *\n * <div class=\"alert alert-info\">\n * **Note:** This directive is also added when the plain `pattern` attribute is used, with two\n * differences:\n * <ol>\n *   <li>\n *     `ngPattern` does not set the `pattern` attribute and therefore HTML5 constraint validation is\n *     not available.\n *   </li>\n *   <li>\n *     The `ngPattern` attribute must be an expression, while the `pattern` value must be\n *     interpolated.\n *   </li>\n * </ol>\n * </div>\n *\n * @example\n * <example name=\"ngPatternDirective\" module=\"ngPatternExample\">\n *   <file name=\"index.ced81ed4.html\">\n *     <script>\n *       angular.module('ngPatternExample', [])\n *         .controller('ExampleController', ['$scope', function($scope) {\n *           $scope.regex = '\\\\d+';\n *         }]);\n *     </script>\n *     <div ng-controller=\"ExampleController\">\n *       <form name=\"form\">\n *         <label for=\"regex\">Set a pattern (regex string): </label>\n *         <input type=\"text\" ng-model=\"regex\" id=\"regex\" />\n *         <br>\n *         <label for=\"input\">This input is restricted by the current pattern: </label>\n *         <input type=\"text\" ng-model=\"model\" id=\"input\" name=\"input\" ng-pattern=\"regex\" /><br>\n *         <hr>\n *         input valid? = <code>{{form.input.$valid}}</code><br>\n *         model = <code>{{model}}</code>\n *       </form>\n *     </div>\n *   </file>\n *   <file name=\"protractor.js\" type=\"protractor\">\n       var model = element(by.binding('model'));\n       var input = element(by.id('input'));\n\n       it('should validate the input with the default pattern', function() {\n         input.sendKeys('aaa');\n         expect(model.getText()).not.toContain('aaa');\n\n         input.clear().then(function() {\n           input.sendKeys('123');\n           expect(model.getText()).toContain('123');\n         });\n       });\n *   </file>\n * </example>\n */\nvar patternDirective = function() {\n  return {\n    restrict: 'A',\n    require: '?ngModel',\n    link: function(scope, elm, attr, ctrl) {\n      if (!ctrl) return;\n\n      var regexp, patternExp = attr.ngPattern || attr.pattern;\n      attr.$observe('pattern', function(regex) {\n        if (isString(regex) && regex.length > 0) {\n          regex = new RegExp('^' + regex + '$');\n        }\n\n        if (regex && !regex.test) {\n          throw minErr('ngPattern')('noregexp',\n            'Expected {0} to be a RegExp but was {1}. Element: {2}', patternExp,\n            regex, startingTag(elm));\n        }\n\n        regexp = regex || undefined;\n        ctrl.$validate();\n      });\n\n      ctrl.$validators.pattern = function(modelValue, viewValue) {\n        // HTML5 pattern constraint validates the input value, so we validate the viewValue\n        return ctrl.$isEmpty(viewValue) || isUndefined(regexp) || regexp.test(viewValue);\n      };\n    }\n  };\n};\n\n/**\n * @ngdoc directive\n * @name ngMaxlength\n *\n * @description\n *\n * ngMaxlength adds the maxlength {@link ngModel.NgModelController#$validators `validator`} to {@link ngModel `ngModel`}.\n * It is most often used for text-based {@link input `input`} controls, but can also be applied to custom text-based controls.\n *\n * The validator sets the `maxlength` error key if the {@link ngModel.NgModelController#$viewValue `ngModel.$viewValue`}\n * is longer than the integer obtained by evaluating the Angular expression given in the\n * `ngMaxlength` attribute value.\n *\n * <div class=\"alert alert-info\">\n * **Note:** This directive is also added when the plain `maxlength` attribute is used, with two\n * differences:\n * <ol>\n *   <li>\n *     `ngMaxlength` does not set the `maxlength` attribute and therefore HTML5 constraint\n *     validation is not available.\n *   </li>\n *   <li>\n *     The `ngMaxlength` attribute must be an expression, while the `maxlength` value must be\n *     interpolated.\n *   </li>\n * </ol>\n * </div>\n *\n * @example\n * <example name=\"ngMaxlengthDirective\" module=\"ngMaxlengthExample\">\n *   <file name=\"index.ced81ed4.html\">\n *     <script>\n *       angular.module('ngMaxlengthExample', [])\n *         .controller('ExampleController', ['$scope', function($scope) {\n *           $scope.maxlength = 5;\n *         }]);\n *     </script>\n *     <div ng-controller=\"ExampleController\">\n *       <form name=\"form\">\n *         <label for=\"maxlength\">Set a maxlength: </label>\n *         <input type=\"number\" ng-model=\"maxlength\" id=\"maxlength\" />\n *         <br>\n *         <label for=\"input\">This input is restricted by the current maxlength: </label>\n *         <input type=\"text\" ng-model=\"model\" id=\"input\" name=\"input\" ng-maxlength=\"maxlength\" /><br>\n *         <hr>\n *         input valid? = <code>{{form.input.$valid}}</code><br>\n *         model = <code>{{model}}</code>\n *       </form>\n *     </div>\n *   </file>\n *   <file name=\"protractor.js\" type=\"protractor\">\n       var model = element(by.binding('model'));\n       var input = element(by.id('input'));\n\n       it('should validate the input with the default maxlength', function() {\n         input.sendKeys('abcdef');\n         expect(model.getText()).not.toContain('abcdef');\n\n         input.clear().then(function() {\n           input.sendKeys('abcde');\n           expect(model.getText()).toContain('abcde');\n         });\n       });\n *   </file>\n * </example>\n */\nvar maxlengthDirective = function() {\n  return {\n    restrict: 'A',\n    require: '?ngModel',\n    link: function(scope, elm, attr, ctrl) {\n      if (!ctrl) return;\n\n      var maxlength = -1;\n      attr.$observe('maxlength', function(value) {\n        var intVal = toInt(value);\n        maxlength = isNumberNaN(intVal) ? -1 : intVal;\n        ctrl.$validate();\n      });\n      ctrl.$validators.maxlength = function(modelValue, viewValue) {\n        return (maxlength < 0) || ctrl.$isEmpty(viewValue) || (viewValue.length <= maxlength);\n      };\n    }\n  };\n};\n\n/**\n * @ngdoc directive\n * @name ngMinlength\n *\n * @description\n *\n * ngMinlength adds the minlength {@link ngModel.NgModelController#$validators `validator`} to {@link ngModel `ngModel`}.\n * It is most often used for text-based {@link input `input`} controls, but can also be applied to custom text-based controls.\n *\n * The validator sets the `minlength` error key if the {@link ngModel.NgModelController#$viewValue `ngModel.$viewValue`}\n * is shorter than the integer obtained by evaluating the Angular expression given in the\n * `ngMinlength` attribute value.\n *\n * <div class=\"alert alert-info\">\n * **Note:** This directive is also added when the plain `minlength` attribute is used, with two\n * differences:\n * <ol>\n *   <li>\n *     `ngMinlength` does not set the `minlength` attribute and therefore HTML5 constraint\n *     validation is not available.\n *   </li>\n *   <li>\n *     The `ngMinlength` value must be an expression, while the `minlength` value must be\n *     interpolated.\n *   </li>\n * </ol>\n * </div>\n *\n * @example\n * <example name=\"ngMinlengthDirective\" module=\"ngMinlengthExample\">\n *   <file name=\"index.ced81ed4.html\">\n *     <script>\n *       angular.module('ngMinlengthExample', [])\n *         .controller('ExampleController', ['$scope', function($scope) {\n *           $scope.minlength = 3;\n *         }]);\n *     </script>\n *     <div ng-controller=\"ExampleController\">\n *       <form name=\"form\">\n *         <label for=\"minlength\">Set a minlength: </label>\n *         <input type=\"number\" ng-model=\"minlength\" id=\"minlength\" />\n *         <br>\n *         <label for=\"input\">This input is restricted by the current minlength: </label>\n *         <input type=\"text\" ng-model=\"model\" id=\"input\" name=\"input\" ng-minlength=\"minlength\" /><br>\n *         <hr>\n *         input valid? = <code>{{form.input.$valid}}</code><br>\n *         model = <code>{{model}}</code>\n *       </form>\n *     </div>\n *   </file>\n *   <file name=\"protractor.js\" type=\"protractor\">\n       var model = element(by.binding('model'));\n       var input = element(by.id('input'));\n\n       it('should validate the input with the default minlength', function() {\n         input.sendKeys('ab');\n         expect(model.getText()).not.toContain('ab');\n\n         input.sendKeys('abc');\n         expect(model.getText()).toContain('abc');\n       });\n *   </file>\n * </example>\n */\nvar minlengthDirective = function() {\n  return {\n    restrict: 'A',\n    require: '?ngModel',\n    link: function(scope, elm, attr, ctrl) {\n      if (!ctrl) return;\n\n      var minlength = 0;\n      attr.$observe('minlength', function(value) {\n        minlength = toInt(value) || 0;\n        ctrl.$validate();\n      });\n      ctrl.$validators.minlength = function(modelValue, viewValue) {\n        return ctrl.$isEmpty(viewValue) || viewValue.length >= minlength;\n      };\n    }\n  };\n};\n\nif (window.angular.bootstrap) {\n  // AngularJS is already loaded, so we can return here...\n  if (window.console) {\n    console.log('WARNING: Tried to load angular more than once.');\n  }\n  return;\n}\n\n// try to bind to jquery now so that one can write jqLite(fn)\n// but we will rebind on bootstrap again.\nbindJQuery();\n\npublishExternalAPI(angular);\n\nangular.module(\"ngLocale\", [], [\"$provide\", function($provide) {\nvar PLURAL_CATEGORY = {ZERO: \"zero\", ONE: \"one\", TWO: \"two\", FEW: \"few\", MANY: \"many\", OTHER: \"other\"};\nfunction getDecimals(n) {\n  n = n + '';\n  var i = n.indexOf('.');\n  return (i == -1) ? 0 : n.length - i - 1;\n}\n\nfunction getVF(n, opt_precision) {\n  var v = opt_precision;\n\n  if (undefined === v) {\n    v = Math.min(getDecimals(n), 3);\n  }\n\n  var base = Math.pow(10, v);\n  var f = ((n * base) | 0) % base;\n  return {v: v, f: f};\n}\n\n$provide.value(\"$locale\", {\n  \"DATETIME_FORMATS\": {\n    \"AMPMS\": [\n      \"AM\",\n      \"PM\"\n    ],\n    \"DAY\": [\n      \"Sunday\",\n      \"Monday\",\n      \"Tuesday\",\n      \"Wednesday\",\n      \"Thursday\",\n      \"Friday\",\n      \"Saturday\"\n    ],\n    \"ERANAMES\": [\n      \"Before Christ\",\n      \"Anno Domini\"\n    ],\n    \"ERAS\": [\n      \"BC\",\n      \"AD\"\n    ],\n    \"FIRSTDAYOFWEEK\": 6,\n    \"MONTH\": [\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    \"SHORTDAY\": [\n      \"Sun\",\n      \"Mon\",\n      \"Tue\",\n      \"Wed\",\n      \"Thu\",\n      \"Fri\",\n      \"Sat\"\n    ],\n    \"SHORTMONTH\": [\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    \"STANDALONEMONTH\": [\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    \"WEEKENDRANGE\": [\n      5,\n      6\n    ],\n    \"fullDate\": \"EEEE, MMMM d, y\",\n    \"longDate\": \"MMMM d, y\",\n    \"medium\": \"MMM d, y h:mm:ss a\",\n    \"mediumDate\": \"MMM d, y\",\n    \"mediumTime\": \"h:mm:ss a\",\n    \"short\": \"M/d/yy h:mm a\",\n    \"shortDate\": \"M/d/yy\",\n    \"shortTime\": \"h:mm a\"\n  },\n  \"NUMBER_FORMATS\": {\n    \"CURRENCY_SYM\": \"$\",\n    \"DECIMAL_SEP\": \".\",\n    \"GROUP_SEP\": \",\",\n    \"PATTERNS\": [\n      {\n        \"gSize\": 3,\n        \"lgSize\": 3,\n        \"maxFrac\": 3,\n        \"minFrac\": 0,\n        \"minInt\": 1,\n        \"negPre\": \"-\",\n        \"negSuf\": \"\",\n        \"posPre\": \"\",\n        \"posSuf\": \"\"\n      },\n      {\n        \"gSize\": 3,\n        \"lgSize\": 3,\n        \"maxFrac\": 2,\n        \"minFrac\": 2,\n        \"minInt\": 1,\n        \"negPre\": \"-\\u00a4\",\n        \"negSuf\": \"\",\n        \"posPre\": \"\\u00a4\",\n        \"posSuf\": \"\"\n      }\n    ]\n  },\n  \"id\": \"en-us\",\n  \"localeID\": \"en_US\",\n  \"pluralCat\": function(n, opt_precision) {  var i = n | 0;  var vf = getVF(n, opt_precision);  if (i == 1 && vf.v == 0) {    return PLURAL_CATEGORY.ONE;  }  return PLURAL_CATEGORY.OTHER;}\n});\n}]);\n\n  jqLite(function() {\n    angularInit(window.document, bootstrap);\n  });\n\n})(window);\n\n!window.angular.$$csp().noInlineStyle && window.angular.element(document.head).prepend('<style type=\"text/css\">@charset \"UTF-8\";[ng\\\\:cloak],[ng-cloak],[data-ng-cloak],[x-ng-cloak],.ng-cloak,.x-ng-cloak,.ng-hide:not(.ng-hide-animate){display:none !important;}ng\\\\:form{display:block;}.ng-animate-shim{visibility:hidden;}.ng-anchor{position:absolute;}</style>');\n/**\n * @license AngularJS v1.6.4\n * (c) 2010-2017 Google, Inc. http://angularjs.org\n * License: MIT\n */\n(function(window, angular) {'use strict';\n\nvar ELEMENT_NODE = 1;\nvar COMMENT_NODE = 8;\n\nvar ADD_CLASS_SUFFIX = '-add';\nvar REMOVE_CLASS_SUFFIX = '-remove';\nvar EVENT_CLASS_PREFIX = 'ng-';\nvar ACTIVE_CLASS_SUFFIX = '-active';\nvar PREPARE_CLASS_SUFFIX = '-prepare';\n\nvar NG_ANIMATE_CLASSNAME = 'ng-animate';\nvar NG_ANIMATE_CHILDREN_DATA = '$$ngAnimateChildren';\n\n// Detect proper transitionend/animationend event names.\nvar CSS_PREFIX = '', TRANSITION_PROP, TRANSITIONEND_EVENT, ANIMATION_PROP, ANIMATIONEND_EVENT;\n\n// If unprefixed events are not supported but webkit-prefixed are, use the latter.\n// Otherwise, just use W3C names, browsers not supporting them at all will just ignore them.\n// Note: Chrome implements `window.onwebkitanimationend` and doesn't implement `window.onanimationend`\n// but at the same time dispatches the `animationend` event and not `webkitAnimationEnd`.\n// Register both events in case `window.onanimationend` is not supported because of that,\n// do the same for `transitionend` as Safari is likely to exhibit similar behavior.\n// Also, the only modern browser that uses vendor prefixes for transitions/keyframes is webkit\n// therefore there is no reason to test anymore for other vendor prefixes:\n// http://caniuse.com/#search=transition\nif ((window.ontransitionend === undefined) && (window.onwebkittransitionend !== undefined)) {\n  CSS_PREFIX = '-webkit-';\n  TRANSITION_PROP = 'WebkitTransition';\n  TRANSITIONEND_EVENT = 'webkitTransitionEnd transitionend';\n} else {\n  TRANSITION_PROP = 'transition';\n  TRANSITIONEND_EVENT = 'transitionend';\n}\n\nif ((window.onanimationend === undefined) && (window.onwebkitanimationend !== undefined)) {\n  CSS_PREFIX = '-webkit-';\n  ANIMATION_PROP = 'WebkitAnimation';\n  ANIMATIONEND_EVENT = 'webkitAnimationEnd animationend';\n} else {\n  ANIMATION_PROP = 'animation';\n  ANIMATIONEND_EVENT = 'animationend';\n}\n\nvar DURATION_KEY = 'Duration';\nvar PROPERTY_KEY = 'Property';\nvar DELAY_KEY = 'Delay';\nvar TIMING_KEY = 'TimingFunction';\nvar ANIMATION_ITERATION_COUNT_KEY = 'IterationCount';\nvar ANIMATION_PLAYSTATE_KEY = 'PlayState';\nvar SAFE_FAST_FORWARD_DURATION_VALUE = 9999;\n\nvar ANIMATION_DELAY_PROP = ANIMATION_PROP + DELAY_KEY;\nvar ANIMATION_DURATION_PROP = ANIMATION_PROP + DURATION_KEY;\nvar TRANSITION_DELAY_PROP = TRANSITION_PROP + DELAY_KEY;\nvar TRANSITION_DURATION_PROP = TRANSITION_PROP + DURATION_KEY;\n\nvar ngMinErr = angular.$$minErr('ng');\nfunction assertArg(arg, name, reason) {\n  if (!arg) {\n    throw ngMinErr('areq', 'Argument \\'{0}\\' is {1}', (name || '?'), (reason || 'required'));\n  }\n  return arg;\n}\n\nfunction mergeClasses(a,b) {\n  if (!a && !b) return '';\n  if (!a) return b;\n  if (!b) return a;\n  if (isArray(a)) a = a.join(' ');\n  if (isArray(b)) b = b.join(' ');\n  return a + ' ' + b;\n}\n\nfunction packageStyles(options) {\n  var styles = {};\n  if (options && (options.to || options.from)) {\n    styles.to = options.to;\n    styles.from = options.from;\n  }\n  return styles;\n}\n\nfunction pendClasses(classes, fix, isPrefix) {\n  var className = '';\n  classes = isArray(classes)\n      ? classes\n      : classes && isString(classes) && classes.length\n          ? classes.split(/\\s+/)\n          : [];\n  forEach(classes, function(klass, i) {\n    if (klass && klass.length > 0) {\n      className += (i > 0) ? ' ' : '';\n      className += isPrefix ? fix + klass\n                            : klass + fix;\n    }\n  });\n  return className;\n}\n\nfunction removeFromArray(arr, val) {\n  var index = arr.indexOf(val);\n  if (val >= 0) {\n    arr.splice(index, 1);\n  }\n}\n\nfunction stripCommentsFromElement(element) {\n  if (element instanceof jqLite) {\n    switch (element.length) {\n      case 0:\n        return element;\n\n      case 1:\n        // there is no point of stripping anything if the element\n        // is the only element within the jqLite wrapper.\n        // (it's important that we retain the element instance.)\n        if (element[0].nodeType === ELEMENT_NODE) {\n          return element;\n        }\n        break;\n\n      default:\n        return jqLite(extractElementNode(element));\n    }\n  }\n\n  if (element.nodeType === ELEMENT_NODE) {\n    return jqLite(element);\n  }\n}\n\nfunction extractElementNode(element) {\n  if (!element[0]) return element;\n  for (var i = 0; i < element.length; i++) {\n    var elm = element[i];\n    if (elm.nodeType === ELEMENT_NODE) {\n      return elm;\n    }\n  }\n}\n\nfunction $$addClass($$jqLite, element, className) {\n  forEach(element, function(elm) {\n    $$jqLite.addClass(elm, className);\n  });\n}\n\nfunction $$removeClass($$jqLite, element, className) {\n  forEach(element, function(elm) {\n    $$jqLite.removeClass(elm, className);\n  });\n}\n\nfunction applyAnimationClassesFactory($$jqLite) {\n  return function(element, options) {\n    if (options.addClass) {\n      $$addClass($$jqLite, element, options.addClass);\n      options.addClass = null;\n    }\n    if (options.removeClass) {\n      $$removeClass($$jqLite, element, options.removeClass);\n      options.removeClass = null;\n    }\n  };\n}\n\nfunction prepareAnimationOptions(options) {\n  options = options || {};\n  if (!options.$$prepared) {\n    var domOperation = options.domOperation || noop;\n    options.domOperation = function() {\n      options.$$domOperationFired = true;\n      domOperation();\n      domOperation = noop;\n    };\n    options.$$prepared = true;\n  }\n  return options;\n}\n\nfunction applyAnimationStyles(element, options) {\n  applyAnimationFromStyles(element, options);\n  applyAnimationToStyles(element, options);\n}\n\nfunction applyAnimationFromStyles(element, options) {\n  if (options.from) {\n    element.css(options.from);\n    options.from = null;\n  }\n}\n\nfunction applyAnimationToStyles(element, options) {\n  if (options.to) {\n    element.css(options.to);\n    options.to = null;\n  }\n}\n\nfunction mergeAnimationDetails(element, oldAnimation, newAnimation) {\n  var target = oldAnimation.options || {};\n  var newOptions = newAnimation.options || {};\n\n  var toAdd = (target.addClass || '') + ' ' + (newOptions.addClass || '');\n  var toRemove = (target.removeClass || '') + ' ' + (newOptions.removeClass || '');\n  var classes = resolveElementClasses(element.attr('class'), toAdd, toRemove);\n\n  if (newOptions.preparationClasses) {\n    target.preparationClasses = concatWithSpace(newOptions.preparationClasses, target.preparationClasses);\n    delete newOptions.preparationClasses;\n  }\n\n  // noop is basically when there is no callback; otherwise something has been set\n  var realDomOperation = target.domOperation !== noop ? target.domOperation : null;\n\n  extend(target, newOptions);\n\n  // TODO(matsko or sreeramu): proper fix is to maintain all animation callback in array and call at last,but now only leave has the callback so no issue with this.\n  if (realDomOperation) {\n    target.domOperation = realDomOperation;\n  }\n\n  if (classes.addClass) {\n    target.addClass = classes.addClass;\n  } else {\n    target.addClass = null;\n  }\n\n  if (classes.removeClass) {\n    target.removeClass = classes.removeClass;\n  } else {\n    target.removeClass = null;\n  }\n\n  oldAnimation.addClass = target.addClass;\n  oldAnimation.removeClass = target.removeClass;\n\n  return target;\n}\n\nfunction resolveElementClasses(existing, toAdd, toRemove) {\n  var ADD_CLASS = 1;\n  var REMOVE_CLASS = -1;\n\n  var flags = {};\n  existing = splitClassesToLookup(existing);\n\n  toAdd = splitClassesToLookup(toAdd);\n  forEach(toAdd, function(value, key) {\n    flags[key] = ADD_CLASS;\n  });\n\n  toRemove = splitClassesToLookup(toRemove);\n  forEach(toRemove, function(value, key) {\n    flags[key] = flags[key] === ADD_CLASS ? null : REMOVE_CLASS;\n  });\n\n  var classes = {\n    addClass: '',\n    removeClass: ''\n  };\n\n  forEach(flags, function(val, klass) {\n    var prop, allow;\n    if (val === ADD_CLASS) {\n      prop = 'addClass';\n      allow = !existing[klass] || existing[klass + REMOVE_CLASS_SUFFIX];\n    } else if (val === REMOVE_CLASS) {\n      prop = 'removeClass';\n      allow = existing[klass] || existing[klass + ADD_CLASS_SUFFIX];\n    }\n    if (allow) {\n      if (classes[prop].length) {\n        classes[prop] += ' ';\n      }\n      classes[prop] += klass;\n    }\n  });\n\n  function splitClassesToLookup(classes) {\n    if (isString(classes)) {\n      classes = classes.split(' ');\n    }\n\n    var obj = {};\n    forEach(classes, function(klass) {\n      // sometimes the split leaves empty string values\n      // incase extra spaces were applied to the options\n      if (klass.length) {\n        obj[klass] = true;\n      }\n    });\n    return obj;\n  }\n\n  return classes;\n}\n\nfunction getDomNode(element) {\n  return (element instanceof jqLite) ? element[0] : element;\n}\n\nfunction applyGeneratedPreparationClasses(element, event, options) {\n  var classes = '';\n  if (event) {\n    classes = pendClasses(event, EVENT_CLASS_PREFIX, true);\n  }\n  if (options.addClass) {\n    classes = concatWithSpace(classes, pendClasses(options.addClass, ADD_CLASS_SUFFIX));\n  }\n  if (options.removeClass) {\n    classes = concatWithSpace(classes, pendClasses(options.removeClass, REMOVE_CLASS_SUFFIX));\n  }\n  if (classes.length) {\n    options.preparationClasses = classes;\n    element.addClass(classes);\n  }\n}\n\nfunction clearGeneratedClasses(element, options) {\n  if (options.preparationClasses) {\n    element.removeClass(options.preparationClasses);\n    options.preparationClasses = null;\n  }\n  if (options.activeClasses) {\n    element.removeClass(options.activeClasses);\n    options.activeClasses = null;\n  }\n}\n\nfunction blockTransitions(node, duration) {\n  // we use a negative delay value since it performs blocking\n  // yet it doesn't kill any existing transitions running on the\n  // same element which makes this safe for class-based animations\n  var value = duration ? '-' + duration + 's' : '';\n  applyInlineStyle(node, [TRANSITION_DELAY_PROP, value]);\n  return [TRANSITION_DELAY_PROP, value];\n}\n\nfunction blockKeyframeAnimations(node, applyBlock) {\n  var value = applyBlock ? 'paused' : '';\n  var key = ANIMATION_PROP + ANIMATION_PLAYSTATE_KEY;\n  applyInlineStyle(node, [key, value]);\n  return [key, value];\n}\n\nfunction applyInlineStyle(node, styleTuple) {\n  var prop = styleTuple[0];\n  var value = styleTuple[1];\n  node.style[prop] = value;\n}\n\nfunction concatWithSpace(a,b) {\n  if (!a) return b;\n  if (!b) return a;\n  return a + ' ' + b;\n}\n\nvar $$rAFSchedulerFactory = ['$$rAF', function($$rAF) {\n  var queue, cancelFn;\n\n  function scheduler(tasks) {\n    // we make a copy since RAFScheduler mutates the state\n    // of the passed in array variable and this would be difficult\n    // to track down on the outside code\n    queue = queue.concat(tasks);\n    nextTick();\n  }\n\n  queue = scheduler.queue = [];\n\n  /* waitUntilQuiet does two things:\n   * 1. It will run the FINAL `fn` value only when an uncanceled RAF has passed through\n   * 2. It will delay the next wave of tasks from running until the quiet `fn` has run.\n   *\n   * The motivation here is that animation code can request more time from the scheduler\n   * before the next wave runs. This allows for certain DOM properties such as classes to\n   * be resolved in time for the next animation to run.\n   */\n  scheduler.waitUntilQuiet = function(fn) {\n    if (cancelFn) cancelFn();\n\n    cancelFn = $$rAF(function() {\n      cancelFn = null;\n      fn();\n      nextTick();\n    });\n  };\n\n  return scheduler;\n\n  function nextTick() {\n    if (!queue.length) return;\n\n    var items = queue.shift();\n    for (var i = 0; i < items.length; i++) {\n      items[i]();\n    }\n\n    if (!cancelFn) {\n      $$rAF(function() {\n        if (!cancelFn) nextTick();\n      });\n    }\n  }\n}];\n\n/**\n * @ngdoc directive\n * @name ngAnimateChildren\n * @restrict AE\n * @element ANY\n *\n * @description\n *\n * ngAnimateChildren allows you to specify that children of this element should animate even if any\n * of the children's parents are currently animating. By default, when an element has an active `enter`, `leave`, or `move`\n * (structural) animation, child elements that also have an active structural animation are not animated.\n *\n * Note that even if `ngAnimateChildren` is set, no child animations will run when the parent element is removed from the DOM (`leave` animation).\n *\n *\n * @param {string} ngAnimateChildren If the value is empty, `true` or `on`,\n *     then child animations are allowed. If the value is `false`, child animations are not allowed.\n *\n * @example\n * <example module=\"ngAnimateChildren\" name=\"ngAnimateChildren\" deps=\"angular-animate.js\" animations=\"true\">\n     <file name=\"index.ced81ed4.html\">\n       <div ng-controller=\"MainController as main\">\n         <label>Show container? <input type=\"checkbox\" ng-model=\"main.enterElement\" /></label>\n         <label>Animate children? <input type=\"checkbox\" ng-model=\"main.animateChildren\" /></label>\n         <hr>\n         <div ng-animate-children=\"{{main.animateChildren}}\">\n           <div ng-if=\"main.enterElement\" class=\"container\">\n             List of items:\n             <div ng-repeat=\"item in [0, 1, 2, 3]\" class=\"item\">Item {{item}}</div>\n           </div>\n         </div>\n       </div>\n     </file>\n     <file name=\"animations.css\">\n\n      .container.ng-enter,\n      .container.ng-leave {\n        transition: all ease 1.5s;\n      }\n\n      .container.ng-enter,\n      .container.ng-leave-active {\n        opacity: 0;\n      }\n\n      .container.ng-leave,\n      .container.ng-enter-active {\n        opacity: 1;\n      }\n\n      .item {\n        background: firebrick;\n        color: #FFF;\n        margin-bottom: 10px;\n      }\n\n      .item.ng-enter,\n      .item.ng-leave {\n        transition: transform 1.5s ease;\n      }\n\n      .item.ng-enter {\n        transform: translateX(50px);\n      }\n\n      .item.ng-enter-active {\n        transform: translateX(0);\n      }\n    </file>\n    <file name=\"script.js\">\n      angular.module('ngAnimateChildren', ['ngAnimate'])\n        .controller('MainController', function MainController() {\n          this.animateChildren = false;\n          this.enterElement = false;\n        });\n    </file>\n  </example>\n */\nvar $$AnimateChildrenDirective = ['$interpolate', function($interpolate) {\n  return {\n    link: function(scope, element, attrs) {\n      var val = attrs.ngAnimateChildren;\n      if (isString(val) && val.length === 0) { //empty attribute\n        element.data(NG_ANIMATE_CHILDREN_DATA, true);\n      } else {\n        // Interpolate and set the value, so that it is available to\n        // animations that run right after compilation\n        setData($interpolate(val)(scope));\n        attrs.$observe('ngAnimateChildren', setData);\n      }\n\n      function setData(value) {\n        value = value === 'on' || value === 'true';\n        element.data(NG_ANIMATE_CHILDREN_DATA, value);\n      }\n    }\n  };\n}];\n\n/* exported $AnimateCssProvider */\n\nvar ANIMATE_TIMER_KEY = '$$animateCss';\n\n/**\n * @ngdoc service\n * @name $animateCss\n * @kind object\n *\n * @description\n * The `$animateCss` service is a useful utility to trigger customized CSS-based transitions/keyframes\n * from a JavaScript-based animation or directly from a directive. The purpose of `$animateCss` is NOT\n * to side-step how `$animate` and ngAnimate work, but the goal is to allow pre-existing animations or\n * directives to create more complex animations that can be purely driven using CSS code.\n *\n * Note that only browsers that support CSS transitions and/or keyframe animations are capable of\n * rendering animations triggered via `$animateCss` (bad news for IE9 and lower).\n *\n * ## Usage\n * Once again, `$animateCss` is designed to be used inside of a registered JavaScript animation that\n * is powered by ngAnimate. It is possible to use `$animateCss` directly inside of a directive, however,\n * any automatic control over cancelling animations and/or preventing animations from being run on\n * child elements will not be handled by Angular. For this to work as expected, please use `$animate` to\n * trigger the animation and then setup a JavaScript animation that injects `$animateCss` to trigger\n * the CSS animation.\n *\n * The example below shows how we can create a folding animation on an element using `ng-if`:\n *\n * ```html\n * <!-- notice the `fold-animation` CSS class -->\n * <div ng-if=\"onOff\" class=\"fold-animation\">\n *   This element will go BOOM\n * </div>\n * <button ng-click=\"onOff=true\">Fold In</button>\n * ```\n *\n * Now we create the **JavaScript animation** that will trigger the CSS transition:\n *\n * ```js\n * ngModule.animation('.fold-animation', ['$animateCss', function($animateCss) {\n *   return {\n *     enter: function(element, doneFn) {\n *       var height = element[0].offsetHeight;\n *       return $animateCss(element, {\n *         from: { height:'0px' },\n *         to: { height:height + 'px' },\n *         duration: 1 // one second\n *       });\n *     }\n *   }\n * }]);\n * ```\n *\n * ## More Advanced Uses\n *\n * `$animateCss` is the underlying code that ngAnimate uses to power **CSS-based animations** behind the scenes. Therefore CSS hooks\n * like `.ng-EVENT`, `.ng-EVENT-active`, `.ng-EVENT-stagger` are all features that can be triggered using `$animateCss` via JavaScript code.\n *\n * This also means that just about any combination of adding classes, removing classes, setting styles, dynamically setting a keyframe animation,\n * applying a hardcoded duration or delay value, changing the animation easing or applying a stagger animation are all options that work with\n * `$animateCss`. The service itself is smart enough to figure out the combination of options and examine the element styling properties in order\n * to provide a working animation that will run in CSS.\n *\n * The example below showcases a more advanced version of the `.fold-animation` from the example above:\n *\n * ```js\n * ngModule.animation('.fold-animation', ['$animateCss', function($animateCss) {\n *   return {\n *     enter: function(element, doneFn) {\n *       var height = element[0].offsetHeight;\n *       return $animateCss(element, {\n *         addClass: 'red large-text pulse-twice',\n *         easing: 'ease-out',\n *         from: { height:'0px' },\n *         to: { height:height + 'px' },\n *         duration: 1 // one second\n *       });\n *     }\n *   }\n * }]);\n * ```\n *\n * Since we're adding/removing CSS classes then the CSS transition will also pick those up:\n *\n * ```css\n * /&#42; since a hardcoded duration value of 1 was provided in the JavaScript animation code,\n * the CSS classes below will be transitioned despite them being defined as regular CSS classes &#42;/\n * .red { background:red; }\n * .large-text { font-size:20px; }\n *\n * /&#42; we can also use a keyframe animation and $animateCss will make it work alongside the transition &#42;/\n * .pulse-twice {\n *   animation: 0.5s pulse linear 2;\n *   -webkit-animation: 0.5s pulse linear 2;\n * }\n *\n * @keyframes pulse {\n *   from { transform: scale(0.5); }\n *   to { transform: scale(1.5); }\n * }\n *\n * @-webkit-keyframes pulse {\n *   from { -webkit-transform: scale(0.5); }\n *   to { -webkit-transform: scale(1.5); }\n * }\n * ```\n *\n * Given this complex combination of CSS classes, styles and options, `$animateCss` will figure everything out and make the animation happen.\n *\n * ## How the Options are handled\n *\n * `$animateCss` is very versatile and intelligent when it comes to figuring out what configurations to apply to the element to ensure the animation\n * works with the options provided. Say for example we were adding a class that contained a keyframe value and we wanted to also animate some inline\n * styles using the `from` and `to` properties.\n *\n * ```js\n * var animator = $animateCss(element, {\n *   from: { background:'red' },\n *   to: { background:'blue' }\n * });\n * animator.start();\n * ```\n *\n * ```css\n * .rotating-animation {\n *   animation:0.5s rotate linear;\n *   -webkit-animation:0.5s rotate linear;\n * }\n *\n * @keyframes rotate {\n *   from { transform: rotate(0deg); }\n *   to { transform: rotate(360deg); }\n * }\n *\n * @-webkit-keyframes rotate {\n *   from { -webkit-transform: rotate(0deg); }\n *   to { -webkit-transform: rotate(360deg); }\n * }\n * ```\n *\n * The missing pieces here are that we do not have a transition set (within the CSS code nor within the `$animateCss` options) and the duration of the animation is\n * going to be detected from what the keyframe styles on the CSS class are. In this event, `$animateCss` will automatically create an inline transition\n * style matching the duration detected from the keyframe style (which is present in the CSS class that is being added) and then prepare both the transition\n * and keyframe animations to run in parallel on the element. Then when the animation is underway the provided `from` and `to` CSS styles will be applied\n * and spread across the transition and keyframe animation.\n *\n * ## What is returned\n *\n * `$animateCss` works in two stages: a preparation phase and an animation phase. Therefore when `$animateCss` is first called it will NOT actually\n * start the animation. All that is going on here is that the element is being prepared for the animation (which means that the generated CSS classes are\n * added and removed on the element). Once `$animateCss` is called it will return an object with the following properties:\n *\n * ```js\n * var animator = $animateCss(element, { ... });\n * ```\n *\n * Now what do the contents of our `animator` variable look like:\n *\n * ```js\n * {\n *   // starts the animation\n *   start: Function,\n *\n *   // ends (aborts) the animation\n *   end: Function\n * }\n * ```\n *\n * To actually start the animation we need to run `animation.start()` which will then return a promise that we can hook into to detect when the animation ends.\n * If we choose not to run the animation then we MUST run `animation.end()` to perform a cleanup on the element (since some CSS classes and styles may have been\n * applied to the element during the preparation phase). Note that all other properties such as duration, delay, transitions and keyframes are just properties\n * and that changing them will not reconfigure the parameters of the animation.\n *\n * ### runner.done() vs runner.then()\n * It is documented that `animation.start()` will return a promise object and this is true, however, there is also an additional method available on the\n * runner called `.done(callbackFn)`. The done method works the same as `.finally(callbackFn)`, however, it does **not trigger a digest to occur**.\n * Therefore, for performance reasons, it's always best to use `runner.done(callback)` instead of `runner.then()`, `runner.catch()` or `runner.finally()`\n * unless you really need a digest to kick off afterwards.\n *\n * Keep in mind that, to make this easier, ngAnimate has tweaked the JS animations API to recognize when a runner instance is returned from $animateCss\n * (so there is no need to call `runner.done(doneFn)` inside of your JavaScript animation code).\n * Check the {@link ngAnimate.$animateCss#usage animation code above} to see how this works.\n *\n * @param {DOMElement} element the element that will be animated\n * @param {object} options the animation-related options that will be applied during the animation\n *\n * * `event` - The DOM event (e.g. enter, leave, move). When used, a generated CSS class of `ng-EVENT` and `ng-EVENT-active` will be applied\n * to the element during the animation. Multiple events can be provided when spaces are used as a separator. (Note that this will not perform any DOM operation.)\n * * `structural` - Indicates that the `ng-` prefix will be added to the event class. Setting to `false` or omitting will turn `ng-EVENT` and\n * `ng-EVENT-active` in `EVENT` and `EVENT-active`. Unused if `event` is omitted.\n * * `easing` - The CSS easing value that will be applied to the transition or keyframe animation (or both).\n * * `transitionStyle` - The raw CSS transition style that will be used (e.g. `1s linear all`).\n * * `keyframeStyle` - The raw CSS keyframe animation style that will be used (e.g. `1s my_animation linear`).\n * * `from` - The starting CSS styles (a key/value object) that will be applied at the start of the animation.\n * * `to` - The ending CSS styles (a key/value object) that will be applied across the animation via a CSS transition.\n * * `addClass` - A space separated list of CSS classes that will be added to the element and spread across the animation.\n * * `removeClass` - A space separated list of CSS classes that will be removed from the element and spread across the animation.\n * * `duration` - A number value representing the total duration of the transition and/or keyframe (note that a value of 1 is 1000ms). If a value of `0`\n * is provided then the animation will be skipped entirely.\n * * `delay` - A number value representing the total delay of the transition and/or keyframe (note that a value of 1 is 1000ms). If a value of `true` is\n * used then whatever delay value is detected from the CSS classes will be mirrored on the elements styles (e.g. by setting delay true then the style value\n * of the element will be `transition-delay: DETECTED_VALUE`). Using `true` is useful when you want the CSS classes and inline styles to all share the same\n * CSS delay value.\n * * `stagger` - A numeric time value representing the delay between successively animated elements\n * ({@link ngAnimate#css-staggering-animations Click here to learn how CSS-based staggering works in ngAnimate.})\n * * `staggerIndex` - The numeric index representing the stagger item (e.g. a value of 5 is equal to the sixth item in the stagger; therefore when a\n *   `stagger` option value of `0.1` is used then there will be a stagger delay of `600ms`)\n * * `applyClassesEarly` - Whether or not the classes being added or removed will be used when detecting the animation. This is set by `$animate` when enter/leave/move animations are fired to ensure that the CSS classes are resolved in time. (Note that this will prevent any transitions from occurring on the classes being added and removed.)\n * * `cleanupStyles` - Whether or not the provided `from` and `to` styles will be removed once\n *    the animation is closed. This is useful for when the styles are used purely for the sake of\n *    the animation and do not have a lasting visual effect on the element (e.g. a collapse and open animation).\n *    By default this value is set to `false`.\n *\n * @return {object} an object with start and end methods and details about the animation.\n *\n * * `start` - The method to start the animation. This will return a `Promise` when called.\n * * `end` - This method will cancel the animation and remove all applied CSS classes and styles.\n */\nvar ONE_SECOND = 1000;\n\nvar ELAPSED_TIME_MAX_DECIMAL_PLACES = 3;\nvar CLOSING_TIME_BUFFER = 1.5;\n\nvar DETECT_CSS_PROPERTIES = {\n  transitionDuration:      TRANSITION_DURATION_PROP,\n  transitionDelay:         TRANSITION_DELAY_PROP,\n  transitionProperty:      TRANSITION_PROP + PROPERTY_KEY,\n  animationDuration:       ANIMATION_DURATION_PROP,\n  animationDelay:          ANIMATION_DELAY_PROP,\n  animationIterationCount: ANIMATION_PROP + ANIMATION_ITERATION_COUNT_KEY\n};\n\nvar DETECT_STAGGER_CSS_PROPERTIES = {\n  transitionDuration:      TRANSITION_DURATION_PROP,\n  transitionDelay:         TRANSITION_DELAY_PROP,\n  animationDuration:       ANIMATION_DURATION_PROP,\n  animationDelay:          ANIMATION_DELAY_PROP\n};\n\nfunction getCssKeyframeDurationStyle(duration) {\n  return [ANIMATION_DURATION_PROP, duration + 's'];\n}\n\nfunction getCssDelayStyle(delay, isKeyframeAnimation) {\n  var prop = isKeyframeAnimation ? ANIMATION_DELAY_PROP : TRANSITION_DELAY_PROP;\n  return [prop, delay + 's'];\n}\n\nfunction computeCssStyles($window, element, properties) {\n  var styles = Object.create(null);\n  var detectedStyles = $window.getComputedStyle(element) || {};\n  forEach(properties, function(formalStyleName, actualStyleName) {\n    var val = detectedStyles[formalStyleName];\n    if (val) {\n      var c = val.charAt(0);\n\n      // only numerical-based values have a negative sign or digit as the first value\n      if (c === '-' || c === '+' || c >= 0) {\n        val = parseMaxTime(val);\n      }\n\n      // by setting this to null in the event that the delay is not set or is set directly as 0\n      // then we can still allow for negative values to be used later on and not mistake this\n      // value for being greater than any other negative value.\n      if (val === 0) {\n        val = null;\n      }\n      styles[actualStyleName] = val;\n    }\n  });\n\n  return styles;\n}\n\nfunction parseMaxTime(str) {\n  var maxValue = 0;\n  var values = str.split(/\\s*,\\s*/);\n  forEach(values, function(value) {\n    // it's always safe to consider only second values and omit `ms` values since\n    // getComputedStyle will always handle the conversion for us\n    if (value.charAt(value.length - 1) === 's') {\n      value = value.substring(0, value.length - 1);\n    }\n    value = parseFloat(value) || 0;\n    maxValue = maxValue ? Math.max(value, maxValue) : value;\n  });\n  return maxValue;\n}\n\nfunction truthyTimingValue(val) {\n  return val === 0 || val != null;\n}\n\nfunction getCssTransitionDurationStyle(duration, applyOnlyDuration) {\n  var style = TRANSITION_PROP;\n  var value = duration + 's';\n  if (applyOnlyDuration) {\n    style += DURATION_KEY;\n  } else {\n    value += ' linear all';\n  }\n  return [style, value];\n}\n\nfunction createLocalCacheLookup() {\n  var cache = Object.create(null);\n  return {\n    flush: function() {\n      cache = Object.create(null);\n    },\n\n    count: function(key) {\n      var entry = cache[key];\n      return entry ? entry.total : 0;\n    },\n\n    get: function(key) {\n      var entry = cache[key];\n      return entry && entry.value;\n    },\n\n    put: function(key, value) {\n      if (!cache[key]) {\n        cache[key] = { total: 1, value: value };\n      } else {\n        cache[key].total++;\n      }\n    }\n  };\n}\n\n// we do not reassign an already present style value since\n// if we detect the style property value again we may be\n// detecting styles that were added via the `from` styles.\n// We make use of `isDefined` here since an empty string\n// or null value (which is what getPropertyValue will return\n// for a non-existing style) will still be marked as a valid\n// value for the style (a falsy value implies that the style\n// is to be removed at the end of the animation). If we had a simple\n// \"OR\" statement then it would not be enough to catch that.\nfunction registerRestorableStyles(backup, node, properties) {\n  forEach(properties, function(prop) {\n    backup[prop] = isDefined(backup[prop])\n        ? backup[prop]\n        : node.style.getPropertyValue(prop);\n  });\n}\n\nvar $AnimateCssProvider = ['$animateProvider', /** @this */ function($animateProvider) {\n  var gcsLookup = createLocalCacheLookup();\n  var gcsStaggerLookup = createLocalCacheLookup();\n\n  this.$get = ['$window', '$$jqLite', '$$AnimateRunner', '$timeout',\n               '$$forceReflow', '$sniffer', '$$rAFScheduler', '$$animateQueue',\n       function($window,   $$jqLite,   $$AnimateRunner,   $timeout,\n                $$forceReflow,   $sniffer,   $$rAFScheduler, $$animateQueue) {\n\n    var applyAnimationClasses = applyAnimationClassesFactory($$jqLite);\n\n    var parentCounter = 0;\n    function gcsHashFn(node, extraClasses) {\n      var KEY = '$$ngAnimateParentKey';\n      var parentNode = node.parentNode;\n      var parentID = parentNode[KEY] || (parentNode[KEY] = ++parentCounter);\n      return parentID + '-' + node.getAttribute('class') + '-' + extraClasses;\n    }\n\n    function computeCachedCssStyles(node, className, cacheKey, properties) {\n      var timings = gcsLookup.get(cacheKey);\n\n      if (!timings) {\n        timings = computeCssStyles($window, node, properties);\n        if (timings.animationIterationCount === 'infinite') {\n          timings.animationIterationCount = 1;\n        }\n      }\n\n      // we keep putting this in multiple times even though the value and the cacheKey are the same\n      // because we're keeping an internal tally of how many duplicate animations are detected.\n      gcsLookup.put(cacheKey, timings);\n      return timings;\n    }\n\n    function computeCachedCssStaggerStyles(node, className, cacheKey, properties) {\n      var stagger;\n\n      // if we have one or more existing matches of matching elements\n      // containing the same parent + CSS styles (which is how cacheKey works)\n      // then staggering is possible\n      if (gcsLookup.count(cacheKey) > 0) {\n        stagger = gcsStaggerLookup.get(cacheKey);\n\n        if (!stagger) {\n          var staggerClassName = pendClasses(className, '-stagger');\n\n          $$jqLite.addClass(node, staggerClassName);\n\n          stagger = computeCssStyles($window, node, properties);\n\n          // force the conversion of a null value to zero incase not set\n          stagger.animationDuration = Math.max(stagger.animationDuration, 0);\n          stagger.transitionDuration = Math.max(stagger.transitionDuration, 0);\n\n          $$jqLite.removeClass(node, staggerClassName);\n\n          gcsStaggerLookup.put(cacheKey, stagger);\n        }\n      }\n\n      return stagger || {};\n    }\n\n    var rafWaitQueue = [];\n    function waitUntilQuiet(callback) {\n      rafWaitQueue.push(callback);\n      $$rAFScheduler.waitUntilQuiet(function() {\n        gcsLookup.flush();\n        gcsStaggerLookup.flush();\n\n        // DO NOT REMOVE THIS LINE OR REFACTOR OUT THE `pageWidth` variable.\n        // PLEASE EXAMINE THE `$$forceReflow` service to understand why.\n        var pageWidth = $$forceReflow();\n\n        // we use a for loop to ensure that if the queue is changed\n        // during this looping then it will consider new requests\n        for (var i = 0; i < rafWaitQueue.length; i++) {\n          rafWaitQueue[i](pageWidth);\n        }\n        rafWaitQueue.length = 0;\n      });\n    }\n\n    function computeTimings(node, className, cacheKey) {\n      var timings = computeCachedCssStyles(node, className, cacheKey, DETECT_CSS_PROPERTIES);\n      var aD = timings.animationDelay;\n      var tD = timings.transitionDelay;\n      timings.maxDelay = aD && tD\n          ? Math.max(aD, tD)\n          : (aD || tD);\n      timings.maxDuration = Math.max(\n          timings.animationDuration * timings.animationIterationCount,\n          timings.transitionDuration);\n\n      return timings;\n    }\n\n    return function init(element, initialOptions) {\n      // all of the animation functions should create\n      // a copy of the options data, however, if a\n      // parent service has already created a copy then\n      // we should stick to using that\n      var options = initialOptions || {};\n      if (!options.$$prepared) {\n        options = prepareAnimationOptions(copy(options));\n      }\n\n      var restoreStyles = {};\n      var node = getDomNode(element);\n      if (!node\n          || !node.parentNode\n          || !$$animateQueue.enabled()) {\n        return closeAndReturnNoopAnimator();\n      }\n\n      var temporaryStyles = [];\n      var classes = element.attr('class');\n      var styles = packageStyles(options);\n      var animationClosed;\n      var animationPaused;\n      var animationCompleted;\n      var runner;\n      var runnerHost;\n      var maxDelay;\n      var maxDelayTime;\n      var maxDuration;\n      var maxDurationTime;\n      var startTime;\n      var events = [];\n\n      if (options.duration === 0 || (!$sniffer.animations && !$sniffer.transitions)) {\n        return closeAndReturnNoopAnimator();\n      }\n\n      var method = options.event && isArray(options.event)\n            ? options.event.join(' ')\n            : options.event;\n\n      var isStructural = method && options.structural;\n      var structuralClassName = '';\n      var addRemoveClassName = '';\n\n      if (isStructural) {\n        structuralClassName = pendClasses(method, EVENT_CLASS_PREFIX, true);\n      } else if (method) {\n        structuralClassName = method;\n      }\n\n      if (options.addClass) {\n        addRemoveClassName += pendClasses(options.addClass, ADD_CLASS_SUFFIX);\n      }\n\n      if (options.removeClass) {\n        if (addRemoveClassName.length) {\n          addRemoveClassName += ' ';\n        }\n        addRemoveClassName += pendClasses(options.removeClass, REMOVE_CLASS_SUFFIX);\n      }\n\n      // there may be a situation where a structural animation is combined together\n      // with CSS classes that need to resolve before the animation is computed.\n      // However this means that there is no explicit CSS code to block the animation\n      // from happening (by setting 0s none in the class name). If this is the case\n      // we need to apply the classes before the first rAF so we know to continue if\n      // there actually is a detected transition or keyframe animation\n      if (options.applyClassesEarly && addRemoveClassName.length) {\n        applyAnimationClasses(element, options);\n      }\n\n      var preparationClasses = [structuralClassName, addRemoveClassName].join(' ').trim();\n      var fullClassName = classes + ' ' + preparationClasses;\n      var activeClasses = pendClasses(preparationClasses, ACTIVE_CLASS_SUFFIX);\n      var hasToStyles = styles.to && Object.keys(styles.to).length > 0;\n      var containsKeyframeAnimation = (options.keyframeStyle || '').length > 0;\n\n      // there is no way we can trigger an animation if no styles and\n      // no classes are being applied which would then trigger a transition,\n      // unless there a is raw keyframe value that is applied to the element.\n      if (!containsKeyframeAnimation\n           && !hasToStyles\n           && !preparationClasses) {\n        return closeAndReturnNoopAnimator();\n      }\n\n      var cacheKey, stagger;\n      if (options.stagger > 0) {\n        var staggerVal = parseFloat(options.stagger);\n        stagger = {\n          transitionDelay: staggerVal,\n          animationDelay: staggerVal,\n          transitionDuration: 0,\n          animationDuration: 0\n        };\n      } else {\n        cacheKey = gcsHashFn(node, fullClassName);\n        stagger = computeCachedCssStaggerStyles(node, preparationClasses, cacheKey, DETECT_STAGGER_CSS_PROPERTIES);\n      }\n\n      if (!options.$$skipPreparationClasses) {\n        $$jqLite.addClass(element, preparationClasses);\n      }\n\n      var applyOnlyDuration;\n\n      if (options.transitionStyle) {\n        var transitionStyle = [TRANSITION_PROP, options.transitionStyle];\n        applyInlineStyle(node, transitionStyle);\n        temporaryStyles.push(transitionStyle);\n      }\n\n      if (options.duration >= 0) {\n        applyOnlyDuration = node.style[TRANSITION_PROP].length > 0;\n        var durationStyle = getCssTransitionDurationStyle(options.duration, applyOnlyDuration);\n\n        // we set the duration so that it will be picked up by getComputedStyle later\n        applyInlineStyle(node, durationStyle);\n        temporaryStyles.push(durationStyle);\n      }\n\n      if (options.keyframeStyle) {\n        var keyframeStyle = [ANIMATION_PROP, options.keyframeStyle];\n        applyInlineStyle(node, keyframeStyle);\n        temporaryStyles.push(keyframeStyle);\n      }\n\n      var itemIndex = stagger\n          ? options.staggerIndex >= 0\n              ? options.staggerIndex\n              : gcsLookup.count(cacheKey)\n          : 0;\n\n      var isFirst = itemIndex === 0;\n\n      // this is a pre-emptive way of forcing the setup classes to be added and applied INSTANTLY\n      // without causing any combination of transitions to kick in. By adding a negative delay value\n      // it forces the setup class' transition to end immediately. We later then remove the negative\n      // transition delay to allow for the transition to naturally do it's thing. The beauty here is\n      // that if there is no transition defined then nothing will happen and this will also allow\n      // other transitions to be stacked on top of each other without any chopping them out.\n      if (isFirst && !options.skipBlocking) {\n        blockTransitions(node, SAFE_FAST_FORWARD_DURATION_VALUE);\n      }\n\n      var timings = computeTimings(node, fullClassName, cacheKey);\n      var relativeDelay = timings.maxDelay;\n      maxDelay = Math.max(relativeDelay, 0);\n      maxDuration = timings.maxDuration;\n\n      var flags = {};\n      flags.hasTransitions          = timings.transitionDuration > 0;\n      flags.hasAnimations           = timings.animationDuration > 0;\n      flags.hasTransitionAll        = flags.hasTransitions && timings.transitionProperty === 'all';\n      flags.applyTransitionDuration = hasToStyles && (\n                                        (flags.hasTransitions && !flags.hasTransitionAll)\n                                         || (flags.hasAnimations && !flags.hasTransitions));\n      flags.applyAnimationDuration  = options.duration && flags.hasAnimations;\n      flags.applyTransitionDelay    = truthyTimingValue(options.delay) && (flags.applyTransitionDuration || flags.hasTransitions);\n      flags.applyAnimationDelay     = truthyTimingValue(options.delay) && flags.hasAnimations;\n      flags.recalculateTimingStyles = addRemoveClassName.length > 0;\n\n      if (flags.applyTransitionDuration || flags.applyAnimationDuration) {\n        maxDuration = options.duration ? parseFloat(options.duration) : maxDuration;\n\n        if (flags.applyTransitionDuration) {\n          flags.hasTransitions = true;\n          timings.transitionDuration = maxDuration;\n          applyOnlyDuration = node.style[TRANSITION_PROP + PROPERTY_KEY].length > 0;\n          temporaryStyles.push(getCssTransitionDurationStyle(maxDuration, applyOnlyDuration));\n        }\n\n        if (flags.applyAnimationDuration) {\n          flags.hasAnimations = true;\n          timings.animationDuration = maxDuration;\n          temporaryStyles.push(getCssKeyframeDurationStyle(maxDuration));\n        }\n      }\n\n      if (maxDuration === 0 && !flags.recalculateTimingStyles) {\n        return closeAndReturnNoopAnimator();\n      }\n\n      if (options.delay != null) {\n        var delayStyle;\n        if (typeof options.delay !== 'boolean') {\n          delayStyle = parseFloat(options.delay);\n          // number in options.delay means we have to recalculate the delay for the closing timeout\n          maxDelay = Math.max(delayStyle, 0);\n        }\n\n        if (flags.applyTransitionDelay) {\n          temporaryStyles.push(getCssDelayStyle(delayStyle));\n        }\n\n        if (flags.applyAnimationDelay) {\n          temporaryStyles.push(getCssDelayStyle(delayStyle, true));\n        }\n      }\n\n      // we need to recalculate the delay value since we used a pre-emptive negative\n      // delay value and the delay value is required for the final event checking. This\n      // property will ensure that this will happen after the RAF phase has passed.\n      if (options.duration == null && timings.transitionDuration > 0) {\n        flags.recalculateTimingStyles = flags.recalculateTimingStyles || isFirst;\n      }\n\n      maxDelayTime = maxDelay * ONE_SECOND;\n      maxDurationTime = maxDuration * ONE_SECOND;\n      if (!options.skipBlocking) {\n        flags.blockTransition = timings.transitionDuration > 0;\n        flags.blockKeyframeAnimation = timings.animationDuration > 0 &&\n                                       stagger.animationDelay > 0 &&\n                                       stagger.animationDuration === 0;\n      }\n\n      if (options.from) {\n        if (options.cleanupStyles) {\n          registerRestorableStyles(restoreStyles, node, Object.keys(options.from));\n        }\n        applyAnimationFromStyles(element, options);\n      }\n\n      if (flags.blockTransition || flags.blockKeyframeAnimation) {\n        applyBlocking(maxDuration);\n      } else if (!options.skipBlocking) {\n        blockTransitions(node, false);\n      }\n\n      // TODO(matsko): for 1.5 change this code to have an animator object for better debugging\n      return {\n        $$willAnimate: true,\n        end: endFn,\n        start: function() {\n          if (animationClosed) return;\n\n          runnerHost = {\n            end: endFn,\n            cancel: cancelFn,\n            resume: null, //this will be set during the start() phase\n            pause: null\n          };\n\n          runner = new $$AnimateRunner(runnerHost);\n\n          waitUntilQuiet(start);\n\n          // we don't have access to pause/resume the animation\n          // since it hasn't run yet. AnimateRunner will therefore\n          // set noop functions for resume and pause and they will\n          // later be overridden once the animation is triggered\n          return runner;\n        }\n      };\n\n      function endFn() {\n        close();\n      }\n\n      function cancelFn() {\n        close(true);\n      }\n\n      function close(rejected) {\n        // if the promise has been called already then we shouldn't close\n        // the animation again\n        if (animationClosed || (animationCompleted && animationPaused)) return;\n        animationClosed = true;\n        animationPaused = false;\n\n        if (!options.$$skipPreparationClasses) {\n          $$jqLite.removeClass(element, preparationClasses);\n        }\n        $$jqLite.removeClass(element, activeClasses);\n\n        blockKeyframeAnimations(node, false);\n        blockTransitions(node, false);\n\n        forEach(temporaryStyles, function(entry) {\n          // There is only one way to remove inline style properties entirely from elements.\n          // By using `removeProperty` this works, but we need to convert camel-cased CSS\n          // styles down to hyphenated values.\n          node.style[entry[0]] = '';\n        });\n\n        applyAnimationClasses(element, options);\n        applyAnimationStyles(element, options);\n\n        if (Object.keys(restoreStyles).length) {\n          forEach(restoreStyles, function(value, prop) {\n            if (value) {\n              node.style.setProperty(prop, value);\n            } else {\n              node.style.removeProperty(prop);\n            }\n          });\n        }\n\n        // the reason why we have this option is to allow a synchronous closing callback\n        // that is fired as SOON as the animation ends (when the CSS is removed) or if\n        // the animation never takes off at all. A good example is a leave animation since\n        // the element must be removed just after the animation is over or else the element\n        // will appear on screen for one animation frame causing an overbearing flicker.\n        if (options.onDone) {\n          options.onDone();\n        }\n\n        if (events && events.length) {\n          // Remove the transitionend / animationend listener(s)\n          element.off(events.join(' '), onAnimationProgress);\n        }\n\n        //Cancel the fallback closing timeout and remove the timer data\n        var animationTimerData = element.data(ANIMATE_TIMER_KEY);\n        if (animationTimerData) {\n          $timeout.cancel(animationTimerData[0].timer);\n          element.removeData(ANIMATE_TIMER_KEY);\n        }\n\n        // if the preparation function fails then the promise is not setup\n        if (runner) {\n          runner.complete(!rejected);\n        }\n      }\n\n      function applyBlocking(duration) {\n        if (flags.blockTransition) {\n          blockTransitions(node, duration);\n        }\n\n        if (flags.blockKeyframeAnimation) {\n          blockKeyframeAnimations(node, !!duration);\n        }\n      }\n\n      function closeAndReturnNoopAnimator() {\n        runner = new $$AnimateRunner({\n          end: endFn,\n          cancel: cancelFn\n        });\n\n        // should flush the cache animation\n        waitUntilQuiet(noop);\n        close();\n\n        return {\n          $$willAnimate: false,\n          start: function() {\n            return runner;\n          },\n          end: endFn\n        };\n      }\n\n      function onAnimationProgress(event) {\n        event.stopPropagation();\n        var ev = event.originalEvent || event;\n\n        // we now always use `Date.now()` due to the recent changes with\n        // event.timeStamp in Firefox, Webkit and Chrome (see #13494 for more info)\n        var timeStamp = ev.$manualTimeStamp || Date.now();\n\n        /* Firefox (or possibly just Gecko) likes to not round values up\n         * when a ms measurement is used for the animation */\n        var elapsedTime = parseFloat(ev.elapsedTime.toFixed(ELAPSED_TIME_MAX_DECIMAL_PLACES));\n\n        /* $manualTimeStamp is a mocked timeStamp value which is set\n         * within browserTrigger(). This is only here so that tests can\n         * mock animations properly. Real events fallback to event.timeStamp,\n         * or, if they don't, then a timeStamp is automatically created for them.\n         * We're checking to see if the timeStamp surpasses the expected delay,\n         * but we're using elapsedTime instead of the timeStamp on the 2nd\n         * pre-condition since animationPauseds sometimes close off early */\n        if (Math.max(timeStamp - startTime, 0) >= maxDelayTime && elapsedTime >= maxDuration) {\n          // we set this flag to ensure that if the transition is paused then, when resumed,\n          // the animation will automatically close itself since transitions cannot be paused.\n          animationCompleted = true;\n          close();\n        }\n      }\n\n      function start() {\n        if (animationClosed) return;\n        if (!node.parentNode) {\n          close();\n          return;\n        }\n\n        // even though we only pause keyframe animations here the pause flag\n        // will still happen when transitions are used. Only the transition will\n        // not be paused since that is not possible. If the animation ends when\n        // paused then it will not complete until unpaused or cancelled.\n        var playPause = function(playAnimation) {\n          if (!animationCompleted) {\n            animationPaused = !playAnimation;\n            if (timings.animationDuration) {\n              var value = blockKeyframeAnimations(node, animationPaused);\n              if (animationPaused) {\n                temporaryStyles.push(value);\n              } else {\n                removeFromArray(temporaryStyles, value);\n              }\n            }\n          } else if (animationPaused && playAnimation) {\n            animationPaused = false;\n            close();\n          }\n        };\n\n        // checking the stagger duration prevents an accidentally cascade of the CSS delay style\n        // being inherited from the parent. If the transition duration is zero then we can safely\n        // rely that the delay value is an intentional stagger delay style.\n        var maxStagger = itemIndex > 0\n                         && ((timings.transitionDuration && stagger.transitionDuration === 0) ||\n                            (timings.animationDuration && stagger.animationDuration === 0))\n                         && Math.max(stagger.animationDelay, stagger.transitionDelay);\n        if (maxStagger) {\n          $timeout(triggerAnimationStart,\n                   Math.floor(maxStagger * itemIndex * ONE_SECOND),\n                   false);\n        } else {\n          triggerAnimationStart();\n        }\n\n        // this will decorate the existing promise runner with pause/resume methods\n        runnerHost.resume = function() {\n          playPause(true);\n        };\n\n        runnerHost.pause = function() {\n          playPause(false);\n        };\n\n        function triggerAnimationStart() {\n          // just incase a stagger animation kicks in when the animation\n          // itself was cancelled entirely\n          if (animationClosed) return;\n\n          applyBlocking(false);\n\n          forEach(temporaryStyles, function(entry) {\n            var key = entry[0];\n            var value = entry[1];\n            node.style[key] = value;\n          });\n\n          applyAnimationClasses(element, options);\n          $$jqLite.addClass(element, activeClasses);\n\n          if (flags.recalculateTimingStyles) {\n            fullClassName = node.getAttribute('class') + ' ' + preparationClasses;\n            cacheKey = gcsHashFn(node, fullClassName);\n\n            timings = computeTimings(node, fullClassName, cacheKey);\n            relativeDelay = timings.maxDelay;\n            maxDelay = Math.max(relativeDelay, 0);\n            maxDuration = timings.maxDuration;\n\n            if (maxDuration === 0) {\n              close();\n              return;\n            }\n\n            flags.hasTransitions = timings.transitionDuration > 0;\n            flags.hasAnimations = timings.animationDuration > 0;\n          }\n\n          if (flags.applyAnimationDelay) {\n            relativeDelay = typeof options.delay !== 'boolean' && truthyTimingValue(options.delay)\n                  ? parseFloat(options.delay)\n                  : relativeDelay;\n\n            maxDelay = Math.max(relativeDelay, 0);\n            timings.animationDelay = relativeDelay;\n            delayStyle = getCssDelayStyle(relativeDelay, true);\n            temporaryStyles.push(delayStyle);\n            node.style[delayStyle[0]] = delayStyle[1];\n          }\n\n          maxDelayTime = maxDelay * ONE_SECOND;\n          maxDurationTime = maxDuration * ONE_SECOND;\n\n          if (options.easing) {\n            var easeProp, easeVal = options.easing;\n            if (flags.hasTransitions) {\n              easeProp = TRANSITION_PROP + TIMING_KEY;\n              temporaryStyles.push([easeProp, easeVal]);\n              node.style[easeProp] = easeVal;\n            }\n            if (flags.hasAnimations) {\n              easeProp = ANIMATION_PROP + TIMING_KEY;\n              temporaryStyles.push([easeProp, easeVal]);\n              node.style[easeProp] = easeVal;\n            }\n          }\n\n          if (timings.transitionDuration) {\n            events.push(TRANSITIONEND_EVENT);\n          }\n\n          if (timings.animationDuration) {\n            events.push(ANIMATIONEND_EVENT);\n          }\n\n          startTime = Date.now();\n          var timerTime = maxDelayTime + CLOSING_TIME_BUFFER * maxDurationTime;\n          var endTime = startTime + timerTime;\n\n          var animationsData = element.data(ANIMATE_TIMER_KEY) || [];\n          var setupFallbackTimer = true;\n          if (animationsData.length) {\n            var currentTimerData = animationsData[0];\n            setupFallbackTimer = endTime > currentTimerData.expectedEndTime;\n            if (setupFallbackTimer) {\n              $timeout.cancel(currentTimerData.timer);\n            } else {\n              animationsData.push(close);\n            }\n          }\n\n          if (setupFallbackTimer) {\n            var timer = $timeout(onAnimationExpired, timerTime, false);\n            animationsData[0] = {\n              timer: timer,\n              expectedEndTime: endTime\n            };\n            animationsData.push(close);\n            element.data(ANIMATE_TIMER_KEY, animationsData);\n          }\n\n          if (events.length) {\n            element.on(events.join(' '), onAnimationProgress);\n          }\n\n          if (options.to) {\n            if (options.cleanupStyles) {\n              registerRestorableStyles(restoreStyles, node, Object.keys(options.to));\n            }\n            applyAnimationToStyles(element, options);\n          }\n        }\n\n        function onAnimationExpired() {\n          var animationsData = element.data(ANIMATE_TIMER_KEY);\n\n          // this will be false in the event that the element was\n          // removed from the DOM (via a leave animation or something\n          // similar)\n          if (animationsData) {\n            for (var i = 1; i < animationsData.length; i++) {\n              animationsData[i]();\n            }\n            element.removeData(ANIMATE_TIMER_KEY);\n          }\n        }\n      }\n    };\n  }];\n}];\n\nvar $$AnimateCssDriverProvider = ['$$animationProvider', /** @this */ function($$animationProvider) {\n  $$animationProvider.drivers.push('$$animateCssDriver');\n\n  var NG_ANIMATE_SHIM_CLASS_NAME = 'ng-animate-shim';\n  var NG_ANIMATE_ANCHOR_CLASS_NAME = 'ng-anchor';\n\n  var NG_OUT_ANCHOR_CLASS_NAME = 'ng-anchor-out';\n  var NG_IN_ANCHOR_CLASS_NAME = 'ng-anchor-in';\n\n  function isDocumentFragment(node) {\n    return node.parentNode && node.parentNode.nodeType === 11;\n  }\n\n  this.$get = ['$animateCss', '$rootScope', '$$AnimateRunner', '$rootElement', '$sniffer', '$$jqLite', '$document',\n       function($animateCss,   $rootScope,   $$AnimateRunner,   $rootElement,   $sniffer,   $$jqLite,   $document) {\n\n    // only browsers that support these properties can render animations\n    if (!$sniffer.animations && !$sniffer.transitions) return noop;\n\n    var bodyNode = $document[0].body;\n    var rootNode = getDomNode($rootElement);\n\n    var rootBodyElement = jqLite(\n      // this is to avoid using something that exists outside of the body\n      // we also special case the doc fragment case because our unit test code\n      // appends the $rootElement to the body after the app has been bootstrapped\n      isDocumentFragment(rootNode) || bodyNode.contains(rootNode) ? rootNode : bodyNode\n    );\n\n    return function initDriverFn(animationDetails) {\n      return animationDetails.from && animationDetails.to\n          ? prepareFromToAnchorAnimation(animationDetails.from,\n                                         animationDetails.to,\n                                         animationDetails.classes,\n                                         animationDetails.anchors)\n          : prepareRegularAnimation(animationDetails);\n    };\n\n    function filterCssClasses(classes) {\n      //remove all the `ng-` stuff\n      return classes.replace(/\\bng-\\S+\\b/g, '');\n    }\n\n    function getUniqueValues(a, b) {\n      if (isString(a)) a = a.split(' ');\n      if (isString(b)) b = b.split(' ');\n      return a.filter(function(val) {\n        return b.indexOf(val) === -1;\n      }).join(' ');\n    }\n\n    function prepareAnchoredAnimation(classes, outAnchor, inAnchor) {\n      var clone = jqLite(getDomNode(outAnchor).cloneNode(true));\n      var startingClasses = filterCssClasses(getClassVal(clone));\n\n      outAnchor.addClass(NG_ANIMATE_SHIM_CLASS_NAME);\n      inAnchor.addClass(NG_ANIMATE_SHIM_CLASS_NAME);\n\n      clone.addClass(NG_ANIMATE_ANCHOR_CLASS_NAME);\n\n      rootBodyElement.append(clone);\n\n      var animatorIn, animatorOut = prepareOutAnimation();\n\n      // the user may not end up using the `out` animation and\n      // only making use of the `in` animation or vice-versa.\n      // In either case we should allow this and not assume the\n      // animation is over unless both animations are not used.\n      if (!animatorOut) {\n        animatorIn = prepareInAnimation();\n        if (!animatorIn) {\n          return end();\n        }\n      }\n\n      var startingAnimator = animatorOut || animatorIn;\n\n      return {\n        start: function() {\n          var runner;\n\n          var currentAnimation = startingAnimator.start();\n          currentAnimation.done(function() {\n            currentAnimation = null;\n            if (!animatorIn) {\n              animatorIn = prepareInAnimation();\n              if (animatorIn) {\n                currentAnimation = animatorIn.start();\n                currentAnimation.done(function() {\n                  currentAnimation = null;\n                  end();\n                  runner.complete();\n                });\n                return currentAnimation;\n              }\n            }\n            // in the event that there is no `in` animation\n            end();\n            runner.complete();\n          });\n\n          runner = new $$AnimateRunner({\n            end: endFn,\n            cancel: endFn\n          });\n\n          return runner;\n\n          function endFn() {\n            if (currentAnimation) {\n              currentAnimation.end();\n            }\n          }\n        }\n      };\n\n      function calculateAnchorStyles(anchor) {\n        var styles = {};\n\n        var coords = getDomNode(anchor).getBoundingClientRect();\n\n        // we iterate directly since safari messes up and doesn't return\n        // all the keys for the coords object when iterated\n        forEach(['width','height','top','left'], function(key) {\n          var value = coords[key];\n          switch (key) {\n            case 'top':\n              value += bodyNode.scrollTop;\n              break;\n            case 'left':\n              value += bodyNode.scrollLeft;\n              break;\n          }\n          styles[key] = Math.floor(value) + 'px';\n        });\n        return styles;\n      }\n\n      function prepareOutAnimation() {\n        var animator = $animateCss(clone, {\n          addClass: NG_OUT_ANCHOR_CLASS_NAME,\n          delay: true,\n          from: calculateAnchorStyles(outAnchor)\n        });\n\n        // read the comment within `prepareRegularAnimation` to understand\n        // why this check is necessary\n        return animator.$$willAnimate ? animator : null;\n      }\n\n      function getClassVal(element) {\n        return element.attr('class') || '';\n      }\n\n      function prepareInAnimation() {\n        var endingClasses = filterCssClasses(getClassVal(inAnchor));\n        var toAdd = getUniqueValues(endingClasses, startingClasses);\n        var toRemove = getUniqueValues(startingClasses, endingClasses);\n\n        var animator = $animateCss(clone, {\n          to: calculateAnchorStyles(inAnchor),\n          addClass: NG_IN_ANCHOR_CLASS_NAME + ' ' + toAdd,\n          removeClass: NG_OUT_ANCHOR_CLASS_NAME + ' ' + toRemove,\n          delay: true\n        });\n\n        // read the comment within `prepareRegularAnimation` to understand\n        // why this check is necessary\n        return animator.$$willAnimate ? animator : null;\n      }\n\n      function end() {\n        clone.remove();\n        outAnchor.removeClass(NG_ANIMATE_SHIM_CLASS_NAME);\n        inAnchor.removeClass(NG_ANIMATE_SHIM_CLASS_NAME);\n      }\n    }\n\n    function prepareFromToAnchorAnimation(from, to, classes, anchors) {\n      var fromAnimation = prepareRegularAnimation(from, noop);\n      var toAnimation = prepareRegularAnimation(to, noop);\n\n      var anchorAnimations = [];\n      forEach(anchors, function(anchor) {\n        var outElement = anchor['out'];\n        var inElement = anchor['in'];\n        var animator = prepareAnchoredAnimation(classes, outElement, inElement);\n        if (animator) {\n          anchorAnimations.push(animator);\n        }\n      });\n\n      // no point in doing anything when there are no elements to animate\n      if (!fromAnimation && !toAnimation && anchorAnimations.length === 0) return;\n\n      return {\n        start: function() {\n          var animationRunners = [];\n\n          if (fromAnimation) {\n            animationRunners.push(fromAnimation.start());\n          }\n\n          if (toAnimation) {\n            animationRunners.push(toAnimation.start());\n          }\n\n          forEach(anchorAnimations, function(animation) {\n            animationRunners.push(animation.start());\n          });\n\n          var runner = new $$AnimateRunner({\n            end: endFn,\n            cancel: endFn // CSS-driven animations cannot be cancelled, only ended\n          });\n\n          $$AnimateRunner.all(animationRunners, function(status) {\n            runner.complete(status);\n          });\n\n          return runner;\n\n          function endFn() {\n            forEach(animationRunners, function(runner) {\n              runner.end();\n            });\n          }\n        }\n      };\n    }\n\n    function prepareRegularAnimation(animationDetails) {\n      var element = animationDetails.element;\n      var options = animationDetails.options || {};\n\n      if (animationDetails.structural) {\n        options.event = animationDetails.event;\n        options.structural = true;\n        options.applyClassesEarly = true;\n\n        // we special case the leave animation since we want to ensure that\n        // the element is removed as soon as the animation is over. Otherwise\n        // a flicker might appear or the element may not be removed at all\n        if (animationDetails.event === 'leave') {\n          options.onDone = options.domOperation;\n        }\n      }\n\n      // We assign the preparationClasses as the actual animation event since\n      // the internals of $animateCss will just suffix the event token values\n      // with `-active` to trigger the animation.\n      if (options.preparationClasses) {\n        options.event = concatWithSpace(options.event, options.preparationClasses);\n      }\n\n      var animator = $animateCss(element, options);\n\n      // the driver lookup code inside of $$animation attempts to spawn a\n      // driver one by one until a driver returns a.$$willAnimate animator object.\n      // $animateCss will always return an object, however, it will pass in\n      // a flag as a hint as to whether an animation was detected or not\n      return animator.$$willAnimate ? animator : null;\n    }\n  }];\n}];\n\n// TODO(matsko): use caching here to speed things up for detection\n// TODO(matsko): add documentation\n//  by the time...\n\nvar $$AnimateJsProvider = ['$animateProvider', /** @this */ function($animateProvider) {\n  this.$get = ['$injector', '$$AnimateRunner', '$$jqLite',\n       function($injector,   $$AnimateRunner,   $$jqLite) {\n\n    var applyAnimationClasses = applyAnimationClassesFactory($$jqLite);\n         // $animateJs(element, 'enter');\n    return function(element, event, classes, options) {\n      var animationClosed = false;\n\n      // the `classes` argument is optional and if it is not used\n      // then the classes will be resolved from the element's className\n      // property as well as options.addClass/options.removeClass.\n      if (arguments.length === 3 && isObject(classes)) {\n        options = classes;\n        classes = null;\n      }\n\n      options = prepareAnimationOptions(options);\n      if (!classes) {\n        classes = element.attr('class') || '';\n        if (options.addClass) {\n          classes += ' ' + options.addClass;\n        }\n        if (options.removeClass) {\n          classes += ' ' + options.removeClass;\n        }\n      }\n\n      var classesToAdd = options.addClass;\n      var classesToRemove = options.removeClass;\n\n      // the lookupAnimations function returns a series of animation objects that are\n      // matched up with one or more of the CSS classes. These animation objects are\n      // defined via the module.animation factory function. If nothing is detected then\n      // we don't return anything which then makes $animation query the next driver.\n      var animations = lookupAnimations(classes);\n      var before, after;\n      if (animations.length) {\n        var afterFn, beforeFn;\n        if (event === 'leave') {\n          beforeFn = 'leave';\n          afterFn = 'afterLeave'; // TODO(matsko): get rid of this\n        } else {\n          beforeFn = 'before' + event.charAt(0).toUpperCase() + event.substr(1);\n          afterFn = event;\n        }\n\n        if (event !== 'enter' && event !== 'move') {\n          before = packageAnimations(element, event, options, animations, beforeFn);\n        }\n        after  = packageAnimations(element, event, options, animations, afterFn);\n      }\n\n      // no matching animations\n      if (!before && !after) return;\n\n      function applyOptions() {\n        options.domOperation();\n        applyAnimationClasses(element, options);\n      }\n\n      function close() {\n        animationClosed = true;\n        applyOptions();\n        applyAnimationStyles(element, options);\n      }\n\n      var runner;\n\n      return {\n        $$willAnimate: true,\n        end: function() {\n          if (runner) {\n            runner.end();\n          } else {\n            close();\n            runner = new $$AnimateRunner();\n            runner.complete(true);\n          }\n          return runner;\n        },\n        start: function() {\n          if (runner) {\n            return runner;\n          }\n\n          runner = new $$AnimateRunner();\n          var closeActiveAnimations;\n          var chain = [];\n\n          if (before) {\n            chain.push(function(fn) {\n              closeActiveAnimations = before(fn);\n            });\n          }\n\n          if (chain.length) {\n            chain.push(function(fn) {\n              applyOptions();\n              fn(true);\n            });\n          } else {\n            applyOptions();\n          }\n\n          if (after) {\n            chain.push(function(fn) {\n              closeActiveAnimations = after(fn);\n            });\n          }\n\n          runner.setHost({\n            end: function() {\n              endAnimations();\n            },\n            cancel: function() {\n              endAnimations(true);\n            }\n          });\n\n          $$AnimateRunner.chain(chain, onComplete);\n          return runner;\n\n          function onComplete(success) {\n            close(success);\n            runner.complete(success);\n          }\n\n          function endAnimations(cancelled) {\n            if (!animationClosed) {\n              (closeActiveAnimations || noop)(cancelled);\n              onComplete(cancelled);\n            }\n          }\n        }\n      };\n\n      function executeAnimationFn(fn, element, event, options, onDone) {\n        var args;\n        switch (event) {\n          case 'animate':\n            args = [element, options.from, options.to, onDone];\n            break;\n\n          case 'setClass':\n            args = [element, classesToAdd, classesToRemove, onDone];\n            break;\n\n          case 'addClass':\n            args = [element, classesToAdd, onDone];\n            break;\n\n          case 'removeClass':\n            args = [element, classesToRemove, onDone];\n            break;\n\n          default:\n            args = [element, onDone];\n            break;\n        }\n\n        args.push(options);\n\n        var value = fn.apply(fn, args);\n        if (value) {\n          if (isFunction(value.start)) {\n            value = value.start();\n          }\n\n          if (value instanceof $$AnimateRunner) {\n            value.done(onDone);\n          } else if (isFunction(value)) {\n            // optional onEnd / onCancel callback\n            return value;\n          }\n        }\n\n        return noop;\n      }\n\n      function groupEventedAnimations(element, event, options, animations, fnName) {\n        var operations = [];\n        forEach(animations, function(ani) {\n          var animation = ani[fnName];\n          if (!animation) return;\n\n          // note that all of these animations will run in parallel\n          operations.push(function() {\n            var runner;\n            var endProgressCb;\n\n            var resolved = false;\n            var onAnimationComplete = function(rejected) {\n              if (!resolved) {\n                resolved = true;\n                (endProgressCb || noop)(rejected);\n                runner.complete(!rejected);\n              }\n            };\n\n            runner = new $$AnimateRunner({\n              end: function() {\n                onAnimationComplete();\n              },\n              cancel: function() {\n                onAnimationComplete(true);\n              }\n            });\n\n            endProgressCb = executeAnimationFn(animation, element, event, options, function(result) {\n              var cancelled = result === false;\n              onAnimationComplete(cancelled);\n            });\n\n            return runner;\n          });\n        });\n\n        return operations;\n      }\n\n      function packageAnimations(element, event, options, animations, fnName) {\n        var operations = groupEventedAnimations(element, event, options, animations, fnName);\n        if (operations.length === 0) {\n          var a, b;\n          if (fnName === 'beforeSetClass') {\n            a = groupEventedAnimations(element, 'removeClass', options, animations, 'beforeRemoveClass');\n            b = groupEventedAnimations(element, 'addClass', options, animations, 'beforeAddClass');\n          } else if (fnName === 'setClass') {\n            a = groupEventedAnimations(element, 'removeClass', options, animations, 'removeClass');\n            b = groupEventedAnimations(element, 'addClass', options, animations, 'addClass');\n          }\n\n          if (a) {\n            operations = operations.concat(a);\n          }\n          if (b) {\n            operations = operations.concat(b);\n          }\n        }\n\n        if (operations.length === 0) return;\n\n        // TODO(matsko): add documentation\n        return function startAnimation(callback) {\n          var runners = [];\n          if (operations.length) {\n            forEach(operations, function(animateFn) {\n              runners.push(animateFn());\n            });\n          }\n\n          if (runners.length) {\n            $$AnimateRunner.all(runners, callback);\n          }  else {\n            callback();\n          }\n\n          return function endFn(reject) {\n            forEach(runners, function(runner) {\n              if (reject) {\n                runner.cancel();\n              } else {\n                runner.end();\n              }\n            });\n          };\n        };\n      }\n    };\n\n    function lookupAnimations(classes) {\n      classes = isArray(classes) ? classes : classes.split(' ');\n      var matches = [], flagMap = {};\n      for (var i = 0; i < classes.length; i++) {\n        var klass = classes[i],\n            animationFactory = $animateProvider.$$registeredAnimations[klass];\n        if (animationFactory && !flagMap[klass]) {\n          matches.push($injector.get(animationFactory));\n          flagMap[klass] = true;\n        }\n      }\n      return matches;\n    }\n  }];\n}];\n\nvar $$AnimateJsDriverProvider = ['$$animationProvider', /** @this */ function($$animationProvider) {\n  $$animationProvider.drivers.push('$$animateJsDriver');\n  this.$get = ['$$animateJs', '$$AnimateRunner', function($$animateJs, $$AnimateRunner) {\n    return function initDriverFn(animationDetails) {\n      if (animationDetails.from && animationDetails.to) {\n        var fromAnimation = prepareAnimation(animationDetails.from);\n        var toAnimation = prepareAnimation(animationDetails.to);\n        if (!fromAnimation && !toAnimation) return;\n\n        return {\n          start: function() {\n            var animationRunners = [];\n\n            if (fromAnimation) {\n              animationRunners.push(fromAnimation.start());\n            }\n\n            if (toAnimation) {\n              animationRunners.push(toAnimation.start());\n            }\n\n            $$AnimateRunner.all(animationRunners, done);\n\n            var runner = new $$AnimateRunner({\n              end: endFnFactory(),\n              cancel: endFnFactory()\n            });\n\n            return runner;\n\n            function endFnFactory() {\n              return function() {\n                forEach(animationRunners, function(runner) {\n                  // at this point we cannot cancel animations for groups just yet. 1.5+\n                  runner.end();\n                });\n              };\n            }\n\n            function done(status) {\n              runner.complete(status);\n            }\n          }\n        };\n      } else {\n        return prepareAnimation(animationDetails);\n      }\n    };\n\n    function prepareAnimation(animationDetails) {\n      // TODO(matsko): make sure to check for grouped animations and delegate down to normal animations\n      var element = animationDetails.element;\n      var event = animationDetails.event;\n      var options = animationDetails.options;\n      var classes = animationDetails.classes;\n      return $$animateJs(element, event, classes, options);\n    }\n  }];\n}];\n\nvar NG_ANIMATE_ATTR_NAME = 'data-ng-animate';\nvar NG_ANIMATE_PIN_DATA = '$ngAnimatePin';\nvar $$AnimateQueueProvider = ['$animateProvider', /** @this */ function($animateProvider) {\n  var PRE_DIGEST_STATE = 1;\n  var RUNNING_STATE = 2;\n  var ONE_SPACE = ' ';\n\n  var rules = this.rules = {\n    skip: [],\n    cancel: [],\n    join: []\n  };\n\n  function makeTruthyCssClassMap(classString) {\n    if (!classString) {\n      return null;\n    }\n\n    var keys = classString.split(ONE_SPACE);\n    var map = Object.create(null);\n\n    forEach(keys, function(key) {\n      map[key] = true;\n    });\n    return map;\n  }\n\n  function hasMatchingClasses(newClassString, currentClassString) {\n    if (newClassString && currentClassString) {\n      var currentClassMap = makeTruthyCssClassMap(currentClassString);\n      return newClassString.split(ONE_SPACE).some(function(className) {\n        return currentClassMap[className];\n      });\n    }\n  }\n\n  function isAllowed(ruleType, currentAnimation, previousAnimation) {\n    return rules[ruleType].some(function(fn) {\n      return fn(currentAnimation, previousAnimation);\n    });\n  }\n\n  function hasAnimationClasses(animation, and) {\n    var a = (animation.addClass || '').length > 0;\n    var b = (animation.removeClass || '').length > 0;\n    return and ? a && b : a || b;\n  }\n\n  rules.join.push(function(newAnimation, currentAnimation) {\n    // if the new animation is class-based then we can just tack that on\n    return !newAnimation.structural && hasAnimationClasses(newAnimation);\n  });\n\n  rules.skip.push(function(newAnimation, currentAnimation) {\n    // there is no need to animate anything if no classes are being added and\n    // there is no structural animation that will be triggered\n    return !newAnimation.structural && !hasAnimationClasses(newAnimation);\n  });\n\n  rules.skip.push(function(newAnimation, currentAnimation) {\n    // why should we trigger a new structural animation if the element will\n    // be removed from the DOM anyway?\n    return currentAnimation.event === 'leave' && newAnimation.structural;\n  });\n\n  rules.skip.push(function(newAnimation, currentAnimation) {\n    // if there is an ongoing current animation then don't even bother running the class-based animation\n    return currentAnimation.structural && currentAnimation.state === RUNNING_STATE && !newAnimation.structural;\n  });\n\n  rules.cancel.push(function(newAnimation, currentAnimation) {\n    // there can never be two structural animations running at the same time\n    return currentAnimation.structural && newAnimation.structural;\n  });\n\n  rules.cancel.push(function(newAnimation, currentAnimation) {\n    // if the previous animation is already running, but the new animation will\n    // be triggered, but the new animation is structural\n    return currentAnimation.state === RUNNING_STATE && newAnimation.structural;\n  });\n\n  rules.cancel.push(function(newAnimation, currentAnimation) {\n    // cancel the animation if classes added / removed in both animation cancel each other out,\n    // but only if the current animation isn't structural\n\n    if (currentAnimation.structural) return false;\n\n    var nA = newAnimation.addClass;\n    var nR = newAnimation.removeClass;\n    var cA = currentAnimation.addClass;\n    var cR = currentAnimation.removeClass;\n\n    // early detection to save the global CPU shortage :)\n    if ((isUndefined(nA) && isUndefined(nR)) || (isUndefined(cA) && isUndefined(cR))) {\n      return false;\n    }\n\n    return hasMatchingClasses(nA, cR) || hasMatchingClasses(nR, cA);\n  });\n\n  this.$get = ['$$rAF', '$rootScope', '$rootElement', '$document', '$$Map',\n               '$$animation', '$$AnimateRunner', '$templateRequest', '$$jqLite', '$$forceReflow',\n               '$$isDocumentHidden',\n       function($$rAF,   $rootScope,   $rootElement,   $document,   $$Map,\n                $$animation,   $$AnimateRunner,   $templateRequest,   $$jqLite,   $$forceReflow,\n                $$isDocumentHidden) {\n\n    var activeAnimationsLookup = new $$Map();\n    var disabledElementsLookup = new $$Map();\n    var animationsEnabled = null;\n\n    function postDigestTaskFactory() {\n      var postDigestCalled = false;\n      return function(fn) {\n        // we only issue a call to postDigest before\n        // it has first passed. This prevents any callbacks\n        // from not firing once the animation has completed\n        // since it will be out of the digest cycle.\n        if (postDigestCalled) {\n          fn();\n        } else {\n          $rootScope.$$postDigest(function() {\n            postDigestCalled = true;\n            fn();\n          });\n        }\n      };\n    }\n\n    // Wait until all directive and route-related templates are downloaded and\n    // compiled. The $templateRequest.totalPendingRequests variable keeps track of\n    // all of the remote templates being currently downloaded. If there are no\n    // templates currently downloading then the watcher will still fire anyway.\n    var deregisterWatch = $rootScope.$watch(\n      function() { return $templateRequest.totalPendingRequests === 0; },\n      function(isEmpty) {\n        if (!isEmpty) return;\n        deregisterWatch();\n\n        // Now that all templates have been downloaded, $animate will wait until\n        // the post digest queue is empty before enabling animations. By having two\n        // calls to $postDigest calls we can ensure that the flag is enabled at the\n        // very end of the post digest queue. Since all of the animations in $animate\n        // use $postDigest, it's important that the code below executes at the end.\n        // This basically means that the page is fully downloaded and compiled before\n        // any animations are triggered.\n        $rootScope.$$postDigest(function() {\n          $rootScope.$$postDigest(function() {\n            // we check for null directly in the event that the application already called\n            // .enabled() with whatever arguments that it provided it with\n            if (animationsEnabled === null) {\n              animationsEnabled = true;\n            }\n          });\n        });\n      }\n    );\n\n    var callbackRegistry = Object.create(null);\n\n    // remember that the classNameFilter is set during the provider/config\n    // stage therefore we can optimize here and setup a helper function\n    var classNameFilter = $animateProvider.classNameFilter();\n    var isAnimatableClassName = !classNameFilter\n              ? function() { return true; }\n              : function(className) {\n                return classNameFilter.test(className);\n              };\n\n    var applyAnimationClasses = applyAnimationClassesFactory($$jqLite);\n\n    function normalizeAnimationDetails(element, animation) {\n      return mergeAnimationDetails(element, animation, {});\n    }\n\n    // IE9-11 has no method \"contains\" in SVG element and in Node.prototype. Bug #10259.\n    var contains = window.Node.prototype.contains || /** @this */ function(arg) {\n      // eslint-disable-next-line no-bitwise\n      return this === arg || !!(this.compareDocumentPosition(arg) & 16);\n    };\n\n    function findCallbacks(targetParentNode, targetNode, event) {\n      var matches = [];\n      var entries = callbackRegistry[event];\n      if (entries) {\n        forEach(entries, function(entry) {\n          if (contains.call(entry.node, targetNode)) {\n            matches.push(entry.callback);\n          } else if (event === 'leave' && contains.call(entry.node, targetParentNode)) {\n            matches.push(entry.callback);\n          }\n        });\n      }\n\n      return matches;\n    }\n\n    function filterFromRegistry(list, matchContainer, matchCallback) {\n      var containerNode = extractElementNode(matchContainer);\n      return list.filter(function(entry) {\n        var isMatch = entry.node === containerNode &&\n                        (!matchCallback || entry.callback === matchCallback);\n        return !isMatch;\n      });\n    }\n\n    function cleanupEventListeners(phase, node) {\n      if (phase === 'close' && !node.parentNode) {\n        // If the element is not attached to a parentNode, it has been removed by\n        // the domOperation, and we can safely remove the event callbacks\n        $animate.off(node);\n      }\n    }\n\n    var $animate = {\n      on: function(event, container, callback) {\n        var node = extractElementNode(container);\n        callbackRegistry[event] = callbackRegistry[event] || [];\n        callbackRegistry[event].push({\n          node: node,\n          callback: callback\n        });\n\n        // Remove the callback when the element is removed from the DOM\n        jqLite(container).on('$destroy', function() {\n          var animationDetails = activeAnimationsLookup.get(node);\n\n          if (!animationDetails) {\n            // If there's an animation ongoing, the callback calling code will remove\n            // the event listeners. If we'd remove here, the callbacks would be removed\n            // before the animation ends\n            $animate.off(event, container, callback);\n          }\n        });\n      },\n\n      off: function(event, container, callback) {\n        if (arguments.length === 1 && !isString(arguments[0])) {\n          container = arguments[0];\n          for (var eventType in callbackRegistry) {\n            callbackRegistry[eventType] = filterFromRegistry(callbackRegistry[eventType], container);\n          }\n\n          return;\n        }\n\n        var entries = callbackRegistry[event];\n        if (!entries) return;\n\n        callbackRegistry[event] = arguments.length === 1\n            ? null\n            : filterFromRegistry(entries, container, callback);\n      },\n\n      pin: function(element, parentElement) {\n        assertArg(isElement(element), 'element', 'not an element');\n        assertArg(isElement(parentElement), 'parentElement', 'not an element');\n        element.data(NG_ANIMATE_PIN_DATA, parentElement);\n      },\n\n      push: function(element, event, options, domOperation) {\n        options = options || {};\n        options.domOperation = domOperation;\n        return queueAnimation(element, event, options);\n      },\n\n      // this method has four signatures:\n      //  () - global getter\n      //  (bool) - global setter\n      //  (element) - element getter\n      //  (element, bool) - element setter<F37>\n      enabled: function(element, bool) {\n        var argCount = arguments.length;\n\n        if (argCount === 0) {\n          // () - Global getter\n          bool = !!animationsEnabled;\n        } else {\n          var hasElement = isElement(element);\n\n          if (!hasElement) {\n            // (bool) - Global setter\n            bool = animationsEnabled = !!element;\n          } else {\n            var node = getDomNode(element);\n\n            if (argCount === 1) {\n              // (element) - Element getter\n              bool = !disabledElementsLookup.get(node);\n            } else {\n              // (element, bool) - Element setter\n              disabledElementsLookup.set(node, !bool);\n            }\n          }\n        }\n\n        return bool;\n      }\n    };\n\n    return $animate;\n\n    function queueAnimation(originalElement, event, initialOptions) {\n      // we always make a copy of the options since\n      // there should never be any side effects on\n      // the input data when running `$animateCss`.\n      var options = copy(initialOptions);\n\n      var element = stripCommentsFromElement(originalElement);\n      var node = getDomNode(element);\n      var parentNode = node && node.parentNode;\n\n      options = prepareAnimationOptions(options);\n\n      // we create a fake runner with a working promise.\n      // These methods will become available after the digest has passed\n      var runner = new $$AnimateRunner();\n\n      // this is used to trigger callbacks in postDigest mode\n      var runInNextPostDigestOrNow = postDigestTaskFactory();\n\n      if (isArray(options.addClass)) {\n        options.addClass = options.addClass.join(' ');\n      }\n\n      if (options.addClass && !isString(options.addClass)) {\n        options.addClass = null;\n      }\n\n      if (isArray(options.removeClass)) {\n        options.removeClass = options.removeClass.join(' ');\n      }\n\n      if (options.removeClass && !isString(options.removeClass)) {\n        options.removeClass = null;\n      }\n\n      if (options.from && !isObject(options.from)) {\n        options.from = null;\n      }\n\n      if (options.to && !isObject(options.to)) {\n        options.to = null;\n      }\n\n      // there are situations where a directive issues an animation for\n      // a jqLite wrapper that contains only comment nodes... If this\n      // happens then there is no way we can perform an animation\n      if (!node) {\n        close();\n        return runner;\n      }\n\n      var className = [node.getAttribute('class'), options.addClass, options.removeClass].join(' ');\n      if (!isAnimatableClassName(className)) {\n        close();\n        return runner;\n      }\n\n      var isStructural = ['enter', 'move', 'leave'].indexOf(event) >= 0;\n\n      var documentHidden = $$isDocumentHidden();\n\n      // this is a hard disable of all animations for the application or on\n      // the element itself, therefore  there is no need to continue further\n      // past this point if not enabled\n      // Animations are also disabled if the document is currently hidden (page is not visible\n      // to the user), because browsers slow down or do not flush calls to requestAnimationFrame\n      var skipAnimations = !animationsEnabled || documentHidden || disabledElementsLookup.get(node);\n      var existingAnimation = (!skipAnimations && activeAnimationsLookup.get(node)) || {};\n      var hasExistingAnimation = !!existingAnimation.state;\n\n      // there is no point in traversing the same collection of parent ancestors if a followup\n      // animation will be run on the same element that already did all that checking work\n      if (!skipAnimations && (!hasExistingAnimation || existingAnimation.state !== PRE_DIGEST_STATE)) {\n        skipAnimations = !areAnimationsAllowed(node, parentNode, event);\n      }\n\n      if (skipAnimations) {\n        // Callbacks should fire even if the document is hidden (regression fix for issue #14120)\n        if (documentHidden) notifyProgress(runner, event, 'start');\n        close();\n        if (documentHidden) notifyProgress(runner, event, 'close');\n        return runner;\n      }\n\n      if (isStructural) {\n        closeChildAnimations(node);\n      }\n\n      var newAnimation = {\n        structural: isStructural,\n        element: element,\n        event: event,\n        addClass: options.addClass,\n        removeClass: options.removeClass,\n        close: close,\n        options: options,\n        runner: runner\n      };\n\n      if (hasExistingAnimation) {\n        var skipAnimationFlag = isAllowed('skip', newAnimation, existingAnimation);\n        if (skipAnimationFlag) {\n          if (existingAnimation.state === RUNNING_STATE) {\n            close();\n            return runner;\n          } else {\n            mergeAnimationDetails(element, existingAnimation, newAnimation);\n            return existingAnimation.runner;\n          }\n        }\n        var cancelAnimationFlag = isAllowed('cancel', newAnimation, existingAnimation);\n        if (cancelAnimationFlag) {\n          if (existingAnimation.state === RUNNING_STATE) {\n            // this will end the animation right away and it is safe\n            // to do so since the animation is already running and the\n            // runner callback code will run in async\n            existingAnimation.runner.end();\n          } else if (existingAnimation.structural) {\n            // this means that the animation is queued into a digest, but\n            // hasn't started yet. Therefore it is safe to run the close\n            // method which will call the runner methods in async.\n            existingAnimation.close();\n          } else {\n            // this will merge the new animation options into existing animation options\n            mergeAnimationDetails(element, existingAnimation, newAnimation);\n\n            return existingAnimation.runner;\n          }\n        } else {\n          // a joined animation means that this animation will take over the existing one\n          // so an example would involve a leave animation taking over an enter. Then when\n          // the postDigest kicks in the enter will be ignored.\n          var joinAnimationFlag = isAllowed('join', newAnimation, existingAnimation);\n          if (joinAnimationFlag) {\n            if (existingAnimation.state === RUNNING_STATE) {\n              normalizeAnimationDetails(element, newAnimation);\n            } else {\n              applyGeneratedPreparationClasses(element, isStructural ? event : null, options);\n\n              event = newAnimation.event = existingAnimation.event;\n              options = mergeAnimationDetails(element, existingAnimation, newAnimation);\n\n              //we return the same runner since only the option values of this animation will\n              //be fed into the `existingAnimation`.\n              return existingAnimation.runner;\n            }\n          }\n        }\n      } else {\n        // normalization in this case means that it removes redundant CSS classes that\n        // already exist (addClass) or do not exist (removeClass) on the element\n        normalizeAnimationDetails(element, newAnimation);\n      }\n\n      // when the options are merged and cleaned up we may end up not having to do\n      // an animation at all, therefore we should check this before issuing a post\n      // digest callback. Structural animations will always run no matter what.\n      var isValidAnimation = newAnimation.structural;\n      if (!isValidAnimation) {\n        // animate (from/to) can be quickly checked first, otherwise we check if any classes are present\n        isValidAnimation = (newAnimation.event === 'animate' && Object.keys(newAnimation.options.to || {}).length > 0)\n                            || hasAnimationClasses(newAnimation);\n      }\n\n      if (!isValidAnimation) {\n        close();\n        clearElementAnimationState(node);\n        return runner;\n      }\n\n      // the counter keeps track of cancelled animations\n      var counter = (existingAnimation.counter || 0) + 1;\n      newAnimation.counter = counter;\n\n      markElementAnimationState(node, PRE_DIGEST_STATE, newAnimation);\n\n      $rootScope.$$postDigest(function() {\n        // It is possible that the DOM nodes inside `originalElement` have been replaced. This can\n        // happen if the animated element is a transcluded clone and also has a `templateUrl`\n        // directive on it. Therefore, we must recreate `element` in order to interact with the\n        // actual DOM nodes.\n        // Note: We still need to use the old `node` for certain things, such as looking up in\n        //       HashMaps where it was used as the key.\n\n        element = stripCommentsFromElement(originalElement);\n\n        var animationDetails = activeAnimationsLookup.get(node);\n        var animationCancelled = !animationDetails;\n        animationDetails = animationDetails || {};\n\n        // if addClass/removeClass is called before something like enter then the\n        // registered parent element may not be present. The code below will ensure\n        // that a final value for parent element is obtained\n        var parentElement = element.parent() || [];\n\n        // animate/structural/class-based animations all have requirements. Otherwise there\n        // is no point in performing an animation. The parent node must also be set.\n        var isValidAnimation = parentElement.length > 0\n                                && (animationDetails.event === 'animate'\n                                    || animationDetails.structural\n                                    || hasAnimationClasses(animationDetails));\n\n        // this means that the previous animation was cancelled\n        // even if the follow-up animation is the same event\n        if (animationCancelled || animationDetails.counter !== counter || !isValidAnimation) {\n          // if another animation did not take over then we need\n          // to make sure that the domOperation and options are\n          // handled accordingly\n          if (animationCancelled) {\n            applyAnimationClasses(element, options);\n            applyAnimationStyles(element, options);\n          }\n\n          // if the event changed from something like enter to leave then we do\n          // it, otherwise if it's the same then the end result will be the same too\n          if (animationCancelled || (isStructural && animationDetails.event !== event)) {\n            options.domOperation();\n            runner.end();\n          }\n\n          // in the event that the element animation was not cancelled or a follow-up animation\n          // isn't allowed to animate from here then we need to clear the state of the element\n          // so that any future animations won't read the expired animation data.\n          if (!isValidAnimation) {\n            clearElementAnimationState(node);\n          }\n\n          return;\n        }\n\n        // this combined multiple class to addClass / removeClass into a setClass event\n        // so long as a structural event did not take over the animation\n        event = !animationDetails.structural && hasAnimationClasses(animationDetails, true)\n            ? 'setClass'\n            : animationDetails.event;\n\n        markElementAnimationState(node, RUNNING_STATE);\n        var realRunner = $$animation(element, event, animationDetails.options);\n\n        // this will update the runner's flow-control events based on\n        // the `realRunner` object.\n        runner.setHost(realRunner);\n        notifyProgress(runner, event, 'start', {});\n\n        realRunner.done(function(status) {\n          close(!status);\n          var animationDetails = activeAnimationsLookup.get(node);\n          if (animationDetails && animationDetails.counter === counter) {\n            clearElementAnimationState(node);\n          }\n          notifyProgress(runner, event, 'close', {});\n        });\n      });\n\n      return runner;\n\n      function notifyProgress(runner, event, phase, data) {\n        runInNextPostDigestOrNow(function() {\n          var callbacks = findCallbacks(parentNode, node, event);\n          if (callbacks.length) {\n            // do not optimize this call here to RAF because\n            // we don't know how heavy the callback code here will\n            // be and if this code is buffered then this can\n            // lead to a performance regression.\n            $$rAF(function() {\n              forEach(callbacks, function(callback) {\n                callback(element, phase, data);\n              });\n              cleanupEventListeners(phase, node);\n            });\n          } else {\n            cleanupEventListeners(phase, node);\n          }\n        });\n        runner.progress(event, phase, data);\n      }\n\n      function close(reject) {\n        clearGeneratedClasses(element, options);\n        applyAnimationClasses(element, options);\n        applyAnimationStyles(element, options);\n        options.domOperation();\n        runner.complete(!reject);\n      }\n    }\n\n    function closeChildAnimations(node) {\n      var children = node.querySelectorAll('[' + NG_ANIMATE_ATTR_NAME + ']');\n      forEach(children, function(child) {\n        var state = parseInt(child.getAttribute(NG_ANIMATE_ATTR_NAME), 10);\n        var animationDetails = activeAnimationsLookup.get(child);\n        if (animationDetails) {\n          switch (state) {\n            case RUNNING_STATE:\n              animationDetails.runner.end();\n              /* falls through */\n            case PRE_DIGEST_STATE:\n              activeAnimationsLookup.delete(child);\n              break;\n          }\n        }\n      });\n    }\n\n    function clearElementAnimationState(node) {\n      node.removeAttribute(NG_ANIMATE_ATTR_NAME);\n      activeAnimationsLookup.delete(node);\n    }\n\n    /**\n     * This fn returns false if any of the following is true:\n     * a) animations on any parent element are disabled, and animations on the element aren't explicitly allowed\n     * b) a parent element has an ongoing structural animation, and animateChildren is false\n     * c) the element is not a child of the body\n     * d) the element is not a child of the $rootElement\n     */\n    function areAnimationsAllowed(node, parentNode, event) {\n      var bodyNode = $document[0].body;\n      var rootNode = getDomNode($rootElement);\n\n      var bodyNodeDetected = (node === bodyNode) || node.nodeName === 'HTML';\n      var rootNodeDetected = (node === rootNode);\n      var parentAnimationDetected = false;\n      var elementDisabled = disabledElementsLookup.get(node);\n      var animateChildren;\n\n      var parentHost = jqLite.data(node, NG_ANIMATE_PIN_DATA);\n      if (parentHost) {\n        parentNode = getDomNode(parentHost);\n      }\n\n      while (parentNode) {\n        if (!rootNodeDetected) {\n          // angular doesn't want to attempt to animate elements outside of the application\n          // therefore we need to ensure that the rootElement is an ancestor of the current element\n          rootNodeDetected = (parentNode === rootNode);\n        }\n\n        if (parentNode.nodeType !== ELEMENT_NODE) {\n          // no point in inspecting the #document element\n          break;\n        }\n\n        var details = activeAnimationsLookup.get(parentNode) || {};\n        // either an enter, leave or move animation will commence\n        // therefore we can't allow any animations to take place\n        // but if a parent animation is class-based then that's ok\n        if (!parentAnimationDetected) {\n          var parentNodeDisabled = disabledElementsLookup.get(parentNode);\n\n          if (parentNodeDisabled === true && elementDisabled !== false) {\n            // disable animations if the user hasn't explicitly enabled animations on the\n            // current element\n            elementDisabled = true;\n            // element is disabled via parent element, no need to check anything else\n            break;\n          } else if (parentNodeDisabled === false) {\n            elementDisabled = false;\n          }\n          parentAnimationDetected = details.structural;\n        }\n\n        if (isUndefined(animateChildren) || animateChildren === true) {\n          var value = jqLite.data(parentNode, NG_ANIMATE_CHILDREN_DATA);\n          if (isDefined(value)) {\n            animateChildren = value;\n          }\n        }\n\n        // there is no need to continue traversing at this point\n        if (parentAnimationDetected && animateChildren === false) break;\n\n        if (!bodyNodeDetected) {\n          // we also need to ensure that the element is or will be a part of the body element\n          // otherwise it is pointless to even issue an animation to be rendered\n          bodyNodeDetected = (parentNode === bodyNode);\n        }\n\n        if (bodyNodeDetected && rootNodeDetected) {\n          // If both body and root have been found, any other checks are pointless,\n          // as no animation data should live outside the application\n          break;\n        }\n\n        if (!rootNodeDetected) {\n          // If `rootNode` is not detected, check if `parentNode` is pinned to another element\n          parentHost = jqLite.data(parentNode, NG_ANIMATE_PIN_DATA);\n          if (parentHost) {\n            // The pin target element becomes the next parent element\n            parentNode = getDomNode(parentHost);\n            continue;\n          }\n        }\n\n        parentNode = parentNode.parentNode;\n      }\n\n      var allowAnimation = (!parentAnimationDetected || animateChildren) && elementDisabled !== true;\n      return allowAnimation && rootNodeDetected && bodyNodeDetected;\n    }\n\n    function markElementAnimationState(node, state, details) {\n      details = details || {};\n      details.state = state;\n\n      node.setAttribute(NG_ANIMATE_ATTR_NAME, state);\n\n      var oldValue = activeAnimationsLookup.get(node);\n      var newValue = oldValue\n          ? extend(oldValue, details)\n          : details;\n      activeAnimationsLookup.set(node, newValue);\n    }\n  }];\n}];\n\n/* exported $$AnimationProvider */\n\nvar $$AnimationProvider = ['$animateProvider', /** @this */ function($animateProvider) {\n  var NG_ANIMATE_REF_ATTR = 'ng-animate-ref';\n\n  var drivers = this.drivers = [];\n\n  var RUNNER_STORAGE_KEY = '$$animationRunner';\n\n  function setRunner(element, runner) {\n    element.data(RUNNER_STORAGE_KEY, runner);\n  }\n\n  function removeRunner(element) {\n    element.removeData(RUNNER_STORAGE_KEY);\n  }\n\n  function getRunner(element) {\n    return element.data(RUNNER_STORAGE_KEY);\n  }\n\n  this.$get = ['$$jqLite', '$rootScope', '$injector', '$$AnimateRunner', '$$Map', '$$rAFScheduler',\n       function($$jqLite,   $rootScope,   $injector,   $$AnimateRunner,   $$Map,   $$rAFScheduler) {\n\n    var animationQueue = [];\n    var applyAnimationClasses = applyAnimationClassesFactory($$jqLite);\n\n    function sortAnimations(animations) {\n      var tree = { children: [] };\n      var i, lookup = new $$Map();\n\n      // this is done first beforehand so that the map\n      // is filled with a list of the elements that will be animated\n      for (i = 0; i < animations.length; i++) {\n        var animation = animations[i];\n        lookup.set(animation.domNode, animations[i] = {\n          domNode: animation.domNode,\n          fn: animation.fn,\n          children: []\n        });\n      }\n\n      for (i = 0; i < animations.length; i++) {\n        processNode(animations[i]);\n      }\n\n      return flatten(tree);\n\n      function processNode(entry) {\n        if (entry.processed) return entry;\n        entry.processed = true;\n\n        var elementNode = entry.domNode;\n        var parentNode = elementNode.parentNode;\n        lookup.set(elementNode, entry);\n\n        var parentEntry;\n        while (parentNode) {\n          parentEntry = lookup.get(parentNode);\n          if (parentEntry) {\n            if (!parentEntry.processed) {\n              parentEntry = processNode(parentEntry);\n            }\n            break;\n          }\n          parentNode = parentNode.parentNode;\n        }\n\n        (parentEntry || tree).children.push(entry);\n        return entry;\n      }\n\n      function flatten(tree) {\n        var result = [];\n        var queue = [];\n        var i;\n\n        for (i = 0; i < tree.children.length; i++) {\n          queue.push(tree.children[i]);\n        }\n\n        var remainingLevelEntries = queue.length;\n        var nextLevelEntries = 0;\n        var row = [];\n\n        for (i = 0; i < queue.length; i++) {\n          var entry = queue[i];\n          if (remainingLevelEntries <= 0) {\n            remainingLevelEntries = nextLevelEntries;\n            nextLevelEntries = 0;\n            result.push(row);\n            row = [];\n          }\n          row.push(entry.fn);\n          entry.children.forEach(function(childEntry) {\n            nextLevelEntries++;\n            queue.push(childEntry);\n          });\n          remainingLevelEntries--;\n        }\n\n        if (row.length) {\n          result.push(row);\n        }\n\n        return result;\n      }\n    }\n\n    // TODO(matsko): document the signature in a better way\n    return function(element, event, options) {\n      options = prepareAnimationOptions(options);\n      var isStructural = ['enter', 'move', 'leave'].indexOf(event) >= 0;\n\n      // there is no animation at the current moment, however\n      // these runner methods will get later updated with the\n      // methods leading into the driver's end/cancel methods\n      // for now they just stop the animation from starting\n      var runner = new $$AnimateRunner({\n        end: function() { close(); },\n        cancel: function() { close(true); }\n      });\n\n      if (!drivers.length) {\n        close();\n        return runner;\n      }\n\n      setRunner(element, runner);\n\n      var classes = mergeClasses(element.attr('class'), mergeClasses(options.addClass, options.removeClass));\n      var tempClasses = options.tempClasses;\n      if (tempClasses) {\n        classes += ' ' + tempClasses;\n        options.tempClasses = null;\n      }\n\n      var prepareClassName;\n      if (isStructural) {\n        prepareClassName = 'ng-' + event + PREPARE_CLASS_SUFFIX;\n        $$jqLite.addClass(element, prepareClassName);\n      }\n\n      animationQueue.push({\n        // this data is used by the postDigest code and passed into\n        // the driver step function\n        element: element,\n        classes: classes,\n        event: event,\n        structural: isStructural,\n        options: options,\n        beforeStart: beforeStart,\n        close: close\n      });\n\n      element.on('$destroy', handleDestroyedElement);\n\n      // we only want there to be one function called within the post digest\n      // block. This way we can group animations for all the animations that\n      // were apart of the same postDigest flush call.\n      if (animationQueue.length > 1) return runner;\n\n      $rootScope.$$postDigest(function() {\n        var animations = [];\n        forEach(animationQueue, function(entry) {\n          // the element was destroyed early on which removed the runner\n          // form its storage. This means we can't animate this element\n          // at all and it already has been closed due to destruction.\n          if (getRunner(entry.element)) {\n            animations.push(entry);\n          } else {\n            entry.close();\n          }\n        });\n\n        // now any future animations will be in another postDigest\n        animationQueue.length = 0;\n\n        var groupedAnimations = groupAnimations(animations);\n        var toBeSortedAnimations = [];\n\n        forEach(groupedAnimations, function(animationEntry) {\n          toBeSortedAnimations.push({\n            domNode: getDomNode(animationEntry.from ? animationEntry.from.element : animationEntry.element),\n            fn: function triggerAnimationStart() {\n              // it's important that we apply the `ng-animate` CSS class and the\n              // temporary classes before we do any driver invoking since these\n              // CSS classes may be required for proper CSS detection.\n              animationEntry.beforeStart();\n\n              var startAnimationFn, closeFn = animationEntry.close;\n\n              // in the event that the element was removed before the digest runs or\n              // during the RAF sequencing then we should not trigger the animation.\n              var targetElement = animationEntry.anchors\n                  ? (animationEntry.from.element || animationEntry.to.element)\n                  : animationEntry.element;\n\n              if (getRunner(targetElement)) {\n                var operation = invokeFirstDriver(animationEntry);\n                if (operation) {\n                  startAnimationFn = operation.start;\n                }\n              }\n\n              if (!startAnimationFn) {\n                closeFn();\n              } else {\n                var animationRunner = startAnimationFn();\n                animationRunner.done(function(status) {\n                  closeFn(!status);\n                });\n                updateAnimationRunners(animationEntry, animationRunner);\n              }\n            }\n          });\n        });\n\n        // we need to sort each of the animations in order of parent to child\n        // relationships. This ensures that the child classes are applied at the\n        // right time.\n        $$rAFScheduler(sortAnimations(toBeSortedAnimations));\n      });\n\n      return runner;\n\n      // TODO(matsko): change to reference nodes\n      function getAnchorNodes(node) {\n        var SELECTOR = '[' + NG_ANIMATE_REF_ATTR + ']';\n        var items = node.hasAttribute(NG_ANIMATE_REF_ATTR)\n              ? [node]\n              : node.querySelectorAll(SELECTOR);\n        var anchors = [];\n        forEach(items, function(node) {\n          var attr = node.getAttribute(NG_ANIMATE_REF_ATTR);\n          if (attr && attr.length) {\n            anchors.push(node);\n          }\n        });\n        return anchors;\n      }\n\n      function groupAnimations(animations) {\n        var preparedAnimations = [];\n        var refLookup = {};\n        forEach(animations, function(animation, index) {\n          var element = animation.element;\n          var node = getDomNode(element);\n          var event = animation.event;\n          var enterOrMove = ['enter', 'move'].indexOf(event) >= 0;\n          var anchorNodes = animation.structural ? getAnchorNodes(node) : [];\n\n          if (anchorNodes.length) {\n            var direction = enterOrMove ? 'to' : 'from';\n\n            forEach(anchorNodes, function(anchor) {\n              var key = anchor.getAttribute(NG_ANIMATE_REF_ATTR);\n              refLookup[key] = refLookup[key] || {};\n              refLookup[key][direction] = {\n                animationID: index,\n                element: jqLite(anchor)\n              };\n            });\n          } else {\n            preparedAnimations.push(animation);\n          }\n        });\n\n        var usedIndicesLookup = {};\n        var anchorGroups = {};\n        forEach(refLookup, function(operations, key) {\n          var from = operations.from;\n          var to = operations.to;\n\n          if (!from || !to) {\n            // only one of these is set therefore we can't have an\n            // anchor animation since all three pieces are required\n            var index = from ? from.animationID : to.animationID;\n            var indexKey = index.toString();\n            if (!usedIndicesLookup[indexKey]) {\n              usedIndicesLookup[indexKey] = true;\n              preparedAnimations.push(animations[index]);\n            }\n            return;\n          }\n\n          var fromAnimation = animations[from.animationID];\n          var toAnimation = animations[to.animationID];\n          var lookupKey = from.animationID.toString();\n          if (!anchorGroups[lookupKey]) {\n            var group = anchorGroups[lookupKey] = {\n              structural: true,\n              beforeStart: function() {\n                fromAnimation.beforeStart();\n                toAnimation.beforeStart();\n              },\n              close: function() {\n                fromAnimation.close();\n                toAnimation.close();\n              },\n              classes: cssClassesIntersection(fromAnimation.classes, toAnimation.classes),\n              from: fromAnimation,\n              to: toAnimation,\n              anchors: [] // TODO(matsko): change to reference nodes\n            };\n\n            // the anchor animations require that the from and to elements both have at least\n            // one shared CSS class which effectively marries the two elements together to use\n            // the same animation driver and to properly sequence the anchor animation.\n            if (group.classes.length) {\n              preparedAnimations.push(group);\n            } else {\n              preparedAnimations.push(fromAnimation);\n              preparedAnimations.push(toAnimation);\n            }\n          }\n\n          anchorGroups[lookupKey].anchors.push({\n            'out': from.element, 'in': to.element\n          });\n        });\n\n        return preparedAnimations;\n      }\n\n      function cssClassesIntersection(a,b) {\n        a = a.split(' ');\n        b = b.split(' ');\n        var matches = [];\n\n        for (var i = 0; i < a.length; i++) {\n          var aa = a[i];\n          if (aa.substring(0,3) === 'ng-') continue;\n\n          for (var j = 0; j < b.length; j++) {\n            if (aa === b[j]) {\n              matches.push(aa);\n              break;\n            }\n          }\n        }\n\n        return matches.join(' ');\n      }\n\n      function invokeFirstDriver(animationDetails) {\n        // we loop in reverse order since the more general drivers (like CSS and JS)\n        // may attempt more elements, but custom drivers are more particular\n        for (var i = drivers.length - 1; i >= 0; i--) {\n          var driverName = drivers[i];\n          var factory = $injector.get(driverName);\n          var driver = factory(animationDetails);\n          if (driver) {\n            return driver;\n          }\n        }\n      }\n\n      function beforeStart() {\n        element.addClass(NG_ANIMATE_CLASSNAME);\n        if (tempClasses) {\n          $$jqLite.addClass(element, tempClasses);\n        }\n        if (prepareClassName) {\n          $$jqLite.removeClass(element, prepareClassName);\n          prepareClassName = null;\n        }\n      }\n\n      function updateAnimationRunners(animation, newRunner) {\n        if (animation.from && animation.to) {\n          update(animation.from.element);\n          update(animation.to.element);\n        } else {\n          update(animation.element);\n        }\n\n        function update(element) {\n          var runner = getRunner(element);\n          if (runner) runner.setHost(newRunner);\n        }\n      }\n\n      function handleDestroyedElement() {\n        var runner = getRunner(element);\n        if (runner && (event !== 'leave' || !options.$$domOperationFired)) {\n          runner.end();\n        }\n      }\n\n      function close(rejected) {\n        element.off('$destroy', handleDestroyedElement);\n        removeRunner(element);\n\n        applyAnimationClasses(element, options);\n        applyAnimationStyles(element, options);\n        options.domOperation();\n\n        if (tempClasses) {\n          $$jqLite.removeClass(element, tempClasses);\n        }\n\n        element.removeClass(NG_ANIMATE_CLASSNAME);\n        runner.complete(!rejected);\n      }\n    };\n  }];\n}];\n\n/**\n * @ngdoc directive\n * @name ngAnimateSwap\n * @restrict A\n * @scope\n *\n * @description\n *\n * ngAnimateSwap is a animation-oriented directive that allows for the container to\n * be removed and entered in whenever the associated expression changes. A\n * common usecase for this directive is a rotating banner or slider component which\n * contains one image being present at a time. When the active image changes\n * then the old image will perform a `leave` animation and the new element\n * will be inserted via an `enter` animation.\n *\n * @animations\n * | Animation                        | Occurs                               |\n * |----------------------------------|--------------------------------------|\n * | {@link ng.$animate#enter enter}  | when the new element is inserted to the DOM  |\n * | {@link ng.$animate#leave leave}  | when the old element is removed from the DOM |\n *\n * @example\n * <example name=\"ngAnimateSwap-directive\" module=\"ngAnimateSwapExample\"\n *          deps=\"angular-animate.js\"\n *          animations=\"true\" fixBase=\"true\">\n *   <file name=\"index.ced81ed4.html\">\n *     <div class=\"container\" ng-controller=\"AppCtrl\">\n *       <div ng-animate-swap=\"number\" class=\"cell swap-animation\" ng-class=\"colorClass(number)\">\n *         {{ number }}\n *       </div>\n *     </div>\n *   </file>\n *   <file name=\"script.js\">\n *     angular.module('ngAnimateSwapExample', ['ngAnimate'])\n *       .controller('AppCtrl', ['$scope', '$interval', function($scope, $interval) {\n *         $scope.number = 0;\n *         $interval(function() {\n *           $scope.number++;\n *         }, 1000);\n *\n *         var colors = ['red','blue','green','yellow','orange'];\n *         $scope.colorClass = function(number) {\n *           return colors[number % colors.length];\n *         };\n *       }]);\n *   </file>\n *  <file name=\"animations.css\">\n *  .container {\n *    height:250px;\n *    width:250px;\n *    position:relative;\n *    overflow:hidden;\n *    border:2px solid black;\n *  }\n *  .container .cell {\n *    font-size:150px;\n *    text-align:center;\n *    line-height:250px;\n *    position:absolute;\n *    top:0;\n *    left:0;\n *    right:0;\n *    border-bottom:2px solid black;\n *  }\n *  .swap-animation.ng-enter, .swap-animation.ng-leave {\n *    transition:0.5s linear all;\n *  }\n *  .swap-animation.ng-enter {\n *    top:-250px;\n *  }\n *  .swap-animation.ng-enter-active {\n *    top:0px;\n *  }\n *  .swap-animation.ng-leave {\n *    top:0px;\n *  }\n *  .swap-animation.ng-leave-active {\n *    top:250px;\n *  }\n *  .red { background:red; }\n *  .green { background:green; }\n *  .blue { background:blue; }\n *  .yellow { background:yellow; }\n *  .orange { background:orange; }\n *  </file>\n * </example>\n */\nvar ngAnimateSwapDirective = ['$animate', '$rootScope', function($animate, $rootScope) {\n  return {\n    restrict: 'A',\n    transclude: 'element',\n    terminal: true,\n    priority: 600, // we use 600 here to ensure that the directive is caught before others\n    link: function(scope, $element, attrs, ctrl, $transclude) {\n      var previousElement, previousScope;\n      scope.$watchCollection(attrs.ngAnimateSwap || attrs['for'], function(value) {\n        if (previousElement) {\n          $animate.leave(previousElement);\n        }\n        if (previousScope) {\n          previousScope.$destroy();\n          previousScope = null;\n        }\n        if (value || value === 0) {\n          previousScope = scope.$new();\n          $transclude(previousScope, function(element) {\n            previousElement = element;\n            $animate.enter(element, null, $element);\n          });\n        }\n      });\n    }\n  };\n}];\n\n/**\n * @ngdoc module\n * @name ngAnimate\n * @description\n *\n * The `ngAnimate` module provides support for CSS-based animations (keyframes and transitions) as well as JavaScript-based animations via\n * callback hooks. Animations are not enabled by default, however, by including `ngAnimate` the animation hooks are enabled for an Angular app.\n *\n * <div doc-module-components=\"ngAnimate\"></div>\n *\n * # Usage\n * Simply put, there are two ways to make use of animations when ngAnimate is used: by using **CSS** and **JavaScript**. The former works purely based\n * using CSS (by using matching CSS selectors/styles) and the latter triggers animations that are registered via `module.animation()`. For\n * both CSS and JS animations the sole requirement is to have a matching `CSS class` that exists both in the registered animation and within\n * the HTML element that the animation will be triggered on.\n *\n * ## Directive Support\n * The following directives are \"animation aware\":\n *\n * | Directive                                                                                                | Supported Animations                                                     |\n * |----------------------------------------------------------------------------------------------------------|--------------------------------------------------------------------------|\n * | {@link ng.directive:ngRepeat#animations ngRepeat}                                                        | enter, leave and move                                                    |\n * | {@link ngRoute.directive:ngView#animations ngView}                                                       | enter and leave                                                          |\n * | {@link ng.directive:ngInclude#animations ngInclude}                                                      | enter and leave                                                          |\n * | {@link ng.directive:ngSwitch#animations ngSwitch}                                                        | enter and leave                                                          |\n * | {@link ng.directive:ngIf#animations ngIf}                                                                | enter and leave                                                          |\n * | {@link ng.directive:ngClass#animations ngClass}                                                          | add and remove (the CSS class(es) present)                               |\n * | {@link ng.directive:ngShow#animations ngShow} & {@link ng.directive:ngHide#animations ngHide}            | add and remove (the ng-hide class value)                                 |\n * | {@link ng.directive:form#animation-hooks form} & {@link ng.directive:ngModel#animation-hooks ngModel}    | add and remove (dirty, pristine, valid, invalid & all other validations) |\n * | {@link module:ngMessages#animations ngMessages}                                                          | add and remove (ng-active & ng-inactive)                                 |\n * | {@link module:ngMessages#animations ngMessage}                                                           | enter and leave                                                          |\n *\n * (More information can be found by visiting each the documentation associated with each directive.)\n *\n * ## CSS-based Animations\n *\n * CSS-based animations with ngAnimate are unique since they require no JavaScript code at all. By using a CSS class that we reference between our HTML\n * and CSS code we can create an animation that will be picked up by Angular when an underlying directive performs an operation.\n *\n * The example below shows how an `enter` animation can be made possible on an element using `ng-if`:\n *\n * ```html\n * <div ng-if=\"bool\" class=\"fade\">\n *    Fade me in out\n * </div>\n * <button ng-click=\"bool=true\">Fade In!</button>\n * <button ng-click=\"bool=false\">Fade Out!</button>\n * ```\n *\n * Notice the CSS class **fade**? We can now create the CSS transition code that references this class:\n *\n * ```css\n * /&#42; The starting CSS styles for the enter animation &#42;/\n * .fade.ng-enter {\n *   transition:0.5s linear all;\n *   opacity:0;\n * }\n *\n * /&#42; The finishing CSS styles for the enter animation &#42;/\n * .fade.ng-enter.ng-enter-active {\n *   opacity:1;\n * }\n * ```\n *\n * The key thing to remember here is that, depending on the animation event (which each of the directives above trigger depending on what's going on) two\n * generated CSS classes will be applied to the element; in the example above we have `.ng-enter` and `.ng-enter-active`. For CSS transitions, the transition\n * code **must** be defined within the starting CSS class (in this case `.ng-enter`). The destination class is what the transition will animate towards.\n *\n * If for example we wanted to create animations for `leave` and `move` (ngRepeat triggers move) then we can do so using the same CSS naming conventions:\n *\n * ```css\n * /&#42; now the element will fade out before it is removed from the DOM &#42;/\n * .fade.ng-leave {\n *   transition:0.5s linear all;\n *   opacity:1;\n * }\n * .fade.ng-leave.ng-leave-active {\n *   opacity:0;\n * }\n * ```\n *\n * We can also make use of **CSS Keyframes** by referencing the keyframe animation within the starting CSS class:\n *\n * ```css\n * /&#42; there is no need to define anything inside of the destination\n * CSS class since the keyframe will take charge of the animation &#42;/\n * .fade.ng-leave {\n *   animation: my_fade_animation 0.5s linear;\n *   -webkit-animation: my_fade_animation 0.5s linear;\n * }\n *\n * @keyframes my_fade_animation {\n *   from { opacity:1; }\n *   to { opacity:0; }\n * }\n *\n * @-webkit-keyframes my_fade_animation {\n *   from { opacity:1; }\n *   to { opacity:0; }\n * }\n * ```\n *\n * Feel free also mix transitions and keyframes together as well as any other CSS classes on the same element.\n *\n * ### CSS Class-based Animations\n *\n * Class-based animations (animations that are triggered via `ngClass`, `ngShow`, `ngHide` and some other directives) have a slightly different\n * naming convention. Class-based animations are basic enough that a standard transition or keyframe can be referenced on the class being added\n * and removed.\n *\n * For example if we wanted to do a CSS animation for `ngHide` then we place an animation on the `.ng-hide` CSS class:\n *\n * ```html\n * <div ng-show=\"bool\" class=\"fade\">\n *   Show and hide me\n * </div>\n * <button ng-click=\"bool=!bool\">Toggle</button>\n *\n * <style>\n * .fade.ng-hide {\n *   transition:0.5s linear all;\n *   opacity:0;\n * }\n * </style>\n * ```\n *\n * All that is going on here with ngShow/ngHide behind the scenes is the `.ng-hide` class is added/removed (when the hidden state is valid). Since\n * ngShow and ngHide are animation aware then we can match up a transition and ngAnimate handles the rest.\n *\n * In addition the addition and removal of the CSS class, ngAnimate also provides two helper methods that we can use to further decorate the animation\n * with CSS styles.\n *\n * ```html\n * <div ng-class=\"{on:onOff}\" class=\"highlight\">\n *   Highlight this box\n * </div>\n * <button ng-click=\"onOff=!onOff\">Toggle</button>\n *\n * <style>\n * .highlight {\n *   transition:0.5s linear all;\n * }\n * .highlight.on-add {\n *   background:white;\n * }\n * .highlight.on {\n *   background:yellow;\n * }\n * .highlight.on-remove {\n *   background:black;\n * }\n * </style>\n * ```\n *\n * We can also make use of CSS keyframes by placing them within the CSS classes.\n *\n *\n * ### CSS Staggering Animations\n * A Staggering animation is a collection of animations that are issued with a slight delay in between each successive operation resulting in a\n * curtain-like effect. The ngAnimate module (versions >=1.2) supports staggering animations and the stagger effect can be\n * performed by creating a **ng-EVENT-stagger** CSS class and attaching that class to the base CSS class used for\n * the animation. The style property expected within the stagger class can either be a **transition-delay** or an\n * **animation-delay** property (or both if your animation contains both transitions and keyframe animations).\n *\n * ```css\n * .my-animation.ng-enter {\n *   /&#42; standard transition code &#42;/\n *   transition: 1s linear all;\n *   opacity:0;\n * }\n * .my-animation.ng-enter-stagger {\n *   /&#42; this will have a 100ms delay between each successive leave animation &#42;/\n *   transition-delay: 0.1s;\n *\n *   /&#42; As of 1.4.4, this must always be set: it signals ngAnimate\n *     to not accidentally inherit a delay property from another CSS class &#42;/\n *   transition-duration: 0s;\n *\n *   /&#42; if you are using animations instead of transitions you should configure as follows:\n *     animation-delay: 0.1s;\n *     animation-duration: 0s; &#42;/\n * }\n * .my-animation.ng-enter.ng-enter-active {\n *   /&#42; standard transition styles &#42;/\n *   opacity:1;\n * }\n * ```\n *\n * Staggering animations work by default in ngRepeat (so long as the CSS class is defined). Outside of ngRepeat, to use staggering animations\n * on your own, they can be triggered by firing multiple calls to the same event on $animate. However, the restrictions surrounding this\n * are that each of the elements must have the same CSS className value as well as the same parent element. A stagger operation\n * will also be reset if one or more animation frames have passed since the multiple calls to `$animate` were fired.\n *\n * The following code will issue the **ng-leave-stagger** event on the element provided:\n *\n * ```js\n * var kids = parent.children();\n *\n * $animate.leave(kids[0]); //stagger index=0\n * $animate.leave(kids[1]); //stagger index=1\n * $animate.leave(kids[2]); //stagger index=2\n * $animate.leave(kids[3]); //stagger index=3\n * $animate.leave(kids[4]); //stagger index=4\n *\n * window.requestAnimationFrame(function() {\n *   //stagger has reset itself\n *   $animate.leave(kids[5]); //stagger index=0\n *   $animate.leave(kids[6]); //stagger index=1\n *\n *   $scope.$digest();\n * });\n * ```\n *\n * Stagger animations are currently only supported within CSS-defined animations.\n *\n * ### The `ng-animate` CSS class\n *\n * When ngAnimate is animating an element it will apply the `ng-animate` CSS class to the element for the duration of the animation.\n * This is a temporary CSS class and it will be removed once the animation is over (for both JavaScript and CSS-based animations).\n *\n * Therefore, animations can be applied to an element using this temporary class directly via CSS.\n *\n * ```css\n * .zipper.ng-animate {\n *   transition:0.5s linear all;\n * }\n * .zipper.ng-enter {\n *   opacity:0;\n * }\n * .zipper.ng-enter.ng-enter-active {\n *   opacity:1;\n * }\n * .zipper.ng-leave {\n *   opacity:1;\n * }\n * .zipper.ng-leave.ng-leave-active {\n *   opacity:0;\n * }\n * ```\n *\n * (Note that the `ng-animate` CSS class is reserved and it cannot be applied on an element directly since ngAnimate will always remove\n * the CSS class once an animation has completed.)\n *\n *\n * ### The `ng-[event]-prepare` class\n *\n * This is a special class that can be used to prevent unwanted flickering / flash of content before\n * the actual animation starts. The class is added as soon as an animation is initialized, but removed\n * before the actual animation starts (after waiting for a $digest).\n * It is also only added for *structural* animations (`enter`, `move`, and `leave`).\n *\n * In practice, flickering can appear when nesting elements with structural animations such as `ngIf`\n * into elements that have class-based animations such as `ngClass`.\n *\n * ```html\n * <div ng-class=\"{red: myProp}\">\n *   <div ng-class=\"{blue: myProp}\">\n *     <div class=\"message\" ng-if=\"myProp\"></div>\n *   </div>\n * </div>\n * ```\n *\n * It is possible that during the `enter` animation, the `.message` div will be briefly visible before it starts animating.\n * In that case, you can add styles to the CSS that make sure the element stays hidden before the animation starts:\n *\n * ```css\n * .message.ng-enter-prepare {\n *   opacity: 0;\n * }\n *\n * ```\n *\n * ## JavaScript-based Animations\n *\n * ngAnimate also allows for animations to be consumed by JavaScript code. The approach is similar to CSS-based animations (where there is a shared\n * CSS class that is referenced in our HTML code) but in addition we need to register the JavaScript animation on the module. By making use of the\n * `module.animation()` module function we can register the animation.\n *\n * Let's see an example of a enter/leave animation using `ngRepeat`:\n *\n * ```html\n * <div ng-repeat=\"item in items\" class=\"slide\">\n *   {{ item }}\n * </div>\n * ```\n *\n * See the **slide** CSS class? Let's use that class to define an animation that we'll structure in our module code by using `module.animation`:\n *\n * ```js\n * myModule.animation('.slide', [function() {\n *   return {\n *     // make note that other events (like addClass/removeClass)\n *     // have different function input parameters\n *     enter: function(element, doneFn) {\n *       jQuery(element).fadeIn(1000, doneFn);\n *\n *       // remember to call doneFn so that angular\n *       // knows that the animation has concluded\n *     },\n *\n *     move: function(element, doneFn) {\n *       jQuery(element).fadeIn(1000, doneFn);\n *     },\n *\n *     leave: function(element, doneFn) {\n *       jQuery(element).fadeOut(1000, doneFn);\n *     }\n *   }\n * }]);\n * ```\n *\n * The nice thing about JS-based animations is that we can inject other services and make use of advanced animation libraries such as\n * greensock.js and velocity.js.\n *\n * If our animation code class-based (meaning that something like `ngClass`, `ngHide` and `ngShow` triggers it) then we can still define\n * our animations inside of the same registered animation, however, the function input arguments are a bit different:\n *\n * ```html\n * <div ng-class=\"color\" class=\"colorful\">\n *   this box is moody\n * </div>\n * <button ng-click=\"color='red'\">Change to red</button>\n * <button ng-click=\"color='blue'\">Change to blue</button>\n * <button ng-click=\"color='green'\">Change to green</button>\n * ```\n *\n * ```js\n * myModule.animation('.colorful', [function() {\n *   return {\n *     addClass: function(element, className, doneFn) {\n *       // do some cool animation and call the doneFn\n *     },\n *     removeClass: function(element, className, doneFn) {\n *       // do some cool animation and call the doneFn\n *     },\n *     setClass: function(element, addedClass, removedClass, doneFn) {\n *       // do some cool animation and call the doneFn\n *     }\n *   }\n * }]);\n * ```\n *\n * ## CSS + JS Animations Together\n *\n * AngularJS 1.4 and higher has taken steps to make the amalgamation of CSS and JS animations more flexible. However, unlike earlier versions of Angular,\n * defining CSS and JS animations to work off of the same CSS class will not work anymore. Therefore the example below will only result in **JS animations taking\n * charge of the animation**:\n *\n * ```html\n * <div ng-if=\"bool\" class=\"slide\">\n *   Slide in and out\n * </div>\n * ```\n *\n * ```js\n * myModule.animation('.slide', [function() {\n *   return {\n *     enter: function(element, doneFn) {\n *       jQuery(element).slideIn(1000, doneFn);\n *     }\n *   }\n * }]);\n * ```\n *\n * ```css\n * .slide.ng-enter {\n *   transition:0.5s linear all;\n *   transform:translateY(-100px);\n * }\n * .slide.ng-enter.ng-enter-active {\n *   transform:translateY(0);\n * }\n * ```\n *\n * Does this mean that CSS and JS animations cannot be used together? Do JS-based animations always have higher priority? We can make up for the\n * lack of CSS animations by using the `$animateCss` service to trigger our own tweaked-out, CSS-based animations directly from\n * our own JS-based animation code:\n *\n * ```js\n * myModule.animation('.slide', ['$animateCss', function($animateCss) {\n *   return {\n *     enter: function(element) {\n*        // this will trigger `.slide.ng-enter` and `.slide.ng-enter-active`.\n *       return $animateCss(element, {\n *         event: 'enter',\n *         structural: true\n *       });\n *     }\n *   }\n * }]);\n * ```\n *\n * The nice thing here is that we can save bandwidth by sticking to our CSS-based animation code and we don't need to rely on a 3rd-party animation framework.\n *\n * The `$animateCss` service is very powerful since we can feed in all kinds of extra properties that will be evaluated and fed into a CSS transition or\n * keyframe animation. For example if we wanted to animate the height of an element while adding and removing classes then we can do so by providing that\n * data into `$animateCss` directly:\n *\n * ```js\n * myModule.animation('.slide', ['$animateCss', function($animateCss) {\n *   return {\n *     enter: function(element) {\n *       return $animateCss(element, {\n *         event: 'enter',\n *         structural: true,\n *         addClass: 'maroon-setting',\n *         from: { height:0 },\n *         to: { height: 200 }\n *       });\n *     }\n *   }\n * }]);\n * ```\n *\n * Now we can fill in the rest via our transition CSS code:\n *\n * ```css\n * /&#42; the transition tells ngAnimate to make the animation happen &#42;/\n * .slide.ng-enter { transition:0.5s linear all; }\n *\n * /&#42; this extra CSS class will be absorbed into the transition\n * since the $animateCss code is adding the class &#42;/\n * .maroon-setting { background:red; }\n * ```\n *\n * And `$animateCss` will figure out the rest. Just make sure to have the `done()` callback fire the `doneFn` function to signal when the animation is over.\n *\n * To learn more about what's possible be sure to visit the {@link ngAnimate.$animateCss $animateCss service}.\n *\n * ## Animation Anchoring (via `ng-animate-ref`)\n *\n * ngAnimate in AngularJS 1.4 comes packed with the ability to cross-animate elements between\n * structural areas of an application (like views) by pairing up elements using an attribute\n * called `ng-animate-ref`.\n *\n * Let's say for example we have two views that are managed by `ng-view` and we want to show\n * that there is a relationship between two components situated in within these views. By using the\n * `ng-animate-ref` attribute we can identify that the two components are paired together and we\n * can then attach an animation, which is triggered when the view changes.\n *\n * Say for example we have the following template code:\n *\n * ```html\n * <!-- index.ced81ed4.html -->\n * <div ng-view class=\"view-animation\">\n * </div>\n *\n * <!-- home.html -->\n * <a href=\"#/banner-page\">\n *   <img src=\"./banner.jpg\" class=\"banner\" ng-animate-ref=\"banner\">\n * </a>\n *\n * <!-- banner-page.html -->\n * <img src=\"./banner.jpg\" class=\"banner\" ng-animate-ref=\"banner\">\n * ```\n *\n * Now, when the view changes (once the link is clicked), ngAnimate will examine the\n * HTML contents to see if there is a match reference between any components in the view\n * that is leaving and the view that is entering. It will scan both the view which is being\n * removed (leave) and inserted (enter) to see if there are any paired DOM elements that\n * contain a matching ref value.\n *\n * The two images match since they share the same ref value. ngAnimate will now create a\n * transport element (which is a clone of the first image element) and it will then attempt\n * to animate to the position of the second image element in the next view. For the animation to\n * work a special CSS class called `ng-anchor` will be added to the transported element.\n *\n * We can now attach a transition onto the `.banner.ng-anchor` CSS class and then\n * ngAnimate will handle the entire transition for us as well as the addition and removal of\n * any changes of CSS classes between the elements:\n *\n * ```css\n * .banner.ng-anchor {\n *   /&#42; this animation will last for 1 second since there are\n *          two phases to the animation (an `in` and an `out` phase) &#42;/\n *   transition:0.5s linear all;\n * }\n * ```\n *\n * We also **must** include animations for the views that are being entered and removed\n * (otherwise anchoring wouldn't be possible since the new view would be inserted right away).\n *\n * ```css\n * .view-animation.ng-enter, .view-animation.ng-leave {\n *   transition:0.5s linear all;\n *   position:fixed;\n *   left:0;\n *   top:0;\n *   width:100%;\n * }\n * .view-animation.ng-enter {\n *   transform:translateX(100%);\n * }\n * .view-animation.ng-leave,\n * .view-animation.ng-enter.ng-enter-active {\n *   transform:translateX(0%);\n * }\n * .view-animation.ng-leave.ng-leave-active {\n *   transform:translateX(-100%);\n * }\n * ```\n *\n * Now we can jump back to the anchor animation. When the animation happens, there are two stages that occur:\n * an `out` and an `in` stage. The `out` stage happens first and that is when the element is animated away\n * from its origin. Once that animation is over then the `in` stage occurs which animates the\n * element to its destination. The reason why there are two animations is to give enough time\n * for the enter animation on the new element to be ready.\n *\n * The example above sets up a transition for both the in and out phases, but we can also target the out or\n * in phases directly via `ng-anchor-out` and `ng-anchor-in`.\n *\n * ```css\n * .banner.ng-anchor-out {\n *   transition: 0.5s linear all;\n *\n *   /&#42; the scale will be applied during the out animation,\n *          but will be animated away when the in animation runs &#42;/\n *   transform: scale(1.2);\n * }\n *\n * .banner.ng-anchor-in {\n *   transition: 1s linear all;\n * }\n * ```\n *\n *\n *\n *\n * ### Anchoring Demo\n *\n  <example module=\"anchoringExample\"\n           name=\"anchoringExample\"\n           id=\"anchoringExample\"\n           deps=\"angular-animate.js;angular-route.js\"\n           animations=\"true\">\n    <file name=\"index.ced81ed4.html\">\n      <a href=\"#!/\">Home</a>\n      <hr />\n      <div class=\"view-container\">\n        <div ng-view class=\"view\"></div>\n      </div>\n    </file>\n    <file name=\"script.js\">\n      angular.module('anchoringExample', ['ngAnimate', 'ngRoute'])\n        .config(['$routeProvider', function($routeProvider) {\n          $routeProvider.when('/', {\n            templateUrl: 'home.html',\n            controller: 'HomeController as home'\n          });\n          $routeProvider.when('/profile/:id', {\n            templateUrl: 'profile.html',\n            controller: 'ProfileController as profile'\n          });\n        }])\n        .run(['$rootScope', function($rootScope) {\n          $rootScope.records = [\n            { id: 1, title: 'Miss Beulah Roob' },\n            { id: 2, title: 'Trent Morissette' },\n            { id: 3, title: 'Miss Ava Pouros' },\n            { id: 4, title: 'Rod Pouros' },\n            { id: 5, title: 'Abdul Rice' },\n            { id: 6, title: 'Laurie Rutherford Sr.' },\n            { id: 7, title: 'Nakia McLaughlin' },\n            { id: 8, title: 'Jordon Blanda DVM' },\n            { id: 9, title: 'Rhoda Hand' },\n            { id: 10, title: 'Alexandrea Sauer' }\n          ];\n        }])\n        .controller('HomeController', [function() {\n          //empty\n        }])\n        .controller('ProfileController', ['$rootScope', '$routeParams',\n            function ProfileController($rootScope, $routeParams) {\n          var index = parseInt($routeParams.id, 10);\n          var record = $rootScope.records[index - 1];\n\n          this.title = record.title;\n          this.id = record.id;\n        }]);\n    </file>\n    <file name=\"home.html\">\n      <h2>Welcome to the home page</h1>\n      <p>Please click on an element</p>\n      <a class=\"record\"\n         ng-href=\"#!/profile/{{ record.id }}\"\n         ng-animate-ref=\"{{ record.id }}\"\n         ng-repeat=\"record in records\">\n        {{ record.title }}\n      </a>\n    </file>\n    <file name=\"profile.html\">\n      <div class=\"profile record\" ng-animate-ref=\"{{ profile.id }}\">\n        {{ profile.title }}\n      </div>\n    </file>\n    <file name=\"animations.css\">\n      .record {\n        display:block;\n        font-size:20px;\n      }\n      .profile {\n        background:black;\n        color:white;\n        font-size:100px;\n      }\n      .view-container {\n        position:relative;\n      }\n      .view-container > .view.ng-animate {\n        position:absolute;\n        top:0;\n        left:0;\n        width:100%;\n        min-height:500px;\n      }\n      .view.ng-enter, .view.ng-leave,\n      .record.ng-anchor {\n        transition:0.5s linear all;\n      }\n      .view.ng-enter {\n        transform:translateX(100%);\n      }\n      .view.ng-enter.ng-enter-active, .view.ng-leave {\n        transform:translateX(0%);\n      }\n      .view.ng-leave.ng-leave-active {\n        transform:translateX(-100%);\n      }\n      .record.ng-anchor-out {\n        background:red;\n      }\n    </file>\n  </example>\n *\n * ### How is the element transported?\n *\n * When an anchor animation occurs, ngAnimate will clone the starting element and position it exactly where the starting\n * element is located on screen via absolute positioning. The cloned element will be placed inside of the root element\n * of the application (where ng-app was defined) and all of the CSS classes of the starting element will be applied. The\n * element will then animate into the `out` and `in` animations and will eventually reach the coordinates and match\n * the dimensions of the destination element. During the entire animation a CSS class of `.ng-animate-shim` will be applied\n * to both the starting and destination elements in order to hide them from being visible (the CSS styling for the class\n * is: `visibility:hidden`). Once the anchor reaches its destination then it will be removed and the destination element\n * will become visible since the shim class will be removed.\n *\n * ### How is the morphing handled?\n *\n * CSS Anchoring relies on transitions and keyframes and the internal code is intelligent enough to figure out\n * what CSS classes differ between the starting element and the destination element. These different CSS classes\n * will be added/removed on the anchor element and a transition will be applied (the transition that is provided\n * in the anchor class). Long story short, ngAnimate will figure out what classes to add and remove which will\n * make the transition of the element as smooth and automatic as possible. Be sure to use simple CSS classes that\n * do not rely on DOM nesting structure so that the anchor element appears the same as the starting element (since\n * the cloned element is placed inside of root element which is likely close to the body element).\n *\n * Note that if the root element is on the `<html>` element then the cloned node will be placed inside of body.\n *\n *\n * ## Using $animate in your directive code\n *\n * So far we've explored how to feed in animations into an Angular application, but how do we trigger animations within our own directives in our application?\n * By injecting the `$animate` service into our directive code, we can trigger structural and class-based hooks which can then be consumed by animations. Let's\n * imagine we have a greeting box that shows and hides itself when the data changes\n *\n * ```html\n * <greeting-box active=\"onOrOff\">Hi there</greeting-box>\n * ```\n *\n * ```js\n * ngModule.directive('greetingBox', ['$animate', function($animate) {\n *   return function(scope, element, attrs) {\n *     attrs.$observe('active', function(value) {\n *       value ? $animate.addClass(element, 'on') : $animate.removeClass(element, 'on');\n *     });\n *   });\n * }]);\n * ```\n *\n * Now the `on` CSS class is added and removed on the greeting box component. Now if we add a CSS class on top of the greeting box element\n * in our HTML code then we can trigger a CSS or JS animation to happen.\n *\n * ```css\n * /&#42; normally we would create a CSS class to reference on the element &#42;/\n * greeting-box.on { transition:0.5s linear all; background:green; color:white; }\n * ```\n *\n * The `$animate` service contains a variety of other methods like `enter`, `leave`, `animate` and `setClass`. To learn more about what's\n * possible be sure to visit the {@link ng.$animate $animate service API page}.\n *\n *\n * ## Callbacks and Promises\n *\n * When `$animate` is called it returns a promise that can be used to capture when the animation has ended. Therefore if we were to trigger\n * an animation (within our directive code) then we can continue performing directive and scope related activities after the animation has\n * ended by chaining onto the returned promise that animation method returns.\n *\n * ```js\n * // somewhere within the depths of the directive\n * $animate.enter(element, parent).then(function() {\n *   //the animation has completed\n * });\n * ```\n *\n * (Note that earlier versions of Angular prior to v1.4 required the promise code to be wrapped using `$scope.$apply(...)`. This is not the case\n * anymore.)\n *\n * In addition to the animation promise, we can also make use of animation-related callbacks within our directives and controller code by registering\n * an event listener using the `$animate` service. Let's say for example that an animation was triggered on our view\n * routing controller to hook into that:\n *\n * ```js\n * ngModule.controller('HomePageController', ['$animate', function($animate) {\n *   $animate.on('enter', ngViewElement, function(element) {\n *     // the animation for this route has completed\n *   }]);\n * }])\n * ```\n *\n * (Note that you will need to trigger a digest within the callback to get angular to notice any scope-related changes.)\n */\n\nvar copy;\nvar extend;\nvar forEach;\nvar isArray;\nvar isDefined;\nvar isElement;\nvar isFunction;\nvar isObject;\nvar isString;\nvar isUndefined;\nvar jqLite;\nvar noop;\n\n/**\n * @ngdoc service\n * @name $animate\n * @kind object\n *\n * @description\n * The ngAnimate `$animate` service documentation is the same for the core `$animate` service.\n *\n * Click here {@link ng.$animate to learn more about animations with `$animate`}.\n */\nangular.module('ngAnimate', [], function initAngularHelpers() {\n  // Access helpers from angular core.\n  // Do it inside a `config` block to ensure `window.angular` is available.\n  noop        = angular.noop;\n  copy        = angular.copy;\n  extend      = angular.extend;\n  jqLite      = angular.element;\n  forEach     = angular.forEach;\n  isArray     = angular.isArray;\n  isString    = angular.isString;\n  isObject    = angular.isObject;\n  isUndefined = angular.isUndefined;\n  isDefined   = angular.isDefined;\n  isFunction  = angular.isFunction;\n  isElement   = angular.isElement;\n})\n  .info({ angularVersion: '1.6.4' })\n  .directive('ngAnimateSwap', ngAnimateSwapDirective)\n\n  .directive('ngAnimateChildren', $$AnimateChildrenDirective)\n  .factory('$$rAFScheduler', $$rAFSchedulerFactory)\n\n  .provider('$$animateQueue', $$AnimateQueueProvider)\n  .provider('$$animation', $$AnimationProvider)\n\n  .provider('$animateCss', $AnimateCssProvider)\n  .provider('$$animateCssDriver', $$AnimateCssDriverProvider)\n\n  .provider('$$animateJs', $$AnimateJsProvider)\n  .provider('$$animateJsDriver', $$AnimateJsDriverProvider);\n\n\n})(window, window.angular);\n\n/**\n * @license AngularJS v1.6.4\n * (c) 2010-2017 Google, Inc. http://angularjs.org\n * License: MIT\n */\n(function(window, angular) {'use strict';\n\n/**\n * @ngdoc module\n * @name ngAria\n * @description\n *\n * The `ngAria` module provides support for common\n * [<abbr title=\"Accessible Rich Internet Applications\">ARIA</abbr>](http://www.w3.org/TR/wai-aria/)\n * attributes that convey state or semantic information about the application for users\n * of assistive technologies, such as screen readers.\n *\n * <div doc-module-components=\"ngAria\"></div>\n *\n * ## Usage\n *\n * For ngAria to do its magic, simply include the module `ngAria` as a dependency. The following\n * directives are supported:\n * `ngModel`, `ngChecked`, `ngReadonly`, `ngRequired`, `ngValue`, `ngDisabled`, `ngShow`, `ngHide`, `ngClick`,\n * `ngDblClick`, and `ngMessages`.\n *\n * Below is a more detailed breakdown of the attributes handled by ngAria:\n *\n * | Directive                                   | Supported Attributes                                                                                |\n * |---------------------------------------------|-----------------------------------------------------------------------------------------------------|\n * | {@link ng.directive:ngModel ngModel}        | aria-checked, aria-valuemin, aria-valuemax, aria-valuenow, aria-invalid, aria-required, input roles |\n * | {@link ng.directive:ngDisabled ngDisabled}  | aria-disabled                                                                                       |\n * | {@link ng.directive:ngRequired ngRequired}  | aria-required                                                                                       |\n * | {@link ng.directive:ngChecked ngChecked}    | aria-checked                                                                                        |\n * | {@link ng.directive:ngReadonly ngReadonly}  | aria-readonly                                                                                       |\n * | {@link ng.directive:ngValue ngValue}        | aria-checked                                                                                        |\n * | {@link ng.directive:ngShow ngShow}          | aria-hidden                                                                                         |\n * | {@link ng.directive:ngHide ngHide}          | aria-hidden                                                                                         |\n * | {@link ng.directive:ngDblclick ngDblclick}  | tabindex                                                                                            |\n * | {@link module:ngMessages ngMessages}        | aria-live                                                                                           |\n * | {@link ng.directive:ngClick ngClick}        | tabindex, keydown event, button role                                                                |\n *\n * Find out more information about each directive by reading the\n * {@link guide/accessibility ngAria Developer Guide}.\n *\n * ## Example\n * Using ngDisabled with ngAria:\n * ```html\n * <md-checkbox ng-disabled=\"disabled\">\n * ```\n * Becomes:\n * ```html\n * <md-checkbox ng-disabled=\"disabled\" aria-disabled=\"true\">\n * ```\n *\n * ## Disabling Attributes\n * It's possible to disable individual attributes added by ngAria with the\n * {@link ngAria.$ariaProvider#config config} method. For more details, see the\n * {@link guide/accessibility Developer Guide}.\n */\nvar ngAriaModule = angular.module('ngAria', ['ng']).\n                        info({ angularVersion: '1.6.4' }).\n                        provider('$aria', $AriaProvider);\n\n/**\n* Internal Utilities\n*/\nvar nodeBlackList = ['BUTTON', 'A', 'INPUT', 'TEXTAREA', 'SELECT', 'DETAILS', 'SUMMARY'];\n\nvar isNodeOneOf = function(elem, nodeTypeArray) {\n  if (nodeTypeArray.indexOf(elem[0].nodeName) !== -1) {\n    return true;\n  }\n};\n/**\n * @ngdoc provider\n * @name $ariaProvider\n * @this\n *\n * @description\n *\n * Used for configuring the ARIA attributes injected and managed by ngAria.\n *\n * ```js\n * angular.module('myApp', ['ngAria'], function config($ariaProvider) {\n *   $ariaProvider.config({\n *     ariaValue: true,\n *     tabindex: false\n *   });\n * });\n *```\n *\n * ## Dependencies\n * Requires the {@link ngAria} module to be installed.\n *\n */\nfunction $AriaProvider() {\n  var config = {\n    ariaHidden: true,\n    ariaChecked: true,\n    ariaReadonly: true,\n    ariaDisabled: true,\n    ariaRequired: true,\n    ariaInvalid: true,\n    ariaValue: true,\n    tabindex: true,\n    bindKeydown: true,\n    bindRoleForClick: true\n  };\n\n  /**\n   * @ngdoc method\n   * @name $ariaProvider#config\n   *\n   * @param {object} config object to enable/disable specific ARIA attributes\n   *\n   *  - **ariaHidden** – `{boolean}` – Enables/disables aria-hidden tags\n   *  - **ariaChecked** – `{boolean}` – Enables/disables aria-checked tags\n   *  - **ariaReadonly** – `{boolean}` – Enables/disables aria-readonly tags\n   *  - **ariaDisabled** – `{boolean}` – Enables/disables aria-disabled tags\n   *  - **ariaRequired** – `{boolean}` – Enables/disables aria-required tags\n   *  - **ariaInvalid** – `{boolean}` – Enables/disables aria-invalid tags\n   *  - **ariaValue** – `{boolean}` – Enables/disables aria-valuemin, aria-valuemax and\n   *    aria-valuenow tags\n   *  - **tabindex** – `{boolean}` – Enables/disables tabindex tags\n   *  - **bindKeydown** – `{boolean}` – Enables/disables keyboard event binding on non-interactive\n   *    elements (such as `div` or `li`) using ng-click, making them more accessible to users of\n   *    assistive technologies\n   *  - **bindRoleForClick** – `{boolean}` – Adds role=button to non-interactive elements (such as\n   *    `div` or `li`) using ng-click, making them more accessible to users of assistive\n   *    technologies\n   *\n   * @description\n   * Enables/disables various ARIA attributes\n   */\n  this.config = function(newConfig) {\n    config = angular.extend(config, newConfig);\n  };\n\n  function watchExpr(attrName, ariaAttr, nodeBlackList, negate) {\n    return function(scope, elem, attr) {\n      var ariaCamelName = attr.$normalize(ariaAttr);\n      if (config[ariaCamelName] && !isNodeOneOf(elem, nodeBlackList) && !attr[ariaCamelName]) {\n        scope.$watch(attr[attrName], function(boolVal) {\n          // ensure boolean value\n          boolVal = negate ? !boolVal : !!boolVal;\n          elem.attr(ariaAttr, boolVal);\n        });\n      }\n    };\n  }\n  /**\n   * @ngdoc service\n   * @name $aria\n   *\n   * @description\n   * @priority 200\n   *\n   * The $aria service contains helper methods for applying common\n   * [ARIA](http://www.w3.org/TR/wai-aria/) attributes to HTML directives.\n   *\n   * ngAria injects common accessibility attributes that tell assistive technologies when HTML\n   * elements are enabled, selected, hidden, and more. To see how this is performed with ngAria,\n   * let's review a code snippet from ngAria itself:\n   *\n   *```js\n   * ngAriaModule.directive('ngDisabled', ['$aria', function($aria) {\n   *   return $aria.$$watchExpr('ngDisabled', 'aria-disabled', nodeBlackList, false);\n   * }])\n   *```\n   * Shown above, the ngAria module creates a directive with the same signature as the\n   * traditional `ng-disabled` directive. But this ngAria version is dedicated to\n   * solely managing accessibility attributes on custom elements. The internal `$aria` service is\n   * used to watch the boolean attribute `ngDisabled`. If it has not been explicitly set by the\n   * developer, `aria-disabled` is injected as an attribute with its value synchronized to the\n   * value in `ngDisabled`.\n   *\n   * Because ngAria hooks into the `ng-disabled` directive, developers do not have to do\n   * anything to enable this feature. The `aria-disabled` attribute is automatically managed\n   * simply as a silent side-effect of using `ng-disabled` with the ngAria module.\n   *\n   * The full list of directives that interface with ngAria:\n   * * **ngModel**\n   * * **ngChecked**\n   * * **ngReadonly**\n   * * **ngRequired**\n   * * **ngDisabled**\n   * * **ngValue**\n   * * **ngShow**\n   * * **ngHide**\n   * * **ngClick**\n   * * **ngDblclick**\n   * * **ngMessages**\n   *\n   * Read the {@link guide/accessibility ngAria Developer Guide} for a thorough explanation of each\n   * directive.\n   *\n   *\n   * ## Dependencies\n   * Requires the {@link ngAria} module to be installed.\n   */\n  this.$get = function() {\n    return {\n      config: function(key) {\n        return config[key];\n      },\n      $$watchExpr: watchExpr\n    };\n  };\n}\n\n\nngAriaModule.directive('ngShow', ['$aria', function($aria) {\n  return $aria.$$watchExpr('ngShow', 'aria-hidden', [], true);\n}])\n.directive('ngHide', ['$aria', function($aria) {\n  return $aria.$$watchExpr('ngHide', 'aria-hidden', [], false);\n}])\n.directive('ngValue', ['$aria', function($aria) {\n  return $aria.$$watchExpr('ngValue', 'aria-checked', nodeBlackList, false);\n}])\n.directive('ngChecked', ['$aria', function($aria) {\n  return $aria.$$watchExpr('ngChecked', 'aria-checked', nodeBlackList, false);\n}])\n.directive('ngReadonly', ['$aria', function($aria) {\n  return $aria.$$watchExpr('ngReadonly', 'aria-readonly', nodeBlackList, false);\n}])\n.directive('ngRequired', ['$aria', function($aria) {\n  return $aria.$$watchExpr('ngRequired', 'aria-required', nodeBlackList, false);\n}])\n.directive('ngModel', ['$aria', function($aria) {\n\n  function shouldAttachAttr(attr, normalizedAttr, elem, allowBlacklistEls) {\n    return $aria.config(normalizedAttr) && !elem.attr(attr) && (allowBlacklistEls || !isNodeOneOf(elem, nodeBlackList));\n  }\n\n  function shouldAttachRole(role, elem) {\n    // if element does not have role attribute\n    // AND element type is equal to role (if custom element has a type equaling shape) <-- remove?\n    // AND element is not in nodeBlackList\n    return !elem.attr('role') && (elem.attr('type') === role) && !isNodeOneOf(elem, nodeBlackList);\n  }\n\n  function getShape(attr, elem) {\n    var type = attr.type,\n        role = attr.role;\n\n    return ((type || role) === 'checkbox' || role === 'menuitemcheckbox') ? 'checkbox' :\n           ((type || role) === 'radio'    || role === 'menuitemradio') ? 'radio' :\n           (type === 'range'              || role === 'progressbar' || role === 'slider') ? 'range' : '';\n  }\n\n  return {\n    restrict: 'A',\n    require: 'ngModel',\n    priority: 200, //Make sure watches are fired after any other directives that affect the ngModel value\n    compile: function(elem, attr) {\n      var shape = getShape(attr, elem);\n\n      return {\n        post: function(scope, elem, attr, ngModel) {\n          var needsTabIndex = shouldAttachAttr('tabindex', 'tabindex', elem, false);\n\n          function ngAriaWatchModelValue() {\n            return ngModel.$modelValue;\n          }\n\n          function getRadioReaction(newVal) {\n            // Strict comparison would cause a BC\n            // eslint-disable-next-line eqeqeq\n            var boolVal = (attr.value == ngModel.$viewValue);\n            elem.attr('aria-checked', boolVal);\n          }\n\n          function getCheckboxReaction() {\n            elem.attr('aria-checked', !ngModel.$isEmpty(ngModel.$viewValue));\n          }\n\n          switch (shape) {\n            case 'radio':\n            case 'checkbox':\n              if (shouldAttachRole(shape, elem)) {\n                elem.attr('role', shape);\n              }\n              if (shouldAttachAttr('aria-checked', 'ariaChecked', elem, false)) {\n                scope.$watch(ngAriaWatchModelValue, shape === 'radio' ?\n                    getRadioReaction : getCheckboxReaction);\n              }\n              if (needsTabIndex) {\n                elem.attr('tabindex', 0);\n              }\n              break;\n            case 'range':\n              if (shouldAttachRole(shape, elem)) {\n                elem.attr('role', 'slider');\n              }\n              if ($aria.config('ariaValue')) {\n                var needsAriaValuemin = !elem.attr('aria-valuemin') &&\n                    (attr.hasOwnProperty('min') || attr.hasOwnProperty('ngMin'));\n                var needsAriaValuemax = !elem.attr('aria-valuemax') &&\n                    (attr.hasOwnProperty('max') || attr.hasOwnProperty('ngMax'));\n                var needsAriaValuenow = !elem.attr('aria-valuenow');\n\n                if (needsAriaValuemin) {\n                  attr.$observe('min', function ngAriaValueMinReaction(newVal) {\n                    elem.attr('aria-valuemin', newVal);\n                  });\n                }\n                if (needsAriaValuemax) {\n                  attr.$observe('max', function ngAriaValueMinReaction(newVal) {\n                    elem.attr('aria-valuemax', newVal);\n                  });\n                }\n                if (needsAriaValuenow) {\n                  scope.$watch(ngAriaWatchModelValue, function ngAriaValueNowReaction(newVal) {\n                    elem.attr('aria-valuenow', newVal);\n                  });\n                }\n              }\n              if (needsTabIndex) {\n                elem.attr('tabindex', 0);\n              }\n              break;\n          }\n\n          if (!attr.hasOwnProperty('ngRequired') && ngModel.$validators.required\n            && shouldAttachAttr('aria-required', 'ariaRequired', elem, false)) {\n            // ngModel.$error.required is undefined on custom controls\n            attr.$observe('required', function() {\n              elem.attr('aria-required', !!attr['required']);\n            });\n          }\n\n          if (shouldAttachAttr('aria-invalid', 'ariaInvalid', elem, true)) {\n            scope.$watch(function ngAriaInvalidWatch() {\n              return ngModel.$invalid;\n            }, function ngAriaInvalidReaction(newVal) {\n              elem.attr('aria-invalid', !!newVal);\n            });\n          }\n        }\n      };\n    }\n  };\n}])\n.directive('ngDisabled', ['$aria', function($aria) {\n  return $aria.$$watchExpr('ngDisabled', 'aria-disabled', nodeBlackList, false);\n}])\n.directive('ngMessages', function() {\n  return {\n    restrict: 'A',\n    require: '?ngMessages',\n    link: function(scope, elem, attr, ngMessages) {\n      if (!elem.attr('aria-live')) {\n        elem.attr('aria-live', 'assertive');\n      }\n    }\n  };\n})\n.directive('ngClick',['$aria', '$parse', function($aria, $parse) {\n  return {\n    restrict: 'A',\n    compile: function(elem, attr) {\n      var fn = $parse(attr.ngClick);\n      return function(scope, elem, attr) {\n\n        if (!isNodeOneOf(elem, nodeBlackList)) {\n\n          if ($aria.config('bindRoleForClick') && !elem.attr('role')) {\n            elem.attr('role', 'button');\n          }\n\n          if ($aria.config('tabindex') && !elem.attr('tabindex')) {\n            elem.attr('tabindex', 0);\n          }\n\n          if ($aria.config('bindKeydown') && !attr.ngKeydown && !attr.ngKeypress && !attr.ngKeyup) {\n            elem.on('keydown', function(event) {\n              var keyCode = event.which || event.keyCode;\n              if (keyCode === 32 || keyCode === 13) {\n                scope.$apply(callback);\n              }\n\n              function callback() {\n                fn(scope, { $event: event });\n              }\n            });\n          }\n        }\n      };\n    }\n  };\n}])\n.directive('ngDblclick', ['$aria', function($aria) {\n  return function(scope, elem, attr) {\n    if ($aria.config('tabindex') && !elem.attr('tabindex') && !isNodeOneOf(elem, nodeBlackList)) {\n      elem.attr('tabindex', 0);\n    }\n  };\n}]);\n\n\n})(window, window.angular);\n\n/**\n * @license AngularJS v1.6.4\n * (c) 2010-2017 Google, Inc. http://angularjs.org\n * License: MIT\n */\n(function(window, angular) {'use strict';\n\n/**\n * @ngdoc module\n * @name ngCookies\n * @description\n *\n * # ngCookies\n *\n * The `ngCookies` module provides a convenient wrapper for reading and writing browser cookies.\n *\n *\n * <div doc-module-components=\"ngCookies\"></div>\n *\n * See {@link ngCookies.$cookies `$cookies`} for usage.\n */\n\n\nangular.module('ngCookies', ['ng']).\n  info({ angularVersion: '1.6.4' }).\n  /**\n   * @ngdoc provider\n   * @name $cookiesProvider\n   * @description\n   * Use `$cookiesProvider` to change the default behavior of the {@link ngCookies.$cookies $cookies} service.\n   * */\n   provider('$cookies', [/** @this */function $CookiesProvider() {\n    /**\n     * @ngdoc property\n     * @name $cookiesProvider#defaults\n     * @description\n     *\n     * Object containing default options to pass when setting cookies.\n     *\n     * The object may have following properties:\n     *\n     * - **path** - `{string}` - The cookie will be available only for this path and its\n     *   sub-paths. By default, this is the URL that appears in your `<base>` tag.\n     * - **domain** - `{string}` - The cookie will be available only for this domain and\n     *   its sub-domains. For security reasons the user agent will not accept the cookie\n     *   if the current domain is not a sub-domain of this domain or equal to it.\n     * - **expires** - `{string|Date}` - String of the form \"Wdy, DD Mon YYYY HH:MM:SS GMT\"\n     *   or a Date object indicating the exact date/time this cookie will expire.\n     * - **secure** - `{boolean}` - If `true`, then the cookie will only be available through a\n     *   secured connection.\n     *\n     * Note: By default, the address that appears in your `<base>` tag will be used as the path.\n     * This is important so that cookies will be visible for all routes when html5mode is enabled.\n     *\n     * @example\n     *\n     * ```js\n     * angular.module('cookiesProviderExample', ['ngCookies'])\n     *   .config(['$cookiesProvider', function($cookiesProvider) {\n     *     // Setting default options\n     *     $cookiesProvider.defaults.domain = 'foo.com';\n     *     $cookiesProvider.defaults.secure = true;\n     *   }]);\n     * ```\n     **/\n    var defaults = this.defaults = {};\n\n    function calcOptions(options) {\n      return options ? angular.extend({}, defaults, options) : defaults;\n    }\n\n    /**\n     * @ngdoc service\n     * @name $cookies\n     *\n     * @description\n     * Provides read/write access to browser's cookies.\n     *\n     * <div class=\"alert alert-info\">\n     * Up until Angular 1.3, `$cookies` exposed properties that represented the\n     * current browser cookie values. In version 1.4, this behavior has changed, and\n     * `$cookies` now provides a standard api of getters, setters etc.\n     * </div>\n     *\n     * Requires the {@link ngCookies `ngCookies`} module to be installed.\n     *\n     * @example\n     *\n     * ```js\n     * angular.module('cookiesExample', ['ngCookies'])\n     *   .controller('ExampleController', ['$cookies', function($cookies) {\n     *     // Retrieving a cookie\n     *     var favoriteCookie = $cookies.get('myFavorite');\n     *     // Setting a cookie\n     *     $cookies.put('myFavorite', 'oatmeal');\n     *   }]);\n     * ```\n     */\n    this.$get = ['$$cookieReader', '$$cookieWriter', function($$cookieReader, $$cookieWriter) {\n      return {\n        /**\n         * @ngdoc method\n         * @name $cookies#get\n         *\n         * @description\n         * Returns the value of given cookie key\n         *\n         * @param {string} key Id to use for lookup.\n         * @returns {string} Raw cookie value.\n         */\n        get: function(key) {\n          return $$cookieReader()[key];\n        },\n\n        /**\n         * @ngdoc method\n         * @name $cookies#getObject\n         *\n         * @description\n         * Returns the deserialized value of given cookie key\n         *\n         * @param {string} key Id to use for lookup.\n         * @returns {Object} Deserialized cookie value.\n         */\n        getObject: function(key) {\n          var value = this.get(key);\n          return value ? angular.fromJson(value) : value;\n        },\n\n        /**\n         * @ngdoc method\n         * @name $cookies#getAll\n         *\n         * @description\n         * Returns a key value object with all the cookies\n         *\n         * @returns {Object} All cookies\n         */\n        getAll: function() {\n          return $$cookieReader();\n        },\n\n        /**\n         * @ngdoc method\n         * @name $cookies#put\n         *\n         * @description\n         * Sets a value for given cookie key\n         *\n         * @param {string} key Id for the `value`.\n         * @param {string} value Raw value to be stored.\n         * @param {Object=} options Options object.\n         *    See {@link ngCookies.$cookiesProvider#defaults $cookiesProvider.defaults}\n         */\n        put: function(key, value, options) {\n          $$cookieWriter(key, value, calcOptions(options));\n        },\n\n        /**\n         * @ngdoc method\n         * @name $cookies#putObject\n         *\n         * @description\n         * Serializes and sets a value for given cookie key\n         *\n         * @param {string} key Id for the `value`.\n         * @param {Object} value Value to be stored.\n         * @param {Object=} options Options object.\n         *    See {@link ngCookies.$cookiesProvider#defaults $cookiesProvider.defaults}\n         */\n        putObject: function(key, value, options) {\n          this.put(key, angular.toJson(value), options);\n        },\n\n        /**\n         * @ngdoc method\n         * @name $cookies#remove\n         *\n         * @description\n         * Remove given cookie\n         *\n         * @param {string} key Id of the key-value pair to delete.\n         * @param {Object=} options Options object.\n         *    See {@link ngCookies.$cookiesProvider#defaults $cookiesProvider.defaults}\n         */\n        remove: function(key, options) {\n          $$cookieWriter(key, undefined, calcOptions(options));\n        }\n      };\n    }];\n  }]);\n\nangular.module('ngCookies').\n/**\n * @ngdoc service\n * @name $cookieStore\n * @deprecated\n * sinceVersion=\"v1.4.0\"\n * Please use the {@link ngCookies.$cookies `$cookies`} service instead.\n *\n * @requires $cookies\n *\n * @description\n * Provides a key-value (string-object) storage, that is backed by session cookies.\n * Objects put or retrieved from this storage are automatically serialized or\n * deserialized by angular's toJson/fromJson.\n *\n * Requires the {@link ngCookies `ngCookies`} module to be installed.\n *\n * @example\n *\n * ```js\n * angular.module('cookieStoreExample', ['ngCookies'])\n *   .controller('ExampleController', ['$cookieStore', function($cookieStore) {\n *     // Put cookie\n *     $cookieStore.put('myFavorite','oatmeal');\n *     // Get cookie\n *     var favoriteCookie = $cookieStore.get('myFavorite');\n *     // Removing a cookie\n *     $cookieStore.remove('myFavorite');\n *   }]);\n * ```\n */\n factory('$cookieStore', ['$cookies', function($cookies) {\n\n    return {\n      /**\n       * @ngdoc method\n       * @name $cookieStore#get\n       *\n       * @description\n       * Returns the value of given cookie key\n       *\n       * @param {string} key Id to use for lookup.\n       * @returns {Object} Deserialized cookie value, undefined if the cookie does not exist.\n       */\n      get: function(key) {\n        return $cookies.getObject(key);\n      },\n\n      /**\n       * @ngdoc method\n       * @name $cookieStore#put\n       *\n       * @description\n       * Sets a value for given cookie key\n       *\n       * @param {string} key Id for the `value`.\n       * @param {Object} value Value to be stored.\n       */\n      put: function(key, value) {\n        $cookies.putObject(key, value);\n      },\n\n      /**\n       * @ngdoc method\n       * @name $cookieStore#remove\n       *\n       * @description\n       * Remove given cookie\n       *\n       * @param {string} key Id of the key-value pair to delete.\n       */\n      remove: function(key) {\n        $cookies.remove(key);\n      }\n    };\n\n  }]);\n\n/**\n * @name $$cookieWriter\n * @requires $document\n *\n * @description\n * This is a private service for writing cookies\n *\n * @param {string} name Cookie name\n * @param {string=} value Cookie value (if undefined, cookie will be deleted)\n * @param {Object=} options Object with options that need to be stored for the cookie.\n */\nfunction $$CookieWriter($document, $log, $browser) {\n  var cookiePath = $browser.baseHref();\n  var rawDocument = $document[0];\n\n  function buildCookieString(name, value, options) {\n    var path, expires;\n    options = options || {};\n    expires = options.expires;\n    path = angular.isDefined(options.path) ? options.path : cookiePath;\n    if (angular.isUndefined(value)) {\n      expires = 'Thu, 01 Jan 1970 00:00:00 GMT';\n      value = '';\n    }\n    if (angular.isString(expires)) {\n      expires = new Date(expires);\n    }\n\n    var str = encodeURIComponent(name) + '=' + encodeURIComponent(value);\n    str += path ? ';path=' + path : '';\n    str += options.domain ? ';domain=' + options.domain : '';\n    str += expires ? ';expires=' + expires.toUTCString() : '';\n    str += options.secure ? ';secure' : '';\n\n    // per http://www.ietf.org/rfc/rfc2109.txt browser must allow at minimum:\n    // - 300 cookies\n    // - 20 cookies per unique domain\n    // - 4096 bytes per cookie\n    var cookieLength = str.length + 1;\n    if (cookieLength > 4096) {\n      $log.warn('Cookie \\'' + name +\n        '\\' possibly not set or overflowed because it was too large (' +\n        cookieLength + ' > 4096 bytes)!');\n    }\n\n    return str;\n  }\n\n  return function(name, value, options) {\n    rawDocument.cookie = buildCookieString(name, value, options);\n  };\n}\n\n$$CookieWriter.$inject = ['$document', '$log', '$browser'];\n\nangular.module('ngCookies').provider('$$cookieWriter', /** @this */ function $$CookieWriterProvider() {\n  this.$get = $$CookieWriter;\n});\n\n\n})(window, window.angular);\n\n/**\n * @license AngularJS v1.6.4\n * (c) 2010-2017 Google, Inc. http://angularjs.org\n * License: MIT\n */\n(function(window, angular) {'use strict';\n\nvar forEach;\nvar isArray;\nvar isString;\nvar jqLite;\n\n/**\n * @ngdoc module\n * @name ngMessages\n * @description\n *\n * The `ngMessages` module provides enhanced support for displaying messages within templates\n * (typically within forms or when rendering message objects that return key/value data).\n * Instead of relying on JavaScript code and/or complex ng-if statements within your form template to\n * show and hide error messages specific to the state of an input field, the `ngMessages` and\n * `ngMessage` directives are designed to handle the complexity, inheritance and priority\n * sequencing based on the order of how the messages are defined in the template.\n *\n * Currently, the ngMessages module only contains the code for the `ngMessages`, `ngMessagesInclude`\n * `ngMessage` and `ngMessageExp` directives.\n *\n * # Usage\n * The `ngMessages` directive allows keys in a key/value collection to be associated with a child element\n * (or 'message') that will show or hide based on the truthiness of that key's value in the collection. A common use\n * case for `ngMessages` is to display error messages for inputs using the `$error` object exposed by the\n * {@link ngModel ngModel} directive.\n *\n * The child elements of the `ngMessages` directive are matched to the collection keys by a `ngMessage` or\n * `ngMessageExp` directive. The value of these attributes must match a key in the collection that is provided by\n * the `ngMessages` directive.\n *\n * Consider the following example, which illustrates a typical use case of `ngMessages`. Within the form `myForm` we\n * have a text input named `myField` which is bound to the scope variable `field` using the {@link ngModel ngModel}\n * directive.\n *\n * The `myField` field is a required input of type `email` with a maximum length of 15 characters.\n *\n * ```html\n * <form name=\"myForm\">\n *   <label>\n *     Enter text:\n *     <input type=\"email\" ng-model=\"field\" name=\"myField\" required maxlength=\"15\" />\n *   </label>\n *   <div ng-messages=\"myForm.myField.$error\" role=\"alert\">\n *     <div ng-message=\"required\">Please enter a value for this field.</div>\n *     <div ng-message=\"email\">This field must be a valid email address.</div>\n *     <div ng-message=\"maxlength\">This field can be at most 15 characters long.</div>\n *   </div>\n * </form>\n * ```\n *\n * In order to show error messages corresponding to `myField` we first create an element with an `ngMessages` attribute\n * set to the `$error` object owned by the `myField` input in our `myForm` form.\n *\n * Within this element we then create separate elements for each of the possible errors that `myField` could have.\n * The `ngMessage` attribute is used to declare which element(s) will appear for which error - for example,\n * setting `ng-message=\"required\"` specifies that this particular element should be displayed when there\n * is no value present for the required field `myField` (because the key `required` will be `true` in the object\n * `myForm.myField.$error`).\n *\n * ### Message order\n *\n * By default, `ngMessages` will only display one message for a particular key/value collection at any time. If more\n * than one message (or error) key is currently true, then which message is shown is determined by the order of messages\n * in the HTML template code (messages declared first are prioritised). This mechanism means the developer does not have\n * to prioritize messages using custom JavaScript code.\n *\n * Given the following error object for our example (which informs us that the field `myField` currently has both the\n * `required` and `email` errors):\n *\n * ```javascript\n * <!-- keep in mind that ngModel automatically sets these error flags -->\n * myField.$error = { required : true, email: true, maxlength: false };\n * ```\n * The `required` message will be displayed to the user since it appears before the `email` message in the DOM.\n * Once the user types a single character, the `required` message will disappear (since the field now has a value)\n * but the `email` message will be visible because it is still applicable.\n *\n * ### Displaying multiple messages at the same time\n *\n * While `ngMessages` will by default only display one error element at a time, the `ng-messages-multiple` attribute can\n * be applied to the `ngMessages` container element to cause it to display all applicable error messages at once:\n *\n * ```html\n * <!-- attribute-style usage -->\n * <div ng-messages=\"myForm.myField.$error\" ng-messages-multiple>...</div>\n *\n * <!-- element-style usage -->\n * <ng-messages for=\"myForm.myField.$error\" multiple>...</ng-messages>\n * ```\n *\n * ## Reusing and Overriding Messages\n * In addition to prioritization, ngMessages also allows for including messages from a remote or an inline\n * template. This allows for generic collection of messages to be reused across multiple parts of an\n * application.\n *\n * ```html\n * <script type=\"text/ng-template\" id=\"error-messages\">\n *   <div ng-message=\"required\">This field is required</div>\n *   <div ng-message=\"minlength\">This field is too short</div>\n * </script>\n *\n * <div ng-messages=\"myForm.myField.$error\" role=\"alert\">\n *   <div ng-messages-include=\"error-messages\"></div>\n * </div>\n * ```\n *\n * However, including generic messages may not be useful enough to match all input fields, therefore,\n * `ngMessages` provides the ability to override messages defined in the remote template by redefining\n * them within the directive container.\n *\n * ```html\n * <!-- a generic template of error messages known as \"my-custom-messages\" -->\n * <script type=\"text/ng-template\" id=\"my-custom-messages\">\n *   <div ng-message=\"required\">This field is required</div>\n *   <div ng-message=\"minlength\">This field is too short</div>\n * </script>\n *\n * <form name=\"myForm\">\n *   <label>\n *     Email address\n *     <input type=\"email\"\n *            id=\"email\"\n *            name=\"myEmail\"\n *            ng-model=\"email\"\n *            minlength=\"5\"\n *            required />\n *   </label>\n *   <!-- any ng-message elements that appear BEFORE the ng-messages-include will\n *        override the messages present in the ng-messages-include template -->\n *   <div ng-messages=\"myForm.myEmail.$error\" role=\"alert\">\n *     <!-- this required message has overridden the template message -->\n *     <div ng-message=\"required\">You did not enter your email address</div>\n *\n *     <!-- this is a brand new message and will appear last in the prioritization -->\n *     <div ng-message=\"email\">Your email address is invalid</div>\n *\n *     <!-- and here are the generic error messages -->\n *     <div ng-messages-include=\"my-custom-messages\"></div>\n *   </div>\n * </form>\n * ```\n *\n * In the example HTML code above the message that is set on required will override the corresponding\n * required message defined within the remote template. Therefore, with particular input fields (such\n * email addresses, date fields, autocomplete inputs, etc...), specialized error messages can be applied\n * while more generic messages can be used to handle other, more general input errors.\n *\n * ## Dynamic Messaging\n * ngMessages also supports using expressions to dynamically change key values. Using arrays and\n * repeaters to list messages is also supported. This means that the code below will be able to\n * fully adapt itself and display the appropriate message when any of the expression data changes:\n *\n * ```html\n * <form name=\"myForm\">\n *   <label>\n *     Email address\n *     <input type=\"email\"\n *            name=\"myEmail\"\n *            ng-model=\"email\"\n *            minlength=\"5\"\n *            required />\n *   </label>\n *   <div ng-messages=\"myForm.myEmail.$error\" role=\"alert\">\n *     <div ng-message=\"required\">You did not enter your email address</div>\n *     <div ng-repeat=\"errorMessage in errorMessages\">\n *       <!-- use ng-message-exp for a message whose key is given by an expression -->\n *       <div ng-message-exp=\"errorMessage.type\">{{ errorMessage.text }}</div>\n *     </div>\n *   </div>\n * </form>\n * ```\n *\n * The `errorMessage.type` expression can be a string value or it can be an array so\n * that multiple errors can be associated with a single error message:\n *\n * ```html\n *   <label>\n *     Email address\n *     <input type=\"email\"\n *            ng-model=\"data.email\"\n *            name=\"myEmail\"\n *            ng-minlength=\"5\"\n *            ng-maxlength=\"100\"\n *            required />\n *   </label>\n *   <div ng-messages=\"myForm.myEmail.$error\" role=\"alert\">\n *     <div ng-message-exp=\"'required'\">You did not enter your email address</div>\n *     <div ng-message-exp=\"['minlength', 'maxlength']\">\n *       Your email must be between 5 and 100 characters long\n *     </div>\n *   </div>\n * ```\n *\n * Feel free to use other structural directives such as ng-if and ng-switch to further control\n * what messages are active and when. Be careful, if you place ng-message on the same element\n * as these structural directives, Angular may not be able to determine if a message is active\n * or not. Therefore it is best to place the ng-message on a child element of the structural\n * directive.\n *\n * ```html\n * <div ng-messages=\"myForm.myEmail.$error\" role=\"alert\">\n *   <div ng-if=\"showRequiredError\">\n *     <div ng-message=\"required\">Please enter something</div>\n *   </div>\n * </div>\n * ```\n *\n * ## Animations\n * If the `ngAnimate` module is active within the application then the `ngMessages`, `ngMessage` and\n * `ngMessageExp` directives will trigger animations whenever any messages are added and removed from\n * the DOM by the `ngMessages` directive.\n *\n * Whenever the `ngMessages` directive contains one or more visible messages then the `.ng-active` CSS\n * class will be added to the element. The `.ng-inactive` CSS class will be applied when there are no\n * messages present. Therefore, CSS transitions and keyframes as well as JavaScript animations can\n * hook into the animations whenever these classes are added/removed.\n *\n * Let's say that our HTML code for our messages container looks like so:\n *\n * ```html\n * <div ng-messages=\"myMessages\" class=\"my-messages\" role=\"alert\">\n *   <div ng-message=\"alert\" class=\"some-message\">...</div>\n *   <div ng-message=\"fail\" class=\"some-message\">...</div>\n * </div>\n * ```\n *\n * Then the CSS animation code for the message container looks like so:\n *\n * ```css\n * .my-messages {\n *   transition:1s linear all;\n * }\n * .my-messages.ng-active {\n *   // messages are visible\n * }\n * .my-messages.ng-inactive {\n *   // messages are hidden\n * }\n * ```\n *\n * Whenever an inner message is attached (becomes visible) or removed (becomes hidden) then the enter\n * and leave animation is triggered for each particular element bound to the `ngMessage` directive.\n *\n * Therefore, the CSS code for the inner messages looks like so:\n *\n * ```css\n * .some-message {\n *   transition:1s linear all;\n * }\n *\n * .some-message.ng-enter {}\n * .some-message.ng-enter.ng-enter-active {}\n *\n * .some-message.ng-leave {}\n * .some-message.ng-leave.ng-leave-active {}\n * ```\n *\n * {@link ngAnimate Click here} to learn how to use JavaScript animations or to learn more about ngAnimate.\n */\nangular.module('ngMessages', [], function initAngularHelpers() {\n  // Access helpers from angular core.\n  // Do it inside a `config` block to ensure `window.angular` is available.\n  forEach = angular.forEach;\n  isArray = angular.isArray;\n  isString = angular.isString;\n  jqLite = angular.element;\n})\n  .info({ angularVersion: '1.6.4' })\n\n  /**\n   * @ngdoc directive\n   * @module ngMessages\n   * @name ngMessages\n   * @restrict AE\n   *\n   * @description\n   * `ngMessages` is a directive that is designed to show and hide messages based on the state\n   * of a key/value object that it listens on. The directive itself complements error message\n   * reporting with the `ngModel` $error object (which stores a key/value state of validation errors).\n   *\n   * `ngMessages` manages the state of internal messages within its container element. The internal\n   * messages use the `ngMessage` directive and will be inserted/removed from the page depending\n   * on if they're present within the key/value object. By default, only one message will be displayed\n   * at a time and this depends on the prioritization of the messages within the template. (This can\n   * be changed by using the `ng-messages-multiple` or `multiple` attribute on the directive container.)\n   *\n   * A remote template can also be used to promote message reusability and messages can also be\n   * overridden.\n   *\n   * {@link module:ngMessages Click here} to learn more about `ngMessages` and `ngMessage`.\n   *\n   * @usage\n   * ```html\n   * <!-- using attribute directives -->\n   * <ANY ng-messages=\"expression\" role=\"alert\">\n   *   <ANY ng-message=\"stringValue\">...</ANY>\n   *   <ANY ng-message=\"stringValue1, stringValue2, ...\">...</ANY>\n   *   <ANY ng-message-exp=\"expressionValue\">...</ANY>\n   * </ANY>\n   *\n   * <!-- or by using element directives -->\n   * <ng-messages for=\"expression\" role=\"alert\">\n   *   <ng-message when=\"stringValue\">...</ng-message>\n   *   <ng-message when=\"stringValue1, stringValue2, ...\">...</ng-message>\n   *   <ng-message when-exp=\"expressionValue\">...</ng-message>\n   * </ng-messages>\n   * ```\n   *\n   * @param {string} ngMessages an angular expression evaluating to a key/value object\n   *                 (this is typically the $error object on an ngModel instance).\n   * @param {string=} ngMessagesMultiple|multiple when set, all messages will be displayed with true\n   *\n   * @example\n   * <example name=\"ngMessages-directive\" module=\"ngMessagesExample\"\n   *          deps=\"angular-messages.js\"\n   *          animations=\"true\" fixBase=\"true\">\n   *   <file name=\"index.ced81ed4.html\">\n   *     <form name=\"myForm\">\n   *       <label>\n   *         Enter your name:\n   *         <input type=\"text\"\n   *                name=\"myName\"\n   *                ng-model=\"name\"\n   *                ng-minlength=\"5\"\n   *                ng-maxlength=\"20\"\n   *                required />\n   *       </label>\n   *       <pre>myForm.myName.$error = {{ myForm.myName.$error | json }}</pre>\n   *\n   *       <div ng-messages=\"myForm.myName.$error\" style=\"color:maroon\" role=\"alert\">\n   *         <div ng-message=\"required\">You did not enter a field</div>\n   *         <div ng-message=\"minlength\">Your field is too short</div>\n   *         <div ng-message=\"maxlength\">Your field is too long</div>\n   *       </div>\n   *     </form>\n   *   </file>\n   *   <file name=\"script.js\">\n   *     angular.module('ngMessagesExample', ['ngMessages']);\n   *   </file>\n   * </example>\n   */\n  .directive('ngMessages', ['$animate', function($animate) {\n    var ACTIVE_CLASS = 'ng-active';\n    var INACTIVE_CLASS = 'ng-inactive';\n\n    return {\n      require: 'ngMessages',\n      restrict: 'AE',\n      controller: ['$element', '$scope', '$attrs', function NgMessagesCtrl($element, $scope, $attrs) {\n        var ctrl = this;\n        var latestKey = 0;\n        var nextAttachId = 0;\n\n        this.getAttachId = function getAttachId() { return nextAttachId++; };\n\n        var messages = this.messages = {};\n        var renderLater, cachedCollection;\n\n        this.render = function(collection) {\n          collection = collection || {};\n\n          renderLater = false;\n          cachedCollection = collection;\n\n          // this is true if the attribute is empty or if the attribute value is truthy\n          var multiple = isAttrTruthy($scope, $attrs.ngMessagesMultiple) ||\n                         isAttrTruthy($scope, $attrs.multiple);\n\n          var unmatchedMessages = [];\n          var matchedKeys = {};\n          var messageItem = ctrl.head;\n          var messageFound = false;\n          var totalMessages = 0;\n\n          // we use != instead of !== to allow for both undefined and null values\n          while (messageItem != null) {\n            totalMessages++;\n            var messageCtrl = messageItem.message;\n\n            var messageUsed = false;\n            if (!messageFound) {\n              forEach(collection, function(value, key) {\n                if (!messageUsed && truthy(value) && messageCtrl.test(key)) {\n                  // this is to prevent the same error name from showing up twice\n                  if (matchedKeys[key]) return;\n                  matchedKeys[key] = true;\n\n                  messageUsed = true;\n                  messageCtrl.attach();\n                }\n              });\n            }\n\n            if (messageUsed) {\n              // unless we want to display multiple messages then we should\n              // set a flag here to avoid displaying the next message in the list\n              messageFound = !multiple;\n            } else {\n              unmatchedMessages.push(messageCtrl);\n            }\n\n            messageItem = messageItem.next;\n          }\n\n          forEach(unmatchedMessages, function(messageCtrl) {\n            messageCtrl.detach();\n          });\n\n          if (unmatchedMessages.length !== totalMessages) {\n            $animate.setClass($element, ACTIVE_CLASS, INACTIVE_CLASS);\n          } else {\n            $animate.setClass($element, INACTIVE_CLASS, ACTIVE_CLASS);\n          }\n        };\n\n        $scope.$watchCollection($attrs.ngMessages || $attrs['for'], ctrl.render);\n\n        // If the element is destroyed, proactively destroy all the currently visible messages\n        $element.on('$destroy', function() {\n          forEach(messages, function(item) {\n            item.message.detach();\n          });\n        });\n\n        this.reRender = function() {\n          if (!renderLater) {\n            renderLater = true;\n            $scope.$evalAsync(function() {\n              if (renderLater && cachedCollection) {\n                ctrl.render(cachedCollection);\n              }\n            });\n          }\n        };\n\n        this.register = function(comment, messageCtrl) {\n          var nextKey = latestKey.toString();\n          messages[nextKey] = {\n            message: messageCtrl\n          };\n          insertMessageNode($element[0], comment, nextKey);\n          comment.$$ngMessageNode = nextKey;\n          latestKey++;\n\n          ctrl.reRender();\n        };\n\n        this.deregister = function(comment) {\n          var key = comment.$$ngMessageNode;\n          delete comment.$$ngMessageNode;\n          removeMessageNode($element[0], comment, key);\n          delete messages[key];\n          ctrl.reRender();\n        };\n\n        function findPreviousMessage(parent, comment) {\n          var prevNode = comment;\n          var parentLookup = [];\n\n          while (prevNode && prevNode !== parent) {\n            var prevKey = prevNode.$$ngMessageNode;\n            if (prevKey && prevKey.length) {\n              return messages[prevKey];\n            }\n\n            // dive deeper into the DOM and examine its children for any ngMessage\n            // comments that may be in an element that appears deeper in the list\n            if (prevNode.childNodes.length && parentLookup.indexOf(prevNode) === -1) {\n              parentLookup.push(prevNode);\n              prevNode = prevNode.childNodes[prevNode.childNodes.length - 1];\n            } else if (prevNode.previousSibling) {\n              prevNode = prevNode.previousSibling;\n            } else {\n              prevNode = prevNode.parentNode;\n              parentLookup.push(prevNode);\n            }\n          }\n        }\n\n        function insertMessageNode(parent, comment, key) {\n          var messageNode = messages[key];\n          if (!ctrl.head) {\n            ctrl.head = messageNode;\n          } else {\n            var match = findPreviousMessage(parent, comment);\n            if (match) {\n              messageNode.next = match.next;\n              match.next = messageNode;\n            } else {\n              messageNode.next = ctrl.head;\n              ctrl.head = messageNode;\n            }\n          }\n        }\n\n        function removeMessageNode(parent, comment, key) {\n          var messageNode = messages[key];\n\n          var match = findPreviousMessage(parent, comment);\n          if (match) {\n            match.next = messageNode.next;\n          } else {\n            ctrl.head = messageNode.next;\n          }\n        }\n      }]\n    };\n\n    function isAttrTruthy(scope, attr) {\n     return (isString(attr) && attr.length === 0) || //empty attribute\n            truthy(scope.$eval(attr));\n    }\n\n    function truthy(val) {\n      return isString(val) ? val.length : !!val;\n    }\n  }])\n\n  /**\n   * @ngdoc directive\n   * @name ngMessagesInclude\n   * @restrict AE\n   * @scope\n   *\n   * @description\n   * `ngMessagesInclude` is a directive with the purpose to import existing ngMessage template\n   * code from a remote template and place the downloaded template code into the exact spot\n   * that the ngMessagesInclude directive is placed within the ngMessages container. This allows\n   * for a series of pre-defined messages to be reused and also allows for the developer to\n   * determine what messages are overridden due to the placement of the ngMessagesInclude directive.\n   *\n   * @usage\n   * ```html\n   * <!-- using attribute directives -->\n   * <ANY ng-messages=\"expression\" role=\"alert\">\n   *   <ANY ng-messages-include=\"remoteTplString\">...</ANY>\n   * </ANY>\n   *\n   * <!-- or by using element directives -->\n   * <ng-messages for=\"expression\" role=\"alert\">\n   *   <ng-messages-include src=\"expressionValue1\">...</ng-messages-include>\n   * </ng-messages>\n   * ```\n   *\n   * {@link module:ngMessages Click here} to learn more about `ngMessages` and `ngMessage`.\n   *\n   * @param {string} ngMessagesInclude|src a string value corresponding to the remote template.\n   */\n  .directive('ngMessagesInclude',\n    ['$templateRequest', '$document', '$compile', function($templateRequest, $document, $compile) {\n\n    return {\n      restrict: 'AE',\n      require: '^^ngMessages', // we only require this for validation sake\n      link: function($scope, element, attrs) {\n        var src = attrs.ngMessagesInclude || attrs.src;\n        $templateRequest(src).then(function(html) {\n          if ($scope.$$destroyed) return;\n\n          if (isString(html) && !html.trim()) {\n            // Empty template - nothing to compile\n            replaceElementWithMarker(element, src);\n          } else {\n            // Non-empty template - compile and link\n            $compile(html)($scope, function(contents) {\n              element.after(contents);\n              replaceElementWithMarker(element, src);\n            });\n          }\n        });\n      }\n    };\n\n    // Helpers\n    function replaceElementWithMarker(element, src) {\n      // A comment marker is placed for debugging purposes\n      var comment = $compile.$$createComment ?\n          $compile.$$createComment('ngMessagesInclude', src) :\n          $document[0].createComment(' ngMessagesInclude: ' + src + ' ');\n      var marker = jqLite(comment);\n      element.after(marker);\n\n      // Don't pollute the DOM anymore by keeping an empty directive element\n      element.remove();\n    }\n  }])\n\n  /**\n   * @ngdoc directive\n   * @name ngMessage\n   * @restrict AE\n   * @scope\n   *\n   * @description\n   * `ngMessage` is a directive with the purpose to show and hide a particular message.\n   * For `ngMessage` to operate, a parent `ngMessages` directive on a parent DOM element\n   * must be situated since it determines which messages are visible based on the state\n   * of the provided key/value map that `ngMessages` listens on.\n   *\n   * More information about using `ngMessage` can be found in the\n   * {@link module:ngMessages `ngMessages` module documentation}.\n   *\n   * @usage\n   * ```html\n   * <!-- using attribute directives -->\n   * <ANY ng-messages=\"expression\" role=\"alert\">\n   *   <ANY ng-message=\"stringValue\">...</ANY>\n   *   <ANY ng-message=\"stringValue1, stringValue2, ...\">...</ANY>\n   * </ANY>\n   *\n   * <!-- or by using element directives -->\n   * <ng-messages for=\"expression\" role=\"alert\">\n   *   <ng-message when=\"stringValue\">...</ng-message>\n   *   <ng-message when=\"stringValue1, stringValue2, ...\">...</ng-message>\n   * </ng-messages>\n   * ```\n   *\n   * @param {expression} ngMessage|when a string value corresponding to the message key.\n   */\n  .directive('ngMessage', ngMessageDirectiveFactory())\n\n\n  /**\n   * @ngdoc directive\n   * @name ngMessageExp\n   * @restrict AE\n   * @priority 1\n   * @scope\n   *\n   * @description\n   * `ngMessageExp` is the same as {@link directive:ngMessage `ngMessage`}, but instead of a static\n   * value, it accepts an expression to be evaluated for the message key.\n   *\n   * @usage\n   * ```html\n   * <!-- using attribute directives -->\n   * <ANY ng-messages=\"expression\">\n   *   <ANY ng-message-exp=\"expressionValue\">...</ANY>\n   * </ANY>\n   *\n   * <!-- or by using element directives -->\n   * <ng-messages for=\"expression\">\n   *   <ng-message when-exp=\"expressionValue\">...</ng-message>\n   * </ng-messages>\n   * ```\n   *\n   * {@link module:ngMessages Click here} to learn more about `ngMessages` and `ngMessage`.\n   *\n   * @param {expression} ngMessageExp|whenExp an expression value corresponding to the message key.\n   */\n  .directive('ngMessageExp', ngMessageDirectiveFactory());\n\nfunction ngMessageDirectiveFactory() {\n  return ['$animate', function($animate) {\n    return {\n      restrict: 'AE',\n      transclude: 'element',\n      priority: 1, // must run before ngBind, otherwise the text is set on the comment\n      terminal: true,\n      require: '^^ngMessages',\n      link: function(scope, element, attrs, ngMessagesCtrl, $transclude) {\n        var commentNode = element[0];\n\n        var records;\n        var staticExp = attrs.ngMessage || attrs.when;\n        var dynamicExp = attrs.ngMessageExp || attrs.whenExp;\n        var assignRecords = function(items) {\n          records = items\n              ? (isArray(items)\n                  ? items\n                  : items.split(/[\\s,]+/))\n              : null;\n          ngMessagesCtrl.reRender();\n        };\n\n        if (dynamicExp) {\n          assignRecords(scope.$eval(dynamicExp));\n          scope.$watchCollection(dynamicExp, assignRecords);\n        } else {\n          assignRecords(staticExp);\n        }\n\n        var currentElement, messageCtrl;\n        ngMessagesCtrl.register(commentNode, messageCtrl = {\n          test: function(name) {\n            return contains(records, name);\n          },\n          attach: function() {\n            if (!currentElement) {\n              $transclude(function(elm, newScope) {\n                $animate.enter(elm, null, element);\n                currentElement = elm;\n\n                // Each time we attach this node to a message we get a new id that we can match\n                // when we are destroying the node later.\n                var $$attachId = currentElement.$$attachId = ngMessagesCtrl.getAttachId();\n\n                // in the event that the element or a parent element is destroyed\n                // by another structural directive then it's time\n                // to deregister the message from the controller\n                currentElement.on('$destroy', function() {\n                  if (currentElement && currentElement.$$attachId === $$attachId) {\n                    ngMessagesCtrl.deregister(commentNode);\n                    messageCtrl.detach();\n                  }\n                  newScope.$destroy();\n                });\n              });\n            }\n          },\n          detach: function() {\n            if (currentElement) {\n              var elm = currentElement;\n              currentElement = null;\n              $animate.leave(elm);\n            }\n          }\n        });\n      }\n    };\n  }];\n\n  function contains(collection, key) {\n    if (collection) {\n      return isArray(collection)\n          ? collection.indexOf(key) >= 0\n          : collection.hasOwnProperty(key);\n    }\n  }\n}\n\n\n})(window, window.angular);\n\n/*!\n * AngularJS Material Design\n * https://github.com/angular/material\n * @license MIT\n * v1.1.4\n */\n(function( window, angular, undefined ){\n\"use strict\";\n\n(function(){\n\"use strict\";\n\nangular.module('ngMaterial', [\"ng\",\"ngAnimate\",\"ngAria\",\"material.core\",\"material.core.interaction\",\"material.core.gestures\",\"material.core.layout\",\"material.core.meta\",\"material.core.theming.palette\",\"material.core.theming\",\"material.core.animate\",\"material.components.autocomplete\",\"material.components.backdrop\",\"material.components.bottomSheet\",\"material.components.button\",\"material.components.card\",\"material.components.checkbox\",\"material.components.chips\",\"material.components.colors\",\"material.components.content\",\"material.components.datepicker\",\"material.components.dialog\",\"material.components.divider\",\"material.components.fabActions\",\"material.components.fabShared\",\"material.components.fabSpeedDial\",\"material.components.fabToolbar\",\"material.components.gridList\",\"material.components.icon\",\"material.components.input\",\"material.components.list\",\"material.components.menu\",\"material.components.menuBar\",\"material.components.navBar\",\"material.components.progressCircular\",\"material.components.panel\",\"material.components.progressLinear\",\"material.components.radioButton\",\"material.components.showHide\",\"material.components.sidenav\",\"material.components.select\",\"material.components.slider\",\"material.components.sticky\",\"material.components.subheader\",\"material.components.switch\",\"material.components.swipe\",\"material.components.tabs\",\"material.components.toast\",\"material.components.toolbar\",\"material.components.tooltip\",\"material.components.truncate\",\"material.components.virtualRepeat\",\"material.components.whiteframe\"]);\n})();\n(function(){\n\"use strict\";\n\n/**\n * Initialization function that validates environment\n * requirements.\n */\nDetectNgTouch.$inject = [\"$log\", \"$injector\"];\nMdCoreConfigure.$inject = [\"$provide\", \"$mdThemingProvider\"];\nrAFDecorator.$inject = [\"$delegate\"];\nqDecorator.$inject = [\"$delegate\"];\nangular\n  .module('material.core', [\n    'ngAnimate',\n    'material.core.animate',\n    'material.core.layout',\n    'material.core.interaction',\n    'material.core.gestures',\n    'material.core.theming'\n  ])\n  .config(MdCoreConfigure)\n  .run(DetectNgTouch);\n\n\n/**\n * Detect if the ng-Touch module is also being used.\n * Warn if detected.\n * @ngInject\n */\nfunction DetectNgTouch($log, $injector) {\n  if ( $injector.has('$swipe') ) {\n    var msg = \"\" +\n      \"You are using the ngTouch module. \\n\" +\n      \"AngularJS Material already has mobile click, tap, and swipe support... \\n\" +\n      \"ngTouch is not supported with AngularJS Material!\";\n    $log.warn(msg);\n  }\n}\n\n/**\n * @ngInject\n */\nfunction MdCoreConfigure($provide, $mdThemingProvider) {\n\n  $provide.decorator('$$rAF', ['$delegate', rAFDecorator]);\n  $provide.decorator('$q', ['$delegate', qDecorator]);\n\n  $mdThemingProvider.theme('default')\n    .primaryPalette('indigo')\n    .accentPalette('pink')\n    .warnPalette('deep-orange')\n    .backgroundPalette('grey');\n}\n\n/**\n * @ngInject\n */\nfunction rAFDecorator($delegate) {\n  /**\n   * Use this to throttle events that come in often.\n   * The throttled function will always use the *last* invocation before the\n   * coming frame.\n   *\n   * For example, window resize events that fire many times a second:\n   * If we set to use an raf-throttled callback on window resize, then\n   * our callback will only be fired once per frame, with the last resize\n   * event that happened before that frame.\n   *\n   * @param {function} callback function to debounce\n   */\n  $delegate.throttle = function(cb) {\n    var queuedArgs, alreadyQueued, queueCb, context;\n    return function debounced() {\n      queuedArgs = arguments;\n      context = this;\n      queueCb = cb;\n      if (!alreadyQueued) {\n        alreadyQueued = true;\n        $delegate(function() {\n          queueCb.apply(context, Array.prototype.slice.call(queuedArgs));\n          alreadyQueued = false;\n        });\n      }\n    };\n  };\n  return $delegate;\n}\n\n/**\n * @ngInject\n */\nfunction qDecorator($delegate) {\n  /**\n   * Adds a shim for $q.resolve for AngularJS version that don't have it,\n   * so we don't have to think about it.\n   *\n   * via https://github.com/angular/angular.js/pull/11987\n   */\n\n  // TODO(crisbeto): this won't be necessary once we drop AngularJS 1.3\n  if (!$delegate.resolve) {\n    $delegate.resolve = $delegate.when;\n  }\n  return $delegate;\n}\n\n})();\n(function(){\n\"use strict\";\n\n\nMdAutofocusDirective.$inject = [\"$parse\"];angular.module('material.core')\n  .directive('mdAutofocus', MdAutofocusDirective)\n\n  // Support the deprecated md-auto-focus and md-sidenav-focus as well\n  .directive('mdAutoFocus', MdAutofocusDirective)\n  .directive('mdSidenavFocus', MdAutofocusDirective);\n\n/**\n * @ngdoc directive\n * @name mdAutofocus\n * @module material.core.util\n *\n * @description\n *\n * `[md-autofocus]` provides an optional way to identify the focused element when a `$mdDialog`,\n * `$mdBottomSheet`, `$mdMenu` or `$mdSidenav` opens or upon page load for input-like elements.\n *\n * When one of these opens, it will find the first nested element with the `[md-autofocus]`\n * attribute directive and optional expression. An expression may be specified as the directive\n * value to enable conditional activation of the autofocus.\n *\n * @usage\n *\n * ### Dialog\n * <hljs lang=\"html\">\n * <md-dialog>\n *   <form>\n *     <md-input-container>\n *       <label for=\"testInput\">Label</label>\n *       <input id=\"testInput\" type=\"text\" md-autofocus>\n *     </md-input-container>\n *   </form>\n * </md-dialog>\n * </hljs>\n *\n * ### Bottomsheet\n * <hljs lang=\"html\">\n * <md-bottom-sheet class=\"md-list md-has-header\">\n *  <md-subheader>Comment Actions</md-subheader>\n *  <md-list>\n *    <md-list-item ng-repeat=\"item in items\">\n *\n *      <md-button md-autofocus=\"$index == 2\">\n *        <md-icon md-svg-src=\"{{item.icon}}\"></md-icon>\n *        <span class=\"md-inline-list-icon-label\">{{ item.name }}</span>\n *      </md-button>\n *\n *    </md-list-item>\n *  </md-list>\n * </md-bottom-sheet>\n * </hljs>\n *\n * ### Autocomplete\n * <hljs lang=\"html\">\n *   <md-autocomplete\n *       md-autofocus\n *       md-selected-item=\"selectedItem\"\n *       md-search-text=\"searchText\"\n *       md-items=\"item in getMatches(searchText)\"\n *       md-item-text=\"item.display\">\n *     <span md-highlight-text=\"searchText\">{{item.display}}</span>\n *   </md-autocomplete>\n * </hljs>\n *\n * ### Sidenav\n * <hljs lang=\"html\">\n * <div layout=\"row\" ng-controller=\"MyController\">\n *   <md-sidenav md-component-id=\"left\" class=\"md-sidenav-left\">\n *     Left Nav!\n *   </md-sidenav>\n *\n *   <md-content>\n *     Center Content\n *     <md-button ng-click=\"openLeftMenu()\">\n *       Open Left Menu\n *     </md-button>\n *   </md-content>\n *\n *   <md-sidenav md-component-id=\"right\"\n *     md-is-locked-open=\"$mdMedia('min-width: 333px')\"\n *     class=\"md-sidenav-right\">\n *     <form>\n *       <md-input-container>\n *         <label for=\"testInput\">Test input</label>\n *         <input id=\"testInput\" type=\"text\"\n *                ng-model=\"data\" md-autofocus>\n *       </md-input-container>\n *     </form>\n *   </md-sidenav>\n * </div>\n * </hljs>\n **/\nfunction MdAutofocusDirective($parse) {\n  return {\n    restrict: 'A',\n    link: {\n      pre: preLink\n    }\n  };\n\n  function preLink(scope, element, attr) {\n    var attrExp = attr.mdAutoFocus || attr.mdAutofocus || attr.mdSidenavFocus;\n\n    // Initially update the expression by manually parsing the expression as per $watch source.\n    updateExpression($parse(attrExp)(scope));\n\n    // Only watch the expression if it is not empty.\n    if (attrExp) {\n      scope.$watch(attrExp, updateExpression);\n    }\n\n    /**\n     * Updates the autofocus class which is used to determine whether the attribute\n     * expression evaluates to true or false.\n     * @param {string|boolean} value Attribute Value\n     */\n    function updateExpression(value) {\n\n      // Rather than passing undefined to the jqLite toggle class function we explicitly set the\n      // value to true. Otherwise the class will be just toggled instead of being forced.\n      if (angular.isUndefined(value)) {\n        value = true;\n      }\n\n      element.toggleClass('md-autofocus', !!value);\n    }\n  }\n\n}\n\n})();\n(function(){\n\"use strict\";\n\n/**\n * @ngdoc module\n * @name material.core.colorUtil\n * @description\n * Color Util\n */\nangular\n  .module('material.core')\n  .factory('$mdColorUtil', ColorUtilFactory);\n\nfunction ColorUtilFactory() {\n  /**\n   * Converts hex value to RGBA string\n   * @param color {string}\n   * @returns {string}\n   */\n  function hexToRgba (color) {\n    var hex   = color[ 0 ] === '#' ? color.substr(1) : color,\n      dig   = hex.length / 3,\n      red   = hex.substr(0, dig),\n      green = hex.substr(dig, dig),\n      blue  = hex.substr(dig * 2);\n    if (dig === 1) {\n      red += red;\n      green += green;\n      blue += blue;\n    }\n    return 'rgba(' + parseInt(red, 16) + ',' + parseInt(green, 16) + ',' + parseInt(blue, 16) + ',0.1)';\n  }\n\n  /**\n   * Converts rgba value to hex string\n   * @param color {string}\n   * @returns {string}\n   */\n  function rgbaToHex(color) {\n    color = color.match(/^rgba?[\\s+]?\\([\\s+]?(\\d+)[\\s+]?,[\\s+]?(\\d+)[\\s+]?,[\\s+]?(\\d+)[\\s+]?/i);\n\n    var hex = (color && color.length === 4) ? \"#\" +\n    (\"0\" + parseInt(color[1],10).toString(16)).slice(-2) +\n    (\"0\" + parseInt(color[2],10).toString(16)).slice(-2) +\n    (\"0\" + parseInt(color[3],10).toString(16)).slice(-2) : '';\n\n    return hex.toUpperCase();\n  }\n\n  /**\n   * Converts an RGB color to RGBA\n   * @param color {string}\n   * @returns {string}\n   */\n  function rgbToRgba (color) {\n    return color.replace(')', ', 0.1)').replace('(', 'a(');\n  }\n\n  /**\n   * Converts an RGBA color to RGB\n   * @param color {string}\n   * @returns {string}\n   */\n  function rgbaToRgb (color) {\n    return color\n      ? color.replace('rgba', 'rgb').replace(/,[^\\),]+\\)/, ')')\n      : 'rgb(0,0,0)';\n  }\n\n  return {\n    rgbaToHex: rgbaToHex,\n    hexToRgba: hexToRgba,\n    rgbToRgba: rgbToRgba,\n    rgbaToRgb: rgbaToRgb\n  };\n}\n\n})();\n(function(){\n\"use strict\";\n\nangular.module('material.core')\n.factory('$mdConstant', MdConstantFactory);\n\n/**\n * Factory function that creates the grab-bag $mdConstant service.\n * @ngInject\n */\nfunction MdConstantFactory() {\n\n  var prefixTestEl = document.createElement('div');\n  var vendorPrefix = getVendorPrefix(prefixTestEl);\n  var isWebkit = /webkit/i.test(vendorPrefix);\n  var SPECIAL_CHARS_REGEXP = /([:\\-_]+(.))/g;\n\n  function vendorProperty(name) {\n    // Add a dash between the prefix and name, to be able to transform the string into camelcase.\n    var prefixedName = vendorPrefix + '-' + name;\n    var ucPrefix = camelCase(prefixedName);\n    var lcPrefix = ucPrefix.charAt(0).toLowerCase() + ucPrefix.substring(1);\n\n    return hasStyleProperty(prefixTestEl, name)     ? name     :       // The current browser supports the un-prefixed property\n           hasStyleProperty(prefixTestEl, ucPrefix) ? ucPrefix :       // The current browser only supports the prefixed property.\n           hasStyleProperty(prefixTestEl, lcPrefix) ? lcPrefix : name; // Some browsers are only supporting the prefix in lowercase.\n  }\n\n  function hasStyleProperty(testElement, property) {\n    return angular.isDefined(testElement.style[property]);\n  }\n\n  function camelCase(input) {\n    return input.replace(SPECIAL_CHARS_REGEXP, function(matches, separator, letter, offset) {\n      return offset ? letter.toUpperCase() : letter;\n    });\n  }\n\n  function getVendorPrefix(testElement) {\n    var prop, match;\n    var vendorRegex = /^(Moz|webkit|ms)(?=[A-Z])/;\n\n    for (prop in testElement.style) {\n      if (match = vendorRegex.exec(prop)) {\n        return match[0];\n      }\n    }\n  }\n\n  var self = {\n    isInputKey : function(e) { return (e.keyCode >= 31 && e.keyCode <= 90); },\n    isNumPadKey : function(e) { return (3 === e.location && e.keyCode >= 97 && e.keyCode <= 105); },\n    isMetaKey: function(e) { return (e.keyCode >= 91 && e.keyCode <= 93); },\n    isFnLockKey: function(e) { return (e.keyCode >= 112 && e.keyCode <= 145); },\n    isNavigationKey : function(e) {\n      var kc = self.KEY_CODE, NAVIGATION_KEYS =  [kc.SPACE, kc.ENTER, kc.UP_ARROW, kc.DOWN_ARROW];\n      return (NAVIGATION_KEYS.indexOf(e.keyCode) != -1);\n    },\n    hasModifierKey: function(e) {\n      return e.ctrlKey || e.metaKey || e.altKey;\n    },\n\n    /**\n     * Maximum size, in pixels, that can be explicitly set to an element. The actual value varies\n     * between browsers, but IE11 has the very lowest size at a mere 1,533,917px. Ideally we could\n     * compute this value, but Firefox always reports an element to have a size of zero if it\n     * goes over the max, meaning that we'd have to binary search for the value.\n     */\n    ELEMENT_MAX_PIXELS: 1533917,\n\n    /**\n     * Priority for a directive that should run before the directives from ngAria.\n     */\n    BEFORE_NG_ARIA: 210,\n\n    /**\n     * Common Keyboard actions and their associated keycode.\n     */\n    KEY_CODE: {\n      COMMA: 188,\n      SEMICOLON : 186,\n      ENTER: 13,\n      ESCAPE: 27,\n      SPACE: 32,\n      PAGE_UP: 33,\n      PAGE_DOWN: 34,\n      END: 35,\n      HOME: 36,\n      LEFT_ARROW : 37,\n      UP_ARROW : 38,\n      RIGHT_ARROW : 39,\n      DOWN_ARROW : 40,\n      TAB : 9,\n      BACKSPACE: 8,\n      DELETE: 46\n    },\n\n    /**\n     * Vendor prefixed CSS properties to be used to support the given functionality in older browsers\n     * as well.\n     */\n    CSS: {\n      /* Constants */\n      TRANSITIONEND: 'transitionend' + (isWebkit ? ' webkitTransitionEnd' : ''),\n      ANIMATIONEND: 'animationend' + (isWebkit ? ' webkitAnimationEnd' : ''),\n\n      TRANSFORM: vendorProperty('transform'),\n      TRANSFORM_ORIGIN: vendorProperty('transformOrigin'),\n      TRANSITION: vendorProperty('transition'),\n      TRANSITION_DURATION: vendorProperty('transitionDuration'),\n      ANIMATION_PLAY_STATE: vendorProperty('animationPlayState'),\n      ANIMATION_DURATION: vendorProperty('animationDuration'),\n      ANIMATION_NAME: vendorProperty('animationName'),\n      ANIMATION_TIMING: vendorProperty('animationTimingFunction'),\n      ANIMATION_DIRECTION: vendorProperty('animationDirection')\n    },\n\n    /**\n     * As defined in core/style/variables.scss\n     *\n     * $layout-breakpoint-xs:     600px !default;\n     * $layout-breakpoint-sm:     960px !default;\n     * $layout-breakpoint-md:     1280px !default;\n     * $layout-breakpoint-lg:     1920px !default;\n     *\n     */\n    MEDIA: {\n      'xs'        : '(max-width: 599px)'                         ,\n      'gt-xs'     : '(min-width: 600px)'                         ,\n      'sm'        : '(min-width: 600px) and (max-width: 959px)'  ,\n      'gt-sm'     : '(min-width: 960px)'                         ,\n      'md'        : '(min-width: 960px) and (max-width: 1279px)' ,\n      'gt-md'     : '(min-width: 1280px)'                        ,\n      'lg'        : '(min-width: 1280px) and (max-width: 1919px)',\n      'gt-lg'     : '(min-width: 1920px)'                        ,\n      'xl'        : '(min-width: 1920px)'                        ,\n      'landscape' : '(orientation: landscape)'                   ,\n      'portrait'  : '(orientation: portrait)'                    ,\n      'print' : 'print'\n    },\n\n    MEDIA_PRIORITY: [\n      'xl',\n      'gt-lg',\n      'lg',\n      'gt-md',\n      'md',\n      'gt-sm',\n      'sm',\n      'gt-xs',\n      'xs',\n      'landscape',\n      'portrait',\n      'print'\n    ]\n  };\n\n  return self;\n}\n\n})();\n(function(){\n\"use strict\";\n\n  angular\n    .module('material.core')\n    .config( [\"$provide\", function($provide){\n       $provide.decorator('$mdUtil', ['$delegate', function ($delegate){\n           /**\n            * Inject the iterator facade to easily support iteration and accessors\n            * @see iterator below\n            */\n           $delegate.iterator = MdIterator;\n\n           return $delegate;\n         }\n       ]);\n     }]);\n\n  /**\n   * iterator is a list facade to easily support iteration and accessors\n   *\n   * @param items Array list which this iterator will enumerate\n   * @param reloop Boolean enables iterator to consider the list as an endless reloop\n   */\n  function MdIterator(items, reloop) {\n    var trueFn = function() { return true; };\n\n    if (items && !angular.isArray(items)) {\n      items = Array.prototype.slice.call(items);\n    }\n\n    reloop = !!reloop;\n    var _items = items || [ ];\n\n    // Published API\n    return {\n      items: getItems,\n      count: count,\n\n      inRange: inRange,\n      contains: contains,\n      indexOf: indexOf,\n      itemAt: itemAt,\n\n      findBy: findBy,\n\n      add: add,\n      remove: remove,\n\n      first: first,\n      last: last,\n      next: angular.bind(null, findSubsequentItem, false),\n      previous: angular.bind(null, findSubsequentItem, true),\n\n      hasPrevious: hasPrevious,\n      hasNext: hasNext\n\n    };\n\n    /**\n     * Publish copy of the enumerable set\n     * @returns {Array|*}\n     */\n    function getItems() {\n      return [].concat(_items);\n    }\n\n    /**\n     * Determine length of the list\n     * @returns {Array.length|*|number}\n     */\n    function count() {\n      return _items.length;\n    }\n\n    /**\n     * Is the index specified valid\n     * @param index\n     * @returns {Array.length|*|number|boolean}\n     */\n    function inRange(index) {\n      return _items.length && ( index > -1 ) && (index < _items.length );\n    }\n\n    /**\n     * Can the iterator proceed to the next item in the list; relative to\n     * the specified item.\n     *\n     * @param item\n     * @returns {Array.length|*|number|boolean}\n     */\n    function hasNext(item) {\n      return item ? inRange(indexOf(item) + 1) : false;\n    }\n\n    /**\n     * Can the iterator proceed to the previous item in the list; relative to\n     * the specified item.\n     *\n     * @param item\n     * @returns {Array.length|*|number|boolean}\n     */\n    function hasPrevious(item) {\n      return item ? inRange(indexOf(item) - 1) : false;\n    }\n\n    /**\n     * Get item at specified index/position\n     * @param index\n     * @returns {*}\n     */\n    function itemAt(index) {\n      return inRange(index) ? _items[index] : null;\n    }\n\n    /**\n     * Find all elements matching the key/value pair\n     * otherwise return null\n     *\n     * @param val\n     * @param key\n     *\n     * @return array\n     */\n    function findBy(key, val) {\n      return _items.filter(function(item) {\n        return item[key] === val;\n      });\n    }\n\n    /**\n     * Add item to list\n     * @param item\n     * @param index\n     * @returns {*}\n     */\n    function add(item, index) {\n      if ( !item ) return -1;\n\n      if (!angular.isNumber(index)) {\n        index = _items.length;\n      }\n\n      _items.splice(index, 0, item);\n\n      return indexOf(item);\n    }\n\n    /**\n     * Remove item from list...\n     * @param item\n     */\n    function remove(item) {\n      if ( contains(item) ){\n        _items.splice(indexOf(item), 1);\n      }\n    }\n\n    /**\n     * Get the zero-based index of the target item\n     * @param item\n     * @returns {*}\n     */\n    function indexOf(item) {\n      return _items.indexOf(item);\n    }\n\n    /**\n     * Boolean existence check\n     * @param item\n     * @returns {boolean}\n     */\n    function contains(item) {\n      return item && (indexOf(item) > -1);\n    }\n\n    /**\n     * Return first item in the list\n     * @returns {*}\n     */\n    function first() {\n      return _items.length ? _items[0] : null;\n    }\n\n    /**\n     * Return last item in the list...\n     * @returns {*}\n     */\n    function last() {\n      return _items.length ? _items[_items.length - 1] : null;\n    }\n\n    /**\n     * Find the next item. If reloop is true and at the end of the list, it will go back to the\n     * first item. If given, the `validate` callback will be used to determine whether the next item\n     * is valid. If not valid, it will try to find the next item again.\n     *\n     * @param {boolean} backwards Specifies the direction of searching (forwards/backwards)\n     * @param {*} item The item whose subsequent item we are looking for\n     * @param {Function=} validate The `validate` function\n     * @param {integer=} limit The recursion limit\n     *\n     * @returns {*} The subsequent item or null\n     */\n    function findSubsequentItem(backwards, item, validate, limit) {\n      validate = validate || trueFn;\n\n      var curIndex = indexOf(item);\n      while (true) {\n        if (!inRange(curIndex)) return null;\n\n        var nextIndex = curIndex + (backwards ? -1 : 1);\n        var foundItem = null;\n        if (inRange(nextIndex)) {\n          foundItem = _items[nextIndex];\n        } else if (reloop) {\n          foundItem = backwards ? last() : first();\n          nextIndex = indexOf(foundItem);\n        }\n\n        if ((foundItem === null) || (nextIndex === limit)) return null;\n        if (validate(foundItem)) return foundItem;\n\n        if (angular.isUndefined(limit)) limit = nextIndex;\n\n        curIndex = nextIndex;\n      }\n    }\n  }\n\n\n})();\n(function(){\n\"use strict\";\n\n\nmdMediaFactory.$inject = [\"$mdConstant\", \"$rootScope\", \"$window\"];angular.module('material.core')\n.factory('$mdMedia', mdMediaFactory);\n\n/**\n * @ngdoc service\n * @name $mdMedia\n * @module material.core\n *\n * @description\n * `$mdMedia` is used to evaluate whether a given media query is true or false given the\n * current device's screen / window size. The media query will be re-evaluated on resize, allowing\n * you to register a watch.\n *\n * `$mdMedia` also has pre-programmed support for media queries that match the layout breakpoints:\n *\n *  <table class=\"md-api-table\">\n *    <thead>\n *    <tr>\n *      <th>Breakpoint</th>\n *      <th>mediaQuery</th>\n *    </tr>\n *    </thead>\n *    <tbody>\n *    <tr>\n *      <td>xs</td>\n *      <td>(max-width: 599px)</td>\n *    </tr>\n *    <tr>\n *      <td>gt-xs</td>\n *      <td>(min-width: 600px)</td>\n *    </tr>\n *    <tr>\n *      <td>sm</td>\n *      <td>(min-width: 600px) and (max-width: 959px)</td>\n *    </tr>\n *    <tr>\n *      <td>gt-sm</td>\n *      <td>(min-width: 960px)</td>\n *    </tr>\n *    <tr>\n *      <td>md</td>\n *      <td>(min-width: 960px) and (max-width: 1279px)</td>\n *    </tr>\n *    <tr>\n *      <td>gt-md</td>\n *      <td>(min-width: 1280px)</td>\n *    </tr>\n *    <tr>\n *      <td>lg</td>\n *      <td>(min-width: 1280px) and (max-width: 1919px)</td>\n *    </tr>\n *    <tr>\n *      <td>gt-lg</td>\n *      <td>(min-width: 1920px)</td>\n *    </tr>\n *    <tr>\n *      <td>xl</td>\n *      <td>(min-width: 1920px)</td>\n *    </tr>\n *    <tr>\n *      <td>landscape</td>\n *      <td>landscape</td>\n *    </tr>\n *    <tr>\n *      <td>portrait</td>\n *      <td>portrait</td>\n *    </tr>\n *    <tr>\n *      <td>print</td>\n *      <td>print</td>\n *    </tr>\n *    </tbody>\n *  </table>\n *\n *  See Material Design's <a href=\"https://material.google.com/layout/responsive-ui.html\">Layout - Adaptive UI</a> for more details.\n *\n *  <a href=\"https://www.google.com/design/spec/layout/adaptive-ui.html\">\n *  <img src=\"https://material-design.storage.googleapis.com/publish/material_v_4/material_ext_publish/0B8olV15J7abPSGFxemFiQVRtb1k/layout_adaptive_breakpoints_01.png\" width=\"100%\" height=\"100%\"></img>\n *  </a>\n *\n * @returns {boolean} a boolean representing whether or not the given media query is true or false.\n *\n * @usage\n * <hljs lang=\"js\">\n * app.controller('MyController', function($mdMedia, $scope) {\n *   $scope.$watch(function() { return $mdMedia('lg'); }, function(big) {\n *     $scope.bigScreen = big;\n *   });\n *\n *   $scope.screenIsSmall = $mdMedia('sm');\n *   $scope.customQuery = $mdMedia('(min-width: 1234px)');\n *   $scope.anotherCustom = $mdMedia('max-width: 300px');\n * });\n * </hljs>\n */\n\n/* @ngInject */\nfunction mdMediaFactory($mdConstant, $rootScope, $window) {\n  var queries = {};\n  var mqls = {};\n  var results = {};\n  var normalizeCache = {};\n\n  $mdMedia.getResponsiveAttribute = getResponsiveAttribute;\n  $mdMedia.getQuery = getQuery;\n  $mdMedia.watchResponsiveAttributes = watchResponsiveAttributes;\n\n  return $mdMedia;\n\n  function $mdMedia(query) {\n    var validated = queries[query];\n    if (angular.isUndefined(validated)) {\n      validated = queries[query] = validate(query);\n    }\n\n    var result = results[validated];\n    if (angular.isUndefined(result)) {\n      result = add(validated);\n    }\n\n    return result;\n  }\n\n  function validate(query) {\n    return $mdConstant.MEDIA[query] ||\n           ((query.charAt(0) !== '(') ? ('(' + query + ')') : query);\n  }\n\n  function add(query) {\n    var result = mqls[query];\n    if ( !result ) {\n      result = mqls[query] = $window.matchMedia(query);\n    }\n\n    result.addListener(onQueryChange);\n    return (results[result.media] = !!result.matches);\n  }\n\n  function onQueryChange(query) {\n    $rootScope.$evalAsync(function() {\n      results[query.media] = !!query.matches;\n    });\n  }\n\n  function getQuery(name) {\n    return mqls[name];\n  }\n\n  function getResponsiveAttribute(attrs, attrName) {\n    for (var i = 0; i < $mdConstant.MEDIA_PRIORITY.length; i++) {\n      var mediaName = $mdConstant.MEDIA_PRIORITY[i];\n      if (!mqls[queries[mediaName]].matches) {\n        continue;\n      }\n\n      var normalizedName = getNormalizedName(attrs, attrName + '-' + mediaName);\n      if (attrs[normalizedName]) {\n        return attrs[normalizedName];\n      }\n    }\n\n    // fallback on unprefixed\n    return attrs[getNormalizedName(attrs, attrName)];\n  }\n\n  function watchResponsiveAttributes(attrNames, attrs, watchFn) {\n    var unwatchFns = [];\n    attrNames.forEach(function(attrName) {\n      var normalizedName = getNormalizedName(attrs, attrName);\n      if (angular.isDefined(attrs[normalizedName])) {\n        unwatchFns.push(\n            attrs.$observe(normalizedName, angular.bind(void 0, watchFn, null)));\n      }\n\n      for (var mediaName in $mdConstant.MEDIA) {\n        normalizedName = getNormalizedName(attrs, attrName + '-' + mediaName);\n        if (angular.isDefined(attrs[normalizedName])) {\n          unwatchFns.push(\n              attrs.$observe(normalizedName, angular.bind(void 0, watchFn, mediaName)));\n        }\n      }\n    });\n\n    return function unwatch() {\n      unwatchFns.forEach(function(fn) { fn(); });\n    };\n  }\n\n  // Improves performance dramatically\n  function getNormalizedName(attrs, attrName) {\n    return normalizeCache[attrName] ||\n        (normalizeCache[attrName] = attrs.$normalize(attrName));\n  }\n}\n\n})();\n(function(){\n\"use strict\";\n\nangular\n  .module('material.core')\n  .config( [\"$provide\", function($provide) {\n    $provide.decorator('$mdUtil', ['$delegate', function ($delegate) {\n\n      // Inject the prefixer into our original $mdUtil service.\n      $delegate.prefixer = MdPrefixer;\n\n      return $delegate;\n    }]);\n  }]);\n\nfunction MdPrefixer(initialAttributes, buildSelector) {\n  var PREFIXES = ['data', 'x'];\n\n  if (initialAttributes) {\n    // The prefixer also accepts attributes as a parameter, and immediately builds a list or selector for\n    // the specified attributes.\n    return buildSelector ? _buildSelector(initialAttributes) : _buildList(initialAttributes);\n  }\n\n  return {\n    buildList: _buildList,\n    buildSelector: _buildSelector,\n    hasAttribute: _hasAttribute,\n    removeAttribute: _removeAttribute\n  };\n\n  function _buildList(attributes) {\n    attributes = angular.isArray(attributes) ? attributes : [attributes];\n\n    attributes.forEach(function(item) {\n      PREFIXES.forEach(function(prefix) {\n        attributes.push(prefix + '-' + item);\n      });\n    });\n\n    return attributes;\n  }\n\n  function _buildSelector(attributes) {\n    attributes = angular.isArray(attributes) ? attributes : [attributes];\n\n    return _buildList(attributes)\n      .map(function(item) {\n        return '[' + item + ']';\n      })\n      .join(',');\n  }\n\n  function _hasAttribute(element, attribute) {\n    element = _getNativeElement(element);\n\n    if (!element) {\n      return false;\n    }\n\n    var prefixedAttrs = _buildList(attribute);\n\n    for (var i = 0; i < prefixedAttrs.length; i++) {\n      if (element.hasAttribute(prefixedAttrs[i])) {\n        return true;\n      }\n    }\n\n    return false;\n  }\n\n  function _removeAttribute(element, attribute) {\n    element = _getNativeElement(element);\n\n    if (!element) {\n      return;\n    }\n\n    _buildList(attribute).forEach(function(prefixedAttribute) {\n      element.removeAttribute(prefixedAttribute);\n    });\n  }\n\n  /**\n   * Transforms a jqLite or DOM element into a HTML element.\n   * This is useful when supporting jqLite elements and DOM elements at\n   * same time.\n   * @param element {JQLite|Element} Element to be parsed\n   * @returns {HTMLElement} Parsed HTMLElement\n   */\n  function _getNativeElement(element) {\n    element =  element[0] || element;\n\n    if (element.nodeType) {\n      return element;\n    }\n  }\n\n}\n\n})();\n(function(){\n\"use strict\";\n\n/*\n * This var has to be outside the angular factory, otherwise when\n * there are multiple material apps on the same page, each app\n * will create its own instance of this array and the app's IDs\n * will not be unique.\n */\nUtilFactory.$inject = [\"$document\", \"$timeout\", \"$compile\", \"$rootScope\", \"$$mdAnimate\", \"$interpolate\", \"$log\", \"$rootElement\", \"$window\", \"$$rAF\"];\nvar nextUniqueId = 0;\n\n/**\n * @ngdoc module\n * @name material.core.util\n * @description\n * Util\n */\nangular\n  .module('material.core')\n  .factory('$mdUtil', UtilFactory);\n\n/**\n * @ngInject\n */\nfunction UtilFactory($document, $timeout, $compile, $rootScope, $$mdAnimate, $interpolate, $log, $rootElement, $window, $$rAF) {\n  // Setup some core variables for the processTemplate method\n  var startSymbol = $interpolate.startSymbol(),\n    endSymbol = $interpolate.endSymbol(),\n    usesStandardSymbols = ((startSymbol === '{{') && (endSymbol === '}}'));\n\n  /**\n   * Checks if the target element has the requested style by key\n   * @param {DOMElement|JQLite} target Target element\n   * @param {string} key Style key\n   * @param {string=} expectedVal Optional expected value\n   * @returns {boolean} Whether the target element has the style or not\n   */\n  var hasComputedStyle = function (target, key, expectedVal) {\n    var hasValue = false;\n\n    if ( target && target.length  ) {\n      var computedStyles = $window.getComputedStyle(target[0]);\n      hasValue = angular.isDefined(computedStyles[key]) && (expectedVal ? computedStyles[key] == expectedVal : true);\n    }\n\n    return hasValue;\n  };\n\n  function validateCssValue(value) {\n    return !value       ? '0'   :\n      hasPx(value) || hasPercent(value) ? value : value + 'px';\n  }\n\n  function hasPx(value) {\n    return String(value).indexOf('px') > -1;\n  }\n\n  function hasPercent(value) {\n    return String(value).indexOf('%') > -1;\n\n  }\n\n  var $mdUtil = {\n    dom: {},\n    now: window.performance && window.performance.now ?\n      angular.bind(window.performance, window.performance.now) : Date.now || function() {\n      return new Date().getTime();\n    },\n\n    /**\n     * Cross-version compatibility method to retrieve an option of a ngModel controller,\n     * which supports the breaking changes in the AngularJS snapshot (SHA 87a2ff76af5d0a9268d8eb84db5755077d27c84c).\n     * @param {!angular.ngModelCtrl} ngModelCtrl\n     * @param {!string} optionName\n     * @returns {Object|undefined}\n     */\n    getModelOption: function (ngModelCtrl, optionName) {\n      if (!ngModelCtrl.$options) {\n        return;\n      }\n\n      var $options = ngModelCtrl.$options;\n\n      // The newer versions of AngularJS introduced a `getOption function and made the option values no longer\n      // visible on the $options object.\n      return $options.getOption ? $options.getOption(optionName) : $options[optionName]\n    },\n\n    /**\n     * Bi-directional accessor/mutator used to easily update an element's\n     * property based on the current 'dir'ectional value.\n     */\n    bidi : function(element, property, lValue, rValue) {\n      var ltr = !($document[0].dir == 'rtl' || $document[0].body.dir == 'rtl');\n\n      // If accessor\n      if ( arguments.length == 0 ) return ltr ? 'ltr' : 'rtl';\n\n      // If mutator\n      var elem = angular.element(element);\n\n      if ( ltr && angular.isDefined(lValue)) {\n        elem.css(property, validateCssValue(lValue));\n      }\n      else if ( !ltr && angular.isDefined(rValue)) {\n        elem.css(property, validateCssValue(rValue) );\n      }\n    },\n\n    bidiProperty: function (element, lProperty, rProperty, value) {\n      var ltr = !($document[0].dir == 'rtl' || $document[0].body.dir == 'rtl');\n\n      var elem = angular.element(element);\n\n      if ( ltr && angular.isDefined(lProperty)) {\n        elem.css(lProperty, validateCssValue(value));\n        elem.css(rProperty, '');\n      }\n      else if ( !ltr && angular.isDefined(rProperty)) {\n        elem.css(rProperty, validateCssValue(value) );\n        elem.css(lProperty, '');\n      }\n    },\n\n    clientRect: function(element, offsetParent, isOffsetRect) {\n      var node = getNode(element);\n      offsetParent = getNode(offsetParent || node.offsetParent || document.body);\n      var nodeRect = node.getBoundingClientRect();\n\n      // The user can ask for an offsetRect: a rect relative to the offsetParent,\n      // or a clientRect: a rect relative to the page\n      var offsetRect = isOffsetRect ?\n        offsetParent.getBoundingClientRect() :\n      {left: 0, top: 0, width: 0, height: 0};\n      return {\n        left: nodeRect.left - offsetRect.left,\n        top: nodeRect.top - offsetRect.top,\n        width: nodeRect.width,\n        height: nodeRect.height\n      };\n    },\n    offsetRect: function(element, offsetParent) {\n      return $mdUtil.clientRect(element, offsetParent, true);\n    },\n\n    // Annoying method to copy nodes to an array, thanks to IE\n    nodesToArray: function(nodes) {\n      nodes = nodes || [];\n\n      var results = [];\n      for (var i = 0; i < nodes.length; ++i) {\n        results.push(nodes.item(i));\n      }\n      return results;\n    },\n\n    /**\n     * Determines the absolute position of the viewport.\n     * Useful when making client rectangles absolute.\n     * @returns {number}\n     */\n    getViewportTop: function() {\n      return window.scrollY || window.pageYOffset || 0;\n    },\n\n    /**\n     * Finds the proper focus target by searching the DOM.\n     *\n     * @param containerEl\n     * @param attributeVal\n     * @returns {*}\n     */\n    findFocusTarget: function(containerEl, attributeVal) {\n      var AUTO_FOCUS = this.prefixer('md-autofocus', true);\n      var elToFocus;\n\n      elToFocus = scanForFocusable(containerEl, attributeVal || AUTO_FOCUS);\n\n      if ( !elToFocus && attributeVal != AUTO_FOCUS) {\n        // Scan for deprecated attribute\n        elToFocus = scanForFocusable(containerEl, this.prefixer('md-auto-focus', true));\n\n        if ( !elToFocus ) {\n          // Scan for fallback to 'universal' API\n          elToFocus = scanForFocusable(containerEl, AUTO_FOCUS);\n        }\n      }\n\n      return elToFocus;\n\n      /**\n       * Can target and nested children for specified Selector (attribute)\n       * whose value may be an expression that evaluates to True/False.\n       */\n      function scanForFocusable(target, selector) {\n        var elFound, items = target[0].querySelectorAll(selector);\n\n        // Find the last child element with the focus attribute\n        if ( items && items.length ){\n          items.length && angular.forEach(items, function(it) {\n            it = angular.element(it);\n\n            // Check the element for the md-autofocus class to ensure any associated expression\n            // evaluated to true.\n            var isFocusable = it.hasClass('md-autofocus');\n            if (isFocusable) elFound = it;\n          });\n        }\n        return elFound;\n      }\n    },\n\n    /**\n     * Disables scroll around the passed parent element.\n     * @param element Unused\n     * @param {!Element|!angular.JQLite} parent Element to disable scrolling within.\n     *   Defaults to body if none supplied.\n     * @param options Object of options to modify functionality\n     *   - disableScrollMask Boolean of whether or not to create a scroll mask element or\n     *     use the passed parent element.\n     */\n    disableScrollAround: function(element, parent, options) {\n      options = options || {};\n\n      $mdUtil.disableScrollAround._count = Math.max(0, $mdUtil.disableScrollAround._count || 0);\n      $mdUtil.disableScrollAround._count++;\n\n      if ($mdUtil.disableScrollAround._restoreScroll) {\n        return $mdUtil.disableScrollAround._restoreScroll;\n      }\n\n      var body = $document[0].body;\n      var restoreBody = disableBodyScroll();\n      var restoreElement = disableElementScroll(parent);\n\n      return $mdUtil.disableScrollAround._restoreScroll = function() {\n        if (--$mdUtil.disableScrollAround._count <= 0) {\n          restoreBody();\n          restoreElement();\n          delete $mdUtil.disableScrollAround._restoreScroll;\n        }\n      };\n\n      /**\n       * Creates a virtual scrolling mask to prevent touchmove, keyboard, scrollbar clicking,\n       * and wheel events\n       */\n      function disableElementScroll(element) {\n        element = angular.element(element || body);\n\n        var scrollMask;\n\n        if (options.disableScrollMask) {\n          scrollMask = element;\n        } else {\n          scrollMask = angular.element(\n            '<div class=\"md-scroll-mask\">' +\n            '  <div class=\"md-scroll-mask-bar\"></div>' +\n            '</div>');\n          element.append(scrollMask);\n        }\n\n        scrollMask.on('wheel', preventDefault);\n        scrollMask.on('touchmove', preventDefault);\n\n        return function restoreElementScroll() {\n          scrollMask.off('wheel');\n          scrollMask.off('touchmove');\n\n          if (!options.disableScrollMask) {\n            scrollMask[0].parentNode.removeChild(scrollMask[0]);\n          }\n        };\n\n        function preventDefault(e) {\n          e.preventDefault();\n        }\n      }\n\n      // Converts the body to a position fixed block and translate it to the proper scroll position\n      function disableBodyScroll() {\n        var documentElement = $document[0].documentElement;\n\n        var prevDocumentStyle = documentElement.style.cssText || '';\n        var prevBodyStyle = body.style.cssText || '';\n\n        var viewportTop = $mdUtil.getViewportTop();\n        var clientWidth = body.clientWidth;\n        var hasVerticalScrollbar = body.scrollHeight > body.clientHeight + 1;\n\n        if (hasVerticalScrollbar) {\n          angular.element(body).css({\n            position: 'fixed',\n            width: '100%',\n            top: -viewportTop + 'px'\n          });\n        }\n\n        if (body.clientWidth < clientWidth) {\n          body.style.overflow = 'hidden';\n        }\n\n        // This should be applied after the manipulation to the body, because\n        // adding a scrollbar can potentially resize it, causing the measurement\n        // to change.\n        if (hasVerticalScrollbar) {\n          documentElement.style.overflowY = 'scroll';\n        }\n\n        return function restoreScroll() {\n          // Reset the inline style CSS to the previous.\n          body.style.cssText = prevBodyStyle;\n          documentElement.style.cssText = prevDocumentStyle;\n\n          // The body loses its scroll position while being fixed.\n          body.scrollTop = viewportTop;\n        };\n      }\n\n    },\n\n    enableScrolling: function() {\n      var restoreFn = this.disableScrollAround._restoreScroll;\n      restoreFn && restoreFn();\n    },\n\n    floatingScrollbars: function() {\n      if (this.floatingScrollbars.cached === undefined) {\n        var tempNode = angular.element('<div><div></div></div>').css({\n          width: '100%',\n          'z-index': -1,\n          position: 'absolute',\n          height: '35px',\n          'overflow-y': 'scroll'\n        });\n        tempNode.children().css('height', '60px');\n\n        $document[0].body.appendChild(tempNode[0]);\n        this.floatingScrollbars.cached = (tempNode[0].offsetWidth == tempNode[0].childNodes[0].offsetWidth);\n        tempNode.remove();\n      }\n      return this.floatingScrollbars.cached;\n    },\n\n    // Mobile safari only allows you to set focus in click event listeners...\n    forceFocus: function(element) {\n      var node = element[0] || element;\n\n      document.addEventListener('click', function focusOnClick(ev) {\n        if (ev.target === node && ev.$focus) {\n          node.focus();\n          ev.stopImmediatePropagation();\n          ev.preventDefault();\n          node.removeEventListener('click', focusOnClick);\n        }\n      }, true);\n\n      var newEvent = document.createEvent('MouseEvents');\n      newEvent.initMouseEvent('click', false, true, window, {}, 0, 0, 0, 0,\n        false, false, false, false, 0, null);\n      newEvent.$material = true;\n      newEvent.$focus = true;\n      node.dispatchEvent(newEvent);\n    },\n\n    /**\n     * facade to build md-backdrop element with desired styles\n     * NOTE: Use $compile to trigger backdrop postLink function\n     */\n    createBackdrop: function(scope, addClass) {\n      return $compile($mdUtil.supplant('<md-backdrop class=\"{0}\">', [addClass]))(scope);\n    },\n\n    /**\n     * supplant() method from Crockford's `Remedial Javascript`\n     * Equivalent to use of $interpolate; without dependency on\n     * interpolation symbols and scope. Note: the '{<token>}' can\n     * be property names, property chains, or array indices.\n     */\n    supplant: function(template, values, pattern) {\n      pattern = pattern || /\\{([^\\{\\}]*)\\}/g;\n      return template.replace(pattern, function(a, b) {\n        var p = b.split('.'),\n          r = values;\n        try {\n          for (var s in p) {\n            if (p.hasOwnProperty(s) ) {\n              r = r[p[s]];\n            }\n          }\n        } catch (e) {\n          r = a;\n        }\n        return (typeof r === 'string' || typeof r === 'number') ? r : a;\n      });\n    },\n\n    fakeNgModel: function() {\n      return {\n        $fake: true,\n        $setTouched: angular.noop,\n        $setViewValue: function(value) {\n          this.$viewValue = value;\n          this.$render(value);\n          this.$viewChangeListeners.forEach(function(cb) {\n            cb();\n          });\n        },\n        $isEmpty: function(value) {\n          return ('' + value).length === 0;\n        },\n        $parsers: [],\n        $formatters: [],\n        $viewChangeListeners: [],\n        $render: angular.noop\n      };\n    },\n\n    // Returns a function, that, as long as it continues to be invoked, will not\n    // be triggered. The function will be called after it stops being called for\n    // N milliseconds.\n    // @param wait Integer value of msecs to delay (since last debounce reset); default value 10 msecs\n    // @param invokeApply should the $timeout trigger $digest() dirty checking\n    debounce: function(func, wait, scope, invokeApply) {\n      var timer;\n\n      return function debounced() {\n        var context = scope,\n          args = Array.prototype.slice.call(arguments);\n\n        $timeout.cancel(timer);\n        timer = $timeout(function() {\n\n          timer = undefined;\n          func.apply(context, args);\n\n        }, wait || 10, invokeApply);\n      };\n    },\n\n    // Returns a function that can only be triggered every `delay` milliseconds.\n    // In other words, the function will not be called unless it has been more\n    // than `delay` milliseconds since the last call.\n    throttle: function throttle(func, delay) {\n      var recent;\n      return function throttled() {\n        var context = this;\n        var args = arguments;\n        var now = $mdUtil.now();\n\n        if (!recent || (now - recent > delay)) {\n          func.apply(context, args);\n          recent = now;\n        }\n      };\n    },\n\n    /**\n     * Measures the number of milliseconds taken to run the provided callback\n     * function. Uses a high-precision timer if available.\n     */\n    time: function time(cb) {\n      var start = $mdUtil.now();\n      cb();\n      return $mdUtil.now() - start;\n    },\n\n    /**\n     * Create an implicit getter that caches its `getter()`\n     * lookup value\n     */\n    valueOnUse : function (scope, key, getter) {\n      var value = null, args = Array.prototype.slice.call(arguments);\n      var params = (args.length > 3) ? args.slice(3) : [ ];\n\n      Object.defineProperty(scope, key, {\n        get: function () {\n          if (value === null) value = getter.apply(scope, params);\n          return value;\n        }\n      });\n    },\n\n    /**\n     * Get a unique ID.\n     *\n     * @returns {string} an unique numeric string\n     */\n    nextUid: function() {\n      return '' + nextUniqueId++;\n    },\n\n    // Stop watchers and events from firing on a scope without destroying it,\n    // by disconnecting it from its parent and its siblings' linked lists.\n    disconnectScope: function disconnectScope(scope) {\n      if (!scope) return;\n\n      // we can't destroy the root scope or a scope that has been already destroyed\n      if (scope.$root === scope) return;\n      if (scope.$$destroyed) return;\n\n      var parent = scope.$parent;\n      scope.$$disconnected = true;\n\n      // See Scope.$destroy\n      if (parent.$$childHead === scope) parent.$$childHead = scope.$$nextSibling;\n      if (parent.$$childTail === scope) parent.$$childTail = scope.$$prevSibling;\n      if (scope.$$prevSibling) scope.$$prevSibling.$$nextSibling = scope.$$nextSibling;\n      if (scope.$$nextSibling) scope.$$nextSibling.$$prevSibling = scope.$$prevSibling;\n\n      scope.$$nextSibling = scope.$$prevSibling = null;\n\n    },\n\n    // Undo the effects of disconnectScope above.\n    reconnectScope: function reconnectScope(scope) {\n      if (!scope) return;\n\n      // we can't disconnect the root node or scope already disconnected\n      if (scope.$root === scope) return;\n      if (!scope.$$disconnected) return;\n\n      var child = scope;\n\n      var parent = child.$parent;\n      child.$$disconnected = false;\n      // See Scope.$new for this logic...\n      child.$$prevSibling = parent.$$childTail;\n      if (parent.$$childHead) {\n        parent.$$childTail.$$nextSibling = child;\n        parent.$$childTail = child;\n      } else {\n        parent.$$childHead = parent.$$childTail = child;\n      }\n    },\n\n    /*\n     * getClosest replicates jQuery.closest() to walk up the DOM tree until it finds a matching nodeName\n     *\n     * @param el Element to start walking the DOM from\n     * @param check Either a string or a function. If a string is passed, it will be evaluated against\n     * each of the parent nodes' tag name. If a function is passed, the loop will call it with each of\n     * the parents and will use the return value to determine whether the node is a match.\n     * @param onlyParent Only start checking from the parent element, not `el`.\n     */\n    getClosest: function getClosest(el, validateWith, onlyParent) {\n      if ( angular.isString(validateWith) ) {\n        var tagName = validateWith.toUpperCase();\n        validateWith = function(el) {\n          return el.nodeName.toUpperCase() === tagName;\n        };\n      }\n\n      if (el instanceof angular.element) el = el[0];\n      if (onlyParent) el = el.parentNode;\n      if (!el) return null;\n\n      do {\n        if (validateWith(el)) {\n          return el;\n        }\n      } while (el = el.parentNode);\n\n      return null;\n    },\n\n    /**\n     * Build polyfill for the Node.contains feature (if needed)\n     */\n    elementContains: function(node, child) {\n      var hasContains = (window.Node && window.Node.prototype && Node.prototype.contains);\n      var findFn = hasContains ? angular.bind(node, node.contains) : angular.bind(node, function(arg) {\n        // compares the positions of two nodes and returns a bitmask\n        return (node === child) || !!(this.compareDocumentPosition(arg) & 16)\n      });\n\n      return findFn(child);\n    },\n\n    /**\n     * Functional equivalent for $element.filter(‘md-bottom-sheet’)\n     * useful with interimElements where the element and its container are important...\n     *\n     * @param {[]} elements to scan\n     * @param {string} name of node to find (e.g. 'md-dialog')\n     * @param {boolean=} optional flag to allow deep scans; defaults to 'false'.\n     * @param {boolean=} optional flag to enable log warnings; defaults to false\n     */\n    extractElementByName: function(element, nodeName, scanDeep, warnNotFound) {\n      var found = scanTree(element);\n      if (!found && !!warnNotFound) {\n        $log.warn( $mdUtil.supplant(\"Unable to find node '{0}' in element '{1}'.\",[nodeName, element[0].outerHTML]) );\n      }\n\n      return angular.element(found || element);\n\n      /**\n       * Breadth-First tree scan for element with matching `nodeName`\n       */\n      function scanTree(element) {\n        return scanLevel(element) || (!!scanDeep ? scanChildren(element) : null);\n      }\n\n      /**\n       * Case-insensitive scan of current elements only (do not descend).\n       */\n      function scanLevel(element) {\n        if ( element ) {\n          for (var i = 0, len = element.length; i < len; i++) {\n            if (element[i].nodeName.toLowerCase() === nodeName) {\n              return element[i];\n            }\n          }\n        }\n        return null;\n      }\n\n      /**\n       * Scan children of specified node\n       */\n      function scanChildren(element) {\n        var found;\n        if ( element ) {\n          for (var i = 0, len = element.length; i < len; i++) {\n            var target = element[i];\n            if ( !found ) {\n              for (var j = 0, numChild = target.childNodes.length; j < numChild; j++) {\n                found = found || scanTree([target.childNodes[j]]);\n              }\n            }\n          }\n        }\n        return found;\n      }\n\n    },\n\n    /**\n     * Give optional properties with no value a boolean true if attr provided or false otherwise\n     */\n    initOptionalProperties: function(scope, attr, defaults) {\n      defaults = defaults || {};\n      angular.forEach(scope.$$isolateBindings, function(binding, key) {\n        if (binding.optional && angular.isUndefined(scope[key])) {\n          var attrIsDefined = angular.isDefined(attr[binding.attrName]);\n          scope[key] = angular.isDefined(defaults[key]) ? defaults[key] : attrIsDefined;\n        }\n      });\n    },\n\n    /**\n     * Alternative to $timeout calls with 0 delay.\n     * nextTick() coalesces all calls within a single frame\n     * to minimize $digest thrashing\n     *\n     * @param callback\n     * @param digest\n     * @returns {*}\n     */\n    nextTick: function(callback, digest, scope) {\n      //-- grab function reference for storing state details\n      var nextTick = $mdUtil.nextTick;\n      var timeout = nextTick.timeout;\n      var queue = nextTick.queue || [];\n\n      //-- add callback to the queue\n      queue.push({scope: scope, callback: callback});\n\n      //-- set default value for digest\n      if (digest == null) digest = true;\n\n      //-- store updated digest/queue values\n      nextTick.digest = nextTick.digest || digest;\n      nextTick.queue = queue;\n\n      //-- either return existing timeout or create a new one\n      return timeout || (nextTick.timeout = $timeout(processQueue, 0, false));\n\n      /**\n       * Grab a copy of the current queue\n       * Clear the queue for future use\n       * Process the existing queue\n       * Trigger digest if necessary\n       */\n      function processQueue() {\n        var queue = nextTick.queue;\n        var digest = nextTick.digest;\n\n        nextTick.queue = [];\n        nextTick.timeout = null;\n        nextTick.digest = false;\n\n        queue.forEach(function(queueItem) {\n          var skip = queueItem.scope && queueItem.scope.$$destroyed;\n          if (!skip) {\n            queueItem.callback();\n          }\n        });\n\n        if (digest) $rootScope.$digest();\n      }\n    },\n\n    /**\n     * Processes a template and replaces the start/end symbols if the application has\n     * overriden them.\n     *\n     * @param template The template to process whose start/end tags may be replaced.\n     * @returns {*}\n     */\n    processTemplate: function(template) {\n      if (usesStandardSymbols) {\n        return template;\n      } else {\n        if (!template || !angular.isString(template)) return template;\n        return template.replace(/\\{\\{/g, startSymbol).replace(/}}/g, endSymbol);\n      }\n    },\n\n    /**\n     * Scan up dom hierarchy for enabled parent;\n     */\n    getParentWithPointerEvents: function (element) {\n      var parent = element.parent();\n\n      // jqLite might return a non-null, but still empty, parent; so check for parent and length\n      while (hasComputedStyle(parent, 'pointer-events', 'none')) {\n        parent = parent.parent();\n      }\n\n      return parent;\n    },\n\n    getNearestContentElement: function (element) {\n      var current = element.parent()[0];\n      // Look for the nearest parent md-content, stopping at the rootElement.\n      while (current && current !== $rootElement[0] && current !== document.body && current.nodeName.toUpperCase() !== 'MD-CONTENT') {\n        current = current.parentNode;\n      }\n      return current;\n    },\n\n    /**\n     * Checks if the current browser is natively supporting the `sticky` position.\n     * @returns {string} supported sticky property name\n     */\n    checkStickySupport: function() {\n      var stickyProp;\n      var testEl = angular.element('<div>');\n      $document[0].body.appendChild(testEl[0]);\n\n      var stickyProps = ['sticky', '-webkit-sticky'];\n      for (var i = 0; i < stickyProps.length; ++i) {\n        testEl.css({\n          position: stickyProps[i],\n          top: 0,\n          'z-index': 2\n        });\n\n        if (testEl.css('position') == stickyProps[i]) {\n          stickyProp = stickyProps[i];\n          break;\n        }\n      }\n\n      testEl.remove();\n\n      return stickyProp;\n    },\n\n    /**\n     * Parses an attribute value, mostly a string.\n     * By default checks for negated values and returns `false´ if present.\n     * Negated values are: (native falsy) and negative strings like:\n     * `false` or `0`.\n     * @param value Attribute value which should be parsed.\n     * @param negatedCheck When set to false, won't check for negated values.\n     * @returns {boolean}\n     */\n    parseAttributeBoolean: function(value, negatedCheck) {\n      return value === '' || !!value && (negatedCheck === false || value !== 'false' && value !== '0');\n    },\n\n    hasComputedStyle: hasComputedStyle,\n\n    /**\n     * Returns true if the parent form of the element has been submitted.\n     *\n     * @param element An AngularJS or HTML5 element.\n     *\n     * @returns {boolean}\n     */\n    isParentFormSubmitted: function(element) {\n      var parent = $mdUtil.getClosest(element, 'form');\n      var form = parent ? angular.element(parent).controller('form') : null;\n\n      return form ? form.$submitted : false;\n    },\n\n    /**\n     * Animate the requested element's scrollTop to the requested scrollPosition with basic easing.\n     *\n     * @param {!HTMLElement} element The element to scroll.\n     * @param {number} scrollEnd The new/final scroll position.\n     * @param {number=} duration Duration of the scroll. Default is 1000ms.\n     */\n    animateScrollTo: function(element, scrollEnd, duration) {\n      var scrollStart = element.scrollTop;\n      var scrollChange = scrollEnd - scrollStart;\n      var scrollingDown = scrollStart < scrollEnd;\n      var startTime = $mdUtil.now();\n\n      $$rAF(scrollChunk);\n\n      function scrollChunk() {\n        var newPosition = calculateNewPosition();\n\n        element.scrollTop = newPosition;\n\n        if (scrollingDown ? newPosition < scrollEnd : newPosition > scrollEnd) {\n          $$rAF(scrollChunk);\n        }\n      }\n\n      function calculateNewPosition() {\n        var easeDuration = duration || 1000;\n        var currentTime = $mdUtil.now() - startTime;\n\n        return ease(currentTime, scrollStart, scrollChange, easeDuration);\n      }\n\n      function ease(currentTime, start, change, duration) {\n        // If the duration has passed (which can occur if our app loses focus due to $$rAF), jump\n        // straight to the proper position\n        if (currentTime > duration) {\n          return start + change;\n        }\n\n        var ts = (currentTime /= duration) * currentTime;\n        var tc = ts * currentTime;\n\n        return start + change * (-2 * tc + 3 * ts);\n      }\n    },\n\n    /**\n     * Provides an easy mechanism for removing duplicates from an array.\n     *\n     *    var myArray = [1, 2, 2, 3, 3, 3, 4, 4, 4, 4];\n     *\n     *    $mdUtil.uniq(myArray) => [1, 2, 3, 4]\n     *\n     * @param {array} array The array whose unique values should be returned.\n     *\n     * @returns {array} A copy of the array containing only unique values.\n     */\n    uniq: function(array) {\n      if (!array) { return; }\n\n      return array.filter(function(value, index, self) {\n        return self.indexOf(value) === index;\n      });\n    }\n  };\n\n\n// Instantiate other namespace utility methods\n\n  $mdUtil.dom.animator = $$mdAnimate($mdUtil);\n\n  return $mdUtil;\n\n  function getNode(el) {\n    return el[0] || el;\n  }\n\n}\n\n/*\n * Since removing jQuery from the demos, some code that uses `element.focus()` is broken.\n * We need to add `element.focus()`, because it's testable unlike `element[0].focus`.\n */\n\nangular.element.prototype.focus = angular.element.prototype.focus || function() {\n    if (this.length) {\n      this[0].focus();\n    }\n    return this;\n  };\nangular.element.prototype.blur = angular.element.prototype.blur || function() {\n    if (this.length) {\n      this[0].blur();\n    }\n    return this;\n  };\n\n})();\n(function(){\n\"use strict\";\n\n/**\n * @ngdoc module\n * @name material.core.compiler\n * @description\n * AngularJS Material template and element compiler.\n */\nMdCompilerService.$inject = [\"$q\", \"$templateRequest\", \"$injector\", \"$compile\", \"$controller\"];\nangular\n  .module('material.core')\n  .service('$mdCompiler', MdCompilerService);\n\n/**\n * @ngdoc service\n * @name $mdCompiler\n * @module material.core.compiler\n * @description\n * The $mdCompiler service is an abstraction of AngularJS's compiler, that allows developers\n * to easily compile an element with options like in a Directive Definition Object.\n *\n * > The compiler powers a lot of components inside of AngularJS Material.\n * > Like the `$mdPanel` or `$mdDialog`.\n *\n * @usage\n *\n * Basic Usage with a template\n *\n * <hljs lang=\"js\">\n *   $mdCompiler.compile({\n *     templateUrl: 'modal.html',\n *     controller: 'ModalCtrl',\n *     locals: {\n *       modal: myModalInstance;\n *     }\n *   }).then(function (compileData) {\n *     compileData.element; // Compiled DOM element\n *     compileData.link(myScope); // Instantiate controller and link element to scope.\n *   });\n * </hljs>\n *\n * Example with a content element\n *\n * <hljs lang=\"js\">\n *\n *   // Create a virtual element and link it manually.\n *   // The compiler doesn't need to recompile the element each time.\n *   var myElement = $compile('<span>Test</span>')(myScope);\n *\n *   $mdCompiler.compile({\n *     contentElement: myElement\n *   }).then(function (compileData) {\n *     compileData.element // Content Element (same as above)\n *     compileData.link // This does nothing when using a contentElement.\n *   });\n * </hljs>\n *\n * > Content Element is a significant performance improvement when the developer already knows that the\n * > compiled element will be always the same and the scope will not change either.\n *\n * The `contentElement` option also supports DOM elements which will be temporary removed and restored\n * at its old position.\n *\n * <hljs lang=\"js\">\n *   var domElement = document.querySelector('#myElement');\n *\n *   $mdCompiler.compile({\n *     contentElement: myElement\n *   }).then(function (compileData) {\n *     compileData.element // Content Element (same as above)\n *     compileData.link // This does nothing when using a contentElement.\n *   });\n * </hljs>\n *\n * The `$mdCompiler` can also query for the element in the DOM itself.\n *\n * <hljs lang=\"js\">\n *   $mdCompiler.compile({\n *     contentElement: '#myElement'\n *   }).then(function (compileData) {\n *     compileData.element // Content Element (same as above)\n *     compileData.link // This does nothing when using a contentElement.\n *   });\n * </hljs>\n *\n */\nfunction MdCompilerService($q, $templateRequest, $injector, $compile, $controller) {\n  /** @private @const {!angular.$q} */\n  this.$q = $q;\n\n  /** @private @const {!angular.$templateRequest} */\n  this.$templateRequest = $templateRequest;\n\n  /** @private @const {!angular.$injector} */\n  this.$injector = $injector;\n\n  /** @private @const {!angular.$compile} */\n  this.$compile = $compile;\n\n  /** @private @const {!angular.$controller} */\n  this.$controller = $controller;\n}\n\n/**\n * @ngdoc method\n * @name $mdCompiler#compile\n * @description\n *\n * A method to compile a HTML template with the AngularJS compiler.\n * The `$mdCompiler` is wrapper around the AngularJS compiler and provides extra functionality\n * like controller instantiation or async resolves.\n *\n * @param {!Object} options An options object, with the following properties:\n *\n *    - `controller` - `{string|Function}` Controller fn that should be associated with\n *         newly created scope or the name of a registered controller if passed as a string.\n *    - `controllerAs` - `{string=}` A controller alias name. If present the controller will be\n *         published to scope under the `controllerAs` name.\n *    - `contentElement` - `{string|Element}`: Instead of using a template, which will be\n *         compiled each time, you can also use a DOM element.<br/>\n *    - `template` - `{string=}` An html template as a string.\n *    - `templateUrl` - `{string=}` A path to an html template.\n *    - `transformTemplate` - `{function(template)=}` A function which transforms the template after\n *        it is loaded. It will be given the template string as a parameter, and should\n *        return a a new string representing the transformed template.\n *    - `resolve` - `{Object.<string, function>=}` - An optional map of dependencies which should\n *        be injected into the controller. If any of these dependencies are promises, the compiler\n *        will wait for them all to be resolved, or if one is rejected before the controller is\n *        instantiated `compile()` will fail..\n *      * `key` - `{string}`: a name of a dependency to be injected into the controller.\n *      * `factory` - `{string|function}`: If `string` then it is an alias for a service.\n *        Otherwise if function, then it is injected and the return value is treated as the\n *        dependency. If the result is a promise, it is resolved before its value is\n *        injected into the controller.\n *\n * @returns {Object} promise A promise, which will be resolved with a `compileData` object.\n * `compileData` has the following properties:\n *\n *   - `element` - `{element}`: an uncompiled element matching the provided template.\n *   - `link` - `{function(scope)}`: A link function, which, when called, will compile\n *     the element and instantiate the provided controller (if given).\n *   - `locals` - `{object}`: The locals which will be passed into the controller once `link` is\n *     called. If `bindToController` is true, they will be coppied to the ctrl instead\n *\n */\nMdCompilerService.prototype.compile = function(options) {\n\n  if (options.contentElement) {\n    return this._prepareContentElement(options);\n  } else {\n    return this._compileTemplate(options);\n  }\n\n};\n\n/**\n * Instead of compiling any template, the compiler just fetches an existing HTML element from the DOM and\n * provides a restore function to put the element back it old DOM position.\n * @param {!Object} options Options to be used for the compiler.\n * @private\n */\nMdCompilerService.prototype._prepareContentElement = function(options) {\n\n  var contentElement = this._fetchContentElement(options);\n\n  return this.$q.resolve({\n    element: contentElement.element,\n    cleanup: contentElement.restore,\n    locals: {},\n    link: function() {\n      return contentElement.element;\n    }\n  });\n\n};\n\n/**\n * Compiles a template by considering all options and waiting for all resolves to be ready.\n * @param {!Object} options Compile options\n * @returns {!Object} Compile data with link function.\n * @private\n */\nMdCompilerService.prototype._compileTemplate = function(options) {\n\n  var self = this;\n  var templateUrl = options.templateUrl;\n  var template = options.template || '';\n  var resolve = angular.extend({}, options.resolve);\n  var locals = angular.extend({}, options.locals);\n  var transformTemplate = options.transformTemplate || angular.identity;\n\n  // Take resolve values and invoke them.\n  // Resolves can either be a string (value: 'MyRegisteredAngularConst'),\n  // or an invokable 'factory' of sorts: (value: function ValueGetter($dependency) {})\n  angular.forEach(resolve, function(value, key) {\n    if (angular.isString(value)) {\n      resolve[key] = self.$injector.get(value);\n    } else {\n      resolve[key] = self.$injector.invoke(value);\n    }\n  });\n\n  // Add the locals, which are just straight values to inject\n  // eg locals: { three: 3 }, will inject three into the controller\n  angular.extend(resolve, locals);\n\n  if (templateUrl) {\n    resolve.$$ngTemplate = this.$templateRequest(templateUrl);\n  } else {\n    resolve.$$ngTemplate = this.$q.when(template);\n  }\n\n\n  // Wait for all the resolves to finish if they are promises\n  return this.$q.all(resolve).then(function(locals) {\n\n    var template = transformTemplate(locals.$$ngTemplate, options);\n    var element = options.element || angular.element('<div>').html(template.trim()).contents();\n\n    return self._compileElement(locals, element, options);\n  });\n\n};\n\n/**\n * Method to compile an element with the given options.\n * @param {!Object} locals Locals to be injected to the controller if present\n * @param {!JQLite} element Element to be compiled and linked\n * @param {!Object} options Options to be used for linking.\n * @returns {!Object} Compile data with link function.\n * @private\n */\nMdCompilerService.prototype._compileElement = function(locals, element, options) {\n  var self = this;\n  var ngLinkFn = this.$compile(element);\n\n  var compileData = {\n    element: element,\n    cleanup: element.remove.bind(element),\n    locals: locals,\n    link: linkFn\n  };\n\n  function linkFn(scope) {\n    locals.$scope = scope;\n\n    // Instantiate controller if the developer provided one.\n    if (options.controller) {\n\n      var injectLocals = angular.extend(locals, {\n        $element: element\n      });\n\n      var invokeCtrl = self.$controller(options.controller, injectLocals, true, options.controllerAs);\n\n      if (options.bindToController) {\n        angular.extend(invokeCtrl.instance, locals);\n      }\n\n      var ctrl = invokeCtrl();\n\n      // Unique identifier for AngularJS Route ngView controllers.\n      element.data('$ngControllerController', ctrl);\n      element.children().data('$ngControllerController', ctrl);\n\n      // Expose the instantiated controller to the compile data\n      compileData.controller = ctrl;\n    }\n\n    // Invoke the AngularJS $compile link function.\n    return ngLinkFn(scope);\n  }\n\n  return compileData;\n\n};\n\n/**\n * Fetches an element removing it from the DOM and using it temporary for the compiler.\n * Elements which were fetched will be restored after use.\n * @param {!Object} options Options to be used for the compilation.\n * @returns {{element: !JQLite, restore: !Function}}\n * @private\n */\nMdCompilerService.prototype._fetchContentElement = function(options) {\n\n  var contentEl = options.contentElement;\n  var restoreFn = null;\n\n  if (angular.isString(contentEl)) {\n    contentEl = document.querySelector(contentEl);\n    restoreFn = createRestoreFn(contentEl);\n  } else {\n    contentEl = contentEl[0] || contentEl;\n\n    // When the element is visible in the DOM, then we restore it at close of the dialog.\n    // Otherwise it will be removed from the DOM after close.\n    if (document.contains(contentEl)) {\n      restoreFn = createRestoreFn(contentEl);\n    } else {\n      restoreFn = function() {\n        if (contentEl.parentNode) {\n          contentEl.parentNode.removeChild(contentEl);\n        }\n      }\n    }\n  }\n\n  return {\n    element: angular.element(contentEl),\n    restore: restoreFn\n  };\n\n  function createRestoreFn(element) {\n    var parent = element.parentNode;\n    var nextSibling = element.nextElementSibling;\n\n    return function() {\n      if (!nextSibling) {\n        // When the element didn't had any sibling, then it can be simply appended to the\n        // parent, because it plays no role, which index it had before.\n        parent.appendChild(element);\n      } else {\n        // When the element had a sibling, which marks the previous position of the element\n        // in the DOM, we insert it correctly before the sibling, to have the same index as\n        // before.\n        parent.insertBefore(element, nextSibling);\n      }\n    }\n  }\n};\n\n\n})();\n(function(){\n\"use strict\";\n\n/**\n * @ngdoc module\n * @name material.core.aria\n * @description\n * Aria Expectations for AngularJS Material components.\n */\nMdAriaService.$inject = [\"$$rAF\", \"$log\", \"$window\", \"$interpolate\"];\nangular\n  .module('material.core')\n  .provider('$mdAria', MdAriaProvider);\n\n/**\n * @ngdoc service\n * @name $mdAriaProvider\n * @module material.core.aria\n *\n * @description\n *\n * Modify options of the `$mdAria` service, which will be used by most of the AngularJS Material\n * components.\n *\n * You are able to disable `$mdAria` warnings, by using the following markup.\n *\n * <hljs lang=\"js\">\n *   app.config(function($mdAriaProvider) {\n *     // Globally disables all ARIA warnings.\n *     $mdAriaProvider.disableWarnings();\n *   });\n * </hljs>\n *\n */\nfunction MdAriaProvider() {\n\n  var config = {\n    /** Whether we should show ARIA warnings in the console if labels are missing on the element */\n    showWarnings: true\n  };\n\n  return {\n    disableWarnings: disableWarnings,\n    $get: [\"$$rAF\", \"$log\", \"$window\", \"$interpolate\", function($$rAF, $log, $window, $interpolate) {\n      return MdAriaService.apply(config, arguments);\n    }]\n  };\n\n  /**\n   * @ngdoc method\n   * @name $mdAriaProvider#disableWarnings\n   * @description Disables all ARIA warnings generated by AngularJS Material.\n   */\n  function disableWarnings() {\n    config.showWarnings = false;\n  }\n}\n\n/*\n * @ngInject\n */\nfunction MdAriaService($$rAF, $log, $window, $interpolate) {\n\n  // Load the showWarnings option from the current context and store it inside of a scope variable,\n  // because the context will be probably lost in some function calls.\n  var showWarnings = this.showWarnings;\n\n  return {\n    expect: expect,\n    expectAsync: expectAsync,\n    expectWithText: expectWithText,\n    expectWithoutText: expectWithoutText,\n    getText: getText,\n    hasAriaLabel: hasAriaLabel,\n    parentHasAriaLabel: parentHasAriaLabel\n  };\n\n  /**\n   * Check if expected attribute has been specified on the target element or child\n   * @param element\n   * @param attrName\n   * @param {optional} defaultValue What to set the attr to if no value is found\n   */\n  function expect(element, attrName, defaultValue) {\n\n    var node = angular.element(element)[0] || element;\n\n    // if node exists and neither it nor its children have the attribute\n    if (node &&\n       ((!node.hasAttribute(attrName) ||\n        node.getAttribute(attrName).length === 0) &&\n        !childHasAttribute(node, attrName))) {\n\n      defaultValue = angular.isString(defaultValue) ? defaultValue.trim() : '';\n      if (defaultValue.length) {\n        element.attr(attrName, defaultValue);\n      } else if (showWarnings) {\n        $log.warn('ARIA: Attribute \"', attrName, '\", required for accessibility, is missing on node:', node);\n      }\n\n    }\n  }\n\n  function expectAsync(element, attrName, defaultValueGetter) {\n    // Problem: when retrieving the element's contents synchronously to find the label,\n    // the text may not be defined yet in the case of a binding.\n    // There is a higher chance that a binding will be defined if we wait one frame.\n    $$rAF(function() {\n        expect(element, attrName, defaultValueGetter());\n    });\n  }\n\n  function expectWithText(element, attrName) {\n    var content = getText(element) || \"\";\n    var hasBinding = content.indexOf($interpolate.startSymbol()) > -1;\n\n    if (hasBinding) {\n      expectAsync(element, attrName, function() {\n        return getText(element);\n      });\n    } else {\n      expect(element, attrName, content);\n    }\n  }\n\n  function expectWithoutText(element, attrName) {\n    var content = getText(element);\n    var hasBinding = content.indexOf($interpolate.startSymbol()) > -1;\n\n    if ( !hasBinding && !content) {\n      expect(element, attrName, content);\n    }\n  }\n\n  function getText(element) {\n    element = element[0] || element;\n    var walker = document.createTreeWalker(element, NodeFilter.SHOW_TEXT, null, false);\n    var text = '';\n\n    var node;\n    while (node = walker.nextNode()) {\n      if (!isAriaHiddenNode(node)) {\n        text += node.textContent;\n      }\n    }\n\n    return text.trim() || '';\n\n    function isAriaHiddenNode(node) {\n      while (node.parentNode && (node = node.parentNode) !== element) {\n        if (node.getAttribute && node.getAttribute('aria-hidden') === 'true') {\n          return true;\n        }\n      }\n    }\n  }\n\n  function childHasAttribute(node, attrName) {\n    var hasChildren = node.hasChildNodes(),\n        hasAttr = false;\n\n    function isHidden(el) {\n      var style = el.currentStyle ? el.currentStyle : $window.getComputedStyle(el);\n      return (style.display === 'none');\n    }\n\n    if (hasChildren) {\n      var children = node.childNodes;\n      for (var i=0; i < children.length; i++) {\n        var child = children[i];\n        if (child.nodeType === 1 && child.hasAttribute(attrName)) {\n          if (!isHidden(child)) {\n            hasAttr = true;\n          }\n        }\n      }\n    }\n    return hasAttr;\n  }\n\n  /**\n   * Check if expected element has aria label attribute\n   * @param element\n   */\n  function hasAriaLabel(element) {\n    var node = angular.element(element)[0] || element;\n\n    /* Check if compatible node type (ie: not HTML Document node) */\n    if (!node.hasAttribute) {\n      return false;\n    }\n\n    /* Check label or description attributes */\n    return node.hasAttribute('aria-label') || node.hasAttribute('aria-labelledby') || node.hasAttribute('aria-describedby');\n  }\n\n  /**\n   * Check if expected element's parent has aria label attribute and has valid role and tagName\n   * @param element\n   * @param {optional} level Number of levels deep search should be performed\n   */\n  function parentHasAriaLabel(element, level) {\n    level = level || 1;\n    var node = angular.element(element)[0] || element;\n    if (!node.parentNode) {\n      return false;\n    }\n    if (performCheck(node.parentNode)) {\n      return true;\n    }\n    level--;\n    if (level) {\n      return parentHasAriaLabel(node.parentNode, level);\n    }\n    return false;\n\n    function performCheck(parentNode) {\n      if (!hasAriaLabel(parentNode)) {\n        return false;\n      }\n      /* Perform role blacklist check */\n      if (parentNode.hasAttribute('role')) {\n        switch(parentNode.getAttribute('role').toLowerCase()) {\n          case 'command':\n          case 'definition':\n          case 'directory':\n          case 'grid':\n          case 'list':\n          case 'listitem':\n          case 'log':\n          case 'marquee':\n          case 'menu':\n          case 'menubar':\n          case 'note':\n          case 'presentation':\n          case 'separator':\n          case 'scrollbar':\n          case 'status':\n          case 'tablist':\n            return false;\n        }\n      }\n      /* Perform tagName blacklist check */\n      switch(parentNode.tagName.toLowerCase()) {\n        case 'abbr':\n        case 'acronym':\n        case 'address':\n        case 'applet':\n        case 'audio':\n        case 'b':\n        case 'bdi':\n        case 'bdo':\n        case 'big':\n        case 'blockquote':\n        case 'br':\n        case 'canvas':\n        case 'caption':\n        case 'center':\n        case 'cite':\n        case 'code':\n        case 'col':\n        case 'data':\n        case 'dd':\n        case 'del':\n        case 'dfn':\n        case 'dir':\n        case 'div':\n        case 'dl':\n        case 'em':\n        case 'embed':\n        case 'fieldset':\n        case 'figcaption':\n        case 'font':\n        case 'h1':\n        case 'h2':\n        case 'h3':\n        case 'h4':\n        case 'h5':\n        case 'h6':\n        case 'hgroup':\n        case 'html':\n        case 'i':\n        case 'ins':\n        case 'isindex':\n        case 'kbd':\n        case 'keygen':\n        case 'label':\n        case 'legend':\n        case 'li':\n        case 'map':\n        case 'mark':\n        case 'menu':\n        case 'object':\n        case 'ol':\n        case 'output':\n        case 'pre':\n        case 'presentation':\n        case 'q':\n        case 'rt':\n        case 'ruby':\n        case 'samp':\n        case 'small':\n        case 'source':\n        case 'span':\n        case 'status':\n        case 'strike':\n        case 'strong':\n        case 'sub':\n        case 'sup':\n        case 'svg':\n        case 'tbody':\n        case 'td':\n        case 'th':\n        case 'thead':\n        case 'time':\n        case 'tr':\n        case 'track':\n        case 'tt':\n        case 'ul':\n        case 'var':\n          return false;\n      }\n      return true;\n    }\n  }\n}\n\n})();\n(function(){\n\"use strict\";\n\n/**\n * @ngdoc module\n * @name material.core.interaction\n * @description\n * User interaction detection to provide proper accessibility.\n */\nMdInteractionService.$inject = [\"$timeout\", \"$mdUtil\"];\nangular\n  .module('material.core.interaction', [])\n  .service('$mdInteraction', MdInteractionService);\n\n\n/**\n * @ngdoc service\n * @name $mdInteraction\n * @module material.core.interaction\n *\n * @description\n *\n * Service which keeps track of the last interaction type and validates them for several browsers.\n * The service hooks into the document's body and listens for touch, mouse and keyboard events.\n *\n * The most recent interaction type can be retrieved by calling the `getLastInteractionType` method.\n *\n * Here is an example markup for using the interaction service.\n *\n * <hljs lang=\"js\">\n *   var lastType = $mdInteraction.getLastInteractionType();\n *\n *   if (lastType === 'keyboard') {\n *     // We only restore the focus for keyboard users.\n *     restoreFocus();\n *   }\n * </hljs>\n *\n */\nfunction MdInteractionService($timeout, $mdUtil) {\n  this.$timeout = $timeout;\n  this.$mdUtil = $mdUtil;\n\n  this.bodyElement = angular.element(document.body);\n  this.isBuffering = false;\n  this.bufferTimeout = null;\n  this.lastInteractionType = null;\n  this.lastInteractionTime = null;\n\n  // Type Mappings for the different events\n  // There will be three three interaction types\n  // `keyboard`, `mouse` and `touch`\n  // type `pointer` will be evaluated in `pointerMap` for IE Browser events\n  this.inputEventMap = {\n    'keydown': 'keyboard',\n    'mousedown': 'mouse',\n    'mouseenter': 'mouse',\n    'touchstart': 'touch',\n    'pointerdown': 'pointer',\n    'MSPointerDown': 'pointer'\n  };\n\n  // IE PointerDown events will be validated in `touch` or `mouse`\n  // Index numbers referenced here: https://msdn.microsoft.com/library/windows/apps/hh466130.aspx\n  this.iePointerMap = {\n    2: 'touch',\n    3: 'touch',\n    4: 'mouse'\n  };\n\n  this.initializeEvents();\n}\n\n/**\n * Initializes the interaction service, by registering all interaction events to the\n * body element.\n */\nMdInteractionService.prototype.initializeEvents = function() {\n  // IE browsers can also trigger pointer events, which also leads to an interaction.\n  var pointerEvent = 'MSPointerEvent' in window ? 'MSPointerDown' : 'PointerEvent' in window ? 'pointerdown' : null;\n\n  this.bodyElement.on('keydown mousedown', this.onInputEvent.bind(this));\n\n  if ('ontouchstart' in document.documentElement) {\n    this.bodyElement.on('touchstart', this.onBufferInputEvent.bind(this));\n  }\n\n  if (pointerEvent) {\n    this.bodyElement.on(pointerEvent, this.onInputEvent.bind(this));\n  }\n\n};\n\n/**\n * Event listener for normal interaction events, which should be tracked.\n * @param event {MouseEvent|KeyboardEvent|PointerEvent|TouchEvent}\n */\nMdInteractionService.prototype.onInputEvent = function(event) {\n  if (this.isBuffering) {\n    return;\n  }\n\n  var type = this.inputEventMap[event.type];\n\n  if (type === 'pointer') {\n    type = this.iePointerMap[event.pointerType] || event.pointerType;\n  }\n\n  this.lastInteractionType = type;\n  this.lastInteractionTime = this.$mdUtil.now();\n};\n\n/**\n * Event listener for interaction events which should be buffered (touch events).\n * @param event {TouchEvent}\n */\nMdInteractionService.prototype.onBufferInputEvent = function(event) {\n  this.$timeout.cancel(this.bufferTimeout);\n\n  this.onInputEvent(event);\n  this.isBuffering = true;\n\n  // The timeout of 650ms is needed to delay the touchstart, because otherwise the touch will call\n  // the `onInput` function multiple times.\n  this.bufferTimeout = this.$timeout(function() {\n    this.isBuffering = false;\n  }.bind(this), 650, false);\n\n};\n\n/**\n * @ngdoc method\n * @name $mdInteraction#getLastInteractionType\n * @description Retrieves the last interaction type triggered in body.\n * @returns {string|null} Last interaction type.\n */\nMdInteractionService.prototype.getLastInteractionType = function() {\n  return this.lastInteractionType;\n};\n\n/**\n * @ngdoc method\n * @name $mdInteraction#isUserInvoked\n * @description Method to detect whether any interaction happened recently or not.\n * @param {number=} checkDelay Time to check for any interaction to have been triggered.\n * @returns {boolean} Whether there was any interaction or not.\n */\nMdInteractionService.prototype.isUserInvoked = function(checkDelay) {\n  var delay = angular.isNumber(checkDelay) ? checkDelay : 15;\n\n  // Check for any interaction to be within the specified check time.\n  return this.lastInteractionTime >= this.$mdUtil.now() - delay;\n};\n\n})();\n(function(){\n\"use strict\";\n\n\nMdGesture.$inject = [\"$$MdGestureHandler\", \"$$rAF\", \"$timeout\"];\nattachToDocument.$inject = [\"$mdGesture\", \"$$MdGestureHandler\"];var HANDLERS = {};\n\n/* The state of the current 'pointer'\n * The pointer represents the state of the current touch.\n * It contains normalized x and y coordinates from DOM events,\n * as well as other information abstracted from the DOM.\n */\n\nvar pointer, lastPointer, forceSkipClickHijack = false;\n\n/**\n * The position of the most recent click if that click was on a label element.\n * @type {{x: number, y: number}?}\n */\nvar lastLabelClickPos = null;\n\n// Used to attach event listeners once when multiple ng-apps are running.\nvar isInitialized = false;\n\nangular\n  .module('material.core.gestures', [ ])\n  .provider('$mdGesture', MdGestureProvider)\n  .factory('$$MdGestureHandler', MdGestureHandler)\n  .run( attachToDocument );\n\n/**\n   * @ngdoc service\n   * @name $mdGestureProvider\n   * @module material.core.gestures\n   *\n   * @description\n   * In some scenarios on Mobile devices (without jQuery), the click events should NOT be hijacked.\n   * `$mdGestureProvider` is used to configure the Gesture module to ignore or skip click hijacking on mobile\n   * devices.\n   *\n   * <hljs lang=\"js\">\n   *   app.config(function($mdGestureProvider) {\n   *\n   *     // For mobile devices without jQuery loaded, do not\n   *     // intercept click events during the capture phase.\n   *     $mdGestureProvider.skipClickHijack();\n   *\n   *   });\n   * </hljs>\n   *\n   */\nfunction MdGestureProvider() { }\n\nMdGestureProvider.prototype = {\n\n  // Publish access to setter to configure a variable  BEFORE the\n  // $mdGesture service is instantiated...\n  skipClickHijack: function() {\n    return forceSkipClickHijack = true;\n  },\n\n  /**\n   * $get is used to build an instance of $mdGesture\n   * @ngInject\n   */\n  $get : [\"$$MdGestureHandler\", \"$$rAF\", \"$timeout\", function($$MdGestureHandler, $$rAF, $timeout) {\n       return new MdGesture($$MdGestureHandler, $$rAF, $timeout);\n  }]\n};\n\n\n\n/**\n * MdGesture factory construction function\n * @ngInject\n */\nfunction MdGesture($$MdGestureHandler, $$rAF, $timeout) {\n  var userAgent = navigator.userAgent || navigator.vendor || window.opera;\n  var isIos = userAgent.match(/ipad|iphone|ipod/i);\n  var isAndroid = userAgent.match(/android/i);\n  var touchActionProperty = getTouchAction();\n  var hasJQuery =  (typeof window.jQuery !== 'undefined') && (angular.element === window.jQuery);\n\n  var self = {\n    handler: addHandler,\n    register: register,\n    // On mobile w/out jQuery, we normally intercept clicks. Should we skip that?\n    isHijackingClicks: (isIos || isAndroid) && !hasJQuery && !forceSkipClickHijack\n  };\n\n  if (self.isHijackingClicks) {\n    var maxClickDistance = 6;\n    self.handler('click', {\n      options: {\n        maxDistance: maxClickDistance\n      },\n      onEnd: checkDistanceAndEmit('click')\n    });\n\n    self.handler('focus', {\n      options: {\n        maxDistance: maxClickDistance\n      },\n      onEnd: function(ev, pointer) {\n        if (pointer.distance < this.state.options.maxDistance) {\n          if (canFocus(ev.target)) {\n            this.dispatchEvent(ev, 'focus', pointer);\n            ev.target.focus();\n          }\n        }\n\n        function canFocus(element) {\n          var focusableElements = ['INPUT', 'SELECT', 'BUTTON', 'TEXTAREA', 'VIDEO', 'AUDIO'];\n\n          return (element.getAttribute('tabindex') != '-1') &&\n              !element.hasAttribute('DISABLED') &&\n              (element.hasAttribute('tabindex') || element.hasAttribute('href') || element.isContentEditable ||\n              (focusableElements.indexOf(element.nodeName) != -1));\n        }\n      }\n    });\n\n    self.handler('mouseup', {\n      options: {\n        maxDistance: maxClickDistance\n      },\n      onEnd: checkDistanceAndEmit('mouseup')\n    });\n\n    self.handler('mousedown', {\n      onStart: function(ev) {\n        this.dispatchEvent(ev, 'mousedown');\n      }\n    });\n  }\n\n  function checkDistanceAndEmit(eventName) {\n    return function(ev, pointer) {\n      if (pointer.distance < this.state.options.maxDistance) {\n        this.dispatchEvent(ev, eventName, pointer);\n      }\n    };\n  }\n\n  /*\n   * Register an element to listen for a handler.\n   * This allows an element to override the default options for a handler.\n   * Additionally, some handlers like drag and hold only dispatch events if\n   * the domEvent happens inside an element that's registered to listen for these events.\n   *\n   * @see GestureHandler for how overriding of default options works.\n   * @example $mdGesture.register(myElement, 'drag', { minDistance: 20, horziontal: false })\n   */\n  function register(element, handlerName, options) {\n    var handler = HANDLERS[handlerName.replace(/^\\$md./, '')];\n    if (!handler) {\n      throw new Error('Failed to register element with handler ' + handlerName + '. ' +\n      'Available handlers: ' + Object.keys(HANDLERS).join(', '));\n    }\n    return handler.registerElement(element, options);\n  }\n\n  /*\n   * add a handler to $mdGesture. see below.\n   */\n  function addHandler(name, definition) {\n    var handler = new $$MdGestureHandler(name);\n    angular.extend(handler, definition);\n    HANDLERS[name] = handler;\n\n    return self;\n  }\n\n  /*\n   * Register handlers. These listen to touch/start/move events, interpret them,\n   * and dispatch gesture events depending on options & conditions. These are all\n   * instances of GestureHandler.\n   * @see GestureHandler\n   */\n  return self\n    /*\n     * The press handler dispatches an event on touchdown/touchend.\n     * It's a simple abstraction of touch/mouse/pointer start and end.\n     */\n    .handler('press', {\n      onStart: function (ev, pointer) {\n        this.dispatchEvent(ev, '$md.pressdown');\n      },\n      onEnd: function (ev, pointer) {\n        this.dispatchEvent(ev, '$md.pressup');\n      }\n    })\n\n    /*\n     * The hold handler dispatches an event if the user keeps their finger within\n     * the same <maxDistance> area for <delay> ms.\n     * The hold handler will only run if a parent of the touch target is registered\n     * to listen for hold events through $mdGesture.register()\n     */\n    .handler('hold', {\n      options: {\n        maxDistance: 6,\n        delay: 500\n      },\n      onCancel: function () {\n        $timeout.cancel(this.state.timeout);\n      },\n      onStart: function (ev, pointer) {\n        // For hold, require a parent to be registered with $mdGesture.register()\n        // Because we prevent scroll events, this is necessary.\n        if (!this.state.registeredParent) return this.cancel();\n\n        this.state.pos = {x: pointer.x, y: pointer.y};\n        this.state.timeout = $timeout(angular.bind(this, function holdDelayFn() {\n          this.dispatchEvent(ev, '$md.hold');\n          this.cancel(); //we're done!\n        }), this.state.options.delay, false);\n      },\n      onMove: function (ev, pointer) {\n        // Don't scroll while waiting for hold.\n        // If we don't preventDefault touchmove events here, Android will assume we don't\n        // want to listen to anymore touch events. It will start scrolling and stop sending\n        // touchmove events.\n        if (!touchActionProperty && ev.type === 'touchmove') ev.preventDefault();\n\n        // If the user moves greater than <maxDistance> pixels, stop the hold timer\n        // set in onStart\n        var dx = this.state.pos.x - pointer.x;\n        var dy = this.state.pos.y - pointer.y;\n        if (Math.sqrt(dx * dx + dy * dy) > this.options.maxDistance) {\n          this.cancel();\n        }\n      },\n      onEnd: function () {\n        this.onCancel();\n      }\n    })\n\n    /*\n     * The drag handler dispatches a drag event if the user holds and moves his finger greater than\n     * <minDistance> px in the x or y direction, depending on options.horizontal.\n     * The drag will be cancelled if the user moves his finger greater than <minDistance>*<cancelMultiplier> in\n     * the perpendicular direction. Eg if the drag is horizontal and the user moves his finger <minDistance>*<cancelMultiplier>\n     * pixels vertically, this handler won't consider the move part of a drag.\n     */\n    .handler('drag', {\n      options: {\n        minDistance: 6,\n        horizontal: true,\n        cancelMultiplier: 1.5\n      },\n      onSetup: function(element, options) {\n        if (touchActionProperty) {\n          // We check for horizontal to be false, because otherwise we would overwrite the default opts.\n          this.oldTouchAction = element[0].style[touchActionProperty];\n          element[0].style[touchActionProperty] = options.horizontal ? 'pan-y' : 'pan-x';\n        }\n      },\n      onCleanup: function(element) {\n        if (this.oldTouchAction) {\n          element[0].style[touchActionProperty] = this.oldTouchAction;\n        }\n      },\n      onStart: function (ev) {\n        // For drag, require a parent to be registered with $mdGesture.register()\n        if (!this.state.registeredParent) this.cancel();\n      },\n      onMove: function (ev, pointer) {\n        var shouldStartDrag, shouldCancel;\n        // Don't scroll while deciding if this touchmove qualifies as a drag event.\n        // If we don't preventDefault touchmove events here, Android will assume we don't\n        // want to listen to anymore touch events. It will start scrolling and stop sending\n        // touchmove events.\n        if (!touchActionProperty && ev.type === 'touchmove') ev.preventDefault();\n\n        if (!this.state.dragPointer) {\n          if (this.state.options.horizontal) {\n            shouldStartDrag = Math.abs(pointer.distanceX) > this.state.options.minDistance;\n            shouldCancel = Math.abs(pointer.distanceY) > this.state.options.minDistance * this.state.options.cancelMultiplier;\n          } else {\n            shouldStartDrag = Math.abs(pointer.distanceY) > this.state.options.minDistance;\n            shouldCancel = Math.abs(pointer.distanceX) > this.state.options.minDistance * this.state.options.cancelMultiplier;\n          }\n\n          if (shouldStartDrag) {\n            // Create a new pointer representing this drag, starting at this point where the drag started.\n            this.state.dragPointer = makeStartPointer(ev);\n            updatePointerState(ev, this.state.dragPointer);\n            this.dispatchEvent(ev, '$md.dragstart', this.state.dragPointer);\n\n          } else if (shouldCancel) {\n            this.cancel();\n          }\n        } else {\n          this.dispatchDragMove(ev);\n        }\n      },\n      // Only dispatch dragmove events every frame; any more is unnecessary\n      dispatchDragMove: $$rAF.throttle(function (ev) {\n        // Make sure the drag didn't stop while waiting for the next frame\n        if (this.state.isRunning) {\n          updatePointerState(ev, this.state.dragPointer);\n          this.dispatchEvent(ev, '$md.drag', this.state.dragPointer);\n        }\n      }),\n      onEnd: function (ev, pointer) {\n        if (this.state.dragPointer) {\n          updatePointerState(ev, this.state.dragPointer);\n          this.dispatchEvent(ev, '$md.dragend', this.state.dragPointer);\n        }\n      }\n    })\n\n    /*\n     * The swipe handler will dispatch a swipe event if, on the end of a touch,\n     * the velocity and distance were high enough.\n     */\n    .handler('swipe', {\n      options: {\n        minVelocity: 0.65,\n        minDistance: 10\n      },\n      onEnd: function (ev, pointer) {\n        var eventType;\n\n        if (Math.abs(pointer.velocityX) > this.state.options.minVelocity &&\n          Math.abs(pointer.distanceX) > this.state.options.minDistance) {\n          eventType = pointer.directionX == 'left' ? '$md.swipeleft' : '$md.swiperight';\n          this.dispatchEvent(ev, eventType);\n        }\n        else if (Math.abs(pointer.velocityY) > this.state.options.minVelocity &&\n          Math.abs(pointer.distanceY) > this.state.options.minDistance) {\n          eventType = pointer.directionY == 'up' ? '$md.swipeup' : '$md.swipedown';\n          this.dispatchEvent(ev, eventType);\n        }\n      }\n    });\n\n  function getTouchAction() {\n    var testEl = document.createElement('div');\n    var vendorPrefixes = ['', 'webkit', 'Moz', 'MS', 'ms', 'o'];\n\n    for (var i = 0; i < vendorPrefixes.length; i++) {\n      var prefix = vendorPrefixes[i];\n      var property = prefix ? prefix + 'TouchAction' : 'touchAction';\n      if (angular.isDefined(testEl.style[property])) {\n        return property;\n      }\n    }\n  }\n\n}\n\n/**\n * MdGestureHandler\n * A GestureHandler is an object which is able to dispatch custom dom events\n * based on native dom {touch,pointer,mouse}{start,move,end} events.\n *\n * A gesture will manage its lifecycle through the start,move,end, and cancel\n * functions, which are called by native dom events.\n *\n * A gesture has the concept of 'options' (eg a swipe's required velocity), which can be\n * overridden by elements registering through $mdGesture.register()\n */\nfunction GestureHandler (name) {\n  this.name = name;\n  this.state = {};\n}\n\nfunction MdGestureHandler() {\n  var hasJQuery =  (typeof window.jQuery !== 'undefined') && (angular.element === window.jQuery);\n\n  GestureHandler.prototype = {\n    options: {},\n    // jQuery listeners don't work with custom DOMEvents, so we have to dispatch events\n    // differently when jQuery is loaded\n    dispatchEvent: hasJQuery ?  jQueryDispatchEvent : nativeDispatchEvent,\n\n    // These are overridden by the registered handler\n    onSetup: angular.noop,\n    onCleanup: angular.noop,\n    onStart: angular.noop,\n    onMove: angular.noop,\n    onEnd: angular.noop,\n    onCancel: angular.noop,\n\n    // onStart sets up a new state for the handler, which includes options from the\n    // nearest registered parent element of ev.target.\n    start: function (ev, pointer) {\n      if (this.state.isRunning) return;\n      var parentTarget = this.getNearestParent(ev.target);\n      // Get the options from the nearest registered parent\n      var parentTargetOptions = parentTarget && parentTarget.$mdGesture[this.name] || {};\n\n      this.state = {\n        isRunning: true,\n        // Override the default options with the nearest registered parent's options\n        options: angular.extend({}, this.options, parentTargetOptions),\n        // Pass in the registered parent node to the state so the onStart listener can use\n        registeredParent: parentTarget\n      };\n      this.onStart(ev, pointer);\n    },\n    move: function (ev, pointer) {\n      if (!this.state.isRunning) return;\n      this.onMove(ev, pointer);\n    },\n    end: function (ev, pointer) {\n      if (!this.state.isRunning) return;\n      this.onEnd(ev, pointer);\n      this.state.isRunning = false;\n    },\n    cancel: function (ev, pointer) {\n      this.onCancel(ev, pointer);\n      this.state = {};\n    },\n\n    // Find and return the nearest parent element that has been registered to\n    // listen for this handler via $mdGesture.register(element, 'handlerName').\n    getNearestParent: function (node) {\n      var current = node;\n      while (current) {\n        if ((current.$mdGesture || {})[this.name]) {\n          return current;\n        }\n        current = current.parentNode;\n      }\n      return null;\n    },\n\n    // Called from $mdGesture.register when an element registers itself with a handler.\n    // Store the options the user gave on the DOMElement itself. These options will\n    // be retrieved with getNearestParent when the handler starts.\n    registerElement: function (element, options) {\n      var self = this;\n      element[0].$mdGesture = element[0].$mdGesture || {};\n      element[0].$mdGesture[this.name] = options || {};\n      element.on('$destroy', onDestroy);\n\n      self.onSetup(element, options || {});\n\n      return onDestroy;\n\n      function onDestroy() {\n        delete element[0].$mdGesture[self.name];\n        element.off('$destroy', onDestroy);\n\n        self.onCleanup(element, options || {});\n      }\n    }\n  };\n\n  return GestureHandler;\n\n  /*\n   * Dispatch an event with jQuery\n   * TODO: Make sure this sends bubbling events\n   *\n   * @param srcEvent the original DOM touch event that started this.\n   * @param eventType the name of the custom event to send (eg 'click' or '$md.drag')\n   * @param eventPointer the pointer object that matches this event.\n   */\n  function jQueryDispatchEvent(srcEvent, eventType, eventPointer) {\n    eventPointer = eventPointer || pointer;\n    var eventObj = new angular.element.Event(eventType);\n\n    eventObj.$material = true;\n    eventObj.pointer = eventPointer;\n    eventObj.srcEvent = srcEvent;\n\n    angular.extend(eventObj, {\n      clientX: eventPointer.x,\n      clientY: eventPointer.y,\n      screenX: eventPointer.x,\n      screenY: eventPointer.y,\n      pageX: eventPointer.x,\n      pageY: eventPointer.y,\n      ctrlKey: srcEvent.ctrlKey,\n      altKey: srcEvent.altKey,\n      shiftKey: srcEvent.shiftKey,\n      metaKey: srcEvent.metaKey\n    });\n    angular.element(eventPointer.target).trigger(eventObj);\n  }\n\n  /*\n   * NOTE: nativeDispatchEvent is very performance sensitive.\n   * @param srcEvent the original DOM touch event that started this.\n   * @param eventType the name of the custom event to send (eg 'click' or '$md.drag')\n   * @param eventPointer the pointer object that matches this event.\n   */\n  function nativeDispatchEvent(srcEvent, eventType, eventPointer) {\n    eventPointer = eventPointer || pointer;\n    var eventObj;\n\n    if (eventType === 'click' || eventType == 'mouseup' || eventType == 'mousedown' ) {\n      eventObj = document.createEvent('MouseEvents');\n      eventObj.initMouseEvent(\n        eventType, true, true, window, srcEvent.detail,\n        eventPointer.x, eventPointer.y, eventPointer.x, eventPointer.y,\n        srcEvent.ctrlKey, srcEvent.altKey, srcEvent.shiftKey, srcEvent.metaKey,\n        srcEvent.button, srcEvent.relatedTarget || null\n      );\n\n    } else {\n      eventObj = document.createEvent('CustomEvent');\n      eventObj.initCustomEvent(eventType, true, true, {});\n    }\n    eventObj.$material = true;\n    eventObj.pointer = eventPointer;\n    eventObj.srcEvent = srcEvent;\n    eventPointer.target.dispatchEvent(eventObj);\n  }\n\n}\n\n/**\n * Attach Gestures: hook document and check shouldHijack clicks\n * @ngInject\n */\nfunction attachToDocument( $mdGesture, $$MdGestureHandler ) {\n\n  // Polyfill document.contains for IE11.\n  // TODO: move to util\n  document.contains || (document.contains = function (node) {\n    return document.body.contains(node);\n  });\n\n  if (!isInitialized && $mdGesture.isHijackingClicks ) {\n    /*\n     * If hijack clicks is true, we preventDefault any click that wasn't\n     * sent by AngularJS Material. This is because on older Android & iOS, a false, or 'ghost',\n     * click event will be sent ~400ms after a touchend event happens.\n     * The only way to know if this click is real is to prevent any normal\n     * click events, and add a flag to events sent by material so we know not to prevent those.\n     *\n     * Two exceptions to click events that should be prevented are:\n     *  - click events sent by the keyboard (eg form submit)\n     *  - events that originate from an Ionic app\n     */\n    document.addEventListener('click'    , clickHijacker     , true);\n    document.addEventListener('mouseup'  , mouseInputHijacker, true);\n    document.addEventListener('mousedown', mouseInputHijacker, true);\n    document.addEventListener('focus'    , mouseInputHijacker, true);\n\n    isInitialized = true;\n  }\n\n  function mouseInputHijacker(ev) {\n    var isKeyClick = !ev.clientX && !ev.clientY;\n    if (!isKeyClick && !ev.$material && !ev.isIonicTap\n      && !isInputEventFromLabelClick(ev)) {\n      ev.preventDefault();\n      ev.stopPropagation();\n    }\n  }\n\n  function clickHijacker(ev) {\n    var isKeyClick = ev.clientX === 0 && ev.clientY === 0;\n    var isSubmitEvent = ev.target && ev.target.type === 'submit';\n    if (!isKeyClick && !ev.$material && !ev.isIonicTap\n      && !isInputEventFromLabelClick(ev)\n      && !isSubmitEvent) {\n      ev.preventDefault();\n      ev.stopPropagation();\n      lastLabelClickPos = null;\n    } else {\n      lastLabelClickPos = null;\n      if (ev.target.tagName.toLowerCase() == 'label') {\n        lastLabelClickPos = {x: ev.x, y: ev.y};\n      }\n    }\n  }\n\n\n  // Listen to all events to cover all platforms.\n  var START_EVENTS = 'mousedown touchstart pointerdown';\n  var MOVE_EVENTS = 'mousemove touchmove pointermove';\n  var END_EVENTS = 'mouseup mouseleave touchend touchcancel pointerup pointercancel';\n\n  angular.element(document)\n    .on(START_EVENTS, gestureStart)\n    .on(MOVE_EVENTS, gestureMove)\n    .on(END_EVENTS, gestureEnd)\n    // For testing\n    .on('$$mdGestureReset', function gestureClearCache () {\n      lastPointer = pointer = null;\n    });\n\n  /*\n   * When a DOM event happens, run all registered gesture handlers' lifecycle\n   * methods which match the DOM event.\n   * Eg when a 'touchstart' event happens, runHandlers('start') will call and\n   * run `handler.cancel()` and `handler.start()` on all registered handlers.\n   */\n  function runHandlers(handlerEvent, event) {\n    var handler;\n    for (var name in HANDLERS) {\n      handler = HANDLERS[name];\n      if( handler instanceof $$MdGestureHandler ) {\n\n        if (handlerEvent === 'start') {\n          // Run cancel to reset any handlers' state\n          handler.cancel();\n        }\n        handler[handlerEvent](event, pointer);\n\n      }\n    }\n  }\n\n  /*\n   * gestureStart vets if a start event is legitimate (and not part of a 'ghost click' from iOS/Android)\n   * If it is legitimate, we initiate the pointer state and mark the current pointer's type\n   * For example, for a touchstart event, mark the current pointer as a 'touch' pointer, so mouse events\n   * won't effect it.\n   */\n  function gestureStart(ev) {\n    // If we're already touched down, abort\n    if (pointer) return;\n\n    var now = +Date.now();\n\n    // iOS & old android bug: after a touch event, a click event is sent 350 ms later.\n    // If <400ms have passed, don't allow an event of a different type than the previous event\n    if (lastPointer && !typesMatch(ev, lastPointer) && (now - lastPointer.endTime < 1500)) {\n      return;\n    }\n\n    pointer = makeStartPointer(ev);\n\n    runHandlers('start', ev);\n  }\n  /*\n   * If a move event happens of the right type, update the pointer and run all the move handlers.\n   * \"of the right type\": if a mousemove happens but our pointer started with a touch event, do nothing.\n   */\n  function gestureMove(ev) {\n    if (!pointer || !typesMatch(ev, pointer)) return;\n\n    updatePointerState(ev, pointer);\n    runHandlers('move', ev);\n  }\n  /*\n   * If an end event happens of the right type, update the pointer, run endHandlers, and save the pointer as 'lastPointer'\n   */\n  function gestureEnd(ev) {\n    if (!pointer || !typesMatch(ev, pointer)) return;\n\n    updatePointerState(ev, pointer);\n    pointer.endTime = +Date.now();\n\n    runHandlers('end', ev);\n\n    lastPointer = pointer;\n    pointer = null;\n  }\n\n}\n\n// ********************\n// Module Functions\n// ********************\n\n/*\n * Initiate the pointer. x, y, and the pointer's type.\n */\nfunction makeStartPointer(ev) {\n  var point = getEventPoint(ev);\n  var startPointer = {\n    startTime: +Date.now(),\n    target: ev.target,\n    // 'p' for pointer events, 'm' for mouse, 't' for touch\n    type: ev.type.charAt(0)\n  };\n  startPointer.startX = startPointer.x = point.pageX;\n  startPointer.startY = startPointer.y = point.pageY;\n  return startPointer;\n}\n\n/*\n * return whether the pointer's type matches the event's type.\n * Eg if a touch event happens but the pointer has a mouse type, return false.\n */\nfunction typesMatch(ev, pointer) {\n  return ev && pointer && ev.type.charAt(0) === pointer.type;\n}\n\n/**\n * Gets whether the given event is an input event that was caused by clicking on an\n * associated label element.\n *\n * This is necessary because the browser will, upon clicking on a label element, fire an\n * *extra* click event on its associated input (if any). mdGesture is able to flag the label\n * click as with `$material` correctly, but not the second input click.\n *\n * In order to determine whether an input event is from a label click, we compare the (x, y) for\n * the event to the (x, y) for the most recent label click (which is cleared whenever a non-label\n * click occurs). Unfortunately, there are no event properties that tie the input and the label\n * together (such as relatedTarget).\n *\n * @param {MouseEvent} event\n * @returns {boolean}\n */\nfunction isInputEventFromLabelClick(event) {\n  return lastLabelClickPos\n      && lastLabelClickPos.x == event.x\n      && lastLabelClickPos.y == event.y;\n}\n\n/*\n * Update the given pointer based upon the given DOMEvent.\n * Distance, velocity, direction, duration, etc\n */\nfunction updatePointerState(ev, pointer) {\n  var point = getEventPoint(ev);\n  var x = pointer.x = point.pageX;\n  var y = pointer.y = point.pageY;\n\n  pointer.distanceX = x - pointer.startX;\n  pointer.distanceY = y - pointer.startY;\n  pointer.distance = Math.sqrt(\n    pointer.distanceX * pointer.distanceX + pointer.distanceY * pointer.distanceY\n  );\n\n  pointer.directionX = pointer.distanceX > 0 ? 'right' : pointer.distanceX < 0 ? 'left' : '';\n  pointer.directionY = pointer.distanceY > 0 ? 'down' : pointer.distanceY < 0 ? 'up' : '';\n\n  pointer.duration = +Date.now() - pointer.startTime;\n  pointer.velocityX = pointer.distanceX / pointer.duration;\n  pointer.velocityY = pointer.distanceY / pointer.duration;\n}\n\n/*\n * Normalize the point where the DOM event happened whether it's touch or mouse.\n * @returns point event obj with pageX and pageY on it.\n */\nfunction getEventPoint(ev) {\n  ev = ev.originalEvent || ev; // support jQuery events\n  return (ev.touches && ev.touches[0]) ||\n    (ev.changedTouches && ev.changedTouches[0]) ||\n    ev;\n}\n\n})();\n(function(){\n\"use strict\";\n\nangular.module('material.core')\n  .provider('$$interimElement', InterimElementProvider);\n\n/*\n * @ngdoc service\n * @name $$interimElement\n * @module material.core\n *\n * @description\n *\n * Factory that contructs `$$interimElement.$service` services.\n * Used internally in material design for elements that appear on screen temporarily.\n * The service provides a promise-like API for interacting with the temporary\n * elements.\n *\n * ```js\n * app.service('$mdToast', function($$interimElement) {\n *   var $mdToast = $$interimElement(toastDefaultOptions);\n *   return $mdToast;\n * });\n * ```\n * @param {object=} defaultOptions Options used by default for the `show` method on the service.\n *\n * @returns {$$interimElement.$service}\n *\n */\n\nfunction InterimElementProvider() {\n  InterimElementFactory.$inject = [\"$document\", \"$q\", \"$rootScope\", \"$timeout\", \"$rootElement\", \"$animate\", \"$mdUtil\", \"$mdCompiler\", \"$mdTheming\", \"$injector\", \"$exceptionHandler\"];\n  createInterimElementProvider.$get = InterimElementFactory;\n  return createInterimElementProvider;\n\n  /**\n   * Returns a new provider which allows configuration of a new interimElement\n   * service. Allows configuration of default options & methods for options,\n   * as well as configuration of 'preset' methods (eg dialog.basic(): basic is a preset method)\n   */\n  function createInterimElementProvider(interimFactoryName) {\n    factory.$inject = [\"$$interimElement\", \"$injector\"];\n    var EXPOSED_METHODS = ['onHide', 'onShow', 'onRemove'];\n\n    var customMethods = {};\n    var providerConfig = {\n      presets: {}\n    };\n\n    var provider = {\n      setDefaults: setDefaults,\n      addPreset: addPreset,\n      addMethod: addMethod,\n      $get: factory\n    };\n\n    /**\n     * all interim elements will come with the 'build' preset\n     */\n    provider.addPreset('build', {\n      methods: ['controller', 'controllerAs', 'resolve', 'multiple',\n        'template', 'templateUrl', 'themable', 'transformTemplate', 'parent', 'contentElement']\n    });\n\n    return provider;\n\n    /**\n     * Save the configured defaults to be used when the factory is instantiated\n     */\n    function setDefaults(definition) {\n      providerConfig.optionsFactory = definition.options;\n      providerConfig.methods = (definition.methods || []).concat(EXPOSED_METHODS);\n      return provider;\n    }\n\n    /**\n     * Add a method to the factory that isn't specific to any interim element operations\n     */\n\n    function addMethod(name, fn) {\n      customMethods[name] = fn;\n      return provider;\n    }\n\n    /**\n     * Save the configured preset to be used when the factory is instantiated\n     */\n    function addPreset(name, definition) {\n      definition = definition || {};\n      definition.methods = definition.methods || [];\n      definition.options = definition.options || function() { return {}; };\n\n      if (/^cancel|hide|show$/.test(name)) {\n        throw new Error(\"Preset '\" + name + \"' in \" + interimFactoryName + \" is reserved!\");\n      }\n      if (definition.methods.indexOf('_options') > -1) {\n        throw new Error(\"Method '_options' in \" + interimFactoryName + \" is reserved!\");\n      }\n      providerConfig.presets[name] = {\n        methods: definition.methods.concat(EXPOSED_METHODS),\n        optionsFactory: definition.options,\n        argOption: definition.argOption\n      };\n      return provider;\n    }\n\n    function addPresetMethod(presetName, methodName, method) {\n      providerConfig.presets[presetName][methodName] = method;\n    }\n\n    /**\n     * Create a factory that has the given methods & defaults implementing interimElement\n     */\n    /* @ngInject */\n    function factory($$interimElement, $injector) {\n      var defaultMethods;\n      var defaultOptions;\n      var interimElementService = $$interimElement();\n\n      /*\n       * publicService is what the developer will be using.\n       * It has methods hide(), cancel(), show(), build(), and any other\n       * presets which were set during the config phase.\n       */\n      var publicService = {\n        hide: interimElementService.hide,\n        cancel: interimElementService.cancel,\n        show: showInterimElement,\n\n        // Special internal method to destroy an interim element without animations\n        // used when navigation changes causes a $scope.$destroy() action\n        destroy : destroyInterimElement\n      };\n\n\n      defaultMethods = providerConfig.methods || [];\n      // This must be invoked after the publicService is initialized\n      defaultOptions = invokeFactory(providerConfig.optionsFactory, {});\n\n      // Copy over the simple custom methods\n      angular.forEach(customMethods, function(fn, name) {\n        publicService[name] = fn;\n      });\n\n      angular.forEach(providerConfig.presets, function(definition, name) {\n        var presetDefaults = invokeFactory(definition.optionsFactory, {});\n        var presetMethods = (definition.methods || []).concat(defaultMethods);\n\n        // Every interimElement built with a preset has a field called `$type`,\n        // which matches the name of the preset.\n        // Eg in preset 'confirm', options.$type === 'confirm'\n        angular.extend(presetDefaults, { $type: name });\n\n        // This creates a preset class which has setter methods for every\n        // method given in the `.addPreset()` function, as well as every\n        // method given in the `.setDefaults()` function.\n        //\n        // @example\n        // .setDefaults({\n        //   methods: ['hasBackdrop', 'clickOutsideToClose', 'escapeToClose', 'targetEvent'],\n        //   options: dialogDefaultOptions\n        // })\n        // .addPreset('alert', {\n        //   methods: ['title', 'ok'],\n        //   options: alertDialogOptions\n        // })\n        //\n        // Set values will be passed to the options when interimElement.show() is called.\n        function Preset(opts) {\n          this._options = angular.extend({}, presetDefaults, opts);\n        }\n        angular.forEach(presetMethods, function(name) {\n          Preset.prototype[name] = function(value) {\n            this._options[name] = value;\n            return this;\n          };\n        });\n\n        // Create shortcut method for one-linear methods\n        if (definition.argOption) {\n          var methodName = 'show' + name.charAt(0).toUpperCase() + name.slice(1);\n          publicService[methodName] = function(arg) {\n            var config = publicService[name](arg);\n            return publicService.show(config);\n          };\n        }\n\n        // eg $mdDialog.alert() will return a new alert preset\n        publicService[name] = function(arg) {\n          // If argOption is supplied, eg `argOption: 'content'`, then we assume\n          // if the argument is not an options object then it is the `argOption` option.\n          //\n          // @example `$mdToast.simple('hello')` // sets options.content to hello\n          //                                     // because argOption === 'content'\n          if (arguments.length && definition.argOption &&\n              !angular.isObject(arg) && !angular.isArray(arg))  {\n\n            return (new Preset())[definition.argOption](arg);\n\n          } else {\n            return new Preset(arg);\n          }\n\n        };\n      });\n\n      return publicService;\n\n      /**\n       *\n       */\n      function showInterimElement(opts) {\n        // opts is either a preset which stores its options on an _options field,\n        // or just an object made up of options\n        opts = opts || { };\n        if (opts._options) opts = opts._options;\n\n        return interimElementService.show(\n          angular.extend({}, defaultOptions, opts)\n        );\n      }\n\n      /**\n       *  Special method to hide and destroy an interimElement WITHOUT\n       *  any 'leave` or hide animations ( an immediate force hide/remove )\n       *\n       *  NOTE: This calls the onRemove() subclass method for each component...\n       *  which must have code to respond to `options.$destroy == true`\n       */\n      function destroyInterimElement(opts) {\n          return interimElementService.destroy(opts);\n      }\n\n      /**\n       * Helper to call $injector.invoke with a local of the factory name for\n       * this provider.\n       * If an $mdDialog is providing options for a dialog and tries to inject\n       * $mdDialog, a circular dependency error will happen.\n       * We get around that by manually injecting $mdDialog as a local.\n       */\n      function invokeFactory(factory, defaultVal) {\n        var locals = {};\n        locals[interimFactoryName] = publicService;\n        return $injector.invoke(factory || function() { return defaultVal; }, {}, locals);\n      }\n\n    }\n\n  }\n\n  /* @ngInject */\n  function InterimElementFactory($document, $q, $rootScope, $timeout, $rootElement, $animate,\n                                 $mdUtil, $mdCompiler, $mdTheming, $injector, $exceptionHandler) {\n    return function createInterimElementService() {\n      var SHOW_CANCELLED = false;\n\n      /*\n       * @ngdoc service\n       * @name $$interimElement.$service\n       *\n       * @description\n       * A service used to control inserting and removing an element into the DOM.\n       *\n       */\n\n      var service;\n\n      var showPromises = []; // Promises for the interim's which are currently opening.\n      var hidePromises = []; // Promises for the interim's which are currently hiding.\n      var showingInterims = []; // Interim elements which are currently showing up.\n\n      // Publish instance $$interimElement service;\n      // ... used as $mdDialog, $mdToast, $mdMenu, and $mdSelect\n\n      return service = {\n        show: show,\n        hide: waitForInterim(hide),\n        cancel: waitForInterim(cancel),\n        destroy : destroy,\n        $injector_: $injector\n      };\n\n      /*\n       * @ngdoc method\n       * @name $$interimElement.$service#show\n       * @kind function\n       *\n       * @description\n       * Adds the `$interimElement` to the DOM and returns a special promise that will be resolved or rejected\n       * with hide or cancel, respectively. To external cancel/hide, developers should use the\n       *\n       * @param {*} options is hashMap of settings\n       * @returns a Promise\n       *\n       */\n      function show(options) {\n        options = options || {};\n        var interimElement = new InterimElement(options || {});\n\n        // When an interim element is currently showing, we have to cancel it.\n        // Just hiding it, will resolve the InterimElement's promise, the promise should be\n        // rejected instead.\n        var hideAction = options.multiple ? $q.resolve() : $q.all(showPromises);\n\n        if (!options.multiple) {\n          // Wait for all opening interim's to finish their transition.\n          hideAction = hideAction.then(function() {\n            // Wait for all closing and showing interim's to be completely closed.\n            var promiseArray = hidePromises.concat(showingInterims.map(service.cancel));\n            return $q.all(promiseArray);\n          });\n        }\n\n        var showAction = hideAction.then(function() {\n\n          return interimElement\n            .show()\n            .catch(function(reason) { return reason; })\n            .finally(function() {\n              showPromises.splice(showPromises.indexOf(showAction), 1);\n              showingInterims.push(interimElement);\n            });\n\n        });\n\n        showPromises.push(showAction);\n\n        // In AngularJS 1.6+, exceptions inside promises will cause a rejection. We need to handle\n        // the rejection and only log it if it's an error.\n        interimElement.deferred.promise.catch(function(fault) {\n          if (fault instanceof Error) {\n            $exceptionHandler(fault);\n          }\n\n          return fault;\n        });\n\n        // Return a promise that will be resolved when the interim\n        // element is hidden or cancelled...\n        return interimElement.deferred.promise;\n      }\n\n      /*\n       * @ngdoc method\n       * @name $$interimElement.$service#hide\n       * @kind function\n       *\n       * @description\n       * Removes the `$interimElement` from the DOM and resolves the promise returned from `show`\n       *\n       * @param {*} resolveParam Data to resolve the promise with\n       * @returns a Promise that will be resolved after the element has been removed.\n       *\n       */\n      function hide(reason, options) {\n        options = options || {};\n\n        if (options.closeAll) {\n          // We have to make a shallow copy of the array, because otherwise the map will break.\n          return $q.all(showingInterims.slice().reverse().map(closeElement));\n        } else if (options.closeTo !== undefined) {\n          return $q.all(showingInterims.slice(options.closeTo).map(closeElement));\n        }\n\n        // Hide the latest showing interim element.\n        return closeElement(showingInterims[showingInterims.length - 1]);\n\n        function closeElement(interim) {\n\n          var hideAction = interim\n            .remove(reason, false, options || { })\n            .catch(function(reason) { return reason; })\n            .finally(function() {\n              hidePromises.splice(hidePromises.indexOf(hideAction), 1);\n            });\n\n          showingInterims.splice(showingInterims.indexOf(interim), 1);\n          hidePromises.push(hideAction);\n\n          return interim.deferred.promise;\n        }\n      }\n\n      /*\n       * @ngdoc method\n       * @name $$interimElement.$service#cancel\n       * @kind function\n       *\n       * @description\n       * Removes the `$interimElement` from the DOM and rejects the promise returned from `show`\n       *\n       * @param {*} reason Data to reject the promise with\n       * @returns Promise that will be resolved after the element has been removed.\n       *\n       */\n      function cancel(reason, options) {\n        var interim = showingInterims.pop();\n        if (!interim) {\n          return $q.when(reason);\n        }\n\n        var cancelAction = interim\n          .remove(reason, true, options || {})\n          .catch(function(reason) { return reason; })\n          .finally(function() {\n            hidePromises.splice(hidePromises.indexOf(cancelAction), 1);\n          });\n\n        hidePromises.push(cancelAction);\n\n        // Since AngularJS 1.6.7, promises will be logged to $exceptionHandler when the promise\n        // is not handling the rejection. We create a pseudo catch handler, which will prevent the\n        // promise from being logged to the $exceptionHandler.\n        return interim.deferred.promise.catch(angular.noop);\n      }\n\n      /**\n       * Creates a function to wait for at least one interim element to be available.\n       * @param callbackFn Function to be used as callback\n       * @returns {Function}\n       */\n      function waitForInterim(callbackFn) {\n        return function() {\n          var fnArguments = arguments;\n\n          if (!showingInterims.length) {\n            // When there are still interim's opening, then wait for the first interim element to\n            // finish its open animation.\n            if (showPromises.length) {\n              return showPromises[0].finally(function () {\n                return callbackFn.apply(service, fnArguments);\n              });\n            }\n\n            return $q.when(\"No interim elements currently showing up.\");\n          }\n\n          return callbackFn.apply(service, fnArguments);\n        };\n      }\n\n      /*\n       * Special method to quick-remove the interim element without animations\n       * Note: interim elements are in \"interim containers\"\n       */\n      function destroy(targetEl) {\n        var interim = !targetEl ? showingInterims.shift() : null;\n\n        var parentEl = angular.element(targetEl).length && angular.element(targetEl)[0].parentNode;\n\n        if (parentEl) {\n          // Try to find the interim in the stack which corresponds to the supplied DOM element.\n          var filtered = showingInterims.filter(function(entry) {\n            return entry.options.element[0] === parentEl;\n          });\n\n          // Note: This function might be called when the element already has been removed,\n          // in which case we won't find any matches.\n          if (filtered.length) {\n            interim = filtered[0];\n            showingInterims.splice(showingInterims.indexOf(interim), 1);\n          }\n        }\n\n        return interim ? interim.remove(SHOW_CANCELLED, false, { '$destroy': true }) :\n                         $q.when(SHOW_CANCELLED);\n      }\n\n      /*\n       * Internal Interim Element Object\n       * Used internally to manage the DOM element and related data\n       */\n      function InterimElement(options) {\n        var self, element, showAction = $q.when(true);\n\n        options = configureScopeAndTransitions(options);\n\n        return self = {\n          options : options,\n          deferred: $q.defer(),\n          show    : createAndTransitionIn,\n          remove  : transitionOutAndRemove\n        };\n\n        /**\n         * Compile, link, and show this interim element\n         * Use optional autoHided and transition-in effects\n         */\n        function createAndTransitionIn() {\n          return $q(function(resolve, reject) {\n\n            // Trigger onCompiling callback before the compilation starts.\n            // This is useful, when modifying options, which can be influenced by developers.\n            options.onCompiling && options.onCompiling(options);\n\n            compileElement(options)\n              .then(function( compiledData ) {\n                element = linkElement( compiledData, options );\n\n                // Expose the cleanup function from the compiler.\n                options.cleanupElement = compiledData.cleanup;\n\n                showAction = showElement(element, options, compiledData.controller)\n                  .then(resolve, rejectAll);\n              }).catch(rejectAll);\n\n            function rejectAll(fault) {\n              // Force the '$md<xxx>.show()' promise to reject\n              self.deferred.reject(fault);\n\n              // Continue rejection propagation\n              reject(fault);\n            }\n          });\n        }\n\n        /**\n         * After the show process has finished/rejected:\n         * - announce 'removing',\n         * - perform the transition-out, and\n         * - perform optional clean up scope.\n         */\n        function transitionOutAndRemove(response, isCancelled, opts) {\n\n          // abort if the show() and compile failed\n          if ( !element ) return $q.when(false);\n\n          options = angular.extend(options || {}, opts || {});\n          options.cancelAutoHide && options.cancelAutoHide();\n          options.element.triggerHandler('$mdInterimElementRemove');\n\n          if ( options.$destroy === true ) {\n\n            return hideElement(options.element, options).then(function(){\n              (isCancelled && rejectAll(response)) || resolveAll(response);\n            });\n\n          } else {\n            $q.when(showAction).finally(function() {\n              hideElement(options.element, options).then(function() {\n                isCancelled ? rejectAll(response) : resolveAll(response);\n              }, rejectAll);\n            });\n\n            return self.deferred.promise;\n          }\n\n\n          /**\n           * The `show()` returns a promise that will be resolved when the interim\n           * element is hidden or cancelled...\n           */\n          function resolveAll(response) {\n            self.deferred.resolve(response);\n          }\n\n          /**\n           * Force the '$md<xxx>.show()' promise to reject\n           */\n          function rejectAll(fault) {\n            self.deferred.reject(fault);\n          }\n        }\n\n        /**\n         * Prepare optional isolated scope and prepare $animate with default enter and leave\n         * transitions for the new element instance.\n         */\n        function configureScopeAndTransitions(options) {\n          options = options || { };\n          if ( options.template ) {\n            options.template = $mdUtil.processTemplate(options.template);\n          }\n\n          return angular.extend({\n            preserveScope: false,\n            cancelAutoHide : angular.noop,\n            scope: options.scope || $rootScope.$new(options.isolateScope),\n\n            /**\n             * Default usage to enable $animate to transition-in; can be easily overridden via 'options'\n             */\n            onShow: function transitionIn(scope, element, options) {\n              return $animate.enter(element, options.parent);\n            },\n\n            /**\n             * Default usage to enable $animate to transition-out; can be easily overridden via 'options'\n             */\n            onRemove: function transitionOut(scope, element) {\n              // Element could be undefined if a new element is shown before\n              // the old one finishes compiling.\n              return element && $animate.leave(element) || $q.when();\n            }\n          }, options );\n\n        }\n\n        /**\n         * Compile an element with a templateUrl, controller, and locals\n         */\n        function compileElement(options) {\n\n          var compiled = !options.skipCompile ? $mdCompiler.compile(options) : null;\n\n          return compiled || $q(function (resolve) {\n              resolve({\n                locals: {},\n                link: function () {\n                  return options.element;\n                }\n              });\n            });\n        }\n\n        /**\n         *  Link an element with compiled configuration\n         */\n        function linkElement(compileData, options){\n          angular.extend(compileData.locals, options);\n\n          var element = compileData.link(options.scope);\n\n          // Search for parent at insertion time, if not specified\n          options.element = element;\n          options.parent = findParent(element, options);\n          if (options.themable) $mdTheming(element);\n\n          return element;\n        }\n\n        /**\n         * Search for parent at insertion time, if not specified\n         */\n        function findParent(element, options) {\n          var parent = options.parent;\n\n          // Search for parent at insertion time, if not specified\n          if (angular.isFunction(parent)) {\n            parent = parent(options.scope, element, options);\n          } else if (angular.isString(parent)) {\n            parent = angular.element($document[0].querySelector(parent));\n          } else {\n            parent = angular.element(parent);\n          }\n\n          // If parent querySelector/getter function fails, or it's just null,\n          // find a default.\n          if (!(parent || {}).length) {\n            var el;\n            if ($rootElement[0] && $rootElement[0].querySelector) {\n              el = $rootElement[0].querySelector(':not(svg) > body');\n            }\n            if (!el) el = $rootElement[0];\n            if (el.nodeName == '#comment') {\n              el = $document[0].body;\n            }\n            return angular.element(el);\n          }\n\n          return parent;\n        }\n\n        /**\n         * If auto-hide is enabled, start timer and prepare cancel function\n         */\n        function startAutoHide() {\n          var autoHideTimer, cancelAutoHide = angular.noop;\n\n          if (options.hideDelay) {\n            autoHideTimer = $timeout(service.hide, options.hideDelay) ;\n            cancelAutoHide = function() {\n              $timeout.cancel(autoHideTimer);\n            };\n          }\n\n          // Cache for subsequent use\n          options.cancelAutoHide = function() {\n            cancelAutoHide();\n            options.cancelAutoHide = undefined;\n          };\n        }\n\n        /**\n         * Show the element ( with transitions), notify complete and start\n         * optional auto-Hide\n         */\n        function showElement(element, options, controller) {\n          // Trigger onShowing callback before the `show()` starts\n          var notifyShowing = options.onShowing || angular.noop;\n          // Trigger onComplete callback when the `show()` finishes\n          var notifyComplete = options.onComplete || angular.noop;\n\n          // Necessary for consistency between AngularJS 1.5 and 1.6.\n          try {\n            notifyShowing(options.scope, element, options, controller);\n          } catch (e) {\n            return $q.reject(e);\n          }\n\n          return $q(function (resolve, reject) {\n            try {\n              // Start transitionIn\n              $q.when(options.onShow(options.scope, element, options, controller))\n                .then(function () {\n                  notifyComplete(options.scope, element, options);\n                  startAutoHide();\n\n                  resolve(element);\n                }, reject);\n\n            } catch (e) {\n              reject(e.message);\n            }\n          });\n        }\n\n        function hideElement(element, options) {\n          var announceRemoving = options.onRemoving || angular.noop;\n\n          return $q(function (resolve, reject) {\n            try {\n              // Start transitionIn\n              var action = $q.when( options.onRemove(options.scope, element, options) || true );\n\n              // Trigger callback *before* the remove operation starts\n              announceRemoving(element, action);\n\n              if (options.$destroy) {\n                // For $destroy, onRemove should be synchronous\n                resolve(element);\n\n                if (!options.preserveScope && options.scope ) {\n                  // scope destroy should still be be done after the current digest is done\n                  action.then( function() { options.scope.$destroy(); });\n                }\n              } else {\n                // Wait until transition-out is done\n                action.then(function () {\n                  if (!options.preserveScope && options.scope ) {\n                    options.scope.$destroy();\n                  }\n\n                  resolve(element);\n                }, reject);\n              }\n            } catch (e) {\n              reject(e.message);\n            }\n          });\n        }\n\n      }\n    };\n\n  }\n\n}\n\n})();\n(function(){\n\"use strict\";\n\n(function() {\n  'use strict';\n\n  var $mdUtil, $interpolate, $log;\n\n  var SUFFIXES = /(-gt)?-(sm|md|lg|print)/g;\n  var WHITESPACE = /\\s+/g;\n\n  var FLEX_OPTIONS = ['grow', 'initial', 'auto', 'none', 'noshrink', 'nogrow' ];\n  var LAYOUT_OPTIONS = ['row', 'column'];\n  var ALIGNMENT_MAIN_AXIS= [ \"\", \"start\", \"center\", \"end\", \"stretch\", \"space-around\", \"space-between\" ];\n  var ALIGNMENT_CROSS_AXIS= [ \"\", \"start\", \"center\", \"end\", \"stretch\" ];\n\n  var config = {\n    /**\n     * Enable directive attribute-to-class conversions\n     * Developers can use `<body md-layout-css />` to quickly\n     * disable the Layout directives and prohibit the injection of Layout classNames\n     */\n    enabled: true,\n\n    /**\n     * List of mediaQuery breakpoints and associated suffixes\n     *\n     *   [\n     *    { suffix: \"sm\", mediaQuery: \"screen and (max-width: 599px)\" },\n     *    { suffix: \"md\", mediaQuery: \"screen and (min-width: 600px) and (max-width: 959px)\" }\n     *   ]\n     */\n    breakpoints: []\n  };\n\n  registerLayoutAPI( angular.module('material.core.layout', ['ng']) );\n\n  /**\n   *   registerLayoutAPI()\n   *\n   *   The original AngularJS Material Layout solution used attribute selectors and CSS.\n   *\n   *  ```html\n   *  <div layout=\"column\"> My Content </div>\n   *  ```\n   *\n   *  ```css\n   *  [layout] {\n   *    box-sizing: border-box;\n   *    display:flex;\n   *  }\n   *  [layout=column] {\n   *    flex-direction : column\n   *  }\n   *  ```\n   *\n   *  Use of attribute selectors creates significant performance impacts in some\n   *  browsers... mainly IE.\n   *\n   *  This module registers directives that allow the same layout attributes to be\n   *  interpreted and converted to class selectors. The directive will add equivalent classes to each element that\n   *  contains a Layout directive.\n   *\n   * ```html\n   *   <div layout=\"column\" class=\"layout layout-column\"> My Content </div>\n   *```\n   *\n   *  ```css\n   *  .layout {\n   *    box-sizing: border-box;\n   *    display:flex;\n   *  }\n   *  .layout-column {\n   *    flex-direction : column\n   *  }\n   *  ```\n   */\n  function registerLayoutAPI(module){\n    var PREFIX_REGEXP = /^((?:x|data)[\\:\\-_])/i;\n    var SPECIAL_CHARS_REGEXP = /([\\:\\-\\_]+(.))/g;\n\n    // NOTE: these are also defined in constants::MEDIA_PRIORITY and constants::MEDIA\n    var BREAKPOINTS     = [ \"\", \"xs\", \"gt-xs\", \"sm\", \"gt-sm\", \"md\", \"gt-md\", \"lg\", \"gt-lg\", \"xl\", \"print\" ];\n    var API_WITH_VALUES = [ \"layout\", \"flex\", \"flex-order\", \"flex-offset\", \"layout-align\" ];\n    var API_NO_VALUES   = [ \"show\", \"hide\", \"layout-padding\", \"layout-margin\" ];\n\n\n    // Build directive registration functions for the standard Layout API... for all breakpoints.\n    angular.forEach(BREAKPOINTS, function(mqb) {\n\n      // Attribute directives with expected, observable value(s)\n      angular.forEach( API_WITH_VALUES, function(name){\n        var fullName = mqb ? name + \"-\" + mqb : name;\n        module.directive( directiveNormalize(fullName), attributeWithObserve(fullName));\n      });\n\n      // Attribute directives with no expected value(s)\n      angular.forEach( API_NO_VALUES, function(name){\n        var fullName = mqb ? name + \"-\" + mqb : name;\n        module.directive( directiveNormalize(fullName), attributeWithoutValue(fullName));\n      });\n\n    });\n\n    // Register other, special directive functions for the Layout features:\n    module\n\n      .provider('$$mdLayout'     , function() {\n        // Publish internal service for Layouts\n        return {\n          $get : angular.noop,\n          validateAttributeValue : validateAttributeValue,\n          validateAttributeUsage : validateAttributeUsage,\n          /**\n           * Easy way to disable/enable the Layout API.\n           * When disabled, this stops all attribute-to-classname generations\n           */\n          disableLayouts  : function(isDisabled) {\n            config.enabled =  (isDisabled !== true);\n          }\n        };\n      })\n\n      .directive('mdLayoutCss'        , disableLayoutDirective )\n      .directive('ngCloak'            , buildCloakInterceptor('ng-cloak'))\n\n      .directive('layoutWrap'   , attributeWithoutValue('layout-wrap'))\n      .directive('layoutNowrap' , attributeWithoutValue('layout-nowrap'))\n      .directive('layoutNoWrap' , attributeWithoutValue('layout-no-wrap'))\n      .directive('layoutFill'   , attributeWithoutValue('layout-fill'))\n\n      // !! Deprecated attributes: use the `-lt` (aka less-than) notations\n\n      .directive('layoutLtMd'     , warnAttrNotSupported('layout-lt-md', true))\n      .directive('layoutLtLg'     , warnAttrNotSupported('layout-lt-lg', true))\n      .directive('flexLtMd'       , warnAttrNotSupported('flex-lt-md', true))\n      .directive('flexLtLg'       , warnAttrNotSupported('flex-lt-lg', true))\n\n      .directive('layoutAlignLtMd', warnAttrNotSupported('layout-align-lt-md'))\n      .directive('layoutAlignLtLg', warnAttrNotSupported('layout-align-lt-lg'))\n      .directive('flexOrderLtMd'  , warnAttrNotSupported('flex-order-lt-md'))\n      .directive('flexOrderLtLg'  , warnAttrNotSupported('flex-order-lt-lg'))\n      .directive('offsetLtMd'     , warnAttrNotSupported('flex-offset-lt-md'))\n      .directive('offsetLtLg'     , warnAttrNotSupported('flex-offset-lt-lg'))\n\n      .directive('hideLtMd'       , warnAttrNotSupported('hide-lt-md'))\n      .directive('hideLtLg'       , warnAttrNotSupported('hide-lt-lg'))\n      .directive('showLtMd'       , warnAttrNotSupported('show-lt-md'))\n      .directive('showLtLg'       , warnAttrNotSupported('show-lt-lg'))\n\n      // Determine if\n      .config( detectDisabledLayouts );\n\n    /**\n     * Converts snake_case to camelCase.\n     * Also there is special case for Moz prefix starting with upper case letter.\n     * @param name Name to normalize\n     */\n    function directiveNormalize(name) {\n      return name\n        .replace(PREFIX_REGEXP, '')\n        .replace(SPECIAL_CHARS_REGEXP, function(_, separator, letter, offset) {\n          return offset ? letter.toUpperCase() : letter;\n        });\n    }\n\n  }\n\n\n  /**\n    * Detect if any of the HTML tags has a [md-layouts-disabled] attribute;\n    * If yes, then immediately disable all layout API features\n    *\n    * Note: this attribute should be specified on either the HTML or BODY tags\n    */\n   /**\n    * @ngInject\n    */\n   function detectDisabledLayouts() {\n     var isDisabled = !!document.querySelector('[md-layouts-disabled]');\n     config.enabled = !isDisabled;\n   }\n\n  /**\n   * Special directive that will disable ALL Layout conversions of layout\n   * attribute(s) to classname(s).\n   *\n   * <link rel=\"stylesheet\" href=\"angular-material.min.css\">\n   * <link rel=\"stylesheet\" href=\"angular-material.layout.css\">\n   *\n   * <body md-layout-css>\n   *  ...\n   * </body>\n   *\n   * Note: Using md-layout-css directive requires the developer to load the Material\n   * Layout Attribute stylesheet (which only uses attribute selectors):\n   *\n   *       `angular-material.layout.css`\n   *\n   * Another option is to use the LayoutProvider to configure and disable the attribute\n   * conversions; this would obviate the use of the `md-layout-css` directive\n   *\n   */\n  function disableLayoutDirective() {\n    // Return a 1x-only, first-match attribute directive\n    config.enabled = false;\n\n    return {\n      restrict : 'A',\n      priority : '900'\n    };\n  }\n\n  /**\n   * Tail-hook ngCloak to delay the uncloaking while Layout transformers\n   * finish processing. Eliminates flicker with Material.Layouts\n   */\n  function buildCloakInterceptor(className) {\n    return [ '$timeout', function($timeout){\n      return {\n        restrict : 'A',\n        priority : -10,   // run after normal ng-cloak\n        compile  : function( element ) {\n          if (!config.enabled) return angular.noop;\n\n          // Re-add the cloak\n          element.addClass(className);\n\n          return function( scope, element ) {\n            // Wait while layout injectors configure, then uncloak\n            // NOTE: $rAF does not delay enough... and this is a 1x-only event,\n            //       $timeout is acceptable.\n            $timeout( function(){\n              element.removeClass(className);\n            }, 10, false);\n          };\n        }\n      };\n    }];\n  }\n\n\n  // *********************************************************************************\n  //\n  // These functions create registration functions for AngularJS Material Layout attribute directives\n  // This provides easy translation to switch AngularJS Material attribute selectors to\n  // CLASS selectors and directives; which has huge performance implications\n  // for IE Browsers\n  //\n  // *********************************************************************************\n\n  /**\n   * Creates a directive registration function where a possible dynamic attribute\n   * value will be observed/watched.\n   * @param {string} className attribute name; eg `layout-gt-md` with value =\"row\"\n   */\n  function attributeWithObserve(className) {\n\n    return ['$mdUtil', '$interpolate', \"$log\", function(_$mdUtil_, _$interpolate_, _$log_) {\n      $mdUtil = _$mdUtil_;\n      $interpolate = _$interpolate_;\n      $log = _$log_;\n\n      return {\n        restrict: 'A',\n        compile: function(element, attr) {\n          var linkFn;\n          if (config.enabled) {\n            // immediately replace static (non-interpolated) invalid values...\n\n            validateAttributeUsage(className, attr, element, $log);\n\n            validateAttributeValue( className,\n              getNormalizedAttrValue(className, attr, \"\"),\n              buildUpdateFn(element, className, attr)\n            );\n\n            linkFn = translateWithValueToCssClass;\n          }\n\n          // Use for postLink to account for transforms after ng-transclude.\n          return linkFn || angular.noop;\n        }\n      };\n    }];\n\n    /**\n     * Add as transformed class selector(s), then\n     * remove the deprecated attribute selector\n     */\n    function translateWithValueToCssClass(scope, element, attrs) {\n      var updateFn = updateClassWithValue(element, className, attrs);\n      var unwatch = attrs.$observe(attrs.$normalize(className), updateFn);\n\n      updateFn(getNormalizedAttrValue(className, attrs, \"\"));\n      scope.$on(\"$destroy\", function() { unwatch(); });\n    }\n  }\n\n  /**\n   * Creates a registration function for AngularJS Material Layout attribute directive.\n   * This is a `simple` transpose of attribute usage to class usage; where we ignore\n   * any attribute value\n   */\n  function attributeWithoutValue(className) {\n    return ['$mdUtil', '$interpolate', \"$log\", function(_$mdUtil_, _$interpolate_, _$log_) {\n      $mdUtil = _$mdUtil_;\n      $interpolate = _$interpolate_;\n      $log = _$log_;\n\n      return {\n        restrict: 'A',\n        compile: function(element, attr) {\n          var linkFn;\n          if (config.enabled) {\n            // immediately replace static (non-interpolated) invalid values...\n\n            validateAttributeValue( className,\n              getNormalizedAttrValue(className, attr, \"\"),\n              buildUpdateFn(element, className, attr)\n            );\n\n            translateToCssClass(null, element);\n\n            // Use for postLink to account for transforms after ng-transclude.\n            linkFn = translateToCssClass;\n          }\n\n          return linkFn || angular.noop;\n        }\n      };\n    }];\n\n    /**\n     * Add as transformed class selector, then\n     * remove the deprecated attribute selector\n     */\n    function translateToCssClass(scope, element) {\n      element.addClass(className);\n    }\n  }\n\n\n\n  /**\n   * After link-phase, do NOT remove deprecated layout attribute selector.\n   * Instead watch the attribute so interpolated data-bindings to layout\n   * selectors will continue to be supported.\n   *\n   * $observe() the className and update with new class (after removing the last one)\n   *\n   * e.g. `layout=\"{{layoutDemo.direction}}\"` will update...\n   *\n   * NOTE: The value must match one of the specified styles in the CSS.\n   * For example `flex-gt-md=\"{{size}}`  where `scope.size == 47` will NOT work since\n   * only breakpoints for 0, 5, 10, 15... 100, 33, 34, 66, 67 are defined.\n   *\n   */\n  function updateClassWithValue(element, className) {\n    var lastClass;\n\n    return function updateClassFn(newValue) {\n      var value = validateAttributeValue(className, newValue || \"\");\n      if ( angular.isDefined(value) ) {\n        if (lastClass) element.removeClass(lastClass);\n        lastClass = !value ? className : className + \"-\" + value.trim().replace(WHITESPACE, \"-\");\n        element.addClass(lastClass);\n      }\n    };\n  }\n\n  /**\n   * Provide console warning that this layout attribute has been deprecated\n   *\n   */\n  function warnAttrNotSupported(className) {\n    var parts = className.split(\"-\");\n    return [\"$log\", function($log) {\n      $log.warn(className + \"has been deprecated. Please use a `\" + parts[0] + \"-gt-<xxx>` variant.\");\n      return angular.noop;\n    }];\n  }\n\n  /**\n   * Centralize warnings for known flexbox issues (especially IE-related issues)\n   */\n  function validateAttributeUsage(className, attr, element, $log){\n    var message, usage, url;\n    var nodeName = element[0].nodeName.toLowerCase();\n\n    switch(className.replace(SUFFIXES,\"\")) {\n      case \"flex\":\n        if ((nodeName == \"md-button\") || (nodeName == \"fieldset\")){\n          // @see https://github.com/philipwalton/flexbugs#9-some-html-elements-cant-be-flex-containers\n          // Use <div flex> wrapper inside (preferred) or outside\n\n          usage = \"<\" + nodeName + \" \" + className + \"></\" + nodeName + \">\";\n          url = \"https://github.com/philipwalton/flexbugs#9-some-html-elements-cant-be-flex-containers\";\n          message = \"Markup '{0}' may not work as expected in IE Browsers. Consult '{1}' for details.\";\n\n          $log.warn( $mdUtil.supplant(message, [usage, url]) );\n        }\n    }\n\n  }\n\n\n  /**\n   * For the Layout attribute value, validate or replace with default\n   * fallback value\n   */\n  function validateAttributeValue(className, value, updateFn) {\n    var origValue;\n\n    if (!needsInterpolation(value)) {\n      switch (className.replace(SUFFIXES,\"\")) {\n        case 'layout'        :\n          if ( !findIn(value, LAYOUT_OPTIONS) ) {\n            value = LAYOUT_OPTIONS[0];    // 'row';\n          }\n          break;\n\n        case 'flex'          :\n          if (!findIn(value, FLEX_OPTIONS)) {\n            if (isNaN(value)) {\n              value = '';\n            }\n          }\n          break;\n\n        case 'flex-offset' :\n        case 'flex-order'    :\n          if (!value || isNaN(+value)) {\n            value = '0';\n          }\n          break;\n\n        case 'layout-align'  :\n          var axis = extractAlignAxis(value);\n          value = $mdUtil.supplant(\"{main}-{cross}\",axis);\n          break;\n\n        case 'layout-padding' :\n        case 'layout-margin'  :\n        case 'layout-fill'    :\n        case 'layout-wrap'    :\n        case 'layout-nowrap'  :\n        case 'layout-nowrap' :\n          value = '';\n          break;\n      }\n\n      if (value != origValue) {\n        (updateFn || angular.noop)(value);\n      }\n    }\n\n    return value ? value.trim() : \"\";\n  }\n\n  /**\n   * Replace current attribute value with fallback value\n   */\n  function buildUpdateFn(element, className, attrs) {\n    return function updateAttrValue(fallback) {\n      if (!needsInterpolation(fallback)) {\n        // Do not modify the element's attribute value; so\n        // uses '<ui-layout layout=\"/api/sidebar.html\" />' will not\n        // be affected. Just update the attrs value.\n        attrs[attrs.$normalize(className)] = fallback;\n      }\n    };\n  }\n\n  /**\n   * See if the original value has interpolation symbols:\n   * e.g.  flex-gt-md=\"{{triggerPoint}}\"\n   */\n  function needsInterpolation(value) {\n    return (value || \"\").indexOf($interpolate.startSymbol()) > -1;\n  }\n\n  function getNormalizedAttrValue(className, attrs, defaultVal) {\n    var normalizedAttr = attrs.$normalize(className);\n    return attrs[normalizedAttr] ? attrs[normalizedAttr].trim().replace(WHITESPACE, \"-\") : defaultVal || null;\n  }\n\n  function findIn(item, list, replaceWith) {\n    item = replaceWith && item ? item.replace(WHITESPACE, replaceWith) : item;\n\n    var found = false;\n    if (item) {\n      list.forEach(function(it) {\n        it = replaceWith ? it.replace(WHITESPACE, replaceWith) : it;\n        found = found || (it === item);\n      });\n    }\n    return found;\n  }\n\n  function extractAlignAxis(attrValue) {\n    var axis = {\n      main : \"start\",\n      cross: \"stretch\"\n    }, values;\n\n    attrValue = (attrValue || \"\");\n\n    if ( attrValue.indexOf(\"-\") === 0 || attrValue.indexOf(\" \") === 0) {\n      // For missing main-axis values\n      attrValue = \"none\" + attrValue;\n    }\n\n    values = attrValue.toLowerCase().trim().replace(WHITESPACE, \"-\").split(\"-\");\n    if ( values.length && (values[0] === \"space\") ) {\n      // for main-axis values of \"space-around\" or \"space-between\"\n      values = [ values[0]+\"-\"+values[1],values[2] ];\n    }\n\n    if ( values.length > 0 ) axis.main  = values[0] || axis.main;\n    if ( values.length > 1 ) axis.cross = values[1] || axis.cross;\n\n    if ( ALIGNMENT_MAIN_AXIS.indexOf(axis.main) < 0 )   axis.main = \"start\";\n    if ( ALIGNMENT_CROSS_AXIS.indexOf(axis.cross) < 0 ) axis.cross = \"stretch\";\n\n    return axis;\n  }\n\n\n})();\n\n})();\n(function(){\n\"use strict\";\n\n/**\r\n * @ngdoc module\r\n * @name material.core.liveannouncer\r\n * @description\r\n * AngularJS Material Live Announcer to provide accessibility for Voice Readers.\r\n */\r\nMdLiveAnnouncer.$inject = [\"$timeout\"];\r\nangular\r\n  .module('material.core')\r\n  .service('$mdLiveAnnouncer', MdLiveAnnouncer);\r\n\r\n/**\r\n * @ngdoc service\r\n * @name $mdLiveAnnouncer\r\n * @module material.core.liveannouncer\r\n *\r\n * @description\r\n *\r\n * Service to announce messages to supported screenreaders.\r\n *\r\n * > The `$mdLiveAnnouncer` service is internally used for components to provide proper accessibility.\r\n *\r\n * <hljs lang=\"js\">\r\n *   module.controller('AppCtrl', function($mdLiveAnnouncer) {\r\n *     // Basic announcement (Polite Mode)\r\n *     $mdLiveAnnouncer.announce('Hey Google');\r\n *\r\n *     // Custom announcement (Assertive Mode)\r\n *     $mdLiveAnnouncer.announce('Hey Google', 'assertive');\r\n *   });\r\n * </hljs>\r\n *\r\n */\r\nfunction MdLiveAnnouncer($timeout) {\r\n  /** @private @const @type {!angular.$timeout} */\r\n  this._$timeout = $timeout;\r\n\r\n  /** @private @const @type {!HTMLElement} */\r\n  this._liveElement = this._createLiveElement();\r\n\r\n  /** @private @const @type {!number} */\r\n  this._announceTimeout = 100;\r\n}\r\n\r\n/**\r\n * @ngdoc method\r\n * @name $mdLiveAnnouncer#announce\r\n * @description Announces messages to supported screenreaders.\r\n * @param {string} message Message to be announced to the screenreader\r\n * @param {'off'|'polite'|'assertive'} politeness The politeness of the announcer element.\r\n */\r\nMdLiveAnnouncer.prototype.announce = function(message, politeness) {\r\n  if (!politeness) {\r\n    politeness = 'polite';\r\n  }\r\n\r\n  var self = this;\r\n\r\n  self._liveElement.textContent = '';\r\n  self._liveElement.setAttribute('aria-live', politeness);\r\n\r\n  // This 100ms timeout is necessary for some browser + screen-reader combinations:\r\n  // - Both JAWS and NVDA over IE11 will not announce anything without a non-zero timeout.\r\n  // - With Chrome and IE11 with NVDA or JAWS, a repeated (identical) message won't be read a\r\n  //   second time without clearing and then using a non-zero delay.\r\n  // (using JAWS 17 at time of this writing).\r\n  self._$timeout(function() {\r\n    self._liveElement.textContent = message;\r\n  }, self._announceTimeout, false);\r\n};\r\n\r\n/**\r\n * Creates a live announcer element, which listens for DOM changes and announces them\r\n * to the screenreaders.\r\n * @returns {!HTMLElement}\r\n * @private\r\n */\r\nMdLiveAnnouncer.prototype._createLiveElement = function() {\r\n  var liveEl = document.createElement('div');\r\n\r\n  liveEl.classList.add('md-visually-hidden');\r\n  liveEl.setAttribute('role', 'status');\r\n  liveEl.setAttribute('aria-atomic', 'true');\r\n  liveEl.setAttribute('aria-live', 'polite');\r\n\r\n  document.body.appendChild(liveEl);\r\n\r\n  return liveEl;\r\n};\r\n\n})();\n(function(){\n\"use strict\";\n\n/**\n * @ngdoc service\n * @name $$mdMeta\n * @module material.core.meta\n *\n * @description\n *\n * A provider and a service that simplifies meta tags access\n *\n * Note: This is intended only for use with dynamic meta tags such as browser color and title.\n * Tags that are only processed when the page is rendered (such as `charset`, and `http-equiv`)\n * will not work since `$$mdMeta` adds the tags after the page has already been loaded.\n *\n * ```js\n * app.config(function($$mdMetaProvider) {\n *   var removeMeta = $$mdMetaProvider.setMeta('meta-name', 'content');\n *   var metaValue  = $$mdMetaProvider.getMeta('meta-name'); // -> 'content'\n *\n *   removeMeta();\n * });\n *\n * app.controller('myController', function($$mdMeta) {\n *   var removeMeta = $$mdMeta.setMeta('meta-name', 'content');\n *   var metaValue  = $$mdMeta.getMeta('meta-name'); // -> 'content'\n *\n *   removeMeta();\n * });\n * ```\n *\n * @returns {$$mdMeta.$service}\n *\n */\nangular.module('material.core.meta', [])\n  .provider('$$mdMeta', function () {\n    var head = angular.element(document.head);\n    var metaElements = {};\n\n    /**\n     * Checks if the requested element was written manually and maps it\n     *\n     * @param {string} name meta tag 'name' attribute value\n     * @returns {boolean} returns true if there is an element with the requested name\n     */\n    function mapExistingElement(name) {\n      if (metaElements[name]) {\n        return true;\n      }\n\n      var element = document.getElementsByName(name)[0];\n\n      if (!element) {\n        return false;\n      }\n\n      metaElements[name] = angular.element(element);\n\n      return true;\n    }\n\n    /**\n     * @ngdoc method\n     * @name $$mdMeta#setMeta\n     *\n     * @description\n     * Creates meta element with the 'name' and 'content' attributes,\n     * if the meta tag is already created than we replace the 'content' value\n     *\n     * @param {string} name meta tag 'name' attribute value\n     * @param {string} content meta tag 'content' attribute value\n     * @returns {function} remove function\n     *\n     */\n    function setMeta(name, content) {\n      mapExistingElement(name);\n\n      if (!metaElements[name]) {\n        var newMeta = angular.element('<meta name=\"' + name + '\" content=\"' + content + '\"/>');\n        head.append(newMeta);\n        metaElements[name] = newMeta;\n      }\n      else {\n        metaElements[name].attr('content', content);\n      }\n\n      return function () {\n        metaElements[name].attr('content', '');\n        metaElements[name].remove();\n        delete metaElements[name];\n      };\n    }\n\n    /**\n     * @ngdoc method\n     * @name $$mdMeta#getMeta\n     *\n     * @description\n     * Gets the 'content' attribute value of the wanted meta element\n     *\n     * @param {string} name meta tag 'name' attribute value\n     * @returns {string} content attribute value\n     */\n    function getMeta(name) {\n      if (!mapExistingElement(name)) {\n        throw Error('$$mdMeta: could not find a meta tag with the name \\'' + name + '\\'');\n      }\n\n      return metaElements[name].attr('content');\n    }\n\n    var module = {\n      setMeta: setMeta,\n      getMeta: getMeta\n    };\n\n    return angular.extend({}, module, {\n      $get: function () {\n        return module;\n      }\n    });\n  });\n})();\n(function(){\n\"use strict\";\n\n  /**\n   * @ngdoc module\n   * @name material.core.componentRegistry\n   *\n   * @description\n   * A component instance registration service.\n   * Note: currently this as a private service in the SideNav component.\n   */\n  ComponentRegistry.$inject = [\"$log\", \"$q\"];\n  angular.module('material.core')\n    .factory('$mdComponentRegistry', ComponentRegistry);\n\n  /*\n   * @private\n   * @ngdoc factory\n   * @name ComponentRegistry\n   * @module material.core.componentRegistry\n   *\n   */\n  function ComponentRegistry($log, $q) {\n\n    var self;\n    var instances = [ ];\n    var pendings = { };\n\n    return self = {\n      /**\n       * Used to print an error when an instance for a handle isn't found.\n       */\n      notFoundError: function(handle, msgContext) {\n        $log.error( (msgContext || \"\") + 'No instance found for handle', handle);\n      },\n      /**\n       * Return all registered instances as an array.\n       */\n      getInstances: function() {\n        return instances;\n      },\n\n      /**\n       * Get a registered instance.\n       * @param handle the String handle to look up for a registered instance.\n       */\n      get: function(handle) {\n        if ( !isValidID(handle) ) return null;\n\n        var i, j, instance;\n        for(i = 0, j = instances.length; i < j; i++) {\n          instance = instances[i];\n          if(instance.$$mdHandle === handle) {\n            return instance;\n          }\n        }\n        return null;\n      },\n\n      /**\n       * Register an instance.\n       * @param instance the instance to register\n       * @param handle the handle to identify the instance under.\n       */\n      register: function(instance, handle) {\n        if ( !handle ) return angular.noop;\n\n        instance.$$mdHandle = handle;\n        instances.push(instance);\n        resolveWhen();\n\n        return deregister;\n\n        /**\n         * Remove registration for an instance\n         */\n        function deregister() {\n          var index = instances.indexOf(instance);\n          if (index !== -1) {\n            instances.splice(index, 1);\n          }\n        }\n\n        /**\n         * Resolve any pending promises for this instance\n         */\n        function resolveWhen() {\n          var dfd = pendings[handle];\n          if ( dfd ) {\n            dfd.forEach(function (promise) {\n              promise.resolve(instance);\n            });\n            delete pendings[handle];\n          }\n        }\n      },\n\n      /**\n       * Async accessor to registered component instance\n       * If not available then a promise is created to notify\n       * all listeners when the instance is registered.\n       */\n      when : function(handle) {\n        if ( isValidID(handle) ) {\n          var deferred = $q.defer();\n          var instance = self.get(handle);\n\n          if ( instance )  {\n            deferred.resolve( instance );\n          } else {\n            if (pendings[handle] === undefined) {\n              pendings[handle] = [];\n            }\n            pendings[handle].push(deferred);\n          }\n\n          return deferred.promise;\n        }\n        return $q.reject(\"Invalid `md-component-id` value.\");\n      }\n\n    };\n\n    function isValidID(handle){\n      return handle && (handle !== \"\");\n    }\n\n  }\n\n})();\n(function(){\n\"use strict\";\n\n(function() {\n  'use strict';\n\n  /**\n   * @ngdoc service\n   * @name $mdButtonInkRipple\n   * @module material.core\n   *\n   * @description\n   * Provides ripple effects for md-button.  See $mdInkRipple service for all possible configuration options.\n   *\n   * @param {object=} scope Scope within the current context\n   * @param {object=} element The element the ripple effect should be applied to\n   * @param {object=} options (Optional) Configuration options to override the default ripple configuration\n   */\n\n  MdButtonInkRipple.$inject = [\"$mdInkRipple\"];\n  angular.module('material.core')\n    .factory('$mdButtonInkRipple', MdButtonInkRipple);\n\n  function MdButtonInkRipple($mdInkRipple) {\n    return {\n      attach: function attachRipple(scope, element, options) {\n        options = angular.extend(optionsForElement(element), options);\n\n        return $mdInkRipple.attach(scope, element, options);\n      }\n    };\n\n    function optionsForElement(element) {\n      if (element.hasClass('md-icon-button')) {\n        return {\n          isMenuItem: element.hasClass('md-menu-item'),\n          fitRipple: true,\n          center: true\n        };\n      } else {\n        return {\n          isMenuItem: element.hasClass('md-menu-item'),\n          dimBackground: true\n        };\n      }\n    }\n  }\n})();\n\n})();\n(function(){\n\"use strict\";\n\n(function() {\n  'use strict';\n\n    /**\n   * @ngdoc service\n   * @name $mdCheckboxInkRipple\n   * @module material.core\n   *\n   * @description\n   * Provides ripple effects for md-checkbox.  See $mdInkRipple service for all possible configuration options.\n   *\n   * @param {object=} scope Scope within the current context\n   * @param {object=} element The element the ripple effect should be applied to\n   * @param {object=} options (Optional) Configuration options to override the defaultripple configuration\n   */\n\n  MdCheckboxInkRipple.$inject = [\"$mdInkRipple\"];\n  angular.module('material.core')\n    .factory('$mdCheckboxInkRipple', MdCheckboxInkRipple);\n\n  function MdCheckboxInkRipple($mdInkRipple) {\n    return {\n      attach: attach\n    };\n\n    function attach(scope, element, options) {\n      return $mdInkRipple.attach(scope, element, angular.extend({\n        center: true,\n        dimBackground: false,\n        fitRipple: true\n      }, options));\n    }\n  }\n})();\n\n})();\n(function(){\n\"use strict\";\n\n(function() {\n  'use strict';\n\n  /**\n   * @ngdoc service\n   * @name $mdListInkRipple\n   * @module material.core\n   *\n   * @description\n   * Provides ripple effects for md-list.  See $mdInkRipple service for all possible configuration options.\n   *\n   * @param {object=} scope Scope within the current context\n   * @param {object=} element The element the ripple effect should be applied to\n   * @param {object=} options (Optional) Configuration options to override the defaultripple configuration\n   */\n\n  MdListInkRipple.$inject = [\"$mdInkRipple\"];\n  angular.module('material.core')\n    .factory('$mdListInkRipple', MdListInkRipple);\n\n  function MdListInkRipple($mdInkRipple) {\n    return {\n      attach: attach\n    };\n\n    function attach(scope, element, options) {\n      return $mdInkRipple.attach(scope, element, angular.extend({\n        center: false,\n        dimBackground: true,\n        outline: false,\n        rippleSize: 'full'\n      }, options));\n    }\n  }\n})();\n\n})();\n(function(){\n\"use strict\";\n\n/**\n * @ngdoc module\n * @name material.core.ripple\n * @description\n * Ripple\n */\nInkRippleCtrl.$inject = [\"$scope\", \"$element\", \"rippleOptions\", \"$window\", \"$timeout\", \"$mdUtil\", \"$mdColorUtil\"];\nInkRippleDirective.$inject = [\"$mdButtonInkRipple\", \"$mdCheckboxInkRipple\"];\nangular.module('material.core')\n    .provider('$mdInkRipple', InkRippleProvider)\n    .directive('mdInkRipple', InkRippleDirective)\n    .directive('mdNoInk', attrNoDirective)\n    .directive('mdNoBar', attrNoDirective)\n    .directive('mdNoStretch', attrNoDirective);\n\nvar DURATION = 450;\n\n/**\n * @ngdoc directive\n * @name mdInkRipple\n * @module material.core.ripple\n *\n * @description\n * The `md-ink-ripple` directive allows you to specify the ripple color or id a ripple is allowed.\n *\n * @param {string|boolean} md-ink-ripple A color string `#FF0000` or boolean (`false` or `0`) for preventing ripple\n *\n * @usage\n * ### String values\n * <hljs lang=\"html\">\n *   <ANY md-ink-ripple=\"#FF0000\">\n *     Ripples in red\n *   </ANY>\n *\n *   <ANY md-ink-ripple=\"false\">\n *     Not rippling\n *   </ANY>\n * </hljs>\n *\n * ### Interpolated values\n * <hljs lang=\"html\">\n *   <ANY md-ink-ripple=\"{{ randomColor() }}\">\n *     Ripples with the return value of 'randomColor' function\n *   </ANY>\n *\n *   <ANY md-ink-ripple=\"{{ canRipple() }}\">\n *     Ripples if 'canRipple' function return value is not 'false' or '0'\n *   </ANY>\n * </hljs>\n */\nfunction InkRippleDirective ($mdButtonInkRipple, $mdCheckboxInkRipple) {\n  return {\n    controller: angular.noop,\n    link:       function (scope, element, attr) {\n      attr.hasOwnProperty('mdInkRippleCheckbox')\n          ? $mdCheckboxInkRipple.attach(scope, element)\n          : $mdButtonInkRipple.attach(scope, element);\n    }\n  };\n}\n\n/**\n * @ngdoc service\n * @name $mdInkRipple\n * @module material.core.ripple\n *\n * @description\n * `$mdInkRipple` is a service for adding ripples to any element\n *\n * @usage\n * <hljs lang=\"js\">\n * app.factory('$myElementInkRipple', function($mdInkRipple) {\n *   return {\n *     attach: function (scope, element, options) {\n *       return $mdInkRipple.attach(scope, element, angular.extend({\n *         center: false,\n *         dimBackground: true\n *       }, options));\n *     }\n *   };\n * });\n *\n * app.controller('myController', function ($scope, $element, $myElementInkRipple) {\n *   $scope.onClick = function (ev) {\n *     $myElementInkRipple.attach($scope, angular.element(ev.target), { center: true });\n *   }\n * });\n * </hljs>\n *\n * ### Disabling ripples globally\n * If you want to disable ink ripples globally, for all components, you can call the\n * `disableInkRipple` method in your app's config.\n *\n * <hljs lang=\"js\">\n * app.config(function ($mdInkRippleProvider) {\n *   $mdInkRippleProvider.disableInkRipple();\n * });\n */\n\nfunction InkRippleProvider () {\n  var isDisabledGlobally = false;\n\n  return {\n    disableInkRipple: disableInkRipple,\n    $get: [\"$injector\", function($injector) {\n      return { attach: attach };\n\n      /**\n       * @ngdoc method\n       * @name $mdInkRipple#attach\n       *\n       * @description\n       * Attaching given scope, element and options to inkRipple controller\n       *\n       * @param {object=} scope Scope within the current context\n       * @param {object=} element The element the ripple effect should be applied to\n       * @param {object=} options (Optional) Configuration options to override the defaultRipple configuration\n       * * `center` -  Whether the ripple should start from the center of the container element\n       * * `dimBackground` - Whether the background should be dimmed with the ripple color\n       * * `colorElement` - The element the ripple should take its color from, defined by css property `color`\n       * * `fitRipple` - Whether the ripple should fill the element\n       */\n      function attach (scope, element, options) {\n        if (isDisabledGlobally || element.controller('mdNoInk')) return angular.noop;\n        return $injector.instantiate(InkRippleCtrl, {\n          $scope:        scope,\n          $element:      element,\n          rippleOptions: options\n        });\n      }\n    }]\n  };\n\n  /**\n   * @ngdoc method\n   * @name $mdInkRipple#disableInkRipple\n   *\n   * @description\n   * A config-time method that, when called, disables ripples globally.\n   */\n  function disableInkRipple () {\n    isDisabledGlobally = true;\n  }\n}\n\n/**\n * Controller used by the ripple service in order to apply ripples\n * @ngInject\n */\nfunction InkRippleCtrl ($scope, $element, rippleOptions, $window, $timeout, $mdUtil, $mdColorUtil) {\n  this.$window    = $window;\n  this.$timeout   = $timeout;\n  this.$mdUtil    = $mdUtil;\n  this.$mdColorUtil    = $mdColorUtil;\n  this.$scope     = $scope;\n  this.$element   = $element;\n  this.options    = rippleOptions;\n  this.mousedown  = false;\n  this.ripples    = [];\n  this.timeout    = null; // Stores a reference to the most-recent ripple timeout\n  this.lastRipple = null;\n\n  $mdUtil.valueOnUse(this, 'container', this.createContainer);\n\n  this.$element.addClass('md-ink-ripple');\n\n  // attach method for unit tests\n  ($element.controller('mdInkRipple') || {}).createRipple = angular.bind(this, this.createRipple);\n  ($element.controller('mdInkRipple') || {}).setColor = angular.bind(this, this.color);\n\n  this.bindEvents();\n}\n\n\n/**\n * Either remove or unlock any remaining ripples when the user mouses off of the element (either by\n * mouseup or mouseleave event)\n */\nfunction autoCleanup (self, cleanupFn) {\n\n  if ( self.mousedown || self.lastRipple ) {\n    self.mousedown = false;\n    self.$mdUtil.nextTick( angular.bind(self, cleanupFn), false);\n  }\n\n}\n\n\n/**\n * Returns the color that the ripple should be (either based on CSS or hard-coded)\n * @returns {string}\n */\nInkRippleCtrl.prototype.color = function (value) {\n  var self = this;\n\n  // If assigning a color value, apply it to background and the ripple color\n  if (angular.isDefined(value)) {\n    self._color = self._parseColor(value);\n  }\n\n  // If color lookup, use assigned, defined, or inherited\n  return self._color || self._parseColor( self.inkRipple() ) || self._parseColor( getElementColor() );\n\n  /**\n   * Finds the color element and returns its text color for use as default ripple color\n   * @returns {string}\n   */\n  function getElementColor () {\n    var items = self.options && self.options.colorElement ? self.options.colorElement : [];\n    var elem =  items.length ? items[ 0 ] : self.$element[ 0 ];\n\n    return elem ? self.$window.getComputedStyle(elem).color : 'rgb(0,0,0)';\n  }\n};\n\n/**\n * Updating the ripple colors based on the current inkRipple value\n * or the element's computed style color\n */\nInkRippleCtrl.prototype.calculateColor = function () {\n  return this.color();\n};\n\n\n/**\n * Takes a string color and converts it to RGBA format\n * @param color {string}\n * @param [multiplier] {int}\n * @returns {string}\n */\n\nInkRippleCtrl.prototype._parseColor = function parseColor (color, multiplier) {\n  multiplier = multiplier || 1;\n  var colorUtil = this.$mdColorUtil;\n\n  if (!color) return;\n  if (color.indexOf('rgba') === 0) return color.replace(/\\d?\\.?\\d*\\s*\\)\\s*$/, (0.1 * multiplier).toString() + ')');\n  if (color.indexOf('rgb') === 0) return colorUtil.rgbToRgba(color);\n  if (color.indexOf('#') === 0) return colorUtil.hexToRgba(color);\n\n};\n\n/**\n * Binds events to the root element for\n */\nInkRippleCtrl.prototype.bindEvents = function () {\n  this.$element.on('mousedown', angular.bind(this, this.handleMousedown));\n  this.$element.on('mouseup touchend', angular.bind(this, this.handleMouseup));\n  this.$element.on('mouseleave', angular.bind(this, this.handleMouseup));\n  this.$element.on('touchmove', angular.bind(this, this.handleTouchmove));\n};\n\n/**\n * Create a new ripple on every mousedown event from the root element\n * @param event {MouseEvent}\n */\nInkRippleCtrl.prototype.handleMousedown = function (event) {\n  if ( this.mousedown ) return;\n\n  // When jQuery is loaded, we have to get the original event\n  if (event.hasOwnProperty('originalEvent')) event = event.originalEvent;\n  this.mousedown = true;\n  if (this.options.center) {\n    this.createRipple(this.container.prop('clientWidth') / 2, this.container.prop('clientWidth') / 2);\n  } else {\n\n    // We need to calculate the relative coordinates if the target is a sublayer of the ripple element\n    if (event.srcElement !== this.$element[0]) {\n      var layerRect = this.$element[0].getBoundingClientRect();\n      var layerX = event.clientX - layerRect.left;\n      var layerY = event.clientY - layerRect.top;\n\n      this.createRipple(layerX, layerY);\n    } else {\n      this.createRipple(event.offsetX, event.offsetY);\n    }\n  }\n};\n\n/**\n * Either remove or unlock any remaining ripples when the user mouses off of the element (either by\n * mouseup, touchend or mouseleave event)\n */\nInkRippleCtrl.prototype.handleMouseup = function () {\n  autoCleanup(this, this.clearRipples);\n};\n\n/**\n * Either remove or unlock any remaining ripples when the user mouses off of the element (by\n * touchmove)\n */\nInkRippleCtrl.prototype.handleTouchmove = function () {\n  autoCleanup(this, this.deleteRipples);\n};\n\n/**\n * Cycles through all ripples and attempts to remove them.\n */\nInkRippleCtrl.prototype.deleteRipples = function () {\n  for (var i = 0; i < this.ripples.length; i++) {\n    this.ripples[ i ].remove();\n  }\n};\n\n/**\n * Cycles through all ripples and attempts to remove them with fade.\n * Depending on logic within `fadeInComplete`, some removals will be postponed.\n */\nInkRippleCtrl.prototype.clearRipples = function () {\n  for (var i = 0; i < this.ripples.length; i++) {\n    this.fadeInComplete(this.ripples[ i ]);\n  }\n};\n\n/**\n * Creates the ripple container element\n * @returns {*}\n */\nInkRippleCtrl.prototype.createContainer = function () {\n  var container = angular.element('<div class=\"md-ripple-container\"></div>');\n  this.$element.append(container);\n  return container;\n};\n\nInkRippleCtrl.prototype.clearTimeout = function () {\n  if (this.timeout) {\n    this.$timeout.cancel(this.timeout);\n    this.timeout = null;\n  }\n};\n\nInkRippleCtrl.prototype.isRippleAllowed = function () {\n  var element = this.$element[0];\n  do {\n    if (!element.tagName || element.tagName === 'BODY') break;\n\n    if (element && angular.isFunction(element.hasAttribute)) {\n      if (element.hasAttribute('disabled')) return false;\n      if (this.inkRipple() === 'false' || this.inkRipple() === '0') return false;\n    }\n\n  } while (element = element.parentNode);\n  return true;\n};\n\n/**\n * The attribute `md-ink-ripple` may be a static or interpolated\n * color value OR a boolean indicator (used to disable ripples)\n */\nInkRippleCtrl.prototype.inkRipple = function () {\n  return this.$element.attr('md-ink-ripple');\n};\n\n/**\n * Creates a new ripple and adds it to the container.  Also tracks ripple in `this.ripples`.\n * @param left\n * @param top\n */\nInkRippleCtrl.prototype.createRipple = function (left, top) {\n  if (!this.isRippleAllowed()) return;\n\n  var ctrl        = this;\n  var colorUtil   = ctrl.$mdColorUtil;\n  var ripple      = angular.element('<div class=\"md-ripple\"></div>');\n  var width       = this.$element.prop('clientWidth');\n  var height      = this.$element.prop('clientHeight');\n  var x           = Math.max(Math.abs(width - left), left) * 2;\n  var y           = Math.max(Math.abs(height - top), top) * 2;\n  var size        = getSize(this.options.fitRipple, x, y);\n  var color       = this.calculateColor();\n\n  ripple.css({\n    left:            left + 'px',\n    top:             top + 'px',\n    background:      'black',\n    width:           size + 'px',\n    height:          size + 'px',\n    backgroundColor: colorUtil.rgbaToRgb(color),\n    borderColor:     colorUtil.rgbaToRgb(color)\n  });\n  this.lastRipple = ripple;\n\n  // we only want one timeout to be running at a time\n  this.clearTimeout();\n  this.timeout    = this.$timeout(function () {\n    ctrl.clearTimeout();\n    if (!ctrl.mousedown) ctrl.fadeInComplete(ripple);\n  }, DURATION * 0.35, false);\n\n  if (this.options.dimBackground) this.container.css({ backgroundColor: color });\n  this.container.append(ripple);\n  this.ripples.push(ripple);\n  ripple.addClass('md-ripple-placed');\n\n  this.$mdUtil.nextTick(function () {\n\n    ripple.addClass('md-ripple-scaled md-ripple-active');\n    ctrl.$timeout(function () {\n      ctrl.clearRipples();\n    }, DURATION, false);\n\n  }, false);\n\n  function getSize (fit, x, y) {\n    return fit\n        ? Math.max(x, y)\n        : Math.sqrt(Math.pow(x, 2) + Math.pow(y, 2));\n  }\n};\n\n\n\n/**\n * After fadeIn finishes, either kicks off the fade-out animation or queues the element for removal on mouseup\n * @param ripple\n */\nInkRippleCtrl.prototype.fadeInComplete = function (ripple) {\n  if (this.lastRipple === ripple) {\n    if (!this.timeout && !this.mousedown) {\n      this.removeRipple(ripple);\n    }\n  } else {\n    this.removeRipple(ripple);\n  }\n};\n\n/**\n * Kicks off the animation for removing a ripple\n * @param ripple {Element}\n */\nInkRippleCtrl.prototype.removeRipple = function (ripple) {\n  var ctrl  = this;\n  var index = this.ripples.indexOf(ripple);\n  if (index < 0) return;\n  this.ripples.splice(this.ripples.indexOf(ripple), 1);\n  ripple.removeClass('md-ripple-active');\n  ripple.addClass('md-ripple-remove');\n  if (this.ripples.length === 0) this.container.css({ backgroundColor: '' });\n  // use a 2-second timeout in order to allow for the animation to finish\n  // we don't actually care how long the animation takes\n  this.$timeout(function () {\n    ctrl.fadeOutComplete(ripple);\n  }, DURATION, false);\n};\n\n/**\n * Removes the provided ripple from the DOM\n * @param ripple\n */\nInkRippleCtrl.prototype.fadeOutComplete = function (ripple) {\n  ripple.remove();\n  this.lastRipple = null;\n};\n\n/**\n * Used to create an empty directive.  This is used to track flag-directives whose children may have\n * functionality based on them.\n *\n * Example: `md-no-ink` will potentially be used by all child directives.\n */\nfunction attrNoDirective () {\n  return { controller: angular.noop };\n}\n\n})();\n(function(){\n\"use strict\";\n\n(function() {\n  'use strict';\n\n    /**\n   * @ngdoc service\n   * @name $mdTabInkRipple\n   * @module material.core\n   *\n   * @description\n   * Provides ripple effects for md-tabs.  See $mdInkRipple service for all possible configuration options.\n   *\n   * @param {object=} scope Scope within the current context\n   * @param {object=} element The element the ripple effect should be applied to\n   * @param {object=} options (Optional) Configuration options to override the defaultripple configuration\n   */\n\n  MdTabInkRipple.$inject = [\"$mdInkRipple\"];\n  angular.module('material.core')\n    .factory('$mdTabInkRipple', MdTabInkRipple);\n\n  function MdTabInkRipple($mdInkRipple) {\n    return {\n      attach: attach\n    };\n\n    function attach(scope, element, options) {\n      return $mdInkRipple.attach(scope, element, angular.extend({\n        center: false,\n        dimBackground: true,\n        outline: false,\n        rippleSize: 'full'\n      }, options));\n    }\n  }\n})();\n\n})();\n(function(){\n\"use strict\";\n\nangular.module('material.core.theming.palette', [])\n.constant('$mdColorPalette', {\n  'red': {\n    '50': '#ffebee',\n    '100': '#ffcdd2',\n    '200': '#ef9a9a',\n    '300': '#e57373',\n    '400': '#ef5350',\n    '500': '#f44336',\n    '600': '#e53935',\n    '700': '#d32f2f',\n    '800': '#c62828',\n    '900': '#b71c1c',\n    'A100': '#ff8a80',\n    'A200': '#ff5252',\n    'A400': '#ff1744',\n    'A700': '#d50000',\n    'contrastDefaultColor': 'light',\n    'contrastDarkColors': '50 100 200 300 A100',\n    'contrastStrongLightColors': '400 500 600 700 A200 A400 A700'\n  },\n  'pink': {\n    '50': '#fce4ec',\n    '100': '#f8bbd0',\n    '200': '#f48fb1',\n    '300': '#f06292',\n    '400': '#ec407a',\n    '500': '#e91e63',\n    '600': '#d81b60',\n    '700': '#c2185b',\n    '800': '#ad1457',\n    '900': '#880e4f',\n    'A100': '#ff80ab',\n    'A200': '#ff4081',\n    'A400': '#f50057',\n    'A700': '#c51162',\n    'contrastDefaultColor': 'light',\n    'contrastDarkColors': '50 100 200 A100',\n    'contrastStrongLightColors': '500 600 A200 A400 A700'\n  },\n  'purple': {\n    '50': '#f3e5f5',\n    '100': '#e1bee7',\n    '200': '#ce93d8',\n    '300': '#ba68c8',\n    '400': '#ab47bc',\n    '500': '#9c27b0',\n    '600': '#8e24aa',\n    '700': '#7b1fa2',\n    '800': '#6a1b9a',\n    '900': '#4a148c',\n    'A100': '#ea80fc',\n    'A200': '#e040fb',\n    'A400': '#d500f9',\n    'A700': '#aa00ff',\n    'contrastDefaultColor': 'light',\n    'contrastDarkColors': '50 100 200 A100',\n    'contrastStrongLightColors': '300 400 A200 A400 A700'\n  },\n  'deep-purple': {\n    '50': '#ede7f6',\n    '100': '#d1c4e9',\n    '200': '#b39ddb',\n    '300': '#9575cd',\n    '400': '#7e57c2',\n    '500': '#673ab7',\n    '600': '#5e35b1',\n    '700': '#512da8',\n    '800': '#4527a0',\n    '900': '#311b92',\n    'A100': '#b388ff',\n    'A200': '#7c4dff',\n    'A400': '#651fff',\n    'A700': '#6200ea',\n    'contrastDefaultColor': 'light',\n    'contrastDarkColors': '50 100 200 A100',\n    'contrastStrongLightColors': '300 400 A200'\n  },\n  'indigo': {\n    '50': '#e8eaf6',\n    '100': '#c5cae9',\n    '200': '#9fa8da',\n    '300': '#7986cb',\n    '400': '#5c6bc0',\n    '500': '#3f51b5',\n    '600': '#3949ab',\n    '700': '#303f9f',\n    '800': '#283593',\n    '900': '#1a237e',\n    'A100': '#8c9eff',\n    'A200': '#536dfe',\n    'A400': '#3d5afe',\n    'A700': '#304ffe',\n    'contrastDefaultColor': 'light',\n    'contrastDarkColors': '50 100 200 A100',\n    'contrastStrongLightColors': '300 400 A200 A400'\n  },\n  'blue': {\n    '50': '#e3f2fd',\n    '100': '#bbdefb',\n    '200': '#90caf9',\n    '300': '#64b5f6',\n    '400': '#42a5f5',\n    '500': '#2196f3',\n    '600': '#1e88e5',\n    '700': '#1976d2',\n    '800': '#1565c0',\n    '900': '#0d47a1',\n    'A100': '#82b1ff',\n    'A200': '#448aff',\n    'A400': '#2979ff',\n    'A700': '#2962ff',\n    'contrastDefaultColor': 'light',\n    'contrastDarkColors': '50 100 200 300 400 A100',\n    'contrastStrongLightColors': '500 600 700 A200 A400 A700'\n  },\n  'light-blue': {\n    '50': '#e1f5fe',\n    '100': '#b3e5fc',\n    '200': '#81d4fa',\n    '300': '#4fc3f7',\n    '400': '#29b6f6',\n    '500': '#03a9f4',\n    '600': '#039be5',\n    '700': '#0288d1',\n    '800': '#0277bd',\n    '900': '#01579b',\n    'A100': '#80d8ff',\n    'A200': '#40c4ff',\n    'A400': '#00b0ff',\n    'A700': '#0091ea',\n    'contrastDefaultColor': 'dark',\n    'contrastLightColors': '600 700 800 900 A700',\n    'contrastStrongLightColors': '600 700 800 A700'\n  },\n  'cyan': {\n    '50': '#e0f7fa',\n    '100': '#b2ebf2',\n    '200': '#80deea',\n    '300': '#4dd0e1',\n    '400': '#26c6da',\n    '500': '#00bcd4',\n    '600': '#00acc1',\n    '700': '#0097a7',\n    '800': '#00838f',\n    '900': '#006064',\n    'A100': '#84ffff',\n    'A200': '#18ffff',\n    'A400': '#00e5ff',\n    'A700': '#00b8d4',\n    'contrastDefaultColor': 'dark',\n    'contrastLightColors': '700 800 900',\n    'contrastStrongLightColors': '700 800 900'\n  },\n  'teal': {\n    '50': '#e0f2f1',\n    '100': '#b2dfdb',\n    '200': '#80cbc4',\n    '300': '#4db6ac',\n    '400': '#26a69a',\n    '500': '#009688',\n    '600': '#00897b',\n    '700': '#00796b',\n    '800': '#00695c',\n    '900': '#004d40',\n    'A100': '#a7ffeb',\n    'A200': '#64ffda',\n    'A400': '#1de9b6',\n    'A700': '#00bfa5',\n    'contrastDefaultColor': 'dark',\n    'contrastLightColors': '500 600 700 800 900',\n    'contrastStrongLightColors': '500 600 700'\n  },\n  'green': {\n    '50': '#e8f5e9',\n    '100': '#c8e6c9',\n    '200': '#a5d6a7',\n    '300': '#81c784',\n    '400': '#66bb6a',\n    '500': '#4caf50',\n    '600': '#43a047',\n    '700': '#388e3c',\n    '800': '#2e7d32',\n    '900': '#1b5e20',\n    'A100': '#b9f6ca',\n    'A200': '#69f0ae',\n    'A400': '#00e676',\n    'A700': '#00c853',\n    'contrastDefaultColor': 'dark',\n    'contrastLightColors': '500 600 700 800 900',\n    'contrastStrongLightColors': '500 600 700'\n  },\n  'light-green': {\n    '50': '#f1f8e9',\n    '100': '#dcedc8',\n    '200': '#c5e1a5',\n    '300': '#aed581',\n    '400': '#9ccc65',\n    '500': '#8bc34a',\n    '600': '#7cb342',\n    '700': '#689f38',\n    '800': '#558b2f',\n    '900': '#33691e',\n    'A100': '#ccff90',\n    'A200': '#b2ff59',\n    'A400': '#76ff03',\n    'A700': '#64dd17',\n    'contrastDefaultColor': 'dark',\n    'contrastLightColors': '700 800 900',\n    'contrastStrongLightColors': '700 800 900'\n  },\n  'lime': {\n    '50': '#f9fbe7',\n    '100': '#f0f4c3',\n    '200': '#e6ee9c',\n    '300': '#dce775',\n    '400': '#d4e157',\n    '500': '#cddc39',\n    '600': '#c0ca33',\n    '700': '#afb42b',\n    '800': '#9e9d24',\n    '900': '#827717',\n    'A100': '#f4ff81',\n    'A200': '#eeff41',\n    'A400': '#c6ff00',\n    'A700': '#aeea00',\n    'contrastDefaultColor': 'dark',\n    'contrastLightColors': '900',\n    'contrastStrongLightColors': '900'\n  },\n  'yellow': {\n    '50': '#fffde7',\n    '100': '#fff9c4',\n    '200': '#fff59d',\n    '300': '#fff176',\n    '400': '#ffee58',\n    '500': '#ffeb3b',\n    '600': '#fdd835',\n    '700': '#fbc02d',\n    '800': '#f9a825',\n    '900': '#f57f17',\n    'A100': '#ffff8d',\n    'A200': '#ffff00',\n    'A400': '#ffea00',\n    'A700': '#ffd600',\n    'contrastDefaultColor': 'dark'\n  },\n  'amber': {\n    '50': '#fff8e1',\n    '100': '#ffecb3',\n    '200': '#ffe082',\n    '300': '#ffd54f',\n    '400': '#ffca28',\n    '500': '#ffc107',\n    '600': '#ffb300',\n    '700': '#ffa000',\n    '800': '#ff8f00',\n    '900': '#ff6f00',\n    'A100': '#ffe57f',\n    'A200': '#ffd740',\n    'A400': '#ffc400',\n    'A700': '#ffab00',\n    'contrastDefaultColor': 'dark'\n  },\n  'orange': {\n    '50': '#fff3e0',\n    '100': '#ffe0b2',\n    '200': '#ffcc80',\n    '300': '#ffb74d',\n    '400': '#ffa726',\n    '500': '#ff9800',\n    '600': '#fb8c00',\n    '700': '#f57c00',\n    '800': '#ef6c00',\n    '900': '#e65100',\n    'A100': '#ffd180',\n    'A200': '#ffab40',\n    'A400': '#ff9100',\n    'A700': '#ff6d00',\n    'contrastDefaultColor': 'dark',\n    'contrastLightColors': '800 900',\n    'contrastStrongLightColors': '800 900'\n  },\n  'deep-orange': {\n    '50': '#fbe9e7',\n    '100': '#ffccbc',\n    '200': '#ffab91',\n    '300': '#ff8a65',\n    '400': '#ff7043',\n    '500': '#ff5722',\n    '600': '#f4511e',\n    '700': '#e64a19',\n    '800': '#d84315',\n    '900': '#bf360c',\n    'A100': '#ff9e80',\n    'A200': '#ff6e40',\n    'A400': '#ff3d00',\n    'A700': '#dd2c00',\n    'contrastDefaultColor': 'light',\n    'contrastDarkColors': '50 100 200 300 400 A100 A200',\n    'contrastStrongLightColors': '500 600 700 800 900 A400 A700'\n  },\n  'brown': {\n    '50': '#efebe9',\n    '100': '#d7ccc8',\n    '200': '#bcaaa4',\n    '300': '#a1887f',\n    '400': '#8d6e63',\n    '500': '#795548',\n    '600': '#6d4c41',\n    '700': '#5d4037',\n    '800': '#4e342e',\n    '900': '#3e2723',\n    'A100': '#d7ccc8',\n    'A200': '#bcaaa4',\n    'A400': '#8d6e63',\n    'A700': '#5d4037',\n    'contrastDefaultColor': 'light',\n    'contrastDarkColors': '50 100 200 A100 A200',\n    'contrastStrongLightColors': '300 400'\n  },\n  'grey': {\n    '50': '#fafafa',\n    '100': '#f5f5f5',\n    '200': '#eeeeee',\n    '300': '#e0e0e0',\n    '400': '#bdbdbd',\n    '500': '#9e9e9e',\n    '600': '#757575',\n    '700': '#616161',\n    '800': '#424242',\n    '900': '#212121',\n    'A100': '#ffffff',\n    'A200': '#000000',\n    'A400': '#303030',\n    'A700': '#616161',\n    'contrastDefaultColor': 'dark',\n    'contrastLightColors': '600 700 800 900 A200 A400 A700'\n  },\n  'blue-grey': {\n    '50': '#eceff1',\n    '100': '#cfd8dc',\n    '200': '#b0bec5',\n    '300': '#90a4ae',\n    '400': '#78909c',\n    '500': '#607d8b',\n    '600': '#546e7a',\n    '700': '#455a64',\n    '800': '#37474f',\n    '900': '#263238',\n    'A100': '#cfd8dc',\n    'A200': '#b0bec5',\n    'A400': '#78909c',\n    'A700': '#455a64',\n    'contrastDefaultColor': 'light',\n    'contrastDarkColors': '50 100 200 300 A100 A200',\n    'contrastStrongLightColors': '400 500 700'\n  }\n});\n\n})();\n(function(){\n\"use strict\";\n\n(function(angular) {\n  'use strict';\n/**\n * @ngdoc module\n * @name material.core.theming\n * @description\n * Theming\n */\ndetectDisabledThemes.$inject = [\"$mdThemingProvider\"];\nThemingDirective.$inject = [\"$mdTheming\", \"$interpolate\", \"$parse\", \"$mdUtil\", \"$q\", \"$log\"];\nThemableDirective.$inject = [\"$mdTheming\"];\nThemingProvider.$inject = [\"$mdColorPalette\", \"$$mdMetaProvider\"];\ngenerateAllThemes.$inject = [\"$injector\", \"$mdTheming\"];\nangular.module('material.core.theming', ['material.core.theming.palette', 'material.core.meta'])\n  .directive('mdTheme', ThemingDirective)\n  .directive('mdThemable', ThemableDirective)\n  .directive('mdThemesDisabled', disableThemesDirective )\n  .provider('$mdTheming', ThemingProvider)\n  .config( detectDisabledThemes )\n  .run(generateAllThemes);\n\n/**\n * Detect if the HTML or the BODY tags has a [md-themes-disabled] attribute\n * If yes, then immediately disable all theme stylesheet generation and DOM injection\n */\n/**\n * @ngInject\n */\nfunction detectDisabledThemes($mdThemingProvider) {\n  var isDisabled = !!document.querySelector('[md-themes-disabled]');\n  $mdThemingProvider.disableTheming(isDisabled);\n}\n\n/**\n * @ngdoc service\n * @name $mdThemingProvider\n * @module material.core.theming\n *\n * @description Provider to configure the `$mdTheming` service.\n *\n * ### Default Theme\n * The `$mdThemingProvider` uses by default the following theme configuration:\n *\n * - Primary Palette: `Blue`\n * - Accent Palette: `Pink`\n * - Warn Palette: `Deep-Orange`\n * - Background Palette: `Grey`\n *\n * If you don't want to use the `md-theme` directive on the elements itself, you may want to overwrite\n * the default theme.<br/>\n * This can be done by using the following markup.\n *\n * <hljs lang=\"js\">\n *   myAppModule.config(function($mdThemingProvider) {\n *     $mdThemingProvider\n *       .theme('default')\n *       .primaryPalette('blue')\n *       .accentPalette('teal')\n *       .warnPalette('red')\n *       .backgroundPalette('grey');\n *   });\n * </hljs>\n *\n\n * ### Dynamic Themes\n *\n * By default, if you change a theme at runtime, the `$mdTheming` service will not detect those changes.<br/>\n * If you have an application, which changes its theme on runtime, you have to enable theme watching.\n *\n * <hljs lang=\"js\">\n *   myAppModule.config(function($mdThemingProvider) {\n *     // Enable theme watching.\n *     $mdThemingProvider.alwaysWatchTheme(true);\n *   });\n * </hljs>\n *\n * ### Custom Theme Styles\n *\n * Sometimes you may want to use your own theme styles for some custom components.<br/>\n * You are able to register your own styles by using the following markup.\n *\n * <hljs lang=\"js\">\n *   myAppModule.config(function($mdThemingProvider) {\n *     // Register our custom stylesheet into the theming provider.\n *     $mdThemingProvider.registerStyles(STYLESHEET);\n *   });\n * </hljs>\n *\n * The `registerStyles` method only accepts strings as value, so you're actually not able to load an external\n * stylesheet file into the `$mdThemingProvider`.\n *\n * If it's necessary to load an external stylesheet, we suggest using a bundler, which supports including raw content,\n * like [raw-loader](https://github.com/webpack/raw-loader) for `webpack`.\n *\n * <hljs lang=\"js\">\n *   myAppModule.config(function($mdThemingProvider) {\n *     // Register your custom stylesheet into the theming provider.\n *     $mdThemingProvider.registerStyles(require('../styles/my-component.theme.css'));\n *   });\n * </hljs>\n *\n * ### Browser color\n *\n * Enables browser header coloring\n * for more info please visit:\n * https://developers.google.com/web/fundamentals/design-and-ui/browser-customization/theme-color\n *\n * Options parameter: <br/>\n * `theme`   - A defined theme via `$mdThemeProvider` to use the palettes from. Default is `default` theme. <br/>\n * `palette` - Can be any one of the basic material design palettes, extended defined palettes and 'primary',\n *             'accent', 'background' and 'warn'. Default is `primary`. <br/>\n * `hue`     - The hue from the selected palette. Default is `800`<br/>\n *\n * <hljs lang=\"js\">\n *   myAppModule.config(function($mdThemingProvider) {\n *     // Enable browser color\n *     $mdThemingProvider.enableBrowserColor({\n *       theme: 'myTheme', // Default is 'default'\n *       palette: 'accent', // Default is 'primary', any basic material palette and extended palettes are available\n *       hue: '200' // Default is '800'\n *     });\n *   });\n * </hljs>\n */\n\n/**\n * @ngdoc method\n * @name $mdThemingProvider#registerStyles\n * @param {string} styles The styles to be appended to AngularJS Material's built in theme css.\n */\n/**\n * @ngdoc method\n * @name $mdThemingProvider#setNonce\n * @param {string} nonceValue The nonce to be added as an attribute to the theme style tags.\n * Setting a value allows the use of CSP policy without using the unsafe-inline directive.\n */\n\n/**\n * @ngdoc method\n * @name $mdThemingProvider#setDefaultTheme\n * @param {string} themeName Default theme name to be applied to elements. Default value is `default`.\n */\n\n/**\n * @ngdoc method\n * @name $mdThemingProvider#alwaysWatchTheme\n * @param {boolean} watch Whether or not to always watch themes for changes and re-apply\n * classes when they change. Default is `false`. Enabling can reduce performance.\n */\n\n/**\n * @ngdoc method\n * @name $mdThemingProvider#enableBrowserColor\n * @param {Object=} options Options object for the browser color<br/>\n * `theme`   - A defined theme via `$mdThemeProvider` to use the palettes from. Default is `default` theme. <br/>\n * `palette` - Can be any one of the basic material design palettes, extended defined palettes and 'primary',\n *             'accent', 'background' and 'warn'. Default is `primary`. <br/>\n * `hue`     - The hue from the selected palette. Default is `800`<br/>\n * @returns {Function} remove function of the browser color\n */\n\n/* Some Example Valid Theming Expressions\n * =======================================\n *\n * Intention group expansion: (valid for primary, accent, warn, background)\n *\n * {{primary-100}} - grab shade 100 from the primary palette\n * {{primary-100-0.7}} - grab shade 100, apply opacity of 0.7\n * {{primary-100-contrast}} - grab shade 100's contrast color\n * {{primary-hue-1}} - grab the shade assigned to hue-1 from the primary palette\n * {{primary-hue-1-0.7}} - apply 0.7 opacity to primary-hue-1\n * {{primary-color}} - Generates .md-hue-1, .md-hue-2, .md-hue-3 with configured shades set for each hue\n * {{primary-color-0.7}} - Apply 0.7 opacity to each of the above rules\n * {{primary-contrast}} - Generates .md-hue-1, .md-hue-2, .md-hue-3 with configured contrast (ie. text) color shades set for each hue\n * {{primary-contrast-0.7}} - Apply 0.7 opacity to each of the above rules\n *\n * Foreground expansion: Applies rgba to black/white foreground text\n *\n * {{foreground-1}} - used for primary text\n * {{foreground-2}} - used for secondary text/divider\n * {{foreground-3}} - used for disabled text\n * {{foreground-4}} - used for dividers\n *\n */\n\n// In memory generated CSS rules; registered by theme.name\nvar GENERATED = { };\n\n// In memory storage of defined themes and color palettes (both loaded by CSS, and user specified)\nvar PALETTES;\n\n// Text Colors on light and dark backgrounds\n// @see https://www.google.com/design/spec/style/color.html#color-text-background-colors\nvar DARK_FOREGROUND = {\n  name: 'dark',\n  '1': 'rgba(0,0,0,0.87)',\n  '2': 'rgba(0,0,0,0.54)',\n  '3': 'rgba(0,0,0,0.38)',\n  '4': 'rgba(0,0,0,0.12)'\n};\nvar LIGHT_FOREGROUND = {\n  name: 'light',\n  '1': 'rgba(255,255,255,1.0)',\n  '2': 'rgba(255,255,255,0.7)',\n  '3': 'rgba(255,255,255,0.5)',\n  '4': 'rgba(255,255,255,0.12)'\n};\n\nvar DARK_SHADOW = '1px 1px 0px rgba(0,0,0,0.4), -1px -1px 0px rgba(0,0,0,0.4)';\nvar LIGHT_SHADOW = '';\n\nvar DARK_CONTRAST_COLOR = colorToRgbaArray('rgba(0,0,0,0.87)');\nvar LIGHT_CONTRAST_COLOR = colorToRgbaArray('rgba(255,255,255,0.87)');\nvar STRONG_LIGHT_CONTRAST_COLOR = colorToRgbaArray('rgb(255,255,255)');\n\nvar THEME_COLOR_TYPES = ['primary', 'accent', 'warn', 'background'];\nvar DEFAULT_COLOR_TYPE = 'primary';\n\n// A color in a theme will use these hues by default, if not specified by user.\nvar LIGHT_DEFAULT_HUES = {\n  'accent': {\n    'default': 'A200',\n    'hue-1': 'A100',\n    'hue-2': 'A400',\n    'hue-3': 'A700'\n  },\n  'background': {\n    'default': '50',\n    'hue-1': 'A100',\n    'hue-2': '100',\n    'hue-3': '300'\n  }\n};\n\nvar DARK_DEFAULT_HUES = {\n  'background': {\n    'default': 'A400',\n    'hue-1': '800',\n    'hue-2': '900',\n    'hue-3': 'A200'\n  }\n};\nTHEME_COLOR_TYPES.forEach(function(colorType) {\n  // Color types with unspecified default hues will use these default hue values\n  var defaultDefaultHues = {\n    'default': '500',\n    'hue-1': '300',\n    'hue-2': '800',\n    'hue-3': 'A100'\n  };\n  if (!LIGHT_DEFAULT_HUES[colorType]) LIGHT_DEFAULT_HUES[colorType] = defaultDefaultHues;\n  if (!DARK_DEFAULT_HUES[colorType]) DARK_DEFAULT_HUES[colorType] = defaultDefaultHues;\n});\n\nvar VALID_HUE_VALUES = [\n  '50', '100', '200', '300', '400', '500', '600',\n  '700', '800', '900', 'A100', 'A200', 'A400', 'A700'\n];\n\nvar themeConfig = {\n  disableTheming : false,   // Generate our themes at run time; also disable stylesheet DOM injection\n  generateOnDemand : false, // Whether or not themes are to be generated on-demand (vs. eagerly).\n  registeredStyles : [],    // Custom styles registered to be used in the theming of custom components.\n  nonce : null              // Nonce to be added as an attribute to the generated themes style tags.\n};\n\n/**\n *\n */\nfunction ThemingProvider($mdColorPalette, $$mdMetaProvider) {\n  ThemingService.$inject = [\"$rootScope\", \"$mdUtil\", \"$q\", \"$log\"];\n  PALETTES = { };\n  var THEMES = { };\n\n  var themingProvider;\n\n  var alwaysWatchTheme = false;\n  var defaultTheme = 'default';\n\n  // Load JS Defined Palettes\n  angular.extend(PALETTES, $mdColorPalette);\n\n  // Default theme defined in core.js\n\n  /**\n   * Adds `theme-color` and `msapplication-navbutton-color` meta tags with the color parameter\n   * @param {string} color Hex value of the wanted browser color\n   * @returns {Function} Remove function of the meta tags\n   */\n  var setBrowserColor = function (color) {\n    // Chrome, Firefox OS and Opera\n    var removeChrome = $$mdMetaProvider.setMeta('theme-color', color);\n    // Windows Phone\n    var removeWindows = $$mdMetaProvider.setMeta('msapplication-navbutton-color', color);\n\n    return function () {\n      removeChrome();\n      removeWindows();\n    };\n  };\n\n  /**\n   * Enables browser header coloring\n   * for more info please visit:\n   * https://developers.google.com/web/fundamentals/design-and-ui/browser-customization/theme-color\n   *\n   * The default color is `800` from `primary` palette of the `default` theme\n   *\n   * options are:\n   * `theme`   - A defined theme via `$mdThemeProvider` to use the palettes from. Default is `default` theme\n   * `palette` - Can be any one of the basic material design palettes, extended defined palettes and 'primary',\n   *             'accent', 'background' and 'warn'. Default is `primary`\n   * `hue`     - The hue from the selected palette. Default is `800`\n   *\n   * @param {Object=} options Options object for the browser color\n   * @returns {Function} remove function of the browser color\n   */\n  var enableBrowserColor = function (options) {\n    options = angular.isObject(options) ? options : {};\n\n    var theme = options.theme || 'default';\n    var hue = options.hue || '800';\n\n    var palette = PALETTES[options.palette] ||\n      PALETTES[THEMES[theme].colors[options.palette || 'primary'].name];\n\n    var color = angular.isObject(palette[hue]) ? palette[hue].hex : palette[hue];\n\n    return setBrowserColor(color);\n  };\n\n  return themingProvider = {\n    definePalette: definePalette,\n    extendPalette: extendPalette,\n    theme: registerTheme,\n\n    /**\n     * return a read-only clone of the current theme configuration\n     */\n    configuration : function() {\n      return angular.extend( { }, themeConfig, {\n        defaultTheme : defaultTheme,\n        alwaysWatchTheme : alwaysWatchTheme,\n        registeredStyles : [].concat(themeConfig.registeredStyles)\n      });\n    },\n\n    /**\n     * Easy way to disable theming without having to use\n     * `.constant(\"$MD_THEME_CSS\",\"\");` This disables\n     * all dynamic theme style sheet generations and injections...\n     */\n    disableTheming: function(isDisabled) {\n      themeConfig.disableTheming = angular.isUndefined(isDisabled) || !!isDisabled;\n    },\n\n    registerStyles: function(styles) {\n      themeConfig.registeredStyles.push(styles);\n    },\n\n    setNonce: function(nonceValue) {\n      themeConfig.nonce = nonceValue;\n    },\n\n    generateThemesOnDemand: function(onDemand) {\n      themeConfig.generateOnDemand = onDemand;\n    },\n\n    setDefaultTheme: function(theme) {\n      defaultTheme = theme;\n    },\n\n    alwaysWatchTheme: function(alwaysWatch) {\n      alwaysWatchTheme = alwaysWatch;\n    },\n\n    enableBrowserColor: enableBrowserColor,\n\n    $get: ThemingService,\n    _LIGHT_DEFAULT_HUES: LIGHT_DEFAULT_HUES,\n    _DARK_DEFAULT_HUES: DARK_DEFAULT_HUES,\n    _PALETTES: PALETTES,\n    _THEMES: THEMES,\n    _parseRules: parseRules,\n    _rgba: rgba\n  };\n\n  // Example: $mdThemingProvider.definePalette('neonRed', { 50: '#f5fafa', ... });\n  function definePalette(name, map) {\n    map = map || {};\n    PALETTES[name] = checkPaletteValid(name, map);\n    return themingProvider;\n  }\n\n  // Returns an new object which is a copy of a given palette `name` with variables from\n  // `map` overwritten\n  // Example: var neonRedMap = $mdThemingProvider.extendPalette('red', { 50: '#f5fafafa' });\n  function extendPalette(name, map) {\n    return checkPaletteValid(name,  angular.extend({}, PALETTES[name] || {}, map) );\n  }\n\n  // Make sure that palette has all required hues\n  function checkPaletteValid(name, map) {\n    var missingColors = VALID_HUE_VALUES.filter(function(field) {\n      return !map[field];\n    });\n    if (missingColors.length) {\n      throw new Error(\"Missing colors %1 in palette %2!\"\n                      .replace('%1', missingColors.join(', '))\n                      .replace('%2', name));\n    }\n\n    return map;\n  }\n\n  // Register a theme (which is a collection of color palettes to use with various states\n  // ie. warn, accent, primary )\n  // Optionally inherit from an existing theme\n  // $mdThemingProvider.theme('custom-theme').primaryPalette('red');\n  function registerTheme(name, inheritFrom) {\n    if (THEMES[name]) return THEMES[name];\n\n    inheritFrom = inheritFrom || 'default';\n\n    var parentTheme = typeof inheritFrom === 'string' ? THEMES[inheritFrom] : inheritFrom;\n    var theme = new Theme(name);\n\n    if (parentTheme) {\n      angular.forEach(parentTheme.colors, function(color, colorType) {\n        theme.colors[colorType] = {\n          name: color.name,\n          // Make sure a COPY of the hues is given to the child color,\n          // not the same reference.\n          hues: angular.extend({}, color.hues)\n        };\n      });\n    }\n    THEMES[name] = theme;\n\n    return theme;\n  }\n\n  function Theme(name) {\n    var self = this;\n    self.name = name;\n    self.colors = {};\n\n    self.dark = setDark;\n    setDark(false);\n\n    function setDark(isDark) {\n      isDark = arguments.length === 0 ? true : !!isDark;\n\n      // If no change, abort\n      if (isDark === self.isDark) return;\n\n      self.isDark = isDark;\n\n      self.foregroundPalette = self.isDark ? LIGHT_FOREGROUND : DARK_FOREGROUND;\n      self.foregroundShadow = self.isDark ? DARK_SHADOW : LIGHT_SHADOW;\n\n      // Light and dark themes have different default hues.\n      // Go through each existing color type for this theme, and for every\n      // hue value that is still the default hue value from the previous light/dark setting,\n      // set it to the default hue value from the new light/dark setting.\n      var newDefaultHues = self.isDark ? DARK_DEFAULT_HUES : LIGHT_DEFAULT_HUES;\n      var oldDefaultHues = self.isDark ? LIGHT_DEFAULT_HUES : DARK_DEFAULT_HUES;\n      angular.forEach(newDefaultHues, function(newDefaults, colorType) {\n        var color = self.colors[colorType];\n        var oldDefaults = oldDefaultHues[colorType];\n        if (color) {\n          for (var hueName in color.hues) {\n            if (color.hues[hueName] === oldDefaults[hueName]) {\n              color.hues[hueName] = newDefaults[hueName];\n            }\n          }\n        }\n      });\n\n      return self;\n    }\n\n    THEME_COLOR_TYPES.forEach(function(colorType) {\n      var defaultHues = (self.isDark ? DARK_DEFAULT_HUES : LIGHT_DEFAULT_HUES)[colorType];\n      self[colorType + 'Palette'] = function setPaletteType(paletteName, hues) {\n        var color = self.colors[colorType] = {\n          name: paletteName,\n          hues: angular.extend({}, defaultHues, hues)\n        };\n\n        Object.keys(color.hues).forEach(function(name) {\n          if (!defaultHues[name]) {\n            throw new Error(\"Invalid hue name '%1' in theme %2's %3 color %4. Available hue names: %4\"\n              .replace('%1', name)\n              .replace('%2', self.name)\n              .replace('%3', paletteName)\n              .replace('%4', Object.keys(defaultHues).join(', '))\n            );\n          }\n        });\n        Object.keys(color.hues).map(function(key) {\n          return color.hues[key];\n        }).forEach(function(hueValue) {\n          if (VALID_HUE_VALUES.indexOf(hueValue) == -1) {\n            throw new Error(\"Invalid hue value '%1' in theme %2's %3 color %4. Available hue values: %5\"\n              .replace('%1', hueValue)\n              .replace('%2', self.name)\n              .replace('%3', colorType)\n              .replace('%4', paletteName)\n              .replace('%5', VALID_HUE_VALUES.join(', '))\n            );\n          }\n        });\n        return self;\n      };\n\n      self[colorType + 'Color'] = function() {\n        var args = Array.prototype.slice.call(arguments);\n        console.warn('$mdThemingProviderTheme.' + colorType + 'Color() has been deprecated. ' +\n                     'Use $mdThemingProviderTheme.' + colorType + 'Palette() instead.');\n        return self[colorType + 'Palette'].apply(self, args);\n      };\n    });\n  }\n\n  /**\n   * @ngdoc service\n   * @name $mdTheming\n   * @module material.core.theming\n   *\n   * @description\n   *\n   * Service that makes an element apply theming related <b>classes</b> to itself.\n   *\n   * <hljs lang=\"js\">\n   * app.directive('myFancyDirective', function($mdTheming) {\n   *   return {\n   *     restrict: 'e',\n   *     link: function(scope, el, attrs) {\n   *       $mdTheming(el);\n   *\n   *       $mdTheming.defineTheme('myTheme', {\n   *         primary: 'blue',\n   *         accent: 'pink',\n   *         dark: true\n   *       })\n   *     }\n   *   };\n   * });\n   * </hljs>\n   * @param {element=} element to apply theming to\n   */\n\n  /**\n   * @ngdoc property\n   * @name $mdTheming#THEMES\n   * @description\n   * Property to get all the themes defined\n   * @returns {Object} All the themes defined with their properties\n   */\n\n  /**\n   * @ngdoc property\n   * @name $mdTheming#PALETTES\n   * @description\n   * Property to get all the palettes defined\n   * @returns {Object} All the palettes defined with their colors\n   */\n\n  /**\n   * @ngdoc method\n   * @name $mdTheming#registered\n   * @description\n   * Determine is specified theme name is a valid, registered theme\n   * @param {string} themeName the theme to check if registered\n   * @returns {boolean} whether the theme is registered or not\n   */\n\n  /**\n   * @ngdoc method\n   * @name $mdTheming#defaultTheme\n   * @description\n   * Returns the default theme\n   * @returns {string} The default theme\n   */\n\n  /**\n   * @ngdoc method\n   * @name $mdTheming#generateTheme\n   * @description\n   * Lazy generate themes - by default, every theme is generated when defined.\n   * You can disable this in the configuration section using the\n   * `$mdThemingProvider.generateThemesOnDemand(true);`\n   *\n   * The theme name that is passed in must match the name of the theme that was defined as part of the configuration block.\n   *\n   * @param name {string} theme name to generate\n   */\n\n  /**\n   * @ngdoc method\n   * @name $mdTheming#setBrowserColor\n   * @description\n   * Sets browser header coloring\n   * for more info please visit:\n   * https://developers.google.com/web/fundamentals/design-and-ui/browser-customization/theme-color\n   *\n   * The default color is `800` from `primary` palette of the `default` theme\n   *\n   * options are:<br/>\n   * `theme`   - A defined theme via `$mdThemeProvider` to use the palettes from. Default is `default` theme.<br/>\n   * `palette` - Can be any one of the basic material design palettes, extended defined palettes and 'primary',\n   *             'accent', 'background' and 'warn'. Default is `primary`<br/>\n   * `hue`     - The hue from the selected palette. Default is `800`\n   *\n   * @param {Object} options Options object for the browser color\n   * @returns {Function} remove function of the browser color\n   */\n\n  /**\n   * @ngdoc method\n   * @name $mdTheming#defineTheme\n   * @description\n   * Dynamically define a theme by an options object\n   *\n   * options are:<br/>\n   * `primary`    - The primary palette of the theme.<br/>\n   * `accent`     - The accent palette of the theme.<br/>\n   * `warn`       - The warn palette of the theme.<br/>\n   * `background` - The background palette of the theme.<br/>\n   * `dark`       - Indicates if it's a dark theme.<br/>\n   *\n   * @param {String} name Theme name to define\n   * @param {Object} options Theme definition options\n   * @returns {Promise<string>} A resolved promise with the theme name\n   */\n\n  /* @ngInject */\n  function ThemingService($rootScope, $mdUtil, $q, $log) {\n        // Allow us to be invoked via a linking function signature.\n    var applyTheme = function (scope, el) {\n          if (el === undefined) { el = scope; scope = undefined; }\n          if (scope === undefined) { scope = $rootScope; }\n          applyTheme.inherit(el, el);\n        };\n\n    Object.defineProperty(applyTheme, 'THEMES', {\n      get: function () {\n        return angular.extend({}, THEMES);\n      }\n    });\n    Object.defineProperty(applyTheme, 'PALETTES', {\n      get: function () {\n        return angular.extend({}, PALETTES);\n      }\n    });\n    Object.defineProperty(applyTheme, 'ALWAYS_WATCH', {\n      get: function () {\n        return alwaysWatchTheme;\n      }\n    });\n    applyTheme.inherit = inheritTheme;\n    applyTheme.registered = registered;\n    applyTheme.defaultTheme = function() { return defaultTheme; };\n    applyTheme.generateTheme = function(name) { generateTheme(THEMES[name], name, themeConfig.nonce); };\n    applyTheme.defineTheme = function(name, options) {\n      options = options || {};\n\n      var theme = registerTheme(name);\n\n      if (options.primary) {\n        theme.primaryPalette(options.primary);\n      }\n      if (options.accent) {\n        theme.accentPalette(options.accent);\n      }\n      if (options.warn) {\n        theme.warnPalette(options.warn);\n      }\n      if (options.background) {\n        theme.backgroundPalette(options.background);\n      }\n      if (options.dark){\n        theme.dark();\n      }\n\n      this.generateTheme(name);\n\n      return $q.resolve(name);\n    };\n    applyTheme.setBrowserColor = enableBrowserColor;\n\n    return applyTheme;\n\n    /**\n     * Determine is specified theme name is a valid, registered theme\n     */\n    function registered(themeName) {\n      if (themeName === undefined || themeName === '') return true;\n      return applyTheme.THEMES[themeName] !== undefined;\n    }\n\n    /**\n     * Get theme name for the element, then update with Theme CSS class\n     */\n    function inheritTheme (el, parent) {\n      var ctrl = parent.controller('mdTheme') || el.data('$mdThemeController');\n\n      updateThemeClass(lookupThemeName());\n\n      if (ctrl) {\n        var watchTheme = alwaysWatchTheme ||\n                         ctrl.$shouldWatch ||\n                         $mdUtil.parseAttributeBoolean(el.attr('md-theme-watch'));\n\n        var unwatch = ctrl.registerChanges(function (name) {\n          updateThemeClass(name);\n\n          if (!watchTheme) {\n            unwatch();\n          }\n          else {\n            el.on('$destroy', unwatch);\n          }\n        });\n      }\n\n      /**\n       * Find the theme name from the parent controller or element data\n       */\n      function lookupThemeName() {\n        // As a few components (dialog) add their controllers later, we should also watch for a controller init.\n        return ctrl && ctrl.$mdTheme || (defaultTheme == 'default' ? '' : defaultTheme);\n      }\n\n      /**\n       * Remove old theme class and apply a new one\n       * NOTE: if not a valid theme name, then the current name is not changed\n       */\n      function updateThemeClass(theme) {\n        if (!theme) return;\n        if (!registered(theme)) {\n          $log.warn('Attempted to use unregistered theme \\'' + theme + '\\'. ' +\n                    'Register it with $mdThemingProvider.theme().');\n        }\n\n        var oldTheme = el.data('$mdThemeName');\n        if (oldTheme) el.removeClass('md-' + oldTheme +'-theme');\n        el.addClass('md-' + theme + '-theme');\n        el.data('$mdThemeName', theme);\n        if (ctrl) {\n          el.data('$mdThemeController', ctrl);\n        }\n      }\n    }\n\n  }\n}\n\nfunction ThemingDirective($mdTheming, $interpolate, $parse, $mdUtil, $q, $log) {\n  return {\n    priority: 101, // has to be more than 100 to be before interpolation (issue on IE)\n    link: {\n      pre: function(scope, el, attrs) {\n        var registeredCallbacks = [];\n\n        var startSymbol = $interpolate.startSymbol();\n        var endSymbol = $interpolate.endSymbol();\n\n        var theme = attrs.mdTheme.trim();\n\n        var hasInterpolation =\n          theme.substr(0, startSymbol.length) === startSymbol &&\n          theme.lastIndexOf(endSymbol) === theme.length - endSymbol.length;\n\n        var oneTimeOperator = '::';\n        var oneTimeBind = attrs.mdTheme\n            .split(startSymbol).join('')\n            .split(endSymbol).join('')\n            .trim()\n            .substr(0, oneTimeOperator.length) === oneTimeOperator;\n\n        var ctrl = {\n          registerChanges: function (cb, context) {\n            if (context) {\n              cb = angular.bind(context, cb);\n            }\n\n            registeredCallbacks.push(cb);\n\n            return function () {\n              var index = registeredCallbacks.indexOf(cb);\n\n              if (index > -1) {\n                registeredCallbacks.splice(index, 1);\n              }\n            };\n          },\n          $setTheme: function (theme) {\n            if (!$mdTheming.registered(theme)) {\n              $log.warn('attempted to use unregistered theme \\'' + theme + '\\'');\n            }\n\n            ctrl.$mdTheme = theme;\n\n            // Iterating backwards to support unregistering during iteration\n            // http://stackoverflow.com/a/9882349/890293\n            // we don't use `reverse()` of array because it mutates the array and we don't want it to get re-indexed\n            for (var i = registeredCallbacks.length; i--;) {\n              registeredCallbacks[i](theme);\n            }\n          },\n          $shouldWatch: $mdUtil.parseAttributeBoolean(el.attr('md-theme-watch')) ||\n                        $mdTheming.ALWAYS_WATCH ||\n                        (hasInterpolation && !oneTimeBind)\n        };\n\n        el.data('$mdThemeController', ctrl);\n\n        var getTheme = function () {\n          var interpolation = $interpolate(attrs.mdTheme)(scope);\n          return $parse(interpolation)(scope) || interpolation;\n        };\n\n        var setParsedTheme = function (theme) {\n          if (typeof theme === 'string') {\n            return ctrl.$setTheme(theme);\n          }\n\n          $q.when( angular.isFunction(theme) ?  theme() : theme )\n            .then(function(name){\n              ctrl.$setTheme(name);\n            });\n        };\n\n        setParsedTheme(getTheme());\n\n        var unwatch = scope.$watch(getTheme, function(theme) {\n          if (theme) {\n            setParsedTheme(theme);\n\n            if (!ctrl.$shouldWatch) {\n              unwatch();\n            }\n          }\n        });\n      }\n    }\n  };\n}\n\n/**\n * Special directive that will disable ALL runtime Theme style generation and DOM injection\n *\n * <link rel=\"stylesheet\" href=\"angular-material.min.css\">\n * <link rel=\"stylesheet\" href=\"angular-material.themes.css\">\n *\n * <body md-themes-disabled>\n *  ...\n * </body>\n *\n * Note: Using md-themes-css directive requires the developer to load external\n * theme stylesheets; e.g. custom themes from Material-Tools:\n *\n *       `angular-material.themes.css`\n *\n * Another option is to use the ThemingProvider to configure and disable the attribute\n * conversions; this would obviate the use of the `md-themes-css` directive\n *\n */\nfunction disableThemesDirective() {\n  themeConfig.disableTheming = true;\n\n  // Return a 1x-only, first-match attribute directive\n  return {\n    restrict : 'A',\n    priority : '900'\n  };\n}\n\nfunction ThemableDirective($mdTheming) {\n  return $mdTheming;\n}\n\nfunction parseRules(theme, colorType, rules) {\n  checkValidPalette(theme, colorType);\n\n  rules = rules.replace(/THEME_NAME/g, theme.name);\n  var generatedRules = [];\n  var color = theme.colors[colorType];\n\n  var themeNameRegex = new RegExp('\\\\.md-' + theme.name + '-theme', 'g');\n  // Matches '{{ primary-color }}', etc\n  var hueRegex = new RegExp('(\\'|\")?{{\\\\s*(' + colorType + ')-(color|contrast)-?(\\\\d\\\\.?\\\\d*)?\\\\s*}}(\\\"|\\')?','g');\n  var simpleVariableRegex = /'?\"?\\{\\{\\s*([a-zA-Z]+)-(A?\\d+|hue\\-[0-3]|shadow|default)-?(\\d\\.?\\d*)?(contrast)?\\s*\\}\\}'?\"?/g;\n  var palette = PALETTES[color.name];\n\n  // find and replace simple variables where we use a specific hue, not an entire palette\n  // eg. \"{{primary-100}}\"\n  //\\(' + THEME_COLOR_TYPES.join('\\|') + '\\)'\n  rules = rules.replace(simpleVariableRegex, function(match, colorType, hue, opacity, contrast) {\n    if (colorType === 'foreground') {\n      if (hue == 'shadow') {\n        return theme.foregroundShadow;\n      } else {\n        return theme.foregroundPalette[hue] || theme.foregroundPalette['1'];\n      }\n    }\n\n    // `default` is also accepted as a hue-value, because the background palettes are\n    // using it as a name for the default hue.\n    if (hue.indexOf('hue') === 0 || hue === 'default') {\n      hue = theme.colors[colorType].hues[hue];\n    }\n\n    return rgba( (PALETTES[ theme.colors[colorType].name ][hue] || '')[contrast ? 'contrast' : 'value'], opacity );\n  });\n\n  // For each type, generate rules for each hue (ie. default, md-hue-1, md-hue-2, md-hue-3)\n  angular.forEach(color.hues, function(hueValue, hueName) {\n    var newRule = rules\n      .replace(hueRegex, function(match, _, colorType, hueType, opacity) {\n        return rgba(palette[hueValue][hueType === 'color' ? 'value' : 'contrast'], opacity);\n      });\n    if (hueName !== 'default') {\n      newRule = newRule.replace(themeNameRegex, '.md-' + theme.name + '-theme.md-' + hueName);\n    }\n\n    // Don't apply a selector rule to the default theme, making it easier to override\n    // styles of the base-component\n    if (theme.name == 'default') {\n      var themeRuleRegex = /((?:\\s|>|\\.|\\w|-|:|\\(|\\)|\\[|\\]|\"|'|=)*)\\.md-default-theme((?:\\s|>|\\.|\\w|-|:|\\(|\\)|\\[|\\]|\"|'|=)*)/g;\n\n      newRule = newRule.replace(themeRuleRegex, function(match, start, end) {\n        return match + ', ' + start + end;\n      });\n    }\n    generatedRules.push(newRule);\n  });\n\n  return generatedRules;\n}\n\nvar rulesByType = {};\n\n// Generate our themes at run time given the state of THEMES and PALETTES\nfunction generateAllThemes($injector, $mdTheming) {\n  var head = document.head;\n  var firstChild = head ? head.firstElementChild : null;\n  var themeCss = !themeConfig.disableTheming && $injector.has('$MD_THEME_CSS') ? $injector.get('$MD_THEME_CSS') : '';\n\n  // Append our custom registered styles to the theme stylesheet.\n  themeCss += themeConfig.registeredStyles.join('');\n\n  if ( !firstChild ) return;\n  if (themeCss.length === 0) return; // no rules, so no point in running this expensive task\n\n  // Expose contrast colors for palettes to ensure that text is always readable\n  angular.forEach(PALETTES, sanitizePalette);\n\n  // MD_THEME_CSS is a string generated by the build process that includes all the themable\n  // components as templates\n\n  // Break the CSS into individual rules\n  var rules = themeCss\n                  .split(/\\}(?!(\\}|'|\"|;))/)\n                  .filter(function(rule) { return rule && rule.trim().length; })\n                  .map(function(rule) { return rule.trim() + '}'; });\n\n\n  var ruleMatchRegex = new RegExp('md-(' + THEME_COLOR_TYPES.join('|') + ')', 'g');\n\n  THEME_COLOR_TYPES.forEach(function(type) {\n    rulesByType[type] = '';\n  });\n\n\n  // Sort the rules based on type, allowing us to do color substitution on a per-type basis\n  rules.forEach(function(rule) {\n    var match = rule.match(ruleMatchRegex);\n    // First: test that if the rule has '.md-accent', it goes into the accent set of rules\n    for (var i = 0, type; type = THEME_COLOR_TYPES[i]; i++) {\n      if (rule.indexOf('.md-' + type) > -1) {\n        return rulesByType[type] += rule;\n      }\n    }\n\n    // If no eg 'md-accent' class is found, try to just find 'accent' in the rule and guess from\n    // there\n    for (i = 0; type = THEME_COLOR_TYPES[i]; i++) {\n      if (rule.indexOf(type) > -1) {\n        return rulesByType[type] += rule;\n      }\n    }\n\n    // Default to the primary array\n    return rulesByType[DEFAULT_COLOR_TYPE] += rule;\n  });\n\n  // If themes are being generated on-demand, quit here. The user will later manually\n  // call generateTheme to do this on a theme-by-theme basis.\n  if (themeConfig.generateOnDemand) return;\n\n  angular.forEach($mdTheming.THEMES, function(theme) {\n    if (!GENERATED[theme.name] && !($mdTheming.defaultTheme() !== 'default' && theme.name === 'default')) {\n      generateTheme(theme, theme.name, themeConfig.nonce);\n    }\n  });\n\n\n  // *************************\n  // Internal functions\n  // *************************\n\n  // The user specifies a 'default' contrast color as either light or dark,\n  // then explicitly lists which hues are the opposite contrast (eg. A100 has dark, A200 has light)\n  function sanitizePalette(palette, name) {\n    var defaultContrast = palette.contrastDefaultColor;\n    var lightColors = palette.contrastLightColors || [];\n    var strongLightColors = palette.contrastStrongLightColors || [];\n    var darkColors = palette.contrastDarkColors || [];\n\n    // These colors are provided as space-separated lists\n    if (typeof lightColors === 'string') lightColors = lightColors.split(' ');\n    if (typeof strongLightColors === 'string') strongLightColors = strongLightColors.split(' ');\n    if (typeof darkColors === 'string') darkColors = darkColors.split(' ');\n\n    // Cleanup after ourselves\n    delete palette.contrastDefaultColor;\n    delete palette.contrastLightColors;\n    delete palette.contrastStrongLightColors;\n    delete palette.contrastDarkColors;\n\n    // Change { 'A100': '#fffeee' } to { 'A100': { value: '#fffeee', contrast:DARK_CONTRAST_COLOR }\n    angular.forEach(palette, function(hueValue, hueName) {\n      if (angular.isObject(hueValue)) return; // Already converted\n      // Map everything to rgb colors\n      var rgbValue = colorToRgbaArray(hueValue);\n      if (!rgbValue) {\n        throw new Error(\"Color %1, in palette %2's hue %3, is invalid. Hex or rgb(a) color expected.\"\n                        .replace('%1', hueValue)\n                        .replace('%2', palette.name)\n                        .replace('%3', hueName));\n      }\n\n      palette[hueName] = {\n        hex: palette[hueName],\n        value: rgbValue,\n        contrast: getContrastColor()\n      };\n      function getContrastColor() {\n        if (defaultContrast === 'light') {\n          if (darkColors.indexOf(hueName) > -1) {\n            return DARK_CONTRAST_COLOR;\n          } else {\n            return strongLightColors.indexOf(hueName) > -1 ? STRONG_LIGHT_CONTRAST_COLOR\n              : LIGHT_CONTRAST_COLOR;\n          }\n        } else {\n          if (lightColors.indexOf(hueName) > -1) {\n            return strongLightColors.indexOf(hueName) > -1 ? STRONG_LIGHT_CONTRAST_COLOR\n              : LIGHT_CONTRAST_COLOR;\n          } else {\n            return DARK_CONTRAST_COLOR;\n          }\n        }\n      }\n    });\n  }\n}\n\nfunction generateTheme(theme, name, nonce) {\n  var head = document.head;\n  var firstChild = head ? head.firstElementChild : null;\n\n  if (!GENERATED[name]) {\n    // For each theme, use the color palettes specified for\n    // `primary`, `warn` and `accent` to generate CSS rules.\n    THEME_COLOR_TYPES.forEach(function(colorType) {\n      var styleStrings = parseRules(theme, colorType, rulesByType[colorType]);\n      while (styleStrings.length) {\n        var styleContent = styleStrings.shift();\n        if (styleContent) {\n          var style = document.createElement('style');\n          style.setAttribute('md-theme-style', '');\n          if (nonce) {\n            style.setAttribute('nonce', nonce);\n          }\n          style.appendChild(document.createTextNode(styleContent));\n          head.insertBefore(style, firstChild);\n        }\n      }\n    });\n\n    GENERATED[theme.name] = true;\n  }\n\n}\n\n\nfunction checkValidPalette(theme, colorType) {\n  // If theme attempts to use a palette that doesnt exist, throw error\n  if (!PALETTES[ (theme.colors[colorType] || {}).name ]) {\n    throw new Error(\n      \"You supplied an invalid color palette for theme %1's %2 palette. Available palettes: %3\"\n                    .replace('%1', theme.name)\n                    .replace('%2', colorType)\n                    .replace('%3', Object.keys(PALETTES).join(', '))\n    );\n  }\n}\n\nfunction colorToRgbaArray(clr) {\n  if (angular.isArray(clr) && clr.length == 3) return clr;\n  if (/^rgb/.test(clr)) {\n    return clr.replace(/(^\\s*rgba?\\(|\\)\\s*$)/g, '').split(',').map(function(value, i) {\n      return i == 3 ? parseFloat(value, 10) : parseInt(value, 10);\n    });\n  }\n  if (clr.charAt(0) == '#') clr = clr.substring(1);\n  if (!/^([a-fA-F0-9]{3}){1,2}$/g.test(clr)) return;\n\n  var dig = clr.length / 3;\n  var red = clr.substr(0, dig);\n  var grn = clr.substr(dig, dig);\n  var blu = clr.substr(dig * 2);\n  if (dig === 1) {\n    red += red;\n    grn += grn;\n    blu += blu;\n  }\n  return [parseInt(red, 16), parseInt(grn, 16), parseInt(blu, 16)];\n}\n\nfunction rgba(rgbArray, opacity) {\n  if ( !rgbArray ) return \"rgb('0,0,0')\";\n\n  if (rgbArray.length == 4) {\n    rgbArray = angular.copy(rgbArray);\n    opacity ? rgbArray.pop() : opacity = rgbArray.pop();\n  }\n  return opacity && (typeof opacity == 'number' || (typeof opacity == 'string' && opacity.length)) ?\n    'rgba(' + rgbArray.join(',') + ',' + opacity + ')' :\n    'rgb(' + rgbArray.join(',') + ')';\n}\n\n\n})(window.angular);\n\n})();\n(function(){\n\"use strict\";\n\n// Polyfill angular < 1.4 (provide $animateCss)\nangular\n  .module('material.core')\n  .factory('$$mdAnimate', [\"$q\", \"$timeout\", \"$mdConstant\", \"$animateCss\", function($q, $timeout, $mdConstant, $animateCss){\n\n     // Since $$mdAnimate is injected into $mdUtil... use a wrapper function\n     // to subsequently inject $mdUtil as an argument to the AnimateDomUtils\n\n     return function($mdUtil) {\n       return AnimateDomUtils( $mdUtil, $q, $timeout, $mdConstant, $animateCss);\n     };\n   }]);\n\n/**\n * Factory function that requires special injections\n */\nfunction AnimateDomUtils($mdUtil, $q, $timeout, $mdConstant, $animateCss) {\n  var self;\n  return self = {\n    /**\n     *\n     */\n    translate3d : function( target, from, to, options ) {\n      return $animateCss(target, {\n        from: from,\n        to: to,\n        addClass: options.transitionInClass,\n        removeClass: options.transitionOutClass,\n        duration: options.duration\n      })\n      .start()\n      .then(function(){\n          // Resolve with reverser function...\n          return reverseTranslate;\n      });\n\n      /**\n       * Specific reversal of the request translate animation above...\n       */\n      function reverseTranslate (newFrom) {\n        return $animateCss(target, {\n           to: newFrom || from,\n           addClass: options.transitionOutClass,\n           removeClass: options.transitionInClass,\n           duration: options.duration\n        }).start();\n\n      }\n    },\n\n    /**\n     * Listen for transitionEnd event (with optional timeout)\n     * Announce completion or failure via promise handlers\n     */\n    waitTransitionEnd: function (element, opts) {\n      var TIMEOUT = 3000; // fallback is 3 secs\n\n      return $q(function(resolve, reject){\n        opts = opts || { };\n\n        // If there is no transition is found, resolve immediately\n        //\n        // NOTE: using $mdUtil.nextTick() causes delays/issues\n        if (noTransitionFound(opts.cachedTransitionStyles)) {\n          TIMEOUT = 0;\n        }\n\n        var timer = $timeout(finished, opts.timeout || TIMEOUT);\n        element.on($mdConstant.CSS.TRANSITIONEND, finished);\n\n        /**\n         * Upon timeout or transitionEnd, reject or resolve (respectively) this promise.\n         * NOTE: Make sure this transitionEnd didn't bubble up from a child\n         */\n        function finished(ev) {\n          if ( ev && ev.target !== element[0]) return;\n\n          if ( ev  ) $timeout.cancel(timer);\n          element.off($mdConstant.CSS.TRANSITIONEND, finished);\n\n          // Never reject since ngAnimate may cause timeouts due missed transitionEnd events\n          resolve();\n\n        }\n\n        /**\n         * Checks whether or not there is a transition.\n         *\n         * @param styles The cached styles to use for the calculation. If null, getComputedStyle()\n         * will be used.\n         *\n         * @returns {boolean} True if there is no transition/duration; false otherwise.\n         */\n        function noTransitionFound(styles) {\n          styles = styles || window.getComputedStyle(element[0]);\n\n          return styles.transitionDuration == '0s' || (!styles.transition && !styles.transitionProperty);\n        }\n\n      });\n    },\n\n    calculateTransformValues: function (element, originator) {\n      var origin = originator.element;\n      var bounds = originator.bounds;\n\n      if (origin || bounds) {\n        var originBnds = origin ? self.clientRect(origin) || currentBounds() : self.copyRect(bounds);\n        var dialogRect = self.copyRect(element[0].getBoundingClientRect());\n        var dialogCenterPt = self.centerPointFor(dialogRect);\n        var originCenterPt = self.centerPointFor(originBnds);\n\n        return {\n          centerX: originCenterPt.x - dialogCenterPt.x,\n          centerY: originCenterPt.y - dialogCenterPt.y,\n          scaleX: Math.round(100 * Math.min(0.5, originBnds.width / dialogRect.width)) / 100,\n          scaleY: Math.round(100 * Math.min(0.5, originBnds.height / dialogRect.height)) / 100\n        };\n      }\n      return {centerX: 0, centerY: 0, scaleX: 0.5, scaleY: 0.5};\n\n      /**\n       * This is a fallback if the origin information is no longer valid, then the\n       * origin bounds simply becomes the current bounds for the dialogContainer's parent\n       */\n      function currentBounds() {\n        var cntr = element ? element.parent() : null;\n        var parent = cntr ? cntr.parent() : null;\n\n        return parent ? self.clientRect(parent) : null;\n      }\n    },\n\n    /**\n     * Calculate the zoom transform from dialog to origin.\n     *\n     * We use this to set the dialog position immediately;\n     * then the md-transition-in actually translates back to\n     * `translate3d(0,0,0) scale(1.0)`...\n     *\n     * NOTE: all values are rounded to the nearest integer\n     */\n    calculateZoomToOrigin: function (element, originator) {\n      var zoomTemplate = \"translate3d( {centerX}px, {centerY}px, 0 ) scale( {scaleX}, {scaleY} )\";\n      var buildZoom = angular.bind(null, $mdUtil.supplant, zoomTemplate);\n\n      return buildZoom(self.calculateTransformValues(element, originator));\n    },\n\n    /**\n     * Calculate the slide transform from panel to origin.\n     * NOTE: all values are rounded to the nearest integer\n     */\n    calculateSlideToOrigin: function (element, originator) {\n      var slideTemplate = \"translate3d( {centerX}px, {centerY}px, 0 )\";\n      var buildSlide = angular.bind(null, $mdUtil.supplant, slideTemplate);\n\n      return buildSlide(self.calculateTransformValues(element, originator));\n    },\n\n    /**\n     * Enhance raw values to represent valid css stylings...\n     */\n    toCss : function( raw ) {\n      var css = { };\n      var lookups = 'left top right bottom width height x y min-width min-height max-width max-height';\n\n      angular.forEach(raw, function(value,key) {\n        if ( angular.isUndefined(value) ) return;\n\n        if ( lookups.indexOf(key) >= 0 ) {\n          css[key] = value + 'px';\n        } else {\n          switch (key) {\n            case 'transition':\n              convertToVendor(key, $mdConstant.CSS.TRANSITION, value);\n              break;\n            case 'transform':\n              convertToVendor(key, $mdConstant.CSS.TRANSFORM, value);\n              break;\n            case 'transformOrigin':\n              convertToVendor(key, $mdConstant.CSS.TRANSFORM_ORIGIN, value);\n              break;\n            case 'font-size':\n              css['font-size'] = value; // font sizes aren't always in px\n              break;\n          }\n        }\n      });\n\n      return css;\n\n      function convertToVendor(key, vendor, value) {\n        angular.forEach(vendor.split(' '), function (key) {\n          css[key] = value;\n        });\n      }\n    },\n\n    /**\n     * Convert the translate CSS value to key/value pair(s).\n     */\n    toTransformCss: function (transform, addTransition, transition) {\n      var css = {};\n      angular.forEach($mdConstant.CSS.TRANSFORM.split(' '), function (key) {\n        css[key] = transform;\n      });\n\n      if (addTransition) {\n        transition = transition || \"all 0.4s cubic-bezier(0.25, 0.8, 0.25, 1) !important\";\n        css.transition = transition;\n      }\n\n      return css;\n    },\n\n    /**\n     *  Clone the Rect and calculate the height/width if needed\n     */\n    copyRect: function (source, destination) {\n      if (!source) return null;\n\n      destination = destination || {};\n\n      angular.forEach('left top right bottom width height'.split(' '), function (key) {\n        destination[key] = Math.round(source[key]);\n      });\n\n      destination.width = destination.width || (destination.right - destination.left);\n      destination.height = destination.height || (destination.bottom - destination.top);\n\n      return destination;\n    },\n\n    /**\n     * Calculate ClientRect of element; return null if hidden or zero size\n     */\n    clientRect: function (element) {\n      var bounds = angular.element(element)[0].getBoundingClientRect();\n      var isPositiveSizeClientRect = function (rect) {\n        return rect && (rect.width > 0) && (rect.height > 0);\n      };\n\n      // If the event origin element has zero size, it has probably been hidden.\n      return isPositiveSizeClientRect(bounds) ? self.copyRect(bounds) : null;\n    },\n\n    /**\n     *  Calculate 'rounded' center point of Rect\n     */\n    centerPointFor: function (targetRect) {\n      return targetRect ? {\n        x: Math.round(targetRect.left + (targetRect.width / 2)),\n        y: Math.round(targetRect.top + (targetRect.height / 2))\n      } : { x : 0, y : 0 };\n    }\n\n  };\n}\n\n\n})();\n(function(){\n\"use strict\";\n\nif (angular.version.minor >= 4) {\n  angular.module('material.core.animate', []);\n} else {\n(function() {\n  \"use strict\";\n\n  var forEach = angular.forEach;\n\n  var WEBKIT = angular.isDefined(document.documentElement.style.WebkitAppearance);\n  var TRANSITION_PROP = WEBKIT ? 'WebkitTransition' : 'transition';\n  var ANIMATION_PROP = WEBKIT ? 'WebkitAnimation' : 'animation';\n  var PREFIX = WEBKIT ? '-webkit-' : '';\n\n  var TRANSITION_EVENTS = (WEBKIT ? 'webkitTransitionEnd ' : '') + 'transitionend';\n  var ANIMATION_EVENTS = (WEBKIT ? 'webkitAnimationEnd ' : '') + 'animationend';\n\n  var $$ForceReflowFactory = ['$document', function($document) {\n    return function() {\n      return $document[0].body.clientWidth + 1;\n    };\n  }];\n\n  var $$rAFMutexFactory = ['$$rAF', function($$rAF) {\n    return function() {\n      var passed = false;\n      $$rAF(function() {\n        passed = true;\n      });\n      return function(fn) {\n        passed ? fn() : $$rAF(fn);\n      };\n    };\n  }];\n\n  var $$AnimateRunnerFactory = ['$q', '$$rAFMutex', function($q, $$rAFMutex) {\n    var INITIAL_STATE = 0;\n    var DONE_PENDING_STATE = 1;\n    var DONE_COMPLETE_STATE = 2;\n\n    function AnimateRunner(host) {\n      this.setHost(host);\n\n      this._doneCallbacks = [];\n      this._runInAnimationFrame = $$rAFMutex();\n      this._state = 0;\n    }\n\n    AnimateRunner.prototype = {\n      setHost: function(host) {\n        this.host = host || {};\n      },\n\n      done: function(fn) {\n        if (this._state === DONE_COMPLETE_STATE) {\n          fn();\n        } else {\n          this._doneCallbacks.push(fn);\n        }\n      },\n\n      progress: angular.noop,\n\n      getPromise: function() {\n        if (!this.promise) {\n          var self = this;\n          this.promise = $q(function(resolve, reject) {\n            self.done(function(status) {\n              status === false ? reject() : resolve();\n            });\n          });\n        }\n        return this.promise;\n      },\n\n      then: function(resolveHandler, rejectHandler) {\n        return this.getPromise().then(resolveHandler, rejectHandler);\n      },\n\n      'catch': function(handler) {\n        return this.getPromise()['catch'](handler);\n      },\n\n      'finally': function(handler) {\n        return this.getPromise()['finally'](handler);\n      },\n\n      pause: function() {\n        if (this.host.pause) {\n          this.host.pause();\n        }\n      },\n\n      resume: function() {\n        if (this.host.resume) {\n          this.host.resume();\n        }\n      },\n\n      end: function() {\n        if (this.host.end) {\n          this.host.end();\n        }\n        this._resolve(true);\n      },\n\n      cancel: function() {\n        if (this.host.cancel) {\n          this.host.cancel();\n        }\n        this._resolve(false);\n      },\n\n      complete: function(response) {\n        var self = this;\n        if (self._state === INITIAL_STATE) {\n          self._state = DONE_PENDING_STATE;\n          self._runInAnimationFrame(function() {\n            self._resolve(response);\n          });\n        }\n      },\n\n      _resolve: function(response) {\n        if (this._state !== DONE_COMPLETE_STATE) {\n          forEach(this._doneCallbacks, function(fn) {\n            fn(response);\n          });\n          this._doneCallbacks.length = 0;\n          this._state = DONE_COMPLETE_STATE;\n        }\n      }\n    };\n\n    // Polyfill AnimateRunner.all which is used by input animations\n    AnimateRunner.all = function(runners, callback) {\n      var count = 0;\n      var status = true;\n      forEach(runners, function(runner) {\n        runner.done(onProgress);\n      });\n\n      function onProgress(response) {\n        status = status && response;\n        if (++count === runners.length) {\n          callback(status);\n        }\n      }\n    };\n\n    return AnimateRunner;\n  }];\n\n  angular\n    .module('material.core.animate', [])\n    .factory('$$forceReflow', $$ForceReflowFactory)\n    .factory('$$AnimateRunner', $$AnimateRunnerFactory)\n    .factory('$$rAFMutex', $$rAFMutexFactory)\n    .factory('$animateCss', ['$window', '$$rAF', '$$AnimateRunner', '$$forceReflow', '$$jqLite', '$timeout', '$animate',\n                     function($window,   $$rAF,   $$AnimateRunner,   $$forceReflow,   $$jqLite,   $timeout, $animate) {\n\n      function init(element, options) {\n\n        var temporaryStyles = [];\n        var node = getDomNode(element);\n        var areAnimationsAllowed = node && $animate.enabled();\n\n        var hasCompleteStyles = false;\n        var hasCompleteClasses = false;\n\n        if (areAnimationsAllowed) {\n          if (options.transitionStyle) {\n            temporaryStyles.push([PREFIX + 'transition', options.transitionStyle]);\n          }\n\n          if (options.keyframeStyle) {\n            temporaryStyles.push([PREFIX + 'animation', options.keyframeStyle]);\n          }\n\n          if (options.delay) {\n            temporaryStyles.push([PREFIX + 'transition-delay', options.delay + 's']);\n          }\n\n          if (options.duration) {\n            temporaryStyles.push([PREFIX + 'transition-duration', options.duration + 's']);\n          }\n\n          hasCompleteStyles = options.keyframeStyle ||\n              (options.to && (options.duration > 0 || options.transitionStyle));\n          hasCompleteClasses = !!options.addClass || !!options.removeClass;\n\n          blockTransition(element, true);\n        }\n\n        var hasCompleteAnimation = areAnimationsAllowed && (hasCompleteStyles || hasCompleteClasses);\n\n        applyAnimationFromStyles(element, options);\n\n        var animationClosed = false;\n        var events, eventFn;\n\n        return {\n          close: $window.close,\n          start: function() {\n            var runner = new $$AnimateRunner();\n            waitUntilQuiet(function() {\n              blockTransition(element, false);\n              if (!hasCompleteAnimation) {\n                return close();\n              }\n\n              forEach(temporaryStyles, function(entry) {\n                var key = entry[0];\n                var value = entry[1];\n                node.style[camelCase(key)] = value;\n              });\n\n              applyClasses(element, options);\n\n              var timings = computeTimings(element);\n              if (timings.duration === 0) {\n                return close();\n              }\n\n              var moreStyles = [];\n\n              if (options.easing) {\n                if (timings.transitionDuration) {\n                  moreStyles.push([PREFIX + 'transition-timing-function', options.easing]);\n                }\n                if (timings.animationDuration) {\n                  moreStyles.push([PREFIX + 'animation-timing-function', options.easing]);\n                }\n              }\n\n              if (options.delay && timings.animationDelay) {\n                moreStyles.push([PREFIX + 'animation-delay', options.delay + 's']);\n              }\n\n              if (options.duration && timings.animationDuration) {\n                moreStyles.push([PREFIX + 'animation-duration', options.duration + 's']);\n              }\n\n              forEach(moreStyles, function(entry) {\n                var key = entry[0];\n                var value = entry[1];\n                node.style[camelCase(key)] = value;\n                temporaryStyles.push(entry);\n              });\n\n              var maxDelay = timings.delay;\n              var maxDelayTime = maxDelay * 1000;\n              var maxDuration = timings.duration;\n              var maxDurationTime = maxDuration * 1000;\n              var startTime = Date.now();\n\n              events = [];\n              if (timings.transitionDuration) {\n                events.push(TRANSITION_EVENTS);\n              }\n              if (timings.animationDuration) {\n                events.push(ANIMATION_EVENTS);\n              }\n              events = events.join(' ');\n              eventFn = function(event) {\n                event.stopPropagation();\n                var ev = event.originalEvent || event;\n                var timeStamp = ev.timeStamp || Date.now();\n                var elapsedTime = parseFloat(ev.elapsedTime.toFixed(3));\n                if (Math.max(timeStamp - startTime, 0) >= maxDelayTime && elapsedTime >= maxDuration) {\n                  close();\n                }\n              };\n              element.on(events, eventFn);\n\n              applyAnimationToStyles(element, options);\n\n              $timeout(close, maxDelayTime + maxDurationTime * 1.5, false);\n            });\n\n            return runner;\n\n            function close() {\n              if (animationClosed) return;\n              animationClosed = true;\n\n              if (events && eventFn) {\n                element.off(events, eventFn);\n              }\n              applyClasses(element, options);\n              applyAnimationStyles(element, options);\n              forEach(temporaryStyles, function(entry) {\n                node.style[camelCase(entry[0])] = '';\n              });\n              runner.complete(true);\n              return runner;\n            }\n          }\n        };\n      }\n\n      function applyClasses(element, options) {\n        if (options.addClass) {\n          $$jqLite.addClass(element, options.addClass);\n          options.addClass = null;\n        }\n        if (options.removeClass) {\n          $$jqLite.removeClass(element, options.removeClass);\n          options.removeClass = null;\n        }\n      }\n\n      function computeTimings(element) {\n        var node = getDomNode(element);\n        var cs = $window.getComputedStyle(node);\n        var tdr = parseMaxTime(cs[prop('transitionDuration')]);\n        var adr = parseMaxTime(cs[prop('animationDuration')]);\n        var tdy = parseMaxTime(cs[prop('transitionDelay')]);\n        var ady = parseMaxTime(cs[prop('animationDelay')]);\n\n        adr *= (parseInt(cs[prop('animationIterationCount')], 10) || 1);\n        var duration = Math.max(adr, tdr);\n        var delay = Math.max(ady, tdy);\n\n        return {\n          duration: duration,\n          delay: delay,\n          animationDuration: adr,\n          transitionDuration: tdr,\n          animationDelay: ady,\n          transitionDelay: tdy\n        };\n\n        function prop(key) {\n          return WEBKIT ? 'Webkit' + key.charAt(0).toUpperCase() + key.substr(1)\n                        : key;\n        }\n      }\n\n      function parseMaxTime(str) {\n        var maxValue = 0;\n        var values = (str || \"\").split(/\\s*,\\s*/);\n        forEach(values, function(value) {\n          // it's always safe to consider only second values and omit `ms` values since\n          // getComputedStyle will always handle the conversion for us\n          if (value.charAt(value.length - 1) == 's') {\n            value = value.substring(0, value.length - 1);\n          }\n          value = parseFloat(value) || 0;\n          maxValue = maxValue ? Math.max(value, maxValue) : value;\n        });\n        return maxValue;\n      }\n\n      var cancelLastRAFRequest;\n      var rafWaitQueue = [];\n      function waitUntilQuiet(callback) {\n        if (cancelLastRAFRequest) {\n          cancelLastRAFRequest(); //cancels the request\n        }\n        rafWaitQueue.push(callback);\n        cancelLastRAFRequest = $$rAF(function() {\n          cancelLastRAFRequest = null;\n\n          // DO NOT REMOVE THIS LINE OR REFACTOR OUT THE `pageWidth` variable.\n          // PLEASE EXAMINE THE `$$forceReflow` service to understand why.\n          var pageWidth = $$forceReflow();\n\n          // we use a for loop to ensure that if the queue is changed\n          // during this looping then it will consider new requests\n          for (var i = 0; i < rafWaitQueue.length; i++) {\n            rafWaitQueue[i](pageWidth);\n          }\n          rafWaitQueue.length = 0;\n        });\n      }\n\n      function applyAnimationStyles(element, options) {\n        applyAnimationFromStyles(element, options);\n        applyAnimationToStyles(element, options);\n      }\n\n      function applyAnimationFromStyles(element, options) {\n        if (options.from) {\n          element.css(options.from);\n          options.from = null;\n        }\n      }\n\n      function applyAnimationToStyles(element, options) {\n        if (options.to) {\n          element.css(options.to);\n          options.to = null;\n        }\n      }\n\n      function getDomNode(element) {\n        for (var i = 0; i < element.length; i++) {\n          if (element[i].nodeType === 1) return element[i];\n        }\n      }\n\n      function blockTransition(element, bool) {\n        var node = getDomNode(element);\n        var key = camelCase(PREFIX + 'transition-delay');\n        node.style[key] = bool ? '-9999s' : '';\n      }\n\n      return init;\n    }]);\n\n  /**\n   * Older browsers [FF31] expect camelCase\n   * property keys.\n   * e.g.\n   *  animation-duration --> animationDuration\n   */\n  function camelCase(str) {\n    return str.replace(/-[a-z]/g, function(str) {\n      return str.charAt(1).toUpperCase();\n    });\n  }\n\n})();\n\n}\n\n})();\n(function(){\n\"use strict\";\n\n/**\n * @ngdoc module\n * @name material.components.autocomplete\n */\n/*\n * @see js folder for autocomplete implementation\n */\nangular.module('material.components.autocomplete', [\n  'material.core',\n  'material.components.icon',\n  'material.components.virtualRepeat'\n]);\n\n})();\n(function(){\n\"use strict\";\n\n/*\n * @ngdoc module\n * @name material.components.backdrop\n * @description Backdrop\n */\n\n/**\n * @ngdoc directive\n * @name mdBackdrop\n * @module material.components.backdrop\n *\n * @restrict E\n *\n * @description\n * `<md-backdrop>` is a backdrop element used by other components, such as dialog and bottom sheet.\n * Apply class `opaque` to make the backdrop use the theme backdrop color.\n *\n */\n\nangular\n  .module('material.components.backdrop', ['material.core'])\n  .directive('mdBackdrop', [\"$mdTheming\", \"$mdUtil\", \"$animate\", \"$rootElement\", \"$window\", \"$log\", \"$$rAF\", \"$document\", function BackdropDirective($mdTheming, $mdUtil, $animate, $rootElement, $window, $log, $$rAF, $document) {\n    var ERROR_CSS_POSITION = '<md-backdrop> may not work properly in a scrolled, static-positioned parent container.';\n\n    return {\n      restrict: 'E',\n      link: postLink\n    };\n\n    function postLink(scope, element, attrs) {\n      // backdrop may be outside the $rootElement, tell ngAnimate to animate regardless\n      if ($animate.pin) $animate.pin(element, $rootElement);\n\n      var bodyStyles;\n\n      $$rAF(function() {\n        // If body scrolling has been disabled using mdUtil.disableBodyScroll(),\n        // adjust the 'backdrop' height to account for the fixed 'body' top offset.\n        // Note that this can be pretty expensive and is better done inside the $$rAF.\n        bodyStyles = $window.getComputedStyle($document[0].body);\n\n        if (bodyStyles.position === 'fixed') {\n          var resizeHandler = $mdUtil.debounce(function(){\n            bodyStyles = $window.getComputedStyle($document[0].body);\n            resize();\n          }, 60, null, false);\n\n          resize();\n          angular.element($window).on('resize', resizeHandler);\n\n          scope.$on('$destroy', function() {\n            angular.element($window).off('resize', resizeHandler);\n          });\n        }\n\n        // Often $animate.enter() is used to append the backDrop element\n        // so let's wait until $animate is done...\n        var parent = element.parent();\n\n        if (parent.length) {\n          if (parent[0].nodeName === 'BODY') {\n            element.css('position', 'fixed');\n          }\n\n          var styles = $window.getComputedStyle(parent[0]);\n\n          if (styles.position === 'static') {\n            // backdrop uses position:absolute and will not work properly with parent position:static (default)\n            $log.warn(ERROR_CSS_POSITION);\n          }\n\n          // Only inherit the parent if the backdrop has a parent.\n          $mdTheming.inherit(element, parent);\n        }\n      });\n\n      function resize() {\n        var viewportHeight = parseInt(bodyStyles.height, 10) + Math.abs(parseInt(bodyStyles.top, 10));\n        element.css('height', viewportHeight + 'px');\n      }\n    }\n\n  }]);\n\n})();\n(function(){\n\"use strict\";\n\n/**\n * @ngdoc module\n * @name material.components.bottomSheet\n * @description\n * BottomSheet\n */\nMdBottomSheetDirective.$inject = [\"$mdBottomSheet\"];\nMdBottomSheetProvider.$inject = [\"$$interimElementProvider\"];\nangular\n  .module('material.components.bottomSheet', [\n    'material.core',\n    'material.components.backdrop'\n  ])\n  .directive('mdBottomSheet', MdBottomSheetDirective)\n  .provider('$mdBottomSheet', MdBottomSheetProvider);\n\n/* @ngInject */\nfunction MdBottomSheetDirective($mdBottomSheet) {\n  return {\n    restrict: 'E',\n    link : function postLink(scope, element) {\n      element.addClass('_md');     // private md component indicator for styling\n\n      // When navigation force destroys an interimElement, then\n      // listen and $destroy() that interim instance...\n      scope.$on('$destroy', function() {\n        $mdBottomSheet.destroy();\n      });\n    }\n  };\n}\n\n\n/**\n * @ngdoc service\n * @name $mdBottomSheet\n * @module material.components.bottomSheet\n *\n * @description\n * `$mdBottomSheet` opens a bottom sheet over the app and provides a simple promise API.\n *\n * ## Restrictions\n *\n * - The bottom sheet's template must have an outer `<md-bottom-sheet>` element.\n * - Add the `md-grid` class to the bottom sheet for a grid layout.\n * - Add the `md-list` class to the bottom sheet for a list layout.\n *\n * @usage\n * <hljs lang=\"html\">\n * <div ng-controller=\"MyController\">\n *   <md-button ng-click=\"openBottomSheet()\">\n *     Open a Bottom Sheet!\n *   </md-button>\n * </div>\n * </hljs>\n * <hljs lang=\"js\">\n * var app = angular.module('app', ['ngMaterial']);\n * app.controller('MyController', function($scope, $mdBottomSheet) {\n *   $scope.openBottomSheet = function() {\n *     $mdBottomSheet.show({\n *       template: '<md-bottom-sheet>' +\n *       'Hello! <md-button ng-click=\"closeBottomSheet()\">Close</md-button>' +\n *       '</md-bottom-sheet>'\n *     })\n *\n *     // Fires when the hide() method is used\n *     .then(function() {\n *       console.log('You clicked the button to close the bottom sheet!');\n *     })\n *\n *     // Fires when the cancel() method is used\n *     .catch(function() {\n *       console.log('You hit escape or clicked the backdrop to close.');\n *     });\n *   };\n *\n *   $scope.closeBottomSheet = function($scope, $mdBottomSheet) {\n *     $mdBottomSheet.hide();\n *   }\n *\n * });\n * </hljs>\n */\n\n /**\n * @ngdoc method\n * @name $mdBottomSheet#show\n *\n * @description\n * Show a bottom sheet with the specified options.\n *\n * <em><b>Note:</b> You should <b>always</b> provide a `.catch()` method in case the user hits the\n * `esc` key or clicks the background to close. In this case, the `cancel()` method will\n * automatically be called on the bottom sheet which will `reject()` the promise. See the @usage\n * section above for an example.\n *\n * Newer versions of Angular will throw a `Possibly unhandled rejection` exception if you forget\n * this.</em>\n *\n * @param {object} options An options object, with the following properties:\n *\n *   - `templateUrl` - `{string=}`: The url of an html template file that will\n *   be used as the content of the bottom sheet. Restrictions: the template must\n *   have an outer `md-bottom-sheet` element.\n *   - `template` - `{string=}`: Same as templateUrl, except this is an actual\n *   template string.\n *   - `scope` - `{object=}`: the scope to link the template / controller to. If none is specified, it will create a new child scope.\n *     This scope will be destroyed when the bottom sheet is removed unless `preserveScope` is set to true.\n *   - `preserveScope` - `{boolean=}`: whether to preserve the scope when the element is removed. Default is false\n *   - `controller` - `{string=}`: The controller to associate with this bottom sheet.\n *   - `locals` - `{string=}`: An object containing key/value pairs. The keys will\n *   be used as names of values to inject into the controller. For example,\n *   `locals: {three: 3}` would inject `three` into the controller with the value\n *   of 3.\n *   - `clickOutsideToClose` - `{boolean=}`: Whether the user can click outside the bottom sheet to\n *     close it. Default true.\n *   - `bindToController` - `{boolean=}`: When set to true, the locals will be bound to the controller instance.\n *   - `disableBackdrop` - `{boolean=}`: When set to true, the bottomsheet will not show a backdrop.\n *   - `escapeToClose` - `{boolean=}`: Whether the user can press escape to close the bottom sheet.\n *     Default true.\n *   - `resolve` - `{object=}`: Similar to locals, except it takes promises as values\n *   and the bottom sheet will not open until the promises resolve.\n *   - `controllerAs` - `{string=}`: An alias to assign the controller to on the scope.\n *   - `parent` - `{element=}`: The element to append the bottom sheet to. The `parent` may be a `function`, `string`,\n *   `object`, or null. Defaults to appending to the body of the root element (or the root element) of the application.\n *   e.g. angular.element(document.getElementById('content')) or \"#content\"\n *   - `disableParentScroll` - `{boolean=}`: Whether to disable scrolling while the bottom sheet is open.\n *     Default true.\n *\n * @returns {promise} A promise that can be resolved with `$mdBottomSheet.hide()` or\n * rejected with `$mdBottomSheet.cancel()`.\n */\n\n/**\n * @ngdoc method\n * @name $mdBottomSheet#hide\n *\n * @description\n * Hide the existing bottom sheet and resolve the promise returned from\n * `$mdBottomSheet.show()`. This call will close the most recently opened/current bottomsheet (if\n * any).\n *\n * <em><b>Note:</b> Use a `.then()` on your `.show()` to handle this callback.</em>\n *\n * @param {*=} response An argument for the resolved promise.\n *\n */\n\n/**\n * @ngdoc method\n * @name $mdBottomSheet#cancel\n *\n * @description\n * Hide the existing bottom sheet and reject the promise returned from\n * `$mdBottomSheet.show()`.\n *\n * <em><b>Note:</b> Use a `.catch()` on your `.show()` to handle this callback.</em>\n *\n * @param {*=} response An argument for the rejected promise.\n *\n */\n\nfunction MdBottomSheetProvider($$interimElementProvider) {\n  // how fast we need to flick down to close the sheet, pixels/ms\n  bottomSheetDefaults.$inject = [\"$animate\", \"$mdConstant\", \"$mdUtil\", \"$mdTheming\", \"$mdBottomSheet\", \"$rootElement\", \"$mdGesture\", \"$log\"];\n  var CLOSING_VELOCITY = 0.5;\n  var PADDING = 80; // same as css\n\n  return $$interimElementProvider('$mdBottomSheet')\n    .setDefaults({\n      methods: ['disableParentScroll', 'escapeToClose', 'clickOutsideToClose'],\n      options: bottomSheetDefaults\n    });\n\n  /* @ngInject */\n  function bottomSheetDefaults($animate, $mdConstant, $mdUtil, $mdTheming, $mdBottomSheet, $rootElement,\n                               $mdGesture, $log) {\n    var backdrop;\n\n    return {\n      themable: true,\n      onShow: onShow,\n      onRemove: onRemove,\n      disableBackdrop: false,\n      escapeToClose: true,\n      clickOutsideToClose: true,\n      disableParentScroll: true\n    };\n\n\n    function onShow(scope, element, options, controller) {\n\n      element = $mdUtil.extractElementByName(element, 'md-bottom-sheet');\n\n      // prevent tab focus or click focus on the bottom-sheet container\n      element.attr('tabindex',\"-1\");\n\n      // Once the md-bottom-sheet has `ng-cloak` applied on his template the opening animation will not work properly.\n      // This is a very common problem, so we have to notify the developer about this.\n      if (element.hasClass('ng-cloak')) {\n        var message = '$mdBottomSheet: using `<md-bottom-sheet ng-cloak >` will affect the bottom-sheet opening animations.';\n        $log.warn( message, element[0] );\n      }\n\n      if (!options.disableBackdrop) {\n        // Add a backdrop that will close on click\n        backdrop = $mdUtil.createBackdrop(scope, \"md-bottom-sheet-backdrop md-opaque\");\n\n        // Prevent mouse focus on backdrop; ONLY programatic focus allowed.\n        // This allows clicks on backdrop to propogate to the $rootElement and\n        // ESC key events to be detected properly.\n        \n        backdrop[0].tabIndex = -1;\n\n        if (options.clickOutsideToClose) {\n          backdrop.on('click', function() {\n            $mdUtil.nextTick($mdBottomSheet.cancel,true);\n          });\n        }\n\n        $mdTheming.inherit(backdrop, options.parent);\n\n        $animate.enter(backdrop, options.parent, null);\n      }\n\n      var bottomSheet = new BottomSheet(element, options.parent);\n      options.bottomSheet = bottomSheet;\n\n      $mdTheming.inherit(bottomSheet.element, options.parent);\n\n      if (options.disableParentScroll) {\n        options.restoreScroll = $mdUtil.disableScrollAround(bottomSheet.element, options.parent);\n      }\n\n      return $animate.enter(bottomSheet.element, options.parent, backdrop)\n        .then(function() {\n          var focusable = $mdUtil.findFocusTarget(element) || angular.element(\n            element[0].querySelector('button') ||\n            element[0].querySelector('a') ||\n            element[0].querySelector($mdUtil.prefixer('ng-click', true))\n          ) || backdrop;\n\n          if (options.escapeToClose) {\n            options.rootElementKeyupCallback = function(e) {\n              if (e.keyCode === $mdConstant.KEY_CODE.ESCAPE) {\n                $mdUtil.nextTick($mdBottomSheet.cancel,true);\n              }\n            };\n\n            $rootElement.on('keyup', options.rootElementKeyupCallback);\n            focusable && focusable.focus();\n          }\n        });\n\n    }\n\n    function onRemove(scope, element, options) {\n\n      var bottomSheet = options.bottomSheet;\n\n      if (!options.disableBackdrop) $animate.leave(backdrop);\n      return $animate.leave(bottomSheet.element).then(function() {\n        if (options.disableParentScroll) {\n          options.restoreScroll();\n          delete options.restoreScroll;\n        }\n\n        bottomSheet.cleanup();\n      });\n    }\n\n    /**\n     * BottomSheet class to apply bottom-sheet behavior to an element\n     */\n    function BottomSheet(element, parent) {\n      var deregister = $mdGesture.register(parent, 'drag', { horizontal: false });\n      parent.on('$md.dragstart', onDragStart)\n        .on('$md.drag', onDrag)\n        .on('$md.dragend', onDragEnd);\n\n      return {\n        element: element,\n        cleanup: function cleanup() {\n          deregister();\n          parent.off('$md.dragstart', onDragStart);\n          parent.off('$md.drag', onDrag);\n          parent.off('$md.dragend', onDragEnd);\n        }\n      };\n\n      function onDragStart(ev) {\n        // Disable transitions on transform so that it feels fast\n        element.css($mdConstant.CSS.TRANSITION_DURATION, '0ms');\n      }\n\n      function onDrag(ev) {\n        var transform = ev.pointer.distanceY;\n        if (transform < 5) {\n          // Slow down drag when trying to drag up, and stop after PADDING\n          transform = Math.max(-PADDING, transform / 2);\n        }\n        element.css($mdConstant.CSS.TRANSFORM, 'translate3d(0,' + (PADDING + transform) + 'px,0)');\n      }\n\n      function onDragEnd(ev) {\n        if (ev.pointer.distanceY > 0 &&\n            (ev.pointer.distanceY > 20 || Math.abs(ev.pointer.velocityY) > CLOSING_VELOCITY)) {\n          var distanceRemaining = element.prop('offsetHeight') - ev.pointer.distanceY;\n          var transitionDuration = Math.min(distanceRemaining / ev.pointer.velocityY * 0.75, 500);\n          element.css($mdConstant.CSS.TRANSITION_DURATION, transitionDuration + 'ms');\n          $mdUtil.nextTick($mdBottomSheet.cancel,true);\n        } else {\n          element.css($mdConstant.CSS.TRANSITION_DURATION, '');\n          element.css($mdConstant.CSS.TRANSFORM, '');\n        }\n      }\n    }\n\n  }\n\n}\n\n})();\n(function(){\n\"use strict\";\n\n/**\n * @ngdoc module\n * @name material.components.button\n * @description\n *\n * Button\n */\nMdButtonDirective.$inject = [\"$mdButtonInkRipple\", \"$mdTheming\", \"$mdAria\", \"$mdInteraction\"];\nMdAnchorDirective.$inject = [\"$mdTheming\"];\nangular\n    .module('material.components.button', [ 'material.core' ])\n    .directive('mdButton', MdButtonDirective)\n    .directive('a', MdAnchorDirective);\n\n\n/**\n * @private\n * @restrict E\n *\n * @description\n * `a` is an anchor directive used to inherit theme colors for md-primary, md-accent, etc.\n *\n * @usage\n *\n * <hljs lang=\"html\">\n *  <md-content md-theme=\"myTheme\">\n *    <a href=\"#chapter1\" class=\"md-accent\"></a>\n *  </md-content>\n * </hljs>\n */\nfunction MdAnchorDirective($mdTheming) {\n  return {\n    restrict : 'E',\n    link : function postLink(scope, element) {\n      // Make sure to inherit theme so stand-alone anchors\n      // support theme colors for md-primary, md-accent, etc.\n      $mdTheming(element);\n    }\n  };\n}\n\n\n/**\n * @ngdoc directive\n * @name mdButton\n * @module material.components.button\n *\n * @restrict E\n *\n * @description\n * `<md-button>` is a button directive with optional ink ripples (default enabled).\n *\n * If you supply a `href` or `ng-href` attribute, it will become an `<a>` element. Otherwise, it\n * will become a `<button>` element. As per the\n * [Material Design specifications](https://material.google.com/style/color.html#color-color-palette)\n * the FAB button background is filled with the accent color [by default]. The primary color palette\n * may be used with the `md-primary` class.\n *\n * Developers can also change the color palette of the button, by using the following classes\n * - `md-primary`\n * - `md-accent`\n * - `md-warn`\n *\n * See for example\n *\n * <hljs lang=\"html\">\n *   <md-button class=\"md-primary\">Primary Button</md-button>\n * </hljs>\n *\n * Button can be also raised, which means that they will use the current color palette to fill the button.\n *\n * <hljs lang=\"html\">\n *   <md-button class=\"md-accent md-raised\">Raised and Accent Button</md-button>\n * </hljs>\n *\n * It is also possible to disable the focus effect on the button, by using the following markup.\n *\n * <hljs lang=\"html\">\n *   <md-button class=\"md-no-focus\">No Focus Style</md-button>\n * </hljs>\n *\n * @param {boolean=} md-no-ink If present, disable ripple ink effects.\n * @param {expression=} ng-disabled En/Disable based on the expression\n * @param {string=} md-ripple-size Overrides the default ripple size logic. Options: `full`, `partial`, `auto`\n * @param {string=} aria-label Adds alternative text to button for accessibility, useful for icon buttons.\n * If no default text is found, a warning will be logged.\n *\n * @usage\n *\n * Regular buttons:\n *\n * <hljs lang=\"html\">\n *  <md-button> Flat Button </md-button>\n *  <md-button href=\"http://google.com\"> Flat link </md-button>\n *  <md-button class=\"md-raised\"> Raised Button </md-button>\n *  <md-button ng-disabled=\"true\"> Disabled Button </md-button>\n *  <md-button>\n *    <md-icon md-svg-src=\"your/icon.svg\"></md-icon>\n *    Register Now\n *  </md-button>\n * </hljs>\n *\n * FAB buttons:\n *\n * <hljs lang=\"html\">\n *  <md-button class=\"md-fab\" aria-label=\"FAB\">\n *    <md-icon md-svg-src=\"your/icon.svg\"></md-icon>\n *  </md-button>\n *  <!-- mini-FAB -->\n *  <md-button class=\"md-fab md-mini\" aria-label=\"Mini FAB\">\n *    <md-icon md-svg-src=\"your/icon.svg\"></md-icon>\n *  </md-button>\n *  <!-- Button with SVG Icon -->\n *  <md-button class=\"md-icon-button\" aria-label=\"Custom Icon Button\">\n *    <md-icon md-svg-icon=\"path/to/your.svg\"></md-icon>\n *  </md-button>\n * </hljs>\n */\nfunction MdButtonDirective($mdButtonInkRipple, $mdTheming, $mdAria, $mdInteraction) {\n\n  return {\n    restrict: 'EA',\n    replace: true,\n    transclude: true,\n    template: getTemplate,\n    link: postLink\n  };\n\n  function isAnchor(attr) {\n    return angular.isDefined(attr.href) || angular.isDefined(attr.ngHref) || angular.isDefined(attr.ngLink) || angular.isDefined(attr.uiSref);\n  }\n\n  function getTemplate(element, attr) {\n    if (isAnchor(attr)) {\n      return '<a class=\"md-button\" ng-transclude></a>';\n    } else {\n      //If buttons don't have type=\"button\", they will submit forms automatically.\n      var btnType = (typeof attr.type === 'undefined') ? 'button' : attr.type;\n      return '<button class=\"md-button\" type=\"' + btnType + '\" ng-transclude></button>';\n    }\n  }\n\n  function postLink(scope, element, attr) {\n    $mdTheming(element);\n    $mdButtonInkRipple.attach(scope, element);\n\n    // Use async expect to support possible bindings in the button label\n    $mdAria.expectWithoutText(element, 'aria-label');\n\n    // For anchor elements, we have to set tabindex manually when the\n    // element is disabled\n    if (isAnchor(attr) && angular.isDefined(attr.ngDisabled) ) {\n      scope.$watch(attr.ngDisabled, function(isDisabled) {\n        element.attr('tabindex', isDisabled ? -1 : 0);\n      });\n    }\n\n    // disabling click event when disabled is true\n    element.on('click', function(e){\n      if (attr.disabled === true) {\n        e.preventDefault();\n        e.stopImmediatePropagation();\n      }\n    });\n\n    if (!element.hasClass('md-no-focus')) {\n\n      element.on('focus', function() {\n\n        // Only show the focus effect when being focused through keyboard interaction or programmatically\n        if (!$mdInteraction.isUserInvoked() || $mdInteraction.getLastInteractionType() === 'keyboard') {\n          element.addClass('md-focused');\n        }\n\n      });\n\n      element.on('blur', function() {\n        element.removeClass('md-focused');\n      });\n    }\n\n  }\n\n}\n\n})();\n(function(){\n\"use strict\";\n\n/**\n * @ngdoc module\n * @name material.components.card\n *\n * @description\n * Card components.\n */\nmdCardDirective.$inject = [\"$mdTheming\"];\nangular.module('material.components.card', [\n    'material.core'\n  ])\n  .directive('mdCard', mdCardDirective);\n\n\n/**\n * @ngdoc directive\n * @name mdCard\n * @module material.components.card\n *\n * @restrict E\n *\n * @description\n * The `<md-card>` directive is a container element used within `<md-content>` containers.\n *\n * An image included as a direct descendant will fill the card's width. If you want to avoid this,\n * you can add the `md-image-no-fill` class to the parent element. The `<md-card-content>`\n * container will wrap text content and provide padding. An `<md-card-footer>` element can be\n * optionally included to put content flush against the bottom edge of the card.\n *\n * Action buttons can be included in an `<md-card-actions>` element, similar to `<md-dialog-actions>`.\n * You can then position buttons using layout attributes.\n *\n * Card is built with:\n * * `<md-card-header>` - Header for the card, holds avatar, text and squared image\n *  - `<md-card-avatar>` - Card avatar\n *    - `md-user-avatar` - Class for user image\n *    - `<md-icon>`\n *  - `<md-card-header-text>` - Contains elements for the card description\n *    - `md-title` - Class for the card title\n *    - `md-subhead` - Class for the card sub header\n * * `<img>` - Image for the card\n * * `<md-card-title>` - Card content title\n *  - `<md-card-title-text>`\n *    - `md-headline` - Class for the card content title\n *    - `md-subhead` - Class for the card content sub header\n *  - `<md-card-title-media>` - Squared image within the title\n *    - `md-media-sm` - Class for small image\n *    - `md-media-md` - Class for medium image\n *    - `md-media-lg` - Class for large image\n *    - `md-media-xl` - Class for extra large image\n * * `<md-card-content>` - Card content\n * * `<md-card-actions>` - Card actions\n *  - `<md-card-icon-actions>` - Icon actions\n *\n * Cards have constant width and variable heights; where the maximum height is limited to what can\n * fit within a single view on a platform, but it can temporarily expand as needed.\n *\n * @usage\n * ### Card with optional footer\n * <hljs lang=\"html\">\n * <md-card>\n *  <img src=\"card-image.png\" class=\"md-card-image\" alt=\"image caption\">\n *  <md-card-content>\n *    <h2>Card headline</h2>\n *    <p>Card content</p>\n *  </md-card-content>\n *  <md-card-footer>\n *    Card footer\n *  </md-card-footer>\n * </md-card>\n * </hljs>\n *\n * ### Card with actions\n * <hljs lang=\"html\">\n * <md-card>\n *  <img src=\"card-image.png\" class=\"md-card-image\" alt=\"image caption\">\n *  <md-card-content>\n *    <h2>Card headline</h2>\n *    <p>Card content</p>\n *  </md-card-content>\n *  <md-card-actions layout=\"row\" layout-align=\"end center\">\n *    <md-button>Action 1</md-button>\n *    <md-button>Action 2</md-button>\n *  </md-card-actions>\n * </md-card>\n * </hljs>\n *\n * ### Card with header, image, title actions and content\n * <hljs lang=\"html\">\n * <md-card>\n *   <md-card-header>\n *     <md-card-avatar>\n *       <img class=\"md-user-avatar\" src=\"avatar.png\"/>\n *     </md-card-avatar>\n *     <md-card-header-text>\n *       <span class=\"md-title\">Title</span>\n *       <span class=\"md-subhead\">Sub header</span>\n *     </md-card-header-text>\n *   </md-card-header>\n *   <img ng-src=\"card-image.png\" class=\"md-card-image\" alt=\"image caption\">\n *   <md-card-title>\n *     <md-card-title-text>\n *       <span class=\"md-headline\">Card headline</span>\n *       <span class=\"md-subhead\">Card subheader</span>\n *     </md-card-title-text>\n *   </md-card-title>\n *   <md-card-actions layout=\"row\" layout-align=\"start center\">\n *     <md-button>Action 1</md-button>\n *     <md-button>Action 2</md-button>\n *     <md-card-icon-actions>\n *       <md-button class=\"md-icon-button\" aria-label=\"icon\">\n *         <md-icon md-svg-icon=\"icon\"></md-icon>\n *       </md-button>\n *     </md-card-icon-actions>\n *   </md-card-actions>\n *   <md-card-content>\n *     <p>\n *      Card content\n *     </p>\n *   </md-card-content>\n * </md-card>\n * </hljs>\n */\nfunction mdCardDirective($mdTheming) {\n  return {\n    restrict: 'E',\n    link: function ($scope, $element, attr) {\n      $element.addClass('_md');     // private md component indicator for styling\n      $mdTheming($element);\n    }\n  };\n}\n\n})();\n(function(){\n\"use strict\";\n\n/**\n * @ngdoc module\n * @name material.components.checkbox\n * @description Checkbox module!\n */\nMdCheckboxDirective.$inject = [\"inputDirective\", \"$mdAria\", \"$mdConstant\", \"$mdTheming\", \"$mdUtil\", \"$mdInteraction\"];\nangular\n  .module('material.components.checkbox', ['material.core'])\n  .directive('mdCheckbox', MdCheckboxDirective);\n\n/**\n * @ngdoc directive\n * @name mdCheckbox\n * @module material.components.checkbox\n * @restrict E\n *\n * @description\n * The checkbox directive is used like the normal [angular checkbox](https://docs.angularjs.org/api/ng/input/input%5Bcheckbox%5D).\n *\n * As per the [material design spec](http://www.google.com/design/spec/style/color.html#color-color-schemes)\n * the checkbox is in the accent color by default. The primary color palette may be used with\n * the `md-primary` class.\n *\n * @param {string} ng-model Assignable angular expression to data-bind to.\n * @param {string=} name Property name of the form under which the control is published.\n * @param {expression=} ng-true-value The value to which the expression should be set when selected.\n * @param {expression=} ng-false-value The value to which the expression should be set when not selected.\n * @param {string=} ng-change AngularJS expression to be executed when input changes due to user interaction with the input element.\n * @param {boolean=} md-no-ink Use of attribute indicates use of ripple ink effects\n * @param {string=} aria-label Adds label to checkbox for accessibility.\n *     Defaults to checkbox's text. If no default text is found, a warning will be logged.\n * @param {expression=} md-indeterminate This determines when the checkbox should be rendered as 'indeterminate'.\n *     If a truthy expression or no value is passed in the checkbox renders in the md-indeterminate state.\n *     If falsy expression is passed in it just looks like a normal unchecked checkbox.\n *     The indeterminate, checked, and unchecked states are mutually exclusive. A box cannot be in any two states at the same time.\n *     Adding the 'md-indeterminate' attribute overrides any checked/unchecked rendering logic.\n *     When using the 'md-indeterminate' attribute use 'ng-checked' to define rendering logic instead of using 'ng-model'.\n * @param {expression=} ng-checked If this expression evaluates as truthy, the 'md-checked' css class is added to the checkbox and it\n *     will appear checked.\n *\n * @usage\n * <hljs lang=\"html\">\n * <md-checkbox ng-model=\"isChecked\" aria-label=\"Finished?\">\n *   Finished ?\n * </md-checkbox>\n *\n * <md-checkbox md-no-ink ng-model=\"hasInk\" aria-label=\"No Ink Effects\">\n *   No Ink Effects\n * </md-checkbox>\n *\n * <md-checkbox ng-disabled=\"true\" ng-model=\"isDisabled\" aria-label=\"Disabled\">\n *   Disabled\n * </md-checkbox>\n *\n * </hljs>\n *\n */\nfunction MdCheckboxDirective(inputDirective, $mdAria, $mdConstant, $mdTheming, $mdUtil, $mdInteraction) {\n  inputDirective = inputDirective[0];\n\n  return {\n    restrict: 'E',\n    transclude: true,\n    require: ['^?mdInputContainer', '?ngModel', '?^form'],\n    priority: $mdConstant.BEFORE_NG_ARIA,\n    template:\n      '<div class=\"md-container\" md-ink-ripple md-ink-ripple-checkbox>' +\n        '<div class=\"md-icon\"></div>' +\n      '</div>' +\n      '<div ng-transclude class=\"md-label\"></div>',\n    compile: compile\n  };\n\n  // **********************************************************\n  // Private Methods\n  // **********************************************************\n\n  function compile (tElement, tAttrs) {\n    tAttrs.$set('tabindex', tAttrs.tabindex || '0');\n    tAttrs.$set('type', 'checkbox');\n    tAttrs.$set('role', tAttrs.type);\n\n    return  {\n      pre: function(scope, element) {\n        // Attach a click handler during preLink, in order to immediately stop propagation\n        // (especially for ng-click) when the checkbox is disabled.\n        element.on('click', function(e) {\n          if (this.hasAttribute('disabled')) {\n            e.stopImmediatePropagation();\n          }\n        });\n      },\n      post: postLink\n    };\n\n    function postLink(scope, element, attr, ctrls) {\n      var isIndeterminate;\n      var containerCtrl = ctrls[0];\n      var ngModelCtrl = ctrls[1] || $mdUtil.fakeNgModel();\n      var formCtrl = ctrls[2];\n\n      if (containerCtrl) {\n        var isErrorGetter = containerCtrl.isErrorGetter || function() {\n          return ngModelCtrl.$invalid && (ngModelCtrl.$touched || (formCtrl && formCtrl.$submitted));\n        };\n\n        containerCtrl.input = element;\n\n        scope.$watch(isErrorGetter, containerCtrl.setInvalid);\n      }\n\n      $mdTheming(element);\n\n      // Redirect focus events to the root element, because IE11 is always focusing the container element instead\n      // of the md-checkbox element. This causes issues when using ngModelOptions: `updateOnBlur`\n      element.children().on('focus', function() {\n        element.focus();\n      });\n\n      if ($mdUtil.parseAttributeBoolean(attr.mdIndeterminate)) {\n        setIndeterminateState();\n        scope.$watch(attr.mdIndeterminate, setIndeterminateState);\n      }\n\n      if (attr.ngChecked) {\n        scope.$watch(scope.$eval.bind(scope, attr.ngChecked), function(value) {\n          ngModelCtrl.$setViewValue(value);\n          ngModelCtrl.$render();\n        });\n      }\n\n      $$watchExpr('ngDisabled', 'tabindex', {\n        true: '-1',\n        false: attr.tabindex\n      });\n\n      $mdAria.expectWithText(element, 'aria-label');\n\n      // Reuse the original input[type=checkbox] directive from AngularJS core.\n      // This is a bit hacky as we need our own event listener and own render\n      // function.\n      inputDirective.link.pre(scope, {\n        on: angular.noop,\n        0: {}\n      }, attr, [ngModelCtrl]);\n\n      element.on('click', listener)\n        .on('keypress', keypressHandler)\n        .on('focus', function() {\n          if ($mdInteraction.getLastInteractionType() === 'keyboard') {\n            element.addClass('md-focused');\n          }\n        })\n        .on('blur', function() {\n          element.removeClass('md-focused');\n        });\n\n      ngModelCtrl.$render = render;\n\n      function $$watchExpr(expr, htmlAttr, valueOpts) {\n        if (attr[expr]) {\n          scope.$watch(attr[expr], function(val) {\n            if (valueOpts[val]) {\n              element.attr(htmlAttr, valueOpts[val]);\n            }\n          });\n        }\n      }\n\n      function keypressHandler(ev) {\n        var keyCode = ev.which || ev.keyCode;\n        if (keyCode === $mdConstant.KEY_CODE.SPACE || keyCode === $mdConstant.KEY_CODE.ENTER) {\n          ev.preventDefault();\n          element.addClass('md-focused');\n          listener(ev);\n        }\n      }\n\n      function listener(ev) {\n        // skipToggle boolean is used by the switch directive to prevent the click event\n        // when releasing the drag. There will be always a click if releasing the drag over the checkbox\n        if (element[0].hasAttribute('disabled') || scope.skipToggle) {\n          return;\n        }\n\n        scope.$apply(function() {\n          // Toggle the checkbox value...\n          var viewValue = attr.ngChecked && attr.ngClick ? attr.checked : !ngModelCtrl.$viewValue;\n\n          ngModelCtrl.$setViewValue(viewValue, ev && ev.type);\n          ngModelCtrl.$render();\n        });\n      }\n\n      function render() {\n        // Cast the $viewValue to a boolean since it could be undefined\n        element.toggleClass('md-checked', !!ngModelCtrl.$viewValue && !isIndeterminate);\n      }\n\n      function setIndeterminateState(newValue) {\n        isIndeterminate = newValue !== false;\n        if (isIndeterminate) {\n          element.attr('aria-checked', 'mixed');\n        }\n        element.toggleClass('md-indeterminate', isIndeterminate);\n      }\n    }\n  }\n}\n\n})();\n(function(){\n\"use strict\";\n\n/**\n * @ngdoc module\n * @name material.components.chips\n */\n/*\n * @see js folder for chips implementation\n */\nangular.module('material.components.chips', [\n  'material.core',\n  'material.components.autocomplete'\n]);\n\n})();\n(function(){\n\"use strict\";\n\n(function () {\n  \"use strict\";\n\n  /**\n   *  Use a RegExp to check if the `md-colors=\"<expression>\"` is static string\n   *  or one that should be observed and dynamically interpolated.\n   */\n  MdColorsDirective.$inject = [\"$mdColors\", \"$mdUtil\", \"$log\", \"$parse\"];\n  MdColorsService.$inject = [\"$mdTheming\", \"$mdUtil\", \"$log\"];\n  var STATIC_COLOR_EXPRESSION = /^{((\\s|,)*?[\"'a-zA-Z-]+?\\s*?:\\s*?('|\")[a-zA-Z0-9-.]*('|\"))+\\s*}$/;\n  var colorPalettes = null;\n\n  /**\n   * @ngdoc module\n   * @name material.components.colors\n   *\n   * @description\n   * Define $mdColors service and a `md-colors=\"\"` attribute directive\n   */\n  angular\n    .module('material.components.colors', ['material.core'])\n    .directive('mdColors', MdColorsDirective)\n    .service('$mdColors', MdColorsService);\n\n  /**\n   * @ngdoc service\n   * @name $mdColors\n   * @module material.components.colors\n   *\n   * @description\n   * With only defining themes, one couldn't get non AngularJS Material elements colored with Material colors,\n   * `$mdColors` service is used by the md-color directive to convert the 1..n color expressions to RGBA values and will apply\n   * those values to element as CSS property values.\n   *\n   *  @usage\n   *  <hljs lang=\"js\">\n   *    angular.controller('myCtrl', function ($mdColors) {\n   *      var color = $mdColors.getThemeColor('myTheme-red-200-0.5');\n   *      ...\n   *    });\n   *  </hljs>\n   *\n   */\n  function MdColorsService($mdTheming, $mdUtil, $log) {\n    colorPalettes = colorPalettes || Object.keys($mdTheming.PALETTES);\n\n    // Publish service instance\n    return {\n      applyThemeColors: applyThemeColors,\n      getThemeColor: getThemeColor,\n      hasTheme: hasTheme\n    };\n\n    // ********************************************\n    // Internal Methods\n    // ********************************************\n\n    /**\n     * @ngdoc method\n     * @name $mdColors#applyThemeColors\n     *\n     * @description\n     * Gets a color json object, keys are css properties and values are string of the wanted color\n     * Then calculate the rgba() values based on the theme color parts\n     *\n     * @param {DOMElement} element the element to apply the styles on.\n     * @param {object} colorExpression json object, keys are css properties and values are string of the wanted color,\n     * for example: `{color: 'red-A200-0.3'}`.\n     *\n     * @usage\n     * <hljs lang=\"js\">\n     *   app.directive('myDirective', function($mdColors) {\n     *     return {\n     *       ...\n     *       link: function (scope, elem) {\n     *         $mdColors.applyThemeColors(elem, {color: 'red'});\n     *       }\n     *    }\n     *   });\n     * </hljs>\n     */\n    function applyThemeColors(element, colorExpression) {\n      try {\n        if (colorExpression) {\n          // Assign the calculate RGBA color values directly as inline CSS\n          element.css(interpolateColors(colorExpression));\n        }\n      } catch (e) {\n        $log.error(e.message);\n      }\n\n    }\n\n    /**\n     * @ngdoc method\n     * @name $mdColors#getThemeColor\n     *\n     * @description\n     * Get parsed color from expression\n     *\n     * @param {string} expression string of a color expression (for instance `'red-700-0.8'`)\n     *\n     * @returns {string} a css color expression (for instance `rgba(211, 47, 47, 0.8)`)\n     *\n     * @usage\n     *  <hljs lang=\"js\">\n     *    angular.controller('myCtrl', function ($mdColors) {\n     *      var color = $mdColors.getThemeColor('myTheme-red-200-0.5');\n     *      ...\n     *    });\n     *  </hljs>\n     */\n    function getThemeColor(expression) {\n      var color = extractColorOptions(expression);\n\n      return parseColor(color);\n    }\n\n    /**\n     * Return the parsed color\n     * @param color hashmap of color definitions\n     * @param contrast whether use contrast color for foreground\n     * @returns rgba color string\n     */\n    function parseColor(color, contrast) {\n      contrast = contrast || false;\n      var rgbValues = $mdTheming.PALETTES[color.palette][color.hue];\n\n      rgbValues = contrast ? rgbValues.contrast : rgbValues.value;\n\n      return $mdUtil.supplant('rgba({0}, {1}, {2}, {3})',\n        [rgbValues[0], rgbValues[1], rgbValues[2], rgbValues[3] || color.opacity]\n      );\n    }\n\n    /**\n     * Convert the color expression into an object with scope-interpolated values\n     * Then calculate the rgba() values based on the theme color parts\n     *\n     * @results Hashmap of CSS properties with associated `rgba( )` string vales\n     *\n     *\n     */\n    function interpolateColors(themeColors) {\n      var rgbColors = {};\n\n      var hasColorProperty = themeColors.hasOwnProperty('color');\n\n      angular.forEach(themeColors, function (value, key) {\n        var color = extractColorOptions(value);\n        var hasBackground = key.indexOf('background') > -1;\n\n        rgbColors[key] = parseColor(color);\n        if (hasBackground && !hasColorProperty) {\n          rgbColors.color = parseColor(color, true);\n        }\n      });\n\n      return rgbColors;\n    }\n\n    /**\n     * Check if expression has defined theme\n     * e.g.\n     * 'myTheme-primary' => true\n     * 'red-800' => false\n     */\n    function hasTheme(expression) {\n      return angular.isDefined($mdTheming.THEMES[expression.split('-')[0]]);\n    }\n\n    /**\n     * For the evaluated expression, extract the color parts into a hash map\n     */\n    function extractColorOptions(expression) {\n      var parts = expression.split('-');\n      var hasTheme = angular.isDefined($mdTheming.THEMES[parts[0]]);\n      var theme = hasTheme ? parts.splice(0, 1)[0] : $mdTheming.defaultTheme();\n\n      return {\n        theme: theme,\n        palette: extractPalette(parts, theme),\n        hue: extractHue(parts, theme),\n        opacity: parts[2] || 1\n      };\n    }\n\n    /**\n     * Calculate the theme palette name\n     */\n    function extractPalette(parts, theme) {\n      // If the next section is one of the palettes we assume it's a two word palette\n      // Two word palette can be also written in camelCase, forming camelCase to dash-case\n\n      var isTwoWord = parts.length > 1 && colorPalettes.indexOf(parts[1]) !== -1;\n      var palette = parts[0].replace(/([a-z])([A-Z])/g, '$1-$2').toLowerCase();\n\n      if (isTwoWord)  palette = parts[0] + '-' + parts.splice(1, 1);\n\n      if (colorPalettes.indexOf(palette) === -1) {\n        // If the palette is not in the palette list it's one of primary/accent/warn/background\n        var scheme = $mdTheming.THEMES[theme].colors[palette];\n        if (!scheme) {\n          throw new Error($mdUtil.supplant('mdColors: couldn\\'t find \\'{palette}\\' in the palettes.', {palette: palette}));\n        }\n        palette = scheme.name;\n      }\n\n      return palette;\n    }\n\n    function extractHue(parts, theme) {\n      var themeColors = $mdTheming.THEMES[theme].colors;\n\n      if (parts[1] === 'hue') {\n        var hueNumber = parseInt(parts.splice(2, 1)[0], 10);\n\n        if (hueNumber < 1 || hueNumber > 3) {\n          throw new Error($mdUtil.supplant('mdColors: \\'hue-{hueNumber}\\' is not a valid hue, can be only \\'hue-1\\', \\'hue-2\\' and \\'hue-3\\'', {hueNumber: hueNumber}));\n        }\n        parts[1] = 'hue-' + hueNumber;\n\n        if (!(parts[0] in themeColors)) {\n          throw new Error($mdUtil.supplant('mdColors: \\'hue-x\\' can only be used with [{availableThemes}], but was used with \\'{usedTheme}\\'', {\n            availableThemes: Object.keys(themeColors).join(', '),\n            usedTheme: parts[0]\n          }));\n        }\n\n        return themeColors[parts[0]].hues[parts[1]];\n      }\n\n      return parts[1] || themeColors[parts[0] in themeColors ? parts[0] : 'primary'].hues['default'];\n    }\n  }\n\n  /**\n   * @ngdoc directive\n   * @name mdColors\n   * @module material.components.colors\n   *\n   * @restrict A\n   *\n   * @description\n   * `mdColors` directive will apply the theme-based color expression as RGBA CSS style values.\n   *\n   *   The format will be similar to our color defining in the scss files:\n   *\n   *   ## `[?theme]-[palette]-[?hue]-[?opacity]`\n   *   - [theme]    - default value is the default theme\n   *   - [palette]  - can be either palette name or primary/accent/warn/background\n   *   - [hue]      - default is 500 (hue-x can be used with primary/accent/warn/background)\n   *   - [opacity]  - default is 1\n   *\n   *   > `?` indicates optional parameter\n   *\n   * @usage\n   * <hljs lang=\"html\">\n   *   <div md-colors=\"{background: 'myTheme-accent-900-0.43'}\">\n   *     <div md-colors=\"{color: 'red-A100', 'border-color': 'primary-600'}\">\n   *       <span>Color demo</span>\n   *     </div>\n   *   </div>\n   * </hljs>\n   *\n   * `mdColors` directive will automatically watch for changes in the expression if it recognizes an interpolation\n   * expression or a function. For performance options, you can use `::` prefix to the `md-colors` expression\n   * to indicate a one-time data binding.\n   * <hljs lang=\"html\">\n   *   <md-card md-colors=\"::{background: '{{theme}}-primary-700'}\">\n   *   </md-card>\n   * </hljs>\n   *\n   */\n  function MdColorsDirective($mdColors, $mdUtil, $log, $parse) {\n    return {\n      restrict: 'A',\n      require: ['^?mdTheme'],\n      compile: function (tElem, tAttrs) {\n        var shouldWatch = shouldColorsWatch();\n\n        return function (scope, element, attrs, ctrl) {\n          var mdThemeController = ctrl[0];\n\n          var lastColors = {};\n\n          var parseColors = function (theme) {\n            if (typeof theme !== 'string') {\n              theme = '';\n            }\n\n            if (!attrs.mdColors) {\n              attrs.mdColors = '{}';\n            }\n\n            /**\n             * Json.parse() does not work because the keys are not quoted;\n             * use $parse to convert to a hash map\n             */\n            var colors = $parse(attrs.mdColors)(scope);\n\n            /**\n             * If mdTheme is defined up the DOM tree\n             * we add mdTheme theme to colors who doesn't specified a theme\n             *\n             * # example\n             * <hljs lang=\"html\">\n             *   <div md-theme=\"myTheme\">\n             *     <div md-colors=\"{background: 'primary-600'}\">\n             *       <span md-colors=\"{background: 'mySecondTheme-accent-200'}\">Color demo</span>\n             *     </div>\n             *   </div>\n             * </hljs>\n             *\n             * 'primary-600' will be 'myTheme-primary-600',\n             * but 'mySecondTheme-accent-200' will stay the same cause it has a theme prefix\n             */\n            if (mdThemeController) {\n              Object.keys(colors).forEach(function (prop) {\n                var color = colors[prop];\n                if (!$mdColors.hasTheme(color)) {\n                  colors[prop] = (theme || mdThemeController.$mdTheme) + '-' + color;\n                }\n              });\n            }\n\n            cleanElement(colors);\n\n            return colors;\n          };\n\n          var cleanElement = function (colors) {\n            if (!angular.equals(colors, lastColors)) {\n              var keys = Object.keys(lastColors);\n\n              if (lastColors.background && !keys.color) {\n                keys.push('color');\n              }\n\n              keys.forEach(function (key) {\n                element.css(key, '');\n              });\n            }\n\n            lastColors = colors;\n          };\n\n          /**\n           * Registering for mgTheme changes and asking mdTheme controller run our callback whenever a theme changes\n           */\n          var unregisterChanges = angular.noop;\n\n          if (mdThemeController) {\n            unregisterChanges = mdThemeController.registerChanges(function (theme) {\n              $mdColors.applyThemeColors(element, parseColors(theme));\n            });\n          }\n\n          scope.$on('$destroy', function () {\n            unregisterChanges();\n          });\n\n          try {\n            if (shouldWatch) {\n              scope.$watch(parseColors, angular.bind(this,\n                $mdColors.applyThemeColors, element\n              ), true);\n            }\n            else {\n              $mdColors.applyThemeColors(element, parseColors());\n            }\n\n          }\n          catch (e) {\n            $log.error(e.message);\n          }\n\n        };\n\n        function shouldColorsWatch() {\n          // Simulate 1x binding and mark mdColorsWatch == false\n          var rawColorExpression = tAttrs.mdColors;\n          var bindOnce = rawColorExpression.indexOf('::') > -1;\n          var isStatic = bindOnce ? true : STATIC_COLOR_EXPRESSION.test(tAttrs.mdColors);\n\n          // Remove it for the postLink...\n          tAttrs.mdColors = rawColorExpression.replace('::', '');\n\n          var hasWatchAttr = angular.isDefined(tAttrs.mdColorsWatch);\n\n          return (bindOnce || isStatic) ? false :\n            hasWatchAttr ? $mdUtil.parseAttributeBoolean(tAttrs.mdColorsWatch) : true;\n        }\n      }\n    };\n\n  }\n\n\n})();\n\n})();\n(function(){\n\"use strict\";\n\n/**\n * @ngdoc module\n * @name material.components.content\n *\n * @description\n * Scrollable content\n */\nmdContentDirective.$inject = [\"$mdTheming\"];\nangular.module('material.components.content', [\n  'material.core'\n])\n  .directive('mdContent', mdContentDirective);\n\n/**\n * @ngdoc directive\n * @name mdContent\n * @module material.components.content\n *\n * @restrict E\n *\n * @description\n *\n * The `<md-content>` directive is a container element useful for scrollable content. It achieves\n * this by setting the CSS `overflow` property to `auto` so that content can properly scroll.\n *\n * In general, `<md-content>` components are not designed to be nested inside one another. If\n * possible, it is better to make them siblings. This often results in a better user experience as\n * having nested scrollbars may confuse the user.\n *\n * ## Troubleshooting\n *\n * In some cases, you may wish to apply the `md-no-momentum` class to ensure that Safari's\n * momentum scrolling is disabled. Momentum scrolling can cause flickering issues while scrolling\n * SVG icons and some other components.\n *\n * Additionally, we now also offer the `md-no-flicker` class which can be applied to any element\n * and uses a Webkit-specific filter of `blur(0px)` that forces GPU rendering of all elements\n * inside (which eliminates the flicker on iOS devices).\n *\n * _<b>Note:</b> Forcing an element to render on the GPU can have unintended side-effects, especially\n * related to the z-index of elements. Please use with caution and only on the elements needed._\n *\n * @usage\n *\n * Add the `[layout-padding]` attribute to make the content padded.\n *\n * <hljs lang=\"html\">\n *  <md-content layout-padding>\n *      Lorem ipsum dolor sit amet, ne quod novum mei.\n *  </md-content>\n * </hljs>\n */\n\nfunction mdContentDirective($mdTheming) {\n  return {\n    restrict: 'E',\n    controller: ['$scope', '$element', ContentController],\n    link: function(scope, element) {\n      element.addClass('_md');     // private md component indicator for styling\n\n      $mdTheming(element);\n      scope.$broadcast('$mdContentLoaded', element);\n\n      iosScrollFix(element[0]);\n    }\n  };\n\n  function ContentController($scope, $element) {\n    this.$scope = $scope;\n    this.$element = $element;\n  }\n}\n\nfunction iosScrollFix(node) {\n  // IOS FIX:\n  // If we scroll where there is no more room for the webview to scroll,\n  // by default the webview itself will scroll up and down, this looks really\n  // bad.  So if we are scrolling to the very top or bottom, add/subtract one\n  angular.element(node).on('$md.pressdown', function(ev) {\n    // Only touch events\n    if (ev.pointer.type !== 't') return;\n    // Don't let a child content's touchstart ruin it for us.\n    if (ev.$materialScrollFixed) return;\n    ev.$materialScrollFixed = true;\n\n    if (node.scrollTop === 0) {\n      node.scrollTop = 1;\n    } else if (node.scrollHeight === node.scrollTop + node.offsetHeight) {\n      node.scrollTop -= 1;\n    }\n  });\n}\n\n})();\n(function(){\n\"use strict\";\n\n/**\n * @ngdoc module\n * @name material.components.datepicker\n * @description Module for the datepicker component.\n */\n\nangular.module('material.components.datepicker', [\n  'material.core',\n  'material.components.icon',\n  'material.components.virtualRepeat'\n]);\n\n})();\n(function(){\n\"use strict\";\n\n/**\n * @ngdoc module\n * @name material.components.dialog\n */\nMdDialogDirective.$inject = [\"$$rAF\", \"$mdTheming\", \"$mdDialog\"];\nMdDialogProvider.$inject = [\"$$interimElementProvider\"];\nangular\n  .module('material.components.dialog', [\n    'material.core',\n    'material.components.backdrop'\n  ])\n  .directive('mdDialog', MdDialogDirective)\n  .provider('$mdDialog', MdDialogProvider);\n\n/**\n * @ngdoc directive\n * @name mdDialog\n * @module material.components.dialog\n *\n * @restrict E\n *\n * @description\n * `<md-dialog>` - The dialog's template must be inside this element.\n *\n * Inside, use an `<md-dialog-content>` element for the dialog's content, and use\n * an `<md-dialog-actions>` element for the dialog's actions.\n *\n * ## CSS\n * - `.md-dialog-content` - class that sets the padding on the content as the spec file\n *\n * ## Notes\n * - If you specify an `id` for the `<md-dialog>`, the `<md-dialog-content>` will have the same `id`\n * prefixed with `dialogContent_`.\n *\n * @usage\n * ### Dialog template\n * <hljs lang=\"html\">\n * <md-dialog aria-label=\"List dialog\">\n *   <md-dialog-content>\n *     <md-list>\n *       <md-list-item ng-repeat=\"item in items\">\n *         <p>Number {{item}}</p>\n *       </md-list-item>\n *     </md-list>\n *   </md-dialog-content>\n *   <md-dialog-actions>\n *     <md-button ng-click=\"closeDialog()\" class=\"md-primary\">Close Dialog</md-button>\n *   </md-dialog-actions>\n * </md-dialog>\n * </hljs>\n */\nfunction MdDialogDirective($$rAF, $mdTheming, $mdDialog) {\n  return {\n    restrict: 'E',\n    link: function(scope, element) {\n      element.addClass('_md');     // private md component indicator for styling\n\n      $mdTheming(element);\n      $$rAF(function() {\n        var images;\n        var content = element[0].querySelector('md-dialog-content');\n\n        if (content) {\n          images = content.getElementsByTagName('img');\n          addOverflowClass();\n          //-- delayed image loading may impact scroll height, check after images are loaded\n          angular.element(images).on('load', addOverflowClass);\n        }\n\n        scope.$on('$destroy', function() {\n          $mdDialog.destroy(element);\n        });\n\n        /**\n         *\n         */\n        function addOverflowClass() {\n          element.toggleClass('md-content-overflow', content.scrollHeight > content.clientHeight);\n        }\n\n\n      });\n    }\n  };\n}\n\n/**\n * @ngdoc service\n * @name $mdDialog\n * @module material.components.dialog\n *\n * @description\n * `$mdDialog` opens a dialog over the app to inform users about critical information or require\n *  them to make decisions. There are two approaches for setup: a simple promise API\n *  and regular object syntax.\n *\n * ## Restrictions\n *\n * - The dialog is always given an isolate scope.\n * - The dialog's template must have an outer `<md-dialog>` element.\n *   Inside, use an `<md-dialog-content>` element for the dialog's content, and use\n *   an `<md-dialog-actions>` element for the dialog's actions.\n * - Dialogs must cover the entire application to keep interactions inside of them.\n * Use the `parent` option to change where dialogs are appended.\n *\n * ## Sizing\n * - Complex dialogs can be sized with `flex=\"percentage\"`, i.e. `flex=\"66\"`.\n * - Default max-width is 80% of the `rootElement` or `parent`.\n *\n * ## CSS\n * - `.md-dialog-content` - class that sets the padding on the content as the spec file\n *\n * @usage\n * <hljs lang=\"html\">\n * <div  ng-app=\"demoApp\" ng-controller=\"EmployeeController\">\n *   <div>\n *     <md-button ng-click=\"showAlert()\" class=\"md-raised md-warn\">\n *       Employee Alert!\n *       </md-button>\n *   </div>\n *   <div>\n *     <md-button ng-click=\"showDialog($event)\" class=\"md-raised\">\n *       Custom Dialog\n *       </md-button>\n *   </div>\n *   <div>\n *     <md-button ng-click=\"closeAlert()\" ng-disabled=\"!hasAlert()\" class=\"md-raised\">\n *       Close Alert\n *     </md-button>\n *   </div>\n *   <div>\n *     <md-button ng-click=\"showGreeting($event)\" class=\"md-raised md-primary\" >\n *       Greet Employee\n *       </md-button>\n *   </div>\n * </div>\n * </hljs>\n *\n * ### JavaScript: object syntax\n * <hljs lang=\"js\">\n * (function(angular, undefined){\n *   \"use strict\";\n *\n *   angular\n *    .module('demoApp', ['ngMaterial'])\n *    .controller('AppCtrl', AppController);\n *\n *   function AppController($scope, $mdDialog) {\n *     var alert;\n *     $scope.showAlert = showAlert;\n *     $scope.showDialog = showDialog;\n *     $scope.items = [1, 2, 3];\n *\n *     // Internal method\n *     function showAlert() {\n *       alert = $mdDialog.alert({\n *         title: 'Attention',\n *         textContent: 'This is an example of how easy dialogs can be!',\n *         ok: 'Close'\n *       });\n *\n *       $mdDialog\n *         .show( alert )\n *         .finally(function() {\n *           alert = undefined;\n *         });\n *     }\n *\n *     function showDialog($event) {\n *        var parentEl = angular.element(document.body);\n *        $mdDialog.show({\n *          parent: parentEl,\n *          targetEvent: $event,\n *          template:\n *            '<md-dialog aria-label=\"List dialog\">' +\n *            '  <md-dialog-content>'+\n *            '    <md-list>'+\n *            '      <md-list-item ng-repeat=\"item in items\">'+\n *            '       <p>Number {{item}}</p>' +\n *            '      </md-item>'+\n *            '    </md-list>'+\n *            '  </md-dialog-content>' +\n *            '  <md-dialog-actions>' +\n *            '    <md-button ng-click=\"closeDialog()\" class=\"md-primary\">' +\n *            '      Close Dialog' +\n *            '    </md-button>' +\n *            '  </md-dialog-actions>' +\n *            '</md-dialog>',\n *          locals: {\n *            items: $scope.items\n *          },\n *          controller: DialogController\n *       });\n *       function DialogController($scope, $mdDialog, items) {\n *         $scope.items = items;\n *         $scope.closeDialog = function() {\n *           $mdDialog.hide();\n *         }\n *       }\n *     }\n *   }\n * })(angular);\n * </hljs>\n *\n * ### Multiple Dialogs\n * Using the `multiple` option for the `$mdDialog` service allows developers to show multiple dialogs\n * at the same time.\n *\n * <hljs lang=\"js\">\n *   // From plain options\n *   $mdDialog.show({\n *     multiple: true\n *   });\n *\n *   // From a dialog preset\n *   $mdDialog.show(\n *     $mdDialog\n *       .alert()\n *       .multiple(true)\n *   );\n *\n * </hljs>\n *\n * ### Pre-Rendered Dialogs\n * By using the `contentElement` option, it is possible to use an already existing element in the DOM.\n *\n * > Pre-rendered dialogs will be not linked to any scope and will not instantiate any new controller.<br/>\n * > You can manually link the elements to a scope or instantiate a controller from the template (`ng-controller`)\n *\n * <hljs lang=\"js\">\n *   $scope.showPrerenderedDialog = function() {\n *     $mdDialog.show({\n *       contentElement: '#myStaticDialog',\n *       parent: angular.element(document.body)\n *     });\n *   };\n * </hljs>\n *\n * When using a string as value, `$mdDialog` will automatically query the DOM for the specified CSS selector.\n *\n * <hljs lang=\"html\">\n *   <div style=\"visibility: hidden\">\n *     <div class=\"md-dialog-container\" id=\"myStaticDialog\">\n *       <md-dialog>\n *         This is a pre-rendered dialog.\n *       </md-dialog>\n *     </div>\n *   </div>\n * </hljs>\n *\n * **Notice**: It is important, to use the `.md-dialog-container` as the content element, otherwise the dialog\n * will not show up.\n *\n * It also possible to use a DOM element for the `contentElement` option.\n * - `contentElement: document.querySelector('#myStaticDialog')`\n * - `contentElement: angular.element(TEMPLATE)`\n *\n * When using a `template` as content element, it will be not compiled upon open.\n * This allows you to compile the element yourself and use it each time the dialog opens.\n *\n * ### Custom Presets\n * Developers are also able to create their own preset, which can be easily used without repeating\n * their options each time.\n *\n * <hljs lang=\"js\">\n *   $mdDialogProvider.addPreset('testPreset', {\n *     options: function() {\n *       return {\n *         template:\n *           '<md-dialog>' +\n *             'This is a custom preset' +\n *           '</md-dialog>',\n *         controllerAs: 'dialog',\n *         bindToController: true,\n *         clickOutsideToClose: true,\n *         escapeToClose: true\n *       };\n *     }\n *   });\n * </hljs>\n *\n * After you created your preset at config phase, you can easily access it.\n *\n * <hljs lang=\"js\">\n *   $mdDialog.show(\n *     $mdDialog.testPreset()\n *   );\n * </hljs>\n *\n * ### JavaScript: promise API syntax, custom dialog template\n * <hljs lang=\"js\">\n * (function(angular, undefined){\n *   \"use strict\";\n *\n *   angular\n *     .module('demoApp', ['ngMaterial'])\n *     .controller('EmployeeController', EmployeeEditor)\n *     .controller('GreetingController', GreetingController);\n *\n *   // Fictitious Employee Editor to show how to use simple and complex dialogs.\n *\n *   function EmployeeEditor($scope, $mdDialog) {\n *     var alert;\n *\n *     $scope.showAlert = showAlert;\n *     $scope.closeAlert = closeAlert;\n *     $scope.showGreeting = showCustomGreeting;\n *\n *     $scope.hasAlert = function() { return !!alert };\n *     $scope.userName = $scope.userName || 'Bobby';\n *\n *     // Dialog #1 - Show simple alert dialog and cache\n *     // reference to dialog instance\n *\n *     function showAlert() {\n *       alert = $mdDialog.alert()\n *         .title('Attention, ' + $scope.userName)\n *         .textContent('This is an example of how easy dialogs can be!')\n *         .ok('Close');\n *\n *       $mdDialog\n *           .show( alert )\n *           .finally(function() {\n *             alert = undefined;\n *           });\n *     }\n *\n *     // Close the specified dialog instance and resolve with 'finished' flag\n *     // Normally this is not needed, just use '$mdDialog.hide()' to close\n *     // the most recent dialog popup.\n *\n *     function closeAlert() {\n *       $mdDialog.hide( alert, \"finished\" );\n *       alert = undefined;\n *     }\n *\n *     // Dialog #2 - Demonstrate more complex dialogs construction and popup.\n *\n *     function showCustomGreeting($event) {\n *         $mdDialog.show({\n *           targetEvent: $event,\n *           template:\n *             '<md-dialog>' +\n *\n *             '  <md-dialog-content>Hello {{ employee }}!</md-dialog-content>' +\n *\n *             '  <md-dialog-actions>' +\n *             '    <md-button ng-click=\"closeDialog()\" class=\"md-primary\">' +\n *             '      Close Greeting' +\n *             '    </md-button>' +\n *             '  </md-dialog-actions>' +\n *             '</md-dialog>',\n *           controller: 'GreetingController',\n *           onComplete: afterShowAnimation,\n *           locals: { employee: $scope.userName }\n *         });\n *\n *         // When the 'enter' animation finishes...\n *\n *         function afterShowAnimation(scope, element, options) {\n *            // post-show code here: DOM element focus, etc.\n *         }\n *     }\n *\n *     // Dialog #3 - Demonstrate use of ControllerAs and passing $scope to dialog\n *     //             Here we used ng-controller=\"GreetingController as vm\" and\n *     //             $scope.vm === <controller instance>\n *\n *     function showCustomGreeting() {\n *\n *        $mdDialog.show({\n *           clickOutsideToClose: true,\n *\n *           scope: $scope,        // use parent scope in template\n *           preserveScope: true,  // do not forget this if use parent scope\n\n *           // Since GreetingController is instantiated with ControllerAs syntax\n *           // AND we are passing the parent '$scope' to the dialog, we MUST\n *           // use 'vm.<xxx>' in the template markup\n *\n *           template: '<md-dialog>' +\n *                     '  <md-dialog-content>' +\n *                     '     Hi There {{vm.employee}}' +\n *                     '  </md-dialog-content>' +\n *                     '</md-dialog>',\n *\n *           controller: function DialogController($scope, $mdDialog) {\n *             $scope.closeDialog = function() {\n *               $mdDialog.hide();\n *             }\n *           }\n *        });\n *     }\n *\n *   }\n *\n *   // Greeting controller used with the more complex 'showCustomGreeting()' custom dialog\n *\n *   function GreetingController($scope, $mdDialog, employee) {\n *     // Assigned from construction <code>locals</code> options...\n *     $scope.employee = employee;\n *\n *     $scope.closeDialog = function() {\n *       // Easily hides most recent dialog shown...\n *       // no specific instance reference is needed.\n *       $mdDialog.hide();\n *     };\n *   }\n *\n * })(angular);\n * </hljs>\n */\n\n/**\n * @ngdoc method\n * @name $mdDialog#alert\n *\n * @description\n * Builds a preconfigured dialog with the specified message.\n *\n * @returns {obj} an `$mdDialogPreset` with the chainable configuration methods:\n *\n * - $mdDialogPreset#title(string) - Sets the alert title.\n * - $mdDialogPreset#textContent(string) - Sets the alert message.\n * - $mdDialogPreset#htmlContent(string) - Sets the alert message as HTML. Requires ngSanitize\n *     module to be loaded. HTML is not run through Angular's compiler.\n * - $mdDialogPreset#ok(string) - Sets the alert \"Okay\" button text.\n * - $mdDialogPreset#theme(string) - Sets the theme of the alert dialog.\n * - $mdDialogPreset#targetEvent(DOMClickEvent=) - A click's event object. When passed in as an option,\n *     the location of the click will be used as the starting point for the opening animation\n *     of the the dialog.\n *\n */\n\n/**\n * @ngdoc method\n * @name $mdDialog#confirm\n *\n * @description\n * Builds a preconfigured dialog with the specified message. You can call show and the promise returned\n * will be resolved only if the user clicks the confirm action on the dialog.\n *\n * @returns {obj} an `$mdDialogPreset` with the chainable configuration methods:\n *\n * Additionally, it supports the following methods:\n *\n * - $mdDialogPreset#title(string) - Sets the confirm title.\n * - $mdDialogPreset#textContent(string) - Sets the confirm message.\n * - $mdDialogPreset#htmlContent(string) - Sets the confirm message as HTML. Requires ngSanitize\n *     module to be loaded. HTML is not run through Angular's compiler.\n * - $mdDialogPreset#ok(string) - Sets the confirm \"Okay\" button text.\n * - $mdDialogPreset#cancel(string) - Sets the confirm \"Cancel\" button text.\n * - $mdDialogPreset#theme(string) - Sets the theme of the confirm dialog.\n * - $mdDialogPreset#targetEvent(DOMClickEvent=) - A click's event object. When passed in as an option,\n *     the location of the click will be used as the starting point for the opening animation\n *     of the the dialog.\n *\n */\n\n/**\n * @ngdoc method\n * @name $mdDialog#prompt\n *\n * @description\n * Builds a preconfigured dialog with the specified message and input box. You can call show and the promise returned\n * will be resolved only if the user clicks the prompt action on the dialog, passing the input value as the first argument.\n *\n * @returns {obj} an `$mdDialogPreset` with the chainable configuration methods:\n *\n * Additionally, it supports the following methods:\n *\n * - $mdDialogPreset#title(string) - Sets the prompt title.\n * - $mdDialogPreset#textContent(string) - Sets the prompt message.\n * - $mdDialogPreset#htmlContent(string) - Sets the prompt message as HTML. Requires ngSanitize\n *     module to be loaded. HTML is not run through Angular's compiler.\n * - $mdDialogPreset#placeholder(string) - Sets the placeholder text for the input.\n * - $mdDialogPreset#initialValue(string) - Sets the initial value for the prompt input.\n * - $mdDialogPreset#ok(string) - Sets the prompt \"Okay\" button text.\n * - $mdDialogPreset#cancel(string) - Sets the prompt \"Cancel\" button text.\n * - $mdDialogPreset#theme(string) - Sets the theme of the prompt dialog.\n * - $mdDialogPreset#targetEvent(DOMClickEvent=) - A click's event object. When passed in as an option,\n *     the location of the click will be used as the starting point for the opening animation\n *     of the the dialog.\n *\n */\n\n/**\n * @ngdoc method\n * @name $mdDialog#show\n *\n * @description\n * Show a dialog with the specified options.\n *\n * @param {object} optionsOrPreset Either provide an `$mdDialogPreset` returned from `alert()`, and\n * `confirm()`, or an options object with the following properties:\n *   - `templateUrl` - `{string=}`: The url of a template that will be used as the content\n *   of the dialog.\n *   - `template` - `{string=}`: HTML template to show in the dialog. This **must** be trusted HTML\n *      with respect to Angular's [$sce service](https://docs.angularjs.org/api/ng/service/$sce).\n *      This template should **never** be constructed with any kind of user input or user data.\n *   - `contentElement` - `{string|Element}`: Instead of using a template, which will be compiled each time a\n *     dialog opens, you can also use a DOM element.<br/>\n *     * When specifying an element, which is present on the DOM, `$mdDialog` will temporary fetch the element into\n *       the dialog and restores it at the old DOM position upon close.\n *     * When specifying a string, the string be used as a CSS selector, to lookup for the element in the DOM.\n *   - `autoWrap` - `{boolean=}`: Whether or not to automatically wrap the template with a\n *     `<md-dialog>` tag if one is not provided. Defaults to true. Can be disabled if you provide a\n *     custom dialog directive.\n *   - `targetEvent` - `{DOMClickEvent=}`: A click's event object. When passed in as an option,\n *     the location of the click will be used as the starting point for the opening animation\n *     of the the dialog.\n *   - `openFrom` - `{string|Element|object}`: The query selector, DOM element or the Rect object\n *     that is used to determine the bounds (top, left, height, width) from which the Dialog will\n *     originate.\n *   - `closeTo` - `{string|Element|object}`: The query selector, DOM element or the Rect object\n *     that is used to determine the bounds (top, left, height, width) to which the Dialog will\n *     target.\n *   - `scope` - `{object=}`: the scope to link the template / controller to. If none is specified,\n *     it will create a new isolate scope.\n *     This scope will be destroyed when the dialog is removed unless `preserveScope` is set to true.\n *   - `preserveScope` - `{boolean=}`: whether to preserve the scope when the element is removed. Default is false\n *   - `disableParentScroll` - `{boolean=}`: Whether to disable scrolling while the dialog is open.\n *     Default true.\n *   - `hasBackdrop` - `{boolean=}`: Whether there should be an opaque backdrop behind the dialog.\n *     Default true.\n *   - `clickOutsideToClose` - `{boolean=}`: Whether the user can click outside the dialog to\n *     close it. Default false.\n *   - `escapeToClose` - `{boolean=}`: Whether the user can press escape to close the dialog.\n *     Default true.\n *   - `focusOnOpen` - `{boolean=}`: An option to override focus behavior on open. Only disable if\n *     focusing some other way, as focus management is required for dialogs to be accessible.\n *     Defaults to true.\n *   - `controller` - `{function|string=}`: The controller to associate with the dialog. The controller\n *     will be injected with the local `$mdDialog`, which passes along a scope for the dialog.\n *   - `locals` - `{object=}`: An object containing key/value pairs. The keys will be used as names\n *     of values to inject into the controller. For example, `locals: {three: 3}` would inject\n *     `three` into the controller, with the value 3. If `bindToController` is true, they will be\n *     copied to the controller instead.\n *   - `bindToController` - `bool`: bind the locals to the controller, instead of passing them in.\n *   - `resolve` - `{object=}`: Similar to locals, except it takes promises as values, and the\n *     dialog will not open until all of the promises resolve.\n *   - `controllerAs` - `{string=}`: An alias to assign the controller to on the scope.\n *   - `parent` - `{element=}`: The element to append the dialog to. Defaults to appending\n *     to the root element of the application.\n *   - `onShowing` - `function(scope, element)`: Callback function used to announce the show() action is\n *     starting.\n *   - `onComplete` - `function(scope, element)`: Callback function used to announce when the show() action is\n *     finished.\n *   - `onRemoving` - `function(element, removePromise)`: Callback function used to announce the\n *      close/hide() action is starting. This allows developers to run custom animations\n *      in parallel the close animations.\n *   - `fullscreen` `{boolean=}`: An option to toggle whether the dialog should show in fullscreen\n *      or not. Defaults to `false`.\n *   - `multiple` `{boolean=}`: An option to allow this dialog to display over one that's currently open.\n * @returns {promise} A promise that can be resolved with `$mdDialog.hide()` or\n * rejected with `$mdDialog.cancel()`.\n */\n\n/**\n * @ngdoc method\n * @name $mdDialog#hide\n *\n * @description\n * Hide an existing dialog and resolve the promise returned from `$mdDialog.show()`.\n *\n * @param {*=} response An argument for the resolved promise.\n *\n * @returns {promise} A promise that is resolved when the dialog has been closed.\n */\n\n/**\n * @ngdoc method\n * @name $mdDialog#cancel\n *\n * @description\n * Hide an existing dialog and reject the promise returned from `$mdDialog.show()`.\n *\n * @param {*=} response An argument for the rejected promise.\n *\n * @returns {promise} A promise that is resolved when the dialog has been closed.\n */\n\nfunction MdDialogProvider($$interimElementProvider) {\n  // Elements to capture and redirect focus when the user presses tab at the dialog boundary.\n  advancedDialogOptions.$inject = [\"$mdDialog\", \"$mdConstant\"];\n  dialogDefaultOptions.$inject = [\"$mdDialog\", \"$mdAria\", \"$mdUtil\", \"$mdConstant\", \"$animate\", \"$document\", \"$window\", \"$rootElement\", \"$log\", \"$injector\", \"$mdTheming\", \"$interpolate\", \"$mdInteraction\"];\n  var topFocusTrap, bottomFocusTrap;\n\n  return $$interimElementProvider('$mdDialog')\n    .setDefaults({\n      methods: ['disableParentScroll', 'hasBackdrop', 'clickOutsideToClose', 'escapeToClose',\n          'targetEvent', 'closeTo', 'openFrom', 'parent', 'fullscreen', 'multiple'],\n      options: dialogDefaultOptions\n    })\n    .addPreset('alert', {\n      methods: ['title', 'htmlContent', 'textContent', 'content', 'ariaLabel', 'ok', 'theme',\n          'css'],\n      options: advancedDialogOptions\n    })\n    .addPreset('confirm', {\n      methods: ['title', 'htmlContent', 'textContent', 'content', 'ariaLabel', 'ok', 'cancel',\n          'theme', 'css'],\n      options: advancedDialogOptions\n    })\n    .addPreset('prompt', {\n      methods: ['title', 'htmlContent', 'textContent', 'initialValue', 'content', 'placeholder', 'ariaLabel',\n          'ok', 'cancel', 'theme', 'css'],\n      options: advancedDialogOptions\n    });\n\n  /* @ngInject */\n  function advancedDialogOptions($mdDialog, $mdConstant) {\n    return {\n      template: [\n        '<md-dialog md-theme=\"{{ dialog.theme || dialog.defaultTheme }}\" aria-label=\"{{ dialog.ariaLabel }}\" ng-class=\"dialog.css\">',\n        '  <md-dialog-content class=\"md-dialog-content\" role=\"document\" tabIndex=\"-1\">',\n        '    <h2 class=\"md-title\">{{ dialog.title }}</h2>',\n        '    <div ng-if=\"::dialog.mdHtmlContent\" class=\"md-dialog-content-body\" ',\n        '        ng-bind-html=\"::dialog.mdHtmlContent\"></div>',\n        '    <div ng-if=\"::!dialog.mdHtmlContent\" class=\"md-dialog-content-body\">',\n        '      <p>{{::dialog.mdTextContent}}</p>',\n        '    </div>',\n        '    <md-input-container md-no-float ng-if=\"::dialog.$type == \\'prompt\\'\" class=\"md-prompt-input-container\">',\n        '      <input ng-keypress=\"dialog.keypress($event)\" md-autofocus ng-model=\"dialog.result\" ' +\n        '             placeholder=\"{{::dialog.placeholder}}\">',\n        '    </md-input-container>',\n        '  </md-dialog-content>',\n        '  <md-dialog-actions>',\n        '    <md-button ng-if=\"dialog.$type === \\'confirm\\' || dialog.$type === \\'prompt\\'\"' +\n        '               ng-click=\"dialog.abort()\" class=\"md-primary md-cancel-button\">',\n        '      {{ dialog.cancel }}',\n        '    </md-button>',\n        '    <md-button ng-click=\"dialog.hide()\" class=\"md-primary md-confirm-button\" md-autofocus=\"dialog.$type===\\'alert\\'\">',\n        '      {{ dialog.ok }}',\n        '    </md-button>',\n        '  </md-dialog-actions>',\n        '</md-dialog>'\n      ].join('').replace(/\\s\\s+/g, ''),\n      controller: function mdDialogCtrl() {\n        var isPrompt = this.$type == 'prompt';\n\n        if (isPrompt && this.initialValue) {\n          this.result = this.initialValue;\n        }\n\n        this.hide = function() {\n          $mdDialog.hide(isPrompt ? this.result : true);\n        };\n        this.abort = function() {\n          $mdDialog.cancel();\n        };\n        this.keypress = function($event) {\n          if ($event.keyCode === $mdConstant.KEY_CODE.ENTER) {\n            $mdDialog.hide(this.result);\n          }\n        };\n      },\n      controllerAs: 'dialog',\n      bindToController: true,\n    };\n  }\n\n  /* @ngInject */\n  function dialogDefaultOptions($mdDialog, $mdAria, $mdUtil, $mdConstant, $animate, $document, $window, $rootElement,\n                                $log, $injector, $mdTheming, $interpolate, $mdInteraction) {\n\n    return {\n      hasBackdrop: true,\n      isolateScope: true,\n      onCompiling: beforeCompile,\n      onShow: onShow,\n      onShowing: beforeShow,\n      onRemove: onRemove,\n      clickOutsideToClose: false,\n      escapeToClose: true,\n      targetEvent: null,\n      closeTo: null,\n      openFrom: null,\n      focusOnOpen: true,\n      disableParentScroll: true,\n      autoWrap: true,\n      fullscreen: false,\n      transformTemplate: function(template, options) {\n        // Make the dialog container focusable, because otherwise the focus will be always redirected to\n        // an element outside of the container, and the focus trap won't work probably..\n        // Also the tabindex is needed for the `escapeToClose` functionality, because\n        // the keyDown event can't be triggered when the focus is outside of the container.\n        var startSymbol = $interpolate.startSymbol();\n        var endSymbol = $interpolate.endSymbol();\n        var theme = startSymbol + (options.themeWatch ? '' : '::') + 'theme' + endSymbol;\n        return '<div class=\"md-dialog-container\" tabindex=\"-1\" md-theme=\"' + theme + '\">' + validatedTemplate(template) + '</div>';\n\n        /**\n         * The specified template should contain a <md-dialog> wrapper element....\n         */\n        function validatedTemplate(template) {\n          if (options.autoWrap && !/<\\/md-dialog>/g.test(template)) {\n            return '<md-dialog>' + (template || '') + '</md-dialog>';\n          } else {\n            return template || '';\n          }\n        }\n      }\n    };\n\n    function beforeCompile(options) {\n      // Automatically apply the theme, if the user didn't specify a theme explicitly.\n      // Those option changes need to be done, before the compilation has started, because otherwise\n      // the option changes will be not available in the $mdCompilers locales.\n      options.defaultTheme = $mdTheming.defaultTheme();\n\n      detectTheming(options);\n    }\n\n    function beforeShow(scope, element, options, controller) {\n\n      if (controller) {\n        var mdHtmlContent = controller.htmlContent || options.htmlContent || '';\n        var mdTextContent = controller.textContent || options.textContent ||\n            controller.content || options.content || '';\n\n        if (mdHtmlContent && !$injector.has('$sanitize')) {\n          throw Error('The ngSanitize module must be loaded in order to use htmlContent.');\n        }\n\n        if (mdHtmlContent && mdTextContent) {\n          throw Error('md-dialog cannot have both `htmlContent` and `textContent`');\n        }\n\n        // Only assign the content if nothing throws, otherwise it'll still be compiled.\n        controller.mdHtmlContent = mdHtmlContent;\n        controller.mdTextContent = mdTextContent;\n      }\n    }\n\n    /** Show method for dialogs */\n    function onShow(scope, element, options, controller) {\n      angular.element($document[0].body).addClass('md-dialog-is-showing');\n\n      var dialogElement = element.find('md-dialog');\n\n      // Once a dialog has `ng-cloak` applied on his template the dialog animation will not work properly.\n      // This is a very common problem, so we have to notify the developer about this.\n      if (dialogElement.hasClass('ng-cloak')) {\n        var message = '$mdDialog: using `<md-dialog ng-cloak>` will affect the dialog opening animations.';\n        $log.warn( message, element[0] );\n      }\n\n      captureParentAndFromToElements(options);\n      configureAria(dialogElement, options);\n      showBackdrop(scope, element, options);\n      activateListeners(element, options);\n\n      return dialogPopIn(element, options)\n        .then(function() {\n          lockScreenReader(element, options);\n          warnDeprecatedActions();\n          focusOnOpen();\n        });\n\n      /**\n       * Check to see if they used the deprecated .md-actions class and log a warning\n       */\n      function warnDeprecatedActions() {\n        if (element[0].querySelector('.md-actions')) {\n          $log.warn('Using a class of md-actions is deprecated, please use <md-dialog-actions>.');\n        }\n      }\n\n      /**\n       * For alerts, focus on content... otherwise focus on\n       * the close button (or equivalent)\n       */\n      function focusOnOpen() {\n        if (options.focusOnOpen) {\n          var target = $mdUtil.findFocusTarget(element) || findCloseButton() || dialogElement;\n          target.focus();\n        }\n\n        /**\n         * If no element with class dialog-close, try to find the last\n         * button child in md-actions and assume it is a close button.\n         *\n         * If we find no actions at all, log a warning to the console.\n         */\n        function findCloseButton() {\n          return element[0].querySelector('.dialog-close, md-dialog-actions button:last-child');\n        }\n      }\n    }\n\n    /**\n     * Remove function for all dialogs\n     */\n    function onRemove(scope, element, options) {\n      options.deactivateListeners();\n      options.unlockScreenReader();\n      options.hideBackdrop(options.$destroy);\n\n      // Remove the focus traps that we added earlier for keeping focus within the dialog.\n      if (topFocusTrap && topFocusTrap.parentNode) {\n        topFocusTrap.parentNode.removeChild(topFocusTrap);\n      }\n\n      if (bottomFocusTrap && bottomFocusTrap.parentNode) {\n        bottomFocusTrap.parentNode.removeChild(bottomFocusTrap);\n      }\n\n      // For navigation $destroy events, do a quick, non-animated removal,\n      // but for normal closes (from clicks, etc) animate the removal\n      return !!options.$destroy ? detachAndClean() : animateRemoval().then( detachAndClean );\n\n      /**\n       * For normal closes, animate the removal.\n       * For forced closes (like $destroy events), skip the animations\n       */\n      function animateRemoval() {\n        return dialogPopOut(element, options);\n      }\n\n      /**\n       * Detach the element\n       */\n      function detachAndClean() {\n        angular.element($document[0].body).removeClass('md-dialog-is-showing');\n\n        // Reverse the container stretch if using a content element.\n        if (options.contentElement) {\n          options.reverseContainerStretch();\n        }\n\n        // Exposed cleanup function from the $mdCompiler.\n        options.cleanupElement();\n\n        // Restores the focus to the origin element if the last interaction upon opening was a keyboard.\n        if (!options.$destroy && options.originInteraction === 'keyboard') {\n          options.origin.focus();\n        }\n      }\n    }\n\n    function detectTheming(options) {\n      // Once the user specifies a targetEvent, we will automatically try to find the correct\n      // nested theme.\n      var targetEl;\n      if (options.targetEvent && options.targetEvent.target) {\n        targetEl = angular.element(options.targetEvent.target);\n      }\n\n      var themeCtrl = targetEl && targetEl.controller('mdTheme');\n\n      if (!themeCtrl) {\n        return;\n      }\n\n      options.themeWatch = themeCtrl.$shouldWatch;\n\n      var theme = options.theme || themeCtrl.$mdTheme;\n\n      if (theme) {\n        options.scope.theme = theme;\n      }\n\n      var unwatch = themeCtrl.registerChanges(function (newTheme) {\n        options.scope.theme = newTheme;\n\n        if (!options.themeWatch) {\n          unwatch();\n        }\n      });\n    }\n\n    /**\n     * Capture originator/trigger/from/to element information (if available)\n     * and the parent container for the dialog; defaults to the $rootElement\n     * unless overridden in the options.parent\n     */\n    function captureParentAndFromToElements(options) {\n          options.origin = angular.extend({\n            element: null,\n            bounds: null,\n            focus: angular.noop\n          }, options.origin || {});\n\n          options.parent   = getDomElement(options.parent, $rootElement);\n          options.closeTo  = getBoundingClientRect(getDomElement(options.closeTo));\n          options.openFrom = getBoundingClientRect(getDomElement(options.openFrom));\n\n          if ( options.targetEvent ) {\n            options.origin = getBoundingClientRect(options.targetEvent.target, options.origin);\n            options.originInteraction = $mdInteraction.getLastInteractionType();\n          }\n\n\n          /**\n           * Identify the bounding RECT for the target element\n           *\n           */\n          function getBoundingClientRect (element, orig) {\n            var source = angular.element((element || {}));\n            if (source && source.length) {\n              // Compute and save the target element's bounding rect, so that if the\n              // element is hidden when the dialog closes, we can shrink the dialog\n              // back to the same position it expanded from.\n              //\n              // Checking if the source is a rect object or a DOM element\n              var bounds = {top:0,left:0,height:0,width:0};\n              var hasFn = angular.isFunction(source[0].getBoundingClientRect);\n\n              return angular.extend(orig || {}, {\n                  element : hasFn ? source : undefined,\n                  bounds  : hasFn ? source[0].getBoundingClientRect() : angular.extend({}, bounds, source[0]),\n                  focus   : angular.bind(source, source.focus),\n              });\n            }\n          }\n\n          /**\n           * If the specifier is a simple string selector, then query for\n           * the DOM element.\n           */\n          function getDomElement(element, defaultElement) {\n            if (angular.isString(element)) {\n              element = $document[0].querySelector(element);\n            }\n\n            // If we have a reference to a raw dom element, always wrap it in jqLite\n            return angular.element(element || defaultElement);\n          }\n\n        }\n\n    /**\n     * Listen for escape keys and outside clicks to auto close\n     */\n    function activateListeners(element, options) {\n      var window = angular.element($window);\n      var onWindowResize = $mdUtil.debounce(function() {\n        stretchDialogContainerToViewport(element, options);\n      }, 60);\n\n      var removeListeners = [];\n      var smartClose = function() {\n        // Only 'confirm' dialogs have a cancel button... escape/clickOutside will\n        // cancel or fallback to hide.\n        var closeFn = ( options.$type == 'alert' ) ? $mdDialog.hide : $mdDialog.cancel;\n        $mdUtil.nextTick(closeFn, true);\n      };\n\n      if (options.escapeToClose) {\n        var parentTarget = options.parent;\n        var keyHandlerFn = function(ev) {\n          if (ev.keyCode === $mdConstant.KEY_CODE.ESCAPE) {\n            ev.stopPropagation();\n            ev.preventDefault();\n\n            smartClose();\n          }\n        };\n\n        // Add keydown listeners\n        element.on('keydown', keyHandlerFn);\n        parentTarget.on('keydown', keyHandlerFn);\n\n        // Queue remove listeners function\n        removeListeners.push(function() {\n\n          element.off('keydown', keyHandlerFn);\n          parentTarget.off('keydown', keyHandlerFn);\n\n        });\n      }\n\n      // Register listener to update dialog on window resize\n      window.on('resize', onWindowResize);\n\n      removeListeners.push(function() {\n        window.off('resize', onWindowResize);\n      });\n\n      if (options.clickOutsideToClose) {\n        var target = element;\n        var sourceElem;\n\n        // Keep track of the element on which the mouse originally went down\n        // so that we can only close the backdrop when the 'click' started on it.\n        // A simple 'click' handler does not work,\n        // it sets the target object as the element the mouse went down on.\n        var mousedownHandler = function(ev) {\n          sourceElem = ev.target;\n        };\n\n        // We check if our original element and the target is the backdrop\n        // because if the original was the backdrop and the target was inside the dialog\n        // we don't want to dialog to close.\n        var mouseupHandler = function(ev) {\n          if (sourceElem === target[0] && ev.target === target[0]) {\n            ev.stopPropagation();\n            ev.preventDefault();\n\n            smartClose();\n          }\n        };\n\n        // Add listeners\n        target.on('mousedown', mousedownHandler);\n        target.on('mouseup', mouseupHandler);\n\n        // Queue remove listeners function\n        removeListeners.push(function() {\n          target.off('mousedown', mousedownHandler);\n          target.off('mouseup', mouseupHandler);\n        });\n      }\n\n      // Attach specific `remove` listener handler\n      options.deactivateListeners = function() {\n        removeListeners.forEach(function(removeFn) {\n          removeFn();\n        });\n        options.deactivateListeners = null;\n      };\n    }\n\n    /**\n     * Show modal backdrop element...\n     */\n    function showBackdrop(scope, element, options) {\n\n      if (options.disableParentScroll) {\n        // !! DO this before creating the backdrop; since disableScrollAround()\n        //    configures the scroll offset; which is used by mdBackDrop postLink()\n        options.restoreScroll = $mdUtil.disableScrollAround(element, options.parent);\n      }\n\n      if (options.hasBackdrop) {\n        options.backdrop = $mdUtil.createBackdrop(scope, \"md-dialog-backdrop md-opaque\");\n        $animate.enter(options.backdrop, options.parent);\n      }\n\n      /**\n       * Hide modal backdrop element...\n       */\n      options.hideBackdrop = function hideBackdrop($destroy) {\n        if (options.backdrop) {\n          if ( !!$destroy ) options.backdrop.remove();\n          else              $animate.leave(options.backdrop);\n        }\n\n\n        if (options.disableParentScroll) {\n          options.restoreScroll && options.restoreScroll();\n          delete options.restoreScroll;\n        }\n\n        options.hideBackdrop = null;\n      };\n    }\n\n    /**\n     * Inject ARIA-specific attributes appropriate for Dialogs\n     */\n    function configureAria(element, options) {\n\n      var role = (options.$type === 'alert') ? 'alertdialog' : 'dialog';\n      var dialogContent = element.find('md-dialog-content');\n      var existingDialogId = element.attr('id');\n      var dialogContentId = 'dialogContent_' + (existingDialogId || $mdUtil.nextUid());\n\n      element.attr({\n        'role': role,\n        'tabIndex': '-1'\n      });\n\n      if (dialogContent.length === 0) {\n        dialogContent = element;\n        // If the dialog element already had an ID, don't clobber it.\n        if (existingDialogId) {\n          dialogContentId = existingDialogId;\n        }\n      }\n\n      dialogContent.attr('id', dialogContentId);\n      element.attr('aria-describedby', dialogContentId);\n\n      if (options.ariaLabel) {\n        $mdAria.expect(element, 'aria-label', options.ariaLabel);\n      }\n      else {\n        $mdAria.expectAsync(element, 'aria-label', function() {\n          var words = dialogContent.text().split(/\\s+/);\n          if (words.length > 3) words = words.slice(0, 3).concat('...');\n          return words.join(' ');\n        });\n      }\n\n      // Set up elements before and after the dialog content to capture focus and\n      // redirect back into the dialog.\n      topFocusTrap = document.createElement('div');\n      topFocusTrap.classList.add('md-dialog-focus-trap');\n      topFocusTrap.tabIndex = 0;\n\n      bottomFocusTrap = topFocusTrap.cloneNode(false);\n\n      // When focus is about to move out of the dialog, we want to intercept it and redirect it\n      // back to the dialog element.\n      var focusHandler = function() {\n        element.focus();\n      };\n      topFocusTrap.addEventListener('focus', focusHandler);\n      bottomFocusTrap.addEventListener('focus', focusHandler);\n\n      // The top focus trap inserted immeidately before the md-dialog element (as a sibling).\n      // The bottom focus trap is inserted at the very end of the md-dialog element (as a child).\n      element[0].parentNode.insertBefore(topFocusTrap, element[0]);\n      element.after(bottomFocusTrap);\n    }\n\n    /**\n     * Prevents screen reader interaction behind modal window\n     * on swipe interfaces\n     */\n    function lockScreenReader(element, options) {\n      var isHidden = true;\n\n      // get raw DOM node\n      walkDOM(element[0]);\n\n      options.unlockScreenReader = function() {\n        isHidden = false;\n        walkDOM(element[0]);\n\n        options.unlockScreenReader = null;\n      };\n\n      /**\n       * Walk DOM to apply or remove aria-hidden on sibling nodes\n       * and parent sibling nodes\n       *\n       */\n      function walkDOM(element) {\n        while (element.parentNode) {\n          if (element === document.body) {\n            return;\n          }\n          var children = element.parentNode.children;\n          for (var i = 0; i < children.length; i++) {\n            // skip over child if it is an ascendant of the dialog\n            // or a script or style tag\n            if (element !== children[i] && !isNodeOneOf(children[i], ['SCRIPT', 'STYLE'])) {\n              children[i].setAttribute('aria-hidden', isHidden);\n            }\n          }\n\n          walkDOM(element = element.parentNode);\n        }\n      }\n    }\n\n    /**\n     * Ensure the dialog container fill-stretches to the viewport\n     */\n    function stretchDialogContainerToViewport(container, options) {\n      var isFixed = $window.getComputedStyle($document[0].body).position == 'fixed';\n      var backdrop = options.backdrop ? $window.getComputedStyle(options.backdrop[0]) : null;\n      var height = backdrop ? Math.min($document[0].body.clientHeight, Math.ceil(Math.abs(parseInt(backdrop.height, 10)))) : 0;\n\n      var previousStyles = {\n        top: container.css('top'),\n        height: container.css('height')\n      };\n\n      // If the body is fixed, determine the distance to the viewport in relative from the parent.\n      var parentTop = Math.abs(options.parent[0].getBoundingClientRect().top);\n\n      container.css({\n        top: (isFixed ? parentTop : 0) + 'px',\n        height: height ? height + 'px' : '100%'\n      });\n\n      return function() {\n        // Reverts the modified styles back to the previous values.\n        // This is needed for contentElements, which should have the same styles after close\n        // as before.\n        container.css(previousStyles);\n      };\n    }\n\n    /**\n     *  Dialog open and pop-in animation\n     */\n    function dialogPopIn(container, options) {\n      // Add the `md-dialog-container` to the DOM\n      options.parent.append(container);\n      options.reverseContainerStretch = stretchDialogContainerToViewport(container, options);\n\n      var dialogEl = container.find('md-dialog');\n      var animator = $mdUtil.dom.animator;\n      var buildTranslateToOrigin = animator.calculateZoomToOrigin;\n      var translateOptions = {transitionInClass: 'md-transition-in', transitionOutClass: 'md-transition-out'};\n      var from = animator.toTransformCss(buildTranslateToOrigin(dialogEl, options.openFrom || options.origin));\n      var to = animator.toTransformCss(\"\");  // defaults to center display (or parent or $rootElement)\n\n      dialogEl.toggleClass('md-dialog-fullscreen', !!options.fullscreen);\n\n      return animator\n        .translate3d(dialogEl, from, to, translateOptions)\n        .then(function(animateReversal) {\n\n          // Build a reversal translate function synced to this translation...\n          options.reverseAnimate = function() {\n            delete options.reverseAnimate;\n\n            if (options.closeTo) {\n              // Using the opposite classes to create a close animation to the closeTo element\n              translateOptions = {transitionInClass: 'md-transition-out', transitionOutClass: 'md-transition-in'};\n              from = to;\n              to = animator.toTransformCss(buildTranslateToOrigin(dialogEl, options.closeTo));\n\n              return animator\n                .translate3d(dialogEl, from, to,translateOptions);\n            }\n\n            return animateReversal(\n              to = animator.toTransformCss(\n                // in case the origin element has moved or is hidden,\n                // let's recalculate the translateCSS\n                buildTranslateToOrigin(dialogEl, options.origin)\n              )\n            );\n\n          };\n\n          // Function to revert the generated animation styles on the dialog element.\n          // Useful when using a contentElement instead of a template.\n          options.clearAnimate = function() {\n            delete options.clearAnimate;\n\n            // Remove the transition classes, added from $animateCSS, since those can't be removed\n            // by reversely running the animator.\n            dialogEl.removeClass([\n              translateOptions.transitionOutClass,\n              translateOptions.transitionInClass\n            ].join(' '));\n\n            // Run the animation reversely to remove the previous added animation styles.\n            return animator.translate3d(dialogEl, to, animator.toTransformCss(''), {});\n          };\n\n          return true;\n        });\n    }\n\n    /**\n     * Dialog close and pop-out animation\n     */\n    function dialogPopOut(container, options) {\n      return options.reverseAnimate().then(function() {\n        if (options.contentElement) {\n          // When we use a contentElement, we want the element to be the same as before.\n          // That means, that we have to clear all the animation properties, like transform.\n          options.clearAnimate();\n        }\n      });\n    }\n\n    /**\n     * Utility function to filter out raw DOM nodes\n     */\n    function isNodeOneOf(elem, nodeTypeArray) {\n      if (nodeTypeArray.indexOf(elem.nodeName) !== -1) {\n        return true;\n      }\n    }\n\n  }\n}\n\n})();\n(function(){\n\"use strict\";\n\n/**\n * @ngdoc module\n * @name material.components.divider\n * @description Divider module!\n */\nMdDividerDirective.$inject = [\"$mdTheming\"];\nangular.module('material.components.divider', [\n  'material.core'\n])\n  .directive('mdDivider', MdDividerDirective);\n\n/**\n * @ngdoc directive\n * @name mdDivider\n * @module material.components.divider\n * @restrict E\n *\n * @description\n * Dividers group and separate content within lists and page layouts using strong visual and spatial distinctions. This divider is a thin rule, lightweight enough to not distract the user from content.\n *\n * @param {boolean=} md-inset Add this attribute to activate the inset divider style.\n * @usage\n * <hljs lang=\"html\">\n * <md-divider></md-divider>\n *\n * <md-divider md-inset></md-divider>\n * </hljs>\n *\n */\nfunction MdDividerDirective($mdTheming) {\n  return {\n    restrict: 'E',\n    link: $mdTheming\n  };\n}\n\n})();\n(function(){\n\"use strict\";\n\n(function() {\n  'use strict';\n\n  /**\n   * @ngdoc module\n   * @name material.components.fabActions\n   */\n  MdFabActionsDirective.$inject = [\"$mdUtil\"];\n  angular\n    .module('material.components.fabActions', ['material.core'])\n    .directive('mdFabActions', MdFabActionsDirective);\n\n  /**\n   * @ngdoc directive\n   * @name mdFabActions\n   * @module material.components.fabActions\n   *\n   * @restrict E\n   *\n   * @description\n   * The `<md-fab-actions>` directive is used inside of a `<md-fab-speed-dial>` or\n   * `<md-fab-toolbar>` directive to mark an element (or elements) as the actions and setup the\n   * proper event listeners.\n   *\n   * @usage\n   * See the `<md-fab-speed-dial>` or `<md-fab-toolbar>` directives for example usage.\n   */\n  function MdFabActionsDirective($mdUtil) {\n    return {\n      restrict: 'E',\n\n      require: ['^?mdFabSpeedDial', '^?mdFabToolbar'],\n\n      compile: function(element, attributes) {\n        var children = element.children();\n\n        var hasNgRepeat = $mdUtil.prefixer().hasAttribute(children, 'ng-repeat');\n\n        // Support both ng-repeat and static content\n        if (hasNgRepeat) {\n          children.addClass('md-fab-action-item');\n        } else {\n          // Wrap every child in a new div and add a class that we can scale/fling independently\n          children.wrap('<div class=\"md-fab-action-item\">');\n        }\n      }\n    };\n  }\n\n})();\n\n})();\n(function(){\n\"use strict\";\n\n(function() {\n  'use strict';\n\n  MdFabController.$inject = [\"$scope\", \"$element\", \"$animate\", \"$mdUtil\", \"$mdConstant\", \"$timeout\"];\n  angular.module('material.components.fabShared', ['material.core'])\n    .controller('MdFabController', MdFabController);\n\n  function MdFabController($scope, $element, $animate, $mdUtil, $mdConstant, $timeout) {\n    var vm = this;\n    var initialAnimationAttempts = 0;\n\n    // NOTE: We use async eval(s) below to avoid conflicts with any existing digest loops\n\n    vm.open = function() {\n      $scope.$evalAsync(\"vm.isOpen = true\");\n    };\n\n    vm.close = function() {\n      // Async eval to avoid conflicts with existing digest loops\n      $scope.$evalAsync(\"vm.isOpen = false\");\n\n      // Focus the trigger when the element closes so users can still tab to the next item\n      $element.find('md-fab-trigger')[0].focus();\n    };\n\n    // Toggle the open/close state when the trigger is clicked\n    vm.toggle = function() {\n      $scope.$evalAsync(\"vm.isOpen = !vm.isOpen\");\n    };\n\n    /*\n     * AngularJS Lifecycle hook for newer AngularJS versions.\n     * Bindings are not guaranteed to have been assigned in the controller, but they are in the $onInit hook.\n     */\n    vm.$onInit = function() {\n      setupDefaults();\n      setupListeners();\n      setupWatchers();\n\n      fireInitialAnimations();\n    };\n\n    // For AngularJS 1.4 and older, where there are no lifecycle hooks but bindings are pre-assigned,\n    // manually call the $onInit hook.\n    if (angular.version.major === 1 && angular.version.minor <= 4) {\n      this.$onInit();\n    }\n\n    function setupDefaults() {\n      // Set the default direction to 'down' if none is specified\n      vm.direction = vm.direction || 'down';\n\n      // Set the default to be closed\n      vm.isOpen = vm.isOpen || false;\n\n      // Start the keyboard interaction at the first action\n      resetActionIndex();\n\n      // Add an animations waiting class so we know not to run\n      $element.addClass('md-animations-waiting');\n    }\n\n    function setupListeners() {\n      var eventTypes = [\n        'click', 'focusin', 'focusout'\n      ];\n\n      // Add our listeners\n      angular.forEach(eventTypes, function(eventType) {\n        $element.on(eventType, parseEvents);\n      });\n\n      // Remove our listeners when destroyed\n      $scope.$on('$destroy', function() {\n        angular.forEach(eventTypes, function(eventType) {\n          $element.off(eventType, parseEvents);\n        });\n\n        // remove any attached keyboard handlers in case element is removed while\n        // speed dial is open\n        disableKeyboard();\n      });\n    }\n\n    var closeTimeout;\n    function parseEvents(event) {\n      // If the event is a click, just handle it\n      if (event.type == 'click') {\n        handleItemClick(event);\n      }\n\n      // If we focusout, set a timeout to close the element\n      if (event.type == 'focusout' && !closeTimeout) {\n        closeTimeout = $timeout(function() {\n          vm.close();\n        }, 100, false);\n      }\n\n      // If we see a focusin and there is a timeout about to run, cancel it so we stay open\n      if (event.type == 'focusin' && closeTimeout) {\n        $timeout.cancel(closeTimeout);\n        closeTimeout = null;\n      }\n    }\n\n    function resetActionIndex() {\n      vm.currentActionIndex = -1;\n    }\n\n    function setupWatchers() {\n      // Watch for changes to the direction and update classes/attributes\n      $scope.$watch('vm.direction', function(newDir, oldDir) {\n        // Add the appropriate classes so we can target the direction in the CSS\n        $animate.removeClass($element, 'md-' + oldDir);\n        $animate.addClass($element, 'md-' + newDir);\n\n        // Reset the action index since it may have changed\n        resetActionIndex();\n      });\n\n      var trigger, actions;\n\n      // Watch for changes to md-open\n      $scope.$watch('vm.isOpen', function(isOpen) {\n        // Reset the action index since it may have changed\n        resetActionIndex();\n\n        // We can't get the trigger/actions outside of the watch because the component hasn't been\n        // linked yet, so we wait until the first watch fires to cache them.\n        if (!trigger || !actions) {\n          trigger = getTriggerElement();\n          actions = getActionsElement();\n        }\n\n        if (isOpen) {\n          enableKeyboard();\n        } else {\n          disableKeyboard();\n        }\n\n        var toAdd = isOpen ? 'md-is-open' : '';\n        var toRemove = isOpen ? '' : 'md-is-open';\n\n        // Set the proper ARIA attributes\n        trigger.attr('aria-haspopup', true);\n        trigger.attr('aria-expanded', isOpen);\n        actions.attr('aria-hidden', !isOpen);\n\n        // Animate the CSS classes\n        $animate.setClass($element, toAdd, toRemove);\n      });\n    }\n\n    function fireInitialAnimations() {\n      // If the element is actually visible on the screen\n      if ($element[0].scrollHeight > 0) {\n        // Fire our animation\n        $animate.addClass($element, '_md-animations-ready').then(function() {\n          // Remove the waiting class\n          $element.removeClass('md-animations-waiting');\n        });\n      }\n\n      // Otherwise, try for up to 1 second before giving up\n      else if (initialAnimationAttempts < 10) {\n        $timeout(fireInitialAnimations, 100);\n\n        // Increment our counter\n        initialAnimationAttempts = initialAnimationAttempts + 1;\n      }\n    }\n\n    function enableKeyboard() {\n      $element.on('keydown', keyPressed);\n\n      // On the next tick, setup a check for outside clicks; we do this on the next tick to avoid\n      // clicks/touches that result in the isOpen attribute changing (e.g. a bound radio button)\n      $mdUtil.nextTick(function() {\n        angular.element(document).on('click touchend', checkForOutsideClick);\n      });\n\n      // TODO: On desktop, we should be able to reset the indexes so you cannot tab through, but\n      // this breaks accessibility, especially on mobile, since you have no arrow keys to press\n      //resetActionTabIndexes();\n    }\n\n    function disableKeyboard() {\n      $element.off('keydown', keyPressed);\n      angular.element(document).off('click touchend', checkForOutsideClick);\n    }\n\n    function checkForOutsideClick(event) {\n      if (event.target) {\n        var closestTrigger = $mdUtil.getClosest(event.target, 'md-fab-trigger');\n        var closestActions = $mdUtil.getClosest(event.target, 'md-fab-actions');\n\n        if (!closestTrigger && !closestActions) {\n          vm.close();\n        }\n      }\n    }\n\n    function keyPressed(event) {\n      switch (event.which) {\n        case $mdConstant.KEY_CODE.ESCAPE: vm.close(); event.preventDefault(); return false;\n        case $mdConstant.KEY_CODE.LEFT_ARROW: doKeyLeft(event); return false;\n        case $mdConstant.KEY_CODE.UP_ARROW: doKeyUp(event); return false;\n        case $mdConstant.KEY_CODE.RIGHT_ARROW: doKeyRight(event); return false;\n        case $mdConstant.KEY_CODE.DOWN_ARROW: doKeyDown(event); return false;\n      }\n    }\n\n    function doActionPrev(event) {\n      focusAction(event, -1);\n    }\n\n    function doActionNext(event) {\n      focusAction(event, 1);\n    }\n\n    function focusAction(event, direction) {\n      var actions = resetActionTabIndexes();\n\n      // Increment/decrement the counter with restrictions\n      vm.currentActionIndex = vm.currentActionIndex + direction;\n      vm.currentActionIndex = Math.min(actions.length - 1, vm.currentActionIndex);\n      vm.currentActionIndex = Math.max(0, vm.currentActionIndex);\n\n      // Focus the element\n      var focusElement =  angular.element(actions[vm.currentActionIndex]).children()[0];\n      angular.element(focusElement).attr('tabindex', 0);\n      focusElement.focus();\n\n      // Make sure the event doesn't bubble and cause something else\n      event.preventDefault();\n      event.stopImmediatePropagation();\n    }\n\n    function resetActionTabIndexes() {\n      // Grab all of the actions\n      var actions = getActionsElement()[0].querySelectorAll('.md-fab-action-item');\n\n      // Disable all other actions for tabbing\n      angular.forEach(actions, function(action) {\n        angular.element(angular.element(action).children()[0]).attr('tabindex', -1);\n      });\n\n      return actions;\n    }\n\n    function doKeyLeft(event) {\n      if (vm.direction === 'left') {\n        doActionNext(event);\n      } else {\n        doActionPrev(event);\n      }\n    }\n\n    function doKeyUp(event) {\n      if (vm.direction === 'down') {\n        doActionPrev(event);\n      } else {\n        doActionNext(event);\n      }\n    }\n\n    function doKeyRight(event) {\n      if (vm.direction === 'left') {\n        doActionPrev(event);\n      } else {\n        doActionNext(event);\n      }\n    }\n\n    function doKeyDown(event) {\n      if (vm.direction === 'up') {\n        doActionPrev(event);\n      } else {\n        doActionNext(event);\n      }\n    }\n\n    function isTrigger(element) {\n      return $mdUtil.getClosest(element, 'md-fab-trigger');\n    }\n\n    function isAction(element) {\n      return $mdUtil.getClosest(element, 'md-fab-actions');\n    }\n\n    function handleItemClick(event) {\n      if (isTrigger(event.target)) {\n        vm.toggle();\n      }\n\n      if (isAction(event.target)) {\n        vm.close();\n      }\n    }\n\n    function getTriggerElement() {\n      return $element.find('md-fab-trigger');\n    }\n\n    function getActionsElement() {\n      return $element.find('md-fab-actions');\n    }\n  }\n})();\n\n})();\n(function(){\n\"use strict\";\n\n(function() {\n  'use strict';\n\n  /**\n   * The duration of the CSS animation in milliseconds.\n   *\n   * @type {number}\n   */\n  MdFabSpeedDialFlingAnimation.$inject = [\"$timeout\"];\n  MdFabSpeedDialScaleAnimation.$inject = [\"$timeout\"];\n  var cssAnimationDuration = 300;\n\n  /**\n   * @ngdoc module\n   * @name material.components.fabSpeedDial\n   */\n  angular\n    // Declare our module\n    .module('material.components.fabSpeedDial', [\n      'material.core',\n      'material.components.fabShared',\n      'material.components.fabActions'\n    ])\n\n    // Register our directive\n    .directive('mdFabSpeedDial', MdFabSpeedDialDirective)\n\n    // Register our custom animations\n    .animation('.md-fling', MdFabSpeedDialFlingAnimation)\n    .animation('.md-scale', MdFabSpeedDialScaleAnimation)\n\n    // Register a service for each animation so that we can easily inject them into unit tests\n    .service('mdFabSpeedDialFlingAnimation', MdFabSpeedDialFlingAnimation)\n    .service('mdFabSpeedDialScaleAnimation', MdFabSpeedDialScaleAnimation);\n\n  /**\n   * @ngdoc directive\n   * @name mdFabSpeedDial\n   * @module material.components.fabSpeedDial\n   *\n   * @restrict E\n   *\n   * @description\n   * The `<md-fab-speed-dial>` directive is used to present a series of popup elements (usually\n   * `<md-button>`s) for quick access to common actions.\n   *\n   * There are currently two animations available by applying one of the following classes to\n   * the component:\n   *\n   *  - `md-fling` - The speed dial items appear from underneath the trigger and move into their\n   *    appropriate positions.\n   *  - `md-scale` - The speed dial items appear in their proper places by scaling from 0% to 100%.\n   *\n   * You may also easily position the trigger by applying one one of the following classes to the\n   * `<md-fab-speed-dial>` element:\n   *  - `md-fab-top-left`\n   *  - `md-fab-top-right`\n   *  - `md-fab-bottom-left`\n   *  - `md-fab-bottom-right`\n   *\n   * These CSS classes use `position: absolute`, so you need to ensure that the container element\n   * also uses `position: absolute` or `position: relative` in order for them to work.\n   *\n   * Additionally, you may use the standard `ng-mouseenter` and `ng-mouseleave` directives to\n   * open or close the speed dial. However, if you wish to allow users to hover over the empty\n   * space where the actions will appear, you must also add the `md-hover-full` class to the speed\n   * dial element. Without this, the hover effect will only occur on top of the trigger.\n   *\n   * See the demos for more information.\n   *\n   * ## Troubleshooting\n   *\n   * If your speed dial shows the closing animation upon launch, you may need to use `ng-cloak` on\n   * the parent container to ensure that it is only visible once ready. We have plans to remove this\n   * necessity in the future.\n   *\n   * @usage\n   * <hljs lang=\"html\">\n   * <md-fab-speed-dial md-direction=\"up\" class=\"md-fling\">\n   *   <md-fab-trigger>\n   *     <md-button aria-label=\"Add...\"><md-icon md-svg-src=\"/img/icons/plus.svg\"></md-icon></md-button>\n   *   </md-fab-trigger>\n   *\n   *   <md-fab-actions>\n   *     <md-button aria-label=\"Add User\">\n   *       <md-icon md-svg-src=\"/img/icons/user.svg\"></md-icon>\n   *     </md-button>\n   *\n   *     <md-button aria-label=\"Add Group\">\n   *       <md-icon md-svg-src=\"/img/icons/group.svg\"></md-icon>\n   *     </md-button>\n   *   </md-fab-actions>\n   * </md-fab-speed-dial>\n   * </hljs>\n   *\n   * @param {string} md-direction From which direction you would like the speed dial to appear\n   * relative to the trigger element.\n   * @param {expression=} md-open Programmatically control whether or not the speed-dial is visible.\n   */\n  function MdFabSpeedDialDirective() {\n    return {\n      restrict: 'E',\n\n      scope: {\n        direction: '@?mdDirection',\n        isOpen: '=?mdOpen'\n      },\n\n      bindToController: true,\n      controller: 'MdFabController',\n      controllerAs: 'vm',\n\n      link: FabSpeedDialLink\n    };\n\n    function FabSpeedDialLink(scope, element) {\n      // Prepend an element to hold our CSS variables so we can use them in the animations below\n      element.prepend('<div class=\"_md-css-variables\"></div>');\n    }\n  }\n\n  function MdFabSpeedDialFlingAnimation($timeout) {\n    function delayDone(done) { $timeout(done, cssAnimationDuration, false); }\n\n    function runAnimation(element) {\n      // Don't run if we are still waiting and we are not ready\n      if (element.hasClass('md-animations-waiting') && !element.hasClass('_md-animations-ready')) {\n        return;\n      }\n\n      var el = element[0];\n      var ctrl = element.controller('mdFabSpeedDial');\n      var items = el.querySelectorAll('.md-fab-action-item');\n\n      // Grab our trigger element\n      var triggerElement = el.querySelector('md-fab-trigger');\n\n      // Grab our element which stores CSS variables\n      var variablesElement = el.querySelector('._md-css-variables');\n\n      // Setup JS variables based on our CSS variables\n      var startZIndex = parseInt(window.getComputedStyle(variablesElement).zIndex);\n\n      // Always reset the items to their natural position/state\n      angular.forEach(items, function(item, index) {\n        var styles = item.style;\n\n        styles.transform = styles.webkitTransform = '';\n        styles.transitionDelay = '';\n        styles.opacity = 1;\n\n        // Make the items closest to the trigger have the highest z-index\n        styles.zIndex = (items.length - index) + startZIndex;\n      });\n\n      // Set the trigger to be above all of the actions so they disappear behind it.\n      triggerElement.style.zIndex = startZIndex + items.length + 1;\n\n      // If the control is closed, hide the items behind the trigger\n      if (!ctrl.isOpen) {\n        angular.forEach(items, function(item, index) {\n          var newPosition, axis;\n          var styles = item.style;\n\n          // Make sure to account for differences in the dimensions of the trigger verses the items\n          // so that we can properly center everything; this helps hide the item's shadows behind\n          // the trigger.\n          var triggerItemHeightOffset = (triggerElement.clientHeight - item.clientHeight) / 2;\n          var triggerItemWidthOffset = (triggerElement.clientWidth - item.clientWidth) / 2;\n\n          switch (ctrl.direction) {\n            case 'up':\n              newPosition = (item.scrollHeight * (index + 1) + triggerItemHeightOffset);\n              axis = 'Y';\n              break;\n            case 'down':\n              newPosition = -(item.scrollHeight * (index + 1) + triggerItemHeightOffset);\n              axis = 'Y';\n              break;\n            case 'left':\n              newPosition = (item.scrollWidth * (index + 1) + triggerItemWidthOffset);\n              axis = 'X';\n              break;\n            case 'right':\n              newPosition = -(item.scrollWidth * (index + 1) + triggerItemWidthOffset);\n              axis = 'X';\n              break;\n          }\n\n          var newTranslate = 'translate' + axis + '(' + newPosition + 'px)';\n\n          styles.transform = styles.webkitTransform = newTranslate;\n        });\n      }\n    }\n\n    return {\n      addClass: function(element, className, done) {\n        if (element.hasClass('md-fling')) {\n          runAnimation(element);\n          delayDone(done);\n        } else {\n          done();\n        }\n      },\n      removeClass: function(element, className, done) {\n        runAnimation(element);\n        delayDone(done);\n      }\n    };\n  }\n\n  function MdFabSpeedDialScaleAnimation($timeout) {\n    function delayDone(done) { $timeout(done, cssAnimationDuration, false); }\n\n    var delay = 65;\n\n    function runAnimation(element) {\n      var el = element[0];\n      var ctrl = element.controller('mdFabSpeedDial');\n      var items = el.querySelectorAll('.md-fab-action-item');\n\n      // Grab our element which stores CSS variables\n      var variablesElement = el.querySelector('._md-css-variables');\n\n      // Setup JS variables based on our CSS variables\n      var startZIndex = parseInt(window.getComputedStyle(variablesElement).zIndex);\n\n      // Always reset the items to their natural position/state\n      angular.forEach(items, function(item, index) {\n        var styles = item.style,\n          offsetDelay = index * delay;\n\n        styles.opacity = ctrl.isOpen ? 1 : 0;\n        styles.transform = styles.webkitTransform = ctrl.isOpen ? 'scale(1)' : 'scale(0)';\n        styles.transitionDelay = (ctrl.isOpen ? offsetDelay : (items.length - offsetDelay)) + 'ms';\n\n        // Make the items closest to the trigger have the highest z-index\n        styles.zIndex = (items.length - index) + startZIndex;\n      });\n    }\n\n    return {\n      addClass: function(element, className, done) {\n        runAnimation(element);\n        delayDone(done);\n      },\n\n      removeClass: function(element, className, done) {\n        runAnimation(element);\n        delayDone(done);\n      }\n    };\n  }\n})();\n\n})();\n(function(){\n\"use strict\";\n\n(function() {\n  'use strict';\n\n  /**\n   * @ngdoc module\n   * @name material.components.fabToolbar\n   */\n  angular\n    // Declare our module\n    .module('material.components.fabToolbar', [\n      'material.core',\n      'material.components.fabShared',\n      'material.components.fabActions'\n    ])\n\n    // Register our directive\n    .directive('mdFabToolbar', MdFabToolbarDirective)\n\n    // Register our custom animations\n    .animation('.md-fab-toolbar', MdFabToolbarAnimation)\n\n    // Register a service for the animation so that we can easily inject it into unit tests\n    .service('mdFabToolbarAnimation', MdFabToolbarAnimation);\n\n  /**\n   * @ngdoc directive\n   * @name mdFabToolbar\n   * @module material.components.fabToolbar\n   *\n   * @restrict E\n   *\n   * @description\n   *\n   * The `<md-fab-toolbar>` directive is used to present a toolbar of elements (usually `<md-button>`s)\n   * for quick access to common actions when a floating action button is activated (via click or\n   * keyboard navigation).\n   *\n   * You may also easily position the trigger by applying one one of the following classes to the\n   * `<md-fab-toolbar>` element:\n   *  - `md-fab-top-left`\n   *  - `md-fab-top-right`\n   *  - `md-fab-bottom-left`\n   *  - `md-fab-bottom-right`\n   *\n   * These CSS classes use `position: absolute`, so you need to ensure that the container element\n   * also uses `position: absolute` or `position: relative` in order for them to work.\n   *\n   * @usage\n   *\n   * <hljs lang=\"html\">\n   * <md-fab-toolbar md-direction='left'>\n   *   <md-fab-trigger>\n   *     <md-button aria-label=\"Add...\"><md-icon md-svg-src=\"/img/icons/plus.svg\"></md-icon></md-button>\n   *   </md-fab-trigger>\n   *\n   *   <md-toolbar>\n   *    <md-fab-actions>\n   *      <md-button aria-label=\"Add User\">\n   *        <md-icon md-svg-src=\"/img/icons/user.svg\"></md-icon>\n   *      </md-button>\n   *\n   *      <md-button aria-label=\"Add Group\">\n   *        <md-icon md-svg-src=\"/img/icons/group.svg\"></md-icon>\n   *      </md-button>\n   *    </md-fab-actions>\n   *   </md-toolbar>\n   * </md-fab-toolbar>\n   * </hljs>\n   *\n   * @param {string} md-direction From which direction you would like the toolbar items to appear\n   * relative to the trigger element. Supports `left` and `right` directions.\n   * @param {expression=} md-open Programmatically control whether or not the toolbar is visible.\n   */\n  function MdFabToolbarDirective() {\n    return {\n      restrict: 'E',\n      transclude: true,\n      template: '<div class=\"md-fab-toolbar-wrapper\">' +\n      '  <div class=\"md-fab-toolbar-content\" ng-transclude></div>' +\n      '</div>',\n\n      scope: {\n        direction: '@?mdDirection',\n        isOpen: '=?mdOpen'\n      },\n\n      bindToController: true,\n      controller: 'MdFabController',\n      controllerAs: 'vm',\n\n      link: link\n    };\n\n    function link(scope, element, attributes) {\n      // Add the base class for animations\n      element.addClass('md-fab-toolbar');\n\n      // Prepend the background element to the trigger's button\n      element.find('md-fab-trigger').find('button')\n        .prepend('<div class=\"md-fab-toolbar-background\"></div>');\n    }\n  }\n\n  function MdFabToolbarAnimation() {\n\n    function runAnimation(element, className, done) {\n      // If no className was specified, don't do anything\n      if (!className) {\n        return;\n      }\n\n      var el = element[0];\n      var ctrl = element.controller('mdFabToolbar');\n\n      // Grab the relevant child elements\n      var backgroundElement = el.querySelector('.md-fab-toolbar-background');\n      var triggerElement = el.querySelector('md-fab-trigger button');\n      var toolbarElement = el.querySelector('md-toolbar');\n      var iconElement = el.querySelector('md-fab-trigger button md-icon');\n      var actions = element.find('md-fab-actions').children();\n\n      // If we have both elements, use them to position the new background\n      if (triggerElement && backgroundElement) {\n        // Get our variables\n        var color = window.getComputedStyle(triggerElement).getPropertyValue('background-color');\n        var width = el.offsetWidth;\n        var height = el.offsetHeight;\n\n        // Make it twice as big as it should be since we scale from the center\n        var scale = 2 * (width / triggerElement.offsetWidth);\n\n        // Set some basic styles no matter what animation we're doing\n        backgroundElement.style.backgroundColor = color;\n        backgroundElement.style.borderRadius = width + 'px';\n\n        // If we're open\n        if (ctrl.isOpen) {\n          // Turn on toolbar pointer events when closed\n          toolbarElement.style.pointerEvents = 'inherit';\n\n          backgroundElement.style.width = triggerElement.offsetWidth + 'px';\n          backgroundElement.style.height = triggerElement.offsetHeight + 'px';\n          backgroundElement.style.transform = 'scale(' + scale + ')';\n\n          // Set the next close animation to have the proper delays\n          backgroundElement.style.transitionDelay = '0ms';\n          iconElement && (iconElement.style.transitionDelay = '.3s');\n\n          // Apply a transition delay to actions\n          angular.forEach(actions, function(action, index) {\n            action.style.transitionDelay = (actions.length - index) * 25 + 'ms';\n          });\n        } else {\n          // Turn off toolbar pointer events when closed\n          toolbarElement.style.pointerEvents = 'none';\n\n          // Scale it back down to the trigger's size\n          backgroundElement.style.transform = 'scale(1)';\n\n          // Reset the position\n          backgroundElement.style.top = '0';\n\n          if (element.hasClass('md-right')) {\n            backgroundElement.style.left = '0';\n            backgroundElement.style.right = null;\n          }\n\n          if (element.hasClass('md-left')) {\n            backgroundElement.style.right = '0';\n            backgroundElement.style.left = null;\n          }\n\n          // Set the next open animation to have the proper delays\n          backgroundElement.style.transitionDelay = '200ms';\n          iconElement && (iconElement.style.transitionDelay = '0ms');\n\n          // Apply a transition delay to actions\n          angular.forEach(actions, function(action, index) {\n            action.style.transitionDelay = 200 + (index * 25) + 'ms';\n          });\n        }\n      }\n    }\n\n    return {\n      addClass: function(element, className, done) {\n        runAnimation(element, className, done);\n        done();\n      },\n\n      removeClass: function(element, className, done) {\n        runAnimation(element, className, done);\n        done();\n      }\n    };\n  }\n})();\n\n})();\n(function(){\n\"use strict\";\n\n/**\n * @ngdoc module\n * @name material.components.gridList\n */\nGridListController.$inject = [\"$mdUtil\"];\nGridLayoutFactory.$inject = [\"$mdUtil\"];\nGridListDirective.$inject = [\"$interpolate\", \"$mdConstant\", \"$mdGridLayout\", \"$mdMedia\"];\nGridTileDirective.$inject = [\"$mdMedia\"];\nangular.module('material.components.gridList', ['material.core'])\n       .directive('mdGridList', GridListDirective)\n       .directive('mdGridTile', GridTileDirective)\n       .directive('mdGridTileFooter', GridTileCaptionDirective)\n       .directive('mdGridTileHeader', GridTileCaptionDirective)\n       .factory('$mdGridLayout', GridLayoutFactory);\n\n/**\n * @ngdoc directive\n * @name mdGridList\n * @module material.components.gridList\n * @restrict E\n * @description\n * Grid lists are an alternative to standard list views. Grid lists are distinct\n * from grids used for layouts and other visual presentations.\n *\n * A grid list is best suited to presenting a homogenous data type, typically\n * images, and is optimized for visual comprehension and differentiating between\n * like data types.\n *\n * A grid list is a continuous element consisting of tessellated, regular\n * subdivisions called cells that contain tiles (`md-grid-tile`).\n *\n * <img src=\"//material-design.storage.googleapis.com/publish/v_2/material_ext_publish/0Bx4BSt6jniD7OVlEaXZ5YmU1Xzg/components_grids_usage2.png\"\n *    style=\"width: 300px; height: auto; margin-right: 16px;\" alt=\"Concept of grid explained visually\">\n * <img src=\"//material-design.storage.googleapis.com/publish/v_2/material_ext_publish/0Bx4BSt6jniD7VGhsOE5idWlJWXM/components_grids_usage3.png\"\n *    style=\"width: 300px; height: auto;\" alt=\"Grid concepts legend\">\n *\n * Cells are arrayed vertically and horizontally within the grid.\n *\n * Tiles hold content and can span one or more cells vertically or horizontally.\n *\n * ### Responsive Attributes\n *\n * The `md-grid-list` directive supports \"responsive\" attributes, which allow\n * different `md-cols`, `md-gutter` and `md-row-height` values depending on the\n * currently matching media query.\n *\n * In order to set a responsive attribute, first define the fallback value with\n * the standard attribute name, then add additional attributes with the\n * following convention: `{base-attribute-name}-{media-query-name}=\"{value}\"`\n * (ie. `md-cols-lg=\"8\"`)\n *\n * @param {number} md-cols Number of columns in the grid.\n * @param {string} md-row-height One of\n * <ul>\n *   <li>CSS length - Fixed height rows (eg. `8px` or `1rem`)</li>\n *   <li>`{width}:{height}` - Ratio of width to height (eg.\n *   `md-row-height=\"16:9\"`)</li>\n *   <li>`\"fit\"` - Height will be determined by subdividing the available\n *   height by the number of rows</li>\n * </ul>\n * @param {string=} md-gutter The amount of space between tiles in CSS units\n *     (default 1px)\n * @param {expression=} md-on-layout Expression to evaluate after layout. Event\n *     object is available as `$event`, and contains performance information.\n *\n * @usage\n * Basic:\n * <hljs lang=\"html\">\n * <md-grid-list md-cols=\"5\" md-gutter=\"1em\" md-row-height=\"4:3\">\n *   <md-grid-tile></md-grid-tile>\n * </md-grid-list>\n * </hljs>\n *\n * Fixed-height rows:\n * <hljs lang=\"html\">\n * <md-grid-list md-cols=\"4\" md-row-height=\"200px\" ...>\n *   <md-grid-tile></md-grid-tile>\n * </md-grid-list>\n * </hljs>\n *\n * Fit rows:\n * <hljs lang=\"html\">\n * <md-grid-list md-cols=\"4\" md-row-height=\"fit\" style=\"height: 400px;\" ...>\n *   <md-grid-tile></md-grid-tile>\n * </md-grid-list>\n * </hljs>\n *\n * Using responsive attributes:\n * <hljs lang=\"html\">\n * <md-grid-list\n *     md-cols-sm=\"2\"\n *     md-cols-md=\"4\"\n *     md-cols-lg=\"8\"\n *     md-cols-gt-lg=\"12\"\n *     ...>\n *   <md-grid-tile></md-grid-tile>\n * </md-grid-list>\n * </hljs>\n */\nfunction GridListDirective($interpolate, $mdConstant, $mdGridLayout, $mdMedia) {\n  return {\n    restrict: 'E',\n    controller: GridListController,\n    scope: {\n      mdOnLayout: '&'\n    },\n    link: postLink\n  };\n\n  function postLink(scope, element, attrs, ctrl) {\n    element.addClass('_md');     // private md component indicator for styling\n    \n    // Apply semantics\n    element.attr('role', 'list');\n\n    // Provide the controller with a way to trigger layouts.\n    ctrl.layoutDelegate = layoutDelegate;\n\n    var invalidateLayout = angular.bind(ctrl, ctrl.invalidateLayout),\n        unwatchAttrs = watchMedia();\n      scope.$on('$destroy', unwatchMedia);\n\n    /**\n     * Watches for changes in media, invalidating layout as necessary.\n     */\n    function watchMedia() {\n      for (var mediaName in $mdConstant.MEDIA) {\n        $mdMedia(mediaName); // initialize\n        $mdMedia.getQuery($mdConstant.MEDIA[mediaName])\n            .addListener(invalidateLayout);\n      }\n      return $mdMedia.watchResponsiveAttributes(\n          ['md-cols', 'md-row-height', 'md-gutter'], attrs, layoutIfMediaMatch);\n    }\n\n    function unwatchMedia() {\n      ctrl.layoutDelegate = angular.noop;\n\n      unwatchAttrs();\n      for (var mediaName in $mdConstant.MEDIA) {\n        $mdMedia.getQuery($mdConstant.MEDIA[mediaName])\n            .removeListener(invalidateLayout);\n      }\n    }\n\n    /**\n     * Performs grid layout if the provided mediaName matches the currently\n     * active media type.\n     */\n    function layoutIfMediaMatch(mediaName) {\n      if (mediaName == null) {\n        // TODO(shyndman): It would be nice to only layout if we have\n        // instances of attributes using this media type\n        ctrl.invalidateLayout();\n      } else if ($mdMedia(mediaName)) {\n        ctrl.invalidateLayout();\n      }\n    }\n\n    var lastLayoutProps;\n\n    /**\n     * Invokes the layout engine, and uses its results to lay out our\n     * tile elements.\n     *\n     * @param {boolean} tilesInvalidated Whether tiles have been\n     *    added/removed/moved since the last layout. This is to avoid situations\n     *    where tiles are replaced with properties identical to their removed\n     *    counterparts.\n     */\n    function layoutDelegate(tilesInvalidated) {\n      var tiles = getTileElements();\n      var props = {\n        tileSpans: getTileSpans(tiles),\n        colCount: getColumnCount(),\n        rowMode: getRowMode(),\n        rowHeight: getRowHeight(),\n        gutter: getGutter()\n      };\n\n      if (!tilesInvalidated && angular.equals(props, lastLayoutProps)) {\n        return;\n      }\n\n      var performance =\n        $mdGridLayout(props.colCount, props.tileSpans, tiles)\n          .map(function(tilePositions, rowCount) {\n            return {\n              grid: {\n                element: element,\n                style: getGridStyle(props.colCount, rowCount,\n                    props.gutter, props.rowMode, props.rowHeight)\n              },\n              tiles: tilePositions.map(function(ps, i) {\n                return {\n                  element: angular.element(tiles[i]),\n                  style: getTileStyle(ps.position, ps.spans,\n                      props.colCount, rowCount,\n                      props.gutter, props.rowMode, props.rowHeight)\n                }\n              })\n            }\n          })\n          .reflow()\n          .performance();\n\n      // Report layout\n      scope.mdOnLayout({\n        $event: {\n          performance: performance\n        }\n      });\n\n      lastLayoutProps = props;\n    }\n\n    // Use $interpolate to do some simple string interpolation as a convenience.\n\n    var startSymbol = $interpolate.startSymbol();\n    var endSymbol = $interpolate.endSymbol();\n\n    // Returns an expression wrapped in the interpolator's start and end symbols.\n    function expr(exprStr) {\n      return startSymbol + exprStr + endSymbol;\n    }\n\n    // The amount of space a single 1x1 tile would take up (either width or height), used as\n    // a basis for other calculations. This consists of taking the base size percent (as would be\n    // if evenly dividing the size between cells), and then subtracting the size of one gutter.\n    // However, since there are no gutters on the edges, each tile only uses a fration\n    // (gutterShare = numGutters / numCells) of the gutter size. (Imagine having one gutter per\n    // tile, and then breaking up the extra gutter on the edge evenly among the cells).\n    var UNIT = $interpolate(expr('share') + '% - (' + expr('gutter') + ' * ' + expr('gutterShare') + ')');\n\n    // The horizontal or vertical position of a tile, e.g., the 'top' or 'left' property value.\n    // The position comes the size of a 1x1 tile plus gutter for each previous tile in the\n    // row/column (offset).\n    var POSITION  = $interpolate('calc((' + expr('unit') + ' + ' + expr('gutter') + ') * ' + expr('offset') + ')');\n\n    // The actual size of a tile, e.g., width or height, taking rowSpan or colSpan into account.\n    // This is computed by multiplying the base unit by the rowSpan/colSpan, and then adding back\n    // in the space that the gutter would normally have used (which was already accounted for in\n    // the base unit calculation).\n    var DIMENSION = $interpolate('calc((' + expr('unit') + ') * ' + expr('span') + ' + (' + expr('span') + ' - 1) * ' + expr('gutter') + ')');\n\n    /**\n     * Gets the styles applied to a tile element described by the given parameters.\n     * @param {{row: number, col: number}} position The row and column indices of the tile.\n     * @param {{row: number, col: number}} spans The rowSpan and colSpan of the tile.\n     * @param {number} colCount The number of columns.\n     * @param {number} rowCount The number of rows.\n     * @param {string} gutter The amount of space between tiles. This will be something like\n     *     '5px' or '2em'.\n     * @param {string} rowMode The row height mode. Can be one of:\n     *     'fixed': all rows have a fixed size, given by rowHeight,\n     *     'ratio': row height defined as a ratio to width, or\n     *     'fit': fit to the grid-list element height, divinding evenly among rows.\n     * @param {string|number} rowHeight The height of a row. This is only used for 'fixed' mode and\n     *     for 'ratio' mode. For 'ratio' mode, this is the *ratio* of width-to-height (e.g., 0.75).\n     * @returns {Object} Map of CSS properties to be applied to the style element. Will define\n     *     values for top, left, width, height, marginTop, and paddingTop.\n     */\n    function getTileStyle(position, spans, colCount, rowCount, gutter, rowMode, rowHeight) {\n      // TODO(shyndman): There are style caching opportunities here.\n\n      // Percent of the available horizontal space that one column takes up.\n      var hShare = (1 / colCount) * 100;\n\n      // Fraction of the gutter size that each column takes up.\n      var hGutterShare = (colCount - 1) / colCount;\n\n      // Base horizontal size of a column.\n      var hUnit = UNIT({share: hShare, gutterShare: hGutterShare, gutter: gutter});\n\n      // The width and horizontal position of each tile is always calculated the same way, but the\n      // height and vertical position depends on the rowMode.\n      var ltr = document.dir != 'rtl' && document.body.dir != 'rtl';\n      var style = ltr ? {\n          left: POSITION({ unit: hUnit, offset: position.col, gutter: gutter }),\n          width: DIMENSION({ unit: hUnit, span: spans.col, gutter: gutter }),\n          // resets\n          paddingTop: '',\n          marginTop: '',\n          top: '',\n          height: ''\n        } : {\n        right: POSITION({ unit: hUnit, offset: position.col, gutter: gutter }),\n        width: DIMENSION({ unit: hUnit, span: spans.col, gutter: gutter }),\n        // resets\n        paddingTop: '',\n        marginTop: '',\n        top: '',\n        height: ''\n      };\n\n      switch (rowMode) {\n        case 'fixed':\n          // In fixed mode, simply use the given rowHeight.\n          style.top = POSITION({ unit: rowHeight, offset: position.row, gutter: gutter });\n          style.height = DIMENSION({ unit: rowHeight, span: spans.row, gutter: gutter });\n          break;\n\n        case 'ratio':\n          // Percent of the available vertical space that one row takes up. Here, rowHeight holds\n          // the ratio value. For example, if the width:height ratio is 4:3, rowHeight = 1.333.\n          var vShare = hShare / rowHeight;\n\n          // Base veritcal size of a row.\n          var vUnit = UNIT({ share: vShare, gutterShare: hGutterShare, gutter: gutter });\n\n          // padidngTop and marginTop are used to maintain the given aspect ratio, as\n          // a percentage-based value for these properties is applied to the *width* of the\n          // containing block. See http://www.w3.org/TR/CSS2/box.html#margin-properties\n          style.paddingTop = DIMENSION({ unit: vUnit, span: spans.row, gutter: gutter});\n          style.marginTop = POSITION({ unit: vUnit, offset: position.row, gutter: gutter });\n          break;\n\n        case 'fit':\n          // Fraction of the gutter size that each column takes up.\n          var vGutterShare = (rowCount - 1) / rowCount;\n\n          // Percent of the available vertical space that one row takes up.\n          var vShare = (1 / rowCount) * 100;\n\n          // Base vertical size of a row.\n          var vUnit = UNIT({share: vShare, gutterShare: vGutterShare, gutter: gutter});\n\n          style.top = POSITION({unit: vUnit, offset: position.row, gutter: gutter});\n          style.height = DIMENSION({unit: vUnit, span: spans.row, gutter: gutter});\n          break;\n      }\n\n      return style;\n    }\n\n    function getGridStyle(colCount, rowCount, gutter, rowMode, rowHeight) {\n      var style = {};\n\n      switch(rowMode) {\n        case 'fixed':\n          style.height = DIMENSION({ unit: rowHeight, span: rowCount, gutter: gutter });\n          style.paddingBottom = '';\n          break;\n\n        case 'ratio':\n          // rowHeight is width / height\n          var hGutterShare = colCount === 1 ? 0 : (colCount - 1) / colCount,\n              hShare = (1 / colCount) * 100,\n              vShare = hShare * (1 / rowHeight),\n              vUnit = UNIT({ share: vShare, gutterShare: hGutterShare, gutter: gutter });\n\n          style.height = '';\n          style.paddingBottom = DIMENSION({ unit: vUnit, span: rowCount, gutter: gutter});\n          break;\n\n        case 'fit':\n          // noop, as the height is user set\n          break;\n      }\n\n      return style;\n    }\n\n    function getTileElements() {\n      return [].filter.call(element.children(), function(ele) {\n        return ele.tagName == 'MD-GRID-TILE' && !ele.$$mdDestroyed;\n      });\n    }\n\n    /**\n     * Gets an array of objects containing the rowspan and colspan for each tile.\n     * @returns {Array<{row: number, col: number}>}\n     */\n    function getTileSpans(tileElements) {\n      return [].map.call(tileElements, function(ele) {\n        var ctrl = angular.element(ele).controller('mdGridTile');\n        return {\n          row: parseInt(\n              $mdMedia.getResponsiveAttribute(ctrl.$attrs, 'md-rowspan'), 10) || 1,\n          col: parseInt(\n              $mdMedia.getResponsiveAttribute(ctrl.$attrs, 'md-colspan'), 10) || 1\n        };\n      });\n    }\n\n    function getColumnCount() {\n      var colCount = parseInt($mdMedia.getResponsiveAttribute(attrs, 'md-cols'), 10);\n      if (isNaN(colCount)) {\n        throw 'md-grid-list: md-cols attribute was not found, or contained a non-numeric value';\n      }\n      return colCount;\n    }\n\n    function getGutter() {\n      return applyDefaultUnit($mdMedia.getResponsiveAttribute(attrs, 'md-gutter') || 1);\n    }\n\n    function getRowHeight() {\n      var rowHeight = $mdMedia.getResponsiveAttribute(attrs, 'md-row-height');\n      if (!rowHeight) {\n        throw 'md-grid-list: md-row-height attribute was not found';\n      }\n\n      switch (getRowMode()) {\n        case 'fixed':\n          return applyDefaultUnit(rowHeight);\n        case 'ratio':\n          var whRatio = rowHeight.split(':');\n          return parseFloat(whRatio[0]) / parseFloat(whRatio[1]);\n        case 'fit':\n          return 0; // N/A\n      }\n    }\n\n    function getRowMode() {\n      var rowHeight = $mdMedia.getResponsiveAttribute(attrs, 'md-row-height');\n      if (!rowHeight) {\n        throw 'md-grid-list: md-row-height attribute was not found';\n      }\n\n      if (rowHeight == 'fit') {\n        return 'fit';\n      } else if (rowHeight.indexOf(':') !== -1) {\n        return 'ratio';\n      } else {\n        return 'fixed';\n      }\n    }\n\n    function applyDefaultUnit(val) {\n      return /\\D$/.test(val) ? val : val + 'px';\n    }\n  }\n}\n\n/* @ngInject */\nfunction GridListController($mdUtil) {\n  this.layoutInvalidated = false;\n  this.tilesInvalidated = false;\n  this.$timeout_ = $mdUtil.nextTick;\n  this.layoutDelegate = angular.noop;\n}\n\nGridListController.prototype = {\n  invalidateTiles: function() {\n    this.tilesInvalidated = true;\n    this.invalidateLayout();\n  },\n\n  invalidateLayout: function() {\n    if (this.layoutInvalidated) {\n      return;\n    }\n    this.layoutInvalidated = true;\n    this.$timeout_(angular.bind(this, this.layout));\n  },\n\n  layout: function() {\n    try {\n      this.layoutDelegate(this.tilesInvalidated);\n    } finally {\n      this.layoutInvalidated = false;\n      this.tilesInvalidated = false;\n    }\n  }\n};\n\n\n/* @ngInject */\nfunction GridLayoutFactory($mdUtil) {\n  var defaultAnimator = GridTileAnimator;\n\n  /**\n   * Set the reflow animator callback\n   */\n  GridLayout.animateWith = function(customAnimator) {\n    defaultAnimator = !angular.isFunction(customAnimator) ? GridTileAnimator : customAnimator;\n  };\n\n  return GridLayout;\n\n  /**\n   * Publish layout function\n   */\n  function GridLayout(colCount, tileSpans) {\n      var self, layoutInfo, gridStyles, layoutTime, mapTime, reflowTime;\n\n      layoutTime = $mdUtil.time(function() {\n        layoutInfo = calculateGridFor(colCount, tileSpans);\n      });\n\n      return self = {\n\n        /**\n         * An array of objects describing each tile's position in the grid.\n         */\n        layoutInfo: function() {\n          return layoutInfo;\n        },\n\n        /**\n         * Maps grid positioning to an element and a set of styles using the\n         * provided updateFn.\n         */\n        map: function(updateFn) {\n          mapTime = $mdUtil.time(function() {\n            var info = self.layoutInfo();\n            gridStyles = updateFn(info.positioning, info.rowCount);\n          });\n          return self;\n        },\n\n        /**\n         * Default animator simply sets the element.css( <styles> ). An alternate\n         * animator can be provided as an argument. The function has the following\n         * signature:\n         *\n         *    function({grid: {element: JQLite, style: Object}, tiles: Array<{element: JQLite, style: Object}>)\n         */\n        reflow: function(animatorFn) {\n          reflowTime = $mdUtil.time(function() {\n            var animator = animatorFn || defaultAnimator;\n            animator(gridStyles.grid, gridStyles.tiles);\n          });\n          return self;\n        },\n\n        /**\n         * Timing for the most recent layout run.\n         */\n        performance: function() {\n          return {\n            tileCount: tileSpans.length,\n            layoutTime: layoutTime,\n            mapTime: mapTime,\n            reflowTime: reflowTime,\n            totalTime: layoutTime + mapTime + reflowTime\n          };\n        }\n      };\n    }\n\n  /**\n   * Default Gridlist animator simple sets the css for each element;\n   * NOTE: any transitions effects must be manually set in the CSS.\n   * e.g.\n   *\n   *  md-grid-tile {\n   *    transition: all 700ms ease-out 50ms;\n   *  }\n   *\n   */\n  function GridTileAnimator(grid, tiles) {\n    grid.element.css(grid.style);\n    tiles.forEach(function(t) {\n      t.element.css(t.style);\n    })\n  }\n\n  /**\n   * Calculates the positions of tiles.\n   *\n   * The algorithm works as follows:\n   *    An Array<Number> with length colCount (spaceTracker) keeps track of\n   *    available tiling positions, where elements of value 0 represents an\n   *    empty position. Space for a tile is reserved by finding a sequence of\n   *    0s with length <= than the tile's colspan. When such a space has been\n   *    found, the occupied tile positions are incremented by the tile's\n   *    rowspan value, as these positions have become unavailable for that\n   *    many rows.\n   *\n   *    If the end of a row has been reached without finding space for the\n   *    tile, spaceTracker's elements are each decremented by 1 to a minimum\n   *    of 0. Rows are searched in this fashion until space is found.\n   */\n  function calculateGridFor(colCount, tileSpans) {\n    var curCol = 0,\n        curRow = 0,\n        spaceTracker = newSpaceTracker();\n\n    return {\n      positioning: tileSpans.map(function(spans, i) {\n        return {\n          spans: spans,\n          position: reserveSpace(spans, i)\n        };\n      }),\n      rowCount: curRow + Math.max.apply(Math, spaceTracker)\n    };\n\n    function reserveSpace(spans, i) {\n      if (spans.col > colCount) {\n        throw 'md-grid-list: Tile at position ' + i + ' has a colspan ' +\n            '(' + spans.col + ') that exceeds the column count ' +\n            '(' + colCount + ')';\n      }\n\n      var start = 0,\n          end = 0;\n\n      // TODO(shyndman): This loop isn't strictly necessary if you can\n      // determine the minimum number of rows before a space opens up. To do\n      // this, recognize that you've iterated across an entire row looking for\n      // space, and if so fast-forward by the minimum rowSpan count. Repeat\n      // until the required space opens up.\n      while (end - start < spans.col) {\n        if (curCol >= colCount) {\n          nextRow();\n          continue;\n        }\n\n        start = spaceTracker.indexOf(0, curCol);\n        if (start === -1 || (end = findEnd(start + 1)) === -1) {\n          start = end = 0;\n          nextRow();\n          continue;\n        }\n\n        curCol = end + 1;\n      }\n\n      adjustRow(start, spans.col, spans.row);\n      curCol = start + spans.col;\n\n      return {\n        col: start,\n        row: curRow\n      };\n    }\n\n    function nextRow() {\n      curCol = 0;\n      curRow++;\n      adjustRow(0, colCount, -1); // Decrement row spans by one\n    }\n\n    function adjustRow(from, cols, by) {\n      for (var i = from; i < from + cols; i++) {\n        spaceTracker[i] = Math.max(spaceTracker[i] + by, 0);\n      }\n    }\n\n    function findEnd(start) {\n      var i;\n      for (i = start; i < spaceTracker.length; i++) {\n        if (spaceTracker[i] !== 0) {\n          return i;\n        }\n      }\n\n      if (i === spaceTracker.length) {\n        return i;\n      }\n    }\n\n    function newSpaceTracker() {\n      var tracker = [];\n      for (var i = 0; i < colCount; i++) {\n        tracker.push(0);\n      }\n      return tracker;\n    }\n  }\n}\n\n/**\n * @ngdoc directive\n * @name mdGridTile\n * @module material.components.gridList\n * @restrict E\n * @description\n * Tiles contain the content of an `md-grid-list`. They span one or more grid\n * cells vertically or horizontally, and use `md-grid-tile-{footer,header}` to\n * display secondary content.\n *\n * ### Responsive Attributes\n *\n * The `md-grid-tile` directive supports \"responsive\" attributes, which allow\n * different `md-rowspan` and `md-colspan` values depending on the currently\n * matching media query.\n *\n * In order to set a responsive attribute, first define the fallback value with\n * the standard attribute name, then add additional attributes with the\n * following convention: `{base-attribute-name}-{media-query-name}=\"{value}\"`\n * (ie. `md-colspan-sm=\"4\"`)\n *\n * @param {number=} md-colspan The number of columns to span (default 1). Cannot\n *    exceed the number of columns in the grid. Supports interpolation.\n * @param {number=} md-rowspan The number of rows to span (default 1). Supports\n *     interpolation.\n *\n * @usage\n * With header:\n * <hljs lang=\"html\">\n * <md-grid-tile>\n *   <md-grid-tile-header>\n *     <h3>This is a header</h3>\n *   </md-grid-tile-header>\n * </md-grid-tile>\n * </hljs>\n *\n * With footer:\n * <hljs lang=\"html\">\n * <md-grid-tile>\n *   <md-grid-tile-footer>\n *     <h3>This is a footer</h3>\n *   </md-grid-tile-footer>\n * </md-grid-tile>\n * </hljs>\n *\n * Spanning multiple rows/columns:\n * <hljs lang=\"html\">\n * <md-grid-tile md-colspan=\"2\" md-rowspan=\"3\">\n * </md-grid-tile>\n * </hljs>\n *\n * Responsive attributes:\n * <hljs lang=\"html\">\n * <md-grid-tile md-colspan=\"1\" md-colspan-sm=\"3\" md-colspan-md=\"5\">\n * </md-grid-tile>\n * </hljs>\n */\nfunction GridTileDirective($mdMedia) {\n  return {\n    restrict: 'E',\n    require: '^mdGridList',\n    template: '<figure ng-transclude></figure>',\n    transclude: true,\n    scope: {},\n    // Simple controller that exposes attributes to the grid directive\n    controller: [\"$attrs\", function($attrs) {\n      this.$attrs = $attrs;\n    }],\n    link: postLink\n  };\n\n  function postLink(scope, element, attrs, gridCtrl) {\n    // Apply semantics\n    element.attr('role', 'listitem');\n\n    // If our colspan or rowspan changes, trigger a layout\n    var unwatchAttrs = $mdMedia.watchResponsiveAttributes(['md-colspan', 'md-rowspan'],\n        attrs, angular.bind(gridCtrl, gridCtrl.invalidateLayout));\n\n    // Tile registration/deregistration\n    gridCtrl.invalidateTiles();\n    scope.$on('$destroy', function() {\n      // Mark the tile as destroyed so it is no longer considered in layout,\n      // even if the DOM element sticks around (like during a leave animation)\n      element[0].$$mdDestroyed = true;\n      unwatchAttrs();\n      gridCtrl.invalidateLayout();\n    });\n\n    if (angular.isDefined(scope.$parent.$index)) {\n      scope.$watch(function() { return scope.$parent.$index; },\n        function indexChanged(newIdx, oldIdx) {\n          if (newIdx === oldIdx) {\n            return;\n          }\n          gridCtrl.invalidateTiles();\n        });\n    }\n  }\n}\n\n\nfunction GridTileCaptionDirective() {\n  return {\n    template: '<figcaption ng-transclude></figcaption>',\n    transclude: true\n  };\n}\n\n})();\n(function(){\n\"use strict\";\n\n/**\n * @ngdoc module\n * @name material.components.icon\n * @description\n * Icon\n */\nangular.module('material.components.icon', ['material.core']);\n\n})();\n(function(){\n\"use strict\";\n\n/**\n * @ngdoc module\n * @name material.components.input\n */\nmdInputContainerDirective.$inject = [\"$mdTheming\", \"$parse\"];\ninputTextareaDirective.$inject = [\"$mdUtil\", \"$window\", \"$mdAria\", \"$timeout\", \"$mdGesture\"];\nmdMaxlengthDirective.$inject = [\"$animate\", \"$mdUtil\"];\nplaceholderDirective.$inject = [\"$compile\"];\nngMessageDirective.$inject = [\"$mdUtil\"];\nmdSelectOnFocusDirective.$inject = [\"$timeout\"];\nmdInputInvalidMessagesAnimation.$inject = [\"$$AnimateRunner\", \"$animateCss\", \"$mdUtil\", \"$log\"];\nngMessagesAnimation.$inject = [\"$$AnimateRunner\", \"$animateCss\", \"$mdUtil\", \"$log\"];\nngMessageAnimation.$inject = [\"$$AnimateRunner\", \"$animateCss\", \"$mdUtil\", \"$log\"];\nvar inputModule = angular.module('material.components.input', [\n    'material.core'\n  ])\n  .directive('mdInputContainer', mdInputContainerDirective)\n  .directive('label', labelDirective)\n  .directive('input', inputTextareaDirective)\n  .directive('textarea', inputTextareaDirective)\n  .directive('mdMaxlength', mdMaxlengthDirective)\n  .directive('placeholder', placeholderDirective)\n  .directive('ngMessages', ngMessagesDirective)\n  .directive('ngMessage', ngMessageDirective)\n  .directive('ngMessageExp', ngMessageDirective)\n  .directive('mdSelectOnFocus', mdSelectOnFocusDirective)\n\n  .animation('.md-input-invalid', mdInputInvalidMessagesAnimation)\n  .animation('.md-input-messages-animation', ngMessagesAnimation)\n  .animation('.md-input-message-animation', ngMessageAnimation);\n\n// If we are running inside of tests; expose some extra services so that we can test them\nif (window._mdMocksIncluded) {\n  inputModule.service('$$mdInput', function() {\n    return {\n      // special accessor to internals... useful for testing\n      messages: {\n        show        : showInputMessages,\n        hide        : hideInputMessages,\n        getElement  : getMessagesElement\n      }\n    }\n  })\n\n  // Register a service for each animation so that we can easily inject them into unit tests\n  .service('mdInputInvalidAnimation', mdInputInvalidMessagesAnimation)\n  .service('mdInputMessagesAnimation', ngMessagesAnimation)\n  .service('mdInputMessageAnimation', ngMessageAnimation);\n}\n\n/**\n * @ngdoc directive\n * @name mdInputContainer\n * @module material.components.input\n *\n * @restrict E\n *\n * @description\n * `<md-input-container>` is the parent of any input or textarea element.\n *\n * Input and textarea elements will not behave properly unless the md-input-container\n * parent is provided.\n *\n * A single `<md-input-container>` should contain only one `<input>` element, otherwise it will throw an error.\n *\n * <b>Exception:</b> Hidden inputs (`<input type=\"hidden\" />`) are ignored and will not throw an error, so\n * you may combine these with other inputs.\n *\n * <b>Note:</b> When using `ngMessages` with your input element, make sure the message and container elements\n * are *block* elements, otherwise animations applied to the messages will not look as intended. Either use a `div` and\n * apply the `ng-message` and `ng-messages` classes respectively, or use the `md-block` class on your element.\n *\n * @param md-is-error {expression=} When the given expression evaluates to true, the input container\n *   will go into error state. Defaults to erroring if the input has been touched and is invalid.\n * @param md-no-float {boolean=} When present, `placeholder` attributes on the input will not be converted to floating\n *   labels.\n *\n * @usage\n * <hljs lang=\"html\">\n *\n * <md-input-container>\n *   <label>Username</label>\n *   <input type=\"text\" ng-model=\"user.name\">\n * </md-input-container>\n *\n * <md-input-container>\n *   <label>Description</label>\n *   <textarea ng-model=\"user.description\"></textarea>\n * </md-input-container>\n *\n * </hljs>\n *\n * <h3>When disabling floating labels</h3>\n * <hljs lang=\"html\">\n *\n * <md-input-container md-no-float>\n *   <input type=\"text\" placeholder=\"Non-Floating Label\">\n * </md-input-container>\n *\n * </hljs>\n */\nfunction mdInputContainerDirective($mdTheming, $parse) {\n\n  ContainerCtrl.$inject = [\"$scope\", \"$element\", \"$attrs\", \"$animate\"];\n  var INPUT_TAGS = ['INPUT', 'TEXTAREA', 'SELECT', 'MD-SELECT'];\n\n  var LEFT_SELECTORS = INPUT_TAGS.reduce(function(selectors, isel) {\n    return selectors.concat(['md-icon ~ ' + isel, '.md-icon ~ ' + isel]);\n  }, []).join(\",\");\n\n  var RIGHT_SELECTORS = INPUT_TAGS.reduce(function(selectors, isel) {\n    return selectors.concat([isel + ' ~ md-icon', isel + ' ~ .md-icon']);\n  }, []).join(\",\");\n\n  return {\n    restrict: 'E',\n    compile: compile,\n    controller: ContainerCtrl\n  };\n\n  function compile(tElement) {\n    // Check for both a left & right icon\n    var leftIcon = tElement[0].querySelector(LEFT_SELECTORS);\n    var rightIcon = tElement[0].querySelector(RIGHT_SELECTORS);\n\n    if (leftIcon) { tElement.addClass('md-icon-left'); }\n    if (rightIcon) { tElement.addClass('md-icon-right'); }\n\n    return function postLink(scope, element) {\n      $mdTheming(element);\n    };\n  }\n\n  function ContainerCtrl($scope, $element, $attrs, $animate) {\n    var self = this;\n\n    self.isErrorGetter = $attrs.mdIsError && $parse($attrs.mdIsError);\n\n    self.delegateClick = function() {\n      self.input.focus();\n    };\n    self.element = $element;\n    self.setFocused = function(isFocused) {\n      $element.toggleClass('md-input-focused', !!isFocused);\n    };\n    self.setHasValue = function(hasValue) {\n      $element.toggleClass('md-input-has-value', !!hasValue);\n    };\n    self.setHasPlaceholder = function(hasPlaceholder) {\n      $element.toggleClass('md-input-has-placeholder', !!hasPlaceholder);\n    };\n    self.setInvalid = function(isInvalid) {\n      if (isInvalid) {\n        $animate.addClass($element, 'md-input-invalid');\n      } else {\n        $animate.removeClass($element, 'md-input-invalid');\n      }\n    };\n    $scope.$watch(function() {\n      return self.label && self.input;\n    }, function(hasLabelAndInput) {\n      if (hasLabelAndInput && !self.label.attr('for')) {\n        self.label.attr('for', self.input.attr('id'));\n      }\n    });\n  }\n}\n\nfunction labelDirective() {\n  return {\n    restrict: 'E',\n    require: '^?mdInputContainer',\n    link: function(scope, element, attr, containerCtrl) {\n      if (!containerCtrl || attr.mdNoFloat || element.hasClass('md-container-ignore')) return;\n\n      containerCtrl.label = element;\n      scope.$on('$destroy', function() {\n        containerCtrl.label = null;\n      });\n    }\n  };\n}\n\n/**\n * @ngdoc directive\n * @name mdInput\n * @restrict E\n * @module material.components.input\n *\n * @description\n * You can use any `<input>` or `<textarea>` element as a child of an `<md-input-container>`. This\n * allows you to build complex forms for data entry.\n *\n * When the input is required and uses a floating label, then the label will automatically contain\n * an asterisk (`*`).<br/>\n * This behavior can be disabled by using the `md-no-asterisk` attribute.\n *\n * @param {number=} md-maxlength The maximum number of characters allowed in this input. If this is\n *   specified, a character counter will be shown underneath the input.<br/><br/>\n *   The purpose of **`md-maxlength`** is exactly to show the max length counter text. If you don't\n *   want the counter text and only need \"plain\" validation, you can use the \"simple\" `ng-maxlength`\n *   or maxlength attributes.<br/><br/>\n *   **Note:** Only valid for text/string inputs (not numeric).\n *\n * @param {string=} aria-label Aria-label is required when no label is present.  A warning message\n *   will be logged in the console if not present.\n * @param {string=} placeholder An alternative approach to using aria-label when the label is not\n *   PRESENT. The placeholder text is copied to the aria-label attribute.\n * @param md-no-autogrow {boolean=} When present, textareas will not grow automatically.\n * @param md-no-asterisk {boolean=} When present, an asterisk will not be appended to the inputs floating label\n * @param md-no-resize {boolean=} Disables the textarea resize handle.\n * @param {number=} max-rows The maximum amount of rows for a textarea.\n * @param md-detect-hidden {boolean=} When present, textareas will be sized properly when they are\n *   revealed after being hidden. This is off by default for performance reasons because it\n *   guarantees a reflow every digest cycle.\n *\n * @usage\n * <hljs lang=\"html\">\n * <md-input-container>\n *   <label>Color</label>\n *   <input type=\"text\" ng-model=\"color\" required md-maxlength=\"10\">\n * </md-input-container>\n * </hljs>\n *\n * <h3>With Errors</h3>\n *\n * `md-input-container` also supports errors using the standard `ng-messages` directives and\n * animates the messages when they become visible using from the `ngEnter`/`ngLeave` events or\n * the `ngShow`/`ngHide` events.\n *\n * By default, the messages will be hidden until the input is in an error state. This is based off\n * of the `md-is-error` expression of the `md-input-container`. This gives the user a chance to\n * fill out the form before the errors become visible.\n *\n * <hljs lang=\"html\">\n * <form name=\"colorForm\">\n *   <md-input-container>\n *     <label>Favorite Color</label>\n *     <input name=\"favoriteColor\" ng-model=\"favoriteColor\" required>\n *     <div ng-messages=\"colorForm.favoriteColor.$error\">\n *       <div ng-message=\"required\">This is required!</div>\n *     </div>\n *   </md-input-container>\n * </form>\n * </hljs>\n *\n * We automatically disable this auto-hiding functionality if you provide any of the following\n * visibility directives on the `ng-messages` container:\n *\n *  - `ng-if`\n *  - `ng-show`/`ng-hide`\n *  - `ng-switch-when`/`ng-switch-default`\n *\n * You can also disable this functionality manually by adding the `md-auto-hide=\"false\"` expression\n * to the `ng-messages` container. This may be helpful if you always want to see the error messages\n * or if you are building your own visibilty directive.\n *\n * _<b>Note:</b> The `md-auto-hide` attribute is a static string that is  only checked upon\n * initialization of the `ng-messages` directive to see if it equals the string `false`._\n *\n * <hljs lang=\"html\">\n * <form name=\"userForm\">\n *   <md-input-container>\n *     <label>Last Name</label>\n *     <input name=\"lastName\" ng-model=\"lastName\" required md-maxlength=\"10\" minlength=\"4\">\n *     <div ng-messages=\"userForm.lastName.$error\" ng-show=\"userForm.lastName.$dirty\">\n *       <div ng-message=\"required\">This is required!</div>\n *       <div ng-message=\"md-maxlength\">That's too long!</div>\n *       <div ng-message=\"minlength\">That's too short!</div>\n *     </div>\n *   </md-input-container>\n *   <md-input-container>\n *     <label>Biography</label>\n *     <textarea name=\"bio\" ng-model=\"biography\" required md-maxlength=\"150\"></textarea>\n *     <div ng-messages=\"userForm.bio.$error\" ng-show=\"userForm.bio.$dirty\">\n *       <div ng-message=\"required\">This is required!</div>\n *       <div ng-message=\"md-maxlength\">That's too long!</div>\n *     </div>\n *   </md-input-container>\n *   <md-input-container>\n *     <input aria-label='title' ng-model='title'>\n *   </md-input-container>\n *   <md-input-container>\n *     <input placeholder='title' ng-model='title'>\n *   </md-input-container>\n * </form>\n * </hljs>\n *\n * <h3>Notes</h3>\n *\n * - Requires [ngMessages](https://docs.angularjs.org/api/ngMessages).\n * - Behaves like the [AngularJS input directive](https://docs.angularjs.org/api/ng/directive/input).\n *\n * The `md-input` and `md-input-container` directives use very specific positioning to achieve the\n * error animation effects. Therefore, it is *not* advised to use the Layout system inside of the\n * `<md-input-container>` tags. Instead, use relative or absolute positioning.\n *\n *\n * <h3>Textarea directive</h3>\n * The `textarea` element within a `md-input-container` has the following specific behavior:\n * - By default the `textarea` grows as the user types. This can be disabled via the `md-no-autogrow`\n * attribute.\n * - If a `textarea` has the `rows` attribute, it will treat the `rows` as the minimum height and will\n * continue growing as the user types. For example a textarea with `rows=\"3\"` will be 3 lines of text\n * high initially. If no rows are specified, the directive defaults to 1.\n * - The textarea's height gets set on initialization, as well as while the user is typing. In certain situations\n * (e.g. while animating) the directive might have been initialized, before the element got it's final height. In\n * those cases, you can trigger a resize manually by broadcasting a `md-resize-textarea` event on the scope.\n * - If you want a `textarea` to stop growing at a certain point, you can specify the `max-rows` attribute.\n * - The textarea's bottom border acts as a handle which users can drag, in order to resize the element vertically.\n * Once the user has resized a `textarea`, the autogrowing functionality becomes disabled. If you don't want a\n * `textarea` to be resizeable by the user, you can add the `md-no-resize` attribute.\n */\n\nfunction inputTextareaDirective($mdUtil, $window, $mdAria, $timeout, $mdGesture) {\n  return {\n    restrict: 'E',\n    require: ['^?mdInputContainer', '?ngModel', '?^form'],\n    link: postLink\n  };\n\n  function postLink(scope, element, attr, ctrls) {\n\n    var containerCtrl = ctrls[0];\n    var hasNgModel = !!ctrls[1];\n    var ngModelCtrl = ctrls[1] || $mdUtil.fakeNgModel();\n    var parentForm = ctrls[2];\n    var isReadonly = angular.isDefined(attr.readonly);\n    var mdNoAsterisk = $mdUtil.parseAttributeBoolean(attr.mdNoAsterisk);\n    var tagName = element[0].tagName.toLowerCase();\n\n\n    if (!containerCtrl) return;\n    if (attr.type === 'hidden') {\n      element.attr('aria-hidden', 'true');\n      return;\n    } else if (containerCtrl.input) {\n      if (containerCtrl.input[0].contains(element[0])) {\n        return;\n      } else {\n        throw new Error(\"<md-input-container> can only have *one* <input>, <textarea> or <md-select> child element!\");\n      }\n    }\n    containerCtrl.input = element;\n\n    setupAttributeWatchers();\n\n    // Add an error spacer div after our input to provide space for the char counter and any ng-messages\n    var errorsSpacer = angular.element('<div class=\"md-errors-spacer\">');\n    element.after(errorsSpacer);\n\n    if (!containerCtrl.label) {\n      $mdAria.expect(element, 'aria-label', attr.placeholder);\n    }\n\n    element.addClass('md-input');\n    if (!element.attr('id')) {\n      element.attr('id', 'input_' + $mdUtil.nextUid());\n    }\n\n    // This works around a Webkit issue where number inputs, placed in a flexbox, that have\n    // a `min` and `max` will collapse to about 1/3 of their proper width. Please check #7349\n    // for more info. Also note that we don't override the `step` if the user has specified it,\n    // in order to prevent some unexpected behaviour.\n    if (tagName === 'input' && attr.type === 'number' && attr.min && attr.max && !attr.step) {\n      element.attr('step', 'any');\n    } else if (tagName === 'textarea') {\n      setupTextarea();\n    }\n\n    // If the input doesn't have an ngModel, it may have a static value. For that case,\n    // we have to do one initial check to determine if the container should be in the\n    // \"has a value\" state.\n    if (!hasNgModel) {\n      inputCheckValue();\n    }\n\n    var isErrorGetter = containerCtrl.isErrorGetter || function() {\n      return ngModelCtrl.$invalid && (ngModelCtrl.$touched || (parentForm && parentForm.$submitted));\n    };\n\n    scope.$watch(isErrorGetter, containerCtrl.setInvalid);\n\n    // When the developer uses the ngValue directive for the input, we have to observe the attribute, because\n    // AngularJS's ngValue directive is just setting the `value` attribute.\n    if (attr.ngValue) {\n      attr.$observe('value', inputCheckValue);\n    }\n\n    ngModelCtrl.$parsers.push(ngModelPipelineCheckValue);\n    ngModelCtrl.$formatters.push(ngModelPipelineCheckValue);\n\n    element.on('input', inputCheckValue);\n\n    if (!isReadonly) {\n      element\n        .on('focus', function(ev) {\n          $mdUtil.nextTick(function() {\n            containerCtrl.setFocused(true);\n          });\n        })\n        .on('blur', function(ev) {\n          $mdUtil.nextTick(function() {\n            containerCtrl.setFocused(false);\n            inputCheckValue();\n          });\n        });\n    }\n\n    scope.$on('$destroy', function() {\n      containerCtrl.setFocused(false);\n      containerCtrl.setHasValue(false);\n      containerCtrl.input = null;\n    });\n\n    /** Gets run through ngModel's pipeline and set the `has-value` class on the container. */\n    function ngModelPipelineCheckValue(arg) {\n      containerCtrl.setHasValue(!ngModelCtrl.$isEmpty(arg));\n      return arg;\n    }\n\n    function setupAttributeWatchers() {\n      if (containerCtrl.label) {\n        attr.$observe('required', function (value) {\n          // We don't need to parse the required value, it's always a boolean because of angular's\n          // required directive.\n          containerCtrl.label.toggleClass('md-required', value && !mdNoAsterisk);\n        });\n      }\n    }\n\n    function inputCheckValue() {\n      // An input's value counts if its length > 0,\n      // or if the input's validity state says it has bad input (eg string in a number input)\n      containerCtrl.setHasValue(element.val().length > 0 || (element[0].validity || {}).badInput);\n    }\n\n    function setupTextarea() {\n      var isAutogrowing = !attr.hasOwnProperty('mdNoAutogrow');\n\n      attachResizeHandle();\n\n      if (!isAutogrowing) return;\n\n      // Can't check if height was or not explicity set,\n      // so rows attribute will take precedence if present\n      var minRows = attr.hasOwnProperty('rows') ? parseInt(attr.rows) : NaN;\n      var maxRows = attr.hasOwnProperty('maxRows') ? parseInt(attr.maxRows) : NaN;\n      var scopeResizeListener = scope.$on('md-resize-textarea', growTextarea);\n      var lineHeight = null;\n      var node = element[0];\n\n      // This timeout is necessary, because the browser needs a little bit\n      // of time to calculate the `clientHeight` and `scrollHeight`.\n      $timeout(function() {\n        $mdUtil.nextTick(growTextarea);\n      }, 10, false);\n\n      // We could leverage ngModel's $parsers here, however it\n      // isn't reliable, because AngularJS trims the input by default,\n      // which means that growTextarea won't fire when newlines and\n      // spaces are added.\n      element.on('input', growTextarea);\n\n      // We should still use the $formatters, because they fire when\n      // the value was changed from outside the textarea.\n      if (hasNgModel) {\n        ngModelCtrl.$formatters.push(formattersListener);\n      }\n\n      if (!minRows) {\n        element.attr('rows', 1);\n      }\n\n      angular.element($window).on('resize', growTextarea);\n      scope.$on('$destroy', disableAutogrow);\n\n      function growTextarea() {\n        // temporarily disables element's flex so its height 'runs free'\n        element\n          .attr('rows', 1)\n          .css('height', 'auto')\n          .addClass('md-no-flex');\n\n        var height = getHeight();\n\n        if (!lineHeight) {\n          // offsetHeight includes padding which can throw off our value\n          var originalPadding = element[0].style.padding || '';\n          lineHeight = element.css('padding', 0).prop('offsetHeight');\n          element[0].style.padding = originalPadding;\n        }\n\n        if (minRows && lineHeight) {\n          height = Math.max(height, lineHeight * minRows);\n        }\n\n        if (maxRows && lineHeight) {\n          var maxHeight = lineHeight * maxRows;\n\n          if (maxHeight < height) {\n            element.attr('md-no-autogrow', '');\n            height = maxHeight;\n          } else {\n            element.removeAttr('md-no-autogrow');\n          }\n        }\n\n        if (lineHeight) {\n          element.attr('rows', Math.round(height / lineHeight));\n        }\n\n        element\n          .css('height', height + 'px')\n          .removeClass('md-no-flex');\n      }\n\n      function getHeight() {\n        var offsetHeight = node.offsetHeight;\n        var line = node.scrollHeight - offsetHeight;\n        return offsetHeight + Math.max(line, 0);\n      }\n\n      function formattersListener(value) {\n        $mdUtil.nextTick(growTextarea);\n        return value;\n      }\n\n      function disableAutogrow() {\n        if (!isAutogrowing) return;\n\n        isAutogrowing = false;\n        angular.element($window).off('resize', growTextarea);\n        scopeResizeListener && scopeResizeListener();\n        element\n          .attr('md-no-autogrow', '')\n          .off('input', growTextarea);\n\n        if (hasNgModel) {\n          var listenerIndex = ngModelCtrl.$formatters.indexOf(formattersListener);\n\n          if (listenerIndex > -1) {\n            ngModelCtrl.$formatters.splice(listenerIndex, 1);\n          }\n        }\n      }\n\n      function attachResizeHandle() {\n        if (attr.hasOwnProperty('mdNoResize')) return;\n\n        var handle = angular.element('<div class=\"md-resize-handle\"></div>');\n        var isDragging = false;\n        var dragStart = null;\n        var startHeight = 0;\n        var container = containerCtrl.element;\n        var dragGestureHandler = $mdGesture.register(handle, 'drag', { horizontal: false });\n\n\n        element.wrap('<div class=\"md-resize-wrapper\">').after(handle);\n        handle.on('mousedown', onMouseDown);\n\n        container\n          .on('$md.dragstart', onDragStart)\n          .on('$md.drag', onDrag)\n          .on('$md.dragend', onDragEnd);\n\n        scope.$on('$destroy', function() {\n          handle\n            .off('mousedown', onMouseDown)\n            .remove();\n\n          container\n            .off('$md.dragstart', onDragStart)\n            .off('$md.drag', onDrag)\n            .off('$md.dragend', onDragEnd);\n\n          dragGestureHandler();\n          handle = null;\n          container = null;\n          dragGestureHandler = null;\n        });\n\n        function onMouseDown(ev) {\n          ev.preventDefault();\n          isDragging = true;\n          dragStart = ev.clientY;\n          startHeight = parseFloat(element.css('height')) || element.prop('offsetHeight');\n        }\n\n        function onDragStart(ev) {\n          if (!isDragging) return;\n          ev.preventDefault();\n          disableAutogrow();\n          container.addClass('md-input-resized');\n        }\n\n        function onDrag(ev) {\n          if (!isDragging) return;\n\n          element.css('height', (startHeight + ev.pointer.distanceY) + 'px');\n        }\n\n        function onDragEnd(ev) {\n          if (!isDragging) return;\n          isDragging = false;\n          container.removeClass('md-input-resized');\n        }\n      }\n\n      // Attach a watcher to detect when the textarea gets shown.\n      if (attr.hasOwnProperty('mdDetectHidden')) {\n\n        var handleHiddenChange = function() {\n          var wasHidden = false;\n\n          return function() {\n            var isHidden = node.offsetHeight === 0;\n\n            if (isHidden === false && wasHidden === true) {\n              growTextarea();\n            }\n\n            wasHidden = isHidden;\n          };\n        }();\n\n        // Check every digest cycle whether the visibility of the textarea has changed.\n        // Queue up to run after the digest cycle is complete.\n        scope.$watch(function() {\n          $mdUtil.nextTick(handleHiddenChange, false);\n          return true;\n        });\n      }\n    }\n  }\n}\n\nfunction mdMaxlengthDirective($animate, $mdUtil) {\n  return {\n    restrict: 'A',\n    require: ['ngModel', '^mdInputContainer'],\n    link: postLink\n  };\n\n  function postLink(scope, element, attr, ctrls) {\n    var maxlength;\n    var ngModelCtrl = ctrls[0];\n    var containerCtrl = ctrls[1];\n    var charCountEl, errorsSpacer;\n\n    // Wait until the next tick to ensure that the input has setup the errors spacer where we will\n    // append our counter\n    $mdUtil.nextTick(function() {\n      errorsSpacer = angular.element(containerCtrl.element[0].querySelector('.md-errors-spacer'));\n      charCountEl = angular.element('<div class=\"md-char-counter\">');\n\n      // Append our character counter inside the errors spacer\n      errorsSpacer.append(charCountEl);\n\n      // Stop model from trimming. This makes it so whitespace\n      // over the maxlength still counts as invalid.\n      attr.$set('ngTrim', 'false');\n\n      scope.$watch(attr.mdMaxlength, function(value) {\n        maxlength = value;\n        if (angular.isNumber(value) && value > 0) {\n          if (!charCountEl.parent().length) {\n            $animate.enter(charCountEl, errorsSpacer);\n          }\n          renderCharCount();\n        } else {\n          $animate.leave(charCountEl);\n        }\n      });\n\n      ngModelCtrl.$validators['md-maxlength'] = function(modelValue, viewValue) {\n        if (!angular.isNumber(maxlength) || maxlength < 0) {\n          return true;\n        }\n\n        // We always update the char count, when the modelValue has changed.\n        // Using the $validators for triggering the update works very well.\n        renderCharCount();\n\n        return ( modelValue || element.val() || viewValue || '' ).length <= maxlength;\n      };\n    });\n\n    function renderCharCount(value) {\n      // If we have not been appended to the body yet; do not render\n      if (!charCountEl.parent) {\n        return value;\n      }\n\n      // Force the value into a string since it may be a number,\n      // which does not have a length property.\n      charCountEl.text(String(element.val() || value || '').length + ' / ' + maxlength);\n      return value;\n    }\n  }\n}\n\nfunction placeholderDirective($compile) {\n  return {\n    restrict: 'A',\n    require: '^^?mdInputContainer',\n    priority: 200,\n    link: {\n      // Note that we need to do this in the pre-link, as opposed to the post link, if we want to\n      // support data bindings in the placeholder. This is necessary, because we have a case where\n      // we transfer the placeholder value to the `<label>` and we remove it from the original `<input>`.\n      // If we did this in the post-link, AngularJS would have set up the observers already and would be\n      // re-adding the attribute, even though we removed it from the element.\n      pre: preLink\n    }\n  };\n\n  function preLink(scope, element, attr, inputContainer) {\n    // If there is no input container, just return\n    if (!inputContainer) return;\n\n    var label = inputContainer.element.find('label');\n    var noFloat = inputContainer.element.attr('md-no-float');\n\n    // If we have a label, or they specify the md-no-float attribute, just return\n    if ((label && label.length) || noFloat === '' || scope.$eval(noFloat)) {\n      // Add a placeholder class so we can target it in the CSS\n      inputContainer.setHasPlaceholder(true);\n      return;\n    }\n\n    // md-select handles placeholders on it's own\n    if (element[0].nodeName != 'MD-SELECT') {\n      // Move the placeholder expression to the label\n      var newLabel = angular.element('<label ng-click=\"delegateClick()\" tabindex=\"-1\">' + attr.placeholder + '</label>');\n\n      // Note that we unset it via `attr`, in order to get AngularJS\n      // to remove any observers that it might have set up. Otherwise\n      // the attribute will be added on the next digest.\n      attr.$set('placeholder', null);\n\n      // We need to compile the label manually in case it has any bindings.\n      // A gotcha here is that we first add the element to the DOM and we compile\n      // it later. This is necessary, because if we compile the element beforehand,\n      // it won't be able to find the `mdInputContainer` controller.\n      inputContainer.element\n        .addClass('md-icon-float')\n        .prepend(newLabel);\n\n      $compile(newLabel)(scope);\n    }\n  }\n}\n\n/**\n * @ngdoc directive\n * @name mdSelectOnFocus\n * @module material.components.input\n *\n * @restrict A\n *\n * @description\n * The `md-select-on-focus` directive allows you to automatically select the element's input text on focus.\n *\n * <h3>Notes</h3>\n * - The use of `md-select-on-focus` is restricted to `<input>` and `<textarea>` elements.\n *\n * @usage\n * <h3>Using with an Input</h3>\n * <hljs lang=\"html\">\n *\n * <md-input-container>\n *   <label>Auto Select</label>\n *   <input type=\"text\" md-select-on-focus>\n * </md-input-container>\n * </hljs>\n *\n * <h3>Using with a Textarea</h3>\n * <hljs lang=\"html\">\n *\n * <md-input-container>\n *   <label>Auto Select</label>\n *   <textarea md-select-on-focus>This text will be selected on focus.</textarea>\n * </md-input-container>\n *\n * </hljs>\n */\nfunction mdSelectOnFocusDirective($timeout) {\n\n  return {\n    restrict: 'A',\n    link: postLink\n  };\n\n  function postLink(scope, element, attr) {\n    if (element[0].nodeName !== 'INPUT' && element[0].nodeName !== \"TEXTAREA\") return;\n\n    var preventMouseUp = false;\n\n    element\n      .on('focus', onFocus)\n      .on('mouseup', onMouseUp);\n\n    scope.$on('$destroy', function() {\n      element\n        .off('focus', onFocus)\n        .off('mouseup', onMouseUp);\n    });\n\n    function onFocus() {\n      preventMouseUp = true;\n\n      $timeout(function() {\n        // Use HTMLInputElement#select to fix firefox select issues.\n        // The debounce is here for Edge's sake, otherwise the selection doesn't work.\n        element[0].select();\n\n        // This should be reset from inside the `focus`, because the event might\n        // have originated from something different than a click, e.g. a keyboard event.\n        preventMouseUp = false;\n      }, 1, false);\n    }\n\n    // Prevents the default action of the first `mouseup` after a focus.\n    // This is necessary, because browsers fire a `mouseup` right after the element\n    // has been focused. In some browsers (Firefox in particular) this can clear the\n    // selection. There are examples of the problem in issue #7487.\n    function onMouseUp(event) {\n      if (preventMouseUp) {\n        event.preventDefault();\n      }\n    }\n  }\n}\n\nvar visibilityDirectives = ['ngIf', 'ngShow', 'ngHide', 'ngSwitchWhen', 'ngSwitchDefault'];\nfunction ngMessagesDirective() {\n  return {\n    restrict: 'EA',\n    link: postLink,\n\n    // This is optional because we don't want target *all* ngMessage instances, just those inside of\n    // mdInputContainer.\n    require: '^^?mdInputContainer'\n  };\n\n  function postLink(scope, element, attrs, inputContainer) {\n    // If we are not a child of an input container, don't do anything\n    if (!inputContainer) return;\n\n    // Add our animation class\n    element.toggleClass('md-input-messages-animation', true);\n\n    // Add our md-auto-hide class to automatically hide/show messages when container is invalid\n    element.toggleClass('md-auto-hide', true);\n\n    // If we see some known visibility directives, remove the md-auto-hide class\n    if (attrs.mdAutoHide == 'false' || hasVisibiltyDirective(attrs)) {\n      element.toggleClass('md-auto-hide', false);\n    }\n  }\n\n  function hasVisibiltyDirective(attrs) {\n    return visibilityDirectives.some(function(attr) {\n      return attrs[attr];\n    });\n  }\n}\n\nfunction ngMessageDirective($mdUtil) {\n  return {\n    restrict: 'EA',\n    compile: compile,\n    priority: 100\n  };\n\n  function compile(tElement) {\n    if (!isInsideInputContainer(tElement)) {\n\n      // When the current element is inside of a document fragment, then we need to check for an input-container\n      // in the postLink, because the element will be later added to the DOM and is currently just in a temporary\n      // fragment, which causes the input-container check to fail.\n      if (isInsideFragment()) {\n        return function (scope, element) {\n          if (isInsideInputContainer(element)) {\n            // Inside of the postLink function, a ngMessage directive will be a comment element, because it's\n            // currently hidden. To access the shown element, we need to use the element from the compile function.\n            initMessageElement(tElement);\n          }\n        };\n      }\n    } else {\n      initMessageElement(tElement);\n    }\n\n    function isInsideFragment() {\n      var nextNode = tElement[0];\n      while (nextNode = nextNode.parentNode) {\n        if (nextNode.nodeType === Node.DOCUMENT_FRAGMENT_NODE) {\n          return true;\n        }\n      }\n      return false;\n    }\n\n    function isInsideInputContainer(element) {\n      return !!$mdUtil.getClosest(element, \"md-input-container\");\n    }\n\n    function initMessageElement(element) {\n      // Add our animation class\n      element.toggleClass('md-input-message-animation', true);\n    }\n  }\n}\n\nvar $$AnimateRunner, $animateCss, $mdUtil, $log;\n\nfunction mdInputInvalidMessagesAnimation($$AnimateRunner, $animateCss, $mdUtil, $log) {\n  saveSharedServices($$AnimateRunner, $animateCss, $mdUtil, $log);\n\n  return {\n    addClass: function(element, className, done) {\n      showInputMessages(element, done);\n    }\n\n    // NOTE: We do not need the removeClass method, because the message ng-leave animation will fire\n  };\n}\n\nfunction ngMessagesAnimation($$AnimateRunner, $animateCss, $mdUtil, $log) {\n  saveSharedServices($$AnimateRunner, $animateCss, $mdUtil, $log);\n\n  return {\n    enter: function(element, done) {\n      showInputMessages(element, done);\n    },\n\n    leave: function(element, done) {\n      hideInputMessages(element, done);\n    },\n\n    addClass: function(element, className, done) {\n      if (className == \"ng-hide\") {\n        hideInputMessages(element, done);\n      } else {\n        done();\n      }\n    },\n\n    removeClass: function(element, className, done) {\n      if (className == \"ng-hide\") {\n        showInputMessages(element, done);\n      } else {\n        done();\n      }\n    }\n  };\n}\n\nfunction ngMessageAnimation($$AnimateRunner, $animateCss, $mdUtil, $log) {\n  saveSharedServices($$AnimateRunner, $animateCss, $mdUtil, $log);\n\n  return {\n    enter: function(element, done) {\n      var animator = showMessage(element);\n\n      animator.start().done(done);\n    },\n\n    leave: function(element, done) {\n      var animator = hideMessage(element);\n\n      animator.start().done(done);\n    }\n  };\n}\n\nfunction showInputMessages(element, done) {\n  var animators = [], animator;\n  var messages = getMessagesElement(element);\n  var children = messages.children();\n\n  if (messages.length == 0 || children.length == 0) {\n    $log.warn('mdInput messages show animation called on invalid messages element: ', element);\n    done();\n    return;\n  }\n\n  angular.forEach(children, function(child) {\n    animator = showMessage(angular.element(child));\n\n    animators.push(animator.start());\n  });\n\n  $$AnimateRunner.all(animators, done);\n}\n\nfunction hideInputMessages(element, done) {\n  var animators = [], animator;\n  var messages = getMessagesElement(element);\n  var children = messages.children();\n\n  if (messages.length == 0 || children.length == 0) {\n    $log.warn('mdInput messages hide animation called on invalid messages element: ', element);\n    done();\n    return;\n  }\n\n  angular.forEach(children, function(child) {\n    animator = hideMessage(angular.element(child));\n\n    animators.push(animator.start());\n  });\n\n  $$AnimateRunner.all(animators, done);\n}\n\nfunction showMessage(element) {\n  var height = parseInt(window.getComputedStyle(element[0]).height);\n  var topMargin = parseInt(window.getComputedStyle(element[0]).marginTop);\n\n  var messages = getMessagesElement(element);\n  var container = getInputElement(element);\n\n  // Check to see if the message is already visible so we can skip\n  var alreadyVisible = (topMargin > -height);\n\n  // If we have the md-auto-hide class, the md-input-invalid animation will fire, so we can skip\n  if (alreadyVisible || (messages.hasClass('md-auto-hide') && !container.hasClass('md-input-invalid'))) {\n    return $animateCss(element, {});\n  }\n\n  return $animateCss(element, {\n    event: 'enter',\n    structural: true,\n    from: {\"opacity\": 0, \"margin-top\": -height + \"px\"},\n    to: {\"opacity\": 1, \"margin-top\": \"0\"},\n    duration: 0.3\n  });\n}\n\nfunction hideMessage(element) {\n  var height = element[0].offsetHeight;\n  var styles = window.getComputedStyle(element[0]);\n\n  // If we are already hidden, just return an empty animation\n  if (parseInt(styles.opacity) === 0) {\n    return $animateCss(element, {});\n  }\n\n  // Otherwise, animate\n  return $animateCss(element, {\n    event: 'leave',\n    structural: true,\n    from: {\"opacity\": 1, \"margin-top\": 0},\n    to: {\"opacity\": 0, \"margin-top\": -height + \"px\"},\n    duration: 0.3\n  });\n}\n\nfunction getInputElement(element) {\n  var inputContainer = element.controller('mdInputContainer');\n\n  return inputContainer.element;\n}\n\nfunction getMessagesElement(element) {\n  // If we ARE the messages element, just return ourself\n  if (element.hasClass('md-input-messages-animation')) {\n    return element;\n  }\n\n  // If we are a ng-message element, we need to traverse up the DOM tree\n  if (element.hasClass('md-input-message-animation')) {\n    return angular.element($mdUtil.getClosest(element, function(node) {\n      return node.classList.contains('md-input-messages-animation');\n    }));\n  }\n\n  // Otherwise, we can traverse down\n  return angular.element(element[0].querySelector('.md-input-messages-animation'));\n}\n\nfunction saveSharedServices(_$$AnimateRunner_, _$animateCss_, _$mdUtil_, _$log_) {\n  $$AnimateRunner = _$$AnimateRunner_;\n  $animateCss = _$animateCss_;\n  $mdUtil = _$mdUtil_;\n  $log = _$log_;\n}\n\n})();\n(function(){\n\"use strict\";\n\n/**\n * @ngdoc module\n * @name material.components.list\n * @description\n * List module\n */\nMdListController.$inject = [\"$scope\", \"$element\", \"$mdListInkRipple\"];\nmdListDirective.$inject = [\"$mdTheming\"];\nmdListItemDirective.$inject = [\"$mdAria\", \"$mdConstant\", \"$mdUtil\", \"$timeout\"];\nangular.module('material.components.list', [\n  'material.core'\n])\n  .controller('MdListController', MdListController)\n  .directive('mdList', mdListDirective)\n  .directive('mdListItem', mdListItemDirective);\n\n/**\n * @ngdoc directive\n * @name mdList\n * @module material.components.list\n *\n * @restrict E\n *\n * @description\n * The `<md-list>` directive is a list container for 1..n `<md-list-item>` tags.\n *\n * @usage\n * <hljs lang=\"html\">\n * <md-list>\n *   <md-list-item class=\"md-2-line\" ng-repeat=\"item in todos\">\n *     <md-checkbox ng-model=\"item.done\"></md-checkbox>\n *     <div class=\"md-list-item-text\">\n *       <h3>{{item.title}}</h3>\n *       <p>{{item.description}}</p>\n *     </div>\n *   </md-list-item>\n * </md-list>\n * </hljs>\n */\n\nfunction mdListDirective($mdTheming) {\n  return {\n    restrict: 'E',\n    compile: function(tEl) {\n      tEl[0].setAttribute('role', 'list');\n      return $mdTheming;\n    }\n  };\n}\n/**\n * @ngdoc directive\n * @name mdListItem\n * @module material.components.list\n *\n * @restrict E\n *\n * @description\n * A `md-list-item` element can be used to represent some information in a row.<br/>\n *\n * @usage\n * ### Single Row Item\n * <hljs lang=\"html\">\n *   <md-list-item>\n *     <span>Single Row Item</span>\n *   </md-list-item>\n * </hljs>\n *\n * ### Multiple Lines\n * By using the following markup, you will be able to have two lines inside of one `md-list-item`.\n *\n * <hljs lang=\"html\">\n *   <md-list-item class=\"md-2-line\">\n *     <div class=\"md-list-item-text\" layout=\"column\">\n *       <p>First Line</p>\n *       <p>Second Line</p>\n *     </div>\n *   </md-list-item>\n * </hljs>\n *\n * It is also possible to have three lines inside of one list item.\n *\n * <hljs lang=\"html\">\n *   <md-list-item class=\"md-3-line\">\n *     <div class=\"md-list-item-text\" layout=\"column\">\n *       <p>First Line</p>\n *       <p>Second Line</p>\n *       <p>Third Line</p>\n *     </div>\n *   </md-list-item>\n * </hljs>\n *\n * ### Secondary Items\n * Secondary items are elements which will be aligned at the end of the `md-list-item`.\n *\n * <hljs lang=\"html\">\n *   <md-list-item>\n *     <span>Single Row Item</span>\n *     <md-button class=\"md-secondary\">\n *       Secondary Button\n *     </md-button>\n *   </md-list-item>\n * </hljs>\n *\n * It also possible to have multiple secondary items inside of one `md-list-item`.\n *\n * <hljs lang=\"html\">\n *   <md-list-item>\n *     <span>Single Row Item</span>\n *     <md-button class=\"md-secondary\">First Button</md-button>\n *     <md-button class=\"md-secondary\">Second Button</md-button>\n *   </md-list-item>\n * </hljs>\n *\n * ### Proxy Item\n * Proxies are elements, which will execute their specific action on click<br/>\n * Currently supported proxy items are\n * - `md-checkbox` (Toggle)\n * - `md-switch` (Toggle)\n * - `md-menu` (Open)\n *\n * This means, when using a supported proxy item inside of `md-list-item`, the list item will\n * automatically become clickable and executes the associated action of the proxy element on click.\n *\n * It is possible to disable this behavior by applying the `md-no-proxy` class to the list item.\n *\n * <hljs lang=\"html\">\n *   <md-list-item class=\"md-no-proxy\">\n *     <span>No Proxy List</span>\n *     <md-checkbox class=\"md-secondary\"></md-checkbox>\n *   </md-list-item>\n * </hljs>\n *\n * Here are a few examples of proxy elements inside of a list item.\n *\n * <hljs lang=\"html\">\n *   <md-list-item>\n *     <span>First Line</span>\n *     <md-checkbox class=\"md-secondary\"></md-checkbox>\n *   </md-list-item>\n * </hljs>\n *\n * The `md-checkbox` element will be automatically detected as a proxy element and will toggle on click.\n *\n * <hljs lang=\"html\">\n *   <md-list-item>\n *     <span>First Line</span>\n *     <md-switch class=\"md-secondary\"></md-switch>\n *   </md-list-item>\n * </hljs>\n *\n * The recognized `md-switch` will toggle its state, when the user clicks on the `md-list-item`.\n *\n * It is also possible to have a `md-menu` inside of a `md-list-item`.\n * <hljs lang=\"html\">\n *   <md-list-item>\n *     <p>Click anywhere to fire the secondary action</p>\n *     <md-menu class=\"md-secondary\">\n *       <md-button class=\"md-icon-button\">\n *         <md-icon md-svg-icon=\"communication:message\"></md-icon>\n *       </md-button>\n *       <md-menu-content width=\"4\">\n *         <md-menu-item>\n *           <md-button>\n *             Redial\n *           </md-button>\n *         </md-menu-item>\n *         <md-menu-item>\n *           <md-button>\n *             Check voicemail\n *           </md-button>\n *         </md-menu-item>\n *         <md-menu-divider></md-menu-divider>\n *         <md-menu-item>\n *           <md-button>\n *             Notifications\n *           </md-button>\n *         </md-menu-item>\n *       </md-menu-content>\n *     </md-menu>\n *   </md-list-item>\n * </hljs>\n *\n * The menu will automatically open, when the users clicks on the `md-list-item`.<br/>\n *\n * If the developer didn't specify any position mode on the menu, the `md-list-item` will automatically detect the\n * position mode and applies it to the `md-menu`.\n *\n * ### Avatars\n * Sometimes you may want to have some avatars inside of the `md-list-item `.<br/>\n * You are able to create a optimized icon for the list item, by applying the `.md-avatar` class on the `<img>` element.\n *\n * <hljs lang=\"html\">\n *   <md-list-item>\n *     <img src=\"my-avatar.png\" class=\"md-avatar\">\n *     <span>Alan Turing</span>\n * </hljs>\n *\n * When using `<md-icon>` for an avatar, you have to use the `.md-avatar-icon` class.\n * <hljs lang=\"html\">\n *   <md-list-item>\n *     <md-icon class=\"md-avatar-icon\" md-svg-icon=\"avatars:timothy\"></md-icon>\n *     <span>Timothy Kopra</span>\n *   </md-list-item>\n * </hljs>\n *\n * In cases, you have a `md-list-item`, which doesn't have any avatar,\n * but you want to align it with the other avatar items, you have to use the `.md-offset` class.\n *\n * <hljs lang=\"html\">\n *   <md-list-item class=\"md-offset\">\n *     <span>Jon Doe</span>\n *   </md-list-item>\n * </hljs>\n *\n * ### DOM modification\n * The `md-list-item` component automatically detects if the list item should be clickable.\n *\n * ---\n * If the `md-list-item` is clickable, we wrap all content inside of a `<div>` and create\n * an overlaying button, which will will execute the given actions (like `ng-href`, `ng-click`)\n *\n * We create an overlaying button, instead of wrapping all content inside of the button,\n * because otherwise some elements may not be clickable inside of the button.\n *\n * ---\n * When using a secondary item inside of your list item, the `md-list-item` component will automatically create\n * a secondary container at the end of the `md-list-item`, which contains all secondary items.\n *\n * The secondary item container is not static, because otherwise the overflow will not work properly on the\n * list item.\n *\n */\nfunction mdListItemDirective($mdAria, $mdConstant, $mdUtil, $timeout) {\n  var proxiedTypes = ['md-checkbox', 'md-switch', 'md-menu'];\n  return {\n    restrict: 'E',\n    controller: 'MdListController',\n    compile: function(tEl, tAttrs) {\n\n      // Check for proxy controls (no ng-click on parent, and a control inside)\n      var secondaryItems = tEl[0].querySelectorAll('.md-secondary');\n      var hasProxiedElement;\n      var proxyElement;\n      var itemContainer = tEl;\n\n      tEl[0].setAttribute('role', 'listitem');\n\n      if (tAttrs.ngClick || tAttrs.ngDblclick ||  tAttrs.ngHref || tAttrs.href || tAttrs.uiSref || tAttrs.ngAttrUiSref) {\n        wrapIn('button');\n      } else if (!tEl.hasClass('md-no-proxy')) {\n\n        for (var i = 0, type; type = proxiedTypes[i]; ++i) {\n          if (proxyElement = tEl[0].querySelector(type)) {\n            hasProxiedElement = true;\n            break;\n          }\n        }\n\n        if (hasProxiedElement) {\n          wrapIn('div');\n        } else {\n          tEl.addClass('md-no-proxy');\n        }\n\n      }\n\n      wrapSecondaryItems();\n      setupToggleAria();\n\n      if (hasProxiedElement && proxyElement.nodeName === \"MD-MENU\") {\n        setupProxiedMenu();\n      }\n\n      function setupToggleAria() {\n        var toggleTypes = ['md-switch', 'md-checkbox'];\n        var toggle;\n\n        for (var i = 0, toggleType; toggleType = toggleTypes[i]; ++i) {\n          if (toggle = tEl.find(toggleType)[0]) {\n            if (!toggle.hasAttribute('aria-label')) {\n              var p = tEl.find('p')[0];\n              if (!p) return;\n              toggle.setAttribute('aria-label', 'Toggle ' + p.textContent);\n            }\n          }\n        }\n      }\n\n      function setupProxiedMenu() {\n        var menuEl = angular.element(proxyElement);\n\n        var isEndAligned = menuEl.parent().hasClass('md-secondary-container') ||\n                           proxyElement.parentNode.firstElementChild !== proxyElement;\n\n        var xAxisPosition = 'left';\n\n        if (isEndAligned) {\n          // When the proxy item is aligned at the end of the list, we have to set the origin to the end.\n          xAxisPosition = 'right';\n        }\n\n        // Set the position mode / origin of the proxied menu.\n        if (!menuEl.attr('md-position-mode')) {\n          menuEl.attr('md-position-mode', xAxisPosition + ' target');\n        }\n\n        // Apply menu open binding to menu button\n        var menuOpenButton = menuEl.children().eq(0);\n        if (!hasClickEvent(menuOpenButton[0])) {\n          menuOpenButton.attr('ng-click', '$mdMenu.open($event)');\n        }\n\n        if (!menuOpenButton.attr('aria-label')) {\n          menuOpenButton.attr('aria-label', 'Open List Menu');\n        }\n      }\n\n      function wrapIn(type) {\n        if (type == 'div') {\n          itemContainer = angular.element('<div class=\"md-no-style md-list-item-inner\">');\n          itemContainer.append(tEl.contents());\n          tEl.addClass('md-proxy-focus');\n        } else {\n          // Element which holds the default list-item content.\n          itemContainer = angular.element(\n            '<div class=\"md-button md-no-style\">'+\n            '   <div class=\"md-list-item-inner\"></div>'+\n            '</div>'\n          );\n\n          // Button which shows ripple and executes primary action.\n          var buttonWrap = angular.element(\n            '<md-button class=\"md-no-style\"></md-button>'\n          );\n\n          copyAttributes(tEl[0], buttonWrap[0]);\n\n          // If there is no aria-label set on the button (previously copied over if present)\n          // we determine the label from the content and copy it to the button.\n          if (!buttonWrap.attr('aria-label')) {\n            buttonWrap.attr('aria-label', $mdAria.getText(tEl));\n          }\n\n          // We allow developers to specify the `md-no-focus` class, to disable the focus style\n          // on the button executor. Once more classes should be forwarded, we should probably make the\n          // class forward more generic.\n          if (tEl.hasClass('md-no-focus')) {\n            buttonWrap.addClass('md-no-focus');\n          }\n\n          // Append the button wrap before our list-item content, because it will overlay in relative.\n          itemContainer.prepend(buttonWrap);\n          itemContainer.children().eq(1).append(tEl.contents());\n\n          tEl.addClass('_md-button-wrap');\n        }\n\n        tEl[0].setAttribute('tabindex', '-1');\n        tEl.append(itemContainer);\n      }\n\n      function wrapSecondaryItems() {\n        var secondaryItemsWrapper = angular.element('<div class=\"md-secondary-container\">');\n\n        angular.forEach(secondaryItems, function(secondaryItem) {\n          wrapSecondaryItem(secondaryItem, secondaryItemsWrapper);\n        });\n\n        itemContainer.append(secondaryItemsWrapper);\n      }\n\n      function wrapSecondaryItem(secondaryItem, container) {\n        // If the current secondary item is not a button, but contains a ng-click attribute,\n        // the secondary item will be automatically wrapped inside of a button.\n        if (secondaryItem && !isButton(secondaryItem) && secondaryItem.hasAttribute('ng-click')) {\n\n          $mdAria.expect(secondaryItem, 'aria-label');\n          var buttonWrapper = angular.element('<md-button class=\"md-secondary md-icon-button\">');\n\n          // Copy the attributes from the secondary item to the generated button.\n          // We also support some additional attributes from the secondary item,\n          // because some developers may use a ngIf, ngHide, ngShow on their item.\n          copyAttributes(secondaryItem, buttonWrapper[0], ['ng-if', 'ng-hide', 'ng-show']);\n\n          secondaryItem.setAttribute('tabindex', '-1');\n          buttonWrapper.append(secondaryItem);\n\n          secondaryItem = buttonWrapper[0];\n        }\n\n        if (secondaryItem && (!hasClickEvent(secondaryItem) || (!tAttrs.ngClick && isProxiedElement(secondaryItem)))) {\n          // In this case we remove the secondary class, so we can identify it later, when we searching for the\n          // proxy items.\n          angular.element(secondaryItem).removeClass('md-secondary');\n        }\n\n        tEl.addClass('md-with-secondary');\n        container.append(secondaryItem);\n      }\n\n      /**\n       * Copies attributes from a source element to the destination element\n       * By default the function will copy the most necessary attributes, supported\n       * by the button executor for clickable list items.\n       * @param source Element with the specified attributes\n       * @param destination Element which will retrieve the attributes\n       * @param extraAttrs Additional attributes, which will be copied over.\n       */\n      function copyAttributes(source, destination, extraAttrs) {\n        var copiedAttrs = $mdUtil.prefixer([\n          'ng-if', 'ng-click', 'ng-dblclick', 'aria-label', 'ng-disabled', 'ui-sref',\n          'href', 'ng-href', 'target', 'ng-attr-ui-sref', 'ui-sref-opts'\n        ]);\n\n        if (extraAttrs) {\n          copiedAttrs = copiedAttrs.concat($mdUtil.prefixer(extraAttrs));\n        }\n\n        angular.forEach(copiedAttrs, function(attr) {\n          if (source.hasAttribute(attr)) {\n            destination.setAttribute(attr, source.getAttribute(attr));\n            source.removeAttribute(attr);\n          }\n        });\n      }\n\n      function isProxiedElement(el) {\n        return proxiedTypes.indexOf(el.nodeName.toLowerCase()) != -1;\n      }\n\n      function isButton(el) {\n        var nodeName = el.nodeName.toUpperCase();\n\n        return nodeName == \"MD-BUTTON\" || nodeName == \"BUTTON\";\n      }\n\n      function hasClickEvent (element) {\n        var attr = element.attributes;\n        for (var i = 0; i < attr.length; i++) {\n          if (tAttrs.$normalize(attr[i].name) === 'ngClick') return true;\n        }\n        return false;\n      }\n\n      return postLink;\n\n      function postLink($scope, $element, $attr, ctrl) {\n        $element.addClass('_md');     // private md component indicator for styling\n\n        var proxies       = [],\n            firstElement  = $element[0].firstElementChild,\n            isButtonWrap  = $element.hasClass('_md-button-wrap'),\n            clickChild    = isButtonWrap ? firstElement.firstElementChild : firstElement,\n            hasClick      = clickChild && hasClickEvent(clickChild),\n            noProxies     = $element.hasClass('md-no-proxy');\n\n        computeProxies();\n        computeClickable();\n\n        if (proxies.length) {\n          angular.forEach(proxies, function(proxy) {\n            proxy = angular.element(proxy);\n\n            $scope.mouseActive = false;\n            proxy.on('mousedown', function() {\n              $scope.mouseActive = true;\n              $timeout(function(){\n                $scope.mouseActive = false;\n              }, 100);\n            })\n            .on('focus', function() {\n              if ($scope.mouseActive === false) { $element.addClass('md-focused'); }\n              proxy.on('blur', function proxyOnBlur() {\n                $element.removeClass('md-focused');\n                proxy.off('blur', proxyOnBlur);\n              });\n            });\n          });\n        }\n\n\n        function computeProxies() {\n\n          if (firstElement && firstElement.children && !hasClick && !noProxies) {\n\n            angular.forEach(proxiedTypes, function(type) {\n\n              // All elements which are not capable for being used a proxy have the .md-secondary class\n              // applied. These items had been sorted out in the secondary wrap function.\n              angular.forEach(firstElement.querySelectorAll(type + ':not(.md-secondary)'), function(child) {\n                proxies.push(child);\n              });\n            });\n\n          }\n        }\n\n        function computeClickable() {\n          if (proxies.length == 1 || hasClick) {\n            $element.addClass('md-clickable');\n\n            if (!hasClick) {\n              ctrl.attachRipple($scope, angular.element($element[0].querySelector('.md-no-style')));\n            }\n          }\n        }\n\n        function isEventFromControl(event) {\n          var forbiddenControls = ['md-slider'];\n\n          // If there is no path property in the event, then we can assume that the event was not bubbled.\n          if (!event.path) {\n            return forbiddenControls.indexOf(event.target.tagName.toLowerCase()) !== -1;\n          }\n\n          // We iterate the event path up and check for a possible component.\n          // Our maximum index to search, is the list item root.\n          var maxPath = event.path.indexOf($element.children()[0]);\n\n          for (var i = 0; i < maxPath; i++) {\n            if (forbiddenControls.indexOf(event.path[i].tagName.toLowerCase()) !== -1) {\n              return true;\n            }\n          }\n        }\n\n        var clickChildKeypressListener = function(e) {\n          if (e.target.nodeName != 'INPUT' && e.target.nodeName != 'TEXTAREA' && !e.target.isContentEditable) {\n            var keyCode = e.which || e.keyCode;\n            if (keyCode == $mdConstant.KEY_CODE.SPACE) {\n              if (clickChild) {\n                clickChild.click();\n                e.preventDefault();\n                e.stopPropagation();\n              }\n            }\n          }\n        };\n\n        if (!hasClick && !proxies.length) {\n          clickChild && clickChild.addEventListener('keypress', clickChildKeypressListener);\n        }\n\n        $element.off('click');\n        $element.off('keypress');\n\n        if (proxies.length == 1 && clickChild) {\n          $element.children().eq(0).on('click', function(e) {\n            // When the event is coming from an control and it should not trigger the proxied element\n            // then we are skipping.\n            if (isEventFromControl(e)) return;\n\n            var parentButton = $mdUtil.getClosest(e.target, 'BUTTON');\n            if (!parentButton && clickChild.contains(e.target)) {\n              angular.forEach(proxies, function(proxy) {\n                if (e.target !== proxy && !proxy.contains(e.target)) {\n                  if (proxy.nodeName === 'MD-MENU') {\n                    proxy = proxy.children[0];\n                  }\n                  angular.element(proxy).triggerHandler('click');\n                }\n              });\n            }\n          });\n        }\n\n        $scope.$on('$destroy', function () {\n          clickChild && clickChild.removeEventListener('keypress', clickChildKeypressListener);\n        });\n      }\n    }\n  };\n}\n\n/*\n * @private\n * @ngdoc controller\n * @name MdListController\n * @module material.components.list\n *\n */\nfunction MdListController($scope, $element, $mdListInkRipple) {\n  var ctrl = this;\n  ctrl.attachRipple = attachRipple;\n\n  function attachRipple (scope, element) {\n    var options = {};\n    $mdListInkRipple.attach(scope, element, options);\n  }\n}\n\n})();\n(function(){\n\"use strict\";\n\n/**\n * @ngdoc module\n * @name material.components.menu\n */\n\nangular.module('material.components.menu', [\n  'material.core',\n  'material.components.backdrop'\n]);\n\n})();\n(function(){\n\"use strict\";\n\n/**\n * @ngdoc module\n * @name material.components.menuBar\n */\n\nangular.module('material.components.menuBar', [\n  'material.core',\n  'material.components.icon',\n  'material.components.menu'\n]);\n\n})();\n(function(){\n\"use strict\";\n\n/**\n * @ngdoc module\n * @name material.components.navBar\n */\n\n\nMdNavBarController.$inject = [\"$element\", \"$scope\", \"$timeout\", \"$mdConstant\"];\nMdNavItem.$inject = [\"$mdAria\", \"$$rAF\"];\nMdNavItemController.$inject = [\"$element\"];\nMdNavBar.$inject = [\"$mdAria\", \"$mdTheming\"];\nangular.module('material.components.navBar', ['material.core'])\n    .controller('MdNavBarController', MdNavBarController)\n    .directive('mdNavBar', MdNavBar)\n    .controller('MdNavItemController', MdNavItemController)\n    .directive('mdNavItem', MdNavItem);\n\n\n/*****************************************************************************\n *                            PUBLIC DOCUMENTATION                           *\n *****************************************************************************/\n/**\n * @ngdoc directive\n * @name mdNavBar\n * @module material.components.navBar\n *\n * @restrict E\n *\n * @description\n * The `<md-nav-bar>` directive renders a list of material tabs that can be used\n * for top-level page navigation. Unlike `<md-tabs>`, it has no concept of a tab\n * body and no bar pagination.\n *\n * Because it deals with page navigation, certain routing concepts are built-in.\n * Route changes via via ng-href, ui-sref, or ng-click events are supported.\n * Alternatively, the user could simply watch currentNavItem for changes.\n *\n * Accessibility functionality is implemented as a site navigator with a\n * listbox, according to\n * https://www.w3.org/TR/wai-aria-practices/#Site_Navigator_Tabbed_Style\n *\n * @param {string=} mdSelectedNavItem The name of the current tab; this must\n *     match the name attribute of `<md-nav-item>`\n * @param {boolean=} mdNoInkBar If set to true, the ink bar will be hidden.\n * @param {string=} navBarAriaLabel An aria-label for the nav-bar\n *\n * @usage\n * <hljs lang=\"html\">\n *  <md-nav-bar md-selected-nav-item=\"currentNavItem\">\n *    <md-nav-item md-nav-click=\"goto('page1')\" name=\"page1\">\n *      Page One\n *    </md-nav-item>\n *    <md-nav-item md-nav-href=\"#page2\" name=\"page3\">Page Two</md-nav-item>\n *    <md-nav-item md-nav-sref=\"page3\" name=\"page2\">Page Three</md-nav-item>\n *    <md-nav-item\n *      md-nav-sref=\"app.page4\"\n *      sref-opts=\"{reload: true, notify: true}\"\n *      name=\"page4\">\n *      Page Four\n *    </md-nav-item>\n *  </md-nav-bar>\n *</hljs>\n * <hljs lang=\"js\">\n * (function() {\n *   'use strict';\n *\n *    $rootScope.$on('$routeChangeSuccess', function(event, current) {\n *      $scope.currentLink = getCurrentLinkFromRoute(current);\n *    });\n * });\n * </hljs>\n */\n\n/*****************************************************************************\n *                            mdNavItem\n *****************************************************************************/\n/**\n * @ngdoc directive\n * @name mdNavItem\n * @module material.components.navBar\n *\n * @restrict E\n *\n * @description\n * `<md-nav-item>` describes a page navigation link within the `<md-nav-bar>`\n * component. It renders an md-button as the actual link.\n *\n * Exactly one of the mdNavClick, mdNavHref, mdNavSref attributes are required\n * to be specified.\n *\n * @param {Function=} mdNavClick Function which will be called when the\n *     link is clicked to change the page. Renders as an `ng-click`.\n * @param {string=} mdNavHref url to transition to when this link is clicked.\n *     Renders as an `ng-href`.\n * @param {string=} mdNavSref Ui-router state to transition to when this link is\n *     clicked. Renders as a `ui-sref`.\n * @param {!Object=} srefOpts Ui-router options that are passed to the\n *     `$state.go()` function. See the [Ui-router documentation for details]\n *     (https://ui-router.github.io/docs/latest/interfaces/transition.transitionoptions.html).\n * @param {string=} name The name of this link. Used by the nav bar to know\n *     which link is currently selected.\n * @param {string=} aria-label Adds alternative text for accessibility\n *\n * @usage\n * See `<md-nav-bar>` for usage.\n */\n\n\n/*****************************************************************************\n *                                IMPLEMENTATION                             *\n *****************************************************************************/\n\nfunction MdNavBar($mdAria, $mdTheming) {\n  return {\n    restrict: 'E',\n    transclude: true,\n    controller: MdNavBarController,\n    controllerAs: 'ctrl',\n    bindToController: true,\n    scope: {\n      'mdSelectedNavItem': '=?',\n      'mdNoInkBar': '=?',\n      'navBarAriaLabel': '@?',\n    },\n    template:\n      '<div class=\"md-nav-bar\">' +\n        '<nav role=\"navigation\">' +\n          '<ul class=\"_md-nav-bar-list\" ng-transclude role=\"listbox\"' +\n            'tabindex=\"0\"' +\n            'ng-focus=\"ctrl.onFocus()\"' +\n            'ng-keydown=\"ctrl.onKeydown($event)\"' +\n            'aria-label=\"{{ctrl.navBarAriaLabel}}\">' +\n          '</ul>' +\n        '</nav>' +\n        '<md-nav-ink-bar ng-hide=\"ctrl.mdNoInkBar\"></md-nav-ink-bar>' +\n      '</div>',\n    link: function(scope, element, attrs, ctrl) {\n      $mdTheming(element);\n      if (!ctrl.navBarAriaLabel) {\n        $mdAria.expectAsync(element, 'aria-label', angular.noop);\n      }\n    },\n  };\n}\n\n/**\n * Controller for the nav-bar component.\n *\n * Accessibility functionality is implemented as a site navigator with a\n * listbox, according to\n * https://www.w3.org/TR/wai-aria-practices/#Site_Navigator_Tabbed_Style\n * @param {!angular.JQLite} $element\n * @param {!angular.Scope} $scope\n * @param {!angular.Timeout} $timeout\n * @param {!Object} $mdConstant\n * @constructor\n * @final\n * @ngInject\n */\nfunction MdNavBarController($element, $scope, $timeout, $mdConstant) {\n  // Injected variables\n  /** @private @const {!angular.Timeout} */\n  this._$timeout = $timeout;\n\n  /** @private @const {!angular.Scope} */\n  this._$scope = $scope;\n\n  /** @private @const {!Object} */\n  this._$mdConstant = $mdConstant;\n\n  // Data-bound variables.\n  /** @type {string} */\n  this.mdSelectedNavItem;\n\n  /** @type {string} */\n  this.navBarAriaLabel;\n\n  // State variables.\n\n  /** @type {?angular.JQLite} */\n  this._navBarEl = $element[0];\n\n  /** @type {?angular.JQLite} */\n  this._inkbar;\n\n  var self = this;\n  // need to wait for transcluded content to be available\n  var deregisterTabWatch = this._$scope.$watch(function() {\n    return self._navBarEl.querySelectorAll('._md-nav-button').length;\n  },\n  function(newLength) {\n    if (newLength > 0) {\n      self._initTabs();\n      deregisterTabWatch();\n    }\n  });\n}\n\n\n\n/**\n * Initializes the tab components once they exist.\n * @private\n */\nMdNavBarController.prototype._initTabs = function() {\n  this._inkbar = angular.element(this._navBarEl.querySelector('md-nav-ink-bar'));\n\n  var self = this;\n  this._$timeout(function() {\n    self._updateTabs(self.mdSelectedNavItem, undefined);\n  });\n\n  this._$scope.$watch('ctrl.mdSelectedNavItem', function(newValue, oldValue) {\n    // Wait a digest before update tabs for products doing\n    // anything dynamic in the template.\n    self._$timeout(function() {\n      self._updateTabs(newValue, oldValue);\n    });\n  });\n};\n\n/**\n * Set the current tab to be selected.\n * @param {string|undefined} newValue New current tab name.\n * @param {string|undefined} oldValue Previous tab name.\n * @private\n */\nMdNavBarController.prototype._updateTabs = function(newValue, oldValue) {\n  var self = this;\n  var tabs = this._getTabs();\n\n  // this._getTabs can return null if nav-bar has not yet been initialized\n  if(!tabs)\n    return;\n\n  var oldIndex = -1;\n  var newIndex = -1;\n  var newTab = this._getTabByName(newValue);\n  var oldTab = this._getTabByName(oldValue);\n\n  if (oldTab) {\n    oldTab.setSelected(false);\n    oldIndex = tabs.indexOf(oldTab);\n  }\n\n  if (newTab) {\n    newTab.setSelected(true);\n    newIndex = tabs.indexOf(newTab);\n  }\n\n  this._$timeout(function() {\n    self._updateInkBarStyles(newTab, newIndex, oldIndex);\n  });\n};\n\n/**\n * Repositions the ink bar to the selected tab.\n * @private\n */\nMdNavBarController.prototype._updateInkBarStyles = function(tab, newIndex, oldIndex) {\n  this._inkbar.toggleClass('_md-left', newIndex < oldIndex)\n      .toggleClass('_md-right', newIndex > oldIndex);\n\n  this._inkbar.css({display: newIndex < 0 ? 'none' : ''});\n\n  if (tab) {\n    var tabEl = tab.getButtonEl();\n    var left = tabEl.offsetLeft;\n\n    this._inkbar.css({left: left + 'px', width: tabEl.offsetWidth + 'px'});\n  }\n};\n\n/**\n * Returns an array of the current tabs.\n * @return {!Array<!NavItemController>}\n * @private\n */\nMdNavBarController.prototype._getTabs = function() {\n  var controllers = Array.prototype.slice.call(\n    this._navBarEl.querySelectorAll('.md-nav-item'))\n    .map(function(el) {\n      return angular.element(el).controller('mdNavItem')\n    });\n  return controllers.indexOf(undefined) ? controllers : null;\n};\n\n/**\n * Returns the tab with the specified name.\n * @param {string} name The name of the tab, found in its name attribute.\n * @return {!NavItemController|undefined}\n * @private\n */\nMdNavBarController.prototype._getTabByName = function(name) {\n  return this._findTab(function(tab) {\n    return tab.getName() == name;\n  });\n};\n\n/**\n * Returns the selected tab.\n * @return {!NavItemController|undefined}\n * @private\n */\nMdNavBarController.prototype._getSelectedTab = function() {\n  return this._findTab(function(tab) {\n    return tab.isSelected();\n  });\n};\n\n/**\n * Returns the focused tab.\n * @return {!NavItemController|undefined}\n */\nMdNavBarController.prototype.getFocusedTab = function() {\n  return this._findTab(function(tab) {\n    return tab.hasFocus();\n  });\n};\n\n/**\n * Find a tab that matches the specified function.\n * @private\n */\nMdNavBarController.prototype._findTab = function(fn) {\n  var tabs = this._getTabs();\n  for (var i = 0; i < tabs.length; i++) {\n    if (fn(tabs[i])) {\n      return tabs[i];\n    }\n  }\n\n  return null;\n};\n\n/**\n * Direct focus to the selected tab when focus enters the nav bar.\n */\nMdNavBarController.prototype.onFocus = function() {\n  var tab = this._getSelectedTab();\n  if (tab) {\n    tab.setFocused(true);\n  }\n};\n\n/**\n * Move focus from oldTab to newTab.\n * @param {!NavItemController} oldTab\n * @param {!NavItemController} newTab\n * @private\n */\nMdNavBarController.prototype._moveFocus = function(oldTab, newTab) {\n  oldTab.setFocused(false);\n  newTab.setFocused(true);\n};\n\n/**\n * Responds to keypress events.\n * @param {!Event} e\n */\nMdNavBarController.prototype.onKeydown = function(e) {\n  var keyCodes = this._$mdConstant.KEY_CODE;\n  var tabs = this._getTabs();\n  var focusedTab = this.getFocusedTab();\n  if (!focusedTab) return;\n\n  var focusedTabIndex = tabs.indexOf(focusedTab);\n\n  // use arrow keys to navigate between tabs\n  switch (e.keyCode) {\n    case keyCodes.UP_ARROW:\n    case keyCodes.LEFT_ARROW:\n      if (focusedTabIndex > 0) {\n        this._moveFocus(focusedTab, tabs[focusedTabIndex - 1]);\n      }\n      break;\n    case keyCodes.DOWN_ARROW:\n    case keyCodes.RIGHT_ARROW:\n      if (focusedTabIndex < tabs.length - 1) {\n        this._moveFocus(focusedTab, tabs[focusedTabIndex + 1]);\n      }\n      break;\n    case keyCodes.SPACE:\n    case keyCodes.ENTER:\n      // timeout to avoid a \"digest already in progress\" console error\n      this._$timeout(function() {\n        focusedTab.getButtonEl().click();\n      });\n      break;\n  }\n};\n\n/**\n * @ngInject\n */\nfunction MdNavItem($mdAria, $$rAF) {\n  return {\n    restrict: 'E',\n    require: ['mdNavItem', '^mdNavBar'],\n    controller: MdNavItemController,\n    bindToController: true,\n    controllerAs: 'ctrl',\n    replace: true,\n    transclude: true,\n    template: function(tElement, tAttrs) {\n      var hasNavClick = tAttrs.mdNavClick;\n      var hasNavHref = tAttrs.mdNavHref;\n      var hasNavSref = tAttrs.mdNavSref;\n      var hasSrefOpts = tAttrs.srefOpts;\n      var navigationAttribute;\n      var navigationOptions;\n      var buttonTemplate;\n\n      // Cannot specify more than one nav attribute\n      if ((hasNavClick ? 1:0) + (hasNavHref ? 1:0) + (hasNavSref ? 1:0) > 1) {\n        throw Error(\n          'Must not specify more than one of the md-nav-click, md-nav-href, ' +\n          'or md-nav-sref attributes per nav-item directive.'\n        );\n      }\n\n      if (hasNavClick) {\n        navigationAttribute = 'ng-click=\"ctrl.mdNavClick()\"';\n      } else if (hasNavHref) {\n        navigationAttribute = 'ng-href=\"{{ctrl.mdNavHref}}\"';\n      } else if (hasNavSref) {\n        navigationAttribute = 'ui-sref=\"{{ctrl.mdNavSref}}\"';\n      }\n\n      navigationOptions = hasSrefOpts ? 'ui-sref-opts=\"{{ctrl.srefOpts}}\" ' : '';\n\n      if (navigationAttribute) {\n        buttonTemplate = '' +\n          '<md-button class=\"_md-nav-button md-accent\" ' +\n            'ng-class=\"ctrl.getNgClassMap()\" ' +\n            'ng-blur=\"ctrl.setFocused(false)\" ' +\n            'tabindex=\"-1\" ' +\n            navigationOptions +\n            navigationAttribute + '>' +\n            '<span ng-transclude class=\"_md-nav-button-text\"></span>' +\n          '</md-button>';\n      }\n\n      return '' +\n        '<li class=\"md-nav-item\" ' +\n          'role=\"option\" ' +\n          'aria-selected=\"{{ctrl.isSelected()}}\">' +\n          (buttonTemplate || '') +\n        '</li>';\n    },\n    scope: {\n      'mdNavClick': '&?',\n      'mdNavHref': '@?',\n      'mdNavSref': '@?',\n      'srefOpts': '=?',\n      'name': '@',\n    },\n    link: function(scope, element, attrs, controllers) {\n      // When accessing the element's contents synchronously, they\n      // may not be defined yet because of transclusion. There is a higher\n      // chance that it will be accessible if we wait one frame.\n      $$rAF(function() {\n        var mdNavItem = controllers[0];\n        var mdNavBar = controllers[1];\n        var navButton = angular.element(element[0].querySelector('._md-nav-button'));\n\n        if (!mdNavItem.name) {\n          mdNavItem.name = angular.element(element[0]\n              .querySelector('._md-nav-button-text')).text().trim();\n        }\n\n        navButton.on('click', function() {\n          mdNavBar.mdSelectedNavItem = mdNavItem.name;\n          scope.$apply();\n        });\n\n        $mdAria.expectWithText(element, 'aria-label');\n      });\n    }\n  };\n}\n\n/**\n * Controller for the nav-item component.\n * @param {!angular.JQLite} $element\n * @constructor\n * @final\n * @ngInject\n */\nfunction MdNavItemController($element) {\n\n  /** @private @const {!angular.JQLite} */\n  this._$element = $element;\n\n  // Data-bound variables\n\n  /** @const {?Function} */\n  this.mdNavClick;\n\n  /** @const {?string} */\n  this.mdNavHref;\n\n  /** @const {?string} */\n  this.mdNavSref;\n  /** @const {?Object} */\n  this.srefOpts;\n  /** @const {?string} */\n  this.name;\n\n  // State variables\n  /** @private {boolean} */\n  this._selected = false;\n\n  /** @private {boolean} */\n  this._focused = false;\n}\n\n/**\n * Returns a map of class names and values for use by ng-class.\n * @return {!Object<string,boolean>}\n */\nMdNavItemController.prototype.getNgClassMap = function() {\n  return {\n    'md-active': this._selected,\n    'md-primary': this._selected,\n    'md-unselected': !this._selected,\n    'md-focused': this._focused,\n  };\n};\n\n/**\n * Get the name attribute of the tab.\n * @return {string}\n */\nMdNavItemController.prototype.getName = function() {\n  return this.name;\n};\n\n/**\n * Get the button element associated with the tab.\n * @return {!Element}\n */\nMdNavItemController.prototype.getButtonEl = function() {\n  return this._$element[0].querySelector('._md-nav-button');\n};\n\n/**\n * Set the selected state of the tab.\n * @param {boolean} isSelected\n */\nMdNavItemController.prototype.setSelected = function(isSelected) {\n  this._selected = isSelected;\n};\n\n/**\n * @return {boolean}\n */\nMdNavItemController.prototype.isSelected = function() {\n  return this._selected;\n};\n\n/**\n * Set the focused state of the tab.\n * @param {boolean} isFocused\n */\nMdNavItemController.prototype.setFocused = function(isFocused) {\n  this._focused = isFocused;\n\n  if (isFocused) {\n    this.getButtonEl().focus();\n  }\n};\n\n/**\n * @return {boolean}\n */\nMdNavItemController.prototype.hasFocus = function() {\n  return this._focused;\n};\n\n})();\n(function(){\n\"use strict\";\n\n/**\n * @ngdoc module\n * @name material.components.progressCircular\n * @description Module for a circular progressbar\n */\n\nangular.module('material.components.progressCircular', ['material.core']);\n\n})();\n(function(){\n\"use strict\";\n\n/**\n * @ngdoc module\n * @name material.components.panel\n */\nMdPanelService.$inject = [\"presets\", \"$rootElement\", \"$rootScope\", \"$injector\", \"$window\"];\nangular\n  .module('material.components.panel', [\n    'material.core',\n    'material.components.backdrop'\n  ])\n  .provider('$mdPanel', MdPanelProvider);\n\n\n/*****************************************************************************\n *                            PUBLIC DOCUMENTATION                           *\n *****************************************************************************/\n\n\n/**\n * @ngdoc service\n * @name $mdPanelProvider\n * @module material.components.panel\n *\n * @description\n * `$mdPanelProvider` allows users to create configuration presets that will be\n * stored within a cached presets object. When the configuration is needed, the\n * user can request the preset by passing it as the first parameter in the\n * `$mdPanel.create` or `$mdPanel.open` methods.\n *\n * @usage\n * <hljs lang=\"js\">\n * (function(angular, undefined) {\n *   'use strict';\n *\n *   angular\n *       .module('demoApp', ['ngMaterial'])\n *       .config(DemoConfig)\n *       .controller('DemoCtrl', DemoCtrl)\n *       .controller('DemoMenuCtrl', DemoMenuCtrl);\n *\n *   function DemoConfig($mdPanelProvider) {\n *     $mdPanelProvider.definePreset('demoPreset', {\n *       attachTo: angular.element(document.body),\n *       controller: DemoMenuCtrl,\n *       controllerAs: 'ctrl',\n *       template: '' +\n *           '<div class=\"menu-panel\" md-whiteframe=\"4\">' +\n *           '  <div class=\"menu-content\">' +\n *           '    <div class=\"menu-item\" ng-repeat=\"item in ctrl.items\">' +\n *           '      <button class=\"md-button\">' +\n *           '        <span>{{item}}</span>' +\n *           '      </button>' +\n *           '    </div>' +\n *           '    <md-divider></md-divider>' +\n *           '    <div class=\"menu-item\">' +\n *           '      <button class=\"md-button\" ng-click=\"ctrl.closeMenu()\">' +\n *           '        <span>Close Menu</span>' +\n *           '      </button>' +\n *           '    </div>' +\n *           '  </div>' +\n *           '</div>',\n *       panelClass: 'menu-panel-container',\n *       focusOnOpen: false,\n *       zIndex: 100,\n *       propagateContainerEvents: true,\n *       groupName: 'menus'\n *     });\n *   }\n *\n *   function PanelProviderCtrl($mdPanel) {\n *     this.navigation = {\n *       name: 'navigation',\n *       items: [\n *         'Home',\n *         'About',\n *         'Contact'\n *       ]\n *     };\n *     this.favorites = {\n *       name: 'favorites',\n *       items: [\n *         'Add to Favorites'\n *       ]\n *     };\n *     this.more = {\n *       name: 'more',\n *       items: [\n *         'Account',\n *         'Sign Out'\n *       ]\n *     };\n *\n *     $mdPanel.newPanelGroup('menus', {\n *       maxOpen: 2\n *     });\n *\n *     this.showMenu = function($event, menu) {\n *       $mdPanel.open('demoPreset', {\n *         id: 'menu_' + menu.name,\n *         position: $mdPanel.newPanelPosition()\n *             .relativeTo($event.srcElement)\n *             .addPanelPosition(\n *               $mdPanel.xPosition.ALIGN_START,\n *               $mdPanel.yPosition.BELOW\n *             ),\n *         locals: {\n *           items: menu.items\n *         },\n *         openFrom: $event\n *       });\n *     };\n *   }\n *\n *   function PanelMenuCtrl(mdPanelRef) {\n *     this.closeMenu = function() {\n *       mdPanelRef && mdPanelRef.close();\n *     };\n *   }\n * })(angular);\n * </hljs>\n */\n\n/**\n * @ngdoc method\n * @name $mdPanelProvider#definePreset\n * @description\n * Takes the passed in preset name and preset configuration object and adds it\n * to the `_presets` object of the provider. This `_presets` object is then\n * passed along to the `$mdPanel` service.\n *\n * @param {string} name Preset name.\n * @param {!Object} preset Specific configuration object that can contain any\n *     and all of the parameters avaialble within the `$mdPanel.create` method.\n *     However, parameters that pertain to id, position, animation, and user\n *     interaction are not allowed and will be removed from the preset\n *     configuration.\n */\n\n\n/*****************************************************************************\n *                               MdPanel Service                             *\n *****************************************************************************/\n\n\n/**\n * @ngdoc service\n * @name $mdPanel\n * @module material.components.panel\n *\n * @description\n * `$mdPanel` is a robust, low-level service for creating floating panels on\n * the screen. It can be used to implement tooltips, dialogs, pop-ups, etc.\n *\n * @usage\n * <hljs lang=\"js\">\n * (function(angular, undefined) {\n *   'use strict';\n *\n *   angular\n *       .module('demoApp', ['ngMaterial'])\n *       .controller('DemoDialogController', DialogController);\n *\n *   var panelRef;\n *\n *   function showPanel($event) {\n *     var panelPosition = $mdPanel.newPanelPosition()\n *         .absolute()\n *         .top('50%')\n *         .left('50%');\n *\n *     var panelAnimation = $mdPanel.newPanelAnimation()\n *         .targetEvent($event)\n *         .defaultAnimation('md-panel-animate-fly')\n *         .closeTo('.show-button');\n *\n *     var config = {\n *       attachTo: angular.element(document.body),\n *       controller: DialogController,\n *       controllerAs: 'ctrl',\n *       position: panelPosition,\n *       animation: panelAnimation,\n *       targetEvent: $event,\n *       templateUrl: 'dialog-template.html',\n *       clickOutsideToClose: true,\n *       escapeToClose: true,\n *       focusOnOpen: true\n *     }\n *\n *     $mdPanel.open(config)\n *         .then(function(result) {\n *           panelRef = result;\n *         });\n *   }\n *\n *   function DialogController(MdPanelRef) {\n *     function closeDialog() {\n *       if (MdPanelRef) MdPanelRef.close();\n *     }\n *   }\n * })(angular);\n * </hljs>\n */\n\n/**\n * @ngdoc method\n * @name $mdPanel#create\n * @description\n * Creates a panel with the specified options.\n *\n * @param config {!Object=} Specific configuration object that may contain the\n *     following properties:\n *\n *   - `id` - `{string=}`: An ID to track the panel by. When an ID is provided,\n *     the created panel is added to a tracked panels object. Any subsequent\n *     requests made to create a panel with that ID are ignored. This is useful\n *     in having the panel service not open multiple panels from the same user\n *     interaction when there is no backdrop and events are propagated. Defaults\n *     to an arbitrary string that is not tracked.\n *   - `template` - `{string=}`: HTML template to show in the panel. This\n *     **must** be trusted HTML with respect to AngularJS’s\n *     [$sce service](https://docs.angularjs.org/api/ng/service/$sce).\n *   - `templateUrl` - `{string=}`: The URL that will be used as the content of\n *     the panel.\n *   - `contentElement` - `{(string|!angular.JQLite|!Element)=}`: Pre-compiled\n *     element to be used as the panel's content.\n *   - `controller` - `{(function|string)=}`: The controller to associate with\n *     the panel. The controller can inject a reference to the returned\n *     panelRef, which allows the panel to be closed, hidden, and shown. Any\n *     fields passed in through locals or resolve will be bound to the\n *     controller.\n *   - `controllerAs` - `{string=}`: An alias to assign the controller to on\n *     the scope.\n *   - `bindToController` - `{boolean=}`: Binds locals to the controller\n *     instead of passing them in. Defaults to true, as this is a best\n *     practice.\n *   - `locals` - `{Object=}`: An object containing key/value pairs. The keys\n *     will be used as names of values to inject into the controller. For\n *     example, `locals: {three: 3}` would inject `three` into the controller,\n *     with the value 3.\n *   - `resolve` - `{Object=}`: Similar to locals, except it takes promises as\n *     values. The panel will not open until all of the promises resolve.\n *   - `attachTo` - `{(string|!angular.JQLite|!Element)=}`: The element to\n *     attach the panel to. Defaults to appending to the root element of the\n *     application.\n *   - `propagateContainerEvents` - `{boolean=}`: Whether pointer or touch\n *     events should be allowed to propagate 'go through' the container, aka the\n *     wrapper, of the panel. Defaults to false.\n *   - `panelClass` - `{string=}`: A css class to apply to the panel element.\n *     This class should define any borders, box-shadow, etc. for the panel.\n *   - `zIndex` - `{number=}`: The z-index to place the panel at.\n *     Defaults to 80.\n *   - `position` - `{MdPanelPosition=}`: An MdPanelPosition object that\n *     specifies the alignment of the panel. For more information, see\n *     `MdPanelPosition`.\n *   - `clickOutsideToClose` - `{boolean=}`: Whether the user can click\n *     outside the panel to close it. Defaults to false.\n *   - `escapeToClose` - `{boolean=}`: Whether the user can press escape to\n *     close the panel. Defaults to false.\n *   - `onCloseSuccess` - `{function(!panelRef, string)=}`: Function that is\n *     called after the close successfully finishes. The first parameter passed\n *     into this function is the current panelRef and the 2nd is an optional\n *     string explaining the close reason. The currently supported closeReasons\n *     can be found in the MdPanelRef.closeReasons enum. These are by default\n *     passed along by the panel.\n *   - `trapFocus` - `{boolean=}`: Whether focus should be trapped within the\n *     panel. If `trapFocus` is true, the user will not be able to interact\n *     with the rest of the page until the panel is dismissed. Defaults to\n *     false.\n *   - `focusOnOpen` - `{boolean=}`: An option to override focus behavior on\n *     open. Only disable if focusing some other way, as focus management is\n *     required for panels to be accessible. Defaults to true.\n *   - `fullscreen` - `{boolean=}`: Whether the panel should be full screen.\n *     Applies the class `._md-panel-fullscreen` to the panel on open. Defaults\n *     to false.\n *   - `animation` - `{MdPanelAnimation=}`: An MdPanelAnimation object that\n *     specifies the animation of the panel. For more information, see\n *     `MdPanelAnimation`.\n *   - `hasBackdrop` - `{boolean=}`: Whether there should be an opaque backdrop\n *     behind the panel. Defaults to false.\n *   - `disableParentScroll` - `{boolean=}`: Whether the user can scroll the\n *     page behind the panel. Defaults to false.\n *   - `onDomAdded` - `{function=}`: Callback function used to announce when\n *     the panel is added to the DOM.\n *   - `onOpenComplete` - `{function=}`: Callback function used to announce\n *     when the open() action is finished.\n *   - `onRemoving` - `{function=}`: Callback function used to announce the\n *     close/hide() action is starting.\n *   - `onDomRemoved` - `{function=}`: Callback function used to announce when\n *     the panel is removed from the DOM.\n *   - `origin` - `{(string|!angular.JQLite|!Element)=}`: The element to focus\n *     on when the panel closes. This is commonly the element which triggered\n *     the opening of the panel. If you do not use `origin`, you need to control\n *     the focus manually.\n *   - `groupName` - `{(string|!Array<string>)=}`: A group name or an array of\n *     group names. The group name is used for creating a group of panels. The\n *     group is used for configuring the number of open panels and identifying\n *     specific behaviors for groups. For instance, all tooltips could be\n *     identified using the same groupName.\n *\n * @returns {!MdPanelRef} panelRef\n */\n\n/**\n * @ngdoc method\n * @name $mdPanel#open\n * @description\n * Calls the create method above, then opens the panel. This is a shortcut for\n * creating and then calling open manually. If custom methods need to be\n * called when the panel is added to the DOM or opened, do not use this method.\n * Instead create the panel, chain promises on the domAdded and openComplete\n * methods, and call open from the returned panelRef.\n *\n * @param {!Object=} config Specific configuration object that may contain\n *     the properties defined in `$mdPanel.create`.\n * @returns {!angular.$q.Promise<!MdPanelRef>} panelRef A promise that resolves\n *     to an instance of the panel.\n */\n\n/**\n * @ngdoc method\n * @name $mdPanel#newPanelPosition\n * @description\n * Returns a new instance of the MdPanelPosition object. Use this to create\n * the position config object.\n *\n * @returns {!MdPanelPosition} panelPosition\n */\n\n/**\n * @ngdoc method\n * @name $mdPanel#newPanelAnimation\n * @description\n * Returns a new instance of the MdPanelAnimation object. Use this to create\n * the animation config object.\n *\n * @returns {!MdPanelAnimation} panelAnimation\n */\n\n/**\n * @ngdoc method\n * @name $mdPanel#newPanelGroup\n * @description\n * Creates a panel group and adds it to a tracked list of panel groups.\n *\n * @param {string} groupName Name of the group to create.\n * @param {!Object=} config Specific configuration object that may contain the\n *     following properties:\n *\n *   - `maxOpen` - `{number=}`: The maximum number of panels that are allowed to\n *     be open within a defined panel group.\n *\n * @returns {!Object<string,\n *     {panels: !Array<!MdPanelRef>,\n *     openPanels: !Array<!MdPanelRef>,\n *     maxOpen: number}>} panelGroup\n */\n\n/**\n * @ngdoc method\n * @name $mdPanel#setGroupMaxOpen\n * @description\n * Sets the maximum number of panels in a group that can be opened at a given\n * time.\n *\n * @param {string} groupName The name of the group to configure.\n * @param {number} maxOpen The maximum number of panels that can be\n *     opened. Infinity can be passed in to remove the maxOpen limit.\n */\n\n\n/*****************************************************************************\n *                                 MdPanelRef                                *\n *****************************************************************************/\n\n\n/**\n * @ngdoc type\n * @name MdPanelRef\n * @module material.components.panel\n * @description\n * A reference to a created panel. This reference contains a unique id for the\n * panel, along with the following properties:\n *\n *   - `id` - `{string}`: The unique id for the panel. This id is used to track\n *     when a panel was interacted with.\n *   - `config` - `{!Object=}`: The entire config object that was used in\n *     create.\n *   - `isAttached` - `{boolean}`: Whether the panel is attached to the DOM.\n *     Visibility to the user does not factor into isAttached.\n *   - `panelContainer` - `{angular.JQLite}`: The wrapper element containing the\n *     panel. This property is added in order to have access to the `addClass`,\n *     `removeClass`, `toggleClass`, etc methods.\n *   - `panelEl` - `{angular.JQLite}`: The panel element. This property is added\n *     in order to have access to the `addClass`, `removeClass`, `toggleClass`,\n *     etc methods.\n */\n\n/**\n * @ngdoc method\n * @name MdPanelRef#open\n * @description\n * Attaches and shows the panel.\n *\n * @returns {!angular.$q.Promise} A promise that is resolved when the panel is\n *     opened.\n */\n\n/**\n * @ngdoc method\n * @name MdPanelRef#close\n * @description\n * Hides and detaches the panel. Note that this will **not** destroy the panel.\n * If you don't intend on using the panel again, call the {@link #destroy\n * destroy} method afterwards.\n *\n * @returns {!angular.$q.Promise} A promise that is resolved when the panel is\n *     closed.\n */\n\n/**\n * @ngdoc method\n * @name MdPanelRef#attach\n * @description\n * Create the panel elements and attach them to the DOM. The panel will be\n * hidden by default.\n *\n * @returns {!angular.$q.Promise} A promise that is resolved when the panel is\n *     attached.\n */\n\n/**\n * @ngdoc method\n * @name MdPanelRef#detach\n * @description\n * Removes the panel from the DOM. This will NOT hide the panel before removing\n * it.\n *\n * @returns {!angular.$q.Promise} A promise that is resolved when the panel is\n *     detached.\n */\n\n/**\n * @ngdoc method\n * @name MdPanelRef#show\n * @description\n * Shows the panel.\n *\n * @returns {!angular.$q.Promise} A promise that is resolved when the panel has\n *     shown and animations are completed.\n */\n\n/**\n * @ngdoc method\n * @name MdPanelRef#hide\n * @description\n * Hides the panel.\n *\n * @returns {!angular.$q.Promise} A promise that is resolved when the panel has\n *     hidden and animations are completed.\n */\n\n/**\n * @ngdoc method\n * @name MdPanelRef#destroy\n * @description\n * Destroys the panel. The panel cannot be opened again after this is called.\n */\n\n/**\n * @ngdoc method\n * @name MdPanelRef#addClass\n * @deprecated\n * This method is in the process of being deprecated in favor of using the panel\n * and container JQLite elements that are referenced in the MdPanelRef object.\n * Full deprecation is scheduled for material 1.2.\n * @description\n * Adds a class to the panel. DO NOT use this hide/show the panel.\n *\n * @param {string} newClass class to be added.\n * @param {boolean} toElement Whether or not to add the class to the panel\n *     element instead of the container.\n */\n\n/**\n * @ngdoc method\n * @name MdPanelRef#removeClass\n * @deprecated\n * This method is in the process of being deprecated in favor of using the panel\n * and container JQLite elements that are referenced in the MdPanelRef object.\n * Full deprecation is scheduled for material 1.2.\n * @description\n * Removes a class from the panel. DO NOT use this to hide/show the panel.\n *\n * @param {string} oldClass Class to be removed.\n * @param {boolean} fromElement Whether or not to remove the class from the\n *     panel element instead of the container.\n */\n\n/**\n * @ngdoc method\n * @name MdPanelRef#toggleClass\n * @deprecated\n * This method is in the process of being deprecated in favor of using the panel\n * and container JQLite elements that are referenced in the MdPanelRef object.\n * Full deprecation is scheduled for material 1.2.\n * @description\n * Toggles a class on the panel. DO NOT use this to hide/show the panel.\n *\n * @param {string} toggleClass Class to be toggled.\n * @param {boolean} onElement Whether or not to remove the class from the panel\n *     element instead of the container.\n */\n\n/**\n * @ngdoc method\n * @name MdPanelRef#updatePosition\n * @description\n * Updates the position configuration of a panel. Use this to update the\n * position of a panel that is open, without having to close and re-open the\n * panel.\n *\n * @param {!MdPanelPosition} position\n */\n\n/**\n * @ngdoc method\n * @name MdPanelRef#addToGroup\n * @description\n * Adds a panel to a group if the panel does not exist within the group already.\n * A panel can only exist within a single group.\n *\n * @param {string} groupName The name of the group to add the panel to.\n */\n\n/**\n * @ngdoc method\n * @name MdPanelRef#removeFromGroup\n * @description\n * Removes a panel from a group if the panel exists within that group. The group\n * must be created ahead of time.\n *\n * @param {string} groupName The name of the group.\n */\n\n/**\n * @ngdoc method\n * @name MdPanelRef#registerInterceptor\n * @description\n * Registers an interceptor with the panel. The callback should return a promise,\n * which will allow the action to continue when it gets resolved, or will\n * prevent an action if it is rejected. The interceptors are called sequentially\n * and it reverse order. `type` must be one of the following\n * values available on `$mdPanel.interceptorTypes`:\n * * `CLOSE` - Gets called before the panel begins closing.\n *\n * @param {string} type Type of interceptor.\n * @param {!angular.$q.Promise<any>} callback Callback to be registered.\n * @returns {!MdPanelRef}\n */\n\n/**\n * @ngdoc method\n * @name MdPanelRef#removeInterceptor\n * @description\n * Removes a registered interceptor.\n *\n * @param {string} type Type of interceptor to be removed.\n * @param {function(): !angular.$q.Promise<any>} callback Interceptor to be removed.\n * @returns {!MdPanelRef}\n */\n\n/**\n * @ngdoc method\n * @name MdPanelRef#removeAllInterceptors\n * @description\n * Removes all interceptors. If a type is supplied, only the\n * interceptors of that type will be cleared.\n *\n * @param {string=} type Type of interceptors to be removed.\n * @returns {!MdPanelRef}\n */\n\n/**\n * @ngdoc method\n * @name MdPanelRef#updateAnimation\n * @description\n * Updates the animation configuration for a panel. You can use this to change\n * the panel's animation without having to re-create it.\n *\n * @param {!MdPanelAnimation} animation\n */\n\n\n/*****************************************************************************\n *                               MdPanelPosition                            *\n *****************************************************************************/\n\n\n/**\n * @ngdoc type\n * @name MdPanelPosition\n * @module material.components.panel\n * @description\n *\n * Object for configuring the position of the panel.\n *\n * @usage\n *\n * #### Centering the panel\n *\n * <hljs lang=\"js\">\n * new MdPanelPosition().absolute().center();\n * </hljs>\n *\n * #### Overlapping the panel with an element\n *\n * <hljs lang=\"js\">\n * new MdPanelPosition()\n *     .relativeTo(someElement)\n *     .addPanelPosition(\n *       $mdPanel.xPosition.ALIGN_START,\n *       $mdPanel.yPosition.ALIGN_TOPS\n *     );\n * </hljs>\n *\n * #### Aligning the panel with the bottom of an element\n *\n * <hljs lang=\"js\">\n * new MdPanelPosition()\n *     .relativeTo(someElement)\n *     .addPanelPosition($mdPanel.xPosition.CENTER, $mdPanel.yPosition.BELOW);\n * </hljs>\n */\n\n/**\n * @ngdoc method\n * @name MdPanelPosition#absolute\n * @description\n * Positions the panel absolutely relative to the parent element. If the parent\n * is document.body, this is equivalent to positioning the panel absolutely\n * within the viewport.\n *\n * @returns {!MdPanelPosition}\n */\n\n/**\n * @ngdoc method\n * @name MdPanelPosition#relativeTo\n * @description\n * Positions the panel relative to a specific element.\n *\n * @param {string|!Element|!angular.JQLite} element Query selector, DOM element,\n *     or angular element to position the panel with respect to.\n * @returns {!MdPanelPosition}\n */\n\n/**\n * @ngdoc method\n * @name MdPanelPosition#top\n * @description\n * Sets the value of `top` for the panel. Clears any previously set vertical\n * position.\n *\n * @param {string=} top Value of `top`. Defaults to '0'.\n * @returns {!MdPanelPosition}\n */\n\n/**\n * @ngdoc method\n * @name MdPanelPosition#bottom\n * @description\n * Sets the value of `bottom` for the panel. Clears any previously set vertical\n * position.\n *\n * @param {string=} bottom Value of `bottom`. Defaults to '0'.\n * @returns {!MdPanelPosition}\n */\n\n/**\n * @ngdoc method\n * @name MdPanelPosition#start\n * @description\n * Sets the panel to the start of the page - `left` if `ltr` or `right` for\n * `rtl`. Clears any previously set horizontal position.\n *\n * @param {string=} start Value of position. Defaults to '0'.\n * @returns {!MdPanelPosition}\n */\n\n/**\n * @ngdoc method\n * @name MdPanelPosition#end\n * @description\n * Sets the panel to the end of the page - `right` if `ltr` or `left` for `rtl`.\n * Clears any previously set horizontal position.\n *\n * @param {string=} end Value of position. Defaults to '0'.\n * @returns {!MdPanelPosition}\n */\n\n/**\n * @ngdoc method\n * @name MdPanelPosition#left\n * @description\n * Sets the value of `left` for the panel. Clears any previously set\n * horizontal position.\n *\n * @param {string=} left Value of `left`. Defaults to '0'.\n * @returns {!MdPanelPosition}\n */\n\n/**\n * @ngdoc method\n * @name MdPanelPosition#right\n * @description\n * Sets the value of `right` for the panel. Clears any previously set\n * horizontal position.\n *\n * @param {string=} right Value of `right`. Defaults to '0'.\n * @returns {!MdPanelPosition}\n */\n\n/**\n * @ngdoc method\n * @name MdPanelPosition#centerHorizontally\n * @description\n * Centers the panel horizontally in the viewport. Clears any previously set\n * horizontal position.\n *\n * @returns {!MdPanelPosition}\n */\n\n/**\n * @ngdoc method\n * @name MdPanelPosition#centerVertically\n * @description\n * Centers the panel vertically in the viewport. Clears any previously set\n * vertical position.\n *\n * @returns {!MdPanelPosition}\n */\n\n/**\n * @ngdoc method\n * @name MdPanelPosition#center\n * @description\n * Centers the panel horizontally and vertically in the viewport. This is\n * equivalent to calling both `centerHorizontally` and `centerVertically`.\n * Clears any previously set horizontal and vertical positions.\n *\n * @returns {!MdPanelPosition}\n */\n\n/**\n * @ngdoc method\n * @name MdPanelPosition#addPanelPosition\n * @description\n * Sets the x and y position for the panel relative to another element. Can be\n * called multiple times to specify an ordered list of panel positions. The\n * first position which allows the panel to be completely on-screen will be\n * chosen; the last position will be chose whether it is on-screen or not.\n *\n * xPosition must be one of the following values available on\n * $mdPanel.xPosition:\n *\n *\n * CENTER | ALIGN_START | ALIGN_END | OFFSET_START | OFFSET_END\n *\n * <pre>\n *    *************\n *    *           *\n *    *   PANEL   *\n *    *           *\n *    *************\n *   A B    C    D E\n *\n * A: OFFSET_START (for LTR displays)\n * B: ALIGN_START (for LTR displays)\n * C: CENTER\n * D: ALIGN_END (for LTR displays)\n * E: OFFSET_END (for LTR displays)\n * </pre>\n *\n * yPosition must be one of the following values available on\n * $mdPanel.yPosition:\n *\n * CENTER | ALIGN_TOPS | ALIGN_BOTTOMS | ABOVE | BELOW\n *\n * <pre>\n *   F\n *   G *************\n *     *           *\n *   H *   PANEL   *\n *     *           *\n *   I *************\n *   J\n *\n * F: BELOW\n * G: ALIGN_TOPS\n * H: CENTER\n * I: ALIGN_BOTTOMS\n * J: ABOVE\n * </pre>\n *\n * @param {string} xPosition\n * @param {string} yPosition\n * @returns {!MdPanelPosition}\n */\n\n/**\n * @ngdoc method\n * @name MdPanelPosition#withOffsetX\n * @description\n * Sets the value of the offset in the x-direction.\n *\n * @param {string} offsetX\n * @returns {!MdPanelPosition}\n */\n\n/**\n * @ngdoc method\n * @name MdPanelPosition#withOffsetY\n * @description\n * Sets the value of the offset in the y-direction.\n *\n * @param {string} offsetY\n * @returns {!MdPanelPosition}\n */\n\n\n/*****************************************************************************\n *                               MdPanelAnimation                            *\n *****************************************************************************/\n\n\n/**\n * @ngdoc type\n * @name MdPanelAnimation\n * @module material.components.panel\n * @description\n * Animation configuration object. To use, create an MdPanelAnimation with the\n * desired properties, then pass the object as part of $mdPanel creation.\n *\n * @usage\n *\n * <hljs lang=\"js\">\n * var panelAnimation = new MdPanelAnimation()\n *     .openFrom(myButtonEl)\n *     .duration(1337)\n *     .closeTo('.my-button')\n *     .withAnimation($mdPanel.animation.SCALE);\n *\n * $mdPanel.create({\n *   animation: panelAnimation\n * });\n * </hljs>\n */\n\n/**\n * @ngdoc method\n * @name MdPanelAnimation#openFrom\n * @description\n * Specifies where to start the open animation. `openFrom` accepts a\n * click event object, query selector, DOM element, or a Rect object that\n * is used to determine the bounds. When passed a click event, the location\n * of the click will be used as the position to start the animation.\n *\n * @param {string|!Element|!Event|{top: number, left: number}}\n * @returns {!MdPanelAnimation}\n */\n\n/**\n * @ngdoc method\n * @name MdPanelAnimation#closeTo\n * @description\n * Specifies where to animate the panel close. `closeTo` accepts a\n * query selector, DOM element, or a Rect object that is used to determine\n * the bounds.\n *\n * @param {string|!Element|{top: number, left: number}}\n * @returns {!MdPanelAnimation}\n */\n\n/**\n * @ngdoc method\n * @name MdPanelAnimation#withAnimation\n * @description\n * Specifies the animation class.\n *\n * There are several default animations that can be used:\n * ($mdPanel.animation)\n *   SLIDE: The panel slides in and out from the specified\n *       elements. It will not fade in or out.\n *   SCALE: The panel scales in and out. Slide and fade are\n *       included in this animation.\n *   FADE: The panel fades in and out.\n *\n * Custom classes will by default fade in and out unless\n * \"transition: opacity 1ms\" is added to the to custom class.\n *\n * @param {string|{open: string, close: string}} cssClass\n * @returns {!MdPanelAnimation}\n */\n\n/**\n * @ngdoc method\n * @name MdPanelAnimation#duration\n * @description\n * Specifies the duration of the animation in milliseconds. The `duration`\n * method accepts either a number or an object with separate open and close\n * durations.\n *\n * @param {number|{open: number, close: number}} duration\n * @returns {!MdPanelAnimation}\n */\n\n\n/*****************************************************************************\n *                            PUBLIC DOCUMENTATION                           *\n *****************************************************************************/\n\n\nvar MD_PANEL_Z_INDEX = 80;\nvar MD_PANEL_HIDDEN = '_md-panel-hidden';\nvar FOCUS_TRAP_TEMPLATE = angular.element(\n    '<div class=\"_md-panel-focus-trap\" tabindex=\"0\"></div>');\n\nvar _presets = {};\n\n\n/**\n * A provider that is used for creating presets for the panel API.\n * @final @constructor @ngInject\n */\nfunction MdPanelProvider() {\n  return {\n    'definePreset': definePreset,\n    'getAllPresets': getAllPresets,\n    'clearPresets': clearPresets,\n    '$get': $getProvider()\n  };\n}\n\n\n/**\n * Takes the passed in panel configuration object and adds it to the `_presets`\n * object at the specified name.\n * @param {string} name Name of the preset to set.\n * @param {!Object} preset Specific configuration object that can contain any\n *     and all of the parameters avaialble within the `$mdPanel.create` method.\n *     However, parameters that pertain to id, position, animation, and user\n *     interaction are not allowed and will be removed from the preset\n *     configuration.\n */\nfunction definePreset(name, preset) {\n  if (!name || !preset) {\n    throw new Error('mdPanelProvider: The panel preset definition is ' +\n        'malformed. The name and preset object are required.');\n  } else if (_presets.hasOwnProperty(name)) {\n    throw new Error('mdPanelProvider: The panel preset you have requested ' +\n        'has already been defined.');\n  }\n\n  // Delete any property on the preset that is not allowed.\n  delete preset.id;\n  delete preset.position;\n  delete preset.animation;\n\n  _presets[name] = preset;\n}\n\n\n/**\n * Gets a clone of the `_presets`.\n * @return {!Object}\n */\nfunction getAllPresets() {\n  return angular.copy(_presets);\n}\n\n\n/**\n * Clears all of the stored presets.\n */\nfunction clearPresets() {\n  _presets = {};\n}\n\n\n/**\n * Represents the `$get` method of the AngularJS provider. From here, a new\n * reference to the MdPanelService is returned where the needed arguments are\n * passed in including the MdPanelProvider `_presets`.\n * @param {!Object} _presets\n * @param {!angular.JQLite} $rootElement\n * @param {!angular.Scope} $rootScope\n * @param {!angular.$injector} $injector\n * @param {!angular.$window} $window\n */\nfunction $getProvider() {\n  return [\n    '$rootElement', '$rootScope', '$injector', '$window',\n    function($rootElement, $rootScope, $injector, $window) {\n      return new MdPanelService(_presets, $rootElement, $rootScope,\n          $injector, $window);\n    }\n  ];\n}\n\n\n/*****************************************************************************\n *                               MdPanel Service                             *\n *****************************************************************************/\n\n\n/**\n * A service that is used for controlling/displaying panels on the screen.\n * @param {!Object} presets\n * @param {!angular.JQLite} $rootElement\n * @param {!angular.Scope} $rootScope\n * @param {!angular.$injector} $injector\n * @param {!angular.$window} $window\n * @final @constructor @ngInject\n */\nfunction MdPanelService(presets, $rootElement, $rootScope, $injector, $window) {\n  /**\n   * Default config options for the panel.\n   * Anything angular related needs to be done later. Therefore\n   *     scope: $rootScope.$new(true),\n   *     attachTo: $rootElement,\n   * are added later.\n   * @private {!Object}\n   */\n  this._defaultConfigOptions = {\n    bindToController: true,\n    clickOutsideToClose: false,\n    disableParentScroll: false,\n    escapeToClose: false,\n    focusOnOpen: true,\n    fullscreen: false,\n    hasBackdrop: false,\n    propagateContainerEvents: false,\n    transformTemplate: angular.bind(this, this._wrapTemplate),\n    trapFocus: false,\n    zIndex: MD_PANEL_Z_INDEX\n  };\n\n  /** @private {!Object} */\n  this._config = {};\n\n  /** @private {!Object} */\n  this._presets = presets;\n\n  /** @private @const */\n  this._$rootElement = $rootElement;\n\n  /** @private @const */\n  this._$rootScope = $rootScope;\n\n  /** @private @const */\n  this._$injector = $injector;\n\n  /** @private @const */\n  this._$window = $window;\n\n  /** @private @const */\n  this._$mdUtil = this._$injector.get('$mdUtil');\n\n  /** @private {!Object<string, !MdPanelRef>} */\n  this._trackedPanels = {};\n\n  /**\n   * @private {!Object<string,\n   *     {panels: !Array<!MdPanelRef>,\n   *     openPanels: !Array<!MdPanelRef>,\n   *     maxOpen: number}>}\n   */\n  this._groups = Object.create(null);\n\n  /**\n   * Default animations that can be used within the panel.\n   * @type {enum}\n   */\n  this.animation = MdPanelAnimation.animation;\n\n  /**\n   * Possible values of xPosition for positioning the panel relative to\n   * another element.\n   * @type {enum}\n   */\n  this.xPosition = MdPanelPosition.xPosition;\n\n  /**\n   * Possible values of yPosition for positioning the panel relative to\n   * another element.\n   * @type {enum}\n   */\n  this.yPosition = MdPanelPosition.yPosition;\n\n  /**\n   * Possible values for the interceptors that can be registered on a panel.\n   * @type {enum}\n   */\n  this.interceptorTypes = MdPanelRef.interceptorTypes;\n\n  /**\n   * Possible values for closing of a panel.\n   * @type {enum}\n   */\n  this.closeReasons = MdPanelRef.closeReasons;\n\n  /**\n   * Possible values of absolute position.\n   * @type {enum}\n   */\n  this.absPosition = MdPanelPosition.absPosition;\n}\n\n\n/**\n * Creates a panel with the specified options.\n * @param {string=} preset Name of a preset configuration that can be used to\n *     extend the panel configuration.\n * @param {!Object=} config Configuration object for the panel.\n * @returns {!MdPanelRef}\n */\nMdPanelService.prototype.create = function(preset, config) {\n  if (typeof preset === 'string') {\n    preset = this._getPresetByName(preset);\n  } else if (typeof preset === 'object' &&\n      (angular.isUndefined(config) || !config)) {\n    config = preset;\n    preset = {};\n  }\n\n  preset = preset || {};\n  config = config || {};\n\n  // If the passed-in config contains an ID and the ID is within _trackedPanels,\n  // return the tracked panel after updating its config with the passed-in\n  // config.\n  if (angular.isDefined(config.id) && this._trackedPanels[config.id]) {\n    var trackedPanel = this._trackedPanels[config.id];\n    angular.extend(trackedPanel.config, config);\n    return trackedPanel;\n  }\n\n  // Combine the passed-in config, the _defaultConfigOptions, and the preset\n  // configuration into the `_config`.\n  this._config = angular.extend({\n    // If no ID is set within the passed-in config, then create an arbitrary ID.\n    id: config.id || 'panel_' + this._$mdUtil.nextUid(),\n    scope: this._$rootScope.$new(true),\n    attachTo: this._$rootElement\n  }, this._defaultConfigOptions, config, preset);\n\n  // Create the panelRef and add it to the `_trackedPanels` object.\n  var panelRef = new MdPanelRef(this._config, this._$injector);\n  this._trackedPanels[config.id] = panelRef;\n\n  // Add the panel to each of its requested groups.\n  if (this._config.groupName) {\n    if (angular.isString(this._config.groupName)) {\n      this._config.groupName = [this._config.groupName];\n    }\n    angular.forEach(this._config.groupName, function(group) {\n      panelRef.addToGroup(group);\n    });\n  }\n\n  this._config.scope.$on('$destroy', angular.bind(panelRef, panelRef.detach));\n\n  return panelRef;\n};\n\n\n/**\n * Creates and opens a panel with the specified options.\n * @param {string=} preset Name of a preset configuration that can be used to\n *     extend the panel configuration.\n * @param {!Object=} config Configuration object for the panel.\n * @returns {!angular.$q.Promise<!MdPanelRef>} The panel created from create.\n */\nMdPanelService.prototype.open = function(preset, config) {\n  var panelRef = this.create(preset, config);\n  return panelRef.open().then(function() {\n    return panelRef;\n  });\n};\n\n\n/**\n * Gets a specific preset configuration object saved within `_presets`.\n * @param {string} preset Name of the preset to search for.\n * @returns {!Object} The preset configuration object.\n */\nMdPanelService.prototype._getPresetByName = function(preset) {\n  if (!this._presets[preset]) {\n    throw new Error('mdPanel: The panel preset configuration that you ' +\n        'requested does not exist. Use the $mdPanelProvider to create a ' +\n        'preset before requesting one.');\n  }\n  return this._presets[preset];\n};\n\n\n/**\n * Returns a new instance of the MdPanelPosition. Use this to create the\n * positioning object.\n * @returns {!MdPanelPosition}\n */\nMdPanelService.prototype.newPanelPosition = function() {\n  return new MdPanelPosition(this._$injector);\n};\n\n\n/**\n * Returns a new instance of the MdPanelAnimation. Use this to create the\n * animation object.\n * @returns {!MdPanelAnimation}\n */\nMdPanelService.prototype.newPanelAnimation = function() {\n  return new MdPanelAnimation(this._$injector);\n};\n\n\n/**\n * Creates a panel group and adds it to a tracked list of panel groups.\n * @param groupName {string} Name of the group to create.\n * @param config {!Object=} Specific configuration object that may contain the\n *     following properties:\n *\n *   - `maxOpen` - `{number=}`: The maximum number of panels that are allowed\n *     open within a defined panel group.\n *\n * @returns {!Object<string,\n *     {panels: !Array<!MdPanelRef>,\n *     openPanels: !Array<!MdPanelRef>,\n *     maxOpen: number}>} panelGroup\n */\nMdPanelService.prototype.newPanelGroup = function(groupName, config) {\n  if (!this._groups[groupName]) {\n    config = config || {};\n    var group = {\n      panels: [],\n      openPanels: [],\n      maxOpen: config.maxOpen > 0 ? config.maxOpen : Infinity\n    };\n    this._groups[groupName] = group;\n  }\n  return this._groups[groupName];\n};\n\n\n/**\n * Sets the maximum number of panels in a group that can be opened at a given\n * time.\n * @param {string} groupName The name of the group to configure.\n * @param {number} maxOpen The maximum number of panels that can be\n *     opened. Infinity can be passed in to remove the maxOpen limit.\n */\nMdPanelService.prototype.setGroupMaxOpen = function(groupName, maxOpen) {\n  if (this._groups[groupName]) {\n    this._groups[groupName].maxOpen = maxOpen;\n  } else {\n    throw new Error('mdPanel: Group does not exist yet. Call newPanelGroup().');\n  }\n};\n\n\n/**\n * Determines if the current number of open panels within a group exceeds the\n * limit of allowed open panels.\n * @param {string} groupName The name of the group to check.\n * @returns {boolean} true if open count does exceed maxOpen and false if not.\n * @private\n */\nMdPanelService.prototype._openCountExceedsMaxOpen = function(groupName) {\n  if (this._groups[groupName]) {\n    var group = this._groups[groupName];\n    return group.maxOpen > 0 && group.openPanels.length > group.maxOpen;\n  }\n  return false;\n};\n\n\n/**\n * Closes the first open panel within a specific group.\n * @param {string} groupName The name of the group.\n * @private\n */\nMdPanelService.prototype._closeFirstOpenedPanel = function(groupName) {\n  this._groups[groupName].openPanels[0].close();\n};\n\n\n/**\n * Wraps the users template in two elements, md-panel-outer-wrapper, which\n * covers the entire attachTo element, and md-panel, which contains only the\n * template. This allows the panel control over positioning, animations,\n * and similar properties.\n * @param {string} origTemplate The original template.\n * @returns {string} The wrapped template.\n * @private\n */\nMdPanelService.prototype._wrapTemplate = function(origTemplate) {\n  var template = origTemplate || '';\n\n  // The panel should be initially rendered offscreen so we can calculate\n  // height and width for positioning.\n  return '' +\n      '<div class=\"md-panel-outer-wrapper\">' +\n      '  <div class=\"md-panel _md-panel-offscreen\">' + template + '</div>' +\n      '</div>';\n};\n\n\n/**\n * Wraps a content element in a md-panel-outer wrapper and\n * positions it off-screen. Allows for proper control over positoning\n * and animations.\n * @param {!angular.JQLite} contentElement Element to be wrapped.\n * @return {!angular.JQLite} Wrapper element.\n * @private\n */\nMdPanelService.prototype._wrapContentElement = function(contentElement) {\n  var wrapper = angular.element('<div class=\"md-panel-outer-wrapper\">');\n\n  contentElement.addClass('md-panel _md-panel-offscreen');\n  wrapper.append(contentElement);\n\n  return wrapper;\n};\n\n\n/*****************************************************************************\n *                                 MdPanelRef                                *\n *****************************************************************************/\n\n\n/**\n * A reference to a created panel. This reference contains a unique id for the\n * panel, along with properties/functions used to control the panel.\n * @param {!Object} config\n * @param {!angular.$injector} $injector\n * @final @constructor\n */\nfunction MdPanelRef(config, $injector) {\n  // Injected variables.\n  /** @private @const {!angular.$q} */\n  this._$q = $injector.get('$q');\n\n  /** @private @const {!angular.$mdCompiler} */\n  this._$mdCompiler = $injector.get('$mdCompiler');\n\n  /** @private @const {!angular.$mdConstant} */\n  this._$mdConstant = $injector.get('$mdConstant');\n\n  /** @private @const {!angular.$mdUtil} */\n  this._$mdUtil = $injector.get('$mdUtil');\n\n  /** @private @const {!angular.$mdTheming} */\n  this._$mdTheming = $injector.get('$mdTheming');\n\n  /** @private @const {!angular.Scope} */\n  this._$rootScope = $injector.get('$rootScope');\n\n  /** @private @const {!angular.$animate} */\n  this._$animate = $injector.get('$animate');\n\n  /** @private @const {!MdPanelRef} */\n  this._$mdPanel = $injector.get('$mdPanel');\n\n  /** @private @const {!angular.$log} */\n  this._$log = $injector.get('$log');\n\n  /** @private @const {!angular.$window} */\n  this._$window = $injector.get('$window');\n\n  /** @private @const {!Function} */\n  this._$$rAF = $injector.get('$$rAF');\n\n  // Public variables.\n  /**\n   * Unique id for the panelRef.\n   * @type {string}\n   */\n  this.id = config.id;\n\n  /** @type {!Object} */\n  this.config = config;\n\n  /** @type {!angular.JQLite|undefined} */\n  this.panelContainer;\n\n  /** @type {!angular.JQLite|undefined} */\n  this.panelEl;\n\n  /**\n   * Whether the panel is attached. This is synchronous. When attach is called,\n   * isAttached is set to true. When detach is called, isAttached is set to\n   * false.\n   * @type {boolean}\n   */\n  this.isAttached = false;\n\n  // Private variables.\n  /** @private {Array<function()>} */\n  this._removeListeners = [];\n\n  /** @private {!angular.JQLite|undefined} */\n  this._topFocusTrap;\n\n  /** @private {!angular.JQLite|undefined} */\n  this._bottomFocusTrap;\n\n  /** @private {!$mdPanel|undefined} */\n  this._backdropRef;\n\n  /** @private {Function?} */\n  this._restoreScroll = null;\n\n  /**\n   * Keeps track of all the panel interceptors.\n   * @private {!Object}\n   */\n  this._interceptors = Object.create(null);\n\n  /**\n   * Cleanup function, provided by `$mdCompiler` and assigned after the element\n   * has been compiled. When `contentElement` is used, the function is used to\n   * restore the element to it's proper place in the DOM.\n   * @private {!Function}\n   */\n  this._compilerCleanup = null;\n\n  /**\n   * Cache for saving and restoring element inline styles, CSS classes etc.\n   * @type {{styles: string, classes: string}}\n   */\n  this._restoreCache = {\n    styles: '',\n    classes: ''\n  };\n}\n\n\nMdPanelRef.interceptorTypes = {\n  CLOSE: 'onClose'\n};\n\n\n/**\n * Opens an already created and configured panel. If the panel is already\n * visible, does nothing.\n * @returns {!angular.$q.Promise<!MdPanelRef>} A promise that is resolved when\n *     the panel is opened and animations finish.\n */\nMdPanelRef.prototype.open = function() {\n  var self = this;\n  return this._$q(function(resolve, reject) {\n    var done = self._done(resolve, self);\n    var show = self._simpleBind(self.show, self);\n    var checkGroupMaxOpen = function() {\n      if (self.config.groupName) {\n        angular.forEach(self.config.groupName, function(group) {\n          if (self._$mdPanel._openCountExceedsMaxOpen(group)) {\n            self._$mdPanel._closeFirstOpenedPanel(group);\n          }\n        });\n      }\n    };\n\n    self.attach()\n        .then(show)\n        .then(checkGroupMaxOpen)\n        .then(done)\n        .catch(reject);\n  });\n};\n\n\n/**\n * Closes the panel.\n * @param {string} closeReason The event type that triggered the close.\n * @returns {!angular.$q.Promise<!MdPanelRef>} A promise that is resolved when\n *     the panel is closed and animations finish.\n */\nMdPanelRef.prototype.close = function(closeReason) {\n  var self = this;\n\n  return this._$q(function(resolve, reject) {\n    self._callInterceptors(MdPanelRef.interceptorTypes.CLOSE).then(function() {\n      var done = self._done(resolve, self);\n      var detach = self._simpleBind(self.detach, self);\n      var onCloseSuccess = self.config['onCloseSuccess'] || angular.noop;\n      onCloseSuccess = angular.bind(self, onCloseSuccess, self, closeReason);\n\n      self.hide()\n          .then(detach)\n          .then(done)\n          .then(onCloseSuccess)\n          .catch(reject);\n    }, reject);\n  });\n};\n\n\n/**\n * Attaches the panel. The panel will be hidden afterwards.\n * @returns {!angular.$q.Promise<!MdPanelRef>} A promise that is resolved when\n *     the panel is attached.\n */\nMdPanelRef.prototype.attach = function() {\n  if (this.isAttached && this.panelEl) {\n    return this._$q.when(this);\n  }\n\n  var self = this;\n  return this._$q(function(resolve, reject) {\n    var done = self._done(resolve, self);\n    var onDomAdded = self.config['onDomAdded'] || angular.noop;\n    var addListeners = function(response) {\n      self.isAttached = true;\n      self._addEventListeners();\n      return response;\n    };\n\n    self._$q.all([\n        self._createBackdrop(),\n        self._createPanel()\n            .then(addListeners)\n            .catch(reject)\n    ]).then(onDomAdded)\n      .then(done)\n      .catch(reject);\n  });\n};\n\n\n/**\n * Only detaches the panel. Will NOT hide the panel first.\n * @returns {!angular.$q.Promise<!MdPanelRef>} A promise that is resolved when\n *     the panel is detached.\n */\nMdPanelRef.prototype.detach = function() {\n  if (!this.isAttached) {\n    return this._$q.when(this);\n  }\n\n  var self = this;\n  var onDomRemoved = self.config['onDomRemoved'] || angular.noop;\n\n  var detachFn = function() {\n    self._removeEventListeners();\n\n    // Remove the focus traps that we added earlier for keeping focus within\n    // the panel.\n    if (self._topFocusTrap && self._topFocusTrap.parentNode) {\n      self._topFocusTrap.parentNode.removeChild(self._topFocusTrap);\n    }\n\n    if (self._bottomFocusTrap && self._bottomFocusTrap.parentNode) {\n      self._bottomFocusTrap.parentNode.removeChild(self._bottomFocusTrap);\n    }\n\n    if (self._restoreCache.classes) {\n      self.panelEl[0].className = self._restoreCache.classes;\n    }\n\n    // Either restore the saved styles or clear the ones set by mdPanel.\n    self.panelEl[0].style.cssText = self._restoreCache.styles || '';\n\n    self._compilerCleanup();\n    self.panelContainer.remove();\n    self.isAttached = false;\n    return self._$q.when(self);\n  };\n\n  if (this._restoreScroll) {\n    this._restoreScroll();\n    this._restoreScroll = null;\n  }\n\n  return this._$q(function(resolve, reject) {\n    var done = self._done(resolve, self);\n\n    self._$q.all([\n      detachFn(),\n      self._backdropRef ? self._backdropRef.detach() : true\n    ]).then(onDomRemoved)\n      .then(done)\n      .catch(reject);\n  });\n};\n\n\n/**\n * Destroys the panel. The Panel cannot be opened again after this.\n */\nMdPanelRef.prototype.destroy = function() {\n  var self = this;\n  if (this.config.groupName) {\n    angular.forEach(this.config.groupName, function(group) {\n      self.removeFromGroup(group);\n    });\n  }\n  this.config.scope.$destroy();\n  this.config.locals = null;\n  this._interceptors = null;\n};\n\n\n/**\n * Shows the panel.\n * @returns {!angular.$q.Promise<!MdPanelRef>} A promise that is resolved when\n *     the panel has shown and animations finish.\n */\nMdPanelRef.prototype.show = function() {\n  if (!this.panelContainer) {\n    return this._$q(function(resolve, reject) {\n      reject('mdPanel: Panel does not exist yet. Call open() or attach().');\n    });\n  }\n\n  if (!this.panelContainer.hasClass(MD_PANEL_HIDDEN)) {\n    return this._$q.when(this);\n  }\n\n  var self = this;\n  var animatePromise = function() {\n    self.panelContainer.removeClass(MD_PANEL_HIDDEN);\n    return self._animateOpen();\n  };\n\n  return this._$q(function(resolve, reject) {\n    var done = self._done(resolve, self);\n    var onOpenComplete = self.config['onOpenComplete'] || angular.noop;\n    var addToGroupOpen = function() {\n      if (self.config.groupName) {\n        angular.forEach(self.config.groupName, function(group) {\n          self._$mdPanel._groups[group].openPanels.push(self);\n        });\n      }\n    };\n\n    self._$q.all([\n      self._backdropRef ? self._backdropRef.show() : self,\n      animatePromise().then(function() { self._focusOnOpen(); }, reject)\n    ]).then(onOpenComplete)\n      .then(addToGroupOpen)\n      .then(done)\n      .catch(reject);\n  });\n};\n\n\n/**\n * Hides the panel.\n * @returns {!angular.$q.Promise<!MdPanelRef>} A promise that is resolved when\n *     the panel has hidden and animations finish.\n */\nMdPanelRef.prototype.hide = function() {\n  if (!this.panelContainer) {\n    return this._$q(function(resolve, reject) {\n      reject('mdPanel: Panel does not exist yet. Call open() or attach().');\n    });\n  }\n\n  if (this.panelContainer.hasClass(MD_PANEL_HIDDEN)) {\n    return this._$q.when(this);\n  }\n\n  var self = this;\n\n  return this._$q(function(resolve, reject) {\n    var done = self._done(resolve, self);\n    var onRemoving = self.config['onRemoving'] || angular.noop;\n    var hidePanel = function() {\n      self.panelContainer.addClass(MD_PANEL_HIDDEN);\n    };\n    var removeFromGroupOpen = function() {\n      if (self.config.groupName) {\n        var group, index;\n        angular.forEach(self.config.groupName, function(group) {\n          group = self._$mdPanel._groups[group];\n          index = group.openPanels.indexOf(self);\n          if (index > -1) {\n            group.openPanels.splice(index, 1);\n          }\n        });\n      }\n    };\n    var focusOnOrigin = function() {\n      var origin = self.config['origin'];\n      if (origin) {\n        getElement(origin).focus();\n      }\n    };\n\n    self._$q.all([\n      self._backdropRef ? self._backdropRef.hide() : self,\n      self._animateClose()\n          .then(onRemoving)\n          .then(hidePanel)\n          .then(removeFromGroupOpen)\n          .then(focusOnOrigin)\n          .catch(reject)\n    ]).then(done, reject);\n  });\n};\n\n\n/**\n * Add a class to the panel. DO NOT use this to hide/show the panel.\n * @deprecated\n * This method is in the process of being deprecated in favor of using the panel\n * and container JQLite elements that are referenced in the MdPanelRef object.\n * Full deprecation is scheduled for material 1.2.\n *\n * @param {string} newClass Class to be added.\n * @param {boolean} toElement Whether or not to add the class to the panel\n *     element instead of the container.\n */\nMdPanelRef.prototype.addClass = function(newClass, toElement) {\n  this._$log.warn(\n      'mdPanel: The addClass method is in the process of being deprecated. ' +\n      'Full deprecation is scheduled for the AngularJS Material 1.2 release. ' +\n      'To achieve the same results, use the panelContainer or panelEl ' +\n      'JQLite elements that are referenced in MdPanelRef.');\n\n  if (!this.panelContainer) {\n    throw new Error(\n        'mdPanel: Panel does not exist yet. Call open() or attach().');\n  }\n\n  if (!toElement && !this.panelContainer.hasClass(newClass)) {\n    this.panelContainer.addClass(newClass);\n  } else if (toElement && !this.panelEl.hasClass(newClass)) {\n    this.panelEl.addClass(newClass);\n  }\n};\n\n\n/**\n * Remove a class from the panel. DO NOT use this to hide/show the panel.\n * @deprecated\n * This method is in the process of being deprecated in favor of using the panel\n * and container JQLite elements that are referenced in the MdPanelRef object.\n * Full deprecation is scheduled for material 1.2.\n *\n * @param {string} oldClass Class to be removed.\n * @param {boolean} fromElement Whether or not to remove the class from the\n *     panel element instead of the container.\n */\nMdPanelRef.prototype.removeClass = function(oldClass, fromElement) {\n  this._$log.warn(\n      'mdPanel: The removeClass method is in the process of being deprecated. ' +\n      'Full deprecation is scheduled for the AngularJS Material 1.2 release. ' +\n      'To achieve the same results, use the panelContainer or panelEl ' +\n      'JQLite elements that are referenced in MdPanelRef.');\n\n  if (!this.panelContainer) {\n    throw new Error(\n        'mdPanel: Panel does not exist yet. Call open() or attach().');\n  }\n\n  if (!fromElement && this.panelContainer.hasClass(oldClass)) {\n    this.panelContainer.removeClass(oldClass);\n  } else if (fromElement && this.panelEl.hasClass(oldClass)) {\n    this.panelEl.removeClass(oldClass);\n  }\n};\n\n\n/**\n * Toggle a class on the panel. DO NOT use this to hide/show the panel.\n * @deprecated\n * This method is in the process of being deprecated in favor of using the panel\n * and container JQLite elements that are referenced in the MdPanelRef object.\n * Full deprecation is scheduled for material 1.2.\n *\n * @param {string} toggleClass The class to toggle.\n * @param {boolean} onElement Whether or not to toggle the class on the panel\n *     element instead of the container.\n */\nMdPanelRef.prototype.toggleClass = function(toggleClass, onElement) {\n  this._$log.warn(\n      'mdPanel: The toggleClass method is in the process of being deprecated. ' +\n      'Full deprecation is scheduled for the AngularJS Material 1.2 release. ' +\n      'To achieve the same results, use the panelContainer or panelEl ' +\n      'JQLite elements that are referenced in MdPanelRef.');\n\n  if (!this.panelContainer) {\n    throw new Error(\n        'mdPanel: Panel does not exist yet. Call open() or attach().');\n  }\n\n  if (!onElement) {\n    this.panelContainer.toggleClass(toggleClass);\n  } else {\n    this.panelEl.toggleClass(toggleClass);\n  }\n};\n\n\n/**\n * Compiles the panel, according to the passed in config and appends it to\n * the DOM. Helps normalize differences in the compilation process between\n * using a string template and a content element.\n * @returns {!angular.$q.Promise<!MdPanelRef>} Promise that is resolved when\n *     the element has been compiled and added to the DOM.\n * @private\n */\nMdPanelRef.prototype._compile = function() {\n  var self = this;\n\n  // Compile the element via $mdCompiler. Note that when using a\n  // contentElement, the element isn't actually being compiled, rather the\n  // compiler saves it's place in the DOM and provides a way of restoring it.\n  return self._$mdCompiler.compile(self.config).then(function(compileData) {\n    var config = self.config;\n\n    if (config.contentElement) {\n      var panelEl = compileData.element;\n\n      // Since mdPanel modifies the inline styles and CSS classes, we need\n      // to save them in order to be able to restore on close.\n      self._restoreCache.styles = panelEl[0].style.cssText;\n      self._restoreCache.classes = panelEl[0].className;\n\n      self.panelContainer = self._$mdPanel._wrapContentElement(panelEl);\n      self.panelEl = panelEl;\n    } else {\n      self.panelContainer = compileData.link(config['scope']);\n      self.panelEl = angular.element(\n        self.panelContainer[0].querySelector('.md-panel')\n      );\n    }\n\n    // Save a reference to the cleanup function from the compiler.\n    self._compilerCleanup = compileData.cleanup;\n\n    // Attach the panel to the proper place in the DOM.\n    getElement(self.config['attachTo']).append(self.panelContainer);\n\n    return self;\n  });\n};\n\n\n/**\n * Creates a panel and adds it to the dom.\n * @returns {!angular.$q.Promise} A promise that is resolved when the panel is\n *     created.\n * @private\n */\nMdPanelRef.prototype._createPanel = function() {\n  var self = this;\n\n  return this._$q(function(resolve, reject) {\n    if (!self.config.locals) {\n      self.config.locals = {};\n    }\n\n    self.config.locals.mdPanelRef = self;\n\n    self._compile().then(function() {\n      if (self.config['disableParentScroll']) {\n        self._restoreScroll = self._$mdUtil.disableScrollAround(\n          null,\n          self.panelContainer,\n          { disableScrollMask: true }\n        );\n      }\n\n      // Add a custom CSS class to the panel element.\n      if (self.config['panelClass']) {\n        self.panelEl.addClass(self.config['panelClass']);\n      }\n\n      // Handle click and touch events for the panel container.\n      if (self.config['propagateContainerEvents']) {\n        self.panelContainer.css('pointer-events', 'none');\n      }\n\n      // Panel may be outside the $rootElement, tell ngAnimate to animate\n      // regardless.\n      if (self._$animate.pin) {\n        self._$animate.pin(\n          self.panelContainer,\n          getElement(self.config['attachTo'])\n        );\n      }\n\n      self._configureTrapFocus();\n      self._addStyles().then(function() {\n        resolve(self);\n      }, reject);\n    }, reject);\n\n  });\n};\n\n\n/**\n * Adds the styles for the panel, such as positioning and z-index. Also,\n * themes the panel element and panel container using `$mdTheming`.\n * @returns {!angular.$q.Promise<!MdPanelRef>}\n * @private\n */\nMdPanelRef.prototype._addStyles = function() {\n  var self = this;\n  return this._$q(function(resolve) {\n    self.panelContainer.css('z-index', self.config['zIndex']);\n    self.panelEl.css('z-index', self.config['zIndex'] + 1);\n\n    var hideAndResolve = function() {\n      // Theme the element and container.\n      self._setTheming();\n\n      // Remove offscreen class and add hidden class.\n      self.panelEl.removeClass('_md-panel-offscreen');\n      self.panelContainer.addClass(MD_PANEL_HIDDEN);\n\n      resolve(self);\n    };\n\n    if (self.config['fullscreen']) {\n      self.panelEl.addClass('_md-panel-fullscreen');\n      hideAndResolve();\n      return; // Don't setup positioning.\n    }\n\n    var positionConfig = self.config['position'];\n    if (!positionConfig) {\n      hideAndResolve();\n      return; // Don't setup positioning.\n    }\n\n    // Wait for angular to finish processing the template\n    self._$rootScope['$$postDigest'](function() {\n      // Position it correctly. This is necessary so that the panel will have a\n      // defined height and width.\n      self._updatePosition(true);\n\n      // Theme the element and container.\n      self._setTheming();\n\n      resolve(self);\n    });\n  });\n};\n\n\n/**\n * Sets the `$mdTheming` classes on the `panelContainer` and `panelEl`.\n * @private\n */\nMdPanelRef.prototype._setTheming = function() {\n  this._$mdTheming(this.panelEl);\n  this._$mdTheming(this.panelContainer);\n};\n\n\n/**\n * Updates the position configuration of a panel\n * @param {!MdPanelPosition} position\n */\nMdPanelRef.prototype.updatePosition = function(position) {\n  if (!this.panelContainer) {\n    throw new Error(\n        'mdPanel: Panel does not exist yet. Call open() or attach().');\n  }\n\n  this.config['position'] = position;\n  this._updatePosition();\n};\n\n\n/**\n * Calculates and updates the position of the panel.\n * @param {boolean=} init\n * @private\n */\nMdPanelRef.prototype._updatePosition = function(init) {\n  var positionConfig = this.config['position'];\n\n  if (positionConfig) {\n    positionConfig._setPanelPosition(this.panelEl);\n\n    // Hide the panel now that position is known.\n    if (init) {\n      this.panelEl.removeClass('_md-panel-offscreen');\n      this.panelContainer.addClass(MD_PANEL_HIDDEN);\n    }\n\n    this.panelEl.css(\n      MdPanelPosition.absPosition.TOP,\n      positionConfig.getTop()\n    );\n    this.panelEl.css(\n      MdPanelPosition.absPosition.BOTTOM,\n      positionConfig.getBottom()\n    );\n    this.panelEl.css(\n      MdPanelPosition.absPosition.LEFT,\n      positionConfig.getLeft()\n    );\n    this.panelEl.css(\n      MdPanelPosition.absPosition.RIGHT,\n      positionConfig.getRight()\n    );\n  }\n};\n\n\n/**\n * Focuses on the panel or the first focus target.\n * @private\n */\nMdPanelRef.prototype._focusOnOpen = function() {\n  if (this.config['focusOnOpen']) {\n    // Wait for the template to finish rendering to guarantee md-autofocus has\n    // finished adding the class md-autofocus, otherwise the focusable element\n    // isn't available to focus.\n    var self = this;\n    this._$rootScope['$$postDigest'](function() {\n      var target = self._$mdUtil.findFocusTarget(self.panelEl) ||\n          self.panelEl;\n      target.focus();\n    });\n  }\n};\n\n\n/**\n * Shows the backdrop.\n * @returns {!angular.$q.Promise} A promise that is resolved when the backdrop\n *     is created and attached.\n * @private\n */\nMdPanelRef.prototype._createBackdrop = function() {\n  if (this.config.hasBackdrop) {\n    if (!this._backdropRef) {\n      var backdropAnimation = this._$mdPanel.newPanelAnimation()\n          .openFrom(this.config.attachTo)\n          .withAnimation({\n            open: '_md-opaque-enter',\n            close: '_md-opaque-leave'\n          });\n\n      if (this.config.animation) {\n        backdropAnimation.duration(this.config.animation._rawDuration);\n      }\n\n      var backdropConfig = {\n        animation: backdropAnimation,\n        attachTo: this.config.attachTo,\n        focusOnOpen: false,\n        panelClass: '_md-panel-backdrop',\n        zIndex: this.config.zIndex - 1\n      };\n\n      this._backdropRef = this._$mdPanel.create(backdropConfig);\n    }\n    if (!this._backdropRef.isAttached) {\n      return this._backdropRef.attach();\n    }\n  }\n};\n\n\n/**\n * Listen for escape keys and outside clicks to auto close.\n * @private\n */\nMdPanelRef.prototype._addEventListeners = function() {\n  this._configureEscapeToClose();\n  this._configureClickOutsideToClose();\n  this._configureScrollListener();\n};\n\n\n/**\n * Remove event listeners added in _addEventListeners.\n * @private\n */\nMdPanelRef.prototype._removeEventListeners = function() {\n  this._removeListeners && this._removeListeners.forEach(function(removeFn) {\n    removeFn();\n  });\n  this._removeListeners = [];\n};\n\n\n/**\n * Setup the escapeToClose event listeners.\n * @private\n */\nMdPanelRef.prototype._configureEscapeToClose = function() {\n  if (this.config['escapeToClose']) {\n    var parentTarget = getElement(this.config['attachTo']);\n    var self = this;\n\n    var keyHandlerFn = function(ev) {\n      if (ev.keyCode === self._$mdConstant.KEY_CODE.ESCAPE) {\n        ev.stopPropagation();\n        ev.preventDefault();\n\n        self.close(MdPanelRef.closeReasons.ESCAPE);\n      }\n    };\n\n    // Add keydown listeners\n    this.panelContainer.on('keydown', keyHandlerFn);\n    parentTarget.on('keydown', keyHandlerFn);\n\n    // Queue remove listeners function\n    this._removeListeners.push(function() {\n      self.panelContainer.off('keydown', keyHandlerFn);\n      parentTarget.off('keydown', keyHandlerFn);\n    });\n  }\n};\n\n\n/**\n * Setup the clickOutsideToClose event listeners.\n * @private\n */\nMdPanelRef.prototype._configureClickOutsideToClose = function() {\n  if (this.config['clickOutsideToClose']) {\n    var target = this.config['propagateContainerEvents'] ?\n        angular.element(document.body) :\n        this.panelContainer;\n    var sourceEl;\n\n    // Keep track of the element on which the mouse originally went down\n    // so that we can only close the backdrop when the 'click' started on it.\n    // A simple 'click' handler does not work, it sets the target object as the\n    // element the mouse went down on.\n    var mousedownHandler = function(ev) {\n      sourceEl = ev.target;\n    };\n\n    // We check if our original element and the target is the backdrop\n    // because if the original was the backdrop and the target was inside the\n    // panel we don't want to panel to close.\n    var self = this;\n    var mouseupHandler = function(ev) {\n      if (self.config['propagateContainerEvents']) {\n\n        // We check if the sourceEl of the event is the panel element or one\n        // of it's children. If it is not, then close the panel.\n        if (sourceEl !== self.panelEl[0] && !self.panelEl[0].contains(sourceEl)) {\n          self.close();\n        }\n\n      } else if (sourceEl === target[0] && ev.target === target[0]) {\n        ev.stopPropagation();\n        ev.preventDefault();\n\n        self.close(MdPanelRef.closeReasons.CLICK_OUTSIDE);\n      }\n    };\n\n    // Add listeners\n    target.on('mousedown', mousedownHandler);\n    target.on('mouseup', mouseupHandler);\n\n    // Queue remove listeners function\n    this._removeListeners.push(function() {\n      target.off('mousedown', mousedownHandler);\n      target.off('mouseup', mouseupHandler);\n    });\n  }\n};\n\n\n/**\n * Configures the listeners for updating the panel position on scroll.\n * @private\n*/\nMdPanelRef.prototype._configureScrollListener = function() {\n  // No need to bind the event if scrolling is disabled.\n  if (!this.config['disableParentScroll']) {\n    var updatePosition = angular.bind(this, this._updatePosition);\n    var debouncedUpdatePosition = this._$$rAF.throttle(updatePosition);\n    var self = this;\n\n    var onScroll = function() {\n      debouncedUpdatePosition();\n    };\n\n    // Add listeners.\n    this._$window.addEventListener('scroll', onScroll, true);\n\n    // Queue remove listeners function.\n    this._removeListeners.push(function() {\n      self._$window.removeEventListener('scroll', onScroll, true);\n    });\n  }\n};\n\n\n/**\n * Setup the focus traps. These traps will wrap focus when tabbing past the\n * panel. When shift-tabbing, the focus will stick in place.\n * @private\n */\nMdPanelRef.prototype._configureTrapFocus = function() {\n  // Focus doesn't remain inside of the panel without this.\n  this.panelEl.attr('tabIndex', '-1');\n  if (this.config['trapFocus']) {\n    var element = this.panelEl;\n    // Set up elements before and after the panel to capture focus and\n    // redirect back into the panel.\n    this._topFocusTrap = FOCUS_TRAP_TEMPLATE.clone()[0];\n    this._bottomFocusTrap = FOCUS_TRAP_TEMPLATE.clone()[0];\n\n    // When focus is about to move out of the panel, we want to intercept it\n    // and redirect it back to the panel element.\n    var focusHandler = function() {\n      element.focus();\n    };\n    this._topFocusTrap.addEventListener('focus', focusHandler);\n    this._bottomFocusTrap.addEventListener('focus', focusHandler);\n\n    // Queue remove listeners function\n    this._removeListeners.push(this._simpleBind(function() {\n      this._topFocusTrap.removeEventListener('focus', focusHandler);\n      this._bottomFocusTrap.removeEventListener('focus', focusHandler);\n    }, this));\n\n    // The top focus trap inserted immediately before the md-panel element (as\n    // a sibling). The bottom focus trap inserted immediately after the\n    // md-panel element (as a sibling).\n    element[0].parentNode.insertBefore(this._topFocusTrap, element[0]);\n    element.after(this._bottomFocusTrap);\n  }\n};\n\n\n/**\n * Updates the animation of a panel.\n * @param {!MdPanelAnimation} animation\n */\nMdPanelRef.prototype.updateAnimation = function(animation) {\n  this.config['animation'] = animation;\n\n  if (this._backdropRef) {\n    this._backdropRef.config.animation.duration(animation._rawDuration);\n  }\n};\n\n\n/**\n * Animate the panel opening.\n * @returns {!angular.$q.Promise} A promise that is resolved when the panel has\n *     animated open.\n * @private\n */\nMdPanelRef.prototype._animateOpen = function() {\n  this.panelContainer.addClass('md-panel-is-showing');\n  var animationConfig = this.config['animation'];\n  if (!animationConfig) {\n    // Promise is in progress, return it.\n    this.panelContainer.addClass('_md-panel-shown');\n    return this._$q.when(this);\n  }\n\n  var self = this;\n  return this._$q(function(resolve) {\n    var done = self._done(resolve, self);\n    var warnAndOpen = function() {\n      self._$log.warn(\n          'mdPanel: MdPanel Animations failed. ' +\n          'Showing panel without animating.');\n      done();\n    };\n\n    animationConfig.animateOpen(self.panelEl)\n        .then(done, warnAndOpen);\n  });\n};\n\n\n/**\n * Animate the panel closing.\n * @returns {!angular.$q.Promise} A promise that is resolved when the panel has\n *     animated closed.\n * @private\n */\nMdPanelRef.prototype._animateClose = function() {\n  var animationConfig = this.config['animation'];\n  if (!animationConfig) {\n    this.panelContainer.removeClass('md-panel-is-showing');\n    this.panelContainer.removeClass('_md-panel-shown');\n    return this._$q.when(this);\n  }\n\n  var self = this;\n  return this._$q(function(resolve) {\n    var done = function() {\n      self.panelContainer.removeClass('md-panel-is-showing');\n      resolve(self);\n    };\n    var warnAndClose = function() {\n      self._$log.warn(\n          'mdPanel: MdPanel Animations failed. ' +\n          'Hiding panel without animating.');\n      done();\n    };\n\n    animationConfig.animateClose(self.panelEl)\n        .then(done, warnAndClose);\n  });\n};\n\n\n/**\n * Registers a interceptor with the panel. The callback should return a promise,\n * which will allow the action to continue when it gets resolved, or will\n * prevent an action if it is rejected.\n * @param {string} type Type of interceptor.\n * @param {!angular.$q.Promise<!any>} callback Callback to be registered.\n * @returns {!MdPanelRef}\n */\nMdPanelRef.prototype.registerInterceptor = function(type, callback) {\n  var error = null;\n\n  if (!angular.isString(type)) {\n    error = 'Interceptor type must be a string, instead got ' + typeof type;\n  } else if (!angular.isFunction(callback)) {\n    error = 'Interceptor callback must be a function, instead got ' + typeof callback;\n  }\n\n  if (error) {\n    throw new Error('MdPanel: ' + error);\n  }\n\n  var interceptors = this._interceptors[type] = this._interceptors[type] || [];\n\n  if (interceptors.indexOf(callback) === -1) {\n    interceptors.push(callback);\n  }\n\n  return this;\n};\n\n\n/**\n * Removes a registered interceptor.\n * @param {string} type Type of interceptor to be removed.\n * @param {Function} callback Interceptor to be removed.\n * @returns {!MdPanelRef}\n */\nMdPanelRef.prototype.removeInterceptor = function(type, callback) {\n  var index = this._interceptors[type] ?\n    this._interceptors[type].indexOf(callback) : -1;\n\n  if (index > -1) {\n    this._interceptors[type].splice(index, 1);\n  }\n\n  return this;\n};\n\n\n/**\n * Removes all interceptors.\n * @param {string=} type Type of interceptors to be removed.\n *     If ommited, all interceptors types will be removed.\n * @returns {!MdPanelRef}\n */\nMdPanelRef.prototype.removeAllInterceptors = function(type) {\n  if (type) {\n    this._interceptors[type] = [];\n  } else {\n    this._interceptors = Object.create(null);\n  }\n\n  return this;\n};\n\n\n/**\n * Invokes all the interceptors of a certain type sequantially in\n *     reverse order. Works in a similar way to `$q.all`, except it\n *     respects the order of the functions.\n * @param {string} type Type of interceptors to be invoked.\n * @returns {!angular.$q.Promise<!MdPanelRef>}\n * @private\n */\nMdPanelRef.prototype._callInterceptors = function(type) {\n  var self = this;\n  var $q = self._$q;\n  var interceptors = self._interceptors && self._interceptors[type] || [];\n\n  return interceptors.reduceRight(function(promise, interceptor) {\n    var isPromiseLike = interceptor && angular.isFunction(interceptor.then);\n    var response = isPromiseLike ? interceptor : null;\n\n    /**\n    * For interceptors to reject/cancel subsequent portions of the chain, simply\n    * return a `$q.reject(<value>)`\n    */\n    return promise.then(function() {\n      if (!response) {\n        try {\n          response = interceptor(self);\n        } catch(e) {\n          response = $q.reject(e);\n        }\n      }\n\n     return response;\n    });\n  }, $q.resolve(self));\n};\n\n\n/**\n * Faster, more basic than angular.bind\n * http://jsperf.com/angular-bind-vs-custom-vs-native\n * @param {function} callback\n * @param {!Object} self\n * @return {function} Callback function with a bound self.\n */\nMdPanelRef.prototype._simpleBind = function(callback, self) {\n  return function(value) {\n    return callback.apply(self, value);\n  };\n};\n\n\n/**\n * @param {function} callback\n * @param {!Object} self\n * @return {function} Callback function with a self param.\n */\nMdPanelRef.prototype._done = function(callback, self) {\n  return function() {\n    callback(self);\n  };\n};\n\n\n/**\n * Adds a panel to a group if the panel does not exist within the group already.\n * A panel can only exist within a single group.\n * @param {string} groupName The name of the group.\n */\nMdPanelRef.prototype.addToGroup = function(groupName) {\n  if (!this._$mdPanel._groups[groupName]) {\n    this._$mdPanel.newPanelGroup(groupName);\n  }\n\n  var group = this._$mdPanel._groups[groupName];\n  var index = group.panels.indexOf(this);\n\n  if (index < 0) {\n    group.panels.push(this);\n  }\n};\n\n\n/**\n * Removes a panel from a group if the panel exists within that group. The group\n * must be created ahead of time.\n * @param {string} groupName The name of the group.\n */\nMdPanelRef.prototype.removeFromGroup = function(groupName) {\n  if (!this._$mdPanel._groups[groupName]) {\n    throw new Error('mdPanel: The group ' + groupName + ' does not exist.');\n  }\n\n  var group = this._$mdPanel._groups[groupName];\n  var index = group.panels.indexOf(this);\n\n  if (index > -1) {\n    group.panels.splice(index, 1);\n  }\n};\n\n\n/**\n * Possible default closeReasons for the close function.\n * @enum {string}\n */\nMdPanelRef.closeReasons = {\n  CLICK_OUTSIDE: 'clickOutsideToClose',\n  ESCAPE: 'escapeToClose',\n};\n\n\n/*****************************************************************************\n *                               MdPanelPosition                             *\n *****************************************************************************/\n\n\n/**\n * Position configuration object. To use, create an MdPanelPosition with the\n * desired properties, then pass the object as part of $mdPanel creation.\n *\n * Example:\n *\n * var panelPosition = new MdPanelPosition()\n *     .relativeTo(myButtonEl)\n *     .addPanelPosition(\n *       $mdPanel.xPosition.CENTER,\n *       $mdPanel.yPosition.ALIGN_TOPS\n *     );\n *\n * $mdPanel.create({\n *   position: panelPosition\n * });\n *\n * @param {!angular.$injector} $injector\n * @final @constructor\n */\nfunction MdPanelPosition($injector) {\n  /** @private @const {!angular.$window} */\n  this._$window = $injector.get('$window');\n\n  /** @private {boolean} */\n  this._isRTL = $injector.get('$mdUtil').bidi() === 'rtl';\n\n  /** @private @const {!angular.$mdConstant} */\n  this._$mdConstant = $injector.get('$mdConstant');\n\n  /** @private {boolean} */\n  this._absolute = false;\n\n  /** @private {!angular.JQLite} */\n  this._relativeToEl;\n\n  /** @private {string} */\n  this._top = '';\n\n  /** @private {string} */\n  this._bottom = '';\n\n  /** @private {string} */\n  this._left = '';\n\n  /** @private {string} */\n  this._right = '';\n\n  /** @private {!Array<string>} */\n  this._translateX = [];\n\n  /** @private {!Array<string>} */\n  this._translateY = [];\n\n  /** @private {!Array<{x:string, y:string}>} */\n  this._positions = [];\n\n  /** @private {?{x:string, y:string}} */\n  this._actualPosition;\n}\n\n\n/**\n * Possible values of xPosition.\n * @enum {string}\n */\nMdPanelPosition.xPosition = {\n  CENTER: 'center',\n  ALIGN_START: 'align-start',\n  ALIGN_END: 'align-end',\n  OFFSET_START: 'offset-start',\n  OFFSET_END: 'offset-end'\n};\n\n\n/**\n * Possible values of yPosition.\n * @enum {string}\n */\nMdPanelPosition.yPosition = {\n  CENTER: 'center',\n  ALIGN_TOPS: 'align-tops',\n  ALIGN_BOTTOMS: 'align-bottoms',\n  ABOVE: 'above',\n  BELOW: 'below'\n};\n\n\n/**\n * Possible values of absolute position.\n * @enum {string}\n */\nMdPanelPosition.absPosition = {\n  TOP: 'top',\n  RIGHT: 'right',\n  BOTTOM: 'bottom',\n  LEFT: 'left'\n};\n\n/**\n * Margin between the edges of a panel and the viewport.\n * @const {number}\n */\nMdPanelPosition.viewportMargin = 8;\n\n\n/**\n * Sets absolute positioning for the panel.\n * @return {!MdPanelPosition}\n */\nMdPanelPosition.prototype.absolute = function() {\n  this._absolute = true;\n  return this;\n};\n\n\n/**\n * Sets the value of a position for the panel. Clears any previously set\n * position.\n * @param {string} position Position to set\n * @param {string=} value Value of the position. Defaults to '0'.\n * @returns {!MdPanelPosition}\n * @private\n */\nMdPanelPosition.prototype._setPosition = function(position, value) {\n  if (position === MdPanelPosition.absPosition.RIGHT ||\n      position === MdPanelPosition.absPosition.LEFT) {\n    this._left = this._right = '';\n  } else if (\n      position === MdPanelPosition.absPosition.BOTTOM ||\n      position === MdPanelPosition.absPosition.TOP) {\n    this._top = this._bottom = '';\n  } else {\n    var positions = Object.keys(MdPanelPosition.absPosition).join()\n        .toLowerCase();\n\n    throw new Error('mdPanel: Position must be one of ' + positions + '.');\n  }\n\n  this['_' +  position] = angular.isString(value) ? value : '0';\n\n  return this;\n};\n\n\n/**\n * Sets the value of `top` for the panel. Clears any previously set vertical\n * position.\n * @param {string=} top Value of `top`. Defaults to '0'.\n * @returns {!MdPanelPosition}\n */\nMdPanelPosition.prototype.top = function(top) {\n  return this._setPosition(MdPanelPosition.absPosition.TOP, top);\n};\n\n\n/**\n * Sets the value of `bottom` for the panel. Clears any previously set vertical\n * position.\n * @param {string=} bottom Value of `bottom`. Defaults to '0'.\n * @returns {!MdPanelPosition}\n */\nMdPanelPosition.prototype.bottom = function(bottom) {\n  return this._setPosition(MdPanelPosition.absPosition.BOTTOM, bottom);\n};\n\n\n/**\n * Sets the panel to the start of the page - `left` if `ltr` or `right` for\n * `rtl`. Clears any previously set horizontal position.\n * @param {string=} start Value of position. Defaults to '0'.\n * @returns {!MdPanelPosition}\n */\nMdPanelPosition.prototype.start = function(start) {\n  var position = this._isRTL ? MdPanelPosition.absPosition.RIGHT : MdPanelPosition.absPosition.LEFT;\n  return this._setPosition(position, start);\n};\n\n\n/**\n * Sets the panel to the end of the page - `right` if `ltr` or `left` for `rtl`.\n * Clears any previously set horizontal position.\n * @param {string=} end Value of position. Defaults to '0'.\n * @returns {!MdPanelPosition}\n */\nMdPanelPosition.prototype.end = function(end) {\n  var position = this._isRTL ? MdPanelPosition.absPosition.LEFT : MdPanelPosition.absPosition.RIGHT;\n  return this._setPosition(position, end);\n};\n\n\n/**\n * Sets the value of `left` for the panel. Clears any previously set\n * horizontal position.\n * @param {string=} left Value of `left`. Defaults to '0'.\n * @returns {!MdPanelPosition}\n */\nMdPanelPosition.prototype.left = function(left) {\n  return this._setPosition(MdPanelPosition.absPosition.LEFT, left);\n};\n\n\n/**\n * Sets the value of `right` for the panel. Clears any previously set\n * horizontal position.\n * @param {string=} right Value of `right`. Defaults to '0'.\n * @returns {!MdPanelPosition}\n*/\nMdPanelPosition.prototype.right = function(right) {\n  return this._setPosition(MdPanelPosition.absPosition.RIGHT, right);\n};\n\n\n/**\n * Centers the panel horizontally in the viewport. Clears any previously set\n * horizontal position.\n * @returns {!MdPanelPosition}\n */\nMdPanelPosition.prototype.centerHorizontally = function() {\n  this._left = '50%';\n  this._right = '';\n  this._translateX = ['-50%'];\n  return this;\n};\n\n\n/**\n * Centers the panel vertically in the viewport. Clears any previously set\n * vertical position.\n * @returns {!MdPanelPosition}\n */\nMdPanelPosition.prototype.centerVertically = function() {\n  this._top = '50%';\n  this._bottom = '';\n  this._translateY = ['-50%'];\n  return this;\n};\n\n\n/**\n * Centers the panel horizontally and vertically in the viewport. This is\n * equivalent to calling both `centerHorizontally` and `centerVertically`.\n * Clears any previously set horizontal and vertical positions.\n * @returns {!MdPanelPosition}\n */\nMdPanelPosition.prototype.center = function() {\n  return this.centerHorizontally().centerVertically();\n};\n\n\n/**\n * Sets element for relative positioning.\n * @param {string|!Element|!angular.JQLite} element Query selector, DOM element,\n *     or angular element to set the panel relative to.\n * @returns {!MdPanelPosition}\n */\nMdPanelPosition.prototype.relativeTo = function(element) {\n  this._absolute = false;\n  this._relativeToEl = getElement(element);\n  return this;\n};\n\n\n/**\n * Sets the x and y positions for the panel relative to another element.\n * @param {string} xPosition must be one of the MdPanelPosition.xPosition\n *     values.\n * @param {string} yPosition must be one of the MdPanelPosition.yPosition\n *     values.\n * @returns {!MdPanelPosition}\n */\nMdPanelPosition.prototype.addPanelPosition = function(xPosition, yPosition) {\n  if (!this._relativeToEl) {\n    throw new Error('mdPanel: addPanelPosition can only be used with ' +\n        'relative positioning. Set relativeTo first.');\n  }\n\n  this._validateXPosition(xPosition);\n  this._validateYPosition(yPosition);\n\n  this._positions.push({\n      x: xPosition,\n      y: yPosition,\n  });\n  return this;\n};\n\n\n/**\n * Ensures that yPosition is a valid position name. Throw an exception if not.\n * @param {string} yPosition\n */\nMdPanelPosition.prototype._validateYPosition = function(yPosition) {\n  // empty is ok\n  if (yPosition == null) {\n      return;\n  }\n\n  var positionKeys = Object.keys(MdPanelPosition.yPosition);\n  var positionValues = [];\n  for (var key, i = 0; key = positionKeys[i]; i++) {\n    var position = MdPanelPosition.yPosition[key];\n    positionValues.push(position);\n\n    if (position === yPosition) {\n      return;\n    }\n  }\n\n  throw new Error('mdPanel: Panel y position only accepts the following ' +\n      'values:\\n' + positionValues.join(' | '));\n};\n\n\n/**\n * Ensures that xPosition is a valid position name. Throw an exception if not.\n * @param {string} xPosition\n */\nMdPanelPosition.prototype._validateXPosition = function(xPosition) {\n  // empty is ok\n  if (xPosition == null) {\n      return;\n  }\n\n  var positionKeys = Object.keys(MdPanelPosition.xPosition);\n  var positionValues = [];\n  for (var key, i = 0; key = positionKeys[i]; i++) {\n    var position = MdPanelPosition.xPosition[key];\n    positionValues.push(position);\n    if (position === xPosition) {\n      return;\n    }\n  }\n\n  throw new Error('mdPanel: Panel x Position only accepts the following ' +\n      'values:\\n' + positionValues.join(' | '));\n};\n\n\n/**\n * Sets the value of the offset in the x-direction. This will add to any\n * previously set offsets.\n * @param {string|function(MdPanelPosition): string} offsetX\n * @returns {!MdPanelPosition}\n */\nMdPanelPosition.prototype.withOffsetX = function(offsetX) {\n  this._translateX.push(offsetX);\n  return this;\n};\n\n\n/**\n * Sets the value of the offset in the y-direction. This will add to any\n * previously set offsets.\n * @param {string|function(MdPanelPosition): string} offsetY\n * @returns {!MdPanelPosition}\n */\nMdPanelPosition.prototype.withOffsetY = function(offsetY) {\n  this._translateY.push(offsetY);\n  return this;\n};\n\n\n/**\n * Gets the value of `top` for the panel.\n * @returns {string}\n */\nMdPanelPosition.prototype.getTop = function() {\n  return this._top;\n};\n\n\n/**\n * Gets the value of `bottom` for the panel.\n * @returns {string}\n */\nMdPanelPosition.prototype.getBottom = function() {\n  return this._bottom;\n};\n\n\n/**\n * Gets the value of `left` for the panel.\n * @returns {string}\n */\nMdPanelPosition.prototype.getLeft = function() {\n  return this._left;\n};\n\n\n/**\n * Gets the value of `right` for the panel.\n * @returns {string}\n */\nMdPanelPosition.prototype.getRight = function() {\n  return this._right;\n};\n\n\n/**\n * Gets the value of `transform` for the panel.\n * @returns {string}\n */\nMdPanelPosition.prototype.getTransform = function() {\n  var translateX = this._reduceTranslateValues('translateX', this._translateX);\n  var translateY = this._reduceTranslateValues('translateY', this._translateY);\n\n  // It's important to trim the result, because the browser will ignore the set\n  // operation if the string contains only whitespace.\n  return (translateX + ' ' + translateY).trim();\n};\n\n\n/**\n * Sets the `transform` value for a panel element.\n * @param {!angular.JQLite} panelEl\n * @returns {!angular.JQLite}\n * @private\n */\nMdPanelPosition.prototype._setTransform = function(panelEl) {\n  return panelEl.css(this._$mdConstant.CSS.TRANSFORM, this.getTransform());\n};\n\n\n/**\n * True if the panel is completely on-screen with this positioning; false\n * otherwise.\n * @param {!angular.JQLite} panelEl\n * @return {boolean}\n * @private\n */\nMdPanelPosition.prototype._isOnscreen = function(panelEl) {\n  // this works because we always use fixed positioning for the panel,\n  // which is relative to the viewport.\n  var left = parseInt(this.getLeft());\n  var top = parseInt(this.getTop());\n\n  if (this._translateX.length || this._translateY.length) {\n    var prefixedTransform = this._$mdConstant.CSS.TRANSFORM;\n    var offsets = getComputedTranslations(panelEl, prefixedTransform);\n    left += offsets.x;\n    top += offsets.y;\n  }\n\n  var right = left + panelEl[0].offsetWidth;\n  var bottom = top + panelEl[0].offsetHeight;\n\n  return (left >= 0) &&\n    (top >= 0) &&\n    (bottom <= this._$window.innerHeight) &&\n    (right <= this._$window.innerWidth);\n};\n\n\n/**\n * Gets the first x/y position that can fit on-screen.\n * @returns {{x: string, y: string}}\n */\nMdPanelPosition.prototype.getActualPosition = function() {\n  return this._actualPosition;\n};\n\n\n/**\n * Reduces a list of translate values to a string that can be used within\n * transform.\n * @param {string} translateFn\n * @param {!Array<string>} values\n * @returns {string}\n * @private\n */\nMdPanelPosition.prototype._reduceTranslateValues =\n    function(translateFn, values) {\n      return values.map(function(translation) {\n        // TODO(crisbeto): this should add the units after #9609 is merged.\n        var translationValue = angular.isFunction(translation) ?\n            translation(this) : translation;\n        return translateFn + '(' + translationValue + ')';\n      }, this).join(' ');\n    };\n\n\n/**\n * Sets the panel position based on the created panel element and best x/y\n * positioning.\n * @param {!angular.JQLite} panelEl\n * @private\n */\nMdPanelPosition.prototype._setPanelPosition = function(panelEl) {\n  // Remove the \"position adjusted\" class in case it has been added before.\n  panelEl.removeClass('_md-panel-position-adjusted');\n\n  // Only calculate the position if necessary.\n  if (this._absolute) {\n    this._setTransform(panelEl);\n    return;\n  }\n\n  if (this._actualPosition) {\n    this._calculatePanelPosition(panelEl, this._actualPosition);\n    this._setTransform(panelEl);\n    this._constrainToViewport(panelEl);\n    return;\n  }\n\n  for (var i = 0; i < this._positions.length; i++) {\n    this._actualPosition = this._positions[i];\n    this._calculatePanelPosition(panelEl, this._actualPosition);\n    this._setTransform(panelEl);\n\n    if (this._isOnscreen(panelEl)) {\n      return;\n    }\n  }\n\n  this._constrainToViewport(panelEl);\n};\n\n\n/**\n * Constrains a panel's position to the viewport.\n * @param {!angular.JQLite} panelEl\n * @private\n */\nMdPanelPosition.prototype._constrainToViewport = function(panelEl) {\n  var margin = MdPanelPosition.viewportMargin;\n  var initialTop = this._top;\n  var initialLeft = this._left;\n\n  if (this.getTop()) {\n    var top = parseInt(this.getTop());\n    var bottom = panelEl[0].offsetHeight + top;\n    var viewportHeight = this._$window.innerHeight;\n\n    if (top < margin) {\n      this._top = margin + 'px';\n    } else if (bottom > viewportHeight) {\n      this._top = top - (bottom - viewportHeight + margin) + 'px';\n    }\n  }\n\n  if (this.getLeft()) {\n    var left = parseInt(this.getLeft());\n    var right = panelEl[0].offsetWidth + left;\n    var viewportWidth = this._$window.innerWidth;\n\n    if (left < margin) {\n      this._left = margin + 'px';\n    } else if (right > viewportWidth) {\n      this._left = left - (right - viewportWidth + margin) + 'px';\n    }\n  }\n\n  // Class that can be used to re-style the panel if it was repositioned.\n  panelEl.toggleClass(\n    '_md-panel-position-adjusted',\n    this._top !== initialTop || this._left !== initialLeft\n  );\n};\n\n\n/**\n * Switches between 'start' and 'end'.\n * @param {string} position Horizontal position of the panel\n * @returns {string} Reversed position\n * @private\n */\nMdPanelPosition.prototype._reverseXPosition = function(position) {\n  if (position === MdPanelPosition.xPosition.CENTER) {\n    return;\n  }\n\n  var start = 'start';\n  var end = 'end';\n\n  return position.indexOf(start) > -1 ? position.replace(start, end) : position.replace(end, start);\n};\n\n\n/**\n * Handles horizontal positioning in rtl or ltr environments.\n * @param {string} position Horizontal position of the panel\n * @returns {string} The correct position according the page direction\n * @private\n */\nMdPanelPosition.prototype._bidi = function(position) {\n  return this._isRTL ? this._reverseXPosition(position) : position;\n};\n\n\n/**\n * Calculates the panel position based on the created panel element and the\n * provided positioning.\n * @param {!angular.JQLite} panelEl\n * @param {!{x:string, y:string}} position\n * @private\n */\nMdPanelPosition.prototype._calculatePanelPosition = function(panelEl, position) {\n\n  var panelBounds = panelEl[0].getBoundingClientRect();\n  var panelWidth = panelBounds.width;\n  var panelHeight = panelBounds.height;\n\n  var targetBounds = this._relativeToEl[0].getBoundingClientRect();\n\n  var targetLeft = targetBounds.left;\n  var targetRight = targetBounds.right;\n  var targetWidth = targetBounds.width;\n\n  switch (this._bidi(position.x)) {\n    case MdPanelPosition.xPosition.OFFSET_START:\n      this._left = targetLeft - panelWidth + 'px';\n      break;\n    case MdPanelPosition.xPosition.ALIGN_END:\n      this._left = targetRight - panelWidth + 'px';\n      break;\n    case MdPanelPosition.xPosition.CENTER:\n      var left = targetLeft + (0.5 * targetWidth) - (0.5 * panelWidth);\n      this._left = left + 'px';\n      break;\n    case MdPanelPosition.xPosition.ALIGN_START:\n      this._left = targetLeft + 'px';\n      break;\n    case MdPanelPosition.xPosition.OFFSET_END:\n      this._left = targetRight + 'px';\n      break;\n  }\n\n  var targetTop = targetBounds.top;\n  var targetBottom = targetBounds.bottom;\n  var targetHeight = targetBounds.height;\n\n  switch (position.y) {\n    case MdPanelPosition.yPosition.ABOVE:\n      this._top = targetTop - panelHeight + 'px';\n      break;\n    case MdPanelPosition.yPosition.ALIGN_BOTTOMS:\n      this._top = targetBottom - panelHeight + 'px';\n      break;\n    case MdPanelPosition.yPosition.CENTER:\n      var top = targetTop + (0.5 * targetHeight) - (0.5 * panelHeight);\n      this._top = top + 'px';\n      break;\n    case MdPanelPosition.yPosition.ALIGN_TOPS:\n      this._top = targetTop + 'px';\n      break;\n    case MdPanelPosition.yPosition.BELOW:\n      this._top = targetBottom + 'px';\n      break;\n  }\n};\n\n\n/*****************************************************************************\n *                               MdPanelAnimation                            *\n *****************************************************************************/\n\n\n/**\n * Animation configuration object. To use, create an MdPanelAnimation with the\n * desired properties, then pass the object as part of $mdPanel creation.\n *\n * Example:\n *\n * var panelAnimation = new MdPanelAnimation()\n *     .openFrom(myButtonEl)\n *     .closeTo('.my-button')\n *     .withAnimation($mdPanel.animation.SCALE);\n *\n * $mdPanel.create({\n *   animation: panelAnimation\n * });\n *\n * @param {!angular.$injector} $injector\n * @final @constructor\n */\nfunction MdPanelAnimation($injector) {\n  /** @private @const {!angular.$mdUtil} */\n  this._$mdUtil = $injector.get('$mdUtil');\n\n  /**\n   * @private {{element: !angular.JQLite|undefined, bounds: !DOMRect}|\n   *     undefined}\n   */\n  this._openFrom;\n\n  /**\n   * @private {{element: !angular.JQLite|undefined, bounds: !DOMRect}|\n   *     undefined}\n   */\n  this._closeTo;\n\n  /** @private {string|{open: string, close: string}} */\n  this._animationClass = '';\n\n  /** @private {number} */\n  this._openDuration;\n\n  /** @private {number} */\n  this._closeDuration;\n\n  /** @private {number|{open: number, close: number}} */\n  this._rawDuration;\n}\n\n\n/**\n * Possible default animations.\n * @enum {string}\n */\nMdPanelAnimation.animation = {\n  SLIDE: 'md-panel-animate-slide',\n  SCALE: 'md-panel-animate-scale',\n  FADE: 'md-panel-animate-fade'\n};\n\n\n/**\n * Specifies where to start the open animation. `openFrom` accepts a\n * click event object, query selector, DOM element, or a Rect object that\n * is used to determine the bounds. When passed a click event, the location\n * of the click will be used as the position to start the animation.\n * @param {string|!Element|!Event|{top: number, left: number}} openFrom\n * @returns {!MdPanelAnimation}\n */\nMdPanelAnimation.prototype.openFrom = function(openFrom) {\n  // Check if 'openFrom' is an Event.\n  openFrom = openFrom.target ? openFrom.target : openFrom;\n\n  this._openFrom = this._getPanelAnimationTarget(openFrom);\n\n  if (!this._closeTo) {\n    this._closeTo = this._openFrom;\n  }\n  return this;\n};\n\n\n/**\n * Specifies where to animate the panel close. `closeTo` accepts a\n * query selector, DOM element, or a Rect object that is used to determine\n * the bounds.\n * @param {string|!Element|{top: number, left: number}} closeTo\n * @returns {!MdPanelAnimation}\n */\nMdPanelAnimation.prototype.closeTo = function(closeTo) {\n  this._closeTo = this._getPanelAnimationTarget(closeTo);\n  return this;\n};\n\n\n/**\n * Specifies the duration of the animation in milliseconds.\n * @param {number|{open: number, close: number}} duration\n * @returns {!MdPanelAnimation}\n */\nMdPanelAnimation.prototype.duration = function(duration) {\n  if (duration) {\n    if (angular.isNumber(duration)) {\n      this._openDuration = this._closeDuration = toSeconds(duration);\n    } else if (angular.isObject(duration)) {\n      this._openDuration = toSeconds(duration.open);\n      this._closeDuration = toSeconds(duration.close);\n    }\n  }\n\n  // Save the original value so it can be passed to the backdrop.\n  this._rawDuration = duration;\n\n  return this;\n\n  function toSeconds(value) {\n    if (angular.isNumber(value)) return value / 1000;\n  }\n};\n\n\n/**\n * Returns the element and bounds for the animation target.\n * @param {string|!Element|{top: number, left: number}} location\n * @returns {{element: !angular.JQLite|undefined, bounds: !DOMRect}}\n * @private\n */\nMdPanelAnimation.prototype._getPanelAnimationTarget = function(location) {\n  if (angular.isDefined(location.top) || angular.isDefined(location.left)) {\n    return {\n      element: undefined,\n      bounds: {\n        top: location.top || 0,\n        left: location.left || 0\n      }\n    };\n  } else {\n    return this._getBoundingClientRect(getElement(location));\n  }\n};\n\n\n/**\n * Specifies the animation class.\n *\n * There are several default animations that can be used:\n * (MdPanelAnimation.animation)\n *   SLIDE: The panel slides in and out from the specified\n *        elements.\n *   SCALE: The panel scales in and out.\n *   FADE: The panel fades in and out.\n *\n * @param {string|{open: string, close: string}} cssClass\n * @returns {!MdPanelAnimation}\n */\nMdPanelAnimation.prototype.withAnimation = function(cssClass) {\n  this._animationClass = cssClass;\n  return this;\n};\n\n\n/**\n * Animate the panel open.\n * @param {!angular.JQLite} panelEl\n * @returns {!angular.$q.Promise} A promise that is resolved when the open\n *     animation is complete.\n */\nMdPanelAnimation.prototype.animateOpen = function(panelEl) {\n  var animator = this._$mdUtil.dom.animator;\n\n  this._fixBounds(panelEl);\n  var animationOptions = {};\n\n  // Include the panel transformations when calculating the animations.\n  var panelTransform = panelEl[0].style.transform || '';\n\n  var openFrom = animator.toTransformCss(panelTransform);\n  var openTo = animator.toTransformCss(panelTransform);\n\n  switch (this._animationClass) {\n    case MdPanelAnimation.animation.SLIDE:\n      // Slide should start with opacity: 1.\n      panelEl.css('opacity', '1');\n\n      animationOptions = {\n        transitionInClass: '_md-panel-animate-enter'\n      };\n\n      var openSlide = animator.calculateSlideToOrigin(\n              panelEl, this._openFrom) || '';\n      openFrom = animator.toTransformCss(openSlide + ' ' + panelTransform);\n      break;\n\n    case MdPanelAnimation.animation.SCALE:\n      animationOptions = {\n        transitionInClass: '_md-panel-animate-enter'\n      };\n\n      var openScale = animator.calculateZoomToOrigin(\n              panelEl, this._openFrom) || '';\n      openFrom = animator.toTransformCss(openScale + ' ' + panelTransform);\n      break;\n\n    case MdPanelAnimation.animation.FADE:\n      animationOptions = {\n        transitionInClass: '_md-panel-animate-enter'\n      };\n      break;\n\n    default:\n      if (angular.isString(this._animationClass)) {\n        animationOptions = {\n          transitionInClass: this._animationClass\n        };\n      } else {\n        animationOptions = {\n          transitionInClass: this._animationClass['open'],\n          transitionOutClass: this._animationClass['close'],\n        };\n      }\n  }\n\n  animationOptions.duration = this._openDuration;\n\n  return animator\n      .translate3d(panelEl, openFrom, openTo, animationOptions);\n};\n\n\n/**\n * Animate the panel close.\n * @param {!angular.JQLite} panelEl\n * @returns {!angular.$q.Promise} A promise that resolves when the close\n *     animation is complete.\n */\nMdPanelAnimation.prototype.animateClose = function(panelEl) {\n  var animator = this._$mdUtil.dom.animator;\n  var reverseAnimationOptions = {};\n\n  // Include the panel transformations when calculating the animations.\n  var panelTransform = panelEl[0].style.transform || '';\n\n  var closeFrom = animator.toTransformCss(panelTransform);\n  var closeTo = animator.toTransformCss(panelTransform);\n\n  switch (this._animationClass) {\n    case MdPanelAnimation.animation.SLIDE:\n      // Slide should start with opacity: 1.\n      panelEl.css('opacity', '1');\n      reverseAnimationOptions = {\n        transitionInClass: '_md-panel-animate-leave'\n      };\n\n      var closeSlide = animator.calculateSlideToOrigin(\n              panelEl, this._closeTo) || '';\n      closeTo = animator.toTransformCss(closeSlide + ' ' + panelTransform);\n      break;\n\n    case MdPanelAnimation.animation.SCALE:\n      reverseAnimationOptions = {\n        transitionInClass: '_md-panel-animate-scale-out _md-panel-animate-leave'\n      };\n\n      var closeScale = animator.calculateZoomToOrigin(\n              panelEl, this._closeTo) || '';\n      closeTo = animator.toTransformCss(closeScale + ' ' + panelTransform);\n      break;\n\n    case MdPanelAnimation.animation.FADE:\n      reverseAnimationOptions = {\n        transitionInClass: '_md-panel-animate-fade-out _md-panel-animate-leave'\n      };\n      break;\n\n    default:\n      if (angular.isString(this._animationClass)) {\n        reverseAnimationOptions = {\n          transitionOutClass: this._animationClass\n        };\n      } else {\n        reverseAnimationOptions = {\n          transitionInClass: this._animationClass['close'],\n          transitionOutClass: this._animationClass['open']\n        };\n      }\n  }\n\n  reverseAnimationOptions.duration = this._closeDuration;\n\n  return animator\n      .translate3d(panelEl, closeFrom, closeTo, reverseAnimationOptions);\n};\n\n\n/**\n * Set the height and width to match the panel if not provided.\n * @param {!angular.JQLite} panelEl\n * @private\n */\nMdPanelAnimation.prototype._fixBounds = function(panelEl) {\n  var panelWidth = panelEl[0].offsetWidth;\n  var panelHeight = panelEl[0].offsetHeight;\n\n  if (this._openFrom && this._openFrom.bounds.height == null) {\n    this._openFrom.bounds.height = panelHeight;\n  }\n  if (this._openFrom && this._openFrom.bounds.width == null) {\n    this._openFrom.bounds.width = panelWidth;\n  }\n  if (this._closeTo && this._closeTo.bounds.height == null) {\n    this._closeTo.bounds.height = panelHeight;\n  }\n  if (this._closeTo && this._closeTo.bounds.width == null) {\n    this._closeTo.bounds.width = panelWidth;\n  }\n};\n\n\n/**\n * Identify the bounding RECT for the target element.\n * @param {!angular.JQLite} element\n * @returns {{element: !angular.JQLite|undefined, bounds: !DOMRect}}\n * @private\n */\nMdPanelAnimation.prototype._getBoundingClientRect = function(element) {\n  if (element instanceof angular.element) {\n    return {\n      element: element,\n      bounds: element[0].getBoundingClientRect()\n    };\n  }\n};\n\n\n/*****************************************************************************\n *                                Util Methods                               *\n *****************************************************************************/\n\n\n/**\n * Returns the angular element associated with a css selector or element.\n * @param el {string|!angular.JQLite|!Element}\n * @returns {!angular.JQLite}\n */\nfunction getElement(el) {\n  var queryResult = angular.isString(el) ?\n      document.querySelector(el) : el;\n  return angular.element(queryResult);\n}\n\n\n/**\n * Gets the computed values for an element's translateX and translateY in px.\n * @param {!angular.JQLite|!Element} el\n * @param {string} property\n * @return {{x: number, y: number}}\n */\nfunction getComputedTranslations(el, property) {\n  // The transform being returned by `getComputedStyle` is in the format:\n  // `matrix(a, b, c, d, translateX, translateY)` if defined and `none`\n  // if the element doesn't have a transform.\n  var transform = getComputedStyle(el[0] || el)[property];\n  var openIndex = transform.indexOf('(');\n  var closeIndex = transform.lastIndexOf(')');\n  var output = { x: 0, y: 0 };\n\n  if (openIndex > -1 && closeIndex > -1) {\n    var parsedValues = transform\n      .substring(openIndex + 1, closeIndex)\n      .split(', ')\n      .slice(-2);\n\n    output.x = parseInt(parsedValues[0]);\n    output.y = parseInt(parsedValues[1]);\n  }\n\n  return output;\n}\n\n})();\n(function(){\n\"use strict\";\n\n/**\n * @ngdoc module\n * @name material.components.progressLinear\n * @description Linear Progress module!\n */\nMdProgressLinearDirective.$inject = [\"$mdTheming\", \"$mdUtil\", \"$log\"];\nangular.module('material.components.progressLinear', [\n  'material.core'\n])\n  .directive('mdProgressLinear', MdProgressLinearDirective);\n\n/**\n * @ngdoc directive\n * @name mdProgressLinear\n * @module material.components.progressLinear\n * @restrict E\n *\n * @description\n * The linear progress directive is used to make loading content\n * in your app as delightful and painless as possible by minimizing\n * the amount of visual change a user sees before they can view\n * and interact with content.\n *\n * Each operation should only be represented by one activity indicator\n * For example: one refresh operation should not display both a\n * refresh bar and an activity circle.\n *\n * For operations where the percentage of the operation completed\n * can be determined, use a determinate indicator. They give users\n * a quick sense of how long an operation will take.\n *\n * For operations where the user is asked to wait a moment while\n * something finishes up, and it’s not necessary to expose what's\n * happening behind the scenes and how long it will take, use an\n * indeterminate indicator.\n *\n * @param {string} md-mode Select from one of four modes: determinate, indeterminate, buffer or query.\n *\n * Note: if the `md-mode` value is set as undefined or specified as 1 of the four (4) valid modes, then `indeterminate`\n * will be auto-applied as the mode.\n *\n * Note: if not configured, the `md-mode=\"indeterminate\"` will be auto injected as an attribute. If `value=\"\"` is also specified, however,\n * then `md-mode=\"determinate\"` would be auto-injected instead.\n * @param {number=} value In determinate and buffer modes, this number represents the percentage of the primary progress bar. Default: 0\n * @param {number=} md-buffer-value In the buffer mode, this number represents the percentage of the secondary progress bar. Default: 0\n * @param {boolean=} ng-disabled Determines whether to disable the progress element.\n *\n * @usage\n * <hljs lang=\"html\">\n * <md-progress-linear md-mode=\"determinate\" value=\"...\"></md-progress-linear>\n *\n * <md-progress-linear md-mode=\"determinate\" ng-value=\"...\"></md-progress-linear>\n *\n * <md-progress-linear md-mode=\"indeterminate\"></md-progress-linear>\n *\n * <md-progress-linear md-mode=\"buffer\" value=\"...\" md-buffer-value=\"...\"></md-progress-linear>\n *\n * <md-progress-linear md-mode=\"query\"></md-progress-linear>\n * </hljs>\n */\nfunction MdProgressLinearDirective($mdTheming, $mdUtil, $log) {\n  var MODE_DETERMINATE = \"determinate\";\n  var MODE_INDETERMINATE = \"indeterminate\";\n  var MODE_BUFFER = \"buffer\";\n  var MODE_QUERY = \"query\";\n  var DISABLED_CLASS = \"_md-progress-linear-disabled\";\n\n  return {\n    restrict: 'E',\n    template: '<div class=\"md-container\">' +\n      '<div class=\"md-dashed\"></div>' +\n      '<div class=\"md-bar md-bar1\"></div>' +\n      '<div class=\"md-bar md-bar2\"></div>' +\n      '</div>',\n    compile: compile\n  };\n\n  function compile(tElement, tAttrs, transclude) {\n    tElement.attr('aria-valuemin', 0);\n    tElement.attr('aria-valuemax', 100);\n    tElement.attr('role', 'progressbar');\n\n    return postLink;\n  }\n  function postLink(scope, element, attr) {\n    $mdTheming(element);\n\n    var lastMode;\n    var isDisabled = attr.hasOwnProperty('disabled');\n    var toVendorCSS = $mdUtil.dom.animator.toCss;\n    var bar1 = angular.element(element[0].querySelector('.md-bar1'));\n    var bar2 = angular.element(element[0].querySelector('.md-bar2'));\n    var container = angular.element(element[0].querySelector('.md-container'));\n\n    element\n      .attr('md-mode', mode())\n      .toggleClass(DISABLED_CLASS, isDisabled);\n\n    validateMode();\n    watchAttributes();\n\n    /**\n     * Watch the value, md-buffer-value, and md-mode attributes\n     */\n    function watchAttributes() {\n      attr.$observe('value', function(value) {\n        var percentValue = clamp(value);\n        element.attr('aria-valuenow', percentValue);\n\n        if (mode() != MODE_QUERY) animateIndicator(bar2, percentValue);\n      });\n\n      attr.$observe('mdBufferValue', function(value) {\n        animateIndicator(bar1, clamp(value));\n      });\n\n      attr.$observe('disabled', function(value) {\n        if (value === true || value === false) {\n          isDisabled = !!value;\n        } else {\n          isDisabled = angular.isDefined(value);\n        }\n\n        element.toggleClass(DISABLED_CLASS, isDisabled);\n        container.toggleClass(lastMode, !isDisabled);\n      });\n\n      attr.$observe('mdMode', function(mode) {\n        if (lastMode) container.removeClass( lastMode );\n\n        switch( mode ) {\n          case MODE_QUERY:\n          case MODE_BUFFER:\n          case MODE_DETERMINATE:\n          case MODE_INDETERMINATE:\n            container.addClass( lastMode = \"md-mode-\" + mode );\n            break;\n          default:\n            container.addClass( lastMode = \"md-mode-\" + MODE_INDETERMINATE );\n            break;\n        }\n      });\n    }\n\n    /**\n     * Auto-defaults the mode to either `determinate` or `indeterminate` mode; if not specified\n     */\n    function validateMode() {\n      if ( angular.isUndefined(attr.mdMode) ) {\n        var hasValue = angular.isDefined(attr.value);\n        var mode = hasValue ? MODE_DETERMINATE : MODE_INDETERMINATE;\n        var info = \"Auto-adding the missing md-mode='{0}' to the ProgressLinear element\";\n\n        //$log.debug( $mdUtil.supplant(info, [mode]) );\n\n        element.attr(\"md-mode\", mode);\n        attr.mdMode = mode;\n      }\n    }\n\n    /**\n     * Is the md-mode a valid option?\n     */\n    function mode() {\n      var value = (attr.mdMode || \"\").trim();\n      if ( value ) {\n        switch(value) {\n          case MODE_DETERMINATE:\n          case MODE_INDETERMINATE:\n          case MODE_BUFFER:\n          case MODE_QUERY:\n            break;\n          default:\n            value = MODE_INDETERMINATE;\n            break;\n        }\n      }\n      return value;\n    }\n\n    /**\n     * Manually set CSS to animate the Determinate indicator based on the specified\n     * percentage value (0-100).\n     */\n    function animateIndicator(target, value) {\n      if ( isDisabled || !mode() ) return;\n\n      var to = $mdUtil.supplant(\"translateX({0}%) scale({1},1)\", [ (value-100)/2, value/100 ]);\n      var styles = toVendorCSS({ transform : to });\n      angular.element(target).css( styles );\n    }\n  }\n\n  /**\n   * Clamps the value to be between 0 and 100.\n   * @param {number} value The value to clamp.\n   * @returns {number}\n   */\n  function clamp(value) {\n    return Math.max(0, Math.min(value || 0, 100));\n  }\n}\n\n\n})();\n(function(){\n\"use strict\";\n\n/**\n * @ngdoc module\n * @name material.components.radioButton\n * @description radioButton module!\n */\nmdRadioGroupDirective.$inject = [\"$mdUtil\", \"$mdConstant\", \"$mdTheming\", \"$timeout\"];\nmdRadioButtonDirective.$inject = [\"$mdAria\", \"$mdUtil\", \"$mdTheming\"];\nangular.module('material.components.radioButton', [\n  'material.core'\n])\n  .directive('mdRadioGroup', mdRadioGroupDirective)\n  .directive('mdRadioButton', mdRadioButtonDirective);\n\n/**\n * @ngdoc directive\n * @module material.components.radioButton\n * @name mdRadioGroup\n *\n * @restrict E\n *\n * @description\n * The `<md-radio-group>` directive identifies a grouping\n * container for the 1..n grouped radio buttons; specified using nested\n * `<md-radio-button>` tags.\n *\n * As per the [material design spec](http://www.google.com/design/spec/style/color.html#color-ui-color-application)\n * the radio button is in the accent color by default. The primary color palette may be used with\n * the `md-primary` class.\n *\n * Note: `<md-radio-group>` and `<md-radio-button>` handle tabindex differently\n * than the native `<input type='radio'>` controls. Whereas the native controls\n * force the user to tab through all the radio buttons, `<md-radio-group>`\n * is focusable, and by default the `<md-radio-button>`s are not.\n *\n * @param {string} ng-model Assignable angular expression to data-bind to.\n * @param {boolean=} md-no-ink Use of attribute indicates flag to disable ink ripple effects.\n * @param {string} ngModel Assignable angular expression to data-bind to.\n * @param {string=} ngChange AngularJS expression to be executed when input changes due to user\n *    interaction with the input element.\n *\n * @usage\n * <hljs lang=\"html\">\n * <md-radio-group ng-model=\"selected\">\n *\n *   <md-radio-button\n *        ng-repeat=\"d in colorOptions\"\n *        ng-value=\"d.value\" aria-label=\"{{ d.label }}\">\n *\n *          {{ d.label }}\n *\n *   </md-radio-button>\n *\n * </md-radio-group>\n * </hljs>\n *\n */\nfunction mdRadioGroupDirective($mdUtil, $mdConstant, $mdTheming, $timeout) {\n  RadioGroupController.prototype = createRadioGroupControllerProto();\n\n  return {\n    restrict: 'E',\n    controller: ['$element', RadioGroupController],\n    require: ['mdRadioGroup', '?ngModel'],\n    link: { pre: linkRadioGroup }\n  };\n\n  function linkRadioGroup(scope, element, attr, ctrls) {\n    element.addClass('_md');     // private md component indicator for styling\n    $mdTheming(element);\n\n    var rgCtrl = ctrls[0];\n    var ngModelCtrl = ctrls[1] || $mdUtil.fakeNgModel();\n\n    rgCtrl.init(ngModelCtrl);\n\n    scope.mouseActive = false;\n\n    element\n      .attr({\n        'role': 'radiogroup',\n        'tabIndex': element.attr('tabindex') || '0'\n      })\n      .on('keydown', keydownListener)\n      .on('mousedown', function(event) {\n        scope.mouseActive = true;\n        $timeout(function() {\n          scope.mouseActive = false;\n        }, 100);\n      })\n      .on('focus', function() {\n        if(scope.mouseActive === false) {\n          rgCtrl.$element.addClass('md-focused');\n        }\n      })\n      .on('blur', function() {\n        rgCtrl.$element.removeClass('md-focused');\n      });\n\n    /**\n     *\n     */\n    function setFocus() {\n      if (!element.hasClass('md-focused')) { element.addClass('md-focused'); }\n    }\n\n    /**\n     *\n     */\n    function keydownListener(ev) {\n      var keyCode = ev.which || ev.keyCode;\n\n      // Only listen to events that we originated ourselves\n      // so that we don't trigger on things like arrow keys in\n      // inputs.\n\n      if (keyCode != $mdConstant.KEY_CODE.ENTER &&\n          ev.currentTarget != ev.target) {\n        return;\n      }\n\n      switch (keyCode) {\n        case $mdConstant.KEY_CODE.LEFT_ARROW:\n        case $mdConstant.KEY_CODE.UP_ARROW:\n          ev.preventDefault();\n          rgCtrl.selectPrevious();\n          setFocus();\n          break;\n\n        case $mdConstant.KEY_CODE.RIGHT_ARROW:\n        case $mdConstant.KEY_CODE.DOWN_ARROW:\n          ev.preventDefault();\n          rgCtrl.selectNext();\n          setFocus();\n          break;\n\n        case $mdConstant.KEY_CODE.ENTER:\n          var form = angular.element($mdUtil.getClosest(element[0], 'form'));\n          if (form.length > 0) {\n            form.triggerHandler('submit');\n          }\n          break;\n      }\n\n    }\n  }\n\n  function RadioGroupController($element) {\n    this._radioButtonRenderFns = [];\n    this.$element = $element;\n  }\n\n  function createRadioGroupControllerProto() {\n    return {\n      init: function(ngModelCtrl) {\n        this._ngModelCtrl = ngModelCtrl;\n        this._ngModelCtrl.$render = angular.bind(this, this.render);\n      },\n      add: function(rbRender) {\n        this._radioButtonRenderFns.push(rbRender);\n      },\n      remove: function(rbRender) {\n        var index = this._radioButtonRenderFns.indexOf(rbRender);\n        if (index !== -1) {\n          this._radioButtonRenderFns.splice(index, 1);\n        }\n      },\n      render: function() {\n        this._radioButtonRenderFns.forEach(function(rbRender) {\n          rbRender();\n        });\n      },\n      setViewValue: function(value, eventType) {\n        this._ngModelCtrl.$setViewValue(value, eventType);\n        // update the other radio buttons as well\n        this.render();\n      },\n      getViewValue: function() {\n        return this._ngModelCtrl.$viewValue;\n      },\n      selectNext: function() {\n        return changeSelectedButton(this.$element, 1);\n      },\n      selectPrevious: function() {\n        return changeSelectedButton(this.$element, -1);\n      },\n      setActiveDescendant: function (radioId) {\n        this.$element.attr('aria-activedescendant', radioId);\n      },\n      isDisabled: function() {\n        return this.$element[0].hasAttribute('disabled');\n      }\n    };\n  }\n  /**\n   * Change the radio group's selected button by a given increment.\n   * If no button is selected, select the first button.\n   */\n  function changeSelectedButton(parent, increment) {\n    // Coerce all child radio buttons into an array, then wrap then in an iterator\n    var buttons = $mdUtil.iterator(parent[0].querySelectorAll('md-radio-button'), true);\n\n    if (buttons.count()) {\n      var validate = function (button) {\n        // If disabled, then NOT valid\n        return !angular.element(button).attr(\"disabled\");\n      };\n\n      var selected = parent[0].querySelector('md-radio-button.md-checked');\n      var target = buttons[increment < 0 ? 'previous' : 'next'](selected, validate) || buttons.first();\n\n      // Activate radioButton's click listener (triggerHandler won't create a real click event)\n      angular.element(target).triggerHandler('click');\n    }\n  }\n\n}\n\n/**\n * @ngdoc directive\n * @module material.components.radioButton\n * @name mdRadioButton\n *\n * @restrict E\n *\n * @description\n * The `<md-radio-button>`directive is the child directive required to be used within `<md-radio-group>` elements.\n *\n * While similar to the `<input type=\"radio\" ng-model=\"\" value=\"\">` directive,\n * the `<md-radio-button>` directive provides ink effects, ARIA support, and\n * supports use within named radio groups.\n *\n * @param {string} ngValue AngularJS expression which sets the value to which the expression should\n *    be set when selected.\n * @param {string} value The value to which the expression should be set when selected.\n * @param {string=} name Property name of the form under which the control is published.\n * @param {string=} aria-label Adds label to radio button for accessibility.\n * Defaults to radio button's text. If no text content is available, a warning will be logged.\n *\n * @usage\n * <hljs lang=\"html\">\n *\n * <md-radio-button value=\"1\" aria-label=\"Label 1\">\n *   Label 1\n * </md-radio-button>\n *\n * <md-radio-button ng-value=\"specialValue\" aria-label=\"Green\">\n *   Green\n * </md-radio-button>\n *\n * </hljs>\n *\n */\nfunction mdRadioButtonDirective($mdAria, $mdUtil, $mdTheming) {\n\n  var CHECKED_CSS = 'md-checked';\n\n  return {\n    restrict: 'E',\n    require: '^mdRadioGroup',\n    transclude: true,\n    template: '<div class=\"md-container\" md-ink-ripple md-ink-ripple-checkbox>' +\n                '<div class=\"md-off\"></div>' +\n                '<div class=\"md-on\"></div>' +\n              '</div>' +\n              '<div ng-transclude class=\"md-label\"></div>',\n    link: link\n  };\n\n  function link(scope, element, attr, rgCtrl) {\n    var lastChecked;\n\n    $mdTheming(element);\n    configureAria(element, scope);\n\n    // ngAria overwrites the aria-checked inside a $watch for ngValue.\n    // We should defer the initialization until all the watches have fired.\n    // This can also be fixed by removing the `lastChecked` check, but that'll\n    // cause more DOM manipulation on each digest.\n    if (attr.ngValue) {\n      $mdUtil.nextTick(initialize, false);\n    } else {\n      initialize();\n    }\n\n    /**\n     * Initializes the component.\n     */\n    function initialize() {\n      if (!rgCtrl) {\n        throw 'RadioButton: No RadioGroupController could be found.';\n      }\n\n      rgCtrl.add(render);\n      attr.$observe('value', render);\n\n      element\n        .on('click', listener)\n        .on('$destroy', function() {\n          rgCtrl.remove(render);\n        });\n    }\n\n    /**\n     * On click functionality.\n     */\n    function listener(ev) {\n      if (element[0].hasAttribute('disabled') || rgCtrl.isDisabled()) return;\n\n      scope.$apply(function() {\n        rgCtrl.setViewValue(attr.value, ev && ev.type);\n      });\n    }\n\n    /**\n     *  Add or remove the `.md-checked` class from the RadioButton (and conditionally its parent).\n     *  Update the `aria-activedescendant` attribute.\n     */\n    function render() {\n      var checked = rgCtrl.getViewValue() == attr.value;\n\n      if (checked === lastChecked) return;\n\n      if (element[0].parentNode.nodeName.toLowerCase() !== 'md-radio-group') {\n        // If the radioButton is inside a div, then add class so highlighting will work\n        element.parent().toggleClass(CHECKED_CSS, checked);\n      }\n\n      if (checked) {\n        rgCtrl.setActiveDescendant(element.attr('id'));\n      }\n\n      lastChecked = checked;\n\n      element\n        .attr('aria-checked', checked)\n        .toggleClass(CHECKED_CSS, checked);\n    }\n\n    /**\n     * Inject ARIA-specific attributes appropriate for each radio button\n     */\n    function configureAria(element, scope){\n      element.attr({\n        id: attr.id || 'radio_' + $mdUtil.nextUid(),\n        role: 'radio',\n        'aria-checked': 'false'\n      });\n\n      $mdAria.expectWithText(element, 'aria-label');\n    }\n  }\n}\n\n})();\n(function(){\n\"use strict\";\n\n/**\n * @ngdoc module\n * @name material.components.showHide\n */\n\n// Add additional handlers to ng-show and ng-hide that notify directives\n// contained within that they should recompute their size.\n// These run in addition to AngularJS's built-in ng-hide and ng-show directives.\nangular.module('material.components.showHide', [\n  'material.core'\n])\n  .directive('ngShow', createDirective('ngShow', true))\n  .directive('ngHide', createDirective('ngHide', false));\n\n\nfunction createDirective(name, targetValue) {\n  return ['$mdUtil', '$window', function($mdUtil, $window) {\n    return {\n      restrict: 'A',\n      multiElement: true,\n      link: function($scope, $element, $attr) {\n        var unregister = $scope.$on('$md-resize-enable', function() {\n          unregister();\n\n          var node = $element[0];\n          var cachedTransitionStyles = node.nodeType === $window.Node.ELEMENT_NODE ?\n            $window.getComputedStyle(node) : {};\n\n          $scope.$watch($attr[name], function(value) {\n            if (!!value === targetValue) {\n              $mdUtil.nextTick(function() {\n                $scope.$broadcast('$md-resize');\n              });\n\n              var opts = {\n                cachedTransitionStyles: cachedTransitionStyles\n              };\n\n              $mdUtil.dom.animator.waitTransitionEnd($element, opts).then(function() {\n                $scope.$broadcast('$md-resize');\n              });\n            }\n          });\n        });\n      }\n    };\n  }];\n}\n\n})();\n(function(){\n\"use strict\";\n\n/**\n * @ngdoc module\n * @name material.components.sidenav\n *\n * @description\n * A Sidenav QP component.\n */\nSidenavService.$inject = [\"$mdComponentRegistry\", \"$mdUtil\", \"$q\", \"$log\"];\nSidenavDirective.$inject = [\"$mdMedia\", \"$mdUtil\", \"$mdConstant\", \"$mdTheming\", \"$mdInteraction\", \"$animate\", \"$compile\", \"$parse\", \"$log\", \"$q\", \"$document\", \"$window\", \"$$rAF\"];\nSidenavController.$inject = [\"$scope\", \"$attrs\", \"$mdComponentRegistry\", \"$q\", \"$interpolate\"];\nangular\n  .module('material.components.sidenav', [\n    'material.core',\n    'material.components.backdrop'\n  ])\n  .factory('$mdSidenav', SidenavService )\n  .directive('mdSidenav', SidenavDirective)\n  .directive('mdSidenavFocus', SidenavFocusDirective)\n  .controller('$mdSidenavController', SidenavController);\n\n\n/**\n * @ngdoc service\n * @name $mdSidenav\n * @module material.components.sidenav\n *\n * @description\n * `$mdSidenav` makes it easy to interact with multiple sidenavs\n * in an app. When looking up a sidenav instance, you can either look\n * it up synchronously or wait for it to be initializied asynchronously.\n * This is done by passing the second argument to `$mdSidenav`.\n *\n * @usage\n * <hljs lang=\"js\">\n * // Async lookup for sidenav instance; will resolve when the instance is available\n * $mdSidenav(componentId, true).then(function(instance) {\n *   $log.debug( componentId + \"is now ready\" );\n * });\n * // Sync lookup for sidenav instance; this will resolve immediately.\n * $mdSidenav(componentId).then(function(instance) {\n *   $log.debug( componentId + \"is now ready\" );\n * });\n * // Async toggle the given sidenav;\n * // when instance is known ready and lazy lookup is not needed.\n * $mdSidenav(componentId)\n *    .toggle()\n *    .then(function(){\n *      $log.debug('toggled');\n *    });\n * // Async open the given sidenav\n * $mdSidenav(componentId)\n *    .open()\n *    .then(function(){\n *      $log.debug('opened');\n *    });\n * // Async close the given sidenav\n * $mdSidenav(componentId)\n *    .close()\n *    .then(function(){\n *      $log.debug('closed');\n *    });\n * // Sync check to see if the specified sidenav is set to be open\n * $mdSidenav(componentId).isOpen();\n * // Sync check to whether given sidenav is locked open\n * // If this is true, the sidenav will be open regardless of close()\n * $mdSidenav(componentId).isLockedOpen();\n * // On close callback to handle close, backdrop click or escape key pressed\n * // Callback happens BEFORE the close action occurs.\n * $mdSidenav(componentId).onClose(function () {\n *   $log.debug('closing');\n * });\n * </hljs>\n */\nfunction SidenavService($mdComponentRegistry, $mdUtil, $q, $log) {\n  var errorMsg = \"SideNav '{0}' is not available! Did you use md-component-id='{0}'?\";\n  var service = {\n        find    : findInstance,     //  sync  - returns proxy API\n        waitFor : waitForInstance   //  async - returns promise\n      };\n\n  /**\n   * Service API that supports three (3) usages:\n   *   $mdSidenav().find(\"left\")                       // sync (must already exist) or returns undefined\n   *   $mdSidenav(\"left\").toggle();                    // sync (must already exist) or returns reject promise;\n   *   $mdSidenav(\"left\",true).then( function(left){   // async returns instance when available\n   *    left.toggle();\n   *   });\n   */\n  return function(handle, enableWait) {\n    if ( angular.isUndefined(handle) ) return service;\n\n    var shouldWait = enableWait === true;\n    var instance = service.find(handle, shouldWait);\n    return  !instance && shouldWait ? service.waitFor(handle) :\n            !instance && angular.isUndefined(enableWait) ? addLegacyAPI(service, handle) : instance;\n  };\n\n  /**\n   * For failed instance/handle lookups, older-clients expect an response object with noops\n   * that include `rejected promise APIs`\n   */\n  function addLegacyAPI(service, handle) {\n      var falseFn  = function() { return false; };\n      var rejectFn = function() {\n            return $q.when($mdUtil.supplant(errorMsg, [handle || \"\"]));\n          };\n\n      return angular.extend({\n        isLockedOpen : falseFn,\n        isOpen       : falseFn,\n        toggle       : rejectFn,\n        open         : rejectFn,\n        close        : rejectFn,\n        onClose      : angular.noop,\n        then : function(callback) {\n          return waitForInstance(handle)\n            .then(callback || angular.noop);\n        }\n       }, service);\n    }\n    /**\n     * Synchronously lookup the controller instance for the specified sidNav instance which has been\n     * registered with the markup `md-component-id`\n     */\n    function findInstance(handle, shouldWait) {\n      var instance = $mdComponentRegistry.get(handle);\n\n      if (!instance && !shouldWait) {\n\n        // Report missing instance\n        $log.error( $mdUtil.supplant(errorMsg, [handle || \"\"]) );\n\n        // The component has not registered itself... most like NOT yet created\n        // return null to indicate that the Sidenav is not in the DOM\n        return undefined;\n      }\n      return instance;\n    }\n\n    /**\n     * Asynchronously wait for the component instantiation,\n     * Deferred lookup of component instance using $component registry\n     */\n    function waitForInstance(handle) {\n      return $mdComponentRegistry.when(handle).catch($log.error);\n    }\n}\n/**\n * @ngdoc directive\n * @name mdSidenavFocus\n * @module material.components.sidenav\n *\n * @restrict A\n *\n * @description\n * `mdSidenavFocus` provides a way to specify the focused element when a sidenav opens.\n * This is completely optional, as the sidenav itself is focused by default.\n *\n * @usage\n * <hljs lang=\"html\">\n * <md-sidenav>\n *   <form>\n *     <md-input-container>\n *       <label for=\"testInput\">Label</label>\n *       <input id=\"testInput\" type=\"text\" md-sidenav-focus>\n *     </md-input-container>\n *   </form>\n * </md-sidenav>\n * </hljs>\n **/\nfunction SidenavFocusDirective() {\n  return {\n    restrict: 'A',\n    require: '^mdSidenav',\n    link: function(scope, element, attr, sidenavCtrl) {\n      // @see $mdUtil.findFocusTarget(...)\n    }\n  };\n}\n/**\n * @ngdoc directive\n * @name mdSidenav\n * @module material.components.sidenav\n * @restrict E\n *\n * @description\n *\n * A Sidenav component that can be opened and closed programatically.\n *\n * By default, upon opening it will slide out on top of the main content area.\n *\n * For keyboard and screen reader accessibility, focus is sent to the sidenav wrapper by default.\n * It can be overridden with the `md-autofocus` directive on the child element you want focused.\n *\n * @usage\n * <hljs lang=\"html\">\n * <div layout=\"row\" ng-controller=\"MyController\">\n *   <md-sidenav md-component-id=\"left\" class=\"md-sidenav-left\">\n *     Left Nav!\n *   </md-sidenav>\n *\n *   <md-content>\n *     Center Content\n *     <md-button ng-click=\"openLeftMenu()\">\n *       Open Left Menu\n *     </md-button>\n *   </md-content>\n *\n *   <md-sidenav md-component-id=\"right\"\n *     md-is-locked-open=\"$mdMedia('min-width: 333px')\"\n *     class=\"md-sidenav-right\">\n *     <form>\n *       <md-input-container>\n *         <label for=\"testInput\">Test input</label>\n *         <input id=\"testInput\" type=\"text\"\n *                ng-model=\"data\" md-autofocus>\n *       </md-input-container>\n *     </form>\n *   </md-sidenav>\n * </div>\n * </hljs>\n *\n * <hljs lang=\"js\">\n * var app = angular.module('myApp', ['ngMaterial']);\n * app.controller('MyController', function($scope, $mdSidenav) {\n *   $scope.openLeftMenu = function() {\n *     $mdSidenav('left').toggle();\n *   };\n * });\n * </hljs>\n *\n * @param {expression=} md-is-open A model bound to whether the sidenav is opened.\n * @param {boolean=} md-disable-backdrop When present in the markup, the sidenav will not show a backdrop.\n * @param {string=} md-component-id componentId to use with $mdSidenav service.\n * @param {expression=} md-is-locked-open When this expression evaluates to true,\n * the sidenav 'locks open': it falls into the content's flow instead\n * of appearing over it. This overrides the `md-is-open` attribute.\n * @param {string=} md-disable-scroll-target Selector, pointing to an element, whose scrolling will\n * be disabled when the sidenav is opened. By default this is the sidenav's direct parent.\n *\n* The $mdMedia() service is exposed to the is-locked-open attribute, which\n * can be given a media query or one of the `sm`, `gt-sm`, `md`, `gt-md`, `lg` or `gt-lg` presets.\n * Examples:\n *\n *   - `<md-sidenav md-is-locked-open=\"shouldLockOpen\"></md-sidenav>`\n *   - `<md-sidenav md-is-locked-open=\"$mdMedia('min-width: 1000px')\"></md-sidenav>`\n *   - `<md-sidenav md-is-locked-open=\"$mdMedia('sm')\"></md-sidenav>` (locks open on small screens)\n */\nfunction SidenavDirective($mdMedia, $mdUtil, $mdConstant, $mdTheming, $mdInteraction, $animate,\n                          $compile, $parse, $log, $q, $document, $window, $$rAF) {\n  return {\n    restrict: 'E',\n    scope: {\n      isOpen: '=?mdIsOpen'\n    },\n    controller: '$mdSidenavController',\n    compile: function(element) {\n      element.addClass('md-closed').attr('tabIndex', '-1');\n      return postLink;\n    }\n  };\n\n  /**\n   * Directive Post Link function...\n   */\n  function postLink(scope, element, attr, sidenavCtrl) {\n    var lastParentOverFlow;\n    var backdrop;\n    var disableScrollTarget = null;\n    var triggeringInteractionType;\n    var triggeringElement = null;\n    var previousContainerStyles;\n    var promise = $q.when(true);\n    var isLockedOpenParsed = $parse(attr.mdIsLockedOpen);\n    var ngWindow = angular.element($window);\n    var isLocked = function() {\n      return isLockedOpenParsed(scope.$parent, {\n        $media: function(arg) {\n          $log.warn(\"$media is deprecated for is-locked-open. Use $mdMedia instead.\");\n          return $mdMedia(arg);\n        },\n        $mdMedia: $mdMedia\n      });\n    };\n\n    if (attr.mdDisableScrollTarget) {\n      disableScrollTarget = $document[0].querySelector(attr.mdDisableScrollTarget);\n\n      if (disableScrollTarget) {\n        disableScrollTarget = angular.element(disableScrollTarget);\n      } else {\n        $log.warn($mdUtil.supplant('mdSidenav: couldn\\'t find element matching ' +\n          'selector \"{selector}\". Falling back to parent.', { selector: attr.mdDisableScrollTarget }));\n      }\n    }\n\n    if (!disableScrollTarget) {\n      disableScrollTarget = element.parent();\n    }\n\n    // Only create the backdrop if the backdrop isn't disabled.\n    if (!attr.hasOwnProperty('mdDisableBackdrop')) {\n      backdrop = $mdUtil.createBackdrop(scope, \"md-sidenav-backdrop md-opaque ng-enter\");\n    }\n\n    element.addClass('_md');     // private md component indicator for styling\n    $mdTheming(element);\n\n    // The backdrop should inherit the sidenavs theme,\n    // because the backdrop will take its parent theme by default.\n    if ( backdrop ) $mdTheming.inherit(backdrop, element);\n\n    element.on('$destroy', function() {\n      backdrop && backdrop.remove();\n      sidenavCtrl.destroy();\n    });\n\n    scope.$on('$destroy', function(){\n      backdrop && backdrop.remove();\n    });\n\n    scope.$watch(isLocked, updateIsLocked);\n    scope.$watch('isOpen', updateIsOpen);\n\n\n    // Publish special accessor for the Controller instance\n    sidenavCtrl.$toggleOpen = toggleOpen;\n\n    /**\n     * Toggle the DOM classes to indicate `locked`\n     * @param isLocked\n     */\n    function updateIsLocked(isLocked, oldValue) {\n      scope.isLockedOpen = isLocked;\n      if (isLocked === oldValue) {\n        element.toggleClass('md-locked-open', !!isLocked);\n      } else {\n        $animate[isLocked ? 'addClass' : 'removeClass'](element, 'md-locked-open');\n      }\n      if (backdrop) {\n        backdrop.toggleClass('md-locked-open', !!isLocked);\n      }\n    }\n\n    /**\n     * Toggle the SideNav view and attach/detach listeners\n     * @param isOpen\n     */\n    function updateIsOpen(isOpen) {\n      // Support deprecated md-sidenav-focus attribute as fallback\n      var focusEl = $mdUtil.findFocusTarget(element) || $mdUtil.findFocusTarget(element,'[md-sidenav-focus]') || element;\n      var parent = element.parent();\n\n      parent[isOpen ? 'on' : 'off']('keydown', onKeyDown);\n      if (backdrop) backdrop[isOpen ? 'on' : 'off']('click', close);\n\n      var restorePositioning = updateContainerPositions(parent, isOpen);\n\n      if ( isOpen ) {\n        // Capture upon opening..\n        triggeringElement = $document[0].activeElement;\n        triggeringInteractionType = $mdInteraction.getLastInteractionType();\n      }\n\n      disableParentScroll(isOpen);\n\n      return promise = $q.all([\n        isOpen && backdrop ? $animate.enter(backdrop, parent) : backdrop ?\n                             $animate.leave(backdrop) : $q.when(true),\n        $animate[isOpen ? 'removeClass' : 'addClass'](element, 'md-closed')\n      ]).then(function() {\n        // Perform focus when animations are ALL done...\n        if (scope.isOpen) {\n          $$rAF(function() {\n            // Notifies child components that the sidenav was opened. Should wait\n            // a frame in order to allow for the element height to be computed.\n            ngWindow.triggerHandler('resize');\n          });\n\n          focusEl && focusEl.focus();\n        }\n\n        // Restores the positioning on the sidenav and backdrop.\n        restorePositioning && restorePositioning();\n      });\n    }\n\n    function updateContainerPositions(parent, willOpen) {\n      var drawerEl = element[0];\n      var scrollTop = parent[0].scrollTop;\n\n      if (willOpen && scrollTop) {\n        previousContainerStyles = {\n          top: drawerEl.style.top,\n          bottom: drawerEl.style.bottom,\n          height: drawerEl.style.height\n        };\n\n        // When the parent is scrolled down, then we want to be able to show the sidenav at the current scroll\n        // position. We're moving the sidenav down to the correct scroll position and apply the height of the\n        // parent, to increase the performance. Using 100% as height, will impact the performance heavily.\n        var positionStyle = {\n          top: scrollTop + 'px',\n          bottom: 'auto',\n          height: parent[0].clientHeight + 'px'\n        };\n\n        // Apply the new position styles to the sidenav and backdrop.\n        element.css(positionStyle);\n        backdrop.css(positionStyle);\n      }\n\n      // When the sidenav is closing and we have previous defined container styles,\n      // then we return a restore function, which resets the sidenav and backdrop.\n      if (!willOpen && previousContainerStyles) {\n        return function() {\n          drawerEl.style.top = previousContainerStyles.top;\n          drawerEl.style.bottom = previousContainerStyles.bottom;\n          drawerEl.style.height = previousContainerStyles.height;\n\n          backdrop[0].style.top = null;\n          backdrop[0].style.bottom = null;\n          backdrop[0].style.height = null;\n\n          previousContainerStyles = null;\n        };\n      }\n    }\n\n    /**\n     * Prevent parent scrolling (when the SideNav is open)\n     */\n    function disableParentScroll(disabled) {\n      if ( disabled && !lastParentOverFlow ) {\n        lastParentOverFlow = disableScrollTarget.css('overflow');\n        disableScrollTarget.css('overflow', 'hidden');\n      } else if (angular.isDefined(lastParentOverFlow)) {\n        disableScrollTarget.css('overflow', lastParentOverFlow);\n        lastParentOverFlow = undefined;\n      }\n    }\n\n    /**\n     * Toggle the sideNav view and publish a promise to be resolved when\n     * the view animation finishes.\n     *\n     * @param isOpen\n     * @returns {*}\n     */\n    function toggleOpen( isOpen ) {\n      if (scope.isOpen == isOpen ) {\n\n        return $q.when(true);\n\n      } else {\n        if (scope.isOpen && sidenavCtrl.onCloseCb) sidenavCtrl.onCloseCb();\n\n        return $q(function(resolve){\n          // Toggle value to force an async `updateIsOpen()` to run\n          scope.isOpen = isOpen;\n\n          $mdUtil.nextTick(function() {\n            // When the current `updateIsOpen()` animation finishes\n            promise.then(function(result) {\n\n              if ( !scope.isOpen && triggeringElement && triggeringInteractionType === 'keyboard') {\n                // reset focus to originating element (if available) upon close\n                triggeringElement.focus();\n                triggeringElement = null;\n              }\n\n              resolve(result);\n            });\n          });\n\n        });\n\n      }\n    }\n\n    /**\n     * Auto-close sideNav when the `escape` key is pressed.\n     * @param evt\n     */\n    function onKeyDown(ev) {\n      var isEscape = (ev.keyCode === $mdConstant.KEY_CODE.ESCAPE);\n      return isEscape ? close(ev) : $q.when(true);\n    }\n\n    /**\n     * With backdrop `clicks` or `escape` key-press, immediately\n     * apply the CSS close transition... Then notify the controller\n     * to close() and perform its own actions.\n     */\n    function close(ev) {\n      ev.preventDefault();\n\n      return sidenavCtrl.close();\n    }\n\n  }\n}\n\n/*\n * @private\n * @ngdoc controller\n * @name SidenavController\n * @module material.components.sidenav\n */\nfunction SidenavController($scope, $attrs, $mdComponentRegistry, $q, $interpolate) {\n\n  var self = this;\n\n  // Use Default internal method until overridden by directive postLink\n\n  // Synchronous getters\n  self.isOpen = function() { return !!$scope.isOpen; };\n  self.isLockedOpen = function() { return !!$scope.isLockedOpen; };\n\n  // Synchronous setters\n  self.onClose = function (callback) {\n    self.onCloseCb = callback;\n    return self;\n  };\n\n  // Async actions\n  self.open   = function() { return self.$toggleOpen( true );  };\n  self.close  = function() { return self.$toggleOpen( false ); };\n  self.toggle = function() { return self.$toggleOpen( !$scope.isOpen );  };\n  self.$toggleOpen = function(value) { return $q.when($scope.isOpen = value); };\n\n  // Evaluate the component id.\n  var rawId = $attrs.mdComponentId;\n  var hasDataBinding = rawId && rawId.indexOf($interpolate.startSymbol()) > -1;\n  var componentId = hasDataBinding ? $interpolate(rawId)($scope.$parent) : rawId;\n\n  // Register the component.\n  self.destroy = $mdComponentRegistry.register(self, componentId);\n\n  // Watch and update the component, if the id has changed.\n  if (hasDataBinding) {\n    $attrs.$observe('mdComponentId', function(id) {\n      if (id && id !== self.$$mdHandle) {\n        self.destroy(); // `destroy` only deregisters the old component id so we can add the new one.\n        self.destroy = $mdComponentRegistry.register(self, id);\n      }\n    });\n  }\n}\n\n})();\n(function(){\n\"use strict\";\n\n/**\n * @ngdoc module\n * @name material.components.select\n */\n\n/***************************************************\n\n ### TODO - POST RC1 ###\n - [ ] Abstract placement logic in $mdSelect service to $mdMenu service\n\n ***************************************************/\n\nSelectDirective.$inject = [\"$mdSelect\", \"$mdUtil\", \"$mdConstant\", \"$mdTheming\", \"$mdAria\", \"$parse\", \"$sce\", \"$injector\"];\nSelectMenuDirective.$inject = [\"$parse\", \"$mdUtil\", \"$mdConstant\", \"$mdTheming\"];\nOptionDirective.$inject = [\"$mdButtonInkRipple\", \"$mdUtil\", \"$mdTheming\"];\nSelectProvider.$inject = [\"$$interimElementProvider\"];\nvar SELECT_EDGE_MARGIN = 8;\nvar selectNextId = 0;\nvar CHECKBOX_SELECTION_INDICATOR =\n  angular.element('<div class=\"md-container\"><div class=\"md-icon\"></div></div>');\n\nangular.module('material.components.select', [\n    'material.core',\n    'material.components.backdrop'\n  ])\n  .directive('mdSelect', SelectDirective)\n  .directive('mdSelectMenu', SelectMenuDirective)\n  .directive('mdOption', OptionDirective)\n  .directive('mdOptgroup', OptgroupDirective)\n  .directive('mdSelectHeader', SelectHeaderDirective)\n  .provider('$mdSelect', SelectProvider);\n\n/**\n * @ngdoc directive\n * @name mdSelect\n * @restrict E\n * @module material.components.select\n *\n * @description Displays a select box, bound to an ng-model.\n *\n * When the select is required and uses a floating label, then the label will automatically contain\n * an asterisk (`*`). This behavior can be disabled by using the `md-no-asterisk` attribute.\n *\n * By default, the select will display with an underline to match other form elements. This can be\n * disabled by applying the `md-no-underline` CSS class.\n *\n * ### Option Params\n *\n * When applied, `md-option-empty` will mark the option as \"empty\" allowing the option to  clear the\n * select and put it back in it's default state. You may supply this attribute on any option you\n * wish, however, it is automatically applied to an option whose `value` or `ng-value` are not\n * defined.\n *\n * **Automatically Applied**\n *\n *  - `<md-option>`\n *  - `<md-option value>`\n *  - `<md-option value=\"\">`\n *  - `<md-option ng-value>`\n *  - `<md-option ng-value=\"\">`\n *\n * **NOT Automatically Applied**\n *\n *  - `<md-option ng-value=\"1\">`\n *  - `<md-option ng-value=\"''\">`\n *  - `<md-option ng-value=\"undefined\">`\n *  - `<md-option value=\"undefined\">` (this evaluates to the string `\"undefined\"`)\n *  - <code ng-non-bindable>&lt;md-option ng-value=\"{{someValueThatMightBeUndefined}}\"&gt;</code>\n *\n * **Note:** A value of `undefined` ***is considered a valid value*** (and does not auto-apply this\n * attribute) since you may wish this to be your \"Not Available\" or \"None\" option.\n *\n * **Note:** Using the `value` attribute (as opposed to `ng-value`) always evaluates to a string, so\n * `value=\"null\"` will require the test `ng-if=\"myValue != 'null'\"` rather than `ng-if=\"!myValue\"`.\n *\n * @param {expression} ng-model The model!\n * @param {boolean=} multiple When set to true, allows for more than one option to be selected. The model is an array with the selected choices.\n * @param {expression=} md-on-close Expression to be evaluated when the select is closed.\n * @param {expression=} md-on-open Expression to be evaluated when opening the select.\n * Will hide the select options and show a spinner until the evaluated promise resolves.\n * @param {expression=} md-selected-text Expression to be evaluated that will return a string\n * to be displayed as a placeholder in the select input box when it is closed. The value\n * will be treated as *text* (not html).\n * @param {expression=} md-selected-html Expression to be evaluated that will return a string\n * to be displayed as a placeholder in the select input box when it is closed. The value\n * will be treated as *html*. The value must either be explicitly marked as trustedHtml or\n * the ngSanitize module must be loaded.\n * @param {string=} placeholder Placeholder hint text.\n * @param md-no-asterisk {boolean=} When set to true, an asterisk will not be appended to the\n * floating label. **Note:** This attribute is only evaluated once; it is not watched.\n * @param {string=} aria-label Optional label for accessibility. Only necessary if no placeholder or\n * explicit label is present.\n * @param {string=} md-container-class Class list to get applied to the `.md-select-menu-container`\n * element (for custom styling).\n *\n * @usage\n * With a placeholder (label and aria-label are added dynamically)\n * <hljs lang=\"html\">\n *   <md-input-container>\n *     <md-select\n *       ng-model=\"someModel\"\n *       placeholder=\"Select a state\">\n *       <md-option ng-value=\"opt\" ng-repeat=\"opt in neighborhoods2\">{{ opt }}</md-option>\n *     </md-select>\n *   </md-input-container>\n * </hljs>\n *\n * With an explicit label\n * <hljs lang=\"html\">\n *   <md-input-container>\n *     <label>State</label>\n *     <md-select\n *       ng-model=\"someModel\">\n *       <md-option ng-value=\"opt\" ng-repeat=\"opt in neighborhoods2\">{{ opt }}</md-option>\n *     </md-select>\n *   </md-input-container>\n * </hljs>\n *\n * With a select-header\n *\n * When a developer needs to put more than just a text label in the\n * md-select-menu, they should use the md-select-header.\n * The user can put custom HTML inside of the header and style it to their liking.\n * One common use case of this would be a sticky search bar.\n *\n * When using the md-select-header the labels that would previously be added to the\n * OptGroupDirective are ignored.\n *\n * <hljs lang=\"html\">\n *   <md-input-container>\n *     <md-select ng-model=\"someModel\">\n *       <md-select-header>\n *         <span> Neighborhoods - </span>\n *       </md-select-header>\n *       <md-option ng-value=\"opt\" ng-repeat=\"opt in neighborhoods2\">{{ opt }}</md-option>\n *     </md-select>\n *   </md-input-container>\n * </hljs>\n *\n * ## Selects and object equality\n * When using a `md-select` to pick from a list of objects, it is important to realize how javascript handles\n * equality. Consider the following example:\n * <hljs lang=\"js\">\n * angular.controller('MyCtrl', function($scope) {\n *   $scope.users = [\n *     { id: 1, name: 'Bob' },\n *     { id: 2, name: 'Alice' },\n *     { id: 3, name: 'Steve' }\n *   ];\n *   $scope.selectedUser = { id: 1, name: 'Bob' };\n * });\n * </hljs>\n * <hljs lang=\"html\">\n * <div ng-controller=\"MyCtrl\">\n *   <md-select ng-model=\"selectedUser\">\n *     <md-option ng-value=\"user\" ng-repeat=\"user in users\">{{ user.name }}</md-option>\n *   </md-select>\n * </div>\n * </hljs>\n *\n * At first one might expect that the select should be populated with \"Bob\" as the selected user. However,\n * this is not true. To determine whether something is selected,\n * `ngModelController` is looking at whether `$scope.selectedUser == (any user in $scope.users);`;\n *\n * Javascript's `==` operator does not check for deep equality (ie. that all properties\n * on the object are the same), but instead whether the objects are *the same object in memory*.\n * In this case, we have two instances of identical objects, but they exist in memory as unique\n * entities. Because of this, the select will have no value populated for a selected user.\n *\n * To get around this, `ngModelController` provides a `track by` option that allows us to specify a different\n * expression which will be used for the equality operator. As such, we can update our `html` to\n * make use of this by specifying the `ng-model-options=\"{trackBy: '$value.id'}\"` on the `md-select`\n * element. This converts our equality expression to be\n * `$scope.selectedUser.id == (any id in $scope.users.map(function(u) { return u.id; }));`\n * which results in Bob being selected as desired.\n *\n * Working HTML:\n * <hljs lang=\"html\">\n * <div ng-controller=\"MyCtrl\">\n *   <md-select ng-model=\"selectedUser\" ng-model-options=\"{trackBy: '$value.id'}\">\n *     <md-option ng-value=\"user\" ng-repeat=\"user in users\">{{ user.name }}</md-option>\n *   </md-select>\n * </div>\n * </hljs>\n */\nfunction SelectDirective($mdSelect, $mdUtil, $mdConstant, $mdTheming, $mdAria, $parse, $sce,\n    $injector) {\n  var keyCodes = $mdConstant.KEY_CODE;\n  var NAVIGATION_KEYS = [keyCodes.SPACE, keyCodes.ENTER, keyCodes.UP_ARROW, keyCodes.DOWN_ARROW];\n\n  return {\n    restrict: 'E',\n    require: ['^?mdInputContainer', 'mdSelect', 'ngModel', '?^form'],\n    compile: compile,\n    controller: function() {\n    } // empty placeholder controller to be initialized in link\n  };\n\n  function compile(element, attr) {\n    // add the select value that will hold our placeholder or selected option value\n    var valueEl = angular.element('<md-select-value><span></span></md-select-value>');\n    valueEl.append('<span class=\"md-select-icon\" aria-hidden=\"true\"></span>');\n    valueEl.addClass('md-select-value');\n    if (!valueEl[0].hasAttribute('id')) {\n      valueEl.attr('id', 'select_value_label_' + $mdUtil.nextUid());\n    }\n\n    // There's got to be an md-content inside. If there's not one, let's add it.\n    if (!element.find('md-content').length) {\n      element.append(angular.element('<md-content>').append(element.contents()));\n    }\n\n\n    // Add progress spinner for md-options-loading\n    if (attr.mdOnOpen) {\n\n      // Show progress indicator while loading async\n      // Use ng-hide for `display:none` so the indicator does not interfere with the options list\n      element\n        .find('md-content')\n        .prepend(angular.element(\n          '<div>' +\n          ' <md-progress-circular md-mode=\"indeterminate\" ng-if=\"$$loadingAsyncDone === false\" md-diameter=\"25px\"></md-progress-circular>' +\n          '</div>'\n        ));\n\n      // Hide list [of item options] while loading async\n      element\n        .find('md-option')\n        .attr('ng-show', '$$loadingAsyncDone');\n    }\n\n    if (attr.name) {\n      var autofillClone = angular.element('<select class=\"md-visually-hidden\">');\n      autofillClone.attr({\n        'name': attr.name,\n        'aria-hidden': 'true',\n        'tabindex': '-1'\n      });\n      var opts = element.find('md-option');\n      angular.forEach(opts, function(el) {\n        var newEl = angular.element('<option>' + el.innerHTML + '</option>');\n        if (el.hasAttribute('ng-value')) newEl.attr('ng-value', el.getAttribute('ng-value'));\n        else if (el.hasAttribute('value')) newEl.attr('value', el.getAttribute('value'));\n        autofillClone.append(newEl);\n      });\n\n      // Adds an extra option that will hold the selected value for the\n      // cases where the select is a part of a non-angular form. This can be done with a ng-model,\n      // however if the `md-option` is being `ng-repeat`-ed, AngularJS seems to insert a similar\n      // `option` node, but with a value of `? string: <value> ?` which would then get submitted.\n      // This also goes around having to prepend a dot to the name attribute.\n      autofillClone.append(\n        '<option ng-value=\"' + attr.ngModel + '\" selected></option>'\n      );\n\n      element.parent().append(autofillClone);\n    }\n\n    var isMultiple = $mdUtil.parseAttributeBoolean(attr.multiple);\n\n    // Use everything that's left inside element.contents() as the contents of the menu\n    var multipleContent = isMultiple ? 'multiple' : '';\n    var selectTemplate = '' +\n      '<div class=\"md-select-menu-container\" aria-hidden=\"true\">' +\n      '<md-select-menu {0}>{1}</md-select-menu>' +\n      '</div>';\n\n    selectTemplate = $mdUtil.supplant(selectTemplate, [multipleContent, element.html()]);\n    element.empty().append(valueEl);\n    element.append(selectTemplate);\n\n    if(!attr.tabindex){\n      attr.$set('tabindex', 0);\n    }\n\n    return function postLink(scope, element, attr, ctrls) {\n      var untouched = true;\n      var isDisabled, ariaLabelBase;\n\n      var containerCtrl = ctrls[0];\n      var mdSelectCtrl = ctrls[1];\n      var ngModelCtrl = ctrls[2];\n      var formCtrl = ctrls[3];\n      // grab a reference to the select menu value label\n      var valueEl = element.find('md-select-value');\n      var isReadonly = angular.isDefined(attr.readonly);\n      var disableAsterisk = $mdUtil.parseAttributeBoolean(attr.mdNoAsterisk);\n\n      if (disableAsterisk) {\n        element.addClass('md-no-asterisk');\n      }\n\n      if (containerCtrl) {\n        var isErrorGetter = containerCtrl.isErrorGetter || function() {\n          return ngModelCtrl.$invalid && (ngModelCtrl.$touched || (formCtrl && formCtrl.$submitted));\n        };\n\n        if (containerCtrl.input) {\n          // We ignore inputs that are in the md-select-header (one\n          // case where this might be useful would be adding as searchbox)\n          if (element.find('md-select-header').find('input')[0] !== containerCtrl.input[0]) {\n            throw new Error(\"<md-input-container> can only have *one* child <input>, <textarea> or <select> element!\");\n          }\n        }\n\n        containerCtrl.input = element;\n        if (!containerCtrl.label) {\n          $mdAria.expect(element, 'aria-label', element.attr('placeholder'));\n        }\n\n        scope.$watch(isErrorGetter, containerCtrl.setInvalid);\n      }\n\n      var selectContainer, selectScope, selectMenuCtrl;\n\n      findSelectContainer();\n      $mdTheming(element);\n\n      if (formCtrl && angular.isDefined(attr.multiple)) {\n        $mdUtil.nextTick(function() {\n          var hasModelValue = ngModelCtrl.$modelValue || ngModelCtrl.$viewValue;\n          if (hasModelValue) {\n            formCtrl.$setPristine();\n          }\n        });\n      }\n\n      var originalRender = ngModelCtrl.$render;\n      ngModelCtrl.$render = function() {\n        originalRender();\n        syncLabelText();\n        syncAriaLabel();\n        inputCheckValue();\n      };\n\n      attr.$observe('placeholder', ngModelCtrl.$render);\n\n      if (containerCtrl && containerCtrl.label) {\n        attr.$observe('required', function (value) {\n          // Toggle the md-required class on the input containers label, because the input container is automatically\n          // applying the asterisk indicator on the label.\n          containerCtrl.label.toggleClass('md-required', value && !disableAsterisk);\n        });\n      }\n\n      mdSelectCtrl.setLabelText = function(text) {\n        mdSelectCtrl.setIsPlaceholder(!text);\n\n        // Whether the select label has been given via user content rather than the internal\n        // template of <md-option>\n        var isSelectLabelFromUser = false;\n\n        if (attr.mdSelectedText && attr.mdSelectedHtml) {\n          throw Error('md-select cannot have both `md-selected-text` and `md-selected-html`');\n        }\n\n        if (attr.mdSelectedText || attr.mdSelectedHtml) {\n          text = $parse(attr.mdSelectedText || attr.mdSelectedHtml)(scope);\n          isSelectLabelFromUser = true;\n        } else if (!text) {\n          // Use placeholder attribute, otherwise fallback to the md-input-container label\n          var tmpPlaceholder = attr.placeholder ||\n              (containerCtrl && containerCtrl.label ? containerCtrl.label.text() : '');\n\n          text = tmpPlaceholder || '';\n          isSelectLabelFromUser = true;\n        }\n\n        var target = valueEl.children().eq(0);\n\n        if (attr.mdSelectedHtml) {\n            // Using getTrustedHtml will run the content through $sanitize if it is not already\n            // explicitly trusted. If the ngSanitize module is not loaded, this will\n            // *correctly* throw an sce error.\n            target.html($sce.getTrustedHtml(text));\n        } else if (isSelectLabelFromUser) {\n          target.text(text);\n        } else {\n          // If we've reached this point, the text is not user-provided.\n          target.html(text);\n        }\n      };\n\n      mdSelectCtrl.setIsPlaceholder = function(isPlaceholder) {\n        if (isPlaceholder) {\n          valueEl.addClass('md-select-placeholder');\n          if (containerCtrl && containerCtrl.label) {\n            containerCtrl.label.addClass('md-placeholder');\n          }\n        } else {\n          valueEl.removeClass('md-select-placeholder');\n          if (containerCtrl && containerCtrl.label) {\n            containerCtrl.label.removeClass('md-placeholder');\n          }\n        }\n      };\n\n      if (!isReadonly) {\n        element\n          .on('focus', function(ev) {\n            // Always focus the container (if we have one) so floating labels and other styles are\n            // applied properly\n            containerCtrl && containerCtrl.setFocused(true);\n          });\n\n        // Attach before ngModel's blur listener to stop propagation of blur event\n        // to prevent from setting $touched.\n        element.on('blur', function(event) {\n          if (untouched) {\n            untouched = false;\n            if (selectScope._mdSelectIsOpen) {\n              event.stopImmediatePropagation();\n            }\n          }\n\n          if (selectScope._mdSelectIsOpen) return;\n          containerCtrl && containerCtrl.setFocused(false);\n          inputCheckValue();\n        });\n      }\n\n      mdSelectCtrl.triggerClose = function() {\n        $parse(attr.mdOnClose)(scope);\n      };\n\n      scope.$$postDigest(function() {\n        initAriaLabel();\n        syncLabelText();\n        syncAriaLabel();\n      });\n\n      function initAriaLabel() {\n        var labelText = element.attr('aria-label') || element.attr('placeholder');\n        if (!labelText && containerCtrl && containerCtrl.label) {\n          labelText = containerCtrl.label.text();\n        }\n        ariaLabelBase = labelText;\n        $mdAria.expect(element, 'aria-label', labelText);\n      }\n\n      scope.$watch(function() {\n        return selectMenuCtrl.selectedLabels();\n      }, syncLabelText);\n\n      function syncLabelText() {\n        if (selectContainer) {\n          selectMenuCtrl = selectMenuCtrl || selectContainer.find('md-select-menu').controller('mdSelectMenu');\n          mdSelectCtrl.setLabelText(selectMenuCtrl.selectedLabels());\n        }\n      }\n\n      function syncAriaLabel() {\n        if (!ariaLabelBase) return;\n        var ariaLabels = selectMenuCtrl.selectedLabels({mode: 'aria'});\n        element.attr('aria-label', ariaLabels.length ? ariaLabelBase + ': ' + ariaLabels : ariaLabelBase);\n      }\n\n      var deregisterWatcher;\n      attr.$observe('ngMultiple', function(val) {\n        if (deregisterWatcher) deregisterWatcher();\n        var parser = $parse(val);\n        deregisterWatcher = scope.$watch(function() {\n          return parser(scope);\n        }, function(multiple, prevVal) {\n          if (multiple === undefined && prevVal === undefined) return; // assume compiler did a good job\n          if (multiple) {\n            element.attr('multiple', 'multiple');\n          } else {\n            element.removeAttr('multiple');\n          }\n          element.attr('aria-multiselectable', multiple ? 'true' : 'false');\n          if (selectContainer) {\n            selectMenuCtrl.setMultiple(multiple);\n            originalRender = ngModelCtrl.$render;\n            ngModelCtrl.$render = function() {\n              originalRender();\n              syncLabelText();\n              syncAriaLabel();\n              inputCheckValue();\n            };\n            ngModelCtrl.$render();\n          }\n        });\n      });\n\n      attr.$observe('disabled', function(disabled) {\n        if (angular.isString(disabled)) {\n          disabled = true;\n        }\n        // Prevent click event being registered twice\n        if (isDisabled !== undefined && isDisabled === disabled) {\n          return;\n        }\n        isDisabled = disabled;\n        if (disabled) {\n          element\n            .attr({'aria-disabled': 'true'})\n            .removeAttr('tabindex')\n            .off('click', openSelect)\n            .off('keydown', handleKeypress);\n        } else {\n          element\n            .attr({'tabindex': attr.tabindex, 'aria-disabled': 'false'})\n            .on('click', openSelect)\n            .on('keydown', handleKeypress);\n        }\n      });\n\n      if (!attr.hasOwnProperty('disabled') && !attr.hasOwnProperty('ngDisabled')) {\n        element.attr({'aria-disabled': 'false'});\n        element.on('click', openSelect);\n        element.on('keydown', handleKeypress);\n      }\n\n      var ariaAttrs = {\n        role: 'listbox',\n        'aria-expanded': 'false',\n        'aria-multiselectable': isMultiple && !attr.ngMultiple ? 'true' : 'false'\n      };\n\n      if (!element[0].hasAttribute('id')) {\n        ariaAttrs.id = 'select_' + $mdUtil.nextUid();\n      }\n\n      var containerId = 'select_container_' + $mdUtil.nextUid();\n      selectContainer.attr('id', containerId);\n      ariaAttrs['aria-owns'] = containerId;\n      element.attr(ariaAttrs);\n\n      scope.$on('$destroy', function() {\n        $mdSelect\n          .destroy()\n          .finally(function() {\n            if (containerCtrl) {\n              containerCtrl.setFocused(false);\n              containerCtrl.setHasValue(false);\n              containerCtrl.input = null;\n            }\n            ngModelCtrl.$setTouched();\n          });\n      });\n\n\n\n      function inputCheckValue() {\n        // The select counts as having a value if one or more options are selected,\n        // or if the input's validity state says it has bad input (eg string in a number input)\n        containerCtrl && containerCtrl.setHasValue(selectMenuCtrl.selectedLabels().length > 0 || (element[0].validity || {}).badInput);\n      }\n\n      function findSelectContainer() {\n        selectContainer = angular.element(\n          element[0].querySelector('.md-select-menu-container')\n        );\n        selectScope = scope;\n        if (attr.mdContainerClass) {\n          var value = selectContainer[0].getAttribute('class') + ' ' + attr.mdContainerClass;\n          selectContainer[0].setAttribute('class', value);\n        }\n        selectMenuCtrl = selectContainer.find('md-select-menu').controller('mdSelectMenu');\n        selectMenuCtrl.init(ngModelCtrl, attr.ngModel);\n        element.on('$destroy', function() {\n          selectContainer.remove();\n        });\n      }\n\n      function handleKeypress(e) {\n        if ($mdConstant.isNavigationKey(e)) {\n          // prevent page scrolling on interaction\n          e.preventDefault();\n          openSelect(e);\n        } else {\n          if (shouldHandleKey(e, $mdConstant)) {\n            e.preventDefault();\n\n            var node = selectMenuCtrl.optNodeForKeyboardSearch(e);\n            if (!node || node.hasAttribute('disabled')) return;\n            var optionCtrl = angular.element(node).controller('mdOption');\n            if (!selectMenuCtrl.isMultiple) {\n              selectMenuCtrl.deselect(Object.keys(selectMenuCtrl.selected)[0]);\n            }\n            selectMenuCtrl.select(optionCtrl.hashKey, optionCtrl.value);\n            selectMenuCtrl.refreshViewValue();\n          }\n        }\n      }\n\n      function openSelect() {\n        selectScope._mdSelectIsOpen = true;\n        element.attr('aria-expanded', 'true');\n\n        $mdSelect.show({\n          scope: selectScope,\n          preserveScope: true,\n          skipCompile: true,\n          element: selectContainer,\n          target: element[0],\n          selectCtrl: mdSelectCtrl,\n          preserveElement: true,\n          hasBackdrop: true,\n          loadingAsync: attr.mdOnOpen ? scope.$eval(attr.mdOnOpen) || true : false\n        }).finally(function() {\n          selectScope._mdSelectIsOpen = false;\n          element.focus();\n          element.attr('aria-expanded', 'false');\n          ngModelCtrl.$setTouched();\n        });\n      }\n\n    };\n  }\n}\n\nfunction SelectMenuDirective($parse, $mdUtil, $mdConstant, $mdTheming) {\n  // We want the scope to be set to 'false' so an isolated scope is not created\n  // which would interfere with the md-select-header's access to the\n  // parent scope.\n  SelectMenuController.$inject = [\"$scope\", \"$attrs\", \"$element\"];\n  return {\n    restrict: 'E',\n    require: ['mdSelectMenu'],\n    scope: false,\n    controller: SelectMenuController,\n    link: {pre: preLink}\n  };\n\n  // We use preLink instead of postLink to ensure that the select is initialized before\n  // its child options run postLink.\n  function preLink(scope, element, attr, ctrls) {\n    var selectCtrl = ctrls[0];\n\n    element.addClass('_md');     // private md component indicator for styling\n\n    $mdTheming(element);\n    element.on('click', clickListener);\n    element.on('keypress', keyListener);\n\n    function keyListener(e) {\n      if (e.keyCode == 13 || e.keyCode == 32) {\n        clickListener(e);\n      }\n    }\n\n    function clickListener(ev) {\n      var option = $mdUtil.getClosest(ev.target, 'md-option');\n      var optionCtrl = option && angular.element(option).data('$mdOptionController');\n      if (!option || !optionCtrl) return;\n      if (option.hasAttribute('disabled')) {\n        ev.stopImmediatePropagation();\n        return false;\n      }\n\n      var optionHashKey = selectCtrl.hashGetter(optionCtrl.value);\n      var isSelected = angular.isDefined(selectCtrl.selected[optionHashKey]);\n\n      scope.$apply(function() {\n        if (selectCtrl.isMultiple) {\n          if (isSelected) {\n            selectCtrl.deselect(optionHashKey);\n          } else {\n            selectCtrl.select(optionHashKey, optionCtrl.value);\n          }\n        } else {\n          if (!isSelected) {\n            selectCtrl.deselect(Object.keys(selectCtrl.selected)[0]);\n            selectCtrl.select(optionHashKey, optionCtrl.value);\n          }\n        }\n        selectCtrl.refreshViewValue();\n      });\n    }\n  }\n\n  function SelectMenuController($scope, $attrs, $element) {\n    var self = this;\n    self.isMultiple = angular.isDefined($attrs.multiple);\n    // selected is an object with keys matching all of the selected options' hashed values\n    self.selected = {};\n    // options is an object with keys matching every option's hash value,\n    // and values matching every option's controller.\n    self.options = {};\n\n    $scope.$watchCollection(function() {\n      return self.options;\n    }, function() {\n      self.ngModel.$render();\n    });\n\n    var deregisterCollectionWatch;\n    var defaultIsEmpty;\n    self.setMultiple = function(isMultiple) {\n      var ngModel = self.ngModel;\n      defaultIsEmpty = defaultIsEmpty || ngModel.$isEmpty;\n\n      self.isMultiple = isMultiple;\n      if (deregisterCollectionWatch) deregisterCollectionWatch();\n\n      if (self.isMultiple) {\n        ngModel.$validators['md-multiple'] = validateArray;\n        ngModel.$render = renderMultiple;\n\n        // watchCollection on the model because by default ngModel only watches the model's\n        // reference. This allowed the developer to also push and pop from their array.\n        $scope.$watchCollection(self.modelBinding, function(value) {\n          if (validateArray(value)) renderMultiple(value);\n          self.ngModel.$setPristine();\n        });\n\n        ngModel.$isEmpty = function(value) {\n          return !value || value.length === 0;\n        };\n      } else {\n        delete ngModel.$validators['md-multiple'];\n        ngModel.$render = renderSingular;\n      }\n\n      function validateArray(modelValue, viewValue) {\n        // If a value is truthy but not an array, reject it.\n        // If value is undefined/falsy, accept that it's an empty array.\n        return angular.isArray(modelValue || viewValue || []);\n      }\n    };\n\n    var searchStr = '';\n    var clearSearchTimeout, optNodes, optText;\n    var CLEAR_SEARCH_AFTER = 300;\n\n    self.optNodeForKeyboardSearch = function(e) {\n      clearSearchTimeout && clearTimeout(clearSearchTimeout);\n      clearSearchTimeout = setTimeout(function() {\n        clearSearchTimeout = undefined;\n        searchStr = '';\n        optText = undefined;\n        optNodes = undefined;\n      }, CLEAR_SEARCH_AFTER);\n\n      // Support 1-9 on numpad\n      var keyCode = e.keyCode - ($mdConstant.isNumPadKey(e) ? 48 : 0);\n\n      searchStr += String.fromCharCode(keyCode);\n      var search = new RegExp('^' + searchStr, 'i');\n      if (!optNodes) {\n        optNodes = $element.find('md-option');\n        optText = new Array(optNodes.length);\n        angular.forEach(optNodes, function(el, i) {\n          optText[i] = el.textContent.trim();\n        });\n      }\n      for (var i = 0; i < optText.length; ++i) {\n        if (search.test(optText[i])) {\n          return optNodes[i];\n        }\n      }\n    };\n\n    self.init = function(ngModel, binding) {\n      self.ngModel = ngModel;\n      self.modelBinding = binding;\n\n      // Setup a more robust version of isEmpty to ensure value is a valid option\n      self.ngModel.$isEmpty = function($viewValue) {\n        // We have to transform the viewValue into the hashKey, because otherwise the\n        // OptionCtrl may not exist. Developers may have specified a trackBy function.\n        return !self.options[self.hashGetter($viewValue)];\n      };\n\n      // Allow users to provide `ng-model=\"foo\" ng-model-options=\"{trackBy: 'foo.id'}\"` so\n      // that we can properly compare objects set on the model to the available options\n      var trackByOption = $mdUtil.getModelOption(ngModel, 'trackBy');\n\n      if (trackByOption) {\n        var trackByLocals = {};\n        var trackByParsed = $parse(trackByOption);\n        self.hashGetter = function(value, valueScope) {\n          trackByLocals.$value = value;\n          return trackByParsed(valueScope || $scope, trackByLocals);\n        };\n        // If the user doesn't provide a trackBy, we automatically generate an id for every\n        // value passed in\n      } else {\n        self.hashGetter = function getHashValue(value) {\n          if (angular.isObject(value)) {\n            return 'object_' + (value.$$mdSelectId || (value.$$mdSelectId = ++selectNextId));\n          }\n          return value;\n        };\n      }\n      self.setMultiple(self.isMultiple);\n    };\n\n    self.selectedLabels = function(opts) {\n      opts = opts || {};\n      var mode = opts.mode || 'html';\n      var selectedOptionEls = $mdUtil.nodesToArray($element[0].querySelectorAll('md-option[selected]'));\n      if (selectedOptionEls.length) {\n        var mapFn;\n\n        if (mode == 'html') {\n          // Map the given element to its innerHTML string. If the element has a child ripple\n          // container remove it from the HTML string, before returning the string.\n          mapFn = function(el) {\n            // If we do not have a `value` or `ng-value`, assume it is an empty option which clears the select\n            if (el.hasAttribute('md-option-empty')) {\n              return '';\n            }\n\n            var html = el.innerHTML;\n\n            // Remove the ripple container from the selected option, copying it would cause a CSP violation.\n            var rippleContainer = el.querySelector('.md-ripple-container');\n            if (rippleContainer) {\n              html = html.replace(rippleContainer.outerHTML, '');\n            }\n\n            // Remove the checkbox container, because it will cause the label to wrap inside of the placeholder.\n            // It should be not displayed inside of the label element.\n            var checkboxContainer = el.querySelector('.md-container');\n            if (checkboxContainer) {\n              html = html.replace(checkboxContainer.outerHTML, '');\n            }\n\n            return html;\n          };\n        } else if (mode == 'aria') {\n          mapFn = function(el) { return el.hasAttribute('aria-label') ? el.getAttribute('aria-label') : el.textContent; };\n        }\n\n        // Ensure there are no duplicates; see https://github.com/angular/material/issues/9442\n        return $mdUtil.uniq(selectedOptionEls.map(mapFn)).join(', ');\n      } else {\n        return '';\n      }\n    };\n\n    self.select = function(hashKey, hashedValue) {\n      var option = self.options[hashKey];\n      option && option.setSelected(true);\n      self.selected[hashKey] = hashedValue;\n    };\n    self.deselect = function(hashKey) {\n      var option = self.options[hashKey];\n      option && option.setSelected(false);\n      delete self.selected[hashKey];\n    };\n\n    self.addOption = function(hashKey, optionCtrl) {\n      if (angular.isDefined(self.options[hashKey])) {\n        throw new Error('Duplicate md-option values are not allowed in a select. ' +\n          'Duplicate value \"' + optionCtrl.value + '\" found.');\n      }\n\n      self.options[hashKey] = optionCtrl;\n\n      // If this option's value was already in our ngModel, go ahead and select it.\n      if (angular.isDefined(self.selected[hashKey])) {\n        self.select(hashKey, optionCtrl.value);\n\n        // When the current $modelValue of the ngModel Controller is using the same hash as\n        // the current option, which will be added, then we can be sure, that the validation\n        // of the option has occurred before the option was added properly.\n        // This means, that we have to manually trigger a new validation of the current option.\n        if (angular.isDefined(self.ngModel.$modelValue) && self.hashGetter(self.ngModel.$modelValue) === hashKey) {\n          self.ngModel.$validate();\n        }\n\n        self.refreshViewValue();\n      }\n    };\n    self.removeOption = function(hashKey) {\n      delete self.options[hashKey];\n      // Don't deselect an option when it's removed - the user's ngModel should be allowed\n      // to have values that do not match a currently available option.\n    };\n\n    self.refreshViewValue = function() {\n      var values = [];\n      var option;\n      for (var hashKey in self.selected) {\n        // If this hashKey has an associated option, push that option's value to the model.\n        if ((option = self.options[hashKey])) {\n          values.push(option.value);\n        } else {\n          // Otherwise, the given hashKey has no associated option, and we got it\n          // from an ngModel value at an earlier time. Push the unhashed value of\n          // this hashKey to the model.\n          // This allows the developer to put a value in the model that doesn't yet have\n          // an associated option.\n          values.push(self.selected[hashKey]);\n        }\n      }\n      var usingTrackBy = $mdUtil.getModelOption(self.ngModel, 'trackBy');\n\n      var newVal = self.isMultiple ? values : values[0];\n      var prevVal = self.ngModel.$modelValue;\n\n      if (usingTrackBy ? !angular.equals(prevVal, newVal) : (prevVal + '') !== newVal) {\n        self.ngModel.$setViewValue(newVal);\n        self.ngModel.$render();\n      }\n    };\n\n    function renderMultiple() {\n      var newSelectedValues = self.ngModel.$modelValue || self.ngModel.$viewValue || [];\n      if (!angular.isArray(newSelectedValues)) return;\n\n      var oldSelected = Object.keys(self.selected);\n\n      var newSelectedHashes = newSelectedValues.map(self.hashGetter);\n      var deselected = oldSelected.filter(function(hash) {\n        return newSelectedHashes.indexOf(hash) === -1;\n      });\n\n      deselected.forEach(self.deselect);\n      newSelectedHashes.forEach(function(hashKey, i) {\n        self.select(hashKey, newSelectedValues[i]);\n      });\n    }\n\n    function renderSingular() {\n      var value = self.ngModel.$viewValue || self.ngModel.$modelValue;\n      Object.keys(self.selected).forEach(self.deselect);\n      self.select(self.hashGetter(value), value);\n    }\n  }\n\n}\n\nfunction OptionDirective($mdButtonInkRipple, $mdUtil, $mdTheming) {\n\n  OptionController.$inject = [\"$element\"];\n  return {\n    restrict: 'E',\n    require: ['mdOption', '^^mdSelectMenu'],\n    controller: OptionController,\n    compile: compile\n  };\n\n  function compile(element, attr) {\n    // Manual transclusion to avoid the extra inner <span> that ng-transclude generates\n    element.append(angular.element('<div class=\"md-text\">').append(element.contents()));\n\n    element.attr('tabindex', attr.tabindex || '0');\n\n    if (!hasDefinedValue(attr)) {\n      element.attr('md-option-empty', '');\n    }\n\n    return postLink;\n  }\n\n  function hasDefinedValue(attr) {\n    var value = attr.value;\n    var ngValue = attr.ngValue;\n\n    return value || ngValue;\n  }\n\n  function postLink(scope, element, attr, ctrls) {\n    var optionCtrl = ctrls[0];\n    var selectCtrl = ctrls[1];\n\n    $mdTheming(element);\n\n    if (selectCtrl.isMultiple) {\n      element.addClass('md-checkbox-enabled');\n      element.prepend(CHECKBOX_SELECTION_INDICATOR.clone());\n    }\n\n    if (angular.isDefined(attr.ngValue)) {\n      scope.$watch(attr.ngValue, setOptionValue);\n    } else if (angular.isDefined(attr.value)) {\n      setOptionValue(attr.value);\n    } else {\n      scope.$watch(function() {\n        return element.text().trim();\n      }, setOptionValue);\n    }\n\n    attr.$observe('disabled', function(disabled) {\n      if (disabled) {\n        element.attr('tabindex', '-1');\n      } else {\n        element.attr('tabindex', '0');\n      }\n    });\n\n    scope.$$postDigest(function() {\n      attr.$observe('selected', function(selected) {\n        if (!angular.isDefined(selected)) return;\n        if (typeof selected == 'string') selected = true;\n        if (selected) {\n          if (!selectCtrl.isMultiple) {\n            selectCtrl.deselect(Object.keys(selectCtrl.selected)[0]);\n          }\n          selectCtrl.select(optionCtrl.hashKey, optionCtrl.value);\n        } else {\n          selectCtrl.deselect(optionCtrl.hashKey);\n        }\n        selectCtrl.refreshViewValue();\n      });\n    });\n\n    $mdButtonInkRipple.attach(scope, element);\n    configureAria();\n\n    function setOptionValue(newValue, oldValue, prevAttempt) {\n      if (!selectCtrl.hashGetter) {\n        if (!prevAttempt) {\n          scope.$$postDigest(function() {\n            setOptionValue(newValue, oldValue, true);\n          });\n        }\n        return;\n      }\n      var oldHashKey = selectCtrl.hashGetter(oldValue, scope);\n      var newHashKey = selectCtrl.hashGetter(newValue, scope);\n\n      optionCtrl.hashKey = newHashKey;\n      optionCtrl.value = newValue;\n\n      selectCtrl.removeOption(oldHashKey, optionCtrl);\n      selectCtrl.addOption(newHashKey, optionCtrl);\n    }\n\n    scope.$on('$destroy', function() {\n      selectCtrl.removeOption(optionCtrl.hashKey, optionCtrl);\n    });\n\n    function configureAria() {\n      var ariaAttrs = {\n        'role': 'option',\n        'aria-selected': 'false'\n      };\n\n      if (!element[0].hasAttribute('id')) {\n        ariaAttrs.id = 'select_option_' + $mdUtil.nextUid();\n      }\n      element.attr(ariaAttrs);\n    }\n  }\n\n  function OptionController($element) {\n    this.selected = false;\n    this.setSelected = function(isSelected) {\n      if (isSelected && !this.selected) {\n        $element.attr({\n          'selected': 'selected',\n          'aria-selected': 'true'\n        });\n      } else if (!isSelected && this.selected) {\n        $element.removeAttr('selected');\n        $element.attr('aria-selected', 'false');\n      }\n      this.selected = isSelected;\n    };\n  }\n\n}\n\nfunction OptgroupDirective() {\n  return {\n    restrict: 'E',\n    compile: compile\n  };\n  function compile(el, attrs) {\n    // If we have a select header element, we don't want to add the normal label\n    // header.\n    if (!hasSelectHeader()) {\n      setupLabelElement();\n    }\n\n    function hasSelectHeader() {\n      return el.parent().find('md-select-header').length;\n    }\n\n    function setupLabelElement() {\n      var labelElement = el.find('label');\n      if (!labelElement.length) {\n        labelElement = angular.element('<label>');\n        el.prepend(labelElement);\n      }\n      labelElement.addClass('md-container-ignore');\n      if (attrs.label) labelElement.text(attrs.label);\n    }\n  }\n}\n\nfunction SelectHeaderDirective() {\n  return {\n    restrict: 'E',\n  };\n}\n\nfunction SelectProvider($$interimElementProvider) {\n  selectDefaultOptions.$inject = [\"$mdSelect\", \"$mdConstant\", \"$mdUtil\", \"$window\", \"$q\", \"$$rAF\", \"$animateCss\", \"$animate\", \"$document\"];\n  return $$interimElementProvider('$mdSelect')\n    .setDefaults({\n      methods: ['target'],\n      options: selectDefaultOptions\n    });\n\n  /* @ngInject */\n  function selectDefaultOptions($mdSelect, $mdConstant, $mdUtil, $window, $q, $$rAF, $animateCss, $animate, $document) {\n    var ERROR_TARGET_EXPECTED = \"$mdSelect.show() expected a target element in options.target but got '{0}'!\";\n    var animator = $mdUtil.dom.animator;\n    var keyCodes = $mdConstant.KEY_CODE;\n\n    return {\n      parent: 'body',\n      themable: true,\n      onShow: onShow,\n      onRemove: onRemove,\n      hasBackdrop: true,\n      disableParentScroll: true\n    };\n\n    /**\n     * Interim-element onRemove logic....\n     */\n    function onRemove(scope, element, opts) {\n      opts = opts || { };\n      opts.cleanupInteraction();\n      opts.cleanupResizing();\n      opts.hideBackdrop();\n\n      // For navigation $destroy events, do a quick, non-animated removal,\n      // but for normal closes (from clicks, etc) animate the removal\n\n      return  (opts.$destroy === true) ? cleanElement() : animateRemoval().then( cleanElement );\n\n      /**\n       * For normal closes (eg clicks), animate the removal.\n       * For forced closes (like $destroy events from navigation),\n       * skip the animations\n       */\n      function animateRemoval() {\n        return $animateCss(element, {addClass: 'md-leave'}).start();\n      }\n\n      /**\n       * Restore the element to a closed state\n       */\n      function cleanElement() {\n\n        element.removeClass('md-active');\n        element.attr('aria-hidden', 'true');\n        element[0].style.display = 'none';\n\n        announceClosed(opts);\n\n        if (!opts.$destroy && opts.restoreFocus) {\n          opts.target.focus();\n        }\n      }\n\n    }\n\n    /**\n     * Interim-element onShow logic....\n     */\n    function onShow(scope, element, opts) {\n\n      watchAsyncLoad();\n      sanitizeAndConfigure(scope, opts);\n\n      opts.hideBackdrop = showBackdrop(scope, element, opts);\n\n      return showDropDown(scope, element, opts)\n        .then(function(response) {\n          element.attr('aria-hidden', 'false');\n          opts.alreadyOpen = true;\n          opts.cleanupInteraction = activateInteraction();\n          opts.cleanupResizing = activateResizing();\n\n          return response;\n        }, opts.hideBackdrop);\n\n      // ************************************\n      // Closure Functions\n      // ************************************\n\n      /**\n       *  Attach the select DOM element(s) and animate to the correct positions\n       *  and scalings...\n       */\n      function showDropDown(scope, element, opts) {\n        opts.parent.append(element);\n\n        return $q(function(resolve, reject) {\n\n          try {\n\n            $animateCss(element, {removeClass: 'md-leave', duration: 0})\n              .start()\n              .then(positionAndFocusMenu)\n              .then(resolve);\n\n          } catch (e) {\n            reject(e);\n          }\n\n        });\n      }\n\n      /**\n       * Initialize container and dropDown menu positions/scale, then animate\n       * to show... and autoFocus.\n       */\n      function positionAndFocusMenu() {\n        return $q(function(resolve) {\n          if (opts.isRemoved) return $q.reject(false);\n\n          var info = calculateMenuPositions(scope, element, opts);\n\n          info.container.element.css(animator.toCss(info.container.styles));\n          info.dropDown.element.css(animator.toCss(info.dropDown.styles));\n\n          $$rAF(function() {\n            element.addClass('md-active');\n            info.dropDown.element.css(animator.toCss({transform: ''}));\n\n            autoFocus(opts.focusedNode);\n            resolve();\n          });\n\n        });\n      }\n\n      /**\n       * Show modal backdrop element...\n       */\n      function showBackdrop(scope, element, options) {\n\n        // If we are not within a dialog...\n        if (options.disableParentScroll && !$mdUtil.getClosest(options.target, 'MD-DIALOG')) {\n          // !! DO this before creating the backdrop; since disableScrollAround()\n          //    configures the scroll offset; which is used by mdBackDrop postLink()\n          options.restoreScroll = $mdUtil.disableScrollAround(options.element, options.parent);\n        } else {\n          options.disableParentScroll = false;\n        }\n\n        if (options.hasBackdrop) {\n          // Override duration to immediately show invisible backdrop\n          options.backdrop = $mdUtil.createBackdrop(scope, \"md-select-backdrop md-click-catcher\");\n          $animate.enter(options.backdrop, $document[0].body, null, {duration: 0});\n        }\n\n        /**\n         * Hide modal backdrop element...\n         */\n        return function hideBackdrop() {\n          if (options.backdrop) options.backdrop.remove();\n          if (options.disableParentScroll) options.restoreScroll();\n\n          delete options.restoreScroll;\n        };\n      }\n\n      /**\n       *\n       */\n      function autoFocus(focusedNode) {\n        if (focusedNode && !focusedNode.hasAttribute('disabled')) {\n          focusedNode.focus();\n        }\n      }\n\n      /**\n       * Check for valid opts and set some sane defaults\n       */\n      function sanitizeAndConfigure(scope, options) {\n        var selectEl = element.find('md-select-menu');\n\n        if (!options.target) {\n          throw new Error($mdUtil.supplant(ERROR_TARGET_EXPECTED, [options.target]));\n        }\n\n        angular.extend(options, {\n          isRemoved: false,\n          target: angular.element(options.target), //make sure it's not a naked dom node\n          parent: angular.element(options.parent),\n          selectEl: selectEl,\n          contentEl: element.find('md-content'),\n          optionNodes: selectEl[0].getElementsByTagName('md-option')\n        });\n      }\n\n      /**\n       * Configure various resize listeners for screen changes\n       */\n      function activateResizing() {\n        var debouncedOnResize = (function(scope, target, options) {\n\n          return function() {\n            if (options.isRemoved) return;\n\n            var updates = calculateMenuPositions(scope, target, options);\n            var container = updates.container;\n            var dropDown = updates.dropDown;\n\n            container.element.css(animator.toCss(container.styles));\n            dropDown.element.css(animator.toCss(dropDown.styles));\n          };\n\n        })(scope, element, opts);\n\n        var window = angular.element($window);\n        window.on('resize', debouncedOnResize);\n        window.on('orientationchange', debouncedOnResize);\n\n        // Publish deactivation closure...\n        return function deactivateResizing() {\n\n          // Disable resizing handlers\n          window.off('resize', debouncedOnResize);\n          window.off('orientationchange', debouncedOnResize);\n        };\n      }\n\n      /**\n       *  If asynchronously loading, watch and update internal\n       *  '$$loadingAsyncDone' flag\n       */\n      function watchAsyncLoad() {\n        if (opts.loadingAsync && !opts.isRemoved) {\n          scope.$$loadingAsyncDone = false;\n\n          $q.when(opts.loadingAsync)\n            .then(function() {\n              scope.$$loadingAsyncDone = true;\n              delete opts.loadingAsync;\n            }).then(function() {\n              $$rAF(positionAndFocusMenu);\n            });\n        }\n      }\n\n      /**\n       *\n       */\n      function activateInteraction() {\n        if (opts.isRemoved) return;\n\n        var dropDown = opts.selectEl;\n        var selectCtrl = dropDown.controller('mdSelectMenu') || {};\n\n        element.addClass('md-clickable');\n\n        // Close on backdrop click\n        opts.backdrop && opts.backdrop.on('click', onBackdropClick);\n\n        // Escape to close\n        // Cycling of options, and closing on enter\n        dropDown.on('keydown', onMenuKeyDown);\n        dropDown.on('click', checkCloseMenu);\n\n        return function cleanupInteraction() {\n          opts.backdrop && opts.backdrop.off('click', onBackdropClick);\n          dropDown.off('keydown', onMenuKeyDown);\n          dropDown.off('click', checkCloseMenu);\n\n          element.removeClass('md-clickable');\n          opts.isRemoved = true;\n        };\n\n        // ************************************\n        // Closure Functions\n        // ************************************\n\n        function onBackdropClick(e) {\n          e.preventDefault();\n          e.stopPropagation();\n          opts.restoreFocus = false;\n          $mdUtil.nextTick($mdSelect.hide, true);\n        }\n\n        function onMenuKeyDown(ev) {\n          ev.preventDefault();\n          ev.stopPropagation();\n\n          switch (ev.keyCode) {\n            case keyCodes.UP_ARROW:\n              return focusPrevOption();\n            case keyCodes.DOWN_ARROW:\n              return focusNextOption();\n            case keyCodes.SPACE:\n            case keyCodes.ENTER:\n              var option = $mdUtil.getClosest(ev.target, 'md-option');\n              if (option) {\n                dropDown.triggerHandler({\n                  type: 'click',\n                  target: option\n                });\n                ev.preventDefault();\n              }\n              checkCloseMenu(ev);\n              break;\n            case keyCodes.TAB:\n            case keyCodes.ESCAPE:\n              ev.stopPropagation();\n              ev.preventDefault();\n              opts.restoreFocus = true;\n              $mdUtil.nextTick($mdSelect.hide, true);\n              break;\n            default:\n              if (shouldHandleKey(ev, $mdConstant)) {\n                var optNode = dropDown.controller('mdSelectMenu').optNodeForKeyboardSearch(ev);\n                opts.focusedNode = optNode || opts.focusedNode;\n                optNode && optNode.focus();\n              }\n          }\n        }\n\n        function focusOption(direction) {\n          var optionsArray = $mdUtil.nodesToArray(opts.optionNodes);\n          var index = optionsArray.indexOf(opts.focusedNode);\n\n          var newOption;\n\n          do {\n            if (index === -1) {\n              // We lost the previously focused element, reset to first option\n              index = 0;\n            } else if (direction === 'next' && index < optionsArray.length - 1) {\n              index++;\n            } else if (direction === 'prev' && index > 0) {\n              index--;\n            }\n            newOption = optionsArray[index];\n            if (newOption.hasAttribute('disabled')) newOption = undefined;\n          } while (!newOption && index < optionsArray.length - 1 && index > 0);\n\n          newOption && newOption.focus();\n          opts.focusedNode = newOption;\n        }\n\n        function focusNextOption() {\n          focusOption('next');\n        }\n\n        function focusPrevOption() {\n          focusOption('prev');\n        }\n\n        function checkCloseMenu(ev) {\n          if (ev && ( ev.type == 'click') && (ev.currentTarget != dropDown[0])) return;\n          if ( mouseOnScrollbar() ) return;\n\n          var option = $mdUtil.getClosest(ev.target, 'md-option');\n          if (option && option.hasAttribute && !option.hasAttribute('disabled')) {\n            ev.preventDefault();\n            ev.stopPropagation();\n            if (!selectCtrl.isMultiple) {\n              opts.restoreFocus = true;\n\n              $mdUtil.nextTick(function () {\n                $mdSelect.hide(selectCtrl.ngModel.$viewValue);\n              }, true);\n            }\n          }\n          /**\n           * check if the mouseup event was on a scrollbar\n           */\n          function mouseOnScrollbar() {\n            var clickOnScrollbar = false;\n            if (ev && (ev.currentTarget.children.length > 0)) {\n              var child = ev.currentTarget.children[0];\n              var hasScrollbar = child.scrollHeight > child.clientHeight;\n              if (hasScrollbar && child.children.length > 0) {\n                var relPosX = ev.pageX - ev.currentTarget.getBoundingClientRect().left;\n                if (relPosX > child.querySelector('md-option').offsetWidth)\n                  clickOnScrollbar = true;\n              }\n            }\n            return clickOnScrollbar;\n          }\n        }\n      }\n\n    }\n\n    /**\n     * To notify listeners that the Select menu has closed,\n     * trigger the [optional] user-defined expression\n     */\n    function announceClosed(opts) {\n      var mdSelect = opts.selectCtrl;\n      if (mdSelect) {\n        var menuController = opts.selectEl.controller('mdSelectMenu');\n        mdSelect.setLabelText(menuController ? menuController.selectedLabels() : '');\n        mdSelect.triggerClose();\n      }\n    }\n\n\n    /**\n     * Calculate the\n     */\n    function calculateMenuPositions(scope, element, opts) {\n      var\n        containerNode = element[0],\n        targetNode = opts.target[0].children[0], // target the label\n        parentNode = $document[0].body,\n        selectNode = opts.selectEl[0],\n        contentNode = opts.contentEl[0],\n        parentRect = parentNode.getBoundingClientRect(),\n        targetRect = targetNode.getBoundingClientRect(),\n        shouldOpenAroundTarget = false,\n        bounds = {\n          left: parentRect.left + SELECT_EDGE_MARGIN,\n          top: SELECT_EDGE_MARGIN,\n          bottom: parentRect.height - SELECT_EDGE_MARGIN,\n          right: parentRect.width - SELECT_EDGE_MARGIN - ($mdUtil.floatingScrollbars() ? 16 : 0)\n        },\n        spaceAvailable = {\n          top: targetRect.top - bounds.top,\n          left: targetRect.left - bounds.left,\n          right: bounds.right - (targetRect.left + targetRect.width),\n          bottom: bounds.bottom - (targetRect.top + targetRect.height)\n        },\n        maxWidth = parentRect.width - SELECT_EDGE_MARGIN * 2,\n        selectedNode = selectNode.querySelector('md-option[selected]'),\n        optionNodes = selectNode.getElementsByTagName('md-option'),\n        optgroupNodes = selectNode.getElementsByTagName('md-optgroup'),\n        isScrollable = calculateScrollable(element, contentNode),\n        centeredNode;\n\n      var loading = isPromiseLike(opts.loadingAsync);\n      if (!loading) {\n        // If a selected node, center around that\n        if (selectedNode) {\n          centeredNode = selectedNode;\n          // If there are option groups, center around the first option group\n        } else if (optgroupNodes.length) {\n          centeredNode = optgroupNodes[0];\n          // Otherwise - if we are not loading async - center around the first optionNode\n        } else if (optionNodes.length) {\n          centeredNode = optionNodes[0];\n          // In case there are no options, center on whatever's in there... (eg progress indicator)\n        } else {\n          centeredNode = contentNode.firstElementChild || contentNode;\n        }\n      } else {\n        // If loading, center on progress indicator\n        centeredNode = contentNode.firstElementChild || contentNode;\n      }\n\n      if (contentNode.offsetWidth > maxWidth) {\n        contentNode.style['max-width'] = maxWidth + 'px';\n      } else {\n        contentNode.style.maxWidth = null;\n      }\n      if (shouldOpenAroundTarget) {\n        contentNode.style['min-width'] = targetRect.width + 'px';\n      }\n\n      // Remove padding before we compute the position of the menu\n      if (isScrollable) {\n        selectNode.classList.add('md-overflow');\n      }\n\n      var focusedNode = centeredNode;\n      if ((focusedNode.tagName || '').toUpperCase() === 'MD-OPTGROUP') {\n        focusedNode = optionNodes[0] || contentNode.firstElementChild || contentNode;\n        centeredNode = focusedNode;\n      }\n      // Cache for autoFocus()\n      opts.focusedNode = focusedNode;\n\n      // Get the selectMenuRect *after* max-width is possibly set above\n      containerNode.style.display = 'block';\n      var selectMenuRect = selectNode.getBoundingClientRect();\n      var centeredRect = getOffsetRect(centeredNode);\n\n      if (centeredNode) {\n        var centeredStyle = $window.getComputedStyle(centeredNode);\n        centeredRect.paddingLeft = parseInt(centeredStyle.paddingLeft, 10) || 0;\n        centeredRect.paddingRight = parseInt(centeredStyle.paddingRight, 10) || 0;\n      }\n\n      if (isScrollable) {\n        var scrollBuffer = contentNode.offsetHeight / 2;\n        contentNode.scrollTop = centeredRect.top + centeredRect.height / 2 - scrollBuffer;\n\n        if (spaceAvailable.top < scrollBuffer) {\n          contentNode.scrollTop = Math.min(\n            centeredRect.top,\n            contentNode.scrollTop + scrollBuffer - spaceAvailable.top\n          );\n        } else if (spaceAvailable.bottom < scrollBuffer) {\n          contentNode.scrollTop = Math.max(\n            centeredRect.top + centeredRect.height - selectMenuRect.height,\n            contentNode.scrollTop - scrollBuffer + spaceAvailable.bottom\n          );\n        }\n      }\n\n      var left, top, transformOrigin, minWidth, fontSize;\n      if (shouldOpenAroundTarget) {\n        left = targetRect.left;\n        top = targetRect.top + targetRect.height;\n        transformOrigin = '50% 0';\n        if (top + selectMenuRect.height > bounds.bottom) {\n          top = targetRect.top - selectMenuRect.height;\n          transformOrigin = '50% 100%';\n        }\n      } else {\n        left = (targetRect.left + centeredRect.left - centeredRect.paddingLeft) + 2;\n        top = Math.floor(targetRect.top + targetRect.height / 2 - centeredRect.height / 2 -\n            centeredRect.top + contentNode.scrollTop) + 2;\n\n        transformOrigin = (centeredRect.left + targetRect.width / 2) + 'px ' +\n          (centeredRect.top + centeredRect.height / 2 - contentNode.scrollTop) + 'px 0px';\n\n        minWidth = Math.min(targetRect.width + centeredRect.paddingLeft + centeredRect.paddingRight, maxWidth);\n\n        fontSize = window.getComputedStyle(targetNode)['font-size'];\n      }\n\n      // Keep left and top within the window\n      var containerRect = containerNode.getBoundingClientRect();\n      var scaleX = Math.round(100 * Math.min(targetRect.width / selectMenuRect.width, 1.0)) / 100;\n      var scaleY = Math.round(100 * Math.min(targetRect.height / selectMenuRect.height, 1.0)) / 100;\n\n      return {\n        container: {\n          element: angular.element(containerNode),\n          styles: {\n            left: Math.floor(clamp(bounds.left, left, bounds.right - containerRect.width)),\n            top: Math.floor(clamp(bounds.top, top, bounds.bottom - containerRect.height)),\n            'min-width': minWidth,\n            'font-size': fontSize\n          }\n        },\n        dropDown: {\n          element: angular.element(selectNode),\n          styles: {\n            transformOrigin: transformOrigin,\n            transform: !opts.alreadyOpen ? $mdUtil.supplant('scale({0},{1})', [scaleX, scaleY]) : \"\"\n          }\n        }\n      };\n\n    }\n\n  }\n\n  function isPromiseLike(obj) {\n    return obj && angular.isFunction(obj.then);\n  }\n\n  function clamp(min, n, max) {\n    return Math.max(min, Math.min(n, max));\n  }\n\n  function getOffsetRect(node) {\n    return node ? {\n      left: node.offsetLeft,\n      top: node.offsetTop,\n      width: node.offsetWidth,\n      height: node.offsetHeight\n    } : {left: 0, top: 0, width: 0, height: 0};\n  }\n\n  function calculateScrollable(element, contentNode) {\n    var isScrollable = false;\n\n    try {\n      var oldDisplay = element[0].style.display;\n\n      // Set the element's display to block so that this calculation is correct\n      element[0].style.display = 'block';\n\n      isScrollable = contentNode.scrollHeight > contentNode.offsetHeight;\n\n      // Reset it back afterwards\n      element[0].style.display = oldDisplay;\n    } finally {\n      // Nothing to do\n    }\n    return isScrollable;\n  }\n\n}\n\nfunction shouldHandleKey(ev, $mdConstant) {\n  var char = String.fromCharCode(ev.keyCode);\n  var isNonUsefulKey = (ev.keyCode <= 31);\n\n  return (char && char.length && !isNonUsefulKey &&\n    !$mdConstant.isMetaKey(ev) && !$mdConstant.isFnLockKey(ev) && !$mdConstant.hasModifierKey(ev));\n}\n\n})();\n(function(){\n\"use strict\";\n\n  /**\n   * @ngdoc module\n   * @name material.components.slider\n   */\nSliderDirective.$inject = [\"$$rAF\", \"$window\", \"$mdAria\", \"$mdUtil\", \"$mdConstant\", \"$mdTheming\", \"$mdGesture\", \"$parse\", \"$log\", \"$timeout\"];\n  angular.module('material.components.slider', [\n    'material.core'\n  ])\n  .directive('mdSlider', SliderDirective)\n  .directive('mdSliderContainer', SliderContainerDirective);\n\n/**\n * @ngdoc directive\n * @name mdSliderContainer\n * @module material.components.slider\n * @restrict E\n * @description\n * The `<md-slider-container>` contains slider with two other elements.\n *\n *\n * @usage\n * <h4>Normal Mode</h4>\n * <hljs lang=\"html\">\n * </hljs>\n */\nfunction SliderContainerDirective() {\n  return {\n    controller: function () {},\n    compile: function (elem) {\n      var slider = elem.find('md-slider');\n\n      if (!slider) {\n        return;\n      }\n\n      var vertical = slider.attr('md-vertical');\n\n      if (vertical !== undefined) {\n        elem.attr('md-vertical', '');\n      }\n\n      if(!slider.attr('flex')) {\n        slider.attr('flex', '');\n      }\n\n      return function postLink(scope, element, attr, ctrl) {\n        element.addClass('_md');     // private md component indicator for styling\n\n        // We have to manually stop the $watch on ngDisabled because it exists\n        // on the parent scope, and won't be automatically destroyed when\n        // the component is destroyed.\n        function setDisable(value) {\n          element.children().attr('disabled', value);\n          element.find('input').attr('disabled', value);\n        }\n\n        var stopDisabledWatch = angular.noop;\n\n        if (attr.disabled) {\n          setDisable(true);\n        }\n        else if (attr.ngDisabled) {\n          stopDisabledWatch = scope.$watch(attr.ngDisabled, function (value) {\n            setDisable(value);\n          });\n        }\n\n        scope.$on('$destroy', function () {\n          stopDisabledWatch();\n        });\n\n        var initialMaxWidth;\n\n        ctrl.fitInputWidthToTextLength = function (length) {\n          var input = element[0].querySelector('md-input-container');\n\n          if (input) {\n            var computedStyle = getComputedStyle(input);\n            var minWidth = parseInt(computedStyle.minWidth);\n            var padding = parseInt(computedStyle.padding) * 2;\n\n            initialMaxWidth = initialMaxWidth || parseInt(computedStyle.maxWidth);\n            var newMaxWidth = Math.max(initialMaxWidth, minWidth + padding + (minWidth / 2 * length));\n\n            input.style.maxWidth = newMaxWidth + 'px';\n          }\n        };\n      };\n    }\n  };\n}\n\n/**\n * @ngdoc directive\n * @name mdSlider\n * @module material.components.slider\n * @restrict E\n * @description\n * The `<md-slider>` component allows the user to choose from a range of\n * values.\n *\n * As per the [material design spec](http://www.google.com/design/spec/style/color.html#color-ui-color-application)\n * the slider is in the accent color by default. The primary color palette may be used with\n * the `md-primary` class.\n *\n * It has two modes: 'normal' mode, where the user slides between a wide range\n * of values, and 'discrete' mode, where the user slides between only a few\n * select values.\n *\n * To enable discrete mode, add the `md-discrete` attribute to a slider,\n * and use the `step` attribute to change the distance between\n * values the user is allowed to pick.\n *\n * @usage\n * <h4>Normal Mode</h4>\n * <hljs lang=\"html\">\n * <md-slider ng-model=\"myValue\" min=\"5\" max=\"500\">\n * </md-slider>\n * </hljs>\n * <h4>Discrete Mode</h4>\n * <hljs lang=\"html\">\n * <md-slider md-discrete ng-model=\"myDiscreteValue\" step=\"10\" min=\"10\" max=\"130\">\n * </md-slider>\n * </hljs>\n * <h4>Invert Mode</h4>\n * <hljs lang=\"html\">\n * <md-slider md-invert ng-model=\"myValue\" step=\"10\" min=\"10\" max=\"130\">\n * </md-slider>\n * </hljs>\n *\n * @param {boolean=} md-discrete Whether to enable discrete mode.\n * @param {boolean=} md-invert Whether to enable invert mode.\n * @param {number=} step The distance between values the user is allowed to pick. Default 1.\n * @param {number=} min The minimum value the user is allowed to pick. Default 0.\n * @param {number=} max The maximum value the user is allowed to pick. Default 100.\n * @param {number=} round The amount of numbers after the decimal point, maximum is 6 to prevent scientific notation. Default 3.\n */\nfunction SliderDirective($$rAF, $window, $mdAria, $mdUtil, $mdConstant, $mdTheming, $mdGesture, $parse, $log, $timeout) {\n  return {\n    scope: {},\n    require: ['?ngModel', '?^mdSliderContainer'],\n    template:\n      '<div class=\"md-slider-wrapper\">' +\n        '<div class=\"md-slider-content\">' +\n          '<div class=\"md-track-container\">' +\n            '<div class=\"md-track\"></div>' +\n            '<div class=\"md-track md-track-fill\"></div>' +\n            '<div class=\"md-track-ticks\"></div>' +\n          '</div>' +\n          '<div class=\"md-thumb-container\">' +\n            '<div class=\"md-thumb\"></div>' +\n            '<div class=\"md-focus-thumb\"></div>' +\n            '<div class=\"md-focus-ring\"></div>' +\n            '<div class=\"md-sign\">' +\n              '<span class=\"md-thumb-text\"></span>' +\n            '</div>' +\n            '<div class=\"md-disabled-thumb\"></div>' +\n          '</div>' +\n        '</div>' +\n      '</div>',\n    compile: compile\n  };\n\n  // **********************************************************\n  // Private Methods\n  // **********************************************************\n\n  function compile (tElement, tAttrs) {\n    var wrapper = angular.element(tElement[0].getElementsByClassName('md-slider-wrapper'));\n\n    var tabIndex = tAttrs.tabindex || 0;\n    wrapper.attr('tabindex', tabIndex);\n\n    if (tAttrs.disabled || tAttrs.ngDisabled) wrapper.attr('tabindex', -1);\n\n    wrapper.attr('role', 'slider');\n\n    $mdAria.expect(tElement, 'aria-label');\n\n    return postLink;\n  }\n\n  function postLink(scope, element, attr, ctrls) {\n    $mdTheming(element);\n    var ngModelCtrl = ctrls[0] || {\n      // Mock ngModelController if it doesn't exist to give us\n      // the minimum functionality needed\n      $setViewValue: function(val) {\n        this.$viewValue = val;\n        this.$viewChangeListeners.forEach(function(cb) { cb(); });\n      },\n      $parsers: [],\n      $formatters: [],\n      $viewChangeListeners: []\n    };\n\n    var containerCtrl = ctrls[1];\n    var container = angular.element($mdUtil.getClosest(element, '_md-slider-container', true));\n    var isDisabled = attr.ngDisabled ? angular.bind(null, $parse(attr.ngDisabled), scope.$parent) : function () {\n          return element[0].hasAttribute('disabled');\n        };\n\n    var thumb = angular.element(element[0].querySelector('.md-thumb'));\n    var thumbText = angular.element(element[0].querySelector('.md-thumb-text'));\n    var thumbContainer = thumb.parent();\n    var trackContainer = angular.element(element[0].querySelector('.md-track-container'));\n    var activeTrack = angular.element(element[0].querySelector('.md-track-fill'));\n    var tickContainer = angular.element(element[0].querySelector('.md-track-ticks'));\n    var wrapper = angular.element(element[0].getElementsByClassName('md-slider-wrapper'));\n    var content = angular.element(element[0].getElementsByClassName('md-slider-content'));\n    var throttledRefreshDimensions = $mdUtil.throttle(refreshSliderDimensions, 5000);\n\n    // Default values, overridable by attrs\n    var DEFAULT_ROUND = 3;\n    var vertical = angular.isDefined(attr.mdVertical);\n    var discrete = angular.isDefined(attr.mdDiscrete);\n    var invert = angular.isDefined(attr.mdInvert);\n    angular.isDefined(attr.min) ? attr.$observe('min', updateMin) : updateMin(0);\n    angular.isDefined(attr.max) ? attr.$observe('max', updateMax) : updateMax(100);\n    angular.isDefined(attr.step)? attr.$observe('step', updateStep) : updateStep(1);\n    angular.isDefined(attr.round)? attr.$observe('round', updateRound) : updateRound(DEFAULT_ROUND);\n\n    // We have to manually stop the $watch on ngDisabled because it exists\n    // on the parent scope, and won't be automatically destroyed when\n    // the component is destroyed.\n    var stopDisabledWatch = angular.noop;\n    if (attr.ngDisabled) {\n      stopDisabledWatch = scope.$parent.$watch(attr.ngDisabled, updateAriaDisabled);\n    }\n\n    $mdGesture.register(wrapper, 'drag', { horizontal: !vertical });\n\n    scope.mouseActive = false;\n\n    wrapper\n      .on('keydown', keydownListener)\n      .on('mousedown', mouseDownListener)\n      .on('focus', focusListener)\n      .on('blur', blurListener)\n      .on('$md.pressdown', onPressDown)\n      .on('$md.pressup', onPressUp)\n      .on('$md.dragstart', onDragStart)\n      .on('$md.drag', onDrag)\n      .on('$md.dragend', onDragEnd);\n\n    // On resize, recalculate the slider's dimensions and re-render\n    function updateAll() {\n      refreshSliderDimensions();\n      ngModelRender();\n    }\n    setTimeout(updateAll, 0);\n\n    var debouncedUpdateAll = $$rAF.throttle(updateAll);\n    angular.element($window).on('resize', debouncedUpdateAll);\n\n    scope.$on('$destroy', function() {\n      angular.element($window).off('resize', debouncedUpdateAll);\n    });\n\n    ngModelCtrl.$render = ngModelRender;\n    ngModelCtrl.$viewChangeListeners.push(ngModelRender);\n    ngModelCtrl.$formatters.push(minMaxValidator);\n    ngModelCtrl.$formatters.push(stepValidator);\n\n    /**\n     * Attributes\n     */\n    var min;\n    var max;\n    var step;\n    var round;\n    function updateMin(value) {\n      min = parseFloat(value);\n      element.attr('aria-valuemin', value);\n      updateAll();\n    }\n    function updateMax(value) {\n      max = parseFloat(value);\n      element.attr('aria-valuemax', value);\n      updateAll();\n    }\n    function updateStep(value) {\n      step = parseFloat(value);\n    }\n    function updateRound(value) {\n      // Set max round digits to 6, after 6 the input uses scientific notation\n      round = minMaxValidator(parseInt(value), 0, 6);\n    }\n    function updateAriaDisabled() {\n      element.attr('aria-disabled', !!isDisabled());\n    }\n\n    // Draw the ticks with canvas.\n    // The alternative to drawing ticks with canvas is to draw one element for each tick,\n    // which could quickly become a performance bottleneck.\n    var tickCanvas, tickCtx;\n    function redrawTicks() {\n      if (!discrete || isDisabled()) return;\n      if ( angular.isUndefined(step) )         return;\n\n      if ( step <= 0 ) {\n        var msg = 'Slider step value must be greater than zero when in discrete mode';\n        $log.error(msg);\n        throw new Error(msg);\n      }\n\n      var numSteps = Math.floor( (max - min) / step );\n      if (!tickCanvas) {\n        tickCanvas = angular.element('<canvas>').css('position', 'absolute');\n        tickContainer.append(tickCanvas);\n\n        tickCtx = tickCanvas[0].getContext('2d');\n      }\n\n      var dimensions = getSliderDimensions();\n\n      // If `dimensions` doesn't have height and width it might be the first attempt so we will refresh dimensions\n      if (dimensions && !dimensions.height && !dimensions.width) {\n        refreshSliderDimensions();\n        dimensions = sliderDimensions;\n      }\n\n      tickCanvas[0].width = dimensions.width;\n      tickCanvas[0].height = dimensions.height;\n\n      var distance;\n      for (var i = 0; i <= numSteps; i++) {\n        var trackTicksStyle = $window.getComputedStyle(tickContainer[0]);\n        tickCtx.fillStyle = trackTicksStyle.color || 'black';\n\n        distance = Math.floor((vertical ? dimensions.height : dimensions.width) * (i / numSteps));\n\n        tickCtx.fillRect(vertical ? 0 : distance - 1,\n          vertical ? distance - 1 : 0,\n          vertical ? dimensions.width : 2,\n          vertical ? 2 : dimensions.height);\n      }\n    }\n\n    function clearTicks() {\n      if(tickCanvas && tickCtx) {\n        var dimensions = getSliderDimensions();\n        tickCtx.clearRect(0, 0, dimensions.width, dimensions.height);\n      }\n    }\n\n    /**\n     * Refreshing Dimensions\n     */\n    var sliderDimensions = {};\n    refreshSliderDimensions();\n    function refreshSliderDimensions() {\n      sliderDimensions = trackContainer[0].getBoundingClientRect();\n    }\n    function getSliderDimensions() {\n      throttledRefreshDimensions();\n      return sliderDimensions;\n    }\n\n    /**\n     * left/right/up/down arrow listener\n     */\n    function keydownListener(ev) {\n      if (isDisabled()) return;\n\n      var changeAmount;\n      if (vertical ? ev.keyCode === $mdConstant.KEY_CODE.DOWN_ARROW : ev.keyCode === $mdConstant.KEY_CODE.LEFT_ARROW) {\n        changeAmount = -step;\n      } else if (vertical ? ev.keyCode === $mdConstant.KEY_CODE.UP_ARROW : ev.keyCode === $mdConstant.KEY_CODE.RIGHT_ARROW) {\n        changeAmount = step;\n      }\n      changeAmount = invert ? -changeAmount : changeAmount;\n      if (changeAmount) {\n        if (ev.metaKey || ev.ctrlKey || ev.altKey) {\n          changeAmount *= 4;\n        }\n        ev.preventDefault();\n        ev.stopPropagation();\n        scope.$evalAsync(function() {\n          setModelValue(ngModelCtrl.$viewValue + changeAmount);\n        });\n      }\n    }\n\n    function mouseDownListener() {\n      redrawTicks();\n\n      scope.mouseActive = true;\n      wrapper.removeClass('md-focused');\n\n      $timeout(function() {\n        scope.mouseActive = false;\n      }, 100);\n    }\n\n    function focusListener() {\n      if (scope.mouseActive === false) {\n        wrapper.addClass('md-focused');\n      }\n    }\n\n    function blurListener() {\n      wrapper.removeClass('md-focused');\n      element.removeClass('md-active');\n      clearTicks();\n    }\n\n    /**\n     * ngModel setters and validators\n     */\n    function setModelValue(value) {\n      ngModelCtrl.$setViewValue( minMaxValidator(stepValidator(value)) );\n    }\n    function ngModelRender() {\n      if (isNaN(ngModelCtrl.$viewValue)) {\n        ngModelCtrl.$viewValue = ngModelCtrl.$modelValue;\n      }\n\n      ngModelCtrl.$viewValue = minMaxValidator(ngModelCtrl.$viewValue);\n\n      var percent = valueToPercent(ngModelCtrl.$viewValue);\n      scope.modelValue = ngModelCtrl.$viewValue;\n      element.attr('aria-valuenow', ngModelCtrl.$viewValue);\n      setSliderPercent(percent);\n      thumbText.text( ngModelCtrl.$viewValue );\n    }\n\n    function minMaxValidator(value, minValue, maxValue) {\n      if (angular.isNumber(value)) {\n        minValue = angular.isNumber(minValue) ? minValue : min;\n        maxValue = angular.isNumber(maxValue) ? maxValue : max;\n\n        return Math.max(minValue, Math.min(maxValue, value));\n      }\n    }\n\n    function stepValidator(value) {\n      if (angular.isNumber(value)) {\n        var formattedValue = (Math.round((value - min) / step) * step + min);\n        formattedValue = (Math.round(formattedValue * Math.pow(10, round)) / Math.pow(10, round));\n\n        if (containerCtrl && containerCtrl.fitInputWidthToTextLength){\n          $mdUtil.debounce(function () {\n            containerCtrl.fitInputWidthToTextLength(formattedValue.toString().length);\n          }, 100)();\n        }\n\n        return formattedValue;\n      }\n    }\n\n    /**\n     * @param percent 0-1\n     */\n    function setSliderPercent(percent) {\n\n      percent = clamp(percent);\n\n      var thumbPosition = (percent * 100) + '%';\n      var activeTrackPercent = invert ? (1 - percent) * 100 + '%' : thumbPosition;\n\n      if (vertical) {\n        thumbContainer.css('bottom', thumbPosition);\n      }\n      else {\n        $mdUtil.bidiProperty(thumbContainer, 'left', 'right', thumbPosition);\n      }\n\n      \n      activeTrack.css(vertical ? 'height' : 'width', activeTrackPercent);\n\n      element.toggleClass((invert ? 'md-max' : 'md-min'), percent === 0);\n      element.toggleClass((invert ? 'md-min' : 'md-max'), percent === 1);\n    }\n\n    /**\n     * Slide listeners\n     */\n    var isDragging = false;\n\n    function onPressDown(ev) {\n      if (isDisabled()) return;\n\n      element.addClass('md-active');\n      element[0].focus();\n      refreshSliderDimensions();\n\n      var exactVal = percentToValue( positionToPercent( vertical ? ev.pointer.y : ev.pointer.x ));\n      var closestVal = minMaxValidator( stepValidator(exactVal) );\n      scope.$apply(function() {\n        setModelValue( closestVal );\n        setSliderPercent( valueToPercent(closestVal));\n      });\n    }\n    function onPressUp(ev) {\n      if (isDisabled()) return;\n\n      element.removeClass('md-dragging');\n\n      var exactVal = percentToValue( positionToPercent( vertical ? ev.pointer.y : ev.pointer.x ));\n      var closestVal = minMaxValidator( stepValidator(exactVal) );\n      scope.$apply(function() {\n        setModelValue(closestVal);\n        ngModelRender();\n      });\n    }\n    function onDragStart(ev) {\n      if (isDisabled()) return;\n      isDragging = true;\n\n      ev.stopPropagation();\n\n      element.addClass('md-dragging');\n      setSliderFromEvent(ev);\n    }\n    function onDrag(ev) {\n      if (!isDragging) return;\n      ev.stopPropagation();\n      setSliderFromEvent(ev);\n    }\n    function onDragEnd(ev) {\n      if (!isDragging) return;\n      ev.stopPropagation();\n      isDragging = false;\n    }\n\n    function setSliderFromEvent(ev) {\n      // While panning discrete, update only the\n      // visual positioning but not the model value.\n      if ( discrete ) adjustThumbPosition( vertical ? ev.pointer.y : ev.pointer.x );\n      else            doSlide( vertical ? ev.pointer.y : ev.pointer.x );\n    }\n\n    /**\n     * Slide the UI by changing the model value\n     * @param x\n     */\n    function doSlide( x ) {\n      scope.$evalAsync( function() {\n        setModelValue( percentToValue( positionToPercent(x) ));\n      });\n    }\n\n    /**\n     * Slide the UI without changing the model (while dragging/panning)\n     * @param x\n     */\n    function adjustThumbPosition( x ) {\n      var exactVal = percentToValue( positionToPercent( x ));\n      var closestVal = minMaxValidator( stepValidator(exactVal) );\n      setSliderPercent( positionToPercent(x) );\n      thumbText.text( closestVal );\n    }\n\n    /**\n    * Clamps the value to be between 0 and 1.\n    * @param {number} value The value to clamp.\n    * @returns {number}\n    */\n    function clamp(value) {\n      return Math.max(0, Math.min(value || 0, 1));\n    }\n\n    /**\n     * Convert position on slider to percentage value of offset from beginning...\n     * @param position\n     * @returns {number}\n     */\n    function positionToPercent( position ) {\n      var offset = vertical ? sliderDimensions.top : sliderDimensions.left;\n      var size = vertical ? sliderDimensions.height : sliderDimensions.width;\n      var calc = (position - offset) / size;\n\n      if (!vertical && $mdUtil.bidi() === 'rtl') {\n        calc = 1 - calc;\n      }\n\n      return Math.max(0, Math.min(1, vertical ? 1 - calc : calc));\n    }\n\n    /**\n     * Convert percentage offset on slide to equivalent model value\n     * @param percent\n     * @returns {*}\n     */\n    function percentToValue( percent ) {\n      var adjustedPercent = invert ? (1 - percent) : percent;\n      return (min + adjustedPercent * (max - min));\n    }\n\n    function valueToPercent( val ) {\n      var percent = (val - min) / (max - min);\n      return invert ? (1 - percent) : percent;\n    }\n  }\n}\n\n})();\n(function(){\n\"use strict\";\n\n/**\n * @ngdoc module\n * @name material.components.sticky\n * @description\n * Sticky effects for md\n *\n */\nMdSticky.$inject = [\"$mdConstant\", \"$$rAF\", \"$mdUtil\", \"$compile\"];\nangular\n  .module('material.components.sticky', [\n    'material.core',\n    'material.components.content'\n  ])\n  .factory('$mdSticky', MdSticky);\n\n/**\n * @ngdoc service\n * @name $mdSticky\n * @module material.components.sticky\n *\n * @description\n * The `$mdSticky`service provides a mixin to make elements sticky.\n *\n * Whenever the current browser supports stickiness natively, the `$mdSticky` service will just\n * use the native browser stickiness.\n *\n * By default the `$mdSticky` service compiles the cloned element, when not specified through the `elementClone`\n * parameter, in the same scope as the actual element lives.\n *\n *\n * <h3>Notes</h3>\n * When using an element which is containing a compiled directive, which changed its DOM structure during compilation,\n * you should compile the clone yourself using the plain template.<br/><br/>\n * See the right usage below:\n * <hljs lang=\"js\">\n *   angular.module('myModule')\n *     .directive('stickySelect', function($mdSticky, $compile) {\n *       var SELECT_TEMPLATE =\n *         '<md-select ng-model=\"selected\">' +\n *           '<md-option>Option 1</md-option>' +\n *         '</md-select>';\n *\n *       return {\n *         restrict: 'E',\n *         replace: true,\n *         template: SELECT_TEMPLATE,\n *         link: function(scope,element) {\n *           $mdSticky(scope, element, $compile(SELECT_TEMPLATE)(scope));\n *         }\n *       };\n *     });\n * </hljs>\n *\n * @usage\n * <hljs lang=\"js\">\n *   angular.module('myModule')\n *     .directive('stickyText', function($mdSticky, $compile) {\n *       return {\n *         restrict: 'E',\n *         template: '<span>Sticky Text</span>',\n *         link: function(scope,element) {\n *           $mdSticky(scope, element);\n *         }\n *       };\n *     });\n * </hljs>\n *\n * @returns A `$mdSticky` function that takes three arguments:\n *   - `scope`\n *   - `element`: The element that will be 'sticky'\n *   - `elementClone`: A clone of the element, that will be shown\n *     when the user starts scrolling past the original element.\n *     If not provided, it will use the result of `element.clone()` and compiles it in the given scope.\n */\nfunction MdSticky($mdConstant, $$rAF, $mdUtil, $compile) {\n\n  var browserStickySupport = $mdUtil.checkStickySupport();\n\n  /**\n   * Registers an element as sticky, used internally by directives to register themselves\n   */\n  return function registerStickyElement(scope, element, stickyClone) {\n    var contentCtrl = element.controller('mdContent');\n    if (!contentCtrl) return;\n\n    if (browserStickySupport) {\n      element.css({\n        position: browserStickySupport,\n        top: 0,\n        'z-index': 2\n      });\n    } else {\n      var $$sticky = contentCtrl.$element.data('$$sticky');\n      if (!$$sticky) {\n        $$sticky = setupSticky(contentCtrl);\n        contentCtrl.$element.data('$$sticky', $$sticky);\n      }\n\n      // Compile our cloned element, when cloned in this service, into the given scope.\n      var cloneElement = stickyClone || $compile(element.clone())(scope);\n\n      var deregister = $$sticky.add(element, cloneElement);\n      scope.$on('$destroy', deregister);\n    }\n  };\n\n  function setupSticky(contentCtrl) {\n    var contentEl = contentCtrl.$element;\n\n    // Refresh elements is very expensive, so we use the debounced\n    // version when possible.\n    var debouncedRefreshElements = $$rAF.throttle(refreshElements);\n\n    // setupAugmentedScrollEvents gives us `$scrollstart` and `$scroll`,\n    // more reliable than `scroll` on android.\n    setupAugmentedScrollEvents(contentEl);\n    contentEl.on('$scrollstart', debouncedRefreshElements);\n    contentEl.on('$scroll', onScroll);\n\n    var self;\n    return self = {\n      prev: null,\n      current: null, //the currently stickied item\n      next: null,\n      items: [],\n      add: add,\n      refreshElements: refreshElements\n    };\n\n    /***************\n     * Public\n     ***************/\n    // Add an element and its sticky clone to this content's sticky collection\n    function add(element, stickyClone) {\n      stickyClone.addClass('md-sticky-clone');\n\n      var item = {\n        element: element,\n        clone: stickyClone\n      };\n      self.items.push(item);\n\n      $mdUtil.nextTick(function() {\n        contentEl.prepend(item.clone);\n      });\n\n      debouncedRefreshElements();\n\n      return function remove() {\n        self.items.forEach(function(item, index) {\n          if (item.element[0] === element[0]) {\n            self.items.splice(index, 1);\n            item.clone.remove();\n          }\n        });\n        debouncedRefreshElements();\n      };\n    }\n\n    function refreshElements() {\n      // Sort our collection of elements by their current position in the DOM.\n      // We need to do this because our elements' order of being added may not\n      // be the same as their order of display.\n      self.items.forEach(refreshPosition);\n      self.items = self.items.sort(function(a, b) {\n        return a.top < b.top ? -1 : 1;\n      });\n\n      // Find which item in the list should be active, \n      // based upon the content's current scroll position\n      var item;\n      var currentScrollTop = contentEl.prop('scrollTop');\n      for (var i = self.items.length - 1; i >= 0; i--) {\n        if (currentScrollTop > self.items[i].top) {\n          item = self.items[i];\n          break;\n        }\n      }\n      setCurrentItem(item);\n    }\n\n    /***************\n     * Private\n     ***************/\n\n    // Find the `top` of an item relative to the content element,\n    // and also the height.\n    function refreshPosition(item) {\n      // Find the top of an item by adding to the offsetHeight until we reach the \n      // content element.\n      var current = item.element[0];\n      item.top = 0;\n      item.left = 0;\n      item.right = 0;\n      while (current && current !== contentEl[0]) {\n        item.top += current.offsetTop;\n        item.left += current.offsetLeft;\n        if ( current.offsetParent ){\n          item.right += current.offsetParent.offsetWidth - current.offsetWidth - current.offsetLeft; //Compute offsetRight\n        }\n        current = current.offsetParent;\n      }\n      item.height = item.element.prop('offsetHeight');\n\n      var defaultVal = $mdUtil.floatingScrollbars() ? '0' : undefined;\n      $mdUtil.bidi(item.clone, 'margin-left', item.left, defaultVal);\n      $mdUtil.bidi(item.clone, 'margin-right', defaultVal, item.right);\n    }\n\n    // As we scroll, push in and select the correct sticky element.\n    function onScroll() {\n      var scrollTop = contentEl.prop('scrollTop');\n      var isScrollingDown = scrollTop > (onScroll.prevScrollTop || 0);\n\n      // Store the previous scroll so we know which direction we are scrolling\n      onScroll.prevScrollTop = scrollTop;\n\n      //\n      // AT TOP (not scrolling)\n      //\n      if (scrollTop === 0) {\n        // If we're at the top, just clear the current item and return\n        setCurrentItem(null);\n        return;\n      }\n\n      //\n      // SCROLLING DOWN (going towards the next item)\n      //\n      if (isScrollingDown) {\n\n        // If we've scrolled down past the next item's position, sticky it and return\n        if (self.next && self.next.top <= scrollTop) {\n          setCurrentItem(self.next);\n          return;\n        }\n\n        // If the next item is close to the current one, push the current one up out of the way\n        if (self.current && self.next && self.next.top - scrollTop <= self.next.height) {\n          translate(self.current, scrollTop + (self.next.top - self.next.height - scrollTop));\n          return;\n        }\n      }\n\n      //\n      // SCROLLING UP (not at the top & not scrolling down; must be scrolling up)\n      //\n      if (!isScrollingDown) {\n\n        // If we've scrolled up past the previous item's position, sticky it and return\n        if (self.current && self.prev && scrollTop < self.current.top) {\n          setCurrentItem(self.prev);\n          return;\n        }\n\n        // If the next item is close to the current one, pull the current one down into view\n        if (self.next && self.current && (scrollTop >= (self.next.top - self.current.height))) {\n          translate(self.current, scrollTop + (self.next.top - scrollTop - self.current.height));\n          return;\n        }\n      }\n\n      //\n      // Otherwise, just move the current item to the proper place (scrolling up or down)\n      //\n      if (self.current) {\n        translate(self.current, scrollTop);\n      }\n    }\n\n    function setCurrentItem(item) {\n      if (self.current === item) return;\n      // Deactivate currently active item\n      if (self.current) {\n        translate(self.current, null);\n        setStickyState(self.current, null);\n      }\n\n      // Activate new item if given\n      if (item) {\n        setStickyState(item, 'active');\n      }\n\n      self.current = item;\n      var index = self.items.indexOf(item);\n      // If index === -1, index + 1 = 0. It works out.\n      self.next = self.items[index + 1];\n      self.prev = self.items[index - 1];\n      setStickyState(self.next, 'next');\n      setStickyState(self.prev, 'prev');\n    }\n\n    function setStickyState(item, state) {\n      if (!item || item.state === state) return;\n      if (item.state) {\n        item.clone.attr('sticky-prev-state', item.state);\n        item.element.attr('sticky-prev-state', item.state);\n      }\n      item.clone.attr('sticky-state', state);\n      item.element.attr('sticky-state', state);\n      item.state = state;\n    }\n\n    function translate(item, amount) {\n      if (!item) return;\n      if (amount === null || amount === undefined) {\n        if (item.translateY) {\n          item.translateY = null;\n          item.clone.css($mdConstant.CSS.TRANSFORM, '');\n        }\n      } else {\n        item.translateY = amount;\n\n        $mdUtil.bidi( item.clone, $mdConstant.CSS.TRANSFORM,\n          'translate3d(' + item.left + 'px,' + amount + 'px,0)',\n          'translateY(' + amount + 'px)'\n        );\n      }\n    }\n  }\n\n\n  // Android 4.4 don't accurately give scroll events.\n  // To fix this problem, we setup a fake scroll event. We say:\n  // > If a scroll or touchmove event has happened in the last DELAY milliseconds, \n  //   then send a `$scroll` event every animationFrame.\n  // Additionally, we add $scrollstart and $scrollend events.\n  function setupAugmentedScrollEvents(element) {\n    var SCROLL_END_DELAY = 200;\n    var isScrolling;\n    var lastScrollTime;\n    element.on('scroll touchmove', function() {\n      if (!isScrolling) {\n        isScrolling = true;\n        $$rAF.throttle(loopScrollEvent);\n        element.triggerHandler('$scrollstart');\n      }\n      element.triggerHandler('$scroll');\n      lastScrollTime = +$mdUtil.now();\n    });\n\n    function loopScrollEvent() {\n      if (+$mdUtil.now() - lastScrollTime > SCROLL_END_DELAY) {\n        isScrolling = false;\n        element.triggerHandler('$scrollend');\n      } else {\n        element.triggerHandler('$scroll');\n        $$rAF.throttle(loopScrollEvent);\n      }\n    }\n  }\n\n}\n\n})();\n(function(){\n\"use strict\";\n\n/**\n * @ngdoc module\n * @name material.components.subheader\n * @description\n * SubHeader module\n *\n *  Subheaders are special list tiles that delineate distinct sections of a\n *  list or grid list and are typically related to the current filtering or\n *  sorting criteria. Subheader tiles are either displayed inline with tiles or\n *  can be associated with content, for example, in an adjacent column.\n *\n *  Upon scrolling, subheaders remain pinned to the top of the screen and remain\n *  pinned until pushed on or off screen by the next subheader. @see [Material\n *  Design Specifications](https://www.google.com/design/spec/components/subheaders.html)\n *\n *  > To improve the visual grouping of content, use the system color for your subheaders.\n *\n */\nMdSubheaderDirective.$inject = [\"$mdSticky\", \"$compile\", \"$mdTheming\", \"$mdUtil\", \"$mdAria\"];\nangular\n  .module('material.components.subheader', [\n    'material.core',\n    'material.components.sticky'\n  ])\n  .directive('mdSubheader', MdSubheaderDirective);\n\n/**\n * @ngdoc directive\n * @name mdSubheader\n * @module material.components.subheader\n *\n * @restrict E\n *\n * @description\n * The `md-subheader` directive creates a sticky subheader for a section.\n *\n * Developers are able to disable the stickiness of the subheader by using the following markup\n *\n * <hljs lang=\"html\">\n *   <md-subheader class=\"md-no-sticky\">Not Sticky</md-subheader>\n * </hljs>\n *\n * ### Notes\n * - The `md-subheader` directive uses the <a ng-href=\"api/service/$mdSticky\">$mdSticky</a> service\n * to make the subheader sticky.\n *\n * > Whenever the current browser doesn't support stickiness natively, the subheader\n * will be compiled twice to create a sticky clone of the subheader.\n *\n * @usage\n * <hljs lang=\"html\">\n * <md-subheader>Online Friends</md-subheader>\n * </hljs>\n */\n\nfunction MdSubheaderDirective($mdSticky, $compile, $mdTheming, $mdUtil, $mdAria) {\n  return {\n    restrict: 'E',\n    replace: true,\n    transclude: true,\n    template: (\n    '<div class=\"md-subheader _md\">' +\n    '  <div class=\"md-subheader-inner\">' +\n    '    <div class=\"md-subheader-content\"></div>' +\n    '  </div>' +\n    '</div>'\n    ),\n    link: function postLink(scope, element, attr, controllers, transclude) {\n      $mdTheming(element);\n      element.addClass('_md');\n\n      // Remove the ngRepeat attribute from the root element, because we don't want to compile\n      // the ngRepeat for the sticky clone again.\n      $mdUtil.prefixer().removeAttribute(element, 'ng-repeat');\n\n      var outerHTML = element[0].outerHTML;\n\n      function getContent(el) {\n        return angular.element(el[0].querySelector('.md-subheader-content'));\n      }\n\n      // Set the ARIA attributes on the original element since it keeps it's original place in\n      // the DOM, whereas the clones are in reverse order. Should be done after the outerHTML,\n      // in order to avoid having multiple element be marked as headers.\n      attr.$set('role', 'heading');\n      $mdAria.expect(element, 'aria-level', '2');\n\n      // Transclude the user-given contents of the subheader\n      // the conventional way.\n      transclude(scope, function(clone) {\n        getContent(element).append(clone);\n      });\n\n      // Create another clone, that uses the outer and inner contents\n      // of the element, that will be 'stickied' as the user scrolls.\n      if (!element.hasClass('md-no-sticky')) {\n        transclude(scope, function(clone) {\n          // If the user adds an ng-if or ng-repeat directly to the md-subheader element, the\n          // compiled clone below will only be a comment tag (since they replace their elements with\n          // a comment) which cannot be properly passed to the $mdSticky; so we wrap it in our own\n          // DIV to ensure we have something $mdSticky can use\n          var wrapper = $compile('<div class=\"md-subheader-wrapper\" aria-hidden=\"true\">' + outerHTML + '</div>')(scope);\n\n          // Delay initialization until after any `ng-if`/`ng-repeat`/etc has finished before\n          // attempting to create the clone\n          $mdUtil.nextTick(function() {\n            // Append our transcluded clone into the wrapper.\n            // We don't have to recompile the element again, because the clone is already\n            // compiled in it's transclusion scope. If we recompile the outerHTML of the new clone, we would lose\n            // our ngIf's and other previous registered bindings / properties.\n            getContent(wrapper).append(clone);\n          });\n\n          // Make the element sticky and provide the stickyClone our self, to avoid recompilation of the subheader\n          // element.\n          $mdSticky(scope, element, wrapper);\n        });\n      }\n    }\n  };\n}\n\n})();\n(function(){\n\"use strict\";\n\n/**\n * @ngdoc module\n * @name material.components.switch\n */\n\nMdSwitch.$inject = [\"mdCheckboxDirective\", \"$mdUtil\", \"$mdConstant\", \"$parse\", \"$$rAF\", \"$mdGesture\", \"$timeout\"];\nangular.module('material.components.switch', [\n  'material.core',\n  'material.components.checkbox'\n])\n  .directive('mdSwitch', MdSwitch);\n\n/**\n * @ngdoc directive\n * @module material.components.switch\n * @name mdSwitch\n * @restrict E\n *\n * The switch directive is used very much like the normal [angular checkbox](https://docs.angularjs.org/api/ng/input/input%5Bcheckbox%5D).\n *\n * As per the [material design spec](http://www.google.com/design/spec/style/color.html#color-ui-color-application)\n * the switch is in the accent color by default. The primary color palette may be used with\n * the `md-primary` class.\n *\n * @param {string} ng-model Assignable angular expression to data-bind to.\n * @param {string=} name Property name of the form under which the control is published.\n * @param {expression=} ng-true-value The value to which the expression should be set when selected.\n * @param {expression=} ng-false-value The value to which the expression should be set when not selected.\n * @param {string=} ng-change AngularJS expression to be executed when input changes due to user interaction with the input element.\n * @param {expression=} ng-disabled En/Disable based on the expression.\n * @param {boolean=} md-no-ink Use of attribute indicates use of ripple ink effects.\n * @param {string=} aria-label Publish the button label used by screen-readers for accessibility. Defaults to the switch's text.\n * @param {boolean=} md-invert When set to true, the switch will be inverted.\n *\n * @usage\n * <hljs lang=\"html\">\n * <md-switch ng-model=\"isActive\" aria-label=\"Finished?\">\n *   Finished ?\n * </md-switch>\n *\n * <md-switch md-no-ink ng-model=\"hasInk\" aria-label=\"No Ink Effects\">\n *   No Ink Effects\n * </md-switch>\n *\n * <md-switch ng-disabled=\"true\" ng-model=\"isDisabled\" aria-label=\"Disabled\">\n *   Disabled\n * </md-switch>\n *\n * </hljs>\n */\nfunction MdSwitch(mdCheckboxDirective, $mdUtil, $mdConstant, $parse, $$rAF, $mdGesture, $timeout) {\n  var checkboxDirective = mdCheckboxDirective[0];\n\n  return {\n    restrict: 'E',\n    priority: $mdConstant.BEFORE_NG_ARIA,\n    transclude: true,\n    template:\n      '<div class=\"md-container\">' +\n        '<div class=\"md-bar\"></div>' +\n        '<div class=\"md-thumb-container\">' +\n          '<div class=\"md-thumb\" md-ink-ripple md-ink-ripple-checkbox></div>' +\n        '</div>'+\n      '</div>' +\n      '<div ng-transclude class=\"md-label\"></div>',\n    require: ['^?mdInputContainer', '?ngModel', '?^form'],\n    compile: mdSwitchCompile\n  };\n\n  function mdSwitchCompile(element, attr) {\n    var checkboxLink = checkboxDirective.compile(element, attr).post;\n    // No transition on initial load.\n    element.addClass('md-dragging');\n\n    return function (scope, element, attr, ctrls) {\n      var containerCtrl = ctrls[0];\n      var ngModel = ctrls[1] || $mdUtil.fakeNgModel();\n      var formCtrl = ctrls[2];\n\n      var disabledGetter = null;\n      if (attr.disabled != null) {\n        disabledGetter = function() { return true; };\n      } else if (attr.ngDisabled) {\n        disabledGetter = $parse(attr.ngDisabled);\n      }\n\n      var thumbContainer = angular.element(element[0].querySelector('.md-thumb-container'));\n      var switchContainer = angular.element(element[0].querySelector('.md-container'));\n      var labelContainer = angular.element(element[0].querySelector('.md-label'));\n\n      // no transition on initial load\n      $$rAF(function() {\n        element.removeClass('md-dragging');\n      });\n\n      checkboxLink(scope, element, attr, ctrls);\n\n      if (disabledGetter) {\n        scope.$watch(disabledGetter, function(isDisabled) {\n          element.attr('tabindex', isDisabled ? -1 : 0);\n        });\n      }\n\n      attr.$observe('mdInvert', function(newValue) {\n        var isInverted = $mdUtil.parseAttributeBoolean(newValue);\n\n        isInverted ? element.prepend(labelContainer) : element.prepend(switchContainer);\n\n        // Toggle a CSS class to update the margin.\n        element.toggleClass('md-inverted', isInverted);\n      });\n\n      // These events are triggered by setup drag\n      $mdGesture.register(switchContainer, 'drag');\n      switchContainer\n        .on('$md.dragstart', onDragStart)\n        .on('$md.drag', onDrag)\n        .on('$md.dragend', onDragEnd);\n\n      var drag;\n      function onDragStart(ev) {\n        // Don't go if the switch is disabled.\n        if (disabledGetter && disabledGetter(scope)) return;\n        ev.stopPropagation();\n\n        element.addClass('md-dragging');\n        drag = {width: thumbContainer.prop('offsetWidth')};\n      }\n\n      function onDrag(ev) {\n        if (!drag) return;\n        ev.stopPropagation();\n        ev.srcEvent && ev.srcEvent.preventDefault();\n\n        var percent = ev.pointer.distanceX / drag.width;\n\n        //if checked, start from right. else, start from left\n        var translate = ngModel.$viewValue ?  1 + percent : percent;\n        // Make sure the switch stays inside its bounds, 0-1%\n        translate = Math.max(0, Math.min(1, translate));\n\n        thumbContainer.css($mdConstant.CSS.TRANSFORM, 'translate3d(' + (100*translate) + '%,0,0)');\n        drag.translate = translate;\n      }\n\n      function onDragEnd(ev) {\n        if (!drag) return;\n        ev.stopPropagation();\n\n        element.removeClass('md-dragging');\n        thumbContainer.css($mdConstant.CSS.TRANSFORM, '');\n\n        // We changed if there is no distance (this is a click a click),\n        // or if the drag distance is >50% of the total.\n        var isChanged = ngModel.$viewValue ? drag.translate < 0.5 : drag.translate > 0.5;\n        if (isChanged) {\n          applyModelValue(!ngModel.$viewValue);\n        }\n        drag = null;\n\n        // Wait for incoming mouse click\n        scope.skipToggle = true;\n        $timeout(function() {\n          scope.skipToggle = false;\n        }, 1);\n      }\n\n      function applyModelValue(newValue) {\n        scope.$apply(function() {\n          ngModel.$setViewValue(newValue);\n          ngModel.$render();\n        });\n      }\n\n    };\n  }\n\n\n}\n\n})();\n(function(){\n\"use strict\";\n\n/**\n * @ngdoc module\n * @name material.components.swipe\n * @description Swipe module!\n */\n/**\n * @ngdoc directive\n * @module material.components.swipe\n * @name mdSwipeLeft\n *\n * @restrict A\n *\n * @description\n * The md-swipe-left directive allows you to specify custom behavior when an element is swiped\n * left.\n *\n * @usage\n * <hljs lang=\"html\">\n * <div md-swipe-left=\"onSwipeLeft()\">Swipe me left!</div>\n * </hljs>\n */\n/**\n * @ngdoc directive\n * @module material.components.swipe\n * @name mdSwipeRight\n *\n * @restrict A\n *\n * @description\n * The md-swipe-right directive allows you to specify custom behavior when an element is swiped\n * right.\n *\n * @usage\n * <hljs lang=\"html\">\n * <div md-swipe-right=\"onSwipeRight()\">Swipe me right!</div>\n * </hljs>\n */\n/**\n * @ngdoc directive\n * @module material.components.swipe\n * @name mdSwipeUp\n *\n * @restrict A\n *\n * @description\n * The md-swipe-up directive allows you to specify custom behavior when an element is swiped\n * up.\n *\n * @usage\n * <hljs lang=\"html\">\n * <div md-swipe-up=\"onSwipeUp()\">Swipe me up!</div>\n * </hljs>\n */\n/**\n * @ngdoc directive\n * @module material.components.swipe\n * @name mdSwipeDown\n *\n * @restrict A\n *\n * @description\n * The md-swipe-down directive allows you to specify custom behavior when an element is swiped\n * down.\n *\n * @usage\n * <hljs lang=\"html\">\n * <div md-swipe-down=\"onSwipDown()\">Swipe me down!</div>\n * </hljs>\n */\n\nangular.module('material.components.swipe', ['material.core'])\n    .directive('mdSwipeLeft', getDirective('SwipeLeft'))\n    .directive('mdSwipeRight', getDirective('SwipeRight'))\n    .directive('mdSwipeUp', getDirective('SwipeUp'))\n    .directive('mdSwipeDown', getDirective('SwipeDown'));\n\nfunction getDirective(name) {\n    DirectiveFactory.$inject = [\"$parse\"];\n  var directiveName = 'md' + name;\n  var eventName = '$md.' + name.toLowerCase();\n\n  return DirectiveFactory;\n\n  /* @ngInject */\n  function DirectiveFactory($parse) {\n      return {restrict: 'A', link: postLink};\n\n    function postLink(scope, element, attr) {\n        element.css('touch-action', attr['mdSwipeTouchAction'] || 'none');\n\n        var fn = $parse(attr[directiveName]);\n        element.on(eventName, function(ev) {\n          scope.$applyAsync(function() { fn(scope, { $event: ev }); });\n        });\n      }\n    }\n}\n\n\n\n})();\n(function(){\n\"use strict\";\n\n/**\n * @ngdoc module\n * @name material.components.tabs\n * @description\n *\n *  Tabs, created with the `<md-tabs>` directive provide *tabbed* navigation with different styles.\n *  The Tabs component consists of clickable tabs that are aligned horizontally side-by-side.\n *\n *  Features include support for:\n *\n *  - static or dynamic tabs,\n *  - responsive designs,\n *  - accessibility support (ARIA),\n *  - tab pagination,\n *  - external or internal tab content,\n *  - focus indicators and arrow-key navigations,\n *  - programmatic lookup and access to tab controllers, and\n *  - dynamic transitions through different tab contents.\n *\n */\n/*\n * @see js folder for tabs implementation\n */\nangular.module('material.components.tabs', [\n  'material.core',\n  'material.components.icon'\n]);\n\n})();\n(function(){\n\"use strict\";\n\n/**\n  * @ngdoc module\n  * @name material.components.toast\n  * @description\n  * Toast\n  */\nMdToastDirective.$inject = [\"$mdToast\"];\nMdToastProvider.$inject = [\"$$interimElementProvider\"];\nangular.module('material.components.toast', [\n  'material.core',\n  'material.components.button'\n])\n  .directive('mdToast', MdToastDirective)\n  .provider('$mdToast', MdToastProvider);\n\n/* @ngInject */\nfunction MdToastDirective($mdToast) {\n  return {\n    restrict: 'E',\n    link: function postLink(scope, element) {\n      element.addClass('_md');     // private md component indicator for styling\n      \n      // When navigation force destroys an interimElement, then\n      // listen and $destroy() that interim instance...\n      scope.$on('$destroy', function() {\n        $mdToast.destroy();\n      });\n    }\n  };\n}\n\n/**\n  * @ngdoc service\n  * @name $mdToast\n  * @module material.components.toast\n  *\n  * @description\n  * `$mdToast` is a service to build a toast notification on any position\n  * on the screen with an optional duration, and provides a simple promise API.\n  *\n  * The toast will be always positioned at the `bottom`, when the screen size is\n  * between `600px` and `959px` (`sm` breakpoint)\n  *\n  * ## Restrictions on custom toasts\n  * - The toast's template must have an outer `<md-toast>` element.\n  * - For a toast action, use element with class `md-action`.\n  * - Add the class `md-capsule` for curved corners.\n  *\n  * ### Custom Presets\n  * Developers are also able to create their own preset, which can be easily used without repeating\n  * their options each time.\n  *\n  * <hljs lang=\"js\">\n  *   $mdToastProvider.addPreset('testPreset', {\n  *     options: function() {\n  *       return {\n  *         template:\n  *           '<md-toast>' +\n  *             '<div class=\"md-toast-content\">' +\n  *               'This is a custom preset' +\n  *             '</div>' +\n  *           '</md-toast>',\n  *         controllerAs: 'toast',\n  *         bindToController: true\n  *       };\n  *     }\n  *   });\n  * </hljs>\n  *\n  * After you created your preset at config phase, you can easily access it.\n  *\n  * <hljs lang=\"js\">\n  *   $mdToast.show(\n  *     $mdToast.testPreset()\n  *   );\n  * </hljs>\n  *\n  * ## Parent container notes\n  *\n  * The toast is positioned using absolute positioning relative to its first non-static parent\n  * container. Thus, if the requested parent container uses static positioning, we will temporarily\n  * set its positioning to `relative` while the toast is visible and reset it when the toast is\n  * hidden.\n  *\n  * Because of this, it is usually best to ensure that the parent container has a fixed height and\n  * prevents scrolling by setting the `overflow: hidden;` style. Since the position is based off of\n  * the parent's height, the toast may be mispositioned if you allow the parent to scroll.\n  *\n  * You can, however, have a scrollable element inside of the container; just make sure the\n  * container itself does not scroll.\n  *\n  * <hljs lang=\"html\">\n  * <div layout-fill id=\"toast-container\">\n  *   <md-content>\n  *     I can have lots of content and scroll!\n  *   </md-content>\n  * </div>\n  * </hljs>\n  *\n  * @usage\n  * <hljs lang=\"html\">\n  * <div ng-controller=\"MyController\">\n  *   <md-button ng-click=\"openToast()\">\n  *     Open a Toast!\n  *   </md-button>\n  * </div>\n  * </hljs>\n  *\n  * <hljs lang=\"js\">\n  * var app = angular.module('app', ['ngMaterial']);\n  * app.controller('MyController', function($scope, $mdToast) {\n  *   $scope.openToast = function($event) {\n  *     $mdToast.show($mdToast.simple().textContent('Hello!'));\n  *     // Could also do $mdToast.showSimple('Hello');\n  *   };\n  * });\n  * </hljs>\n  */\n\n/**\n * @ngdoc method\n * @name $mdToast#showSimple\n * \n * @param {string} message The message to display inside the toast\n * @description\n * Convenience method which builds and shows a simple toast.\n *\n * @returns {promise} A promise that can be resolved with `$mdToast.hide()` or\n * rejected with `$mdToast.cancel()`.\n *\n */\n\n /**\n  * @ngdoc method\n  * @name $mdToast#simple\n  *\n  * @description\n  * Builds a preconfigured toast.\n  *\n  * @returns {obj} a `$mdToastPreset` with the following chainable configuration methods.\n  *\n  * _**Note:** These configuration methods are provided in addition to the methods provided by\n  * the `build()` and `show()` methods below._\n  *\n  * <table class=\"md-api-table methods\">\n  *    <thead>\n  *      <tr>\n  *        <th>Method</th>\n  *        <th>Description</th>\n  *      </tr>\n  *    </thead>\n  *    <tbody>\n  *      <tr>\n  *        <td>`.textContent(string)`</td>\n  *        <td>Sets the toast content to the specified string</td>\n  *      </tr>\n  *      <tr>\n  *        <td>`.action(string)`</td>\n  *        <td>\n  *          Adds an action button. <br/>\n  *          If clicked, the promise (returned from `show()`)\n  *          will resolve with the value `'ok'`; otherwise, it is resolved with `true` after a `hideDelay`\n  *          timeout\n  *        </td>\n  *      </tr>\n  *      <tr>\n  *        <td>`.highlightAction(boolean)`</td>\n  *        <td>\n  *          Whether or not the action button will have an additional highlight class.<br/>\n  *          By default the `accent` color will be applied to the action button.\n  *        </td>\n  *      </tr>\n  *      <tr>\n  *        <td>`.highlightClass(string)`</td>\n  *        <td>\n  *          If set, the given class will be applied to the highlighted action button.<br/>\n  *          This allows you to specify the highlight color easily. Highlight classes are `md-primary`, `md-warn`\n  *          and `md-accent`\n  *        </td>\n  *      </tr>\n  *      <tr>\n  *        <td>`.capsule(boolean)`</td>\n  *        <td>Whether or not to add the `md-capsule` class to the toast to provide rounded corners</td>\n  *      </tr>\n  *      <tr>\n  *        <td>`.theme(string)`</td>\n  *        <td>Sets the theme on the toast to the requested theme. Default is `$mdThemingProvider`'s default.</td>\n  *      </tr>\n  *      <tr>\n  *        <td>`.toastClass(string)`</td>\n  *        <td>Sets a class on the toast element</td>\n  *      </tr>\n  *    </tbody>\n  * </table>\n  *\n  */\n\n/**\n  * @ngdoc method\n  * @name $mdToast#updateTextContent\n  *\n  * @description\n  * Updates the content of an existing toast. Useful for updating things like counts, etc.\n  *\n  */\n\n /**\n  * @ngdoc method\n  * @name $mdToast#build\n  *\n  * @description\n  * Creates a custom `$mdToastPreset` that you can configure.\n  *\n  * @returns {obj} a `$mdToastPreset` with the chainable configuration methods for shows' options (see below).\n  */\n\n /**\n  * @ngdoc method\n  * @name $mdToast#show\n  *\n  * @description Shows the toast.\n  *\n  * @param {object} optionsOrPreset Either provide an `$mdToastPreset` returned from `simple()`\n  * and `build()`, or an options object with the following properties:\n  *\n  *   - `templateUrl` - `{string=}`: The url of an html template file that will\n  *     be used as the content of the toast. Restrictions: the template must\n  *     have an outer `md-toast` element.\n  *   - `template` - `{string=}`: Same as templateUrl, except this is an actual\n  *     template string.\n  *   - `autoWrap` - `{boolean=}`: Whether or not to automatically wrap the template content with a\n  *     `<div class=\"md-toast-content\">` if one is not provided. Defaults to true. Can be disabled if you provide a\n  *     custom toast directive.\n  *   - `scope` - `{object=}`: the scope to link the template / controller to. If none is specified, it will create a new child scope.\n  *     This scope will be destroyed when the toast is removed unless `preserveScope` is set to true.\n  *   - `preserveScope` - `{boolean=}`: whether to preserve the scope when the element is removed. Default is false\n  *   - `hideDelay` - `{number=}`: How many milliseconds the toast should stay\n  *     active before automatically closing.  Set to 0 or false to have the toast stay open until\n  *     closed manually. Default: 3000.\n  *   - `position` - `{string=}`: Sets the position of the toast. <br/>\n  *     Available: any combination of `'bottom'`, `'left'`, `'top'`, `'right'`, `'end'` and `'start'`.\n  *     The properties `'end'` and `'start'` are dynamic and can be used for RTL support.<br/>\n  *     Default combination: `'bottom left'`.\n  *   - `toastClass` - `{string=}`: A class to set on the toast element.\n  *   - `controller` - `{string=}`: The controller to associate with this toast.\n  *     The controller will be injected the local `$mdToast.hide( )`, which is a function\n  *     used to hide the toast.\n  *   - `locals` - `{string=}`: An object containing key/value pairs. The keys will\n  *     be used as names of values to inject into the controller. For example,\n  *     `locals: {three: 3}` would inject `three` into the controller with the value\n  *     of 3.\n  *   - `bindToController` - `bool`: bind the locals to the controller, instead of passing them in.\n  *   - `resolve` - `{object=}`: Similar to locals, except it takes promises as values\n  *     and the toast will not open until the promises resolve.\n  *   - `controllerAs` - `{string=}`: An alias to assign the controller to on the scope.\n  *   - `parent` - `{element=}`: The element to append the toast to. Defaults to appending\n  *     to the root element of the application.\n  *\n  * @returns {promise} A promise that can be resolved with `$mdToast.hide()` or\n  * rejected with `$mdToast.cancel()`. `$mdToast.hide()` will resolve either with a Boolean\n  * value == 'true' or the value passed as an argument to `$mdToast.hide()`.\n  * And `$mdToast.cancel()` will resolve the promise with a Boolean value == 'false'\n  */\n\n/**\n  * @ngdoc method\n  * @name $mdToast#hide\n  *\n  * @description\n  * Hide an existing toast and resolve the promise returned from `$mdToast.show()`.\n  *\n  * @param {*=} response An argument for the resolved promise.\n  *\n  * @returns {promise} a promise that is called when the existing element is removed from the DOM.\n  * The promise is resolved with either a Boolean value == 'true' or the value passed as the\n  * argument to `.hide()`.\n  *\n  */\n\n/**\n  * @ngdoc method\n  * @name $mdToast#cancel\n  *\n  * @description\n  * `DEPRECATED` - The promise returned from opening a toast is used only to notify about the closing of the toast.\n  * As such, there isn't any reason to also allow that promise to be rejected,\n  * since it's not clear what the difference between resolve and reject would be.\n  *\n  * Hide the existing toast and reject the promise returned from\n  * `$mdToast.show()`.\n  *\n  * @param {*=} response An argument for the rejected promise.\n  *\n  * @returns {promise} a promise that is called when the existing element is removed from the DOM\n  * The promise is resolved with a Boolean value == 'false'.\n  *\n  */\n\nfunction MdToastProvider($$interimElementProvider) {\n  // Differentiate promise resolves: hide timeout (value == true) and hide action clicks (value == ok).\n  toastDefaultOptions.$inject = [\"$animate\", \"$mdToast\", \"$mdUtil\", \"$mdMedia\"];\n  var ACTION_RESOLVE = 'ok';\n\n  var activeToastContent;\n  var $mdToast = $$interimElementProvider('$mdToast')\n    .setDefaults({\n      methods: ['position', 'hideDelay', 'capsule', 'parent', 'position', 'toastClass'],\n      options: toastDefaultOptions\n    })\n    .addPreset('simple', {\n      argOption: 'textContent',\n      methods: ['textContent', 'content', 'action', 'highlightAction', 'highlightClass', 'theme', 'parent' ],\n      options: /* @ngInject */ [\"$mdToast\", \"$mdTheming\", function($mdToast, $mdTheming) {\n        return {\n          template:\n            '<md-toast md-theme=\"{{ toast.theme }}\" ng-class=\"{\\'md-capsule\\': toast.capsule}\">' +\n            '  <div class=\"md-toast-content\">' +\n            '    <span class=\"md-toast-text\" role=\"alert\" aria-relevant=\"all\" aria-atomic=\"true\">' +\n            '      {{ toast.content }}' +\n            '    </span>' +\n            '    <md-button class=\"md-action\" ng-if=\"toast.action\" ng-click=\"toast.resolve()\" ' +\n            '        ng-class=\"highlightClasses\">' +\n            '      {{ toast.action }}' +\n            '    </md-button>' +\n            '  </div>' +\n            '</md-toast>',\n          controller: /* @ngInject */ [\"$scope\", function mdToastCtrl($scope) {\n            var self = this;\n\n            if (self.highlightAction) {\n              $scope.highlightClasses = [\n                'md-highlight',\n                self.highlightClass\n              ]\n            }\n\n            $scope.$watch(function() { return activeToastContent; }, function() {\n              self.content = activeToastContent;\n            });\n\n            this.resolve = function() {\n              $mdToast.hide( ACTION_RESOLVE );\n            };\n          }],\n          theme: $mdTheming.defaultTheme(),\n          controllerAs: 'toast',\n          bindToController: true\n        };\n      }]\n    })\n    .addMethod('updateTextContent', updateTextContent)\n    .addMethod('updateContent', updateTextContent);\n\n    function updateTextContent(newContent) {\n      activeToastContent = newContent;\n    }\n\n    return $mdToast;\n\n  /* @ngInject */\n  function toastDefaultOptions($animate, $mdToast, $mdUtil, $mdMedia) {\n    var SWIPE_EVENTS = '$md.swipeleft $md.swiperight $md.swipeup $md.swipedown';\n    return {\n      onShow: onShow,\n      onRemove: onRemove,\n      toastClass: '',\n      position: 'bottom left',\n      themable: true,\n      hideDelay: 3000,\n      autoWrap: true,\n      transformTemplate: function(template, options) {\n        var shouldAddWrapper = options.autoWrap && template && !/md-toast-content/g.test(template);\n\n        if (shouldAddWrapper) {\n          // Root element of template will be <md-toast>. We need to wrap all of its content inside of\n          // of <div class=\"md-toast-content\">. All templates provided here should be static, developer-controlled\n          // content (meaning we're not attempting to guard against XSS).\n          var templateRoot = document.createElement('md-template');\n          templateRoot.innerHTML = template;\n\n          // Iterate through all root children, to detect possible md-toast directives.\n          for (var i = 0; i < templateRoot.children.length; i++) {\n            if (templateRoot.children[i].nodeName === 'MD-TOAST') {\n              var wrapper = angular.element('<div class=\"md-toast-content\">');\n\n              // Wrap the children of the `md-toast` directive in jqLite, to be able to append multiple\n              // nodes with the same execution.\n              wrapper.append(angular.element(templateRoot.children[i].childNodes));\n\n              // Append the new wrapped element to the `md-toast` directive.\n              templateRoot.children[i].appendChild(wrapper[0]);\n            }\n          }\n\n          // We have to return the innerHTMl, because we do not want to have the `md-template` element to be\n          // the root element of our interimElement.\n          return templateRoot.innerHTML;\n        }\n\n        return template || '';\n      }\n    };\n\n    function onShow(scope, element, options) {\n      activeToastContent = options.textContent || options.content; // support deprecated #content method\n\n      var isSmScreen = !$mdMedia('gt-sm');\n\n      element = $mdUtil.extractElementByName(element, 'md-toast', true);\n      options.element = element;\n\n      options.onSwipe = function(ev, gesture) {\n        //Add the relevant swipe class to the element so it can animate correctly\n        var swipe = ev.type.replace('$md.','');\n        var direction = swipe.replace('swipe', '');\n\n        // If the swipe direction is down/up but the toast came from top/bottom don't fade away\n        // Unless the screen is small, then the toast always on bottom\n        if ((direction === 'down' && options.position.indexOf('top') != -1 && !isSmScreen) ||\n            (direction === 'up' && (options.position.indexOf('bottom') != -1 || isSmScreen))) {\n          return;\n        }\n\n        if ((direction === 'left' || direction === 'right') && isSmScreen) {\n          return;\n        }\n\n        element.addClass('md-' + swipe);\n        $mdUtil.nextTick($mdToast.cancel);\n      };\n      options.openClass = toastOpenClass(options.position);\n\n      element.addClass(options.toastClass);\n\n      // 'top left' -> 'md-top md-left'\n      options.parent.addClass(options.openClass);\n\n      // static is the default position\n      if ($mdUtil.hasComputedStyle(options.parent, 'position', 'static')) {\n        options.parent.css('position', 'relative');\n      }\n\n      element.on(SWIPE_EVENTS, options.onSwipe);\n      element.addClass(isSmScreen ? 'md-bottom' : options.position.split(' ').map(function(pos) {\n        return 'md-' + pos;\n      }).join(' '));\n\n      if (options.parent) options.parent.addClass('md-toast-animating');\n      return $animate.enter(element, options.parent).then(function() {\n        if (options.parent) options.parent.removeClass('md-toast-animating');\n      });\n    }\n\n    function onRemove(scope, element, options) {\n      element.off(SWIPE_EVENTS, options.onSwipe);\n      if (options.parent) options.parent.addClass('md-toast-animating');\n      if (options.openClass) options.parent.removeClass(options.openClass);\n\n      return ((options.$destroy == true) ? element.remove() : $animate.leave(element))\n        .then(function () {\n          if (options.parent) options.parent.removeClass('md-toast-animating');\n          if ($mdUtil.hasComputedStyle(options.parent, 'position', 'static')) {\n            options.parent.css('position', '');\n          }\n        });\n    }\n\n    function toastOpenClass(position) {\n      // For mobile, always open full-width on bottom\n      if (!$mdMedia('gt-xs')) {\n        return 'md-toast-open-bottom';\n      }\n\n      return 'md-toast-open-' +\n        (position.indexOf('top') > -1 ? 'top' : 'bottom');\n    }\n  }\n\n}\n\n})();\n(function(){\n\"use strict\";\n\n/**\n * @ngdoc module\n * @name material.components.toolbar\n */\nmdToolbarDirective.$inject = [\"$$rAF\", \"$mdConstant\", \"$mdUtil\", \"$mdTheming\", \"$animate\"];\nangular.module('material.components.toolbar', [\n  'material.core',\n  'material.components.content'\n])\n  .directive('mdToolbar', mdToolbarDirective);\n\n/**\n * @ngdoc directive\n * @name mdToolbar\n * @module material.components.toolbar\n * @restrict E\n * @description\n * `md-toolbar` is used to place a toolbar in your app.\n *\n * Toolbars are usually used above a content area to display the title of the\n * current page, and show relevant action buttons for that page.\n *\n * You can change the height of the toolbar by adding either the\n * `md-medium-tall` or `md-tall` class to the toolbar.\n *\n * @usage\n * <hljs lang=\"html\">\n * <div layout=\"column\" layout-fill>\n *   <md-toolbar>\n *\n *     <div class=\"md-toolbar-tools\">\n *       <h2 md-truncate flex>My App's Title</h2>\n *\n *       <md-button>\n *         Right Bar Button\n *       </md-button>\n *     </div>\n *\n *   </md-toolbar>\n *   <md-content>\n *     Hello!\n *   </md-content>\n * </div>\n * </hljs>\n *\n * <i><b>Note:</b> The code above shows usage with the `md-truncate` component which provides an\n * ellipsis if the title is longer than the width of the Toolbar.</i>\n *\n * ## CSS & Styles\n *\n * The `<md-toolbar>` provides a few custom CSS classes that you may use to enhance the\n * functionality of your toolbar.\n *\n * <div>\n * <docs-css-api-table>\n *\n *   <docs-css-selector code=\"md-toolbar .md-toolbar-tools\">\n *     The `md-toolbar-tools` class provides quite a bit of automatic styling for your toolbar\n *     buttons and text. When applied, it will center the buttons and text vertically for you.\n *   </docs-css-selector>\n *\n * </docs-css-api-table>\n * </div>\n *\n * ### Private Classes\n *\n * Currently, the only private class is the `md-toolbar-transitions` class. All other classes are\n * considered public.\n *\n * @param {boolean=} md-scroll-shrink Whether the header should shrink away as\n * the user scrolls down, and reveal itself as the user scrolls up.\n *\n * _**Note (1):** for scrollShrink to work, the toolbar must be a sibling of a\n * `md-content` element, placed before it. See the scroll shrink demo._\n *\n * _**Note (2):** The `md-scroll-shrink` attribute is only parsed on component\n * initialization, it does not watch for scope changes._\n *\n *\n * @param {number=} md-shrink-speed-factor How much to change the speed of the toolbar's\n * shrinking by. For example, if 0.25 is given then the toolbar will shrink\n * at one fourth the rate at which the user scrolls down. Default 0.5.\n *\n */\n\nfunction mdToolbarDirective($$rAF, $mdConstant, $mdUtil, $mdTheming, $animate) {\n  var translateY = angular.bind(null, $mdUtil.supplant, 'translate3d(0,{0}px,0)');\n\n  return {\n    template: '',\n    restrict: 'E',\n\n    link: function(scope, element, attr) {\n\n      element.addClass('_md');     // private md component indicator for styling\n      $mdTheming(element);\n\n      $mdUtil.nextTick(function () {\n        element.addClass('_md-toolbar-transitions');     // adding toolbar transitions after digest\n      }, false);\n\n      if (angular.isDefined(attr.mdScrollShrink)) {\n        setupScrollShrink();\n      }\n\n      function setupScrollShrink() {\n\n        var toolbarHeight;\n        var contentElement;\n        var disableScrollShrink = angular.noop;\n\n        // Current \"y\" position of scroll\n        // Store the last scroll top position\n        var y = 0;\n        var prevScrollTop = 0;\n        var shrinkSpeedFactor = attr.mdShrinkSpeedFactor || 0.5;\n\n        var debouncedContentScroll = $$rAF.throttle(onContentScroll);\n        var debouncedUpdateHeight = $mdUtil.debounce(updateToolbarHeight, 5 * 1000);\n\n        // Wait for $mdContentLoaded event from mdContent directive.\n        // If the mdContent element is a sibling of our toolbar, hook it up\n        // to scroll events.\n\n        scope.$on('$mdContentLoaded', onMdContentLoad);\n\n        // If the toolbar is used inside an ng-if statement, we may miss the\n        // $mdContentLoaded event, so we attempt to fake it if we have a\n        // md-content close enough.\n\n        attr.$observe('mdScrollShrink', onChangeScrollShrink);\n\n        // If the toolbar has ngShow or ngHide we need to update height immediately as it changed\n        // and not wait for $mdUtil.debounce to happen\n\n        if (attr.ngShow) { scope.$watch(attr.ngShow, updateToolbarHeight); }\n        if (attr.ngHide) { scope.$watch(attr.ngHide, updateToolbarHeight); }\n\n        // If the scope is destroyed (which could happen with ng-if), make sure\n        // to disable scroll shrinking again\n\n        scope.$on('$destroy', disableScrollShrink);\n\n        /**\n         *\n         */\n        function onChangeScrollShrink(shrinkWithScroll) {\n          var closestContent = element.parent().find('md-content');\n\n          // If we have a content element, fake the call; this might still fail\n          // if the content element isn't a sibling of the toolbar\n\n          if (!contentElement && closestContent.length) {\n            onMdContentLoad(null, closestContent);\n          }\n\n          // Evaluate the expression\n          shrinkWithScroll = scope.$eval(shrinkWithScroll);\n\n          // Disable only if the attribute's expression evaluates to false\n          if (shrinkWithScroll === false) {\n            disableScrollShrink();\n          } else {\n            disableScrollShrink = enableScrollShrink();\n          }\n        }\n\n        /**\n         *\n         */\n        function onMdContentLoad($event, newContentEl) {\n          // Toolbar and content must be siblings\n          if (newContentEl && element.parent()[0] === newContentEl.parent()[0]) {\n            // unhook old content event listener if exists\n            if (contentElement) {\n              contentElement.off('scroll', debouncedContentScroll);\n            }\n\n            contentElement = newContentEl;\n            disableScrollShrink = enableScrollShrink();\n          }\n        }\n\n        /**\n         *\n         */\n        function onContentScroll(e) {\n          var scrollTop = e ? e.target.scrollTop : prevScrollTop;\n\n          debouncedUpdateHeight();\n\n          y = Math.min(\n            toolbarHeight / shrinkSpeedFactor,\n            Math.max(0, y + scrollTop - prevScrollTop)\n          );\n\n          element.css($mdConstant.CSS.TRANSFORM, translateY([-y * shrinkSpeedFactor]));\n          contentElement.css($mdConstant.CSS.TRANSFORM, translateY([(toolbarHeight - y) * shrinkSpeedFactor]));\n\n          prevScrollTop = scrollTop;\n\n          $mdUtil.nextTick(function() {\n            var hasWhiteFrame = element.hasClass('md-whiteframe-z1');\n\n            if (hasWhiteFrame && !y) {\n              $animate.removeClass(element, 'md-whiteframe-z1');\n            } else if (!hasWhiteFrame && y) {\n              $animate.addClass(element, 'md-whiteframe-z1');\n            }\n          });\n\n        }\n\n        /**\n         *\n         */\n        function enableScrollShrink() {\n          if (!contentElement)     return angular.noop;           // no md-content\n\n          contentElement.on('scroll', debouncedContentScroll);\n          contentElement.attr('scroll-shrink', 'true');\n\n          $mdUtil.nextTick(updateToolbarHeight, false);\n\n          return function disableScrollShrink() {\n            contentElement.off('scroll', debouncedContentScroll);\n            contentElement.attr('scroll-shrink', 'false');\n\n            updateToolbarHeight();\n          };\n        }\n\n        /**\n         *\n         */\n        function updateToolbarHeight() {\n          toolbarHeight = element.prop('offsetHeight');\n          // Add a negative margin-top the size of the toolbar to the content el.\n          // The content will start transformed down the toolbarHeight amount,\n          // so everything looks normal.\n          //\n          // As the user scrolls down, the content will be transformed up slowly\n          // to put the content underneath where the toolbar was.\n          var margin = (-toolbarHeight * shrinkSpeedFactor) + 'px';\n\n          contentElement.css({\n            \"margin-top\": margin,\n            \"margin-bottom\": margin\n          });\n\n          onContentScroll();\n        }\n\n      }\n\n    }\n  };\n\n}\n\n})();\n(function(){\n\"use strict\";\n\n/**\n * @ngdoc module\n * @name material.components.tooltip\n */\nMdTooltipDirective.$inject = [\"$timeout\", \"$window\", \"$$rAF\", \"$document\", \"$interpolate\", \"$mdUtil\", \"$mdPanel\", \"$$mdTooltipRegistry\"];\nangular\n    .module('material.components.tooltip', [\n      'material.core',\n      'material.components.panel'\n    ])\n    .directive('mdTooltip', MdTooltipDirective)\n    .service('$$mdTooltipRegistry', MdTooltipRegistry);\n\n\n/**\n * @ngdoc directive\n * @name mdTooltip\n * @module material.components.tooltip\n * @description\n * Tooltips are used to describe elements that are interactive and primarily\n * graphical (not textual).\n *\n * Place a `<md-tooltip>` as a child of the element it describes.\n *\n * A tooltip will activate when the user hovers over, focuses, or touches the\n * parent element.\n *\n * @usage\n * <hljs lang=\"html\">\n *   <md-button class=\"md-fab md-accent\" aria-label=\"Play\">\n *     <md-tooltip>Play Music</md-tooltip>\n *     <md-icon md-svg-src=\"img/icons/ic_play_arrow_24px.svg\"></md-icon>\n *   </md-button>\n * </hljs>\n *\n * @param {number=} md-z-index The visual level that the tooltip will appear\n *     in comparison with the rest of the elements of the application.\n * @param {expression=} md-visible Boolean bound to whether the tooltip is\n *     currently visible.\n * @param {number=} md-delay How many milliseconds to wait to show the tooltip\n *     after the user hovers over, focuses, or touches the parent element.\n *     Defaults to 0ms on non-touch devices and 75ms on touch.\n * @param {boolean=} md-autohide If present or provided with a boolean value,\n *     the tooltip will hide on mouse leave, regardless of focus.\n * @param {string=} md-direction The direction that the tooltip is shown,\n *     relative to the parent element. Supports top, right, bottom, and left.\n *     Defaults to bottom.\n */\nfunction MdTooltipDirective($timeout, $window, $$rAF, $document, $interpolate,\n    $mdUtil, $mdPanel, $$mdTooltipRegistry) {\n\n  var ENTER_EVENTS = 'focus touchstart mouseenter';\n  var LEAVE_EVENTS = 'blur touchcancel mouseleave';\n  var TOOLTIP_DEFAULT_Z_INDEX = 100;\n  var TOOLTIP_DEFAULT_SHOW_DELAY = 0;\n  var TOOLTIP_DEFAULT_DIRECTION = 'bottom';\n  var TOOLTIP_DIRECTIONS = {\n    top: { x: $mdPanel.xPosition.CENTER, y: $mdPanel.yPosition.ABOVE },\n    right: { x: $mdPanel.xPosition.OFFSET_END, y: $mdPanel.yPosition.CENTER },\n    bottom: { x: $mdPanel.xPosition.CENTER, y: $mdPanel.yPosition.BELOW },\n    left: { x: $mdPanel.xPosition.OFFSET_START, y: $mdPanel.yPosition.CENTER }\n  };\n\n  return {\n    restrict: 'E',\n    priority: 210, // Before ngAria\n    scope: {\n      mdZIndex: '=?mdZIndex',\n      mdDelay: '=?mdDelay',\n      mdVisible: '=?mdVisible',\n      mdAutohide: '=?mdAutohide',\n      mdDirection: '@?mdDirection' // Do not expect expressions.\n    },\n    link: linkFunc\n  };\n\n  function linkFunc(scope, element, attr) {\n    // Set constants.\n    var tooltipId = 'md-tooltip-' + $mdUtil.nextUid();\n    var parent = $mdUtil.getParentWithPointerEvents(element);\n    var debouncedOnResize = $$rAF.throttle(updatePosition);\n    var mouseActive = false;\n    var origin, position, panelPosition, panelRef, autohide, showTimeout,\n        elementFocusedOnWindowBlur = null;\n\n    // Set defaults\n    setDefaults();\n\n    // Set parent aria-label.\n    addAriaLabel();\n\n    // Remove the element from its current DOM position.\n    element.detach();\n\n    updatePosition();\n    bindEvents();\n    configureWatchers();\n\n    function setDefaults() {\n      scope.mdZIndex = scope.mdZIndex || TOOLTIP_DEFAULT_Z_INDEX;\n      scope.mdDelay = scope.mdDelay || TOOLTIP_DEFAULT_SHOW_DELAY;\n      if (!TOOLTIP_DIRECTIONS[scope.mdDirection]) {\n        scope.mdDirection = TOOLTIP_DEFAULT_DIRECTION;\n      }\n    }\n\n    function addAriaLabel(labelText) {\n      // Only interpolate the text from the HTML element because otherwise the custom text could\n      // be interpolated twice and cause XSS violations.\n      var interpolatedText = labelText || $interpolate(element.text().trim())(scope.$parent);\n\n      // Only add the `aria-label` to the parent if there isn't already one, if there isn't an\n      // already present `aria-labelledby`, or if the previous `aria-label` was added by the\n      // tooltip directive.\n      if (\n        (!parent.attr('aria-label') && !parent.attr('aria-labelledby')) ||\n        parent.attr('md-labeled-by-tooltip')\n      ) {\n        parent.attr('aria-label', interpolatedText);\n\n        // Set the `md-labeled-by-tooltip` attribute if it has not already been set.\n        if (!parent.attr('md-labeled-by-tooltip')) {\n          parent.attr('md-labeled-by-tooltip', tooltipId);\n        }\n      }\n    }\n\n    function updatePosition() {\n      setDefaults();\n\n      // If the panel has already been created, remove the current origin\n      // class from the panel element.\n      if (panelRef && panelRef.panelEl) {\n        panelRef.panelEl.removeClass(origin);\n      }\n\n      // Set the panel element origin class based off of the current\n      // mdDirection.\n      origin = 'md-origin-' + scope.mdDirection;\n\n      // Create the position of the panel based off of the mdDirection.\n      position = TOOLTIP_DIRECTIONS[scope.mdDirection];\n\n      // Using the newly created position object, use the MdPanel\n      // panelPosition API to build the panel's position.\n      panelPosition = $mdPanel.newPanelPosition()\n          .relativeTo(parent)\n          .addPanelPosition(position.x, position.y);\n\n      // If the panel has already been created, add the new origin class to\n      // the panel element and update it's position with the panelPosition.\n      if (panelRef && panelRef.panelEl) {\n        panelRef.panelEl.addClass(origin);\n        panelRef.updatePosition(panelPosition);\n      }\n    }\n\n    function bindEvents() {\n      // Add a mutationObserver where there is support for it and the need\n      // for it in the form of viable host(parent[0]).\n      if (parent[0] && 'MutationObserver' in $window) {\n        // Use a mutationObserver to tackle #2602.\n        var attributeObserver = new MutationObserver(function(mutations) {\n          if (isDisabledMutation(mutations)) {\n            $mdUtil.nextTick(function() {\n              setVisible(false);\n            });\n          }\n        });\n\n        attributeObserver.observe(parent[0], {\n          attributes: true\n        });\n      }\n\n      elementFocusedOnWindowBlur = false;\n\n      $$mdTooltipRegistry.register('scroll', windowScrollEventHandler, true);\n      $$mdTooltipRegistry.register('blur', windowBlurEventHandler);\n      $$mdTooltipRegistry.register('resize', debouncedOnResize);\n\n      scope.$on('$destroy', onDestroy);\n\n      // To avoid 'synthetic clicks', we listen to mousedown instead of\n      // 'click'.\n      parent.on('mousedown', mousedownEventHandler);\n      parent.on(ENTER_EVENTS, enterEventHandler);\n\n      function isDisabledMutation(mutations) {\n        mutations.some(function(mutation) {\n          return mutation.attributeName === 'disabled' && parent[0].disabled;\n        });\n        return false;\n      }\n\n      function windowScrollEventHandler() {\n        setVisible(false);\n      }\n\n      function windowBlurEventHandler() {\n        elementFocusedOnWindowBlur = document.activeElement === parent[0];\n      }\n\n      function enterEventHandler($event) {\n        // Prevent the tooltip from showing when the window is receiving\n        // focus.\n        if ($event.type === 'focus' && elementFocusedOnWindowBlur) {\n          elementFocusedOnWindowBlur = false;\n        } else if (!scope.mdVisible) {\n          parent.on(LEAVE_EVENTS, leaveEventHandler);\n          setVisible(true);\n\n          // If the user is on a touch device, we should bind the tap away\n          // after the 'touched' in order to prevent the tooltip being\n          // removed immediately.\n          if ($event.type === 'touchstart') {\n            parent.one('touchend', function() {\n              $mdUtil.nextTick(function() {\n                $document.one('touchend', leaveEventHandler);\n              }, false);\n            });\n          }\n        }\n      }\n\n      function leaveEventHandler() {\n        autohide = scope.hasOwnProperty('mdAutohide') ?\n            scope.mdAutohide :\n            attr.hasOwnProperty('mdAutohide');\n\n        if (autohide || mouseActive ||\n            $document[0].activeElement !== parent[0]) {\n          // When a show timeout is currently in progress, then we have\n          // to cancel it, otherwise the tooltip will remain showing\n          // without focus or hover.\n          if (showTimeout) {\n            $timeout.cancel(showTimeout);\n            setVisible.queued = false;\n            showTimeout = null;\n          }\n\n          parent.off(LEAVE_EVENTS, leaveEventHandler);\n          parent.triggerHandler('blur');\n          setVisible(false);\n        }\n        mouseActive = false;\n      }\n\n      function mousedownEventHandler() {\n        mouseActive = true;\n      }\n\n      function onDestroy() {\n        $$mdTooltipRegistry.deregister('scroll', windowScrollEventHandler, true);\n        $$mdTooltipRegistry.deregister('blur', windowBlurEventHandler);\n        $$mdTooltipRegistry.deregister('resize', debouncedOnResize);\n\n        parent\n            .off(ENTER_EVENTS, enterEventHandler)\n            .off(LEAVE_EVENTS, leaveEventHandler)\n            .off('mousedown', mousedownEventHandler);\n\n        // Trigger the handler in case any of the tooltips are\n        // still visible.\n        leaveEventHandler();\n        attributeObserver && attributeObserver.disconnect();\n      }\n    }\n\n    function configureWatchers() {\n      if (element[0] && 'MutationObserver' in $window) {\n        var attributeObserver = new MutationObserver(function(mutations) {\n          mutations.forEach(function(mutation) {\n            if (mutation.attributeName === 'md-visible' &&\n                !scope.visibleWatcher ) {\n              scope.visibleWatcher = scope.$watch('mdVisible',\n                  onVisibleChanged);\n            }\n          });\n        });\n\n        attributeObserver.observe(element[0], {\n          attributes: true\n        });\n\n        // Build watcher only if mdVisible is being used.\n        if (attr.hasOwnProperty('mdVisible')) {\n          scope.visibleWatcher = scope.$watch('mdVisible',\n              onVisibleChanged);\n        }\n      } else {\n        // MutationObserver not supported\n        scope.visibleWatcher = scope.$watch('mdVisible', onVisibleChanged);\n      }\n\n      // Direction watcher\n      scope.$watch('mdDirection', updatePosition);\n\n      // Clean up if the element or parent was removed via jqLite's .remove.\n      // A couple of notes:\n      //   - In these cases the scope might not have been destroyed, which\n      //     is why we destroy it manually. An example of this can be having\n      //     `md-visible=\"false\"` and adding tooltips while they're\n      //     invisible. If `md-visible` becomes true, at some point, you'd\n      //     usually get a lot of tooltips.\n      //   - We use `.one`, not `.on`, because this only needs to fire once.\n      //     If we were using `.on`, it would get thrown into an infinite\n      //     loop.\n      //   - This kicks off the scope's `$destroy` event which finishes the\n      //     cleanup.\n      element.one('$destroy', onElementDestroy);\n      parent.one('$destroy', onElementDestroy);\n      scope.$on('$destroy', function() {\n        setVisible(false);\n        panelRef && panelRef.destroy();\n        attributeObserver && attributeObserver.disconnect();\n        element.remove();\n      });\n\n      // Updates the aria-label when the element text changes. This watch\n      // doesn't need to be set up if the element doesn't have any data\n      // bindings.\n      if (element.text().indexOf($interpolate.startSymbol()) > -1) {\n        scope.$watch(function() {\n          return element.text().trim();\n        }, addAriaLabel);\n      }\n\n      function onElementDestroy() {\n        scope.$destroy();\n      }\n    }\n\n    function setVisible(value) {\n      // Break if passed value is already in queue or there is no queue and\n      // passed value is current in the controller.\n      if (setVisible.queued && setVisible.value === !!value ||\n          !setVisible.queued && scope.mdVisible === !!value) {\n        return;\n      }\n      setVisible.value = !!value;\n\n      if (!setVisible.queued) {\n        if (value) {\n          setVisible.queued = true;\n          showTimeout = $timeout(function() {\n            scope.mdVisible = setVisible.value;\n            setVisible.queued = false;\n            showTimeout = null;\n            if (!scope.visibleWatcher) {\n              onVisibleChanged(scope.mdVisible);\n            }\n          }, scope.mdDelay);\n        } else {\n          $mdUtil.nextTick(function() {\n            scope.mdVisible = false;\n            if (!scope.visibleWatcher) {\n              onVisibleChanged(false);\n            }\n          });\n        }\n      }\n    }\n\n    function onVisibleChanged(isVisible) {\n      isVisible ? showTooltip() : hideTooltip();\n    }\n\n    function showTooltip() {\n      // Do not show the tooltip if the text is empty.\n      if (!element[0].textContent.trim()) {\n        throw new Error('Text for the tooltip has not been provided. ' +\n            'Please include text within the mdTooltip element.');\n      }\n\n      if (!panelRef) {\n        var attachTo = angular.element(document.body);\n        var panelAnimation = $mdPanel.newPanelAnimation()\n            .openFrom(parent)\n            .closeTo(parent)\n            .withAnimation({\n              open: 'md-show',\n              close: 'md-hide'\n            });\n\n        var panelConfig = {\n          id: tooltipId,\n          attachTo: attachTo,\n          contentElement: element,\n          propagateContainerEvents: true,\n          panelClass: 'md-tooltip ' + origin,\n          animation: panelAnimation,\n          position: panelPosition,\n          zIndex: scope.mdZIndex,\n          focusOnOpen: false\n        };\n\n        panelRef = $mdPanel.create(panelConfig);\n      }\n\n      panelRef.open().then(function() {\n        panelRef.panelEl.attr('role', 'tooltip');\n      });\n    }\n\n    function hideTooltip() {\n      panelRef && panelRef.close();\n    }\n  }\n\n}\n\n\n/**\n * Service that is used to reduce the amount of listeners that are being\n * registered on the `window` by the tooltip component. Works by collecting\n * the individual event handlers and dispatching them from a global handler.\n *\n * @ngInject\n */\nfunction MdTooltipRegistry() {\n  var listeners = {};\n  var ngWindow = angular.element(window);\n\n  return {\n    register: register,\n    deregister: deregister\n  };\n\n  /**\n   * Global event handler that dispatches the registered handlers in the\n   * service.\n   * @param {!Event} event Event object passed in by the browser\n   */\n  function globalEventHandler(event) {\n    if (listeners[event.type]) {\n      listeners[event.type].forEach(function(currentHandler) {\n        currentHandler.call(this, event);\n      }, this);\n    }\n  }\n\n  /**\n   * Registers a new handler with the service.\n   * @param {string} type Type of event to be registered.\n   * @param {!Function} handler Event handler.\n   * @param {boolean} useCapture Whether to use event capturing.\n   */\n  function register(type, handler, useCapture) {\n    var handlers = listeners[type] = listeners[type] || [];\n\n    if (!handlers.length) {\n      useCapture ? window.addEventListener(type, globalEventHandler, true) :\n          ngWindow.on(type, globalEventHandler);\n    }\n\n    if (handlers.indexOf(handler) === -1) {\n      handlers.push(handler);\n    }\n  }\n\n  /**\n   * Removes an event handler from the service.\n   * @param {string} type Type of event handler.\n   * @param {!Function} handler The event handler itself.\n   * @param {boolean} useCapture Whether the event handler used event capturing.\n   */\n  function deregister(type, handler, useCapture) {\n    var handlers = listeners[type];\n    var index = handlers ? handlers.indexOf(handler) : -1;\n\n    if (index > -1) {\n      handlers.splice(index, 1);\n\n      if (handlers.length === 0) {\n        useCapture ? window.removeEventListener(type, globalEventHandler, true) :\n            ngWindow.off(type, globalEventHandler);\n      }\n    }\n  }\n}\n\n})();\n(function(){\n\"use strict\";\n\n/**\n * @ngdoc module\n * @name material.components.truncate\n */\nMdTruncateController.$inject = [\"$element\"];\nangular.module('material.components.truncate', ['material.core'])\n  .directive('mdTruncate', MdTruncateDirective);\n\n/**\n * @ngdoc directive\n * @name mdTruncate\n * @module material.components.truncate\n * @restrict AE\n * @description\n *\n * The `md-truncate` component displays a label that will automatically clip text which is wider\n * than the component. By default, it displays an ellipsis, but you may apply the `md-clip` CSS\n * class to override this default and use a standard \"clipping\" approach.\n *\n * <i><b>Note:</b> The `md-truncate` component does not automatically adjust it's width. You must\n * provide the `flex` attribute, or some other CSS-based width management. See the\n * <a ng-href=\"./demo/truncate\">demos</a> for examples.</i>\n *\n * @usage\n *\n * ### As an Element\n *\n * <hljs lang=\"html\">\n *   <div layout=\"row\">\n *     <md-button>Back</md-button>\n *\n *     <md-truncate flex>Chapter 1 - The Way of the Old West</md-truncate>\n *\n *     <md-button>Forward</md-button>\n *   </div>\n * </hljs>\n *\n * ### As an Attribute\n *\n * <hljs lang=\"html\">\n *   <h2 md-truncate style=\"max-width: 100px;\">Some Title With a Lot of Text</h2>\n * </hljs>\n *\n * ## CSS & Styles\n *\n * `<md-truncate>` provides two CSS classes that you may use to control the type of clipping.\n *\n * <i><b>Note:</b> The `md-truncate` also applies a setting of `width: 0;` when used with the `flex`\n * attribute to fix an issue with the flex element not shrinking properly.</i>\n *\n * <div>\n * <docs-css-api-table>\n *\n *   <docs-css-selector code=\".md-ellipsis\">\n *     Assigns the \"ellipsis\" behavior (default) which will cut off mid-word and append an ellipsis\n *     (&hellip;) to the end of the text.\n *   </docs-css-selector>\n *\n *   <docs-css-selector code=\".md-clip\">\n *     Assigns the \"clipping\" behavior which will simply chop off the text. This may happen\n *     mid-word or even mid-character.\n *   </docs-css-selector>\n *\n * </docs-css-api-table>\n * </div>\n */\nfunction MdTruncateDirective() {\n  return {\n    restrict: 'AE',\n\n    controller: MdTruncateController,\n    controllerAs: '$ctrl',\n    bindToController: true\n  }\n}\n\n/**\n * Controller for the <md-truncate> component.\n *\n * @param $element The md-truncate element.\n *\n * @constructor\n * @ngInject\n */\nfunction MdTruncateController($element) {\n  $element.addClass('md-truncate');\n}\n\n})();\n(function(){\n\"use strict\";\n\n/**\n * @ngdoc module\n * @name material.components.virtualRepeat\n */\nVirtualRepeatContainerController.$inject = [\"$$rAF\", \"$mdUtil\", \"$mdConstant\", \"$parse\", \"$rootScope\", \"$window\", \"$scope\", \"$element\", \"$attrs\"];\nVirtualRepeatController.$inject = [\"$scope\", \"$element\", \"$attrs\", \"$browser\", \"$document\", \"$rootScope\", \"$$rAF\", \"$mdUtil\"];\nVirtualRepeatDirective.$inject = [\"$parse\"];\nangular.module('material.components.virtualRepeat', [\n  'material.core',\n  'material.components.showHide'\n])\n.directive('mdVirtualRepeatContainer', VirtualRepeatContainerDirective)\n.directive('mdVirtualRepeat', VirtualRepeatDirective);\n\n\n/**\n * @ngdoc directive\n * @name mdVirtualRepeatContainer\n * @module material.components.virtualRepeat\n * @restrict E\n * @description\n * `md-virtual-repeat-container` provides the scroll container for md-virtual-repeat.\n *\n * VirtualRepeat is a limited substitute for ng-repeat that renders only\n * enough DOM nodes to fill the container and recycling them as the user scrolls.\n *\n * Once an element is not visible anymore, the VirtualRepeat recycles it and will reuse it for\n * another visible item by replacing the previous dataset with the new one.\n *\n * ### Common Issues\n *\n * - When having one-time bindings inside of the view template, the VirtualRepeat will not properly\n *   update the bindings for new items, since the view will be recycled.\n *\n * - Directives inside of a VirtualRepeat will be only compiled (linked) once, because those\n *   are will be recycled items and used for other items.\n *   The VirtualRepeat just updates the scope bindings.\n *\n *\n * ### Notes\n *\n * > The VirtualRepeat is a similar implementation to the Android\n * [RecyclerView](https://developer.android.com/reference/android/support/v7/widget/RecyclerView.html)\n *\n * <!-- This comment forces a break between blockquotes //-->\n *\n * > Please also review the <a ng-href=\"api/directive/mdVirtualRepeat\">VirtualRepeat</a>\n * documentation for more information.\n *\n *\n * @usage\n * <hljs lang=\"html\">\n *\n * <md-virtual-repeat-container md-top-index=\"topIndex\">\n *   <div md-virtual-repeat=\"i in items\" md-item-size=\"20\">Hello {{i}}!</div>\n * </md-virtual-repeat-container>\n * </hljs>\n *\n * @param {number=} md-top-index Binds the index of the item that is at the top of the scroll\n *     container to $scope. It can both read and set the scroll position.\n * @param {boolean=} md-orient-horizontal Whether the container should scroll horizontally\n *     (defaults to orientation and scrolling vertically).\n * @param {boolean=} md-auto-shrink When present, the container will shrink to fit\n *     the number of items when that number is less than its original size.\n * @param {number=} md-auto-shrink-min Minimum number of items that md-auto-shrink\n *     will shrink to (default: 0).\n */\nfunction VirtualRepeatContainerDirective() {\n  return {\n    controller: VirtualRepeatContainerController,\n    template: virtualRepeatContainerTemplate,\n    compile: function virtualRepeatContainerCompile($element, $attrs) {\n      $element\n          .addClass('md-virtual-repeat-container')\n          .addClass($attrs.hasOwnProperty('mdOrientHorizontal')\n              ? 'md-orient-horizontal'\n              : 'md-orient-vertical');\n    }\n  };\n}\n\n\nfunction virtualRepeatContainerTemplate($element) {\n  return '<div class=\"md-virtual-repeat-scroller\">' +\n    '<div class=\"md-virtual-repeat-sizer\"></div>' +\n    '<div class=\"md-virtual-repeat-offsetter\">' +\n      $element[0].innerHTML +\n    '</div></div>';\n}\n\n/**\n * Number of additional elements to render above and below the visible area inside\n * of the virtual repeat container. A higher number results in less flicker when scrolling\n * very quickly in Safari, but comes with a higher rendering and dirty-checking cost.\n * @const {number}\n */\nvar NUM_EXTRA = 3;\n\n/** @ngInject */\nfunction VirtualRepeatContainerController($$rAF, $mdUtil, $mdConstant, $parse, $rootScope, $window, $scope,\n                                          $element, $attrs) {\n  this.$rootScope = $rootScope;\n  this.$scope = $scope;\n  this.$element = $element;\n  this.$attrs = $attrs;\n\n  /** @type {number} The width or height of the container */\n  this.size = 0;\n  /** @type {number} The scroll width or height of the scroller */\n  this.scrollSize = 0;\n  /** @type {number} The scrollLeft or scrollTop of the scroller */\n  this.scrollOffset = 0;\n  /** @type {boolean} Whether the scroller is oriented horizontally */\n  this.horizontal = this.$attrs.hasOwnProperty('mdOrientHorizontal');\n  /** @type {!VirtualRepeatController} The repeater inside of this container */\n  this.repeater = null;\n  /** @type {boolean} Whether auto-shrink is enabled */\n  this.autoShrink = this.$attrs.hasOwnProperty('mdAutoShrink');\n  /** @type {number} Minimum number of items to auto-shrink to */\n  this.autoShrinkMin = parseInt(this.$attrs.mdAutoShrinkMin, 10) || 0;\n  /** @type {?number} Original container size when shrank */\n  this.originalSize = null;\n  /** @type {number} Amount to offset the total scroll size by. */\n  this.offsetSize = parseInt(this.$attrs.mdOffsetSize, 10) || 0;\n  /** @type {?string} height or width element style on the container prior to auto-shrinking. */\n  this.oldElementSize = null;\n  /** @type {!number} Maximum amount of pixels allowed for a single DOM element */\n  this.maxElementPixels = $mdConstant.ELEMENT_MAX_PIXELS;\n\n  if (this.$attrs.mdTopIndex) {\n    /** @type {function(angular.Scope): number} Binds to topIndex on AngularJS scope */\n    this.bindTopIndex = $parse(this.$attrs.mdTopIndex);\n    /** @type {number} The index of the item that is at the top of the scroll container */\n    this.topIndex = this.bindTopIndex(this.$scope);\n\n    if (!angular.isDefined(this.topIndex)) {\n      this.topIndex = 0;\n      this.bindTopIndex.assign(this.$scope, 0);\n    }\n\n    this.$scope.$watch(this.bindTopIndex, angular.bind(this, function(newIndex) {\n      if (newIndex !== this.topIndex) {\n        this.scrollToIndex(newIndex);\n      }\n    }));\n  } else {\n    this.topIndex = 0;\n  }\n\n  this.scroller = $element[0].querySelector('.md-virtual-repeat-scroller');\n  this.sizer = this.scroller.querySelector('.md-virtual-repeat-sizer');\n  this.offsetter = this.scroller.querySelector('.md-virtual-repeat-offsetter');\n\n  // After the dom stablizes, measure the initial size of the container and\n  // make a best effort at re-measuring as it changes.\n  var boundUpdateSize = angular.bind(this, this.updateSize);\n\n  $$rAF(angular.bind(this, function() {\n    boundUpdateSize();\n\n    var debouncedUpdateSize = $mdUtil.debounce(boundUpdateSize, 10, null, false);\n    var jWindow = angular.element($window);\n\n    // Make one more attempt to get the size if it is 0.\n    // This is not by any means a perfect approach, but there's really no\n    // silver bullet here.\n    if (!this.size) {\n      debouncedUpdateSize();\n    }\n\n    jWindow.on('resize', debouncedUpdateSize);\n    $scope.$on('$destroy', function() {\n      jWindow.off('resize', debouncedUpdateSize);\n    });\n\n    $scope.$emit('$md-resize-enable');\n    $scope.$on('$md-resize', boundUpdateSize);\n  }));\n}\n\n\n/** Called by the md-virtual-repeat inside of the container at startup. */\nVirtualRepeatContainerController.prototype.register = function(repeaterCtrl) {\n  this.repeater = repeaterCtrl;\n\n  angular.element(this.scroller)\n      .on('scroll wheel touchmove touchend', angular.bind(this, this.handleScroll_));\n};\n\n\n/** @return {boolean} Whether the container is configured for horizontal scrolling. */\nVirtualRepeatContainerController.prototype.isHorizontal = function() {\n  return this.horizontal;\n};\n\n\n/** @return {number} The size (width or height) of the container. */\nVirtualRepeatContainerController.prototype.getSize = function() {\n  return this.size;\n};\n\n\n/**\n * Resizes the container.\n * @private\n * @param {number} size The new size to set.\n */\nVirtualRepeatContainerController.prototype.setSize_ = function(size) {\n  var dimension = this.getDimensionName_();\n\n  this.size = size;\n  this.$element[0].style[dimension] = size + 'px';\n};\n\n\nVirtualRepeatContainerController.prototype.unsetSize_ = function() {\n  this.$element[0].style[this.getDimensionName_()] = this.oldElementSize;\n  this.oldElementSize = null;\n};\n\n\n/** Instructs the container to re-measure its size. */\nVirtualRepeatContainerController.prototype.updateSize = function() {\n  // If the original size is already determined, we can skip the update.\n  if (this.originalSize) return;\n\n  this.size = this.isHorizontal()\n      ? this.$element[0].clientWidth\n      : this.$element[0].clientHeight;\n\n  // Recheck the scroll position after updating the size. This resolves\n  // problems that can result if the scroll position was measured while the\n  // element was display: none or detached from the document.\n  this.handleScroll_();\n\n  this.repeater && this.repeater.containerUpdated();\n};\n\n\n/** @return {number} The container's scrollHeight or scrollWidth. */\nVirtualRepeatContainerController.prototype.getScrollSize = function() {\n  return this.scrollSize;\n};\n\n\nVirtualRepeatContainerController.prototype.getDimensionName_ = function() {\n  return this.isHorizontal() ? 'width' : 'height';\n};\n\n\n/**\n * Sets the scroller element to the specified size.\n * @private\n * @param {number} size The new size.\n */\nVirtualRepeatContainerController.prototype.sizeScroller_ = function(size) {\n  var dimension =  this.getDimensionName_();\n  var crossDimension = this.isHorizontal() ? 'height' : 'width';\n\n  // Clear any existing dimensions.\n  this.sizer.innerHTML = '';\n\n  // If the size falls within the browser's maximum explicit size for a single element, we can\n  // set the size and be done. Otherwise, we have to create children that add up the the desired\n  // size.\n  if (size < this.maxElementPixels) {\n    this.sizer.style[dimension] = size + 'px';\n  } else {\n    this.sizer.style[dimension] = 'auto';\n    this.sizer.style[crossDimension] = 'auto';\n\n    // Divide the total size we have to render into N max-size pieces.\n    var numChildren = Math.floor(size / this.maxElementPixels);\n\n    // Element template to clone for each max-size piece.\n    var sizerChild = document.createElement('div');\n    sizerChild.style[dimension] = this.maxElementPixels + 'px';\n    sizerChild.style[crossDimension] = '1px';\n\n    for (var i = 0; i < numChildren; i++) {\n      this.sizer.appendChild(sizerChild.cloneNode(false));\n    }\n\n    // Re-use the element template for the remainder.\n    sizerChild.style[dimension] = (size - (numChildren * this.maxElementPixels)) + 'px';\n    this.sizer.appendChild(sizerChild);\n  }\n};\n\n\n/**\n * If auto-shrinking is enabled, shrinks or unshrinks as appropriate.\n * @private\n * @param {number} size The new size.\n */\nVirtualRepeatContainerController.prototype.autoShrink_ = function(size) {\n  var shrinkSize = Math.max(size, this.autoShrinkMin * this.repeater.getItemSize());\n\n  if (this.autoShrink && shrinkSize !== this.size) {\n    if (this.oldElementSize === null) {\n      this.oldElementSize = this.$element[0].style[this.getDimensionName_()];\n    }\n\n    var currentSize = this.originalSize || this.size;\n\n    if (!currentSize || shrinkSize < currentSize) {\n      if (!this.originalSize) {\n        this.originalSize = this.size;\n      }\n\n      // Now we update the containers size, because shrinking is enabled.\n      this.setSize_(shrinkSize);\n    } else if (this.originalSize !== null) {\n      // Set the size back to our initial size.\n      this.unsetSize_();\n\n      var _originalSize = this.originalSize;\n      this.originalSize = null;\n\n      // We determine the repeaters size again, if the original size was zero.\n      // The originalSize needs to be null, to be able to determine the size.\n      if (!_originalSize) this.updateSize();\n\n      // Apply the original size or the determined size back to the container, because\n      // it has been overwritten before, in the shrink block.\n      this.setSize_(_originalSize || this.size);\n    }\n\n    this.repeater.containerUpdated();\n  }\n};\n\n\n/**\n * Sets the scrollHeight or scrollWidth. Called by the repeater based on\n * its item count and item size.\n * @param {number} itemsSize The total size of the items.\n */\nVirtualRepeatContainerController.prototype.setScrollSize = function(itemsSize) {\n  var size = itemsSize + this.offsetSize;\n  if (this.scrollSize === size) return;\n\n  this.sizeScroller_(size);\n  this.autoShrink_(size);\n  this.scrollSize = size;\n};\n\n\n/** @return {number} The container's current scroll offset. */\nVirtualRepeatContainerController.prototype.getScrollOffset = function() {\n  return this.scrollOffset;\n};\n\n/**\n * Scrolls to a given scrollTop position.\n * @param {number} position\n */\nVirtualRepeatContainerController.prototype.scrollTo = function(position) {\n  this.scroller[this.isHorizontal() ? 'scrollLeft' : 'scrollTop'] = position;\n  this.handleScroll_();\n};\n\n/**\n * Scrolls the item with the given index to the top of the scroll container.\n * @param {number} index\n */\nVirtualRepeatContainerController.prototype.scrollToIndex = function(index) {\n  var itemSize = this.repeater.getItemSize();\n  var itemsLength = this.repeater.itemsLength;\n  if(index > itemsLength) {\n    index = itemsLength - 1;\n  }\n  this.scrollTo(itemSize * index);\n};\n\nVirtualRepeatContainerController.prototype.resetScroll = function() {\n  this.scrollTo(0);\n};\n\n\nVirtualRepeatContainerController.prototype.handleScroll_ = function() {\n  var ltr = document.dir != 'rtl' && document.body.dir != 'rtl';\n  if(!ltr && !this.maxSize) {\n    this.scroller.scrollLeft = this.scrollSize;\n    this.maxSize = this.scroller.scrollLeft;\n  }\n  var offset = this.isHorizontal() ?\n      (ltr?this.scroller.scrollLeft : this.maxSize - this.scroller.scrollLeft)\n      : this.scroller.scrollTop;\n  if (offset === this.scrollOffset || offset > this.scrollSize - this.size) return;\n\n  var itemSize = this.repeater.getItemSize();\n  if (!itemSize) return;\n\n  var numItems = Math.max(0, Math.floor(offset / itemSize) - NUM_EXTRA);\n\n  var transform = (this.isHorizontal() ? 'translateX(' : 'translateY(') +\n      (!this.isHorizontal() || ltr ? (numItems * itemSize) : - (numItems * itemSize))  + 'px)';\n\n  this.scrollOffset = offset;\n  this.offsetter.style.webkitTransform = transform;\n  this.offsetter.style.transform = transform;\n\n  if (this.bindTopIndex) {\n    var topIndex = Math.floor(offset / itemSize);\n    if (topIndex !== this.topIndex && topIndex < this.repeater.getItemCount()) {\n      this.topIndex = topIndex;\n      this.bindTopIndex.assign(this.$scope, topIndex);\n      if (!this.$rootScope.$$phase) this.$scope.$digest();\n    }\n  }\n\n  this.repeater.containerUpdated();\n};\n\n\n/**\n * @ngdoc directive\n * @name mdVirtualRepeat\n * @module material.components.virtualRepeat\n * @restrict A\n * @priority 1000\n * @description\n * `md-virtual-repeat` specifies an element to repeat using virtual scrolling.\n *\n * Virtual repeat is a limited substitute for ng-repeat that renders only\n * enough DOM nodes to fill the container and recycling them as the user scrolls.\n *\n * Arrays, but not objects are supported for iteration.\n * Track by, as alias, and (key, value) syntax are not supported.\n *\n * ### On-Demand Async Item Loading\n *\n * When using the `md-on-demand` attribute and loading some asynchronous data, the `getItemAtIndex` function will\n * mostly return nothing.\n *\n * <hljs lang=\"js\">\n *   DynamicItems.prototype.getItemAtIndex = function(index) {\n *     if (this.pages[index]) {\n *       return this.pages[index];\n *     } else {\n *       // This is an asynchronous action and does not return any value.\n *       this.loadPage(index);\n *     }\n *   };\n * </hljs>\n *\n * This means that the VirtualRepeat will not have any value for the given index.<br/>\n * After the data loading completed, the user expects the VirtualRepeat to recognize the change.\n *\n * To make sure that the VirtualRepeat properly detects any change, you need to run the operation\n * in another digest.\n *\n * <hljs lang=\"js\">\n *   DynamicItems.prototype.loadPage = function(index) {\n *     var self = this;\n *\n *     // Trigger a new digest by using $timeout\n *     $timeout(function() {\n *       self.pages[index] = Data;\n *     });\n *   };\n * </hljs>\n *\n * > <b>Note:</b> Please also review the\n *   <a ng-href=\"api/directive/mdVirtualRepeatContainer\">VirtualRepeatContainer</a> documentation\n *   for more information.\n *\n * @usage\n * <hljs lang=\"html\">\n * <md-virtual-repeat-container>\n *   <div md-virtual-repeat=\"i in items\">Hello {{i}}!</div>\n * </md-virtual-repeat-container>\n *\n * <md-virtual-repeat-container md-orient-horizontal>\n *   <div md-virtual-repeat=\"i in items\" md-item-size=\"20\">Hello {{i}}!</div>\n * </md-virtual-repeat-container>\n * </hljs>\n *\n * @param {number=} md-item-size The height or width of the repeated elements (which must be\n *   identical for each element). Optional. Will attempt to read the size from the dom if missing,\n *   but still assumes that all repeated nodes have same height or width.\n * @param {string=} md-extra-name Evaluates to an additional name to which the current iterated item\n *   can be assigned on the repeated scope (needed for use in `md-autocomplete`).\n * @param {boolean=} md-on-demand When present, treats the md-virtual-repeat argument as an object\n *   that can fetch rows rather than an array.\n *\n *   **NOTE:** This object must implement the following interface with two (2) methods:\n *\n *   - `getItemAtIndex: function(index) [object]` The item at that index or null if it is not yet\n *     loaded (it should start downloading the item in that case).\n *   - `getLength: function() [number]` The data length to which the repeater container\n *     should be sized. Ideally, when the count is known, this method should return it.\n *     Otherwise, return a higher number than the currently loaded items to produce an\n *     infinite-scroll behavior.\n */\nfunction VirtualRepeatDirective($parse) {\n  return {\n    controller: VirtualRepeatController,\n    priority: 1000,\n    require: ['mdVirtualRepeat', '^^mdVirtualRepeatContainer'],\n    restrict: 'A',\n    terminal: true,\n    transclude: 'element',\n    compile: function VirtualRepeatCompile($element, $attrs) {\n      var expression = $attrs.mdVirtualRepeat;\n      var match = expression.match(/^\\s*([\\s\\S]+?)\\s+in\\s+([\\s\\S]+?)\\s*$/);\n      var repeatName = match[1];\n      var repeatListExpression = $parse(match[2]);\n      var extraName = $attrs.mdExtraName && $parse($attrs.mdExtraName);\n\n      return function VirtualRepeatLink($scope, $element, $attrs, ctrl, $transclude) {\n        ctrl[0].link_(ctrl[1], $transclude, repeatName, repeatListExpression, extraName);\n      };\n    }\n  };\n}\n\n\n/** @ngInject */\nfunction VirtualRepeatController($scope, $element, $attrs, $browser, $document, $rootScope,\n    $$rAF, $mdUtil) {\n  this.$scope = $scope;\n  this.$element = $element;\n  this.$attrs = $attrs;\n  this.$browser = $browser;\n  this.$document = $document;\n  this.$rootScope = $rootScope;\n  this.$$rAF = $$rAF;\n\n  /** @type {boolean} Whether we are in on-demand mode. */\n  this.onDemand = $mdUtil.parseAttributeBoolean($attrs.mdOnDemand);\n  /** @type {!Function} Backup reference to $browser.$$checkUrlChange */\n  this.browserCheckUrlChange = $browser.$$checkUrlChange;\n  /** @type {number} Most recent starting repeat index (based on scroll offset) */\n  this.newStartIndex = 0;\n  /** @type {number} Most recent ending repeat index (based on scroll offset) */\n  this.newEndIndex = 0;\n  /** @type {number} Most recent end visible index (based on scroll offset) */\n  this.newVisibleEnd = 0;\n  /** @type {number} Previous starting repeat index (based on scroll offset) */\n  this.startIndex = 0;\n  /** @type {number} Previous ending repeat index (based on scroll offset) */\n  this.endIndex = 0;\n  // TODO: measure width/height of first element from dom if not provided.\n  // getComputedStyle?\n  /** @type {?number} Height/width of repeated elements. */\n  this.itemSize = $scope.$eval($attrs.mdItemSize) || null;\n\n  /** @type {boolean} Whether this is the first time that items are rendered. */\n  this.isFirstRender = true;\n\n  /**\n   * @private {boolean} Whether the items in the list are already being updated. Used to prevent\n   *     nested calls to virtualRepeatUpdate_.\n   */\n  this.isVirtualRepeatUpdating_ = false;\n\n  /** @type {number} Most recently seen length of items. */\n  this.itemsLength = 0;\n\n  /**\n   * @type {!Function} Unwatch callback for item size (when md-items-size is\n   *     not specified), or angular.noop otherwise.\n   */\n  this.unwatchItemSize_ = angular.noop;\n\n  /**\n   * Presently rendered blocks by repeat index.\n   * @type {Object<number, !VirtualRepeatController.Block}\n   */\n  this.blocks = {};\n  /** @type {Array<!VirtualRepeatController.Block>} A pool of presently unused blocks. */\n  this.pooledBlocks = [];\n\n  $scope.$on('$destroy', angular.bind(this, this.cleanupBlocks_));\n}\n\n\n/**\n * An object representing a repeated item.\n * @typedef {{element: !jqLite, new: boolean, scope: !angular.Scope}}\n */\nVirtualRepeatController.Block;\n\n\n/**\n * Called at startup by the md-virtual-repeat postLink function.\n * @param {!VirtualRepeatContainerController} container The container's controller.\n * @param {!Function} transclude The repeated element's bound transclude function.\n * @param {string} repeatName The left hand side of the repeat expression, indicating\n *     the name for each item in the array.\n * @param {!Function} repeatListExpression A compiled expression based on the right hand side\n *     of the repeat expression. Points to the array to repeat over.\n * @param {string|undefined} extraName The optional extra repeatName.\n */\nVirtualRepeatController.prototype.link_ =\n    function(container, transclude, repeatName, repeatListExpression, extraName) {\n  this.container = container;\n  this.transclude = transclude;\n  this.repeatName = repeatName;\n  this.rawRepeatListExpression = repeatListExpression;\n  this.extraName = extraName;\n  this.sized = false;\n\n  this.repeatListExpression = angular.bind(this, this.repeatListExpression_);\n\n  this.container.register(this);\n};\n\n\n/** @private Cleans up unused blocks. */\nVirtualRepeatController.prototype.cleanupBlocks_ = function() {\n  angular.forEach(this.pooledBlocks, function cleanupBlock(block) {\n    block.element.remove();\n  });\n};\n\n\n/** @private Attempts to set itemSize by measuring a repeated element in the dom */\nVirtualRepeatController.prototype.readItemSize_ = function() {\n  if (this.itemSize) {\n    // itemSize was successfully read in a different asynchronous call.\n    return;\n  }\n\n  this.items = this.repeatListExpression(this.$scope);\n  this.parentNode = this.$element[0].parentNode;\n  var block = this.getBlock_(0);\n  if (!block.element[0].parentNode) {\n    this.parentNode.appendChild(block.element[0]);\n  }\n\n  this.itemSize = block.element[0][\n      this.container.isHorizontal() ? 'offsetWidth' : 'offsetHeight'] || null;\n\n  this.blocks[0] = block;\n  this.poolBlock_(0);\n\n  if (this.itemSize) {\n    this.containerUpdated();\n  }\n};\n\n\n/**\n * Returns the user-specified repeat list, transforming it into an array-like\n * object in the case of infinite scroll/dynamic load mode.\n * @param {!angular.Scope} The scope.\n * @return {!Array|!Object} An array or array-like object for iteration.\n */\nVirtualRepeatController.prototype.repeatListExpression_ = function(scope) {\n  var repeatList = this.rawRepeatListExpression(scope);\n\n  if (this.onDemand && repeatList) {\n    var virtualList = new VirtualRepeatModelArrayLike(repeatList);\n    virtualList.$$includeIndexes(this.newStartIndex, this.newVisibleEnd);\n    return virtualList;\n  } else {\n    return repeatList;\n  }\n};\n\n\n/**\n * Called by the container. Informs us that the containers scroll or size has\n * changed.\n */\nVirtualRepeatController.prototype.containerUpdated = function() {\n  // If itemSize is unknown, attempt to measure it.\n  if (!this.itemSize) {\n    // Make sure to clean up watchers if we can (see #8178)\n    if(this.unwatchItemSize_ && this.unwatchItemSize_ !== angular.noop){\n      this.unwatchItemSize_();\n    }\n    this.unwatchItemSize_ = this.$scope.$watchCollection(\n        this.repeatListExpression,\n        angular.bind(this, function(items) {\n          if (items && items.length) {\n            this.readItemSize_();\n          }\n        }));\n    if (!this.$rootScope.$$phase) this.$scope.$digest();\n\n    return;\n  } else if (!this.sized) {\n    this.items = this.repeatListExpression(this.$scope);\n  }\n\n  if (!this.sized) {\n    this.unwatchItemSize_();\n    this.sized = true;\n    this.$scope.$watchCollection(this.repeatListExpression,\n        angular.bind(this, function(items, oldItems) {\n          if (!this.isVirtualRepeatUpdating_) {\n            this.virtualRepeatUpdate_(items, oldItems);\n          }\n        }));\n  }\n\n  this.updateIndexes_();\n\n  if (this.newStartIndex !== this.startIndex ||\n      this.newEndIndex !== this.endIndex ||\n      this.container.getScrollOffset() > this.container.getScrollSize()) {\n    if (this.items instanceof VirtualRepeatModelArrayLike) {\n      this.items.$$includeIndexes(this.newStartIndex, this.newEndIndex);\n    }\n    this.virtualRepeatUpdate_(this.items, this.items);\n  }\n};\n\n\n/**\n * Called by the container. Returns the size of a single repeated item.\n * @return {?number} Size of a repeated item.\n */\nVirtualRepeatController.prototype.getItemSize = function() {\n  return this.itemSize;\n};\n\n\n/**\n * Called by the container. Returns the size of a single repeated item.\n * @return {?number} Size of a repeated item.\n */\nVirtualRepeatController.prototype.getItemCount = function() {\n  return this.itemsLength;\n};\n\n\n/**\n * Updates the order and visible offset of repeated blocks in response to scrolling\n * or items updates.\n * @private\n */\nVirtualRepeatController.prototype.virtualRepeatUpdate_ = function(items, oldItems) {\n  this.isVirtualRepeatUpdating_ = true;\n\n  var itemsLength = items && items.length || 0;\n  var lengthChanged = false;\n\n  // If the number of items shrank, keep the scroll position.\n  if (this.items && itemsLength < this.items.length && this.container.getScrollOffset() !== 0) {\n    this.items = items;\n    var previousScrollOffset = this.container.getScrollOffset();\n    this.container.resetScroll();\n    this.container.scrollTo(previousScrollOffset);\n  }\n\n  if (itemsLength !== this.itemsLength) {\n    lengthChanged = true;\n    this.itemsLength = itemsLength;\n  }\n\n  this.items = items;\n  if (items !== oldItems || lengthChanged) {\n    this.updateIndexes_();\n  }\n\n  this.parentNode = this.$element[0].parentNode;\n\n  if (lengthChanged) {\n    this.container.setScrollSize(itemsLength * this.itemSize);\n  }\n\n  var cleanupFirstRender = false, firstRenderStartIndex;\n  if (this.isFirstRender) {\n    cleanupFirstRender = true;\n    this.isFirstRender = false;\n    firstRenderStartIndex = this.$attrs.mdStartIndex ?\n      this.$scope.$eval(this.$attrs.mdStartIndex) :\n      this.container.topIndex;\n    this.container.scrollToIndex(firstRenderStartIndex);\n  }\n\n  // Detach and pool any blocks that are no longer in the viewport.\n  Object.keys(this.blocks).forEach(function(blockIndex) {\n    var index = parseInt(blockIndex, 10);\n    if (index < this.newStartIndex || index >= this.newEndIndex) {\n      this.poolBlock_(index);\n    }\n  }, this);\n\n  // Add needed blocks.\n  // For performance reasons, temporarily block browser url checks as we digest\n  // the restored block scopes ($$checkUrlChange reads window.location to\n  // check for changes and trigger route change, etc, which we don't need when\n  // trying to scroll at 60fps).\n  this.$browser.$$checkUrlChange = angular.noop;\n\n  var i, block,\n      newStartBlocks = [],\n      newEndBlocks = [];\n\n  // Collect blocks at the top.\n  for (i = this.newStartIndex; i < this.newEndIndex && this.blocks[i] == null; i++) {\n    block = this.getBlock_(i);\n    this.updateBlock_(block, i);\n    newStartBlocks.push(block);\n  }\n\n  // Update blocks that are already rendered.\n  for (; this.blocks[i] != null; i++) {\n    this.updateBlock_(this.blocks[i], i);\n  }\n  var maxIndex = i - 1;\n\n  // Collect blocks at the end.\n  for (; i < this.newEndIndex; i++) {\n    block = this.getBlock_(i);\n    this.updateBlock_(block, i);\n    newEndBlocks.push(block);\n  }\n\n  // Attach collected blocks to the document.\n  if (newStartBlocks.length) {\n    this.parentNode.insertBefore(\n        this.domFragmentFromBlocks_(newStartBlocks),\n        this.$element[0].nextSibling);\n  }\n  if (newEndBlocks.length) {\n    this.parentNode.insertBefore(\n        this.domFragmentFromBlocks_(newEndBlocks),\n        this.blocks[maxIndex] && this.blocks[maxIndex].element[0].nextSibling);\n  }\n\n  // DOM manipulation may have altered scroll, so scroll again\n  if (cleanupFirstRender) {\n    this.container.scrollToIndex(firstRenderStartIndex);\n  }\n  // Restore $$checkUrlChange.\n  this.$browser.$$checkUrlChange = this.browserCheckUrlChange;\n\n  this.startIndex = this.newStartIndex;\n  this.endIndex = this.newEndIndex;\n\n  this.isVirtualRepeatUpdating_ = false;\n};\n\n\n/**\n * @param {number} index Where the block is to be in the repeated list.\n * @return {!VirtualRepeatController.Block} A new or pooled block to place at the specified index.\n * @private\n */\nVirtualRepeatController.prototype.getBlock_ = function(index) {\n  if (this.pooledBlocks.length) {\n    return this.pooledBlocks.pop();\n  }\n\n  var block;\n  this.transclude(angular.bind(this, function(clone, scope) {\n    block = {\n      element: clone,\n      new: true,\n      scope: scope\n    };\n\n    this.updateScope_(scope, index);\n    this.parentNode.appendChild(clone[0]);\n  }));\n\n  return block;\n};\n\n\n/**\n * Updates and if not in a digest cycle, digests the specified block's scope to the data\n * at the specified index.\n * @param {!VirtualRepeatController.Block} block The block whose scope should be updated.\n * @param {number} index The index to set.\n * @private\n */\nVirtualRepeatController.prototype.updateBlock_ = function(block, index) {\n  this.blocks[index] = block;\n\n  if (!block.new &&\n      (block.scope.$index === index && block.scope[this.repeatName] === this.items[index])) {\n    return;\n  }\n  block.new = false;\n\n  // Update and digest the block's scope.\n  this.updateScope_(block.scope, index);\n\n  // Perform digest before reattaching the block.\n  // Any resulting synchronous dom mutations should be much faster as a result.\n  // This might break some directives, but I'm going to try it for now.\n  if (!this.$rootScope.$$phase) {\n    block.scope.$digest();\n  }\n};\n\n\n/**\n * Updates scope to the data at the specified index.\n * @param {!angular.Scope} scope The scope which should be updated.\n * @param {number} index The index to set.\n * @private\n */\nVirtualRepeatController.prototype.updateScope_ = function(scope, index) {\n  scope.$index = index;\n  scope[this.repeatName] = this.items && this.items[index];\n  if (this.extraName) scope[this.extraName(this.$scope)] = this.items[index];\n};\n\n\n/**\n * Pools the block at the specified index (Pulls its element out of the dom and stores it).\n * @param {number} index The index at which the block to pool is stored.\n * @private\n */\nVirtualRepeatController.prototype.poolBlock_ = function(index) {\n  this.pooledBlocks.push(this.blocks[index]);\n  this.parentNode.removeChild(this.blocks[index].element[0]);\n  delete this.blocks[index];\n};\n\n\n/**\n * Produces a dom fragment containing the elements from the list of blocks.\n * @param {!Array<!VirtualRepeatController.Block>} blocks The blocks whose elements\n *     should be added to the document fragment.\n * @return {DocumentFragment}\n * @private\n */\nVirtualRepeatController.prototype.domFragmentFromBlocks_ = function(blocks) {\n  var fragment = this.$document[0].createDocumentFragment();\n  blocks.forEach(function(block) {\n    fragment.appendChild(block.element[0]);\n  });\n  return fragment;\n};\n\n\n/**\n * Updates start and end indexes based on length of repeated items and container size.\n * @private\n */\nVirtualRepeatController.prototype.updateIndexes_ = function() {\n  var itemsLength = this.items ? this.items.length : 0;\n  var containerLength = Math.ceil(this.container.getSize() / this.itemSize);\n\n  this.newStartIndex = Math.max(0, Math.min(\n      itemsLength - containerLength,\n      Math.floor(this.container.getScrollOffset() / this.itemSize)));\n  this.newVisibleEnd = this.newStartIndex + containerLength + NUM_EXTRA;\n  this.newEndIndex = Math.min(itemsLength, this.newVisibleEnd);\n  this.newStartIndex = Math.max(0, this.newStartIndex - NUM_EXTRA);\n};\n\n/**\n * This VirtualRepeatModelArrayLike class enforces the interface requirements\n * for infinite scrolling within a mdVirtualRepeatContainer. An object with this\n * interface must implement the following interface with two (2) methods:\n *\n * getItemAtIndex: function(index) -> item at that index or null if it is not yet\n *     loaded (It should start downloading the item in that case).\n *\n * getLength: function() -> number The data legnth to which the repeater container\n *     should be sized. Ideally, when the count is known, this method should return it.\n *     Otherwise, return a higher number than the currently loaded items to produce an\n *     infinite-scroll behavior.\n *\n * @usage\n * <hljs lang=\"html\">\n *  <md-virtual-repeat-container md-orient-horizontal>\n *    <div md-virtual-repeat=\"i in items\" md-on-demand>\n *      Hello {{i}}!\n *    </div>\n *  </md-virtual-repeat-container>\n * </hljs>\n *\n */\nfunction VirtualRepeatModelArrayLike(model) {\n  if (!angular.isFunction(model.getItemAtIndex) ||\n      !angular.isFunction(model.getLength)) {\n    throw Error('When md-on-demand is enabled, the Object passed to md-virtual-repeat must implement ' +\n        'functions getItemAtIndex() and getLength() ');\n  }\n\n  this.model = model;\n}\n\n\nVirtualRepeatModelArrayLike.prototype.$$includeIndexes = function(start, end) {\n  for (var i = start; i < end; i++) {\n    if (!this.hasOwnProperty(i)) {\n      this[i] = this.model.getItemAtIndex(i);\n    }\n  }\n  this.length = this.model.getLength();\n};\n\n})();\n(function(){\n\"use strict\";\n\n/**\n * @ngdoc module\n * @name material.components.whiteframe\n */\nMdWhiteframeDirective.$inject = [\"$log\"];\nangular\n  .module('material.components.whiteframe', ['material.core'])\n  .directive('mdWhiteframe', MdWhiteframeDirective);\n\n/**\n * @ngdoc directive\n * @module material.components.whiteframe\n * @name mdWhiteframe\n *\n * @description\n * The md-whiteframe directive allows you to apply an elevation shadow to an element.\n *\n * The attribute values needs to be a number between 1 and 24 or -1.\n * When set to -1 no style is applied.\n *\n * ### Notes\n * - If there is no value specified it defaults to 4dp.\n * - If the value is not valid it defaults to 4dp.\n\n * @usage\n * <hljs lang=\"html\">\n * <div md-whiteframe=\"3\">\n *   <span>Elevation of 3dp</span>\n * </div>\n * </hljs>\n *\n * <hljs lang=\"html\">\n * <div md-whiteframe=\"-1\">\n *   <span>No elevation shadow applied</span>\n * </div>\n * </hljs>\n *\n * <hljs lang=\"html\">\n * <div ng-init=\"elevation = 5\" md-whiteframe=\"{{elevation}}\">\n *   <span>Elevation of 5dp with an interpolated value</span>\n * </div>\n * </hljs>\n */\nfunction MdWhiteframeDirective($log) {\n  var DISABLE_DP = -1;\n  var MIN_DP = 1;\n  var MAX_DP = 24;\n  var DEFAULT_DP = 4;\n\n  return {\n    link: postLink\n  };\n\n  function postLink(scope, element, attr) {\n    var oldClass = '';\n\n    attr.$observe('mdWhiteframe', function(elevation) {\n      elevation = parseInt(elevation, 10) || DEFAULT_DP;\n\n      if (elevation != DISABLE_DP && (elevation > MAX_DP || elevation < MIN_DP)) {\n        $log.warn('md-whiteframe attribute value is invalid. It should be a number between ' + MIN_DP + ' and ' + MAX_DP, element[0]);\n        elevation = DEFAULT_DP;\n      }\n\n      var newClass = elevation == DISABLE_DP ? '' : 'md-whiteframe-' + elevation + 'dp';\n      attr.$updateClass(newClass, oldClass);\n      oldClass = newClass;\n    });\n  }\n}\n\n\n})();\n(function(){\n\"use strict\";\n\n\nMdAutocompleteCtrl.$inject = [\"$scope\", \"$element\", \"$mdUtil\", \"$mdConstant\", \"$mdTheming\", \"$window\", \"$animate\", \"$rootElement\", \"$attrs\", \"$q\", \"$log\", \"$mdLiveAnnouncer\"];angular\n    .module('material.components.autocomplete')\n    .controller('MdAutocompleteCtrl', MdAutocompleteCtrl);\n\nvar ITEM_HEIGHT   = 48,\n    MAX_ITEMS     = 5,\n    MENU_PADDING  = 8,\n    INPUT_PADDING = 2; // Padding provided by `md-input-container`\n\nfunction MdAutocompleteCtrl ($scope, $element, $mdUtil, $mdConstant, $mdTheming, $window,\n                             $animate, $rootElement, $attrs, $q, $log, $mdLiveAnnouncer) {\n\n  // Internal Variables.\n  var ctrl                 = this,\n      itemParts            = $scope.itemsExpr.split(/ in /i),\n      itemExpr             = itemParts[ 1 ],\n      elements             = null,\n      cache                = {},\n      noBlur               = false,\n      selectedItemWatchers = [],\n      hasFocus             = false,\n      fetchesInProgress    = 0,\n      enableWrapScroll     = null,\n      inputModelCtrl       = null,\n      debouncedOnResize    = $mdUtil.debounce(onWindowResize);\n\n  // Public Exported Variables with handlers\n  defineProperty('hidden', handleHiddenChange, true);\n\n  // Public Exported Variables\n  ctrl.scope      = $scope;\n  ctrl.parent     = $scope.$parent;\n  ctrl.itemName   = itemParts[ 0 ];\n  ctrl.matches    = [];\n  ctrl.loading    = false;\n  ctrl.hidden     = true;\n  ctrl.index      = null;\n  ctrl.id         = $mdUtil.nextUid();\n  ctrl.isDisabled = null;\n  ctrl.isRequired = null;\n  ctrl.isReadonly = null;\n  ctrl.hasNotFound = false;\n\n  // Public Exported Methods\n  ctrl.keydown                       = keydown;\n  ctrl.blur                          = blur;\n  ctrl.focus                         = focus;\n  ctrl.clear                         = clearValue;\n  ctrl.select                        = select;\n  ctrl.listEnter                     = onListEnter;\n  ctrl.listLeave                     = onListLeave;\n  ctrl.mouseUp                       = onMouseup;\n  ctrl.getCurrentDisplayValue        = getCurrentDisplayValue;\n  ctrl.registerSelectedItemWatcher   = registerSelectedItemWatcher;\n  ctrl.unregisterSelectedItemWatcher = unregisterSelectedItemWatcher;\n  ctrl.notFoundVisible               = notFoundVisible;\n  ctrl.loadingIsVisible              = loadingIsVisible;\n  ctrl.positionDropdown              = positionDropdown;\n\n  /**\n   * Report types to be used for the $mdLiveAnnouncer\n   * @enum {number} Unique flag id.\n   */\n  var ReportType = {\n    Count: 1,\n    Selected: 2\n  };\n\n  return init();\n\n  //-- initialization methods\n\n  /**\n   * Initialize the controller, setup watchers, gather elements\n   */\n  function init () {\n\n    $mdUtil.initOptionalProperties($scope, $attrs, {\n      searchText: '',\n      selectedItem: null,\n      clearButton: false\n    });\n\n    $mdTheming($element);\n    configureWatchers();\n    $mdUtil.nextTick(function () {\n\n      gatherElements();\n      moveDropdown();\n\n      // Forward all focus events to the input element when autofocus is enabled\n      if ($scope.autofocus) {\n        $element.on('focus', focusInputElement);\n      }\n    });\n  }\n\n  function updateModelValidators() {\n    if (!$scope.requireMatch || !inputModelCtrl) return;\n\n    inputModelCtrl.$setValidity('md-require-match', !!$scope.selectedItem || !$scope.searchText);\n  }\n\n  /**\n   * Calculates the dropdown's position and applies the new styles to the menu element\n   * @returns {*}\n   */\n  function positionDropdown () {\n    if (!elements) {\n      return $mdUtil.nextTick(positionDropdown, false, $scope);\n    }\n\n    var dropdownHeight = ($scope.dropdownItems || MAX_ITEMS) * ITEM_HEIGHT;\n\n    var hrect  = elements.wrap.getBoundingClientRect(),\n        vrect  = elements.snap.getBoundingClientRect(),\n        root   = elements.root.getBoundingClientRect(),\n        top    = vrect.bottom - root.top,\n        bot    = root.bottom - vrect.top,\n        left   = hrect.left - root.left,\n        width  = hrect.width,\n        offset = getVerticalOffset(),\n        position = $scope.dropdownPosition,\n        styles;\n\n    // Automatically determine dropdown placement based on available space in viewport.\n    if (!position) {\n      position = (top > bot && root.height - top - MENU_PADDING < dropdownHeight) ? 'top' : 'bottom';\n    }\n    // Adjust the width to account for the padding provided by `md-input-container`\n    if ($attrs.mdFloatingLabel) {\n      left += INPUT_PADDING;\n      width -= INPUT_PADDING * 2;\n    }\n    styles = {\n      left:     left + 'px',\n      minWidth: width + 'px',\n      maxWidth: Math.max(hrect.right - root.left, root.right - hrect.left) - MENU_PADDING + 'px'\n    };\n\n    if (position === 'top') {\n      styles.top       = 'auto';\n      styles.bottom    = bot + 'px';\n      styles.maxHeight = Math.min(dropdownHeight, hrect.top - root.top - MENU_PADDING) + 'px';\n    } else {\n      var bottomSpace = root.bottom - hrect.bottom - MENU_PADDING + $mdUtil.getViewportTop();\n\n      styles.top       = (top - offset) + 'px';\n      styles.bottom    = 'auto';\n      styles.maxHeight = Math.min(dropdownHeight, bottomSpace) + 'px';\n    }\n\n    elements.$.scrollContainer.css(styles);\n    $mdUtil.nextTick(correctHorizontalAlignment, false);\n\n    /**\n     * Calculates the vertical offset for floating label examples to account for ngMessages\n     * @returns {number}\n     */\n    function getVerticalOffset () {\n      var offset = 0;\n      var inputContainer = $element.find('md-input-container');\n      if (inputContainer.length) {\n        var input = inputContainer.find('input');\n        offset = inputContainer.prop('offsetHeight');\n        offset -= input.prop('offsetTop');\n        offset -= input.prop('offsetHeight');\n        // add in the height left up top for the floating label text\n        offset += inputContainer.prop('offsetTop');\n      }\n      return offset;\n    }\n\n    /**\n     * Makes sure that the menu doesn't go off of the screen on either side.\n     */\n    function correctHorizontalAlignment () {\n      var dropdown = elements.scrollContainer.getBoundingClientRect(),\n          styles   = {};\n      if (dropdown.right > root.right - MENU_PADDING) {\n        styles.left = (hrect.right - dropdown.width) + 'px';\n      }\n      elements.$.scrollContainer.css(styles);\n    }\n  }\n\n  /**\n   * Moves the dropdown menu to the body tag in order to avoid z-index and overflow issues.\n   */\n  function moveDropdown () {\n    if (!elements.$.root.length) return;\n    $mdTheming(elements.$.scrollContainer);\n    elements.$.scrollContainer.detach();\n    elements.$.root.append(elements.$.scrollContainer);\n    if ($animate.pin) $animate.pin(elements.$.scrollContainer, $rootElement);\n  }\n\n  /**\n   * Sends focus to the input element.\n   */\n  function focusInputElement () {\n    elements.input.focus();\n  }\n\n  /**\n   * Sets up any watchers used by autocomplete\n   */\n  function configureWatchers () {\n    var wait = parseInt($scope.delay, 10) || 0;\n\n    $attrs.$observe('disabled', function (value) { ctrl.isDisabled = $mdUtil.parseAttributeBoolean(value, false); });\n    $attrs.$observe('required', function (value) { ctrl.isRequired = $mdUtil.parseAttributeBoolean(value, false); });\n    $attrs.$observe('readonly', function (value) { ctrl.isReadonly = $mdUtil.parseAttributeBoolean(value, false); });\n\n    $scope.$watch('searchText', wait ? $mdUtil.debounce(handleSearchText, wait) : handleSearchText);\n    $scope.$watch('selectedItem', selectedItemChange);\n\n    angular.element($window).on('resize', debouncedOnResize);\n\n    $scope.$on('$destroy', cleanup);\n  }\n\n  /**\n   * Removes any events or leftover elements created by this controller\n   */\n  function cleanup () {\n    if (!ctrl.hidden) {\n      $mdUtil.enableScrolling();\n    }\n\n    angular.element($window).off('resize', debouncedOnResize);\n\n    if ( elements ){\n      var items = ['ul', 'scroller', 'scrollContainer', 'input'];\n      angular.forEach(items, function(key){\n        elements.$[key].remove();\n      });\n    }\n  }\n\n  /**\n   * Event handler to be called whenever the window resizes.\n   */\n  function onWindowResize() {\n    if (!ctrl.hidden) {\n      positionDropdown();\n    }\n  }\n\n  /**\n   * Gathers all of the elements needed for this controller\n   */\n  function gatherElements () {\n\n    var snapWrap = gatherSnapWrap();\n\n    elements = {\n      main:  $element[0],\n      scrollContainer: $element[0].querySelector('.md-virtual-repeat-container'),\n      scroller: $element[0].querySelector('.md-virtual-repeat-scroller'),\n      ul:    $element.find('ul')[0],\n      input: $element.find('input')[0],\n      wrap:  snapWrap.wrap,\n      snap:  snapWrap.snap,\n      root:  document.body\n    };\n\n    elements.li   = elements.ul.getElementsByTagName('li');\n    elements.$    = getAngularElements(elements);\n\n    inputModelCtrl = elements.$.input.controller('ngModel');\n  }\n\n  /**\n   * Gathers the snap and wrap elements\n   *\n   */\n  function gatherSnapWrap() {\n    var element;\n    var value;\n    for (element = $element; element.length; element = element.parent()) {\n      value = element.attr('md-autocomplete-snap');\n      if (angular.isDefined(value)) break;\n    }\n\n    if (element.length) {\n      return {\n        snap: element[0],\n        wrap: (value.toLowerCase() === 'width') ? element[0] : $element.find('md-autocomplete-wrap')[0]\n      };\n    }\n\n    var wrap = $element.find('md-autocomplete-wrap')[0];\n    return {\n      snap: wrap,\n      wrap: wrap\n    };\n  }\n\n  /**\n   * Gathers angular-wrapped versions of each element\n   * @param elements\n   * @returns {{}}\n   */\n  function getAngularElements (elements) {\n    var obj = {};\n    for (var key in elements) {\n      if (elements.hasOwnProperty(key)) obj[ key ] = angular.element(elements[ key ]);\n    }\n    return obj;\n  }\n\n  //-- event/change handlers\n\n  /**\n   * Handles changes to the `hidden` property.\n   * @param hidden\n   * @param oldHidden\n   */\n  function handleHiddenChange (hidden, oldHidden) {\n    if (!hidden && oldHidden) {\n      positionDropdown();\n\n      // Report in polite mode, because the screenreader should finish the default description of\n      // the input. element.\n      reportMessages(true, ReportType.Count | ReportType.Selected);\n\n      if (elements) {\n        $mdUtil.disableScrollAround(elements.ul);\n        enableWrapScroll = disableElementScrollEvents(angular.element(elements.wrap));\n      }\n    } else if (hidden && !oldHidden) {\n      $mdUtil.enableScrolling();\n\n      if (enableWrapScroll) {\n        enableWrapScroll();\n        enableWrapScroll = null;\n      }\n    }\n  }\n\n  /**\n   * Disables scrolling for a specific element\n   */\n  function disableElementScrollEvents(element) {\n\n    function preventDefault(e) {\n      e.preventDefault();\n    }\n\n    element.on('wheel', preventDefault);\n    element.on('touchmove', preventDefault);\n\n    return function() {\n      element.off('wheel', preventDefault);\n      element.off('touchmove', preventDefault);\n    };\n  }\n\n  /**\n   * When the user mouses over the dropdown menu, ignore blur events.\n   */\n  function onListEnter () {\n    noBlur = true;\n  }\n\n  /**\n   * When the user's mouse leaves the menu, blur events may hide the menu again.\n   */\n  function onListLeave () {\n    if (!hasFocus && !ctrl.hidden) elements.input.focus();\n    noBlur = false;\n    ctrl.hidden = shouldHide();\n  }\n\n  /**\n   * When the mouse button is released, send focus back to the input field.\n   */\n  function onMouseup () {\n    elements.input.focus();\n  }\n\n  /**\n   * Handles changes to the selected item.\n   * @param selectedItem\n   * @param previousSelectedItem\n   */\n  function selectedItemChange (selectedItem, previousSelectedItem) {\n\n    updateModelValidators();\n\n    if (selectedItem) {\n      getDisplayValue(selectedItem).then(function (val) {\n        $scope.searchText = val;\n        handleSelectedItemChange(selectedItem, previousSelectedItem);\n      });\n    } else if (previousSelectedItem && $scope.searchText) {\n      getDisplayValue(previousSelectedItem).then(function(displayValue) {\n        // Clear the searchText, when the selectedItem is set to null.\n        // Do not clear the searchText, when the searchText isn't matching with the previous\n        // selected item.\n        if (angular.isString($scope.searchText)\n          && displayValue.toString().toLowerCase() === $scope.searchText.toLowerCase()) {\n          $scope.searchText = '';\n        }\n      });\n    }\n\n    if (selectedItem !== previousSelectedItem) announceItemChange();\n  }\n\n  /**\n   * Use the user-defined expression to announce changes each time a new item is selected\n   */\n  function announceItemChange () {\n    angular.isFunction($scope.itemChange) && $scope.itemChange(getItemAsNameVal($scope.selectedItem));\n  }\n\n  /**\n   * Use the user-defined expression to announce changes each time the search text is changed\n   */\n  function announceTextChange () {\n    angular.isFunction($scope.textChange) && $scope.textChange();\n  }\n\n  /**\n   * Calls any external watchers listening for the selected item.  Used in conjunction with\n   * `registerSelectedItemWatcher`.\n   * @param selectedItem\n   * @param previousSelectedItem\n   */\n  function handleSelectedItemChange (selectedItem, previousSelectedItem) {\n    selectedItemWatchers.forEach(function (watcher) { watcher(selectedItem, previousSelectedItem); });\n  }\n\n  /**\n   * Register a function to be called when the selected item changes.\n   * @param cb\n   */\n  function registerSelectedItemWatcher (cb) {\n    if (selectedItemWatchers.indexOf(cb) == -1) {\n      selectedItemWatchers.push(cb);\n    }\n  }\n\n  /**\n   * Unregister a function previously registered for selected item changes.\n   * @param cb\n   */\n  function unregisterSelectedItemWatcher (cb) {\n    var i = selectedItemWatchers.indexOf(cb);\n    if (i != -1) {\n      selectedItemWatchers.splice(i, 1);\n    }\n  }\n\n  /**\n   * Handles changes to the searchText property.\n   * @param searchText\n   * @param previousSearchText\n   */\n  function handleSearchText (searchText, previousSearchText) {\n    ctrl.index = getDefaultIndex();\n\n    // do nothing on init\n    if (searchText === previousSearchText) return;\n\n    updateModelValidators();\n\n    getDisplayValue($scope.selectedItem).then(function (val) {\n      // clear selected item if search text no longer matches it\n      if (searchText !== val) {\n        $scope.selectedItem = null;\n\n\n        // trigger change event if available\n        if (searchText !== previousSearchText) announceTextChange();\n\n        // cancel results if search text is not long enough\n        if (!isMinLengthMet()) {\n          ctrl.matches = [];\n\n          setLoading(false);\n          reportMessages(false, ReportType.Count);\n\n        } else {\n          handleQuery();\n        }\n      }\n    });\n\n  }\n\n  /**\n   * Handles input blur event, determines if the dropdown should hide.\n   */\n  function blur($event) {\n    hasFocus = false;\n\n    if (!noBlur) {\n      ctrl.hidden = shouldHide();\n      evalAttr('ngBlur', { $event: $event });\n    }\n  }\n\n  /**\n   * Force blur on input element\n   * @param forceBlur\n   */\n  function doBlur(forceBlur) {\n    if (forceBlur) {\n      noBlur = false;\n      hasFocus = false;\n    }\n    elements.input.blur();\n  }\n\n  /**\n   * Handles input focus event, determines if the dropdown should show.\n   */\n  function focus($event) {\n    hasFocus = true;\n\n    if (isSearchable() && isMinLengthMet()) {\n      handleQuery();\n    }\n\n    ctrl.hidden = shouldHide();\n\n    evalAttr('ngFocus', { $event: $event });\n  }\n\n  /**\n   * Handles keyboard input.\n   * @param event\n   */\n  function keydown (event) {\n    switch (event.keyCode) {\n      case $mdConstant.KEY_CODE.DOWN_ARROW:\n        if (ctrl.loading) return;\n        event.stopPropagation();\n        event.preventDefault();\n        ctrl.index   = Math.min(ctrl.index + 1, ctrl.matches.length - 1);\n        updateScroll();\n        reportMessages(false, ReportType.Selected);\n        break;\n      case $mdConstant.KEY_CODE.UP_ARROW:\n        if (ctrl.loading) return;\n        event.stopPropagation();\n        event.preventDefault();\n        ctrl.index   = ctrl.index < 0 ? ctrl.matches.length - 1 : Math.max(0, ctrl.index - 1);\n        updateScroll();\n        reportMessages(false, ReportType.Selected);\n        break;\n      case $mdConstant.KEY_CODE.TAB:\n        // If we hit tab, assume that we've left the list so it will close\n        onListLeave();\n\n        if (ctrl.hidden || ctrl.loading || ctrl.index < 0 || ctrl.matches.length < 1) return;\n        select(ctrl.index);\n        break;\n      case $mdConstant.KEY_CODE.ENTER:\n        if (ctrl.hidden || ctrl.loading || ctrl.index < 0 || ctrl.matches.length < 1) return;\n        if (hasSelection()) return;\n        event.stopPropagation();\n        event.preventDefault();\n        select(ctrl.index);\n        break;\n      case $mdConstant.KEY_CODE.ESCAPE:\n        event.preventDefault(); // Prevent browser from always clearing input\n        if (!shouldProcessEscape()) return;\n        event.stopPropagation();\n\n        clearSelectedItem();\n        if ($scope.searchText && hasEscapeOption('clear')) {\n          clearSearchText();\n        }\n\n        // Manually hide (needed for mdNotFound support)\n        ctrl.hidden = true;\n\n        if (hasEscapeOption('blur')) {\n          // Force the component to blur if they hit escape\n          doBlur(true);\n        }\n\n        break;\n      default:\n    }\n  }\n\n  //-- getters\n\n  /**\n   * Returns the minimum length needed to display the dropdown.\n   * @returns {*}\n   */\n  function getMinLength () {\n    return angular.isNumber($scope.minLength) ? $scope.minLength : 1;\n  }\n\n  /**\n   * Returns the display value for an item.\n   * @param item\n   * @returns {*}\n   */\n  function getDisplayValue (item) {\n    return $q.when(getItemText(item) || item).then(function(itemText) {\n      if (itemText && !angular.isString(itemText)) {\n        $log.warn('md-autocomplete: Could not resolve display value to a string. ' +\n          'Please check the `md-item-text` attribute.');\n      }\n\n      return itemText;\n    });\n\n    /**\n     * Getter function to invoke user-defined expression (in the directive)\n     * to convert your object to a single string.\n     */\n    function getItemText (item) {\n      return (item && $scope.itemText) ? $scope.itemText(getItemAsNameVal(item)) : null;\n    }\n  }\n\n  /**\n   * Returns the locals object for compiling item templates.\n   * @param item\n   * @returns {{}}\n   */\n  function getItemAsNameVal (item) {\n    if (!item) return undefined;\n\n    var locals = {};\n    if (ctrl.itemName) locals[ ctrl.itemName ] = item;\n\n    return locals;\n  }\n\n  /**\n   * Returns the default index based on whether or not autoselect is enabled.\n   * @returns {number}\n   */\n  function getDefaultIndex () {\n    return $scope.autoselect ? 0 : -1;\n  }\n\n  /**\n   * Sets the loading parameter and updates the hidden state.\n   * @param value {boolean} Whether or not the component is currently loading.\n   */\n  function setLoading(value) {\n    if (ctrl.loading != value) {\n      ctrl.loading = value;\n    }\n\n    // Always refresh the hidden variable as something else might have changed\n    ctrl.hidden = shouldHide();\n  }\n\n  /**\n   * Determines if the menu should be hidden.\n   * @returns {boolean}\n   */\n  function shouldHide () {\n    if (!isSearchable()) return true;    // Hide when not able to query\n    else return !shouldShow();            // Hide when the dropdown is not able to show.\n  }\n\n  /**\n   * Determines whether the autocomplete is able to query within the current state.\n   * @returns {boolean}\n   */\n  function isSearchable() {\n    if (ctrl.loading && !hasMatches()) return false; // No query when query is in progress.\n    else if (hasSelection()) return false;           // No query if there is already a selection\n    else if (!hasFocus) return false;                // No query if the input does not have focus\n    return true;\n  }\n\n  /**\n   * Determines if the escape keydown should be processed\n   * @returns {boolean}\n   */\n  function shouldProcessEscape() {\n    return hasEscapeOption('blur') || !ctrl.hidden || ctrl.loading || hasEscapeOption('clear') && $scope.searchText;\n  }\n\n  /**\n   * Determines if an escape option is set\n   * @returns {boolean}\n   */\n  function hasEscapeOption(option) {\n    return !$scope.escapeOptions || $scope.escapeOptions.toLowerCase().indexOf(option) !== -1;\n  }\n\n  /**\n   * Determines if the menu should be shown.\n   * @returns {boolean}\n   */\n  function shouldShow() {\n    return (isMinLengthMet() && hasMatches()) || notFoundVisible();\n  }\n\n  /**\n   * Returns true if the search text has matches.\n   * @returns {boolean}\n   */\n  function hasMatches() {\n    return ctrl.matches.length ? true : false;\n  }\n\n  /**\n   * Returns true if the autocomplete has a valid selection.\n   * @returns {boolean}\n   */\n  function hasSelection() {\n    return ctrl.scope.selectedItem ? true : false;\n  }\n\n  /**\n   * Returns true if the loading indicator is, or should be, visible.\n   * @returns {boolean}\n   */\n  function loadingIsVisible() {\n    return ctrl.loading && !hasSelection();\n  }\n\n  /**\n   * Returns the display value of the current item.\n   * @returns {*}\n   */\n  function getCurrentDisplayValue () {\n    return getDisplayValue(ctrl.matches[ ctrl.index ]);\n  }\n\n  /**\n   * Determines if the minimum length is met by the search text.\n   * @returns {*}\n   */\n  function isMinLengthMet () {\n    return ($scope.searchText || '').length >= getMinLength();\n  }\n\n  //-- actions\n\n  /**\n   * Defines a public property with a handler and a default value.\n   * @param key\n   * @param handler\n   * @param value\n   */\n  function defineProperty (key, handler, value) {\n    Object.defineProperty(ctrl, key, {\n      get: function () { return value; },\n      set: function (newValue) {\n        var oldValue = value;\n        value        = newValue;\n        handler(newValue, oldValue);\n      }\n    });\n  }\n\n  /**\n   * Selects the item at the given index.\n   * @param index\n   */\n  function select (index) {\n    //-- force form to update state for validation\n    $mdUtil.nextTick(function () {\n      getDisplayValue(ctrl.matches[ index ]).then(function (val) {\n        var ngModel = elements.$.input.controller('ngModel');\n        ngModel.$setViewValue(val);\n        ngModel.$render();\n      }).finally(function () {\n        $scope.selectedItem = ctrl.matches[ index ];\n        setLoading(false);\n      });\n    }, false);\n  }\n\n  /**\n   * Clears the searchText value and selected item.\n   */\n  function clearValue () {\n    clearSelectedItem();\n    clearSearchText();\n  }\n\n  /**\n   * Clears the selected item\n   */\n  function clearSelectedItem () {\n    // Reset our variables\n    ctrl.index = 0;\n    ctrl.matches = [];\n  }\n\n  /**\n   * Clears the searchText value\n   */\n  function clearSearchText () {\n    // Set the loading to true so we don't see flashes of content.\n    // The flashing will only occur when an async request is running.\n    // So the loading process will stop when the results had been retrieved.\n    setLoading(true);\n\n    $scope.searchText = '';\n\n    // Normally, triggering the change / input event is unnecessary, because the browser detects it properly.\n    // But some browsers are not detecting it properly, which means that we have to trigger the event.\n    // Using the `input` is not working properly, because for example IE11 is not supporting the `input` event.\n    // The `change` event is a good alternative and is supported by all supported browsers.\n    var eventObj = document.createEvent('CustomEvent');\n    eventObj.initCustomEvent('change', true, true, { value: '' });\n    elements.input.dispatchEvent(eventObj);\n\n    // For some reason, firing the above event resets the value of $scope.searchText if\n    // $scope.searchText has a space character at the end, so we blank it one more time and then\n    // focus.\n    elements.input.blur();\n    $scope.searchText = '';\n    elements.input.focus();\n  }\n\n  /**\n   * Fetches the results for the provided search text.\n   * @param searchText\n   */\n  function fetchResults (searchText) {\n    var items = $scope.$parent.$eval(itemExpr),\n        term  = searchText.toLowerCase(),\n        isList = angular.isArray(items),\n        isPromise = !!items.then; // Every promise should contain a `then` property\n\n    if (isList) onResultsRetrieved(items);\n    else if (isPromise) handleAsyncResults(items);\n\n    function handleAsyncResults(items) {\n      if ( !items ) return;\n\n      items = $q.when(items);\n      fetchesInProgress++;\n      setLoading(true);\n\n      $mdUtil.nextTick(function () {\n          items\n            .then(onResultsRetrieved)\n            .finally(function(){\n              if (--fetchesInProgress === 0) {\n                setLoading(false);\n              }\n            });\n      },true, $scope);\n    }\n\n    function onResultsRetrieved(matches) {\n      cache[term] = matches;\n\n      // Just cache the results if the request is now outdated.\n      // The request becomes outdated, when the new searchText has changed during the result fetching.\n      if ((searchText || '') !== ($scope.searchText || '')) {\n        return;\n      }\n\n      handleResults(matches);\n    }\n  }\n\n\n  /**\n   * Reports given message types to supported screenreaders.\n   * @param {boolean} isPolite Whether the announcement should be polite.\n   * @param {!number} types Message flags to be reported to the screenreader.\n   */\n  function reportMessages(isPolite, types) {\n\n    var politeness = isPolite ? 'polite' : 'assertive';\n    var messages = [];\n\n    if (types & ReportType.Selected && ctrl.index !== -1) {\n      messages.push(getCurrentDisplayValue());\n    }\n\n    if (types & ReportType.Count) {\n      messages.push($q.resolve(getCountMessage()));\n    }\n\n    $q.all(messages).then(function(data) {\n      $mdLiveAnnouncer.announce(data.join(' '), politeness);\n    });\n\n  }\n\n  /**\n   * Returns the ARIA message for how many results match the current query.\n   * @returns {*}\n   */\n  function getCountMessage () {\n    switch (ctrl.matches.length) {\n      case 0:\n        return 'There are no matches available.';\n      case 1:\n        return 'There is 1 match available.';\n      default:\n        return 'There are ' + ctrl.matches.length + ' matches available.';\n    }\n  }\n\n  /**\n   * Makes sure that the focused element is within view.\n   */\n  function updateScroll () {\n    if (!elements.li[0]) return;\n    var height = elements.li[0].offsetHeight,\n        top = height * ctrl.index,\n        bot = top + height,\n        hgt = elements.scroller.clientHeight,\n        scrollTop = elements.scroller.scrollTop;\n    if (top < scrollTop) {\n      scrollTo(top);\n    } else if (bot > scrollTop + hgt) {\n      scrollTo(bot - hgt);\n    }\n  }\n\n  function isPromiseFetching() {\n    return fetchesInProgress !== 0;\n  }\n\n  function scrollTo (offset) {\n    elements.$.scrollContainer.controller('mdVirtualRepeatContainer').scrollTo(offset);\n  }\n\n  function notFoundVisible () {\n    var textLength = (ctrl.scope.searchText || '').length;\n\n    return ctrl.hasNotFound && !hasMatches() && (!ctrl.loading || isPromiseFetching()) && textLength >= getMinLength() && (hasFocus || noBlur) && !hasSelection();\n  }\n\n  /**\n   * Starts the query to gather the results for the current searchText.  Attempts to return cached\n   * results first, then forwards the process to `fetchResults` if necessary.\n   */\n  function handleQuery () {\n    var searchText = $scope.searchText || '';\n    var term = searchText.toLowerCase();\n\n    // If caching is enabled and the current searchText is stored in the cache\n    if (!$scope.noCache && cache[term]) {\n      // The results should be handled as same as a normal un-cached request does.\n      handleResults(cache[term]);\n    } else {\n      fetchResults(searchText);\n    }\n\n    ctrl.hidden = shouldHide();\n  }\n\n  /**\n   * Handles the retrieved results by showing them in the autocompletes dropdown.\n   * @param results Retrieved results\n   */\n  function handleResults(results) {\n    ctrl.matches = results;\n    ctrl.hidden  = shouldHide();\n\n    // If loading is in progress, then we'll end the progress. This is needed for example,\n    // when the `clear` button was clicked, because there we always show the loading process, to prevent flashing.\n    if (ctrl.loading) setLoading(false);\n\n    if ($scope.selectOnMatch) selectItemOnMatch();\n\n    positionDropdown();\n    reportMessages(true, ReportType.Count);\n  }\n\n  /**\n   * If there is only one matching item and the search text matches its display value exactly,\n   * automatically select that item.  Note: This function is only called if the user uses the\n   * `md-select-on-match` flag.\n   */\n  function selectItemOnMatch () {\n    var searchText = $scope.searchText,\n        matches    = ctrl.matches,\n        item       = matches[ 0 ];\n    if (matches.length === 1) getDisplayValue(item).then(function (displayValue) {\n      var isMatching = searchText == displayValue;\n      if ($scope.matchInsensitive && !isMatching) {\n        isMatching = searchText.toLowerCase() == displayValue.toLowerCase();\n      }\n\n      if (isMatching) select(0);\n    });\n  }\n\n  /**\n   * Evaluates an attribute expression against the parent scope.\n   * @param {String} attr Name of the attribute to be evaluated.\n   * @param {Object?} locals Properties to be injected into the evaluation context.\n   */\n function evalAttr(attr, locals) {\n    if ($attrs[attr]) {\n      $scope.$parent.$eval($attrs[attr], locals || {});\n    }\n  }\n\n}\n\n})();\n(function(){\n\"use strict\";\n\n\nMdAutocomplete.$inject = [\"$$mdSvgRegistry\"];angular\n    .module('material.components.autocomplete')\n    .directive('mdAutocomplete', MdAutocomplete);\n\n/**\n * @ngdoc directive\n * @name mdAutocomplete\n * @module material.components.autocomplete\n *\n * @description\n * `<md-autocomplete>` is a special input component with a drop-down of all possible matches to a\n *     custom query. This component allows you to provide real-time suggestions as the user types\n *     in the input area.\n *\n * To start, you will need to specify the required parameters and provide a template for your\n *     results. The content inside `md-autocomplete` will be treated as a template.\n *\n * In more complex cases, you may want to include other content such as a message to display when\n *     no matches were found.  You can do this by wrapping your template in `md-item-template` and\n *     adding a tag for `md-not-found`.  An example of this is shown below.\n *\n * To reset the displayed value you must clear both values for `md-search-text` and `md-selected-item`.\n *\n * ### Validation\n *\n * You can use `ng-messages` to include validation the same way that you would normally validate;\n *     however, if you want to replicate a standard input with a floating label, you will have to\n *     do the following:\n *\n * - Make sure that your template is wrapped in `md-item-template`\n * - Add your `ng-messages` code inside of `md-autocomplete`\n * - Add your validation properties to `md-autocomplete` (ie. `required`)\n * - Add a `name` to `md-autocomplete` (to be used on the generated `input`)\n *\n * There is an example below of how this should look.\n *\n * ### Snapping Drop-Down\n *\n * You can cause the autocomplete drop-down to snap to an ancestor element by applying the\n *     `md-autocomplete-snap` attribute to that element. You can also snap to the width of\n *     the `md-autocomplete-snap` element by setting the attribute's value to `width`\n *     (ie. `md-autocomplete-snap=\"width\"`).\n *\n * ### Notes\n *\n * **Autocomplete Dropdown Items Rendering**\n *\n * The `md-autocomplete` uses the the <a ng-href=\"api/directive/mdVirtualRepeatContainer\">VirtualRepeat</a>\n * directive for displaying the results inside of the dropdown.<br/>\n *\n * > When encountering issues regarding the item template please take a look at the\n *   <a ng-href=\"api/directive/mdVirtualRepeatContainer\">VirtualRepeatContainer</a> documentation.\n *\n * **Autocomplete inside of a Virtual Repeat**\n *\n * When using the `md-autocomplete` directive inside of a\n * <a ng-href=\"api/directive/mdVirtualRepeatContainer\">VirtualRepeatContainer</a> the dropdown items might\n * not update properly, because caching of the results is enabled by default.\n *\n * The autocomplete will then show invalid dropdown items, because the VirtualRepeat only updates the\n * scope bindings, rather than re-creating the `md-autocomplete` and the previous cached results will be used.\n *\n * > To avoid such problems ensure that the autocomplete does not cache any results.\n *\n * <hljs lang=\"html\">\n *   <md-autocomplete\n *       md-no-cache=\"true\"\n *       md-selected-item=\"selectedItem\"\n *       md-items=\"item in items\"\n *       md-search-text=\"searchText\"\n *       md-item-text=\"item.display\">\n *     <span>{{ item.display }}</span>\n *   </md-autocomplete>\n * </hljs>\n *\n *\n *\n * @param {expression} md-items An expression in the format of `item in results` to iterate over\n *     matches for your search.<br/><br/>\n *     The `results` expression can be also a function, which returns the results synchronously\n *     or asynchronously (per Promise)\n * @param {expression=} md-selected-item-change An expression to be run each time a new item is\n *     selected\n * @param {expression=} md-search-text-change An expression to be run each time the search text\n *     updates\n * @param {expression=} md-search-text A model to bind the search query text to\n * @param {object=} md-selected-item A model to bind the selected item to\n * @param {expression=} md-item-text An expression that will convert your object to a single string.\n * @param {string=} placeholder Placeholder text that will be forwarded to the input.\n * @param {boolean=} md-no-cache Disables the internal caching that happens in autocomplete\n * @param {boolean=} ng-disabled Determines whether or not to disable the input field\n * @param {boolean=} md-require-match When set to true, the autocomplete will add a validator,\n *     which will evaluate to false, when no item is currently selected.\n * @param {number=} md-min-length Specifies the minimum length of text before autocomplete will\n *     make suggestions\n * @param {number=} md-delay Specifies the amount of time (in milliseconds) to wait before looking\n *     for results\n * @param {boolean=} md-clear-button Whether the clear button for the autocomplete input should show up or not.\n * @param {boolean=} md-autofocus If true, the autocomplete will be automatically focused when a `$mdDialog`,\n *     `$mdBottomsheet` or `$mdSidenav`, which contains the autocomplete, is opening. <br/><br/>\n *     Also the autocomplete will immediately focus the input element.\n * @param {boolean=} md-no-asterisk When present, asterisk will not be appended to the floating label\n * @param {boolean=} md-autoselect If set to true, the first item will be automatically selected\n *     in the dropdown upon open.\n * @param {string=} md-menu-class This will be applied to the dropdown menu for styling\n * @param {string=} md-floating-label This will add a floating label to autocomplete and wrap it in\n *     `md-input-container`\n * @param {string=} md-input-name The name attribute given to the input element to be used with\n *     FormController\n * @param {string=} md-select-on-focus When present the inputs text will be automatically selected\n *     on focus.\n * @param {string=} md-input-id An ID to be added to the input element\n * @param {number=} md-input-minlength The minimum length for the input's value for validation\n * @param {number=} md-input-maxlength The maximum length for the input's value for validation\n * @param {boolean=} md-select-on-match When set, autocomplete will automatically select exact\n *     the item if the search text is an exact match. <br/><br/>\n *     Exact match means that there is only one match showing up.\n * @param {boolean=} md-match-case-insensitive When set and using `md-select-on-match`, autocomplete\n *     will select on case-insensitive match\n * @param {string=} md-escape-options Override escape key logic. Default is `blur clear`.<br/>\n *     Options: `blur | clear`, `none`\n * @param {string=} md-dropdown-items Specifies the maximum amount of items to be shown in\n *     the dropdown.<br/><br/>\n *     When the dropdown doesn't fit into the viewport, the dropdown will shrink\n *     as less as possible.\n * @param {string=} md-dropdown-position Overrides the default dropdown position. Options: `top`, `bottom`.\n * @param {string=} ng-trim If set to false, the search text will be not trimmed automatically.\n *     Defaults to true.\n * @param {string=} ng-pattern Adds the pattern validator to the ngModel of the search text.\n *     [ngPattern Directive](https://docs.angularjs.org/api/ng/directive/ngPattern)\n *\n * @usage\n * ### Basic Example\n * <hljs lang=\"html\">\n *   <md-autocomplete\n *       md-selected-item=\"selectedItem\"\n *       md-search-text=\"searchText\"\n *       md-items=\"item in getMatches(searchText)\"\n *       md-item-text=\"item.display\">\n *     <span md-highlight-text=\"searchText\">{{item.display}}</span>\n *   </md-autocomplete>\n * </hljs>\n *\n * ### Example with \"not found\" message\n * <hljs lang=\"html\">\n * <md-autocomplete\n *     md-selected-item=\"selectedItem\"\n *     md-search-text=\"searchText\"\n *     md-items=\"item in getMatches(searchText)\"\n *     md-item-text=\"item.display\">\n *   <md-item-template>\n *     <span md-highlight-text=\"searchText\">{{item.display}}</span>\n *   </md-item-template>\n *   <md-not-found>\n *     No matches found.\n *   </md-not-found>\n * </md-autocomplete>\n * </hljs>\n *\n * In this example, our code utilizes `md-item-template` and `md-not-found` to specify the\n *     different parts that make up our component.\n *\n * ### Clear button for the input\n * By default, for floating label autocomplete's the clear button is not showing up\n * ([See specs](https://material.google.com/components/text-fields.html#text-fields-auto-complete-text-field))\n *\n * Nevertheless, developers are able to explicitly toggle the clear button for all types of autocomplete's.\n *\n * <hljs lang=\"html\">\n *   <md-autocomplete ... md-clear-button=\"true\"></md-autocomplete>\n *   <md-autocomplete ... md-clear-button=\"false\"></md-autocomplete>\n * </hljs>\n *\n * ### Example with validation\n * <hljs lang=\"html\">\n * <form name=\"autocompleteForm\">\n *   <md-autocomplete\n *       required\n *       md-input-name=\"autocomplete\"\n *       md-selected-item=\"selectedItem\"\n *       md-search-text=\"searchText\"\n *       md-items=\"item in getMatches(searchText)\"\n *       md-item-text=\"item.display\">\n *     <md-item-template>\n *       <span md-highlight-text=\"searchText\">{{item.display}}</span>\n *     </md-item-template>\n *     <div ng-messages=\"autocompleteForm.autocomplete.$error\">\n *       <div ng-message=\"required\">This field is required</div>\n *     </div>\n *   </md-autocomplete>\n * </form>\n * </hljs>\n *\n * In this example, our code utilizes `md-item-template` and `ng-messages` to specify\n *     input validation for the field.\n *\n * ### Asynchronous Results\n * The autocomplete items expression also supports promises, which will resolve with the query results.\n *\n * <hljs lang=\"js\">\n *   function AppController($scope, $http) {\n *     $scope.query = function(searchText) {\n *       return $http\n *         .get(BACKEND_URL + '/items/' + searchText)\n *         .then(function(data) {\n *           // Map the response object to the data object.\n *           return data;\n *         });\n *     };\n *   }\n * </hljs>\n *\n * <hljs lang=\"html\">\n *   <md-autocomplete\n *       md-selected-item=\"selectedItem\"\n *       md-search-text=\"searchText\"\n *       md-items=\"item in query(searchText)\">\n *     <md-item-template>\n *       <span md-highlight-text=\"searchText\">{{item}}</span>\n *     </md-item-template>\n * </md-autocomplete>\n * </hljs>\n *\n */\n\nfunction MdAutocomplete ($$mdSvgRegistry) {\n\n  return {\n    controller:   'MdAutocompleteCtrl',\n    controllerAs: '$mdAutocompleteCtrl',\n    scope:        {\n      inputName:        '@mdInputName',\n      inputMinlength:   '@mdInputMinlength',\n      inputMaxlength:   '@mdInputMaxlength',\n      searchText:       '=?mdSearchText',\n      selectedItem:     '=?mdSelectedItem',\n      itemsExpr:        '@mdItems',\n      itemText:         '&mdItemText',\n      placeholder:      '@placeholder',\n      noCache:          '=?mdNoCache',\n      requireMatch:     '=?mdRequireMatch',\n      selectOnMatch:    '=?mdSelectOnMatch',\n      matchInsensitive: '=?mdMatchCaseInsensitive',\n      itemChange:       '&?mdSelectedItemChange',\n      textChange:       '&?mdSearchTextChange',\n      minLength:        '=?mdMinLength',\n      delay:            '=?mdDelay',\n      autofocus:        '=?mdAutofocus',\n      floatingLabel:    '@?mdFloatingLabel',\n      autoselect:       '=?mdAutoselect',\n      menuClass:        '@?mdMenuClass',\n      inputId:          '@?mdInputId',\n      escapeOptions:    '@?mdEscapeOptions',\n      dropdownItems:    '=?mdDropdownItems',\n      dropdownPosition: '@?mdDropdownPosition',\n      clearButton:      '=?mdClearButton'\n    },\n    compile: function(tElement, tAttrs) {\n      var attributes = ['md-select-on-focus', 'md-no-asterisk', 'ng-trim', 'ng-pattern'];\n      var input = tElement.find('input');\n\n      attributes.forEach(function(attribute) {\n        var attrValue = tAttrs[tAttrs.$normalize(attribute)];\n\n        if (attrValue !== null) {\n          input.attr(attribute, attrValue);\n        }\n      });\n\n      return function(scope, element, attrs, ctrl) {\n        // Retrieve the state of using a md-not-found template by using our attribute, which will\n        // be added to the element in the template function.\n        ctrl.hasNotFound = !!element.attr('md-has-not-found');\n\n        // By default the inset autocomplete should show the clear button when not explicitly overwritten.\n        if (!angular.isDefined(attrs.mdClearButton) && !scope.floatingLabel) {\n          scope.clearButton = true;\n        }\n      }\n    },\n    template:     function (element, attr) {\n      var noItemsTemplate = getNoItemsTemplate(),\n          itemTemplate    = getItemTemplate(),\n          leftover        = element.html(),\n          tabindex        = attr.tabindex;\n\n      // Set our attribute for the link function above which runs later.\n      // We will set an attribute, because otherwise the stored variables will be trashed when\n      // removing the element is hidden while retrieving the template. For example when using ngIf.\n      if (noItemsTemplate) element.attr('md-has-not-found', true);\n\n      // Always set our tabindex of the autocomplete directive to -1, because our input\n      // will hold the actual tabindex.\n      element.attr('tabindex', '-1');\n\n      return '\\\n        <md-autocomplete-wrap\\\n            ng-class=\"{ \\'md-whiteframe-z1\\': !floatingLabel, \\\n                        \\'md-menu-showing\\': !$mdAutocompleteCtrl.hidden, \\\n                        \\'md-show-clear-button\\': !!clearButton }\">\\\n          ' + getInputElement() + '\\\n          ' + getClearButton() + '\\\n          <md-progress-linear\\\n              class=\"' + (attr.mdFloatingLabel ? 'md-inline' : '') + '\"\\\n              ng-if=\"$mdAutocompleteCtrl.loadingIsVisible()\"\\\n              md-mode=\"indeterminate\"></md-progress-linear>\\\n          <md-virtual-repeat-container\\\n              md-auto-shrink\\\n              md-auto-shrink-min=\"1\"\\\n              ng-mouseenter=\"$mdAutocompleteCtrl.listEnter()\"\\\n              ng-mouseleave=\"$mdAutocompleteCtrl.listLeave()\"\\\n              ng-mouseup=\"$mdAutocompleteCtrl.mouseUp()\"\\\n              ng-hide=\"$mdAutocompleteCtrl.hidden\"\\\n              class=\"md-autocomplete-suggestions-container md-whiteframe-z1\"\\\n              ng-class=\"{ \\'md-not-found\\': $mdAutocompleteCtrl.notFoundVisible() }\"\\\n              role=\"presentation\">\\\n            <ul class=\"md-autocomplete-suggestions\"\\\n                ng-class=\"::menuClass\"\\\n                id=\"ul-{{$mdAutocompleteCtrl.id}}\">\\\n              <li md-virtual-repeat=\"item in $mdAutocompleteCtrl.matches\"\\\n                  ng-class=\"{ selected: $index === $mdAutocompleteCtrl.index }\"\\\n                  ng-click=\"$mdAutocompleteCtrl.select($index)\"\\\n                  md-extra-name=\"$mdAutocompleteCtrl.itemName\">\\\n                  ' + itemTemplate + '\\\n                  </li>' + noItemsTemplate + '\\\n            </ul>\\\n          </md-virtual-repeat-container>\\\n        </md-autocomplete-wrap>';\n\n      function getItemTemplate() {\n        var templateTag = element.find('md-item-template').detach(),\n            html = templateTag.length ? templateTag.html() : element.html();\n        if (!templateTag.length) element.empty();\n        return '<md-autocomplete-parent-scope md-autocomplete-replace>' + html + '</md-autocomplete-parent-scope>';\n      }\n\n      function getNoItemsTemplate() {\n        var templateTag = element.find('md-not-found').detach(),\n            template = templateTag.length ? templateTag.html() : '';\n        return template\n            ? '<li ng-if=\"$mdAutocompleteCtrl.notFoundVisible()\"\\\n                         md-autocomplete-parent-scope>' + template + '</li>'\n            : '';\n\n      }\n\n      function getInputElement () {\n        if (attr.mdFloatingLabel) {\n          return '\\\n            <md-input-container ng-if=\"floatingLabel\">\\\n              <label>{{floatingLabel}}</label>\\\n              <input type=\"search\"\\\n                  ' + (tabindex != null ? 'tabindex=\"' + tabindex + '\"' : '') + '\\\n                  id=\"{{ inputId || \\'fl-input-\\' + $mdAutocompleteCtrl.id }}\"\\\n                  name=\"{{inputName}}\"\\\n                  autocomplete=\"off\"\\\n                  ng-required=\"$mdAutocompleteCtrl.isRequired\"\\\n                  ng-readonly=\"$mdAutocompleteCtrl.isReadonly\"\\\n                  ng-minlength=\"inputMinlength\"\\\n                  ng-maxlength=\"inputMaxlength\"\\\n                  ng-disabled=\"$mdAutocompleteCtrl.isDisabled\"\\\n                  ng-model=\"$mdAutocompleteCtrl.scope.searchText\"\\\n                  ng-model-options=\"{ allowInvalid: true }\"\\\n                  ng-keydown=\"$mdAutocompleteCtrl.keydown($event)\"\\\n                  ng-blur=\"$mdAutocompleteCtrl.blur($event)\"\\\n                  ng-focus=\"$mdAutocompleteCtrl.focus($event)\"\\\n                  aria-owns=\"ul-{{$mdAutocompleteCtrl.id}}\"\\\n                  aria-label=\"{{floatingLabel}}\"\\\n                  aria-autocomplete=\"list\"\\\n                  role=\"combobox\"\\\n                  aria-haspopup=\"true\"\\\n                  aria-activedescendant=\"\"\\\n                  aria-expanded=\"{{!$mdAutocompleteCtrl.hidden}}\"/>\\\n              <div md-autocomplete-parent-scope md-autocomplete-replace>' + leftover + '</div>\\\n            </md-input-container>';\n        } else {\n          return '\\\n            <input type=\"search\"\\\n                ' + (tabindex != null ? 'tabindex=\"' + tabindex + '\"' : '') + '\\\n                id=\"{{ inputId || \\'input-\\' + $mdAutocompleteCtrl.id }}\"\\\n                name=\"{{inputName}}\"\\\n                ng-if=\"!floatingLabel\"\\\n                autocomplete=\"off\"\\\n                ng-required=\"$mdAutocompleteCtrl.isRequired\"\\\n                ng-disabled=\"$mdAutocompleteCtrl.isDisabled\"\\\n                ng-readonly=\"$mdAutocompleteCtrl.isReadonly\"\\\n                ng-minlength=\"inputMinlength\"\\\n                ng-maxlength=\"inputMaxlength\"\\\n                ng-model=\"$mdAutocompleteCtrl.scope.searchText\"\\\n                ng-keydown=\"$mdAutocompleteCtrl.keydown($event)\"\\\n                ng-blur=\"$mdAutocompleteCtrl.blur($event)\"\\\n                ng-focus=\"$mdAutocompleteCtrl.focus($event)\"\\\n                placeholder=\"{{placeholder}}\"\\\n                aria-owns=\"ul-{{$mdAutocompleteCtrl.id}}\"\\\n                aria-label=\"{{placeholder}}\"\\\n                aria-autocomplete=\"list\"\\\n                role=\"combobox\"\\\n                aria-haspopup=\"true\"\\\n                aria-activedescendant=\"\"\\\n                aria-expanded=\"{{!$mdAutocompleteCtrl.hidden}}\"/>';\n        }\n      }\n\n      function getClearButton() {\n        return '' +\n          '<button ' +\n              'type=\"button\" ' +\n              'aria-label=\"Clear Input\" ' +\n              'tabindex=\"-1\" ' +\n              'ng-if=\"clearButton && $mdAutocompleteCtrl.scope.searchText && !$mdAutocompleteCtrl.isDisabled\" ' +\n              'ng-click=\"$mdAutocompleteCtrl.clear($event)\">' +\n            '<md-icon md-svg-src=\"' + $$mdSvgRegistry.mdClose + '\"></md-icon>' +\n          '</button>';\n        }\n    }\n  };\n}\n\n})();\n(function(){\n\"use strict\";\n\n\nMdAutocompleteItemScopeDirective.$inject = [\"$compile\", \"$mdUtil\"];angular\n  .module('material.components.autocomplete')\n  .directive('mdAutocompleteParentScope', MdAutocompleteItemScopeDirective);\n\nfunction MdAutocompleteItemScopeDirective($compile, $mdUtil) {\n  return {\n    restrict: 'AE',\n    compile: compile,\n    terminal: true,\n    transclude: 'element'\n  };\n\n  function compile(tElement, tAttr, transclude) {\n    return function postLink(scope, element, attr) {\n      var ctrl = scope.$mdAutocompleteCtrl;\n      var newScope = ctrl.parent.$new();\n      var itemName = ctrl.itemName;\n\n      // Watch for changes to our scope's variables and copy them to the new scope\n      watchVariable('$index', '$index');\n      watchVariable('item', itemName);\n\n      // Ensure that $digest calls on our scope trigger $digest on newScope.\n      connectScopes();\n\n      // Link the element against newScope.\n      transclude(newScope, function(clone) {\n        element.after(clone);\n      });\n\n      /**\n       * Creates a watcher for variables that are copied from the parent scope\n       * @param variable\n       * @param alias\n       */\n      function watchVariable(variable, alias) {\n        newScope[alias] = scope[variable];\n\n        scope.$watch(variable, function(value) {\n          $mdUtil.nextTick(function() {\n            newScope[alias] = value;\n          });\n        });\n      }\n\n      /**\n       * Creates watchers on scope and newScope that ensure that for any\n       * $digest of scope, newScope is also $digested.\n       */\n      function connectScopes() {\n        var scopeDigesting = false;\n        var newScopeDigesting = false;\n\n        scope.$watch(function() {\n          if (newScopeDigesting || scopeDigesting) {\n            return;\n          }\n\n          scopeDigesting = true;\n          scope.$$postDigest(function() {\n            if (!newScopeDigesting) {\n              newScope.$digest();\n            }\n\n            scopeDigesting = newScopeDigesting = false;\n          });\n        });\n\n        newScope.$watch(function() {\n          newScopeDigesting = true;\n        });\n      }\n    };\n  }\n}\n})();\n(function(){\n\"use strict\";\n\n\nMdHighlightCtrl.$inject = [\"$scope\", \"$element\", \"$attrs\"];angular\n    .module('material.components.autocomplete')\n    .controller('MdHighlightCtrl', MdHighlightCtrl);\n\nfunction MdHighlightCtrl ($scope, $element, $attrs) {\n  this.$scope = $scope;\n  this.$element = $element;\n  this.$attrs = $attrs;\n\n  // Cache the Regex to avoid rebuilding each time.\n  this.regex = null;\n}\n\nMdHighlightCtrl.prototype.init = function(unsafeTermFn, unsafeContentFn) {\n\n  this.flags = this.$attrs.mdHighlightFlags || '';\n\n  this.unregisterFn = this.$scope.$watch(function($scope) {\n    return {\n      term: unsafeTermFn($scope),\n      contentText: unsafeContentFn($scope)\n    };\n  }.bind(this), this.onRender.bind(this), true);\n\n  this.$element.on('$destroy', this.unregisterFn);\n};\n\n/**\n * Triggered once a new change has been recognized and the highlighted\n * text needs to be updated.\n */\nMdHighlightCtrl.prototype.onRender = function(state, prevState) {\n\n  var contentText = state.contentText;\n\n  /* Update the regex if it's outdated, because we don't want to rebuilt it constantly. */\n  if (this.regex === null || state.term !== prevState.term) {\n    this.regex = this.createRegex(state.term, this.flags);\n  }\n\n  /* If a term is available apply the regex to the content */\n  if (state.term) {\n    this.applyRegex(contentText);\n  } else {\n    this.$element.text(contentText);\n  }\n\n};\n\n/**\n * Decomposes the specified text into different tokens (whether match or not).\n * Breaking down the string guarantees proper XSS protection due to the native browser\n * escaping of unsafe text.\n */\nMdHighlightCtrl.prototype.applyRegex = function(text) {\n  var tokens = this.resolveTokens(text);\n\n  this.$element.empty();\n\n  tokens.forEach(function (token) {\n\n    if (token.isMatch) {\n      var tokenEl = angular.element('<span class=\"highlight\">').text(token.text);\n\n      this.$element.append(tokenEl);\n    } else {\n      this.$element.append(document.createTextNode(token));\n    }\n\n  }.bind(this));\n\n};\n\n  /**\n * Decomposes the specified text into different tokens by running the regex against the text.\n */\nMdHighlightCtrl.prototype.resolveTokens = function(string) {\n  var tokens = [];\n  var lastIndex = 0;\n\n  // Use replace here, because it supports global and single regular expressions at same time.\n  string.replace(this.regex, function(match, index) {\n    appendToken(lastIndex, index);\n\n    tokens.push({\n      text: match,\n      isMatch: true\n    });\n\n    lastIndex = index + match.length;\n  });\n\n  // Append the missing text as a token.\n  appendToken(lastIndex);\n\n  return tokens;\n\n  function appendToken(from, to) {\n    var targetText = string.slice(from, to);\n    targetText && tokens.push(targetText);\n  }\n};\n\n/** Creates a regex for the specified text with the given flags. */\nMdHighlightCtrl.prototype.createRegex = function(term, flags) {\n  var startFlag = '', endFlag = '';\n  var regexTerm = this.sanitizeRegex(term);\n\n  if (flags.indexOf('^') >= 0) startFlag = '^';\n  if (flags.indexOf('$') >= 0) endFlag = '$';\n\n  return new RegExp(startFlag + regexTerm + endFlag, flags.replace(/[$\\^]/g, ''));\n};\n\n/** Sanitizes a regex by removing all common RegExp identifiers */\nMdHighlightCtrl.prototype.sanitizeRegex = function(term) {\n  return term && term.toString().replace(/[\\\\\\^\\$\\*\\+\\?\\.\\(\\)\\|\\{}\\[\\]]/g, '\\\\$&');\n};\n\n})();\n(function(){\n\"use strict\";\n\n\nMdHighlight.$inject = [\"$interpolate\", \"$parse\"];angular\n    .module('material.components.autocomplete')\n    .directive('mdHighlightText', MdHighlight);\n\n/**\n * @ngdoc directive\n * @name mdHighlightText\n * @module material.components.autocomplete\n *\n * @description\n * The `md-highlight-text` directive allows you to specify text that should be highlighted within\n *     an element.  Highlighted text will be wrapped in `<span class=\"highlight\"></span>` which can\n *     be styled through CSS.  Please note that child elements may not be used with this directive.\n *\n * @param {string} md-highlight-text A model to be searched for\n * @param {string=} md-highlight-flags A list of flags (loosely based on JavaScript RexExp flags).\n * #### **Supported flags**:\n * - `g`: Find all matches within the provided text\n * - `i`: Ignore case when searching for matches\n * - `$`: Only match if the text ends with the search term\n * - `^`: Only match if the text begins with the search term\n *\n * @usage\n * <hljs lang=\"html\">\n * <input placeholder=\"Enter a search term...\" ng-model=\"searchTerm\" type=\"text\" />\n * <ul>\n *   <li ng-repeat=\"result in results\" md-highlight-text=\"searchTerm\">\n *     {{result.text}}\n *   </li>\n * </ul>\n * </hljs>\n */\n\nfunction MdHighlight ($interpolate, $parse) {\n  return {\n    terminal: true,\n    controller: 'MdHighlightCtrl',\n    compile: function mdHighlightCompile(tElement, tAttr) {\n      var termExpr = $parse(tAttr.mdHighlightText);\n      var unsafeContentExpr = $interpolate(tElement.html());\n\n      return function mdHighlightLink(scope, element, attr, ctrl) {\n        ctrl.init(termExpr, unsafeContentExpr);\n      };\n    }\n  };\n}\n\n})();\n(function(){\n\"use strict\";\n\n\nMdChipCtrl.$inject = [\"$scope\", \"$element\", \"$mdConstant\", \"$timeout\", \"$mdUtil\"];angular\n  .module('material.components.chips')\n  .controller('MdChipCtrl', MdChipCtrl);\n\n/**\n * Controller for the MdChip component. Responsible for handling keyboard\n * events and editting the chip if needed.\n *\n * @param $scope\n * @param $element\n * @param $mdConstant\n * @param $timeout\n * @param $mdUtil\n * @constructor\n */\nfunction MdChipCtrl ($scope, $element, $mdConstant, $timeout, $mdUtil) {\n  /**\n   * @type {$scope}\n   */\n  this.$scope = $scope;\n\n  /**\n   * @type {$element}\n   */\n  this.$element = $element;\n\n  /**\n   * @type {$mdConstant}\n   */\n  this.$mdConstant = $mdConstant;\n\n  /**\n   * @type {$timeout}\n   */\n  this.$timeout = $timeout;\n\n  /**\n   * @type {$mdUtil}\n   */\n  this.$mdUtil = $mdUtil;\n\n  /**\n   * @type {boolean}\n   */\n  this.isEditting = false;\n\n  /**\n   * @type {MdChipsCtrl}\n   */\n  this.parentController = undefined;\n\n  /**\n   * @type {boolean}\n   */\n  this.enableChipEdit = false;\n}\n\n\n/**\n * @param {MdChipsCtrl} controller\n */\nMdChipCtrl.prototype.init = function(controller) {\n  this.parentController = controller;\n  this.enableChipEdit = this.parentController.enableChipEdit;\n\n  if (this.enableChipEdit) {\n    this.$element.on('keydown', this.chipKeyDown.bind(this));\n    this.$element.on('mousedown', this.chipMouseDown.bind(this));\n    this.getChipContent().addClass('_md-chip-content-edit-is-enabled');\n  }\n};\n\n\n/**\n * @return {Object}\n */\nMdChipCtrl.prototype.getChipContent = function() {\n  var chipContents = this.$element[0].getElementsByClassName('md-chip-content');\n  return angular.element(chipContents[0]);\n};\n\n\n/**\n * @return {Object}\n */\nMdChipCtrl.prototype.getContentElement = function() {\n  return angular.element(this.getChipContent().children()[0]);\n};\n\n\n/**\n * @return {number}\n */\nMdChipCtrl.prototype.getChipIndex = function() {\n  return parseInt(this.$element.attr('index'));\n};\n\n\n/**\n * Presents an input element to edit the contents of the chip.\n */\nMdChipCtrl.prototype.goOutOfEditMode = function() {\n  if (!this.isEditting) return;\n\n  this.isEditting = false;\n  this.$element.removeClass('_md-chip-editing');\n  this.getChipContent()[0].contentEditable = 'false';\n  var chipIndex = this.getChipIndex();\n\n  var content = this.getContentElement().text();\n  if (content) {\n    this.parentController.updateChipContents(\n        chipIndex,\n        this.getContentElement().text()\n    );\n\n    this.$mdUtil.nextTick(function() {\n      if (this.parentController.selectedChip === chipIndex) {\n        this.parentController.focusChip(chipIndex);\n      }\n    }.bind(this));\n  } else {\n    this.parentController.removeChipAndFocusInput(chipIndex);\n  }\n};\n\n\n/**\n * Given an HTML element. Selects contents of it.\n * @param node\n */\nMdChipCtrl.prototype.selectNodeContents = function(node) {\n  var range, selection;\n  if (document.body.createTextRange) {\n    range = document.body.createTextRange();\n    range.moveToElementText(node);\n    range.select();\n  } else if (window.getSelection) {\n    selection = window.getSelection();\n    range = document.createRange();\n    range.selectNodeContents(node);\n    selection.removeAllRanges();\n    selection.addRange(range);\n  }\n};\n\n\n/**\n * Presents an input element to edit the contents of the chip.\n */\nMdChipCtrl.prototype.goInEditMode = function() {\n  this.isEditting = true;\n  this.$element.addClass('_md-chip-editing');\n  this.getChipContent()[0].contentEditable = 'true';\n  this.getChipContent().on('blur', function() {\n    this.goOutOfEditMode();\n  }.bind(this));\n\n  this.selectNodeContents(this.getChipContent()[0]);\n};\n\n\n/**\n * Handles the keydown event on the chip element. If enable-chip-edit attribute is\n * set to true, space or enter keys can trigger going into edit mode. Enter can also\n * trigger submitting if the chip is already being edited.\n * @param event\n */\nMdChipCtrl.prototype.chipKeyDown = function(event) {\n  if (!this.isEditting &&\n    (event.keyCode === this.$mdConstant.KEY_CODE.ENTER ||\n    event.keyCode === this.$mdConstant.KEY_CODE.SPACE)) {\n    event.preventDefault();\n    this.goInEditMode();\n  } else if (this.isEditting &&\n    event.keyCode === this.$mdConstant.KEY_CODE.ENTER) {\n    event.preventDefault();\n    this.goOutOfEditMode();\n  }\n};\n\n\n/**\n * Handles the double click event\n */\nMdChipCtrl.prototype.chipMouseDown = function() {\n  if(this.getChipIndex() == this.parentController.selectedChip &&\n    this.enableChipEdit &&\n    !this.isEditting) {\n    this.goInEditMode();\n  }\n};\n\n})();\n(function(){\n\"use strict\";\n\n\nMdChip.$inject = [\"$mdTheming\", \"$mdUtil\", \"$compile\", \"$timeout\"];angular\n  .module('material.components.chips')\n  .directive('mdChip', MdChip);\n\n/**\n * @ngdoc directive\n * @name mdChip\n * @module material.components.chips\n *\n * @description\n * `<md-chip>` is a component used within `<md-chips>` and is responsible for rendering individual\n * chips.\n *\n *\n * @usage\n * <hljs lang=\"html\">\n *   <md-chip>{{$chip}}</md-chip>\n * </hljs>\n *\n */\n\n// This hint text is hidden within a chip but used by screen readers to\n// inform the user how they can interact with a chip.\nvar DELETE_HINT_TEMPLATE = '\\\n    <span ng-if=\"!$mdChipsCtrl.readonly\" class=\"md-visually-hidden\">\\\n      {{$mdChipsCtrl.deleteHint}}\\\n    </span>';\n\n/**\n * MDChip Directive Definition\n *\n * @param $mdTheming\n * @param $mdUtil\n * @ngInject\n */\nfunction MdChip($mdTheming, $mdUtil, $compile, $timeout) {\n  var deleteHintTemplate = $mdUtil.processTemplate(DELETE_HINT_TEMPLATE);\n\n  return {\n    restrict: 'E',\n    require: ['^?mdChips', 'mdChip'],\n    link: postLink,\n    controller: 'MdChipCtrl'\n  };\n\n  function postLink(scope, element, attr, ctrls) {\n    var chipsController = ctrls.shift();\n    var chipController = ctrls.shift();\n    var chipContentElement = angular.element(element[0].querySelector('.md-chip-content'));\n\n    $mdTheming(element);\n\n    if (chipsController) {\n      chipController.init(chipsController);\n\n      // Append our delete hint to the div.md-chip-content (which does not exist at compile time)\n      chipContentElement.append($compile(deleteHintTemplate)(scope));\n\n      // When a chip is blurred, make sure to unset (or reset) the selected chip so that tabbing\n      // through elements works properly\n      chipContentElement.on('blur', function() {\n        chipsController.resetSelectedChip();\n        chipsController.$scope.$applyAsync();\n      });\n    }\n\n    // Use $timeout to ensure we run AFTER the element has been added to the DOM so we can focus it.\n    $timeout(function() {\n      if (!chipsController) {\n        return;\n      }\n\n      if (chipsController.shouldFocusLastChip) {\n        chipsController.focusLastChipThenInput();\n      }\n    });\n  }\n}\n\n})();\n(function(){\n\"use strict\";\n\n\nMdChipRemove.$inject = [\"$timeout\"];angular\n    .module('material.components.chips')\n    .directive('mdChipRemove', MdChipRemove);\n\n/**\n * @ngdoc directive\n * @name mdChipRemove\n * @restrict A\n * @module material.components.chips\n *\n * @description\n * Designates an element to be used as the delete button for a chip. <br/>\n * This element is passed as a child of the `md-chips` element.\n *\n * The designated button will be just appended to the chip and removes the given chip on click.<br/>\n * By default the button is not being styled by the `md-chips` component.\n *\n * @usage\n * <hljs lang=\"html\">\n *   <md-chips>\n *     <button md-chip-remove=\"\">\n *       <md-icon md-svg-icon=\"md-close\"></md-icon>\n *     </button>\n *   </md-chips>\n * </hljs>\n */\n\n\n/**\n * MdChipRemove Directive Definition.\n * \n * @param $timeout\n * @returns {{restrict: string, require: string[], link: Function, scope: boolean}}\n * @constructor\n */\nfunction MdChipRemove ($timeout) {\n  return {\n    restrict: 'A',\n    require: '^mdChips',\n    scope: false,\n    link: postLink\n  };\n\n  function postLink(scope, element, attr, ctrl) {\n    element.on('click', function(event) {\n      scope.$apply(function() {\n        ctrl.removeChip(scope.$$replacedScope.$index);\n      });\n    });\n\n    // Child elements aren't available until after a $timeout tick as they are hidden by an\n    // `ng-if`. see http://goo.gl/zIWfuw\n    $timeout(function() {\n      element.attr({ tabindex: -1, 'aria-hidden': true });\n      element.find('button').attr('tabindex', '-1');\n    });\n  }\n}\n\n})();\n(function(){\n\"use strict\";\n\n\nMdChipTransclude.$inject = [\"$compile\"];angular\n    .module('material.components.chips')\n    .directive('mdChipTransclude', MdChipTransclude);\n\nfunction MdChipTransclude ($compile) {\n  return {\n    restrict: 'EA',\n    terminal: true,\n    link: link,\n    scope: false\n  };\n  function link (scope, element, attr) {\n    var ctrl = scope.$parent.$mdChipsCtrl,\n        newScope = ctrl.parent.$new(false, ctrl.parent);\n    newScope.$$replacedScope = scope;\n    newScope.$chip = scope.$chip;\n    newScope.$index = scope.$index;\n    newScope.$mdChipsCtrl = ctrl;\n\n    var newHtml = ctrl.$scope.$eval(attr.mdChipTransclude);\n\n    element.html(newHtml);\n    $compile(element.contents())(newScope);\n  }\n}\n\n})();\n(function(){\n\"use strict\";\n\n/**\n * The default chip append delay.\n *\n * @type {number}\n */\nMdChipsCtrl.$inject = [\"$scope\", \"$attrs\", \"$mdConstant\", \"$log\", \"$element\", \"$timeout\", \"$mdUtil\"];\nvar DEFAULT_CHIP_APPEND_DELAY = 300;\n\nangular\n    .module('material.components.chips')\n    .controller('MdChipsCtrl', MdChipsCtrl);\n\n/**\n * Controller for the MdChips component. Responsible for adding to and\n * removing from the list of chips, marking chips as selected, and binding to\n * the models of various input components.\n *\n * @param $scope\n * @param $attrs\n * @param $mdConstant\n * @param $log\n * @param $element\n * @param $timeout\n * @param $mdUtil\n * @constructor\n */\nfunction MdChipsCtrl ($scope, $attrs, $mdConstant, $log, $element, $timeout, $mdUtil) {\n  /** @type {$timeout} **/\n  this.$timeout = $timeout;\n\n  /** @type {Object} */\n  this.$mdConstant = $mdConstant;\n\n  /** @type {angular.$scope} */\n  this.$scope = $scope;\n\n  /** @type {angular.$scope} */\n  this.parent = $scope.$parent;\n\n  /** @type {$mdUtil} */\n  this.$mdUtil = $mdUtil;\n\n  /** @type {$log} */\n  this.$log = $log;\n\n  /** @type {$element} */\n  this.$element = $element;\n\n  /** @type {$attrs} */\n  this.$attrs = $attrs;\n\n  /** @type {angular.NgModelController} */\n  this.ngModelCtrl = null;\n\n  /** @type {angular.NgModelController} */\n  this.userInputNgModelCtrl = null;\n\n  /** @type {MdAutocompleteCtrl} */\n  this.autocompleteCtrl = null;\n\n  /** @type {Element} */\n  this.userInputElement = null;\n\n  /** @type {Array.<Object>} */\n  this.items = [];\n\n  /** @type {number} */\n  this.selectedChip = -1;\n\n  /** @type {string} */\n  this.enableChipEdit = $mdUtil.parseAttributeBoolean($attrs.mdEnableChipEdit);\n\n  /** @type {string} */\n  this.addOnBlur = $mdUtil.parseAttributeBoolean($attrs.mdAddOnBlur);\n\n  /**\n   * The text to be used as the aria-label for the input.\n   * @type {string}\n   */\n  this.inputAriaLabel = 'Chips input.';\n\n  /**\n   * Hidden hint text to describe the chips container. Used to give context to screen readers when\n   * the chips are readonly and the input cannot be selected.\n   *\n   * @type {string}\n   */\n  this.containerHint = 'Chips container. Use arrow keys to select chips.';\n\n  /**\n   * Hidden hint text for how to delete a chip. Used to give context to screen readers.\n   * @type {string}\n   */\n  this.deleteHint = 'Press delete to remove this chip.';\n\n  /**\n   * Hidden label for the delete button. Used to give context to screen readers.\n   * @type {string}\n   */\n  this.deleteButtonLabel = 'Remove';\n\n  /**\n   * Model used by the input element.\n   * @type {string}\n   */\n  this.chipBuffer = '';\n\n  /**\n   * Whether to use the transformChip expression to transform the chip buffer\n   * before appending it to the list.\n   * @type {boolean}\n   */\n  this.useTransformChip = false;\n\n  /**\n   * Whether to use the onAdd expression to notify of chip additions.\n   * @type {boolean}\n   */\n  this.useOnAdd = false;\n\n  /**\n   * Whether to use the onRemove expression to notify of chip removals.\n   * @type {boolean}\n   */\n  this.useOnRemove = false;\n\n  /**\n   * The ID of the chips wrapper which is used to build unique IDs for the chips and the aria-owns\n   * attribute.\n   *\n   * Defaults to '_md-chips-wrapper-' plus a unique number.\n   *\n   * @type {string}\n   */\n  this.wrapperId = '';\n\n  /**\n   * Array of unique numbers which will be auto-generated any time the items change, and is used to\n   * create unique IDs for the aria-owns attribute.\n   *\n   * @type {Array}\n   */\n  this.contentIds = [];\n\n  /**\n   * The index of the chip that should have it's tabindex property set to 0 so it is selectable\n   * via the keyboard.\n   *\n   * @type {int}\n   */\n  this.ariaTabIndex = null;\n\n  /**\n   * After appending a chip, the chip will be focused for this number of milliseconds before the\n   * input is refocused.\n   *\n   * **Note:** This is **required** for compatibility with certain screen readers in order for\n   * them to properly allow keyboard access.\n   *\n   * @type {number}\n   */\n  this.chipAppendDelay = DEFAULT_CHIP_APPEND_DELAY;\n\n  this.init();\n}\n\n/**\n * Initializes variables and sets up watchers\n */\nMdChipsCtrl.prototype.init = function() {\n  var ctrl = this;\n\n  // Set the wrapper ID\n  ctrl.wrapperId = '_md-chips-wrapper-' + ctrl.$mdUtil.nextUid();\n\n  // Setup a watcher which manages the role and aria-owns attributes\n  ctrl.$scope.$watchCollection('$mdChipsCtrl.items', function() {\n    // Make sure our input and wrapper have the correct ARIA attributes\n    ctrl.setupInputAria();\n    ctrl.setupWrapperAria();\n  });\n\n  ctrl.$attrs.$observe('mdChipAppendDelay', function(newValue) {\n    ctrl.chipAppendDelay = parseInt(newValue) || DEFAULT_CHIP_APPEND_DELAY;\n  });\n};\n\n/**\n * If we have an input, ensure it has the appropriate ARIA attributes.\n */\nMdChipsCtrl.prototype.setupInputAria = function() {\n  var input = this.$element.find('input');\n\n  // If we have no input, just return\n  if (!input) {\n    return;\n  }\n\n  input.attr('role', 'textbox');\n  input.attr('aria-multiline', true);\n};\n\n/**\n * Ensure our wrapper has the appropriate ARIA attributes.\n */\nMdChipsCtrl.prototype.setupWrapperAria = function() {\n  var ctrl = this,\n      wrapper = this.$element.find('md-chips-wrap');\n\n  if (this.items && this.items.length) {\n    // Dynamically add the listbox role on every change because it must be removed when there are\n    // no items.\n    wrapper.attr('role', 'listbox');\n\n    // Generate some random (but unique) IDs for each chip\n    this.contentIds = this.items.map(function() {\n      return ctrl.wrapperId + '-chip-' + ctrl.$mdUtil.nextUid();\n    });\n\n    // Use the contentIDs above to generate the aria-owns attribute\n    wrapper.attr('aria-owns', this.contentIds.join(' '));\n  } else {\n    // If we have no items, then the role and aria-owns attributes MUST be removed\n    wrapper.removeAttr('role');\n    wrapper.removeAttr('aria-owns');\n  }\n};\n\n/**\n * Handles the keydown event on the input element: by default <enter> appends\n * the buffer to the chip list, while backspace removes the last chip in the\n * list if the current buffer is empty.\n * @param event\n */\nMdChipsCtrl.prototype.inputKeydown = function(event) {\n  var chipBuffer = this.getChipBuffer();\n\n  // If we have an autocomplete, and it handled the event, we have nothing to do\n  if (this.autocompleteCtrl && event.isDefaultPrevented && event.isDefaultPrevented()) {\n    return;\n  }\n\n  if (event.keyCode === this.$mdConstant.KEY_CODE.BACKSPACE) {\n    // Only select and focus the previous chip, if the current caret position of the\n    // input element is at the beginning.\n    if (this.getCursorPosition(event.target) !== 0) {\n      return;\n    }\n\n    event.preventDefault();\n    event.stopPropagation();\n\n    if (this.items.length) {\n      this.selectAndFocusChipSafe(this.items.length - 1);\n    }\n\n    return;\n  }\n\n  // By default <enter> appends the buffer to the chip list.\n  if (!this.separatorKeys || this.separatorKeys.length < 1) {\n    this.separatorKeys = [this.$mdConstant.KEY_CODE.ENTER];\n  }\n\n  // Support additional separator key codes in an array of `md-separator-keys`.\n  if (this.separatorKeys.indexOf(event.keyCode) !== -1) {\n    if ((this.autocompleteCtrl && this.requireMatch) || !chipBuffer) return;\n    event.preventDefault();\n\n    // Only append the chip and reset the chip buffer if the max chips limit isn't reached.\n    if (this.hasMaxChipsReached()) return;\n\n    this.appendChip(chipBuffer.trim());\n    this.resetChipBuffer();\n\n    return false;\n  }\n};\n\n/**\n * Returns the cursor position of the specified input element.\n * @param element HTMLInputElement\n * @returns {Number} Cursor Position of the input.\n */\nMdChipsCtrl.prototype.getCursorPosition = function(element) {\n  /*\n   * Figure out whether the current input for the chips buffer is valid for using\n   * the selectionStart / end property to retrieve the cursor position.\n   * Some browsers do not allow the use of those attributes, on different input types.\n   */\n  try {\n    if (element.selectionStart === element.selectionEnd) {\n      return element.selectionStart;\n    }\n  } catch (e) {\n    if (!element.value) {\n      return 0;\n    }\n  }\n};\n\n\n/**\n * Updates the content of the chip at given index\n * @param chipIndex\n * @param chipContents\n */\nMdChipsCtrl.prototype.updateChipContents = function(chipIndex, chipContents){\n  if(chipIndex >= 0 && chipIndex < this.items.length) {\n    this.items[chipIndex] = chipContents;\n    this.ngModelCtrl.$setDirty();\n  }\n};\n\n\n/**\n * Returns true if a chip is currently being edited. False otherwise.\n * @return {boolean}\n */\nMdChipsCtrl.prototype.isEditingChip = function() {\n  return !!this.$element[0].querySelector('._md-chip-editing');\n};\n\n\nMdChipsCtrl.prototype.isRemovable = function() {\n  // Return false if we have static chips\n  if (!this.ngModelCtrl) {\n    return false;\n  }\n\n  return this.readonly ? this.removable :\n         angular.isDefined(this.removable) ? this.removable : true;\n};\n\n/**\n * Handles the keydown event on the chip elements: backspace removes the selected chip, arrow\n * keys switch which chips is active\n * @param event\n */\nMdChipsCtrl.prototype.chipKeydown = function (event) {\n  if (this.getChipBuffer()) return;\n  if (this.isEditingChip()) return;\n\n  switch (event.keyCode) {\n    case this.$mdConstant.KEY_CODE.BACKSPACE:\n    case this.$mdConstant.KEY_CODE.DELETE:\n      if (this.selectedChip < 0) return;\n      event.preventDefault();\n      // Cancel the delete action only after the event cancel. Otherwise the page will go back.\n      if (!this.isRemovable()) return;\n      this.removeAndSelectAdjacentChip(this.selectedChip);\n      break;\n    case this.$mdConstant.KEY_CODE.LEFT_ARROW:\n      event.preventDefault();\n      // By default, allow selection of -1 which will focus the input; if we're readonly, don't go\n      // below 0\n      if (this.selectedChip < 0 || (this.readonly && this.selectedChip == 0)) {\n        this.selectedChip = this.items.length;\n      }\n      if (this.items.length) this.selectAndFocusChipSafe(this.selectedChip - 1);\n      break;\n    case this.$mdConstant.KEY_CODE.RIGHT_ARROW:\n      event.preventDefault();\n      this.selectAndFocusChipSafe(this.selectedChip + 1);\n      break;\n    case this.$mdConstant.KEY_CODE.ESCAPE:\n    case this.$mdConstant.KEY_CODE.TAB:\n      if (this.selectedChip < 0) return;\n      event.preventDefault();\n      this.onFocus();\n      break;\n  }\n};\n\n/**\n * Get the input's placeholder - uses `placeholder` when list is empty and `secondary-placeholder`\n * when the list is non-empty. If `secondary-placeholder` is not provided, `placeholder` is used\n * always.\n */\nMdChipsCtrl.prototype.getPlaceholder = function() {\n  // Allow `secondary-placeholder` to be blank.\n  var useSecondary = (this.items && this.items.length &&\n      (this.secondaryPlaceholder == '' || this.secondaryPlaceholder));\n  return useSecondary ? this.secondaryPlaceholder : this.placeholder;\n};\n\n/**\n * Removes chip at {@code index} and selects the adjacent chip.\n * @param index\n */\nMdChipsCtrl.prototype.removeAndSelectAdjacentChip = function(index) {\n  var self = this;\n  var selIndex = self.getAdjacentChipIndex(index);\n  var wrap = this.$element[0].querySelector('md-chips-wrap');\n  var chip = this.$element[0].querySelector('md-chip[index=\"' + index + '\"]');\n\n  self.removeChip(index);\n\n  // The dobule-timeout is currently necessary to ensure that the DOM has finalized and the select()\n  // will find the proper chip since the selection is index-based.\n  //\n  // TODO: Investigate calling from within chip $scope.$on('$destroy') to reduce/remove timeouts\n  self.$timeout(function() {\n    self.$timeout(function() {\n      self.selectAndFocusChipSafe(selIndex);\n    });\n  });\n};\n\n/**\n * Sets the selected chip index to -1.\n */\nMdChipsCtrl.prototype.resetSelectedChip = function() {\n  this.selectedChip = -1;\n  this.ariaTabIndex = null;\n};\n\n/**\n * Gets the index of an adjacent chip to select after deletion. Adjacency is\n * determined as the next chip in the list, unless the target chip is the\n * last in the list, then it is the chip immediately preceding the target. If\n * there is only one item in the list, -1 is returned (select none).\n * The number returned is the index to select AFTER the target has been\n * removed.\n * If the current chip is not selected, then -1 is returned to select none.\n */\nMdChipsCtrl.prototype.getAdjacentChipIndex = function(index) {\n  var len = this.items.length - 1;\n  return (len == 0) ? -1 :\n      (index == len) ? index -1 : index;\n};\n\n/**\n * Append the contents of the buffer to the chip list. This method will first\n * call out to the md-transform-chip method, if provided.\n *\n * @param newChip\n */\nMdChipsCtrl.prototype.appendChip = function(newChip) {\n  this.shouldFocusLastChip = true;\n  if (this.useTransformChip && this.transformChip) {\n    var transformedChip = this.transformChip({'$chip': newChip});\n\n    // Check to make sure the chip is defined before assigning it, otherwise, we'll just assume\n    // they want the string version.\n    if (angular.isDefined(transformedChip)) {\n      newChip = transformedChip;\n    }\n  }\n\n  // If items contains an identical object to newChip, do not append\n  if (angular.isObject(newChip)){\n    var identical = this.items.some(function(item){\n      return angular.equals(newChip, item);\n    });\n    if (identical) return;\n  }\n\n  // Check for a null (but not undefined), or existing chip and cancel appending\n  if (newChip == null || this.items.indexOf(newChip) + 1) return;\n\n  // Append the new chip onto our list\n  var length = this.items.push(newChip);\n  var index = length - 1;\n\n  // Update model validation\n  this.ngModelCtrl.$setDirty();\n  this.validateModel();\n\n  // If they provide the md-on-add attribute, notify them of the chip addition\n  if (this.useOnAdd && this.onAdd) {\n    this.onAdd({ '$chip': newChip, '$index': index });\n  }\n};\n\n/**\n * Sets whether to use the md-transform-chip expression. This expression is\n * bound to scope and controller in {@code MdChipsDirective} as\n * {@code transformChip}. Due to the nature of directive scope bindings, the\n * controller cannot know on its own/from the scope whether an expression was\n * actually provided.\n */\nMdChipsCtrl.prototype.useTransformChipExpression = function() {\n  this.useTransformChip = true;\n};\n\n/**\n * Sets whether to use the md-on-add expression. This expression is\n * bound to scope and controller in {@code MdChipsDirective} as\n * {@code onAdd}. Due to the nature of directive scope bindings, the\n * controller cannot know on its own/from the scope whether an expression was\n * actually provided.\n */\nMdChipsCtrl.prototype.useOnAddExpression = function() {\n  this.useOnAdd = true;\n};\n\n/**\n * Sets whether to use the md-on-remove expression. This expression is\n * bound to scope and controller in {@code MdChipsDirective} as\n * {@code onRemove}. Due to the nature of directive scope bindings, the\n * controller cannot know on its own/from the scope whether an expression was\n * actually provided.\n */\nMdChipsCtrl.prototype.useOnRemoveExpression = function() {\n  this.useOnRemove = true;\n};\n\n/*\n * Sets whether to use the md-on-select expression. This expression is\n * bound to scope and controller in {@code MdChipsDirective} as\n * {@code onSelect}. Due to the nature of directive scope bindings, the\n * controller cannot know on its own/from the scope whether an expression was\n * actually provided.\n */\nMdChipsCtrl.prototype.useOnSelectExpression = function() {\n  this.useOnSelect = true;\n};\n\n/**\n * Gets the input buffer. The input buffer can be the model bound to the\n * default input item {@code this.chipBuffer}, the {@code selectedItem}\n * model of an {@code md-autocomplete}, or, through some magic, the model\n * bound to any inpput or text area element found within a\n * {@code md-input-container} element.\n * @return {string}\n */\nMdChipsCtrl.prototype.getChipBuffer = function() {\n  var chipBuffer =  !this.userInputElement ? this.chipBuffer :\n                     this.userInputNgModelCtrl ? this.userInputNgModelCtrl.$viewValue :\n                     this.userInputElement[0].value;\n\n  // Ensure that the chip buffer is always a string. For example, the input element buffer might be falsy.\n  return angular.isString(chipBuffer) ? chipBuffer : '';\n};\n\n/**\n * Resets the input buffer for either the internal input or user provided input element.\n */\nMdChipsCtrl.prototype.resetChipBuffer = function() {\n  if (this.userInputElement) {\n    if (this.userInputNgModelCtrl) {\n      this.userInputNgModelCtrl.$setViewValue('');\n      this.userInputNgModelCtrl.$render();\n    } else {\n      this.userInputElement[0].value = '';\n    }\n  } else {\n    this.chipBuffer = '';\n  }\n};\n\nMdChipsCtrl.prototype.hasMaxChipsReached = function() {\n  if (angular.isString(this.maxChips)) this.maxChips = parseInt(this.maxChips, 10) || 0;\n\n  return this.maxChips > 0 && this.items.length >= this.maxChips;\n};\n\n/**\n * Updates the validity properties for the ngModel.\n */\nMdChipsCtrl.prototype.validateModel = function() {\n  this.ngModelCtrl.$setValidity('md-max-chips', !this.hasMaxChipsReached());\n};\n\n/**\n * Removes the chip at the given index.\n * @param index\n */\nMdChipsCtrl.prototype.removeChip = function(index) {\n  var removed = this.items.splice(index, 1);\n\n  // Update model validation\n  this.ngModelCtrl.$setDirty();\n  this.validateModel();\n\n  if (removed && removed.length && this.useOnRemove && this.onRemove) {\n    this.onRemove({ '$chip': removed[0], '$index': index });\n  }\n};\n\nMdChipsCtrl.prototype.removeChipAndFocusInput = function (index) {\n  this.removeChip(index);\n\n  if (this.autocompleteCtrl) {\n    // Always hide the autocomplete dropdown before focusing the autocomplete input.\n    // Wait for the input to move horizontally, because the chip was removed.\n    // This can lead to an incorrect dropdown position.\n    this.autocompleteCtrl.hidden = true;\n    this.$mdUtil.nextTick(this.onFocus.bind(this));\n  } else {\n    this.onFocus();\n  }\n\n};\n/**\n * Selects the chip at `index`,\n * @param index\n */\nMdChipsCtrl.prototype.selectAndFocusChipSafe = function(index) {\n  // If we have no chips, or are asked to select a chip before the first, just focus the input\n  if (!this.items.length || index === -1) {\n    return this.focusInput();\n  }\n\n  // If we are asked to select a chip greater than the number of chips...\n  if (index >= this.items.length) {\n    if (this.readonly) {\n      // If we are readonly, jump back to the start (because we have no input)\n      index = 0;\n    } else {\n      // If we are not readonly, we should attempt to focus the input\n      return this.onFocus();\n    }\n  }\n\n  index = Math.max(index, 0);\n  index = Math.min(index, this.items.length - 1);\n\n  this.selectChip(index);\n  this.focusChip(index);\n};\n\nMdChipsCtrl.prototype.focusLastChipThenInput = function() {\n  var ctrl = this;\n\n  ctrl.shouldFocusLastChip = false;\n\n  ctrl.focusChip(this.items.length - 1);\n\n  ctrl.$timeout(function() {\n    ctrl.focusInput();\n  }, ctrl.chipAppendDelay);\n};\n\nMdChipsCtrl.prototype.focusInput = function() {\n  this.selectChip(-1);\n  this.onFocus();\n};\n\n/**\n * Marks the chip at the given index as selected.\n * @param index\n */\nMdChipsCtrl.prototype.selectChip = function(index) {\n  if (index >= -1 && index <= this.items.length) {\n    this.selectedChip = index;\n\n    // Fire the onSelect if provided\n    if (this.useOnSelect && this.onSelect) {\n      this.onSelect({'$chip': this.items[index] });\n    }\n  } else {\n    this.$log.warn('Selected Chip index out of bounds; ignoring.');\n  }\n};\n\n/**\n * Selects the chip at `index` and gives it focus.\n * @param index\n */\nMdChipsCtrl.prototype.selectAndFocusChip = function(index) {\n  this.selectChip(index);\n  if (index != -1) {\n    this.focusChip(index);\n  }\n};\n\n/**\n * Call `focus()` on the chip at `index`\n */\nMdChipsCtrl.prototype.focusChip = function(index) {\n  var chipContent = this.$element[0].querySelector('md-chip[index=\"' + index + '\"] .md-chip-content');\n\n  this.ariaTabIndex = index;\n\n  chipContent.focus();\n};\n\n/**\n * Configures the required interactions with the ngModel Controller.\n * Specifically, set {@code this.items} to the {@code NgModelCtrl#$viewVale}.\n * @param ngModelCtrl\n */\nMdChipsCtrl.prototype.configureNgModel = function(ngModelCtrl) {\n  this.ngModelCtrl = ngModelCtrl;\n\n  var self = this;\n  ngModelCtrl.$render = function() {\n    // model is updated. do something.\n    self.items = self.ngModelCtrl.$viewValue;\n  };\n};\n\nMdChipsCtrl.prototype.onFocus = function () {\n  var input = this.$element[0].querySelector('input');\n  input && input.focus();\n  this.resetSelectedChip();\n};\n\nMdChipsCtrl.prototype.onInputFocus = function () {\n  this.inputHasFocus = true;\n\n  // Make sure we have the appropriate ARIA attributes\n  this.setupInputAria();\n\n  // Make sure we don't have any chips selected\n  this.resetSelectedChip();\n};\n\nMdChipsCtrl.prototype.onInputBlur = function () {\n  this.inputHasFocus = false;\n\n  if (this.shouldAddOnBlur()) {\n    this.appendChip(this.getChipBuffer().trim());\n    this.resetChipBuffer();\n  }\n};\n\n/**\n * Configure event bindings on a user-provided input element.\n * @param inputElement\n */\nMdChipsCtrl.prototype.configureUserInput = function(inputElement) {\n  this.userInputElement = inputElement;\n\n  // Find the NgModelCtrl for the input element\n  var ngModelCtrl = inputElement.controller('ngModel');\n  // `.controller` will look in the parent as well.\n  if (ngModelCtrl != this.ngModelCtrl) {\n    this.userInputNgModelCtrl = ngModelCtrl;\n  }\n\n  var scope = this.$scope;\n  var ctrl = this;\n\n  // Run all of the events using evalAsync because a focus may fire a blur in the same digest loop\n  var scopeApplyFn = function(event, fn) {\n    scope.$evalAsync(angular.bind(ctrl, fn, event));\n  };\n\n  // Bind to keydown and focus events of input\n  inputElement\n      .attr({ tabindex: 0 })\n      .on('keydown', function(event) { scopeApplyFn(event, ctrl.inputKeydown) })\n      .on('focus', function(event) { scopeApplyFn(event, ctrl.onInputFocus) })\n      .on('blur', function(event) { scopeApplyFn(event, ctrl.onInputBlur) })\n};\n\nMdChipsCtrl.prototype.configureAutocomplete = function(ctrl) {\n  if (ctrl) {\n    this.autocompleteCtrl = ctrl;\n\n    ctrl.registerSelectedItemWatcher(angular.bind(this, function (item) {\n      if (item) {\n        // Only append the chip and reset the chip buffer if the max chips limit isn't reached.\n        if (this.hasMaxChipsReached()) return;\n\n        this.appendChip(item);\n        this.resetChipBuffer();\n      }\n    }));\n\n    this.$element.find('input')\n        .on('focus',angular.bind(this, this.onInputFocus) )\n        .on('blur', angular.bind(this, this.onInputBlur) );\n  }\n};\n\n/**\n * Whether the current chip buffer should be added on input blur or not.\n * @returns {boolean}\n */\nMdChipsCtrl.prototype.shouldAddOnBlur = function() {\n\n  // Update the custom ngModel validators from the chips component.\n  this.validateModel();\n\n  var chipBuffer = this.getChipBuffer().trim();\n  var isModelValid = this.ngModelCtrl.$valid;\n  var isAutocompleteShowing = this.autocompleteCtrl && !this.autocompleteCtrl.hidden;\n\n  if (this.userInputNgModelCtrl) {\n    isModelValid = isModelValid && this.userInputNgModelCtrl.$valid;\n  }\n\n  return this.addOnBlur && !this.requireMatch && chipBuffer && isModelValid && !isAutocompleteShowing;\n};\n\nMdChipsCtrl.prototype.hasFocus = function () {\n  return this.inputHasFocus || this.selectedChip >= 0;\n};\n\nMdChipsCtrl.prototype.contentIdFor = function(index) {\n  return this.contentIds[index];\n};\n\n})();\n(function(){\n\"use strict\";\n\n  \n  MdChips.$inject = [\"$mdTheming\", \"$mdUtil\", \"$compile\", \"$log\", \"$timeout\", \"$$mdSvgRegistry\"];angular\n      .module('material.components.chips')\n      .directive('mdChips', MdChips);\n\n  /**\n   * @ngdoc directive\n   * @name mdChips\n   * @module material.components.chips\n   *\n   * @description\n   * `<md-chips>` is an input component for building lists of strings or objects. The list items are\n   * displayed as 'chips'. This component can make use of an `<input>` element or an \n   * `<md-autocomplete>` element.\n   *\n   * ### Custom templates\n   * A custom template may be provided to render the content of each chip. This is achieved by\n   * specifying an `<md-chip-template>` element containing the custom content as a child of\n   * `<md-chips>`.\n   *\n   * Note: Any attributes on\n   * `<md-chip-template>` will be dropped as only the innerHTML is used for the chip template. The\n   * variables `$chip` and `$index` are available in the scope of `<md-chip-template>`, representing\n   * the chip object and its index in the list of chips, respectively.\n   * To override the chip delete control, include an element (ideally a button) with the attribute\n   * `md-chip-remove`. A click listener to remove the chip will be added automatically. The element\n   * is also placed as a sibling to the chip content (on which there are also click listeners) to\n   * avoid a nested ng-click situation.\n   *\n   * <!-- Note: We no longer want to include this in the site docs; but it should remain here for\n   * future developers and those looking at the documentation.\n   *\n   * <h3> Pending Features </h3>\n   * <ul style=\"padding-left:20px;\">\n   *\n   *   <ul>Style\n   *     <li>Colours for hover, press states (ripple?).</li>\n   *   </ul>\n   *\n   *   <ul>Validation\n   *     <li>allow a validation callback</li>\n   *     <li>hilighting style for invalid chips</li>\n   *   </ul>\n   *\n   *   <ul>Item mutation\n   *     <li>Support `\n   *       <md-chip-edit>` template, show/hide the edit element on tap/click? double tap/double\n   *       click?\n   *     </li>\n   *   </ul>\n   *\n   *   <ul>Truncation and Disambiguation (?)\n   *     <li>Truncate chip text where possible, but do not truncate entries such that two are\n   *     indistinguishable.</li>\n   *   </ul>\n   *\n   *   <ul>Drag and Drop\n   *     <li>Drag and drop chips between related `<md-chips>` elements.\n   *     </li>\n   *   </ul>\n   * </ul>\n   *\n   * //-->\n   *\n   * Sometimes developers want to limit the amount of possible chips.<br/>\n   * You can specify the maximum amount of chips by using the following markup.\n   *\n   * <hljs lang=\"html\">\n   *   <md-chips\n   *       ng-model=\"myItems\"\n   *       placeholder=\"Add an item\"\n   *       md-max-chips=\"5\">\n   *   </md-chips>\n   * </hljs>\n   *\n   * In some cases, you have an autocomplete inside of the `md-chips`.<br/>\n   * When the maximum amount of chips has been reached, you can also disable the autocomplete selection.<br/>\n   * Here is an example markup.\n   *\n   * <hljs lang=\"html\">\n   *   <md-chips ng-model=\"myItems\" md-max-chips=\"5\">\n   *     <md-autocomplete ng-hide=\"myItems.length > 5\" ...></md-autocomplete>\n   *   </md-chips>\n   * </hljs>\n   *\n   * ### Accessibility\n   *\n   * The `md-chips` component supports keyboard and screen reader users since Version 1.1.2. In\n   * order to achieve this, we modified the chips behavior to select newly appended chips for\n   * `300ms` before re-focusing the input and allowing the user to type.\n   *\n   * For most users, this delay is small enough that it will not be noticeable but allows certain\n   * screen readers to function properly (JAWS and NVDA in particular).\n   *\n   * We introduced a new `md-chip-append-delay` option to allow developers to better control this\n   * behavior.\n   *\n   * Please refer to the documentation of this option (below) for more information.\n   *\n   * @param {string=|object=} ng-model A model to which the list of items will be bound.\n   * @param {string=} placeholder Placeholder text that will be forwarded to the input.\n   * @param {string=} secondary-placeholder Placeholder text that will be forwarded to the input,\n   *    displayed when there is at least one item in the list\n   * @param {boolean=} md-removable Enables or disables the deletion of chips through the\n   *    removal icon or the Delete/Backspace key. Defaults to true.\n   * @param {boolean=} readonly Disables list manipulation (deleting or adding list items), hiding\n   *    the input and delete buttons. If no `ng-model` is provided, the chips will automatically be\n   *    marked as readonly.<br/><br/>\n   *    When `md-removable` is not defined, the `md-remove` behavior will be overwritten and disabled.\n   * @param {string=} md-enable-chip-edit Set this to \"true\" to enable editing of chip contents. The user can \n   *    go into edit mode with pressing \"space\", \"enter\", or double clicking on the chip. Chip edit is only\n   *    supported for chips with basic template.\n   * @param {number=} md-max-chips The maximum number of chips allowed to add through user input.\n   *    <br/><br/>The validation property `md-max-chips` can be used when the max chips\n   *    amount is reached.\n   * @param {boolean=} md-add-on-blur When set to true, remaining text inside of the input will\n   *    be converted into a new chip on blur.\n   * @param {expression} md-transform-chip An expression of form `myFunction($chip)` that when called\n   *    expects one of the following return values:\n   *    - an object representing the `$chip` input string\n   *    - `undefined` to simply add the `$chip` input string, or\n   *    - `null` to prevent the chip from being appended\n   * @param {expression=} md-on-add An expression which will be called when a chip has been\n   *    added.\n   * @param {expression=} md-on-remove An expression which will be called when a chip has been\n   *    removed.\n   * @param {expression=} md-on-select An expression which will be called when a chip is selected.\n   * @param {boolean} md-require-match If true, and the chips template contains an autocomplete,\n   *    only allow selection of pre-defined chips (i.e. you cannot add new ones).\n   * @param {string=} input-aria-label A string read by screen readers to identify the input.\n   * @param {string=} container-hint A string read by screen readers informing users of how to\n   *    navigate the chips. Used in readonly mode.\n   * @param {string=} delete-hint A string read by screen readers instructing users that pressing\n   *    the delete key will remove the chip.\n   * @param {string=} delete-button-label A label for the delete button. Also hidden and read by\n   *    screen readers.\n   * @param {expression=} md-separator-keys An array of key codes used to separate chips.\n   * @param {string=} md-chip-append-delay The number of milliseconds that the component will select\n   *    a newly appended chip before allowing a user to type into the input. This is **necessary**\n   *    for keyboard accessibility for screen readers. It defaults to 300ms and any number less than\n   *    300 can cause issues with screen readers (particularly JAWS and sometimes NVDA).\n   *\n   *    _Available since Version 1.1.2._\n   *\n   *    **Note:** You can safely set this to `0` in one of the following two instances:\n   *\n   *    1. You are targeting an iOS or Safari-only application (where users would use VoiceOver) or\n   *    only ChromeVox users.\n   *\n   *    2. If you have utilized the `md-separator-keys` to disable the `enter` keystroke in\n   *    favor of another one (such as `,` or `;`).\n   *\n   * @usage\n   * <hljs lang=\"html\">\n   *   <md-chips\n   *       ng-model=\"myItems\"\n   *       placeholder=\"Add an item\"\n   *       readonly=\"isReadOnly\">\n   *   </md-chips>\n   * </hljs>\n   *\n   * <h3>Validation</h3>\n   * When using [ngMessages](https://docs.angularjs.org/api/ngMessages), you can show errors based\n   * on our custom validators.\n   * <hljs lang=\"html\">\n   *   <form name=\"userForm\">\n   *     <md-chips\n   *       name=\"fruits\"\n   *       ng-model=\"myItems\"\n   *       placeholder=\"Add an item\"\n   *       md-max-chips=\"5\">\n   *     </md-chips>\n   *     <div ng-messages=\"userForm.fruits.$error\" ng-if=\"userForm.$dirty\">\n   *       <div ng-message=\"md-max-chips\">You reached the maximum amount of chips</div>\n   *    </div>\n   *   </form>\n   * </hljs>\n   *\n   */\n\n  var MD_CHIPS_TEMPLATE = '\\\n      <md-chips-wrap\\\n          id=\"{{$mdChipsCtrl.wrapperId}}\"\\\n          tabindex=\"{{$mdChipsCtrl.readonly ? 0 : -1}}\"\\\n          ng-keydown=\"$mdChipsCtrl.chipKeydown($event)\"\\\n          ng-class=\"{ \\'md-focused\\': $mdChipsCtrl.hasFocus(), \\\n                      \\'md-readonly\\': !$mdChipsCtrl.ngModelCtrl || $mdChipsCtrl.readonly,\\\n                      \\'md-removable\\': $mdChipsCtrl.isRemovable() }\"\\\n          aria-setsize=\"{{$mdChipsCtrl.items.length}}\"\\\n          class=\"md-chips\">\\\n        <span ng-if=\"$mdChipsCtrl.readonly\" class=\"md-visually-hidden\">\\\n          {{$mdChipsCtrl.containerHint}}\\\n        </span>\\\n        <md-chip ng-repeat=\"$chip in $mdChipsCtrl.items\"\\\n            index=\"{{$index}}\"\\\n            ng-class=\"{\\'md-focused\\': $mdChipsCtrl.selectedChip == $index, \\'md-readonly\\': !$mdChipsCtrl.ngModelCtrl || $mdChipsCtrl.readonly}\">\\\n          <div class=\"md-chip-content\"\\\n              tabindex=\"{{$mdChipsCtrl.ariaTabIndex == $index ? 0 : -1}}\"\\\n              id=\"{{$mdChipsCtrl.contentIdFor($index)}}\"\\\n              role=\"option\"\\\n              aria-selected=\"{{$mdChipsCtrl.selectedChip == $index}}\" \\\n              aria-posinset=\"{{$index}}\"\\\n              ng-click=\"!$mdChipsCtrl.readonly && $mdChipsCtrl.focusChip($index)\"\\\n              ng-focus=\"!$mdChipsCtrl.readonly && $mdChipsCtrl.selectChip($index)\"\\\n              md-chip-transclude=\"$mdChipsCtrl.chipContentsTemplate\"></div>\\\n          <div ng-if=\"$mdChipsCtrl.isRemovable()\"\\\n               class=\"md-chip-remove-container\"\\\n               tabindex=\"-1\"\\\n               md-chip-transclude=\"$mdChipsCtrl.chipRemoveTemplate\"></div>\\\n        </md-chip>\\\n        <div class=\"md-chip-input-container\" ng-if=\"!$mdChipsCtrl.readonly && $mdChipsCtrl.ngModelCtrl\">\\\n          <div md-chip-transclude=\"$mdChipsCtrl.chipInputTemplate\"></div>\\\n        </div>\\\n      </md-chips-wrap>';\n\n  var CHIP_INPUT_TEMPLATE = '\\\n        <input\\\n            class=\"md-input\"\\\n            tabindex=\"0\"\\\n            aria-label=\"{{$mdChipsCtrl.inputAriaLabel}}\" \\\n            placeholder=\"{{$mdChipsCtrl.getPlaceholder()}}\"\\\n            ng-model=\"$mdChipsCtrl.chipBuffer\"\\\n            ng-focus=\"$mdChipsCtrl.onInputFocus()\"\\\n            ng-blur=\"$mdChipsCtrl.onInputBlur()\"\\\n            ng-keydown=\"$mdChipsCtrl.inputKeydown($event)\">';\n\n  var CHIP_DEFAULT_TEMPLATE = '\\\n      <span>{{$chip}}</span>';\n\n  var CHIP_REMOVE_TEMPLATE = '\\\n      <button\\\n          class=\"md-chip-remove\"\\\n          ng-if=\"$mdChipsCtrl.isRemovable()\"\\\n          ng-click=\"$mdChipsCtrl.removeChipAndFocusInput($$replacedScope.$index)\"\\\n          type=\"button\"\\\n          tabindex=\"-1\">\\\n        <md-icon md-svg-src=\"{{ $mdChipsCtrl.mdCloseIcon }}\"></md-icon>\\\n        <span class=\"md-visually-hidden\">\\\n          {{$mdChipsCtrl.deleteButtonLabel}}\\\n        </span>\\\n      </button>';\n\n  /**\n   * MDChips Directive Definition\n   */\n  function MdChips ($mdTheming, $mdUtil, $compile, $log, $timeout, $$mdSvgRegistry) {\n    // Run our templates through $mdUtil.processTemplate() to allow custom start/end symbols\n    var templates = getTemplates();\n\n    return {\n      template: function(element, attrs) {\n        // Clone the element into an attribute. By prepending the attribute\n        // name with '$', AngularJS won't write it into the DOM. The cloned\n        // element propagates to the link function via the attrs argument,\n        // where various contained-elements can be consumed.\n        attrs['$mdUserTemplate'] = element.clone();\n        return templates.chips;\n      },\n      require: ['mdChips'],\n      restrict: 'E',\n      controller: 'MdChipsCtrl',\n      controllerAs: '$mdChipsCtrl',\n      bindToController: true,\n      compile: compile,\n      scope: {\n        readonly: '=readonly',\n        removable: '=mdRemovable',\n        placeholder: '@',\n        secondaryPlaceholder: '@',\n        maxChips: '@mdMaxChips',\n        transformChip: '&mdTransformChip',\n        onAppend: '&mdOnAppend',\n        onAdd: '&mdOnAdd',\n        onRemove: '&mdOnRemove',\n        onSelect: '&mdOnSelect',\n        inputAriaLabel: '@',\n        containerHint: '@',\n        deleteHint: '@',\n        deleteButtonLabel: '@',\n        separatorKeys: '=?mdSeparatorKeys',\n        requireMatch: '=?mdRequireMatch',\n        chipAppendDelayString: '@?mdChipAppendDelay'\n      }\n    };\n\n    /**\n     * Builds the final template for `md-chips` and returns the postLink function.\n     *\n     * Building the template involves 3 key components:\n     * static chips\n     * chip template\n     * input control\n     *\n     * If no `ng-model` is provided, only the static chip work needs to be done.\n     *\n     * If no user-passed `md-chip-template` exists, the default template is used. This resulting\n     * template is appended to the chip content element.\n     *\n     * The remove button may be overridden by passing an element with an md-chip-remove attribute.\n     *\n     * If an `input` or `md-autocomplete` element is provided by the caller, it is set aside for\n     * transclusion later. The transclusion happens in `postLink` as the parent scope is required.\n     * If no user input is provided, a default one is appended to the input container node in the\n     * template.\n     *\n     * Static Chips (i.e. `md-chip` elements passed from the caller) are gathered and set aside for\n     * transclusion in the `postLink` function.\n     *\n     *\n     * @param element\n     * @param attr\n     * @returns {Function}\n     */\n    function compile(element, attr) {\n      // Grab the user template from attr and reset the attribute to null.\n      var userTemplate = attr['$mdUserTemplate'];\n      attr['$mdUserTemplate'] = null;\n\n      var chipTemplate = getTemplateByQuery('md-chips>md-chip-template');\n\n      var chipRemoveSelector = $mdUtil\n        .prefixer()\n        .buildList('md-chip-remove')\n        .map(function(attr) {\n          return 'md-chips>*[' + attr + ']';\n        })\n        .join(',');\n\n      // Set the chip remove, chip contents and chip input templates. The link function will put\n      // them on the scope for transclusion later.\n      var chipRemoveTemplate   = getTemplateByQuery(chipRemoveSelector) || templates.remove,\n          chipContentsTemplate = chipTemplate || templates.default,\n          chipInputTemplate    = getTemplateByQuery('md-chips>md-autocomplete')\n              || getTemplateByQuery('md-chips>input')\n              || templates.input,\n          staticChips = userTemplate.find('md-chip');\n\n      // Warn of malformed template. See #2545\n      if (userTemplate[0].querySelector('md-chip-template>*[md-chip-remove]')) {\n        $log.warn('invalid placement of md-chip-remove within md-chip-template.');\n      }\n\n      function getTemplateByQuery (query) {\n        if (!attr.ngModel) return;\n        var element = userTemplate[0].querySelector(query);\n        return element && element.outerHTML;\n      }\n\n      /**\n       * Configures controller and transcludes.\n       */\n      return function postLink(scope, element, attrs, controllers) {\n        $mdUtil.initOptionalProperties(scope, attr);\n\n        $mdTheming(element);\n        var mdChipsCtrl = controllers[0];\n        if(chipTemplate) {\n          // Chip editing functionality assumes we are using the default chip template.\n          mdChipsCtrl.enableChipEdit = false;\n        }\n\n        mdChipsCtrl.chipContentsTemplate = chipContentsTemplate;\n        mdChipsCtrl.chipRemoveTemplate   = chipRemoveTemplate;\n        mdChipsCtrl.chipInputTemplate    = chipInputTemplate;\n\n        mdChipsCtrl.mdCloseIcon = $$mdSvgRegistry.mdClose;\n\n        element\n            .attr({ tabindex: -1 })\n            .on('focus', function () { mdChipsCtrl.onFocus(); });\n\n        if (attr.ngModel) {\n          mdChipsCtrl.configureNgModel(element.controller('ngModel'));\n\n          // If an `md-transform-chip` attribute was set, tell the controller to use the expression\n          // before appending chips.\n          if (attrs.mdTransformChip) mdChipsCtrl.useTransformChipExpression();\n\n          // If an `md-on-append` attribute was set, tell the controller to use the expression\n          // when appending chips.\n          //\n          // DEPRECATED: Will remove in official 1.0 release\n          if (attrs.mdOnAppend) mdChipsCtrl.useOnAppendExpression();\n\n          // If an `md-on-add` attribute was set, tell the controller to use the expression\n          // when adding chips.\n          if (attrs.mdOnAdd) mdChipsCtrl.useOnAddExpression();\n\n          // If an `md-on-remove` attribute was set, tell the controller to use the expression\n          // when removing chips.\n          if (attrs.mdOnRemove) mdChipsCtrl.useOnRemoveExpression();\n\n          // If an `md-on-select` attribute was set, tell the controller to use the expression\n          // when selecting chips.\n          if (attrs.mdOnSelect) mdChipsCtrl.useOnSelectExpression();\n\n          // The md-autocomplete and input elements won't be compiled until after this directive\n          // is complete (due to their nested nature). Wait a tick before looking for them to\n          // configure the controller.\n          if (chipInputTemplate != templates.input) {\n            // The autocomplete will not appear until the readonly attribute is not true (i.e.\n            // false or undefined), so we have to watch the readonly and then on the next tick\n            // after the chip transclusion has run, we can configure the autocomplete and user\n            // input.\n            scope.$watch('$mdChipsCtrl.readonly', function(readonly) {\n              if (!readonly) {\n\n                $mdUtil.nextTick(function(){\n\n                  if (chipInputTemplate.indexOf('<md-autocomplete') === 0) {\n                    var autocompleteEl = element.find('md-autocomplete');\n                    mdChipsCtrl.configureAutocomplete(autocompleteEl.controller('mdAutocomplete'));\n                  }\n\n                  mdChipsCtrl.configureUserInput(element.find('input'));\n                });\n              }\n            });\n          }\n\n          // At the next tick, if we find an input, make sure it has the md-input class\n          $mdUtil.nextTick(function() {\n            var input = element.find('input');\n\n            input && input.toggleClass('md-input', true);\n          });\n        }\n\n        // Compile with the parent's scope and prepend any static chips to the wrapper.\n        if (staticChips.length > 0) {\n          var compiledStaticChips = $compile(staticChips.clone())(scope.$parent);\n          $timeout(function() { element.find('md-chips-wrap').prepend(compiledStaticChips); });\n        }\n      };\n    }\n\n    function getTemplates() {\n      return {\n        chips: $mdUtil.processTemplate(MD_CHIPS_TEMPLATE),\n        input: $mdUtil.processTemplate(CHIP_INPUT_TEMPLATE),\n        default: $mdUtil.processTemplate(CHIP_DEFAULT_TEMPLATE),\n        remove: $mdUtil.processTemplate(CHIP_REMOVE_TEMPLATE)\n      };\n    }\n  }\n\n})();\n(function(){\n\"use strict\";\n\nangular\n    .module('material.components.chips')\n    .controller('MdContactChipsCtrl', MdContactChipsCtrl);\n\n\n\n/**\n * Controller for the MdContactChips component\n * @constructor\n */\nfunction MdContactChipsCtrl () {\n  /** @type {Object} */\n  this.selectedItem = null;\n\n  /** @type {string} */\n  this.searchText = '';\n}\n\n\nMdContactChipsCtrl.prototype.queryContact = function(searchText) {\n  return this.contactQuery({'$query': searchText});\n};\n\n\nMdContactChipsCtrl.prototype.itemName = function(item) {\n  return item[this.contactName];\n};\n\n})();\n(function(){\n\"use strict\";\n\n\nMdContactChips.$inject = [\"$mdTheming\", \"$mdUtil\"];angular\n  .module('material.components.chips')\n  .directive('mdContactChips', MdContactChips);\n\n/**\n * @ngdoc directive\n * @name mdContactChips\n * @module material.components.chips\n *\n * @description\n * `<md-contact-chips>` is an input component based on `md-chips` and makes use of an\n * `md-autocomplete` element. The component allows the caller to supply a query expression which\n * returns  a list of possible contacts. The user can select one of these and add it to the list of\n * chips.\n *\n * You may also use the `md-highlight-text` directive along with its parameters to control the\n * appearance of the matched text inside of the contacts' autocomplete popup.\n *\n * @param {string=|object=} ng-model A model to bind the list of items to\n * @param {string=} placeholder Placeholder text that will be forwarded to the input.\n * @param {string=} secondary-placeholder Placeholder text that will be forwarded to the input,\n *    displayed when there is at least on item in the list\n * @param {expression} md-contacts An expression expected to return contacts matching the search\n *    test, `$query`. If this expression involves a promise, a loading bar is displayed while\n *    waiting for it to resolve.\n * @param {string} md-contact-name The field name of the contact object representing the\n *    contact's name.\n * @param {string} md-contact-email The field name of the contact object representing the\n *    contact's email address.\n * @param {string} md-contact-image The field name of the contact object representing the\n *    contact's image.\n * @param {number=} md-min-length Specifies the minimum length of text before autocomplete will\n *    make suggestions\n *\n * @param {expression=} filter-selected Whether to filter selected contacts from the list of\n *    suggestions shown in the autocomplete.\n *\n *    ***Note:** This attribute has been removed but may come back.*\n *\n *\n *\n * @usage\n * <hljs lang=\"html\">\n *   <md-contact-chips\n *       ng-model=\"ctrl.contacts\"\n *       md-contacts=\"ctrl.querySearch($query)\"\n *       md-contact-name=\"name\"\n *       md-contact-image=\"image\"\n *       md-contact-email=\"email\"\n *       placeholder=\"To\">\n *   </md-contact-chips>\n * </hljs>\n *\n */\n\n\nvar MD_CONTACT_CHIPS_TEMPLATE = '\\\n      <md-chips class=\"md-contact-chips\"\\\n          ng-model=\"$mdContactChipsCtrl.contacts\"\\\n          md-require-match=\"$mdContactChipsCtrl.requireMatch\"\\\n          md-chip-append-delay=\"{{$mdContactChipsCtrl.chipAppendDelay}}\" \\\n          md-autocomplete-snap>\\\n          <md-autocomplete\\\n              md-menu-class=\"md-contact-chips-suggestions\"\\\n              md-selected-item=\"$mdContactChipsCtrl.selectedItem\"\\\n              md-search-text=\"$mdContactChipsCtrl.searchText\"\\\n              md-items=\"item in $mdContactChipsCtrl.queryContact($mdContactChipsCtrl.searchText)\"\\\n              md-item-text=\"$mdContactChipsCtrl.itemName(item)\"\\\n              md-no-cache=\"true\"\\\n              md-min-length=\"$mdContactChipsCtrl.minLength\"\\\n              md-autoselect\\\n              placeholder=\"{{$mdContactChipsCtrl.contacts.length == 0 ?\\\n                  $mdContactChipsCtrl.placeholder : $mdContactChipsCtrl.secondaryPlaceholder}}\">\\\n            <div class=\"md-contact-suggestion\">\\\n              <img \\\n                  ng-src=\"{{item[$mdContactChipsCtrl.contactImage]}}\"\\\n                  alt=\"{{item[$mdContactChipsCtrl.contactName]}}\"\\\n                  ng-if=\"item[$mdContactChipsCtrl.contactImage]\" />\\\n              <span class=\"md-contact-name\" md-highlight-text=\"$mdContactChipsCtrl.searchText\"\\\n                    md-highlight-flags=\"{{$mdContactChipsCtrl.highlightFlags}}\">\\\n                {{item[$mdContactChipsCtrl.contactName]}}\\\n              </span>\\\n              <span class=\"md-contact-email\" >{{item[$mdContactChipsCtrl.contactEmail]}}</span>\\\n            </div>\\\n          </md-autocomplete>\\\n          <md-chip-template>\\\n            <div class=\"md-contact-avatar\">\\\n              <img \\\n                  ng-src=\"{{$chip[$mdContactChipsCtrl.contactImage]}}\"\\\n                  alt=\"{{$chip[$mdContactChipsCtrl.contactName]}}\"\\\n                  ng-if=\"$chip[$mdContactChipsCtrl.contactImage]\" />\\\n            </div>\\\n            <div class=\"md-contact-name\">\\\n              {{$chip[$mdContactChipsCtrl.contactName]}}\\\n            </div>\\\n          </md-chip-template>\\\n      </md-chips>';\n\n\n/**\n * MDContactChips Directive Definition\n *\n * @param $mdTheming\n * @returns {*}\n * @ngInject\n */\nfunction MdContactChips($mdTheming, $mdUtil) {\n  return {\n    template: function(element, attrs) {\n      return MD_CONTACT_CHIPS_TEMPLATE;\n    },\n    restrict: 'E',\n    controller: 'MdContactChipsCtrl',\n    controllerAs: '$mdContactChipsCtrl',\n    bindToController: true,\n    compile: compile,\n    scope: {\n      contactQuery: '&mdContacts',\n      placeholder: '@',\n      secondaryPlaceholder: '@',\n      contactName: '@mdContactName',\n      contactImage: '@mdContactImage',\n      contactEmail: '@mdContactEmail',\n      contacts: '=ngModel',\n      requireMatch: '=?mdRequireMatch',\n      minLength: '=?mdMinLength',\n      highlightFlags: '@?mdHighlightFlags',\n      chipAppendDelay: '@?mdChipAppendDelay'\n    }\n  };\n\n  function compile(element, attr) {\n    return function postLink(scope, element, attrs, controllers) {\n      var contactChipsController = controllers;\n\n      $mdUtil.initOptionalProperties(scope, attr);\n      $mdTheming(element);\n\n      element.attr('tabindex', '-1');\n\n      attrs.$observe('mdChipAppendDelay', function(newValue) {\n        contactChipsController.chipAppendDelay = newValue;\n      });\n    };\n  }\n}\n\n})();\n(function(){\n\"use strict\";\n\n(function() {\n  'use strict';\n\n  /**\n   * @ngdoc directive\n   * @name mdCalendar\n   * @module material.components.datepicker\n   *\n   * @param {Date} ng-model The component's model. Should be a Date object.\n   * @param {Date=} md-min-date Expression representing the minimum date.\n   * @param {Date=} md-max-date Expression representing the maximum date.\n   * @param {(function(Date): boolean)=} md-date-filter Function expecting a date and returning a boolean whether it can be selected or not.\n   *\n   * @description\n   * `<md-calendar>` is a component that renders a calendar that can be used to select a date.\n   * It is a part of the `<md-datepicker>` pane, however it can also be used on it's own.\n   *\n   * @usage\n   *\n   * <hljs lang=\"html\">\n   *   <md-calendar ng-model=\"birthday\"></md-calendar>\n   * </hljs>\n   */\n  CalendarCtrl.$inject = [\"$element\", \"$scope\", \"$$mdDateUtil\", \"$mdUtil\", \"$mdConstant\", \"$mdTheming\", \"$$rAF\", \"$attrs\", \"$mdDateLocale\"];\n  angular.module('material.components.datepicker')\n    .directive('mdCalendar', calendarDirective);\n\n  // POST RELEASE\n  // TODO(jelbourn): Mac Cmd + left / right == Home / End\n  // TODO(jelbourn): Refactor month element creation to use cloneNode (performance).\n  // TODO(jelbourn): Define virtual scrolling constants (compactness) users can override.\n  // TODO(jelbourn): Animated month transition on ng-model change (virtual-repeat)\n  // TODO(jelbourn): Scroll snapping (virtual repeat)\n  // TODO(jelbourn): Remove superfluous row from short months (virtual-repeat)\n  // TODO(jelbourn): Month headers stick to top when scrolling.\n  // TODO(jelbourn): Previous month opacity is lowered when partially scrolled out of view.\n  // TODO(jelbourn): Support md-calendar standalone on a page (as a tabstop w/ aria-live\n  //     announcement and key handling).\n  // Read-only calendar (not just date-picker).\n\n  function calendarDirective() {\n    return {\n      template: function(tElement, tAttr) {\n        // TODO(crisbeto): This is a workaround that allows the calendar to work, without\n        // a datepicker, until issue #8585 gets resolved. It can safely be removed\n        // afterwards. This ensures that the virtual repeater scrolls to the proper place on load by\n        // deferring the execution until the next digest. It's necessary only if the calendar is used\n        // without a datepicker, otherwise it's already wrapped in an ngIf.\n        var extraAttrs = tAttr.hasOwnProperty('ngIf') ? '' : 'ng-if=\"calendarCtrl.isInitialized\"';\n        var template = '' +\n          '<div ng-switch=\"calendarCtrl.currentView\" ' + extraAttrs + '>' +\n            '<md-calendar-year ng-switch-when=\"year\"></md-calendar-year>' +\n            '<md-calendar-month ng-switch-default></md-calendar-month>' +\n          '</div>';\n\n        return template;\n      },\n      scope: {\n        minDate: '=mdMinDate',\n        maxDate: '=mdMaxDate',\n        dateFilter: '=mdDateFilter',\n        _currentView: '@mdCurrentView'\n      },\n      require: ['ngModel', 'mdCalendar'],\n      controller: CalendarCtrl,\n      controllerAs: 'calendarCtrl',\n      bindToController: true,\n      link: function(scope, element, attrs, controllers) {\n        var ngModelCtrl = controllers[0];\n        var mdCalendarCtrl = controllers[1];\n        mdCalendarCtrl.configureNgModel(ngModelCtrl);\n      }\n    };\n  }\n\n  /**\n   * Occasionally the hideVerticalScrollbar method might read an element's\n   * width as 0, because it hasn't been laid out yet. This value will be used\n   * as a fallback, in order to prevent scenarios where the element's width\n   * would otherwise have been set to 0. This value is the \"usual\" width of a\n   * calendar within a floating calendar pane.\n   */\n  var FALLBACK_WIDTH = 340;\n\n  /** Next identifier for calendar instance. */\n  var nextUniqueId = 0;\n\n  /**\n   * Controller for the mdCalendar component.\n   * @ngInject @constructor\n   */\n  function CalendarCtrl($element, $scope, $$mdDateUtil, $mdUtil,\n    $mdConstant, $mdTheming, $$rAF, $attrs, $mdDateLocale) {\n\n    $mdTheming($element);\n\n    /** @final {!angular.JQLite} */\n    this.$element = $element;\n\n    /** @final {!angular.Scope} */\n    this.$scope = $scope;\n\n    /** @final */\n    this.dateUtil = $$mdDateUtil;\n\n    /** @final */\n    this.$mdUtil = $mdUtil;\n\n    /** @final */\n    this.keyCode = $mdConstant.KEY_CODE;\n\n    /** @final */\n    this.$$rAF = $$rAF;\n\n    /** @final */\n    this.$mdDateLocale = $mdDateLocale;\n\n    /** @final {Date} */\n    this.today = this.dateUtil.createDateAtMidnight();\n\n    /** @type {!angular.NgModelController} */\n    this.ngModelCtrl = null;\n\n    /** @type {String} Class applied to the selected date cell. */\n    this.SELECTED_DATE_CLASS = 'md-calendar-selected-date';\n\n    /** @type {String} Class applied to the cell for today. */\n    this.TODAY_CLASS = 'md-calendar-date-today';\n\n    /** @type {String} Class applied to the focused cell. */\n    this.FOCUSED_DATE_CLASS = 'md-focus';\n\n    /** @final {number} Unique ID for this calendar instance. */\n    this.id = nextUniqueId++;\n\n    /**\n     * The date that is currently focused or showing in the calendar. This will initially be set\n     * to the ng-model value if set, otherwise to today. It will be updated as the user navigates\n     * to other months. The cell corresponding to the displayDate does not necesarily always have\n     * focus in the document (such as for cases when the user is scrolling the calendar).\n     * @type {Date}\n     */\n    this.displayDate = null;\n\n    /**\n     * The selected date. Keep track of this separately from the ng-model value so that we\n     * can know, when the ng-model value changes, what the previous value was before it's updated\n     * in the component's UI.\n     *\n     * @type {Date}\n     */\n    this.selectedDate = null;\n\n    /**\n     * The first date that can be rendered by the calendar. The default is taken\n     * from the mdDateLocale provider and is limited by the mdMinDate.\n     * @type {Date}\n     */\n    this.firstRenderableDate = null;\n\n    /**\n     * The last date that can be rendered by the calendar. The default comes\n     * from the mdDateLocale provider and is limited by the maxDate.\n     * @type {Date}\n     */\n    this.lastRenderableDate = null;\n\n    /**\n     * Used to toggle initialize the root element in the next digest.\n     * @type {Boolean}\n     */\n    this.isInitialized = false;\n\n    /**\n     * Cache for the  width of the element without a scrollbar. Used to hide the scrollbar later on\n     * and to avoid extra reflows when switching between views.\n     * @type {Number}\n     */\n    this.width = 0;\n\n    /**\n     * Caches the width of the scrollbar in order to be used when hiding it and to avoid extra reflows.\n     * @type {Number}\n     */\n    this.scrollbarWidth = 0;\n\n    // Unless the user specifies so, the calendar should not be a tab stop.\n    // This is necessary because ngAria might add a tabindex to anything with an ng-model\n    // (based on whether or not the user has turned that particular feature on/off).\n    if (!$attrs.tabindex) {\n      $element.attr('tabindex', '-1');\n    }\n\n    var boundKeyHandler = angular.bind(this, this.handleKeyEvent);\n\n\n\n    // If use the md-calendar directly in the body without datepicker,\n    // handleKeyEvent will disable other inputs on the page.\n    // So only apply the handleKeyEvent on the body when the md-calendar inside datepicker,\n    // otherwise apply on the calendar element only.\n\n    var handleKeyElement;\n    if ($element.parent().hasClass('md-datepicker-calendar')) {\n      handleKeyElement = angular.element(document.body);\n    } else {\n      handleKeyElement = $element;\n    }\n\n    // Bind the keydown handler to the body, in order to handle cases where the focused\n    // element gets removed from the DOM and stops propagating click events.\n    handleKeyElement.on('keydown', boundKeyHandler);\n\n    $scope.$on('$destroy', function() {\n      handleKeyElement.off('keydown', boundKeyHandler);\n    });\n\n    // For AngularJS 1.4 and older, where there are no lifecycle hooks but bindings are pre-assigned,\n    // manually call the $onInit hook.\n    if (angular.version.major === 1 && angular.version.minor <= 4) {\n      this.$onInit();\n    }\n\n  }\n\n  /**\n   * AngularJS Lifecycle hook for newer AngularJS versions.\n   * Bindings are not guaranteed to have been assigned in the controller, but they are in the $onInit hook.\n   */\n  CalendarCtrl.prototype.$onInit = function() {\n\n    /**\n     * The currently visible calendar view. Note the prefix on the scope value,\n     * which is necessary, because the datepicker seems to reset the real one value if the\n     * calendar is open, but the value on the datepicker's scope is empty.\n     * @type {String}\n     */\n    this.currentView = this._currentView || 'month';\n\n    var dateLocale = this.$mdDateLocale;\n\n    if (this.minDate && this.minDate > dateLocale.firstRenderableDate) {\n      this.firstRenderableDate = this.minDate;\n    } else {\n      this.firstRenderableDate = dateLocale.firstRenderableDate;\n    }\n\n    if (this.maxDate && this.maxDate < dateLocale.lastRenderableDate) {\n      this.lastRenderableDate = this.maxDate;\n    } else {\n      this.lastRenderableDate = dateLocale.lastRenderableDate;\n    }\n  };\n\n  /**\n   * Sets up the controller's reference to ngModelController.\n   * @param {!angular.NgModelController} ngModelCtrl\n   */\n  CalendarCtrl.prototype.configureNgModel = function(ngModelCtrl) {\n    var self = this;\n\n    self.ngModelCtrl = ngModelCtrl;\n\n    self.$mdUtil.nextTick(function() {\n      self.isInitialized = true;\n    });\n\n    ngModelCtrl.$render = function() {\n      var value = this.$viewValue;\n\n      // Notify the child scopes of any changes.\n      self.$scope.$broadcast('md-calendar-parent-changed', value);\n\n      // Set up the selectedDate if it hasn't been already.\n      if (!self.selectedDate) {\n        self.selectedDate = value;\n      }\n\n      // Also set up the displayDate.\n      if (!self.displayDate) {\n        self.displayDate = self.selectedDate || self.today;\n      }\n    };\n  };\n\n  /**\n   * Sets the ng-model value for the calendar and emits a change event.\n   * @param {Date} date\n   */\n  CalendarCtrl.prototype.setNgModelValue = function(date) {\n    var value = this.dateUtil.createDateAtMidnight(date);\n    this.focus(value);\n    this.$scope.$emit('md-calendar-change', value);\n    this.ngModelCtrl.$setViewValue(value);\n    this.ngModelCtrl.$render();\n    return value;\n  };\n\n  /**\n   * Sets the current view that should be visible in the calendar\n   * @param {string} newView View name to be set.\n   * @param {number|Date} time Date object or a timestamp for the new display date.\n   */\n  CalendarCtrl.prototype.setCurrentView = function(newView, time) {\n    var self = this;\n\n    self.$mdUtil.nextTick(function() {\n      self.currentView = newView;\n\n      if (time) {\n        self.displayDate = angular.isDate(time) ? time : new Date(time);\n      }\n    });\n  };\n\n  /**\n   * Focus the cell corresponding to the given date.\n   * @param {Date} date The date to be focused.\n   */\n  CalendarCtrl.prototype.focus = function(date) {\n    if (this.dateUtil.isValidDate(date)) {\n      var previousFocus = this.$element[0].querySelector('.md-focus');\n      if (previousFocus) {\n        previousFocus.classList.remove(this.FOCUSED_DATE_CLASS);\n      }\n\n      var cellId = this.getDateId(date, this.currentView);\n      var cell = document.getElementById(cellId);\n      if (cell) {\n        cell.classList.add(this.FOCUSED_DATE_CLASS);\n        cell.focus();\n        this.displayDate = date;\n      }\n    } else {\n      var rootElement = this.$element[0].querySelector('[ng-switch]');\n\n      if (rootElement) {\n        rootElement.focus();\n      }\n    }\n  };\n\n  /**\n   * Normalizes the key event into an action name. The action will be broadcast\n   * to the child controllers.\n   * @param {KeyboardEvent} event\n   * @returns {String} The action that should be taken, or null if the key\n   * does not match a calendar shortcut.\n   */\n  CalendarCtrl.prototype.getActionFromKeyEvent = function(event) {\n    var keyCode = this.keyCode;\n\n    switch (event.which) {\n      case keyCode.ENTER: return 'select';\n\n      case keyCode.RIGHT_ARROW: return 'move-right';\n      case keyCode.LEFT_ARROW: return 'move-left';\n\n      // TODO(crisbeto): Might want to reconsider using metaKey, because it maps\n      // to the \"Windows\" key on PC, which opens the start menu or resizes the browser.\n      case keyCode.DOWN_ARROW: return event.metaKey ? 'move-page-down' : 'move-row-down';\n      case keyCode.UP_ARROW: return event.metaKey ? 'move-page-up' : 'move-row-up';\n\n      case keyCode.PAGE_DOWN: return 'move-page-down';\n      case keyCode.PAGE_UP: return 'move-page-up';\n\n      case keyCode.HOME: return 'start';\n      case keyCode.END: return 'end';\n\n      default: return null;\n    }\n  };\n\n  /**\n   * Handles a key event in the calendar with the appropriate action. The action will either\n   * be to select the focused date or to navigate to focus a new date.\n   * @param {KeyboardEvent} event\n   */\n  CalendarCtrl.prototype.handleKeyEvent = function(event) {\n    var self = this;\n\n    this.$scope.$apply(function() {\n      // Capture escape and emit back up so that a wrapping component\n      // (such as a date-picker) can decide to close.\n      if (event.which == self.keyCode.ESCAPE || event.which == self.keyCode.TAB) {\n        self.$scope.$emit('md-calendar-close');\n\n        if (event.which == self.keyCode.TAB) {\n          event.preventDefault();\n        }\n\n        return;\n      }\n\n      // Broadcast the action that any child controllers should take.\n      var action = self.getActionFromKeyEvent(event);\n      if (action) {\n        event.preventDefault();\n        event.stopPropagation();\n        self.$scope.$broadcast('md-calendar-parent-action', action);\n      }\n    });\n  };\n\n  /**\n   * Hides the vertical scrollbar on the calendar scroller of a child controller by\n   * setting the width on the calendar scroller and the `overflow: hidden` wrapper\n   * around the scroller, and then setting a padding-right on the scroller equal\n   * to the width of the browser's scrollbar.\n   *\n   * This will cause a reflow.\n   *\n   * @param {object} childCtrl The child controller whose scrollbar should be hidden.\n   */\n  CalendarCtrl.prototype.hideVerticalScrollbar = function(childCtrl) {\n    var self = this;\n    var element = childCtrl.$element[0];\n    var scrollMask = element.querySelector('.md-calendar-scroll-mask');\n\n    if (self.width > 0) {\n      setWidth();\n    } else {\n      self.$$rAF(function() {\n        var scroller = childCtrl.calendarScroller;\n\n        self.scrollbarWidth = scroller.offsetWidth - scroller.clientWidth;\n        self.width = element.querySelector('table').offsetWidth;\n        setWidth();\n      });\n    }\n\n    function setWidth() {\n      var width = self.width || FALLBACK_WIDTH;\n      var scrollbarWidth = self.scrollbarWidth;\n      var scroller = childCtrl.calendarScroller;\n\n      scrollMask.style.width = width + 'px';\n      scroller.style.width = (width + scrollbarWidth) + 'px';\n      scroller.style.paddingRight = scrollbarWidth + 'px';\n    }\n  };\n\n  /**\n   * Gets an identifier for a date unique to the calendar instance for internal\n   * purposes. Not to be displayed.\n   * @param {Date} date The date for which the id is being generated\n   * @param {string} namespace Namespace for the id. (month, year etc.)\n   * @returns {string}\n   */\n  CalendarCtrl.prototype.getDateId = function(date, namespace) {\n    if (!namespace) {\n      throw new Error('A namespace for the date id has to be specified.');\n    }\n\n    return [\n      'md',\n      this.id,\n      namespace,\n      date.getFullYear(),\n      date.getMonth(),\n      date.getDate()\n    ].join('-');\n  };\n\n  /**\n   * Util to trigger an extra digest on a parent scope, in order to to ensure that\n   * any child virtual repeaters have updated. This is necessary, because the virtual\n   * repeater doesn't update the $index the first time around since the content isn't\n   * in place yet. The case, in which this is an issue, is when the repeater has less\n   * than a page of content (e.g. a month or year view has a min or max date).\n   */\n  CalendarCtrl.prototype.updateVirtualRepeat = function() {\n    var scope = this.$scope;\n    var virtualRepeatResizeListener = scope.$on('$md-resize-enable', function() {\n      if (!scope.$$phase) {\n        scope.$apply();\n      }\n\n      virtualRepeatResizeListener();\n    });\n  };\n})();\n\n})();\n(function(){\n\"use strict\";\n\n(function() {\n  'use strict';\n\n  CalendarMonthCtrl.$inject = [\"$element\", \"$scope\", \"$animate\", \"$q\", \"$$mdDateUtil\", \"$mdDateLocale\"];\n  angular.module('material.components.datepicker')\n    .directive('mdCalendarMonth', calendarDirective);\n\n  /**\n   * Height of one calendar month tbody. This must be made known to the virtual-repeat and is\n   * subsequently used for scrolling to specific months.\n   */\n  var TBODY_HEIGHT = 265;\n\n  /**\n   * Height of a calendar month with a single row. This is needed to calculate the offset for\n   * rendering an extra month in virtual-repeat that only contains one row.\n   */\n  var TBODY_SINGLE_ROW_HEIGHT = 45;\n\n  /** Private directive that represents a list of months inside the calendar. */\n  function calendarDirective() {\n    return {\n      template:\n        '<table aria-hidden=\"true\" class=\"md-calendar-day-header\"><thead></thead></table>' +\n        '<div class=\"md-calendar-scroll-mask\">' +\n        '<md-virtual-repeat-container class=\"md-calendar-scroll-container\" ' +\n              'md-offset-size=\"' + (TBODY_SINGLE_ROW_HEIGHT - TBODY_HEIGHT) + '\">' +\n            '<table role=\"grid\" tabindex=\"0\" class=\"md-calendar\" aria-readonly=\"true\">' +\n              '<tbody ' +\n                  'md-calendar-month-body ' +\n                  'role=\"rowgroup\" ' +\n                  'md-virtual-repeat=\"i in monthCtrl.items\" ' +\n                  'md-month-offset=\"$index\" ' +\n                  'class=\"md-calendar-month\" ' +\n                  'md-start-index=\"monthCtrl.getSelectedMonthIndex()\" ' +\n                  'md-item-size=\"' + TBODY_HEIGHT + '\">' +\n\n                // The <tr> ensures that the <tbody> will always have the\n                // proper height, even if it's empty. If it's content is\n                // compiled, the <tr> will be overwritten.\n                '<tr aria-hidden=\"true\" style=\"height:' + TBODY_HEIGHT + 'px;\"></tr>' +\n              '</tbody>' +\n            '</table>' +\n          '</md-virtual-repeat-container>' +\n        '</div>',\n      require: ['^^mdCalendar', 'mdCalendarMonth'],\n      controller: CalendarMonthCtrl,\n      controllerAs: 'monthCtrl',\n      bindToController: true,\n      link: function(scope, element, attrs, controllers) {\n        var calendarCtrl = controllers[0];\n        var monthCtrl = controllers[1];\n        monthCtrl.initialize(calendarCtrl);\n      }\n    };\n  }\n\n  /**\n   * Controller for the calendar month component.\n   * @ngInject @constructor\n   */\n  function CalendarMonthCtrl($element, $scope, $animate, $q,\n    $$mdDateUtil, $mdDateLocale) {\n\n    /** @final {!angular.JQLite} */\n    this.$element = $element;\n\n    /** @final {!angular.Scope} */\n    this.$scope = $scope;\n\n    /** @final {!angular.$animate} */\n    this.$animate = $animate;\n\n    /** @final {!angular.$q} */\n    this.$q = $q;\n\n    /** @final */\n    this.dateUtil = $$mdDateUtil;\n\n    /** @final */\n    this.dateLocale = $mdDateLocale;\n\n    /** @final {HTMLElement} */\n    this.calendarScroller = $element[0].querySelector('.md-virtual-repeat-scroller');\n\n    /** @type {boolean} */\n    this.isInitialized = false;\n\n    /** @type {boolean} */\n    this.isMonthTransitionInProgress = false;\n\n    var self = this;\n\n    /**\n     * Handles a click event on a date cell.\n     * Created here so that every cell can use the same function instance.\n     * @this {HTMLTableCellElement} The cell that was clicked.\n     */\n    this.cellClickHandler = function() {\n      var timestamp = $$mdDateUtil.getTimestampFromNode(this);\n      self.$scope.$apply(function() {\n        self.calendarCtrl.setNgModelValue(timestamp);\n      });\n    };\n\n    /**\n     * Handles click events on the month headers. Switches\n     * the calendar to the year view.\n     * @this {HTMLTableCellElement} The cell that was clicked.\n     */\n    this.headerClickHandler = function() {\n      self.calendarCtrl.setCurrentView('year', $$mdDateUtil.getTimestampFromNode(this));\n    };\n  }\n\n  /*** Initialization ***/\n\n  /**\n   * Initialize the controller by saving a reference to the calendar and\n   * setting up the object that will be iterated by the virtual repeater.\n   */\n  CalendarMonthCtrl.prototype.initialize = function(calendarCtrl) {\n    /**\n     * Dummy array-like object for virtual-repeat to iterate over. The length is the total\n     * number of months that can be viewed. We add 2 months: one to include the current month\n     * and one for the last dummy month.\n     *\n     * This is shorter than ideal because of a (potential) Firefox bug\n     * https://bugzilla.mozilla.org/show_bug.cgi?id=1181658.\n     */\n\n    this.items = {\n      length: this.dateUtil.getMonthDistance(\n        calendarCtrl.firstRenderableDate,\n        calendarCtrl.lastRenderableDate\n      ) + 2\n    };\n\n    this.calendarCtrl = calendarCtrl;\n    this.attachScopeListeners();\n    calendarCtrl.updateVirtualRepeat();\n\n    // Fire the initial render, since we might have missed it the first time it fired.\n    calendarCtrl.ngModelCtrl && calendarCtrl.ngModelCtrl.$render();\n  };\n\n  /**\n   * Gets the \"index\" of the currently selected date as it would be in the virtual-repeat.\n   * @returns {number}\n   */\n  CalendarMonthCtrl.prototype.getSelectedMonthIndex = function() {\n    var calendarCtrl = this.calendarCtrl;\n\n    return this.dateUtil.getMonthDistance(\n      calendarCtrl.firstRenderableDate,\n      calendarCtrl.displayDate || calendarCtrl.selectedDate || calendarCtrl.today\n    );\n  };\n\n  /**\n   * Change the selected date in the calendar (ngModel value has already been changed).\n   * @param {Date} date\n   */\n  CalendarMonthCtrl.prototype.changeSelectedDate = function(date) {\n    var self = this;\n    var calendarCtrl = self.calendarCtrl;\n    var previousSelectedDate = calendarCtrl.selectedDate;\n    calendarCtrl.selectedDate = date;\n\n    this.changeDisplayDate(date).then(function() {\n      var selectedDateClass = calendarCtrl.SELECTED_DATE_CLASS;\n      var namespace = 'month';\n\n      // Remove the selected class from the previously selected date, if any.\n      if (previousSelectedDate) {\n        var prevDateCell = document.getElementById(calendarCtrl.getDateId(previousSelectedDate, namespace));\n        if (prevDateCell) {\n          prevDateCell.classList.remove(selectedDateClass);\n          prevDateCell.setAttribute('aria-selected', 'false');\n        }\n      }\n\n      // Apply the select class to the new selected date if it is set.\n      if (date) {\n        var dateCell = document.getElementById(calendarCtrl.getDateId(date, namespace));\n        if (dateCell) {\n          dateCell.classList.add(selectedDateClass);\n          dateCell.setAttribute('aria-selected', 'true');\n        }\n      }\n    });\n  };\n\n  /**\n   * Change the date that is being shown in the calendar. If the given date is in a different\n   * month, the displayed month will be transitioned.\n   * @param {Date} date\n   */\n  CalendarMonthCtrl.prototype.changeDisplayDate = function(date) {\n    // Initialization is deferred until this function is called because we want to reflect\n    // the starting value of ngModel.\n    if (!this.isInitialized) {\n      this.buildWeekHeader();\n      this.calendarCtrl.hideVerticalScrollbar(this);\n      this.isInitialized = true;\n      return this.$q.when();\n    }\n\n    // If trying to show an invalid date or a transition is in progress, do nothing.\n    if (!this.dateUtil.isValidDate(date) || this.isMonthTransitionInProgress) {\n      return this.$q.when();\n    }\n\n    this.isMonthTransitionInProgress = true;\n    var animationPromise = this.animateDateChange(date);\n\n    this.calendarCtrl.displayDate = date;\n\n    var self = this;\n    animationPromise.then(function() {\n      self.isMonthTransitionInProgress = false;\n    });\n\n    return animationPromise;\n  };\n\n  /**\n   * Animates the transition from the calendar's current month to the given month.\n   * @param {Date} date\n   * @returns {angular.$q.Promise} The animation promise.\n   */\n  CalendarMonthCtrl.prototype.animateDateChange = function(date) {\n    if (this.dateUtil.isValidDate(date)) {\n      var monthDistance = this.dateUtil.getMonthDistance(this.calendarCtrl.firstRenderableDate, date);\n      this.calendarScroller.scrollTop = monthDistance * TBODY_HEIGHT;\n    }\n\n    return this.$q.when();\n  };\n\n  /**\n   * Builds and appends a day-of-the-week header to the calendar.\n   * This should only need to be called once during initialization.\n   */\n  CalendarMonthCtrl.prototype.buildWeekHeader = function() {\n    var firstDayOfWeek = this.dateLocale.firstDayOfWeek;\n    var shortDays = this.dateLocale.shortDays;\n\n    var row = document.createElement('tr');\n    for (var i = 0; i < 7; i++) {\n      var th = document.createElement('th');\n      th.textContent = shortDays[(i + firstDayOfWeek) % 7];\n      row.appendChild(th);\n    }\n\n    this.$element.find('thead').append(row);\n  };\n\n  /**\n   * Attaches listeners for the scope events that are broadcast by the calendar.\n   */\n  CalendarMonthCtrl.prototype.attachScopeListeners = function() {\n    var self = this;\n\n    self.$scope.$on('md-calendar-parent-changed', function(event, value) {\n      self.changeSelectedDate(value);\n    });\n\n    self.$scope.$on('md-calendar-parent-action', angular.bind(this, this.handleKeyEvent));\n  };\n\n  /**\n   * Handles the month-specific keyboard interactions.\n   * @param {Object} event Scope event object passed by the calendar.\n   * @param {String} action Action, corresponding to the key that was pressed.\n   */\n  CalendarMonthCtrl.prototype.handleKeyEvent = function(event, action) {\n    var calendarCtrl = this.calendarCtrl;\n    var displayDate = calendarCtrl.displayDate;\n\n    if (action === 'select') {\n      calendarCtrl.setNgModelValue(displayDate);\n    } else {\n      var date = null;\n      var dateUtil = this.dateUtil;\n\n      switch (action) {\n        case 'move-right': date = dateUtil.incrementDays(displayDate, 1); break;\n        case 'move-left': date = dateUtil.incrementDays(displayDate, -1); break;\n\n        case 'move-page-down': date = dateUtil.incrementMonths(displayDate, 1); break;\n        case 'move-page-up': date = dateUtil.incrementMonths(displayDate, -1); break;\n\n        case 'move-row-down': date = dateUtil.incrementDays(displayDate, 7); break;\n        case 'move-row-up': date = dateUtil.incrementDays(displayDate, -7); break;\n\n        case 'start': date = dateUtil.getFirstDateOfMonth(displayDate); break;\n        case 'end': date = dateUtil.getLastDateOfMonth(displayDate); break;\n      }\n\n      if (date) {\n        date = this.dateUtil.clampDate(date, calendarCtrl.minDate, calendarCtrl.maxDate);\n\n        this.changeDisplayDate(date).then(function() {\n          calendarCtrl.focus(date);\n        });\n      }\n    }\n  };\n})();\n\n})();\n(function(){\n\"use strict\";\n\n(function() {\n  'use strict';\n\n  mdCalendarMonthBodyDirective.$inject = [\"$compile\", \"$$mdSvgRegistry\"];\n  CalendarMonthBodyCtrl.$inject = [\"$element\", \"$$mdDateUtil\", \"$mdDateLocale\"];\n  angular.module('material.components.datepicker')\n      .directive('mdCalendarMonthBody', mdCalendarMonthBodyDirective);\n\n  /**\n   * Private directive consumed by md-calendar-month. Having this directive lets the calender use\n   * md-virtual-repeat and also cleanly separates the month DOM construction functions from\n   * the rest of the calendar controller logic.\n   * @ngInject\n   */\n  function mdCalendarMonthBodyDirective($compile, $$mdSvgRegistry) {\n    var ARROW_ICON = $compile('<md-icon md-svg-src=\"' +\n      $$mdSvgRegistry.mdTabsArrow + '\"></md-icon>')({})[0];\n\n    return {\n      require: ['^^mdCalendar', '^^mdCalendarMonth', 'mdCalendarMonthBody'],\n      scope: { offset: '=mdMonthOffset' },\n      controller: CalendarMonthBodyCtrl,\n      controllerAs: 'mdMonthBodyCtrl',\n      bindToController: true,\n      link: function(scope, element, attrs, controllers) {\n        var calendarCtrl = controllers[0];\n        var monthCtrl = controllers[1];\n        var monthBodyCtrl = controllers[2];\n\n        monthBodyCtrl.calendarCtrl = calendarCtrl;\n        monthBodyCtrl.monthCtrl = monthCtrl;\n        monthBodyCtrl.arrowIcon = ARROW_ICON.cloneNode(true);\n\n        // The virtual-repeat re-uses the same DOM elements, so there are only a limited number\n        // of repeated items that are linked, and then those elements have their bindings updated.\n        // Since the months are not generated by bindings, we simply regenerate the entire thing\n        // when the binding (offset) changes.\n        scope.$watch(function() { return monthBodyCtrl.offset; }, function(offset) {\n          if (angular.isNumber(offset)) {\n            monthBodyCtrl.generateContent();\n          }\n        });\n      }\n    };\n  }\n\n  /**\n   * Controller for a single calendar month.\n   * @ngInject @constructor\n   */\n  function CalendarMonthBodyCtrl($element, $$mdDateUtil, $mdDateLocale) {\n    /** @final {!angular.JQLite} */\n    this.$element = $element;\n\n    /** @final */\n    this.dateUtil = $$mdDateUtil;\n\n    /** @final */\n    this.dateLocale = $mdDateLocale;\n\n    /** @type {Object} Reference to the month view. */\n    this.monthCtrl = null;\n\n    /** @type {Object} Reference to the calendar. */\n    this.calendarCtrl = null;\n\n    /**\n     * Number of months from the start of the month \"items\" that the currently rendered month\n     * occurs. Set via angular data binding.\n     * @type {number}\n     */\n    this.offset = null;\n\n    /**\n     * Date cell to focus after appending the month to the document.\n     * @type {HTMLElement}\n     */\n    this.focusAfterAppend = null;\n  }\n\n  /** Generate and append the content for this month to the directive element. */\n  CalendarMonthBodyCtrl.prototype.generateContent = function() {\n    var date = this.dateUtil.incrementMonths(this.calendarCtrl.firstRenderableDate, this.offset);\n\n    this.$element\n      .empty()\n      .append(this.buildCalendarForMonth(date));\n\n    if (this.focusAfterAppend) {\n      this.focusAfterAppend.classList.add(this.calendarCtrl.FOCUSED_DATE_CLASS);\n      this.focusAfterAppend.focus();\n      this.focusAfterAppend = null;\n    }\n  };\n\n  /**\n   * Creates a single cell to contain a date in the calendar with all appropriate\n   * attributes and classes added. If a date is given, the cell content will be set\n   * based on the date.\n   * @param {Date=} opt_date\n   * @returns {HTMLElement}\n   */\n  CalendarMonthBodyCtrl.prototype.buildDateCell = function(opt_date) {\n    var monthCtrl = this.monthCtrl;\n    var calendarCtrl = this.calendarCtrl;\n\n    // TODO(jelbourn): cloneNode is likely a faster way of doing this.\n    var cell = document.createElement('td');\n    cell.tabIndex = -1;\n    cell.classList.add('md-calendar-date');\n    cell.setAttribute('role', 'gridcell');\n\n    if (opt_date) {\n      cell.setAttribute('tabindex', '-1');\n      cell.setAttribute('aria-label', this.dateLocale.longDateFormatter(opt_date));\n      cell.id = calendarCtrl.getDateId(opt_date, 'month');\n\n      // Use `data-timestamp` attribute because IE10 does not support the `dataset` property.\n      cell.setAttribute('data-timestamp', opt_date.getTime());\n\n      // TODO(jelourn): Doing these comparisons for class addition during generation might be slow.\n      // It may be better to finish the construction and then query the node and add the class.\n      if (this.dateUtil.isSameDay(opt_date, calendarCtrl.today)) {\n        cell.classList.add(calendarCtrl.TODAY_CLASS);\n      }\n\n      if (this.dateUtil.isValidDate(calendarCtrl.selectedDate) &&\n          this.dateUtil.isSameDay(opt_date, calendarCtrl.selectedDate)) {\n        cell.classList.add(calendarCtrl.SELECTED_DATE_CLASS);\n        cell.setAttribute('aria-selected', 'true');\n      }\n\n      var cellText = this.dateLocale.dates[opt_date.getDate()];\n\n      if (this.isDateEnabled(opt_date)) {\n        // Add a indicator for select, hover, and focus states.\n        var selectionIndicator = document.createElement('span');\n        selectionIndicator.classList.add('md-calendar-date-selection-indicator');\n        selectionIndicator.textContent = cellText;\n        cell.appendChild(selectionIndicator);\n        cell.addEventListener('click', monthCtrl.cellClickHandler);\n\n        if (calendarCtrl.displayDate && this.dateUtil.isSameDay(opt_date, calendarCtrl.displayDate)) {\n          this.focusAfterAppend = cell;\n        }\n      } else {\n        cell.classList.add('md-calendar-date-disabled');\n        cell.textContent = cellText;\n      }\n    }\n\n    return cell;\n  };\n\n  /**\n   * Check whether date is in range and enabled\n   * @param {Date=} opt_date\n   * @return {boolean} Whether the date is enabled.\n   */\n  CalendarMonthBodyCtrl.prototype.isDateEnabled = function(opt_date) {\n    return this.dateUtil.isDateWithinRange(opt_date,\n          this.calendarCtrl.minDate, this.calendarCtrl.maxDate) &&\n          (!angular.isFunction(this.calendarCtrl.dateFilter)\n           || this.calendarCtrl.dateFilter(opt_date));\n  };\n\n  /**\n   * Builds a `tr` element for the calendar grid.\n   * @param rowNumber The week number within the month.\n   * @returns {HTMLElement}\n   */\n  CalendarMonthBodyCtrl.prototype.buildDateRow = function(rowNumber) {\n    var row = document.createElement('tr');\n    row.setAttribute('role', 'row');\n\n    // Because of an NVDA bug (with Firefox), the row needs an aria-label in order\n    // to prevent the entire row being read aloud when the user moves between rows.\n    // See http://community.nvda-project.org/ticket/4643.\n    row.setAttribute('aria-label', this.dateLocale.weekNumberFormatter(rowNumber));\n\n    return row;\n  };\n\n  /**\n   * Builds the <tbody> content for the given date's month.\n   * @param {Date=} opt_dateInMonth\n   * @returns {DocumentFragment} A document fragment containing the <tr> elements.\n   */\n  CalendarMonthBodyCtrl.prototype.buildCalendarForMonth = function(opt_dateInMonth) {\n    var date = this.dateUtil.isValidDate(opt_dateInMonth) ? opt_dateInMonth : new Date();\n\n    var firstDayOfMonth = this.dateUtil.getFirstDateOfMonth(date);\n    var firstDayOfTheWeek = this.getLocaleDay_(firstDayOfMonth);\n    var numberOfDaysInMonth = this.dateUtil.getNumberOfDaysInMonth(date);\n\n    // Store rows for the month in a document fragment so that we can append them all at once.\n    var monthBody = document.createDocumentFragment();\n\n    var rowNumber = 1;\n    var row = this.buildDateRow(rowNumber);\n    monthBody.appendChild(row);\n\n    // If this is the final month in the list of items, only the first week should render,\n    // so we should return immediately after the first row is complete and has been\n    // attached to the body.\n    var isFinalMonth = this.offset === this.monthCtrl.items.length - 1;\n\n    // Add a label for the month. If the month starts on a Sun/Mon/Tues, the month label\n    // goes on a row above the first of the month. Otherwise, the month label takes up the first\n    // two cells of the first row.\n    var blankCellOffset = 0;\n    var monthLabelCell = document.createElement('td');\n    var monthLabelCellContent = document.createElement('span');\n\n    monthLabelCellContent.textContent = this.dateLocale.monthHeaderFormatter(date);\n    monthLabelCell.appendChild(monthLabelCellContent);\n    monthLabelCell.classList.add('md-calendar-month-label');\n    // If the entire month is after the max date, render the label as a disabled state.\n    if (this.calendarCtrl.maxDate && firstDayOfMonth > this.calendarCtrl.maxDate) {\n      monthLabelCell.classList.add('md-calendar-month-label-disabled');\n    } else {\n      monthLabelCell.addEventListener('click', this.monthCtrl.headerClickHandler);\n      monthLabelCell.setAttribute('data-timestamp', firstDayOfMonth.getTime());\n      monthLabelCell.setAttribute('aria-label', this.dateLocale.monthFormatter(date));\n      monthLabelCell.appendChild(this.arrowIcon.cloneNode(true));\n    }\n\n    if (firstDayOfTheWeek <= 2) {\n      monthLabelCell.setAttribute('colspan', '7');\n\n      var monthLabelRow = this.buildDateRow();\n      monthLabelRow.appendChild(monthLabelCell);\n      monthBody.insertBefore(monthLabelRow, row);\n\n      if (isFinalMonth) {\n        return monthBody;\n      }\n    } else {\n      blankCellOffset = 3;\n      monthLabelCell.setAttribute('colspan', '3');\n      row.appendChild(monthLabelCell);\n    }\n\n    // Add a blank cell for each day of the week that occurs before the first of the month.\n    // For example, if the first day of the month is a Tuesday, add blank cells for Sun and Mon.\n    // The blankCellOffset is needed in cases where the first N cells are used by the month label.\n    for (var i = blankCellOffset; i < firstDayOfTheWeek; i++) {\n      row.appendChild(this.buildDateCell());\n    }\n\n    // Add a cell for each day of the month, keeping track of the day of the week so that\n    // we know when to start a new row.\n    var dayOfWeek = firstDayOfTheWeek;\n    var iterationDate = firstDayOfMonth;\n    for (var d = 1; d <= numberOfDaysInMonth; d++) {\n      // If we've reached the end of the week, start a new row.\n      if (dayOfWeek === 7) {\n        // We've finished the first row, so we're done if this is the final month.\n        if (isFinalMonth) {\n          return monthBody;\n        }\n        dayOfWeek = 0;\n        rowNumber++;\n        row = this.buildDateRow(rowNumber);\n        monthBody.appendChild(row);\n      }\n\n      iterationDate.setDate(d);\n      var cell = this.buildDateCell(iterationDate);\n      row.appendChild(cell);\n\n      dayOfWeek++;\n    }\n\n    // Ensure that the last row of the month has 7 cells.\n    while (row.childNodes.length < 7) {\n      row.appendChild(this.buildDateCell());\n    }\n\n    // Ensure that all months have 6 rows. This is necessary for now because the virtual-repeat\n    // requires that all items have exactly the same height.\n    while (monthBody.childNodes.length < 6) {\n      var whitespaceRow = this.buildDateRow();\n      for (var j = 0; j < 7; j++) {\n        whitespaceRow.appendChild(this.buildDateCell());\n      }\n      monthBody.appendChild(whitespaceRow);\n    }\n\n    return monthBody;\n  };\n\n  /**\n   * Gets the day-of-the-week index for a date for the current locale.\n   * @private\n   * @param {Date} date\n   * @returns {number} The column index of the date in the calendar.\n   */\n  CalendarMonthBodyCtrl.prototype.getLocaleDay_ = function(date) {\n    return (date.getDay() + (7 - this.dateLocale.firstDayOfWeek)) % 7;\n  };\n})();\n\n})();\n(function(){\n\"use strict\";\n\n(function() {\n  'use strict';\n\n  CalendarYearCtrl.$inject = [\"$element\", \"$scope\", \"$animate\", \"$q\", \"$$mdDateUtil\"];\n  angular.module('material.components.datepicker')\n    .directive('mdCalendarYear', calendarDirective);\n\n  /**\n   * Height of one calendar year tbody. This must be made known to the virtual-repeat and is\n   * subsequently used for scrolling to specific years.\n   */\n  var TBODY_HEIGHT = 88;\n\n  /** Private component, representing a list of years in the calendar. */\n  function calendarDirective() {\n    return {\n      template:\n        '<div class=\"md-calendar-scroll-mask\">' +\n          '<md-virtual-repeat-container class=\"md-calendar-scroll-container\">' +\n            '<table role=\"grid\" tabindex=\"0\" class=\"md-calendar\" aria-readonly=\"true\">' +\n              '<tbody ' +\n                  'md-calendar-year-body ' +\n                  'role=\"rowgroup\" ' +\n                  'md-virtual-repeat=\"i in yearCtrl.items\" ' +\n                  'md-year-offset=\"$index\" class=\"md-calendar-year\" ' +\n                  'md-start-index=\"yearCtrl.getFocusedYearIndex()\" ' +\n                  'md-item-size=\"' + TBODY_HEIGHT + '\">' +\n                // The <tr> ensures that the <tbody> will have the proper\n                // height, even though it may be empty.\n                '<tr aria-hidden=\"true\" style=\"height:' + TBODY_HEIGHT + 'px;\"></tr>' +\n              '</tbody>' +\n            '</table>' +\n          '</md-virtual-repeat-container>' +\n        '</div>',\n      require: ['^^mdCalendar', 'mdCalendarYear'],\n      controller: CalendarYearCtrl,\n      controllerAs: 'yearCtrl',\n      bindToController: true,\n      link: function(scope, element, attrs, controllers) {\n        var calendarCtrl = controllers[0];\n        var yearCtrl = controllers[1];\n        yearCtrl.initialize(calendarCtrl);\n      }\n    };\n  }\n\n  /**\n   * Controller for the mdCalendar component.\n   * @ngInject @constructor\n   */\n  function CalendarYearCtrl($element, $scope, $animate, $q, $$mdDateUtil) {\n\n    /** @final {!angular.JQLite} */\n    this.$element = $element;\n\n    /** @final {!angular.Scope} */\n    this.$scope = $scope;\n\n    /** @final {!angular.$animate} */\n    this.$animate = $animate;\n\n    /** @final {!angular.$q} */\n    this.$q = $q;\n\n    /** @final */\n    this.dateUtil = $$mdDateUtil;\n\n    /** @final {HTMLElement} */\n    this.calendarScroller = $element[0].querySelector('.md-virtual-repeat-scroller');\n\n    /** @type {boolean} */\n    this.isInitialized = false;\n\n    /** @type {boolean} */\n    this.isMonthTransitionInProgress = false;\n\n    var self = this;\n\n    /**\n     * Handles a click event on a date cell.\n     * Created here so that every cell can use the same function instance.\n     * @this {HTMLTableCellElement} The cell that was clicked.\n     */\n    this.cellClickHandler = function() {\n      self.calendarCtrl.setCurrentView('month', $$mdDateUtil.getTimestampFromNode(this));\n    };\n  }\n\n  /**\n   * Initialize the controller by saving a reference to the calendar and\n   * setting up the object that will be iterated by the virtual repeater.\n   */\n  CalendarYearCtrl.prototype.initialize = function(calendarCtrl) {\n    /**\n     * Dummy array-like object for virtual-repeat to iterate over. The length is the total\n     * number of years that can be viewed. We add 1 extra in order to include the current year.\n     */\n    this.items = {\n      length: this.dateUtil.getYearDistance(\n        calendarCtrl.firstRenderableDate,\n        calendarCtrl.lastRenderableDate\n      ) + 1\n    };\n\n    this.calendarCtrl = calendarCtrl;\n    this.attachScopeListeners();\n    calendarCtrl.updateVirtualRepeat();\n\n    // Fire the initial render, since we might have missed it the first time it fired.\n    calendarCtrl.ngModelCtrl && calendarCtrl.ngModelCtrl.$render();\n  };\n\n  /**\n   * Gets the \"index\" of the currently selected date as it would be in the virtual-repeat.\n   * @returns {number}\n   */\n  CalendarYearCtrl.prototype.getFocusedYearIndex = function() {\n    var calendarCtrl = this.calendarCtrl;\n\n    return this.dateUtil.getYearDistance(\n      calendarCtrl.firstRenderableDate,\n      calendarCtrl.displayDate || calendarCtrl.selectedDate || calendarCtrl.today\n    );\n  };\n\n  /**\n   * Change the date that is highlighted in the calendar.\n   * @param {Date} date\n   */\n  CalendarYearCtrl.prototype.changeDate = function(date) {\n    // Initialization is deferred until this function is called because we want to reflect\n    // the starting value of ngModel.\n    if (!this.isInitialized) {\n      this.calendarCtrl.hideVerticalScrollbar(this);\n      this.isInitialized = true;\n      return this.$q.when();\n    } else if (this.dateUtil.isValidDate(date) && !this.isMonthTransitionInProgress) {\n      var self = this;\n      var animationPromise = this.animateDateChange(date);\n\n      self.isMonthTransitionInProgress = true;\n      self.calendarCtrl.displayDate = date;\n\n      return animationPromise.then(function() {\n        self.isMonthTransitionInProgress = false;\n      });\n    }\n  };\n\n  /**\n   * Animates the transition from the calendar's current month to the given month.\n   * @param {Date} date\n   * @returns {angular.$q.Promise} The animation promise.\n   */\n  CalendarYearCtrl.prototype.animateDateChange = function(date) {\n    if (this.dateUtil.isValidDate(date)) {\n      var monthDistance = this.dateUtil.getYearDistance(this.calendarCtrl.firstRenderableDate, date);\n      this.calendarScroller.scrollTop = monthDistance * TBODY_HEIGHT;\n    }\n\n    return this.$q.when();\n  };\n\n  /**\n   * Handles the year-view-specific keyboard interactions.\n   * @param {Object} event Scope event object passed by the calendar.\n   * @param {String} action Action, corresponding to the key that was pressed.\n   */\n  CalendarYearCtrl.prototype.handleKeyEvent = function(event, action) {\n    var calendarCtrl = this.calendarCtrl;\n    var displayDate = calendarCtrl.displayDate;\n\n    if (action === 'select') {\n      this.changeDate(displayDate).then(function() {\n        calendarCtrl.setCurrentView('month', displayDate);\n        calendarCtrl.focus(displayDate);\n      });\n    } else {\n      var date = null;\n      var dateUtil = this.dateUtil;\n\n      switch (action) {\n        case 'move-right': date = dateUtil.incrementMonths(displayDate, 1); break;\n        case 'move-left': date = dateUtil.incrementMonths(displayDate, -1); break;\n\n        case 'move-row-down': date = dateUtil.incrementMonths(displayDate, 6); break;\n        case 'move-row-up': date = dateUtil.incrementMonths(displayDate, -6); break;\n      }\n\n      if (date) {\n        var min = calendarCtrl.minDate ? dateUtil.getFirstDateOfMonth(calendarCtrl.minDate) : null;\n        var max = calendarCtrl.maxDate ? dateUtil.getFirstDateOfMonth(calendarCtrl.maxDate) : null;\n        date = dateUtil.getFirstDateOfMonth(this.dateUtil.clampDate(date, min, max));\n\n        this.changeDate(date).then(function() {\n          calendarCtrl.focus(date);\n        });\n      }\n    }\n  };\n\n  /**\n   * Attaches listeners for the scope events that are broadcast by the calendar.\n   */\n  CalendarYearCtrl.prototype.attachScopeListeners = function() {\n    var self = this;\n\n    self.$scope.$on('md-calendar-parent-changed', function(event, value) {\n      self.changeDate(value);\n    });\n\n    self.$scope.$on('md-calendar-parent-action', angular.bind(self, self.handleKeyEvent));\n  };\n})();\n\n})();\n(function(){\n\"use strict\";\n\n(function() {\n  'use strict';\n\n  CalendarYearBodyCtrl.$inject = [\"$element\", \"$$mdDateUtil\", \"$mdDateLocale\"];\n  angular.module('material.components.datepicker')\n      .directive('mdCalendarYearBody', mdCalendarYearDirective);\n\n  /**\n   * Private component, consumed by the md-calendar-year, which separates the DOM construction logic\n   * and allows for the year view to use md-virtual-repeat.\n   */\n  function mdCalendarYearDirective() {\n    return {\n      require: ['^^mdCalendar', '^^mdCalendarYear', 'mdCalendarYearBody'],\n      scope: { offset: '=mdYearOffset' },\n      controller: CalendarYearBodyCtrl,\n      controllerAs: 'mdYearBodyCtrl',\n      bindToController: true,\n      link: function(scope, element, attrs, controllers) {\n        var calendarCtrl = controllers[0];\n        var yearCtrl = controllers[1];\n        var yearBodyCtrl = controllers[2];\n\n        yearBodyCtrl.calendarCtrl = calendarCtrl;\n        yearBodyCtrl.yearCtrl = yearCtrl;\n\n        scope.$watch(function() { return yearBodyCtrl.offset; }, function(offset) {\n          if (angular.isNumber(offset)) {\n            yearBodyCtrl.generateContent();\n          }\n        });\n      }\n    };\n  }\n\n  /**\n   * Controller for a single year.\n   * @ngInject @constructor\n   */\n  function CalendarYearBodyCtrl($element, $$mdDateUtil, $mdDateLocale) {\n    /** @final {!angular.JQLite} */\n    this.$element = $element;\n\n    /** @final */\n    this.dateUtil = $$mdDateUtil;\n\n    /** @final */\n    this.dateLocale = $mdDateLocale;\n\n    /** @type {Object} Reference to the calendar. */\n    this.calendarCtrl = null;\n\n    /** @type {Object} Reference to the year view. */\n    this.yearCtrl = null;\n\n    /**\n     * Number of months from the start of the month \"items\" that the currently rendered month\n     * occurs. Set via angular data binding.\n     * @type {number}\n     */\n    this.offset = null;\n\n    /**\n     * Date cell to focus after appending the month to the document.\n     * @type {HTMLElement}\n     */\n    this.focusAfterAppend = null;\n  }\n\n  /** Generate and append the content for this year to the directive element. */\n  CalendarYearBodyCtrl.prototype.generateContent = function() {\n    var date = this.dateUtil.incrementYears(this.calendarCtrl.firstRenderableDate, this.offset);\n\n    this.$element\n      .empty()\n      .append(this.buildCalendarForYear(date));\n\n    if (this.focusAfterAppend) {\n      this.focusAfterAppend.classList.add(this.calendarCtrl.FOCUSED_DATE_CLASS);\n      this.focusAfterAppend.focus();\n      this.focusAfterAppend = null;\n    }\n  };\n\n  /**\n   * Creates a single cell to contain a year in the calendar.\n   * @param {number} opt_year Four-digit year.\n   * @param {number} opt_month Zero-indexed month.\n   * @returns {HTMLElement}\n   */\n  CalendarYearBodyCtrl.prototype.buildMonthCell = function(year, month) {\n    var calendarCtrl = this.calendarCtrl;\n    var yearCtrl = this.yearCtrl;\n    var cell = this.buildBlankCell();\n\n    // Represent this month/year as a date.\n    var firstOfMonth = new Date(year, month, 1);\n    cell.setAttribute('aria-label', this.dateLocale.monthFormatter(firstOfMonth));\n    cell.id = calendarCtrl.getDateId(firstOfMonth, 'year');\n\n    // Use `data-timestamp` attribute because IE10 does not support the `dataset` property.\n    cell.setAttribute('data-timestamp', firstOfMonth.getTime());\n\n    if (this.dateUtil.isSameMonthAndYear(firstOfMonth, calendarCtrl.today)) {\n      cell.classList.add(calendarCtrl.TODAY_CLASS);\n    }\n\n    if (this.dateUtil.isValidDate(calendarCtrl.selectedDate) &&\n        this.dateUtil.isSameMonthAndYear(firstOfMonth, calendarCtrl.selectedDate)) {\n      cell.classList.add(calendarCtrl.SELECTED_DATE_CLASS);\n      cell.setAttribute('aria-selected', 'true');\n    }\n\n    var cellText = this.dateLocale.shortMonths[month];\n\n    if (this.dateUtil.isMonthWithinRange(firstOfMonth,\n        calendarCtrl.minDate, calendarCtrl.maxDate)) {\n      var selectionIndicator = document.createElement('span');\n      selectionIndicator.classList.add('md-calendar-date-selection-indicator');\n      selectionIndicator.textContent = cellText;\n      cell.appendChild(selectionIndicator);\n      cell.addEventListener('click', yearCtrl.cellClickHandler);\n\n      if (calendarCtrl.displayDate && this.dateUtil.isSameMonthAndYear(firstOfMonth, calendarCtrl.displayDate)) {\n        this.focusAfterAppend = cell;\n      }\n    } else {\n      cell.classList.add('md-calendar-date-disabled');\n      cell.textContent = cellText;\n    }\n\n    return cell;\n  };\n\n  /**\n   * Builds a blank cell.\n   * @return {HTMLTableCellElement}\n   */\n  CalendarYearBodyCtrl.prototype.buildBlankCell = function() {\n    var cell = document.createElement('td');\n    cell.tabIndex = -1;\n    cell.classList.add('md-calendar-date');\n    cell.setAttribute('role', 'gridcell');\n\n    cell.setAttribute('tabindex', '-1');\n    return cell;\n  };\n\n  /**\n   * Builds the <tbody> content for the given year.\n   * @param {Date} date Date for which the content should be built.\n   * @returns {DocumentFragment} A document fragment containing the months within the year.\n   */\n  CalendarYearBodyCtrl.prototype.buildCalendarForYear = function(date) {\n    // Store rows for the month in a document fragment so that we can append them all at once.\n    var year = date.getFullYear();\n    var yearBody = document.createDocumentFragment();\n\n    var monthCell, i;\n    // First row contains label and Jan-Jun.\n    var firstRow = document.createElement('tr');\n    var labelCell = document.createElement('td');\n    labelCell.className = 'md-calendar-month-label';\n    labelCell.textContent = year;\n    firstRow.appendChild(labelCell);\n\n    for (i = 0; i < 6; i++) {\n      firstRow.appendChild(this.buildMonthCell(year, i));\n    }\n    yearBody.appendChild(firstRow);\n\n    // Second row contains a blank cell and Jul-Dec.\n    var secondRow = document.createElement('tr');\n    secondRow.appendChild(this.buildBlankCell());\n    for (i = 6; i < 12; i++) {\n      secondRow.appendChild(this.buildMonthCell(year, i));\n    }\n    yearBody.appendChild(secondRow);\n\n    return yearBody;\n  };\n})();\n\n})();\n(function(){\n\"use strict\";\n\n(function() {\n  'use strict';\n\n  /**\n   * @ngdoc service\n   * @name $mdDateLocaleProvider\n   * @module material.components.datepicker\n   *\n   * @description\n   * The `$mdDateLocaleProvider` is the provider that creates the `$mdDateLocale` service.\n   * This provider that allows the user to specify messages, formatters, and parsers for date\n   * internationalization. The `$mdDateLocale` service itself is consumed by AngularJS Material\n   * components that deal with dates.\n   *\n   * @property {(Array<string>)=} months Array of month names (in order).\n   * @property {(Array<string>)=} shortMonths Array of abbreviated month names.\n   * @property {(Array<string>)=} days Array of the days of the week (in order).\n   * @property {(Array<string>)=} shortDays Array of abbreviated days of the week.\n   * @property {(Array<string>)=} dates Array of dates of the month. Only necessary for locales\n   *     using a numeral system other than [1, 2, 3...].\n   * @property {(Array<string>)=} firstDayOfWeek The first day of the week. Sunday = 0, Monday = 1,\n   *    etc.\n   * @property {(function(string): Date)=} parseDate Function to parse a date object from a string.\n   * @property {(function(Date, string): string)=} formatDate Function to format a date object to a\n   *     string. The datepicker directive also provides the time zone, if it was specified.\n   * @property {(function(Date): string)=} monthHeaderFormatter Function that returns the label for\n   *     a month given a date.\n   * @property {(function(Date): string)=} monthFormatter Function that returns the full name of a month\n   *     for a given date.\n   * @property {(function(number): string)=} weekNumberFormatter Function that returns a label for\n   *     a week given the week number.\n   * @property {(string)=} msgCalendar Translation of the label \"Calendar\" for the current locale.\n   * @property {(string)=} msgOpenCalendar Translation of the button label \"Open calendar\" for the\n   *     current locale.\n   * @property {Date=} firstRenderableDate The date from which the datepicker calendar will begin\n   * rendering. Note that this will be ignored if a minimum date is set. Defaults to January 1st 1880.\n   * @property {Date=} lastRenderableDate The last date that will be rendered by the datepicker\n   * calendar. Note that this will be ignored if a maximum date is set. Defaults to January 1st 2130.\n   *\n   * @usage\n   * <hljs lang=\"js\">\n   * myAppModule.config(function($mdDateLocaleProvider) {\n   *\n   *     // Example of a French localization.\n   *     $mdDateLocaleProvider.months = ['janvier', 'février', 'mars', ...];\n   *     $mdDateLocaleProvider.shortMonths = ['janv', 'févr', 'mars', ...];\n   *     $mdDateLocaleProvider.days = ['dimanche', 'lundi', 'mardi', ...];\n   *     $mdDateLocaleProvider.shortDays = ['Di', 'Lu', 'Ma', ...];\n   *\n   *     // Can change week display to start on Monday.\n   *     $mdDateLocaleProvider.firstDayOfWeek = 1;\n   *\n   *     // Optional.\n   *     $mdDateLocaleProvider.dates = [1, 2, 3, 4, 5, 6, ...];\n   *\n   *     // Example uses moment.js to parse and format dates.\n   *     $mdDateLocaleProvider.parseDate = function(dateString) {\n   *       var m = moment(dateString, 'L', true);\n   *       return m.isValid() ? m.toDate() : new Date(NaN);\n   *     };\n   *\n   *     $mdDateLocaleProvider.formatDate = function(date) {\n   *       var m = moment(date);\n   *       return m.isValid() ? m.format('L') : '';\n   *     };\n   *\n   *     $mdDateLocaleProvider.monthHeaderFormatter = function(date) {\n   *       return myShortMonths[date.getMonth()] + ' ' + date.getFullYear();\n   *     };\n   *\n   *     // In addition to date display, date components also need localized messages\n   *     // for aria-labels for screen-reader users.\n   *\n   *     $mdDateLocaleProvider.weekNumberFormatter = function(weekNumber) {\n   *       return 'Semaine ' + weekNumber;\n   *     };\n   *\n   *     $mdDateLocaleProvider.msgCalendar = 'Calendrier';\n   *     $mdDateLocaleProvider.msgOpenCalendar = 'Ouvrir le calendrier';\n   *\n   *     // You can also set when your calendar begins and ends.\n   *     $mdDateLocaleProvider.firstRenderableDate = new Date(1776, 6, 4);\n   *     $mdDateLocaleProvider.lastRenderableDate = new Date(2012, 11, 21);\n   * });\n   * </hljs>\n   *\n   */\n  angular.module('material.components.datepicker').config([\"$provide\", function($provide) {\n    // TODO(jelbourn): Assert provided values are correctly formatted. Need assertions.\n\n    /** @constructor */\n    function DateLocaleProvider() {\n      /** Array of full month names. E.g., ['January', 'Febuary', ...] */\n      this.months = null;\n\n      /** Array of abbreviated month names. E.g., ['Jan', 'Feb', ...] */\n      this.shortMonths = null;\n\n      /** Array of full day of the week names. E.g., ['Monday', 'Tuesday', ...] */\n      this.days = null;\n\n      /** Array of abbreviated dat of the week names. E.g., ['M', 'T', ...] */\n      this.shortDays = null;\n\n      /** Array of dates of a month (1 - 31). Characters might be different in some locales. */\n      this.dates = null;\n\n      /** Index of the first day of the week. 0 = Sunday, 1 = Monday, etc. */\n      this.firstDayOfWeek = 0;\n\n      /**\n       * Function that converts the date portion of a Date to a string.\n       * @type {(function(Date): string)}\n       */\n      this.formatDate = null;\n\n      /**\n       * Function that converts a date string to a Date object (the date portion)\n       * @type {function(string): Date}\n       */\n      this.parseDate = null;\n\n      /**\n       * Function that formats a Date into a month header string.\n       * @type {function(Date): string}\n       */\n      this.monthHeaderFormatter = null;\n\n      /**\n       * Function that formats a week number into a label for the week.\n       * @type {function(number): string}\n       */\n      this.weekNumberFormatter = null;\n\n      /**\n       * Function that formats a date into a long aria-label that is read\n       * when the focused date changes.\n       * @type {function(Date): string}\n       */\n      this.longDateFormatter = null;\n\n      /**\n       * ARIA label for the calendar \"dialog\" used in the datepicker.\n       * @type {string}\n       */\n      this.msgCalendar = '';\n\n      /**\n       * ARIA label for the datepicker's \"Open calendar\" buttons.\n       * @type {string}\n       */\n      this.msgOpenCalendar = '';\n    }\n\n    /**\n     * Factory function that returns an instance of the dateLocale service.\n     * @ngInject\n     * @param $locale\n     * @returns {DateLocale}\n     */\n    DateLocaleProvider.prototype.$get = function($locale, $filter) {\n      /**\n       * Default date-to-string formatting function.\n       * @param {!Date} date\n       * @param {string=} timezone\n       * @returns {string}\n       */\n      function defaultFormatDate(date, timezone) {\n        if (!date) {\n          return '';\n        }\n\n        // All of the dates created through ng-material *should* be set to midnight.\n        // If we encounter a date where the localeTime shows at 11pm instead of midnight,\n        // we have run into an issue with DST where we need to increment the hour by one:\n        // var d = new Date(1992, 9, 8, 0, 0, 0);\n        // d.toLocaleString(); // == \"10/7/1992, 11:00:00 PM\"\n        var localeTime = date.toLocaleTimeString();\n        var formatDate = date;\n        if (date.getHours() === 0 &&\n            (localeTime.indexOf('11:') !== -1 || localeTime.indexOf('23:') !== -1)) {\n          formatDate = new Date(date.getFullYear(), date.getMonth(), date.getDate(), 1, 0, 0);\n        }\n\n        return $filter('date')(formatDate, 'M/d/yyyy', timezone);\n      }\n\n      /**\n       * Default string-to-date parsing function.\n       * @param {string} dateString\n       * @returns {!Date}\n       */\n      function defaultParseDate(dateString) {\n        return new Date(dateString);\n      }\n\n      /**\n       * Default function to determine whether a string makes sense to be\n       * parsed to a Date object.\n       *\n       * This is very permissive and is just a basic sanity check to ensure that\n       * things like single integers aren't able to be parsed into dates.\n       * @param {string} dateString\n       * @returns {boolean}\n       */\n      function defaultIsDateComplete(dateString) {\n        dateString = dateString.trim();\n\n        // Looks for three chunks of content (either numbers or text) separated\n        // by delimiters.\n        var re = /^(([a-zA-Z]{3,}|[0-9]{1,4})([ \\.,]+|[\\/\\-])){2}([a-zA-Z]{3,}|[0-9]{1,4})$/;\n        return re.test(dateString);\n      }\n\n      /**\n       * Default date-to-string formatter to get a month header.\n       * @param {!Date} date\n       * @returns {string}\n       */\n      function defaultMonthHeaderFormatter(date) {\n        return service.shortMonths[date.getMonth()] + ' ' + date.getFullYear();\n      }\n\n      /**\n       * Default formatter for a month.\n       * @param {!Date} date\n       * @returns {string}\n       */\n      function defaultMonthFormatter(date) {\n        return service.months[date.getMonth()] + ' ' + date.getFullYear();\n      }\n\n      /**\n       * Default week number formatter.\n       * @param number\n       * @returns {string}\n       */\n      function defaultWeekNumberFormatter(number) {\n        return 'Week ' + number;\n      }\n\n      /**\n       * Default formatter for date cell aria-labels.\n       * @param {!Date} date\n       * @returns {string}\n       */\n      function defaultLongDateFormatter(date) {\n        // Example: 'Thursday June 18 2015'\n        return [\n          service.days[date.getDay()],\n          service.months[date.getMonth()],\n          service.dates[date.getDate()],\n          date.getFullYear()\n        ].join(' ');\n      }\n\n      // The default \"short\" day strings are the first character of each day,\n      // e.g., \"Monday\" => \"M\".\n      var defaultShortDays = $locale.DATETIME_FORMATS.SHORTDAY.map(function(day) {\n        return day.substring(0, 1);\n      });\n\n      // The default dates are simply the numbers 1 through 31.\n      var defaultDates = Array(32);\n      for (var i = 1; i <= 31; i++) {\n        defaultDates[i] = i;\n      }\n\n      // Default ARIA messages are in English (US).\n      var defaultMsgCalendar = 'Calendar';\n      var defaultMsgOpenCalendar = 'Open calendar';\n\n      // Default start/end dates that are rendered in the calendar.\n      var defaultFirstRenderableDate = new Date(1880, 0, 1);\n      var defaultLastRendereableDate = new Date(defaultFirstRenderableDate.getFullYear() + 250, 0, 1);\n\n      var service = {\n        months: this.months || $locale.DATETIME_FORMATS.MONTH,\n        shortMonths: this.shortMonths || $locale.DATETIME_FORMATS.SHORTMONTH,\n        days: this.days || $locale.DATETIME_FORMATS.DAY,\n        shortDays: this.shortDays || defaultShortDays,\n        dates: this.dates || defaultDates,\n        firstDayOfWeek: this.firstDayOfWeek || 0,\n        formatDate: this.formatDate || defaultFormatDate,\n        parseDate: this.parseDate || defaultParseDate,\n        isDateComplete: this.isDateComplete || defaultIsDateComplete,\n        monthHeaderFormatter: this.monthHeaderFormatter || defaultMonthHeaderFormatter,\n        monthFormatter: this.monthFormatter || defaultMonthFormatter,\n        weekNumberFormatter: this.weekNumberFormatter || defaultWeekNumberFormatter,\n        longDateFormatter: this.longDateFormatter || defaultLongDateFormatter,\n        msgCalendar: this.msgCalendar || defaultMsgCalendar,\n        msgOpenCalendar: this.msgOpenCalendar || defaultMsgOpenCalendar,\n        firstRenderableDate: this.firstRenderableDate || defaultFirstRenderableDate,\n        lastRenderableDate: this.lastRenderableDate || defaultLastRendereableDate\n      };\n\n      return service;\n    };\n    DateLocaleProvider.prototype.$get.$inject = [\"$locale\", \"$filter\"];\n\n    $provide.provider('$mdDateLocale', new DateLocaleProvider());\n  }]);\n})();\n\n})();\n(function(){\n\"use strict\";\n\n(function() {\n  'use strict';\n\n  /**\n   * Utility for performing date calculations to facilitate operation of the calendar and\n   * datepicker.\n   */\n  angular.module('material.components.datepicker').factory('$$mdDateUtil', function() {\n    return {\n      getFirstDateOfMonth: getFirstDateOfMonth,\n      getNumberOfDaysInMonth: getNumberOfDaysInMonth,\n      getDateInNextMonth: getDateInNextMonth,\n      getDateInPreviousMonth: getDateInPreviousMonth,\n      isInNextMonth: isInNextMonth,\n      isInPreviousMonth: isInPreviousMonth,\n      getDateMidpoint: getDateMidpoint,\n      isSameMonthAndYear: isSameMonthAndYear,\n      getWeekOfMonth: getWeekOfMonth,\n      incrementDays: incrementDays,\n      incrementMonths: incrementMonths,\n      getLastDateOfMonth: getLastDateOfMonth,\n      isSameDay: isSameDay,\n      getMonthDistance: getMonthDistance,\n      isValidDate: isValidDate,\n      setDateTimeToMidnight: setDateTimeToMidnight,\n      createDateAtMidnight: createDateAtMidnight,\n      isDateWithinRange: isDateWithinRange,\n      incrementYears: incrementYears,\n      getYearDistance: getYearDistance,\n      clampDate: clampDate,\n      getTimestampFromNode: getTimestampFromNode,\n      isMonthWithinRange: isMonthWithinRange\n    };\n\n    /**\n     * Gets the first day of the month for the given date's month.\n     * @param {Date} date\n     * @returns {Date}\n     */\n    function getFirstDateOfMonth(date) {\n      return new Date(date.getFullYear(), date.getMonth(), 1);\n    }\n\n    /**\n     * Gets the number of days in the month for the given date's month.\n     * @param date\n     * @returns {number}\n     */\n    function getNumberOfDaysInMonth(date) {\n      return new Date(date.getFullYear(), date.getMonth() + 1, 0).getDate();\n    }\n\n    /**\n     * Get an arbitrary date in the month after the given date's month.\n     * @param date\n     * @returns {Date}\n     */\n    function getDateInNextMonth(date) {\n      return new Date(date.getFullYear(), date.getMonth() + 1, 1);\n    }\n\n    /**\n     * Get an arbitrary date in the month before the given date's month.\n     * @param date\n     * @returns {Date}\n     */\n    function getDateInPreviousMonth(date) {\n      return new Date(date.getFullYear(), date.getMonth() - 1, 1);\n    }\n\n    /**\n     * Gets whether two dates have the same month and year.\n     * @param {Date} d1\n     * @param {Date} d2\n     * @returns {boolean}\n     */\n    function isSameMonthAndYear(d1, d2) {\n      return d1.getFullYear() === d2.getFullYear() && d1.getMonth() === d2.getMonth();\n    }\n\n    /**\n     * Gets whether two dates are the same day (not not necesarily the same time).\n     * @param {Date} d1\n     * @param {Date} d2\n     * @returns {boolean}\n     */\n    function isSameDay(d1, d2) {\n      return d1.getDate() == d2.getDate() && isSameMonthAndYear(d1, d2);\n    }\n\n    /**\n     * Gets whether a date is in the month immediately after some date.\n     * @param {Date} startDate The date from which to compare.\n     * @param {Date} endDate The date to check.\n     * @returns {boolean}\n     */\n    function isInNextMonth(startDate, endDate) {\n      var nextMonth = getDateInNextMonth(startDate);\n      return isSameMonthAndYear(nextMonth, endDate);\n    }\n\n    /**\n     * Gets whether a date is in the month immediately before some date.\n     * @param {Date} startDate The date from which to compare.\n     * @param {Date} endDate The date to check.\n     * @returns {boolean}\n     */\n    function isInPreviousMonth(startDate, endDate) {\n      var previousMonth = getDateInPreviousMonth(startDate);\n      return isSameMonthAndYear(endDate, previousMonth);\n    }\n\n    /**\n     * Gets the midpoint between two dates.\n     * @param {Date} d1\n     * @param {Date} d2\n     * @returns {Date}\n     */\n    function getDateMidpoint(d1, d2) {\n      return createDateAtMidnight((d1.getTime() + d2.getTime()) / 2);\n    }\n\n    /**\n     * Gets the week of the month that a given date occurs in.\n     * @param {Date} date\n     * @returns {number} Index of the week of the month (zero-based).\n     */\n    function getWeekOfMonth(date) {\n      var firstDayOfMonth = getFirstDateOfMonth(date);\n      return Math.floor((firstDayOfMonth.getDay() + date.getDate() - 1) / 7);\n    }\n\n    /**\n     * Gets a new date incremented by the given number of days. Number of days can be negative.\n     * @param {Date} date\n     * @param {number} numberOfDays\n     * @returns {Date}\n     */\n    function incrementDays(date, numberOfDays) {\n      return new Date(date.getFullYear(), date.getMonth(), date.getDate() + numberOfDays);\n    }\n\n    /**\n     * Gets a new date incremented by the given number of months. Number of months can be negative.\n     * If the date of the given month does not match the target month, the date will be set to the\n     * last day of the month.\n     * @param {Date} date\n     * @param {number} numberOfMonths\n     * @returns {Date}\n     */\n    function incrementMonths(date, numberOfMonths) {\n      // If the same date in the target month does not actually exist, the Date object will\n      // automatically advance *another* month by the number of missing days.\n      // For example, if you try to go from Jan. 30 to Feb. 30, you'll end up on March 2.\n      // So, we check if the month overflowed and go to the last day of the target month instead.\n      var dateInTargetMonth = new Date(date.getFullYear(), date.getMonth() + numberOfMonths, 1);\n      var numberOfDaysInMonth = getNumberOfDaysInMonth(dateInTargetMonth);\n      if (numberOfDaysInMonth < date.getDate()) {\n        dateInTargetMonth.setDate(numberOfDaysInMonth);\n      } else {\n        dateInTargetMonth.setDate(date.getDate());\n      }\n\n      return dateInTargetMonth;\n    }\n\n    /**\n     * Get the integer distance between two months. This *only* considers the month and year\n     * portion of the Date instances.\n     *\n     * @param {Date} start\n     * @param {Date} end\n     * @returns {number} Number of months between `start` and `end`. If `end` is before `start`\n     *     chronologically, this number will be negative.\n     */\n    function getMonthDistance(start, end) {\n      return (12 * (end.getFullYear() - start.getFullYear())) + (end.getMonth() - start.getMonth());\n    }\n\n    /**\n     * Gets the last day of the month for the given date.\n     * @param {Date} date\n     * @returns {Date}\n     */\n    function getLastDateOfMonth(date) {\n      return new Date(date.getFullYear(), date.getMonth(), getNumberOfDaysInMonth(date));\n    }\n\n    /**\n     * Checks whether a date is valid.\n     * @param {Date} date\n     * @return {boolean} Whether the date is a valid Date.\n     */\n    function isValidDate(date) {\n      return date && date.getTime && !isNaN(date.getTime());\n    }\n\n    /**\n     * Sets a date's time to midnight.\n     * @param {Date} date\n     */\n    function setDateTimeToMidnight(date) {\n      if (isValidDate(date)) {\n        date.setHours(0, 0, 0, 0);\n      }\n    }\n\n    /**\n     * Creates a date with the time set to midnight.\n     * Drop-in replacement for two forms of the Date constructor:\n     * 1. No argument for Date representing now.\n     * 2. Single-argument value representing number of seconds since Unix Epoch\n     * or a Date object.\n     * @param {number|Date=} opt_value\n     * @return {Date} New date with time set to midnight.\n     */\n    function createDateAtMidnight(opt_value) {\n      var date;\n      if (angular.isUndefined(opt_value)) {\n        date = new Date();\n      } else {\n        date = new Date(opt_value);\n      }\n      setDateTimeToMidnight(date);\n      return date;\n    }\n\n     /**\n      * Checks if a date is within a min and max range, ignoring the time component.\n      * If minDate or maxDate are not dates, they are ignored.\n      * @param {Date} date\n      * @param {Date} minDate\n      * @param {Date} maxDate\n      */\n     function isDateWithinRange(date, minDate, maxDate) {\n       var dateAtMidnight = createDateAtMidnight(date);\n       var minDateAtMidnight = isValidDate(minDate) ? createDateAtMidnight(minDate) : null;\n       var maxDateAtMidnight = isValidDate(maxDate) ? createDateAtMidnight(maxDate) : null;\n       return (!minDateAtMidnight || minDateAtMidnight <= dateAtMidnight) &&\n           (!maxDateAtMidnight || maxDateAtMidnight >= dateAtMidnight);\n     }\n\n    /**\n     * Gets a new date incremented by the given number of years. Number of years can be negative.\n     * See `incrementMonths` for notes on overflow for specific dates.\n     * @param {Date} date\n     * @param {number} numberOfYears\n     * @returns {Date}\n     */\n     function incrementYears(date, numberOfYears) {\n       return incrementMonths(date, numberOfYears * 12);\n     }\n\n     /**\n      * Get the integer distance between two years. This *only* considers the year portion of the\n      * Date instances.\n      *\n      * @param {Date} start\n      * @param {Date} end\n      * @returns {number} Number of months between `start` and `end`. If `end` is before `start`\n      *     chronologically, this number will be negative.\n      */\n     function getYearDistance(start, end) {\n       return end.getFullYear() - start.getFullYear();\n     }\n\n     /**\n      * Clamps a date between a minimum and a maximum date.\n      * @param {Date} date Date to be clamped\n      * @param {Date=} minDate Minimum date\n      * @param {Date=} maxDate Maximum date\n      * @return {Date}\n      */\n     function clampDate(date, minDate, maxDate) {\n       var boundDate = date;\n       if (minDate && date < minDate) {\n         boundDate = new Date(minDate.getTime());\n       }\n       if (maxDate && date > maxDate) {\n         boundDate = new Date(maxDate.getTime());\n       }\n       return boundDate;\n     }\n\n     /**\n      * Extracts and parses the timestamp from a DOM node.\n      * @param  {HTMLElement} node Node from which the timestamp will be extracted.\n      * @return {number} Time since epoch.\n      */\n     function getTimestampFromNode(node) {\n       if (node && node.hasAttribute('data-timestamp')) {\n         return Number(node.getAttribute('data-timestamp'));\n       }\n     }\n\n     /**\n      * Checks if a month is within a min and max range, ignoring the date and time components.\n      * If minDate or maxDate are not dates, they are ignored.\n      * @param {Date} date\n      * @param {Date} minDate\n      * @param {Date} maxDate\n      */\n     function isMonthWithinRange(date, minDate, maxDate) {\n       var month = date.getMonth();\n       var year = date.getFullYear();\n\n       return (!minDate || minDate.getFullYear() < year || minDate.getMonth() <= month) &&\n        (!maxDate || maxDate.getFullYear() > year || maxDate.getMonth() >= month);\n     }\n  });\n})();\n\n})();\n(function(){\n\"use strict\";\n\n(function() {\n  'use strict';\n\n  // POST RELEASE\n  // TODO(jelbourn): Demo that uses moment.js\n  // TODO(jelbourn): make sure this plays well with validation and ngMessages.\n  // TODO(jelbourn): calendar pane doesn't open up outside of visible viewport.\n  // TODO(jelbourn): forward more attributes to the internal input (required, autofocus, etc.)\n  // TODO(jelbourn): something better for mobile (calendar panel takes up entire screen?)\n  // TODO(jelbourn): input behavior (masking? auto-complete?)\n\n\n  DatePickerCtrl.$inject = [\"$scope\", \"$element\", \"$attrs\", \"$window\", \"$mdConstant\", \"$mdTheming\", \"$mdUtil\", \"$mdDateLocale\", \"$$mdDateUtil\", \"$$rAF\", \"$filter\"];\n  datePickerDirective.$inject = [\"$$mdSvgRegistry\", \"$mdUtil\", \"$mdAria\", \"inputDirective\"];\n  angular.module('material.components.datepicker')\n      .directive('mdDatepicker', datePickerDirective);\n\n  /**\n   * @ngdoc directive\n   * @name mdDatepicker\n   * @module material.components.datepicker\n   *\n   * @param {Date} ng-model The component's model. Expects either a JavaScript Date object or a value that can be parsed into one (e.g. a ISO 8601 string).\n   * @param {Object=} ng-model-options Allows tuning of the way in which `ng-model` is being updated. Also allows\n   * for a timezone to be specified. <a href=\"https://docs.angularjs.org/api/ng/directive/ngModelOptions#usage\">Read more at the ngModelOptions docs.</a>\n   * @param {expression=} ng-change Expression evaluated when the model value changes.\n   * @param {expression=} ng-focus Expression evaluated when the input is focused or the calendar is opened.\n   * @param {expression=} ng-blur Expression evaluated when focus is removed from the input or the calendar is closed.\n   * @param {boolean=} ng-disabled Whether the datepicker is disabled.\n   * @param {boolean=} ng-required Whether a value is required for the datepicker.\n   * @param {Date=} md-min-date Expression representing a min date (inclusive).\n   * @param {Date=} md-max-date Expression representing a max date (inclusive).\n   * @param {(function(Date): boolean)=} md-date-filter Function expecting a date and returning a boolean whether it can be selected or not.\n   * @param {String=} md-placeholder The date input placeholder value.\n   * @param {String=} md-open-on-focus When present, the calendar will be opened when the input is focused.\n   * @param {Boolean=} md-is-open Expression that can be used to open the datepicker's calendar on-demand.\n   * @param {String=} md-current-view Default open view of the calendar pane. Can be either \"month\" or \"year\".\n   * @param {String=} md-hide-icons Determines which datepicker icons should be hidden. Note that this may cause the\n   * datepicker to not align properly with other components. **Use at your own risk.** Possible values are:\n   * * `\"all\"` - Hides all icons.\n   * * `\"calendar\"` - Only hides the calendar icon.\n   * * `\"triangle\"` - Only hides the triangle icon.\n   * @param {Object=} md-date-locale Allows for the values from the `$mdDateLocaleProvider` to be\n   * ovewritten on a per-element basis (e.g. `msgOpenCalendar` can be overwritten with\n   * `md-date-locale=\"{ msgOpenCalendar: 'Open a special calendar' }\"`).\n   *\n   * @description\n   * `<md-datepicker>` is a component used to select a single date.\n   * For information on how to configure internationalization for the date picker,\n   * see `$mdDateLocaleProvider`.\n   *\n   * This component supports [ngMessages](https://docs.angularjs.org/api/ngMessages/directive/ngMessages).\n   * Supported attributes are:\n   * * `required`: whether a required date is not set.\n   * * `mindate`: whether the selected date is before the minimum allowed date.\n   * * `maxdate`: whether the selected date is after the maximum allowed date.\n   * * `debounceInterval`: ms to delay input processing (since last debounce reset); default value 500ms\n   *\n   * @usage\n   * <hljs lang=\"html\">\n   *   <md-datepicker ng-model=\"birthday\"></md-datepicker>\n   * </hljs>\n   *\n   */\n\n  function datePickerDirective($$mdSvgRegistry, $mdUtil, $mdAria, inputDirective) {\n    return {\n      template: function(tElement, tAttrs) {\n        // Buttons are not in the tab order because users can open the calendar via keyboard\n        // interaction on the text input, and multiple tab stops for one component (picker)\n        // may be confusing.\n        var hiddenIcons = tAttrs.mdHideIcons;\n        var ariaLabelValue = tAttrs.ariaLabel || tAttrs.mdPlaceholder;\n\n        var calendarButton = (hiddenIcons === 'all' || hiddenIcons === 'calendar') ? '' :\n          '<md-button class=\"md-datepicker-button md-icon-button\" type=\"button\" ' +\n              'tabindex=\"-1\" aria-hidden=\"true\" ' +\n              'ng-click=\"ctrl.openCalendarPane($event)\">' +\n            '<md-icon class=\"md-datepicker-calendar-icon\" aria-label=\"md-calendar\" ' +\n                     'md-svg-src=\"' + $$mdSvgRegistry.mdCalendar + '\"></md-icon>' +\n          '</md-button>';\n\n        var triangleButton = '';\n\n        if (hiddenIcons !== 'all' && hiddenIcons !== 'triangle') {\n          triangleButton = '' +\n            '<md-button type=\"button\" md-no-ink ' +\n              'class=\"md-datepicker-triangle-button md-icon-button\" ' +\n              'ng-click=\"ctrl.openCalendarPane($event)\" ' +\n              'aria-label=\"{{::ctrl.locale.msgOpenCalendar}}\">' +\n            '<div class=\"md-datepicker-expand-triangle\"></div>' +\n          '</md-button>';\n\n          tElement.addClass(HAS_TRIANGLE_ICON_CLASS);\n        }\n\n        return calendarButton +\n        '<div class=\"md-datepicker-input-container\" ng-class=\"{\\'md-datepicker-focused\\': ctrl.isFocused}\">' +\n          '<input ' +\n            (ariaLabelValue ? 'aria-label=\"' + ariaLabelValue + '\" ' : '') +\n            'class=\"md-datepicker-input\" ' +\n            'aria-haspopup=\"true\" ' +\n            'aria-expanded=\"{{ctrl.isCalendarOpen}}\" ' +\n            'ng-focus=\"ctrl.setFocused(true)\" ' +\n            'ng-blur=\"ctrl.setFocused(false)\"> ' +\n            triangleButton +\n        '</div>' +\n\n        // This pane will be detached from here and re-attached to the document body.\n        '<div class=\"md-datepicker-calendar-pane md-whiteframe-z1\" id=\"{{::ctrl.calendarPaneId}}\">' +\n          '<div class=\"md-datepicker-input-mask\">' +\n            '<div class=\"md-datepicker-input-mask-opaque\"></div>' +\n          '</div>' +\n          '<div class=\"md-datepicker-calendar\">' +\n            '<md-calendar role=\"dialog\" aria-label=\"{{::ctrl.locale.msgCalendar}}\" ' +\n                'md-current-view=\"{{::ctrl.currentView}}\"' +\n                'md-min-date=\"ctrl.minDate\"' +\n                'md-max-date=\"ctrl.maxDate\"' +\n                'md-date-filter=\"ctrl.dateFilter\"' +\n                'ng-model=\"ctrl.date\" ng-if=\"ctrl.isCalendarOpen\">' +\n            '</md-calendar>' +\n          '</div>' +\n        '</div>';\n      },\n      require: ['ngModel', 'mdDatepicker', '?^mdInputContainer', '?^form'],\n      scope: {\n        minDate: '=mdMinDate',\n        maxDate: '=mdMaxDate',\n        placeholder: '@mdPlaceholder',\n        currentView: '@mdCurrentView',\n        dateFilter: '=mdDateFilter',\n        isOpen: '=?mdIsOpen',\n        debounceInterval: '=mdDebounceInterval',\n        dateLocale: '=mdDateLocale'\n      },\n      controller: DatePickerCtrl,\n      controllerAs: 'ctrl',\n      bindToController: true,\n      link: function(scope, element, attr, controllers) {\n        var ngModelCtrl = controllers[0];\n        var mdDatePickerCtrl = controllers[1];\n        var mdInputContainer = controllers[2];\n        var parentForm = controllers[3];\n        var mdNoAsterisk = $mdUtil.parseAttributeBoolean(attr.mdNoAsterisk);\n\n        mdDatePickerCtrl.configureNgModel(ngModelCtrl, mdInputContainer, inputDirective);\n\n        if (mdInputContainer) {\n          // We need to move the spacer after the datepicker itself,\n          // because md-input-container adds it after the\n          // md-datepicker-input by default. The spacer gets wrapped in a\n          // div, because it floats and gets aligned next to the datepicker.\n          // There are easier ways of working around this with CSS (making the\n          // datepicker 100% wide, change the `display` etc.), however they\n          // break the alignment with any other form controls.\n          var spacer = element[0].querySelector('.md-errors-spacer');\n\n          if (spacer) {\n            element.after(angular.element('<div>').append(spacer));\n          }\n\n          mdInputContainer.setHasPlaceholder(attr.mdPlaceholder);\n          mdInputContainer.input = element;\n          mdInputContainer.element\n            .addClass(INPUT_CONTAINER_CLASS)\n            .toggleClass(HAS_CALENDAR_ICON_CLASS, attr.mdHideIcons !== 'calendar' && attr.mdHideIcons !== 'all');\n\n          if (!mdInputContainer.label) {\n            $mdAria.expect(element, 'aria-label', attr.mdPlaceholder);\n          } else if(!mdNoAsterisk) {\n            attr.$observe('required', function(value) {\n              mdInputContainer.label.toggleClass('md-required', !!value);\n            });\n          }\n\n          scope.$watch(mdInputContainer.isErrorGetter || function() {\n            return ngModelCtrl.$invalid && (ngModelCtrl.$touched || (parentForm && parentForm.$submitted));\n          }, mdInputContainer.setInvalid);\n        } else if (parentForm) {\n          // If invalid, highlights the input when the parent form is submitted.\n          var parentSubmittedWatcher = scope.$watch(function() {\n            return parentForm.$submitted;\n          }, function(isSubmitted) {\n            if (isSubmitted) {\n              mdDatePickerCtrl.updateErrorState();\n              parentSubmittedWatcher();\n            }\n          });\n        }\n      }\n    };\n  }\n\n  /** Additional offset for the input's `size` attribute, which is updated based on its content. */\n  var EXTRA_INPUT_SIZE = 3;\n\n  /** Class applied to the container if the date is invalid. */\n  var INVALID_CLASS = 'md-datepicker-invalid';\n\n  /** Class applied to the datepicker when it's open. */\n  var OPEN_CLASS = 'md-datepicker-open';\n\n  /** Class applied to the md-input-container, if a datepicker is placed inside it */\n  var INPUT_CONTAINER_CLASS = '_md-datepicker-floating-label';\n\n  /** Class to be applied when the calendar icon is enabled. */\n  var HAS_CALENDAR_ICON_CLASS = '_md-datepicker-has-calendar-icon';\n\n  /** Class to be applied when the triangle icon is enabled. */\n  var HAS_TRIANGLE_ICON_CLASS = '_md-datepicker-has-triangle-icon';\n\n  /** Default time in ms to debounce input event by. */\n  var DEFAULT_DEBOUNCE_INTERVAL = 500;\n\n  /**\n   * Height of the calendar pane used to check if the pane is going outside the boundary of\n   * the viewport. See calendar.scss for how $md-calendar-height is computed; an extra 20px is\n   * also added to space the pane away from the exact edge of the screen.\n   *\n   *  This is computed statically now, but can be changed to be measured if the circumstances\n   *  of calendar sizing are changed.\n   */\n  var CALENDAR_PANE_HEIGHT = 368;\n\n  /**\n   * Width of the calendar pane used to check if the pane is going outside the boundary of\n   * the viewport. See calendar.scss for how $md-calendar-width is computed; an extra 20px is\n   * also added to space the pane away from the exact edge of the screen.\n   *\n   *  This is computed statically now, but can be changed to be measured if the circumstances\n   *  of calendar sizing are changed.\n   */\n  var CALENDAR_PANE_WIDTH = 360;\n\n  /** Used for checking whether the current user agent is on iOS or Android. */\n  var IS_MOBILE_REGEX = /ipad|iphone|ipod|android/i;\n\n  /**\n   * Controller for md-datepicker.\n   *\n   * @ngInject @constructor\n   */\n  function DatePickerCtrl($scope, $element, $attrs, $window, $mdConstant,\n    $mdTheming, $mdUtil, $mdDateLocale, $$mdDateUtil, $$rAF, $filter) {\n\n    /** @final */\n    this.$window = $window;\n\n    /** @final */\n    this.dateUtil = $$mdDateUtil;\n\n    /** @final */\n    this.$mdConstant = $mdConstant;\n\n    /* @final */\n    this.$mdUtil = $mdUtil;\n\n    /** @final */\n    this.$$rAF = $$rAF;\n\n    /** @final */\n    this.$mdDateLocale = $mdDateLocale;\n\n    /**\n     * The root document element. This is used for attaching a top-level click handler to\n     * close the calendar panel when a click outside said panel occurs. We use `documentElement`\n     * instead of body because, when scrolling is disabled, some browsers consider the body element\n     * to be completely off the screen and propagate events directly to the html element.\n     * @type {!angular.JQLite}\n     */\n    this.documentElement = angular.element(document.documentElement);\n\n    /** @type {!angular.NgModelController} */\n    this.ngModelCtrl = null;\n\n    /** @type {HTMLInputElement} */\n    this.inputElement = $element[0].querySelector('input');\n\n    /** @final {!angular.JQLite} */\n    this.ngInputElement = angular.element(this.inputElement);\n\n    /** @type {HTMLElement} */\n    this.inputContainer = $element[0].querySelector('.md-datepicker-input-container');\n\n    /** @type {HTMLElement} Floating calendar pane. */\n    this.calendarPane = $element[0].querySelector('.md-datepicker-calendar-pane');\n\n    /** @type {HTMLElement} Calendar icon button. */\n    this.calendarButton = $element[0].querySelector('.md-datepicker-button');\n\n    /**\n     * Element covering everything but the input in the top of the floating calendar pane.\n     * @type {!angular.JQLite}\n     */\n    this.inputMask = angular.element($element[0].querySelector('.md-datepicker-input-mask-opaque'));\n\n    /** @final {!angular.JQLite} */\n    this.$element = $element;\n\n    /** @final {!angular.Attributes} */\n    this.$attrs = $attrs;\n\n    /** @final {!angular.Scope} */\n    this.$scope = $scope;\n\n    /** @type {Date} */\n    this.date = null;\n\n    /** @type {boolean} */\n    this.isFocused = false;\n\n    /** @type {boolean} */\n    this.isDisabled;\n    this.setDisabled($element[0].disabled || angular.isString($attrs.disabled));\n\n    /** @type {boolean} Whether the date-picker's calendar pane is open. */\n    this.isCalendarOpen = false;\n\n    /** @type {boolean} Whether the calendar should open when the input is focused. */\n    this.openOnFocus = $attrs.hasOwnProperty('mdOpenOnFocus');\n\n    /** @final */\n    this.mdInputContainer = null;\n\n    /**\n     * Element from which the calendar pane was opened. Keep track of this so that we can return\n     * focus to it when the pane is closed.\n     * @type {HTMLElement}\n     */\n    this.calendarPaneOpenedFrom = null;\n\n    /** @type {String} Unique id for the calendar pane. */\n    this.calendarPaneId = 'md-date-pane-' + $mdUtil.nextUid();\n\n    /** Pre-bound click handler is saved so that the event listener can be removed. */\n    this.bodyClickHandler = angular.bind(this, this.handleBodyClick);\n\n    /**\n     * Name of the event that will trigger a close. Necessary to sniff the browser, because\n     * the resize event doesn't make sense on mobile and can have a negative impact since it\n     * triggers whenever the browser zooms in on a focused input.\n     */\n    this.windowEventName = IS_MOBILE_REGEX.test(\n      navigator.userAgent || navigator.vendor || window.opera\n    ) ? 'orientationchange' : 'resize';\n\n    /** Pre-bound close handler so that the event listener can be removed. */\n    this.windowEventHandler = $mdUtil.debounce(angular.bind(this, this.closeCalendarPane), 100);\n\n    /** Pre-bound handler for the window blur event. Allows for it to be removed later. */\n    this.windowBlurHandler = angular.bind(this, this.handleWindowBlur);\n\n    /** The built-in AngularJS date filter. */\n    this.ngDateFilter = $filter('date');\n\n    /** @type {Number} Extra margin for the left side of the floating calendar pane. */\n    this.leftMargin = 20;\n\n    /** @type {Number} Extra margin for the top of the floating calendar. Gets determined on the first open. */\n    this.topMargin = null;\n\n    // Unless the user specifies so, the datepicker should not be a tab stop.\n    // This is necessary because ngAria might add a tabindex to anything with an ng-model\n    // (based on whether or not the user has turned that particular feature on/off).\n    if ($attrs.tabindex) {\n      this.ngInputElement.attr('tabindex', $attrs.tabindex);\n      $attrs.$set('tabindex', null);\n    } else {\n      $attrs.$set('tabindex', '-1');\n    }\n\n    $attrs.$set('aria-owns', this.calendarPaneId);\n\n    $mdTheming($element);\n    $mdTheming(angular.element(this.calendarPane));\n\n    var self = this;\n\n    $scope.$on('$destroy', function() {\n      self.detachCalendarPane();\n    });\n\n    if ($attrs.mdIsOpen) {\n      $scope.$watch('ctrl.isOpen', function(shouldBeOpen) {\n        if (shouldBeOpen) {\n          self.openCalendarPane({\n            target: self.inputElement\n          });\n        } else {\n          self.closeCalendarPane();\n        }\n      });\n    }\n\n    // For AngularJS 1.4 and older, where there are no lifecycle hooks but bindings are pre-assigned,\n    // manually call the $onInit hook.\n    if (angular.version.major === 1 && angular.version.minor <= 4) {\n      this.$onInit();\n    }\n\n  }\n\n  /**\n   * AngularJS Lifecycle hook for newer AngularJS versions.\n   * Bindings are not guaranteed to have been assigned in the controller, but they are in the $onInit hook.\n   */\n  DatePickerCtrl.prototype.$onInit = function() {\n\n    /**\n     * Holds locale-specific formatters, parsers, labels etc. Allows\n     * the user to override specific ones from the $mdDateLocale provider.\n     * @type {!Object}\n     */\n    this.locale = this.dateLocale ? angular.extend({}, this.$mdDateLocale, this.dateLocale) : this.$mdDateLocale;\n\n    this.installPropertyInterceptors();\n    this.attachChangeListeners();\n    this.attachInteractionListeners();\n  };\n\n  /**\n   * Sets up the controller's reference to ngModelController and\n   * applies AngularJS's `input[type=\"date\"]` directive.\n   * @param {!angular.NgModelController} ngModelCtrl Instance of the ngModel controller.\n   * @param {Object} mdInputContainer Instance of the mdInputContainer controller.\n   * @param {Object} inputDirective Config for AngularJS's `input` directive.\n   */\n  DatePickerCtrl.prototype.configureNgModel = function(ngModelCtrl, mdInputContainer, inputDirective) {\n    this.ngModelCtrl = ngModelCtrl;\n    this.mdInputContainer = mdInputContainer;\n\n    // The input needs to be [type=\"date\"] in order to be picked up by AngularJS.\n    this.$attrs.$set('type', 'date');\n\n    // Invoke the `input` directive link function, adding a stub for the element.\n    // This allows us to re-use AngularJS's logic for setting the timezone via ng-model-options.\n    // It works by calling the link function directly which then adds the proper `$parsers` and\n    // `$formatters` to the ngModel controller.\n    inputDirective[0].link.pre(this.$scope, {\n      on: angular.noop,\n      val: angular.noop,\n      0: {}\n    }, this.$attrs, [ngModelCtrl]);\n\n    var self = this;\n\n    // Responds to external changes to the model value.\n    self.ngModelCtrl.$formatters.push(function(value) {\n      var parsedValue = angular.isDefined(value) ? Date.parse(value) : null;\n\n      // `parsedValue` is the time since epoch if valid or `NaN` if invalid.\n      if (!isNaN(parsedValue) && angular.isNumber(parsedValue)) {\n        value = new Date(parsedValue);\n      }\n\n      if (value && !(value instanceof Date)) {\n        throw Error(\n          'The ng-model for md-datepicker must be a Date instance or a value ' +\n          'that can be parsed into a date. Currently the model is of type: ' + typeof value\n        );\n      }\n\n      self.onExternalChange(value);\n\n      return value;\n    });\n\n    // Responds to external error state changes (e.g. ng-required based on another input).\n    ngModelCtrl.$viewChangeListeners.unshift(angular.bind(this, this.updateErrorState));\n\n    // Forwards any events from the input to the root element. This is necessary to get `updateOn`\n    // working for events that don't bubble (e.g. 'blur') since AngularJS binds the handlers to\n    // the `<md-datepicker>`.\n    var updateOn = self.$mdUtil.getModelOption(ngModelCtrl, 'updateOn');\n\n    if (updateOn) {\n      this.ngInputElement.on(\n        updateOn,\n        angular.bind(this.$element, this.$element.triggerHandler, updateOn)\n      );\n    }\n  };\n\n  /**\n   * Attach event listeners for both the text input and the md-calendar.\n   * Events are used instead of ng-model so that updates don't infinitely update the other\n   * on a change. This should also be more performant than using a $watch.\n   */\n  DatePickerCtrl.prototype.attachChangeListeners = function() {\n    var self = this;\n\n    self.$scope.$on('md-calendar-change', function(event, date) {\n      self.setModelValue(date);\n      self.onExternalChange(date);\n      self.closeCalendarPane();\n    });\n\n    self.ngInputElement.on('input', angular.bind(self, self.resizeInputElement));\n\n    var debounceInterval = angular.isDefined(this.debounceInterval) ?\n        this.debounceInterval : DEFAULT_DEBOUNCE_INTERVAL;\n    self.ngInputElement.on('input', self.$mdUtil.debounce(self.handleInputEvent,\n        debounceInterval, self));\n  };\n\n  /** Attach event listeners for user interaction. */\n  DatePickerCtrl.prototype.attachInteractionListeners = function() {\n    var self = this;\n    var $scope = this.$scope;\n    var keyCodes = this.$mdConstant.KEY_CODE;\n\n    // Add event listener through angular so that we can triggerHandler in unit tests.\n    self.ngInputElement.on('keydown', function(event) {\n      if (event.altKey && event.keyCode == keyCodes.DOWN_ARROW) {\n        self.openCalendarPane(event);\n        $scope.$digest();\n      }\n    });\n\n    if (self.openOnFocus) {\n      self.ngInputElement.on('focus', angular.bind(self, self.openCalendarPane));\n      angular.element(self.$window).on('blur', self.windowBlurHandler);\n\n      $scope.$on('$destroy', function() {\n        angular.element(self.$window).off('blur', self.windowBlurHandler);\n      });\n    }\n\n    $scope.$on('md-calendar-close', function() {\n      self.closeCalendarPane();\n    });\n  };\n\n  /**\n   * Capture properties set to the date-picker and imperitively handle internal changes.\n   * This is done to avoid setting up additional $watches.\n   */\n  DatePickerCtrl.prototype.installPropertyInterceptors = function() {\n    var self = this;\n\n    if (this.$attrs.ngDisabled) {\n      // The expression is to be evaluated against the directive element's scope and not\n      // the directive's isolate scope.\n      var scope = this.$scope.$parent;\n\n      if (scope) {\n        scope.$watch(this.$attrs.ngDisabled, function(isDisabled) {\n          self.setDisabled(isDisabled);\n        });\n      }\n    }\n\n    Object.defineProperty(this, 'placeholder', {\n      get: function() { return self.inputElement.placeholder; },\n      set: function(value) { self.inputElement.placeholder = value || ''; }\n    });\n  };\n\n  /**\n   * Sets whether the date-picker is disabled.\n   * @param {boolean} isDisabled\n   */\n  DatePickerCtrl.prototype.setDisabled = function(isDisabled) {\n    this.isDisabled = isDisabled;\n    this.inputElement.disabled = isDisabled;\n\n    if (this.calendarButton) {\n      this.calendarButton.disabled = isDisabled;\n    }\n  };\n\n  /**\n   * Sets the custom ngModel.$error flags to be consumed by ngMessages. Flags are:\n   *   - mindate: whether the selected date is before the minimum date.\n   *   - maxdate: whether the selected flag is after the maximum date.\n   *   - filtered: whether the selected date is allowed by the custom filtering function.\n   *   - valid: whether the entered text input is a valid date\n   *\n   * The 'required' flag is handled automatically by ngModel.\n   *\n   * @param {Date=} opt_date Date to check. If not given, defaults to the datepicker's model value.\n   */\n  DatePickerCtrl.prototype.updateErrorState = function(opt_date) {\n    var date = opt_date || this.date;\n\n    // Clear any existing errors to get rid of anything that's no longer relevant.\n    this.clearErrorState();\n\n    if (this.dateUtil.isValidDate(date)) {\n      // Force all dates to midnight in order to ignore the time portion.\n      date = this.dateUtil.createDateAtMidnight(date);\n\n      if (this.dateUtil.isValidDate(this.minDate)) {\n        var minDate = this.dateUtil.createDateAtMidnight(this.minDate);\n        this.ngModelCtrl.$setValidity('mindate', date >= minDate);\n      }\n\n      if (this.dateUtil.isValidDate(this.maxDate)) {\n        var maxDate = this.dateUtil.createDateAtMidnight(this.maxDate);\n        this.ngModelCtrl.$setValidity('maxdate', date <= maxDate);\n      }\n\n      if (angular.isFunction(this.dateFilter)) {\n        this.ngModelCtrl.$setValidity('filtered', this.dateFilter(date));\n      }\n    } else {\n      // The date is seen as \"not a valid date\" if there is *something* set\n      // (i.e.., not null or undefined), but that something isn't a valid date.\n      this.ngModelCtrl.$setValidity('valid', date == null);\n    }\n\n    angular.element(this.inputContainer).toggleClass(INVALID_CLASS, !this.ngModelCtrl.$valid);\n  };\n\n  /** Clears any error flags set by `updateErrorState`. */\n  DatePickerCtrl.prototype.clearErrorState = function() {\n    this.inputContainer.classList.remove(INVALID_CLASS);\n    ['mindate', 'maxdate', 'filtered', 'valid'].forEach(function(field) {\n      this.ngModelCtrl.$setValidity(field, true);\n    }, this);\n  };\n\n  /** Resizes the input element based on the size of its content. */\n  DatePickerCtrl.prototype.resizeInputElement = function() {\n    this.inputElement.size = this.inputElement.value.length + EXTRA_INPUT_SIZE;\n  };\n\n  /**\n   * Sets the model value if the user input is a valid date.\n   * Adds an invalid class to the input element if not.\n   */\n  DatePickerCtrl.prototype.handleInputEvent = function() {\n    var inputString = this.inputElement.value;\n    var parsedDate = inputString ? this.locale.parseDate(inputString) : null;\n    this.dateUtil.setDateTimeToMidnight(parsedDate);\n\n    // An input string is valid if it is either empty (representing no date)\n    // or if it parses to a valid date that the user is allowed to select.\n    var isValidInput = inputString == '' || (\n      this.dateUtil.isValidDate(parsedDate) &&\n      this.locale.isDateComplete(inputString) &&\n      this.isDateEnabled(parsedDate)\n    );\n\n    // The datepicker's model is only updated when there is a valid input.\n    if (isValidInput) {\n      this.setModelValue(parsedDate);\n      this.date = parsedDate;\n    }\n\n    this.updateErrorState(parsedDate);\n  };\n\n  /**\n   * Check whether date is in range and enabled\n   * @param {Date=} opt_date\n   * @return {boolean} Whether the date is enabled.\n   */\n  DatePickerCtrl.prototype.isDateEnabled = function(opt_date) {\n    return this.dateUtil.isDateWithinRange(opt_date, this.minDate, this.maxDate) &&\n          (!angular.isFunction(this.dateFilter) || this.dateFilter(opt_date));\n  };\n\n  /** Position and attach the floating calendar to the document. */\n  DatePickerCtrl.prototype.attachCalendarPane = function() {\n    var calendarPane = this.calendarPane;\n    var body = document.body;\n\n    calendarPane.style.transform = '';\n    this.$element.addClass(OPEN_CLASS);\n    this.mdInputContainer && this.mdInputContainer.element.addClass(OPEN_CLASS);\n    angular.element(body).addClass('md-datepicker-is-showing');\n\n    var elementRect = this.inputContainer.getBoundingClientRect();\n    var bodyRect = body.getBoundingClientRect();\n\n    if (!this.topMargin || this.topMargin < 0) {\n      this.topMargin = (this.inputMask.parent().prop('clientHeight') - this.ngInputElement.prop('clientHeight')) / 2;\n    }\n\n    // Check to see if the calendar pane would go off the screen. If so, adjust position\n    // accordingly to keep it within the viewport.\n    var paneTop = elementRect.top - bodyRect.top - this.topMargin;\n    var paneLeft = elementRect.left - bodyRect.left - this.leftMargin;\n\n    // If ng-material has disabled body scrolling (for example, if a dialog is open),\n    // then it's possible that the already-scrolled body has a negative top/left. In this case,\n    // we want to treat the \"real\" top as (0 - bodyRect.top). In a normal scrolling situation,\n    // though, the top of the viewport should just be the body's scroll position.\n    var viewportTop = (bodyRect.top < 0 && document.body.scrollTop == 0) ?\n        -bodyRect.top :\n        document.body.scrollTop;\n\n    var viewportLeft = (bodyRect.left < 0 && document.body.scrollLeft == 0) ?\n        -bodyRect.left :\n        document.body.scrollLeft;\n\n    var viewportBottom = viewportTop + this.$window.innerHeight;\n    var viewportRight = viewportLeft + this.$window.innerWidth;\n\n    // Creates an overlay with a hole the same size as element. We remove a pixel or two\n    // on each end to make it overlap slightly. The overlay's background is added in\n    // the theme in the form of a box-shadow with a huge spread.\n    this.inputMask.css({\n      position: 'absolute',\n      left: this.leftMargin + 'px',\n      top: this.topMargin + 'px',\n      width: (elementRect.width - 1) + 'px',\n      height: (elementRect.height - 2) + 'px'\n    });\n\n    // If the right edge of the pane would be off the screen and shifting it left by the\n    // difference would not go past the left edge of the screen. If the calendar pane is too\n    // big to fit on the screen at all, move it to the left of the screen and scale the entire\n    // element down to fit.\n    if (paneLeft + CALENDAR_PANE_WIDTH > viewportRight) {\n      if (viewportRight - CALENDAR_PANE_WIDTH > 0) {\n        paneLeft = viewportRight - CALENDAR_PANE_WIDTH;\n      } else {\n        paneLeft = viewportLeft;\n        var scale = this.$window.innerWidth / CALENDAR_PANE_WIDTH;\n        calendarPane.style.transform = 'scale(' + scale + ')';\n      }\n\n      calendarPane.classList.add('md-datepicker-pos-adjusted');\n    }\n\n    // If the bottom edge of the pane would be off the screen and shifting it up by the\n    // difference would not go past the top edge of the screen.\n    if (paneTop + CALENDAR_PANE_HEIGHT > viewportBottom &&\n        viewportBottom - CALENDAR_PANE_HEIGHT > viewportTop) {\n      paneTop = viewportBottom - CALENDAR_PANE_HEIGHT;\n      calendarPane.classList.add('md-datepicker-pos-adjusted');\n    }\n\n    calendarPane.style.left = paneLeft + 'px';\n    calendarPane.style.top = paneTop + 'px';\n    document.body.appendChild(calendarPane);\n\n    // Add CSS class after one frame to trigger open animation.\n    this.$$rAF(function() {\n      calendarPane.classList.add('md-pane-open');\n    });\n  };\n\n  /** Detach the floating calendar pane from the document. */\n  DatePickerCtrl.prototype.detachCalendarPane = function() {\n    this.$element.removeClass(OPEN_CLASS);\n    this.mdInputContainer && this.mdInputContainer.element.removeClass(OPEN_CLASS);\n    angular.element(document.body).removeClass('md-datepicker-is-showing');\n    this.calendarPane.classList.remove('md-pane-open');\n    this.calendarPane.classList.remove('md-datepicker-pos-adjusted');\n\n    if (this.isCalendarOpen) {\n      this.$mdUtil.enableScrolling();\n    }\n\n    if (this.calendarPane.parentNode) {\n      // Use native DOM removal because we do not want any of the\n      // angular state of this element to be disposed.\n      this.calendarPane.parentNode.removeChild(this.calendarPane);\n    }\n  };\n\n  /**\n   * Open the floating calendar pane.\n   * @param {Event} event\n   */\n  DatePickerCtrl.prototype.openCalendarPane = function(event) {\n    if (!this.isCalendarOpen && !this.isDisabled && !this.inputFocusedOnWindowBlur) {\n      this.isCalendarOpen = this.isOpen = true;\n      this.calendarPaneOpenedFrom = event.target;\n\n      // Because the calendar pane is attached directly to the body, it is possible that the\n      // rest of the component (input, etc) is in a different scrolling container, such as\n      // an md-content. This means that, if the container is scrolled, the pane would remain\n      // stationary. To remedy this, we disable scrolling while the calendar pane is open, which\n      // also matches the native behavior for things like `<select>` on Mac and Windows.\n      this.$mdUtil.disableScrollAround(this.calendarPane);\n\n      this.attachCalendarPane();\n      this.focusCalendar();\n      this.evalAttr('ngFocus');\n\n      // Attach click listener inside of a timeout because, if this open call was triggered by a\n      // click, we don't want it to be immediately propogated up to the body and handled.\n      var self = this;\n      this.$mdUtil.nextTick(function() {\n        // Use 'touchstart` in addition to click in order to work on iOS Safari, where click\n        // events aren't propogated under most circumstances.\n        // See http://www.quirksmode.org/blog/archives/2014/02/mouse_event_bub.html\n        self.documentElement.on('click touchstart', self.bodyClickHandler);\n      }, false);\n\n      window.addEventListener(this.windowEventName, this.windowEventHandler);\n    }\n  };\n\n  /** Close the floating calendar pane. */\n  DatePickerCtrl.prototype.closeCalendarPane = function() {\n    if (this.isCalendarOpen) {\n      var self = this;\n\n      self.detachCalendarPane();\n      self.ngModelCtrl.$setTouched();\n      self.evalAttr('ngBlur');\n\n      self.documentElement.off('click touchstart', self.bodyClickHandler);\n      window.removeEventListener(self.windowEventName, self.windowEventHandler);\n\n      self.calendarPaneOpenedFrom.focus();\n      self.calendarPaneOpenedFrom = null;\n\n      if (self.openOnFocus) {\n        // Ensures that all focus events have fired before resetting\n        // the calendar. Prevents the calendar from reopening immediately\n        // in IE when md-open-on-focus is set. Also it needs to trigger\n        // a digest, in order to prevent issues where the calendar wasn't\n        // showing up on the next open.\n        self.$mdUtil.nextTick(reset);\n      } else {\n        reset();\n      }\n    }\n\n    function reset(){\n      self.isCalendarOpen = self.isOpen = false;\n    }\n  };\n\n  /** Gets the controller instance for the calendar in the floating pane. */\n  DatePickerCtrl.prototype.getCalendarCtrl = function() {\n    return angular.element(this.calendarPane.querySelector('md-calendar')).controller('mdCalendar');\n  };\n\n  /** Focus the calendar in the floating pane. */\n  DatePickerCtrl.prototype.focusCalendar = function() {\n    // Use a timeout in order to allow the calendar to be rendered, as it is gated behind an ng-if.\n    var self = this;\n    this.$mdUtil.nextTick(function() {\n      self.getCalendarCtrl().focus();\n    }, false);\n  };\n\n  /**\n   * Sets whether the input is currently focused.\n   * @param {boolean} isFocused\n   */\n  DatePickerCtrl.prototype.setFocused = function(isFocused) {\n    if (!isFocused) {\n      this.ngModelCtrl.$setTouched();\n    }\n\n    // The ng* expressions shouldn't be evaluated when mdOpenOnFocus is on,\n    // because they also get called when the calendar is opened/closed.\n    if (!this.openOnFocus) {\n      this.evalAttr(isFocused ? 'ngFocus' : 'ngBlur');\n    }\n\n    this.isFocused = isFocused;\n  };\n\n  /**\n   * Handles a click on the document body when the floating calendar pane is open.\n   * Closes the floating calendar pane if the click is not inside of it.\n   * @param {MouseEvent} event\n   */\n  DatePickerCtrl.prototype.handleBodyClick = function(event) {\n    if (this.isCalendarOpen) {\n      var isInCalendar = this.$mdUtil.getClosest(event.target, 'md-calendar');\n\n      if (!isInCalendar) {\n        this.closeCalendarPane();\n      }\n\n      this.$scope.$digest();\n    }\n  };\n\n  /**\n   * Handles the event when the user navigates away from the current tab. Keeps track of\n   * whether the input was focused when the event happened, in order to prevent the calendar\n   * from re-opening.\n   */\n  DatePickerCtrl.prototype.handleWindowBlur = function() {\n    this.inputFocusedOnWindowBlur = document.activeElement === this.inputElement;\n  };\n\n  /**\n   * Evaluates an attribute expression against the parent scope.\n   * @param {String} attr Name of the attribute to be evaluated.\n   */\n  DatePickerCtrl.prototype.evalAttr = function(attr) {\n    if (this.$attrs[attr]) {\n      this.$scope.$parent.$eval(this.$attrs[attr]);\n    }\n  };\n\n  /**\n   * Sets the ng-model value by first converting the date object into a strng. Converting it\n   * is necessary, in order to pass AngularJS's `input[type=\"date\"]` validations. AngularJS turns\n   * the value into a Date object afterwards, before setting it on the model.\n   * @param {Date=} value Date to be set as the model value.\n   */\n  DatePickerCtrl.prototype.setModelValue = function(value) {\n    var timezone = this.$mdUtil.getModelOption(this.ngModelCtrl, 'timezone');\n    this.ngModelCtrl.$setViewValue(this.ngDateFilter(value, 'yyyy-MM-dd', timezone));\n  };\n\n  /**\n   * Updates the datepicker when a model change occurred externally.\n   * @param {Date=} value Value that was set to the model.\n   */\n  DatePickerCtrl.prototype.onExternalChange = function(value) {\n    var timezone = this.$mdUtil.getModelOption(this.ngModelCtrl, 'timezone');\n\n    this.date = value;\n    this.inputElement.value = this.locale.formatDate(value, timezone);\n    this.mdInputContainer && this.mdInputContainer.setHasValue(!!value);\n    this.resizeInputElement();\n    this.updateErrorState();\n  };\n})();\n\n})();\n(function(){\n\"use strict\";\n\nangular\n  .module('material.components.icon')\n  .directive('mdIcon', ['$mdIcon', '$mdTheming', '$mdAria', '$sce', mdIconDirective]);\n\n/**\n * @ngdoc directive\n * @name mdIcon\n * @module material.components.icon\n *\n * @restrict E\n *\n * @description\n * The `md-icon` directive makes it easier to use vector-based icons in your app (as opposed to\n * raster-based icons types like PNG). The directive supports both icon fonts and SVG icons.\n *\n * Icons should be considered view-only elements that should not be used directly as buttons; instead nest a `<md-icon>`\n * inside a `md-button` to add hover and click features.\n *\n * ### Icon fonts\n * Icon fonts are a technique in which you use a font where the glyphs in the font are\n * your icons instead of text. Benefits include a straightforward way to bundle everything into a\n * single HTTP request, simple scaling, easy color changing, and more.\n *\n * `md-icon` lets you consume an icon font by letting you reference specific icons in that font\n * by name rather than character code.\n *\n * ### SVG\n * For SVGs, the problem with using `<img>` or a CSS `background-image` is that you can't take\n * advantage of some SVG features, such as styling specific parts of the icon with CSS or SVG\n * animation.\n *\n * `md-icon` makes it easier to use SVG icons by *inlining* the SVG into an `<svg>` element in the\n * document. The most straightforward way of referencing an SVG icon is via URL, just like a\n * traditional `<img>`. `$mdIconProvider`, as a convenience, lets you _name_ an icon so you can\n * reference it by name instead of URL throughout your templates.\n *\n * Additionally, you may not want to make separate HTTP requests for every icon, so you can bundle\n * your SVG icons together and pre-load them with $mdIconProvider as an icon set. An icon set can\n * also be given a name, which acts as a namespace for individual icons, so you can reference them\n * like `\"social:cake\"`.\n *\n * When using SVGs, both external SVGs (via URLs) or sets of SVGs [from icon sets] can be\n * easily loaded and used. When using font-icons, developers must follow three (3) simple steps:\n *\n * <ol>\n * <li>Load the font library. e.g.<br/>\n *    `<link href=\"https://fonts.googleapis.com/icon?family=Material+Icons\"\n *    rel=\"stylesheet\">`\n * </li>\n * <li>\n *   Use either (a) font-icon class names or (b) a fontset and a font ligature to render the font glyph by\n *   using its textual name _or_ numerical character reference. Note that `material-icons` is the default fontset when\n *   none is specified.\n * </li>\n * <li> Use any of the following templates: <br/>\n *   <ul>\n *     <li>`<md-icon md-font-icon=\"classname\"></md-icon>`</li>\n *     <li>`<md-icon md-font-set=\"font library classname or alias\">textual_name</md-icon>`</li>\n *     <li>`<md-icon> numerical_character_reference </md-icon>`</li>\n *     <li>`<md-icon ng_bind=\"'textual_name'\"></md-icon>`</li>\n *     <li>`<md-icon ng-bind=\"scopeVariable\"></md-icon>`</li>\n *   </ul>\n * </li>\n * </ol>\n *\n * Full details for these steps can be found:\n *\n * <ul>\n * <li>http://google.github.io/material-design-icons/</li>\n * <li>http://google.github.io/material-design-icons/#icon-font-for-the-web</li>\n * </ul>\n *\n * The Material Design icon style <code>.material-icons</code> and the icon font references are published in\n * Material Design Icons:\n *\n * <ul>\n * <li>https://design.google.com/icons/</li>\n * <li>https://design.google.com/icons/#ic_accessibility</li>\n * </ul>\n *\n * ### Localization\n *\n * Because an `md-icon` element's text content is not intended to translated, it is recommended to declare the text\n * content for an `md-icon` element in its start tag. Instead of using the HTML text content, consider using `ng-bind`\n * with a scope variable or literal string.\n *\n * Examples:\n *\n * <ul>\n *   <li>`<md-icon ng-bind=\"myIconVariable\"></md-icon>`</li>\n *   <li>`<md-icon ng-bind=\"'menu'\"></md-icon>`\n * </ul>\n *\n * <h2 id=\"material_design_icons\">Material Design Icons</h2>\n * Using the Material Design Icon-Selector, developers can easily and quickly search for a Material Design font-icon and\n * determine its textual name and character reference code. Click on any icon to see the slide-up information\n * panel with details regarding a SVG download or information on the font-icon usage.\n *\n * <a href=\"https://www.google.com/design/icons/#ic_accessibility\" target=\"_blank\" style=\"border-bottom:none;\">\n * <img src=\"https://cloud.githubusercontent.com/assets/210413/7902490/fe8dd14c-0780-11e5-98fb-c821cc6475e6.png\"\n *      aria-label=\"Material Design Icon-Selector\" style=\"max-width:75%;padding-left:10%\">\n * </a>\n *\n * <span class=\"image_caption\">\n *  Click on the image above to link to the\n *  <a href=\"https://design.google.com/icons/#ic_accessibility\" target=\"_blank\">Material Design Icon-Selector</a>.\n * </span>\n *\n * @param {string} md-font-icon String name of CSS icon associated with the font-face will be used\n * to render the icon. Requires the fonts and the named CSS styles to be preloaded.\n * @param {string} md-font-set CSS style name associated with the font library; which will be assigned as\n * the class for the font-icon ligature. This value may also be an alias that is used to lookup the classname;\n * internally use `$mdIconProvider.fontSet(<alias>)` to determine the style name.\n * @param {string} md-svg-src String URL (or expression) used to load, cache, and display an\n *     external SVG.\n * @param {string} md-svg-icon md-svg-icon String name used for lookup of the icon from the internal cache;\n *     interpolated strings or expressions may also be used. Specific set names can be used with\n *     the syntax `<set name>:<icon name>`.<br/><br/>\n * To use icon sets, developers are required to pre-register the sets using the `$mdIconProvider` service.\n * @param {string=} aria-label Labels icon for accessibility. If an empty string is provided, icon\n * will be hidden from accessibility layer with `aria-hidden=\"true\"`. If there's no aria-label on the icon\n * nor a label on the parent element, a warning will be logged to the console.\n * @param {string=} alt Labels icon for accessibility. If an empty string is provided, icon\n * will be hidden from accessibility layer with `aria-hidden=\"true\"`. If there's no alt on the icon\n * nor a label on the parent element, a warning will be logged to the console.\n *\n * @usage\n * When using SVGs:\n * <hljs lang=\"html\">\n *\n *  <!-- Icon ID; may contain optional icon set prefix; icons must registered using $mdIconProvider -->\n *  <md-icon md-svg-icon=\"social:android\"    aria-label=\"android \" ></md-icon>\n *\n *  <!-- Icon urls; may be preloaded in templateCache -->\n *  <md-icon md-svg-src=\"/android.svg\"       aria-label=\"android \" ></md-icon>\n *  <md-icon md-svg-src=\"{{ getAndroid() }}\" aria-label=\"android \" ></md-icon>\n *\n * </hljs>\n *\n * Use the <code>$mdIconProvider</code> to configure your application with\n * svg iconsets.\n *\n * <hljs lang=\"js\">\n *  angular.module('appSvgIconSets', ['ngMaterial'])\n *    .controller('DemoCtrl', function($scope) {})\n *    .config(function($mdIconProvider) {\n *      $mdIconProvider\n *         .iconSet('social', 'img/icons/sets/social-icons.svg', 24)\n *         .defaultIconSet('img/icons/sets/core-icons.svg', 24);\n *     });\n * </hljs>\n *\n *\n * When using Font Icons with classnames:\n * <hljs lang=\"html\">\n *\n *  <md-icon md-font-icon=\"android\" aria-label=\"android\" ></md-icon>\n *  <md-icon class=\"icon_home\"      aria-label=\"Home\"    ></md-icon>\n *\n * </hljs>\n *\n * When using Material Font Icons with ligatures:\n * <hljs lang=\"html\">\n *  <!--\n *  For Material Design Icons\n *  The class '.material-icons' is auto-added if a style has NOT been specified\n *  since `material-icons` is the default fontset. So your markup:\n *  -->\n *  <md-icon> face </md-icon>\n *  <!-- becomes this at runtime: -->\n *  <md-icon md-font-set=\"material-icons\"> face </md-icon>\n *  <!-- If the fontset does not support ligature names, then we need to use the ligature unicode.-->\n *  <md-icon> &#xE87C; </md-icon>\n *  <!-- The class '.material-icons' must be manually added if other styles are also specified-->\n *  <md-icon class=\"material-icons md-light md-48\"> face </md-icon>\n * </hljs>\n *\n * When using other Font-Icon libraries:\n *\n * <hljs lang=\"js\">\n *  // Specify a font-icon style alias\n *  angular.config(function($mdIconProvider) {\n *    $mdIconProvider.fontSet('md', 'material-icons');\n *  });\n * </hljs>\n *\n * <hljs lang=\"html\">\n *  <md-icon md-font-set=\"md\">favorite</md-icon>\n * </hljs>\n *\n */\nfunction mdIconDirective($mdIcon, $mdTheming, $mdAria, $sce) {\n\n  return {\n    restrict: 'E',\n    link : postLink\n  };\n\n\n  /**\n   * Directive postLink\n   * Supports embedded SVGs, font-icons, & external SVGs\n   */\n  function postLink(scope, element, attr) {\n    $mdTheming(element);\n    var lastFontIcon = attr.mdFontIcon;\n    var lastFontSet = $mdIcon.fontSet(attr.mdFontSet);\n\n    prepareForFontIcon();\n\n    attr.$observe('mdFontIcon', fontIconChanged);\n    attr.$observe('mdFontSet', fontIconChanged);\n\n    // Keep track of the content of the svg src so we can compare against it later to see if the\n    // attribute is static (and thus safe).\n    var originalSvgSrc = element[0].getAttribute(attr.$attr.mdSvgSrc);\n\n    // If using a font-icon, then the textual name of the icon itself\n    // provides the aria-label.\n\n    var attrName = attr.$normalize(attr.$attr.mdSvgIcon || attr.$attr.mdSvgSrc || '');\n\n    /* Provide a default accessibility role of img */\n    if (!attr.role) {\n      $mdAria.expect(element, 'role', 'img');\n      /* manually update attr variable */\n      attr.role = 'img';\n    }\n\n    /* Don't process ARIA if already valid */\n    if ( attr.role === \"img\" && !attr.ariaHidden && !$mdAria.hasAriaLabel(element) ) {\n      var iconName;\n      if (attr.alt) {\n        /* Use alt text by default if available */\n        $mdAria.expect(element, 'aria-label', attr.alt);\n      } else if ($mdAria.parentHasAriaLabel(element, 2)) {\n        /* Parent has ARIA so we will assume it will describe the image */\n        $mdAria.expect(element, 'aria-hidden', 'true');\n      } else if (iconName = (attr.mdFontIcon || attr.mdSvgIcon || element.text())) {\n        /* Use icon name as aria-label */\n        $mdAria.expect(element, 'aria-label', iconName);\n      } else {\n        /* No label found */\n        $mdAria.expect(element, 'aria-hidden', 'true');\n      }\n    }\n\n    if (attrName) {\n      // Use either pre-configured SVG or URL source, respectively.\n      attr.$observe(attrName, function(attrVal) {\n        element.empty();\n        if (attrVal) {\n          $mdIcon(attrVal)\n            .then(function(svg) {\n            element.empty();\n            element.append(svg);\n          });\n        }\n      });\n    }\n\n    function prepareForFontIcon() {\n      if (!attr.mdSvgIcon && !attr.mdSvgSrc) {\n        if (attr.mdFontIcon) {\n          element.addClass('md-font ' + attr.mdFontIcon);\n        }\n\n        element.addClass(lastFontSet);\n      }\n    }\n\n    function fontIconChanged() {\n      if (!attr.mdSvgIcon && !attr.mdSvgSrc) {\n        if (attr.mdFontIcon) {\n          element.removeClass(lastFontIcon);\n          element.addClass(attr.mdFontIcon);\n\n          lastFontIcon = attr.mdFontIcon;\n        }\n\n        var fontSet = $mdIcon.fontSet(attr.mdFontSet);\n\n        if (lastFontSet !== fontSet) {\n          element.removeClass(lastFontSet);\n          element.addClass(fontSet);\n\n          lastFontSet = fontSet;\n        }\n      }\n    }\n  }\n}\n\n})();\n(function(){\n\"use strict\";\n\n  \nMdIconService.$inject = [\"config\", \"$templateRequest\", \"$q\", \"$log\", \"$mdUtil\", \"$sce\"];angular\n    .module('material.components.icon')\n    .constant('$$mdSvgRegistry', {\n        'mdTabsArrow':   'data:image/svg+xml;base64,PHN2ZyB2ZXJzaW9uPSIxLjEiIHg9IjBweCIgeT0iMHB4IiB2aWV3Qm94PSIwIDAgMjQgMjQiPjxnPjxwb2x5Z29uIHBvaW50cz0iMTUuNCw3LjQgMTQsNiA4LDEyIDE0LDE4IDE1LjQsMTYuNiAxMC44LDEyICIvPjwvZz48L3N2Zz4=',\n        'mdClose':       'data:image/svg+xml;base64,PHN2ZyB2ZXJzaW9uPSIxLjEiIHg9IjBweCIgeT0iMHB4IiB2aWV3Qm94PSIwIDAgMjQgMjQiPjxnPjxwYXRoIGQ9Ik0xOSA2LjQxbC0xLjQxLTEuNDEtNS41OSA1LjU5LTUuNTktNS41OS0xLjQxIDEuNDEgNS41OSA1LjU5LTUuNTkgNS41OSAxLjQxIDEuNDEgNS41OS01LjU5IDUuNTkgNS41OSAxLjQxLTEuNDEtNS41OS01LjU5eiIvPjwvZz48L3N2Zz4=',\n        'mdCancel':      'data:image/svg+xml;base64,PHN2ZyB2ZXJzaW9uPSIxLjEiIHg9IjBweCIgeT0iMHB4IiB2aWV3Qm94PSIwIDAgMjQgMjQiPjxnPjxwYXRoIGQ9Ik0xMiAyYy01LjUzIDAtMTAgNC40Ny0xMCAxMHM0LjQ3IDEwIDEwIDEwIDEwLTQuNDcgMTAtMTAtNC40Ny0xMC0xMC0xMHptNSAxMy41OWwtMS40MSAxLjQxLTMuNTktMy41OS0zLjU5IDMuNTktMS40MS0xLjQxIDMuNTktMy41OS0zLjU5LTMuNTkgMS40MS0xLjQxIDMuNTkgMy41OSAzLjU5LTMuNTkgMS40MSAxLjQxLTMuNTkgMy41OSAzLjU5IDMuNTl6Ii8+PC9nPjwvc3ZnPg==',\n        'mdMenu':        'data:image/svg+xml;base64,PHN2ZyB2ZXJzaW9uPSIxLjEiIHg9IjBweCIgeT0iMHB4IiB2aWV3Qm94PSIwIDAgMjQgMjQiPjxwYXRoIGQ9Ik0zLDZIMjFWOEgzVjZNMywxMUgyMVYxM0gzVjExTTMsMTZIMjFWMThIM1YxNloiIC8+PC9zdmc+',\n        'mdToggleArrow': 'data:image/svg+xml;base64,PHN2ZyB2ZXJzaW9uPSIxLjEiIHg9IjBweCIgeT0iMHB4IiB2aWV3Qm94PSIwIDAgNDggNDgiPjxwYXRoIGQ9Ik0yNCAxNmwtMTIgMTIgMi44MyAyLjgzIDkuMTctOS4xNyA5LjE3IDkuMTcgMi44My0yLjgzeiIvPjxwYXRoIGQ9Ik0wIDBoNDh2NDhoLTQ4eiIgZmlsbD0ibm9uZSIvPjwvc3ZnPg==',\n        'mdCalendar':    'data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSIyNCIgaGVpZ2h0PSIyNCIgdmlld0JveD0iMCAwIDI0IDI0Ij48cGF0aCBkPSJNMTkgM2gtMVYxaC0ydjJIOFYxSDZ2Mkg1Yy0xLjExIDAtMS45OS45LTEuOTkgMkwzIDE5YzAgMS4xLjg5IDIgMiAyaDE0YzEuMSAwIDItLjkgMi0yVjVjMC0xLjEtLjktMi0yLTJ6bTAgMTZINVY4aDE0djExek03IDEwaDV2NUg3eiIvPjwvc3ZnPg==',\n        'mdChecked':     'data:image/svg+xml;base64,PHN2ZyB2ZXJzaW9uPSIxLjEiIHg9IjBweCIgeT0iMHB4IiB2aWV3Qm94PSIwIDAgMjQgMjQiPjxnPjxwYXRoIGQ9Ik05IDE2LjE3TDQuODMgMTJsLTEuNDIgMS40MUw5IDE5IDIxIDdsLTEuNDEtMS40MXoiLz48L2c+PC9zdmc+'\n    })\n    .provider('$mdIcon', MdIconProvider);\n\n/**\n * @ngdoc service\n * @name $mdIconProvider\n * @module material.components.icon\n *\n * @description\n * `$mdIconProvider` is used only to register icon IDs with URLs. These configuration features allow\n * icons and icon sets to be pre-registered and associated with source URLs **before** the `<md-icon />`\n * directives are compiled.\n *\n * If using font-icons, the developer is responsible for loading the fonts.\n *\n * If using SVGs, loading of the actual svg files are deferred to on-demand requests and are loaded\n * internally by the `$mdIcon` service using the `$templateRequest` service. When an SVG is\n * requested by name/ID, the `$mdIcon` service searches its registry for the associated source URL;\n * that URL is used to on-demand load and parse the SVG dynamically.\n *\n * The `$templateRequest` service expects the icons source to be loaded over trusted URLs.<br/>\n * This means, when loading icons from an external URL, you have to trust the URL in the `$sceDelegateProvider`.\n *\n * <hljs lang=\"js\">\n *   app.config(function($sceDelegateProvider) {\n *     $sceDelegateProvider.resourceUrlWhitelist([\n *       // Adding 'self' to the whitelist, will allow requests from the current origin.\n *       'self',\n *       // Using double asterisks here, will allow all URLs to load.\n *       // We recommend to only specify the given domain you want to allow.\n *       '**'\n *     ]);\n *   });\n * </hljs>\n *\n * Read more about the [$sceDelegateProvider](https://docs.angularjs.org/api/ng/provider/$sceDelegateProvider).\n *\n * **Notice:** Most font-icons libraries do not support ligatures (for example `fontawesome`).<br/>\n *  In such cases you are not able to use the icon's ligature name - Like so:\n *\n *  <hljs lang=\"html\">\n *    <md-icon md-font-set=\"fa\">fa-bell</md-icon>\n *  </hljs>\n *\n * You should instead use the given unicode, instead of the ligature name.\n *\n * <p ng-hide=\"true\"> ##// Notice we can't use a hljs element here, because the characters will be escaped.</p>\n *  ```html\n *    <md-icon md-font-set=\"fa\">&#xf0f3</md-icon>\n *  ```\n *\n * All unicode ligatures are prefixed with the `&#x` string.\n *\n * @usage\n * <hljs lang=\"js\">\n *   app.config(function($mdIconProvider) {\n    *\n    *     // Configure URLs for icons specified by [set:]id.\n    *\n    *     $mdIconProvider\n    *          .defaultFontSet( 'fa' )                   // This sets our default fontset className.\n    *          .defaultIconSet('my/app/icons.svg')       // Register a default set of SVG icons\n    *          .iconSet('social', 'my/app/social.svg')   // Register a named icon set of SVGs\n    *          .icon('android', 'my/app/android.svg')    // Register a specific icon (by name)\n    *          .icon('work:chair', 'my/app/chair.svg');  // Register icon in a specific set\n    *   });\n * </hljs>\n *\n * SVG icons and icon sets can be easily pre-loaded and cached using either (a) a build process or (b) a runtime\n * **startup** process (shown below):\n *\n * <hljs lang=\"js\">\n *   app.config(function($mdIconProvider) {\n    *\n    *     // Register a default set of SVG icon definitions\n    *     $mdIconProvider.defaultIconSet('my/app/icons.svg')\n    *\n    *   })\n *   .run(function($templateRequest){\n    *\n    *     // Pre-fetch icons sources by URL and cache in the $templateCache...\n    *     // subsequent $templateRequest calls will look there first.\n    *\n    *     var urls = [ 'imy/app/icons.svg', 'img/icons/android.svg'];\n    *\n    *     angular.forEach(urls, function(url) {\n    *       $templateRequest(url);\n    *     });\n    *\n    *   });\n *\n * </hljs>\n *\n * > <b>Note:</b> The loaded SVG data is subsequently cached internally for future requests.\n *\n */\n\n/**\n * @ngdoc method\n * @name $mdIconProvider#icon\n *\n * @description\n * Register a source URL for a specific icon name; the name may include optional 'icon set' name prefix.\n * These icons  will later be retrieved from the cache using `$mdIcon( <icon name> )`\n *\n * @param {string} id Icon name/id used to register the icon\n * @param {string} url specifies the external location for the data file. Used internally by\n * `$templateRequest` to load the data or as part of the lookup in `$templateCache` if pre-loading\n * was configured.\n * @param {number=} viewBoxSize Sets the width and height the icon's viewBox.\n * It is ignored for icons with an existing viewBox. Default size is 24.\n *\n * @returns {obj} an `$mdIconProvider` reference; used to support method call chains for the API\n *\n * @usage\n * <hljs lang=\"js\">\n *   app.config(function($mdIconProvider) {\n    *\n    *     // Configure URLs for icons specified by [set:]id.\n    *\n    *     $mdIconProvider\n    *          .icon('android', 'my/app/android.svg')    // Register a specific icon (by name)\n    *          .icon('work:chair', 'my/app/chair.svg');  // Register icon in a specific set\n    *   });\n * </hljs>\n *\n */\n/**\n * @ngdoc method\n * @name $mdIconProvider#iconSet\n *\n * @description\n * Register a source URL for a 'named' set of icons; group of SVG definitions where each definition\n * has an icon id. Individual icons can be subsequently retrieved from this cached set using\n * `$mdIcon(<icon set name>:<icon name>)`\n *\n * @param {string} id Icon name/id used to register the iconset\n * @param {string} url specifies the external location for the data file. Used internally by\n * `$templateRequest` to load the data or as part of the lookup in `$templateCache` if pre-loading\n * was configured.\n * @param {number=} viewBoxSize Sets the width and height of the viewBox of all icons in the set.\n * It is ignored for icons with an existing viewBox. All icons in the icon set should be the same size.\n * Default value is 24.\n *\n * @returns {obj} an `$mdIconProvider` reference; used to support method call chains for the API\n *\n *\n * @usage\n * <hljs lang=\"js\">\n *   app.config(function($mdIconProvider) {\n    *\n    *     // Configure URLs for icons specified by [set:]id.\n    *\n    *     $mdIconProvider\n    *          .iconSet('social', 'my/app/social.svg')   // Register a named icon set\n    *   });\n * </hljs>\n *\n */\n/**\n * @ngdoc method\n * @name $mdIconProvider#defaultIconSet\n *\n * @description\n * Register a source URL for the default 'named' set of icons. Unless explicitly registered,\n * subsequent lookups of icons will failover to search this 'default' icon set.\n * Icon can be retrieved from this cached, default set using `$mdIcon(<name>)`\n *\n * @param {string} url specifies the external location for the data file. Used internally by\n * `$templateRequest` to load the data or as part of the lookup in `$templateCache` if pre-loading\n * was configured.\n * @param {number=} viewBoxSize Sets the width and height of the viewBox of all icons in the set.\n * It is ignored for icons with an existing viewBox. All icons in the icon set should be the same size.\n * Default value is 24.\n *\n * @returns {obj} an `$mdIconProvider` reference; used to support method call chains for the API\n *\n * @usage\n * <hljs lang=\"js\">\n *   app.config(function($mdIconProvider) {\n    *\n    *     // Configure URLs for icons specified by [set:]id.\n    *\n    *     $mdIconProvider\n    *          .defaultIconSet( 'my/app/social.svg' )   // Register a default icon set\n    *   });\n * </hljs>\n *\n */\n/**\n * @ngdoc method\n * @name $mdIconProvider#defaultFontSet\n *\n * @description\n * When using Font-Icons, AngularJS Material assumes the the Material Design icons will be used and automatically\n * configures the default font-set == 'material-icons'. Note that the font-set references the font-icon library\n * class style that should be applied to the `<md-icon>`.\n *\n * Configuring the default means that the attributes\n * `md-font-set=\"material-icons\"` or `class=\"material-icons\"` do not need to be explicitly declared on the\n * `<md-icon>` markup. For example:\n *\n *  `<md-icon> face </md-icon>`\n *  will render as\n *  `<span class=\"material-icons\"> face </span>`, and\n *\n *  `<md-icon md-font-set=\"fa\"> face </md-icon>`\n *  will render as\n *  `<span class=\"fa\"> face </span>`\n *\n * @param {string} name of the font-library style that should be applied to the md-icon DOM element\n *\n * @usage\n * <hljs lang=\"js\">\n *   app.config(function($mdIconProvider) {\n   *     $mdIconProvider.defaultFontSet( 'fa' );\n   *   });\n * </hljs>\n *\n */\n\n/**\n * @ngdoc method\n * @name $mdIconProvider#fontSet\n *\n * @description\n * When using a font set for `<md-icon>` you must specify the correct font classname in the `md-font-set`\n * attribute. If the fonset className is really long, your markup may become cluttered... an easy\n * solution is to define an `alias` for your fontset:\n *\n * @param {string} alias of the specified fontset.\n * @param {string} className of the fontset.\n *\n * @usage\n * <hljs lang=\"js\">\n *   app.config(function($mdIconProvider) {\n   *     // In this case, we set an alias for the `material-icons` fontset.\n   *     $mdIconProvider.fontSet('md', 'material-icons');\n   *   });\n * </hljs>\n *\n */\n\n/**\n * @ngdoc method\n * @name $mdIconProvider#defaultViewBoxSize\n *\n * @description\n * While `<md-icon />` markup can also be style with sizing CSS, this method configures\n * the default width **and** height used for all icons; unless overridden by specific CSS.\n * The default sizing is (24px, 24px).\n * @param {number=} viewBoxSize Sets the width and height of the viewBox for an icon or an icon set.\n * All icons in a set should be the same size. The default value is 24.\n *\n * @returns {obj} an `$mdIconProvider` reference; used to support method call chains for the API\n *\n * @usage\n * <hljs lang=\"js\">\n *   app.config(function($mdIconProvider) {\n    *\n    *     // Configure URLs for icons specified by [set:]id.\n    *\n    *     $mdIconProvider\n    *          .defaultViewBoxSize(36)   // Register a default icon size (width == height)\n    *   });\n * </hljs>\n *\n */\n\nvar config = {\n  defaultViewBoxSize: 24,\n  defaultFontSet: 'material-icons',\n  fontSets: []\n};\n\nfunction MdIconProvider() {\n}\n\nMdIconProvider.prototype = {\n  icon: function(id, url, viewBoxSize) {\n    if (id.indexOf(':') == -1) id = '$default:' + id;\n\n    config[id] = new ConfigurationItem(url, viewBoxSize);\n    return this;\n  },\n\n  iconSet: function(id, url, viewBoxSize) {\n    config[id] = new ConfigurationItem(url, viewBoxSize);\n    return this;\n  },\n\n  defaultIconSet: function(url, viewBoxSize) {\n    var setName = '$default';\n\n    if (!config[setName]) {\n      config[setName] = new ConfigurationItem(url, viewBoxSize);\n    }\n\n    config[setName].viewBoxSize = viewBoxSize || config.defaultViewBoxSize;\n\n    return this;\n  },\n\n  defaultViewBoxSize: function(viewBoxSize) {\n    config.defaultViewBoxSize = viewBoxSize;\n    return this;\n  },\n\n  /**\n   * Register an alias name associated with a font-icon library style ;\n   */\n  fontSet: function fontSet(alias, className) {\n    config.fontSets.push({\n      alias: alias,\n      fontSet: className || alias\n    });\n    return this;\n  },\n\n  /**\n   * Specify a default style name associated with a font-icon library\n   * fallback to Material Icons.\n   *\n   */\n  defaultFontSet: function defaultFontSet(className) {\n    config.defaultFontSet = !className ? '' : className;\n    return this;\n  },\n\n  defaultIconSize: function defaultIconSize(iconSize) {\n    config.defaultIconSize = iconSize;\n    return this;\n  },\n\n  $get: ['$templateRequest', '$q', '$log', '$mdUtil', '$sce', function($templateRequest, $q, $log, $mdUtil, $sce) {\n    return MdIconService(config, $templateRequest, $q, $log, $mdUtil, $sce);\n  }]\n};\n\n/**\n *  Configuration item stored in the Icon registry; used for lookups\n *  to load if not already cached in the `loaded` cache\n */\nfunction ConfigurationItem(url, viewBoxSize) {\n  this.url = url;\n  this.viewBoxSize = viewBoxSize || config.defaultViewBoxSize;\n}\n\n/**\n * @ngdoc service\n * @name $mdIcon\n * @module material.components.icon\n *\n * @description\n * The `$mdIcon` service is a function used to lookup SVG icons.\n *\n * @param {string} id Query value for a unique Id or URL. If the argument is a URL, then the service will retrieve the icon element\n * from its internal cache or load the icon and cache it first. If the value is not a URL-type string, then an ID lookup is\n * performed. The Id may be a unique icon ID or may include an iconSet ID prefix.\n *\n * For the **id** query to work properly, this means that all id-to-URL mappings must have been previously configured\n * using the `$mdIconProvider`.\n *\n * @returns {angular.$q.Promise} A promise that gets resolved to a clone of the initial SVG DOM element; which was\n * created from the SVG markup in the SVG data file. If an error occurs (e.g. the icon cannot be found) the promise\n * will get rejected.\n *\n * @usage\n * <hljs lang=\"js\">\n * function SomeDirective($mdIcon) {\n  *\n  *   // See if the icon has already been loaded, if not\n  *   // then lookup the icon from the registry cache, load and cache\n  *   // it for future requests.\n  *   // NOTE: ID queries require configuration with $mdIconProvider\n  *\n  *   $mdIcon('android').then(function(iconEl)    { element.append(iconEl); });\n  *   $mdIcon('work:chair').then(function(iconEl) { element.append(iconEl); });\n  *\n  *   // Load and cache the external SVG using a URL\n  *\n  *   $mdIcon('img/icons/android.svg').then(function(iconEl) {\n  *     element.append(iconEl);\n  *   });\n  * };\n * </hljs>\n *\n * > <b>Note:</b> The `<md-icon>` directive internally uses the `$mdIcon` service to query, loaded,\n *   and instantiate SVG DOM elements.\n */\n\n/* @ngInject */\nfunction MdIconService(config, $templateRequest, $q, $log, $mdUtil, $sce) {\n  var iconCache = {};\n  var svgCache = {};\n  var urlRegex = /[-\\w@:%\\+.~#?&//=]{2,}\\.[a-z]{2,4}\\b(\\/[-\\w@:%\\+.~#?&//=]*)?/i;\n  var dataUrlRegex = /^data:image\\/svg\\+xml[\\s*;\\w\\-\\=]*?(base64)?,(.*)$/i;\n\n  Icon.prototype = {clone: cloneSVG, prepare: prepareAndStyle};\n  getIcon.fontSet = findRegisteredFontSet;\n\n  // Publish service...\n  return getIcon;\n\n  /**\n   * Actual $mdIcon service is essentially a lookup function\n   */\n  function getIcon(id) {\n    id = id || '';\n\n    // If the \"id\" provided is not a string, the only other valid value is a $sce trust wrapper\n    // over a URL string. If the value is not trusted, this will intentionally throw an error\n    // because the user is attempted to use an unsafe URL, potentially opening themselves up\n    // to an XSS attack.\n    if (!angular.isString(id)) {\n      id = $sce.getTrustedUrl(id);\n    }\n\n    // If already loaded and cached, use a clone of the cached icon.\n    // Otherwise either load by URL, or lookup in the registry and then load by URL, and cache.\n\n    if (iconCache[id]) {\n      return $q.when(transformClone(iconCache[id]));\n    }\n\n    if (urlRegex.test(id) || dataUrlRegex.test(id)) {\n      return loadByURL(id).then(cacheIcon(id));\n    }\n\n    if (id.indexOf(':') == -1) {\n      id = '$default:' + id;\n    }\n\n    var load = config[id] ? loadByID : loadFromIconSet;\n    return load(id)\n      .then(cacheIcon(id));\n  }\n\n  /**\n   * Lookup registered fontSet style using its alias...\n   * If not found,\n   */\n  function findRegisteredFontSet(alias) {\n    var useDefault = angular.isUndefined(alias) || !(alias && alias.length);\n    if (useDefault) return config.defaultFontSet;\n\n    var result = alias;\n    angular.forEach(config.fontSets, function(it) {\n      if (it.alias == alias) result = it.fontSet || result;\n    });\n\n    return result;\n  }\n\n  function transformClone(cacheElement) {\n    var clone = cacheElement.clone();\n    var cacheSuffix = '_cache' + $mdUtil.nextUid();\n\n    // We need to modify for each cached icon the id attributes.\n    // This is needed because SVG id's are treated as normal DOM ids\n    // and should not have a duplicated id.\n    if (clone.id) clone.id += cacheSuffix;\n    angular.forEach(clone.querySelectorAll('[id]'), function(item) {\n      item.id += cacheSuffix;\n    });\n\n    return clone;\n  }\n\n  /**\n   * Prepare and cache the loaded icon for the specified `id`\n   */\n  function cacheIcon(id) {\n\n    return function updateCache(icon) {\n      iconCache[id] = isIcon(icon) ? icon : new Icon(icon, config[id]);\n\n      return iconCache[id].clone();\n    };\n  }\n\n  /**\n   * Lookup the configuration in the registry, if !registered throw an error\n   * otherwise load the icon [on-demand] using the registered URL.\n   *\n   */\n  function loadByID(id) {\n    var iconConfig = config[id];\n    return loadByURL(iconConfig.url).then(function(icon) {\n      return new Icon(icon, iconConfig);\n    });\n  }\n\n  /**\n   *    Loads the file as XML and uses querySelector( <id> ) to find\n   *    the desired node...\n   */\n  function loadFromIconSet(id) {\n    var setName = id.substring(0, id.lastIndexOf(':')) || '$default';\n    var iconSetConfig = config[setName];\n\n    return !iconSetConfig ? announceIdNotFound(id) : loadByURL(iconSetConfig.url).then(extractFromSet);\n\n    function extractFromSet(set) {\n      var iconName = id.slice(id.lastIndexOf(':') + 1);\n      var icon = set.querySelector('#' + iconName);\n      return icon ? new Icon(icon, iconSetConfig) : announceIdNotFound(id);\n    }\n\n    function announceIdNotFound(id) {\n      var msg = 'icon ' + id + ' not found';\n      $log.warn(msg);\n\n      return $q.reject(msg || id);\n    }\n  }\n\n  /**\n   * Load the icon by URL (may use the $templateCache).\n   * Extract the data for later conversion to Icon\n   */\n  function loadByURL(url) {\n    /* Load the icon from embedded data URL. */\n    function loadByDataUrl(url) {\n      var results = dataUrlRegex.exec(url);\n      var isBase64 = /base64/i.test(url);\n      var data = isBase64 ? window.atob(results[2]) : results[2];\n\n      return $q.when(angular.element(data)[0]);\n    }\n\n    /* Load the icon by URL using HTTP. */\n    function loadByHttpUrl(url) {\n      return $q(function(resolve, reject) {\n        // Catch HTTP or generic errors not related to incorrect icon IDs.\n        var announceAndReject = function(err) {\n            var msg = angular.isString(err) ? err : (err.message || err.data || err.statusText);\n            $log.warn(msg);\n            reject(err);\n          },\n          extractSvg = function(response) {\n            if (!svgCache[url]) {\n              svgCache[url] = angular.element('<div>').append(response)[0].querySelector('svg');\n            }\n            resolve(svgCache[url]);\n          };\n\n        $templateRequest(url, true).then(extractSvg, announceAndReject);\n      });\n    }\n\n    return dataUrlRegex.test(url)\n      ? loadByDataUrl(url)\n      : loadByHttpUrl(url);\n  }\n\n  /**\n   * Check target signature to see if it is an Icon instance.\n   */\n  function isIcon(target) {\n    return angular.isDefined(target.element) && angular.isDefined(target.config);\n  }\n\n  /**\n   *  Define the Icon class\n   */\n  function Icon(el, config) {\n    if (el && el.tagName != 'svg') {\n      el = angular.element('<svg xmlns=\"http://www.w3.org/2000/svg\">').append(el.cloneNode(true))[0];\n    }\n\n    // Inject the namespace if not available...\n    if (!el.getAttribute('xmlns')) {\n      el.setAttribute('xmlns', \"http://www.w3.org/2000/svg\");\n    }\n\n    this.element = el;\n    this.config = config;\n    this.prepare();\n  }\n\n  /**\n   *  Prepare the DOM element that will be cached in the\n   *  loaded iconCache store.\n   */\n  function prepareAndStyle() {\n    var viewBoxSize = this.config ? this.config.viewBoxSize : config.defaultViewBoxSize;\n    angular.forEach({\n      'fit': '',\n      'height': '100%',\n      'width': '100%',\n      'preserveAspectRatio': 'xMidYMid meet',\n      'viewBox': this.element.getAttribute('viewBox') || ('0 0 ' + viewBoxSize + ' ' + viewBoxSize),\n      'focusable': false // Disable IE11s default behavior to make SVGs focusable\n    }, function(val, attr) {\n      this.element.setAttribute(attr, val);\n    }, this);\n  }\n\n  /**\n   * Clone the Icon DOM element.\n   */\n  function cloneSVG() {\n    // If the element or any of its children have a style attribute, then a CSP policy without\n    // 'unsafe-inline' in the style-src directive, will result in a violation.\n    return this.element.cloneNode(true);\n  }\n\n}\n\n})();\n(function(){\n\"use strict\";\n\n\n\nMenuController.$inject = [\"$mdMenu\", \"$attrs\", \"$element\", \"$scope\", \"$mdUtil\", \"$timeout\", \"$rootScope\", \"$q\", \"$log\"];\nangular\n    .module('material.components.menu')\n    .controller('mdMenuCtrl', MenuController);\n\n/**\n * @ngInject\n */\nfunction MenuController($mdMenu, $attrs, $element, $scope, $mdUtil, $timeout, $rootScope, $q, $log) {\n\n  var prefixer = $mdUtil.prefixer();\n  var menuContainer;\n  var self = this;\n  var triggerElement;\n\n  this.nestLevel = parseInt($attrs.mdNestLevel, 10) || 0;\n\n  /**\n   * Called by our linking fn to provide access to the menu-content\n   * element removed during link\n   */\n  this.init = function init(setMenuContainer, opts) {\n    opts = opts || {};\n    menuContainer = setMenuContainer;\n\n    // Default element for ARIA attributes has the ngClick or ngMouseenter expression\n    triggerElement = $element[0].querySelector(prefixer.buildSelector(['ng-click', 'ng-mouseenter']));\n    triggerElement.setAttribute('aria-expanded', 'false');\n\n    this.isInMenuBar = opts.isInMenuBar;\n    this.nestedMenus = $mdUtil.nodesToArray(menuContainer[0].querySelectorAll('.md-nested-menu'));\n\n    menuContainer.on('$mdInterimElementRemove', function() {\n      self.isOpen = false;\n      $mdUtil.nextTick(function(){ self.onIsOpenChanged(self.isOpen);});\n    });\n    $mdUtil.nextTick(function(){ self.onIsOpenChanged(self.isOpen);});\n\n    var menuContainerId = 'menu_container_' + $mdUtil.nextUid();\n    menuContainer.attr('id', menuContainerId);\n    angular.element(triggerElement).attr({\n      'aria-owns': menuContainerId,\n      'aria-haspopup': 'true'\n    });\n\n    $scope.$on('$destroy', angular.bind(this, function() {\n      this.disableHoverListener();\n      $mdMenu.destroy();\n    }));\n\n    menuContainer.on('$destroy', function() {\n      $mdMenu.destroy();\n    });\n  };\n\n  var openMenuTimeout, menuItems, deregisterScopeListeners = [];\n  this.enableHoverListener = function() {\n    deregisterScopeListeners.push($rootScope.$on('$mdMenuOpen', function(event, el) {\n      if (menuContainer[0].contains(el[0])) {\n        self.currentlyOpenMenu = el.controller('mdMenu');\n        self.isAlreadyOpening = false;\n        self.currentlyOpenMenu.registerContainerProxy(self.triggerContainerProxy.bind(self));\n      }\n    }));\n    deregisterScopeListeners.push($rootScope.$on('$mdMenuClose', function(event, el) {\n      if (menuContainer[0].contains(el[0])) {\n        self.currentlyOpenMenu = undefined;\n      }\n    }));\n    menuItems = angular.element($mdUtil.nodesToArray(menuContainer[0].children[0].children));\n    menuItems.on('mouseenter', self.handleMenuItemHover);\n    menuItems.on('mouseleave', self.handleMenuItemMouseLeave);\n  };\n\n  this.disableHoverListener = function() {\n    while (deregisterScopeListeners.length) {\n      deregisterScopeListeners.shift()();\n    }\n    menuItems && menuItems.off('mouseenter', self.handleMenuItemHover);\n    menuItems && menuItems.off('mouseleave', self.handleMenuItemMouseLeave);\n  };\n\n  this.handleMenuItemHover = function(event) {\n    if (self.isAlreadyOpening) return;\n    var nestedMenu = (\n      event.target.querySelector('md-menu')\n        || $mdUtil.getClosest(event.target, 'MD-MENU')\n    );\n    openMenuTimeout = $timeout(function() {\n      if (nestedMenu) {\n        nestedMenu = angular.element(nestedMenu).controller('mdMenu');\n      }\n\n      if (self.currentlyOpenMenu && self.currentlyOpenMenu != nestedMenu) {\n        var closeTo = self.nestLevel + 1;\n        self.currentlyOpenMenu.close(true, { closeTo: closeTo });\n        self.isAlreadyOpening = !!nestedMenu;\n        nestedMenu && nestedMenu.open();\n      } else if (nestedMenu && !nestedMenu.isOpen && nestedMenu.open) {\n        self.isAlreadyOpening = !!nestedMenu;\n        nestedMenu && nestedMenu.open();\n      }\n    }, nestedMenu ? 100 : 250);\n    var focusableTarget = event.currentTarget.querySelector('.md-button:not([disabled])');\n    focusableTarget && focusableTarget.focus();\n  };\n\n  this.handleMenuItemMouseLeave = function() {\n    if (openMenuTimeout) {\n      $timeout.cancel(openMenuTimeout);\n      openMenuTimeout = undefined;\n    }\n  };\n\n\n  /**\n   * Uses the $mdMenu interim element service to open the menu contents\n   */\n  this.open = function openMenu(ev) {\n    ev && ev.stopPropagation();\n    ev && ev.preventDefault();\n    if (self.isOpen) return;\n    self.enableHoverListener();\n    self.isOpen = true;\n    $mdUtil.nextTick(function(){ self.onIsOpenChanged(self.isOpen);});\n    triggerElement = triggerElement || (ev ? ev.target : $element[0]);\n    triggerElement.setAttribute('aria-expanded', 'true');\n    $scope.$emit('$mdMenuOpen', $element);\n    $mdMenu.show({\n      scope: $scope,\n      mdMenuCtrl: self,\n      nestLevel: self.nestLevel,\n      element: menuContainer,\n      target: triggerElement,\n      preserveElement: true,\n      parent: 'body'\n    }).finally(function() {\n      triggerElement.setAttribute('aria-expanded', 'false');\n      self.disableHoverListener();\n    });\n  };\n\n  this.onIsOpenChanged = function(isOpen) {\n    if (isOpen) {\n      menuContainer.attr('aria-hidden', 'false');\n      $element[0].classList.add('md-open');\n      angular.forEach(self.nestedMenus, function(el) {\n        el.classList.remove('md-open');\n      });\n    } else {\n      menuContainer.attr('aria-hidden', 'true');\n      $element[0].classList.remove('md-open');\n    }\n    $scope.$mdMenuIsOpen = self.isOpen;\n  };\n\n  this.focusMenuContainer = function focusMenuContainer() {\n    var focusTarget = menuContainer[0]\n      .querySelector(prefixer.buildSelector(['md-menu-focus-target', 'md-autofocus']));\n\n    if (!focusTarget) focusTarget = menuContainer[0].querySelector('.md-button:not([disabled])');\n    focusTarget.focus();\n  };\n\n  this.registerContainerProxy = function registerContainerProxy(handler) {\n    this.containerProxy = handler;\n  };\n\n  this.triggerContainerProxy = function triggerContainerProxy(ev) {\n    this.containerProxy && this.containerProxy(ev);\n  };\n\n  this.destroy = function() {\n    return self.isOpen ? $mdMenu.destroy() : $q.when(false);\n  };\n\n  // Use the $mdMenu interim element service to close the menu contents\n  this.close = function closeMenu(skipFocus, closeOpts) {\n    if ( !self.isOpen ) return;\n    self.isOpen = false;\n    $mdUtil.nextTick(function(){ self.onIsOpenChanged(self.isOpen);});\n\n    var eventDetails = angular.extend({}, closeOpts, { skipFocus: skipFocus });\n    $scope.$emit('$mdMenuClose', $element, eventDetails);\n    $mdMenu.hide(null, closeOpts);\n\n    if (!skipFocus) {\n      var el = self.restoreFocusTo || $element.find('button')[0];\n      if (el instanceof angular.element) el = el[0];\n      if (el) el.focus();\n    }\n  };\n\n  /**\n   * Build a nice object out of our string attribute which specifies the\n   * target mode for left and top positioning\n   */\n  this.positionMode = function positionMode() {\n    var attachment = ($attrs.mdPositionMode || 'target').split(' ');\n\n    // If attachment is a single item, duplicate it for our second value.\n    // ie. 'target' -> 'target target'\n    if (attachment.length == 1) {\n      attachment.push(attachment[0]);\n    }\n\n    return {\n      left: attachment[0],\n      top: attachment[1]\n    };\n  };\n\n  /**\n   * Build a nice object out of our string attribute which specifies\n   * the offset of top and left in pixels.\n   */\n  this.offsets = function offsets() {\n    var position = ($attrs.mdOffset || '0 0').split(' ').map(parseFloat);\n    if (position.length == 2) {\n      return {\n        left: position[0],\n        top: position[1]\n      };\n    } else if (position.length == 1) {\n      return {\n        top: position[0],\n        left: position[0]\n      };\n    } else {\n      throw Error('Invalid offsets specified. Please follow format <x, y> or <n>');\n    }\n  };\n\n  // Functionality that is exposed in the view.\n  $scope.$mdMenu = {\n    open: this.open,\n    close: this.close\n  };\n\n  // Deprecated APIs\n  $scope.$mdOpenMenu = angular.bind(this, function() {\n    $log.warn('mdMenu: The $mdOpenMenu method is deprecated. Please use `$mdMenu.open`.');\n    return this.open.apply(this, arguments);\n  });\n}\n\n})();\n(function(){\n\"use strict\";\n\n/**\n * @ngdoc directive\n * @name mdMenu\n * @module material.components.menu\n * @restrict E\n * @description\n *\n * Menus are elements that open when clicked. They are useful for displaying\n * additional options within the context of an action.\n *\n * Every `md-menu` must specify exactly two child elements. The first element is what is\n * left in the DOM and is used to open the menu. This element is called the trigger element.\n * The trigger element's scope has access to `$mdMenu.open($event)`\n * which it may call to open the menu. By passing $event as argument, the\n * corresponding event is stopped from propagating up the DOM-tree. Similarly, `$mdMenu.close()`\n * can be used to close the menu.\n *\n * The second element is the `md-menu-content` element which represents the\n * contents of the menu when it is open. Typically this will contain `md-menu-item`s,\n * but you can do custom content as well.\n *\n * <hljs lang=\"html\">\n * <md-menu>\n *  <!-- Trigger element is a md-button with an icon -->\n *  <md-button ng-click=\"$mdMenu.open($event)\" class=\"md-icon-button\" aria-label=\"Open sample menu\">\n *    <md-icon md-svg-icon=\"call:phone\"></md-icon>\n *  </md-button>\n *  <md-menu-content>\n *    <md-menu-item><md-button ng-click=\"doSomething()\">Do Something</md-button></md-menu-item>\n *  </md-menu-content>\n * </md-menu>\n * </hljs>\n\n * ## Sizing Menus\n *\n * The width of the menu when it is open may be specified by specifying a `width`\n * attribute on the `md-menu-content` element.\n * See the [Material Design Spec](https://material.google.com/components/menus.html#menus-simple-menus)\n * for more information.\n *\n *\n * ## Aligning Menus\n *\n * When a menu opens, it is important that the content aligns with the trigger element.\n * Failure to align menus can result in jarring experiences for users as content\n * suddenly shifts. To help with this, `md-menu` provides serveral APIs to help\n * with alignment.\n *\n * ### Target Mode\n *\n * By default, `md-menu` will attempt to align the `md-menu-content` by aligning\n * designated child elements in both the trigger and the menu content.\n *\n * To specify the alignment element in the `trigger` you can use the `md-menu-origin`\n * attribute on a child element. If no `md-menu-origin` is specified, the `md-menu`\n * will be used as the origin element.\n *\n * Similarly, the `md-menu-content` may specify a `md-menu-align-target` for a\n * `md-menu-item` to specify the node that it should try and align with.\n *\n * In this example code, we specify an icon to be our origin element, and an\n * icon in our menu content to be our alignment target. This ensures that both\n * icons are aligned when the menu opens.\n *\n * <hljs lang=\"html\">\n * <md-menu>\n *  <md-button ng-click=\"$mdMenu.open($event)\" class=\"md-icon-button\" aria-label=\"Open some menu\">\n *    <md-icon md-menu-origin md-svg-icon=\"call:phone\"></md-icon>\n *  </md-button>\n *  <md-menu-content>\n *    <md-menu-item>\n *      <md-button ng-click=\"doSomething()\" aria-label=\"Do something\">\n *        <md-icon md-menu-align-target md-svg-icon=\"call:phone\"></md-icon>\n *        Do Something\n *      </md-button>\n *    </md-menu-item>\n *  </md-menu-content>\n * </md-menu>\n * </hljs>\n *\n * Sometimes we want to specify alignment on the right side of an element, for example\n * if we have a menu on the right side a toolbar, we want to right align our menu content.\n *\n * We can specify the origin by using the `md-position-mode` attribute on both\n * the `x` and `y` axis. Right now only the `x-axis` has more than one option.\n * You may specify the default mode of `target target` or\n * `target-right target` to specify a right-oriented alignment target. See the\n * position section of the demos for more examples.\n *\n * ### Menu Offsets\n *\n * It is sometimes unavoidable to need to have a deeper level of control for\n * the positioning of a menu to ensure perfect alignment. `md-menu` provides\n * the `md-offset` attribute to allow pixel level specificty of adjusting the\n * exact positioning.\n *\n * This offset is provided in the format of `x y` or `n` where `n` will be used\n * in both the `x` and `y` axis.\n *\n * For example, to move a menu by `2px` down from the top, we can use:\n * <hljs lang=\"html\">\n * <md-menu md-offset=\"0 2\">\n *   <!-- menu-content -->\n * </md-menu>\n * </hljs>\n *\n * ### Auto Focus\n * By default, when a menu opens, `md-menu` focuses the first button in the menu content.\n *\n * But sometimes you would like to focus another specific menu item instead of the first.<br/>\n * This can be done by applying the `md-autofocus` directive on the given element.\n *\n * <hljs lang=\"html\">\n * <md-menu-item>\n *   <md-button md-autofocus ng-click=\"doSomething()\">\n *     Auto Focus\n *   </md-button>\n * </md-menu-item>\n * </hljs>\n *\n *\n * ### Preventing close\n *\n * Sometimes you would like to be able to click on a menu item without having the menu\n * close. To do this, AngularJS Material exposes the `md-prevent-menu-close` attribute which\n * can be added to a button inside a menu to stop the menu from automatically closing.\n * You can then close the menu either by using `$mdMenu.close()` in the template,\n * or programatically by injecting `$mdMenu` and calling `$mdMenu.hide()`.\n *\n * <hljs lang=\"html\">\n * <md-menu-content ng-mouseleave=\"$mdMenu.close()\">\n *   <md-menu-item>\n *     <md-button ng-click=\"doSomething()\" aria-label=\"Do something\" md-prevent-menu-close=\"md-prevent-menu-close\">\n *       <md-icon md-menu-align-target md-svg-icon=\"call:phone\"></md-icon>\n *       Do Something\n *     </md-button>\n *   </md-menu-item>\n * </md-menu-content>\n * </hljs>\n *\n * @usage\n * <hljs lang=\"html\">\n * <md-menu>\n *  <md-button ng-click=\"$mdMenu.open($event)\" class=\"md-icon-button\">\n *    <md-icon md-svg-icon=\"call:phone\"></md-icon>\n *  </md-button>\n *  <md-menu-content>\n *    <md-menu-item><md-button ng-click=\"doSomething()\">Do Something</md-button></md-menu-item>\n *  </md-menu-content>\n * </md-menu>\n * </hljs>\n *\n * @param {string} md-position-mode The position mode in the form of\n *           `x`, `y`. Default value is `target`,`target`. Right now the `x` axis\n *           also supports `target-right`.\n * @param {string} md-offset An offset to apply to the dropdown after positioning\n *           `x`, `y`. Default value is `0`,`0`.\n *\n */\n\nMenuDirective.$inject = [\"$mdUtil\"];\nangular\n    .module('material.components.menu')\n    .directive('mdMenu', MenuDirective);\n\n/**\n * @ngInject\n */\nfunction MenuDirective($mdUtil) {\n  var INVALID_PREFIX = 'Invalid HTML for md-menu: ';\n  return {\n    restrict: 'E',\n    require: ['mdMenu', '?^mdMenuBar'],\n    controller: 'mdMenuCtrl', // empty function to be built by link\n    scope: true,\n    compile: compile\n  };\n\n  function compile(templateElement) {\n    templateElement.addClass('md-menu');\n\n    var triggerEl = templateElement.children()[0];\n    var contentEl = templateElement.children()[1];\n\n    var prefixer = $mdUtil.prefixer();\n\n    if (!prefixer.hasAttribute(triggerEl, 'ng-click')) {\n      triggerEl = triggerEl\n          .querySelector(prefixer.buildSelector(['ng-click', 'ng-mouseenter'])) || triggerEl;\n    }\n\n    var isButtonTrigger = triggerEl.nodeName === 'MD-BUTTON' || triggerEl.nodeName === 'BUTTON';\n\n    if (triggerEl && isButtonTrigger && !triggerEl.hasAttribute('type')) {\n      triggerEl.setAttribute('type', 'button');\n    }\n\n    if (!triggerEl) {\n      throw Error(INVALID_PREFIX + 'Expected the menu to have a trigger element.');\n    }\n\n    if (!contentEl || contentEl.nodeName !== 'MD-MENU-CONTENT') {\n      throw Error(INVALID_PREFIX + 'Expected the menu to contain a `md-menu-content` element.');\n    }\n\n    // Default element for ARIA attributes has the ngClick or ngMouseenter expression\n    triggerEl && triggerEl.setAttribute('aria-haspopup', 'true');\n\n    var nestedMenus = templateElement[0].querySelectorAll('md-menu');\n    var nestingDepth = parseInt(templateElement[0].getAttribute('md-nest-level'), 10) || 0;\n    if (nestedMenus) {\n      angular.forEach($mdUtil.nodesToArray(nestedMenus), function(menuEl) {\n        if (!menuEl.hasAttribute('md-position-mode')) {\n          menuEl.setAttribute('md-position-mode', 'cascade');\n        }\n        menuEl.classList.add('_md-nested-menu');\n        menuEl.setAttribute('md-nest-level', nestingDepth + 1);\n      });\n    }\n    return link;\n  }\n\n  function link(scope, element, attr, ctrls) {\n    var mdMenuCtrl = ctrls[0];\n    var isInMenuBar = !!ctrls[1];\n    // Move everything into a md-menu-container and pass it to the controller\n    var menuContainer = angular.element( '<div class=\"_md md-open-menu-container md-whiteframe-z2\"></div>');\n    var menuContents = element.children()[1];\n\n    element.addClass('_md');     // private md component indicator for styling\n\n    if (!menuContents.hasAttribute('role')) {\n      menuContents.setAttribute('role', 'menu');\n    }\n    menuContainer.append(menuContents);\n\n    element.on('$destroy', function() {\n      menuContainer.remove();\n    });\n\n    element.append(menuContainer);\n    menuContainer[0].style.display = 'none';\n    mdMenuCtrl.init(menuContainer, { isInMenuBar: isInMenuBar });\n\n  }\n}\n\n})();\n(function(){\n\"use strict\";\n\n\nMenuProvider.$inject = [\"$$interimElementProvider\"];angular\n  .module('material.components.menu')\n  .provider('$mdMenu', MenuProvider);\n\n/*\n * Interim element provider for the menu.\n * Handles behavior for a menu while it is open, including:\n *    - handling animating the menu opening/closing\n *    - handling key/mouse events on the menu element\n *    - handling enabling/disabling scroll while the menu is open\n *    - handling redrawing during resizes and orientation changes\n *\n */\n\nfunction MenuProvider($$interimElementProvider) {\n  menuDefaultOptions.$inject = [\"$mdUtil\", \"$mdTheming\", \"$mdConstant\", \"$document\", \"$window\", \"$q\", \"$$rAF\", \"$animateCss\", \"$animate\", \"$log\"];\n  var MENU_EDGE_MARGIN = 8;\n\n  return $$interimElementProvider('$mdMenu')\n    .setDefaults({\n      methods: ['target'],\n      options: menuDefaultOptions\n    });\n\n  /* @ngInject */\n  function menuDefaultOptions($mdUtil, $mdTheming, $mdConstant, $document, $window, $q, $$rAF,\n                              $animateCss, $animate, $log) {\n\n    var prefixer = $mdUtil.prefixer();\n    var animator = $mdUtil.dom.animator;\n\n    return {\n      parent: 'body',\n      onShow: onShow,\n      onRemove: onRemove,\n      hasBackdrop: true,\n      disableParentScroll: true,\n      skipCompile: true,\n      preserveScope: true,\n      multiple: true,\n      themable: true\n    };\n\n    /**\n     * Show modal backdrop element...\n     * @returns {function(): void} A function that removes this backdrop\n     */\n    function showBackdrop(scope, element, options) {\n      if (options.nestLevel) return angular.noop;\n\n      // If we are not within a dialog...\n      if (options.disableParentScroll && !$mdUtil.getClosest(options.target, 'MD-DIALOG')) {\n        // !! DO this before creating the backdrop; since disableScrollAround()\n        //    configures the scroll offset; which is used by mdBackDrop postLink()\n        options.restoreScroll = $mdUtil.disableScrollAround(options.element, options.parent);\n      } else {\n        options.disableParentScroll = false;\n      }\n\n      if (options.hasBackdrop) {\n        options.backdrop = $mdUtil.createBackdrop(scope, \"md-menu-backdrop md-click-catcher\");\n\n        $animate.enter(options.backdrop, $document[0].body);\n      }\n\n      /**\n       * Hide and destroys the backdrop created by showBackdrop()\n       */\n      return function hideBackdrop() {\n        if (options.backdrop) options.backdrop.remove();\n        if (options.disableParentScroll) options.restoreScroll();\n      };\n    }\n\n    /**\n     * Removing the menu element from the DOM and remove all associated event listeners\n     * and backdrop\n     */\n    function onRemove(scope, element, opts) {\n      opts.cleanupInteraction();\n      opts.cleanupBackdrop();\n      opts.cleanupResizing();\n      opts.hideBackdrop();\n\n      // Before the menu is closing remove the clickable class.\n      element.removeClass('md-clickable');\n\n      // For navigation $destroy events, do a quick, non-animated removal,\n      // but for normal closes (from clicks, etc) animate the removal\n\n      return (opts.$destroy === true) ? detachAndClean() : animateRemoval().then( detachAndClean );\n\n      /**\n       * For normal closes, animate the removal.\n       * For forced closes (like $destroy events), skip the animations\n       */\n      function animateRemoval() {\n        return $animateCss(element, {addClass: 'md-leave'}).start();\n      }\n\n      /**\n       * Detach the element\n       */\n      function detachAndClean() {\n        element.removeClass('md-active');\n        detachElement(element, opts);\n        opts.alreadyOpen = false;\n      }\n\n    }\n\n    /**\n     * Inserts and configures the staged Menu element into the DOM, positioning it,\n     * and wiring up various interaction events\n     */\n    function onShow(scope, element, opts) {\n      sanitizeAndConfigure(opts);\n\n      if (opts.menuContentEl[0]) {\n        // Inherit the theme from the target element.\n        $mdTheming.inherit(opts.menuContentEl, opts.target);\n      } else {\n        $log.warn(\n          '$mdMenu: Menu elements should always contain a `md-menu-content` element,' +\n          'otherwise interactivity features will not work properly.',\n          element\n        );\n      }\n      \n      // Register various listeners to move menu on resize/orientation change\n      opts.cleanupResizing = startRepositioningOnResize();\n      opts.hideBackdrop = showBackdrop(scope, element, opts);\n\n      // Return the promise for when our menu is done animating in\n      return showMenu()\n        .then(function(response) {\n          opts.alreadyOpen = true;\n          opts.cleanupInteraction = activateInteraction();\n          opts.cleanupBackdrop = setupBackdrop();\n\n          // Since the menu finished its animation, mark the menu as clickable.\n          element.addClass('md-clickable');\n\n          return response;\n        });\n\n      /**\n       * Place the menu into the DOM and call positioning related functions\n       */\n      function showMenu() {\n        opts.parent.append(element);\n        element[0].style.display = '';\n\n        return $q(function(resolve) {\n          var position = calculateMenuPosition(element, opts);\n\n          element.removeClass('md-leave');\n\n          // Animate the menu scaling, and opacity [from its position origin (default == top-left)]\n          // to normal scale.\n          $animateCss(element, {\n            addClass: 'md-active',\n            from: animator.toCss(position),\n            to: animator.toCss({transform: ''})\n          })\n          .start()\n          .then(resolve);\n\n        });\n      }\n\n      /**\n       * Check for valid opts and set some sane defaults\n       */\n      function sanitizeAndConfigure() {\n        if (!opts.target) {\n          throw Error(\n            '$mdMenu.show() expected a target to animate from in options.target'\n          );\n        }\n        angular.extend(opts, {\n          alreadyOpen: false,\n          isRemoved: false,\n          target: angular.element(opts.target), //make sure it's not a naked dom node\n          parent: angular.element(opts.parent),\n          menuContentEl: angular.element(element[0].querySelector('md-menu-content'))\n        });\n      }\n\n      /**\n       * Configure various resize listeners for screen changes\n       */\n      function startRepositioningOnResize() {\n\n        var repositionMenu = (function(target, options) {\n          return $$rAF.throttle(function() {\n            if (opts.isRemoved) return;\n            var position = calculateMenuPosition(target, options);\n\n            target.css(animator.toCss(position));\n          });\n        })(element, opts);\n\n        $window.addEventListener('resize', repositionMenu);\n        $window.addEventListener('orientationchange', repositionMenu);\n\n        return function stopRepositioningOnResize() {\n\n          // Disable resizing handlers\n          $window.removeEventListener('resize', repositionMenu);\n          $window.removeEventListener('orientationchange', repositionMenu);\n\n        };\n      }\n\n      /**\n       * Sets up the backdrop and listens for click elements.\n       * Once the backdrop will be clicked, the menu will automatically close.\n       * @returns {!Function} Function to remove the backdrop.\n       */\n      function setupBackdrop() {\n        if (!opts.backdrop) return angular.noop;\n\n        opts.backdrop.on('click', onBackdropClick);\n\n        return function() {\n          opts.backdrop.off('click', onBackdropClick);\n        }\n      }\n\n      /**\n       * Function to be called whenever the backdrop is clicked.\n       * @param {!MouseEvent} event\n       */\n      function onBackdropClick(event) {\n        event.preventDefault();\n        event.stopPropagation();\n\n        scope.$apply(function() {\n          opts.mdMenuCtrl.close(true, { closeAll: true });\n        });\n      }\n\n      /**\n       * Activate interaction on the menu. Resolves the focus target and closes the menu on\n       * escape or option click.\n       * @returns {!Function} Function to deactivate the interaction listeners.\n       */\n      function activateInteraction() {\n        if (!opts.menuContentEl[0]) return angular.noop;\n\n        // Wire up keyboard listeners.\n        // - Close on escape,\n        // - focus next item on down arrow,\n        // - focus prev item on up\n        opts.menuContentEl.on('keydown', onMenuKeyDown);\n        opts.menuContentEl[0].addEventListener('click', captureClickListener, true);\n\n        // kick off initial focus in the menu on the first enabled element\n        var focusTarget = opts.menuContentEl[0]\n          .querySelector(prefixer.buildSelector(['md-menu-focus-target', 'md-autofocus']));\n\n        if ( !focusTarget ) {\n          var childrenLen = opts.menuContentEl[0].children.length;\n          for(var childIndex = 0; childIndex < childrenLen; childIndex++) {\n            var child = opts.menuContentEl[0].children[childIndex];\n            focusTarget = child.querySelector('.md-button:not([disabled])');\n            if (focusTarget) {\n              break;\n            }\n            if (child.firstElementChild && !child.firstElementChild.disabled) {\n              focusTarget = child.firstElementChild;\n              break;\n            }\n          }\n        }\n\n        focusTarget && focusTarget.focus();\n\n        return function cleanupInteraction() {\n          opts.menuContentEl.off('keydown', onMenuKeyDown);\n          opts.menuContentEl[0].removeEventListener('click', captureClickListener, true);\n        };\n\n        // ************************************\n        // internal functions\n        // ************************************\n\n        function onMenuKeyDown(ev) {\n          var handled;\n          switch (ev.keyCode) {\n            case $mdConstant.KEY_CODE.ESCAPE:\n              opts.mdMenuCtrl.close(false, { closeAll: true });\n              handled = true;\n              break;\n            case $mdConstant.KEY_CODE.UP_ARROW:\n              if (!focusMenuItem(ev, opts.menuContentEl, opts, -1) && !opts.nestLevel) {\n                opts.mdMenuCtrl.triggerContainerProxy(ev);\n              }\n              handled = true;\n              break;\n            case $mdConstant.KEY_CODE.DOWN_ARROW:\n              if (!focusMenuItem(ev, opts.menuContentEl, opts, 1) && !opts.nestLevel) {\n                opts.mdMenuCtrl.triggerContainerProxy(ev);\n              }\n              handled = true;\n              break;\n            case $mdConstant.KEY_CODE.LEFT_ARROW:\n              if (opts.nestLevel) {\n                opts.mdMenuCtrl.close();\n              } else {\n                opts.mdMenuCtrl.triggerContainerProxy(ev);\n              }\n              handled = true;\n              break;\n            case $mdConstant.KEY_CODE.RIGHT_ARROW:\n              var parentMenu = $mdUtil.getClosest(ev.target, 'MD-MENU');\n              if (parentMenu && parentMenu != opts.parent[0]) {\n                ev.target.click();\n              } else {\n                opts.mdMenuCtrl.triggerContainerProxy(ev);\n              }\n              handled = true;\n              break;\n          }\n          if (handled) {\n            ev.preventDefault();\n            ev.stopImmediatePropagation();\n          }\n        }\n\n        function onBackdropClick(e) {\n          e.preventDefault();\n          e.stopPropagation();\n          scope.$apply(function() {\n            opts.mdMenuCtrl.close(true, { closeAll: true });\n          });\n        }\n\n        // Close menu on menu item click, if said menu-item is not disabled\n        function captureClickListener(e) {\n          var target = e.target;\n          // Traverse up the event until we get to the menuContentEl to see if\n          // there is an ng-click and that the ng-click is not disabled\n          do {\n            if (target == opts.menuContentEl[0]) return;\n            if ((hasAnyAttribute(target, ['ng-click', 'ng-href', 'ui-sref']) ||\n                target.nodeName == 'BUTTON' || target.nodeName == 'MD-BUTTON') && !hasAnyAttribute(target, ['md-prevent-menu-close'])) {\n              var closestMenu = $mdUtil.getClosest(target, 'MD-MENU');\n              if (!target.hasAttribute('disabled') && (!closestMenu || closestMenu == opts.parent[0])) {\n                close();\n              }\n              break;\n            }\n          } while (target = target.parentNode);\n\n          function close() {\n            scope.$apply(function() {\n              opts.mdMenuCtrl.close(true, { closeAll: true });\n            });\n          }\n\n          function hasAnyAttribute(target, attrs) {\n            if (!target) return false;\n\n            for (var i = 0, attr; attr = attrs[i]; ++i) {\n              if (prefixer.hasAttribute(target, attr)) {\n                return true;\n              }\n            }\n\n            return false;\n          }\n        }\n\n      }\n    }\n\n    /**\n     * Takes a keypress event and focuses the next/previous menu\n     * item from the emitting element\n     * @param {event} e - The origin keypress event\n     * @param {angular.element} menuEl - The menu element\n     * @param {object} opts - The interim element options for the mdMenu\n     * @param {number} direction - The direction to move in (+1 = next, -1 = prev)\n     */\n    function focusMenuItem(e, menuEl, opts, direction) {\n      var currentItem = $mdUtil.getClosest(e.target, 'MD-MENU-ITEM');\n\n      var items = $mdUtil.nodesToArray(menuEl[0].children);\n      var currentIndex = items.indexOf(currentItem);\n\n      // Traverse through our elements in the specified direction (+/-1) and try to\n      // focus them until we find one that accepts focus\n      var didFocus;\n      for (var i = currentIndex + direction; i >= 0 && i < items.length; i = i + direction) {\n        var focusTarget = items[i].querySelector('.md-button');\n        didFocus = attemptFocus(focusTarget);\n        if (didFocus) {\n          break;\n        }\n      }\n      return didFocus;\n    }\n\n    /**\n     * Attempts to focus an element. Checks whether that element is the currently\n     * focused element after attempting.\n     * @param {HTMLElement} el - the element to attempt focus on\n     * @returns {bool} - whether the element was successfully focused\n     */\n    function attemptFocus(el) {\n      if (el && el.getAttribute('tabindex') != -1) {\n        el.focus();\n        return ($document[0].activeElement == el);\n      }\n    }\n\n    /**\n     * Use browser to remove this element without triggering a $destroy event\n     */\n    function detachElement(element, opts) {\n      if (!opts.preserveElement) {\n        if (toNode(element).parentNode === toNode(opts.parent)) {\n          toNode(opts.parent).removeChild(toNode(element));\n        }\n      } else {\n        toNode(element).style.display = 'none';\n      }\n    }\n\n    /**\n     * Computes menu position and sets the style on the menu container\n     * @param {HTMLElement} el - the menu container element\n     * @param {object} opts - the interim element options object\n     */\n    function calculateMenuPosition(el, opts) {\n\n      var containerNode = el[0],\n        openMenuNode = el[0].firstElementChild,\n        openMenuNodeRect = openMenuNode.getBoundingClientRect(),\n        boundryNode = $document[0].body,\n        boundryNodeRect = boundryNode.getBoundingClientRect();\n\n      var menuStyle = $window.getComputedStyle(openMenuNode);\n\n      var originNode = opts.target[0].querySelector(prefixer.buildSelector('md-menu-origin')) || opts.target[0],\n        originNodeRect = originNode.getBoundingClientRect();\n\n      var bounds = {\n        left: boundryNodeRect.left + MENU_EDGE_MARGIN,\n        top: Math.max(boundryNodeRect.top, 0) + MENU_EDGE_MARGIN,\n        bottom: Math.max(boundryNodeRect.bottom, Math.max(boundryNodeRect.top, 0) + boundryNodeRect.height) - MENU_EDGE_MARGIN,\n        right: boundryNodeRect.right - MENU_EDGE_MARGIN\n      };\n\n      var alignTarget, alignTargetRect = { top:0, left : 0, right:0, bottom:0 }, existingOffsets  = { top:0, left : 0, right:0, bottom:0  };\n      var positionMode = opts.mdMenuCtrl.positionMode();\n\n      if (positionMode.top == 'target' || positionMode.left == 'target' || positionMode.left == 'target-right') {\n        alignTarget = firstVisibleChild();\n        if ( alignTarget ) {\n          // TODO: Allow centering on an arbitrary node, for now center on first menu-item's child\n          alignTarget = alignTarget.firstElementChild || alignTarget;\n          alignTarget = alignTarget.querySelector(prefixer.buildSelector('md-menu-align-target')) || alignTarget;\n          alignTargetRect = alignTarget.getBoundingClientRect();\n\n          existingOffsets = {\n            top: parseFloat(containerNode.style.top || 0),\n            left: parseFloat(containerNode.style.left || 0)\n          };\n        }\n      }\n\n      var position = {};\n      var transformOrigin = 'top ';\n\n      switch (positionMode.top) {\n        case 'target':\n          position.top = existingOffsets.top + originNodeRect.top - alignTargetRect.top;\n          break;\n        case 'cascade':\n          position.top = originNodeRect.top - parseFloat(menuStyle.paddingTop) - originNode.style.top;\n          break;\n        case 'bottom':\n          position.top = originNodeRect.top + originNodeRect.height;\n          break;\n        default:\n          throw new Error('Invalid target mode \"' + positionMode.top + '\" specified for md-menu on Y axis.');\n      }\n\n      var rtl = ($mdUtil.bidi() == 'rtl');\n\n      switch (positionMode.left) {\n        case 'target':\n          position.left = existingOffsets.left + originNodeRect.left - alignTargetRect.left;\n          transformOrigin += rtl ? 'right'  : 'left';\n          break;\n        case 'target-left':\n          position.left = originNodeRect.left;\n          transformOrigin += 'left';\n          break;\n        case 'target-right':\n          position.left = originNodeRect.right - openMenuNodeRect.width + (openMenuNodeRect.right - alignTargetRect.right);\n          transformOrigin += 'right';\n          break;\n        case 'cascade':\n          var willFitRight = rtl ? (originNodeRect.left - openMenuNodeRect.width) < bounds.left : (originNodeRect.right + openMenuNodeRect.width) < bounds.right;\n          position.left = willFitRight ? originNodeRect.right - originNode.style.left : originNodeRect.left - originNode.style.left - openMenuNodeRect.width;\n          transformOrigin += willFitRight ? 'left' : 'right';\n          break;\n        case 'right':\n          if (rtl) {\n            position.left = originNodeRect.right - originNodeRect.width;\n            transformOrigin += 'left';\n          } else {\n            position.left = originNodeRect.right - openMenuNodeRect.width;\n            transformOrigin += 'right';\n          }\n          break;\n        case 'left':\n          if (rtl) {\n            position.left = originNodeRect.right - openMenuNodeRect.width;\n            transformOrigin += 'right';\n          } else {\n            position.left = originNodeRect.left;\n            transformOrigin += 'left';\n          }\n          break;\n        default:\n          throw new Error('Invalid target mode \"' + positionMode.left + '\" specified for md-menu on X axis.');\n      }\n\n      var offsets = opts.mdMenuCtrl.offsets();\n      position.top += offsets.top;\n      position.left += offsets.left;\n\n      clamp(position);\n\n      var scaleX = Math.round(100 * Math.min(originNodeRect.width / containerNode.offsetWidth, 1.0)) / 100;\n      var scaleY = Math.round(100 * Math.min(originNodeRect.height / containerNode.offsetHeight, 1.0)) / 100;\n\n      return {\n        top: Math.round(position.top),\n        left: Math.round(position.left),\n        // Animate a scale out if we aren't just repositioning\n        transform: !opts.alreadyOpen ? $mdUtil.supplant('scale({0},{1})', [scaleX, scaleY]) : undefined,\n        transformOrigin: transformOrigin\n      };\n\n      /**\n       * Clamps the repositioning of the menu within the confines of\n       * bounding element (often the screen/body)\n       */\n      function clamp(pos) {\n        pos.top = Math.max(Math.min(pos.top, bounds.bottom - containerNode.offsetHeight), bounds.top);\n        pos.left = Math.max(Math.min(pos.left, bounds.right - containerNode.offsetWidth), bounds.left);\n      }\n\n      /**\n       * Gets the first visible child in the openMenuNode\n       * Necessary incase menu nodes are being dynamically hidden\n       */\n      function firstVisibleChild() {\n        for (var i = 0; i < openMenuNode.children.length; ++i) {\n          if ($window.getComputedStyle(openMenuNode.children[i]).display != 'none') {\n            return openMenuNode.children[i];\n          }\n        }\n      }\n    }\n  }\n  function toNode(el) {\n    if (el instanceof angular.element) {\n      el = el[0];\n    }\n    return el;\n  }\n}\n\n})();\n(function(){\n\"use strict\";\n\n\nMenuBarController.$inject = [\"$scope\", \"$rootScope\", \"$element\", \"$attrs\", \"$mdConstant\", \"$document\", \"$mdUtil\", \"$timeout\"];\nangular\n  .module('material.components.menuBar')\n  .controller('MenuBarController', MenuBarController);\n\nvar BOUND_MENU_METHODS = ['handleKeyDown', 'handleMenuHover', 'scheduleOpenHoveredMenu', 'cancelScheduledOpen'];\n\n/**\n * @ngInject\n */\nfunction MenuBarController($scope, $rootScope, $element, $attrs, $mdConstant, $document, $mdUtil, $timeout) {\n  this.$element = $element;\n  this.$attrs = $attrs;\n  this.$mdConstant = $mdConstant;\n  this.$mdUtil = $mdUtil;\n  this.$document = $document;\n  this.$scope = $scope;\n  this.$rootScope = $rootScope;\n  this.$timeout = $timeout;\n\n  var self = this;\n  angular.forEach(BOUND_MENU_METHODS, function(methodName) {\n    self[methodName] = angular.bind(self, self[methodName]);\n  });\n}\n\nMenuBarController.prototype.init = function() {\n  var $element = this.$element;\n  var $mdUtil = this.$mdUtil;\n  var $scope = this.$scope;\n\n  var self = this;\n  var deregisterFns = [];\n  $element.on('keydown', this.handleKeyDown);\n  this.parentToolbar = $mdUtil.getClosest($element, 'MD-TOOLBAR');\n\n  deregisterFns.push(this.$rootScope.$on('$mdMenuOpen', function(event, el) {\n    if (self.getMenus().indexOf(el[0]) != -1) {\n      $element[0].classList.add('md-open');\n      el[0].classList.add('md-open');\n      self.currentlyOpenMenu = el.controller('mdMenu');\n      self.currentlyOpenMenu.registerContainerProxy(self.handleKeyDown);\n      self.enableOpenOnHover();\n    }\n  }));\n\n  deregisterFns.push(this.$rootScope.$on('$mdMenuClose', function(event, el, opts) {\n    var rootMenus = self.getMenus();\n    if (rootMenus.indexOf(el[0]) != -1) {\n      $element[0].classList.remove('md-open');\n      el[0].classList.remove('md-open');\n    }\n\n    if ($element[0].contains(el[0])) {\n      var parentMenu = el[0];\n      while (parentMenu && rootMenus.indexOf(parentMenu) == -1) {\n        parentMenu = $mdUtil.getClosest(parentMenu, 'MD-MENU', true);\n      }\n      if (parentMenu) {\n        if (!opts.skipFocus) parentMenu.querySelector('button:not([disabled])').focus();\n        self.currentlyOpenMenu = undefined;\n        self.disableOpenOnHover();\n        self.setKeyboardMode(true);\n      }\n    }\n  }));\n\n  $scope.$on('$destroy', function() {\n    self.disableOpenOnHover();\n    while (deregisterFns.length) {\n      deregisterFns.shift()();\n    }\n  });\n\n\n  this.setKeyboardMode(true);\n};\n\nMenuBarController.prototype.setKeyboardMode = function(enabled) {\n  if (enabled) this.$element[0].classList.add('md-keyboard-mode');\n  else this.$element[0].classList.remove('md-keyboard-mode');\n};\n\nMenuBarController.prototype.enableOpenOnHover = function() {\n  if (this.openOnHoverEnabled) return;\n\n  var self = this;\n\n  self.openOnHoverEnabled = true;\n\n  if (self.parentToolbar) {\n    self.parentToolbar.classList.add('md-has-open-menu');\n\n    // Needs to be on the next tick so it doesn't close immediately.\n    self.$mdUtil.nextTick(function() {\n      angular.element(self.parentToolbar).on('click', self.handleParentClick);\n    }, false);\n  }\n\n  angular\n    .element(self.getMenus())\n    .on('mouseenter', self.handleMenuHover);\n};\n\nMenuBarController.prototype.handleMenuHover = function(e) {\n  this.setKeyboardMode(false);\n  if (this.openOnHoverEnabled) {\n    this.scheduleOpenHoveredMenu(e);\n  }\n};\n\nMenuBarController.prototype.disableOpenOnHover = function() {\n  if (!this.openOnHoverEnabled) return;\n\n  this.openOnHoverEnabled = false;\n\n  if (this.parentToolbar) {\n    this.parentToolbar.classList.remove('md-has-open-menu');\n    angular.element(this.parentToolbar).off('click', this.handleParentClick);\n  }\n\n  angular\n    .element(this.getMenus())\n    .off('mouseenter', this.handleMenuHover);\n};\n\nMenuBarController.prototype.scheduleOpenHoveredMenu = function(e) {\n  var menuEl = angular.element(e.currentTarget);\n  var menuCtrl = menuEl.controller('mdMenu');\n  this.setKeyboardMode(false);\n  this.scheduleOpenMenu(menuCtrl);\n};\n\nMenuBarController.prototype.scheduleOpenMenu = function(menuCtrl) {\n  var self = this;\n  var $timeout = this.$timeout;\n  if (menuCtrl != self.currentlyOpenMenu) {\n    $timeout.cancel(self.pendingMenuOpen);\n    self.pendingMenuOpen = $timeout(function() {\n      self.pendingMenuOpen = undefined;\n      if (self.currentlyOpenMenu) {\n        self.currentlyOpenMenu.close(true, { closeAll: true });\n      }\n      menuCtrl.open();\n    }, 200, false);\n  }\n};\n\nMenuBarController.prototype.handleKeyDown = function(e) {\n  var keyCodes = this.$mdConstant.KEY_CODE;\n  var currentMenu = this.currentlyOpenMenu;\n  var wasOpen = currentMenu && currentMenu.isOpen;\n  this.setKeyboardMode(true);\n  var handled, newMenu, newMenuCtrl;\n  switch (e.keyCode) {\n    case keyCodes.DOWN_ARROW:\n      if (currentMenu) {\n        currentMenu.focusMenuContainer();\n      } else {\n        this.openFocusedMenu();\n      }\n      handled = true;\n      break;\n    case keyCodes.UP_ARROW:\n      currentMenu && currentMenu.close();\n      handled = true;\n      break;\n    case keyCodes.LEFT_ARROW:\n      newMenu = this.focusMenu(-1);\n      if (wasOpen) {\n        newMenuCtrl = angular.element(newMenu).controller('mdMenu');\n        this.scheduleOpenMenu(newMenuCtrl);\n      }\n      handled = true;\n      break;\n    case keyCodes.RIGHT_ARROW:\n      newMenu = this.focusMenu(+1);\n      if (wasOpen) {\n        newMenuCtrl = angular.element(newMenu).controller('mdMenu');\n        this.scheduleOpenMenu(newMenuCtrl);\n      }\n      handled = true;\n      break;\n  }\n  if (handled) {\n    e && e.preventDefault && e.preventDefault();\n    e && e.stopImmediatePropagation && e.stopImmediatePropagation();\n  }\n};\n\nMenuBarController.prototype.focusMenu = function(direction) {\n  var menus = this.getMenus();\n  var focusedIndex = this.getFocusedMenuIndex();\n\n  if (focusedIndex == -1) { focusedIndex = this.getOpenMenuIndex(); }\n\n  var changed = false;\n\n  if (focusedIndex == -1) { focusedIndex = 0; changed = true; }\n  else if (\n    direction < 0 && focusedIndex > 0 ||\n    direction > 0 && focusedIndex < menus.length - direction\n  ) {\n    focusedIndex += direction;\n    changed = true;\n  }\n  if (changed) {\n    menus[focusedIndex].querySelector('button').focus();\n    return menus[focusedIndex];\n  }\n};\n\nMenuBarController.prototype.openFocusedMenu = function() {\n  var menu = this.getFocusedMenu();\n  menu && angular.element(menu).controller('mdMenu').open();\n};\n\nMenuBarController.prototype.getMenus = function() {\n  var $element = this.$element;\n  return this.$mdUtil.nodesToArray($element[0].children)\n    .filter(function(el) { return el.nodeName == 'MD-MENU'; });\n};\n\nMenuBarController.prototype.getFocusedMenu = function() {\n  return this.getMenus()[this.getFocusedMenuIndex()];\n};\n\nMenuBarController.prototype.getFocusedMenuIndex = function() {\n  var $mdUtil = this.$mdUtil;\n  var focusedEl = $mdUtil.getClosest(\n    this.$document[0].activeElement,\n    'MD-MENU'\n  );\n  if (!focusedEl) return -1;\n\n  var focusedIndex = this.getMenus().indexOf(focusedEl);\n  return focusedIndex;\n};\n\nMenuBarController.prototype.getOpenMenuIndex = function() {\n  var menus = this.getMenus();\n  for (var i = 0; i < menus.length; ++i) {\n    if (menus[i].classList.contains('md-open')) return i;\n  }\n  return -1;\n};\n\nMenuBarController.prototype.handleParentClick = function(event) {\n  var openMenu = this.querySelector('md-menu.md-open');\n\n  if (openMenu && !openMenu.contains(event.target)) {\n    angular.element(openMenu).controller('mdMenu').close(true, {\n      closeAll: true\n    });\n  }\n};\n\n})();\n(function(){\n\"use strict\";\n\n/**\n * @ngdoc directive\n * @name mdMenuBar\n * @module material.components.menuBar\n * @restrict E\n * @description\n *\n * Menu bars are containers that hold multiple menus. They change the behavior and appearence\n * of the `md-menu` directive to behave similar to an operating system provided menu.\n *\n * @usage\n * <hljs lang=\"html\">\n * <md-menu-bar>\n *   <md-menu>\n *     <button ng-click=\"$mdMenu.open()\">\n *       File\n *     </button>\n *     <md-menu-content>\n *       <md-menu-item>\n *         <md-button ng-click=\"ctrl.sampleAction('share', $event)\">\n *           Share...\n *         </md-button>\n *       </md-menu-item>\n *       <md-menu-divider></md-menu-divider>\n *       <md-menu-item>\n *       <md-menu-item>\n *         <md-menu>\n *           <md-button ng-click=\"$mdMenu.open()\">New</md-button>\n *           <md-menu-content>\n *             <md-menu-item><md-button ng-click=\"ctrl.sampleAction('New Document', $event)\">Document</md-button></md-menu-item>\n *             <md-menu-item><md-button ng-click=\"ctrl.sampleAction('New Spreadsheet', $event)\">Spreadsheet</md-button></md-menu-item>\n *             <md-menu-item><md-button ng-click=\"ctrl.sampleAction('New Presentation', $event)\">Presentation</md-button></md-menu-item>\n *             <md-menu-item><md-button ng-click=\"ctrl.sampleAction('New Form', $event)\">Form</md-button></md-menu-item>\n *             <md-menu-item><md-button ng-click=\"ctrl.sampleAction('New Drawing', $event)\">Drawing</md-button></md-menu-item>\n *           </md-menu-content>\n *         </md-menu>\n *       </md-menu-item>\n *     </md-menu-content>\n *   </md-menu>\n * </md-menu-bar>\n * </hljs>\n *\n * ## Menu Bar Controls\n *\n * You may place `md-menu-items` that function as controls within menu bars.\n * There are two modes that are exposed via the `type` attribute of the `md-menu-item`.\n * `type=\"checkbox\"` will function as a boolean control for the `ng-model` attribute of the\n * `md-menu-item`. `type=\"radio\"` will function like a radio button, setting the `ngModel`\n * to the `string` value of the `value` attribute. If you need non-string values, you can use\n * `ng-value` to provide an expression (this is similar to how angular's native `input[type=radio]` works.\n *\n * <hljs lang=\"html\">\n * <md-menu-bar>\n *  <md-menu>\n *    <button ng-click=\"$mdMenu.open()\">\n *      Sample Menu\n *    </button>\n *    <md-menu-content>\n *      <md-menu-item type=\"checkbox\" ng-model=\"settings.allowChanges\">Allow changes</md-menu-item>\n *      <md-menu-divider></md-menu-divider>\n *      <md-menu-item type=\"radio\" ng-model=\"settings.mode\" ng-value=\"1\">Mode 1</md-menu-item>\n *      <md-menu-item type=\"radio\" ng-model=\"settings.mode\" ng-value=\"1\">Mode 2</md-menu-item>\n *      <md-menu-item type=\"radio\" ng-model=\"settings.mode\" ng-value=\"1\">Mode 3</md-menu-item>\n *    </md-menu-content>\n *  </md-menu>\n * </md-menu-bar>\n * </hljs>\n *\n *\n * ### Nesting Menus\n *\n * Menus may be nested within menu bars. This is commonly called cascading menus.\n * To nest a menu place the nested menu inside the content of the `md-menu-item`.\n * <hljs lang=\"html\">\n * <md-menu-item>\n *   <md-menu>\n *     <button ng-click=\"$mdMenu.open()\">New</md-button>\n *     <md-menu-content>\n *       <md-menu-item><md-button ng-click=\"ctrl.sampleAction('New Document', $event)\">Document</md-button></md-menu-item>\n *       <md-menu-item><md-button ng-click=\"ctrl.sampleAction('New Spreadsheet', $event)\">Spreadsheet</md-button></md-menu-item>\n *       <md-menu-item><md-button ng-click=\"ctrl.sampleAction('New Presentation', $event)\">Presentation</md-button></md-menu-item>\n *       <md-menu-item><md-button ng-click=\"ctrl.sampleAction('New Form', $event)\">Form</md-button></md-menu-item>\n *       <md-menu-item><md-button ng-click=\"ctrl.sampleAction('New Drawing', $event)\">Drawing</md-button></md-menu-item>\n *     </md-menu-content>\n *   </md-menu>\n * </md-menu-item>\n * </hljs>\n *\n */\n\nMenuBarDirective.$inject = [\"$mdUtil\", \"$mdTheming\"];\nangular\n  .module('material.components.menuBar')\n  .directive('mdMenuBar', MenuBarDirective);\n\n/* @ngInject */\nfunction MenuBarDirective($mdUtil, $mdTheming) {\n  return {\n    restrict: 'E',\n    require: 'mdMenuBar',\n    controller: 'MenuBarController',\n\n    compile: function compile(templateEl, templateAttrs) {\n      if (!templateAttrs.ariaRole) {\n        templateEl[0].setAttribute('role', 'menubar');\n      }\n      angular.forEach(templateEl[0].children, function(menuEl) {\n        if (menuEl.nodeName == 'MD-MENU') {\n          if (!menuEl.hasAttribute('md-position-mode')) {\n            menuEl.setAttribute('md-position-mode', 'left bottom');\n\n            // Since we're in the compile function and actual `md-buttons` are not compiled yet,\n            // we need to query for possible `md-buttons` as well.\n            menuEl.querySelector('button, a, md-button').setAttribute('role', 'menuitem');\n          }\n          var contentEls = $mdUtil.nodesToArray(menuEl.querySelectorAll('md-menu-content'));\n          angular.forEach(contentEls, function(contentEl) {\n            contentEl.classList.add('md-menu-bar-menu');\n            contentEl.classList.add('md-dense');\n            if (!contentEl.hasAttribute('width')) {\n              contentEl.setAttribute('width', 5);\n            }\n          });\n        }\n      });\n\n      // Mark the child menu items that they're inside a menu bar. This is necessary,\n      // because mnMenuItem has special behaviour during compilation, depending on\n      // whether it is inside a mdMenuBar. We can usually figure this out via the DOM,\n      // however if a directive that uses documentFragment is applied to the child (e.g. ngRepeat),\n      // the element won't have a parent and won't compile properly.\n      templateEl.find('md-menu-item').addClass('md-in-menu-bar');\n\n      return function postLink(scope, el, attr, ctrl) {\n        el.addClass('_md');     // private md component indicator for styling\n        $mdTheming(scope, el);\n        ctrl.init();\n      };\n    }\n  };\n\n}\n\n})();\n(function(){\n\"use strict\";\n\n\nangular\n  .module('material.components.menuBar')\n  .directive('mdMenuDivider', MenuDividerDirective);\n\n\nfunction MenuDividerDirective() {\n  return {\n    restrict: 'E',\n    compile: function(templateEl, templateAttrs) {\n      if (!templateAttrs.role) {\n        templateEl[0].setAttribute('role', 'separator');\n      }\n    }\n  };\n}\n\n})();\n(function(){\n\"use strict\";\n\n\nMenuItemController.$inject = [\"$scope\", \"$element\", \"$attrs\"];\nangular\n  .module('material.components.menuBar')\n  .controller('MenuItemController', MenuItemController);\n\n\n/**\n * @ngInject\n */\nfunction MenuItemController($scope, $element, $attrs) {\n  this.$element = $element;\n  this.$attrs = $attrs;\n  this.$scope = $scope;\n}\n\nMenuItemController.prototype.init = function(ngModel) {\n  var $element = this.$element;\n  var $attrs = this.$attrs;\n\n  this.ngModel = ngModel;\n  if ($attrs.type == 'checkbox' || $attrs.type == 'radio') {\n    this.mode  = $attrs.type;\n    this.iconEl = $element[0].children[0];\n    this.buttonEl = $element[0].children[1];\n    if (ngModel) {\n      // Clear ngAria set attributes\n      this.initClickListeners();\n    }\n  }\n};\n\n// ngAria auto sets attributes on a menu-item with a ngModel.\n// We don't want this because our content (buttons) get the focus\n// and set their own aria attributes appropritately. Having both\n// breaks NVDA / JAWS. This undeoes ngAria's attrs.\nMenuItemController.prototype.clearNgAria = function() {\n  var el = this.$element[0];\n  var clearAttrs = ['role', 'tabindex', 'aria-invalid', 'aria-checked'];\n  angular.forEach(clearAttrs, function(attr) {\n    el.removeAttribute(attr);\n  });\n};\n\nMenuItemController.prototype.initClickListeners = function() {\n  var self = this;\n  var ngModel = this.ngModel;\n  var $scope = this.$scope;\n  var $attrs = this.$attrs;\n  var $element = this.$element;\n  var mode = this.mode;\n\n  this.handleClick = angular.bind(this, this.handleClick);\n\n  var icon = this.iconEl;\n  var button = angular.element(this.buttonEl);\n  var handleClick = this.handleClick;\n\n  $attrs.$observe('disabled', setDisabled);\n  setDisabled($attrs.disabled);\n\n  ngModel.$render = function render() {\n    self.clearNgAria();\n    if (isSelected()) {\n      icon.style.display = '';\n      button.attr('aria-checked', 'true');\n    } else {\n      icon.style.display = 'none';\n      button.attr('aria-checked', 'false');\n    }\n  };\n\n  $scope.$$postDigest(ngModel.$render);\n\n  function isSelected() {\n    if (mode == 'radio') {\n      var val = $attrs.ngValue ? $scope.$eval($attrs.ngValue) : $attrs.value;\n      return ngModel.$modelValue == val;\n    } else {\n      return ngModel.$modelValue;\n    }\n  }\n\n  function setDisabled(disabled) {\n    if (disabled) {\n      button.off('click', handleClick);\n    } else {\n      button.on('click', handleClick);\n    }\n  }\n};\n\nMenuItemController.prototype.handleClick = function(e) {\n  var mode = this.mode;\n  var ngModel = this.ngModel;\n  var $attrs = this.$attrs;\n  var newVal;\n  if (mode == 'checkbox') {\n    newVal = !ngModel.$modelValue;\n  } else if (mode == 'radio') {\n    newVal = $attrs.ngValue ? this.$scope.$eval($attrs.ngValue) : $attrs.value;\n  }\n  ngModel.$setViewValue(newVal);\n  ngModel.$render();\n};\n\n})();\n(function(){\n\"use strict\";\n\n\nMenuItemDirective.$inject = [\"$mdUtil\", \"$mdConstant\", \"$$mdSvgRegistry\"];\nangular\n  .module('material.components.menuBar')\n  .directive('mdMenuItem', MenuItemDirective);\n\n /* @ngInject */\nfunction MenuItemDirective($mdUtil, $mdConstant, $$mdSvgRegistry) {\n  return {\n    controller: 'MenuItemController',\n    require: ['mdMenuItem', '?ngModel'],\n    priority: $mdConstant.BEFORE_NG_ARIA,\n    compile: function(templateEl, templateAttrs) {\n      var type = templateAttrs.type;\n      var inMenuBarClass = 'md-in-menu-bar';\n\n      // Note: This allows us to show the `check` icon for the md-menu-bar items.\n      // The `md-in-menu-bar` class is set by the mdMenuBar directive.\n      if ((type == 'checkbox' || type == 'radio') && templateEl.hasClass(inMenuBarClass)) {\n        var text = templateEl[0].textContent;\n        var buttonEl = angular.element('<md-button type=\"button\"></md-button>');\n        var iconTemplate = '<md-icon md-svg-src=\"' + $$mdSvgRegistry.mdChecked + '\"></md-icon>';\n\n        buttonEl.html(text);\n        buttonEl.attr('tabindex', '0');\n\n        templateEl.html('');\n        templateEl.append(angular.element(iconTemplate));\n        templateEl.append(buttonEl);\n        templateEl.addClass('md-indent').removeClass(inMenuBarClass);\n\n        setDefault('role', type == 'checkbox' ? 'menuitemcheckbox' : 'menuitemradio', buttonEl);\n        moveAttrToButton('ng-disabled');\n\n      } else {\n        setDefault('role', 'menuitem', templateEl[0].querySelector('md-button, button, a'));\n      }\n\n\n      return function(scope, el, attrs, ctrls) {\n        var ctrl = ctrls[0];\n        var ngModel = ctrls[1];\n        ctrl.init(ngModel);\n      };\n\n      function setDefault(attr, val, el) {\n        el = el || templateEl;\n        if (el instanceof angular.element) {\n          el = el[0];\n        }\n        if (!el.hasAttribute(attr)) {\n          el.setAttribute(attr, val);\n        }\n      }\n\n      function moveAttrToButton(attribute) {\n        var attributes = $mdUtil.prefixer(attribute);\n\n        angular.forEach(attributes, function(attr) {\n          if (templateEl[0].hasAttribute(attr)) {\n            var val = templateEl[0].getAttribute(attr);\n            buttonEl[0].setAttribute(attr, val);\n            templateEl[0].removeAttribute(attr);\n          }\n        });\n      }\n    }\n  };\n}\n\n})();\n(function(){\n\"use strict\";\n\n/**\n * @ngdoc directive\n * @name mdProgressCircular\n * @module material.components.progressCircular\n * @restrict E\n *\n * @description\n * The circular progress directive is used to make loading content in your app as delightful and\n * painless as possible by minimizing the amount of visual change a user sees before they can view\n * and interact with content.\n *\n * For operations where the percentage of the operation completed can be determined, use a\n * determinate indicator. They give users a quick sense of how long an operation will take.\n *\n * For operations where the user is asked to wait a moment while something finishes up, and it’s\n * not necessary to expose what's happening behind the scenes and how long it will take, use an\n * indeterminate indicator.\n *\n * @param {string} md-mode Select from one of two modes: **'determinate'** and **'indeterminate'**.\n *\n * Note: if the `md-mode` value is set as undefined or specified as not 1 of the two (2) valid modes, then **'indeterminate'**\n * will be auto-applied as the mode.\n *\n * Note: if not configured, the `md-mode=\"indeterminate\"` will be auto injected as an attribute.\n * If `value=\"\"` is also specified, however, then `md-mode=\"determinate\"` would be auto-injected instead.\n * @param {number=} value In determinate mode, this number represents the percentage of the\n *     circular progress. Default: 0\n * @param {number=} md-diameter This specifies the diameter of the circular progress. The value\n * should be a pixel-size value (eg '100'). If this attribute is\n * not present then a default value of '50px' is assumed.\n *\n * @param {boolean=} ng-disabled Determines whether to disable the progress element.\n *\n * @usage\n * <hljs lang=\"html\">\n * <md-progress-circular md-mode=\"determinate\" value=\"...\"></md-progress-circular>\n *\n * <md-progress-circular md-mode=\"determinate\" ng-value=\"...\"></md-progress-circular>\n *\n * <md-progress-circular md-mode=\"determinate\" value=\"...\" md-diameter=\"100\"></md-progress-circular>\n *\n * <md-progress-circular md-mode=\"indeterminate\"></md-progress-circular>\n * </hljs>\n */\n\nMdProgressCircularDirective.$inject = [\"$window\", \"$mdProgressCircular\", \"$mdTheming\", \"$mdUtil\", \"$interval\", \"$log\"];\nangular\n  .module('material.components.progressCircular')\n  .directive('mdProgressCircular', MdProgressCircularDirective);\n\n/* @ngInject */\nfunction MdProgressCircularDirective($window, $mdProgressCircular, $mdTheming,\n                                     $mdUtil, $interval, $log) {\n\n  // Note that this shouldn't use use $$rAF, because it can cause an infinite loop\n  // in any tests that call $animate.flush.\n  var rAF = $window.requestAnimationFrame ||\n            $window.webkitRequestAnimationFrame ||\n            angular.noop;\n\n  var cAF = $window.cancelAnimationFrame ||\n            $window.webkitCancelAnimationFrame ||\n            $window.webkitCancelRequestAnimationFrame ||\n            angular.noop;\n\n  var MODE_DETERMINATE = 'determinate';\n  var MODE_INDETERMINATE = 'indeterminate';\n  var DISABLED_CLASS = '_md-progress-circular-disabled';\n  var INDETERMINATE_CLASS = 'md-mode-indeterminate';\n\n  return {\n    restrict: 'E',\n    scope: {\n      value: '@',\n      mdDiameter: '@',\n      mdMode: '@'\n    },\n    template:\n      '<svg xmlns=\"http://www.w3.org/2000/svg\">' +\n        '<path fill=\"none\"/>' +\n      '</svg>',\n    compile: function(element, attrs) {\n      element.attr({\n        'aria-valuemin': 0,\n        'aria-valuemax': 100,\n        'role': 'progressbar'\n      });\n\n      if (angular.isUndefined(attrs.mdMode)) {\n        var mode = attrs.hasOwnProperty('value') ? MODE_DETERMINATE : MODE_INDETERMINATE;\n        attrs.$set('mdMode', mode);\n      } else {\n        attrs.$set('mdMode', attrs.mdMode.trim());\n      }\n\n      return MdProgressCircularLink;\n    }\n  };\n\n  function MdProgressCircularLink(scope, element, attrs) {\n    var node = element[0];\n    var svg = angular.element(node.querySelector('svg'));\n    var path = angular.element(node.querySelector('path'));\n    var startIndeterminate = $mdProgressCircular.startIndeterminate;\n    var endIndeterminate = $mdProgressCircular.endIndeterminate;\n    var iterationCount = 0;\n    var lastAnimationId = 0;\n    var lastDrawFrame;\n    var interval;\n\n    $mdTheming(element);\n    element.toggleClass(DISABLED_CLASS, attrs.hasOwnProperty('disabled'));\n\n    // If the mode is indeterminate, it doesn't need to\n    // wait for the next digest. It can start right away.\n    if(scope.mdMode === MODE_INDETERMINATE){\n      startIndeterminateAnimation();\n    }\n\n    scope.$on('$destroy', function(){\n      cleanupIndeterminateAnimation();\n\n      if (lastDrawFrame) {\n        cAF(lastDrawFrame);\n      }\n    });\n\n    scope.$watchGroup(['value', 'mdMode', function() {\n      var isDisabled = node.disabled;\n\n      // Sometimes the browser doesn't return a boolean, in\n      // which case we should check whether the attribute is\n      // present.\n      if (isDisabled === true || isDisabled === false){\n        return isDisabled;\n      }\n\n      return angular.isDefined(element.attr('disabled'));\n    }], function(newValues, oldValues) {\n      var mode = newValues[1];\n      var isDisabled = newValues[2];\n      var wasDisabled = oldValues[2];\n\n      if (isDisabled !== wasDisabled) {\n        element.toggleClass(DISABLED_CLASS, !!isDisabled);\n      }\n\n      if (isDisabled) {\n        cleanupIndeterminateAnimation();\n      } else {\n        if (mode !== MODE_DETERMINATE && mode !== MODE_INDETERMINATE) {\n          mode = MODE_INDETERMINATE;\n          attrs.$set('mdMode', mode);\n        }\n\n        if (mode === MODE_INDETERMINATE) {\n          startIndeterminateAnimation();\n        } else {\n          var newValue = clamp(newValues[0]);\n\n          cleanupIndeterminateAnimation();\n\n          element.attr('aria-valuenow', newValue);\n          renderCircle(clamp(oldValues[0]), newValue);\n        }\n      }\n\n    });\n\n    // This is in a separate watch in order to avoid layout, unless\n    // the value has actually changed.\n    scope.$watch('mdDiameter', function(newValue) {\n      var diameter = getSize(newValue);\n      var strokeWidth = getStroke(diameter);\n      var value = clamp(scope.value);\n      var transformOrigin = (diameter / 2) + 'px';\n      var dimensions = {\n        width: diameter + 'px',\n        height: diameter + 'px'\n      };\n\n      // The viewBox has to be applied via setAttribute, because it is\n      // case-sensitive. If jQuery is included in the page, `.attr` lowercases\n      // all attribute names.\n      svg[0].setAttribute('viewBox', '0 0 ' + diameter + ' ' + diameter);\n\n      // Usually viewBox sets the dimensions for the SVG, however that doesn't\n      // seem to be the case on IE10.\n      // Important! The transform origin has to be set from here and it has to\n      // be in the format of \"Ypx Ypx Ypx\", otherwise the rotation wobbles in\n      // IE and Edge, because they don't account for the stroke width when\n      // rotating. Also \"center\" doesn't help in this case, it has to be a\n      // precise value.\n      svg\n        .css(dimensions)\n        .css('transform-origin', transformOrigin + ' ' + transformOrigin + ' ' + transformOrigin);\n\n      element.css(dimensions);\n\n      path.attr('stroke-width', strokeWidth);\n      path.attr('stroke-linecap', 'square');\n      if (scope.mdMode == MODE_INDETERMINATE) {\n        path.attr('d', getSvgArc(diameter, strokeWidth, true));\n        path.attr('stroke-dasharray', (diameter - strokeWidth) * $window.Math.PI * 0.75);\n        path.attr('stroke-dashoffset', getDashLength(diameter, strokeWidth, 1, 75));\n      } else {\n        path.attr('d', getSvgArc(diameter, strokeWidth, false));\n        path.attr('stroke-dasharray', (diameter - strokeWidth) * $window.Math.PI);\n        path.attr('stroke-dashoffset', getDashLength(diameter, strokeWidth, 0, 100));\n        renderCircle(value, value);\n      }\n\n    });\n\n    function renderCircle(animateFrom, animateTo, easing, duration, iterationCount, maxValue) {\n      var id = ++lastAnimationId;\n      var startTime = $mdUtil.now();\n      var changeInValue = animateTo - animateFrom;\n      var diameter = getSize(scope.mdDiameter);\n      var strokeWidth = getStroke(diameter);\n      var ease = easing || $mdProgressCircular.easeFn;\n      var animationDuration = duration || $mdProgressCircular.duration;\n      var rotation = -90 * (iterationCount || 0);\n      var dashLimit = maxValue || 100;\n\n      // No need to animate it if the values are the same\n      if (animateTo === animateFrom) {\n        renderFrame(animateTo);\n      } else {\n        lastDrawFrame = rAF(function animation() {\n          var currentTime = $window.Math.max(0, $window.Math.min($mdUtil.now() - startTime, animationDuration));\n\n          renderFrame(ease(currentTime, animateFrom, changeInValue, animationDuration));\n\n          // Do not allow overlapping animations\n          if (id === lastAnimationId && currentTime < animationDuration) {\n            lastDrawFrame = rAF(animation);\n          }\n        });\n      }\n\n      function renderFrame(value) {\n        path.attr('stroke-dashoffset', getDashLength(diameter, strokeWidth, value, dashLimit));\n        path.attr('transform','rotate(' + (rotation) + ' ' + diameter/2 + ' ' + diameter/2 + ')');\n      }\n    }\n\n    function animateIndeterminate() {\n      renderCircle(\n        startIndeterminate,\n        endIndeterminate,\n        $mdProgressCircular.easeFnIndeterminate,\n        $mdProgressCircular.durationIndeterminate,\n        iterationCount,\n        75\n      );\n\n      // The %4 technically isn't necessary, but it keeps the rotation\n      // under 360, instead of becoming a crazy large number.\n      iterationCount = ++iterationCount % 4;\n\n    }\n\n    function startIndeterminateAnimation() {\n      if (!interval) {\n        // Note that this interval isn't supposed to trigger a digest.\n        interval = $interval(\n          animateIndeterminate,\n          $mdProgressCircular.durationIndeterminate,\n          0,\n          false\n        );\n\n        animateIndeterminate();\n\n        element\n          .addClass(INDETERMINATE_CLASS)\n          .removeAttr('aria-valuenow');\n      }\n    }\n\n    function cleanupIndeterminateAnimation() {\n      if (interval) {\n        $interval.cancel(interval);\n        interval = null;\n        element.removeClass(INDETERMINATE_CLASS);\n      }\n    }\n  }\n\n  /**\n   * Returns SVG path data for progress circle\n   * Syntax spec: https://www.w3.org/TR/SVG/paths.html#PathDataEllipticalArcCommands\n   *\n   * @param {number} diameter Diameter of the container.\n   * @param {number} strokeWidth Stroke width to be used when drawing circle\n   * @param {boolean} indeterminate Use if progress circle will be used for indeterminate\n   *\n   * @returns {string} String representation of an SVG arc.\n   */\n  function getSvgArc(diameter, strokeWidth, indeterminate) {\n    var radius = diameter / 2;\n    var offset = strokeWidth / 2;\n    var start = radius + ',' + offset; // ie: (25, 2.5) or 12 o'clock\n    var end = offset + ',' + radius;   // ie: (2.5, 25) or  9 o'clock\n    var arcRadius = radius - offset;\n    return 'M' + start\n         + 'A' + arcRadius + ',' + arcRadius + ' 0 1 1 ' + end // 75% circle\n         + (indeterminate ? '' : 'A' + arcRadius + ',' + arcRadius + ' 0 0 1 ' + start); // loop to start\n  }\n\n  /**\n   * Return stroke length for progress circle\n   *\n   * @param {number} diameter Diameter of the container.\n   * @param {number} strokeWidth Stroke width to be used when drawing circle\n   * @param {number} value Percentage of circle (between 0 and 100)\n   * @param {number} limit Max percentage for circle\n   *\n   * @returns {number} Stroke length for progres circle\n   */\n  function getDashLength(diameter, strokeWidth, value, limit) {\n    return (diameter - strokeWidth) * $window.Math.PI * ( (3 * (limit || 100) / 100) - (value/100) );\n  }\n\n  /**\n   * Limits a value between 0 and 100.\n   */\n  function clamp(value) {\n    return $window.Math.max(0, $window.Math.min(value || 0, 100));\n  }\n\n  /**\n   * Determines the size of a progress circle, based on the provided\n   * value in the following formats: `X`, `Ypx`, `Z%`.\n   */\n  function getSize(value) {\n    var defaultValue = $mdProgressCircular.progressSize;\n\n    if (value) {\n      var parsed = parseFloat(value);\n\n      if (value.lastIndexOf('%') === value.length - 1) {\n        parsed = (parsed / 100) * defaultValue;\n      }\n\n      return parsed;\n    }\n\n    return defaultValue;\n  }\n\n  /**\n   * Determines the circle's stroke width, based on\n   * the provided diameter.\n   */\n  function getStroke(diameter) {\n    return $mdProgressCircular.strokeWidth / 100 * diameter;\n  }\n\n}\n\n})();\n(function(){\n\"use strict\";\n\n/**\n * @ngdoc service\n * @name $mdProgressCircular\n * @module material.components.progressCircular\n *\n * @description\n * Allows the user to specify the default options for the `progressCircular` directive.\n *\n * @property {number} progressSize Diameter of the progress circle in pixels.\n * @property {number} strokeWidth Width of the circle's stroke as a percentage of the circle's size.\n * @property {number} duration Length of the circle animation in milliseconds.\n * @property {function} easeFn Default easing animation function.\n * @property {object} easingPresets Collection of pre-defined easing functions.\n *\n * @property {number} durationIndeterminate Duration of the indeterminate animation.\n * @property {number} startIndeterminate Indeterminate animation start point.\n * @property {number} endIndeterminate Indeterminate animation end point.\n * @property {function} easeFnIndeterminate Easing function to be used when animating\n * between the indeterminate values.\n *\n * @property {(function(object): object)} configure Used to modify the default options.\n *\n * @usage\n * <hljs lang=\"js\">\n *   myAppModule.config(function($mdProgressCircularProvider) {\n *\n *     // Example of changing the default progress options.\n *     $mdProgressCircularProvider.configure({\n *       progressSize: 100,\n *       strokeWidth: 20,\n *       duration: 800\n *     });\n * });\n * </hljs>\n *\n */\n\nangular\n  .module('material.components.progressCircular')\n  .provider(\"$mdProgressCircular\", MdProgressCircularProvider);\n\nfunction MdProgressCircularProvider() {\n  var progressConfig = {\n    progressSize: 50,\n    strokeWidth: 10,\n    duration: 100,\n    easeFn: linearEase,\n\n    durationIndeterminate: 1333,\n    startIndeterminate: 1,\n    endIndeterminate: 149,\n    easeFnIndeterminate: materialEase,\n\n    easingPresets: {\n      linearEase: linearEase,\n      materialEase: materialEase\n    }\n  };\n\n  return {\n    configure: function(options) {\n      progressConfig = angular.extend(progressConfig, options || {});\n      return progressConfig;\n    },\n    $get: function() { return progressConfig; }\n  };\n\n  function linearEase(t, b, c, d) {\n    return c * t / d + b;\n  }\n\n  function materialEase(t, b, c, d) {\n    // via http://www.timotheegroleau.com/Flash/experiments/easing_function_generator.htm\n    // with settings of [0, 0, 1, 1]\n    var ts = (t /= d) * t;\n    var tc = ts * t;\n    return b + c * (6 * tc * ts + -15 * ts * ts + 10 * tc);\n  }\n}\n\n})();\n(function(){\n\"use strict\";\n\n/**\n * @ngdoc directive\n * @name mdTab\n * @module material.components.tabs\n *\n * @restrict E\n *\n * @description\n * The `<md-tab>` is a nested directive used within `<md-tabs>` to specify a tab with a **label** and optional *view content*.\n *\n * If the `label` attribute is not specified, then an optional `<md-tab-label>` tag can be used to specify more\n * complex tab header markup. If neither the **label** nor the **md-tab-label** are specified, then the nested\n * markup of the `<md-tab>` is used as the tab header markup.\n *\n * Please note that if you use `<md-tab-label>`, your content **MUST** be wrapped in the `<md-tab-body>` tag.  This\n * is to define a clear separation between the tab content and the tab label.\n *\n * This container is used by the TabsController to show/hide the active tab's content view. This synchronization is\n * automatically managed by the internal TabsController whenever the tab selection changes. Selection changes can\n * be initiated via data binding changes, programmatic invocation, or user gestures.\n *\n * @param {string=} label Optional attribute to specify a simple string as the tab label\n * @param {boolean=} ng-disabled If present and expression evaluates to truthy, disabled tab selection.\n * @param {expression=} md-on-deselect Expression to be evaluated after the tab has been de-selected.\n * @param {expression=} md-on-select Expression to be evaluated after the tab has been selected.\n * @param {boolean=} md-active When true, sets the active tab.  Note: There can only be one active tab at a time.\n *\n *\n * @usage\n *\n * <hljs lang=\"html\">\n * <md-tab label=\"\" ng-disabled md-on-select=\"\" md-on-deselect=\"\" >\n *   <h3>My Tab content</h3>\n * </md-tab>\n *\n * <md-tab >\n *   <md-tab-label>\n *     <h3>My Tab content</h3>\n *   </md-tab-label>\n *   <md-tab-body>\n *     <p>\n *       Sed ut perspiciatis unde omnis iste natus error sit voluptatem accusantium doloremque laudantium,\n *       totam rem aperiam, eaque ipsa quae ab illo inventore veritatis et quasi architecto beatae vitae\n *       dicta sunt explicabo. Nemo enim ipsam voluptatem quia voluptas sit aspernatur aut odit aut fugit,\n *       sed quia consequuntur magni dolores eos qui ratione voluptatem sequi nesciunt.\n *     </p>\n *   </md-tab-body>\n * </md-tab>\n * </hljs>\n *\n */\nangular\n    .module('material.components.tabs')\n    .directive('mdTab', MdTab);\n\nfunction MdTab () {\n  return {\n    require:  '^?mdTabs',\n    terminal: true,\n    compile:  function (element, attr) {\n      var label = firstChild(element, 'md-tab-label'),\n          body  = firstChild(element, 'md-tab-body');\n\n      if (label.length === 0) {\n        label = angular.element('<md-tab-label></md-tab-label>');\n        if (attr.label) label.text(attr.label);\n        else label.append(element.contents());\n\n        if (body.length === 0) {\n          var contents = element.contents().detach();\n          body         = angular.element('<md-tab-body></md-tab-body>');\n          body.append(contents);\n        }\n      }\n\n      element.append(label);\n      if (body.html()) element.append(body);\n\n      return postLink;\n    },\n    scope:    {\n      active:   '=?mdActive',\n      disabled: '=?ngDisabled',\n      select:   '&?mdOnSelect',\n      deselect: '&?mdOnDeselect'\n    }\n  };\n\n  function postLink (scope, element, attr, ctrl) {\n    if (!ctrl) return;\n    var index = ctrl.getTabElementIndex(element),\n        body  = firstChild(element, 'md-tab-body').remove(),\n        label = firstChild(element, 'md-tab-label').remove(),\n        data  = ctrl.insertTab({\n          scope:    scope,\n          parent:   scope.$parent,\n          index:    index,\n          element:  element,\n          template: body.html(),\n          label:    label.html()\n        }, index);\n\n    scope.select   = scope.select || angular.noop;\n    scope.deselect = scope.deselect || angular.noop;\n\n    scope.$watch('active', function (active) { if (active) ctrl.select(data.getIndex(), true); });\n    scope.$watch('disabled', function () { ctrl.refreshIndex(); });\n    scope.$watch(\n        function () {\n          return ctrl.getTabElementIndex(element);\n        },\n        function (newIndex) {\n          data.index = newIndex;\n          ctrl.updateTabOrder();\n        }\n    );\n    scope.$on('$destroy', function () { ctrl.removeTab(data); });\n  }\n\n  function firstChild (element, tagName) {\n    var children = element[0].children;\n    for (var i = 0, len = children.length; i < len; i++) {\n      var child = children[i];\n      if (child.tagName === tagName.toUpperCase()) return angular.element(child);\n    }\n    return angular.element();\n  }\n}\n\n})();\n(function(){\n\"use strict\";\n\nangular\n    .module('material.components.tabs')\n    .directive('mdTabItem', MdTabItem);\n\nfunction MdTabItem () {\n  return {\n    require: '^?mdTabs',\n    link:    function link (scope, element, attr, ctrl) {\n      if (!ctrl) return;\n      ctrl.attachRipple(scope, element);\n    }\n  };\n}\n\n})();\n(function(){\n\"use strict\";\n\nangular\n    .module('material.components.tabs')\n    .directive('mdTabLabel', MdTabLabel);\n\nfunction MdTabLabel () {\n  return { terminal: true };\n}\n\n\n})();\n(function(){\n\"use strict\";\n\n\nMdTabScroll.$inject = [\"$parse\"];angular.module('material.components.tabs')\n    .directive('mdTabScroll', MdTabScroll);\n\nfunction MdTabScroll ($parse) {\n  return {\n    restrict: 'A',\n    compile: function ($element, attr) {\n      var fn = $parse(attr.mdTabScroll, null, true);\n      return function ngEventHandler (scope, element) {\n        element.on('mousewheel', function (event) {\n          scope.$apply(function () { fn(scope, { $event: event }); });\n        });\n      };\n    }\n  };\n}\n\n})();\n(function(){\n\"use strict\";\n\n\nMdTabsController.$inject = [\"$scope\", \"$element\", \"$window\", \"$mdConstant\", \"$mdTabInkRipple\", \"$mdUtil\", \"$animateCss\", \"$attrs\", \"$compile\", \"$mdTheming\", \"$mdInteraction\"];angular\n    .module('material.components.tabs')\n    .controller('MdTabsController', MdTabsController);\n\n/**\n * @ngInject\n */\nfunction MdTabsController ($scope, $element, $window, $mdConstant, $mdTabInkRipple, $mdUtil,\n                           $animateCss, $attrs, $compile, $mdTheming, $mdInteraction) {\n  // define private properties\n  var ctrl      = this,\n      locked    = false,\n      elements  = getElements(),\n      queue     = [],\n      destroyed = false,\n      loaded    = false;\n\n\n  // Define public methods\n  ctrl.$onInit            = $onInit;\n  ctrl.updatePagination   = $mdUtil.debounce(updatePagination, 100);\n  ctrl.redirectFocus      = redirectFocus;\n  ctrl.attachRipple       = attachRipple;\n  ctrl.insertTab          = insertTab;\n  ctrl.removeTab          = removeTab;\n  ctrl.select             = select;\n  ctrl.scroll             = scroll;\n  ctrl.nextPage           = nextPage;\n  ctrl.previousPage       = previousPage;\n  ctrl.keydown            = keydown;\n  ctrl.canPageForward     = canPageForward;\n  ctrl.canPageBack        = canPageBack;\n  ctrl.refreshIndex       = refreshIndex;\n  ctrl.incrementIndex     = incrementIndex;\n  ctrl.getTabElementIndex = getTabElementIndex;\n  ctrl.updateInkBarStyles = $mdUtil.debounce(updateInkBarStyles, 100);\n  ctrl.updateTabOrder     = $mdUtil.debounce(updateTabOrder, 100);\n  ctrl.getFocusedTabId    = getFocusedTabId;\n\n  // For AngularJS 1.4 and older, where there are no lifecycle hooks but bindings are pre-assigned,\n  // manually call the $onInit hook.\n  if (angular.version.major === 1 && angular.version.minor <= 4) {\n    this.$onInit();\n  }\n\n  /**\n   * AngularJS Lifecycle hook for newer AngularJS versions.\n   * Bindings are not guaranteed to have been assigned in the controller, but they are in the $onInit hook.\n   */\n  function $onInit() {\n    // Define one-way bindings\n    defineOneWayBinding('stretchTabs', handleStretchTabs);\n\n    // Define public properties with change handlers\n    defineProperty('focusIndex', handleFocusIndexChange, ctrl.selectedIndex || 0);\n    defineProperty('offsetLeft', handleOffsetChange, 0);\n    defineProperty('hasContent', handleHasContent, false);\n    defineProperty('maxTabWidth', handleMaxTabWidth, getMaxTabWidth());\n    defineProperty('shouldPaginate', handleShouldPaginate, false);\n\n    // Define boolean attributes\n    defineBooleanAttribute('noInkBar', handleInkBar);\n    defineBooleanAttribute('dynamicHeight', handleDynamicHeight);\n    defineBooleanAttribute('noPagination');\n    defineBooleanAttribute('swipeContent');\n    defineBooleanAttribute('noDisconnect');\n    defineBooleanAttribute('autoselect');\n    defineBooleanAttribute('noSelectClick');\n    defineBooleanAttribute('centerTabs', handleCenterTabs, false);\n    defineBooleanAttribute('enableDisconnect');\n\n    // Define public properties\n    ctrl.scope             = $scope;\n    ctrl.parent            = $scope.$parent;\n    ctrl.tabs              = [];\n    ctrl.lastSelectedIndex = null;\n    ctrl.hasFocus          = false;\n    ctrl.styleTabItemFocus = false;\n    ctrl.shouldCenterTabs  = shouldCenterTabs();\n    ctrl.tabContentPrefix  = 'tab-content-';\n\n    // Setup the tabs controller after all bindings are available.\n    setupTabsController();\n  }\n\n  /**\n   * Perform setup for the controller, setup events and watcher(s)\n   */\n  function setupTabsController () {\n    ctrl.selectedIndex = ctrl.selectedIndex || 0;\n    compileTemplate();\n    configureWatchers();\n    bindEvents();\n    $mdTheming($element);\n    $mdUtil.nextTick(function () {\n      // Note that the element references need to be updated, because certain \"browsers\"\n      // (IE/Edge) lose them and start throwing \"Invalid calling object\" errors, when we\n      // compile the element contents down in `compileElement`.\n      elements = getElements();\n      updateHeightFromContent();\n      adjustOffset();\n      updateInkBarStyles();\n      ctrl.tabs[ ctrl.selectedIndex ] && ctrl.tabs[ ctrl.selectedIndex ].scope.select();\n      loaded = true;\n      updatePagination();\n    });\n  }\n\n  /**\n   * Compiles the template provided by the user.  This is passed as an attribute from the tabs\n   * directive's template function.\n   */\n  function compileTemplate () {\n    var template = $attrs.$mdTabsTemplate,\n        element  = angular.element($element[0].querySelector('md-tab-data'));\n\n    element.html(template);\n    $compile(element.contents())(ctrl.parent);\n    delete $attrs.$mdTabsTemplate;\n  }\n\n  /**\n   * Binds events used by the tabs component.\n   */\n  function bindEvents () {\n    angular.element($window).on('resize', handleWindowResize);\n    $scope.$on('$destroy', cleanup);\n  }\n\n  /**\n   * Configure watcher(s) used by Tabs\n   */\n  function configureWatchers () {\n    $scope.$watch('$mdTabsCtrl.selectedIndex', handleSelectedIndexChange);\n  }\n\n  /**\n   * Creates a one-way binding manually rather than relying on AngularJS's isolated scope\n   * @param key\n   * @param handler\n   */\n  function defineOneWayBinding (key, handler) {\n    var attr = $attrs.$normalize('md-' + key);\n    if (handler) defineProperty(key, handler);\n    $attrs.$observe(attr, function (newValue) { ctrl[ key ] = newValue; });\n  }\n\n  /**\n   * Defines boolean attributes with default value set to true.  (ie. md-stretch-tabs with no value\n   * will be treated as being truthy)\n   * @param key\n   * @param handler\n   */\n  function defineBooleanAttribute (key, handler) {\n    var attr = $attrs.$normalize('md-' + key);\n    if (handler) defineProperty(key, handler);\n    if ($attrs.hasOwnProperty(attr)) updateValue($attrs[attr]);\n    $attrs.$observe(attr, updateValue);\n    function updateValue (newValue) {\n      ctrl[ key ] = newValue !== 'false';\n    }\n  }\n\n  /**\n   * Remove any events defined by this controller\n   */\n  function cleanup () {\n    destroyed = true;\n    angular.element($window).off('resize', handleWindowResize);\n  }\n\n  // Change handlers\n\n  /**\n   * Toggles stretch tabs class and updates inkbar when tab stretching changes\n   * @param stretchTabs\n   */\n  function handleStretchTabs (stretchTabs) {\n    var elements = getElements();\n    angular.element(elements.wrapper).toggleClass('md-stretch-tabs', shouldStretchTabs());\n    updateInkBarStyles();\n  }\n\n  function handleCenterTabs (newValue) {\n    ctrl.shouldCenterTabs = shouldCenterTabs();\n  }\n\n  function handleMaxTabWidth (newWidth, oldWidth) {\n    if (newWidth !== oldWidth) {\n      var elements = getElements();\n\n      angular.forEach(elements.tabs, function(tab) {\n        tab.style.maxWidth = newWidth + 'px';\n      });\n      $mdUtil.nextTick(ctrl.updateInkBarStyles);\n    }\n  }\n\n  function handleShouldPaginate (newValue, oldValue) {\n    if (newValue !== oldValue) {\n      ctrl.maxTabWidth      = getMaxTabWidth();\n      ctrl.shouldCenterTabs = shouldCenterTabs();\n      $mdUtil.nextTick(function () {\n        ctrl.maxTabWidth = getMaxTabWidth();\n        adjustOffset(ctrl.selectedIndex);\n      });\n    }\n  }\n\n  /**\n   * Add/remove the `md-no-tab-content` class depending on `ctrl.hasContent`\n   * @param hasContent\n   */\n  function handleHasContent (hasContent) {\n    $element[ hasContent ? 'removeClass' : 'addClass' ]('md-no-tab-content');\n  }\n\n  /**\n   * Apply ctrl.offsetLeft to the paging element when it changes\n   * @param left\n   */\n  function handleOffsetChange (left) {\n    var elements = getElements();\n    var newValue = ctrl.shouldCenterTabs ? '' : '-' + left + 'px';\n\n    angular.element(elements.paging).css($mdConstant.CSS.TRANSFORM, 'translate3d(' + newValue + ', 0, 0)');\n    $scope.$broadcast('$mdTabsPaginationChanged');\n  }\n\n  /**\n   * Update the UI whenever `ctrl.focusIndex` is updated\n   * @param newIndex\n   * @param oldIndex\n   */\n  function handleFocusIndexChange (newIndex, oldIndex) {\n    if (newIndex === oldIndex) return;\n    if (!getElements().tabs[ newIndex ]) return;\n    adjustOffset();\n    redirectFocus();\n  }\n\n  /**\n   * Update the UI whenever the selected index changes. Calls user-defined select/deselect methods.\n   * @param newValue\n   * @param oldValue\n   */\n  function handleSelectedIndexChange (newValue, oldValue) {\n    if (newValue === oldValue) return;\n\n    ctrl.selectedIndex     = getNearestSafeIndex(newValue);\n    ctrl.lastSelectedIndex = oldValue;\n    ctrl.updateInkBarStyles();\n    updateHeightFromContent();\n    adjustOffset(newValue);\n    $scope.$broadcast('$mdTabsChanged');\n    ctrl.tabs[ oldValue ] && ctrl.tabs[ oldValue ].scope.deselect();\n    ctrl.tabs[ newValue ] && ctrl.tabs[ newValue ].scope.select();\n  }\n\n  function getTabElementIndex(tabEl){\n    var tabs = $element[0].getElementsByTagName('md-tab');\n    return Array.prototype.indexOf.call(tabs, tabEl[0]);\n  }\n\n  /**\n   * Queues up a call to `handleWindowResize` when a resize occurs while the tabs component is\n   * hidden.\n   */\n  function handleResizeWhenVisible () {\n    // if there is already a watcher waiting for resize, do nothing\n    if (handleResizeWhenVisible.watcher) return;\n    // otherwise, we will abuse the $watch function to check for visible\n    handleResizeWhenVisible.watcher = $scope.$watch(function () {\n      // since we are checking for DOM size, we use $mdUtil.nextTick() to wait for after the DOM updates\n      $mdUtil.nextTick(function () {\n        // if the watcher has already run (ie. multiple digests in one cycle), do nothing\n        if (!handleResizeWhenVisible.watcher) return;\n\n        if ($element.prop('offsetParent')) {\n          handleResizeWhenVisible.watcher();\n          handleResizeWhenVisible.watcher = null;\n\n          handleWindowResize();\n        }\n      }, false);\n    });\n  }\n\n  // Event handlers / actions\n\n  /**\n   * Handle user keyboard interactions\n   * @param event\n   */\n  function keydown (event) {\n    switch (event.keyCode) {\n      case $mdConstant.KEY_CODE.LEFT_ARROW:\n        event.preventDefault();\n        incrementIndex(-1, true);\n        break;\n      case $mdConstant.KEY_CODE.RIGHT_ARROW:\n        event.preventDefault();\n        incrementIndex(1, true);\n        break;\n      case $mdConstant.KEY_CODE.SPACE:\n      case $mdConstant.KEY_CODE.ENTER:\n        event.preventDefault();\n        if (!locked) select(ctrl.focusIndex);\n        break;\n    }\n  }\n\n  /**\n   * Update the selected index. Triggers a click event on the original `md-tab` element in order\n   * to fire user-added click events if canSkipClick or `md-no-select-click` are false.\n   * @param index\n   * @param canSkipClick Optionally allow not firing the click event if `md-no-select-click` is also true.\n   */\n  function select (index, canSkipClick) {\n    if (!locked) ctrl.focusIndex = ctrl.selectedIndex = index;\n    // skip the click event if noSelectClick is enabled\n    if (canSkipClick && ctrl.noSelectClick) return;\n    // nextTick is required to prevent errors in user-defined click events\n    $mdUtil.nextTick(function () {\n      ctrl.tabs[ index ].element.triggerHandler('click');\n    }, false);\n  }\n\n  /**\n   * When pagination is on, this makes sure the selected index is in view.\n   * @param event\n   */\n  function scroll (event) {\n    if (!ctrl.shouldPaginate) return;\n    event.preventDefault();\n    ctrl.offsetLeft = fixOffset(ctrl.offsetLeft - event.wheelDelta);\n  }\n\n  /**\n   * Slides the tabs over approximately one page forward.\n   */\n  function nextPage () {\n    var elements = getElements();\n    var viewportWidth = elements.canvas.clientWidth,\n        totalWidth    = viewportWidth + ctrl.offsetLeft,\n        i, tab;\n    for (i = 0; i < elements.tabs.length; i++) {\n      tab = elements.tabs[ i ];\n      if (tab.offsetLeft + tab.offsetWidth > totalWidth) break;\n    }\n\n    if (viewportWidth > tab.offsetWidth) {\n      //Canvas width *greater* than tab width: usual positioning\n      ctrl.offsetLeft = fixOffset(tab.offsetLeft);\n    } else {\n      /**\n       * Canvas width *smaller* than tab width: positioning at the *end* of current tab to let\n       * pagination \"for loop\" to proceed correctly on next tab when nextPage() is called again\n       */\n      ctrl.offsetLeft = fixOffset(tab.offsetLeft + (tab.offsetWidth - viewportWidth + 1));\n    }\n  }\n\n  /**\n   * Slides the tabs over approximately one page backward.\n   */\n  function previousPage () {\n    var i, tab, elements = getElements();\n\n    for (i = 0; i < elements.tabs.length; i++) {\n      tab = elements.tabs[ i ];\n      if (tab.offsetLeft + tab.offsetWidth >= ctrl.offsetLeft) break;\n    }\n\n    if (elements.canvas.clientWidth > tab.offsetWidth) {\n      //Canvas width *greater* than tab width: usual positioning\n      ctrl.offsetLeft = fixOffset(tab.offsetLeft + tab.offsetWidth - elements.canvas.clientWidth);\n    } else {\n      /**\n       * Canvas width *smaller* than tab width: positioning at the *beginning* of current tab to let\n       * pagination \"for loop\" to break correctly on previous tab when previousPage() is called again\n       */\n      ctrl.offsetLeft = fixOffset(tab.offsetLeft);\n    }\n  }\n\n  /**\n   * Update size calculations when the window is resized.\n   */\n  function handleWindowResize () {\n    ctrl.lastSelectedIndex = ctrl.selectedIndex;\n    ctrl.offsetLeft        = fixOffset(ctrl.offsetLeft);\n    $mdUtil.nextTick(function () {\n      ctrl.updateInkBarStyles();\n      updatePagination();\n    });\n  }\n\n  function handleInkBar (hide) {\n    angular.element(getElements().inkBar).toggleClass('ng-hide', hide);\n  }\n\n  /**\n   * Toggle dynamic height class when value changes\n   * @param value\n   */\n  function handleDynamicHeight (value) {\n    $element.toggleClass('md-dynamic-height', value);\n  }\n\n  /**\n   * Remove a tab from the data and select the nearest valid tab.\n   * @param tabData\n   */\n  function removeTab (tabData) {\n    if (destroyed) return;\n    var selectedIndex = ctrl.selectedIndex,\n        tab           = ctrl.tabs.splice(tabData.getIndex(), 1)[ 0 ];\n    refreshIndex();\n    // when removing a tab, if the selected index did not change, we have to manually trigger the\n    //   tab select/deselect events\n    if (ctrl.selectedIndex === selectedIndex) {\n      tab.scope.deselect();\n      ctrl.tabs[ ctrl.selectedIndex ] && ctrl.tabs[ ctrl.selectedIndex ].scope.select();\n    }\n    $mdUtil.nextTick(function () {\n      updatePagination();\n      ctrl.offsetLeft = fixOffset(ctrl.offsetLeft);\n    });\n  }\n\n  /**\n   * Create an entry in the tabs array for a new tab at the specified index.\n   * @param tabData\n   * @param index\n   * @returns {*}\n   */\n  function insertTab (tabData, index) {\n    var hasLoaded = loaded;\n    var proto     = {\n          getIndex:     function () { return ctrl.tabs.indexOf(tab); },\n          isActive:     function () { return this.getIndex() === ctrl.selectedIndex; },\n          isLeft:       function () { return this.getIndex() < ctrl.selectedIndex; },\n          isRight:      function () { return this.getIndex() > ctrl.selectedIndex; },\n          shouldRender: function () { return !ctrl.noDisconnect || this.isActive(); },\n          hasFocus:     function () {\n            return ctrl.styleTabItemFocus\n                && ctrl.hasFocus && this.getIndex() === ctrl.focusIndex;\n          },\n          id:           $mdUtil.nextUid(),\n          hasContent: !!(tabData.template && tabData.template.trim())\n        },\n        tab       = angular.extend(proto, tabData);\n    if (angular.isDefined(index)) {\n      ctrl.tabs.splice(index, 0, tab);\n    } else {\n      ctrl.tabs.push(tab);\n    }\n\n    processQueue();\n    updateHasContent();\n    $mdUtil.nextTick(function () {\n      updatePagination();\n      setAriaControls(tab);\n\n      // if autoselect is enabled, select the newly added tab\n      if (hasLoaded && ctrl.autoselect) $mdUtil.nextTick(function () {\n        $mdUtil.nextTick(function () { select(ctrl.tabs.indexOf(tab)); });\n      });\n    });\n    return tab;\n  }\n\n  // Getter methods\n\n  /**\n   * Gathers references to all of the DOM elements used by this controller.\n   * @returns {{}}\n   */\n  function getElements () {\n    var elements = {};\n    var node = $element[0];\n\n    // gather tab bar elements\n    elements.wrapper = node.querySelector('md-tabs-wrapper');\n    elements.canvas  = elements.wrapper.querySelector('md-tabs-canvas');\n    elements.paging  = elements.canvas.querySelector('md-pagination-wrapper');\n    elements.inkBar  = elements.paging.querySelector('md-ink-bar');\n\n    elements.contents = node.querySelectorAll('md-tabs-content-wrapper > md-tab-content');\n    elements.tabs    = elements.paging.querySelectorAll('md-tab-item');\n    elements.dummies = elements.canvas.querySelectorAll('md-dummy-tab');\n\n    return elements;\n  }\n\n  /**\n   * Determines whether or not the left pagination arrow should be enabled.\n   * @returns {boolean}\n   */\n  function canPageBack () {\n    return ctrl.offsetLeft > 0;\n  }\n\n  /**\n   * Determines whether or not the right pagination arrow should be enabled.\n   * @returns {*|boolean}\n   */\n  function canPageForward () {\n    var elements = getElements();\n    var lastTab = elements.tabs[ elements.tabs.length - 1 ];\n    return lastTab && lastTab.offsetLeft + lastTab.offsetWidth > elements.canvas.clientWidth +\n        ctrl.offsetLeft;\n  }\n\n  /**\n   * Returns currently focused tab item's element ID\n   */\n  function getFocusedTabId() {\n    var focusedTab = ctrl.tabs[ctrl.focusIndex];\n    if (!focusedTab || !focusedTab.id) {\n      return null;\n    }\n    return 'tab-item-' + focusedTab.id;\n  }\n\n  /**\n   * Determines if the UI should stretch the tabs to fill the available space.\n   * @returns {*}\n   */\n  function shouldStretchTabs () {\n    switch (ctrl.stretchTabs) {\n      case 'always':\n        return true;\n      case 'never':\n        return false;\n      default:\n        return !ctrl.shouldPaginate\n            && $window.matchMedia('(max-width: 600px)').matches;\n    }\n  }\n\n  /**\n   * Determines if the tabs should appear centered.\n   * @returns {string|boolean}\n   */\n  function shouldCenterTabs () {\n    return ctrl.centerTabs && !ctrl.shouldPaginate;\n  }\n\n  /**\n   * Determines if pagination is necessary to display the tabs within the available space.\n   * @returns {boolean}\n   */\n  function shouldPaginate () {\n    if (ctrl.noPagination || !loaded) return false;\n    var canvasWidth = $element.prop('clientWidth');\n\n    angular.forEach(getElements().dummies, function (tab) {\n      canvasWidth -= tab.offsetWidth;\n    });\n\n    return canvasWidth < 0;\n  }\n\n  /**\n   * Finds the nearest tab index that is available.  This is primarily used for when the active\n   * tab is removed.\n   * @param newIndex\n   * @returns {*}\n   */\n  function getNearestSafeIndex (newIndex) {\n    if (newIndex === -1) return -1;\n    var maxOffset = Math.max(ctrl.tabs.length - newIndex, newIndex),\n        i, tab;\n    for (i = 0; i <= maxOffset; i++) {\n      tab = ctrl.tabs[ newIndex + i ];\n      if (tab && (tab.scope.disabled !== true)) return tab.getIndex();\n      tab = ctrl.tabs[ newIndex - i ];\n      if (tab && (tab.scope.disabled !== true)) return tab.getIndex();\n    }\n    return newIndex;\n  }\n\n  // Utility methods\n\n  /**\n   * Defines a property using a getter and setter in order to trigger a change handler without\n   * using `$watch` to observe changes.\n   * @param key\n   * @param handler\n   * @param value\n   */\n  function defineProperty (key, handler, value) {\n    Object.defineProperty(ctrl, key, {\n      get: function () { return value; },\n      set: function (newValue) {\n        var oldValue = value;\n        value        = newValue;\n        handler && handler(newValue, oldValue);\n      }\n    });\n  }\n\n  /**\n   * Updates whether or not pagination should be displayed.\n   */\n  function updatePagination () {\n    ctrl.maxTabWidth = getMaxTabWidth();\n    ctrl.shouldPaginate = shouldPaginate();\n  }\n\n  /**\n   * Calculates the width of the pagination wrapper by summing the widths of the dummy tabs.\n   * @returns {number}\n   */\n  function calcPagingWidth () {\n    return calcTabsWidth(getElements().dummies);\n  }\n\n  function calcTabsWidth(tabs) {\n    var width = 0;\n\n    angular.forEach(tabs, function (tab) {\n      //-- Uses the larger value between `getBoundingClientRect().width` and `offsetWidth`.  This\n      //   prevents `offsetWidth` value from being rounded down and causing wrapping issues, but\n      //   also handles scenarios where `getBoundingClientRect()` is inaccurate (ie. tabs inside\n      //   of a dialog)\n      width += Math.max(tab.offsetWidth, tab.getBoundingClientRect().width);\n    });\n\n    return Math.ceil(width);\n  }\n\n  function getMaxTabWidth () {\n    return $element.prop('clientWidth');\n  }\n\n  /**\n   * Re-orders the tabs and updates the selected and focus indexes to their new positions.\n   * This is triggered by `tabDirective.js` when the user's tabs have been re-ordered.\n   */\n  function updateTabOrder () {\n    var selectedItem   = ctrl.tabs[ ctrl.selectedIndex ],\n        focusItem      = ctrl.tabs[ ctrl.focusIndex ];\n    ctrl.tabs          = ctrl.tabs.sort(function (a, b) {\n      return a.index - b.index;\n    });\n    ctrl.selectedIndex = ctrl.tabs.indexOf(selectedItem);\n    ctrl.focusIndex    = ctrl.tabs.indexOf(focusItem);\n  }\n\n  /**\n   * This moves the selected or focus index left or right.  This is used by the keydown handler.\n   * @param inc\n   */\n  function incrementIndex (inc, focus) {\n    var newIndex,\n        key   = focus ? 'focusIndex' : 'selectedIndex',\n        index = ctrl[ key ];\n    for (newIndex = index + inc;\n         ctrl.tabs[ newIndex ] && ctrl.tabs[ newIndex ].scope.disabled;\n         newIndex += inc) {}\n    if (ctrl.tabs[ newIndex ]) {\n      ctrl[ key ] = newIndex;\n    }\n  }\n\n  /**\n   * This is used to forward focus to dummy elements.  This method is necessary to avoid animation\n   * issues when attempting to focus an item that is out of view.\n   */\n  function redirectFocus () {\n    ctrl.styleTabItemFocus = ($mdInteraction.getLastInteractionType() === 'keyboard');\n    getElements().dummies[ ctrl.focusIndex ].focus();\n  }\n\n  /**\n   * Forces the pagination to move the focused tab into view.\n   */\n  function adjustOffset (index) {\n    var elements = getElements();\n\n    if (!angular.isNumber(index)) index = ctrl.focusIndex;\n    if (!elements.tabs[ index ]) return;\n    if (ctrl.shouldCenterTabs) return;\n    var tab         = elements.tabs[ index ],\n        left        = tab.offsetLeft,\n        right       = tab.offsetWidth + left;\n    ctrl.offsetLeft = Math.max(ctrl.offsetLeft, fixOffset(right - elements.canvas.clientWidth + 32 * 2));\n    ctrl.offsetLeft = Math.min(ctrl.offsetLeft, fixOffset(left));\n  }\n\n  /**\n   * Iterates through all queued functions and clears the queue.  This is used for functions that\n   * are called before the UI is ready, such as size calculations.\n   */\n  function processQueue () {\n    queue.forEach(function (func) { $mdUtil.nextTick(func); });\n    queue = [];\n  }\n\n  /**\n   * Determines if the tab content area is needed.\n   */\n  function updateHasContent () {\n    var hasContent  = false;\n\n    for (var i = 0; i < ctrl.tabs.length; i++) {\n      if (ctrl.tabs[i].hasContent) {\n        hasContent = true;\n        break;\n      }\n    }\n\n    ctrl.hasContent = hasContent;\n  }\n\n  /**\n   * Moves the indexes to their nearest valid values.\n   */\n  function refreshIndex () {\n    ctrl.selectedIndex = getNearestSafeIndex(ctrl.selectedIndex);\n    ctrl.focusIndex    = getNearestSafeIndex(ctrl.focusIndex);\n  }\n\n  /**\n   * Calculates the content height of the current tab.\n   * @returns {*}\n   */\n  function updateHeightFromContent () {\n    if (!ctrl.dynamicHeight) return $element.css('height', '');\n    if (!ctrl.tabs.length) return queue.push(updateHeightFromContent);\n\n    var elements = getElements();\n\n    var tabContent    = elements.contents[ ctrl.selectedIndex ],\n        contentHeight = tabContent ? tabContent.offsetHeight : 0,\n        tabsHeight    = elements.wrapper.offsetHeight,\n        newHeight     = contentHeight + tabsHeight,\n        currentHeight = $element.prop('clientHeight');\n\n    if (currentHeight === newHeight) return;\n\n    // Adjusts calculations for when the buttons are bottom-aligned since this relies on absolute\n    // positioning.  This should probably be cleaned up if a cleaner solution is possible.\n    if ($element.attr('md-align-tabs') === 'bottom') {\n      currentHeight -= tabsHeight;\n      newHeight -= tabsHeight;\n      // Need to include bottom border in these calculations\n      if ($element.attr('md-border-bottom') !== undefined) ++currentHeight;\n    }\n\n    // Lock during animation so the user can't change tabs\n    locked = true;\n\n    var fromHeight = { height: currentHeight + 'px' },\n        toHeight = { height: newHeight + 'px' };\n\n    // Set the height to the current, specific pixel height to fix a bug on iOS where the height\n    // first animates to 0, then back to the proper height causing a visual glitch\n    $element.css(fromHeight);\n\n    // Animate the height from the old to the new\n    $animateCss($element, {\n      from: fromHeight,\n      to: toHeight,\n      easing: 'cubic-bezier(0.35, 0, 0.25, 1)',\n      duration: 0.5\n    }).start().done(function () {\n      // Then (to fix the same iOS issue as above), disable transitions and remove the specific\n      // pixel height so the height can size with browser width/content changes, etc.\n      $element.css({\n        transition: 'none',\n        height: ''\n      });\n\n      // In the next tick, re-allow transitions (if we do it all at once, $element.css is \"smart\"\n      // enough to batch it for us instead of doing it immediately, which undoes the original\n      // transition: none)\n      $mdUtil.nextTick(function() {\n        $element.css('transition', '');\n      });\n\n      // And unlock so tab changes can occur\n      locked = false;\n    });\n  }\n\n  /**\n   * Repositions the ink bar to the selected tab.\n   * @returns {*}\n   */\n  function updateInkBarStyles () {\n    var elements = getElements();\n\n    if (!elements.tabs[ ctrl.selectedIndex ]) {\n      angular.element(elements.inkBar).css({ left: 'auto', right: 'auto' });\n      return;\n    }\n\n    if (!ctrl.tabs.length) return queue.push(ctrl.updateInkBarStyles);\n    // if the element is not visible, we will not be able to calculate sizes until it is\n    // we should treat that as a resize event rather than just updating the ink bar\n    if (!$element.prop('offsetParent')) return handleResizeWhenVisible();\n\n    var index      = ctrl.selectedIndex,\n        totalWidth = elements.paging.offsetWidth,\n        tab        = elements.tabs[ index ],\n        left       = tab.offsetLeft,\n        right      = totalWidth - left - tab.offsetWidth;\n\n    if (ctrl.shouldCenterTabs) {\n      // We need to use the same calculate process as in the pagination wrapper, to avoid rounding deviations.\n      var tabWidth = calcTabsWidth(elements.tabs);\n\n      if (totalWidth > tabWidth) {\n        $mdUtil.nextTick(updateInkBarStyles, false);\n      }\n    }\n    updateInkBarClassName();\n    angular.element(elements.inkBar).css({ left: left + 'px', right: right + 'px' });\n  }\n\n  /**\n   * Adds left/right classes so that the ink bar will animate properly.\n   */\n  function updateInkBarClassName () {\n    var elements = getElements();\n    var newIndex = ctrl.selectedIndex,\n        oldIndex = ctrl.lastSelectedIndex,\n        ink      = angular.element(elements.inkBar);\n    if (!angular.isNumber(oldIndex)) return;\n    ink\n        .toggleClass('md-left', newIndex < oldIndex)\n        .toggleClass('md-right', newIndex > oldIndex);\n  }\n\n  /**\n   * Takes an offset value and makes sure that it is within the min/max allowed values.\n   * @param value\n   * @returns {*}\n   */\n  function fixOffset (value) {\n    var elements = getElements();\n\n    if (!elements.tabs.length || !ctrl.shouldPaginate) return 0;\n    var lastTab    = elements.tabs[ elements.tabs.length - 1 ],\n        totalWidth = lastTab.offsetLeft + lastTab.offsetWidth;\n    value          = Math.max(0, value);\n    value          = Math.min(totalWidth - elements.canvas.clientWidth, value);\n    return value;\n  }\n\n  /**\n   * Attaches a ripple to the tab item element.\n   * @param scope\n   * @param element\n   */\n  function attachRipple (scope, element) {\n    var elements = getElements();\n    var options = { colorElement: angular.element(elements.inkBar) };\n    $mdTabInkRipple.attach(scope, element, options);\n  }\n\n  /**\n   * Sets the `aria-controls` attribute to the elements that\n   * correspond to the passed-in tab.\n   * @param tab\n   */\n  function setAriaControls (tab) {\n    if (tab.hasContent) {\n      var nodes = $element[0].querySelectorAll('[md-tab-id=\"' + tab.id + '\"]');\n      angular.element(nodes).attr('aria-controls', ctrl.tabContentPrefix + tab.id);\n    }\n  }\n}\n\n})();\n(function(){\n\"use strict\";\n\n/**\n * @ngdoc directive\n * @name mdTabs\n * @module material.components.tabs\n *\n * @restrict E\n *\n * @description\n * The `<md-tabs>` directive serves as the container for 1..n `<md-tab>` child directives to\n * produces a Tabs components. In turn, the nested `<md-tab>` directive is used to specify a tab\n * label for the **header button** and a [optional] tab view content that will be associated with\n * each tab button.\n *\n * Below is the markup for its simplest usage:\n *\n *  <hljs lang=\"html\">\n *  <md-tabs>\n *    <md-tab label=\"Tab #1\"></md-tab>\n *    <md-tab label=\"Tab #2\"></md-tab>\n *    <md-tab label=\"Tab #3\"></md-tab>\n *  </md-tabs>\n *  </hljs>\n *\n * Tabs supports three (3) usage scenarios:\n *\n *  1. Tabs (buttons only)\n *  2. Tabs with internal view content\n *  3. Tabs with external view content\n *\n * **Tab-only** support is useful when tab buttons are used for custom navigation regardless of any\n * other components, content, or views.\n *\n * <i><b>Note:</b> If you are using the Tabs component for page-level navigation, please take a look\n * at the <a ng-href=\"./api/directive/mdNavBar\">NavBar component</a> instead as it can handle this\n * case a bit more natively.</i>\n *\n * **Tabs with internal views** are the traditional usages where each tab has associated view\n * content and the view switching is managed internally by the Tabs component.\n *\n * **Tabs with external view content** is often useful when content associated with each tab is\n * independently managed and data-binding notifications announce tab selection changes.\n *\n * Additional features also include:\n *\n * *  Content can include any markup.\n * *  If a tab is disabled while active/selected, then the next tab will be auto-selected.\n *\n * ### Explanation of tab stretching\n *\n * Initially, tabs will have an inherent size.  This size will either be defined by how much space is needed to accommodate their text or set by the user through CSS.  Calculations will be based on this size.\n *\n * On mobile devices, tabs will be expanded to fill the available horizontal space.  When this happens, all tabs will become the same size.\n *\n * On desktops, by default, stretching will never occur.\n *\n * This default behavior can be overridden through the `md-stretch-tabs` attribute.  Here is a table showing when stretching will occur:\n *\n * `md-stretch-tabs` | mobile    | desktop\n * ------------------|-----------|--------\n * `auto`            | stretched | ---\n * `always`          | stretched | stretched\n * `never`           | ---       | ---\n *\n * @param {integer=} md-selected Index of the active/selected tab\n * @param {boolean=} md-no-ink If present, disables ink ripple effects.\n * @param {boolean=} md-no-ink-bar If present, disables the selection ink bar.\n * @param {string=}  md-align-tabs Attribute to indicate position of tab buttons: `bottom` or `top`; default is `top`\n * @param {string=} md-stretch-tabs Attribute to indicate whether or not to stretch tabs: `auto`, `always`, or `never`; default is `auto`\n * @param {boolean=} md-dynamic-height When enabled, the tab wrapper will resize based on the contents of the selected tab\n * @param {boolean=} md-border-bottom If present, shows a solid `1px` border between the tabs and their content\n * @param {boolean=} md-center-tabs When enabled, tabs will be centered provided there is no need for pagination\n * @param {boolean=} md-no-pagination When enabled, pagination will remain off\n * @param {boolean=} md-swipe-content When enabled, swipe gestures will be enabled for the content area to jump between tabs\n * @param {boolean=} md-enable-disconnect When enabled, scopes will be disconnected for tabs that are not being displayed.  This provides a performance boost, but may also cause unexpected issues and is not recommended for most users.\n * @param {boolean=} md-autoselect When present, any tabs added after the initial load will be automatically selected\n * @param {boolean=} md-no-select-click When enabled, click events will not be fired when selecting tabs\n *\n * @usage\n * <hljs lang=\"html\">\n * <md-tabs md-selected=\"selectedIndex\" >\n *   <img ng-src=\"img/angular.png\" class=\"centered\">\n *   <md-tab\n *       ng-repeat=\"tab in tabs | orderBy:predicate:reversed\"\n *       md-on-select=\"onTabSelected(tab)\"\n *       md-on-deselect=\"announceDeselected(tab)\"\n *       ng-disabled=\"tab.disabled\">\n *     <md-tab-label>\n *       {{tab.title}}\n *       <img src=\"img/removeTab.png\" ng-click=\"removeTab(tab)\" class=\"delete\">\n *     </md-tab-label>\n *     <md-tab-body>\n *       {{tab.content}}\n *     </md-tab-body>\n *   </md-tab>\n * </md-tabs>\n * </hljs>\n *\n */\nMdTabs.$inject = [\"$$mdSvgRegistry\"];\nangular\n    .module('material.components.tabs')\n    .directive('mdTabs', MdTabs);\n\nfunction MdTabs ($$mdSvgRegistry) {\n  return {\n    scope:            {\n      selectedIndex: '=?mdSelected'\n    },\n    template:         function (element, attr) {\n      attr.$mdTabsTemplate = element.html();\n      return '' +\n        '<md-tabs-wrapper> ' +\n          '<md-tab-data></md-tab-data> ' +\n          '<md-prev-button ' +\n              'tabindex=\"-1\" ' +\n              'role=\"button\" ' +\n              'aria-label=\"Previous Page\" ' +\n              'aria-disabled=\"{{!$mdTabsCtrl.canPageBack()}}\" ' +\n              'ng-class=\"{ \\'md-disabled\\': !$mdTabsCtrl.canPageBack() }\" ' +\n              'ng-if=\"$mdTabsCtrl.shouldPaginate\" ' +\n              'ng-click=\"$mdTabsCtrl.previousPage()\"> ' +\n            '<md-icon md-svg-src=\"'+ $$mdSvgRegistry.mdTabsArrow +'\"></md-icon> ' +\n          '</md-prev-button> ' +\n          '<md-next-button ' +\n              'tabindex=\"-1\" ' +\n              'role=\"button\" ' +\n              'aria-label=\"Next Page\" ' +\n              'aria-disabled=\"{{!$mdTabsCtrl.canPageForward()}}\" ' +\n              'ng-class=\"{ \\'md-disabled\\': !$mdTabsCtrl.canPageForward() }\" ' +\n              'ng-if=\"$mdTabsCtrl.shouldPaginate\" ' +\n              'ng-click=\"$mdTabsCtrl.nextPage()\"> ' +\n            '<md-icon md-svg-src=\"'+ $$mdSvgRegistry.mdTabsArrow +'\"></md-icon> ' +\n          '</md-next-button> ' +\n          '<md-tabs-canvas ' +\n              'tabindex=\"{{ $mdTabsCtrl.hasFocus ? -1 : 0 }}\" ' +\n              'aria-activedescendant=\"{{$mdTabsCtrl.getFocusedTabId()}}\" ' +\n              'ng-focus=\"$mdTabsCtrl.redirectFocus()\" ' +\n              'ng-class=\"{ ' +\n                  '\\'md-paginated\\': $mdTabsCtrl.shouldPaginate, ' +\n                  '\\'md-center-tabs\\': $mdTabsCtrl.shouldCenterTabs ' +\n              '}\" ' +\n              'ng-keydown=\"$mdTabsCtrl.keydown($event)\" ' +\n              'role=\"tablist\"> ' +\n            '<md-pagination-wrapper ' +\n                'ng-class=\"{ \\'md-center-tabs\\': $mdTabsCtrl.shouldCenterTabs }\" ' +\n                'md-tab-scroll=\"$mdTabsCtrl.scroll($event)\"> ' +\n              '<md-tab-item ' +\n                  'tabindex=\"-1\" ' +\n                  'class=\"md-tab\" ' +\n                  'ng-repeat=\"tab in $mdTabsCtrl.tabs\" ' +\n                  'role=\"tab\" ' +\n                  'md-tab-id=\"{{::tab.id}}\"' +\n                  'aria-selected=\"{{tab.isActive()}}\" ' +\n                  'aria-disabled=\"{{tab.scope.disabled || \\'false\\'}}\" ' +\n                  'ng-click=\"$mdTabsCtrl.select(tab.getIndex())\" ' +\n                  'ng-class=\"{ ' +\n                      '\\'md-active\\':    tab.isActive(), ' +\n                      '\\'md-focused\\':   tab.hasFocus(), ' +\n                      '\\'md-disabled\\':  tab.scope.disabled ' +\n                  '}\" ' +\n                  'ng-disabled=\"tab.scope.disabled\" ' +\n                  'md-swipe-left=\"$mdTabsCtrl.nextPage()\" md-swipe-touch-action=\"pan-y\" ' +\n                  'md-swipe-right=\"$mdTabsCtrl.previousPage()\" ' +\n                  'md-tabs-template=\"::tab.label\" ' +\n                  'md-scope=\"::tab.parent\"></md-tab-item> ' +\n              '<md-ink-bar></md-ink-bar> ' +\n            '</md-pagination-wrapper> ' +\n            '<md-tabs-dummy-wrapper class=\"md-visually-hidden md-dummy-wrapper\"> ' +\n              '<md-dummy-tab ' +\n                  'class=\"md-tab\" ' +\n                  'tabindex=\"-1\" ' +\n                  'id=\"tab-item-{{::tab.id}}\" ' +\n                  'md-tab-id=\"{{::tab.id}}\"' +\n                  'aria-selected=\"{{tab.isActive()}}\" ' +\n                  'aria-disabled=\"{{tab.scope.disabled || \\'false\\'}}\" ' +\n                  'ng-focus=\"$mdTabsCtrl.hasFocus = true\" ' +\n                  'ng-blur=\"$mdTabsCtrl.hasFocus = false\" ' +\n                  'ng-repeat=\"tab in $mdTabsCtrl.tabs\" ' +\n                  'md-tabs-template=\"::tab.label\" ' +\n                  'md-scope=\"::tab.parent\"></md-dummy-tab> ' +\n            '</md-tabs-dummy-wrapper> ' +\n          '</md-tabs-canvas> ' +\n        '</md-tabs-wrapper> ' +\n        '<md-tabs-content-wrapper ng-show=\"$mdTabsCtrl.hasContent && $mdTabsCtrl.selectedIndex >= 0\" class=\"_md\"> ' +\n          '<md-tab-content ' +\n              'id=\"{{:: $mdTabsCtrl.tabContentPrefix + tab.id}}\" ' +\n              'class=\"_md\" ' +\n              'role=\"tabpanel\" ' +\n              'aria-labelledby=\"tab-item-{{::tab.id}}\" ' +\n              'md-swipe-left=\"$mdTabsCtrl.swipeContent && $mdTabsCtrl.incrementIndex(1)\" ' +\n              'md-swipe-right=\"$mdTabsCtrl.swipeContent && $mdTabsCtrl.incrementIndex(-1)\" ' +\n              'md-swipe-touch-action=\"pan-y\" ' +\n              'ng-if=\"tab.hasContent\" ' +\n              'ng-repeat=\"(index, tab) in $mdTabsCtrl.tabs\" ' +\n              'ng-class=\"{ ' +\n                '\\'md-no-transition\\': $mdTabsCtrl.lastSelectedIndex == null, ' +\n                '\\'md-active\\':        tab.isActive(), ' +\n                '\\'md-left\\':          tab.isLeft(), ' +\n                '\\'md-right\\':         tab.isRight(), ' +\n                '\\'md-no-scroll\\':     $mdTabsCtrl.dynamicHeight ' +\n              '}\"> ' +\n            '<div ' +\n                'md-tabs-template=\"::tab.template\" ' +\n                'md-connected-if=\"tab.isActive()\" ' +\n                'md-scope=\"::tab.parent\" ' +\n                'ng-if=\"$mdTabsCtrl.enableDisconnect || tab.shouldRender()\"></div> ' +\n          '</md-tab-content> ' +\n        '</md-tabs-content-wrapper>';\n    },\n    controller:       'MdTabsController',\n    controllerAs:     '$mdTabsCtrl',\n    bindToController: true\n  };\n}\n\n})();\n(function(){\n\"use strict\";\n\n\nMdTabsDummyWrapper.$inject = [\"$mdUtil\", \"$window\"];angular\n  .module('material.components.tabs')\n  .directive('mdTabsDummyWrapper', MdTabsDummyWrapper);\n\n/**\n * @private\n *\n * @param $mdUtil\n * @param $window\n * @returns {{require: string, link: link}}\n * @constructor\n *\n * @ngInject\n */\nfunction MdTabsDummyWrapper ($mdUtil, $window) {\n  return {\n    require: '^?mdTabs',\n    link:    function link (scope, element, attr, ctrl) {\n      if (!ctrl) return;\n\n      var observer;\n      var disconnect;\n\n      var mutationCallback = function() {\n        ctrl.updatePagination();\n        ctrl.updateInkBarStyles();\n      };\n\n      if('MutationObserver' in $window) {\n        var config = {\n          childList: true,\n          subtree: true,\n          // Per https://bugzilla.mozilla.org/show_bug.cgi?id=1138368, browsers will not fire\n          // the childList mutation, once a <span> element's innerText changes.\n          // The characterData of the <span> element will change.\n          characterData: true\n        };\n\n        observer = new MutationObserver(mutationCallback);\n        observer.observe(element[0], config);\n        disconnect = observer.disconnect.bind(observer);\n      } else {\n        var debounced = $mdUtil.debounce(mutationCallback, 15, null, false);\n        \n        element.on('DOMSubtreeModified', debounced);\n        disconnect = element.off.bind(element, 'DOMSubtreeModified', debounced);\n      }\n\n      // Disconnect the observer\n      scope.$on('$destroy', function() {\n        disconnect();\n      });\n    }\n  };\n}\n\n})();\n(function(){\n\"use strict\";\n\n\nMdTabsTemplate.$inject = [\"$compile\", \"$mdUtil\"];angular\n    .module('material.components.tabs')\n    .directive('mdTabsTemplate', MdTabsTemplate);\n\nfunction MdTabsTemplate ($compile, $mdUtil) {\n  return {\n    restrict: 'A',\n    link:     link,\n    scope:    {\n      template:     '=mdTabsTemplate',\n      connected:    '=?mdConnectedIf',\n      compileScope: '=mdScope'\n    },\n    require:  '^?mdTabs'\n  };\n  function link (scope, element, attr, ctrl) {\n    if (!ctrl) return;\n\n    var compileScope = ctrl.enableDisconnect ? scope.compileScope.$new() : scope.compileScope;\n\n    element.html(scope.template);\n    $compile(element.contents())(compileScope);\n\n    return $mdUtil.nextTick(handleScope);\n\n    function handleScope () {\n      scope.$watch('connected', function (value) { value === false ? disconnect() : reconnect(); });\n      scope.$on('$destroy', reconnect);\n    }\n\n    function disconnect () {\n      if (ctrl.enableDisconnect) $mdUtil.disconnectScope(compileScope);\n    }\n\n    function reconnect () {\n      if (ctrl.enableDisconnect) $mdUtil.reconnectScope(compileScope);\n    }\n  }\n}\n\n})();\n(function(){ \nangular.module(\"material.core\").constant(\"$MD_THEME_CSS\", \"md-autocomplete.md-THEME_NAME-theme{background:\\\"{{background-A100}}\\\"}md-autocomplete.md-THEME_NAME-theme[disabled]:not([md-floating-label]){background:\\\"{{background-100}}\\\"}md-autocomplete.md-THEME_NAME-theme button md-icon path{fill:\\\"{{background-600}}\\\"}md-autocomplete.md-THEME_NAME-theme button:after{background:\\\"{{background-600-0.3}}\\\"}.md-autocomplete-suggestions-container.md-THEME_NAME-theme{background:\\\"{{background-A100}}\\\"}.md-autocomplete-suggestions-container.md-THEME_NAME-theme li{color:\\\"{{background-900}}\\\"}.md-autocomplete-suggestions-container.md-THEME_NAME-theme li .highlight{color:\\\"{{background-600}}\\\"}.md-autocomplete-suggestions-container.md-THEME_NAME-theme li.selected,.md-autocomplete-suggestions-container.md-THEME_NAME-theme li:hover{background:\\\"{{background-200}}\\\"}md-backdrop{background-color:\\\"{{background-900-0.0}}\\\"}md-backdrop.md-opaque.md-THEME_NAME-theme{background-color:\\\"{{background-900-1.0}}\\\"}md-bottom-sheet.md-THEME_NAME-theme{background-color:\\\"{{background-50}}\\\";border-top-color:\\\"{{background-300}}\\\"}md-bottom-sheet.md-THEME_NAME-theme.md-list md-list-item{color:\\\"{{foreground-1}}\\\"}md-bottom-sheet.md-THEME_NAME-theme .md-subheader{background-color:\\\"{{background-50}}\\\";color:\\\"{{foreground-1}}\\\"}.md-button.md-THEME_NAME-theme:not([disabled]).md-focused,.md-button.md-THEME_NAME-theme:not([disabled]):hover{background-color:\\\"{{background-500-0.2}}\\\"}.md-button.md-THEME_NAME-theme:not([disabled]).md-icon-button:hover{background-color:transparent}.md-button.md-THEME_NAME-theme.md-fab md-icon{color:\\\"{{accent-contrast}}\\\"}.md-button.md-THEME_NAME-theme.md-primary{color:\\\"{{primary-color}}\\\"}.md-button.md-THEME_NAME-theme.md-primary.md-fab,.md-button.md-THEME_NAME-theme.md-primary.md-raised{color:\\\"{{primary-contrast}}\\\";background-color:\\\"{{primary-color}}\\\"}.md-button.md-THEME_NAME-theme.md-primary.md-fab:not([disabled]) md-icon,.md-button.md-THEME_NAME-theme.md-primary.md-raised:not([disabled]) md-icon{color:\\\"{{primary-contrast}}\\\"}.md-button.md-THEME_NAME-theme.md-primary.md-fab:not([disabled]).md-focused,.md-button.md-THEME_NAME-theme.md-primary.md-fab:not([disabled]):hover,.md-button.md-THEME_NAME-theme.md-primary.md-raised:not([disabled]).md-focused,.md-button.md-THEME_NAME-theme.md-primary.md-raised:not([disabled]):hover{background-color:\\\"{{primary-600}}\\\"}.md-button.md-THEME_NAME-theme.md-primary:not([disabled]) md-icon{color:\\\"{{primary-color}}\\\"}.md-button.md-THEME_NAME-theme.md-fab{background-color:\\\"{{accent-color}}\\\";color:\\\"{{accent-contrast}}\\\"}.md-button.md-THEME_NAME-theme.md-fab:not([disabled]) .md-icon{color:\\\"{{accent-contrast}}\\\"}.md-button.md-THEME_NAME-theme.md-fab:not([disabled]).md-focused,.md-button.md-THEME_NAME-theme.md-fab:not([disabled]):hover{background-color:\\\"{{accent-A700}}\\\"}.md-button.md-THEME_NAME-theme.md-raised{color:\\\"{{background-900}}\\\";background-color:\\\"{{background-50}}\\\"}.md-button.md-THEME_NAME-theme.md-raised:not([disabled]) md-icon{color:\\\"{{background-900}}\\\"}.md-button.md-THEME_NAME-theme.md-raised:not([disabled]):hover{background-color:\\\"{{background-50}}\\\"}.md-button.md-THEME_NAME-theme.md-raised:not([disabled]).md-focused{background-color:\\\"{{background-200}}\\\"}.md-button.md-THEME_NAME-theme.md-warn{color:\\\"{{warn-color}}\\\"}.md-button.md-THEME_NAME-theme.md-warn.md-fab,.md-button.md-THEME_NAME-theme.md-warn.md-raised{color:\\\"{{warn-contrast}}\\\";background-color:\\\"{{warn-color}}\\\"}.md-button.md-THEME_NAME-theme.md-warn.md-fab:not([disabled]) md-icon,.md-button.md-THEME_NAME-theme.md-warn.md-raised:not([disabled]) md-icon{color:\\\"{{warn-contrast}}\\\"}.md-button.md-THEME_NAME-theme.md-warn.md-fab:not([disabled]).md-focused,.md-button.md-THEME_NAME-theme.md-warn.md-fab:not([disabled]):hover,.md-button.md-THEME_NAME-theme.md-warn.md-raised:not([disabled]).md-focused,.md-button.md-THEME_NAME-theme.md-warn.md-raised:not([disabled]):hover{background-color:\\\"{{warn-600}}\\\"}.md-button.md-THEME_NAME-theme.md-warn:not([disabled]) md-icon{color:\\\"{{warn-color}}\\\"}.md-button.md-THEME_NAME-theme.md-accent{color:\\\"{{accent-color}}\\\"}.md-button.md-THEME_NAME-theme.md-accent.md-fab,.md-button.md-THEME_NAME-theme.md-accent.md-raised{color:\\\"{{accent-contrast}}\\\";background-color:\\\"{{accent-color}}\\\"}.md-button.md-THEME_NAME-theme.md-accent.md-fab:not([disabled]) md-icon,.md-button.md-THEME_NAME-theme.md-accent.md-raised:not([disabled]) md-icon{color:\\\"{{accent-contrast}}\\\"}.md-button.md-THEME_NAME-theme.md-accent.md-fab:not([disabled]).md-focused,.md-button.md-THEME_NAME-theme.md-accent.md-fab:not([disabled]):hover,.md-button.md-THEME_NAME-theme.md-accent.md-raised:not([disabled]).md-focused,.md-button.md-THEME_NAME-theme.md-accent.md-raised:not([disabled]):hover{background-color:\\\"{{accent-A700}}\\\"}.md-button.md-THEME_NAME-theme.md-accent:not([disabled]) md-icon{color:\\\"{{accent-color}}\\\"}.md-button.md-THEME_NAME-theme.md-accent[disabled],.md-button.md-THEME_NAME-theme.md-fab[disabled],.md-button.md-THEME_NAME-theme.md-raised[disabled],.md-button.md-THEME_NAME-theme.md-warn[disabled],.md-button.md-THEME_NAME-theme[disabled]{color:\\\"{{foreground-3}}\\\";cursor:default}.md-button.md-THEME_NAME-theme.md-accent[disabled] md-icon,.md-button.md-THEME_NAME-theme.md-fab[disabled] md-icon,.md-button.md-THEME_NAME-theme.md-raised[disabled] md-icon,.md-button.md-THEME_NAME-theme.md-warn[disabled] md-icon,.md-button.md-THEME_NAME-theme[disabled] md-icon{color:\\\"{{foreground-3}}\\\"}.md-button.md-THEME_NAME-theme.md-fab[disabled],.md-button.md-THEME_NAME-theme.md-raised[disabled]{background-color:\\\"{{foreground-4}}\\\"}.md-button.md-THEME_NAME-theme[disabled]{background-color:transparent}._md a.md-THEME_NAME-theme:not(.md-button).md-primary{color:\\\"{{primary-color}}\\\"}._md a.md-THEME_NAME-theme:not(.md-button).md-primary:hover{color:\\\"{{primary-700}}\\\"}._md a.md-THEME_NAME-theme:not(.md-button).md-accent{color:\\\"{{accent-color}}\\\"}._md a.md-THEME_NAME-theme:not(.md-button).md-accent:hover{color:\\\"{{accent-A700}}\\\"}._md a.md-THEME_NAME-theme:not(.md-button).md-warn{color:\\\"{{warn-color}}\\\"}._md a.md-THEME_NAME-theme:not(.md-button).md-warn:hover{color:\\\"{{warn-700}}\\\"}md-card.md-THEME_NAME-theme{color:\\\"{{foreground-1}}\\\";background-color:\\\"{{background-hue-1}}\\\";border-radius:2px}md-card.md-THEME_NAME-theme .md-card-image{border-radius:2px 2px 0 0}md-card.md-THEME_NAME-theme md-card-header md-card-avatar md-icon{color:\\\"{{background-color}}\\\";background-color:\\\"{{foreground-3}}\\\"}md-card.md-THEME_NAME-theme md-card-header md-card-header-text .md-subhead,md-card.md-THEME_NAME-theme md-card-title md-card-title-text:not(:only-child) .md-subhead{color:\\\"{{foreground-2}}\\\"}md-checkbox.md-THEME_NAME-theme .md-ripple{color:\\\"{{accent-A700}}\\\"}md-checkbox.md-THEME_NAME-theme.md-checked .md-ripple{color:\\\"{{background-600}}\\\"}md-checkbox.md-THEME_NAME-theme.md-checked.md-focused .md-container:before{background-color:\\\"{{accent-color-0.26}}\\\"}md-checkbox.md-THEME_NAME-theme .md-ink-ripple{color:\\\"{{foreground-2}}\\\"}md-checkbox.md-THEME_NAME-theme.md-checked .md-ink-ripple{color:\\\"{{accent-color-0.87}}\\\"}md-checkbox.md-THEME_NAME-theme:not(.md-checked) .md-icon{border-color:\\\"{{foreground-2}}\\\"}md-checkbox.md-THEME_NAME-theme.md-checked .md-icon{background-color:\\\"{{accent-color-0.87}}\\\"}md-checkbox.md-THEME_NAME-theme.md-checked .md-icon:after{border-color:\\\"{{accent-contrast-0.87}}\\\"}md-checkbox.md-THEME_NAME-theme:not([disabled]).md-primary .md-ripple{color:\\\"{{primary-600}}\\\"}md-checkbox.md-THEME_NAME-theme:not([disabled]).md-primary.md-checked .md-ripple{color:\\\"{{background-600}}\\\"}md-checkbox.md-THEME_NAME-theme:not([disabled]).md-primary .md-ink-ripple{color:\\\"{{foreground-2}}\\\"}md-checkbox.md-THEME_NAME-theme:not([disabled]).md-primary.md-checked .md-ink-ripple{color:\\\"{{primary-color-0.87}}\\\"}md-checkbox.md-THEME_NAME-theme:not([disabled]).md-primary:not(.md-checked) .md-icon{border-color:\\\"{{foreground-2}}\\\"}md-checkbox.md-THEME_NAME-theme:not([disabled]).md-primary.md-checked .md-icon{background-color:\\\"{{primary-color-0.87}}\\\"}md-checkbox.md-THEME_NAME-theme:not([disabled]).md-primary.md-checked.md-focused .md-container:before{background-color:\\\"{{primary-color-0.26}}\\\"}md-checkbox.md-THEME_NAME-theme:not([disabled]).md-primary.md-checked .md-icon:after{border-color:\\\"{{primary-contrast-0.87}}\\\"}md-checkbox.md-THEME_NAME-theme:not([disabled]).md-primary .md-indeterminate[disabled] .md-container{color:\\\"{{foreground-3}}\\\"}md-checkbox.md-THEME_NAME-theme:not([disabled]).md-warn .md-ripple{color:\\\"{{warn-600}}\\\"}md-checkbox.md-THEME_NAME-theme:not([disabled]).md-warn .md-ink-ripple{color:\\\"{{foreground-2}}\\\"}md-checkbox.md-THEME_NAME-theme:not([disabled]).md-warn.md-checked .md-ink-ripple{color:\\\"{{warn-color-0.87}}\\\"}md-checkbox.md-THEME_NAME-theme:not([disabled]).md-warn:not(.md-checked) .md-icon{border-color:\\\"{{foreground-2}}\\\"}md-checkbox.md-THEME_NAME-theme:not([disabled]).md-warn.md-checked .md-icon{background-color:\\\"{{warn-color-0.87}}\\\"}md-checkbox.md-THEME_NAME-theme:not([disabled]).md-warn.md-checked.md-focused:not([disabled]) .md-container:before{background-color:\\\"{{warn-color-0.26}}\\\"}md-checkbox.md-THEME_NAME-theme:not([disabled]).md-warn.md-checked .md-icon:after{border-color:\\\"{{background-200}}\\\"}md-checkbox.md-THEME_NAME-theme[disabled]:not(.md-checked) .md-icon{border-color:\\\"{{foreground-3}}\\\"}md-checkbox.md-THEME_NAME-theme[disabled].md-checked .md-icon{background-color:\\\"{{foreground-3}}\\\"}md-checkbox.md-THEME_NAME-theme[disabled].md-checked .md-icon:after{border-color:\\\"{{background-200}}\\\"}md-checkbox.md-THEME_NAME-theme[disabled] .md-icon:after{border-color:\\\"{{foreground-3}}\\\"}md-checkbox.md-THEME_NAME-theme[disabled] .md-label{color:\\\"{{foreground-3}}\\\"}md-chips.md-THEME_NAME-theme .md-chips{box-shadow:0 1px \\\"{{foreground-4}}\\\"}md-chips.md-THEME_NAME-theme .md-chips.md-focused{box-shadow:0 2px \\\"{{primary-color}}\\\"}md-chips.md-THEME_NAME-theme .md-chips .md-chip-input-container input{color:\\\"{{foreground-1}}\\\"}md-chips.md-THEME_NAME-theme .md-chips .md-chip-input-container input:-moz-placeholder,md-chips.md-THEME_NAME-theme .md-chips .md-chip-input-container input::-moz-placeholder{color:\\\"{{foreground-3}}\\\"}md-chips.md-THEME_NAME-theme .md-chips .md-chip-input-container input:-ms-input-placeholder{color:\\\"{{foreground-3}}\\\"}md-chips.md-THEME_NAME-theme .md-chips .md-chip-input-container input::-webkit-input-placeholder{color:\\\"{{foreground-3}}\\\"}md-chips.md-THEME_NAME-theme md-chip{background:\\\"{{background-300}}\\\";color:\\\"{{background-800}}\\\"}md-chips.md-THEME_NAME-theme md-chip md-icon{color:\\\"{{background-700}}\\\"}md-chips.md-THEME_NAME-theme md-chip.md-focused{background:\\\"{{primary-color}}\\\";color:\\\"{{primary-contrast}}\\\"}md-chips.md-THEME_NAME-theme md-chip.md-focused md-icon{color:\\\"{{primary-contrast}}\\\"}md-chips.md-THEME_NAME-theme md-chip._md-chip-editing{background:transparent;color:\\\"{{background-800}}\\\"}md-chips.md-THEME_NAME-theme md-chip-remove .md-button md-icon path{fill:\\\"{{background-500}}\\\"}.md-contact-suggestion span.md-contact-email{color:\\\"{{background-400}}\\\"}md-content.md-THEME_NAME-theme{color:\\\"{{foreground-1}}\\\";background-color:\\\"{{background-default}}\\\"}.md-calendar.md-THEME_NAME-theme{background:\\\"{{background-A100}}\\\";color:\\\"{{background-A200-0.87}}\\\"}.md-calendar.md-THEME_NAME-theme tr:last-child td{border-bottom-color:\\\"{{background-200}}\\\"}.md-THEME_NAME-theme .md-calendar-day-header{background:\\\"{{background-300}}\\\";color:\\\"{{background-A200-0.87}}\\\"}.md-THEME_NAME-theme .md-calendar-date.md-calendar-date-today .md-calendar-date-selection-indicator{border:1px solid \\\"{{primary-500}}\\\"}.md-THEME_NAME-theme .md-calendar-date.md-calendar-date-today.md-calendar-date-disabled{color:\\\"{{primary-500-0.6}}\\\"}.md-calendar-date.md-focus .md-THEME_NAME-theme .md-calendar-date-selection-indicator,.md-THEME_NAME-theme .md-calendar-date-selection-indicator:hover{background:\\\"{{background-300}}\\\"}.md-THEME_NAME-theme .md-calendar-date.md-calendar-selected-date .md-calendar-date-selection-indicator,.md-THEME_NAME-theme .md-calendar-date.md-focus.md-calendar-selected-date .md-calendar-date-selection-indicator{background:\\\"{{primary-500}}\\\";color:\\\"{{primary-500-contrast}}\\\";border-color:transparent}.md-THEME_NAME-theme .md-calendar-date-disabled,.md-THEME_NAME-theme .md-calendar-month-label-disabled{color:\\\"{{background-A200-0.435}}\\\"}.md-THEME_NAME-theme .md-datepicker-input{color:\\\"{{foreground-1}}\\\"}.md-THEME_NAME-theme .md-datepicker-input:-moz-placeholder,.md-THEME_NAME-theme .md-datepicker-input::-moz-placeholder{color:\\\"{{foreground-3}}\\\"}.md-THEME_NAME-theme .md-datepicker-input:-ms-input-placeholder{color:\\\"{{foreground-3}}\\\"}.md-THEME_NAME-theme .md-datepicker-input::-webkit-input-placeholder{color:\\\"{{foreground-3}}\\\"}.md-THEME_NAME-theme .md-datepicker-input-container{border-bottom-color:\\\"{{foreground-4}}\\\"}.md-THEME_NAME-theme .md-datepicker-input-container.md-datepicker-focused{border-bottom-color:\\\"{{primary-color}}\\\"}.md-accent .md-THEME_NAME-theme .md-datepicker-input-container.md-datepicker-focused{border-bottom-color:\\\"{{accent-color}}\\\"}.md-THEME_NAME-theme .md-datepicker-input-container.md-datepicker-invalid,.md-warn .md-THEME_NAME-theme .md-datepicker-input-container.md-datepicker-focused{border-bottom-color:\\\"{{warn-A700}}\\\"}.md-THEME_NAME-theme .md-datepicker-calendar-pane{border-color:\\\"{{background-hue-1}}\\\"}.md-THEME_NAME-theme .md-datepicker-triangle-button .md-datepicker-expand-triangle{border-top-color:\\\"{{foreground-2}}\\\"}.md-THEME_NAME-theme .md-datepicker-open .md-datepicker-calendar-icon{color:\\\"{{primary-color}}\\\"}.md-accent .md-THEME_NAME-theme .md-datepicker-open .md-datepicker-calendar-icon,.md-THEME_NAME-theme .md-datepicker-open.md-accent .md-datepicker-calendar-icon{color:\\\"{{accent-color}}\\\"}.md-THEME_NAME-theme .md-datepicker-open.md-warn .md-datepicker-calendar-icon,.md-warn .md-THEME_NAME-theme .md-datepicker-open .md-datepicker-calendar-icon{color:\\\"{{warn-A700}}\\\"}.md-THEME_NAME-theme .md-datepicker-calendar{background:\\\"{{background-A100}}\\\"}.md-THEME_NAME-theme .md-datepicker-input-mask-opaque{box-shadow:0 0 0 9999px \\\"{{background-hue-1}}\\\"}.md-THEME_NAME-theme .md-datepicker-open .md-datepicker-input-container{background:\\\"{{background-hue-1}}\\\"}md-dialog.md-THEME_NAME-theme{border-radius:4px;background-color:\\\"{{background-hue-1}}\\\";color:\\\"{{foreground-1}}\\\"}md-dialog.md-THEME_NAME-theme.md-content-overflow .md-actions,md-dialog.md-THEME_NAME-theme.md-content-overflow md-dialog-actions,md-divider.md-THEME_NAME-theme{border-top-color:\\\"{{foreground-4}}\\\"}.layout-gt-lg-row>md-divider.md-THEME_NAME-theme,.layout-gt-md-row>md-divider.md-THEME_NAME-theme,.layout-gt-sm-row>md-divider.md-THEME_NAME-theme,.layout-gt-xs-row>md-divider.md-THEME_NAME-theme,.layout-lg-row>md-divider.md-THEME_NAME-theme,.layout-md-row>md-divider.md-THEME_NAME-theme,.layout-row>md-divider.md-THEME_NAME-theme,.layout-sm-row>md-divider.md-THEME_NAME-theme,.layout-xl-row>md-divider.md-THEME_NAME-theme,.layout-xs-row>md-divider.md-THEME_NAME-theme{border-right-color:\\\"{{foreground-4}}\\\"}md-icon.md-THEME_NAME-theme{color:\\\"{{foreground-2}}\\\"}md-icon.md-THEME_NAME-theme.md-primary{color:\\\"{{primary-color}}\\\"}md-icon.md-THEME_NAME-theme.md-accent{color:\\\"{{accent-color}}\\\"}md-icon.md-THEME_NAME-theme.md-warn{color:\\\"{{warn-color}}\\\"}md-input-container.md-THEME_NAME-theme .md-input{color:\\\"{{foreground-1}}\\\";border-color:\\\"{{foreground-4}}\\\"}md-input-container.md-THEME_NAME-theme .md-input:-moz-placeholder,md-input-container.md-THEME_NAME-theme .md-input::-moz-placeholder{color:\\\"{{foreground-3}}\\\"}md-input-container.md-THEME_NAME-theme .md-input:-ms-input-placeholder{color:\\\"{{foreground-3}}\\\"}md-input-container.md-THEME_NAME-theme .md-input::-webkit-input-placeholder{color:\\\"{{foreground-3}}\\\"}md-input-container.md-THEME_NAME-theme>md-icon{color:\\\"{{foreground-1}}\\\"}md-input-container.md-THEME_NAME-theme .md-placeholder,md-input-container.md-THEME_NAME-theme label{color:\\\"{{foreground-3}}\\\"}md-input-container.md-THEME_NAME-theme label.md-required:after{color:\\\"{{warn-A700}}\\\"}md-input-container.md-THEME_NAME-theme:not(.md-input-focused):not(.md-input-invalid) label.md-required:after{color:\\\"{{foreground-2}}\\\"}md-input-container.md-THEME_NAME-theme .md-input-message-animation,md-input-container.md-THEME_NAME-theme .md-input-messages-animation{color:\\\"{{warn-A700}}\\\"}md-input-container.md-THEME_NAME-theme .md-input-message-animation .md-char-counter,md-input-container.md-THEME_NAME-theme .md-input-messages-animation .md-char-counter{color:\\\"{{foreground-1}}\\\"}md-input-container.md-THEME_NAME-theme.md-input-focused .md-input:-moz-placeholder,md-input-container.md-THEME_NAME-theme.md-input-focused .md-input::-moz-placeholder{color:\\\"{{foreground-2}}\\\"}md-input-container.md-THEME_NAME-theme.md-input-focused .md-input:-ms-input-placeholder{color:\\\"{{foreground-2}}\\\"}md-input-container.md-THEME_NAME-theme.md-input-focused .md-input::-webkit-input-placeholder{color:\\\"{{foreground-2}}\\\"}md-input-container.md-THEME_NAME-theme:not(.md-input-invalid).md-input-has-value label{color:\\\"{{foreground-2}}\\\"}md-input-container.md-THEME_NAME-theme:not(.md-input-invalid).md-input-focused .md-input,md-input-container.md-THEME_NAME-theme:not(.md-input-invalid).md-input-resized .md-input{border-color:\\\"{{primary-color}}\\\"}md-input-container.md-THEME_NAME-theme:not(.md-input-invalid).md-input-focused label,md-input-container.md-THEME_NAME-theme:not(.md-input-invalid).md-input-focused md-icon{color:\\\"{{primary-color}}\\\"}md-input-container.md-THEME_NAME-theme:not(.md-input-invalid).md-input-focused.md-accent .md-input{border-color:\\\"{{accent-color}}\\\"}md-input-container.md-THEME_NAME-theme:not(.md-input-invalid).md-input-focused.md-accent label,md-input-container.md-THEME_NAME-theme:not(.md-input-invalid).md-input-focused.md-accent md-icon{color:\\\"{{accent-color}}\\\"}md-input-container.md-THEME_NAME-theme:not(.md-input-invalid).md-input-focused.md-warn .md-input{border-color:\\\"{{warn-A700}}\\\"}md-input-container.md-THEME_NAME-theme:not(.md-input-invalid).md-input-focused.md-warn label,md-input-container.md-THEME_NAME-theme:not(.md-input-invalid).md-input-focused.md-warn md-icon{color:\\\"{{warn-A700}}\\\"}md-input-container.md-THEME_NAME-theme.md-input-invalid .md-input{border-color:\\\"{{warn-A700}}\\\"}md-input-container.md-THEME_NAME-theme.md-input-invalid .md-char-counter,md-input-container.md-THEME_NAME-theme.md-input-invalid .md-input-message-animation,md-input-container.md-THEME_NAME-theme.md-input-invalid label{color:\\\"{{warn-A700}}\\\"}[disabled] md-input-container.md-THEME_NAME-theme .md-input,md-input-container.md-THEME_NAME-theme .md-input[disabled]{border-bottom-color:transparent;color:\\\"{{foreground-3}}\\\";background-image:linear-gradient(90deg,\\\"{{foreground-3}}\\\" 0,\\\"{{foreground-3}}\\\" 33%,transparent 0);background-image:-ms-linear-gradient(left,transparent 0,\\\"{{foreground-3}}\\\" 100%)}md-list.md-THEME_NAME-theme md-list-item.md-2-line .md-list-item-text h3,md-list.md-THEME_NAME-theme md-list-item.md-2-line .md-list-item-text h4,md-list.md-THEME_NAME-theme md-list-item.md-3-line .md-list-item-text h3,md-list.md-THEME_NAME-theme md-list-item.md-3-line .md-list-item-text h4{color:\\\"{{foreground-1}}\\\"}md-list.md-THEME_NAME-theme md-list-item.md-2-line .md-list-item-text p,md-list.md-THEME_NAME-theme md-list-item.md-3-line .md-list-item-text p{color:\\\"{{foreground-2}}\\\"}md-list.md-THEME_NAME-theme .md-proxy-focus.md-focused div.md-no-style{background-color:\\\"{{background-100}}\\\"}md-list.md-THEME_NAME-theme md-list-item .md-avatar-icon{background-color:\\\"{{foreground-3}}\\\";color:\\\"{{background-color}}\\\"}md-list.md-THEME_NAME-theme md-list-item>md-icon{color:\\\"{{foreground-2}}\\\"}md-list.md-THEME_NAME-theme md-list-item>md-icon.md-highlight{color:\\\"{{primary-color}}\\\"}md-list.md-THEME_NAME-theme md-list-item>md-icon.md-highlight.md-accent{color:\\\"{{accent-color}}\\\"}md-menu-content.md-THEME_NAME-theme{background-color:\\\"{{background-A100}}\\\"}md-menu-content.md-THEME_NAME-theme md-menu-item{color:\\\"{{background-A200-0.87}}\\\"}md-menu-content.md-THEME_NAME-theme md-menu-item md-icon{color:\\\"{{background-A200-0.54}}\\\"}md-menu-content.md-THEME_NAME-theme md-menu-item .md-button[disabled],md-menu-content.md-THEME_NAME-theme md-menu-item .md-button[disabled] md-icon{color:\\\"{{background-A200-0.25}}\\\"}md-menu-content.md-THEME_NAME-theme md-menu-divider{background-color:\\\"{{background-A200-0.11}}\\\"}md-menu-bar.md-THEME_NAME-theme>button.md-button{color:\\\"{{foreground-2}}\\\";border-radius:2px}md-menu-bar.md-THEME_NAME-theme md-menu.md-open>button,md-menu-bar.md-THEME_NAME-theme md-menu>button:focus{outline:none;background:\\\"{{background-200}}\\\"}md-menu-bar.md-THEME_NAME-theme.md-open:not(.md-keyboard-mode) md-menu:hover>button{background-color:\\\"{{ background-500-0.2}}\\\"}md-menu-bar.md-THEME_NAME-theme:not(.md-keyboard-mode):not(.md-open) md-menu button:focus,md-menu-bar.md-THEME_NAME-theme:not(.md-keyboard-mode):not(.md-open) md-menu button:hover{background:transparent}md-menu-content.md-THEME_NAME-theme .md-menu>.md-button:after{color:\\\"{{background-A200-0.54}}\\\"}md-menu-content.md-THEME_NAME-theme .md-menu.md-open>.md-button{background-color:\\\"{{ background-500-0.2}}\\\"}md-toolbar.md-THEME_NAME-theme.md-menu-toolbar{background-color:\\\"{{background-A100}}\\\";color:\\\"{{background-A200}}\\\"}md-toolbar.md-THEME_NAME-theme.md-menu-toolbar md-toolbar-filler{background-color:\\\"{{primary-color}}\\\";color:\\\"{{background-A100-0.87}}\\\"}md-toolbar.md-THEME_NAME-theme.md-menu-toolbar md-toolbar-filler md-icon{color:\\\"{{background-A100-0.87}}\\\"}md-nav-bar.md-THEME_NAME-theme .md-nav-bar{background-color:transparent;border-color:\\\"{{foreground-4}}\\\"}md-nav-bar.md-THEME_NAME-theme .md-button._md-nav-button.md-unselected{color:\\\"{{foreground-2}}\\\"}md-nav-bar.md-THEME_NAME-theme md-nav-ink-bar{color:\\\"{{accent-color}}\\\";background:\\\"{{accent-color}}\\\"}md-nav-bar.md-THEME_NAME-theme.md-accent>.md-nav-bar{background-color:\\\"{{accent-color}}\\\"}md-nav-bar.md-THEME_NAME-theme.md-accent>.md-nav-bar .md-button._md-nav-button{color:\\\"{{accent-A100}}\\\"}md-nav-bar.md-THEME_NAME-theme.md-accent>.md-nav-bar .md-button._md-nav-button.md-active,md-nav-bar.md-THEME_NAME-theme.md-accent>.md-nav-bar .md-button._md-nav-button.md-focused{color:\\\"{{accent-contrast}}\\\"}md-nav-bar.md-THEME_NAME-theme.md-accent>.md-nav-bar .md-button._md-nav-button.md-focused{background:\\\"{{accent-contrast-0.1}}\\\"}md-nav-bar.md-THEME_NAME-theme.md-accent>.md-nav-bar md-nav-ink-bar{color:\\\"{{primary-600-1}}\\\";background:\\\"{{primary-600-1}}\\\"}md-nav-bar.md-THEME_NAME-theme.md-warn>.md-nav-bar{background-color:\\\"{{warn-color}}\\\"}md-nav-bar.md-THEME_NAME-theme.md-warn>.md-nav-bar .md-button._md-nav-button{color:\\\"{{warn-100}}\\\"}md-nav-bar.md-THEME_NAME-theme.md-warn>.md-nav-bar .md-button._md-nav-button.md-active,md-nav-bar.md-THEME_NAME-theme.md-warn>.md-nav-bar .md-button._md-nav-button.md-focused{color:\\\"{{warn-contrast}}\\\"}md-nav-bar.md-THEME_NAME-theme.md-warn>.md-nav-bar .md-button._md-nav-button.md-focused{background:\\\"{{warn-contrast-0.1}}\\\"}md-nav-bar.md-THEME_NAME-theme.md-primary>.md-nav-bar{background-color:\\\"{{primary-color}}\\\"}md-nav-bar.md-THEME_NAME-theme.md-primary>.md-nav-bar .md-button._md-nav-button{color:\\\"{{primary-100}}\\\"}md-nav-bar.md-THEME_NAME-theme.md-primary>.md-nav-bar .md-button._md-nav-button.md-active,md-nav-bar.md-THEME_NAME-theme.md-primary>.md-nav-bar .md-button._md-nav-button.md-focused{color:\\\"{{primary-contrast}}\\\"}md-nav-bar.md-THEME_NAME-theme.md-primary>.md-nav-bar .md-button._md-nav-button.md-focused{background:\\\"{{primary-contrast-0.1}}\\\"}md-toolbar>md-nav-bar.md-THEME_NAME-theme>.md-nav-bar{background-color:\\\"{{primary-color}}\\\"}md-toolbar>md-nav-bar.md-THEME_NAME-theme>.md-nav-bar .md-button._md-nav-button{color:\\\"{{primary-100}}\\\"}md-toolbar>md-nav-bar.md-THEME_NAME-theme>.md-nav-bar .md-button._md-nav-button.md-active,md-toolbar>md-nav-bar.md-THEME_NAME-theme>.md-nav-bar .md-button._md-nav-button.md-focused{color:\\\"{{primary-contrast}}\\\"}md-toolbar>md-nav-bar.md-THEME_NAME-theme>.md-nav-bar .md-button._md-nav-button.md-focused{background:\\\"{{primary-contrast-0.1}}\\\"}md-toolbar.md-accent>md-nav-bar.md-THEME_NAME-theme>.md-nav-bar{background-color:\\\"{{accent-color}}\\\"}md-toolbar.md-accent>md-nav-bar.md-THEME_NAME-theme>.md-nav-bar .md-button._md-nav-button{color:\\\"{{accent-A100}}\\\"}md-toolbar.md-accent>md-nav-bar.md-THEME_NAME-theme>.md-nav-bar .md-button._md-nav-button.md-active,md-toolbar.md-accent>md-nav-bar.md-THEME_NAME-theme>.md-nav-bar .md-button._md-nav-button.md-focused{color:\\\"{{accent-contrast}}\\\"}md-toolbar.md-accent>md-nav-bar.md-THEME_NAME-theme>.md-nav-bar .md-button._md-nav-button.md-focused{background:\\\"{{accent-contrast-0.1}}\\\"}md-toolbar.md-accent>md-nav-bar.md-THEME_NAME-theme>.md-nav-bar md-nav-ink-bar{color:\\\"{{primary-600-1}}\\\";background:\\\"{{primary-600-1}}\\\"}md-toolbar.md-warn>md-nav-bar.md-THEME_NAME-theme>.md-nav-bar{background-color:\\\"{{warn-color}}\\\"}md-toolbar.md-warn>md-nav-bar.md-THEME_NAME-theme>.md-nav-bar .md-button._md-nav-button{color:\\\"{{warn-100}}\\\"}md-toolbar.md-warn>md-nav-bar.md-THEME_NAME-theme>.md-nav-bar .md-button._md-nav-button.md-active,md-toolbar.md-warn>md-nav-bar.md-THEME_NAME-theme>.md-nav-bar .md-button._md-nav-button.md-focused{color:\\\"{{warn-contrast}}\\\"}md-toolbar.md-warn>md-nav-bar.md-THEME_NAME-theme>.md-nav-bar .md-button._md-nav-button.md-focused{background:\\\"{{warn-contrast-0.1}}\\\"}md-progress-circular.md-THEME_NAME-theme path{stroke:\\\"{{primary-color}}\\\"}md-progress-circular.md-THEME_NAME-theme.md-warn path{stroke:\\\"{{warn-color}}\\\"}md-progress-circular.md-THEME_NAME-theme.md-accent path{stroke:\\\"{{accent-color}}\\\"}._md-panel-backdrop.md-THEME_NAME-theme{background-color:\\\"{{background-900-1.0}}\\\"}md-progress-linear.md-THEME_NAME-theme .md-container{background-color:\\\"{{primary-100}}\\\"}md-progress-linear.md-THEME_NAME-theme .md-bar{background-color:\\\"{{primary-color}}\\\"}md-progress-linear.md-THEME_NAME-theme.md-warn .md-container{background-color:\\\"{{warn-100}}\\\"}md-progress-linear.md-THEME_NAME-theme.md-warn .md-bar{background-color:\\\"{{warn-color}}\\\"}md-progress-linear.md-THEME_NAME-theme.md-accent .md-container{background-color:\\\"{{accent-100}}\\\"}md-progress-linear.md-THEME_NAME-theme.md-accent .md-bar{background-color:\\\"{{accent-color}}\\\"}md-progress-linear.md-THEME_NAME-theme[md-mode=buffer].md-warn .md-bar1{background-color:\\\"{{warn-100}}\\\"}md-progress-linear.md-THEME_NAME-theme[md-mode=buffer].md-warn .md-dashed:before{background:radial-gradient(\\\"{{warn-100}}\\\" 0,\\\"{{warn-100}}\\\" 16%,transparent 42%)}md-progress-linear.md-THEME_NAME-theme[md-mode=buffer].md-accent .md-bar1{background-color:\\\"{{accent-100}}\\\"}md-progress-linear.md-THEME_NAME-theme[md-mode=buffer].md-accent .md-dashed:before{background:radial-gradient(\\\"{{accent-100}}\\\" 0,\\\"{{accent-100}}\\\" 16%,transparent 42%)}md-radio-button.md-THEME_NAME-theme .md-off{border-color:\\\"{{foreground-2}}\\\"}md-radio-button.md-THEME_NAME-theme .md-on{background-color:\\\"{{accent-color-0.87}}\\\"}md-radio-button.md-THEME_NAME-theme.md-checked .md-off{border-color:\\\"{{accent-color-0.87}}\\\"}md-radio-button.md-THEME_NAME-theme.md-checked .md-ink-ripple{color:\\\"{{accent-color-0.87}}\\\"}md-radio-button.md-THEME_NAME-theme .md-container .md-ripple{color:\\\"{{accent-A700}}\\\"}md-radio-button.md-THEME_NAME-theme:not([disabled]).md-primary .md-on,md-radio-button.md-THEME_NAME-theme:not([disabled]) .md-primary .md-on,md-radio-group.md-THEME_NAME-theme:not([disabled]).md-primary .md-on,md-radio-group.md-THEME_NAME-theme:not([disabled]) .md-primary .md-on{background-color:\\\"{{primary-color-0.87}}\\\"}md-radio-button.md-THEME_NAME-theme:not([disabled]).md-primary.md-checked .md-off,md-radio-button.md-THEME_NAME-theme:not([disabled]) .md-primary.md-checked .md-off,md-radio-button.md-THEME_NAME-theme:not([disabled]).md-primary .md-checked .md-off,md-radio-button.md-THEME_NAME-theme:not([disabled]) .md-primary .md-checked .md-off,md-radio-group.md-THEME_NAME-theme:not([disabled]).md-primary.md-checked .md-off,md-radio-group.md-THEME_NAME-theme:not([disabled]) .md-primary.md-checked .md-off,md-radio-group.md-THEME_NAME-theme:not([disabled]).md-primary .md-checked .md-off,md-radio-group.md-THEME_NAME-theme:not([disabled]) .md-primary .md-checked .md-off{border-color:\\\"{{primary-color-0.87}}\\\"}md-radio-button.md-THEME_NAME-theme:not([disabled]).md-primary.md-checked .md-ink-ripple,md-radio-button.md-THEME_NAME-theme:not([disabled]) .md-primary.md-checked .md-ink-ripple,md-radio-button.md-THEME_NAME-theme:not([disabled]).md-primary .md-checked .md-ink-ripple,md-radio-button.md-THEME_NAME-theme:not([disabled]) .md-primary .md-checked .md-ink-ripple,md-radio-group.md-THEME_NAME-theme:not([disabled]).md-primary.md-checked .md-ink-ripple,md-radio-group.md-THEME_NAME-theme:not([disabled]) .md-primary.md-checked .md-ink-ripple,md-radio-group.md-THEME_NAME-theme:not([disabled]).md-primary .md-checked .md-ink-ripple,md-radio-group.md-THEME_NAME-theme:not([disabled]) .md-primary .md-checked .md-ink-ripple{color:\\\"{{primary-color-0.87}}\\\"}md-radio-button.md-THEME_NAME-theme:not([disabled]).md-primary .md-container .md-ripple,md-radio-button.md-THEME_NAME-theme:not([disabled]) .md-primary .md-container .md-ripple,md-radio-group.md-THEME_NAME-theme:not([disabled]).md-primary .md-container .md-ripple,md-radio-group.md-THEME_NAME-theme:not([disabled]) .md-primary .md-container .md-ripple{color:\\\"{{primary-600}}\\\"}md-radio-button.md-THEME_NAME-theme:not([disabled]).md-warn .md-on,md-radio-button.md-THEME_NAME-theme:not([disabled]) .md-warn .md-on,md-radio-group.md-THEME_NAME-theme:not([disabled]).md-warn .md-on,md-radio-group.md-THEME_NAME-theme:not([disabled]) .md-warn .md-on{background-color:\\\"{{warn-color-0.87}}\\\"}md-radio-button.md-THEME_NAME-theme:not([disabled]).md-warn.md-checked .md-off,md-radio-button.md-THEME_NAME-theme:not([disabled]) .md-warn.md-checked .md-off,md-radio-button.md-THEME_NAME-theme:not([disabled]).md-warn .md-checked .md-off,md-radio-button.md-THEME_NAME-theme:not([disabled]) .md-warn .md-checked .md-off,md-radio-group.md-THEME_NAME-theme:not([disabled]).md-warn.md-checked .md-off,md-radio-group.md-THEME_NAME-theme:not([disabled]) .md-warn.md-checked .md-off,md-radio-group.md-THEME_NAME-theme:not([disabled]).md-warn .md-checked .md-off,md-radio-group.md-THEME_NAME-theme:not([disabled]) .md-warn .md-checked .md-off{border-color:\\\"{{warn-color-0.87}}\\\"}md-radio-button.md-THEME_NAME-theme:not([disabled]).md-warn.md-checked .md-ink-ripple,md-radio-button.md-THEME_NAME-theme:not([disabled]) .md-warn.md-checked .md-ink-ripple,md-radio-button.md-THEME_NAME-theme:not([disabled]).md-warn .md-checked .md-ink-ripple,md-radio-button.md-THEME_NAME-theme:not([disabled]) .md-warn .md-checked .md-ink-ripple,md-radio-group.md-THEME_NAME-theme:not([disabled]).md-warn.md-checked .md-ink-ripple,md-radio-group.md-THEME_NAME-theme:not([disabled]) .md-warn.md-checked .md-ink-ripple,md-radio-group.md-THEME_NAME-theme:not([disabled]).md-warn .md-checked .md-ink-ripple,md-radio-group.md-THEME_NAME-theme:not([disabled]) .md-warn .md-checked .md-ink-ripple{color:\\\"{{warn-color-0.87}}\\\"}md-radio-button.md-THEME_NAME-theme:not([disabled]).md-warn .md-container .md-ripple,md-radio-button.md-THEME_NAME-theme:not([disabled]) .md-warn .md-container .md-ripple,md-radio-group.md-THEME_NAME-theme:not([disabled]).md-warn .md-container .md-ripple,md-radio-group.md-THEME_NAME-theme:not([disabled]) .md-warn .md-container .md-ripple{color:\\\"{{warn-600}}\\\"}md-radio-button.md-THEME_NAME-theme[disabled],md-radio-group.md-THEME_NAME-theme[disabled]{color:\\\"{{foreground-3}}\\\"}md-radio-button.md-THEME_NAME-theme[disabled] .md-container .md-off,md-radio-button.md-THEME_NAME-theme[disabled] .md-container .md-on,md-radio-group.md-THEME_NAME-theme[disabled] .md-container .md-off,md-radio-group.md-THEME_NAME-theme[disabled] .md-container .md-on{border-color:\\\"{{foreground-3}}\\\"}md-radio-group.md-THEME_NAME-theme .md-checked .md-ink-ripple{color:\\\"{{accent-color-0.26}}\\\"}md-radio-group.md-THEME_NAME-theme .md-checked:not([disabled]).md-primary .md-ink-ripple,md-radio-group.md-THEME_NAME-theme.md-primary .md-checked:not([disabled]) .md-ink-ripple{color:\\\"{{primary-color-0.26}}\\\"}md-radio-group.md-THEME_NAME-theme .md-checked.md-primary .md-ink-ripple{color:\\\"{{warn-color-0.26}}\\\"}md-radio-group.md-THEME_NAME-theme.md-focused:not(:empty) .md-checked .md-container:before{background-color:\\\"{{accent-color-0.26}}\\\"}md-radio-group.md-THEME_NAME-theme.md-focused:not(:empty) .md-checked.md-primary .md-container:before,md-radio-group.md-THEME_NAME-theme.md-focused:not(:empty).md-primary .md-checked .md-container:before{background-color:\\\"{{primary-color-0.26}}\\\"}md-radio-group.md-THEME_NAME-theme.md-focused:not(:empty) .md-checked.md-warn .md-container:before,md-radio-group.md-THEME_NAME-theme.md-focused:not(:empty).md-warn .md-checked .md-container:before{background-color:\\\"{{warn-color-0.26}}\\\"}md-sidenav.md-THEME_NAME-theme,md-sidenav.md-THEME_NAME-theme md-content{background-color:\\\"{{background-hue-1}}\\\"}md-input-container md-select.md-THEME_NAME-theme .md-select-value span:first-child:after{color:\\\"{{warn-A700}}\\\"}md-input-container:not(.md-input-focused):not(.md-input-invalid) md-select.md-THEME_NAME-theme .md-select-value span:first-child:after{color:\\\"{{foreground-3}}\\\"}md-input-container.md-input-focused:not(.md-input-has-value) md-select.md-THEME_NAME-theme .md-select-value,md-input-container.md-input-focused:not(.md-input-has-value) md-select.md-THEME_NAME-theme .md-select-value.md-select-placeholder{color:\\\"{{primary-color}}\\\"}md-input-container.md-input-invalid md-select.md-THEME_NAME-theme .md-select-value{color:\\\"{{warn-A700}}\\\"!important;border-bottom-color:\\\"{{warn-A700}}\\\"!important}md-input-container.md-input-invalid md-select.md-THEME_NAME-theme.md-no-underline .md-select-value{border-bottom-color:transparent!important}md-select.md-THEME_NAME-theme[disabled] .md-select-value{border-bottom-color:transparent;background-image:linear-gradient(90deg,\\\"{{foreground-3}}\\\" 0,\\\"{{foreground-3}}\\\" 33%,transparent 0);background-image:-ms-linear-gradient(left,transparent 0,\\\"{{foreground-3}}\\\" 100%)}md-select.md-THEME_NAME-theme .md-select-value{border-bottom-color:\\\"{{foreground-4}}\\\"}md-select.md-THEME_NAME-theme .md-select-value.md-select-placeholder{color:\\\"{{foreground-3}}\\\"}md-select.md-THEME_NAME-theme .md-select-value span:first-child:after{color:\\\"{{warn-A700}}\\\"}md-select.md-THEME_NAME-theme.md-no-underline .md-select-value{border-bottom-color:transparent!important}md-select.md-THEME_NAME-theme.ng-invalid.ng-touched .md-select-value{color:\\\"{{warn-A700}}\\\"!important;border-bottom-color:\\\"{{warn-A700}}\\\"!important}md-select.md-THEME_NAME-theme.ng-invalid.ng-touched.md-no-underline .md-select-value{border-bottom-color:transparent!important}md-select.md-THEME_NAME-theme:not([disabled]):focus .md-select-value{border-bottom-color:\\\"{{primary-color}}\\\";color:\\\"{{ foreground-1 }}\\\"}md-select.md-THEME_NAME-theme:not([disabled]):focus .md-select-value.md-select-placeholder{color:\\\"{{ foreground-1 }}\\\"}md-select.md-THEME_NAME-theme:not([disabled]):focus.md-no-underline .md-select-value{border-bottom-color:transparent!important}md-select.md-THEME_NAME-theme:not([disabled]):focus.md-accent .md-select-value{border-bottom-color:\\\"{{accent-color}}\\\"}md-select.md-THEME_NAME-theme:not([disabled]):focus.md-warn .md-select-value{border-bottom-color:\\\"{{warn-color}}\\\"}md-select.md-THEME_NAME-theme[disabled] .md-select-icon,md-select.md-THEME_NAME-theme[disabled] .md-select-value,md-select.md-THEME_NAME-theme[disabled] .md-select-value.md-select-placeholder{color:\\\"{{foreground-3}}\\\"}md-select.md-THEME_NAME-theme .md-select-icon{color:\\\"{{foreground-2}}\\\"}md-select-menu.md-THEME_NAME-theme md-content{background:\\\"{{background-A100}}\\\"}md-select-menu.md-THEME_NAME-theme md-content md-optgroup{color:\\\"{{background-600-0.87}}\\\"}md-select-menu.md-THEME_NAME-theme md-content md-option{color:\\\"{{background-900-0.87}}\\\"}md-select-menu.md-THEME_NAME-theme md-content md-option[disabled] .md-text{color:\\\"{{background-400-0.87}}\\\"}md-select-menu.md-THEME_NAME-theme md-content md-option:not([disabled]):focus,md-select-menu.md-THEME_NAME-theme md-content md-option:not([disabled]):hover{background:\\\"{{background-200}}\\\"}md-select-menu.md-THEME_NAME-theme md-content md-option[selected]{color:\\\"{{primary-500}}\\\"}md-select-menu.md-THEME_NAME-theme md-content md-option[selected]:focus{color:\\\"{{primary-600}}\\\"}md-select-menu.md-THEME_NAME-theme md-content md-option[selected].md-accent{color:\\\"{{accent-color}}\\\"}md-select-menu.md-THEME_NAME-theme md-content md-option[selected].md-accent:focus{color:\\\"{{accent-A700}}\\\"}.md-checkbox-enabled.md-THEME_NAME-theme .md-ripple{color:\\\"{{primary-600}}\\\"}.md-checkbox-enabled.md-THEME_NAME-theme[selected] .md-ripple{color:\\\"{{background-600}}\\\"}.md-checkbox-enabled.md-THEME_NAME-theme .md-ink-ripple{color:\\\"{{foreground-2}}\\\"}.md-checkbox-enabled.md-THEME_NAME-theme[selected] .md-ink-ripple{color:\\\"{{primary-color-0.87}}\\\"}.md-checkbox-enabled.md-THEME_NAME-theme:not(.md-checked) .md-icon{border-color:\\\"{{foreground-2}}\\\"}.md-checkbox-enabled.md-THEME_NAME-theme[selected] .md-icon{background-color:\\\"{{primary-color-0.87}}\\\"}.md-checkbox-enabled.md-THEME_NAME-theme[selected].md-focused .md-container:before{background-color:\\\"{{primary-color-0.26}}\\\"}.md-checkbox-enabled.md-THEME_NAME-theme[selected] .md-icon:after{border-color:\\\"{{primary-contrast-0.87}}\\\"}.md-checkbox-enabled.md-THEME_NAME-theme .md-indeterminate[disabled] .md-container{color:\\\"{{foreground-3}}\\\"}.md-checkbox-enabled.md-THEME_NAME-theme md-option .md-text{color:\\\"{{background-900-0.87}}\\\"}md-slider.md-THEME_NAME-theme .md-track{background-color:\\\"{{foreground-3}}\\\"}md-slider.md-THEME_NAME-theme .md-track-ticks{color:\\\"{{background-contrast}}\\\"}md-slider.md-THEME_NAME-theme .md-focus-ring{background-color:\\\"{{accent-A200-0.2}}\\\"}md-slider.md-THEME_NAME-theme .md-disabled-thumb{border-color:\\\"{{background-color}}\\\";background-color:\\\"{{background-color}}\\\"}md-slider.md-THEME_NAME-theme.md-min .md-thumb:after{background-color:\\\"{{background-color}}\\\";border-color:\\\"{{foreground-3}}\\\"}md-slider.md-THEME_NAME-theme.md-min .md-focus-ring{background-color:\\\"{{foreground-3-0.38}}\\\"}md-slider.md-THEME_NAME-theme.md-min[md-discrete] .md-thumb:after{background-color:\\\"{{background-contrast}}\\\";border-color:transparent}md-slider.md-THEME_NAME-theme.md-min[md-discrete] .md-sign{background-color:\\\"{{background-400}}\\\"}md-slider.md-THEME_NAME-theme.md-min[md-discrete] .md-sign:after{border-top-color:\\\"{{background-400}}\\\"}md-slider.md-THEME_NAME-theme.md-min[md-discrete][md-vertical] .md-sign:after{border-top-color:transparent;border-left-color:\\\"{{background-400}}\\\"}md-slider.md-THEME_NAME-theme .md-track.md-track-fill{background-color:\\\"{{accent-color}}\\\"}md-slider.md-THEME_NAME-theme .md-thumb:after{border-color:\\\"{{accent-color}}\\\";background-color:\\\"{{accent-color}}\\\"}md-slider.md-THEME_NAME-theme .md-sign{background-color:\\\"{{accent-color}}\\\"}md-slider.md-THEME_NAME-theme .md-sign:after{border-top-color:\\\"{{accent-color}}\\\"}md-slider.md-THEME_NAME-theme[md-vertical] .md-sign:after{border-top-color:transparent;border-left-color:\\\"{{accent-color}}\\\"}md-slider.md-THEME_NAME-theme .md-thumb-text{color:\\\"{{accent-contrast}}\\\"}md-slider.md-THEME_NAME-theme.md-warn .md-focus-ring{background-color:\\\"{{warn-200-0.38}}\\\"}md-slider.md-THEME_NAME-theme.md-warn .md-track.md-track-fill{background-color:\\\"{{warn-color}}\\\"}md-slider.md-THEME_NAME-theme.md-warn .md-thumb:after{border-color:\\\"{{warn-color}}\\\";background-color:\\\"{{warn-color}}\\\"}md-slider.md-THEME_NAME-theme.md-warn .md-sign{background-color:\\\"{{warn-color}}\\\"}md-slider.md-THEME_NAME-theme.md-warn .md-sign:after{border-top-color:\\\"{{warn-color}}\\\"}md-slider.md-THEME_NAME-theme.md-warn[md-vertical] .md-sign:after{border-top-color:transparent;border-left-color:\\\"{{warn-color}}\\\"}md-slider.md-THEME_NAME-theme.md-warn .md-thumb-text{color:\\\"{{warn-contrast}}\\\"}md-slider.md-THEME_NAME-theme.md-primary .md-focus-ring{background-color:\\\"{{primary-200-0.38}}\\\"}md-slider.md-THEME_NAME-theme.md-primary .md-track.md-track-fill{background-color:\\\"{{primary-color}}\\\"}md-slider.md-THEME_NAME-theme.md-primary .md-thumb:after{border-color:\\\"{{primary-color}}\\\";background-color:\\\"{{primary-color}}\\\"}md-slider.md-THEME_NAME-theme.md-primary .md-sign{background-color:\\\"{{primary-color}}\\\"}md-slider.md-THEME_NAME-theme.md-primary .md-sign:after{border-top-color:\\\"{{primary-color}}\\\"}md-slider.md-THEME_NAME-theme.md-primary[md-vertical] .md-sign:after{border-top-color:transparent;border-left-color:\\\"{{primary-color}}\\\"}md-slider.md-THEME_NAME-theme.md-primary .md-thumb-text{color:\\\"{{primary-contrast}}\\\"}md-slider.md-THEME_NAME-theme[disabled] .md-thumb:after{border-color:transparent}md-slider.md-THEME_NAME-theme[disabled]:not(.md-min) .md-thumb:after,md-slider.md-THEME_NAME-theme[disabled][md-discrete] .md-thumb:after{background-color:\\\"{{foreground-3}}\\\";border-color:transparent}md-slider.md-THEME_NAME-theme[disabled][readonly] .md-sign{background-color:\\\"{{background-400}}\\\"}md-slider.md-THEME_NAME-theme[disabled][readonly] .md-sign:after{border-top-color:\\\"{{background-400}}\\\"}md-slider.md-THEME_NAME-theme[disabled][readonly][md-vertical] .md-sign:after{border-top-color:transparent;border-left-color:\\\"{{background-400}}\\\"}md-slider.md-THEME_NAME-theme[disabled][readonly] .md-disabled-thumb{border-color:transparent;background-color:transparent}md-slider-container[disabled]>:first-child:not(md-slider),md-slider-container[disabled]>:last-child:not(md-slider){color:\\\"{{foreground-3}}\\\"}.md-subheader.md-THEME_NAME-theme{color:\\\"{{ foreground-2-0.23 }}\\\";background-color:\\\"{{background-default}}\\\"}.md-subheader.md-THEME_NAME-theme.md-primary{color:\\\"{{primary-color}}\\\"}.md-subheader.md-THEME_NAME-theme.md-accent{color:\\\"{{accent-color}}\\\"}.md-subheader.md-THEME_NAME-theme.md-warn{color:\\\"{{warn-color}}\\\"}md-switch.md-THEME_NAME-theme .md-ink-ripple{color:\\\"{{background-500}}\\\"}md-switch.md-THEME_NAME-theme .md-thumb{background-color:\\\"{{background-50}}\\\"}md-switch.md-THEME_NAME-theme .md-bar{background-color:\\\"{{background-500}}\\\"}md-switch.md-THEME_NAME-theme.md-checked .md-ink-ripple{color:\\\"{{accent-color}}\\\"}md-switch.md-THEME_NAME-theme.md-checked .md-thumb{background-color:\\\"{{accent-color}}\\\"}md-switch.md-THEME_NAME-theme.md-checked .md-bar{background-color:\\\"{{accent-color-0.5}}\\\"}md-switch.md-THEME_NAME-theme.md-checked.md-focused .md-thumb:before{background-color:\\\"{{accent-color-0.26}}\\\"}md-switch.md-THEME_NAME-theme.md-checked.md-primary .md-ink-ripple{color:\\\"{{primary-color}}\\\"}md-switch.md-THEME_NAME-theme.md-checked.md-primary .md-thumb{background-color:\\\"{{primary-color}}\\\"}md-switch.md-THEME_NAME-theme.md-checked.md-primary .md-bar{background-color:\\\"{{primary-color-0.5}}\\\"}md-switch.md-THEME_NAME-theme.md-checked.md-primary.md-focused .md-thumb:before{background-color:\\\"{{primary-color-0.26}}\\\"}md-switch.md-THEME_NAME-theme.md-checked.md-warn .md-ink-ripple{color:\\\"{{warn-color}}\\\"}md-switch.md-THEME_NAME-theme.md-checked.md-warn .md-thumb{background-color:\\\"{{warn-color}}\\\"}md-switch.md-THEME_NAME-theme.md-checked.md-warn .md-bar{background-color:\\\"{{warn-color-0.5}}\\\"}md-switch.md-THEME_NAME-theme.md-checked.md-warn.md-focused .md-thumb:before{background-color:\\\"{{warn-color-0.26}}\\\"}md-switch.md-THEME_NAME-theme[disabled] .md-thumb{background-color:\\\"{{background-400}}\\\"}md-switch.md-THEME_NAME-theme[disabled] .md-bar{background-color:\\\"{{foreground-4}}\\\"}md-tabs.md-THEME_NAME-theme md-tabs-wrapper{background-color:transparent;border-color:\\\"{{foreground-4}}\\\"}md-tabs.md-THEME_NAME-theme .md-paginator md-icon{color:\\\"{{primary-color}}\\\"}md-tabs.md-THEME_NAME-theme md-ink-bar{color:\\\"{{accent-color}}\\\";background:\\\"{{accent-color}}\\\"}md-tabs.md-THEME_NAME-theme .md-tab{color:\\\"{{foreground-2}}\\\"}md-tabs.md-THEME_NAME-theme .md-tab[disabled],md-tabs.md-THEME_NAME-theme .md-tab[disabled] md-icon{color:\\\"{{foreground-3}}\\\"}md-tabs.md-THEME_NAME-theme .md-tab.md-active,md-tabs.md-THEME_NAME-theme .md-tab.md-active md-icon,md-tabs.md-THEME_NAME-theme .md-tab.md-focused,md-tabs.md-THEME_NAME-theme .md-tab.md-focused md-icon{color:\\\"{{primary-color}}\\\"}md-tabs.md-THEME_NAME-theme .md-tab.md-focused{background:\\\"{{primary-color-0.1}}\\\"}md-tabs.md-THEME_NAME-theme .md-tab .md-ripple-container{color:\\\"{{accent-A100}}\\\"}md-tabs.md-THEME_NAME-theme.md-accent>md-tabs-wrapper{background-color:\\\"{{accent-color}}\\\"}md-tabs.md-THEME_NAME-theme.md-accent>md-tabs-wrapper>md-tabs-canvas>md-pagination-wrapper>md-tab-item:not([disabled]),md-tabs.md-THEME_NAME-theme.md-accent>md-tabs-wrapper>md-tabs-canvas>md-pagination-wrapper>md-tab-item:not([disabled]) md-icon{color:\\\"{{accent-A100}}\\\"}md-tabs.md-THEME_NAME-theme.md-accent>md-tabs-wrapper>md-tabs-canvas>md-pagination-wrapper>md-tab-item:not([disabled]).md-active,md-tabs.md-THEME_NAME-theme.md-accent>md-tabs-wrapper>md-tabs-canvas>md-pagination-wrapper>md-tab-item:not([disabled]).md-active md-icon,md-tabs.md-THEME_NAME-theme.md-accent>md-tabs-wrapper>md-tabs-canvas>md-pagination-wrapper>md-tab-item:not([disabled]).md-focused,md-tabs.md-THEME_NAME-theme.md-accent>md-tabs-wrapper>md-tabs-canvas>md-pagination-wrapper>md-tab-item:not([disabled]).md-focused md-icon{color:\\\"{{accent-contrast}}\\\"}md-tabs.md-THEME_NAME-theme.md-accent>md-tabs-wrapper>md-tabs-canvas>md-pagination-wrapper>md-tab-item:not([disabled]).md-focused{background:\\\"{{accent-contrast-0.1}}\\\"}md-tabs.md-THEME_NAME-theme.md-accent>md-tabs-wrapper>md-tabs-canvas>md-pagination-wrapper>md-ink-bar{color:\\\"{{primary-600-1}}\\\";background:\\\"{{primary-600-1}}\\\"}md-tabs.md-THEME_NAME-theme.md-primary>md-tabs-wrapper{background-color:\\\"{{primary-color}}\\\"}md-tabs.md-THEME_NAME-theme.md-primary>md-tabs-wrapper>md-tabs-canvas>md-pagination-wrapper>md-tab-item:not([disabled]),md-tabs.md-THEME_NAME-theme.md-primary>md-tabs-wrapper>md-tabs-canvas>md-pagination-wrapper>md-tab-item:not([disabled]) md-icon{color:\\\"{{primary-100}}\\\"}md-tabs.md-THEME_NAME-theme.md-primary>md-tabs-wrapper>md-tabs-canvas>md-pagination-wrapper>md-tab-item:not([disabled]).md-active,md-tabs.md-THEME_NAME-theme.md-primary>md-tabs-wrapper>md-tabs-canvas>md-pagination-wrapper>md-tab-item:not([disabled]).md-active md-icon,md-tabs.md-THEME_NAME-theme.md-primary>md-tabs-wrapper>md-tabs-canvas>md-pagination-wrapper>md-tab-item:not([disabled]).md-focused,md-tabs.md-THEME_NAME-theme.md-primary>md-tabs-wrapper>md-tabs-canvas>md-pagination-wrapper>md-tab-item:not([disabled]).md-focused md-icon{color:\\\"{{primary-contrast}}\\\"}md-tabs.md-THEME_NAME-theme.md-primary>md-tabs-wrapper>md-tabs-canvas>md-pagination-wrapper>md-tab-item:not([disabled]).md-focused{background:\\\"{{primary-contrast-0.1}}\\\"}md-tabs.md-THEME_NAME-theme.md-warn>md-tabs-wrapper{background-color:\\\"{{warn-color}}\\\"}md-tabs.md-THEME_NAME-theme.md-warn>md-tabs-wrapper>md-tabs-canvas>md-pagination-wrapper>md-tab-item:not([disabled]),md-tabs.md-THEME_NAME-theme.md-warn>md-tabs-wrapper>md-tabs-canvas>md-pagination-wrapper>md-tab-item:not([disabled]) md-icon{color:\\\"{{warn-100}}\\\"}md-tabs.md-THEME_NAME-theme.md-warn>md-tabs-wrapper>md-tabs-canvas>md-pagination-wrapper>md-tab-item:not([disabled]).md-active,md-tabs.md-THEME_NAME-theme.md-warn>md-tabs-wrapper>md-tabs-canvas>md-pagination-wrapper>md-tab-item:not([disabled]).md-active md-icon,md-tabs.md-THEME_NAME-theme.md-warn>md-tabs-wrapper>md-tabs-canvas>md-pagination-wrapper>md-tab-item:not([disabled]).md-focused,md-tabs.md-THEME_NAME-theme.md-warn>md-tabs-wrapper>md-tabs-canvas>md-pagination-wrapper>md-tab-item:not([disabled]).md-focused md-icon{color:\\\"{{warn-contrast}}\\\"}md-tabs.md-THEME_NAME-theme.md-warn>md-tabs-wrapper>md-tabs-canvas>md-pagination-wrapper>md-tab-item:not([disabled]).md-focused{background:\\\"{{warn-contrast-0.1}}\\\"}md-toolbar>md-tabs.md-THEME_NAME-theme>md-tabs-wrapper{background-color:\\\"{{primary-color}}\\\"}md-toolbar>md-tabs.md-THEME_NAME-theme>md-tabs-wrapper>md-tabs-canvas>md-pagination-wrapper>md-tab-item:not([disabled]),md-toolbar>md-tabs.md-THEME_NAME-theme>md-tabs-wrapper>md-tabs-canvas>md-pagination-wrapper>md-tab-item:not([disabled]) md-icon{color:\\\"{{primary-100}}\\\"}md-toolbar>md-tabs.md-THEME_NAME-theme>md-tabs-wrapper>md-tabs-canvas>md-pagination-wrapper>md-tab-item:not([disabled]).md-active,md-toolbar>md-tabs.md-THEME_NAME-theme>md-tabs-wrapper>md-tabs-canvas>md-pagination-wrapper>md-tab-item:not([disabled]).md-active md-icon,md-toolbar>md-tabs.md-THEME_NAME-theme>md-tabs-wrapper>md-tabs-canvas>md-pagination-wrapper>md-tab-item:not([disabled]).md-focused,md-toolbar>md-tabs.md-THEME_NAME-theme>md-tabs-wrapper>md-tabs-canvas>md-pagination-wrapper>md-tab-item:not([disabled]).md-focused md-icon{color:\\\"{{primary-contrast}}\\\"}md-toolbar>md-tabs.md-THEME_NAME-theme>md-tabs-wrapper>md-tabs-canvas>md-pagination-wrapper>md-tab-item:not([disabled]).md-focused{background:\\\"{{primary-contrast-0.1}}\\\"}md-toolbar.md-accent>md-tabs.md-THEME_NAME-theme>md-tabs-wrapper{background-color:\\\"{{accent-color}}\\\"}md-toolbar.md-accent>md-tabs.md-THEME_NAME-theme>md-tabs-wrapper>md-tabs-canvas>md-pagination-wrapper>md-tab-item:not([disabled]),md-toolbar.md-accent>md-tabs.md-THEME_NAME-theme>md-tabs-wrapper>md-tabs-canvas>md-pagination-wrapper>md-tab-item:not([disabled]) md-icon{color:\\\"{{accent-A100}}\\\"}md-toolbar.md-accent>md-tabs.md-THEME_NAME-theme>md-tabs-wrapper>md-tabs-canvas>md-pagination-wrapper>md-tab-item:not([disabled]).md-active,md-toolbar.md-accent>md-tabs.md-THEME_NAME-theme>md-tabs-wrapper>md-tabs-canvas>md-pagination-wrapper>md-tab-item:not([disabled]).md-active md-icon,md-toolbar.md-accent>md-tabs.md-THEME_NAME-theme>md-tabs-wrapper>md-tabs-canvas>md-pagination-wrapper>md-tab-item:not([disabled]).md-focused,md-toolbar.md-accent>md-tabs.md-THEME_NAME-theme>md-tabs-wrapper>md-tabs-canvas>md-pagination-wrapper>md-tab-item:not([disabled]).md-focused md-icon{color:\\\"{{accent-contrast}}\\\"}md-toolbar.md-accent>md-tabs.md-THEME_NAME-theme>md-tabs-wrapper>md-tabs-canvas>md-pagination-wrapper>md-tab-item:not([disabled]).md-focused{background:\\\"{{accent-contrast-0.1}}\\\"}md-toolbar.md-accent>md-tabs.md-THEME_NAME-theme>md-tabs-wrapper>md-tabs-canvas>md-pagination-wrapper>md-ink-bar{color:\\\"{{primary-600-1}}\\\";background:\\\"{{primary-600-1}}\\\"}md-toolbar.md-warn>md-tabs.md-THEME_NAME-theme>md-tabs-wrapper{background-color:\\\"{{warn-color}}\\\"}md-toolbar.md-warn>md-tabs.md-THEME_NAME-theme>md-tabs-wrapper>md-tabs-canvas>md-pagination-wrapper>md-tab-item:not([disabled]),md-toolbar.md-warn>md-tabs.md-THEME_NAME-theme>md-tabs-wrapper>md-tabs-canvas>md-pagination-wrapper>md-tab-item:not([disabled]) md-icon{color:\\\"{{warn-100}}\\\"}md-toolbar.md-warn>md-tabs.md-THEME_NAME-theme>md-tabs-wrapper>md-tabs-canvas>md-pagination-wrapper>md-tab-item:not([disabled]).md-active,md-toolbar.md-warn>md-tabs.md-THEME_NAME-theme>md-tabs-wrapper>md-tabs-canvas>md-pagination-wrapper>md-tab-item:not([disabled]).md-active md-icon,md-toolbar.md-warn>md-tabs.md-THEME_NAME-theme>md-tabs-wrapper>md-tabs-canvas>md-pagination-wrapper>md-tab-item:not([disabled]).md-focused,md-toolbar.md-warn>md-tabs.md-THEME_NAME-theme>md-tabs-wrapper>md-tabs-canvas>md-pagination-wrapper>md-tab-item:not([disabled]).md-focused md-icon{color:\\\"{{warn-contrast}}\\\"}md-toolbar.md-warn>md-tabs.md-THEME_NAME-theme>md-tabs-wrapper>md-tabs-canvas>md-pagination-wrapper>md-tab-item:not([disabled]).md-focused{background:\\\"{{warn-contrast-0.1}}\\\"}md-toast.md-THEME_NAME-theme .md-toast-content{background-color:#323232;color:\\\"{{background-50}}\\\"}md-toast.md-THEME_NAME-theme .md-toast-content .md-button{color:\\\"{{background-50}}\\\"}md-toast.md-THEME_NAME-theme .md-toast-content .md-button.md-highlight{color:\\\"{{accent-color}}\\\"}md-toast.md-THEME_NAME-theme .md-toast-content .md-button.md-highlight.md-primary{color:\\\"{{primary-color}}\\\"}md-toast.md-THEME_NAME-theme .md-toast-content .md-button.md-highlight.md-warn{color:\\\"{{warn-color}}\\\"}md-toolbar.md-THEME_NAME-theme:not(.md-menu-toolbar){background-color:\\\"{{primary-color}}\\\";color:\\\"{{primary-contrast}}\\\"}md-toolbar.md-THEME_NAME-theme:not(.md-menu-toolbar) md-icon{color:\\\"{{primary-contrast}}\\\";fill:\\\"{{primary-contrast}}\\\"}md-toolbar.md-THEME_NAME-theme:not(.md-menu-toolbar) .md-button[disabled] md-icon{color:\\\"{{primary-contrast-0.26}}\\\";fill:\\\"{{primary-contrast-0.26}}\\\"}md-toolbar.md-THEME_NAME-theme:not(.md-menu-toolbar).md-accent{background-color:\\\"{{accent-color}}\\\";color:\\\"{{accent-contrast}}\\\"}md-toolbar.md-THEME_NAME-theme:not(.md-menu-toolbar).md-accent .md-ink-ripple{color:\\\"{{accent-contrast}}\\\"}md-toolbar.md-THEME_NAME-theme:not(.md-menu-toolbar).md-accent md-icon{color:\\\"{{accent-contrast}}\\\";fill:\\\"{{accent-contrast}}\\\"}md-toolbar.md-THEME_NAME-theme:not(.md-menu-toolbar).md-accent .md-button[disabled] md-icon{color:\\\"{{accent-contrast-0.26}}\\\";fill:\\\"{{accent-contrast-0.26}}\\\"}md-toolbar.md-THEME_NAME-theme:not(.md-menu-toolbar).md-warn{background-color:\\\"{{warn-color}}\\\";color:\\\"{{warn-contrast}}\\\"}.md-panel.md-tooltip.md-THEME_NAME-theme{color:\\\"{{background-700-contrast}}\\\";background-color:\\\"{{background-700}}\\\"}body.md-THEME_NAME-theme,html.md-THEME_NAME-theme{color:\\\"{{foreground-1}}\\\";background-color:\\\"{{background-color}}\\\"}\"); \n})();\n\n\n})(window, window.angular);;window.ngMaterial={version:{full: \"1.1.4\"}};\n/**\n * @license AngularJS v1.6.4\n * (c) 2010-2017 Google, Inc. http://angularjs.org\n * License: MIT\n */\n(function(window, angular) {'use strict';\n\nvar $resourceMinErr = angular.$$minErr('$resource');\n\n// Helper functions and regex to lookup a dotted path on an object\n// stopping at undefined/null.  The path must be composed of ASCII\n// identifiers (just like $parse)\nvar MEMBER_NAME_REGEX = /^(\\.[a-zA-Z_$@][0-9a-zA-Z_$@]*)+$/;\n\nfunction isValidDottedPath(path) {\n  return (path != null && path !== '' && path !== 'hasOwnProperty' &&\n      MEMBER_NAME_REGEX.test('.' + path));\n}\n\nfunction lookupDottedPath(obj, path) {\n  if (!isValidDottedPath(path)) {\n    throw $resourceMinErr('badmember', 'Dotted member path \"@{0}\" is invalid.', path);\n  }\n  var keys = path.split('.');\n  for (var i = 0, ii = keys.length; i < ii && angular.isDefined(obj); i++) {\n    var key = keys[i];\n    obj = (obj !== null) ? obj[key] : undefined;\n  }\n  return obj;\n}\n\n/**\n * Create a shallow copy of an object and clear other fields from the destination\n */\nfunction shallowClearAndCopy(src, dst) {\n  dst = dst || {};\n\n  angular.forEach(dst, function(value, key) {\n    delete dst[key];\n  });\n\n  for (var key in src) {\n    if (src.hasOwnProperty(key) && !(key.charAt(0) === '$' && key.charAt(1) === '$')) {\n      dst[key] = src[key];\n    }\n  }\n\n  return dst;\n}\n\n/**\n * @ngdoc module\n * @name ngResource\n * @description\n *\n * # ngResource\n *\n * The `ngResource` module provides interaction support with RESTful services\n * via the $resource service.\n *\n *\n * <div doc-module-components=\"ngResource\"></div>\n *\n * See {@link ngResource.$resourceProvider} and {@link ngResource.$resource} for usage.\n */\n\n/**\n * @ngdoc provider\n * @name $resourceProvider\n *\n * @description\n *\n * Use `$resourceProvider` to change the default behavior of the {@link ngResource.$resource}\n * service.\n *\n * ## Dependencies\n * Requires the {@link ngResource } module to be installed.\n *\n */\n\n/**\n * @ngdoc service\n * @name $resource\n * @requires $http\n * @requires ng.$log\n * @requires $q\n * @requires ng.$timeout\n *\n * @description\n * A factory which creates a resource object that lets you interact with\n * [RESTful](http://en.wikipedia.org/wiki/Representational_State_Transfer) server-side data sources.\n *\n * The returned resource object has action methods which provide high-level behaviors without\n * the need to interact with the low level {@link ng.$http $http} service.\n *\n * Requires the {@link ngResource `ngResource`} module to be installed.\n *\n * By default, trailing slashes will be stripped from the calculated URLs,\n * which can pose problems with server backends that do not expect that\n * behavior.  This can be disabled by configuring the `$resourceProvider` like\n * this:\n *\n * ```js\n     app.config(['$resourceProvider', function($resourceProvider) {\n       // Don't strip trailing slashes from calculated URLs\n       $resourceProvider.defaults.stripTrailingSlashes = false;\n     }]);\n * ```\n *\n * @param {string} url A parameterized URL template with parameters prefixed by `:` as in\n *   `/user/:username`. If you are using a URL with a port number (e.g.\n *   `http://example.com:8080/api`), it will be respected.\n *\n *   If you are using a url with a suffix, just add the suffix, like this:\n *   `$resource('http://example.com/resource.json')` or `$resource('http://example.com/:id.json')`\n *   or even `$resource('http://example.com/resource/:resource_id.:format')`\n *   If the parameter before the suffix is empty, :resource_id in this case, then the `/.` will be\n *   collapsed down to a single `.`.  If you need this sequence to appear and not collapse then you\n *   can escape it with `/\\.`.\n *\n * @param {Object=} paramDefaults Default values for `url` parameters. These can be overridden in\n *   `actions` methods. If a parameter value is a function, it will be called every time\n *   a param value needs to be obtained for a request (unless the param was overridden). The function\n *   will be passed the current data value as an argument.\n *\n *   Each key value in the parameter object is first bound to url template if present and then any\n *   excess keys are appended to the url search query after the `?`.\n *\n *   Given a template `/path/:verb` and parameter `{verb:'greet', salutation:'Hello'}` results in\n *   URL `/path/greet?salutation=Hello`.\n *\n *   If the parameter value is prefixed with `@`, then the value for that parameter will be\n *   extracted from the corresponding property on the `data` object (provided when calling actions\n *   with a request body).\n *   For example, if the `defaultParam` object is `{someParam: '@someProp'}` then the value of\n *   `someParam` will be `data.someProp`.\n *   Note that the parameter will be ignored, when calling a \"GET\" action method (i.e. an action\n *   method that does not accept a request body)\n *\n * @param {Object.<Object>=} actions Hash with declaration of custom actions that will be available\n *   in addition to the default set of resource actions (see below). If a custom action has the same\n *   key as a default action (e.g. `save`), then the default action will be *overwritten*, and not\n *   extended.\n *\n *   The declaration should be created in the format of {@link ng.$http#usage $http.config}:\n *\n *       {action1: {method:?, params:?, isArray:?, headers:?, ...},\n *        action2: {method:?, params:?, isArray:?, headers:?, ...},\n *        ...}\n *\n *   Where:\n *\n *   - **`action`** – {string} – The name of action. This name becomes the name of the method on\n *     your resource object.\n *   - **`method`** – {string} – Case insensitive HTTP method (e.g. `GET`, `POST`, `PUT`,\n *     `DELETE`, `JSONP`, etc).\n *   - **`params`** – {Object=} – Optional set of pre-bound parameters for this action. If any of\n *     the parameter value is a function, it will be called every time when a param value needs to\n *     be obtained for a request (unless the param was overridden). The function will be passed the\n *     current data value as an argument.\n *   - **`url`** – {string} – action specific `url` override. The url templating is supported just\n *     like for the resource-level urls.\n *   - **`isArray`** – {boolean=} – If true then the returned object for this action is an array,\n *     see `returns` section.\n *   - **`transformRequest`** –\n *     `{function(data, headersGetter)|Array.<function(data, headersGetter)>}` –\n *     transform function or an array of such functions. The transform function takes the http\n *     request body and headers and returns its transformed (typically serialized) version.\n *     By default, transformRequest will contain one function that checks if the request data is\n *     an object and serializes it using `angular.toJson`. To prevent this behavior, set\n *     `transformRequest` to an empty array: `transformRequest: []`\n *   - **`transformResponse`** –\n *     `{function(data, headersGetter, status)|Array.<function(data, headersGetter, status)>}` –\n *     transform function or an array of such functions. The transform function takes the http\n *     response body, headers and status and returns its transformed (typically deserialized)\n *     version.\n *     By default, transformResponse will contain one function that checks if the response looks\n *     like a JSON string and deserializes it using `angular.fromJson`. To prevent this behavior,\n *     set `transformResponse` to an empty array: `transformResponse: []`\n *   - **`cache`** – `{boolean|Cache}` – If true, a default $http cache will be used to cache the\n *     GET request, otherwise if a cache instance built with\n *     {@link ng.$cacheFactory $cacheFactory} is supplied, this cache will be used for\n *     caching.\n *   - **`timeout`** – `{number}` – timeout in milliseconds.<br />\n *     **Note:** In contrast to {@link ng.$http#usage $http.config}, {@link ng.$q promises} are\n *     **not** supported in $resource, because the same value would be used for multiple requests.\n *     If you are looking for a way to cancel requests, you should use the `cancellable` option.\n *   - **`cancellable`** – `{boolean}` – if set to true, the request made by a \"non-instance\" call\n *     will be cancelled (if not already completed) by calling `$cancelRequest()` on the call's\n *     return value. Calling `$cancelRequest()` for a non-cancellable or an already\n *     completed/cancelled request will have no effect.<br />\n *   - **`withCredentials`** - `{boolean}` - whether to set the `withCredentials` flag on the\n *     XHR object. See\n *     [requests with credentials](https://developer.mozilla.org/en/http_access_control#section_5)\n *     for more information.\n *   - **`responseType`** - `{string}` - see\n *     [requestType](https://developer.mozilla.org/en-US/docs/DOM/XMLHttpRequest#responseType).\n *   - **`interceptor`** - `{Object=}` - The interceptor object has two optional methods -\n *     `response` and `responseError`. Both `response` and `responseError` interceptors get called\n *     with `http response` object. See {@link ng.$http $http interceptors}.\n *   - **`hasBody`** - `{boolean}` - allows to specify if a request body should be included or not.\n *     If not specified only POST, PUT and PATCH requests will have a body.\n *\n * @param {Object} options Hash with custom settings that should extend the\n *   default `$resourceProvider` behavior.  The supported options are:\n *\n *   - **`stripTrailingSlashes`** – {boolean} – If true then the trailing\n *   slashes from any calculated URL will be stripped. (Defaults to true.)\n *   - **`cancellable`** – {boolean} – If true, the request made by a \"non-instance\" call will be\n *   cancelled (if not already completed) by calling `$cancelRequest()` on the call's return value.\n *   This can be overwritten per action. (Defaults to false.)\n *\n * @returns {Object} A resource \"class\" object with methods for the default set of resource actions\n *   optionally extended with custom `actions`. The default set contains these actions:\n *   ```js\n *   { 'get':    {method:'GET'},\n *     'save':   {method:'POST'},\n *     'query':  {method:'GET', isArray:true},\n *     'remove': {method:'DELETE'},\n *     'delete': {method:'DELETE'} };\n *   ```\n *\n *   Calling these methods invoke an {@link ng.$http} with the specified http method,\n *   destination and parameters. When the data is returned from the server then the object is an\n *   instance of the resource class. The actions `save`, `remove` and `delete` are available on it\n *   as  methods with the `$` prefix. This allows you to easily perform CRUD operations (create,\n *   read, update, delete) on server-side data like this:\n *   ```js\n *   var User = $resource('/user/:userId', {userId:'@id'});\n *   var user = User.get({userId:123}, function() {\n *     user.abc = true;\n *     user.$save();\n *   });\n *   ```\n *\n *   It is important to realize that invoking a $resource object method immediately returns an\n *   empty reference (object or array depending on `isArray`). Once the data is returned from the\n *   server the existing reference is populated with the actual data. This is a useful trick since\n *   usually the resource is assigned to a model which is then rendered by the view. Having an empty\n *   object results in no rendering, once the data arrives from the server then the object is\n *   populated with the data and the view automatically re-renders itself showing the new data. This\n *   means that in most cases one never has to write a callback function for the action methods.\n *\n *   The action methods on the class object or instance object can be invoked with the following\n *   parameters:\n *\n *   - \"class\" actions without a body: `Resource.action([parameters], [success], [error])`\n *   - \"class\" actions with a body: `Resource.action([parameters], postData, [success], [error])`\n *   - instance actions: `instance.$action([parameters], [success], [error])`\n *\n *\n *   When calling instance methods, the instance itself is used as the request body (if the action\n *   should have a body). By default, only actions using `POST`, `PUT` or `PATCH` have request\n *   bodies, but you can use the `hasBody` configuration option to specify whether an action\n *   should have a body or not (regardless of its HTTP method).\n *\n *\n *   Success callback is called with (value (Object|Array), responseHeaders (Function),\n *   status (number), statusText (string)) arguments, where the value is the populated resource\n *   instance or collection object. The error callback is called with (httpResponse) argument.\n *\n *   Class actions return empty instance (with additional properties below).\n *   Instance actions return promise of the action.\n *\n *   The Resource instances and collections have these additional properties:\n *\n *   - `$promise`: the {@link ng.$q promise} of the original server interaction that created this\n *     instance or collection.\n *\n *     On success, the promise is resolved with the same resource instance or collection object,\n *     updated with data from server. This makes it easy to use in\n *     {@link ngRoute.$routeProvider resolve section of $routeProvider.when()} to defer view\n *     rendering until the resource(s) are loaded.\n *\n *     On failure, the promise is rejected with the {@link ng.$http http response} object, without\n *     the `resource` property.\n *\n *     If an interceptor object was provided, the promise will instead be resolved with the value\n *     returned by the interceptor.\n *\n *   - `$resolved`: `true` after first server interaction is completed (either with success or\n *      rejection), `false` before that. Knowing if the Resource has been resolved is useful in\n *      data-binding.\n *\n *   The Resource instances and collections have these additional methods:\n *\n *   - `$cancelRequest`: If there is a cancellable, pending request related to the instance or\n *      collection, calling this method will abort the request.\n *\n *   The Resource instances have these additional methods:\n *\n *   - `toJSON`: It returns a simple object without any of the extra properties added as part of\n *     the Resource API. This object can be serialized through {@link angular.toJson} safely\n *     without attaching Angular-specific fields. Notice that `JSON.stringify` (and\n *     `angular.toJson`) automatically use this method when serializing a Resource instance\n *     (see [MDN](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/JSON/stringify#toJSON%28%29_behavior)).\n *\n * @example\n *\n * # Credit card resource\n *\n * ```js\n     // Define CreditCard class\n     var CreditCard = $resource('/user/:userId/card/:cardId',\n      {userId:123, cardId:'@id'}, {\n       charge: {method:'POST', params:{charge:true}}\n      });\n\n     // We can retrieve a collection from the server\n     var cards = CreditCard.query(function() {\n       // GET: /user/123/card\n       // server returns: [ {id:456, number:'1234', name:'Smith'} ];\n\n       var card = cards[0];\n       // each item is an instance of CreditCard\n       expect(card instanceof CreditCard).toEqual(true);\n       card.name = \"J. Smith\";\n       // non GET methods are mapped onto the instances\n       card.$save();\n       // POST: /user/123/card/456 {id:456, number:'1234', name:'J. Smith'}\n       // server returns: {id:456, number:'1234', name: 'J. Smith'};\n\n       // our custom method is mapped as well.\n       card.$charge({amount:9.99});\n       // POST: /user/123/card/456?amount=9.99&charge=true {id:456, number:'1234', name:'J. Smith'}\n     });\n\n     // we can create an instance as well\n     var newCard = new CreditCard({number:'0123'});\n     newCard.name = \"Mike Smith\";\n     newCard.$save();\n     // POST: /user/123/card {number:'0123', name:'Mike Smith'}\n     // server returns: {id:789, number:'0123', name: 'Mike Smith'};\n     expect(newCard.id).toEqual(789);\n * ```\n *\n * The object returned from this function execution is a resource \"class\" which has \"static\" method\n * for each action in the definition.\n *\n * Calling these methods invoke `$http` on the `url` template with the given `method`, `params` and\n * `headers`.\n *\n * @example\n *\n * # User resource\n *\n * When the data is returned from the server then the object is an instance of the resource type and\n * all of the non-GET methods are available with `$` prefix. This allows you to easily support CRUD\n * operations (create, read, update, delete) on server-side data.\n\n   ```js\n     var User = $resource('/user/:userId', {userId:'@id'});\n     User.get({userId:123}, function(user) {\n       user.abc = true;\n       user.$save();\n     });\n   ```\n *\n * It's worth noting that the success callback for `get`, `query` and other methods gets passed\n * in the response that came from the server as well as $http header getter function, so one\n * could rewrite the above example and get access to http headers as:\n *\n   ```js\n     var User = $resource('/user/:userId', {userId:'@id'});\n     User.get({userId:123}, function(user, getResponseHeaders){\n       user.abc = true;\n       user.$save(function(user, putResponseHeaders) {\n         //user => saved user object\n         //putResponseHeaders => $http header getter\n       });\n     });\n   ```\n *\n * You can also access the raw `$http` promise via the `$promise` property on the object returned\n *\n   ```\n     var User = $resource('/user/:userId', {userId:'@id'});\n     User.get({userId:123})\n         .$promise.then(function(user) {\n           $scope.user = user;\n         });\n   ```\n *\n * @example\n *\n * # Creating a custom 'PUT' request\n *\n * In this example we create a custom method on our resource to make a PUT request\n * ```js\n *    var app = angular.module('app', ['ngResource', 'ngRoute']);\n *\n *    // Some APIs expect a PUT request in the format URL/object/ID\n *    // Here we are creating an 'update' method\n *    app.factory('Notes', ['$resource', function($resource) {\n *    return $resource('/notes/:id', null,\n *        {\n *            'update': { method:'PUT' }\n *        });\n *    }]);\n *\n *    // In our controller we get the ID from the URL using ngRoute and $routeParams\n *    // We pass in $routeParams and our Notes factory along with $scope\n *    app.controller('NotesCtrl', ['$scope', '$routeParams', 'Notes',\n                                      function($scope, $routeParams, Notes) {\n *    // First get a note object from the factory\n *    var note = Notes.get({ id:$routeParams.id });\n *    $id = note.id;\n *\n *    // Now call update passing in the ID first then the object you are updating\n *    Notes.update({ id:$id }, note);\n *\n *    // This will PUT /notes/ID with the note object in the request payload\n *    }]);\n * ```\n *\n * @example\n *\n * # Cancelling requests\n *\n * If an action's configuration specifies that it is cancellable, you can cancel the request related\n * to an instance or collection (as long as it is a result of a \"non-instance\" call):\n *\n   ```js\n     // ...defining the `Hotel` resource...\n     var Hotel = $resource('/api/hotel/:id', {id: '@id'}, {\n       // Let's make the `query()` method cancellable\n       query: {method: 'get', isArray: true, cancellable: true}\n     });\n\n     // ...somewhere in the PlanVacationController...\n     ...\n     this.onDestinationChanged = function onDestinationChanged(destination) {\n       // We don't care about any pending request for hotels\n       // in a different destination any more\n       this.availableHotels.$cancelRequest();\n\n       // Let's query for hotels in '<destination>'\n       // (calls: /api/hotel?location=<destination>)\n       this.availableHotels = Hotel.query({location: destination});\n     };\n   ```\n *\n */\nangular.module('ngResource', ['ng']).\n  info({ angularVersion: '1.6.4' }).\n  provider('$resource', function ResourceProvider() {\n    var PROTOCOL_AND_IPV6_REGEX = /^https?:\\/\\/\\[[^\\]]*][^/]*/;\n\n    var provider = this;\n\n    /**\n     * @ngdoc property\n     * @name $resourceProvider#defaults\n     * @description\n     * Object containing default options used when creating `$resource` instances.\n     *\n     * The default values satisfy a wide range of usecases, but you may choose to overwrite any of\n     * them to further customize your instances. The available properties are:\n     *\n     * - **stripTrailingSlashes** – `{boolean}` – If true, then the trailing slashes from any\n     *   calculated URL will be stripped.<br />\n     *   (Defaults to true.)\n     * - **cancellable** – `{boolean}` – If true, the request made by a \"non-instance\" call will be\n     *   cancelled (if not already completed) by calling `$cancelRequest()` on the call's return\n     *   value. For more details, see {@link ngResource.$resource}. This can be overwritten per\n     *   resource class or action.<br />\n     *   (Defaults to false.)\n     * - **actions** - `{Object.<Object>}` - A hash with default actions declarations. Actions are\n     *   high-level methods corresponding to RESTful actions/methods on resources. An action may\n     *   specify what HTTP method to use, what URL to hit, if the return value will be a single\n     *   object or a collection (array) of objects etc. For more details, see\n     *   {@link ngResource.$resource}. The actions can also be enhanced or overwritten per resource\n     *   class.<br />\n     *   The default actions are:\n     *   ```js\n     *   {\n     *     get: {method: 'GET'},\n     *     save: {method: 'POST'},\n     *     query: {method: 'GET', isArray: true},\n     *     remove: {method: 'DELETE'},\n     *     delete: {method: 'DELETE'}\n     *   }\n     *   ```\n     *\n     * #### Example\n     *\n     * For example, you can specify a new `update` action that uses the `PUT` HTTP verb:\n     *\n     * ```js\n     *   angular.\n     *     module('myApp').\n     *     config(['$resourceProvider', function ($resourceProvider) {\n     *       $resourceProvider.defaults.actions.update = {\n     *         method: 'PUT'\n     *       };\n     *     });\n     * ```\n     *\n     * Or you can even overwrite the whole `actions` list and specify your own:\n     *\n     * ```js\n     *   angular.\n     *     module('myApp').\n     *     config(['$resourceProvider', function ($resourceProvider) {\n     *       $resourceProvider.defaults.actions = {\n     *         create: {method: 'POST'},\n     *         get:    {method: 'GET'},\n     *         getAll: {method: 'GET', isArray:true},\n     *         update: {method: 'PUT'},\n     *         delete: {method: 'DELETE'}\n     *       };\n     *     });\n     * ```\n     *\n     */\n    this.defaults = {\n      // Strip slashes by default\n      stripTrailingSlashes: true,\n\n      // Make non-instance requests cancellable (via `$cancelRequest()`)\n      cancellable: false,\n\n      // Default actions configuration\n      actions: {\n        'get': {method: 'GET'},\n        'save': {method: 'POST'},\n        'query': {method: 'GET', isArray: true},\n        'remove': {method: 'DELETE'},\n        'delete': {method: 'DELETE'}\n      }\n    };\n\n    this.$get = ['$http', '$log', '$q', '$timeout', function($http, $log, $q, $timeout) {\n\n      var noop = angular.noop,\n          forEach = angular.forEach,\n          extend = angular.extend,\n          copy = angular.copy,\n          isArray = angular.isArray,\n          isDefined = angular.isDefined,\n          isFunction = angular.isFunction,\n          isNumber = angular.isNumber,\n          encodeUriQuery = angular.$$encodeUriQuery,\n          encodeUriSegment = angular.$$encodeUriSegment;\n\n      function Route(template, defaults) {\n        this.template = template;\n        this.defaults = extend({}, provider.defaults, defaults);\n        this.urlParams = {};\n      }\n\n      Route.prototype = {\n        setUrlParams: function(config, params, actionUrl) {\n          var self = this,\n            url = actionUrl || self.template,\n            val,\n            encodedVal,\n            protocolAndIpv6 = '';\n\n          var urlParams = self.urlParams = Object.create(null);\n          forEach(url.split(/\\W/), function(param) {\n            if (param === 'hasOwnProperty') {\n              throw $resourceMinErr('badname', 'hasOwnProperty is not a valid parameter name.');\n            }\n            if (!(new RegExp('^\\\\d+$').test(param)) && param &&\n              (new RegExp('(^|[^\\\\\\\\]):' + param + '(\\\\W|$)').test(url))) {\n              urlParams[param] = {\n                isQueryParamValue: (new RegExp('\\\\?.*=:' + param + '(?:\\\\W|$)')).test(url)\n              };\n            }\n          });\n          url = url.replace(/\\\\:/g, ':');\n          url = url.replace(PROTOCOL_AND_IPV6_REGEX, function(match) {\n            protocolAndIpv6 = match;\n            return '';\n          });\n\n          params = params || {};\n          forEach(self.urlParams, function(paramInfo, urlParam) {\n            val = params.hasOwnProperty(urlParam) ? params[urlParam] : self.defaults[urlParam];\n            if (isDefined(val) && val !== null) {\n              if (paramInfo.isQueryParamValue) {\n                encodedVal = encodeUriQuery(val, true);\n              } else {\n                encodedVal = encodeUriSegment(val);\n              }\n              url = url.replace(new RegExp(':' + urlParam + '(\\\\W|$)', 'g'), function(match, p1) {\n                return encodedVal + p1;\n              });\n            } else {\n              url = url.replace(new RegExp('(/?):' + urlParam + '(\\\\W|$)', 'g'), function(match,\n                  leadingSlashes, tail) {\n                if (tail.charAt(0) === '/') {\n                  return tail;\n                } else {\n                  return leadingSlashes + tail;\n                }\n              });\n            }\n          });\n\n          // strip trailing slashes and set the url (unless this behavior is specifically disabled)\n          if (self.defaults.stripTrailingSlashes) {\n            url = url.replace(/\\/+$/, '') || '/';\n          }\n\n          // Collapse `/.` if found in the last URL path segment before the query.\n          // E.g. `http://url.com/id/.format?q=x` becomes `http://url.com/id.format?q=x`.\n          url = url.replace(/\\/\\.(?=\\w+($|\\?))/, '.');\n          // Replace escaped `/\\.` with `/.`.\n          // (If `\\.` comes from a param value, it will be encoded as `%5C.`.)\n          config.url = protocolAndIpv6 + url.replace(/\\/(\\\\|%5C)\\./, '/.');\n\n\n          // set params - delegate param encoding to $http\n          forEach(params, function(value, key) {\n            if (!self.urlParams[key]) {\n              config.params = config.params || {};\n              config.params[key] = value;\n            }\n          });\n        }\n      };\n\n\n      function resourceFactory(url, paramDefaults, actions, options) {\n        var route = new Route(url, options);\n\n        actions = extend({}, provider.defaults.actions, actions);\n\n        function extractParams(data, actionParams) {\n          var ids = {};\n          actionParams = extend({}, paramDefaults, actionParams);\n          forEach(actionParams, function(value, key) {\n            if (isFunction(value)) { value = value(data); }\n            ids[key] = value && value.charAt && value.charAt(0) === '@' ?\n              lookupDottedPath(data, value.substr(1)) : value;\n          });\n          return ids;\n        }\n\n        function defaultResponseInterceptor(response) {\n          return response.resource;\n        }\n\n        function Resource(value) {\n          shallowClearAndCopy(value || {}, this);\n        }\n\n        Resource.prototype.toJSON = function() {\n          var data = extend({}, this);\n          delete data.$promise;\n          delete data.$resolved;\n          delete data.$cancelRequest;\n          return data;\n        };\n\n        forEach(actions, function(action, name) {\n          var hasBody = action.hasBody === true || (action.hasBody !== false && /^(POST|PUT|PATCH)$/i.test(action.method));\n          var numericTimeout = action.timeout;\n          var cancellable = isDefined(action.cancellable) ?\n              action.cancellable : route.defaults.cancellable;\n\n          if (numericTimeout && !isNumber(numericTimeout)) {\n            $log.debug('ngResource:\\n' +\n                       '  Only numeric values are allowed as `timeout`.\\n' +\n                       '  Promises are not supported in $resource, because the same value would ' +\n                       'be used for multiple requests. If you are looking for a way to cancel ' +\n                       'requests, you should use the `cancellable` option.');\n            delete action.timeout;\n            numericTimeout = null;\n          }\n\n          Resource[name] = function(a1, a2, a3, a4) {\n            var params = {}, data, success, error;\n\n            switch (arguments.length) {\n              case 4:\n                error = a4;\n                success = a3;\n                // falls through\n              case 3:\n              case 2:\n                if (isFunction(a2)) {\n                  if (isFunction(a1)) {\n                    success = a1;\n                    error = a2;\n                    break;\n                  }\n\n                  success = a2;\n                  error = a3;\n                  // falls through\n                } else {\n                  params = a1;\n                  data = a2;\n                  success = a3;\n                  break;\n                }\n                // falls through\n              case 1:\n                if (isFunction(a1)) success = a1;\n                else if (hasBody) data = a1;\n                else params = a1;\n                break;\n              case 0: break;\n              default:\n                throw $resourceMinErr('badargs',\n                  'Expected up to 4 arguments [params, data, success, error], got {0} arguments',\n                  arguments.length);\n            }\n\n            var isInstanceCall = this instanceof Resource;\n            var value = isInstanceCall ? data : (action.isArray ? [] : new Resource(data));\n            var httpConfig = {};\n            var responseInterceptor = action.interceptor && action.interceptor.response ||\n              defaultResponseInterceptor;\n            var responseErrorInterceptor = action.interceptor && action.interceptor.responseError ||\n              undefined;\n            var hasError = !!error;\n            var hasResponseErrorInterceptor = !!responseErrorInterceptor;\n            var timeoutDeferred;\n            var numericTimeoutPromise;\n\n            forEach(action, function(value, key) {\n              switch (key) {\n                default:\n                  httpConfig[key] = copy(value);\n                  break;\n                case 'params':\n                case 'isArray':\n                case 'interceptor':\n                case 'cancellable':\n                  break;\n              }\n            });\n\n            if (!isInstanceCall && cancellable) {\n              timeoutDeferred = $q.defer();\n              httpConfig.timeout = timeoutDeferred.promise;\n\n              if (numericTimeout) {\n                numericTimeoutPromise = $timeout(timeoutDeferred.resolve, numericTimeout);\n              }\n            }\n\n            if (hasBody) httpConfig.data = data;\n            route.setUrlParams(httpConfig,\n              extend({}, extractParams(data, action.params || {}), params),\n              action.url);\n\n            var promise = $http(httpConfig).then(function(response) {\n              var data = response.data;\n\n              if (data) {\n                // Need to convert action.isArray to boolean in case it is undefined\n                if (isArray(data) !== (!!action.isArray)) {\n                  throw $resourceMinErr('badcfg',\n                      'Error in resource configuration for action `{0}`. Expected response to ' +\n                      'contain an {1} but got an {2} (Request: {3} {4})', name, action.isArray ? 'array' : 'object',\n                    isArray(data) ? 'array' : 'object', httpConfig.method, httpConfig.url);\n                }\n                if (action.isArray) {\n                  value.length = 0;\n                  forEach(data, function(item) {\n                    if (typeof item === 'object') {\n                      value.push(new Resource(item));\n                    } else {\n                      // Valid JSON values may be string literals, and these should not be converted\n                      // into objects. These items will not have access to the Resource prototype\n                      // methods, but unfortunately there\n                      value.push(item);\n                    }\n                  });\n                } else {\n                  var promise = value.$promise;     // Save the promise\n                  shallowClearAndCopy(data, value);\n                  value.$promise = promise;         // Restore the promise\n                }\n              }\n              response.resource = value;\n\n              return response;\n            });\n\n            promise = promise['finally'](function() {\n              value.$resolved = true;\n              if (!isInstanceCall && cancellable) {\n                value.$cancelRequest = noop;\n                $timeout.cancel(numericTimeoutPromise);\n                timeoutDeferred = numericTimeoutPromise = httpConfig.timeout = null;\n              }\n            });\n\n            promise = promise.then(\n              function(response) {\n                var value = responseInterceptor(response);\n                (success || noop)(value, response.headers, response.status, response.statusText);\n                return value;\n              },\n              (hasError || hasResponseErrorInterceptor) ?\n                function(response) {\n                  if (hasError && !hasResponseErrorInterceptor) {\n                    // Avoid `Possibly Unhandled Rejection` error,\n                    // but still fulfill the returned promise with a rejection\n                    promise.catch(noop);\n                  }\n                  if (hasError) error(response);\n                  return hasResponseErrorInterceptor ?\n                    responseErrorInterceptor(response) :\n                    $q.reject(response);\n                } :\n                undefined);\n\n            if (!isInstanceCall) {\n              // we are creating instance / collection\n              // - set the initial promise\n              // - return the instance / collection\n              value.$promise = promise;\n              value.$resolved = false;\n              if (cancellable) value.$cancelRequest = cancelRequest;\n\n              return value;\n            }\n\n            // instance call\n            return promise;\n\n            function cancelRequest(value) {\n              promise.catch(noop);\n              timeoutDeferred.resolve(value);\n            }\n          };\n\n\n          Resource.prototype['$' + name] = function(params, success, error) {\n            if (isFunction(params)) {\n              error = success; success = params; params = {};\n            }\n            var result = Resource[name].call(this, params, this, success, error);\n            return result.$promise || result;\n          };\n        });\n\n        Resource.bind = function(additionalParamDefaults) {\n          var extendedParamDefaults = extend({}, paramDefaults, additionalParamDefaults);\n          return resourceFactory(url, extendedParamDefaults, actions, options);\n        };\n\n        return Resource;\n      }\n\n      return resourceFactory;\n    }];\n  });\n\n\n})(window, window.angular);\n\n/**\n * @license AngularJS v1.6.4\n * (c) 2010-2017 Google, Inc. http://angularjs.org\n * License: MIT\n */\n(function(window, angular) {'use strict';\n\n/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *\n *     Any commits to this file should be reviewed with security in mind.  *\n *   Changes to this file can potentially create security vulnerabilities. *\n *          An approval from 2 Core members with history of modifying      *\n *                         this file is required.                          *\n *                                                                         *\n *  Does the change somehow allow for arbitrary javascript to be executed? *\n *    Or allows for someone to change the prototype of built-in objects?   *\n *     Or gives undesired access to variables likes document or window?    *\n * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */\n\nvar $sanitizeMinErr = angular.$$minErr('$sanitize');\nvar bind;\nvar extend;\nvar forEach;\nvar isDefined;\nvar lowercase;\nvar noop;\nvar nodeContains;\nvar htmlParser;\nvar htmlSanitizeWriter;\n\n/**\n * @ngdoc module\n * @name ngSanitize\n * @description\n *\n * # ngSanitize\n *\n * The `ngSanitize` module provides functionality to sanitize HTML.\n *\n *\n * <div doc-module-components=\"ngSanitize\"></div>\n *\n * See {@link ngSanitize.$sanitize `$sanitize`} for usage.\n */\n\n/**\n * @ngdoc service\n * @name $sanitize\n * @kind function\n *\n * @description\n *   Sanitizes an html string by stripping all potentially dangerous tokens.\n *\n *   The input is sanitized by parsing the HTML into tokens. All safe tokens (from a whitelist) are\n *   then serialized back to properly escaped html string. This means that no unsafe input can make\n *   it into the returned string.\n *\n *   The whitelist for URL sanitization of attribute values is configured using the functions\n *   `aHrefSanitizationWhitelist` and `imgSrcSanitizationWhitelist` of {@link ng.$compileProvider\n *   `$compileProvider`}.\n *\n *   The input may also contain SVG markup if this is enabled via {@link $sanitizeProvider}.\n *\n * @param {string} html HTML input.\n * @returns {string} Sanitized HTML.\n *\n * @example\n   <example module=\"sanitizeExample\" deps=\"angular-sanitize.js\" name=\"sanitize-service\">\n   <file name=\"index.ced81ed4.html\">\n     <script>\n         angular.module('sanitizeExample', ['ngSanitize'])\n           .controller('ExampleController', ['$scope', '$sce', function($scope, $sce) {\n             $scope.snippet =\n               '<p style=\"color:blue\">an html\\n' +\n               '<em onmouseover=\"this.textContent=\\'PWN3D!\\'\">click here</em>\\n' +\n               'snippet</p>';\n             $scope.deliberatelyTrustDangerousSnippet = function() {\n               return $sce.trustAsHtml($scope.snippet);\n             };\n           }]);\n     </script>\n     <div ng-controller=\"ExampleController\">\n        Snippet: <textarea ng-model=\"snippet\" cols=\"60\" rows=\"3\"></textarea>\n       <table>\n         <tr>\n           <td>Directive</td>\n           <td>How</td>\n           <td>Source</td>\n           <td>Rendered</td>\n         </tr>\n         <tr id=\"bind-html-with-sanitize\">\n           <td>ng-bind-html</td>\n           <td>Automatically uses $sanitize</td>\n           <td><pre>&lt;div ng-bind-html=\"snippet\"&gt;<br/>&lt;/div&gt;</pre></td>\n           <td><div ng-bind-html=\"snippet\"></div></td>\n         </tr>\n         <tr id=\"bind-html-with-trust\">\n           <td>ng-bind-html</td>\n           <td>Bypass $sanitize by explicitly trusting the dangerous value</td>\n           <td>\n           <pre>&lt;div ng-bind-html=\"deliberatelyTrustDangerousSnippet()\"&gt;\n&lt;/div&gt;</pre>\n           </td>\n           <td><div ng-bind-html=\"deliberatelyTrustDangerousSnippet()\"></div></td>\n         </tr>\n         <tr id=\"bind-default\">\n           <td>ng-bind</td>\n           <td>Automatically escapes</td>\n           <td><pre>&lt;div ng-bind=\"snippet\"&gt;<br/>&lt;/div&gt;</pre></td>\n           <td><div ng-bind=\"snippet\"></div></td>\n         </tr>\n       </table>\n       </div>\n   </file>\n   <file name=\"protractor.js\" type=\"protractor\">\n     it('should sanitize the html snippet by default', function() {\n       expect(element(by.css('#bind-html-with-sanitize div')).getAttribute('innerHTML')).\n         toBe('<p>an html\\n<em>click here</em>\\nsnippet</p>');\n     });\n\n     it('should inline raw snippet if bound to a trusted value', function() {\n       expect(element(by.css('#bind-html-with-trust div')).getAttribute('innerHTML')).\n         toBe(\"<p style=\\\"color:blue\\\">an html\\n\" +\n              \"<em onmouseover=\\\"this.textContent='PWN3D!'\\\">click here</em>\\n\" +\n              \"snippet</p>\");\n     });\n\n     it('should escape snippet without any filter', function() {\n       expect(element(by.css('#bind-default div')).getAttribute('innerHTML')).\n         toBe(\"&lt;p style=\\\"color:blue\\\"&gt;an html\\n\" +\n              \"&lt;em onmouseover=\\\"this.textContent='PWN3D!'\\\"&gt;click here&lt;/em&gt;\\n\" +\n              \"snippet&lt;/p&gt;\");\n     });\n\n     it('should update', function() {\n       element(by.model('snippet')).clear();\n       element(by.model('snippet')).sendKeys('new <b onclick=\"alert(1)\">text</b>');\n       expect(element(by.css('#bind-html-with-sanitize div')).getAttribute('innerHTML')).\n         toBe('new <b>text</b>');\n       expect(element(by.css('#bind-html-with-trust div')).getAttribute('innerHTML')).toBe(\n         'new <b onclick=\"alert(1)\">text</b>');\n       expect(element(by.css('#bind-default div')).getAttribute('innerHTML')).toBe(\n         \"new &lt;b onclick=\\\"alert(1)\\\"&gt;text&lt;/b&gt;\");\n     });\n   </file>\n   </example>\n */\n\n\n/**\n * @ngdoc provider\n * @name $sanitizeProvider\n * @this\n *\n * @description\n * Creates and configures {@link $sanitize} instance.\n */\nfunction $SanitizeProvider() {\n  var svgEnabled = false;\n\n  this.$get = ['$$sanitizeUri', function($$sanitizeUri) {\n    if (svgEnabled) {\n      extend(validElements, svgElements);\n    }\n    return function(html) {\n      var buf = [];\n      htmlParser(html, htmlSanitizeWriter(buf, function(uri, isImage) {\n        return !/^unsafe:/.test($$sanitizeUri(uri, isImage));\n      }));\n      return buf.join('');\n    };\n  }];\n\n\n  /**\n   * @ngdoc method\n   * @name $sanitizeProvider#enableSvg\n   * @kind function\n   *\n   * @description\n   * Enables a subset of svg to be supported by the sanitizer.\n   *\n   * <div class=\"alert alert-warning\">\n   *   <p>By enabling this setting without taking other precautions, you might expose your\n   *   application to click-hijacking attacks. In these attacks, sanitized svg elements could be positioned\n   *   outside of the containing element and be rendered over other elements on the page (e.g. a login\n   *   link). Such behavior can then result in phishing incidents.</p>\n   *\n   *   <p>To protect against these, explicitly setup `overflow: hidden` css rule for all potential svg\n   *   tags within the sanitized content:</p>\n   *\n   *   <br>\n   *\n   *   <pre><code>\n   *   .rootOfTheIncludedContent svg {\n   *     overflow: hidden !important;\n   *   }\n   *   </code></pre>\n   * </div>\n   *\n   * @param {boolean=} flag Enable or disable SVG support in the sanitizer.\n   * @returns {boolean|ng.$sanitizeProvider} Returns the currently configured value if called\n   *    without an argument or self for chaining otherwise.\n   */\n  this.enableSvg = function(enableSvg) {\n    if (isDefined(enableSvg)) {\n      svgEnabled = enableSvg;\n      return this;\n    } else {\n      return svgEnabled;\n    }\n  };\n\n  //////////////////////////////////////////////////////////////////////////////////////////////////\n  // Private stuff\n  //////////////////////////////////////////////////////////////////////////////////////////////////\n\n  bind = angular.bind;\n  extend = angular.extend;\n  forEach = angular.forEach;\n  isDefined = angular.isDefined;\n  lowercase = angular.lowercase;\n  noop = angular.noop;\n\n  htmlParser = htmlParserImpl;\n  htmlSanitizeWriter = htmlSanitizeWriterImpl;\n\n  nodeContains = window.Node.prototype.contains || /** @this */ function(arg) {\n    // eslint-disable-next-line no-bitwise\n    return !!(this.compareDocumentPosition(arg) & 16);\n  };\n\n  // Regular Expressions for parsing tags and attributes\n  var SURROGATE_PAIR_REGEXP = /[\\uD800-\\uDBFF][\\uDC00-\\uDFFF]/g,\n    // Match everything outside of normal chars and \" (quote character)\n    NON_ALPHANUMERIC_REGEXP = /([^#-~ |!])/g;\n\n\n  // Good source of info about elements and attributes\n  // http://dev.w3.org/html5/spec/Overview.html#semantics\n  // http://simon.html5.org/html-elements\n\n  // Safe Void Elements - HTML5\n  // http://dev.w3.org/html5/spec/Overview.html#void-elements\n  var voidElements = toMap('area,br,col,hr,img,wbr');\n\n  // Elements that you can, intentionally, leave open (and which close themselves)\n  // http://dev.w3.org/html5/spec/Overview.html#optional-tags\n  var optionalEndTagBlockElements = toMap('colgroup,dd,dt,li,p,tbody,td,tfoot,th,thead,tr'),\n      optionalEndTagInlineElements = toMap('rp,rt'),\n      optionalEndTagElements = extend({},\n                                              optionalEndTagInlineElements,\n                                              optionalEndTagBlockElements);\n\n  // Safe Block Elements - HTML5\n  var blockElements = extend({}, optionalEndTagBlockElements, toMap('address,article,' +\n          'aside,blockquote,caption,center,del,dir,div,dl,figure,figcaption,footer,h1,h2,h3,h4,h5,' +\n          'h6,header,hgroup,hr,ins,map,menu,nav,ol,pre,section,table,ul'));\n\n  // Inline Elements - HTML5\n  var inlineElements = extend({}, optionalEndTagInlineElements, toMap('a,abbr,acronym,b,' +\n          'bdi,bdo,big,br,cite,code,del,dfn,em,font,i,img,ins,kbd,label,map,mark,q,ruby,rp,rt,s,' +\n          'samp,small,span,strike,strong,sub,sup,time,tt,u,var'));\n\n  // SVG Elements\n  // https://wiki.whatwg.org/wiki/Sanitization_rules#svg_Elements\n  // Note: the elements animate,animateColor,animateMotion,animateTransform,set are intentionally omitted.\n  // They can potentially allow for arbitrary javascript to be executed. See #11290\n  var svgElements = toMap('circle,defs,desc,ellipse,font-face,font-face-name,font-face-src,g,glyph,' +\n          'hkern,image,linearGradient,line,marker,metadata,missing-glyph,mpath,path,polygon,polyline,' +\n          'radialGradient,rect,stop,svg,switch,text,title,tspan');\n\n  // Blocked Elements (will be stripped)\n  var blockedElements = toMap('script,style');\n\n  var validElements = extend({},\n                                     voidElements,\n                                     blockElements,\n                                     inlineElements,\n                                     optionalEndTagElements);\n\n  //Attributes that have href and hence need to be sanitized\n  var uriAttrs = toMap('background,cite,href,longdesc,src,xlink:href');\n\n  var htmlAttrs = toMap('abbr,align,alt,axis,bgcolor,border,cellpadding,cellspacing,class,clear,' +\n      'color,cols,colspan,compact,coords,dir,face,headers,height,hreflang,hspace,' +\n      'ismap,lang,language,nohref,nowrap,rel,rev,rows,rowspan,rules,' +\n      'scope,scrolling,shape,size,span,start,summary,tabindex,target,title,type,' +\n      'valign,value,vspace,width');\n\n  // SVG attributes (without \"id\" and \"name\" attributes)\n  // https://wiki.whatwg.org/wiki/Sanitization_rules#svg_Attributes\n  var svgAttrs = toMap('accent-height,accumulate,additive,alphabetic,arabic-form,ascent,' +\n      'baseProfile,bbox,begin,by,calcMode,cap-height,class,color,color-rendering,content,' +\n      'cx,cy,d,dx,dy,descent,display,dur,end,fill,fill-rule,font-family,font-size,font-stretch,' +\n      'font-style,font-variant,font-weight,from,fx,fy,g1,g2,glyph-name,gradientUnits,hanging,' +\n      'height,horiz-adv-x,horiz-origin-x,ideographic,k,keyPoints,keySplines,keyTimes,lang,' +\n      'marker-end,marker-mid,marker-start,markerHeight,markerUnits,markerWidth,mathematical,' +\n      'max,min,offset,opacity,orient,origin,overline-position,overline-thickness,panose-1,' +\n      'path,pathLength,points,preserveAspectRatio,r,refX,refY,repeatCount,repeatDur,' +\n      'requiredExtensions,requiredFeatures,restart,rotate,rx,ry,slope,stemh,stemv,stop-color,' +\n      'stop-opacity,strikethrough-position,strikethrough-thickness,stroke,stroke-dasharray,' +\n      'stroke-dashoffset,stroke-linecap,stroke-linejoin,stroke-miterlimit,stroke-opacity,' +\n      'stroke-width,systemLanguage,target,text-anchor,to,transform,type,u1,u2,underline-position,' +\n      'underline-thickness,unicode,unicode-range,units-per-em,values,version,viewBox,visibility,' +\n      'width,widths,x,x-height,x1,x2,xlink:actuate,xlink:arcrole,xlink:role,xlink:show,xlink:title,' +\n      'xlink:type,xml:base,xml:lang,xml:space,xmlns,xmlns:xlink,y,y1,y2,zoomAndPan', true);\n\n  var validAttrs = extend({},\n                                  uriAttrs,\n                                  svgAttrs,\n                                  htmlAttrs);\n\n  function toMap(str, lowercaseKeys) {\n    var obj = {}, items = str.split(','), i;\n    for (i = 0; i < items.length; i++) {\n      obj[lowercaseKeys ? lowercase(items[i]) : items[i]] = true;\n    }\n    return obj;\n  }\n\n  var inertBodyElement;\n  (function(window) {\n    var doc;\n    if (window.document && window.document.implementation) {\n      doc = window.document.implementation.createHTMLDocument('inert');\n    } else {\n      throw $sanitizeMinErr('noinert', 'Can\\'t create an inert html document');\n    }\n    var docElement = doc.documentElement || doc.getDocumentElement();\n    var bodyElements = docElement.getElementsByTagName('body');\n\n    // usually there should be only one body element in the document, but IE doesn't have any, so we need to create one\n    if (bodyElements.length === 1) {\n      inertBodyElement = bodyElements[0];\n    } else {\n      var html = doc.createElement('html');\n      inertBodyElement = doc.createElement('body');\n      html.appendChild(inertBodyElement);\n      doc.appendChild(html);\n    }\n  })(window);\n\n  /**\n   * @example\n   * htmlParser(htmlString, {\n   *     start: function(tag, attrs) {},\n   *     end: function(tag) {},\n   *     chars: function(text) {},\n   *     comment: function(text) {}\n   * });\n   *\n   * @param {string} html string\n   * @param {object} handler\n   */\n  function htmlParserImpl(html, handler) {\n    if (html === null || html === undefined) {\n      html = '';\n    } else if (typeof html !== 'string') {\n      html = '' + html;\n    }\n    inertBodyElement.innerHTML = html;\n\n    //mXSS protection\n    var mXSSAttempts = 5;\n    do {\n      if (mXSSAttempts === 0) {\n        throw $sanitizeMinErr('uinput', 'Failed to sanitize html because the input is unstable');\n      }\n      mXSSAttempts--;\n\n      // strip custom-namespaced attributes on IE<=11\n      if (window.document.documentMode) {\n        stripCustomNsAttrs(inertBodyElement);\n      }\n      html = inertBodyElement.innerHTML; //trigger mXSS\n      inertBodyElement.innerHTML = html;\n    } while (html !== inertBodyElement.innerHTML);\n\n    var node = inertBodyElement.firstChild;\n    while (node) {\n      switch (node.nodeType) {\n        case 1: // ELEMENT_NODE\n          handler.start(node.nodeName.toLowerCase(), attrToMap(node.attributes));\n          break;\n        case 3: // TEXT NODE\n          handler.chars(node.textContent);\n          break;\n      }\n\n      var nextNode;\n      if (!(nextNode = node.firstChild)) {\n        if (node.nodeType === 1) {\n          handler.end(node.nodeName.toLowerCase());\n        }\n        nextNode = getNonDescendant('nextSibling', node);\n        if (!nextNode) {\n          while (nextNode == null) {\n            node = getNonDescendant('parentNode', node);\n            if (node === inertBodyElement) break;\n            nextNode = getNonDescendant('nextSibling', node);\n            if (node.nodeType === 1) {\n              handler.end(node.nodeName.toLowerCase());\n            }\n          }\n        }\n      }\n      node = nextNode;\n    }\n\n    while ((node = inertBodyElement.firstChild)) {\n      inertBodyElement.removeChild(node);\n    }\n  }\n\n  function attrToMap(attrs) {\n    var map = {};\n    for (var i = 0, ii = attrs.length; i < ii; i++) {\n      var attr = attrs[i];\n      map[attr.name] = attr.value;\n    }\n    return map;\n  }\n\n\n  /**\n   * Escapes all potentially dangerous characters, so that the\n   * resulting string can be safely inserted into attribute or\n   * element text.\n   * @param value\n   * @returns {string} escaped text\n   */\n  function encodeEntities(value) {\n    return value.\n      replace(/&/g, '&amp;').\n      replace(SURROGATE_PAIR_REGEXP, function(value) {\n        var hi = value.charCodeAt(0);\n        var low = value.charCodeAt(1);\n        return '&#' + (((hi - 0xD800) * 0x400) + (low - 0xDC00) + 0x10000) + ';';\n      }).\n      replace(NON_ALPHANUMERIC_REGEXP, function(value) {\n        return '&#' + value.charCodeAt(0) + ';';\n      }).\n      replace(/</g, '&lt;').\n      replace(/>/g, '&gt;');\n  }\n\n  /**\n   * create an HTML/XML writer which writes to buffer\n   * @param {Array} buf use buf.join('') to get out sanitized html string\n   * @returns {object} in the form of {\n   *     start: function(tag, attrs) {},\n   *     end: function(tag) {},\n   *     chars: function(text) {},\n   *     comment: function(text) {}\n   * }\n   */\n  function htmlSanitizeWriterImpl(buf, uriValidator) {\n    var ignoreCurrentElement = false;\n    var out = bind(buf, buf.push);\n    return {\n      start: function(tag, attrs) {\n        tag = lowercase(tag);\n        if (!ignoreCurrentElement && blockedElements[tag]) {\n          ignoreCurrentElement = tag;\n        }\n        if (!ignoreCurrentElement && validElements[tag] === true) {\n          out('<');\n          out(tag);\n          forEach(attrs, function(value, key) {\n            var lkey = lowercase(key);\n            var isImage = (tag === 'img' && lkey === 'src') || (lkey === 'background');\n            if (validAttrs[lkey] === true &&\n              (uriAttrs[lkey] !== true || uriValidator(value, isImage))) {\n              out(' ');\n              out(key);\n              out('=\"');\n              out(encodeEntities(value));\n              out('\"');\n            }\n          });\n          out('>');\n        }\n      },\n      end: function(tag) {\n        tag = lowercase(tag);\n        if (!ignoreCurrentElement && validElements[tag] === true && voidElements[tag] !== true) {\n          out('</');\n          out(tag);\n          out('>');\n        }\n        // eslint-disable-next-line eqeqeq\n        if (tag == ignoreCurrentElement) {\n          ignoreCurrentElement = false;\n        }\n      },\n      chars: function(chars) {\n        if (!ignoreCurrentElement) {\n          out(encodeEntities(chars));\n        }\n      }\n    };\n  }\n\n\n  /**\n   * When IE9-11 comes across an unknown namespaced attribute e.g. 'xlink:foo' it adds 'xmlns:ns1' attribute to declare\n   * ns1 namespace and prefixes the attribute with 'ns1' (e.g. 'ns1:xlink:foo'). This is undesirable since we don't want\n   * to allow any of these custom attributes. This method strips them all.\n   *\n   * @param node Root element to process\n   */\n  function stripCustomNsAttrs(node) {\n    while (node) {\n      if (node.nodeType === window.Node.ELEMENT_NODE) {\n        var attrs = node.attributes;\n        for (var i = 0, l = attrs.length; i < l; i++) {\n          var attrNode = attrs[i];\n          var attrName = attrNode.name.toLowerCase();\n          if (attrName === 'xmlns:ns1' || attrName.lastIndexOf('ns1:', 0) === 0) {\n            node.removeAttributeNode(attrNode);\n            i--;\n            l--;\n          }\n        }\n      }\n\n      var nextNode = node.firstChild;\n      if (nextNode) {\n        stripCustomNsAttrs(nextNode);\n      }\n\n      node = getNonDescendant('nextSibling', node);\n    }\n  }\n\n  function getNonDescendant(propName, node) {\n    // An element is clobbered if its `propName` property points to one of its descendants\n    var nextNode = node[propName];\n    if (nextNode && nodeContains.call(node, nextNode)) {\n      throw $sanitizeMinErr('elclob', 'Failed to sanitize html because the element is clobbered: {0}', node.outerHTML || node.outerText);\n    }\n    return nextNode;\n  }\n}\n\nfunction sanitizeText(chars) {\n  var buf = [];\n  var writer = htmlSanitizeWriter(buf, noop);\n  writer.chars(chars);\n  return buf.join('');\n}\n\n\n// define ngSanitize module and register $sanitize service\nangular.module('ngSanitize', [])\n  .provider('$sanitize', $SanitizeProvider)\n  .info({ angularVersion: '1.6.4' });\n\n/**\n * @ngdoc filter\n * @name linky\n * @kind function\n *\n * @description\n * Finds links in text input and turns them into html links. Supports `http/https/ftp/mailto` and\n * plain email address links.\n *\n * Requires the {@link ngSanitize `ngSanitize`} module to be installed.\n *\n * @param {string} text Input text.\n * @param {string} target Window (`_blank|_self|_parent|_top`) or named frame to open links in.\n * @param {object|function(url)} [attributes] Add custom attributes to the link element.\n *\n *    Can be one of:\n *\n *    - `object`: A map of attributes\n *    - `function`: Takes the url as a parameter and returns a map of attributes\n *\n *    If the map of attributes contains a value for `target`, it overrides the value of\n *    the target parameter.\n *\n *\n * @returns {string} Html-linkified and {@link $sanitize sanitized} text.\n *\n * @usage\n   <span ng-bind-html=\"linky_expression | linky\"></span>\n *\n * @example\n   <example module=\"linkyExample\" deps=\"angular-sanitize.js\" name=\"linky-filter\">\n     <file name=\"index.ced81ed4.html\">\n       <div ng-controller=\"ExampleController\">\n       Snippet: <textarea ng-model=\"snippet\" cols=\"60\" rows=\"3\"></textarea>\n       <table>\n         <tr>\n           <th>Filter</th>\n           <th>Source</th>\n           <th>Rendered</th>\n         </tr>\n         <tr id=\"linky-filter\">\n           <td>linky filter</td>\n           <td>\n             <pre>&lt;div ng-bind-html=\"snippet | linky\"&gt;<br>&lt;/div&gt;</pre>\n           </td>\n           <td>\n             <div ng-bind-html=\"snippet | linky\"></div>\n           </td>\n         </tr>\n         <tr id=\"linky-target\">\n          <td>linky target</td>\n          <td>\n            <pre>&lt;div ng-bind-html=\"snippetWithSingleURL | linky:'_blank'\"&gt;<br>&lt;/div&gt;</pre>\n          </td>\n          <td>\n            <div ng-bind-html=\"snippetWithSingleURL | linky:'_blank'\"></div>\n          </td>\n         </tr>\n         <tr id=\"linky-custom-attributes\">\n          <td>linky custom attributes</td>\n          <td>\n            <pre>&lt;div ng-bind-html=\"snippetWithSingleURL | linky:'_self':{rel: 'nofollow'}\"&gt;<br>&lt;/div&gt;</pre>\n          </td>\n          <td>\n            <div ng-bind-html=\"snippetWithSingleURL | linky:'_self':{rel: 'nofollow'}\"></div>\n          </td>\n         </tr>\n         <tr id=\"escaped-html\">\n           <td>no filter</td>\n           <td><pre>&lt;div ng-bind=\"snippet\"&gt;<br>&lt;/div&gt;</pre></td>\n           <td><div ng-bind=\"snippet\"></div></td>\n         </tr>\n       </table>\n     </file>\n     <file name=\"script.js\">\n       angular.module('linkyExample', ['ngSanitize'])\n         .controller('ExampleController', ['$scope', function($scope) {\n           $scope.snippet =\n             'Pretty text with some links:\\n' +\n             'http://angularjs.org/,\\n' +\n             'mailto:us@somewhere.org,\\n' +\n             'another@somewhere.org,\\n' +\n             'and one more: ftp://127.0.0.1/.';\n           $scope.snippetWithSingleURL = 'http://angularjs.org/';\n         }]);\n     </file>\n     <file name=\"protractor.js\" type=\"protractor\">\n       it('should linkify the snippet with urls', function() {\n         expect(element(by.id('linky-filter')).element(by.binding('snippet | linky')).getText()).\n             toBe('Pretty text with some links: http://angularjs.org/, us@somewhere.org, ' +\n                  'another@somewhere.org, and one more: ftp://127.0.0.1/.');\n         expect(element.all(by.css('#linky-filter a')).count()).toEqual(4);\n       });\n\n       it('should not linkify snippet without the linky filter', function() {\n         expect(element(by.id('escaped-html')).element(by.binding('snippet')).getText()).\n             toBe('Pretty text with some links: http://angularjs.org/, mailto:us@somewhere.org, ' +\n                  'another@somewhere.org, and one more: ftp://127.0.0.1/.');\n         expect(element.all(by.css('#escaped-html a')).count()).toEqual(0);\n       });\n\n       it('should update', function() {\n         element(by.model('snippet')).clear();\n         element(by.model('snippet')).sendKeys('new http://link.');\n         expect(element(by.id('linky-filter')).element(by.binding('snippet | linky')).getText()).\n             toBe('new http://link.');\n         expect(element.all(by.css('#linky-filter a')).count()).toEqual(1);\n         expect(element(by.id('escaped-html')).element(by.binding('snippet')).getText())\n             .toBe('new http://link.');\n       });\n\n       it('should work with the target property', function() {\n        expect(element(by.id('linky-target')).\n            element(by.binding(\"snippetWithSingleURL | linky:'_blank'\")).getText()).\n            toBe('http://angularjs.org/');\n        expect(element(by.css('#linky-target a')).getAttribute('target')).toEqual('_blank');\n       });\n\n       it('should optionally add custom attributes', function() {\n        expect(element(by.id('linky-custom-attributes')).\n            element(by.binding(\"snippetWithSingleURL | linky:'_self':{rel: 'nofollow'}\")).getText()).\n            toBe('http://angularjs.org/');\n        expect(element(by.css('#linky-custom-attributes a')).getAttribute('rel')).toEqual('nofollow');\n       });\n     </file>\n   </example>\n */\nangular.module('ngSanitize').filter('linky', ['$sanitize', function($sanitize) {\n  var LINKY_URL_REGEXP =\n        /((ftp|https?):\\/\\/|(www\\.)|(mailto:)?[A-Za-z0-9._%+-]+@)\\S*[^\\s.;,(){}<>\"\\u201d\\u2019]/i,\n      MAILTO_REGEXP = /^mailto:/i;\n\n  var linkyMinErr = angular.$$minErr('linky');\n  var isDefined = angular.isDefined;\n  var isFunction = angular.isFunction;\n  var isObject = angular.isObject;\n  var isString = angular.isString;\n\n  return function(text, target, attributes) {\n    if (text == null || text === '') return text;\n    if (!isString(text)) throw linkyMinErr('notstring', 'Expected string but received: {0}', text);\n\n    var attributesFn =\n      isFunction(attributes) ? attributes :\n      isObject(attributes) ? function getAttributesObject() {return attributes;} :\n      function getEmptyAttributesObject() {return {};};\n\n    var match;\n    var raw = text;\n    var html = [];\n    var url;\n    var i;\n    while ((match = raw.match(LINKY_URL_REGEXP))) {\n      // We can not end in these as they are sometimes found at the end of the sentence\n      url = match[0];\n      // if we did not match ftp/http/www/mailto then assume mailto\n      if (!match[2] && !match[4]) {\n        url = (match[3] ? 'http://' : 'mailto:') + url;\n      }\n      i = match.index;\n      addText(raw.substr(0, i));\n      addLink(url, match[0].replace(MAILTO_REGEXP, ''));\n      raw = raw.substring(i + match[0].length);\n    }\n    addText(raw);\n    return $sanitize(html.join(''));\n\n    function addText(text) {\n      if (!text) {\n        return;\n      }\n      html.push(sanitizeText(text));\n    }\n\n    function addLink(url, text) {\n      var key, linkAttributes = attributesFn(url);\n      html.push('<a ');\n\n      for (key in linkAttributes) {\n        html.push(key + '=\"' + linkAttributes[key] + '\" ');\n      }\n\n      if (isDefined(target) && !('target' in linkAttributes)) {\n        html.push('target=\"',\n                  target,\n                  '\" ');\n      }\n      html.push('href=\"',\n                url.replace(/\"/g, '&quot;'),\n                '\">');\n      addText(text);\n      html.push('</a>');\n    }\n  };\n}]);\n\n\n})(window, window.angular);\n\n/*!\n * angular-translate - v2.13.0 - 2016-10-30\n * \n * Copyright (c) 2016 The angular-translate team, Pascal Precht; Licensed MIT\n */\n(function (root, factory) {\n  if (typeof define === 'function' && define.amd) {\n    // AMD. Register as an anonymous module unless amdModuleId is set\n    define([], function () {\n      return (factory());\n    });\n  } else if (typeof exports === 'object') {\n    // Node. Does not work with strict CommonJS, but\n    // only CommonJS-like environments that support module.exports,\n    // like Node.\n    module.exports = factory();\n  } else {\n    factory();\n  }\n}(this, function () {\n\n/**\n * @ngdoc overview\n * @name pascalprecht.translate\n *\n * @description\n * The main module which holds everything together.\n */\nrunTranslate.$inject = ['$translate'];\n$translate.$inject = ['$STORAGE_KEY', '$windowProvider', '$translateSanitizationProvider', 'pascalprechtTranslateOverrider'];\n$translateDefaultInterpolation.$inject = ['$interpolate', '$translateSanitization'];\ntranslateDirective.$inject = ['$translate', '$interpolate', '$compile', '$parse', '$rootScope'];\ntranslateAttrDirective.$inject = ['$translate', '$rootScope'];\ntranslateCloakDirective.$inject = ['$translate', '$rootScope'];\ntranslateFilterFactory.$inject = ['$parse', '$translate'];\n$translationCache.$inject = ['$cacheFactory'];\nangular.module('pascalprecht.translate', ['ng'])\n  .run(runTranslate);\n\nfunction runTranslate($translate) {\n\n  'use strict';\n\n  var key = $translate.storageKey(),\n    storage = $translate.storage();\n\n  var fallbackFromIncorrectStorageValue = function () {\n    var preferred = $translate.preferredLanguage();\n    if (angular.isString(preferred)) {\n      $translate.use(preferred);\n      // $translate.use() will also remember the language.\n      // So, we don't need to call storage.put() here.\n    } else {\n      storage.put(key, $translate.use());\n    }\n  };\n\n  fallbackFromIncorrectStorageValue.displayName = 'fallbackFromIncorrectStorageValue';\n\n  if (storage) {\n    if (!storage.get(key)) {\n      fallbackFromIncorrectStorageValue();\n    } else {\n      $translate.use(storage.get(key))['catch'](fallbackFromIncorrectStorageValue);\n    }\n  } else if (angular.isString($translate.preferredLanguage())) {\n    $translate.use($translate.preferredLanguage());\n  }\n}\n\nrunTranslate.displayName = 'runTranslate';\n\n/**\n * @ngdoc object\n * @name pascalprecht.translate.$translateSanitizationProvider\n *\n * @description\n *\n * Configurations for $translateSanitization\n */\nangular.module('pascalprecht.translate').provider('$translateSanitization', $translateSanitizationProvider);\n\nfunction $translateSanitizationProvider () {\n\n  'use strict';\n\n  var $sanitize,\n      $sce,\n      currentStrategy = null, // TODO change to either 'sanitize', 'escape' or ['sanitize', 'escapeParameters'] in 3.0.\n      hasConfiguredStrategy = false,\n      hasShownNoStrategyConfiguredWarning = false,\n      strategies;\n\n  /**\n   * Definition of a sanitization strategy function\n   * @callback StrategyFunction\n   * @param {string|object} value - value to be sanitized (either a string or an interpolated value map)\n   * @param {string} mode - either 'text' for a string (translation) or 'params' for the interpolated params\n   * @return {string|object}\n   */\n\n  /**\n   * @ngdoc property\n   * @name strategies\n   * @propertyOf pascalprecht.translate.$translateSanitizationProvider\n   *\n   * @description\n   * Following strategies are built-in:\n   * <dl>\n   *   <dt>sanitize</dt>\n   *   <dd>Sanitizes HTML in the translation text using $sanitize</dd>\n   *   <dt>escape</dt>\n   *   <dd>Escapes HTML in the translation</dd>\n   *   <dt>sanitizeParameters</dt>\n   *   <dd>Sanitizes HTML in the values of the interpolation parameters using $sanitize</dd>\n   *   <dt>escapeParameters</dt>\n   *   <dd>Escapes HTML in the values of the interpolation parameters</dd>\n   *   <dt>escaped</dt>\n   *   <dd>Support legacy strategy name 'escaped' for backwards compatibility (will be removed in 3.0)</dd>\n   * </dl>\n   *\n   */\n\n  strategies = {\n    sanitize: function (value, mode/*, context*/) {\n      if (mode === 'text') {\n        value = htmlSanitizeValue(value);\n      }\n      return value;\n    },\n    escape: function (value, mode/*, context*/) {\n      if (mode === 'text') {\n        value = htmlEscapeValue(value);\n      }\n      return value;\n    },\n    sanitizeParameters: function (value, mode/*, context*/) {\n      if (mode === 'params') {\n        value = mapInterpolationParameters(value, htmlSanitizeValue);\n      }\n      return value;\n    },\n    escapeParameters: function (value, mode/*, context*/) {\n      if (mode === 'params') {\n        value = mapInterpolationParameters(value, htmlEscapeValue);\n      }\n      return value;\n    },\n    sce: function (value, mode, context) {\n      if (mode === 'text') {\n        value = htmlTrustValue(value);\n      } else if (mode === 'params') {\n        if (context !== 'filter') {\n          // do html escape in filter context #1101\n          value = mapInterpolationParameters(value, htmlEscapeValue);\n        }\n      }\n      return value;\n    },\n    sceParameters: function (value, mode/*, context*/) {\n      if (mode === 'params') {\n        value = mapInterpolationParameters(value, htmlTrustValue);\n      }\n      return value;\n    }\n  };\n  // Support legacy strategy name 'escaped' for backwards compatibility.\n  // TODO should be removed in 3.0\n  strategies.escaped = strategies.escapeParameters;\n\n  /**\n   * @ngdoc function\n   * @name pascalprecht.translate.$translateSanitizationProvider#addStrategy\n   * @methodOf pascalprecht.translate.$translateSanitizationProvider\n   *\n   * @description\n   * Adds a sanitization strategy to the list of known strategies.\n   *\n   * @param {string} strategyName - unique key for a strategy\n   * @param {StrategyFunction} strategyFunction - strategy function\n   * @returns {object} this\n   */\n  this.addStrategy = function (strategyName, strategyFunction) {\n    strategies[strategyName] = strategyFunction;\n    return this;\n  };\n\n  /**\n   * @ngdoc function\n   * @name pascalprecht.translate.$translateSanitizationProvider#removeStrategy\n   * @methodOf pascalprecht.translate.$translateSanitizationProvider\n   *\n   * @description\n   * Removes a sanitization strategy from the list of known strategies.\n   *\n   * @param {string} strategyName - unique key for a strategy\n   * @returns {object} this\n   */\n  this.removeStrategy = function (strategyName) {\n    delete strategies[strategyName];\n    return this;\n  };\n\n  /**\n   * @ngdoc function\n   * @name pascalprecht.translate.$translateSanitizationProvider#useStrategy\n   * @methodOf pascalprecht.translate.$translateSanitizationProvider\n   *\n   * @description\n   * Selects a sanitization strategy. When an array is provided the strategies will be executed in order.\n   *\n   * @param {string|StrategyFunction|array} strategy The sanitization strategy / strategies which should be used. Either a name of an existing strategy, a custom strategy function, or an array consisting of multiple names and / or custom functions.\n   * @returns {object} this\n   */\n  this.useStrategy = function (strategy) {\n    hasConfiguredStrategy = true;\n    currentStrategy = strategy;\n    return this;\n  };\n\n  /**\n   * @ngdoc object\n   * @name pascalprecht.translate.$translateSanitization\n   * @requires $injector\n   * @requires $log\n   *\n   * @description\n   * Sanitizes interpolation parameters and translated texts.\n   *\n   */\n  this.$get = ['$injector', '$log', function ($injector, $log) {\n\n    var cachedStrategyMap = {};\n\n    var applyStrategies = function (value, mode, context, selectedStrategies) {\n      angular.forEach(selectedStrategies, function (selectedStrategy) {\n        if (angular.isFunction(selectedStrategy)) {\n          value = selectedStrategy(value, mode, context);\n        } else if (angular.isFunction(strategies[selectedStrategy])) {\n          value = strategies[selectedStrategy](value, mode, context);\n        } else if (angular.isString(strategies[selectedStrategy])) {\n          if (!cachedStrategyMap[strategies[selectedStrategy]]) {\n            try {\n              cachedStrategyMap[strategies[selectedStrategy]] = $injector.get(strategies[selectedStrategy]);\n            } catch (e) {\n              cachedStrategyMap[strategies[selectedStrategy]] = function() {};\n              throw new Error('pascalprecht.translate.$translateSanitization: Unknown sanitization strategy: \\'' + selectedStrategy + '\\'');\n            }\n          }\n          value = cachedStrategyMap[strategies[selectedStrategy]](value, mode, context);\n        } else {\n          throw new Error('pascalprecht.translate.$translateSanitization: Unknown sanitization strategy: \\'' + selectedStrategy + '\\'');\n        }\n      });\n      return value;\n    };\n\n    // TODO: should be removed in 3.0\n    var showNoStrategyConfiguredWarning = function () {\n      if (!hasConfiguredStrategy && !hasShownNoStrategyConfiguredWarning) {\n        $log.warn('pascalprecht.translate.$translateSanitization: No sanitization strategy has been configured. This can have serious security implications. See http://angular-translate.github.io/docs/#/guide/19_security for details.');\n        hasShownNoStrategyConfiguredWarning = true;\n      }\n    };\n\n    if ($injector.has('$sanitize')) {\n      $sanitize = $injector.get('$sanitize');\n    }\n    if ($injector.has('$sce')) {\n      $sce = $injector.get('$sce');\n    }\n\n    return {\n      /**\n       * @ngdoc function\n       * @name pascalprecht.translate.$translateSanitization#useStrategy\n       * @methodOf pascalprecht.translate.$translateSanitization\n       *\n       * @description\n       * Selects a sanitization strategy. When an array is provided the strategies will be executed in order.\n       *\n       * @param {string|StrategyFunction|array} strategy The sanitization strategy / strategies which should be used. Either a name of an existing strategy, a custom strategy function, or an array consisting of multiple names and / or custom functions.\n       */\n      useStrategy: (function (self) {\n        return function (strategy) {\n          self.useStrategy(strategy);\n        };\n      })(this),\n\n      /**\n       * @ngdoc function\n       * @name pascalprecht.translate.$translateSanitization#sanitize\n       * @methodOf pascalprecht.translate.$translateSanitization\n       *\n       * @description\n       * Sanitizes a value.\n       *\n       * @param {string|object} value The value which should be sanitized.\n       * @param {string} mode The current sanitization mode, either 'params' or 'text'.\n       * @param {string|StrategyFunction|array} [strategy] Optional custom strategy which should be used instead of the currently selected strategy.\n       * @param {string} [context] The context of this call: filter, service. Default is service\n       * @returns {string|object} sanitized value\n       */\n      sanitize: function (value, mode, strategy, context) {\n        if (!currentStrategy) {\n          showNoStrategyConfiguredWarning();\n        }\n\n        if (!strategy && strategy !== null) {\n          strategy = currentStrategy;\n        }\n\n        if (!strategy) {\n          return value;\n        }\n\n        if (!context) {\n          context = 'service';\n        }\n\n        var selectedStrategies = angular.isArray(strategy) ? strategy : [strategy];\n        return applyStrategies(value, mode, context, selectedStrategies);\n      }\n    };\n  }];\n\n  var htmlEscapeValue = function (value) {\n    var element = angular.element('<div></div>');\n    element.text(value); // not chainable, see #1044\n    return element.html();\n  };\n\n  var htmlSanitizeValue = function (value) {\n    if (!$sanitize) {\n      throw new Error('pascalprecht.translate.$translateSanitization: Error cannot find $sanitize service. Either include the ngSanitize module (https://docs.angularjs.org/api/ngSanitize) or use a sanitization strategy which does not depend on $sanitize, such as \\'escape\\'.');\n    }\n    return $sanitize(value);\n  };\n\n  var htmlTrustValue = function (value) {\n    if (!$sce) {\n      throw new Error('pascalprecht.translate.$translateSanitization: Error cannot find $sce service.');\n    }\n    return $sce.trustAsHtml(value);\n  };\n\n  var mapInterpolationParameters = function (value, iteratee, stack) {\n    if (angular.isDate(value)) {\n      return value;\n    } else if (angular.isObject(value)) {\n      var result = angular.isArray(value) ? [] : {};\n\n      if (!stack) {\n        stack = [];\n      } else {\n        if (stack.indexOf(value) > -1) {\n          throw new Error('pascalprecht.translate.$translateSanitization: Error cannot interpolate parameter due recursive object');\n        }\n      }\n\n      stack.push(value);\n      angular.forEach(value, function (propertyValue, propertyKey) {\n\n        /* Skipping function properties. */\n        if (angular.isFunction(propertyValue)) {\n          return;\n        }\n\n        result[propertyKey] = mapInterpolationParameters(propertyValue, iteratee, stack);\n      });\n      stack.splice(-1, 1); // remove last\n\n      return result;\n    } else if (angular.isNumber(value)) {\n      return value;\n    } else {\n      return iteratee(value);\n    }\n  };\n}\n\n/**\n * @ngdoc object\n * @name pascalprecht.translate.$translateProvider\n * @description\n *\n * $translateProvider allows developers to register translation-tables, asynchronous loaders\n * and similar to configure translation behavior directly inside of a module.\n *\n */\nangular.module('pascalprecht.translate')\n  .constant('pascalprechtTranslateOverrider', {})\n  .provider('$translate', $translate);\n\nfunction $translate($STORAGE_KEY, $windowProvider, $translateSanitizationProvider, pascalprechtTranslateOverrider) {\n\n  'use strict';\n\n  var $translationTable = {},\n    $preferredLanguage,\n    $availableLanguageKeys = [],\n    $languageKeyAliases,\n    $fallbackLanguage,\n    $fallbackWasString,\n    $uses,\n    $nextLang,\n    $storageFactory,\n    $storageKey = $STORAGE_KEY,\n    $storagePrefix,\n    $missingTranslationHandlerFactory,\n    $interpolationFactory,\n    $interpolatorFactories = [],\n    $loaderFactory,\n    $cloakClassName = 'translate-cloak',\n    $loaderOptions,\n    $notFoundIndicatorLeft,\n    $notFoundIndicatorRight,\n    $postCompilingEnabled = false,\n    $forceAsyncReloadEnabled = false,\n    $nestedObjectDelimeter = '.',\n    $isReady = false,\n    $keepContent = false,\n    loaderCache,\n    directivePriority = 0,\n    statefulFilter = true,\n    postProcessFn,\n    uniformLanguageTagResolver = 'default',\n    languageTagResolver = {\n      'default' : function (tag) {\n        return (tag || '').split('-').join('_');\n      },\n      java : function (tag) {\n        var temp = (tag || '').split('-').join('_');\n        var parts = temp.split('_');\n        return parts.length > 1 ? (parts[0].toLowerCase() + '_' + parts[1].toUpperCase()) : temp;\n      },\n      bcp47 : function (tag) {\n        var temp = (tag || '').split('_').join('-');\n        var parts = temp.split('-');\n        return parts.length > 1 ? (parts[0].toLowerCase() + '-' + parts[1].toUpperCase()) : temp;\n      },\n      'iso639-1' : function (tag) {\n        var temp = (tag || '').split('_').join('-');\n        var parts = temp.split('-');\n        return parts[0].toLowerCase();\n      }\n    };\n\n  var version = '2.13.0';\n\n  // tries to determine the browsers language\n  var getFirstBrowserLanguage = function () {\n\n    // internal purpose only\n    if (angular.isFunction(pascalprechtTranslateOverrider.getLocale)) {\n      return pascalprechtTranslateOverrider.getLocale();\n    }\n\n    var nav = $windowProvider.$get().navigator,\n      browserLanguagePropertyKeys = ['language', 'browserLanguage', 'systemLanguage', 'userLanguage'],\n      i,\n      language;\n\n    // support for HTML 5.1 \"navigator.languages\"\n    if (angular.isArray(nav.languages)) {\n      for (i = 0; i < nav.languages.length; i++) {\n        language = nav.languages[i];\n        if (language && language.length) {\n          return language;\n        }\n      }\n    }\n\n    // support for other well known properties in browsers\n    for (i = 0; i < browserLanguagePropertyKeys.length; i++) {\n      language = nav[browserLanguagePropertyKeys[i]];\n      if (language && language.length) {\n        return language;\n      }\n    }\n\n    return null;\n  };\n  getFirstBrowserLanguage.displayName = 'angular-translate/service: getFirstBrowserLanguage';\n\n  // tries to determine the browsers locale\n  var getLocale = function () {\n    var locale = getFirstBrowserLanguage() || '';\n    if (languageTagResolver[uniformLanguageTagResolver]) {\n      locale = languageTagResolver[uniformLanguageTagResolver](locale);\n    }\n    return locale;\n  };\n  getLocale.displayName = 'angular-translate/service: getLocale';\n\n  /**\n   * @name indexOf\n   * @private\n   *\n   * @description\n   * indexOf polyfill. Kinda sorta.\n   *\n   * @param {array} array Array to search in.\n   * @param {string} searchElement Element to search for.\n   *\n   * @returns {int} Index of search element.\n   */\n  var indexOf = function (array, searchElement) {\n    for (var i = 0, len = array.length; i < len; i++) {\n      if (array[i] === searchElement) {\n        return i;\n      }\n    }\n    return -1;\n  };\n\n  /**\n   * @name trim\n   * @private\n   *\n   * @description\n   * trim polyfill\n   *\n   * @returns {string} The string stripped of whitespace from both ends\n   */\n  var trim = function () {\n    return this.toString().replace(/^\\s+|\\s+$/g, '');\n  };\n\n  var negotiateLocale = function (preferred) {\n    if (!preferred) {\n      return;\n    }\n\n    var avail = [],\n      locale = angular.lowercase(preferred),\n      i = 0,\n      n = $availableLanguageKeys.length;\n\n    for (; i < n; i++) {\n      avail.push(angular.lowercase($availableLanguageKeys[i]));\n    }\n\n    // Check for an exact match in our list of available keys\n    if (indexOf(avail, locale) > -1) {\n      return preferred;\n    }\n\n    if ($languageKeyAliases) {\n      var alias;\n      for (var langKeyAlias in $languageKeyAliases) {\n        if ($languageKeyAliases.hasOwnProperty(langKeyAlias)) {\n          var hasWildcardKey = false;\n          var hasExactKey = Object.prototype.hasOwnProperty.call($languageKeyAliases, langKeyAlias) &&\n            angular.lowercase(langKeyAlias) === angular.lowercase(preferred);\n\n          if (langKeyAlias.slice(-1) === '*') {\n            hasWildcardKey = langKeyAlias.slice(0, -1) === preferred.slice(0, langKeyAlias.length - 1);\n          }\n          if (hasExactKey || hasWildcardKey) {\n            alias = $languageKeyAliases[langKeyAlias];\n            if (indexOf(avail, angular.lowercase(alias)) > -1) {\n              return alias;\n            }\n          }\n        }\n      }\n    }\n\n    // Check for a language code without region\n    var parts = preferred.split('_');\n\n    if (parts.length > 1 && indexOf(avail, angular.lowercase(parts[0])) > -1) {\n      return parts[0];\n    }\n\n    // If everything fails, return undefined.\n    return;\n  };\n\n  /**\n   * @ngdoc function\n   * @name pascalprecht.translate.$translateProvider#translations\n   * @methodOf pascalprecht.translate.$translateProvider\n   *\n   * @description\n   * Registers a new translation table for specific language key.\n   *\n   * To register a translation table for specific language, pass a defined language\n   * key as first parameter.\n   *\n   * <pre>\n   *  // register translation table for language: 'de_DE'\n   *  $translateProvider.translations('de_DE', {\n   *    'GREETING': 'Hallo Welt!'\n   *  });\n   *\n   *  // register another one\n   *  $translateProvider.translations('en_US', {\n   *    'GREETING': 'Hello world!'\n   *  });\n   * </pre>\n   *\n   * When registering multiple translation tables for for the same language key,\n   * the actual translation table gets extended. This allows you to define module\n   * specific translation which only get added, once a specific module is loaded in\n   * your app.\n   *\n   * Invoking this method with no arguments returns the translation table which was\n   * registered with no language key. Invoking it with a language key returns the\n   * related translation table.\n   *\n   * @param {string} langKey A language key.\n   * @param {object} translationTable A plain old JavaScript object that represents a translation table.\n   *\n   */\n  var translations = function (langKey, translationTable) {\n\n    if (!langKey && !translationTable) {\n      return $translationTable;\n    }\n\n    if (langKey && !translationTable) {\n      if (angular.isString(langKey)) {\n        return $translationTable[langKey];\n      }\n    } else {\n      if (!angular.isObject($translationTable[langKey])) {\n        $translationTable[langKey] = {};\n      }\n      angular.extend($translationTable[langKey], flatObject(translationTable));\n    }\n    return this;\n  };\n\n  this.translations = translations;\n\n  /**\n   * @ngdoc function\n   * @name pascalprecht.translate.$translateProvider#cloakClassName\n   * @methodOf pascalprecht.translate.$translateProvider\n   *\n   * @description\n   *\n   * Let's you change the class name for `translate-cloak` directive.\n   * Default class name is `translate-cloak`.\n   *\n   * @param {string} name translate-cloak class name\n   */\n  this.cloakClassName = function (name) {\n    if (!name) {\n      return $cloakClassName;\n    }\n    $cloakClassName = name;\n    return this;\n  };\n\n  /**\n   * @ngdoc function\n   * @name pascalprecht.translate.$translateProvider#nestedObjectDelimeter\n   * @methodOf pascalprecht.translate.$translateProvider\n   *\n   * @description\n   *\n   * Let's you change the delimiter for namespaced translations.\n   * Default delimiter is `.`.\n   *\n   * @param {string} delimiter namespace separator\n   */\n  this.nestedObjectDelimeter = function (delimiter) {\n    if (!delimiter) {\n      return $nestedObjectDelimeter;\n    }\n    $nestedObjectDelimeter = delimiter;\n    return this;\n  };\n\n  /**\n   * @name flatObject\n   * @private\n   *\n   * @description\n   * Flats an object. This function is used to flatten given translation data with\n   * namespaces, so they are later accessible via dot notation.\n   */\n  var flatObject = function (data, path, result, prevKey) {\n    var key, keyWithPath, keyWithShortPath, val;\n\n    if (!path) {\n      path = [];\n    }\n    if (!result) {\n      result = {};\n    }\n    for (key in data) {\n      if (!Object.prototype.hasOwnProperty.call(data, key)) {\n        continue;\n      }\n      val = data[key];\n      if (angular.isObject(val)) {\n        flatObject(val, path.concat(key), result, key);\n      } else {\n        keyWithPath = path.length ? ('' + path.join($nestedObjectDelimeter) + $nestedObjectDelimeter + key) : key;\n        if (path.length && key === prevKey) {\n          // Create shortcut path (foo.bar == foo.bar.bar)\n          keyWithShortPath = '' + path.join($nestedObjectDelimeter);\n          // Link it to original path\n          result[keyWithShortPath] = '@:' + keyWithPath;\n        }\n        result[keyWithPath] = val;\n      }\n    }\n    return result;\n  };\n  flatObject.displayName = 'flatObject';\n\n  /**\n   * @ngdoc function\n   * @name pascalprecht.translate.$translateProvider#addInterpolation\n   * @methodOf pascalprecht.translate.$translateProvider\n   *\n   * @description\n   * Adds interpolation services to angular-translate, so it can manage them.\n   *\n   * @param {object} factory Interpolation service factory\n   */\n  this.addInterpolation = function (factory) {\n    $interpolatorFactories.push(factory);\n    return this;\n  };\n\n  /**\n   * @ngdoc function\n   * @name pascalprecht.translate.$translateProvider#useMessageFormatInterpolation\n   * @methodOf pascalprecht.translate.$translateProvider\n   *\n   * @description\n   * Tells angular-translate to use interpolation functionality of messageformat.js.\n   * This is useful when having high level pluralization and gender selection.\n   */\n  this.useMessageFormatInterpolation = function () {\n    return this.useInterpolation('$translateMessageFormatInterpolation');\n  };\n\n  /**\n   * @ngdoc function\n   * @name pascalprecht.translate.$translateProvider#useInterpolation\n   * @methodOf pascalprecht.translate.$translateProvider\n   *\n   * @description\n   * Tells angular-translate which interpolation style to use as default, application-wide.\n   * Simply pass a factory/service name. The interpolation service has to implement\n   * the correct interface.\n   *\n   * @param {string} factory Interpolation service name.\n   */\n  this.useInterpolation = function (factory) {\n    $interpolationFactory = factory;\n    return this;\n  };\n\n  /**\n   * @ngdoc function\n   * @name pascalprecht.translate.$translateProvider#useSanitizeStrategy\n   * @methodOf pascalprecht.translate.$translateProvider\n   *\n   * @description\n   * Simply sets a sanitation strategy type.\n   *\n   * @param {string} value Strategy type.\n   */\n  this.useSanitizeValueStrategy = function (value) {\n    $translateSanitizationProvider.useStrategy(value);\n    return this;\n  };\n\n  /**\n   * @ngdoc function\n   * @name pascalprecht.translate.$translateProvider#preferredLanguage\n   * @methodOf pascalprecht.translate.$translateProvider\n   *\n   * @description\n   * Tells the module which of the registered translation tables to use for translation\n   * at initial startup by passing a language key. Similar to `$translateProvider#use`\n   * only that it says which language to **prefer**.\n   *\n   * @param {string} langKey A language key.\n   */\n  this.preferredLanguage = function (langKey) {\n    if (langKey) {\n      setupPreferredLanguage(langKey);\n      return this;\n    }\n    return $preferredLanguage;\n  };\n  var setupPreferredLanguage = function (langKey) {\n    if (langKey) {\n      $preferredLanguage = langKey;\n    }\n    return $preferredLanguage;\n  };\n  /**\n   * @ngdoc function\n   * @name pascalprecht.translate.$translateProvider#translationNotFoundIndicator\n   * @methodOf pascalprecht.translate.$translateProvider\n   *\n   * @description\n   * Sets an indicator which is used when a translation isn't found. E.g. when\n   * setting the indicator as 'X' and one tries to translate a translation id\n   * called `NOT_FOUND`, this will result in `X NOT_FOUND X`.\n   *\n   * Internally this methods sets a left indicator and a right indicator using\n   * `$translateProvider.translationNotFoundIndicatorLeft()` and\n   * `$translateProvider.translationNotFoundIndicatorRight()`.\n   *\n   * **Note**: These methods automatically add a whitespace between the indicators\n   * and the translation id.\n   *\n   * @param {string} indicator An indicator, could be any string.\n   */\n  this.translationNotFoundIndicator = function (indicator) {\n    this.translationNotFoundIndicatorLeft(indicator);\n    this.translationNotFoundIndicatorRight(indicator);\n    return this;\n  };\n\n  /**\n   * ngdoc function\n   * @name pascalprecht.translate.$translateProvider#translationNotFoundIndicatorLeft\n   * @methodOf pascalprecht.translate.$translateProvider\n   *\n   * @description\n   * Sets an indicator which is used when a translation isn't found left to the\n   * translation id.\n   *\n   * @param {string} indicator An indicator.\n   */\n  this.translationNotFoundIndicatorLeft = function (indicator) {\n    if (!indicator) {\n      return $notFoundIndicatorLeft;\n    }\n    $notFoundIndicatorLeft = indicator;\n    return this;\n  };\n\n  /**\n   * ngdoc function\n   * @name pascalprecht.translate.$translateProvider#translationNotFoundIndicatorLeft\n   * @methodOf pascalprecht.translate.$translateProvider\n   *\n   * @description\n   * Sets an indicator which is used when a translation isn't found right to the\n   * translation id.\n   *\n   * @param {string} indicator An indicator.\n   */\n  this.translationNotFoundIndicatorRight = function (indicator) {\n    if (!indicator) {\n      return $notFoundIndicatorRight;\n    }\n    $notFoundIndicatorRight = indicator;\n    return this;\n  };\n\n  /**\n   * @ngdoc function\n   * @name pascalprecht.translate.$translateProvider#fallbackLanguage\n   * @methodOf pascalprecht.translate.$translateProvider\n   *\n   * @description\n   * Tells the module which of the registered translation tables to use when missing translations\n   * at initial startup by passing a language key. Similar to `$translateProvider#use`\n   * only that it says which language to **fallback**.\n   *\n   * @param {string||array} langKey A language key.\n   *\n   */\n  this.fallbackLanguage = function (langKey) {\n    fallbackStack(langKey);\n    return this;\n  };\n\n  var fallbackStack = function (langKey) {\n    if (langKey) {\n      if (angular.isString(langKey)) {\n        $fallbackWasString = true;\n        $fallbackLanguage = [langKey];\n      } else if (angular.isArray(langKey)) {\n        $fallbackWasString = false;\n        $fallbackLanguage = langKey;\n      }\n      if (angular.isString($preferredLanguage) && indexOf($fallbackLanguage, $preferredLanguage) < 0) {\n        $fallbackLanguage.push($preferredLanguage);\n      }\n\n      return this;\n    } else {\n      if ($fallbackWasString) {\n        return $fallbackLanguage[0];\n      } else {\n        return $fallbackLanguage;\n      }\n    }\n  };\n\n  /**\n   * @ngdoc function\n   * @name pascalprecht.translate.$translateProvider#use\n   * @methodOf pascalprecht.translate.$translateProvider\n   *\n   * @description\n   * Set which translation table to use for translation by given language key. When\n   * trying to 'use' a language which isn't provided, it'll throw an error.\n   *\n   * You actually don't have to use this method since `$translateProvider#preferredLanguage`\n   * does the job too.\n   *\n   * @param {string} langKey A language key.\n   */\n  this.use = function (langKey) {\n    if (langKey) {\n      if (!$translationTable[langKey] && (!$loaderFactory)) {\n        // only throw an error, when not loading translation data asynchronously\n        throw new Error('$translateProvider couldn\\'t find translationTable for langKey: \\'' + langKey + '\\'');\n      }\n      $uses = langKey;\n      return this;\n    }\n    return $uses;\n  };\n\n  /**\n   * @ngdoc function\n   * @name pascalprecht.translate.$translateProvider#resolveClientLocale\n   * @methodOf pascalprecht.translate.$translateProvider\n   *\n   * @description\n   * This returns the current browser/client's language key. The result is processed with the configured uniform tag resolver.\n   *\n   * @returns {string} the current client/browser language key\n   */\n  this.resolveClientLocale = function () {\n    return getLocale();\n  };\n\n  /**\n   * @ngdoc function\n   * @name pascalprecht.translate.$translateProvider#storageKey\n   * @methodOf pascalprecht.translate.$translateProvider\n   *\n   * @description\n   * Tells the module which key must represent the choosed language by a user in the storage.\n   *\n   * @param {string} key A key for the storage.\n   */\n  var storageKey = function (key) {\n    if (!key) {\n      if ($storagePrefix) {\n        return $storagePrefix + $storageKey;\n      }\n      return $storageKey;\n    }\n    $storageKey = key;\n    return this;\n  };\n\n  this.storageKey = storageKey;\n\n  /**\n   * @ngdoc function\n   * @name pascalprecht.translate.$translateProvider#useUrlLoader\n   * @methodOf pascalprecht.translate.$translateProvider\n   *\n   * @description\n   * Tells angular-translate to use `$translateUrlLoader` extension service as loader.\n   *\n   * @param {string} url Url\n   * @param {Object=} options Optional configuration object\n   */\n  this.useUrlLoader = function (url, options) {\n    return this.useLoader('$translateUrlLoader', angular.extend({url : url}, options));\n  };\n\n  /**\n   * @ngdoc function\n   * @name pascalprecht.translate.$translateProvider#useStaticFilesLoader\n   * @methodOf pascalprecht.translate.$translateProvider\n   *\n   * @description\n   * Tells angular-translate to use `$translateStaticFilesLoader` extension service as loader.\n   *\n   * @param {Object=} options Optional configuration object\n   */\n  this.useStaticFilesLoader = function (options) {\n    return this.useLoader('$translateStaticFilesLoader', options);\n  };\n\n  /**\n   * @ngdoc function\n   * @name pascalprecht.translate.$translateProvider#useLoader\n   * @methodOf pascalprecht.translate.$translateProvider\n   *\n   * @description\n   * Tells angular-translate to use any other service as loader.\n   *\n   * @param {string} loaderFactory Factory name to use\n   * @param {Object=} options Optional configuration object\n   */\n  this.useLoader = function (loaderFactory, options) {\n    $loaderFactory = loaderFactory;\n    $loaderOptions = options || {};\n    return this;\n  };\n\n  /**\n   * @ngdoc function\n   * @name pascalprecht.translate.$translateProvider#useLocalStorage\n   * @methodOf pascalprecht.translate.$translateProvider\n   *\n   * @description\n   * Tells angular-translate to use `$translateLocalStorage` service as storage layer.\n   *\n   */\n  this.useLocalStorage = function () {\n    return this.useStorage('$translateLocalStorage');\n  };\n\n  /**\n   * @ngdoc function\n   * @name pascalprecht.translate.$translateProvider#useCookieStorage\n   * @methodOf pascalprecht.translate.$translateProvider\n   *\n   * @description\n   * Tells angular-translate to use `$translateCookieStorage` service as storage layer.\n   */\n  this.useCookieStorage = function () {\n    return this.useStorage('$translateCookieStorage');\n  };\n\n  /**\n   * @ngdoc function\n   * @name pascalprecht.translate.$translateProvider#useStorage\n   * @methodOf pascalprecht.translate.$translateProvider\n   *\n   * @description\n   * Tells angular-translate to use custom service as storage layer.\n   */\n  this.useStorage = function (storageFactory) {\n    $storageFactory = storageFactory;\n    return this;\n  };\n\n  /**\n   * @ngdoc function\n   * @name pascalprecht.translate.$translateProvider#storagePrefix\n   * @methodOf pascalprecht.translate.$translateProvider\n   *\n   * @description\n   * Sets prefix for storage key.\n   *\n   * @param {string} prefix Storage key prefix\n   */\n  this.storagePrefix = function (prefix) {\n    if (!prefix) {\n      return prefix;\n    }\n    $storagePrefix = prefix;\n    return this;\n  };\n\n  /**\n   * @ngdoc function\n   * @name pascalprecht.translate.$translateProvider#useMissingTranslationHandlerLog\n   * @methodOf pascalprecht.translate.$translateProvider\n   *\n   * @description\n   * Tells angular-translate to use built-in log handler when trying to translate\n   * a translation Id which doesn't exist.\n   *\n   * This is actually a shortcut method for `useMissingTranslationHandler()`.\n   *\n   */\n  this.useMissingTranslationHandlerLog = function () {\n    return this.useMissingTranslationHandler('$translateMissingTranslationHandlerLog');\n  };\n\n  /**\n   * @ngdoc function\n   * @name pascalprecht.translate.$translateProvider#useMissingTranslationHandler\n   * @methodOf pascalprecht.translate.$translateProvider\n   *\n   * @description\n   * Expects a factory name which later gets instantiated with `$injector`.\n   * This method can be used to tell angular-translate to use a custom\n   * missingTranslationHandler. Just build a factory which returns a function\n   * and expects a translation id as argument.\n   *\n   * Example:\n   * <pre>\n   *  app.config(function ($translateProvider) {\n   *    $translateProvider.useMissingTranslationHandler('customHandler');\n   *  });\n   *\n   *  app.factory('customHandler', function (dep1, dep2) {\n   *    return function (translationId) {\n   *      // something with translationId and dep1 and dep2\n   *    };\n   *  });\n   * </pre>\n   *\n   * @param {string} factory Factory name\n   */\n  this.useMissingTranslationHandler = function (factory) {\n    $missingTranslationHandlerFactory = factory;\n    return this;\n  };\n\n  /**\n   * @ngdoc function\n   * @name pascalprecht.translate.$translateProvider#usePostCompiling\n   * @methodOf pascalprecht.translate.$translateProvider\n   *\n   * @description\n   * If post compiling is enabled, all translated values will be processed\n   * again with AngularJS' $compile.\n   *\n   * Example:\n   * <pre>\n   *  app.config(function ($translateProvider) {\n   *    $translateProvider.usePostCompiling(true);\n   *  });\n   * </pre>\n   *\n   * @param {string} factory Factory name\n   */\n  this.usePostCompiling = function (value) {\n    $postCompilingEnabled = !(!value);\n    return this;\n  };\n\n  /**\n   * @ngdoc function\n   * @name pascalprecht.translate.$translateProvider#forceAsyncReload\n   * @methodOf pascalprecht.translate.$translateProvider\n   *\n   * @description\n   * If force async reload is enabled, async loader will always be called\n   * even if $translationTable already contains the language key, adding\n   * possible new entries to the $translationTable.\n   *\n   * Example:\n   * <pre>\n   *  app.config(function ($translateProvider) {\n   *    $translateProvider.forceAsyncReload(true);\n   *  });\n   * </pre>\n   *\n   * @param {boolean} value - valid values are true or false\n   */\n  this.forceAsyncReload = function (value) {\n    $forceAsyncReloadEnabled = !(!value);\n    return this;\n  };\n\n  /**\n   * @ngdoc function\n   * @name pascalprecht.translate.$translateProvider#uniformLanguageTag\n   * @methodOf pascalprecht.translate.$translateProvider\n   *\n   * @description\n   * Tells angular-translate which language tag should be used as a result when determining\n   * the current browser language.\n   *\n   * This setting must be set before invoking {@link pascalprecht.translate.$translateProvider#methods_determinePreferredLanguage determinePreferredLanguage()}.\n   *\n   * <pre>\n   * $translateProvider\n   *   .uniformLanguageTag('bcp47')\n   *   .determinePreferredLanguage()\n   * </pre>\n   *\n   * The resolver currently supports:\n   * * default\n   *     (traditionally: hyphens will be converted into underscores, i.e. en-US => en_US)\n   *     en-US => en_US\n   *     en_US => en_US\n   *     en-us => en_us\n   * * java\n   *     like default, but the second part will be always in uppercase\n   *     en-US => en_US\n   *     en_US => en_US\n   *     en-us => en_US\n   * * BCP 47 (RFC 4646 & 4647)\n   *     en-US => en-US\n   *     en_US => en-US\n   *     en-us => en-US\n   *\n   * See also:\n   * * http://en.wikipedia.org/wiki/IETF_language_tag\n   * * http://www.w3.org/International/core/langtags/\n   * * http://tools.ietf.org/html/bcp47\n   *\n   * @param {string|object} options - options (or standard)\n   * @param {string} options.standard - valid values are 'default', 'bcp47', 'java'\n   */\n  this.uniformLanguageTag = function (options) {\n\n    if (!options) {\n      options = {};\n    } else if (angular.isString(options)) {\n      options = {\n        standard : options\n      };\n    }\n\n    uniformLanguageTagResolver = options.standard;\n\n    return this;\n  };\n\n  /**\n   * @ngdoc function\n   * @name pascalprecht.translate.$translateProvider#determinePreferredLanguage\n   * @methodOf pascalprecht.translate.$translateProvider\n   *\n   * @description\n   * Tells angular-translate to try to determine on its own which language key\n   * to set as preferred language. When `fn` is given, angular-translate uses it\n   * to determine a language key, otherwise it uses the built-in `getLocale()`\n   * method.\n   *\n   * The `getLocale()` returns a language key in the format `[lang]_[country]` or\n   * `[lang]` depending on what the browser provides.\n   *\n   * Use this method at your own risk, since not all browsers return a valid\n   * locale (see {@link pascalprecht.translate.$translateProvider#methods_uniformLanguageTag uniformLanguageTag()}).\n   *\n   * @param {Function=} fn Function to determine a browser's locale\n   */\n  this.determinePreferredLanguage = function (fn) {\n\n    var locale = (fn && angular.isFunction(fn)) ? fn() : getLocale();\n\n    if (!$availableLanguageKeys.length) {\n      $preferredLanguage = locale;\n    } else {\n      $preferredLanguage = negotiateLocale(locale) || locale;\n    }\n\n    return this;\n  };\n\n  /**\n   * @ngdoc function\n   * @name pascalprecht.translate.$translateProvider#registerAvailableLanguageKeys\n   * @methodOf pascalprecht.translate.$translateProvider\n   *\n   * @description\n   * Registers a set of language keys the app will work with. Use this method in\n   * combination with\n   * {@link pascalprecht.translate.$translateProvider#determinePreferredLanguage determinePreferredLanguage}.\n   * When available languages keys are registered, angular-translate\n   * tries to find the best fitting language key depending on the browsers locale,\n   * considering your language key convention.\n   *\n   * @param {object} languageKeys Array of language keys the your app will use\n   * @param {object=} aliases Alias map.\n   */\n  this.registerAvailableLanguageKeys = function (languageKeys, aliases) {\n    if (languageKeys) {\n      $availableLanguageKeys = languageKeys;\n      if (aliases) {\n        $languageKeyAliases = aliases;\n      }\n      return this;\n    }\n    return $availableLanguageKeys;\n  };\n\n  /**\n   * @ngdoc function\n   * @name pascalprecht.translate.$translateProvider#useLoaderCache\n   * @methodOf pascalprecht.translate.$translateProvider\n   *\n   * @description\n   * Registers a cache for internal $http based loaders.\n   * {@link pascalprecht.translate.$translationCache $translationCache}.\n   * When false the cache will be disabled (default). When true or undefined\n   * the cache will be a default (see $cacheFactory). When an object it will\n   * be treat as a cache object itself: the usage is $http({cache: cache})\n   *\n   * @param {object} cache boolean, string or cache-object\n   */\n  this.useLoaderCache = function (cache) {\n    if (cache === false) {\n      // disable cache\n      loaderCache = undefined;\n    } else if (cache === true) {\n      // enable cache using AJS defaults\n      loaderCache = true;\n    } else if (typeof(cache) === 'undefined') {\n      // enable cache using default\n      loaderCache = '$translationCache';\n    } else if (cache) {\n      // enable cache using given one (see $cacheFactory)\n      loaderCache = cache;\n    }\n    return this;\n  };\n\n  /**\n   * @ngdoc function\n   * @name pascalprecht.translate.$translateProvider#directivePriority\n   * @methodOf pascalprecht.translate.$translateProvider\n   *\n   * @description\n   * Sets the default priority of the translate directive. The standard value is `0`.\n   * Calling this function without an argument will return the current value.\n   *\n   * @param {number} priority for the translate-directive\n   */\n  this.directivePriority = function (priority) {\n    if (priority === undefined) {\n      // getter\n      return directivePriority;\n    } else {\n      // setter with chaining\n      directivePriority = priority;\n      return this;\n    }\n  };\n\n  /**\n   * @ngdoc function\n   * @name pascalprecht.translate.$translateProvider#statefulFilter\n   * @methodOf pascalprecht.translate.$translateProvider\n   *\n   * @description\n   * Since AngularJS 1.3, filters which are not stateless (depending at the scope)\n   * have to explicit define this behavior.\n   * Sets whether the translate filter should be stateful or stateless. The standard value is `true`\n   * meaning being stateful.\n   * Calling this function without an argument will return the current value.\n   *\n   * @param {boolean} state - defines the state of the filter\n   */\n  this.statefulFilter = function (state) {\n    if (state === undefined) {\n      // getter\n      return statefulFilter;\n    } else {\n      // setter with chaining\n      statefulFilter = state;\n      return this;\n    }\n  };\n\n  /**\n   * @ngdoc function\n   * @name pascalprecht.translate.$translateProvider#postProcess\n   * @methodOf pascalprecht.translate.$translateProvider\n   *\n   * @description\n   * The post processor will be intercept right after the translation result. It can modify the result.\n   *\n   * @param {object} fn Function or service name (string) to be called after the translation value has been set / resolved. The function itself will enrich every value being processed and then continue the normal resolver process\n   */\n  this.postProcess = function (fn) {\n    if (fn) {\n      postProcessFn = fn;\n    } else {\n      postProcessFn = undefined;\n    }\n    return this;\n  };\n\n  /**\n   * @ngdoc function\n   * @name pascalprecht.translate.$translateProvider#keepContent\n   * @methodOf pascalprecht.translate.$translateProvider\n   *\n   * @description\n   * If keepContent is set to true than translate directive will always use innerHTML\n   * as a default translation\n   *\n   * Example:\n   * <pre>\n   *  app.config(function ($translateProvider) {\n   *    $translateProvider.keepContent(true);\n   *  });\n   * </pre>\n   *\n   * @param {boolean} value - valid values are true or false\n   */\n  this.keepContent = function (value) {\n    $keepContent = !(!value);\n    return this;\n  };\n\n  /**\n   * @ngdoc object\n   * @name pascalprecht.translate.$translate\n   * @requires $interpolate\n   * @requires $log\n   * @requires $rootScope\n   * @requires $q\n   *\n   * @description\n   * The `$translate` service is the actual core of angular-translate. It expects a translation id\n   * and optional interpolate parameters to translate contents.\n   *\n   * <pre>\n   *  $translate('HEADLINE_TEXT').then(function (translation) {\n   *    $scope.translatedText = translation;\n   *  });\n   * </pre>\n   *\n   * @param {string|array} translationId A token which represents a translation id\n   *                                     This can be optionally an array of translation ids which\n   *                                     results that the function returns an object where each key\n   *                                     is the translation id and the value the translation.\n   * @param {object=} interpolateParams An object hash for dynamic values\n   * @param {string} interpolationId The id of the interpolation to use\n   * @param {string} defaultTranslationText the optional default translation text that is written as\n   *                                        as default text in case it is not found in any configured language\n   * @param {string} forceLanguage A language to be used instead of the current language\n   * @returns {object} promise\n   */\n  this.$get = ['$log', '$injector', '$rootScope', '$q', function ($log, $injector, $rootScope, $q) {\n\n    var Storage,\n      defaultInterpolator = $injector.get($interpolationFactory || '$translateDefaultInterpolation'),\n      pendingLoader = false,\n      interpolatorHashMap = {},\n      langPromises = {},\n      fallbackIndex,\n      startFallbackIteration;\n\n    var $translate = function (translationId, interpolateParams, interpolationId, defaultTranslationText, forceLanguage) {\n      if (!$uses && $preferredLanguage) {\n        $uses = $preferredLanguage;\n      }\n      var uses = (forceLanguage && forceLanguage !== $uses) ? // we don't want to re-negotiate $uses\n        (negotiateLocale(forceLanguage) || forceLanguage) : $uses;\n\n      // Check forceLanguage is present\n      if (forceLanguage) {\n        loadTranslationsIfMissing(forceLanguage);\n      }\n\n      // Duck detection: If the first argument is an array, a bunch of translations was requested.\n      // The result is an object.\n      if (angular.isArray(translationId)) {\n        // Inspired by Q.allSettled by Kris Kowal\n        // https://github.com/kriskowal/q/blob/b0fa72980717dc202ffc3cbf03b936e10ebbb9d7/q.js#L1553-1563\n        // This transforms all promises regardless resolved or rejected\n        var translateAll = function (translationIds) {\n          var results = {}; // storing the actual results\n          var promises = []; // promises to wait for\n          // Wraps the promise a) being always resolved and b) storing the link id->value\n          var translate = function (translationId) {\n            var deferred = $q.defer();\n            var regardless = function (value) {\n              results[translationId] = value;\n              deferred.resolve([translationId, value]);\n            };\n            // we don't care whether the promise was resolved or rejected; just store the values\n            $translate(translationId, interpolateParams, interpolationId, defaultTranslationText, forceLanguage).then(regardless, regardless);\n            return deferred.promise;\n          };\n          for (var i = 0, c = translationIds.length; i < c; i++) {\n            promises.push(translate(translationIds[i]));\n          }\n          // wait for all (including storing to results)\n          return $q.all(promises).then(function () {\n            // return the results\n            return results;\n          });\n        };\n        return translateAll(translationId);\n      }\n\n      var deferred = $q.defer();\n\n      // trim off any whitespace\n      if (translationId) {\n        translationId = trim.apply(translationId);\n      }\n\n      var promiseToWaitFor = (function () {\n        var promise = $preferredLanguage ?\n          langPromises[$preferredLanguage] :\n          langPromises[uses];\n\n        fallbackIndex = 0;\n\n        if ($storageFactory && !promise) {\n          // looks like there's no pending promise for $preferredLanguage or\n          // $uses. Maybe there's one pending for a language that comes from\n          // storage.\n          var langKey = Storage.get($storageKey);\n          promise = langPromises[langKey];\n\n          if ($fallbackLanguage && $fallbackLanguage.length) {\n            var index = indexOf($fallbackLanguage, langKey);\n            // maybe the language from storage is also defined as fallback language\n            // we increase the fallback language index to not search in that language\n            // as fallback, since it's probably the first used language\n            // in that case the index starts after the first element\n            fallbackIndex = (index === 0) ? 1 : 0;\n\n            // but we can make sure to ALWAYS fallback to preferred language at least\n            if (indexOf($fallbackLanguage, $preferredLanguage) < 0) {\n              $fallbackLanguage.push($preferredLanguage);\n            }\n          }\n        }\n        return promise;\n      }());\n\n      if (!promiseToWaitFor) {\n        // no promise to wait for? okay. Then there's no loader registered\n        // nor is a one pending for language that comes from storage.\n        // We can just translate.\n        determineTranslation(translationId, interpolateParams, interpolationId, defaultTranslationText, uses).then(deferred.resolve, deferred.reject);\n      } else {\n        var promiseResolved = function () {\n          // $uses may have changed while waiting\n          if (!forceLanguage) {\n            uses = $uses;\n          }\n          determineTranslation(translationId, interpolateParams, interpolationId, defaultTranslationText, uses).then(deferred.resolve, deferred.reject);\n        };\n        promiseResolved.displayName = 'promiseResolved';\n\n        promiseToWaitFor['finally'](promiseResolved);\n      }\n      return deferred.promise;\n    };\n\n    /**\n     * @name applyNotFoundIndicators\n     * @private\n     *\n     * @description\n     * Applies not fount indicators to given translation id, if needed.\n     * This function gets only executed, if a translation id doesn't exist,\n     * which is why a translation id is expected as argument.\n     *\n     * @param {string} translationId Translation id.\n     * @returns {string} Same as given translation id but applied with not found\n     * indicators.\n     */\n    var applyNotFoundIndicators = function (translationId) {\n      // applying notFoundIndicators\n      if ($notFoundIndicatorLeft) {\n        translationId = [$notFoundIndicatorLeft, translationId].join(' ');\n      }\n      if ($notFoundIndicatorRight) {\n        translationId = [translationId, $notFoundIndicatorRight].join(' ');\n      }\n      return translationId;\n    };\n\n    /**\n     * @name useLanguage\n     * @private\n     *\n     * @description\n     * Makes actual use of a language by setting a given language key as used\n     * language and informs registered interpolators to also use the given\n     * key as locale.\n     *\n     * @param {string} key Locale key.\n     */\n    var useLanguage = function (key) {\n      $uses = key;\n\n      // make sure to store new language key before triggering success event\n      if ($storageFactory) {\n        Storage.put($translate.storageKey(), $uses);\n      }\n\n      $rootScope.$emit('$translateChangeSuccess', {language : key});\n\n      // inform default interpolator\n      defaultInterpolator.setLocale($uses);\n\n      var eachInterpolator = function (interpolator, id) {\n        interpolatorHashMap[id].setLocale($uses);\n      };\n      eachInterpolator.displayName = 'eachInterpolatorLocaleSetter';\n\n      // inform all others too!\n      angular.forEach(interpolatorHashMap, eachInterpolator);\n      $rootScope.$emit('$translateChangeEnd', {language : key});\n    };\n\n    /**\n     * @name loadAsync\n     * @private\n     *\n     * @description\n     * Kicks of registered async loader using `$injector` and applies existing\n     * loader options. When resolved, it updates translation tables accordingly\n     * or rejects with given language key.\n     *\n     * @param {string} key Language key.\n     * @return {Promise} A promise.\n     */\n    var loadAsync = function (key) {\n      if (!key) {\n        throw 'No language key specified for loading.';\n      }\n\n      var deferred = $q.defer();\n\n      $rootScope.$emit('$translateLoadingStart', {language : key});\n      pendingLoader = true;\n\n      var cache = loaderCache;\n      if (typeof(cache) === 'string') {\n        // getting on-demand instance of loader\n        cache = $injector.get(cache);\n      }\n\n      var loaderOptions = angular.extend({}, $loaderOptions, {\n        key : key,\n        $http : angular.extend({}, {\n          cache : cache\n        }, $loaderOptions.$http)\n      });\n\n      var onLoaderSuccess = function (data) {\n        var translationTable = {};\n        $rootScope.$emit('$translateLoadingSuccess', {language : key});\n\n        if (angular.isArray(data)) {\n          angular.forEach(data, function (table) {\n            angular.extend(translationTable, flatObject(table));\n          });\n        } else {\n          angular.extend(translationTable, flatObject(data));\n        }\n        pendingLoader = false;\n        deferred.resolve({\n          key : key,\n          table : translationTable\n        });\n        $rootScope.$emit('$translateLoadingEnd', {language : key});\n      };\n      onLoaderSuccess.displayName = 'onLoaderSuccess';\n\n      var onLoaderError = function (key) {\n        $rootScope.$emit('$translateLoadingError', {language : key});\n        deferred.reject(key);\n        $rootScope.$emit('$translateLoadingEnd', {language : key});\n      };\n      onLoaderError.displayName = 'onLoaderError';\n\n      $injector.get($loaderFactory)(loaderOptions)\n        .then(onLoaderSuccess, onLoaderError);\n\n      return deferred.promise;\n    };\n\n    if ($storageFactory) {\n      Storage = $injector.get($storageFactory);\n\n      if (!Storage.get || !Storage.put) {\n        throw new Error('Couldn\\'t use storage \\'' + $storageFactory + '\\', missing get() or put() method!');\n      }\n    }\n\n    // if we have additional interpolations that were added via\n    // $translateProvider.addInterpolation(), we have to map'em\n    if ($interpolatorFactories.length) {\n      var eachInterpolationFactory = function (interpolatorFactory) {\n        var interpolator = $injector.get(interpolatorFactory);\n        // setting initial locale for each interpolation service\n        interpolator.setLocale($preferredLanguage || $uses);\n        // make'em recognizable through id\n        interpolatorHashMap[interpolator.getInterpolationIdentifier()] = interpolator;\n      };\n      eachInterpolationFactory.displayName = 'interpolationFactoryAdder';\n\n      angular.forEach($interpolatorFactories, eachInterpolationFactory);\n    }\n\n    /**\n     * @name getTranslationTable\n     * @private\n     *\n     * @description\n     * Returns a promise that resolves to the translation table\n     * or is rejected if an error occurred.\n     *\n     * @param langKey\n     * @returns {Q.promise}\n     */\n    var getTranslationTable = function (langKey) {\n      var deferred = $q.defer();\n      if (Object.prototype.hasOwnProperty.call($translationTable, langKey)) {\n        deferred.resolve($translationTable[langKey]);\n      } else if (langPromises[langKey]) {\n        var onResolve = function (data) {\n          translations(data.key, data.table);\n          deferred.resolve(data.table);\n        };\n        onResolve.displayName = 'translationTableResolver';\n        langPromises[langKey].then(onResolve, deferred.reject);\n      } else {\n        deferred.reject();\n      }\n      return deferred.promise;\n    };\n\n    /**\n     * @name getFallbackTranslation\n     * @private\n     *\n     * @description\n     * Returns a promise that will resolve to the translation\n     * or be rejected if no translation was found for the language.\n     * This function is currently only used for fallback language translation.\n     *\n     * @param langKey The language to translate to.\n     * @param translationId\n     * @param interpolateParams\n     * @param Interpolator\n     * @returns {Q.promise}\n     */\n    var getFallbackTranslation = function (langKey, translationId, interpolateParams, Interpolator) {\n      var deferred = $q.defer();\n\n      var onResolve = function (translationTable) {\n        if (Object.prototype.hasOwnProperty.call(translationTable, translationId)) {\n          Interpolator.setLocale(langKey);\n          var translation = translationTable[translationId];\n          if (translation.substr(0, 2) === '@:') {\n            getFallbackTranslation(langKey, translation.substr(2), interpolateParams, Interpolator)\n              .then(deferred.resolve, deferred.reject);\n          } else {\n            var interpolatedValue = Interpolator.interpolate(translationTable[translationId], interpolateParams, 'service');\n            interpolatedValue = applyPostProcessing(translationId, translationTable[translationId], interpolatedValue, interpolateParams, langKey);\n\n            deferred.resolve(interpolatedValue);\n\n          }\n          Interpolator.setLocale($uses);\n        } else {\n          deferred.reject();\n        }\n      };\n      onResolve.displayName = 'fallbackTranslationResolver';\n\n      getTranslationTable(langKey).then(onResolve, deferred.reject);\n\n      return deferred.promise;\n    };\n\n    /**\n     * @name getFallbackTranslationInstant\n     * @private\n     *\n     * @description\n     * Returns a translation\n     * This function is currently only used for fallback language translation.\n     *\n     * @param langKey The language to translate to.\n     * @param translationId\n     * @param interpolateParams\n     * @param Interpolator\n     * @param sanitizeStrategy sanitize strategy override\n     *\n     * @returns {string} translation\n     */\n    var getFallbackTranslationInstant = function (langKey, translationId, interpolateParams, Interpolator, sanitizeStrategy) {\n      var result, translationTable = $translationTable[langKey];\n\n      if (translationTable && Object.prototype.hasOwnProperty.call(translationTable, translationId)) {\n        Interpolator.setLocale(langKey);\n        result = Interpolator.interpolate(translationTable[translationId], interpolateParams, 'filter', sanitizeStrategy);\n        result = applyPostProcessing(translationId, translationTable[translationId], result, interpolateParams, langKey, sanitizeStrategy);\n        // workaround for TrustedValueHolderType\n        if (!angular.isString(result) && angular.isFunction(result.$$unwrapTrustedValue)) {\n          var result2 = result.$$unwrapTrustedValue();\n          if (result2.substr(0, 2) === '@:') {\n            return getFallbackTranslationInstant(langKey, result2.substr(2), interpolateParams, Interpolator, sanitizeStrategy);\n          }\n        } else if (result.substr(0, 2) === '@:') {\n          return getFallbackTranslationInstant(langKey, result.substr(2), interpolateParams, Interpolator, sanitizeStrategy);\n        }\n        Interpolator.setLocale($uses);\n      }\n\n      return result;\n    };\n\n\n    /**\n     * @name translateByHandler\n     * @private\n     *\n     * Translate by missing translation handler.\n     *\n     * @param translationId\n     * @param interpolateParams\n     * @param defaultTranslationText\n     * @param sanitizeStrategy sanitize strategy override\n     *\n     * @returns translation created by $missingTranslationHandler or translationId is $missingTranslationHandler is\n     * absent\n     */\n    var translateByHandler = function (translationId, interpolateParams, defaultTranslationText, sanitizeStrategy) {\n      // If we have a handler factory - we might also call it here to determine if it provides\n      // a default text for a translationid that can't be found anywhere in our tables\n      if ($missingTranslationHandlerFactory) {\n        return $injector.get($missingTranslationHandlerFactory)(translationId, $uses, interpolateParams, defaultTranslationText, sanitizeStrategy);\n      } else {\n        return translationId;\n      }\n    };\n\n    /**\n     * @name resolveForFallbackLanguage\n     * @private\n     *\n     * Recursive helper function for fallbackTranslation that will sequentially look\n     * for a translation in the fallbackLanguages starting with fallbackLanguageIndex.\n     *\n     * @param fallbackLanguageIndex\n     * @param translationId\n     * @param interpolateParams\n     * @param Interpolator\n     * @returns {Q.promise} Promise that will resolve to the translation.\n     */\n    var resolveForFallbackLanguage = function (fallbackLanguageIndex, translationId, interpolateParams, Interpolator, defaultTranslationText) {\n      var deferred = $q.defer();\n\n      if (fallbackLanguageIndex < $fallbackLanguage.length) {\n        var langKey = $fallbackLanguage[fallbackLanguageIndex];\n        getFallbackTranslation(langKey, translationId, interpolateParams, Interpolator).then(\n          function (data) {\n            deferred.resolve(data);\n          },\n          function () {\n            // Look in the next fallback language for a translation.\n            // It delays the resolving by passing another promise to resolve.\n            return resolveForFallbackLanguage(fallbackLanguageIndex + 1, translationId, interpolateParams, Interpolator, defaultTranslationText).then(deferred.resolve, deferred.reject);\n          }\n        );\n      } else {\n        // No translation found in any fallback language\n        // if a default translation text is set in the directive, then return this as a result\n        if (defaultTranslationText) {\n          deferred.resolve(defaultTranslationText);\n        } else {\n          var missingTranslationHandlerTranslation = translateByHandler(translationId, interpolateParams, defaultTranslationText);\n\n          // if no default translation is set and an error handler is defined, send it to the handler\n          // and then return the result if it isn't undefined\n          if ($missingTranslationHandlerFactory && missingTranslationHandlerTranslation) {\n            deferred.resolve(missingTranslationHandlerTranslation);\n          } else {\n            deferred.reject(applyNotFoundIndicators(translationId));\n          }\n        }\n      }\n      return deferred.promise;\n    };\n\n    /**\n     * @name resolveForFallbackLanguageInstant\n     * @private\n     *\n     * Recursive helper function for fallbackTranslation that will sequentially look\n     * for a translation in the fallbackLanguages starting with fallbackLanguageIndex.\n     *\n     * @param fallbackLanguageIndex\n     * @param translationId\n     * @param interpolateParams\n     * @param Interpolator\n     * @param sanitizeStrategy\n     * @returns {string} translation\n     */\n    var resolveForFallbackLanguageInstant = function (fallbackLanguageIndex, translationId, interpolateParams, Interpolator, sanitizeStrategy) {\n      var result;\n\n      if (fallbackLanguageIndex < $fallbackLanguage.length) {\n        var langKey = $fallbackLanguage[fallbackLanguageIndex];\n        result = getFallbackTranslationInstant(langKey, translationId, interpolateParams, Interpolator, sanitizeStrategy);\n        if (!result && result !== '') {\n          result = resolveForFallbackLanguageInstant(fallbackLanguageIndex + 1, translationId, interpolateParams, Interpolator);\n        }\n      }\n      return result;\n    };\n\n    /**\n     * Translates with the usage of the fallback languages.\n     *\n     * @param translationId\n     * @param interpolateParams\n     * @param Interpolator\n     * @returns {Q.promise} Promise, that resolves to the translation.\n     */\n    var fallbackTranslation = function (translationId, interpolateParams, Interpolator, defaultTranslationText) {\n      // Start with the fallbackLanguage with index 0\n      return resolveForFallbackLanguage((startFallbackIteration > 0 ? startFallbackIteration : fallbackIndex), translationId, interpolateParams, Interpolator, defaultTranslationText);\n    };\n\n    /**\n     * Translates with the usage of the fallback languages.\n     *\n     * @param translationId\n     * @param interpolateParams\n     * @param Interpolator\n     * @returns {String} translation\n     */\n    var fallbackTranslationInstant = function (translationId, interpolateParams, Interpolator, sanitizeStrategy) {\n      // Start with the fallbackLanguage with index 0\n      return resolveForFallbackLanguageInstant((startFallbackIteration > 0 ? startFallbackIteration : fallbackIndex), translationId, interpolateParams, Interpolator, sanitizeStrategy);\n    };\n\n    var determineTranslation = function (translationId, interpolateParams, interpolationId, defaultTranslationText, uses) {\n\n      var deferred = $q.defer();\n\n      var table = uses ? $translationTable[uses] : $translationTable,\n        Interpolator = (interpolationId) ? interpolatorHashMap[interpolationId] : defaultInterpolator;\n\n      // if the translation id exists, we can just interpolate it\n      if (table && Object.prototype.hasOwnProperty.call(table, translationId)) {\n        var translation = table[translationId];\n\n        // If using link, rerun $translate with linked translationId and return it\n        if (translation.substr(0, 2) === '@:') {\n\n          $translate(translation.substr(2), interpolateParams, interpolationId, defaultTranslationText, uses)\n            .then(deferred.resolve, deferred.reject);\n        } else {\n          //\n          var resolvedTranslation = Interpolator.interpolate(translation, interpolateParams, 'service');\n          resolvedTranslation = applyPostProcessing(translationId, translation, resolvedTranslation, interpolateParams, uses);\n          deferred.resolve(resolvedTranslation);\n        }\n      } else {\n        var missingTranslationHandlerTranslation;\n        // for logging purposes only (as in $translateMissingTranslationHandlerLog), value is not returned to promise\n        if ($missingTranslationHandlerFactory && !pendingLoader) {\n          missingTranslationHandlerTranslation = translateByHandler(translationId, interpolateParams, defaultTranslationText);\n        }\n\n        // since we couldn't translate the inital requested translation id,\n        // we try it now with one or more fallback languages, if fallback language(s) is\n        // configured.\n        if (uses && $fallbackLanguage && $fallbackLanguage.length) {\n          fallbackTranslation(translationId, interpolateParams, Interpolator, defaultTranslationText)\n            .then(function (translation) {\n              deferred.resolve(translation);\n            }, function (_translationId) {\n              deferred.reject(applyNotFoundIndicators(_translationId));\n            });\n        } else if ($missingTranslationHandlerFactory && !pendingLoader && missingTranslationHandlerTranslation) {\n          // looks like the requested translation id doesn't exists.\n          // Now, if there is a registered handler for missing translations and no\n          // asyncLoader is pending, we execute the handler\n          if (defaultTranslationText) {\n            deferred.resolve(defaultTranslationText);\n          } else {\n            deferred.resolve(missingTranslationHandlerTranslation);\n          }\n        } else {\n          if (defaultTranslationText) {\n            deferred.resolve(defaultTranslationText);\n          } else {\n            deferred.reject(applyNotFoundIndicators(translationId));\n          }\n        }\n      }\n      return deferred.promise;\n    };\n\n    var determineTranslationInstant = function (translationId, interpolateParams, interpolationId, uses, sanitizeStrategy) {\n\n      var result, table = uses ? $translationTable[uses] : $translationTable,\n        Interpolator = defaultInterpolator;\n\n      // if the interpolation id exists use custom interpolator\n      if (interpolatorHashMap && Object.prototype.hasOwnProperty.call(interpolatorHashMap, interpolationId)) {\n        Interpolator = interpolatorHashMap[interpolationId];\n      }\n\n      // if the translation id exists, we can just interpolate it\n      if (table && Object.prototype.hasOwnProperty.call(table, translationId)) {\n        var translation = table[translationId];\n\n        // If using link, rerun $translate with linked translationId and return it\n        if (translation.substr(0, 2) === '@:') {\n          result = determineTranslationInstant(translation.substr(2), interpolateParams, interpolationId, uses, sanitizeStrategy);\n        } else {\n          result = Interpolator.interpolate(translation, interpolateParams, 'filter', sanitizeStrategy);\n          result = applyPostProcessing(translationId, translation, result, interpolateParams, uses, sanitizeStrategy);\n        }\n      } else {\n        var missingTranslationHandlerTranslation;\n        // for logging purposes only (as in $translateMissingTranslationHandlerLog), value is not returned to promise\n        if ($missingTranslationHandlerFactory && !pendingLoader) {\n          missingTranslationHandlerTranslation = translateByHandler(translationId, interpolateParams, sanitizeStrategy);\n        }\n\n        // since we couldn't translate the inital requested translation id,\n        // we try it now with one or more fallback languages, if fallback language(s) is\n        // configured.\n        if (uses && $fallbackLanguage && $fallbackLanguage.length) {\n          fallbackIndex = 0;\n          result = fallbackTranslationInstant(translationId, interpolateParams, Interpolator, sanitizeStrategy);\n        } else if ($missingTranslationHandlerFactory && !pendingLoader && missingTranslationHandlerTranslation) {\n          // looks like the requested translation id doesn't exists.\n          // Now, if there is a registered handler for missing translations and no\n          // asyncLoader is pending, we execute the handler\n          result = missingTranslationHandlerTranslation;\n        } else {\n          result = applyNotFoundIndicators(translationId);\n        }\n      }\n\n      return result;\n    };\n\n    var clearNextLangAndPromise = function (key) {\n      if ($nextLang === key) {\n        $nextLang = undefined;\n      }\n      langPromises[key] = undefined;\n    };\n\n    var applyPostProcessing = function (translationId, translation, resolvedTranslation, interpolateParams, uses, sanitizeStrategy) {\n      var fn = postProcessFn;\n\n      if (fn) {\n\n        if (typeof(fn) === 'string') {\n          // getting on-demand instance\n          fn = $injector.get(fn);\n        }\n        if (fn) {\n          return fn(translationId, translation, resolvedTranslation, interpolateParams, uses, sanitizeStrategy);\n        }\n      }\n\n      return resolvedTranslation;\n    };\n\n    var loadTranslationsIfMissing = function (key) {\n      if (!$translationTable[key] && $loaderFactory && !langPromises[key]) {\n        langPromises[key] = loadAsync(key).then(function (translation) {\n          translations(translation.key, translation.table);\n          return translation;\n        });\n      }\n    };\n\n    /**\n     * @ngdoc function\n     * @name pascalprecht.translate.$translate#preferredLanguage\n     * @methodOf pascalprecht.translate.$translate\n     *\n     * @description\n     * Returns the language key for the preferred language.\n     *\n     * @param {string} langKey language String or Array to be used as preferredLanguage (changing at runtime)\n     *\n     * @return {string} preferred language key\n     */\n    $translate.preferredLanguage = function (langKey) {\n      if (langKey) {\n        setupPreferredLanguage(langKey);\n      }\n      return $preferredLanguage;\n    };\n\n    /**\n     * @ngdoc function\n     * @name pascalprecht.translate.$translate#cloakClassName\n     * @methodOf pascalprecht.translate.$translate\n     *\n     * @description\n     * Returns the configured class name for `translate-cloak` directive.\n     *\n     * @return {string} cloakClassName\n     */\n    $translate.cloakClassName = function () {\n      return $cloakClassName;\n    };\n\n    /**\n     * @ngdoc function\n     * @name pascalprecht.translate.$translate#nestedObjectDelimeter\n     * @methodOf pascalprecht.translate.$translate\n     *\n     * @description\n     * Returns the configured delimiter for nested namespaces.\n     *\n     * @return {string} nestedObjectDelimeter\n     */\n    $translate.nestedObjectDelimeter = function () {\n      return $nestedObjectDelimeter;\n    };\n\n    /**\n     * @ngdoc function\n     * @name pascalprecht.translate.$translate#fallbackLanguage\n     * @methodOf pascalprecht.translate.$translate\n     *\n     * @description\n     * Returns the language key for the fallback languages or sets a new fallback stack.\n     *\n     * @param {string=} langKey language String or Array of fallback languages to be used (to change stack at runtime)\n     *\n     * @return {string||array} fallback language key\n     */\n    $translate.fallbackLanguage = function (langKey) {\n      if (langKey !== undefined && langKey !== null) {\n        fallbackStack(langKey);\n\n        // as we might have an async loader initiated and a new translation language might have been defined\n        // we need to add the promise to the stack also. So - iterate.\n        if ($loaderFactory) {\n          if ($fallbackLanguage && $fallbackLanguage.length) {\n            for (var i = 0, len = $fallbackLanguage.length; i < len; i++) {\n              if (!langPromises[$fallbackLanguage[i]]) {\n                langPromises[$fallbackLanguage[i]] = loadAsync($fallbackLanguage[i]);\n              }\n            }\n          }\n        }\n        $translate.use($translate.use());\n      }\n      if ($fallbackWasString) {\n        return $fallbackLanguage[0];\n      } else {\n        return $fallbackLanguage;\n      }\n\n    };\n\n    /**\n     * @ngdoc function\n     * @name pascalprecht.translate.$translate#useFallbackLanguage\n     * @methodOf pascalprecht.translate.$translate\n     *\n     * @description\n     * Sets the first key of the fallback language stack to be used for translation.\n     * Therefore all languages in the fallback array BEFORE this key will be skipped!\n     *\n     * @param {string=} langKey Contains the langKey the iteration shall start with. Set to false if you want to\n     * get back to the whole stack\n     */\n    $translate.useFallbackLanguage = function (langKey) {\n      if (langKey !== undefined && langKey !== null) {\n        if (!langKey) {\n          startFallbackIteration = 0;\n        } else {\n          var langKeyPosition = indexOf($fallbackLanguage, langKey);\n          if (langKeyPosition > -1) {\n            startFallbackIteration = langKeyPosition;\n          }\n        }\n\n      }\n\n    };\n\n    /**\n     * @ngdoc function\n     * @name pascalprecht.translate.$translate#proposedLanguage\n     * @methodOf pascalprecht.translate.$translate\n     *\n     * @description\n     * Returns the language key of language that is currently loaded asynchronously.\n     *\n     * @return {string} language key\n     */\n    $translate.proposedLanguage = function () {\n      return $nextLang;\n    };\n\n    /**\n     * @ngdoc function\n     * @name pascalprecht.translate.$translate#storage\n     * @methodOf pascalprecht.translate.$translate\n     *\n     * @description\n     * Returns registered storage.\n     *\n     * @return {object} Storage\n     */\n    $translate.storage = function () {\n      return Storage;\n    };\n\n    /**\n     * @ngdoc function\n     * @name pascalprecht.translate.$translate#negotiateLocale\n     * @methodOf pascalprecht.translate.$translate\n     *\n     * @description\n     * Returns a language key based on available languages and language aliases. If a\n     * language key cannot be resolved, returns undefined.\n     *\n     * If no or a falsy key is given, returns undefined.\n     *\n     * @param {string} [key] Language key\n     * @return {string|undefined} Language key or undefined if no language key is found.\n     */\n    $translate.negotiateLocale = negotiateLocale;\n\n    /**\n     * @ngdoc function\n     * @name pascalprecht.translate.$translate#use\n     * @methodOf pascalprecht.translate.$translate\n     *\n     * @description\n     * Tells angular-translate which language to use by given language key. This method is\n     * used to change language at runtime. It also takes care of storing the language\n     * key in a configured store to let your app remember the choosed language.\n     *\n     * When trying to 'use' a language which isn't available it tries to load it\n     * asynchronously with registered loaders.\n     *\n     * Returns promise object with loaded language file data or string of the currently used language.\n     *\n     * If no or a falsy key is given it returns the currently used language key.\n     * The returned string will be ```undefined``` if setting up $translate hasn't finished.\n     * @example\n     * $translate.use(\"en_US\").then(function(data){\n       *   $scope.text = $translate(\"HELLO\");\n       * });\n     *\n     * @param {string} [key] Language key\n     * @return {object|string} Promise with loaded language data or the language key if a falsy param was given.\n     */\n    $translate.use = function (key) {\n      if (!key) {\n        return $uses;\n      }\n\n      var deferred = $q.defer();\n\n      $rootScope.$emit('$translateChangeStart', {language : key});\n\n      // Try to get the aliased language key\n      var aliasedKey = negotiateLocale(key);\n      // Ensure only registered language keys will be loaded\n      if ($availableLanguageKeys.length > 0 && !aliasedKey) {\n        return $q.reject(key);\n      }\n\n      if (aliasedKey) {\n        key = aliasedKey;\n      }\n\n      // if there isn't a translation table for the language we've requested,\n      // we load it asynchronously\n      $nextLang = key;\n      if (($forceAsyncReloadEnabled || !$translationTable[key]) && $loaderFactory && !langPromises[key]) {\n        langPromises[key] = loadAsync(key).then(function (translation) {\n          translations(translation.key, translation.table);\n          deferred.resolve(translation.key);\n          if ($nextLang === key) {\n            useLanguage(translation.key);\n          }\n          return translation;\n        }, function (key) {\n          $rootScope.$emit('$translateChangeError', {language : key});\n          deferred.reject(key);\n          $rootScope.$emit('$translateChangeEnd', {language : key});\n          return $q.reject(key);\n        });\n        langPromises[key]['finally'](function () {\n          clearNextLangAndPromise(key);\n        });\n      } else if (langPromises[key]) {\n        // we are already loading this asynchronously\n        // resolve our new deferred when the old langPromise is resolved\n        langPromises[key].then(function (translation) {\n          if ($nextLang === translation.key) {\n            useLanguage(translation.key);\n          }\n          deferred.resolve(translation.key);\n          return translation;\n        }, function (key) {\n          // find first available fallback language if that request has failed\n          if (!$uses && $fallbackLanguage && $fallbackLanguage.length > 0 && $fallbackLanguage[0] !== key) {\n            return $translate.use($fallbackLanguage[0]).then(deferred.resolve, deferred.reject);\n          } else {\n            return deferred.reject(key);\n          }\n        });\n      } else {\n        deferred.resolve(key);\n        useLanguage(key);\n      }\n\n      return deferred.promise;\n    };\n\n    /**\n     * @ngdoc function\n     * @name pascalprecht.translate.$translate#resolveClientLocale\n     * @methodOf pascalprecht.translate.$translate\n     *\n     * @description\n     * This returns the current browser/client's language key. The result is processed with the configured uniform tag resolver.\n     *\n     * @returns {string} the current client/browser language key\n     */\n    $translate.resolveClientLocale = function () {\n      return getLocale();\n    };\n\n    /**\n     * @ngdoc function\n     * @name pascalprecht.translate.$translate#storageKey\n     * @methodOf pascalprecht.translate.$translate\n     *\n     * @description\n     * Returns the key for the storage.\n     *\n     * @return {string} storage key\n     */\n    $translate.storageKey = function () {\n      return storageKey();\n    };\n\n    /**\n     * @ngdoc function\n     * @name pascalprecht.translate.$translate#isPostCompilingEnabled\n     * @methodOf pascalprecht.translate.$translate\n     *\n     * @description\n     * Returns whether post compiling is enabled or not\n     *\n     * @return {bool} storage key\n     */\n    $translate.isPostCompilingEnabled = function () {\n      return $postCompilingEnabled;\n    };\n\n    /**\n     * @ngdoc function\n     * @name pascalprecht.translate.$translate#isForceAsyncReloadEnabled\n     * @methodOf pascalprecht.translate.$translate\n     *\n     * @description\n     * Returns whether force async reload is enabled or not\n     *\n     * @return {boolean} forceAsyncReload value\n     */\n    $translate.isForceAsyncReloadEnabled = function () {\n      return $forceAsyncReloadEnabled;\n    };\n\n    /**\n     * @ngdoc function\n     * @name pascalprecht.translate.$translate#isKeepContent\n     * @methodOf pascalprecht.translate.$translate\n     *\n     * @description\n     * Returns whether keepContent or not\n     *\n     * @return {boolean} keepContent value\n     */\n    $translate.isKeepContent = function () {\n      return $keepContent;\n    };\n\n    /**\n     * @ngdoc function\n     * @name pascalprecht.translate.$translate#refresh\n     * @methodOf pascalprecht.translate.$translate\n     *\n     * @description\n     * Refreshes a translation table pointed by the given langKey. If langKey is not specified,\n     * the module will drop all existent translation tables and load new version of those which\n     * are currently in use.\n     *\n     * Refresh means that the module will drop target translation table and try to load it again.\n     *\n     * In case there are no loaders registered the refresh() method will throw an Error.\n     *\n     * If the module is able to refresh translation tables refresh() method will broadcast\n     * $translateRefreshStart and $translateRefreshEnd events.\n     *\n     * @example\n     * // this will drop all currently existent translation tables and reload those which are\n     * // currently in use\n     * $translate.refresh();\n     * // this will refresh a translation table for the en_US language\n     * $translate.refresh('en_US');\n     *\n     * @param {string} langKey A language key of the table, which has to be refreshed\n     *\n     * @return {promise} Promise, which will be resolved in case a translation tables refreshing\n     * process is finished successfully, and reject if not.\n     */\n    $translate.refresh = function (langKey) {\n      if (!$loaderFactory) {\n        throw new Error('Couldn\\'t refresh translation table, no loader registered!');\n      }\n\n      var deferred = $q.defer();\n\n      function resolve() {\n        deferred.resolve();\n        $rootScope.$emit('$translateRefreshEnd', {language : langKey});\n      }\n\n      function reject() {\n        deferred.reject();\n        $rootScope.$emit('$translateRefreshEnd', {language : langKey});\n      }\n\n      $rootScope.$emit('$translateRefreshStart', {language : langKey});\n\n      if (!langKey) {\n        // if there's no language key specified we refresh ALL THE THINGS!\n        var tables = [], loadingKeys = {};\n\n        // reload registered fallback languages\n        if ($fallbackLanguage && $fallbackLanguage.length) {\n          for (var i = 0, len = $fallbackLanguage.length; i < len; i++) {\n            tables.push(loadAsync($fallbackLanguage[i]));\n            loadingKeys[$fallbackLanguage[i]] = true;\n          }\n        }\n\n        // reload currently used language\n        if ($uses && !loadingKeys[$uses]) {\n          tables.push(loadAsync($uses));\n        }\n\n        var allTranslationsLoaded = function (tableData) {\n          $translationTable = {};\n          angular.forEach(tableData, function (data) {\n            translations(data.key, data.table);\n          });\n          if ($uses) {\n            useLanguage($uses);\n          }\n          resolve();\n        };\n        allTranslationsLoaded.displayName = 'refreshPostProcessor';\n\n        $q.all(tables).then(allTranslationsLoaded, reject);\n\n      } else if ($translationTable[langKey]) {\n\n        var oneTranslationsLoaded = function (data) {\n          translations(data.key, data.table);\n          if (langKey === $uses) {\n            useLanguage($uses);\n          }\n          resolve();\n          return data;\n        };\n        oneTranslationsLoaded.displayName = 'refreshPostProcessor';\n\n        loadAsync(langKey).then(oneTranslationsLoaded, reject);\n\n      } else {\n        reject();\n      }\n      return deferred.promise;\n    };\n\n    /**\n     * @ngdoc function\n     * @name pascalprecht.translate.$translate#instant\n     * @methodOf pascalprecht.translate.$translate\n     *\n     * @description\n     * Returns a translation instantly from the internal state of loaded translation. All rules\n     * regarding the current language, the preferred language of even fallback languages will be\n     * used except any promise handling. If a language was not found, an asynchronous loading\n     * will be invoked in the background.\n     *\n     * @param {string|array} translationId A token which represents a translation id\n     *                                     This can be optionally an array of translation ids which\n     *                                     results that the function's promise returns an object where\n     *                                     each key is the translation id and the value the translation.\n     * @param {object} interpolateParams Params\n     * @param {string} interpolationId The id of the interpolation to use\n     * @param {string} forceLanguage A language to be used instead of the current language\n     * @param {string} sanitizeStrategy force sanitize strategy for this call instead of using the configured one\n     *\n     * @return {string|object} translation\n     */\n    $translate.instant = function (translationId, interpolateParams, interpolationId, forceLanguage, sanitizeStrategy) {\n\n      // we don't want to re-negotiate $uses\n      var uses = (forceLanguage && forceLanguage !== $uses) ? // we don't want to re-negotiate $uses\n        (negotiateLocale(forceLanguage) || forceLanguage) : $uses;\n\n      // Detect undefined and null values to shorten the execution and prevent exceptions\n      if (translationId === null || angular.isUndefined(translationId)) {\n        return translationId;\n      }\n\n      // Check forceLanguage is present\n      if (forceLanguage) {\n        loadTranslationsIfMissing(forceLanguage);\n      }\n\n      // Duck detection: If the first argument is an array, a bunch of translations was requested.\n      // The result is an object.\n      if (angular.isArray(translationId)) {\n        var results = {};\n        for (var i = 0, c = translationId.length; i < c; i++) {\n          results[translationId[i]] = $translate.instant(translationId[i], interpolateParams, interpolationId, forceLanguage, sanitizeStrategy);\n        }\n        return results;\n      }\n\n      // We discarded unacceptable values. So we just need to verify if translationId is empty String\n      if (angular.isString(translationId) && translationId.length < 1) {\n        return translationId;\n      }\n\n      // trim off any whitespace\n      if (translationId) {\n        translationId = trim.apply(translationId);\n      }\n\n      var result, possibleLangKeys = [];\n      if ($preferredLanguage) {\n        possibleLangKeys.push($preferredLanguage);\n      }\n      if (uses) {\n        possibleLangKeys.push(uses);\n      }\n      if ($fallbackLanguage && $fallbackLanguage.length) {\n        possibleLangKeys = possibleLangKeys.concat($fallbackLanguage);\n      }\n      for (var j = 0, d = possibleLangKeys.length; j < d; j++) {\n        var possibleLangKey = possibleLangKeys[j];\n        if ($translationTable[possibleLangKey]) {\n          if (typeof $translationTable[possibleLangKey][translationId] !== 'undefined') {\n            result = determineTranslationInstant(translationId, interpolateParams, interpolationId, uses, sanitizeStrategy);\n          }\n        }\n        if (typeof result !== 'undefined') {\n          break;\n        }\n      }\n\n      if (!result && result !== '') {\n        if ($notFoundIndicatorLeft || $notFoundIndicatorRight) {\n          result = applyNotFoundIndicators(translationId);\n        } else {\n          // Return translation of default interpolator if not found anything.\n          result = defaultInterpolator.interpolate(translationId, interpolateParams, 'filter', sanitizeStrategy);\n\n          // looks like the requested translation id doesn't exists.\n          // Now, if there is a registered handler for missing translations and no\n          // asyncLoader is pending, we execute the handler\n          var missingTranslationHandlerTranslation;\n          if ($missingTranslationHandlerFactory && !pendingLoader) {\n            missingTranslationHandlerTranslation = translateByHandler(translationId, interpolateParams, sanitizeStrategy);\n          }\n\n          if ($missingTranslationHandlerFactory && !pendingLoader && missingTranslationHandlerTranslation) {\n            result = missingTranslationHandlerTranslation;\n          }\n        }\n      }\n\n      return result;\n    };\n\n    /**\n     * @ngdoc function\n     * @name pascalprecht.translate.$translate#versionInfo\n     * @methodOf pascalprecht.translate.$translate\n     *\n     * @description\n     * Returns the current version information for the angular-translate library\n     *\n     * @return {string} angular-translate version\n     */\n    $translate.versionInfo = function () {\n      return version;\n    };\n\n    /**\n     * @ngdoc function\n     * @name pascalprecht.translate.$translate#loaderCache\n     * @methodOf pascalprecht.translate.$translate\n     *\n     * @description\n     * Returns the defined loaderCache.\n     *\n     * @return {boolean|string|object} current value of loaderCache\n     */\n    $translate.loaderCache = function () {\n      return loaderCache;\n    };\n\n    // internal purpose only\n    $translate.directivePriority = function () {\n      return directivePriority;\n    };\n\n    // internal purpose only\n    $translate.statefulFilter = function () {\n      return statefulFilter;\n    };\n\n    /**\n     * @ngdoc function\n     * @name pascalprecht.translate.$translate#isReady\n     * @methodOf pascalprecht.translate.$translate\n     *\n     * @description\n     * Returns whether the service is \"ready\" to translate (i.e. loading 1st language).\n     *\n     * See also {@link pascalprecht.translate.$translate#methods_onReady onReady()}.\n     *\n     * @return {boolean} current value of ready\n     */\n    $translate.isReady = function () {\n      return $isReady;\n    };\n\n    var $onReadyDeferred = $q.defer();\n    $onReadyDeferred.promise.then(function () {\n      $isReady = true;\n    });\n\n    /**\n     * @ngdoc function\n     * @name pascalprecht.translate.$translate#onReady\n     * @methodOf pascalprecht.translate.$translate\n     *\n     * @description\n     * Returns whether the service is \"ready\" to translate (i.e. loading 1st language).\n     *\n     * See also {@link pascalprecht.translate.$translate#methods_isReady isReady()}.\n     *\n     * @param {Function=} fn Function to invoke when service is ready\n     * @return {object} Promise resolved when service is ready\n     */\n    $translate.onReady = function (fn) {\n      var deferred = $q.defer();\n      if (angular.isFunction(fn)) {\n        deferred.promise.then(fn);\n      }\n      if ($isReady) {\n        deferred.resolve();\n      } else {\n        $onReadyDeferred.promise.then(deferred.resolve);\n      }\n      return deferred.promise;\n    };\n\n    /**\n     * @ngdoc function\n     * @name pascalprecht.translate.$translate#getAvailableLanguageKeys\n     * @methodOf pascalprecht.translate.$translate\n     *\n     * @description\n     * This function simply returns the registered language keys being defined before in the config phase\n     * With this, an application can use the array to provide a language selection dropdown or similar\n     * without any additional effort\n     *\n     * @returns {object} returns the list of possibly registered language keys and mapping or null if not defined\n     */\n    $translate.getAvailableLanguageKeys = function () {\n      if ($availableLanguageKeys.length > 0) {\n        return $availableLanguageKeys;\n      }\n      return null;\n    };\n\n    /**\n     * @ngdoc function\n     * @name pascalprecht.translate.$translate#getTranslationTable\n     * @methodOf pascalprecht.translate.$translate\n     *\n     * @description\n     * Returns translation table by the given language key.\n     *\n     * Unless a language is provided it returns a translation table of the current one.\n     * Note: If translation dictionary is currently downloading or in progress\n     * it will return null.\n     *\n     * @param {string} langKey A token which represents a translation id\n     *\n     * @return {object} a copy of angular-translate $translationTable\n     */\n    $translate.getTranslationTable = function (langKey) {\n      langKey = langKey || $translate.use();\n      if (langKey && $translationTable[langKey]) {\n        return angular.copy($translationTable[langKey]);\n      }\n      return null;\n    };\n\n    // Whenever $translateReady is being fired, this will ensure the state of $isReady\n    var globalOnReadyListener = $rootScope.$on('$translateReady', function () {\n      $onReadyDeferred.resolve();\n      globalOnReadyListener(); // one time only\n      globalOnReadyListener = null;\n    });\n    var globalOnChangeListener = $rootScope.$on('$translateChangeEnd', function () {\n      $onReadyDeferred.resolve();\n      globalOnChangeListener(); // one time only\n      globalOnChangeListener = null;\n    });\n\n    if ($loaderFactory) {\n\n      // If at least one async loader is defined and there are no\n      // (default) translations available we should try to load them.\n      if (angular.equals($translationTable, {})) {\n        if ($translate.use()) {\n          $translate.use($translate.use());\n        }\n      }\n\n      // Also, if there are any fallback language registered, we start\n      // loading them asynchronously as soon as we can.\n      if ($fallbackLanguage && $fallbackLanguage.length) {\n        var processAsyncResult = function (translation) {\n          translations(translation.key, translation.table);\n          $rootScope.$emit('$translateChangeEnd', {language : translation.key});\n          return translation;\n        };\n        for (var i = 0, len = $fallbackLanguage.length; i < len; i++) {\n          var fallbackLanguageId = $fallbackLanguage[i];\n          if ($forceAsyncReloadEnabled || !$translationTable[fallbackLanguageId]) {\n            langPromises[fallbackLanguageId] = loadAsync(fallbackLanguageId).then(processAsyncResult);\n          }\n        }\n      }\n    } else {\n      $rootScope.$emit('$translateReady', {language : $translate.use()});\n    }\n\n    return $translate;\n  }];\n}\n\n$translate.displayName = 'displayName';\n\n/**\n * @ngdoc object\n * @name pascalprecht.translate.$translateDefaultInterpolation\n * @requires $interpolate\n *\n * @description\n * Uses angular's `$interpolate` services to interpolate strings against some values.\n *\n * Be aware to configure a proper sanitization strategy.\n *\n * See also:\n * * {@link pascalprecht.translate.$translateSanitization}\n *\n * @return {object} $translateDefaultInterpolation Interpolator service\n */\nangular.module('pascalprecht.translate').factory('$translateDefaultInterpolation', $translateDefaultInterpolation);\n\nfunction $translateDefaultInterpolation ($interpolate, $translateSanitization) {\n\n  'use strict';\n\n  var $translateInterpolator = {},\n      $locale,\n      $identifier = 'default';\n\n  /**\n   * @ngdoc function\n   * @name pascalprecht.translate.$translateDefaultInterpolation#setLocale\n   * @methodOf pascalprecht.translate.$translateDefaultInterpolation\n   *\n   * @description\n   * Sets current locale (this is currently not use in this interpolation).\n   *\n   * @param {string} locale Language key or locale.\n   */\n  $translateInterpolator.setLocale = function (locale) {\n    $locale = locale;\n  };\n\n  /**\n   * @ngdoc function\n   * @name pascalprecht.translate.$translateDefaultInterpolation#getInterpolationIdentifier\n   * @methodOf pascalprecht.translate.$translateDefaultInterpolation\n   *\n   * @description\n   * Returns an identifier for this interpolation service.\n   *\n   * @returns {string} $identifier\n   */\n  $translateInterpolator.getInterpolationIdentifier = function () {\n    return $identifier;\n  };\n\n  /**\n   * @deprecated will be removed in 3.0\n   * @see {@link pascalprecht.translate.$translateSanitization}\n   */\n  $translateInterpolator.useSanitizeValueStrategy = function (value) {\n    $translateSanitization.useStrategy(value);\n    return this;\n  };\n\n  /**\n   * @ngdoc function\n   * @name pascalprecht.translate.$translateDefaultInterpolation#interpolate\n   * @methodOf pascalprecht.translate.$translateDefaultInterpolation\n   *\n   * @description\n   * Interpolates given value agains given interpolate params using angulars\n   * `$interpolate` service.\n   *\n   * Since AngularJS 1.5, `value` must not be a string but can be anything input.\n   *\n   * @returns {string} interpolated string.\n   */\n  $translateInterpolator.interpolate = function (value, interpolationParams, context, sanitizeStrategy) {\n    interpolationParams = interpolationParams || {};\n    interpolationParams = $translateSanitization.sanitize(interpolationParams, 'params', sanitizeStrategy, context);\n\n    var interpolatedText;\n    if (angular.isNumber(value)) {\n      // numbers are safe\n      interpolatedText = '' + value;\n    } else if (angular.isString(value)) {\n      // strings must be interpolated (that's the job here)\n      interpolatedText = $interpolate(value)(interpolationParams);\n      interpolatedText = $translateSanitization.sanitize(interpolatedText, 'text', sanitizeStrategy, context);\n    } else {\n      // neither a number or a string, cant interpolate => empty string\n      interpolatedText = '';\n    }\n\n    return interpolatedText;\n  };\n\n  return $translateInterpolator;\n}\n\n$translateDefaultInterpolation.displayName = '$translateDefaultInterpolation';\n\nangular.module('pascalprecht.translate').constant('$STORAGE_KEY', 'NG_TRANSLATE_LANG_KEY');\n\nangular.module('pascalprecht.translate')\n/**\n * @ngdoc directive\n * @name pascalprecht.translate.directive:translate\n * @requires $interpolate, \n * @requires $compile, \n * @requires $parse, \n * @requires $rootScope\n * @restrict AE\n *\n * @description\n * Translates given translation id either through attribute or DOM content.\n * Internally it uses $translate service to translate the translation id. It possible to\n * pass an optional `translate-values` object literal as string into translation id.\n *\n * @param {string=} translate Translation id which could be either string or interpolated string.\n * @param {string=} translate-values Values to pass into translation id. Can be passed as object literal string or interpolated object.\n * @param {string=} translate-attr-ATTR translate Translation id and put it into ATTR attribute.\n * @param {string=} translate-default will be used unless translation was successful\n * @param {boolean=} translate-compile (default true if present) defines locally activation of {@link pascalprecht.translate.$translateProvider#methods_usePostCompiling}\n * @param {boolean=} translate-keep-content (default true if present) defines that in case a KEY could not be translated, that the existing content is left in the innerHTML}\n *\n * @example\n   <example module=\"ngView\">\n    <file name=\"index.ced81ed4.html\">\n      <div ng-controller=\"TranslateCtrl\">\n\n        <pre translate=\"TRANSLATION_ID\"></pre>\n        <pre translate>TRANSLATION_ID</pre>\n        <pre translate translate-attr-title=\"TRANSLATION_ID\"></pre>\n        <pre translate=\"{{translationId}}\"></pre>\n        <pre translate>{{translationId}}</pre>\n        <pre translate=\"WITH_VALUES\" translate-values=\"{value: 5}\"></pre>\n        <pre translate translate-values=\"{value: 5}\">WITH_VALUES</pre>\n        <pre translate=\"WITH_VALUES\" translate-values=\"{{values}}\"></pre>\n        <pre translate translate-values=\"{{values}}\">WITH_VALUES</pre>\n        <pre translate translate-attr-title=\"WITH_VALUES\" translate-values=\"{{values}}\"></pre>\n        <pre translate=\"WITH_CAMEL_CASE_KEY\" translate-value-camel-case-key=\"Hi\"></pre>\n\n      </div>\n    </file>\n    <file name=\"script.js\">\n      angular.module('ngView', ['pascalprecht.translate'])\n\n      .config(function ($translateProvider) {\n\n        $translateProvider.translations('en',{\n          'TRANSLATION_ID': 'Hello there!',\n          'WITH_VALUES': 'The following value is dynamic: {{value}}',\n          'WITH_CAMEL_CASE_KEY': 'The interpolation key is camel cased: {{camelCaseKey}}'\n        }).preferredLanguage('en');\n\n      });\n\n      angular.module('ngView').controller('TranslateCtrl', function ($scope) {\n        $scope.translationId = 'TRANSLATION_ID';\n\n        $scope.values = {\n          value: 78\n        };\n      });\n    </file>\n    <file name=\"scenario.js\">\n      it('should translate', function () {\n        inject(function ($rootScope, $compile) {\n          $rootScope.translationId = 'TRANSLATION_ID';\n\n          element = $compile('<p translate=\"TRANSLATION_ID\"></p>')($rootScope);\n          $rootScope.$digest();\n          expect(element.text()).toBe('Hello there!');\n\n          element = $compile('<p translate=\"{{translationId}}\"></p>')($rootScope);\n          $rootScope.$digest();\n          expect(element.text()).toBe('Hello there!');\n\n          element = $compile('<p translate>TRANSLATION_ID</p>')($rootScope);\n          $rootScope.$digest();\n          expect(element.text()).toBe('Hello there!');\n\n          element = $compile('<p translate>{{translationId}}</p>')($rootScope);\n          $rootScope.$digest();\n          expect(element.text()).toBe('Hello there!');\n\n          element = $compile('<p translate translate-attr-title=\"TRANSLATION_ID\"></p>')($rootScope);\n          $rootScope.$digest();\n          expect(element.attr('title')).toBe('Hello there!');\n\n          element = $compile('<p translate=\"WITH_CAMEL_CASE_KEY\" translate-value-camel-case-key=\"Hello\"></p>')($rootScope);\n          $rootScope.$digest();\n          expect(element.text()).toBe('The interpolation key is camel cased: Hello');\n        });\n      });\n    </file>\n   </example>\n */\n.directive('translate', translateDirective);\nfunction translateDirective($translate, $interpolate, $compile, $parse, $rootScope) {\n\n  'use strict';\n\n  /**\n   * @name trim\n   * @private\n   *\n   * @description\n   * trim polyfill\n   *\n   * @returns {string} The string stripped of whitespace from both ends\n   */\n  var trim = function() {\n    return this.toString().replace(/^\\s+|\\s+$/g, '');\n  };\n\n  return {\n    restrict: 'AE',\n    scope: true,\n    priority: $translate.directivePriority(),\n    compile: function (tElement, tAttr) {\n\n      var translateValuesExist = (tAttr.translateValues) ?\n        tAttr.translateValues : undefined;\n\n      var translateInterpolation = (tAttr.translateInterpolation) ?\n        tAttr.translateInterpolation : undefined;\n\n      var translateValueExist = tElement[0].outerHTML.match(/translate-value-+/i);\n\n      var interpolateRegExp = '^(.*)(' + $interpolate.startSymbol() + '.*' + $interpolate.endSymbol() + ')(.*)',\n          watcherRegExp = '^(.*)' + $interpolate.startSymbol() + '(.*)' + $interpolate.endSymbol() + '(.*)';\n\n      return function linkFn(scope, iElement, iAttr) {\n\n        scope.interpolateParams = {};\n        scope.preText = '';\n        scope.postText = '';\n        scope.translateNamespace = getTranslateNamespace(scope);\n        var translationIds = {};\n\n        var initInterpolationParams = function (interpolateParams, iAttr, tAttr) {\n          // initial setup\n          if (iAttr.translateValues) {\n            angular.extend(interpolateParams, $parse(iAttr.translateValues)(scope.$parent));\n          }\n          // initially fetch all attributes if existing and fill the params\n          if (translateValueExist) {\n            for (var attr in tAttr) {\n              if (Object.prototype.hasOwnProperty.call(iAttr, attr) && attr.substr(0, 14) === 'translateValue' && attr !== 'translateValues') {\n                var attributeName = angular.lowercase(attr.substr(14, 1)) + attr.substr(15);\n                interpolateParams[attributeName] = tAttr[attr];\n              }\n            }\n          }\n        };\n\n        // Ensures any change of the attribute \"translate\" containing the id will\n        // be re-stored to the scope's \"translationId\".\n        // If the attribute has no content, the element's text value (white spaces trimmed off) will be used.\n        var observeElementTranslation = function (translationId) {\n\n          // Remove any old watcher\n          if (angular.isFunction(observeElementTranslation._unwatchOld)) {\n            observeElementTranslation._unwatchOld();\n            observeElementTranslation._unwatchOld = undefined;\n          }\n\n          if (angular.equals(translationId , '') || !angular.isDefined(translationId)) {\n            var iElementText = trim.apply(iElement.text());\n\n            // Resolve translation id by inner html if required\n            var interpolateMatches = iElementText.match(interpolateRegExp);\n            // Interpolate translation id if required\n            if (angular.isArray(interpolateMatches)) {\n              scope.preText = interpolateMatches[1];\n              scope.postText = interpolateMatches[3];\n              translationIds.translate = $interpolate(interpolateMatches[2])(scope.$parent);\n              var watcherMatches = iElementText.match(watcherRegExp);\n              if (angular.isArray(watcherMatches) && watcherMatches[2] && watcherMatches[2].length) {\n                observeElementTranslation._unwatchOld = scope.$watch(watcherMatches[2], function (newValue) {\n                  translationIds.translate = newValue;\n                  updateTranslations();\n                });\n              }\n            } else {\n              // do not assigne the translation id if it is empty.\n              translationIds.translate = !iElementText ? undefined : iElementText;\n            }\n          } else {\n            translationIds.translate = translationId;\n          }\n          updateTranslations();\n        };\n\n        var observeAttributeTranslation = function (translateAttr) {\n          iAttr.$observe(translateAttr, function (translationId) {\n            translationIds[translateAttr] = translationId;\n            updateTranslations();\n          });\n        };\n\n        // initial setup with values\n        initInterpolationParams(scope.interpolateParams, iAttr, tAttr);\n\n        var firstAttributeChangedEvent = true;\n        iAttr.$observe('translate', function (translationId) {\n          if (typeof translationId === 'undefined') {\n            // case of element \"<translate>xyz</translate>\"\n            observeElementTranslation('');\n          } else {\n            // case of regular attribute\n            if (translationId !== '' || !firstAttributeChangedEvent) {\n              translationIds.translate = translationId;\n              updateTranslations();\n            }\n          }\n          firstAttributeChangedEvent = false;\n        });\n\n        for (var translateAttr in iAttr) {\n          if (iAttr.hasOwnProperty(translateAttr) && translateAttr.substr(0, 13) === 'translateAttr' && translateAttr.length > 13) {\n            observeAttributeTranslation(translateAttr);\n          }\n        }\n\n        iAttr.$observe('translateDefault', function (value) {\n          scope.defaultText = value;\n          updateTranslations();\n        });\n\n        if (translateValuesExist) {\n          iAttr.$observe('translateValues', function (interpolateParams) {\n            if (interpolateParams) {\n              scope.$parent.$watch(function () {\n                angular.extend(scope.interpolateParams, $parse(interpolateParams)(scope.$parent));\n              });\n            }\n          });\n        }\n\n        if (translateValueExist) {\n          var observeValueAttribute = function (attrName) {\n            iAttr.$observe(attrName, function (value) {\n              var attributeName = angular.lowercase(attrName.substr(14, 1)) + attrName.substr(15);\n              scope.interpolateParams[attributeName] = value;\n            });\n          };\n          for (var attr in iAttr) {\n            if (Object.prototype.hasOwnProperty.call(iAttr, attr) && attr.substr(0, 14) === 'translateValue' && attr !== 'translateValues') {\n              observeValueAttribute(attr);\n            }\n          }\n        }\n\n        // Master update function\n        var updateTranslations = function () {\n          for (var key in translationIds) {\n            if (translationIds.hasOwnProperty(key) && translationIds[key] !== undefined) {\n              updateTranslation(key, translationIds[key], scope, scope.interpolateParams, scope.defaultText, scope.translateNamespace);\n            }\n          }\n        };\n\n        // Put translation processing function outside loop\n        var updateTranslation = function(translateAttr, translationId, scope, interpolateParams, defaultTranslationText, translateNamespace) {\n          if (translationId) {\n            // if translation id starts with '.' and translateNamespace given, prepend namespace\n            if (translateNamespace && translationId.charAt(0) === '.') {\n              translationId = translateNamespace + translationId;\n            }\n\n            $translate(translationId, interpolateParams, translateInterpolation, defaultTranslationText, scope.translateLanguage)\n              .then(function (translation) {\n                applyTranslation(translation, scope, true, translateAttr);\n              }, function (translationId) {\n                applyTranslation(translationId, scope, false, translateAttr);\n              });\n          } else {\n            // as an empty string cannot be translated, we can solve this using successful=false\n            applyTranslation(translationId, scope, false, translateAttr);\n          }\n        };\n\n        var applyTranslation = function (value, scope, successful, translateAttr) {\n          if (!successful) {\n            if (typeof scope.defaultText !== 'undefined') {\n              value = scope.defaultText;\n            }\n          }\n          if (translateAttr === 'translate') {\n            // default translate into innerHTML\n            if (successful || (!successful && !$translate.isKeepContent() && typeof iAttr.translateKeepContent === 'undefined')) {\n              iElement.empty().append(scope.preText + value + scope.postText);\n            }\n            var globallyEnabled = $translate.isPostCompilingEnabled();\n            var locallyDefined = typeof tAttr.translateCompile !== 'undefined';\n            var locallyEnabled = locallyDefined && tAttr.translateCompile !== 'false';\n            if ((globallyEnabled && !locallyDefined) || locallyEnabled) {\n              $compile(iElement.contents())(scope);\n            }\n          } else {\n            // translate attribute\n            var attributeName = iAttr.$attr[translateAttr];\n            if (attributeName.substr(0, 5) === 'data-') {\n              // ensure html5 data prefix is stripped\n              attributeName = attributeName.substr(5);\n            }\n            attributeName = attributeName.substr(15);\n            iElement.attr(attributeName, value);\n          }\n        };\n\n        if (translateValuesExist || translateValueExist || iAttr.translateDefault) {\n          scope.$watch('interpolateParams', updateTranslations, true);\n        }\n\n        // Replaced watcher on translateLanguage with event listener\n        scope.$on('translateLanguageChanged', updateTranslations);\n\n        // Ensures the text will be refreshed after the current language was changed\n        // w/ $translate.use(...)\n        var unbind = $rootScope.$on('$translateChangeSuccess', updateTranslations);\n\n        // ensure translation will be looked up at least one\n        if (iElement.text().length) {\n          if (iAttr.translate) {\n            observeElementTranslation(iAttr.translate);\n          } else {\n            observeElementTranslation('');\n          }\n        } else if (iAttr.translate) {\n          // ensure attribute will be not skipped\n          observeElementTranslation(iAttr.translate);\n        }\n        updateTranslations();\n        scope.$on('$destroy', unbind);\n      };\n    }\n  };\n}\n\n/**\n * Returns the scope's namespace.\n * @private\n * @param scope\n * @returns {string}\n */\nfunction getTranslateNamespace(scope) {\n  'use strict';\n  if (scope.translateNamespace) {\n    return scope.translateNamespace;\n  }\n  if (scope.$parent) {\n    return getTranslateNamespace(scope.$parent);\n  }\n}\n\ntranslateDirective.displayName = 'translateDirective';\n\nangular.module('pascalprecht.translate')\n/**\n * @ngdoc directive\n * @name pascalprecht.translate.directive:translate-attr\n * @restrict A\n *\n * @description\n * Translates attributes like translate-attr-ATTR, but with an object like ng-class.\n * Internally it uses `translate` service to translate translation id. It possible to\n * pass an optional `translate-values` object literal as string into translation id.\n *\n * @param {string=} translate-attr Object literal mapping attributes to translation ids.\n * @param {string=} translate-values Values to pass into the translation ids. Can be passed as object literal string.\n *\n * @example\n   <example module=\"ngView\">\n    <file name=\"index.ced81ed4.html\">\n      <div ng-controller=\"TranslateCtrl\">\n\n        <input translate-attr=\"{ placeholder: translationId, title: 'WITH_VALUES' }\" translate-values=\"{value: 5}\" />\n\n      </div>\n    </file>\n    <file name=\"script.js\">\n      angular.module('ngView', ['pascalprecht.translate'])\n\n      .config(function ($translateProvider) {\n\n        $translateProvider.translations('en',{\n          'TRANSLATION_ID': 'Hello there!',\n          'WITH_VALUES': 'The following value is dynamic: {{value}}',\n        }).preferredLanguage('en');\n\n      });\n\n      angular.module('ngView').controller('TranslateCtrl', function ($scope) {\n        $scope.translationId = 'TRANSLATION_ID';\n\n        $scope.values = {\n          value: 78\n        };\n      });\n    </file>\n    <file name=\"scenario.js\">\n      it('should translate', function () {\n        inject(function ($rootScope, $compile) {\n          $rootScope.translationId = 'TRANSLATION_ID';\n\n          element = $compile('<input translate-attr=\"{ placeholder: translationId, title: 'WITH_VALUES' }\" translate-values=\"{ value: 5 }\" />')($rootScope);\n          $rootScope.$digest();\n          expect(element.attr('placeholder)).toBe('Hello there!');\n          expect(element.attr('title)).toBe('The following value is dynamic: 5');\n        });\n      });\n    </file>\n   </example>\n */\n.directive('translateAttr', translateAttrDirective);\nfunction translateAttrDirective($translate, $rootScope) {\n\n  'use strict';\n\n  return {\n    restrict: 'A',\n    priority: $translate.directivePriority(),\n    link: function linkFn(scope, element, attr) {\n\n      var translateAttr,\n          translateValues,\n          previousAttributes = {};\n\n      // Main update translations function\n      var updateTranslations = function () {\n        angular.forEach(translateAttr, function (translationId, attributeName) {\n          if (!translationId) {\n            return;\n          }\n          previousAttributes[attributeName] = true;\n\n          // if translation id starts with '.' and translateNamespace given, prepend namespace\n          if (scope.translateNamespace && translationId.charAt(0) === '.') {\n            translationId = scope.translateNamespace + translationId;\n          }\n          $translate(translationId, translateValues, attr.translateInterpolation, undefined, scope.translateLanguage)\n            .then(function (translation) {\n              element.attr(attributeName, translation);\n            }, function (translationId) {\n              element.attr(attributeName, translationId);\n            });\n        });\n\n        // Removing unused attributes that were previously used\n        angular.forEach(previousAttributes, function (flag, attributeName) {\n          if (!translateAttr[attributeName]) {\n            element.removeAttr(attributeName);\n            delete previousAttributes[attributeName];\n          }\n        });\n      };\n\n      // Watch for attribute changes\n      watchAttribute(\n        scope,\n        attr.translateAttr,\n        function (newValue) { translateAttr = newValue; },\n        updateTranslations\n      );\n      // Watch for value changes\n      watchAttribute(\n        scope,\n        attr.translateValues,\n        function (newValue) { translateValues = newValue; },\n        updateTranslations\n      );\n\n      if (attr.translateValues) {\n        scope.$watch(attr.translateValues, updateTranslations, true);\n      }\n\n      // Replaced watcher on translateLanguage with event listener\n      scope.$on('translateLanguageChanged', updateTranslations);\n\n      // Ensures the text will be refreshed after the current language was changed\n      // w/ $translate.use(...)\n      var unbind = $rootScope.$on('$translateChangeSuccess', updateTranslations);\n\n      updateTranslations();\n      scope.$on('$destroy', unbind);\n    }\n  };\n}\n\nfunction watchAttribute(scope, attribute, valueCallback, changeCallback) {\n  'use strict';\n  if (!attribute) {\n    return;\n  }\n  if (attribute.substr(0, 2) === '::') {\n    attribute = attribute.substr(2);\n  } else {\n    scope.$watch(attribute, function(newValue) {\n      valueCallback(newValue);\n      changeCallback();\n    }, true);\n  }\n  valueCallback(scope.$eval(attribute));\n}\n\ntranslateAttrDirective.displayName = 'translateAttrDirective';\n\nangular.module('pascalprecht.translate')\n/**\n * @ngdoc directive\n * @name pascalprecht.translate.directive:translateCloak\n * @requires $rootScope\n * @requires $translate\n * @restrict A\n *\n * $description\n * Adds a `translate-cloak` class name to the given element where this directive\n * is applied initially and removes it, once a loader has finished loading.\n *\n * This directive can be used to prevent initial flickering when loading translation\n * data asynchronously.\n *\n * The class name is defined in\n * {@link pascalprecht.translate.$translateProvider#cloakClassName $translate.cloakClassName()}.\n *\n * @param {string=} translate-cloak If a translationId is provided, it will be used for showing\n *                                  or hiding the cloak. Basically it relies on the translation\n *                                  resolve.\n */\n.directive('translateCloak', translateCloakDirective);\n\nfunction translateCloakDirective($translate, $rootScope) {\n\n  'use strict';\n\n  return {\n    compile: function (tElement) {\n      var applyCloak = function () {\n        tElement.addClass($translate.cloakClassName());\n      },\n      removeCloak = function () {\n        tElement.removeClass($translate.cloakClassName());\n      };\n      $translate.onReady(function () {\n        removeCloak();\n      });\n      applyCloak();\n\n      return function linkFn(scope, iElement, iAttr) {\n        if (iAttr.translateCloak && iAttr.translateCloak.length) {\n          // Register a watcher for the defined translation allowing a fine tuned cloak\n          iAttr.$observe('translateCloak', function (translationId) {\n            $translate(translationId).then(removeCloak, applyCloak);\n          });\n          // Register for change events as this is being another indicicator revalidating the cloak)\n          $rootScope.$on('$translateChangeSuccess', function () {\n            $translate(iAttr.translateCloak).then(removeCloak, applyCloak);\n          });\n        }\n      };\n    }\n  };\n}\n\ntranslateCloakDirective.displayName = 'translateCloakDirective';\n\nangular.module('pascalprecht.translate')\n/**\n * @ngdoc directive\n * @name pascalprecht.translate.directive:translateNamespace\n * @restrict A\n *\n * @description\n * Translates given translation id either through attribute or DOM content.\n * Internally it uses `translate` filter to translate translation id. It possible to\n * pass an optional `translate-values` object literal as string into translation id.\n *\n * @param {string=} translate namespace name which could be either string or interpolated string.\n *\n * @example\n   <example module=\"ngView\">\n    <file name=\"index.ced81ed4.html\">\n      <div translate-namespace=\"CONTENT\">\n\n        <div>\n            <h1 translate>.HEADERS.TITLE</h1>\n            <h1 translate>.HEADERS.WELCOME</h1>\n        </div>\n\n        <div translate-namespace=\".HEADERS\">\n            <h1 translate>.TITLE</h1>\n            <h1 translate>.WELCOME</h1>\n        </div>\n\n      </div>\n    </file>\n    <file name=\"script.js\">\n      angular.module('ngView', ['pascalprecht.translate'])\n\n      .config(function ($translateProvider) {\n\n        $translateProvider.translations('en',{\n          'TRANSLATION_ID': 'Hello there!',\n          'CONTENT': {\n            'HEADERS': {\n                TITLE: 'Title'\n            }\n          },\n          'CONTENT.HEADERS.WELCOME': 'Welcome'\n        }).preferredLanguage('en');\n\n      });\n\n    </file>\n   </example>\n */\n.directive('translateNamespace', translateNamespaceDirective);\n\nfunction translateNamespaceDirective() {\n\n  'use strict';\n\n  return {\n    restrict: 'A',\n    scope: true,\n    compile: function () {\n      return {\n        pre: function (scope, iElement, iAttrs) {\n          scope.translateNamespace = getTranslateNamespace(scope);\n\n          if (scope.translateNamespace && iAttrs.translateNamespace.charAt(0) === '.') {\n            scope.translateNamespace += iAttrs.translateNamespace;\n          } else {\n            scope.translateNamespace = iAttrs.translateNamespace;\n          }\n        }\n      };\n    }\n  };\n}\n\n/**\n * Returns the scope's namespace.\n * @private\n * @param scope\n * @returns {string}\n */\nfunction getTranslateNamespace(scope) {\n  'use strict';\n  if (scope.translateNamespace) {\n    return scope.translateNamespace;\n  }\n  if (scope.$parent) {\n    return getTranslateNamespace(scope.$parent);\n  }\n}\n\ntranslateNamespaceDirective.displayName = 'translateNamespaceDirective';\n\nangular.module('pascalprecht.translate')\n/**\n * @ngdoc directive\n * @name pascalprecht.translate.directive:translateLanguage\n * @restrict A\n *\n * @description\n * Forces the language to the directives in the underlying scope.\n *\n * @param {string=} translate language that will be negotiated.\n *\n * @example\n   <example module=\"ngView\">\n    <file name=\"index.ced81ed4.html\">\n      <div>\n\n        <div>\n            <h1 translate>HELLO</h1>\n        </div>\n\n        <div translate-language=\"de\">\n            <h1 translate>HELLO</h1>\n        </div>\n\n      </div>\n    </file>\n    <file name=\"script.js\">\n      angular.module('ngView', ['pascalprecht.translate'])\n\n      .config(function ($translateProvider) {\n\n        $translateProvider\n          .translations('en',{\n            'HELLO': 'Hello world!'\n          })\n          .translations('de',{\n            'HELLO': 'Hallo Welt!'\n          })\n          .preferredLanguage('en');\n\n      });\n\n    </file>\n   </example>\n */\n.directive('translateLanguage', translateLanguageDirective);\n\nfunction translateLanguageDirective() {\n\n  'use strict';\n\n  return {\n    restrict: 'A',\n    scope: true,\n    compile: function () {\n      return function linkFn(scope, iElement, iAttrs) {\n\n        iAttrs.$observe('translateLanguage', function (newTranslateLanguage) {\n          scope.translateLanguage = newTranslateLanguage;\n        });\n\n        scope.$watch('translateLanguage', function(){\n          scope.$broadcast('translateLanguageChanged');\n        });\n      };\n    }\n  };\n}\n\ntranslateLanguageDirective.displayName = 'translateLanguageDirective';\n\nangular.module('pascalprecht.translate')\n/**\n * @ngdoc filter\n * @name pascalprecht.translate.filter:translate\n * @requires $parse\n * @requires pascalprecht.translate.$translate\n * @function\n *\n * @description\n * Uses `$translate` service to translate contents. Accepts interpolate parameters\n * to pass dynamized values though translation.\n *\n * @param {string} translationId A translation id to be translated.\n * @param {*=} interpolateParams Optional object literal (as hash or string) to pass values into translation.\n *\n * @returns {string} Translated text.\n *\n * @example\n   <example module=\"ngView\">\n    <file name=\"index.ced81ed4.html\">\n      <div ng-controller=\"TranslateCtrl\">\n\n        <pre>{{ 'TRANSLATION_ID' | translate }}</pre>\n        <pre>{{ translationId | translate }}</pre>\n        <pre>{{ 'WITH_VALUES' | translate:'{value: 5}' }}</pre>\n        <pre>{{ 'WITH_VALUES' | translate:values }}</pre>\n\n      </div>\n    </file>\n    <file name=\"script.js\">\n      angular.module('ngView', ['pascalprecht.translate'])\n\n      .config(function ($translateProvider) {\n\n        $translateProvider.translations('en', {\n          'TRANSLATION_ID': 'Hello there!',\n          'WITH_VALUES': 'The following value is dynamic: {{value}}'\n        });\n        $translateProvider.preferredLanguage('en');\n\n      });\n\n      angular.module('ngView').controller('TranslateCtrl', function ($scope) {\n        $scope.translationId = 'TRANSLATION_ID';\n\n        $scope.values = {\n          value: 78\n        };\n      });\n    </file>\n   </example>\n */\n.filter('translate', translateFilterFactory);\n\nfunction translateFilterFactory($parse, $translate) {\n\n  'use strict';\n\n  var translateFilter = function (translationId, interpolateParams, interpolation, forceLanguage) {\n    if (!angular.isObject(interpolateParams)) {\n      interpolateParams = $parse(interpolateParams)(this);\n    }\n\n    return $translate.instant(translationId, interpolateParams, interpolation, forceLanguage);\n  };\n\n  if ($translate.statefulFilter()) {\n    translateFilter.$stateful = true;\n  }\n\n  return translateFilter;\n}\n\ntranslateFilterFactory.displayName = 'translateFilterFactory';\n\nangular.module('pascalprecht.translate')\n\n/**\n * @ngdoc object\n * @name pascalprecht.translate.$translationCache\n * @requires $cacheFactory\n *\n * @description\n * The first time a translation table is used, it is loaded in the translation cache for quick retrieval. You\n * can load translation tables directly into the cache by consuming the\n * `$translationCache` service directly.\n *\n * @return {object} $cacheFactory object.\n */\n  .factory('$translationCache', $translationCache);\n\nfunction $translationCache($cacheFactory) {\n\n  'use strict';\n\n  return $cacheFactory('translations');\n}\n\n$translationCache.displayName = '$translationCache';\nreturn 'pascalprecht.translate';\n\n}));\n\n/*!\n * angular-translate - v2.13.0 - 2016-10-30\n * \n * Copyright (c) 2016 The angular-translate team, Pascal Precht; Licensed MIT\n */\n(function (root, factory) {\n  if (typeof define === 'function' && define.amd) {\n    // AMD. Register as an anonymous module unless amdModuleId is set\n    define([], function () {\n      return (factory());\n    });\n  } else if (typeof exports === 'object') {\n    // Node. Does not work with strict CommonJS, but\n    // only CommonJS-like environments that support module.exports,\n    // like Node.\n    module.exports = factory();\n  } else {\n    factory();\n  }\n}(this, function () {\n\nangular.module('pascalprecht.translate')\n/**\n * @ngdoc object\n * @name pascalprecht.translate.$translatePartialLoaderProvider\n *\n * @description\n * By using a $translatePartialLoaderProvider you can configure a list of a needed\n * translation parts directly during the configuration phase of your application's\n * lifetime. All parts you add by using this provider would be loaded by\n * angular-translate at the startup as soon as possible.\n */\n  .provider('$translatePartialLoader', $translatePartialLoader);\n\nfunction $translatePartialLoader() {\n\n  'use strict';\n\n  /**\n   * @constructor\n   * @name Part\n   *\n   * @description\n   * Represents Part object to add and set parts at runtime.\n   */\n  function Part(name, priority) {\n    this.name = name;\n    this.isActive = true;\n    this.tables = {};\n    this.priority = priority || 0;\n  }\n\n  /**\n   * @name parseUrl\n   * @method\n   *\n   * @description\n   * Returns a parsed url template string and replaces given target lang\n   * and part name it.\n   *\n   * @param {string|function} urlTemplate - Either a string containing an url pattern (with\n   *                                        '{part}' and '{lang}') or a function(part, lang)\n   *                                        returning a string.\n   * @param {string} targetLang - Language key for language to be used.\n   * @return {string} Parsed url template string\n   */\n  Part.prototype.parseUrl = function(urlTemplate, targetLang) {\n    if (angular.isFunction(urlTemplate)) {\n      return urlTemplate(this.name, targetLang);\n    }\n    return urlTemplate.replace(/\\{part\\}/g, this.name).replace(/\\{lang\\}/g, targetLang);\n  };\n\n  Part.prototype.getTable = function(lang, $q, $http, $httpOptions, urlTemplate, errorHandler) {\n\n    if (!this.tables[lang]) {\n      var self = this;\n\n      return $http(angular.extend({\n        method : 'GET',\n        url: this.parseUrl(urlTemplate, lang)\n      }, $httpOptions))\n        .then(function(result){\n          self.tables[lang] = result.data;\n          return result.data;\n        }, function(response) {\n          if (errorHandler) {\n            return errorHandler(self.name, lang, response)\n              .then(function(data) {\n                self.tables[lang] = data;\n                return data;\n              }, function() {\n                return $q.reject(self.name);\n              });\n          } else {\n            return $q.reject(self.name);\n          }\n        });\n\n    } else {\n      return $q.when(this.tables[lang]);\n    }\n  };\n\n  var parts = {};\n\n  function hasPart(name) {\n    return Object.prototype.hasOwnProperty.call(parts, name);\n  }\n\n  function isStringValid(str) {\n    return angular.isString(str) && str !== '';\n  }\n\n  function isPartAvailable(name) {\n    if (!isStringValid(name)) {\n      throw new TypeError('Invalid type of a first argument, a non-empty string expected.');\n    }\n\n    return (hasPart(name) && parts[name].isActive);\n  }\n\n  function deepExtend(dst, src) {\n    for (var property in src) {\n      if (src[property] && src[property].constructor &&\n       src[property].constructor === Object) {\n        dst[property] = dst[property] || {};\n        deepExtend(dst[property], src[property]);\n      } else {\n        dst[property] = src[property];\n      }\n    }\n    return dst;\n  }\n\n  function getPrioritizedParts() {\n    var prioritizedParts = [];\n    for(var part in parts) {\n      if (parts[part].isActive) {\n        prioritizedParts.push(parts[part]);\n      }\n    }\n    prioritizedParts.sort(function (a, b) {\n      return a.priority - b.priority;\n    });\n    return prioritizedParts;\n  }\n\n\n  /**\n   * @ngdoc function\n   * @name pascalprecht.translate.$translatePartialLoaderProvider#addPart\n   * @methodOf pascalprecht.translate.$translatePartialLoaderProvider\n   *\n   * @description\n   * Registers a new part of the translation table to be loaded once the\n   * `angular-translate` gets into runtime phase. It does not actually load any\n   * translation data, but only registers a part to be loaded in the future.\n   *\n   * @param {string} name A name of the part to add\n   * @param {int} [priority=0] Sets the load priority of this part.\n   *\n   * @returns {object} $translatePartialLoaderProvider, so this method is chainable\n   * @throws {TypeError} The method could throw a **TypeError** if you pass the param\n   * of the wrong type. Please, note that the `name` param has to be a\n   * non-empty **string**.\n   */\n  this.addPart = function(name, priority) {\n    if (!isStringValid(name)) {\n      throw new TypeError('Couldn\\'t add part, part name has to be a string!');\n    }\n\n    if (!hasPart(name)) {\n      parts[name] = new Part(name, priority);\n    }\n    parts[name].isActive = true;\n\n    return this;\n  };\n\n  /**\n   * @ngdocs function\n   * @name pascalprecht.translate.$translatePartialLoaderProvider#setPart\n   * @methodOf pascalprecht.translate.$translatePartialLoaderProvider\n   *\n   * @description\n   * Sets a translation table to the specified part. This method does not make the\n   * specified part available, but only avoids loading this part from the server.\n   *\n   * @param {string} lang A language of the given translation table\n   * @param {string} part A name of the target part\n   * @param {object} table A translation table to set to the specified part\n   *\n   * @return {object} $translatePartialLoaderProvider, so this method is chainable\n   * @throws {TypeError} The method could throw a **TypeError** if you pass params\n   * of the wrong type. Please, note that the `lang` and `part` params have to be a\n   * non-empty **string**s and the `table` param has to be an object.\n   */\n  this.setPart = function (lang, part, table) {\n    if (!isStringValid(lang)) {\n      throw new TypeError('Couldn\\'t set part.`lang` parameter has to be a string!');\n    }\n    if (!isStringValid(part)) {\n      throw new TypeError('Couldn\\'t set part.`part` parameter has to be a string!');\n    }\n    if (typeof table !== 'object' || table === null) {\n      throw new TypeError('Couldn\\'t set part. `table` parameter has to be an object!');\n    }\n\n    if (!hasPart(part)) {\n      parts[part] = new Part(part);\n      parts[part].isActive = false;\n    }\n\n    parts[part].tables[lang] = table;\n    return this;\n  };\n\n  /**\n   * @ngdoc function\n   * @name pascalprecht.translate.$translatePartialLoaderProvider#deletePart\n   * @methodOf pascalprecht.translate.$translatePartialLoaderProvider\n   *\n   * @description\n   * Removes the previously added part of the translation data. So, `angular-translate` will not\n   * load it at the startup.\n   *\n   * @param {string} name A name of the part to delete\n   *\n   * @returns {object} $translatePartialLoaderProvider, so this method is chainable\n   *\n   * @throws {TypeError} The method could throw a **TypeError** if you pass the param of the wrong\n   * type. Please, note that the `name` param has to be a non-empty **string**.\n   */\n  this.deletePart = function (name) {\n    if (!isStringValid(name)) {\n      throw new TypeError('Couldn\\'t delete part, first arg has to be string.');\n    }\n\n    if (hasPart(name)) {\n      parts[name].isActive = false;\n    }\n\n    return this;\n  };\n\n\n  /**\n   * @ngdoc function\n   * @name pascalprecht.translate.$translatePartialLoaderProvider#isPartAvailable\n   * @methodOf pascalprecht.translate.$translatePartialLoaderProvider\n   *\n   * @description\n   * Checks if the specific part is available. A part becomes available after it was added by the\n   * `addPart` method. Available parts would be loaded from the server once the `angular-translate`\n   * asks the loader to that.\n   *\n   * @param {string} name A name of the part to check\n   *\n   * @returns {boolean} Returns **true** if the part is available now and **false** if not.\n   *\n   * @throws {TypeError} The method could throw a **TypeError** if you pass the param of the wrong\n   * type. Please, note that the `name` param has to be a non-empty **string**.\n   */\n  this.isPartAvailable = isPartAvailable;\n\n  /**\n   * @ngdoc object\n   * @name pascalprecht.translate.$translatePartialLoader\n   *\n   * @requires $q\n   * @requires $http\n   * @requires $injector\n   * @requires $rootScope\n   * @requires $translate\n   *\n   * @description\n   *\n   * @param {object} options Options object\n   *\n   * @throws {TypeError}\n   */\n  this.$get = ['$rootScope', '$injector', '$q', '$http',\n  function($rootScope, $injector, $q, $http) {\n\n    /**\n     * @ngdoc event\n     * @name pascalprecht.translate.$translatePartialLoader#$translatePartialLoaderStructureChanged\n     * @eventOf pascalprecht.translate.$translatePartialLoader\n     * @eventType broadcast on root scope\n     *\n     * @description\n     * A $translatePartialLoaderStructureChanged event is called when a state of the loader was\n     * changed somehow. It could mean either some part is added or some part is deleted. Anyway when\n     * you get this event the translation table is not longer current and has to be updated.\n     *\n     * @param {string} name A name of the part which is a reason why the event was fired\n     */\n\n    var service = function(options) {\n      if (!isStringValid(options.key)) {\n        throw new TypeError('Unable to load data, a key is not a non-empty string.');\n      }\n\n      if (!isStringValid(options.urlTemplate) && !angular.isFunction(options.urlTemplate)) {\n        throw new TypeError('Unable to load data, a urlTemplate is not a non-empty string or not a function.');\n      }\n\n      var errorHandler = options.loadFailureHandler;\n      if (errorHandler !== undefined) {\n        if (!angular.isString(errorHandler)) {\n          throw new Error('Unable to load data, a loadFailureHandler is not a string.');\n        } else {\n          errorHandler = $injector.get(errorHandler);\n        }\n      }\n\n      var loaders = [],\n          prioritizedParts = getPrioritizedParts();\n\n      angular.forEach(prioritizedParts, function(part) {\n        loaders.push(\n          part.getTable(options.key, $q, $http, options.$http, options.urlTemplate, errorHandler)\n        );\n        part.urlTemplate = options.urlTemplate;\n      });\n\n      return $q.all(loaders)\n        .then(function() {\n          var table = {};\n          prioritizedParts = getPrioritizedParts();\n          angular.forEach(prioritizedParts, function(part) {\n            deepExtend(table, part.tables[options.key]);\n          });\n          return table;\n        }, function() {\n          return $q.reject(options.key);\n        });\n    };\n\n    /**\n     * @ngdoc function\n     * @name pascalprecht.translate.$translatePartialLoader#addPart\n     * @methodOf pascalprecht.translate.$translatePartialLoader\n     *\n     * @description\n     * Registers a new part of the translation table. This method does not actually perform any xhr\n     * requests to get translation data. The new parts will be loaded in order of priority from the server next time\n     * `angular-translate` asks the loader to load translations.\n     *\n     * @param {string} name A name of the part to add\n     * @param {int} [priority=0] Sets the load priority of this part.\n     *\n     * @returns {object} $translatePartialLoader, so this method is chainable\n     *\n     * @fires {$translatePartialLoaderStructureChanged} The $translatePartialLoaderStructureChanged\n     * event would be fired by this method in case the new part affected somehow on the loaders\n     * state. This way it means that there are a new translation data available to be loaded from\n     * the server.\n     *\n     * @throws {TypeError} The method could throw a **TypeError** if you pass the param of the wrong\n     * type. Please, note that the `name` param has to be a non-empty **string**.\n     */\n    service.addPart = function(name, priority) {\n      if (!isStringValid(name)) {\n        throw new TypeError('Couldn\\'t add part, first arg has to be a string');\n      }\n\n      if (!hasPart(name)) {\n        parts[name] = new Part(name, priority);\n        $rootScope.$emit('$translatePartialLoaderStructureChanged', name);\n      } else if (!parts[name].isActive) {\n        parts[name].isActive = true;\n        $rootScope.$emit('$translatePartialLoaderStructureChanged', name);\n      }\n\n      return service;\n    };\n\n    /**\n     * @ngdoc function\n     * @name pascalprecht.translate.$translatePartialLoader#deletePart\n     * @methodOf pascalprecht.translate.$translatePartialLoader\n     *\n     * @description\n     * Deletes the previously added part of the translation data. The target part could be deleted\n     * either logically or physically. When the data is deleted logically it is not actually deleted\n     * from the browser, but the loader marks it as not active and prevents it from affecting on the\n     * translations. If the deleted in such way part is added again, the loader will use the\n     * previously loaded data rather than loading it from the server once more time. But if the data\n     * is deleted physically, the loader will completely remove all information about it. So in case\n     * of recycling this part will be loaded from the server again.\n     *\n     * @param {string} name A name of the part to delete\n     * @param {boolean=} [removeData=false] An indicator if the loader has to remove a loaded\n     * translation data physically. If the `removeData` if set to **false** the loaded data will not be\n     * deleted physically and might be reused in the future to prevent an additional xhr requests.\n     *\n     * @returns {object} $translatePartialLoader, so this method is chainable\n     *\n     * @fires {$translatePartialLoaderStructureChanged} The $translatePartialLoaderStructureChanged\n     * event would be fired by this method in case a part deletion process affects somehow on the\n     * loaders state. This way it means that some part of the translation data is now deprecated and\n     * the translation table has to be recompiled with the remaining translation parts.\n     *\n     * @throws {TypeError} The method could throw a **TypeError** if you pass some param of the\n     * wrong type. Please, note that the `name` param has to be a non-empty **string** and\n     * the `removeData` param has to be either **undefined** or **boolean**.\n     */\n    service.deletePart = function(name, removeData) {\n      if (!isStringValid(name)) {\n        throw new TypeError('Couldn\\'t delete part, first arg has to be string');\n      }\n\n      if (removeData === undefined) {\n        removeData = false;\n      } else if (typeof removeData !== 'boolean') {\n        throw new TypeError('Invalid type of a second argument, a boolean expected.');\n      }\n\n      if (hasPart(name)) {\n        var wasActive = parts[name].isActive;\n        if (removeData) {\n          var $translate = $injector.get('$translate');\n          var cache = $translate.loaderCache();\n          if (typeof(cache) === 'string') {\n            // getting on-demand instance of loader\n            cache = $injector.get(cache);\n          }\n          // Purging items from cache...\n          if (typeof(cache) === 'object') {\n            angular.forEach(parts[name].tables, function(value, key) {\n                cache.remove(parts[name].parseUrl(parts[name].urlTemplate, key));\n            });\n          }\n          delete parts[name];\n        } else {\n          parts[name].isActive = false;\n        }\n        if (wasActive) {\n          $rootScope.$emit('$translatePartialLoaderStructureChanged', name);\n        }\n      }\n\n      return service;\n    };\n\n    /**\n     * @ngdoc function\n     * @name pascalprecht.translate.$translatePartialLoader#isPartLoaded\n     * @methodOf pascalprecht.translate.$translatePartialLoader\n     *\n     * @description\n     * Checks if the registered translation part is loaded into the translation table.\n     *\n     * @param {string} name A name of the part\n     * @param {string} lang A key of the language\n     *\n     * @returns {boolean} Returns **true** if the translation of the part is loaded to the translation table and **false** if not.\n     *\n     * @throws {TypeError} The method could throw a **TypeError** if you pass the param of the wrong\n     * type. Please, note that the `name` and `lang` params have to be non-empty **string**.\n     */\n    service.isPartLoaded = function(name, lang) {\n      return angular.isDefined(parts[name]) && angular.isDefined(parts[name].tables[lang]);\n    };\n\n    /**\n     * @ngdoc function\n     * @name pascalprecht.translate.$translatePartialLoader#getRegisteredParts\n     * @methodOf pascalprecht.translate.$translatePartialLoader\n     *\n     * @description\n     * Gets names of the parts that were added with the `addPart`.\n     *\n     * @returns {array} Returns array of registered parts, if none were registered then an empty array is returned.\n     */\n    service.getRegisteredParts = function() {\n      var registeredParts = [];\n      angular.forEach(parts, function(p){\n        if(p.isActive) {\n          registeredParts.push(p.name);\n        }\n      });\n      return registeredParts;\n    };\n\n\n\n    /**\n     * @ngdoc function\n     * @name pascalprecht.translate.$translatePartialLoader#isPartAvailable\n     * @methodOf pascalprecht.translate.$translatePartialLoader\n     *\n     * @description\n     * Checks if a target translation part is available. The part becomes available just after it was\n     * added by the `addPart` method. Part's availability does not mean that it was loaded from the\n     * server, but only that it was added to the loader. The available part might be loaded next\n     * time the loader is called.\n     *\n     * @param {string} name A name of the part to delete\n     *\n     * @returns {boolean} Returns **true** if the part is available now and **false** if not.\n     *\n     * @throws {TypeError} The method could throw a **TypeError** if you pass the param of the wrong\n     * type. Please, note that the `name` param has to be a non-empty **string**.\n     */\n    service.isPartAvailable = isPartAvailable;\n\n    return service;\n\n  }];\n\n}\n\n$translatePartialLoader.displayName = '$translatePartialLoader';\nreturn 'pascalprecht.translate';\n\n}));\n\n/**\n * State-based routing for AngularJS\n * @version v0.3.2\n * @link http://angular-ui.github.com/\n * @license MIT License, http://www.opensource.org/licenses/MIT\n */\n\n/* commonjs package manager support (eg componentjs) */\nif (typeof module !== \"undefined\" && typeof exports !== \"undefined\" && module.exports === exports){\n  module.exports = 'ui.router';\n}\n\n(function (window, angular, undefined) {\n/*jshint globalstrict:true*/\n/*global angular:false*/\n'use strict';\n\nvar isDefined = angular.isDefined,\n    isFunction = angular.isFunction,\n    isString = angular.isString,\n    isObject = angular.isObject,\n    isArray = angular.isArray,\n    forEach = angular.forEach,\n    extend = angular.extend,\n    copy = angular.copy,\n    toJson = angular.toJson;\n\nfunction inherit(parent, extra) {\n  return extend(new (extend(function() {}, { prototype: parent }))(), extra);\n}\n\nfunction merge(dst) {\n  forEach(arguments, function(obj) {\n    if (obj !== dst) {\n      forEach(obj, function(value, key) {\n        if (!dst.hasOwnProperty(key)) dst[key] = value;\n      });\n    }\n  });\n  return dst;\n}\n\n/**\n * Finds the common ancestor path between two states.\n *\n * @param {Object} first The first state.\n * @param {Object} second The second state.\n * @return {Array} Returns an array of state names in descending order, not including the root.\n */\nfunction ancestors(first, second) {\n  var path = [];\n\n  for (var n in first.path) {\n    if (first.path[n] !== second.path[n]) break;\n    path.push(first.path[n]);\n  }\n  return path;\n}\n\n/**\n * IE8-safe wrapper for `Object.keys()`.\n *\n * @param {Object} object A JavaScript object.\n * @return {Array} Returns the keys of the object as an array.\n */\nfunction objectKeys(object) {\n  if (Object.keys) {\n    return Object.keys(object);\n  }\n  var result = [];\n\n  forEach(object, function(val, key) {\n    result.push(key);\n  });\n  return result;\n}\n\n/**\n * IE8-safe wrapper for `Array.prototype.indexOf()`.\n *\n * @param {Array} array A JavaScript array.\n * @param {*} value A value to search the array for.\n * @return {Number} Returns the array index value of `value`, or `-1` if not present.\n */\nfunction indexOf(array, value) {\n  if (Array.prototype.indexOf) {\n    return array.indexOf(value, Number(arguments[2]) || 0);\n  }\n  var len = array.length >>> 0, from = Number(arguments[2]) || 0;\n  from = (from < 0) ? Math.ceil(from) : Math.floor(from);\n\n  if (from < 0) from += len;\n\n  for (; from < len; from++) {\n    if (from in array && array[from] === value) return from;\n  }\n  return -1;\n}\n\n/**\n * Merges a set of parameters with all parameters inherited between the common parents of the\n * current state and a given destination state.\n *\n * @param {Object} currentParams The value of the current state parameters ($stateParams).\n * @param {Object} newParams The set of parameters which will be composited with inherited params.\n * @param {Object} $current Internal definition of object representing the current state.\n * @param {Object} $to Internal definition of object representing state to transition to.\n */\nfunction inheritParams(currentParams, newParams, $current, $to) {\n  var parents = ancestors($current, $to), parentParams, inherited = {}, inheritList = [];\n\n  for (var i in parents) {\n    if (!parents[i] || !parents[i].params) continue;\n    parentParams = objectKeys(parents[i].params);\n    if (!parentParams.length) continue;\n\n    for (var j in parentParams) {\n      if (indexOf(inheritList, parentParams[j]) >= 0) continue;\n      inheritList.push(parentParams[j]);\n      inherited[parentParams[j]] = currentParams[parentParams[j]];\n    }\n  }\n  return extend({}, inherited, newParams);\n}\n\n/**\n * Performs a non-strict comparison of the subset of two objects, defined by a list of keys.\n *\n * @param {Object} a The first object.\n * @param {Object} b The second object.\n * @param {Array} keys The list of keys within each object to compare. If the list is empty or not specified,\n *                     it defaults to the list of keys in `a`.\n * @return {Boolean} Returns `true` if the keys match, otherwise `false`.\n */\nfunction equalForKeys(a, b, keys) {\n  if (!keys) {\n    keys = [];\n    for (var n in a) keys.push(n); // Used instead of Object.keys() for IE8 compatibility\n  }\n\n  for (var i=0; i<keys.length; i++) {\n    var k = keys[i];\n    if (a[k] != b[k]) return false; // Not '===', values aren't necessarily normalized\n  }\n  return true;\n}\n\n/**\n * Returns the subset of an object, based on a list of keys.\n *\n * @param {Array} keys\n * @param {Object} values\n * @return {Boolean} Returns a subset of `values`.\n */\nfunction filterByKeys(keys, values) {\n  var filtered = {};\n\n  forEach(keys, function (name) {\n    filtered[name] = values[name];\n  });\n  return filtered;\n}\n\n// like _.indexBy\n// when you know that your index values will be unique, or you want last-one-in to win\nfunction indexBy(array, propName) {\n  var result = {};\n  forEach(array, function(item) {\n    result[item[propName]] = item;\n  });\n  return result;\n}\n\n// extracted from underscore.js\n// Return a copy of the object only containing the whitelisted properties.\nfunction pick(obj) {\n  var copy = {};\n  var keys = Array.prototype.concat.apply(Array.prototype, Array.prototype.slice.call(arguments, 1));\n  forEach(keys, function(key) {\n    if (key in obj) copy[key] = obj[key];\n  });\n  return copy;\n}\n\n// extracted from underscore.js\n// Return a copy of the object omitting the blacklisted properties.\nfunction omit(obj) {\n  var copy = {};\n  var keys = Array.prototype.concat.apply(Array.prototype, Array.prototype.slice.call(arguments, 1));\n  for (var key in obj) {\n    if (indexOf(keys, key) == -1) copy[key] = obj[key];\n  }\n  return copy;\n}\n\nfunction pluck(collection, key) {\n  var result = isArray(collection) ? [] : {};\n\n  forEach(collection, function(val, i) {\n    result[i] = isFunction(key) ? key(val) : val[key];\n  });\n  return result;\n}\n\nfunction filter(collection, callback) {\n  var array = isArray(collection);\n  var result = array ? [] : {};\n  forEach(collection, function(val, i) {\n    if (callback(val, i)) {\n      result[array ? result.length : i] = val;\n    }\n  });\n  return result;\n}\n\nfunction map(collection, callback) {\n  var result = isArray(collection) ? [] : {};\n\n  forEach(collection, function(val, i) {\n    result[i] = callback(val, i);\n  });\n  return result;\n}\n\n// issue #2676 #2889\nfunction silenceUncaughtInPromise (promise) {\n  return promise.then(undefined, function() {}) && promise;\n}\n\n/**\n * @ngdoc overview\n * @name ui.router.util\n *\n * @description\n * # ui.router.util sub-module\n *\n * This module is a dependency of other sub-modules. Do not include this module as a dependency\n * in your angular app (use {@link ui.router} module instead).\n *\n */\nangular.module('ui.router.util', ['ng']);\n\n/**\n * @ngdoc overview\n * @name ui.router.router\n * \n * @requires ui.router.util\n *\n * @description\n * # ui.router.router sub-module\n *\n * This module is a dependency of other sub-modules. Do not include this module as a dependency\n * in your angular app (use {@link ui.router} module instead).\n */\nangular.module('ui.router.router', ['ui.router.util']);\n\n/**\n * @ngdoc overview\n * @name ui.router.state\n * \n * @requires ui.router.router\n * @requires ui.router.util\n *\n * @description\n * # ui.router.state sub-module\n *\n * This module is a dependency of the main ui.router module. Do not include this module as a dependency\n * in your angular app (use {@link ui.router} module instead).\n * \n */\nangular.module('ui.router.state', ['ui.router.router', 'ui.router.util']);\n\n/**\n * @ngdoc overview\n * @name ui.router\n *\n * @requires ui.router.state\n *\n * @description\n * # ui.router\n * \n * ## The main module for ui.router \n * There are several sub-modules included with the ui.router module, however only this module is needed\n * as a dependency within your angular app. The other modules are for organization purposes. \n *\n * The modules are:\n * * ui.router - the main \"umbrella\" module\n * * ui.router.router - \n * \n * *You'll need to include **only** this module as the dependency within your angular app.*\n * \n * <pre>\n * <!doctype html>\n * <html ng-app=\"myApp\">\n * <head>\n *   <script src=\"js/angular.js\"></script>\n *   <!-- Include the ui-router script -->\n *   <script src=\"js/angular-ui-router.min.js\"></script>\n *   <script>\n *     // ...and add 'ui.router' as a dependency\n *     var myApp = angular.module('myApp', ['ui.router']);\n *   </script>\n * </head>\n * <body>\n * </body>\n * </html>\n * </pre>\n */\nangular.module('ui.router', ['ui.router.state']);\n\nangular.module('ui.router.compat', ['ui.router']);\n\n/**\n * @ngdoc object\n * @name ui.router.util.$resolve\n *\n * @requires $q\n * @requires $injector\n *\n * @description\n * Manages resolution of (acyclic) graphs of promises.\n */\n$Resolve.$inject = ['$q', '$injector'];\nfunction $Resolve(  $q,    $injector) {\n  \n  var VISIT_IN_PROGRESS = 1,\n      VISIT_DONE = 2,\n      NOTHING = {},\n      NO_DEPENDENCIES = [],\n      NO_LOCALS = NOTHING,\n      NO_PARENT = extend($q.when(NOTHING), { $$promises: NOTHING, $$values: NOTHING });\n  \n\n  /**\n   * @ngdoc function\n   * @name ui.router.util.$resolve#study\n   * @methodOf ui.router.util.$resolve\n   *\n   * @description\n   * Studies a set of invocables that are likely to be used multiple times.\n   * <pre>\n   * $resolve.study(invocables)(locals, parent, self)\n   * </pre>\n   * is equivalent to\n   * <pre>\n   * $resolve.resolve(invocables, locals, parent, self)\n   * </pre>\n   * but the former is more efficient (in fact `resolve` just calls `study` \n   * internally).\n   *\n   * @param {object} invocables Invocable objects\n   * @return {function} a function to pass in locals, parent and self\n   */\n  this.study = function (invocables) {\n    if (!isObject(invocables)) throw new Error(\"'invocables' must be an object\");\n    var invocableKeys = objectKeys(invocables || {});\n    \n    // Perform a topological sort of invocables to build an ordered plan\n    var plan = [], cycle = [], visited = {};\n    function visit(value, key) {\n      if (visited[key] === VISIT_DONE) return;\n      \n      cycle.push(key);\n      if (visited[key] === VISIT_IN_PROGRESS) {\n        cycle.splice(0, indexOf(cycle, key));\n        throw new Error(\"Cyclic dependency: \" + cycle.join(\" -> \"));\n      }\n      visited[key] = VISIT_IN_PROGRESS;\n      \n      if (isString(value)) {\n        plan.push(key, [ function() { return $injector.get(value); }], NO_DEPENDENCIES);\n      } else {\n        var params = $injector.annotate(value);\n        forEach(params, function (param) {\n          if (param !== key && invocables.hasOwnProperty(param)) visit(invocables[param], param);\n        });\n        plan.push(key, value, params);\n      }\n      \n      cycle.pop();\n      visited[key] = VISIT_DONE;\n    }\n    forEach(invocables, visit);\n    invocables = cycle = visited = null; // plan is all that's required\n    \n    function isResolve(value) {\n      return isObject(value) && value.then && value.$$promises;\n    }\n    \n    return function (locals, parent, self) {\n      if (isResolve(locals) && self === undefined) {\n        self = parent; parent = locals; locals = null;\n      }\n      if (!locals) locals = NO_LOCALS;\n      else if (!isObject(locals)) {\n        throw new Error(\"'locals' must be an object\");\n      }       \n      if (!parent) parent = NO_PARENT;\n      else if (!isResolve(parent)) {\n        throw new Error(\"'parent' must be a promise returned by $resolve.resolve()\");\n      }\n      \n      // To complete the overall resolution, we have to wait for the parent\n      // promise and for the promise for each invokable in our plan.\n      var resolution = $q.defer(),\n          result = resolution.promise,\n          promises = result.$$promises = {},\n          values = extend({}, locals),\n          wait = 1 + plan.length/3,\n          merged = false;\n          \n      function done() {\n        // Merge parent values we haven't got yet and publish our own $$values\n        if (!--wait) {\n          if (!merged) merge(values, parent.$$values); \n          result.$$values = values;\n          result.$$promises = result.$$promises || true; // keep for isResolve()\n          delete result.$$inheritedValues;\n          resolution.resolve(values);\n        }\n      }\n      \n      function fail(reason) {\n        result.$$failure = reason;\n        resolution.reject(reason);\n      }\n\n      // Short-circuit if parent has already failed\n      if (isDefined(parent.$$failure)) {\n        fail(parent.$$failure);\n        return result;\n      }\n      \n      if (parent.$$inheritedValues) {\n        merge(values, omit(parent.$$inheritedValues, invocableKeys));\n      }\n\n      // Merge parent values if the parent has already resolved, or merge\n      // parent promises and wait if the parent resolve is still in progress.\n      extend(promises, parent.$$promises);\n      if (parent.$$values) {\n        merged = merge(values, omit(parent.$$values, invocableKeys));\n        result.$$inheritedValues = omit(parent.$$values, invocableKeys);\n        done();\n      } else {\n        if (parent.$$inheritedValues) {\n          result.$$inheritedValues = omit(parent.$$inheritedValues, invocableKeys);\n        }        \n        parent.then(done, fail);\n      }\n      \n      // Process each invocable in the plan, but ignore any where a local of the same name exists.\n      for (var i=0, ii=plan.length; i<ii; i+=3) {\n        if (locals.hasOwnProperty(plan[i])) done();\n        else invoke(plan[i], plan[i+1], plan[i+2]);\n      }\n      \n      function invoke(key, invocable, params) {\n        // Create a deferred for this invocation. Failures will propagate to the resolution as well.\n        var invocation = $q.defer(), waitParams = 0;\n        function onfailure(reason) {\n          invocation.reject(reason);\n          fail(reason);\n        }\n        // Wait for any parameter that we have a promise for (either from parent or from this\n        // resolve; in that case study() will have made sure it's ordered before us in the plan).\n        forEach(params, function (dep) {\n          if (promises.hasOwnProperty(dep) && !locals.hasOwnProperty(dep)) {\n            waitParams++;\n            promises[dep].then(function (result) {\n              values[dep] = result;\n              if (!(--waitParams)) proceed();\n            }, onfailure);\n          }\n        });\n        if (!waitParams) proceed();\n        function proceed() {\n          if (isDefined(result.$$failure)) return;\n          try {\n            invocation.resolve($injector.invoke(invocable, self, values));\n            invocation.promise.then(function (result) {\n              values[key] = result;\n              done();\n            }, onfailure);\n          } catch (e) {\n            onfailure(e);\n          }\n        }\n        // Publish promise synchronously; invocations further down in the plan may depend on it.\n        promises[key] = invocation.promise;\n      }\n      \n      return result;\n    };\n  };\n  \n  /**\n   * @ngdoc function\n   * @name ui.router.util.$resolve#resolve\n   * @methodOf ui.router.util.$resolve\n   *\n   * @description\n   * Resolves a set of invocables. An invocable is a function to be invoked via \n   * `$injector.invoke()`, and can have an arbitrary number of dependencies. \n   * An invocable can either return a value directly,\n   * or a `$q` promise. If a promise is returned it will be resolved and the \n   * resulting value will be used instead. Dependencies of invocables are resolved \n   * (in this order of precedence)\n   *\n   * - from the specified `locals`\n   * - from another invocable that is part of this `$resolve` call\n   * - from an invocable that is inherited from a `parent` call to `$resolve` \n   *   (or recursively\n   * - from any ancestor `$resolve` of that parent).\n   *\n   * The return value of `$resolve` is a promise for an object that contains \n   * (in this order of precedence)\n   *\n   * - any `locals` (if specified)\n   * - the resolved return values of all injectables\n   * - any values inherited from a `parent` call to `$resolve` (if specified)\n   *\n   * The promise will resolve after the `parent` promise (if any) and all promises \n   * returned by injectables have been resolved. If any invocable \n   * (or `$injector.invoke`) throws an exception, or if a promise returned by an \n   * invocable is rejected, the `$resolve` promise is immediately rejected with the \n   * same error. A rejection of a `parent` promise (if specified) will likewise be \n   * propagated immediately. Once the `$resolve` promise has been rejected, no \n   * further invocables will be called.\n   * \n   * Cyclic dependencies between invocables are not permitted and will cause `$resolve`\n   * to throw an error. As a special case, an injectable can depend on a parameter \n   * with the same name as the injectable, which will be fulfilled from the `parent` \n   * injectable of the same name. This allows inherited values to be decorated. \n   * Note that in this case any other injectable in the same `$resolve` with the same\n   * dependency would see the decorated value, not the inherited value.\n   *\n   * Note that missing dependencies -- unlike cyclic dependencies -- will cause an \n   * (asynchronous) rejection of the `$resolve` promise rather than a (synchronous) \n   * exception.\n   *\n   * Invocables are invoked eagerly as soon as all dependencies are available. \n   * This is true even for dependencies inherited from a `parent` call to `$resolve`.\n   *\n   * As a special case, an invocable can be a string, in which case it is taken to \n   * be a service name to be passed to `$injector.get()`. This is supported primarily \n   * for backwards-compatibility with the `resolve` property of `$routeProvider` \n   * routes.\n   *\n   * @param {object} invocables functions to invoke or \n   * `$injector` services to fetch.\n   * @param {object} locals  values to make available to the injectables\n   * @param {object} parent  a promise returned by another call to `$resolve`.\n   * @param {object} self  the `this` for the invoked methods\n   * @return {object} Promise for an object that contains the resolved return value\n   * of all invocables, as well as any inherited and local values.\n   */\n  this.resolve = function (invocables, locals, parent, self) {\n    return this.study(invocables)(locals, parent, self);\n  };\n}\n\nangular.module('ui.router.util').service('$resolve', $Resolve);\n\n\n/**\n * @ngdoc object\n * @name ui.router.util.$templateFactory\n *\n * @requires $http\n * @requires $templateCache\n * @requires $injector\n *\n * @description\n * Service. Manages loading of templates.\n */\n$TemplateFactory.$inject = ['$http', '$templateCache', '$injector'];\nfunction $TemplateFactory(  $http,   $templateCache,   $injector) {\n\n  /**\n   * @ngdoc function\n   * @name ui.router.util.$templateFactory#fromConfig\n   * @methodOf ui.router.util.$templateFactory\n   *\n   * @description\n   * Creates a template from a configuration object. \n   *\n   * @param {object} config Configuration object for which to load a template. \n   * The following properties are search in the specified order, and the first one \n   * that is defined is used to create the template:\n   *\n   * @param {string|object} config.template html string template or function to \n   * load via {@link ui.router.util.$templateFactory#fromString fromString}.\n   * @param {string|object} config.templateUrl url to load or a function returning \n   * the url to load via {@link ui.router.util.$templateFactory#fromUrl fromUrl}.\n   * @param {Function} config.templateProvider function to invoke via \n   * {@link ui.router.util.$templateFactory#fromProvider fromProvider}.\n   * @param {object} params  Parameters to pass to the template function.\n   * @param {object} locals Locals to pass to `invoke` if the template is loaded \n   * via a `templateProvider`. Defaults to `{ params: params }`.\n   *\n   * @return {string|object}  The template html as a string, or a promise for \n   * that string,or `null` if no template is configured.\n   */\n  this.fromConfig = function (config, params, locals) {\n    return (\n      isDefined(config.template) ? this.fromString(config.template, params) :\n      isDefined(config.templateUrl) ? this.fromUrl(config.templateUrl, params) :\n      isDefined(config.templateProvider) ? this.fromProvider(config.templateProvider, params, locals) :\n      null\n    );\n  };\n\n  /**\n   * @ngdoc function\n   * @name ui.router.util.$templateFactory#fromString\n   * @methodOf ui.router.util.$templateFactory\n   *\n   * @description\n   * Creates a template from a string or a function returning a string.\n   *\n   * @param {string|object} template html template as a string or function that \n   * returns an html template as a string.\n   * @param {object} params Parameters to pass to the template function.\n   *\n   * @return {string|object} The template html as a string, or a promise for that \n   * string.\n   */\n  this.fromString = function (template, params) {\n    return isFunction(template) ? template(params) : template;\n  };\n\n  /**\n   * @ngdoc function\n   * @name ui.router.util.$templateFactory#fromUrl\n   * @methodOf ui.router.util.$templateFactory\n   * \n   * @description\n   * Loads a template from the a URL via `$http` and `$templateCache`.\n   *\n   * @param {string|Function} url url of the template to load, or a function \n   * that returns a url.\n   * @param {Object} params Parameters to pass to the url function.\n   * @return {string|Promise.<string>} The template html as a string, or a promise \n   * for that string.\n   */\n  this.fromUrl = function (url, params) {\n    if (isFunction(url)) url = url(params);\n    if (url == null) return null;\n    else return $http\n        .get(url, { cache: $templateCache, headers: { Accept: 'text/html' }})\n        .then(function(response) { return response.data; });\n  };\n\n  /**\n   * @ngdoc function\n   * @name ui.router.util.$templateFactory#fromProvider\n   * @methodOf ui.router.util.$templateFactory\n   *\n   * @description\n   * Creates a template by invoking an injectable provider function.\n   *\n   * @param {Function} provider Function to invoke via `$injector.invoke`\n   * @param {Object} params Parameters for the template.\n   * @param {Object} locals Locals to pass to `invoke`. Defaults to \n   * `{ params: params }`.\n   * @return {string|Promise.<string>} The template html as a string, or a promise \n   * for that string.\n   */\n  this.fromProvider = function (provider, params, locals) {\n    return $injector.invoke(provider, null, locals || { params: params });\n  };\n}\n\nangular.module('ui.router.util').service('$templateFactory', $TemplateFactory);\n\nvar $$UMFP; // reference to $UrlMatcherFactoryProvider\n\n/**\n * @ngdoc object\n * @name ui.router.util.type:UrlMatcher\n *\n * @description\n * Matches URLs against patterns and extracts named parameters from the path or the search\n * part of the URL. A URL pattern consists of a path pattern, optionally followed by '?' and a list\n * of search parameters. Multiple search parameter names are separated by '&'. Search parameters\n * do not influence whether or not a URL is matched, but their values are passed through into\n * the matched parameters returned by {@link ui.router.util.type:UrlMatcher#methods_exec exec}.\n *\n * Path parameter placeholders can be specified using simple colon/catch-all syntax or curly brace\n * syntax, which optionally allows a regular expression for the parameter to be specified:\n *\n * * `':'` name - colon placeholder\n * * `'*'` name - catch-all placeholder\n * * `'{' name '}'` - curly placeholder\n * * `'{' name ':' regexp|type '}'` - curly placeholder with regexp or type name. Should the\n *   regexp itself contain curly braces, they must be in matched pairs or escaped with a backslash.\n *\n * Parameter names may contain only word characters (latin letters, digits, and underscore) and\n * must be unique within the pattern (across both path and search parameters). For colon\n * placeholders or curly placeholders without an explicit regexp, a path parameter matches any\n * number of characters other than '/'. For catch-all placeholders the path parameter matches\n * any number of characters.\n *\n * Examples:\n *\n * * `'/hello/'` - Matches only if the path is exactly '/hello/'. There is no special treatment for\n *   trailing slashes, and patterns have to match the entire path, not just a prefix.\n * * `'/user/:id'` - Matches '/user/bob' or '/user/1234!!!' or even '/user/' but not '/user' or\n *   '/user/bob/details'. The second path segment will be captured as the parameter 'id'.\n * * `'/user/{id}'` - Same as the previous example, but using curly brace syntax.\n * * `'/user/{id:[^/]*}'` - Same as the previous example.\n * * `'/user/{id:[0-9a-fA-F]{1,8}}'` - Similar to the previous example, but only matches if the id\n *   parameter consists of 1 to 8 hex digits.\n * * `'/files/{path:.*}'` - Matches any URL starting with '/files/' and captures the rest of the\n *   path into the parameter 'path'.\n * * `'/files/*path'` - ditto.\n * * `'/calendar/{start:date}'` - Matches \"/calendar/2014-11-12\" (because the pattern defined\n *   in the built-in  `date` Type matches `2014-11-12`) and provides a Date object in $stateParams.start\n *\n * @param {string} pattern  The pattern to compile into a matcher.\n * @param {Object} config  A configuration object hash:\n * @param {Object=} parentMatcher Used to concatenate the pattern/config onto\n *   an existing UrlMatcher\n *\n * * `caseInsensitive` - `true` if URL matching should be case insensitive, otherwise `false`, the default value (for backward compatibility) is `false`.\n * * `strict` - `false` if matching against a URL with a trailing slash should be treated as equivalent to a URL without a trailing slash, the default value is `true`.\n *\n * @property {string} prefix  A static prefix of this pattern. The matcher guarantees that any\n *   URL matching this matcher (i.e. any string for which {@link ui.router.util.type:UrlMatcher#methods_exec exec()} returns\n *   non-null) will start with this prefix.\n *\n * @property {string} source  The pattern that was passed into the constructor\n *\n * @property {string} sourcePath  The path portion of the source property\n *\n * @property {string} sourceSearch  The search portion of the source property\n *\n * @property {string} regex  The constructed regex that will be used to match against the url when\n *   it is time to determine which url will match.\n *\n * @returns {Object}  New `UrlMatcher` object\n */\nfunction UrlMatcher(pattern, config, parentMatcher) {\n  config = extend({ params: {} }, isObject(config) ? config : {});\n\n  // Find all placeholders and create a compiled pattern, using either classic or curly syntax:\n  //   '*' name\n  //   ':' name\n  //   '{' name '}'\n  //   '{' name ':' regexp '}'\n  // The regular expression is somewhat complicated due to the need to allow curly braces\n  // inside the regular expression. The placeholder regexp breaks down as follows:\n  //    ([:*])([\\w\\[\\]]+)              - classic placeholder ($1 / $2) (search version has - for snake-case)\n  //    \\{([\\w\\[\\]]+)(?:\\:\\s*( ... ))?\\}  - curly brace placeholder ($3) with optional regexp/type ... ($4) (search version has - for snake-case\n  //    (?: ... | ... | ... )+         - the regexp consists of any number of atoms, an atom being either\n  //    [^{}\\\\]+                       - anything other than curly braces or backslash\n  //    \\\\.                            - a backslash escape\n  //    \\{(?:[^{}\\\\]+|\\\\.)*\\}          - a matched set of curly braces containing other atoms\n  var placeholder       = /([:*])([\\w\\[\\]]+)|\\{([\\w\\[\\]]+)(?:\\:\\s*((?:[^{}\\\\]+|\\\\.|\\{(?:[^{}\\\\]+|\\\\.)*\\})+))?\\}/g,\n      searchPlaceholder = /([:]?)([\\w\\[\\].-]+)|\\{([\\w\\[\\].-]+)(?:\\:\\s*((?:[^{}\\\\]+|\\\\.|\\{(?:[^{}\\\\]+|\\\\.)*\\})+))?\\}/g,\n      compiled = '^', last = 0, m,\n      segments = this.segments = [],\n      parentParams = parentMatcher ? parentMatcher.params : {},\n      params = this.params = parentMatcher ? parentMatcher.params.$$new() : new $$UMFP.ParamSet(),\n      paramNames = [];\n\n  function addParameter(id, type, config, location) {\n    paramNames.push(id);\n    if (parentParams[id]) return parentParams[id];\n    if (!/^\\w+([-.]+\\w+)*(?:\\[\\])?$/.test(id)) throw new Error(\"Invalid parameter name '\" + id + \"' in pattern '\" + pattern + \"'\");\n    if (params[id]) throw new Error(\"Duplicate parameter name '\" + id + \"' in pattern '\" + pattern + \"'\");\n    params[id] = new $$UMFP.Param(id, type, config, location);\n    return params[id];\n  }\n\n  function quoteRegExp(string, pattern, squash, optional) {\n    var surroundPattern = ['',''], result = string.replace(/[\\\\\\[\\]\\^$*+?.()|{}]/g, \"\\\\$&\");\n    if (!pattern) return result;\n    switch(squash) {\n      case false: surroundPattern = ['(', ')' + (optional ? \"?\" : \"\")]; break;\n      case true:\n        result = result.replace(/\\/$/, '');\n        surroundPattern = ['(?:\\/(', ')|\\/)?'];\n      break;\n      default:    surroundPattern = ['(' + squash + \"|\", ')?']; break;\n    }\n    return result + surroundPattern[0] + pattern + surroundPattern[1];\n  }\n\n  this.source = pattern;\n\n  // Split into static segments separated by path parameter placeholders.\n  // The number of segments is always 1 more than the number of parameters.\n  function matchDetails(m, isSearch) {\n    var id, regexp, segment, type, cfg, arrayMode;\n    id          = m[2] || m[3]; // IE[78] returns '' for unmatched groups instead of null\n    cfg         = config.params[id];\n    segment     = pattern.substring(last, m.index);\n    regexp      = isSearch ? m[4] : m[4] || (m[1] == '*' ? '.*' : null);\n\n    if (regexp) {\n      type      = $$UMFP.type(regexp) || inherit($$UMFP.type(\"string\"), { pattern: new RegExp(regexp, config.caseInsensitive ? 'i' : undefined) });\n    }\n\n    return {\n      id: id, regexp: regexp, segment: segment, type: type, cfg: cfg\n    };\n  }\n\n  var p, param, segment;\n  while ((m = placeholder.exec(pattern))) {\n    p = matchDetails(m, false);\n    if (p.segment.indexOf('?') >= 0) break; // we're into the search part\n\n    param = addParameter(p.id, p.type, p.cfg, \"path\");\n    compiled += quoteRegExp(p.segment, param.type.pattern.source, param.squash, param.isOptional);\n    segments.push(p.segment);\n    last = placeholder.lastIndex;\n  }\n  segment = pattern.substring(last);\n\n  // Find any search parameter names and remove them from the last segment\n  var i = segment.indexOf('?');\n\n  if (i >= 0) {\n    var search = this.sourceSearch = segment.substring(i);\n    segment = segment.substring(0, i);\n    this.sourcePath = pattern.substring(0, last + i);\n\n    if (search.length > 0) {\n      last = 0;\n      while ((m = searchPlaceholder.exec(search))) {\n        p = matchDetails(m, true);\n        param = addParameter(p.id, p.type, p.cfg, \"search\");\n        last = placeholder.lastIndex;\n        // check if ?&\n      }\n    }\n  } else {\n    this.sourcePath = pattern;\n    this.sourceSearch = '';\n  }\n\n  compiled += quoteRegExp(segment) + (config.strict === false ? '\\/?' : '') + '$';\n  segments.push(segment);\n\n  this.regexp = new RegExp(compiled, config.caseInsensitive ? 'i' : undefined);\n  this.prefix = segments[0];\n  this.$$paramNames = paramNames;\n}\n\n/**\n * @ngdoc function\n * @name ui.router.util.type:UrlMatcher#concat\n * @methodOf ui.router.util.type:UrlMatcher\n *\n * @description\n * Returns a new matcher for a pattern constructed by appending the path part and adding the\n * search parameters of the specified pattern to this pattern. The current pattern is not\n * modified. This can be understood as creating a pattern for URLs that are relative to (or\n * suffixes of) the current pattern.\n *\n * @example\n * The following two matchers are equivalent:\n * <pre>\n * new UrlMatcher('/user/{id}?q').concat('/details?date');\n * new UrlMatcher('/user/{id}/details?q&date');\n * </pre>\n *\n * @param {string} pattern  The pattern to append.\n * @param {Object} config  An object hash of the configuration for the matcher.\n * @returns {UrlMatcher}  A matcher for the concatenated pattern.\n */\nUrlMatcher.prototype.concat = function (pattern, config) {\n  // Because order of search parameters is irrelevant, we can add our own search\n  // parameters to the end of the new pattern. Parse the new pattern by itself\n  // and then join the bits together, but it's much easier to do this on a string level.\n  var defaultConfig = {\n    caseInsensitive: $$UMFP.caseInsensitive(),\n    strict: $$UMFP.strictMode(),\n    squash: $$UMFP.defaultSquashPolicy()\n  };\n  return new UrlMatcher(this.sourcePath + pattern + this.sourceSearch, extend(defaultConfig, config), this);\n};\n\nUrlMatcher.prototype.toString = function () {\n  return this.source;\n};\n\n/**\n * @ngdoc function\n * @name ui.router.util.type:UrlMatcher#exec\n * @methodOf ui.router.util.type:UrlMatcher\n *\n * @description\n * Tests the specified path against this matcher, and returns an object containing the captured\n * parameter values, or null if the path does not match. The returned object contains the values\n * of any search parameters that are mentioned in the pattern, but their value may be null if\n * they are not present in `searchParams`. This means that search parameters are always treated\n * as optional.\n *\n * @example\n * <pre>\n * new UrlMatcher('/user/{id}?q&r').exec('/user/bob', {\n *   x: '1', q: 'hello'\n * });\n * // returns { id: 'bob', q: 'hello', r: null }\n * </pre>\n *\n * @param {string} path  The URL path to match, e.g. `$location.path()`.\n * @param {Object} searchParams  URL search parameters, e.g. `$location.search()`.\n * @returns {Object}  The captured parameter values.\n */\nUrlMatcher.prototype.exec = function (path, searchParams) {\n  var m = this.regexp.exec(path);\n  if (!m) return null;\n  searchParams = searchParams || {};\n\n  var paramNames = this.parameters(), nTotal = paramNames.length,\n    nPath = this.segments.length - 1,\n    values = {}, i, j, cfg, paramName;\n\n  if (nPath !== m.length - 1) throw new Error(\"Unbalanced capture group in route '\" + this.source + \"'\");\n\n  function decodePathArray(string) {\n    function reverseString(str) { return str.split(\"\").reverse().join(\"\"); }\n    function unquoteDashes(str) { return str.replace(/\\\\-/g, \"-\"); }\n\n    var split = reverseString(string).split(/-(?!\\\\)/);\n    var allReversed = map(split, reverseString);\n    return map(allReversed, unquoteDashes).reverse();\n  }\n\n  var param, paramVal;\n  for (i = 0; i < nPath; i++) {\n    paramName = paramNames[i];\n    param = this.params[paramName];\n    paramVal = m[i+1];\n    // if the param value matches a pre-replace pair, replace the value before decoding.\n    for (j = 0; j < param.replace.length; j++) {\n      if (param.replace[j].from === paramVal) paramVal = param.replace[j].to;\n    }\n    if (paramVal && param.array === true) paramVal = decodePathArray(paramVal);\n    if (isDefined(paramVal)) paramVal = param.type.decode(paramVal);\n    values[paramName] = param.value(paramVal);\n  }\n  for (/**/; i < nTotal; i++) {\n    paramName = paramNames[i];\n    values[paramName] = this.params[paramName].value(searchParams[paramName]);\n    param = this.params[paramName];\n    paramVal = searchParams[paramName];\n    for (j = 0; j < param.replace.length; j++) {\n      if (param.replace[j].from === paramVal) paramVal = param.replace[j].to;\n    }\n    if (isDefined(paramVal)) paramVal = param.type.decode(paramVal);\n    values[paramName] = param.value(paramVal);\n  }\n\n  return values;\n};\n\n/**\n * @ngdoc function\n * @name ui.router.util.type:UrlMatcher#parameters\n * @methodOf ui.router.util.type:UrlMatcher\n *\n * @description\n * Returns the names of all path and search parameters of this pattern in an unspecified order.\n *\n * @returns {Array.<string>}  An array of parameter names. Must be treated as read-only. If the\n *    pattern has no parameters, an empty array is returned.\n */\nUrlMatcher.prototype.parameters = function (param) {\n  if (!isDefined(param)) return this.$$paramNames;\n  return this.params[param] || null;\n};\n\n/**\n * @ngdoc function\n * @name ui.router.util.type:UrlMatcher#validates\n * @methodOf ui.router.util.type:UrlMatcher\n *\n * @description\n * Checks an object hash of parameters to validate their correctness according to the parameter\n * types of this `UrlMatcher`.\n *\n * @param {Object} params The object hash of parameters to validate.\n * @returns {boolean} Returns `true` if `params` validates, otherwise `false`.\n */\nUrlMatcher.prototype.validates = function (params) {\n  return this.params.$$validates(params);\n};\n\n/**\n * @ngdoc function\n * @name ui.router.util.type:UrlMatcher#format\n * @methodOf ui.router.util.type:UrlMatcher\n *\n * @description\n * Creates a URL that matches this pattern by substituting the specified values\n * for the path and search parameters. Null values for path parameters are\n * treated as empty strings.\n *\n * @example\n * <pre>\n * new UrlMatcher('/user/{id}?q').format({ id:'bob', q:'yes' });\n * // returns '/user/bob?q=yes'\n * </pre>\n *\n * @param {Object} values  the values to substitute for the parameters in this pattern.\n * @returns {string}  the formatted URL (path and optionally search part).\n */\nUrlMatcher.prototype.format = function (values) {\n  values = values || {};\n  var segments = this.segments, params = this.parameters(), paramset = this.params;\n  if (!this.validates(values)) return null;\n\n  var i, search = false, nPath = segments.length - 1, nTotal = params.length, result = segments[0];\n\n  function encodeDashes(str) { // Replace dashes with encoded \"\\-\"\n    return encodeURIComponent(str).replace(/-/g, function(c) { return '%5C%' + c.charCodeAt(0).toString(16).toUpperCase(); });\n  }\n\n  for (i = 0; i < nTotal; i++) {\n    var isPathParam = i < nPath;\n    var name = params[i], param = paramset[name], value = param.value(values[name]);\n    var isDefaultValue = param.isOptional && param.type.equals(param.value(), value);\n    var squash = isDefaultValue ? param.squash : false;\n    var encoded = param.type.encode(value);\n\n    if (isPathParam) {\n      var nextSegment = segments[i + 1];\n      var isFinalPathParam = i + 1 === nPath;\n\n      if (squash === false) {\n        if (encoded != null) {\n          if (isArray(encoded)) {\n            result += map(encoded, encodeDashes).join(\"-\");\n          } else {\n            result += encodeURIComponent(encoded);\n          }\n        }\n        result += nextSegment;\n      } else if (squash === true) {\n        var capture = result.match(/\\/$/) ? /\\/?(.*)/ : /(.*)/;\n        result += nextSegment.match(capture)[1];\n      } else if (isString(squash)) {\n        result += squash + nextSegment;\n      }\n\n      if (isFinalPathParam && param.squash === true && result.slice(-1) === '/') result = result.slice(0, -1);\n    } else {\n      if (encoded == null || (isDefaultValue && squash !== false)) continue;\n      if (!isArray(encoded)) encoded = [ encoded ];\n      if (encoded.length === 0) continue;\n      encoded = map(encoded, encodeURIComponent).join('&' + name + '=');\n      result += (search ? '&' : '?') + (name + '=' + encoded);\n      search = true;\n    }\n  }\n\n  return result;\n};\n\n/**\n * @ngdoc object\n * @name ui.router.util.type:Type\n *\n * @description\n * Implements an interface to define custom parameter types that can be decoded from and encoded to\n * string parameters matched in a URL. Used by {@link ui.router.util.type:UrlMatcher `UrlMatcher`}\n * objects when matching or formatting URLs, or comparing or validating parameter values.\n *\n * See {@link ui.router.util.$urlMatcherFactory#methods_type `$urlMatcherFactory#type()`} for more\n * information on registering custom types.\n *\n * @param {Object} config  A configuration object which contains the custom type definition.  The object's\n *        properties will override the default methods and/or pattern in `Type`'s public interface.\n * @example\n * <pre>\n * {\n *   decode: function(val) { return parseInt(val, 10); },\n *   encode: function(val) { return val && val.toString(); },\n *   equals: function(a, b) { return this.is(a) && a === b; },\n *   is: function(val) { return angular.isNumber(val) isFinite(val) && val % 1 === 0; },\n *   pattern: /\\d+/\n * }\n * </pre>\n *\n * @property {RegExp} pattern The regular expression pattern used to match values of this type when\n *           coming from a substring of a URL.\n *\n * @returns {Object}  Returns a new `Type` object.\n */\nfunction Type(config) {\n  extend(this, config);\n}\n\n/**\n * @ngdoc function\n * @name ui.router.util.type:Type#is\n * @methodOf ui.router.util.type:Type\n *\n * @description\n * Detects whether a value is of a particular type. Accepts a native (decoded) value\n * and determines whether it matches the current `Type` object.\n *\n * @param {*} val  The value to check.\n * @param {string} key  Optional. If the type check is happening in the context of a specific\n *        {@link ui.router.util.type:UrlMatcher `UrlMatcher`} object, this is the name of the\n *        parameter in which `val` is stored. Can be used for meta-programming of `Type` objects.\n * @returns {Boolean}  Returns `true` if the value matches the type, otherwise `false`.\n */\nType.prototype.is = function(val, key) {\n  return true;\n};\n\n/**\n * @ngdoc function\n * @name ui.router.util.type:Type#encode\n * @methodOf ui.router.util.type:Type\n *\n * @description\n * Encodes a custom/native type value to a string that can be embedded in a URL. Note that the\n * return value does *not* need to be URL-safe (i.e. passed through `encodeURIComponent()`), it\n * only needs to be a representation of `val` that has been coerced to a string.\n *\n * @param {*} val  The value to encode.\n * @param {string} key  The name of the parameter in which `val` is stored. Can be used for\n *        meta-programming of `Type` objects.\n * @returns {string}  Returns a string representation of `val` that can be encoded in a URL.\n */\nType.prototype.encode = function(val, key) {\n  return val;\n};\n\n/**\n * @ngdoc function\n * @name ui.router.util.type:Type#decode\n * @methodOf ui.router.util.type:Type\n *\n * @description\n * Converts a parameter value (from URL string or transition param) to a custom/native value.\n *\n * @param {string} val  The URL parameter value to decode.\n * @param {string} key  The name of the parameter in which `val` is stored. Can be used for\n *        meta-programming of `Type` objects.\n * @returns {*}  Returns a custom representation of the URL parameter value.\n */\nType.prototype.decode = function(val, key) {\n  return val;\n};\n\n/**\n * @ngdoc function\n * @name ui.router.util.type:Type#equals\n * @methodOf ui.router.util.type:Type\n *\n * @description\n * Determines whether two decoded values are equivalent.\n *\n * @param {*} a  A value to compare against.\n * @param {*} b  A value to compare against.\n * @returns {Boolean}  Returns `true` if the values are equivalent/equal, otherwise `false`.\n */\nType.prototype.equals = function(a, b) {\n  return a == b;\n};\n\nType.prototype.$subPattern = function() {\n  var sub = this.pattern.toString();\n  return sub.substr(1, sub.length - 2);\n};\n\nType.prototype.pattern = /.*/;\n\nType.prototype.toString = function() { return \"{Type:\" + this.name + \"}\"; };\n\n/** Given an encoded string, or a decoded object, returns a decoded object */\nType.prototype.$normalize = function(val) {\n  return this.is(val) ? val : this.decode(val);\n};\n\n/*\n * Wraps an existing custom Type as an array of Type, depending on 'mode'.\n * e.g.:\n * - urlmatcher pattern \"/path?{queryParam[]:int}\"\n * - url: \"/path?queryParam=1&queryParam=2\n * - $stateParams.queryParam will be [1, 2]\n * if `mode` is \"auto\", then\n * - url: \"/path?queryParam=1 will create $stateParams.queryParam: 1\n * - url: \"/path?queryParam=1&queryParam=2 will create $stateParams.queryParam: [1, 2]\n */\nType.prototype.$asArray = function(mode, isSearch) {\n  if (!mode) return this;\n  if (mode === \"auto\" && !isSearch) throw new Error(\"'auto' array mode is for query parameters only\");\n\n  function ArrayType(type, mode) {\n    function bindTo(type, callbackName) {\n      return function() {\n        return type[callbackName].apply(type, arguments);\n      };\n    }\n\n    // Wrap non-array value as array\n    function arrayWrap(val) { return isArray(val) ? val : (isDefined(val) ? [ val ] : []); }\n    // Unwrap array value for \"auto\" mode. Return undefined for empty array.\n    function arrayUnwrap(val) {\n      switch(val.length) {\n        case 0: return undefined;\n        case 1: return mode === \"auto\" ? val[0] : val;\n        default: return val;\n      }\n    }\n    function falsey(val) { return !val; }\n\n    // Wraps type (.is/.encode/.decode) functions to operate on each value of an array\n    function arrayHandler(callback, allTruthyMode) {\n      return function handleArray(val) {\n        if (isArray(val) && val.length === 0) return val;\n        val = arrayWrap(val);\n        var result = map(val, callback);\n        if (allTruthyMode === true)\n          return filter(result, falsey).length === 0;\n        return arrayUnwrap(result);\n      };\n    }\n\n    // Wraps type (.equals) functions to operate on each value of an array\n    function arrayEqualsHandler(callback) {\n      return function handleArray(val1, val2) {\n        var left = arrayWrap(val1), right = arrayWrap(val2);\n        if (left.length !== right.length) return false;\n        for (var i = 0; i < left.length; i++) {\n          if (!callback(left[i], right[i])) return false;\n        }\n        return true;\n      };\n    }\n\n    this.encode = arrayHandler(bindTo(type, 'encode'));\n    this.decode = arrayHandler(bindTo(type, 'decode'));\n    this.is     = arrayHandler(bindTo(type, 'is'), true);\n    this.equals = arrayEqualsHandler(bindTo(type, 'equals'));\n    this.pattern = type.pattern;\n    this.$normalize = arrayHandler(bindTo(type, '$normalize'));\n    this.name = type.name;\n    this.$arrayMode = mode;\n  }\n\n  return new ArrayType(this, mode);\n};\n\n\n\n/**\n * @ngdoc object\n * @name ui.router.util.$urlMatcherFactory\n *\n * @description\n * Factory for {@link ui.router.util.type:UrlMatcher `UrlMatcher`} instances. The factory\n * is also available to providers under the name `$urlMatcherFactoryProvider`.\n */\nfunction $UrlMatcherFactory() {\n  $$UMFP = this;\n\n  var isCaseInsensitive = false, isStrictMode = true, defaultSquashPolicy = false;\n\n  // Use tildes to pre-encode slashes.\n  // If the slashes are simply URLEncoded, the browser can choose to pre-decode them,\n  // and bidirectional encoding/decoding fails.\n  // Tilde was chosen because it's not a RFC 3986 section 2.2 Reserved Character\n  function valToString(val) { return val != null ? val.toString().replace(/(~|\\/)/g, function (m) { return {'~':'~~', '/':'~2F'}[m]; }) : val; }\n  function valFromString(val) { return val != null ? val.toString().replace(/(~~|~2F)/g, function (m) { return {'~~':'~', '~2F':'/'}[m]; }) : val; }\n\n  var $types = {}, enqueue = true, typeQueue = [], injector, defaultTypes = {\n    \"string\": {\n      encode: valToString,\n      decode: valFromString,\n      // TODO: in 1.0, make string .is() return false if value is undefined/null by default.\n      // In 0.2.x, string params are optional by default for backwards compat\n      is: function(val) { return val == null || !isDefined(val) || typeof val === \"string\"; },\n      pattern: /[^/]*/\n    },\n    \"int\": {\n      encode: valToString,\n      decode: function(val) { return parseInt(val, 10); },\n      is: function(val) { return isDefined(val) && this.decode(val.toString()) === val; },\n      pattern: /\\d+/\n    },\n    \"bool\": {\n      encode: function(val) { return val ? 1 : 0; },\n      decode: function(val) { return parseInt(val, 10) !== 0; },\n      is: function(val) { return val === true || val === false; },\n      pattern: /0|1/\n    },\n    \"date\": {\n      encode: function (val) {\n        if (!this.is(val))\n          return undefined;\n        return [ val.getFullYear(),\n          ('0' + (val.getMonth() + 1)).slice(-2),\n          ('0' + val.getDate()).slice(-2)\n        ].join(\"-\");\n      },\n      decode: function (val) {\n        if (this.is(val)) return val;\n        var match = this.capture.exec(val);\n        return match ? new Date(match[1], match[2] - 1, match[3]) : undefined;\n      },\n      is: function(val) { return val instanceof Date && !isNaN(val.valueOf()); },\n      equals: function (a, b) { return this.is(a) && this.is(b) && a.toISOString() === b.toISOString(); },\n      pattern: /[0-9]{4}-(?:0[1-9]|1[0-2])-(?:0[1-9]|[1-2][0-9]|3[0-1])/,\n      capture: /([0-9]{4})-(0[1-9]|1[0-2])-(0[1-9]|[1-2][0-9]|3[0-1])/\n    },\n    \"json\": {\n      encode: angular.toJson,\n      decode: angular.fromJson,\n      is: angular.isObject,\n      equals: angular.equals,\n      pattern: /[^/]*/\n    },\n    \"any\": { // does not encode/decode\n      encode: angular.identity,\n      decode: angular.identity,\n      equals: angular.equals,\n      pattern: /.*/\n    }\n  };\n\n  function getDefaultConfig() {\n    return {\n      strict: isStrictMode,\n      caseInsensitive: isCaseInsensitive\n    };\n  }\n\n  function isInjectable(value) {\n    return (isFunction(value) || (isArray(value) && isFunction(value[value.length - 1])));\n  }\n\n  /**\n   * [Internal] Get the default value of a parameter, which may be an injectable function.\n   */\n  $UrlMatcherFactory.$$getDefaultValue = function(config) {\n    if (!isInjectable(config.value)) return config.value;\n    if (!injector) throw new Error(\"Injectable functions cannot be called at configuration time\");\n    return injector.invoke(config.value);\n  };\n\n  /**\n   * @ngdoc function\n   * @name ui.router.util.$urlMatcherFactory#caseInsensitive\n   * @methodOf ui.router.util.$urlMatcherFactory\n   *\n   * @description\n   * Defines whether URL matching should be case sensitive (the default behavior), or not.\n   *\n   * @param {boolean} value `false` to match URL in a case sensitive manner; otherwise `true`;\n   * @returns {boolean} the current value of caseInsensitive\n   */\n  this.caseInsensitive = function(value) {\n    if (isDefined(value))\n      isCaseInsensitive = value;\n    return isCaseInsensitive;\n  };\n\n  /**\n   * @ngdoc function\n   * @name ui.router.util.$urlMatcherFactory#strictMode\n   * @methodOf ui.router.util.$urlMatcherFactory\n   *\n   * @description\n   * Defines whether URLs should match trailing slashes, or not (the default behavior).\n   *\n   * @param {boolean=} value `false` to match trailing slashes in URLs, otherwise `true`.\n   * @returns {boolean} the current value of strictMode\n   */\n  this.strictMode = function(value) {\n    if (isDefined(value))\n      isStrictMode = value;\n    return isStrictMode;\n  };\n\n  /**\n   * @ngdoc function\n   * @name ui.router.util.$urlMatcherFactory#defaultSquashPolicy\n   * @methodOf ui.router.util.$urlMatcherFactory\n   *\n   * @description\n   * Sets the default behavior when generating or matching URLs with default parameter values.\n   *\n   * @param {string} value A string that defines the default parameter URL squashing behavior.\n   *    `nosquash`: When generating an href with a default parameter value, do not squash the parameter value from the URL\n   *    `slash`: When generating an href with a default parameter value, squash (remove) the parameter value, and, if the\n   *             parameter is surrounded by slashes, squash (remove) one slash from the URL\n   *    any other string, e.g. \"~\": When generating an href with a default parameter value, squash (remove)\n   *             the parameter value from the URL and replace it with this string.\n   */\n  this.defaultSquashPolicy = function(value) {\n    if (!isDefined(value)) return defaultSquashPolicy;\n    if (value !== true && value !== false && !isString(value))\n      throw new Error(\"Invalid squash policy: \" + value + \". Valid policies: false, true, arbitrary-string\");\n    defaultSquashPolicy = value;\n    return value;\n  };\n\n  /**\n   * @ngdoc function\n   * @name ui.router.util.$urlMatcherFactory#compile\n   * @methodOf ui.router.util.$urlMatcherFactory\n   *\n   * @description\n   * Creates a {@link ui.router.util.type:UrlMatcher `UrlMatcher`} for the specified pattern.\n   *\n   * @param {string} pattern  The URL pattern.\n   * @param {Object} config  The config object hash.\n   * @returns {UrlMatcher}  The UrlMatcher.\n   */\n  this.compile = function (pattern, config) {\n    return new UrlMatcher(pattern, extend(getDefaultConfig(), config));\n  };\n\n  /**\n   * @ngdoc function\n   * @name ui.router.util.$urlMatcherFactory#isMatcher\n   * @methodOf ui.router.util.$urlMatcherFactory\n   *\n   * @description\n   * Returns true if the specified object is a `UrlMatcher`, or false otherwise.\n   *\n   * @param {Object} object  The object to perform the type check against.\n   * @returns {Boolean}  Returns `true` if the object matches the `UrlMatcher` interface, by\n   *          implementing all the same methods.\n   */\n  this.isMatcher = function (o) {\n    if (!isObject(o)) return false;\n    var result = true;\n\n    forEach(UrlMatcher.prototype, function(val, name) {\n      if (isFunction(val)) {\n        result = result && (isDefined(o[name]) && isFunction(o[name]));\n      }\n    });\n    return result;\n  };\n\n  /**\n   * @ngdoc function\n   * @name ui.router.util.$urlMatcherFactory#type\n   * @methodOf ui.router.util.$urlMatcherFactory\n   *\n   * @description\n   * Registers a custom {@link ui.router.util.type:Type `Type`} object that can be used to\n   * generate URLs with typed parameters.\n   *\n   * @param {string} name  The type name.\n   * @param {Object|Function} definition   The type definition. See\n   *        {@link ui.router.util.type:Type `Type`} for information on the values accepted.\n   * @param {Object|Function} definitionFn (optional) A function that is injected before the app\n   *        runtime starts.  The result of this function is merged into the existing `definition`.\n   *        See {@link ui.router.util.type:Type `Type`} for information on the values accepted.\n   *\n   * @returns {Object}  Returns `$urlMatcherFactoryProvider`.\n   *\n   * @example\n   * This is a simple example of a custom type that encodes and decodes items from an\n   * array, using the array index as the URL-encoded value:\n   *\n   * <pre>\n   * var list = ['John', 'Paul', 'George', 'Ringo'];\n   *\n   * $urlMatcherFactoryProvider.type('listItem', {\n   *   encode: function(item) {\n   *     // Represent the list item in the URL using its corresponding index\n   *     return list.indexOf(item);\n   *   },\n   *   decode: function(item) {\n   *     // Look up the list item by index\n   *     return list[parseInt(item, 10)];\n   *   },\n   *   is: function(item) {\n   *     // Ensure the item is valid by checking to see that it appears\n   *     // in the list\n   *     return list.indexOf(item) > -1;\n   *   }\n   * });\n   *\n   * $stateProvider.state('list', {\n   *   url: \"/list/{item:listItem}\",\n   *   controller: function($scope, $stateParams) {\n   *     console.log($stateParams.item);\n   *   }\n   * });\n   *\n   * // ...\n   *\n   * // Changes URL to '/list/3', logs \"Ringo\" to the console\n   * $state.go('list', { item: \"Ringo\" });\n   * </pre>\n   *\n   * This is a more complex example of a type that relies on dependency injection to\n   * interact with services, and uses the parameter name from the URL to infer how to\n   * handle encoding and decoding parameter values:\n   *\n   * <pre>\n   * // Defines a custom type that gets a value from a service,\n   * // where each service gets different types of values from\n   * // a backend API:\n   * $urlMatcherFactoryProvider.type('dbObject', {}, function(Users, Posts) {\n   *\n   *   // Matches up services to URL parameter names\n   *   var services = {\n   *     user: Users,\n   *     post: Posts\n   *   };\n   *\n   *   return {\n   *     encode: function(object) {\n   *       // Represent the object in the URL using its unique ID\n   *       return object.id;\n   *     },\n   *     decode: function(value, key) {\n   *       // Look up the object by ID, using the parameter\n   *       // name (key) to call the correct service\n   *       return services[key].findById(value);\n   *     },\n   *     is: function(object, key) {\n   *       // Check that object is a valid dbObject\n   *       return angular.isObject(object) && object.id && services[key];\n   *     }\n   *     equals: function(a, b) {\n   *       // Check the equality of decoded objects by comparing\n   *       // their unique IDs\n   *       return a.id === b.id;\n   *     }\n   *   };\n   * });\n   *\n   * // In a config() block, you can then attach URLs with\n   * // type-annotated parameters:\n   * $stateProvider.state('users', {\n   *   url: \"/users\",\n   *   // ...\n   * }).state('users.item', {\n   *   url: \"/{user:dbObject}\",\n   *   controller: function($scope, $stateParams) {\n   *     // $stateParams.user will now be an object returned from\n   *     // the Users service\n   *   },\n   *   // ...\n   * });\n   * </pre>\n   */\n  this.type = function (name, definition, definitionFn) {\n    if (!isDefined(definition)) return $types[name];\n    if ($types.hasOwnProperty(name)) throw new Error(\"A type named '\" + name + \"' has already been defined.\");\n\n    $types[name] = new Type(extend({ name: name }, definition));\n    if (definitionFn) {\n      typeQueue.push({ name: name, def: definitionFn });\n      if (!enqueue) flushTypeQueue();\n    }\n    return this;\n  };\n\n  // `flushTypeQueue()` waits until `$urlMatcherFactory` is injected before invoking the queued `definitionFn`s\n  function flushTypeQueue() {\n    while(typeQueue.length) {\n      var type = typeQueue.shift();\n      if (type.pattern) throw new Error(\"You cannot override a type's .pattern at runtime.\");\n      angular.extend($types[type.name], injector.invoke(type.def));\n    }\n  }\n\n  // Register default types. Store them in the prototype of $types.\n  forEach(defaultTypes, function(type, name) { $types[name] = new Type(extend({name: name}, type)); });\n  $types = inherit($types, {});\n\n  /* No need to document $get, since it returns this */\n  this.$get = ['$injector', function ($injector) {\n    injector = $injector;\n    enqueue = false;\n    flushTypeQueue();\n\n    forEach(defaultTypes, function(type, name) {\n      if (!$types[name]) $types[name] = new Type(type);\n    });\n    return this;\n  }];\n\n  this.Param = function Param(id, type, config, location) {\n    var self = this;\n    config = unwrapShorthand(config);\n    type = getType(config, type, location);\n    var arrayMode = getArrayMode();\n    type = arrayMode ? type.$asArray(arrayMode, location === \"search\") : type;\n    if (type.name === \"string\" && !arrayMode && location === \"path\" && config.value === undefined)\n      config.value = \"\"; // for 0.2.x; in 0.3.0+ do not automatically default to \"\"\n    var isOptional = config.value !== undefined;\n    var squash = getSquashPolicy(config, isOptional);\n    var replace = getReplace(config, arrayMode, isOptional, squash);\n\n    function unwrapShorthand(config) {\n      var keys = isObject(config) ? objectKeys(config) : [];\n      var isShorthand = indexOf(keys, \"value\") === -1 && indexOf(keys, \"type\") === -1 &&\n                        indexOf(keys, \"squash\") === -1 && indexOf(keys, \"array\") === -1;\n      if (isShorthand) config = { value: config };\n      config.$$fn = isInjectable(config.value) ? config.value : function () { return config.value; };\n      return config;\n    }\n\n    function getType(config, urlType, location) {\n      if (config.type && urlType) throw new Error(\"Param '\"+id+\"' has two type configurations.\");\n      if (urlType) return urlType;\n      if (!config.type) return (location === \"config\" ? $types.any : $types.string);\n\n      if (angular.isString(config.type))\n        return $types[config.type];\n      if (config.type instanceof Type)\n        return config.type;\n      return new Type(config.type);\n    }\n\n    // array config: param name (param[]) overrides default settings.  explicit config overrides param name.\n    function getArrayMode() {\n      var arrayDefaults = { array: (location === \"search\" ? \"auto\" : false) };\n      var arrayParamNomenclature = id.match(/\\[\\]$/) ? { array: true } : {};\n      return extend(arrayDefaults, arrayParamNomenclature, config).array;\n    }\n\n    /**\n     * returns false, true, or the squash value to indicate the \"default parameter url squash policy\".\n     */\n    function getSquashPolicy(config, isOptional) {\n      var squash = config.squash;\n      if (!isOptional || squash === false) return false;\n      if (!isDefined(squash) || squash == null) return defaultSquashPolicy;\n      if (squash === true || isString(squash)) return squash;\n      throw new Error(\"Invalid squash policy: '\" + squash + \"'. Valid policies: false, true, or arbitrary string\");\n    }\n\n    function getReplace(config, arrayMode, isOptional, squash) {\n      var replace, configuredKeys, defaultPolicy = [\n        { from: \"\",   to: (isOptional || arrayMode ? undefined : \"\") },\n        { from: null, to: (isOptional || arrayMode ? undefined : \"\") }\n      ];\n      replace = isArray(config.replace) ? config.replace : [];\n      if (isString(squash))\n        replace.push({ from: squash, to: undefined });\n      configuredKeys = map(replace, function(item) { return item.from; } );\n      return filter(defaultPolicy, function(item) { return indexOf(configuredKeys, item.from) === -1; }).concat(replace);\n    }\n\n    /**\n     * [Internal] Get the default value of a parameter, which may be an injectable function.\n     */\n    function $$getDefaultValue() {\n      if (!injector) throw new Error(\"Injectable functions cannot be called at configuration time\");\n      var defaultValue = injector.invoke(config.$$fn);\n      if (defaultValue !== null && defaultValue !== undefined && !self.type.is(defaultValue))\n        throw new Error(\"Default value (\" + defaultValue + \") for parameter '\" + self.id + \"' is not an instance of Type (\" + self.type.name + \")\");\n      return defaultValue;\n    }\n\n    /**\n     * [Internal] Gets the decoded representation of a value if the value is defined, otherwise, returns the\n     * default value, which may be the result of an injectable function.\n     */\n    function $value(value) {\n      function hasReplaceVal(val) { return function(obj) { return obj.from === val; }; }\n      function $replace(value) {\n        var replacement = map(filter(self.replace, hasReplaceVal(value)), function(obj) { return obj.to; });\n        return replacement.length ? replacement[0] : value;\n      }\n      value = $replace(value);\n      return !isDefined(value) ? $$getDefaultValue() : self.type.$normalize(value);\n    }\n\n    function toString() { return \"{Param:\" + id + \" \" + type + \" squash: '\" + squash + \"' optional: \" + isOptional + \"}\"; }\n\n    extend(this, {\n      id: id,\n      type: type,\n      location: location,\n      array: arrayMode,\n      squash: squash,\n      replace: replace,\n      isOptional: isOptional,\n      value: $value,\n      dynamic: undefined,\n      config: config,\n      toString: toString\n    });\n  };\n\n  function ParamSet(params) {\n    extend(this, params || {});\n  }\n\n  ParamSet.prototype = {\n    $$new: function() {\n      return inherit(this, extend(new ParamSet(), { $$parent: this}));\n    },\n    $$keys: function () {\n      var keys = [], chain = [], parent = this,\n        ignore = objectKeys(ParamSet.prototype);\n      while (parent) { chain.push(parent); parent = parent.$$parent; }\n      chain.reverse();\n      forEach(chain, function(paramset) {\n        forEach(objectKeys(paramset), function(key) {\n            if (indexOf(keys, key) === -1 && indexOf(ignore, key) === -1) keys.push(key);\n        });\n      });\n      return keys;\n    },\n    $$values: function(paramValues) {\n      var values = {}, self = this;\n      forEach(self.$$keys(), function(key) {\n        values[key] = self[key].value(paramValues && paramValues[key]);\n      });\n      return values;\n    },\n    $$equals: function(paramValues1, paramValues2) {\n      var equal = true, self = this;\n      forEach(self.$$keys(), function(key) {\n        var left = paramValues1 && paramValues1[key], right = paramValues2 && paramValues2[key];\n        if (!self[key].type.equals(left, right)) equal = false;\n      });\n      return equal;\n    },\n    $$validates: function $$validate(paramValues) {\n      var keys = this.$$keys(), i, param, rawVal, normalized, encoded;\n      for (i = 0; i < keys.length; i++) {\n        param = this[keys[i]];\n        rawVal = paramValues[keys[i]];\n        if ((rawVal === undefined || rawVal === null) && param.isOptional)\n          break; // There was no parameter value, but the param is optional\n        normalized = param.type.$normalize(rawVal);\n        if (!param.type.is(normalized))\n          return false; // The value was not of the correct Type, and could not be decoded to the correct Type\n        encoded = param.type.encode(normalized);\n        if (angular.isString(encoded) && !param.type.pattern.exec(encoded))\n          return false; // The value was of the correct type, but when encoded, did not match the Type's regexp\n      }\n      return true;\n    },\n    $$parent: undefined\n  };\n\n  this.ParamSet = ParamSet;\n}\n\n// Register as a provider so it's available to other providers\nangular.module('ui.router.util').provider('$urlMatcherFactory', $UrlMatcherFactory);\nangular.module('ui.router.util').run(['$urlMatcherFactory', function($urlMatcherFactory) { }]);\n\n/**\n * @ngdoc object\n * @name ui.router.router.$urlRouterProvider\n *\n * @requires ui.router.util.$urlMatcherFactoryProvider\n * @requires $locationProvider\n *\n * @description\n * `$urlRouterProvider` has the responsibility of watching `$location`. \n * When `$location` changes it runs through a list of rules one by one until a \n * match is found. `$urlRouterProvider` is used behind the scenes anytime you specify \n * a url in a state configuration. All urls are compiled into a UrlMatcher object.\n *\n * There are several methods on `$urlRouterProvider` that make it useful to use directly\n * in your module config.\n */\n$UrlRouterProvider.$inject = ['$locationProvider', '$urlMatcherFactoryProvider'];\nfunction $UrlRouterProvider(   $locationProvider,   $urlMatcherFactory) {\n  var rules = [], otherwise = null, interceptDeferred = false, listener;\n\n  // Returns a string that is a prefix of all strings matching the RegExp\n  function regExpPrefix(re) {\n    var prefix = /^\\^((?:\\\\[^a-zA-Z0-9]|[^\\\\\\[\\]\\^$*+?.()|{}]+)*)/.exec(re.source);\n    return (prefix != null) ? prefix[1].replace(/\\\\(.)/g, \"$1\") : '';\n  }\n\n  // Interpolates matched values into a String.replace()-style pattern\n  function interpolate(pattern, match) {\n    return pattern.replace(/\\$(\\$|\\d{1,2})/, function (m, what) {\n      return match[what === '$' ? 0 : Number(what)];\n    });\n  }\n\n  /**\n   * @ngdoc function\n   * @name ui.router.router.$urlRouterProvider#rule\n   * @methodOf ui.router.router.$urlRouterProvider\n   *\n   * @description\n   * Defines rules that are used by `$urlRouterProvider` to find matches for\n   * specific URLs.\n   *\n   * @example\n   * <pre>\n   * var app = angular.module('app', ['ui.router.router']);\n   *\n   * app.config(function ($urlRouterProvider) {\n   *   // Here's an example of how you might allow case insensitive urls\n   *   $urlRouterProvider.rule(function ($injector, $location) {\n   *     var path = $location.path(),\n   *         normalized = path.toLowerCase();\n   *\n   *     if (path !== normalized) {\n   *       return normalized;\n   *     }\n   *   });\n   * });\n   * </pre>\n   *\n   * @param {function} rule Handler function that takes `$injector` and `$location`\n   * services as arguments. You can use them to return a valid path as a string.\n   *\n   * @return {object} `$urlRouterProvider` - `$urlRouterProvider` instance\n   */\n  this.rule = function (rule) {\n    if (!isFunction(rule)) throw new Error(\"'rule' must be a function\");\n    rules.push(rule);\n    return this;\n  };\n\n  /**\n   * @ngdoc object\n   * @name ui.router.router.$urlRouterProvider#otherwise\n   * @methodOf ui.router.router.$urlRouterProvider\n   *\n   * @description\n   * Defines a path that is used when an invalid route is requested.\n   *\n   * @example\n   * <pre>\n   * var app = angular.module('app', ['ui.router.router']);\n   *\n   * app.config(function ($urlRouterProvider) {\n   *   // if the path doesn't match any of the urls you configured\n   *   // otherwise will take care of routing the user to the\n   *   // specified url\n   *   $urlRouterProvider.otherwise('/index');\n   *\n   *   // Example of using function rule as param\n   *   $urlRouterProvider.otherwise(function ($injector, $location) {\n   *     return '/a/valid/url';\n   *   });\n   * });\n   * </pre>\n   *\n   * @param {string|function} rule The url path you want to redirect to or a function \n   * rule that returns the url path. The function version is passed two params: \n   * `$injector` and `$location` services, and must return a url string.\n   *\n   * @return {object} `$urlRouterProvider` - `$urlRouterProvider` instance\n   */\n  this.otherwise = function (rule) {\n    if (isString(rule)) {\n      var redirect = rule;\n      rule = function () { return redirect; };\n    }\n    else if (!isFunction(rule)) throw new Error(\"'rule' must be a function\");\n    otherwise = rule;\n    return this;\n  };\n\n\n  function handleIfMatch($injector, handler, match) {\n    if (!match) return false;\n    var result = $injector.invoke(handler, handler, { $match: match });\n    return isDefined(result) ? result : true;\n  }\n\n  /**\n   * @ngdoc function\n   * @name ui.router.router.$urlRouterProvider#when\n   * @methodOf ui.router.router.$urlRouterProvider\n   *\n   * @description\n   * Registers a handler for a given url matching. \n   * \n   * If the handler is a string, it is\n   * treated as a redirect, and is interpolated according to the syntax of match\n   * (i.e. like `String.replace()` for `RegExp`, or like a `UrlMatcher` pattern otherwise).\n   *\n   * If the handler is a function, it is injectable. It gets invoked if `$location`\n   * matches. You have the option of inject the match object as `$match`.\n   *\n   * The handler can return\n   *\n   * - **falsy** to indicate that the rule didn't match after all, then `$urlRouter`\n   *   will continue trying to find another one that matches.\n   * - **string** which is treated as a redirect and passed to `$location.url()`\n   * - **void** or any **truthy** value tells `$urlRouter` that the url was handled.\n   *\n   * @example\n   * <pre>\n   * var app = angular.module('app', ['ui.router.router']);\n   *\n   * app.config(function ($urlRouterProvider) {\n   *   $urlRouterProvider.when($state.url, function ($match, $stateParams) {\n   *     if ($state.$current.navigable !== state ||\n   *         !equalForKeys($match, $stateParams) {\n   *      $state.transitionTo(state, $match, false);\n   *     }\n   *   });\n   * });\n   * </pre>\n   *\n   * @param {string|object} what The incoming path that you want to redirect.\n   * @param {string|function} handler The path you want to redirect your user to.\n   */\n  this.when = function (what, handler) {\n    var redirect, handlerIsString = isString(handler);\n    if (isString(what)) what = $urlMatcherFactory.compile(what);\n\n    if (!handlerIsString && !isFunction(handler) && !isArray(handler))\n      throw new Error(\"invalid 'handler' in when()\");\n\n    var strategies = {\n      matcher: function (what, handler) {\n        if (handlerIsString) {\n          redirect = $urlMatcherFactory.compile(handler);\n          handler = ['$match', function ($match) { return redirect.format($match); }];\n        }\n        return extend(function ($injector, $location) {\n          return handleIfMatch($injector, handler, what.exec($location.path(), $location.search()));\n        }, {\n          prefix: isString(what.prefix) ? what.prefix : ''\n        });\n      },\n      regex: function (what, handler) {\n        if (what.global || what.sticky) throw new Error(\"when() RegExp must not be global or sticky\");\n\n        if (handlerIsString) {\n          redirect = handler;\n          handler = ['$match', function ($match) { return interpolate(redirect, $match); }];\n        }\n        return extend(function ($injector, $location) {\n          return handleIfMatch($injector, handler, what.exec($location.path()));\n        }, {\n          prefix: regExpPrefix(what)\n        });\n      }\n    };\n\n    var check = { matcher: $urlMatcherFactory.isMatcher(what), regex: what instanceof RegExp };\n\n    for (var n in check) {\n      if (check[n]) return this.rule(strategies[n](what, handler));\n    }\n\n    throw new Error(\"invalid 'what' in when()\");\n  };\n\n  /**\n   * @ngdoc function\n   * @name ui.router.router.$urlRouterProvider#deferIntercept\n   * @methodOf ui.router.router.$urlRouterProvider\n   *\n   * @description\n   * Disables (or enables) deferring location change interception.\n   *\n   * If you wish to customize the behavior of syncing the URL (for example, if you wish to\n   * defer a transition but maintain the current URL), call this method at configuration time.\n   * Then, at run time, call `$urlRouter.listen()` after you have configured your own\n   * `$locationChangeSuccess` event handler.\n   *\n   * @example\n   * <pre>\n   * var app = angular.module('app', ['ui.router.router']);\n   *\n   * app.config(function ($urlRouterProvider) {\n   *\n   *   // Prevent $urlRouter from automatically intercepting URL changes;\n   *   // this allows you to configure custom behavior in between\n   *   // location changes and route synchronization:\n   *   $urlRouterProvider.deferIntercept();\n   *\n   * }).run(function ($rootScope, $urlRouter, UserService) {\n   *\n   *   $rootScope.$on('$locationChangeSuccess', function(e) {\n   *     // UserService is an example service for managing user state\n   *     if (UserService.isLoggedIn()) return;\n   *\n   *     // Prevent $urlRouter's default handler from firing\n   *     e.preventDefault();\n   *\n   *     UserService.handleLogin().then(function() {\n   *       // Once the user has logged in, sync the current URL\n   *       // to the router:\n   *       $urlRouter.sync();\n   *     });\n   *   });\n   *\n   *   // Configures $urlRouter's listener *after* your custom listener\n   *   $urlRouter.listen();\n   * });\n   * </pre>\n   *\n   * @param {boolean} defer Indicates whether to defer location change interception. Passing\n            no parameter is equivalent to `true`.\n   */\n  this.deferIntercept = function (defer) {\n    if (defer === undefined) defer = true;\n    interceptDeferred = defer;\n  };\n\n  /**\n   * @ngdoc object\n   * @name ui.router.router.$urlRouter\n   *\n   * @requires $location\n   * @requires $rootScope\n   * @requires $injector\n   * @requires $browser\n   *\n   * @description\n   *\n   */\n  this.$get = $get;\n  $get.$inject = ['$location', '$rootScope', '$injector', '$browser', '$sniffer'];\n  function $get(   $location,   $rootScope,   $injector,   $browser,   $sniffer) {\n\n    var baseHref = $browser.baseHref(), location = $location.url(), lastPushedUrl;\n\n    function appendBasePath(url, isHtml5, absolute) {\n      if (baseHref === '/') return url;\n      if (isHtml5) return baseHref.slice(0, -1) + url;\n      if (absolute) return baseHref.slice(1) + url;\n      return url;\n    }\n\n    // TODO: Optimize groups of rules with non-empty prefix into some sort of decision tree\n    function update(evt) {\n      if (evt && evt.defaultPrevented) return;\n      var ignoreUpdate = lastPushedUrl && $location.url() === lastPushedUrl;\n      lastPushedUrl = undefined;\n      // TODO: Re-implement this in 1.0 for https://github.com/angular-ui/ui-router/issues/1573\n      //if (ignoreUpdate) return true;\n\n      function check(rule) {\n        var handled = rule($injector, $location);\n\n        if (!handled) return false;\n        if (isString(handled)) $location.replace().url(handled);\n        return true;\n      }\n      var n = rules.length, i;\n\n      for (i = 0; i < n; i++) {\n        if (check(rules[i])) return;\n      }\n      // always check otherwise last to allow dynamic updates to the set of rules\n      if (otherwise) check(otherwise);\n    }\n\n    function listen() {\n      listener = listener || $rootScope.$on('$locationChangeSuccess', update);\n      return listener;\n    }\n\n    if (!interceptDeferred) listen();\n\n    return {\n      /**\n       * @ngdoc function\n       * @name ui.router.router.$urlRouter#sync\n       * @methodOf ui.router.router.$urlRouter\n       *\n       * @description\n       * Triggers an update; the same update that happens when the address bar url changes, aka `$locationChangeSuccess`.\n       * This method is useful when you need to use `preventDefault()` on the `$locationChangeSuccess` event,\n       * perform some custom logic (route protection, auth, config, redirection, etc) and then finally proceed\n       * with the transition by calling `$urlRouter.sync()`.\n       *\n       * @example\n       * <pre>\n       * angular.module('app', ['ui.router'])\n       *   .run(function($rootScope, $urlRouter) {\n       *     $rootScope.$on('$locationChangeSuccess', function(evt) {\n       *       // Halt state change from even starting\n       *       evt.preventDefault();\n       *       // Perform custom logic\n       *       var meetsRequirement = ...\n       *       // Continue with the update and state transition if logic allows\n       *       if (meetsRequirement) $urlRouter.sync();\n       *     });\n       * });\n       * </pre>\n       */\n      sync: function() {\n        update();\n      },\n\n      listen: function() {\n        return listen();\n      },\n\n      update: function(read) {\n        if (read) {\n          location = $location.url();\n          return;\n        }\n        if ($location.url() === location) return;\n\n        $location.url(location);\n        $location.replace();\n      },\n\n      push: function(urlMatcher, params, options) {\n         var url = urlMatcher.format(params || {});\n\n        // Handle the special hash param, if needed\n        if (url !== null && params && params['#']) {\n            url += '#' + params['#'];\n        }\n\n        $location.url(url);\n        lastPushedUrl = options && options.$$avoidResync ? $location.url() : undefined;\n        if (options && options.replace) $location.replace();\n      },\n\n      /**\n       * @ngdoc function\n       * @name ui.router.router.$urlRouter#href\n       * @methodOf ui.router.router.$urlRouter\n       *\n       * @description\n       * A URL generation method that returns the compiled URL for a given\n       * {@link ui.router.util.type:UrlMatcher `UrlMatcher`}, populated with the provided parameters.\n       *\n       * @example\n       * <pre>\n       * $bob = $urlRouter.href(new UrlMatcher(\"/about/:person\"), {\n       *   person: \"bob\"\n       * });\n       * // $bob == \"/about/bob\";\n       * </pre>\n       *\n       * @param {UrlMatcher} urlMatcher The `UrlMatcher` object which is used as the template of the URL to generate.\n       * @param {object=} params An object of parameter values to fill the matcher's required parameters.\n       * @param {object=} options Options object. The options are:\n       *\n       * - **`absolute`** - {boolean=false},  If true will generate an absolute url, e.g. \"http://www.example.com/fullurl\".\n       *\n       * @returns {string} Returns the fully compiled URL, or `null` if `params` fail validation against `urlMatcher`\n       */\n      href: function(urlMatcher, params, options) {\n        if (!urlMatcher.validates(params)) return null;\n\n        var isHtml5 = $locationProvider.html5Mode();\n        if (angular.isObject(isHtml5)) {\n          isHtml5 = isHtml5.enabled;\n        }\n\n        isHtml5 = isHtml5 && $sniffer.history;\n        \n        var url = urlMatcher.format(params);\n        options = options || {};\n\n        if (!isHtml5 && url !== null) {\n          url = \"#\" + $locationProvider.hashPrefix() + url;\n        }\n\n        // Handle special hash param, if needed\n        if (url !== null && params && params['#']) {\n          url += '#' + params['#'];\n        }\n\n        url = appendBasePath(url, isHtml5, options.absolute);\n\n        if (!options.absolute || !url) {\n          return url;\n        }\n\n        var slash = (!isHtml5 && url ? '/' : ''), port = $location.port();\n        port = (port === 80 || port === 443 ? '' : ':' + port);\n\n        return [$location.protocol(), '://', $location.host(), port, slash, url].join('');\n      }\n    };\n  }\n}\n\nangular.module('ui.router.router').provider('$urlRouter', $UrlRouterProvider);\n\n/**\n * @ngdoc object\n * @name ui.router.state.$stateProvider\n *\n * @requires ui.router.router.$urlRouterProvider\n * @requires ui.router.util.$urlMatcherFactoryProvider\n *\n * @description\n * The new `$stateProvider` works similar to Angular's v1 router, but it focuses purely\n * on state.\n *\n * A state corresponds to a \"place\" in the application in terms of the overall UI and\n * navigation. A state describes (via the controller / template / view properties) what\n * the UI looks like and does at that place.\n *\n * States often have things in common, and the primary way of factoring out these\n * commonalities in this model is via the state hierarchy, i.e. parent/child states aka\n * nested states.\n *\n * The `$stateProvider` provides interfaces to declare these states for your app.\n */\n$StateProvider.$inject = ['$urlRouterProvider', '$urlMatcherFactoryProvider'];\nfunction $StateProvider(   $urlRouterProvider,   $urlMatcherFactory) {\n\n  var root, states = {}, $state, queue = {}, abstractKey = 'abstract';\n\n  // Builds state properties from definition passed to registerState()\n  var stateBuilder = {\n\n    // Derive parent state from a hierarchical name only if 'parent' is not explicitly defined.\n    // state.children = [];\n    // if (parent) parent.children.push(state);\n    parent: function(state) {\n      if (isDefined(state.parent) && state.parent) return findState(state.parent);\n      // regex matches any valid composite state name\n      // would match \"contact.list\" but not \"contacts\"\n      var compositeName = /^(.+)\\.[^.]+$/.exec(state.name);\n      return compositeName ? findState(compositeName[1]) : root;\n    },\n\n    // inherit 'data' from parent and override by own values (if any)\n    data: function(state) {\n      if (state.parent && state.parent.data) {\n        state.data = state.self.data = inherit(state.parent.data, state.data);\n      }\n      return state.data;\n    },\n\n    // Build a URLMatcher if necessary, either via a relative or absolute URL\n    url: function(state) {\n      var url = state.url, config = { params: state.params || {} };\n\n      if (isString(url)) {\n        if (url.charAt(0) == '^') return $urlMatcherFactory.compile(url.substring(1), config);\n        return (state.parent.navigable || root).url.concat(url, config);\n      }\n\n      if (!url || $urlMatcherFactory.isMatcher(url)) return url;\n      throw new Error(\"Invalid url '\" + url + \"' in state '\" + state + \"'\");\n    },\n\n    // Keep track of the closest ancestor state that has a URL (i.e. is navigable)\n    navigable: function(state) {\n      return state.url ? state : (state.parent ? state.parent.navigable : null);\n    },\n\n    // Own parameters for this state. state.url.params is already built at this point. Create and add non-url params\n    ownParams: function(state) {\n      var params = state.url && state.url.params || new $$UMFP.ParamSet();\n      forEach(state.params || {}, function(config, id) {\n        if (!params[id]) params[id] = new $$UMFP.Param(id, null, config, \"config\");\n      });\n      return params;\n    },\n\n    // Derive parameters for this state and ensure they're a super-set of parent's parameters\n    params: function(state) {\n      var ownParams = pick(state.ownParams, state.ownParams.$$keys());\n      return state.parent && state.parent.params ? extend(state.parent.params.$$new(), ownParams) : new $$UMFP.ParamSet();\n    },\n\n    // If there is no explicit multi-view configuration, make one up so we don't have\n    // to handle both cases in the view directive later. Note that having an explicit\n    // 'views' property will mean the default unnamed view properties are ignored. This\n    // is also a good time to resolve view names to absolute names, so everything is a\n    // straight lookup at link time.\n    views: function(state) {\n      var views = {};\n\n      forEach(isDefined(state.views) ? state.views : { '': state }, function (view, name) {\n        if (name.indexOf('@') < 0) name += '@' + state.parent.name;\n        view.resolveAs = view.resolveAs || state.resolveAs || '$resolve';\n        views[name] = view;\n      });\n      return views;\n    },\n\n    // Keep a full path from the root down to this state as this is needed for state activation.\n    path: function(state) {\n      return state.parent ? state.parent.path.concat(state) : []; // exclude root from path\n    },\n\n    // Speed up $state.contains() as it's used a lot\n    includes: function(state) {\n      var includes = state.parent ? extend({}, state.parent.includes) : {};\n      includes[state.name] = true;\n      return includes;\n    },\n\n    $delegates: {}\n  };\n\n  function isRelative(stateName) {\n    return stateName.indexOf(\".\") === 0 || stateName.indexOf(\"^\") === 0;\n  }\n\n  function findState(stateOrName, base) {\n    if (!stateOrName) return undefined;\n\n    var isStr = isString(stateOrName),\n        name  = isStr ? stateOrName : stateOrName.name,\n        path  = isRelative(name);\n\n    if (path) {\n      if (!base) throw new Error(\"No reference point given for path '\"  + name + \"'\");\n      base = findState(base);\n      \n      var rel = name.split(\".\"), i = 0, pathLength = rel.length, current = base;\n\n      for (; i < pathLength; i++) {\n        if (rel[i] === \"\" && i === 0) {\n          current = base;\n          continue;\n        }\n        if (rel[i] === \"^\") {\n          if (!current.parent) throw new Error(\"Path '\" + name + \"' not valid for state '\" + base.name + \"'\");\n          current = current.parent;\n          continue;\n        }\n        break;\n      }\n      rel = rel.slice(i).join(\".\");\n      name = current.name + (current.name && rel ? \".\" : \"\") + rel;\n    }\n    var state = states[name];\n\n    if (state && (isStr || (!isStr && (state === stateOrName || state.self === stateOrName)))) {\n      return state;\n    }\n    return undefined;\n  }\n\n  function queueState(parentName, state) {\n    if (!queue[parentName]) {\n      queue[parentName] = [];\n    }\n    queue[parentName].push(state);\n  }\n\n  function flushQueuedChildren(parentName) {\n    var queued = queue[parentName] || [];\n    while(queued.length) {\n      registerState(queued.shift());\n    }\n  }\n\n  function registerState(state) {\n    // Wrap a new object around the state so we can store our private details easily.\n    state = inherit(state, {\n      self: state,\n      resolve: state.resolve || {},\n      toString: function() { return this.name; }\n    });\n\n    var name = state.name;\n    if (!isString(name) || name.indexOf('@') >= 0) throw new Error(\"State must have a valid name\");\n    if (states.hasOwnProperty(name)) throw new Error(\"State '\" + name + \"' is already defined\");\n\n    // Get parent name\n    var parentName = (name.indexOf('.') !== -1) ? name.substring(0, name.lastIndexOf('.'))\n        : (isString(state.parent)) ? state.parent\n        : (isObject(state.parent) && isString(state.parent.name)) ? state.parent.name\n        : '';\n\n    // If parent is not registered yet, add state to queue and register later\n    if (parentName && !states[parentName]) {\n      return queueState(parentName, state.self);\n    }\n\n    for (var key in stateBuilder) {\n      if (isFunction(stateBuilder[key])) state[key] = stateBuilder[key](state, stateBuilder.$delegates[key]);\n    }\n    states[name] = state;\n\n    // Register the state in the global state list and with $urlRouter if necessary.\n    if (!state[abstractKey] && state.url) {\n      $urlRouterProvider.when(state.url, ['$match', '$stateParams', function ($match, $stateParams) {\n        if ($state.$current.navigable != state || !equalForKeys($match, $stateParams)) {\n          $state.transitionTo(state, $match, { inherit: true, location: false });\n        }\n      }]);\n    }\n\n    // Register any queued children\n    flushQueuedChildren(name);\n\n    return state;\n  }\n\n  // Checks text to see if it looks like a glob.\n  function isGlob (text) {\n    return text.indexOf('*') > -1;\n  }\n\n  // Returns true if glob matches current $state name.\n  function doesStateMatchGlob (glob) {\n    var globSegments = glob.split('.'),\n        segments = $state.$current.name.split('.');\n\n    //match single stars\n    for (var i = 0, l = globSegments.length; i < l; i++) {\n      if (globSegments[i] === '*') {\n        segments[i] = '*';\n      }\n    }\n\n    //match greedy starts\n    if (globSegments[0] === '**') {\n       segments = segments.slice(indexOf(segments, globSegments[1]));\n       segments.unshift('**');\n    }\n    //match greedy ends\n    if (globSegments[globSegments.length - 1] === '**') {\n       segments.splice(indexOf(segments, globSegments[globSegments.length - 2]) + 1, Number.MAX_VALUE);\n       segments.push('**');\n    }\n\n    if (globSegments.length != segments.length) {\n      return false;\n    }\n\n    return segments.join('') === globSegments.join('');\n  }\n\n\n  // Implicit root state that is always active\n  root = registerState({\n    name: '',\n    url: '^',\n    views: null,\n    'abstract': true\n  });\n  root.navigable = null;\n\n\n  /**\n   * @ngdoc function\n   * @name ui.router.state.$stateProvider#decorator\n   * @methodOf ui.router.state.$stateProvider\n   *\n   * @description\n   * Allows you to extend (carefully) or override (at your own peril) the \n   * `stateBuilder` object used internally by `$stateProvider`. This can be used \n   * to add custom functionality to ui-router, for example inferring templateUrl \n   * based on the state name.\n   *\n   * When passing only a name, it returns the current (original or decorated) builder\n   * function that matches `name`.\n   *\n   * The builder functions that can be decorated are listed below. Though not all\n   * necessarily have a good use case for decoration, that is up to you to decide.\n   *\n   * In addition, users can attach custom decorators, which will generate new \n   * properties within the state's internal definition. There is currently no clear \n   * use-case for this beyond accessing internal states (i.e. $state.$current), \n   * however, expect this to become increasingly relevant as we introduce additional \n   * meta-programming features.\n   *\n   * **Warning**: Decorators should not be interdependent because the order of \n   * execution of the builder functions in non-deterministic. Builder functions \n   * should only be dependent on the state definition object and super function.\n   *\n   *\n   * Existing builder functions and current return values:\n   *\n   * - **parent** `{object}` - returns the parent state object.\n   * - **data** `{object}` - returns state data, including any inherited data that is not\n   *   overridden by own values (if any).\n   * - **url** `{object}` - returns a {@link ui.router.util.type:UrlMatcher UrlMatcher}\n   *   or `null`.\n   * - **navigable** `{object}` - returns closest ancestor state that has a URL (aka is \n   *   navigable).\n   * - **params** `{object}` - returns an array of state params that are ensured to \n   *   be a super-set of parent's params.\n   * - **views** `{object}` - returns a views object where each key is an absolute view \n   *   name (i.e. \"viewName@stateName\") and each value is the config object \n   *   (template, controller) for the view. Even when you don't use the views object \n   *   explicitly on a state config, one is still created for you internally.\n   *   So by decorating this builder function you have access to decorating template \n   *   and controller properties.\n   * - **ownParams** `{object}` - returns an array of params that belong to the state, \n   *   not including any params defined by ancestor states.\n   * - **path** `{string}` - returns the full path from the root down to this state. \n   *   Needed for state activation.\n   * - **includes** `{object}` - returns an object that includes every state that \n   *   would pass a `$state.includes()` test.\n   *\n   * @example\n   * <pre>\n   * // Override the internal 'views' builder with a function that takes the state\n   * // definition, and a reference to the internal function being overridden:\n   * $stateProvider.decorator('views', function (state, parent) {\n   *   var result = {},\n   *       views = parent(state);\n   *\n   *   angular.forEach(views, function (config, name) {\n   *     var autoName = (state.name + '.' + name).replace('.', '/');\n   *     config.templateUrl = config.templateUrl || '/partials/' + autoName + '.html';\n   *     result[name] = config;\n   *   });\n   *   return result;\n   * });\n   *\n   * $stateProvider.state('home', {\n   *   views: {\n   *     'contact.list': { controller: 'ListController' },\n   *     'contact.item': { controller: 'ItemController' }\n   *   }\n   * });\n   *\n   * // ...\n   *\n   * $state.go('home');\n   * // Auto-populates list and item views with /partials/home/contact/list.html,\n   * // and /partials/home/contact/item.html, respectively.\n   * </pre>\n   *\n   * @param {string} name The name of the builder function to decorate. \n   * @param {object} func A function that is responsible for decorating the original \n   * builder function. The function receives two parameters:\n   *\n   *   - `{object}` - state - The state config object.\n   *   - `{object}` - super - The original builder function.\n   *\n   * @return {object} $stateProvider - $stateProvider instance\n   */\n  this.decorator = decorator;\n  function decorator(name, func) {\n    /*jshint validthis: true */\n    if (isString(name) && !isDefined(func)) {\n      return stateBuilder[name];\n    }\n    if (!isFunction(func) || !isString(name)) {\n      return this;\n    }\n    if (stateBuilder[name] && !stateBuilder.$delegates[name]) {\n      stateBuilder.$delegates[name] = stateBuilder[name];\n    }\n    stateBuilder[name] = func;\n    return this;\n  }\n\n  /**\n   * @ngdoc function\n   * @name ui.router.state.$stateProvider#state\n   * @methodOf ui.router.state.$stateProvider\n   *\n   * @description\n   * Registers a state configuration under a given state name. The stateConfig object\n   * has the following acceptable properties.\n   *\n   * @param {string} name A unique state name, e.g. \"home\", \"about\", \"contacts\".\n   * To create a parent/child state use a dot, e.g. \"about.sales\", \"home.newest\".\n   * @param {object} stateConfig State configuration object.\n   * @param {string|function=} stateConfig.template\n   * <a id='template'></a>\n   *   html template as a string or a function that returns\n   *   an html template as a string which should be used by the uiView directives. This property \n   *   takes precedence over templateUrl.\n   *   \n   *   If `template` is a function, it will be called with the following parameters:\n   *\n   *   - {array.&lt;object&gt;} - state parameters extracted from the current $location.path() by\n   *     applying the current state\n   *\n   * <pre>template:\n   *   \"<h1>inline template definition</h1>\" +\n   *   \"<div ui-view></div>\"</pre>\n   * <pre>template: function(params) {\n   *       return \"<h1>generated template</h1>\"; }</pre>\n   * </div>\n   *\n   * @param {string|function=} stateConfig.templateUrl\n   * <a id='templateUrl'></a>\n   *\n   *   path or function that returns a path to an html\n   *   template that should be used by uiView.\n   *   \n   *   If `templateUrl` is a function, it will be called with the following parameters:\n   *\n   *   - {array.&lt;object&gt;} - state parameters extracted from the current $location.path() by \n   *     applying the current state\n   *\n   * <pre>templateUrl: \"home.html\"</pre>\n   * <pre>templateUrl: function(params) {\n   *     return myTemplates[params.pageId]; }</pre>\n   *\n   * @param {function=} stateConfig.templateProvider\n   * <a id='templateProvider'></a>\n   *    Provider function that returns HTML content string.\n   * <pre> templateProvider:\n   *       function(MyTemplateService, params) {\n   *         return MyTemplateService.getTemplate(params.pageId);\n   *       }</pre>\n   *\n   * @param {string|function=} stateConfig.controller\n   * <a id='controller'></a>\n   *\n   *  Controller fn that should be associated with newly\n   *   related scope or the name of a registered controller if passed as a string.\n   *   Optionally, the ControllerAs may be declared here.\n   * <pre>controller: \"MyRegisteredController\"</pre>\n   * <pre>controller:\n   *     \"MyRegisteredController as fooCtrl\"}</pre>\n   * <pre>controller: function($scope, MyService) {\n   *     $scope.data = MyService.getData(); }</pre>\n   *\n   * @param {function=} stateConfig.controllerProvider\n   * <a id='controllerProvider'></a>\n   *\n   * Injectable provider function that returns the actual controller or string.\n   * <pre>controllerProvider:\n   *   function(MyResolveData) {\n   *     if (MyResolveData.foo)\n   *       return \"FooCtrl\"\n   *     else if (MyResolveData.bar)\n   *       return \"BarCtrl\";\n   *     else return function($scope) {\n   *       $scope.baz = \"Qux\";\n   *     }\n   *   }</pre>\n   *\n   * @param {string=} stateConfig.controllerAs\n   * <a id='controllerAs'></a>\n   * \n   * A controller alias name. If present the controller will be\n   *   published to scope under the controllerAs name.\n   * <pre>controllerAs: \"myCtrl\"</pre>\n   *\n   * @param {string|object=} stateConfig.parent\n   * <a id='parent'></a>\n   * Optionally specifies the parent state of this state.\n   *\n   * <pre>parent: 'parentState'</pre>\n   * <pre>parent: parentState // JS variable</pre>\n   *\n   * @param {object=} stateConfig.resolve\n   * <a id='resolve'></a>\n   *\n   * An optional map&lt;string, function&gt; of dependencies which\n   *   should be injected into the controller. If any of these dependencies are promises, \n   *   the router will wait for them all to be resolved before the controller is instantiated.\n   *   If all the promises are resolved successfully, the $stateChangeSuccess event is fired\n   *   and the values of the resolved promises are injected into any controllers that reference them.\n   *   If any  of the promises are rejected the $stateChangeError event is fired.\n   *\n   *   The map object is:\n   *   \n   *   - key - {string}: name of dependency to be injected into controller\n   *   - factory - {string|function}: If string then it is alias for service. Otherwise if function, \n   *     it is injected and return value it treated as dependency. If result is a promise, it is \n   *     resolved before its value is injected into controller.\n   *\n   * <pre>resolve: {\n   *     myResolve1:\n   *       function($http, $stateParams) {\n   *         return $http.get(\"/api/foos/\"+stateParams.fooID);\n   *       }\n   *     }</pre>\n   *\n   * @param {string=} stateConfig.url\n   * <a id='url'></a>\n   *\n   *   A url fragment with optional parameters. When a state is navigated or\n   *   transitioned to, the `$stateParams` service will be populated with any \n   *   parameters that were passed.\n   *\n   *   (See {@link ui.router.util.type:UrlMatcher UrlMatcher} `UrlMatcher`} for\n   *   more details on acceptable patterns )\n   *\n   * examples:\n   * <pre>url: \"/home\"\n   * url: \"/users/:userid\"\n   * url: \"/books/{bookid:[a-zA-Z_-]}\"\n   * url: \"/books/{categoryid:int}\"\n   * url: \"/books/{publishername:string}/{categoryid:int}\"\n   * url: \"/messages?before&after\"\n   * url: \"/messages?{before:date}&{after:date}\"\n   * url: \"/messages/:mailboxid?{before:date}&{after:date}\"\n   * </pre>\n   *\n   * @param {object=} stateConfig.views\n   * <a id='views'></a>\n   * an optional map&lt;string, object&gt; which defined multiple views, or targets views\n   * manually/explicitly.\n   *\n   * Examples:\n   *\n   * Targets three named `ui-view`s in the parent state's template\n   * <pre>views: {\n   *     header: {\n   *       controller: \"headerCtrl\",\n   *       templateUrl: \"header.html\"\n   *     }, body: {\n   *       controller: \"bodyCtrl\",\n   *       templateUrl: \"body.html\"\n   *     }, footer: {\n   *       controller: \"footCtrl\",\n   *       templateUrl: \"footer.html\"\n   *     }\n   *   }</pre>\n   *\n   * Targets named `ui-view=\"header\"` from grandparent state 'top''s template, and named `ui-view=\"body\" from parent state's template.\n   * <pre>views: {\n   *     'header@top': {\n   *       controller: \"msgHeaderCtrl\",\n   *       templateUrl: \"msgHeader.html\"\n   *     }, 'body': {\n   *       controller: \"messagesCtrl\",\n   *       templateUrl: \"messages.html\"\n   *     }\n   *   }</pre>\n   *\n   * @param {boolean=} [stateConfig.abstract=false]\n   * <a id='abstract'></a>\n   * An abstract state will never be directly activated,\n   *   but can provide inherited properties to its common children states.\n   * <pre>abstract: true</pre>\n   *\n   * @param {function=} stateConfig.onEnter\n   * <a id='onEnter'></a>\n   *\n   * Callback function for when a state is entered. Good way\n   *   to trigger an action or dispatch an event, such as opening a dialog.\n   * If minifying your scripts, make sure to explicitly annotate this function,\n   * because it won't be automatically annotated by your build tools.\n   *\n   * <pre>onEnter: function(MyService, $stateParams) {\n   *     MyService.foo($stateParams.myParam);\n   * }</pre>\n   *\n   * @param {function=} stateConfig.onExit\n   * <a id='onExit'></a>\n   *\n   * Callback function for when a state is exited. Good way to\n   *   trigger an action or dispatch an event, such as opening a dialog.\n   * If minifying your scripts, make sure to explicitly annotate this function,\n   * because it won't be automatically annotated by your build tools.\n   *\n   * <pre>onExit: function(MyService, $stateParams) {\n   *     MyService.cleanup($stateParams.myParam);\n   * }</pre>\n   *\n   * @param {boolean=} [stateConfig.reloadOnSearch=true]\n   * <a id='reloadOnSearch'></a>\n   *\n   * If `false`, will not retrigger the same state\n   *   just because a search/query parameter has changed (via $location.search() or $location.hash()). \n   *   Useful for when you'd like to modify $location.search() without triggering a reload.\n   * <pre>reloadOnSearch: false</pre>\n   *\n   * @param {object=} stateConfig.data\n   * <a id='data'></a>\n   *\n   * Arbitrary data object, useful for custom configuration.  The parent state's `data` is\n   *   prototypally inherited.  In other words, adding a data property to a state adds it to\n   *   the entire subtree via prototypal inheritance.\n   *\n   * <pre>data: {\n   *     requiredRole: 'foo'\n   * } </pre>\n   *\n   * @param {object=} stateConfig.params\n   * <a id='params'></a>\n   *\n   * A map which optionally configures parameters declared in the `url`, or\n   *   defines additional non-url parameters.  For each parameter being\n   *   configured, add a configuration object keyed to the name of the parameter.\n   *\n   *   Each parameter configuration object may contain the following properties:\n   *\n   *   - ** value ** - {object|function=}: specifies the default value for this\n   *     parameter.  This implicitly sets this parameter as optional.\n   *\n   *     When UI-Router routes to a state and no value is\n   *     specified for this parameter in the URL or transition, the\n   *     default value will be used instead.  If `value` is a function,\n   *     it will be injected and invoked, and the return value used.\n   *\n   *     *Note*: `undefined` is treated as \"no default value\" while `null`\n   *     is treated as \"the default value is `null`\".\n   *\n   *     *Shorthand*: If you only need to configure the default value of the\n   *     parameter, you may use a shorthand syntax.   In the **`params`**\n   *     map, instead mapping the param name to a full parameter configuration\n   *     object, simply set map it to the default parameter value, e.g.:\n   *\n   * <pre>// define a parameter's default value\n   * params: {\n   *     param1: { value: \"defaultValue\" }\n   * }\n   * // shorthand default values\n   * params: {\n   *     param1: \"defaultValue\",\n   *     param2: \"param2Default\"\n   * }</pre>\n   *\n   *   - ** array ** - {boolean=}: *(default: false)* If true, the param value will be\n   *     treated as an array of values.  If you specified a Type, the value will be\n   *     treated as an array of the specified Type.  Note: query parameter values\n   *     default to a special `\"auto\"` mode.\n   *\n   *     For query parameters in `\"auto\"` mode, if multiple  values for a single parameter\n   *     are present in the URL (e.g.: `/foo?bar=1&bar=2&bar=3`) then the values\n   *     are mapped to an array (e.g.: `{ foo: [ '1', '2', '3' ] }`).  However, if\n   *     only one value is present (e.g.: `/foo?bar=1`) then the value is treated as single\n   *     value (e.g.: `{ foo: '1' }`).\n   *\n   * <pre>params: {\n   *     param1: { array: true }\n   * }</pre>\n   *\n   *   - ** squash ** - {bool|string=}: `squash` configures how a default parameter value is represented in the URL when\n   *     the current parameter value is the same as the default value. If `squash` is not set, it uses the\n   *     configured default squash policy.\n   *     (See {@link ui.router.util.$urlMatcherFactory#methods_defaultSquashPolicy `defaultSquashPolicy()`})\n   *\n   *   There are three squash settings:\n   *\n   *     - false: The parameter's default value is not squashed.  It is encoded and included in the URL\n   *     - true: The parameter's default value is omitted from the URL.  If the parameter is preceeded and followed\n   *       by slashes in the state's `url` declaration, then one of those slashes are omitted.\n   *       This can allow for cleaner looking URLs.\n   *     - `\"<arbitrary string>\"`: The parameter's default value is replaced with an arbitrary placeholder of  your choice.\n   *\n   * <pre>params: {\n   *     param1: {\n   *       value: \"defaultId\",\n   *       squash: true\n   * } }\n   * // squash \"defaultValue\" to \"~\"\n   * params: {\n   *     param1: {\n   *       value: \"defaultValue\",\n   *       squash: \"~\"\n   * } }\n   * </pre>\n   *\n   *\n   * @example\n   * <pre>\n   * // Some state name examples\n   *\n   * // stateName can be a single top-level name (must be unique).\n   * $stateProvider.state(\"home\", {});\n   *\n   * // Or it can be a nested state name. This state is a child of the\n   * // above \"home\" state.\n   * $stateProvider.state(\"home.newest\", {});\n   *\n   * // Nest states as deeply as needed.\n   * $stateProvider.state(\"home.newest.abc.xyz.inception\", {});\n   *\n   * // state() returns $stateProvider, so you can chain state declarations.\n   * $stateProvider\n   *   .state(\"home\", {})\n   *   .state(\"about\", {})\n   *   .state(\"contacts\", {});\n   * </pre>\n   *\n   */\n  this.state = state;\n  function state(name, definition) {\n    /*jshint validthis: true */\n    if (isObject(name)) definition = name;\n    else definition.name = name;\n    registerState(definition);\n    return this;\n  }\n\n  /**\n   * @ngdoc object\n   * @name ui.router.state.$state\n   *\n   * @requires $rootScope\n   * @requires $q\n   * @requires ui.router.state.$view\n   * @requires $injector\n   * @requires ui.router.util.$resolve\n   * @requires ui.router.state.$stateParams\n   * @requires ui.router.router.$urlRouter\n   *\n   * @property {object} params A param object, e.g. {sectionId: section.id)}, that \n   * you'd like to test against the current active state.\n   * @property {object} current A reference to the state's config object. However \n   * you passed it in. Useful for accessing custom data.\n   * @property {object} transition Currently pending transition. A promise that'll \n   * resolve or reject.\n   *\n   * @description\n   * `$state` service is responsible for representing states as well as transitioning\n   * between them. It also provides interfaces to ask for current state or even states\n   * you're coming from.\n   */\n  this.$get = $get;\n  $get.$inject = ['$rootScope', '$q', '$view', '$injector', '$resolve', '$stateParams', '$urlRouter', '$location', '$urlMatcherFactory'];\n  function $get(   $rootScope,   $q,   $view,   $injector,   $resolve,   $stateParams,   $urlRouter,   $location,   $urlMatcherFactory) {\n\n    var TransitionSupersededError = new Error('transition superseded');\n\n    var TransitionSuperseded = silenceUncaughtInPromise($q.reject(TransitionSupersededError));\n    var TransitionPrevented = silenceUncaughtInPromise($q.reject(new Error('transition prevented')));\n    var TransitionAborted = silenceUncaughtInPromise($q.reject(new Error('transition aborted')));\n    var TransitionFailed = silenceUncaughtInPromise($q.reject(new Error('transition failed')));\n\n    // Handles the case where a state which is the target of a transition is not found, and the user\n    // can optionally retry or defer the transition\n    function handleRedirect(redirect, state, params, options) {\n      /**\n       * @ngdoc event\n       * @name ui.router.state.$state#$stateNotFound\n       * @eventOf ui.router.state.$state\n       * @eventType broadcast on root scope\n       * @description\n       * Fired when a requested state **cannot be found** using the provided state name during transition.\n       * The event is broadcast allowing any handlers a single chance to deal with the error (usually by\n       * lazy-loading the unfound state). A special `unfoundState` object is passed to the listener handler,\n       * you can see its three properties in the example. You can use `event.preventDefault()` to abort the\n       * transition and the promise returned from `go` will be rejected with a `'transition aborted'` value.\n       *\n       * @param {Object} event Event object.\n       * @param {Object} unfoundState Unfound State information. Contains: `to, toParams, options` properties.\n       * @param {State} fromState Current state object.\n       * @param {Object} fromParams Current state params.\n       *\n       * @example\n       *\n       * <pre>\n       * // somewhere, assume lazy.state has not been defined\n       * $state.go(\"lazy.state\", {a:1, b:2}, {inherit:false});\n       *\n       * // somewhere else\n       * $scope.$on('$stateNotFound',\n       * function(event, unfoundState, fromState, fromParams){\n       *     console.log(unfoundState.to); // \"lazy.state\"\n       *     console.log(unfoundState.toParams); // {a:1, b:2}\n       *     console.log(unfoundState.options); // {inherit:false} + default options\n       * })\n       * </pre>\n       */\n      var evt = $rootScope.$broadcast('$stateNotFound', redirect, state, params);\n\n      if (evt.defaultPrevented) {\n        $urlRouter.update();\n        return TransitionAborted;\n      }\n\n      if (!evt.retry) {\n        return null;\n      }\n\n      // Allow the handler to return a promise to defer state lookup retry\n      if (options.$retry) {\n        $urlRouter.update();\n        return TransitionFailed;\n      }\n      var retryTransition = $state.transition = $q.when(evt.retry);\n\n      retryTransition.then(function() {\n        if (retryTransition !== $state.transition) {\n          $rootScope.$broadcast('$stateChangeCancel', redirect.to, redirect.toParams, state, params);\n          return TransitionSuperseded;\n        }\n        redirect.options.$retry = true;\n        return $state.transitionTo(redirect.to, redirect.toParams, redirect.options);\n      }, function() {\n        return TransitionAborted;\n      });\n      $urlRouter.update();\n\n      return retryTransition;\n    }\n\n    root.locals = { resolve: null, globals: { $stateParams: {} } };\n\n    $state = {\n      params: {},\n      current: root.self,\n      $current: root,\n      transition: null\n    };\n\n    /**\n     * @ngdoc function\n     * @name ui.router.state.$state#reload\n     * @methodOf ui.router.state.$state\n     *\n     * @description\n     * A method that force reloads the current state. All resolves are re-resolved,\n     * controllers reinstantiated, and events re-fired.\n     *\n     * @example\n     * <pre>\n     * var app angular.module('app', ['ui.router']);\n     *\n     * app.controller('ctrl', function ($scope, $state) {\n     *   $scope.reload = function(){\n     *     $state.reload();\n     *   }\n     * });\n     * </pre>\n     *\n     * `reload()` is just an alias for:\n     * <pre>\n     * $state.transitionTo($state.current, $stateParams, { \n     *   reload: true, inherit: false, notify: true\n     * });\n     * </pre>\n     *\n     * @param {string=|object=} state - A state name or a state object, which is the root of the resolves to be re-resolved.\n     * @example\n     * <pre>\n     * //assuming app application consists of 3 states: 'contacts', 'contacts.detail', 'contacts.detail.item' \n     * //and current state is 'contacts.detail.item'\n     * var app angular.module('app', ['ui.router']);\n     *\n     * app.controller('ctrl', function ($scope, $state) {\n     *   $scope.reload = function(){\n     *     //will reload 'contact.detail' and 'contact.detail.item' states\n     *     $state.reload('contact.detail');\n     *   }\n     * });\n     * </pre>\n     *\n     * `reload()` is just an alias for:\n     * <pre>\n     * $state.transitionTo($state.current, $stateParams, { \n     *   reload: true, inherit: false, notify: true\n     * });\n     * </pre>\n\n     * @returns {promise} A promise representing the state of the new transition. See\n     * {@link ui.router.state.$state#methods_go $state.go}.\n     */\n    $state.reload = function reload(state) {\n      return $state.transitionTo($state.current, $stateParams, { reload: state || true, inherit: false, notify: true});\n    };\n\n    /**\n     * @ngdoc function\n     * @name ui.router.state.$state#go\n     * @methodOf ui.router.state.$state\n     *\n     * @description\n     * Convenience method for transitioning to a new state. `$state.go` calls \n     * `$state.transitionTo` internally but automatically sets options to \n     * `{ location: true, inherit: true, relative: $state.$current, notify: true }`. \n     * This allows you to easily use an absolute or relative to path and specify \n     * only the parameters you'd like to update (while letting unspecified parameters \n     * inherit from the currently active ancestor states).\n     *\n     * @example\n     * <pre>\n     * var app = angular.module('app', ['ui.router']);\n     *\n     * app.controller('ctrl', function ($scope, $state) {\n     *   $scope.changeState = function () {\n     *     $state.go('contact.detail');\n     *   };\n     * });\n     * </pre>\n     * <img src='../ngdoc_assets/StateGoExamples.png'/>\n     *\n     * @param {string} to Absolute state name or relative state path. Some examples:\n     *\n     * - `$state.go('contact.detail')` - will go to the `contact.detail` state\n     * - `$state.go('^')` - will go to a parent state\n     * - `$state.go('^.sibling')` - will go to a sibling state\n     * - `$state.go('.child.grandchild')` - will go to grandchild state\n     *\n     * @param {object=} params A map of the parameters that will be sent to the state, \n     * will populate $stateParams. Any parameters that are not specified will be inherited from currently \n     * defined parameters. Only parameters specified in the state definition can be overridden, new \n     * parameters will be ignored. This allows, for example, going to a sibling state that shares parameters\n     * specified in a parent state. Parameter inheritance only works between common ancestor states, I.e.\n     * transitioning to a sibling will get you the parameters for all parents, transitioning to a child\n     * will get you all current parameters, etc.\n     * @param {object=} options Options object. The options are:\n     *\n     * - **`location`** - {boolean=true|string=} - If `true` will update the url in the location bar, if `false`\n     *    will not. If string, must be `\"replace\"`, which will update url and also replace last history record.\n     * - **`inherit`** - {boolean=true}, If `true` will inherit url parameters from current url.\n     * - **`relative`** - {object=$state.$current}, When transitioning with relative path (e.g '^'), \n     *    defines which state to be relative from.\n     * - **`notify`** - {boolean=true}, If `true` will broadcast $stateChangeStart and $stateChangeSuccess events.\n     * - **`reload`** (v0.2.5) - {boolean=false|string|object}, If `true` will force transition even if no state or params\n     *    have changed.  It will reload the resolves and views of the current state and parent states.\n     *    If `reload` is a string (or state object), the state object is fetched (by name, or object reference); and \\\n     *    the transition reloads the resolves and views for that matched state, and all its children states.\n     *\n     * @returns {promise} A promise representing the state of the new transition.\n     *\n     * Possible success values:\n     *\n     * - $state.current\n     *\n     * <br/>Possible rejection values:\n     *\n     * - 'transition superseded' - when a newer transition has been started after this one\n     * - 'transition prevented' - when `event.preventDefault()` has been called in a `$stateChangeStart` listener\n     * - 'transition aborted' - when `event.preventDefault()` has been called in a `$stateNotFound` listener or\n     *   when a `$stateNotFound` `event.retry` promise errors.\n     * - 'transition failed' - when a state has been unsuccessfully found after 2 tries.\n     * - *resolve error* - when an error has occurred with a `resolve`\n     *\n     */\n    $state.go = function go(to, params, options) {\n      return $state.transitionTo(to, params, extend({ inherit: true, relative: $state.$current }, options));\n    };\n\n    /**\n     * @ngdoc function\n     * @name ui.router.state.$state#transitionTo\n     * @methodOf ui.router.state.$state\n     *\n     * @description\n     * Low-level method for transitioning to a new state. {@link ui.router.state.$state#methods_go $state.go}\n     * uses `transitionTo` internally. `$state.go` is recommended in most situations.\n     *\n     * @example\n     * <pre>\n     * var app = angular.module('app', ['ui.router']);\n     *\n     * app.controller('ctrl', function ($scope, $state) {\n     *   $scope.changeState = function () {\n     *     $state.transitionTo('contact.detail');\n     *   };\n     * });\n     * </pre>\n     *\n     * @param {string} to State name.\n     * @param {object=} toParams A map of the parameters that will be sent to the state,\n     * will populate $stateParams.\n     * @param {object=} options Options object. The options are:\n     *\n     * - **`location`** - {boolean=true|string=} - If `true` will update the url in the location bar, if `false`\n     *    will not. If string, must be `\"replace\"`, which will update url and also replace last history record.\n     * - **`inherit`** - {boolean=false}, If `true` will inherit url parameters from current url.\n     * - **`relative`** - {object=}, When transitioning with relative path (e.g '^'), \n     *    defines which state to be relative from.\n     * - **`notify`** - {boolean=true}, If `true` will broadcast $stateChangeStart and $stateChangeSuccess events.\n     * - **`reload`** (v0.2.5) - {boolean=false|string=|object=}, If `true` will force transition even if the state or params \n     *    have not changed, aka a reload of the same state. It differs from reloadOnSearch because you'd\n     *    use this when you want to force a reload when *everything* is the same, including search params.\n     *    if String, then will reload the state with the name given in reload, and any children.\n     *    if Object, then a stateObj is expected, will reload the state found in stateObj, and any children.\n     *\n     * @returns {promise} A promise representing the state of the new transition. See\n     * {@link ui.router.state.$state#methods_go $state.go}.\n     */\n    $state.transitionTo = function transitionTo(to, toParams, options) {\n      toParams = toParams || {};\n      options = extend({\n        location: true, inherit: false, relative: null, notify: true, reload: false, $retry: false\n      }, options || {});\n\n      var from = $state.$current, fromParams = $state.params, fromPath = from.path;\n      var evt, toState = findState(to, options.relative);\n\n      // Store the hash param for later (since it will be stripped out by various methods)\n      var hash = toParams['#'];\n\n      if (!isDefined(toState)) {\n        var redirect = { to: to, toParams: toParams, options: options };\n        var redirectResult = handleRedirect(redirect, from.self, fromParams, options);\n\n        if (redirectResult) {\n          return redirectResult;\n        }\n\n        // Always retry once if the $stateNotFound was not prevented\n        // (handles either redirect changed or state lazy-definition)\n        to = redirect.to;\n        toParams = redirect.toParams;\n        options = redirect.options;\n        toState = findState(to, options.relative);\n\n        if (!isDefined(toState)) {\n          if (!options.relative) throw new Error(\"No such state '\" + to + \"'\");\n          throw new Error(\"Could not resolve '\" + to + \"' from state '\" + options.relative + \"'\");\n        }\n      }\n      if (toState[abstractKey]) throw new Error(\"Cannot transition to abstract state '\" + to + \"'\");\n      if (options.inherit) toParams = inheritParams($stateParams, toParams || {}, $state.$current, toState);\n      if (!toState.params.$$validates(toParams)) return TransitionFailed;\n\n      toParams = toState.params.$$values(toParams);\n      to = toState;\n\n      var toPath = to.path;\n\n      // Starting from the root of the path, keep all levels that haven't changed\n      var keep = 0, state = toPath[keep], locals = root.locals, toLocals = [];\n\n      if (!options.reload) {\n        while (state && state === fromPath[keep] && state.ownParams.$$equals(toParams, fromParams)) {\n          locals = toLocals[keep] = state.locals;\n          keep++;\n          state = toPath[keep];\n        }\n      } else if (isString(options.reload) || isObject(options.reload)) {\n        if (isObject(options.reload) && !options.reload.name) {\n          throw new Error('Invalid reload state object');\n        }\n        \n        var reloadState = options.reload === true ? fromPath[0] : findState(options.reload);\n        if (options.reload && !reloadState) {\n          throw new Error(\"No such reload state '\" + (isString(options.reload) ? options.reload : options.reload.name) + \"'\");\n        }\n\n        while (state && state === fromPath[keep] && state !== reloadState) {\n          locals = toLocals[keep] = state.locals;\n          keep++;\n          state = toPath[keep];\n        }\n      }\n\n      // If we're going to the same state and all locals are kept, we've got nothing to do.\n      // But clear 'transition', as we still want to cancel any other pending transitions.\n      // TODO: We may not want to bump 'transition' if we're called from a location change\n      // that we've initiated ourselves, because we might accidentally abort a legitimate\n      // transition initiated from code?\n      if (shouldSkipReload(to, toParams, from, fromParams, locals, options)) {\n        if (hash) toParams['#'] = hash;\n        $state.params = toParams;\n        copy($state.params, $stateParams);\n        copy(filterByKeys(to.params.$$keys(), $stateParams), to.locals.globals.$stateParams);\n        if (options.location && to.navigable && to.navigable.url) {\n          $urlRouter.push(to.navigable.url, toParams, {\n            $$avoidResync: true, replace: options.location === 'replace'\n          });\n          $urlRouter.update(true);\n        }\n        $state.transition = null;\n        return $q.when($state.current);\n      }\n\n      // Filter parameters before we pass them to event handlers etc.\n      toParams = filterByKeys(to.params.$$keys(), toParams || {});\n      \n      // Re-add the saved hash before we start returning things or broadcasting $stateChangeStart\n      if (hash) toParams['#'] = hash;\n      \n      // Broadcast start event and cancel the transition if requested\n      if (options.notify) {\n        /**\n         * @ngdoc event\n         * @name ui.router.state.$state#$stateChangeStart\n         * @eventOf ui.router.state.$state\n         * @eventType broadcast on root scope\n         * @description\n         * Fired when the state transition **begins**. You can use `event.preventDefault()`\n         * to prevent the transition from happening and then the transition promise will be\n         * rejected with a `'transition prevented'` value.\n         *\n         * @param {Object} event Event object.\n         * @param {State} toState The state being transitioned to.\n         * @param {Object} toParams The params supplied to the `toState`.\n         * @param {State} fromState The current state, pre-transition.\n         * @param {Object} fromParams The params supplied to the `fromState`.\n         *\n         * @example\n         *\n         * <pre>\n         * $rootScope.$on('$stateChangeStart',\n         * function(event, toState, toParams, fromState, fromParams){\n         *     event.preventDefault();\n         *     // transitionTo() promise will be rejected with\n         *     // a 'transition prevented' error\n         * })\n         * </pre>\n         */\n        if ($rootScope.$broadcast('$stateChangeStart', to.self, toParams, from.self, fromParams, options).defaultPrevented) {\n          $rootScope.$broadcast('$stateChangeCancel', to.self, toParams, from.self, fromParams);\n          //Don't update and resync url if there's been a new transition started. see issue #2238, #600\n          if ($state.transition == null) $urlRouter.update();\n          return TransitionPrevented;\n        }\n      }\n\n      // Resolve locals for the remaining states, but don't update any global state just\n      // yet -- if anything fails to resolve the current state needs to remain untouched.\n      // We also set up an inheritance chain for the locals here. This allows the view directive\n      // to quickly look up the correct definition for each view in the current state. Even\n      // though we create the locals object itself outside resolveState(), it is initially\n      // empty and gets filled asynchronously. We need to keep track of the promise for the\n      // (fully resolved) current locals, and pass this down the chain.\n      var resolved = $q.when(locals);\n\n      for (var l = keep; l < toPath.length; l++, state = toPath[l]) {\n        locals = toLocals[l] = inherit(locals);\n        resolved = resolveState(state, toParams, state === to, resolved, locals, options);\n      }\n\n      // Once everything is resolved, we are ready to perform the actual transition\n      // and return a promise for the new state. We also keep track of what the\n      // current promise is, so that we can detect overlapping transitions and\n      // keep only the outcome of the last transition.\n      var transition = $state.transition = resolved.then(function () {\n        var l, entering, exiting;\n\n        if ($state.transition !== transition) {\n          $rootScope.$broadcast('$stateChangeCancel', to.self, toParams, from.self, fromParams);\n          return TransitionSuperseded;\n        }\n\n        // Exit 'from' states not kept\n        for (l = fromPath.length - 1; l >= keep; l--) {\n          exiting = fromPath[l];\n          if (exiting.self.onExit) {\n            $injector.invoke(exiting.self.onExit, exiting.self, exiting.locals.globals);\n          }\n          exiting.locals = null;\n        }\n\n        // Enter 'to' states not kept\n        for (l = keep; l < toPath.length; l++) {\n          entering = toPath[l];\n          entering.locals = toLocals[l];\n          if (entering.self.onEnter) {\n            $injector.invoke(entering.self.onEnter, entering.self, entering.locals.globals);\n          }\n        }\n\n        // Run it again, to catch any transitions in callbacks\n        if ($state.transition !== transition) {\n          $rootScope.$broadcast('$stateChangeCancel', to.self, toParams, from.self, fromParams);\n          return TransitionSuperseded;\n        }\n\n        // Update globals in $state\n        $state.$current = to;\n        $state.current = to.self;\n        $state.params = toParams;\n        copy($state.params, $stateParams);\n        $state.transition = null;\n\n        if (options.location && to.navigable) {\n          $urlRouter.push(to.navigable.url, to.navigable.locals.globals.$stateParams, {\n            $$avoidResync: true, replace: options.location === 'replace'\n          });\n        }\n\n        if (options.notify) {\n        /**\n         * @ngdoc event\n         * @name ui.router.state.$state#$stateChangeSuccess\n         * @eventOf ui.router.state.$state\n         * @eventType broadcast on root scope\n         * @description\n         * Fired once the state transition is **complete**.\n         *\n         * @param {Object} event Event object.\n         * @param {State} toState The state being transitioned to.\n         * @param {Object} toParams The params supplied to the `toState`.\n         * @param {State} fromState The current state, pre-transition.\n         * @param {Object} fromParams The params supplied to the `fromState`.\n         */\n          $rootScope.$broadcast('$stateChangeSuccess', to.self, toParams, from.self, fromParams);\n        }\n        $urlRouter.update(true);\n\n        return $state.current;\n      }).then(null, function (error) {\n        // propagate TransitionSuperseded error without emitting $stateChangeCancel\n        // as it was already emitted in the success handler above\n        if (error === TransitionSupersededError) return TransitionSuperseded;\n\n        if ($state.transition !== transition) {\n          $rootScope.$broadcast('$stateChangeCancel', to.self, toParams, from.self, fromParams);\n          return TransitionSuperseded;\n        }\n\n        $state.transition = null;\n        /**\n         * @ngdoc event\n         * @name ui.router.state.$state#$stateChangeError\n         * @eventOf ui.router.state.$state\n         * @eventType broadcast on root scope\n         * @description\n         * Fired when an **error occurs** during transition. It's important to note that if you\n         * have any errors in your resolve functions (javascript errors, non-existent services, etc)\n         * they will not throw traditionally. You must listen for this $stateChangeError event to\n         * catch **ALL** errors.\n         *\n         * @param {Object} event Event object.\n         * @param {State} toState The state being transitioned to.\n         * @param {Object} toParams The params supplied to the `toState`.\n         * @param {State} fromState The current state, pre-transition.\n         * @param {Object} fromParams The params supplied to the `fromState`.\n         * @param {Error} error The resolve error object.\n         */\n        evt = $rootScope.$broadcast('$stateChangeError', to.self, toParams, from.self, fromParams, error);\n\n        if (!evt.defaultPrevented) {\n          $urlRouter.update();\n        }\n\n        return $q.reject(error);\n      });\n\n      return transition;\n    };\n\n    /**\n     * @ngdoc function\n     * @name ui.router.state.$state#is\n     * @methodOf ui.router.state.$state\n     *\n     * @description\n     * Similar to {@link ui.router.state.$state#methods_includes $state.includes},\n     * but only checks for the full state name. If params is supplied then it will be\n     * tested for strict equality against the current active params object, so all params\n     * must match with none missing and no extras.\n     *\n     * @example\n     * <pre>\n     * $state.$current.name = 'contacts.details.item';\n     *\n     * // absolute name\n     * $state.is('contact.details.item'); // returns true\n     * $state.is(contactDetailItemStateObject); // returns true\n     *\n     * // relative name (. and ^), typically from a template\n     * // E.g. from the 'contacts.details' template\n     * <div ng-class=\"{highlighted: $state.is('.item')}\">Item</div>\n     * </pre>\n     *\n     * @param {string|object} stateOrName The state name (absolute or relative) or state object you'd like to check.\n     * @param {object=} params A param object, e.g. `{sectionId: section.id}`, that you'd like\n     * to test against the current active state.\n     * @param {object=} options An options object.  The options are:\n     *\n     * - **`relative`** - {string|object} -  If `stateOrName` is a relative state name and `options.relative` is set, .is will\n     * test relative to `options.relative` state (or name).\n     *\n     * @returns {boolean} Returns true if it is the state.\n     */\n    $state.is = function is(stateOrName, params, options) {\n      options = extend({ relative: $state.$current }, options || {});\n      var state = findState(stateOrName, options.relative);\n\n      if (!isDefined(state)) { return undefined; }\n      if ($state.$current !== state) { return false; }\n      return params ? equalForKeys(state.params.$$values(params), $stateParams) : true;\n    };\n\n    /**\n     * @ngdoc function\n     * @name ui.router.state.$state#includes\n     * @methodOf ui.router.state.$state\n     *\n     * @description\n     * A method to determine if the current active state is equal to or is the child of the\n     * state stateName. If any params are passed then they will be tested for a match as well.\n     * Not all the parameters need to be passed, just the ones you'd like to test for equality.\n     *\n     * @example\n     * Partial and relative names\n     * <pre>\n     * $state.$current.name = 'contacts.details.item';\n     *\n     * // Using partial names\n     * $state.includes(\"contacts\"); // returns true\n     * $state.includes(\"contacts.details\"); // returns true\n     * $state.includes(\"contacts.details.item\"); // returns true\n     * $state.includes(\"contacts.list\"); // returns false\n     * $state.includes(\"about\"); // returns false\n     *\n     * // Using relative names (. and ^), typically from a template\n     * // E.g. from the 'contacts.details' template\n     * <div ng-class=\"{highlighted: $state.includes('.item')}\">Item</div>\n     * </pre>\n     *\n     * Basic globbing patterns\n     * <pre>\n     * $state.$current.name = 'contacts.details.item.url';\n     *\n     * $state.includes(\"*.details.*.*\"); // returns true\n     * $state.includes(\"*.details.**\"); // returns true\n     * $state.includes(\"**.item.**\"); // returns true\n     * $state.includes(\"*.details.item.url\"); // returns true\n     * $state.includes(\"*.details.*.url\"); // returns true\n     * $state.includes(\"*.details.*\"); // returns false\n     * $state.includes(\"item.**\"); // returns false\n     * </pre>\n     *\n     * @param {string} stateOrName A partial name, relative name, or glob pattern\n     * to be searched for within the current state name.\n     * @param {object=} params A param object, e.g. `{sectionId: section.id}`,\n     * that you'd like to test against the current active state.\n     * @param {object=} options An options object.  The options are:\n     *\n     * - **`relative`** - {string|object=} -  If `stateOrName` is a relative state reference and `options.relative` is set,\n     * .includes will test relative to `options.relative` state (or name).\n     *\n     * @returns {boolean} Returns true if it does include the state\n     */\n    $state.includes = function includes(stateOrName, params, options) {\n      options = extend({ relative: $state.$current }, options || {});\n      if (isString(stateOrName) && isGlob(stateOrName)) {\n        if (!doesStateMatchGlob(stateOrName)) {\n          return false;\n        }\n        stateOrName = $state.$current.name;\n      }\n\n      var state = findState(stateOrName, options.relative);\n      if (!isDefined(state)) { return undefined; }\n      if (!isDefined($state.$current.includes[state.name])) { return false; }\n      if (!params) { return true; }\n\n      var keys = objectKeys(params);\n      for (var i = 0; i < keys.length; i++) {\n        var key = keys[i], paramDef = state.params[key];\n        if (paramDef && !paramDef.type.equals($stateParams[key], params[key])) {\n          return false;\n        }\n      }\n\n      return true;\n    };\n\n\n    /**\n     * @ngdoc function\n     * @name ui.router.state.$state#href\n     * @methodOf ui.router.state.$state\n     *\n     * @description\n     * A url generation method that returns the compiled url for the given state populated with the given params.\n     *\n     * @example\n     * <pre>\n     * expect($state.href(\"about.person\", { person: \"bob\" })).toEqual(\"/about/bob\");\n     * </pre>\n     *\n     * @param {string|object} stateOrName The state name or state object you'd like to generate a url from.\n     * @param {object=} params An object of parameter values to fill the state's required parameters.\n     * @param {object=} options Options object. The options are:\n     *\n     * - **`lossy`** - {boolean=true} -  If true, and if there is no url associated with the state provided in the\n     *    first parameter, then the constructed href url will be built from the first navigable ancestor (aka\n     *    ancestor with a valid url).\n     * - **`inherit`** - {boolean=true}, If `true` will inherit url parameters from current url.\n     * - **`relative`** - {object=$state.$current}, When transitioning with relative path (e.g '^'), \n     *    defines which state to be relative from.\n     * - **`absolute`** - {boolean=false},  If true will generate an absolute url, e.g. \"http://www.example.com/fullurl\".\n     * \n     * @returns {string} compiled state url\n     */\n    $state.href = function href(stateOrName, params, options) {\n      options = extend({\n        lossy:    true,\n        inherit:  true,\n        absolute: false,\n        relative: $state.$current\n      }, options || {});\n\n      var state = findState(stateOrName, options.relative);\n\n      if (!isDefined(state)) return null;\n      if (options.inherit) params = inheritParams($stateParams, params || {}, $state.$current, state);\n      \n      var nav = (state && options.lossy) ? state.navigable : state;\n\n      if (!nav || nav.url === undefined || nav.url === null) {\n        return null;\n      }\n      return $urlRouter.href(nav.url, filterByKeys(state.params.$$keys().concat('#'), params || {}), {\n        absolute: options.absolute\n      });\n    };\n\n    /**\n     * @ngdoc function\n     * @name ui.router.state.$state#get\n     * @methodOf ui.router.state.$state\n     *\n     * @description\n     * Returns the state configuration object for any specific state or all states.\n     *\n     * @param {string|object=} stateOrName (absolute or relative) If provided, will only get the config for\n     * the requested state. If not provided, returns an array of ALL state configs.\n     * @param {string|object=} context When stateOrName is a relative state reference, the state will be retrieved relative to context.\n     * @returns {Object|Array} State configuration object or array of all objects.\n     */\n    $state.get = function (stateOrName, context) {\n      if (arguments.length === 0) return map(objectKeys(states), function(name) { return states[name].self; });\n      var state = findState(stateOrName, context || $state.$current);\n      return (state && state.self) ? state.self : null;\n    };\n\n    function resolveState(state, params, paramsAreFiltered, inherited, dst, options) {\n      // Make a restricted $stateParams with only the parameters that apply to this state if\n      // necessary. In addition to being available to the controller and onEnter/onExit callbacks,\n      // we also need $stateParams to be available for any $injector calls we make during the\n      // dependency resolution process.\n      var $stateParams = (paramsAreFiltered) ? params : filterByKeys(state.params.$$keys(), params);\n      var locals = { $stateParams: $stateParams };\n\n      // Resolve 'global' dependencies for the state, i.e. those not specific to a view.\n      // We're also including $stateParams in this; that way the parameters are restricted\n      // to the set that should be visible to the state, and are independent of when we update\n      // the global $state and $stateParams values.\n      dst.resolve = $resolve.resolve(state.resolve, locals, dst.resolve, state);\n      var promises = [dst.resolve.then(function (globals) {\n        dst.globals = globals;\n      })];\n      if (inherited) promises.push(inherited);\n\n      function resolveViews() {\n        var viewsPromises = [];\n\n        // Resolve template and dependencies for all views.\n        forEach(state.views, function (view, name) {\n          var injectables = (view.resolve && view.resolve !== state.resolve ? view.resolve : {});\n          injectables.$template = [ function () {\n            return $view.load(name, { view: view, locals: dst.globals, params: $stateParams, notify: options.notify }) || '';\n          }];\n\n          viewsPromises.push($resolve.resolve(injectables, dst.globals, dst.resolve, state).then(function (result) {\n            // References to the controller (only instantiated at link time)\n            if (isFunction(view.controllerProvider) || isArray(view.controllerProvider)) {\n              var injectLocals = angular.extend({}, injectables, dst.globals);\n              result.$$controller = $injector.invoke(view.controllerProvider, null, injectLocals);\n            } else {\n              result.$$controller = view.controller;\n            }\n            // Provide access to the state itself for internal use\n            result.$$state = state;\n            result.$$controllerAs = view.controllerAs;\n            result.$$resolveAs = view.resolveAs;\n            dst[name] = result;\n          }));\n        });\n\n        return $q.all(viewsPromises).then(function(){\n          return dst.globals;\n        });\n      }\n\n      // Wait for all the promises and then return the activation object\n      return $q.all(promises).then(resolveViews).then(function (values) {\n        return dst;\n      });\n    }\n\n    return $state;\n  }\n\n  function shouldSkipReload(to, toParams, from, fromParams, locals, options) {\n    // Return true if there are no differences in non-search (path/object) params, false if there are differences\n    function nonSearchParamsEqual(fromAndToState, fromParams, toParams) {\n      // Identify whether all the parameters that differ between `fromParams` and `toParams` were search params.\n      function notSearchParam(key) {\n        return fromAndToState.params[key].location != \"search\";\n      }\n      var nonQueryParamKeys = fromAndToState.params.$$keys().filter(notSearchParam);\n      var nonQueryParams = pick.apply({}, [fromAndToState.params].concat(nonQueryParamKeys));\n      var nonQueryParamSet = new $$UMFP.ParamSet(nonQueryParams);\n      return nonQueryParamSet.$$equals(fromParams, toParams);\n    }\n\n    // If reload was not explicitly requested\n    // and we're transitioning to the same state we're already in\n    // and    the locals didn't change\n    //     or they changed in a way that doesn't merit reloading\n    //        (reloadOnParams:false, or reloadOnSearch.false and only search params changed)\n    // Then return true.\n    if (!options.reload && to === from &&\n      (locals === from.locals || (to.self.reloadOnSearch === false && nonSearchParamsEqual(from, fromParams, toParams)))) {\n      return true;\n    }\n  }\n}\n\nangular.module('ui.router.state')\n  .factory('$stateParams', function () { return {}; })\n  .constant(\"$state.runtime\", { autoinject: true })\n  .provider('$state', $StateProvider)\n  // Inject $state to initialize when entering runtime. #2574\n  .run(['$injector', function ($injector) {\n    // Allow tests (stateSpec.js) to turn this off by defining this constant\n    if ($injector.get(\"$state.runtime\").autoinject) {\n      $injector.get('$state');\n    }\n  }]);\n\n\n$ViewProvider.$inject = [];\nfunction $ViewProvider() {\n\n  this.$get = $get;\n  /**\n   * @ngdoc object\n   * @name ui.router.state.$view\n   *\n   * @requires ui.router.util.$templateFactory\n   * @requires $rootScope\n   *\n   * @description\n   *\n   */\n  $get.$inject = ['$rootScope', '$templateFactory'];\n  function $get(   $rootScope,   $templateFactory) {\n    return {\n      // $view.load('full.viewName', { template: ..., controller: ..., resolve: ..., async: false, params: ... })\n      /**\n       * @ngdoc function\n       * @name ui.router.state.$view#load\n       * @methodOf ui.router.state.$view\n       *\n       * @description\n       *\n       * @param {string} name name\n       * @param {object} options option object.\n       */\n      load: function load(name, options) {\n        var result, defaults = {\n          template: null, controller: null, view: null, locals: null, notify: true, async: true, params: {}\n        };\n        options = extend(defaults, options);\n\n        if (options.view) {\n          result = $templateFactory.fromConfig(options.view, options.params, options.locals);\n        }\n        return result;\n      }\n    };\n  }\n}\n\nangular.module('ui.router.state').provider('$view', $ViewProvider);\n\n/**\n * @ngdoc object\n * @name ui.router.state.$uiViewScrollProvider\n *\n * @description\n * Provider that returns the {@link ui.router.state.$uiViewScroll} service function.\n */\nfunction $ViewScrollProvider() {\n\n  var useAnchorScroll = false;\n\n  /**\n   * @ngdoc function\n   * @name ui.router.state.$uiViewScrollProvider#useAnchorScroll\n   * @methodOf ui.router.state.$uiViewScrollProvider\n   *\n   * @description\n   * Reverts back to using the core [`$anchorScroll`](http://docs.angularjs.org/api/ng.$anchorScroll) service for\n   * scrolling based on the url anchor.\n   */\n  this.useAnchorScroll = function () {\n    useAnchorScroll = true;\n  };\n\n  /**\n   * @ngdoc object\n   * @name ui.router.state.$uiViewScroll\n   *\n   * @requires $anchorScroll\n   * @requires $timeout\n   *\n   * @description\n   * When called with a jqLite element, it scrolls the element into view (after a\n   * `$timeout` so the DOM has time to refresh).\n   *\n   * If you prefer to rely on `$anchorScroll` to scroll the view to the anchor,\n   * this can be enabled by calling {@link ui.router.state.$uiViewScrollProvider#methods_useAnchorScroll `$uiViewScrollProvider.useAnchorScroll()`}.\n   */\n  this.$get = ['$anchorScroll', '$timeout', function ($anchorScroll, $timeout) {\n    if (useAnchorScroll) {\n      return $anchorScroll;\n    }\n\n    return function ($element) {\n      return $timeout(function () {\n        $element[0].scrollIntoView();\n      }, 0, false);\n    };\n  }];\n}\n\nangular.module('ui.router.state').provider('$uiViewScroll', $ViewScrollProvider);\n\n/**\n * @ngdoc directive\n * @name ui.router.state.directive:ui-view\n *\n * @requires ui.router.state.$state\n * @requires $compile\n * @requires $controller\n * @requires $injector\n * @requires ui.router.state.$uiViewScroll\n * @requires $document\n *\n * @restrict ECA\n *\n * @description\n * The ui-view directive tells $state where to place your templates.\n *\n * @param {string=} name A view name. The name should be unique amongst the other views in the\n * same state. You can have views of the same name that live in different states.\n *\n * @param {string=} autoscroll It allows you to set the scroll behavior of the browser window\n * when a view is populated. By default, $anchorScroll is overridden by ui-router's custom scroll\n * service, {@link ui.router.state.$uiViewScroll}. This custom service let's you\n * scroll ui-view elements into view when they are populated during a state activation.\n *\n * *Note: To revert back to old [`$anchorScroll`](http://docs.angularjs.org/api/ng.$anchorScroll)\n * functionality, call `$uiViewScrollProvider.useAnchorScroll()`.*\n *\n * @param {string=} onload Expression to evaluate whenever the view updates.\n *\n * @example\n * A view can be unnamed or named.\n * <pre>\n * <!-- Unnamed -->\n * <div ui-view></div>\n *\n * <!-- Named -->\n * <div ui-view=\"viewName\"></div>\n * </pre>\n *\n * You can only have one unnamed view within any template (or root html). If you are only using a\n * single view and it is unnamed then you can populate it like so:\n * <pre>\n * <div ui-view></div>\n * $stateProvider.state(\"home\", {\n *   template: \"<h1>HELLO!</h1>\"\n * })\n * </pre>\n *\n * The above is a convenient shortcut equivalent to specifying your view explicitly with the {@link ui.router.state.$stateProvider#methods_state `views`}\n * config property, by name, in this case an empty name:\n * <pre>\n * $stateProvider.state(\"home\", {\n *   views: {\n *     \"\": {\n *       template: \"<h1>HELLO!</h1>\"\n *     }\n *   }    \n * })\n * </pre>\n *\n * But typically you'll only use the views property if you name your view or have more than one view\n * in the same template. There's not really a compelling reason to name a view if its the only one,\n * but you could if you wanted, like so:\n * <pre>\n * <div ui-view=\"main\"></div>\n * </pre>\n * <pre>\n * $stateProvider.state(\"home\", {\n *   views: {\n *     \"main\": {\n *       template: \"<h1>HELLO!</h1>\"\n *     }\n *   }    \n * })\n * </pre>\n *\n * Really though, you'll use views to set up multiple views:\n * <pre>\n * <div ui-view></div>\n * <div ui-view=\"chart\"></div>\n * <div ui-view=\"data\"></div>\n * </pre>\n *\n * <pre>\n * $stateProvider.state(\"home\", {\n *   views: {\n *     \"\": {\n *       template: \"<h1>HELLO!</h1>\"\n *     },\n *     \"chart\": {\n *       template: \"<chart_thing/>\"\n *     },\n *     \"data\": {\n *       template: \"<data_thing/>\"\n *     }\n *   }    \n * })\n * </pre>\n *\n * Examples for `autoscroll`:\n *\n * <pre>\n * <!-- If autoscroll present with no expression,\n *      then scroll ui-view into view -->\n * <ui-view autoscroll/>\n *\n * <!-- If autoscroll present with valid expression,\n *      then scroll ui-view into view if expression evaluates to true -->\n * <ui-view autoscroll='true'/>\n * <ui-view autoscroll='false'/>\n * <ui-view autoscroll='scopeVariable'/>\n * </pre>\n *\n * Resolve data:\n *\n * The resolved data from the state's `resolve` block is placed on the scope as `$resolve` (this\n * can be customized using [[ViewDeclaration.resolveAs]]).  This can be then accessed from the template.\n *\n * Note that when `controllerAs` is being used, `$resolve` is set on the controller instance *after* the\n * controller is instantiated.  The `$onInit()` hook can be used to perform initialization code which\n * depends on `$resolve` data.\n *\n * Example usage of $resolve in a view template\n * <pre>\n * $stateProvider.state('home', {\n *   template: '<my-component user=\"$resolve.user\"></my-component>',\n *   resolve: {\n *     user: function(UserService) { return UserService.fetchUser(); }\n *   }\n * });\n * </pre>\n */\n$ViewDirective.$inject = ['$state', '$injector', '$uiViewScroll', '$interpolate', '$q'];\nfunction $ViewDirective(   $state,   $injector,   $uiViewScroll,   $interpolate,   $q) {\n\n  function getService() {\n    return ($injector.has) ? function(service) {\n      return $injector.has(service) ? $injector.get(service) : null;\n    } : function(service) {\n      try {\n        return $injector.get(service);\n      } catch (e) {\n        return null;\n      }\n    };\n  }\n\n  var service = getService(),\n      $animator = service('$animator'),\n      $animate = service('$animate');\n\n  // Returns a set of DOM manipulation functions based on which Angular version\n  // it should use\n  function getRenderer(attrs, scope) {\n    var statics = function() {\n      return {\n        enter: function (element, target, cb) { target.after(element); cb(); },\n        leave: function (element, cb) { element.remove(); cb(); }\n      };\n    };\n\n    if ($animate) {\n      return {\n        enter: function(element, target, cb) {\n          if (angular.version.minor > 2) {\n            $animate.enter(element, null, target).then(cb);\n          } else {\n            $animate.enter(element, null, target, cb);\n          }\n        },\n        leave: function(element, cb) {\n          if (angular.version.minor > 2) {\n            $animate.leave(element).then(cb);\n          } else {\n            $animate.leave(element, cb);\n          }\n        }\n      };\n    }\n\n    if ($animator) {\n      var animate = $animator && $animator(scope, attrs);\n\n      return {\n        enter: function(element, target, cb) {animate.enter(element, null, target); cb(); },\n        leave: function(element, cb) { animate.leave(element); cb(); }\n      };\n    }\n\n    return statics();\n  }\n\n  var directive = {\n    restrict: 'ECA',\n    terminal: true,\n    priority: 400,\n    transclude: 'element',\n    compile: function (tElement, tAttrs, $transclude) {\n      return function (scope, $element, attrs) {\n        var previousEl, currentEl, currentScope, latestLocals,\n            onloadExp     = attrs.onload || '',\n            autoScrollExp = attrs.autoscroll,\n            renderer      = getRenderer(attrs, scope),\n            inherited     = $element.inheritedData('$uiView');\n\n        scope.$on('$stateChangeSuccess', function() {\n          updateView(false);\n        });\n\n        updateView(true);\n\n        function cleanupLastView() {\n          if (previousEl) {\n            previousEl.remove();\n            previousEl = null;\n          }\n\n          if (currentScope) {\n            currentScope.$destroy();\n            currentScope = null;\n          }\n\n          if (currentEl) {\n            var $uiViewData = currentEl.data('$uiViewAnim');\n            renderer.leave(currentEl, function() {\n              $uiViewData.$$animLeave.resolve();\n              previousEl = null;\n            });\n\n            previousEl = currentEl;\n            currentEl = null;\n          }\n        }\n\n        function updateView(firstTime) {\n          var newScope,\n              name            = getUiViewName(scope, attrs, $element, $interpolate),\n              previousLocals  = name && $state.$current && $state.$current.locals[name];\n\n          if (!firstTime && previousLocals === latestLocals) return; // nothing to do\n          newScope = scope.$new();\n          latestLocals = $state.$current.locals[name];\n\n          /**\n           * @ngdoc event\n           * @name ui.router.state.directive:ui-view#$viewContentLoading\n           * @eventOf ui.router.state.directive:ui-view\n           * @eventType emits on ui-view directive scope\n           * @description\n           *\n           * Fired once the view **begins loading**, *before* the DOM is rendered.\n           *\n           * @param {Object} event Event object.\n           * @param {string} viewName Name of the view.\n           */\n          newScope.$emit('$viewContentLoading', name);\n\n          var clone = $transclude(newScope, function(clone) {\n            var animEnter = $q.defer(), animLeave = $q.defer();\n            var viewAnimData = {\n              $animEnter: animEnter.promise,\n              $animLeave: animLeave.promise,\n              $$animLeave: animLeave\n            };\n\n            clone.data('$uiViewAnim', viewAnimData);\n            renderer.enter(clone, $element, function onUiViewEnter() {\n              animEnter.resolve();\n              if(currentScope) {\n                currentScope.$emit('$viewContentAnimationEnded');\n              }\n\n              if (angular.isDefined(autoScrollExp) && !autoScrollExp || scope.$eval(autoScrollExp)) {\n                $uiViewScroll(clone);\n              }\n            });\n            cleanupLastView();\n          });\n\n          currentEl = clone;\n          currentScope = newScope;\n          /**\n           * @ngdoc event\n           * @name ui.router.state.directive:ui-view#$viewContentLoaded\n           * @eventOf ui.router.state.directive:ui-view\n           * @eventType emits on ui-view directive scope\n           * @description\n           * Fired once the view is **loaded**, *after* the DOM is rendered.\n           *\n           * @param {Object} event Event object.\n           * @param {string} viewName Name of the view.\n           */\n          currentScope.$emit('$viewContentLoaded', name);\n          currentScope.$eval(onloadExp);\n        }\n      };\n    }\n  };\n\n  return directive;\n}\n\n$ViewDirectiveFill.$inject = ['$compile', '$controller', '$state', '$interpolate'];\nfunction $ViewDirectiveFill (  $compile,   $controller,   $state,   $interpolate) {\n  return {\n    restrict: 'ECA',\n    priority: -400,\n    compile: function (tElement) {\n      var initial = tElement.html();\n      return function (scope, $element, attrs) {\n        var current = $state.$current,\n            name = getUiViewName(scope, attrs, $element, $interpolate),\n            locals  = current && current.locals[name];\n\n        if (! locals) {\n          return;\n        }\n\n        $element.data('$uiView', { name: name, state: locals.$$state });\n        $element.html(locals.$template ? locals.$template : initial);\n\n        var resolveData = angular.extend({}, locals);\n        scope[locals.$$resolveAs] = resolveData;\n\n        var link = $compile($element.contents());\n\n        if (locals.$$controller) {\n          locals.$scope = scope;\n          locals.$element = $element;\n          var controller = $controller(locals.$$controller, locals);\n          if (locals.$$controllerAs) {\n            scope[locals.$$controllerAs] = controller;\n            scope[locals.$$controllerAs][locals.$$resolveAs] = resolveData;\n          }\n          if (isFunction(controller.$onInit)) controller.$onInit();\n          $element.data('$ngControllerController', controller);\n          $element.children().data('$ngControllerController', controller);\n        }\n\n        link(scope);\n      };\n    }\n  };\n}\n\n/**\n * Shared ui-view code for both directives:\n * Given scope, element, and its attributes, return the view's name\n */\nfunction getUiViewName(scope, attrs, element, $interpolate) {\n  var name = $interpolate(attrs.uiView || attrs.name || '')(scope);\n  var uiViewCreatedBy = element.inheritedData('$uiView');\n  return name.indexOf('@') >= 0 ?  name :  (name + '@' + (uiViewCreatedBy ? uiViewCreatedBy.state.name : ''));\n}\n\nangular.module('ui.router.state').directive('uiView', $ViewDirective);\nangular.module('ui.router.state').directive('uiView', $ViewDirectiveFill);\n\nfunction parseStateRef(ref, current) {\n  var preparsed = ref.match(/^\\s*({[^}]*})\\s*$/), parsed;\n  if (preparsed) ref = current + '(' + preparsed[1] + ')';\n  parsed = ref.replace(/\\n/g, \" \").match(/^([^(]+?)\\s*(\\((.*)\\))?$/);\n  if (!parsed || parsed.length !== 4) throw new Error(\"Invalid state ref '\" + ref + \"'\");\n  return { state: parsed[1], paramExpr: parsed[3] || null };\n}\n\nfunction stateContext(el) {\n  var stateData = el.parent().inheritedData('$uiView');\n\n  if (stateData && stateData.state && stateData.state.name) {\n    return stateData.state;\n  }\n}\n\nfunction getTypeInfo(el) {\n  // SVGAElement does not use the href attribute, but rather the 'xlinkHref' attribute.\n  var isSvg = Object.prototype.toString.call(el.prop('href')) === '[object SVGAnimatedString]';\n  var isForm = el[0].nodeName === \"FORM\";\n\n  return {\n    attr: isForm ? \"action\" : (isSvg ? 'xlink:href' : 'href'),\n    isAnchor: el.prop(\"tagName\").toUpperCase() === \"A\",\n    clickable: !isForm\n  };\n}\n\nfunction clickHook(el, $state, $timeout, type, current) {\n  return function(e) {\n    var button = e.which || e.button, target = current();\n\n    if (!(button > 1 || e.ctrlKey || e.metaKey || e.shiftKey || el.attr('target'))) {\n      // HACK: This is to allow ng-clicks to be processed before the transition is initiated:\n      var transition = $timeout(function() {\n        $state.go(target.state, target.params, target.options);\n      });\n      e.preventDefault();\n\n      // if the state has no URL, ignore one preventDefault from the <a> directive.\n      var ignorePreventDefaultCount = type.isAnchor && !target.href ? 1: 0;\n\n      e.preventDefault = function() {\n        if (ignorePreventDefaultCount-- <= 0) $timeout.cancel(transition);\n      };\n    }\n  };\n}\n\nfunction defaultOpts(el, $state) {\n  return { relative: stateContext(el) || $state.$current, inherit: true };\n}\n\n/**\n * @ngdoc directive\n * @name ui.router.state.directive:ui-sref\n *\n * @requires ui.router.state.$state\n * @requires $timeout\n *\n * @restrict A\n *\n * @description\n * A directive that binds a link (`<a>` tag) to a state. If the state has an associated\n * URL, the directive will automatically generate & update the `href` attribute via\n * the {@link ui.router.state.$state#methods_href $state.href()} method. Clicking\n * the link will trigger a state transition with optional parameters.\n *\n * Also middle-clicking, right-clicking, and ctrl-clicking on the link will be\n * handled natively by the browser.\n *\n * You can also use relative state paths within ui-sref, just like the relative\n * paths passed to `$state.go()`. You just need to be aware that the path is relative\n * to the state that the link lives in, in other words the state that loaded the\n * template containing the link.\n *\n * You can specify options to pass to {@link ui.router.state.$state#methods_go $state.go()}\n * using the `ui-sref-opts` attribute. Options are restricted to `location`, `inherit`,\n * and `reload`.\n *\n * @example\n * Here's an example of how you'd use ui-sref and how it would compile. If you have the\n * following template:\n * <pre>\n * <a ui-sref=\"home\">Home</a> | <a ui-sref=\"about\">About</a> | <a ui-sref=\"{page: 2}\">Next page</a>\n *\n * <ul>\n *     <li ng-repeat=\"contact in contacts\">\n *         <a ui-sref=\"contacts.detail({ id: contact.id })\">{{ contact.name }}</a>\n *     </li>\n * </ul>\n * </pre>\n *\n * Then the compiled html would be (assuming Html5Mode is off and current state is contacts):\n * <pre>\n * <a href=\"#/home\" ui-sref=\"home\">Home</a> | <a href=\"#/about\" ui-sref=\"about\">About</a> | <a href=\"#/contacts?page=2\" ui-sref=\"{page: 2}\">Next page</a>\n *\n * <ul>\n *     <li ng-repeat=\"contact in contacts\">\n *         <a href=\"#/contacts/1\" ui-sref=\"contacts.detail({ id: contact.id })\">Joe</a>\n *     </li>\n *     <li ng-repeat=\"contact in contacts\">\n *         <a href=\"#/contacts/2\" ui-sref=\"contacts.detail({ id: contact.id })\">Alice</a>\n *     </li>\n *     <li ng-repeat=\"contact in contacts\">\n *         <a href=\"#/contacts/3\" ui-sref=\"contacts.detail({ id: contact.id })\">Bob</a>\n *     </li>\n * </ul>\n *\n * <a ui-sref=\"home\" ui-sref-opts=\"{reload: true}\">Home</a>\n * </pre>\n *\n * @param {string} ui-sref 'stateName' can be any valid absolute or relative state\n * @param {Object} ui-sref-opts options to pass to {@link ui.router.state.$state#methods_go $state.go()}\n */\n$StateRefDirective.$inject = ['$state', '$timeout'];\nfunction $StateRefDirective($state, $timeout) {\n  return {\n    restrict: 'A',\n    require: ['?^uiSrefActive', '?^uiSrefActiveEq'],\n    link: function(scope, element, attrs, uiSrefActive) {\n      var ref    = parseStateRef(attrs.uiSref, $state.current.name);\n      var def    = { state: ref.state, href: null, params: null };\n      var type   = getTypeInfo(element);\n      var active = uiSrefActive[1] || uiSrefActive[0];\n      var unlinkInfoFn = null;\n      var hookFn;\n\n      def.options = extend(defaultOpts(element, $state), attrs.uiSrefOpts ? scope.$eval(attrs.uiSrefOpts) : {});\n\n      var update = function(val) {\n        if (val) def.params = angular.copy(val);\n        def.href = $state.href(ref.state, def.params, def.options);\n\n        if (unlinkInfoFn) unlinkInfoFn();\n        if (active) unlinkInfoFn = active.$$addStateInfo(ref.state, def.params);\n        if (def.href !== null) attrs.$set(type.attr, def.href);\n      };\n\n      if (ref.paramExpr) {\n        scope.$watch(ref.paramExpr, function(val) { if (val !== def.params) update(val); }, true);\n        def.params = angular.copy(scope.$eval(ref.paramExpr));\n      }\n      update();\n\n      if (!type.clickable) return;\n      hookFn = clickHook(element, $state, $timeout, type, function() { return def; });\n      element[element.on ? 'on' : 'bind'](\"click\", hookFn);\n      scope.$on('$destroy', function() {\n        element[element.off ? 'off' : 'unbind'](\"click\", hookFn);\n      });\n    }\n  };\n}\n\n/**\n * @ngdoc directive\n * @name ui.router.state.directive:ui-state\n *\n * @requires ui.router.state.uiSref\n *\n * @restrict A\n *\n * @description\n * Much like ui-sref, but will accept named $scope properties to evaluate for a state definition,\n * params and override options.\n *\n * @param {string} ui-state 'stateName' can be any valid absolute or relative state\n * @param {Object} ui-state-params params to pass to {@link ui.router.state.$state#methods_href $state.href()}\n * @param {Object} ui-state-opts options to pass to {@link ui.router.state.$state#methods_go $state.go()}\n */\n$StateRefDynamicDirective.$inject = ['$state', '$timeout'];\nfunction $StateRefDynamicDirective($state, $timeout) {\n  return {\n    restrict: 'A',\n    require: ['?^uiSrefActive', '?^uiSrefActiveEq'],\n    link: function(scope, element, attrs, uiSrefActive) {\n      var type   = getTypeInfo(element);\n      var active = uiSrefActive[1] || uiSrefActive[0];\n      var group  = [attrs.uiState, attrs.uiStateParams || null, attrs.uiStateOpts || null];\n      var watch  = '[' + group.map(function(val) { return val || 'null'; }).join(', ') + ']';\n      var def    = { state: null, params: null, options: null, href: null };\n      var unlinkInfoFn = null;\n      var hookFn;\n\n      function runStateRefLink (group) {\n        def.state = group[0]; def.params = group[1]; def.options = group[2];\n        def.href = $state.href(def.state, def.params, def.options);\n\n        if (unlinkInfoFn) unlinkInfoFn();\n        if (active) unlinkInfoFn = active.$$addStateInfo(def.state, def.params);\n        if (def.href) attrs.$set(type.attr, def.href);\n      }\n\n      scope.$watch(watch, runStateRefLink, true);\n      runStateRefLink(scope.$eval(watch));\n\n      if (!type.clickable) return;\n      hookFn = clickHook(element, $state, $timeout, type, function() { return def; });\n      element[element.on ? 'on' : 'bind'](\"click\", hookFn);\n      scope.$on('$destroy', function() {\n        element[element.off ? 'off' : 'unbind'](\"click\", hookFn);\n      });\n    }\n  };\n}\n\n\n/**\n * @ngdoc directive\n * @name ui.router.state.directive:ui-sref-active\n *\n * @requires ui.router.state.$state\n * @requires ui.router.state.$stateParams\n * @requires $interpolate\n *\n * @restrict A\n *\n * @description\n * A directive working alongside ui-sref to add classes to an element when the\n * related ui-sref directive's state is active, and removing them when it is inactive.\n * The primary use-case is to simplify the special appearance of navigation menus\n * relying on `ui-sref`, by having the \"active\" state's menu button appear different,\n * distinguishing it from the inactive menu items.\n *\n * ui-sref-active can live on the same element as ui-sref or on a parent element. The first\n * ui-sref-active found at the same level or above the ui-sref will be used.\n *\n * Will activate when the ui-sref's target state or any child state is active. If you\n * need to activate only when the ui-sref target state is active and *not* any of\n * it's children, then you will use\n * {@link ui.router.state.directive:ui-sref-active-eq ui-sref-active-eq}\n *\n * @example\n * Given the following template:\n * <pre>\n * <ul>\n *   <li ui-sref-active=\"active\" class=\"item\">\n *     <a href ui-sref=\"app.user({user: 'bilbobaggins'})\">@bilbobaggins</a>\n *   </li>\n * </ul>\n * </pre>\n *\n *\n * When the app state is \"app.user\" (or any children states), and contains the state parameter \"user\" with value \"bilbobaggins\",\n * the resulting HTML will appear as (note the 'active' class):\n * <pre>\n * <ul>\n *   <li ui-sref-active=\"active\" class=\"item active\">\n *     <a ui-sref=\"app.user({user: 'bilbobaggins'})\" href=\"/users/bilbobaggins\">@bilbobaggins</a>\n *   </li>\n * </ul>\n * </pre>\n *\n * The class name is interpolated **once** during the directives link time (any further changes to the\n * interpolated value are ignored).\n *\n * Multiple classes may be specified in a space-separated format:\n * <pre>\n * <ul>\n *   <li ui-sref-active='class1 class2 class3'>\n *     <a ui-sref=\"app.user\">link</a>\n *   </li>\n * </ul>\n * </pre>\n *\n * It is also possible to pass ui-sref-active an expression that evaluates\n * to an object hash, whose keys represent active class names and whose\n * values represent the respective state names/globs.\n * ui-sref-active will match if the current active state **includes** any of\n * the specified state names/globs, even the abstract ones.\n *\n * @Example\n * Given the following template, with \"admin\" being an abstract state:\n * <pre>\n * <div ui-sref-active=\"{'active': 'admin.*'}\">\n *   <a ui-sref-active=\"active\" ui-sref=\"admin.roles\">Roles</a>\n * </div>\n * </pre>\n *\n * When the current state is \"admin.roles\" the \"active\" class will be applied\n * to both the <div> and <a> elements. It is important to note that the state\n * names/globs passed to ui-sref-active shadow the state provided by ui-sref.\n */\n\n/**\n * @ngdoc directive\n * @name ui.router.state.directive:ui-sref-active-eq\n *\n * @requires ui.router.state.$state\n * @requires ui.router.state.$stateParams\n * @requires $interpolate\n *\n * @restrict A\n *\n * @description\n * The same as {@link ui.router.state.directive:ui-sref-active ui-sref-active} but will only activate\n * when the exact target state used in the `ui-sref` is active; no child states.\n *\n */\n$StateRefActiveDirective.$inject = ['$state', '$stateParams', '$interpolate'];\nfunction $StateRefActiveDirective($state, $stateParams, $interpolate) {\n  return  {\n    restrict: \"A\",\n    controller: ['$scope', '$element', '$attrs', '$timeout', function ($scope, $element, $attrs, $timeout) {\n      var states = [], activeClasses = {}, activeEqClass, uiSrefActive;\n\n      // There probably isn't much point in $observing this\n      // uiSrefActive and uiSrefActiveEq share the same directive object with some\n      // slight difference in logic routing\n      activeEqClass = $interpolate($attrs.uiSrefActiveEq || '', false)($scope);\n\n      try {\n        uiSrefActive = $scope.$eval($attrs.uiSrefActive);\n      } catch (e) {\n        // Do nothing. uiSrefActive is not a valid expression.\n        // Fall back to using $interpolate below\n      }\n      uiSrefActive = uiSrefActive || $interpolate($attrs.uiSrefActive || '', false)($scope);\n      if (isObject(uiSrefActive)) {\n        forEach(uiSrefActive, function(stateOrName, activeClass) {\n          if (isString(stateOrName)) {\n            var ref = parseStateRef(stateOrName, $state.current.name);\n            addState(ref.state, $scope.$eval(ref.paramExpr), activeClass);\n          }\n        });\n      }\n\n      // Allow uiSref to communicate with uiSrefActive[Equals]\n      this.$$addStateInfo = function (newState, newParams) {\n        // we already got an explicit state provided by ui-sref-active, so we\n        // shadow the one that comes from ui-sref\n        if (isObject(uiSrefActive) && states.length > 0) {\n          return;\n        }\n        var deregister = addState(newState, newParams, uiSrefActive);\n        update();\n        return deregister;\n      };\n\n      $scope.$on('$stateChangeSuccess', update);\n\n      function addState(stateName, stateParams, activeClass) {\n        var state = $state.get(stateName, stateContext($element));\n        var stateHash = createStateHash(stateName, stateParams);\n\n        var stateInfo = {\n          state: state || { name: stateName },\n          params: stateParams,\n          hash: stateHash\n        };\n\n        states.push(stateInfo);\n        activeClasses[stateHash] = activeClass;\n\n        return function removeState() {\n          var idx = states.indexOf(stateInfo);\n          if (idx !== -1) states.splice(idx, 1);\n        };\n      }\n\n      /**\n       * @param {string} state\n       * @param {Object|string} [params]\n       * @return {string}\n       */\n      function createStateHash(state, params) {\n        if (!isString(state)) {\n          throw new Error('state should be a string');\n        }\n        if (isObject(params)) {\n          return state + toJson(params);\n        }\n        params = $scope.$eval(params);\n        if (isObject(params)) {\n          return state + toJson(params);\n        }\n        return state;\n      }\n\n      // Update route state\n      function update() {\n        for (var i = 0; i < states.length; i++) {\n          if (anyMatch(states[i].state, states[i].params)) {\n            addClass($element, activeClasses[states[i].hash]);\n          } else {\n            removeClass($element, activeClasses[states[i].hash]);\n          }\n\n          if (exactMatch(states[i].state, states[i].params)) {\n            addClass($element, activeEqClass);\n          } else {\n            removeClass($element, activeEqClass);\n          }\n        }\n      }\n\n      function addClass(el, className) { $timeout(function () { el.addClass(className); }); }\n      function removeClass(el, className) { el.removeClass(className); }\n      function anyMatch(state, params) { return $state.includes(state.name, params); }\n      function exactMatch(state, params) { return $state.is(state.name, params); }\n\n      update();\n    }]\n  };\n}\n\nangular.module('ui.router.state')\n  .directive('uiSref', $StateRefDirective)\n  .directive('uiSrefActive', $StateRefActiveDirective)\n  .directive('uiSrefActiveEq', $StateRefActiveDirective)\n  .directive('uiState', $StateRefDynamicDirective);\n\n/**\n * @ngdoc filter\n * @name ui.router.state.filter:isState\n *\n * @requires ui.router.state.$state\n *\n * @description\n * Translates to {@link ui.router.state.$state#methods_is $state.is(\"stateName\")}.\n */\n$IsStateFilter.$inject = ['$state'];\nfunction $IsStateFilter($state) {\n  var isFilter = function (state, params) {\n    return $state.is(state, params);\n  };\n  isFilter.$stateful = true;\n  return isFilter;\n}\n\n/**\n * @ngdoc filter\n * @name ui.router.state.filter:includedByState\n *\n * @requires ui.router.state.$state\n *\n * @description\n * Translates to {@link ui.router.state.$state#methods_includes $state.includes('fullOrPartialStateName')}.\n */\n$IncludedByStateFilter.$inject = ['$state'];\nfunction $IncludedByStateFilter($state) {\n  var includesFilter = function (state, params, options) {\n    return $state.includes(state, params, options);\n  };\n  includesFilter.$stateful = true;\n  return  includesFilter;\n}\n\nangular.module('ui.router.state')\n  .filter('isState', $IsStateFilter)\n  .filter('includedByState', $IncludedByStateFilter);\n})(window, window.angular);\n// THIS FILE IS GENERATED - DO NOT EDIT!\n/*!mobile-detect v1.3.5 2016-11-14*/\n/*global module:false, define:false*/\n/*jshint latedef:false*/\n/*!@license Copyright 2013, Heinrich Goebl, License: MIT, see https://github.com/hgoebl/mobile-detect.js*/\n(function (define, undefined) {\ndefine(function () {\n    'use strict';\n\n    var impl = {};\n\n    impl.mobileDetectRules = {\n    \"phones\": {\n        \"iPhone\": \"\\\\biPhone\\\\b|\\\\biPod\\\\b\",\n        \"BlackBerry\": \"BlackBerry|\\\\bBB10\\\\b|rim[0-9]+\",\n        \"HTC\": \"HTC|HTC.*(Sensation|Evo|Vision|Explorer|6800|8100|8900|A7272|S510e|C110e|Legend|Desire|T8282)|APX515CKT|Qtek9090|APA9292KT|HD_mini|Sensation.*Z710e|PG86100|Z715e|Desire.*(A8181|HD)|ADR6200|ADR6400L|ADR6425|001HT|Inspire 4G|Android.*\\\\bEVO\\\\b|T-Mobile G1|Z520m\",\n        \"Nexus\": \"Nexus One|Nexus S|Galaxy.*Nexus|Android.*Nexus.*Mobile|Nexus 4|Nexus 5|Nexus 6\",\n        \"Dell\": \"Dell.*Streak|Dell.*Aero|Dell.*Venue|DELL.*Venue Pro|Dell Flash|Dell Smoke|Dell Mini 3iX|XCD28|XCD35|\\\\b001DL\\\\b|\\\\b101DL\\\\b|\\\\bGS01\\\\b\",\n        \"Motorola\": \"Motorola|DROIDX|DROID BIONIC|\\\\bDroid\\\\b.*Build|Android.*Xoom|HRI39|MOT-|A1260|A1680|A555|A853|A855|A953|A955|A956|Motorola.*ELECTRIFY|Motorola.*i1|i867|i940|MB200|MB300|MB501|MB502|MB508|MB511|MB520|MB525|MB526|MB611|MB612|MB632|MB810|MB855|MB860|MB861|MB865|MB870|ME501|ME502|ME511|ME525|ME600|ME632|ME722|ME811|ME860|ME863|ME865|MT620|MT710|MT716|MT720|MT810|MT870|MT917|Motorola.*TITANIUM|WX435|WX445|XT300|XT301|XT311|XT316|XT317|XT319|XT320|XT390|XT502|XT530|XT531|XT532|XT535|XT603|XT610|XT611|XT615|XT681|XT701|XT702|XT711|XT720|XT800|XT806|XT860|XT862|XT875|XT882|XT883|XT894|XT901|XT907|XT909|XT910|XT912|XT928|XT926|XT915|XT919|XT925|XT1021|\\\\bMoto E\\\\b\",\n        \"Samsung\": \"\\\\bSamsung\\\\b|SM-G9250|GT-19300|SGH-I337|BGT-S5230|GT-B2100|GT-B2700|GT-B2710|GT-B3210|GT-B3310|GT-B3410|GT-B3730|GT-B3740|GT-B5510|GT-B5512|GT-B5722|GT-B6520|GT-B7300|GT-B7320|GT-B7330|GT-B7350|GT-B7510|GT-B7722|GT-B7800|GT-C3010|GT-C3011|GT-C3060|GT-C3200|GT-C3212|GT-C3212I|GT-C3262|GT-C3222|GT-C3300|GT-C3300K|GT-C3303|GT-C3303K|GT-C3310|GT-C3322|GT-C3330|GT-C3350|GT-C3500|GT-C3510|GT-C3530|GT-C3630|GT-C3780|GT-C5010|GT-C5212|GT-C6620|GT-C6625|GT-C6712|GT-E1050|GT-E1070|GT-E1075|GT-E1080|GT-E1081|GT-E1085|GT-E1087|GT-E1100|GT-E1107|GT-E1110|GT-E1120|GT-E1125|GT-E1130|GT-E1160|GT-E1170|GT-E1175|GT-E1180|GT-E1182|GT-E1200|GT-E1210|GT-E1225|GT-E1230|GT-E1390|GT-E2100|GT-E2120|GT-E2121|GT-E2152|GT-E2220|GT-E2222|GT-E2230|GT-E2232|GT-E2250|GT-E2370|GT-E2550|GT-E2652|GT-E3210|GT-E3213|GT-I5500|GT-I5503|GT-I5700|GT-I5800|GT-I5801|GT-I6410|GT-I6420|GT-I7110|GT-I7410|GT-I7500|GT-I8000|GT-I8150|GT-I8160|GT-I8190|GT-I8320|GT-I8330|GT-I8350|GT-I8530|GT-I8700|GT-I8703|GT-I8910|GT-I9000|GT-I9001|GT-I9003|GT-I9010|GT-I9020|GT-I9023|GT-I9070|GT-I9082|GT-I9100|GT-I9103|GT-I9220|GT-I9250|GT-I9300|GT-I9305|GT-I9500|GT-I9505|GT-M3510|GT-M5650|GT-M7500|GT-M7600|GT-M7603|GT-M8800|GT-M8910|GT-N7000|GT-S3110|GT-S3310|GT-S3350|GT-S3353|GT-S3370|GT-S3650|GT-S3653|GT-S3770|GT-S3850|GT-S5210|GT-S5220|GT-S5229|GT-S5230|GT-S5233|GT-S5250|GT-S5253|GT-S5260|GT-S5263|GT-S5270|GT-S5300|GT-S5330|GT-S5350|GT-S5360|GT-S5363|GT-S5369|GT-S5380|GT-S5380D|GT-S5560|GT-S5570|GT-S5600|GT-S5603|GT-S5610|GT-S5620|GT-S5660|GT-S5670|GT-S5690|GT-S5750|GT-S5780|GT-S5830|GT-S5839|GT-S6102|GT-S6500|GT-S7070|GT-S7200|GT-S7220|GT-S7230|GT-S7233|GT-S7250|GT-S7500|GT-S7530|GT-S7550|GT-S7562|GT-S7710|GT-S8000|GT-S8003|GT-S8500|GT-S8530|GT-S8600|SCH-A310|SCH-A530|SCH-A570|SCH-A610|SCH-A630|SCH-A650|SCH-A790|SCH-A795|SCH-A850|SCH-A870|SCH-A890|SCH-A930|SCH-A950|SCH-A970|SCH-A990|SCH-I100|SCH-I110|SCH-I400|SCH-I405|SCH-I500|SCH-I510|SCH-I515|SCH-I600|SCH-I730|SCH-I760|SCH-I770|SCH-I830|SCH-I910|SCH-I920|SCH-I959|SCH-LC11|SCH-N150|SCH-N300|SCH-R100|SCH-R300|SCH-R351|SCH-R400|SCH-R410|SCH-T300|SCH-U310|SCH-U320|SCH-U350|SCH-U360|SCH-U365|SCH-U370|SCH-U380|SCH-U410|SCH-U430|SCH-U450|SCH-U460|SCH-U470|SCH-U490|SCH-U540|SCH-U550|SCH-U620|SCH-U640|SCH-U650|SCH-U660|SCH-U700|SCH-U740|SCH-U750|SCH-U810|SCH-U820|SCH-U900|SCH-U940|SCH-U960|SCS-26UC|SGH-A107|SGH-A117|SGH-A127|SGH-A137|SGH-A157|SGH-A167|SGH-A177|SGH-A187|SGH-A197|SGH-A227|SGH-A237|SGH-A257|SGH-A437|SGH-A517|SGH-A597|SGH-A637|SGH-A657|SGH-A667|SGH-A687|SGH-A697|SGH-A707|SGH-A717|SGH-A727|SGH-A737|SGH-A747|SGH-A767|SGH-A777|SGH-A797|SGH-A817|SGH-A827|SGH-A837|SGH-A847|SGH-A867|SGH-A877|SGH-A887|SGH-A897|SGH-A927|SGH-B100|SGH-B130|SGH-B200|SGH-B220|SGH-C100|SGH-C110|SGH-C120|SGH-C130|SGH-C140|SGH-C160|SGH-C170|SGH-C180|SGH-C200|SGH-C207|SGH-C210|SGH-C225|SGH-C230|SGH-C417|SGH-C450|SGH-D307|SGH-D347|SGH-D357|SGH-D407|SGH-D415|SGH-D780|SGH-D807|SGH-D980|SGH-E105|SGH-E200|SGH-E315|SGH-E316|SGH-E317|SGH-E335|SGH-E590|SGH-E635|SGH-E715|SGH-E890|SGH-F300|SGH-F480|SGH-I200|SGH-I300|SGH-I320|SGH-I550|SGH-I577|SGH-I600|SGH-I607|SGH-I617|SGH-I627|SGH-I637|SGH-I677|SGH-I700|SGH-I717|SGH-I727|SGH-i747M|SGH-I777|SGH-I780|SGH-I827|SGH-I847|SGH-I857|SGH-I896|SGH-I897|SGH-I900|SGH-I907|SGH-I917|SGH-I927|SGH-I937|SGH-I997|SGH-J150|SGH-J200|SGH-L170|SGH-L700|SGH-M110|SGH-M150|SGH-M200|SGH-N105|SGH-N500|SGH-N600|SGH-N620|SGH-N625|SGH-N700|SGH-N710|SGH-P107|SGH-P207|SGH-P300|SGH-P310|SGH-P520|SGH-P735|SGH-P777|SGH-Q105|SGH-R210|SGH-R220|SGH-R225|SGH-S105|SGH-S307|SGH-T109|SGH-T119|SGH-T139|SGH-T209|SGH-T219|SGH-T229|SGH-T239|SGH-T249|SGH-T259|SGH-T309|SGH-T319|SGH-T329|SGH-T339|SGH-T349|SGH-T359|SGH-T369|SGH-T379|SGH-T409|SGH-T429|SGH-T439|SGH-T459|SGH-T469|SGH-T479|SGH-T499|SGH-T509|SGH-T519|SGH-T539|SGH-T559|SGH-T589|SGH-T609|SGH-T619|SGH-T629|SGH-T639|SGH-T659|SGH-T669|SGH-T679|SGH-T709|SGH-T719|SGH-T729|SGH-T739|SGH-T746|SGH-T749|SGH-T759|SGH-T769|SGH-T809|SGH-T819|SGH-T839|SGH-T919|SGH-T929|SGH-T939|SGH-T959|SGH-T989|SGH-U100|SGH-U200|SGH-U800|SGH-V205|SGH-V206|SGH-X100|SGH-X105|SGH-X120|SGH-X140|SGH-X426|SGH-X427|SGH-X475|SGH-X495|SGH-X497|SGH-X507|SGH-X600|SGH-X610|SGH-X620|SGH-X630|SGH-X700|SGH-X820|SGH-X890|SGH-Z130|SGH-Z150|SGH-Z170|SGH-ZX10|SGH-ZX20|SHW-M110|SPH-A120|SPH-A400|SPH-A420|SPH-A460|SPH-A500|SPH-A560|SPH-A600|SPH-A620|SPH-A660|SPH-A700|SPH-A740|SPH-A760|SPH-A790|SPH-A800|SPH-A820|SPH-A840|SPH-A880|SPH-A900|SPH-A940|SPH-A960|SPH-D600|SPH-D700|SPH-D710|SPH-D720|SPH-I300|SPH-I325|SPH-I330|SPH-I350|SPH-I500|SPH-I600|SPH-I700|SPH-L700|SPH-M100|SPH-M220|SPH-M240|SPH-M300|SPH-M305|SPH-M320|SPH-M330|SPH-M350|SPH-M360|SPH-M370|SPH-M380|SPH-M510|SPH-M540|SPH-M550|SPH-M560|SPH-M570|SPH-M580|SPH-M610|SPH-M620|SPH-M630|SPH-M800|SPH-M810|SPH-M850|SPH-M900|SPH-M910|SPH-M920|SPH-M930|SPH-N100|SPH-N200|SPH-N240|SPH-N300|SPH-N400|SPH-Z400|SWC-E100|SCH-i909|GT-N7100|GT-N7105|SCH-I535|SM-N900A|SGH-I317|SGH-T999L|GT-S5360B|GT-I8262|GT-S6802|GT-S6312|GT-S6310|GT-S5312|GT-S5310|GT-I9105|GT-I8510|GT-S6790N|SM-G7105|SM-N9005|GT-S5301|GT-I9295|GT-I9195|SM-C101|GT-S7392|GT-S7560|GT-B7610|GT-I5510|GT-S7582|GT-S7530E|GT-I8750|SM-G9006V|SM-G9008V|SM-G9009D|SM-G900A|SM-G900D|SM-G900F|SM-G900H|SM-G900I|SM-G900J|SM-G900K|SM-G900L|SM-G900M|SM-G900P|SM-G900R4|SM-G900S|SM-G900T|SM-G900V|SM-G900W8|SHV-E160K|SCH-P709|SCH-P729|SM-T2558|GT-I9205|SM-G9350|SM-J120F\",\n        \"LG\": \"\\\\bLG\\\\b;|LG[- ]?(C800|C900|E400|E610|E900|E-900|F160|F180K|F180L|F180S|730|855|L160|LS740|LS840|LS970|LU6200|MS690|MS695|MS770|MS840|MS870|MS910|P500|P700|P705|VM696|AS680|AS695|AX840|C729|E970|GS505|272|C395|E739BK|E960|L55C|L75C|LS696|LS860|P769BK|P350|P500|P509|P870|UN272|US730|VS840|VS950|LN272|LN510|LS670|LS855|LW690|MN270|MN510|P509|P769|P930|UN200|UN270|UN510|UN610|US670|US740|US760|UX265|UX840|VN271|VN530|VS660|VS700|VS740|VS750|VS910|VS920|VS930|VX9200|VX11000|AX840A|LW770|P506|P925|P999|E612|D955|D802|MS323)\",\n        \"Sony\": \"SonyST|SonyLT|SonyEricsson|SonyEricssonLT15iv|LT18i|E10i|LT28h|LT26w|SonyEricssonMT27i|C5303|C6902|C6903|C6906|C6943|D2533\",\n        \"Asus\": \"Asus.*Galaxy|PadFone.*Mobile\",\n        \"NokiaLumia\": \"Lumia [0-9]{3,4}\",\n        \"Micromax\": \"Micromax.*\\\\b(A210|A92|A88|A72|A111|A110Q|A115|A116|A110|A90S|A26|A51|A35|A54|A25|A27|A89|A68|A65|A57|A90)\\\\b\",\n        \"Palm\": \"PalmSource|Palm\",\n        \"Vertu\": \"Vertu|Vertu.*Ltd|Vertu.*Ascent|Vertu.*Ayxta|Vertu.*Constellation(F|Quest)?|Vertu.*Monika|Vertu.*Signature\",\n        \"Pantech\": \"PANTECH|IM-A850S|IM-A840S|IM-A830L|IM-A830K|IM-A830S|IM-A820L|IM-A810K|IM-A810S|IM-A800S|IM-T100K|IM-A725L|IM-A780L|IM-A775C|IM-A770K|IM-A760S|IM-A750K|IM-A740S|IM-A730S|IM-A720L|IM-A710K|IM-A690L|IM-A690S|IM-A650S|IM-A630K|IM-A600S|VEGA PTL21|PT003|P8010|ADR910L|P6030|P6020|P9070|P4100|P9060|P5000|CDM8992|TXT8045|ADR8995|IS11PT|P2030|P6010|P8000|PT002|IS06|CDM8999|P9050|PT001|TXT8040|P2020|P9020|P2000|P7040|P7000|C790\",\n        \"Fly\": \"IQ230|IQ444|IQ450|IQ440|IQ442|IQ441|IQ245|IQ256|IQ236|IQ255|IQ235|IQ245|IQ275|IQ240|IQ285|IQ280|IQ270|IQ260|IQ250\",\n        \"Wiko\": \"KITE 4G|HIGHWAY|GETAWAY|STAIRWAY|DARKSIDE|DARKFULL|DARKNIGHT|DARKMOON|SLIDE|WAX 4G|RAINBOW|BLOOM|SUNSET|GOA(?!nna)|LENNY|BARRY|IGGY|OZZY|CINK FIVE|CINK PEAX|CINK PEAX 2|CINK SLIM|CINK SLIM 2|CINK +|CINK KING|CINK PEAX|CINK SLIM|SUBLIM\",\n        \"iMobile\": \"i-mobile (IQ|i-STYLE|idea|ZAA|Hitz)\",\n        \"SimValley\": \"\\\\b(SP-80|XT-930|SX-340|XT-930|SX-310|SP-360|SP60|SPT-800|SP-120|SPT-800|SP-140|SPX-5|SPX-8|SP-100|SPX-8|SPX-12)\\\\b\",\n        \"Wolfgang\": \"AT-B24D|AT-AS50HD|AT-AS40W|AT-AS55HD|AT-AS45q2|AT-B26D|AT-AS50Q\",\n        \"Alcatel\": \"Alcatel\",\n        \"Nintendo\": \"Nintendo 3DS\",\n        \"Amoi\": \"Amoi\",\n        \"INQ\": \"INQ\",\n        \"GenericPhone\": \"Tapatalk|PDA;|SAGEM|\\\\bmmp\\\\b|pocket|\\\\bpsp\\\\b|symbian|Smartphone|smartfon|treo|up.browser|up.link|vodafone|\\\\bwap\\\\b|nokia|Series40|Series60|S60|SonyEricsson|N900|MAUI.*WAP.*Browser\"\n    },\n    \"tablets\": {\n        \"iPad\": \"iPad|iPad.*Mobile\",\n        \"NexusTablet\": \"Android.*Nexus[\\\\s]+(7|9|10)\",\n        \"SamsungTablet\": \"SAMSUNG.*Tablet|Galaxy.*Tab|SC-01C|GT-P1000|GT-P1003|GT-P1010|GT-P3105|GT-P6210|GT-P6800|GT-P6810|GT-P7100|GT-P7300|GT-P7310|GT-P7500|GT-P7510|SCH-I800|SCH-I815|SCH-I905|SGH-I957|SGH-I987|SGH-T849|SGH-T859|SGH-T869|SPH-P100|GT-P3100|GT-P3108|GT-P3110|GT-P5100|GT-P5110|GT-P6200|GT-P7320|GT-P7511|GT-N8000|GT-P8510|SGH-I497|SPH-P500|SGH-T779|SCH-I705|SCH-I915|GT-N8013|GT-P3113|GT-P5113|GT-P8110|GT-N8010|GT-N8005|GT-N8020|GT-P1013|GT-P6201|GT-P7501|GT-N5100|GT-N5105|GT-N5110|SHV-E140K|SHV-E140L|SHV-E140S|SHV-E150S|SHV-E230K|SHV-E230L|SHV-E230S|SHW-M180K|SHW-M180L|SHW-M180S|SHW-M180W|SHW-M300W|SHW-M305W|SHW-M380K|SHW-M380S|SHW-M380W|SHW-M430W|SHW-M480K|SHW-M480S|SHW-M480W|SHW-M485W|SHW-M486W|SHW-M500W|GT-I9228|SCH-P739|SCH-I925|GT-I9200|GT-P5200|GT-P5210|GT-P5210X|SM-T311|SM-T310|SM-T310X|SM-T210|SM-T210R|SM-T211|SM-P600|SM-P601|SM-P605|SM-P900|SM-P901|SM-T217|SM-T217A|SM-T217S|SM-P6000|SM-T3100|SGH-I467|XE500|SM-T110|GT-P5220|GT-I9200X|GT-N5110X|GT-N5120|SM-P905|SM-T111|SM-T2105|SM-T315|SM-T320|SM-T320X|SM-T321|SM-T520|SM-T525|SM-T530NU|SM-T230NU|SM-T330NU|SM-T900|XE500T1C|SM-P605V|SM-P905V|SM-T337V|SM-T537V|SM-T707V|SM-T807V|SM-P600X|SM-P900X|SM-T210X|SM-T230|SM-T230X|SM-T325|GT-P7503|SM-T531|SM-T330|SM-T530|SM-T705|SM-T705C|SM-T535|SM-T331|SM-T800|SM-T700|SM-T537|SM-T807|SM-P907A|SM-T337A|SM-T537A|SM-T707A|SM-T807A|SM-T237|SM-T807P|SM-P607T|SM-T217T|SM-T337T|SM-T807T|SM-T116NQ|SM-P550|SM-T350|SM-T550|SM-T9000|SM-P9000|SM-T705Y|SM-T805|GT-P3113|SM-T710|SM-T810|SM-T815|SM-T360|SM-T533|SM-T113|SM-T335|SM-T715|SM-T560|SM-T670|SM-T677|SM-T377|SM-T567|SM-T357T|SM-T555|SM-T561|SM-T713|SM-T719|SM-T813|SM-T819|SM-T580|SM-T355Y|SM-T280\",\n        \"Kindle\": \"Kindle|Silk.*Accelerated|Android.*\\\\b(KFOT|KFTT|KFJWI|KFJWA|KFOTE|KFSOWI|KFTHWI|KFTHWA|KFAPWI|KFAPWA|WFJWAE|KFSAWA|KFSAWI|KFASWI|KFARWI)\\\\b\",\n        \"SurfaceTablet\": \"Windows NT [0-9.]+; ARM;.*(Tablet|ARMBJS)\",\n        \"HPTablet\": \"HP Slate (7|8|10)|HP ElitePad 900|hp-tablet|EliteBook.*Touch|HP 8|Slate 21|HP SlateBook 10\",\n        \"AsusTablet\": \"^.*PadFone((?!Mobile).)*$|Transformer|TF101|TF101G|TF300T|TF300TG|TF300TL|TF700T|TF700KL|TF701T|TF810C|ME171|ME301T|ME302C|ME371MG|ME370T|ME372MG|ME172V|ME173X|ME400C|Slider SL101|\\\\bK00F\\\\b|\\\\bK00C\\\\b|\\\\bK00E\\\\b|\\\\bK00L\\\\b|TX201LA|ME176C|ME102A|\\\\bM80TA\\\\b|ME372CL|ME560CG|ME372CG|ME302KL| K010 | K011 | K017 | K01E |ME572C|ME103K|ME170C|ME171C|\\\\bME70C\\\\b|ME581C|ME581CL|ME8510C|ME181C|P01Y|PO1MA|P01Z\",\n        \"BlackBerryTablet\": \"PlayBook|RIM Tablet\",\n        \"HTCtablet\": \"HTC_Flyer_P512|HTC Flyer|HTC Jetstream|HTC-P715a|HTC EVO View 4G|PG41200|PG09410\",\n        \"MotorolaTablet\": \"xoom|sholest|MZ615|MZ605|MZ505|MZ601|MZ602|MZ603|MZ604|MZ606|MZ607|MZ608|MZ609|MZ615|MZ616|MZ617\",\n        \"NookTablet\": \"Android.*Nook|NookColor|nook browser|BNRV200|BNRV200A|BNTV250|BNTV250A|BNTV400|BNTV600|LogicPD Zoom2\",\n        \"AcerTablet\": \"Android.*; \\\\b(A100|A101|A110|A200|A210|A211|A500|A501|A510|A511|A700|A701|W500|W500P|W501|W501P|W510|W511|W700|G100|G100W|B1-A71|B1-710|B1-711|A1-810|A1-811|A1-830)\\\\b|W3-810|\\\\bA3-A10\\\\b|\\\\bA3-A11\\\\b|\\\\bA3-A20\\\\b|\\\\bA3-A30\",\n        \"ToshibaTablet\": \"Android.*(AT100|AT105|AT200|AT205|AT270|AT275|AT300|AT305|AT1S5|AT500|AT570|AT700|AT830)|TOSHIBA.*FOLIO\",\n        \"LGTablet\": \"\\\\bL-06C|LG-V909|LG-V900|LG-V700|LG-V510|LG-V500|LG-V410|LG-V400|LG-VK810\\\\b\",\n        \"FujitsuTablet\": \"Android.*\\\\b(F-01D|F-02F|F-05E|F-10D|M532|Q572)\\\\b\",\n        \"PrestigioTablet\": \"PMP3170B|PMP3270B|PMP3470B|PMP7170B|PMP3370B|PMP3570C|PMP5870C|PMP3670B|PMP5570C|PMP5770D|PMP3970B|PMP3870C|PMP5580C|PMP5880D|PMP5780D|PMP5588C|PMP7280C|PMP7280C3G|PMP7280|PMP7880D|PMP5597D|PMP5597|PMP7100D|PER3464|PER3274|PER3574|PER3884|PER5274|PER5474|PMP5097CPRO|PMP5097|PMP7380D|PMP5297C|PMP5297C_QUAD|PMP812E|PMP812E3G|PMP812F|PMP810E|PMP880TD|PMT3017|PMT3037|PMT3047|PMT3057|PMT7008|PMT5887|PMT5001|PMT5002\",\n        \"LenovoTablet\": \"Lenovo TAB|Idea(Tab|Pad)( A1|A10| K1|)|ThinkPad([ ]+)?Tablet|YT3-X90L|YT3-X90F|YT3-X90X|Lenovo.*(S2109|S2110|S5000|S6000|K3011|A3000|A3500|A1000|A2107|A2109|A1107|A5500|A7600|B6000|B8000|B8080)(-|)(FL|F|HV|H|)\",\n        \"DellTablet\": \"Venue 11|Venue 8|Venue 7|Dell Streak 10|Dell Streak 7\",\n        \"YarvikTablet\": \"Android.*\\\\b(TAB210|TAB211|TAB224|TAB250|TAB260|TAB264|TAB310|TAB360|TAB364|TAB410|TAB411|TAB420|TAB424|TAB450|TAB460|TAB461|TAB464|TAB465|TAB467|TAB468|TAB07-100|TAB07-101|TAB07-150|TAB07-151|TAB07-152|TAB07-200|TAB07-201-3G|TAB07-210|TAB07-211|TAB07-212|TAB07-214|TAB07-220|TAB07-400|TAB07-485|TAB08-150|TAB08-200|TAB08-201-3G|TAB08-201-30|TAB09-100|TAB09-211|TAB09-410|TAB10-150|TAB10-201|TAB10-211|TAB10-400|TAB10-410|TAB13-201|TAB274EUK|TAB275EUK|TAB374EUK|TAB462EUK|TAB474EUK|TAB9-200)\\\\b\",\n        \"MedionTablet\": \"Android.*\\\\bOYO\\\\b|LIFE.*(P9212|P9514|P9516|S9512)|LIFETAB\",\n        \"ArnovaTablet\": \"97G4|AN10G2|AN7bG3|AN7fG3|AN8G3|AN8cG3|AN7G3|AN9G3|AN7dG3|AN7dG3ST|AN7dG3ChildPad|AN10bG3|AN10bG3DT|AN9G2\",\n        \"IntensoTablet\": \"INM8002KP|INM1010FP|INM805ND|Intenso Tab|TAB1004\",\n        \"IRUTablet\": \"M702pro\",\n        \"MegafonTablet\": \"MegaFon V9|\\\\bZTE V9\\\\b|Android.*\\\\bMT7A\\\\b\",\n        \"EbodaTablet\": \"E-Boda (Supreme|Impresspeed|Izzycomm|Essential)\",\n        \"AllViewTablet\": \"Allview.*(Viva|Alldro|City|Speed|All TV|Frenzy|Quasar|Shine|TX1|AX1|AX2)\",\n        \"ArchosTablet\": \"\\\\b(101G9|80G9|A101IT)\\\\b|Qilive 97R|Archos5|\\\\bARCHOS (70|79|80|90|97|101|FAMILYPAD|)(b|)(G10| Cobalt| TITANIUM(HD|)| Xenon| Neon|XSK| 2| XS 2| PLATINUM| CARBON|GAMEPAD)\\\\b\",\n        \"AinolTablet\": \"NOVO7|NOVO8|NOVO10|Novo7Aurora|Novo7Basic|NOVO7PALADIN|novo9-Spark\",\n        \"NokiaLumiaTablet\": \"Lumia 2520\",\n        \"SonyTablet\": \"Sony.*Tablet|Xperia Tablet|Sony Tablet S|SO-03E|SGPT12|SGPT13|SGPT114|SGPT121|SGPT122|SGPT123|SGPT111|SGPT112|SGPT113|SGPT131|SGPT132|SGPT133|SGPT211|SGPT212|SGPT213|SGP311|SGP312|SGP321|EBRD1101|EBRD1102|EBRD1201|SGP351|SGP341|SGP511|SGP512|SGP521|SGP541|SGP551|SGP621|SGP612|SOT31\",\n        \"PhilipsTablet\": \"\\\\b(PI2010|PI3000|PI3100|PI3105|PI3110|PI3205|PI3210|PI3900|PI4010|PI7000|PI7100)\\\\b\",\n        \"CubeTablet\": \"Android.*(K8GT|U9GT|U10GT|U16GT|U17GT|U18GT|U19GT|U20GT|U23GT|U30GT)|CUBE U8GT\",\n        \"CobyTablet\": \"MID1042|MID1045|MID1125|MID1126|MID7012|MID7014|MID7015|MID7034|MID7035|MID7036|MID7042|MID7048|MID7127|MID8042|MID8048|MID8127|MID9042|MID9740|MID9742|MID7022|MID7010\",\n        \"MIDTablet\": \"M9701|M9000|M9100|M806|M1052|M806|T703|MID701|MID713|MID710|MID727|MID760|MID830|MID728|MID933|MID125|MID810|MID732|MID120|MID930|MID800|MID731|MID900|MID100|MID820|MID735|MID980|MID130|MID833|MID737|MID960|MID135|MID860|MID736|MID140|MID930|MID835|MID733|MID4X10\",\n        \"MSITablet\": \"MSI \\\\b(Primo 73K|Primo 73L|Primo 81L|Primo 77|Primo 93|Primo 75|Primo 76|Primo 73|Primo 81|Primo 91|Primo 90|Enjoy 71|Enjoy 7|Enjoy 10)\\\\b\",\n        \"SMiTTablet\": \"Android.*(\\\\bMID\\\\b|MID-560|MTV-T1200|MTV-PND531|MTV-P1101|MTV-PND530)\",\n        \"RockChipTablet\": \"Android.*(RK2818|RK2808A|RK2918|RK3066)|RK2738|RK2808A\",\n        \"FlyTablet\": \"IQ310|Fly Vision\",\n        \"bqTablet\": \"Android.*(bq)?.*(Elcano|Curie|Edison|Maxwell|Kepler|Pascal|Tesla|Hypatia|Platon|Newton|Livingstone|Cervantes|Avant|Aquaris [E|M]10)|Maxwell.*Lite|Maxwell.*Plus\",\n        \"HuaweiTablet\": \"MediaPad|MediaPad 7 Youth|IDEOS S7|S7-201c|S7-202u|S7-101|S7-103|S7-104|S7-105|S7-106|S7-201|S7-Slim\",\n        \"NecTablet\": \"\\\\bN-06D|\\\\bN-08D\",\n        \"PantechTablet\": \"Pantech.*P4100\",\n        \"BronchoTablet\": \"Broncho.*(N701|N708|N802|a710)\",\n        \"VersusTablet\": \"TOUCHPAD.*[78910]|\\\\bTOUCHTAB\\\\b\",\n        \"ZyncTablet\": \"z1000|Z99 2G|z99|z930|z999|z990|z909|Z919|z900\",\n        \"PositivoTablet\": \"TB07STA|TB10STA|TB07FTA|TB10FTA\",\n        \"NabiTablet\": \"Android.*\\\\bNabi\",\n        \"KoboTablet\": \"Kobo Touch|\\\\bK080\\\\b|\\\\bVox\\\\b Build|\\\\bArc\\\\b Build\",\n        \"DanewTablet\": \"DSlide.*\\\\b(700|701R|702|703R|704|802|970|971|972|973|974|1010|1012)\\\\b\",\n        \"TexetTablet\": \"NaviPad|TB-772A|TM-7045|TM-7055|TM-9750|TM-7016|TM-7024|TM-7026|TM-7041|TM-7043|TM-7047|TM-8041|TM-9741|TM-9747|TM-9748|TM-9751|TM-7022|TM-7021|TM-7020|TM-7011|TM-7010|TM-7023|TM-7025|TM-7037W|TM-7038W|TM-7027W|TM-9720|TM-9725|TM-9737W|TM-1020|TM-9738W|TM-9740|TM-9743W|TB-807A|TB-771A|TB-727A|TB-725A|TB-719A|TB-823A|TB-805A|TB-723A|TB-715A|TB-707A|TB-705A|TB-709A|TB-711A|TB-890HD|TB-880HD|TB-790HD|TB-780HD|TB-770HD|TB-721HD|TB-710HD|TB-434HD|TB-860HD|TB-840HD|TB-760HD|TB-750HD|TB-740HD|TB-730HD|TB-722HD|TB-720HD|TB-700HD|TB-500HD|TB-470HD|TB-431HD|TB-430HD|TB-506|TB-504|TB-446|TB-436|TB-416|TB-146SE|TB-126SE\",\n        \"PlaystationTablet\": \"Playstation.*(Portable|Vita)\",\n        \"TrekstorTablet\": \"ST10416-1|VT10416-1|ST70408-1|ST702xx-1|ST702xx-2|ST80208|ST97216|ST70104-2|VT10416-2|ST10216-2A|SurfTab\",\n        \"PyleAudioTablet\": \"\\\\b(PTBL10CEU|PTBL10C|PTBL72BC|PTBL72BCEU|PTBL7CEU|PTBL7C|PTBL92BC|PTBL92BCEU|PTBL9CEU|PTBL9CUK|PTBL9C)\\\\b\",\n        \"AdvanTablet\": \"Android.* \\\\b(E3A|T3X|T5C|T5B|T3E|T3C|T3B|T1J|T1F|T2A|T1H|T1i|E1C|T1-E|T5-A|T4|E1-B|T2Ci|T1-B|T1-D|O1-A|E1-A|T1-A|T3A|T4i)\\\\b \",\n        \"DanyTechTablet\": \"Genius Tab G3|Genius Tab S2|Genius Tab Q3|Genius Tab G4|Genius Tab Q4|Genius Tab G-II|Genius TAB GII|Genius TAB GIII|Genius Tab S1\",\n        \"GalapadTablet\": \"Android.*\\\\bG1\\\\b\",\n        \"MicromaxTablet\": \"Funbook|Micromax.*\\\\b(P250|P560|P360|P362|P600|P300|P350|P500|P275)\\\\b\",\n        \"KarbonnTablet\": \"Android.*\\\\b(A39|A37|A34|ST8|ST10|ST7|Smart Tab3|Smart Tab2)\\\\b\",\n        \"AllFineTablet\": \"Fine7 Genius|Fine7 Shine|Fine7 Air|Fine8 Style|Fine9 More|Fine10 Joy|Fine11 Wide\",\n        \"PROSCANTablet\": \"\\\\b(PEM63|PLT1023G|PLT1041|PLT1044|PLT1044G|PLT1091|PLT4311|PLT4311PL|PLT4315|PLT7030|PLT7033|PLT7033D|PLT7035|PLT7035D|PLT7044K|PLT7045K|PLT7045KB|PLT7071KG|PLT7072|PLT7223G|PLT7225G|PLT7777G|PLT7810K|PLT7849G|PLT7851G|PLT7852G|PLT8015|PLT8031|PLT8034|PLT8036|PLT8080K|PLT8082|PLT8088|PLT8223G|PLT8234G|PLT8235G|PLT8816K|PLT9011|PLT9045K|PLT9233G|PLT9735|PLT9760G|PLT9770G)\\\\b\",\n        \"YONESTablet\": \"BQ1078|BC1003|BC1077|RK9702|BC9730|BC9001|IT9001|BC7008|BC7010|BC708|BC728|BC7012|BC7030|BC7027|BC7026\",\n        \"ChangJiaTablet\": \"TPC7102|TPC7103|TPC7105|TPC7106|TPC7107|TPC7201|TPC7203|TPC7205|TPC7210|TPC7708|TPC7709|TPC7712|TPC7110|TPC8101|TPC8103|TPC8105|TPC8106|TPC8203|TPC8205|TPC8503|TPC9106|TPC9701|TPC97101|TPC97103|TPC97105|TPC97106|TPC97111|TPC97113|TPC97203|TPC97603|TPC97809|TPC97205|TPC10101|TPC10103|TPC10106|TPC10111|TPC10203|TPC10205|TPC10503\",\n        \"GUTablet\": \"TX-A1301|TX-M9002|Q702|kf026\",\n        \"PointOfViewTablet\": \"TAB-P506|TAB-navi-7-3G-M|TAB-P517|TAB-P-527|TAB-P701|TAB-P703|TAB-P721|TAB-P731N|TAB-P741|TAB-P825|TAB-P905|TAB-P925|TAB-PR945|TAB-PL1015|TAB-P1025|TAB-PI1045|TAB-P1325|TAB-PROTAB[0-9]+|TAB-PROTAB25|TAB-PROTAB26|TAB-PROTAB27|TAB-PROTAB26XL|TAB-PROTAB2-IPS9|TAB-PROTAB30-IPS9|TAB-PROTAB25XXL|TAB-PROTAB26-IPS10|TAB-PROTAB30-IPS10\",\n        \"OvermaxTablet\": \"OV-(SteelCore|NewBase|Basecore|Baseone|Exellen|Quattor|EduTab|Solution|ACTION|BasicTab|TeddyTab|MagicTab|Stream|TB-08|TB-09)\",\n        \"HCLTablet\": \"HCL.*Tablet|Connect-3G-2.0|Connect-2G-2.0|ME Tablet U1|ME Tablet U2|ME Tablet G1|ME Tablet X1|ME Tablet Y2|ME Tablet Sync\",\n        \"DPSTablet\": \"DPS Dream 9|DPS Dual 7\",\n        \"VistureTablet\": \"V97 HD|i75 3G|Visture V4( HD)?|Visture V5( HD)?|Visture V10\",\n        \"CrestaTablet\": \"CTP(-)?810|CTP(-)?818|CTP(-)?828|CTP(-)?838|CTP(-)?888|CTP(-)?978|CTP(-)?980|CTP(-)?987|CTP(-)?988|CTP(-)?989\",\n        \"MediatekTablet\": \"\\\\bMT8125|MT8389|MT8135|MT8377\\\\b\",\n        \"ConcordeTablet\": \"Concorde([ ]+)?Tab|ConCorde ReadMan\",\n        \"GoCleverTablet\": \"GOCLEVER TAB|A7GOCLEVER|M1042|M7841|M742|R1042BK|R1041|TAB A975|TAB A7842|TAB A741|TAB A741L|TAB M723G|TAB M721|TAB A1021|TAB I921|TAB R721|TAB I720|TAB T76|TAB R70|TAB R76.2|TAB R106|TAB R83.2|TAB M813G|TAB I721|GCTA722|TAB I70|TAB I71|TAB S73|TAB R73|TAB R74|TAB R93|TAB R75|TAB R76.1|TAB A73|TAB A93|TAB A93.2|TAB T72|TAB R83|TAB R974|TAB R973|TAB A101|TAB A103|TAB A104|TAB A104.2|R105BK|M713G|A972BK|TAB A971|TAB R974.2|TAB R104|TAB R83.3|TAB A1042\",\n        \"ModecomTablet\": \"FreeTAB 9000|FreeTAB 7.4|FreeTAB 7004|FreeTAB 7800|FreeTAB 2096|FreeTAB 7.5|FreeTAB 1014|FreeTAB 1001 |FreeTAB 8001|FreeTAB 9706|FreeTAB 9702|FreeTAB 7003|FreeTAB 7002|FreeTAB 1002|FreeTAB 7801|FreeTAB 1331|FreeTAB 1004|FreeTAB 8002|FreeTAB 8014|FreeTAB 9704|FreeTAB 1003\",\n        \"VoninoTablet\": \"\\\\b(Argus[ _]?S|Diamond[ _]?79HD|Emerald[ _]?78E|Luna[ _]?70C|Onyx[ _]?S|Onyx[ _]?Z|Orin[ _]?HD|Orin[ _]?S|Otis[ _]?S|SpeedStar[ _]?S|Magnet[ _]?M9|Primus[ _]?94[ _]?3G|Primus[ _]?94HD|Primus[ _]?QS|Android.*\\\\bQ8\\\\b|Sirius[ _]?EVO[ _]?QS|Sirius[ _]?QS|Spirit[ _]?S)\\\\b\",\n        \"ECSTablet\": \"V07OT2|TM105A|S10OT1|TR10CS1\",\n        \"StorexTablet\": \"eZee[_']?(Tab|Go)[0-9]+|TabLC7|Looney Tunes Tab\",\n        \"VodafoneTablet\": \"SmartTab([ ]+)?[0-9]+|SmartTabII10|SmartTabII7|VF-1497\",\n        \"EssentielBTablet\": \"Smart[ ']?TAB[ ]+?[0-9]+|Family[ ']?TAB2\",\n        \"RossMoorTablet\": \"RM-790|RM-997|RMD-878G|RMD-974R|RMT-705A|RMT-701|RME-601|RMT-501|RMT-711\",\n        \"iMobileTablet\": \"i-mobile i-note\",\n        \"TolinoTablet\": \"tolino tab [0-9.]+|tolino shine\",\n        \"AudioSonicTablet\": \"\\\\bC-22Q|T7-QC|T-17B|T-17P\\\\b\",\n        \"AMPETablet\": \"Android.* A78 \",\n        \"SkkTablet\": \"Android.* (SKYPAD|PHOENIX|CYCLOPS)\",\n        \"TecnoTablet\": \"TECNO P9\",\n        \"JXDTablet\": \"Android.* \\\\b(F3000|A3300|JXD5000|JXD3000|JXD2000|JXD300B|JXD300|S5800|S7800|S602b|S5110b|S7300|S5300|S602|S603|S5100|S5110|S601|S7100a|P3000F|P3000s|P101|P200s|P1000m|P200m|P9100|P1000s|S6600b|S908|P1000|P300|S18|S6600|S9100)\\\\b\",\n        \"iJoyTablet\": \"Tablet (Spirit 7|Essentia|Galatea|Fusion|Onix 7|Landa|Titan|Scooby|Deox|Stella|Themis|Argon|Unique 7|Sygnus|Hexen|Finity 7|Cream|Cream X2|Jade|Neon 7|Neron 7|Kandy|Scape|Saphyr 7|Rebel|Biox|Rebel|Rebel 8GB|Myst|Draco 7|Myst|Tab7-004|Myst|Tadeo Jones|Tablet Boing|Arrow|Draco Dual Cam|Aurix|Mint|Amity|Revolution|Finity 9|Neon 9|T9w|Amity 4GB Dual Cam|Stone 4GB|Stone 8GB|Andromeda|Silken|X2|Andromeda II|Halley|Flame|Saphyr 9,7|Touch 8|Planet|Triton|Unique 10|Hexen 10|Memphis 4GB|Memphis 8GB|Onix 10)\",\n        \"FX2Tablet\": \"FX2 PAD7|FX2 PAD10\",\n        \"XoroTablet\": \"KidsPAD 701|PAD[ ]?712|PAD[ ]?714|PAD[ ]?716|PAD[ ]?717|PAD[ ]?718|PAD[ ]?720|PAD[ ]?721|PAD[ ]?722|PAD[ ]?790|PAD[ ]?792|PAD[ ]?900|PAD[ ]?9715D|PAD[ ]?9716DR|PAD[ ]?9718DR|PAD[ ]?9719QR|PAD[ ]?9720QR|TelePAD1030|Telepad1032|TelePAD730|TelePAD731|TelePAD732|TelePAD735Q|TelePAD830|TelePAD9730|TelePAD795|MegaPAD 1331|MegaPAD 1851|MegaPAD 2151\",\n        \"ViewsonicTablet\": \"ViewPad 10pi|ViewPad 10e|ViewPad 10s|ViewPad E72|ViewPad7|ViewPad E100|ViewPad 7e|ViewSonic VB733|VB100a\",\n        \"OdysTablet\": \"LOOX|XENO10|ODYS[ -](Space|EVO|Xpress|NOON)|\\\\bXELIO\\\\b|Xelio10Pro|XELIO7PHONETAB|XELIO10EXTREME|XELIOPT2|NEO_QUAD10\",\n        \"CaptivaTablet\": \"CAPTIVA PAD\",\n        \"IconbitTablet\": \"NetTAB|NT-3702|NT-3702S|NT-3702S|NT-3603P|NT-3603P|NT-0704S|NT-0704S|NT-3805C|NT-3805C|NT-0806C|NT-0806C|NT-0909T|NT-0909T|NT-0907S|NT-0907S|NT-0902S|NT-0902S\",\n        \"TeclastTablet\": \"T98 4G|\\\\bP80\\\\b|\\\\bX90HD\\\\b|X98 Air|X98 Air 3G|\\\\bX89\\\\b|P80 3G|\\\\bX80h\\\\b|P98 Air|\\\\bX89HD\\\\b|P98 3G|\\\\bP90HD\\\\b|P89 3G|X98 3G|\\\\bP70h\\\\b|P79HD 3G|G18d 3G|\\\\bP79HD\\\\b|\\\\bP89s\\\\b|\\\\bA88\\\\b|\\\\bP10HD\\\\b|\\\\bP19HD\\\\b|G18 3G|\\\\bP78HD\\\\b|\\\\bA78\\\\b|\\\\bP75\\\\b|G17s 3G|G17h 3G|\\\\bP85t\\\\b|\\\\bP90\\\\b|\\\\bP11\\\\b|\\\\bP98t\\\\b|\\\\bP98HD\\\\b|\\\\bG18d\\\\b|\\\\bP85s\\\\b|\\\\bP11HD\\\\b|\\\\bP88s\\\\b|\\\\bA80HD\\\\b|\\\\bA80se\\\\b|\\\\bA10h\\\\b|\\\\bP89\\\\b|\\\\bP78s\\\\b|\\\\bG18\\\\b|\\\\bP85\\\\b|\\\\bA70h\\\\b|\\\\bA70\\\\b|\\\\bG17\\\\b|\\\\bP18\\\\b|\\\\bA80s\\\\b|\\\\bA11s\\\\b|\\\\bP88HD\\\\b|\\\\bA80h\\\\b|\\\\bP76s\\\\b|\\\\bP76h\\\\b|\\\\bP98\\\\b|\\\\bA10HD\\\\b|\\\\bP78\\\\b|\\\\bP88\\\\b|\\\\bA11\\\\b|\\\\bA10t\\\\b|\\\\bP76a\\\\b|\\\\bP76t\\\\b|\\\\bP76e\\\\b|\\\\bP85HD\\\\b|\\\\bP85a\\\\b|\\\\bP86\\\\b|\\\\bP75HD\\\\b|\\\\bP76v\\\\b|\\\\bA12\\\\b|\\\\bP75a\\\\b|\\\\bA15\\\\b|\\\\bP76Ti\\\\b|\\\\bP81HD\\\\b|\\\\bA10\\\\b|\\\\bT760VE\\\\b|\\\\bT720HD\\\\b|\\\\bP76\\\\b|\\\\bP73\\\\b|\\\\bP71\\\\b|\\\\bP72\\\\b|\\\\bT720SE\\\\b|\\\\bC520Ti\\\\b|\\\\bT760\\\\b|\\\\bT720VE\\\\b|T720-3GE|T720-WiFi\",\n        \"OndaTablet\": \"\\\\b(V975i|Vi30|VX530|V701|Vi60|V701s|Vi50|V801s|V719|Vx610w|VX610W|V819i|Vi10|VX580W|Vi10|V711s|V813|V811|V820w|V820|Vi20|V711|VI30W|V712|V891w|V972|V819w|V820w|Vi60|V820w|V711|V813s|V801|V819|V975s|V801|V819|V819|V818|V811|V712|V975m|V101w|V961w|V812|V818|V971|V971s|V919|V989|V116w|V102w|V973|Vi40)\\\\b[\\\\s]+\",\n        \"JaytechTablet\": \"TPC-PA762\",\n        \"BlaupunktTablet\": \"Endeavour 800NG|Endeavour 1010\",\n        \"DigmaTablet\": \"\\\\b(iDx10|iDx9|iDx8|iDx7|iDxD7|iDxD8|iDsQ8|iDsQ7|iDsQ8|iDsD10|iDnD7|3TS804H|iDsQ11|iDj7|iDs10)\\\\b\",\n        \"EvolioTablet\": \"ARIA_Mini_wifi|Aria[ _]Mini|Evolio X10|Evolio X7|Evolio X8|\\\\bEvotab\\\\b|\\\\bNeura\\\\b\",\n        \"LavaTablet\": \"QPAD E704|\\\\bIvoryS\\\\b|E-TAB IVORY|\\\\bE-TAB\\\\b\",\n        \"AocTablet\": \"MW0811|MW0812|MW0922|MTK8382|MW1031|MW0831|MW0821|MW0931|MW0712\",\n        \"MpmanTablet\": \"MP11 OCTA|MP10 OCTA|MPQC1114|MPQC1004|MPQC994|MPQC974|MPQC973|MPQC804|MPQC784|MPQC780|\\\\bMPG7\\\\b|MPDCG75|MPDCG71|MPDC1006|MP101DC|MPDC9000|MPDC905|MPDC706HD|MPDC706|MPDC705|MPDC110|MPDC100|MPDC99|MPDC97|MPDC88|MPDC8|MPDC77|MP709|MID701|MID711|MID170|MPDC703|MPQC1010\",\n        \"CelkonTablet\": \"CT695|CT888|CT[\\\\s]?910|CT7 Tab|CT9 Tab|CT3 Tab|CT2 Tab|CT1 Tab|C820|C720|\\\\bCT-1\\\\b\",\n        \"WolderTablet\": \"miTab \\\\b(DIAMOND|SPACE|BROOKLYN|NEO|FLY|MANHATTAN|FUNK|EVOLUTION|SKY|GOCAR|IRON|GENIUS|POP|MINT|EPSILON|BROADWAY|JUMP|HOP|LEGEND|NEW AGE|LINE|ADVANCE|FEEL|FOLLOW|LIKE|LINK|LIVE|THINK|FREEDOM|CHICAGO|CLEVELAND|BALTIMORE-GH|IOWA|BOSTON|SEATTLE|PHOENIX|DALLAS|IN 101|MasterChef)\\\\b\",\n        \"MiTablet\": \"\\\\bMI PAD\\\\b|\\\\bHM NOTE 1W\\\\b\",\n        \"NibiruTablet\": \"Nibiru M1|Nibiru Jupiter One\",\n        \"NexoTablet\": \"NEXO NOVA|NEXO 10|NEXO AVIO|NEXO FREE|NEXO GO|NEXO EVO|NEXO 3G|NEXO SMART|NEXO KIDDO|NEXO MOBI\",\n        \"LeaderTablet\": \"TBLT10Q|TBLT10I|TBL-10WDKB|TBL-10WDKBO2013|TBL-W230V2|TBL-W450|TBL-W500|SV572|TBLT7I|TBA-AC7-8G|TBLT79|TBL-8W16|TBL-10W32|TBL-10WKB|TBL-W100\",\n        \"UbislateTablet\": \"UbiSlate[\\\\s]?7C\",\n        \"PocketBookTablet\": \"Pocketbook\",\n        \"KocasoTablet\": \"\\\\b(TB-1207)\\\\b\",\n        \"HisenseTablet\": \"\\\\b(F5281|E2371)\\\\b\",\n        \"Hudl\": \"Hudl HT7S3|Hudl 2\",\n        \"TelstraTablet\": \"T-Hub2\",\n        \"GenericTablet\": \"Android.*\\\\b97D\\\\b|Tablet(?!.*PC)|BNTV250A|MID-WCDMA|LogicPD Zoom2|\\\\bA7EB\\\\b|CatNova8|A1_07|CT704|CT1002|\\\\bM721\\\\b|rk30sdk|\\\\bEVOTAB\\\\b|M758A|ET904|ALUMIUM10|Smartfren Tab|Endeavour 1010|Tablet-PC-4|Tagi Tab|\\\\bM6pro\\\\b|CT1020W|arc 10HD|\\\\bTP750\\\\b\"\n    },\n    \"oss\": {\n        \"AndroidOS\": \"Android\",\n        \"BlackBerryOS\": \"blackberry|\\\\bBB10\\\\b|rim tablet os\",\n        \"PalmOS\": \"PalmOS|avantgo|blazer|elaine|hiptop|palm|plucker|xiino\",\n        \"SymbianOS\": \"Symbian|SymbOS|Series60|Series40|SYB-[0-9]+|\\\\bS60\\\\b\",\n        \"WindowsMobileOS\": \"Windows CE.*(PPC|Smartphone|Mobile|[0-9]{3}x[0-9]{3})|Window Mobile|Windows Phone [0-9.]+|WCE;\",\n        \"WindowsPhoneOS\": \"Windows Phone 10.0|Windows Phone 8.1|Windows Phone 8.0|Windows Phone OS|XBLWP7|ZuneWP7|Windows NT 6.[23]; ARM;\",\n        \"iOS\": \"\\\\biPhone.*Mobile|\\\\biPod|\\\\biPad\",\n        \"MeeGoOS\": \"MeeGo\",\n        \"MaemoOS\": \"Maemo\",\n        \"JavaOS\": \"J2ME\\/|\\\\bMIDP\\\\b|\\\\bCLDC\\\\b\",\n        \"webOS\": \"webOS|hpwOS\",\n        \"badaOS\": \"\\\\bBada\\\\b\",\n        \"BREWOS\": \"BREW\"\n    },\n    \"uas\": {\n        \"Chrome\": \"\\\\bCrMo\\\\b|CriOS|Android.*Chrome\\/[.0-9]* (Mobile)?\",\n        \"Dolfin\": \"\\\\bDolfin\\\\b\",\n        \"Opera\": \"Opera.*Mini|Opera.*Mobi|Android.*Opera|Mobile.*OPR\\/[0-9.]+|Coast\\/[0-9.]+\",\n        \"Skyfire\": \"Skyfire\",\n        \"Edge\": \"Mobile Safari\\/[.0-9]* Edge\",\n        \"IE\": \"IEMobile|MSIEMobile\",\n        \"Firefox\": \"fennec|firefox.*maemo|(Mobile|Tablet).*Firefox|Firefox.*Mobile|FxiOS\",\n        \"Bolt\": \"bolt\",\n        \"TeaShark\": \"teashark\",\n        \"Blazer\": \"Blazer\",\n        \"Safari\": \"Version.*Mobile.*Safari|Safari.*Mobile|MobileSafari\",\n        \"UCBrowser\": \"UC.*Browser|UCWEB\",\n        \"baiduboxapp\": \"baiduboxapp\",\n        \"baidubrowser\": \"baidubrowser\",\n        \"DiigoBrowser\": \"DiigoBrowser\",\n        \"Puffin\": \"Puffin\",\n        \"Mercury\": \"\\\\bMercury\\\\b\",\n        \"ObigoBrowser\": \"Obigo\",\n        \"NetFront\": \"NF-Browser\",\n        \"GenericBrowser\": \"NokiaBrowser|OviBrowser|OneBrowser|TwonkyBeamBrowser|SEMC.*Browser|FlyFlow|Minimo|NetFront|Novarra-Vision|MQQBrowser|MicroMessenger\",\n        \"PaleMoon\": \"Android.*PaleMoon|Mobile.*PaleMoon\"\n    },\n    \"props\": {\n        \"Mobile\": \"Mobile\\/[VER]\",\n        \"Build\": \"Build\\/[VER]\",\n        \"Version\": \"Version\\/[VER]\",\n        \"VendorID\": \"VendorID\\/[VER]\",\n        \"iPad\": \"iPad.*CPU[a-z ]+[VER]\",\n        \"iPhone\": \"iPhone.*CPU[a-z ]+[VER]\",\n        \"iPod\": \"iPod.*CPU[a-z ]+[VER]\",\n        \"Kindle\": \"Kindle\\/[VER]\",\n        \"Chrome\": [\n            \"Chrome\\/[VER]\",\n            \"CriOS\\/[VER]\",\n            \"CrMo\\/[VER]\"\n        ],\n        \"Coast\": [\n            \"Coast\\/[VER]\"\n        ],\n        \"Dolfin\": \"Dolfin\\/[VER]\",\n        \"Firefox\": [\n            \"Firefox\\/[VER]\",\n            \"FxiOS\\/[VER]\"\n        ],\n        \"Fennec\": \"Fennec\\/[VER]\",\n        \"Edge\": \"Edge\\/[VER]\",\n        \"IE\": [\n            \"IEMobile\\/[VER];\",\n            \"IEMobile [VER]\",\n            \"MSIE [VER];\",\n            \"Trident\\/[0-9.]+;.*rv:[VER]\"\n        ],\n        \"NetFront\": \"NetFront\\/[VER]\",\n        \"NokiaBrowser\": \"NokiaBrowser\\/[VER]\",\n        \"Opera\": [\n            \" OPR\\/[VER]\",\n            \"Opera Mini\\/[VER]\",\n            \"Version\\/[VER]\"\n        ],\n        \"Opera Mini\": \"Opera Mini\\/[VER]\",\n        \"Opera Mobi\": \"Version\\/[VER]\",\n        \"UC Browser\": \"UC Browser[VER]\",\n        \"MQQBrowser\": \"MQQBrowser\\/[VER]\",\n        \"MicroMessenger\": \"MicroMessenger\\/[VER]\",\n        \"baiduboxapp\": \"baiduboxapp\\/[VER]\",\n        \"baidubrowser\": \"baidubrowser\\/[VER]\",\n        \"SamsungBrowser\": \"SamsungBrowser\\/[VER]\",\n        \"Iron\": \"Iron\\/[VER]\",\n        \"Safari\": [\n            \"Version\\/[VER]\",\n            \"Safari\\/[VER]\"\n        ],\n        \"Skyfire\": \"Skyfire\\/[VER]\",\n        \"Tizen\": \"Tizen\\/[VER]\",\n        \"Webkit\": \"webkit[ \\/][VER]\",\n        \"PaleMoon\": \"PaleMoon\\/[VER]\",\n        \"Gecko\": \"Gecko\\/[VER]\",\n        \"Trident\": \"Trident\\/[VER]\",\n        \"Presto\": \"Presto\\/[VER]\",\n        \"Goanna\": \"Goanna\\/[VER]\",\n        \"iOS\": \" \\\\bi?OS\\\\b [VER][ ;]{1}\",\n        \"Android\": \"Android [VER]\",\n        \"BlackBerry\": [\n            \"BlackBerry[\\\\w]+\\/[VER]\",\n            \"BlackBerry.*Version\\/[VER]\",\n            \"Version\\/[VER]\"\n        ],\n        \"BREW\": \"BREW [VER]\",\n        \"Java\": \"Java\\/[VER]\",\n        \"Windows Phone OS\": [\n            \"Windows Phone OS [VER]\",\n            \"Windows Phone [VER]\"\n        ],\n        \"Windows Phone\": \"Windows Phone [VER]\",\n        \"Windows CE\": \"Windows CE\\/[VER]\",\n        \"Windows NT\": \"Windows NT [VER]\",\n        \"Symbian\": [\n            \"SymbianOS\\/[VER]\",\n            \"Symbian\\/[VER]\"\n        ],\n        \"webOS\": [\n            \"webOS\\/[VER]\",\n            \"hpwOS\\/[VER];\"\n        ]\n    },\n    \"utils\": {\n        \"Bot\": \"Googlebot|facebookexternalhit|AdsBot-Google|Google Keyword Suggestion|Facebot|YandexBot|YandexMobileBot|bingbot|ia_archiver|AhrefsBot|Ezooms|GSLFbot|WBSearchBot|Twitterbot|TweetmemeBot|Twikle|PaperLiBot|Wotbox|UnwindFetchor|Exabot|MJ12bot|YandexImages|TurnitinBot|Pingdom\",\n        \"MobileBot\": \"Googlebot-Mobile|AdsBot-Google-Mobile|YahooSeeker\\/M1A1-R2D2\",\n        \"DesktopMode\": \"WPDesktop\",\n        \"TV\": \"SonyDTV|HbbTV\",\n        \"WebKit\": \"(webkit)[ \\/]([\\\\w.]+)\",\n        \"Console\": \"\\\\b(Nintendo|Nintendo WiiU|Nintendo 3DS|PLAYSTATION|Xbox)\\\\b\",\n        \"Watch\": \"SM-V700\"\n    }\n};\n\n    // following patterns come from http://detectmobilebrowsers.com/\n    impl.detectMobileBrowsers = {\n        fullPattern: /(android|bb\\d+|meego).+mobile|avantgo|bada\\/|blackberry|blazer|compal|elaine|fennec|hiptop|iemobile|ip(hone|od)|iris|kindle|lge |maemo|midp|mmp|mobile.+firefox|netfront|opera m(ob|in)i|palm( os)?|phone|p(ixi|re)\\/|plucker|pocket|psp|series(4|6)0|symbian|treo|up\\.(browser|link)|vodafone|wap|windows ce|xda|xiino/i,\n        shortPattern: /1207|6310|6590|3gso|4thp|50[1-6]i|770s|802s|a wa|abac|ac(er|oo|s\\-)|ai(ko|rn)|al(av|ca|co)|amoi|an(ex|ny|yw)|aptu|ar(ch|go)|as(te|us)|attw|au(di|\\-m|r |s )|avan|be(ck|ll|nq)|bi(lb|rd)|bl(ac|az)|br(e|v)w|bumb|bw\\-(n|u)|c55\\/|capi|ccwa|cdm\\-|cell|chtm|cldc|cmd\\-|co(mp|nd)|craw|da(it|ll|ng)|dbte|dc\\-s|devi|dica|dmob|do(c|p)o|ds(12|\\-d)|el(49|ai)|em(l2|ul)|er(ic|k0)|esl8|ez([4-7]0|os|wa|ze)|fetc|fly(\\-|_)|g1 u|g560|gene|gf\\-5|g\\-mo|go(\\.w|od)|gr(ad|un)|haie|hcit|hd\\-(m|p|t)|hei\\-|hi(pt|ta)|hp( i|ip)|hs\\-c|ht(c(\\-| |_|a|g|p|s|t)|tp)|hu(aw|tc)|i\\-(20|go|ma)|i230|iac( |\\-|\\/)|ibro|idea|ig01|ikom|im1k|inno|ipaq|iris|ja(t|v)a|jbro|jemu|jigs|kddi|keji|kgt( |\\/)|klon|kpt |kwc\\-|kyo(c|k)|le(no|xi)|lg( g|\\/(k|l|u)|50|54|\\-[a-w])|libw|lynx|m1\\-w|m3ga|m50\\/|ma(te|ui|xo)|mc(01|21|ca)|m\\-cr|me(rc|ri)|mi(o8|oa|ts)|mmef|mo(01|02|bi|de|do|t(\\-| |o|v)|zz)|mt(50|p1|v )|mwbp|mywa|n10[0-2]|n20[2-3]|n30(0|2)|n50(0|2|5)|n7(0(0|1)|10)|ne((c|m)\\-|on|tf|wf|wg|wt)|nok(6|i)|nzph|o2im|op(ti|wv)|oran|owg1|p800|pan(a|d|t)|pdxg|pg(13|\\-([1-8]|c))|phil|pire|pl(ay|uc)|pn\\-2|po(ck|rt|se)|prox|psio|pt\\-g|qa\\-a|qc(07|12|21|32|60|\\-[2-7]|i\\-)|qtek|r380|r600|raks|rim9|ro(ve|zo)|s55\\/|sa(ge|ma|mm|ms|ny|va)|sc(01|h\\-|oo|p\\-)|sdk\\/|se(c(\\-|0|1)|47|mc|nd|ri)|sgh\\-|shar|sie(\\-|m)|sk\\-0|sl(45|id)|sm(al|ar|b3|it|t5)|so(ft|ny)|sp(01|h\\-|v\\-|v )|sy(01|mb)|t2(18|50)|t6(00|10|18)|ta(gt|lk)|tcl\\-|tdg\\-|tel(i|m)|tim\\-|t\\-mo|to(pl|sh)|ts(70|m\\-|m3|m5)|tx\\-9|up(\\.b|g1|si)|utst|v400|v750|veri|vi(rg|te)|vk(40|5[0-3]|\\-v)|vm40|voda|vulc|vx(52|53|60|61|70|80|81|83|85|98)|w3c(\\-| )|webc|whit|wi(g |nc|nw)|wmlb|wonu|x700|yas\\-|your|zeto|zte\\-/i,\n        tabletPattern: /android|ipad|playbook|silk/i\n    };\n\n    var hasOwnProp = Object.prototype.hasOwnProperty,\n        isArray;\n\n    impl.FALLBACK_PHONE = 'UnknownPhone';\n    impl.FALLBACK_TABLET = 'UnknownTablet';\n    impl.FALLBACK_MOBILE = 'UnknownMobile';\n\n    isArray = ('isArray' in Array) ?\n        Array.isArray : function (value) { return Object.prototype.toString.call(value) === '[object Array]'; };\n\n    function equalIC(a, b) {\n        return a != null && b != null && a.toLowerCase() === b.toLowerCase();\n    }\n\n    function containsIC(array, value) {\n        var valueLC, i, len = array.length;\n        if (!len || !value) {\n            return false;\n        }\n        valueLC = value.toLowerCase();\n        for (i = 0; i < len; ++i) {\n            if (valueLC === array[i].toLowerCase()) {\n                return true;\n            }\n        }\n        return false;\n    }\n\n    function convertPropsToRegExp(object) {\n        for (var key in object) {\n            if (hasOwnProp.call(object, key)) {\n                object[key] = new RegExp(object[key], 'i');\n            }\n        }\n    }\n\n    (function init() {\n        var key, values, value, i, len, verPos, mobileDetectRules = impl.mobileDetectRules;\n        for (key in mobileDetectRules.props) {\n            if (hasOwnProp.call(mobileDetectRules.props, key)) {\n                values = mobileDetectRules.props[key];\n                if (!isArray(values)) {\n                    values = [values];\n                }\n                len = values.length;\n                for (i = 0; i < len; ++i) {\n                    value = values[i];\n                    verPos = value.indexOf('[VER]');\n                    if (verPos >= 0) {\n                        value = value.substring(0, verPos) + '([\\\\w._\\\\+]+)' + value.substring(verPos + 5);\n                    }\n                    values[i] = new RegExp(value, 'i');\n                }\n                mobileDetectRules.props[key] = values;\n            }\n        }\n        convertPropsToRegExp(mobileDetectRules.oss);\n        convertPropsToRegExp(mobileDetectRules.phones);\n        convertPropsToRegExp(mobileDetectRules.tablets);\n        convertPropsToRegExp(mobileDetectRules.uas);\n        convertPropsToRegExp(mobileDetectRules.utils);\n\n        // copy some patterns to oss0 which are tested first (see issue#15)\n        mobileDetectRules.oss0 = {\n            WindowsPhoneOS: mobileDetectRules.oss.WindowsPhoneOS,\n            WindowsMobileOS: mobileDetectRules.oss.WindowsMobileOS\n        };\n    }());\n\n    /**\n     * Test userAgent string against a set of rules and find the first matched key.\n     * @param {Object} rules (key is String, value is RegExp)\n     * @param {String} userAgent the navigator.userAgent (or HTTP-Header 'User-Agent').\n     * @returns {String|null} the matched key if found, otherwise <tt>null</tt>\n     * @private\n     */\n    impl.findMatch = function(rules, userAgent) {\n        for (var key in rules) {\n            if (hasOwnProp.call(rules, key)) {\n                if (rules[key].test(userAgent)) {\n                    return key;\n                }\n            }\n        }\n        return null;\n    };\n\n    /**\n     * Test userAgent string against a set of rules and return an array of matched keys.\n     * @param {Object} rules (key is String, value is RegExp)\n     * @param {String} userAgent the navigator.userAgent (or HTTP-Header 'User-Agent').\n     * @returns {Array} an array of matched keys, may be empty when there is no match, but not <tt>null</tt>\n     * @private\n     */\n    impl.findMatches = function(rules, userAgent) {\n        var result = [];\n        for (var key in rules) {\n            if (hasOwnProp.call(rules, key)) {\n                if (rules[key].test(userAgent)) {\n                    result.push(key);\n                }\n            }\n        }\n        return result;\n    };\n\n    /**\n     * Check the version of the given property in the User-Agent.\n     *\n     * @param {String} propertyName\n     * @param {String} userAgent\n     * @return {String} version or <tt>null</tt> if version not found\n     * @private\n     */\n    impl.getVersionStr = function (propertyName, userAgent) {\n        var props = impl.mobileDetectRules.props, patterns, i, len, match;\n        if (hasOwnProp.call(props, propertyName)) {\n            patterns = props[propertyName];\n            len = patterns.length;\n            for (i = 0; i < len; ++i) {\n                match = patterns[i].exec(userAgent);\n                if (match !== null) {\n                    return match[1];\n                }\n            }\n        }\n        return null;\n    };\n\n    /**\n     * Check the version of the given property in the User-Agent.\n     * Will return a float number. (eg. 2_0 will return 2.0, 4.3.1 will return 4.31)\n     *\n     * @param {String} propertyName\n     * @param {String} userAgent\n     * @return {Number} version or <tt>NaN</tt> if version not found\n     * @private\n     */\n    impl.getVersion = function (propertyName, userAgent) {\n        var version = impl.getVersionStr(propertyName, userAgent);\n        return version ? impl.prepareVersionNo(version) : NaN;\n    };\n\n    /**\n     * Prepare the version number.\n     *\n     * @param {String} version\n     * @return {Number} the version number as a floating number\n     * @private\n     */\n    impl.prepareVersionNo = function (version) {\n        var numbers;\n\n        numbers = version.split(/[a-z._ \\/\\-]/i);\n        if (numbers.length === 1) {\n            version = numbers[0];\n        }\n        if (numbers.length > 1) {\n            version = numbers[0] + '.';\n            numbers.shift();\n            version += numbers.join('');\n        }\n        return Number(version);\n    };\n\n    impl.isMobileFallback = function (userAgent) {\n        return impl.detectMobileBrowsers.fullPattern.test(userAgent) ||\n            impl.detectMobileBrowsers.shortPattern.test(userAgent.substr(0,4));\n    };\n\n    impl.isTabletFallback = function (userAgent) {\n        return impl.detectMobileBrowsers.tabletPattern.test(userAgent);\n    };\n\n    impl.prepareDetectionCache = function (cache, userAgent, maxPhoneWidth) {\n        if (cache.mobile !== undefined) {\n            return;\n        }\n        var phone, tablet, phoneSized;\n\n        // first check for stronger tablet rules, then phone (see issue#5)\n        tablet = impl.findMatch(impl.mobileDetectRules.tablets, userAgent);\n        if (tablet) {\n            cache.mobile = cache.tablet = tablet;\n            cache.phone = null;\n            return; // unambiguously identified as tablet\n        }\n\n        phone = impl.findMatch(impl.mobileDetectRules.phones, userAgent);\n        if (phone) {\n            cache.mobile = cache.phone = phone;\n            cache.tablet = null;\n            return; // unambiguously identified as phone\n        }\n\n        // our rules haven't found a match -> try more general fallback rules\n        if (impl.isMobileFallback(userAgent)) {\n            phoneSized = MobileDetect.isPhoneSized(maxPhoneWidth);\n            if (phoneSized === undefined) {\n                cache.mobile = impl.FALLBACK_MOBILE;\n                cache.tablet = cache.phone = null;\n            } else if (phoneSized) {\n                cache.mobile = cache.phone = impl.FALLBACK_PHONE;\n                cache.tablet = null;\n            } else {\n                cache.mobile = cache.tablet = impl.FALLBACK_TABLET;\n                cache.phone = null;\n            }\n        } else if (impl.isTabletFallback(userAgent)) {\n            cache.mobile = cache.tablet = impl.FALLBACK_TABLET;\n            cache.phone = null;\n        } else {\n            // not mobile at all!\n            cache.mobile = cache.tablet = cache.phone = null;\n        }\n    };\n\n    // t is a reference to a MobileDetect instance\n    impl.mobileGrade = function (t) {\n        // impl note:\n        // To keep in sync w/ Mobile_Detect.php easily, the following code is tightly aligned to the PHP version.\n        // When changes are made in Mobile_Detect.php, copy this method and replace:\n        //     $this-> / t.\n        //     self::MOBILE_GRADE_(.) / '$1'\n        //     , self::VERSION_TYPE_FLOAT / (nothing)\n        //     isIOS() / os('iOS')\n        //     [reg] / (nothing)   <-- jsdelivr complaining about unescaped unicode character U+00AE\n        var $isMobile = t.mobile() !== null;\n\n        if (\n            // Apple iOS 3.2-5.1 - Tested on the original iPad (4.3 / 5.0), iPad 2 (4.3), iPad 3 (5.1), original iPhone (3.1), iPhone 3 (3.2), 3GS (4.3), 4 (4.3 / 5.0), and 4S (5.1)\n            t.os('iOS') && t.version('iPad')>=4.3 ||\n            t.os('iOS') && t.version('iPhone')>=3.1 ||\n            t.os('iOS') && t.version('iPod')>=3.1 ||\n\n            // Android 2.1-2.3 - Tested on the HTC Incredible (2.2), original Droid (2.2), HTC Aria (2.1), Google Nexus S (2.3). Functional on 1.5 & 1.6 but performance may be sluggish, tested on Google G1 (1.5)\n            // Android 3.1 (Honeycomb)  - Tested on the Samsung Galaxy Tab 10.1 and Motorola XOOM\n            // Android 4.0 (ICS)  - Tested on a Galaxy Nexus. Note: transition performance can be poor on upgraded devices\n            // Android 4.1 (Jelly Bean)  - Tested on a Galaxy Nexus and Galaxy 7\n            ( t.version('Android')>2.1 && t.is('Webkit') ) ||\n\n            // Windows Phone 7-7.5 - Tested on the HTC Surround (7.0) HTC Trophy (7.5), LG-E900 (7.5), Nokia Lumia 800\n            t.version('Windows Phone OS')>=7.0 ||\n\n            // Blackberry 7 - Tested on BlackBerry Torch 9810\n            // Blackberry 6.0 - Tested on the Torch 9800 and Style 9670\n            t.is('BlackBerry') && t.version('BlackBerry')>=6.0 ||\n            // Blackberry Playbook (1.0-2.0) - Tested on PlayBook\n            t.match('Playbook.*Tablet') ||\n\n            // Palm WebOS (1.4-2.0) - Tested on the Palm Pixi (1.4), Pre (1.4), Pre 2 (2.0)\n            ( t.version('webOS')>=1.4 && t.match('Palm|Pre|Pixi') ) ||\n            // Palm WebOS 3.0  - Tested on HP TouchPad\n            t.match('hp.*TouchPad') ||\n\n            // Firefox Mobile (12 Beta) - Tested on Android 2.3 device\n            ( t.is('Firefox') && t.version('Firefox')>=12 ) ||\n\n            // Chrome for Android - Tested on Android 4.0, 4.1 device\n            ( t.is('Chrome') && t.is('AndroidOS') && t.version('Android')>=4.0 ) ||\n\n            // Skyfire 4.1 - Tested on Android 2.3 device\n            ( t.is('Skyfire') && t.version('Skyfire')>=4.1 && t.is('AndroidOS') && t.version('Android')>=2.3 ) ||\n\n            // Opera Mobile 11.5-12: Tested on Android 2.3\n            ( t.is('Opera') && t.version('Opera Mobi')>11 && t.is('AndroidOS') ) ||\n\n            // Meego 1.2 - Tested on Nokia 950 and N9\n            t.is('MeeGoOS') ||\n\n            // Tizen (pre-release) - Tested on early hardware\n            t.is('Tizen') ||\n\n            // Samsung Bada 2.0 - Tested on a Samsung Wave 3, Dolphin browser\n            // @todo: more tests here!\n            t.is('Dolfin') && t.version('Bada')>=2.0 ||\n\n            // UC Browser - Tested on Android 2.3 device\n            ( (t.is('UC Browser') || t.is('Dolfin')) && t.version('Android')>=2.3 ) ||\n\n            // Kindle 3 and Fire  - Tested on the built-in WebKit browser for each\n            ( t.match('Kindle Fire') ||\n                t.is('Kindle') && t.version('Kindle')>=3.0 ) ||\n\n            // Nook Color 1.4.1 - Tested on original Nook Color, not Nook Tablet\n            t.is('AndroidOS') && t.is('NookTablet') ||\n\n            // Chrome Desktop 11-21 - Tested on OS X 10.7 and Windows 7\n            t.version('Chrome')>=11 && !$isMobile ||\n\n            // Safari Desktop 4-5 - Tested on OS X 10.7 and Windows 7\n            t.version('Safari')>=5.0 && !$isMobile ||\n\n            // Firefox Desktop 4-13 - Tested on OS X 10.7 and Windows 7\n            t.version('Firefox')>=4.0 && !$isMobile ||\n\n            // Internet Explorer 7-9 - Tested on Windows XP, Vista and 7\n            t.version('MSIE')>=7.0 && !$isMobile ||\n\n            // Opera Desktop 10-12 - Tested on OS X 10.7 and Windows 7\n            // @reference: http://my.opera.com/community/openweb/idopera/\n            t.version('Opera')>=10 && !$isMobile\n\n            ){\n            return 'A';\n        }\n\n        if (\n            t.os('iOS') && t.version('iPad')<4.3 ||\n            t.os('iOS') && t.version('iPhone')<3.1 ||\n            t.os('iOS') && t.version('iPod')<3.1 ||\n\n            // Blackberry 5.0: Tested on the Storm 2 9550, Bold 9770\n            t.is('Blackberry') && t.version('BlackBerry')>=5 && t.version('BlackBerry')<6 ||\n\n            //Opera Mini (5.0-6.5) - Tested on iOS 3.2/4.3 and Android 2.3\n            ( t.version('Opera Mini')>=5.0 && t.version('Opera Mini')<=6.5 &&\n                (t.version('Android')>=2.3 || t.is('iOS')) ) ||\n\n            // Nokia Symbian^3 - Tested on Nokia N8 (Symbian^3), C7 (Symbian^3), also works on N97 (Symbian^1)\n            t.match('NokiaN8|NokiaC7|N97.*Series60|Symbian/3') ||\n\n            // @todo: report this (tested on Nokia N71)\n            t.version('Opera Mobi')>=11 && t.is('SymbianOS')\n            ){\n            return 'B';\n        }\n\n        if (\n        // Blackberry 4.x - Tested on the Curve 8330\n            t.version('BlackBerry')<5.0 ||\n            // Windows Mobile - Tested on the HTC Leo (WinMo 5.2)\n            t.match('MSIEMobile|Windows CE.*Mobile') || t.version('Windows Mobile')<=5.2\n\n            ){\n            return 'C';\n        }\n\n        //All older smartphone platforms and featurephones - Any device that doesn't support media queries\n        //will receive the basic, C grade experience.\n        return 'C';\n    };\n\n    impl.detectOS = function (ua) {\n        return impl.findMatch(impl.mobileDetectRules.oss0, ua) ||\n            impl.findMatch(impl.mobileDetectRules.oss, ua);\n    };\n\n    impl.getDeviceSmallerSide = function () {\n        return window.screen.width < window.screen.height ?\n            window.screen.width :\n            window.screen.height;\n    };\n\n    /**\n     * Constructor for MobileDetect object.\n     * <br>\n     * Such an object will keep a reference to the given user-agent string and cache most of the detect queries.<br>\n     * <div style=\"background-color: #d9edf7; border: 1px solid #bce8f1; color: #3a87ad; padding: 14px; border-radius: 2px; margin-top: 20px\">\n     *     <strong>Find information how to download and install:</strong>\n     *     <a href=\"https://github.com/hgoebl/mobile-detect.js/\">github.com/hgoebl/mobile-detect.js/</a>\n     * </div>\n     *\n     * @example <pre>\n     *     var md = new MobileDetect(window.navigator.userAgent);\n     *     if (md.mobile()) {\n     *         location.href = (md.mobileGrade() === 'A') ? '/mobile/' : '/lynx/';\n     *     }\n     * </pre>\n     *\n     * @param {string} userAgent typically taken from window.navigator.userAgent or http_header['User-Agent']\n     * @param {number} [maxPhoneWidth=600] <strong>only for browsers</strong> specify a value for the maximum\n     *        width of smallest device side (in logical \"CSS\" pixels) until a device detected as mobile will be handled\n     *        as phone.\n     *        This is only used in cases where the device cannot be classified as phone or tablet.<br>\n     *        See <a href=\"http://developer.android.com/guide/practices/screens_support.html\">Declaring Tablet Layouts\n     *        for Android</a>.<br>\n     *        If you provide a value < 0, then this \"fuzzy\" check is disabled.\n     * @constructor\n     * @global\n     */\n    function MobileDetect(userAgent, maxPhoneWidth) {\n        this.ua = userAgent || '';\n        this._cache = {};\n        //600dp is typical 7\" tablet minimum width\n        this.maxPhoneWidth = maxPhoneWidth || 600;\n    }\n\n    MobileDetect.prototype = {\n        constructor: MobileDetect,\n\n        /**\n         * Returns the detected phone or tablet type or <tt>null</tt> if it is not a mobile device.\n         * <br>\n         * For a list of possible return values see {@link MobileDetect#phone} and {@link MobileDetect#tablet}.<br>\n         * <br>\n         * If the device is not detected by the regular expressions from Mobile-Detect, a test is made against\n         * the patterns of <a href=\"http://detectmobilebrowsers.com/\">detectmobilebrowsers.com</a>. If this test\n         * is positive, a value of <code>UnknownPhone</code>, <code>UnknownTablet</code> or\n         * <code>UnknownMobile</code> is returned.<br>\n         * When used in browser, the decision whether phone or tablet is made based on <code>screen.width/height</code>.<br>\n         * <br>\n         * When used server-side (node.js), there is no way to tell the difference between <code>UnknownTablet</code>\n         * and <code>UnknownMobile</code>, so you will get <code>UnknownMobile</code> here.<br>\n         * Be aware that since v1.0.0 in this special case you will get <code>UnknownMobile</code> only for:\n         * {@link MobileDetect#mobile}, not for {@link MobileDetect#phone} and {@link MobileDetect#tablet}.\n         * In versions before v1.0.0 all 3 methods returned <code>UnknownMobile</code> which was tedious to use.\n         * <br>\n         * In most cases you will use the return value just as a boolean.\n         *\n         * @returns {String} the key for the phone family or tablet family, e.g. \"Nexus\".\n         * @function MobileDetect#mobile\n         */\n        mobile: function () {\n            impl.prepareDetectionCache(this._cache, this.ua, this.maxPhoneWidth);\n            return this._cache.mobile;\n        },\n\n        /**\n         * Returns the detected phone type/family string or <tt>null</tt>.\n         * <br>\n         * The returned tablet (family or producer) is one of following keys:<br>\n         * <br><tt>iPhone, BlackBerry, HTC, Nexus, Dell, Motorola, Samsung, LG, Sony, Asus,\n         * NokiaLumia, Micromax, Palm, Vertu, Pantech, Fly, Wiko, iMobile, SimValley,\n         * Wolfgang, Alcatel, Nintendo, Amoi, INQ, GenericPhone</tt><br>\n         * <br>\n         * If the device is not detected by the regular expressions from Mobile-Detect, a test is made against\n         * the patterns of <a href=\"http://detectmobilebrowsers.com/\">detectmobilebrowsers.com</a>. If this test\n         * is positive, a value of <code>UnknownPhone</code> or <code>UnknownMobile</code> is returned.<br>\n         * When used in browser, the decision whether phone or tablet is made based on <code>screen.width/height</code>.<br>\n         * <br>\n         * When used server-side (node.js), there is no way to tell the difference between <code>UnknownTablet</code>\n         * and <code>UnknownMobile</code>, so you will get <code>null</code> here, while {@link MobileDetect#mobile}\n         * will return <code>UnknownMobile</code>.<br>\n         * Be aware that since v1.0.0 in this special case you will get <code>UnknownMobile</code> only for:\n         * {@link MobileDetect#mobile}, not for {@link MobileDetect#phone} and {@link MobileDetect#tablet}.\n         * In versions before v1.0.0 all 3 methods returned <code>UnknownMobile</code> which was tedious to use.\n         * <br>\n         * In most cases you will use the return value just as a boolean.\n         *\n         * @returns {String} the key of the phone family or producer, e.g. \"iPhone\"\n         * @function MobileDetect#phone\n         */\n        phone: function () {\n            impl.prepareDetectionCache(this._cache, this.ua, this.maxPhoneWidth);\n            return this._cache.phone;\n        },\n\n        /**\n         * Returns the detected tablet type/family string or <tt>null</tt>.\n         * <br>\n         * The returned tablet (family or producer) is one of following keys:<br>\n         * <br><tt>iPad, NexusTablet, SamsungTablet, Kindle, SurfaceTablet, HPTablet, AsusTablet,\n         * BlackBerryTablet, HTCtablet, MotorolaTablet, NookTablet, AcerTablet,\n         * ToshibaTablet, LGTablet, FujitsuTablet, PrestigioTablet, LenovoTablet,\n         * DellTablet, YarvikTablet, MedionTablet, ArnovaTablet, IntensoTablet, IRUTablet,\n         * MegafonTablet, EbodaTablet, AllViewTablet, ArchosTablet, AinolTablet,\n         * NokiaLumiaTablet, SonyTablet, PhilipsTablet, CubeTablet, CobyTablet, MIDTablet,\n         * MSITablet, SMiTTablet, RockChipTablet, FlyTablet, bqTablet, HuaweiTablet,\n         * NecTablet, PantechTablet, BronchoTablet, VersusTablet, ZyncTablet,\n         * PositivoTablet, NabiTablet, KoboTablet, DanewTablet, TexetTablet,\n         * PlaystationTablet, TrekstorTablet, PyleAudioTablet, AdvanTablet,\n         * DanyTechTablet, GalapadTablet, MicromaxTablet, KarbonnTablet, AllFineTablet,\n         * PROSCANTablet, YONESTablet, ChangJiaTablet, GUTablet, PointOfViewTablet,\n         * OvermaxTablet, HCLTablet, DPSTablet, VistureTablet, CrestaTablet,\n         * MediatekTablet, ConcordeTablet, GoCleverTablet, ModecomTablet, VoninoTablet,\n         * ECSTablet, StorexTablet, VodafoneTablet, EssentielBTablet, RossMoorTablet,\n         * iMobileTablet, TolinoTablet, AudioSonicTablet, AMPETablet, SkkTablet,\n         * TecnoTablet, JXDTablet, iJoyTablet, FX2Tablet, XoroTablet, ViewsonicTablet,\n         * OdysTablet, CaptivaTablet, IconbitTablet, TeclastTablet, OndaTablet,\n         * JaytechTablet, BlaupunktTablet, DigmaTablet, EvolioTablet, LavaTablet,\n         * AocTablet, MpmanTablet, CelkonTablet, WolderTablet, MiTablet, NibiruTablet,\n         * NexoTablet, LeaderTablet, UbislateTablet, PocketBookTablet, KocasoTablet,\n         * HisenseTablet, Hudl, TelstraTablet, GenericTablet</tt><br>\n         * <br>\n         * If the device is not detected by the regular expressions from Mobile-Detect, a test is made against\n         * the patterns of <a href=\"http://detectmobilebrowsers.com/\">detectmobilebrowsers.com</a>. If this test\n         * is positive, a value of <code>UnknownTablet</code> or <code>UnknownMobile</code> is returned.<br>\n         * When used in browser, the decision whether phone or tablet is made based on <code>screen.width/height</code>.<br>\n         * <br>\n         * When used server-side (node.js), there is no way to tell the difference between <code>UnknownTablet</code>\n         * and <code>UnknownMobile</code>, so you will get <code>null</code> here, while {@link MobileDetect#mobile}\n         * will return <code>UnknownMobile</code>.<br>\n         * Be aware that since v1.0.0 in this special case you will get <code>UnknownMobile</code> only for:\n         * {@link MobileDetect#mobile}, not for {@link MobileDetect#phone} and {@link MobileDetect#tablet}.\n         * In versions before v1.0.0 all 3 methods returned <code>UnknownMobile</code> which was tedious to use.\n         * <br>\n         * In most cases you will use the return value just as a boolean.\n         *\n         * @returns {String} the key of the tablet family or producer, e.g. \"SamsungTablet\"\n         * @function MobileDetect#tablet\n         */\n        tablet: function () {\n            impl.prepareDetectionCache(this._cache, this.ua, this.maxPhoneWidth);\n            return this._cache.tablet;\n        },\n\n        /**\n         * Returns the (first) detected user-agent string or <tt>null</tt>.\n         * <br>\n         * The returned user-agent is one of following keys:<br>\n         * <br><tt>Chrome, Dolfin, Opera, Skyfire, Edge, IE, Firefox, Bolt, TeaShark, Blazer,\n         * Safari, UCBrowser, baiduboxapp, baidubrowser, DiigoBrowser, Puffin, Mercury,\n         * ObigoBrowser, NetFront, GenericBrowser, PaleMoon</tt><br>\n         * <br>\n         * In most cases calling {@link MobileDetect#userAgent} will be sufficient. But there are rare\n         * cases where a mobile device pretends to be more than one particular browser. You can get the\n         * list of all matches with {@link MobileDetect#userAgents} or check for a particular value by\n         * providing one of the defined keys as first argument to {@link MobileDetect#is}.\n         *\n         * @returns {String} the key for the detected user-agent or <tt>null</tt>\n         * @function MobileDetect#userAgent\n         */\n        userAgent: function () {\n            if (this._cache.userAgent === undefined) {\n                this._cache.userAgent = impl.findMatch(impl.mobileDetectRules.uas, this.ua);\n            }\n            return this._cache.userAgent;\n        },\n\n        /**\n         * Returns all detected user-agent strings.\n         * <br>\n         * The array is empty or contains one or more of following keys:<br>\n         * <br><tt>Chrome, Dolfin, Opera, Skyfire, Edge, IE, Firefox, Bolt, TeaShark, Blazer,\n         * Safari, UCBrowser, baiduboxapp, baidubrowser, DiigoBrowser, Puffin, Mercury,\n         * ObigoBrowser, NetFront, GenericBrowser, PaleMoon</tt><br>\n         * <br>\n         * In most cases calling {@link MobileDetect#userAgent} will be sufficient. But there are rare\n         * cases where a mobile device pretends to be more than one particular browser. You can get the\n         * list of all matches with {@link MobileDetect#userAgents} or check for a particular value by\n         * providing one of the defined keys as first argument to {@link MobileDetect#is}.\n         *\n         * @returns {Array} the array of detected user-agent keys or <tt>[]</tt>\n         * @function MobileDetect#userAgents\n         */\n        userAgents: function () {\n            if (this._cache.userAgents === undefined) {\n                this._cache.userAgents = impl.findMatches(impl.mobileDetectRules.uas, this.ua);\n            }\n            return this._cache.userAgents;\n        },\n\n        /**\n         * Returns the detected operating system string or <tt>null</tt>.\n         * <br>\n         * The operating system is one of following keys:<br>\n         * <br><tt>AndroidOS, BlackBerryOS, PalmOS, SymbianOS, WindowsMobileOS, WindowsPhoneOS,\n         * iOS, MeeGoOS, MaemoOS, JavaOS, webOS, badaOS, BREWOS</tt><br>\n         *\n         * @returns {String} the key for the detected operating system.\n         * @function MobileDetect#os\n         */\n        os: function () {\n            if (this._cache.os === undefined) {\n                this._cache.os = impl.detectOS(this.ua);\n            }\n            return this._cache.os;\n        },\n\n        /**\n         * Get the version (as Number) of the given property in the User-Agent.\n         * <br>\n         * Will return a float number. (eg. 2_0 will return 2.0, 4.3.1 will return 4.31)\n         *\n         * @param {String} key a key defining a thing which has a version.<br>\n         *        You can use one of following keys:<br>\n         * <br><tt>Mobile, Build, Version, VendorID, iPad, iPhone, iPod, Kindle, Chrome, Coast,\n         * Dolfin, Firefox, Fennec, Edge, IE, NetFront, NokiaBrowser, Opera, Opera Mini,\n         * Opera Mobi, UC Browser, MQQBrowser, MicroMessenger, baiduboxapp, baidubrowser,\n         * SamsungBrowser, Iron, Safari, Skyfire, Tizen, Webkit, PaleMoon, Gecko, Trident,\n         * Presto, Goanna, iOS, Android, BlackBerry, BREW, Java, Windows Phone OS, Windows\n         * Phone, Windows CE, Windows NT, Symbian, webOS</tt><br>\n         *\n         * @returns {Number} the version as float or <tt>NaN</tt> if User-Agent doesn't contain this version.\n         *          Be careful when comparing this value with '==' operator!\n         * @function MobileDetect#version\n         */\n        version: function (key) {\n            return impl.getVersion(key, this.ua);\n        },\n\n        /**\n         * Get the version (as String) of the given property in the User-Agent.\n         * <br>\n         *\n         * @param {String} key a key defining a thing which has a version.<br>\n         *        You can use one of following keys:<br>\n         * <br><tt>Mobile, Build, Version, VendorID, iPad, iPhone, iPod, Kindle, Chrome, Coast,\n         * Dolfin, Firefox, Fennec, Edge, IE, NetFront, NokiaBrowser, Opera, Opera Mini,\n         * Opera Mobi, UC Browser, MQQBrowser, MicroMessenger, baiduboxapp, baidubrowser,\n         * SamsungBrowser, Iron, Safari, Skyfire, Tizen, Webkit, PaleMoon, Gecko, Trident,\n         * Presto, Goanna, iOS, Android, BlackBerry, BREW, Java, Windows Phone OS, Windows\n         * Phone, Windows CE, Windows NT, Symbian, webOS</tt><br>\n         *\n         * @returns {String} the \"raw\" version as String or <tt>null</tt> if User-Agent doesn't contain this version.\n         *\n         * @function MobileDetect#versionStr\n         */\n        versionStr: function (key) {\n            return impl.getVersionStr(key, this.ua);\n        },\n\n        /**\n         * Global test key against userAgent, os, phone, tablet and some other properties of userAgent string.\n         *\n         * @param {String} key the key (case-insensitive) of a userAgent, an operating system, phone or\n         *        tablet family.<br>\n         *        For a complete list of possible values, see {@link MobileDetect#userAgent},\n         *        {@link MobileDetect#os}, {@link MobileDetect#phone}, {@link MobileDetect#tablet}.<br>\n         *        Additionally you have following keys:<br>\n         * <br><tt>Bot, MobileBot, DesktopMode, TV, WebKit, Console, Watch</tt><br>\n         *\n         * @returns {boolean} <tt>true</tt> when the given key is one of the defined keys of userAgent, os, phone,\n         *                    tablet or one of the listed additional keys, otherwise <tt>false</tt>\n         * @function MobileDetect#is\n         */\n        is: function (key) {\n            return containsIC(this.userAgents(), key) ||\n                   equalIC(key, this.os()) ||\n                   equalIC(key, this.phone()) ||\n                   equalIC(key, this.tablet()) ||\n                   containsIC(impl.findMatches(impl.mobileDetectRules.utils, this.ua), key);\n        },\n\n        /**\n         * Do a quick test against navigator::userAgent.\n         *\n         * @param {String|RegExp} pattern the pattern, either as String or RegExp\n         *                        (a string will be converted to a case-insensitive RegExp).\n         * @returns {boolean} <tt>true</tt> when the pattern matches, otherwise <tt>false</tt>\n         * @function MobileDetect#match\n         */\n        match: function (pattern) {\n            if (!(pattern instanceof RegExp)) {\n                pattern = new RegExp(pattern, 'i');\n            }\n            return pattern.test(this.ua);\n        },\n\n        /**\n         * Checks whether the mobile device can be considered as phone regarding <code>screen.width</code>.\n         * <br>\n         * Obviously this method makes sense in browser environments only (not for Node.js)!\n         * @param {number} [maxPhoneWidth] the maximum logical pixels (aka. CSS-pixels) to be considered as phone.<br>\n         *        The argument is optional and if not present or falsy, the value of the constructor is taken.\n         * @returns {boolean|undefined} <code>undefined</code> if screen size wasn't detectable, else <code>true</code>\n         *          when screen.width is less or equal to maxPhoneWidth, otherwise <code>false</code>.<br>\n         *          Will always return <code>undefined</code> server-side.\n         */\n        isPhoneSized: function (maxPhoneWidth) {\n            return MobileDetect.isPhoneSized(maxPhoneWidth || this.maxPhoneWidth);\n        },\n\n        /**\n         * Returns the mobile grade ('A', 'B', 'C').\n         *\n         * @returns {String} one of the mobile grades ('A', 'B', 'C').\n         * @function MobileDetect#mobileGrade\n         */\n        mobileGrade: function () {\n            if (this._cache.grade === undefined) {\n                this._cache.grade = impl.mobileGrade(this);\n            }\n            return this._cache.grade;\n        }\n    };\n\n    // environment-dependent\n    if (typeof window !== 'undefined' && window.screen) {\n        MobileDetect.isPhoneSized = function (maxPhoneWidth) {\n            return maxPhoneWidth < 0 ? undefined : impl.getDeviceSmallerSide() <= maxPhoneWidth;\n        };\n    } else {\n        MobileDetect.isPhoneSized = function () {};\n    }\n\n    // should not be replaced by a completely new object - just overwrite existing methods\n    MobileDetect._impl = impl;\n    \n    MobileDetect.version = '1.3.5 2016-11-14';\n\n    return MobileDetect;\n}); // end of call of define()\n})((function (undefined) {\n    if (typeof module !== 'undefined' && module.exports) {\n        return function (factory) { module.exports = factory(); };\n    } else if (typeof define === 'function' && define.amd) {\n        return define;\n    } else if (typeof window !== 'undefined') {\n        return function (factory) { window.MobileDetect = factory(); };\n    } else {\n        // please file a bug if you get this error!\n        throw new Error('unknown environment');\n    }\n})());\n//! moment.js\n//! version : 2.17.1\n//! authors : Tim Wood, Iskren Chernev, Moment.js contributors\n//! license : MIT\n//! momentjs.com\n\n;(function (global, factory) {\n    typeof exports === 'object' && typeof module !== 'undefined' ? module.exports = factory() :\n    typeof define === 'function' && define.amd ? define(factory) :\n    global.moment = factory()\n}(this, (function () { 'use strict';\n\nvar hookCallback;\n\nfunction hooks () {\n    return hookCallback.apply(null, arguments);\n}\n\n// This is done to register the method called with moment()\n// without creating circular dependencies.\nfunction setHookCallback (callback) {\n    hookCallback = callback;\n}\n\nfunction isArray(input) {\n    return input instanceof Array || Object.prototype.toString.call(input) === '[object Array]';\n}\n\nfunction isObject(input) {\n    // IE8 will treat undefined and null as object if it wasn't for\n    // input != null\n    return input != null && Object.prototype.toString.call(input) === '[object Object]';\n}\n\nfunction isObjectEmpty(obj) {\n    var k;\n    for (k in obj) {\n        // even if its not own property I'd still call it non-empty\n        return false;\n    }\n    return true;\n}\n\nfunction isNumber(input) {\n    return typeof input === 'number' || Object.prototype.toString.call(input) === '[object Number]';\n}\n\nfunction isDate(input) {\n    return input instanceof Date || Object.prototype.toString.call(input) === '[object Date]';\n}\n\nfunction map(arr, fn) {\n    var res = [], i;\n    for (i = 0; i < arr.length; ++i) {\n        res.push(fn(arr[i], i));\n    }\n    return res;\n}\n\nfunction hasOwnProp(a, b) {\n    return Object.prototype.hasOwnProperty.call(a, b);\n}\n\nfunction extend(a, b) {\n    for (var i in b) {\n        if (hasOwnProp(b, i)) {\n            a[i] = b[i];\n        }\n    }\n\n    if (hasOwnProp(b, 'toString')) {\n        a.toString = b.toString;\n    }\n\n    if (hasOwnProp(b, 'valueOf')) {\n        a.valueOf = b.valueOf;\n    }\n\n    return a;\n}\n\nfunction createUTC (input, format, locale, strict) {\n    return createLocalOrUTC(input, format, locale, strict, true).utc();\n}\n\nfunction defaultParsingFlags() {\n    // We need to deep clone this object.\n    return {\n        empty           : false,\n        unusedTokens    : [],\n        unusedInput     : [],\n        overflow        : -2,\n        charsLeftOver   : 0,\n        nullInput       : false,\n        invalidMonth    : null,\n        invalidFormat   : false,\n        userInvalidated : false,\n        iso             : false,\n        parsedDateParts : [],\n        meridiem        : null\n    };\n}\n\nfunction getParsingFlags(m) {\n    if (m._pf == null) {\n        m._pf = defaultParsingFlags();\n    }\n    return m._pf;\n}\n\nvar some;\nif (Array.prototype.some) {\n    some = Array.prototype.some;\n} else {\n    some = function (fun) {\n        var t = Object(this);\n        var len = t.length >>> 0;\n\n        for (var i = 0; i < len; i++) {\n            if (i in t && fun.call(this, t[i], i, t)) {\n                return true;\n            }\n        }\n\n        return false;\n    };\n}\n\nvar some$1 = some;\n\nfunction isValid(m) {\n    if (m._isValid == null) {\n        var flags = getParsingFlags(m);\n        var parsedParts = some$1.call(flags.parsedDateParts, function (i) {\n            return i != null;\n        });\n        var isNowValid = !isNaN(m._d.getTime()) &&\n            flags.overflow < 0 &&\n            !flags.empty &&\n            !flags.invalidMonth &&\n            !flags.invalidWeekday &&\n            !flags.nullInput &&\n            !flags.invalidFormat &&\n            !flags.userInvalidated &&\n            (!flags.meridiem || (flags.meridiem && parsedParts));\n\n        if (m._strict) {\n            isNowValid = isNowValid &&\n                flags.charsLeftOver === 0 &&\n                flags.unusedTokens.length === 0 &&\n                flags.bigHour === undefined;\n        }\n\n        if (Object.isFrozen == null || !Object.isFrozen(m)) {\n            m._isValid = isNowValid;\n        }\n        else {\n            return isNowValid;\n        }\n    }\n    return m._isValid;\n}\n\nfunction createInvalid (flags) {\n    var m = createUTC(NaN);\n    if (flags != null) {\n        extend(getParsingFlags(m), flags);\n    }\n    else {\n        getParsingFlags(m).userInvalidated = true;\n    }\n\n    return m;\n}\n\nfunction isUndefined(input) {\n    return input === void 0;\n}\n\n// Plugins that add properties should also add the key here (null value),\n// so we can properly clone ourselves.\nvar momentProperties = hooks.momentProperties = [];\n\nfunction copyConfig(to, from) {\n    var i, prop, val;\n\n    if (!isUndefined(from._isAMomentObject)) {\n        to._isAMomentObject = from._isAMomentObject;\n    }\n    if (!isUndefined(from._i)) {\n        to._i = from._i;\n    }\n    if (!isUndefined(from._f)) {\n        to._f = from._f;\n    }\n    if (!isUndefined(from._l)) {\n        to._l = from._l;\n    }\n    if (!isUndefined(from._strict)) {\n        to._strict = from._strict;\n    }\n    if (!isUndefined(from._tzm)) {\n        to._tzm = from._tzm;\n    }\n    if (!isUndefined(from._isUTC)) {\n        to._isUTC = from._isUTC;\n    }\n    if (!isUndefined(from._offset)) {\n        to._offset = from._offset;\n    }\n    if (!isUndefined(from._pf)) {\n        to._pf = getParsingFlags(from);\n    }\n    if (!isUndefined(from._locale)) {\n        to._locale = from._locale;\n    }\n\n    if (momentProperties.length > 0) {\n        for (i in momentProperties) {\n            prop = momentProperties[i];\n            val = from[prop];\n            if (!isUndefined(val)) {\n                to[prop] = val;\n            }\n        }\n    }\n\n    return to;\n}\n\nvar updateInProgress = false;\n\n// Moment prototype object\nfunction Moment(config) {\n    copyConfig(this, config);\n    this._d = new Date(config._d != null ? config._d.getTime() : NaN);\n    if (!this.isValid()) {\n        this._d = new Date(NaN);\n    }\n    // Prevent infinite loop in case updateOffset creates new moment\n    // objects.\n    if (updateInProgress === false) {\n        updateInProgress = true;\n        hooks.updateOffset(this);\n        updateInProgress = false;\n    }\n}\n\nfunction isMoment (obj) {\n    return obj instanceof Moment || (obj != null && obj._isAMomentObject != null);\n}\n\nfunction absFloor (number) {\n    if (number < 0) {\n        // -0 -> 0\n        return Math.ceil(number) || 0;\n    } else {\n        return Math.floor(number);\n    }\n}\n\nfunction toInt(argumentForCoercion) {\n    var coercedNumber = +argumentForCoercion,\n        value = 0;\n\n    if (coercedNumber !== 0 && isFinite(coercedNumber)) {\n        value = absFloor(coercedNumber);\n    }\n\n    return value;\n}\n\n// compare two arrays, return the number of differences\nfunction compareArrays(array1, array2, dontConvert) {\n    var len = Math.min(array1.length, array2.length),\n        lengthDiff = Math.abs(array1.length - array2.length),\n        diffs = 0,\n        i;\n    for (i = 0; i < len; i++) {\n        if ((dontConvert && array1[i] !== array2[i]) ||\n            (!dontConvert && toInt(array1[i]) !== toInt(array2[i]))) {\n            diffs++;\n        }\n    }\n    return diffs + lengthDiff;\n}\n\nfunction warn(msg) {\n    if (hooks.suppressDeprecationWarnings === false &&\n            (typeof console !==  'undefined') && console.warn) {\n        console.warn('Deprecation warning: ' + msg);\n    }\n}\n\nfunction deprecate(msg, fn) {\n    var firstTime = true;\n\n    return extend(function () {\n        if (hooks.deprecationHandler != null) {\n            hooks.deprecationHandler(null, msg);\n        }\n        if (firstTime) {\n            var args = [];\n            var arg;\n            for (var i = 0; i < arguments.length; i++) {\n                arg = '';\n                if (typeof arguments[i] === 'object') {\n                    arg += '\\n[' + i + '] ';\n                    for (var key in arguments[0]) {\n                        arg += key + ': ' + arguments[0][key] + ', ';\n                    }\n                    arg = arg.slice(0, -2); // Remove trailing comma and space\n                } else {\n                    arg = arguments[i];\n                }\n                args.push(arg);\n            }\n            warn(msg + '\\nArguments: ' + Array.prototype.slice.call(args).join('') + '\\n' + (new Error()).stack);\n            firstTime = false;\n        }\n        return fn.apply(this, arguments);\n    }, fn);\n}\n\nvar deprecations = {};\n\nfunction deprecateSimple(name, msg) {\n    if (hooks.deprecationHandler != null) {\n        hooks.deprecationHandler(name, msg);\n    }\n    if (!deprecations[name]) {\n        warn(msg);\n        deprecations[name] = true;\n    }\n}\n\nhooks.suppressDeprecationWarnings = false;\nhooks.deprecationHandler = null;\n\nfunction isFunction(input) {\n    return input instanceof Function || Object.prototype.toString.call(input) === '[object Function]';\n}\n\nfunction set (config) {\n    var prop, i;\n    for (i in config) {\n        prop = config[i];\n        if (isFunction(prop)) {\n            this[i] = prop;\n        } else {\n            this['_' + i] = prop;\n        }\n    }\n    this._config = config;\n    // Lenient ordinal parsing accepts just a number in addition to\n    // number + (possibly) stuff coming from _ordinalParseLenient.\n    this._ordinalParseLenient = new RegExp(this._ordinalParse.source + '|' + (/\\d{1,2}/).source);\n}\n\nfunction mergeConfigs(parentConfig, childConfig) {\n    var res = extend({}, parentConfig), prop;\n    for (prop in childConfig) {\n        if (hasOwnProp(childConfig, prop)) {\n            if (isObject(parentConfig[prop]) && isObject(childConfig[prop])) {\n                res[prop] = {};\n                extend(res[prop], parentConfig[prop]);\n                extend(res[prop], childConfig[prop]);\n            } else if (childConfig[prop] != null) {\n                res[prop] = childConfig[prop];\n            } else {\n                delete res[prop];\n            }\n        }\n    }\n    for (prop in parentConfig) {\n        if (hasOwnProp(parentConfig, prop) &&\n                !hasOwnProp(childConfig, prop) &&\n                isObject(parentConfig[prop])) {\n            // make sure changes to properties don't modify parent config\n            res[prop] = extend({}, res[prop]);\n        }\n    }\n    return res;\n}\n\nfunction Locale(config) {\n    if (config != null) {\n        this.set(config);\n    }\n}\n\nvar keys;\n\nif (Object.keys) {\n    keys = Object.keys;\n} else {\n    keys = function (obj) {\n        var i, res = [];\n        for (i in obj) {\n            if (hasOwnProp(obj, i)) {\n                res.push(i);\n            }\n        }\n        return res;\n    };\n}\n\nvar keys$1 = keys;\n\nvar defaultCalendar = {\n    sameDay : '[Today at] LT',\n    nextDay : '[Tomorrow at] LT',\n    nextWeek : 'dddd [at] LT',\n    lastDay : '[Yesterday at] LT',\n    lastWeek : '[Last] dddd [at] LT',\n    sameElse : 'L'\n};\n\nfunction calendar (key, mom, now) {\n    var output = this._calendar[key] || this._calendar['sameElse'];\n    return isFunction(output) ? output.call(mom, now) : output;\n}\n\nvar defaultLongDateFormat = {\n    LTS  : 'h:mm:ss A',\n    LT   : 'h:mm A',\n    L    : 'MM/DD/YYYY',\n    LL   : 'MMMM D, YYYY',\n    LLL  : 'MMMM D, YYYY h:mm A',\n    LLLL : 'dddd, MMMM D, YYYY h:mm A'\n};\n\nfunction longDateFormat (key) {\n    var format = this._longDateFormat[key],\n        formatUpper = this._longDateFormat[key.toUpperCase()];\n\n    if (format || !formatUpper) {\n        return format;\n    }\n\n    this._longDateFormat[key] = formatUpper.replace(/MMMM|MM|DD|dddd/g, function (val) {\n        return val.slice(1);\n    });\n\n    return this._longDateFormat[key];\n}\n\nvar defaultInvalidDate = 'Invalid date';\n\nfunction invalidDate () {\n    return this._invalidDate;\n}\n\nvar defaultOrdinal = '%d';\nvar defaultOrdinalParse = /\\d{1,2}/;\n\nfunction ordinal (number) {\n    return this._ordinal.replace('%d', number);\n}\n\nvar defaultRelativeTime = {\n    future : 'in %s',\n    past   : '%s ago',\n    s  : 'a few seconds',\n    m  : 'a minute',\n    mm : '%d minutes',\n    h  : 'an hour',\n    hh : '%d hours',\n    d  : 'a day',\n    dd : '%d days',\n    M  : 'a month',\n    MM : '%d months',\n    y  : 'a year',\n    yy : '%d years'\n};\n\nfunction relativeTime (number, withoutSuffix, string, isFuture) {\n    var output = this._relativeTime[string];\n    return (isFunction(output)) ?\n        output(number, withoutSuffix, string, isFuture) :\n        output.replace(/%d/i, number);\n}\n\nfunction pastFuture (diff, output) {\n    var format = this._relativeTime[diff > 0 ? 'future' : 'past'];\n    return isFunction(format) ? format(output) : format.replace(/%s/i, output);\n}\n\nvar aliases = {};\n\nfunction addUnitAlias (unit, shorthand) {\n    var lowerCase = unit.toLowerCase();\n    aliases[lowerCase] = aliases[lowerCase + 's'] = aliases[shorthand] = unit;\n}\n\nfunction normalizeUnits(units) {\n    return typeof units === 'string' ? aliases[units] || aliases[units.toLowerCase()] : undefined;\n}\n\nfunction normalizeObjectUnits(inputObject) {\n    var normalizedInput = {},\n        normalizedProp,\n        prop;\n\n    for (prop in inputObject) {\n        if (hasOwnProp(inputObject, prop)) {\n            normalizedProp = normalizeUnits(prop);\n            if (normalizedProp) {\n                normalizedInput[normalizedProp] = inputObject[prop];\n            }\n        }\n    }\n\n    return normalizedInput;\n}\n\nvar priorities = {};\n\nfunction addUnitPriority(unit, priority) {\n    priorities[unit] = priority;\n}\n\nfunction getPrioritizedUnits(unitsObj) {\n    var units = [];\n    for (var u in unitsObj) {\n        units.push({unit: u, priority: priorities[u]});\n    }\n    units.sort(function (a, b) {\n        return a.priority - b.priority;\n    });\n    return units;\n}\n\nfunction makeGetSet (unit, keepTime) {\n    return function (value) {\n        if (value != null) {\n            set$1(this, unit, value);\n            hooks.updateOffset(this, keepTime);\n            return this;\n        } else {\n            return get(this, unit);\n        }\n    };\n}\n\nfunction get (mom, unit) {\n    return mom.isValid() ?\n        mom._d['get' + (mom._isUTC ? 'UTC' : '') + unit]() : NaN;\n}\n\nfunction set$1 (mom, unit, value) {\n    if (mom.isValid()) {\n        mom._d['set' + (mom._isUTC ? 'UTC' : '') + unit](value);\n    }\n}\n\n// MOMENTS\n\nfunction stringGet (units) {\n    units = normalizeUnits(units);\n    if (isFunction(this[units])) {\n        return this[units]();\n    }\n    return this;\n}\n\n\nfunction stringSet (units, value) {\n    if (typeof units === 'object') {\n        units = normalizeObjectUnits(units);\n        var prioritized = getPrioritizedUnits(units);\n        for (var i = 0; i < prioritized.length; i++) {\n            this[prioritized[i].unit](units[prioritized[i].unit]);\n        }\n    } else {\n        units = normalizeUnits(units);\n        if (isFunction(this[units])) {\n            return this[units](value);\n        }\n    }\n    return this;\n}\n\nfunction zeroFill(number, targetLength, forceSign) {\n    var absNumber = '' + Math.abs(number),\n        zerosToFill = targetLength - absNumber.length,\n        sign = number >= 0;\n    return (sign ? (forceSign ? '+' : '') : '-') +\n        Math.pow(10, Math.max(0, zerosToFill)).toString().substr(1) + absNumber;\n}\n\nvar formattingTokens = /(\\[[^\\[]*\\])|(\\\\)?([Hh]mm(ss)?|Mo|MM?M?M?|Do|DDDo|DD?D?D?|ddd?d?|do?|w[o|w]?|W[o|W]?|Qo?|YYYYYY|YYYYY|YYYY|YY|gg(ggg?)?|GG(GGG?)?|e|E|a|A|hh?|HH?|kk?|mm?|ss?|S{1,9}|x|X|zz?|ZZ?|.)/g;\n\nvar localFormattingTokens = /(\\[[^\\[]*\\])|(\\\\)?(LTS|LT|LL?L?L?|l{1,4})/g;\n\nvar formatFunctions = {};\n\nvar formatTokenFunctions = {};\n\n// token:    'M'\n// padded:   ['MM', 2]\n// ordinal:  'Mo'\n// callback: function () { this.month() + 1 }\nfunction addFormatToken (token, padded, ordinal, callback) {\n    var func = callback;\n    if (typeof callback === 'string') {\n        func = function () {\n            return this[callback]();\n        };\n    }\n    if (token) {\n        formatTokenFunctions[token] = func;\n    }\n    if (padded) {\n        formatTokenFunctions[padded[0]] = function () {\n            return zeroFill(func.apply(this, arguments), padded[1], padded[2]);\n        };\n    }\n    if (ordinal) {\n        formatTokenFunctions[ordinal] = function () {\n            return this.localeData().ordinal(func.apply(this, arguments), token);\n        };\n    }\n}\n\nfunction removeFormattingTokens(input) {\n    if (input.match(/\\[[\\s\\S]/)) {\n        return input.replace(/^\\[|\\]$/g, '');\n    }\n    return input.replace(/\\\\/g, '');\n}\n\nfunction makeFormatFunction(format) {\n    var array = format.match(formattingTokens), i, length;\n\n    for (i = 0, length = array.length; i < length; i++) {\n        if (formatTokenFunctions[array[i]]) {\n            array[i] = formatTokenFunctions[array[i]];\n        } else {\n            array[i] = removeFormattingTokens(array[i]);\n        }\n    }\n\n    return function (mom) {\n        var output = '', i;\n        for (i = 0; i < length; i++) {\n            output += array[i] instanceof Function ? array[i].call(mom, format) : array[i];\n        }\n        return output;\n    };\n}\n\n// format date using native date object\nfunction formatMoment(m, format) {\n    if (!m.isValid()) {\n        return m.localeData().invalidDate();\n    }\n\n    format = expandFormat(format, m.localeData());\n    formatFunctions[format] = formatFunctions[format] || makeFormatFunction(format);\n\n    return formatFunctions[format](m);\n}\n\nfunction expandFormat(format, locale) {\n    var i = 5;\n\n    function replaceLongDateFormatTokens(input) {\n        return locale.longDateFormat(input) || input;\n    }\n\n    localFormattingTokens.lastIndex = 0;\n    while (i >= 0 && localFormattingTokens.test(format)) {\n        format = format.replace(localFormattingTokens, replaceLongDateFormatTokens);\n        localFormattingTokens.lastIndex = 0;\n        i -= 1;\n    }\n\n    return format;\n}\n\nvar match1         = /\\d/;            //       0 - 9\nvar match2         = /\\d\\d/;          //      00 - 99\nvar match3         = /\\d{3}/;         //     000 - 999\nvar match4         = /\\d{4}/;         //    0000 - 9999\nvar match6         = /[+-]?\\d{6}/;    // -999999 - 999999\nvar match1to2      = /\\d\\d?/;         //       0 - 99\nvar match3to4      = /\\d\\d\\d\\d?/;     //     999 - 9999\nvar match5to6      = /\\d\\d\\d\\d\\d\\d?/; //   99999 - 999999\nvar match1to3      = /\\d{1,3}/;       //       0 - 999\nvar match1to4      = /\\d{1,4}/;       //       0 - 9999\nvar match1to6      = /[+-]?\\d{1,6}/;  // -999999 - 999999\n\nvar matchUnsigned  = /\\d+/;           //       0 - inf\nvar matchSigned    = /[+-]?\\d+/;      //    -inf - inf\n\nvar matchOffset    = /Z|[+-]\\d\\d:?\\d\\d/gi; // +00:00 -00:00 +0000 -0000 or Z\nvar matchShortOffset = /Z|[+-]\\d\\d(?::?\\d\\d)?/gi; // +00 -00 +00:00 -00:00 +0000 -0000 or Z\n\nvar matchTimestamp = /[+-]?\\d+(\\.\\d{1,3})?/; // 123456789 123456789.123\n\n// any word (or two) characters or numbers including two/three word month in arabic.\n// includes scottish gaelic two word and hyphenated months\nvar matchWord = /[0-9]*['a-z\\u00A0-\\u05FF\\u0700-\\uD7FF\\uF900-\\uFDCF\\uFDF0-\\uFFEF]+|[\\u0600-\\u06FF\\/]+(\\s*?[\\u0600-\\u06FF]+){1,2}/i;\n\n\nvar regexes = {};\n\nfunction addRegexToken (token, regex, strictRegex) {\n    regexes[token] = isFunction(regex) ? regex : function (isStrict, localeData) {\n        return (isStrict && strictRegex) ? strictRegex : regex;\n    };\n}\n\nfunction getParseRegexForToken (token, config) {\n    if (!hasOwnProp(regexes, token)) {\n        return new RegExp(unescapeFormat(token));\n    }\n\n    return regexes[token](config._strict, config._locale);\n}\n\n// Code from http://stackoverflow.com/questions/3561493/is-there-a-regexp-escape-function-in-javascript\nfunction unescapeFormat(s) {\n    return regexEscape(s.replace('\\\\', '').replace(/\\\\(\\[)|\\\\(\\])|\\[([^\\]\\[]*)\\]|\\\\(.)/g, function (matched, p1, p2, p3, p4) {\n        return p1 || p2 || p3 || p4;\n    }));\n}\n\nfunction regexEscape(s) {\n    return s.replace(/[-\\/\\\\^$*+?.()|[\\]{}]/g, '\\\\$&');\n}\n\nvar tokens = {};\n\nfunction addParseToken (token, callback) {\n    var i, func = callback;\n    if (typeof token === 'string') {\n        token = [token];\n    }\n    if (isNumber(callback)) {\n        func = function (input, array) {\n            array[callback] = toInt(input);\n        };\n    }\n    for (i = 0; i < token.length; i++) {\n        tokens[token[i]] = func;\n    }\n}\n\nfunction addWeekParseToken (token, callback) {\n    addParseToken(token, function (input, array, config, token) {\n        config._w = config._w || {};\n        callback(input, config._w, config, token);\n    });\n}\n\nfunction addTimeToArrayFromToken(token, input, config) {\n    if (input != null && hasOwnProp(tokens, token)) {\n        tokens[token](input, config._a, config, token);\n    }\n}\n\nvar YEAR = 0;\nvar MONTH = 1;\nvar DATE = 2;\nvar HOUR = 3;\nvar MINUTE = 4;\nvar SECOND = 5;\nvar MILLISECOND = 6;\nvar WEEK = 7;\nvar WEEKDAY = 8;\n\nvar indexOf;\n\nif (Array.prototype.indexOf) {\n    indexOf = Array.prototype.indexOf;\n} else {\n    indexOf = function (o) {\n        // I know\n        var i;\n        for (i = 0; i < this.length; ++i) {\n            if (this[i] === o) {\n                return i;\n            }\n        }\n        return -1;\n    };\n}\n\nvar indexOf$1 = indexOf;\n\nfunction daysInMonth(year, month) {\n    return new Date(Date.UTC(year, month + 1, 0)).getUTCDate();\n}\n\n// FORMATTING\n\naddFormatToken('M', ['MM', 2], 'Mo', function () {\n    return this.month() + 1;\n});\n\naddFormatToken('MMM', 0, 0, function (format) {\n    return this.localeData().monthsShort(this, format);\n});\n\naddFormatToken('MMMM', 0, 0, function (format) {\n    return this.localeData().months(this, format);\n});\n\n// ALIASES\n\naddUnitAlias('month', 'M');\n\n// PRIORITY\n\naddUnitPriority('month', 8);\n\n// PARSING\n\naddRegexToken('M',    match1to2);\naddRegexToken('MM',   match1to2, match2);\naddRegexToken('MMM',  function (isStrict, locale) {\n    return locale.monthsShortRegex(isStrict);\n});\naddRegexToken('MMMM', function (isStrict, locale) {\n    return locale.monthsRegex(isStrict);\n});\n\naddParseToken(['M', 'MM'], function (input, array) {\n    array[MONTH] = toInt(input) - 1;\n});\n\naddParseToken(['MMM', 'MMMM'], function (input, array, config, token) {\n    var month = config._locale.monthsParse(input, token, config._strict);\n    // if we didn't find a month name, mark the date as invalid.\n    if (month != null) {\n        array[MONTH] = month;\n    } else {\n        getParsingFlags(config).invalidMonth = input;\n    }\n});\n\n// LOCALES\n\nvar MONTHS_IN_FORMAT = /D[oD]?(\\[[^\\[\\]]*\\]|\\s)+MMMM?/;\nvar defaultLocaleMonths = 'January_February_March_April_May_June_July_August_September_October_November_December'.split('_');\nfunction localeMonths (m, format) {\n    if (!m) {\n        return this._months;\n    }\n    return isArray(this._months) ? this._months[m.month()] :\n        this._months[(this._months.isFormat || MONTHS_IN_FORMAT).test(format) ? 'format' : 'standalone'][m.month()];\n}\n\nvar defaultLocaleMonthsShort = 'Jan_Feb_Mar_Apr_May_Jun_Jul_Aug_Sep_Oct_Nov_Dec'.split('_');\nfunction localeMonthsShort (m, format) {\n    if (!m) {\n        return this._monthsShort;\n    }\n    return isArray(this._monthsShort) ? this._monthsShort[m.month()] :\n        this._monthsShort[MONTHS_IN_FORMAT.test(format) ? 'format' : 'standalone'][m.month()];\n}\n\nfunction handleStrictParse(monthName, format, strict) {\n    var i, ii, mom, llc = monthName.toLocaleLowerCase();\n    if (!this._monthsParse) {\n        // this is not used\n        this._monthsParse = [];\n        this._longMonthsParse = [];\n        this._shortMonthsParse = [];\n        for (i = 0; i < 12; ++i) {\n            mom = createUTC([2000, i]);\n            this._shortMonthsParse[i] = this.monthsShort(mom, '').toLocaleLowerCase();\n            this._longMonthsParse[i] = this.months(mom, '').toLocaleLowerCase();\n        }\n    }\n\n    if (strict) {\n        if (format === 'MMM') {\n            ii = indexOf$1.call(this._shortMonthsParse, llc);\n            return ii !== -1 ? ii : null;\n        } else {\n            ii = indexOf$1.call(this._longMonthsParse, llc);\n            return ii !== -1 ? ii : null;\n        }\n    } else {\n        if (format === 'MMM') {\n            ii = indexOf$1.call(this._shortMonthsParse, llc);\n            if (ii !== -1) {\n                return ii;\n            }\n            ii = indexOf$1.call(this._longMonthsParse, llc);\n            return ii !== -1 ? ii : null;\n        } else {\n            ii = indexOf$1.call(this._longMonthsParse, llc);\n            if (ii !== -1) {\n                return ii;\n            }\n            ii = indexOf$1.call(this._shortMonthsParse, llc);\n            return ii !== -1 ? ii : null;\n        }\n    }\n}\n\nfunction localeMonthsParse (monthName, format, strict) {\n    var i, mom, regex;\n\n    if (this._monthsParseExact) {\n        return handleStrictParse.call(this, monthName, format, strict);\n    }\n\n    if (!this._monthsParse) {\n        this._monthsParse = [];\n        this._longMonthsParse = [];\n        this._shortMonthsParse = [];\n    }\n\n    // TODO: add sorting\n    // Sorting makes sure if one month (or abbr) is a prefix of another\n    // see sorting in computeMonthsParse\n    for (i = 0; i < 12; i++) {\n        // make the regex if we don't have it already\n        mom = createUTC([2000, i]);\n        if (strict && !this._longMonthsParse[i]) {\n            this._longMonthsParse[i] = new RegExp('^' + this.months(mom, '').replace('.', '') + '$', 'i');\n            this._shortMonthsParse[i] = new RegExp('^' + this.monthsShort(mom, '').replace('.', '') + '$', 'i');\n        }\n        if (!strict && !this._monthsParse[i]) {\n            regex = '^' + this.months(mom, '') + '|^' + this.monthsShort(mom, '');\n            this._monthsParse[i] = new RegExp(regex.replace('.', ''), 'i');\n        }\n        // test the regex\n        if (strict && format === 'MMMM' && this._longMonthsParse[i].test(monthName)) {\n            return i;\n        } else if (strict && format === 'MMM' && this._shortMonthsParse[i].test(monthName)) {\n            return i;\n        } else if (!strict && this._monthsParse[i].test(monthName)) {\n            return i;\n        }\n    }\n}\n\n// MOMENTS\n\nfunction setMonth (mom, value) {\n    var dayOfMonth;\n\n    if (!mom.isValid()) {\n        // No op\n        return mom;\n    }\n\n    if (typeof value === 'string') {\n        if (/^\\d+$/.test(value)) {\n            value = toInt(value);\n        } else {\n            value = mom.localeData().monthsParse(value);\n            // TODO: Another silent failure?\n            if (!isNumber(value)) {\n                return mom;\n            }\n        }\n    }\n\n    dayOfMonth = Math.min(mom.date(), daysInMonth(mom.year(), value));\n    mom._d['set' + (mom._isUTC ? 'UTC' : '') + 'Month'](value, dayOfMonth);\n    return mom;\n}\n\nfunction getSetMonth (value) {\n    if (value != null) {\n        setMonth(this, value);\n        hooks.updateOffset(this, true);\n        return this;\n    } else {\n        return get(this, 'Month');\n    }\n}\n\nfunction getDaysInMonth () {\n    return daysInMonth(this.year(), this.month());\n}\n\nvar defaultMonthsShortRegex = matchWord;\nfunction monthsShortRegex (isStrict) {\n    if (this._monthsParseExact) {\n        if (!hasOwnProp(this, '_monthsRegex')) {\n            computeMonthsParse.call(this);\n        }\n        if (isStrict) {\n            return this._monthsShortStrictRegex;\n        } else {\n            return this._monthsShortRegex;\n        }\n    } else {\n        if (!hasOwnProp(this, '_monthsShortRegex')) {\n            this._monthsShortRegex = defaultMonthsShortRegex;\n        }\n        return this._monthsShortStrictRegex && isStrict ?\n            this._monthsShortStrictRegex : this._monthsShortRegex;\n    }\n}\n\nvar defaultMonthsRegex = matchWord;\nfunction monthsRegex (isStrict) {\n    if (this._monthsParseExact) {\n        if (!hasOwnProp(this, '_monthsRegex')) {\n            computeMonthsParse.call(this);\n        }\n        if (isStrict) {\n            return this._monthsStrictRegex;\n        } else {\n            return this._monthsRegex;\n        }\n    } else {\n        if (!hasOwnProp(this, '_monthsRegex')) {\n            this._monthsRegex = defaultMonthsRegex;\n        }\n        return this._monthsStrictRegex && isStrict ?\n            this._monthsStrictRegex : this._monthsRegex;\n    }\n}\n\nfunction computeMonthsParse () {\n    function cmpLenRev(a, b) {\n        return b.length - a.length;\n    }\n\n    var shortPieces = [], longPieces = [], mixedPieces = [],\n        i, mom;\n    for (i = 0; i < 12; i++) {\n        // make the regex if we don't have it already\n        mom = createUTC([2000, i]);\n        shortPieces.push(this.monthsShort(mom, ''));\n        longPieces.push(this.months(mom, ''));\n        mixedPieces.push(this.months(mom, ''));\n        mixedPieces.push(this.monthsShort(mom, ''));\n    }\n    // Sorting makes sure if one month (or abbr) is a prefix of another it\n    // will match the longer piece.\n    shortPieces.sort(cmpLenRev);\n    longPieces.sort(cmpLenRev);\n    mixedPieces.sort(cmpLenRev);\n    for (i = 0; i < 12; i++) {\n        shortPieces[i] = regexEscape(shortPieces[i]);\n        longPieces[i] = regexEscape(longPieces[i]);\n    }\n    for (i = 0; i < 24; i++) {\n        mixedPieces[i] = regexEscape(mixedPieces[i]);\n    }\n\n    this._monthsRegex = new RegExp('^(' + mixedPieces.join('|') + ')', 'i');\n    this._monthsShortRegex = this._monthsRegex;\n    this._monthsStrictRegex = new RegExp('^(' + longPieces.join('|') + ')', 'i');\n    this._monthsShortStrictRegex = new RegExp('^(' + shortPieces.join('|') + ')', 'i');\n}\n\n// FORMATTING\n\naddFormatToken('Y', 0, 0, function () {\n    var y = this.year();\n    return y <= 9999 ? '' + y : '+' + y;\n});\n\naddFormatToken(0, ['YY', 2], 0, function () {\n    return this.year() % 100;\n});\n\naddFormatToken(0, ['YYYY',   4],       0, 'year');\naddFormatToken(0, ['YYYYY',  5],       0, 'year');\naddFormatToken(0, ['YYYYYY', 6, true], 0, 'year');\n\n// ALIASES\n\naddUnitAlias('year', 'y');\n\n// PRIORITIES\n\naddUnitPriority('year', 1);\n\n// PARSING\n\naddRegexToken('Y',      matchSigned);\naddRegexToken('YY',     match1to2, match2);\naddRegexToken('YYYY',   match1to4, match4);\naddRegexToken('YYYYY',  match1to6, match6);\naddRegexToken('YYYYYY', match1to6, match6);\n\naddParseToken(['YYYYY', 'YYYYYY'], YEAR);\naddParseToken('YYYY', function (input, array) {\n    array[YEAR] = input.length === 2 ? hooks.parseTwoDigitYear(input) : toInt(input);\n});\naddParseToken('YY', function (input, array) {\n    array[YEAR] = hooks.parseTwoDigitYear(input);\n});\naddParseToken('Y', function (input, array) {\n    array[YEAR] = parseInt(input, 10);\n});\n\n// HELPERS\n\nfunction daysInYear(year) {\n    return isLeapYear(year) ? 366 : 365;\n}\n\nfunction isLeapYear(year) {\n    return (year % 4 === 0 && year % 100 !== 0) || year % 400 === 0;\n}\n\n// HOOKS\n\nhooks.parseTwoDigitYear = function (input) {\n    return toInt(input) + (toInt(input) > 68 ? 1900 : 2000);\n};\n\n// MOMENTS\n\nvar getSetYear = makeGetSet('FullYear', true);\n\nfunction getIsLeapYear () {\n    return isLeapYear(this.year());\n}\n\nfunction createDate (y, m, d, h, M, s, ms) {\n    //can't just apply() to create a date:\n    //http://stackoverflow.com/questions/181348/instantiating-a-javascript-object-by-calling-prototype-constructor-apply\n    var date = new Date(y, m, d, h, M, s, ms);\n\n    //the date constructor remaps years 0-99 to 1900-1999\n    if (y < 100 && y >= 0 && isFinite(date.getFullYear())) {\n        date.setFullYear(y);\n    }\n    return date;\n}\n\nfunction createUTCDate (y) {\n    var date = new Date(Date.UTC.apply(null, arguments));\n\n    //the Date.UTC function remaps years 0-99 to 1900-1999\n    if (y < 100 && y >= 0 && isFinite(date.getUTCFullYear())) {\n        date.setUTCFullYear(y);\n    }\n    return date;\n}\n\n// start-of-first-week - start-of-year\nfunction firstWeekOffset(year, dow, doy) {\n    var // first-week day -- which january is always in the first week (4 for iso, 1 for other)\n        fwd = 7 + dow - doy,\n        // first-week day local weekday -- which local weekday is fwd\n        fwdlw = (7 + createUTCDate(year, 0, fwd).getUTCDay() - dow) % 7;\n\n    return -fwdlw + fwd - 1;\n}\n\n//http://en.wikipedia.org/wiki/ISO_week_date#Calculating_a_date_given_the_year.2C_week_number_and_weekday\nfunction dayOfYearFromWeeks(year, week, weekday, dow, doy) {\n    var localWeekday = (7 + weekday - dow) % 7,\n        weekOffset = firstWeekOffset(year, dow, doy),\n        dayOfYear = 1 + 7 * (week - 1) + localWeekday + weekOffset,\n        resYear, resDayOfYear;\n\n    if (dayOfYear <= 0) {\n        resYear = year - 1;\n        resDayOfYear = daysInYear(resYear) + dayOfYear;\n    } else if (dayOfYear > daysInYear(year)) {\n        resYear = year + 1;\n        resDayOfYear = dayOfYear - daysInYear(year);\n    } else {\n        resYear = year;\n        resDayOfYear = dayOfYear;\n    }\n\n    return {\n        year: resYear,\n        dayOfYear: resDayOfYear\n    };\n}\n\nfunction weekOfYear(mom, dow, doy) {\n    var weekOffset = firstWeekOffset(mom.year(), dow, doy),\n        week = Math.floor((mom.dayOfYear() - weekOffset - 1) / 7) + 1,\n        resWeek, resYear;\n\n    if (week < 1) {\n        resYear = mom.year() - 1;\n        resWeek = week + weeksInYear(resYear, dow, doy);\n    } else if (week > weeksInYear(mom.year(), dow, doy)) {\n        resWeek = week - weeksInYear(mom.year(), dow, doy);\n        resYear = mom.year() + 1;\n    } else {\n        resYear = mom.year();\n        resWeek = week;\n    }\n\n    return {\n        week: resWeek,\n        year: resYear\n    };\n}\n\nfunction weeksInYear(year, dow, doy) {\n    var weekOffset = firstWeekOffset(year, dow, doy),\n        weekOffsetNext = firstWeekOffset(year + 1, dow, doy);\n    return (daysInYear(year) - weekOffset + weekOffsetNext) / 7;\n}\n\n// FORMATTING\n\naddFormatToken('w', ['ww', 2], 'wo', 'week');\naddFormatToken('W', ['WW', 2], 'Wo', 'isoWeek');\n\n// ALIASES\n\naddUnitAlias('week', 'w');\naddUnitAlias('isoWeek', 'W');\n\n// PRIORITIES\n\naddUnitPriority('week', 5);\naddUnitPriority('isoWeek', 5);\n\n// PARSING\n\naddRegexToken('w',  match1to2);\naddRegexToken('ww', match1to2, match2);\naddRegexToken('W',  match1to2);\naddRegexToken('WW', match1to2, match2);\n\naddWeekParseToken(['w', 'ww', 'W', 'WW'], function (input, week, config, token) {\n    week[token.substr(0, 1)] = toInt(input);\n});\n\n// HELPERS\n\n// LOCALES\n\nfunction localeWeek (mom) {\n    return weekOfYear(mom, this._week.dow, this._week.doy).week;\n}\n\nvar defaultLocaleWeek = {\n    dow : 0, // Sunday is the first day of the week.\n    doy : 6  // The week that contains Jan 1st is the first week of the year.\n};\n\nfunction localeFirstDayOfWeek () {\n    return this._week.dow;\n}\n\nfunction localeFirstDayOfYear () {\n    return this._week.doy;\n}\n\n// MOMENTS\n\nfunction getSetWeek (input) {\n    var week = this.localeData().week(this);\n    return input == null ? week : this.add((input - week) * 7, 'd');\n}\n\nfunction getSetISOWeek (input) {\n    var week = weekOfYear(this, 1, 4).week;\n    return input == null ? week : this.add((input - week) * 7, 'd');\n}\n\n// FORMATTING\n\naddFormatToken('d', 0, 'do', 'day');\n\naddFormatToken('dd', 0, 0, function (format) {\n    return this.localeData().weekdaysMin(this, format);\n});\n\naddFormatToken('ddd', 0, 0, function (format) {\n    return this.localeData().weekdaysShort(this, format);\n});\n\naddFormatToken('dddd', 0, 0, function (format) {\n    return this.localeData().weekdays(this, format);\n});\n\naddFormatToken('e', 0, 0, 'weekday');\naddFormatToken('E', 0, 0, 'isoWeekday');\n\n// ALIASES\n\naddUnitAlias('day', 'd');\naddUnitAlias('weekday', 'e');\naddUnitAlias('isoWeekday', 'E');\n\n// PRIORITY\naddUnitPriority('day', 11);\naddUnitPriority('weekday', 11);\naddUnitPriority('isoWeekday', 11);\n\n// PARSING\n\naddRegexToken('d',    match1to2);\naddRegexToken('e',    match1to2);\naddRegexToken('E',    match1to2);\naddRegexToken('dd',   function (isStrict, locale) {\n    return locale.weekdaysMinRegex(isStrict);\n});\naddRegexToken('ddd',   function (isStrict, locale) {\n    return locale.weekdaysShortRegex(isStrict);\n});\naddRegexToken('dddd',   function (isStrict, locale) {\n    return locale.weekdaysRegex(isStrict);\n});\n\naddWeekParseToken(['dd', 'ddd', 'dddd'], function (input, week, config, token) {\n    var weekday = config._locale.weekdaysParse(input, token, config._strict);\n    // if we didn't get a weekday name, mark the date as invalid\n    if (weekday != null) {\n        week.d = weekday;\n    } else {\n        getParsingFlags(config).invalidWeekday = input;\n    }\n});\n\naddWeekParseToken(['d', 'e', 'E'], function (input, week, config, token) {\n    week[token] = toInt(input);\n});\n\n// HELPERS\n\nfunction parseWeekday(input, locale) {\n    if (typeof input !== 'string') {\n        return input;\n    }\n\n    if (!isNaN(input)) {\n        return parseInt(input, 10);\n    }\n\n    input = locale.weekdaysParse(input);\n    if (typeof input === 'number') {\n        return input;\n    }\n\n    return null;\n}\n\nfunction parseIsoWeekday(input, locale) {\n    if (typeof input === 'string') {\n        return locale.weekdaysParse(input) % 7 || 7;\n    }\n    return isNaN(input) ? null : input;\n}\n\n// LOCALES\n\nvar defaultLocaleWeekdays = 'Sunday_Monday_Tuesday_Wednesday_Thursday_Friday_Saturday'.split('_');\nfunction localeWeekdays (m, format) {\n    if (!m) {\n        return this._weekdays;\n    }\n    return isArray(this._weekdays) ? this._weekdays[m.day()] :\n        this._weekdays[this._weekdays.isFormat.test(format) ? 'format' : 'standalone'][m.day()];\n}\n\nvar defaultLocaleWeekdaysShort = 'Sun_Mon_Tue_Wed_Thu_Fri_Sat'.split('_');\nfunction localeWeekdaysShort (m) {\n    return (m) ? this._weekdaysShort[m.day()] : this._weekdaysShort;\n}\n\nvar defaultLocaleWeekdaysMin = 'Su_Mo_Tu_We_Th_Fr_Sa'.split('_');\nfunction localeWeekdaysMin (m) {\n    return (m) ? this._weekdaysMin[m.day()] : this._weekdaysMin;\n}\n\nfunction handleStrictParse$1(weekdayName, format, strict) {\n    var i, ii, mom, llc = weekdayName.toLocaleLowerCase();\n    if (!this._weekdaysParse) {\n        this._weekdaysParse = [];\n        this._shortWeekdaysParse = [];\n        this._minWeekdaysParse = [];\n\n        for (i = 0; i < 7; ++i) {\n            mom = createUTC([2000, 1]).day(i);\n            this._minWeekdaysParse[i] = this.weekdaysMin(mom, '').toLocaleLowerCase();\n            this._shortWeekdaysParse[i] = this.weekdaysShort(mom, '').toLocaleLowerCase();\n            this._weekdaysParse[i] = this.weekdays(mom, '').toLocaleLowerCase();\n        }\n    }\n\n    if (strict) {\n        if (format === 'dddd') {\n            ii = indexOf$1.call(this._weekdaysParse, llc);\n            return ii !== -1 ? ii : null;\n        } else if (format === 'ddd') {\n            ii = indexOf$1.call(this._shortWeekdaysParse, llc);\n            return ii !== -1 ? ii : null;\n        } else {\n            ii = indexOf$1.call(this._minWeekdaysParse, llc);\n            return ii !== -1 ? ii : null;\n        }\n    } else {\n        if (format === 'dddd') {\n            ii = indexOf$1.call(this._weekdaysParse, llc);\n            if (ii !== -1) {\n                return ii;\n            }\n            ii = indexOf$1.call(this._shortWeekdaysParse, llc);\n            if (ii !== -1) {\n                return ii;\n            }\n            ii = indexOf$1.call(this._minWeekdaysParse, llc);\n            return ii !== -1 ? ii : null;\n        } else if (format === 'ddd') {\n            ii = indexOf$1.call(this._shortWeekdaysParse, llc);\n            if (ii !== -1) {\n                return ii;\n            }\n            ii = indexOf$1.call(this._weekdaysParse, llc);\n            if (ii !== -1) {\n                return ii;\n            }\n            ii = indexOf$1.call(this._minWeekdaysParse, llc);\n            return ii !== -1 ? ii : null;\n        } else {\n            ii = indexOf$1.call(this._minWeekdaysParse, llc);\n            if (ii !== -1) {\n                return ii;\n            }\n            ii = indexOf$1.call(this._weekdaysParse, llc);\n            if (ii !== -1) {\n                return ii;\n            }\n            ii = indexOf$1.call(this._shortWeekdaysParse, llc);\n            return ii !== -1 ? ii : null;\n        }\n    }\n}\n\nfunction localeWeekdaysParse (weekdayName, format, strict) {\n    var i, mom, regex;\n\n    if (this._weekdaysParseExact) {\n        return handleStrictParse$1.call(this, weekdayName, format, strict);\n    }\n\n    if (!this._weekdaysParse) {\n        this._weekdaysParse = [];\n        this._minWeekdaysParse = [];\n        this._shortWeekdaysParse = [];\n        this._fullWeekdaysParse = [];\n    }\n\n    for (i = 0; i < 7; i++) {\n        // make the regex if we don't have it already\n\n        mom = createUTC([2000, 1]).day(i);\n        if (strict && !this._fullWeekdaysParse[i]) {\n            this._fullWeekdaysParse[i] = new RegExp('^' + this.weekdays(mom, '').replace('.', '\\.?') + '$', 'i');\n            this._shortWeekdaysParse[i] = new RegExp('^' + this.weekdaysShort(mom, '').replace('.', '\\.?') + '$', 'i');\n            this._minWeekdaysParse[i] = new RegExp('^' + this.weekdaysMin(mom, '').replace('.', '\\.?') + '$', 'i');\n        }\n        if (!this._weekdaysParse[i]) {\n            regex = '^' + this.weekdays(mom, '') + '|^' + this.weekdaysShort(mom, '') + '|^' + this.weekdaysMin(mom, '');\n            this._weekdaysParse[i] = new RegExp(regex.replace('.', ''), 'i');\n        }\n        // test the regex\n        if (strict && format === 'dddd' && this._fullWeekdaysParse[i].test(weekdayName)) {\n            return i;\n        } else if (strict && format === 'ddd' && this._shortWeekdaysParse[i].test(weekdayName)) {\n            return i;\n        } else if (strict && format === 'dd' && this._minWeekdaysParse[i].test(weekdayName)) {\n            return i;\n        } else if (!strict && this._weekdaysParse[i].test(weekdayName)) {\n            return i;\n        }\n    }\n}\n\n// MOMENTS\n\nfunction getSetDayOfWeek (input) {\n    if (!this.isValid()) {\n        return input != null ? this : NaN;\n    }\n    var day = this._isUTC ? this._d.getUTCDay() : this._d.getDay();\n    if (input != null) {\n        input = parseWeekday(input, this.localeData());\n        return this.add(input - day, 'd');\n    } else {\n        return day;\n    }\n}\n\nfunction getSetLocaleDayOfWeek (input) {\n    if (!this.isValid()) {\n        return input != null ? this : NaN;\n    }\n    var weekday = (this.day() + 7 - this.localeData()._week.dow) % 7;\n    return input == null ? weekday : this.add(input - weekday, 'd');\n}\n\nfunction getSetISODayOfWeek (input) {\n    if (!this.isValid()) {\n        return input != null ? this : NaN;\n    }\n\n    // behaves the same as moment#day except\n    // as a getter, returns 7 instead of 0 (1-7 range instead of 0-6)\n    // as a setter, sunday should belong to the previous week.\n\n    if (input != null) {\n        var weekday = parseIsoWeekday(input, this.localeData());\n        return this.day(this.day() % 7 ? weekday : weekday - 7);\n    } else {\n        return this.day() || 7;\n    }\n}\n\nvar defaultWeekdaysRegex = matchWord;\nfunction weekdaysRegex (isStrict) {\n    if (this._weekdaysParseExact) {\n        if (!hasOwnProp(this, '_weekdaysRegex')) {\n            computeWeekdaysParse.call(this);\n        }\n        if (isStrict) {\n            return this._weekdaysStrictRegex;\n        } else {\n            return this._weekdaysRegex;\n        }\n    } else {\n        if (!hasOwnProp(this, '_weekdaysRegex')) {\n            this._weekdaysRegex = defaultWeekdaysRegex;\n        }\n        return this._weekdaysStrictRegex && isStrict ?\n            this._weekdaysStrictRegex : this._weekdaysRegex;\n    }\n}\n\nvar defaultWeekdaysShortRegex = matchWord;\nfunction weekdaysShortRegex (isStrict) {\n    if (this._weekdaysParseExact) {\n        if (!hasOwnProp(this, '_weekdaysRegex')) {\n            computeWeekdaysParse.call(this);\n        }\n        if (isStrict) {\n            return this._weekdaysShortStrictRegex;\n        } else {\n            return this._weekdaysShortRegex;\n        }\n    } else {\n        if (!hasOwnProp(this, '_weekdaysShortRegex')) {\n            this._weekdaysShortRegex = defaultWeekdaysShortRegex;\n        }\n        return this._weekdaysShortStrictRegex && isStrict ?\n            this._weekdaysShortStrictRegex : this._weekdaysShortRegex;\n    }\n}\n\nvar defaultWeekdaysMinRegex = matchWord;\nfunction weekdaysMinRegex (isStrict) {\n    if (this._weekdaysParseExact) {\n        if (!hasOwnProp(this, '_weekdaysRegex')) {\n            computeWeekdaysParse.call(this);\n        }\n        if (isStrict) {\n            return this._weekdaysMinStrictRegex;\n        } else {\n            return this._weekdaysMinRegex;\n        }\n    } else {\n        if (!hasOwnProp(this, '_weekdaysMinRegex')) {\n            this._weekdaysMinRegex = defaultWeekdaysMinRegex;\n        }\n        return this._weekdaysMinStrictRegex && isStrict ?\n            this._weekdaysMinStrictRegex : this._weekdaysMinRegex;\n    }\n}\n\n\nfunction computeWeekdaysParse () {\n    function cmpLenRev(a, b) {\n        return b.length - a.length;\n    }\n\n    var minPieces = [], shortPieces = [], longPieces = [], mixedPieces = [],\n        i, mom, minp, shortp, longp;\n    for (i = 0; i < 7; i++) {\n        // make the regex if we don't have it already\n        mom = createUTC([2000, 1]).day(i);\n        minp = this.weekdaysMin(mom, '');\n        shortp = this.weekdaysShort(mom, '');\n        longp = this.weekdays(mom, '');\n        minPieces.push(minp);\n        shortPieces.push(shortp);\n        longPieces.push(longp);\n        mixedPieces.push(minp);\n        mixedPieces.push(shortp);\n        mixedPieces.push(longp);\n    }\n    // Sorting makes sure if one weekday (or abbr) is a prefix of another it\n    // will match the longer piece.\n    minPieces.sort(cmpLenRev);\n    shortPieces.sort(cmpLenRev);\n    longPieces.sort(cmpLenRev);\n    mixedPieces.sort(cmpLenRev);\n    for (i = 0; i < 7; i++) {\n        shortPieces[i] = regexEscape(shortPieces[i]);\n        longPieces[i] = regexEscape(longPieces[i]);\n        mixedPieces[i] = regexEscape(mixedPieces[i]);\n    }\n\n    this._weekdaysRegex = new RegExp('^(' + mixedPieces.join('|') + ')', 'i');\n    this._weekdaysShortRegex = this._weekdaysRegex;\n    this._weekdaysMinRegex = this._weekdaysRegex;\n\n    this._weekdaysStrictRegex = new RegExp('^(' + longPieces.join('|') + ')', 'i');\n    this._weekdaysShortStrictRegex = new RegExp('^(' + shortPieces.join('|') + ')', 'i');\n    this._weekdaysMinStrictRegex = new RegExp('^(' + minPieces.join('|') + ')', 'i');\n}\n\n// FORMATTING\n\nfunction hFormat() {\n    return this.hours() % 12 || 12;\n}\n\nfunction kFormat() {\n    return this.hours() || 24;\n}\n\naddFormatToken('H', ['HH', 2], 0, 'hour');\naddFormatToken('h', ['hh', 2], 0, hFormat);\naddFormatToken('k', ['kk', 2], 0, kFormat);\n\naddFormatToken('hmm', 0, 0, function () {\n    return '' + hFormat.apply(this) + zeroFill(this.minutes(), 2);\n});\n\naddFormatToken('hmmss', 0, 0, function () {\n    return '' + hFormat.apply(this) + zeroFill(this.minutes(), 2) +\n        zeroFill(this.seconds(), 2);\n});\n\naddFormatToken('Hmm', 0, 0, function () {\n    return '' + this.hours() + zeroFill(this.minutes(), 2);\n});\n\naddFormatToken('Hmmss', 0, 0, function () {\n    return '' + this.hours() + zeroFill(this.minutes(), 2) +\n        zeroFill(this.seconds(), 2);\n});\n\nfunction meridiem (token, lowercase) {\n    addFormatToken(token, 0, 0, function () {\n        return this.localeData().meridiem(this.hours(), this.minutes(), lowercase);\n    });\n}\n\nmeridiem('a', true);\nmeridiem('A', false);\n\n// ALIASES\n\naddUnitAlias('hour', 'h');\n\n// PRIORITY\naddUnitPriority('hour', 13);\n\n// PARSING\n\nfunction matchMeridiem (isStrict, locale) {\n    return locale._meridiemParse;\n}\n\naddRegexToken('a',  matchMeridiem);\naddRegexToken('A',  matchMeridiem);\naddRegexToken('H',  match1to2);\naddRegexToken('h',  match1to2);\naddRegexToken('HH', match1to2, match2);\naddRegexToken('hh', match1to2, match2);\n\naddRegexToken('hmm', match3to4);\naddRegexToken('hmmss', match5to6);\naddRegexToken('Hmm', match3to4);\naddRegexToken('Hmmss', match5to6);\n\naddParseToken(['H', 'HH'], HOUR);\naddParseToken(['a', 'A'], function (input, array, config) {\n    config._isPm = config._locale.isPM(input);\n    config._meridiem = input;\n});\naddParseToken(['h', 'hh'], function (input, array, config) {\n    array[HOUR] = toInt(input);\n    getParsingFlags(config).bigHour = true;\n});\naddParseToken('hmm', function (input, array, config) {\n    var pos = input.length - 2;\n    array[HOUR] = toInt(input.substr(0, pos));\n    array[MINUTE] = toInt(input.substr(pos));\n    getParsingFlags(config).bigHour = true;\n});\naddParseToken('hmmss', function (input, array, config) {\n    var pos1 = input.length - 4;\n    var pos2 = input.length - 2;\n    array[HOUR] = toInt(input.substr(0, pos1));\n    array[MINUTE] = toInt(input.substr(pos1, 2));\n    array[SECOND] = toInt(input.substr(pos2));\n    getParsingFlags(config).bigHour = true;\n});\naddParseToken('Hmm', function (input, array, config) {\n    var pos = input.length - 2;\n    array[HOUR] = toInt(input.substr(0, pos));\n    array[MINUTE] = toInt(input.substr(pos));\n});\naddParseToken('Hmmss', function (input, array, config) {\n    var pos1 = input.length - 4;\n    var pos2 = input.length - 2;\n    array[HOUR] = toInt(input.substr(0, pos1));\n    array[MINUTE] = toInt(input.substr(pos1, 2));\n    array[SECOND] = toInt(input.substr(pos2));\n});\n\n// LOCALES\n\nfunction localeIsPM (input) {\n    // IE8 Quirks Mode & IE7 Standards Mode do not allow accessing strings like arrays\n    // Using charAt should be more compatible.\n    return ((input + '').toLowerCase().charAt(0) === 'p');\n}\n\nvar defaultLocaleMeridiemParse = /[ap]\\.?m?\\.?/i;\nfunction localeMeridiem (hours, minutes, isLower) {\n    if (hours > 11) {\n        return isLower ? 'pm' : 'PM';\n    } else {\n        return isLower ? 'am' : 'AM';\n    }\n}\n\n\n// MOMENTS\n\n// Setting the hour should keep the time, because the user explicitly\n// specified which hour he wants. So trying to maintain the same hour (in\n// a new timezone) makes sense. Adding/subtracting hours does not follow\n// this rule.\nvar getSetHour = makeGetSet('Hours', true);\n\n// months\n// week\n// weekdays\n// meridiem\nvar baseConfig = {\n    calendar: defaultCalendar,\n    longDateFormat: defaultLongDateFormat,\n    invalidDate: defaultInvalidDate,\n    ordinal: defaultOrdinal,\n    ordinalParse: defaultOrdinalParse,\n    relativeTime: defaultRelativeTime,\n\n    months: defaultLocaleMonths,\n    monthsShort: defaultLocaleMonthsShort,\n\n    week: defaultLocaleWeek,\n\n    weekdays: defaultLocaleWeekdays,\n    weekdaysMin: defaultLocaleWeekdaysMin,\n    weekdaysShort: defaultLocaleWeekdaysShort,\n\n    meridiemParse: defaultLocaleMeridiemParse\n};\n\n// internal storage for locale config files\nvar locales = {};\nvar localeFamilies = {};\nvar globalLocale;\n\nfunction normalizeLocale(key) {\n    return key ? key.toLowerCase().replace('_', '-') : key;\n}\n\n// pick the locale from the array\n// try ['en-au', 'en-gb'] as 'en-au', 'en-gb', 'en', as in move through the list trying each\n// substring from most specific to least, but move to the next array item if it's a more specific variant than the current root\nfunction chooseLocale(names) {\n    var i = 0, j, next, locale, split;\n\n    while (i < names.length) {\n        split = normalizeLocale(names[i]).split('-');\n        j = split.length;\n        next = normalizeLocale(names[i + 1]);\n        next = next ? next.split('-') : null;\n        while (j > 0) {\n            locale = loadLocale(split.slice(0, j).join('-'));\n            if (locale) {\n                return locale;\n            }\n            if (next && next.length >= j && compareArrays(split, next, true) >= j - 1) {\n                //the next array item is better than a shallower substring of this one\n                break;\n            }\n            j--;\n        }\n        i++;\n    }\n    return null;\n}\n\nfunction loadLocale(name) {\n    var oldLocale = null;\n    // TODO: Find a better way to register and load all the locales in Node\n    if (!locales[name] && (typeof module !== 'undefined') &&\n            module && module.exports) {\n        try {\n            oldLocale = globalLocale._abbr;\n            require('./locale/' + name);\n            // because defineLocale currently also sets the global locale, we\n            // want to undo that for lazy loaded locales\n            getSetGlobalLocale(oldLocale);\n        } catch (e) { }\n    }\n    return locales[name];\n}\n\n// This function will load locale and then set the global locale.  If\n// no arguments are passed in, it will simply return the current global\n// locale key.\nfunction getSetGlobalLocale (key, values) {\n    var data;\n    if (key) {\n        if (isUndefined(values)) {\n            data = getLocale(key);\n        }\n        else {\n            data = defineLocale(key, values);\n        }\n\n        if (data) {\n            // moment.duration._locale = moment._locale = data;\n            globalLocale = data;\n        }\n    }\n\n    return globalLocale._abbr;\n}\n\nfunction defineLocale (name, config) {\n    if (config !== null) {\n        var parentConfig = baseConfig;\n        config.abbr = name;\n        if (locales[name] != null) {\n            deprecateSimple('defineLocaleOverride',\n                    'use moment.updateLocale(localeName, config) to change ' +\n                    'an existing locale. moment.defineLocale(localeName, ' +\n                    'config) should only be used for creating a new locale ' +\n                    'See http://momentjs.com/guides/#/warnings/define-locale/ for more info.');\n            parentConfig = locales[name]._config;\n        } else if (config.parentLocale != null) {\n            if (locales[config.parentLocale] != null) {\n                parentConfig = locales[config.parentLocale]._config;\n            } else {\n                if (!localeFamilies[config.parentLocale]) {\n                    localeFamilies[config.parentLocale] = [];\n                }\n                localeFamilies[config.parentLocale].push({\n                    name: name,\n                    config: config\n                });\n                return null;\n            }\n        }\n        locales[name] = new Locale(mergeConfigs(parentConfig, config));\n\n        if (localeFamilies[name]) {\n            localeFamilies[name].forEach(function (x) {\n                defineLocale(x.name, x.config);\n            });\n        }\n\n        // backwards compat for now: also set the locale\n        // make sure we set the locale AFTER all child locales have been\n        // created, so we won't end up with the child locale set.\n        getSetGlobalLocale(name);\n\n\n        return locales[name];\n    } else {\n        // useful for testing\n        delete locales[name];\n        return null;\n    }\n}\n\nfunction updateLocale(name, config) {\n    if (config != null) {\n        var locale, parentConfig = baseConfig;\n        // MERGE\n        if (locales[name] != null) {\n            parentConfig = locales[name]._config;\n        }\n        config = mergeConfigs(parentConfig, config);\n        locale = new Locale(config);\n        locale.parentLocale = locales[name];\n        locales[name] = locale;\n\n        // backwards compat for now: also set the locale\n        getSetGlobalLocale(name);\n    } else {\n        // pass null for config to unupdate, useful for tests\n        if (locales[name] != null) {\n            if (locales[name].parentLocale != null) {\n                locales[name] = locales[name].parentLocale;\n            } else if (locales[name] != null) {\n                delete locales[name];\n            }\n        }\n    }\n    return locales[name];\n}\n\n// returns locale data\nfunction getLocale (key) {\n    var locale;\n\n    if (key && key._locale && key._locale._abbr) {\n        key = key._locale._abbr;\n    }\n\n    if (!key) {\n        return globalLocale;\n    }\n\n    if (!isArray(key)) {\n        //short-circuit everything else\n        locale = loadLocale(key);\n        if (locale) {\n            return locale;\n        }\n        key = [key];\n    }\n\n    return chooseLocale(key);\n}\n\nfunction listLocales() {\n    return keys$1(locales);\n}\n\nfunction checkOverflow (m) {\n    var overflow;\n    var a = m._a;\n\n    if (a && getParsingFlags(m).overflow === -2) {\n        overflow =\n            a[MONTH]       < 0 || a[MONTH]       > 11  ? MONTH :\n            a[DATE]        < 1 || a[DATE]        > daysInMonth(a[YEAR], a[MONTH]) ? DATE :\n            a[HOUR]        < 0 || a[HOUR]        > 24 || (a[HOUR] === 24 && (a[MINUTE] !== 0 || a[SECOND] !== 0 || a[MILLISECOND] !== 0)) ? HOUR :\n            a[MINUTE]      < 0 || a[MINUTE]      > 59  ? MINUTE :\n            a[SECOND]      < 0 || a[SECOND]      > 59  ? SECOND :\n            a[MILLISECOND] < 0 || a[MILLISECOND] > 999 ? MILLISECOND :\n            -1;\n\n        if (getParsingFlags(m)._overflowDayOfYear && (overflow < YEAR || overflow > DATE)) {\n            overflow = DATE;\n        }\n        if (getParsingFlags(m)._overflowWeeks && overflow === -1) {\n            overflow = WEEK;\n        }\n        if (getParsingFlags(m)._overflowWeekday && overflow === -1) {\n            overflow = WEEKDAY;\n        }\n\n        getParsingFlags(m).overflow = overflow;\n    }\n\n    return m;\n}\n\n// iso 8601 regex\n// 0000-00-00 0000-W00 or 0000-W00-0 + T + 00 or 00:00 or 00:00:00 or 00:00:00.000 + +00:00 or +0000 or +00)\nvar extendedIsoRegex = /^\\s*((?:[+-]\\d{6}|\\d{4})-(?:\\d\\d-\\d\\d|W\\d\\d-\\d|W\\d\\d|\\d\\d\\d|\\d\\d))(?:(T| )(\\d\\d(?::\\d\\d(?::\\d\\d(?:[.,]\\d+)?)?)?)([\\+\\-]\\d\\d(?::?\\d\\d)?|\\s*Z)?)?$/;\nvar basicIsoRegex = /^\\s*((?:[+-]\\d{6}|\\d{4})(?:\\d\\d\\d\\d|W\\d\\d\\d|W\\d\\d|\\d\\d\\d|\\d\\d))(?:(T| )(\\d\\d(?:\\d\\d(?:\\d\\d(?:[.,]\\d+)?)?)?)([\\+\\-]\\d\\d(?::?\\d\\d)?|\\s*Z)?)?$/;\n\nvar tzRegex = /Z|[+-]\\d\\d(?::?\\d\\d)?/;\n\nvar isoDates = [\n    ['YYYYYY-MM-DD', /[+-]\\d{6}-\\d\\d-\\d\\d/],\n    ['YYYY-MM-DD', /\\d{4}-\\d\\d-\\d\\d/],\n    ['GGGG-[W]WW-E', /\\d{4}-W\\d\\d-\\d/],\n    ['GGGG-[W]WW', /\\d{4}-W\\d\\d/, false],\n    ['YYYY-DDD', /\\d{4}-\\d{3}/],\n    ['YYYY-MM', /\\d{4}-\\d\\d/, false],\n    ['YYYYYYMMDD', /[+-]\\d{10}/],\n    ['YYYYMMDD', /\\d{8}/],\n    // YYYYMM is NOT allowed by the standard\n    ['GGGG[W]WWE', /\\d{4}W\\d{3}/],\n    ['GGGG[W]WW', /\\d{4}W\\d{2}/, false],\n    ['YYYYDDD', /\\d{7}/]\n];\n\n// iso time formats and regexes\nvar isoTimes = [\n    ['HH:mm:ss.SSSS', /\\d\\d:\\d\\d:\\d\\d\\.\\d+/],\n    ['HH:mm:ss,SSSS', /\\d\\d:\\d\\d:\\d\\d,\\d+/],\n    ['HH:mm:ss', /\\d\\d:\\d\\d:\\d\\d/],\n    ['HH:mm', /\\d\\d:\\d\\d/],\n    ['HHmmss.SSSS', /\\d\\d\\d\\d\\d\\d\\.\\d+/],\n    ['HHmmss,SSSS', /\\d\\d\\d\\d\\d\\d,\\d+/],\n    ['HHmmss', /\\d\\d\\d\\d\\d\\d/],\n    ['HHmm', /\\d\\d\\d\\d/],\n    ['HH', /\\d\\d/]\n];\n\nvar aspNetJsonRegex = /^\\/?Date\\((\\-?\\d+)/i;\n\n// date from iso format\nfunction configFromISO(config) {\n    var i, l,\n        string = config._i,\n        match = extendedIsoRegex.exec(string) || basicIsoRegex.exec(string),\n        allowTime, dateFormat, timeFormat, tzFormat;\n\n    if (match) {\n        getParsingFlags(config).iso = true;\n\n        for (i = 0, l = isoDates.length; i < l; i++) {\n            if (isoDates[i][1].exec(match[1])) {\n                dateFormat = isoDates[i][0];\n                allowTime = isoDates[i][2] !== false;\n                break;\n            }\n        }\n        if (dateFormat == null) {\n            config._isValid = false;\n            return;\n        }\n        if (match[3]) {\n            for (i = 0, l = isoTimes.length; i < l; i++) {\n                if (isoTimes[i][1].exec(match[3])) {\n                    // match[2] should be 'T' or space\n                    timeFormat = (match[2] || ' ') + isoTimes[i][0];\n                    break;\n                }\n            }\n            if (timeFormat == null) {\n                config._isValid = false;\n                return;\n            }\n        }\n        if (!allowTime && timeFormat != null) {\n            config._isValid = false;\n            return;\n        }\n        if (match[4]) {\n            if (tzRegex.exec(match[4])) {\n                tzFormat = 'Z';\n            } else {\n                config._isValid = false;\n                return;\n            }\n        }\n        config._f = dateFormat + (timeFormat || '') + (tzFormat || '');\n        configFromStringAndFormat(config);\n    } else {\n        config._isValid = false;\n    }\n}\n\n// date from iso format or fallback\nfunction configFromString(config) {\n    var matched = aspNetJsonRegex.exec(config._i);\n\n    if (matched !== null) {\n        config._d = new Date(+matched[1]);\n        return;\n    }\n\n    configFromISO(config);\n    if (config._isValid === false) {\n        delete config._isValid;\n        hooks.createFromInputFallback(config);\n    }\n}\n\nhooks.createFromInputFallback = deprecate(\n    'value provided is not in a recognized ISO format. moment construction falls back to js Date(), ' +\n    'which is not reliable across all browsers and versions. Non ISO date formats are ' +\n    'discouraged and will be removed in an upcoming major release. Please refer to ' +\n    'http://momentjs.com/guides/#/warnings/js-date/ for more info.',\n    function (config) {\n        config._d = new Date(config._i + (config._useUTC ? ' UTC' : ''));\n    }\n);\n\n// Pick the first defined of two or three arguments.\nfunction defaults(a, b, c) {\n    if (a != null) {\n        return a;\n    }\n    if (b != null) {\n        return b;\n    }\n    return c;\n}\n\nfunction currentDateArray(config) {\n    // hooks is actually the exported moment object\n    var nowValue = new Date(hooks.now());\n    if (config._useUTC) {\n        return [nowValue.getUTCFullYear(), nowValue.getUTCMonth(), nowValue.getUTCDate()];\n    }\n    return [nowValue.getFullYear(), nowValue.getMonth(), nowValue.getDate()];\n}\n\n// convert an array to a date.\n// the array should mirror the parameters below\n// note: all values past the year are optional and will default to the lowest possible value.\n// [year, month, day , hour, minute, second, millisecond]\nfunction configFromArray (config) {\n    var i, date, input = [], currentDate, yearToUse;\n\n    if (config._d) {\n        return;\n    }\n\n    currentDate = currentDateArray(config);\n\n    //compute day of the year from weeks and weekdays\n    if (config._w && config._a[DATE] == null && config._a[MONTH] == null) {\n        dayOfYearFromWeekInfo(config);\n    }\n\n    //if the day of the year is set, figure out what it is\n    if (config._dayOfYear) {\n        yearToUse = defaults(config._a[YEAR], currentDate[YEAR]);\n\n        if (config._dayOfYear > daysInYear(yearToUse)) {\n            getParsingFlags(config)._overflowDayOfYear = true;\n        }\n\n        date = createUTCDate(yearToUse, 0, config._dayOfYear);\n        config._a[MONTH] = date.getUTCMonth();\n        config._a[DATE] = date.getUTCDate();\n    }\n\n    // Default to current date.\n    // * if no year, month, day of month are given, default to today\n    // * if day of month is given, default month and year\n    // * if month is given, default only year\n    // * if year is given, don't default anything\n    for (i = 0; i < 3 && config._a[i] == null; ++i) {\n        config._a[i] = input[i] = currentDate[i];\n    }\n\n    // Zero out whatever was not defaulted, including time\n    for (; i < 7; i++) {\n        config._a[i] = input[i] = (config._a[i] == null) ? (i === 2 ? 1 : 0) : config._a[i];\n    }\n\n    // Check for 24:00:00.000\n    if (config._a[HOUR] === 24 &&\n            config._a[MINUTE] === 0 &&\n            config._a[SECOND] === 0 &&\n            config._a[MILLISECOND] === 0) {\n        config._nextDay = true;\n        config._a[HOUR] = 0;\n    }\n\n    config._d = (config._useUTC ? createUTCDate : createDate).apply(null, input);\n    // Apply timezone offset from input. The actual utcOffset can be changed\n    // with parseZone.\n    if (config._tzm != null) {\n        config._d.setUTCMinutes(config._d.getUTCMinutes() - config._tzm);\n    }\n\n    if (config._nextDay) {\n        config._a[HOUR] = 24;\n    }\n}\n\nfunction dayOfYearFromWeekInfo(config) {\n    var w, weekYear, week, weekday, dow, doy, temp, weekdayOverflow;\n\n    w = config._w;\n    if (w.GG != null || w.W != null || w.E != null) {\n        dow = 1;\n        doy = 4;\n\n        // TODO: We need to take the current isoWeekYear, but that depends on\n        // how we interpret now (local, utc, fixed offset). So create\n        // a now version of current config (take local/utc/offset flags, and\n        // create now).\n        weekYear = defaults(w.GG, config._a[YEAR], weekOfYear(createLocal(), 1, 4).year);\n        week = defaults(w.W, 1);\n        weekday = defaults(w.E, 1);\n        if (weekday < 1 || weekday > 7) {\n            weekdayOverflow = true;\n        }\n    } else {\n        dow = config._locale._week.dow;\n        doy = config._locale._week.doy;\n\n        var curWeek = weekOfYear(createLocal(), dow, doy);\n\n        weekYear = defaults(w.gg, config._a[YEAR], curWeek.year);\n\n        // Default to current week.\n        week = defaults(w.w, curWeek.week);\n\n        if (w.d != null) {\n            // weekday -- low day numbers are considered next week\n            weekday = w.d;\n            if (weekday < 0 || weekday > 6) {\n                weekdayOverflow = true;\n            }\n        } else if (w.e != null) {\n            // local weekday -- counting starts from begining of week\n            weekday = w.e + dow;\n            if (w.e < 0 || w.e > 6) {\n                weekdayOverflow = true;\n            }\n        } else {\n            // default to begining of week\n            weekday = dow;\n        }\n    }\n    if (week < 1 || week > weeksInYear(weekYear, dow, doy)) {\n        getParsingFlags(config)._overflowWeeks = true;\n    } else if (weekdayOverflow != null) {\n        getParsingFlags(config)._overflowWeekday = true;\n    } else {\n        temp = dayOfYearFromWeeks(weekYear, week, weekday, dow, doy);\n        config._a[YEAR] = temp.year;\n        config._dayOfYear = temp.dayOfYear;\n    }\n}\n\n// constant that refers to the ISO standard\nhooks.ISO_8601 = function () {};\n\n// date from string and format string\nfunction configFromStringAndFormat(config) {\n    // TODO: Move this to another part of the creation flow to prevent circular deps\n    if (config._f === hooks.ISO_8601) {\n        configFromISO(config);\n        return;\n    }\n\n    config._a = [];\n    getParsingFlags(config).empty = true;\n\n    // This array is used to make a Date, either with `new Date` or `Date.UTC`\n    var string = '' + config._i,\n        i, parsedInput, tokens, token, skipped,\n        stringLength = string.length,\n        totalParsedInputLength = 0;\n\n    tokens = expandFormat(config._f, config._locale).match(formattingTokens) || [];\n\n    for (i = 0; i < tokens.length; i++) {\n        token = tokens[i];\n        parsedInput = (string.match(getParseRegexForToken(token, config)) || [])[0];\n        // console.log('token', token, 'parsedInput', parsedInput,\n        //         'regex', getParseRegexForToken(token, config));\n        if (parsedInput) {\n            skipped = string.substr(0, string.indexOf(parsedInput));\n            if (skipped.length > 0) {\n                getParsingFlags(config).unusedInput.push(skipped);\n            }\n            string = string.slice(string.indexOf(parsedInput) + parsedInput.length);\n            totalParsedInputLength += parsedInput.length;\n        }\n        // don't parse if it's not a known token\n        if (formatTokenFunctions[token]) {\n            if (parsedInput) {\n                getParsingFlags(config).empty = false;\n            }\n            else {\n                getParsingFlags(config).unusedTokens.push(token);\n            }\n            addTimeToArrayFromToken(token, parsedInput, config);\n        }\n        else if (config._strict && !parsedInput) {\n            getParsingFlags(config).unusedTokens.push(token);\n        }\n    }\n\n    // add remaining unparsed input length to the string\n    getParsingFlags(config).charsLeftOver = stringLength - totalParsedInputLength;\n    if (string.length > 0) {\n        getParsingFlags(config).unusedInput.push(string);\n    }\n\n    // clear _12h flag if hour is <= 12\n    if (config._a[HOUR] <= 12 &&\n        getParsingFlags(config).bigHour === true &&\n        config._a[HOUR] > 0) {\n        getParsingFlags(config).bigHour = undefined;\n    }\n\n    getParsingFlags(config).parsedDateParts = config._a.slice(0);\n    getParsingFlags(config).meridiem = config._meridiem;\n    // handle meridiem\n    config._a[HOUR] = meridiemFixWrap(config._locale, config._a[HOUR], config._meridiem);\n\n    configFromArray(config);\n    checkOverflow(config);\n}\n\n\nfunction meridiemFixWrap (locale, hour, meridiem) {\n    var isPm;\n\n    if (meridiem == null) {\n        // nothing to do\n        return hour;\n    }\n    if (locale.meridiemHour != null) {\n        return locale.meridiemHour(hour, meridiem);\n    } else if (locale.isPM != null) {\n        // Fallback\n        isPm = locale.isPM(meridiem);\n        if (isPm && hour < 12) {\n            hour += 12;\n        }\n        if (!isPm && hour === 12) {\n            hour = 0;\n        }\n        return hour;\n    } else {\n        // this is not supposed to happen\n        return hour;\n    }\n}\n\n// date from string and array of format strings\nfunction configFromStringAndArray(config) {\n    var tempConfig,\n        bestMoment,\n\n        scoreToBeat,\n        i,\n        currentScore;\n\n    if (config._f.length === 0) {\n        getParsingFlags(config).invalidFormat = true;\n        config._d = new Date(NaN);\n        return;\n    }\n\n    for (i = 0; i < config._f.length; i++) {\n        currentScore = 0;\n        tempConfig = copyConfig({}, config);\n        if (config._useUTC != null) {\n            tempConfig._useUTC = config._useUTC;\n        }\n        tempConfig._f = config._f[i];\n        configFromStringAndFormat(tempConfig);\n\n        if (!isValid(tempConfig)) {\n            continue;\n        }\n\n        // if there is any input that was not parsed add a penalty for that format\n        currentScore += getParsingFlags(tempConfig).charsLeftOver;\n\n        //or tokens\n        currentScore += getParsingFlags(tempConfig).unusedTokens.length * 10;\n\n        getParsingFlags(tempConfig).score = currentScore;\n\n        if (scoreToBeat == null || currentScore < scoreToBeat) {\n            scoreToBeat = currentScore;\n            bestMoment = tempConfig;\n        }\n    }\n\n    extend(config, bestMoment || tempConfig);\n}\n\nfunction configFromObject(config) {\n    if (config._d) {\n        return;\n    }\n\n    var i = normalizeObjectUnits(config._i);\n    config._a = map([i.year, i.month, i.day || i.date, i.hour, i.minute, i.second, i.millisecond], function (obj) {\n        return obj && parseInt(obj, 10);\n    });\n\n    configFromArray(config);\n}\n\nfunction createFromConfig (config) {\n    var res = new Moment(checkOverflow(prepareConfig(config)));\n    if (res._nextDay) {\n        // Adding is smart enough around DST\n        res.add(1, 'd');\n        res._nextDay = undefined;\n    }\n\n    return res;\n}\n\nfunction prepareConfig (config) {\n    var input = config._i,\n        format = config._f;\n\n    config._locale = config._locale || getLocale(config._l);\n\n    if (input === null || (format === undefined && input === '')) {\n        return createInvalid({nullInput: true});\n    }\n\n    if (typeof input === 'string') {\n        config._i = input = config._locale.preparse(input);\n    }\n\n    if (isMoment(input)) {\n        return new Moment(checkOverflow(input));\n    } else if (isDate(input)) {\n        config._d = input;\n    } else if (isArray(format)) {\n        configFromStringAndArray(config);\n    } else if (format) {\n        configFromStringAndFormat(config);\n    }  else {\n        configFromInput(config);\n    }\n\n    if (!isValid(config)) {\n        config._d = null;\n    }\n\n    return config;\n}\n\nfunction configFromInput(config) {\n    var input = config._i;\n    if (input === undefined) {\n        config._d = new Date(hooks.now());\n    } else if (isDate(input)) {\n        config._d = new Date(input.valueOf());\n    } else if (typeof input === 'string') {\n        configFromString(config);\n    } else if (isArray(input)) {\n        config._a = map(input.slice(0), function (obj) {\n            return parseInt(obj, 10);\n        });\n        configFromArray(config);\n    } else if (typeof(input) === 'object') {\n        configFromObject(config);\n    } else if (isNumber(input)) {\n        // from milliseconds\n        config._d = new Date(input);\n    } else {\n        hooks.createFromInputFallback(config);\n    }\n}\n\nfunction createLocalOrUTC (input, format, locale, strict, isUTC) {\n    var c = {};\n\n    if (locale === true || locale === false) {\n        strict = locale;\n        locale = undefined;\n    }\n\n    if ((isObject(input) && isObjectEmpty(input)) ||\n            (isArray(input) && input.length === 0)) {\n        input = undefined;\n    }\n    // object construction must be done this way.\n    // https://github.com/moment/moment/issues/1423\n    c._isAMomentObject = true;\n    c._useUTC = c._isUTC = isUTC;\n    c._l = locale;\n    c._i = input;\n    c._f = format;\n    c._strict = strict;\n\n    return createFromConfig(c);\n}\n\nfunction createLocal (input, format, locale, strict) {\n    return createLocalOrUTC(input, format, locale, strict, false);\n}\n\nvar prototypeMin = deprecate(\n    'moment().min is deprecated, use moment.max instead. http://momentjs.com/guides/#/warnings/min-max/',\n    function () {\n        var other = createLocal.apply(null, arguments);\n        if (this.isValid() && other.isValid()) {\n            return other < this ? this : other;\n        } else {\n            return createInvalid();\n        }\n    }\n);\n\nvar prototypeMax = deprecate(\n    'moment().max is deprecated, use moment.min instead. http://momentjs.com/guides/#/warnings/min-max/',\n    function () {\n        var other = createLocal.apply(null, arguments);\n        if (this.isValid() && other.isValid()) {\n            return other > this ? this : other;\n        } else {\n            return createInvalid();\n        }\n    }\n);\n\n// Pick a moment m from moments so that m[fn](other) is true for all\n// other. This relies on the function fn to be transitive.\n//\n// moments should either be an array of moment objects or an array, whose\n// first element is an array of moment objects.\nfunction pickBy(fn, moments) {\n    var res, i;\n    if (moments.length === 1 && isArray(moments[0])) {\n        moments = moments[0];\n    }\n    if (!moments.length) {\n        return createLocal();\n    }\n    res = moments[0];\n    for (i = 1; i < moments.length; ++i) {\n        if (!moments[i].isValid() || moments[i][fn](res)) {\n            res = moments[i];\n        }\n    }\n    return res;\n}\n\n// TODO: Use [].sort instead?\nfunction min () {\n    var args = [].slice.call(arguments, 0);\n\n    return pickBy('isBefore', args);\n}\n\nfunction max () {\n    var args = [].slice.call(arguments, 0);\n\n    return pickBy('isAfter', args);\n}\n\nvar now = function () {\n    return Date.now ? Date.now() : +(new Date());\n};\n\nfunction Duration (duration) {\n    var normalizedInput = normalizeObjectUnits(duration),\n        years = normalizedInput.year || 0,\n        quarters = normalizedInput.quarter || 0,\n        months = normalizedInput.month || 0,\n        weeks = normalizedInput.week || 0,\n        days = normalizedInput.day || 0,\n        hours = normalizedInput.hour || 0,\n        minutes = normalizedInput.minute || 0,\n        seconds = normalizedInput.second || 0,\n        milliseconds = normalizedInput.millisecond || 0;\n\n    // representation for dateAddRemove\n    this._milliseconds = +milliseconds +\n        seconds * 1e3 + // 1000\n        minutes * 6e4 + // 1000 * 60\n        hours * 1000 * 60 * 60; //using 1000 * 60 * 60 instead of 36e5 to avoid floating point rounding errors https://github.com/moment/moment/issues/2978\n    // Because of dateAddRemove treats 24 hours as different from a\n    // day when working around DST, we need to store them separately\n    this._days = +days +\n        weeks * 7;\n    // It is impossible translate months into days without knowing\n    // which months you are are talking about, so we have to store\n    // it separately.\n    this._months = +months +\n        quarters * 3 +\n        years * 12;\n\n    this._data = {};\n\n    this._locale = getLocale();\n\n    this._bubble();\n}\n\nfunction isDuration (obj) {\n    return obj instanceof Duration;\n}\n\nfunction absRound (number) {\n    if (number < 0) {\n        return Math.round(-1 * number) * -1;\n    } else {\n        return Math.round(number);\n    }\n}\n\n// FORMATTING\n\nfunction offset (token, separator) {\n    addFormatToken(token, 0, 0, function () {\n        var offset = this.utcOffset();\n        var sign = '+';\n        if (offset < 0) {\n            offset = -offset;\n            sign = '-';\n        }\n        return sign + zeroFill(~~(offset / 60), 2) + separator + zeroFill(~~(offset) % 60, 2);\n    });\n}\n\noffset('Z', ':');\noffset('ZZ', '');\n\n// PARSING\n\naddRegexToken('Z',  matchShortOffset);\naddRegexToken('ZZ', matchShortOffset);\naddParseToken(['Z', 'ZZ'], function (input, array, config) {\n    config._useUTC = true;\n    config._tzm = offsetFromString(matchShortOffset, input);\n});\n\n// HELPERS\n\n// timezone chunker\n// '+10:00' > ['10',  '00']\n// '-1530'  > ['-15', '30']\nvar chunkOffset = /([\\+\\-]|\\d\\d)/gi;\n\nfunction offsetFromString(matcher, string) {\n    var matches = (string || '').match(matcher);\n\n    if (matches === null) {\n        return null;\n    }\n\n    var chunk   = matches[matches.length - 1] || [];\n    var parts   = (chunk + '').match(chunkOffset) || ['-', 0, 0];\n    var minutes = +(parts[1] * 60) + toInt(parts[2]);\n\n    return minutes === 0 ?\n      0 :\n      parts[0] === '+' ? minutes : -minutes;\n}\n\n// Return a moment from input, that is local/utc/zone equivalent to model.\nfunction cloneWithOffset(input, model) {\n    var res, diff;\n    if (model._isUTC) {\n        res = model.clone();\n        diff = (isMoment(input) || isDate(input) ? input.valueOf() : createLocal(input).valueOf()) - res.valueOf();\n        // Use low-level api, because this fn is low-level api.\n        res._d.setTime(res._d.valueOf() + diff);\n        hooks.updateOffset(res, false);\n        return res;\n    } else {\n        return createLocal(input).local();\n    }\n}\n\nfunction getDateOffset (m) {\n    // On Firefox.24 Date#getTimezoneOffset returns a floating point.\n    // https://github.com/moment/moment/pull/1871\n    return -Math.round(m._d.getTimezoneOffset() / 15) * 15;\n}\n\n// HOOKS\n\n// This function will be called whenever a moment is mutated.\n// It is intended to keep the offset in sync with the timezone.\nhooks.updateOffset = function () {};\n\n// MOMENTS\n\n// keepLocalTime = true means only change the timezone, without\n// affecting the local hour. So 5:31:26 +0300 --[utcOffset(2, true)]-->\n// 5:31:26 +0200 It is possible that 5:31:26 doesn't exist with offset\n// +0200, so we adjust the time as needed, to be valid.\n//\n// Keeping the time actually adds/subtracts (one hour)\n// from the actual represented time. That is why we call updateOffset\n// a second time. In case it wants us to change the offset again\n// _changeInProgress == true case, then we have to adjust, because\n// there is no such time in the given timezone.\nfunction getSetOffset (input, keepLocalTime) {\n    var offset = this._offset || 0,\n        localAdjust;\n    if (!this.isValid()) {\n        return input != null ? this : NaN;\n    }\n    if (input != null) {\n        if (typeof input === 'string') {\n            input = offsetFromString(matchShortOffset, input);\n            if (input === null) {\n                return this;\n            }\n        } else if (Math.abs(input) < 16) {\n            input = input * 60;\n        }\n        if (!this._isUTC && keepLocalTime) {\n            localAdjust = getDateOffset(this);\n        }\n        this._offset = input;\n        this._isUTC = true;\n        if (localAdjust != null) {\n            this.add(localAdjust, 'm');\n        }\n        if (offset !== input) {\n            if (!keepLocalTime || this._changeInProgress) {\n                addSubtract(this, createDuration(input - offset, 'm'), 1, false);\n            } else if (!this._changeInProgress) {\n                this._changeInProgress = true;\n                hooks.updateOffset(this, true);\n                this._changeInProgress = null;\n            }\n        }\n        return this;\n    } else {\n        return this._isUTC ? offset : getDateOffset(this);\n    }\n}\n\nfunction getSetZone (input, keepLocalTime) {\n    if (input != null) {\n        if (typeof input !== 'string') {\n            input = -input;\n        }\n\n        this.utcOffset(input, keepLocalTime);\n\n        return this;\n    } else {\n        return -this.utcOffset();\n    }\n}\n\nfunction setOffsetToUTC (keepLocalTime) {\n    return this.utcOffset(0, keepLocalTime);\n}\n\nfunction setOffsetToLocal (keepLocalTime) {\n    if (this._isUTC) {\n        this.utcOffset(0, keepLocalTime);\n        this._isUTC = false;\n\n        if (keepLocalTime) {\n            this.subtract(getDateOffset(this), 'm');\n        }\n    }\n    return this;\n}\n\nfunction setOffsetToParsedOffset () {\n    if (this._tzm != null) {\n        this.utcOffset(this._tzm);\n    } else if (typeof this._i === 'string') {\n        var tZone = offsetFromString(matchOffset, this._i);\n        if (tZone != null) {\n            this.utcOffset(tZone);\n        }\n        else {\n            this.utcOffset(0, true);\n        }\n    }\n    return this;\n}\n\nfunction hasAlignedHourOffset (input) {\n    if (!this.isValid()) {\n        return false;\n    }\n    input = input ? createLocal(input).utcOffset() : 0;\n\n    return (this.utcOffset() - input) % 60 === 0;\n}\n\nfunction isDaylightSavingTime () {\n    return (\n        this.utcOffset() > this.clone().month(0).utcOffset() ||\n        this.utcOffset() > this.clone().month(5).utcOffset()\n    );\n}\n\nfunction isDaylightSavingTimeShifted () {\n    if (!isUndefined(this._isDSTShifted)) {\n        return this._isDSTShifted;\n    }\n\n    var c = {};\n\n    copyConfig(c, this);\n    c = prepareConfig(c);\n\n    if (c._a) {\n        var other = c._isUTC ? createUTC(c._a) : createLocal(c._a);\n        this._isDSTShifted = this.isValid() &&\n            compareArrays(c._a, other.toArray()) > 0;\n    } else {\n        this._isDSTShifted = false;\n    }\n\n    return this._isDSTShifted;\n}\n\nfunction isLocal () {\n    return this.isValid() ? !this._isUTC : false;\n}\n\nfunction isUtcOffset () {\n    return this.isValid() ? this._isUTC : false;\n}\n\nfunction isUtc () {\n    return this.isValid() ? this._isUTC && this._offset === 0 : false;\n}\n\n// ASP.NET json date format regex\nvar aspNetRegex = /^(\\-)?(?:(\\d*)[. ])?(\\d+)\\:(\\d+)(?:\\:(\\d+)(\\.\\d*)?)?$/;\n\n// from http://docs.closure-library.googlecode.com/git/closure_goog_date_date.js.source.html\n// somewhat more in line with 4.4.3.2 2004 spec, but allows decimal anywhere\n// and further modified to allow for strings containing both week and day\nvar isoRegex = /^(-)?P(?:(-?[0-9,.]*)Y)?(?:(-?[0-9,.]*)M)?(?:(-?[0-9,.]*)W)?(?:(-?[0-9,.]*)D)?(?:T(?:(-?[0-9,.]*)H)?(?:(-?[0-9,.]*)M)?(?:(-?[0-9,.]*)S)?)?$/;\n\nfunction createDuration (input, key) {\n    var duration = input,\n        // matching against regexp is expensive, do it on demand\n        match = null,\n        sign,\n        ret,\n        diffRes;\n\n    if (isDuration(input)) {\n        duration = {\n            ms : input._milliseconds,\n            d  : input._days,\n            M  : input._months\n        };\n    } else if (isNumber(input)) {\n        duration = {};\n        if (key) {\n            duration[key] = input;\n        } else {\n            duration.milliseconds = input;\n        }\n    } else if (!!(match = aspNetRegex.exec(input))) {\n        sign = (match[1] === '-') ? -1 : 1;\n        duration = {\n            y  : 0,\n            d  : toInt(match[DATE])                         * sign,\n            h  : toInt(match[HOUR])                         * sign,\n            m  : toInt(match[MINUTE])                       * sign,\n            s  : toInt(match[SECOND])                       * sign,\n            ms : toInt(absRound(match[MILLISECOND] * 1000)) * sign // the millisecond decimal point is included in the match\n        };\n    } else if (!!(match = isoRegex.exec(input))) {\n        sign = (match[1] === '-') ? -1 : 1;\n        duration = {\n            y : parseIso(match[2], sign),\n            M : parseIso(match[3], sign),\n            w : parseIso(match[4], sign),\n            d : parseIso(match[5], sign),\n            h : parseIso(match[6], sign),\n            m : parseIso(match[7], sign),\n            s : parseIso(match[8], sign)\n        };\n    } else if (duration == null) {// checks for null or undefined\n        duration = {};\n    } else if (typeof duration === 'object' && ('from' in duration || 'to' in duration)) {\n        diffRes = momentsDifference(createLocal(duration.from), createLocal(duration.to));\n\n        duration = {};\n        duration.ms = diffRes.milliseconds;\n        duration.M = diffRes.months;\n    }\n\n    ret = new Duration(duration);\n\n    if (isDuration(input) && hasOwnProp(input, '_locale')) {\n        ret._locale = input._locale;\n    }\n\n    return ret;\n}\n\ncreateDuration.fn = Duration.prototype;\n\nfunction parseIso (inp, sign) {\n    // We'd normally use ~~inp for this, but unfortunately it also\n    // converts floats to ints.\n    // inp may be undefined, so careful calling replace on it.\n    var res = inp && parseFloat(inp.replace(',', '.'));\n    // apply sign while we're at it\n    return (isNaN(res) ? 0 : res) * sign;\n}\n\nfunction positiveMomentsDifference(base, other) {\n    var res = {milliseconds: 0, months: 0};\n\n    res.months = other.month() - base.month() +\n        (other.year() - base.year()) * 12;\n    if (base.clone().add(res.months, 'M').isAfter(other)) {\n        --res.months;\n    }\n\n    res.milliseconds = +other - +(base.clone().add(res.months, 'M'));\n\n    return res;\n}\n\nfunction momentsDifference(base, other) {\n    var res;\n    if (!(base.isValid() && other.isValid())) {\n        return {milliseconds: 0, months: 0};\n    }\n\n    other = cloneWithOffset(other, base);\n    if (base.isBefore(other)) {\n        res = positiveMomentsDifference(base, other);\n    } else {\n        res = positiveMomentsDifference(other, base);\n        res.milliseconds = -res.milliseconds;\n        res.months = -res.months;\n    }\n\n    return res;\n}\n\n// TODO: remove 'name' arg after deprecation is removed\nfunction createAdder(direction, name) {\n    return function (val, period) {\n        var dur, tmp;\n        //invert the arguments, but complain about it\n        if (period !== null && !isNaN(+period)) {\n            deprecateSimple(name, 'moment().' + name  + '(period, number) is deprecated. Please use moment().' + name + '(number, period). ' +\n            'See http://momentjs.com/guides/#/warnings/add-inverted-param/ for more info.');\n            tmp = val; val = period; period = tmp;\n        }\n\n        val = typeof val === 'string' ? +val : val;\n        dur = createDuration(val, period);\n        addSubtract(this, dur, direction);\n        return this;\n    };\n}\n\nfunction addSubtract (mom, duration, isAdding, updateOffset) {\n    var milliseconds = duration._milliseconds,\n        days = absRound(duration._days),\n        months = absRound(duration._months);\n\n    if (!mom.isValid()) {\n        // No op\n        return;\n    }\n\n    updateOffset = updateOffset == null ? true : updateOffset;\n\n    if (milliseconds) {\n        mom._d.setTime(mom._d.valueOf() + milliseconds * isAdding);\n    }\n    if (days) {\n        set$1(mom, 'Date', get(mom, 'Date') + days * isAdding);\n    }\n    if (months) {\n        setMonth(mom, get(mom, 'Month') + months * isAdding);\n    }\n    if (updateOffset) {\n        hooks.updateOffset(mom, days || months);\n    }\n}\n\nvar add      = createAdder(1, 'add');\nvar subtract = createAdder(-1, 'subtract');\n\nfunction getCalendarFormat(myMoment, now) {\n    var diff = myMoment.diff(now, 'days', true);\n    return diff < -6 ? 'sameElse' :\n            diff < -1 ? 'lastWeek' :\n            diff < 0 ? 'lastDay' :\n            diff < 1 ? 'sameDay' :\n            diff < 2 ? 'nextDay' :\n            diff < 7 ? 'nextWeek' : 'sameElse';\n}\n\nfunction calendar$1 (time, formats) {\n    // We want to compare the start of today, vs this.\n    // Getting start-of-today depends on whether we're local/utc/offset or not.\n    var now = time || createLocal(),\n        sod = cloneWithOffset(now, this).startOf('day'),\n        format = hooks.calendarFormat(this, sod) || 'sameElse';\n\n    var output = formats && (isFunction(formats[format]) ? formats[format].call(this, now) : formats[format]);\n\n    return this.format(output || this.localeData().calendar(format, this, createLocal(now)));\n}\n\nfunction clone () {\n    return new Moment(this);\n}\n\nfunction isAfter (input, units) {\n    var localInput = isMoment(input) ? input : createLocal(input);\n    if (!(this.isValid() && localInput.isValid())) {\n        return false;\n    }\n    units = normalizeUnits(!isUndefined(units) ? units : 'millisecond');\n    if (units === 'millisecond') {\n        return this.valueOf() > localInput.valueOf();\n    } else {\n        return localInput.valueOf() < this.clone().startOf(units).valueOf();\n    }\n}\n\nfunction isBefore (input, units) {\n    var localInput = isMoment(input) ? input : createLocal(input);\n    if (!(this.isValid() && localInput.isValid())) {\n        return false;\n    }\n    units = normalizeUnits(!isUndefined(units) ? units : 'millisecond');\n    if (units === 'millisecond') {\n        return this.valueOf() < localInput.valueOf();\n    } else {\n        return this.clone().endOf(units).valueOf() < localInput.valueOf();\n    }\n}\n\nfunction isBetween (from, to, units, inclusivity) {\n    inclusivity = inclusivity || '()';\n    return (inclusivity[0] === '(' ? this.isAfter(from, units) : !this.isBefore(from, units)) &&\n        (inclusivity[1] === ')' ? this.isBefore(to, units) : !this.isAfter(to, units));\n}\n\nfunction isSame (input, units) {\n    var localInput = isMoment(input) ? input : createLocal(input),\n        inputMs;\n    if (!(this.isValid() && localInput.isValid())) {\n        return false;\n    }\n    units = normalizeUnits(units || 'millisecond');\n    if (units === 'millisecond') {\n        return this.valueOf() === localInput.valueOf();\n    } else {\n        inputMs = localInput.valueOf();\n        return this.clone().startOf(units).valueOf() <= inputMs && inputMs <= this.clone().endOf(units).valueOf();\n    }\n}\n\nfunction isSameOrAfter (input, units) {\n    return this.isSame(input, units) || this.isAfter(input,units);\n}\n\nfunction isSameOrBefore (input, units) {\n    return this.isSame(input, units) || this.isBefore(input,units);\n}\n\nfunction diff (input, units, asFloat) {\n    var that,\n        zoneDelta,\n        delta, output;\n\n    if (!this.isValid()) {\n        return NaN;\n    }\n\n    that = cloneWithOffset(input, this);\n\n    if (!that.isValid()) {\n        return NaN;\n    }\n\n    zoneDelta = (that.utcOffset() - this.utcOffset()) * 6e4;\n\n    units = normalizeUnits(units);\n\n    if (units === 'year' || units === 'month' || units === 'quarter') {\n        output = monthDiff(this, that);\n        if (units === 'quarter') {\n            output = output / 3;\n        } else if (units === 'year') {\n            output = output / 12;\n        }\n    } else {\n        delta = this - that;\n        output = units === 'second' ? delta / 1e3 : // 1000\n            units === 'minute' ? delta / 6e4 : // 1000 * 60\n            units === 'hour' ? delta / 36e5 : // 1000 * 60 * 60\n            units === 'day' ? (delta - zoneDelta) / 864e5 : // 1000 * 60 * 60 * 24, negate dst\n            units === 'week' ? (delta - zoneDelta) / 6048e5 : // 1000 * 60 * 60 * 24 * 7, negate dst\n            delta;\n    }\n    return asFloat ? output : absFloor(output);\n}\n\nfunction monthDiff (a, b) {\n    // difference in months\n    var wholeMonthDiff = ((b.year() - a.year()) * 12) + (b.month() - a.month()),\n        // b is in (anchor - 1 month, anchor + 1 month)\n        anchor = a.clone().add(wholeMonthDiff, 'months'),\n        anchor2, adjust;\n\n    if (b - anchor < 0) {\n        anchor2 = a.clone().add(wholeMonthDiff - 1, 'months');\n        // linear across the month\n        adjust = (b - anchor) / (anchor - anchor2);\n    } else {\n        anchor2 = a.clone().add(wholeMonthDiff + 1, 'months');\n        // linear across the month\n        adjust = (b - anchor) / (anchor2 - anchor);\n    }\n\n    //check for negative zero, return zero if negative zero\n    return -(wholeMonthDiff + adjust) || 0;\n}\n\nhooks.defaultFormat = 'YYYY-MM-DDTHH:mm:ssZ';\nhooks.defaultFormatUtc = 'YYYY-MM-DDTHH:mm:ss[Z]';\n\nfunction toString () {\n    return this.clone().locale('en').format('ddd MMM DD YYYY HH:mm:ss [GMT]ZZ');\n}\n\nfunction toISOString () {\n    var m = this.clone().utc();\n    if (0 < m.year() && m.year() <= 9999) {\n        if (isFunction(Date.prototype.toISOString)) {\n            // native implementation is ~50x faster, use it when we can\n            return this.toDate().toISOString();\n        } else {\n            return formatMoment(m, 'YYYY-MM-DD[T]HH:mm:ss.SSS[Z]');\n        }\n    } else {\n        return formatMoment(m, 'YYYYYY-MM-DD[T]HH:mm:ss.SSS[Z]');\n    }\n}\n\n/**\n * Return a human readable representation of a moment that can\n * also be evaluated to get a new moment which is the same\n *\n * @link https://nodejs.org/dist/latest/docs/api/util.html#util_custom_inspect_function_on_objects\n */\nfunction inspect () {\n    if (!this.isValid()) {\n        return 'moment.invalid(/* ' + this._i + ' */)';\n    }\n    var func = 'moment';\n    var zone = '';\n    if (!this.isLocal()) {\n        func = this.utcOffset() === 0 ? 'moment.utc' : 'moment.parseZone';\n        zone = 'Z';\n    }\n    var prefix = '[' + func + '(\"]';\n    var year = (0 < this.year() && this.year() <= 9999) ? 'YYYY' : 'YYYYYY';\n    var datetime = '-MM-DD[T]HH:mm:ss.SSS';\n    var suffix = zone + '[\")]';\n\n    return this.format(prefix + year + datetime + suffix);\n}\n\nfunction format (inputString) {\n    if (!inputString) {\n        inputString = this.isUtc() ? hooks.defaultFormatUtc : hooks.defaultFormat;\n    }\n    var output = formatMoment(this, inputString);\n    return this.localeData().postformat(output);\n}\n\nfunction from (time, withoutSuffix) {\n    if (this.isValid() &&\n            ((isMoment(time) && time.isValid()) ||\n             createLocal(time).isValid())) {\n        return createDuration({to: this, from: time}).locale(this.locale()).humanize(!withoutSuffix);\n    } else {\n        return this.localeData().invalidDate();\n    }\n}\n\nfunction fromNow (withoutSuffix) {\n    return this.from(createLocal(), withoutSuffix);\n}\n\nfunction to (time, withoutSuffix) {\n    if (this.isValid() &&\n            ((isMoment(time) && time.isValid()) ||\n             createLocal(time).isValid())) {\n        return createDuration({from: this, to: time}).locale(this.locale()).humanize(!withoutSuffix);\n    } else {\n        return this.localeData().invalidDate();\n    }\n}\n\nfunction toNow (withoutSuffix) {\n    return this.to(createLocal(), withoutSuffix);\n}\n\n// If passed a locale key, it will set the locale for this\n// instance.  Otherwise, it will return the locale configuration\n// variables for this instance.\nfunction locale (key) {\n    var newLocaleData;\n\n    if (key === undefined) {\n        return this._locale._abbr;\n    } else {\n        newLocaleData = getLocale(key);\n        if (newLocaleData != null) {\n            this._locale = newLocaleData;\n        }\n        return this;\n    }\n}\n\nvar lang = deprecate(\n    'moment().lang() is deprecated. Instead, use moment().localeData() to get the language configuration. Use moment().locale() to change languages.',\n    function (key) {\n        if (key === undefined) {\n            return this.localeData();\n        } else {\n            return this.locale(key);\n        }\n    }\n);\n\nfunction localeData () {\n    return this._locale;\n}\n\nfunction startOf (units) {\n    units = normalizeUnits(units);\n    // the following switch intentionally omits break keywords\n    // to utilize falling through the cases.\n    switch (units) {\n        case 'year':\n            this.month(0);\n            /* falls through */\n        case 'quarter':\n        case 'month':\n            this.date(1);\n            /* falls through */\n        case 'week':\n        case 'isoWeek':\n        case 'day':\n        case 'date':\n            this.hours(0);\n            /* falls through */\n        case 'hour':\n            this.minutes(0);\n            /* falls through */\n        case 'minute':\n            this.seconds(0);\n            /* falls through */\n        case 'second':\n            this.milliseconds(0);\n    }\n\n    // weeks are a special case\n    if (units === 'week') {\n        this.weekday(0);\n    }\n    if (units === 'isoWeek') {\n        this.isoWeekday(1);\n    }\n\n    // quarters are also special\n    if (units === 'quarter') {\n        this.month(Math.floor(this.month() / 3) * 3);\n    }\n\n    return this;\n}\n\nfunction endOf (units) {\n    units = normalizeUnits(units);\n    if (units === undefined || units === 'millisecond') {\n        return this;\n    }\n\n    // 'date' is an alias for 'day', so it should be considered as such.\n    if (units === 'date') {\n        units = 'day';\n    }\n\n    return this.startOf(units).add(1, (units === 'isoWeek' ? 'week' : units)).subtract(1, 'ms');\n}\n\nfunction valueOf () {\n    return this._d.valueOf() - ((this._offset || 0) * 60000);\n}\n\nfunction unix () {\n    return Math.floor(this.valueOf() / 1000);\n}\n\nfunction toDate () {\n    return new Date(this.valueOf());\n}\n\nfunction toArray () {\n    var m = this;\n    return [m.year(), m.month(), m.date(), m.hour(), m.minute(), m.second(), m.millisecond()];\n}\n\nfunction toObject () {\n    var m = this;\n    return {\n        years: m.year(),\n        months: m.month(),\n        date: m.date(),\n        hours: m.hours(),\n        minutes: m.minutes(),\n        seconds: m.seconds(),\n        milliseconds: m.milliseconds()\n    };\n}\n\nfunction toJSON () {\n    // new Date(NaN).toJSON() === null\n    return this.isValid() ? this.toISOString() : null;\n}\n\nfunction isValid$1 () {\n    return isValid(this);\n}\n\nfunction parsingFlags () {\n    return extend({}, getParsingFlags(this));\n}\n\nfunction invalidAt () {\n    return getParsingFlags(this).overflow;\n}\n\nfunction creationData() {\n    return {\n        input: this._i,\n        format: this._f,\n        locale: this._locale,\n        isUTC: this._isUTC,\n        strict: this._strict\n    };\n}\n\n// FORMATTING\n\naddFormatToken(0, ['gg', 2], 0, function () {\n    return this.weekYear() % 100;\n});\n\naddFormatToken(0, ['GG', 2], 0, function () {\n    return this.isoWeekYear() % 100;\n});\n\nfunction addWeekYearFormatToken (token, getter) {\n    addFormatToken(0, [token, token.length], 0, getter);\n}\n\naddWeekYearFormatToken('gggg',     'weekYear');\naddWeekYearFormatToken('ggggg',    'weekYear');\naddWeekYearFormatToken('GGGG',  'isoWeekYear');\naddWeekYearFormatToken('GGGGG', 'isoWeekYear');\n\n// ALIASES\n\naddUnitAlias('weekYear', 'gg');\naddUnitAlias('isoWeekYear', 'GG');\n\n// PRIORITY\n\naddUnitPriority('weekYear', 1);\naddUnitPriority('isoWeekYear', 1);\n\n\n// PARSING\n\naddRegexToken('G',      matchSigned);\naddRegexToken('g',      matchSigned);\naddRegexToken('GG',     match1to2, match2);\naddRegexToken('gg',     match1to2, match2);\naddRegexToken('GGGG',   match1to4, match4);\naddRegexToken('gggg',   match1to4, match4);\naddRegexToken('GGGGG',  match1to6, match6);\naddRegexToken('ggggg',  match1to6, match6);\n\naddWeekParseToken(['gggg', 'ggggg', 'GGGG', 'GGGGG'], function (input, week, config, token) {\n    week[token.substr(0, 2)] = toInt(input);\n});\n\naddWeekParseToken(['gg', 'GG'], function (input, week, config, token) {\n    week[token] = hooks.parseTwoDigitYear(input);\n});\n\n// MOMENTS\n\nfunction getSetWeekYear (input) {\n    return getSetWeekYearHelper.call(this,\n            input,\n            this.week(),\n            this.weekday(),\n            this.localeData()._week.dow,\n            this.localeData()._week.doy);\n}\n\nfunction getSetISOWeekYear (input) {\n    return getSetWeekYearHelper.call(this,\n            input, this.isoWeek(), this.isoWeekday(), 1, 4);\n}\n\nfunction getISOWeeksInYear () {\n    return weeksInYear(this.year(), 1, 4);\n}\n\nfunction getWeeksInYear () {\n    var weekInfo = this.localeData()._week;\n    return weeksInYear(this.year(), weekInfo.dow, weekInfo.doy);\n}\n\nfunction getSetWeekYearHelper(input, week, weekday, dow, doy) {\n    var weeksTarget;\n    if (input == null) {\n        return weekOfYear(this, dow, doy).year;\n    } else {\n        weeksTarget = weeksInYear(input, dow, doy);\n        if (week > weeksTarget) {\n            week = weeksTarget;\n        }\n        return setWeekAll.call(this, input, week, weekday, dow, doy);\n    }\n}\n\nfunction setWeekAll(weekYear, week, weekday, dow, doy) {\n    var dayOfYearData = dayOfYearFromWeeks(weekYear, week, weekday, dow, doy),\n        date = createUTCDate(dayOfYearData.year, 0, dayOfYearData.dayOfYear);\n\n    this.year(date.getUTCFullYear());\n    this.month(date.getUTCMonth());\n    this.date(date.getUTCDate());\n    return this;\n}\n\n// FORMATTING\n\naddFormatToken('Q', 0, 'Qo', 'quarter');\n\n// ALIASES\n\naddUnitAlias('quarter', 'Q');\n\n// PRIORITY\n\naddUnitPriority('quarter', 7);\n\n// PARSING\n\naddRegexToken('Q', match1);\naddParseToken('Q', function (input, array) {\n    array[MONTH] = (toInt(input) - 1) * 3;\n});\n\n// MOMENTS\n\nfunction getSetQuarter (input) {\n    return input == null ? Math.ceil((this.month() + 1) / 3) : this.month((input - 1) * 3 + this.month() % 3);\n}\n\n// FORMATTING\n\naddFormatToken('D', ['DD', 2], 'Do', 'date');\n\n// ALIASES\n\naddUnitAlias('date', 'D');\n\n// PRIOROITY\naddUnitPriority('date', 9);\n\n// PARSING\n\naddRegexToken('D',  match1to2);\naddRegexToken('DD', match1to2, match2);\naddRegexToken('Do', function (isStrict, locale) {\n    return isStrict ? locale._ordinalParse : locale._ordinalParseLenient;\n});\n\naddParseToken(['D', 'DD'], DATE);\naddParseToken('Do', function (input, array) {\n    array[DATE] = toInt(input.match(match1to2)[0], 10);\n});\n\n// MOMENTS\n\nvar getSetDayOfMonth = makeGetSet('Date', true);\n\n// FORMATTING\n\naddFormatToken('DDD', ['DDDD', 3], 'DDDo', 'dayOfYear');\n\n// ALIASES\n\naddUnitAlias('dayOfYear', 'DDD');\n\n// PRIORITY\naddUnitPriority('dayOfYear', 4);\n\n// PARSING\n\naddRegexToken('DDD',  match1to3);\naddRegexToken('DDDD', match3);\naddParseToken(['DDD', 'DDDD'], function (input, array, config) {\n    config._dayOfYear = toInt(input);\n});\n\n// HELPERS\n\n// MOMENTS\n\nfunction getSetDayOfYear (input) {\n    var dayOfYear = Math.round((this.clone().startOf('day') - this.clone().startOf('year')) / 864e5) + 1;\n    return input == null ? dayOfYear : this.add((input - dayOfYear), 'd');\n}\n\n// FORMATTING\n\naddFormatToken('m', ['mm', 2], 0, 'minute');\n\n// ALIASES\n\naddUnitAlias('minute', 'm');\n\n// PRIORITY\n\naddUnitPriority('minute', 14);\n\n// PARSING\n\naddRegexToken('m',  match1to2);\naddRegexToken('mm', match1to2, match2);\naddParseToken(['m', 'mm'], MINUTE);\n\n// MOMENTS\n\nvar getSetMinute = makeGetSet('Minutes', false);\n\n// FORMATTING\n\naddFormatToken('s', ['ss', 2], 0, 'second');\n\n// ALIASES\n\naddUnitAlias('second', 's');\n\n// PRIORITY\n\naddUnitPriority('second', 15);\n\n// PARSING\n\naddRegexToken('s',  match1to2);\naddRegexToken('ss', match1to2, match2);\naddParseToken(['s', 'ss'], SECOND);\n\n// MOMENTS\n\nvar getSetSecond = makeGetSet('Seconds', false);\n\n// FORMATTING\n\naddFormatToken('S', 0, 0, function () {\n    return ~~(this.millisecond() / 100);\n});\n\naddFormatToken(0, ['SS', 2], 0, function () {\n    return ~~(this.millisecond() / 10);\n});\n\naddFormatToken(0, ['SSS', 3], 0, 'millisecond');\naddFormatToken(0, ['SSSS', 4], 0, function () {\n    return this.millisecond() * 10;\n});\naddFormatToken(0, ['SSSSS', 5], 0, function () {\n    return this.millisecond() * 100;\n});\naddFormatToken(0, ['SSSSSS', 6], 0, function () {\n    return this.millisecond() * 1000;\n});\naddFormatToken(0, ['SSSSSSS', 7], 0, function () {\n    return this.millisecond() * 10000;\n});\naddFormatToken(0, ['SSSSSSSS', 8], 0, function () {\n    return this.millisecond() * 100000;\n});\naddFormatToken(0, ['SSSSSSSSS', 9], 0, function () {\n    return this.millisecond() * 1000000;\n});\n\n\n// ALIASES\n\naddUnitAlias('millisecond', 'ms');\n\n// PRIORITY\n\naddUnitPriority('millisecond', 16);\n\n// PARSING\n\naddRegexToken('S',    match1to3, match1);\naddRegexToken('SS',   match1to3, match2);\naddRegexToken('SSS',  match1to3, match3);\n\nvar token;\nfor (token = 'SSSS'; token.length <= 9; token += 'S') {\n    addRegexToken(token, matchUnsigned);\n}\n\nfunction parseMs(input, array) {\n    array[MILLISECOND] = toInt(('0.' + input) * 1000);\n}\n\nfor (token = 'S'; token.length <= 9; token += 'S') {\n    addParseToken(token, parseMs);\n}\n// MOMENTS\n\nvar getSetMillisecond = makeGetSet('Milliseconds', false);\n\n// FORMATTING\n\naddFormatToken('z',  0, 0, 'zoneAbbr');\naddFormatToken('zz', 0, 0, 'zoneName');\n\n// MOMENTS\n\nfunction getZoneAbbr () {\n    return this._isUTC ? 'UTC' : '';\n}\n\nfunction getZoneName () {\n    return this._isUTC ? 'Coordinated Universal Time' : '';\n}\n\nvar proto = Moment.prototype;\n\nproto.add               = add;\nproto.calendar          = calendar$1;\nproto.clone             = clone;\nproto.diff              = diff;\nproto.endOf             = endOf;\nproto.format            = format;\nproto.from              = from;\nproto.fromNow           = fromNow;\nproto.to                = to;\nproto.toNow             = toNow;\nproto.get               = stringGet;\nproto.invalidAt         = invalidAt;\nproto.isAfter           = isAfter;\nproto.isBefore          = isBefore;\nproto.isBetween         = isBetween;\nproto.isSame            = isSame;\nproto.isSameOrAfter     = isSameOrAfter;\nproto.isSameOrBefore    = isSameOrBefore;\nproto.isValid           = isValid$1;\nproto.lang              = lang;\nproto.locale            = locale;\nproto.localeData        = localeData;\nproto.max               = prototypeMax;\nproto.min               = prototypeMin;\nproto.parsingFlags      = parsingFlags;\nproto.set               = stringSet;\nproto.startOf           = startOf;\nproto.subtract          = subtract;\nproto.toArray           = toArray;\nproto.toObject          = toObject;\nproto.toDate            = toDate;\nproto.toISOString       = toISOString;\nproto.inspect           = inspect;\nproto.toJSON            = toJSON;\nproto.toString          = toString;\nproto.unix              = unix;\nproto.valueOf           = valueOf;\nproto.creationData      = creationData;\n\n// Year\nproto.year       = getSetYear;\nproto.isLeapYear = getIsLeapYear;\n\n// Week Year\nproto.weekYear    = getSetWeekYear;\nproto.isoWeekYear = getSetISOWeekYear;\n\n// Quarter\nproto.quarter = proto.quarters = getSetQuarter;\n\n// Month\nproto.month       = getSetMonth;\nproto.daysInMonth = getDaysInMonth;\n\n// Week\nproto.week           = proto.weeks        = getSetWeek;\nproto.isoWeek        = proto.isoWeeks     = getSetISOWeek;\nproto.weeksInYear    = getWeeksInYear;\nproto.isoWeeksInYear = getISOWeeksInYear;\n\n// Day\nproto.date       = getSetDayOfMonth;\nproto.day        = proto.days             = getSetDayOfWeek;\nproto.weekday    = getSetLocaleDayOfWeek;\nproto.isoWeekday = getSetISODayOfWeek;\nproto.dayOfYear  = getSetDayOfYear;\n\n// Hour\nproto.hour = proto.hours = getSetHour;\n\n// Minute\nproto.minute = proto.minutes = getSetMinute;\n\n// Second\nproto.second = proto.seconds = getSetSecond;\n\n// Millisecond\nproto.millisecond = proto.milliseconds = getSetMillisecond;\n\n// Offset\nproto.utcOffset            = getSetOffset;\nproto.utc                  = setOffsetToUTC;\nproto.local                = setOffsetToLocal;\nproto.parseZone            = setOffsetToParsedOffset;\nproto.hasAlignedHourOffset = hasAlignedHourOffset;\nproto.isDST                = isDaylightSavingTime;\nproto.isLocal              = isLocal;\nproto.isUtcOffset          = isUtcOffset;\nproto.isUtc                = isUtc;\nproto.isUTC                = isUtc;\n\n// Timezone\nproto.zoneAbbr = getZoneAbbr;\nproto.zoneName = getZoneName;\n\n// Deprecations\nproto.dates  = deprecate('dates accessor is deprecated. Use date instead.', getSetDayOfMonth);\nproto.months = deprecate('months accessor is deprecated. Use month instead', getSetMonth);\nproto.years  = deprecate('years accessor is deprecated. Use year instead', getSetYear);\nproto.zone   = deprecate('moment().zone is deprecated, use moment().utcOffset instead. http://momentjs.com/guides/#/warnings/zone/', getSetZone);\nproto.isDSTShifted = deprecate('isDSTShifted is deprecated. See http://momentjs.com/guides/#/warnings/dst-shifted/ for more information', isDaylightSavingTimeShifted);\n\nfunction createUnix (input) {\n    return createLocal(input * 1000);\n}\n\nfunction createInZone () {\n    return createLocal.apply(null, arguments).parseZone();\n}\n\nfunction preParsePostFormat (string) {\n    return string;\n}\n\nvar proto$1 = Locale.prototype;\n\nproto$1.calendar        = calendar;\nproto$1.longDateFormat  = longDateFormat;\nproto$1.invalidDate     = invalidDate;\nproto$1.ordinal         = ordinal;\nproto$1.preparse        = preParsePostFormat;\nproto$1.postformat      = preParsePostFormat;\nproto$1.relativeTime    = relativeTime;\nproto$1.pastFuture      = pastFuture;\nproto$1.set             = set;\n\n// Month\nproto$1.months            =        localeMonths;\nproto$1.monthsShort       =        localeMonthsShort;\nproto$1.monthsParse       =        localeMonthsParse;\nproto$1.monthsRegex       = monthsRegex;\nproto$1.monthsShortRegex  = monthsShortRegex;\n\n// Week\nproto$1.week = localeWeek;\nproto$1.firstDayOfYear = localeFirstDayOfYear;\nproto$1.firstDayOfWeek = localeFirstDayOfWeek;\n\n// Day of Week\nproto$1.weekdays       =        localeWeekdays;\nproto$1.weekdaysMin    =        localeWeekdaysMin;\nproto$1.weekdaysShort  =        localeWeekdaysShort;\nproto$1.weekdaysParse  =        localeWeekdaysParse;\n\nproto$1.weekdaysRegex       =        weekdaysRegex;\nproto$1.weekdaysShortRegex  =        weekdaysShortRegex;\nproto$1.weekdaysMinRegex    =        weekdaysMinRegex;\n\n// Hours\nproto$1.isPM = localeIsPM;\nproto$1.meridiem = localeMeridiem;\n\nfunction get$1 (format, index, field, setter) {\n    var locale = getLocale();\n    var utc = createUTC().set(setter, index);\n    return locale[field](utc, format);\n}\n\nfunction listMonthsImpl (format, index, field) {\n    if (isNumber(format)) {\n        index = format;\n        format = undefined;\n    }\n\n    format = format || '';\n\n    if (index != null) {\n        return get$1(format, index, field, 'month');\n    }\n\n    var i;\n    var out = [];\n    for (i = 0; i < 12; i++) {\n        out[i] = get$1(format, i, field, 'month');\n    }\n    return out;\n}\n\n// ()\n// (5)\n// (fmt, 5)\n// (fmt)\n// (true)\n// (true, 5)\n// (true, fmt, 5)\n// (true, fmt)\nfunction listWeekdaysImpl (localeSorted, format, index, field) {\n    if (typeof localeSorted === 'boolean') {\n        if (isNumber(format)) {\n            index = format;\n            format = undefined;\n        }\n\n        format = format || '';\n    } else {\n        format = localeSorted;\n        index = format;\n        localeSorted = false;\n\n        if (isNumber(format)) {\n            index = format;\n            format = undefined;\n        }\n\n        format = format || '';\n    }\n\n    var locale = getLocale(),\n        shift = localeSorted ? locale._week.dow : 0;\n\n    if (index != null) {\n        return get$1(format, (index + shift) % 7, field, 'day');\n    }\n\n    var i;\n    var out = [];\n    for (i = 0; i < 7; i++) {\n        out[i] = get$1(format, (i + shift) % 7, field, 'day');\n    }\n    return out;\n}\n\nfunction listMonths (format, index) {\n    return listMonthsImpl(format, index, 'months');\n}\n\nfunction listMonthsShort (format, index) {\n    return listMonthsImpl(format, index, 'monthsShort');\n}\n\nfunction listWeekdays (localeSorted, format, index) {\n    return listWeekdaysImpl(localeSorted, format, index, 'weekdays');\n}\n\nfunction listWeekdaysShort (localeSorted, format, index) {\n    return listWeekdaysImpl(localeSorted, format, index, 'weekdaysShort');\n}\n\nfunction listWeekdaysMin (localeSorted, format, index) {\n    return listWeekdaysImpl(localeSorted, format, index, 'weekdaysMin');\n}\n\ngetSetGlobalLocale('en', {\n    ordinalParse: /\\d{1,2}(th|st|nd|rd)/,\n    ordinal : function (number) {\n        var b = number % 10,\n            output = (toInt(number % 100 / 10) === 1) ? 'th' :\n            (b === 1) ? 'st' :\n            (b === 2) ? 'nd' :\n            (b === 3) ? 'rd' : 'th';\n        return number + output;\n    }\n});\n\n// Side effect imports\nhooks.lang = deprecate('moment.lang is deprecated. Use moment.locale instead.', getSetGlobalLocale);\nhooks.langData = deprecate('moment.langData is deprecated. Use moment.localeData instead.', getLocale);\n\nvar mathAbs = Math.abs;\n\nfunction abs () {\n    var data           = this._data;\n\n    this._milliseconds = mathAbs(this._milliseconds);\n    this._days         = mathAbs(this._days);\n    this._months       = mathAbs(this._months);\n\n    data.milliseconds  = mathAbs(data.milliseconds);\n    data.seconds       = mathAbs(data.seconds);\n    data.minutes       = mathAbs(data.minutes);\n    data.hours         = mathAbs(data.hours);\n    data.months        = mathAbs(data.months);\n    data.years         = mathAbs(data.years);\n\n    return this;\n}\n\nfunction addSubtract$1 (duration, input, value, direction) {\n    var other = createDuration(input, value);\n\n    duration._milliseconds += direction * other._milliseconds;\n    duration._days         += direction * other._days;\n    duration._months       += direction * other._months;\n\n    return duration._bubble();\n}\n\n// supports only 2.0-style add(1, 's') or add(duration)\nfunction add$1 (input, value) {\n    return addSubtract$1(this, input, value, 1);\n}\n\n// supports only 2.0-style subtract(1, 's') or subtract(duration)\nfunction subtract$1 (input, value) {\n    return addSubtract$1(this, input, value, -1);\n}\n\nfunction absCeil (number) {\n    if (number < 0) {\n        return Math.floor(number);\n    } else {\n        return Math.ceil(number);\n    }\n}\n\nfunction bubble () {\n    var milliseconds = this._milliseconds;\n    var days         = this._days;\n    var months       = this._months;\n    var data         = this._data;\n    var seconds, minutes, hours, years, monthsFromDays;\n\n    // if we have a mix of positive and negative values, bubble down first\n    // check: https://github.com/moment/moment/issues/2166\n    if (!((milliseconds >= 0 && days >= 0 && months >= 0) ||\n            (milliseconds <= 0 && days <= 0 && months <= 0))) {\n        milliseconds += absCeil(monthsToDays(months) + days) * 864e5;\n        days = 0;\n        months = 0;\n    }\n\n    // The following code bubbles up values, see the tests for\n    // examples of what that means.\n    data.milliseconds = milliseconds % 1000;\n\n    seconds           = absFloor(milliseconds / 1000);\n    data.seconds      = seconds % 60;\n\n    minutes           = absFloor(seconds / 60);\n    data.minutes      = minutes % 60;\n\n    hours             = absFloor(minutes / 60);\n    data.hours        = hours % 24;\n\n    days += absFloor(hours / 24);\n\n    // convert days to months\n    monthsFromDays = absFloor(daysToMonths(days));\n    months += monthsFromDays;\n    days -= absCeil(monthsToDays(monthsFromDays));\n\n    // 12 months -> 1 year\n    years = absFloor(months / 12);\n    months %= 12;\n\n    data.days   = days;\n    data.months = months;\n    data.years  = years;\n\n    return this;\n}\n\nfunction daysToMonths (days) {\n    // 400 years have 146097 days (taking into account leap year rules)\n    // 400 years have 12 months === 4800\n    return days * 4800 / 146097;\n}\n\nfunction monthsToDays (months) {\n    // the reverse of daysToMonths\n    return months * 146097 / 4800;\n}\n\nfunction as (units) {\n    var days;\n    var months;\n    var milliseconds = this._milliseconds;\n\n    units = normalizeUnits(units);\n\n    if (units === 'month' || units === 'year') {\n        days   = this._days   + milliseconds / 864e5;\n        months = this._months + daysToMonths(days);\n        return units === 'month' ? months : months / 12;\n    } else {\n        // handle milliseconds separately because of floating point math errors (issue #1867)\n        days = this._days + Math.round(monthsToDays(this._months));\n        switch (units) {\n            case 'week'   : return days / 7     + milliseconds / 6048e5;\n            case 'day'    : return days         + milliseconds / 864e5;\n            case 'hour'   : return days * 24    + milliseconds / 36e5;\n            case 'minute' : return days * 1440  + milliseconds / 6e4;\n            case 'second' : return days * 86400 + milliseconds / 1000;\n            // Math.floor prevents floating point math errors here\n            case 'millisecond': return Math.floor(days * 864e5) + milliseconds;\n            default: throw new Error('Unknown unit ' + units);\n        }\n    }\n}\n\n// TODO: Use this.as('ms')?\nfunction valueOf$1 () {\n    return (\n        this._milliseconds +\n        this._days * 864e5 +\n        (this._months % 12) * 2592e6 +\n        toInt(this._months / 12) * 31536e6\n    );\n}\n\nfunction makeAs (alias) {\n    return function () {\n        return this.as(alias);\n    };\n}\n\nvar asMilliseconds = makeAs('ms');\nvar asSeconds      = makeAs('s');\nvar asMinutes      = makeAs('m');\nvar asHours        = makeAs('h');\nvar asDays         = makeAs('d');\nvar asWeeks        = makeAs('w');\nvar asMonths       = makeAs('M');\nvar asYears        = makeAs('y');\n\nfunction get$2 (units) {\n    units = normalizeUnits(units);\n    return this[units + 's']();\n}\n\nfunction makeGetter(name) {\n    return function () {\n        return this._data[name];\n    };\n}\n\nvar milliseconds = makeGetter('milliseconds');\nvar seconds      = makeGetter('seconds');\nvar minutes      = makeGetter('minutes');\nvar hours        = makeGetter('hours');\nvar days         = makeGetter('days');\nvar months       = makeGetter('months');\nvar years        = makeGetter('years');\n\nfunction weeks () {\n    return absFloor(this.days() / 7);\n}\n\nvar round = Math.round;\nvar thresholds = {\n    s: 45,  // seconds to minute\n    m: 45,  // minutes to hour\n    h: 22,  // hours to day\n    d: 26,  // days to month\n    M: 11   // months to year\n};\n\n// helper function for moment.fn.from, moment.fn.fromNow, and moment.duration.fn.humanize\nfunction substituteTimeAgo(string, number, withoutSuffix, isFuture, locale) {\n    return locale.relativeTime(number || 1, !!withoutSuffix, string, isFuture);\n}\n\nfunction relativeTime$1 (posNegDuration, withoutSuffix, locale) {\n    var duration = createDuration(posNegDuration).abs();\n    var seconds  = round(duration.as('s'));\n    var minutes  = round(duration.as('m'));\n    var hours    = round(duration.as('h'));\n    var days     = round(duration.as('d'));\n    var months   = round(duration.as('M'));\n    var years    = round(duration.as('y'));\n\n    var a = seconds < thresholds.s && ['s', seconds]  ||\n            minutes <= 1           && ['m']           ||\n            minutes < thresholds.m && ['mm', minutes] ||\n            hours   <= 1           && ['h']           ||\n            hours   < thresholds.h && ['hh', hours]   ||\n            days    <= 1           && ['d']           ||\n            days    < thresholds.d && ['dd', days]    ||\n            months  <= 1           && ['M']           ||\n            months  < thresholds.M && ['MM', months]  ||\n            years   <= 1           && ['y']           || ['yy', years];\n\n    a[2] = withoutSuffix;\n    a[3] = +posNegDuration > 0;\n    a[4] = locale;\n    return substituteTimeAgo.apply(null, a);\n}\n\n// This function allows you to set the rounding function for relative time strings\nfunction getSetRelativeTimeRounding (roundingFunction) {\n    if (roundingFunction === undefined) {\n        return round;\n    }\n    if (typeof(roundingFunction) === 'function') {\n        round = roundingFunction;\n        return true;\n    }\n    return false;\n}\n\n// This function allows you to set a threshold for relative time strings\nfunction getSetRelativeTimeThreshold (threshold, limit) {\n    if (thresholds[threshold] === undefined) {\n        return false;\n    }\n    if (limit === undefined) {\n        return thresholds[threshold];\n    }\n    thresholds[threshold] = limit;\n    return true;\n}\n\nfunction humanize (withSuffix) {\n    var locale = this.localeData();\n    var output = relativeTime$1(this, !withSuffix, locale);\n\n    if (withSuffix) {\n        output = locale.pastFuture(+this, output);\n    }\n\n    return locale.postformat(output);\n}\n\nvar abs$1 = Math.abs;\n\nfunction toISOString$1() {\n    // for ISO strings we do not use the normal bubbling rules:\n    //  * milliseconds bubble up until they become hours\n    //  * days do not bubble at all\n    //  * months bubble up until they become years\n    // This is because there is no context-free conversion between hours and days\n    // (think of clock changes)\n    // and also not between days and months (28-31 days per month)\n    var seconds = abs$1(this._milliseconds) / 1000;\n    var days         = abs$1(this._days);\n    var months       = abs$1(this._months);\n    var minutes, hours, years;\n\n    // 3600 seconds -> 60 minutes -> 1 hour\n    minutes           = absFloor(seconds / 60);\n    hours             = absFloor(minutes / 60);\n    seconds %= 60;\n    minutes %= 60;\n\n    // 12 months -> 1 year\n    years  = absFloor(months / 12);\n    months %= 12;\n\n\n    // inspired by https://github.com/dordille/moment-isoduration/blob/master/moment.isoduration.js\n    var Y = years;\n    var M = months;\n    var D = days;\n    var h = hours;\n    var m = minutes;\n    var s = seconds;\n    var total = this.asSeconds();\n\n    if (!total) {\n        // this is the same as C#'s (Noda) and python (isodate)...\n        // but not other JS (goog.date)\n        return 'P0D';\n    }\n\n    return (total < 0 ? '-' : '') +\n        'P' +\n        (Y ? Y + 'Y' : '') +\n        (M ? M + 'M' : '') +\n        (D ? D + 'D' : '') +\n        ((h || m || s) ? 'T' : '') +\n        (h ? h + 'H' : '') +\n        (m ? m + 'M' : '') +\n        (s ? s + 'S' : '');\n}\n\nvar proto$2 = Duration.prototype;\n\nproto$2.abs            = abs;\nproto$2.add            = add$1;\nproto$2.subtract       = subtract$1;\nproto$2.as             = as;\nproto$2.asMilliseconds = asMilliseconds;\nproto$2.asSeconds      = asSeconds;\nproto$2.asMinutes      = asMinutes;\nproto$2.asHours        = asHours;\nproto$2.asDays         = asDays;\nproto$2.asWeeks        = asWeeks;\nproto$2.asMonths       = asMonths;\nproto$2.asYears        = asYears;\nproto$2.valueOf        = valueOf$1;\nproto$2._bubble        = bubble;\nproto$2.get            = get$2;\nproto$2.milliseconds   = milliseconds;\nproto$2.seconds        = seconds;\nproto$2.minutes        = minutes;\nproto$2.hours          = hours;\nproto$2.days           = days;\nproto$2.weeks          = weeks;\nproto$2.months         = months;\nproto$2.years          = years;\nproto$2.humanize       = humanize;\nproto$2.toISOString    = toISOString$1;\nproto$2.toString       = toISOString$1;\nproto$2.toJSON         = toISOString$1;\nproto$2.locale         = locale;\nproto$2.localeData     = localeData;\n\n// Deprecations\nproto$2.toIsoString = deprecate('toIsoString() is deprecated. Please use toISOString() instead (notice the capitals)', toISOString$1);\nproto$2.lang = lang;\n\n// Side effect imports\n\n// FORMATTING\n\naddFormatToken('X', 0, 0, 'unix');\naddFormatToken('x', 0, 0, 'valueOf');\n\n// PARSING\n\naddRegexToken('x', matchSigned);\naddRegexToken('X', matchTimestamp);\naddParseToken('X', function (input, array, config) {\n    config._d = new Date(parseFloat(input, 10) * 1000);\n});\naddParseToken('x', function (input, array, config) {\n    config._d = new Date(toInt(input));\n});\n\n// Side effect imports\n\n\nhooks.version = '2.17.1';\n\nsetHookCallback(createLocal);\n\nhooks.fn                    = proto;\nhooks.min                   = min;\nhooks.max                   = max;\nhooks.now                   = now;\nhooks.utc                   = createUTC;\nhooks.unix                  = createUnix;\nhooks.months                = listMonths;\nhooks.isDate                = isDate;\nhooks.locale                = getSetGlobalLocale;\nhooks.invalid               = createInvalid;\nhooks.duration              = createDuration;\nhooks.isMoment              = isMoment;\nhooks.weekdays              = listWeekdays;\nhooks.parseZone             = createInZone;\nhooks.localeData            = getLocale;\nhooks.isDuration            = isDuration;\nhooks.monthsShort           = listMonthsShort;\nhooks.weekdaysMin           = listWeekdaysMin;\nhooks.defineLocale          = defineLocale;\nhooks.updateLocale          = updateLocale;\nhooks.locales               = listLocales;\nhooks.weekdaysShort         = listWeekdaysShort;\nhooks.normalizeUnits        = normalizeUnits;\nhooks.relativeTimeRounding = getSetRelativeTimeRounding;\nhooks.relativeTimeThreshold = getSetRelativeTimeThreshold;\nhooks.calendarFormat        = getCalendarFormat;\nhooks.prototype             = proto;\n\nreturn hooks;\n\n})));\n\n/* perfect-scrollbar v0.6.14 */\n(function e(t,n,r){function s(o,u){if(!n[o]){if(!t[o]){var a=typeof require==\"function\"&&require;if(!u&&a)return a(o,!0);if(i)return i(o,!0);var f=new Error(\"Cannot find module '\"+o+\"'\");throw f.code=\"MODULE_NOT_FOUND\",f}var l=n[o]={exports:{}};t[o][0].call(l.exports,function(e){var n=t[o][1][e];return s(n?n:e)},l,l.exports,e,t,n,r)}return n[o].exports}var i=typeof require==\"function\"&&require;for(var o=0;o<r.length;o++)s(r[o]);return s})({1:[function(require,module,exports){\n'use strict';\n\nvar ps = require('../main');\n\nif (typeof define === 'function' && define.amd) {\n  // AMD\n  define(ps);\n} else {\n  // Add to a global object.\n  window.PerfectScrollbar = ps;\n  if (typeof window.Ps === 'undefined') {\n    window.Ps = ps;\n  }\n}\n\n},{\"../main\":7}],2:[function(require,module,exports){\n'use strict';\n\nfunction oldAdd(element, className) {\n  var classes = element.className.split(' ');\n  if (classes.indexOf(className) < 0) {\n    classes.push(className);\n  }\n  element.className = classes.join(' ');\n}\n\nfunction oldRemove(element, className) {\n  var classes = element.className.split(' ');\n  var idx = classes.indexOf(className);\n  if (idx >= 0) {\n    classes.splice(idx, 1);\n  }\n  element.className = classes.join(' ');\n}\n\nexports.add = function (element, className) {\n  if (element.classList) {\n    element.classList.add(className);\n  } else {\n    oldAdd(element, className);\n  }\n};\n\nexports.remove = function (element, className) {\n  if (element.classList) {\n    element.classList.remove(className);\n  } else {\n    oldRemove(element, className);\n  }\n};\n\nexports.list = function (element) {\n  if (element.classList) {\n    return Array.prototype.slice.apply(element.classList);\n  } else {\n    return element.className.split(' ');\n  }\n};\n\n},{}],3:[function(require,module,exports){\n'use strict';\n\nvar DOM = {};\n\nDOM.e = function (tagName, className) {\n  var element = document.createElement(tagName);\n  element.className = className;\n  return element;\n};\n\nDOM.appendTo = function (child, parent) {\n  parent.appendChild(child);\n  return child;\n};\n\nfunction cssGet(element, styleName) {\n  return window.getComputedStyle(element)[styleName];\n}\n\nfunction cssSet(element, styleName, styleValue) {\n  if (typeof styleValue === 'number') {\n    styleValue = styleValue.toString() + 'px';\n  }\n  element.style[styleName] = styleValue;\n  return element;\n}\n\nfunction cssMultiSet(element, obj) {\n  for (var key in obj) {\n    var val = obj[key];\n    if (typeof val === 'number') {\n      val = val.toString() + 'px';\n    }\n    element.style[key] = val;\n  }\n  return element;\n}\n\nDOM.css = function (element, styleNameOrObject, styleValue) {\n  if (typeof styleNameOrObject === 'object') {\n    // multiple set with object\n    return cssMultiSet(element, styleNameOrObject);\n  } else {\n    if (typeof styleValue === 'undefined') {\n      return cssGet(element, styleNameOrObject);\n    } else {\n      return cssSet(element, styleNameOrObject, styleValue);\n    }\n  }\n};\n\nDOM.matches = function (element, query) {\n  if (typeof element.matches !== 'undefined') {\n    return element.matches(query);\n  } else {\n    if (typeof element.matchesSelector !== 'undefined') {\n      return element.matchesSelector(query);\n    } else if (typeof element.webkitMatchesSelector !== 'undefined') {\n      return element.webkitMatchesSelector(query);\n    } else if (typeof element.mozMatchesSelector !== 'undefined') {\n      return element.mozMatchesSelector(query);\n    } else if (typeof element.msMatchesSelector !== 'undefined') {\n      return element.msMatchesSelector(query);\n    }\n  }\n};\n\nDOM.remove = function (element) {\n  if (typeof element.remove !== 'undefined') {\n    element.remove();\n  } else {\n    if (element.parentNode) {\n      element.parentNode.removeChild(element);\n    }\n  }\n};\n\nDOM.queryChildren = function (element, selector) {\n  return Array.prototype.filter.call(element.childNodes, function (child) {\n    return DOM.matches(child, selector);\n  });\n};\n\nmodule.exports = DOM;\n\n},{}],4:[function(require,module,exports){\n'use strict';\n\nvar EventElement = function (element) {\n  this.element = element;\n  this.events = {};\n};\n\nEventElement.prototype.bind = function (eventName, handler) {\n  if (typeof this.events[eventName] === 'undefined') {\n    this.events[eventName] = [];\n  }\n  this.events[eventName].push(handler);\n  this.element.addEventListener(eventName, handler, false);\n};\n\nEventElement.prototype.unbind = function (eventName, handler) {\n  var isHandlerProvided = (typeof handler !== 'undefined');\n  this.events[eventName] = this.events[eventName].filter(function (hdlr) {\n    if (isHandlerProvided && hdlr !== handler) {\n      return true;\n    }\n    this.element.removeEventListener(eventName, hdlr, false);\n    return false;\n  }, this);\n};\n\nEventElement.prototype.unbindAll = function () {\n  for (var name in this.events) {\n    this.unbind(name);\n  }\n};\n\nvar EventManager = function () {\n  this.eventElements = [];\n};\n\nEventManager.prototype.eventElement = function (element) {\n  var ee = this.eventElements.filter(function (eventElement) {\n    return eventElement.element === element;\n  })[0];\n  if (typeof ee === 'undefined') {\n    ee = new EventElement(element);\n    this.eventElements.push(ee);\n  }\n  return ee;\n};\n\nEventManager.prototype.bind = function (element, eventName, handler) {\n  this.eventElement(element).bind(eventName, handler);\n};\n\nEventManager.prototype.unbind = function (element, eventName, handler) {\n  this.eventElement(element).unbind(eventName, handler);\n};\n\nEventManager.prototype.unbindAll = function () {\n  for (var i = 0; i < this.eventElements.length; i++) {\n    this.eventElements[i].unbindAll();\n  }\n};\n\nEventManager.prototype.once = function (element, eventName, handler) {\n  var ee = this.eventElement(element);\n  var onceHandler = function (e) {\n    ee.unbind(eventName, onceHandler);\n    handler(e);\n  };\n  ee.bind(eventName, onceHandler);\n};\n\nmodule.exports = EventManager;\n\n},{}],5:[function(require,module,exports){\n'use strict';\n\nmodule.exports = (function () {\n  function s4() {\n    return Math.floor((1 + Math.random()) * 0x10000)\n               .toString(16)\n               .substring(1);\n  }\n  return function () {\n    return s4() + s4() + '-' + s4() + '-' + s4() + '-' +\n           s4() + '-' + s4() + s4() + s4();\n  };\n})();\n\n},{}],6:[function(require,module,exports){\n'use strict';\n\nvar cls = require('./class');\nvar dom = require('./dom');\n\nvar toInt = exports.toInt = function (x) {\n  return parseInt(x, 10) || 0;\n};\n\nvar clone = exports.clone = function (obj) {\n  if (!obj) {\n    return null;\n  } else if (obj.constructor === Array) {\n    return obj.map(clone);\n  } else if (typeof obj === 'object') {\n    var result = {};\n    for (var key in obj) {\n      result[key] = clone(obj[key]);\n    }\n    return result;\n  } else {\n    return obj;\n  }\n};\n\nexports.extend = function (original, source) {\n  var result = clone(original);\n  for (var key in source) {\n    result[key] = clone(source[key]);\n  }\n  return result;\n};\n\nexports.isEditable = function (el) {\n  return dom.matches(el, \"input,[contenteditable]\") ||\n         dom.matches(el, \"select,[contenteditable]\") ||\n         dom.matches(el, \"textarea,[contenteditable]\") ||\n         dom.matches(el, \"button,[contenteditable]\");\n};\n\nexports.removePsClasses = function (element) {\n  var clsList = cls.list(element);\n  for (var i = 0; i < clsList.length; i++) {\n    var className = clsList[i];\n    if (className.indexOf('ps-') === 0) {\n      cls.remove(element, className);\n    }\n  }\n};\n\nexports.outerWidth = function (element) {\n  return toInt(dom.css(element, 'width')) +\n         toInt(dom.css(element, 'paddingLeft')) +\n         toInt(dom.css(element, 'paddingRight')) +\n         toInt(dom.css(element, 'borderLeftWidth')) +\n         toInt(dom.css(element, 'borderRightWidth'));\n};\n\nexports.startScrolling = function (element, axis) {\n  cls.add(element, 'ps-in-scrolling');\n  if (typeof axis !== 'undefined') {\n    cls.add(element, 'ps-' + axis);\n  } else {\n    cls.add(element, 'ps-x');\n    cls.add(element, 'ps-y');\n  }\n};\n\nexports.stopScrolling = function (element, axis) {\n  cls.remove(element, 'ps-in-scrolling');\n  if (typeof axis !== 'undefined') {\n    cls.remove(element, 'ps-' + axis);\n  } else {\n    cls.remove(element, 'ps-x');\n    cls.remove(element, 'ps-y');\n  }\n};\n\nexports.env = {\n  isWebKit: 'WebkitAppearance' in document.documentElement.style,\n  supportsTouch: (('ontouchstart' in window) || window.DocumentTouch && document instanceof window.DocumentTouch),\n  supportsIePointer: window.navigator.msMaxTouchPoints !== null\n};\n\n},{\"./class\":2,\"./dom\":3}],7:[function(require,module,exports){\n'use strict';\n\nvar destroy = require('./plugin/destroy');\nvar initialize = require('./plugin/initialize');\nvar update = require('./plugin/update');\n\nmodule.exports = {\n  initialize: initialize,\n  update: update,\n  destroy: destroy\n};\n\n},{\"./plugin/destroy\":9,\"./plugin/initialize\":17,\"./plugin/update\":21}],8:[function(require,module,exports){\n'use strict';\n\nmodule.exports = {\n  handlers: ['click-rail', 'drag-scrollbar', 'keyboard', 'wheel', 'touch'],\n  maxScrollbarLength: null,\n  minScrollbarLength: null,\n  scrollXMarginOffset: 0,\n  scrollYMarginOffset: 0,\n  suppressScrollX: false,\n  suppressScrollY: false,\n  swipePropagation: true,\n  useBothWheelAxes: false,\n  wheelPropagation: false,\n  wheelSpeed: 1,\n  theme: 'default'\n};\n\n},{}],9:[function(require,module,exports){\n'use strict';\n\nvar _ = require('../lib/helper');\nvar dom = require('../lib/dom');\nvar instances = require('./instances');\n\nmodule.exports = function (element) {\n  var i = instances.get(element);\n\n  if (!i) {\n    return;\n  }\n\n  i.event.unbindAll();\n  dom.remove(i.scrollbarX);\n  dom.remove(i.scrollbarY);\n  dom.remove(i.scrollbarXRail);\n  dom.remove(i.scrollbarYRail);\n  _.removePsClasses(element);\n\n  instances.remove(element);\n};\n\n},{\"../lib/dom\":3,\"../lib/helper\":6,\"./instances\":18}],10:[function(require,module,exports){\n'use strict';\n\nvar instances = require('../instances');\nvar updateGeometry = require('../update-geometry');\nvar updateScroll = require('../update-scroll');\n\nfunction bindClickRailHandler(element, i) {\n  function pageOffset(el) {\n    return el.getBoundingClientRect();\n  }\n  var stopPropagation = function (e) { e.stopPropagation(); };\n\n  i.event.bind(i.scrollbarY, 'click', stopPropagation);\n  i.event.bind(i.scrollbarYRail, 'click', function (e) {\n    var positionTop = e.pageY - window.pageYOffset - pageOffset(i.scrollbarYRail).top;\n    var direction = positionTop > i.scrollbarYTop ? 1 : -1;\n\n    updateScroll(element, 'top', element.scrollTop + direction * i.containerHeight);\n    updateGeometry(element);\n\n    e.stopPropagation();\n  });\n\n  i.event.bind(i.scrollbarX, 'click', stopPropagation);\n  i.event.bind(i.scrollbarXRail, 'click', function (e) {\n    var positionLeft = e.pageX - window.pageXOffset - pageOffset(i.scrollbarXRail).left;\n    var direction = positionLeft > i.scrollbarXLeft ? 1 : -1;\n\n    updateScroll(element, 'left', element.scrollLeft + direction * i.containerWidth);\n    updateGeometry(element);\n\n    e.stopPropagation();\n  });\n}\n\nmodule.exports = function (element) {\n  var i = instances.get(element);\n  bindClickRailHandler(element, i);\n};\n\n},{\"../instances\":18,\"../update-geometry\":19,\"../update-scroll\":20}],11:[function(require,module,exports){\n'use strict';\n\nvar _ = require('../../lib/helper');\nvar dom = require('../../lib/dom');\nvar instances = require('../instances');\nvar updateGeometry = require('../update-geometry');\nvar updateScroll = require('../update-scroll');\n\nfunction bindMouseScrollXHandler(element, i) {\n  var currentLeft = null;\n  var currentPageX = null;\n\n  function updateScrollLeft(deltaX) {\n    var newLeft = currentLeft + (deltaX * i.railXRatio);\n    var maxLeft = Math.max(0, i.scrollbarXRail.getBoundingClientRect().left) + (i.railXRatio * (i.railXWidth - i.scrollbarXWidth));\n\n    if (newLeft < 0) {\n      i.scrollbarXLeft = 0;\n    } else if (newLeft > maxLeft) {\n      i.scrollbarXLeft = maxLeft;\n    } else {\n      i.scrollbarXLeft = newLeft;\n    }\n\n    var scrollLeft = _.toInt(i.scrollbarXLeft * (i.contentWidth - i.containerWidth) / (i.containerWidth - (i.railXRatio * i.scrollbarXWidth))) - i.negativeScrollAdjustment;\n    updateScroll(element, 'left', scrollLeft);\n  }\n\n  var mouseMoveHandler = function (e) {\n    updateScrollLeft(e.pageX - currentPageX);\n    updateGeometry(element);\n    e.stopPropagation();\n    e.preventDefault();\n  };\n\n  var mouseUpHandler = function () {\n    _.stopScrolling(element, 'x');\n    i.event.unbind(i.ownerDocument, 'mousemove', mouseMoveHandler);\n  };\n\n  i.event.bind(i.scrollbarX, 'mousedown', function (e) {\n    currentPageX = e.pageX;\n    currentLeft = _.toInt(dom.css(i.scrollbarX, 'left')) * i.railXRatio;\n    _.startScrolling(element, 'x');\n\n    i.event.bind(i.ownerDocument, 'mousemove', mouseMoveHandler);\n    i.event.once(i.ownerDocument, 'mouseup', mouseUpHandler);\n\n    e.stopPropagation();\n    e.preventDefault();\n  });\n}\n\nfunction bindMouseScrollYHandler(element, i) {\n  var currentTop = null;\n  var currentPageY = null;\n\n  function updateScrollTop(deltaY) {\n    var newTop = currentTop + (deltaY * i.railYRatio);\n    var maxTop = Math.max(0, i.scrollbarYRail.getBoundingClientRect().top) + (i.railYRatio * (i.railYHeight - i.scrollbarYHeight));\n\n    if (newTop < 0) {\n      i.scrollbarYTop = 0;\n    } else if (newTop > maxTop) {\n      i.scrollbarYTop = maxTop;\n    } else {\n      i.scrollbarYTop = newTop;\n    }\n\n    var scrollTop = _.toInt(i.scrollbarYTop * (i.contentHeight - i.containerHeight) / (i.containerHeight - (i.railYRatio * i.scrollbarYHeight)));\n    updateScroll(element, 'top', scrollTop);\n  }\n\n  var mouseMoveHandler = function (e) {\n    updateScrollTop(e.pageY - currentPageY);\n    updateGeometry(element);\n    e.stopPropagation();\n    e.preventDefault();\n  };\n\n  var mouseUpHandler = function () {\n    _.stopScrolling(element, 'y');\n    i.event.unbind(i.ownerDocument, 'mousemove', mouseMoveHandler);\n  };\n\n  i.event.bind(i.scrollbarY, 'mousedown', function (e) {\n    currentPageY = e.pageY;\n    currentTop = _.toInt(dom.css(i.scrollbarY, 'top')) * i.railYRatio;\n    _.startScrolling(element, 'y');\n\n    i.event.bind(i.ownerDocument, 'mousemove', mouseMoveHandler);\n    i.event.once(i.ownerDocument, 'mouseup', mouseUpHandler);\n\n    e.stopPropagation();\n    e.preventDefault();\n  });\n}\n\nmodule.exports = function (element) {\n  var i = instances.get(element);\n  bindMouseScrollXHandler(element, i);\n  bindMouseScrollYHandler(element, i);\n};\n\n},{\"../../lib/dom\":3,\"../../lib/helper\":6,\"../instances\":18,\"../update-geometry\":19,\"../update-scroll\":20}],12:[function(require,module,exports){\n'use strict';\n\nvar _ = require('../../lib/helper');\nvar dom = require('../../lib/dom');\nvar instances = require('../instances');\nvar updateGeometry = require('../update-geometry');\nvar updateScroll = require('../update-scroll');\n\nfunction bindKeyboardHandler(element, i) {\n  var hovered = false;\n  i.event.bind(element, 'mouseenter', function () {\n    hovered = true;\n  });\n  i.event.bind(element, 'mouseleave', function () {\n    hovered = false;\n  });\n\n  var shouldPrevent = false;\n  function shouldPreventDefault(deltaX, deltaY) {\n    var scrollTop = element.scrollTop;\n    if (deltaX === 0) {\n      if (!i.scrollbarYActive) {\n        return false;\n      }\n      if ((scrollTop === 0 && deltaY > 0) || (scrollTop >= i.contentHeight - i.containerHeight && deltaY < 0)) {\n        return !i.settings.wheelPropagation;\n      }\n    }\n\n    var scrollLeft = element.scrollLeft;\n    if (deltaY === 0) {\n      if (!i.scrollbarXActive) {\n        return false;\n      }\n      if ((scrollLeft === 0 && deltaX < 0) || (scrollLeft >= i.contentWidth - i.containerWidth && deltaX > 0)) {\n        return !i.settings.wheelPropagation;\n      }\n    }\n    return true;\n  }\n\n  i.event.bind(i.ownerDocument, 'keydown', function (e) {\n    if ((e.isDefaultPrevented && e.isDefaultPrevented()) || e.defaultPrevented) {\n      return;\n    }\n\n    var focused = dom.matches(i.scrollbarX, ':focus') ||\n                  dom.matches(i.scrollbarY, ':focus');\n\n    if (!hovered && !focused) {\n      return;\n    }\n\n    var activeElement = document.activeElement ? document.activeElement : i.ownerDocument.activeElement;\n    if (activeElement) {\n      if (activeElement.tagName === 'IFRAME') {\n        activeElement = activeElement.contentDocument.activeElement;\n      } else {\n        // go deeper if element is a webcomponent\n        while (activeElement.shadowRoot) {\n          activeElement = activeElement.shadowRoot.activeElement;\n        }\n      }\n      if (_.isEditable(activeElement)) {\n        return;\n      }\n    }\n\n    var deltaX = 0;\n    var deltaY = 0;\n\n    switch (e.which) {\n    case 37: // left\n      if (e.metaKey) {\n        deltaX = -i.contentWidth;\n      } else if (e.altKey) {\n        deltaX = -i.containerWidth;\n      } else {\n        deltaX = -30;\n      }\n      break;\n    case 38: // up\n      if (e.metaKey) {\n        deltaY = i.contentHeight;\n      } else if (e.altKey) {\n        deltaY = i.containerHeight;\n      } else {\n        deltaY = 30;\n      }\n      break;\n    case 39: // right\n      if (e.metaKey) {\n        deltaX = i.contentWidth;\n      } else if (e.altKey) {\n        deltaX = i.containerWidth;\n      } else {\n        deltaX = 30;\n      }\n      break;\n    case 40: // down\n      if (e.metaKey) {\n        deltaY = -i.contentHeight;\n      } else if (e.altKey) {\n        deltaY = -i.containerHeight;\n      } else {\n        deltaY = -30;\n      }\n      break;\n    case 33: // page up\n      deltaY = 90;\n      break;\n    case 32: // space bar\n      if (e.shiftKey) {\n        deltaY = 90;\n      } else {\n        deltaY = -90;\n      }\n      break;\n    case 34: // page down\n      deltaY = -90;\n      break;\n    case 35: // end\n      if (e.ctrlKey) {\n        deltaY = -i.contentHeight;\n      } else {\n        deltaY = -i.containerHeight;\n      }\n      break;\n    case 36: // home\n      if (e.ctrlKey) {\n        deltaY = element.scrollTop;\n      } else {\n        deltaY = i.containerHeight;\n      }\n      break;\n    default:\n      return;\n    }\n\n    updateScroll(element, 'top', element.scrollTop - deltaY);\n    updateScroll(element, 'left', element.scrollLeft + deltaX);\n    updateGeometry(element);\n\n    shouldPrevent = shouldPreventDefault(deltaX, deltaY);\n    if (shouldPrevent) {\n      e.preventDefault();\n    }\n  });\n}\n\nmodule.exports = function (element) {\n  var i = instances.get(element);\n  bindKeyboardHandler(element, i);\n};\n\n},{\"../../lib/dom\":3,\"../../lib/helper\":6,\"../instances\":18,\"../update-geometry\":19,\"../update-scroll\":20}],13:[function(require,module,exports){\n'use strict';\n\nvar instances = require('../instances');\nvar updateGeometry = require('../update-geometry');\nvar updateScroll = require('../update-scroll');\n\nfunction bindMouseWheelHandler(element, i) {\n  var shouldPrevent = false;\n\n  function shouldPreventDefault(deltaX, deltaY) {\n    var scrollTop = element.scrollTop;\n    if (deltaX === 0) {\n      if (!i.scrollbarYActive) {\n        return false;\n      }\n      if ((scrollTop === 0 && deltaY > 0) || (scrollTop >= i.contentHeight - i.containerHeight && deltaY < 0)) {\n        return !i.settings.wheelPropagation;\n      }\n    }\n\n    var scrollLeft = element.scrollLeft;\n    if (deltaY === 0) {\n      if (!i.scrollbarXActive) {\n        return false;\n      }\n      if ((scrollLeft === 0 && deltaX < 0) || (scrollLeft >= i.contentWidth - i.containerWidth && deltaX > 0)) {\n        return !i.settings.wheelPropagation;\n      }\n    }\n    return true;\n  }\n\n  function getDeltaFromEvent(e) {\n    var deltaX = e.deltaX;\n    var deltaY = -1 * e.deltaY;\n\n    if (typeof deltaX === \"undefined\" || typeof deltaY === \"undefined\") {\n      // OS X Safari\n      deltaX = -1 * e.wheelDeltaX / 6;\n      deltaY = e.wheelDeltaY / 6;\n    }\n\n    if (e.deltaMode && e.deltaMode === 1) {\n      // Firefox in deltaMode 1: Line scrolling\n      deltaX *= 10;\n      deltaY *= 10;\n    }\n\n    if (deltaX !== deltaX && deltaY !== deltaY/* NaN checks */) {\n      // IE in some mouse drivers\n      deltaX = 0;\n      deltaY = e.wheelDelta;\n    }\n\n    if (e.shiftKey) {\n      // reverse axis with shift key\n      return [-deltaY, -deltaX];\n    }\n    return [deltaX, deltaY];\n  }\n\n  function shouldBeConsumedByChild(deltaX, deltaY) {\n    var child = element.querySelector('textarea:hover, select[multiple]:hover, .ps-child:hover');\n    if (child) {\n      if (!window.getComputedStyle(child).overflow.match(/(scroll|auto)/)) {\n        // if not scrollable\n        return false;\n      }\n\n      var maxScrollTop = child.scrollHeight - child.clientHeight;\n      if (maxScrollTop > 0) {\n        if (!(child.scrollTop === 0 && deltaY > 0) && !(child.scrollTop === maxScrollTop && deltaY < 0)) {\n          return true;\n        }\n      }\n      var maxScrollLeft = child.scrollLeft - child.clientWidth;\n      if (maxScrollLeft > 0) {\n        if (!(child.scrollLeft === 0 && deltaX < 0) && !(child.scrollLeft === maxScrollLeft && deltaX > 0)) {\n          return true;\n        }\n      }\n    }\n    return false;\n  }\n\n  function mousewheelHandler(e) {\n    var delta = getDeltaFromEvent(e);\n\n    var deltaX = delta[0];\n    var deltaY = delta[1];\n\n    if (shouldBeConsumedByChild(deltaX, deltaY)) {\n      return;\n    }\n\n    shouldPrevent = false;\n    if (!i.settings.useBothWheelAxes) {\n      // deltaX will only be used for horizontal scrolling and deltaY will\n      // only be used for vertical scrolling - this is the default\n      updateScroll(element, 'top', element.scrollTop - (deltaY * i.settings.wheelSpeed));\n      updateScroll(element, 'left', element.scrollLeft + (deltaX * i.settings.wheelSpeed));\n    } else if (i.scrollbarYActive && !i.scrollbarXActive) {\n      // only vertical scrollbar is active and useBothWheelAxes option is\n      // active, so let's scroll vertical bar using both mouse wheel axes\n      if (deltaY) {\n        updateScroll(element, 'top', element.scrollTop - (deltaY * i.settings.wheelSpeed));\n      } else {\n        updateScroll(element, 'top', element.scrollTop + (deltaX * i.settings.wheelSpeed));\n      }\n      shouldPrevent = true;\n    } else if (i.scrollbarXActive && !i.scrollbarYActive) {\n      // useBothWheelAxes and only horizontal bar is active, so use both\n      // wheel axes for horizontal bar\n      if (deltaX) {\n        updateScroll(element, 'left', element.scrollLeft + (deltaX * i.settings.wheelSpeed));\n      } else {\n        updateScroll(element, 'left', element.scrollLeft - (deltaY * i.settings.wheelSpeed));\n      }\n      shouldPrevent = true;\n    }\n\n    updateGeometry(element);\n\n    shouldPrevent = (shouldPrevent || shouldPreventDefault(deltaX, deltaY));\n    if (shouldPrevent) {\n      e.stopPropagation();\n      e.preventDefault();\n    }\n  }\n\n  if (typeof window.onwheel !== \"undefined\") {\n    i.event.bind(element, 'wheel', mousewheelHandler);\n  } else if (typeof window.onmousewheel !== \"undefined\") {\n    i.event.bind(element, 'mousewheel', mousewheelHandler);\n  }\n}\n\nmodule.exports = function (element) {\n  var i = instances.get(element);\n  bindMouseWheelHandler(element, i);\n};\n\n},{\"../instances\":18,\"../update-geometry\":19,\"../update-scroll\":20}],14:[function(require,module,exports){\n'use strict';\n\nvar instances = require('../instances');\nvar updateGeometry = require('../update-geometry');\n\nfunction bindNativeScrollHandler(element, i) {\n  i.event.bind(element, 'scroll', function () {\n    updateGeometry(element);\n  });\n}\n\nmodule.exports = function (element) {\n  var i = instances.get(element);\n  bindNativeScrollHandler(element, i);\n};\n\n},{\"../instances\":18,\"../update-geometry\":19}],15:[function(require,module,exports){\n'use strict';\n\nvar _ = require('../../lib/helper');\nvar instances = require('../instances');\nvar updateGeometry = require('../update-geometry');\nvar updateScroll = require('../update-scroll');\n\nfunction bindSelectionHandler(element, i) {\n  function getRangeNode() {\n    var selection = window.getSelection ? window.getSelection() :\n                    document.getSelection ? document.getSelection() : '';\n    if (selection.toString().length === 0) {\n      return null;\n    } else {\n      return selection.getRangeAt(0).commonAncestorContainer;\n    }\n  }\n\n  var scrollingLoop = null;\n  var scrollDiff = {top: 0, left: 0};\n  function startScrolling() {\n    if (!scrollingLoop) {\n      scrollingLoop = setInterval(function () {\n        if (!instances.get(element)) {\n          clearInterval(scrollingLoop);\n          return;\n        }\n\n        updateScroll(element, 'top', element.scrollTop + scrollDiff.top);\n        updateScroll(element, 'left', element.scrollLeft + scrollDiff.left);\n        updateGeometry(element);\n      }, 50); // every .1 sec\n    }\n  }\n  function stopScrolling() {\n    if (scrollingLoop) {\n      clearInterval(scrollingLoop);\n      scrollingLoop = null;\n    }\n    _.stopScrolling(element);\n  }\n\n  var isSelected = false;\n  i.event.bind(i.ownerDocument, 'selectionchange', function () {\n    if (element.contains(getRangeNode())) {\n      isSelected = true;\n    } else {\n      isSelected = false;\n      stopScrolling();\n    }\n  });\n  i.event.bind(window, 'mouseup', function () {\n    if (isSelected) {\n      isSelected = false;\n      stopScrolling();\n    }\n  });\n  i.event.bind(window, 'keyup', function () {\n    if (isSelected) {\n      isSelected = false;\n      stopScrolling();\n    }\n  });\n\n  i.event.bind(window, 'mousemove', function (e) {\n    if (isSelected) {\n      var mousePosition = {x: e.pageX, y: e.pageY};\n      var containerGeometry = {\n        left: element.offsetLeft,\n        right: element.offsetLeft + element.offsetWidth,\n        top: element.offsetTop,\n        bottom: element.offsetTop + element.offsetHeight\n      };\n\n      if (mousePosition.x < containerGeometry.left + 3) {\n        scrollDiff.left = -5;\n        _.startScrolling(element, 'x');\n      } else if (mousePosition.x > containerGeometry.right - 3) {\n        scrollDiff.left = 5;\n        _.startScrolling(element, 'x');\n      } else {\n        scrollDiff.left = 0;\n      }\n\n      if (mousePosition.y < containerGeometry.top + 3) {\n        if (containerGeometry.top + 3 - mousePosition.y < 5) {\n          scrollDiff.top = -5;\n        } else {\n          scrollDiff.top = -20;\n        }\n        _.startScrolling(element, 'y');\n      } else if (mousePosition.y > containerGeometry.bottom - 3) {\n        if (mousePosition.y - containerGeometry.bottom + 3 < 5) {\n          scrollDiff.top = 5;\n        } else {\n          scrollDiff.top = 20;\n        }\n        _.startScrolling(element, 'y');\n      } else {\n        scrollDiff.top = 0;\n      }\n\n      if (scrollDiff.top === 0 && scrollDiff.left === 0) {\n        stopScrolling();\n      } else {\n        startScrolling();\n      }\n    }\n  });\n}\n\nmodule.exports = function (element) {\n  var i = instances.get(element);\n  bindSelectionHandler(element, i);\n};\n\n},{\"../../lib/helper\":6,\"../instances\":18,\"../update-geometry\":19,\"../update-scroll\":20}],16:[function(require,module,exports){\n'use strict';\n\nvar _ = require('../../lib/helper');\nvar instances = require('../instances');\nvar updateGeometry = require('../update-geometry');\nvar updateScroll = require('../update-scroll');\n\nfunction bindTouchHandler(element, i, supportsTouch, supportsIePointer) {\n  function shouldPreventDefault(deltaX, deltaY) {\n    var scrollTop = element.scrollTop;\n    var scrollLeft = element.scrollLeft;\n    var magnitudeX = Math.abs(deltaX);\n    var magnitudeY = Math.abs(deltaY);\n\n    if (magnitudeY > magnitudeX) {\n      // user is perhaps trying to swipe up/down the page\n\n      if (((deltaY < 0) && (scrollTop === i.contentHeight - i.containerHeight)) ||\n          ((deltaY > 0) && (scrollTop === 0))) {\n        return !i.settings.swipePropagation;\n      }\n    } else if (magnitudeX > magnitudeY) {\n      // user is perhaps trying to swipe left/right across the page\n\n      if (((deltaX < 0) && (scrollLeft === i.contentWidth - i.containerWidth)) ||\n          ((deltaX > 0) && (scrollLeft === 0))) {\n        return !i.settings.swipePropagation;\n      }\n    }\n\n    return true;\n  }\n\n  function applyTouchMove(differenceX, differenceY) {\n    updateScroll(element, 'top', element.scrollTop - differenceY);\n    updateScroll(element, 'left', element.scrollLeft - differenceX);\n\n    updateGeometry(element);\n  }\n\n  var startOffset = {};\n  var startTime = 0;\n  var speed = {};\n  var easingLoop = null;\n  var inGlobalTouch = false;\n  var inLocalTouch = false;\n\n  function globalTouchStart() {\n    inGlobalTouch = true;\n  }\n  function globalTouchEnd() {\n    inGlobalTouch = false;\n  }\n\n  function getTouch(e) {\n    if (e.targetTouches) {\n      return e.targetTouches[0];\n    } else {\n      // Maybe IE pointer\n      return e;\n    }\n  }\n  function shouldHandle(e) {\n    if (e.targetTouches && e.targetTouches.length === 1) {\n      return true;\n    }\n    if (e.pointerType && e.pointerType !== 'mouse' && e.pointerType !== e.MSPOINTER_TYPE_MOUSE) {\n      return true;\n    }\n    return false;\n  }\n  function touchStart(e) {\n    if (shouldHandle(e)) {\n      inLocalTouch = true;\n\n      var touch = getTouch(e);\n\n      startOffset.pageX = touch.pageX;\n      startOffset.pageY = touch.pageY;\n\n      startTime = (new Date()).getTime();\n\n      if (easingLoop !== null) {\n        clearInterval(easingLoop);\n      }\n\n      e.stopPropagation();\n    }\n  }\n  function touchMove(e) {\n    if (!inLocalTouch && i.settings.swipePropagation) {\n      touchStart(e);\n    }\n    if (!inGlobalTouch && inLocalTouch && shouldHandle(e)) {\n      var touch = getTouch(e);\n\n      var currentOffset = {pageX: touch.pageX, pageY: touch.pageY};\n\n      var differenceX = currentOffset.pageX - startOffset.pageX;\n      var differenceY = currentOffset.pageY - startOffset.pageY;\n\n      applyTouchMove(differenceX, differenceY);\n      startOffset = currentOffset;\n\n      var currentTime = (new Date()).getTime();\n\n      var timeGap = currentTime - startTime;\n      if (timeGap > 0) {\n        speed.x = differenceX / timeGap;\n        speed.y = differenceY / timeGap;\n        startTime = currentTime;\n      }\n\n      if (shouldPreventDefault(differenceX, differenceY)) {\n        e.stopPropagation();\n        e.preventDefault();\n      }\n    }\n  }\n  function touchEnd() {\n    if (!inGlobalTouch && inLocalTouch) {\n      inLocalTouch = false;\n\n      clearInterval(easingLoop);\n      easingLoop = setInterval(function () {\n        if (!instances.get(element)) {\n          clearInterval(easingLoop);\n          return;\n        }\n\n        if (!speed.x && !speed.y) {\n          clearInterval(easingLoop);\n          return;\n        }\n\n        if (Math.abs(speed.x) < 0.01 && Math.abs(speed.y) < 0.01) {\n          clearInterval(easingLoop);\n          return;\n        }\n\n        applyTouchMove(speed.x * 30, speed.y * 30);\n\n        speed.x *= 0.8;\n        speed.y *= 0.8;\n      }, 10);\n    }\n  }\n\n  if (supportsTouch) {\n    i.event.bind(window, 'touchstart', globalTouchStart);\n    i.event.bind(window, 'touchend', globalTouchEnd);\n    i.event.bind(element, 'touchstart', touchStart);\n    i.event.bind(element, 'touchmove', touchMove);\n    i.event.bind(element, 'touchend', touchEnd);\n  }\n\n  if (supportsIePointer) {\n    if (window.PointerEvent) {\n      i.event.bind(window, 'pointerdown', globalTouchStart);\n      i.event.bind(window, 'pointerup', globalTouchEnd);\n      i.event.bind(element, 'pointerdown', touchStart);\n      i.event.bind(element, 'pointermove', touchMove);\n      i.event.bind(element, 'pointerup', touchEnd);\n    } else if (window.MSPointerEvent) {\n      i.event.bind(window, 'MSPointerDown', globalTouchStart);\n      i.event.bind(window, 'MSPointerUp', globalTouchEnd);\n      i.event.bind(element, 'MSPointerDown', touchStart);\n      i.event.bind(element, 'MSPointerMove', touchMove);\n      i.event.bind(element, 'MSPointerUp', touchEnd);\n    }\n  }\n}\n\nmodule.exports = function (element) {\n  if (!_.env.supportsTouch && !_.env.supportsIePointer) {\n    return;\n  }\n\n  var i = instances.get(element);\n  bindTouchHandler(element, i, _.env.supportsTouch, _.env.supportsIePointer);\n};\n\n},{\"../../lib/helper\":6,\"../instances\":18,\"../update-geometry\":19,\"../update-scroll\":20}],17:[function(require,module,exports){\n'use strict';\n\nvar _ = require('../lib/helper');\nvar cls = require('../lib/class');\nvar instances = require('./instances');\nvar updateGeometry = require('./update-geometry');\n\n// Handlers\nvar handlers = {\n  'click-rail': require('./handler/click-rail'),\n  'drag-scrollbar': require('./handler/drag-scrollbar'),\n  'keyboard': require('./handler/keyboard'),\n  'wheel': require('./handler/mouse-wheel'),\n  'touch': require('./handler/touch'),\n  'selection': require('./handler/selection')\n};\nvar nativeScrollHandler = require('./handler/native-scroll');\n\nmodule.exports = function (element, userSettings) {\n  userSettings = typeof userSettings === 'object' ? userSettings : {};\n\n  cls.add(element, 'ps-container');\n\n  // Create a plugin instance.\n  var i = instances.add(element);\n\n  i.settings = _.extend(i.settings, userSettings);\n  cls.add(element, 'ps-theme-' + i.settings.theme);\n\n  i.settings.handlers.forEach(function (handlerName) {\n    handlers[handlerName](element);\n  });\n\n  nativeScrollHandler(element);\n\n  updateGeometry(element);\n};\n\n},{\"../lib/class\":2,\"../lib/helper\":6,\"./handler/click-rail\":10,\"./handler/drag-scrollbar\":11,\"./handler/keyboard\":12,\"./handler/mouse-wheel\":13,\"./handler/native-scroll\":14,\"./handler/selection\":15,\"./handler/touch\":16,\"./instances\":18,\"./update-geometry\":19}],18:[function(require,module,exports){\n'use strict';\n\nvar _ = require('../lib/helper');\nvar cls = require('../lib/class');\nvar defaultSettings = require('./default-setting');\nvar dom = require('../lib/dom');\nvar EventManager = require('../lib/event-manager');\nvar guid = require('../lib/guid');\n\nvar instances = {};\n\nfunction Instance(element) {\n  var i = this;\n\n  i.settings = _.clone(defaultSettings);\n  i.containerWidth = null;\n  i.containerHeight = null;\n  i.contentWidth = null;\n  i.contentHeight = null;\n\n  i.isRtl = dom.css(element, 'direction') === \"rtl\";\n  i.isNegativeScroll = (function () {\n    var originalScrollLeft = element.scrollLeft;\n    var result = null;\n    element.scrollLeft = -1;\n    result = element.scrollLeft < 0;\n    element.scrollLeft = originalScrollLeft;\n    return result;\n  })();\n  i.negativeScrollAdjustment = i.isNegativeScroll ? element.scrollWidth - element.clientWidth : 0;\n  i.event = new EventManager();\n  i.ownerDocument = element.ownerDocument || document;\n\n  function focus() {\n    cls.add(element, 'ps-focus');\n  }\n\n  function blur() {\n    cls.remove(element, 'ps-focus');\n  }\n\n  i.scrollbarXRail = dom.appendTo(dom.e('div', 'ps-scrollbar-x-rail'), element);\n  i.scrollbarX = dom.appendTo(dom.e('div', 'ps-scrollbar-x'), i.scrollbarXRail);\n  i.scrollbarX.setAttribute('tabindex', 0);\n  i.event.bind(i.scrollbarX, 'focus', focus);\n  i.event.bind(i.scrollbarX, 'blur', blur);\n  i.scrollbarXActive = null;\n  i.scrollbarXWidth = null;\n  i.scrollbarXLeft = null;\n  i.scrollbarXBottom = _.toInt(dom.css(i.scrollbarXRail, 'bottom'));\n  i.isScrollbarXUsingBottom = i.scrollbarXBottom === i.scrollbarXBottom; // !isNaN\n  i.scrollbarXTop = i.isScrollbarXUsingBottom ? null : _.toInt(dom.css(i.scrollbarXRail, 'top'));\n  i.railBorderXWidth = _.toInt(dom.css(i.scrollbarXRail, 'borderLeftWidth')) + _.toInt(dom.css(i.scrollbarXRail, 'borderRightWidth'));\n  // Set rail to display:block to calculate margins\n  dom.css(i.scrollbarXRail, 'display', 'block');\n  i.railXMarginWidth = _.toInt(dom.css(i.scrollbarXRail, 'marginLeft')) + _.toInt(dom.css(i.scrollbarXRail, 'marginRight'));\n  dom.css(i.scrollbarXRail, 'display', '');\n  i.railXWidth = null;\n  i.railXRatio = null;\n\n  i.scrollbarYRail = dom.appendTo(dom.e('div', 'ps-scrollbar-y-rail'), element);\n  i.scrollbarY = dom.appendTo(dom.e('div', 'ps-scrollbar-y'), i.scrollbarYRail);\n  i.scrollbarY.setAttribute('tabindex', 0);\n  i.event.bind(i.scrollbarY, 'focus', focus);\n  i.event.bind(i.scrollbarY, 'blur', blur);\n  i.scrollbarYActive = null;\n  i.scrollbarYHeight = null;\n  i.scrollbarYTop = null;\n  i.scrollbarYRight = _.toInt(dom.css(i.scrollbarYRail, 'right'));\n  i.isScrollbarYUsingRight = i.scrollbarYRight === i.scrollbarYRight; // !isNaN\n  i.scrollbarYLeft = i.isScrollbarYUsingRight ? null : _.toInt(dom.css(i.scrollbarYRail, 'left'));\n  i.scrollbarYOuterWidth = i.isRtl ? _.outerWidth(i.scrollbarY) : null;\n  i.railBorderYWidth = _.toInt(dom.css(i.scrollbarYRail, 'borderTopWidth')) + _.toInt(dom.css(i.scrollbarYRail, 'borderBottomWidth'));\n  dom.css(i.scrollbarYRail, 'display', 'block');\n  i.railYMarginHeight = _.toInt(dom.css(i.scrollbarYRail, 'marginTop')) + _.toInt(dom.css(i.scrollbarYRail, 'marginBottom'));\n  dom.css(i.scrollbarYRail, 'display', '');\n  i.railYHeight = null;\n  i.railYRatio = null;\n}\n\nfunction getId(element) {\n  return element.getAttribute('data-ps-id');\n}\n\nfunction setId(element, id) {\n  element.setAttribute('data-ps-id', id);\n}\n\nfunction removeId(element) {\n  element.removeAttribute('data-ps-id');\n}\n\nexports.add = function (element) {\n  var newId = guid();\n  setId(element, newId);\n  instances[newId] = new Instance(element);\n  return instances[newId];\n};\n\nexports.remove = function (element) {\n  delete instances[getId(element)];\n  removeId(element);\n};\n\nexports.get = function (element) {\n  return instances[getId(element)];\n};\n\n},{\"../lib/class\":2,\"../lib/dom\":3,\"../lib/event-manager\":4,\"../lib/guid\":5,\"../lib/helper\":6,\"./default-setting\":8}],19:[function(require,module,exports){\n'use strict';\n\nvar _ = require('../lib/helper');\nvar cls = require('../lib/class');\nvar dom = require('../lib/dom');\nvar instances = require('./instances');\nvar updateScroll = require('./update-scroll');\n\nfunction getThumbSize(i, thumbSize) {\n  if (i.settings.minScrollbarLength) {\n    thumbSize = Math.max(thumbSize, i.settings.minScrollbarLength);\n  }\n  if (i.settings.maxScrollbarLength) {\n    thumbSize = Math.min(thumbSize, i.settings.maxScrollbarLength);\n  }\n  return thumbSize;\n}\n\nfunction updateCss(element, i) {\n  var xRailOffset = {width: i.railXWidth};\n  if (i.isRtl) {\n    xRailOffset.left = i.negativeScrollAdjustment + element.scrollLeft + i.containerWidth - i.contentWidth;\n  } else {\n    xRailOffset.left = element.scrollLeft;\n  }\n  if (i.isScrollbarXUsingBottom) {\n    xRailOffset.bottom = i.scrollbarXBottom - element.scrollTop;\n  } else {\n    xRailOffset.top = i.scrollbarXTop + element.scrollTop;\n  }\n  dom.css(i.scrollbarXRail, xRailOffset);\n\n  var yRailOffset = {top: element.scrollTop, height: i.railYHeight};\n  if (i.isScrollbarYUsingRight) {\n    if (i.isRtl) {\n      yRailOffset.right = i.contentWidth - (i.negativeScrollAdjustment + element.scrollLeft) - i.scrollbarYRight - i.scrollbarYOuterWidth;\n    } else {\n      yRailOffset.right = i.scrollbarYRight - element.scrollLeft;\n    }\n  } else {\n    if (i.isRtl) {\n      yRailOffset.left = i.negativeScrollAdjustment + element.scrollLeft + i.containerWidth * 2 - i.contentWidth - i.scrollbarYLeft - i.scrollbarYOuterWidth;\n    } else {\n      yRailOffset.left = i.scrollbarYLeft + element.scrollLeft;\n    }\n  }\n  dom.css(i.scrollbarYRail, yRailOffset);\n\n  dom.css(i.scrollbarX, {left: i.scrollbarXLeft, width: i.scrollbarXWidth - i.railBorderXWidth});\n  dom.css(i.scrollbarY, {top: i.scrollbarYTop, height: i.scrollbarYHeight - i.railBorderYWidth});\n}\n\nmodule.exports = function (element) {\n  var i = instances.get(element);\n\n  i.containerWidth = element.clientWidth;\n  i.containerHeight = element.clientHeight;\n  i.contentWidth = element.scrollWidth;\n  i.contentHeight = element.scrollHeight;\n\n  var existingRails;\n  if (!element.contains(i.scrollbarXRail)) {\n    existingRails = dom.queryChildren(element, '.ps-scrollbar-x-rail');\n    if (existingRails.length > 0) {\n      existingRails.forEach(function (rail) {\n        dom.remove(rail);\n      });\n    }\n    dom.appendTo(i.scrollbarXRail, element);\n  }\n  if (!element.contains(i.scrollbarYRail)) {\n    existingRails = dom.queryChildren(element, '.ps-scrollbar-y-rail');\n    if (existingRails.length > 0) {\n      existingRails.forEach(function (rail) {\n        dom.remove(rail);\n      });\n    }\n    dom.appendTo(i.scrollbarYRail, element);\n  }\n\n  if (!i.settings.suppressScrollX && i.containerWidth + i.settings.scrollXMarginOffset < i.contentWidth) {\n    i.scrollbarXActive = true;\n    i.railXWidth = i.containerWidth - i.railXMarginWidth;\n    i.railXRatio = i.containerWidth / i.railXWidth;\n    i.scrollbarXWidth = getThumbSize(i, _.toInt(i.railXWidth * i.containerWidth / i.contentWidth));\n    i.scrollbarXLeft = _.toInt((i.negativeScrollAdjustment + element.scrollLeft) * (i.railXWidth - i.scrollbarXWidth) / (i.contentWidth - i.containerWidth));\n  } else {\n    i.scrollbarXActive = false;\n  }\n\n  if (!i.settings.suppressScrollY && i.containerHeight + i.settings.scrollYMarginOffset < i.contentHeight) {\n    i.scrollbarYActive = true;\n    i.railYHeight = i.containerHeight - i.railYMarginHeight;\n    i.railYRatio = i.containerHeight / i.railYHeight;\n    i.scrollbarYHeight = getThumbSize(i, _.toInt(i.railYHeight * i.containerHeight / i.contentHeight));\n    i.scrollbarYTop = _.toInt(element.scrollTop * (i.railYHeight - i.scrollbarYHeight) / (i.contentHeight - i.containerHeight));\n  } else {\n    i.scrollbarYActive = false;\n  }\n\n  if (i.scrollbarXLeft >= i.railXWidth - i.scrollbarXWidth) {\n    i.scrollbarXLeft = i.railXWidth - i.scrollbarXWidth;\n  }\n  if (i.scrollbarYTop >= i.railYHeight - i.scrollbarYHeight) {\n    i.scrollbarYTop = i.railYHeight - i.scrollbarYHeight;\n  }\n\n  updateCss(element, i);\n\n  if (i.scrollbarXActive) {\n    cls.add(element, 'ps-active-x');\n  } else {\n    cls.remove(element, 'ps-active-x');\n    i.scrollbarXWidth = 0;\n    i.scrollbarXLeft = 0;\n    updateScroll(element, 'left', 0);\n  }\n  if (i.scrollbarYActive) {\n    cls.add(element, 'ps-active-y');\n  } else {\n    cls.remove(element, 'ps-active-y');\n    i.scrollbarYHeight = 0;\n    i.scrollbarYTop = 0;\n    updateScroll(element, 'top', 0);\n  }\n};\n\n},{\"../lib/class\":2,\"../lib/dom\":3,\"../lib/helper\":6,\"./instances\":18,\"./update-scroll\":20}],20:[function(require,module,exports){\n'use strict';\n\nvar instances = require('./instances');\n\nvar lastTop;\nvar lastLeft;\n\nvar createDOMEvent = function (name) {\n  var event = document.createEvent(\"Event\");\n  event.initEvent(name, true, true);\n  return event;\n};\n\nmodule.exports = function (element, axis, value) {\n  if (typeof element === 'undefined') {\n    throw 'You must provide an element to the update-scroll function';\n  }\n\n  if (typeof axis === 'undefined') {\n    throw 'You must provide an axis to the update-scroll function';\n  }\n\n  if (typeof value === 'undefined') {\n    throw 'You must provide a value to the update-scroll function';\n  }\n\n  if (axis === 'top' && value <= 0) {\n    element.scrollTop = value = 0; // don't allow negative scroll\n    element.dispatchEvent(createDOMEvent('ps-y-reach-start'));\n  }\n\n  if (axis === 'left' && value <= 0) {\n    element.scrollLeft = value = 0; // don't allow negative scroll\n    element.dispatchEvent(createDOMEvent('ps-x-reach-start'));\n  }\n\n  var i = instances.get(element);\n\n  if (axis === 'top' && value >= i.contentHeight - i.containerHeight) {\n    // don't allow scroll past container\n    value = i.contentHeight - i.containerHeight;\n    if (value - element.scrollTop <= 1) {\n      // mitigates rounding errors on non-subpixel scroll values\n      value = element.scrollTop;\n    } else {\n      element.scrollTop = value;\n    }\n    element.dispatchEvent(createDOMEvent('ps-y-reach-end'));\n  }\n\n  if (axis === 'left' && value >= i.contentWidth - i.containerWidth) {\n    // don't allow scroll past container\n    value = i.contentWidth - i.containerWidth;\n    if (value - element.scrollLeft <= 1) {\n      // mitigates rounding errors on non-subpixel scroll values\n      value = element.scrollLeft;\n    } else {\n      element.scrollLeft = value;\n    }\n    element.dispatchEvent(createDOMEvent('ps-x-reach-end'));\n  }\n\n  if (!lastTop) {\n    lastTop = element.scrollTop;\n  }\n\n  if (!lastLeft) {\n    lastLeft = element.scrollLeft;\n  }\n\n  if (axis === 'top' && value < lastTop) {\n    element.dispatchEvent(createDOMEvent('ps-scroll-up'));\n  }\n\n  if (axis === 'top' && value > lastTop) {\n    element.dispatchEvent(createDOMEvent('ps-scroll-down'));\n  }\n\n  if (axis === 'left' && value < lastLeft) {\n    element.dispatchEvent(createDOMEvent('ps-scroll-left'));\n  }\n\n  if (axis === 'left' && value > lastLeft) {\n    element.dispatchEvent(createDOMEvent('ps-scroll-right'));\n  }\n\n  if (axis === 'top') {\n    element.scrollTop = lastTop = value;\n    element.dispatchEvent(createDOMEvent('ps-scroll-y'));\n  }\n\n  if (axis === 'left') {\n    element.scrollLeft = lastLeft = value;\n    element.dispatchEvent(createDOMEvent('ps-scroll-x'));\n  }\n\n};\n\n},{\"./instances\":18}],21:[function(require,module,exports){\n'use strict';\n\nvar _ = require('../lib/helper');\nvar dom = require('../lib/dom');\nvar instances = require('./instances');\nvar updateGeometry = require('./update-geometry');\nvar updateScroll = require('./update-scroll');\n\nmodule.exports = function (element) {\n  var i = instances.get(element);\n\n  if (!i) {\n    return;\n  }\n\n  // Recalcuate negative scrollLeft adjustment\n  i.negativeScrollAdjustment = i.isNegativeScroll ? element.scrollWidth - element.clientWidth : 0;\n\n  // Recalculate rail margins\n  dom.css(i.scrollbarXRail, 'display', 'block');\n  dom.css(i.scrollbarYRail, 'display', 'block');\n  i.railXMarginWidth = _.toInt(dom.css(i.scrollbarXRail, 'marginLeft')) + _.toInt(dom.css(i.scrollbarXRail, 'marginRight'));\n  i.railYMarginHeight = _.toInt(dom.css(i.scrollbarYRail, 'marginTop')) + _.toInt(dom.css(i.scrollbarYRail, 'marginBottom'));\n\n  // Hide scrollbars not to affect scrollWidth and scrollHeight\n  dom.css(i.scrollbarXRail, 'display', 'none');\n  dom.css(i.scrollbarYRail, 'display', 'none');\n\n  updateGeometry(element);\n\n  // Update top/left scroll to trigger events\n  updateScroll(element, 'top', element.scrollTop);\n  updateScroll(element, 'left', element.scrollLeft);\n\n  dom.css(i.scrollbarXRail, 'display', '');\n  dom.css(i.scrollbarYRail, 'display', '');\n};\n\n},{\"../lib/dom\":3,\"../lib/helper\":6,\"./instances\":18,\"./update-geometry\":19,\"./update-scroll\":20}]},{},[1]);\n\n/*! DataTables 1.11.5\n * ©2008-2021 SpryMedia Ltd - datatables.net/license\n */\n\n/**\n * @summary     DataTables\n * @description Paginate, search and order HTML tables\n * @version     1.11.5\n * @file        jquery.dataTables.js\n * @author      SpryMedia Ltd\n * @contact     www.datatables.net\n * @copyright   Copyright 2008-2021 SpryMedia Ltd.\n *\n * This source file is free software, available under the following license:\n *   MIT license - http://datatables.net/license\n *\n * This source file is distributed in the hope that it will be useful, but\n * WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY\n * or FITNESS FOR A PARTICULAR PURPOSE. See the license files for details.\n *\n * For details please refer to: http://www.datatables.net\n */\n\n/*jslint evil: true, undef: true, browser: true */\n/*globals $,require,jQuery,define,_selector_run,_selector_opts,_selector_first,_selector_row_indexes,_ext,_Api,_api_register,_api_registerPlural,_re_new_lines,_re_html,_re_formatted_numeric,_re_escape_regex,_empty,_intVal,_numToDecimal,_isNumber,_isHtml,_htmlNumeric,_pluck,_pluck_order,_range,_stripHtml,_unique,_fnBuildAjax,_fnAjaxUpdate,_fnAjaxParameters,_fnAjaxUpdateDraw,_fnAjaxDataSrc,_fnAddColumn,_fnColumnOptions,_fnAdjustColumnSizing,_fnVisibleToColumnIndex,_fnColumnIndexToVisible,_fnVisbleColumns,_fnGetColumns,_fnColumnTypes,_fnApplyColumnDefs,_fnHungarianMap,_fnCamelToHungarian,_fnLanguageCompat,_fnBrowserDetect,_fnAddData,_fnAddTr,_fnNodeToDataIndex,_fnNodeToColumnIndex,_fnGetCellData,_fnSetCellData,_fnSplitObjNotation,_fnGetObjectDataFn,_fnSetObjectDataFn,_fnGetDataMaster,_fnClearTable,_fnDeleteIndex,_fnInvalidate,_fnGetRowElements,_fnCreateTr,_fnBuildHead,_fnDrawHead,_fnDraw,_fnReDraw,_fnAddOptionsHtml,_fnDetectHeader,_fnGetUniqueThs,_fnFeatureHtmlFilter,_fnFilterComplete,_fnFilterCustom,_fnFilterColumn,_fnFilter,_fnFilterCreateSearch,_fnEscapeRegex,_fnFilterData,_fnFeatureHtmlInfo,_fnUpdateInfo,_fnInfoMacros,_fnInitialise,_fnInitComplete,_fnLengthChange,_fnFeatureHtmlLength,_fnFeatureHtmlPaginate,_fnPageChange,_fnFeatureHtmlProcessing,_fnProcessingDisplay,_fnFeatureHtmlTable,_fnScrollDraw,_fnApplyToChildren,_fnCalculateColumnWidths,_fnThrottle,_fnConvertToWidth,_fnGetWidestNode,_fnGetMaxLenString,_fnStringToCss,_fnSortFlatten,_fnSort,_fnSortAria,_fnSortListener,_fnSortAttachListener,_fnSortingClasses,_fnSortData,_fnSaveState,_fnLoadState,_fnSettingsFromNode,_fnLog,_fnMap,_fnBindAction,_fnCallbackReg,_fnCallbackFire,_fnLengthOverflow,_fnRenderer,_fnDataSource,_fnRowAttributes*/\n\n(function( factory ) {\n\t\"use strict\";\n\n\tif ( typeof define === 'function' && define.amd ) {\n\t\t// AMD\n\t\tdefine( ['jquery'], function ( $ ) {\n\t\t\treturn factory( $, window, document );\n\t\t} );\n\t}\n\telse if ( typeof exports === 'object' ) {\n\t\t// CommonJS\n\t\tmodule.exports = function (root, $) {\n\t\t\tif ( ! root ) {\n\t\t\t\t// CommonJS environments without a window global must pass a\n\t\t\t\t// root. This will give an error otherwise\n\t\t\t\troot = window;\n\t\t\t}\n\n\t\t\tif ( ! $ ) {\n\t\t\t\t$ = typeof window !== 'undefined' ? // jQuery's factory checks for a global window\n\t\t\t\t\trequire('jquery') :\n\t\t\t\t\trequire('jquery')( root );\n\t\t\t}\n\n\t\t\treturn factory( $, root, root.document );\n\t\t};\n\t}\n\telse {\n\t\t// Browser\n\t\twindow.DataTable = factory( jQuery, window, document );\n\t}\n}\n(function( $, window, document, undefined ) {\n\t\"use strict\";\n\n\t\n\tvar DataTable = function ( selector, options )\n\t{\n\t\t// When creating with `new`, create a new DataTable, returning the API instance\n\t\tif (this instanceof DataTable) {\n\t\t\treturn $(selector).DataTable(options);\n\t\t}\n\t\telse {\n\t\t\t// Argument switching\n\t\t\toptions = selector;\n\t\t}\n\t\n\t\t/**\n\t\t * Perform a jQuery selector action on the table's TR elements (from the tbody) and\n\t\t * return the resulting jQuery object.\n\t\t *  @param {string|node|jQuery} sSelector jQuery selector or node collection to act on\n\t\t *  @param {object} [oOpts] Optional parameters for modifying the rows to be included\n\t\t *  @param {string} [oOpts.filter=none] Select TR elements that meet the current filter\n\t\t *    criterion (\"applied\") or all TR elements (i.e. no filter).\n\t\t *  @param {string} [oOpts.order=current] Order of the TR elements in the processed array.\n\t\t *    Can be either 'current', whereby the current sorting of the table is used, or\n\t\t *    'original' whereby the original order the data was read into the table is used.\n\t\t *  @param {string} [oOpts.page=all] Limit the selection to the currently displayed page\n\t\t *    (\"current\") or not (\"all\"). If 'current' is given, then order is assumed to be\n\t\t *    'current' and filter is 'applied', regardless of what they might be given as.\n\t\t *  @returns {object} jQuery object, filtered by the given selector.\n\t\t *  @dtopt API\n\t\t *  @deprecated Since v1.10\n\t\t *\n\t\t *  @example\n\t\t *    $(document).ready(function() {\n\t\t *      var oTable = $('#example').dataTable();\n\t\t *\n\t\t *      // Highlight every second row\n\t\t *      oTable.$('tr:odd').css('backgroundColor', 'blue');\n\t\t *    } );\n\t\t *\n\t\t *  @example\n\t\t *    $(document).ready(function() {\n\t\t *      var oTable = $('#example').dataTable();\n\t\t *\n\t\t *      // Filter to rows with 'Webkit' in them, add a background colour and then\n\t\t *      // remove the filter, thus highlighting the 'Webkit' rows only.\n\t\t *      oTable.fnFilter('Webkit');\n\t\t *      oTable.$('tr', {\"search\": \"applied\"}).css('backgroundColor', 'blue');\n\t\t *      oTable.fnFilter('');\n\t\t *    } );\n\t\t */\n\t\tthis.$ = function ( sSelector, oOpts )\n\t\t{\n\t\t\treturn this.api(true).$( sSelector, oOpts );\n\t\t};\n\t\t\n\t\t\n\t\t/**\n\t\t * Almost identical to $ in operation, but in this case returns the data for the matched\n\t\t * rows - as such, the jQuery selector used should match TR row nodes or TD/TH cell nodes\n\t\t * rather than any descendants, so the data can be obtained for the row/cell. If matching\n\t\t * rows are found, the data returned is the original data array/object that was used to\n\t\t * create the row (or a generated array if from a DOM source).\n\t\t *\n\t\t * This method is often useful in-combination with $ where both functions are given the\n\t\t * same parameters and the array indexes will match identically.\n\t\t *  @param {string|node|jQuery} sSelector jQuery selector or node collection to act on\n\t\t *  @param {object} [oOpts] Optional parameters for modifying the rows to be included\n\t\t *  @param {string} [oOpts.filter=none] Select elements that meet the current filter\n\t\t *    criterion (\"applied\") or all elements (i.e. no filter).\n\t\t *  @param {string} [oOpts.order=current] Order of the data in the processed array.\n\t\t *    Can be either 'current', whereby the current sorting of the table is used, or\n\t\t *    'original' whereby the original order the data was read into the table is used.\n\t\t *  @param {string} [oOpts.page=all] Limit the selection to the currently displayed page\n\t\t *    (\"current\") or not (\"all\"). If 'current' is given, then order is assumed to be\n\t\t *    'current' and filter is 'applied', regardless of what they might be given as.\n\t\t *  @returns {array} Data for the matched elements. If any elements, as a result of the\n\t\t *    selector, were not TR, TD or TH elements in the DataTable, they will have a null\n\t\t *    entry in the array.\n\t\t *  @dtopt API\n\t\t *  @deprecated Since v1.10\n\t\t *\n\t\t *  @example\n\t\t *    $(document).ready(function() {\n\t\t *      var oTable = $('#example').dataTable();\n\t\t *\n\t\t *      // Get the data from the first row in the table\n\t\t *      var data = oTable._('tr:first');\n\t\t *\n\t\t *      // Do something useful with the data\n\t\t *      alert( \"First cell is: \"+data[0] );\n\t\t *    } );\n\t\t *\n\t\t *  @example\n\t\t *    $(document).ready(function() {\n\t\t *      var oTable = $('#example').dataTable();\n\t\t *\n\t\t *      // Filter to 'Webkit' and get all data for\n\t\t *      oTable.fnFilter('Webkit');\n\t\t *      var data = oTable._('tr', {\"search\": \"applied\"});\n\t\t *\n\t\t *      // Do something with the data\n\t\t *      alert( data.length+\" rows matched the search\" );\n\t\t *    } );\n\t\t */\n\t\tthis._ = function ( sSelector, oOpts )\n\t\t{\n\t\t\treturn this.api(true).rows( sSelector, oOpts ).data();\n\t\t};\n\t\t\n\t\t\n\t\t/**\n\t\t * Create a DataTables Api instance, with the currently selected tables for\n\t\t * the Api's context.\n\t\t * @param {boolean} [traditional=false] Set the API instance's context to be\n\t\t *   only the table referred to by the `DataTable.ext.iApiIndex` option, as was\n\t\t *   used in the API presented by DataTables 1.9- (i.e. the traditional mode),\n\t\t *   or if all tables captured in the jQuery object should be used.\n\t\t * @return {DataTables.Api}\n\t\t */\n\t\tthis.api = function ( traditional )\n\t\t{\n\t\t\treturn traditional ?\n\t\t\t\tnew _Api(\n\t\t\t\t\t_fnSettingsFromNode( this[ _ext.iApiIndex ] )\n\t\t\t\t) :\n\t\t\t\tnew _Api( this );\n\t\t};\n\t\t\n\t\t\n\t\t/**\n\t\t * Add a single new row or multiple rows of data to the table. Please note\n\t\t * that this is suitable for client-side processing only - if you are using\n\t\t * server-side processing (i.e. \"bServerSide\": true), then to add data, you\n\t\t * must add it to the data source, i.e. the server-side, through an Ajax call.\n\t\t *  @param {array|object} data The data to be added to the table. This can be:\n\t\t *    <ul>\n\t\t *      <li>1D array of data - add a single row with the data provided</li>\n\t\t *      <li>2D array of arrays - add multiple rows in a single call</li>\n\t\t *      <li>object - data object when using <i>mData</i></li>\n\t\t *      <li>array of objects - multiple data objects when using <i>mData</i></li>\n\t\t *    </ul>\n\t\t *  @param {bool} [redraw=true] redraw the table or not\n\t\t *  @returns {array} An array of integers, representing the list of indexes in\n\t\t *    <i>aoData</i> ({@link DataTable.models.oSettings}) that have been added to\n\t\t *    the table.\n\t\t *  @dtopt API\n\t\t *  @deprecated Since v1.10\n\t\t *\n\t\t *  @example\n\t\t *    // Global var for counter\n\t\t *    var giCount = 2;\n\t\t *\n\t\t *    $(document).ready(function() {\n\t\t *      $('#example').dataTable();\n\t\t *    } );\n\t\t *\n\t\t *    function fnClickAddRow() {\n\t\t *      $('#example').dataTable().fnAddData( [\n\t\t *        giCount+\".1\",\n\t\t *        giCount+\".2\",\n\t\t *        giCount+\".3\",\n\t\t *        giCount+\".4\" ]\n\t\t *      );\n\t\t *\n\t\t *      giCount++;\n\t\t *    }\n\t\t */\n\t\tthis.fnAddData = function( data, redraw )\n\t\t{\n\t\t\tvar api = this.api( true );\n\t\t\n\t\t\t/* Check if we want to add multiple rows or not */\n\t\t\tvar rows = Array.isArray(data) && ( Array.isArray(data[0]) || $.isPlainObject(data[0]) ) ?\n\t\t\t\tapi.rows.add( data ) :\n\t\t\t\tapi.row.add( data );\n\t\t\n\t\t\tif ( redraw === undefined || redraw ) {\n\t\t\t\tapi.draw();\n\t\t\t}\n\t\t\n\t\t\treturn rows.flatten().toArray();\n\t\t};\n\t\t\n\t\t\n\t\t/**\n\t\t * This function will make DataTables recalculate the column sizes, based on the data\n\t\t * contained in the table and the sizes applied to the columns (in the DOM, CSS or\n\t\t * through the sWidth parameter). This can be useful when the width of the table's\n\t\t * parent element changes (for example a window resize).\n\t\t *  @param {boolean} [bRedraw=true] Redraw the table or not, you will typically want to\n\t\t *  @dtopt API\n\t\t *  @deprecated Since v1.10\n\t\t *\n\t\t *  @example\n\t\t *    $(document).ready(function() {\n\t\t *      var oTable = $('#example').dataTable( {\n\t\t *        \"sScrollY\": \"200px\",\n\t\t *        \"bPaginate\": false\n\t\t *      } );\n\t\t *\n\t\t *      $(window).on('resize', function () {\n\t\t *        oTable.fnAdjustColumnSizing();\n\t\t *      } );\n\t\t *    } );\n\t\t */\n\t\tthis.fnAdjustColumnSizing = function ( bRedraw )\n\t\t{\n\t\t\tvar api = this.api( true ).columns.adjust();\n\t\t\tvar settings = api.settings()[0];\n\t\t\tvar scroll = settings.oScroll;\n\t\t\n\t\t\tif ( bRedraw === undefined || bRedraw ) {\n\t\t\t\tapi.draw( false );\n\t\t\t}\n\t\t\telse if ( scroll.sX !== \"\" || scroll.sY !== \"\" ) {\n\t\t\t\t/* If not redrawing, but scrolling, we want to apply the new column sizes anyway */\n\t\t\t\t_fnScrollDraw( settings );\n\t\t\t}\n\t\t};\n\t\t\n\t\t\n\t\t/**\n\t\t * Quickly and simply clear a table\n\t\t *  @param {bool} [bRedraw=true] redraw the table or not\n\t\t *  @dtopt API\n\t\t *  @deprecated Since v1.10\n\t\t *\n\t\t *  @example\n\t\t *    $(document).ready(function() {\n\t\t *      var oTable = $('#example').dataTable();\n\t\t *\n\t\t *      // Immediately 'nuke' the current rows (perhaps waiting for an Ajax callback...)\n\t\t *      oTable.fnClearTable();\n\t\t *    } );\n\t\t */\n\t\tthis.fnClearTable = function( bRedraw )\n\t\t{\n\t\t\tvar api = this.api( true ).clear();\n\t\t\n\t\t\tif ( bRedraw === undefined || bRedraw ) {\n\t\t\t\tapi.draw();\n\t\t\t}\n\t\t};\n\t\t\n\t\t\n\t\t/**\n\t\t * The exact opposite of 'opening' a row, this function will close any rows which\n\t\t * are currently 'open'.\n\t\t *  @param {node} nTr the table row to 'close'\n\t\t *  @returns {int} 0 on success, or 1 if failed (can't find the row)\n\t\t *  @dtopt API\n\t\t *  @deprecated Since v1.10\n\t\t *\n\t\t *  @example\n\t\t *    $(document).ready(function() {\n\t\t *      var oTable;\n\t\t *\n\t\t *      // 'open' an information row when a row is clicked on\n\t\t *      $('#example tbody tr').click( function () {\n\t\t *        if ( oTable.fnIsOpen(this) ) {\n\t\t *          oTable.fnClose( this );\n\t\t *        } else {\n\t\t *          oTable.fnOpen( this, \"Temporary row opened\", \"info_row\" );\n\t\t *        }\n\t\t *      } );\n\t\t *\n\t\t *      oTable = $('#example').dataTable();\n\t\t *    } );\n\t\t */\n\t\tthis.fnClose = function( nTr )\n\t\t{\n\t\t\tthis.api( true ).row( nTr ).child.hide();\n\t\t};\n\t\t\n\t\t\n\t\t/**\n\t\t * Remove a row for the table\n\t\t *  @param {mixed} target The index of the row from aoData to be deleted, or\n\t\t *    the TR element you want to delete\n\t\t *  @param {function|null} [callBack] Callback function\n\t\t *  @param {bool} [redraw=true] Redraw the table or not\n\t\t *  @returns {array} The row that was deleted\n\t\t *  @dtopt API\n\t\t *  @deprecated Since v1.10\n\t\t *\n\t\t *  @example\n\t\t *    $(document).ready(function() {\n\t\t *      var oTable = $('#example').dataTable();\n\t\t *\n\t\t *      // Immediately remove the first row\n\t\t *      oTable.fnDeleteRow( 0 );\n\t\t *    } );\n\t\t */\n\t\tthis.fnDeleteRow = function( target, callback, redraw )\n\t\t{\n\t\t\tvar api = this.api( true );\n\t\t\tvar rows = api.rows( target );\n\t\t\tvar settings = rows.settings()[0];\n\t\t\tvar data = settings.aoData[ rows[0][0] ];\n\t\t\n\t\t\trows.remove();\n\t\t\n\t\t\tif ( callback ) {\n\t\t\t\tcallback.call( this, settings, data );\n\t\t\t}\n\t\t\n\t\t\tif ( redraw === undefined || redraw ) {\n\t\t\t\tapi.draw();\n\t\t\t}\n\t\t\n\t\t\treturn data;\n\t\t};\n\t\t\n\t\t\n\t\t/**\n\t\t * Restore the table to it's original state in the DOM by removing all of DataTables\n\t\t * enhancements, alterations to the DOM structure of the table and event listeners.\n\t\t *  @param {boolean} [remove=false] Completely remove the table from the DOM\n\t\t *  @dtopt API\n\t\t *  @deprecated Since v1.10\n\t\t *\n\t\t *  @example\n\t\t *    $(document).ready(function() {\n\t\t *      // This example is fairly pointless in reality, but shows how fnDestroy can be used\n\t\t *      var oTable = $('#example').dataTable();\n\t\t *      oTable.fnDestroy();\n\t\t *    } );\n\t\t */\n\t\tthis.fnDestroy = function ( remove )\n\t\t{\n\t\t\tthis.api( true ).destroy( remove );\n\t\t};\n\t\t\n\t\t\n\t\t/**\n\t\t * Redraw the table\n\t\t *  @param {bool} [complete=true] Re-filter and resort (if enabled) the table before the draw.\n\t\t *  @dtopt API\n\t\t *  @deprecated Since v1.10\n\t\t *\n\t\t *  @example\n\t\t *    $(document).ready(function() {\n\t\t *      var oTable = $('#example').dataTable();\n\t\t *\n\t\t *      // Re-draw the table - you wouldn't want to do it here, but it's an example :-)\n\t\t *      oTable.fnDraw();\n\t\t *    } );\n\t\t */\n\t\tthis.fnDraw = function( complete )\n\t\t{\n\t\t\t// Note that this isn't an exact match to the old call to _fnDraw - it takes\n\t\t\t// into account the new data, but can hold position.\n\t\t\tthis.api( true ).draw( complete );\n\t\t};\n\t\t\n\t\t\n\t\t/**\n\t\t * Filter the input based on data\n\t\t *  @param {string} sInput String to filter the table on\n\t\t *  @param {int|null} [iColumn] Column to limit filtering to\n\t\t *  @param {bool} [bRegex=false] Treat as regular expression or not\n\t\t *  @param {bool} [bSmart=true] Perform smart filtering or not\n\t\t *  @param {bool} [bShowGlobal=true] Show the input global filter in it's input box(es)\n\t\t *  @param {bool} [bCaseInsensitive=true] Do case-insensitive matching (true) or not (false)\n\t\t *  @dtopt API\n\t\t *  @deprecated Since v1.10\n\t\t *\n\t\t *  @example\n\t\t *    $(document).ready(function() {\n\t\t *      var oTable = $('#example').dataTable();\n\t\t *\n\t\t *      // Sometime later - filter...\n\t\t *      oTable.fnFilter( 'test string' );\n\t\t *    } );\n\t\t */\n\t\tthis.fnFilter = function( sInput, iColumn, bRegex, bSmart, bShowGlobal, bCaseInsensitive )\n\t\t{\n\t\t\tvar api = this.api( true );\n\t\t\n\t\t\tif ( iColumn === null || iColumn === undefined ) {\n\t\t\t\tapi.search( sInput, bRegex, bSmart, bCaseInsensitive );\n\t\t\t}\n\t\t\telse {\n\t\t\t\tapi.column( iColumn ).search( sInput, bRegex, bSmart, bCaseInsensitive );\n\t\t\t}\n\t\t\n\t\t\tapi.draw();\n\t\t};\n\t\t\n\t\t\n\t\t/**\n\t\t * Get the data for the whole table, an individual row or an individual cell based on the\n\t\t * provided parameters.\n\t\t *  @param {int|node} [src] A TR row node, TD/TH cell node or an integer. If given as\n\t\t *    a TR node then the data source for the whole row will be returned. If given as a\n\t\t *    TD/TH cell node then iCol will be automatically calculated and the data for the\n\t\t *    cell returned. If given as an integer, then this is treated as the aoData internal\n\t\t *    data index for the row (see fnGetPosition) and the data for that row used.\n\t\t *  @param {int} [col] Optional column index that you want the data of.\n\t\t *  @returns {array|object|string} If mRow is undefined, then the data for all rows is\n\t\t *    returned. If mRow is defined, just data for that row, and is iCol is\n\t\t *    defined, only data for the designated cell is returned.\n\t\t *  @dtopt API\n\t\t *  @deprecated Since v1.10\n\t\t *\n\t\t *  @example\n\t\t *    // Row data\n\t\t *    $(document).ready(function() {\n\t\t *      oTable = $('#example').dataTable();\n\t\t *\n\t\t *      oTable.$('tr').click( function () {\n\t\t *        var data = oTable.fnGetData( this );\n\t\t *        // ... do something with the array / object of data for the row\n\t\t *      } );\n\t\t *    } );\n\t\t *\n\t\t *  @example\n\t\t *    // Individual cell data\n\t\t *    $(document).ready(function() {\n\t\t *      oTable = $('#example').dataTable();\n\t\t *\n\t\t *      oTable.$('td').click( function () {\n\t\t *        var sData = oTable.fnGetData( this );\n\t\t *        alert( 'The cell clicked on had the value of '+sData );\n\t\t *      } );\n\t\t *    } );\n\t\t */\n\t\tthis.fnGetData = function( src, col )\n\t\t{\n\t\t\tvar api = this.api( true );\n\t\t\n\t\t\tif ( src !== undefined ) {\n\t\t\t\tvar type = src.nodeName ? src.nodeName.toLowerCase() : '';\n\t\t\n\t\t\t\treturn col !== undefined || type == 'td' || type == 'th' ?\n\t\t\t\t\tapi.cell( src, col ).data() :\n\t\t\t\t\tapi.row( src ).data() || null;\n\t\t\t}\n\t\t\n\t\t\treturn api.data().toArray();\n\t\t};\n\t\t\n\t\t\n\t\t/**\n\t\t * Get an array of the TR nodes that are used in the table's body. Note that you will\n\t\t * typically want to use the '$' API method in preference to this as it is more\n\t\t * flexible.\n\t\t *  @param {int} [iRow] Optional row index for the TR element you want\n\t\t *  @returns {array|node} If iRow is undefined, returns an array of all TR elements\n\t\t *    in the table's body, or iRow is defined, just the TR element requested.\n\t\t *  @dtopt API\n\t\t *  @deprecated Since v1.10\n\t\t *\n\t\t *  @example\n\t\t *    $(document).ready(function() {\n\t\t *      var oTable = $('#example').dataTable();\n\t\t *\n\t\t *      // Get the nodes from the table\n\t\t *      var nNodes = oTable.fnGetNodes( );\n\t\t *    } );\n\t\t */\n\t\tthis.fnGetNodes = function( iRow )\n\t\t{\n\t\t\tvar api = this.api( true );\n\t\t\n\t\t\treturn iRow !== undefined ?\n\t\t\t\tapi.row( iRow ).node() :\n\t\t\t\tapi.rows().nodes().flatten().toArray();\n\t\t};\n\t\t\n\t\t\n\t\t/**\n\t\t * Get the array indexes of a particular cell from it's DOM element\n\t\t * and column index including hidden columns\n\t\t *  @param {node} node this can either be a TR, TD or TH in the table's body\n\t\t *  @returns {int} If nNode is given as a TR, then a single index is returned, or\n\t\t *    if given as a cell, an array of [row index, column index (visible),\n\t\t *    column index (all)] is given.\n\t\t *  @dtopt API\n\t\t *  @deprecated Since v1.10\n\t\t *\n\t\t *  @example\n\t\t *    $(document).ready(function() {\n\t\t *      $('#example tbody td').click( function () {\n\t\t *        // Get the position of the current data from the node\n\t\t *        var aPos = oTable.fnGetPosition( this );\n\t\t *\n\t\t *        // Get the data array for this row\n\t\t *        var aData = oTable.fnGetData( aPos[0] );\n\t\t *\n\t\t *        // Update the data array and return the value\n\t\t *        aData[ aPos[1] ] = 'clicked';\n\t\t *        this.innerHTML = 'clicked';\n\t\t *      } );\n\t\t *\n\t\t *      // Init DataTables\n\t\t *      oTable = $('#example').dataTable();\n\t\t *    } );\n\t\t */\n\t\tthis.fnGetPosition = function( node )\n\t\t{\n\t\t\tvar api = this.api( true );\n\t\t\tvar nodeName = node.nodeName.toUpperCase();\n\t\t\n\t\t\tif ( nodeName == 'TR' ) {\n\t\t\t\treturn api.row( node ).index();\n\t\t\t}\n\t\t\telse if ( nodeName == 'TD' || nodeName == 'TH' ) {\n\t\t\t\tvar cell = api.cell( node ).index();\n\t\t\n\t\t\t\treturn [\n\t\t\t\t\tcell.row,\n\t\t\t\t\tcell.columnVisible,\n\t\t\t\t\tcell.column\n\t\t\t\t];\n\t\t\t}\n\t\t\treturn null;\n\t\t};\n\t\t\n\t\t\n\t\t/**\n\t\t * Check to see if a row is 'open' or not.\n\t\t *  @param {node} nTr the table row to check\n\t\t *  @returns {boolean} true if the row is currently open, false otherwise\n\t\t *  @dtopt API\n\t\t *  @deprecated Since v1.10\n\t\t *\n\t\t *  @example\n\t\t *    $(document).ready(function() {\n\t\t *      var oTable;\n\t\t *\n\t\t *      // 'open' an information row when a row is clicked on\n\t\t *      $('#example tbody tr').click( function () {\n\t\t *        if ( oTable.fnIsOpen(this) ) {\n\t\t *          oTable.fnClose( this );\n\t\t *        } else {\n\t\t *          oTable.fnOpen( this, \"Temporary row opened\", \"info_row\" );\n\t\t *        }\n\t\t *      } );\n\t\t *\n\t\t *      oTable = $('#example').dataTable();\n\t\t *    } );\n\t\t */\n\t\tthis.fnIsOpen = function( nTr )\n\t\t{\n\t\t\treturn this.api( true ).row( nTr ).child.isShown();\n\t\t};\n\t\t\n\t\t\n\t\t/**\n\t\t * This function will place a new row directly after a row which is currently\n\t\t * on display on the page, with the HTML contents that is passed into the\n\t\t * function. This can be used, for example, to ask for confirmation that a\n\t\t * particular record should be deleted.\n\t\t *  @param {node} nTr The table row to 'open'\n\t\t *  @param {string|node|jQuery} mHtml The HTML to put into the row\n\t\t *  @param {string} sClass Class to give the new TD cell\n\t\t *  @returns {node} The row opened. Note that if the table row passed in as the\n\t\t *    first parameter, is not found in the table, this method will silently\n\t\t *    return.\n\t\t *  @dtopt API\n\t\t *  @deprecated Since v1.10\n\t\t *\n\t\t *  @example\n\t\t *    $(document).ready(function() {\n\t\t *      var oTable;\n\t\t *\n\t\t *      // 'open' an information row when a row is clicked on\n\t\t *      $('#example tbody tr').click( function () {\n\t\t *        if ( oTable.fnIsOpen(this) ) {\n\t\t *          oTable.fnClose( this );\n\t\t *        } else {\n\t\t *          oTable.fnOpen( this, \"Temporary row opened\", \"info_row\" );\n\t\t *        }\n\t\t *      } );\n\t\t *\n\t\t *      oTable = $('#example').dataTable();\n\t\t *    } );\n\t\t */\n\t\tthis.fnOpen = function( nTr, mHtml, sClass )\n\t\t{\n\t\t\treturn this.api( true )\n\t\t\t\t.row( nTr )\n\t\t\t\t.child( mHtml, sClass )\n\t\t\t\t.show()\n\t\t\t\t.child()[0];\n\t\t};\n\t\t\n\t\t\n\t\t/**\n\t\t * Change the pagination - provides the internal logic for pagination in a simple API\n\t\t * function. With this function you can have a DataTables table go to the next,\n\t\t * previous, first or last pages.\n\t\t *  @param {string|int} mAction Paging action to take: \"first\", \"previous\", \"next\" or \"last\"\n\t\t *    or page number to jump to (integer), note that page 0 is the first page.\n\t\t *  @param {bool} [bRedraw=true] Redraw the table or not\n\t\t *  @dtopt API\n\t\t *  @deprecated Since v1.10\n\t\t *\n\t\t *  @example\n\t\t *    $(document).ready(function() {\n\t\t *      var oTable = $('#example').dataTable();\n\t\t *      oTable.fnPageChange( 'next' );\n\t\t *    } );\n\t\t */\n\t\tthis.fnPageChange = function ( mAction, bRedraw )\n\t\t{\n\t\t\tvar api = this.api( true ).page( mAction );\n\t\t\n\t\t\tif ( bRedraw === undefined || bRedraw ) {\n\t\t\t\tapi.draw(false);\n\t\t\t}\n\t\t};\n\t\t\n\t\t\n\t\t/**\n\t\t * Show a particular column\n\t\t *  @param {int} iCol The column whose display should be changed\n\t\t *  @param {bool} bShow Show (true) or hide (false) the column\n\t\t *  @param {bool} [bRedraw=true] Redraw the table or not\n\t\t *  @dtopt API\n\t\t *  @deprecated Since v1.10\n\t\t *\n\t\t *  @example\n\t\t *    $(document).ready(function() {\n\t\t *      var oTable = $('#example').dataTable();\n\t\t *\n\t\t *      // Hide the second column after initialisation\n\t\t *      oTable.fnSetColumnVis( 1, false );\n\t\t *    } );\n\t\t */\n\t\tthis.fnSetColumnVis = function ( iCol, bShow, bRedraw )\n\t\t{\n\t\t\tvar api = this.api( true ).column( iCol ).visible( bShow );\n\t\t\n\t\t\tif ( bRedraw === undefined || bRedraw ) {\n\t\t\t\tapi.columns.adjust().draw();\n\t\t\t}\n\t\t};\n\t\t\n\t\t\n\t\t/**\n\t\t * Get the settings for a particular table for external manipulation\n\t\t *  @returns {object} DataTables settings object. See\n\t\t *    {@link DataTable.models.oSettings}\n\t\t *  @dtopt API\n\t\t *  @deprecated Since v1.10\n\t\t *\n\t\t *  @example\n\t\t *    $(document).ready(function() {\n\t\t *      var oTable = $('#example').dataTable();\n\t\t *      var oSettings = oTable.fnSettings();\n\t\t *\n\t\t *      // Show an example parameter from the settings\n\t\t *      alert( oSettings._iDisplayStart );\n\t\t *    } );\n\t\t */\n\t\tthis.fnSettings = function()\n\t\t{\n\t\t\treturn _fnSettingsFromNode( this[_ext.iApiIndex] );\n\t\t};\n\t\t\n\t\t\n\t\t/**\n\t\t * Sort the table by a particular column\n\t\t *  @param {int} iCol the data index to sort on. Note that this will not match the\n\t\t *    'display index' if you have hidden data entries\n\t\t *  @dtopt API\n\t\t *  @deprecated Since v1.10\n\t\t *\n\t\t *  @example\n\t\t *    $(document).ready(function() {\n\t\t *      var oTable = $('#example').dataTable();\n\t\t *\n\t\t *      // Sort immediately with columns 0 and 1\n\t\t *      oTable.fnSort( [ [0,'asc'], [1,'asc'] ] );\n\t\t *    } );\n\t\t */\n\t\tthis.fnSort = function( aaSort )\n\t\t{\n\t\t\tthis.api( true ).order( aaSort ).draw();\n\t\t};\n\t\t\n\t\t\n\t\t/**\n\t\t * Attach a sort listener to an element for a given column\n\t\t *  @param {node} nNode the element to attach the sort listener to\n\t\t *  @param {int} iColumn the column that a click on this node will sort on\n\t\t *  @param {function} [fnCallback] callback function when sort is run\n\t\t *  @dtopt API\n\t\t *  @deprecated Since v1.10\n\t\t *\n\t\t *  @example\n\t\t *    $(document).ready(function() {\n\t\t *      var oTable = $('#example').dataTable();\n\t\t *\n\t\t *      // Sort on column 1, when 'sorter' is clicked on\n\t\t *      oTable.fnSortListener( document.getElementById('sorter'), 1 );\n\t\t *    } );\n\t\t */\n\t\tthis.fnSortListener = function( nNode, iColumn, fnCallback )\n\t\t{\n\t\t\tthis.api( true ).order.listener( nNode, iColumn, fnCallback );\n\t\t};\n\t\t\n\t\t\n\t\t/**\n\t\t * Update a table cell or row - this method will accept either a single value to\n\t\t * update the cell with, an array of values with one element for each column or\n\t\t * an object in the same format as the original data source. The function is\n\t\t * self-referencing in order to make the multi column updates easier.\n\t\t *  @param {object|array|string} mData Data to update the cell/row with\n\t\t *  @param {node|int} mRow TR element you want to update or the aoData index\n\t\t *  @param {int} [iColumn] The column to update, give as null or undefined to\n\t\t *    update a whole row.\n\t\t *  @param {bool} [bRedraw=true] Redraw the table or not\n\t\t *  @param {bool} [bAction=true] Perform pre-draw actions or not\n\t\t *  @returns {int} 0 on success, 1 on error\n\t\t *  @dtopt API\n\t\t *  @deprecated Since v1.10\n\t\t *\n\t\t *  @example\n\t\t *    $(document).ready(function() {\n\t\t *      var oTable = $('#example').dataTable();\n\t\t *      oTable.fnUpdate( 'Example update', 0, 0 ); // Single cell\n\t\t *      oTable.fnUpdate( ['a', 'b', 'c', 'd', 'e'], $('tbody tr')[0] ); // Row\n\t\t *    } );\n\t\t */\n\t\tthis.fnUpdate = function( mData, mRow, iColumn, bRedraw, bAction )\n\t\t{\n\t\t\tvar api = this.api( true );\n\t\t\n\t\t\tif ( iColumn === undefined || iColumn === null ) {\n\t\t\t\tapi.row( mRow ).data( mData );\n\t\t\t}\n\t\t\telse {\n\t\t\t\tapi.cell( mRow, iColumn ).data( mData );\n\t\t\t}\n\t\t\n\t\t\tif ( bAction === undefined || bAction ) {\n\t\t\t\tapi.columns.adjust();\n\t\t\t}\n\t\t\n\t\t\tif ( bRedraw === undefined || bRedraw ) {\n\t\t\t\tapi.draw();\n\t\t\t}\n\t\t\treturn 0;\n\t\t};\n\t\t\n\t\t\n\t\t/**\n\t\t * Provide a common method for plug-ins to check the version of DataTables being used, in order\n\t\t * to ensure compatibility.\n\t\t *  @param {string} sVersion Version string to check for, in the format \"X.Y.Z\". Note that the\n\t\t *    formats \"X\" and \"X.Y\" are also acceptable.\n\t\t *  @returns {boolean} true if this version of DataTables is greater or equal to the required\n\t\t *    version, or false if this version of DataTales is not suitable\n\t\t *  @method\n\t\t *  @dtopt API\n\t\t *  @deprecated Since v1.10\n\t\t *\n\t\t *  @example\n\t\t *    $(document).ready(function() {\n\t\t *      var oTable = $('#example').dataTable();\n\t\t *      alert( oTable.fnVersionCheck( '1.9.0' ) );\n\t\t *    } );\n\t\t */\n\t\tthis.fnVersionCheck = _ext.fnVersionCheck;\n\t\t\n\t\n\t\tvar _that = this;\n\t\tvar emptyInit = options === undefined;\n\t\tvar len = this.length;\n\t\n\t\tif ( emptyInit ) {\n\t\t\toptions = {};\n\t\t}\n\t\n\t\tthis.oApi = this.internal = _ext.internal;\n\t\n\t\t// Extend with old style plug-in API methods\n\t\tfor ( var fn in DataTable.ext.internal ) {\n\t\t\tif ( fn ) {\n\t\t\t\tthis[fn] = _fnExternApiFunc(fn);\n\t\t\t}\n\t\t}\n\t\n\t\tthis.each(function() {\n\t\t\t// For each initialisation we want to give it a clean initialisation\n\t\t\t// object that can be bashed around\n\t\t\tvar o = {};\n\t\t\tvar oInit = len > 1 ? // optimisation for single table case\n\t\t\t\t_fnExtend( o, options, true ) :\n\t\t\t\toptions;\n\t\n\t\t\t/*global oInit,_that,emptyInit*/\n\t\t\tvar i=0, iLen, j, jLen, k, kLen;\n\t\t\tvar sId = this.getAttribute( 'id' );\n\t\t\tvar bInitHandedOff = false;\n\t\t\tvar defaults = DataTable.defaults;\n\t\t\tvar $this = $(this);\n\t\t\t\n\t\t\t\n\t\t\t/* Sanity check */\n\t\t\tif ( this.nodeName.toLowerCase() != 'table' )\n\t\t\t{\n\t\t\t\t_fnLog( null, 0, 'Non-table node initialisation ('+this.nodeName+')', 2 );\n\t\t\t\treturn;\n\t\t\t}\n\t\t\t\n\t\t\t/* Backwards compatibility for the defaults */\n\t\t\t_fnCompatOpts( defaults );\n\t\t\t_fnCompatCols( defaults.column );\n\t\t\t\n\t\t\t/* Convert the camel-case defaults to Hungarian */\n\t\t\t_fnCamelToHungarian( defaults, defaults, true );\n\t\t\t_fnCamelToHungarian( defaults.column, defaults.column, true );\n\t\t\t\n\t\t\t/* Setting up the initialisation object */\n\t\t\t_fnCamelToHungarian( defaults, $.extend( oInit, $this.data() ), true );\n\t\t\t\n\t\t\t\n\t\t\t\n\t\t\t/* Check to see if we are re-initialising a table */\n\t\t\tvar allSettings = DataTable.settings;\n\t\t\tfor ( i=0, iLen=allSettings.length ; i<iLen ; i++ )\n\t\t\t{\n\t\t\t\tvar s = allSettings[i];\n\t\t\t\n\t\t\t\t/* Base check on table node */\n\t\t\t\tif (\n\t\t\t\t\ts.nTable == this ||\n\t\t\t\t\t(s.nTHead && s.nTHead.parentNode == this) ||\n\t\t\t\t\t(s.nTFoot && s.nTFoot.parentNode == this)\n\t\t\t\t) {\n\t\t\t\t\tvar bRetrieve = oInit.bRetrieve !== undefined ? oInit.bRetrieve : defaults.bRetrieve;\n\t\t\t\t\tvar bDestroy = oInit.bDestroy !== undefined ? oInit.bDestroy : defaults.bDestroy;\n\t\t\t\n\t\t\t\t\tif ( emptyInit || bRetrieve )\n\t\t\t\t\t{\n\t\t\t\t\t\treturn s.oInstance;\n\t\t\t\t\t}\n\t\t\t\t\telse if ( bDestroy )\n\t\t\t\t\t{\n\t\t\t\t\t\ts.oInstance.fnDestroy();\n\t\t\t\t\t\tbreak;\n\t\t\t\t\t}\n\t\t\t\t\telse\n\t\t\t\t\t{\n\t\t\t\t\t\t_fnLog( s, 0, 'Cannot reinitialise DataTable', 3 );\n\t\t\t\t\t\treturn;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\n\t\t\t\t/* If the element we are initialising has the same ID as a table which was previously\n\t\t\t\t * initialised, but the table nodes don't match (from before) then we destroy the old\n\t\t\t\t * instance by simply deleting it. This is under the assumption that the table has been\n\t\t\t\t * destroyed by other methods. Anyone using non-id selectors will need to do this manually\n\t\t\t\t */\n\t\t\t\tif ( s.sTableId == this.id )\n\t\t\t\t{\n\t\t\t\t\tallSettings.splice( i, 1 );\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t}\n\t\t\t\n\t\t\t/* Ensure the table has an ID - required for accessibility */\n\t\t\tif ( sId === null || sId === \"\" )\n\t\t\t{\n\t\t\t\tsId = \"DataTables_Table_\"+(DataTable.ext._unique++);\n\t\t\t\tthis.id = sId;\n\t\t\t}\n\t\t\t\n\t\t\t/* Create the settings object for this table and set some of the default parameters */\n\t\t\tvar oSettings = $.extend( true, {}, DataTable.models.oSettings, {\n\t\t\t\t\"sDestroyWidth\": $this[0].style.width,\n\t\t\t\t\"sInstance\":     sId,\n\t\t\t\t\"sTableId\":      sId\n\t\t\t} );\n\t\t\toSettings.nTable = this;\n\t\t\toSettings.oApi   = _that.internal;\n\t\t\toSettings.oInit  = oInit;\n\t\t\t\n\t\t\tallSettings.push( oSettings );\n\t\t\t\n\t\t\t// Need to add the instance after the instance after the settings object has been added\n\t\t\t// to the settings array, so we can self reference the table instance if more than one\n\t\t\toSettings.oInstance = (_that.length===1) ? _that : $this.dataTable();\n\t\t\t\n\t\t\t// Backwards compatibility, before we apply all the defaults\n\t\t\t_fnCompatOpts( oInit );\n\t\t\t_fnLanguageCompat( oInit.oLanguage );\n\t\t\t\n\t\t\t// If the length menu is given, but the init display length is not, use the length menu\n\t\t\tif ( oInit.aLengthMenu && ! oInit.iDisplayLength )\n\t\t\t{\n\t\t\t\toInit.iDisplayLength = Array.isArray( oInit.aLengthMenu[0] ) ?\n\t\t\t\t\toInit.aLengthMenu[0][0] : oInit.aLengthMenu[0];\n\t\t\t}\n\t\t\t\n\t\t\t// Apply the defaults and init options to make a single init object will all\n\t\t\t// options defined from defaults and instance options.\n\t\t\toInit = _fnExtend( $.extend( true, {}, defaults ), oInit );\n\t\t\t\n\t\t\t\n\t\t\t// Map the initialisation options onto the settings object\n\t\t\t_fnMap( oSettings.oFeatures, oInit, [\n\t\t\t\t\"bPaginate\",\n\t\t\t\t\"bLengthChange\",\n\t\t\t\t\"bFilter\",\n\t\t\t\t\"bSort\",\n\t\t\t\t\"bSortMulti\",\n\t\t\t\t\"bInfo\",\n\t\t\t\t\"bProcessing\",\n\t\t\t\t\"bAutoWidth\",\n\t\t\t\t\"bSortClasses\",\n\t\t\t\t\"bServerSide\",\n\t\t\t\t\"bDeferRender\"\n\t\t\t] );\n\t\t\t_fnMap( oSettings, oInit, [\n\t\t\t\t\"asStripeClasses\",\n\t\t\t\t\"ajax\",\n\t\t\t\t\"fnServerData\",\n\t\t\t\t\"fnFormatNumber\",\n\t\t\t\t\"sServerMethod\",\n\t\t\t\t\"aaSorting\",\n\t\t\t\t\"aaSortingFixed\",\n\t\t\t\t\"aLengthMenu\",\n\t\t\t\t\"sPaginationType\",\n\t\t\t\t\"sAjaxSource\",\n\t\t\t\t\"sAjaxDataProp\",\n\t\t\t\t\"iStateDuration\",\n\t\t\t\t\"sDom\",\n\t\t\t\t\"bSortCellsTop\",\n\t\t\t\t\"iTabIndex\",\n\t\t\t\t\"fnStateLoadCallback\",\n\t\t\t\t\"fnStateSaveCallback\",\n\t\t\t\t\"renderer\",\n\t\t\t\t\"searchDelay\",\n\t\t\t\t\"rowId\",\n\t\t\t\t[ \"iCookieDuration\", \"iStateDuration\" ], // backwards compat\n\t\t\t\t[ \"oSearch\", \"oPreviousSearch\" ],\n\t\t\t\t[ \"aoSearchCols\", \"aoPreSearchCols\" ],\n\t\t\t\t[ \"iDisplayLength\", \"_iDisplayLength\" ]\n\t\t\t] );\n\t\t\t_fnMap( oSettings.oScroll, oInit, [\n\t\t\t\t[ \"sScrollX\", \"sX\" ],\n\t\t\t\t[ \"sScrollXInner\", \"sXInner\" ],\n\t\t\t\t[ \"sScrollY\", \"sY\" ],\n\t\t\t\t[ \"bScrollCollapse\", \"bCollapse\" ]\n\t\t\t] );\n\t\t\t_fnMap( oSettings.oLanguage, oInit, \"fnInfoCallback\" );\n\t\t\t\n\t\t\t/* Callback functions which are array driven */\n\t\t\t_fnCallbackReg( oSettings, 'aoDrawCallback',       oInit.fnDrawCallback,      'user' );\n\t\t\t_fnCallbackReg( oSettings, 'aoServerParams',       oInit.fnServerParams,      'user' );\n\t\t\t_fnCallbackReg( oSettings, 'aoStateSaveParams',    oInit.fnStateSaveParams,   'user' );\n\t\t\t_fnCallbackReg( oSettings, 'aoStateLoadParams',    oInit.fnStateLoadParams,   'user' );\n\t\t\t_fnCallbackReg( oSettings, 'aoStateLoaded',        oInit.fnStateLoaded,       'user' );\n\t\t\t_fnCallbackReg( oSettings, 'aoRowCallback',        oInit.fnRowCallback,       'user' );\n\t\t\t_fnCallbackReg( oSettings, 'aoRowCreatedCallback', oInit.fnCreatedRow,        'user' );\n\t\t\t_fnCallbackReg( oSettings, 'aoHeaderCallback',     oInit.fnHeaderCallback,    'user' );\n\t\t\t_fnCallbackReg( oSettings, 'aoFooterCallback',     oInit.fnFooterCallback,    'user' );\n\t\t\t_fnCallbackReg( oSettings, 'aoInitComplete',       oInit.fnInitComplete,      'user' );\n\t\t\t_fnCallbackReg( oSettings, 'aoPreDrawCallback',    oInit.fnPreDrawCallback,   'user' );\n\t\t\t\n\t\t\toSettings.rowIdFn = _fnGetObjectDataFn( oInit.rowId );\n\t\t\t\n\t\t\t/* Browser support detection */\n\t\t\t_fnBrowserDetect( oSettings );\n\t\t\t\n\t\t\tvar oClasses = oSettings.oClasses;\n\t\t\t\n\t\t\t$.extend( oClasses, DataTable.ext.classes, oInit.oClasses );\n\t\t\t$this.addClass( oClasses.sTable );\n\t\t\t\n\t\t\t\n\t\t\tif ( oSettings.iInitDisplayStart === undefined )\n\t\t\t{\n\t\t\t\t/* Display start point, taking into account the save saving */\n\t\t\t\toSettings.iInitDisplayStart = oInit.iDisplayStart;\n\t\t\t\toSettings._iDisplayStart = oInit.iDisplayStart;\n\t\t\t}\n\t\t\t\n\t\t\tif ( oInit.iDeferLoading !== null )\n\t\t\t{\n\t\t\t\toSettings.bDeferLoading = true;\n\t\t\t\tvar tmp = Array.isArray( oInit.iDeferLoading );\n\t\t\t\toSettings._iRecordsDisplay = tmp ? oInit.iDeferLoading[0] : oInit.iDeferLoading;\n\t\t\t\toSettings._iRecordsTotal = tmp ? oInit.iDeferLoading[1] : oInit.iDeferLoading;\n\t\t\t}\n\t\t\t\n\t\t\t/* Language definitions */\n\t\t\tvar oLanguage = oSettings.oLanguage;\n\t\t\t$.extend( true, oLanguage, oInit.oLanguage );\n\t\t\t\n\t\t\tif ( oLanguage.sUrl )\n\t\t\t{\n\t\t\t\t/* Get the language definitions from a file - because this Ajax call makes the language\n\t\t\t\t * get async to the remainder of this function we use bInitHandedOff to indicate that\n\t\t\t\t * _fnInitialise will be fired by the returned Ajax handler, rather than the constructor\n\t\t\t\t */\n\t\t\t\t$.ajax( {\n\t\t\t\t\tdataType: 'json',\n\t\t\t\t\turl: oLanguage.sUrl,\n\t\t\t\t\tsuccess: function ( json ) {\n\t\t\t\t\t\t_fnCamelToHungarian( defaults.oLanguage, json );\n\t\t\t\t\t\t_fnLanguageCompat( json );\n\t\t\t\t\t\t$.extend( true, oLanguage, json );\n\t\t\t\n\t\t\t\t\t\t_fnCallbackFire( oSettings, null, 'i18n', [oSettings]);\n\t\t\t\t\t\t_fnInitialise( oSettings );\n\t\t\t\t\t},\n\t\t\t\t\terror: function () {\n\t\t\t\t\t\t// Error occurred loading language file, continue on as best we can\n\t\t\t\t\t\t_fnInitialise( oSettings );\n\t\t\t\t\t}\n\t\t\t\t} );\n\t\t\t\tbInitHandedOff = true;\n\t\t\t}\n\t\t\telse {\n\t\t\t\t_fnCallbackFire( oSettings, null, 'i18n', [oSettings]);\n\t\t\t}\n\t\t\t\n\t\t\t/*\n\t\t\t * Stripes\n\t\t\t */\n\t\t\tif ( oInit.asStripeClasses === null )\n\t\t\t{\n\t\t\t\toSettings.asStripeClasses =[\n\t\t\t\t\toClasses.sStripeOdd,\n\t\t\t\t\toClasses.sStripeEven\n\t\t\t\t];\n\t\t\t}\n\t\t\t\n\t\t\t/* Remove row stripe classes if they are already on the table row */\n\t\t\tvar stripeClasses = oSettings.asStripeClasses;\n\t\t\tvar rowOne = $this.children('tbody').find('tr').eq(0);\n\t\t\tif ( $.inArray( true, $.map( stripeClasses, function(el, i) {\n\t\t\t\treturn rowOne.hasClass(el);\n\t\t\t} ) ) !== -1 ) {\n\t\t\t\t$('tbody tr', this).removeClass( stripeClasses.join(' ') );\n\t\t\t\toSettings.asDestroyStripes = stripeClasses.slice();\n\t\t\t}\n\t\t\t\n\t\t\t/*\n\t\t\t * Columns\n\t\t\t * See if we should load columns automatically or use defined ones\n\t\t\t */\n\t\t\tvar anThs = [];\n\t\t\tvar aoColumnsInit;\n\t\t\tvar nThead = this.getElementsByTagName('thead');\n\t\t\tif ( nThead.length !== 0 )\n\t\t\t{\n\t\t\t\t_fnDetectHeader( oSettings.aoHeader, nThead[0] );\n\t\t\t\tanThs = _fnGetUniqueThs( oSettings );\n\t\t\t}\n\t\t\t\n\t\t\t/* If not given a column array, generate one with nulls */\n\t\t\tif ( oInit.aoColumns === null )\n\t\t\t{\n\t\t\t\taoColumnsInit = [];\n\t\t\t\tfor ( i=0, iLen=anThs.length ; i<iLen ; i++ )\n\t\t\t\t{\n\t\t\t\t\taoColumnsInit.push( null );\n\t\t\t\t}\n\t\t\t}\n\t\t\telse\n\t\t\t{\n\t\t\t\taoColumnsInit = oInit.aoColumns;\n\t\t\t}\n\t\t\t\n\t\t\t/* Add the columns */\n\t\t\tfor ( i=0, iLen=aoColumnsInit.length ; i<iLen ; i++ )\n\t\t\t{\n\t\t\t\t_fnAddColumn( oSettings, anThs ? anThs[i] : null );\n\t\t\t}\n\t\t\t\n\t\t\t/* Apply the column definitions */\n\t\t\t_fnApplyColumnDefs( oSettings, oInit.aoColumnDefs, aoColumnsInit, function (iCol, oDef) {\n\t\t\t\t_fnColumnOptions( oSettings, iCol, oDef );\n\t\t\t} );\n\t\t\t\n\t\t\t/* HTML5 attribute detection - build an mData object automatically if the\n\t\t\t * attributes are found\n\t\t\t */\n\t\t\tif ( rowOne.length ) {\n\t\t\t\tvar a = function ( cell, name ) {\n\t\t\t\t\treturn cell.getAttribute( 'data-'+name ) !== null ? name : null;\n\t\t\t\t};\n\t\t\t\n\t\t\t\t$( rowOne[0] ).children('th, td').each( function (i, cell) {\n\t\t\t\t\tvar col = oSettings.aoColumns[i];\n\t\t\t\n\t\t\t\t\tif ( col.mData === i ) {\n\t\t\t\t\t\tvar sort = a( cell, 'sort' ) || a( cell, 'order' );\n\t\t\t\t\t\tvar filter = a( cell, 'filter' ) || a( cell, 'search' );\n\t\t\t\n\t\t\t\t\t\tif ( sort !== null || filter !== null ) {\n\t\t\t\t\t\t\tcol.mData = {\n\t\t\t\t\t\t\t\t_:      i+'.display',\n\t\t\t\t\t\t\t\tsort:   sort !== null   ? i+'.@data-'+sort   : undefined,\n\t\t\t\t\t\t\t\ttype:   sort !== null   ? i+'.@data-'+sort   : undefined,\n\t\t\t\t\t\t\t\tfilter: filter !== null ? i+'.@data-'+filter : undefined\n\t\t\t\t\t\t\t};\n\t\t\t\n\t\t\t\t\t\t\t_fnColumnOptions( oSettings, i );\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t} );\n\t\t\t}\n\t\t\t\n\t\t\tvar features = oSettings.oFeatures;\n\t\t\tvar loadedInit = function () {\n\t\t\t\t/*\n\t\t\t\t * Sorting\n\t\t\t\t * @todo For modularisation (1.11) this needs to do into a sort start up handler\n\t\t\t\t */\n\t\t\t\n\t\t\t\t// If aaSorting is not defined, then we use the first indicator in asSorting\n\t\t\t\t// in case that has been altered, so the default sort reflects that option\n\t\t\t\tif ( oInit.aaSorting === undefined ) {\n\t\t\t\t\tvar sorting = oSettings.aaSorting;\n\t\t\t\t\tfor ( i=0, iLen=sorting.length ; i<iLen ; i++ ) {\n\t\t\t\t\t\tsorting[i][1] = oSettings.aoColumns[ i ].asSorting[0];\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\n\t\t\t\t/* Do a first pass on the sorting classes (allows any size changes to be taken into\n\t\t\t\t * account, and also will apply sorting disabled classes if disabled\n\t\t\t\t */\n\t\t\t\t_fnSortingClasses( oSettings );\n\t\t\t\n\t\t\t\tif ( features.bSort ) {\n\t\t\t\t\t_fnCallbackReg( oSettings, 'aoDrawCallback', function () {\n\t\t\t\t\t\tif ( oSettings.bSorted ) {\n\t\t\t\t\t\t\tvar aSort = _fnSortFlatten( oSettings );\n\t\t\t\t\t\t\tvar sortedColumns = {};\n\t\t\t\n\t\t\t\t\t\t\t$.each( aSort, function (i, val) {\n\t\t\t\t\t\t\t\tsortedColumns[ val.src ] = val.dir;\n\t\t\t\t\t\t\t} );\n\t\t\t\n\t\t\t\t\t\t\t_fnCallbackFire( oSettings, null, 'order', [oSettings, aSort, sortedColumns] );\n\t\t\t\t\t\t\t_fnSortAria( oSettings );\n\t\t\t\t\t\t}\n\t\t\t\t\t} );\n\t\t\t\t}\n\t\t\t\n\t\t\t\t_fnCallbackReg( oSettings, 'aoDrawCallback', function () {\n\t\t\t\t\tif ( oSettings.bSorted || _fnDataSource( oSettings ) === 'ssp' || features.bDeferRender ) {\n\t\t\t\t\t\t_fnSortingClasses( oSettings );\n\t\t\t\t\t}\n\t\t\t\t}, 'sc' );\n\t\t\t\n\t\t\t\n\t\t\t\t/*\n\t\t\t\t * Final init\n\t\t\t\t * Cache the header, body and footer as required, creating them if needed\n\t\t\t\t */\n\t\t\t\n\t\t\t\t// Work around for Webkit bug 83867 - store the caption-side before removing from doc\n\t\t\t\tvar captions = $this.children('caption').each( function () {\n\t\t\t\t\tthis._captionSide = $(this).css('caption-side');\n\t\t\t\t} );\n\t\t\t\n\t\t\t\tvar thead = $this.children('thead');\n\t\t\t\tif ( thead.length === 0 ) {\n\t\t\t\t\tthead = $('<thead/>').appendTo($this);\n\t\t\t\t}\n\t\t\t\toSettings.nTHead = thead[0];\n\t\t\t\n\t\t\t\tvar tbody = $this.children('tbody');\n\t\t\t\tif ( tbody.length === 0 ) {\n\t\t\t\t\ttbody = $('<tbody/>').insertAfter(thead);\n\t\t\t\t}\n\t\t\t\toSettings.nTBody = tbody[0];\n\t\t\t\n\t\t\t\tvar tfoot = $this.children('tfoot');\n\t\t\t\tif ( tfoot.length === 0 && captions.length > 0 && (oSettings.oScroll.sX !== \"\" || oSettings.oScroll.sY !== \"\") ) {\n\t\t\t\t\t// If we are a scrolling table, and no footer has been given, then we need to create\n\t\t\t\t\t// a tfoot element for the caption element to be appended to\n\t\t\t\t\ttfoot = $('<tfoot/>').appendTo($this);\n\t\t\t\t}\n\t\t\t\n\t\t\t\tif ( tfoot.length === 0 || tfoot.children().length === 0 ) {\n\t\t\t\t\t$this.addClass( oClasses.sNoFooter );\n\t\t\t\t}\n\t\t\t\telse if ( tfoot.length > 0 ) {\n\t\t\t\t\toSettings.nTFoot = tfoot[0];\n\t\t\t\t\t_fnDetectHeader( oSettings.aoFooter, oSettings.nTFoot );\n\t\t\t\t}\n\t\t\t\n\t\t\t\t/* Check if there is data passing into the constructor */\n\t\t\t\tif ( oInit.aaData ) {\n\t\t\t\t\tfor ( i=0 ; i<oInit.aaData.length ; i++ ) {\n\t\t\t\t\t\t_fnAddData( oSettings, oInit.aaData[ i ] );\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\telse if ( oSettings.bDeferLoading || _fnDataSource( oSettings ) == 'dom' ) {\n\t\t\t\t\t/* Grab the data from the page - only do this when deferred loading or no Ajax\n\t\t\t\t\t * source since there is no point in reading the DOM data if we are then going\n\t\t\t\t\t * to replace it with Ajax data\n\t\t\t\t\t */\n\t\t\t\t\t_fnAddTr( oSettings, $(oSettings.nTBody).children('tr') );\n\t\t\t\t}\n\t\t\t\n\t\t\t\t/* Copy the data index array */\n\t\t\t\toSettings.aiDisplay = oSettings.aiDisplayMaster.slice();\n\t\t\t\n\t\t\t\t/* Initialisation complete - table can be drawn */\n\t\t\t\toSettings.bInitialised = true;\n\t\t\t\n\t\t\t\t/* Check if we need to initialise the table (it might not have been handed off to the\n\t\t\t\t * language processor)\n\t\t\t\t */\n\t\t\t\tif ( bInitHandedOff === false ) {\n\t\t\t\t\t_fnInitialise( oSettings );\n\t\t\t\t}\n\t\t\t};\n\t\t\t\n\t\t\t/* Must be done after everything which can be overridden by the state saving! */\n\t\t\t_fnCallbackReg( oSettings, 'aoDrawCallback', _fnSaveState, 'state_save' );\n\t\t\t\n\t\t\tif ( oInit.bStateSave )\n\t\t\t{\n\t\t\t\tfeatures.bStateSave = true;\n\t\t\t\t_fnLoadState( oSettings, oInit, loadedInit );\n\t\t\t}\n\t\t\telse {\n\t\t\t\tloadedInit();\n\t\t\t}\n\t\t\t\n\t\t} );\n\t\t_that = null;\n\t\treturn this;\n\t};\n\t\n\t\n\t/*\n\t * It is useful to have variables which are scoped locally so only the\n\t * DataTables functions can access them and they don't leak into global space.\n\t * At the same time these functions are often useful over multiple files in the\n\t * core and API, so we list, or at least document, all variables which are used\n\t * by DataTables as private variables here. This also ensures that there is no\n\t * clashing of variable names and that they can easily referenced for reuse.\n\t */\n\t\n\t\n\t// Defined else where\n\t//  _selector_run\n\t//  _selector_opts\n\t//  _selector_first\n\t//  _selector_row_indexes\n\t\n\tvar _ext; // DataTable.ext\n\tvar _Api; // DataTable.Api\n\tvar _api_register; // DataTable.Api.register\n\tvar _api_registerPlural; // DataTable.Api.registerPlural\n\t\n\tvar _re_dic = {};\n\tvar _re_new_lines = /[\\r\\n\\u2028]/g;\n\tvar _re_html = /<.*?>/g;\n\t\n\t// This is not strict ISO8601 - Date.parse() is quite lax, although\n\t// implementations differ between browsers.\n\tvar _re_date = /^\\d{2,4}[\\.\\/\\-]\\d{1,2}[\\.\\/\\-]\\d{1,2}([T ]{1}\\d{1,2}[:\\.]\\d{2}([\\.:]\\d{2})?)?$/;\n\t\n\t// Escape regular expression special characters\n\tvar _re_escape_regex = new RegExp( '(\\\\' + [ '/', '.', '*', '+', '?', '|', '(', ')', '[', ']', '{', '}', '\\\\', '$', '^', '-' ].join('|\\\\') + ')', 'g' );\n\t\n\t// http://en.wikipedia.org/wiki/Foreign_exchange_market\n\t// - \\u20BD - Russian ruble.\n\t// - \\u20a9 - South Korean Won\n\t// - \\u20BA - Turkish Lira\n\t// - \\u20B9 - Indian Rupee\n\t// - R - Brazil (R$) and South Africa\n\t// - fr - Swiss Franc\n\t// - kr - Swedish krona, Norwegian krone and Danish krone\n\t// - \\u2009 is thin space and \\u202F is narrow no-break space, both used in many\n\t// - Ƀ - Bitcoin\n\t// - Ξ - Ethereum\n\t//   standards as thousands separators.\n\tvar _re_formatted_numeric = /['\\u00A0,$£€¥%\\u2009\\u202F\\u20BD\\u20a9\\u20BArfkɃΞ]/gi;\n\t\n\t\n\tvar _empty = function ( d ) {\n\t\treturn !d || d === true || d === '-' ? true : false;\n\t};\n\t\n\t\n\tvar _intVal = function ( s ) {\n\t\tvar integer = parseInt( s, 10 );\n\t\treturn !isNaN(integer) && isFinite(s) ? integer : null;\n\t};\n\t\n\t// Convert from a formatted number with characters other than `.` as the\n\t// decimal place, to a Javascript number\n\tvar _numToDecimal = function ( num, decimalPoint ) {\n\t\t// Cache created regular expressions for speed as this function is called often\n\t\tif ( ! _re_dic[ decimalPoint ] ) {\n\t\t\t_re_dic[ decimalPoint ] = new RegExp( _fnEscapeRegex( decimalPoint ), 'g' );\n\t\t}\n\t\treturn typeof num === 'string' && decimalPoint !== '.' ?\n\t\t\tnum.replace( /\\./g, '' ).replace( _re_dic[ decimalPoint ], '.' ) :\n\t\t\tnum;\n\t};\n\t\n\t\n\tvar _isNumber = function ( d, decimalPoint, formatted ) {\n\t\tvar strType = typeof d === 'string';\n\t\n\t\t// If empty return immediately so there must be a number if it is a\n\t\t// formatted string (this stops the string \"k\", or \"kr\", etc being detected\n\t\t// as a formatted number for currency\n\t\tif ( _empty( d ) ) {\n\t\t\treturn true;\n\t\t}\n\t\n\t\tif ( decimalPoint && strType ) {\n\t\t\td = _numToDecimal( d, decimalPoint );\n\t\t}\n\t\n\t\tif ( formatted && strType ) {\n\t\t\td = d.replace( _re_formatted_numeric, '' );\n\t\t}\n\t\n\t\treturn !isNaN( parseFloat(d) ) && isFinite( d );\n\t};\n\t\n\t\n\t// A string without HTML in it can be considered to be HTML still\n\tvar _isHtml = function ( d ) {\n\t\treturn _empty( d ) || typeof d === 'string';\n\t};\n\t\n\t\n\tvar _htmlNumeric = function ( d, decimalPoint, formatted ) {\n\t\tif ( _empty( d ) ) {\n\t\t\treturn true;\n\t\t}\n\t\n\t\tvar html = _isHtml( d );\n\t\treturn ! html ?\n\t\t\tnull :\n\t\t\t_isNumber( _stripHtml( d ), decimalPoint, formatted ) ?\n\t\t\t\ttrue :\n\t\t\t\tnull;\n\t};\n\t\n\t\n\tvar _pluck = function ( a, prop, prop2 ) {\n\t\tvar out = [];\n\t\tvar i=0, ien=a.length;\n\t\n\t\t// Could have the test in the loop for slightly smaller code, but speed\n\t\t// is essential here\n\t\tif ( prop2 !== undefined ) {\n\t\t\tfor ( ; i<ien ; i++ ) {\n\t\t\t\tif ( a[i] && a[i][ prop ] ) {\n\t\t\t\t\tout.push( a[i][ prop ][ prop2 ] );\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\telse {\n\t\t\tfor ( ; i<ien ; i++ ) {\n\t\t\t\tif ( a[i] ) {\n\t\t\t\t\tout.push( a[i][ prop ] );\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\n\t\treturn out;\n\t};\n\t\n\t\n\t// Basically the same as _pluck, but rather than looping over `a` we use `order`\n\t// as the indexes to pick from `a`\n\tvar _pluck_order = function ( a, order, prop, prop2 )\n\t{\n\t\tvar out = [];\n\t\tvar i=0, ien=order.length;\n\t\n\t\t// Could have the test in the loop for slightly smaller code, but speed\n\t\t// is essential here\n\t\tif ( prop2 !== undefined ) {\n\t\t\tfor ( ; i<ien ; i++ ) {\n\t\t\t\tif ( a[ order[i] ][ prop ] ) {\n\t\t\t\t\tout.push( a[ order[i] ][ prop ][ prop2 ] );\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\telse {\n\t\t\tfor ( ; i<ien ; i++ ) {\n\t\t\t\tout.push( a[ order[i] ][ prop ] );\n\t\t\t}\n\t\t}\n\t\n\t\treturn out;\n\t};\n\t\n\t\n\tvar _range = function ( len, start )\n\t{\n\t\tvar out = [];\n\t\tvar end;\n\t\n\t\tif ( start === undefined ) {\n\t\t\tstart = 0;\n\t\t\tend = len;\n\t\t}\n\t\telse {\n\t\t\tend = start;\n\t\t\tstart = len;\n\t\t}\n\t\n\t\tfor ( var i=start ; i<end ; i++ ) {\n\t\t\tout.push( i );\n\t\t}\n\t\n\t\treturn out;\n\t};\n\t\n\t\n\tvar _removeEmpty = function ( a )\n\t{\n\t\tvar out = [];\n\t\n\t\tfor ( var i=0, ien=a.length ; i<ien ; i++ ) {\n\t\t\tif ( a[i] ) { // careful - will remove all falsy values!\n\t\t\t\tout.push( a[i] );\n\t\t\t}\n\t\t}\n\t\n\t\treturn out;\n\t};\n\t\n\t\n\tvar _stripHtml = function ( d ) {\n\t\treturn d.replace( _re_html, '' );\n\t};\n\t\n\t\n\t/**\n\t * Determine if all values in the array are unique. This means we can short\n\t * cut the _unique method at the cost of a single loop. A sorted array is used\n\t * to easily check the values.\n\t *\n\t * @param  {array} src Source array\n\t * @return {boolean} true if all unique, false otherwise\n\t * @ignore\n\t */\n\tvar _areAllUnique = function ( src ) {\n\t\tif ( src.length < 2 ) {\n\t\t\treturn true;\n\t\t}\n\t\n\t\tvar sorted = src.slice().sort();\n\t\tvar last = sorted[0];\n\t\n\t\tfor ( var i=1, ien=sorted.length ; i<ien ; i++ ) {\n\t\t\tif ( sorted[i] === last ) {\n\t\t\t\treturn false;\n\t\t\t}\n\t\n\t\t\tlast = sorted[i];\n\t\t}\n\t\n\t\treturn true;\n\t};\n\t\n\t\n\t/**\n\t * Find the unique elements in a source array.\n\t *\n\t * @param  {array} src Source array\n\t * @return {array} Array of unique items\n\t * @ignore\n\t */\n\tvar _unique = function ( src )\n\t{\n\t\tif ( _areAllUnique( src ) ) {\n\t\t\treturn src.slice();\n\t\t}\n\t\n\t\t// A faster unique method is to use object keys to identify used values,\n\t\t// but this doesn't work with arrays or objects, which we must also\n\t\t// consider. See jsperf.com/compare-array-unique-versions/4 for more\n\t\t// information.\n\t\tvar\n\t\t\tout = [],\n\t\t\tval,\n\t\t\ti, ien=src.length,\n\t\t\tj, k=0;\n\t\n\t\tagain: for ( i=0 ; i<ien ; i++ ) {\n\t\t\tval = src[i];\n\t\n\t\t\tfor ( j=0 ; j<k ; j++ ) {\n\t\t\t\tif ( out[j] === val ) {\n\t\t\t\t\tcontinue again;\n\t\t\t\t}\n\t\t\t}\n\t\n\t\t\tout.push( val );\n\t\t\tk++;\n\t\t}\n\t\n\t\treturn out;\n\t};\n\t\n\t// Surprisingly this is faster than [].concat.apply\n\t// https://jsperf.com/flatten-an-array-loop-vs-reduce/2\n\tvar _flatten = function (out, val) {\n\t\tif (Array.isArray(val)) {\n\t\t\tfor (var i=0 ; i<val.length ; i++) {\n\t\t\t\t_flatten(out, val[i]);\n\t\t\t}\n\t\t}\n\t\telse {\n\t\t\tout.push(val);\n\t\t}\n\t  \n\t\treturn out;\n\t}\n\t\n\tvar _includes = function (search, start) {\n\t\tif (start === undefined) {\n\t\t\tstart = 0;\n\t\t}\n\t\n\t\treturn this.indexOf(search, start) !== -1;\t\n\t};\n\t\n\t// Array.isArray polyfill.\n\t// https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/isArray\n\tif (! Array.isArray) {\n\t    Array.isArray = function(arg) {\n\t        return Object.prototype.toString.call(arg) === '[object Array]';\n\t    };\n\t}\n\t\n\tif (! Array.prototype.includes) {\n\t\tArray.prototype.includes = _includes;\n\t}\n\t\n\t// .trim() polyfill\n\t// https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/String/trim\n\tif (!String.prototype.trim) {\n\t  String.prototype.trim = function () {\n\t    return this.replace(/^[\\s\\uFEFF\\xA0]+|[\\s\\uFEFF\\xA0]+$/g, '');\n\t  };\n\t}\n\t\n\tif (! String.prototype.includes) {\n\t\tString.prototype.includes = _includes;\n\t}\n\t\n\t/**\n\t * DataTables utility methods\n\t * \n\t * This namespace provides helper methods that DataTables uses internally to\n\t * create a DataTable, but which are not exclusively used only for DataTables.\n\t * These methods can be used by extension authors to save the duplication of\n\t * code.\n\t *\n\t *  @namespace\n\t */\n\tDataTable.util = {\n\t\t/**\n\t\t * Throttle the calls to a function. Arguments and context are maintained\n\t\t * for the throttled function.\n\t\t *\n\t\t * @param {function} fn Function to be called\n\t\t * @param {integer} freq Call frequency in mS\n\t\t * @return {function} Wrapped function\n\t\t */\n\t\tthrottle: function ( fn, freq ) {\n\t\t\tvar\n\t\t\t\tfrequency = freq !== undefined ? freq : 200,\n\t\t\t\tlast,\n\t\t\t\ttimer;\n\t\n\t\t\treturn function () {\n\t\t\t\tvar\n\t\t\t\t\tthat = this,\n\t\t\t\t\tnow  = +new Date(),\n\t\t\t\t\targs = arguments;\n\t\n\t\t\t\tif ( last && now < last + frequency ) {\n\t\t\t\t\tclearTimeout( timer );\n\t\n\t\t\t\t\ttimer = setTimeout( function () {\n\t\t\t\t\t\tlast = undefined;\n\t\t\t\t\t\tfn.apply( that, args );\n\t\t\t\t\t}, frequency );\n\t\t\t\t}\n\t\t\t\telse {\n\t\t\t\t\tlast = now;\n\t\t\t\t\tfn.apply( that, args );\n\t\t\t\t}\n\t\t\t};\n\t\t},\n\t\n\t\n\t\t/**\n\t\t * Escape a string such that it can be used in a regular expression\n\t\t *\n\t\t *  @param {string} val string to escape\n\t\t *  @returns {string} escaped string\n\t\t */\n\t\tescapeRegex: function ( val ) {\n\t\t\treturn val.replace( _re_escape_regex, '\\\\$1' );\n\t\t},\n\t\n\t\t/**\n\t\t * Create a function that will write to a nested object or array\n\t\t * @param {*} source JSON notation string\n\t\t * @returns Write function\n\t\t */\n\t\tset: function ( source ) {\n\t\t\tif ( $.isPlainObject( source ) ) {\n\t\t\t\t/* Unlike get, only the underscore (global) option is used for for\n\t\t\t\t * setting data since we don't know the type here. This is why an object\n\t\t\t\t * option is not documented for `mData` (which is read/write), but it is\n\t\t\t\t * for `mRender` which is read only.\n\t\t\t\t */\n\t\t\t\treturn DataTable.util.set( source._ );\n\t\t\t}\n\t\t\telse if ( source === null ) {\n\t\t\t\t// Nothing to do when the data source is null\n\t\t\t\treturn function () {};\n\t\t\t}\n\t\t\telse if ( typeof source === 'function' ) {\n\t\t\t\treturn function (data, val, meta) {\n\t\t\t\t\tsource( data, 'set', val, meta );\n\t\t\t\t};\n\t\t\t}\n\t\t\telse if ( typeof source === 'string' && (source.indexOf('.') !== -1 ||\n\t\t\t\t\t  source.indexOf('[') !== -1 || source.indexOf('(') !== -1) )\n\t\t\t{\n\t\t\t\t// Like the get, we need to get data from a nested object\n\t\t\t\tvar setData = function (data, val, src) {\n\t\t\t\t\tvar a = _fnSplitObjNotation( src ), b;\n\t\t\t\t\tvar aLast = a[a.length-1];\n\t\t\t\t\tvar arrayNotation, funcNotation, o, innerSrc;\n\t\t\n\t\t\t\t\tfor ( var i=0, iLen=a.length-1 ; i<iLen ; i++ ) {\n\t\t\t\t\t\t// Protect against prototype pollution\n\t\t\t\t\t\tif (a[i] === '__proto__' || a[i] === 'constructor') {\n\t\t\t\t\t\t\tthrow new Error('Cannot set prototype values');\n\t\t\t\t\t\t}\n\t\t\n\t\t\t\t\t\t// Check if we are dealing with an array notation request\n\t\t\t\t\t\tarrayNotation = a[i].match(__reArray);\n\t\t\t\t\t\tfuncNotation = a[i].match(__reFn);\n\t\t\n\t\t\t\t\t\tif ( arrayNotation ) {\n\t\t\t\t\t\t\ta[i] = a[i].replace(__reArray, '');\n\t\t\t\t\t\t\tdata[ a[i] ] = [];\n\t\t\n\t\t\t\t\t\t\t// Get the remainder of the nested object to set so we can recurse\n\t\t\t\t\t\t\tb = a.slice();\n\t\t\t\t\t\t\tb.splice( 0, i+1 );\n\t\t\t\t\t\t\tinnerSrc = b.join('.');\n\t\t\n\t\t\t\t\t\t\t// Traverse each entry in the array setting the properties requested\n\t\t\t\t\t\t\tif ( Array.isArray( val ) ) {\n\t\t\t\t\t\t\t\tfor ( var j=0, jLen=val.length ; j<jLen ; j++ ) {\n\t\t\t\t\t\t\t\t\to = {};\n\t\t\t\t\t\t\t\t\tsetData( o, val[j], innerSrc );\n\t\t\t\t\t\t\t\t\tdata[ a[i] ].push( o );\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\telse {\n\t\t\t\t\t\t\t\t// We've been asked to save data to an array, but it\n\t\t\t\t\t\t\t\t// isn't array data to be saved. Best that can be done\n\t\t\t\t\t\t\t\t// is to just save the value.\n\t\t\t\t\t\t\t\tdata[ a[i] ] = val;\n\t\t\t\t\t\t\t}\n\t\t\n\t\t\t\t\t\t\t// The inner call to setData has already traversed through the remainder\n\t\t\t\t\t\t\t// of the source and has set the data, thus we can exit here\n\t\t\t\t\t\t\treturn;\n\t\t\t\t\t\t}\n\t\t\t\t\t\telse if ( funcNotation ) {\n\t\t\t\t\t\t\t// Function call\n\t\t\t\t\t\t\ta[i] = a[i].replace(__reFn, '');\n\t\t\t\t\t\t\tdata = data[ a[i] ]( val );\n\t\t\t\t\t\t}\n\t\t\n\t\t\t\t\t\t// If the nested object doesn't currently exist - since we are\n\t\t\t\t\t\t// trying to set the value - create it\n\t\t\t\t\t\tif ( data[ a[i] ] === null || data[ a[i] ] === undefined ) {\n\t\t\t\t\t\t\tdata[ a[i] ] = {};\n\t\t\t\t\t\t}\n\t\t\t\t\t\tdata = data[ a[i] ];\n\t\t\t\t\t}\n\t\t\n\t\t\t\t\t// Last item in the input - i.e, the actual set\n\t\t\t\t\tif ( aLast.match(__reFn ) ) {\n\t\t\t\t\t\t// Function call\n\t\t\t\t\t\tdata = data[ aLast.replace(__reFn, '') ]( val );\n\t\t\t\t\t}\n\t\t\t\t\telse {\n\t\t\t\t\t\t// If array notation is used, we just want to strip it and use the property name\n\t\t\t\t\t\t// and assign the value. If it isn't used, then we get the result we want anyway\n\t\t\t\t\t\tdata[ aLast.replace(__reArray, '') ] = val;\n\t\t\t\t\t}\n\t\t\t\t};\n\t\t\n\t\t\t\treturn function (data, val) { // meta is also passed in, but not used\n\t\t\t\t\treturn setData( data, val, source );\n\t\t\t\t};\n\t\t\t}\n\t\t\telse {\n\t\t\t\t// Array or flat object mapping\n\t\t\t\treturn function (data, val) { // meta is also passed in, but not used\n\t\t\t\t\tdata[source] = val;\n\t\t\t\t};\n\t\t\t}\n\t\t},\n\t\n\t\t/**\n\t\t * Create a function that will read nested objects from arrays, based on JSON notation\n\t\t * @param {*} source JSON notation string\n\t\t * @returns Value read\n\t\t */\n\t\tget: function ( source ) {\n\t\t\tif ( $.isPlainObject( source ) ) {\n\t\t\t\t// Build an object of get functions, and wrap them in a single call\n\t\t\t\tvar o = {};\n\t\t\t\t$.each( source, function (key, val) {\n\t\t\t\t\tif ( val ) {\n\t\t\t\t\t\to[key] = DataTable.util.get( val );\n\t\t\t\t\t}\n\t\t\t\t} );\n\t\t\n\t\t\t\treturn function (data, type, row, meta) {\n\t\t\t\t\tvar t = o[type] || o._;\n\t\t\t\t\treturn t !== undefined ?\n\t\t\t\t\t\tt(data, type, row, meta) :\n\t\t\t\t\t\tdata;\n\t\t\t\t};\n\t\t\t}\n\t\t\telse if ( source === null ) {\n\t\t\t\t// Give an empty string for rendering / sorting etc\n\t\t\t\treturn function (data) { // type, row and meta also passed, but not used\n\t\t\t\t\treturn data;\n\t\t\t\t};\n\t\t\t}\n\t\t\telse if ( typeof source === 'function' ) {\n\t\t\t\treturn function (data, type, row, meta) {\n\t\t\t\t\treturn source( data, type, row, meta );\n\t\t\t\t};\n\t\t\t}\n\t\t\telse if ( typeof source === 'string' && (source.indexOf('.') !== -1 ||\n\t\t\t\t\t  source.indexOf('[') !== -1 || source.indexOf('(') !== -1) )\n\t\t\t{\n\t\t\t\t/* If there is a . in the source string then the data source is in a\n\t\t\t\t * nested object so we loop over the data for each level to get the next\n\t\t\t\t * level down. On each loop we test for undefined, and if found immediately\n\t\t\t\t * return. This allows entire objects to be missing and sDefaultContent to\n\t\t\t\t * be used if defined, rather than throwing an error\n\t\t\t\t */\n\t\t\t\tvar fetchData = function (data, type, src) {\n\t\t\t\t\tvar arrayNotation, funcNotation, out, innerSrc;\n\t\t\n\t\t\t\t\tif ( src !== \"\" ) {\n\t\t\t\t\t\tvar a = _fnSplitObjNotation( src );\n\t\t\n\t\t\t\t\t\tfor ( var i=0, iLen=a.length ; i<iLen ; i++ ) {\n\t\t\t\t\t\t\t// Check if we are dealing with special notation\n\t\t\t\t\t\t\tarrayNotation = a[i].match(__reArray);\n\t\t\t\t\t\t\tfuncNotation = a[i].match(__reFn);\n\t\t\n\t\t\t\t\t\t\tif ( arrayNotation ) {\n\t\t\t\t\t\t\t\t// Array notation\n\t\t\t\t\t\t\t\ta[i] = a[i].replace(__reArray, '');\n\t\t\n\t\t\t\t\t\t\t\t// Condition allows simply [] to be passed in\n\t\t\t\t\t\t\t\tif ( a[i] !== \"\" ) {\n\t\t\t\t\t\t\t\t\tdata = data[ a[i] ];\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\tout = [];\n\t\t\n\t\t\t\t\t\t\t\t// Get the remainder of the nested object to get\n\t\t\t\t\t\t\t\ta.splice( 0, i+1 );\n\t\t\t\t\t\t\t\tinnerSrc = a.join('.');\n\t\t\n\t\t\t\t\t\t\t\t// Traverse each entry in the array getting the properties requested\n\t\t\t\t\t\t\t\tif ( Array.isArray( data ) ) {\n\t\t\t\t\t\t\t\t\tfor ( var j=0, jLen=data.length ; j<jLen ; j++ ) {\n\t\t\t\t\t\t\t\t\t\tout.push( fetchData( data[j], type, innerSrc ) );\n\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t}\n\t\t\n\t\t\t\t\t\t\t\t// If a string is given in between the array notation indicators, that\n\t\t\t\t\t\t\t\t// is used to join the strings together, otherwise an array is returned\n\t\t\t\t\t\t\t\tvar join = arrayNotation[0].substring(1, arrayNotation[0].length-1);\n\t\t\t\t\t\t\t\tdata = (join===\"\") ? out : out.join(join);\n\t\t\n\t\t\t\t\t\t\t\t// The inner call to fetchData has already traversed through the remainder\n\t\t\t\t\t\t\t\t// of the source requested, so we exit from the loop\n\t\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\telse if ( funcNotation ) {\n\t\t\t\t\t\t\t\t// Function call\n\t\t\t\t\t\t\t\ta[i] = a[i].replace(__reFn, '');\n\t\t\t\t\t\t\t\tdata = data[ a[i] ]();\n\t\t\t\t\t\t\t\tcontinue;\n\t\t\t\t\t\t\t}\n\t\t\n\t\t\t\t\t\t\tif ( data === null || data[ a[i] ] === undefined ) {\n\t\t\t\t\t\t\t\treturn undefined;\n\t\t\t\t\t\t\t}\n\t\n\t\t\t\t\t\t\tdata = data[ a[i] ];\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\n\t\t\t\t\treturn data;\n\t\t\t\t};\n\t\t\n\t\t\t\treturn function (data, type) { // row and meta also passed, but not used\n\t\t\t\t\treturn fetchData( data, type, source );\n\t\t\t\t};\n\t\t\t}\n\t\t\telse {\n\t\t\t\t// Array or flat object mapping\n\t\t\t\treturn function (data, type) { // row and meta also passed, but not used\n\t\t\t\t\treturn data[source];\n\t\t\t\t};\n\t\t\t}\n\t\t}\n\t};\n\t\n\t\n\t\n\t/**\n\t * Create a mapping object that allows camel case parameters to be looked up\n\t * for their Hungarian counterparts. The mapping is stored in a private\n\t * parameter called `_hungarianMap` which can be accessed on the source object.\n\t *  @param {object} o\n\t *  @memberof DataTable#oApi\n\t */\n\tfunction _fnHungarianMap ( o )\n\t{\n\t\tvar\n\t\t\thungarian = 'a aa ai ao as b fn i m o s ',\n\t\t\tmatch,\n\t\t\tnewKey,\n\t\t\tmap = {};\n\t\n\t\t$.each( o, function (key, val) {\n\t\t\tmatch = key.match(/^([^A-Z]+?)([A-Z])/);\n\t\n\t\t\tif ( match && hungarian.indexOf(match[1]+' ') !== -1 )\n\t\t\t{\n\t\t\t\tnewKey = key.replace( match[0], match[2].toLowerCase() );\n\t\t\t\tmap[ newKey ] = key;\n\t\n\t\t\t\tif ( match[1] === 'o' )\n\t\t\t\t{\n\t\t\t\t\t_fnHungarianMap( o[key] );\n\t\t\t\t}\n\t\t\t}\n\t\t} );\n\t\n\t\to._hungarianMap = map;\n\t}\n\t\n\t\n\t/**\n\t * Convert from camel case parameters to Hungarian, based on a Hungarian map\n\t * created by _fnHungarianMap.\n\t *  @param {object} src The model object which holds all parameters that can be\n\t *    mapped.\n\t *  @param {object} user The object to convert from camel case to Hungarian.\n\t *  @param {boolean} force When set to `true`, properties which already have a\n\t *    Hungarian value in the `user` object will be overwritten. Otherwise they\n\t *    won't be.\n\t *  @memberof DataTable#oApi\n\t */\n\tfunction _fnCamelToHungarian ( src, user, force )\n\t{\n\t\tif ( ! src._hungarianMap ) {\n\t\t\t_fnHungarianMap( src );\n\t\t}\n\t\n\t\tvar hungarianKey;\n\t\n\t\t$.each( user, function (key, val) {\n\t\t\thungarianKey = src._hungarianMap[ key ];\n\t\n\t\t\tif ( hungarianKey !== undefined && (force || user[hungarianKey] === undefined) )\n\t\t\t{\n\t\t\t\t// For objects, we need to buzz down into the object to copy parameters\n\t\t\t\tif ( hungarianKey.charAt(0) === 'o' )\n\t\t\t\t{\n\t\t\t\t\t// Copy the camelCase options over to the hungarian\n\t\t\t\t\tif ( ! user[ hungarianKey ] ) {\n\t\t\t\t\t\tuser[ hungarianKey ] = {};\n\t\t\t\t\t}\n\t\t\t\t\t$.extend( true, user[hungarianKey], user[key] );\n\t\n\t\t\t\t\t_fnCamelToHungarian( src[hungarianKey], user[hungarianKey], force );\n\t\t\t\t}\n\t\t\t\telse {\n\t\t\t\t\tuser[hungarianKey] = user[ key ];\n\t\t\t\t}\n\t\t\t}\n\t\t} );\n\t}\n\t\n\t\n\t/**\n\t * Language compatibility - when certain options are given, and others aren't, we\n\t * need to duplicate the values over, in order to provide backwards compatibility\n\t * with older language files.\n\t *  @param {object} oSettings dataTables settings object\n\t *  @memberof DataTable#oApi\n\t */\n\tfunction _fnLanguageCompat( lang )\n\t{\n\t\t// Note the use of the Hungarian notation for the parameters in this method as\n\t\t// this is called after the mapping of camelCase to Hungarian\n\t\tvar defaults = DataTable.defaults.oLanguage;\n\t\n\t\t// Default mapping\n\t\tvar defaultDecimal = defaults.sDecimal;\n\t\tif ( defaultDecimal ) {\n\t\t\t_addNumericSort( defaultDecimal );\n\t\t}\n\t\n\t\tif ( lang ) {\n\t\t\tvar zeroRecords = lang.sZeroRecords;\n\t\n\t\t\t// Backwards compatibility - if there is no sEmptyTable given, then use the same as\n\t\t\t// sZeroRecords - assuming that is given.\n\t\t\tif ( ! lang.sEmptyTable && zeroRecords &&\n\t\t\t\tdefaults.sEmptyTable === \"No data available in table\" )\n\t\t\t{\n\t\t\t\t_fnMap( lang, lang, 'sZeroRecords', 'sEmptyTable' );\n\t\t\t}\n\t\n\t\t\t// Likewise with loading records\n\t\t\tif ( ! lang.sLoadingRecords && zeroRecords &&\n\t\t\t\tdefaults.sLoadingRecords === \"Loading...\" )\n\t\t\t{\n\t\t\t\t_fnMap( lang, lang, 'sZeroRecords', 'sLoadingRecords' );\n\t\t\t}\n\t\n\t\t\t// Old parameter name of the thousands separator mapped onto the new\n\t\t\tif ( lang.sInfoThousands ) {\n\t\t\t\tlang.sThousands = lang.sInfoThousands;\n\t\t\t}\n\t\n\t\t\tvar decimal = lang.sDecimal;\n\t\t\tif ( decimal && defaultDecimal !== decimal ) {\n\t\t\t\t_addNumericSort( decimal );\n\t\t\t}\n\t\t}\n\t}\n\t\n\t\n\t/**\n\t * Map one parameter onto another\n\t *  @param {object} o Object to map\n\t *  @param {*} knew The new parameter name\n\t *  @param {*} old The old parameter name\n\t */\n\tvar _fnCompatMap = function ( o, knew, old ) {\n\t\tif ( o[ knew ] !== undefined ) {\n\t\t\to[ old ] = o[ knew ];\n\t\t}\n\t};\n\t\n\t\n\t/**\n\t * Provide backwards compatibility for the main DT options. Note that the new\n\t * options are mapped onto the old parameters, so this is an external interface\n\t * change only.\n\t *  @param {object} init Object to map\n\t */\n\tfunction _fnCompatOpts ( init )\n\t{\n\t\t_fnCompatMap( init, 'ordering',      'bSort' );\n\t\t_fnCompatMap( init, 'orderMulti',    'bSortMulti' );\n\t\t_fnCompatMap( init, 'orderClasses',  'bSortClasses' );\n\t\t_fnCompatMap( init, 'orderCellsTop', 'bSortCellsTop' );\n\t\t_fnCompatMap( init, 'order',         'aaSorting' );\n\t\t_fnCompatMap( init, 'orderFixed',    'aaSortingFixed' );\n\t\t_fnCompatMap( init, 'paging',        'bPaginate' );\n\t\t_fnCompatMap( init, 'pagingType',    'sPaginationType' );\n\t\t_fnCompatMap( init, 'pageLength',    'iDisplayLength' );\n\t\t_fnCompatMap( init, 'searching',     'bFilter' );\n\t\n\t\t// Boolean initialisation of x-scrolling\n\t\tif ( typeof init.sScrollX === 'boolean' ) {\n\t\t\tinit.sScrollX = init.sScrollX ? '100%' : '';\n\t\t}\n\t\tif ( typeof init.scrollX === 'boolean' ) {\n\t\t\tinit.scrollX = init.scrollX ? '100%' : '';\n\t\t}\n\t\n\t\t// Column search objects are in an array, so it needs to be converted\n\t\t// element by element\n\t\tvar searchCols = init.aoSearchCols;\n\t\n\t\tif ( searchCols ) {\n\t\t\tfor ( var i=0, ien=searchCols.length ; i<ien ; i++ ) {\n\t\t\t\tif ( searchCols[i] ) {\n\t\t\t\t\t_fnCamelToHungarian( DataTable.models.oSearch, searchCols[i] );\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\t\n\t\n\t/**\n\t * Provide backwards compatibility for column options. Note that the new options\n\t * are mapped onto the old parameters, so this is an external interface change\n\t * only.\n\t *  @param {object} init Object to map\n\t */\n\tfunction _fnCompatCols ( init )\n\t{\n\t\t_fnCompatMap( init, 'orderable',     'bSortable' );\n\t\t_fnCompatMap( init, 'orderData',     'aDataSort' );\n\t\t_fnCompatMap( init, 'orderSequence', 'asSorting' );\n\t\t_fnCompatMap( init, 'orderDataType', 'sortDataType' );\n\t\n\t\t// orderData can be given as an integer\n\t\tvar dataSort = init.aDataSort;\n\t\tif ( typeof dataSort === 'number' && ! Array.isArray( dataSort ) ) {\n\t\t\tinit.aDataSort = [ dataSort ];\n\t\t}\n\t}\n\t\n\t\n\t/**\n\t * Browser feature detection for capabilities, quirks\n\t *  @param {object} settings dataTables settings object\n\t *  @memberof DataTable#oApi\n\t */\n\tfunction _fnBrowserDetect( settings )\n\t{\n\t\t// We don't need to do this every time DataTables is constructed, the values\n\t\t// calculated are specific to the browser and OS configuration which we\n\t\t// don't expect to change between initialisations\n\t\tif ( ! DataTable.__browser ) {\n\t\t\tvar browser = {};\n\t\t\tDataTable.__browser = browser;\n\t\n\t\t\t// Scrolling feature / quirks detection\n\t\t\tvar n = $('<div/>')\n\t\t\t\t.css( {\n\t\t\t\t\tposition: 'fixed',\n\t\t\t\t\ttop: 0,\n\t\t\t\t\tleft: $(window).scrollLeft()*-1, // allow for scrolling\n\t\t\t\t\theight: 1,\n\t\t\t\t\twidth: 1,\n\t\t\t\t\toverflow: 'hidden'\n\t\t\t\t} )\n\t\t\t\t.append(\n\t\t\t\t\t$('<div/>')\n\t\t\t\t\t\t.css( {\n\t\t\t\t\t\t\tposition: 'absolute',\n\t\t\t\t\t\t\ttop: 1,\n\t\t\t\t\t\t\tleft: 1,\n\t\t\t\t\t\t\twidth: 100,\n\t\t\t\t\t\t\toverflow: 'scroll'\n\t\t\t\t\t\t} )\n\t\t\t\t\t\t.append(\n\t\t\t\t\t\t\t$('<div/>')\n\t\t\t\t\t\t\t\t.css( {\n\t\t\t\t\t\t\t\t\twidth: '100%',\n\t\t\t\t\t\t\t\t\theight: 10\n\t\t\t\t\t\t\t\t} )\n\t\t\t\t\t\t)\n\t\t\t\t)\n\t\t\t\t.appendTo( 'body' );\n\t\n\t\t\tvar outer = n.children();\n\t\t\tvar inner = outer.children();\n\t\n\t\t\t// Numbers below, in order, are:\n\t\t\t// inner.offsetWidth, inner.clientWidth, outer.offsetWidth, outer.clientWidth\n\t\t\t//\n\t\t\t// IE6 XP:                           100 100 100  83\n\t\t\t// IE7 Vista:                        100 100 100  83\n\t\t\t// IE 8+ Windows:                     83  83 100  83\n\t\t\t// Evergreen Windows:                 83  83 100  83\n\t\t\t// Evergreen Mac with scrollbars:     85  85 100  85\n\t\t\t// Evergreen Mac without scrollbars: 100 100 100 100\n\t\n\t\t\t// Get scrollbar width\n\t\t\tbrowser.barWidth = outer[0].offsetWidth - outer[0].clientWidth;\n\t\n\t\t\t// IE6/7 will oversize a width 100% element inside a scrolling element, to\n\t\t\t// include the width of the scrollbar, while other browsers ensure the inner\n\t\t\t// element is contained without forcing scrolling\n\t\t\tbrowser.bScrollOversize = inner[0].offsetWidth === 100 && outer[0].clientWidth !== 100;\n\t\n\t\t\t// In rtl text layout, some browsers (most, but not all) will place the\n\t\t\t// scrollbar on the left, rather than the right.\n\t\t\tbrowser.bScrollbarLeft = Math.round( inner.offset().left ) !== 1;\n\t\n\t\t\t// IE8- don't provide height and width for getBoundingClientRect\n\t\t\tbrowser.bBounding = n[0].getBoundingClientRect().width ? true : false;\n\t\n\t\t\tn.remove();\n\t\t}\n\t\n\t\t$.extend( settings.oBrowser, DataTable.__browser );\n\t\tsettings.oScroll.iBarWidth = DataTable.__browser.barWidth;\n\t}\n\t\n\t\n\t/**\n\t * Array.prototype reduce[Right] method, used for browsers which don't support\n\t * JS 1.6. Done this way to reduce code size, since we iterate either way\n\t *  @param {object} settings dataTables settings object\n\t *  @memberof DataTable#oApi\n\t */\n\tfunction _fnReduce ( that, fn, init, start, end, inc )\n\t{\n\t\tvar\n\t\t\ti = start,\n\t\t\tvalue,\n\t\t\tisSet = false;\n\t\n\t\tif ( init !== undefined ) {\n\t\t\tvalue = init;\n\t\t\tisSet = true;\n\t\t}\n\t\n\t\twhile ( i !== end ) {\n\t\t\tif ( ! that.hasOwnProperty(i) ) {\n\t\t\t\tcontinue;\n\t\t\t}\n\t\n\t\t\tvalue = isSet ?\n\t\t\t\tfn( value, that[i], i, that ) :\n\t\t\t\tthat[i];\n\t\n\t\t\tisSet = true;\n\t\t\ti += inc;\n\t\t}\n\t\n\t\treturn value;\n\t}\n\t\n\t/**\n\t * Add a column to the list used for the table with default values\n\t *  @param {object} oSettings dataTables settings object\n\t *  @param {node} nTh The th element for this column\n\t *  @memberof DataTable#oApi\n\t */\n\tfunction _fnAddColumn( oSettings, nTh )\n\t{\n\t\t// Add column to aoColumns array\n\t\tvar oDefaults = DataTable.defaults.column;\n\t\tvar iCol = oSettings.aoColumns.length;\n\t\tvar oCol = $.extend( {}, DataTable.models.oColumn, oDefaults, {\n\t\t\t\"nTh\": nTh ? nTh : document.createElement('th'),\n\t\t\t\"sTitle\":    oDefaults.sTitle    ? oDefaults.sTitle    : nTh ? nTh.innerHTML : '',\n\t\t\t\"aDataSort\": oDefaults.aDataSort ? oDefaults.aDataSort : [iCol],\n\t\t\t\"mData\": oDefaults.mData ? oDefaults.mData : iCol,\n\t\t\tidx: iCol\n\t\t} );\n\t\toSettings.aoColumns.push( oCol );\n\t\n\t\t// Add search object for column specific search. Note that the `searchCols[ iCol ]`\n\t\t// passed into extend can be undefined. This allows the user to give a default\n\t\t// with only some of the parameters defined, and also not give a default\n\t\tvar searchCols = oSettings.aoPreSearchCols;\n\t\tsearchCols[ iCol ] = $.extend( {}, DataTable.models.oSearch, searchCols[ iCol ] );\n\t\n\t\t// Use the default column options function to initialise classes etc\n\t\t_fnColumnOptions( oSettings, iCol, $(nTh).data() );\n\t}\n\t\n\t\n\t/**\n\t * Apply options for a column\n\t *  @param {object} oSettings dataTables settings object\n\t *  @param {int} iCol column index to consider\n\t *  @param {object} oOptions object with sType, bVisible and bSearchable etc\n\t *  @memberof DataTable#oApi\n\t */\n\tfunction _fnColumnOptions( oSettings, iCol, oOptions )\n\t{\n\t\tvar oCol = oSettings.aoColumns[ iCol ];\n\t\tvar oClasses = oSettings.oClasses;\n\t\tvar th = $(oCol.nTh);\n\t\n\t\t// Try to get width information from the DOM. We can't get it from CSS\n\t\t// as we'd need to parse the CSS stylesheet. `width` option can override\n\t\tif ( ! oCol.sWidthOrig ) {\n\t\t\t// Width attribute\n\t\t\toCol.sWidthOrig = th.attr('width') || null;\n\t\n\t\t\t// Style attribute\n\t\t\tvar t = (th.attr('style') || '').match(/width:\\s*(\\d+[pxem%]+)/);\n\t\t\tif ( t ) {\n\t\t\t\toCol.sWidthOrig = t[1];\n\t\t\t}\n\t\t}\n\t\n\t\t/* User specified column options */\n\t\tif ( oOptions !== undefined && oOptions !== null )\n\t\t{\n\t\t\t// Backwards compatibility\n\t\t\t_fnCompatCols( oOptions );\n\t\n\t\t\t// Map camel case parameters to their Hungarian counterparts\n\t\t\t_fnCamelToHungarian( DataTable.defaults.column, oOptions, true );\n\t\n\t\t\t/* Backwards compatibility for mDataProp */\n\t\t\tif ( oOptions.mDataProp !== undefined && !oOptions.mData )\n\t\t\t{\n\t\t\t\toOptions.mData = oOptions.mDataProp;\n\t\t\t}\n\t\n\t\t\tif ( oOptions.sType )\n\t\t\t{\n\t\t\t\toCol._sManualType = oOptions.sType;\n\t\t\t}\n\t\n\t\t\t// `class` is a reserved word in Javascript, so we need to provide\n\t\t\t// the ability to use a valid name for the camel case input\n\t\t\tif ( oOptions.className && ! oOptions.sClass )\n\t\t\t{\n\t\t\t\toOptions.sClass = oOptions.className;\n\t\t\t}\n\t\t\tif ( oOptions.sClass ) {\n\t\t\t\tth.addClass( oOptions.sClass );\n\t\t\t}\n\t\n\t\t\t$.extend( oCol, oOptions );\n\t\t\t_fnMap( oCol, oOptions, \"sWidth\", \"sWidthOrig\" );\n\t\n\t\t\t/* iDataSort to be applied (backwards compatibility), but aDataSort will take\n\t\t\t * priority if defined\n\t\t\t */\n\t\t\tif ( oOptions.iDataSort !== undefined )\n\t\t\t{\n\t\t\t\toCol.aDataSort = [ oOptions.iDataSort ];\n\t\t\t}\n\t\t\t_fnMap( oCol, oOptions, \"aDataSort\" );\n\t\t}\n\t\n\t\t/* Cache the data get and set functions for speed */\n\t\tvar mDataSrc = oCol.mData;\n\t\tvar mData = _fnGetObjectDataFn( mDataSrc );\n\t\tvar mRender = oCol.mRender ? _fnGetObjectDataFn( oCol.mRender ) : null;\n\t\n\t\tvar attrTest = function( src ) {\n\t\t\treturn typeof src === 'string' && src.indexOf('@') !== -1;\n\t\t};\n\t\toCol._bAttrSrc = $.isPlainObject( mDataSrc ) && (\n\t\t\tattrTest(mDataSrc.sort) || attrTest(mDataSrc.type) || attrTest(mDataSrc.filter)\n\t\t);\n\t\toCol._setter = null;\n\t\n\t\toCol.fnGetData = function (rowData, type, meta) {\n\t\t\tvar innerData = mData( rowData, type, undefined, meta );\n\t\n\t\t\treturn mRender && type ?\n\t\t\t\tmRender( innerData, type, rowData, meta ) :\n\t\t\t\tinnerData;\n\t\t};\n\t\toCol.fnSetData = function ( rowData, val, meta ) {\n\t\t\treturn _fnSetObjectDataFn( mDataSrc )( rowData, val, meta );\n\t\t};\n\t\n\t\t// Indicate if DataTables should read DOM data as an object or array\n\t\t// Used in _fnGetRowElements\n\t\tif ( typeof mDataSrc !== 'number' ) {\n\t\t\toSettings._rowReadObject = true;\n\t\t}\n\t\n\t\t/* Feature sorting overrides column specific when off */\n\t\tif ( !oSettings.oFeatures.bSort )\n\t\t{\n\t\t\toCol.bSortable = false;\n\t\t\tth.addClass( oClasses.sSortableNone ); // Have to add class here as order event isn't called\n\t\t}\n\t\n\t\t/* Check that the class assignment is correct for sorting */\n\t\tvar bAsc = $.inArray('asc', oCol.asSorting) !== -1;\n\t\tvar bDesc = $.inArray('desc', oCol.asSorting) !== -1;\n\t\tif ( !oCol.bSortable || (!bAsc && !bDesc) )\n\t\t{\n\t\t\toCol.sSortingClass = oClasses.sSortableNone;\n\t\t\toCol.sSortingClassJUI = \"\";\n\t\t}\n\t\telse if ( bAsc && !bDesc )\n\t\t{\n\t\t\toCol.sSortingClass = oClasses.sSortableAsc;\n\t\t\toCol.sSortingClassJUI = oClasses.sSortJUIAscAllowed;\n\t\t}\n\t\telse if ( !bAsc && bDesc )\n\t\t{\n\t\t\toCol.sSortingClass = oClasses.sSortableDesc;\n\t\t\toCol.sSortingClassJUI = oClasses.sSortJUIDescAllowed;\n\t\t}\n\t\telse\n\t\t{\n\t\t\toCol.sSortingClass = oClasses.sSortable;\n\t\t\toCol.sSortingClassJUI = oClasses.sSortJUI;\n\t\t}\n\t}\n\t\n\t\n\t/**\n\t * Adjust the table column widths for new data. Note: you would probably want to\n\t * do a redraw after calling this function!\n\t *  @param {object} settings dataTables settings object\n\t *  @memberof DataTable#oApi\n\t */\n\tfunction _fnAdjustColumnSizing ( settings )\n\t{\n\t\t/* Not interested in doing column width calculation if auto-width is disabled */\n\t\tif ( settings.oFeatures.bAutoWidth !== false )\n\t\t{\n\t\t\tvar columns = settings.aoColumns;\n\t\n\t\t\t_fnCalculateColumnWidths( settings );\n\t\t\tfor ( var i=0 , iLen=columns.length ; i<iLen ; i++ )\n\t\t\t{\n\t\t\t\tcolumns[i].nTh.style.width = columns[i].sWidth;\n\t\t\t}\n\t\t}\n\t\n\t\tvar scroll = settings.oScroll;\n\t\tif ( scroll.sY !== '' || scroll.sX !== '')\n\t\t{\n\t\t\t_fnScrollDraw( settings );\n\t\t}\n\t\n\t\t_fnCallbackFire( settings, null, 'column-sizing', [settings] );\n\t}\n\t\n\t\n\t/**\n\t * Convert the index of a visible column to the index in the data array (take account\n\t * of hidden columns)\n\t *  @param {object} oSettings dataTables settings object\n\t *  @param {int} iMatch Visible column index to lookup\n\t *  @returns {int} i the data index\n\t *  @memberof DataTable#oApi\n\t */\n\tfunction _fnVisibleToColumnIndex( oSettings, iMatch )\n\t{\n\t\tvar aiVis = _fnGetColumns( oSettings, 'bVisible' );\n\t\n\t\treturn typeof aiVis[iMatch] === 'number' ?\n\t\t\taiVis[iMatch] :\n\t\t\tnull;\n\t}\n\t\n\t\n\t/**\n\t * Convert the index of an index in the data array and convert it to the visible\n\t *   column index (take account of hidden columns)\n\t *  @param {int} iMatch Column index to lookup\n\t *  @param {object} oSettings dataTables settings object\n\t *  @returns {int} i the data index\n\t *  @memberof DataTable#oApi\n\t */\n\tfunction _fnColumnIndexToVisible( oSettings, iMatch )\n\t{\n\t\tvar aiVis = _fnGetColumns( oSettings, 'bVisible' );\n\t\tvar iPos = $.inArray( iMatch, aiVis );\n\t\n\t\treturn iPos !== -1 ? iPos : null;\n\t}\n\t\n\t\n\t/**\n\t * Get the number of visible columns\n\t *  @param {object} oSettings dataTables settings object\n\t *  @returns {int} i the number of visible columns\n\t *  @memberof DataTable#oApi\n\t */\n\tfunction _fnVisbleColumns( oSettings )\n\t{\n\t\tvar vis = 0;\n\t\n\t\t// No reduce in IE8, use a loop for now\n\t\t$.each( oSettings.aoColumns, function ( i, col ) {\n\t\t\tif ( col.bVisible && $(col.nTh).css('display') !== 'none' ) {\n\t\t\t\tvis++;\n\t\t\t}\n\t\t} );\n\t\n\t\treturn vis;\n\t}\n\t\n\t\n\t/**\n\t * Get an array of column indexes that match a given property\n\t *  @param {object} oSettings dataTables settings object\n\t *  @param {string} sParam Parameter in aoColumns to look for - typically\n\t *    bVisible or bSearchable\n\t *  @returns {array} Array of indexes with matched properties\n\t *  @memberof DataTable#oApi\n\t */\n\tfunction _fnGetColumns( oSettings, sParam )\n\t{\n\t\tvar a = [];\n\t\n\t\t$.map( oSettings.aoColumns, function(val, i) {\n\t\t\tif ( val[sParam] ) {\n\t\t\t\ta.push( i );\n\t\t\t}\n\t\t} );\n\t\n\t\treturn a;\n\t}\n\t\n\t\n\t/**\n\t * Calculate the 'type' of a column\n\t *  @param {object} settings dataTables settings object\n\t *  @memberof DataTable#oApi\n\t */\n\tfunction _fnColumnTypes ( settings )\n\t{\n\t\tvar columns = settings.aoColumns;\n\t\tvar data = settings.aoData;\n\t\tvar types = DataTable.ext.type.detect;\n\t\tvar i, ien, j, jen, k, ken;\n\t\tvar col, cell, detectedType, cache;\n\t\n\t\t// For each column, spin over the \n\t\tfor ( i=0, ien=columns.length ; i<ien ; i++ ) {\n\t\t\tcol = columns[i];\n\t\t\tcache = [];\n\t\n\t\t\tif ( ! col.sType && col._sManualType ) {\n\t\t\t\tcol.sType = col._sManualType;\n\t\t\t}\n\t\t\telse if ( ! col.sType ) {\n\t\t\t\tfor ( j=0, jen=types.length ; j<jen ; j++ ) {\n\t\t\t\t\tfor ( k=0, ken=data.length ; k<ken ; k++ ) {\n\t\t\t\t\t\t// Use a cache array so we only need to get the type data\n\t\t\t\t\t\t// from the formatter once (when using multiple detectors)\n\t\t\t\t\t\tif ( cache[k] === undefined ) {\n\t\t\t\t\t\t\tcache[k] = _fnGetCellData( settings, k, i, 'type' );\n\t\t\t\t\t\t}\n\t\n\t\t\t\t\t\tdetectedType = types[j]( cache[k], settings );\n\t\n\t\t\t\t\t\t// If null, then this type can't apply to this column, so\n\t\t\t\t\t\t// rather than testing all cells, break out. There is an\n\t\t\t\t\t\t// exception for the last type which is `html`. We need to\n\t\t\t\t\t\t// scan all rows since it is possible to mix string and HTML\n\t\t\t\t\t\t// types\n\t\t\t\t\t\tif ( ! detectedType && j !== types.length-1 ) {\n\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\t}\n\t\n\t\t\t\t\t\t// Only a single match is needed for html type since it is\n\t\t\t\t\t\t// bottom of the pile and very similar to string - but it\n\t\t\t\t\t\t// must not be empty\n\t\t\t\t\t\tif ( detectedType === 'html' && ! _empty(cache[k]) ) {\n\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\n\t\t\t\t\t// Type is valid for all data points in the column - use this\n\t\t\t\t\t// type\n\t\t\t\t\tif ( detectedType ) {\n\t\t\t\t\t\tcol.sType = detectedType;\n\t\t\t\t\t\tbreak;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\n\t\t\t\t// Fall back - if no type was detected, always use string\n\t\t\t\tif ( ! col.sType ) {\n\t\t\t\t\tcol.sType = 'string';\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\t\n\t\n\t/**\n\t * Take the column definitions and static columns arrays and calculate how\n\t * they relate to column indexes. The callback function will then apply the\n\t * definition found for a column to a suitable configuration object.\n\t *  @param {object} oSettings dataTables settings object\n\t *  @param {array} aoColDefs The aoColumnDefs array that is to be applied\n\t *  @param {array} aoCols The aoColumns array that defines columns individually\n\t *  @param {function} fn Callback function - takes two parameters, the calculated\n\t *    column index and the definition for that column.\n\t *  @memberof DataTable#oApi\n\t */\n\tfunction _fnApplyColumnDefs( oSettings, aoColDefs, aoCols, fn )\n\t{\n\t\tvar i, iLen, j, jLen, k, kLen, def;\n\t\tvar columns = oSettings.aoColumns;\n\t\n\t\t// Column definitions with aTargets\n\t\tif ( aoColDefs )\n\t\t{\n\t\t\t/* Loop over the definitions array - loop in reverse so first instance has priority */\n\t\t\tfor ( i=aoColDefs.length-1 ; i>=0 ; i-- )\n\t\t\t{\n\t\t\t\tdef = aoColDefs[i];\n\t\n\t\t\t\t/* Each definition can target multiple columns, as it is an array */\n\t\t\t\tvar aTargets = def.targets !== undefined ?\n\t\t\t\t\tdef.targets :\n\t\t\t\t\tdef.aTargets;\n\t\n\t\t\t\tif ( ! Array.isArray( aTargets ) )\n\t\t\t\t{\n\t\t\t\t\taTargets = [ aTargets ];\n\t\t\t\t}\n\t\n\t\t\t\tfor ( j=0, jLen=aTargets.length ; j<jLen ; j++ )\n\t\t\t\t{\n\t\t\t\t\tif ( typeof aTargets[j] === 'number' && aTargets[j] >= 0 )\n\t\t\t\t\t{\n\t\t\t\t\t\t/* Add columns that we don't yet know about */\n\t\t\t\t\t\twhile( columns.length <= aTargets[j] )\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\t_fnAddColumn( oSettings );\n\t\t\t\t\t\t}\n\t\n\t\t\t\t\t\t/* Integer, basic index */\n\t\t\t\t\t\tfn( aTargets[j], def );\n\t\t\t\t\t}\n\t\t\t\t\telse if ( typeof aTargets[j] === 'number' && aTargets[j] < 0 )\n\t\t\t\t\t{\n\t\t\t\t\t\t/* Negative integer, right to left column counting */\n\t\t\t\t\t\tfn( columns.length+aTargets[j], def );\n\t\t\t\t\t}\n\t\t\t\t\telse if ( typeof aTargets[j] === 'string' )\n\t\t\t\t\t{\n\t\t\t\t\t\t/* Class name matching on TH element */\n\t\t\t\t\t\tfor ( k=0, kLen=columns.length ; k<kLen ; k++ )\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tif ( aTargets[j] == \"_all\" ||\n\t\t\t\t\t\t\t     $(columns[k].nTh).hasClass( aTargets[j] ) )\n\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\tfn( k, def );\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\n\t\t// Statically defined columns array\n\t\tif ( aoCols )\n\t\t{\n\t\t\tfor ( i=0, iLen=aoCols.length ; i<iLen ; i++ )\n\t\t\t{\n\t\t\t\tfn( i, aoCols[i] );\n\t\t\t}\n\t\t}\n\t}\n\t\n\t/**\n\t * Add a data array to the table, creating DOM node etc. This is the parallel to\n\t * _fnGatherData, but for adding rows from a Javascript source, rather than a\n\t * DOM source.\n\t *  @param {object} oSettings dataTables settings object\n\t *  @param {array} aData data array to be added\n\t *  @param {node} [nTr] TR element to add to the table - optional. If not given,\n\t *    DataTables will create a row automatically\n\t *  @param {array} [anTds] Array of TD|TH elements for the row - must be given\n\t *    if nTr is.\n\t *  @returns {int} >=0 if successful (index of new aoData entry), -1 if failed\n\t *  @memberof DataTable#oApi\n\t */\n\tfunction _fnAddData ( oSettings, aDataIn, nTr, anTds )\n\t{\n\t\t/* Create the object for storing information about this new row */\n\t\tvar iRow = oSettings.aoData.length;\n\t\tvar oData = $.extend( true, {}, DataTable.models.oRow, {\n\t\t\tsrc: nTr ? 'dom' : 'data',\n\t\t\tidx: iRow\n\t\t} );\n\t\n\t\toData._aData = aDataIn;\n\t\toSettings.aoData.push( oData );\n\t\n\t\t/* Create the cells */\n\t\tvar nTd, sThisType;\n\t\tvar columns = oSettings.aoColumns;\n\t\n\t\t// Invalidate the column types as the new data needs to be revalidated\n\t\tfor ( var i=0, iLen=columns.length ; i<iLen ; i++ )\n\t\t{\n\t\t\tcolumns[i].sType = null;\n\t\t}\n\t\n\t\t/* Add to the display array */\n\t\toSettings.aiDisplayMaster.push( iRow );\n\t\n\t\tvar id = oSettings.rowIdFn( aDataIn );\n\t\tif ( id !== undefined ) {\n\t\t\toSettings.aIds[ id ] = oData;\n\t\t}\n\t\n\t\t/* Create the DOM information, or register it if already present */\n\t\tif ( nTr || ! oSettings.oFeatures.bDeferRender )\n\t\t{\n\t\t\t_fnCreateTr( oSettings, iRow, nTr, anTds );\n\t\t}\n\t\n\t\treturn iRow;\n\t}\n\t\n\t\n\t/**\n\t * Add one or more TR elements to the table. Generally we'd expect to\n\t * use this for reading data from a DOM sourced table, but it could be\n\t * used for an TR element. Note that if a TR is given, it is used (i.e.\n\t * it is not cloned).\n\t *  @param {object} settings dataTables settings object\n\t *  @param {array|node|jQuery} trs The TR element(s) to add to the table\n\t *  @returns {array} Array of indexes for the added rows\n\t *  @memberof DataTable#oApi\n\t */\n\tfunction _fnAddTr( settings, trs )\n\t{\n\t\tvar row;\n\t\n\t\t// Allow an individual node to be passed in\n\t\tif ( ! (trs instanceof $) ) {\n\t\t\ttrs = $(trs);\n\t\t}\n\t\n\t\treturn trs.map( function (i, el) {\n\t\t\trow = _fnGetRowElements( settings, el );\n\t\t\treturn _fnAddData( settings, row.data, el, row.cells );\n\t\t} );\n\t}\n\t\n\t\n\t/**\n\t * Take a TR element and convert it to an index in aoData\n\t *  @param {object} oSettings dataTables settings object\n\t *  @param {node} n the TR element to find\n\t *  @returns {int} index if the node is found, null if not\n\t *  @memberof DataTable#oApi\n\t */\n\tfunction _fnNodeToDataIndex( oSettings, n )\n\t{\n\t\treturn (n._DT_RowIndex!==undefined) ? n._DT_RowIndex : null;\n\t}\n\t\n\t\n\t/**\n\t * Take a TD element and convert it into a column data index (not the visible index)\n\t *  @param {object} oSettings dataTables settings object\n\t *  @param {int} iRow The row number the TD/TH can be found in\n\t *  @param {node} n The TD/TH element to find\n\t *  @returns {int} index if the node is found, -1 if not\n\t *  @memberof DataTable#oApi\n\t */\n\tfunction _fnNodeToColumnIndex( oSettings, iRow, n )\n\t{\n\t\treturn $.inArray( n, oSettings.aoData[ iRow ].anCells );\n\t}\n\t\n\t\n\t/**\n\t * Get the data for a given cell from the internal cache, taking into account data mapping\n\t *  @param {object} settings dataTables settings object\n\t *  @param {int} rowIdx aoData row id\n\t *  @param {int} colIdx Column index\n\t *  @param {string} type data get type ('display', 'type' 'filter|search' 'sort|order')\n\t *  @returns {*} Cell data\n\t *  @memberof DataTable#oApi\n\t */\n\tfunction _fnGetCellData( settings, rowIdx, colIdx, type )\n\t{\n\t\tif (type === 'search') {\n\t\t\ttype = 'filter';\n\t\t}\n\t\telse if (type === 'order') {\n\t\t\ttype = 'sort';\n\t\t}\n\t\n\t\tvar draw           = settings.iDraw;\n\t\tvar col            = settings.aoColumns[colIdx];\n\t\tvar rowData        = settings.aoData[rowIdx]._aData;\n\t\tvar defaultContent = col.sDefaultContent;\n\t\tvar cellData       = col.fnGetData( rowData, type, {\n\t\t\tsettings: settings,\n\t\t\trow:      rowIdx,\n\t\t\tcol:      colIdx\n\t\t} );\n\t\n\t\tif ( cellData === undefined ) {\n\t\t\tif ( settings.iDrawError != draw && defaultContent === null ) {\n\t\t\t\t_fnLog( settings, 0, \"Requested unknown parameter \"+\n\t\t\t\t\t(typeof col.mData=='function' ? '{function}' : \"'\"+col.mData+\"'\")+\n\t\t\t\t\t\" for row \"+rowIdx+\", column \"+colIdx, 4 );\n\t\t\t\tsettings.iDrawError = draw;\n\t\t\t}\n\t\t\treturn defaultContent;\n\t\t}\n\t\n\t\t// When the data source is null and a specific data type is requested (i.e.\n\t\t// not the original data), we can use default column data\n\t\tif ( (cellData === rowData || cellData === null) && defaultContent !== null && type !== undefined ) {\n\t\t\tcellData = defaultContent;\n\t\t}\n\t\telse if ( typeof cellData === 'function' ) {\n\t\t\t// If the data source is a function, then we run it and use the return,\n\t\t\t// executing in the scope of the data object (for instances)\n\t\t\treturn cellData.call( rowData );\n\t\t}\n\t\n\t\tif ( cellData === null && type === 'display' ) {\n\t\t\treturn '';\n\t\t}\n\t\n\t\tif ( type === 'filter' ) {\n\t\t\tvar fomatters = DataTable.ext.type.search;\n\t\n\t\t\tif ( fomatters[ col.sType ] ) {\n\t\t\t\tcellData = fomatters[ col.sType ]( cellData );\n\t\t\t}\n\t\t}\n\t\n\t\treturn cellData;\n\t}\n\t\n\t\n\t/**\n\t * Set the value for a specific cell, into the internal data cache\n\t *  @param {object} settings dataTables settings object\n\t *  @param {int} rowIdx aoData row id\n\t *  @param {int} colIdx Column index\n\t *  @param {*} val Value to set\n\t *  @memberof DataTable#oApi\n\t */\n\tfunction _fnSetCellData( settings, rowIdx, colIdx, val )\n\t{\n\t\tvar col     = settings.aoColumns[colIdx];\n\t\tvar rowData = settings.aoData[rowIdx]._aData;\n\t\n\t\tcol.fnSetData( rowData, val, {\n\t\t\tsettings: settings,\n\t\t\trow:      rowIdx,\n\t\t\tcol:      colIdx\n\t\t}  );\n\t}\n\t\n\t\n\t// Private variable that is used to match action syntax in the data property object\n\tvar __reArray = /\\[.*?\\]$/;\n\tvar __reFn = /\\(\\)$/;\n\t\n\t/**\n\t * Split string on periods, taking into account escaped periods\n\t * @param  {string} str String to split\n\t * @return {array} Split string\n\t */\n\tfunction _fnSplitObjNotation( str )\n\t{\n\t\treturn $.map( str.match(/(\\\\.|[^\\.])+/g) || [''], function ( s ) {\n\t\t\treturn s.replace(/\\\\\\./g, '.');\n\t\t} );\n\t}\n\t\n\t\n\t/**\n\t * Return a function that can be used to get data from a source object, taking\n\t * into account the ability to use nested objects as a source\n\t *  @param {string|int|function} mSource The data source for the object\n\t *  @returns {function} Data get function\n\t *  @memberof DataTable#oApi\n\t */\n\tvar _fnGetObjectDataFn = DataTable.util.get;\n\t\n\t\n\t/**\n\t * Return a function that can be used to set data from a source object, taking\n\t * into account the ability to use nested objects as a source\n\t *  @param {string|int|function} mSource The data source for the object\n\t *  @returns {function} Data set function\n\t *  @memberof DataTable#oApi\n\t */\n\tvar _fnSetObjectDataFn = DataTable.util.set;\n\t\n\t\n\t/**\n\t * Return an array with the full table data\n\t *  @param {object} oSettings dataTables settings object\n\t *  @returns array {array} aData Master data array\n\t *  @memberof DataTable#oApi\n\t */\n\tfunction _fnGetDataMaster ( settings )\n\t{\n\t\treturn _pluck( settings.aoData, '_aData' );\n\t}\n\t\n\t\n\t/**\n\t * Nuke the table\n\t *  @param {object} oSettings dataTables settings object\n\t *  @memberof DataTable#oApi\n\t */\n\tfunction _fnClearTable( settings )\n\t{\n\t\tsettings.aoData.length = 0;\n\t\tsettings.aiDisplayMaster.length = 0;\n\t\tsettings.aiDisplay.length = 0;\n\t\tsettings.aIds = {};\n\t}\n\t\n\t\n\t /**\n\t * Take an array of integers (index array) and remove a target integer (value - not\n\t * the key!)\n\t *  @param {array} a Index array to target\n\t *  @param {int} iTarget value to find\n\t *  @memberof DataTable#oApi\n\t */\n\tfunction _fnDeleteIndex( a, iTarget, splice )\n\t{\n\t\tvar iTargetIndex = -1;\n\t\n\t\tfor ( var i=0, iLen=a.length ; i<iLen ; i++ )\n\t\t{\n\t\t\tif ( a[i] == iTarget )\n\t\t\t{\n\t\t\t\tiTargetIndex = i;\n\t\t\t}\n\t\t\telse if ( a[i] > iTarget )\n\t\t\t{\n\t\t\t\ta[i]--;\n\t\t\t}\n\t\t}\n\t\n\t\tif ( iTargetIndex != -1 && splice === undefined )\n\t\t{\n\t\t\ta.splice( iTargetIndex, 1 );\n\t\t}\n\t}\n\t\n\t\n\t/**\n\t * Mark cached data as invalid such that a re-read of the data will occur when\n\t * the cached data is next requested. Also update from the data source object.\n\t *\n\t * @param {object} settings DataTables settings object\n\t * @param {int}    rowIdx   Row index to invalidate\n\t * @param {string} [src]    Source to invalidate from: undefined, 'auto', 'dom'\n\t *     or 'data'\n\t * @param {int}    [colIdx] Column index to invalidate. If undefined the whole\n\t *     row will be invalidated\n\t * @memberof DataTable#oApi\n\t *\n\t * @todo For the modularisation of v1.11 this will need to become a callback, so\n\t *   the sort and filter methods can subscribe to it. That will required\n\t *   initialisation options for sorting, which is why it is not already baked in\n\t */\n\tfunction _fnInvalidate( settings, rowIdx, src, colIdx )\n\t{\n\t\tvar row = settings.aoData[ rowIdx ];\n\t\tvar i, ien;\n\t\tvar cellWrite = function ( cell, col ) {\n\t\t\t// This is very frustrating, but in IE if you just write directly\n\t\t\t// to innerHTML, and elements that are overwritten are GC'ed,\n\t\t\t// even if there is a reference to them elsewhere\n\t\t\twhile ( cell.childNodes.length ) {\n\t\t\t\tcell.removeChild( cell.firstChild );\n\t\t\t}\n\t\n\t\t\tcell.innerHTML = _fnGetCellData( settings, rowIdx, col, 'display' );\n\t\t};\n\t\n\t\t// Are we reading last data from DOM or the data object?\n\t\tif ( src === 'dom' || ((! src || src === 'auto') && row.src === 'dom') ) {\n\t\t\t// Read the data from the DOM\n\t\t\trow._aData = _fnGetRowElements(\n\t\t\t\t\tsettings, row, colIdx, colIdx === undefined ? undefined : row._aData\n\t\t\t\t)\n\t\t\t\t.data;\n\t\t}\n\t\telse {\n\t\t\t// Reading from data object, update the DOM\n\t\t\tvar cells = row.anCells;\n\t\n\t\t\tif ( cells ) {\n\t\t\t\tif ( colIdx !== undefined ) {\n\t\t\t\t\tcellWrite( cells[colIdx], colIdx );\n\t\t\t\t}\n\t\t\t\telse {\n\t\t\t\t\tfor ( i=0, ien=cells.length ; i<ien ; i++ ) {\n\t\t\t\t\t\tcellWrite( cells[i], i );\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\n\t\t// For both row and cell invalidation, the cached data for sorting and\n\t\t// filtering is nulled out\n\t\trow._aSortData = null;\n\t\trow._aFilterData = null;\n\t\n\t\t// Invalidate the type for a specific column (if given) or all columns since\n\t\t// the data might have changed\n\t\tvar cols = settings.aoColumns;\n\t\tif ( colIdx !== undefined ) {\n\t\t\tcols[ colIdx ].sType = null;\n\t\t}\n\t\telse {\n\t\t\tfor ( i=0, ien=cols.length ; i<ien ; i++ ) {\n\t\t\t\tcols[i].sType = null;\n\t\t\t}\n\t\n\t\t\t// Update DataTables special `DT_*` attributes for the row\n\t\t\t_fnRowAttributes( settings, row );\n\t\t}\n\t}\n\t\n\t\n\t/**\n\t * Build a data source object from an HTML row, reading the contents of the\n\t * cells that are in the row.\n\t *\n\t * @param {object} settings DataTables settings object\n\t * @param {node|object} TR element from which to read data or existing row\n\t *   object from which to re-read the data from the cells\n\t * @param {int} [colIdx] Optional column index\n\t * @param {array|object} [d] Data source object. If `colIdx` is given then this\n\t *   parameter should also be given and will be used to write the data into.\n\t *   Only the column in question will be written\n\t * @returns {object} Object with two parameters: `data` the data read, in\n\t *   document order, and `cells` and array of nodes (they can be useful to the\n\t *   caller, so rather than needing a second traversal to get them, just return\n\t *   them from here).\n\t * @memberof DataTable#oApi\n\t */\n\tfunction _fnGetRowElements( settings, row, colIdx, d )\n\t{\n\t\tvar\n\t\t\ttds = [],\n\t\t\ttd = row.firstChild,\n\t\t\tname, col, o, i=0, contents,\n\t\t\tcolumns = settings.aoColumns,\n\t\t\tobjectRead = settings._rowReadObject;\n\t\n\t\t// Allow the data object to be passed in, or construct\n\t\td = d !== undefined ?\n\t\t\td :\n\t\t\tobjectRead ?\n\t\t\t\t{} :\n\t\t\t\t[];\n\t\n\t\tvar attr = function ( str, td  ) {\n\t\t\tif ( typeof str === 'string' ) {\n\t\t\t\tvar idx = str.indexOf('@');\n\t\n\t\t\t\tif ( idx !== -1 ) {\n\t\t\t\t\tvar attr = str.substring( idx+1 );\n\t\t\t\t\tvar setter = _fnSetObjectDataFn( str );\n\t\t\t\t\tsetter( d, td.getAttribute( attr ) );\n\t\t\t\t}\n\t\t\t}\n\t\t};\n\t\n\t\t// Read data from a cell and store into the data object\n\t\tvar cellProcess = function ( cell ) {\n\t\t\tif ( colIdx === undefined || colIdx === i ) {\n\t\t\t\tcol = columns[i];\n\t\t\t\tcontents = (cell.innerHTML).trim();\n\t\n\t\t\t\tif ( col && col._bAttrSrc ) {\n\t\t\t\t\tvar setter = _fnSetObjectDataFn( col.mData._ );\n\t\t\t\t\tsetter( d, contents );\n\t\n\t\t\t\t\tattr( col.mData.sort, cell );\n\t\t\t\t\tattr( col.mData.type, cell );\n\t\t\t\t\tattr( col.mData.filter, cell );\n\t\t\t\t}\n\t\t\t\telse {\n\t\t\t\t\t// Depending on the `data` option for the columns the data can\n\t\t\t\t\t// be read to either an object or an array.\n\t\t\t\t\tif ( objectRead ) {\n\t\t\t\t\t\tif ( ! col._setter ) {\n\t\t\t\t\t\t\t// Cache the setter function\n\t\t\t\t\t\t\tcol._setter = _fnSetObjectDataFn( col.mData );\n\t\t\t\t\t\t}\n\t\t\t\t\t\tcol._setter( d, contents );\n\t\t\t\t\t}\n\t\t\t\t\telse {\n\t\t\t\t\t\td[i] = contents;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\n\t\t\ti++;\n\t\t};\n\t\n\t\tif ( td ) {\n\t\t\t// `tr` element was passed in\n\t\t\twhile ( td ) {\n\t\t\t\tname = td.nodeName.toUpperCase();\n\t\n\t\t\t\tif ( name == \"TD\" || name == \"TH\" ) {\n\t\t\t\t\tcellProcess( td );\n\t\t\t\t\ttds.push( td );\n\t\t\t\t}\n\t\n\t\t\t\ttd = td.nextSibling;\n\t\t\t}\n\t\t}\n\t\telse {\n\t\t\t// Existing row object passed in\n\t\t\ttds = row.anCells;\n\t\n\t\t\tfor ( var j=0, jen=tds.length ; j<jen ; j++ ) {\n\t\t\t\tcellProcess( tds[j] );\n\t\t\t}\n\t\t}\n\t\n\t\t// Read the ID from the DOM if present\n\t\tvar rowNode = row.firstChild ? row : row.nTr;\n\t\n\t\tif ( rowNode ) {\n\t\t\tvar id = rowNode.getAttribute( 'id' );\n\t\n\t\t\tif ( id ) {\n\t\t\t\t_fnSetObjectDataFn( settings.rowId )( d, id );\n\t\t\t}\n\t\t}\n\t\n\t\treturn {\n\t\t\tdata: d,\n\t\t\tcells: tds\n\t\t};\n\t}\n\t/**\n\t * Create a new TR element (and it's TD children) for a row\n\t *  @param {object} oSettings dataTables settings object\n\t *  @param {int} iRow Row to consider\n\t *  @param {node} [nTrIn] TR element to add to the table - optional. If not given,\n\t *    DataTables will create a row automatically\n\t *  @param {array} [anTds] Array of TD|TH elements for the row - must be given\n\t *    if nTr is.\n\t *  @memberof DataTable#oApi\n\t */\n\tfunction _fnCreateTr ( oSettings, iRow, nTrIn, anTds )\n\t{\n\t\tvar\n\t\t\trow = oSettings.aoData[iRow],\n\t\t\trowData = row._aData,\n\t\t\tcells = [],\n\t\t\tnTr, nTd, oCol,\n\t\t\ti, iLen, create;\n\t\n\t\tif ( row.nTr === null )\n\t\t{\n\t\t\tnTr = nTrIn || document.createElement('tr');\n\t\n\t\t\trow.nTr = nTr;\n\t\t\trow.anCells = cells;\n\t\n\t\t\t/* Use a private property on the node to allow reserve mapping from the node\n\t\t\t * to the aoData array for fast look up\n\t\t\t */\n\t\t\tnTr._DT_RowIndex = iRow;\n\t\n\t\t\t/* Special parameters can be given by the data source to be used on the row */\n\t\t\t_fnRowAttributes( oSettings, row );\n\t\n\t\t\t/* Process each column */\n\t\t\tfor ( i=0, iLen=oSettings.aoColumns.length ; i<iLen ; i++ )\n\t\t\t{\n\t\t\t\toCol = oSettings.aoColumns[i];\n\t\t\t\tcreate = nTrIn ? false : true;\n\t\n\t\t\t\tnTd = create ? document.createElement( oCol.sCellType ) : anTds[i];\n\t\t\t\tnTd._DT_CellIndex = {\n\t\t\t\t\trow: iRow,\n\t\t\t\t\tcolumn: i\n\t\t\t\t};\n\t\t\t\t\n\t\t\t\tcells.push( nTd );\n\t\n\t\t\t\t// Need to create the HTML if new, or if a rendering function is defined\n\t\t\t\tif ( create || ((oCol.mRender || oCol.mData !== i) &&\n\t\t\t\t\t (!$.isPlainObject(oCol.mData) || oCol.mData._ !== i+'.display')\n\t\t\t\t)) {\n\t\t\t\t\tnTd.innerHTML = _fnGetCellData( oSettings, iRow, i, 'display' );\n\t\t\t\t}\n\t\n\t\t\t\t/* Add user defined class */\n\t\t\t\tif ( oCol.sClass )\n\t\t\t\t{\n\t\t\t\t\tnTd.className += ' '+oCol.sClass;\n\t\t\t\t}\n\t\n\t\t\t\t// Visibility - add or remove as required\n\t\t\t\tif ( oCol.bVisible && ! nTrIn )\n\t\t\t\t{\n\t\t\t\t\tnTr.appendChild( nTd );\n\t\t\t\t}\n\t\t\t\telse if ( ! oCol.bVisible && nTrIn )\n\t\t\t\t{\n\t\t\t\t\tnTd.parentNode.removeChild( nTd );\n\t\t\t\t}\n\t\n\t\t\t\tif ( oCol.fnCreatedCell )\n\t\t\t\t{\n\t\t\t\t\toCol.fnCreatedCell.call( oSettings.oInstance,\n\t\t\t\t\t\tnTd, _fnGetCellData( oSettings, iRow, i ), rowData, iRow, i\n\t\t\t\t\t);\n\t\t\t\t}\n\t\t\t}\n\t\n\t\t\t_fnCallbackFire( oSettings, 'aoRowCreatedCallback', null, [nTr, rowData, iRow, cells] );\n\t\t}\n\t}\n\t\n\t\n\t/**\n\t * Add attributes to a row based on the special `DT_*` parameters in a data\n\t * source object.\n\t *  @param {object} settings DataTables settings object\n\t *  @param {object} DataTables row object for the row to be modified\n\t *  @memberof DataTable#oApi\n\t */\n\tfunction _fnRowAttributes( settings, row )\n\t{\n\t\tvar tr = row.nTr;\n\t\tvar data = row._aData;\n\t\n\t\tif ( tr ) {\n\t\t\tvar id = settings.rowIdFn( data );\n\t\n\t\t\tif ( id ) {\n\t\t\t\ttr.id = id;\n\t\t\t}\n\t\n\t\t\tif ( data.DT_RowClass ) {\n\t\t\t\t// Remove any classes added by DT_RowClass before\n\t\t\t\tvar a = data.DT_RowClass.split(' ');\n\t\t\t\trow.__rowc = row.__rowc ?\n\t\t\t\t\t_unique( row.__rowc.concat( a ) ) :\n\t\t\t\t\ta;\n\t\n\t\t\t\t$(tr)\n\t\t\t\t\t.removeClass( row.__rowc.join(' ') )\n\t\t\t\t\t.addClass( data.DT_RowClass );\n\t\t\t}\n\t\n\t\t\tif ( data.DT_RowAttr ) {\n\t\t\t\t$(tr).attr( data.DT_RowAttr );\n\t\t\t}\n\t\n\t\t\tif ( data.DT_RowData ) {\n\t\t\t\t$(tr).data( data.DT_RowData );\n\t\t\t}\n\t\t}\n\t}\n\t\n\t\n\t/**\n\t * Create the HTML header for the table\n\t *  @param {object} oSettings dataTables settings object\n\t *  @memberof DataTable#oApi\n\t */\n\tfunction _fnBuildHead( oSettings )\n\t{\n\t\tvar i, ien, cell, row, column;\n\t\tvar thead = oSettings.nTHead;\n\t\tvar tfoot = oSettings.nTFoot;\n\t\tvar createHeader = $('th, td', thead).length === 0;\n\t\tvar classes = oSettings.oClasses;\n\t\tvar columns = oSettings.aoColumns;\n\t\n\t\tif ( createHeader ) {\n\t\t\trow = $('<tr/>').appendTo( thead );\n\t\t}\n\t\n\t\tfor ( i=0, ien=columns.length ; i<ien ; i++ ) {\n\t\t\tcolumn = columns[i];\n\t\t\tcell = $( column.nTh ).addClass( column.sClass );\n\t\n\t\t\tif ( createHeader ) {\n\t\t\t\tcell.appendTo( row );\n\t\t\t}\n\t\n\t\t\t// 1.11 move into sorting\n\t\t\tif ( oSettings.oFeatures.bSort ) {\n\t\t\t\tcell.addClass( column.sSortingClass );\n\t\n\t\t\t\tif ( column.bSortable !== false ) {\n\t\t\t\t\tcell\n\t\t\t\t\t\t.attr( 'tabindex', oSettings.iTabIndex )\n\t\t\t\t\t\t.attr( 'aria-controls', oSettings.sTableId );\n\t\n\t\t\t\t\t_fnSortAttachListener( oSettings, column.nTh, i );\n\t\t\t\t}\n\t\t\t}\n\t\n\t\t\tif ( column.sTitle != cell[0].innerHTML ) {\n\t\t\t\tcell.html( column.sTitle );\n\t\t\t}\n\t\n\t\t\t_fnRenderer( oSettings, 'header' )(\n\t\t\t\toSettings, cell, column, classes\n\t\t\t);\n\t\t}\n\t\n\t\tif ( createHeader ) {\n\t\t\t_fnDetectHeader( oSettings.aoHeader, thead );\n\t\t}\n\t\n\t\t/* Deal with the footer - add classes if required */\n\t\t$(thead).children('tr').children('th, td').addClass( classes.sHeaderTH );\n\t\t$(tfoot).children('tr').children('th, td').addClass( classes.sFooterTH );\n\t\n\t\t// Cache the footer cells. Note that we only take the cells from the first\n\t\t// row in the footer. If there is more than one row the user wants to\n\t\t// interact with, they need to use the table().foot() method. Note also this\n\t\t// allows cells to be used for multiple columns using colspan\n\t\tif ( tfoot !== null ) {\n\t\t\tvar cells = oSettings.aoFooter[0];\n\t\n\t\t\tfor ( i=0, ien=cells.length ; i<ien ; i++ ) {\n\t\t\t\tcolumn = columns[i];\n\t\t\t\tcolumn.nTf = cells[i].cell;\n\t\n\t\t\t\tif ( column.sClass ) {\n\t\t\t\t\t$(column.nTf).addClass( column.sClass );\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\t\n\t\n\t/**\n\t * Draw the header (or footer) element based on the column visibility states. The\n\t * methodology here is to use the layout array from _fnDetectHeader, modified for\n\t * the instantaneous column visibility, to construct the new layout. The grid is\n\t * traversed over cell at a time in a rows x columns grid fashion, although each\n\t * cell insert can cover multiple elements in the grid - which is tracks using the\n\t * aApplied array. Cell inserts in the grid will only occur where there isn't\n\t * already a cell in that position.\n\t *  @param {object} oSettings dataTables settings object\n\t *  @param array {objects} aoSource Layout array from _fnDetectHeader\n\t *  @param {boolean} [bIncludeHidden=false] If true then include the hidden columns in the calc,\n\t *  @memberof DataTable#oApi\n\t */\n\tfunction _fnDrawHead( oSettings, aoSource, bIncludeHidden )\n\t{\n\t\tvar i, iLen, j, jLen, k, kLen, n, nLocalTr;\n\t\tvar aoLocal = [];\n\t\tvar aApplied = [];\n\t\tvar iColumns = oSettings.aoColumns.length;\n\t\tvar iRowspan, iColspan;\n\t\n\t\tif ( ! aoSource )\n\t\t{\n\t\t\treturn;\n\t\t}\n\t\n\t\tif (  bIncludeHidden === undefined )\n\t\t{\n\t\t\tbIncludeHidden = false;\n\t\t}\n\t\n\t\t/* Make a copy of the master layout array, but without the visible columns in it */\n\t\tfor ( i=0, iLen=aoSource.length ; i<iLen ; i++ )\n\t\t{\n\t\t\taoLocal[i] = aoSource[i].slice();\n\t\t\taoLocal[i].nTr = aoSource[i].nTr;\n\t\n\t\t\t/* Remove any columns which are currently hidden */\n\t\t\tfor ( j=iColumns-1 ; j>=0 ; j-- )\n\t\t\t{\n\t\t\t\tif ( !oSettings.aoColumns[j].bVisible && !bIncludeHidden )\n\t\t\t\t{\n\t\t\t\t\taoLocal[i].splice( j, 1 );\n\t\t\t\t}\n\t\t\t}\n\t\n\t\t\t/* Prep the applied array - it needs an element for each row */\n\t\t\taApplied.push( [] );\n\t\t}\n\t\n\t\tfor ( i=0, iLen=aoLocal.length ; i<iLen ; i++ )\n\t\t{\n\t\t\tnLocalTr = aoLocal[i].nTr;\n\t\n\t\t\t/* All cells are going to be replaced, so empty out the row */\n\t\t\tif ( nLocalTr )\n\t\t\t{\n\t\t\t\twhile( (n = nLocalTr.firstChild) )\n\t\t\t\t{\n\t\t\t\t\tnLocalTr.removeChild( n );\n\t\t\t\t}\n\t\t\t}\n\t\n\t\t\tfor ( j=0, jLen=aoLocal[i].length ; j<jLen ; j++ )\n\t\t\t{\n\t\t\t\tiRowspan = 1;\n\t\t\t\tiColspan = 1;\n\t\n\t\t\t\t/* Check to see if there is already a cell (row/colspan) covering our target\n\t\t\t\t * insert point. If there is, then there is nothing to do.\n\t\t\t\t */\n\t\t\t\tif ( aApplied[i][j] === undefined )\n\t\t\t\t{\n\t\t\t\t\tnLocalTr.appendChild( aoLocal[i][j].cell );\n\t\t\t\t\taApplied[i][j] = 1;\n\t\n\t\t\t\t\t/* Expand the cell to cover as many rows as needed */\n\t\t\t\t\twhile ( aoLocal[i+iRowspan] !== undefined &&\n\t\t\t\t\t        aoLocal[i][j].cell == aoLocal[i+iRowspan][j].cell )\n\t\t\t\t\t{\n\t\t\t\t\t\taApplied[i+iRowspan][j] = 1;\n\t\t\t\t\t\tiRowspan++;\n\t\t\t\t\t}\n\t\n\t\t\t\t\t/* Expand the cell to cover as many columns as needed */\n\t\t\t\t\twhile ( aoLocal[i][j+iColspan] !== undefined &&\n\t\t\t\t\t        aoLocal[i][j].cell == aoLocal[i][j+iColspan].cell )\n\t\t\t\t\t{\n\t\t\t\t\t\t/* Must update the applied array over the rows for the columns */\n\t\t\t\t\t\tfor ( k=0 ; k<iRowspan ; k++ )\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\taApplied[i+k][j+iColspan] = 1;\n\t\t\t\t\t\t}\n\t\t\t\t\t\tiColspan++;\n\t\t\t\t\t}\n\t\n\t\t\t\t\t/* Do the actual expansion in the DOM */\n\t\t\t\t\t$(aoLocal[i][j].cell)\n\t\t\t\t\t\t.attr('rowspan', iRowspan)\n\t\t\t\t\t\t.attr('colspan', iColspan);\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\t\n\t\n\t/**\n\t * Insert the required TR nodes into the table for display\n\t *  @param {object} oSettings dataTables settings object\n\t *  @param ajaxComplete true after ajax call to complete rendering\n\t *  @memberof DataTable#oApi\n\t */\n\tfunction _fnDraw( oSettings, ajaxComplete )\n\t{\n\t\t// Allow for state saving and a custom start position\n\t\t_fnStart( oSettings );\n\t\n\t\t/* Provide a pre-callback function which can be used to cancel the draw is false is returned */\n\t\tvar aPreDraw = _fnCallbackFire( oSettings, 'aoPreDrawCallback', 'preDraw', [oSettings] );\n\t\tif ( $.inArray( false, aPreDraw ) !== -1 )\n\t\t{\n\t\t\t_fnProcessingDisplay( oSettings, false );\n\t\t\treturn;\n\t\t}\n\t\n\t\tvar anRows = [];\n\t\tvar iRowCount = 0;\n\t\tvar asStripeClasses = oSettings.asStripeClasses;\n\t\tvar iStripes = asStripeClasses.length;\n\t\tvar oLang = oSettings.oLanguage;\n\t\tvar bServerSide = _fnDataSource( oSettings ) == 'ssp';\n\t\tvar aiDisplay = oSettings.aiDisplay;\n\t\tvar iDisplayStart = oSettings._iDisplayStart;\n\t\tvar iDisplayEnd = oSettings.fnDisplayEnd();\n\t\n\t\toSettings.bDrawing = true;\n\t\n\t\t/* Server-side processing draw intercept */\n\t\tif ( oSettings.bDeferLoading )\n\t\t{\n\t\t\toSettings.bDeferLoading = false;\n\t\t\toSettings.iDraw++;\n\t\t\t_fnProcessingDisplay( oSettings, false );\n\t\t}\n\t\telse if ( !bServerSide )\n\t\t{\n\t\t\toSettings.iDraw++;\n\t\t}\n\t\telse if ( !oSettings.bDestroying && !ajaxComplete)\n\t\t{\n\t\t\t_fnAjaxUpdate( oSettings );\n\t\t\treturn;\n\t\t}\n\t\n\t\tif ( aiDisplay.length !== 0 )\n\t\t{\n\t\t\tvar iStart = bServerSide ? 0 : iDisplayStart;\n\t\t\tvar iEnd = bServerSide ? oSettings.aoData.length : iDisplayEnd;\n\t\n\t\t\tfor ( var j=iStart ; j<iEnd ; j++ )\n\t\t\t{\n\t\t\t\tvar iDataIndex = aiDisplay[j];\n\t\t\t\tvar aoData = oSettings.aoData[ iDataIndex ];\n\t\t\t\tif ( aoData.nTr === null )\n\t\t\t\t{\n\t\t\t\t\t_fnCreateTr( oSettings, iDataIndex );\n\t\t\t\t}\n\t\n\t\t\t\tvar nRow = aoData.nTr;\n\t\n\t\t\t\t/* Remove the old striping classes and then add the new one */\n\t\t\t\tif ( iStripes !== 0 )\n\t\t\t\t{\n\t\t\t\t\tvar sStripe = asStripeClasses[ iRowCount % iStripes ];\n\t\t\t\t\tif ( aoData._sRowStripe != sStripe )\n\t\t\t\t\t{\n\t\t\t\t\t\t$(nRow).removeClass( aoData._sRowStripe ).addClass( sStripe );\n\t\t\t\t\t\taoData._sRowStripe = sStripe;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\n\t\t\t\t// Row callback functions - might want to manipulate the row\n\t\t\t\t// iRowCount and j are not currently documented. Are they at all\n\t\t\t\t// useful?\n\t\t\t\t_fnCallbackFire( oSettings, 'aoRowCallback', null,\n\t\t\t\t\t[nRow, aoData._aData, iRowCount, j, iDataIndex] );\n\t\n\t\t\t\tanRows.push( nRow );\n\t\t\t\tiRowCount++;\n\t\t\t}\n\t\t}\n\t\telse\n\t\t{\n\t\t\t/* Table is empty - create a row with an empty message in it */\n\t\t\tvar sZero = oLang.sZeroRecords;\n\t\t\tif ( oSettings.iDraw == 1 &&  _fnDataSource( oSettings ) == 'ajax' )\n\t\t\t{\n\t\t\t\tsZero = oLang.sLoadingRecords;\n\t\t\t}\n\t\t\telse if ( oLang.sEmptyTable && oSettings.fnRecordsTotal() === 0 )\n\t\t\t{\n\t\t\t\tsZero = oLang.sEmptyTable;\n\t\t\t}\n\t\n\t\t\tanRows[ 0 ] = $( '<tr/>', { 'class': iStripes ? asStripeClasses[0] : '' } )\n\t\t\t\t.append( $('<td />', {\n\t\t\t\t\t'valign':  'top',\n\t\t\t\t\t'colSpan': _fnVisbleColumns( oSettings ),\n\t\t\t\t\t'class':   oSettings.oClasses.sRowEmpty\n\t\t\t\t} ).html( sZero ) )[0];\n\t\t}\n\t\n\t\t/* Header and footer callbacks */\n\t\t_fnCallbackFire( oSettings, 'aoHeaderCallback', 'header', [ $(oSettings.nTHead).children('tr')[0],\n\t\t\t_fnGetDataMaster( oSettings ), iDisplayStart, iDisplayEnd, aiDisplay ] );\n\t\n\t\t_fnCallbackFire( oSettings, 'aoFooterCallback', 'footer', [ $(oSettings.nTFoot).children('tr')[0],\n\t\t\t_fnGetDataMaster( oSettings ), iDisplayStart, iDisplayEnd, aiDisplay ] );\n\t\n\t\tvar body = $(oSettings.nTBody);\n\t\n\t\tbody.children().detach();\n\t\tbody.append( $(anRows) );\n\t\n\t\t/* Call all required callback functions for the end of a draw */\n\t\t_fnCallbackFire( oSettings, 'aoDrawCallback', 'draw', [oSettings] );\n\t\n\t\t/* Draw is complete, sorting and filtering must be as well */\n\t\toSettings.bSorted = false;\n\t\toSettings.bFiltered = false;\n\t\toSettings.bDrawing = false;\n\t}\n\t\n\t\n\t/**\n\t * Redraw the table - taking account of the various features which are enabled\n\t *  @param {object} oSettings dataTables settings object\n\t *  @param {boolean} [holdPosition] Keep the current paging position. By default\n\t *    the paging is reset to the first page\n\t *  @memberof DataTable#oApi\n\t */\n\tfunction _fnReDraw( settings, holdPosition )\n\t{\n\t\tvar\n\t\t\tfeatures = settings.oFeatures,\n\t\t\tsort     = features.bSort,\n\t\t\tfilter   = features.bFilter;\n\t\n\t\tif ( sort ) {\n\t\t\t_fnSort( settings );\n\t\t}\n\t\n\t\tif ( filter ) {\n\t\t\t_fnFilterComplete( settings, settings.oPreviousSearch );\n\t\t}\n\t\telse {\n\t\t\t// No filtering, so we want to just use the display master\n\t\t\tsettings.aiDisplay = settings.aiDisplayMaster.slice();\n\t\t}\n\t\n\t\tif ( holdPosition !== true ) {\n\t\t\tsettings._iDisplayStart = 0;\n\t\t}\n\t\n\t\t// Let any modules know about the draw hold position state (used by\n\t\t// scrolling internally)\n\t\tsettings._drawHold = holdPosition;\n\t\n\t\t_fnDraw( settings );\n\t\n\t\tsettings._drawHold = false;\n\t}\n\t\n\t\n\t/**\n\t * Add the options to the page HTML for the table\n\t *  @param {object} oSettings dataTables settings object\n\t *  @memberof DataTable#oApi\n\t */\n\tfunction _fnAddOptionsHtml ( oSettings )\n\t{\n\t\tvar classes = oSettings.oClasses;\n\t\tvar table = $(oSettings.nTable);\n\t\tvar holding = $('<div/>').insertBefore( table ); // Holding element for speed\n\t\tvar features = oSettings.oFeatures;\n\t\n\t\t// All DataTables are wrapped in a div\n\t\tvar insert = $('<div/>', {\n\t\t\tid:      oSettings.sTableId+'_wrapper',\n\t\t\t'class': classes.sWrapper + (oSettings.nTFoot ? '' : ' '+classes.sNoFooter)\n\t\t} );\n\t\n\t\toSettings.nHolding = holding[0];\n\t\toSettings.nTableWrapper = insert[0];\n\t\toSettings.nTableReinsertBefore = oSettings.nTable.nextSibling;\n\t\n\t\t/* Loop over the user set positioning and place the elements as needed */\n\t\tvar aDom = oSettings.sDom.split('');\n\t\tvar featureNode, cOption, nNewNode, cNext, sAttr, j;\n\t\tfor ( var i=0 ; i<aDom.length ; i++ )\n\t\t{\n\t\t\tfeatureNode = null;\n\t\t\tcOption = aDom[i];\n\t\n\t\t\tif ( cOption == '<' )\n\t\t\t{\n\t\t\t\t/* New container div */\n\t\t\t\tnNewNode = $('<div/>')[0];\n\t\n\t\t\t\t/* Check to see if we should append an id and/or a class name to the container */\n\t\t\t\tcNext = aDom[i+1];\n\t\t\t\tif ( cNext == \"'\" || cNext == '\"' )\n\t\t\t\t{\n\t\t\t\t\tsAttr = \"\";\n\t\t\t\t\tj = 2;\n\t\t\t\t\twhile ( aDom[i+j] != cNext )\n\t\t\t\t\t{\n\t\t\t\t\t\tsAttr += aDom[i+j];\n\t\t\t\t\t\tj++;\n\t\t\t\t\t}\n\t\n\t\t\t\t\t/* Replace jQuery UI constants @todo depreciated */\n\t\t\t\t\tif ( sAttr == \"H\" )\n\t\t\t\t\t{\n\t\t\t\t\t\tsAttr = classes.sJUIHeader;\n\t\t\t\t\t}\n\t\t\t\t\telse if ( sAttr == \"F\" )\n\t\t\t\t\t{\n\t\t\t\t\t\tsAttr = classes.sJUIFooter;\n\t\t\t\t\t}\n\t\n\t\t\t\t\t/* The attribute can be in the format of \"#id.class\", \"#id\" or \"class\" This logic\n\t\t\t\t\t * breaks the string into parts and applies them as needed\n\t\t\t\t\t */\n\t\t\t\t\tif ( sAttr.indexOf('.') != -1 )\n\t\t\t\t\t{\n\t\t\t\t\t\tvar aSplit = sAttr.split('.');\n\t\t\t\t\t\tnNewNode.id = aSplit[0].substr(1, aSplit[0].length-1);\n\t\t\t\t\t\tnNewNode.className = aSplit[1];\n\t\t\t\t\t}\n\t\t\t\t\telse if ( sAttr.charAt(0) == \"#\" )\n\t\t\t\t\t{\n\t\t\t\t\t\tnNewNode.id = sAttr.substr(1, sAttr.length-1);\n\t\t\t\t\t}\n\t\t\t\t\telse\n\t\t\t\t\t{\n\t\t\t\t\t\tnNewNode.className = sAttr;\n\t\t\t\t\t}\n\t\n\t\t\t\t\ti += j; /* Move along the position array */\n\t\t\t\t}\n\t\n\t\t\t\tinsert.append( nNewNode );\n\t\t\t\tinsert = $(nNewNode);\n\t\t\t}\n\t\t\telse if ( cOption == '>' )\n\t\t\t{\n\t\t\t\t/* End container div */\n\t\t\t\tinsert = insert.parent();\n\t\t\t}\n\t\t\t// @todo Move options into their own plugins?\n\t\t\telse if ( cOption == 'l' && features.bPaginate && features.bLengthChange )\n\t\t\t{\n\t\t\t\t/* Length */\n\t\t\t\tfeatureNode = _fnFeatureHtmlLength( oSettings );\n\t\t\t}\n\t\t\telse if ( cOption == 'f' && features.bFilter )\n\t\t\t{\n\t\t\t\t/* Filter */\n\t\t\t\tfeatureNode = _fnFeatureHtmlFilter( oSettings );\n\t\t\t}\n\t\t\telse if ( cOption == 'r' && features.bProcessing )\n\t\t\t{\n\t\t\t\t/* pRocessing */\n\t\t\t\tfeatureNode = _fnFeatureHtmlProcessing( oSettings );\n\t\t\t}\n\t\t\telse if ( cOption == 't' )\n\t\t\t{\n\t\t\t\t/* Table */\n\t\t\t\tfeatureNode = _fnFeatureHtmlTable( oSettings );\n\t\t\t}\n\t\t\telse if ( cOption ==  'i' && features.bInfo )\n\t\t\t{\n\t\t\t\t/* Info */\n\t\t\t\tfeatureNode = _fnFeatureHtmlInfo( oSettings );\n\t\t\t}\n\t\t\telse if ( cOption == 'p' && features.bPaginate )\n\t\t\t{\n\t\t\t\t/* Pagination */\n\t\t\t\tfeatureNode = _fnFeatureHtmlPaginate( oSettings );\n\t\t\t}\n\t\t\telse if ( DataTable.ext.feature.length !== 0 )\n\t\t\t{\n\t\t\t\t/* Plug-in features */\n\t\t\t\tvar aoFeatures = DataTable.ext.feature;\n\t\t\t\tfor ( var k=0, kLen=aoFeatures.length ; k<kLen ; k++ )\n\t\t\t\t{\n\t\t\t\t\tif ( cOption == aoFeatures[k].cFeature )\n\t\t\t\t\t{\n\t\t\t\t\t\tfeatureNode = aoFeatures[k].fnInit( oSettings );\n\t\t\t\t\t\tbreak;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\n\t\t\t/* Add to the 2D features array */\n\t\t\tif ( featureNode )\n\t\t\t{\n\t\t\t\tvar aanFeatures = oSettings.aanFeatures;\n\t\n\t\t\t\tif ( ! aanFeatures[cOption] )\n\t\t\t\t{\n\t\t\t\t\taanFeatures[cOption] = [];\n\t\t\t\t}\n\t\n\t\t\t\taanFeatures[cOption].push( featureNode );\n\t\t\t\tinsert.append( featureNode );\n\t\t\t}\n\t\t}\n\t\n\t\t/* Built our DOM structure - replace the holding div with what we want */\n\t\tholding.replaceWith( insert );\n\t\toSettings.nHolding = null;\n\t}\n\t\n\t\n\t/**\n\t * Use the DOM source to create up an array of header cells. The idea here is to\n\t * create a layout grid (array) of rows x columns, which contains a reference\n\t * to the cell that that point in the grid (regardless of col/rowspan), such that\n\t * any column / row could be removed and the new grid constructed\n\t *  @param array {object} aLayout Array to store the calculated layout in\n\t *  @param {node} nThead The header/footer element for the table\n\t *  @memberof DataTable#oApi\n\t */\n\tfunction _fnDetectHeader ( aLayout, nThead )\n\t{\n\t\tvar nTrs = $(nThead).children('tr');\n\t\tvar nTr, nCell;\n\t\tvar i, k, l, iLen, jLen, iColShifted, iColumn, iColspan, iRowspan;\n\t\tvar bUnique;\n\t\tvar fnShiftCol = function ( a, i, j ) {\n\t\t\tvar k = a[i];\n\t                while ( k[j] ) {\n\t\t\t\tj++;\n\t\t\t}\n\t\t\treturn j;\n\t\t};\n\t\n\t\taLayout.splice( 0, aLayout.length );\n\t\n\t\t/* We know how many rows there are in the layout - so prep it */\n\t\tfor ( i=0, iLen=nTrs.length ; i<iLen ; i++ )\n\t\t{\n\t\t\taLayout.push( [] );\n\t\t}\n\t\n\t\t/* Calculate a layout array */\n\t\tfor ( i=0, iLen=nTrs.length ; i<iLen ; i++ )\n\t\t{\n\t\t\tnTr = nTrs[i];\n\t\t\tiColumn = 0;\n\t\n\t\t\t/* For every cell in the row... */\n\t\t\tnCell = nTr.firstChild;\n\t\t\twhile ( nCell ) {\n\t\t\t\tif ( nCell.nodeName.toUpperCase() == \"TD\" ||\n\t\t\t\t     nCell.nodeName.toUpperCase() == \"TH\" )\n\t\t\t\t{\n\t\t\t\t\t/* Get the col and rowspan attributes from the DOM and sanitise them */\n\t\t\t\t\tiColspan = nCell.getAttribute('colspan') * 1;\n\t\t\t\t\tiRowspan = nCell.getAttribute('rowspan') * 1;\n\t\t\t\t\tiColspan = (!iColspan || iColspan===0 || iColspan===1) ? 1 : iColspan;\n\t\t\t\t\tiRowspan = (!iRowspan || iRowspan===0 || iRowspan===1) ? 1 : iRowspan;\n\t\n\t\t\t\t\t/* There might be colspan cells already in this row, so shift our target\n\t\t\t\t\t * accordingly\n\t\t\t\t\t */\n\t\t\t\t\tiColShifted = fnShiftCol( aLayout, i, iColumn );\n\t\n\t\t\t\t\t/* Cache calculation for unique columns */\n\t\t\t\t\tbUnique = iColspan === 1 ? true : false;\n\t\n\t\t\t\t\t/* If there is col / rowspan, copy the information into the layout grid */\n\t\t\t\t\tfor ( l=0 ; l<iColspan ; l++ )\n\t\t\t\t\t{\n\t\t\t\t\t\tfor ( k=0 ; k<iRowspan ; k++ )\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\taLayout[i+k][iColShifted+l] = {\n\t\t\t\t\t\t\t\t\"cell\": nCell,\n\t\t\t\t\t\t\t\t\"unique\": bUnique\n\t\t\t\t\t\t\t};\n\t\t\t\t\t\t\taLayout[i+k].nTr = nTr;\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\tnCell = nCell.nextSibling;\n\t\t\t}\n\t\t}\n\t}\n\t\n\t\n\t/**\n\t * Get an array of unique th elements, one for each column\n\t *  @param {object} oSettings dataTables settings object\n\t *  @param {node} nHeader automatically detect the layout from this node - optional\n\t *  @param {array} aLayout thead/tfoot layout from _fnDetectHeader - optional\n\t *  @returns array {node} aReturn list of unique th's\n\t *  @memberof DataTable#oApi\n\t */\n\tfunction _fnGetUniqueThs ( oSettings, nHeader, aLayout )\n\t{\n\t\tvar aReturn = [];\n\t\tif ( !aLayout )\n\t\t{\n\t\t\taLayout = oSettings.aoHeader;\n\t\t\tif ( nHeader )\n\t\t\t{\n\t\t\t\taLayout = [];\n\t\t\t\t_fnDetectHeader( aLayout, nHeader );\n\t\t\t}\n\t\t}\n\t\n\t\tfor ( var i=0, iLen=aLayout.length ; i<iLen ; i++ )\n\t\t{\n\t\t\tfor ( var j=0, jLen=aLayout[i].length ; j<jLen ; j++ )\n\t\t\t{\n\t\t\t\tif ( aLayout[i][j].unique &&\n\t\t\t\t\t (!aReturn[j] || !oSettings.bSortCellsTop) )\n\t\t\t\t{\n\t\t\t\t\taReturn[j] = aLayout[i][j].cell;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\n\t\treturn aReturn;\n\t}\n\t\n\t/**\n\t * Set the start position for draw\n\t *  @param {object} oSettings dataTables settings object\n\t */\n\tfunction _fnStart( oSettings )\n\t{\n\t\tvar bServerSide = _fnDataSource( oSettings ) == 'ssp';\n\t\tvar iInitDisplayStart = oSettings.iInitDisplayStart;\n\t\n\t\t// Check and see if we have an initial draw position from state saving\n\t\tif ( iInitDisplayStart !== undefined && iInitDisplayStart !== -1 )\n\t\t{\n\t\t\toSettings._iDisplayStart = bServerSide ?\n\t\t\t\tiInitDisplayStart :\n\t\t\t\tiInitDisplayStart >= oSettings.fnRecordsDisplay() ?\n\t\t\t\t\t0 :\n\t\t\t\t\tiInitDisplayStart;\n\t\n\t\t\toSettings.iInitDisplayStart = -1;\n\t\t}\n\t}\n\t\n\t/**\n\t * Create an Ajax call based on the table's settings, taking into account that\n\t * parameters can have multiple forms, and backwards compatibility.\n\t *\n\t * @param {object} oSettings dataTables settings object\n\t * @param {array} data Data to send to the server, required by\n\t *     DataTables - may be augmented by developer callbacks\n\t * @param {function} fn Callback function to run when data is obtained\n\t */\n\tfunction _fnBuildAjax( oSettings, data, fn )\n\t{\n\t\t// Compatibility with 1.9-, allow fnServerData and event to manipulate\n\t\t_fnCallbackFire( oSettings, 'aoServerParams', 'serverParams', [data] );\n\t\n\t\t// Convert to object based for 1.10+ if using the old array scheme which can\n\t\t// come from server-side processing or serverParams\n\t\tif ( data && Array.isArray(data) ) {\n\t\t\tvar tmp = {};\n\t\t\tvar rbracket = /(.*?)\\[\\]$/;\n\t\n\t\t\t$.each( data, function (key, val) {\n\t\t\t\tvar match = val.name.match(rbracket);\n\t\n\t\t\t\tif ( match ) {\n\t\t\t\t\t// Support for arrays\n\t\t\t\t\tvar name = match[0];\n\t\n\t\t\t\t\tif ( ! tmp[ name ] ) {\n\t\t\t\t\t\ttmp[ name ] = [];\n\t\t\t\t\t}\n\t\t\t\t\ttmp[ name ].push( val.value );\n\t\t\t\t}\n\t\t\t\telse {\n\t\t\t\t\ttmp[val.name] = val.value;\n\t\t\t\t}\n\t\t\t} );\n\t\t\tdata = tmp;\n\t\t}\n\t\n\t\tvar ajaxData;\n\t\tvar ajax = oSettings.ajax;\n\t\tvar instance = oSettings.oInstance;\n\t\tvar callback = function ( json ) {\n\t\t\tvar status = oSettings.jqXHR\n\t\t\t\t? oSettings.jqXHR.status\n\t\t\t\t: null;\n\t\n\t\t\tif ( json === null || (typeof status === 'number' && status == 204 ) ) {\n\t\t\t\tjson = {};\n\t\t\t\t_fnAjaxDataSrc( oSettings, json, [] );\n\t\t\t}\n\t\n\t\t\tvar error = json.error || json.sError;\n\t\t\tif ( error ) {\n\t\t\t\t_fnLog( oSettings, 0, error );\n\t\t\t}\n\t\n\t\t\toSettings.json = json;\n\t\n\t\t\t_fnCallbackFire( oSettings, null, 'xhr', [oSettings, json, oSettings.jqXHR] );\n\t\t\tfn( json );\n\t\t};\n\t\n\t\tif ( $.isPlainObject( ajax ) && ajax.data )\n\t\t{\n\t\t\tajaxData = ajax.data;\n\t\n\t\t\tvar newData = typeof ajaxData === 'function' ?\n\t\t\t\tajaxData( data, oSettings ) :  // fn can manipulate data or return\n\t\t\t\tajaxData;                      // an object object or array to merge\n\t\n\t\t\t// If the function returned something, use that alone\n\t\t\tdata = typeof ajaxData === 'function' && newData ?\n\t\t\t\tnewData :\n\t\t\t\t$.extend( true, data, newData );\n\t\n\t\t\t// Remove the data property as we've resolved it already and don't want\n\t\t\t// jQuery to do it again (it is restored at the end of the function)\n\t\t\tdelete ajax.data;\n\t\t}\n\t\n\t\tvar baseAjax = {\n\t\t\t\"data\": data,\n\t\t\t\"success\": callback,\n\t\t\t\"dataType\": \"json\",\n\t\t\t\"cache\": false,\n\t\t\t\"type\": oSettings.sServerMethod,\n\t\t\t\"error\": function (xhr, error, thrown) {\n\t\t\t\tvar ret = _fnCallbackFire( oSettings, null, 'xhr', [oSettings, null, oSettings.jqXHR] );\n\t\n\t\t\t\tif ( $.inArray( true, ret ) === -1 ) {\n\t\t\t\t\tif ( error == \"parsererror\" ) {\n\t\t\t\t\t\t_fnLog( oSettings, 0, 'Invalid JSON response', 1 );\n\t\t\t\t\t}\n\t\t\t\t\telse if ( xhr.readyState === 4 ) {\n\t\t\t\t\t\t_fnLog( oSettings, 0, 'Ajax error', 7 );\n\t\t\t\t\t}\n\t\t\t\t}\n\t\n\t\t\t\t_fnProcessingDisplay( oSettings, false );\n\t\t\t}\n\t\t};\n\t\n\t\t// Store the data submitted for the API\n\t\toSettings.oAjaxData = data;\n\t\n\t\t// Allow plug-ins and external processes to modify the data\n\t\t_fnCallbackFire( oSettings, null, 'preXhr', [oSettings, data] );\n\t\n\t\tif ( oSettings.fnServerData )\n\t\t{\n\t\t\t// DataTables 1.9- compatibility\n\t\t\toSettings.fnServerData.call( instance,\n\t\t\t\toSettings.sAjaxSource,\n\t\t\t\t$.map( data, function (val, key) { // Need to convert back to 1.9 trad format\n\t\t\t\t\treturn { name: key, value: val };\n\t\t\t\t} ),\n\t\t\t\tcallback,\n\t\t\t\toSettings\n\t\t\t);\n\t\t}\n\t\telse if ( oSettings.sAjaxSource || typeof ajax === 'string' )\n\t\t{\n\t\t\t// DataTables 1.9- compatibility\n\t\t\toSettings.jqXHR = $.ajax( $.extend( baseAjax, {\n\t\t\t\turl: ajax || oSettings.sAjaxSource\n\t\t\t} ) );\n\t\t}\n\t\telse if ( typeof ajax === 'function' )\n\t\t{\n\t\t\t// Is a function - let the caller define what needs to be done\n\t\t\toSettings.jqXHR = ajax.call( instance, data, callback, oSettings );\n\t\t}\n\t\telse\n\t\t{\n\t\t\t// Object to extend the base settings\n\t\t\toSettings.jqXHR = $.ajax( $.extend( baseAjax, ajax ) );\n\t\n\t\t\t// Restore for next time around\n\t\t\tajax.data = ajaxData;\n\t\t}\n\t}\n\t\n\t\n\t/**\n\t * Update the table using an Ajax call\n\t *  @param {object} settings dataTables settings object\n\t *  @returns {boolean} Block the table drawing or not\n\t *  @memberof DataTable#oApi\n\t */\n\tfunction _fnAjaxUpdate( settings )\n\t{\n\t\tsettings.iDraw++;\n\t\t_fnProcessingDisplay( settings, true );\n\t\n\t\t_fnBuildAjax(\n\t\t\tsettings,\n\t\t\t_fnAjaxParameters( settings ),\n\t\t\tfunction(json) {\n\t\t\t\t_fnAjaxUpdateDraw( settings, json );\n\t\t\t}\n\t\t);\n\t}\n\t\n\t\n\t/**\n\t * Build up the parameters in an object needed for a server-side processing\n\t * request. Note that this is basically done twice, is different ways - a modern\n\t * method which is used by default in DataTables 1.10 which uses objects and\n\t * arrays, or the 1.9- method with is name / value pairs. 1.9 method is used if\n\t * the sAjaxSource option is used in the initialisation, or the legacyAjax\n\t * option is set.\n\t *  @param {object} oSettings dataTables settings object\n\t *  @returns {bool} block the table drawing or not\n\t *  @memberof DataTable#oApi\n\t */\n\tfunction _fnAjaxParameters( settings )\n\t{\n\t\tvar\n\t\t\tcolumns = settings.aoColumns,\n\t\t\tcolumnCount = columns.length,\n\t\t\tfeatures = settings.oFeatures,\n\t\t\tpreSearch = settings.oPreviousSearch,\n\t\t\tpreColSearch = settings.aoPreSearchCols,\n\t\t\ti, data = [], dataProp, column, columnSearch,\n\t\t\tsort = _fnSortFlatten( settings ),\n\t\t\tdisplayStart = settings._iDisplayStart,\n\t\t\tdisplayLength = features.bPaginate !== false ?\n\t\t\t\tsettings._iDisplayLength :\n\t\t\t\t-1;\n\t\n\t\tvar param = function ( name, value ) {\n\t\t\tdata.push( { 'name': name, 'value': value } );\n\t\t};\n\t\n\t\t// DataTables 1.9- compatible method\n\t\tparam( 'sEcho',          settings.iDraw );\n\t\tparam( 'iColumns',       columnCount );\n\t\tparam( 'sColumns',       _pluck( columns, 'sName' ).join(',') );\n\t\tparam( 'iDisplayStart',  displayStart );\n\t\tparam( 'iDisplayLength', displayLength );\n\t\n\t\t// DataTables 1.10+ method\n\t\tvar d = {\n\t\t\tdraw:    settings.iDraw,\n\t\t\tcolumns: [],\n\t\t\torder:   [],\n\t\t\tstart:   displayStart,\n\t\t\tlength:  displayLength,\n\t\t\tsearch:  {\n\t\t\t\tvalue: preSearch.sSearch,\n\t\t\t\tregex: preSearch.bRegex\n\t\t\t}\n\t\t};\n\t\n\t\tfor ( i=0 ; i<columnCount ; i++ ) {\n\t\t\tcolumn = columns[i];\n\t\t\tcolumnSearch = preColSearch[i];\n\t\t\tdataProp = typeof column.mData==\"function\" ? 'function' : column.mData ;\n\t\n\t\t\td.columns.push( {\n\t\t\t\tdata:       dataProp,\n\t\t\t\tname:       column.sName,\n\t\t\t\tsearchable: column.bSearchable,\n\t\t\t\torderable:  column.bSortable,\n\t\t\t\tsearch:     {\n\t\t\t\t\tvalue: columnSearch.sSearch,\n\t\t\t\t\tregex: columnSearch.bRegex\n\t\t\t\t}\n\t\t\t} );\n\t\n\t\t\tparam( \"mDataProp_\"+i, dataProp );\n\t\n\t\t\tif ( features.bFilter ) {\n\t\t\t\tparam( 'sSearch_'+i,     columnSearch.sSearch );\n\t\t\t\tparam( 'bRegex_'+i,      columnSearch.bRegex );\n\t\t\t\tparam( 'bSearchable_'+i, column.bSearchable );\n\t\t\t}\n\t\n\t\t\tif ( features.bSort ) {\n\t\t\t\tparam( 'bSortable_'+i, column.bSortable );\n\t\t\t}\n\t\t}\n\t\n\t\tif ( features.bFilter ) {\n\t\t\tparam( 'sSearch', preSearch.sSearch );\n\t\t\tparam( 'bRegex', preSearch.bRegex );\n\t\t}\n\t\n\t\tif ( features.bSort ) {\n\t\t\t$.each( sort, function ( i, val ) {\n\t\t\t\td.order.push( { column: val.col, dir: val.dir } );\n\t\n\t\t\t\tparam( 'iSortCol_'+i, val.col );\n\t\t\t\tparam( 'sSortDir_'+i, val.dir );\n\t\t\t} );\n\t\n\t\t\tparam( 'iSortingCols', sort.length );\n\t\t}\n\t\n\t\t// If the legacy.ajax parameter is null, then we automatically decide which\n\t\t// form to use, based on sAjaxSource\n\t\tvar legacy = DataTable.ext.legacy.ajax;\n\t\tif ( legacy === null ) {\n\t\t\treturn settings.sAjaxSource ? data : d;\n\t\t}\n\t\n\t\t// Otherwise, if legacy has been specified then we use that to decide on the\n\t\t// form\n\t\treturn legacy ? data : d;\n\t}\n\t\n\t\n\t/**\n\t * Data the data from the server (nuking the old) and redraw the table\n\t *  @param {object} oSettings dataTables settings object\n\t *  @param {object} json json data return from the server.\n\t *  @param {string} json.sEcho Tracking flag for DataTables to match requests\n\t *  @param {int} json.iTotalRecords Number of records in the data set, not accounting for filtering\n\t *  @param {int} json.iTotalDisplayRecords Number of records in the data set, accounting for filtering\n\t *  @param {array} json.aaData The data to display on this page\n\t *  @param {string} [json.sColumns] Column ordering (sName, comma separated)\n\t *  @memberof DataTable#oApi\n\t */\n\tfunction _fnAjaxUpdateDraw ( settings, json )\n\t{\n\t\t// v1.10 uses camelCase variables, while 1.9 uses Hungarian notation.\n\t\t// Support both\n\t\tvar compat = function ( old, modern ) {\n\t\t\treturn json[old] !== undefined ? json[old] : json[modern];\n\t\t};\n\t\n\t\tvar data = _fnAjaxDataSrc( settings, json );\n\t\tvar draw            = compat( 'sEcho',                'draw' );\n\t\tvar recordsTotal    = compat( 'iTotalRecords',        'recordsTotal' );\n\t\tvar recordsFiltered = compat( 'iTotalDisplayRecords', 'recordsFiltered' );\n\t\n\t\tif ( draw !== undefined ) {\n\t\t\t// Protect against out of sequence returns\n\t\t\tif ( draw*1 < settings.iDraw ) {\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tsettings.iDraw = draw * 1;\n\t\t}\n\t\n\t\t// No data in returned object, so rather than an array, we show an empty table\n\t\tif ( ! data ) {\n\t\t\tdata = [];\n\t\t}\n\t\n\t\t_fnClearTable( settings );\n\t\tsettings._iRecordsTotal   = parseInt(recordsTotal, 10);\n\t\tsettings._iRecordsDisplay = parseInt(recordsFiltered, 10);\n\t\n\t\tfor ( var i=0, ien=data.length ; i<ien ; i++ ) {\n\t\t\t_fnAddData( settings, data[i] );\n\t\t}\n\t\tsettings.aiDisplay = settings.aiDisplayMaster.slice();\n\t\n\t\t_fnDraw( settings, true );\n\t\n\t\tif ( ! settings._bInitComplete ) {\n\t\t\t_fnInitComplete( settings, json );\n\t\t}\n\t\n\t\t_fnProcessingDisplay( settings, false );\n\t}\n\t\n\t\n\t/**\n\t * Get the data from the JSON data source to use for drawing a table. Using\n\t * `_fnGetObjectDataFn` allows the data to be sourced from a property of the\n\t * source object, or from a processing function.\n\t *  @param {object} oSettings dataTables settings object\n\t *  @param  {object} json Data source object / array from the server\n\t *  @return {array} Array of data to use\n\t */\n\t function _fnAjaxDataSrc ( oSettings, json, write )\n\t {\n\t\tvar dataSrc = $.isPlainObject( oSettings.ajax ) && oSettings.ajax.dataSrc !== undefined ?\n\t\t\toSettings.ajax.dataSrc :\n\t\t\toSettings.sAjaxDataProp; // Compatibility with 1.9-.\n\t\n\t\tif ( ! write ) {\n\t\t\tif ( dataSrc === 'data' ) {\n\t\t\t\t// If the default, then we still want to support the old style, and safely ignore\n\t\t\t\t// it if possible\n\t\t\t\treturn json.aaData || json[dataSrc];\n\t\t\t}\n\t\n\t\t\treturn dataSrc !== \"\" ?\n\t\t\t\t_fnGetObjectDataFn( dataSrc )( json ) :\n\t\t\t\tjson;\n\t\t}\n\t\n\t\t// set\n\t\t_fnSetObjectDataFn( dataSrc )( json, write );\n\t}\n\t\n\t/**\n\t * Generate the node required for filtering text\n\t *  @returns {node} Filter control element\n\t *  @param {object} oSettings dataTables settings object\n\t *  @memberof DataTable#oApi\n\t */\n\tfunction _fnFeatureHtmlFilter ( settings )\n\t{\n\t\tvar classes = settings.oClasses;\n\t\tvar tableId = settings.sTableId;\n\t\tvar language = settings.oLanguage;\n\t\tvar previousSearch = settings.oPreviousSearch;\n\t\tvar features = settings.aanFeatures;\n\t\tvar input = '<input type=\"search\" class=\"'+classes.sFilterInput+'\"/>';\n\t\n\t\tvar str = language.sSearch;\n\t\tstr = str.match(/_INPUT_/) ?\n\t\t\tstr.replace('_INPUT_', input) :\n\t\t\tstr+input;\n\t\n\t\tvar filter = $('<div/>', {\n\t\t\t\t'id': ! features.f ? tableId+'_filter' : null,\n\t\t\t\t'class': classes.sFilter\n\t\t\t} )\n\t\t\t.append( $('<label/>' ).append( str ) );\n\t\n\t\tvar searchFn = function(event) {\n\t\t\t/* Update all other filter input elements for the new display */\n\t\t\tvar n = features.f;\n\t\t\tvar val = !this.value ? \"\" : this.value; // mental IE8 fix :-(\n\t\t\tif(previousSearch.return && event.key !== \"Enter\") {\n\t\t\t\treturn;\n\t\t\t}\n\t\t\t/* Now do the filter */\n\t\t\tif ( val != previousSearch.sSearch ) {\n\t\t\t\t_fnFilterComplete( settings, {\n\t\t\t\t\t\"sSearch\": val,\n\t\t\t\t\t\"bRegex\": previousSearch.bRegex,\n\t\t\t\t\t\"bSmart\": previousSearch.bSmart ,\n\t\t\t\t\t\"bCaseInsensitive\": previousSearch.bCaseInsensitive,\n\t\t\t\t\t\"return\": previousSearch.return\n\t\t\t\t} );\n\t\n\t\t\t\t// Need to redraw, without resorting\n\t\t\t\tsettings._iDisplayStart = 0;\n\t\t\t\t_fnDraw( settings );\n\t\t\t}\n\t\t};\n\t\n\t\tvar searchDelay = settings.searchDelay !== null ?\n\t\t\tsettings.searchDelay :\n\t\t\t_fnDataSource( settings ) === 'ssp' ?\n\t\t\t\t400 :\n\t\t\t\t0;\n\t\n\t\tvar jqFilter = $('input', filter)\n\t\t\t.val( previousSearch.sSearch )\n\t\t\t.attr( 'placeholder', language.sSearchPlaceholder )\n\t\t\t.on(\n\t\t\t\t'keyup.DT search.DT input.DT paste.DT cut.DT',\n\t\t\t\tsearchDelay ?\n\t\t\t\t\t_fnThrottle( searchFn, searchDelay ) :\n\t\t\t\t\tsearchFn\n\t\t\t)\n\t\t\t.on( 'mouseup', function(e) {\n\t\t\t\t// Edge fix! Edge 17 does not trigger anything other than mouse events when clicking\n\t\t\t\t// on the clear icon (Edge bug 17584515). This is safe in other browsers as `searchFn`\n\t\t\t\t// checks the value to see if it has changed. In other browsers it won't have.\n\t\t\t\tsetTimeout( function () {\n\t\t\t\t\tsearchFn.call(jqFilter[0], e);\n\t\t\t\t}, 10);\n\t\t\t} )\n\t\t\t.on( 'keypress.DT', function(e) {\n\t\t\t\t/* Prevent form submission */\n\t\t\t\tif ( e.keyCode == 13 ) {\n\t\t\t\t\treturn false;\n\t\t\t\t}\n\t\t\t} )\n\t\t\t.attr('aria-controls', tableId);\n\t\n\t\t// Update the input elements whenever the table is filtered\n\t\t$(settings.nTable).on( 'search.dt.DT', function ( ev, s ) {\n\t\t\tif ( settings === s ) {\n\t\t\t\t// IE9 throws an 'unknown error' if document.activeElement is used\n\t\t\t\t// inside an iframe or frame...\n\t\t\t\ttry {\n\t\t\t\t\tif ( jqFilter[0] !== document.activeElement ) {\n\t\t\t\t\t\tjqFilter.val( previousSearch.sSearch );\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\tcatch ( e ) {}\n\t\t\t}\n\t\t} );\n\t\n\t\treturn filter[0];\n\t}\n\t\n\t\n\t/**\n\t * Filter the table using both the global filter and column based filtering\n\t *  @param {object} oSettings dataTables settings object\n\t *  @param {object} oSearch search information\n\t *  @param {int} [iForce] force a research of the master array (1) or not (undefined or 0)\n\t *  @memberof DataTable#oApi\n\t */\n\tfunction _fnFilterComplete ( oSettings, oInput, iForce )\n\t{\n\t\tvar oPrevSearch = oSettings.oPreviousSearch;\n\t\tvar aoPrevSearch = oSettings.aoPreSearchCols;\n\t\tvar fnSaveFilter = function ( oFilter ) {\n\t\t\t/* Save the filtering values */\n\t\t\toPrevSearch.sSearch = oFilter.sSearch;\n\t\t\toPrevSearch.bRegex = oFilter.bRegex;\n\t\t\toPrevSearch.bSmart = oFilter.bSmart;\n\t\t\toPrevSearch.bCaseInsensitive = oFilter.bCaseInsensitive;\n\t\t\toPrevSearch.return = oFilter.return;\n\t\t};\n\t\tvar fnRegex = function ( o ) {\n\t\t\t// Backwards compatibility with the bEscapeRegex option\n\t\t\treturn o.bEscapeRegex !== undefined ? !o.bEscapeRegex : o.bRegex;\n\t\t};\n\t\n\t\t// Resolve any column types that are unknown due to addition or invalidation\n\t\t// @todo As per sort - can this be moved into an event handler?\n\t\t_fnColumnTypes( oSettings );\n\t\n\t\t/* In server-side processing all filtering is done by the server, so no point hanging around here */\n\t\tif ( _fnDataSource( oSettings ) != 'ssp' )\n\t\t{\n\t\t\t/* Global filter */\n\t\t\t_fnFilter( oSettings, oInput.sSearch, iForce, fnRegex(oInput), oInput.bSmart, oInput.bCaseInsensitive, oInput.return );\n\t\t\tfnSaveFilter( oInput );\n\t\n\t\t\t/* Now do the individual column filter */\n\t\t\tfor ( var i=0 ; i<aoPrevSearch.length ; i++ )\n\t\t\t{\n\t\t\t\t_fnFilterColumn( oSettings, aoPrevSearch[i].sSearch, i, fnRegex(aoPrevSearch[i]),\n\t\t\t\t\taoPrevSearch[i].bSmart, aoPrevSearch[i].bCaseInsensitive );\n\t\t\t}\n\t\n\t\t\t/* Custom filtering */\n\t\t\t_fnFilterCustom( oSettings );\n\t\t}\n\t\telse\n\t\t{\n\t\t\tfnSaveFilter( oInput );\n\t\t}\n\t\n\t\t/* Tell the draw function we have been filtering */\n\t\toSettings.bFiltered = true;\n\t\t_fnCallbackFire( oSettings, null, 'search', [oSettings] );\n\t}\n\t\n\t\n\t/**\n\t * Apply custom filtering functions\n\t *  @param {object} oSettings dataTables settings object\n\t *  @memberof DataTable#oApi\n\t */\n\tfunction _fnFilterCustom( settings )\n\t{\n\t\tvar filters = DataTable.ext.search;\n\t\tvar displayRows = settings.aiDisplay;\n\t\tvar row, rowIdx;\n\t\n\t\tfor ( var i=0, ien=filters.length ; i<ien ; i++ ) {\n\t\t\tvar rows = [];\n\t\n\t\t\t// Loop over each row and see if it should be included\n\t\t\tfor ( var j=0, jen=displayRows.length ; j<jen ; j++ ) {\n\t\t\t\trowIdx = displayRows[ j ];\n\t\t\t\trow = settings.aoData[ rowIdx ];\n\t\n\t\t\t\tif ( filters[i]( settings, row._aFilterData, rowIdx, row._aData, j ) ) {\n\t\t\t\t\trows.push( rowIdx );\n\t\t\t\t}\n\t\t\t}\n\t\n\t\t\t// So the array reference doesn't break set the results into the\n\t\t\t// existing array\n\t\t\tdisplayRows.length = 0;\n\t\t\t$.merge( displayRows, rows );\n\t\t}\n\t}\n\t\n\t\n\t/**\n\t * Filter the table on a per-column basis\n\t *  @param {object} oSettings dataTables settings object\n\t *  @param {string} sInput string to filter on\n\t *  @param {int} iColumn column to filter\n\t *  @param {bool} bRegex treat search string as a regular expression or not\n\t *  @param {bool} bSmart use smart filtering or not\n\t *  @param {bool} bCaseInsensitive Do case insensitive matching or not\n\t *  @memberof DataTable#oApi\n\t */\n\tfunction _fnFilterColumn ( settings, searchStr, colIdx, regex, smart, caseInsensitive )\n\t{\n\t\tif ( searchStr === '' ) {\n\t\t\treturn;\n\t\t}\n\t\n\t\tvar data;\n\t\tvar out = [];\n\t\tvar display = settings.aiDisplay;\n\t\tvar rpSearch = _fnFilterCreateSearch( searchStr, regex, smart, caseInsensitive );\n\t\n\t\tfor ( var i=0 ; i<display.length ; i++ ) {\n\t\t\tdata = settings.aoData[ display[i] ]._aFilterData[ colIdx ];\n\t\n\t\t\tif ( rpSearch.test( data ) ) {\n\t\t\t\tout.push( display[i] );\n\t\t\t}\n\t\t}\n\t\n\t\tsettings.aiDisplay = out;\n\t}\n\t\n\t\n\t/**\n\t * Filter the data table based on user input and draw the table\n\t *  @param {object} settings dataTables settings object\n\t *  @param {string} input string to filter on\n\t *  @param {int} force optional - force a research of the master array (1) or not (undefined or 0)\n\t *  @param {bool} regex treat as a regular expression or not\n\t *  @param {bool} smart perform smart filtering or not\n\t *  @param {bool} caseInsensitive Do case insensitive matching or not\n\t *  @memberof DataTable#oApi\n\t */\n\tfunction _fnFilter( settings, input, force, regex, smart, caseInsensitive )\n\t{\n\t\tvar rpSearch = _fnFilterCreateSearch( input, regex, smart, caseInsensitive );\n\t\tvar prevSearch = settings.oPreviousSearch.sSearch;\n\t\tvar displayMaster = settings.aiDisplayMaster;\n\t\tvar display, invalidated, i;\n\t\tvar filtered = [];\n\t\n\t\t// Need to take account of custom filtering functions - always filter\n\t\tif ( DataTable.ext.search.length !== 0 ) {\n\t\t\tforce = true;\n\t\t}\n\t\n\t\t// Check if any of the rows were invalidated\n\t\tinvalidated = _fnFilterData( settings );\n\t\n\t\t// If the input is blank - we just want the full data set\n\t\tif ( input.length <= 0 ) {\n\t\t\tsettings.aiDisplay = displayMaster.slice();\n\t\t}\n\t\telse {\n\t\t\t// New search - start from the master array\n\t\t\tif ( invalidated ||\n\t\t\t\t force ||\n\t\t\t\t regex ||\n\t\t\t\t prevSearch.length > input.length ||\n\t\t\t\t input.indexOf(prevSearch) !== 0 ||\n\t\t\t\t settings.bSorted // On resort, the display master needs to be\n\t\t\t\t                  // re-filtered since indexes will have changed\n\t\t\t) {\n\t\t\t\tsettings.aiDisplay = displayMaster.slice();\n\t\t\t}\n\t\n\t\t\t// Search the display array\n\t\t\tdisplay = settings.aiDisplay;\n\t\n\t\t\tfor ( i=0 ; i<display.length ; i++ ) {\n\t\t\t\tif ( rpSearch.test( settings.aoData[ display[i] ]._sFilterRow ) ) {\n\t\t\t\t\tfiltered.push( display[i] );\n\t\t\t\t}\n\t\t\t}\n\t\n\t\t\tsettings.aiDisplay = filtered;\n\t\t}\n\t}\n\t\n\t\n\t/**\n\t * Build a regular expression object suitable for searching a table\n\t *  @param {string} sSearch string to search for\n\t *  @param {bool} bRegex treat as a regular expression or not\n\t *  @param {bool} bSmart perform smart filtering or not\n\t *  @param {bool} bCaseInsensitive Do case insensitive matching or not\n\t *  @returns {RegExp} constructed object\n\t *  @memberof DataTable#oApi\n\t */\n\tfunction _fnFilterCreateSearch( search, regex, smart, caseInsensitive )\n\t{\n\t\tsearch = regex ?\n\t\t\tsearch :\n\t\t\t_fnEscapeRegex( search );\n\t\t\n\t\tif ( smart ) {\n\t\t\t/* For smart filtering we want to allow the search to work regardless of\n\t\t\t * word order. We also want double quoted text to be preserved, so word\n\t\t\t * order is important - a la google. So this is what we want to\n\t\t\t * generate:\n\t\t\t * \n\t\t\t * ^(?=.*?\\bone\\b)(?=.*?\\btwo three\\b)(?=.*?\\bfour\\b).*$\n\t\t\t */\n\t\t\tvar a = $.map( search.match( /\"[^\"]+\"|[^ ]+/g ) || [''], function ( word ) {\n\t\t\t\tif ( word.charAt(0) === '\"' ) {\n\t\t\t\t\tvar m = word.match( /^\"(.*)\"$/ );\n\t\t\t\t\tword = m ? m[1] : word;\n\t\t\t\t}\n\t\n\t\t\t\treturn word.replace('\"', '');\n\t\t\t} );\n\t\n\t\t\tsearch = '^(?=.*?'+a.join( ')(?=.*?' )+').*$';\n\t\t}\n\t\n\t\treturn new RegExp( search, caseInsensitive ? 'i' : '' );\n\t}\n\t\n\t\n\t/**\n\t * Escape a string such that it can be used in a regular expression\n\t *  @param {string} sVal string to escape\n\t *  @returns {string} escaped string\n\t *  @memberof DataTable#oApi\n\t */\n\tvar _fnEscapeRegex = DataTable.util.escapeRegex;\n\t\n\tvar __filter_div = $('<div>')[0];\n\tvar __filter_div_textContent = __filter_div.textContent !== undefined;\n\t\n\t// Update the filtering data for each row if needed (by invalidation or first run)\n\tfunction _fnFilterData ( settings )\n\t{\n\t\tvar columns = settings.aoColumns;\n\t\tvar column;\n\t\tvar i, j, ien, jen, filterData, cellData, row;\n\t\tvar wasInvalidated = false;\n\t\n\t\tfor ( i=0, ien=settings.aoData.length ; i<ien ; i++ ) {\n\t\t\trow = settings.aoData[i];\n\t\n\t\t\tif ( ! row._aFilterData ) {\n\t\t\t\tfilterData = [];\n\t\n\t\t\t\tfor ( j=0, jen=columns.length ; j<jen ; j++ ) {\n\t\t\t\t\tcolumn = columns[j];\n\t\n\t\t\t\t\tif ( column.bSearchable ) {\n\t\t\t\t\t\tcellData = _fnGetCellData( settings, i, j, 'filter' );\n\t\n\t\t\t\t\t\t// Search in DataTables 1.10 is string based. In 1.11 this\n\t\t\t\t\t\t// should be altered to also allow strict type checking.\n\t\t\t\t\t\tif ( cellData === null ) {\n\t\t\t\t\t\t\tcellData = '';\n\t\t\t\t\t\t}\n\t\n\t\t\t\t\t\tif ( typeof cellData !== 'string' && cellData.toString ) {\n\t\t\t\t\t\t\tcellData = cellData.toString();\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t\telse {\n\t\t\t\t\t\tcellData = '';\n\t\t\t\t\t}\n\t\n\t\t\t\t\t// If it looks like there is an HTML entity in the string,\n\t\t\t\t\t// attempt to decode it so sorting works as expected. Note that\n\t\t\t\t\t// we could use a single line of jQuery to do this, but the DOM\n\t\t\t\t\t// method used here is much faster http://jsperf.com/html-decode\n\t\t\t\t\tif ( cellData.indexOf && cellData.indexOf('&') !== -1 ) {\n\t\t\t\t\t\t__filter_div.innerHTML = cellData;\n\t\t\t\t\t\tcellData = __filter_div_textContent ?\n\t\t\t\t\t\t\t__filter_div.textContent :\n\t\t\t\t\t\t\t__filter_div.innerText;\n\t\t\t\t\t}\n\t\n\t\t\t\t\tif ( cellData.replace ) {\n\t\t\t\t\t\tcellData = cellData.replace(/[\\r\\n\\u2028]/g, '');\n\t\t\t\t\t}\n\t\n\t\t\t\t\tfilterData.push( cellData );\n\t\t\t\t}\n\t\n\t\t\t\trow._aFilterData = filterData;\n\t\t\t\trow._sFilterRow = filterData.join('  ');\n\t\t\t\twasInvalidated = true;\n\t\t\t}\n\t\t}\n\t\n\t\treturn wasInvalidated;\n\t}\n\t\n\t\n\t/**\n\t * Convert from the internal Hungarian notation to camelCase for external\n\t * interaction\n\t *  @param {object} obj Object to convert\n\t *  @returns {object} Inverted object\n\t *  @memberof DataTable#oApi\n\t */\n\tfunction _fnSearchToCamel ( obj )\n\t{\n\t\treturn {\n\t\t\tsearch:          obj.sSearch,\n\t\t\tsmart:           obj.bSmart,\n\t\t\tregex:           obj.bRegex,\n\t\t\tcaseInsensitive: obj.bCaseInsensitive\n\t\t};\n\t}\n\t\n\t\n\t\n\t/**\n\t * Convert from camelCase notation to the internal Hungarian. We could use the\n\t * Hungarian convert function here, but this is cleaner\n\t *  @param {object} obj Object to convert\n\t *  @returns {object} Inverted object\n\t *  @memberof DataTable#oApi\n\t */\n\tfunction _fnSearchToHung ( obj )\n\t{\n\t\treturn {\n\t\t\tsSearch:          obj.search,\n\t\t\tbSmart:           obj.smart,\n\t\t\tbRegex:           obj.regex,\n\t\t\tbCaseInsensitive: obj.caseInsensitive\n\t\t};\n\t}\n\t\n\t/**\n\t * Generate the node required for the info display\n\t *  @param {object} oSettings dataTables settings object\n\t *  @returns {node} Information element\n\t *  @memberof DataTable#oApi\n\t */\n\tfunction _fnFeatureHtmlInfo ( settings )\n\t{\n\t\tvar\n\t\t\ttid = settings.sTableId,\n\t\t\tnodes = settings.aanFeatures.i,\n\t\t\tn = $('<div/>', {\n\t\t\t\t'class': settings.oClasses.sInfo,\n\t\t\t\t'id': ! nodes ? tid+'_info' : null\n\t\t\t} );\n\t\n\t\tif ( ! nodes ) {\n\t\t\t// Update display on each draw\n\t\t\tsettings.aoDrawCallback.push( {\n\t\t\t\t\"fn\": _fnUpdateInfo,\n\t\t\t\t\"sName\": \"information\"\n\t\t\t} );\n\t\n\t\t\tn\n\t\t\t\t.attr( 'role', 'status' )\n\t\t\t\t.attr( 'aria-live', 'polite' );\n\t\n\t\t\t// Table is described by our info div\n\t\t\t$(settings.nTable).attr( 'aria-describedby', tid+'_info' );\n\t\t}\n\t\n\t\treturn n[0];\n\t}\n\t\n\t\n\t/**\n\t * Update the information elements in the display\n\t *  @param {object} settings dataTables settings object\n\t *  @memberof DataTable#oApi\n\t */\n\tfunction _fnUpdateInfo ( settings )\n\t{\n\t\t/* Show information about the table */\n\t\tvar nodes = settings.aanFeatures.i;\n\t\tif ( nodes.length === 0 ) {\n\t\t\treturn;\n\t\t}\n\t\n\t\tvar\n\t\t\tlang  = settings.oLanguage,\n\t\t\tstart = settings._iDisplayStart+1,\n\t\t\tend   = settings.fnDisplayEnd(),\n\t\t\tmax   = settings.fnRecordsTotal(),\n\t\t\ttotal = settings.fnRecordsDisplay(),\n\t\t\tout   = total ?\n\t\t\t\tlang.sInfo :\n\t\t\t\tlang.sInfoEmpty;\n\t\n\t\tif ( total !== max ) {\n\t\t\t/* Record set after filtering */\n\t\t\tout += ' ' + lang.sInfoFiltered;\n\t\t}\n\t\n\t\t// Convert the macros\n\t\tout += lang.sInfoPostFix;\n\t\tout = _fnInfoMacros( settings, out );\n\t\n\t\tvar callback = lang.fnInfoCallback;\n\t\tif ( callback !== null ) {\n\t\t\tout = callback.call( settings.oInstance,\n\t\t\t\tsettings, start, end, max, total, out\n\t\t\t);\n\t\t}\n\t\n\t\t$(nodes).html( out );\n\t}\n\t\n\t\n\tfunction _fnInfoMacros ( settings, str )\n\t{\n\t\t// When infinite scrolling, we are always starting at 1. _iDisplayStart is used only\n\t\t// internally\n\t\tvar\n\t\t\tformatter  = settings.fnFormatNumber,\n\t\t\tstart      = settings._iDisplayStart+1,\n\t\t\tlen        = settings._iDisplayLength,\n\t\t\tvis        = settings.fnRecordsDisplay(),\n\t\t\tall        = len === -1;\n\t\n\t\treturn str.\n\t\t\treplace(/_START_/g, formatter.call( settings, start ) ).\n\t\t\treplace(/_END_/g,   formatter.call( settings, settings.fnDisplayEnd() ) ).\n\t\t\treplace(/_MAX_/g,   formatter.call( settings, settings.fnRecordsTotal() ) ).\n\t\t\treplace(/_TOTAL_/g, formatter.call( settings, vis ) ).\n\t\t\treplace(/_PAGE_/g,  formatter.call( settings, all ? 1 : Math.ceil( start / len ) ) ).\n\t\t\treplace(/_PAGES_/g, formatter.call( settings, all ? 1 : Math.ceil( vis / len ) ) );\n\t}\n\t\n\t\n\t\n\t/**\n\t * Draw the table for the first time, adding all required features\n\t *  @param {object} settings dataTables settings object\n\t *  @memberof DataTable#oApi\n\t */\n\tfunction _fnInitialise ( settings )\n\t{\n\t\tvar i, iLen, iAjaxStart=settings.iInitDisplayStart;\n\t\tvar columns = settings.aoColumns, column;\n\t\tvar features = settings.oFeatures;\n\t\tvar deferLoading = settings.bDeferLoading; // value modified by the draw\n\t\n\t\t/* Ensure that the table data is fully initialised */\n\t\tif ( ! settings.bInitialised ) {\n\t\t\tsetTimeout( function(){ _fnInitialise( settings ); }, 200 );\n\t\t\treturn;\n\t\t}\n\t\n\t\t/* Show the display HTML options */\n\t\t_fnAddOptionsHtml( settings );\n\t\n\t\t/* Build and draw the header / footer for the table */\n\t\t_fnBuildHead( settings );\n\t\t_fnDrawHead( settings, settings.aoHeader );\n\t\t_fnDrawHead( settings, settings.aoFooter );\n\t\n\t\t/* Okay to show that something is going on now */\n\t\t_fnProcessingDisplay( settings, true );\n\t\n\t\t/* Calculate sizes for columns */\n\t\tif ( features.bAutoWidth ) {\n\t\t\t_fnCalculateColumnWidths( settings );\n\t\t}\n\t\n\t\tfor ( i=0, iLen=columns.length ; i<iLen ; i++ ) {\n\t\t\tcolumn = columns[i];\n\t\n\t\t\tif ( column.sWidth ) {\n\t\t\t\tcolumn.nTh.style.width = _fnStringToCss( column.sWidth );\n\t\t\t}\n\t\t}\n\t\n\t\t_fnCallbackFire( settings, null, 'preInit', [settings] );\n\t\n\t\t// If there is default sorting required - let's do it. The sort function\n\t\t// will do the drawing for us. Otherwise we draw the table regardless of the\n\t\t// Ajax source - this allows the table to look initialised for Ajax sourcing\n\t\t// data (show 'loading' message possibly)\n\t\t_fnReDraw( settings );\n\t\n\t\t// Server-side processing init complete is done by _fnAjaxUpdateDraw\n\t\tvar dataSrc = _fnDataSource( settings );\n\t\tif ( dataSrc != 'ssp' || deferLoading ) {\n\t\t\t// if there is an ajax source load the data\n\t\t\tif ( dataSrc == 'ajax' ) {\n\t\t\t\t_fnBuildAjax( settings, [], function(json) {\n\t\t\t\t\tvar aData = _fnAjaxDataSrc( settings, json );\n\t\n\t\t\t\t\t// Got the data - add it to the table\n\t\t\t\t\tfor ( i=0 ; i<aData.length ; i++ ) {\n\t\t\t\t\t\t_fnAddData( settings, aData[i] );\n\t\t\t\t\t}\n\t\n\t\t\t\t\t// Reset the init display for cookie saving. We've already done\n\t\t\t\t\t// a filter, and therefore cleared it before. So we need to make\n\t\t\t\t\t// it appear 'fresh'\n\t\t\t\t\tsettings.iInitDisplayStart = iAjaxStart;\n\t\n\t\t\t\t\t_fnReDraw( settings );\n\t\n\t\t\t\t\t_fnProcessingDisplay( settings, false );\n\t\t\t\t\t_fnInitComplete( settings, json );\n\t\t\t\t}, settings );\n\t\t\t}\n\t\t\telse {\n\t\t\t\t_fnProcessingDisplay( settings, false );\n\t\t\t\t_fnInitComplete( settings );\n\t\t\t}\n\t\t}\n\t}\n\t\n\t\n\t/**\n\t * Draw the table for the first time, adding all required features\n\t *  @param {object} oSettings dataTables settings object\n\t *  @param {object} [json] JSON from the server that completed the table, if using Ajax source\n\t *    with client-side processing (optional)\n\t *  @memberof DataTable#oApi\n\t */\n\tfunction _fnInitComplete ( settings, json )\n\t{\n\t\tsettings._bInitComplete = true;\n\t\n\t\t// When data was added after the initialisation (data or Ajax) we need to\n\t\t// calculate the column sizing\n\t\tif ( json || settings.oInit.aaData ) {\n\t\t\t_fnAdjustColumnSizing( settings );\n\t\t}\n\t\n\t\t_fnCallbackFire( settings, null, 'plugin-init', [settings, json] );\n\t\t_fnCallbackFire( settings, 'aoInitComplete', 'init', [settings, json] );\n\t}\n\t\n\t\n\tfunction _fnLengthChange ( settings, val )\n\t{\n\t\tvar len = parseInt( val, 10 );\n\t\tsettings._iDisplayLength = len;\n\t\n\t\t_fnLengthOverflow( settings );\n\t\n\t\t// Fire length change event\n\t\t_fnCallbackFire( settings, null, 'length', [settings, len] );\n\t}\n\t\n\t\n\t/**\n\t * Generate the node required for user display length changing\n\t *  @param {object} settings dataTables settings object\n\t *  @returns {node} Display length feature node\n\t *  @memberof DataTable#oApi\n\t */\n\tfunction _fnFeatureHtmlLength ( settings )\n\t{\n\t\tvar\n\t\t\tclasses  = settings.oClasses,\n\t\t\ttableId  = settings.sTableId,\n\t\t\tmenu     = settings.aLengthMenu,\n\t\t\td2       = Array.isArray( menu[0] ),\n\t\t\tlengths  = d2 ? menu[0] : menu,\n\t\t\tlanguage = d2 ? menu[1] : menu;\n\t\n\t\tvar select = $('<select/>', {\n\t\t\t'name':          tableId+'_length',\n\t\t\t'aria-controls': tableId,\n\t\t\t'class':         classes.sLengthSelect\n\t\t} );\n\t\n\t\tfor ( var i=0, ien=lengths.length ; i<ien ; i++ ) {\n\t\t\tselect[0][ i ] = new Option(\n\t\t\t\ttypeof language[i] === 'number' ?\n\t\t\t\t\tsettings.fnFormatNumber( language[i] ) :\n\t\t\t\t\tlanguage[i],\n\t\t\t\tlengths[i]\n\t\t\t);\n\t\t}\n\t\n\t\tvar div = $('<div><label/></div>').addClass( classes.sLength );\n\t\tif ( ! settings.aanFeatures.l ) {\n\t\t\tdiv[0].id = tableId+'_length';\n\t\t}\n\t\n\t\tdiv.children().append(\n\t\t\tsettings.oLanguage.sLengthMenu.replace( '_MENU_', select[0].outerHTML )\n\t\t);\n\t\n\t\t// Can't use `select` variable as user might provide their own and the\n\t\t// reference is broken by the use of outerHTML\n\t\t$('select', div)\n\t\t\t.val( settings._iDisplayLength )\n\t\t\t.on( 'change.DT', function(e) {\n\t\t\t\t_fnLengthChange( settings, $(this).val() );\n\t\t\t\t_fnDraw( settings );\n\t\t\t} );\n\t\n\t\t// Update node value whenever anything changes the table's length\n\t\t$(settings.nTable).on( 'length.dt.DT', function (e, s, len) {\n\t\t\tif ( settings === s ) {\n\t\t\t\t$('select', div).val( len );\n\t\t\t}\n\t\t} );\n\t\n\t\treturn div[0];\n\t}\n\t\n\t\n\t\n\t/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *\n\t * Note that most of the paging logic is done in\n\t * DataTable.ext.pager\n\t */\n\t\n\t/**\n\t * Generate the node required for default pagination\n\t *  @param {object} oSettings dataTables settings object\n\t *  @returns {node} Pagination feature node\n\t *  @memberof DataTable#oApi\n\t */\n\tfunction _fnFeatureHtmlPaginate ( settings )\n\t{\n\t\tvar\n\t\t\ttype   = settings.sPaginationType,\n\t\t\tplugin = DataTable.ext.pager[ type ],\n\t\t\tmodern = typeof plugin === 'function',\n\t\t\tredraw = function( settings ) {\n\t\t\t\t_fnDraw( settings );\n\t\t\t},\n\t\t\tnode = $('<div/>').addClass( settings.oClasses.sPaging + type )[0],\n\t\t\tfeatures = settings.aanFeatures;\n\t\n\t\tif ( ! modern ) {\n\t\t\tplugin.fnInit( settings, node, redraw );\n\t\t}\n\t\n\t\t/* Add a draw callback for the pagination on first instance, to update the paging display */\n\t\tif ( ! features.p )\n\t\t{\n\t\t\tnode.id = settings.sTableId+'_paginate';\n\t\n\t\t\tsettings.aoDrawCallback.push( {\n\t\t\t\t\"fn\": function( settings ) {\n\t\t\t\t\tif ( modern ) {\n\t\t\t\t\t\tvar\n\t\t\t\t\t\t\tstart      = settings._iDisplayStart,\n\t\t\t\t\t\t\tlen        = settings._iDisplayLength,\n\t\t\t\t\t\t\tvisRecords = settings.fnRecordsDisplay(),\n\t\t\t\t\t\t\tall        = len === -1,\n\t\t\t\t\t\t\tpage = all ? 0 : Math.ceil( start / len ),\n\t\t\t\t\t\t\tpages = all ? 1 : Math.ceil( visRecords / len ),\n\t\t\t\t\t\t\tbuttons = plugin(page, pages),\n\t\t\t\t\t\t\ti, ien;\n\t\n\t\t\t\t\t\tfor ( i=0, ien=features.p.length ; i<ien ; i++ ) {\n\t\t\t\t\t\t\t_fnRenderer( settings, 'pageButton' )(\n\t\t\t\t\t\t\t\tsettings, features.p[i], i, buttons, page, pages\n\t\t\t\t\t\t\t);\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t\telse {\n\t\t\t\t\t\tplugin.fnUpdate( settings, redraw );\n\t\t\t\t\t}\n\t\t\t\t},\n\t\t\t\t\"sName\": \"pagination\"\n\t\t\t} );\n\t\t}\n\t\n\t\treturn node;\n\t}\n\t\n\t\n\t/**\n\t * Alter the display settings to change the page\n\t *  @param {object} settings DataTables settings object\n\t *  @param {string|int} action Paging action to take: \"first\", \"previous\",\n\t *    \"next\" or \"last\" or page number to jump to (integer)\n\t *  @param [bool] redraw Automatically draw the update or not\n\t *  @returns {bool} true page has changed, false - no change\n\t *  @memberof DataTable#oApi\n\t */\n\tfunction _fnPageChange ( settings, action, redraw )\n\t{\n\t\tvar\n\t\t\tstart     = settings._iDisplayStart,\n\t\t\tlen       = settings._iDisplayLength,\n\t\t\trecords   = settings.fnRecordsDisplay();\n\t\n\t\tif ( records === 0 || len === -1 )\n\t\t{\n\t\t\tstart = 0;\n\t\t}\n\t\telse if ( typeof action === \"number\" )\n\t\t{\n\t\t\tstart = action * len;\n\t\n\t\t\tif ( start > records )\n\t\t\t{\n\t\t\t\tstart = 0;\n\t\t\t}\n\t\t}\n\t\telse if ( action == \"first\" )\n\t\t{\n\t\t\tstart = 0;\n\t\t}\n\t\telse if ( action == \"previous\" )\n\t\t{\n\t\t\tstart = len >= 0 ?\n\t\t\t\tstart - len :\n\t\t\t\t0;\n\t\n\t\t\tif ( start < 0 )\n\t\t\t{\n\t\t\t  start = 0;\n\t\t\t}\n\t\t}\n\t\telse if ( action == \"next\" )\n\t\t{\n\t\t\tif ( start + len < records )\n\t\t\t{\n\t\t\t\tstart += len;\n\t\t\t}\n\t\t}\n\t\telse if ( action == \"last\" )\n\t\t{\n\t\t\tstart = Math.floor( (records-1) / len) * len;\n\t\t}\n\t\telse\n\t\t{\n\t\t\t_fnLog( settings, 0, \"Unknown paging action: \"+action, 5 );\n\t\t}\n\t\n\t\tvar changed = settings._iDisplayStart !== start;\n\t\tsettings._iDisplayStart = start;\n\t\n\t\tif ( changed ) {\n\t\t\t_fnCallbackFire( settings, null, 'page', [settings] );\n\t\n\t\t\tif ( redraw ) {\n\t\t\t\t_fnDraw( settings );\n\t\t\t}\n\t\t}\n\t\n\t\treturn changed;\n\t}\n\t\n\t\n\t\n\t/**\n\t * Generate the node required for the processing node\n\t *  @param {object} settings dataTables settings object\n\t *  @returns {node} Processing element\n\t *  @memberof DataTable#oApi\n\t */\n\tfunction _fnFeatureHtmlProcessing ( settings )\n\t{\n\t\treturn $('<div/>', {\n\t\t\t\t'id': ! settings.aanFeatures.r ? settings.sTableId+'_processing' : null,\n\t\t\t\t'class': settings.oClasses.sProcessing\n\t\t\t} )\n\t\t\t.html( settings.oLanguage.sProcessing )\n\t\t\t.insertBefore( settings.nTable )[0];\n\t}\n\t\n\t\n\t/**\n\t * Display or hide the processing indicator\n\t *  @param {object} settings dataTables settings object\n\t *  @param {bool} show Show the processing indicator (true) or not (false)\n\t *  @memberof DataTable#oApi\n\t */\n\tfunction _fnProcessingDisplay ( settings, show )\n\t{\n\t\tif ( settings.oFeatures.bProcessing ) {\n\t\t\t$(settings.aanFeatures.r).css( 'display', show ? 'block' : 'none' );\n\t\t}\n\t\n\t\t_fnCallbackFire( settings, null, 'processing', [settings, show] );\n\t}\n\t\n\t/**\n\t * Add any control elements for the table - specifically scrolling\n\t *  @param {object} settings dataTables settings object\n\t *  @returns {node} Node to add to the DOM\n\t *  @memberof DataTable#oApi\n\t */\n\tfunction _fnFeatureHtmlTable ( settings )\n\t{\n\t\tvar table = $(settings.nTable);\n\t\n\t\t// Scrolling from here on in\n\t\tvar scroll = settings.oScroll;\n\t\n\t\tif ( scroll.sX === '' && scroll.sY === '' ) {\n\t\t\treturn settings.nTable;\n\t\t}\n\t\n\t\tvar scrollX = scroll.sX;\n\t\tvar scrollY = scroll.sY;\n\t\tvar classes = settings.oClasses;\n\t\tvar caption = table.children('caption');\n\t\tvar captionSide = caption.length ? caption[0]._captionSide : null;\n\t\tvar headerClone = $( table[0].cloneNode(false) );\n\t\tvar footerClone = $( table[0].cloneNode(false) );\n\t\tvar footer = table.children('tfoot');\n\t\tvar _div = '<div/>';\n\t\tvar size = function ( s ) {\n\t\t\treturn !s ? null : _fnStringToCss( s );\n\t\t};\n\t\n\t\tif ( ! footer.length ) {\n\t\t\tfooter = null;\n\t\t}\n\t\n\t\t/*\n\t\t * The HTML structure that we want to generate in this function is:\n\t\t *  div - scroller\n\t\t *    div - scroll head\n\t\t *      div - scroll head inner\n\t\t *        table - scroll head table\n\t\t *          thead - thead\n\t\t *    div - scroll body\n\t\t *      table - table (master table)\n\t\t *        thead - thead clone for sizing\n\t\t *        tbody - tbody\n\t\t *    div - scroll foot\n\t\t *      div - scroll foot inner\n\t\t *        table - scroll foot table\n\t\t *          tfoot - tfoot\n\t\t */\n\t\tvar scroller = $( _div, { 'class': classes.sScrollWrapper } )\n\t\t\t.append(\n\t\t\t\t$(_div, { 'class': classes.sScrollHead } )\n\t\t\t\t\t.css( {\n\t\t\t\t\t\toverflow: 'hidden',\n\t\t\t\t\t\tposition: 'relative',\n\t\t\t\t\t\tborder: 0,\n\t\t\t\t\t\twidth: scrollX ? size(scrollX) : '100%'\n\t\t\t\t\t} )\n\t\t\t\t\t.append(\n\t\t\t\t\t\t$(_div, { 'class': classes.sScrollHeadInner } )\n\t\t\t\t\t\t\t.css( {\n\t\t\t\t\t\t\t\t'box-sizing': 'content-box',\n\t\t\t\t\t\t\t\twidth: scroll.sXInner || '100%'\n\t\t\t\t\t\t\t} )\n\t\t\t\t\t\t\t.append(\n\t\t\t\t\t\t\t\theaderClone\n\t\t\t\t\t\t\t\t\t.removeAttr('id')\n\t\t\t\t\t\t\t\t\t.css( 'margin-left', 0 )\n\t\t\t\t\t\t\t\t\t.append( captionSide === 'top' ? caption : null )\n\t\t\t\t\t\t\t\t\t.append(\n\t\t\t\t\t\t\t\t\t\ttable.children('thead')\n\t\t\t\t\t\t\t\t\t)\n\t\t\t\t\t\t\t)\n\t\t\t\t\t)\n\t\t\t)\n\t\t\t.append(\n\t\t\t\t$(_div, { 'class': classes.sScrollBody } )\n\t\t\t\t\t.css( {\n\t\t\t\t\t\tposition: 'relative',\n\t\t\t\t\t\toverflow: 'auto',\n\t\t\t\t\t\twidth: size( scrollX )\n\t\t\t\t\t} )\n\t\t\t\t\t.append( table )\n\t\t\t);\n\t\n\t\tif ( footer ) {\n\t\t\tscroller.append(\n\t\t\t\t$(_div, { 'class': classes.sScrollFoot } )\n\t\t\t\t\t.css( {\n\t\t\t\t\t\toverflow: 'hidden',\n\t\t\t\t\t\tborder: 0,\n\t\t\t\t\t\twidth: scrollX ? size(scrollX) : '100%'\n\t\t\t\t\t} )\n\t\t\t\t\t.append(\n\t\t\t\t\t\t$(_div, { 'class': classes.sScrollFootInner } )\n\t\t\t\t\t\t\t.append(\n\t\t\t\t\t\t\t\tfooterClone\n\t\t\t\t\t\t\t\t\t.removeAttr('id')\n\t\t\t\t\t\t\t\t\t.css( 'margin-left', 0 )\n\t\t\t\t\t\t\t\t\t.append( captionSide === 'bottom' ? caption : null )\n\t\t\t\t\t\t\t\t\t.append(\n\t\t\t\t\t\t\t\t\t\ttable.children('tfoot')\n\t\t\t\t\t\t\t\t\t)\n\t\t\t\t\t\t\t)\n\t\t\t\t\t)\n\t\t\t);\n\t\t}\n\t\n\t\tvar children = scroller.children();\n\t\tvar scrollHead = children[0];\n\t\tvar scrollBody = children[1];\n\t\tvar scrollFoot = footer ? children[2] : null;\n\t\n\t\t// When the body is scrolled, then we also want to scroll the headers\n\t\tif ( scrollX ) {\n\t\t\t$(scrollBody).on( 'scroll.DT', function (e) {\n\t\t\t\tvar scrollLeft = this.scrollLeft;\n\t\n\t\t\t\tscrollHead.scrollLeft = scrollLeft;\n\t\n\t\t\t\tif ( footer ) {\n\t\t\t\t\tscrollFoot.scrollLeft = scrollLeft;\n\t\t\t\t}\n\t\t\t} );\n\t\t}\n\t\n\t\t$(scrollBody).css('max-height', scrollY);\n\t\tif (! scroll.bCollapse) {\n\t\t\t$(scrollBody).css('height', scrollY);\n\t\t}\n\t\n\t\tsettings.nScrollHead = scrollHead;\n\t\tsettings.nScrollBody = scrollBody;\n\t\tsettings.nScrollFoot = scrollFoot;\n\t\n\t\t// On redraw - align columns\n\t\tsettings.aoDrawCallback.push( {\n\t\t\t\"fn\": _fnScrollDraw,\n\t\t\t\"sName\": \"scrolling\"\n\t\t} );\n\t\n\t\treturn scroller[0];\n\t}\n\t\n\t\n\t\n\t/**\n\t * Update the header, footer and body tables for resizing - i.e. column\n\t * alignment.\n\t *\n\t * Welcome to the most horrible function DataTables. The process that this\n\t * function follows is basically:\n\t *   1. Re-create the table inside the scrolling div\n\t *   2. Take live measurements from the DOM\n\t *   3. Apply the measurements to align the columns\n\t *   4. Clean up\n\t *\n\t *  @param {object} settings dataTables settings object\n\t *  @memberof DataTable#oApi\n\t */\n\tfunction _fnScrollDraw ( settings )\n\t{\n\t\t// Given that this is such a monster function, a lot of variables are use\n\t\t// to try and keep the minimised size as small as possible\n\t\tvar\n\t\t\tscroll         = settings.oScroll,\n\t\t\tscrollX        = scroll.sX,\n\t\t\tscrollXInner   = scroll.sXInner,\n\t\t\tscrollY        = scroll.sY,\n\t\t\tbarWidth       = scroll.iBarWidth,\n\t\t\tdivHeader      = $(settings.nScrollHead),\n\t\t\tdivHeaderStyle = divHeader[0].style,\n\t\t\tdivHeaderInner = divHeader.children('div'),\n\t\t\tdivHeaderInnerStyle = divHeaderInner[0].style,\n\t\t\tdivHeaderTable = divHeaderInner.children('table'),\n\t\t\tdivBodyEl      = settings.nScrollBody,\n\t\t\tdivBody        = $(divBodyEl),\n\t\t\tdivBodyStyle   = divBodyEl.style,\n\t\t\tdivFooter      = $(settings.nScrollFoot),\n\t\t\tdivFooterInner = divFooter.children('div'),\n\t\t\tdivFooterTable = divFooterInner.children('table'),\n\t\t\theader         = $(settings.nTHead),\n\t\t\ttable          = $(settings.nTable),\n\t\t\ttableEl        = table[0],\n\t\t\ttableStyle     = tableEl.style,\n\t\t\tfooter         = settings.nTFoot ? $(settings.nTFoot) : null,\n\t\t\tbrowser        = settings.oBrowser,\n\t\t\tie67           = browser.bScrollOversize,\n\t\t\tdtHeaderCells  = _pluck( settings.aoColumns, 'nTh' ),\n\t\t\theaderTrgEls, footerTrgEls,\n\t\t\theaderSrcEls, footerSrcEls,\n\t\t\theaderCopy, footerCopy,\n\t\t\theaderWidths=[], footerWidths=[],\n\t\t\theaderContent=[], footerContent=[],\n\t\t\tidx, correction, sanityWidth,\n\t\t\tzeroOut = function(nSizer) {\n\t\t\t\tvar style = nSizer.style;\n\t\t\t\tstyle.paddingTop = \"0\";\n\t\t\t\tstyle.paddingBottom = \"0\";\n\t\t\t\tstyle.borderTopWidth = \"0\";\n\t\t\t\tstyle.borderBottomWidth = \"0\";\n\t\t\t\tstyle.height = 0;\n\t\t\t};\n\t\n\t\t// If the scrollbar visibility has changed from the last draw, we need to\n\t\t// adjust the column sizes as the table width will have changed to account\n\t\t// for the scrollbar\n\t\tvar scrollBarVis = divBodyEl.scrollHeight > divBodyEl.clientHeight;\n\t\t\n\t\tif ( settings.scrollBarVis !== scrollBarVis && settings.scrollBarVis !== undefined ) {\n\t\t\tsettings.scrollBarVis = scrollBarVis;\n\t\t\t_fnAdjustColumnSizing( settings );\n\t\t\treturn; // adjust column sizing will call this function again\n\t\t}\n\t\telse {\n\t\t\tsettings.scrollBarVis = scrollBarVis;\n\t\t}\n\t\n\t\t/*\n\t\t * 1. Re-create the table inside the scrolling div\n\t\t */\n\t\n\t\t// Remove the old minimised thead and tfoot elements in the inner table\n\t\ttable.children('thead, tfoot').remove();\n\t\n\t\tif ( footer ) {\n\t\t\tfooterCopy = footer.clone().prependTo( table );\n\t\t\tfooterTrgEls = footer.find('tr'); // the original tfoot is in its own table and must be sized\n\t\t\tfooterSrcEls = footerCopy.find('tr');\n\t\t}\n\t\n\t\t// Clone the current header and footer elements and then place it into the inner table\n\t\theaderCopy = header.clone().prependTo( table );\n\t\theaderTrgEls = header.find('tr'); // original header is in its own table\n\t\theaderSrcEls = headerCopy.find('tr');\n\t\theaderCopy.find('th, td').removeAttr('tabindex');\n\t\n\t\n\t\t/*\n\t\t * 2. Take live measurements from the DOM - do not alter the DOM itself!\n\t\t */\n\t\n\t\t// Remove old sizing and apply the calculated column widths\n\t\t// Get the unique column headers in the newly created (cloned) header. We want to apply the\n\t\t// calculated sizes to this header\n\t\tif ( ! scrollX )\n\t\t{\n\t\t\tdivBodyStyle.width = '100%';\n\t\t\tdivHeader[0].style.width = '100%';\n\t\t}\n\t\n\t\t$.each( _fnGetUniqueThs( settings, headerCopy ), function ( i, el ) {\n\t\t\tidx = _fnVisibleToColumnIndex( settings, i );\n\t\t\tel.style.width = settings.aoColumns[idx].sWidth;\n\t\t} );\n\t\n\t\tif ( footer ) {\n\t\t\t_fnApplyToChildren( function(n) {\n\t\t\t\tn.style.width = \"\";\n\t\t\t}, footerSrcEls );\n\t\t}\n\t\n\t\t// Size the table as a whole\n\t\tsanityWidth = table.outerWidth();\n\t\tif ( scrollX === \"\" ) {\n\t\t\t// No x scrolling\n\t\t\ttableStyle.width = \"100%\";\n\t\n\t\t\t// IE7 will make the width of the table when 100% include the scrollbar\n\t\t\t// - which is shouldn't. When there is a scrollbar we need to take this\n\t\t\t// into account.\n\t\t\tif ( ie67 && (table.find('tbody').height() > divBodyEl.offsetHeight ||\n\t\t\t\tdivBody.css('overflow-y') == \"scroll\")\n\t\t\t) {\n\t\t\t\ttableStyle.width = _fnStringToCss( table.outerWidth() - barWidth);\n\t\t\t}\n\t\n\t\t\t// Recalculate the sanity width\n\t\t\tsanityWidth = table.outerWidth();\n\t\t}\n\t\telse if ( scrollXInner !== \"\" ) {\n\t\t\t// legacy x scroll inner has been given - use it\n\t\t\ttableStyle.width = _fnStringToCss(scrollXInner);\n\t\n\t\t\t// Recalculate the sanity width\n\t\t\tsanityWidth = table.outerWidth();\n\t\t}\n\t\n\t\t// Hidden header should have zero height, so remove padding and borders. Then\n\t\t// set the width based on the real headers\n\t\n\t\t// Apply all styles in one pass\n\t\t_fnApplyToChildren( zeroOut, headerSrcEls );\n\t\n\t\t// Read all widths in next pass\n\t\t_fnApplyToChildren( function(nSizer) {\n\t\t\tvar style = window.getComputedStyle ?\n\t\t\t\twindow.getComputedStyle(nSizer).width :\n\t\t\t\t_fnStringToCss( $(nSizer).width() );\n\t\n\t\t\theaderContent.push( nSizer.innerHTML );\n\t\t\theaderWidths.push( style );\n\t\t}, headerSrcEls );\n\t\n\t\t// Apply all widths in final pass\n\t\t_fnApplyToChildren( function(nToSize, i) {\n\t\t\tnToSize.style.width = headerWidths[i];\n\t\t}, headerTrgEls );\n\t\n\t\t$(headerSrcEls).css('height', 0);\n\t\n\t\t/* Same again with the footer if we have one */\n\t\tif ( footer )\n\t\t{\n\t\t\t_fnApplyToChildren( zeroOut, footerSrcEls );\n\t\n\t\t\t_fnApplyToChildren( function(nSizer) {\n\t\t\t\tfooterContent.push( nSizer.innerHTML );\n\t\t\t\tfooterWidths.push( _fnStringToCss( $(nSizer).css('width') ) );\n\t\t\t}, footerSrcEls );\n\t\n\t\t\t_fnApplyToChildren( function(nToSize, i) {\n\t\t\t\tnToSize.style.width = footerWidths[i];\n\t\t\t}, footerTrgEls );\n\t\n\t\t\t$(footerSrcEls).height(0);\n\t\t}\n\t\n\t\n\t\t/*\n\t\t * 3. Apply the measurements\n\t\t */\n\t\n\t\t// \"Hide\" the header and footer that we used for the sizing. We need to keep\n\t\t// the content of the cell so that the width applied to the header and body\n\t\t// both match, but we want to hide it completely. We want to also fix their\n\t\t// width to what they currently are\n\t\t_fnApplyToChildren( function(nSizer, i) {\n\t\t\tnSizer.innerHTML = '<div class=\"dataTables_sizing\">'+headerContent[i]+'</div>';\n\t\t\tnSizer.childNodes[0].style.height = \"0\";\n\t\t\tnSizer.childNodes[0].style.overflow = \"hidden\";\n\t\t\tnSizer.style.width = headerWidths[i];\n\t\t}, headerSrcEls );\n\t\n\t\tif ( footer )\n\t\t{\n\t\t\t_fnApplyToChildren( function(nSizer, i) {\n\t\t\t\tnSizer.innerHTML = '<div class=\"dataTables_sizing\">'+footerContent[i]+'</div>';\n\t\t\t\tnSizer.childNodes[0].style.height = \"0\";\n\t\t\t\tnSizer.childNodes[0].style.overflow = \"hidden\";\n\t\t\t\tnSizer.style.width = footerWidths[i];\n\t\t\t}, footerSrcEls );\n\t\t}\n\t\n\t\t// Sanity check that the table is of a sensible width. If not then we are going to get\n\t\t// misalignment - try to prevent this by not allowing the table to shrink below its min width\n\t\tif ( Math.round(table.outerWidth()) < Math.round(sanityWidth) )\n\t\t{\n\t\t\t// The min width depends upon if we have a vertical scrollbar visible or not */\n\t\t\tcorrection = ((divBodyEl.scrollHeight > divBodyEl.offsetHeight ||\n\t\t\t\tdivBody.css('overflow-y') == \"scroll\")) ?\n\t\t\t\t\tsanityWidth+barWidth :\n\t\t\t\t\tsanityWidth;\n\t\n\t\t\t// IE6/7 are a law unto themselves...\n\t\t\tif ( ie67 && (divBodyEl.scrollHeight >\n\t\t\t\tdivBodyEl.offsetHeight || divBody.css('overflow-y') == \"scroll\")\n\t\t\t) {\n\t\t\t\ttableStyle.width = _fnStringToCss( correction-barWidth );\n\t\t\t}\n\t\n\t\t\t// And give the user a warning that we've stopped the table getting too small\n\t\t\tif ( scrollX === \"\" || scrollXInner !== \"\" ) {\n\t\t\t\t_fnLog( settings, 1, 'Possible column misalignment', 6 );\n\t\t\t}\n\t\t}\n\t\telse\n\t\t{\n\t\t\tcorrection = '100%';\n\t\t}\n\t\n\t\t// Apply to the container elements\n\t\tdivBodyStyle.width = _fnStringToCss( correction );\n\t\tdivHeaderStyle.width = _fnStringToCss( correction );\n\t\n\t\tif ( footer ) {\n\t\t\tsettings.nScrollFoot.style.width = _fnStringToCss( correction );\n\t\t}\n\t\n\t\n\t\t/*\n\t\t * 4. Clean up\n\t\t */\n\t\tif ( ! scrollY ) {\n\t\t\t/* IE7< puts a vertical scrollbar in place (when it shouldn't be) due to subtracting\n\t\t\t * the scrollbar height from the visible display, rather than adding it on. We need to\n\t\t\t * set the height in order to sort this. Don't want to do it in any other browsers.\n\t\t\t */\n\t\t\tif ( ie67 ) {\n\t\t\t\tdivBodyStyle.height = _fnStringToCss( tableEl.offsetHeight+barWidth );\n\t\t\t}\n\t\t}\n\t\n\t\t/* Finally set the width's of the header and footer tables */\n\t\tvar iOuterWidth = table.outerWidth();\n\t\tdivHeaderTable[0].style.width = _fnStringToCss( iOuterWidth );\n\t\tdivHeaderInnerStyle.width = _fnStringToCss( iOuterWidth );\n\t\n\t\t// Figure out if there are scrollbar present - if so then we need a the header and footer to\n\t\t// provide a bit more space to allow \"overflow\" scrolling (i.e. past the scrollbar)\n\t\tvar bScrolling = table.height() > divBodyEl.clientHeight || divBody.css('overflow-y') == \"scroll\";\n\t\tvar padding = 'padding' + (browser.bScrollbarLeft ? 'Left' : 'Right' );\n\t\tdivHeaderInnerStyle[ padding ] = bScrolling ? barWidth+\"px\" : \"0px\";\n\t\n\t\tif ( footer ) {\n\t\t\tdivFooterTable[0].style.width = _fnStringToCss( iOuterWidth );\n\t\t\tdivFooterInner[0].style.width = _fnStringToCss( iOuterWidth );\n\t\t\tdivFooterInner[0].style[padding] = bScrolling ? barWidth+\"px\" : \"0px\";\n\t\t}\n\t\n\t\t// Correct DOM ordering for colgroup - comes before the thead\n\t\ttable.children('colgroup').insertBefore( table.children('thead') );\n\t\n\t\t/* Adjust the position of the header in case we loose the y-scrollbar */\n\t\tdivBody.trigger('scroll');\n\t\n\t\t// If sorting or filtering has occurred, jump the scrolling back to the top\n\t\t// only if we aren't holding the position\n\t\tif ( (settings.bSorted || settings.bFiltered) && ! settings._drawHold ) {\n\t\t\tdivBodyEl.scrollTop = 0;\n\t\t}\n\t}\n\t\n\t\n\t\n\t/**\n\t * Apply a given function to the display child nodes of an element array (typically\n\t * TD children of TR rows\n\t *  @param {function} fn Method to apply to the objects\n\t *  @param array {nodes} an1 List of elements to look through for display children\n\t *  @param array {nodes} an2 Another list (identical structure to the first) - optional\n\t *  @memberof DataTable#oApi\n\t */\n\tfunction _fnApplyToChildren( fn, an1, an2 )\n\t{\n\t\tvar index=0, i=0, iLen=an1.length;\n\t\tvar nNode1, nNode2;\n\t\n\t\twhile ( i < iLen ) {\n\t\t\tnNode1 = an1[i].firstChild;\n\t\t\tnNode2 = an2 ? an2[i].firstChild : null;\n\t\n\t\t\twhile ( nNode1 ) {\n\t\t\t\tif ( nNode1.nodeType === 1 ) {\n\t\t\t\t\tif ( an2 ) {\n\t\t\t\t\t\tfn( nNode1, nNode2, index );\n\t\t\t\t\t}\n\t\t\t\t\telse {\n\t\t\t\t\t\tfn( nNode1, index );\n\t\t\t\t\t}\n\t\n\t\t\t\t\tindex++;\n\t\t\t\t}\n\t\n\t\t\t\tnNode1 = nNode1.nextSibling;\n\t\t\t\tnNode2 = an2 ? nNode2.nextSibling : null;\n\t\t\t}\n\t\n\t\t\ti++;\n\t\t}\n\t}\n\t\n\t\n\t\n\tvar __re_html_remove = /<.*?>/g;\n\t\n\t\n\t/**\n\t * Calculate the width of columns for the table\n\t *  @param {object} oSettings dataTables settings object\n\t *  @memberof DataTable#oApi\n\t */\n\tfunction _fnCalculateColumnWidths ( oSettings )\n\t{\n\t\tvar\n\t\t\ttable = oSettings.nTable,\n\t\t\tcolumns = oSettings.aoColumns,\n\t\t\tscroll = oSettings.oScroll,\n\t\t\tscrollY = scroll.sY,\n\t\t\tscrollX = scroll.sX,\n\t\t\tscrollXInner = scroll.sXInner,\n\t\t\tcolumnCount = columns.length,\n\t\t\tvisibleColumns = _fnGetColumns( oSettings, 'bVisible' ),\n\t\t\theaderCells = $('th', oSettings.nTHead),\n\t\t\ttableWidthAttr = table.getAttribute('width'), // from DOM element\n\t\t\ttableContainer = table.parentNode,\n\t\t\tuserInputs = false,\n\t\t\ti, column, columnIdx, width, outerWidth,\n\t\t\tbrowser = oSettings.oBrowser,\n\t\t\tie67 = browser.bScrollOversize;\n\t\n\t\tvar styleWidth = table.style.width;\n\t\tif ( styleWidth && styleWidth.indexOf('%') !== -1 ) {\n\t\t\ttableWidthAttr = styleWidth;\n\t\t}\n\t\n\t\t/* Convert any user input sizes into pixel sizes */\n\t\tfor ( i=0 ; i<visibleColumns.length ; i++ ) {\n\t\t\tcolumn = columns[ visibleColumns[i] ];\n\t\n\t\t\tif ( column.sWidth !== null ) {\n\t\t\t\tcolumn.sWidth = _fnConvertToWidth( column.sWidthOrig, tableContainer );\n\t\n\t\t\t\tuserInputs = true;\n\t\t\t}\n\t\t}\n\t\n\t\t/* If the number of columns in the DOM equals the number that we have to\n\t\t * process in DataTables, then we can use the offsets that are created by\n\t\t * the web- browser. No custom sizes can be set in order for this to happen,\n\t\t * nor scrolling used\n\t\t */\n\t\tif ( ie67 || ! userInputs && ! scrollX && ! scrollY &&\n\t\t     columnCount == _fnVisbleColumns( oSettings ) &&\n\t\t     columnCount == headerCells.length\n\t\t) {\n\t\t\tfor ( i=0 ; i<columnCount ; i++ ) {\n\t\t\t\tvar colIdx = _fnVisibleToColumnIndex( oSettings, i );\n\t\n\t\t\t\tif ( colIdx !== null ) {\n\t\t\t\t\tcolumns[ colIdx ].sWidth = _fnStringToCss( headerCells.eq(i).width() );\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\telse\n\t\t{\n\t\t\t// Otherwise construct a single row, worst case, table with the widest\n\t\t\t// node in the data, assign any user defined widths, then insert it into\n\t\t\t// the DOM and allow the browser to do all the hard work of calculating\n\t\t\t// table widths\n\t\t\tvar tmpTable = $(table).clone() // don't use cloneNode - IE8 will remove events on the main table\n\t\t\t\t.css( 'visibility', 'hidden' )\n\t\t\t\t.removeAttr( 'id' );\n\t\n\t\t\t// Clean up the table body\n\t\t\ttmpTable.find('tbody tr').remove();\n\t\t\tvar tr = $('<tr/>').appendTo( tmpTable.find('tbody') );\n\t\n\t\t\t// Clone the table header and footer - we can't use the header / footer\n\t\t\t// from the cloned table, since if scrolling is active, the table's\n\t\t\t// real header and footer are contained in different table tags\n\t\t\ttmpTable.find('thead, tfoot').remove();\n\t\t\ttmpTable\n\t\t\t\t.append( $(oSettings.nTHead).clone() )\n\t\t\t\t.append( $(oSettings.nTFoot).clone() );\n\t\n\t\t\t// Remove any assigned widths from the footer (from scrolling)\n\t\t\ttmpTable.find('tfoot th, tfoot td').css('width', '');\n\t\n\t\t\t// Apply custom sizing to the cloned header\n\t\t\theaderCells = _fnGetUniqueThs( oSettings, tmpTable.find('thead')[0] );\n\t\n\t\t\tfor ( i=0 ; i<visibleColumns.length ; i++ ) {\n\t\t\t\tcolumn = columns[ visibleColumns[i] ];\n\t\n\t\t\t\theaderCells[i].style.width = column.sWidthOrig !== null && column.sWidthOrig !== '' ?\n\t\t\t\t\t_fnStringToCss( column.sWidthOrig ) :\n\t\t\t\t\t'';\n\t\n\t\t\t\t// For scrollX we need to force the column width otherwise the\n\t\t\t\t// browser will collapse it. If this width is smaller than the\n\t\t\t\t// width the column requires, then it will have no effect\n\t\t\t\tif ( column.sWidthOrig && scrollX ) {\n\t\t\t\t\t$( headerCells[i] ).append( $('<div/>').css( {\n\t\t\t\t\t\twidth: column.sWidthOrig,\n\t\t\t\t\t\tmargin: 0,\n\t\t\t\t\t\tpadding: 0,\n\t\t\t\t\t\tborder: 0,\n\t\t\t\t\t\theight: 1\n\t\t\t\t\t} ) );\n\t\t\t\t}\n\t\t\t}\n\t\n\t\t\t// Find the widest cell for each column and put it into the table\n\t\t\tif ( oSettings.aoData.length ) {\n\t\t\t\tfor ( i=0 ; i<visibleColumns.length ; i++ ) {\n\t\t\t\t\tcolumnIdx = visibleColumns[i];\n\t\t\t\t\tcolumn = columns[ columnIdx ];\n\t\n\t\t\t\t\t$( _fnGetWidestNode( oSettings, columnIdx ) )\n\t\t\t\t\t\t.clone( false )\n\t\t\t\t\t\t.append( column.sContentPadding )\n\t\t\t\t\t\t.appendTo( tr );\n\t\t\t\t}\n\t\t\t}\n\t\n\t\t\t// Tidy the temporary table - remove name attributes so there aren't\n\t\t\t// duplicated in the dom (radio elements for example)\n\t\t\t$('[name]', tmpTable).removeAttr('name');\n\t\n\t\t\t// Table has been built, attach to the document so we can work with it.\n\t\t\t// A holding element is used, positioned at the top of the container\n\t\t\t// with minimal height, so it has no effect on if the container scrolls\n\t\t\t// or not. Otherwise it might trigger scrolling when it actually isn't\n\t\t\t// needed\n\t\t\tvar holder = $('<div/>').css( scrollX || scrollY ?\n\t\t\t\t\t{\n\t\t\t\t\t\tposition: 'absolute',\n\t\t\t\t\t\ttop: 0,\n\t\t\t\t\t\tleft: 0,\n\t\t\t\t\t\theight: 1,\n\t\t\t\t\t\tright: 0,\n\t\t\t\t\t\toverflow: 'hidden'\n\t\t\t\t\t} :\n\t\t\t\t\t{}\n\t\t\t\t)\n\t\t\t\t.append( tmpTable )\n\t\t\t\t.appendTo( tableContainer );\n\t\n\t\t\t// When scrolling (X or Y) we want to set the width of the table as \n\t\t\t// appropriate. However, when not scrolling leave the table width as it\n\t\t\t// is. This results in slightly different, but I think correct behaviour\n\t\t\tif ( scrollX && scrollXInner ) {\n\t\t\t\ttmpTable.width( scrollXInner );\n\t\t\t}\n\t\t\telse if ( scrollX ) {\n\t\t\t\ttmpTable.css( 'width', 'auto' );\n\t\t\t\ttmpTable.removeAttr('width');\n\t\n\t\t\t\t// If there is no width attribute or style, then allow the table to\n\t\t\t\t// collapse\n\t\t\t\tif ( tmpTable.width() < tableContainer.clientWidth && tableWidthAttr ) {\n\t\t\t\t\ttmpTable.width( tableContainer.clientWidth );\n\t\t\t\t}\n\t\t\t}\n\t\t\telse if ( scrollY ) {\n\t\t\t\ttmpTable.width( tableContainer.clientWidth );\n\t\t\t}\n\t\t\telse if ( tableWidthAttr ) {\n\t\t\t\ttmpTable.width( tableWidthAttr );\n\t\t\t}\n\t\n\t\t\t// Get the width of each column in the constructed table - we need to\n\t\t\t// know the inner width (so it can be assigned to the other table's\n\t\t\t// cells) and the outer width so we can calculate the full width of the\n\t\t\t// table. This is safe since DataTables requires a unique cell for each\n\t\t\t// column, but if ever a header can span multiple columns, this will\n\t\t\t// need to be modified.\n\t\t\tvar total = 0;\n\t\t\tfor ( i=0 ; i<visibleColumns.length ; i++ ) {\n\t\t\t\tvar cell = $(headerCells[i]);\n\t\t\t\tvar border = cell.outerWidth() - cell.width();\n\t\n\t\t\t\t// Use getBounding... where possible (not IE8-) because it can give\n\t\t\t\t// sub-pixel accuracy, which we then want to round up!\n\t\t\t\tvar bounding = browser.bBounding ?\n\t\t\t\t\tMath.ceil( headerCells[i].getBoundingClientRect().width ) :\n\t\t\t\t\tcell.outerWidth();\n\t\n\t\t\t\t// Total is tracked to remove any sub-pixel errors as the outerWidth\n\t\t\t\t// of the table might not equal the total given here (IE!).\n\t\t\t\ttotal += bounding;\n\t\n\t\t\t\t// Width for each column to use\n\t\t\t\tcolumns[ visibleColumns[i] ].sWidth = _fnStringToCss( bounding - border );\n\t\t\t}\n\t\n\t\t\ttable.style.width = _fnStringToCss( total );\n\t\n\t\t\t// Finished with the table - ditch it\n\t\t\tholder.remove();\n\t\t}\n\t\n\t\t// If there is a width attr, we want to attach an event listener which\n\t\t// allows the table sizing to automatically adjust when the window is\n\t\t// resized. Use the width attr rather than CSS, since we can't know if the\n\t\t// CSS is a relative value or absolute - DOM read is always px.\n\t\tif ( tableWidthAttr ) {\n\t\t\ttable.style.width = _fnStringToCss( tableWidthAttr );\n\t\t}\n\t\n\t\tif ( (tableWidthAttr || scrollX) && ! oSettings._reszEvt ) {\n\t\t\tvar bindResize = function () {\n\t\t\t\t$(window).on('resize.DT-'+oSettings.sInstance, _fnThrottle( function () {\n\t\t\t\t\t_fnAdjustColumnSizing( oSettings );\n\t\t\t\t} ) );\n\t\t\t};\n\t\n\t\t\t// IE6/7 will crash if we bind a resize event handler on page load.\n\t\t\t// To be removed in 1.11 which drops IE6/7 support\n\t\t\tif ( ie67 ) {\n\t\t\t\tsetTimeout( bindResize, 1000 );\n\t\t\t}\n\t\t\telse {\n\t\t\t\tbindResize();\n\t\t\t}\n\t\n\t\t\toSettings._reszEvt = true;\n\t\t}\n\t}\n\t\n\t\n\t/**\n\t * Throttle the calls to a function. Arguments and context are maintained for\n\t * the throttled function\n\t *  @param {function} fn Function to be called\n\t *  @param {int} [freq=200] call frequency in mS\n\t *  @returns {function} wrapped function\n\t *  @memberof DataTable#oApi\n\t */\n\tvar _fnThrottle = DataTable.util.throttle;\n\t\n\t\n\t/**\n\t * Convert a CSS unit width to pixels (e.g. 2em)\n\t *  @param {string} width width to be converted\n\t *  @param {node} parent parent to get the with for (required for relative widths) - optional\n\t *  @returns {int} width in pixels\n\t *  @memberof DataTable#oApi\n\t */\n\tfunction _fnConvertToWidth ( width, parent )\n\t{\n\t\tif ( ! width ) {\n\t\t\treturn 0;\n\t\t}\n\t\n\t\tvar n = $('<div/>')\n\t\t\t.css( 'width', _fnStringToCss( width ) )\n\t\t\t.appendTo( parent || document.body );\n\t\n\t\tvar val = n[0].offsetWidth;\n\t\tn.remove();\n\t\n\t\treturn val;\n\t}\n\t\n\t\n\t/**\n\t * Get the widest node\n\t *  @param {object} settings dataTables settings object\n\t *  @param {int} colIdx column of interest\n\t *  @returns {node} widest table node\n\t *  @memberof DataTable#oApi\n\t */\n\tfunction _fnGetWidestNode( settings, colIdx )\n\t{\n\t\tvar idx = _fnGetMaxLenString( settings, colIdx );\n\t\tif ( idx < 0 ) {\n\t\t\treturn null;\n\t\t}\n\t\n\t\tvar data = settings.aoData[ idx ];\n\t\treturn ! data.nTr ? // Might not have been created when deferred rendering\n\t\t\t$('<td/>').html( _fnGetCellData( settings, idx, colIdx, 'display' ) )[0] :\n\t\t\tdata.anCells[ colIdx ];\n\t}\n\t\n\t\n\t/**\n\t * Get the maximum strlen for each data column\n\t *  @param {object} settings dataTables settings object\n\t *  @param {int} colIdx column of interest\n\t *  @returns {string} max string length for each column\n\t *  @memberof DataTable#oApi\n\t */\n\tfunction _fnGetMaxLenString( settings, colIdx )\n\t{\n\t\tvar s, max=-1, maxIdx = -1;\n\t\n\t\tfor ( var i=0, ien=settings.aoData.length ; i<ien ; i++ ) {\n\t\t\ts = _fnGetCellData( settings, i, colIdx, 'display' )+'';\n\t\t\ts = s.replace( __re_html_remove, '' );\n\t\t\ts = s.replace( /&nbsp;/g, ' ' );\n\t\n\t\t\tif ( s.length > max ) {\n\t\t\t\tmax = s.length;\n\t\t\t\tmaxIdx = i;\n\t\t\t}\n\t\t}\n\t\n\t\treturn maxIdx;\n\t}\n\t\n\t\n\t/**\n\t * Append a CSS unit (only if required) to a string\n\t *  @param {string} value to css-ify\n\t *  @returns {string} value with css unit\n\t *  @memberof DataTable#oApi\n\t */\n\tfunction _fnStringToCss( s )\n\t{\n\t\tif ( s === null ) {\n\t\t\treturn '0px';\n\t\t}\n\t\n\t\tif ( typeof s == 'number' ) {\n\t\t\treturn s < 0 ?\n\t\t\t\t'0px' :\n\t\t\t\ts+'px';\n\t\t}\n\t\n\t\t// Check it has a unit character already\n\t\treturn s.match(/\\d$/) ?\n\t\t\ts+'px' :\n\t\t\ts;\n\t}\n\t\n\t\n\t\n\tfunction _fnSortFlatten ( settings )\n\t{\n\t\tvar\n\t\t\ti, iLen, k, kLen,\n\t\t\taSort = [],\n\t\t\taiOrig = [],\n\t\t\taoColumns = settings.aoColumns,\n\t\t\taDataSort, iCol, sType, srcCol,\n\t\t\tfixed = settings.aaSortingFixed,\n\t\t\tfixedObj = $.isPlainObject( fixed ),\n\t\t\tnestedSort = [],\n\t\t\tadd = function ( a ) {\n\t\t\t\tif ( a.length && ! Array.isArray( a[0] ) ) {\n\t\t\t\t\t// 1D array\n\t\t\t\t\tnestedSort.push( a );\n\t\t\t\t}\n\t\t\t\telse {\n\t\t\t\t\t// 2D array\n\t\t\t\t\t$.merge( nestedSort, a );\n\t\t\t\t}\n\t\t\t};\n\t\n\t\t// Build the sort array, with pre-fix and post-fix options if they have been\n\t\t// specified\n\t\tif ( Array.isArray( fixed ) ) {\n\t\t\tadd( fixed );\n\t\t}\n\t\n\t\tif ( fixedObj && fixed.pre ) {\n\t\t\tadd( fixed.pre );\n\t\t}\n\t\n\t\tadd( settings.aaSorting );\n\t\n\t\tif (fixedObj && fixed.post ) {\n\t\t\tadd( fixed.post );\n\t\t}\n\t\n\t\tfor ( i=0 ; i<nestedSort.length ; i++ )\n\t\t{\n\t\t\tsrcCol = nestedSort[i][0];\n\t\t\taDataSort = aoColumns[ srcCol ].aDataSort;\n\t\n\t\t\tfor ( k=0, kLen=aDataSort.length ; k<kLen ; k++ )\n\t\t\t{\n\t\t\t\tiCol = aDataSort[k];\n\t\t\t\tsType = aoColumns[ iCol ].sType || 'string';\n\t\n\t\t\t\tif ( nestedSort[i]._idx === undefined ) {\n\t\t\t\t\tnestedSort[i]._idx = $.inArray( nestedSort[i][1], aoColumns[iCol].asSorting );\n\t\t\t\t}\n\t\n\t\t\t\taSort.push( {\n\t\t\t\t\tsrc:       srcCol,\n\t\t\t\t\tcol:       iCol,\n\t\t\t\t\tdir:       nestedSort[i][1],\n\t\t\t\t\tindex:     nestedSort[i]._idx,\n\t\t\t\t\ttype:      sType,\n\t\t\t\t\tformatter: DataTable.ext.type.order[ sType+\"-pre\" ]\n\t\t\t\t} );\n\t\t\t}\n\t\t}\n\t\n\t\treturn aSort;\n\t}\n\t\n\t/**\n\t * Change the order of the table\n\t *  @param {object} oSettings dataTables settings object\n\t *  @memberof DataTable#oApi\n\t *  @todo This really needs split up!\n\t */\n\tfunction _fnSort ( oSettings )\n\t{\n\t\tvar\n\t\t\ti, ien, iLen, j, jLen, k, kLen,\n\t\t\tsDataType, nTh,\n\t\t\taiOrig = [],\n\t\t\toExtSort = DataTable.ext.type.order,\n\t\t\taoData = oSettings.aoData,\n\t\t\taoColumns = oSettings.aoColumns,\n\t\t\taDataSort, data, iCol, sType, oSort,\n\t\t\tformatters = 0,\n\t\t\tsortCol,\n\t\t\tdisplayMaster = oSettings.aiDisplayMaster,\n\t\t\taSort;\n\t\n\t\t// Resolve any column types that are unknown due to addition or invalidation\n\t\t// @todo Can this be moved into a 'data-ready' handler which is called when\n\t\t//   data is going to be used in the table?\n\t\t_fnColumnTypes( oSettings );\n\t\n\t\taSort = _fnSortFlatten( oSettings );\n\t\n\t\tfor ( i=0, ien=aSort.length ; i<ien ; i++ ) {\n\t\t\tsortCol = aSort[i];\n\t\n\t\t\t// Track if we can use the fast sort algorithm\n\t\t\tif ( sortCol.formatter ) {\n\t\t\t\tformatters++;\n\t\t\t}\n\t\n\t\t\t// Load the data needed for the sort, for each cell\n\t\t\t_fnSortData( oSettings, sortCol.col );\n\t\t}\n\t\n\t\t/* No sorting required if server-side or no sorting array */\n\t\tif ( _fnDataSource( oSettings ) != 'ssp' && aSort.length !== 0 )\n\t\t{\n\t\t\t// Create a value - key array of the current row positions such that we can use their\n\t\t\t// current position during the sort, if values match, in order to perform stable sorting\n\t\t\tfor ( i=0, iLen=displayMaster.length ; i<iLen ; i++ ) {\n\t\t\t\taiOrig[ displayMaster[i] ] = i;\n\t\t\t}\n\t\n\t\t\t/* Do the sort - here we want multi-column sorting based on a given data source (column)\n\t\t\t * and sorting function (from oSort) in a certain direction. It's reasonably complex to\n\t\t\t * follow on it's own, but this is what we want (example two column sorting):\n\t\t\t *  fnLocalSorting = function(a,b){\n\t\t\t *    var iTest;\n\t\t\t *    iTest = oSort['string-asc']('data11', 'data12');\n\t\t\t *      if (iTest !== 0)\n\t\t\t *        return iTest;\n\t\t\t *    iTest = oSort['numeric-desc']('data21', 'data22');\n\t\t\t *    if (iTest !== 0)\n\t\t\t *      return iTest;\n\t\t\t *    return oSort['numeric-asc']( aiOrig[a], aiOrig[b] );\n\t\t\t *  }\n\t\t\t * Basically we have a test for each sorting column, if the data in that column is equal,\n\t\t\t * test the next column. If all columns match, then we use a numeric sort on the row\n\t\t\t * positions in the original data array to provide a stable sort.\n\t\t\t *\n\t\t\t * Note - I know it seems excessive to have two sorting methods, but the first is around\n\t\t\t * 15% faster, so the second is only maintained for backwards compatibility with sorting\n\t\t\t * methods which do not have a pre-sort formatting function.\n\t\t\t */\n\t\t\tif ( formatters === aSort.length ) {\n\t\t\t\t// All sort types have formatting functions\n\t\t\t\tdisplayMaster.sort( function ( a, b ) {\n\t\t\t\t\tvar\n\t\t\t\t\t\tx, y, k, test, sort,\n\t\t\t\t\t\tlen=aSort.length,\n\t\t\t\t\t\tdataA = aoData[a]._aSortData,\n\t\t\t\t\t\tdataB = aoData[b]._aSortData;\n\t\n\t\t\t\t\tfor ( k=0 ; k<len ; k++ ) {\n\t\t\t\t\t\tsort = aSort[k];\n\t\n\t\t\t\t\t\tx = dataA[ sort.col ];\n\t\t\t\t\t\ty = dataB[ sort.col ];\n\t\n\t\t\t\t\t\ttest = x<y ? -1 : x>y ? 1 : 0;\n\t\t\t\t\t\tif ( test !== 0 ) {\n\t\t\t\t\t\t\treturn sort.dir === 'asc' ? test : -test;\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\n\t\t\t\t\tx = aiOrig[a];\n\t\t\t\t\ty = aiOrig[b];\n\t\t\t\t\treturn x<y ? -1 : x>y ? 1 : 0;\n\t\t\t\t} );\n\t\t\t}\n\t\t\telse {\n\t\t\t\t// Depreciated - remove in 1.11 (providing a plug-in option)\n\t\t\t\t// Not all sort types have formatting methods, so we have to call their sorting\n\t\t\t\t// methods.\n\t\t\t\tdisplayMaster.sort( function ( a, b ) {\n\t\t\t\t\tvar\n\t\t\t\t\t\tx, y, k, l, test, sort, fn,\n\t\t\t\t\t\tlen=aSort.length,\n\t\t\t\t\t\tdataA = aoData[a]._aSortData,\n\t\t\t\t\t\tdataB = aoData[b]._aSortData;\n\t\n\t\t\t\t\tfor ( k=0 ; k<len ; k++ ) {\n\t\t\t\t\t\tsort = aSort[k];\n\t\n\t\t\t\t\t\tx = dataA[ sort.col ];\n\t\t\t\t\t\ty = dataB[ sort.col ];\n\t\n\t\t\t\t\t\tfn = oExtSort[ sort.type+\"-\"+sort.dir ] || oExtSort[ \"string-\"+sort.dir ];\n\t\t\t\t\t\ttest = fn( x, y );\n\t\t\t\t\t\tif ( test !== 0 ) {\n\t\t\t\t\t\t\treturn test;\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\n\t\t\t\t\tx = aiOrig[a];\n\t\t\t\t\ty = aiOrig[b];\n\t\t\t\t\treturn x<y ? -1 : x>y ? 1 : 0;\n\t\t\t\t} );\n\t\t\t}\n\t\t}\n\t\n\t\t/* Tell the draw function that we have sorted the data */\n\t\toSettings.bSorted = true;\n\t}\n\t\n\t\n\tfunction _fnSortAria ( settings )\n\t{\n\t\tvar label;\n\t\tvar nextSort;\n\t\tvar columns = settings.aoColumns;\n\t\tvar aSort = _fnSortFlatten( settings );\n\t\tvar oAria = settings.oLanguage.oAria;\n\t\n\t\t// ARIA attributes - need to loop all columns, to update all (removing old\n\t\t// attributes as needed)\n\t\tfor ( var i=0, iLen=columns.length ; i<iLen ; i++ )\n\t\t{\n\t\t\tvar col = columns[i];\n\t\t\tvar asSorting = col.asSorting;\n\t\t\tvar sTitle = col.ariaTitle || col.sTitle.replace( /<.*?>/g, \"\" );\n\t\t\tvar th = col.nTh;\n\t\n\t\t\t// IE7 is throwing an error when setting these properties with jQuery's\n\t\t\t// attr() and removeAttr() methods...\n\t\t\tth.removeAttribute('aria-sort');\n\t\n\t\t\t/* In ARIA only the first sorting column can be marked as sorting - no multi-sort option */\n\t\t\tif ( col.bSortable ) {\n\t\t\t\tif ( aSort.length > 0 && aSort[0].col == i ) {\n\t\t\t\t\tth.setAttribute('aria-sort', aSort[0].dir==\"asc\" ? \"ascending\" : \"descending\" );\n\t\t\t\t\tnextSort = asSorting[ aSort[0].index+1 ] || asSorting[0];\n\t\t\t\t}\n\t\t\t\telse {\n\t\t\t\t\tnextSort = asSorting[0];\n\t\t\t\t}\n\t\n\t\t\t\tlabel = sTitle + ( nextSort === \"asc\" ?\n\t\t\t\t\toAria.sSortAscending :\n\t\t\t\t\toAria.sSortDescending\n\t\t\t\t);\n\t\t\t}\n\t\t\telse {\n\t\t\t\tlabel = sTitle;\n\t\t\t}\n\t\n\t\t\tth.setAttribute('aria-label', label);\n\t\t}\n\t}\n\t\n\t\n\t/**\n\t * Function to run on user sort request\n\t *  @param {object} settings dataTables settings object\n\t *  @param {node} attachTo node to attach the handler to\n\t *  @param {int} colIdx column sorting index\n\t *  @param {boolean} [append=false] Append the requested sort to the existing\n\t *    sort if true (i.e. multi-column sort)\n\t *  @param {function} [callback] callback function\n\t *  @memberof DataTable#oApi\n\t */\n\tfunction _fnSortListener ( settings, colIdx, append, callback )\n\t{\n\t\tvar col = settings.aoColumns[ colIdx ];\n\t\tvar sorting = settings.aaSorting;\n\t\tvar asSorting = col.asSorting;\n\t\tvar nextSortIdx;\n\t\tvar next = function ( a, overflow ) {\n\t\t\tvar idx = a._idx;\n\t\t\tif ( idx === undefined ) {\n\t\t\t\tidx = $.inArray( a[1], asSorting );\n\t\t\t}\n\t\n\t\t\treturn idx+1 < asSorting.length ?\n\t\t\t\tidx+1 :\n\t\t\t\toverflow ?\n\t\t\t\t\tnull :\n\t\t\t\t\t0;\n\t\t};\n\t\n\t\t// Convert to 2D array if needed\n\t\tif ( typeof sorting[0] === 'number' ) {\n\t\t\tsorting = settings.aaSorting = [ sorting ];\n\t\t}\n\t\n\t\t// If appending the sort then we are multi-column sorting\n\t\tif ( append && settings.oFeatures.bSortMulti ) {\n\t\t\t// Are we already doing some kind of sort on this column?\n\t\t\tvar sortIdx = $.inArray( colIdx, _pluck(sorting, '0') );\n\t\n\t\t\tif ( sortIdx !== -1 ) {\n\t\t\t\t// Yes, modify the sort\n\t\t\t\tnextSortIdx = next( sorting[sortIdx], true );\n\t\n\t\t\t\tif ( nextSortIdx === null && sorting.length === 1 ) {\n\t\t\t\t\tnextSortIdx = 0; // can't remove sorting completely\n\t\t\t\t}\n\t\n\t\t\t\tif ( nextSortIdx === null ) {\n\t\t\t\t\tsorting.splice( sortIdx, 1 );\n\t\t\t\t}\n\t\t\t\telse {\n\t\t\t\t\tsorting[sortIdx][1] = asSorting[ nextSortIdx ];\n\t\t\t\t\tsorting[sortIdx]._idx = nextSortIdx;\n\t\t\t\t}\n\t\t\t}\n\t\t\telse {\n\t\t\t\t// No sort on this column yet\n\t\t\t\tsorting.push( [ colIdx, asSorting[0], 0 ] );\n\t\t\t\tsorting[sorting.length-1]._idx = 0;\n\t\t\t}\n\t\t}\n\t\telse if ( sorting.length && sorting[0][0] == colIdx ) {\n\t\t\t// Single column - already sorting on this column, modify the sort\n\t\t\tnextSortIdx = next( sorting[0] );\n\t\n\t\t\tsorting.length = 1;\n\t\t\tsorting[0][1] = asSorting[ nextSortIdx ];\n\t\t\tsorting[0]._idx = nextSortIdx;\n\t\t}\n\t\telse {\n\t\t\t// Single column - sort only on this column\n\t\t\tsorting.length = 0;\n\t\t\tsorting.push( [ colIdx, asSorting[0] ] );\n\t\t\tsorting[0]._idx = 0;\n\t\t}\n\t\n\t\t// Run the sort by calling a full redraw\n\t\t_fnReDraw( settings );\n\t\n\t\t// callback used for async user interaction\n\t\tif ( typeof callback == 'function' ) {\n\t\t\tcallback( settings );\n\t\t}\n\t}\n\t\n\t\n\t/**\n\t * Attach a sort handler (click) to a node\n\t *  @param {object} settings dataTables settings object\n\t *  @param {node} attachTo node to attach the handler to\n\t *  @param {int} colIdx column sorting index\n\t *  @param {function} [callback] callback function\n\t *  @memberof DataTable#oApi\n\t */\n\tfunction _fnSortAttachListener ( settings, attachTo, colIdx, callback )\n\t{\n\t\tvar col = settings.aoColumns[ colIdx ];\n\t\n\t\t_fnBindAction( attachTo, {}, function (e) {\n\t\t\t/* If the column is not sortable - don't to anything */\n\t\t\tif ( col.bSortable === false ) {\n\t\t\t\treturn;\n\t\t\t}\n\t\n\t\t\t// If processing is enabled use a timeout to allow the processing\n\t\t\t// display to be shown - otherwise to it synchronously\n\t\t\tif ( settings.oFeatures.bProcessing ) {\n\t\t\t\t_fnProcessingDisplay( settings, true );\n\t\n\t\t\t\tsetTimeout( function() {\n\t\t\t\t\t_fnSortListener( settings, colIdx, e.shiftKey, callback );\n\t\n\t\t\t\t\t// In server-side processing, the draw callback will remove the\n\t\t\t\t\t// processing display\n\t\t\t\t\tif ( _fnDataSource( settings ) !== 'ssp' ) {\n\t\t\t\t\t\t_fnProcessingDisplay( settings, false );\n\t\t\t\t\t}\n\t\t\t\t}, 0 );\n\t\t\t}\n\t\t\telse {\n\t\t\t\t_fnSortListener( settings, colIdx, e.shiftKey, callback );\n\t\t\t}\n\t\t} );\n\t}\n\t\n\t\n\t/**\n\t * Set the sorting classes on table's body, Note: it is safe to call this function\n\t * when bSort and bSortClasses are false\n\t *  @param {object} oSettings dataTables settings object\n\t *  @memberof DataTable#oApi\n\t */\n\tfunction _fnSortingClasses( settings )\n\t{\n\t\tvar oldSort = settings.aLastSort;\n\t\tvar sortClass = settings.oClasses.sSortColumn;\n\t\tvar sort = _fnSortFlatten( settings );\n\t\tvar features = settings.oFeatures;\n\t\tvar i, ien, colIdx;\n\t\n\t\tif ( features.bSort && features.bSortClasses ) {\n\t\t\t// Remove old sorting classes\n\t\t\tfor ( i=0, ien=oldSort.length ; i<ien ; i++ ) {\n\t\t\t\tcolIdx = oldSort[i].src;\n\t\n\t\t\t\t// Remove column sorting\n\t\t\t\t$( _pluck( settings.aoData, 'anCells', colIdx ) )\n\t\t\t\t\t.removeClass( sortClass + (i<2 ? i+1 : 3) );\n\t\t\t}\n\t\n\t\t\t// Add new column sorting\n\t\t\tfor ( i=0, ien=sort.length ; i<ien ; i++ ) {\n\t\t\t\tcolIdx = sort[i].src;\n\t\n\t\t\t\t$( _pluck( settings.aoData, 'anCells', colIdx ) )\n\t\t\t\t\t.addClass( sortClass + (i<2 ? i+1 : 3) );\n\t\t\t}\n\t\t}\n\t\n\t\tsettings.aLastSort = sort;\n\t}\n\t\n\t\n\t// Get the data to sort a column, be it from cache, fresh (populating the\n\t// cache), or from a sort formatter\n\tfunction _fnSortData( settings, idx )\n\t{\n\t\t// Custom sorting function - provided by the sort data type\n\t\tvar column = settings.aoColumns[ idx ];\n\t\tvar customSort = DataTable.ext.order[ column.sSortDataType ];\n\t\tvar customData;\n\t\n\t\tif ( customSort ) {\n\t\t\tcustomData = customSort.call( settings.oInstance, settings, idx,\n\t\t\t\t_fnColumnIndexToVisible( settings, idx )\n\t\t\t);\n\t\t}\n\t\n\t\t// Use / populate cache\n\t\tvar row, cellData;\n\t\tvar formatter = DataTable.ext.type.order[ column.sType+\"-pre\" ];\n\t\n\t\tfor ( var i=0, ien=settings.aoData.length ; i<ien ; i++ ) {\n\t\t\trow = settings.aoData[i];\n\t\n\t\t\tif ( ! row._aSortData ) {\n\t\t\t\trow._aSortData = [];\n\t\t\t}\n\t\n\t\t\tif ( ! row._aSortData[idx] || customSort ) {\n\t\t\t\tcellData = customSort ?\n\t\t\t\t\tcustomData[i] : // If there was a custom sort function, use data from there\n\t\t\t\t\t_fnGetCellData( settings, i, idx, 'sort' );\n\t\n\t\t\t\trow._aSortData[ idx ] = formatter ?\n\t\t\t\t\tformatter( cellData ) :\n\t\t\t\t\tcellData;\n\t\t\t}\n\t\t}\n\t}\n\t\n\t\n\t\n\t/**\n\t * Save the state of a table\n\t *  @param {object} oSettings dataTables settings object\n\t *  @memberof DataTable#oApi\n\t */\n\tfunction _fnSaveState ( settings )\n\t{\n\t\tif (settings._bLoadingState) {\n\t\t\treturn;\n\t\t}\n\t\n\t\t/* Store the interesting variables */\n\t\tvar state = {\n\t\t\ttime:    +new Date(),\n\t\t\tstart:   settings._iDisplayStart,\n\t\t\tlength:  settings._iDisplayLength,\n\t\t\torder:   $.extend( true, [], settings.aaSorting ),\n\t\t\tsearch:  _fnSearchToCamel( settings.oPreviousSearch ),\n\t\t\tcolumns: $.map( settings.aoColumns, function ( col, i ) {\n\t\t\t\treturn {\n\t\t\t\t\tvisible: col.bVisible,\n\t\t\t\t\tsearch: _fnSearchToCamel( settings.aoPreSearchCols[i] )\n\t\t\t\t};\n\t\t\t} )\n\t\t};\n\t\n\t\tsettings.oSavedState = state;\n\t\t_fnCallbackFire( settings, \"aoStateSaveParams\", 'stateSaveParams', [settings, state] );\n\t\t\n\t\tif ( settings.oFeatures.bStateSave && !settings.bDestroying )\n\t\t{\n\t\t\tsettings.fnStateSaveCallback.call( settings.oInstance, settings, state );\n\t\t}\t\n\t}\n\t\n\t\n\t/**\n\t * Attempt to load a saved table state\n\t *  @param {object} oSettings dataTables settings object\n\t *  @param {object} oInit DataTables init object so we can override settings\n\t *  @param {function} callback Callback to execute when the state has been loaded\n\t *  @memberof DataTable#oApi\n\t */\n\tfunction _fnLoadState ( settings, oInit, callback )\n\t{\n\t\tif ( ! settings.oFeatures.bStateSave ) {\n\t\t\tcallback();\n\t\t\treturn;\n\t\t}\n\t\n\t\tvar loaded = function(state) {\n\t\t\t_fnImplementState(settings, state, callback);\n\t\t}\n\t\n\t\tvar state = settings.fnStateLoadCallback.call( settings.oInstance, settings, loaded );\n\t\n\t\tif ( state !== undefined ) {\n\t\t\t_fnImplementState( settings, state, callback );\n\t\t}\n\t\t// otherwise, wait for the loaded callback to be executed\n\t\n\t\treturn true;\n\t}\n\t\n\tfunction _fnImplementState ( settings, s, callback) {\n\t\tvar i, ien;\n\t\tvar columns = settings.aoColumns;\n\t\tsettings._bLoadingState = true;\n\t\n\t\t// When StateRestore was introduced the state could now be implemented at any time\n\t\t// Not just initialisation. To do this an api instance is required in some places\n\t\tvar api = settings._bInitComplete ? new DataTable.Api(settings) : null;\n\t\n\t\tif ( ! s || ! s.time ) {\n\t\t\tsettings._bLoadingState = false;\n\t\t\tcallback();\n\t\t\treturn;\n\t\t}\n\t\n\t\t// Allow custom and plug-in manipulation functions to alter the saved data set and\n\t\t// cancelling of loading by returning false\n\t\tvar abStateLoad = _fnCallbackFire( settings, 'aoStateLoadParams', 'stateLoadParams', [settings, s] );\n\t\tif ( $.inArray( false, abStateLoad ) !== -1 ) {\n\t\t\tsettings._bLoadingState = false;\n\t\t\tcallback();\n\t\t\treturn;\n\t\t}\n\t\n\t\t// Reject old data\n\t\tvar duration = settings.iStateDuration;\n\t\tif ( duration > 0 && s.time < +new Date() - (duration*1000) ) {\n\t\t\tsettings._bLoadingState = false;\n\t\t\tcallback();\n\t\t\treturn;\n\t\t}\n\t\n\t\t// Number of columns have changed - all bets are off, no restore of settings\n\t\tif ( s.columns && columns.length !== s.columns.length ) {\n\t\t\tsettings._bLoadingState = false;\n\t\t\tcallback();\n\t\t\treturn;\n\t\t}\n\t\n\t\t// Store the saved state so it might be accessed at any time\n\t\tsettings.oLoadedState = $.extend( true, {}, s );\n\t\n\t\t// Restore key features - todo - for 1.11 this needs to be done by\n\t\t// subscribed events\n\t\tif ( s.start !== undefined ) {\n\t\t\tif(api === null) {\n\t\t\t\tsettings._iDisplayStart    = s.start;\n\t\t\t\tsettings.iInitDisplayStart = s.start;\n\t\t\t}\n\t\t\telse {\n\t\t\t\t_fnPageChange(settings, s.start/s.length);\n\t\n\t\t\t}\n\t\t}\n\t\tif ( s.length !== undefined ) {\n\t\t\tsettings._iDisplayLength   = s.length;\n\t\t}\n\t\n\t\t// Order\n\t\tif ( s.order !== undefined ) {\n\t\t\tsettings.aaSorting = [];\n\t\t\t$.each( s.order, function ( i, col ) {\n\t\t\t\tsettings.aaSorting.push( col[0] >= columns.length ?\n\t\t\t\t\t[ 0, col[1] ] :\n\t\t\t\t\tcol\n\t\t\t\t);\n\t\t\t} );\n\t\t}\n\t\n\t\t// Search\n\t\tif ( s.search !== undefined ) {\n\t\t\t$.extend( settings.oPreviousSearch, _fnSearchToHung( s.search ) );\n\t\t}\n\t\n\t\t// Columns\n\t\tif ( s.columns ) {\n\t\t\tfor ( i=0, ien=s.columns.length ; i<ien ; i++ ) {\n\t\t\t\tvar col = s.columns[i];\n\t\n\t\t\t\t// Visibility\n\t\t\t\tif ( col.visible !== undefined ) {\n\t\t\t\t\t// If the api is defined, the table has been initialised so we need to use it rather than internal settings\n\t\t\t\t\tif (api) {\n\t\t\t\t\t\t// Don't redraw the columns on every iteration of this loop, we will do this at the end instead\n\t\t\t\t\t\tapi.column(i).visible(col.visible, false);\n\t\t\t\t\t}\n\t\t\t\t\telse {\n\t\t\t\t\t\tcolumns[i].bVisible = col.visible;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\n\t\t\t\t// Search\n\t\t\t\tif ( col.search !== undefined ) {\n\t\t\t\t\t$.extend( settings.aoPreSearchCols[i], _fnSearchToHung( col.search ) );\n\t\t\t\t}\n\t\t\t}\n\t\t\t\n\t\t\t// If the api is defined then we need to adjust the columns once the visibility has been changed\n\t\t\tif (api) {\n\t\t\t\tapi.columns.adjust();\n\t\t\t}\n\t\t}\n\t\n\t\tsettings._bLoadingState = false;\n\t\t_fnCallbackFire( settings, 'aoStateLoaded', 'stateLoaded', [settings, s] );\n\t\tcallback();\n\t};\n\t\n\t\n\t/**\n\t * Return the settings object for a particular table\n\t *  @param {node} table table we are using as a dataTable\n\t *  @returns {object} Settings object - or null if not found\n\t *  @memberof DataTable#oApi\n\t */\n\tfunction _fnSettingsFromNode ( table )\n\t{\n\t\tvar settings = DataTable.settings;\n\t\tvar idx = $.inArray( table, _pluck( settings, 'nTable' ) );\n\t\n\t\treturn idx !== -1 ?\n\t\t\tsettings[ idx ] :\n\t\t\tnull;\n\t}\n\t\n\t\n\t/**\n\t * Log an error message\n\t *  @param {object} settings dataTables settings object\n\t *  @param {int} level log error messages, or display them to the user\n\t *  @param {string} msg error message\n\t *  @param {int} tn Technical note id to get more information about the error.\n\t *  @memberof DataTable#oApi\n\t */\n\tfunction _fnLog( settings, level, msg, tn )\n\t{\n\t\tmsg = 'DataTables warning: '+\n\t\t\t(settings ? 'table id='+settings.sTableId+' - ' : '')+msg;\n\t\n\t\tif ( tn ) {\n\t\t\tmsg += '. For more information about this error, please see '+\n\t\t\t'http://datatables.net/tn/'+tn;\n\t\t}\n\t\n\t\tif ( ! level  ) {\n\t\t\t// Backwards compatibility pre 1.10\n\t\t\tvar ext = DataTable.ext;\n\t\t\tvar type = ext.sErrMode || ext.errMode;\n\t\n\t\t\tif ( settings ) {\n\t\t\t\t_fnCallbackFire( settings, null, 'error', [ settings, tn, msg ] );\n\t\t\t}\n\t\n\t\t\tif ( type == 'alert' ) {\n\t\t\t\talert( msg );\n\t\t\t}\n\t\t\telse if ( type == 'throw' ) {\n\t\t\t\tthrow new Error(msg);\n\t\t\t}\n\t\t\telse if ( typeof type == 'function' ) {\n\t\t\t\ttype( settings, tn, msg );\n\t\t\t}\n\t\t}\n\t\telse if ( window.console && console.log ) {\n\t\t\tconsole.log( msg );\n\t\t}\n\t}\n\t\n\t\n\t/**\n\t * See if a property is defined on one object, if so assign it to the other object\n\t *  @param {object} ret target object\n\t *  @param {object} src source object\n\t *  @param {string} name property\n\t *  @param {string} [mappedName] name to map too - optional, name used if not given\n\t *  @memberof DataTable#oApi\n\t */\n\tfunction _fnMap( ret, src, name, mappedName )\n\t{\n\t\tif ( Array.isArray( name ) ) {\n\t\t\t$.each( name, function (i, val) {\n\t\t\t\tif ( Array.isArray( val ) ) {\n\t\t\t\t\t_fnMap( ret, src, val[0], val[1] );\n\t\t\t\t}\n\t\t\t\telse {\n\t\t\t\t\t_fnMap( ret, src, val );\n\t\t\t\t}\n\t\t\t} );\n\t\n\t\t\treturn;\n\t\t}\n\t\n\t\tif ( mappedName === undefined ) {\n\t\t\tmappedName = name;\n\t\t}\n\t\n\t\tif ( src[name] !== undefined ) {\n\t\t\tret[mappedName] = src[name];\n\t\t}\n\t}\n\t\n\t\n\t/**\n\t * Extend objects - very similar to jQuery.extend, but deep copy objects, and\n\t * shallow copy arrays. The reason we need to do this, is that we don't want to\n\t * deep copy array init values (such as aaSorting) since the dev wouldn't be\n\t * able to override them, but we do want to deep copy arrays.\n\t *  @param {object} out Object to extend\n\t *  @param {object} extender Object from which the properties will be applied to\n\t *      out\n\t *  @param {boolean} breakRefs If true, then arrays will be sliced to take an\n\t *      independent copy with the exception of the `data` or `aaData` parameters\n\t *      if they are present. This is so you can pass in a collection to\n\t *      DataTables and have that used as your data source without breaking the\n\t *      references\n\t *  @returns {object} out Reference, just for convenience - out === the return.\n\t *  @memberof DataTable#oApi\n\t *  @todo This doesn't take account of arrays inside the deep copied objects.\n\t */\n\tfunction _fnExtend( out, extender, breakRefs )\n\t{\n\t\tvar val;\n\t\n\t\tfor ( var prop in extender ) {\n\t\t\tif ( extender.hasOwnProperty(prop) ) {\n\t\t\t\tval = extender[prop];\n\t\n\t\t\t\tif ( $.isPlainObject( val ) ) {\n\t\t\t\t\tif ( ! $.isPlainObject( out[prop] ) ) {\n\t\t\t\t\t\tout[prop] = {};\n\t\t\t\t\t}\n\t\t\t\t\t$.extend( true, out[prop], val );\n\t\t\t\t}\n\t\t\t\telse if ( breakRefs && prop !== 'data' && prop !== 'aaData' && Array.isArray(val) ) {\n\t\t\t\t\tout[prop] = val.slice();\n\t\t\t\t}\n\t\t\t\telse {\n\t\t\t\t\tout[prop] = val;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\n\t\treturn out;\n\t}\n\t\n\t\n\t/**\n\t * Bind an event handers to allow a click or return key to activate the callback.\n\t * This is good for accessibility since a return on the keyboard will have the\n\t * same effect as a click, if the element has focus.\n\t *  @param {element} n Element to bind the action to\n\t *  @param {object} oData Data object to pass to the triggered function\n\t *  @param {function} fn Callback function for when the event is triggered\n\t *  @memberof DataTable#oApi\n\t */\n\tfunction _fnBindAction( n, oData, fn )\n\t{\n\t\t$(n)\n\t\t\t.on( 'click.DT', oData, function (e) {\n\t\t\t\t\t$(n).trigger('blur'); // Remove focus outline for mouse users\n\t\t\t\t\tfn(e);\n\t\t\t\t} )\n\t\t\t.on( 'keypress.DT', oData, function (e){\n\t\t\t\t\tif ( e.which === 13 ) {\n\t\t\t\t\t\te.preventDefault();\n\t\t\t\t\t\tfn(e);\n\t\t\t\t\t}\n\t\t\t\t} )\n\t\t\t.on( 'selectstart.DT', function () {\n\t\t\t\t\t/* Take the brutal approach to cancelling text selection */\n\t\t\t\t\treturn false;\n\t\t\t\t} );\n\t}\n\t\n\t\n\t/**\n\t * Register a callback function. Easily allows a callback function to be added to\n\t * an array store of callback functions that can then all be called together.\n\t *  @param {object} oSettings dataTables settings object\n\t *  @param {string} sStore Name of the array storage for the callbacks in oSettings\n\t *  @param {function} fn Function to be called back\n\t *  @param {string} sName Identifying name for the callback (i.e. a label)\n\t *  @memberof DataTable#oApi\n\t */\n\tfunction _fnCallbackReg( oSettings, sStore, fn, sName )\n\t{\n\t\tif ( fn )\n\t\t{\n\t\t\toSettings[sStore].push( {\n\t\t\t\t\"fn\": fn,\n\t\t\t\t\"sName\": sName\n\t\t\t} );\n\t\t}\n\t}\n\t\n\t\n\t/**\n\t * Fire callback functions and trigger events. Note that the loop over the\n\t * callback array store is done backwards! Further note that you do not want to\n\t * fire off triggers in time sensitive applications (for example cell creation)\n\t * as its slow.\n\t *  @param {object} settings dataTables settings object\n\t *  @param {string} callbackArr Name of the array storage for the callbacks in\n\t *      oSettings\n\t *  @param {string} eventName Name of the jQuery custom event to trigger. If\n\t *      null no trigger is fired\n\t *  @param {array} args Array of arguments to pass to the callback function /\n\t *      trigger\n\t *  @memberof DataTable#oApi\n\t */\n\tfunction _fnCallbackFire( settings, callbackArr, eventName, args )\n\t{\n\t\tvar ret = [];\n\t\n\t\tif ( callbackArr ) {\n\t\t\tret = $.map( settings[callbackArr].slice().reverse(), function (val, i) {\n\t\t\t\treturn val.fn.apply( settings.oInstance, args );\n\t\t\t} );\n\t\t}\n\t\n\t\tif ( eventName !== null ) {\n\t\t\tvar e = $.Event( eventName+'.dt' );\n\t\n\t\t\t$(settings.nTable).trigger( e, args );\n\t\n\t\t\tret.push( e.result );\n\t\t}\n\t\n\t\treturn ret;\n\t}\n\t\n\t\n\tfunction _fnLengthOverflow ( settings )\n\t{\n\t\tvar\n\t\t\tstart = settings._iDisplayStart,\n\t\t\tend = settings.fnDisplayEnd(),\n\t\t\tlen = settings._iDisplayLength;\n\t\n\t\t/* If we have space to show extra rows (backing up from the end point - then do so */\n\t\tif ( start >= end )\n\t\t{\n\t\t\tstart = end - len;\n\t\t}\n\t\n\t\t// Keep the start record on the current page\n\t\tstart -= (start % len);\n\t\n\t\tif ( len === -1 || start < 0 )\n\t\t{\n\t\t\tstart = 0;\n\t\t}\n\t\n\t\tsettings._iDisplayStart = start;\n\t}\n\t\n\t\n\tfunction _fnRenderer( settings, type )\n\t{\n\t\tvar renderer = settings.renderer;\n\t\tvar host = DataTable.ext.renderer[type];\n\t\n\t\tif ( $.isPlainObject( renderer ) && renderer[type] ) {\n\t\t\t// Specific renderer for this type. If available use it, otherwise use\n\t\t\t// the default.\n\t\t\treturn host[renderer[type]] || host._;\n\t\t}\n\t\telse if ( typeof renderer === 'string' ) {\n\t\t\t// Common renderer - if there is one available for this type use it,\n\t\t\t// otherwise use the default\n\t\t\treturn host[renderer] || host._;\n\t\t}\n\t\n\t\t// Use the default\n\t\treturn host._;\n\t}\n\t\n\t\n\t/**\n\t * Detect the data source being used for the table. Used to simplify the code\n\t * a little (ajax) and to make it compress a little smaller.\n\t *\n\t *  @param {object} settings dataTables settings object\n\t *  @returns {string} Data source\n\t *  @memberof DataTable#oApi\n\t */\n\tfunction _fnDataSource ( settings )\n\t{\n\t\tif ( settings.oFeatures.bServerSide ) {\n\t\t\treturn 'ssp';\n\t\t}\n\t\telse if ( settings.ajax || settings.sAjaxSource ) {\n\t\t\treturn 'ajax';\n\t\t}\n\t\treturn 'dom';\n\t}\n\t\n\t\n\t\n\t\n\t/**\n\t * Computed structure of the DataTables API, defined by the options passed to\n\t * `DataTable.Api.register()` when building the API.\n\t *\n\t * The structure is built in order to speed creation and extension of the Api\n\t * objects since the extensions are effectively pre-parsed.\n\t *\n\t * The array is an array of objects with the following structure, where this\n\t * base array represents the Api prototype base:\n\t *\n\t *     [\n\t *       {\n\t *         name:      'data'                -- string   - Property name\n\t *         val:       function () {},       -- function - Api method (or undefined if just an object\n\t *         methodExt: [ ... ],              -- array    - Array of Api object definitions to extend the method result\n\t *         propExt:   [ ... ]               -- array    - Array of Api object definitions to extend the property\n\t *       },\n\t *       {\n\t *         name:     'row'\n\t *         val:       {},\n\t *         methodExt: [ ... ],\n\t *         propExt:   [\n\t *           {\n\t *             name:      'data'\n\t *             val:       function () {},\n\t *             methodExt: [ ... ],\n\t *             propExt:   [ ... ]\n\t *           },\n\t *           ...\n\t *         ]\n\t *       }\n\t *     ]\n\t *\n\t * @type {Array}\n\t * @ignore\n\t */\n\tvar __apiStruct = [];\n\t\n\t\n\t/**\n\t * `Array.prototype` reference.\n\t *\n\t * @type object\n\t * @ignore\n\t */\n\tvar __arrayProto = Array.prototype;\n\t\n\t\n\t/**\n\t * Abstraction for `context` parameter of the `Api` constructor to allow it to\n\t * take several different forms for ease of use.\n\t *\n\t * Each of the input parameter types will be converted to a DataTables settings\n\t * object where possible.\n\t *\n\t * @param  {string|node|jQuery|object} mixed DataTable identifier. Can be one\n\t *   of:\n\t *\n\t *   * `string` - jQuery selector. Any DataTables' matching the given selector\n\t *     with be found and used.\n\t *   * `node` - `TABLE` node which has already been formed into a DataTable.\n\t *   * `jQuery` - A jQuery object of `TABLE` nodes.\n\t *   * `object` - DataTables settings object\n\t *   * `DataTables.Api` - API instance\n\t * @return {array|null} Matching DataTables settings objects. `null` or\n\t *   `undefined` is returned if no matching DataTable is found.\n\t * @ignore\n\t */\n\tvar _toSettings = function ( mixed )\n\t{\n\t\tvar idx, jq;\n\t\tvar settings = DataTable.settings;\n\t\tvar tables = $.map( settings, function (el, i) {\n\t\t\treturn el.nTable;\n\t\t} );\n\t\n\t\tif ( ! mixed ) {\n\t\t\treturn [];\n\t\t}\n\t\telse if ( mixed.nTable && mixed.oApi ) {\n\t\t\t// DataTables settings object\n\t\t\treturn [ mixed ];\n\t\t}\n\t\telse if ( mixed.nodeName && mixed.nodeName.toLowerCase() === 'table' ) {\n\t\t\t// Table node\n\t\t\tidx = $.inArray( mixed, tables );\n\t\t\treturn idx !== -1 ? [ settings[idx] ] : null;\n\t\t}\n\t\telse if ( mixed && typeof mixed.settings === 'function' ) {\n\t\t\treturn mixed.settings().toArray();\n\t\t}\n\t\telse if ( typeof mixed === 'string' ) {\n\t\t\t// jQuery selector\n\t\t\tjq = $(mixed);\n\t\t}\n\t\telse if ( mixed instanceof $ ) {\n\t\t\t// jQuery object (also DataTables instance)\n\t\t\tjq = mixed;\n\t\t}\n\t\n\t\tif ( jq ) {\n\t\t\treturn jq.map( function(i) {\n\t\t\t\tidx = $.inArray( this, tables );\n\t\t\t\treturn idx !== -1 ? settings[idx] : null;\n\t\t\t} ).toArray();\n\t\t}\n\t};\n\t\n\t\n\t/**\n\t * DataTables API class - used to control and interface with  one or more\n\t * DataTables enhanced tables.\n\t *\n\t * The API class is heavily based on jQuery, presenting a chainable interface\n\t * that you can use to interact with tables. Each instance of the API class has\n\t * a \"context\" - i.e. the tables that it will operate on. This could be a single\n\t * table, all tables on a page or a sub-set thereof.\n\t *\n\t * Additionally the API is designed to allow you to easily work with the data in\n\t * the tables, retrieving and manipulating it as required. This is done by\n\t * presenting the API class as an array like interface. The contents of the\n\t * array depend upon the actions requested by each method (for example\n\t * `rows().nodes()` will return an array of nodes, while `rows().data()` will\n\t * return an array of objects or arrays depending upon your table's\n\t * configuration). The API object has a number of array like methods (`push`,\n\t * `pop`, `reverse` etc) as well as additional helper methods (`each`, `pluck`,\n\t * `unique` etc) to assist your working with the data held in a table.\n\t *\n\t * Most methods (those which return an Api instance) are chainable, which means\n\t * the return from a method call also has all of the methods available that the\n\t * top level object had. For example, these two calls are equivalent:\n\t *\n\t *     // Not chained\n\t *     api.row.add( {...} );\n\t *     api.draw();\n\t *\n\t *     // Chained\n\t *     api.row.add( {...} ).draw();\n\t *\n\t * @class DataTable.Api\n\t * @param {array|object|string|jQuery} context DataTable identifier. This is\n\t *   used to define which DataTables enhanced tables this API will operate on.\n\t *   Can be one of:\n\t *\n\t *   * `string` - jQuery selector. Any DataTables' matching the given selector\n\t *     with be found and used.\n\t *   * `node` - `TABLE` node which has already been formed into a DataTable.\n\t *   * `jQuery` - A jQuery object of `TABLE` nodes.\n\t *   * `object` - DataTables settings object\n\t * @param {array} [data] Data to initialise the Api instance with.\n\t *\n\t * @example\n\t *   // Direct initialisation during DataTables construction\n\t *   var api = $('#example').DataTable();\n\t *\n\t * @example\n\t *   // Initialisation using a DataTables jQuery object\n\t *   var api = $('#example').dataTable().api();\n\t *\n\t * @example\n\t *   // Initialisation as a constructor\n\t *   var api = new $.fn.DataTable.Api( 'table.dataTable' );\n\t */\n\t_Api = function ( context, data )\n\t{\n\t\tif ( ! (this instanceof _Api) ) {\n\t\t\treturn new _Api( context, data );\n\t\t}\n\t\n\t\tvar settings = [];\n\t\tvar ctxSettings = function ( o ) {\n\t\t\tvar a = _toSettings( o );\n\t\t\tif ( a ) {\n\t\t\t\tsettings.push.apply( settings, a );\n\t\t\t}\n\t\t};\n\t\n\t\tif ( Array.isArray( context ) ) {\n\t\t\tfor ( var i=0, ien=context.length ; i<ien ; i++ ) {\n\t\t\t\tctxSettings( context[i] );\n\t\t\t}\n\t\t}\n\t\telse {\n\t\t\tctxSettings( context );\n\t\t}\n\t\n\t\t// Remove duplicates\n\t\tthis.context = _unique( settings );\n\t\n\t\t// Initial data\n\t\tif ( data ) {\n\t\t\t$.merge( this, data );\n\t\t}\n\t\n\t\t// selector\n\t\tthis.selector = {\n\t\t\trows: null,\n\t\t\tcols: null,\n\t\t\topts: null\n\t\t};\n\t\n\t\t_Api.extend( this, this, __apiStruct );\n\t};\n\t\n\tDataTable.Api = _Api;\n\t\n\t// Don't destroy the existing prototype, just extend it. Required for jQuery 2's\n\t// isPlainObject.\n\t$.extend( _Api.prototype, {\n\t\tany: function ()\n\t\t{\n\t\t\treturn this.count() !== 0;\n\t\t},\n\t\n\t\n\t\tconcat:  __arrayProto.concat,\n\t\n\t\n\t\tcontext: [], // array of table settings objects\n\t\n\t\n\t\tcount: function ()\n\t\t{\n\t\t\treturn this.flatten().length;\n\t\t},\n\t\n\t\n\t\teach: function ( fn )\n\t\t{\n\t\t\tfor ( var i=0, ien=this.length ; i<ien; i++ ) {\n\t\t\t\tfn.call( this, this[i], i, this );\n\t\t\t}\n\t\n\t\t\treturn this;\n\t\t},\n\t\n\t\n\t\teq: function ( idx )\n\t\t{\n\t\t\tvar ctx = this.context;\n\t\n\t\t\treturn ctx.length > idx ?\n\t\t\t\tnew _Api( ctx[idx], this[idx] ) :\n\t\t\t\tnull;\n\t\t},\n\t\n\t\n\t\tfilter: function ( fn )\n\t\t{\n\t\t\tvar a = [];\n\t\n\t\t\tif ( __arrayProto.filter ) {\n\t\t\t\ta = __arrayProto.filter.call( this, fn, this );\n\t\t\t}\n\t\t\telse {\n\t\t\t\t// Compatibility for browsers without EMCA-252-5 (JS 1.6)\n\t\t\t\tfor ( var i=0, ien=this.length ; i<ien ; i++ ) {\n\t\t\t\t\tif ( fn.call( this, this[i], i, this ) ) {\n\t\t\t\t\t\ta.push( this[i] );\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\n\t\t\treturn new _Api( this.context, a );\n\t\t},\n\t\n\t\n\t\tflatten: function ()\n\t\t{\n\t\t\tvar a = [];\n\t\t\treturn new _Api( this.context, a.concat.apply( a, this.toArray() ) );\n\t\t},\n\t\n\t\n\t\tjoin:    __arrayProto.join,\n\t\n\t\n\t\tindexOf: __arrayProto.indexOf || function (obj, start)\n\t\t{\n\t\t\tfor ( var i=(start || 0), ien=this.length ; i<ien ; i++ ) {\n\t\t\t\tif ( this[i] === obj ) {\n\t\t\t\t\treturn i;\n\t\t\t\t}\n\t\t\t}\n\t\t\treturn -1;\n\t\t},\n\t\n\t\titerator: function ( flatten, type, fn, alwaysNew ) {\n\t\t\tvar\n\t\t\t\ta = [], ret,\n\t\t\t\ti, ien, j, jen,\n\t\t\t\tcontext = this.context,\n\t\t\t\trows, items, item,\n\t\t\t\tselector = this.selector;\n\t\n\t\t\t// Argument shifting\n\t\t\tif ( typeof flatten === 'string' ) {\n\t\t\t\talwaysNew = fn;\n\t\t\t\tfn = type;\n\t\t\t\ttype = flatten;\n\t\t\t\tflatten = false;\n\t\t\t}\n\t\n\t\t\tfor ( i=0, ien=context.length ; i<ien ; i++ ) {\n\t\t\t\tvar apiInst = new _Api( context[i] );\n\t\n\t\t\t\tif ( type === 'table' ) {\n\t\t\t\t\tret = fn.call( apiInst, context[i], i );\n\t\n\t\t\t\t\tif ( ret !== undefined ) {\n\t\t\t\t\t\ta.push( ret );\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\telse if ( type === 'columns' || type === 'rows' ) {\n\t\t\t\t\t// this has same length as context - one entry for each table\n\t\t\t\t\tret = fn.call( apiInst, context[i], this[i], i );\n\t\n\t\t\t\t\tif ( ret !== undefined ) {\n\t\t\t\t\t\ta.push( ret );\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\telse if ( type === 'column' || type === 'column-rows' || type === 'row' || type === 'cell' ) {\n\t\t\t\t\t// columns and rows share the same structure.\n\t\t\t\t\t// 'this' is an array of column indexes for each context\n\t\t\t\t\titems = this[i];\n\t\n\t\t\t\t\tif ( type === 'column-rows' ) {\n\t\t\t\t\t\trows = _selector_row_indexes( context[i], selector.opts );\n\t\t\t\t\t}\n\t\n\t\t\t\t\tfor ( j=0, jen=items.length ; j<jen ; j++ ) {\n\t\t\t\t\t\titem = items[j];\n\t\n\t\t\t\t\t\tif ( type === 'cell' ) {\n\t\t\t\t\t\t\tret = fn.call( apiInst, context[i], item.row, item.column, i, j );\n\t\t\t\t\t\t}\n\t\t\t\t\t\telse {\n\t\t\t\t\t\t\tret = fn.call( apiInst, context[i], item, i, j, rows );\n\t\t\t\t\t\t}\n\t\n\t\t\t\t\t\tif ( ret !== undefined ) {\n\t\t\t\t\t\t\ta.push( ret );\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\n\t\t\tif ( a.length || alwaysNew ) {\n\t\t\t\tvar api = new _Api( context, flatten ? a.concat.apply( [], a ) : a );\n\t\t\t\tvar apiSelector = api.selector;\n\t\t\t\tapiSelector.rows = selector.rows;\n\t\t\t\tapiSelector.cols = selector.cols;\n\t\t\t\tapiSelector.opts = selector.opts;\n\t\t\t\treturn api;\n\t\t\t}\n\t\t\treturn this;\n\t\t},\n\t\n\t\n\t\tlastIndexOf: __arrayProto.lastIndexOf || function (obj, start)\n\t\t{\n\t\t\t// Bit cheeky...\n\t\t\treturn this.indexOf.apply( this.toArray.reverse(), arguments );\n\t\t},\n\t\n\t\n\t\tlength:  0,\n\t\n\t\n\t\tmap: function ( fn )\n\t\t{\n\t\t\tvar a = [];\n\t\n\t\t\tif ( __arrayProto.map ) {\n\t\t\t\ta = __arrayProto.map.call( this, fn, this );\n\t\t\t}\n\t\t\telse {\n\t\t\t\t// Compatibility for browsers without EMCA-252-5 (JS 1.6)\n\t\t\t\tfor ( var i=0, ien=this.length ; i<ien ; i++ ) {\n\t\t\t\t\ta.push( fn.call( this, this[i], i ) );\n\t\t\t\t}\n\t\t\t}\n\t\n\t\t\treturn new _Api( this.context, a );\n\t\t},\n\t\n\t\n\t\tpluck: function ( prop )\n\t\t{\n\t\t\treturn this.map( function ( el ) {\n\t\t\t\treturn el[ prop ];\n\t\t\t} );\n\t\t},\n\t\n\t\tpop:     __arrayProto.pop,\n\t\n\t\n\t\tpush:    __arrayProto.push,\n\t\n\t\n\t\t// Does not return an API instance\n\t\treduce: __arrayProto.reduce || function ( fn, init )\n\t\t{\n\t\t\treturn _fnReduce( this, fn, init, 0, this.length, 1 );\n\t\t},\n\t\n\t\n\t\treduceRight: __arrayProto.reduceRight || function ( fn, init )\n\t\t{\n\t\t\treturn _fnReduce( this, fn, init, this.length-1, -1, -1 );\n\t\t},\n\t\n\t\n\t\treverse: __arrayProto.reverse,\n\t\n\t\n\t\t// Object with rows, columns and opts\n\t\tselector: null,\n\t\n\t\n\t\tshift:   __arrayProto.shift,\n\t\n\t\n\t\tslice: function () {\n\t\t\treturn new _Api( this.context, this );\n\t\t},\n\t\n\t\n\t\tsort:    __arrayProto.sort, // ? name - order?\n\t\n\t\n\t\tsplice:  __arrayProto.splice,\n\t\n\t\n\t\ttoArray: function ()\n\t\t{\n\t\t\treturn __arrayProto.slice.call( this );\n\t\t},\n\t\n\t\n\t\tto$: function ()\n\t\t{\n\t\t\treturn $( this );\n\t\t},\n\t\n\t\n\t\ttoJQuery: function ()\n\t\t{\n\t\t\treturn $( this );\n\t\t},\n\t\n\t\n\t\tunique: function ()\n\t\t{\n\t\t\treturn new _Api( this.context, _unique(this) );\n\t\t},\n\t\n\t\n\t\tunshift: __arrayProto.unshift\n\t} );\n\t\n\t\n\t_Api.extend = function ( scope, obj, ext )\n\t{\n\t\t// Only extend API instances and static properties of the API\n\t\tif ( ! ext.length || ! obj || ( ! (obj instanceof _Api) && ! obj.__dt_wrapper ) ) {\n\t\t\treturn;\n\t\t}\n\t\n\t\tvar\n\t\t\ti, ien,\n\t\t\tstruct,\n\t\t\tmethodScoping = function ( scope, fn, struc ) {\n\t\t\t\treturn function () {\n\t\t\t\t\tvar ret = fn.apply( scope, arguments );\n\t\n\t\t\t\t\t// Method extension\n\t\t\t\t\t_Api.extend( ret, ret, struc.methodExt );\n\t\t\t\t\treturn ret;\n\t\t\t\t};\n\t\t\t};\n\t\n\t\tfor ( i=0, ien=ext.length ; i<ien ; i++ ) {\n\t\t\tstruct = ext[i];\n\t\n\t\t\t// Value\n\t\t\tobj[ struct.name ] = struct.type === 'function' ?\n\t\t\t\tmethodScoping( scope, struct.val, struct ) :\n\t\t\t\tstruct.type === 'object' ?\n\t\t\t\t\t{} :\n\t\t\t\t\tstruct.val;\n\t\n\t\t\tobj[ struct.name ].__dt_wrapper = true;\n\t\n\t\t\t// Property extension\n\t\t\t_Api.extend( scope, obj[ struct.name ], struct.propExt );\n\t\t}\n\t};\n\t\n\t\n\t// @todo - Is there need for an augment function?\n\t// _Api.augment = function ( inst, name )\n\t// {\n\t// \t// Find src object in the structure from the name\n\t// \tvar parts = name.split('.');\n\t\n\t// \t_Api.extend( inst, obj );\n\t// };\n\t\n\t\n\t//     [\n\t//       {\n\t//         name:      'data'                -- string   - Property name\n\t//         val:       function () {},       -- function - Api method (or undefined if just an object\n\t//         methodExt: [ ... ],              -- array    - Array of Api object definitions to extend the method result\n\t//         propExt:   [ ... ]               -- array    - Array of Api object definitions to extend the property\n\t//       },\n\t//       {\n\t//         name:     'row'\n\t//         val:       {},\n\t//         methodExt: [ ... ],\n\t//         propExt:   [\n\t//           {\n\t//             name:      'data'\n\t//             val:       function () {},\n\t//             methodExt: [ ... ],\n\t//             propExt:   [ ... ]\n\t//           },\n\t//           ...\n\t//         ]\n\t//       }\n\t//     ]\n\t\n\t_Api.register = _api_register = function ( name, val )\n\t{\n\t\tif ( Array.isArray( name ) ) {\n\t\t\tfor ( var j=0, jen=name.length ; j<jen ; j++ ) {\n\t\t\t\t_Api.register( name[j], val );\n\t\t\t}\n\t\t\treturn;\n\t\t}\n\t\n\t\tvar\n\t\t\ti, ien,\n\t\t\their = name.split('.'),\n\t\t\tstruct = __apiStruct,\n\t\t\tkey, method;\n\t\n\t\tvar find = function ( src, name ) {\n\t\t\tfor ( var i=0, ien=src.length ; i<ien ; i++ ) {\n\t\t\t\tif ( src[i].name === name ) {\n\t\t\t\t\treturn src[i];\n\t\t\t\t}\n\t\t\t}\n\t\t\treturn null;\n\t\t};\n\t\n\t\tfor ( i=0, ien=heir.length ; i<ien ; i++ ) {\n\t\t\tmethod = heir[i].indexOf('()') !== -1;\n\t\t\tkey = method ?\n\t\t\t\their[i].replace('()', '') :\n\t\t\t\their[i];\n\t\n\t\t\tvar src = find( struct, key );\n\t\t\tif ( ! src ) {\n\t\t\t\tsrc = {\n\t\t\t\t\tname:      key,\n\t\t\t\t\tval:       {},\n\t\t\t\t\tmethodExt: [],\n\t\t\t\t\tpropExt:   [],\n\t\t\t\t\ttype:      'object'\n\t\t\t\t};\n\t\t\t\tstruct.push( src );\n\t\t\t}\n\t\n\t\t\tif ( i === ien-1 ) {\n\t\t\t\tsrc.val = val;\n\t\t\t\tsrc.type = typeof val === 'function' ?\n\t\t\t\t\t'function' :\n\t\t\t\t\t$.isPlainObject( val ) ?\n\t\t\t\t\t\t'object' :\n\t\t\t\t\t\t'other';\n\t\t\t}\n\t\t\telse {\n\t\t\t\tstruct = method ?\n\t\t\t\t\tsrc.methodExt :\n\t\t\t\t\tsrc.propExt;\n\t\t\t}\n\t\t}\n\t};\n\t\n\t_Api.registerPlural = _api_registerPlural = function ( pluralName, singularName, val ) {\n\t\t_Api.register( pluralName, val );\n\t\n\t\t_Api.register( singularName, function () {\n\t\t\tvar ret = val.apply( this, arguments );\n\t\n\t\t\tif ( ret === this ) {\n\t\t\t\t// Returned item is the API instance that was passed in, return it\n\t\t\t\treturn this;\n\t\t\t}\n\t\t\telse if ( ret instanceof _Api ) {\n\t\t\t\t// New API instance returned, want the value from the first item\n\t\t\t\t// in the returned array for the singular result.\n\t\t\t\treturn ret.length ?\n\t\t\t\t\tArray.isArray( ret[0] ) ?\n\t\t\t\t\t\tnew _Api( ret.context, ret[0] ) : // Array results are 'enhanced'\n\t\t\t\t\t\tret[0] :\n\t\t\t\t\tundefined;\n\t\t\t}\n\t\n\t\t\t// Non-API return - just fire it back\n\t\t\treturn ret;\n\t\t} );\n\t};\n\t\n\t\n\t/**\n\t * Selector for HTML tables. Apply the given selector to the give array of\n\t * DataTables settings objects.\n\t *\n\t * @param {string|integer} [selector] jQuery selector string or integer\n\t * @param  {array} Array of DataTables settings objects to be filtered\n\t * @return {array}\n\t * @ignore\n\t */\n\tvar __table_selector = function ( selector, a )\n\t{\n\t\tif ( Array.isArray(selector) ) {\n\t\t\treturn $.map( selector, function (item) {\n\t\t\t\treturn __table_selector(item, a);\n\t\t\t} );\n\t\t}\n\t\n\t\t// Integer is used to pick out a table by index\n\t\tif ( typeof selector === 'number' ) {\n\t\t\treturn [ a[ selector ] ];\n\t\t}\n\t\n\t\t// Perform a jQuery selector on the table nodes\n\t\tvar nodes = $.map( a, function (el, i) {\n\t\t\treturn el.nTable;\n\t\t} );\n\t\n\t\treturn $(nodes)\n\t\t\t.filter( selector )\n\t\t\t.map( function (i) {\n\t\t\t\t// Need to translate back from the table node to the settings\n\t\t\t\tvar idx = $.inArray( this, nodes );\n\t\t\t\treturn a[ idx ];\n\t\t\t} )\n\t\t\t.toArray();\n\t};\n\t\n\t\n\t\n\t/**\n\t * Context selector for the API's context (i.e. the tables the API instance\n\t * refers to.\n\t *\n\t * @name    DataTable.Api#tables\n\t * @param {string|integer} [selector] Selector to pick which tables the iterator\n\t *   should operate on. If not given, all tables in the current context are\n\t *   used. This can be given as a jQuery selector (for example `':gt(0)'`) to\n\t *   select multiple tables or as an integer to select a single table.\n\t * @returns {DataTable.Api} Returns a new API instance if a selector is given.\n\t */\n\t_api_register( 'tables()', function ( selector ) {\n\t\t// A new instance is created if there was a selector specified\n\t\treturn selector !== undefined && selector !== null ?\n\t\t\tnew _Api( __table_selector( selector, this.context ) ) :\n\t\t\tthis;\n\t} );\n\t\n\t\n\t_api_register( 'table()', function ( selector ) {\n\t\tvar tables = this.tables( selector );\n\t\tvar ctx = tables.context;\n\t\n\t\t// Truncate to the first matched table\n\t\treturn ctx.length ?\n\t\t\tnew _Api( ctx[0] ) :\n\t\t\ttables;\n\t} );\n\t\n\t\n\t_api_registerPlural( 'tables().nodes()', 'table().node()' , function () {\n\t\treturn this.iterator( 'table', function ( ctx ) {\n\t\t\treturn ctx.nTable;\n\t\t}, 1 );\n\t} );\n\t\n\t\n\t_api_registerPlural( 'tables().body()', 'table().body()' , function () {\n\t\treturn this.iterator( 'table', function ( ctx ) {\n\t\t\treturn ctx.nTBody;\n\t\t}, 1 );\n\t} );\n\t\n\t\n\t_api_registerPlural( 'tables().header()', 'table().header()' , function () {\n\t\treturn this.iterator( 'table', function ( ctx ) {\n\t\t\treturn ctx.nTHead;\n\t\t}, 1 );\n\t} );\n\t\n\t\n\t_api_registerPlural( 'tables().footer()', 'table().footer()' , function () {\n\t\treturn this.iterator( 'table', function ( ctx ) {\n\t\t\treturn ctx.nTFoot;\n\t\t}, 1 );\n\t} );\n\t\n\t\n\t_api_registerPlural( 'tables().containers()', 'table().container()' , function () {\n\t\treturn this.iterator( 'table', function ( ctx ) {\n\t\t\treturn ctx.nTableWrapper;\n\t\t}, 1 );\n\t} );\n\t\n\t\n\t\n\t/**\n\t * Redraw the tables in the current context.\n\t */\n\t_api_register( 'draw()', function ( paging ) {\n\t\treturn this.iterator( 'table', function ( settings ) {\n\t\t\tif ( paging === 'page' ) {\n\t\t\t\t_fnDraw( settings );\n\t\t\t}\n\t\t\telse {\n\t\t\t\tif ( typeof paging === 'string' ) {\n\t\t\t\t\tpaging = paging === 'full-hold' ?\n\t\t\t\t\t\tfalse :\n\t\t\t\t\t\ttrue;\n\t\t\t\t}\n\t\n\t\t\t\t_fnReDraw( settings, paging===false );\n\t\t\t}\n\t\t} );\n\t} );\n\t\n\t\n\t\n\t/**\n\t * Get the current page index.\n\t *\n\t * @return {integer} Current page index (zero based)\n\t *//**\n\t * Set the current page.\n\t *\n\t * Note that if you attempt to show a page which does not exist, DataTables will\n\t * not throw an error, but rather reset the paging.\n\t *\n\t * @param {integer|string} action The paging action to take. This can be one of:\n\t *  * `integer` - The page index to jump to\n\t *  * `string` - An action to take:\n\t *    * `first` - Jump to first page.\n\t *    * `next` - Jump to the next page\n\t *    * `previous` - Jump to previous page\n\t *    * `last` - Jump to the last page.\n\t * @returns {DataTables.Api} this\n\t */\n\t_api_register( 'page()', function ( action ) {\n\t\tif ( action === undefined ) {\n\t\t\treturn this.page.info().page; // not an expensive call\n\t\t}\n\t\n\t\t// else, have an action to take on all tables\n\t\treturn this.iterator( 'table', function ( settings ) {\n\t\t\t_fnPageChange( settings, action );\n\t\t} );\n\t} );\n\t\n\t\n\t/**\n\t * Paging information for the first table in the current context.\n\t *\n\t * If you require paging information for another table, use the `table()` method\n\t * with a suitable selector.\n\t *\n\t * @return {object} Object with the following properties set:\n\t *  * `page` - Current page index (zero based - i.e. the first page is `0`)\n\t *  * `pages` - Total number of pages\n\t *  * `start` - Display index for the first record shown on the current page\n\t *  * `end` - Display index for the last record shown on the current page\n\t *  * `length` - Display length (number of records). Note that generally `start\n\t *    + length = end`, but this is not always true, for example if there are\n\t *    only 2 records to show on the final page, with a length of 10.\n\t *  * `recordsTotal` - Full data set length\n\t *  * `recordsDisplay` - Data set length once the current filtering criterion\n\t *    are applied.\n\t */\n\t_api_register( 'page.info()', function ( action ) {\n\t\tif ( this.context.length === 0 ) {\n\t\t\treturn undefined;\n\t\t}\n\t\n\t\tvar\n\t\t\tsettings   = this.context[0],\n\t\t\tstart      = settings._iDisplayStart,\n\t\t\tlen        = settings.oFeatures.bPaginate ? settings._iDisplayLength : -1,\n\t\t\tvisRecords = settings.fnRecordsDisplay(),\n\t\t\tall        = len === -1;\n\t\n\t\treturn {\n\t\t\t\"page\":           all ? 0 : Math.floor( start / len ),\n\t\t\t\"pages\":          all ? 1 : Math.ceil( visRecords / len ),\n\t\t\t\"start\":          start,\n\t\t\t\"end\":            settings.fnDisplayEnd(),\n\t\t\t\"length\":         len,\n\t\t\t\"recordsTotal\":   settings.fnRecordsTotal(),\n\t\t\t\"recordsDisplay\": visRecords,\n\t\t\t\"serverSide\":     _fnDataSource( settings ) === 'ssp'\n\t\t};\n\t} );\n\t\n\t\n\t/**\n\t * Get the current page length.\n\t *\n\t * @return {integer} Current page length. Note `-1` indicates that all records\n\t *   are to be shown.\n\t *//**\n\t * Set the current page length.\n\t *\n\t * @param {integer} Page length to set. Use `-1` to show all records.\n\t * @returns {DataTables.Api} this\n\t */\n\t_api_register( 'page.len()', function ( len ) {\n\t\t// Note that we can't call this function 'length()' because `length`\n\t\t// is a Javascript property of functions which defines how many arguments\n\t\t// the function expects.\n\t\tif ( len === undefined ) {\n\t\t\treturn this.context.length !== 0 ?\n\t\t\t\tthis.context[0]._iDisplayLength :\n\t\t\t\tundefined;\n\t\t}\n\t\n\t\t// else, set the page length\n\t\treturn this.iterator( 'table', function ( settings ) {\n\t\t\t_fnLengthChange( settings, len );\n\t\t} );\n\t} );\n\t\n\t\n\t\n\tvar __reload = function ( settings, holdPosition, callback ) {\n\t\t// Use the draw event to trigger a callback\n\t\tif ( callback ) {\n\t\t\tvar api = new _Api( settings );\n\t\n\t\t\tapi.one( 'draw', function () {\n\t\t\t\tcallback( api.ajax.json() );\n\t\t\t} );\n\t\t}\n\t\n\t\tif ( _fnDataSource( settings ) == 'ssp' ) {\n\t\t\t_fnReDraw( settings, holdPosition );\n\t\t}\n\t\telse {\n\t\t\t_fnProcessingDisplay( settings, true );\n\t\n\t\t\t// Cancel an existing request\n\t\t\tvar xhr = settings.jqXHR;\n\t\t\tif ( xhr && xhr.readyState !== 4 ) {\n\t\t\t\txhr.abort();\n\t\t\t}\n\t\n\t\t\t// Trigger xhr\n\t\t\t_fnBuildAjax( settings, [], function( json ) {\n\t\t\t\t_fnClearTable( settings );\n\t\n\t\t\t\tvar data = _fnAjaxDataSrc( settings, json );\n\t\t\t\tfor ( var i=0, ien=data.length ; i<ien ; i++ ) {\n\t\t\t\t\t_fnAddData( settings, data[i] );\n\t\t\t\t}\n\t\n\t\t\t\t_fnReDraw( settings, holdPosition );\n\t\t\t\t_fnProcessingDisplay( settings, false );\n\t\t\t} );\n\t\t}\n\t};\n\t\n\t\n\t/**\n\t * Get the JSON response from the last Ajax request that DataTables made to the\n\t * server. Note that this returns the JSON from the first table in the current\n\t * context.\n\t *\n\t * @return {object} JSON received from the server.\n\t */\n\t_api_register( 'ajax.json()', function () {\n\t\tvar ctx = this.context;\n\t\n\t\tif ( ctx.length > 0 ) {\n\t\t\treturn ctx[0].json;\n\t\t}\n\t\n\t\t// else return undefined;\n\t} );\n\t\n\t\n\t/**\n\t * Get the data submitted in the last Ajax request\n\t */\n\t_api_register( 'ajax.params()', function () {\n\t\tvar ctx = this.context;\n\t\n\t\tif ( ctx.length > 0 ) {\n\t\t\treturn ctx[0].oAjaxData;\n\t\t}\n\t\n\t\t// else return undefined;\n\t} );\n\t\n\t\n\t/**\n\t * Reload tables from the Ajax data source. Note that this function will\n\t * automatically re-draw the table when the remote data has been loaded.\n\t *\n\t * @param {boolean} [reset=true] Reset (default) or hold the current paging\n\t *   position. A full re-sort and re-filter is performed when this method is\n\t *   called, which is why the pagination reset is the default action.\n\t * @returns {DataTables.Api} this\n\t */\n\t_api_register( 'ajax.reload()', function ( callback, resetPaging ) {\n\t\treturn this.iterator( 'table', function (settings) {\n\t\t\t__reload( settings, resetPaging===false, callback );\n\t\t} );\n\t} );\n\t\n\t\n\t/**\n\t * Get the current Ajax URL. Note that this returns the URL from the first\n\t * table in the current context.\n\t *\n\t * @return {string} Current Ajax source URL\n\t *//**\n\t * Set the Ajax URL. Note that this will set the URL for all tables in the\n\t * current context.\n\t *\n\t * @param {string} url URL to set.\n\t * @returns {DataTables.Api} this\n\t */\n\t_api_register( 'ajax.url()', function ( url ) {\n\t\tvar ctx = this.context;\n\t\n\t\tif ( url === undefined ) {\n\t\t\t// get\n\t\t\tif ( ctx.length === 0 ) {\n\t\t\t\treturn undefined;\n\t\t\t}\n\t\t\tctx = ctx[0];\n\t\n\t\t\treturn ctx.ajax ?\n\t\t\t\t$.isPlainObject( ctx.ajax ) ?\n\t\t\t\t\tctx.ajax.url :\n\t\t\t\t\tctx.ajax :\n\t\t\t\tctx.sAjaxSource;\n\t\t}\n\t\n\t\t// set\n\t\treturn this.iterator( 'table', function ( settings ) {\n\t\t\tif ( $.isPlainObject( settings.ajax ) ) {\n\t\t\t\tsettings.ajax.url = url;\n\t\t\t}\n\t\t\telse {\n\t\t\t\tsettings.ajax = url;\n\t\t\t}\n\t\t\t// No need to consider sAjaxSource here since DataTables gives priority\n\t\t\t// to `ajax` over `sAjaxSource`. So setting `ajax` here, renders any\n\t\t\t// value of `sAjaxSource` redundant.\n\t\t} );\n\t} );\n\t\n\t\n\t/**\n\t * Load data from the newly set Ajax URL. Note that this method is only\n\t * available when `ajax.url()` is used to set a URL. Additionally, this method\n\t * has the same effect as calling `ajax.reload()` but is provided for\n\t * convenience when setting a new URL. Like `ajax.reload()` it will\n\t * automatically redraw the table once the remote data has been loaded.\n\t *\n\t * @returns {DataTables.Api} this\n\t */\n\t_api_register( 'ajax.url().load()', function ( callback, resetPaging ) {\n\t\t// Same as a reload, but makes sense to present it for easy access after a\n\t\t// url change\n\t\treturn this.iterator( 'table', function ( ctx ) {\n\t\t\t__reload( ctx, resetPaging===false, callback );\n\t\t} );\n\t} );\n\t\n\t\n\t\n\t\n\tvar _selector_run = function ( type, selector, selectFn, settings, opts )\n\t{\n\t\tvar\n\t\t\tout = [], res,\n\t\t\ta, i, ien, j, jen,\n\t\t\tselectorType = typeof selector;\n\t\n\t\t// Can't just check for isArray here, as an API or jQuery instance might be\n\t\t// given with their array like look\n\t\tif ( ! selector || selectorType === 'string' || selectorType === 'function' || selector.length === undefined ) {\n\t\t\tselector = [ selector ];\n\t\t}\n\t\n\t\tfor ( i=0, ien=selector.length ; i<ien ; i++ ) {\n\t\t\t// Only split on simple strings - complex expressions will be jQuery selectors\n\t\t\ta = selector[i] && selector[i].split && ! selector[i].match(/[\\[\\(:]/) ?\n\t\t\t\tselector[i].split(',') :\n\t\t\t\t[ selector[i] ];\n\t\n\t\t\tfor ( j=0, jen=a.length ; j<jen ; j++ ) {\n\t\t\t\tres = selectFn( typeof a[j] === 'string' ? (a[j]).trim() : a[j] );\n\t\n\t\t\t\tif ( res && res.length ) {\n\t\t\t\t\tout = out.concat( res );\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\n\t\t// selector extensions\n\t\tvar ext = _ext.selector[ type ];\n\t\tif ( ext.length ) {\n\t\t\tfor ( i=0, ien=ext.length ; i<ien ; i++ ) {\n\t\t\t\tout = ext[i]( settings, opts, out );\n\t\t\t}\n\t\t}\n\t\n\t\treturn _unique( out );\n\t};\n\t\n\t\n\tvar _selector_opts = function ( opts )\n\t{\n\t\tif ( ! opts ) {\n\t\t\topts = {};\n\t\t}\n\t\n\t\t// Backwards compatibility for 1.9- which used the terminology filter rather\n\t\t// than search\n\t\tif ( opts.filter && opts.search === undefined ) {\n\t\t\topts.search = opts.filter;\n\t\t}\n\t\n\t\treturn $.extend( {\n\t\t\tsearch: 'none',\n\t\t\torder: 'current',\n\t\t\tpage: 'all'\n\t\t}, opts );\n\t};\n\t\n\t\n\tvar _selector_first = function ( inst )\n\t{\n\t\t// Reduce the API instance to the first item found\n\t\tfor ( var i=0, ien=inst.length ; i<ien ; i++ ) {\n\t\t\tif ( inst[i].length > 0 ) {\n\t\t\t\t// Assign the first element to the first item in the instance\n\t\t\t\t// and truncate the instance and context\n\t\t\t\tinst[0] = inst[i];\n\t\t\t\tinst[0].length = 1;\n\t\t\t\tinst.length = 1;\n\t\t\t\tinst.context = [ inst.context[i] ];\n\t\n\t\t\t\treturn inst;\n\t\t\t}\n\t\t}\n\t\n\t\t// Not found - return an empty instance\n\t\tinst.length = 0;\n\t\treturn inst;\n\t};\n\t\n\t\n\tvar _selector_row_indexes = function ( settings, opts )\n\t{\n\t\tvar\n\t\t\ti, ien, tmp, a=[],\n\t\t\tdisplayFiltered = settings.aiDisplay,\n\t\t\tdisplayMaster = settings.aiDisplayMaster;\n\t\n\t\tvar\n\t\t\tsearch = opts.search,  // none, applied, removed\n\t\t\torder  = opts.order,   // applied, current, index (original - compatibility with 1.9)\n\t\t\tpage   = opts.page;    // all, current\n\t\n\t\tif ( _fnDataSource( settings ) == 'ssp' ) {\n\t\t\t// In server-side processing mode, most options are irrelevant since\n\t\t\t// rows not shown don't exist and the index order is the applied order\n\t\t\t// Removed is a special case - for consistency just return an empty\n\t\t\t// array\n\t\t\treturn search === 'removed' ?\n\t\t\t\t[] :\n\t\t\t\t_range( 0, displayMaster.length );\n\t\t}\n\t\telse if ( page == 'current' ) {\n\t\t\t// Current page implies that order=current and filter=applied, since it is\n\t\t\t// fairly senseless otherwise, regardless of what order and search actually\n\t\t\t// are\n\t\t\tfor ( i=settings._iDisplayStart, ien=settings.fnDisplayEnd() ; i<ien ; i++ ) {\n\t\t\t\ta.push( displayFiltered[i] );\n\t\t\t}\n\t\t}\n\t\telse if ( order == 'current' || order == 'applied' ) {\n\t\t\tif ( search == 'none') {\n\t\t\t\ta = displayMaster.slice();\n\t\t\t}\n\t\t\telse if ( search == 'applied' ) {\n\t\t\t\ta = displayFiltered.slice();\n\t\t\t}\n\t\t\telse if ( search == 'removed' ) {\n\t\t\t\t// O(n+m) solution by creating a hash map\n\t\t\t\tvar displayFilteredMap = {};\n\t\n\t\t\t\tfor ( var i=0, ien=displayFiltered.length ; i<ien ; i++ ) {\n\t\t\t\t\tdisplayFilteredMap[displayFiltered[i]] = null;\n\t\t\t\t}\n\t\n\t\t\t\ta = $.map( displayMaster, function (el) {\n\t\t\t\t\treturn ! displayFilteredMap.hasOwnProperty(el) ?\n\t\t\t\t\t\tel :\n\t\t\t\t\t\tnull;\n\t\t\t\t} );\n\t\t\t}\n\t\t}\n\t\telse if ( order == 'index' || order == 'original' ) {\n\t\t\tfor ( i=0, ien=settings.aoData.length ; i<ien ; i++ ) {\n\t\t\t\tif ( search == 'none' ) {\n\t\t\t\t\ta.push( i );\n\t\t\t\t}\n\t\t\t\telse { // applied | removed\n\t\t\t\t\ttmp = $.inArray( i, displayFiltered );\n\t\n\t\t\t\t\tif ((tmp === -1 && search == 'removed') ||\n\t\t\t\t\t\t(tmp >= 0   && search == 'applied') )\n\t\t\t\t\t{\n\t\t\t\t\t\ta.push( i );\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\n\t\treturn a;\n\t};\n\t\n\t\n\t/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *\n\t * Rows\n\t *\n\t * {}          - no selector - use all available rows\n\t * {integer}   - row aoData index\n\t * {node}      - TR node\n\t * {string}    - jQuery selector to apply to the TR elements\n\t * {array}     - jQuery array of nodes, or simply an array of TR nodes\n\t *\n\t */\n\tvar __row_selector = function ( settings, selector, opts )\n\t{\n\t\tvar rows;\n\t\tvar run = function ( sel ) {\n\t\t\tvar selInt = _intVal( sel );\n\t\t\tvar i, ien;\n\t\t\tvar aoData = settings.aoData;\n\t\n\t\t\t// Short cut - selector is a number and no options provided (default is\n\t\t\t// all records, so no need to check if the index is in there, since it\n\t\t\t// must be - dev error if the index doesn't exist).\n\t\t\tif ( selInt !== null && ! opts ) {\n\t\t\t\treturn [ selInt ];\n\t\t\t}\n\t\n\t\t\tif ( ! rows ) {\n\t\t\t\trows = _selector_row_indexes( settings, opts );\n\t\t\t}\n\t\n\t\t\tif ( selInt !== null && $.inArray( selInt, rows ) !== -1 ) {\n\t\t\t\t// Selector - integer\n\t\t\t\treturn [ selInt ];\n\t\t\t}\n\t\t\telse if ( sel === null || sel === undefined || sel === '' ) {\n\t\t\t\t// Selector - none\n\t\t\t\treturn rows;\n\t\t\t}\n\t\n\t\t\t// Selector - function\n\t\t\tif ( typeof sel === 'function' ) {\n\t\t\t\treturn $.map( rows, function (idx) {\n\t\t\t\t\tvar row = aoData[ idx ];\n\t\t\t\t\treturn sel( idx, row._aData, row.nTr ) ? idx : null;\n\t\t\t\t} );\n\t\t\t}\n\t\n\t\t\t// Selector - node\n\t\t\tif ( sel.nodeName ) {\n\t\t\t\tvar rowIdx = sel._DT_RowIndex;  // Property added by DT for fast lookup\n\t\t\t\tvar cellIdx = sel._DT_CellIndex;\n\t\n\t\t\t\tif ( rowIdx !== undefined ) {\n\t\t\t\t\t// Make sure that the row is actually still present in the table\n\t\t\t\t\treturn aoData[ rowIdx ] && aoData[ rowIdx ].nTr === sel ?\n\t\t\t\t\t\t[ rowIdx ] :\n\t\t\t\t\t\t[];\n\t\t\t\t}\n\t\t\t\telse if ( cellIdx ) {\n\t\t\t\t\treturn aoData[ cellIdx.row ] && aoData[ cellIdx.row ].nTr === sel.parentNode ?\n\t\t\t\t\t\t[ cellIdx.row ] :\n\t\t\t\t\t\t[];\n\t\t\t\t}\n\t\t\t\telse {\n\t\t\t\t\tvar host = $(sel).closest('*[data-dt-row]');\n\t\t\t\t\treturn host.length ?\n\t\t\t\t\t\t[ host.data('dt-row') ] :\n\t\t\t\t\t\t[];\n\t\t\t\t}\n\t\t\t}\n\t\n\t\t\t// ID selector. Want to always be able to select rows by id, regardless\n\t\t\t// of if the tr element has been created or not, so can't rely upon\n\t\t\t// jQuery here - hence a custom implementation. This does not match\n\t\t\t// Sizzle's fast selector or HTML4 - in HTML5 the ID can be anything,\n\t\t\t// but to select it using a CSS selector engine (like Sizzle or\n\t\t\t// querySelect) it would need to need to be escaped for some characters.\n\t\t\t// DataTables simplifies this for row selectors since you can select\n\t\t\t// only a row. A # indicates an id any anything that follows is the id -\n\t\t\t// unescaped.\n\t\t\tif ( typeof sel === 'string' && sel.charAt(0) === '#' ) {\n\t\t\t\t// get row index from id\n\t\t\t\tvar rowObj = settings.aIds[ sel.replace( /^#/, '' ) ];\n\t\t\t\tif ( rowObj !== undefined ) {\n\t\t\t\t\treturn [ rowObj.idx ];\n\t\t\t\t}\n\t\n\t\t\t\t// need to fall through to jQuery in case there is DOM id that\n\t\t\t\t// matches\n\t\t\t}\n\t\t\t\n\t\t\t// Get nodes in the order from the `rows` array with null values removed\n\t\t\tvar nodes = _removeEmpty(\n\t\t\t\t_pluck_order( settings.aoData, rows, 'nTr' )\n\t\t\t);\n\t\n\t\t\t// Selector - jQuery selector string, array of nodes or jQuery object/\n\t\t\t// As jQuery's .filter() allows jQuery objects to be passed in filter,\n\t\t\t// it also allows arrays, so this will cope with all three options\n\t\t\treturn $(nodes)\n\t\t\t\t.filter( sel )\n\t\t\t\t.map( function () {\n\t\t\t\t\treturn this._DT_RowIndex;\n\t\t\t\t} )\n\t\t\t\t.toArray();\n\t\t};\n\t\n\t\treturn _selector_run( 'row', selector, run, settings, opts );\n\t};\n\t\n\t\n\t_api_register( 'rows()', function ( selector, opts ) {\n\t\t// argument shifting\n\t\tif ( selector === undefined ) {\n\t\t\tselector = '';\n\t\t}\n\t\telse if ( $.isPlainObject( selector ) ) {\n\t\t\topts = selector;\n\t\t\tselector = '';\n\t\t}\n\t\n\t\topts = _selector_opts( opts );\n\t\n\t\tvar inst = this.iterator( 'table', function ( settings ) {\n\t\t\treturn __row_selector( settings, selector, opts );\n\t\t}, 1 );\n\t\n\t\t// Want argument shifting here and in __row_selector?\n\t\tinst.selector.rows = selector;\n\t\tinst.selector.opts = opts;\n\t\n\t\treturn inst;\n\t} );\n\t\n\t_api_register( 'rows().nodes()', function () {\n\t\treturn this.iterator( 'row', function ( settings, row ) {\n\t\t\treturn settings.aoData[ row ].nTr || undefined;\n\t\t}, 1 );\n\t} );\n\t\n\t_api_register( 'rows().data()', function () {\n\t\treturn this.iterator( true, 'rows', function ( settings, rows ) {\n\t\t\treturn _pluck_order( settings.aoData, rows, '_aData' );\n\t\t}, 1 );\n\t} );\n\t\n\t_api_registerPlural( 'rows().cache()', 'row().cache()', function ( type ) {\n\t\treturn this.iterator( 'row', function ( settings, row ) {\n\t\t\tvar r = settings.aoData[ row ];\n\t\t\treturn type === 'search' ? r._aFilterData : r._aSortData;\n\t\t}, 1 );\n\t} );\n\t\n\t_api_registerPlural( 'rows().invalidate()', 'row().invalidate()', function ( src ) {\n\t\treturn this.iterator( 'row', function ( settings, row ) {\n\t\t\t_fnInvalidate( settings, row, src );\n\t\t} );\n\t} );\n\t\n\t_api_registerPlural( 'rows().indexes()', 'row().index()', function () {\n\t\treturn this.iterator( 'row', function ( settings, row ) {\n\t\t\treturn row;\n\t\t}, 1 );\n\t} );\n\t\n\t_api_registerPlural( 'rows().ids()', 'row().id()', function ( hash ) {\n\t\tvar a = [];\n\t\tvar context = this.context;\n\t\n\t\t// `iterator` will drop undefined values, but in this case we want them\n\t\tfor ( var i=0, ien=context.length ; i<ien ; i++ ) {\n\t\t\tfor ( var j=0, jen=this[i].length ; j<jen ; j++ ) {\n\t\t\t\tvar id = context[i].rowIdFn( context[i].aoData[ this[i][j] ]._aData );\n\t\t\t\ta.push( (hash === true ? '#' : '' )+ id );\n\t\t\t}\n\t\t}\n\t\n\t\treturn new _Api( context, a );\n\t} );\n\t\n\t_api_registerPlural( 'rows().remove()', 'row().remove()', function () {\n\t\tvar that = this;\n\t\n\t\tthis.iterator( 'row', function ( settings, row, thatIdx ) {\n\t\t\tvar data = settings.aoData;\n\t\t\tvar rowData = data[ row ];\n\t\t\tvar i, ien, j, jen;\n\t\t\tvar loopRow, loopCells;\n\t\n\t\t\tdata.splice( row, 1 );\n\t\n\t\t\t// Update the cached indexes\n\t\t\tfor ( i=0, ien=data.length ; i<ien ; i++ ) {\n\t\t\t\tloopRow = data[i];\n\t\t\t\tloopCells = loopRow.anCells;\n\t\n\t\t\t\t// Rows\n\t\t\t\tif ( loopRow.nTr !== null ) {\n\t\t\t\t\tloopRow.nTr._DT_RowIndex = i;\n\t\t\t\t}\n\t\n\t\t\t\t// Cells\n\t\t\t\tif ( loopCells !== null ) {\n\t\t\t\t\tfor ( j=0, jen=loopCells.length ; j<jen ; j++ ) {\n\t\t\t\t\t\tloopCells[j]._DT_CellIndex.row = i;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\n\t\t\t// Delete from the display arrays\n\t\t\t_fnDeleteIndex( settings.aiDisplayMaster, row );\n\t\t\t_fnDeleteIndex( settings.aiDisplay, row );\n\t\t\t_fnDeleteIndex( that[ thatIdx ], row, false ); // maintain local indexes\n\t\n\t\t\t// For server-side processing tables - subtract the deleted row from the count\n\t\t\tif ( settings._iRecordsDisplay > 0 ) {\n\t\t\t\tsettings._iRecordsDisplay--;\n\t\t\t}\n\t\n\t\t\t// Check for an 'overflow' they case for displaying the table\n\t\t\t_fnLengthOverflow( settings );\n\t\n\t\t\t// Remove the row's ID reference if there is one\n\t\t\tvar id = settings.rowIdFn( rowData._aData );\n\t\t\tif ( id !== undefined ) {\n\t\t\t\tdelete settings.aIds[ id ];\n\t\t\t}\n\t\t} );\n\t\n\t\tthis.iterator( 'table', function ( settings ) {\n\t\t\tfor ( var i=0, ien=settings.aoData.length ; i<ien ; i++ ) {\n\t\t\t\tsettings.aoData[i].idx = i;\n\t\t\t}\n\t\t} );\n\t\n\t\treturn this;\n\t} );\n\t\n\t\n\t_api_register( 'rows.add()', function ( rows ) {\n\t\tvar newRows = this.iterator( 'table', function ( settings ) {\n\t\t\t\tvar row, i, ien;\n\t\t\t\tvar out = [];\n\t\n\t\t\t\tfor ( i=0, ien=rows.length ; i<ien ; i++ ) {\n\t\t\t\t\trow = rows[i];\n\t\n\t\t\t\t\tif ( row.nodeName && row.nodeName.toUpperCase() === 'TR' ) {\n\t\t\t\t\t\tout.push( _fnAddTr( settings, row )[0] );\n\t\t\t\t\t}\n\t\t\t\t\telse {\n\t\t\t\t\t\tout.push( _fnAddData( settings, row ) );\n\t\t\t\t\t}\n\t\t\t\t}\n\t\n\t\t\t\treturn out;\n\t\t\t}, 1 );\n\t\n\t\t// Return an Api.rows() extended instance, so rows().nodes() etc can be used\n\t\tvar modRows = this.rows( -1 );\n\t\tmodRows.pop();\n\t\t$.merge( modRows, newRows );\n\t\n\t\treturn modRows;\n\t} );\n\t\n\t\n\t\n\t\n\t\n\t/**\n\t *\n\t */\n\t_api_register( 'row()', function ( selector, opts ) {\n\t\treturn _selector_first( this.rows( selector, opts ) );\n\t} );\n\t\n\t\n\t_api_register( 'row().data()', function ( data ) {\n\t\tvar ctx = this.context;\n\t\n\t\tif ( data === undefined ) {\n\t\t\t// Get\n\t\t\treturn ctx.length && this.length ?\n\t\t\t\tctx[0].aoData[ this[0] ]._aData :\n\t\t\t\tundefined;\n\t\t}\n\t\n\t\t// Set\n\t\tvar row = ctx[0].aoData[ this[0] ];\n\t\trow._aData = data;\n\t\n\t\t// If the DOM has an id, and the data source is an array\n\t\tif ( Array.isArray( data ) && row.nTr && row.nTr.id ) {\n\t\t\t_fnSetObjectDataFn( ctx[0].rowId )( data, row.nTr.id );\n\t\t}\n\t\n\t\t// Automatically invalidate\n\t\t_fnInvalidate( ctx[0], this[0], 'data' );\n\t\n\t\treturn this;\n\t} );\n\t\n\t\n\t_api_register( 'row().node()', function () {\n\t\tvar ctx = this.context;\n\t\n\t\treturn ctx.length && this.length ?\n\t\t\tctx[0].aoData[ this[0] ].nTr || null :\n\t\t\tnull;\n\t} );\n\t\n\t\n\t_api_register( 'row.add()', function ( row ) {\n\t\t// Allow a jQuery object to be passed in - only a single row is added from\n\t\t// it though - the first element in the set\n\t\tif ( row instanceof $ && row.length ) {\n\t\t\trow = row[0];\n\t\t}\n\t\n\t\tvar rows = this.iterator( 'table', function ( settings ) {\n\t\t\tif ( row.nodeName && row.nodeName.toUpperCase() === 'TR' ) {\n\t\t\t\treturn _fnAddTr( settings, row )[0];\n\t\t\t}\n\t\t\treturn _fnAddData( settings, row );\n\t\t} );\n\t\n\t\t// Return an Api.rows() extended instance, with the newly added row selected\n\t\treturn this.row( rows[0] );\n\t} );\n\t\n\t\n\t$(document).on('plugin-init.dt', function (e, context) {\n\t\tvar api = new _Api( context );\n\t\n\t\tapi.on( 'stateSaveParams', function ( e, settings, d ) {\n\t\t\t// This could be more compact with the API, but it is a lot faster as a simple\n\t\t\t// internal loop\n\t\t\tvar idFn = settings.rowIdFn;\n\t\t\tvar data = settings.aoData;\n\t\t\tvar ids = [];\n\t\n\t\t\tfor (var i=0 ; i<data.length ; i++) {\n\t\t\t\tif (data[i]._detailsShow) {\n\t\t\t\t\tids.push( '#' + idFn(data[i]._aData) );\n\t\t\t\t}\n\t\t\t}\n\t\n\t\t\td.childRows = ids;\n\t\t})\n\t\n\t\tvar loaded = api.state.loaded();\n\t\n\t\tif ( loaded && loaded.childRows ) {\n\t\t\tapi\n\t\t\t\t.rows( $.map(loaded.childRows, function (id){\n\t\t\t\t\treturn id.replace(/:/g, '\\\\:')\n\t\t\t\t}) )\n\t\t\t\t.every( function () {\n\t\t\t\t\t_fnCallbackFire( context, null, 'requestChild', [ this ] )\n\t\t\t\t});\n\t\t}\n\t});\n\t\n\tvar __details_add = function ( ctx, row, data, klass )\n\t{\n\t\t// Convert to array of TR elements\n\t\tvar rows = [];\n\t\tvar addRow = function ( r, k ) {\n\t\t\t// Recursion to allow for arrays of jQuery objects\n\t\t\tif ( Array.isArray( r ) || r instanceof $ ) {\n\t\t\t\tfor ( var i=0, ien=r.length ; i<ien ; i++ ) {\n\t\t\t\t\taddRow( r[i], k );\n\t\t\t\t}\n\t\t\t\treturn;\n\t\t\t}\n\t\n\t\t\t// If we get a TR element, then just add it directly - up to the dev\n\t\t\t// to add the correct number of columns etc\n\t\t\tif ( r.nodeName && r.nodeName.toLowerCase() === 'tr' ) {\n\t\t\t\trows.push( r );\n\t\t\t}\n\t\t\telse {\n\t\t\t\t// Otherwise create a row with a wrapper\n\t\t\t\tvar created = $('<tr><td></td></tr>').addClass( k );\n\t\t\t\t$('td', created)\n\t\t\t\t\t.addClass( k )\n\t\t\t\t\t.html( r )\n\t\t\t\t\t[0].colSpan = _fnVisbleColumns( ctx );\n\t\n\t\t\t\trows.push( created[0] );\n\t\t\t}\n\t\t};\n\t\n\t\taddRow( data, klass );\n\t\n\t\tif ( row._details ) {\n\t\t\trow._details.detach();\n\t\t}\n\t\n\t\trow._details = $(rows);\n\t\n\t\t// If the children were already shown, that state should be retained\n\t\tif ( row._detailsShow ) {\n\t\t\trow._details.insertAfter( row.nTr );\n\t\t}\n\t};\n\t\n\t\n\t// Make state saving of child row details async to allow them to be batch processed\n\tvar __details_state = DataTable.util.throttle(\n\t\tfunction (ctx) {\n\t\t\t_fnSaveState( ctx[0] )\n\t\t},\n\t\t500\n\t);\n\t\n\t\n\tvar __details_remove = function ( api, idx )\n\t{\n\t\tvar ctx = api.context;\n\t\n\t\tif ( ctx.length ) {\n\t\t\tvar row = ctx[0].aoData[ idx !== undefined ? idx : api[0] ];\n\t\n\t\t\tif ( row && row._details ) {\n\t\t\t\trow._details.remove();\n\t\n\t\t\t\trow._detailsShow = undefined;\n\t\t\t\trow._details = undefined;\n\t\t\t\t$( row.nTr ).removeClass( 'dt-hasChild' );\n\t\t\t\t__details_state( ctx );\n\t\t\t}\n\t\t}\n\t};\n\t\n\t\n\tvar __details_display = function ( api, show ) {\n\t\tvar ctx = api.context;\n\t\n\t\tif ( ctx.length && api.length ) {\n\t\t\tvar row = ctx[0].aoData[ api[0] ];\n\t\n\t\t\tif ( row._details ) {\n\t\t\t\trow._detailsShow = show;\n\t\n\t\t\t\tif ( show ) {\n\t\t\t\t\trow._details.insertAfter( row.nTr );\n\t\t\t\t\t$( row.nTr ).addClass( 'dt-hasChild' );\n\t\t\t\t}\n\t\t\t\telse {\n\t\t\t\t\trow._details.detach();\n\t\t\t\t\t$( row.nTr ).removeClass( 'dt-hasChild' );\n\t\t\t\t}\n\t\n\t\t\t\t_fnCallbackFire( ctx[0], null, 'childRow', [ show, api.row( api[0] ) ] )\n\t\n\t\t\t\t__details_events( ctx[0] );\n\t\t\t\t__details_state( ctx );\n\t\t\t}\n\t\t}\n\t};\n\t\n\t\n\tvar __details_events = function ( settings )\n\t{\n\t\tvar api = new _Api( settings );\n\t\tvar namespace = '.dt.DT_details';\n\t\tvar drawEvent = 'draw'+namespace;\n\t\tvar colvisEvent = 'column-visibility'+namespace;\n\t\tvar destroyEvent = 'destroy'+namespace;\n\t\tvar data = settings.aoData;\n\t\n\t\tapi.off( drawEvent +' '+ colvisEvent +' '+ destroyEvent );\n\t\n\t\tif ( _pluck( data, '_details' ).length > 0 ) {\n\t\t\t// On each draw, insert the required elements into the document\n\t\t\tapi.on( drawEvent, function ( e, ctx ) {\n\t\t\t\tif ( settings !== ctx ) {\n\t\t\t\t\treturn;\n\t\t\t\t}\n\t\n\t\t\t\tapi.rows( {page:'current'} ).eq(0).each( function (idx) {\n\t\t\t\t\t// Internal data grab\n\t\t\t\t\tvar row = data[ idx ];\n\t\n\t\t\t\t\tif ( row._detailsShow ) {\n\t\t\t\t\t\trow._details.insertAfter( row.nTr );\n\t\t\t\t\t}\n\t\t\t\t} );\n\t\t\t} );\n\t\n\t\t\t// Column visibility change - update the colspan\n\t\t\tapi.on( colvisEvent, function ( e, ctx, idx, vis ) {\n\t\t\t\tif ( settings !== ctx ) {\n\t\t\t\t\treturn;\n\t\t\t\t}\n\t\n\t\t\t\t// Update the colspan for the details rows (note, only if it already has\n\t\t\t\t// a colspan)\n\t\t\t\tvar row, visible = _fnVisbleColumns( ctx );\n\t\n\t\t\t\tfor ( var i=0, ien=data.length ; i<ien ; i++ ) {\n\t\t\t\t\trow = data[i];\n\t\n\t\t\t\t\tif ( row._details ) {\n\t\t\t\t\t\trow._details.children('td[colspan]').attr('colspan', visible );\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t} );\n\t\n\t\t\t// Table destroyed - nuke any child rows\n\t\t\tapi.on( destroyEvent, function ( e, ctx ) {\n\t\t\t\tif ( settings !== ctx ) {\n\t\t\t\t\treturn;\n\t\t\t\t}\n\t\n\t\t\t\tfor ( var i=0, ien=data.length ; i<ien ; i++ ) {\n\t\t\t\t\tif ( data[i]._details ) {\n\t\t\t\t\t\t__details_remove( api, i );\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t} );\n\t\t}\n\t};\n\t\n\t// Strings for the method names to help minification\n\tvar _emp = '';\n\tvar _child_obj = _emp+'row().child';\n\tvar _child_mth = _child_obj+'()';\n\t\n\t// data can be:\n\t//  tr\n\t//  string\n\t//  jQuery or array of any of the above\n\t_api_register( _child_mth, function ( data, klass ) {\n\t\tvar ctx = this.context;\n\t\n\t\tif ( data === undefined ) {\n\t\t\t// get\n\t\t\treturn ctx.length && this.length ?\n\t\t\t\tctx[0].aoData[ this[0] ]._details :\n\t\t\t\tundefined;\n\t\t}\n\t\telse if ( data === true ) {\n\t\t\t// show\n\t\t\tthis.child.show();\n\t\t}\n\t\telse if ( data === false ) {\n\t\t\t// remove\n\t\t\t__details_remove( this );\n\t\t}\n\t\telse if ( ctx.length && this.length ) {\n\t\t\t// set\n\t\t\t__details_add( ctx[0], ctx[0].aoData[ this[0] ], data, klass );\n\t\t}\n\t\n\t\treturn this;\n\t} );\n\t\n\t\n\t_api_register( [\n\t\t_child_obj+'.show()',\n\t\t_child_mth+'.show()' // only when `child()` was called with parameters (without\n\t], function ( show ) {   // it returns an object and this method is not executed)\n\t\t__details_display( this, true );\n\t\treturn this;\n\t} );\n\t\n\t\n\t_api_register( [\n\t\t_child_obj+'.hide()',\n\t\t_child_mth+'.hide()' // only when `child()` was called with parameters (without\n\t], function () {         // it returns an object and this method is not executed)\n\t\t__details_display( this, false );\n\t\treturn this;\n\t} );\n\t\n\t\n\t_api_register( [\n\t\t_child_obj+'.remove()',\n\t\t_child_mth+'.remove()' // only when `child()` was called with parameters (without\n\t], function () {           // it returns an object and this method is not executed)\n\t\t__details_remove( this );\n\t\treturn this;\n\t} );\n\t\n\t\n\t_api_register( _child_obj+'.isShown()', function () {\n\t\tvar ctx = this.context;\n\t\n\t\tif ( ctx.length && this.length ) {\n\t\t\t// _detailsShown as false or undefined will fall through to return false\n\t\t\treturn ctx[0].aoData[ this[0] ]._detailsShow || false;\n\t\t}\n\t\treturn false;\n\t} );\n\t\n\t\n\t\n\t/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *\n\t * Columns\n\t *\n\t * {integer}           - column index (>=0 count from left, <0 count from right)\n\t * \"{integer}:visIdx\"  - visible column index (i.e. translate to column index)  (>=0 count from left, <0 count from right)\n\t * \"{integer}:visible\" - alias for {integer}:visIdx  (>=0 count from left, <0 count from right)\n\t * \"{string}:name\"     - column name\n\t * \"{string}\"          - jQuery selector on column header nodes\n\t *\n\t */\n\t\n\t// can be an array of these items, comma separated list, or an array of comma\n\t// separated lists\n\t\n\tvar __re_column_selector = /^([^:]+):(name|visIdx|visible)$/;\n\t\n\t\n\t// r1 and r2 are redundant - but it means that the parameters match for the\n\t// iterator callback in columns().data()\n\tvar __columnData = function ( settings, column, r1, r2, rows ) {\n\t\tvar a = [];\n\t\tfor ( var row=0, ien=rows.length ; row<ien ; row++ ) {\n\t\t\ta.push( _fnGetCellData( settings, rows[row], column ) );\n\t\t}\n\t\treturn a;\n\t};\n\t\n\t\n\tvar __column_selector = function ( settings, selector, opts )\n\t{\n\t\tvar\n\t\t\tcolumns = settings.aoColumns,\n\t\t\tnames = _pluck( columns, 'sName' ),\n\t\t\tnodes = _pluck( columns, 'nTh' );\n\t\n\t\tvar run = function ( s ) {\n\t\t\tvar selInt = _intVal( s );\n\t\n\t\t\t// Selector - all\n\t\t\tif ( s === '' ) {\n\t\t\t\treturn _range( columns.length );\n\t\t\t}\n\t\n\t\t\t// Selector - index\n\t\t\tif ( selInt !== null ) {\n\t\t\t\treturn [ selInt >= 0 ?\n\t\t\t\t\tselInt : // Count from left\n\t\t\t\t\tcolumns.length + selInt // Count from right (+ because its a negative value)\n\t\t\t\t];\n\t\t\t}\n\t\n\t\t\t// Selector = function\n\t\t\tif ( typeof s === 'function' ) {\n\t\t\t\tvar rows = _selector_row_indexes( settings, opts );\n\t\n\t\t\t\treturn $.map( columns, function (col, idx) {\n\t\t\t\t\treturn s(\n\t\t\t\t\t\t\tidx,\n\t\t\t\t\t\t\t__columnData( settings, idx, 0, 0, rows ),\n\t\t\t\t\t\t\tnodes[ idx ]\n\t\t\t\t\t\t) ? idx : null;\n\t\t\t\t} );\n\t\t\t}\n\t\n\t\t\t// jQuery or string selector\n\t\t\tvar match = typeof s === 'string' ?\n\t\t\t\ts.match( __re_column_selector ) :\n\t\t\t\t'';\n\t\n\t\t\tif ( match ) {\n\t\t\t\tswitch( match[2] ) {\n\t\t\t\t\tcase 'visIdx':\n\t\t\t\t\tcase 'visible':\n\t\t\t\t\t\tvar idx = parseInt( match[1], 10 );\n\t\t\t\t\t\t// Visible index given, convert to column index\n\t\t\t\t\t\tif ( idx < 0 ) {\n\t\t\t\t\t\t\t// Counting from the right\n\t\t\t\t\t\t\tvar visColumns = $.map( columns, function (col,i) {\n\t\t\t\t\t\t\t\treturn col.bVisible ? i : null;\n\t\t\t\t\t\t\t} );\n\t\t\t\t\t\t\treturn [ visColumns[ visColumns.length + idx ] ];\n\t\t\t\t\t\t}\n\t\t\t\t\t\t// Counting from the left\n\t\t\t\t\t\treturn [ _fnVisibleToColumnIndex( settings, idx ) ];\n\t\n\t\t\t\t\tcase 'name':\n\t\t\t\t\t\t// match by name. `names` is column index complete and in order\n\t\t\t\t\t\treturn $.map( names, function (name, i) {\n\t\t\t\t\t\t\treturn name === match[1] ? i : null;\n\t\t\t\t\t\t} );\n\t\n\t\t\t\t\tdefault:\n\t\t\t\t\t\treturn [];\n\t\t\t\t}\n\t\t\t}\n\t\n\t\t\t// Cell in the table body\n\t\t\tif ( s.nodeName && s._DT_CellIndex ) {\n\t\t\t\treturn [ s._DT_CellIndex.column ];\n\t\t\t}\n\t\n\t\t\t// jQuery selector on the TH elements for the columns\n\t\t\tvar jqResult = $( nodes )\n\t\t\t\t.filter( s )\n\t\t\t\t.map( function () {\n\t\t\t\t\treturn $.inArray( this, nodes ); // `nodes` is column index complete and in order\n\t\t\t\t} )\n\t\t\t\t.toArray();\n\t\n\t\t\tif ( jqResult.length || ! s.nodeName ) {\n\t\t\t\treturn jqResult;\n\t\t\t}\n\t\n\t\t\t// Otherwise a node which might have a `dt-column` data attribute, or be\n\t\t\t// a child or such an element\n\t\t\tvar host = $(s).closest('*[data-dt-column]');\n\t\t\treturn host.length ?\n\t\t\t\t[ host.data('dt-column') ] :\n\t\t\t\t[];\n\t\t};\n\t\n\t\treturn _selector_run( 'column', selector, run, settings, opts );\n\t};\n\t\n\t\n\tvar __setColumnVis = function ( settings, column, vis ) {\n\t\tvar\n\t\t\tcols = settings.aoColumns,\n\t\t\tcol  = cols[ column ],\n\t\t\tdata = settings.aoData,\n\t\t\trow, cells, i, ien, tr;\n\t\n\t\t// Get\n\t\tif ( vis === undefined ) {\n\t\t\treturn col.bVisible;\n\t\t}\n\t\n\t\t// Set\n\t\t// No change\n\t\tif ( col.bVisible === vis ) {\n\t\t\treturn;\n\t\t}\n\t\n\t\tif ( vis ) {\n\t\t\t// Insert column\n\t\t\t// Need to decide if we should use appendChild or insertBefore\n\t\t\tvar insertBefore = $.inArray( true, _pluck(cols, 'bVisible'), column+1 );\n\t\n\t\t\tfor ( i=0, ien=data.length ; i<ien ; i++ ) {\n\t\t\t\ttr = data[i].nTr;\n\t\t\t\tcells = data[i].anCells;\n\t\n\t\t\t\tif ( tr ) {\n\t\t\t\t\t// insertBefore can act like appendChild if 2nd arg is null\n\t\t\t\t\ttr.insertBefore( cells[ column ], cells[ insertBefore ] || null );\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\telse {\n\t\t\t// Remove column\n\t\t\t$( _pluck( settings.aoData, 'anCells', column ) ).detach();\n\t\t}\n\t\n\t\t// Common actions\n\t\tcol.bVisible = vis;\n\t};\n\t\n\t\n\t_api_register( 'columns()', function ( selector, opts ) {\n\t\t// argument shifting\n\t\tif ( selector === undefined ) {\n\t\t\tselector = '';\n\t\t}\n\t\telse if ( $.isPlainObject( selector ) ) {\n\t\t\topts = selector;\n\t\t\tselector = '';\n\t\t}\n\t\n\t\topts = _selector_opts( opts );\n\t\n\t\tvar inst = this.iterator( 'table', function ( settings ) {\n\t\t\treturn __column_selector( settings, selector, opts );\n\t\t}, 1 );\n\t\n\t\t// Want argument shifting here and in _row_selector?\n\t\tinst.selector.cols = selector;\n\t\tinst.selector.opts = opts;\n\t\n\t\treturn inst;\n\t} );\n\t\n\t_api_registerPlural( 'columns().header()', 'column().header()', function ( selector, opts ) {\n\t\treturn this.iterator( 'column', function ( settings, column ) {\n\t\t\treturn settings.aoColumns[column].nTh;\n\t\t}, 1 );\n\t} );\n\t\n\t_api_registerPlural( 'columns().footer()', 'column().footer()', function ( selector, opts ) {\n\t\treturn this.iterator( 'column', function ( settings, column ) {\n\t\t\treturn settings.aoColumns[column].nTf;\n\t\t}, 1 );\n\t} );\n\t\n\t_api_registerPlural( 'columns().data()', 'column().data()', function () {\n\t\treturn this.iterator( 'column-rows', __columnData, 1 );\n\t} );\n\t\n\t_api_registerPlural( 'columns().dataSrc()', 'column().dataSrc()', function () {\n\t\treturn this.iterator( 'column', function ( settings, column ) {\n\t\t\treturn settings.aoColumns[column].mData;\n\t\t}, 1 );\n\t} );\n\t\n\t_api_registerPlural( 'columns().cache()', 'column().cache()', function ( type ) {\n\t\treturn this.iterator( 'column-rows', function ( settings, column, i, j, rows ) {\n\t\t\treturn _pluck_order( settings.aoData, rows,\n\t\t\t\ttype === 'search' ? '_aFilterData' : '_aSortData', column\n\t\t\t);\n\t\t}, 1 );\n\t} );\n\t\n\t_api_registerPlural( 'columns().nodes()', 'column().nodes()', function () {\n\t\treturn this.iterator( 'column-rows', function ( settings, column, i, j, rows ) {\n\t\t\treturn _pluck_order( settings.aoData, rows, 'anCells', column ) ;\n\t\t}, 1 );\n\t} );\n\t\n\t_api_registerPlural( 'columns().visible()', 'column().visible()', function ( vis, calc ) {\n\t\tvar that = this;\n\t\tvar ret = this.iterator( 'column', function ( settings, column ) {\n\t\t\tif ( vis === undefined ) {\n\t\t\t\treturn settings.aoColumns[ column ].bVisible;\n\t\t\t} // else\n\t\t\t__setColumnVis( settings, column, vis );\n\t\t} );\n\t\n\t\t// Group the column visibility changes\n\t\tif ( vis !== undefined ) {\n\t\t\tthis.iterator( 'table', function ( settings ) {\n\t\t\t\t// Redraw the header after changes\n\t\t\t\t_fnDrawHead( settings, settings.aoHeader );\n\t\t\t\t_fnDrawHead( settings, settings.aoFooter );\n\t\t\n\t\t\t\t// Update colspan for no records display. Child rows and extensions will use their own\n\t\t\t\t// listeners to do this - only need to update the empty table item here\n\t\t\t\tif ( ! settings.aiDisplay.length ) {\n\t\t\t\t\t$(settings.nTBody).find('td[colspan]').attr('colspan', _fnVisbleColumns(settings));\n\t\t\t\t}\n\t\t\n\t\t\t\t_fnSaveState( settings );\n\t\n\t\t\t\t// Second loop once the first is done for events\n\t\t\t\tthat.iterator( 'column', function ( settings, column ) {\n\t\t\t\t\t_fnCallbackFire( settings, null, 'column-visibility', [settings, column, vis, calc] );\n\t\t\t\t} );\n\t\n\t\t\t\tif ( calc === undefined || calc ) {\n\t\t\t\t\tthat.columns.adjust();\n\t\t\t\t}\n\t\t\t});\n\t\t}\n\t\n\t\treturn ret;\n\t} );\n\t\n\t_api_registerPlural( 'columns().indexes()', 'column().index()', function ( type ) {\n\t\treturn this.iterator( 'column', function ( settings, column ) {\n\t\t\treturn type === 'visible' ?\n\t\t\t\t_fnColumnIndexToVisible( settings, column ) :\n\t\t\t\tcolumn;\n\t\t}, 1 );\n\t} );\n\t\n\t_api_register( 'columns.adjust()', function () {\n\t\treturn this.iterator( 'table', function ( settings ) {\n\t\t\t_fnAdjustColumnSizing( settings );\n\t\t}, 1 );\n\t} );\n\t\n\t_api_register( 'column.index()', function ( type, idx ) {\n\t\tif ( this.context.length !== 0 ) {\n\t\t\tvar ctx = this.context[0];\n\t\n\t\t\tif ( type === 'fromVisible' || type === 'toData' ) {\n\t\t\t\treturn _fnVisibleToColumnIndex( ctx, idx );\n\t\t\t}\n\t\t\telse if ( type === 'fromData' || type === 'toVisible' ) {\n\t\t\t\treturn _fnColumnIndexToVisible( ctx, idx );\n\t\t\t}\n\t\t}\n\t} );\n\t\n\t_api_register( 'column()', function ( selector, opts ) {\n\t\treturn _selector_first( this.columns( selector, opts ) );\n\t} );\n\t\n\tvar __cell_selector = function ( settings, selector, opts )\n\t{\n\t\tvar data = settings.aoData;\n\t\tvar rows = _selector_row_indexes( settings, opts );\n\t\tvar cells = _removeEmpty( _pluck_order( data, rows, 'anCells' ) );\n\t\tvar allCells = $(_flatten( [], cells ));\n\t\tvar row;\n\t\tvar columns = settings.aoColumns.length;\n\t\tvar a, i, ien, j, o, host;\n\t\n\t\tvar run = function ( s ) {\n\t\t\tvar fnSelector = typeof s === 'function';\n\t\n\t\t\tif ( s === null || s === undefined || fnSelector ) {\n\t\t\t\t// All cells and function selectors\n\t\t\t\ta = [];\n\t\n\t\t\t\tfor ( i=0, ien=rows.length ; i<ien ; i++ ) {\n\t\t\t\t\trow = rows[i];\n\t\n\t\t\t\t\tfor ( j=0 ; j<columns ; j++ ) {\n\t\t\t\t\t\to = {\n\t\t\t\t\t\t\trow: row,\n\t\t\t\t\t\t\tcolumn: j\n\t\t\t\t\t\t};\n\t\n\t\t\t\t\t\tif ( fnSelector ) {\n\t\t\t\t\t\t\t// Selector - function\n\t\t\t\t\t\t\thost = data[ row ];\n\t\n\t\t\t\t\t\t\tif ( s( o, _fnGetCellData(settings, row, j), host.anCells ? host.anCells[j] : null ) ) {\n\t\t\t\t\t\t\t\ta.push( o );\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t\telse {\n\t\t\t\t\t\t\t// Selector - all\n\t\t\t\t\t\t\ta.push( o );\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\t\n\t\t\t\treturn a;\n\t\t\t}\n\t\t\t\n\t\t\t// Selector - index\n\t\t\tif ( $.isPlainObject( s ) ) {\n\t\t\t\t// Valid cell index and its in the array of selectable rows\n\t\t\t\treturn s.column !== undefined && s.row !== undefined && $.inArray( s.row, rows ) !== -1 ?\n\t\t\t\t\t[s] :\n\t\t\t\t\t[];\n\t\t\t}\n\t\n\t\t\t// Selector - jQuery filtered cells\n\t\t\tvar jqResult = allCells\n\t\t\t\t.filter( s )\n\t\t\t\t.map( function (i, el) {\n\t\t\t\t\treturn { // use a new object, in case someone changes the values\n\t\t\t\t\t\trow:    el._DT_CellIndex.row,\n\t\t\t\t\t\tcolumn: el._DT_CellIndex.column\n\t \t\t\t\t};\n\t\t\t\t} )\n\t\t\t\t.toArray();\n\t\n\t\t\tif ( jqResult.length || ! s.nodeName ) {\n\t\t\t\treturn jqResult;\n\t\t\t}\n\t\n\t\t\t// Otherwise the selector is a node, and there is one last option - the\n\t\t\t// element might be a child of an element which has dt-row and dt-column\n\t\t\t// data attributes\n\t\t\thost = $(s).closest('*[data-dt-row]');\n\t\t\treturn host.length ?\n\t\t\t\t[ {\n\t\t\t\t\trow: host.data('dt-row'),\n\t\t\t\t\tcolumn: host.data('dt-column')\n\t\t\t\t} ] :\n\t\t\t\t[];\n\t\t};\n\t\n\t\treturn _selector_run( 'cell', selector, run, settings, opts );\n\t};\n\t\n\t\n\t\n\t\n\t_api_register( 'cells()', function ( rowSelector, columnSelector, opts ) {\n\t\t// Argument shifting\n\t\tif ( $.isPlainObject( rowSelector ) ) {\n\t\t\t// Indexes\n\t\t\tif ( rowSelector.row === undefined ) {\n\t\t\t\t// Selector options in first parameter\n\t\t\t\topts = rowSelector;\n\t\t\t\trowSelector = null;\n\t\t\t}\n\t\t\telse {\n\t\t\t\t// Cell index objects in first parameter\n\t\t\t\topts = columnSelector;\n\t\t\t\tcolumnSelector = null;\n\t\t\t}\n\t\t}\n\t\tif ( $.isPlainObject( columnSelector ) ) {\n\t\t\topts = columnSelector;\n\t\t\tcolumnSelector = null;\n\t\t}\n\t\n\t\t// Cell selector\n\t\tif ( columnSelector === null || columnSelector === undefined ) {\n\t\t\treturn this.iterator( 'table', function ( settings ) {\n\t\t\t\treturn __cell_selector( settings, rowSelector, _selector_opts( opts ) );\n\t\t\t} );\n\t\t}\n\t\n\t\t// The default built in options need to apply to row and columns\n\t\tvar internalOpts = opts ? {\n\t\t\tpage: opts.page,\n\t\t\torder: opts.order,\n\t\t\tsearch: opts.search\n\t\t} : {};\n\t\n\t\t// Row + column selector\n\t\tvar columns = this.columns( columnSelector, internalOpts );\n\t\tvar rows = this.rows( rowSelector, internalOpts );\n\t\tvar i, ien, j, jen;\n\t\n\t\tvar cellsNoOpts = this.iterator( 'table', function ( settings, idx ) {\n\t\t\tvar a = [];\n\t\n\t\t\tfor ( i=0, ien=rows[idx].length ; i<ien ; i++ ) {\n\t\t\t\tfor ( j=0, jen=columns[idx].length ; j<jen ; j++ ) {\n\t\t\t\t\ta.push( {\n\t\t\t\t\t\trow:    rows[idx][i],\n\t\t\t\t\t\tcolumn: columns[idx][j]\n\t\t\t\t\t} );\n\t\t\t\t}\n\t\t\t}\n\t\n\t\t\treturn a;\n\t\t}, 1 );\n\t\n\t\t// There is currently only one extension which uses a cell selector extension\n\t\t// It is a _major_ performance drag to run this if it isn't needed, so this is\n\t\t// an extension specific check at the moment\n\t\tvar cells = opts && opts.selected ?\n\t\t\tthis.cells( cellsNoOpts, opts ) :\n\t\t\tcellsNoOpts;\n\t\n\t\t$.extend( cells.selector, {\n\t\t\tcols: columnSelector,\n\t\t\trows: rowSelector,\n\t\t\topts: opts\n\t\t} );\n\t\n\t\treturn cells;\n\t} );\n\t\n\t\n\t_api_registerPlural( 'cells().nodes()', 'cell().node()', function () {\n\t\treturn this.iterator( 'cell', function ( settings, row, column ) {\n\t\t\tvar data = settings.aoData[ row ];\n\t\n\t\t\treturn data && data.anCells ?\n\t\t\t\tdata.anCells[ column ] :\n\t\t\t\tundefined;\n\t\t}, 1 );\n\t} );\n\t\n\t\n\t_api_register( 'cells().data()', function () {\n\t\treturn this.iterator( 'cell', function ( settings, row, column ) {\n\t\t\treturn _fnGetCellData( settings, row, column );\n\t\t}, 1 );\n\t} );\n\t\n\t\n\t_api_registerPlural( 'cells().cache()', 'cell().cache()', function ( type ) {\n\t\ttype = type === 'search' ? '_aFilterData' : '_aSortData';\n\t\n\t\treturn this.iterator( 'cell', function ( settings, row, column ) {\n\t\t\treturn settings.aoData[ row ][ type ][ column ];\n\t\t}, 1 );\n\t} );\n\t\n\t\n\t_api_registerPlural( 'cells().render()', 'cell().render()', function ( type ) {\n\t\treturn this.iterator( 'cell', function ( settings, row, column ) {\n\t\t\treturn _fnGetCellData( settings, row, column, type );\n\t\t}, 1 );\n\t} );\n\t\n\t\n\t_api_registerPlural( 'cells().indexes()', 'cell().index()', function () {\n\t\treturn this.iterator( 'cell', function ( settings, row, column ) {\n\t\t\treturn {\n\t\t\t\trow: row,\n\t\t\t\tcolumn: column,\n\t\t\t\tcolumnVisible: _fnColumnIndexToVisible( settings, column )\n\t\t\t};\n\t\t}, 1 );\n\t} );\n\t\n\t\n\t_api_registerPlural( 'cells().invalidate()', 'cell().invalidate()', function ( src ) {\n\t\treturn this.iterator( 'cell', function ( settings, row, column ) {\n\t\t\t_fnInvalidate( settings, row, src, column );\n\t\t} );\n\t} );\n\t\n\t\n\t\n\t_api_register( 'cell()', function ( rowSelector, columnSelector, opts ) {\n\t\treturn _selector_first( this.cells( rowSelector, columnSelector, opts ) );\n\t} );\n\t\n\t\n\t_api_register( 'cell().data()', function ( data ) {\n\t\tvar ctx = this.context;\n\t\tvar cell = this[0];\n\t\n\t\tif ( data === undefined ) {\n\t\t\t// Get\n\t\t\treturn ctx.length && cell.length ?\n\t\t\t\t_fnGetCellData( ctx[0], cell[0].row, cell[0].column ) :\n\t\t\t\tundefined;\n\t\t}\n\t\n\t\t// Set\n\t\t_fnSetCellData( ctx[0], cell[0].row, cell[0].column, data );\n\t\t_fnInvalidate( ctx[0], cell[0].row, 'data', cell[0].column );\n\t\n\t\treturn this;\n\t} );\n\t\n\t\n\t\n\t/**\n\t * Get current ordering (sorting) that has been applied to the table.\n\t *\n\t * @returns {array} 2D array containing the sorting information for the first\n\t *   table in the current context. Each element in the parent array represents\n\t *   a column being sorted upon (i.e. multi-sorting with two columns would have\n\t *   2 inner arrays). The inner arrays may have 2 or 3 elements. The first is\n\t *   the column index that the sorting condition applies to, the second is the\n\t *   direction of the sort (`desc` or `asc`) and, optionally, the third is the\n\t *   index of the sorting order from the `column.sorting` initialisation array.\n\t *//**\n\t * Set the ordering for the table.\n\t *\n\t * @param {integer} order Column index to sort upon.\n\t * @param {string} direction Direction of the sort to be applied (`asc` or `desc`)\n\t * @returns {DataTables.Api} this\n\t *//**\n\t * Set the ordering for the table.\n\t *\n\t * @param {array} order 1D array of sorting information to be applied.\n\t * @param {array} [...] Optional additional sorting conditions\n\t * @returns {DataTables.Api} this\n\t *//**\n\t * Set the ordering for the table.\n\t *\n\t * @param {array} order 2D array of sorting information to be applied.\n\t * @returns {DataTables.Api} this\n\t */\n\t_api_register( 'order()', function ( order, dir ) {\n\t\tvar ctx = this.context;\n\t\n\t\tif ( order === undefined ) {\n\t\t\t// get\n\t\t\treturn ctx.length !== 0 ?\n\t\t\t\tctx[0].aaSorting :\n\t\t\t\tundefined;\n\t\t}\n\t\n\t\t// set\n\t\tif ( typeof order === 'number' ) {\n\t\t\t// Simple column / direction passed in\n\t\t\torder = [ [ order, dir ] ];\n\t\t}\n\t\telse if ( order.length && ! Array.isArray( order[0] ) ) {\n\t\t\t// Arguments passed in (list of 1D arrays)\n\t\t\torder = Array.prototype.slice.call( arguments );\n\t\t}\n\t\t// otherwise a 2D array was passed in\n\t\n\t\treturn this.iterator( 'table', function ( settings ) {\n\t\t\tsettings.aaSorting = order.slice();\n\t\t} );\n\t} );\n\t\n\t\n\t/**\n\t * Attach a sort listener to an element for a given column\n\t *\n\t * @param {node|jQuery|string} node Identifier for the element(s) to attach the\n\t *   listener to. This can take the form of a single DOM node, a jQuery\n\t *   collection of nodes or a jQuery selector which will identify the node(s).\n\t * @param {integer} column the column that a click on this node will sort on\n\t * @param {function} [callback] callback function when sort is run\n\t * @returns {DataTables.Api} this\n\t */\n\t_api_register( 'order.listener()', function ( node, column, callback ) {\n\t\treturn this.iterator( 'table', function ( settings ) {\n\t\t\t_fnSortAttachListener( settings, node, column, callback );\n\t\t} );\n\t} );\n\t\n\t\n\t_api_register( 'order.fixed()', function ( set ) {\n\t\tif ( ! set ) {\n\t\t\tvar ctx = this.context;\n\t\t\tvar fixed = ctx.length ?\n\t\t\t\tctx[0].aaSortingFixed :\n\t\t\t\tundefined;\n\t\n\t\t\treturn Array.isArray( fixed ) ?\n\t\t\t\t{ pre: fixed } :\n\t\t\t\tfixed;\n\t\t}\n\t\n\t\treturn this.iterator( 'table', function ( settings ) {\n\t\t\tsettings.aaSortingFixed = $.extend( true, {}, set );\n\t\t} );\n\t} );\n\t\n\t\n\t// Order by the selected column(s)\n\t_api_register( [\n\t\t'columns().order()',\n\t\t'column().order()'\n\t], function ( dir ) {\n\t\tvar that = this;\n\t\n\t\treturn this.iterator( 'table', function ( settings, i ) {\n\t\t\tvar sort = [];\n\t\n\t\t\t$.each( that[i], function (j, col) {\n\t\t\t\tsort.push( [ col, dir ] );\n\t\t\t} );\n\t\n\t\t\tsettings.aaSorting = sort;\n\t\t} );\n\t} );\n\t\n\t\n\t\n\t_api_register( 'search()', function ( input, regex, smart, caseInsen ) {\n\t\tvar ctx = this.context;\n\t\n\t\tif ( input === undefined ) {\n\t\t\t// get\n\t\t\treturn ctx.length !== 0 ?\n\t\t\t\tctx[0].oPreviousSearch.sSearch :\n\t\t\t\tundefined;\n\t\t}\n\t\n\t\t// set\n\t\treturn this.iterator( 'table', function ( settings ) {\n\t\t\tif ( ! settings.oFeatures.bFilter ) {\n\t\t\t\treturn;\n\t\t\t}\n\t\n\t\t\t_fnFilterComplete( settings, $.extend( {}, settings.oPreviousSearch, {\n\t\t\t\t\"sSearch\": input+\"\",\n\t\t\t\t\"bRegex\":  regex === null ? false : regex,\n\t\t\t\t\"bSmart\":  smart === null ? true  : smart,\n\t\t\t\t\"bCaseInsensitive\": caseInsen === null ? true : caseInsen\n\t\t\t} ), 1 );\n\t\t} );\n\t} );\n\t\n\t\n\t_api_registerPlural(\n\t\t'columns().search()',\n\t\t'column().search()',\n\t\tfunction ( input, regex, smart, caseInsen ) {\n\t\t\treturn this.iterator( 'column', function ( settings, column ) {\n\t\t\t\tvar preSearch = settings.aoPreSearchCols;\n\t\n\t\t\t\tif ( input === undefined ) {\n\t\t\t\t\t// get\n\t\t\t\t\treturn preSearch[ column ].sSearch;\n\t\t\t\t}\n\t\n\t\t\t\t// set\n\t\t\t\tif ( ! settings.oFeatures.bFilter ) {\n\t\t\t\t\treturn;\n\t\t\t\t}\n\t\n\t\t\t\t$.extend( preSearch[ column ], {\n\t\t\t\t\t\"sSearch\": input+\"\",\n\t\t\t\t\t\"bRegex\":  regex === null ? false : regex,\n\t\t\t\t\t\"bSmart\":  smart === null ? true  : smart,\n\t\t\t\t\t\"bCaseInsensitive\": caseInsen === null ? true : caseInsen\n\t\t\t\t} );\n\t\n\t\t\t\t_fnFilterComplete( settings, settings.oPreviousSearch, 1 );\n\t\t\t} );\n\t\t}\n\t);\n\t\n\t/*\n\t * State API methods\n\t */\n\t\n\t_api_register( 'state()', function () {\n\t\treturn this.context.length ?\n\t\t\tthis.context[0].oSavedState :\n\t\t\tnull;\n\t} );\n\t\n\t\n\t_api_register( 'state.clear()', function () {\n\t\treturn this.iterator( 'table', function ( settings ) {\n\t\t\t// Save an empty object\n\t\t\tsettings.fnStateSaveCallback.call( settings.oInstance, settings, {} );\n\t\t} );\n\t} );\n\t\n\t\n\t_api_register( 'state.loaded()', function () {\n\t\treturn this.context.length ?\n\t\t\tthis.context[0].oLoadedState :\n\t\t\tnull;\n\t} );\n\t\n\t\n\t_api_register( 'state.save()', function () {\n\t\treturn this.iterator( 'table', function ( settings ) {\n\t\t\t_fnSaveState( settings );\n\t\t} );\n\t} );\n\t\n\t\n\t\n\t/**\n\t * Provide a common method for plug-ins to check the version of DataTables being\n\t * used, in order to ensure compatibility.\n\t *\n\t *  @param {string} version Version string to check for, in the format \"X.Y.Z\".\n\t *    Note that the formats \"X\" and \"X.Y\" are also acceptable.\n\t *  @returns {boolean} true if this version of DataTables is greater or equal to\n\t *    the required version, or false if this version of DataTales is not\n\t *    suitable\n\t *  @static\n\t *  @dtopt API-Static\n\t *\n\t *  @example\n\t *    alert( $.fn.dataTable.versionCheck( '1.9.0' ) );\n\t */\n\tDataTable.versionCheck = DataTable.fnVersionCheck = function( version )\n\t{\n\t\tvar aThis = DataTable.version.split('.');\n\t\tvar aThat = version.split('.');\n\t\tvar iThis, iThat;\n\t\n\t\tfor ( var i=0, iLen=aThat.length ; i<iLen ; i++ ) {\n\t\t\tiThis = parseInt( aThis[i], 10 ) || 0;\n\t\t\tiThat = parseInt( aThat[i], 10 ) || 0;\n\t\n\t\t\t// Parts are the same, keep comparing\n\t\t\tif (iThis === iThat) {\n\t\t\t\tcontinue;\n\t\t\t}\n\t\n\t\t\t// Parts are different, return immediately\n\t\t\treturn iThis > iThat;\n\t\t}\n\t\n\t\treturn true;\n\t};\n\t\n\t\n\t/**\n\t * Check if a `<table>` node is a DataTable table already or not.\n\t *\n\t *  @param {node|jquery|string} table Table node, jQuery object or jQuery\n\t *      selector for the table to test. Note that if more than more than one\n\t *      table is passed on, only the first will be checked\n\t *  @returns {boolean} true the table given is a DataTable, or false otherwise\n\t *  @static\n\t *  @dtopt API-Static\n\t *\n\t *  @example\n\t *    if ( ! $.fn.DataTable.isDataTable( '#example' ) ) {\n\t *      $('#example').dataTable();\n\t *    }\n\t */\n\tDataTable.isDataTable = DataTable.fnIsDataTable = function ( table )\n\t{\n\t\tvar t = $(table).get(0);\n\t\tvar is = false;\n\t\n\t\tif ( table instanceof DataTable.Api ) {\n\t\t\treturn true;\n\t\t}\n\t\n\t\t$.each( DataTable.settings, function (i, o) {\n\t\t\tvar head = o.nScrollHead ? $('table', o.nScrollHead)[0] : null;\n\t\t\tvar foot = o.nScrollFoot ? $('table', o.nScrollFoot)[0] : null;\n\t\n\t\t\tif ( o.nTable === t || head === t || foot === t ) {\n\t\t\t\tis = true;\n\t\t\t}\n\t\t} );\n\t\n\t\treturn is;\n\t};\n\t\n\t\n\t/**\n\t * Get all DataTable tables that have been initialised - optionally you can\n\t * select to get only currently visible tables.\n\t *\n\t *  @param {boolean} [visible=false] Flag to indicate if you want all (default)\n\t *    or visible tables only.\n\t *  @returns {array} Array of `table` nodes (not DataTable instances) which are\n\t *    DataTables\n\t *  @static\n\t *  @dtopt API-Static\n\t *\n\t *  @example\n\t *    $.each( $.fn.dataTable.tables(true), function () {\n\t *      $(table).DataTable().columns.adjust();\n\t *    } );\n\t */\n\tDataTable.tables = DataTable.fnTables = function ( visible )\n\t{\n\t\tvar api = false;\n\t\n\t\tif ( $.isPlainObject( visible ) ) {\n\t\t\tapi = visible.api;\n\t\t\tvisible = visible.visible;\n\t\t}\n\t\n\t\tvar a = $.map( DataTable.settings, function (o) {\n\t\t\tif ( !visible || (visible && $(o.nTable).is(':visible')) ) {\n\t\t\t\treturn o.nTable;\n\t\t\t}\n\t\t} );\n\t\n\t\treturn api ?\n\t\t\tnew _Api( a ) :\n\t\t\ta;\n\t};\n\t\n\t\n\t/**\n\t * Convert from camel case parameters to Hungarian notation. This is made public\n\t * for the extensions to provide the same ability as DataTables core to accept\n\t * either the 1.9 style Hungarian notation, or the 1.10+ style camelCase\n\t * parameters.\n\t *\n\t *  @param {object} src The model object which holds all parameters that can be\n\t *    mapped.\n\t *  @param {object} user The object to convert from camel case to Hungarian.\n\t *  @param {boolean} force When set to `true`, properties which already have a\n\t *    Hungarian value in the `user` object will be overwritten. Otherwise they\n\t *    won't be.\n\t */\n\tDataTable.camelToHungarian = _fnCamelToHungarian;\n\t\n\t\n\t\n\t/**\n\t *\n\t */\n\t_api_register( '$()', function ( selector, opts ) {\n\t\tvar\n\t\t\trows   = this.rows( opts ).nodes(), // Get all rows\n\t\t\tjqRows = $(rows);\n\t\n\t\treturn $( [].concat(\n\t\t\tjqRows.filter( selector ).toArray(),\n\t\t\tjqRows.find( selector ).toArray()\n\t\t) );\n\t} );\n\t\n\t\n\t// jQuery functions to operate on the tables\n\t$.each( [ 'on', 'one', 'off' ], function (i, key) {\n\t\t_api_register( key+'()', function ( /* event, handler */ ) {\n\t\t\tvar args = Array.prototype.slice.call(arguments);\n\t\n\t\t\t// Add the `dt` namespace automatically if it isn't already present\n\t\t\targs[0] = $.map( args[0].split( /\\s/ ), function ( e ) {\n\t\t\t\treturn ! e.match(/\\.dt\\b/) ?\n\t\t\t\t\te+'.dt' :\n\t\t\t\t\te;\n\t\t\t\t} ).join( ' ' );\n\t\n\t\t\tvar inst = $( this.tables().nodes() );\n\t\t\tinst[key].apply( inst, args );\n\t\t\treturn this;\n\t\t} );\n\t} );\n\t\n\t\n\t_api_register( 'clear()', function () {\n\t\treturn this.iterator( 'table', function ( settings ) {\n\t\t\t_fnClearTable( settings );\n\t\t} );\n\t} );\n\t\n\t\n\t_api_register( 'settings()', function () {\n\t\treturn new _Api( this.context, this.context );\n\t} );\n\t\n\t\n\t_api_register( 'init()', function () {\n\t\tvar ctx = this.context;\n\t\treturn ctx.length ? ctx[0].oInit : null;\n\t} );\n\t\n\t\n\t_api_register( 'data()', function () {\n\t\treturn this.iterator( 'table', function ( settings ) {\n\t\t\treturn _pluck( settings.aoData, '_aData' );\n\t\t} ).flatten();\n\t} );\n\t\n\t\n\t_api_register( 'destroy()', function ( remove ) {\n\t\tremove = remove || false;\n\t\n\t\treturn this.iterator( 'table', function ( settings ) {\n\t\t\tvar orig      = settings.nTableWrapper.parentNode;\n\t\t\tvar classes   = settings.oClasses;\n\t\t\tvar table     = settings.nTable;\n\t\t\tvar tbody     = settings.nTBody;\n\t\t\tvar thead     = settings.nTHead;\n\t\t\tvar tfoot     = settings.nTFoot;\n\t\t\tvar jqTable   = $(table);\n\t\t\tvar jqTbody   = $(tbody);\n\t\t\tvar jqWrapper = $(settings.nTableWrapper);\n\t\t\tvar rows      = $.map( settings.aoData, function (r) { return r.nTr; } );\n\t\t\tvar i, ien;\n\t\n\t\t\t// Flag to note that the table is currently being destroyed - no action\n\t\t\t// should be taken\n\t\t\tsettings.bDestroying = true;\n\t\n\t\t\t// Fire off the destroy callbacks for plug-ins etc\n\t\t\t_fnCallbackFire( settings, \"aoDestroyCallback\", \"destroy\", [settings] );\n\t\n\t\t\t// If not being removed from the document, make all columns visible\n\t\t\tif ( ! remove ) {\n\t\t\t\tnew _Api( settings ).columns().visible( true );\n\t\t\t}\n\t\n\t\t\t// Blitz all `DT` namespaced events (these are internal events, the\n\t\t\t// lowercase, `dt` events are user subscribed and they are responsible\n\t\t\t// for removing them\n\t\t\tjqWrapper.off('.DT').find(':not(tbody *)').off('.DT');\n\t\t\t$(window).off('.DT-'+settings.sInstance);\n\t\n\t\t\t// When scrolling we had to break the table up - restore it\n\t\t\tif ( table != thead.parentNode ) {\n\t\t\t\tjqTable.children('thead').detach();\n\t\t\t\tjqTable.append( thead );\n\t\t\t}\n\t\n\t\t\tif ( tfoot && table != tfoot.parentNode ) {\n\t\t\t\tjqTable.children('tfoot').detach();\n\t\t\t\tjqTable.append( tfoot );\n\t\t\t}\n\t\n\t\t\tsettings.aaSorting = [];\n\t\t\tsettings.aaSortingFixed = [];\n\t\t\t_fnSortingClasses( settings );\n\t\n\t\t\t$( rows ).removeClass( settings.asStripeClasses.join(' ') );\n\t\n\t\t\t$('th, td', thead).removeClass( classes.sSortable+' '+\n\t\t\t\tclasses.sSortableAsc+' '+classes.sSortableDesc+' '+classes.sSortableNone\n\t\t\t);\n\t\n\t\t\t// Add the TR elements back into the table in their original order\n\t\t\tjqTbody.children().detach();\n\t\t\tjqTbody.append( rows );\n\t\n\t\t\t// Remove the DataTables generated nodes, events and classes\n\t\t\tvar removedMethod = remove ? 'remove' : 'detach';\n\t\t\tjqTable[ removedMethod ]();\n\t\t\tjqWrapper[ removedMethod ]();\n\t\n\t\t\t// If we need to reattach the table to the document\n\t\t\tif ( ! remove && orig ) {\n\t\t\t\t// insertBefore acts like appendChild if !arg[1]\n\t\t\t\torig.insertBefore( table, settings.nTableReinsertBefore );\n\t\n\t\t\t\t// Restore the width of the original table - was read from the style property,\n\t\t\t\t// so we can restore directly to that\n\t\t\t\tjqTable\n\t\t\t\t\t.css( 'width', settings.sDestroyWidth )\n\t\t\t\t\t.removeClass( classes.sTable );\n\t\n\t\t\t\t// If the were originally stripe classes - then we add them back here.\n\t\t\t\t// Note this is not fool proof (for example if not all rows had stripe\n\t\t\t\t// classes - but it's a good effort without getting carried away\n\t\t\t\tien = settings.asDestroyStripes.length;\n\t\n\t\t\t\tif ( ien ) {\n\t\t\t\t\tjqTbody.children().each( function (i) {\n\t\t\t\t\t\t$(this).addClass( settings.asDestroyStripes[i % ien] );\n\t\t\t\t\t} );\n\t\t\t\t}\n\t\t\t}\n\t\n\t\t\t/* Remove the settings object from the settings array */\n\t\t\tvar idx = $.inArray( settings, DataTable.settings );\n\t\t\tif ( idx !== -1 ) {\n\t\t\t\tDataTable.settings.splice( idx, 1 );\n\t\t\t}\n\t\t} );\n\t} );\n\t\n\t\n\t// Add the `every()` method for rows, columns and cells in a compact form\n\t$.each( [ 'column', 'row', 'cell' ], function ( i, type ) {\n\t\t_api_register( type+'s().every()', function ( fn ) {\n\t\t\tvar opts = this.selector.opts;\n\t\t\tvar api = this;\n\t\n\t\t\treturn this.iterator( type, function ( settings, arg1, arg2, arg3, arg4 ) {\n\t\t\t\t// Rows and columns:\n\t\t\t\t//  arg1 - index\n\t\t\t\t//  arg2 - table counter\n\t\t\t\t//  arg3 - loop counter\n\t\t\t\t//  arg4 - undefined\n\t\t\t\t// Cells:\n\t\t\t\t//  arg1 - row index\n\t\t\t\t//  arg2 - column index\n\t\t\t\t//  arg3 - table counter\n\t\t\t\t//  arg4 - loop counter\n\t\t\t\tfn.call(\n\t\t\t\t\tapi[ type ](\n\t\t\t\t\t\targ1,\n\t\t\t\t\t\ttype==='cell' ? arg2 : opts,\n\t\t\t\t\t\ttype==='cell' ? opts : undefined\n\t\t\t\t\t),\n\t\t\t\t\targ1, arg2, arg3, arg4\n\t\t\t\t);\n\t\t\t} );\n\t\t} );\n\t} );\n\t\n\t\n\t// i18n method for extensions to be able to use the language object from the\n\t// DataTable\n\t_api_register( 'i18n()', function ( token, def, plural ) {\n\t\tvar ctx = this.context[0];\n\t\tvar resolved = _fnGetObjectDataFn( token )( ctx.oLanguage );\n\t\n\t\tif ( resolved === undefined ) {\n\t\t\tresolved = def;\n\t\t}\n\t\n\t\tif ( plural !== undefined && $.isPlainObject( resolved ) ) {\n\t\t\tresolved = resolved[ plural ] !== undefined ?\n\t\t\t\tresolved[ plural ] :\n\t\t\t\tresolved._;\n\t\t}\n\t\n\t\treturn resolved.replace( '%d', plural ); // nb: plural might be undefined,\n\t} );\t\n\t/**\n\t * Version string for plug-ins to check compatibility. Allowed format is\n\t * `a.b.c-d` where: a:int, b:int, c:int, d:string(dev|beta|alpha). `d` is used\n\t * only for non-release builds. See http://semver.org/ for more information.\n\t *  @member\n\t *  @type string\n\t *  @default Version number\n\t */\n\tDataTable.version = \"1.11.5\";\n\t\n\t/**\n\t * Private data store, containing all of the settings objects that are\n\t * created for the tables on a given page.\n\t *\n\t * Note that the `DataTable.settings` object is aliased to\n\t * `jQuery.fn.dataTableExt` through which it may be accessed and\n\t * manipulated, or `jQuery.fn.dataTable.settings`.\n\t *  @member\n\t *  @type array\n\t *  @default []\n\t *  @private\n\t */\n\tDataTable.settings = [];\n\t\n\t/**\n\t * Object models container, for the various models that DataTables has\n\t * available to it. These models define the objects that are used to hold\n\t * the active state and configuration of the table.\n\t *  @namespace\n\t */\n\tDataTable.models = {};\n\t\n\t\n\t\n\t/**\n\t * Template object for the way in which DataTables holds information about\n\t * search information for the global filter and individual column filters.\n\t *  @namespace\n\t */\n\tDataTable.models.oSearch = {\n\t\t/**\n\t\t * Flag to indicate if the filtering should be case insensitive or not\n\t\t *  @type boolean\n\t\t *  @default true\n\t\t */\n\t\t\"bCaseInsensitive\": true,\n\t\n\t\t/**\n\t\t * Applied search term\n\t\t *  @type string\n\t\t *  @default <i>Empty string</i>\n\t\t */\n\t\t\"sSearch\": \"\",\n\t\n\t\t/**\n\t\t * Flag to indicate if the search term should be interpreted as a\n\t\t * regular expression (true) or not (false) and therefore and special\n\t\t * regex characters escaped.\n\t\t *  @type boolean\n\t\t *  @default false\n\t\t */\n\t\t\"bRegex\": false,\n\t\n\t\t/**\n\t\t * Flag to indicate if DataTables is to use its smart filtering or not.\n\t\t *  @type boolean\n\t\t *  @default true\n\t\t */\n\t\t\"bSmart\": true,\n\t\n\t\t/**\n\t\t * Flag to indicate if DataTables should only trigger a search when\n\t\t * the return key is pressed.\n\t\t *  @type boolean\n\t\t *  @default false\n\t\t */\n\t\t\"return\": false\n\t};\n\t\n\t\t\n\t\t\n\t\t\n\t\t/**\n\t\t * Template object for the way in which DataTables holds information about\n\t\t * each individual row. This is the object format used for the settings\n\t\t * aoData array.\n\t\t *  @namespace\n\t\t */\n\t\tDataTable.models.oRow = {\n\t\t\t/**\n\t\t\t * TR element for the row\n\t\t\t *  @type node\n\t\t\t *  @default null\n\t\t\t */\n\t\t\t\"nTr\": null,\n\t\t\n\t\t\t/**\n\t\t\t * Array of TD elements for each row. This is null until the row has been\n\t\t\t * created.\n\t\t\t *  @type array nodes\n\t\t\t *  @default []\n\t\t\t */\n\t\t\t\"anCells\": null,\n\t\t\n\t\t\t/**\n\t\t\t * Data object from the original data source for the row. This is either\n\t\t\t * an array if using the traditional form of DataTables, or an object if\n\t\t\t * using mData options. The exact type will depend on the passed in\n\t\t\t * data from the data source, or will be an array if using DOM a data\n\t\t\t * source.\n\t\t\t *  @type array|object\n\t\t\t *  @default []\n\t\t\t */\n\t\t\t\"_aData\": [],\n\t\t\n\t\t\t/**\n\t\t\t * Sorting data cache - this array is ostensibly the same length as the\n\t\t\t * number of columns (although each index is generated only as it is\n\t\t\t * needed), and holds the data that is used for sorting each column in the\n\t\t\t * row. We do this cache generation at the start of the sort in order that\n\t\t\t * the formatting of the sort data need be done only once for each cell\n\t\t\t * per sort. This array should not be read from or written to by anything\n\t\t\t * other than the master sorting methods.\n\t\t\t *  @type array\n\t\t\t *  @default null\n\t\t\t *  @private\n\t\t\t */\n\t\t\t\"_aSortData\": null,\n\t\t\n\t\t\t/**\n\t\t\t * Per cell filtering data cache. As per the sort data cache, used to\n\t\t\t * increase the performance of the filtering in DataTables\n\t\t\t *  @type array\n\t\t\t *  @default null\n\t\t\t *  @private\n\t\t\t */\n\t\t\t\"_aFilterData\": null,\n\t\t\n\t\t\t/**\n\t\t\t * Filtering data cache. This is the same as the cell filtering cache, but\n\t\t\t * in this case a string rather than an array. This is easily computed with\n\t\t\t * a join on `_aFilterData`, but is provided as a cache so the join isn't\n\t\t\t * needed on every search (memory traded for performance)\n\t\t\t *  @type array\n\t\t\t *  @default null\n\t\t\t *  @private\n\t\t\t */\n\t\t\t\"_sFilterRow\": null,\n\t\t\n\t\t\t/**\n\t\t\t * Cache of the class name that DataTables has applied to the row, so we\n\t\t\t * can quickly look at this variable rather than needing to do a DOM check\n\t\t\t * on className for the nTr property.\n\t\t\t *  @type string\n\t\t\t *  @default <i>Empty string</i>\n\t\t\t *  @private\n\t\t\t */\n\t\t\t\"_sRowStripe\": \"\",\n\t\t\n\t\t\t/**\n\t\t\t * Denote if the original data source was from the DOM, or the data source\n\t\t\t * object. This is used for invalidating data, so DataTables can\n\t\t\t * automatically read data from the original source, unless uninstructed\n\t\t\t * otherwise.\n\t\t\t *  @type string\n\t\t\t *  @default null\n\t\t\t *  @private\n\t\t\t */\n\t\t\t\"src\": null,\n\t\t\n\t\t\t/**\n\t\t\t * Index in the aoData array. This saves an indexOf lookup when we have the\n\t\t\t * object, but want to know the index\n\t\t\t *  @type integer\n\t\t\t *  @default -1\n\t\t\t *  @private\n\t\t\t */\n\t\t\t\"idx\": -1\n\t\t};\n\t\t\n\t\t\n\t\t/**\n\t\t * Template object for the column information object in DataTables. This object\n\t\t * is held in the settings aoColumns array and contains all the information that\n\t\t * DataTables needs about each individual column.\n\t\t *\n\t\t * Note that this object is related to {@link DataTable.defaults.column}\n\t\t * but this one is the internal data store for DataTables's cache of columns.\n\t\t * It should NOT be manipulated outside of DataTables. Any configuration should\n\t\t * be done through the initialisation options.\n\t\t *  @namespace\n\t\t */\n\t\tDataTable.models.oColumn = {\n\t\t\t/**\n\t\t\t * Column index. This could be worked out on-the-fly with $.inArray, but it\n\t\t\t * is faster to just hold it as a variable\n\t\t\t *  @type integer\n\t\t\t *  @default null\n\t\t\t */\n\t\t\t\"idx\": null,\n\t\t\n\t\t\t/**\n\t\t\t * A list of the columns that sorting should occur on when this column\n\t\t\t * is sorted. That this property is an array allows multi-column sorting\n\t\t\t * to be defined for a column (for example first name / last name columns\n\t\t\t * would benefit from this). The values are integers pointing to the\n\t\t\t * columns to be sorted on (typically it will be a single integer pointing\n\t\t\t * at itself, but that doesn't need to be the case).\n\t\t\t *  @type array\n\t\t\t */\n\t\t\t\"aDataSort\": null,\n\t\t\n\t\t\t/**\n\t\t\t * Define the sorting directions that are applied to the column, in sequence\n\t\t\t * as the column is repeatedly sorted upon - i.e. the first value is used\n\t\t\t * as the sorting direction when the column if first sorted (clicked on).\n\t\t\t * Sort it again (click again) and it will move on to the next index.\n\t\t\t * Repeat until loop.\n\t\t\t *  @type array\n\t\t\t */\n\t\t\t\"asSorting\": null,\n\t\t\n\t\t\t/**\n\t\t\t * Flag to indicate if the column is searchable, and thus should be included\n\t\t\t * in the filtering or not.\n\t\t\t *  @type boolean\n\t\t\t */\n\t\t\t\"bSearchable\": null,\n\t\t\n\t\t\t/**\n\t\t\t * Flag to indicate if the column is sortable or not.\n\t\t\t *  @type boolean\n\t\t\t */\n\t\t\t\"bSortable\": null,\n\t\t\n\t\t\t/**\n\t\t\t * Flag to indicate if the column is currently visible in the table or not\n\t\t\t *  @type boolean\n\t\t\t */\n\t\t\t\"bVisible\": null,\n\t\t\n\t\t\t/**\n\t\t\t * Store for manual type assignment using the `column.type` option. This\n\t\t\t * is held in store so we can manipulate the column's `sType` property.\n\t\t\t *  @type string\n\t\t\t *  @default null\n\t\t\t *  @private\n\t\t\t */\n\t\t\t\"_sManualType\": null,\n\t\t\n\t\t\t/**\n\t\t\t * Flag to indicate if HTML5 data attributes should be used as the data\n\t\t\t * source for filtering or sorting. True is either are.\n\t\t\t *  @type boolean\n\t\t\t *  @default false\n\t\t\t *  @private\n\t\t\t */\n\t\t\t\"_bAttrSrc\": false,\n\t\t\n\t\t\t/**\n\t\t\t * Developer definable function that is called whenever a cell is created (Ajax source,\n\t\t\t * etc) or processed for input (DOM source). This can be used as a compliment to mRender\n\t\t\t * allowing you to modify the DOM element (add background colour for example) when the\n\t\t\t * element is available.\n\t\t\t *  @type function\n\t\t\t *  @param {element} nTd The TD node that has been created\n\t\t\t *  @param {*} sData The Data for the cell\n\t\t\t *  @param {array|object} oData The data for the whole row\n\t\t\t *  @param {int} iRow The row index for the aoData data store\n\t\t\t *  @default null\n\t\t\t */\n\t\t\t\"fnCreatedCell\": null,\n\t\t\n\t\t\t/**\n\t\t\t * Function to get data from a cell in a column. You should <b>never</b>\n\t\t\t * access data directly through _aData internally in DataTables - always use\n\t\t\t * the method attached to this property. It allows mData to function as\n\t\t\t * required. This function is automatically assigned by the column\n\t\t\t * initialisation method\n\t\t\t *  @type function\n\t\t\t *  @param {array|object} oData The data array/object for the array\n\t\t\t *    (i.e. aoData[]._aData)\n\t\t\t *  @param {string} sSpecific The specific data type you want to get -\n\t\t\t *    'display', 'type' 'filter' 'sort'\n\t\t\t *  @returns {*} The data for the cell from the given row's data\n\t\t\t *  @default null\n\t\t\t */\n\t\t\t\"fnGetData\": null,\n\t\t\n\t\t\t/**\n\t\t\t * Function to set data for a cell in the column. You should <b>never</b>\n\t\t\t * set the data directly to _aData internally in DataTables - always use\n\t\t\t * this method. It allows mData to function as required. This function\n\t\t\t * is automatically assigned by the column initialisation method\n\t\t\t *  @type function\n\t\t\t *  @param {array|object} oData The data array/object for the array\n\t\t\t *    (i.e. aoData[]._aData)\n\t\t\t *  @param {*} sValue Value to set\n\t\t\t *  @default null\n\t\t\t */\n\t\t\t\"fnSetData\": null,\n\t\t\n\t\t\t/**\n\t\t\t * Property to read the value for the cells in the column from the data\n\t\t\t * source array / object. If null, then the default content is used, if a\n\t\t\t * function is given then the return from the function is used.\n\t\t\t *  @type function|int|string|null\n\t\t\t *  @default null\n\t\t\t */\n\t\t\t\"mData\": null,\n\t\t\n\t\t\t/**\n\t\t\t * Partner property to mData which is used (only when defined) to get\n\t\t\t * the data - i.e. it is basically the same as mData, but without the\n\t\t\t * 'set' option, and also the data fed to it is the result from mData.\n\t\t\t * This is the rendering method to match the data method of mData.\n\t\t\t *  @type function|int|string|null\n\t\t\t *  @default null\n\t\t\t */\n\t\t\t\"mRender\": null,\n\t\t\n\t\t\t/**\n\t\t\t * Unique header TH/TD element for this column - this is what the sorting\n\t\t\t * listener is attached to (if sorting is enabled.)\n\t\t\t *  @type node\n\t\t\t *  @default null\n\t\t\t */\n\t\t\t\"nTh\": null,\n\t\t\n\t\t\t/**\n\t\t\t * Unique footer TH/TD element for this column (if there is one). Not used\n\t\t\t * in DataTables as such, but can be used for plug-ins to reference the\n\t\t\t * footer for each column.\n\t\t\t *  @type node\n\t\t\t *  @default null\n\t\t\t */\n\t\t\t\"nTf\": null,\n\t\t\n\t\t\t/**\n\t\t\t * The class to apply to all TD elements in the table's TBODY for the column\n\t\t\t *  @type string\n\t\t\t *  @default null\n\t\t\t */\n\t\t\t\"sClass\": null,\n\t\t\n\t\t\t/**\n\t\t\t * When DataTables calculates the column widths to assign to each column,\n\t\t\t * it finds the longest string in each column and then constructs a\n\t\t\t * temporary table and reads the widths from that. The problem with this\n\t\t\t * is that \"mmm\" is much wider then \"iiii\", but the latter is a longer\n\t\t\t * string - thus the calculation can go wrong (doing it properly and putting\n\t\t\t * it into an DOM object and measuring that is horribly(!) slow). Thus as\n\t\t\t * a \"work around\" we provide this option. It will append its value to the\n\t\t\t * text that is found to be the longest string for the column - i.e. padding.\n\t\t\t *  @type string\n\t\t\t */\n\t\t\t\"sContentPadding\": null,\n\t\t\n\t\t\t/**\n\t\t\t * Allows a default value to be given for a column's data, and will be used\n\t\t\t * whenever a null data source is encountered (this can be because mData\n\t\t\t * is set to null, or because the data source itself is null).\n\t\t\t *  @type string\n\t\t\t *  @default null\n\t\t\t */\n\t\t\t\"sDefaultContent\": null,\n\t\t\n\t\t\t/**\n\t\t\t * Name for the column, allowing reference to the column by name as well as\n\t\t\t * by index (needs a lookup to work by name).\n\t\t\t *  @type string\n\t\t\t */\n\t\t\t\"sName\": null,\n\t\t\n\t\t\t/**\n\t\t\t * Custom sorting data type - defines which of the available plug-ins in\n\t\t\t * afnSortData the custom sorting will use - if any is defined.\n\t\t\t *  @type string\n\t\t\t *  @default std\n\t\t\t */\n\t\t\t\"sSortDataType\": 'std',\n\t\t\n\t\t\t/**\n\t\t\t * Class to be applied to the header element when sorting on this column\n\t\t\t *  @type string\n\t\t\t *  @default null\n\t\t\t */\n\t\t\t\"sSortingClass\": null,\n\t\t\n\t\t\t/**\n\t\t\t * Class to be applied to the header element when sorting on this column -\n\t\t\t * when jQuery UI theming is used.\n\t\t\t *  @type string\n\t\t\t *  @default null\n\t\t\t */\n\t\t\t\"sSortingClassJUI\": null,\n\t\t\n\t\t\t/**\n\t\t\t * Title of the column - what is seen in the TH element (nTh).\n\t\t\t *  @type string\n\t\t\t */\n\t\t\t\"sTitle\": null,\n\t\t\n\t\t\t/**\n\t\t\t * Column sorting and filtering type\n\t\t\t *  @type string\n\t\t\t *  @default null\n\t\t\t */\n\t\t\t\"sType\": null,\n\t\t\n\t\t\t/**\n\t\t\t * Width of the column\n\t\t\t *  @type string\n\t\t\t *  @default null\n\t\t\t */\n\t\t\t\"sWidth\": null,\n\t\t\n\t\t\t/**\n\t\t\t * Width of the column when it was first \"encountered\"\n\t\t\t *  @type string\n\t\t\t *  @default null\n\t\t\t */\n\t\t\t\"sWidthOrig\": null\n\t\t};\n\t\t\n\t\t\n\t\t/*\n\t\t * Developer note: The properties of the object below are given in Hungarian\n\t\t * notation, that was used as the interface for DataTables prior to v1.10, however\n\t\t * from v1.10 onwards the primary interface is camel case. In order to avoid\n\t\t * breaking backwards compatibility utterly with this change, the Hungarian\n\t\t * version is still, internally the primary interface, but is is not documented\n\t\t * - hence the @name tags in each doc comment. This allows a Javascript function\n\t\t * to create a map from Hungarian notation to camel case (going the other direction\n\t\t * would require each property to be listed, which would add around 3K to the size\n\t\t * of DataTables, while this method is about a 0.5K hit).\n\t\t *\n\t\t * Ultimately this does pave the way for Hungarian notation to be dropped\n\t\t * completely, but that is a massive amount of work and will break current\n\t\t * installs (therefore is on-hold until v2).\n\t\t */\n\t\t\n\t\t/**\n\t\t * Initialisation options that can be given to DataTables at initialisation\n\t\t * time.\n\t\t *  @namespace\n\t\t */\n\t\tDataTable.defaults = {\n\t\t\t/**\n\t\t\t * An array of data to use for the table, passed in at initialisation which\n\t\t\t * will be used in preference to any data which is already in the DOM. This is\n\t\t\t * particularly useful for constructing tables purely in Javascript, for\n\t\t\t * example with a custom Ajax call.\n\t\t\t *  @type array\n\t\t\t *  @default null\n\t\t\t *\n\t\t\t *  @dtopt Option\n\t\t\t *  @name DataTable.defaults.data\n\t\t\t *\n\t\t\t *  @example\n\t\t\t *    // Using a 2D array data source\n\t\t\t *    $(document).ready( function () {\n\t\t\t *      $('#example').dataTable( {\n\t\t\t *        \"data\": [\n\t\t\t *          ['Trident', 'Internet Explorer 4.0', 'Win 95+', 4, 'X'],\n\t\t\t *          ['Trident', 'Internet Explorer 5.0', 'Win 95+', 5, 'C'],\n\t\t\t *        ],\n\t\t\t *        \"columns\": [\n\t\t\t *          { \"title\": \"Engine\" },\n\t\t\t *          { \"title\": \"Browser\" },\n\t\t\t *          { \"title\": \"Platform\" },\n\t\t\t *          { \"title\": \"Version\" },\n\t\t\t *          { \"title\": \"Grade\" }\n\t\t\t *        ]\n\t\t\t *      } );\n\t\t\t *    } );\n\t\t\t *\n\t\t\t *  @example\n\t\t\t *    // Using an array of objects as a data source (`data`)\n\t\t\t *    $(document).ready( function () {\n\t\t\t *      $('#example').dataTable( {\n\t\t\t *        \"data\": [\n\t\t\t *          {\n\t\t\t *            \"engine\":   \"Trident\",\n\t\t\t *            \"browser\":  \"Internet Explorer 4.0\",\n\t\t\t *            \"platform\": \"Win 95+\",\n\t\t\t *            \"version\":  4,\n\t\t\t *            \"grade\":    \"X\"\n\t\t\t *          },\n\t\t\t *          {\n\t\t\t *            \"engine\":   \"Trident\",\n\t\t\t *            \"browser\":  \"Internet Explorer 5.0\",\n\t\t\t *            \"platform\": \"Win 95+\",\n\t\t\t *            \"version\":  5,\n\t\t\t *            \"grade\":    \"C\"\n\t\t\t *          }\n\t\t\t *        ],\n\t\t\t *        \"columns\": [\n\t\t\t *          { \"title\": \"Engine\",   \"data\": \"engine\" },\n\t\t\t *          { \"title\": \"Browser\",  \"data\": \"browser\" },\n\t\t\t *          { \"title\": \"Platform\", \"data\": \"platform\" },\n\t\t\t *          { \"title\": \"Version\",  \"data\": \"version\" },\n\t\t\t *          { \"title\": \"Grade\",    \"data\": \"grade\" }\n\t\t\t *        ]\n\t\t\t *      } );\n\t\t\t *    } );\n\t\t\t */\n\t\t\t\"aaData\": null,\n\t\t\n\t\t\n\t\t\t/**\n\t\t\t * If ordering is enabled, then DataTables will perform a first pass sort on\n\t\t\t * initialisation. You can define which column(s) the sort is performed\n\t\t\t * upon, and the sorting direction, with this variable. The `sorting` array\n\t\t\t * should contain an array for each column to be sorted initially containing\n\t\t\t * the column's index and a direction string ('asc' or 'desc').\n\t\t\t *  @type array\n\t\t\t *  @default [[0,'asc']]\n\t\t\t *\n\t\t\t *  @dtopt Option\n\t\t\t *  @name DataTable.defaults.order\n\t\t\t *\n\t\t\t *  @example\n\t\t\t *    // Sort by 3rd column first, and then 4th column\n\t\t\t *    $(document).ready( function() {\n\t\t\t *      $('#example').dataTable( {\n\t\t\t *        \"order\": [[2,'asc'], [3,'desc']]\n\t\t\t *      } );\n\t\t\t *    } );\n\t\t\t *\n\t\t\t *    // No initial sorting\n\t\t\t *    $(document).ready( function() {\n\t\t\t *      $('#example').dataTable( {\n\t\t\t *        \"order\": []\n\t\t\t *      } );\n\t\t\t *    } );\n\t\t\t */\n\t\t\t\"aaSorting\": [[0,'asc']],\n\t\t\n\t\t\n\t\t\t/**\n\t\t\t * This parameter is basically identical to the `sorting` parameter, but\n\t\t\t * cannot be overridden by user interaction with the table. What this means\n\t\t\t * is that you could have a column (visible or hidden) which the sorting\n\t\t\t * will always be forced on first - any sorting after that (from the user)\n\t\t\t * will then be performed as required. This can be useful for grouping rows\n\t\t\t * together.\n\t\t\t *  @type array\n\t\t\t *  @default null\n\t\t\t *\n\t\t\t *  @dtopt Option\n\t\t\t *  @name DataTable.defaults.orderFixed\n\t\t\t *\n\t\t\t *  @example\n\t\t\t *    $(document).ready( function() {\n\t\t\t *      $('#example').dataTable( {\n\t\t\t *        \"orderFixed\": [[0,'asc']]\n\t\t\t *      } );\n\t\t\t *    } )\n\t\t\t */\n\t\t\t\"aaSortingFixed\": [],\n\t\t\n\t\t\n\t\t\t/**\n\t\t\t * DataTables can be instructed to load data to display in the table from a\n\t\t\t * Ajax source. This option defines how that Ajax call is made and where to.\n\t\t\t *\n\t\t\t * The `ajax` property has three different modes of operation, depending on\n\t\t\t * how it is defined. These are:\n\t\t\t *\n\t\t\t * * `string` - Set the URL from where the data should be loaded from.\n\t\t\t * * `object` - Define properties for `jQuery.ajax`.\n\t\t\t * * `function` - Custom data get function\n\t\t\t *\n\t\t\t * `string`\n\t\t\t * --------\n\t\t\t *\n\t\t\t * As a string, the `ajax` property simply defines the URL from which\n\t\t\t * DataTables will load data.\n\t\t\t *\n\t\t\t * `object`\n\t\t\t * --------\n\t\t\t *\n\t\t\t * As an object, the parameters in the object are passed to\n\t\t\t * [jQuery.ajax](http://api.jquery.com/jQuery.ajax/) allowing fine control\n\t\t\t * of the Ajax request. DataTables has a number of default parameters which\n\t\t\t * you can override using this option. Please refer to the jQuery\n\t\t\t * documentation for a full description of the options available, although\n\t\t\t * the following parameters provide additional options in DataTables or\n\t\t\t * require special consideration:\n\t\t\t *\n\t\t\t * * `data` - As with jQuery, `data` can be provided as an object, but it\n\t\t\t *   can also be used as a function to manipulate the data DataTables sends\n\t\t\t *   to the server. The function takes a single parameter, an object of\n\t\t\t *   parameters with the values that DataTables has readied for sending. An\n\t\t\t *   object may be returned which will be merged into the DataTables\n\t\t\t *   defaults, or you can add the items to the object that was passed in and\n\t\t\t *   not return anything from the function. This supersedes `fnServerParams`\n\t\t\t *   from DataTables 1.9-.\n\t\t\t *\n\t\t\t * * `dataSrc` - By default DataTables will look for the property `data` (or\n\t\t\t *   `aaData` for compatibility with DataTables 1.9-) when obtaining data\n\t\t\t *   from an Ajax source or for server-side processing - this parameter\n\t\t\t *   allows that property to be changed. You can use Javascript dotted\n\t\t\t *   object notation to get a data source for multiple levels of nesting, or\n\t\t\t *   it my be used as a function. As a function it takes a single parameter,\n\t\t\t *   the JSON returned from the server, which can be manipulated as\n\t\t\t *   required, with the returned value being that used by DataTables as the\n\t\t\t *   data source for the table. This supersedes `sAjaxDataProp` from\n\t\t\t *   DataTables 1.9-.\n\t\t\t *\n\t\t\t * * `success` - Should not be overridden it is used internally in\n\t\t\t *   DataTables. To manipulate / transform the data returned by the server\n\t\t\t *   use `ajax.dataSrc`, or use `ajax` as a function (see below).\n\t\t\t *\n\t\t\t * `function`\n\t\t\t * ----------\n\t\t\t *\n\t\t\t * As a function, making the Ajax call is left up to yourself allowing\n\t\t\t * complete control of the Ajax request. Indeed, if desired, a method other\n\t\t\t * than Ajax could be used to obtain the required data, such as Web storage\n\t\t\t * or an AIR database.\n\t\t\t *\n\t\t\t * The function is given four parameters and no return is required. The\n\t\t\t * parameters are:\n\t\t\t *\n\t\t\t * 1. _object_ - Data to send to the server\n\t\t\t * 2. _function_ - Callback function that must be executed when the required\n\t\t\t *    data has been obtained. That data should be passed into the callback\n\t\t\t *    as the only parameter\n\t\t\t * 3. _object_ - DataTables settings object for the table\n\t\t\t *\n\t\t\t * Note that this supersedes `fnServerData` from DataTables 1.9-.\n\t\t\t *\n\t\t\t *  @type string|object|function\n\t\t\t *  @default null\n\t\t\t *\n\t\t\t *  @dtopt Option\n\t\t\t *  @name DataTable.defaults.ajax\n\t\t\t *  @since 1.10.0\n\t\t\t *\n\t\t\t * @example\n\t\t\t *   // Get JSON data from a file via Ajax.\n\t\t\t *   // Note DataTables expects data in the form `{ data: [ ...data... ] }` by default).\n\t\t\t *   $('#example').dataTable( {\n\t\t\t *     \"ajax\": \"data.json\"\n\t\t\t *   } );\n\t\t\t *\n\t\t\t * @example\n\t\t\t *   // Get JSON data from a file via Ajax, using `dataSrc` to change\n\t\t\t *   // `data` to `tableData` (i.e. `{ tableData: [ ...data... ] }`)\n\t\t\t *   $('#example').dataTable( {\n\t\t\t *     \"ajax\": {\n\t\t\t *       \"url\": \"data.json\",\n\t\t\t *       \"dataSrc\": \"tableData\"\n\t\t\t *     }\n\t\t\t *   } );\n\t\t\t *\n\t\t\t * @example\n\t\t\t *   // Get JSON data from a file via Ajax, using `dataSrc` to read data\n\t\t\t *   // from a plain array rather than an array in an object\n\t\t\t *   $('#example').dataTable( {\n\t\t\t *     \"ajax\": {\n\t\t\t *       \"url\": \"data.json\",\n\t\t\t *       \"dataSrc\": \"\"\n\t\t\t *     }\n\t\t\t *   } );\n\t\t\t *\n\t\t\t * @example\n\t\t\t *   // Manipulate the data returned from the server - add a link to data\n\t\t\t *   // (note this can, should, be done using `render` for the column - this\n\t\t\t *   // is just a simple example of how the data can be manipulated).\n\t\t\t *   $('#example').dataTable( {\n\t\t\t *     \"ajax\": {\n\t\t\t *       \"url\": \"data.json\",\n\t\t\t *       \"dataSrc\": function ( json ) {\n\t\t\t *         for ( var i=0, ien=json.length ; i<ien ; i++ ) {\n\t\t\t *           json[i][0] = '<a href=\"/message/'+json[i][0]+'>View message</a>';\n\t\t\t *         }\n\t\t\t *         return json;\n\t\t\t *       }\n\t\t\t *     }\n\t\t\t *   } );\n\t\t\t *\n\t\t\t * @example\n\t\t\t *   // Add data to the request\n\t\t\t *   $('#example').dataTable( {\n\t\t\t *     \"ajax\": {\n\t\t\t *       \"url\": \"data.json\",\n\t\t\t *       \"data\": function ( d ) {\n\t\t\t *         return {\n\t\t\t *           \"extra_search\": $('#extra').val()\n\t\t\t *         };\n\t\t\t *       }\n\t\t\t *     }\n\t\t\t *   } );\n\t\t\t *\n\t\t\t * @example\n\t\t\t *   // Send request as POST\n\t\t\t *   $('#example').dataTable( {\n\t\t\t *     \"ajax\": {\n\t\t\t *       \"url\": \"data.json\",\n\t\t\t *       \"type\": \"POST\"\n\t\t\t *     }\n\t\t\t *   } );\n\t\t\t *\n\t\t\t * @example\n\t\t\t *   // Get the data from localStorage (could interface with a form for\n\t\t\t *   // adding, editing and removing rows).\n\t\t\t *   $('#example').dataTable( {\n\t\t\t *     \"ajax\": function (data, callback, settings) {\n\t\t\t *       callback(\n\t\t\t *         JSON.parse( localStorage.getItem('dataTablesData') )\n\t\t\t *       );\n\t\t\t *     }\n\t\t\t *   } );\n\t\t\t */\n\t\t\t\"ajax\": null,\n\t\t\n\t\t\n\t\t\t/**\n\t\t\t * This parameter allows you to readily specify the entries in the length drop\n\t\t\t * down menu that DataTables shows when pagination is enabled. It can be\n\t\t\t * either a 1D array of options which will be used for both the displayed\n\t\t\t * option and the value, or a 2D array which will use the array in the first\n\t\t\t * position as the value, and the array in the second position as the\n\t\t\t * displayed options (useful for language strings such as 'All').\n\t\t\t *\n\t\t\t * Note that the `pageLength` property will be automatically set to the\n\t\t\t * first value given in this array, unless `pageLength` is also provided.\n\t\t\t *  @type array\n\t\t\t *  @default [ 10, 25, 50, 100 ]\n\t\t\t *\n\t\t\t *  @dtopt Option\n\t\t\t *  @name DataTable.defaults.lengthMenu\n\t\t\t *\n\t\t\t *  @example\n\t\t\t *    $(document).ready( function() {\n\t\t\t *      $('#example').dataTable( {\n\t\t\t *        \"lengthMenu\": [[10, 25, 50, -1], [10, 25, 50, \"All\"]]\n\t\t\t *      } );\n\t\t\t *    } );\n\t\t\t */\n\t\t\t\"aLengthMenu\": [ 10, 25, 50, 100 ],\n\t\t\n\t\t\n\t\t\t/**\n\t\t\t * The `columns` option in the initialisation parameter allows you to define\n\t\t\t * details about the way individual columns behave. For a full list of\n\t\t\t * column options that can be set, please see\n\t\t\t * {@link DataTable.defaults.column}. Note that if you use `columns` to\n\t\t\t * define your columns, you must have an entry in the array for every single\n\t\t\t * column that you have in your table (these can be null if you don't which\n\t\t\t * to specify any options).\n\t\t\t *  @member\n\t\t\t *\n\t\t\t *  @name DataTable.defaults.column\n\t\t\t */\n\t\t\t\"aoColumns\": null,\n\t\t\n\t\t\t/**\n\t\t\t * Very similar to `columns`, `columnDefs` allows you to target a specific\n\t\t\t * column, multiple columns, or all columns, using the `targets` property of\n\t\t\t * each object in the array. This allows great flexibility when creating\n\t\t\t * tables, as the `columnDefs` arrays can be of any length, targeting the\n\t\t\t * columns you specifically want. `columnDefs` may use any of the column\n\t\t\t * options available: {@link DataTable.defaults.column}, but it _must_\n\t\t\t * have `targets` defined in each object in the array. Values in the `targets`\n\t\t\t * array may be:\n\t\t\t *   <ul>\n\t\t\t *     <li>a string - class name will be matched on the TH for the column</li>\n\t\t\t *     <li>0 or a positive integer - column index counting from the left</li>\n\t\t\t *     <li>a negative integer - column index counting from the right</li>\n\t\t\t *     <li>the string \"_all\" - all columns (i.e. assign a default)</li>\n\t\t\t *   </ul>\n\t\t\t *  @member\n\t\t\t *\n\t\t\t *  @name DataTable.defaults.columnDefs\n\t\t\t */\n\t\t\t\"aoColumnDefs\": null,\n\t\t\n\t\t\n\t\t\t/**\n\t\t\t * Basically the same as `search`, this parameter defines the individual column\n\t\t\t * filtering state at initialisation time. The array must be of the same size\n\t\t\t * as the number of columns, and each element be an object with the parameters\n\t\t\t * `search` and `escapeRegex` (the latter is optional). 'null' is also\n\t\t\t * accepted and the default will be used.\n\t\t\t *  @type array\n\t\t\t *  @default []\n\t\t\t *\n\t\t\t *  @dtopt Option\n\t\t\t *  @name DataTable.defaults.searchCols\n\t\t\t *\n\t\t\t *  @example\n\t\t\t *    $(document).ready( function() {\n\t\t\t *      $('#example').dataTable( {\n\t\t\t *        \"searchCols\": [\n\t\t\t *          null,\n\t\t\t *          { \"search\": \"My filter\" },\n\t\t\t *          null,\n\t\t\t *          { \"search\": \"^[0-9]\", \"escapeRegex\": false }\n\t\t\t *        ]\n\t\t\t *      } );\n\t\t\t *    } )\n\t\t\t */\n\t\t\t\"aoSearchCols\": [],\n\t\t\n\t\t\n\t\t\t/**\n\t\t\t * An array of CSS classes that should be applied to displayed rows. This\n\t\t\t * array may be of any length, and DataTables will apply each class\n\t\t\t * sequentially, looping when required.\n\t\t\t *  @type array\n\t\t\t *  @default null <i>Will take the values determined by the `oClasses.stripe*`\n\t\t\t *    options</i>\n\t\t\t *\n\t\t\t *  @dtopt Option\n\t\t\t *  @name DataTable.defaults.stripeClasses\n\t\t\t *\n\t\t\t *  @example\n\t\t\t *    $(document).ready( function() {\n\t\t\t *      $('#example').dataTable( {\n\t\t\t *        \"stripeClasses\": [ 'strip1', 'strip2', 'strip3' ]\n\t\t\t *      } );\n\t\t\t *    } )\n\t\t\t */\n\t\t\t\"asStripeClasses\": null,\n\t\t\n\t\t\n\t\t\t/**\n\t\t\t * Enable or disable automatic column width calculation. This can be disabled\n\t\t\t * as an optimisation (it takes some time to calculate the widths) if the\n\t\t\t * tables widths are passed in using `columns`.\n\t\t\t *  @type boolean\n\t\t\t *  @default true\n\t\t\t *\n\t\t\t *  @dtopt Features\n\t\t\t *  @name DataTable.defaults.autoWidth\n\t\t\t *\n\t\t\t *  @example\n\t\t\t *    $(document).ready( function () {\n\t\t\t *      $('#example').dataTable( {\n\t\t\t *        \"autoWidth\": false\n\t\t\t *      } );\n\t\t\t *    } );\n\t\t\t */\n\t\t\t\"bAutoWidth\": true,\n\t\t\n\t\t\n\t\t\t/**\n\t\t\t * Deferred rendering can provide DataTables with a huge speed boost when you\n\t\t\t * are using an Ajax or JS data source for the table. This option, when set to\n\t\t\t * true, will cause DataTables to defer the creation of the table elements for\n\t\t\t * each row until they are needed for a draw - saving a significant amount of\n\t\t\t * time.\n\t\t\t *  @type boolean\n\t\t\t *  @default false\n\t\t\t *\n\t\t\t *  @dtopt Features\n\t\t\t *  @name DataTable.defaults.deferRender\n\t\t\t *\n\t\t\t *  @example\n\t\t\t *    $(document).ready( function() {\n\t\t\t *      $('#example').dataTable( {\n\t\t\t *        \"ajax\": \"sources/arrays.txt\",\n\t\t\t *        \"deferRender\": true\n\t\t\t *      } );\n\t\t\t *    } );\n\t\t\t */\n\t\t\t\"bDeferRender\": false,\n\t\t\n\t\t\n\t\t\t/**\n\t\t\t * Replace a DataTable which matches the given selector and replace it with\n\t\t\t * one which has the properties of the new initialisation object passed. If no\n\t\t\t * table matches the selector, then the new DataTable will be constructed as\n\t\t\t * per normal.\n\t\t\t *  @type boolean\n\t\t\t *  @default false\n\t\t\t *\n\t\t\t *  @dtopt Options\n\t\t\t *  @name DataTable.defaults.destroy\n\t\t\t *\n\t\t\t *  @example\n\t\t\t *    $(document).ready( function() {\n\t\t\t *      $('#example').dataTable( {\n\t\t\t *        \"srollY\": \"200px\",\n\t\t\t *        \"paginate\": false\n\t\t\t *      } );\n\t\t\t *\n\t\t\t *      // Some time later....\n\t\t\t *      $('#example').dataTable( {\n\t\t\t *        \"filter\": false,\n\t\t\t *        \"destroy\": true\n\t\t\t *      } );\n\t\t\t *    } );\n\t\t\t */\n\t\t\t\"bDestroy\": false,\n\t\t\n\t\t\n\t\t\t/**\n\t\t\t * Enable or disable filtering of data. Filtering in DataTables is \"smart\" in\n\t\t\t * that it allows the end user to input multiple words (space separated) and\n\t\t\t * will match a row containing those words, even if not in the order that was\n\t\t\t * specified (this allow matching across multiple columns). Note that if you\n\t\t\t * wish to use filtering in DataTables this must remain 'true' - to remove the\n\t\t\t * default filtering input box and retain filtering abilities, please use\n\t\t\t * {@link DataTable.defaults.dom}.\n\t\t\t *  @type boolean\n\t\t\t *  @default true\n\t\t\t *\n\t\t\t *  @dtopt Features\n\t\t\t *  @name DataTable.defaults.searching\n\t\t\t *\n\t\t\t *  @example\n\t\t\t *    $(document).ready( function () {\n\t\t\t *      $('#example').dataTable( {\n\t\t\t *        \"searching\": false\n\t\t\t *      } );\n\t\t\t *    } );\n\t\t\t */\n\t\t\t\"bFilter\": true,\n\t\t\n\t\t\n\t\t\t/**\n\t\t\t * Enable or disable the table information display. This shows information\n\t\t\t * about the data that is currently visible on the page, including information\n\t\t\t * about filtered data if that action is being performed.\n\t\t\t *  @type boolean\n\t\t\t *  @default true\n\t\t\t *\n\t\t\t *  @dtopt Features\n\t\t\t *  @name DataTable.defaults.info\n\t\t\t *\n\t\t\t *  @example\n\t\t\t *    $(document).ready( function () {\n\t\t\t *      $('#example').dataTable( {\n\t\t\t *        \"info\": false\n\t\t\t *      } );\n\t\t\t *    } );\n\t\t\t */\n\t\t\t\"bInfo\": true,\n\t\t\n\t\t\n\t\t\t/**\n\t\t\t * Allows the end user to select the size of a formatted page from a select\n\t\t\t * menu (sizes are 10, 25, 50 and 100). Requires pagination (`paginate`).\n\t\t\t *  @type boolean\n\t\t\t *  @default true\n\t\t\t *\n\t\t\t *  @dtopt Features\n\t\t\t *  @name DataTable.defaults.lengthChange\n\t\t\t *\n\t\t\t *  @example\n\t\t\t *    $(document).ready( function () {\n\t\t\t *      $('#example').dataTable( {\n\t\t\t *        \"lengthChange\": false\n\t\t\t *      } );\n\t\t\t *    } );\n\t\t\t */\n\t\t\t\"bLengthChange\": true,\n\t\t\n\t\t\n\t\t\t/**\n\t\t\t * Enable or disable pagination.\n\t\t\t *  @type boolean\n\t\t\t *  @default true\n\t\t\t *\n\t\t\t *  @dtopt Features\n\t\t\t *  @name DataTable.defaults.paging\n\t\t\t *\n\t\t\t *  @example\n\t\t\t *    $(document).ready( function () {\n\t\t\t *      $('#example').dataTable( {\n\t\t\t *        \"paging\": false\n\t\t\t *      } );\n\t\t\t *    } );\n\t\t\t */\n\t\t\t\"bPaginate\": true,\n\t\t\n\t\t\n\t\t\t/**\n\t\t\t * Enable or disable the display of a 'processing' indicator when the table is\n\t\t\t * being processed (e.g. a sort). This is particularly useful for tables with\n\t\t\t * large amounts of data where it can take a noticeable amount of time to sort\n\t\t\t * the entries.\n\t\t\t *  @type boolean\n\t\t\t *  @default false\n\t\t\t *\n\t\t\t *  @dtopt Features\n\t\t\t *  @name DataTable.defaults.processing\n\t\t\t *\n\t\t\t *  @example\n\t\t\t *    $(document).ready( function () {\n\t\t\t *      $('#example').dataTable( {\n\t\t\t *        \"processing\": true\n\t\t\t *      } );\n\t\t\t *    } );\n\t\t\t */\n\t\t\t\"bProcessing\": false,\n\t\t\n\t\t\n\t\t\t/**\n\t\t\t * Retrieve the DataTables object for the given selector. Note that if the\n\t\t\t * table has already been initialised, this parameter will cause DataTables\n\t\t\t * to simply return the object that has already been set up - it will not take\n\t\t\t * account of any changes you might have made to the initialisation object\n\t\t\t * passed to DataTables (setting this parameter to true is an acknowledgement\n\t\t\t * that you understand this). `destroy` can be used to reinitialise a table if\n\t\t\t * you need.\n\t\t\t *  @type boolean\n\t\t\t *  @default false\n\t\t\t *\n\t\t\t *  @dtopt Options\n\t\t\t *  @name DataTable.defaults.retrieve\n\t\t\t *\n\t\t\t *  @example\n\t\t\t *    $(document).ready( function() {\n\t\t\t *      initTable();\n\t\t\t *      tableActions();\n\t\t\t *    } );\n\t\t\t *\n\t\t\t *    function initTable ()\n\t\t\t *    {\n\t\t\t *      return $('#example').dataTable( {\n\t\t\t *        \"scrollY\": \"200px\",\n\t\t\t *        \"paginate\": false,\n\t\t\t *        \"retrieve\": true\n\t\t\t *      } );\n\t\t\t *    }\n\t\t\t *\n\t\t\t *    function tableActions ()\n\t\t\t *    {\n\t\t\t *      var table = initTable();\n\t\t\t *      // perform API operations with oTable\n\t\t\t *    }\n\t\t\t */\n\t\t\t\"bRetrieve\": false,\n\t\t\n\t\t\n\t\t\t/**\n\t\t\t * When vertical (y) scrolling is enabled, DataTables will force the height of\n\t\t\t * the table's viewport to the given height at all times (useful for layout).\n\t\t\t * However, this can look odd when filtering data down to a small data set,\n\t\t\t * and the footer is left \"floating\" further down. This parameter (when\n\t\t\t * enabled) will cause DataTables to collapse the table's viewport down when\n\t\t\t * the result set will fit within the given Y height.\n\t\t\t *  @type boolean\n\t\t\t *  @default false\n\t\t\t *\n\t\t\t *  @dtopt Options\n\t\t\t *  @name DataTable.defaults.scrollCollapse\n\t\t\t *\n\t\t\t *  @example\n\t\t\t *    $(document).ready( function() {\n\t\t\t *      $('#example').dataTable( {\n\t\t\t *        \"scrollY\": \"200\",\n\t\t\t *        \"scrollCollapse\": true\n\t\t\t *      } );\n\t\t\t *    } );\n\t\t\t */\n\t\t\t\"bScrollCollapse\": false,\n\t\t\n\t\t\n\t\t\t/**\n\t\t\t * Configure DataTables to use server-side processing. Note that the\n\t\t\t * `ajax` parameter must also be given in order to give DataTables a\n\t\t\t * source to obtain the required data for each draw.\n\t\t\t *  @type boolean\n\t\t\t *  @default false\n\t\t\t *\n\t\t\t *  @dtopt Features\n\t\t\t *  @dtopt Server-side\n\t\t\t *  @name DataTable.defaults.serverSide\n\t\t\t *\n\t\t\t *  @example\n\t\t\t *    $(document).ready( function () {\n\t\t\t *      $('#example').dataTable( {\n\t\t\t *        \"serverSide\": true,\n\t\t\t *        \"ajax\": \"xhr.php\"\n\t\t\t *      } );\n\t\t\t *    } );\n\t\t\t */\n\t\t\t\"bServerSide\": false,\n\t\t\n\t\t\n\t\t\t/**\n\t\t\t * Enable or disable sorting of columns. Sorting of individual columns can be\n\t\t\t * disabled by the `sortable` option for each column.\n\t\t\t *  @type boolean\n\t\t\t *  @default true\n\t\t\t *\n\t\t\t *  @dtopt Features\n\t\t\t *  @name DataTable.defaults.ordering\n\t\t\t *\n\t\t\t *  @example\n\t\t\t *    $(document).ready( function () {\n\t\t\t *      $('#example').dataTable( {\n\t\t\t *        \"ordering\": false\n\t\t\t *      } );\n\t\t\t *    } );\n\t\t\t */\n\t\t\t\"bSort\": true,\n\t\t\n\t\t\n\t\t\t/**\n\t\t\t * Enable or display DataTables' ability to sort multiple columns at the\n\t\t\t * same time (activated by shift-click by the user).\n\t\t\t *  @type boolean\n\t\t\t *  @default true\n\t\t\t *\n\t\t\t *  @dtopt Options\n\t\t\t *  @name DataTable.defaults.orderMulti\n\t\t\t *\n\t\t\t *  @example\n\t\t\t *    // Disable multiple column sorting ability\n\t\t\t *    $(document).ready( function () {\n\t\t\t *      $('#example').dataTable( {\n\t\t\t *        \"orderMulti\": false\n\t\t\t *      } );\n\t\t\t *    } );\n\t\t\t */\n\t\t\t\"bSortMulti\": true,\n\t\t\n\t\t\n\t\t\t/**\n\t\t\t * Allows control over whether DataTables should use the top (true) unique\n\t\t\t * cell that is found for a single column, or the bottom (false - default).\n\t\t\t * This is useful when using complex headers.\n\t\t\t *  @type boolean\n\t\t\t *  @default false\n\t\t\t *\n\t\t\t *  @dtopt Options\n\t\t\t *  @name DataTable.defaults.orderCellsTop\n\t\t\t *\n\t\t\t *  @example\n\t\t\t *    $(document).ready( function() {\n\t\t\t *      $('#example').dataTable( {\n\t\t\t *        \"orderCellsTop\": true\n\t\t\t *      } );\n\t\t\t *    } );\n\t\t\t */\n\t\t\t\"bSortCellsTop\": false,\n\t\t\n\t\t\n\t\t\t/**\n\t\t\t * Enable or disable the addition of the classes `sorting\\_1`, `sorting\\_2` and\n\t\t\t * `sorting\\_3` to the columns which are currently being sorted on. This is\n\t\t\t * presented as a feature switch as it can increase processing time (while\n\t\t\t * classes are removed and added) so for large data sets you might want to\n\t\t\t * turn this off.\n\t\t\t *  @type boolean\n\t\t\t *  @default true\n\t\t\t *\n\t\t\t *  @dtopt Features\n\t\t\t *  @name DataTable.defaults.orderClasses\n\t\t\t *\n\t\t\t *  @example\n\t\t\t *    $(document).ready( function () {\n\t\t\t *      $('#example').dataTable( {\n\t\t\t *        \"orderClasses\": false\n\t\t\t *      } );\n\t\t\t *    } );\n\t\t\t */\n\t\t\t\"bSortClasses\": true,\n\t\t\n\t\t\n\t\t\t/**\n\t\t\t * Enable or disable state saving. When enabled HTML5 `localStorage` will be\n\t\t\t * used to save table display information such as pagination information,\n\t\t\t * display length, filtering and sorting. As such when the end user reloads\n\t\t\t * the page the display display will match what thy had previously set up.\n\t\t\t *\n\t\t\t * Due to the use of `localStorage` the default state saving is not supported\n\t\t\t * in IE6 or 7. If state saving is required in those browsers, use\n\t\t\t * `stateSaveCallback` to provide a storage solution such as cookies.\n\t\t\t *  @type boolean\n\t\t\t *  @default false\n\t\t\t *\n\t\t\t *  @dtopt Features\n\t\t\t *  @name DataTable.defaults.stateSave\n\t\t\t *\n\t\t\t *  @example\n\t\t\t *    $(document).ready( function () {\n\t\t\t *      $('#example').dataTable( {\n\t\t\t *        \"stateSave\": true\n\t\t\t *      } );\n\t\t\t *    } );\n\t\t\t */\n\t\t\t\"bStateSave\": false,\n\t\t\n\t\t\n\t\t\t/**\n\t\t\t * This function is called when a TR element is created (and all TD child\n\t\t\t * elements have been inserted), or registered if using a DOM source, allowing\n\t\t\t * manipulation of the TR element (adding classes etc).\n\t\t\t *  @type function\n\t\t\t *  @param {node} row \"TR\" element for the current row\n\t\t\t *  @param {array} data Raw data array for this row\n\t\t\t *  @param {int} dataIndex The index of this row in the internal aoData array\n\t\t\t *\n\t\t\t *  @dtopt Callbacks\n\t\t\t *  @name DataTable.defaults.createdRow\n\t\t\t *\n\t\t\t *  @example\n\t\t\t *    $(document).ready( function() {\n\t\t\t *      $('#example').dataTable( {\n\t\t\t *        \"createdRow\": function( row, data, dataIndex ) {\n\t\t\t *          // Bold the grade for all 'A' grade browsers\n\t\t\t *          if ( data[4] == \"A\" )\n\t\t\t *          {\n\t\t\t *            $('td:eq(4)', row).html( '<b>A</b>' );\n\t\t\t *          }\n\t\t\t *        }\n\t\t\t *      } );\n\t\t\t *    } );\n\t\t\t */\n\t\t\t\"fnCreatedRow\": null,\n\t\t\n\t\t\n\t\t\t/**\n\t\t\t * This function is called on every 'draw' event, and allows you to\n\t\t\t * dynamically modify any aspect you want about the created DOM.\n\t\t\t *  @type function\n\t\t\t *  @param {object} settings DataTables settings object\n\t\t\t *\n\t\t\t *  @dtopt Callbacks\n\t\t\t *  @name DataTable.defaults.drawCallback\n\t\t\t *\n\t\t\t *  @example\n\t\t\t *    $(document).ready( function() {\n\t\t\t *      $('#example').dataTable( {\n\t\t\t *        \"drawCallback\": function( settings ) {\n\t\t\t *          alert( 'DataTables has redrawn the table' );\n\t\t\t *        }\n\t\t\t *      } );\n\t\t\t *    } );\n\t\t\t */\n\t\t\t\"fnDrawCallback\": null,\n\t\t\n\t\t\n\t\t\t/**\n\t\t\t * Identical to fnHeaderCallback() but for the table footer this function\n\t\t\t * allows you to modify the table footer on every 'draw' event.\n\t\t\t *  @type function\n\t\t\t *  @param {node} foot \"TR\" element for the footer\n\t\t\t *  @param {array} data Full table data (as derived from the original HTML)\n\t\t\t *  @param {int} start Index for the current display starting point in the\n\t\t\t *    display array\n\t\t\t *  @param {int} end Index for the current display ending point in the\n\t\t\t *    display array\n\t\t\t *  @param {array int} display Index array to translate the visual position\n\t\t\t *    to the full data array\n\t\t\t *\n\t\t\t *  @dtopt Callbacks\n\t\t\t *  @name DataTable.defaults.footerCallback\n\t\t\t *\n\t\t\t *  @example\n\t\t\t *    $(document).ready( function() {\n\t\t\t *      $('#example').dataTable( {\n\t\t\t *        \"footerCallback\": function( tfoot, data, start, end, display ) {\n\t\t\t *          tfoot.getElementsByTagName('th')[0].innerHTML = \"Starting index is \"+start;\n\t\t\t *        }\n\t\t\t *      } );\n\t\t\t *    } )\n\t\t\t */\n\t\t\t\"fnFooterCallback\": null,\n\t\t\n\t\t\n\t\t\t/**\n\t\t\t * When rendering large numbers in the information element for the table\n\t\t\t * (i.e. \"Showing 1 to 10 of 57 entries\") DataTables will render large numbers\n\t\t\t * to have a comma separator for the 'thousands' units (e.g. 1 million is\n\t\t\t * rendered as \"1,000,000\") to help readability for the end user. This\n\t\t\t * function will override the default method DataTables uses.\n\t\t\t *  @type function\n\t\t\t *  @member\n\t\t\t *  @param {int} toFormat number to be formatted\n\t\t\t *  @returns {string} formatted string for DataTables to show the number\n\t\t\t *\n\t\t\t *  @dtopt Callbacks\n\t\t\t *  @name DataTable.defaults.formatNumber\n\t\t\t *\n\t\t\t *  @example\n\t\t\t *    // Format a number using a single quote for the separator (note that\n\t\t\t *    // this can also be done with the language.thousands option)\n\t\t\t *    $(document).ready( function() {\n\t\t\t *      $('#example').dataTable( {\n\t\t\t *        \"formatNumber\": function ( toFormat ) {\n\t\t\t *          return toFormat.toString().replace(\n\t\t\t *            /\\B(?=(\\d{3})+(?!\\d))/g, \"'\"\n\t\t\t *          );\n\t\t\t *        };\n\t\t\t *      } );\n\t\t\t *    } );\n\t\t\t */\n\t\t\t\"fnFormatNumber\": function ( toFormat ) {\n\t\t\t\treturn toFormat.toString().replace(\n\t\t\t\t\t/\\B(?=(\\d{3})+(?!\\d))/g,\n\t\t\t\t\tthis.oLanguage.sThousands\n\t\t\t\t);\n\t\t\t},\n\t\t\n\t\t\n\t\t\t/**\n\t\t\t * This function is called on every 'draw' event, and allows you to\n\t\t\t * dynamically modify the header row. This can be used to calculate and\n\t\t\t * display useful information about the table.\n\t\t\t *  @type function\n\t\t\t *  @param {node} head \"TR\" element for the header\n\t\t\t *  @param {array} data Full table data (as derived from the original HTML)\n\t\t\t *  @param {int} start Index for the current display starting point in the\n\t\t\t *    display array\n\t\t\t *  @param {int} end Index for the current display ending point in the\n\t\t\t *    display array\n\t\t\t *  @param {array int} display Index array to translate the visual position\n\t\t\t *    to the full data array\n\t\t\t *\n\t\t\t *  @dtopt Callbacks\n\t\t\t *  @name DataTable.defaults.headerCallback\n\t\t\t *\n\t\t\t *  @example\n\t\t\t *    $(document).ready( function() {\n\t\t\t *      $('#example').dataTable( {\n\t\t\t *        \"fheaderCallback\": function( head, data, start, end, display ) {\n\t\t\t *          head.getElementsByTagName('th')[0].innerHTML = \"Displaying \"+(end-start)+\" records\";\n\t\t\t *        }\n\t\t\t *      } );\n\t\t\t *    } )\n\t\t\t */\n\t\t\t\"fnHeaderCallback\": null,\n\t\t\n\t\t\n\t\t\t/**\n\t\t\t * The information element can be used to convey information about the current\n\t\t\t * state of the table. Although the internationalisation options presented by\n\t\t\t * DataTables are quite capable of dealing with most customisations, there may\n\t\t\t * be times where you wish to customise the string further. This callback\n\t\t\t * allows you to do exactly that.\n\t\t\t *  @type function\n\t\t\t *  @param {object} oSettings DataTables settings object\n\t\t\t *  @param {int} start Starting position in data for the draw\n\t\t\t *  @param {int} end End position in data for the draw\n\t\t\t *  @param {int} max Total number of rows in the table (regardless of\n\t\t\t *    filtering)\n\t\t\t *  @param {int} total Total number of rows in the data set, after filtering\n\t\t\t *  @param {string} pre The string that DataTables has formatted using it's\n\t\t\t *    own rules\n\t\t\t *  @returns {string} The string to be displayed in the information element.\n\t\t\t *\n\t\t\t *  @dtopt Callbacks\n\t\t\t *  @name DataTable.defaults.infoCallback\n\t\t\t *\n\t\t\t *  @example\n\t\t\t *    $('#example').dataTable( {\n\t\t\t *      \"infoCallback\": function( settings, start, end, max, total, pre ) {\n\t\t\t *        return start +\" to \"+ end;\n\t\t\t *      }\n\t\t\t *    } );\n\t\t\t */\n\t\t\t\"fnInfoCallback\": null,\n\t\t\n\t\t\n\t\t\t/**\n\t\t\t * Called when the table has been initialised. Normally DataTables will\n\t\t\t * initialise sequentially and there will be no need for this function,\n\t\t\t * however, this does not hold true when using external language information\n\t\t\t * since that is obtained using an async XHR call.\n\t\t\t *  @type function\n\t\t\t *  @param {object} settings DataTables settings object\n\t\t\t *  @param {object} json The JSON object request from the server - only\n\t\t\t *    present if client-side Ajax sourced data is used\n\t\t\t *\n\t\t\t *  @dtopt Callbacks\n\t\t\t *  @name DataTable.defaults.initComplete\n\t\t\t *\n\t\t\t *  @example\n\t\t\t *    $(document).ready( function() {\n\t\t\t *      $('#example').dataTable( {\n\t\t\t *        \"initComplete\": function(settings, json) {\n\t\t\t *          alert( 'DataTables has finished its initialisation.' );\n\t\t\t *        }\n\t\t\t *      } );\n\t\t\t *    } )\n\t\t\t */\n\t\t\t\"fnInitComplete\": null,\n\t\t\n\t\t\n\t\t\t/**\n\t\t\t * Called at the very start of each table draw and can be used to cancel the\n\t\t\t * draw by returning false, any other return (including undefined) results in\n\t\t\t * the full draw occurring).\n\t\t\t *  @type function\n\t\t\t *  @param {object} settings DataTables settings object\n\t\t\t *  @returns {boolean} False will cancel the draw, anything else (including no\n\t\t\t *    return) will allow it to complete.\n\t\t\t *\n\t\t\t *  @dtopt Callbacks\n\t\t\t *  @name DataTable.defaults.preDrawCallback\n\t\t\t *\n\t\t\t *  @example\n\t\t\t *    $(document).ready( function() {\n\t\t\t *      $('#example').dataTable( {\n\t\t\t *        \"preDrawCallback\": function( settings ) {\n\t\t\t *          if ( $('#test').val() == 1 ) {\n\t\t\t *            return false;\n\t\t\t *          }\n\t\t\t *        }\n\t\t\t *      } );\n\t\t\t *    } );\n\t\t\t */\n\t\t\t\"fnPreDrawCallback\": null,\n\t\t\n\t\t\n\t\t\t/**\n\t\t\t * This function allows you to 'post process' each row after it have been\n\t\t\t * generated for each table draw, but before it is rendered on screen. This\n\t\t\t * function might be used for setting the row class name etc.\n\t\t\t *  @type function\n\t\t\t *  @param {node} row \"TR\" element for the current row\n\t\t\t *  @param {array} data Raw data array for this row\n\t\t\t *  @param {int} displayIndex The display index for the current table draw\n\t\t\t *  @param {int} displayIndexFull The index of the data in the full list of\n\t\t\t *    rows (after filtering)\n\t\t\t *\n\t\t\t *  @dtopt Callbacks\n\t\t\t *  @name DataTable.defaults.rowCallback\n\t\t\t *\n\t\t\t *  @example\n\t\t\t *    $(document).ready( function() {\n\t\t\t *      $('#example').dataTable( {\n\t\t\t *        \"rowCallback\": function( row, data, displayIndex, displayIndexFull ) {\n\t\t\t *          // Bold the grade for all 'A' grade browsers\n\t\t\t *          if ( data[4] == \"A\" ) {\n\t\t\t *            $('td:eq(4)', row).html( '<b>A</b>' );\n\t\t\t *          }\n\t\t\t *        }\n\t\t\t *      } );\n\t\t\t *    } );\n\t\t\t */\n\t\t\t\"fnRowCallback\": null,\n\t\t\n\t\t\n\t\t\t/**\n\t\t\t * __Deprecated__ The functionality provided by this parameter has now been\n\t\t\t * superseded by that provided through `ajax`, which should be used instead.\n\t\t\t *\n\t\t\t * This parameter allows you to override the default function which obtains\n\t\t\t * the data from the server so something more suitable for your application.\n\t\t\t * For example you could use POST data, or pull information from a Gears or\n\t\t\t * AIR database.\n\t\t\t *  @type function\n\t\t\t *  @member\n\t\t\t *  @param {string} source HTTP source to obtain the data from (`ajax`)\n\t\t\t *  @param {array} data A key/value pair object containing the data to send\n\t\t\t *    to the server\n\t\t\t *  @param {function} callback to be called on completion of the data get\n\t\t\t *    process that will draw the data on the page.\n\t\t\t *  @param {object} settings DataTables settings object\n\t\t\t *\n\t\t\t *  @dtopt Callbacks\n\t\t\t *  @dtopt Server-side\n\t\t\t *  @name DataTable.defaults.serverData\n\t\t\t *\n\t\t\t *  @deprecated 1.10. Please use `ajax` for this functionality now.\n\t\t\t */\n\t\t\t\"fnServerData\": null,\n\t\t\n\t\t\n\t\t\t/**\n\t\t\t * __Deprecated__ The functionality provided by this parameter has now been\n\t\t\t * superseded by that provided through `ajax`, which should be used instead.\n\t\t\t *\n\t\t\t *  It is often useful to send extra data to the server when making an Ajax\n\t\t\t * request - for example custom filtering information, and this callback\n\t\t\t * function makes it trivial to send extra information to the server. The\n\t\t\t * passed in parameter is the data set that has been constructed by\n\t\t\t * DataTables, and you can add to this or modify it as you require.\n\t\t\t *  @type function\n\t\t\t *  @param {array} data Data array (array of objects which are name/value\n\t\t\t *    pairs) that has been constructed by DataTables and will be sent to the\n\t\t\t *    server. In the case of Ajax sourced data with server-side processing\n\t\t\t *    this will be an empty array, for server-side processing there will be a\n\t\t\t *    significant number of parameters!\n\t\t\t *  @returns {undefined} Ensure that you modify the data array passed in,\n\t\t\t *    as this is passed by reference.\n\t\t\t *\n\t\t\t *  @dtopt Callbacks\n\t\t\t *  @dtopt Server-side\n\t\t\t *  @name DataTable.defaults.serverParams\n\t\t\t *\n\t\t\t *  @deprecated 1.10. Please use `ajax` for this functionality now.\n\t\t\t */\n\t\t\t\"fnServerParams\": null,\n\t\t\n\t\t\n\t\t\t/**\n\t\t\t * Load the table state. With this function you can define from where, and how, the\n\t\t\t * state of a table is loaded. By default DataTables will load from `localStorage`\n\t\t\t * but you might wish to use a server-side database or cookies.\n\t\t\t *  @type function\n\t\t\t *  @member\n\t\t\t *  @param {object} settings DataTables settings object\n\t\t\t *  @param {object} callback Callback that can be executed when done. It\n\t\t\t *    should be passed the loaded state object.\n\t\t\t *  @return {object} The DataTables state object to be loaded\n\t\t\t *\n\t\t\t *  @dtopt Callbacks\n\t\t\t *  @name DataTable.defaults.stateLoadCallback\n\t\t\t *\n\t\t\t *  @example\n\t\t\t *    $(document).ready( function() {\n\t\t\t *      $('#example').dataTable( {\n\t\t\t *        \"stateSave\": true,\n\t\t\t *        \"stateLoadCallback\": function (settings, callback) {\n\t\t\t *          $.ajax( {\n\t\t\t *            \"url\": \"/state_load\",\n\t\t\t *            \"dataType\": \"json\",\n\t\t\t *            \"success\": function (json) {\n\t\t\t *              callback( json );\n\t\t\t *            }\n\t\t\t *          } );\n\t\t\t *        }\n\t\t\t *      } );\n\t\t\t *    } );\n\t\t\t */\n\t\t\t\"fnStateLoadCallback\": function ( settings ) {\n\t\t\t\ttry {\n\t\t\t\t\treturn JSON.parse(\n\t\t\t\t\t\t(settings.iStateDuration === -1 ? sessionStorage : localStorage).getItem(\n\t\t\t\t\t\t\t'DataTables_'+settings.sInstance+'_'+location.pathname\n\t\t\t\t\t\t)\n\t\t\t\t\t);\n\t\t\t\t} catch (e) {\n\t\t\t\t\treturn {};\n\t\t\t\t}\n\t\t\t},\n\t\t\n\t\t\n\t\t\t/**\n\t\t\t * Callback which allows modification of the saved state prior to loading that state.\n\t\t\t * This callback is called when the table is loading state from the stored data, but\n\t\t\t * prior to the settings object being modified by the saved state. Note that for\n\t\t\t * plug-in authors, you should use the `stateLoadParams` event to load parameters for\n\t\t\t * a plug-in.\n\t\t\t *  @type function\n\t\t\t *  @param {object} settings DataTables settings object\n\t\t\t *  @param {object} data The state object that is to be loaded\n\t\t\t *\n\t\t\t *  @dtopt Callbacks\n\t\t\t *  @name DataTable.defaults.stateLoadParams\n\t\t\t *\n\t\t\t *  @example\n\t\t\t *    // Remove a saved filter, so filtering is never loaded\n\t\t\t *    $(document).ready( function() {\n\t\t\t *      $('#example').dataTable( {\n\t\t\t *        \"stateSave\": true,\n\t\t\t *        \"stateLoadParams\": function (settings, data) {\n\t\t\t *          data.oSearch.sSearch = \"\";\n\t\t\t *        }\n\t\t\t *      } );\n\t\t\t *    } );\n\t\t\t *\n\t\t\t *  @example\n\t\t\t *    // Disallow state loading by returning false\n\t\t\t *    $(document).ready( function() {\n\t\t\t *      $('#example').dataTable( {\n\t\t\t *        \"stateSave\": true,\n\t\t\t *        \"stateLoadParams\": function (settings, data) {\n\t\t\t *          return false;\n\t\t\t *        }\n\t\t\t *      } );\n\t\t\t *    } );\n\t\t\t */\n\t\t\t\"fnStateLoadParams\": null,\n\t\t\n\t\t\n\t\t\t/**\n\t\t\t * Callback that is called when the state has been loaded from the state saving method\n\t\t\t * and the DataTables settings object has been modified as a result of the loaded state.\n\t\t\t *  @type function\n\t\t\t *  @param {object} settings DataTables settings object\n\t\t\t *  @param {object} data The state object that was loaded\n\t\t\t *\n\t\t\t *  @dtopt Callbacks\n\t\t\t *  @name DataTable.defaults.stateLoaded\n\t\t\t *\n\t\t\t *  @example\n\t\t\t *    // Show an alert with the filtering value that was saved\n\t\t\t *    $(document).ready( function() {\n\t\t\t *      $('#example').dataTable( {\n\t\t\t *        \"stateSave\": true,\n\t\t\t *        \"stateLoaded\": function (settings, data) {\n\t\t\t *          alert( 'Saved filter was: '+data.oSearch.sSearch );\n\t\t\t *        }\n\t\t\t *      } );\n\t\t\t *    } );\n\t\t\t */\n\t\t\t\"fnStateLoaded\": null,\n\t\t\n\t\t\n\t\t\t/**\n\t\t\t * Save the table state. This function allows you to define where and how the state\n\t\t\t * information for the table is stored By default DataTables will use `localStorage`\n\t\t\t * but you might wish to use a server-side database or cookies.\n\t\t\t *  @type function\n\t\t\t *  @member\n\t\t\t *  @param {object} settings DataTables settings object\n\t\t\t *  @param {object} data The state object to be saved\n\t\t\t *\n\t\t\t *  @dtopt Callbacks\n\t\t\t *  @name DataTable.defaults.stateSaveCallback\n\t\t\t *\n\t\t\t *  @example\n\t\t\t *    $(document).ready( function() {\n\t\t\t *      $('#example').dataTable( {\n\t\t\t *        \"stateSave\": true,\n\t\t\t *        \"stateSaveCallback\": function (settings, data) {\n\t\t\t *          // Send an Ajax request to the server with the state object\n\t\t\t *          $.ajax( {\n\t\t\t *            \"url\": \"/state_save\",\n\t\t\t *            \"data\": data,\n\t\t\t *            \"dataType\": \"json\",\n\t\t\t *            \"method\": \"POST\"\n\t\t\t *            \"success\": function () {}\n\t\t\t *          } );\n\t\t\t *        }\n\t\t\t *      } );\n\t\t\t *    } );\n\t\t\t */\n\t\t\t\"fnStateSaveCallback\": function ( settings, data ) {\n\t\t\t\ttry {\n\t\t\t\t\t(settings.iStateDuration === -1 ? sessionStorage : localStorage).setItem(\n\t\t\t\t\t\t'DataTables_'+settings.sInstance+'_'+location.pathname,\n\t\t\t\t\t\tJSON.stringify( data )\n\t\t\t\t\t);\n\t\t\t\t} catch (e) {}\n\t\t\t},\n\t\t\n\t\t\n\t\t\t/**\n\t\t\t * Callback which allows modification of the state to be saved. Called when the table\n\t\t\t * has changed state a new state save is required. This method allows modification of\n\t\t\t * the state saving object prior to actually doing the save, including addition or\n\t\t\t * other state properties or modification. Note that for plug-in authors, you should\n\t\t\t * use the `stateSaveParams` event to save parameters for a plug-in.\n\t\t\t *  @type function\n\t\t\t *  @param {object} settings DataTables settings object\n\t\t\t *  @param {object} data The state object to be saved\n\t\t\t *\n\t\t\t *  @dtopt Callbacks\n\t\t\t *  @name DataTable.defaults.stateSaveParams\n\t\t\t *\n\t\t\t *  @example\n\t\t\t *    // Remove a saved filter, so filtering is never saved\n\t\t\t *    $(document).ready( function() {\n\t\t\t *      $('#example').dataTable( {\n\t\t\t *        \"stateSave\": true,\n\t\t\t *        \"stateSaveParams\": function (settings, data) {\n\t\t\t *          data.oSearch.sSearch = \"\";\n\t\t\t *        }\n\t\t\t *      } );\n\t\t\t *    } );\n\t\t\t */\n\t\t\t\"fnStateSaveParams\": null,\n\t\t\n\t\t\n\t\t\t/**\n\t\t\t * Duration for which the saved state information is considered valid. After this period\n\t\t\t * has elapsed the state will be returned to the default.\n\t\t\t * Value is given in seconds.\n\t\t\t *  @type int\n\t\t\t *  @default 7200 <i>(2 hours)</i>\n\t\t\t *\n\t\t\t *  @dtopt Options\n\t\t\t *  @name DataTable.defaults.stateDuration\n\t\t\t *\n\t\t\t *  @example\n\t\t\t *    $(document).ready( function() {\n\t\t\t *      $('#example').dataTable( {\n\t\t\t *        \"stateDuration\": 60*60*24; // 1 day\n\t\t\t *      } );\n\t\t\t *    } )\n\t\t\t */\n\t\t\t\"iStateDuration\": 7200,\n\t\t\n\t\t\n\t\t\t/**\n\t\t\t * When enabled DataTables will not make a request to the server for the first\n\t\t\t * page draw - rather it will use the data already on the page (no sorting etc\n\t\t\t * will be applied to it), thus saving on an XHR at load time. `deferLoading`\n\t\t\t * is used to indicate that deferred loading is required, but it is also used\n\t\t\t * to tell DataTables how many records there are in the full table (allowing\n\t\t\t * the information element and pagination to be displayed correctly). In the case\n\t\t\t * where a filtering is applied to the table on initial load, this can be\n\t\t\t * indicated by giving the parameter as an array, where the first element is\n\t\t\t * the number of records available after filtering and the second element is the\n\t\t\t * number of records without filtering (allowing the table information element\n\t\t\t * to be shown correctly).\n\t\t\t *  @type int | array\n\t\t\t *  @default null\n\t\t\t *\n\t\t\t *  @dtopt Options\n\t\t\t *  @name DataTable.defaults.deferLoading\n\t\t\t *\n\t\t\t *  @example\n\t\t\t *    // 57 records available in the table, no filtering applied\n\t\t\t *    $(document).ready( function() {\n\t\t\t *      $('#example').dataTable( {\n\t\t\t *        \"serverSide\": true,\n\t\t\t *        \"ajax\": \"scripts/server_processing.php\",\n\t\t\t *        \"deferLoading\": 57\n\t\t\t *      } );\n\t\t\t *    } );\n\t\t\t *\n\t\t\t *  @example\n\t\t\t *    // 57 records after filtering, 100 without filtering (an initial filter applied)\n\t\t\t *    $(document).ready( function() {\n\t\t\t *      $('#example').dataTable( {\n\t\t\t *        \"serverSide\": true,\n\t\t\t *        \"ajax\": \"scripts/server_processing.php\",\n\t\t\t *        \"deferLoading\": [ 57, 100 ],\n\t\t\t *        \"search\": {\n\t\t\t *          \"search\": \"my_filter\"\n\t\t\t *        }\n\t\t\t *      } );\n\t\t\t *    } );\n\t\t\t */\n\t\t\t\"iDeferLoading\": null,\n\t\t\n\t\t\n\t\t\t/**\n\t\t\t * Number of rows to display on a single page when using pagination. If\n\t\t\t * feature enabled (`lengthChange`) then the end user will be able to override\n\t\t\t * this to a custom setting using a pop-up menu.\n\t\t\t *  @type int\n\t\t\t *  @default 10\n\t\t\t *\n\t\t\t *  @dtopt Options\n\t\t\t *  @name DataTable.defaults.pageLength\n\t\t\t *\n\t\t\t *  @example\n\t\t\t *    $(document).ready( function() {\n\t\t\t *      $('#example').dataTable( {\n\t\t\t *        \"pageLength\": 50\n\t\t\t *      } );\n\t\t\t *    } )\n\t\t\t */\n\t\t\t\"iDisplayLength\": 10,\n\t\t\n\t\t\n\t\t\t/**\n\t\t\t * Define the starting point for data display when using DataTables with\n\t\t\t * pagination. Note that this parameter is the number of records, rather than\n\t\t\t * the page number, so if you have 10 records per page and want to start on\n\t\t\t * the third page, it should be \"20\".\n\t\t\t *  @type int\n\t\t\t *  @default 0\n\t\t\t *\n\t\t\t *  @dtopt Options\n\t\t\t *  @name DataTable.defaults.displayStart\n\t\t\t *\n\t\t\t *  @example\n\t\t\t *    $(document).ready( function() {\n\t\t\t *      $('#example').dataTable( {\n\t\t\t *        \"displayStart\": 20\n\t\t\t *      } );\n\t\t\t *    } )\n\t\t\t */\n\t\t\t\"iDisplayStart\": 0,\n\t\t\n\t\t\n\t\t\t/**\n\t\t\t * By default DataTables allows keyboard navigation of the table (sorting, paging,\n\t\t\t * and filtering) by adding a `tabindex` attribute to the required elements. This\n\t\t\t * allows you to tab through the controls and press the enter key to activate them.\n\t\t\t * The tabindex is default 0, meaning that the tab follows the flow of the document.\n\t\t\t * You can overrule this using this parameter if you wish. Use a value of -1 to\n\t\t\t * disable built-in keyboard navigation.\n\t\t\t *  @type int\n\t\t\t *  @default 0\n\t\t\t *\n\t\t\t *  @dtopt Options\n\t\t\t *  @name DataTable.defaults.tabIndex\n\t\t\t *\n\t\t\t *  @example\n\t\t\t *    $(document).ready( function() {\n\t\t\t *      $('#example').dataTable( {\n\t\t\t *        \"tabIndex\": 1\n\t\t\t *      } );\n\t\t\t *    } );\n\t\t\t */\n\t\t\t\"iTabIndex\": 0,\n\t\t\n\t\t\n\t\t\t/**\n\t\t\t * Classes that DataTables assigns to the various components and features\n\t\t\t * that it adds to the HTML table. This allows classes to be configured\n\t\t\t * during initialisation in addition to through the static\n\t\t\t * {@link DataTable.ext.oStdClasses} object).\n\t\t\t *  @namespace\n\t\t\t *  @name DataTable.defaults.classes\n\t\t\t */\n\t\t\t\"oClasses\": {},\n\t\t\n\t\t\n\t\t\t/**\n\t\t\t * All strings that DataTables uses in the user interface that it creates\n\t\t\t * are defined in this object, allowing you to modified them individually or\n\t\t\t * completely replace them all as required.\n\t\t\t *  @namespace\n\t\t\t *  @name DataTable.defaults.language\n\t\t\t */\n\t\t\t\"oLanguage\": {\n\t\t\t\t/**\n\t\t\t\t * Strings that are used for WAI-ARIA labels and controls only (these are not\n\t\t\t\t * actually visible on the page, but will be read by screenreaders, and thus\n\t\t\t\t * must be internationalised as well).\n\t\t\t\t *  @namespace\n\t\t\t\t *  @name DataTable.defaults.language.aria\n\t\t\t\t */\n\t\t\t\t\"oAria\": {\n\t\t\t\t\t/**\n\t\t\t\t\t * ARIA label that is added to the table headers when the column may be\n\t\t\t\t\t * sorted ascending by activing the column (click or return when focused).\n\t\t\t\t\t * Note that the column header is prefixed to this string.\n\t\t\t\t\t *  @type string\n\t\t\t\t\t *  @default : activate to sort column ascending\n\t\t\t\t\t *\n\t\t\t\t\t *  @dtopt Language\n\t\t\t\t\t *  @name DataTable.defaults.language.aria.sortAscending\n\t\t\t\t\t *\n\t\t\t\t\t *  @example\n\t\t\t\t\t *    $(document).ready( function() {\n\t\t\t\t\t *      $('#example').dataTable( {\n\t\t\t\t\t *        \"language\": {\n\t\t\t\t\t *          \"aria\": {\n\t\t\t\t\t *            \"sortAscending\": \" - click/return to sort ascending\"\n\t\t\t\t\t *          }\n\t\t\t\t\t *        }\n\t\t\t\t\t *      } );\n\t\t\t\t\t *    } );\n\t\t\t\t\t */\n\t\t\t\t\t\"sSortAscending\": \": activate to sort column ascending\",\n\t\t\n\t\t\t\t\t/**\n\t\t\t\t\t * ARIA label that is added to the table headers when the column may be\n\t\t\t\t\t * sorted descending by activing the column (click or return when focused).\n\t\t\t\t\t * Note that the column header is prefixed to this string.\n\t\t\t\t\t *  @type string\n\t\t\t\t\t *  @default : activate to sort column ascending\n\t\t\t\t\t *\n\t\t\t\t\t *  @dtopt Language\n\t\t\t\t\t *  @name DataTable.defaults.language.aria.sortDescending\n\t\t\t\t\t *\n\t\t\t\t\t *  @example\n\t\t\t\t\t *    $(document).ready( function() {\n\t\t\t\t\t *      $('#example').dataTable( {\n\t\t\t\t\t *        \"language\": {\n\t\t\t\t\t *          \"aria\": {\n\t\t\t\t\t *            \"sortDescending\": \" - click/return to sort descending\"\n\t\t\t\t\t *          }\n\t\t\t\t\t *        }\n\t\t\t\t\t *      } );\n\t\t\t\t\t *    } );\n\t\t\t\t\t */\n\t\t\t\t\t\"sSortDescending\": \": activate to sort column descending\"\n\t\t\t\t},\n\t\t\n\t\t\t\t/**\n\t\t\t\t * Pagination string used by DataTables for the built-in pagination\n\t\t\t\t * control types.\n\t\t\t\t *  @namespace\n\t\t\t\t *  @name DataTable.defaults.language.paginate\n\t\t\t\t */\n\t\t\t\t\"oPaginate\": {\n\t\t\t\t\t/**\n\t\t\t\t\t * Text to use when using the 'full_numbers' type of pagination for the\n\t\t\t\t\t * button to take the user to the first page.\n\t\t\t\t\t *  @type string\n\t\t\t\t\t *  @default First\n\t\t\t\t\t *\n\t\t\t\t\t *  @dtopt Language\n\t\t\t\t\t *  @name DataTable.defaults.language.paginate.first\n\t\t\t\t\t *\n\t\t\t\t\t *  @example\n\t\t\t\t\t *    $(document).ready( function() {\n\t\t\t\t\t *      $('#example').dataTable( {\n\t\t\t\t\t *        \"language\": {\n\t\t\t\t\t *          \"paginate\": {\n\t\t\t\t\t *            \"first\": \"First page\"\n\t\t\t\t\t *          }\n\t\t\t\t\t *        }\n\t\t\t\t\t *      } );\n\t\t\t\t\t *    } );\n\t\t\t\t\t */\n\t\t\t\t\t\"sFirst\": \"First\",\n\t\t\n\t\t\n\t\t\t\t\t/**\n\t\t\t\t\t * Text to use when using the 'full_numbers' type of pagination for the\n\t\t\t\t\t * button to take the user to the last page.\n\t\t\t\t\t *  @type string\n\t\t\t\t\t *  @default Last\n\t\t\t\t\t *\n\t\t\t\t\t *  @dtopt Language\n\t\t\t\t\t *  @name DataTable.defaults.language.paginate.last\n\t\t\t\t\t *\n\t\t\t\t\t *  @example\n\t\t\t\t\t *    $(document).ready( function() {\n\t\t\t\t\t *      $('#example').dataTable( {\n\t\t\t\t\t *        \"language\": {\n\t\t\t\t\t *          \"paginate\": {\n\t\t\t\t\t *            \"last\": \"Last page\"\n\t\t\t\t\t *          }\n\t\t\t\t\t *        }\n\t\t\t\t\t *      } );\n\t\t\t\t\t *    } );\n\t\t\t\t\t */\n\t\t\t\t\t\"sLast\": \"Last\",\n\t\t\n\t\t\n\t\t\t\t\t/**\n\t\t\t\t\t * Text to use for the 'next' pagination button (to take the user to the\n\t\t\t\t\t * next page).\n\t\t\t\t\t *  @type string\n\t\t\t\t\t *  @default Next\n\t\t\t\t\t *\n\t\t\t\t\t *  @dtopt Language\n\t\t\t\t\t *  @name DataTable.defaults.language.paginate.next\n\t\t\t\t\t *\n\t\t\t\t\t *  @example\n\t\t\t\t\t *    $(document).ready( function() {\n\t\t\t\t\t *      $('#example').dataTable( {\n\t\t\t\t\t *        \"language\": {\n\t\t\t\t\t *          \"paginate\": {\n\t\t\t\t\t *            \"next\": \"Next page\"\n\t\t\t\t\t *          }\n\t\t\t\t\t *        }\n\t\t\t\t\t *      } );\n\t\t\t\t\t *    } );\n\t\t\t\t\t */\n\t\t\t\t\t\"sNext\": \"Next\",\n\t\t\n\t\t\n\t\t\t\t\t/**\n\t\t\t\t\t * Text to use for the 'previous' pagination button (to take the user to\n\t\t\t\t\t * the previous page).\n\t\t\t\t\t *  @type string\n\t\t\t\t\t *  @default Previous\n\t\t\t\t\t *\n\t\t\t\t\t *  @dtopt Language\n\t\t\t\t\t *  @name DataTable.defaults.language.paginate.previous\n\t\t\t\t\t *\n\t\t\t\t\t *  @example\n\t\t\t\t\t *    $(document).ready( function() {\n\t\t\t\t\t *      $('#example').dataTable( {\n\t\t\t\t\t *        \"language\": {\n\t\t\t\t\t *          \"paginate\": {\n\t\t\t\t\t *            \"previous\": \"Previous page\"\n\t\t\t\t\t *          }\n\t\t\t\t\t *        }\n\t\t\t\t\t *      } );\n\t\t\t\t\t *    } );\n\t\t\t\t\t */\n\t\t\t\t\t\"sPrevious\": \"Previous\"\n\t\t\t\t},\n\t\t\n\t\t\t\t/**\n\t\t\t\t * This string is shown in preference to `zeroRecords` when the table is\n\t\t\t\t * empty of data (regardless of filtering). Note that this is an optional\n\t\t\t\t * parameter - if it is not given, the value of `zeroRecords` will be used\n\t\t\t\t * instead (either the default or given value).\n\t\t\t\t *  @type string\n\t\t\t\t *  @default No data available in table\n\t\t\t\t *\n\t\t\t\t *  @dtopt Language\n\t\t\t\t *  @name DataTable.defaults.language.emptyTable\n\t\t\t\t *\n\t\t\t\t *  @example\n\t\t\t\t *    $(document).ready( function() {\n\t\t\t\t *      $('#example').dataTable( {\n\t\t\t\t *        \"language\": {\n\t\t\t\t *          \"emptyTable\": \"No data available in table\"\n\t\t\t\t *        }\n\t\t\t\t *      } );\n\t\t\t\t *    } );\n\t\t\t\t */\n\t\t\t\t\"sEmptyTable\": \"No data available in table\",\n\t\t\n\t\t\n\t\t\t\t/**\n\t\t\t\t * This string gives information to the end user about the information\n\t\t\t\t * that is current on display on the page. The following tokens can be\n\t\t\t\t * used in the string and will be dynamically replaced as the table\n\t\t\t\t * display updates. This tokens can be placed anywhere in the string, or\n\t\t\t\t * removed as needed by the language requires:\n\t\t\t\t *\n\t\t\t\t * * `\\_START\\_` - Display index of the first record on the current page\n\t\t\t\t * * `\\_END\\_` - Display index of the last record on the current page\n\t\t\t\t * * `\\_TOTAL\\_` - Number of records in the table after filtering\n\t\t\t\t * * `\\_MAX\\_` - Number of records in the table without filtering\n\t\t\t\t * * `\\_PAGE\\_` - Current page number\n\t\t\t\t * * `\\_PAGES\\_` - Total number of pages of data in the table\n\t\t\t\t *\n\t\t\t\t *  @type string\n\t\t\t\t *  @default Showing _START_ to _END_ of _TOTAL_ entries\n\t\t\t\t *\n\t\t\t\t *  @dtopt Language\n\t\t\t\t *  @name DataTable.defaults.language.info\n\t\t\t\t *\n\t\t\t\t *  @example\n\t\t\t\t *    $(document).ready( function() {\n\t\t\t\t *      $('#example').dataTable( {\n\t\t\t\t *        \"language\": {\n\t\t\t\t *          \"info\": \"Showing page _PAGE_ of _PAGES_\"\n\t\t\t\t *        }\n\t\t\t\t *      } );\n\t\t\t\t *    } );\n\t\t\t\t */\n\t\t\t\t\"sInfo\": \"Showing _START_ to _END_ of _TOTAL_ entries\",\n\t\t\n\t\t\n\t\t\t\t/**\n\t\t\t\t * Display information string for when the table is empty. Typically the\n\t\t\t\t * format of this string should match `info`.\n\t\t\t\t *  @type string\n\t\t\t\t *  @default Showing 0 to 0 of 0 entries\n\t\t\t\t *\n\t\t\t\t *  @dtopt Language\n\t\t\t\t *  @name DataTable.defaults.language.infoEmpty\n\t\t\t\t *\n\t\t\t\t *  @example\n\t\t\t\t *    $(document).ready( function() {\n\t\t\t\t *      $('#example').dataTable( {\n\t\t\t\t *        \"language\": {\n\t\t\t\t *          \"infoEmpty\": \"No entries to show\"\n\t\t\t\t *        }\n\t\t\t\t *      } );\n\t\t\t\t *    } );\n\t\t\t\t */\n\t\t\t\t\"sInfoEmpty\": \"Showing 0 to 0 of 0 entries\",\n\t\t\n\t\t\n\t\t\t\t/**\n\t\t\t\t * When a user filters the information in a table, this string is appended\n\t\t\t\t * to the information (`info`) to give an idea of how strong the filtering\n\t\t\t\t * is. The variable _MAX_ is dynamically updated.\n\t\t\t\t *  @type string\n\t\t\t\t *  @default (filtered from _MAX_ total entries)\n\t\t\t\t *\n\t\t\t\t *  @dtopt Language\n\t\t\t\t *  @name DataTable.defaults.language.infoFiltered\n\t\t\t\t *\n\t\t\t\t *  @example\n\t\t\t\t *    $(document).ready( function() {\n\t\t\t\t *      $('#example').dataTable( {\n\t\t\t\t *        \"language\": {\n\t\t\t\t *          \"infoFiltered\": \" - filtering from _MAX_ records\"\n\t\t\t\t *        }\n\t\t\t\t *      } );\n\t\t\t\t *    } );\n\t\t\t\t */\n\t\t\t\t\"sInfoFiltered\": \"(filtered from _MAX_ total entries)\",\n\t\t\n\t\t\n\t\t\t\t/**\n\t\t\t\t * If can be useful to append extra information to the info string at times,\n\t\t\t\t * and this variable does exactly that. This information will be appended to\n\t\t\t\t * the `info` (`infoEmpty` and `infoFiltered` in whatever combination they are\n\t\t\t\t * being used) at all times.\n\t\t\t\t *  @type string\n\t\t\t\t *  @default <i>Empty string</i>\n\t\t\t\t *\n\t\t\t\t *  @dtopt Language\n\t\t\t\t *  @name DataTable.defaults.language.infoPostFix\n\t\t\t\t *\n\t\t\t\t *  @example\n\t\t\t\t *    $(document).ready( function() {\n\t\t\t\t *      $('#example').dataTable( {\n\t\t\t\t *        \"language\": {\n\t\t\t\t *          \"infoPostFix\": \"All records shown are derived from real information.\"\n\t\t\t\t *        }\n\t\t\t\t *      } );\n\t\t\t\t *    } );\n\t\t\t\t */\n\t\t\t\t\"sInfoPostFix\": \"\",\n\t\t\n\t\t\n\t\t\t\t/**\n\t\t\t\t * This decimal place operator is a little different from the other\n\t\t\t\t * language options since DataTables doesn't output floating point\n\t\t\t\t * numbers, so it won't ever use this for display of a number. Rather,\n\t\t\t\t * what this parameter does is modify the sort methods of the table so\n\t\t\t\t * that numbers which are in a format which has a character other than\n\t\t\t\t * a period (`.`) as a decimal place will be sorted numerically.\n\t\t\t\t *\n\t\t\t\t * Note that numbers with different decimal places cannot be shown in\n\t\t\t\t * the same table and still be sortable, the table must be consistent.\n\t\t\t\t * However, multiple different tables on the page can use different\n\t\t\t\t * decimal place characters.\n\t\t\t\t *  @type string\n\t\t\t\t *  @default \n\t\t\t\t *\n\t\t\t\t *  @dtopt Language\n\t\t\t\t *  @name DataTable.defaults.language.decimal\n\t\t\t\t *\n\t\t\t\t *  @example\n\t\t\t\t *    $(document).ready( function() {\n\t\t\t\t *      $('#example').dataTable( {\n\t\t\t\t *        \"language\": {\n\t\t\t\t *          \"decimal\": \",\"\n\t\t\t\t *          \"thousands\": \".\"\n\t\t\t\t *        }\n\t\t\t\t *      } );\n\t\t\t\t *    } );\n\t\t\t\t */\n\t\t\t\t\"sDecimal\": \"\",\n\t\t\n\t\t\n\t\t\t\t/**\n\t\t\t\t * DataTables has a build in number formatter (`formatNumber`) which is\n\t\t\t\t * used to format large numbers that are used in the table information.\n\t\t\t\t * By default a comma is used, but this can be trivially changed to any\n\t\t\t\t * character you wish with this parameter.\n\t\t\t\t *  @type string\n\t\t\t\t *  @default ,\n\t\t\t\t *\n\t\t\t\t *  @dtopt Language\n\t\t\t\t *  @name DataTable.defaults.language.thousands\n\t\t\t\t *\n\t\t\t\t *  @example\n\t\t\t\t *    $(document).ready( function() {\n\t\t\t\t *      $('#example').dataTable( {\n\t\t\t\t *        \"language\": {\n\t\t\t\t *          \"thousands\": \"'\"\n\t\t\t\t *        }\n\t\t\t\t *      } );\n\t\t\t\t *    } );\n\t\t\t\t */\n\t\t\t\t\"sThousands\": \",\",\n\t\t\n\t\t\n\t\t\t\t/**\n\t\t\t\t * Detail the action that will be taken when the drop down menu for the\n\t\t\t\t * pagination length option is changed. The '_MENU_' variable is replaced\n\t\t\t\t * with a default select list of 10, 25, 50 and 100, and can be replaced\n\t\t\t\t * with a custom select box if required.\n\t\t\t\t *  @type string\n\t\t\t\t *  @default Show _MENU_ entries\n\t\t\t\t *\n\t\t\t\t *  @dtopt Language\n\t\t\t\t *  @name DataTable.defaults.language.lengthMenu\n\t\t\t\t *\n\t\t\t\t *  @example\n\t\t\t\t *    // Language change only\n\t\t\t\t *    $(document).ready( function() {\n\t\t\t\t *      $('#example').dataTable( {\n\t\t\t\t *        \"language\": {\n\t\t\t\t *          \"lengthMenu\": \"Display _MENU_ records\"\n\t\t\t\t *        }\n\t\t\t\t *      } );\n\t\t\t\t *    } );\n\t\t\t\t *\n\t\t\t\t *  @example\n\t\t\t\t *    // Language and options change\n\t\t\t\t *    $(document).ready( function() {\n\t\t\t\t *      $('#example').dataTable( {\n\t\t\t\t *        \"language\": {\n\t\t\t\t *          \"lengthMenu\": 'Display <select>'+\n\t\t\t\t *            '<option value=\"10\">10</option>'+\n\t\t\t\t *            '<option value=\"20\">20</option>'+\n\t\t\t\t *            '<option value=\"30\">30</option>'+\n\t\t\t\t *            '<option value=\"40\">40</option>'+\n\t\t\t\t *            '<option value=\"50\">50</option>'+\n\t\t\t\t *            '<option value=\"-1\">All</option>'+\n\t\t\t\t *            '</select> records'\n\t\t\t\t *        }\n\t\t\t\t *      } );\n\t\t\t\t *    } );\n\t\t\t\t */\n\t\t\t\t\"sLengthMenu\": \"Show _MENU_ entries\",\n\t\t\n\t\t\n\t\t\t\t/**\n\t\t\t\t * When using Ajax sourced data and during the first draw when DataTables is\n\t\t\t\t * gathering the data, this message is shown in an empty row in the table to\n\t\t\t\t * indicate to the end user the the data is being loaded. Note that this\n\t\t\t\t * parameter is not used when loading data by server-side processing, just\n\t\t\t\t * Ajax sourced data with client-side processing.\n\t\t\t\t *  @type string\n\t\t\t\t *  @default Loading...\n\t\t\t\t *\n\t\t\t\t *  @dtopt Language\n\t\t\t\t *  @name DataTable.defaults.language.loadingRecords\n\t\t\t\t *\n\t\t\t\t *  @example\n\t\t\t\t *    $(document).ready( function() {\n\t\t\t\t *      $('#example').dataTable( {\n\t\t\t\t *        \"language\": {\n\t\t\t\t *          \"loadingRecords\": \"Please wait - loading...\"\n\t\t\t\t *        }\n\t\t\t\t *      } );\n\t\t\t\t *    } );\n\t\t\t\t */\n\t\t\t\t\"sLoadingRecords\": \"Loading...\",\n\t\t\n\t\t\n\t\t\t\t/**\n\t\t\t\t * Text which is displayed when the table is processing a user action\n\t\t\t\t * (usually a sort command or similar).\n\t\t\t\t *  @type string\n\t\t\t\t *  @default Processing...\n\t\t\t\t *\n\t\t\t\t *  @dtopt Language\n\t\t\t\t *  @name DataTable.defaults.language.processing\n\t\t\t\t *\n\t\t\t\t *  @example\n\t\t\t\t *    $(document).ready( function() {\n\t\t\t\t *      $('#example').dataTable( {\n\t\t\t\t *        \"language\": {\n\t\t\t\t *          \"processing\": \"DataTables is currently busy\"\n\t\t\t\t *        }\n\t\t\t\t *      } );\n\t\t\t\t *    } );\n\t\t\t\t */\n\t\t\t\t\"sProcessing\": \"Processing...\",\n\t\t\n\t\t\n\t\t\t\t/**\n\t\t\t\t * Details the actions that will be taken when the user types into the\n\t\t\t\t * filtering input text box. The variable \"_INPUT_\", if used in the string,\n\t\t\t\t * is replaced with the HTML text box for the filtering input allowing\n\t\t\t\t * control over where it appears in the string. If \"_INPUT_\" is not given\n\t\t\t\t * then the input box is appended to the string automatically.\n\t\t\t\t *  @type string\n\t\t\t\t *  @default Search:\n\t\t\t\t *\n\t\t\t\t *  @dtopt Language\n\t\t\t\t *  @name DataTable.defaults.language.search\n\t\t\t\t *\n\t\t\t\t *  @example\n\t\t\t\t *    // Input text box will be appended at the end automatically\n\t\t\t\t *    $(document).ready( function() {\n\t\t\t\t *      $('#example').dataTable( {\n\t\t\t\t *        \"language\": {\n\t\t\t\t *          \"search\": \"Filter records:\"\n\t\t\t\t *        }\n\t\t\t\t *      } );\n\t\t\t\t *    } );\n\t\t\t\t *\n\t\t\t\t *  @example\n\t\t\t\t *    // Specify where the filter should appear\n\t\t\t\t *    $(document).ready( function() {\n\t\t\t\t *      $('#example').dataTable( {\n\t\t\t\t *        \"language\": {\n\t\t\t\t *          \"search\": \"Apply filter _INPUT_ to table\"\n\t\t\t\t *        }\n\t\t\t\t *      } );\n\t\t\t\t *    } );\n\t\t\t\t */\n\t\t\t\t\"sSearch\": \"Search:\",\n\t\t\n\t\t\n\t\t\t\t/**\n\t\t\t\t * Assign a `placeholder` attribute to the search `input` element\n\t\t\t\t *  @type string\n\t\t\t\t *  @default \n\t\t\t\t *\n\t\t\t\t *  @dtopt Language\n\t\t\t\t *  @name DataTable.defaults.language.searchPlaceholder\n\t\t\t\t */\n\t\t\t\t\"sSearchPlaceholder\": \"\",\n\t\t\n\t\t\n\t\t\t\t/**\n\t\t\t\t * All of the language information can be stored in a file on the\n\t\t\t\t * server-side, which DataTables will look up if this parameter is passed.\n\t\t\t\t * It must store the URL of the language file, which is in a JSON format,\n\t\t\t\t * and the object has the same properties as the oLanguage object in the\n\t\t\t\t * initialiser object (i.e. the above parameters). Please refer to one of\n\t\t\t\t * the example language files to see how this works in action.\n\t\t\t\t *  @type string\n\t\t\t\t *  @default <i>Empty string - i.e. disabled</i>\n\t\t\t\t *\n\t\t\t\t *  @dtopt Language\n\t\t\t\t *  @name DataTable.defaults.language.url\n\t\t\t\t *\n\t\t\t\t *  @example\n\t\t\t\t *    $(document).ready( function() {\n\t\t\t\t *      $('#example').dataTable( {\n\t\t\t\t *        \"language\": {\n\t\t\t\t *          \"url\": \"http://www.sprymedia.co.uk/dataTables/lang.txt\"\n\t\t\t\t *        }\n\t\t\t\t *      } );\n\t\t\t\t *    } );\n\t\t\t\t */\n\t\t\t\t\"sUrl\": \"\",\n\t\t\n\t\t\n\t\t\t\t/**\n\t\t\t\t * Text shown inside the table records when the is no information to be\n\t\t\t\t * displayed after filtering. `emptyTable` is shown when there is simply no\n\t\t\t\t * information in the table at all (regardless of filtering).\n\t\t\t\t *  @type string\n\t\t\t\t *  @default No matching records found\n\t\t\t\t *\n\t\t\t\t *  @dtopt Language\n\t\t\t\t *  @name DataTable.defaults.language.zeroRecords\n\t\t\t\t *\n\t\t\t\t *  @example\n\t\t\t\t *    $(document).ready( function() {\n\t\t\t\t *      $('#example').dataTable( {\n\t\t\t\t *        \"language\": {\n\t\t\t\t *          \"zeroRecords\": \"No records to display\"\n\t\t\t\t *        }\n\t\t\t\t *      } );\n\t\t\t\t *    } );\n\t\t\t\t */\n\t\t\t\t\"sZeroRecords\": \"No matching records found\"\n\t\t\t},\n\t\t\n\t\t\n\t\t\t/**\n\t\t\t * This parameter allows you to have define the global filtering state at\n\t\t\t * initialisation time. As an object the `search` parameter must be\n\t\t\t * defined, but all other parameters are optional. When `regex` is true,\n\t\t\t * the search string will be treated as a regular expression, when false\n\t\t\t * (default) it will be treated as a straight string. When `smart`\n\t\t\t * DataTables will use it's smart filtering methods (to word match at\n\t\t\t * any point in the data), when false this will not be done.\n\t\t\t *  @namespace\n\t\t\t *  @extends DataTable.models.oSearch\n\t\t\t *\n\t\t\t *  @dtopt Options\n\t\t\t *  @name DataTable.defaults.search\n\t\t\t *\n\t\t\t *  @example\n\t\t\t *    $(document).ready( function() {\n\t\t\t *      $('#example').dataTable( {\n\t\t\t *        \"search\": {\"search\": \"Initial search\"}\n\t\t\t *      } );\n\t\t\t *    } )\n\t\t\t */\n\t\t\t\"oSearch\": $.extend( {}, DataTable.models.oSearch ),\n\t\t\n\t\t\n\t\t\t/**\n\t\t\t * __Deprecated__ The functionality provided by this parameter has now been\n\t\t\t * superseded by that provided through `ajax`, which should be used instead.\n\t\t\t *\n\t\t\t * By default DataTables will look for the property `data` (or `aaData` for\n\t\t\t * compatibility with DataTables 1.9-) when obtaining data from an Ajax\n\t\t\t * source or for server-side processing - this parameter allows that\n\t\t\t * property to be changed. You can use Javascript dotted object notation to\n\t\t\t * get a data source for multiple levels of nesting.\n\t\t\t *  @type string\n\t\t\t *  @default data\n\t\t\t *\n\t\t\t *  @dtopt Options\n\t\t\t *  @dtopt Server-side\n\t\t\t *  @name DataTable.defaults.ajaxDataProp\n\t\t\t *\n\t\t\t *  @deprecated 1.10. Please use `ajax` for this functionality now.\n\t\t\t */\n\t\t\t\"sAjaxDataProp\": \"data\",\n\t\t\n\t\t\n\t\t\t/**\n\t\t\t * __Deprecated__ The functionality provided by this parameter has now been\n\t\t\t * superseded by that provided through `ajax`, which should be used instead.\n\t\t\t *\n\t\t\t * You can instruct DataTables to load data from an external\n\t\t\t * source using this parameter (use aData if you want to pass data in you\n\t\t\t * already have). Simply provide a url a JSON object can be obtained from.\n\t\t\t *  @type string\n\t\t\t *  @default null\n\t\t\t *\n\t\t\t *  @dtopt Options\n\t\t\t *  @dtopt Server-side\n\t\t\t *  @name DataTable.defaults.ajaxSource\n\t\t\t *\n\t\t\t *  @deprecated 1.10. Please use `ajax` for this functionality now.\n\t\t\t */\n\t\t\t\"sAjaxSource\": null,\n\t\t\n\t\t\n\t\t\t/**\n\t\t\t * This initialisation variable allows you to specify exactly where in the\n\t\t\t * DOM you want DataTables to inject the various controls it adds to the page\n\t\t\t * (for example you might want the pagination controls at the top of the\n\t\t\t * table). DIV elements (with or without a custom class) can also be added to\n\t\t\t * aid styling. The follow syntax is used:\n\t\t\t *   <ul>\n\t\t\t *     <li>The following options are allowed:\n\t\t\t *       <ul>\n\t\t\t *         <li>'l' - Length changing</li>\n\t\t\t *         <li>'f' - Filtering input</li>\n\t\t\t *         <li>'t' - The table!</li>\n\t\t\t *         <li>'i' - Information</li>\n\t\t\t *         <li>'p' - Pagination</li>\n\t\t\t *         <li>'r' - pRocessing</li>\n\t\t\t *       </ul>\n\t\t\t *     </li>\n\t\t\t *     <li>The following constants are allowed:\n\t\t\t *       <ul>\n\t\t\t *         <li>'H' - jQueryUI theme \"header\" classes ('fg-toolbar ui-widget-header ui-corner-tl ui-corner-tr ui-helper-clearfix')</li>\n\t\t\t *         <li>'F' - jQueryUI theme \"footer\" classes ('fg-toolbar ui-widget-header ui-corner-bl ui-corner-br ui-helper-clearfix')</li>\n\t\t\t *       </ul>\n\t\t\t *     </li>\n\t\t\t *     <li>The following syntax is expected:\n\t\t\t *       <ul>\n\t\t\t *         <li>'&lt;' and '&gt;' - div elements</li>\n\t\t\t *         <li>'&lt;\"class\" and '&gt;' - div with a class</li>\n\t\t\t *         <li>'&lt;\"#id\" and '&gt;' - div with an ID</li>\n\t\t\t *       </ul>\n\t\t\t *     </li>\n\t\t\t *     <li>Examples:\n\t\t\t *       <ul>\n\t\t\t *         <li>'&lt;\"wrapper\"flipt&gt;'</li>\n\t\t\t *         <li>'&lt;lf&lt;t&gt;ip&gt;'</li>\n\t\t\t *       </ul>\n\t\t\t *     </li>\n\t\t\t *   </ul>\n\t\t\t *  @type string\n\t\t\t *  @default lfrtip <i>(when `jQueryUI` is false)</i> <b>or</b>\n\t\t\t *    <\"H\"lfr>t<\"F\"ip> <i>(when `jQueryUI` is true)</i>\n\t\t\t *\n\t\t\t *  @dtopt Options\n\t\t\t *  @name DataTable.defaults.dom\n\t\t\t *\n\t\t\t *  @example\n\t\t\t *    $(document).ready( function() {\n\t\t\t *      $('#example').dataTable( {\n\t\t\t *        \"dom\": '&lt;\"top\"i&gt;rt&lt;\"bottom\"flp&gt;&lt;\"clear\"&gt;'\n\t\t\t *      } );\n\t\t\t *    } );\n\t\t\t */\n\t\t\t\"sDom\": \"lfrtip\",\n\t\t\n\t\t\n\t\t\t/**\n\t\t\t * Search delay option. This will throttle full table searches that use the\n\t\t\t * DataTables provided search input element (it does not effect calls to\n\t\t\t * `dt-api search()`, providing a delay before the search is made.\n\t\t\t *  @type integer\n\t\t\t *  @default 0\n\t\t\t *\n\t\t\t *  @dtopt Options\n\t\t\t *  @name DataTable.defaults.searchDelay\n\t\t\t *\n\t\t\t *  @example\n\t\t\t *    $(document).ready( function() {\n\t\t\t *      $('#example').dataTable( {\n\t\t\t *        \"searchDelay\": 200\n\t\t\t *      } );\n\t\t\t *    } )\n\t\t\t */\n\t\t\t\"searchDelay\": null,\n\t\t\n\t\t\n\t\t\t/**\n\t\t\t * DataTables features six different built-in options for the buttons to\n\t\t\t * display for pagination control:\n\t\t\t *\n\t\t\t * * `numbers` - Page number buttons only\n\t\t\t * * `simple` - 'Previous' and 'Next' buttons only\n\t\t\t * * 'simple_numbers` - 'Previous' and 'Next' buttons, plus page numbers\n\t\t\t * * `full` - 'First', 'Previous', 'Next' and 'Last' buttons\n\t\t\t * * `full_numbers` - 'First', 'Previous', 'Next' and 'Last' buttons, plus page numbers\n\t\t\t * * `first_last_numbers` - 'First' and 'Last' buttons, plus page numbers\n\t\t\t *  \n\t\t\t * Further methods can be added using {@link DataTable.ext.oPagination}.\n\t\t\t *  @type string\n\t\t\t *  @default simple_numbers\n\t\t\t *\n\t\t\t *  @dtopt Options\n\t\t\t *  @name DataTable.defaults.pagingType\n\t\t\t *\n\t\t\t *  @example\n\t\t\t *    $(document).ready( function() {\n\t\t\t *      $('#example').dataTable( {\n\t\t\t *        \"pagingType\": \"full_numbers\"\n\t\t\t *      } );\n\t\t\t *    } )\n\t\t\t */\n\t\t\t\"sPaginationType\": \"simple_numbers\",\n\t\t\n\t\t\n\t\t\t/**\n\t\t\t * Enable horizontal scrolling. When a table is too wide to fit into a\n\t\t\t * certain layout, or you have a large number of columns in the table, you\n\t\t\t * can enable x-scrolling to show the table in a viewport, which can be\n\t\t\t * scrolled. This property can be `true` which will allow the table to\n\t\t\t * scroll horizontally when needed, or any CSS unit, or a number (in which\n\t\t\t * case it will be treated as a pixel measurement). Setting as simply `true`\n\t\t\t * is recommended.\n\t\t\t *  @type boolean|string\n\t\t\t *  @default <i>blank string - i.e. disabled</i>\n\t\t\t *\n\t\t\t *  @dtopt Features\n\t\t\t *  @name DataTable.defaults.scrollX\n\t\t\t *\n\t\t\t *  @example\n\t\t\t *    $(document).ready( function() {\n\t\t\t *      $('#example').dataTable( {\n\t\t\t *        \"scrollX\": true,\n\t\t\t *        \"scrollCollapse\": true\n\t\t\t *      } );\n\t\t\t *    } );\n\t\t\t */\n\t\t\t\"sScrollX\": \"\",\n\t\t\n\t\t\n\t\t\t/**\n\t\t\t * This property can be used to force a DataTable to use more width than it\n\t\t\t * might otherwise do when x-scrolling is enabled. For example if you have a\n\t\t\t * table which requires to be well spaced, this parameter is useful for\n\t\t\t * \"over-sizing\" the table, and thus forcing scrolling. This property can by\n\t\t\t * any CSS unit, or a number (in which case it will be treated as a pixel\n\t\t\t * measurement).\n\t\t\t *  @type string\n\t\t\t *  @default <i>blank string - i.e. disabled</i>\n\t\t\t *\n\t\t\t *  @dtopt Options\n\t\t\t *  @name DataTable.defaults.scrollXInner\n\t\t\t *\n\t\t\t *  @example\n\t\t\t *    $(document).ready( function() {\n\t\t\t *      $('#example').dataTable( {\n\t\t\t *        \"scrollX\": \"100%\",\n\t\t\t *        \"scrollXInner\": \"110%\"\n\t\t\t *      } );\n\t\t\t *    } );\n\t\t\t */\n\t\t\t\"sScrollXInner\": \"\",\n\t\t\n\t\t\n\t\t\t/**\n\t\t\t * Enable vertical scrolling. Vertical scrolling will constrain the DataTable\n\t\t\t * to the given height, and enable scrolling for any data which overflows the\n\t\t\t * current viewport. This can be used as an alternative to paging to display\n\t\t\t * a lot of data in a small area (although paging and scrolling can both be\n\t\t\t * enabled at the same time). This property can be any CSS unit, or a number\n\t\t\t * (in which case it will be treated as a pixel measurement).\n\t\t\t *  @type string\n\t\t\t *  @default <i>blank string - i.e. disabled</i>\n\t\t\t *\n\t\t\t *  @dtopt Features\n\t\t\t *  @name DataTable.defaults.scrollY\n\t\t\t *\n\t\t\t *  @example\n\t\t\t *    $(document).ready( function() {\n\t\t\t *      $('#example').dataTable( {\n\t\t\t *        \"scrollY\": \"200px\",\n\t\t\t *        \"paginate\": false\n\t\t\t *      } );\n\t\t\t *    } );\n\t\t\t */\n\t\t\t\"sScrollY\": \"\",\n\t\t\n\t\t\n\t\t\t/**\n\t\t\t * __Deprecated__ The functionality provided by this parameter has now been\n\t\t\t * superseded by that provided through `ajax`, which should be used instead.\n\t\t\t *\n\t\t\t * Set the HTTP method that is used to make the Ajax call for server-side\n\t\t\t * processing or Ajax sourced data.\n\t\t\t *  @type string\n\t\t\t *  @default GET\n\t\t\t *\n\t\t\t *  @dtopt Options\n\t\t\t *  @dtopt Server-side\n\t\t\t *  @name DataTable.defaults.serverMethod\n\t\t\t *\n\t\t\t *  @deprecated 1.10. Please use `ajax` for this functionality now.\n\t\t\t */\n\t\t\t\"sServerMethod\": \"GET\",\n\t\t\n\t\t\n\t\t\t/**\n\t\t\t * DataTables makes use of renderers when displaying HTML elements for\n\t\t\t * a table. These renderers can be added or modified by plug-ins to\n\t\t\t * generate suitable mark-up for a site. For example the Bootstrap\n\t\t\t * integration plug-in for DataTables uses a paging button renderer to\n\t\t\t * display pagination buttons in the mark-up required by Bootstrap.\n\t\t\t *\n\t\t\t * For further information about the renderers available see\n\t\t\t * DataTable.ext.renderer\n\t\t\t *  @type string|object\n\t\t\t *  @default null\n\t\t\t *\n\t\t\t *  @name DataTable.defaults.renderer\n\t\t\t *\n\t\t\t */\n\t\t\t\"renderer\": null,\n\t\t\n\t\t\n\t\t\t/**\n\t\t\t * Set the data property name that DataTables should use to get a row's id\n\t\t\t * to set as the `id` property in the node.\n\t\t\t *  @type string\n\t\t\t *  @default DT_RowId\n\t\t\t *\n\t\t\t *  @name DataTable.defaults.rowId\n\t\t\t */\n\t\t\t\"rowId\": \"DT_RowId\"\n\t\t};\n\t\t\n\t\t_fnHungarianMap( DataTable.defaults );\n\t\t\n\t\t\n\t\t\n\t\t/*\n\t\t * Developer note - See note in model.defaults.js about the use of Hungarian\n\t\t * notation and camel case.\n\t\t */\n\t\t\n\t\t/**\n\t\t * Column options that can be given to DataTables at initialisation time.\n\t\t *  @namespace\n\t\t */\n\t\tDataTable.defaults.column = {\n\t\t\t/**\n\t\t\t * Define which column(s) an order will occur on for this column. This\n\t\t\t * allows a column's ordering to take multiple columns into account when\n\t\t\t * doing a sort or use the data from a different column. For example first\n\t\t\t * name / last name columns make sense to do a multi-column sort over the\n\t\t\t * two columns.\n\t\t\t *  @type array|int\n\t\t\t *  @default null <i>Takes the value of the column index automatically</i>\n\t\t\t *\n\t\t\t *  @name DataTable.defaults.column.orderData\n\t\t\t *  @dtopt Columns\n\t\t\t *\n\t\t\t *  @example\n\t\t\t *    // Using `columnDefs`\n\t\t\t *    $(document).ready( function() {\n\t\t\t *      $('#example').dataTable( {\n\t\t\t *        \"columnDefs\": [\n\t\t\t *          { \"orderData\": [ 0, 1 ], \"targets\": [ 0 ] },\n\t\t\t *          { \"orderData\": [ 1, 0 ], \"targets\": [ 1 ] },\n\t\t\t *          { \"orderData\": 2, \"targets\": [ 2 ] }\n\t\t\t *        ]\n\t\t\t *      } );\n\t\t\t *    } );\n\t\t\t *\n\t\t\t *  @example\n\t\t\t *    // Using `columns`\n\t\t\t *    $(document).ready( function() {\n\t\t\t *      $('#example').dataTable( {\n\t\t\t *        \"columns\": [\n\t\t\t *          { \"orderData\": [ 0, 1 ] },\n\t\t\t *          { \"orderData\": [ 1, 0 ] },\n\t\t\t *          { \"orderData\": 2 },\n\t\t\t *          null,\n\t\t\t *          null\n\t\t\t *        ]\n\t\t\t *      } );\n\t\t\t *    } );\n\t\t\t */\n\t\t\t\"aDataSort\": null,\n\t\t\t\"iDataSort\": -1,\n\t\t\n\t\t\n\t\t\t/**\n\t\t\t * You can control the default ordering direction, and even alter the\n\t\t\t * behaviour of the sort handler (i.e. only allow ascending ordering etc)\n\t\t\t * using this parameter.\n\t\t\t *  @type array\n\t\t\t *  @default [ 'asc', 'desc' ]\n\t\t\t *\n\t\t\t *  @name DataTable.defaults.column.orderSequence\n\t\t\t *  @dtopt Columns\n\t\t\t *\n\t\t\t *  @example\n\t\t\t *    // Using `columnDefs`\n\t\t\t *    $(document).ready( function() {\n\t\t\t *      $('#example').dataTable( {\n\t\t\t *        \"columnDefs\": [\n\t\t\t *          { \"orderSequence\": [ \"asc\" ], \"targets\": [ 1 ] },\n\t\t\t *          { \"orderSequence\": [ \"desc\", \"asc\", \"asc\" ], \"targets\": [ 2 ] },\n\t\t\t *          { \"orderSequence\": [ \"desc\" ], \"targets\": [ 3 ] }\n\t\t\t *        ]\n\t\t\t *      } );\n\t\t\t *    } );\n\t\t\t *\n\t\t\t *  @example\n\t\t\t *    // Using `columns`\n\t\t\t *    $(document).ready( function() {\n\t\t\t *      $('#example').dataTable( {\n\t\t\t *        \"columns\": [\n\t\t\t *          null,\n\t\t\t *          { \"orderSequence\": [ \"asc\" ] },\n\t\t\t *          { \"orderSequence\": [ \"desc\", \"asc\", \"asc\" ] },\n\t\t\t *          { \"orderSequence\": [ \"desc\" ] },\n\t\t\t *          null\n\t\t\t *        ]\n\t\t\t *      } );\n\t\t\t *    } );\n\t\t\t */\n\t\t\t\"asSorting\": [ 'asc', 'desc' ],\n\t\t\n\t\t\n\t\t\t/**\n\t\t\t * Enable or disable filtering on the data in this column.\n\t\t\t *  @type boolean\n\t\t\t *  @default true\n\t\t\t *\n\t\t\t *  @name DataTable.defaults.column.searchable\n\t\t\t *  @dtopt Columns\n\t\t\t *\n\t\t\t *  @example\n\t\t\t *    // Using `columnDefs`\n\t\t\t *    $(document).ready( function() {\n\t\t\t *      $('#example').dataTable( {\n\t\t\t *        \"columnDefs\": [\n\t\t\t *          { \"searchable\": false, \"targets\": [ 0 ] }\n\t\t\t *        ] } );\n\t\t\t *    } );\n\t\t\t *\n\t\t\t *  @example\n\t\t\t *    // Using `columns`\n\t\t\t *    $(document).ready( function() {\n\t\t\t *      $('#example').dataTable( {\n\t\t\t *        \"columns\": [\n\t\t\t *          { \"searchable\": false },\n\t\t\t *          null,\n\t\t\t *          null,\n\t\t\t *          null,\n\t\t\t *          null\n\t\t\t *        ] } );\n\t\t\t *    } );\n\t\t\t */\n\t\t\t\"bSearchable\": true,\n\t\t\n\t\t\n\t\t\t/**\n\t\t\t * Enable or disable ordering on this column.\n\t\t\t *  @type boolean\n\t\t\t *  @default true\n\t\t\t *\n\t\t\t *  @name DataTable.defaults.column.orderable\n\t\t\t *  @dtopt Columns\n\t\t\t *\n\t\t\t *  @example\n\t\t\t *    // Using `columnDefs`\n\t\t\t *    $(document).ready( function() {\n\t\t\t *      $('#example').dataTable( {\n\t\t\t *        \"columnDefs\": [\n\t\t\t *          { \"orderable\": false, \"targets\": [ 0 ] }\n\t\t\t *        ] } );\n\t\t\t *    } );\n\t\t\t *\n\t\t\t *  @example\n\t\t\t *    // Using `columns`\n\t\t\t *    $(document).ready( function() {\n\t\t\t *      $('#example').dataTable( {\n\t\t\t *        \"columns\": [\n\t\t\t *          { \"orderable\": false },\n\t\t\t *          null,\n\t\t\t *          null,\n\t\t\t *          null,\n\t\t\t *          null\n\t\t\t *        ] } );\n\t\t\t *    } );\n\t\t\t */\n\t\t\t\"bSortable\": true,\n\t\t\n\t\t\n\t\t\t/**\n\t\t\t * Enable or disable the display of this column.\n\t\t\t *  @type boolean\n\t\t\t *  @default true\n\t\t\t *\n\t\t\t *  @name DataTable.defaults.column.visible\n\t\t\t *  @dtopt Columns\n\t\t\t *\n\t\t\t *  @example\n\t\t\t *    // Using `columnDefs`\n\t\t\t *    $(document).ready( function() {\n\t\t\t *      $('#example').dataTable( {\n\t\t\t *        \"columnDefs\": [\n\t\t\t *          { \"visible\": false, \"targets\": [ 0 ] }\n\t\t\t *        ] } );\n\t\t\t *    } );\n\t\t\t *\n\t\t\t *  @example\n\t\t\t *    // Using `columns`\n\t\t\t *    $(document).ready( function() {\n\t\t\t *      $('#example').dataTable( {\n\t\t\t *        \"columns\": [\n\t\t\t *          { \"visible\": false },\n\t\t\t *          null,\n\t\t\t *          null,\n\t\t\t *          null,\n\t\t\t *          null\n\t\t\t *        ] } );\n\t\t\t *    } );\n\t\t\t */\n\t\t\t\"bVisible\": true,\n\t\t\n\t\t\n\t\t\t/**\n\t\t\t * Developer definable function that is called whenever a cell is created (Ajax source,\n\t\t\t * etc) or processed for input (DOM source). This can be used as a compliment to mRender\n\t\t\t * allowing you to modify the DOM element (add background colour for example) when the\n\t\t\t * element is available.\n\t\t\t *  @type function\n\t\t\t *  @param {element} td The TD node that has been created\n\t\t\t *  @param {*} cellData The Data for the cell\n\t\t\t *  @param {array|object} rowData The data for the whole row\n\t\t\t *  @param {int} row The row index for the aoData data store\n\t\t\t *  @param {int} col The column index for aoColumns\n\t\t\t *\n\t\t\t *  @name DataTable.defaults.column.createdCell\n\t\t\t *  @dtopt Columns\n\t\t\t *\n\t\t\t *  @example\n\t\t\t *    $(document).ready( function() {\n\t\t\t *      $('#example').dataTable( {\n\t\t\t *        \"columnDefs\": [ {\n\t\t\t *          \"targets\": [3],\n\t\t\t *          \"createdCell\": function (td, cellData, rowData, row, col) {\n\t\t\t *            if ( cellData == \"1.7\" ) {\n\t\t\t *              $(td).css('color', 'blue')\n\t\t\t *            }\n\t\t\t *          }\n\t\t\t *        } ]\n\t\t\t *      });\n\t\t\t *    } );\n\t\t\t */\n\t\t\t\"fnCreatedCell\": null,\n\t\t\n\t\t\n\t\t\t/**\n\t\t\t * This parameter has been replaced by `data` in DataTables to ensure naming\n\t\t\t * consistency. `dataProp` can still be used, as there is backwards\n\t\t\t * compatibility in DataTables for this option, but it is strongly\n\t\t\t * recommended that you use `data` in preference to `dataProp`.\n\t\t\t *  @name DataTable.defaults.column.dataProp\n\t\t\t */\n\t\t\n\t\t\n\t\t\t/**\n\t\t\t * This property can be used to read data from any data source property,\n\t\t\t * including deeply nested objects / properties. `data` can be given in a\n\t\t\t * number of different ways which effect its behaviour:\n\t\t\t *\n\t\t\t * * `integer` - treated as an array index for the data source. This is the\n\t\t\t *   default that DataTables uses (incrementally increased for each column).\n\t\t\t * * `string` - read an object property from the data source. There are\n\t\t\t *   three 'special' options that can be used in the string to alter how\n\t\t\t *   DataTables reads the data from the source object:\n\t\t\t *    * `.` - Dotted Javascript notation. Just as you use a `.` in\n\t\t\t *      Javascript to read from nested objects, so to can the options\n\t\t\t *      specified in `data`. For example: `browser.version` or\n\t\t\t *      `browser.name`. If your object parameter name contains a period, use\n\t\t\t *      `\\\\` to escape it - i.e. `first\\\\.name`.\n\t\t\t *    * `[]` - Array notation. DataTables can automatically combine data\n\t\t\t *      from and array source, joining the data with the characters provided\n\t\t\t *      between the two brackets. For example: `name[, ]` would provide a\n\t\t\t *      comma-space separated list from the source array. If no characters\n\t\t\t *      are provided between the brackets, the original array source is\n\t\t\t *      returned.\n\t\t\t *    * `()` - Function notation. Adding `()` to the end of a parameter will\n\t\t\t *      execute a function of the name given. For example: `browser()` for a\n\t\t\t *      simple function on the data source, `browser.version()` for a\n\t\t\t *      function in a nested property or even `browser().version` to get an\n\t\t\t *      object property if the function called returns an object. Note that\n\t\t\t *      function notation is recommended for use in `render` rather than\n\t\t\t *      `data` as it is much simpler to use as a renderer.\n\t\t\t * * `null` - use the original data source for the row rather than plucking\n\t\t\t *   data directly from it. This action has effects on two other\n\t\t\t *   initialisation options:\n\t\t\t *    * `defaultContent` - When null is given as the `data` option and\n\t\t\t *      `defaultContent` is specified for the column, the value defined by\n\t\t\t *      `defaultContent` will be used for the cell.\n\t\t\t *    * `render` - When null is used for the `data` option and the `render`\n\t\t\t *      option is specified for the column, the whole data source for the\n\t\t\t *      row is used for the renderer.\n\t\t\t * * `function` - the function given will be executed whenever DataTables\n\t\t\t *   needs to set or get the data for a cell in the column. The function\n\t\t\t *   takes three parameters:\n\t\t\t *    * Parameters:\n\t\t\t *      * `{array|object}` The data source for the row\n\t\t\t *      * `{string}` The type call data requested - this will be 'set' when\n\t\t\t *        setting data or 'filter', 'display', 'type', 'sort' or undefined\n\t\t\t *        when gathering data. Note that when `undefined` is given for the\n\t\t\t *        type DataTables expects to get the raw data for the object back<\n\t\t\t *      * `{*}` Data to set when the second parameter is 'set'.\n\t\t\t *    * Return:\n\t\t\t *      * The return value from the function is not required when 'set' is\n\t\t\t *        the type of call, but otherwise the return is what will be used\n\t\t\t *        for the data requested.\n\t\t\t *\n\t\t\t * Note that `data` is a getter and setter option. If you just require\n\t\t\t * formatting of data for output, you will likely want to use `render` which\n\t\t\t * is simply a getter and thus simpler to use.\n\t\t\t *\n\t\t\t * Note that prior to DataTables 1.9.2 `data` was called `mDataProp`. The\n\t\t\t * name change reflects the flexibility of this property and is consistent\n\t\t\t * with the naming of mRender. If 'mDataProp' is given, then it will still\n\t\t\t * be used by DataTables, as it automatically maps the old name to the new\n\t\t\t * if required.\n\t\t\t *\n\t\t\t *  @type string|int|function|null\n\t\t\t *  @default null <i>Use automatically calculated column index</i>\n\t\t\t *\n\t\t\t *  @name DataTable.defaults.column.data\n\t\t\t *  @dtopt Columns\n\t\t\t *\n\t\t\t *  @example\n\t\t\t *    // Read table data from objects\n\t\t\t *    // JSON structure for each row:\n\t\t\t *    //   {\n\t\t\t *    //      \"engine\": {value},\n\t\t\t *    //      \"browser\": {value},\n\t\t\t *    //      \"platform\": {value},\n\t\t\t *    //      \"version\": {value},\n\t\t\t *    //      \"grade\": {value}\n\t\t\t *    //   }\n\t\t\t *    $(document).ready( function() {\n\t\t\t *      $('#example').dataTable( {\n\t\t\t *        \"ajaxSource\": \"sources/objects.txt\",\n\t\t\t *        \"columns\": [\n\t\t\t *          { \"data\": \"engine\" },\n\t\t\t *          { \"data\": \"browser\" },\n\t\t\t *          { \"data\": \"platform\" },\n\t\t\t *          { \"data\": \"version\" },\n\t\t\t *          { \"data\": \"grade\" }\n\t\t\t *        ]\n\t\t\t *      } );\n\t\t\t *    } );\n\t\t\t *\n\t\t\t *  @example\n\t\t\t *    // Read information from deeply nested objects\n\t\t\t *    // JSON structure for each row:\n\t\t\t *    //   {\n\t\t\t *    //      \"engine\": {value},\n\t\t\t *    //      \"browser\": {value},\n\t\t\t *    //      \"platform\": {\n\t\t\t *    //         \"inner\": {value}\n\t\t\t *    //      },\n\t\t\t *    //      \"details\": [\n\t\t\t *    //         {value}, {value}\n\t\t\t *    //      ]\n\t\t\t *    //   }\n\t\t\t *    $(document).ready( function() {\n\t\t\t *      $('#example').dataTable( {\n\t\t\t *        \"ajaxSource\": \"sources/deep.txt\",\n\t\t\t *        \"columns\": [\n\t\t\t *          { \"data\": \"engine\" },\n\t\t\t *          { \"data\": \"browser\" },\n\t\t\t *          { \"data\": \"platform.inner\" },\n\t\t\t *          { \"data\": \"details.0\" },\n\t\t\t *          { \"data\": \"details.1\" }\n\t\t\t *        ]\n\t\t\t *      } );\n\t\t\t *    } );\n\t\t\t *\n\t\t\t *  @example\n\t\t\t *    // Using `data` as a function to provide different information for\n\t\t\t *    // sorting, filtering and display. In this case, currency (price)\n\t\t\t *    $(document).ready( function() {\n\t\t\t *      $('#example').dataTable( {\n\t\t\t *        \"columnDefs\": [ {\n\t\t\t *          \"targets\": [ 0 ],\n\t\t\t *          \"data\": function ( source, type, val ) {\n\t\t\t *            if (type === 'set') {\n\t\t\t *              source.price = val;\n\t\t\t *              // Store the computed display and filter values for efficiency\n\t\t\t *              source.price_display = val==\"\" ? \"\" : \"$\"+numberFormat(val);\n\t\t\t *              source.price_filter  = val==\"\" ? \"\" : \"$\"+numberFormat(val)+\" \"+val;\n\t\t\t *              return;\n\t\t\t *            }\n\t\t\t *            else if (type === 'display') {\n\t\t\t *              return source.price_display;\n\t\t\t *            }\n\t\t\t *            else if (type === 'filter') {\n\t\t\t *              return source.price_filter;\n\t\t\t *            }\n\t\t\t *            // 'sort', 'type' and undefined all just use the integer\n\t\t\t *            return source.price;\n\t\t\t *          }\n\t\t\t *        } ]\n\t\t\t *      } );\n\t\t\t *    } );\n\t\t\t *\n\t\t\t *  @example\n\t\t\t *    // Using default content\n\t\t\t *    $(document).ready( function() {\n\t\t\t *      $('#example').dataTable( {\n\t\t\t *        \"columnDefs\": [ {\n\t\t\t *          \"targets\": [ 0 ],\n\t\t\t *          \"data\": null,\n\t\t\t *          \"defaultContent\": \"Click to edit\"\n\t\t\t *        } ]\n\t\t\t *      } );\n\t\t\t *    } );\n\t\t\t *\n\t\t\t *  @example\n\t\t\t *    // Using array notation - outputting a list from an array\n\t\t\t *    $(document).ready( function() {\n\t\t\t *      $('#example').dataTable( {\n\t\t\t *        \"columnDefs\": [ {\n\t\t\t *          \"targets\": [ 0 ],\n\t\t\t *          \"data\": \"name[, ]\"\n\t\t\t *        } ]\n\t\t\t *      } );\n\t\t\t *    } );\n\t\t\t *\n\t\t\t */\n\t\t\t\"mData\": null,\n\t\t\n\t\t\n\t\t\t/**\n\t\t\t * This property is the rendering partner to `data` and it is suggested that\n\t\t\t * when you want to manipulate data for display (including filtering,\n\t\t\t * sorting etc) without altering the underlying data for the table, use this\n\t\t\t * property. `render` can be considered to be the the read only companion to\n\t\t\t * `data` which is read / write (then as such more complex). Like `data`\n\t\t\t * this option can be given in a number of different ways to effect its\n\t\t\t * behaviour:\n\t\t\t *\n\t\t\t * * `integer` - treated as an array index for the data source. This is the\n\t\t\t *   default that DataTables uses (incrementally increased for each column).\n\t\t\t * * `string` - read an object property from the data source. There are\n\t\t\t *   three 'special' options that can be used in the string to alter how\n\t\t\t *   DataTables reads the data from the source object:\n\t\t\t *    * `.` - Dotted Javascript notation. Just as you use a `.` in\n\t\t\t *      Javascript to read from nested objects, so to can the options\n\t\t\t *      specified in `data`. For example: `browser.version` or\n\t\t\t *      `browser.name`. If your object parameter name contains a period, use\n\t\t\t *      `\\\\` to escape it - i.e. `first\\\\.name`.\n\t\t\t *    * `[]` - Array notation. DataTables can automatically combine data\n\t\t\t *      from and array source, joining the data with the characters provided\n\t\t\t *      between the two brackets. For example: `name[, ]` would provide a\n\t\t\t *      comma-space separated list from the source array. If no characters\n\t\t\t *      are provided between the brackets, the original array source is\n\t\t\t *      returned.\n\t\t\t *    * `()` - Function notation. Adding `()` to the end of a parameter will\n\t\t\t *      execute a function of the name given. For example: `browser()` for a\n\t\t\t *      simple function on the data source, `browser.version()` for a\n\t\t\t *      function in a nested property or even `browser().version` to get an\n\t\t\t *      object property if the function called returns an object.\n\t\t\t * * `object` - use different data for the different data types requested by\n\t\t\t *   DataTables ('filter', 'display', 'type' or 'sort'). The property names\n\t\t\t *   of the object is the data type the property refers to and the value can\n\t\t\t *   defined using an integer, string or function using the same rules as\n\t\t\t *   `render` normally does. Note that an `_` option _must_ be specified.\n\t\t\t *   This is the default value to use if you haven't specified a value for\n\t\t\t *   the data type requested by DataTables.\n\t\t\t * * `function` - the function given will be executed whenever DataTables\n\t\t\t *   needs to set or get the data for a cell in the column. The function\n\t\t\t *   takes three parameters:\n\t\t\t *    * Parameters:\n\t\t\t *      * {array|object} The data source for the row (based on `data`)\n\t\t\t *      * {string} The type call data requested - this will be 'filter',\n\t\t\t *        'display', 'type' or 'sort'.\n\t\t\t *      * {array|object} The full data source for the row (not based on\n\t\t\t *        `data`)\n\t\t\t *    * Return:\n\t\t\t *      * The return value from the function is what will be used for the\n\t\t\t *        data requested.\n\t\t\t *\n\t\t\t *  @type string|int|function|object|null\n\t\t\t *  @default null Use the data source value.\n\t\t\t *\n\t\t\t *  @name DataTable.defaults.column.render\n\t\t\t *  @dtopt Columns\n\t\t\t *\n\t\t\t *  @example\n\t\t\t *    // Create a comma separated list from an array of objects\n\t\t\t *    $(document).ready( function() {\n\t\t\t *      $('#example').dataTable( {\n\t\t\t *        \"ajaxSource\": \"sources/deep.txt\",\n\t\t\t *        \"columns\": [\n\t\t\t *          { \"data\": \"engine\" },\n\t\t\t *          { \"data\": \"browser\" },\n\t\t\t *          {\n\t\t\t *            \"data\": \"platform\",\n\t\t\t *            \"render\": \"[, ].name\"\n\t\t\t *          }\n\t\t\t *        ]\n\t\t\t *      } );\n\t\t\t *    } );\n\t\t\t *\n\t\t\t *  @example\n\t\t\t *    // Execute a function to obtain data\n\t\t\t *    $(document).ready( function() {\n\t\t\t *      $('#example').dataTable( {\n\t\t\t *        \"columnDefs\": [ {\n\t\t\t *          \"targets\": [ 0 ],\n\t\t\t *          \"data\": null, // Use the full data source object for the renderer's source\n\t\t\t *          \"render\": \"browserName()\"\n\t\t\t *        } ]\n\t\t\t *      } );\n\t\t\t *    } );\n\t\t\t *\n\t\t\t *  @example\n\t\t\t *    // As an object, extracting different data for the different types\n\t\t\t *    // This would be used with a data source such as:\n\t\t\t *    //   { \"phone\": 5552368, \"phone_filter\": \"5552368 555-2368\", \"phone_display\": \"555-2368\" }\n\t\t\t *    // Here the `phone` integer is used for sorting and type detection, while `phone_filter`\n\t\t\t *    // (which has both forms) is used for filtering for if a user inputs either format, while\n\t\t\t *    // the formatted phone number is the one that is shown in the table.\n\t\t\t *    $(document).ready( function() {\n\t\t\t *      $('#example').dataTable( {\n\t\t\t *        \"columnDefs\": [ {\n\t\t\t *          \"targets\": [ 0 ],\n\t\t\t *          \"data\": null, // Use the full data source object for the renderer's source\n\t\t\t *          \"render\": {\n\t\t\t *            \"_\": \"phone\",\n\t\t\t *            \"filter\": \"phone_filter\",\n\t\t\t *            \"display\": \"phone_display\"\n\t\t\t *          }\n\t\t\t *        } ]\n\t\t\t *      } );\n\t\t\t *    } );\n\t\t\t *\n\t\t\t *  @example\n\t\t\t *    // Use as a function to create a link from the data source\n\t\t\t *    $(document).ready( function() {\n\t\t\t *      $('#example').dataTable( {\n\t\t\t *        \"columnDefs\": [ {\n\t\t\t *          \"targets\": [ 0 ],\n\t\t\t *          \"data\": \"download_link\",\n\t\t\t *          \"render\": function ( data, type, full ) {\n\t\t\t *            return '<a href=\"'+data+'\">Download</a>';\n\t\t\t *          }\n\t\t\t *        } ]\n\t\t\t *      } );\n\t\t\t *    } );\n\t\t\t */\n\t\t\t\"mRender\": null,\n\t\t\n\t\t\n\t\t\t/**\n\t\t\t * Change the cell type created for the column - either TD cells or TH cells. This\n\t\t\t * can be useful as TH cells have semantic meaning in the table body, allowing them\n\t\t\t * to act as a header for a row (you may wish to add scope='row' to the TH elements).\n\t\t\t *  @type string\n\t\t\t *  @default td\n\t\t\t *\n\t\t\t *  @name DataTable.defaults.column.cellType\n\t\t\t *  @dtopt Columns\n\t\t\t *\n\t\t\t *  @example\n\t\t\t *    // Make the first column use TH cells\n\t\t\t *    $(document).ready( function() {\n\t\t\t *      $('#example').dataTable( {\n\t\t\t *        \"columnDefs\": [ {\n\t\t\t *          \"targets\": [ 0 ],\n\t\t\t *          \"cellType\": \"th\"\n\t\t\t *        } ]\n\t\t\t *      } );\n\t\t\t *    } );\n\t\t\t */\n\t\t\t\"sCellType\": \"td\",\n\t\t\n\t\t\n\t\t\t/**\n\t\t\t * Class to give to each cell in this column.\n\t\t\t *  @type string\n\t\t\t *  @default <i>Empty string</i>\n\t\t\t *\n\t\t\t *  @name DataTable.defaults.column.class\n\t\t\t *  @dtopt Columns\n\t\t\t *\n\t\t\t *  @example\n\t\t\t *    // Using `columnDefs`\n\t\t\t *    $(document).ready( function() {\n\t\t\t *      $('#example').dataTable( {\n\t\t\t *        \"columnDefs\": [\n\t\t\t *          { \"class\": \"my_class\", \"targets\": [ 0 ] }\n\t\t\t *        ]\n\t\t\t *      } );\n\t\t\t *    } );\n\t\t\t *\n\t\t\t *  @example\n\t\t\t *    // Using `columns`\n\t\t\t *    $(document).ready( function() {\n\t\t\t *      $('#example').dataTable( {\n\t\t\t *        \"columns\": [\n\t\t\t *          { \"class\": \"my_class\" },\n\t\t\t *          null,\n\t\t\t *          null,\n\t\t\t *          null,\n\t\t\t *          null\n\t\t\t *        ]\n\t\t\t *      } );\n\t\t\t *    } );\n\t\t\t */\n\t\t\t\"sClass\": \"\",\n\t\t\n\t\t\t/**\n\t\t\t * When DataTables calculates the column widths to assign to each column,\n\t\t\t * it finds the longest string in each column and then constructs a\n\t\t\t * temporary table and reads the widths from that. The problem with this\n\t\t\t * is that \"mmm\" is much wider then \"iiii\", but the latter is a longer\n\t\t\t * string - thus the calculation can go wrong (doing it properly and putting\n\t\t\t * it into an DOM object and measuring that is horribly(!) slow). Thus as\n\t\t\t * a \"work around\" we provide this option. It will append its value to the\n\t\t\t * text that is found to be the longest string for the column - i.e. padding.\n\t\t\t * Generally you shouldn't need this!\n\t\t\t *  @type string\n\t\t\t *  @default <i>Empty string<i>\n\t\t\t *\n\t\t\t *  @name DataTable.defaults.column.contentPadding\n\t\t\t *  @dtopt Columns\n\t\t\t *\n\t\t\t *  @example\n\t\t\t *    // Using `columns`\n\t\t\t *    $(document).ready( function() {\n\t\t\t *      $('#example').dataTable( {\n\t\t\t *        \"columns\": [\n\t\t\t *          null,\n\t\t\t *          null,\n\t\t\t *          null,\n\t\t\t *          {\n\t\t\t *            \"contentPadding\": \"mmm\"\n\t\t\t *          }\n\t\t\t *        ]\n\t\t\t *      } );\n\t\t\t *    } );\n\t\t\t */\n\t\t\t\"sContentPadding\": \"\",\n\t\t\n\t\t\n\t\t\t/**\n\t\t\t * Allows a default value to be given for a column's data, and will be used\n\t\t\t * whenever a null data source is encountered (this can be because `data`\n\t\t\t * is set to null, or because the data source itself is null).\n\t\t\t *  @type string\n\t\t\t *  @default null\n\t\t\t *\n\t\t\t *  @name DataTable.defaults.column.defaultContent\n\t\t\t *  @dtopt Columns\n\t\t\t *\n\t\t\t *  @example\n\t\t\t *    // Using `columnDefs`\n\t\t\t *    $(document).ready( function() {\n\t\t\t *      $('#example').dataTable( {\n\t\t\t *        \"columnDefs\": [\n\t\t\t *          {\n\t\t\t *            \"data\": null,\n\t\t\t *            \"defaultContent\": \"Edit\",\n\t\t\t *            \"targets\": [ -1 ]\n\t\t\t *          }\n\t\t\t *        ]\n\t\t\t *      } );\n\t\t\t *    } );\n\t\t\t *\n\t\t\t *  @example\n\t\t\t *    // Using `columns`\n\t\t\t *    $(document).ready( function() {\n\t\t\t *      $('#example').dataTable( {\n\t\t\t *        \"columns\": [\n\t\t\t *          null,\n\t\t\t *          null,\n\t\t\t *          null,\n\t\t\t *          {\n\t\t\t *            \"data\": null,\n\t\t\t *            \"defaultContent\": \"Edit\"\n\t\t\t *          }\n\t\t\t *        ]\n\t\t\t *      } );\n\t\t\t *    } );\n\t\t\t */\n\t\t\t\"sDefaultContent\": null,\n\t\t\n\t\t\n\t\t\t/**\n\t\t\t * This parameter is only used in DataTables' server-side processing. It can\n\t\t\t * be exceptionally useful to know what columns are being displayed on the\n\t\t\t * client side, and to map these to database fields. When defined, the names\n\t\t\t * also allow DataTables to reorder information from the server if it comes\n\t\t\t * back in an unexpected order (i.e. if you switch your columns around on the\n\t\t\t * client-side, your server-side code does not also need updating).\n\t\t\t *  @type string\n\t\t\t *  @default <i>Empty string</i>\n\t\t\t *\n\t\t\t *  @name DataTable.defaults.column.name\n\t\t\t *  @dtopt Columns\n\t\t\t *\n\t\t\t *  @example\n\t\t\t *    // Using `columnDefs`\n\t\t\t *    $(document).ready( function() {\n\t\t\t *      $('#example').dataTable( {\n\t\t\t *        \"columnDefs\": [\n\t\t\t *          { \"name\": \"engine\", \"targets\": [ 0 ] },\n\t\t\t *          { \"name\": \"browser\", \"targets\": [ 1 ] },\n\t\t\t *          { \"name\": \"platform\", \"targets\": [ 2 ] },\n\t\t\t *          { \"name\": \"version\", \"targets\": [ 3 ] },\n\t\t\t *          { \"name\": \"grade\", \"targets\": [ 4 ] }\n\t\t\t *        ]\n\t\t\t *      } );\n\t\t\t *    } );\n\t\t\t *\n\t\t\t *  @example\n\t\t\t *    // Using `columns`\n\t\t\t *    $(document).ready( function() {\n\t\t\t *      $('#example').dataTable( {\n\t\t\t *        \"columns\": [\n\t\t\t *          { \"name\": \"engine\" },\n\t\t\t *          { \"name\": \"browser\" },\n\t\t\t *          { \"name\": \"platform\" },\n\t\t\t *          { \"name\": \"version\" },\n\t\t\t *          { \"name\": \"grade\" }\n\t\t\t *        ]\n\t\t\t *      } );\n\t\t\t *    } );\n\t\t\t */\n\t\t\t\"sName\": \"\",\n\t\t\n\t\t\n\t\t\t/**\n\t\t\t * Defines a data source type for the ordering which can be used to read\n\t\t\t * real-time information from the table (updating the internally cached\n\t\t\t * version) prior to ordering. This allows ordering to occur on user\n\t\t\t * editable elements such as form inputs.\n\t\t\t *  @type string\n\t\t\t *  @default std\n\t\t\t *\n\t\t\t *  @name DataTable.defaults.column.orderDataType\n\t\t\t *  @dtopt Columns\n\t\t\t *\n\t\t\t *  @example\n\t\t\t *    // Using `columnDefs`\n\t\t\t *    $(document).ready( function() {\n\t\t\t *      $('#example').dataTable( {\n\t\t\t *        \"columnDefs\": [\n\t\t\t *          { \"orderDataType\": \"dom-text\", \"targets\": [ 2, 3 ] },\n\t\t\t *          { \"type\": \"numeric\", \"targets\": [ 3 ] },\n\t\t\t *          { \"orderDataType\": \"dom-select\", \"targets\": [ 4 ] },\n\t\t\t *          { \"orderDataType\": \"dom-checkbox\", \"targets\": [ 5 ] }\n\t\t\t *        ]\n\t\t\t *      } );\n\t\t\t *    } );\n\t\t\t *\n\t\t\t *  @example\n\t\t\t *    // Using `columns`\n\t\t\t *    $(document).ready( function() {\n\t\t\t *      $('#example').dataTable( {\n\t\t\t *        \"columns\": [\n\t\t\t *          null,\n\t\t\t *          null,\n\t\t\t *          { \"orderDataType\": \"dom-text\" },\n\t\t\t *          { \"orderDataType\": \"dom-text\", \"type\": \"numeric\" },\n\t\t\t *          { \"orderDataType\": \"dom-select\" },\n\t\t\t *          { \"orderDataType\": \"dom-checkbox\" }\n\t\t\t *        ]\n\t\t\t *      } );\n\t\t\t *    } );\n\t\t\t */\n\t\t\t\"sSortDataType\": \"std\",\n\t\t\n\t\t\n\t\t\t/**\n\t\t\t * The title of this column.\n\t\t\t *  @type string\n\t\t\t *  @default null <i>Derived from the 'TH' value for this column in the\n\t\t\t *    original HTML table.</i>\n\t\t\t *\n\t\t\t *  @name DataTable.defaults.column.title\n\t\t\t *  @dtopt Columns\n\t\t\t *\n\t\t\t *  @example\n\t\t\t *    // Using `columnDefs`\n\t\t\t *    $(document).ready( function() {\n\t\t\t *      $('#example').dataTable( {\n\t\t\t *        \"columnDefs\": [\n\t\t\t *          { \"title\": \"My column title\", \"targets\": [ 0 ] }\n\t\t\t *        ]\n\t\t\t *      } );\n\t\t\t *    } );\n\t\t\t *\n\t\t\t *  @example\n\t\t\t *    // Using `columns`\n\t\t\t *    $(document).ready( function() {\n\t\t\t *      $('#example').dataTable( {\n\t\t\t *        \"columns\": [\n\t\t\t *          { \"title\": \"My column title\" },\n\t\t\t *          null,\n\t\t\t *          null,\n\t\t\t *          null,\n\t\t\t *          null\n\t\t\t *        ]\n\t\t\t *      } );\n\t\t\t *    } );\n\t\t\t */\n\t\t\t\"sTitle\": null,\n\t\t\n\t\t\n\t\t\t/**\n\t\t\t * The type allows you to specify how the data for this column will be\n\t\t\t * ordered. Four types (string, numeric, date and html (which will strip\n\t\t\t * HTML tags before ordering)) are currently available. Note that only date\n\t\t\t * formats understood by Javascript's Date() object will be accepted as type\n\t\t\t * date. For example: \"Mar 26, 2008 5:03 PM\". May take the values: 'string',\n\t\t\t * 'numeric', 'date' or 'html' (by default). Further types can be adding\n\t\t\t * through plug-ins.\n\t\t\t *  @type string\n\t\t\t *  @default null <i>Auto-detected from raw data</i>\n\t\t\t *\n\t\t\t *  @name DataTable.defaults.column.type\n\t\t\t *  @dtopt Columns\n\t\t\t *\n\t\t\t *  @example\n\t\t\t *    // Using `columnDefs`\n\t\t\t *    $(document).ready( function() {\n\t\t\t *      $('#example').dataTable( {\n\t\t\t *        \"columnDefs\": [\n\t\t\t *          { \"type\": \"html\", \"targets\": [ 0 ] }\n\t\t\t *        ]\n\t\t\t *      } );\n\t\t\t *    } );\n\t\t\t *\n\t\t\t *  @example\n\t\t\t *    // Using `columns`\n\t\t\t *    $(document).ready( function() {\n\t\t\t *      $('#example').dataTable( {\n\t\t\t *        \"columns\": [\n\t\t\t *          { \"type\": \"html\" },\n\t\t\t *          null,\n\t\t\t *          null,\n\t\t\t *          null,\n\t\t\t *          null\n\t\t\t *        ]\n\t\t\t *      } );\n\t\t\t *    } );\n\t\t\t */\n\t\t\t\"sType\": null,\n\t\t\n\t\t\n\t\t\t/**\n\t\t\t * Defining the width of the column, this parameter may take any CSS value\n\t\t\t * (3em, 20px etc). DataTables applies 'smart' widths to columns which have not\n\t\t\t * been given a specific width through this interface ensuring that the table\n\t\t\t * remains readable.\n\t\t\t *  @type string\n\t\t\t *  @default null <i>Automatic</i>\n\t\t\t *\n\t\t\t *  @name DataTable.defaults.column.width\n\t\t\t *  @dtopt Columns\n\t\t\t *\n\t\t\t *  @example\n\t\t\t *    // Using `columnDefs`\n\t\t\t *    $(document).ready( function() {\n\t\t\t *      $('#example').dataTable( {\n\t\t\t *        \"columnDefs\": [\n\t\t\t *          { \"width\": \"20%\", \"targets\": [ 0 ] }\n\t\t\t *        ]\n\t\t\t *      } );\n\t\t\t *    } );\n\t\t\t *\n\t\t\t *  @example\n\t\t\t *    // Using `columns`\n\t\t\t *    $(document).ready( function() {\n\t\t\t *      $('#example').dataTable( {\n\t\t\t *        \"columns\": [\n\t\t\t *          { \"width\": \"20%\" },\n\t\t\t *          null,\n\t\t\t *          null,\n\t\t\t *          null,\n\t\t\t *          null\n\t\t\t *        ]\n\t\t\t *      } );\n\t\t\t *    } );\n\t\t\t */\n\t\t\t\"sWidth\": null\n\t\t};\n\t\t\n\t\t_fnHungarianMap( DataTable.defaults.column );\n\t\t\n\t\t\n\t\t\n\t\t/**\n\t\t * DataTables settings object - this holds all the information needed for a\n\t\t * given table, including configuration, data and current application of the\n\t\t * table options. DataTables does not have a single instance for each DataTable\n\t\t * with the settings attached to that instance, but rather instances of the\n\t\t * DataTable \"class\" are created on-the-fly as needed (typically by a\n\t\t * $().dataTable() call) and the settings object is then applied to that\n\t\t * instance.\n\t\t *\n\t\t * Note that this object is related to {@link DataTable.defaults} but this\n\t\t * one is the internal data store for DataTables's cache of columns. It should\n\t\t * NOT be manipulated outside of DataTables. Any configuration should be done\n\t\t * through the initialisation options.\n\t\t *  @namespace\n\t\t *  @todo Really should attach the settings object to individual instances so we\n\t\t *    don't need to create new instances on each $().dataTable() call (if the\n\t\t *    table already exists). It would also save passing oSettings around and\n\t\t *    into every single function. However, this is a very significant\n\t\t *    architecture change for DataTables and will almost certainly break\n\t\t *    backwards compatibility with older installations. This is something that\n\t\t *    will be done in 2.0.\n\t\t */\n\t\tDataTable.models.oSettings = {\n\t\t\t/**\n\t\t\t * Primary features of DataTables and their enablement state.\n\t\t\t *  @namespace\n\t\t\t */\n\t\t\t\"oFeatures\": {\n\t\t\n\t\t\t\t/**\n\t\t\t\t * Flag to say if DataTables should automatically try to calculate the\n\t\t\t\t * optimum table and columns widths (true) or not (false).\n\t\t\t\t * Note that this parameter will be set by the initialisation routine. To\n\t\t\t\t * set a default use {@link DataTable.defaults}.\n\t\t\t\t *  @type boolean\n\t\t\t\t */\n\t\t\t\t\"bAutoWidth\": null,\n\t\t\n\t\t\t\t/**\n\t\t\t\t * Delay the creation of TR and TD elements until they are actually\n\t\t\t\t * needed by a driven page draw. This can give a significant speed\n\t\t\t\t * increase for Ajax source and Javascript source data, but makes no\n\t\t\t\t * difference at all for DOM and server-side processing tables.\n\t\t\t\t * Note that this parameter will be set by the initialisation routine. To\n\t\t\t\t * set a default use {@link DataTable.defaults}.\n\t\t\t\t *  @type boolean\n\t\t\t\t */\n\t\t\t\t\"bDeferRender\": null,\n\t\t\n\t\t\t\t/**\n\t\t\t\t * Enable filtering on the table or not. Note that if this is disabled\n\t\t\t\t * then there is no filtering at all on the table, including fnFilter.\n\t\t\t\t * To just remove the filtering input use sDom and remove the 'f' option.\n\t\t\t\t * Note that this parameter will be set by the initialisation routine. To\n\t\t\t\t * set a default use {@link DataTable.defaults}.\n\t\t\t\t *  @type boolean\n\t\t\t\t */\n\t\t\t\t\"bFilter\": null,\n\t\t\n\t\t\t\t/**\n\t\t\t\t * Table information element (the 'Showing x of y records' div) enable\n\t\t\t\t * flag.\n\t\t\t\t * Note that this parameter will be set by the initialisation routine. To\n\t\t\t\t * set a default use {@link DataTable.defaults}.\n\t\t\t\t *  @type boolean\n\t\t\t\t */\n\t\t\t\t\"bInfo\": null,\n\t\t\n\t\t\t\t/**\n\t\t\t\t * Present a user control allowing the end user to change the page size\n\t\t\t\t * when pagination is enabled.\n\t\t\t\t * Note that this parameter will be set by the initialisation routine. To\n\t\t\t\t * set a default use {@link DataTable.defaults}.\n\t\t\t\t *  @type boolean\n\t\t\t\t */\n\t\t\t\t\"bLengthChange\": null,\n\t\t\n\t\t\t\t/**\n\t\t\t\t * Pagination enabled or not. Note that if this is disabled then length\n\t\t\t\t * changing must also be disabled.\n\t\t\t\t * Note that this parameter will be set by the initialisation routine. To\n\t\t\t\t * set a default use {@link DataTable.defaults}.\n\t\t\t\t *  @type boolean\n\t\t\t\t */\n\t\t\t\t\"bPaginate\": null,\n\t\t\n\t\t\t\t/**\n\t\t\t\t * Processing indicator enable flag whenever DataTables is enacting a\n\t\t\t\t * user request - typically an Ajax request for server-side processing.\n\t\t\t\t * Note that this parameter will be set by the initialisation routine. To\n\t\t\t\t * set a default use {@link DataTable.defaults}.\n\t\t\t\t *  @type boolean\n\t\t\t\t */\n\t\t\t\t\"bProcessing\": null,\n\t\t\n\t\t\t\t/**\n\t\t\t\t * Server-side processing enabled flag - when enabled DataTables will\n\t\t\t\t * get all data from the server for every draw - there is no filtering,\n\t\t\t\t * sorting or paging done on the client-side.\n\t\t\t\t * Note that this parameter will be set by the initialisation routine. To\n\t\t\t\t * set a default use {@link DataTable.defaults}.\n\t\t\t\t *  @type boolean\n\t\t\t\t */\n\t\t\t\t\"bServerSide\": null,\n\t\t\n\t\t\t\t/**\n\t\t\t\t * Sorting enablement flag.\n\t\t\t\t * Note that this parameter will be set by the initialisation routine. To\n\t\t\t\t * set a default use {@link DataTable.defaults}.\n\t\t\t\t *  @type boolean\n\t\t\t\t */\n\t\t\t\t\"bSort\": null,\n\t\t\n\t\t\t\t/**\n\t\t\t\t * Multi-column sorting\n\t\t\t\t * Note that this parameter will be set by the initialisation routine. To\n\t\t\t\t * set a default use {@link DataTable.defaults}.\n\t\t\t\t *  @type boolean\n\t\t\t\t */\n\t\t\t\t\"bSortMulti\": null,\n\t\t\n\t\t\t\t/**\n\t\t\t\t * Apply a class to the columns which are being sorted to provide a\n\t\t\t\t * visual highlight or not. This can slow things down when enabled since\n\t\t\t\t * there is a lot of DOM interaction.\n\t\t\t\t * Note that this parameter will be set by the initialisation routine. To\n\t\t\t\t * set a default use {@link DataTable.defaults}.\n\t\t\t\t *  @type boolean\n\t\t\t\t */\n\t\t\t\t\"bSortClasses\": null,\n\t\t\n\t\t\t\t/**\n\t\t\t\t * State saving enablement flag.\n\t\t\t\t * Note that this parameter will be set by the initialisation routine. To\n\t\t\t\t * set a default use {@link DataTable.defaults}.\n\t\t\t\t *  @type boolean\n\t\t\t\t */\n\t\t\t\t\"bStateSave\": null\n\t\t\t},\n\t\t\n\t\t\n\t\t\t/**\n\t\t\t * Scrolling settings for a table.\n\t\t\t *  @namespace\n\t\t\t */\n\t\t\t\"oScroll\": {\n\t\t\t\t/**\n\t\t\t\t * When the table is shorter in height than sScrollY, collapse the\n\t\t\t\t * table container down to the height of the table (when true).\n\t\t\t\t * Note that this parameter will be set by the initialisation routine. To\n\t\t\t\t * set a default use {@link DataTable.defaults}.\n\t\t\t\t *  @type boolean\n\t\t\t\t */\n\t\t\t\t\"bCollapse\": null,\n\t\t\n\t\t\t\t/**\n\t\t\t\t * Width of the scrollbar for the web-browser's platform. Calculated\n\t\t\t\t * during table initialisation.\n\t\t\t\t *  @type int\n\t\t\t\t *  @default 0\n\t\t\t\t */\n\t\t\t\t\"iBarWidth\": 0,\n\t\t\n\t\t\t\t/**\n\t\t\t\t * Viewport width for horizontal scrolling. Horizontal scrolling is\n\t\t\t\t * disabled if an empty string.\n\t\t\t\t * Note that this parameter will be set by the initialisation routine. To\n\t\t\t\t * set a default use {@link DataTable.defaults}.\n\t\t\t\t *  @type string\n\t\t\t\t */\n\t\t\t\t\"sX\": null,\n\t\t\n\t\t\t\t/**\n\t\t\t\t * Width to expand the table to when using x-scrolling. Typically you\n\t\t\t\t * should not need to use this.\n\t\t\t\t * Note that this parameter will be set by the initialisation routine. To\n\t\t\t\t * set a default use {@link DataTable.defaults}.\n\t\t\t\t *  @type string\n\t\t\t\t *  @deprecated\n\t\t\t\t */\n\t\t\t\t\"sXInner\": null,\n\t\t\n\t\t\t\t/**\n\t\t\t\t * Viewport height for vertical scrolling. Vertical scrolling is disabled\n\t\t\t\t * if an empty string.\n\t\t\t\t * Note that this parameter will be set by the initialisation routine. To\n\t\t\t\t * set a default use {@link DataTable.defaults}.\n\t\t\t\t *  @type string\n\t\t\t\t */\n\t\t\t\t\"sY\": null\n\t\t\t},\n\t\t\n\t\t\t/**\n\t\t\t * Language information for the table.\n\t\t\t *  @namespace\n\t\t\t *  @extends DataTable.defaults.oLanguage\n\t\t\t */\n\t\t\t\"oLanguage\": {\n\t\t\t\t/**\n\t\t\t\t * Information callback function. See\n\t\t\t\t * {@link DataTable.defaults.fnInfoCallback}\n\t\t\t\t *  @type function\n\t\t\t\t *  @default null\n\t\t\t\t */\n\t\t\t\t\"fnInfoCallback\": null\n\t\t\t},\n\t\t\n\t\t\t/**\n\t\t\t * Browser support parameters\n\t\t\t *  @namespace\n\t\t\t */\n\t\t\t\"oBrowser\": {\n\t\t\t\t/**\n\t\t\t\t * Indicate if the browser incorrectly calculates width:100% inside a\n\t\t\t\t * scrolling element (IE6/7)\n\t\t\t\t *  @type boolean\n\t\t\t\t *  @default false\n\t\t\t\t */\n\t\t\t\t\"bScrollOversize\": false,\n\t\t\n\t\t\t\t/**\n\t\t\t\t * Determine if the vertical scrollbar is on the right or left of the\n\t\t\t\t * scrolling container - needed for rtl language layout, although not\n\t\t\t\t * all browsers move the scrollbar (Safari).\n\t\t\t\t *  @type boolean\n\t\t\t\t *  @default false\n\t\t\t\t */\n\t\t\t\t\"bScrollbarLeft\": false,\n\t\t\n\t\t\t\t/**\n\t\t\t\t * Flag for if `getBoundingClientRect` is fully supported or not\n\t\t\t\t *  @type boolean\n\t\t\t\t *  @default false\n\t\t\t\t */\n\t\t\t\t\"bBounding\": false,\n\t\t\n\t\t\t\t/**\n\t\t\t\t * Browser scrollbar width\n\t\t\t\t *  @type integer\n\t\t\t\t *  @default 0\n\t\t\t\t */\n\t\t\t\t\"barWidth\": 0\n\t\t\t},\n\t\t\n\t\t\n\t\t\t\"ajax\": null,\n\t\t\n\t\t\n\t\t\t/**\n\t\t\t * Array referencing the nodes which are used for the features. The\n\t\t\t * parameters of this object match what is allowed by sDom - i.e.\n\t\t\t *   <ul>\n\t\t\t *     <li>'l' - Length changing</li>\n\t\t\t *     <li>'f' - Filtering input</li>\n\t\t\t *     <li>'t' - The table!</li>\n\t\t\t *     <li>'i' - Information</li>\n\t\t\t *     <li>'p' - Pagination</li>\n\t\t\t *     <li>'r' - pRocessing</li>\n\t\t\t *   </ul>\n\t\t\t *  @type array\n\t\t\t *  @default []\n\t\t\t */\n\t\t\t\"aanFeatures\": [],\n\t\t\n\t\t\t/**\n\t\t\t * Store data information - see {@link DataTable.models.oRow} for detailed\n\t\t\t * information.\n\t\t\t *  @type array\n\t\t\t *  @default []\n\t\t\t */\n\t\t\t\"aoData\": [],\n\t\t\n\t\t\t/**\n\t\t\t * Array of indexes which are in the current display (after filtering etc)\n\t\t\t *  @type array\n\t\t\t *  @default []\n\t\t\t */\n\t\t\t\"aiDisplay\": [],\n\t\t\n\t\t\t/**\n\t\t\t * Array of indexes for display - no filtering\n\t\t\t *  @type array\n\t\t\t *  @default []\n\t\t\t */\n\t\t\t\"aiDisplayMaster\": [],\n\t\t\n\t\t\t/**\n\t\t\t * Map of row ids to data indexes\n\t\t\t *  @type object\n\t\t\t *  @default {}\n\t\t\t */\n\t\t\t\"aIds\": {},\n\t\t\n\t\t\t/**\n\t\t\t * Store information about each column that is in use\n\t\t\t *  @type array\n\t\t\t *  @default []\n\t\t\t */\n\t\t\t\"aoColumns\": [],\n\t\t\n\t\t\t/**\n\t\t\t * Store information about the table's header\n\t\t\t *  @type array\n\t\t\t *  @default []\n\t\t\t */\n\t\t\t\"aoHeader\": [],\n\t\t\n\t\t\t/**\n\t\t\t * Store information about the table's footer\n\t\t\t *  @type array\n\t\t\t *  @default []\n\t\t\t */\n\t\t\t\"aoFooter\": [],\n\t\t\n\t\t\t/**\n\t\t\t * Store the applied global search information in case we want to force a\n\t\t\t * research or compare the old search to a new one.\n\t\t\t * Note that this parameter will be set by the initialisation routine. To\n\t\t\t * set a default use {@link DataTable.defaults}.\n\t\t\t *  @namespace\n\t\t\t *  @extends DataTable.models.oSearch\n\t\t\t */\n\t\t\t\"oPreviousSearch\": {},\n\t\t\n\t\t\t/**\n\t\t\t * Store the applied search for each column - see\n\t\t\t * {@link DataTable.models.oSearch} for the format that is used for the\n\t\t\t * filtering information for each column.\n\t\t\t *  @type array\n\t\t\t *  @default []\n\t\t\t */\n\t\t\t\"aoPreSearchCols\": [],\n\t\t\n\t\t\t/**\n\t\t\t * Sorting that is applied to the table. Note that the inner arrays are\n\t\t\t * used in the following manner:\n\t\t\t * <ul>\n\t\t\t *   <li>Index 0 - column number</li>\n\t\t\t *   <li>Index 1 - current sorting direction</li>\n\t\t\t * </ul>\n\t\t\t * Note that this parameter will be set by the initialisation routine. To\n\t\t\t * set a default use {@link DataTable.defaults}.\n\t\t\t *  @type array\n\t\t\t *  @todo These inner arrays should really be objects\n\t\t\t */\n\t\t\t\"aaSorting\": null,\n\t\t\n\t\t\t/**\n\t\t\t * Sorting that is always applied to the table (i.e. prefixed in front of\n\t\t\t * aaSorting).\n\t\t\t * Note that this parameter will be set by the initialisation routine. To\n\t\t\t * set a default use {@link DataTable.defaults}.\n\t\t\t *  @type array\n\t\t\t *  @default []\n\t\t\t */\n\t\t\t\"aaSortingFixed\": [],\n\t\t\n\t\t\t/**\n\t\t\t * Classes to use for the striping of a table.\n\t\t\t * Note that this parameter will be set by the initialisation routine. To\n\t\t\t * set a default use {@link DataTable.defaults}.\n\t\t\t *  @type array\n\t\t\t *  @default []\n\t\t\t */\n\t\t\t\"asStripeClasses\": null,\n\t\t\n\t\t\t/**\n\t\t\t * If restoring a table - we should restore its striping classes as well\n\t\t\t *  @type array\n\t\t\t *  @default []\n\t\t\t */\n\t\t\t\"asDestroyStripes\": [],\n\t\t\n\t\t\t/**\n\t\t\t * If restoring a table - we should restore its width\n\t\t\t *  @type int\n\t\t\t *  @default 0\n\t\t\t */\n\t\t\t\"sDestroyWidth\": 0,\n\t\t\n\t\t\t/**\n\t\t\t * Callback functions array for every time a row is inserted (i.e. on a draw).\n\t\t\t *  @type array\n\t\t\t *  @default []\n\t\t\t */\n\t\t\t\"aoRowCallback\": [],\n\t\t\n\t\t\t/**\n\t\t\t * Callback functions for the header on each draw.\n\t\t\t *  @type array\n\t\t\t *  @default []\n\t\t\t */\n\t\t\t\"aoHeaderCallback\": [],\n\t\t\n\t\t\t/**\n\t\t\t * Callback function for the footer on each draw.\n\t\t\t *  @type array\n\t\t\t *  @default []\n\t\t\t */\n\t\t\t\"aoFooterCallback\": [],\n\t\t\n\t\t\t/**\n\t\t\t * Array of callback functions for draw callback functions\n\t\t\t *  @type array\n\t\t\t *  @default []\n\t\t\t */\n\t\t\t\"aoDrawCallback\": [],\n\t\t\n\t\t\t/**\n\t\t\t * Array of callback functions for row created function\n\t\t\t *  @type array\n\t\t\t *  @default []\n\t\t\t */\n\t\t\t\"aoRowCreatedCallback\": [],\n\t\t\n\t\t\t/**\n\t\t\t * Callback functions for just before the table is redrawn. A return of\n\t\t\t * false will be used to cancel the draw.\n\t\t\t *  @type array\n\t\t\t *  @default []\n\t\t\t */\n\t\t\t\"aoPreDrawCallback\": [],\n\t\t\n\t\t\t/**\n\t\t\t * Callback functions for when the table has been initialised.\n\t\t\t *  @type array\n\t\t\t *  @default []\n\t\t\t */\n\t\t\t\"aoInitComplete\": [],\n\t\t\n\t\t\n\t\t\t/**\n\t\t\t * Callbacks for modifying the settings to be stored for state saving, prior to\n\t\t\t * saving state.\n\t\t\t *  @type array\n\t\t\t *  @default []\n\t\t\t */\n\t\t\t\"aoStateSaveParams\": [],\n\t\t\n\t\t\t/**\n\t\t\t * Callbacks for modifying the settings that have been stored for state saving\n\t\t\t * prior to using the stored values to restore the state.\n\t\t\t *  @type array\n\t\t\t *  @default []\n\t\t\t */\n\t\t\t\"aoStateLoadParams\": [],\n\t\t\n\t\t\t/**\n\t\t\t * Callbacks for operating on the settings object once the saved state has been\n\t\t\t * loaded\n\t\t\t *  @type array\n\t\t\t *  @default []\n\t\t\t */\n\t\t\t\"aoStateLoaded\": [],\n\t\t\n\t\t\t/**\n\t\t\t * Cache the table ID for quick access\n\t\t\t *  @type string\n\t\t\t *  @default <i>Empty string</i>\n\t\t\t */\n\t\t\t\"sTableId\": \"\",\n\t\t\n\t\t\t/**\n\t\t\t * The TABLE node for the main table\n\t\t\t *  @type node\n\t\t\t *  @default null\n\t\t\t */\n\t\t\t\"nTable\": null,\n\t\t\n\t\t\t/**\n\t\t\t * Permanent ref to the thead element\n\t\t\t *  @type node\n\t\t\t *  @default null\n\t\t\t */\n\t\t\t\"nTHead\": null,\n\t\t\n\t\t\t/**\n\t\t\t * Permanent ref to the tfoot element - if it exists\n\t\t\t *  @type node\n\t\t\t *  @default null\n\t\t\t */\n\t\t\t\"nTFoot\": null,\n\t\t\n\t\t\t/**\n\t\t\t * Permanent ref to the tbody element\n\t\t\t *  @type node\n\t\t\t *  @default null\n\t\t\t */\n\t\t\t\"nTBody\": null,\n\t\t\n\t\t\t/**\n\t\t\t * Cache the wrapper node (contains all DataTables controlled elements)\n\t\t\t *  @type node\n\t\t\t *  @default null\n\t\t\t */\n\t\t\t\"nTableWrapper\": null,\n\t\t\n\t\t\t/**\n\t\t\t * Indicate if when using server-side processing the loading of data\n\t\t\t * should be deferred until the second draw.\n\t\t\t * Note that this parameter will be set by the initialisation routine. To\n\t\t\t * set a default use {@link DataTable.defaults}.\n\t\t\t *  @type boolean\n\t\t\t *  @default false\n\t\t\t */\n\t\t\t\"bDeferLoading\": false,\n\t\t\n\t\t\t/**\n\t\t\t * Indicate if all required information has been read in\n\t\t\t *  @type boolean\n\t\t\t *  @default false\n\t\t\t */\n\t\t\t\"bInitialised\": false,\n\t\t\n\t\t\t/**\n\t\t\t * Information about open rows. Each object in the array has the parameters\n\t\t\t * 'nTr' and 'nParent'\n\t\t\t *  @type array\n\t\t\t *  @default []\n\t\t\t */\n\t\t\t\"aoOpenRows\": [],\n\t\t\n\t\t\t/**\n\t\t\t * Dictate the positioning of DataTables' control elements - see\n\t\t\t * {@link DataTable.model.oInit.sDom}.\n\t\t\t * Note that this parameter will be set by the initialisation routine. To\n\t\t\t * set a default use {@link DataTable.defaults}.\n\t\t\t *  @type string\n\t\t\t *  @default null\n\t\t\t */\n\t\t\t\"sDom\": null,\n\t\t\n\t\t\t/**\n\t\t\t * Search delay (in mS)\n\t\t\t *  @type integer\n\t\t\t *  @default null\n\t\t\t */\n\t\t\t\"searchDelay\": null,\n\t\t\n\t\t\t/**\n\t\t\t * Which type of pagination should be used.\n\t\t\t * Note that this parameter will be set by the initialisation routine. To\n\t\t\t * set a default use {@link DataTable.defaults}.\n\t\t\t *  @type string\n\t\t\t *  @default two_button\n\t\t\t */\n\t\t\t\"sPaginationType\": \"two_button\",\n\t\t\n\t\t\t/**\n\t\t\t * The state duration (for `stateSave`) in seconds.\n\t\t\t * Note that this parameter will be set by the initialisation routine. To\n\t\t\t * set a default use {@link DataTable.defaults}.\n\t\t\t *  @type int\n\t\t\t *  @default 0\n\t\t\t */\n\t\t\t\"iStateDuration\": 0,\n\t\t\n\t\t\t/**\n\t\t\t * Array of callback functions for state saving. Each array element is an\n\t\t\t * object with the following parameters:\n\t\t\t *   <ul>\n\t\t\t *     <li>function:fn - function to call. Takes two parameters, oSettings\n\t\t\t *       and the JSON string to save that has been thus far created. Returns\n\t\t\t *       a JSON string to be inserted into a json object\n\t\t\t *       (i.e. '\"param\": [ 0, 1, 2]')</li>\n\t\t\t *     <li>string:sName - name of callback</li>\n\t\t\t *   </ul>\n\t\t\t *  @type array\n\t\t\t *  @default []\n\t\t\t */\n\t\t\t\"aoStateSave\": [],\n\t\t\n\t\t\t/**\n\t\t\t * Array of callback functions for state loading. Each array element is an\n\t\t\t * object with the following parameters:\n\t\t\t *   <ul>\n\t\t\t *     <li>function:fn - function to call. Takes two parameters, oSettings\n\t\t\t *       and the object stored. May return false to cancel state loading</li>\n\t\t\t *     <li>string:sName - name of callback</li>\n\t\t\t *   </ul>\n\t\t\t *  @type array\n\t\t\t *  @default []\n\t\t\t */\n\t\t\t\"aoStateLoad\": [],\n\t\t\n\t\t\t/**\n\t\t\t * State that was saved. Useful for back reference\n\t\t\t *  @type object\n\t\t\t *  @default null\n\t\t\t */\n\t\t\t\"oSavedState\": null,\n\t\t\n\t\t\t/**\n\t\t\t * State that was loaded. Useful for back reference\n\t\t\t *  @type object\n\t\t\t *  @default null\n\t\t\t */\n\t\t\t\"oLoadedState\": null,\n\t\t\n\t\t\t/**\n\t\t\t * Source url for AJAX data for the table.\n\t\t\t * Note that this parameter will be set by the initialisation routine. To\n\t\t\t * set a default use {@link DataTable.defaults}.\n\t\t\t *  @type string\n\t\t\t *  @default null\n\t\t\t */\n\t\t\t\"sAjaxSource\": null,\n\t\t\n\t\t\t/**\n\t\t\t * Property from a given object from which to read the table data from. This\n\t\t\t * can be an empty string (when not server-side processing), in which case\n\t\t\t * it is  assumed an an array is given directly.\n\t\t\t * Note that this parameter will be set by the initialisation routine. To\n\t\t\t * set a default use {@link DataTable.defaults}.\n\t\t\t *  @type string\n\t\t\t */\n\t\t\t\"sAjaxDataProp\": null,\n\t\t\n\t\t\t/**\n\t\t\t * The last jQuery XHR object that was used for server-side data gathering.\n\t\t\t * This can be used for working with the XHR information in one of the\n\t\t\t * callbacks\n\t\t\t *  @type object\n\t\t\t *  @default null\n\t\t\t */\n\t\t\t\"jqXHR\": null,\n\t\t\n\t\t\t/**\n\t\t\t * JSON returned from the server in the last Ajax request\n\t\t\t *  @type object\n\t\t\t *  @default undefined\n\t\t\t */\n\t\t\t\"json\": undefined,\n\t\t\n\t\t\t/**\n\t\t\t * Data submitted as part of the last Ajax request\n\t\t\t *  @type object\n\t\t\t *  @default undefined\n\t\t\t */\n\t\t\t\"oAjaxData\": undefined,\n\t\t\n\t\t\t/**\n\t\t\t * Function to get the server-side data.\n\t\t\t * Note that this parameter will be set by the initialisation routine. To\n\t\t\t * set a default use {@link DataTable.defaults}.\n\t\t\t *  @type function\n\t\t\t */\n\t\t\t\"fnServerData\": null,\n\t\t\n\t\t\t/**\n\t\t\t * Functions which are called prior to sending an Ajax request so extra\n\t\t\t * parameters can easily be sent to the server\n\t\t\t *  @type array\n\t\t\t *  @default []\n\t\t\t */\n\t\t\t\"aoServerParams\": [],\n\t\t\n\t\t\t/**\n\t\t\t * Send the XHR HTTP method - GET or POST (could be PUT or DELETE if\n\t\t\t * required).\n\t\t\t * Note that this parameter will be set by the initialisation routine. To\n\t\t\t * set a default use {@link DataTable.defaults}.\n\t\t\t *  @type string\n\t\t\t */\n\t\t\t\"sServerMethod\": null,\n\t\t\n\t\t\t/**\n\t\t\t * Format numbers for display.\n\t\t\t * Note that this parameter will be set by the initialisation routine. To\n\t\t\t * set a default use {@link DataTable.defaults}.\n\t\t\t *  @type function\n\t\t\t */\n\t\t\t\"fnFormatNumber\": null,\n\t\t\n\t\t\t/**\n\t\t\t * List of options that can be used for the user selectable length menu.\n\t\t\t * Note that this parameter will be set by the initialisation routine. To\n\t\t\t * set a default use {@link DataTable.defaults}.\n\t\t\t *  @type array\n\t\t\t *  @default []\n\t\t\t */\n\t\t\t\"aLengthMenu\": null,\n\t\t\n\t\t\t/**\n\t\t\t * Counter for the draws that the table does. Also used as a tracker for\n\t\t\t * server-side processing\n\t\t\t *  @type int\n\t\t\t *  @default 0\n\t\t\t */\n\t\t\t\"iDraw\": 0,\n\t\t\n\t\t\t/**\n\t\t\t * Indicate if a redraw is being done - useful for Ajax\n\t\t\t *  @type boolean\n\t\t\t *  @default false\n\t\t\t */\n\t\t\t\"bDrawing\": false,\n\t\t\n\t\t\t/**\n\t\t\t * Draw index (iDraw) of the last error when parsing the returned data\n\t\t\t *  @type int\n\t\t\t *  @default -1\n\t\t\t */\n\t\t\t\"iDrawError\": -1,\n\t\t\n\t\t\t/**\n\t\t\t * Paging display length\n\t\t\t *  @type int\n\t\t\t *  @default 10\n\t\t\t */\n\t\t\t\"_iDisplayLength\": 10,\n\t\t\n\t\t\t/**\n\t\t\t * Paging start point - aiDisplay index\n\t\t\t *  @type int\n\t\t\t *  @default 0\n\t\t\t */\n\t\t\t\"_iDisplayStart\": 0,\n\t\t\n\t\t\t/**\n\t\t\t * Server-side processing - number of records in the result set\n\t\t\t * (i.e. before filtering), Use fnRecordsTotal rather than\n\t\t\t * this property to get the value of the number of records, regardless of\n\t\t\t * the server-side processing setting.\n\t\t\t *  @type int\n\t\t\t *  @default 0\n\t\t\t *  @private\n\t\t\t */\n\t\t\t\"_iRecordsTotal\": 0,\n\t\t\n\t\t\t/**\n\t\t\t * Server-side processing - number of records in the current display set\n\t\t\t * (i.e. after filtering). Use fnRecordsDisplay rather than\n\t\t\t * this property to get the value of the number of records, regardless of\n\t\t\t * the server-side processing setting.\n\t\t\t *  @type boolean\n\t\t\t *  @default 0\n\t\t\t *  @private\n\t\t\t */\n\t\t\t\"_iRecordsDisplay\": 0,\n\t\t\n\t\t\t/**\n\t\t\t * The classes to use for the table\n\t\t\t *  @type object\n\t\t\t *  @default {}\n\t\t\t */\n\t\t\t\"oClasses\": {},\n\t\t\n\t\t\t/**\n\t\t\t * Flag attached to the settings object so you can check in the draw\n\t\t\t * callback if filtering has been done in the draw. Deprecated in favour of\n\t\t\t * events.\n\t\t\t *  @type boolean\n\t\t\t *  @default false\n\t\t\t *  @deprecated\n\t\t\t */\n\t\t\t\"bFiltered\": false,\n\t\t\n\t\t\t/**\n\t\t\t * Flag attached to the settings object so you can check in the draw\n\t\t\t * callback if sorting has been done in the draw. Deprecated in favour of\n\t\t\t * events.\n\t\t\t *  @type boolean\n\t\t\t *  @default false\n\t\t\t *  @deprecated\n\t\t\t */\n\t\t\t\"bSorted\": false,\n\t\t\n\t\t\t/**\n\t\t\t * Indicate that if multiple rows are in the header and there is more than\n\t\t\t * one unique cell per column, if the top one (true) or bottom one (false)\n\t\t\t * should be used for sorting / title by DataTables.\n\t\t\t * Note that this parameter will be set by the initialisation routine. To\n\t\t\t * set a default use {@link DataTable.defaults}.\n\t\t\t *  @type boolean\n\t\t\t */\n\t\t\t\"bSortCellsTop\": null,\n\t\t\n\t\t\t/**\n\t\t\t * Initialisation object that is used for the table\n\t\t\t *  @type object\n\t\t\t *  @default null\n\t\t\t */\n\t\t\t\"oInit\": null,\n\t\t\n\t\t\t/**\n\t\t\t * Destroy callback functions - for plug-ins to attach themselves to the\n\t\t\t * destroy so they can clean up markup and events.\n\t\t\t *  @type array\n\t\t\t *  @default []\n\t\t\t */\n\t\t\t\"aoDestroyCallback\": [],\n\t\t\n\t\t\n\t\t\t/**\n\t\t\t * Get the number of records in the current record set, before filtering\n\t\t\t *  @type function\n\t\t\t */\n\t\t\t\"fnRecordsTotal\": function ()\n\t\t\t{\n\t\t\t\treturn _fnDataSource( this ) == 'ssp' ?\n\t\t\t\t\tthis._iRecordsTotal * 1 :\n\t\t\t\t\tthis.aiDisplayMaster.length;\n\t\t\t},\n\t\t\n\t\t\t/**\n\t\t\t * Get the number of records in the current record set, after filtering\n\t\t\t *  @type function\n\t\t\t */\n\t\t\t\"fnRecordsDisplay\": function ()\n\t\t\t{\n\t\t\t\treturn _fnDataSource( this ) == 'ssp' ?\n\t\t\t\t\tthis._iRecordsDisplay * 1 :\n\t\t\t\t\tthis.aiDisplay.length;\n\t\t\t},\n\t\t\n\t\t\t/**\n\t\t\t * Get the display end point - aiDisplay index\n\t\t\t *  @type function\n\t\t\t */\n\t\t\t\"fnDisplayEnd\": function ()\n\t\t\t{\n\t\t\t\tvar\n\t\t\t\t\tlen      = this._iDisplayLength,\n\t\t\t\t\tstart    = this._iDisplayStart,\n\t\t\t\t\tcalc     = start + len,\n\t\t\t\t\trecords  = this.aiDisplay.length,\n\t\t\t\t\tfeatures = this.oFeatures,\n\t\t\t\t\tpaginate = features.bPaginate;\n\t\t\n\t\t\t\tif ( features.bServerSide ) {\n\t\t\t\t\treturn paginate === false || len === -1 ?\n\t\t\t\t\t\tstart + records :\n\t\t\t\t\t\tMath.min( start+len, this._iRecordsDisplay );\n\t\t\t\t}\n\t\t\t\telse {\n\t\t\t\t\treturn ! paginate || calc>records || len===-1 ?\n\t\t\t\t\t\trecords :\n\t\t\t\t\t\tcalc;\n\t\t\t\t}\n\t\t\t},\n\t\t\n\t\t\t/**\n\t\t\t * The DataTables object for this table\n\t\t\t *  @type object\n\t\t\t *  @default null\n\t\t\t */\n\t\t\t\"oInstance\": null,\n\t\t\n\t\t\t/**\n\t\t\t * Unique identifier for each instance of the DataTables object. If there\n\t\t\t * is an ID on the table node, then it takes that value, otherwise an\n\t\t\t * incrementing internal counter is used.\n\t\t\t *  @type string\n\t\t\t *  @default null\n\t\t\t */\n\t\t\t\"sInstance\": null,\n\t\t\n\t\t\t/**\n\t\t\t * tabindex attribute value that is added to DataTables control elements, allowing\n\t\t\t * keyboard navigation of the table and its controls.\n\t\t\t */\n\t\t\t\"iTabIndex\": 0,\n\t\t\n\t\t\t/**\n\t\t\t * DIV container for the footer scrolling table if scrolling\n\t\t\t */\n\t\t\t\"nScrollHead\": null,\n\t\t\n\t\t\t/**\n\t\t\t * DIV container for the footer scrolling table if scrolling\n\t\t\t */\n\t\t\t\"nScrollFoot\": null,\n\t\t\n\t\t\t/**\n\t\t\t * Last applied sort\n\t\t\t *  @type array\n\t\t\t *  @default []\n\t\t\t */\n\t\t\t\"aLastSort\": [],\n\t\t\n\t\t\t/**\n\t\t\t * Stored plug-in instances\n\t\t\t *  @type object\n\t\t\t *  @default {}\n\t\t\t */\n\t\t\t\"oPlugins\": {},\n\t\t\n\t\t\t/**\n\t\t\t * Function used to get a row's id from the row's data\n\t\t\t *  @type function\n\t\t\t *  @default null\n\t\t\t */\n\t\t\t\"rowIdFn\": null,\n\t\t\n\t\t\t/**\n\t\t\t * Data location where to store a row's id\n\t\t\t *  @type string\n\t\t\t *  @default null\n\t\t\t */\n\t\t\t\"rowId\": null\n\t\t};\n\t\t\n\t\t/**\n\t\t * Extension object for DataTables that is used to provide all extension\n\t\t * options.\n\t\t *\n\t\t * Note that the `DataTable.ext` object is available through\n\t\t * `jQuery.fn.dataTable.ext` where it may be accessed and manipulated. It is\n\t\t * also aliased to `jQuery.fn.dataTableExt` for historic reasons.\n\t\t *  @namespace\n\t\t *  @extends DataTable.models.ext\n\t\t */\n\t\t\n\t\t\n\t\t/**\n\t\t * DataTables extensions\n\t\t * \n\t\t * This namespace acts as a collection area for plug-ins that can be used to\n\t\t * extend DataTables capabilities. Indeed many of the build in methods\n\t\t * use this method to provide their own capabilities (sorting methods for\n\t\t * example).\n\t\t *\n\t\t * Note that this namespace is aliased to `jQuery.fn.dataTableExt` for legacy\n\t\t * reasons\n\t\t *\n\t\t *  @namespace\n\t\t */\n\t\tDataTable.ext = _ext = {\n\t\t\t/**\n\t\t\t * Buttons. For use with the Buttons extension for DataTables. This is\n\t\t\t * defined here so other extensions can define buttons regardless of load\n\t\t\t * order. It is _not_ used by DataTables core.\n\t\t\t *\n\t\t\t *  @type object\n\t\t\t *  @default {}\n\t\t\t */\n\t\t\tbuttons: {},\n\t\t\n\t\t\n\t\t\t/**\n\t\t\t * Element class names\n\t\t\t *\n\t\t\t *  @type object\n\t\t\t *  @default {}\n\t\t\t */\n\t\t\tclasses: {},\n\t\t\n\t\t\n\t\t\t/**\n\t\t\t * DataTables build type (expanded by the download builder)\n\t\t\t *\n\t\t\t *  @type string\n\t\t\t */\n\t\t\tbuilder: \"-source-\",\n\t\t\n\t\t\n\t\t\t/**\n\t\t\t * Error reporting.\n\t\t\t * \n\t\t\t * How should DataTables report an error. Can take the value 'alert',\n\t\t\t * 'throw', 'none' or a function.\n\t\t\t *\n\t\t\t *  @type string|function\n\t\t\t *  @default alert\n\t\t\t */\n\t\t\terrMode: \"alert\",\n\t\t\n\t\t\n\t\t\t/**\n\t\t\t * Feature plug-ins.\n\t\t\t * \n\t\t\t * This is an array of objects which describe the feature plug-ins that are\n\t\t\t * available to DataTables. These feature plug-ins are then available for\n\t\t\t * use through the `dom` initialisation option.\n\t\t\t * \n\t\t\t * Each feature plug-in is described by an object which must have the\n\t\t\t * following properties:\n\t\t\t * \n\t\t\t * * `fnInit` - function that is used to initialise the plug-in,\n\t\t\t * * `cFeature` - a character so the feature can be enabled by the `dom`\n\t\t\t *   instillation option. This is case sensitive.\n\t\t\t *\n\t\t\t * The `fnInit` function has the following input parameters:\n\t\t\t *\n\t\t\t * 1. `{object}` DataTables settings object: see\n\t\t\t *    {@link DataTable.models.oSettings}\n\t\t\t *\n\t\t\t * And the following return is expected:\n\t\t\t * \n\t\t\t * * {node|null} The element which contains your feature. Note that the\n\t\t\t *   return may also be void if your plug-in does not require to inject any\n\t\t\t *   DOM elements into DataTables control (`dom`) - for example this might\n\t\t\t *   be useful when developing a plug-in which allows table control via\n\t\t\t *   keyboard entry\n\t\t\t *\n\t\t\t *  @type array\n\t\t\t *\n\t\t\t *  @example\n\t\t\t *    $.fn.dataTable.ext.features.push( {\n\t\t\t *      \"fnInit\": function( oSettings ) {\n\t\t\t *        return new TableTools( { \"oDTSettings\": oSettings } );\n\t\t\t *      },\n\t\t\t *      \"cFeature\": \"T\"\n\t\t\t *    } );\n\t\t\t */\n\t\t\tfeature: [],\n\t\t\n\t\t\n\t\t\t/**\n\t\t\t * Row searching.\n\t\t\t * \n\t\t\t * This method of searching is complimentary to the default type based\n\t\t\t * searching, and a lot more comprehensive as it allows you complete control\n\t\t\t * over the searching logic. Each element in this array is a function\n\t\t\t * (parameters described below) that is called for every row in the table,\n\t\t\t * and your logic decides if it should be included in the searching data set\n\t\t\t * or not.\n\t\t\t *\n\t\t\t * Searching functions have the following input parameters:\n\t\t\t *\n\t\t\t * 1. `{object}` DataTables settings object: see\n\t\t\t *    {@link DataTable.models.oSettings}\n\t\t\t * 2. `{array|object}` Data for the row to be processed (same as the\n\t\t\t *    original format that was passed in as the data source, or an array\n\t\t\t *    from a DOM data source\n\t\t\t * 3. `{int}` Row index ({@link DataTable.models.oSettings.aoData}), which\n\t\t\t *    can be useful to retrieve the `TR` element if you need DOM interaction.\n\t\t\t *\n\t\t\t * And the following return is expected:\n\t\t\t *\n\t\t\t * * {boolean} Include the row in the searched result set (true) or not\n\t\t\t *   (false)\n\t\t\t *\n\t\t\t * Note that as with the main search ability in DataTables, technically this\n\t\t\t * is \"filtering\", since it is subtractive. However, for consistency in\n\t\t\t * naming we call it searching here.\n\t\t\t *\n\t\t\t *  @type array\n\t\t\t *  @default []\n\t\t\t *\n\t\t\t *  @example\n\t\t\t *    // The following example shows custom search being applied to the\n\t\t\t *    // fourth column (i.e. the data[3] index) based on two input values\n\t\t\t *    // from the end-user, matching the data in a certain range.\n\t\t\t *    $.fn.dataTable.ext.search.push(\n\t\t\t *      function( settings, data, dataIndex ) {\n\t\t\t *        var min = document.getElementById('min').value * 1;\n\t\t\t *        var max = document.getElementById('max').value * 1;\n\t\t\t *        var version = data[3] == \"-\" ? 0 : data[3]*1;\n\t\t\t *\n\t\t\t *        if ( min == \"\" && max == \"\" ) {\n\t\t\t *          return true;\n\t\t\t *        }\n\t\t\t *        else if ( min == \"\" && version < max ) {\n\t\t\t *          return true;\n\t\t\t *        }\n\t\t\t *        else if ( min < version && \"\" == max ) {\n\t\t\t *          return true;\n\t\t\t *        }\n\t\t\t *        else if ( min < version && version < max ) {\n\t\t\t *          return true;\n\t\t\t *        }\n\t\t\t *        return false;\n\t\t\t *      }\n\t\t\t *    );\n\t\t\t */\n\t\t\tsearch: [],\n\t\t\n\t\t\n\t\t\t/**\n\t\t\t * Selector extensions\n\t\t\t *\n\t\t\t * The `selector` option can be used to extend the options available for the\n\t\t\t * selector modifier options (`selector-modifier` object data type) that\n\t\t\t * each of the three built in selector types offer (row, column and cell +\n\t\t\t * their plural counterparts). For example the Select extension uses this\n\t\t\t * mechanism to provide an option to select only rows, columns and cells\n\t\t\t * that have been marked as selected by the end user (`{selected: true}`),\n\t\t\t * which can be used in conjunction with the existing built in selector\n\t\t\t * options.\n\t\t\t *\n\t\t\t * Each property is an array to which functions can be pushed. The functions\n\t\t\t * take three attributes:\n\t\t\t *\n\t\t\t * * Settings object for the host table\n\t\t\t * * Options object (`selector-modifier` object type)\n\t\t\t * * Array of selected item indexes\n\t\t\t *\n\t\t\t * The return is an array of the resulting item indexes after the custom\n\t\t\t * selector has been applied.\n\t\t\t *\n\t\t\t *  @type object\n\t\t\t */\n\t\t\tselector: {\n\t\t\t\tcell: [],\n\t\t\t\tcolumn: [],\n\t\t\t\trow: []\n\t\t\t},\n\t\t\n\t\t\n\t\t\t/**\n\t\t\t * Internal functions, exposed for used in plug-ins.\n\t\t\t * \n\t\t\t * Please note that you should not need to use the internal methods for\n\t\t\t * anything other than a plug-in (and even then, try to avoid if possible).\n\t\t\t * The internal function may change between releases.\n\t\t\t *\n\t\t\t *  @type object\n\t\t\t *  @default {}\n\t\t\t */\n\t\t\tinternal: {},\n\t\t\n\t\t\n\t\t\t/**\n\t\t\t * Legacy configuration options. Enable and disable legacy options that\n\t\t\t * are available in DataTables.\n\t\t\t *\n\t\t\t *  @type object\n\t\t\t */\n\t\t\tlegacy: {\n\t\t\t\t/**\n\t\t\t\t * Enable / disable DataTables 1.9 compatible server-side processing\n\t\t\t\t * requests\n\t\t\t\t *\n\t\t\t\t *  @type boolean\n\t\t\t\t *  @default null\n\t\t\t\t */\n\t\t\t\tajax: null\n\t\t\t},\n\t\t\n\t\t\n\t\t\t/**\n\t\t\t * Pagination plug-in methods.\n\t\t\t * \n\t\t\t * Each entry in this object is a function and defines which buttons should\n\t\t\t * be shown by the pagination rendering method that is used for the table:\n\t\t\t * {@link DataTable.ext.renderer.pageButton}. The renderer addresses how the\n\t\t\t * buttons are displayed in the document, while the functions here tell it\n\t\t\t * what buttons to display. This is done by returning an array of button\n\t\t\t * descriptions (what each button will do).\n\t\t\t *\n\t\t\t * Pagination types (the four built in options and any additional plug-in\n\t\t\t * options defined here) can be used through the `paginationType`\n\t\t\t * initialisation parameter.\n\t\t\t *\n\t\t\t * The functions defined take two parameters:\n\t\t\t *\n\t\t\t * 1. `{int} page` The current page index\n\t\t\t * 2. `{int} pages` The number of pages in the table\n\t\t\t *\n\t\t\t * Each function is expected to return an array where each element of the\n\t\t\t * array can be one of:\n\t\t\t *\n\t\t\t * * `first` - Jump to first page when activated\n\t\t\t * * `last` - Jump to last page when activated\n\t\t\t * * `previous` - Show previous page when activated\n\t\t\t * * `next` - Show next page when activated\n\t\t\t * * `{int}` - Show page of the index given\n\t\t\t * * `{array}` - A nested array containing the above elements to add a\n\t\t\t *   containing 'DIV' element (might be useful for styling).\n\t\t\t *\n\t\t\t * Note that DataTables v1.9- used this object slightly differently whereby\n\t\t\t * an object with two functions would be defined for each plug-in. That\n\t\t\t * ability is still supported by DataTables 1.10+ to provide backwards\n\t\t\t * compatibility, but this option of use is now decremented and no longer\n\t\t\t * documented in DataTables 1.10+.\n\t\t\t *\n\t\t\t *  @type object\n\t\t\t *  @default {}\n\t\t\t *\n\t\t\t *  @example\n\t\t\t *    // Show previous, next and current page buttons only\n\t\t\t *    $.fn.dataTableExt.oPagination.current = function ( page, pages ) {\n\t\t\t *      return [ 'previous', page, 'next' ];\n\t\t\t *    };\n\t\t\t */\n\t\t\tpager: {},\n\t\t\n\t\t\n\t\t\trenderer: {\n\t\t\t\tpageButton: {},\n\t\t\t\theader: {}\n\t\t\t},\n\t\t\n\t\t\n\t\t\t/**\n\t\t\t * Ordering plug-ins - custom data source\n\t\t\t * \n\t\t\t * The extension options for ordering of data available here is complimentary\n\t\t\t * to the default type based ordering that DataTables typically uses. It\n\t\t\t * allows much greater control over the the data that is being used to\n\t\t\t * order a column, but is necessarily therefore more complex.\n\t\t\t * \n\t\t\t * This type of ordering is useful if you want to do ordering based on data\n\t\t\t * live from the DOM (for example the contents of an 'input' element) rather\n\t\t\t * than just the static string that DataTables knows of.\n\t\t\t * \n\t\t\t * The way these plug-ins work is that you create an array of the values you\n\t\t\t * wish to be ordering for the column in question and then return that\n\t\t\t * array. The data in the array much be in the index order of the rows in\n\t\t\t * the table (not the currently ordering order!). Which order data gathering\n\t\t\t * function is run here depends on the `dt-init columns.orderDataType`\n\t\t\t * parameter that is used for the column (if any).\n\t\t\t *\n\t\t\t * The functions defined take two parameters:\n\t\t\t *\n\t\t\t * 1. `{object}` DataTables settings object: see\n\t\t\t *    {@link DataTable.models.oSettings}\n\t\t\t * 2. `{int}` Target column index\n\t\t\t *\n\t\t\t * Each function is expected to return an array:\n\t\t\t *\n\t\t\t * * `{array}` Data for the column to be ordering upon\n\t\t\t *\n\t\t\t *  @type array\n\t\t\t *\n\t\t\t *  @example\n\t\t\t *    // Ordering using `input` node values\n\t\t\t *    $.fn.dataTable.ext.order['dom-text'] = function  ( settings, col )\n\t\t\t *    {\n\t\t\t *      return this.api().column( col, {order:'index'} ).nodes().map( function ( td, i ) {\n\t\t\t *        return $('input', td).val();\n\t\t\t *      } );\n\t\t\t *    }\n\t\t\t */\n\t\t\torder: {},\n\t\t\n\t\t\n\t\t\t/**\n\t\t\t * Type based plug-ins.\n\t\t\t *\n\t\t\t * Each column in DataTables has a type assigned to it, either by automatic\n\t\t\t * detection or by direct assignment using the `type` option for the column.\n\t\t\t * The type of a column will effect how it is ordering and search (plug-ins\n\t\t\t * can also make use of the column type if required).\n\t\t\t *\n\t\t\t * @namespace\n\t\t\t */\n\t\t\ttype: {\n\t\t\t\t/**\n\t\t\t\t * Type detection functions.\n\t\t\t\t *\n\t\t\t\t * The functions defined in this object are used to automatically detect\n\t\t\t\t * a column's type, making initialisation of DataTables super easy, even\n\t\t\t\t * when complex data is in the table.\n\t\t\t\t *\n\t\t\t\t * The functions defined take two parameters:\n\t\t\t\t *\n\t\t\t     *  1. `{*}` Data from the column cell to be analysed\n\t\t\t     *  2. `{settings}` DataTables settings object. This can be used to\n\t\t\t     *     perform context specific type detection - for example detection\n\t\t\t     *     based on language settings such as using a comma for a decimal\n\t\t\t     *     place. Generally speaking the options from the settings will not\n\t\t\t     *     be required\n\t\t\t\t *\n\t\t\t\t * Each function is expected to return:\n\t\t\t\t *\n\t\t\t\t * * `{string|null}` Data type detected, or null if unknown (and thus\n\t\t\t\t *   pass it on to the other type detection functions.\n\t\t\t\t *\n\t\t\t\t *  @type array\n\t\t\t\t *\n\t\t\t\t *  @example\n\t\t\t\t *    // Currency type detection plug-in:\n\t\t\t\t *    $.fn.dataTable.ext.type.detect.push(\n\t\t\t\t *      function ( data, settings ) {\n\t\t\t\t *        // Check the numeric part\n\t\t\t\t *        if ( ! data.substring(1).match(/[0-9]/) ) {\n\t\t\t\t *          return null;\n\t\t\t\t *        }\n\t\t\t\t *\n\t\t\t\t *        // Check prefixed by currency\n\t\t\t\t *        if ( data.charAt(0) == '$' || data.charAt(0) == '&pound;' ) {\n\t\t\t\t *          return 'currency';\n\t\t\t\t *        }\n\t\t\t\t *        return null;\n\t\t\t\t *      }\n\t\t\t\t *    );\n\t\t\t\t */\n\t\t\t\tdetect: [],\n\t\t\n\t\t\n\t\t\t\t/**\n\t\t\t\t * Type based search formatting.\n\t\t\t\t *\n\t\t\t\t * The type based searching functions can be used to pre-format the\n\t\t\t\t * data to be search on. For example, it can be used to strip HTML\n\t\t\t\t * tags or to de-format telephone numbers for numeric only searching.\n\t\t\t\t *\n\t\t\t\t * Note that is a search is not defined for a column of a given type,\n\t\t\t\t * no search formatting will be performed.\n\t\t\t\t * \n\t\t\t\t * Pre-processing of searching data plug-ins - When you assign the sType\n\t\t\t\t * for a column (or have it automatically detected for you by DataTables\n\t\t\t\t * or a type detection plug-in), you will typically be using this for\n\t\t\t\t * custom sorting, but it can also be used to provide custom searching\n\t\t\t\t * by allowing you to pre-processing the data and returning the data in\n\t\t\t\t * the format that should be searched upon. This is done by adding\n\t\t\t\t * functions this object with a parameter name which matches the sType\n\t\t\t\t * for that target column. This is the corollary of <i>afnSortData</i>\n\t\t\t\t * for searching data.\n\t\t\t\t *\n\t\t\t\t * The functions defined take a single parameter:\n\t\t\t\t *\n\t\t\t     *  1. `{*}` Data from the column cell to be prepared for searching\n\t\t\t\t *\n\t\t\t\t * Each function is expected to return:\n\t\t\t\t *\n\t\t\t\t * * `{string|null}` Formatted string that will be used for the searching.\n\t\t\t\t *\n\t\t\t\t *  @type object\n\t\t\t\t *  @default {}\n\t\t\t\t *\n\t\t\t\t *  @example\n\t\t\t\t *    $.fn.dataTable.ext.type.search['title-numeric'] = function ( d ) {\n\t\t\t\t *      return d.replace(/\\n/g,\" \").replace( /<.*?>/g, \"\" );\n\t\t\t\t *    }\n\t\t\t\t */\n\t\t\t\tsearch: {},\n\t\t\n\t\t\n\t\t\t\t/**\n\t\t\t\t * Type based ordering.\n\t\t\t\t *\n\t\t\t\t * The column type tells DataTables what ordering to apply to the table\n\t\t\t\t * when a column is sorted upon. The order for each type that is defined,\n\t\t\t\t * is defined by the functions available in this object.\n\t\t\t\t *\n\t\t\t\t * Each ordering option can be described by three properties added to\n\t\t\t\t * this object:\n\t\t\t\t *\n\t\t\t\t * * `{type}-pre` - Pre-formatting function\n\t\t\t\t * * `{type}-asc` - Ascending order function\n\t\t\t\t * * `{type}-desc` - Descending order function\n\t\t\t\t *\n\t\t\t\t * All three can be used together, only `{type}-pre` or only\n\t\t\t\t * `{type}-asc` and `{type}-desc` together. It is generally recommended\n\t\t\t\t * that only `{type}-pre` is used, as this provides the optimal\n\t\t\t\t * implementation in terms of speed, although the others are provided\n\t\t\t\t * for compatibility with existing Javascript sort functions.\n\t\t\t\t *\n\t\t\t\t * `{type}-pre`: Functions defined take a single parameter:\n\t\t\t\t *\n\t\t\t     *  1. `{*}` Data from the column cell to be prepared for ordering\n\t\t\t\t *\n\t\t\t\t * And return:\n\t\t\t\t *\n\t\t\t\t * * `{*}` Data to be sorted upon\n\t\t\t\t *\n\t\t\t\t * `{type}-asc` and `{type}-desc`: Functions are typical Javascript sort\n\t\t\t\t * functions, taking two parameters:\n\t\t\t\t *\n\t\t\t     *  1. `{*}` Data to compare to the second parameter\n\t\t\t     *  2. `{*}` Data to compare to the first parameter\n\t\t\t\t *\n\t\t\t\t * And returning:\n\t\t\t\t *\n\t\t\t\t * * `{*}` Ordering match: <0 if first parameter should be sorted lower\n\t\t\t\t *   than the second parameter, ===0 if the two parameters are equal and\n\t\t\t\t *   >0 if the first parameter should be sorted height than the second\n\t\t\t\t *   parameter.\n\t\t\t\t * \n\t\t\t\t *  @type object\n\t\t\t\t *  @default {}\n\t\t\t\t *\n\t\t\t\t *  @example\n\t\t\t\t *    // Numeric ordering of formatted numbers with a pre-formatter\n\t\t\t\t *    $.extend( $.fn.dataTable.ext.type.order, {\n\t\t\t\t *      \"string-pre\": function(x) {\n\t\t\t\t *        a = (a === \"-\" || a === \"\") ? 0 : a.replace( /[^\\d\\-\\.]/g, \"\" );\n\t\t\t\t *        return parseFloat( a );\n\t\t\t\t *      }\n\t\t\t\t *    } );\n\t\t\t\t *\n\t\t\t\t *  @example\n\t\t\t\t *    // Case-sensitive string ordering, with no pre-formatting method\n\t\t\t\t *    $.extend( $.fn.dataTable.ext.order, {\n\t\t\t\t *      \"string-case-asc\": function(x,y) {\n\t\t\t\t *        return ((x < y) ? -1 : ((x > y) ? 1 : 0));\n\t\t\t\t *      },\n\t\t\t\t *      \"string-case-desc\": function(x,y) {\n\t\t\t\t *        return ((x < y) ? 1 : ((x > y) ? -1 : 0));\n\t\t\t\t *      }\n\t\t\t\t *    } );\n\t\t\t\t */\n\t\t\t\torder: {}\n\t\t\t},\n\t\t\n\t\t\t/**\n\t\t\t * Unique DataTables instance counter\n\t\t\t *\n\t\t\t * @type int\n\t\t\t * @private\n\t\t\t */\n\t\t\t_unique: 0,\n\t\t\n\t\t\n\t\t\t//\n\t\t\t// Depreciated\n\t\t\t// The following properties are retained for backwards compatibility only.\n\t\t\t// The should not be used in new projects and will be removed in a future\n\t\t\t// version\n\t\t\t//\n\t\t\n\t\t\t/**\n\t\t\t * Version check function.\n\t\t\t *  @type function\n\t\t\t *  @depreciated Since 1.10\n\t\t\t */\n\t\t\tfnVersionCheck: DataTable.fnVersionCheck,\n\t\t\n\t\t\n\t\t\t/**\n\t\t\t * Index for what 'this' index API functions should use\n\t\t\t *  @type int\n\t\t\t *  @deprecated Since v1.10\n\t\t\t */\n\t\t\tiApiIndex: 0,\n\t\t\n\t\t\n\t\t\t/**\n\t\t\t * jQuery UI class container\n\t\t\t *  @type object\n\t\t\t *  @deprecated Since v1.10\n\t\t\t */\n\t\t\toJUIClasses: {},\n\t\t\n\t\t\n\t\t\t/**\n\t\t\t * Software version\n\t\t\t *  @type string\n\t\t\t *  @deprecated Since v1.10\n\t\t\t */\n\t\t\tsVersion: DataTable.version\n\t\t};\n\t\t\n\t\t\n\t\t//\n\t\t// Backwards compatibility. Alias to pre 1.10 Hungarian notation counter parts\n\t\t//\n\t\t$.extend( _ext, {\n\t\t\tafnFiltering: _ext.search,\n\t\t\taTypes:       _ext.type.detect,\n\t\t\tofnSearch:    _ext.type.search,\n\t\t\toSort:        _ext.type.order,\n\t\t\tafnSortData:  _ext.order,\n\t\t\taoFeatures:   _ext.feature,\n\t\t\toApi:         _ext.internal,\n\t\t\toStdClasses:  _ext.classes,\n\t\t\toPagination:  _ext.pager\n\t\t} );\n\t\t\n\t\t\n\t\t$.extend( DataTable.ext.classes, {\n\t\t\t\"sTable\": \"dataTable\",\n\t\t\t\"sNoFooter\": \"no-footer\",\n\t\t\n\t\t\t/* Paging buttons */\n\t\t\t\"sPageButton\": \"paginate_button\",\n\t\t\t\"sPageButtonActive\": \"current\",\n\t\t\t\"sPageButtonDisabled\": \"disabled\",\n\t\t\n\t\t\t/* Striping classes */\n\t\t\t\"sStripeOdd\": \"odd\",\n\t\t\t\"sStripeEven\": \"even\",\n\t\t\n\t\t\t/* Empty row */\n\t\t\t\"sRowEmpty\": \"dataTables_empty\",\n\t\t\n\t\t\t/* Features */\n\t\t\t\"sWrapper\": \"dataTables_wrapper\",\n\t\t\t\"sFilter\": \"dataTables_filter\",\n\t\t\t\"sInfo\": \"dataTables_info\",\n\t\t\t\"sPaging\": \"dataTables_paginate paging_\", /* Note that the type is postfixed */\n\t\t\t\"sLength\": \"dataTables_length\",\n\t\t\t\"sProcessing\": \"dataTables_processing\",\n\t\t\n\t\t\t/* Sorting */\n\t\t\t\"sSortAsc\": \"sorting_asc\",\n\t\t\t\"sSortDesc\": \"sorting_desc\",\n\t\t\t\"sSortable\": \"sorting\", /* Sortable in both directions */\n\t\t\t\"sSortableAsc\": \"sorting_desc_disabled\",\n\t\t\t\"sSortableDesc\": \"sorting_asc_disabled\",\n\t\t\t\"sSortableNone\": \"sorting_disabled\",\n\t\t\t\"sSortColumn\": \"sorting_\", /* Note that an int is postfixed for the sorting order */\n\t\t\n\t\t\t/* Filtering */\n\t\t\t\"sFilterInput\": \"\",\n\t\t\n\t\t\t/* Page length */\n\t\t\t\"sLengthSelect\": \"\",\n\t\t\n\t\t\t/* Scrolling */\n\t\t\t\"sScrollWrapper\": \"dataTables_scroll\",\n\t\t\t\"sScrollHead\": \"dataTables_scrollHead\",\n\t\t\t\"sScrollHeadInner\": \"dataTables_scrollHeadInner\",\n\t\t\t\"sScrollBody\": \"dataTables_scrollBody\",\n\t\t\t\"sScrollFoot\": \"dataTables_scrollFoot\",\n\t\t\t\"sScrollFootInner\": \"dataTables_scrollFootInner\",\n\t\t\n\t\t\t/* Misc */\n\t\t\t\"sHeaderTH\": \"\",\n\t\t\t\"sFooterTH\": \"\",\n\t\t\n\t\t\t// Deprecated\n\t\t\t\"sSortJUIAsc\": \"\",\n\t\t\t\"sSortJUIDesc\": \"\",\n\t\t\t\"sSortJUI\": \"\",\n\t\t\t\"sSortJUIAscAllowed\": \"\",\n\t\t\t\"sSortJUIDescAllowed\": \"\",\n\t\t\t\"sSortJUIWrapper\": \"\",\n\t\t\t\"sSortIcon\": \"\",\n\t\t\t\"sJUIHeader\": \"\",\n\t\t\t\"sJUIFooter\": \"\"\n\t\t} );\n\t\t\n\t\t\n\t\tvar extPagination = DataTable.ext.pager;\n\t\t\n\t\tfunction _numbers ( page, pages ) {\n\t\t\tvar\n\t\t\t\tnumbers = [],\n\t\t\t\tbuttons = extPagination.numbers_length,\n\t\t\t\thalf = Math.floor( buttons / 2 ),\n\t\t\t\ti = 1;\n\t\t\n\t\t\tif ( pages <= buttons ) {\n\t\t\t\tnumbers = _range( 0, pages );\n\t\t\t}\n\t\t\telse if ( page <= half ) {\n\t\t\t\tnumbers = _range( 0, buttons-2 );\n\t\t\t\tnumbers.push( 'ellipsis' );\n\t\t\t\tnumbers.push( pages-1 );\n\t\t\t}\n\t\t\telse if ( page >= pages - 1 - half ) {\n\t\t\t\tnumbers = _range( pages-(buttons-2), pages );\n\t\t\t\tnumbers.splice( 0, 0, 'ellipsis' ); // no unshift in ie6\n\t\t\t\tnumbers.splice( 0, 0, 0 );\n\t\t\t}\n\t\t\telse {\n\t\t\t\tnumbers = _range( page-half+2, page+half-1 );\n\t\t\t\tnumbers.push( 'ellipsis' );\n\t\t\t\tnumbers.push( pages-1 );\n\t\t\t\tnumbers.splice( 0, 0, 'ellipsis' );\n\t\t\t\tnumbers.splice( 0, 0, 0 );\n\t\t\t}\n\t\t\n\t\t\tnumbers.DT_el = 'span';\n\t\t\treturn numbers;\n\t\t}\n\t\t\n\t\t\n\t\t$.extend( extPagination, {\n\t\t\tsimple: function ( page, pages ) {\n\t\t\t\treturn [ 'previous', 'next' ];\n\t\t\t},\n\t\t\n\t\t\tfull: function ( page, pages ) {\n\t\t\t\treturn [  'first', 'previous', 'next', 'last' ];\n\t\t\t},\n\t\t\n\t\t\tnumbers: function ( page, pages ) {\n\t\t\t\treturn [ _numbers(page, pages) ];\n\t\t\t},\n\t\t\n\t\t\tsimple_numbers: function ( page, pages ) {\n\t\t\t\treturn [ 'previous', _numbers(page, pages), 'next' ];\n\t\t\t},\n\t\t\n\t\t\tfull_numbers: function ( page, pages ) {\n\t\t\t\treturn [ 'first', 'previous', _numbers(page, pages), 'next', 'last' ];\n\t\t\t},\n\t\t\t\n\t\t\tfirst_last_numbers: function (page, pages) {\n\t\t \t\treturn ['first', _numbers(page, pages), 'last'];\n\t\t \t},\n\t\t\n\t\t\t// For testing and plug-ins to use\n\t\t\t_numbers: _numbers,\n\t\t\n\t\t\t// Number of number buttons (including ellipsis) to show. _Must be odd!_\n\t\t\tnumbers_length: 7\n\t\t} );\n\t\t\n\t\t\n\t\t$.extend( true, DataTable.ext.renderer, {\n\t\t\tpageButton: {\n\t\t\t\t_: function ( settings, host, idx, buttons, page, pages ) {\n\t\t\t\t\tvar classes = settings.oClasses;\n\t\t\t\t\tvar lang = settings.oLanguage.oPaginate;\n\t\t\t\t\tvar aria = settings.oLanguage.oAria.paginate || {};\n\t\t\t\t\tvar btnDisplay, btnClass, counter=0;\n\t\t\n\t\t\t\t\tvar attach = function( container, buttons ) {\n\t\t\t\t\t\tvar i, ien, node, button, tabIndex;\n\t\t\t\t\t\tvar disabledClass = classes.sPageButtonDisabled;\n\t\t\t\t\t\tvar clickHandler = function ( e ) {\n\t\t\t\t\t\t\t_fnPageChange( settings, e.data.action, true );\n\t\t\t\t\t\t};\n\t\t\n\t\t\t\t\t\tfor ( i=0, ien=buttons.length ; i<ien ; i++ ) {\n\t\t\t\t\t\t\tbutton = buttons[i];\n\t\t\n\t\t\t\t\t\t\tif ( Array.isArray( button ) ) {\n\t\t\t\t\t\t\t\tvar inner = $( '<'+(button.DT_el || 'div')+'/>' )\n\t\t\t\t\t\t\t\t\t.appendTo( container );\n\t\t\t\t\t\t\t\tattach( inner, button );\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\telse {\n\t\t\t\t\t\t\t\tbtnDisplay = null;\n\t\t\t\t\t\t\t\tbtnClass = button;\n\t\t\t\t\t\t\t\ttabIndex = settings.iTabIndex;\n\t\t\n\t\t\t\t\t\t\t\tswitch ( button ) {\n\t\t\t\t\t\t\t\t\tcase 'ellipsis':\n\t\t\t\t\t\t\t\t\t\tcontainer.append('<span class=\"ellipsis\">&#x2026;</span>');\n\t\t\t\t\t\t\t\t\t\tbreak;\n\t\t\n\t\t\t\t\t\t\t\t\tcase 'first':\n\t\t\t\t\t\t\t\t\t\tbtnDisplay = lang.sFirst;\n\t\t\n\t\t\t\t\t\t\t\t\t\tif ( page === 0 ) {\n\t\t\t\t\t\t\t\t\t\t\ttabIndex = -1;\n\t\t\t\t\t\t\t\t\t\t\tbtnClass += ' ' + disabledClass;\n\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t\tbreak;\n\t\t\n\t\t\t\t\t\t\t\t\tcase 'previous':\n\t\t\t\t\t\t\t\t\t\tbtnDisplay = lang.sPrevious;\n\t\t\n\t\t\t\t\t\t\t\t\t\tif ( page === 0 ) {\n\t\t\t\t\t\t\t\t\t\t\ttabIndex = -1;\n\t\t\t\t\t\t\t\t\t\t\tbtnClass += ' ' + disabledClass;\n\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t\tbreak;\n\t\t\n\t\t\t\t\t\t\t\t\tcase 'next':\n\t\t\t\t\t\t\t\t\t\tbtnDisplay = lang.sNext;\n\t\t\n\t\t\t\t\t\t\t\t\t\tif ( pages === 0 || page === pages-1 ) {\n\t\t\t\t\t\t\t\t\t\t\ttabIndex = -1;\n\t\t\t\t\t\t\t\t\t\t\tbtnClass += ' ' + disabledClass;\n\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t\tbreak;\n\t\t\n\t\t\t\t\t\t\t\t\tcase 'last':\n\t\t\t\t\t\t\t\t\t\tbtnDisplay = lang.sLast;\n\t\t\n\t\t\t\t\t\t\t\t\t\tif ( pages === 0 || page === pages-1 ) {\n\t\t\t\t\t\t\t\t\t\t\ttabIndex = -1;\n\t\t\t\t\t\t\t\t\t\t\tbtnClass += ' ' + disabledClass;\n\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t\tbreak;\n\t\t\n\t\t\t\t\t\t\t\t\tdefault:\n\t\t\t\t\t\t\t\t\t\tbtnDisplay = settings.fnFormatNumber( button + 1 );\n\t\t\t\t\t\t\t\t\t\tbtnClass = page === button ?\n\t\t\t\t\t\t\t\t\t\t\tclasses.sPageButtonActive : '';\n\t\t\t\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\t\t\t}\n\t\t\n\t\t\t\t\t\t\t\tif ( btnDisplay !== null ) {\n\t\t\t\t\t\t\t\t\tnode = $('<a>', {\n\t\t\t\t\t\t\t\t\t\t\t'class': classes.sPageButton+' '+btnClass,\n\t\t\t\t\t\t\t\t\t\t\t'aria-controls': settings.sTableId,\n\t\t\t\t\t\t\t\t\t\t\t'aria-label': aria[ button ],\n\t\t\t\t\t\t\t\t\t\t\t'data-dt-idx': counter,\n\t\t\t\t\t\t\t\t\t\t\t'tabindex': tabIndex,\n\t\t\t\t\t\t\t\t\t\t\t'id': idx === 0 && typeof button === 'string' ?\n\t\t\t\t\t\t\t\t\t\t\t\tsettings.sTableId +'_'+ button :\n\t\t\t\t\t\t\t\t\t\t\t\tnull\n\t\t\t\t\t\t\t\t\t\t} )\n\t\t\t\t\t\t\t\t\t\t.html( btnDisplay )\n\t\t\t\t\t\t\t\t\t\t.appendTo( container );\n\t\t\n\t\t\t\t\t\t\t\t\t_fnBindAction(\n\t\t\t\t\t\t\t\t\t\tnode, {action: button}, clickHandler\n\t\t\t\t\t\t\t\t\t);\n\t\t\n\t\t\t\t\t\t\t\t\tcounter++;\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t};\n\t\t\n\t\t\t\t\t// IE9 throws an 'unknown error' if document.activeElement is used\n\t\t\t\t\t// inside an iframe or frame. Try / catch the error. Not good for\n\t\t\t\t\t// accessibility, but neither are frames.\n\t\t\t\t\tvar activeEl;\n\t\t\n\t\t\t\t\ttry {\n\t\t\t\t\t\t// Because this approach is destroying and recreating the paging\n\t\t\t\t\t\t// elements, focus is lost on the select button which is bad for\n\t\t\t\t\t\t// accessibility. So we want to restore focus once the draw has\n\t\t\t\t\t\t// completed\n\t\t\t\t\t\tactiveEl = $(host).find(document.activeElement).data('dt-idx');\n\t\t\t\t\t}\n\t\t\t\t\tcatch (e) {}\n\t\t\n\t\t\t\t\tattach( $(host).empty(), buttons );\n\t\t\n\t\t\t\t\tif ( activeEl !== undefined ) {\n\t\t\t\t\t\t$(host).find( '[data-dt-idx='+activeEl+']' ).trigger('focus');\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t} );\n\t\t\n\t\t\n\t\t\n\t\t// Built in type detection. See model.ext.aTypes for information about\n\t\t// what is required from this methods.\n\t\t$.extend( DataTable.ext.type.detect, [\n\t\t\t// Plain numbers - first since V8 detects some plain numbers as dates\n\t\t\t// e.g. Date.parse('55') (but not all, e.g. Date.parse('22')...).\n\t\t\tfunction ( d, settings )\n\t\t\t{\n\t\t\t\tvar decimal = settings.oLanguage.sDecimal;\n\t\t\t\treturn _isNumber( d, decimal ) ? 'num'+decimal : null;\n\t\t\t},\n\t\t\n\t\t\t// Dates (only those recognised by the browser's Date.parse)\n\t\t\tfunction ( d, settings )\n\t\t\t{\n\t\t\t\t// V8 tries _very_ hard to make a string passed into `Date.parse()`\n\t\t\t\t// valid, so we need to use a regex to restrict date formats. Use a\n\t\t\t\t// plug-in for anything other than ISO8601 style strings\n\t\t\t\tif ( d && !(d instanceof Date) && ! _re_date.test(d) ) {\n\t\t\t\t\treturn null;\n\t\t\t\t}\n\t\t\t\tvar parsed = Date.parse(d);\n\t\t\t\treturn (parsed !== null && !isNaN(parsed)) || _empty(d) ? 'date' : null;\n\t\t\t},\n\t\t\n\t\t\t// Formatted numbers\n\t\t\tfunction ( d, settings )\n\t\t\t{\n\t\t\t\tvar decimal = settings.oLanguage.sDecimal;\n\t\t\t\treturn _isNumber( d, decimal, true ) ? 'num-fmt'+decimal : null;\n\t\t\t},\n\t\t\n\t\t\t// HTML numeric\n\t\t\tfunction ( d, settings )\n\t\t\t{\n\t\t\t\tvar decimal = settings.oLanguage.sDecimal;\n\t\t\t\treturn _htmlNumeric( d, decimal ) ? 'html-num'+decimal : null;\n\t\t\t},\n\t\t\n\t\t\t// HTML numeric, formatted\n\t\t\tfunction ( d, settings )\n\t\t\t{\n\t\t\t\tvar decimal = settings.oLanguage.sDecimal;\n\t\t\t\treturn _htmlNumeric( d, decimal, true ) ? 'html-num-fmt'+decimal : null;\n\t\t\t},\n\t\t\n\t\t\t// HTML (this is strict checking - there must be html)\n\t\t\tfunction ( d, settings )\n\t\t\t{\n\t\t\t\treturn _empty( d ) || (typeof d === 'string' && d.indexOf('<') !== -1) ?\n\t\t\t\t\t'html' : null;\n\t\t\t}\n\t\t] );\n\t\t\n\t\t\n\t\t\n\t\t// Filter formatting functions. See model.ext.ofnSearch for information about\n\t\t// what is required from these methods.\n\t\t// \n\t\t// Note that additional search methods are added for the html numbers and\n\t\t// html formatted numbers by `_addNumericSort()` when we know what the decimal\n\t\t// place is\n\t\t\n\t\t\n\t\t$.extend( DataTable.ext.type.search, {\n\t\t\thtml: function ( data ) {\n\t\t\t\treturn _empty(data) ?\n\t\t\t\t\tdata :\n\t\t\t\t\ttypeof data === 'string' ?\n\t\t\t\t\t\tdata\n\t\t\t\t\t\t\t.replace( _re_new_lines, \" \" )\n\t\t\t\t\t\t\t.replace( _re_html, \"\" ) :\n\t\t\t\t\t\t'';\n\t\t\t},\n\t\t\n\t\t\tstring: function ( data ) {\n\t\t\t\treturn _empty(data) ?\n\t\t\t\t\tdata :\n\t\t\t\t\ttypeof data === 'string' ?\n\t\t\t\t\t\tdata.replace( _re_new_lines, \" \" ) :\n\t\t\t\t\t\tdata;\n\t\t\t}\n\t\t} );\n\t\t\n\t\t\n\t\t\n\t\tvar __numericReplace = function ( d, decimalPlace, re1, re2 ) {\n\t\t\tif ( d !== 0 && (!d || d === '-') ) {\n\t\t\t\treturn -Infinity;\n\t\t\t}\n\t\t\n\t\t\t// If a decimal place other than `.` is used, it needs to be given to the\n\t\t\t// function so we can detect it and replace with a `.` which is the only\n\t\t\t// decimal place Javascript recognises - it is not locale aware.\n\t\t\tif ( decimalPlace ) {\n\t\t\t\td = _numToDecimal( d, decimalPlace );\n\t\t\t}\n\t\t\n\t\t\tif ( d.replace ) {\n\t\t\t\tif ( re1 ) {\n\t\t\t\t\td = d.replace( re1, '' );\n\t\t\t\t}\n\t\t\n\t\t\t\tif ( re2 ) {\n\t\t\t\t\td = d.replace( re2, '' );\n\t\t\t\t}\n\t\t\t}\n\t\t\n\t\t\treturn d * 1;\n\t\t};\n\t\t\n\t\t\n\t\t// Add the numeric 'deformatting' functions for sorting and search. This is done\n\t\t// in a function to provide an easy ability for the language options to add\n\t\t// additional methods if a non-period decimal place is used.\n\t\tfunction _addNumericSort ( decimalPlace ) {\n\t\t\t$.each(\n\t\t\t\t{\n\t\t\t\t\t// Plain numbers\n\t\t\t\t\t\"num\": function ( d ) {\n\t\t\t\t\t\treturn __numericReplace( d, decimalPlace );\n\t\t\t\t\t},\n\t\t\n\t\t\t\t\t// Formatted numbers\n\t\t\t\t\t\"num-fmt\": function ( d ) {\n\t\t\t\t\t\treturn __numericReplace( d, decimalPlace, _re_formatted_numeric );\n\t\t\t\t\t},\n\t\t\n\t\t\t\t\t// HTML numeric\n\t\t\t\t\t\"html-num\": function ( d ) {\n\t\t\t\t\t\treturn __numericReplace( d, decimalPlace, _re_html );\n\t\t\t\t\t},\n\t\t\n\t\t\t\t\t// HTML numeric, formatted\n\t\t\t\t\t\"html-num-fmt\": function ( d ) {\n\t\t\t\t\t\treturn __numericReplace( d, decimalPlace, _re_html, _re_formatted_numeric );\n\t\t\t\t\t}\n\t\t\t\t},\n\t\t\t\tfunction ( key, fn ) {\n\t\t\t\t\t// Add the ordering method\n\t\t\t\t\t_ext.type.order[ key+decimalPlace+'-pre' ] = fn;\n\t\t\n\t\t\t\t\t// For HTML types add a search formatter that will strip the HTML\n\t\t\t\t\tif ( key.match(/^html\\-/) ) {\n\t\t\t\t\t\t_ext.type.search[ key+decimalPlace ] = _ext.type.search.html;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t);\n\t\t}\n\t\t\n\t\t\n\t\t// Default sort methods\n\t\t$.extend( _ext.type.order, {\n\t\t\t// Dates\n\t\t\t\"date-pre\": function ( d ) {\n\t\t\t\tvar ts = Date.parse( d );\n\t\t\t\treturn isNaN(ts) ? -Infinity : ts;\n\t\t\t},\n\t\t\n\t\t\t// html\n\t\t\t\"html-pre\": function ( a ) {\n\t\t\t\treturn _empty(a) ?\n\t\t\t\t\t'' :\n\t\t\t\t\ta.replace ?\n\t\t\t\t\t\ta.replace( /<.*?>/g, \"\" ).toLowerCase() :\n\t\t\t\t\t\ta+'';\n\t\t\t},\n\t\t\n\t\t\t// string\n\t\t\t\"string-pre\": function ( a ) {\n\t\t\t\t// This is a little complex, but faster than always calling toString,\n\t\t\t\t// http://jsperf.com/tostring-v-check\n\t\t\t\treturn _empty(a) ?\n\t\t\t\t\t'' :\n\t\t\t\t\ttypeof a === 'string' ?\n\t\t\t\t\t\ta.toLowerCase() :\n\t\t\t\t\t\t! a.toString ?\n\t\t\t\t\t\t\t'' :\n\t\t\t\t\t\t\ta.toString();\n\t\t\t},\n\t\t\n\t\t\t// string-asc and -desc are retained only for compatibility with the old\n\t\t\t// sort methods\n\t\t\t\"string-asc\": function ( x, y ) {\n\t\t\t\treturn ((x < y) ? -1 : ((x > y) ? 1 : 0));\n\t\t\t},\n\t\t\n\t\t\t\"string-desc\": function ( x, y ) {\n\t\t\t\treturn ((x < y) ? 1 : ((x > y) ? -1 : 0));\n\t\t\t}\n\t\t} );\n\t\t\n\t\t\n\t\t// Numeric sorting types - order doesn't matter here\n\t\t_addNumericSort( '' );\n\t\t\n\t\t\n\t\t$.extend( true, DataTable.ext.renderer, {\n\t\t\theader: {\n\t\t\t\t_: function ( settings, cell, column, classes ) {\n\t\t\t\t\t// No additional mark-up required\n\t\t\t\t\t// Attach a sort listener to update on sort - note that using the\n\t\t\t\t\t// `DT` namespace will allow the event to be removed automatically\n\t\t\t\t\t// on destroy, while the `dt` namespaced event is the one we are\n\t\t\t\t\t// listening for\n\t\t\t\t\t$(settings.nTable).on( 'order.dt.DT', function ( e, ctx, sorting, columns ) {\n\t\t\t\t\t\tif ( settings !== ctx ) { // need to check this this is the host\n\t\t\t\t\t\t\treturn;               // table, not a nested one\n\t\t\t\t\t\t}\n\t\t\n\t\t\t\t\t\tvar colIdx = column.idx;\n\t\t\n\t\t\t\t\t\tcell\n\t\t\t\t\t\t\t.removeClass(\n\t\t\t\t\t\t\t\tclasses.sSortAsc +' '+\n\t\t\t\t\t\t\t\tclasses.sSortDesc\n\t\t\t\t\t\t\t)\n\t\t\t\t\t\t\t.addClass( columns[ colIdx ] == 'asc' ?\n\t\t\t\t\t\t\t\tclasses.sSortAsc : columns[ colIdx ] == 'desc' ?\n\t\t\t\t\t\t\t\t\tclasses.sSortDesc :\n\t\t\t\t\t\t\t\t\tcolumn.sSortingClass\n\t\t\t\t\t\t\t);\n\t\t\t\t\t} );\n\t\t\t\t},\n\t\t\n\t\t\t\tjqueryui: function ( settings, cell, column, classes ) {\n\t\t\t\t\t$('<div/>')\n\t\t\t\t\t\t.addClass( classes.sSortJUIWrapper )\n\t\t\t\t\t\t.append( cell.contents() )\n\t\t\t\t\t\t.append( $('<span/>')\n\t\t\t\t\t\t\t.addClass( classes.sSortIcon+' '+column.sSortingClassJUI )\n\t\t\t\t\t\t)\n\t\t\t\t\t\t.appendTo( cell );\n\t\t\n\t\t\t\t\t// Attach a sort listener to update on sort\n\t\t\t\t\t$(settings.nTable).on( 'order.dt.DT', function ( e, ctx, sorting, columns ) {\n\t\t\t\t\t\tif ( settings !== ctx ) {\n\t\t\t\t\t\t\treturn;\n\t\t\t\t\t\t}\n\t\t\n\t\t\t\t\t\tvar colIdx = column.idx;\n\t\t\n\t\t\t\t\t\tcell\n\t\t\t\t\t\t\t.removeClass( classes.sSortAsc +\" \"+classes.sSortDesc )\n\t\t\t\t\t\t\t.addClass( columns[ colIdx ] == 'asc' ?\n\t\t\t\t\t\t\t\tclasses.sSortAsc : columns[ colIdx ] == 'desc' ?\n\t\t\t\t\t\t\t\t\tclasses.sSortDesc :\n\t\t\t\t\t\t\t\t\tcolumn.sSortingClass\n\t\t\t\t\t\t\t);\n\t\t\n\t\t\t\t\t\tcell\n\t\t\t\t\t\t\t.find( 'span.'+classes.sSortIcon )\n\t\t\t\t\t\t\t.removeClass(\n\t\t\t\t\t\t\t\tclasses.sSortJUIAsc +\" \"+\n\t\t\t\t\t\t\t\tclasses.sSortJUIDesc +\" \"+\n\t\t\t\t\t\t\t\tclasses.sSortJUI +\" \"+\n\t\t\t\t\t\t\t\tclasses.sSortJUIAscAllowed +\" \"+\n\t\t\t\t\t\t\t\tclasses.sSortJUIDescAllowed\n\t\t\t\t\t\t\t)\n\t\t\t\t\t\t\t.addClass( columns[ colIdx ] == 'asc' ?\n\t\t\t\t\t\t\t\tclasses.sSortJUIAsc : columns[ colIdx ] == 'desc' ?\n\t\t\t\t\t\t\t\t\tclasses.sSortJUIDesc :\n\t\t\t\t\t\t\t\t\tcolumn.sSortingClassJUI\n\t\t\t\t\t\t\t);\n\t\t\t\t\t} );\n\t\t\t\t}\n\t\t\t}\n\t\t} );\n\t\t\n\t\t/*\n\t\t * Public helper functions. These aren't used internally by DataTables, or\n\t\t * called by any of the options passed into DataTables, but they can be used\n\t\t * externally by developers working with DataTables. They are helper functions\n\t\t * to make working with DataTables a little bit easier.\n\t\t */\n\t\t\n\t\tvar __htmlEscapeEntities = function ( d ) {\n\t\t\tif (Array.isArray(d)) {\n\t\t\t\td = d.join(',');\n\t\t\t}\n\t\t\n\t\t\treturn typeof d === 'string' ?\n\t\t\t\td\n\t\t\t\t\t.replace(/&/g, '&amp;')\n\t\t\t\t\t.replace(/</g, '&lt;')\n\t\t\t\t\t.replace(/>/g, '&gt;')\n\t\t\t\t\t.replace(/\"/g, '&quot;') :\n\t\t\t\td;\n\t\t};\n\t\t\n\t\t/**\n\t\t * Helpers for `columns.render`.\n\t\t *\n\t\t * The options defined here can be used with the `columns.render` initialisation\n\t\t * option to provide a display renderer. The following functions are defined:\n\t\t *\n\t\t * * `number` - Will format numeric data (defined by `columns.data`) for\n\t\t *   display, retaining the original unformatted data for sorting and filtering.\n\t\t *   It takes 5 parameters:\n\t\t *   * `string` - Thousands grouping separator\n\t\t *   * `string` - Decimal point indicator\n\t\t *   * `integer` - Number of decimal points to show\n\t\t *   * `string` (optional) - Prefix.\n\t\t *   * `string` (optional) - Postfix (/suffix).\n\t\t * * `text` - Escape HTML to help prevent XSS attacks. It has no optional\n\t\t *   parameters.\n\t\t *\n\t\t * @example\n\t\t *   // Column definition using the number renderer\n\t\t *   {\n\t\t *     data: \"salary\",\n\t\t *     render: $.fn.dataTable.render.number( '\\'', '.', 0, '$' )\n\t\t *   }\n\t\t *\n\t\t * @namespace\n\t\t */\n\t\tDataTable.render = {\n\t\t\tnumber: function ( thousands, decimal, precision, prefix, postfix ) {\n\t\t\t\treturn {\n\t\t\t\t\tdisplay: function ( d ) {\n\t\t\t\t\t\tif ( typeof d !== 'number' && typeof d !== 'string' ) {\n\t\t\t\t\t\t\treturn d;\n\t\t\t\t\t\t}\n\t\t\n\t\t\t\t\t\tvar negative = d < 0 ? '-' : '';\n\t\t\t\t\t\tvar flo = parseFloat( d );\n\t\t\n\t\t\t\t\t\t// If NaN then there isn't much formatting that we can do - just\n\t\t\t\t\t\t// return immediately, escaping any HTML (this was supposed to\n\t\t\t\t\t\t// be a number after all)\n\t\t\t\t\t\tif ( isNaN( flo ) ) {\n\t\t\t\t\t\t\treturn __htmlEscapeEntities( d );\n\t\t\t\t\t\t}\n\t\t\n\t\t\t\t\t\tflo = flo.toFixed( precision );\n\t\t\t\t\t\td = Math.abs( flo );\n\t\t\n\t\t\t\t\t\tvar intPart = parseInt( d, 10 );\n\t\t\t\t\t\tvar floatPart = precision ?\n\t\t\t\t\t\t\tdecimal+(d - intPart).toFixed( precision ).substring( 2 ):\n\t\t\t\t\t\t\t'';\n\t\t\n\t\t\t\t\t\t// If zero, then can't have a negative prefix\n\t\t\t\t\t\tif (intPart === 0 && parseFloat(floatPart) === 0) {\n\t\t\t\t\t\t\tnegative = '';\n\t\t\t\t\t\t}\n\t\t\n\t\t\t\t\t\treturn negative + (prefix||'') +\n\t\t\t\t\t\t\tintPart.toString().replace(\n\t\t\t\t\t\t\t\t/\\B(?=(\\d{3})+(?!\\d))/g, thousands\n\t\t\t\t\t\t\t) +\n\t\t\t\t\t\t\tfloatPart +\n\t\t\t\t\t\t\t(postfix||'');\n\t\t\t\t\t}\n\t\t\t\t};\n\t\t\t},\n\t\t\n\t\t\ttext: function () {\n\t\t\t\treturn {\n\t\t\t\t\tdisplay: __htmlEscapeEntities,\n\t\t\t\t\tfilter: __htmlEscapeEntities\n\t\t\t\t};\n\t\t\t}\n\t\t};\n\t\t\n\t\t\n\t\t/*\n\t\t * This is really a good bit rubbish this method of exposing the internal methods\n\t\t * publicly... - To be fixed in 2.0 using methods on the prototype\n\t\t */\n\t\t\n\t\t\n\t\t/**\n\t\t * Create a wrapper function for exporting an internal functions to an external API.\n\t\t *  @param {string} fn API function name\n\t\t *  @returns {function} wrapped function\n\t\t *  @memberof DataTable#internal\n\t\t */\n\t\tfunction _fnExternApiFunc (fn)\n\t\t{\n\t\t\treturn function() {\n\t\t\t\tvar args = [_fnSettingsFromNode( this[DataTable.ext.iApiIndex] )].concat(\n\t\t\t\t\tArray.prototype.slice.call(arguments)\n\t\t\t\t);\n\t\t\t\treturn DataTable.ext.internal[fn].apply( this, args );\n\t\t\t};\n\t\t}\n\t\t\n\t\t\n\t\t/**\n\t\t * Reference to internal functions for use by plug-in developers. Note that\n\t\t * these methods are references to internal functions and are considered to be\n\t\t * private. If you use these methods, be aware that they are liable to change\n\t\t * between versions.\n\t\t *  @namespace\n\t\t */\n\t\t$.extend( DataTable.ext.internal, {\n\t\t\t_fnExternApiFunc: _fnExternApiFunc,\n\t\t\t_fnBuildAjax: _fnBuildAjax,\n\t\t\t_fnAjaxUpdate: _fnAjaxUpdate,\n\t\t\t_fnAjaxParameters: _fnAjaxParameters,\n\t\t\t_fnAjaxUpdateDraw: _fnAjaxUpdateDraw,\n\t\t\t_fnAjaxDataSrc: _fnAjaxDataSrc,\n\t\t\t_fnAddColumn: _fnAddColumn,\n\t\t\t_fnColumnOptions: _fnColumnOptions,\n\t\t\t_fnAdjustColumnSizing: _fnAdjustColumnSizing,\n\t\t\t_fnVisibleToColumnIndex: _fnVisibleToColumnIndex,\n\t\t\t_fnColumnIndexToVisible: _fnColumnIndexToVisible,\n\t\t\t_fnVisbleColumns: _fnVisbleColumns,\n\t\t\t_fnGetColumns: _fnGetColumns,\n\t\t\t_fnColumnTypes: _fnColumnTypes,\n\t\t\t_fnApplyColumnDefs: _fnApplyColumnDefs,\n\t\t\t_fnHungarianMap: _fnHungarianMap,\n\t\t\t_fnCamelToHungarian: _fnCamelToHungarian,\n\t\t\t_fnLanguageCompat: _fnLanguageCompat,\n\t\t\t_fnBrowserDetect: _fnBrowserDetect,\n\t\t\t_fnAddData: _fnAddData,\n\t\t\t_fnAddTr: _fnAddTr,\n\t\t\t_fnNodeToDataIndex: _fnNodeToDataIndex,\n\t\t\t_fnNodeToColumnIndex: _fnNodeToColumnIndex,\n\t\t\t_fnGetCellData: _fnGetCellData,\n\t\t\t_fnSetCellData: _fnSetCellData,\n\t\t\t_fnSplitObjNotation: _fnSplitObjNotation,\n\t\t\t_fnGetObjectDataFn: _fnGetObjectDataFn,\n\t\t\t_fnSetObjectDataFn: _fnSetObjectDataFn,\n\t\t\t_fnGetDataMaster: _fnGetDataMaster,\n\t\t\t_fnClearTable: _fnClearTable,\n\t\t\t_fnDeleteIndex: _fnDeleteIndex,\n\t\t\t_fnInvalidate: _fnInvalidate,\n\t\t\t_fnGetRowElements: _fnGetRowElements,\n\t\t\t_fnCreateTr: _fnCreateTr,\n\t\t\t_fnBuildHead: _fnBuildHead,\n\t\t\t_fnDrawHead: _fnDrawHead,\n\t\t\t_fnDraw: _fnDraw,\n\t\t\t_fnReDraw: _fnReDraw,\n\t\t\t_fnAddOptionsHtml: _fnAddOptionsHtml,\n\t\t\t_fnDetectHeader: _fnDetectHeader,\n\t\t\t_fnGetUniqueThs: _fnGetUniqueThs,\n\t\t\t_fnFeatureHtmlFilter: _fnFeatureHtmlFilter,\n\t\t\t_fnFilterComplete: _fnFilterComplete,\n\t\t\t_fnFilterCustom: _fnFilterCustom,\n\t\t\t_fnFilterColumn: _fnFilterColumn,\n\t\t\t_fnFilter: _fnFilter,\n\t\t\t_fnFilterCreateSearch: _fnFilterCreateSearch,\n\t\t\t_fnEscapeRegex: _fnEscapeRegex,\n\t\t\t_fnFilterData: _fnFilterData,\n\t\t\t_fnFeatureHtmlInfo: _fnFeatureHtmlInfo,\n\t\t\t_fnUpdateInfo: _fnUpdateInfo,\n\t\t\t_fnInfoMacros: _fnInfoMacros,\n\t\t\t_fnInitialise: _fnInitialise,\n\t\t\t_fnInitComplete: _fnInitComplete,\n\t\t\t_fnLengthChange: _fnLengthChange,\n\t\t\t_fnFeatureHtmlLength: _fnFeatureHtmlLength,\n\t\t\t_fnFeatureHtmlPaginate: _fnFeatureHtmlPaginate,\n\t\t\t_fnPageChange: _fnPageChange,\n\t\t\t_fnFeatureHtmlProcessing: _fnFeatureHtmlProcessing,\n\t\t\t_fnProcessingDisplay: _fnProcessingDisplay,\n\t\t\t_fnFeatureHtmlTable: _fnFeatureHtmlTable,\n\t\t\t_fnScrollDraw: _fnScrollDraw,\n\t\t\t_fnApplyToChildren: _fnApplyToChildren,\n\t\t\t_fnCalculateColumnWidths: _fnCalculateColumnWidths,\n\t\t\t_fnThrottle: _fnThrottle,\n\t\t\t_fnConvertToWidth: _fnConvertToWidth,\n\t\t\t_fnGetWidestNode: _fnGetWidestNode,\n\t\t\t_fnGetMaxLenString: _fnGetMaxLenString,\n\t\t\t_fnStringToCss: _fnStringToCss,\n\t\t\t_fnSortFlatten: _fnSortFlatten,\n\t\t\t_fnSort: _fnSort,\n\t\t\t_fnSortAria: _fnSortAria,\n\t\t\t_fnSortListener: _fnSortListener,\n\t\t\t_fnSortAttachListener: _fnSortAttachListener,\n\t\t\t_fnSortingClasses: _fnSortingClasses,\n\t\t\t_fnSortData: _fnSortData,\n\t\t\t_fnSaveState: _fnSaveState,\n\t\t\t_fnLoadState: _fnLoadState,\n\t\t\t_fnImplementState: _fnImplementState,\n\t\t\t_fnSettingsFromNode: _fnSettingsFromNode,\n\t\t\t_fnLog: _fnLog,\n\t\t\t_fnMap: _fnMap,\n\t\t\t_fnBindAction: _fnBindAction,\n\t\t\t_fnCallbackReg: _fnCallbackReg,\n\t\t\t_fnCallbackFire: _fnCallbackFire,\n\t\t\t_fnLengthOverflow: _fnLengthOverflow,\n\t\t\t_fnRenderer: _fnRenderer,\n\t\t\t_fnDataSource: _fnDataSource,\n\t\t\t_fnRowAttributes: _fnRowAttributes,\n\t\t\t_fnExtend: _fnExtend,\n\t\t\t_fnCalculateEnd: function () {} // Used by a lot of plug-ins, but redundant\n\t\t\t                                // in 1.10, so this dead-end function is\n\t\t\t                                // added to prevent errors\n\t\t} );\n\t\t\n\t\t\n\t\t// jQuery access\n\t\t$.fn.dataTable = DataTable;\n\t\t\n\t\t// Provide access to the host jQuery object (circular reference)\n\t\tDataTable.$ = $;\n\t\t\n\t\t// Legacy aliases\n\t\t$.fn.dataTableSettings = DataTable.settings;\n\t\t$.fn.dataTableExt = DataTable.ext;\n\t\t\n\t\t// With a capital `D` we return a DataTables API instance rather than a\n\t\t// jQuery object\n\t\t$.fn.DataTable = function ( opts ) {\n\t\t\treturn $(this).dataTable( opts ).api();\n\t\t};\n\t\t\n\t\t// All properties that are available to $.fn.dataTable should also be\n\t\t// available on $.fn.DataTable\n\t\t$.each( DataTable, function ( prop, val ) {\n\t\t\t$.fn.DataTable[ prop ] = val;\n\t\t} );\n\t\n\t\treturn DataTable;\n}));\n\n/*!\n * angular-datatables - v0.5.7\n * https://github.com/l-lin/angular-datatables\n * License: MIT\n */\nif (typeof module !== \"undefined\" && typeof exports !== \"undefined\" && module.exports === exports) {\n    module.exports = 'datatables';\n}\n(function(window, document, $, angular) {\n\n    'use strict';\n\n    angular.module('datatables.directive', ['datatables.instances', 'datatables.renderer', 'datatables.options', 'datatables.util'])\n        .directive('datatable', dataTable);\n\n    /* @ngInject */\n    function dataTable($q, $http, $log, DTRendererFactory, DTRendererService, DTPropertyUtil) {\n        compileDirective.$inject = ['tElm'];\n        ControllerDirective.$inject = ['$scope'];\n        return {\n            restrict: 'A',\n            scope: {\n                dtOptions: '=',\n                dtColumns: '=',\n                dtColumnDefs: '=',\n                datatable: '@',\n                dtInstance: '='\n            },\n            compile: compileDirective,\n            controller: ControllerDirective\n        };\n\n        /* @ngInject */\n        function compileDirective(tElm) {\n            var _staticHTML = tElm[0].innerHTML;\n\n            return function postLink($scope, $elem, iAttrs, ctrl) {\n                function handleChanges(newVal, oldVal) {\n                    if (newVal !== oldVal) {\n                        ctrl.render($elem, ctrl.buildOptionsPromise(), _staticHTML);\n                    }\n                }\n\n                // Options can hold heavy data, and other deep/large objects.\n                // watchcollection can improve this by only watching shallowly\n                var watchFunction = iAttrs.dtDisableDeepWatchers ? '$watchCollection' : '$watch';\n                angular.forEach(['dtColumns', 'dtColumnDefs', 'dtOptions'], function(tableDefField) {\n                    $scope[watchFunction].call($scope, tableDefField, handleChanges, true);\n                });\n                DTRendererService.showLoading($elem, $scope);\n                ctrl.render($elem, ctrl.buildOptionsPromise(), _staticHTML);\n            };\n        }\n\n        /* @ngInject */\n        function ControllerDirective($scope) {\n            var _dtInstance;\n            var vm = this;\n            vm.buildOptionsPromise = buildOptionsPromise;\n            vm.render = render;\n\n            function buildOptionsPromise() {\n                var defer = $q.defer();\n                // Build options\n                $q.all([\n                    $q.when($scope.dtOptions),\n                    $q.when($scope.dtColumns),\n                    $q.when($scope.dtColumnDefs)\n                ]).then(function(results) {\n                    var dtOptions = results[0],\n                        dtColumns = results[1],\n                        dtColumnDefs = results[2];\n                    // Since Angular 1.3, the promise throws a \"Maximum call stack size exceeded\" when cloning\n                    // See https://github.com/l-lin/angular-datatables/issues/110\n                    DTPropertyUtil.deleteProperty(dtOptions, '$promise');\n                    DTPropertyUtil.deleteProperty(dtColumns, '$promise');\n                    DTPropertyUtil.deleteProperty(dtColumnDefs, '$promise');\n                    var options;\n                    if (angular.isDefined(dtOptions)) {\n                        options = {};\n                        angular.extend(options, dtOptions);\n                        // Set the columns\n                        if (angular.isArray(dtColumns)) {\n                            options.aoColumns = dtColumns;\n                        }\n\n                        // Set the column defs\n                        if (angular.isArray(dtColumnDefs)) {\n                            options.aoColumnDefs = dtColumnDefs;\n                        }\n\n                        // HACK to resolve the language source manually instead of DT\n                        // See https://github.com/l-lin/angular-datatables/issues/181\n                        if (options.language && options.language.url) {\n                            var languageDefer = $q.defer();\n                            var languageUrl = options.language.url;\n                            $http.get(options.language.url).then(function(language) {\n                                languageDefer.resolve(language);\n                            }, function() {\n                                $log.error('Could not fetch the content of the language from ' + languageUrl);\n                            });\n                            options.language = languageDefer.promise;\n                        }\n\n                    }\n                    return DTPropertyUtil.resolveObjectPromises(options, ['data', 'aaData', 'fnPromise']);\n                }).then(function(options) {\n                    defer.resolve(options);\n                });\n                return defer.promise;\n            }\n\n            function render($elem, optionsPromise, staticHTML) {\n                optionsPromise.then(function(options) {\n                    DTRendererService.preRender(options);\n\n                    var isNgDisplay = $scope.datatable && $scope.datatable === 'ng';\n                    // Render dataTable\n                    if (_dtInstance && _dtInstance._renderer) {\n                        _dtInstance._renderer.withOptions(options)\n                            .render($elem, $scope, staticHTML).then(function(dtInstance) {\n                                _dtInstance = dtInstance;\n                                _setDTInstance(dtInstance);\n                            });\n                    } else {\n                        DTRendererFactory.fromOptions(options, isNgDisplay)\n                            .render($elem, $scope, staticHTML).then(function(dtInstance) {\n                                _dtInstance = dtInstance;\n                                _setDTInstance(dtInstance);\n                            });\n                    }\n                });\n            }\n\n            function _setDTInstance(dtInstance) {\n                if (angular.isFunction($scope.dtInstance)) {\n                    $scope.dtInstance(dtInstance);\n                } else if (angular.isDefined($scope.dtInstance)) {\n                    $scope.dtInstance = dtInstance;\n                }\n            }\n        }\n    }\n    dataTable.$inject = ['$q', '$http', '$log', 'DTRendererFactory', 'DTRendererService', 'DTPropertyUtil'];\n\n    'use strict';\n    angular.module('datatables.factory', [])\n        .factory('DTOptionsBuilder', dtOptionsBuilder)\n        .factory('DTColumnBuilder', dtColumnBuilder)\n        .factory('DTColumnDefBuilder', dtColumnDefBuilder)\n        .factory('DTLoadingTemplate', dtLoadingTemplate);\n\n    /* @ngInject */\n    function dtOptionsBuilder() {\n        /**\n         * The wrapped datatables options class\n         * @param sAjaxSource the ajax source to fetch the data\n         * @param fnPromise the function that returns a promise to fetch the data\n         */\n        var DTOptions = {\n            /**\n             * Add the option to the datatables options\n             * @param key the key of the option\n             * @param value an object or a function of the option\n             * @returns {DTOptions} the options\n             */\n            withOption: function(key, value) {\n                if (angular.isString(key)) {\n                    this[key] = value;\n                }\n                return this;\n            },\n\n            /**\n             * Add the Ajax source to the options.\n             * This corresponds to the \"ajax\" option\n             * @param ajax the ajax source\n             * @returns {DTOptions} the options\n             */\n            withSource: function(ajax) {\n                this.ajax = ajax;\n                return this;\n            },\n\n            /**\n             * Add the ajax data properties.\n             * @param sAjaxDataProp the ajax data property\n             * @returns {DTOptions} the options\n             */\n            withDataProp: function(sAjaxDataProp) {\n                this.sAjaxDataProp = sAjaxDataProp;\n                return this;\n            },\n\n            /**\n             * Set the server data function.\n             * @param fn the function of the server retrieval\n             * @returns {DTOptions} the options\n             */\n            withFnServerData: function(fn) {\n                if (!angular.isFunction(fn)) {\n                    throw new Error('The parameter must be a function');\n                }\n                this.fnServerData = fn;\n                return this;\n            },\n\n            /**\n             * Set the pagination type.\n             * @param sPaginationType the pagination type\n             * @returns {DTOptions} the options\n             */\n            withPaginationType: function(sPaginationType) {\n                if (angular.isString(sPaginationType)) {\n                    this.sPaginationType = sPaginationType;\n                } else {\n                    throw new Error('The pagination type must be provided');\n                }\n                return this;\n            },\n\n            /**\n             * Set the language of the datatables\n             * @param language the language\n             * @returns {DTOptions} the options\n             */\n            withLanguage: function(language) {\n                this.language = language;\n                return this;\n            },\n\n            /**\n             * Set the language source\n             * @param languageSource the language source\n             * @returns {DTOptions} the options\n             */\n            withLanguageSource: function(languageSource) {\n                return this.withLanguage({\n                    url: languageSource\n                });\n            },\n\n            /**\n             * Set default number of items per page to display\n             * @param iDisplayLength the number of items per page\n             * @returns {DTOptions} the options\n             */\n            withDisplayLength: function(iDisplayLength) {\n                this.iDisplayLength = iDisplayLength;\n                return this;\n            },\n\n            /**\n             * Set the promise to fetch the data\n             * @param fnPromise the function that returns a promise\n             * @returns {DTOptions} the options\n             */\n            withFnPromise: function(fnPromise) {\n                this.fnPromise = fnPromise;\n                return this;\n            },\n\n            /**\n             * Set the Dom of the DataTables.\n             * @param dom the dom\n             * @returns {DTOptions} the options\n             */\n            withDOM: function(dom) {\n                this.dom = dom;\n                return this;\n            }\n        };\n\n        return {\n            /**\n             * Create a wrapped datatables options\n             * @returns {DTOptions} a wrapped datatables option\n             */\n            newOptions: function() {\n                return Object.create(DTOptions);\n            },\n            /**\n             * Create a wrapped datatables options with the ajax source setted\n             * @param ajax the ajax source\n             * @returns {DTOptions} a wrapped datatables option\n             */\n            fromSource: function(ajax) {\n                var options = Object.create(DTOptions);\n                options.ajax = ajax;\n                return options;\n            },\n            /**\n             * Create a wrapped datatables options with the data promise.\n             * @param fnPromise the function that returns a promise to fetch the data\n             * @returns {DTOptions} a wrapped datatables option\n             */\n            fromFnPromise: function(fnPromise) {\n                var options = Object.create(DTOptions);\n                options.fnPromise = fnPromise;\n                return options;\n            }\n        };\n    }\n\n    function dtColumnBuilder() {\n        /**\n         * The wrapped datatables column\n         * @param mData the data to display of the column\n         * @param sTitle the sTitle of the column title to display in the DOM\n         */\n        var DTColumn = {\n            /**\n             * Add the option of the column\n             * @param key the key of the option\n             * @param value an object or a function of the option\n             * @returns {DTColumn} the wrapped datatables column\n             */\n            withOption: function(key, value) {\n                if (angular.isString(key)) {\n                    this[key] = value;\n                }\n                return this;\n            },\n\n            /**\n             * Set the title of the colum\n             * @param sTitle the sTitle of the column\n             * @returns {DTColumn} the wrapped datatables column\n             */\n            withTitle: function(sTitle) {\n                this.sTitle = sTitle;\n                return this;\n            },\n\n            /**\n             * Set the CSS class of the column\n             * @param sClass the CSS class\n             * @returns {DTColumn} the wrapped datatables column\n             */\n            withClass: function(sClass) {\n                this.sClass = sClass;\n                return this;\n            },\n\n            /**\n             * Hide the column\n             * @returns {DTColumn} the wrapped datatables column\n             */\n            notVisible: function() {\n                this.bVisible = false;\n                return this;\n            },\n\n            /**\n             * Set the column as not sortable\n             * @returns {DTColumn} the wrapped datatables column\n             */\n            notSortable: function() {\n                this.bSortable = false;\n                return this;\n            },\n\n            /**\n             * Render each cell with the given parameter\n             * @mRender mRender the function/string to render the data\n             * @returns {DTColumn} the wrapped datatables column\n             */\n            renderWith: function(mRender) {\n                this.mRender = mRender;\n                return this;\n            }\n        };\n\n        return {\n            /**\n             * Create a new wrapped datatables column\n             * @param mData the data of the column to display\n             * @param sTitle the sTitle of the column title to display in the DOM\n             * @returns {DTColumn} the wrapped datatables column\n             */\n            newColumn: function(mData, sTitle) {\n                if (angular.isUndefined(mData)) {\n                    throw new Error('The parameter \"mData\" is not defined!');\n                }\n                var column = Object.create(DTColumn);\n                column.mData = mData;\n                if (angular.isDefined(sTitle)) {\n                    column.sTitle = sTitle;\n                }\n                return column;\n            },\n            DTColumn: DTColumn\n        };\n    }\n\n    /* @ngInject */\n    function dtColumnDefBuilder(DTColumnBuilder) {\n        return {\n            newColumnDef: function(targets) {\n                if (angular.isUndefined(targets)) {\n                    throw new Error('The parameter \"targets\" must be defined! See https://datatables.net/reference/option/columnDefs.targets');\n                }\n                var column = Object.create(DTColumnBuilder.DTColumn);\n                if (angular.isArray(targets)) {\n                    column.aTargets = targets;\n                } else {\n                    column.aTargets = [targets];\n                }\n                return column;\n            }\n        };\n    }\n    dtColumnDefBuilder.$inject = ['DTColumnBuilder'];\n\n    function dtLoadingTemplate($compile, DTDefaultOptions, DT_LOADING_CLASS) {\n        return {\n            compileHtml: function($scope) {\n                return $compile(angular.element('<div class=\"' + DT_LOADING_CLASS + '\">' + DTDefaultOptions.loadingTemplate + '</div>'))($scope);\n            },\n            isLoading: function(elem) {\n                return elem.hasClass(DT_LOADING_CLASS);\n            }\n        };\n    }\n    dtLoadingTemplate.$inject = ['$compile', 'DTDefaultOptions', 'DT_LOADING_CLASS'];\n\n    'use strict';\n\n    angular.module('datatables.instances', ['datatables.util'])\n        .factory('DTInstanceFactory', dtInstanceFactory);\n\n    function dtInstanceFactory() {\n        var DTInstance = {\n            reloadData: reloadData,\n            changeData: changeData,\n            rerender: rerender\n        };\n        return {\n            newDTInstance: newDTInstance,\n            copyDTProperties: copyDTProperties\n        };\n\n        function newDTInstance(renderer) {\n            var dtInstance = Object.create(DTInstance);\n            dtInstance._renderer = renderer;\n            return dtInstance;\n        }\n\n        function copyDTProperties(result, dtInstance) {\n            dtInstance.id = result.id;\n            dtInstance.DataTable = result.DataTable;\n            dtInstance.dataTable = result.dataTable;\n        }\n\n        function reloadData(callback, resetPaging) {\n            /*jshint validthis:true */\n            this._renderer.reloadData(callback, resetPaging);\n        }\n\n        function changeData(data) {\n            /*jshint validthis:true */\n            this._renderer.changeData(data);\n        }\n\n        function rerender() {\n            /*jshint validthis:true */\n            this._renderer.rerender();\n        }\n    }\n\n    'use strict';\n\n    angular.module('datatables', ['datatables.directive', 'datatables.factory'])\n        .run(initAngularDataTables);\n\n    /* @ngInject */\n    function initAngularDataTables() {\n        if ($.fn.DataTable.Api) {\n            /**\n             * Register an API to destroy a DataTable without detaching the tbody so that we can add new data\n             * when rendering with the \"Angular way\".\n             */\n            $.fn.DataTable.Api.register('ngDestroy()', function(remove) {\n                remove = remove || false;\n\n                return this.iterator('table', function(settings) {\n                    var orig = settings.nTableWrapper.parentNode;\n                    var classes = settings.oClasses;\n                    var table = settings.nTable;\n                    var tbody = settings.nTBody;\n                    var thead = settings.nTHead;\n                    var tfoot = settings.nTFoot;\n                    var jqTable = $(table);\n                    var jqTbody = $(tbody);\n                    var jqWrapper = $(settings.nTableWrapper);\n                    var rows = $.map(settings.aoData, function(r) {\n                        return r.nTr;\n                    });\n                    var ien;\n\n                    // Flag to note that the table is currently being destroyed - no action\n                    // should be taken\n                    settings.bDestroying = true;\n\n                    // Fire off the destroy callbacks for plug-ins etc\n                    $.fn.DataTable.ext.internal._fnCallbackFire(settings, 'aoDestroyCallback', 'destroy', [settings]);\n\n                    // If not being removed from the document, make all columns visible\n                    if (!remove) {\n                        new $.fn.DataTable.Api(settings).columns().visible(true);\n                    }\n\n                    // Blitz all `DT` namespaced events (these are internal events, the\n                    // lowercase, `dt` events are user subscribed and they are responsible\n                    // for removing them\n                    jqWrapper.unbind('.DT').find(':not(tbody *)').unbind('.DT');\n                    $(window).unbind('.DT-' + settings.sInstance);\n\n                    // When scrolling we had to break the table up - restore it\n                    if (table !== thead.parentNode) {\n                        jqTable.children('thead').detach();\n                        jqTable.append(thead);\n                    }\n\n                    if (tfoot && table !== tfoot.parentNode) {\n                        jqTable.children('tfoot').detach();\n                        jqTable.append(tfoot);\n                    }\n\n                    // Remove the DataTables generated nodes, events and classes\n                    jqTable.detach();\n                    jqWrapper.detach();\n\n                    settings.aaSorting = [];\n                    settings.aaSortingFixed = [];\n                    $.fn.DataTable.ext.internal._fnSortingClasses(settings);\n\n                    $(rows).removeClass(settings.asStripeClasses.join(' '));\n\n                    $('th, td', thead).removeClass(classes.sSortable + ' ' +\n                        classes.sSortableAsc + ' ' + classes.sSortableDesc + ' ' + classes.sSortableNone\n                    );\n\n                    if (settings.bJUI) {\n                        $('th span.' + classes.sSortIcon + ', td span.' + classes.sSortIcon, thead).detach();\n                        $('th, td', thead).each(function() {\n                            var wrapper = $('div.' + classes.sSortJUIWrapper, this);\n                            $(this).append(wrapper.contents());\n                            wrapper.detach();\n                        });\n                    }\n\n                    // -------------------------------------------------------------------------\n                    // This is the only change with the \"destroy()\" API (with DT v1.10.1)\n                    // -------------------------------------------------------------------------\n                    if (!remove && orig) {\n                        // insertBefore acts like appendChild if !arg[1]\n                        if (orig.contains(settings.nTableReinsertBefore)) {\n                            orig.insertBefore(table, settings.nTableReinsertBefore);\n                        } else {\n                            orig.appendChild(table);\n                        }\n                    }\n                    // Add the TR elements back into the table in their original order\n                    // jqTbody.children().detach();\n                    // jqTbody.append( rows );\n                    // -------------------------------------------------------------------------\n\n                    // Restore the width of the original table - was read from the style property,\n                    // so we can restore directly to that\n                    jqTable\n                        .css('width', settings.sDestroyWidth)\n                        .removeClass(classes.sTable);\n\n                    // If the were originally stripe classes - then we add them back here.\n                    // Note this is not fool proof (for example if not all rows had stripe\n                    // classes - but it's a good effort without getting carried away\n                    ien = settings.asDestroyStripes.length;\n\n                    if (ien) {\n                        jqTbody.children().each(function(i) {\n                            $(this).addClass(settings.asDestroyStripes[i % ien]);\n                        });\n                    }\n\n                    /* Remove the settings object from the settings array */\n                    var idx = $.inArray(settings, $.fn.DataTable.settings);\n                    if (idx !== -1) {\n                        $.fn.DataTable.settings.splice(idx, 1);\n                    }\n                });\n            });\n        }\n    }\n\n    'use strict';\n    angular.module('datatables.options', [])\n        .constant('DT_DEFAULT_OPTIONS', {\n            // Default ajax properties. See http://legacy.datatables.net/usage/options#sAjaxDataProp\n            sAjaxDataProp: '',\n            // Set default columns (used when none are provided)\n            aoColumns: []\n        })\n        .constant('DT_LOADING_CLASS', 'dt-loading')\n        .service('DTDefaultOptions', dtDefaultOptions);\n\n    function dtDefaultOptions() {\n        var options = {\n            loadingTemplate: '<h3>Loading...</h3>',\n            bootstrapOptions: {},\n            setLoadingTemplate: setLoadingTemplate,\n            setLanguageSource: setLanguageSource,\n            setLanguage: setLanguage,\n            setDisplayLength: setDisplayLength,\n            setBootstrapOptions: setBootstrapOptions,\n            setDOM: setDOM,\n            setOption: setOption\n        };\n\n        return options;\n\n        /**\n         * Set the default loading template\n         * @param loadingTemplate the HTML to display when loading the table\n         * @returns {DTDefaultOptions} the default option config\n         */\n        function setLoadingTemplate(loadingTemplate) {\n            options.loadingTemplate = loadingTemplate;\n            return options;\n        }\n\n        /**\n         * Set the default language source for all datatables\n         * @param sLanguageSource the language source\n         * @returns {DTDefaultOptions} the default option config\n         */\n        function setLanguageSource(sLanguageSource) {\n            // HACK to resolve the language source manually instead of DT\n            // See https://github.com/l-lin/angular-datatables/issues/356\n            $.ajax({\n                dataType: 'json',\n                url: sLanguageSource,\n                success: function(json) {\n                    $.extend(true, $.fn.DataTable.defaults, {\n                        language: json\n                    });\n                }\n            });\n            return options;\n        }\n\n        /**\n         * Set the language for all datatables\n         * @param language the language\n         * @returns {DTDefaultOptions} the default option config\n         */\n        function setLanguage(language) {\n            $.extend(true, $.fn.DataTable.defaults, {\n                language: language\n            });\n            return options;\n        }\n\n        /**\n         * Set the default number of items to display for all datatables\n         * @param displayLength the number of items to display\n         * @returns {DTDefaultOptions} the default option config\n         */\n        function setDisplayLength(displayLength) {\n            $.extend($.fn.DataTable.defaults, {\n                displayLength: displayLength\n            });\n            return options;\n        }\n\n        /**\n         * Set the default options to be use for Bootstrap integration.\n         * See https://github.com/l-lin/angular-datatables/blob/dev/src/angular-datatables.bootstrap.options.js to check\n         * what default options Angular DataTables is using.\n         * @param oBootstrapOptions an object containing the default options for Bootstrap integration\n         * @returns {DTDefaultOptions} the default option config\n         */\n        function setBootstrapOptions(oBootstrapOptions) {\n            options.bootstrapOptions = oBootstrapOptions;\n            return options;\n        }\n\n        /**\n         * Set the DOM for all DataTables.\n         * See https://datatables.net/reference/option/dom\n         * @param dom the dom\n         * @returns {DTDefaultoptions} the default option config\n         */\n        function setDOM(dom) {\n            $.extend($.fn.DataTable.defaults, {\n                dom: dom\n            });\n            return options;\n        }\n\n        /**\n         * Set global default option to all DataTables.\n         * @param key the key of the default option\n         * @param value the value of the default option\n         */\n        function setOption(key, value) {\n            if (angular.isString(key)) {\n                var obj = {};\n                obj[key] = value;\n                $.extend($.fn.DataTable.defaults, obj);\n            }\n        }\n    }\n\n    'use strict';\n    angular.module('datatables.renderer', ['datatables.instances', 'datatables.factory', 'datatables.options', 'datatables.instances'])\n        .factory('DTRendererService', dtRendererService)\n        .factory('DTRenderer', dtRenderer)\n        .factory('DTDefaultRenderer', dtDefaultRenderer)\n        .factory('DTNGRenderer', dtNGRenderer)\n        .factory('DTPromiseRenderer', dtPromiseRenderer)\n        .factory('DTAjaxRenderer', dtAjaxRenderer)\n        .factory('DTRendererFactory', dtRendererFactory);\n\n    /* @ngInject */\n    function dtRendererService(DTLoadingTemplate) {\n        var plugins = [];\n        var rendererService = {\n            showLoading: showLoading,\n            hideLoading: hideLoading,\n            renderDataTable: renderDataTable,\n            hideLoadingAndRenderDataTable: hideLoadingAndRenderDataTable,\n            registerPlugin: registerPlugin,\n            postRender: postRender,\n            preRender: preRender\n        };\n        return rendererService;\n\n        function showLoading($elem, $scope) {\n            var $loading = angular.element(DTLoadingTemplate.compileHtml($scope));\n            $elem.after($loading);\n            $elem.hide();\n            $loading.show();\n        }\n\n        function hideLoading($elem) {\n            $elem.show();\n            var next = $elem.next();\n            if (DTLoadingTemplate.isLoading(next)) {\n                next.remove();\n            }\n        }\n\n        function renderDataTable($elem, options) {\n            var dtId = '#' + $elem.attr('id');\n            if ($.fn.dataTable.isDataTable(dtId) && angular.isObject(options)) {\n                options.destroy = true;\n            }\n            // See http://datatables.net/manual/api#Accessing-the-API to understand the difference between DataTable and dataTable\n            var DT = $elem.DataTable(options);\n            var dt = $elem.dataTable();\n\n            var result = {\n                id: $elem.attr('id'),\n                DataTable: DT,\n                dataTable: dt\n            };\n\n            postRender(options, result);\n\n            return result;\n        }\n\n        function hideLoadingAndRenderDataTable($elem, options) {\n            rendererService.hideLoading($elem);\n            return rendererService.renderDataTable($elem, options);\n        }\n\n        function registerPlugin(plugin) {\n            plugins.push(plugin);\n        }\n\n        function postRender(options, result) {\n            angular.forEach(plugins, function(plugin) {\n                if (angular.isFunction(plugin.postRender)) {\n                    plugin.postRender(options, result);\n                }\n            });\n        }\n\n        function preRender(options) {\n            angular.forEach(plugins, function(plugin) {\n                if (angular.isFunction(plugin.preRender)) {\n                    plugin.preRender(options);\n                }\n            });\n        }\n    }\n    dtRendererService.$inject = ['DTLoadingTemplate'];\n\n    function dtRenderer() {\n        return {\n            withOptions: function(options) {\n                this.options = options;\n                return this;\n            }\n        };\n    }\n\n    /* @ngInject */\n    function dtDefaultRenderer($q, DTRenderer, DTRendererService, DTInstanceFactory) {\n        return {\n            create: create\n        };\n\n        function create(options) {\n            var _oTable;\n            var _$elem;\n            var _$scope;\n            var renderer = Object.create(DTRenderer);\n            renderer.name = 'DTDefaultRenderer';\n            renderer.options = options;\n            renderer.render = render;\n            renderer.reloadData = reloadData;\n            renderer.changeData = changeData;\n            renderer.rerender = rerender;\n\n            function render($elem, $scope) {\n                _$elem = $elem;\n                _$scope = $scope;\n                var dtInstance = DTInstanceFactory.newDTInstance(renderer);\n                var result = DTRendererService.hideLoadingAndRenderDataTable($elem, renderer.options);\n                _oTable = result.DataTable;\n                DTInstanceFactory.copyDTProperties(result, dtInstance);\n                return $q.when(dtInstance);\n            }\n\n            function reloadData() {\n                // Do nothing\n            }\n\n            function changeData() {\n                // Do nothing\n            }\n\n            function rerender() {\n                _oTable.destroy();\n                DTRendererService.showLoading(_$elem, _$scope);\n                render(_$elem, _$scope);\n            }\n            return renderer;\n        }\n    }\n    dtDefaultRenderer.$inject = ['$q', 'DTRenderer', 'DTRendererService', 'DTInstanceFactory'];\n\n    /* @ngInject */\n    function dtNGRenderer($log, $q, $compile, $timeout, DTRenderer, DTRendererService, DTInstanceFactory) {\n        /**\n         * Renderer for displaying the Angular way\n         * @param options\n         * @returns {{options: *}} the renderer\n         * @constructor\n         */\n        return {\n            create: create\n        };\n\n        function create(options) {\n            var _staticHTML;\n            var _oTable;\n            var _$elem;\n            var _parentScope;\n            var _newParentScope;\n            var dtInstance;\n            var renderer = Object.create(DTRenderer);\n            renderer.name = 'DTNGRenderer';\n            renderer.options = options;\n            renderer.render = render;\n            renderer.reloadData = reloadData;\n            renderer.changeData = changeData;\n            renderer.rerender = rerender;\n            return renderer;\n\n            function render($elem, $scope, staticHTML) {\n                _staticHTML = staticHTML;\n                _$elem = $elem;\n                _parentScope = $scope.$parent;\n                dtInstance = DTInstanceFactory.newDTInstance(renderer);\n\n                var defer = $q.defer();\n                var _$tableElem = _staticHTML.match(/<tbody([\\s\\S]*)<\\/tbody>/i);\n                var _expression = _$tableElem[1];\n                // Find the resources from the comment <!-- ngRepeat: item in items --> displayed by angular in the DOM\n                // This regexp is inspired by the one used in the \"ngRepeat\" directive\n                var _match = _expression.match(/^\\s*.+?\\s+in\\s+([a-zA-Z0-9\\.-_$]*)\\s*/m);\n\n                if (!_match) {\n                    throw new Error('Expected expression in form of \"_item_ in _collection_[ track by _id_]\" but got \"{0}\".', _expression);\n                }\n                var _ngRepeatAttr = _match[1];\n\n                var _alreadyRendered = false;\n\n                _parentScope.$watchCollection(_ngRepeatAttr, function() {\n                    if (_oTable && _alreadyRendered) {\n                        _destroyAndCompile();\n                    }\n                    $timeout(function() {\n                        _alreadyRendered = true;\n                        // Ensure that prerender is called when the collection is updated\n                        // See https://github.com/l-lin/angular-datatables/issues/502\n                        DTRendererService.preRender(renderer.options);\n                        var result = DTRendererService.hideLoadingAndRenderDataTable(_$elem, renderer.options);\n                        _oTable = result.DataTable;\n                        DTInstanceFactory.copyDTProperties(result, dtInstance);\n                        defer.resolve(dtInstance);\n                    }, 0, false);\n                }, true);\n                return defer.promise;\n            }\n\n            function reloadData() {\n                $log.warn('The Angular Renderer does not support reloading data. You need to do it directly on your model');\n            }\n\n            function changeData() {\n                $log.warn('The Angular Renderer does not support changing the data. You need to change your model directly.');\n            }\n\n            function rerender() {\n                _destroyAndCompile();\n                DTRendererService.showLoading(_$elem, _parentScope);\n                // Ensure that prerender is called after loadData from promise\n                // See https://github.com/l-lin/angular-datatables/issues/563\n                DTRendererService.preRender(options);\n                $timeout(function() {\n                    var result = DTRendererService.hideLoadingAndRenderDataTable(_$elem, renderer.options);\n                    _oTable = result.DataTable;\n                    DTInstanceFactory.copyDTProperties(result, dtInstance);\n                }, 0, false);\n            }\n\n            function _destroyAndCompile() {\n                if (_newParentScope) {\n                    _newParentScope.$destroy();\n                }\n                _oTable.ngDestroy();\n                // Re-compile because we lost the angular binding to the existing data\n                _$elem.html(_staticHTML);\n                _newParentScope = _parentScope.$new();\n                $compile(_$elem.contents())(_newParentScope);\n            }\n        }\n    }\n    dtNGRenderer.$inject = ['$log', '$q', '$compile', '$timeout', 'DTRenderer', 'DTRendererService', 'DTInstanceFactory'];\n\n    /* @ngInject */\n    function dtPromiseRenderer($q, $timeout, $log, DTRenderer, DTRendererService, DTInstanceFactory) {\n        /**\n         * Renderer for displaying with a promise\n         * @param options the options\n         * @returns {{options: *}} the renderer\n         * @constructor\n         */\n        return {\n            create: create\n        };\n\n        function create(options) {\n            var _oTable;\n            var _loadedPromise = null;\n            var _$elem;\n            var _$scope;\n\n            var dtInstance;\n            var renderer = Object.create(DTRenderer);\n            renderer.name = 'DTPromiseRenderer';\n            renderer.options = options;\n            renderer.render = render;\n            renderer.reloadData = reloadData;\n            renderer.changeData = changeData;\n            renderer.rerender = rerender;\n            return renderer;\n\n            function render($elem, $scope) {\n                var defer = $q.defer();\n                dtInstance = DTInstanceFactory.newDTInstance(renderer);\n                _$elem = $elem;\n                _$scope = $scope;\n                _resolve(renderer.options.fnPromise, DTRendererService.renderDataTable).then(function(result) {\n                    _oTable = result.DataTable;\n                    DTInstanceFactory.copyDTProperties(result, dtInstance);\n                    defer.resolve(dtInstance);\n                });\n                return defer.promise;\n            }\n\n            function reloadData(callback, resetPaging) {\n                var previousPage = _oTable && _oTable.page() ? _oTable.page() : 0;\n                if (angular.isFunction(renderer.options.fnPromise)) {\n                    _resolve(renderer.options.fnPromise, _redrawRows).then(function(result) {\n                        if (angular.isFunction(callback)) {\n                            callback(result.DataTable.data());\n                        }\n                        if (resetPaging === false) {\n                            result.DataTable.page(previousPage).draw(false);\n                        }\n                    });\n                } else {\n                    $log.warn('In order to use the reloadData functionality with a Promise renderer, you need to provide a function that returns a promise.');\n                }\n            }\n\n            function changeData(fnPromise) {\n                renderer.options.fnPromise = fnPromise;\n                // We also need to set the $scope.dtOptions, otherwise, when we change the columns, it will revert to the old data\n                // See https://github.com/l-lin/angular-datatables/issues/359\n                _$scope.dtOptions.fnPromise = fnPromise;\n                _resolve(renderer.options.fnPromise, _redrawRows);\n            }\n\n            function rerender() {\n                _oTable.destroy();\n                DTRendererService.showLoading(_$elem, _$scope);\n                // Ensure that prerender is called after loadData from promise\n                // See https://github.com/l-lin/angular-datatables/issues/563\n                DTRendererService.preRender(options);\n                render(_$elem, _$scope);\n            }\n\n            function _resolve(fnPromise, callback) {\n                var defer = $q.defer();\n                if (angular.isUndefined(fnPromise)) {\n                    throw new Error('You must provide a promise or a function that returns a promise!');\n                }\n                if (_loadedPromise) {\n                    _loadedPromise.then(function() {\n                        defer.resolve(_startLoading(fnPromise, callback));\n                    });\n                } else {\n                    defer.resolve(_startLoading(fnPromise, callback));\n                }\n                return defer.promise;\n            }\n\n            function _startLoading(fnPromise, callback) {\n                var defer = $q.defer();\n                if (angular.isFunction(fnPromise)) {\n                    _loadedPromise = fnPromise();\n                } else {\n                    _loadedPromise = fnPromise;\n                }\n                _loadedPromise.then(function(result) {\n                    var data = result;\n                    // In case the data is nested in an object\n                    if (renderer.options.sAjaxDataProp) {\n                        var properties = renderer.options.sAjaxDataProp.split('.');\n                        while (properties.length) {\n                            var property = properties.shift();\n                            if (property in data) {\n                                data = data[property];\n                            }\n                        }\n                    }\n                    _loadedPromise = null;\n                    defer.resolve(_doRender(renderer.options, _$elem, data, callback));\n                });\n                return defer.promise;\n            }\n\n            function _doRender(options, $elem, data, callback) {\n                var defer = $q.defer();\n                // Since Angular 1.3, the promise renderer is throwing \"Maximum call stack size exceeded\"\n                // By removing the $promise attribute, we avoid an infinite loop when jquery is cloning the data\n                // See https://github.com/l-lin/angular-datatables/issues/110\n                delete data.$promise;\n                options.aaData = data;\n                // Add $timeout to be sure that angular has finished rendering before calling datatables\n                $timeout(function() {\n                    DTRendererService.hideLoading($elem);\n                    // Set it to true in order to be able to redraw the dataTable\n                    options.bDestroy = true;\n                    defer.resolve(callback($elem, options));\n                }, 0, false);\n                return defer.promise;\n            }\n\n            function _redrawRows($elem, options) {\n                _oTable.clear();\n                _oTable.rows.add(options.aaData).draw(options.redraw);\n                return {\n                    id: dtInstance.id,\n                    DataTable: dtInstance.DataTable,\n                    dataTable: dtInstance.dataTable\n                };\n            }\n        }\n    }\n    dtPromiseRenderer.$inject = ['$q', '$timeout', '$log', 'DTRenderer', 'DTRendererService', 'DTInstanceFactory'];\n\n    /* @ngInject */\n    function dtAjaxRenderer($q, $timeout, DTRenderer, DTRendererService, DT_DEFAULT_OPTIONS, DTInstanceFactory) {\n        /**\n         * Renderer for displaying with Ajax\n         * @param options the options\n         * @returns {{options: *}} the renderer\n         * @constructor\n         */\n        return {\n            create: create\n        };\n\n        function create(options) {\n            var _oTable;\n            var _$elem;\n            var _$scope;\n            var renderer = Object.create(DTRenderer);\n            renderer.name = 'DTAjaxRenderer';\n            renderer.options = options;\n            renderer.render = render;\n            renderer.reloadData = reloadData;\n            renderer.changeData = changeData;\n            renderer.rerender = rerender;\n            return renderer;\n\n            function render($elem, $scope) {\n                _$elem = $elem;\n                _$scope = $scope;\n                var defer = $q.defer();\n                var dtInstance = DTInstanceFactory.newDTInstance(renderer);\n                // Define default values in case it is an ajax datatables\n                if (angular.isUndefined(renderer.options.sAjaxDataProp)) {\n                    renderer.options.sAjaxDataProp = DT_DEFAULT_OPTIONS.sAjaxDataProp;\n                }\n                if (angular.isUndefined(renderer.options.aoColumns)) {\n                    renderer.options.aoColumns = DT_DEFAULT_OPTIONS.aoColumns;\n                }\n                _doRender(renderer.options, $elem).then(function(result) {\n                    _oTable = result.DataTable;\n                    DTInstanceFactory.copyDTProperties(result, dtInstance);\n                    defer.resolve(dtInstance);\n                });\n                return defer.promise;\n            }\n\n            function reloadData(callback, resetPaging) {\n                if (_oTable) {\n                    _oTable.ajax.reload(callback, resetPaging);\n                }\n            }\n\n            function changeData(ajax) {\n                renderer.options.ajax = ajax;\n                // We also need to set the $scope.dtOptions, otherwise, when we change the columns, it will revert to the old data\n                // See https://github.com/l-lin/angular-datatables/issues/359\n                _$scope.dtOptions.ajax = ajax;\n            }\n\n            function rerender() {\n                // Ensure that prerender is called after loadData from promise\n                // See https://github.com/l-lin/angular-datatables/issues/563\n                DTRendererService.preRender(options);\n                render(_$elem, _$scope);\n            }\n\n            function _doRender(options, $elem) {\n                var defer = $q.defer();\n                // Destroy the table if it exists in order to be able to redraw the dataTable\n                options.bDestroy = true;\n                if (_oTable) {\n                    _oTable.destroy();\n                    DTRendererService.showLoading(_$elem, _$scope);\n                    // Empty in case of columns change\n                    $elem.empty();\n                }\n                DTRendererService.hideLoading($elem);\n                // Condition to refresh the dataTable\n                if (_shouldDeferRender(options)) {\n                    $timeout(function() {\n                        defer.resolve(DTRendererService.renderDataTable($elem, options));\n                    }, 0, false);\n                } else {\n                    defer.resolve(DTRendererService.renderDataTable($elem, options));\n                }\n                return defer.promise;\n            }\n            // See https://github.com/l-lin/angular-datatables/issues/147\n            function _shouldDeferRender(options) {\n                if (angular.isDefined(options) && angular.isDefined(options.dom)) {\n                    // S for scroller plugin\n                    return options.dom.indexOf('S') >= 0;\n                }\n                return false;\n            }\n        }\n    }\n    dtAjaxRenderer.$inject = ['$q', '$timeout', 'DTRenderer', 'DTRendererService', 'DT_DEFAULT_OPTIONS', 'DTInstanceFactory'];\n\n    /* @ngInject */\n    function dtRendererFactory(DTDefaultRenderer, DTNGRenderer, DTPromiseRenderer, DTAjaxRenderer) {\n        return {\n            fromOptions: fromOptions\n        };\n\n        function fromOptions(options, isNgDisplay) {\n            if (isNgDisplay) {\n                if (options && options.serverSide) {\n                    throw new Error('You cannot use server side processing along with the Angular renderer!');\n                }\n                return DTNGRenderer.create(options);\n            }\n            if (angular.isDefined(options)) {\n                if (angular.isDefined(options.fnPromise) && options.fnPromise !== null) {\n                    if (options.serverSide) {\n                        throw new Error('You cannot use server side processing along with the Promise renderer!');\n                    }\n                    return DTPromiseRenderer.create(options);\n                }\n                if (angular.isDefined(options.ajax) && options.ajax !== null ||\n                    angular.isDefined(options.ajax) && options.ajax !== null) {\n                    return DTAjaxRenderer.create(options);\n                }\n                return DTDefaultRenderer.create(options);\n            }\n            return DTDefaultRenderer.create();\n        }\n    }\n    dtRendererFactory.$inject = ['DTDefaultRenderer', 'DTNGRenderer', 'DTPromiseRenderer', 'DTAjaxRenderer'];\n\n    'use strict';\n\n    angular.module('datatables.util', [])\n        .factory('DTPropertyUtil', dtPropertyUtil);\n\n    /* @ngInject */\n    function dtPropertyUtil($q) {\n        return {\n            overrideProperties: overrideProperties,\n            deleteProperty: deleteProperty,\n            resolveObjectPromises: resolveObjectPromises,\n            resolveArrayPromises: resolveArrayPromises\n        };\n\n        /**\n         * Overrides the source property with the given target properties.\n         * Source is not written. It's making a fresh copy of it in order to ensure that we do not change the parameters.\n         * @param source the source properties to override\n         * @param target the target properties\n         * @returns {*} the object overrided\n         */\n        function overrideProperties(source, target) {\n            var result = angular.copy(source);\n\n            if (angular.isUndefined(result) || result === null) {\n                result = {};\n            }\n            if (angular.isUndefined(target) || target === null) {\n                return result;\n            }\n            if (angular.isObject(target)) {\n                for (var prop in target) {\n                    if (target.hasOwnProperty(prop)) {\n                        result[prop] = overrideProperties(result[prop], target[prop]);\n                    }\n                }\n            } else {\n                result = angular.copy(target);\n            }\n            return result;\n        }\n\n        /**\n         * Delete the property from the given object\n         * @param obj the object\n         * @param propertyName the property name\n         */\n        function deleteProperty(obj, propertyName) {\n            if (angular.isObject(obj)) {\n                delete obj[propertyName];\n            }\n        }\n\n        /**\n         * Resolve any promises from a given object if there are any.\n         * @param obj the object\n         * @param excludedPropertiesName the list of properties to ignore\n         * @returns {promise} the promise that the object attributes promises are all resolved\n         */\n        function resolveObjectPromises(obj, excludedPropertiesName) {\n            var defer = $q.defer(),\n                promises = [],\n                resolvedObj = {},\n                excludedProp = excludedPropertiesName || [];\n            if (!angular.isObject(obj) || angular.isArray(obj)) {\n                defer.resolve(obj);\n            } else {\n                resolvedObj = angular.extend(resolvedObj, obj);\n                for (var prop in resolvedObj) {\n                    if (resolvedObj.hasOwnProperty(prop) && $.inArray(prop, excludedProp) === -1) {\n                        if (angular.isArray(resolvedObj[prop])) {\n                            promises.push(resolveArrayPromises(resolvedObj[prop]));\n                        } else {\n                            promises.push($q.when(resolvedObj[prop]));\n                        }\n                    }\n                }\n                $q.all(promises).then(function(result) {\n                    var index = 0;\n                    for (var prop in resolvedObj) {\n                        if (resolvedObj.hasOwnProperty(prop) && $.inArray(prop, excludedProp) === -1) {\n                            resolvedObj[prop] = result[index++];\n                        }\n                    }\n                    defer.resolve(resolvedObj);\n                });\n            }\n            return defer.promise;\n        }\n\n        /**\n         * Resolve the given array promises\n         * @param array the array containing promise or not\n         * @returns {promise} the promise that the array contains a list of objects/values promises that are resolved\n         */\n        function resolveArrayPromises(array) {\n            var defer = $q.defer(),\n                promises = [],\n                resolveArray = [];\n            if (!angular.isArray(array)) {\n                defer.resolve(array);\n            } else {\n                angular.forEach(array, function(item) {\n                    if (angular.isObject(item)) {\n                        promises.push(resolveObjectPromises(item));\n                    } else {\n                        promises.push($q.when(item));\n                    }\n                });\n                $q.all(promises).then(function(result) {\n                    angular.forEach(result, function(item) {\n                        resolveArray.push(item);\n                    });\n                    defer.resolve(resolveArray);\n                });\n            }\n            return defer.promise;\n        }\n    }\n    dtPropertyUtil.$inject = ['$q'];\n\n\n})(window, document, jQuery, angular);\n\n/*!\n * angular-datatables - v0.5.7\n * https://github.com/l-lin/angular-datatables\n * License: MIT\n */\nif (typeof module !== \"undefined\" && typeof exports !== \"undefined\" && module.exports === exports) {\n    module.exports = 'datatables.bootstrap';\n}\n(function(window, document, $, angular) {\n\n    'use strict';\n    angular.module('datatables.bootstrap.colvis', ['datatables.bootstrap.options', 'datatables.util'])\n        .service('DTBootstrapColVis', dtBootstrapColVis);\n\n    /* @ngInject */\n    function dtBootstrapColVis(DTPropertyUtil, DTBootstrapDefaultOptions) {\n        var _initializedColVis = false;\n        return {\n            integrate: integrate,\n            deIntegrate: deIntegrate\n        };\n\n        function integrate(addDrawCallbackFunction, bootstrapOptions) {\n            if (!_initializedColVis) {\n                var colVisProperties = DTPropertyUtil.overrideProperties(\n                    DTBootstrapDefaultOptions.getOptions().ColVis,\n                    bootstrapOptions ? bootstrapOptions.ColVis : null\n                );\n                /* ColVis Bootstrap compatibility */\n                if ($.fn.DataTable.ColVis) {\n                    addDrawCallbackFunction(function() {\n                        $('.ColVis_MasterButton').attr('class', 'ColVis_MasterButton ' + colVisProperties.classes.masterButton);\n                        $('.ColVis_Button').removeClass('ColVis_Button');\n                    });\n                }\n\n                _initializedColVis = true;\n            }\n        }\n\n        function deIntegrate() {\n            if (_initializedColVis && $.fn.DataTable.ColVis) {\n                _initializedColVis = false;\n            }\n        }\n    }\n    dtBootstrapColVis.$inject = ['DTPropertyUtil', 'DTBootstrapDefaultOptions'];\n\n    'use strict';\n\n    // See http://getbootstrap.com\n    angular.module('datatables.bootstrap', [\n            'datatables.bootstrap.options',\n            'datatables.bootstrap.tabletools',\n            'datatables.bootstrap.colvis'\n        ])\n        .config(dtBootstrapConfig)\n        .run(initBootstrapPlugin)\n        .service('DTBootstrap', dtBootstrap);\n\n    /* @ngInject */\n    function dtBootstrapConfig($provide) {\n        $provide.decorator('DTOptionsBuilder', dtOptionsBuilderDecorator);\n\n        function dtOptionsBuilderDecorator($delegate) {\n            var newOptions = $delegate.newOptions;\n            var fromSource = $delegate.fromSource;\n            var fromFnPromise = $delegate.fromFnPromise;\n\n            $delegate.newOptions = function() {\n                return _decorateOptions(newOptions);\n            };\n            $delegate.fromSource = function(ajax) {\n                return _decorateOptions(fromSource, ajax);\n            };\n            $delegate.fromFnPromise = function(fnPromise) {\n                return _decorateOptions(fromFnPromise, fnPromise);\n            };\n\n            return $delegate;\n\n            function _decorateOptions(fn, params) {\n                var options = fn(params);\n                options.withBootstrap = withBootstrap;\n                options.withBootstrapOptions = withBootstrapOptions;\n                return options;\n\n                /**\n                 * Add bootstrap compatibility\n                 * @returns {DTOptions} the options\n                 */\n                function withBootstrap() {\n                    options.hasBootstrap = true;\n                    // Override page button active CSS class\n                    if (angular.isObject(options.oClasses)) {\n                        options.oClasses.sPageButtonActive = 'active';\n                    } else {\n                        options.oClasses = {\n                            sPageButtonActive: 'active'\n                        };\n                    }\n                    return options;\n                }\n\n                /**\n                 * Add bootstrap options\n                 * @param bootstrapOptions the bootstrap options\n                 * @returns {DTOptions} the options\n                 */\n                function withBootstrapOptions(bootstrapOptions) {\n                    options.bootstrap = bootstrapOptions;\n                    return options;\n                }\n            }\n        }\n        dtOptionsBuilderDecorator.$inject = ['$delegate'];\n    }\n    dtBootstrapConfig.$inject = ['$provide'];\n\n    /* @ngInject */\n    function initBootstrapPlugin(DTRendererService, DTBootstrap) {\n        var columnFilterPlugin = {\n            preRender: preRender\n        };\n        DTRendererService.registerPlugin(columnFilterPlugin);\n\n        function preRender(options) {\n            // Integrate bootstrap (or not)\n            if (options && options.hasBootstrap) {\n                DTBootstrap.integrate(options);\n            } else {\n                DTBootstrap.deIntegrate();\n            }\n        }\n    }\n    initBootstrapPlugin.$inject = ['DTRendererService', 'DTBootstrap'];\n\n    /**\n     * Source: https://editor.datatables.net/release/DataTables/extras/Editor/examples/bootstrap.html\n     */\n    /* @ngInject */\n    function dtBootstrap(DTBootstrapTableTools, DTBootstrapColVis, DTBootstrapDefaultOptions, DTPropertyUtil) {\n        var _initialized = false,\n            _drawCallbackFunctionList = [],\n            _savedFn = {};\n\n        return {\n            integrate: integrate,\n            deIntegrate: deIntegrate\n        };\n\n        function _saveFnToBeOverrided() {\n            _savedFn.oStdClasses = angular.copy($.fn.dataTableExt.oStdClasses);\n            _savedFn.fnPagingInfo = $.fn.dataTableExt.oApi.fnPagingInfo;\n            _savedFn.renderer = angular.copy($.fn.DataTable.ext.renderer);\n            if ($.fn.DataTable.TableTools) {\n                _savedFn.TableTools = {\n                    classes: angular.copy($.fn.DataTable.TableTools.classes),\n                    oTags: angular.copy($.fn.DataTable.TableTools.DEFAULTS.oTags)\n                };\n            }\n        }\n\n        function _revertToDTFn() {\n            $.extend($.fn.dataTableExt.oStdClasses, _savedFn.oStdClasses);\n            $.fn.dataTableExt.oApi.fnPagingInfo = _savedFn.fnPagingInfo;\n            $.extend(true, $.fn.DataTable.ext.renderer, _savedFn.renderer);\n        }\n\n        function _overrideClasses() {\n            /* Default class modification */\n            $.extend($.fn.dataTableExt.oStdClasses, {\n                'sWrapper': 'dataTables_wrapper form-inline',\n                'sFilterInput': 'form-control input-sm',\n                'sLengthSelect': 'form-control input-sm',\n                'sFilter': 'dataTables_filter',\n                'sLength': 'dataTables_length'\n            });\n        }\n\n        function _overridePagingInfo() {\n            /* API method to get paging information */\n            $.fn.dataTableExt.oApi.fnPagingInfo = function(oSettings) {\n                return {\n                    'iStart': oSettings._iDisplayStart,\n                    'iEnd': oSettings.fnDisplayEnd(),\n                    'iLength': oSettings._iDisplayLength,\n                    'iTotal': oSettings.fnRecordsTotal(),\n                    'iFilteredTotal': oSettings.fnRecordsDisplay(),\n                    'iPage': oSettings._iDisplayLength === -1 ? 0 : Math.ceil(oSettings._iDisplayStart / oSettings._iDisplayLength),\n                    'iTotalPages': oSettings._iDisplayLength === -1 ? 0 : Math.ceil(oSettings.fnRecordsDisplay() / oSettings._iDisplayLength)\n                };\n            };\n        }\n\n        function _overridePagination(bootstrapOptions) {\n            // Note: Copy paste with some changes from DataTables v1.10.1 source code\n            $.extend(true, $.fn.DataTable.ext.renderer, {\n                pageButton: {\n                    _: function(settings, host, idx, buttons, page, pages) {\n                        var classes = settings.oClasses;\n                        var lang = settings.language ? settings.language.oPaginate : settings.oLanguage.oPaginate;\n                        var btnDisplay, btnClass, counter = 0;\n                        var paginationClasses = DTPropertyUtil.overrideProperties(\n                            DTBootstrapDefaultOptions.getOptions().pagination,\n                            bootstrapOptions ? bootstrapOptions.pagination : null\n                        );\n                        var $paginationContainer = $('<ul></ul>', {\n                            'class': paginationClasses.classes.ul\n                        });\n\n                        var attach = function(container, buttons) {\n                            var i, ien, node, button;\n                            var clickHandler = function(e) {\n                                e.preventDefault();\n                                // IMPORTANT: Reference to internal functions of DT. It might change between versions\n                                $.fn.DataTable.ext.internal._fnPageChange(settings, e.data.action, true);\n                            };\n\n\n                            for (i = 0, ien = buttons.length; i < ien; i++) {\n                                button = buttons[i];\n\n                                if ($.isArray(button)) {\n                                    // Override DT element\n                                    button.DT_el = 'li';\n                                    var inner = $('<' + (button.DT_el || 'div') + '/>')\n                                        .appendTo($paginationContainer);\n                                    attach(inner, button);\n                                } else {\n                                    btnDisplay = '';\n                                    btnClass = '';\n                                    var $paginationBtn = $('<li></li>'),\n                                        isDisabled;\n\n                                    switch (button) {\n                                        case 'ellipsis':\n                                            $paginationContainer.append('<li class=\"disabled\"><a href=\"#\" onClick=\"event.preventDefault()\">&hellip;</a></li>');\n                                            break;\n\n                                        case 'first':\n                                            btnDisplay = lang.sFirst;\n                                            btnClass = button;\n                                            if (page <= 0) {\n                                                $paginationBtn.addClass(classes.sPageButtonDisabled);\n                                                isDisabled = true;\n                                            }\n                                            break;\n\n                                        case 'previous':\n                                            btnDisplay = lang.sPrevious;\n                                            btnClass = button;\n                                            if (page <= 0) {\n                                                $paginationBtn.addClass(classes.sPageButtonDisabled);\n                                                isDisabled = true;\n                                            }\n                                            break;\n\n                                        case 'next':\n                                            btnDisplay = lang.sNext;\n                                            btnClass = button;\n                                            if (page >= pages - 1) {\n                                                $paginationBtn.addClass(classes.sPageButtonDisabled);\n                                                isDisabled = true;\n                                            }\n                                            break;\n\n                                        case 'last':\n                                            btnDisplay = lang.sLast;\n                                            btnClass = button;\n                                            if (page >= pages - 1) {\n                                                $paginationBtn.addClass(classes.sPageButtonDisabled);\n                                                isDisabled = true;\n                                            }\n                                            break;\n\n                                        default:\n                                            btnDisplay = button + 1;\n                                            btnClass = '';\n                                            if (page === button) {\n                                                $paginationBtn.addClass(classes.sPageButtonActive);\n                                            }\n                                            break;\n                                    }\n\n                                    if (btnDisplay) {\n                                        $paginationBtn.appendTo($paginationContainer);\n                                        node = $('<a>', {\n                                                'href': '#',\n                                                'class': btnClass,\n                                                'aria-controls': settings.sTableId,\n                                                'data-dt-idx': counter,\n                                                'tabindex': settings.iTabIndex,\n                                                'id': idx === 0 && typeof button === 'string' ?\n                                                    settings.sTableId + '_' + button : null\n                                            })\n                                            .html(btnDisplay)\n                                            .appendTo($paginationBtn);\n\n                                        // IMPORTANT: Reference to internal functions of DT. It might change between versions\n                                        $.fn.DataTable.ext.internal._fnBindAction(\n                                            node, {\n                                                action: button\n                                            }, clickHandler\n                                        );\n\n                                        counter++;\n                                    }\n                                }\n                            }\n                        };\n\n                        // IE9 throws an 'unknown error' if document.activeElement is used\n                        // inside an iframe or frame. Try / catch the error. Not good for\n                        // accessibility, but neither are frames.\n                        try {\n                            // Because this approach is destroying and recreating the paging\n                            // elements, focus is lost on the select button which is bad for\n                            // accessibility. So we want to restore focus once the draw has\n                            // completed\n                            var activeEl = $(document.activeElement).data('dt-idx');\n\n                            // Add <ul> to the pagination\n                            var container = $(host).empty();\n                            $paginationContainer.appendTo(container);\n                            attach(container, buttons);\n\n                            if (activeEl !== null) {\n                                $(host).find('[data-dt-idx=' + activeEl + ']').focus();\n                            }\n                        } catch (e) {}\n                    }\n                }\n            });\n        }\n\n        function _addDrawCallbackFunction(fn) {\n            if (angular.isFunction(fn)) {\n                _drawCallbackFunctionList.push(fn);\n            }\n        }\n\n        function _init(bootstrapOptions) {\n            if (!_initialized) {\n                _saveFnToBeOverrided();\n                _overrideClasses();\n                _overridePagingInfo();\n                _overridePagination(bootstrapOptions);\n\n                _addDrawCallbackFunction(function() {\n                    $('div.dataTables_filter').find('input').addClass('form-control');\n                    $('div.dataTables_length').find('select').addClass('form-control');\n                });\n\n                _initialized = true;\n            }\n        }\n\n        function _setDom(options) {\n            if (!options.dom || options.dom === $.fn.dataTable.defaults.sDom) {\n                return DTBootstrapDefaultOptions.getOptions().dom;\n            }\n            return options.dom;\n        }\n        /**\n         * Integrate Bootstrap\n         * @param options the datatables options\n         */\n        function integrate(options) {\n            _init(options.bootstrap);\n            DTBootstrapTableTools.integrate(options.bootstrap);\n            DTBootstrapColVis.integrate(_addDrawCallbackFunction, options.bootstrap);\n\n            options.dom = _setDom(options);\n            if (angular.isUndefined(options.fnDrawCallback)) {\n                // Call every drawcallback functions\n                options.fnDrawCallback = function() {\n                    for (var index = 0; index < _drawCallbackFunctionList.length; index++) {\n                        _drawCallbackFunctionList[index]();\n                    }\n                };\n            }\n        }\n\n        function deIntegrate() {\n            if (_initialized) {\n                _revertToDTFn();\n                DTBootstrapTableTools.deIntegrate();\n                DTBootstrapColVis.deIntegrate();\n                _initialized = false;\n            }\n        }\n    }\n    dtBootstrap.$inject = ['DTBootstrapTableTools', 'DTBootstrapColVis', 'DTBootstrapDefaultOptions', 'DTPropertyUtil'];\n\n    'use strict';\n    angular.module('datatables.bootstrap.options', ['datatables.options', 'datatables.util'])\n        .constant('DT_BOOTSTRAP_DEFAULT_OPTIONS', {\n            TableTools: {\n                classes: {\n                    container: 'DTTT btn-group',\n                    buttons: {\n                        normal: 'btn btn-default',\n                        disabled: 'disabled'\n                    },\n                    collection: {\n                        container: 'DTTT_dropdown dropdown-menu',\n                        buttons: {\n                            normal: '',\n                            disabled: 'disabled'\n                        }\n                    },\n                    print: {\n                        info: 'DTTT_print_info modal'\n                    },\n                    select: {\n                        row: 'active'\n                    }\n                },\n                DEFAULTS: {\n                    oTags: {\n                        collection: {\n                            container: 'ul',\n                            button: 'li',\n                            liner: 'a'\n                        }\n                    }\n                }\n            },\n            ColVis: {\n                classes: {\n                    masterButton: 'btn btn-default'\n                }\n            },\n            pagination: {\n                classes: {\n                    ul: 'pagination'\n                }\n            },\n            dom: '<\\'row\\'<\\'col-xs-6\\'l><\\'col-xs-6\\'f>r>t<\\'row\\'<\\'col-xs-6\\'i><\\'col-xs-6\\'p>>'\n        })\n        .factory('DTBootstrapDefaultOptions', dtBootstrapDefaultOptions);\n\n    /* @ngInject */\n    function dtBootstrapDefaultOptions(DTDefaultOptions, DTPropertyUtil, DT_BOOTSTRAP_DEFAULT_OPTIONS) {\n        return {\n            getOptions: getOptions\n        };\n        /**\n         * Get the default options for bootstrap integration\n         * @returns {*} the bootstrap default options\n         */\n        function getOptions() {\n            return DTPropertyUtil.overrideProperties(DT_BOOTSTRAP_DEFAULT_OPTIONS, DTDefaultOptions.bootstrapOptions);\n        }\n    }\n    dtBootstrapDefaultOptions.$inject = ['DTDefaultOptions', 'DTPropertyUtil', 'DT_BOOTSTRAP_DEFAULT_OPTIONS'];\n\n    'use strict';\n\n    angular.module('datatables.bootstrap.tabletools', ['datatables.bootstrap.options', 'datatables.util'])\n        .service('DTBootstrapTableTools', dtBootstrapTableTools);\n\n    /* @ngInject */\n    function dtBootstrapTableTools(DTPropertyUtil, DTBootstrapDefaultOptions) {\n        var _initializedTableTools = false,\n            _savedFn = {};\n\n        return {\n            integrate: integrate,\n            deIntegrate: deIntegrate\n        };\n\n        function integrate(bootstrapOptions) {\n            if (!_initializedTableTools) {\n                _saveFnToBeOverrided();\n\n                /*\n                 * TableTools Bootstrap compatibility\n                 * Required TableTools 2.1+\n                 */\n                if ($.fn.DataTable.TableTools) {\n                    var tableToolsOptions = DTPropertyUtil.overrideProperties(\n                        DTBootstrapDefaultOptions.getOptions().TableTools,\n                        bootstrapOptions ? bootstrapOptions.TableTools : null\n                    );\n                    // Set the classes that TableTools uses to something suitable for Bootstrap\n                    $.extend(true, $.fn.DataTable.TableTools.classes, tableToolsOptions.classes);\n\n                    // Have the collection use a bootstrap compatible dropdown\n                    $.extend(true, $.fn.DataTable.TableTools.DEFAULTS.oTags, tableToolsOptions.DEFAULTS.oTags);\n                }\n\n                _initializedTableTools = true;\n            }\n        }\n\n        function deIntegrate() {\n            if (_initializedTableTools && $.fn.DataTable.TableTools && _savedFn.TableTools) {\n                $.extend(true, $.fn.DataTable.TableTools.classes, _savedFn.TableTools.classes);\n                $.extend(true, $.fn.DataTable.TableTools.DEFAULTS.oTags, _savedFn.TableTools.oTags);\n                _initializedTableTools = false;\n            }\n        }\n\n        function _saveFnToBeOverrided() {\n            if ($.fn.DataTable.TableTools) {\n                _savedFn.TableTools = {\n                    classes: angular.copy($.fn.DataTable.TableTools.classes),\n                    oTags: angular.copy($.fn.DataTable.TableTools.DEFAULTS.oTags)\n                };\n            }\n        }\n    }\n    dtBootstrapTableTools.$inject = ['DTPropertyUtil', 'DTBootstrapDefaultOptions'];\n\n\n})(window, document, jQuery, angular);\n\n/*!\n * angular-datatables - v0.5.7\n * https://github.com/l-lin/angular-datatables\n * License: MIT\n */\nif (typeof module !== \"undefined\" && typeof exports !== \"undefined\" && module.exports === exports) {\n    module.exports = 'datatables.colreorder';\n}\n(function(window, document, $, angular) {\n\n    'use strict';\n\n    // See https://datatables.net/extras/colreorder/\n    angular.module('datatables.colreorder', ['datatables'])\n        .config(dtColReorderConfig);\n\n    /* @ngInject */\n    function dtColReorderConfig($provide) {\n        $provide.decorator('DTOptionsBuilder', dtOptionsBuilderDecorator);\n\n        function dtOptionsBuilderDecorator($delegate) {\n            var newOptions = $delegate.newOptions;\n            var fromSource = $delegate.fromSource;\n            var fromFnPromise = $delegate.fromFnPromise;\n\n            $delegate.newOptions = function() {\n                return _decorateOptions(newOptions);\n            };\n            $delegate.fromSource = function(ajax) {\n                return _decorateOptions(fromSource, ajax);\n            };\n            $delegate.fromFnPromise = function(fnPromise) {\n                return _decorateOptions(fromFnPromise, fnPromise);\n            };\n\n            return $delegate;\n\n            function _decorateOptions(fn, params) {\n                var options = fn(params);\n                options.withColReorder = withColReorder;\n                options.withColReorderOption = withColReorderOption;\n                options.withColReorderOrder = withColReorderOrder;\n                options.withColReorderCallback = withColReorderCallback;\n                return options;\n\n                /**\n                 * Add colReorder compatibility\n                 * @returns {DTOptions} the options\n                 */\n                function withColReorder() {\n                    var colReorderPrefix = 'R';\n                    options.dom = options.dom ? options.dom : $.fn.dataTable.defaults.sDom;\n                    if (options.dom.indexOf(colReorderPrefix) === -1) {\n                        options.dom = colReorderPrefix + options.dom;\n                    }\n                    options.hasColReorder = true;\n                    return options;\n                }\n\n                /**\n                 * Add option to \"oColReorder\" option\n                 * @param key the key of the option to add\n                 * @param value an object or a function of the function\n                 * @return {DTOptions} the options\n                 */\n                function withColReorderOption(key, value) {\n                    if (angular.isString(key)) {\n                        options.oColReorder = options.oColReorder && options.oColReorder !== null ? options.oColReorder : {};\n                        options.oColReorder[key] = value;\n                    }\n                    return options;\n                }\n\n                /**\n                 * Set the default column order\n                 * @param aiOrder the column order\n                 * @returns {DTOptions} the options\n                 */\n                function withColReorderOrder(aiOrder) {\n                    if (angular.isArray(aiOrder)) {\n                        options.withColReorderOption('aiOrder', aiOrder);\n                    }\n                    return options;\n                }\n\n                /**\n                 * Set the reorder callback function\n                 * @param fnReorderCallback the callback\n                 * @returns {DTOptions} the options\n                 */\n                function withColReorderCallback(fnReorderCallback) {\n                    if (angular.isFunction(fnReorderCallback)) {\n                        options.withColReorderOption('fnReorderCallback', fnReorderCallback);\n                    } else {\n                        throw new Error('The reorder callback must be a function');\n                    }\n                    return options;\n                }\n            }\n        }\n        dtOptionsBuilderDecorator.$inject = ['$delegate'];\n    }\n    dtColReorderConfig.$inject = ['$provide'];\n\n\n})(window, document, jQuery, angular);\n\n/*!\n * angular-datatables - v0.5.7\n * https://github.com/l-lin/angular-datatables\n * License: MIT\n */\nif (typeof module !== \"undefined\" && typeof exports !== \"undefined\" && module.exports === exports) {\n    module.exports = 'datatables.columnfilter';\n}\n(function(window, document, $, angular) {\n\n    'use strict';\n\n    // See http://jquery-datatables-column-filter.googlecode.com/svn/trunk/index.html\n    angular.module('datatables.columnfilter', ['datatables'])\n        .config(dtColumnFilterConfig)\n        .run(initColumnFilterPlugin);\n\n    /* @ngInject */\n    function dtColumnFilterConfig($provide) {\n        $provide.decorator('DTOptionsBuilder', dtOptionsBuilderDecorator);\n\n        function dtOptionsBuilderDecorator($delegate) {\n            var newOptions = $delegate.newOptions;\n            var fromSource = $delegate.fromSource;\n            var fromFnPromise = $delegate.fromFnPromise;\n\n            $delegate.newOptions = function() {\n                return _decorateOptions(newOptions);\n            };\n            $delegate.fromSource = function(ajax) {\n                return _decorateOptions(fromSource, ajax);\n            };\n            $delegate.fromFnPromise = function(fnPromise) {\n                return _decorateOptions(fromFnPromise, fnPromise);\n            };\n\n            return $delegate;\n\n            function _decorateOptions(fn, params) {\n                var options = fn(params);\n                options.withColumnFilter = withColumnFilter;\n                return options;\n\n                /**\n                 * Add column filter support\n                 * @param columnFilterOptions the plugins options\n                 * @returns {DTOptions} the options\n                 */\n                function withColumnFilter(columnFilterOptions) {\n                    options.hasColumnFilter = true;\n                    if (columnFilterOptions) {\n                        options.columnFilterOptions = columnFilterOptions;\n                    }\n                    return options;\n                }\n            }\n        }\n        dtOptionsBuilderDecorator.$inject = ['$delegate'];\n    }\n    dtColumnFilterConfig.$inject = ['$provide'];\n\n    /* @ngInject */\n    function initColumnFilterPlugin(DTRendererService) {\n        var columnFilterPlugin = {\n            postRender: postRender\n        };\n        DTRendererService.registerPlugin(columnFilterPlugin);\n\n        function postRender(options, result) {\n            if (options && options.hasColumnFilter) {\n                result.dataTable.columnFilter(options.columnFilterOptions);\n            }\n        }\n    }\n    initColumnFilterPlugin.$inject = ['DTRendererService'];\n\n\n})(window, document, jQuery, angular);\n\n/*!\n * angular-datatables - v0.5.7\n * https://github.com/l-lin/angular-datatables\n * License: MIT\n */\nif (typeof module !== \"undefined\" && typeof exports !== \"undefined\" && module.exports === exports) {\n    module.exports = 'datatables.light-columnfilter';\n}\n(function(window, document, $, angular) {\n\n    'use strict';\n\n    // See https://github.com/thansen-solire/datatables-light-columnfilter\n    angular.module('datatables.light-columnfilter', ['datatables'])\n        .config(dtLightColumnFilterConfig)\n        .run(initLightColumnFilterPlugin);\n\n    /* @ngInject */\n    function dtLightColumnFilterConfig($provide) {\n        $provide.decorator('DTOptionsBuilder', dtOptionsBuilderDecorator);\n\n        function dtOptionsBuilderDecorator($delegate) {\n            var newOptions = $delegate.newOptions;\n            var fromSource = $delegate.fromSource;\n            var fromFnPromise = $delegate.fromFnPromise;\n\n            $delegate.newOptions = function() {\n                return _decorateOptions(newOptions);\n            };\n            $delegate.fromSource = function(ajax) {\n                return _decorateOptions(fromSource, ajax);\n            };\n            $delegate.fromFnPromise = function(fnPromise) {\n                return _decorateOptions(fromFnPromise, fnPromise);\n            };\n\n            return $delegate;\n\n            function _decorateOptions(fn, params) {\n                var options = fn(params);\n                options.withLightColumnFilter = withLightColumnFilter;\n                return options;\n\n                /**\n                 * Add column filter support\n                 * @param lightColumnFilterOptions the plugins options\n                 * @returns {DTOptions} the options\n                 */\n                function withLightColumnFilter(lightColumnFilterOptions) {\n                    options.hasLightColumnFilter = true;\n                    if (lightColumnFilterOptions) {\n                        options.lightColumnFilterOptions = lightColumnFilterOptions;\n                    }\n                    return options;\n                }\n            }\n        }\n        dtOptionsBuilderDecorator.$inject = ['$delegate'];\n    }\n    dtLightColumnFilterConfig.$inject = ['$provide'];\n\n    /* @ngInject */\n    function initLightColumnFilterPlugin(DTRendererService) {\n        var lightColumnFilterPlugin = {\n            postRender: postRender\n        };\n        DTRendererService.registerPlugin(lightColumnFilterPlugin);\n\n        function postRender(options, result) {\n            if (options && options.hasLightColumnFilter) {\n                new $.fn.dataTable.ColumnFilter(result.DataTable, options.lightColumnFilterOptions);\n            }\n        }\n    }\n    initLightColumnFilterPlugin.$inject = ['DTRendererService'];\n\n\n})(window, document, jQuery, angular);\n\n/*!\n * angular-datatables - v0.5.7\n * https://github.com/l-lin/angular-datatables\n * License: MIT\n */\nif (typeof module !== \"undefined\" && typeof exports !== \"undefined\" && module.exports === exports) {\n    module.exports = 'datatables.colvis';\n}\n(function(window, document, $, angular) {\n\n    'use strict';\n\n    // See https://datatables.net/extras/colvis/\n    angular.module('datatables.colvis', ['datatables'])\n        .config(dtColVisConfig);\n\n    /* @ngInject */\n    function dtColVisConfig($provide) {\n        $provide.decorator('DTOptionsBuilder', dtOptionsBuilderDecorator);\n\n        function dtOptionsBuilderDecorator($delegate) {\n            var newOptions = $delegate.newOptions;\n            var fromSource = $delegate.fromSource;\n            var fromFnPromise = $delegate.fromFnPromise;\n\n            $delegate.newOptions = function() {\n                return _decorateOptions(newOptions);\n            };\n            $delegate.fromSource = function(ajax) {\n                return _decorateOptions(fromSource, ajax);\n            };\n            $delegate.fromFnPromise = function(fnPromise) {\n                return _decorateOptions(fromFnPromise, fnPromise);\n            };\n\n            return $delegate;\n\n            function _decorateOptions(fn, params) {\n                var options = fn(params);\n                options.withColVis = withColVis;\n                options.withColVisOption = withColVisOption;\n                options.withColVisStateChange = withColVisStateChange;\n                return options;\n\n                /**\n                 * Add colVis compatibility\n                 * @returns {DTOptions} the options\n                 */\n                function withColVis() {\n                    console.warn('The colvis extension has been retired. Please use the button extension instead: https://datatables.net/extensions/buttons/');\n                    var colVisPrefix = 'C';\n                    options.dom = options.dom ? options.dom : $.fn.dataTable.defaults.sDom;\n                    if (options.dom.indexOf(colVisPrefix) === -1) {\n                        options.dom = colVisPrefix + options.dom;\n                    }\n                    options.hasColVis = true;\n                    return options;\n                }\n\n                /**\n                 * Add option to \"oColVis\" option\n                 * @param key the key of the option to add\n                 * @param value an object or a function of the function\n                 * @returns {DTOptions} the options\n                 */\n                function withColVisOption(key, value) {\n                    if (angular.isString(key)) {\n                        options.oColVis = options.oColVis && options.oColVis !== null ? options.oColVis : {};\n                        options.oColVis[key] = value;\n                    }\n                    return options;\n                }\n\n                /**\n                 * Set the state change function\n                 * @param fnStateChange  the state change function\n                 * @returns {DTOptions} the options\n                 */\n                function withColVisStateChange(fnStateChange) {\n                    if (angular.isFunction(fnStateChange)) {\n                        options.withColVisOption('fnStateChange', fnStateChange);\n                    } else {\n                        throw new Error('The state change must be a function');\n                    }\n                    return options;\n                }\n            }\n        }\n        dtOptionsBuilderDecorator.$inject = ['$delegate'];\n    }\n    dtColVisConfig.$inject = ['$provide'];\n\n\n})(window, document, jQuery, angular);\n\n/*!\n * angular-datatables - v0.5.7\n * https://github.com/l-lin/angular-datatables\n * License: MIT\n */\nif (typeof module !== \"undefined\" && typeof exports !== \"undefined\" && module.exports === exports) {\n    module.exports = 'datatables.fixedcolumns';\n}\n(function(window, document, $, angular) {\n\n    'use strict';\n\n    // See https://datatables.net/extensions/fixedcolumns/\n    angular.module('datatables.fixedcolumns', ['datatables'])\n        .config(dtFixedColumnsConfig);\n\n    /* @ngInject */\n    function dtFixedColumnsConfig($provide) {\n        $provide.decorator('DTOptionsBuilder', dtOptionsBuilderDecorator);\n\n        function dtOptionsBuilderDecorator($delegate) {\n            var newOptions = $delegate.newOptions;\n            var fromSource = $delegate.fromSource;\n            var fromFnPromise = $delegate.fromFnPromise;\n\n            $delegate.newOptions = function() {\n                return _decorateOptions(newOptions);\n            };\n            $delegate.fromSource = function(ajax) {\n                return _decorateOptions(fromSource, ajax);\n            };\n            $delegate.fromFnPromise = function(fnPromise) {\n                return _decorateOptions(fromFnPromise, fnPromise);\n            };\n\n            return $delegate;\n\n            function _decorateOptions(fn, params) {\n                var options = fn(params);\n                options.withFixedColumns = withFixedColumns;\n                return options;\n\n                /**\n                 * Add fixed columns support\n                 * @param fixedColumnsOptions the plugin options\n                 * @returns {DTOptions} the options\n                 */\n                function withFixedColumns(fixedColumnsOptions) {\n                    options.fixedColumns = true;\n                    if (fixedColumnsOptions) {\n                        options.fixedColumns = fixedColumnsOptions;\n                    }\n                    return options;\n                }\n            }\n        }\n        dtOptionsBuilderDecorator.$inject = ['$delegate'];\n    }\n    dtFixedColumnsConfig.$inject = ['$provide'];\n\n\n})(window, document, jQuery, angular);\n\n/*!\n * angular-datatables - v0.5.7\n * https://github.com/l-lin/angular-datatables\n * License: MIT\n */\nif (typeof module !== \"undefined\" && typeof exports !== \"undefined\" && module.exports === exports) {\n    module.exports = 'datatables.fixedheader';\n}\n(function(window, document, $, angular) {\n\n    'use strict';\n\n    // See https://datatables.net/extensions/fixedheader/\n    angular.module('datatables.fixedheader', ['datatables'])\n        .config(dtFixedHeaderConfig)\n        .run(initFixedHeaderPlugin);\n\n    /* @ngInject */\n    function dtFixedHeaderConfig($provide) {\n        $provide.decorator('DTOptionsBuilder', dtOptionsBuilderDecorator);\n\n        function dtOptionsBuilderDecorator($delegate) {\n            var newOptions = $delegate.newOptions;\n            var fromSource = $delegate.fromSource;\n            var fromFnPromise = $delegate.fromFnPromise;\n\n            $delegate.newOptions = function() {\n                return _decorateOptions(newOptions);\n            };\n            $delegate.fromSource = function(ajax) {\n                return _decorateOptions(fromSource, ajax);\n            };\n            $delegate.fromFnPromise = function(fnPromise) {\n                return _decorateOptions(fromFnPromise, fnPromise);\n            };\n\n            return $delegate;\n\n            function _decorateOptions(fn, params) {\n                var options = fn(params);\n                options.withFixedHeader = withFixedHeader;\n                return options;\n\n                /**\n                 * Add fixed header support\n                 * @param fixedHeaderOptions the plugin options\n                 * @returns {DTOptions} the options\n                 */\n                function withFixedHeader(fixedHeaderOptions) {\n                    options.hasFixedHeader = true;\n                    if (fixedHeaderOptions) {\n                        options.fixedHeaderOptions = fixedHeaderOptions;\n                    }\n                    return options;\n                }\n            }\n        }\n        dtOptionsBuilderDecorator.$inject = ['$delegate'];\n    }\n    dtFixedHeaderConfig.$inject = ['$provide'];\n\n    /* @ngInject */\n    function initFixedHeaderPlugin(DTRendererService) {\n        var fixedHeaderPlugin = {\n            postRender: postRender\n        };\n        DTRendererService.registerPlugin(fixedHeaderPlugin);\n\n        function postRender(options, result) {\n            if (options && options.hasFixedHeader) {\n                new $.fn.dataTable.FixedHeader(result.DataTable, options.fixedHeaderOptions);\n            }\n        }\n    }\n    initFixedHeaderPlugin.$inject = ['DTRendererService'];\n\n\n})(window, document, jQuery, angular);\n\n/*!\n * angular-datatables - v0.5.7\n * https://github.com/l-lin/angular-datatables\n * License: MIT\n */\nif (typeof module !== \"undefined\" && typeof exports !== \"undefined\" && module.exports === exports) {\n    module.exports = 'datatables.scroller';\n}\n(function(window, document, $, angular) {\n\n    'use strict';\n\n    // See http://datatables.net/extensions/scroller/\n    angular.module('datatables.scroller', ['datatables'])\n        .config(dtScrollerConfig);\n\n    /* @ngInject */\n    function dtScrollerConfig($provide) {\n        $provide.decorator('DTOptionsBuilder', dtOptionsBuilderDecorator);\n\n        function dtOptionsBuilderDecorator($delegate) {\n            var newOptions = $delegate.newOptions;\n            var fromSource = $delegate.fromSource;\n            var fromFnPromise = $delegate.fromFnPromise;\n\n            $delegate.newOptions = function() {\n                return _decorateOptions(newOptions);\n            };\n            $delegate.fromSource = function(ajax) {\n                return _decorateOptions(fromSource, ajax);\n            };\n            $delegate.fromFnPromise = function(fnPromise) {\n                return _decorateOptions(fromFnPromise, fnPromise);\n            };\n\n            return $delegate;\n\n            function _decorateOptions(fn, params) {\n                var options = fn(params);\n                options.withScroller = withScroller;\n                return options;\n\n                /**\n                 * Add scroller compatibility\n                 * @returns {DTOptions} the options\n                 */\n                function withScroller() {\n                    var scrollerSuffix = 'S';\n                    options.dom = options.dom ? options.dom : $.fn.dataTable.defaults.sDom;\n                    if (options.dom.indexOf(scrollerSuffix) === -1) {\n                        options.dom = options.dom + scrollerSuffix;\n                    }\n                    return options;\n                }\n            }\n        }\n        dtOptionsBuilderDecorator.$inject = ['$delegate'];\n    }\n    dtScrollerConfig.$inject = ['$provide'];\n\n\n})(window, document, jQuery, angular);\n\n/*!\n * angular-datatables - v0.5.7\n * https://github.com/l-lin/angular-datatables\n * License: MIT\n */\nif (typeof module !== \"undefined\" && typeof exports !== \"undefined\" && module.exports === exports) {\n    module.exports = 'datatables.tabletools';\n}\n(function(window, document, $, angular) {\n\n    'use strict';\n\n    // See https://datatables.net/extras/tabletools/\n    angular.module('datatables.tabletools', ['datatables'])\n        .config(dtTableToolsConfig);\n\n    /* @ngInject */\n    function dtTableToolsConfig($provide) {\n        $provide.decorator('DTOptionsBuilder', dtOptionsBuilderDecorator);\n\n        function dtOptionsBuilderDecorator($delegate) {\n            var newOptions = $delegate.newOptions;\n            var fromSource = $delegate.fromSource;\n            var fromFnPromise = $delegate.fromFnPromise;\n\n            $delegate.newOptions = function() {\n                return _decorateOptions(newOptions);\n            };\n            $delegate.fromSource = function(ajax) {\n                return _decorateOptions(fromSource, ajax);\n            };\n            $delegate.fromFnPromise = function(fnPromise) {\n                return _decorateOptions(fromFnPromise, fnPromise);\n            };\n\n            return $delegate;\n\n            function _decorateOptions(fn, params) {\n                var options = fn(params);\n                options.withTableTools = withTableTools;\n                options.withTableToolsOption = withTableToolsOption;\n                options.withTableToolsButtons = withTableToolsButtons;\n                return options;\n\n                /**\n                 * Add table tools compatibility\n                 * @param sSwfPath the path to the swf file to export in csv/xls\n                 * @returns {DTOptions} the options\n                 */\n                function withTableTools(sSwfPath) {\n                    console.warn('The tabletools extension has been retired. Please use the select and buttons extensions instead: https://datatables.net/extensions/select/ and https://datatables.net/extensions/buttons/');\n                    var tableToolsPrefix = 'T';\n                    options.dom = options.dom ? options.dom : $.fn.dataTable.defaults.sDom;\n                    if (options.dom.indexOf(tableToolsPrefix) === -1) {\n                        options.dom = tableToolsPrefix + options.dom;\n                    }\n                    options.hasTableTools = true;\n                    if (angular.isString(sSwfPath)) {\n                        options.withTableToolsOption('sSwfPath', sSwfPath);\n                    }\n                    return options;\n                }\n\n                /**\n                 * Add option to \"oTableTools\" option\n                 * @param key the key of the option to add\n                 * @param value an object or a function of the function\n                 * @returns {DTOptions} the options\n                 */\n                function withTableToolsOption(key, value) {\n                    if (angular.isString(key)) {\n                        options.oTableTools = options.oTableTools && options.oTableTools !== null ? options.oTableTools : {};\n                        options.oTableTools[key] = value;\n                    }\n                    return options;\n                }\n\n                /**\n                 * Set the table tools buttons to display\n                 * @param aButtons the array of buttons to display\n                 * @returns {DTOptions} the options\n                 */\n                function withTableToolsButtons(aButtons) {\n                    if (angular.isArray(aButtons)) {\n                        options.withTableToolsOption('aButtons', aButtons);\n                    }\n                    return options;\n                }\n            }\n        }\n        dtOptionsBuilderDecorator.$inject = ['$delegate'];\n    }\n    dtTableToolsConfig.$inject = ['$provide'];\n\n\n})(window, document, jQuery, angular);\n\n/*!\n * angular-datatables - v0.5.7\n * https://github.com/l-lin/angular-datatables\n * License: MIT\n */\nif (typeof module !== \"undefined\" && typeof exports !== \"undefined\" && module.exports === exports) {\n    module.exports = 'datatables.buttons';\n}\n(function(window, document, $, angular) {\n\n    'use strict';\n\n    // See https://datatables.net/extensions/buttons/\n    angular.module('datatables.buttons', ['datatables'])\n        .config(dtButtonsConfig)\n        .run(initButtonsPlugin);\n\n    /* @ngInject */\n    function dtButtonsConfig($provide) {\n        $provide.decorator('DTOptionsBuilder', dtOptionsBuilderDecorator);\n\n        function dtOptionsBuilderDecorator($delegate) {\n            var newOptions = $delegate.newOptions;\n            var fromSource = $delegate.fromSource;\n            var fromFnPromise = $delegate.fromFnPromise;\n\n            $delegate.newOptions = function() {\n                return _decorateOptions(newOptions);\n            };\n            $delegate.fromSource = function(ajax) {\n                return _decorateOptions(fromSource, ajax);\n            };\n            $delegate.fromFnPromise = function(fnPromise) {\n                return _decorateOptions(fromFnPromise, fnPromise);\n            };\n\n            return $delegate;\n\n            function _decorateOptions(fn, params) {\n                var options = fn(params);\n                options.withButtons = withButtons;\n                return options;\n\n                /**\n                 * Add buttons compatibility\n                 * @param buttonsOptions the options of the buttons extension (see https://datatables.net/reference/option/buttons#Examples)\n                 * @returns {DTOptions} the options\n                 */\n                function withButtons(buttonsOptions) {\n                    var buttonsPrefix = 'B';\n                    options.dom = options.dom ? options.dom : $.fn.dataTable.defaults.sDom;\n                    if (options.dom.indexOf(buttonsPrefix) === -1) {\n                        options.dom = buttonsPrefix + options.dom;\n                    }\n                    if (angular.isUndefined(buttonsOptions)) {\n                        throw new Error('You must define the options for the button extension. See https://datatables.net/reference/option/buttons#Examples for some example');\n                    }\n                    options.buttons = buttonsOptions;\n                    return options;\n                }\n            }\n        }\n        dtOptionsBuilderDecorator.$inject = ['$delegate'];\n    }\n    dtButtonsConfig.$inject = ['$provide'];\n\n    /* @ngInject */\n    function initButtonsPlugin(DTRendererService) {\n        var buttonsPlugin = {\n            preRender: preRender,\n            postRender: postRender\n        };\n        DTRendererService.registerPlugin(buttonsPlugin);\n\n        function preRender(options) {\n            if (options && angular.isArray(options.buttons)) {\n                // The extension buttons seems to clear the content of the options.buttons for some reasons...\n                // So, we save it in a tmp variable so that we can restore it afterwards\n                // See https://github.com/l-lin/angular-datatables/issues/502\n                options.buttonsTmp = options.buttons.slice();\n            }\n        }\n\n        function postRender(options) {\n            if (options && angular.isDefined(options.buttonsTmp)) {\n                // Restore the buttons options\n                options.buttons = options.buttonsTmp;\n                delete options.buttonsTmp;\n            }\n        }\n    }\n    initButtonsPlugin.$inject = ['DTRendererService'];\n\n\n})(window, document, jQuery, angular);\n\n/*!\n * angular-datatables - v0.5.7\n * https://github.com/l-lin/angular-datatables\n * License: MIT\n */\nif (typeof module !== \"undefined\" && typeof exports !== \"undefined\" && module.exports === exports) {\n    module.exports = 'datatables.select';\n}\n(function(window, document, $, angular) {\n\n    'use strict';\n\n    // See https://datatables.net/extensions/select/\n    angular.module('datatables.select', ['datatables'])\n        .config(dtSelectConfig);\n\n    /* @ngInject */\n    function dtSelectConfig($provide) {\n        $provide.decorator('DTOptionsBuilder', dtOptionsBuilderDecorator);\n\n        function dtOptionsBuilderDecorator($delegate) {\n            var newOptions = $delegate.newOptions;\n            var fromSource = $delegate.fromSource;\n            var fromFnPromise = $delegate.fromFnPromise;\n\n            $delegate.newOptions = function() {\n                return _decorateOptions(newOptions);\n            };\n            $delegate.fromSource = function(ajax) {\n                return _decorateOptions(fromSource, ajax);\n            };\n            $delegate.fromFnPromise = function(fnPromise) {\n                return _decorateOptions(fromFnPromise, fnPromise);\n            };\n\n            return $delegate;\n\n            function _decorateOptions(fn, params) {\n                var options = fn(params);\n                options.withSelect = withSelect;\n                return options;\n\n                /**\n                 * Add select compatibility\n                 * @param selectOptions the options of the select extension (see https://datatables.net/reference/option/#select)\n                 * @returns {DTOptions} the options\n                 */\n                function withSelect(selectOptions) {\n                    if (angular.isUndefined(selectOptions)) {\n                        throw new Error('You must define the options for the select extension. See https://datatables.net/reference/option/#select');\n                    }\n                    options.select = selectOptions;\n                    return options;\n                }\n            }\n        }\n        dtOptionsBuilderDecorator.$inject = ['$delegate'];\n    }\n    dtSelectConfig.$inject = ['$provide'];\n\n\n})(window, document, jQuery, angular);\n\n!function() {\n  var d3 = {\n    version: \"3.5.17\"\n  };\n  var d3_arraySlice = [].slice, d3_array = function(list) {\n    return d3_arraySlice.call(list);\n  };\n  var d3_document = this.document;\n  function d3_documentElement(node) {\n    return node && (node.ownerDocument || node.document || node).documentElement;\n  }\n  function d3_window(node) {\n    return node && (node.ownerDocument && node.ownerDocument.defaultView || node.document && node || node.defaultView);\n  }\n  if (d3_document) {\n    try {\n      d3_array(d3_document.documentElement.childNodes)[0].nodeType;\n    } catch (e) {\n      d3_array = function(list) {\n        var i = list.length, array = new Array(i);\n        while (i--) array[i] = list[i];\n        return array;\n      };\n    }\n  }\n  if (!Date.now) Date.now = function() {\n    return +new Date();\n  };\n  if (d3_document) {\n    try {\n      d3_document.createElement(\"DIV\").style.setProperty(\"opacity\", 0, \"\");\n    } catch (error) {\n      var d3_element_prototype = this.Element.prototype, d3_element_setAttribute = d3_element_prototype.setAttribute, d3_element_setAttributeNS = d3_element_prototype.setAttributeNS, d3_style_prototype = this.CSSStyleDeclaration.prototype, d3_style_setProperty = d3_style_prototype.setProperty;\n      d3_element_prototype.setAttribute = function(name, value) {\n        d3_element_setAttribute.call(this, name, value + \"\");\n      };\n      d3_element_prototype.setAttributeNS = function(space, local, value) {\n        d3_element_setAttributeNS.call(this, space, local, value + \"\");\n      };\n      d3_style_prototype.setProperty = function(name, value, priority) {\n        d3_style_setProperty.call(this, name, value + \"\", priority);\n      };\n    }\n  }\n  d3.ascending = d3_ascending;\n  function d3_ascending(a, b) {\n    return a < b ? -1 : a > b ? 1 : a >= b ? 0 : NaN;\n  }\n  d3.descending = function(a, b) {\n    return b < a ? -1 : b > a ? 1 : b >= a ? 0 : NaN;\n  };\n  d3.min = function(array, f) {\n    var i = -1, n = array.length, a, b;\n    if (arguments.length === 1) {\n      while (++i < n) if ((b = array[i]) != null && b >= b) {\n        a = b;\n        break;\n      }\n      while (++i < n) if ((b = array[i]) != null && a > b) a = b;\n    } else {\n      while (++i < n) if ((b = f.call(array, array[i], i)) != null && b >= b) {\n        a = b;\n        break;\n      }\n      while (++i < n) if ((b = f.call(array, array[i], i)) != null && a > b) a = b;\n    }\n    return a;\n  };\n  d3.max = function(array, f) {\n    var i = -1, n = array.length, a, b;\n    if (arguments.length === 1) {\n      while (++i < n) if ((b = array[i]) != null && b >= b) {\n        a = b;\n        break;\n      }\n      while (++i < n) if ((b = array[i]) != null && b > a) a = b;\n    } else {\n      while (++i < n) if ((b = f.call(array, array[i], i)) != null && b >= b) {\n        a = b;\n        break;\n      }\n      while (++i < n) if ((b = f.call(array, array[i], i)) != null && b > a) a = b;\n    }\n    return a;\n  };\n  d3.extent = function(array, f) {\n    var i = -1, n = array.length, a, b, c;\n    if (arguments.length === 1) {\n      while (++i < n) if ((b = array[i]) != null && b >= b) {\n        a = c = b;\n        break;\n      }\n      while (++i < n) if ((b = array[i]) != null) {\n        if (a > b) a = b;\n        if (c < b) c = b;\n      }\n    } else {\n      while (++i < n) if ((b = f.call(array, array[i], i)) != null && b >= b) {\n        a = c = b;\n        break;\n      }\n      while (++i < n) if ((b = f.call(array, array[i], i)) != null) {\n        if (a > b) a = b;\n        if (c < b) c = b;\n      }\n    }\n    return [ a, c ];\n  };\n  function d3_number(x) {\n    return x === null ? NaN : +x;\n  }\n  function d3_numeric(x) {\n    return !isNaN(x);\n  }\n  d3.sum = function(array, f) {\n    var s = 0, n = array.length, a, i = -1;\n    if (arguments.length === 1) {\n      while (++i < n) if (d3_numeric(a = +array[i])) s += a;\n    } else {\n      while (++i < n) if (d3_numeric(a = +f.call(array, array[i], i))) s += a;\n    }\n    return s;\n  };\n  d3.mean = function(array, f) {\n    var s = 0, n = array.length, a, i = -1, j = n;\n    if (arguments.length === 1) {\n      while (++i < n) if (d3_numeric(a = d3_number(array[i]))) s += a; else --j;\n    } else {\n      while (++i < n) if (d3_numeric(a = d3_number(f.call(array, array[i], i)))) s += a; else --j;\n    }\n    if (j) return s / j;\n  };\n  d3.quantile = function(values, p) {\n    var H = (values.length - 1) * p + 1, h = Math.floor(H), v = +values[h - 1], e = H - h;\n    return e ? v + e * (values[h] - v) : v;\n  };\n  d3.median = function(array, f) {\n    var numbers = [], n = array.length, a, i = -1;\n    if (arguments.length === 1) {\n      while (++i < n) if (d3_numeric(a = d3_number(array[i]))) numbers.push(a);\n    } else {\n      while (++i < n) if (d3_numeric(a = d3_number(f.call(array, array[i], i)))) numbers.push(a);\n    }\n    if (numbers.length) return d3.quantile(numbers.sort(d3_ascending), .5);\n  };\n  d3.variance = function(array, f) {\n    var n = array.length, m = 0, a, d, s = 0, i = -1, j = 0;\n    if (arguments.length === 1) {\n      while (++i < n) {\n        if (d3_numeric(a = d3_number(array[i]))) {\n          d = a - m;\n          m += d / ++j;\n          s += d * (a - m);\n        }\n      }\n    } else {\n      while (++i < n) {\n        if (d3_numeric(a = d3_number(f.call(array, array[i], i)))) {\n          d = a - m;\n          m += d / ++j;\n          s += d * (a - m);\n        }\n      }\n    }\n    if (j > 1) return s / (j - 1);\n  };\n  d3.deviation = function() {\n    var v = d3.variance.apply(this, arguments);\n    return v ? Math.sqrt(v) : v;\n  };\n  function d3_bisector(compare) {\n    return {\n      left: function(a, x, lo, hi) {\n        if (arguments.length < 3) lo = 0;\n        if (arguments.length < 4) hi = a.length;\n        while (lo < hi) {\n          var mid = lo + hi >>> 1;\n          if (compare(a[mid], x) < 0) lo = mid + 1; else hi = mid;\n        }\n        return lo;\n      },\n      right: function(a, x, lo, hi) {\n        if (arguments.length < 3) lo = 0;\n        if (arguments.length < 4) hi = a.length;\n        while (lo < hi) {\n          var mid = lo + hi >>> 1;\n          if (compare(a[mid], x) > 0) hi = mid; else lo = mid + 1;\n        }\n        return lo;\n      }\n    };\n  }\n  var d3_bisect = d3_bisector(d3_ascending);\n  d3.bisectLeft = d3_bisect.left;\n  d3.bisect = d3.bisectRight = d3_bisect.right;\n  d3.bisector = function(f) {\n    return d3_bisector(f.length === 1 ? function(d, x) {\n      return d3_ascending(f(d), x);\n    } : f);\n  };\n  d3.shuffle = function(array, i0, i1) {\n    if ((m = arguments.length) < 3) {\n      i1 = array.length;\n      if (m < 2) i0 = 0;\n    }\n    var m = i1 - i0, t, i;\n    while (m) {\n      i = Math.random() * m-- | 0;\n      t = array[m + i0], array[m + i0] = array[i + i0], array[i + i0] = t;\n    }\n    return array;\n  };\n  d3.permute = function(array, indexes) {\n    var i = indexes.length, permutes = new Array(i);\n    while (i--) permutes[i] = array[indexes[i]];\n    return permutes;\n  };\n  d3.pairs = function(array) {\n    var i = 0, n = array.length - 1, p0, p1 = array[0], pairs = new Array(n < 0 ? 0 : n);\n    while (i < n) pairs[i] = [ p0 = p1, p1 = array[++i] ];\n    return pairs;\n  };\n  d3.transpose = function(matrix) {\n    if (!(n = matrix.length)) return [];\n    for (var i = -1, m = d3.min(matrix, d3_transposeLength), transpose = new Array(m); ++i < m; ) {\n      for (var j = -1, n, row = transpose[i] = new Array(n); ++j < n; ) {\n        row[j] = matrix[j][i];\n      }\n    }\n    return transpose;\n  };\n  function d3_transposeLength(d) {\n    return d.length;\n  }\n  d3.zip = function() {\n    return d3.transpose(arguments);\n  };\n  d3.keys = function(map) {\n    var keys = [];\n    for (var key in map) keys.push(key);\n    return keys;\n  };\n  d3.values = function(map) {\n    var values = [];\n    for (var key in map) values.push(map[key]);\n    return values;\n  };\n  d3.entries = function(map) {\n    var entries = [];\n    for (var key in map) entries.push({\n      key: key,\n      value: map[key]\n    });\n    return entries;\n  };\n  d3.merge = function(arrays) {\n    var n = arrays.length, m, i = -1, j = 0, merged, array;\n    while (++i < n) j += arrays[i].length;\n    merged = new Array(j);\n    while (--n >= 0) {\n      array = arrays[n];\n      m = array.length;\n      while (--m >= 0) {\n        merged[--j] = array[m];\n      }\n    }\n    return merged;\n  };\n  var abs = Math.abs;\n  d3.range = function(start, stop, step) {\n    if (arguments.length < 3) {\n      step = 1;\n      if (arguments.length < 2) {\n        stop = start;\n        start = 0;\n      }\n    }\n    if ((stop - start) / step === Infinity) throw new Error(\"infinite range\");\n    var range = [], k = d3_range_integerScale(abs(step)), i = -1, j;\n    start *= k, stop *= k, step *= k;\n    if (step < 0) while ((j = start + step * ++i) > stop) range.push(j / k); else while ((j = start + step * ++i) < stop) range.push(j / k);\n    return range;\n  };\n  function d3_range_integerScale(x) {\n    var k = 1;\n    while (x * k % 1) k *= 10;\n    return k;\n  }\n  function d3_class(ctor, properties) {\n    for (var key in properties) {\n      Object.defineProperty(ctor.prototype, key, {\n        value: properties[key],\n        enumerable: false\n      });\n    }\n  }\n  d3.map = function(object, f) {\n    var map = new d3_Map();\n    if (object instanceof d3_Map) {\n      object.forEach(function(key, value) {\n        map.set(key, value);\n      });\n    } else if (Array.isArray(object)) {\n      var i = -1, n = object.length, o;\n      if (arguments.length === 1) while (++i < n) map.set(i, object[i]); else while (++i < n) map.set(f.call(object, o = object[i], i), o);\n    } else {\n      for (var key in object) map.set(key, object[key]);\n    }\n    return map;\n  };\n  function d3_Map() {\n    this._ = Object.create(null);\n  }\n  var d3_map_proto = \"__proto__\", d3_map_zero = \"\\x00\";\n  d3_class(d3_Map, {\n    has: d3_map_has,\n    get: function(key) {\n      return this._[d3_map_escape(key)];\n    },\n    set: function(key, value) {\n      return this._[d3_map_escape(key)] = value;\n    },\n    remove: d3_map_remove,\n    keys: d3_map_keys,\n    values: function() {\n      var values = [];\n      for (var key in this._) values.push(this._[key]);\n      return values;\n    },\n    entries: function() {\n      var entries = [];\n      for (var key in this._) entries.push({\n        key: d3_map_unescape(key),\n        value: this._[key]\n      });\n      return entries;\n    },\n    size: d3_map_size,\n    empty: d3_map_empty,\n    forEach: function(f) {\n      for (var key in this._) f.call(this, d3_map_unescape(key), this._[key]);\n    }\n  });\n  function d3_map_escape(key) {\n    return (key += \"\") === d3_map_proto || key[0] === d3_map_zero ? d3_map_zero + key : key;\n  }\n  function d3_map_unescape(key) {\n    return (key += \"\")[0] === d3_map_zero ? key.slice(1) : key;\n  }\n  function d3_map_has(key) {\n    return d3_map_escape(key) in this._;\n  }\n  function d3_map_remove(key) {\n    return (key = d3_map_escape(key)) in this._ && delete this._[key];\n  }\n  function d3_map_keys() {\n    var keys = [];\n    for (var key in this._) keys.push(d3_map_unescape(key));\n    return keys;\n  }\n  function d3_map_size() {\n    var size = 0;\n    for (var key in this._) ++size;\n    return size;\n  }\n  function d3_map_empty() {\n    for (var key in this._) return false;\n    return true;\n  }\n  d3.nest = function() {\n    var nest = {}, keys = [], sortKeys = [], sortValues, rollup;\n    function map(mapType, array, depth) {\n      if (depth >= keys.length) return rollup ? rollup.call(nest, array) : sortValues ? array.sort(sortValues) : array;\n      var i = -1, n = array.length, key = keys[depth++], keyValue, object, setter, valuesByKey = new d3_Map(), values;\n      while (++i < n) {\n        if (values = valuesByKey.get(keyValue = key(object = array[i]))) {\n          values.push(object);\n        } else {\n          valuesByKey.set(keyValue, [ object ]);\n        }\n      }\n      if (mapType) {\n        object = mapType();\n        setter = function(keyValue, values) {\n          object.set(keyValue, map(mapType, values, depth));\n        };\n      } else {\n        object = {};\n        setter = function(keyValue, values) {\n          object[keyValue] = map(mapType, values, depth);\n        };\n      }\n      valuesByKey.forEach(setter);\n      return object;\n    }\n    function entries(map, depth) {\n      if (depth >= keys.length) return map;\n      var array = [], sortKey = sortKeys[depth++];\n      map.forEach(function(key, keyMap) {\n        array.push({\n          key: key,\n          values: entries(keyMap, depth)\n        });\n      });\n      return sortKey ? array.sort(function(a, b) {\n        return sortKey(a.key, b.key);\n      }) : array;\n    }\n    nest.map = function(array, mapType) {\n      return map(mapType, array, 0);\n    };\n    nest.entries = function(array) {\n      return entries(map(d3.map, array, 0), 0);\n    };\n    nest.key = function(d) {\n      keys.push(d);\n      return nest;\n    };\n    nest.sortKeys = function(order) {\n      sortKeys[keys.length - 1] = order;\n      return nest;\n    };\n    nest.sortValues = function(order) {\n      sortValues = order;\n      return nest;\n    };\n    nest.rollup = function(f) {\n      rollup = f;\n      return nest;\n    };\n    return nest;\n  };\n  d3.set = function(array) {\n    var set = new d3_Set();\n    if (array) for (var i = 0, n = array.length; i < n; ++i) set.add(array[i]);\n    return set;\n  };\n  function d3_Set() {\n    this._ = Object.create(null);\n  }\n  d3_class(d3_Set, {\n    has: d3_map_has,\n    add: function(key) {\n      this._[d3_map_escape(key += \"\")] = true;\n      return key;\n    },\n    remove: d3_map_remove,\n    values: d3_map_keys,\n    size: d3_map_size,\n    empty: d3_map_empty,\n    forEach: function(f) {\n      for (var key in this._) f.call(this, d3_map_unescape(key));\n    }\n  });\n  d3.behavior = {};\n  function d3_identity(d) {\n    return d;\n  }\n  d3.rebind = function(target, source) {\n    var i = 1, n = arguments.length, method;\n    while (++i < n) target[method = arguments[i]] = d3_rebind(target, source, source[method]);\n    return target;\n  };\n  function d3_rebind(target, source, method) {\n    return function() {\n      var value = method.apply(source, arguments);\n      return value === source ? target : value;\n    };\n  }\n  function d3_vendorSymbol(object, name) {\n    if (name in object) return name;\n    name = name.charAt(0).toUpperCase() + name.slice(1);\n    for (var i = 0, n = d3_vendorPrefixes.length; i < n; ++i) {\n      var prefixName = d3_vendorPrefixes[i] + name;\n      if (prefixName in object) return prefixName;\n    }\n  }\n  var d3_vendorPrefixes = [ \"webkit\", \"ms\", \"moz\", \"Moz\", \"o\", \"O\" ];\n  function d3_noop() {}\n  d3.dispatch = function() {\n    var dispatch = new d3_dispatch(), i = -1, n = arguments.length;\n    while (++i < n) dispatch[arguments[i]] = d3_dispatch_event(dispatch);\n    return dispatch;\n  };\n  function d3_dispatch() {}\n  d3_dispatch.prototype.on = function(type, listener) {\n    var i = type.indexOf(\".\"), name = \"\";\n    if (i >= 0) {\n      name = type.slice(i + 1);\n      type = type.slice(0, i);\n    }\n    if (type) return arguments.length < 2 ? this[type].on(name) : this[type].on(name, listener);\n    if (arguments.length === 2) {\n      if (listener == null) for (type in this) {\n        if (this.hasOwnProperty(type)) this[type].on(name, null);\n      }\n      return this;\n    }\n  };\n  function d3_dispatch_event(dispatch) {\n    var listeners = [], listenerByName = new d3_Map();\n    function event() {\n      var z = listeners, i = -1, n = z.length, l;\n      while (++i < n) if (l = z[i].on) l.apply(this, arguments);\n      return dispatch;\n    }\n    event.on = function(name, listener) {\n      var l = listenerByName.get(name), i;\n      if (arguments.length < 2) return l && l.on;\n      if (l) {\n        l.on = null;\n        listeners = listeners.slice(0, i = listeners.indexOf(l)).concat(listeners.slice(i + 1));\n        listenerByName.remove(name);\n      }\n      if (listener) listeners.push(listenerByName.set(name, {\n        on: listener\n      }));\n      return dispatch;\n    };\n    return event;\n  }\n  d3.event = null;\n  function d3_eventPreventDefault() {\n    d3.event.preventDefault();\n  }\n  function d3_eventSource() {\n    var e = d3.event, s;\n    while (s = e.sourceEvent) e = s;\n    return e;\n  }\n  function d3_eventDispatch(target) {\n    var dispatch = new d3_dispatch(), i = 0, n = arguments.length;\n    while (++i < n) dispatch[arguments[i]] = d3_dispatch_event(dispatch);\n    dispatch.of = function(thiz, argumentz) {\n      return function(e1) {\n        try {\n          var e0 = e1.sourceEvent = d3.event;\n          e1.target = target;\n          d3.event = e1;\n          dispatch[e1.type].apply(thiz, argumentz);\n        } finally {\n          d3.event = e0;\n        }\n      };\n    };\n    return dispatch;\n  }\n  d3.requote = function(s) {\n    return s.replace(d3_requote_re, \"\\\\$&\");\n  };\n  var d3_requote_re = /[\\\\\\^\\$\\*\\+\\?\\|\\[\\]\\(\\)\\.\\{\\}]/g;\n  var d3_subclass = {}.__proto__ ? function(object, prototype) {\n    object.__proto__ = prototype;\n  } : function(object, prototype) {\n    for (var property in prototype) object[property] = prototype[property];\n  };\n  function d3_selection(groups) {\n    d3_subclass(groups, d3_selectionPrototype);\n    return groups;\n  }\n  var d3_select = function(s, n) {\n    return n.querySelector(s);\n  }, d3_selectAll = function(s, n) {\n    return n.querySelectorAll(s);\n  }, d3_selectMatches = function(n, s) {\n    var d3_selectMatcher = n.matches || n[d3_vendorSymbol(n, \"matchesSelector\")];\n    d3_selectMatches = function(n, s) {\n      return d3_selectMatcher.call(n, s);\n    };\n    return d3_selectMatches(n, s);\n  };\n  if (typeof Sizzle === \"function\") {\n    d3_select = function(s, n) {\n      return Sizzle(s, n)[0] || null;\n    };\n    d3_selectAll = Sizzle;\n    d3_selectMatches = Sizzle.matchesSelector;\n  }\n  d3.selection = function() {\n    return d3.select(d3_document.documentElement);\n  };\n  var d3_selectionPrototype = d3.selection.prototype = [];\n  d3_selectionPrototype.select = function(selector) {\n    var subgroups = [], subgroup, subnode, group, node;\n    selector = d3_selection_selector(selector);\n    for (var j = -1, m = this.length; ++j < m; ) {\n      subgroups.push(subgroup = []);\n      subgroup.parentNode = (group = this[j]).parentNode;\n      for (var i = -1, n = group.length; ++i < n; ) {\n        if (node = group[i]) {\n          subgroup.push(subnode = selector.call(node, node.__data__, i, j));\n          if (subnode && \"__data__\" in node) subnode.__data__ = node.__data__;\n        } else {\n          subgroup.push(null);\n        }\n      }\n    }\n    return d3_selection(subgroups);\n  };\n  function d3_selection_selector(selector) {\n    return typeof selector === \"function\" ? selector : function() {\n      return d3_select(selector, this);\n    };\n  }\n  d3_selectionPrototype.selectAll = function(selector) {\n    var subgroups = [], subgroup, node;\n    selector = d3_selection_selectorAll(selector);\n    for (var j = -1, m = this.length; ++j < m; ) {\n      for (var group = this[j], i = -1, n = group.length; ++i < n; ) {\n        if (node = group[i]) {\n          subgroups.push(subgroup = d3_array(selector.call(node, node.__data__, i, j)));\n          subgroup.parentNode = node;\n        }\n      }\n    }\n    return d3_selection(subgroups);\n  };\n  function d3_selection_selectorAll(selector) {\n    return typeof selector === \"function\" ? selector : function() {\n      return d3_selectAll(selector, this);\n    };\n  }\n  var d3_nsXhtml = \"http://www.w3.org/1999/xhtml\";\n  var d3_nsPrefix = {\n    svg: \"http://www.w3.org/2000/svg\",\n    xhtml: d3_nsXhtml,\n    xlink: \"http://www.w3.org/1999/xlink\",\n    xml: \"http://www.w3.org/XML/1998/namespace\",\n    xmlns: \"http://www.w3.org/2000/xmlns/\"\n  };\n  d3.ns = {\n    prefix: d3_nsPrefix,\n    qualify: function(name) {\n      var i = name.indexOf(\":\"), prefix = name;\n      if (i >= 0 && (prefix = name.slice(0, i)) !== \"xmlns\") name = name.slice(i + 1);\n      return d3_nsPrefix.hasOwnProperty(prefix) ? {\n        space: d3_nsPrefix[prefix],\n        local: name\n      } : name;\n    }\n  };\n  d3_selectionPrototype.attr = function(name, value) {\n    if (arguments.length < 2) {\n      if (typeof name === \"string\") {\n        var node = this.node();\n        name = d3.ns.qualify(name);\n        return name.local ? node.getAttributeNS(name.space, name.local) : node.getAttribute(name);\n      }\n      for (value in name) this.each(d3_selection_attr(value, name[value]));\n      return this;\n    }\n    return this.each(d3_selection_attr(name, value));\n  };\n  function d3_selection_attr(name, value) {\n    name = d3.ns.qualify(name);\n    function attrNull() {\n      this.removeAttribute(name);\n    }\n    function attrNullNS() {\n      this.removeAttributeNS(name.space, name.local);\n    }\n    function attrConstant() {\n      this.setAttribute(name, value);\n    }\n    function attrConstantNS() {\n      this.setAttributeNS(name.space, name.local, value);\n    }\n    function attrFunction() {\n      var x = value.apply(this, arguments);\n      if (x == null) this.removeAttribute(name); else this.setAttribute(name, x);\n    }\n    function attrFunctionNS() {\n      var x = value.apply(this, arguments);\n      if (x == null) this.removeAttributeNS(name.space, name.local); else this.setAttributeNS(name.space, name.local, x);\n    }\n    return value == null ? name.local ? attrNullNS : attrNull : typeof value === \"function\" ? name.local ? attrFunctionNS : attrFunction : name.local ? attrConstantNS : attrConstant;\n  }\n  function d3_collapse(s) {\n    return s.trim().replace(/\\s+/g, \" \");\n  }\n  d3_selectionPrototype.classed = function(name, value) {\n    if (arguments.length < 2) {\n      if (typeof name === \"string\") {\n        var node = this.node(), n = (name = d3_selection_classes(name)).length, i = -1;\n        if (value = node.classList) {\n          while (++i < n) if (!value.contains(name[i])) return false;\n        } else {\n          value = node.getAttribute(\"class\");\n          while (++i < n) if (!d3_selection_classedRe(name[i]).test(value)) return false;\n        }\n        return true;\n      }\n      for (value in name) this.each(d3_selection_classed(value, name[value]));\n      return this;\n    }\n    return this.each(d3_selection_classed(name, value));\n  };\n  function d3_selection_classedRe(name) {\n    return new RegExp(\"(?:^|\\\\s+)\" + d3.requote(name) + \"(?:\\\\s+|$)\", \"g\");\n  }\n  function d3_selection_classes(name) {\n    return (name + \"\").trim().split(/^|\\s+/);\n  }\n  function d3_selection_classed(name, value) {\n    name = d3_selection_classes(name).map(d3_selection_classedName);\n    var n = name.length;\n    function classedConstant() {\n      var i = -1;\n      while (++i < n) name[i](this, value);\n    }\n    function classedFunction() {\n      var i = -1, x = value.apply(this, arguments);\n      while (++i < n) name[i](this, x);\n    }\n    return typeof value === \"function\" ? classedFunction : classedConstant;\n  }\n  function d3_selection_classedName(name) {\n    var re = d3_selection_classedRe(name);\n    return function(node, value) {\n      if (c = node.classList) return value ? c.add(name) : c.remove(name);\n      var c = node.getAttribute(\"class\") || \"\";\n      if (value) {\n        re.lastIndex = 0;\n        if (!re.test(c)) node.setAttribute(\"class\", d3_collapse(c + \" \" + name));\n      } else {\n        node.setAttribute(\"class\", d3_collapse(c.replace(re, \" \")));\n      }\n    };\n  }\n  d3_selectionPrototype.style = function(name, value, priority) {\n    var n = arguments.length;\n    if (n < 3) {\n      if (typeof name !== \"string\") {\n        if (n < 2) value = \"\";\n        for (priority in name) this.each(d3_selection_style(priority, name[priority], value));\n        return this;\n      }\n      if (n < 2) {\n        var node = this.node();\n        return d3_window(node).getComputedStyle(node, null).getPropertyValue(name);\n      }\n      priority = \"\";\n    }\n    return this.each(d3_selection_style(name, value, priority));\n  };\n  function d3_selection_style(name, value, priority) {\n    function styleNull() {\n      this.style.removeProperty(name);\n    }\n    function styleConstant() {\n      this.style.setProperty(name, value, priority);\n    }\n    function styleFunction() {\n      var x = value.apply(this, arguments);\n      if (x == null) this.style.removeProperty(name); else this.style.setProperty(name, x, priority);\n    }\n    return value == null ? styleNull : typeof value === \"function\" ? styleFunction : styleConstant;\n  }\n  d3_selectionPrototype.property = function(name, value) {\n    if (arguments.length < 2) {\n      if (typeof name === \"string\") return this.node()[name];\n      for (value in name) this.each(d3_selection_property(value, name[value]));\n      return this;\n    }\n    return this.each(d3_selection_property(name, value));\n  };\n  function d3_selection_property(name, value) {\n    function propertyNull() {\n      delete this[name];\n    }\n    function propertyConstant() {\n      this[name] = value;\n    }\n    function propertyFunction() {\n      var x = value.apply(this, arguments);\n      if (x == null) delete this[name]; else this[name] = x;\n    }\n    return value == null ? propertyNull : typeof value === \"function\" ? propertyFunction : propertyConstant;\n  }\n  d3_selectionPrototype.text = function(value) {\n    return arguments.length ? this.each(typeof value === \"function\" ? function() {\n      var v = value.apply(this, arguments);\n      this.textContent = v == null ? \"\" : v;\n    } : value == null ? function() {\n      this.textContent = \"\";\n    } : function() {\n      this.textContent = value;\n    }) : this.node().textContent;\n  };\n  d3_selectionPrototype.html = function(value) {\n    return arguments.length ? this.each(typeof value === \"function\" ? function() {\n      var v = value.apply(this, arguments);\n      this.innerHTML = v == null ? \"\" : v;\n    } : value == null ? function() {\n      this.innerHTML = \"\";\n    } : function() {\n      this.innerHTML = value;\n    }) : this.node().innerHTML;\n  };\n  d3_selectionPrototype.append = function(name) {\n    name = d3_selection_creator(name);\n    return this.select(function() {\n      return this.appendChild(name.apply(this, arguments));\n    });\n  };\n  function d3_selection_creator(name) {\n    function create() {\n      var document = this.ownerDocument, namespace = this.namespaceURI;\n      return namespace === d3_nsXhtml && document.documentElement.namespaceURI === d3_nsXhtml ? document.createElement(name) : document.createElementNS(namespace, name);\n    }\n    function createNS() {\n      return this.ownerDocument.createElementNS(name.space, name.local);\n    }\n    return typeof name === \"function\" ? name : (name = d3.ns.qualify(name)).local ? createNS : create;\n  }\n  d3_selectionPrototype.insert = function(name, before) {\n    name = d3_selection_creator(name);\n    before = d3_selection_selector(before);\n    return this.select(function() {\n      return this.insertBefore(name.apply(this, arguments), before.apply(this, arguments) || null);\n    });\n  };\n  d3_selectionPrototype.remove = function() {\n    return this.each(d3_selectionRemove);\n  };\n  function d3_selectionRemove() {\n    var parent = this.parentNode;\n    if (parent) parent.removeChild(this);\n  }\n  d3_selectionPrototype.data = function(value, key) {\n    var i = -1, n = this.length, group, node;\n    if (!arguments.length) {\n      value = new Array(n = (group = this[0]).length);\n      while (++i < n) {\n        if (node = group[i]) {\n          value[i] = node.__data__;\n        }\n      }\n      return value;\n    }\n    function bind(group, groupData) {\n      var i, n = group.length, m = groupData.length, n0 = Math.min(n, m), updateNodes = new Array(m), enterNodes = new Array(m), exitNodes = new Array(n), node, nodeData;\n      if (key) {\n        var nodeByKeyValue = new d3_Map(), keyValues = new Array(n), keyValue;\n        for (i = -1; ++i < n; ) {\n          if (node = group[i]) {\n            if (nodeByKeyValue.has(keyValue = key.call(node, node.__data__, i))) {\n              exitNodes[i] = node;\n            } else {\n              nodeByKeyValue.set(keyValue, node);\n            }\n            keyValues[i] = keyValue;\n          }\n        }\n        for (i = -1; ++i < m; ) {\n          if (!(node = nodeByKeyValue.get(keyValue = key.call(groupData, nodeData = groupData[i], i)))) {\n            enterNodes[i] = d3_selection_dataNode(nodeData);\n          } else if (node !== true) {\n            updateNodes[i] = node;\n            node.__data__ = nodeData;\n          }\n          nodeByKeyValue.set(keyValue, true);\n        }\n        for (i = -1; ++i < n; ) {\n          if (i in keyValues && nodeByKeyValue.get(keyValues[i]) !== true) {\n            exitNodes[i] = group[i];\n          }\n        }\n      } else {\n        for (i = -1; ++i < n0; ) {\n          node = group[i];\n          nodeData = groupData[i];\n          if (node) {\n            node.__data__ = nodeData;\n            updateNodes[i] = node;\n          } else {\n            enterNodes[i] = d3_selection_dataNode(nodeData);\n          }\n        }\n        for (;i < m; ++i) {\n          enterNodes[i] = d3_selection_dataNode(groupData[i]);\n        }\n        for (;i < n; ++i) {\n          exitNodes[i] = group[i];\n        }\n      }\n      enterNodes.update = updateNodes;\n      enterNodes.parentNode = updateNodes.parentNode = exitNodes.parentNode = group.parentNode;\n      enter.push(enterNodes);\n      update.push(updateNodes);\n      exit.push(exitNodes);\n    }\n    var enter = d3_selection_enter([]), update = d3_selection([]), exit = d3_selection([]);\n    if (typeof value === \"function\") {\n      while (++i < n) {\n        bind(group = this[i], value.call(group, group.parentNode.__data__, i));\n      }\n    } else {\n      while (++i < n) {\n        bind(group = this[i], value);\n      }\n    }\n    update.enter = function() {\n      return enter;\n    };\n    update.exit = function() {\n      return exit;\n    };\n    return update;\n  };\n  function d3_selection_dataNode(data) {\n    return {\n      __data__: data\n    };\n  }\n  d3_selectionPrototype.datum = function(value) {\n    return arguments.length ? this.property(\"__data__\", value) : this.property(\"__data__\");\n  };\n  d3_selectionPrototype.filter = function(filter) {\n    var subgroups = [], subgroup, group, node;\n    if (typeof filter !== \"function\") filter = d3_selection_filter(filter);\n    for (var j = 0, m = this.length; j < m; j++) {\n      subgroups.push(subgroup = []);\n      subgroup.parentNode = (group = this[j]).parentNode;\n      for (var i = 0, n = group.length; i < n; i++) {\n        if ((node = group[i]) && filter.call(node, node.__data__, i, j)) {\n          subgroup.push(node);\n        }\n      }\n    }\n    return d3_selection(subgroups);\n  };\n  function d3_selection_filter(selector) {\n    return function() {\n      return d3_selectMatches(this, selector);\n    };\n  }\n  d3_selectionPrototype.order = function() {\n    for (var j = -1, m = this.length; ++j < m; ) {\n      for (var group = this[j], i = group.length - 1, next = group[i], node; --i >= 0; ) {\n        if (node = group[i]) {\n          if (next && next !== node.nextSibling) next.parentNode.insertBefore(node, next);\n          next = node;\n        }\n      }\n    }\n    return this;\n  };\n  d3_selectionPrototype.sort = function(comparator) {\n    comparator = d3_selection_sortComparator.apply(this, arguments);\n    for (var j = -1, m = this.length; ++j < m; ) this[j].sort(comparator);\n    return this.order();\n  };\n  function d3_selection_sortComparator(comparator) {\n    if (!arguments.length) comparator = d3_ascending;\n    return function(a, b) {\n      return a && b ? comparator(a.__data__, b.__data__) : !a - !b;\n    };\n  }\n  d3_selectionPrototype.each = function(callback) {\n    return d3_selection_each(this, function(node, i, j) {\n      callback.call(node, node.__data__, i, j);\n    });\n  };\n  function d3_selection_each(groups, callback) {\n    for (var j = 0, m = groups.length; j < m; j++) {\n      for (var group = groups[j], i = 0, n = group.length, node; i < n; i++) {\n        if (node = group[i]) callback(node, i, j);\n      }\n    }\n    return groups;\n  }\n  d3_selectionPrototype.call = function(callback) {\n    var args = d3_array(arguments);\n    callback.apply(args[0] = this, args);\n    return this;\n  };\n  d3_selectionPrototype.empty = function() {\n    return !this.node();\n  };\n  d3_selectionPrototype.node = function() {\n    for (var j = 0, m = this.length; j < m; j++) {\n      for (var group = this[j], i = 0, n = group.length; i < n; i++) {\n        var node = group[i];\n        if (node) return node;\n      }\n    }\n    return null;\n  };\n  d3_selectionPrototype.size = function() {\n    var n = 0;\n    d3_selection_each(this, function() {\n      ++n;\n    });\n    return n;\n  };\n  function d3_selection_enter(selection) {\n    d3_subclass(selection, d3_selection_enterPrototype);\n    return selection;\n  }\n  var d3_selection_enterPrototype = [];\n  d3.selection.enter = d3_selection_enter;\n  d3.selection.enter.prototype = d3_selection_enterPrototype;\n  d3_selection_enterPrototype.append = d3_selectionPrototype.append;\n  d3_selection_enterPrototype.empty = d3_selectionPrototype.empty;\n  d3_selection_enterPrototype.node = d3_selectionPrototype.node;\n  d3_selection_enterPrototype.call = d3_selectionPrototype.call;\n  d3_selection_enterPrototype.size = d3_selectionPrototype.size;\n  d3_selection_enterPrototype.select = function(selector) {\n    var subgroups = [], subgroup, subnode, upgroup, group, node;\n    for (var j = -1, m = this.length; ++j < m; ) {\n      upgroup = (group = this[j]).update;\n      subgroups.push(subgroup = []);\n      subgroup.parentNode = group.parentNode;\n      for (var i = -1, n = group.length; ++i < n; ) {\n        if (node = group[i]) {\n          subgroup.push(upgroup[i] = subnode = selector.call(group.parentNode, node.__data__, i, j));\n          subnode.__data__ = node.__data__;\n        } else {\n          subgroup.push(null);\n        }\n      }\n    }\n    return d3_selection(subgroups);\n  };\n  d3_selection_enterPrototype.insert = function(name, before) {\n    if (arguments.length < 2) before = d3_selection_enterInsertBefore(this);\n    return d3_selectionPrototype.insert.call(this, name, before);\n  };\n  function d3_selection_enterInsertBefore(enter) {\n    var i0, j0;\n    return function(d, i, j) {\n      var group = enter[j].update, n = group.length, node;\n      if (j != j0) j0 = j, i0 = 0;\n      if (i >= i0) i0 = i + 1;\n      while (!(node = group[i0]) && ++i0 < n) ;\n      return node;\n    };\n  }\n  d3.select = function(node) {\n    var group;\n    if (typeof node === \"string\") {\n      group = [ d3_select(node, d3_document) ];\n      group.parentNode = d3_document.documentElement;\n    } else {\n      group = [ node ];\n      group.parentNode = d3_documentElement(node);\n    }\n    return d3_selection([ group ]);\n  };\n  d3.selectAll = function(nodes) {\n    var group;\n    if (typeof nodes === \"string\") {\n      group = d3_array(d3_selectAll(nodes, d3_document));\n      group.parentNode = d3_document.documentElement;\n    } else {\n      group = d3_array(nodes);\n      group.parentNode = null;\n    }\n    return d3_selection([ group ]);\n  };\n  d3_selectionPrototype.on = function(type, listener, capture) {\n    var n = arguments.length;\n    if (n < 3) {\n      if (typeof type !== \"string\") {\n        if (n < 2) listener = false;\n        for (capture in type) this.each(d3_selection_on(capture, type[capture], listener));\n        return this;\n      }\n      if (n < 2) return (n = this.node()[\"__on\" + type]) && n._;\n      capture = false;\n    }\n    return this.each(d3_selection_on(type, listener, capture));\n  };\n  function d3_selection_on(type, listener, capture) {\n    var name = \"__on\" + type, i = type.indexOf(\".\"), wrap = d3_selection_onListener;\n    if (i > 0) type = type.slice(0, i);\n    var filter = d3_selection_onFilters.get(type);\n    if (filter) type = filter, wrap = d3_selection_onFilter;\n    function onRemove() {\n      var l = this[name];\n      if (l) {\n        this.removeEventListener(type, l, l.$);\n        delete this[name];\n      }\n    }\n    function onAdd() {\n      var l = wrap(listener, d3_array(arguments));\n      onRemove.call(this);\n      this.addEventListener(type, this[name] = l, l.$ = capture);\n      l._ = listener;\n    }\n    function removeAll() {\n      var re = new RegExp(\"^__on([^.]+)\" + d3.requote(type) + \"$\"), match;\n      for (var name in this) {\n        if (match = name.match(re)) {\n          var l = this[name];\n          this.removeEventListener(match[1], l, l.$);\n          delete this[name];\n        }\n      }\n    }\n    return i ? listener ? onAdd : onRemove : listener ? d3_noop : removeAll;\n  }\n  var d3_selection_onFilters = d3.map({\n    mouseenter: \"mouseover\",\n    mouseleave: \"mouseout\"\n  });\n  if (d3_document) {\n    d3_selection_onFilters.forEach(function(k) {\n      if (\"on\" + k in d3_document) d3_selection_onFilters.remove(k);\n    });\n  }\n  function d3_selection_onListener(listener, argumentz) {\n    return function(e) {\n      var o = d3.event;\n      d3.event = e;\n      argumentz[0] = this.__data__;\n      try {\n        listener.apply(this, argumentz);\n      } finally {\n        d3.event = o;\n      }\n    };\n  }\n  function d3_selection_onFilter(listener, argumentz) {\n    var l = d3_selection_onListener(listener, argumentz);\n    return function(e) {\n      var target = this, related = e.relatedTarget;\n      if (!related || related !== target && !(related.compareDocumentPosition(target) & 8)) {\n        l.call(target, e);\n      }\n    };\n  }\n  var d3_event_dragSelect, d3_event_dragId = 0;\n  function d3_event_dragSuppress(node) {\n    var name = \".dragsuppress-\" + ++d3_event_dragId, click = \"click\" + name, w = d3.select(d3_window(node)).on(\"touchmove\" + name, d3_eventPreventDefault).on(\"dragstart\" + name, d3_eventPreventDefault).on(\"selectstart\" + name, d3_eventPreventDefault);\n    if (d3_event_dragSelect == null) {\n      d3_event_dragSelect = \"onselectstart\" in node ? false : d3_vendorSymbol(node.style, \"userSelect\");\n    }\n    if (d3_event_dragSelect) {\n      var style = d3_documentElement(node).style, select = style[d3_event_dragSelect];\n      style[d3_event_dragSelect] = \"none\";\n    }\n    return function(suppressClick) {\n      w.on(name, null);\n      if (d3_event_dragSelect) style[d3_event_dragSelect] = select;\n      if (suppressClick) {\n        var off = function() {\n          w.on(click, null);\n        };\n        w.on(click, function() {\n          d3_eventPreventDefault();\n          off();\n        }, true);\n        setTimeout(off, 0);\n      }\n    };\n  }\n  d3.mouse = function(container) {\n    return d3_mousePoint(container, d3_eventSource());\n  };\n  var d3_mouse_bug44083 = this.navigator && /WebKit/.test(this.navigator.userAgent) ? -1 : 0;\n  function d3_mousePoint(container, e) {\n    if (e.changedTouches) e = e.changedTouches[0];\n    var svg = container.ownerSVGElement || container;\n    if (svg.createSVGPoint) {\n      var point = svg.createSVGPoint();\n      if (d3_mouse_bug44083 < 0) {\n        var window = d3_window(container);\n        if (window.scrollX || window.scrollY) {\n          svg = d3.select(\"body\").append(\"svg\").style({\n            position: \"absolute\",\n            top: 0,\n            left: 0,\n            margin: 0,\n            padding: 0,\n            border: \"none\"\n          }, \"important\");\n          var ctm = svg[0][0].getScreenCTM();\n          d3_mouse_bug44083 = !(ctm.f || ctm.e);\n          svg.remove();\n        }\n      }\n      if (d3_mouse_bug44083) point.x = e.pageX, point.y = e.pageY; else point.x = e.clientX, \n      point.y = e.clientY;\n      point = point.matrixTransform(container.getScreenCTM().inverse());\n      return [ point.x, point.y ];\n    }\n    var rect = container.getBoundingClientRect();\n    return [ e.clientX - rect.left - container.clientLeft, e.clientY - rect.top - container.clientTop ];\n  }\n  d3.touch = function(container, touches, identifier) {\n    if (arguments.length < 3) identifier = touches, touches = d3_eventSource().changedTouches;\n    if (touches) for (var i = 0, n = touches.length, touch; i < n; ++i) {\n      if ((touch = touches[i]).identifier === identifier) {\n        return d3_mousePoint(container, touch);\n      }\n    }\n  };\n  d3.behavior.drag = function() {\n    var event = d3_eventDispatch(drag, \"drag\", \"dragstart\", \"dragend\"), origin = null, mousedown = dragstart(d3_noop, d3.mouse, d3_window, \"mousemove\", \"mouseup\"), touchstart = dragstart(d3_behavior_dragTouchId, d3.touch, d3_identity, \"touchmove\", \"touchend\");\n    function drag() {\n      this.on(\"mousedown.drag\", mousedown).on(\"touchstart.drag\", touchstart);\n    }\n    function dragstart(id, position, subject, move, end) {\n      return function() {\n        var that = this, target = d3.event.target.correspondingElement || d3.event.target, parent = that.parentNode, dispatch = event.of(that, arguments), dragged = 0, dragId = id(), dragName = \".drag\" + (dragId == null ? \"\" : \"-\" + dragId), dragOffset, dragSubject = d3.select(subject(target)).on(move + dragName, moved).on(end + dragName, ended), dragRestore = d3_event_dragSuppress(target), position0 = position(parent, dragId);\n        if (origin) {\n          dragOffset = origin.apply(that, arguments);\n          dragOffset = [ dragOffset.x - position0[0], dragOffset.y - position0[1] ];\n        } else {\n          dragOffset = [ 0, 0 ];\n        }\n        dispatch({\n          type: \"dragstart\"\n        });\n        function moved() {\n          var position1 = position(parent, dragId), dx, dy;\n          if (!position1) return;\n          dx = position1[0] - position0[0];\n          dy = position1[1] - position0[1];\n          dragged |= dx | dy;\n          position0 = position1;\n          dispatch({\n            type: \"drag\",\n            x: position1[0] + dragOffset[0],\n            y: position1[1] + dragOffset[1],\n            dx: dx,\n            dy: dy\n          });\n        }\n        function ended() {\n          if (!position(parent, dragId)) return;\n          dragSubject.on(move + dragName, null).on(end + dragName, null);\n          dragRestore(dragged);\n          dispatch({\n            type: \"dragend\"\n          });\n        }\n      };\n    }\n    drag.origin = function(x) {\n      if (!arguments.length) return origin;\n      origin = x;\n      return drag;\n    };\n    return d3.rebind(drag, event, \"on\");\n  };\n  function d3_behavior_dragTouchId() {\n    return d3.event.changedTouches[0].identifier;\n  }\n  d3.touches = function(container, touches) {\n    if (arguments.length < 2) touches = d3_eventSource().touches;\n    return touches ? d3_array(touches).map(function(touch) {\n      var point = d3_mousePoint(container, touch);\n      point.identifier = touch.identifier;\n      return point;\n    }) : [];\n  };\n  var ε = 1e-6, ε2 = ε * ε, π = Math.PI, τ = 2 * π, τε = τ - ε, halfπ = π / 2, d3_radians = π / 180, d3_degrees = 180 / π;\n  function d3_sgn(x) {\n    return x > 0 ? 1 : x < 0 ? -1 : 0;\n  }\n  function d3_cross2d(a, b, c) {\n    return (b[0] - a[0]) * (c[1] - a[1]) - (b[1] - a[1]) * (c[0] - a[0]);\n  }\n  function d3_acos(x) {\n    return x > 1 ? 0 : x < -1 ? π : Math.acos(x);\n  }\n  function d3_asin(x) {\n    return x > 1 ? halfπ : x < -1 ? -halfπ : Math.asin(x);\n  }\n  function d3_sinh(x) {\n    return ((x = Math.exp(x)) - 1 / x) / 2;\n  }\n  function d3_cosh(x) {\n    return ((x = Math.exp(x)) + 1 / x) / 2;\n  }\n  function d3_tanh(x) {\n    return ((x = Math.exp(2 * x)) - 1) / (x + 1);\n  }\n  function d3_haversin(x) {\n    return (x = Math.sin(x / 2)) * x;\n  }\n  var ρ = Math.SQRT2, ρ2 = 2, ρ4 = 4;\n  d3.interpolateZoom = function(p0, p1) {\n    var ux0 = p0[0], uy0 = p0[1], w0 = p0[2], ux1 = p1[0], uy1 = p1[1], w1 = p1[2], dx = ux1 - ux0, dy = uy1 - uy0, d2 = dx * dx + dy * dy, i, S;\n    if (d2 < ε2) {\n      S = Math.log(w1 / w0) / ρ;\n      i = function(t) {\n        return [ ux0 + t * dx, uy0 + t * dy, w0 * Math.exp(ρ * t * S) ];\n      };\n    } else {\n      var d1 = Math.sqrt(d2), b0 = (w1 * w1 - w0 * w0 + ρ4 * d2) / (2 * w0 * ρ2 * d1), b1 = (w1 * w1 - w0 * w0 - ρ4 * d2) / (2 * w1 * ρ2 * d1), r0 = Math.log(Math.sqrt(b0 * b0 + 1) - b0), r1 = Math.log(Math.sqrt(b1 * b1 + 1) - b1);\n      S = (r1 - r0) / ρ;\n      i = function(t) {\n        var s = t * S, coshr0 = d3_cosh(r0), u = w0 / (ρ2 * d1) * (coshr0 * d3_tanh(ρ * s + r0) - d3_sinh(r0));\n        return [ ux0 + u * dx, uy0 + u * dy, w0 * coshr0 / d3_cosh(ρ * s + r0) ];\n      };\n    }\n    i.duration = S * 1e3;\n    return i;\n  };\n  d3.behavior.zoom = function() {\n    var view = {\n      x: 0,\n      y: 0,\n      k: 1\n    }, translate0, center0, center, size = [ 960, 500 ], scaleExtent = d3_behavior_zoomInfinity, duration = 250, zooming = 0, mousedown = \"mousedown.zoom\", mousemove = \"mousemove.zoom\", mouseup = \"mouseup.zoom\", mousewheelTimer, touchstart = \"touchstart.zoom\", touchtime, event = d3_eventDispatch(zoom, \"zoomstart\", \"zoom\", \"zoomend\"), x0, x1, y0, y1;\n    if (!d3_behavior_zoomWheel) {\n      d3_behavior_zoomWheel = \"onwheel\" in d3_document ? (d3_behavior_zoomDelta = function() {\n        return -d3.event.deltaY * (d3.event.deltaMode ? 120 : 1);\n      }, \"wheel\") : \"onmousewheel\" in d3_document ? (d3_behavior_zoomDelta = function() {\n        return d3.event.wheelDelta;\n      }, \"mousewheel\") : (d3_behavior_zoomDelta = function() {\n        return -d3.event.detail;\n      }, \"MozMousePixelScroll\");\n    }\n    function zoom(g) {\n      g.on(mousedown, mousedowned).on(d3_behavior_zoomWheel + \".zoom\", mousewheeled).on(\"dblclick.zoom\", dblclicked).on(touchstart, touchstarted);\n    }\n    zoom.event = function(g) {\n      g.each(function() {\n        var dispatch = event.of(this, arguments), view1 = view;\n        if (d3_transitionInheritId) {\n          d3.select(this).transition().each(\"start.zoom\", function() {\n            view = this.__chart__ || {\n              x: 0,\n              y: 0,\n              k: 1\n            };\n            zoomstarted(dispatch);\n          }).tween(\"zoom:zoom\", function() {\n            var dx = size[0], dy = size[1], cx = center0 ? center0[0] : dx / 2, cy = center0 ? center0[1] : dy / 2, i = d3.interpolateZoom([ (cx - view.x) / view.k, (cy - view.y) / view.k, dx / view.k ], [ (cx - view1.x) / view1.k, (cy - view1.y) / view1.k, dx / view1.k ]);\n            return function(t) {\n              var l = i(t), k = dx / l[2];\n              this.__chart__ = view = {\n                x: cx - l[0] * k,\n                y: cy - l[1] * k,\n                k: k\n              };\n              zoomed(dispatch);\n            };\n          }).each(\"interrupt.zoom\", function() {\n            zoomended(dispatch);\n          }).each(\"end.zoom\", function() {\n            zoomended(dispatch);\n          });\n        } else {\n          this.__chart__ = view;\n          zoomstarted(dispatch);\n          zoomed(dispatch);\n          zoomended(dispatch);\n        }\n      });\n    };\n    zoom.translate = function(_) {\n      if (!arguments.length) return [ view.x, view.y ];\n      view = {\n        x: +_[0],\n        y: +_[1],\n        k: view.k\n      };\n      rescale();\n      return zoom;\n    };\n    zoom.scale = function(_) {\n      if (!arguments.length) return view.k;\n      view = {\n        x: view.x,\n        y: view.y,\n        k: null\n      };\n      scaleTo(+_);\n      rescale();\n      return zoom;\n    };\n    zoom.scaleExtent = function(_) {\n      if (!arguments.length) return scaleExtent;\n      scaleExtent = _ == null ? d3_behavior_zoomInfinity : [ +_[0], +_[1] ];\n      return zoom;\n    };\n    zoom.center = function(_) {\n      if (!arguments.length) return center;\n      center = _ && [ +_[0], +_[1] ];\n      return zoom;\n    };\n    zoom.size = function(_) {\n      if (!arguments.length) return size;\n      size = _ && [ +_[0], +_[1] ];\n      return zoom;\n    };\n    zoom.duration = function(_) {\n      if (!arguments.length) return duration;\n      duration = +_;\n      return zoom;\n    };\n    zoom.x = function(z) {\n      if (!arguments.length) return x1;\n      x1 = z;\n      x0 = z.copy();\n      view = {\n        x: 0,\n        y: 0,\n        k: 1\n      };\n      return zoom;\n    };\n    zoom.y = function(z) {\n      if (!arguments.length) return y1;\n      y1 = z;\n      y0 = z.copy();\n      view = {\n        x: 0,\n        y: 0,\n        k: 1\n      };\n      return zoom;\n    };\n    function location(p) {\n      return [ (p[0] - view.x) / view.k, (p[1] - view.y) / view.k ];\n    }\n    function point(l) {\n      return [ l[0] * view.k + view.x, l[1] * view.k + view.y ];\n    }\n    function scaleTo(s) {\n      view.k = Math.max(scaleExtent[0], Math.min(scaleExtent[1], s));\n    }\n    function translateTo(p, l) {\n      l = point(l);\n      view.x += p[0] - l[0];\n      view.y += p[1] - l[1];\n    }\n    function zoomTo(that, p, l, k) {\n      that.__chart__ = {\n        x: view.x,\n        y: view.y,\n        k: view.k\n      };\n      scaleTo(Math.pow(2, k));\n      translateTo(center0 = p, l);\n      that = d3.select(that);\n      if (duration > 0) that = that.transition().duration(duration);\n      that.call(zoom.event);\n    }\n    function rescale() {\n      if (x1) x1.domain(x0.range().map(function(x) {\n        return (x - view.x) / view.k;\n      }).map(x0.invert));\n      if (y1) y1.domain(y0.range().map(function(y) {\n        return (y - view.y) / view.k;\n      }).map(y0.invert));\n    }\n    function zoomstarted(dispatch) {\n      if (!zooming++) dispatch({\n        type: \"zoomstart\"\n      });\n    }\n    function zoomed(dispatch) {\n      rescale();\n      dispatch({\n        type: \"zoom\",\n        scale: view.k,\n        translate: [ view.x, view.y ]\n      });\n    }\n    function zoomended(dispatch) {\n      if (!--zooming) dispatch({\n        type: \"zoomend\"\n      }), center0 = null;\n    }\n    function mousedowned() {\n      var that = this, dispatch = event.of(that, arguments), dragged = 0, subject = d3.select(d3_window(that)).on(mousemove, moved).on(mouseup, ended), location0 = location(d3.mouse(that)), dragRestore = d3_event_dragSuppress(that);\n      d3_selection_interrupt.call(that);\n      zoomstarted(dispatch);\n      function moved() {\n        dragged = 1;\n        translateTo(d3.mouse(that), location0);\n        zoomed(dispatch);\n      }\n      function ended() {\n        subject.on(mousemove, null).on(mouseup, null);\n        dragRestore(dragged);\n        zoomended(dispatch);\n      }\n    }\n    function touchstarted() {\n      var that = this, dispatch = event.of(that, arguments), locations0 = {}, distance0 = 0, scale0, zoomName = \".zoom-\" + d3.event.changedTouches[0].identifier, touchmove = \"touchmove\" + zoomName, touchend = \"touchend\" + zoomName, targets = [], subject = d3.select(that), dragRestore = d3_event_dragSuppress(that);\n      started();\n      zoomstarted(dispatch);\n      subject.on(mousedown, null).on(touchstart, started);\n      function relocate() {\n        var touches = d3.touches(that);\n        scale0 = view.k;\n        touches.forEach(function(t) {\n          if (t.identifier in locations0) locations0[t.identifier] = location(t);\n        });\n        return touches;\n      }\n      function started() {\n        var target = d3.event.target;\n        d3.select(target).on(touchmove, moved).on(touchend, ended);\n        targets.push(target);\n        var changed = d3.event.changedTouches;\n        for (var i = 0, n = changed.length; i < n; ++i) {\n          locations0[changed[i].identifier] = null;\n        }\n        var touches = relocate(), now = Date.now();\n        if (touches.length === 1) {\n          if (now - touchtime < 500) {\n            var p = touches[0];\n            zoomTo(that, p, locations0[p.identifier], Math.floor(Math.log(view.k) / Math.LN2) + 1);\n            d3_eventPreventDefault();\n          }\n          touchtime = now;\n        } else if (touches.length > 1) {\n          var p = touches[0], q = touches[1], dx = p[0] - q[0], dy = p[1] - q[1];\n          distance0 = dx * dx + dy * dy;\n        }\n      }\n      function moved() {\n        var touches = d3.touches(that), p0, l0, p1, l1;\n        d3_selection_interrupt.call(that);\n        for (var i = 0, n = touches.length; i < n; ++i, l1 = null) {\n          p1 = touches[i];\n          if (l1 = locations0[p1.identifier]) {\n            if (l0) break;\n            p0 = p1, l0 = l1;\n          }\n        }\n        if (l1) {\n          var distance1 = (distance1 = p1[0] - p0[0]) * distance1 + (distance1 = p1[1] - p0[1]) * distance1, scale1 = distance0 && Math.sqrt(distance1 / distance0);\n          p0 = [ (p0[0] + p1[0]) / 2, (p0[1] + p1[1]) / 2 ];\n          l0 = [ (l0[0] + l1[0]) / 2, (l0[1] + l1[1]) / 2 ];\n          scaleTo(scale1 * scale0);\n        }\n        touchtime = null;\n        translateTo(p0, l0);\n        zoomed(dispatch);\n      }\n      function ended() {\n        if (d3.event.touches.length) {\n          var changed = d3.event.changedTouches;\n          for (var i = 0, n = changed.length; i < n; ++i) {\n            delete locations0[changed[i].identifier];\n          }\n          for (var identifier in locations0) {\n            return void relocate();\n          }\n        }\n        d3.selectAll(targets).on(zoomName, null);\n        subject.on(mousedown, mousedowned).on(touchstart, touchstarted);\n        dragRestore();\n        zoomended(dispatch);\n      }\n    }\n    function mousewheeled() {\n      var dispatch = event.of(this, arguments);\n      if (mousewheelTimer) clearTimeout(mousewheelTimer); else d3_selection_interrupt.call(this), \n      translate0 = location(center0 = center || d3.mouse(this)), zoomstarted(dispatch);\n      mousewheelTimer = setTimeout(function() {\n        mousewheelTimer = null;\n        zoomended(dispatch);\n      }, 50);\n      d3_eventPreventDefault();\n      scaleTo(Math.pow(2, d3_behavior_zoomDelta() * .002) * view.k);\n      translateTo(center0, translate0);\n      zoomed(dispatch);\n    }\n    function dblclicked() {\n      var p = d3.mouse(this), k = Math.log(view.k) / Math.LN2;\n      zoomTo(this, p, location(p), d3.event.shiftKey ? Math.ceil(k) - 1 : Math.floor(k) + 1);\n    }\n    return d3.rebind(zoom, event, \"on\");\n  };\n  var d3_behavior_zoomInfinity = [ 0, Infinity ], d3_behavior_zoomDelta, d3_behavior_zoomWheel;\n  d3.color = d3_color;\n  function d3_color() {}\n  d3_color.prototype.toString = function() {\n    return this.rgb() + \"\";\n  };\n  d3.hsl = d3_hsl;\n  function d3_hsl(h, s, l) {\n    return this instanceof d3_hsl ? void (this.h = +h, this.s = +s, this.l = +l) : arguments.length < 2 ? h instanceof d3_hsl ? new d3_hsl(h.h, h.s, h.l) : d3_rgb_parse(\"\" + h, d3_rgb_hsl, d3_hsl) : new d3_hsl(h, s, l);\n  }\n  var d3_hslPrototype = d3_hsl.prototype = new d3_color();\n  d3_hslPrototype.brighter = function(k) {\n    k = Math.pow(.7, arguments.length ? k : 1);\n    return new d3_hsl(this.h, this.s, this.l / k);\n  };\n  d3_hslPrototype.darker = function(k) {\n    k = Math.pow(.7, arguments.length ? k : 1);\n    return new d3_hsl(this.h, this.s, k * this.l);\n  };\n  d3_hslPrototype.rgb = function() {\n    return d3_hsl_rgb(this.h, this.s, this.l);\n  };\n  function d3_hsl_rgb(h, s, l) {\n    var m1, m2;\n    h = isNaN(h) ? 0 : (h %= 360) < 0 ? h + 360 : h;\n    s = isNaN(s) ? 0 : s < 0 ? 0 : s > 1 ? 1 : s;\n    l = l < 0 ? 0 : l > 1 ? 1 : l;\n    m2 = l <= .5 ? l * (1 + s) : l + s - l * s;\n    m1 = 2 * l - m2;\n    function v(h) {\n      if (h > 360) h -= 360; else if (h < 0) h += 360;\n      if (h < 60) return m1 + (m2 - m1) * h / 60;\n      if (h < 180) return m2;\n      if (h < 240) return m1 + (m2 - m1) * (240 - h) / 60;\n      return m1;\n    }\n    function vv(h) {\n      return Math.round(v(h) * 255);\n    }\n    return new d3_rgb(vv(h + 120), vv(h), vv(h - 120));\n  }\n  d3.hcl = d3_hcl;\n  function d3_hcl(h, c, l) {\n    return this instanceof d3_hcl ? void (this.h = +h, this.c = +c, this.l = +l) : arguments.length < 2 ? h instanceof d3_hcl ? new d3_hcl(h.h, h.c, h.l) : h instanceof d3_lab ? d3_lab_hcl(h.l, h.a, h.b) : d3_lab_hcl((h = d3_rgb_lab((h = d3.rgb(h)).r, h.g, h.b)).l, h.a, h.b) : new d3_hcl(h, c, l);\n  }\n  var d3_hclPrototype = d3_hcl.prototype = new d3_color();\n  d3_hclPrototype.brighter = function(k) {\n    return new d3_hcl(this.h, this.c, Math.min(100, this.l + d3_lab_K * (arguments.length ? k : 1)));\n  };\n  d3_hclPrototype.darker = function(k) {\n    return new d3_hcl(this.h, this.c, Math.max(0, this.l - d3_lab_K * (arguments.length ? k : 1)));\n  };\n  d3_hclPrototype.rgb = function() {\n    return d3_hcl_lab(this.h, this.c, this.l).rgb();\n  };\n  function d3_hcl_lab(h, c, l) {\n    if (isNaN(h)) h = 0;\n    if (isNaN(c)) c = 0;\n    return new d3_lab(l, Math.cos(h *= d3_radians) * c, Math.sin(h) * c);\n  }\n  d3.lab = d3_lab;\n  function d3_lab(l, a, b) {\n    return this instanceof d3_lab ? void (this.l = +l, this.a = +a, this.b = +b) : arguments.length < 2 ? l instanceof d3_lab ? new d3_lab(l.l, l.a, l.b) : l instanceof d3_hcl ? d3_hcl_lab(l.h, l.c, l.l) : d3_rgb_lab((l = d3_rgb(l)).r, l.g, l.b) : new d3_lab(l, a, b);\n  }\n  var d3_lab_K = 18;\n  var d3_lab_X = .95047, d3_lab_Y = 1, d3_lab_Z = 1.08883;\n  var d3_labPrototype = d3_lab.prototype = new d3_color();\n  d3_labPrototype.brighter = function(k) {\n    return new d3_lab(Math.min(100, this.l + d3_lab_K * (arguments.length ? k : 1)), this.a, this.b);\n  };\n  d3_labPrototype.darker = function(k) {\n    return new d3_lab(Math.max(0, this.l - d3_lab_K * (arguments.length ? k : 1)), this.a, this.b);\n  };\n  d3_labPrototype.rgb = function() {\n    return d3_lab_rgb(this.l, this.a, this.b);\n  };\n  function d3_lab_rgb(l, a, b) {\n    var y = (l + 16) / 116, x = y + a / 500, z = y - b / 200;\n    x = d3_lab_xyz(x) * d3_lab_X;\n    y = d3_lab_xyz(y) * d3_lab_Y;\n    z = d3_lab_xyz(z) * d3_lab_Z;\n    return new d3_rgb(d3_xyz_rgb(3.2404542 * x - 1.5371385 * y - .4985314 * z), d3_xyz_rgb(-.969266 * x + 1.8760108 * y + .041556 * z), d3_xyz_rgb(.0556434 * x - .2040259 * y + 1.0572252 * z));\n  }\n  function d3_lab_hcl(l, a, b) {\n    return l > 0 ? new d3_hcl(Math.atan2(b, a) * d3_degrees, Math.sqrt(a * a + b * b), l) : new d3_hcl(NaN, NaN, l);\n  }\n  function d3_lab_xyz(x) {\n    return x > .206893034 ? x * x * x : (x - 4 / 29) / 7.787037;\n  }\n  function d3_xyz_lab(x) {\n    return x > .008856 ? Math.pow(x, 1 / 3) : 7.787037 * x + 4 / 29;\n  }\n  function d3_xyz_rgb(r) {\n    return Math.round(255 * (r <= .00304 ? 12.92 * r : 1.055 * Math.pow(r, 1 / 2.4) - .055));\n  }\n  d3.rgb = d3_rgb;\n  function d3_rgb(r, g, b) {\n    return this instanceof d3_rgb ? void (this.r = ~~r, this.g = ~~g, this.b = ~~b) : arguments.length < 2 ? r instanceof d3_rgb ? new d3_rgb(r.r, r.g, r.b) : d3_rgb_parse(\"\" + r, d3_rgb, d3_hsl_rgb) : new d3_rgb(r, g, b);\n  }\n  function d3_rgbNumber(value) {\n    return new d3_rgb(value >> 16, value >> 8 & 255, value & 255);\n  }\n  function d3_rgbString(value) {\n    return d3_rgbNumber(value) + \"\";\n  }\n  var d3_rgbPrototype = d3_rgb.prototype = new d3_color();\n  d3_rgbPrototype.brighter = function(k) {\n    k = Math.pow(.7, arguments.length ? k : 1);\n    var r = this.r, g = this.g, b = this.b, i = 30;\n    if (!r && !g && !b) return new d3_rgb(i, i, i);\n    if (r && r < i) r = i;\n    if (g && g < i) g = i;\n    if (b && b < i) b = i;\n    return new d3_rgb(Math.min(255, r / k), Math.min(255, g / k), Math.min(255, b / k));\n  };\n  d3_rgbPrototype.darker = function(k) {\n    k = Math.pow(.7, arguments.length ? k : 1);\n    return new d3_rgb(k * this.r, k * this.g, k * this.b);\n  };\n  d3_rgbPrototype.hsl = function() {\n    return d3_rgb_hsl(this.r, this.g, this.b);\n  };\n  d3_rgbPrototype.toString = function() {\n    return \"#\" + d3_rgb_hex(this.r) + d3_rgb_hex(this.g) + d3_rgb_hex(this.b);\n  };\n  function d3_rgb_hex(v) {\n    return v < 16 ? \"0\" + Math.max(0, v).toString(16) : Math.min(255, v).toString(16);\n  }\n  function d3_rgb_parse(format, rgb, hsl) {\n    var r = 0, g = 0, b = 0, m1, m2, color;\n    m1 = /([a-z]+)\\((.*)\\)/.exec(format = format.toLowerCase());\n    if (m1) {\n      m2 = m1[2].split(\",\");\n      switch (m1[1]) {\n       case \"hsl\":\n        {\n          return hsl(parseFloat(m2[0]), parseFloat(m2[1]) / 100, parseFloat(m2[2]) / 100);\n        }\n\n       case \"rgb\":\n        {\n          return rgb(d3_rgb_parseNumber(m2[0]), d3_rgb_parseNumber(m2[1]), d3_rgb_parseNumber(m2[2]));\n        }\n      }\n    }\n    if (color = d3_rgb_names.get(format)) {\n      return rgb(color.r, color.g, color.b);\n    }\n    if (format != null && format.charAt(0) === \"#\" && !isNaN(color = parseInt(format.slice(1), 16))) {\n      if (format.length === 4) {\n        r = (color & 3840) >> 4;\n        r = r >> 4 | r;\n        g = color & 240;\n        g = g >> 4 | g;\n        b = color & 15;\n        b = b << 4 | b;\n      } else if (format.length === 7) {\n        r = (color & 16711680) >> 16;\n        g = (color & 65280) >> 8;\n        b = color & 255;\n      }\n    }\n    return rgb(r, g, b);\n  }\n  function d3_rgb_hsl(r, g, b) {\n    var min = Math.min(r /= 255, g /= 255, b /= 255), max = Math.max(r, g, b), d = max - min, h, s, l = (max + min) / 2;\n    if (d) {\n      s = l < .5 ? d / (max + min) : d / (2 - max - min);\n      if (r == max) h = (g - b) / d + (g < b ? 6 : 0); else if (g == max) h = (b - r) / d + 2; else h = (r - g) / d + 4;\n      h *= 60;\n    } else {\n      h = NaN;\n      s = l > 0 && l < 1 ? 0 : h;\n    }\n    return new d3_hsl(h, s, l);\n  }\n  function d3_rgb_lab(r, g, b) {\n    r = d3_rgb_xyz(r);\n    g = d3_rgb_xyz(g);\n    b = d3_rgb_xyz(b);\n    var x = d3_xyz_lab((.4124564 * r + .3575761 * g + .1804375 * b) / d3_lab_X), y = d3_xyz_lab((.2126729 * r + .7151522 * g + .072175 * b) / d3_lab_Y), z = d3_xyz_lab((.0193339 * r + .119192 * g + .9503041 * b) / d3_lab_Z);\n    return d3_lab(116 * y - 16, 500 * (x - y), 200 * (y - z));\n  }\n  function d3_rgb_xyz(r) {\n    return (r /= 255) <= .04045 ? r / 12.92 : Math.pow((r + .055) / 1.055, 2.4);\n  }\n  function d3_rgb_parseNumber(c) {\n    var f = parseFloat(c);\n    return c.charAt(c.length - 1) === \"%\" ? Math.round(f * 2.55) : f;\n  }\n  var d3_rgb_names = d3.map({\n    aliceblue: 15792383,\n    antiquewhite: 16444375,\n    aqua: 65535,\n    aquamarine: 8388564,\n    azure: 15794175,\n    beige: 16119260,\n    bisque: 16770244,\n    black: 0,\n    blanchedalmond: 16772045,\n    blue: 255,\n    blueviolet: 9055202,\n    brown: 10824234,\n    burlywood: 14596231,\n    cadetblue: 6266528,\n    chartreuse: 8388352,\n    chocolate: 13789470,\n    coral: 16744272,\n    cornflowerblue: 6591981,\n    cornsilk: 16775388,\n    crimson: 14423100,\n    cyan: 65535,\n    darkblue: 139,\n    darkcyan: 35723,\n    darkgoldenrod: 12092939,\n    darkgray: 11119017,\n    darkgreen: 25600,\n    darkgrey: 11119017,\n    darkkhaki: 12433259,\n    darkmagenta: 9109643,\n    darkolivegreen: 5597999,\n    darkorange: 16747520,\n    darkorchid: 10040012,\n    darkred: 9109504,\n    darksalmon: 15308410,\n    darkseagreen: 9419919,\n    darkslateblue: 4734347,\n    darkslategray: 3100495,\n    darkslategrey: 3100495,\n    darkturquoise: 52945,\n    darkviolet: 9699539,\n    deeppink: 16716947,\n    deepskyblue: 49151,\n    dimgray: 6908265,\n    dimgrey: 6908265,\n    dodgerblue: 2003199,\n    firebrick: 11674146,\n    floralwhite: 16775920,\n    forestgreen: 2263842,\n    fuchsia: 16711935,\n    gainsboro: 14474460,\n    ghostwhite: 16316671,\n    gold: 16766720,\n    goldenrod: 14329120,\n    gray: 8421504,\n    green: 32768,\n    greenyellow: 11403055,\n    grey: 8421504,\n    honeydew: 15794160,\n    hotpink: 16738740,\n    indianred: 13458524,\n    indigo: 4915330,\n    ivory: 16777200,\n    khaki: 15787660,\n    lavender: 15132410,\n    lavenderblush: 16773365,\n    lawngreen: 8190976,\n    lemonchiffon: 16775885,\n    lightblue: 11393254,\n    lightcoral: 15761536,\n    lightcyan: 14745599,\n    lightgoldenrodyellow: 16448210,\n    lightgray: 13882323,\n    lightgreen: 9498256,\n    lightgrey: 13882323,\n    lightpink: 16758465,\n    lightsalmon: 16752762,\n    lightseagreen: 2142890,\n    lightskyblue: 8900346,\n    lightslategray: 7833753,\n    lightslategrey: 7833753,\n    lightsteelblue: 11584734,\n    lightyellow: 16777184,\n    lime: 65280,\n    limegreen: 3329330,\n    linen: 16445670,\n    magenta: 16711935,\n    maroon: 8388608,\n    mediumaquamarine: 6737322,\n    mediumblue: 205,\n    mediumorchid: 12211667,\n    mediumpurple: 9662683,\n    mediumseagreen: 3978097,\n    mediumslateblue: 8087790,\n    mediumspringgreen: 64154,\n    mediumturquoise: 4772300,\n    mediumvioletred: 13047173,\n    midnightblue: 1644912,\n    mintcream: 16121850,\n    mistyrose: 16770273,\n    moccasin: 16770229,\n    navajowhite: 16768685,\n    navy: 128,\n    oldlace: 16643558,\n    olive: 8421376,\n    olivedrab: 7048739,\n    orange: 16753920,\n    orangered: 16729344,\n    orchid: 14315734,\n    palegoldenrod: 15657130,\n    palegreen: 10025880,\n    paleturquoise: 11529966,\n    palevioletred: 14381203,\n    papayawhip: 16773077,\n    peachpuff: 16767673,\n    peru: 13468991,\n    pink: 16761035,\n    plum: 14524637,\n    powderblue: 11591910,\n    purple: 8388736,\n    rebeccapurple: 6697881,\n    red: 16711680,\n    rosybrown: 12357519,\n    royalblue: 4286945,\n    saddlebrown: 9127187,\n    salmon: 16416882,\n    sandybrown: 16032864,\n    seagreen: 3050327,\n    seashell: 16774638,\n    sienna: 10506797,\n    silver: 12632256,\n    skyblue: 8900331,\n    slateblue: 6970061,\n    slategray: 7372944,\n    slategrey: 7372944,\n    snow: 16775930,\n    springgreen: 65407,\n    steelblue: 4620980,\n    tan: 13808780,\n    teal: 32896,\n    thistle: 14204888,\n    tomato: 16737095,\n    turquoise: 4251856,\n    violet: 15631086,\n    wheat: 16113331,\n    white: 16777215,\n    whitesmoke: 16119285,\n    yellow: 16776960,\n    yellowgreen: 10145074\n  });\n  d3_rgb_names.forEach(function(key, value) {\n    d3_rgb_names.set(key, d3_rgbNumber(value));\n  });\n  function d3_functor(v) {\n    return typeof v === \"function\" ? v : function() {\n      return v;\n    };\n  }\n  d3.functor = d3_functor;\n  d3.xhr = d3_xhrType(d3_identity);\n  function d3_xhrType(response) {\n    return function(url, mimeType, callback) {\n      if (arguments.length === 2 && typeof mimeType === \"function\") callback = mimeType, \n      mimeType = null;\n      return d3_xhr(url, mimeType, response, callback);\n    };\n  }\n  function d3_xhr(url, mimeType, response, callback) {\n    var xhr = {}, dispatch = d3.dispatch(\"beforesend\", \"progress\", \"load\", \"error\"), headers = {}, request = new XMLHttpRequest(), responseType = null;\n    if (this.XDomainRequest && !(\"withCredentials\" in request) && /^(http(s)?:)?\\/\\//.test(url)) request = new XDomainRequest();\n    \"onload\" in request ? request.onload = request.onerror = respond : request.onreadystatechange = function() {\n      request.readyState > 3 && respond();\n    };\n    function respond() {\n      var status = request.status, result;\n      if (!status && d3_xhrHasResponse(request) || status >= 200 && status < 300 || status === 304) {\n        try {\n          result = response.call(xhr, request);\n        } catch (e) {\n          dispatch.error.call(xhr, e);\n          return;\n        }\n        dispatch.load.call(xhr, result);\n      } else {\n        dispatch.error.call(xhr, request);\n      }\n    }\n    request.onprogress = function(event) {\n      var o = d3.event;\n      d3.event = event;\n      try {\n        dispatch.progress.call(xhr, request);\n      } finally {\n        d3.event = o;\n      }\n    };\n    xhr.header = function(name, value) {\n      name = (name + \"\").toLowerCase();\n      if (arguments.length < 2) return headers[name];\n      if (value == null) delete headers[name]; else headers[name] = value + \"\";\n      return xhr;\n    };\n    xhr.mimeType = function(value) {\n      if (!arguments.length) return mimeType;\n      mimeType = value == null ? null : value + \"\";\n      return xhr;\n    };\n    xhr.responseType = function(value) {\n      if (!arguments.length) return responseType;\n      responseType = value;\n      return xhr;\n    };\n    xhr.response = function(value) {\n      response = value;\n      return xhr;\n    };\n    [ \"get\", \"post\" ].forEach(function(method) {\n      xhr[method] = function() {\n        return xhr.send.apply(xhr, [ method ].concat(d3_array(arguments)));\n      };\n    });\n    xhr.send = function(method, data, callback) {\n      if (arguments.length === 2 && typeof data === \"function\") callback = data, data = null;\n      request.open(method, url, true);\n      if (mimeType != null && !(\"accept\" in headers)) headers[\"accept\"] = mimeType + \",*/*\";\n      if (request.setRequestHeader) for (var name in headers) request.setRequestHeader(name, headers[name]);\n      if (mimeType != null && request.overrideMimeType) request.overrideMimeType(mimeType);\n      if (responseType != null) request.responseType = responseType;\n      if (callback != null) xhr.on(\"error\", callback).on(\"load\", function(request) {\n        callback(null, request);\n      });\n      dispatch.beforesend.call(xhr, request);\n      request.send(data == null ? null : data);\n      return xhr;\n    };\n    xhr.abort = function() {\n      request.abort();\n      return xhr;\n    };\n    d3.rebind(xhr, dispatch, \"on\");\n    return callback == null ? xhr : xhr.get(d3_xhr_fixCallback(callback));\n  }\n  function d3_xhr_fixCallback(callback) {\n    return callback.length === 1 ? function(error, request) {\n      callback(error == null ? request : null);\n    } : callback;\n  }\n  function d3_xhrHasResponse(request) {\n    var type = request.responseType;\n    return type && type !== \"text\" ? request.response : request.responseText;\n  }\n  d3.dsv = function(delimiter, mimeType) {\n    var reFormat = new RegExp('[\"' + delimiter + \"\\n]\"), delimiterCode = delimiter.charCodeAt(0);\n    function dsv(url, row, callback) {\n      if (arguments.length < 3) callback = row, row = null;\n      var xhr = d3_xhr(url, mimeType, row == null ? response : typedResponse(row), callback);\n      xhr.row = function(_) {\n        return arguments.length ? xhr.response((row = _) == null ? response : typedResponse(_)) : row;\n      };\n      return xhr;\n    }\n    function response(request) {\n      return dsv.parse(request.responseText);\n    }\n    function typedResponse(f) {\n      return function(request) {\n        return dsv.parse(request.responseText, f);\n      };\n    }\n    dsv.parse = function(text, f) {\n      var o;\n      return dsv.parseRows(text, function(row, i) {\n        if (o) return o(row, i - 1);\n        var a = new Function(\"d\", \"return {\" + row.map(function(name, i) {\n          return JSON.stringify(name) + \": d[\" + i + \"]\";\n        }).join(\",\") + \"}\");\n        o = f ? function(row, i) {\n          return f(a(row), i);\n        } : a;\n      });\n    };\n    dsv.parseRows = function(text, f) {\n      var EOL = {}, EOF = {}, rows = [], N = text.length, I = 0, n = 0, t, eol;\n      function token() {\n        if (I >= N) return EOF;\n        if (eol) return eol = false, EOL;\n        var j = I;\n        if (text.charCodeAt(j) === 34) {\n          var i = j;\n          while (i++ < N) {\n            if (text.charCodeAt(i) === 34) {\n              if (text.charCodeAt(i + 1) !== 34) break;\n              ++i;\n            }\n          }\n          I = i + 2;\n          var c = text.charCodeAt(i + 1);\n          if (c === 13) {\n            eol = true;\n            if (text.charCodeAt(i + 2) === 10) ++I;\n          } else if (c === 10) {\n            eol = true;\n          }\n          return text.slice(j + 1, i).replace(/\"\"/g, '\"');\n        }\n        while (I < N) {\n          var c = text.charCodeAt(I++), k = 1;\n          if (c === 10) eol = true; else if (c === 13) {\n            eol = true;\n            if (text.charCodeAt(I) === 10) ++I, ++k;\n          } else if (c !== delimiterCode) continue;\n          return text.slice(j, I - k);\n        }\n        return text.slice(j);\n      }\n      while ((t = token()) !== EOF) {\n        var a = [];\n        while (t !== EOL && t !== EOF) {\n          a.push(t);\n          t = token();\n        }\n        if (f && (a = f(a, n++)) == null) continue;\n        rows.push(a);\n      }\n      return rows;\n    };\n    dsv.format = function(rows) {\n      if (Array.isArray(rows[0])) return dsv.formatRows(rows);\n      var fieldSet = new d3_Set(), fields = [];\n      rows.forEach(function(row) {\n        for (var field in row) {\n          if (!fieldSet.has(field)) {\n            fields.push(fieldSet.add(field));\n          }\n        }\n      });\n      return [ fields.map(formatValue).join(delimiter) ].concat(rows.map(function(row) {\n        return fields.map(function(field) {\n          return formatValue(row[field]);\n        }).join(delimiter);\n      })).join(\"\\n\");\n    };\n    dsv.formatRows = function(rows) {\n      return rows.map(formatRow).join(\"\\n\");\n    };\n    function formatRow(row) {\n      return row.map(formatValue).join(delimiter);\n    }\n    function formatValue(text) {\n      return reFormat.test(text) ? '\"' + text.replace(/\\\"/g, '\"\"') + '\"' : text;\n    }\n    return dsv;\n  };\n  d3.csv = d3.dsv(\",\", \"text/csv\");\n  d3.tsv = d3.dsv(\"\t\", \"text/tab-separated-values\");\n  var d3_timer_queueHead, d3_timer_queueTail, d3_timer_interval, d3_timer_timeout, d3_timer_frame = this[d3_vendorSymbol(this, \"requestAnimationFrame\")] || function(callback) {\n    setTimeout(callback, 17);\n  };\n  d3.timer = function() {\n    d3_timer.apply(this, arguments);\n  };\n  function d3_timer(callback, delay, then) {\n    var n = arguments.length;\n    if (n < 2) delay = 0;\n    if (n < 3) then = Date.now();\n    var time = then + delay, timer = {\n      c: callback,\n      t: time,\n      n: null\n    };\n    if (d3_timer_queueTail) d3_timer_queueTail.n = timer; else d3_timer_queueHead = timer;\n    d3_timer_queueTail = timer;\n    if (!d3_timer_interval) {\n      d3_timer_timeout = clearTimeout(d3_timer_timeout);\n      d3_timer_interval = 1;\n      d3_timer_frame(d3_timer_step);\n    }\n    return timer;\n  }\n  function d3_timer_step() {\n    var now = d3_timer_mark(), delay = d3_timer_sweep() - now;\n    if (delay > 24) {\n      if (isFinite(delay)) {\n        clearTimeout(d3_timer_timeout);\n        d3_timer_timeout = setTimeout(d3_timer_step, delay);\n      }\n      d3_timer_interval = 0;\n    } else {\n      d3_timer_interval = 1;\n      d3_timer_frame(d3_timer_step);\n    }\n  }\n  d3.timer.flush = function() {\n    d3_timer_mark();\n    d3_timer_sweep();\n  };\n  function d3_timer_mark() {\n    var now = Date.now(), timer = d3_timer_queueHead;\n    while (timer) {\n      if (now >= timer.t && timer.c(now - timer.t)) timer.c = null;\n      timer = timer.n;\n    }\n    return now;\n  }\n  function d3_timer_sweep() {\n    var t0, t1 = d3_timer_queueHead, time = Infinity;\n    while (t1) {\n      if (t1.c) {\n        if (t1.t < time) time = t1.t;\n        t1 = (t0 = t1).n;\n      } else {\n        t1 = t0 ? t0.n = t1.n : d3_timer_queueHead = t1.n;\n      }\n    }\n    d3_timer_queueTail = t0;\n    return time;\n  }\n  function d3_format_precision(x, p) {\n    return p - (x ? Math.ceil(Math.log(x) / Math.LN10) : 1);\n  }\n  d3.round = function(x, n) {\n    return n ? Math.round(x * (n = Math.pow(10, n))) / n : Math.round(x);\n  };\n  var d3_formatPrefixes = [ \"y\", \"z\", \"a\", \"f\", \"p\", \"n\", \"µ\", \"m\", \"\", \"k\", \"M\", \"G\", \"T\", \"P\", \"E\", \"Z\", \"Y\" ].map(d3_formatPrefix);\n  d3.formatPrefix = function(value, precision) {\n    var i = 0;\n    if (value = +value) {\n      if (value < 0) value *= -1;\n      if (precision) value = d3.round(value, d3_format_precision(value, precision));\n      i = 1 + Math.floor(1e-12 + Math.log(value) / Math.LN10);\n      i = Math.max(-24, Math.min(24, Math.floor((i - 1) / 3) * 3));\n    }\n    return d3_formatPrefixes[8 + i / 3];\n  };\n  function d3_formatPrefix(d, i) {\n    var k = Math.pow(10, abs(8 - i) * 3);\n    return {\n      scale: i > 8 ? function(d) {\n        return d / k;\n      } : function(d) {\n        return d * k;\n      },\n      symbol: d\n    };\n  }\n  function d3_locale_numberFormat(locale) {\n    var locale_decimal = locale.decimal, locale_thousands = locale.thousands, locale_grouping = locale.grouping, locale_currency = locale.currency, formatGroup = locale_grouping && locale_thousands ? function(value, width) {\n      var i = value.length, t = [], j = 0, g = locale_grouping[0], length = 0;\n      while (i > 0 && g > 0) {\n        if (length + g + 1 > width) g = Math.max(1, width - length);\n        t.push(value.substring(i -= g, i + g));\n        if ((length += g + 1) > width) break;\n        g = locale_grouping[j = (j + 1) % locale_grouping.length];\n      }\n      return t.reverse().join(locale_thousands);\n    } : d3_identity;\n    return function(specifier) {\n      var match = d3_format_re.exec(specifier), fill = match[1] || \" \", align = match[2] || \">\", sign = match[3] || \"-\", symbol = match[4] || \"\", zfill = match[5], width = +match[6], comma = match[7], precision = match[8], type = match[9], scale = 1, prefix = \"\", suffix = \"\", integer = false, exponent = true;\n      if (precision) precision = +precision.substring(1);\n      if (zfill || fill === \"0\" && align === \"=\") {\n        zfill = fill = \"0\";\n        align = \"=\";\n      }\n      switch (type) {\n       case \"n\":\n        comma = true;\n        type = \"g\";\n        break;\n\n       case \"%\":\n        scale = 100;\n        suffix = \"%\";\n        type = \"f\";\n        break;\n\n       case \"p\":\n        scale = 100;\n        suffix = \"%\";\n        type = \"r\";\n        break;\n\n       case \"b\":\n       case \"o\":\n       case \"x\":\n       case \"X\":\n        if (symbol === \"#\") prefix = \"0\" + type.toLowerCase();\n\n       case \"c\":\n        exponent = false;\n\n       case \"d\":\n        integer = true;\n        precision = 0;\n        break;\n\n       case \"s\":\n        scale = -1;\n        type = \"r\";\n        break;\n      }\n      if (symbol === \"$\") prefix = locale_currency[0], suffix = locale_currency[1];\n      if (type == \"r\" && !precision) type = \"g\";\n      if (precision != null) {\n        if (type == \"g\") precision = Math.max(1, Math.min(21, precision)); else if (type == \"e\" || type == \"f\") precision = Math.max(0, Math.min(20, precision));\n      }\n      type = d3_format_types.get(type) || d3_format_typeDefault;\n      var zcomma = zfill && comma;\n      return function(value) {\n        var fullSuffix = suffix;\n        if (integer && value % 1) return \"\";\n        var negative = value < 0 || value === 0 && 1 / value < 0 ? (value = -value, \"-\") : sign === \"-\" ? \"\" : sign;\n        if (scale < 0) {\n          var unit = d3.formatPrefix(value, precision);\n          value = unit.scale(value);\n          fullSuffix = unit.symbol + suffix;\n        } else {\n          value *= scale;\n        }\n        value = type(value, precision);\n        var i = value.lastIndexOf(\".\"), before, after;\n        if (i < 0) {\n          var j = exponent ? value.lastIndexOf(\"e\") : -1;\n          if (j < 0) before = value, after = \"\"; else before = value.substring(0, j), after = value.substring(j);\n        } else {\n          before = value.substring(0, i);\n          after = locale_decimal + value.substring(i + 1);\n        }\n        if (!zfill && comma) before = formatGroup(before, Infinity);\n        var length = prefix.length + before.length + after.length + (zcomma ? 0 : negative.length), padding = length < width ? new Array(length = width - length + 1).join(fill) : \"\";\n        if (zcomma) before = formatGroup(padding + before, padding.length ? width - after.length : Infinity);\n        negative += prefix;\n        value = before + after;\n        return (align === \"<\" ? negative + value + padding : align === \">\" ? padding + negative + value : align === \"^\" ? padding.substring(0, length >>= 1) + negative + value + padding.substring(length) : negative + (zcomma ? value : padding + value)) + fullSuffix;\n      };\n    };\n  }\n  var d3_format_re = /(?:([^{])?([<>=^]))?([+\\- ])?([$#])?(0)?(\\d+)?(,)?(\\.-?\\d+)?([a-z%])?/i;\n  var d3_format_types = d3.map({\n    b: function(x) {\n      return x.toString(2);\n    },\n    c: function(x) {\n      return String.fromCharCode(x);\n    },\n    o: function(x) {\n      return x.toString(8);\n    },\n    x: function(x) {\n      return x.toString(16);\n    },\n    X: function(x) {\n      return x.toString(16).toUpperCase();\n    },\n    g: function(x, p) {\n      return x.toPrecision(p);\n    },\n    e: function(x, p) {\n      return x.toExponential(p);\n    },\n    f: function(x, p) {\n      return x.toFixed(p);\n    },\n    r: function(x, p) {\n      return (x = d3.round(x, d3_format_precision(x, p))).toFixed(Math.max(0, Math.min(20, d3_format_precision(x * (1 + 1e-15), p))));\n    }\n  });\n  function d3_format_typeDefault(x) {\n    return x + \"\";\n  }\n  var d3_time = d3.time = {}, d3_date = Date;\n  function d3_date_utc() {\n    this._ = new Date(arguments.length > 1 ? Date.UTC.apply(this, arguments) : arguments[0]);\n  }\n  d3_date_utc.prototype = {\n    getDate: function() {\n      return this._.getUTCDate();\n    },\n    getDay: function() {\n      return this._.getUTCDay();\n    },\n    getFullYear: function() {\n      return this._.getUTCFullYear();\n    },\n    getHours: function() {\n      return this._.getUTCHours();\n    },\n    getMilliseconds: function() {\n      return this._.getUTCMilliseconds();\n    },\n    getMinutes: function() {\n      return this._.getUTCMinutes();\n    },\n    getMonth: function() {\n      return this._.getUTCMonth();\n    },\n    getSeconds: function() {\n      return this._.getUTCSeconds();\n    },\n    getTime: function() {\n      return this._.getTime();\n    },\n    getTimezoneOffset: function() {\n      return 0;\n    },\n    valueOf: function() {\n      return this._.valueOf();\n    },\n    setDate: function() {\n      d3_time_prototype.setUTCDate.apply(this._, arguments);\n    },\n    setDay: function() {\n      d3_time_prototype.setUTCDay.apply(this._, arguments);\n    },\n    setFullYear: function() {\n      d3_time_prototype.setUTCFullYear.apply(this._, arguments);\n    },\n    setHours: function() {\n      d3_time_prototype.setUTCHours.apply(this._, arguments);\n    },\n    setMilliseconds: function() {\n      d3_time_prototype.setUTCMilliseconds.apply(this._, arguments);\n    },\n    setMinutes: function() {\n      d3_time_prototype.setUTCMinutes.apply(this._, arguments);\n    },\n    setMonth: function() {\n      d3_time_prototype.setUTCMonth.apply(this._, arguments);\n    },\n    setSeconds: function() {\n      d3_time_prototype.setUTCSeconds.apply(this._, arguments);\n    },\n    setTime: function() {\n      d3_time_prototype.setTime.apply(this._, arguments);\n    }\n  };\n  var d3_time_prototype = Date.prototype;\n  function d3_time_interval(local, step, number) {\n    function round(date) {\n      var d0 = local(date), d1 = offset(d0, 1);\n      return date - d0 < d1 - date ? d0 : d1;\n    }\n    function ceil(date) {\n      step(date = local(new d3_date(date - 1)), 1);\n      return date;\n    }\n    function offset(date, k) {\n      step(date = new d3_date(+date), k);\n      return date;\n    }\n    function range(t0, t1, dt) {\n      var time = ceil(t0), times = [];\n      if (dt > 1) {\n        while (time < t1) {\n          if (!(number(time) % dt)) times.push(new Date(+time));\n          step(time, 1);\n        }\n      } else {\n        while (time < t1) times.push(new Date(+time)), step(time, 1);\n      }\n      return times;\n    }\n    function range_utc(t0, t1, dt) {\n      try {\n        d3_date = d3_date_utc;\n        var utc = new d3_date_utc();\n        utc._ = t0;\n        return range(utc, t1, dt);\n      } finally {\n        d3_date = Date;\n      }\n    }\n    local.floor = local;\n    local.round = round;\n    local.ceil = ceil;\n    local.offset = offset;\n    local.range = range;\n    var utc = local.utc = d3_time_interval_utc(local);\n    utc.floor = utc;\n    utc.round = d3_time_interval_utc(round);\n    utc.ceil = d3_time_interval_utc(ceil);\n    utc.offset = d3_time_interval_utc(offset);\n    utc.range = range_utc;\n    return local;\n  }\n  function d3_time_interval_utc(method) {\n    return function(date, k) {\n      try {\n        d3_date = d3_date_utc;\n        var utc = new d3_date_utc();\n        utc._ = date;\n        return method(utc, k)._;\n      } finally {\n        d3_date = Date;\n      }\n    };\n  }\n  d3_time.year = d3_time_interval(function(date) {\n    date = d3_time.day(date);\n    date.setMonth(0, 1);\n    return date;\n  }, function(date, offset) {\n    date.setFullYear(date.getFullYear() + offset);\n  }, function(date) {\n    return date.getFullYear();\n  });\n  d3_time.years = d3_time.year.range;\n  d3_time.years.utc = d3_time.year.utc.range;\n  d3_time.day = d3_time_interval(function(date) {\n    var day = new d3_date(2e3, 0);\n    day.setFullYear(date.getFullYear(), date.getMonth(), date.getDate());\n    return day;\n  }, function(date, offset) {\n    date.setDate(date.getDate() + offset);\n  }, function(date) {\n    return date.getDate() - 1;\n  });\n  d3_time.days = d3_time.day.range;\n  d3_time.days.utc = d3_time.day.utc.range;\n  d3_time.dayOfYear = function(date) {\n    var year = d3_time.year(date);\n    return Math.floor((date - year - (date.getTimezoneOffset() - year.getTimezoneOffset()) * 6e4) / 864e5);\n  };\n  [ \"sunday\", \"monday\", \"tuesday\", \"wednesday\", \"thursday\", \"friday\", \"saturday\" ].forEach(function(day, i) {\n    i = 7 - i;\n    var interval = d3_time[day] = d3_time_interval(function(date) {\n      (date = d3_time.day(date)).setDate(date.getDate() - (date.getDay() + i) % 7);\n      return date;\n    }, function(date, offset) {\n      date.setDate(date.getDate() + Math.floor(offset) * 7);\n    }, function(date) {\n      var day = d3_time.year(date).getDay();\n      return Math.floor((d3_time.dayOfYear(date) + (day + i) % 7) / 7) - (day !== i);\n    });\n    d3_time[day + \"s\"] = interval.range;\n    d3_time[day + \"s\"].utc = interval.utc.range;\n    d3_time[day + \"OfYear\"] = function(date) {\n      var day = d3_time.year(date).getDay();\n      return Math.floor((d3_time.dayOfYear(date) + (day + i) % 7) / 7);\n    };\n  });\n  d3_time.week = d3_time.sunday;\n  d3_time.weeks = d3_time.sunday.range;\n  d3_time.weeks.utc = d3_time.sunday.utc.range;\n  d3_time.weekOfYear = d3_time.sundayOfYear;\n  function d3_locale_timeFormat(locale) {\n    var locale_dateTime = locale.dateTime, locale_date = locale.date, locale_time = locale.time, locale_periods = locale.periods, locale_days = locale.days, locale_shortDays = locale.shortDays, locale_months = locale.months, locale_shortMonths = locale.shortMonths;\n    function d3_time_format(template) {\n      var n = template.length;\n      function format(date) {\n        var string = [], i = -1, j = 0, c, p, f;\n        while (++i < n) {\n          if (template.charCodeAt(i) === 37) {\n            string.push(template.slice(j, i));\n            if ((p = d3_time_formatPads[c = template.charAt(++i)]) != null) c = template.charAt(++i);\n            if (f = d3_time_formats[c]) c = f(date, p == null ? c === \"e\" ? \" \" : \"0\" : p);\n            string.push(c);\n            j = i + 1;\n          }\n        }\n        string.push(template.slice(j, i));\n        return string.join(\"\");\n      }\n      format.parse = function(string) {\n        var d = {\n          y: 1900,\n          m: 0,\n          d: 1,\n          H: 0,\n          M: 0,\n          S: 0,\n          L: 0,\n          Z: null\n        }, i = d3_time_parse(d, template, string, 0);\n        if (i != string.length) return null;\n        if (\"p\" in d) d.H = d.H % 12 + d.p * 12;\n        var localZ = d.Z != null && d3_date !== d3_date_utc, date = new (localZ ? d3_date_utc : d3_date)();\n        if (\"j\" in d) date.setFullYear(d.y, 0, d.j); else if (\"W\" in d || \"U\" in d) {\n          if (!(\"w\" in d)) d.w = \"W\" in d ? 1 : 0;\n          date.setFullYear(d.y, 0, 1);\n          date.setFullYear(d.y, 0, \"W\" in d ? (d.w + 6) % 7 + d.W * 7 - (date.getDay() + 5) % 7 : d.w + d.U * 7 - (date.getDay() + 6) % 7);\n        } else date.setFullYear(d.y, d.m, d.d);\n        date.setHours(d.H + (d.Z / 100 | 0), d.M + d.Z % 100, d.S, d.L);\n        return localZ ? date._ : date;\n      };\n      format.toString = function() {\n        return template;\n      };\n      return format;\n    }\n    function d3_time_parse(date, template, string, j) {\n      var c, p, t, i = 0, n = template.length, m = string.length;\n      while (i < n) {\n        if (j >= m) return -1;\n        c = template.charCodeAt(i++);\n        if (c === 37) {\n          t = template.charAt(i++);\n          p = d3_time_parsers[t in d3_time_formatPads ? template.charAt(i++) : t];\n          if (!p || (j = p(date, string, j)) < 0) return -1;\n        } else if (c != string.charCodeAt(j++)) {\n          return -1;\n        }\n      }\n      return j;\n    }\n    d3_time_format.utc = function(template) {\n      var local = d3_time_format(template);\n      function format(date) {\n        try {\n          d3_date = d3_date_utc;\n          var utc = new d3_date();\n          utc._ = date;\n          return local(utc);\n        } finally {\n          d3_date = Date;\n        }\n      }\n      format.parse = function(string) {\n        try {\n          d3_date = d3_date_utc;\n          var date = local.parse(string);\n          return date && date._;\n        } finally {\n          d3_date = Date;\n        }\n      };\n      format.toString = local.toString;\n      return format;\n    };\n    d3_time_format.multi = d3_time_format.utc.multi = d3_time_formatMulti;\n    var d3_time_periodLookup = d3.map(), d3_time_dayRe = d3_time_formatRe(locale_days), d3_time_dayLookup = d3_time_formatLookup(locale_days), d3_time_dayAbbrevRe = d3_time_formatRe(locale_shortDays), d3_time_dayAbbrevLookup = d3_time_formatLookup(locale_shortDays), d3_time_monthRe = d3_time_formatRe(locale_months), d3_time_monthLookup = d3_time_formatLookup(locale_months), d3_time_monthAbbrevRe = d3_time_formatRe(locale_shortMonths), d3_time_monthAbbrevLookup = d3_time_formatLookup(locale_shortMonths);\n    locale_periods.forEach(function(p, i) {\n      d3_time_periodLookup.set(p.toLowerCase(), i);\n    });\n    var d3_time_formats = {\n      a: function(d) {\n        return locale_shortDays[d.getDay()];\n      },\n      A: function(d) {\n        return locale_days[d.getDay()];\n      },\n      b: function(d) {\n        return locale_shortMonths[d.getMonth()];\n      },\n      B: function(d) {\n        return locale_months[d.getMonth()];\n      },\n      c: d3_time_format(locale_dateTime),\n      d: function(d, p) {\n        return d3_time_formatPad(d.getDate(), p, 2);\n      },\n      e: function(d, p) {\n        return d3_time_formatPad(d.getDate(), p, 2);\n      },\n      H: function(d, p) {\n        return d3_time_formatPad(d.getHours(), p, 2);\n      },\n      I: function(d, p) {\n        return d3_time_formatPad(d.getHours() % 12 || 12, p, 2);\n      },\n      j: function(d, p) {\n        return d3_time_formatPad(1 + d3_time.dayOfYear(d), p, 3);\n      },\n      L: function(d, p) {\n        return d3_time_formatPad(d.getMilliseconds(), p, 3);\n      },\n      m: function(d, p) {\n        return d3_time_formatPad(d.getMonth() + 1, p, 2);\n      },\n      M: function(d, p) {\n        return d3_time_formatPad(d.getMinutes(), p, 2);\n      },\n      p: function(d) {\n        return locale_periods[+(d.getHours() >= 12)];\n      },\n      S: function(d, p) {\n        return d3_time_formatPad(d.getSeconds(), p, 2);\n      },\n      U: function(d, p) {\n        return d3_time_formatPad(d3_time.sundayOfYear(d), p, 2);\n      },\n      w: function(d) {\n        return d.getDay();\n      },\n      W: function(d, p) {\n        return d3_time_formatPad(d3_time.mondayOfYear(d), p, 2);\n      },\n      x: d3_time_format(locale_date),\n      X: d3_time_format(locale_time),\n      y: function(d, p) {\n        return d3_time_formatPad(d.getFullYear() % 100, p, 2);\n      },\n      Y: function(d, p) {\n        return d3_time_formatPad(d.getFullYear() % 1e4, p, 4);\n      },\n      Z: d3_time_zone,\n      \"%\": function() {\n        return \"%\";\n      }\n    };\n    var d3_time_parsers = {\n      a: d3_time_parseWeekdayAbbrev,\n      A: d3_time_parseWeekday,\n      b: d3_time_parseMonthAbbrev,\n      B: d3_time_parseMonth,\n      c: d3_time_parseLocaleFull,\n      d: d3_time_parseDay,\n      e: d3_time_parseDay,\n      H: d3_time_parseHour24,\n      I: d3_time_parseHour24,\n      j: d3_time_parseDayOfYear,\n      L: d3_time_parseMilliseconds,\n      m: d3_time_parseMonthNumber,\n      M: d3_time_parseMinutes,\n      p: d3_time_parseAmPm,\n      S: d3_time_parseSeconds,\n      U: d3_time_parseWeekNumberSunday,\n      w: d3_time_parseWeekdayNumber,\n      W: d3_time_parseWeekNumberMonday,\n      x: d3_time_parseLocaleDate,\n      X: d3_time_parseLocaleTime,\n      y: d3_time_parseYear,\n      Y: d3_time_parseFullYear,\n      Z: d3_time_parseZone,\n      \"%\": d3_time_parseLiteralPercent\n    };\n    function d3_time_parseWeekdayAbbrev(date, string, i) {\n      d3_time_dayAbbrevRe.lastIndex = 0;\n      var n = d3_time_dayAbbrevRe.exec(string.slice(i));\n      return n ? (date.w = d3_time_dayAbbrevLookup.get(n[0].toLowerCase()), i + n[0].length) : -1;\n    }\n    function d3_time_parseWeekday(date, string, i) {\n      d3_time_dayRe.lastIndex = 0;\n      var n = d3_time_dayRe.exec(string.slice(i));\n      return n ? (date.w = d3_time_dayLookup.get(n[0].toLowerCase()), i + n[0].length) : -1;\n    }\n    function d3_time_parseMonthAbbrev(date, string, i) {\n      d3_time_monthAbbrevRe.lastIndex = 0;\n      var n = d3_time_monthAbbrevRe.exec(string.slice(i));\n      return n ? (date.m = d3_time_monthAbbrevLookup.get(n[0].toLowerCase()), i + n[0].length) : -1;\n    }\n    function d3_time_parseMonth(date, string, i) {\n      d3_time_monthRe.lastIndex = 0;\n      var n = d3_time_monthRe.exec(string.slice(i));\n      return n ? (date.m = d3_time_monthLookup.get(n[0].toLowerCase()), i + n[0].length) : -1;\n    }\n    function d3_time_parseLocaleFull(date, string, i) {\n      return d3_time_parse(date, d3_time_formats.c.toString(), string, i);\n    }\n    function d3_time_parseLocaleDate(date, string, i) {\n      return d3_time_parse(date, d3_time_formats.x.toString(), string, i);\n    }\n    function d3_time_parseLocaleTime(date, string, i) {\n      return d3_time_parse(date, d3_time_formats.X.toString(), string, i);\n    }\n    function d3_time_parseAmPm(date, string, i) {\n      var n = d3_time_periodLookup.get(string.slice(i, i += 2).toLowerCase());\n      return n == null ? -1 : (date.p = n, i);\n    }\n    return d3_time_format;\n  }\n  var d3_time_formatPads = {\n    \"-\": \"\",\n    _: \" \",\n    \"0\": \"0\"\n  }, d3_time_numberRe = /^\\s*\\d+/, d3_time_percentRe = /^%/;\n  function d3_time_formatPad(value, fill, width) {\n    var sign = value < 0 ? \"-\" : \"\", string = (sign ? -value : value) + \"\", length = string.length;\n    return sign + (length < width ? new Array(width - length + 1).join(fill) + string : string);\n  }\n  function d3_time_formatRe(names) {\n    return new RegExp(\"^(?:\" + names.map(d3.requote).join(\"|\") + \")\", \"i\");\n  }\n  function d3_time_formatLookup(names) {\n    var map = new d3_Map(), i = -1, n = names.length;\n    while (++i < n) map.set(names[i].toLowerCase(), i);\n    return map;\n  }\n  function d3_time_parseWeekdayNumber(date, string, i) {\n    d3_time_numberRe.lastIndex = 0;\n    var n = d3_time_numberRe.exec(string.slice(i, i + 1));\n    return n ? (date.w = +n[0], i + n[0].length) : -1;\n  }\n  function d3_time_parseWeekNumberSunday(date, string, i) {\n    d3_time_numberRe.lastIndex = 0;\n    var n = d3_time_numberRe.exec(string.slice(i));\n    return n ? (date.U = +n[0], i + n[0].length) : -1;\n  }\n  function d3_time_parseWeekNumberMonday(date, string, i) {\n    d3_time_numberRe.lastIndex = 0;\n    var n = d3_time_numberRe.exec(string.slice(i));\n    return n ? (date.W = +n[0], i + n[0].length) : -1;\n  }\n  function d3_time_parseFullYear(date, string, i) {\n    d3_time_numberRe.lastIndex = 0;\n    var n = d3_time_numberRe.exec(string.slice(i, i + 4));\n    return n ? (date.y = +n[0], i + n[0].length) : -1;\n  }\n  function d3_time_parseYear(date, string, i) {\n    d3_time_numberRe.lastIndex = 0;\n    var n = d3_time_numberRe.exec(string.slice(i, i + 2));\n    return n ? (date.y = d3_time_expandYear(+n[0]), i + n[0].length) : -1;\n  }\n  function d3_time_parseZone(date, string, i) {\n    return /^[+-]\\d{4}$/.test(string = string.slice(i, i + 5)) ? (date.Z = -string, \n    i + 5) : -1;\n  }\n  function d3_time_expandYear(d) {\n    return d + (d > 68 ? 1900 : 2e3);\n  }\n  function d3_time_parseMonthNumber(date, string, i) {\n    d3_time_numberRe.lastIndex = 0;\n    var n = d3_time_numberRe.exec(string.slice(i, i + 2));\n    return n ? (date.m = n[0] - 1, i + n[0].length) : -1;\n  }\n  function d3_time_parseDay(date, string, i) {\n    d3_time_numberRe.lastIndex = 0;\n    var n = d3_time_numberRe.exec(string.slice(i, i + 2));\n    return n ? (date.d = +n[0], i + n[0].length) : -1;\n  }\n  function d3_time_parseDayOfYear(date, string, i) {\n    d3_time_numberRe.lastIndex = 0;\n    var n = d3_time_numberRe.exec(string.slice(i, i + 3));\n    return n ? (date.j = +n[0], i + n[0].length) : -1;\n  }\n  function d3_time_parseHour24(date, string, i) {\n    d3_time_numberRe.lastIndex = 0;\n    var n = d3_time_numberRe.exec(string.slice(i, i + 2));\n    return n ? (date.H = +n[0], i + n[0].length) : -1;\n  }\n  function d3_time_parseMinutes(date, string, i) {\n    d3_time_numberRe.lastIndex = 0;\n    var n = d3_time_numberRe.exec(string.slice(i, i + 2));\n    return n ? (date.M = +n[0], i + n[0].length) : -1;\n  }\n  function d3_time_parseSeconds(date, string, i) {\n    d3_time_numberRe.lastIndex = 0;\n    var n = d3_time_numberRe.exec(string.slice(i, i + 2));\n    return n ? (date.S = +n[0], i + n[0].length) : -1;\n  }\n  function d3_time_parseMilliseconds(date, string, i) {\n    d3_time_numberRe.lastIndex = 0;\n    var n = d3_time_numberRe.exec(string.slice(i, i + 3));\n    return n ? (date.L = +n[0], i + n[0].length) : -1;\n  }\n  function d3_time_zone(d) {\n    var z = d.getTimezoneOffset(), zs = z > 0 ? \"-\" : \"+\", zh = abs(z) / 60 | 0, zm = abs(z) % 60;\n    return zs + d3_time_formatPad(zh, \"0\", 2) + d3_time_formatPad(zm, \"0\", 2);\n  }\n  function d3_time_parseLiteralPercent(date, string, i) {\n    d3_time_percentRe.lastIndex = 0;\n    var n = d3_time_percentRe.exec(string.slice(i, i + 1));\n    return n ? i + n[0].length : -1;\n  }\n  function d3_time_formatMulti(formats) {\n    var n = formats.length, i = -1;\n    while (++i < n) formats[i][0] = this(formats[i][0]);\n    return function(date) {\n      var i = 0, f = formats[i];\n      while (!f[1](date)) f = formats[++i];\n      return f[0](date);\n    };\n  }\n  d3.locale = function(locale) {\n    return {\n      numberFormat: d3_locale_numberFormat(locale),\n      timeFormat: d3_locale_timeFormat(locale)\n    };\n  };\n  var d3_locale_enUS = d3.locale({\n    decimal: \".\",\n    thousands: \",\",\n    grouping: [ 3 ],\n    currency: [ \"$\", \"\" ],\n    dateTime: \"%a %b %e %X %Y\",\n    date: \"%m/%d/%Y\",\n    time: \"%H:%M:%S\",\n    periods: [ \"AM\", \"PM\" ],\n    days: [ \"Sunday\", \"Monday\", \"Tuesday\", \"Wednesday\", \"Thursday\", \"Friday\", \"Saturday\" ],\n    shortDays: [ \"Sun\", \"Mon\", \"Tue\", \"Wed\", \"Thu\", \"Fri\", \"Sat\" ],\n    months: [ \"January\", \"February\", \"March\", \"April\", \"May\", \"June\", \"July\", \"August\", \"September\", \"October\", \"November\", \"December\" ],\n    shortMonths: [ \"Jan\", \"Feb\", \"Mar\", \"Apr\", \"May\", \"Jun\", \"Jul\", \"Aug\", \"Sep\", \"Oct\", \"Nov\", \"Dec\" ]\n  });\n  d3.format = d3_locale_enUS.numberFormat;\n  d3.geo = {};\n  function d3_adder() {}\n  d3_adder.prototype = {\n    s: 0,\n    t: 0,\n    add: function(y) {\n      d3_adderSum(y, this.t, d3_adderTemp);\n      d3_adderSum(d3_adderTemp.s, this.s, this);\n      if (this.s) this.t += d3_adderTemp.t; else this.s = d3_adderTemp.t;\n    },\n    reset: function() {\n      this.s = this.t = 0;\n    },\n    valueOf: function() {\n      return this.s;\n    }\n  };\n  var d3_adderTemp = new d3_adder();\n  function d3_adderSum(a, b, o) {\n    var x = o.s = a + b, bv = x - a, av = x - bv;\n    o.t = a - av + (b - bv);\n  }\n  d3.geo.stream = function(object, listener) {\n    if (object && d3_geo_streamObjectType.hasOwnProperty(object.type)) {\n      d3_geo_streamObjectType[object.type](object, listener);\n    } else {\n      d3_geo_streamGeometry(object, listener);\n    }\n  };\n  function d3_geo_streamGeometry(geometry, listener) {\n    if (geometry && d3_geo_streamGeometryType.hasOwnProperty(geometry.type)) {\n      d3_geo_streamGeometryType[geometry.type](geometry, listener);\n    }\n  }\n  var d3_geo_streamObjectType = {\n    Feature: function(feature, listener) {\n      d3_geo_streamGeometry(feature.geometry, listener);\n    },\n    FeatureCollection: function(object, listener) {\n      var features = object.features, i = -1, n = features.length;\n      while (++i < n) d3_geo_streamGeometry(features[i].geometry, listener);\n    }\n  };\n  var d3_geo_streamGeometryType = {\n    Sphere: function(object, listener) {\n      listener.sphere();\n    },\n    Point: function(object, listener) {\n      object = object.coordinates;\n      listener.point(object[0], object[1], object[2]);\n    },\n    MultiPoint: function(object, listener) {\n      var coordinates = object.coordinates, i = -1, n = coordinates.length;\n      while (++i < n) object = coordinates[i], listener.point(object[0], object[1], object[2]);\n    },\n    LineString: function(object, listener) {\n      d3_geo_streamLine(object.coordinates, listener, 0);\n    },\n    MultiLineString: function(object, listener) {\n      var coordinates = object.coordinates, i = -1, n = coordinates.length;\n      while (++i < n) d3_geo_streamLine(coordinates[i], listener, 0);\n    },\n    Polygon: function(object, listener) {\n      d3_geo_streamPolygon(object.coordinates, listener);\n    },\n    MultiPolygon: function(object, listener) {\n      var coordinates = object.coordinates, i = -1, n = coordinates.length;\n      while (++i < n) d3_geo_streamPolygon(coordinates[i], listener);\n    },\n    GeometryCollection: function(object, listener) {\n      var geometries = object.geometries, i = -1, n = geometries.length;\n      while (++i < n) d3_geo_streamGeometry(geometries[i], listener);\n    }\n  };\n  function d3_geo_streamLine(coordinates, listener, closed) {\n    var i = -1, n = coordinates.length - closed, coordinate;\n    listener.lineStart();\n    while (++i < n) coordinate = coordinates[i], listener.point(coordinate[0], coordinate[1], coordinate[2]);\n    listener.lineEnd();\n  }\n  function d3_geo_streamPolygon(coordinates, listener) {\n    var i = -1, n = coordinates.length;\n    listener.polygonStart();\n    while (++i < n) d3_geo_streamLine(coordinates[i], listener, 1);\n    listener.polygonEnd();\n  }\n  d3.geo.area = function(object) {\n    d3_geo_areaSum = 0;\n    d3.geo.stream(object, d3_geo_area);\n    return d3_geo_areaSum;\n  };\n  var d3_geo_areaSum, d3_geo_areaRingSum = new d3_adder();\n  var d3_geo_area = {\n    sphere: function() {\n      d3_geo_areaSum += 4 * π;\n    },\n    point: d3_noop,\n    lineStart: d3_noop,\n    lineEnd: d3_noop,\n    polygonStart: function() {\n      d3_geo_areaRingSum.reset();\n      d3_geo_area.lineStart = d3_geo_areaRingStart;\n    },\n    polygonEnd: function() {\n      var area = 2 * d3_geo_areaRingSum;\n      d3_geo_areaSum += area < 0 ? 4 * π + area : area;\n      d3_geo_area.lineStart = d3_geo_area.lineEnd = d3_geo_area.point = d3_noop;\n    }\n  };\n  function d3_geo_areaRingStart() {\n    var λ00, φ00, λ0, cosφ0, sinφ0;\n    d3_geo_area.point = function(λ, φ) {\n      d3_geo_area.point = nextPoint;\n      λ0 = (λ00 = λ) * d3_radians, cosφ0 = Math.cos(φ = (φ00 = φ) * d3_radians / 2 + π / 4), \n      sinφ0 = Math.sin(φ);\n    };\n    function nextPoint(λ, φ) {\n      λ *= d3_radians;\n      φ = φ * d3_radians / 2 + π / 4;\n      var dλ = λ - λ0, sdλ = dλ >= 0 ? 1 : -1, adλ = sdλ * dλ, cosφ = Math.cos(φ), sinφ = Math.sin(φ), k = sinφ0 * sinφ, u = cosφ0 * cosφ + k * Math.cos(adλ), v = k * sdλ * Math.sin(adλ);\n      d3_geo_areaRingSum.add(Math.atan2(v, u));\n      λ0 = λ, cosφ0 = cosφ, sinφ0 = sinφ;\n    }\n    d3_geo_area.lineEnd = function() {\n      nextPoint(λ00, φ00);\n    };\n  }\n  function d3_geo_cartesian(spherical) {\n    var λ = spherical[0], φ = spherical[1], cosφ = Math.cos(φ);\n    return [ cosφ * Math.cos(λ), cosφ * Math.sin(λ), Math.sin(φ) ];\n  }\n  function d3_geo_cartesianDot(a, b) {\n    return a[0] * b[0] + a[1] * b[1] + a[2] * b[2];\n  }\n  function d3_geo_cartesianCross(a, b) {\n    return [ a[1] * b[2] - a[2] * b[1], a[2] * b[0] - a[0] * b[2], a[0] * b[1] - a[1] * b[0] ];\n  }\n  function d3_geo_cartesianAdd(a, b) {\n    a[0] += b[0];\n    a[1] += b[1];\n    a[2] += b[2];\n  }\n  function d3_geo_cartesianScale(vector, k) {\n    return [ vector[0] * k, vector[1] * k, vector[2] * k ];\n  }\n  function d3_geo_cartesianNormalize(d) {\n    var l = Math.sqrt(d[0] * d[0] + d[1] * d[1] + d[2] * d[2]);\n    d[0] /= l;\n    d[1] /= l;\n    d[2] /= l;\n  }\n  function d3_geo_spherical(cartesian) {\n    return [ Math.atan2(cartesian[1], cartesian[0]), d3_asin(cartesian[2]) ];\n  }\n  function d3_geo_sphericalEqual(a, b) {\n    return abs(a[0] - b[0]) < ε && abs(a[1] - b[1]) < ε;\n  }\n  d3.geo.bounds = function() {\n    var λ0, φ0, λ1, φ1, λ_, λ__, φ__, p0, dλSum, ranges, range;\n    var bound = {\n      point: point,\n      lineStart: lineStart,\n      lineEnd: lineEnd,\n      polygonStart: function() {\n        bound.point = ringPoint;\n        bound.lineStart = ringStart;\n        bound.lineEnd = ringEnd;\n        dλSum = 0;\n        d3_geo_area.polygonStart();\n      },\n      polygonEnd: function() {\n        d3_geo_area.polygonEnd();\n        bound.point = point;\n        bound.lineStart = lineStart;\n        bound.lineEnd = lineEnd;\n        if (d3_geo_areaRingSum < 0) λ0 = -(λ1 = 180), φ0 = -(φ1 = 90); else if (dλSum > ε) φ1 = 90; else if (dλSum < -ε) φ0 = -90;\n        range[0] = λ0, range[1] = λ1;\n      }\n    };\n    function point(λ, φ) {\n      ranges.push(range = [ λ0 = λ, λ1 = λ ]);\n      if (φ < φ0) φ0 = φ;\n      if (φ > φ1) φ1 = φ;\n    }\n    function linePoint(λ, φ) {\n      var p = d3_geo_cartesian([ λ * d3_radians, φ * d3_radians ]);\n      if (p0) {\n        var normal = d3_geo_cartesianCross(p0, p), equatorial = [ normal[1], -normal[0], 0 ], inflection = d3_geo_cartesianCross(equatorial, normal);\n        d3_geo_cartesianNormalize(inflection);\n        inflection = d3_geo_spherical(inflection);\n        var dλ = λ - λ_, s = dλ > 0 ? 1 : -1, λi = inflection[0] * d3_degrees * s, antimeridian = abs(dλ) > 180;\n        if (antimeridian ^ (s * λ_ < λi && λi < s * λ)) {\n          var φi = inflection[1] * d3_degrees;\n          if (φi > φ1) φ1 = φi;\n        } else if (λi = (λi + 360) % 360 - 180, antimeridian ^ (s * λ_ < λi && λi < s * λ)) {\n          var φi = -inflection[1] * d3_degrees;\n          if (φi < φ0) φ0 = φi;\n        } else {\n          if (φ < φ0) φ0 = φ;\n          if (φ > φ1) φ1 = φ;\n        }\n        if (antimeridian) {\n          if (λ < λ_) {\n            if (angle(λ0, λ) > angle(λ0, λ1)) λ1 = λ;\n          } else {\n            if (angle(λ, λ1) > angle(λ0, λ1)) λ0 = λ;\n          }\n        } else {\n          if (λ1 >= λ0) {\n            if (λ < λ0) λ0 = λ;\n            if (λ > λ1) λ1 = λ;\n          } else {\n            if (λ > λ_) {\n              if (angle(λ0, λ) > angle(λ0, λ1)) λ1 = λ;\n            } else {\n              if (angle(λ, λ1) > angle(λ0, λ1)) λ0 = λ;\n            }\n          }\n        }\n      } else {\n        point(λ, φ);\n      }\n      p0 = p, λ_ = λ;\n    }\n    function lineStart() {\n      bound.point = linePoint;\n    }\n    function lineEnd() {\n      range[0] = λ0, range[1] = λ1;\n      bound.point = point;\n      p0 = null;\n    }\n    function ringPoint(λ, φ) {\n      if (p0) {\n        var dλ = λ - λ_;\n        dλSum += abs(dλ) > 180 ? dλ + (dλ > 0 ? 360 : -360) : dλ;\n      } else λ__ = λ, φ__ = φ;\n      d3_geo_area.point(λ, φ);\n      linePoint(λ, φ);\n    }\n    function ringStart() {\n      d3_geo_area.lineStart();\n    }\n    function ringEnd() {\n      ringPoint(λ__, φ__);\n      d3_geo_area.lineEnd();\n      if (abs(dλSum) > ε) λ0 = -(λ1 = 180);\n      range[0] = λ0, range[1] = λ1;\n      p0 = null;\n    }\n    function angle(λ0, λ1) {\n      return (λ1 -= λ0) < 0 ? λ1 + 360 : λ1;\n    }\n    function compareRanges(a, b) {\n      return a[0] - b[0];\n    }\n    function withinRange(x, range) {\n      return range[0] <= range[1] ? range[0] <= x && x <= range[1] : x < range[0] || range[1] < x;\n    }\n    return function(feature) {\n      φ1 = λ1 = -(λ0 = φ0 = Infinity);\n      ranges = [];\n      d3.geo.stream(feature, bound);\n      var n = ranges.length;\n      if (n) {\n        ranges.sort(compareRanges);\n        for (var i = 1, a = ranges[0], b, merged = [ a ]; i < n; ++i) {\n          b = ranges[i];\n          if (withinRange(b[0], a) || withinRange(b[1], a)) {\n            if (angle(a[0], b[1]) > angle(a[0], a[1])) a[1] = b[1];\n            if (angle(b[0], a[1]) > angle(a[0], a[1])) a[0] = b[0];\n          } else {\n            merged.push(a = b);\n          }\n        }\n        var best = -Infinity, dλ;\n        for (var n = merged.length - 1, i = 0, a = merged[n], b; i <= n; a = b, ++i) {\n          b = merged[i];\n          if ((dλ = angle(a[1], b[0])) > best) best = dλ, λ0 = b[0], λ1 = a[1];\n        }\n      }\n      ranges = range = null;\n      return λ0 === Infinity || φ0 === Infinity ? [ [ NaN, NaN ], [ NaN, NaN ] ] : [ [ λ0, φ0 ], [ λ1, φ1 ] ];\n    };\n  }();\n  d3.geo.centroid = function(object) {\n    d3_geo_centroidW0 = d3_geo_centroidW1 = d3_geo_centroidX0 = d3_geo_centroidY0 = d3_geo_centroidZ0 = d3_geo_centroidX1 = d3_geo_centroidY1 = d3_geo_centroidZ1 = d3_geo_centroidX2 = d3_geo_centroidY2 = d3_geo_centroidZ2 = 0;\n    d3.geo.stream(object, d3_geo_centroid);\n    var x = d3_geo_centroidX2, y = d3_geo_centroidY2, z = d3_geo_centroidZ2, m = x * x + y * y + z * z;\n    if (m < ε2) {\n      x = d3_geo_centroidX1, y = d3_geo_centroidY1, z = d3_geo_centroidZ1;\n      if (d3_geo_centroidW1 < ε) x = d3_geo_centroidX0, y = d3_geo_centroidY0, z = d3_geo_centroidZ0;\n      m = x * x + y * y + z * z;\n      if (m < ε2) return [ NaN, NaN ];\n    }\n    return [ Math.atan2(y, x) * d3_degrees, d3_asin(z / Math.sqrt(m)) * d3_degrees ];\n  };\n  var d3_geo_centroidW0, d3_geo_centroidW1, d3_geo_centroidX0, d3_geo_centroidY0, d3_geo_centroidZ0, d3_geo_centroidX1, d3_geo_centroidY1, d3_geo_centroidZ1, d3_geo_centroidX2, d3_geo_centroidY2, d3_geo_centroidZ2;\n  var d3_geo_centroid = {\n    sphere: d3_noop,\n    point: d3_geo_centroidPoint,\n    lineStart: d3_geo_centroidLineStart,\n    lineEnd: d3_geo_centroidLineEnd,\n    polygonStart: function() {\n      d3_geo_centroid.lineStart = d3_geo_centroidRingStart;\n    },\n    polygonEnd: function() {\n      d3_geo_centroid.lineStart = d3_geo_centroidLineStart;\n    }\n  };\n  function d3_geo_centroidPoint(λ, φ) {\n    λ *= d3_radians;\n    var cosφ = Math.cos(φ *= d3_radians);\n    d3_geo_centroidPointXYZ(cosφ * Math.cos(λ), cosφ * Math.sin(λ), Math.sin(φ));\n  }\n  function d3_geo_centroidPointXYZ(x, y, z) {\n    ++d3_geo_centroidW0;\n    d3_geo_centroidX0 += (x - d3_geo_centroidX0) / d3_geo_centroidW0;\n    d3_geo_centroidY0 += (y - d3_geo_centroidY0) / d3_geo_centroidW0;\n    d3_geo_centroidZ0 += (z - d3_geo_centroidZ0) / d3_geo_centroidW0;\n  }\n  function d3_geo_centroidLineStart() {\n    var x0, y0, z0;\n    d3_geo_centroid.point = function(λ, φ) {\n      λ *= d3_radians;\n      var cosφ = Math.cos(φ *= d3_radians);\n      x0 = cosφ * Math.cos(λ);\n      y0 = cosφ * Math.sin(λ);\n      z0 = Math.sin(φ);\n      d3_geo_centroid.point = nextPoint;\n      d3_geo_centroidPointXYZ(x0, y0, z0);\n    };\n    function nextPoint(λ, φ) {\n      λ *= d3_radians;\n      var cosφ = Math.cos(φ *= d3_radians), x = cosφ * Math.cos(λ), y = cosφ * Math.sin(λ), z = Math.sin(φ), w = Math.atan2(Math.sqrt((w = y0 * z - z0 * y) * w + (w = z0 * x - x0 * z) * w + (w = x0 * y - y0 * x) * w), x0 * x + y0 * y + z0 * z);\n      d3_geo_centroidW1 += w;\n      d3_geo_centroidX1 += w * (x0 + (x0 = x));\n      d3_geo_centroidY1 += w * (y0 + (y0 = y));\n      d3_geo_centroidZ1 += w * (z0 + (z0 = z));\n      d3_geo_centroidPointXYZ(x0, y0, z0);\n    }\n  }\n  function d3_geo_centroidLineEnd() {\n    d3_geo_centroid.point = d3_geo_centroidPoint;\n  }\n  function d3_geo_centroidRingStart() {\n    var λ00, φ00, x0, y0, z0;\n    d3_geo_centroid.point = function(λ, φ) {\n      λ00 = λ, φ00 = φ;\n      d3_geo_centroid.point = nextPoint;\n      λ *= d3_radians;\n      var cosφ = Math.cos(φ *= d3_radians);\n      x0 = cosφ * Math.cos(λ);\n      y0 = cosφ * Math.sin(λ);\n      z0 = Math.sin(φ);\n      d3_geo_centroidPointXYZ(x0, y0, z0);\n    };\n    d3_geo_centroid.lineEnd = function() {\n      nextPoint(λ00, φ00);\n      d3_geo_centroid.lineEnd = d3_geo_centroidLineEnd;\n      d3_geo_centroid.point = d3_geo_centroidPoint;\n    };\n    function nextPoint(λ, φ) {\n      λ *= d3_radians;\n      var cosφ = Math.cos(φ *= d3_radians), x = cosφ * Math.cos(λ), y = cosφ * Math.sin(λ), z = Math.sin(φ), cx = y0 * z - z0 * y, cy = z0 * x - x0 * z, cz = x0 * y - y0 * x, m = Math.sqrt(cx * cx + cy * cy + cz * cz), u = x0 * x + y0 * y + z0 * z, v = m && -d3_acos(u) / m, w = Math.atan2(m, u);\n      d3_geo_centroidX2 += v * cx;\n      d3_geo_centroidY2 += v * cy;\n      d3_geo_centroidZ2 += v * cz;\n      d3_geo_centroidW1 += w;\n      d3_geo_centroidX1 += w * (x0 + (x0 = x));\n      d3_geo_centroidY1 += w * (y0 + (y0 = y));\n      d3_geo_centroidZ1 += w * (z0 + (z0 = z));\n      d3_geo_centroidPointXYZ(x0, y0, z0);\n    }\n  }\n  function d3_geo_compose(a, b) {\n    function compose(x, y) {\n      return x = a(x, y), b(x[0], x[1]);\n    }\n    if (a.invert && b.invert) compose.invert = function(x, y) {\n      return x = b.invert(x, y), x && a.invert(x[0], x[1]);\n    };\n    return compose;\n  }\n  function d3_true() {\n    return true;\n  }\n  function d3_geo_clipPolygon(segments, compare, clipStartInside, interpolate, listener) {\n    var subject = [], clip = [];\n    segments.forEach(function(segment) {\n      if ((n = segment.length - 1) <= 0) return;\n      var n, p0 = segment[0], p1 = segment[n];\n      if (d3_geo_sphericalEqual(p0, p1)) {\n        listener.lineStart();\n        for (var i = 0; i < n; ++i) listener.point((p0 = segment[i])[0], p0[1]);\n        listener.lineEnd();\n        return;\n      }\n      var a = new d3_geo_clipPolygonIntersection(p0, segment, null, true), b = new d3_geo_clipPolygonIntersection(p0, null, a, false);\n      a.o = b;\n      subject.push(a);\n      clip.push(b);\n      a = new d3_geo_clipPolygonIntersection(p1, segment, null, false);\n      b = new d3_geo_clipPolygonIntersection(p1, null, a, true);\n      a.o = b;\n      subject.push(a);\n      clip.push(b);\n    });\n    clip.sort(compare);\n    d3_geo_clipPolygonLinkCircular(subject);\n    d3_geo_clipPolygonLinkCircular(clip);\n    if (!subject.length) return;\n    for (var i = 0, entry = clipStartInside, n = clip.length; i < n; ++i) {\n      clip[i].e = entry = !entry;\n    }\n    var start = subject[0], points, point;\n    while (1) {\n      var current = start, isSubject = true;\n      while (current.v) if ((current = current.n) === start) return;\n      points = current.z;\n      listener.lineStart();\n      do {\n        current.v = current.o.v = true;\n        if (current.e) {\n          if (isSubject) {\n            for (var i = 0, n = points.length; i < n; ++i) listener.point((point = points[i])[0], point[1]);\n          } else {\n            interpolate(current.x, current.n.x, 1, listener);\n          }\n          current = current.n;\n        } else {\n          if (isSubject) {\n            points = current.p.z;\n            for (var i = points.length - 1; i >= 0; --i) listener.point((point = points[i])[0], point[1]);\n          } else {\n            interpolate(current.x, current.p.x, -1, listener);\n          }\n          current = current.p;\n        }\n        current = current.o;\n        points = current.z;\n        isSubject = !isSubject;\n      } while (!current.v);\n      listener.lineEnd();\n    }\n  }\n  function d3_geo_clipPolygonLinkCircular(array) {\n    if (!(n = array.length)) return;\n    var n, i = 0, a = array[0], b;\n    while (++i < n) {\n      a.n = b = array[i];\n      b.p = a;\n      a = b;\n    }\n    a.n = b = array[0];\n    b.p = a;\n  }\n  function d3_geo_clipPolygonIntersection(point, points, other, entry) {\n    this.x = point;\n    this.z = points;\n    this.o = other;\n    this.e = entry;\n    this.v = false;\n    this.n = this.p = null;\n  }\n  function d3_geo_clip(pointVisible, clipLine, interpolate, clipStart) {\n    return function(rotate, listener) {\n      var line = clipLine(listener), rotatedClipStart = rotate.invert(clipStart[0], clipStart[1]);\n      var clip = {\n        point: point,\n        lineStart: lineStart,\n        lineEnd: lineEnd,\n        polygonStart: function() {\n          clip.point = pointRing;\n          clip.lineStart = ringStart;\n          clip.lineEnd = ringEnd;\n          segments = [];\n          polygon = [];\n        },\n        polygonEnd: function() {\n          clip.point = point;\n          clip.lineStart = lineStart;\n          clip.lineEnd = lineEnd;\n          segments = d3.merge(segments);\n          var clipStartInside = d3_geo_pointInPolygon(rotatedClipStart, polygon);\n          if (segments.length) {\n            if (!polygonStarted) listener.polygonStart(), polygonStarted = true;\n            d3_geo_clipPolygon(segments, d3_geo_clipSort, clipStartInside, interpolate, listener);\n          } else if (clipStartInside) {\n            if (!polygonStarted) listener.polygonStart(), polygonStarted = true;\n            listener.lineStart();\n            interpolate(null, null, 1, listener);\n            listener.lineEnd();\n          }\n          if (polygonStarted) listener.polygonEnd(), polygonStarted = false;\n          segments = polygon = null;\n        },\n        sphere: function() {\n          listener.polygonStart();\n          listener.lineStart();\n          interpolate(null, null, 1, listener);\n          listener.lineEnd();\n          listener.polygonEnd();\n        }\n      };\n      function point(λ, φ) {\n        var point = rotate(λ, φ);\n        if (pointVisible(λ = point[0], φ = point[1])) listener.point(λ, φ);\n      }\n      function pointLine(λ, φ) {\n        var point = rotate(λ, φ);\n        line.point(point[0], point[1]);\n      }\n      function lineStart() {\n        clip.point = pointLine;\n        line.lineStart();\n      }\n      function lineEnd() {\n        clip.point = point;\n        line.lineEnd();\n      }\n      var segments;\n      var buffer = d3_geo_clipBufferListener(), ringListener = clipLine(buffer), polygonStarted = false, polygon, ring;\n      function pointRing(λ, φ) {\n        ring.push([ λ, φ ]);\n        var point = rotate(λ, φ);\n        ringListener.point(point[0], point[1]);\n      }\n      function ringStart() {\n        ringListener.lineStart();\n        ring = [];\n      }\n      function ringEnd() {\n        pointRing(ring[0][0], ring[0][1]);\n        ringListener.lineEnd();\n        var clean = ringListener.clean(), ringSegments = buffer.buffer(), segment, n = ringSegments.length;\n        ring.pop();\n        polygon.push(ring);\n        ring = null;\n        if (!n) return;\n        if (clean & 1) {\n          segment = ringSegments[0];\n          var n = segment.length - 1, i = -1, point;\n          if (n > 0) {\n            if (!polygonStarted) listener.polygonStart(), polygonStarted = true;\n            listener.lineStart();\n            while (++i < n) listener.point((point = segment[i])[0], point[1]);\n            listener.lineEnd();\n          }\n          return;\n        }\n        if (n > 1 && clean & 2) ringSegments.push(ringSegments.pop().concat(ringSegments.shift()));\n        segments.push(ringSegments.filter(d3_geo_clipSegmentLength1));\n      }\n      return clip;\n    };\n  }\n  function d3_geo_clipSegmentLength1(segment) {\n    return segment.length > 1;\n  }\n  function d3_geo_clipBufferListener() {\n    var lines = [], line;\n    return {\n      lineStart: function() {\n        lines.push(line = []);\n      },\n      point: function(λ, φ) {\n        line.push([ λ, φ ]);\n      },\n      lineEnd: d3_noop,\n      buffer: function() {\n        var buffer = lines;\n        lines = [];\n        line = null;\n        return buffer;\n      },\n      rejoin: function() {\n        if (lines.length > 1) lines.push(lines.pop().concat(lines.shift()));\n      }\n    };\n  }\n  function d3_geo_clipSort(a, b) {\n    return ((a = a.x)[0] < 0 ? a[1] - halfπ - ε : halfπ - a[1]) - ((b = b.x)[0] < 0 ? b[1] - halfπ - ε : halfπ - b[1]);\n  }\n  var d3_geo_clipAntimeridian = d3_geo_clip(d3_true, d3_geo_clipAntimeridianLine, d3_geo_clipAntimeridianInterpolate, [ -π, -π / 2 ]);\n  function d3_geo_clipAntimeridianLine(listener) {\n    var λ0 = NaN, φ0 = NaN, sλ0 = NaN, clean;\n    return {\n      lineStart: function() {\n        listener.lineStart();\n        clean = 1;\n      },\n      point: function(λ1, φ1) {\n        var sλ1 = λ1 > 0 ? π : -π, dλ = abs(λ1 - λ0);\n        if (abs(dλ - π) < ε) {\n          listener.point(λ0, φ0 = (φ0 + φ1) / 2 > 0 ? halfπ : -halfπ);\n          listener.point(sλ0, φ0);\n          listener.lineEnd();\n          listener.lineStart();\n          listener.point(sλ1, φ0);\n          listener.point(λ1, φ0);\n          clean = 0;\n        } else if (sλ0 !== sλ1 && dλ >= π) {\n          if (abs(λ0 - sλ0) < ε) λ0 -= sλ0 * ε;\n          if (abs(λ1 - sλ1) < ε) λ1 -= sλ1 * ε;\n          φ0 = d3_geo_clipAntimeridianIntersect(λ0, φ0, λ1, φ1);\n          listener.point(sλ0, φ0);\n          listener.lineEnd();\n          listener.lineStart();\n          listener.point(sλ1, φ0);\n          clean = 0;\n        }\n        listener.point(λ0 = λ1, φ0 = φ1);\n        sλ0 = sλ1;\n      },\n      lineEnd: function() {\n        listener.lineEnd();\n        λ0 = φ0 = NaN;\n      },\n      clean: function() {\n        return 2 - clean;\n      }\n    };\n  }\n  function d3_geo_clipAntimeridianIntersect(λ0, φ0, λ1, φ1) {\n    var cosφ0, cosφ1, sinλ0_λ1 = Math.sin(λ0 - λ1);\n    return abs(sinλ0_λ1) > ε ? Math.atan((Math.sin(φ0) * (cosφ1 = Math.cos(φ1)) * Math.sin(λ1) - Math.sin(φ1) * (cosφ0 = Math.cos(φ0)) * Math.sin(λ0)) / (cosφ0 * cosφ1 * sinλ0_λ1)) : (φ0 + φ1) / 2;\n  }\n  function d3_geo_clipAntimeridianInterpolate(from, to, direction, listener) {\n    var φ;\n    if (from == null) {\n      φ = direction * halfπ;\n      listener.point(-π, φ);\n      listener.point(0, φ);\n      listener.point(π, φ);\n      listener.point(π, 0);\n      listener.point(π, -φ);\n      listener.point(0, -φ);\n      listener.point(-π, -φ);\n      listener.point(-π, 0);\n      listener.point(-π, φ);\n    } else if (abs(from[0] - to[0]) > ε) {\n      var s = from[0] < to[0] ? π : -π;\n      φ = direction * s / 2;\n      listener.point(-s, φ);\n      listener.point(0, φ);\n      listener.point(s, φ);\n    } else {\n      listener.point(to[0], to[1]);\n    }\n  }\n  function d3_geo_pointInPolygon(point, polygon) {\n    var meridian = point[0], parallel = point[1], meridianNormal = [ Math.sin(meridian), -Math.cos(meridian), 0 ], polarAngle = 0, winding = 0;\n    d3_geo_areaRingSum.reset();\n    for (var i = 0, n = polygon.length; i < n; ++i) {\n      var ring = polygon[i], m = ring.length;\n      if (!m) continue;\n      var point0 = ring[0], λ0 = point0[0], φ0 = point0[1] / 2 + π / 4, sinφ0 = Math.sin(φ0), cosφ0 = Math.cos(φ0), j = 1;\n      while (true) {\n        if (j === m) j = 0;\n        point = ring[j];\n        var λ = point[0], φ = point[1] / 2 + π / 4, sinφ = Math.sin(φ), cosφ = Math.cos(φ), dλ = λ - λ0, sdλ = dλ >= 0 ? 1 : -1, adλ = sdλ * dλ, antimeridian = adλ > π, k = sinφ0 * sinφ;\n        d3_geo_areaRingSum.add(Math.atan2(k * sdλ * Math.sin(adλ), cosφ0 * cosφ + k * Math.cos(adλ)));\n        polarAngle += antimeridian ? dλ + sdλ * τ : dλ;\n        if (antimeridian ^ λ0 >= meridian ^ λ >= meridian) {\n          var arc = d3_geo_cartesianCross(d3_geo_cartesian(point0), d3_geo_cartesian(point));\n          d3_geo_cartesianNormalize(arc);\n          var intersection = d3_geo_cartesianCross(meridianNormal, arc);\n          d3_geo_cartesianNormalize(intersection);\n          var φarc = (antimeridian ^ dλ >= 0 ? -1 : 1) * d3_asin(intersection[2]);\n          if (parallel > φarc || parallel === φarc && (arc[0] || arc[1])) {\n            winding += antimeridian ^ dλ >= 0 ? 1 : -1;\n          }\n        }\n        if (!j++) break;\n        λ0 = λ, sinφ0 = sinφ, cosφ0 = cosφ, point0 = point;\n      }\n    }\n    return (polarAngle < -ε || polarAngle < ε && d3_geo_areaRingSum < -ε) ^ winding & 1;\n  }\n  function d3_geo_clipCircle(radius) {\n    var cr = Math.cos(radius), smallRadius = cr > 0, notHemisphere = abs(cr) > ε, interpolate = d3_geo_circleInterpolate(radius, 6 * d3_radians);\n    return d3_geo_clip(visible, clipLine, interpolate, smallRadius ? [ 0, -radius ] : [ -π, radius - π ]);\n    function visible(λ, φ) {\n      return Math.cos(λ) * Math.cos(φ) > cr;\n    }\n    function clipLine(listener) {\n      var point0, c0, v0, v00, clean;\n      return {\n        lineStart: function() {\n          v00 = v0 = false;\n          clean = 1;\n        },\n        point: function(λ, φ) {\n          var point1 = [ λ, φ ], point2, v = visible(λ, φ), c = smallRadius ? v ? 0 : code(λ, φ) : v ? code(λ + (λ < 0 ? π : -π), φ) : 0;\n          if (!point0 && (v00 = v0 = v)) listener.lineStart();\n          if (v !== v0) {\n            point2 = intersect(point0, point1);\n            if (d3_geo_sphericalEqual(point0, point2) || d3_geo_sphericalEqual(point1, point2)) {\n              point1[0] += ε;\n              point1[1] += ε;\n              v = visible(point1[0], point1[1]);\n            }\n          }\n          if (v !== v0) {\n            clean = 0;\n            if (v) {\n              listener.lineStart();\n              point2 = intersect(point1, point0);\n              listener.point(point2[0], point2[1]);\n            } else {\n              point2 = intersect(point0, point1);\n              listener.point(point2[0], point2[1]);\n              listener.lineEnd();\n            }\n            point0 = point2;\n          } else if (notHemisphere && point0 && smallRadius ^ v) {\n            var t;\n            if (!(c & c0) && (t = intersect(point1, point0, true))) {\n              clean = 0;\n              if (smallRadius) {\n                listener.lineStart();\n                listener.point(t[0][0], t[0][1]);\n                listener.point(t[1][0], t[1][1]);\n                listener.lineEnd();\n              } else {\n                listener.point(t[1][0], t[1][1]);\n                listener.lineEnd();\n                listener.lineStart();\n                listener.point(t[0][0], t[0][1]);\n              }\n            }\n          }\n          if (v && (!point0 || !d3_geo_sphericalEqual(point0, point1))) {\n            listener.point(point1[0], point1[1]);\n          }\n          point0 = point1, v0 = v, c0 = c;\n        },\n        lineEnd: function() {\n          if (v0) listener.lineEnd();\n          point0 = null;\n        },\n        clean: function() {\n          return clean | (v00 && v0) << 1;\n        }\n      };\n    }\n    function intersect(a, b, two) {\n      var pa = d3_geo_cartesian(a), pb = d3_geo_cartesian(b);\n      var n1 = [ 1, 0, 0 ], n2 = d3_geo_cartesianCross(pa, pb), n2n2 = d3_geo_cartesianDot(n2, n2), n1n2 = n2[0], determinant = n2n2 - n1n2 * n1n2;\n      if (!determinant) return !two && a;\n      var c1 = cr * n2n2 / determinant, c2 = -cr * n1n2 / determinant, n1xn2 = d3_geo_cartesianCross(n1, n2), A = d3_geo_cartesianScale(n1, c1), B = d3_geo_cartesianScale(n2, c2);\n      d3_geo_cartesianAdd(A, B);\n      var u = n1xn2, w = d3_geo_cartesianDot(A, u), uu = d3_geo_cartesianDot(u, u), t2 = w * w - uu * (d3_geo_cartesianDot(A, A) - 1);\n      if (t2 < 0) return;\n      var t = Math.sqrt(t2), q = d3_geo_cartesianScale(u, (-w - t) / uu);\n      d3_geo_cartesianAdd(q, A);\n      q = d3_geo_spherical(q);\n      if (!two) return q;\n      var λ0 = a[0], λ1 = b[0], φ0 = a[1], φ1 = b[1], z;\n      if (λ1 < λ0) z = λ0, λ0 = λ1, λ1 = z;\n      var δλ = λ1 - λ0, polar = abs(δλ - π) < ε, meridian = polar || δλ < ε;\n      if (!polar && φ1 < φ0) z = φ0, φ0 = φ1, φ1 = z;\n      if (meridian ? polar ? φ0 + φ1 > 0 ^ q[1] < (abs(q[0] - λ0) < ε ? φ0 : φ1) : φ0 <= q[1] && q[1] <= φ1 : δλ > π ^ (λ0 <= q[0] && q[0] <= λ1)) {\n        var q1 = d3_geo_cartesianScale(u, (-w + t) / uu);\n        d3_geo_cartesianAdd(q1, A);\n        return [ q, d3_geo_spherical(q1) ];\n      }\n    }\n    function code(λ, φ) {\n      var r = smallRadius ? radius : π - radius, code = 0;\n      if (λ < -r) code |= 1; else if (λ > r) code |= 2;\n      if (φ < -r) code |= 4; else if (φ > r) code |= 8;\n      return code;\n    }\n  }\n  function d3_geom_clipLine(x0, y0, x1, y1) {\n    return function(line) {\n      var a = line.a, b = line.b, ax = a.x, ay = a.y, bx = b.x, by = b.y, t0 = 0, t1 = 1, dx = bx - ax, dy = by - ay, r;\n      r = x0 - ax;\n      if (!dx && r > 0) return;\n      r /= dx;\n      if (dx < 0) {\n        if (r < t0) return;\n        if (r < t1) t1 = r;\n      } else if (dx > 0) {\n        if (r > t1) return;\n        if (r > t0) t0 = r;\n      }\n      r = x1 - ax;\n      if (!dx && r < 0) return;\n      r /= dx;\n      if (dx < 0) {\n        if (r > t1) return;\n        if (r > t0) t0 = r;\n      } else if (dx > 0) {\n        if (r < t0) return;\n        if (r < t1) t1 = r;\n      }\n      r = y0 - ay;\n      if (!dy && r > 0) return;\n      r /= dy;\n      if (dy < 0) {\n        if (r < t0) return;\n        if (r < t1) t1 = r;\n      } else if (dy > 0) {\n        if (r > t1) return;\n        if (r > t0) t0 = r;\n      }\n      r = y1 - ay;\n      if (!dy && r < 0) return;\n      r /= dy;\n      if (dy < 0) {\n        if (r > t1) return;\n        if (r > t0) t0 = r;\n      } else if (dy > 0) {\n        if (r < t0) return;\n        if (r < t1) t1 = r;\n      }\n      if (t0 > 0) line.a = {\n        x: ax + t0 * dx,\n        y: ay + t0 * dy\n      };\n      if (t1 < 1) line.b = {\n        x: ax + t1 * dx,\n        y: ay + t1 * dy\n      };\n      return line;\n    };\n  }\n  var d3_geo_clipExtentMAX = 1e9;\n  d3.geo.clipExtent = function() {\n    var x0, y0, x1, y1, stream, clip, clipExtent = {\n      stream: function(output) {\n        if (stream) stream.valid = false;\n        stream = clip(output);\n        stream.valid = true;\n        return stream;\n      },\n      extent: function(_) {\n        if (!arguments.length) return [ [ x0, y0 ], [ x1, y1 ] ];\n        clip = d3_geo_clipExtent(x0 = +_[0][0], y0 = +_[0][1], x1 = +_[1][0], y1 = +_[1][1]);\n        if (stream) stream.valid = false, stream = null;\n        return clipExtent;\n      }\n    };\n    return clipExtent.extent([ [ 0, 0 ], [ 960, 500 ] ]);\n  };\n  function d3_geo_clipExtent(x0, y0, x1, y1) {\n    return function(listener) {\n      var listener_ = listener, bufferListener = d3_geo_clipBufferListener(), clipLine = d3_geom_clipLine(x0, y0, x1, y1), segments, polygon, ring;\n      var clip = {\n        point: point,\n        lineStart: lineStart,\n        lineEnd: lineEnd,\n        polygonStart: function() {\n          listener = bufferListener;\n          segments = [];\n          polygon = [];\n          clean = true;\n        },\n        polygonEnd: function() {\n          listener = listener_;\n          segments = d3.merge(segments);\n          var clipStartInside = insidePolygon([ x0, y1 ]), inside = clean && clipStartInside, visible = segments.length;\n          if (inside || visible) {\n            listener.polygonStart();\n            if (inside) {\n              listener.lineStart();\n              interpolate(null, null, 1, listener);\n              listener.lineEnd();\n            }\n            if (visible) {\n              d3_geo_clipPolygon(segments, compare, clipStartInside, interpolate, listener);\n            }\n            listener.polygonEnd();\n          }\n          segments = polygon = ring = null;\n        }\n      };\n      function insidePolygon(p) {\n        var wn = 0, n = polygon.length, y = p[1];\n        for (var i = 0; i < n; ++i) {\n          for (var j = 1, v = polygon[i], m = v.length, a = v[0], b; j < m; ++j) {\n            b = v[j];\n            if (a[1] <= y) {\n              if (b[1] > y && d3_cross2d(a, b, p) > 0) ++wn;\n            } else {\n              if (b[1] <= y && d3_cross2d(a, b, p) < 0) --wn;\n            }\n            a = b;\n          }\n        }\n        return wn !== 0;\n      }\n      function interpolate(from, to, direction, listener) {\n        var a = 0, a1 = 0;\n        if (from == null || (a = corner(from, direction)) !== (a1 = corner(to, direction)) || comparePoints(from, to) < 0 ^ direction > 0) {\n          do {\n            listener.point(a === 0 || a === 3 ? x0 : x1, a > 1 ? y1 : y0);\n          } while ((a = (a + direction + 4) % 4) !== a1);\n        } else {\n          listener.point(to[0], to[1]);\n        }\n      }\n      function pointVisible(x, y) {\n        return x0 <= x && x <= x1 && y0 <= y && y <= y1;\n      }\n      function point(x, y) {\n        if (pointVisible(x, y)) listener.point(x, y);\n      }\n      var x__, y__, v__, x_, y_, v_, first, clean;\n      function lineStart() {\n        clip.point = linePoint;\n        if (polygon) polygon.push(ring = []);\n        first = true;\n        v_ = false;\n        x_ = y_ = NaN;\n      }\n      function lineEnd() {\n        if (segments) {\n          linePoint(x__, y__);\n          if (v__ && v_) bufferListener.rejoin();\n          segments.push(bufferListener.buffer());\n        }\n        clip.point = point;\n        if (v_) listener.lineEnd();\n      }\n      function linePoint(x, y) {\n        x = Math.max(-d3_geo_clipExtentMAX, Math.min(d3_geo_clipExtentMAX, x));\n        y = Math.max(-d3_geo_clipExtentMAX, Math.min(d3_geo_clipExtentMAX, y));\n        var v = pointVisible(x, y);\n        if (polygon) ring.push([ x, y ]);\n        if (first) {\n          x__ = x, y__ = y, v__ = v;\n          first = false;\n          if (v) {\n            listener.lineStart();\n            listener.point(x, y);\n          }\n        } else {\n          if (v && v_) listener.point(x, y); else {\n            var l = {\n              a: {\n                x: x_,\n                y: y_\n              },\n              b: {\n                x: x,\n                y: y\n              }\n            };\n            if (clipLine(l)) {\n              if (!v_) {\n                listener.lineStart();\n                listener.point(l.a.x, l.a.y);\n              }\n              listener.point(l.b.x, l.b.y);\n              if (!v) listener.lineEnd();\n              clean = false;\n            } else if (v) {\n              listener.lineStart();\n              listener.point(x, y);\n              clean = false;\n            }\n          }\n        }\n        x_ = x, y_ = y, v_ = v;\n      }\n      return clip;\n    };\n    function corner(p, direction) {\n      return abs(p[0] - x0) < ε ? direction > 0 ? 0 : 3 : abs(p[0] - x1) < ε ? direction > 0 ? 2 : 1 : abs(p[1] - y0) < ε ? direction > 0 ? 1 : 0 : direction > 0 ? 3 : 2;\n    }\n    function compare(a, b) {\n      return comparePoints(a.x, b.x);\n    }\n    function comparePoints(a, b) {\n      var ca = corner(a, 1), cb = corner(b, 1);\n      return ca !== cb ? ca - cb : ca === 0 ? b[1] - a[1] : ca === 1 ? a[0] - b[0] : ca === 2 ? a[1] - b[1] : b[0] - a[0];\n    }\n  }\n  function d3_geo_conic(projectAt) {\n    var φ0 = 0, φ1 = π / 3, m = d3_geo_projectionMutator(projectAt), p = m(φ0, φ1);\n    p.parallels = function(_) {\n      if (!arguments.length) return [ φ0 / π * 180, φ1 / π * 180 ];\n      return m(φ0 = _[0] * π / 180, φ1 = _[1] * π / 180);\n    };\n    return p;\n  }\n  function d3_geo_conicEqualArea(φ0, φ1) {\n    var sinφ0 = Math.sin(φ0), n = (sinφ0 + Math.sin(φ1)) / 2, C = 1 + sinφ0 * (2 * n - sinφ0), ρ0 = Math.sqrt(C) / n;\n    function forward(λ, φ) {\n      var ρ = Math.sqrt(C - 2 * n * Math.sin(φ)) / n;\n      return [ ρ * Math.sin(λ *= n), ρ0 - ρ * Math.cos(λ) ];\n    }\n    forward.invert = function(x, y) {\n      var ρ0_y = ρ0 - y;\n      return [ Math.atan2(x, ρ0_y) / n, d3_asin((C - (x * x + ρ0_y * ρ0_y) * n * n) / (2 * n)) ];\n    };\n    return forward;\n  }\n  (d3.geo.conicEqualArea = function() {\n    return d3_geo_conic(d3_geo_conicEqualArea);\n  }).raw = d3_geo_conicEqualArea;\n  d3.geo.albers = function() {\n    return d3.geo.conicEqualArea().rotate([ 96, 0 ]).center([ -.6, 38.7 ]).parallels([ 29.5, 45.5 ]).scale(1070);\n  };\n  d3.geo.albersUsa = function() {\n    var lower48 = d3.geo.albers();\n    var alaska = d3.geo.conicEqualArea().rotate([ 154, 0 ]).center([ -2, 58.5 ]).parallels([ 55, 65 ]);\n    var hawaii = d3.geo.conicEqualArea().rotate([ 157, 0 ]).center([ -3, 19.9 ]).parallels([ 8, 18 ]);\n    var point, pointStream = {\n      point: function(x, y) {\n        point = [ x, y ];\n      }\n    }, lower48Point, alaskaPoint, hawaiiPoint;\n    function albersUsa(coordinates) {\n      var x = coordinates[0], y = coordinates[1];\n      point = null;\n      (lower48Point(x, y), point) || (alaskaPoint(x, y), point) || hawaiiPoint(x, y);\n      return point;\n    }\n    albersUsa.invert = function(coordinates) {\n      var k = lower48.scale(), t = lower48.translate(), x = (coordinates[0] - t[0]) / k, y = (coordinates[1] - t[1]) / k;\n      return (y >= .12 && y < .234 && x >= -.425 && x < -.214 ? alaska : y >= .166 && y < .234 && x >= -.214 && x < -.115 ? hawaii : lower48).invert(coordinates);\n    };\n    albersUsa.stream = function(stream) {\n      var lower48Stream = lower48.stream(stream), alaskaStream = alaska.stream(stream), hawaiiStream = hawaii.stream(stream);\n      return {\n        point: function(x, y) {\n          lower48Stream.point(x, y);\n          alaskaStream.point(x, y);\n          hawaiiStream.point(x, y);\n        },\n        sphere: function() {\n          lower48Stream.sphere();\n          alaskaStream.sphere();\n          hawaiiStream.sphere();\n        },\n        lineStart: function() {\n          lower48Stream.lineStart();\n          alaskaStream.lineStart();\n          hawaiiStream.lineStart();\n        },\n        lineEnd: function() {\n          lower48Stream.lineEnd();\n          alaskaStream.lineEnd();\n          hawaiiStream.lineEnd();\n        },\n        polygonStart: function() {\n          lower48Stream.polygonStart();\n          alaskaStream.polygonStart();\n          hawaiiStream.polygonStart();\n        },\n        polygonEnd: function() {\n          lower48Stream.polygonEnd();\n          alaskaStream.polygonEnd();\n          hawaiiStream.polygonEnd();\n        }\n      };\n    };\n    albersUsa.precision = function(_) {\n      if (!arguments.length) return lower48.precision();\n      lower48.precision(_);\n      alaska.precision(_);\n      hawaii.precision(_);\n      return albersUsa;\n    };\n    albersUsa.scale = function(_) {\n      if (!arguments.length) return lower48.scale();\n      lower48.scale(_);\n      alaska.scale(_ * .35);\n      hawaii.scale(_);\n      return albersUsa.translate(lower48.translate());\n    };\n    albersUsa.translate = function(_) {\n      if (!arguments.length) return lower48.translate();\n      var k = lower48.scale(), x = +_[0], y = +_[1];\n      lower48Point = lower48.translate(_).clipExtent([ [ x - .455 * k, y - .238 * k ], [ x + .455 * k, y + .238 * k ] ]).stream(pointStream).point;\n      alaskaPoint = alaska.translate([ x - .307 * k, y + .201 * k ]).clipExtent([ [ x - .425 * k + ε, y + .12 * k + ε ], [ x - .214 * k - ε, y + .234 * k - ε ] ]).stream(pointStream).point;\n      hawaiiPoint = hawaii.translate([ x - .205 * k, y + .212 * k ]).clipExtent([ [ x - .214 * k + ε, y + .166 * k + ε ], [ x - .115 * k - ε, y + .234 * k - ε ] ]).stream(pointStream).point;\n      return albersUsa;\n    };\n    return albersUsa.scale(1070);\n  };\n  var d3_geo_pathAreaSum, d3_geo_pathAreaPolygon, d3_geo_pathArea = {\n    point: d3_noop,\n    lineStart: d3_noop,\n    lineEnd: d3_noop,\n    polygonStart: function() {\n      d3_geo_pathAreaPolygon = 0;\n      d3_geo_pathArea.lineStart = d3_geo_pathAreaRingStart;\n    },\n    polygonEnd: function() {\n      d3_geo_pathArea.lineStart = d3_geo_pathArea.lineEnd = d3_geo_pathArea.point = d3_noop;\n      d3_geo_pathAreaSum += abs(d3_geo_pathAreaPolygon / 2);\n    }\n  };\n  function d3_geo_pathAreaRingStart() {\n    var x00, y00, x0, y0;\n    d3_geo_pathArea.point = function(x, y) {\n      d3_geo_pathArea.point = nextPoint;\n      x00 = x0 = x, y00 = y0 = y;\n    };\n    function nextPoint(x, y) {\n      d3_geo_pathAreaPolygon += y0 * x - x0 * y;\n      x0 = x, y0 = y;\n    }\n    d3_geo_pathArea.lineEnd = function() {\n      nextPoint(x00, y00);\n    };\n  }\n  var d3_geo_pathBoundsX0, d3_geo_pathBoundsY0, d3_geo_pathBoundsX1, d3_geo_pathBoundsY1;\n  var d3_geo_pathBounds = {\n    point: d3_geo_pathBoundsPoint,\n    lineStart: d3_noop,\n    lineEnd: d3_noop,\n    polygonStart: d3_noop,\n    polygonEnd: d3_noop\n  };\n  function d3_geo_pathBoundsPoint(x, y) {\n    if (x < d3_geo_pathBoundsX0) d3_geo_pathBoundsX0 = x;\n    if (x > d3_geo_pathBoundsX1) d3_geo_pathBoundsX1 = x;\n    if (y < d3_geo_pathBoundsY0) d3_geo_pathBoundsY0 = y;\n    if (y > d3_geo_pathBoundsY1) d3_geo_pathBoundsY1 = y;\n  }\n  function d3_geo_pathBuffer() {\n    var pointCircle = d3_geo_pathBufferCircle(4.5), buffer = [];\n    var stream = {\n      point: point,\n      lineStart: function() {\n        stream.point = pointLineStart;\n      },\n      lineEnd: lineEnd,\n      polygonStart: function() {\n        stream.lineEnd = lineEndPolygon;\n      },\n      polygonEnd: function() {\n        stream.lineEnd = lineEnd;\n        stream.point = point;\n      },\n      pointRadius: function(_) {\n        pointCircle = d3_geo_pathBufferCircle(_);\n        return stream;\n      },\n      result: function() {\n        if (buffer.length) {\n          var result = buffer.join(\"\");\n          buffer = [];\n          return result;\n        }\n      }\n    };\n    function point(x, y) {\n      buffer.push(\"M\", x, \",\", y, pointCircle);\n    }\n    function pointLineStart(x, y) {\n      buffer.push(\"M\", x, \",\", y);\n      stream.point = pointLine;\n    }\n    function pointLine(x, y) {\n      buffer.push(\"L\", x, \",\", y);\n    }\n    function lineEnd() {\n      stream.point = point;\n    }\n    function lineEndPolygon() {\n      buffer.push(\"Z\");\n    }\n    return stream;\n  }\n  function d3_geo_pathBufferCircle(radius) {\n    return \"m0,\" + radius + \"a\" + radius + \",\" + radius + \" 0 1,1 0,\" + -2 * radius + \"a\" + radius + \",\" + radius + \" 0 1,1 0,\" + 2 * radius + \"z\";\n  }\n  var d3_geo_pathCentroid = {\n    point: d3_geo_pathCentroidPoint,\n    lineStart: d3_geo_pathCentroidLineStart,\n    lineEnd: d3_geo_pathCentroidLineEnd,\n    polygonStart: function() {\n      d3_geo_pathCentroid.lineStart = d3_geo_pathCentroidRingStart;\n    },\n    polygonEnd: function() {\n      d3_geo_pathCentroid.point = d3_geo_pathCentroidPoint;\n      d3_geo_pathCentroid.lineStart = d3_geo_pathCentroidLineStart;\n      d3_geo_pathCentroid.lineEnd = d3_geo_pathCentroidLineEnd;\n    }\n  };\n  function d3_geo_pathCentroidPoint(x, y) {\n    d3_geo_centroidX0 += x;\n    d3_geo_centroidY0 += y;\n    ++d3_geo_centroidZ0;\n  }\n  function d3_geo_pathCentroidLineStart() {\n    var x0, y0;\n    d3_geo_pathCentroid.point = function(x, y) {\n      d3_geo_pathCentroid.point = nextPoint;\n      d3_geo_pathCentroidPoint(x0 = x, y0 = y);\n    };\n    function nextPoint(x, y) {\n      var dx = x - x0, dy = y - y0, z = Math.sqrt(dx * dx + dy * dy);\n      d3_geo_centroidX1 += z * (x0 + x) / 2;\n      d3_geo_centroidY1 += z * (y0 + y) / 2;\n      d3_geo_centroidZ1 += z;\n      d3_geo_pathCentroidPoint(x0 = x, y0 = y);\n    }\n  }\n  function d3_geo_pathCentroidLineEnd() {\n    d3_geo_pathCentroid.point = d3_geo_pathCentroidPoint;\n  }\n  function d3_geo_pathCentroidRingStart() {\n    var x00, y00, x0, y0;\n    d3_geo_pathCentroid.point = function(x, y) {\n      d3_geo_pathCentroid.point = nextPoint;\n      d3_geo_pathCentroidPoint(x00 = x0 = x, y00 = y0 = y);\n    };\n    function nextPoint(x, y) {\n      var dx = x - x0, dy = y - y0, z = Math.sqrt(dx * dx + dy * dy);\n      d3_geo_centroidX1 += z * (x0 + x) / 2;\n      d3_geo_centroidY1 += z * (y0 + y) / 2;\n      d3_geo_centroidZ1 += z;\n      z = y0 * x - x0 * y;\n      d3_geo_centroidX2 += z * (x0 + x);\n      d3_geo_centroidY2 += z * (y0 + y);\n      d3_geo_centroidZ2 += z * 3;\n      d3_geo_pathCentroidPoint(x0 = x, y0 = y);\n    }\n    d3_geo_pathCentroid.lineEnd = function() {\n      nextPoint(x00, y00);\n    };\n  }\n  function d3_geo_pathContext(context) {\n    var pointRadius = 4.5;\n    var stream = {\n      point: point,\n      lineStart: function() {\n        stream.point = pointLineStart;\n      },\n      lineEnd: lineEnd,\n      polygonStart: function() {\n        stream.lineEnd = lineEndPolygon;\n      },\n      polygonEnd: function() {\n        stream.lineEnd = lineEnd;\n        stream.point = point;\n      },\n      pointRadius: function(_) {\n        pointRadius = _;\n        return stream;\n      },\n      result: d3_noop\n    };\n    function point(x, y) {\n      context.moveTo(x + pointRadius, y);\n      context.arc(x, y, pointRadius, 0, τ);\n    }\n    function pointLineStart(x, y) {\n      context.moveTo(x, y);\n      stream.point = pointLine;\n    }\n    function pointLine(x, y) {\n      context.lineTo(x, y);\n    }\n    function lineEnd() {\n      stream.point = point;\n    }\n    function lineEndPolygon() {\n      context.closePath();\n    }\n    return stream;\n  }\n  function d3_geo_resample(project) {\n    var δ2 = .5, cosMinDistance = Math.cos(30 * d3_radians), maxDepth = 16;\n    function resample(stream) {\n      return (maxDepth ? resampleRecursive : resampleNone)(stream);\n    }\n    function resampleNone(stream) {\n      return d3_geo_transformPoint(stream, function(x, y) {\n        x = project(x, y);\n        stream.point(x[0], x[1]);\n      });\n    }\n    function resampleRecursive(stream) {\n      var λ00, φ00, x00, y00, a00, b00, c00, λ0, x0, y0, a0, b0, c0;\n      var resample = {\n        point: point,\n        lineStart: lineStart,\n        lineEnd: lineEnd,\n        polygonStart: function() {\n          stream.polygonStart();\n          resample.lineStart = ringStart;\n        },\n        polygonEnd: function() {\n          stream.polygonEnd();\n          resample.lineStart = lineStart;\n        }\n      };\n      function point(x, y) {\n        x = project(x, y);\n        stream.point(x[0], x[1]);\n      }\n      function lineStart() {\n        x0 = NaN;\n        resample.point = linePoint;\n        stream.lineStart();\n      }\n      function linePoint(λ, φ) {\n        var c = d3_geo_cartesian([ λ, φ ]), p = project(λ, φ);\n        resampleLineTo(x0, y0, λ0, a0, b0, c0, x0 = p[0], y0 = p[1], λ0 = λ, a0 = c[0], b0 = c[1], c0 = c[2], maxDepth, stream);\n        stream.point(x0, y0);\n      }\n      function lineEnd() {\n        resample.point = point;\n        stream.lineEnd();\n      }\n      function ringStart() {\n        lineStart();\n        resample.point = ringPoint;\n        resample.lineEnd = ringEnd;\n      }\n      function ringPoint(λ, φ) {\n        linePoint(λ00 = λ, φ00 = φ), x00 = x0, y00 = y0, a00 = a0, b00 = b0, c00 = c0;\n        resample.point = linePoint;\n      }\n      function ringEnd() {\n        resampleLineTo(x0, y0, λ0, a0, b0, c0, x00, y00, λ00, a00, b00, c00, maxDepth, stream);\n        resample.lineEnd = lineEnd;\n        lineEnd();\n      }\n      return resample;\n    }\n    function resampleLineTo(x0, y0, λ0, a0, b0, c0, x1, y1, λ1, a1, b1, c1, depth, stream) {\n      var dx = x1 - x0, dy = y1 - y0, d2 = dx * dx + dy * dy;\n      if (d2 > 4 * δ2 && depth--) {\n        var a = a0 + a1, b = b0 + b1, c = c0 + c1, m = Math.sqrt(a * a + b * b + c * c), φ2 = Math.asin(c /= m), λ2 = abs(abs(c) - 1) < ε || abs(λ0 - λ1) < ε ? (λ0 + λ1) / 2 : Math.atan2(b, a), p = project(λ2, φ2), x2 = p[0], y2 = p[1], dx2 = x2 - x0, dy2 = y2 - y0, dz = dy * dx2 - dx * dy2;\n        if (dz * dz / d2 > δ2 || abs((dx * dx2 + dy * dy2) / d2 - .5) > .3 || a0 * a1 + b0 * b1 + c0 * c1 < cosMinDistance) {\n          resampleLineTo(x0, y0, λ0, a0, b0, c0, x2, y2, λ2, a /= m, b /= m, c, depth, stream);\n          stream.point(x2, y2);\n          resampleLineTo(x2, y2, λ2, a, b, c, x1, y1, λ1, a1, b1, c1, depth, stream);\n        }\n      }\n    }\n    resample.precision = function(_) {\n      if (!arguments.length) return Math.sqrt(δ2);\n      maxDepth = (δ2 = _ * _) > 0 && 16;\n      return resample;\n    };\n    return resample;\n  }\n  d3.geo.path = function() {\n    var pointRadius = 4.5, projection, context, projectStream, contextStream, cacheStream;\n    function path(object) {\n      if (object) {\n        if (typeof pointRadius === \"function\") contextStream.pointRadius(+pointRadius.apply(this, arguments));\n        if (!cacheStream || !cacheStream.valid) cacheStream = projectStream(contextStream);\n        d3.geo.stream(object, cacheStream);\n      }\n      return contextStream.result();\n    }\n    path.area = function(object) {\n      d3_geo_pathAreaSum = 0;\n      d3.geo.stream(object, projectStream(d3_geo_pathArea));\n      return d3_geo_pathAreaSum;\n    };\n    path.centroid = function(object) {\n      d3_geo_centroidX0 = d3_geo_centroidY0 = d3_geo_centroidZ0 = d3_geo_centroidX1 = d3_geo_centroidY1 = d3_geo_centroidZ1 = d3_geo_centroidX2 = d3_geo_centroidY2 = d3_geo_centroidZ2 = 0;\n      d3.geo.stream(object, projectStream(d3_geo_pathCentroid));\n      return d3_geo_centroidZ2 ? [ d3_geo_centroidX2 / d3_geo_centroidZ2, d3_geo_centroidY2 / d3_geo_centroidZ2 ] : d3_geo_centroidZ1 ? [ d3_geo_centroidX1 / d3_geo_centroidZ1, d3_geo_centroidY1 / d3_geo_centroidZ1 ] : d3_geo_centroidZ0 ? [ d3_geo_centroidX0 / d3_geo_centroidZ0, d3_geo_centroidY0 / d3_geo_centroidZ0 ] : [ NaN, NaN ];\n    };\n    path.bounds = function(object) {\n      d3_geo_pathBoundsX1 = d3_geo_pathBoundsY1 = -(d3_geo_pathBoundsX0 = d3_geo_pathBoundsY0 = Infinity);\n      d3.geo.stream(object, projectStream(d3_geo_pathBounds));\n      return [ [ d3_geo_pathBoundsX0, d3_geo_pathBoundsY0 ], [ d3_geo_pathBoundsX1, d3_geo_pathBoundsY1 ] ];\n    };\n    path.projection = function(_) {\n      if (!arguments.length) return projection;\n      projectStream = (projection = _) ? _.stream || d3_geo_pathProjectStream(_) : d3_identity;\n      return reset();\n    };\n    path.context = function(_) {\n      if (!arguments.length) return context;\n      contextStream = (context = _) == null ? new d3_geo_pathBuffer() : new d3_geo_pathContext(_);\n      if (typeof pointRadius !== \"function\") contextStream.pointRadius(pointRadius);\n      return reset();\n    };\n    path.pointRadius = function(_) {\n      if (!arguments.length) return pointRadius;\n      pointRadius = typeof _ === \"function\" ? _ : (contextStream.pointRadius(+_), +_);\n      return path;\n    };\n    function reset() {\n      cacheStream = null;\n      return path;\n    }\n    return path.projection(d3.geo.albersUsa()).context(null);\n  };\n  function d3_geo_pathProjectStream(project) {\n    var resample = d3_geo_resample(function(x, y) {\n      return project([ x * d3_degrees, y * d3_degrees ]);\n    });\n    return function(stream) {\n      return d3_geo_projectionRadians(resample(stream));\n    };\n  }\n  d3.geo.transform = function(methods) {\n    return {\n      stream: function(stream) {\n        var transform = new d3_geo_transform(stream);\n        for (var k in methods) transform[k] = methods[k];\n        return transform;\n      }\n    };\n  };\n  function d3_geo_transform(stream) {\n    this.stream = stream;\n  }\n  d3_geo_transform.prototype = {\n    point: function(x, y) {\n      this.stream.point(x, y);\n    },\n    sphere: function() {\n      this.stream.sphere();\n    },\n    lineStart: function() {\n      this.stream.lineStart();\n    },\n    lineEnd: function() {\n      this.stream.lineEnd();\n    },\n    polygonStart: function() {\n      this.stream.polygonStart();\n    },\n    polygonEnd: function() {\n      this.stream.polygonEnd();\n    }\n  };\n  function d3_geo_transformPoint(stream, point) {\n    return {\n      point: point,\n      sphere: function() {\n        stream.sphere();\n      },\n      lineStart: function() {\n        stream.lineStart();\n      },\n      lineEnd: function() {\n        stream.lineEnd();\n      },\n      polygonStart: function() {\n        stream.polygonStart();\n      },\n      polygonEnd: function() {\n        stream.polygonEnd();\n      }\n    };\n  }\n  d3.geo.projection = d3_geo_projection;\n  d3.geo.projectionMutator = d3_geo_projectionMutator;\n  function d3_geo_projection(project) {\n    return d3_geo_projectionMutator(function() {\n      return project;\n    })();\n  }\n  function d3_geo_projectionMutator(projectAt) {\n    var project, rotate, projectRotate, projectResample = d3_geo_resample(function(x, y) {\n      x = project(x, y);\n      return [ x[0] * k + δx, δy - x[1] * k ];\n    }), k = 150, x = 480, y = 250, λ = 0, φ = 0, δλ = 0, δφ = 0, δγ = 0, δx, δy, preclip = d3_geo_clipAntimeridian, postclip = d3_identity, clipAngle = null, clipExtent = null, stream;\n    function projection(point) {\n      point = projectRotate(point[0] * d3_radians, point[1] * d3_radians);\n      return [ point[0] * k + δx, δy - point[1] * k ];\n    }\n    function invert(point) {\n      point = projectRotate.invert((point[0] - δx) / k, (δy - point[1]) / k);\n      return point && [ point[0] * d3_degrees, point[1] * d3_degrees ];\n    }\n    projection.stream = function(output) {\n      if (stream) stream.valid = false;\n      stream = d3_geo_projectionRadians(preclip(rotate, projectResample(postclip(output))));\n      stream.valid = true;\n      return stream;\n    };\n    projection.clipAngle = function(_) {\n      if (!arguments.length) return clipAngle;\n      preclip = _ == null ? (clipAngle = _, d3_geo_clipAntimeridian) : d3_geo_clipCircle((clipAngle = +_) * d3_radians);\n      return invalidate();\n    };\n    projection.clipExtent = function(_) {\n      if (!arguments.length) return clipExtent;\n      clipExtent = _;\n      postclip = _ ? d3_geo_clipExtent(_[0][0], _[0][1], _[1][0], _[1][1]) : d3_identity;\n      return invalidate();\n    };\n    projection.scale = function(_) {\n      if (!arguments.length) return k;\n      k = +_;\n      return reset();\n    };\n    projection.translate = function(_) {\n      if (!arguments.length) return [ x, y ];\n      x = +_[0];\n      y = +_[1];\n      return reset();\n    };\n    projection.center = function(_) {\n      if (!arguments.length) return [ λ * d3_degrees, φ * d3_degrees ];\n      λ = _[0] % 360 * d3_radians;\n      φ = _[1] % 360 * d3_radians;\n      return reset();\n    };\n    projection.rotate = function(_) {\n      if (!arguments.length) return [ δλ * d3_degrees, δφ * d3_degrees, δγ * d3_degrees ];\n      δλ = _[0] % 360 * d3_radians;\n      δφ = _[1] % 360 * d3_radians;\n      δγ = _.length > 2 ? _[2] % 360 * d3_radians : 0;\n      return reset();\n    };\n    d3.rebind(projection, projectResample, \"precision\");\n    function reset() {\n      projectRotate = d3_geo_compose(rotate = d3_geo_rotation(δλ, δφ, δγ), project);\n      var center = project(λ, φ);\n      δx = x - center[0] * k;\n      δy = y + center[1] * k;\n      return invalidate();\n    }\n    function invalidate() {\n      if (stream) stream.valid = false, stream = null;\n      return projection;\n    }\n    return function() {\n      project = projectAt.apply(this, arguments);\n      projection.invert = project.invert && invert;\n      return reset();\n    };\n  }\n  function d3_geo_projectionRadians(stream) {\n    return d3_geo_transformPoint(stream, function(x, y) {\n      stream.point(x * d3_radians, y * d3_radians);\n    });\n  }\n  function d3_geo_equirectangular(λ, φ) {\n    return [ λ, φ ];\n  }\n  (d3.geo.equirectangular = function() {\n    return d3_geo_projection(d3_geo_equirectangular);\n  }).raw = d3_geo_equirectangular.invert = d3_geo_equirectangular;\n  d3.geo.rotation = function(rotate) {\n    rotate = d3_geo_rotation(rotate[0] % 360 * d3_radians, rotate[1] * d3_radians, rotate.length > 2 ? rotate[2] * d3_radians : 0);\n    function forward(coordinates) {\n      coordinates = rotate(coordinates[0] * d3_radians, coordinates[1] * d3_radians);\n      return coordinates[0] *= d3_degrees, coordinates[1] *= d3_degrees, coordinates;\n    }\n    forward.invert = function(coordinates) {\n      coordinates = rotate.invert(coordinates[0] * d3_radians, coordinates[1] * d3_radians);\n      return coordinates[0] *= d3_degrees, coordinates[1] *= d3_degrees, coordinates;\n    };\n    return forward;\n  };\n  function d3_geo_identityRotation(λ, φ) {\n    return [ λ > π ? λ - τ : λ < -π ? λ + τ : λ, φ ];\n  }\n  d3_geo_identityRotation.invert = d3_geo_equirectangular;\n  function d3_geo_rotation(δλ, δφ, δγ) {\n    return δλ ? δφ || δγ ? d3_geo_compose(d3_geo_rotationλ(δλ), d3_geo_rotationφγ(δφ, δγ)) : d3_geo_rotationλ(δλ) : δφ || δγ ? d3_geo_rotationφγ(δφ, δγ) : d3_geo_identityRotation;\n  }\n  function d3_geo_forwardRotationλ(δλ) {\n    return function(λ, φ) {\n      return λ += δλ, [ λ > π ? λ - τ : λ < -π ? λ + τ : λ, φ ];\n    };\n  }\n  function d3_geo_rotationλ(δλ) {\n    var rotation = d3_geo_forwardRotationλ(δλ);\n    rotation.invert = d3_geo_forwardRotationλ(-δλ);\n    return rotation;\n  }\n  function d3_geo_rotationφγ(δφ, δγ) {\n    var cosδφ = Math.cos(δφ), sinδφ = Math.sin(δφ), cosδγ = Math.cos(δγ), sinδγ = Math.sin(δγ);\n    function rotation(λ, φ) {\n      var cosφ = Math.cos(φ), x = Math.cos(λ) * cosφ, y = Math.sin(λ) * cosφ, z = Math.sin(φ), k = z * cosδφ + x * sinδφ;\n      return [ Math.atan2(y * cosδγ - k * sinδγ, x * cosδφ - z * sinδφ), d3_asin(k * cosδγ + y * sinδγ) ];\n    }\n    rotation.invert = function(λ, φ) {\n      var cosφ = Math.cos(φ), x = Math.cos(λ) * cosφ, y = Math.sin(λ) * cosφ, z = Math.sin(φ), k = z * cosδγ - y * sinδγ;\n      return [ Math.atan2(y * cosδγ + z * sinδγ, x * cosδφ + k * sinδφ), d3_asin(k * cosδφ - x * sinδφ) ];\n    };\n    return rotation;\n  }\n  d3.geo.circle = function() {\n    var origin = [ 0, 0 ], angle, precision = 6, interpolate;\n    function circle() {\n      var center = typeof origin === \"function\" ? origin.apply(this, arguments) : origin, rotate = d3_geo_rotation(-center[0] * d3_radians, -center[1] * d3_radians, 0).invert, ring = [];\n      interpolate(null, null, 1, {\n        point: function(x, y) {\n          ring.push(x = rotate(x, y));\n          x[0] *= d3_degrees, x[1] *= d3_degrees;\n        }\n      });\n      return {\n        type: \"Polygon\",\n        coordinates: [ ring ]\n      };\n    }\n    circle.origin = function(x) {\n      if (!arguments.length) return origin;\n      origin = x;\n      return circle;\n    };\n    circle.angle = function(x) {\n      if (!arguments.length) return angle;\n      interpolate = d3_geo_circleInterpolate((angle = +x) * d3_radians, precision * d3_radians);\n      return circle;\n    };\n    circle.precision = function(_) {\n      if (!arguments.length) return precision;\n      interpolate = d3_geo_circleInterpolate(angle * d3_radians, (precision = +_) * d3_radians);\n      return circle;\n    };\n    return circle.angle(90);\n  };\n  function d3_geo_circleInterpolate(radius, precision) {\n    var cr = Math.cos(radius), sr = Math.sin(radius);\n    return function(from, to, direction, listener) {\n      var step = direction * precision;\n      if (from != null) {\n        from = d3_geo_circleAngle(cr, from);\n        to = d3_geo_circleAngle(cr, to);\n        if (direction > 0 ? from < to : from > to) from += direction * τ;\n      } else {\n        from = radius + direction * τ;\n        to = radius - .5 * step;\n      }\n      for (var point, t = from; direction > 0 ? t > to : t < to; t -= step) {\n        listener.point((point = d3_geo_spherical([ cr, -sr * Math.cos(t), -sr * Math.sin(t) ]))[0], point[1]);\n      }\n    };\n  }\n  function d3_geo_circleAngle(cr, point) {\n    var a = d3_geo_cartesian(point);\n    a[0] -= cr;\n    d3_geo_cartesianNormalize(a);\n    var angle = d3_acos(-a[1]);\n    return ((-a[2] < 0 ? -angle : angle) + 2 * Math.PI - ε) % (2 * Math.PI);\n  }\n  d3.geo.distance = function(a, b) {\n    var Δλ = (b[0] - a[0]) * d3_radians, φ0 = a[1] * d3_radians, φ1 = b[1] * d3_radians, sinΔλ = Math.sin(Δλ), cosΔλ = Math.cos(Δλ), sinφ0 = Math.sin(φ0), cosφ0 = Math.cos(φ0), sinφ1 = Math.sin(φ1), cosφ1 = Math.cos(φ1), t;\n    return Math.atan2(Math.sqrt((t = cosφ1 * sinΔλ) * t + (t = cosφ0 * sinφ1 - sinφ0 * cosφ1 * cosΔλ) * t), sinφ0 * sinφ1 + cosφ0 * cosφ1 * cosΔλ);\n  };\n  d3.geo.graticule = function() {\n    var x1, x0, X1, X0, y1, y0, Y1, Y0, dx = 10, dy = dx, DX = 90, DY = 360, x, y, X, Y, precision = 2.5;\n    function graticule() {\n      return {\n        type: \"MultiLineString\",\n        coordinates: lines()\n      };\n    }\n    function lines() {\n      return d3.range(Math.ceil(X0 / DX) * DX, X1, DX).map(X).concat(d3.range(Math.ceil(Y0 / DY) * DY, Y1, DY).map(Y)).concat(d3.range(Math.ceil(x0 / dx) * dx, x1, dx).filter(function(x) {\n        return abs(x % DX) > ε;\n      }).map(x)).concat(d3.range(Math.ceil(y0 / dy) * dy, y1, dy).filter(function(y) {\n        return abs(y % DY) > ε;\n      }).map(y));\n    }\n    graticule.lines = function() {\n      return lines().map(function(coordinates) {\n        return {\n          type: \"LineString\",\n          coordinates: coordinates\n        };\n      });\n    };\n    graticule.outline = function() {\n      return {\n        type: \"Polygon\",\n        coordinates: [ X(X0).concat(Y(Y1).slice(1), X(X1).reverse().slice(1), Y(Y0).reverse().slice(1)) ]\n      };\n    };\n    graticule.extent = function(_) {\n      if (!arguments.length) return graticule.minorExtent();\n      return graticule.majorExtent(_).minorExtent(_);\n    };\n    graticule.majorExtent = function(_) {\n      if (!arguments.length) return [ [ X0, Y0 ], [ X1, Y1 ] ];\n      X0 = +_[0][0], X1 = +_[1][0];\n      Y0 = +_[0][1], Y1 = +_[1][1];\n      if (X0 > X1) _ = X0, X0 = X1, X1 = _;\n      if (Y0 > Y1) _ = Y0, Y0 = Y1, Y1 = _;\n      return graticule.precision(precision);\n    };\n    graticule.minorExtent = function(_) {\n      if (!arguments.length) return [ [ x0, y0 ], [ x1, y1 ] ];\n      x0 = +_[0][0], x1 = +_[1][0];\n      y0 = +_[0][1], y1 = +_[1][1];\n      if (x0 > x1) _ = x0, x0 = x1, x1 = _;\n      if (y0 > y1) _ = y0, y0 = y1, y1 = _;\n      return graticule.precision(precision);\n    };\n    graticule.step = function(_) {\n      if (!arguments.length) return graticule.minorStep();\n      return graticule.majorStep(_).minorStep(_);\n    };\n    graticule.majorStep = function(_) {\n      if (!arguments.length) return [ DX, DY ];\n      DX = +_[0], DY = +_[1];\n      return graticule;\n    };\n    graticule.minorStep = function(_) {\n      if (!arguments.length) return [ dx, dy ];\n      dx = +_[0], dy = +_[1];\n      return graticule;\n    };\n    graticule.precision = function(_) {\n      if (!arguments.length) return precision;\n      precision = +_;\n      x = d3_geo_graticuleX(y0, y1, 90);\n      y = d3_geo_graticuleY(x0, x1, precision);\n      X = d3_geo_graticuleX(Y0, Y1, 90);\n      Y = d3_geo_graticuleY(X0, X1, precision);\n      return graticule;\n    };\n    return graticule.majorExtent([ [ -180, -90 + ε ], [ 180, 90 - ε ] ]).minorExtent([ [ -180, -80 - ε ], [ 180, 80 + ε ] ]);\n  };\n  function d3_geo_graticuleX(y0, y1, dy) {\n    var y = d3.range(y0, y1 - ε, dy).concat(y1);\n    return function(x) {\n      return y.map(function(y) {\n        return [ x, y ];\n      });\n    };\n  }\n  function d3_geo_graticuleY(x0, x1, dx) {\n    var x = d3.range(x0, x1 - ε, dx).concat(x1);\n    return function(y) {\n      return x.map(function(x) {\n        return [ x, y ];\n      });\n    };\n  }\n  function d3_source(d) {\n    return d.source;\n  }\n  function d3_target(d) {\n    return d.target;\n  }\n  d3.geo.greatArc = function() {\n    var source = d3_source, source_, target = d3_target, target_;\n    function greatArc() {\n      return {\n        type: \"LineString\",\n        coordinates: [ source_ || source.apply(this, arguments), target_ || target.apply(this, arguments) ]\n      };\n    }\n    greatArc.distance = function() {\n      return d3.geo.distance(source_ || source.apply(this, arguments), target_ || target.apply(this, arguments));\n    };\n    greatArc.source = function(_) {\n      if (!arguments.length) return source;\n      source = _, source_ = typeof _ === \"function\" ? null : _;\n      return greatArc;\n    };\n    greatArc.target = function(_) {\n      if (!arguments.length) return target;\n      target = _, target_ = typeof _ === \"function\" ? null : _;\n      return greatArc;\n    };\n    greatArc.precision = function() {\n      return arguments.length ? greatArc : 0;\n    };\n    return greatArc;\n  };\n  d3.geo.interpolate = function(source, target) {\n    return d3_geo_interpolate(source[0] * d3_radians, source[1] * d3_radians, target[0] * d3_radians, target[1] * d3_radians);\n  };\n  function d3_geo_interpolate(x0, y0, x1, y1) {\n    var cy0 = Math.cos(y0), sy0 = Math.sin(y0), cy1 = Math.cos(y1), sy1 = Math.sin(y1), kx0 = cy0 * Math.cos(x0), ky0 = cy0 * Math.sin(x0), kx1 = cy1 * Math.cos(x1), ky1 = cy1 * Math.sin(x1), d = 2 * Math.asin(Math.sqrt(d3_haversin(y1 - y0) + cy0 * cy1 * d3_haversin(x1 - x0))), k = 1 / Math.sin(d);\n    var interpolate = d ? function(t) {\n      var B = Math.sin(t *= d) * k, A = Math.sin(d - t) * k, x = A * kx0 + B * kx1, y = A * ky0 + B * ky1, z = A * sy0 + B * sy1;\n      return [ Math.atan2(y, x) * d3_degrees, Math.atan2(z, Math.sqrt(x * x + y * y)) * d3_degrees ];\n    } : function() {\n      return [ x0 * d3_degrees, y0 * d3_degrees ];\n    };\n    interpolate.distance = d;\n    return interpolate;\n  }\n  d3.geo.length = function(object) {\n    d3_geo_lengthSum = 0;\n    d3.geo.stream(object, d3_geo_length);\n    return d3_geo_lengthSum;\n  };\n  var d3_geo_lengthSum;\n  var d3_geo_length = {\n    sphere: d3_noop,\n    point: d3_noop,\n    lineStart: d3_geo_lengthLineStart,\n    lineEnd: d3_noop,\n    polygonStart: d3_noop,\n    polygonEnd: d3_noop\n  };\n  function d3_geo_lengthLineStart() {\n    var λ0, sinφ0, cosφ0;\n    d3_geo_length.point = function(λ, φ) {\n      λ0 = λ * d3_radians, sinφ0 = Math.sin(φ *= d3_radians), cosφ0 = Math.cos(φ);\n      d3_geo_length.point = nextPoint;\n    };\n    d3_geo_length.lineEnd = function() {\n      d3_geo_length.point = d3_geo_length.lineEnd = d3_noop;\n    };\n    function nextPoint(λ, φ) {\n      var sinφ = Math.sin(φ *= d3_radians), cosφ = Math.cos(φ), t = abs((λ *= d3_radians) - λ0), cosΔλ = Math.cos(t);\n      d3_geo_lengthSum += Math.atan2(Math.sqrt((t = cosφ * Math.sin(t)) * t + (t = cosφ0 * sinφ - sinφ0 * cosφ * cosΔλ) * t), sinφ0 * sinφ + cosφ0 * cosφ * cosΔλ);\n      λ0 = λ, sinφ0 = sinφ, cosφ0 = cosφ;\n    }\n  }\n  function d3_geo_azimuthal(scale, angle) {\n    function azimuthal(λ, φ) {\n      var cosλ = Math.cos(λ), cosφ = Math.cos(φ), k = scale(cosλ * cosφ);\n      return [ k * cosφ * Math.sin(λ), k * Math.sin(φ) ];\n    }\n    azimuthal.invert = function(x, y) {\n      var ρ = Math.sqrt(x * x + y * y), c = angle(ρ), sinc = Math.sin(c), cosc = Math.cos(c);\n      return [ Math.atan2(x * sinc, ρ * cosc), Math.asin(ρ && y * sinc / ρ) ];\n    };\n    return azimuthal;\n  }\n  var d3_geo_azimuthalEqualArea = d3_geo_azimuthal(function(cosλcosφ) {\n    return Math.sqrt(2 / (1 + cosλcosφ));\n  }, function(ρ) {\n    return 2 * Math.asin(ρ / 2);\n  });\n  (d3.geo.azimuthalEqualArea = function() {\n    return d3_geo_projection(d3_geo_azimuthalEqualArea);\n  }).raw = d3_geo_azimuthalEqualArea;\n  var d3_geo_azimuthalEquidistant = d3_geo_azimuthal(function(cosλcosφ) {\n    var c = Math.acos(cosλcosφ);\n    return c && c / Math.sin(c);\n  }, d3_identity);\n  (d3.geo.azimuthalEquidistant = function() {\n    return d3_geo_projection(d3_geo_azimuthalEquidistant);\n  }).raw = d3_geo_azimuthalEquidistant;\n  function d3_geo_conicConformal(φ0, φ1) {\n    var cosφ0 = Math.cos(φ0), t = function(φ) {\n      return Math.tan(π / 4 + φ / 2);\n    }, n = φ0 === φ1 ? Math.sin(φ0) : Math.log(cosφ0 / Math.cos(φ1)) / Math.log(t(φ1) / t(φ0)), F = cosφ0 * Math.pow(t(φ0), n) / n;\n    if (!n) return d3_geo_mercator;\n    function forward(λ, φ) {\n      if (F > 0) {\n        if (φ < -halfπ + ε) φ = -halfπ + ε;\n      } else {\n        if (φ > halfπ - ε) φ = halfπ - ε;\n      }\n      var ρ = F / Math.pow(t(φ), n);\n      return [ ρ * Math.sin(n * λ), F - ρ * Math.cos(n * λ) ];\n    }\n    forward.invert = function(x, y) {\n      var ρ0_y = F - y, ρ = d3_sgn(n) * Math.sqrt(x * x + ρ0_y * ρ0_y);\n      return [ Math.atan2(x, ρ0_y) / n, 2 * Math.atan(Math.pow(F / ρ, 1 / n)) - halfπ ];\n    };\n    return forward;\n  }\n  (d3.geo.conicConformal = function() {\n    return d3_geo_conic(d3_geo_conicConformal);\n  }).raw = d3_geo_conicConformal;\n  function d3_geo_conicEquidistant(φ0, φ1) {\n    var cosφ0 = Math.cos(φ0), n = φ0 === φ1 ? Math.sin(φ0) : (cosφ0 - Math.cos(φ1)) / (φ1 - φ0), G = cosφ0 / n + φ0;\n    if (abs(n) < ε) return d3_geo_equirectangular;\n    function forward(λ, φ) {\n      var ρ = G - φ;\n      return [ ρ * Math.sin(n * λ), G - ρ * Math.cos(n * λ) ];\n    }\n    forward.invert = function(x, y) {\n      var ρ0_y = G - y;\n      return [ Math.atan2(x, ρ0_y) / n, G - d3_sgn(n) * Math.sqrt(x * x + ρ0_y * ρ0_y) ];\n    };\n    return forward;\n  }\n  (d3.geo.conicEquidistant = function() {\n    return d3_geo_conic(d3_geo_conicEquidistant);\n  }).raw = d3_geo_conicEquidistant;\n  var d3_geo_gnomonic = d3_geo_azimuthal(function(cosλcosφ) {\n    return 1 / cosλcosφ;\n  }, Math.atan);\n  (d3.geo.gnomonic = function() {\n    return d3_geo_projection(d3_geo_gnomonic);\n  }).raw = d3_geo_gnomonic;\n  function d3_geo_mercator(λ, φ) {\n    return [ λ, Math.log(Math.tan(π / 4 + φ / 2)) ];\n  }\n  d3_geo_mercator.invert = function(x, y) {\n    return [ x, 2 * Math.atan(Math.exp(y)) - halfπ ];\n  };\n  function d3_geo_mercatorProjection(project) {\n    var m = d3_geo_projection(project), scale = m.scale, translate = m.translate, clipExtent = m.clipExtent, clipAuto;\n    m.scale = function() {\n      var v = scale.apply(m, arguments);\n      return v === m ? clipAuto ? m.clipExtent(null) : m : v;\n    };\n    m.translate = function() {\n      var v = translate.apply(m, arguments);\n      return v === m ? clipAuto ? m.clipExtent(null) : m : v;\n    };\n    m.clipExtent = function(_) {\n      var v = clipExtent.apply(m, arguments);\n      if (v === m) {\n        if (clipAuto = _ == null) {\n          var k = π * scale(), t = translate();\n          clipExtent([ [ t[0] - k, t[1] - k ], [ t[0] + k, t[1] + k ] ]);\n        }\n      } else if (clipAuto) {\n        v = null;\n      }\n      return v;\n    };\n    return m.clipExtent(null);\n  }\n  (d3.geo.mercator = function() {\n    return d3_geo_mercatorProjection(d3_geo_mercator);\n  }).raw = d3_geo_mercator;\n  var d3_geo_orthographic = d3_geo_azimuthal(function() {\n    return 1;\n  }, Math.asin);\n  (d3.geo.orthographic = function() {\n    return d3_geo_projection(d3_geo_orthographic);\n  }).raw = d3_geo_orthographic;\n  var d3_geo_stereographic = d3_geo_azimuthal(function(cosλcosφ) {\n    return 1 / (1 + cosλcosφ);\n  }, function(ρ) {\n    return 2 * Math.atan(ρ);\n  });\n  (d3.geo.stereographic = function() {\n    return d3_geo_projection(d3_geo_stereographic);\n  }).raw = d3_geo_stereographic;\n  function d3_geo_transverseMercator(λ, φ) {\n    return [ Math.log(Math.tan(π / 4 + φ / 2)), -λ ];\n  }\n  d3_geo_transverseMercator.invert = function(x, y) {\n    return [ -y, 2 * Math.atan(Math.exp(x)) - halfπ ];\n  };\n  (d3.geo.transverseMercator = function() {\n    var projection = d3_geo_mercatorProjection(d3_geo_transverseMercator), center = projection.center, rotate = projection.rotate;\n    projection.center = function(_) {\n      return _ ? center([ -_[1], _[0] ]) : (_ = center(), [ _[1], -_[0] ]);\n    };\n    projection.rotate = function(_) {\n      return _ ? rotate([ _[0], _[1], _.length > 2 ? _[2] + 90 : 90 ]) : (_ = rotate(), \n      [ _[0], _[1], _[2] - 90 ]);\n    };\n    return rotate([ 0, 0, 90 ]);\n  }).raw = d3_geo_transverseMercator;\n  d3.geom = {};\n  function d3_geom_pointX(d) {\n    return d[0];\n  }\n  function d3_geom_pointY(d) {\n    return d[1];\n  }\n  d3.geom.hull = function(vertices) {\n    var x = d3_geom_pointX, y = d3_geom_pointY;\n    if (arguments.length) return hull(vertices);\n    function hull(data) {\n      if (data.length < 3) return [];\n      var fx = d3_functor(x), fy = d3_functor(y), i, n = data.length, points = [], flippedPoints = [];\n      for (i = 0; i < n; i++) {\n        points.push([ +fx.call(this, data[i], i), +fy.call(this, data[i], i), i ]);\n      }\n      points.sort(d3_geom_hullOrder);\n      for (i = 0; i < n; i++) flippedPoints.push([ points[i][0], -points[i][1] ]);\n      var upper = d3_geom_hullUpper(points), lower = d3_geom_hullUpper(flippedPoints);\n      var skipLeft = lower[0] === upper[0], skipRight = lower[lower.length - 1] === upper[upper.length - 1], polygon = [];\n      for (i = upper.length - 1; i >= 0; --i) polygon.push(data[points[upper[i]][2]]);\n      for (i = +skipLeft; i < lower.length - skipRight; ++i) polygon.push(data[points[lower[i]][2]]);\n      return polygon;\n    }\n    hull.x = function(_) {\n      return arguments.length ? (x = _, hull) : x;\n    };\n    hull.y = function(_) {\n      return arguments.length ? (y = _, hull) : y;\n    };\n    return hull;\n  };\n  function d3_geom_hullUpper(points) {\n    var n = points.length, hull = [ 0, 1 ], hs = 2;\n    for (var i = 2; i < n; i++) {\n      while (hs > 1 && d3_cross2d(points[hull[hs - 2]], points[hull[hs - 1]], points[i]) <= 0) --hs;\n      hull[hs++] = i;\n    }\n    return hull.slice(0, hs);\n  }\n  function d3_geom_hullOrder(a, b) {\n    return a[0] - b[0] || a[1] - b[1];\n  }\n  d3.geom.polygon = function(coordinates) {\n    d3_subclass(coordinates, d3_geom_polygonPrototype);\n    return coordinates;\n  };\n  var d3_geom_polygonPrototype = d3.geom.polygon.prototype = [];\n  d3_geom_polygonPrototype.area = function() {\n    var i = -1, n = this.length, a, b = this[n - 1], area = 0;\n    while (++i < n) {\n      a = b;\n      b = this[i];\n      area += a[1] * b[0] - a[0] * b[1];\n    }\n    return area * .5;\n  };\n  d3_geom_polygonPrototype.centroid = function(k) {\n    var i = -1, n = this.length, x = 0, y = 0, a, b = this[n - 1], c;\n    if (!arguments.length) k = -1 / (6 * this.area());\n    while (++i < n) {\n      a = b;\n      b = this[i];\n      c = a[0] * b[1] - b[0] * a[1];\n      x += (a[0] + b[0]) * c;\n      y += (a[1] + b[1]) * c;\n    }\n    return [ x * k, y * k ];\n  };\n  d3_geom_polygonPrototype.clip = function(subject) {\n    var input, closed = d3_geom_polygonClosed(subject), i = -1, n = this.length - d3_geom_polygonClosed(this), j, m, a = this[n - 1], b, c, d;\n    while (++i < n) {\n      input = subject.slice();\n      subject.length = 0;\n      b = this[i];\n      c = input[(m = input.length - closed) - 1];\n      j = -1;\n      while (++j < m) {\n        d = input[j];\n        if (d3_geom_polygonInside(d, a, b)) {\n          if (!d3_geom_polygonInside(c, a, b)) {\n            subject.push(d3_geom_polygonIntersect(c, d, a, b));\n          }\n          subject.push(d);\n        } else if (d3_geom_polygonInside(c, a, b)) {\n          subject.push(d3_geom_polygonIntersect(c, d, a, b));\n        }\n        c = d;\n      }\n      if (closed) subject.push(subject[0]);\n      a = b;\n    }\n    return subject;\n  };\n  function d3_geom_polygonInside(p, a, b) {\n    return (b[0] - a[0]) * (p[1] - a[1]) < (b[1] - a[1]) * (p[0] - a[0]);\n  }\n  function d3_geom_polygonIntersect(c, d, a, b) {\n    var x1 = c[0], x3 = a[0], x21 = d[0] - x1, x43 = b[0] - x3, y1 = c[1], y3 = a[1], y21 = d[1] - y1, y43 = b[1] - y3, ua = (x43 * (y1 - y3) - y43 * (x1 - x3)) / (y43 * x21 - x43 * y21);\n    return [ x1 + ua * x21, y1 + ua * y21 ];\n  }\n  function d3_geom_polygonClosed(coordinates) {\n    var a = coordinates[0], b = coordinates[coordinates.length - 1];\n    return !(a[0] - b[0] || a[1] - b[1]);\n  }\n  var d3_geom_voronoiEdges, d3_geom_voronoiCells, d3_geom_voronoiBeaches, d3_geom_voronoiBeachPool = [], d3_geom_voronoiFirstCircle, d3_geom_voronoiCircles, d3_geom_voronoiCirclePool = [];\n  function d3_geom_voronoiBeach() {\n    d3_geom_voronoiRedBlackNode(this);\n    this.edge = this.site = this.circle = null;\n  }\n  function d3_geom_voronoiCreateBeach(site) {\n    var beach = d3_geom_voronoiBeachPool.pop() || new d3_geom_voronoiBeach();\n    beach.site = site;\n    return beach;\n  }\n  function d3_geom_voronoiDetachBeach(beach) {\n    d3_geom_voronoiDetachCircle(beach);\n    d3_geom_voronoiBeaches.remove(beach);\n    d3_geom_voronoiBeachPool.push(beach);\n    d3_geom_voronoiRedBlackNode(beach);\n  }\n  function d3_geom_voronoiRemoveBeach(beach) {\n    var circle = beach.circle, x = circle.x, y = circle.cy, vertex = {\n      x: x,\n      y: y\n    }, previous = beach.P, next = beach.N, disappearing = [ beach ];\n    d3_geom_voronoiDetachBeach(beach);\n    var lArc = previous;\n    while (lArc.circle && abs(x - lArc.circle.x) < ε && abs(y - lArc.circle.cy) < ε) {\n      previous = lArc.P;\n      disappearing.unshift(lArc);\n      d3_geom_voronoiDetachBeach(lArc);\n      lArc = previous;\n    }\n    disappearing.unshift(lArc);\n    d3_geom_voronoiDetachCircle(lArc);\n    var rArc = next;\n    while (rArc.circle && abs(x - rArc.circle.x) < ε && abs(y - rArc.circle.cy) < ε) {\n      next = rArc.N;\n      disappearing.push(rArc);\n      d3_geom_voronoiDetachBeach(rArc);\n      rArc = next;\n    }\n    disappearing.push(rArc);\n    d3_geom_voronoiDetachCircle(rArc);\n    var nArcs = disappearing.length, iArc;\n    for (iArc = 1; iArc < nArcs; ++iArc) {\n      rArc = disappearing[iArc];\n      lArc = disappearing[iArc - 1];\n      d3_geom_voronoiSetEdgeEnd(rArc.edge, lArc.site, rArc.site, vertex);\n    }\n    lArc = disappearing[0];\n    rArc = disappearing[nArcs - 1];\n    rArc.edge = d3_geom_voronoiCreateEdge(lArc.site, rArc.site, null, vertex);\n    d3_geom_voronoiAttachCircle(lArc);\n    d3_geom_voronoiAttachCircle(rArc);\n  }\n  function d3_geom_voronoiAddBeach(site) {\n    var x = site.x, directrix = site.y, lArc, rArc, dxl, dxr, node = d3_geom_voronoiBeaches._;\n    while (node) {\n      dxl = d3_geom_voronoiLeftBreakPoint(node, directrix) - x;\n      if (dxl > ε) node = node.L; else {\n        dxr = x - d3_geom_voronoiRightBreakPoint(node, directrix);\n        if (dxr > ε) {\n          if (!node.R) {\n            lArc = node;\n            break;\n          }\n          node = node.R;\n        } else {\n          if (dxl > -ε) {\n            lArc = node.P;\n            rArc = node;\n          } else if (dxr > -ε) {\n            lArc = node;\n            rArc = node.N;\n          } else {\n            lArc = rArc = node;\n          }\n          break;\n        }\n      }\n    }\n    var newArc = d3_geom_voronoiCreateBeach(site);\n    d3_geom_voronoiBeaches.insert(lArc, newArc);\n    if (!lArc && !rArc) return;\n    if (lArc === rArc) {\n      d3_geom_voronoiDetachCircle(lArc);\n      rArc = d3_geom_voronoiCreateBeach(lArc.site);\n      d3_geom_voronoiBeaches.insert(newArc, rArc);\n      newArc.edge = rArc.edge = d3_geom_voronoiCreateEdge(lArc.site, newArc.site);\n      d3_geom_voronoiAttachCircle(lArc);\n      d3_geom_voronoiAttachCircle(rArc);\n      return;\n    }\n    if (!rArc) {\n      newArc.edge = d3_geom_voronoiCreateEdge(lArc.site, newArc.site);\n      return;\n    }\n    d3_geom_voronoiDetachCircle(lArc);\n    d3_geom_voronoiDetachCircle(rArc);\n    var lSite = lArc.site, ax = lSite.x, ay = lSite.y, bx = site.x - ax, by = site.y - ay, rSite = rArc.site, cx = rSite.x - ax, cy = rSite.y - ay, d = 2 * (bx * cy - by * cx), hb = bx * bx + by * by, hc = cx * cx + cy * cy, vertex = {\n      x: (cy * hb - by * hc) / d + ax,\n      y: (bx * hc - cx * hb) / d + ay\n    };\n    d3_geom_voronoiSetEdgeEnd(rArc.edge, lSite, rSite, vertex);\n    newArc.edge = d3_geom_voronoiCreateEdge(lSite, site, null, vertex);\n    rArc.edge = d3_geom_voronoiCreateEdge(site, rSite, null, vertex);\n    d3_geom_voronoiAttachCircle(lArc);\n    d3_geom_voronoiAttachCircle(rArc);\n  }\n  function d3_geom_voronoiLeftBreakPoint(arc, directrix) {\n    var site = arc.site, rfocx = site.x, rfocy = site.y, pby2 = rfocy - directrix;\n    if (!pby2) return rfocx;\n    var lArc = arc.P;\n    if (!lArc) return -Infinity;\n    site = lArc.site;\n    var lfocx = site.x, lfocy = site.y, plby2 = lfocy - directrix;\n    if (!plby2) return lfocx;\n    var hl = lfocx - rfocx, aby2 = 1 / pby2 - 1 / plby2, b = hl / plby2;\n    if (aby2) return (-b + Math.sqrt(b * b - 2 * aby2 * (hl * hl / (-2 * plby2) - lfocy + plby2 / 2 + rfocy - pby2 / 2))) / aby2 + rfocx;\n    return (rfocx + lfocx) / 2;\n  }\n  function d3_geom_voronoiRightBreakPoint(arc, directrix) {\n    var rArc = arc.N;\n    if (rArc) return d3_geom_voronoiLeftBreakPoint(rArc, directrix);\n    var site = arc.site;\n    return site.y === directrix ? site.x : Infinity;\n  }\n  function d3_geom_voronoiCell(site) {\n    this.site = site;\n    this.edges = [];\n  }\n  d3_geom_voronoiCell.prototype.prepare = function() {\n    var halfEdges = this.edges, iHalfEdge = halfEdges.length, edge;\n    while (iHalfEdge--) {\n      edge = halfEdges[iHalfEdge].edge;\n      if (!edge.b || !edge.a) halfEdges.splice(iHalfEdge, 1);\n    }\n    halfEdges.sort(d3_geom_voronoiHalfEdgeOrder);\n    return halfEdges.length;\n  };\n  function d3_geom_voronoiCloseCells(extent) {\n    var x0 = extent[0][0], x1 = extent[1][0], y0 = extent[0][1], y1 = extent[1][1], x2, y2, x3, y3, cells = d3_geom_voronoiCells, iCell = cells.length, cell, iHalfEdge, halfEdges, nHalfEdges, start, end;\n    while (iCell--) {\n      cell = cells[iCell];\n      if (!cell || !cell.prepare()) continue;\n      halfEdges = cell.edges;\n      nHalfEdges = halfEdges.length;\n      iHalfEdge = 0;\n      while (iHalfEdge < nHalfEdges) {\n        end = halfEdges[iHalfEdge].end(), x3 = end.x, y3 = end.y;\n        start = halfEdges[++iHalfEdge % nHalfEdges].start(), x2 = start.x, y2 = start.y;\n        if (abs(x3 - x2) > ε || abs(y3 - y2) > ε) {\n          halfEdges.splice(iHalfEdge, 0, new d3_geom_voronoiHalfEdge(d3_geom_voronoiCreateBorderEdge(cell.site, end, abs(x3 - x0) < ε && y1 - y3 > ε ? {\n            x: x0,\n            y: abs(x2 - x0) < ε ? y2 : y1\n          } : abs(y3 - y1) < ε && x1 - x3 > ε ? {\n            x: abs(y2 - y1) < ε ? x2 : x1,\n            y: y1\n          } : abs(x3 - x1) < ε && y3 - y0 > ε ? {\n            x: x1,\n            y: abs(x2 - x1) < ε ? y2 : y0\n          } : abs(y3 - y0) < ε && x3 - x0 > ε ? {\n            x: abs(y2 - y0) < ε ? x2 : x0,\n            y: y0\n          } : null), cell.site, null));\n          ++nHalfEdges;\n        }\n      }\n    }\n  }\n  function d3_geom_voronoiHalfEdgeOrder(a, b) {\n    return b.angle - a.angle;\n  }\n  function d3_geom_voronoiCircle() {\n    d3_geom_voronoiRedBlackNode(this);\n    this.x = this.y = this.arc = this.site = this.cy = null;\n  }\n  function d3_geom_voronoiAttachCircle(arc) {\n    var lArc = arc.P, rArc = arc.N;\n    if (!lArc || !rArc) return;\n    var lSite = lArc.site, cSite = arc.site, rSite = rArc.site;\n    if (lSite === rSite) return;\n    var bx = cSite.x, by = cSite.y, ax = lSite.x - bx, ay = lSite.y - by, cx = rSite.x - bx, cy = rSite.y - by;\n    var d = 2 * (ax * cy - ay * cx);\n    if (d >= -ε2) return;\n    var ha = ax * ax + ay * ay, hc = cx * cx + cy * cy, x = (cy * ha - ay * hc) / d, y = (ax * hc - cx * ha) / d, cy = y + by;\n    var circle = d3_geom_voronoiCirclePool.pop() || new d3_geom_voronoiCircle();\n    circle.arc = arc;\n    circle.site = cSite;\n    circle.x = x + bx;\n    circle.y = cy + Math.sqrt(x * x + y * y);\n    circle.cy = cy;\n    arc.circle = circle;\n    var before = null, node = d3_geom_voronoiCircles._;\n    while (node) {\n      if (circle.y < node.y || circle.y === node.y && circle.x <= node.x) {\n        if (node.L) node = node.L; else {\n          before = node.P;\n          break;\n        }\n      } else {\n        if (node.R) node = node.R; else {\n          before = node;\n          break;\n        }\n      }\n    }\n    d3_geom_voronoiCircles.insert(before, circle);\n    if (!before) d3_geom_voronoiFirstCircle = circle;\n  }\n  function d3_geom_voronoiDetachCircle(arc) {\n    var circle = arc.circle;\n    if (circle) {\n      if (!circle.P) d3_geom_voronoiFirstCircle = circle.N;\n      d3_geom_voronoiCircles.remove(circle);\n      d3_geom_voronoiCirclePool.push(circle);\n      d3_geom_voronoiRedBlackNode(circle);\n      arc.circle = null;\n    }\n  }\n  function d3_geom_voronoiClipEdges(extent) {\n    var edges = d3_geom_voronoiEdges, clip = d3_geom_clipLine(extent[0][0], extent[0][1], extent[1][0], extent[1][1]), i = edges.length, e;\n    while (i--) {\n      e = edges[i];\n      if (!d3_geom_voronoiConnectEdge(e, extent) || !clip(e) || abs(e.a.x - e.b.x) < ε && abs(e.a.y - e.b.y) < ε) {\n        e.a = e.b = null;\n        edges.splice(i, 1);\n      }\n    }\n  }\n  function d3_geom_voronoiConnectEdge(edge, extent) {\n    var vb = edge.b;\n    if (vb) return true;\n    var va = edge.a, x0 = extent[0][0], x1 = extent[1][0], y0 = extent[0][1], y1 = extent[1][1], lSite = edge.l, rSite = edge.r, lx = lSite.x, ly = lSite.y, rx = rSite.x, ry = rSite.y, fx = (lx + rx) / 2, fy = (ly + ry) / 2, fm, fb;\n    if (ry === ly) {\n      if (fx < x0 || fx >= x1) return;\n      if (lx > rx) {\n        if (!va) va = {\n          x: fx,\n          y: y0\n        }; else if (va.y >= y1) return;\n        vb = {\n          x: fx,\n          y: y1\n        };\n      } else {\n        if (!va) va = {\n          x: fx,\n          y: y1\n        }; else if (va.y < y0) return;\n        vb = {\n          x: fx,\n          y: y0\n        };\n      }\n    } else {\n      fm = (lx - rx) / (ry - ly);\n      fb = fy - fm * fx;\n      if (fm < -1 || fm > 1) {\n        if (lx > rx) {\n          if (!va) va = {\n            x: (y0 - fb) / fm,\n            y: y0\n          }; else if (va.y >= y1) return;\n          vb = {\n            x: (y1 - fb) / fm,\n            y: y1\n          };\n        } else {\n          if (!va) va = {\n            x: (y1 - fb) / fm,\n            y: y1\n          }; else if (va.y < y0) return;\n          vb = {\n            x: (y0 - fb) / fm,\n            y: y0\n          };\n        }\n      } else {\n        if (ly < ry) {\n          if (!va) va = {\n            x: x0,\n            y: fm * x0 + fb\n          }; else if (va.x >= x1) return;\n          vb = {\n            x: x1,\n            y: fm * x1 + fb\n          };\n        } else {\n          if (!va) va = {\n            x: x1,\n            y: fm * x1 + fb\n          }; else if (va.x < x0) return;\n          vb = {\n            x: x0,\n            y: fm * x0 + fb\n          };\n        }\n      }\n    }\n    edge.a = va;\n    edge.b = vb;\n    return true;\n  }\n  function d3_geom_voronoiEdge(lSite, rSite) {\n    this.l = lSite;\n    this.r = rSite;\n    this.a = this.b = null;\n  }\n  function d3_geom_voronoiCreateEdge(lSite, rSite, va, vb) {\n    var edge = new d3_geom_voronoiEdge(lSite, rSite);\n    d3_geom_voronoiEdges.push(edge);\n    if (va) d3_geom_voronoiSetEdgeEnd(edge, lSite, rSite, va);\n    if (vb) d3_geom_voronoiSetEdgeEnd(edge, rSite, lSite, vb);\n    d3_geom_voronoiCells[lSite.i].edges.push(new d3_geom_voronoiHalfEdge(edge, lSite, rSite));\n    d3_geom_voronoiCells[rSite.i].edges.push(new d3_geom_voronoiHalfEdge(edge, rSite, lSite));\n    return edge;\n  }\n  function d3_geom_voronoiCreateBorderEdge(lSite, va, vb) {\n    var edge = new d3_geom_voronoiEdge(lSite, null);\n    edge.a = va;\n    edge.b = vb;\n    d3_geom_voronoiEdges.push(edge);\n    return edge;\n  }\n  function d3_geom_voronoiSetEdgeEnd(edge, lSite, rSite, vertex) {\n    if (!edge.a && !edge.b) {\n      edge.a = vertex;\n      edge.l = lSite;\n      edge.r = rSite;\n    } else if (edge.l === rSite) {\n      edge.b = vertex;\n    } else {\n      edge.a = vertex;\n    }\n  }\n  function d3_geom_voronoiHalfEdge(edge, lSite, rSite) {\n    var va = edge.a, vb = edge.b;\n    this.edge = edge;\n    this.site = lSite;\n    this.angle = rSite ? Math.atan2(rSite.y - lSite.y, rSite.x - lSite.x) : edge.l === lSite ? Math.atan2(vb.x - va.x, va.y - vb.y) : Math.atan2(va.x - vb.x, vb.y - va.y);\n  }\n  d3_geom_voronoiHalfEdge.prototype = {\n    start: function() {\n      return this.edge.l === this.site ? this.edge.a : this.edge.b;\n    },\n    end: function() {\n      return this.edge.l === this.site ? this.edge.b : this.edge.a;\n    }\n  };\n  function d3_geom_voronoiRedBlackTree() {\n    this._ = null;\n  }\n  function d3_geom_voronoiRedBlackNode(node) {\n    node.U = node.C = node.L = node.R = node.P = node.N = null;\n  }\n  d3_geom_voronoiRedBlackTree.prototype = {\n    insert: function(after, node) {\n      var parent, grandpa, uncle;\n      if (after) {\n        node.P = after;\n        node.N = after.N;\n        if (after.N) after.N.P = node;\n        after.N = node;\n        if (after.R) {\n          after = after.R;\n          while (after.L) after = after.L;\n          after.L = node;\n        } else {\n          after.R = node;\n        }\n        parent = after;\n      } else if (this._) {\n        after = d3_geom_voronoiRedBlackFirst(this._);\n        node.P = null;\n        node.N = after;\n        after.P = after.L = node;\n        parent = after;\n      } else {\n        node.P = node.N = null;\n        this._ = node;\n        parent = null;\n      }\n      node.L = node.R = null;\n      node.U = parent;\n      node.C = true;\n      after = node;\n      while (parent && parent.C) {\n        grandpa = parent.U;\n        if (parent === grandpa.L) {\n          uncle = grandpa.R;\n          if (uncle && uncle.C) {\n            parent.C = uncle.C = false;\n            grandpa.C = true;\n            after = grandpa;\n          } else {\n            if (after === parent.R) {\n              d3_geom_voronoiRedBlackRotateLeft(this, parent);\n              after = parent;\n              parent = after.U;\n            }\n            parent.C = false;\n            grandpa.C = true;\n            d3_geom_voronoiRedBlackRotateRight(this, grandpa);\n          }\n        } else {\n          uncle = grandpa.L;\n          if (uncle && uncle.C) {\n            parent.C = uncle.C = false;\n            grandpa.C = true;\n            after = grandpa;\n          } else {\n            if (after === parent.L) {\n              d3_geom_voronoiRedBlackRotateRight(this, parent);\n              after = parent;\n              parent = after.U;\n            }\n            parent.C = false;\n            grandpa.C = true;\n            d3_geom_voronoiRedBlackRotateLeft(this, grandpa);\n          }\n        }\n        parent = after.U;\n      }\n      this._.C = false;\n    },\n    remove: function(node) {\n      if (node.N) node.N.P = node.P;\n      if (node.P) node.P.N = node.N;\n      node.N = node.P = null;\n      var parent = node.U, sibling, left = node.L, right = node.R, next, red;\n      if (!left) next = right; else if (!right) next = left; else next = d3_geom_voronoiRedBlackFirst(right);\n      if (parent) {\n        if (parent.L === node) parent.L = next; else parent.R = next;\n      } else {\n        this._ = next;\n      }\n      if (left && right) {\n        red = next.C;\n        next.C = node.C;\n        next.L = left;\n        left.U = next;\n        if (next !== right) {\n          parent = next.U;\n          next.U = node.U;\n          node = next.R;\n          parent.L = node;\n          next.R = right;\n          right.U = next;\n        } else {\n          next.U = parent;\n          parent = next;\n          node = next.R;\n        }\n      } else {\n        red = node.C;\n        node = next;\n      }\n      if (node) node.U = parent;\n      if (red) return;\n      if (node && node.C) {\n        node.C = false;\n        return;\n      }\n      do {\n        if (node === this._) break;\n        if (node === parent.L) {\n          sibling = parent.R;\n          if (sibling.C) {\n            sibling.C = false;\n            parent.C = true;\n            d3_geom_voronoiRedBlackRotateLeft(this, parent);\n            sibling = parent.R;\n          }\n          if (sibling.L && sibling.L.C || sibling.R && sibling.R.C) {\n            if (!sibling.R || !sibling.R.C) {\n              sibling.L.C = false;\n              sibling.C = true;\n              d3_geom_voronoiRedBlackRotateRight(this, sibling);\n              sibling = parent.R;\n            }\n            sibling.C = parent.C;\n            parent.C = sibling.R.C = false;\n            d3_geom_voronoiRedBlackRotateLeft(this, parent);\n            node = this._;\n            break;\n          }\n        } else {\n          sibling = parent.L;\n          if (sibling.C) {\n            sibling.C = false;\n            parent.C = true;\n            d3_geom_voronoiRedBlackRotateRight(this, parent);\n            sibling = parent.L;\n          }\n          if (sibling.L && sibling.L.C || sibling.R && sibling.R.C) {\n            if (!sibling.L || !sibling.L.C) {\n              sibling.R.C = false;\n              sibling.C = true;\n              d3_geom_voronoiRedBlackRotateLeft(this, sibling);\n              sibling = parent.L;\n            }\n            sibling.C = parent.C;\n            parent.C = sibling.L.C = false;\n            d3_geom_voronoiRedBlackRotateRight(this, parent);\n            node = this._;\n            break;\n          }\n        }\n        sibling.C = true;\n        node = parent;\n        parent = parent.U;\n      } while (!node.C);\n      if (node) node.C = false;\n    }\n  };\n  function d3_geom_voronoiRedBlackRotateLeft(tree, node) {\n    var p = node, q = node.R, parent = p.U;\n    if (parent) {\n      if (parent.L === p) parent.L = q; else parent.R = q;\n    } else {\n      tree._ = q;\n    }\n    q.U = parent;\n    p.U = q;\n    p.R = q.L;\n    if (p.R) p.R.U = p;\n    q.L = p;\n  }\n  function d3_geom_voronoiRedBlackRotateRight(tree, node) {\n    var p = node, q = node.L, parent = p.U;\n    if (parent) {\n      if (parent.L === p) parent.L = q; else parent.R = q;\n    } else {\n      tree._ = q;\n    }\n    q.U = parent;\n    p.U = q;\n    p.L = q.R;\n    if (p.L) p.L.U = p;\n    q.R = p;\n  }\n  function d3_geom_voronoiRedBlackFirst(node) {\n    while (node.L) node = node.L;\n    return node;\n  }\n  function d3_geom_voronoi(sites, bbox) {\n    var site = sites.sort(d3_geom_voronoiVertexOrder).pop(), x0, y0, circle;\n    d3_geom_voronoiEdges = [];\n    d3_geom_voronoiCells = new Array(sites.length);\n    d3_geom_voronoiBeaches = new d3_geom_voronoiRedBlackTree();\n    d3_geom_voronoiCircles = new d3_geom_voronoiRedBlackTree();\n    while (true) {\n      circle = d3_geom_voronoiFirstCircle;\n      if (site && (!circle || site.y < circle.y || site.y === circle.y && site.x < circle.x)) {\n        if (site.x !== x0 || site.y !== y0) {\n          d3_geom_voronoiCells[site.i] = new d3_geom_voronoiCell(site);\n          d3_geom_voronoiAddBeach(site);\n          x0 = site.x, y0 = site.y;\n        }\n        site = sites.pop();\n      } else if (circle) {\n        d3_geom_voronoiRemoveBeach(circle.arc);\n      } else {\n        break;\n      }\n    }\n    if (bbox) d3_geom_voronoiClipEdges(bbox), d3_geom_voronoiCloseCells(bbox);\n    var diagram = {\n      cells: d3_geom_voronoiCells,\n      edges: d3_geom_voronoiEdges\n    };\n    d3_geom_voronoiBeaches = d3_geom_voronoiCircles = d3_geom_voronoiEdges = d3_geom_voronoiCells = null;\n    return diagram;\n  }\n  function d3_geom_voronoiVertexOrder(a, b) {\n    return b.y - a.y || b.x - a.x;\n  }\n  d3.geom.voronoi = function(points) {\n    var x = d3_geom_pointX, y = d3_geom_pointY, fx = x, fy = y, clipExtent = d3_geom_voronoiClipExtent;\n    if (points) return voronoi(points);\n    function voronoi(data) {\n      var polygons = new Array(data.length), x0 = clipExtent[0][0], y0 = clipExtent[0][1], x1 = clipExtent[1][0], y1 = clipExtent[1][1];\n      d3_geom_voronoi(sites(data), clipExtent).cells.forEach(function(cell, i) {\n        var edges = cell.edges, site = cell.site, polygon = polygons[i] = edges.length ? edges.map(function(e) {\n          var s = e.start();\n          return [ s.x, s.y ];\n        }) : site.x >= x0 && site.x <= x1 && site.y >= y0 && site.y <= y1 ? [ [ x0, y1 ], [ x1, y1 ], [ x1, y0 ], [ x0, y0 ] ] : [];\n        polygon.point = data[i];\n      });\n      return polygons;\n    }\n    function sites(data) {\n      return data.map(function(d, i) {\n        return {\n          x: Math.round(fx(d, i) / ε) * ε,\n          y: Math.round(fy(d, i) / ε) * ε,\n          i: i\n        };\n      });\n    }\n    voronoi.links = function(data) {\n      return d3_geom_voronoi(sites(data)).edges.filter(function(edge) {\n        return edge.l && edge.r;\n      }).map(function(edge) {\n        return {\n          source: data[edge.l.i],\n          target: data[edge.r.i]\n        };\n      });\n    };\n    voronoi.triangles = function(data) {\n      var triangles = [];\n      d3_geom_voronoi(sites(data)).cells.forEach(function(cell, i) {\n        var site = cell.site, edges = cell.edges.sort(d3_geom_voronoiHalfEdgeOrder), j = -1, m = edges.length, e0, s0, e1 = edges[m - 1].edge, s1 = e1.l === site ? e1.r : e1.l;\n        while (++j < m) {\n          e0 = e1;\n          s0 = s1;\n          e1 = edges[j].edge;\n          s1 = e1.l === site ? e1.r : e1.l;\n          if (i < s0.i && i < s1.i && d3_geom_voronoiTriangleArea(site, s0, s1) < 0) {\n            triangles.push([ data[i], data[s0.i], data[s1.i] ]);\n          }\n        }\n      });\n      return triangles;\n    };\n    voronoi.x = function(_) {\n      return arguments.length ? (fx = d3_functor(x = _), voronoi) : x;\n    };\n    voronoi.y = function(_) {\n      return arguments.length ? (fy = d3_functor(y = _), voronoi) : y;\n    };\n    voronoi.clipExtent = function(_) {\n      if (!arguments.length) return clipExtent === d3_geom_voronoiClipExtent ? null : clipExtent;\n      clipExtent = _ == null ? d3_geom_voronoiClipExtent : _;\n      return voronoi;\n    };\n    voronoi.size = function(_) {\n      if (!arguments.length) return clipExtent === d3_geom_voronoiClipExtent ? null : clipExtent && clipExtent[1];\n      return voronoi.clipExtent(_ && [ [ 0, 0 ], _ ]);\n    };\n    return voronoi;\n  };\n  var d3_geom_voronoiClipExtent = [ [ -1e6, -1e6 ], [ 1e6, 1e6 ] ];\n  function d3_geom_voronoiTriangleArea(a, b, c) {\n    return (a.x - c.x) * (b.y - a.y) - (a.x - b.x) * (c.y - a.y);\n  }\n  d3.geom.delaunay = function(vertices) {\n    return d3.geom.voronoi().triangles(vertices);\n  };\n  d3.geom.quadtree = function(points, x1, y1, x2, y2) {\n    var x = d3_geom_pointX, y = d3_geom_pointY, compat;\n    if (compat = arguments.length) {\n      x = d3_geom_quadtreeCompatX;\n      y = d3_geom_quadtreeCompatY;\n      if (compat === 3) {\n        y2 = y1;\n        x2 = x1;\n        y1 = x1 = 0;\n      }\n      return quadtree(points);\n    }\n    function quadtree(data) {\n      var d, fx = d3_functor(x), fy = d3_functor(y), xs, ys, i, n, x1_, y1_, x2_, y2_;\n      if (x1 != null) {\n        x1_ = x1, y1_ = y1, x2_ = x2, y2_ = y2;\n      } else {\n        x2_ = y2_ = -(x1_ = y1_ = Infinity);\n        xs = [], ys = [];\n        n = data.length;\n        if (compat) for (i = 0; i < n; ++i) {\n          d = data[i];\n          if (d.x < x1_) x1_ = d.x;\n          if (d.y < y1_) y1_ = d.y;\n          if (d.x > x2_) x2_ = d.x;\n          if (d.y > y2_) y2_ = d.y;\n          xs.push(d.x);\n          ys.push(d.y);\n        } else for (i = 0; i < n; ++i) {\n          var x_ = +fx(d = data[i], i), y_ = +fy(d, i);\n          if (x_ < x1_) x1_ = x_;\n          if (y_ < y1_) y1_ = y_;\n          if (x_ > x2_) x2_ = x_;\n          if (y_ > y2_) y2_ = y_;\n          xs.push(x_);\n          ys.push(y_);\n        }\n      }\n      var dx = x2_ - x1_, dy = y2_ - y1_;\n      if (dx > dy) y2_ = y1_ + dx; else x2_ = x1_ + dy;\n      function insert(n, d, x, y, x1, y1, x2, y2) {\n        if (isNaN(x) || isNaN(y)) return;\n        if (n.leaf) {\n          var nx = n.x, ny = n.y;\n          if (nx != null) {\n            if (abs(nx - x) + abs(ny - y) < .01) {\n              insertChild(n, d, x, y, x1, y1, x2, y2);\n            } else {\n              var nPoint = n.point;\n              n.x = n.y = n.point = null;\n              insertChild(n, nPoint, nx, ny, x1, y1, x2, y2);\n              insertChild(n, d, x, y, x1, y1, x2, y2);\n            }\n          } else {\n            n.x = x, n.y = y, n.point = d;\n          }\n        } else {\n          insertChild(n, d, x, y, x1, y1, x2, y2);\n        }\n      }\n      function insertChild(n, d, x, y, x1, y1, x2, y2) {\n        var xm = (x1 + x2) * .5, ym = (y1 + y2) * .5, right = x >= xm, below = y >= ym, i = below << 1 | right;\n        n.leaf = false;\n        n = n.nodes[i] || (n.nodes[i] = d3_geom_quadtreeNode());\n        if (right) x1 = xm; else x2 = xm;\n        if (below) y1 = ym; else y2 = ym;\n        insert(n, d, x, y, x1, y1, x2, y2);\n      }\n      var root = d3_geom_quadtreeNode();\n      root.add = function(d) {\n        insert(root, d, +fx(d, ++i), +fy(d, i), x1_, y1_, x2_, y2_);\n      };\n      root.visit = function(f) {\n        d3_geom_quadtreeVisit(f, root, x1_, y1_, x2_, y2_);\n      };\n      root.find = function(point) {\n        return d3_geom_quadtreeFind(root, point[0], point[1], x1_, y1_, x2_, y2_);\n      };\n      i = -1;\n      if (x1 == null) {\n        while (++i < n) {\n          insert(root, data[i], xs[i], ys[i], x1_, y1_, x2_, y2_);\n        }\n        --i;\n      } else data.forEach(root.add);\n      xs = ys = data = d = null;\n      return root;\n    }\n    quadtree.x = function(_) {\n      return arguments.length ? (x = _, quadtree) : x;\n    };\n    quadtree.y = function(_) {\n      return arguments.length ? (y = _, quadtree) : y;\n    };\n    quadtree.extent = function(_) {\n      if (!arguments.length) return x1 == null ? null : [ [ x1, y1 ], [ x2, y2 ] ];\n      if (_ == null) x1 = y1 = x2 = y2 = null; else x1 = +_[0][0], y1 = +_[0][1], x2 = +_[1][0], \n      y2 = +_[1][1];\n      return quadtree;\n    };\n    quadtree.size = function(_) {\n      if (!arguments.length) return x1 == null ? null : [ x2 - x1, y2 - y1 ];\n      if (_ == null) x1 = y1 = x2 = y2 = null; else x1 = y1 = 0, x2 = +_[0], y2 = +_[1];\n      return quadtree;\n    };\n    return quadtree;\n  };\n  function d3_geom_quadtreeCompatX(d) {\n    return d.x;\n  }\n  function d3_geom_quadtreeCompatY(d) {\n    return d.y;\n  }\n  function d3_geom_quadtreeNode() {\n    return {\n      leaf: true,\n      nodes: [],\n      point: null,\n      x: null,\n      y: null\n    };\n  }\n  function d3_geom_quadtreeVisit(f, node, x1, y1, x2, y2) {\n    if (!f(node, x1, y1, x2, y2)) {\n      var sx = (x1 + x2) * .5, sy = (y1 + y2) * .5, children = node.nodes;\n      if (children[0]) d3_geom_quadtreeVisit(f, children[0], x1, y1, sx, sy);\n      if (children[1]) d3_geom_quadtreeVisit(f, children[1], sx, y1, x2, sy);\n      if (children[2]) d3_geom_quadtreeVisit(f, children[2], x1, sy, sx, y2);\n      if (children[3]) d3_geom_quadtreeVisit(f, children[3], sx, sy, x2, y2);\n    }\n  }\n  function d3_geom_quadtreeFind(root, x, y, x0, y0, x3, y3) {\n    var minDistance2 = Infinity, closestPoint;\n    (function find(node, x1, y1, x2, y2) {\n      if (x1 > x3 || y1 > y3 || x2 < x0 || y2 < y0) return;\n      if (point = node.point) {\n        var point, dx = x - node.x, dy = y - node.y, distance2 = dx * dx + dy * dy;\n        if (distance2 < minDistance2) {\n          var distance = Math.sqrt(minDistance2 = distance2);\n          x0 = x - distance, y0 = y - distance;\n          x3 = x + distance, y3 = y + distance;\n          closestPoint = point;\n        }\n      }\n      var children = node.nodes, xm = (x1 + x2) * .5, ym = (y1 + y2) * .5, right = x >= xm, below = y >= ym;\n      for (var i = below << 1 | right, j = i + 4; i < j; ++i) {\n        if (node = children[i & 3]) switch (i & 3) {\n         case 0:\n          find(node, x1, y1, xm, ym);\n          break;\n\n         case 1:\n          find(node, xm, y1, x2, ym);\n          break;\n\n         case 2:\n          find(node, x1, ym, xm, y2);\n          break;\n\n         case 3:\n          find(node, xm, ym, x2, y2);\n          break;\n        }\n      }\n    })(root, x0, y0, x3, y3);\n    return closestPoint;\n  }\n  d3.interpolateRgb = d3_interpolateRgb;\n  function d3_interpolateRgb(a, b) {\n    a = d3.rgb(a);\n    b = d3.rgb(b);\n    var ar = a.r, ag = a.g, ab = a.b, br = b.r - ar, bg = b.g - ag, bb = b.b - ab;\n    return function(t) {\n      return \"#\" + d3_rgb_hex(Math.round(ar + br * t)) + d3_rgb_hex(Math.round(ag + bg * t)) + d3_rgb_hex(Math.round(ab + bb * t));\n    };\n  }\n  d3.interpolateObject = d3_interpolateObject;\n  function d3_interpolateObject(a, b) {\n    var i = {}, c = {}, k;\n    for (k in a) {\n      if (k in b) {\n        i[k] = d3_interpolate(a[k], b[k]);\n      } else {\n        c[k] = a[k];\n      }\n    }\n    for (k in b) {\n      if (!(k in a)) {\n        c[k] = b[k];\n      }\n    }\n    return function(t) {\n      for (k in i) c[k] = i[k](t);\n      return c;\n    };\n  }\n  d3.interpolateNumber = d3_interpolateNumber;\n  function d3_interpolateNumber(a, b) {\n    a = +a, b = +b;\n    return function(t) {\n      return a * (1 - t) + b * t;\n    };\n  }\n  d3.interpolateString = d3_interpolateString;\n  function d3_interpolateString(a, b) {\n    var bi = d3_interpolate_numberA.lastIndex = d3_interpolate_numberB.lastIndex = 0, am, bm, bs, i = -1, s = [], q = [];\n    a = a + \"\", b = b + \"\";\n    while ((am = d3_interpolate_numberA.exec(a)) && (bm = d3_interpolate_numberB.exec(b))) {\n      if ((bs = bm.index) > bi) {\n        bs = b.slice(bi, bs);\n        if (s[i]) s[i] += bs; else s[++i] = bs;\n      }\n      if ((am = am[0]) === (bm = bm[0])) {\n        if (s[i]) s[i] += bm; else s[++i] = bm;\n      } else {\n        s[++i] = null;\n        q.push({\n          i: i,\n          x: d3_interpolateNumber(am, bm)\n        });\n      }\n      bi = d3_interpolate_numberB.lastIndex;\n    }\n    if (bi < b.length) {\n      bs = b.slice(bi);\n      if (s[i]) s[i] += bs; else s[++i] = bs;\n    }\n    return s.length < 2 ? q[0] ? (b = q[0].x, function(t) {\n      return b(t) + \"\";\n    }) : function() {\n      return b;\n    } : (b = q.length, function(t) {\n      for (var i = 0, o; i < b; ++i) s[(o = q[i]).i] = o.x(t);\n      return s.join(\"\");\n    });\n  }\n  var d3_interpolate_numberA = /[-+]?(?:\\d+\\.?\\d*|\\.?\\d+)(?:[eE][-+]?\\d+)?/g, d3_interpolate_numberB = new RegExp(d3_interpolate_numberA.source, \"g\");\n  d3.interpolate = d3_interpolate;\n  function d3_interpolate(a, b) {\n    var i = d3.interpolators.length, f;\n    while (--i >= 0 && !(f = d3.interpolators[i](a, b))) ;\n    return f;\n  }\n  d3.interpolators = [ function(a, b) {\n    var t = typeof b;\n    return (t === \"string\" ? d3_rgb_names.has(b.toLowerCase()) || /^(#|rgb\\(|hsl\\()/i.test(b) ? d3_interpolateRgb : d3_interpolateString : b instanceof d3_color ? d3_interpolateRgb : Array.isArray(b) ? d3_interpolateArray : t === \"object\" && isNaN(b) ? d3_interpolateObject : d3_interpolateNumber)(a, b);\n  } ];\n  d3.interpolateArray = d3_interpolateArray;\n  function d3_interpolateArray(a, b) {\n    var x = [], c = [], na = a.length, nb = b.length, n0 = Math.min(a.length, b.length), i;\n    for (i = 0; i < n0; ++i) x.push(d3_interpolate(a[i], b[i]));\n    for (;i < na; ++i) c[i] = a[i];\n    for (;i < nb; ++i) c[i] = b[i];\n    return function(t) {\n      for (i = 0; i < n0; ++i) c[i] = x[i](t);\n      return c;\n    };\n  }\n  var d3_ease_default = function() {\n    return d3_identity;\n  };\n  var d3_ease = d3.map({\n    linear: d3_ease_default,\n    poly: d3_ease_poly,\n    quad: function() {\n      return d3_ease_quad;\n    },\n    cubic: function() {\n      return d3_ease_cubic;\n    },\n    sin: function() {\n      return d3_ease_sin;\n    },\n    exp: function() {\n      return d3_ease_exp;\n    },\n    circle: function() {\n      return d3_ease_circle;\n    },\n    elastic: d3_ease_elastic,\n    back: d3_ease_back,\n    bounce: function() {\n      return d3_ease_bounce;\n    }\n  });\n  var d3_ease_mode = d3.map({\n    \"in\": d3_identity,\n    out: d3_ease_reverse,\n    \"in-out\": d3_ease_reflect,\n    \"out-in\": function(f) {\n      return d3_ease_reflect(d3_ease_reverse(f));\n    }\n  });\n  d3.ease = function(name) {\n    var i = name.indexOf(\"-\"), t = i >= 0 ? name.slice(0, i) : name, m = i >= 0 ? name.slice(i + 1) : \"in\";\n    t = d3_ease.get(t) || d3_ease_default;\n    m = d3_ease_mode.get(m) || d3_identity;\n    return d3_ease_clamp(m(t.apply(null, d3_arraySlice.call(arguments, 1))));\n  };\n  function d3_ease_clamp(f) {\n    return function(t) {\n      return t <= 0 ? 0 : t >= 1 ? 1 : f(t);\n    };\n  }\n  function d3_ease_reverse(f) {\n    return function(t) {\n      return 1 - f(1 - t);\n    };\n  }\n  function d3_ease_reflect(f) {\n    return function(t) {\n      return .5 * (t < .5 ? f(2 * t) : 2 - f(2 - 2 * t));\n    };\n  }\n  function d3_ease_quad(t) {\n    return t * t;\n  }\n  function d3_ease_cubic(t) {\n    return t * t * t;\n  }\n  function d3_ease_cubicInOut(t) {\n    if (t <= 0) return 0;\n    if (t >= 1) return 1;\n    var t2 = t * t, t3 = t2 * t;\n    return 4 * (t < .5 ? t3 : 3 * (t - t2) + t3 - .75);\n  }\n  function d3_ease_poly(e) {\n    return function(t) {\n      return Math.pow(t, e);\n    };\n  }\n  function d3_ease_sin(t) {\n    return 1 - Math.cos(t * halfπ);\n  }\n  function d3_ease_exp(t) {\n    return Math.pow(2, 10 * (t - 1));\n  }\n  function d3_ease_circle(t) {\n    return 1 - Math.sqrt(1 - t * t);\n  }\n  function d3_ease_elastic(a, p) {\n    var s;\n    if (arguments.length < 2) p = .45;\n    if (arguments.length) s = p / τ * Math.asin(1 / a); else a = 1, s = p / 4;\n    return function(t) {\n      return 1 + a * Math.pow(2, -10 * t) * Math.sin((t - s) * τ / p);\n    };\n  }\n  function d3_ease_back(s) {\n    if (!s) s = 1.70158;\n    return function(t) {\n      return t * t * ((s + 1) * t - s);\n    };\n  }\n  function d3_ease_bounce(t) {\n    return t < 1 / 2.75 ? 7.5625 * t * t : t < 2 / 2.75 ? 7.5625 * (t -= 1.5 / 2.75) * t + .75 : t < 2.5 / 2.75 ? 7.5625 * (t -= 2.25 / 2.75) * t + .9375 : 7.5625 * (t -= 2.625 / 2.75) * t + .984375;\n  }\n  d3.interpolateHcl = d3_interpolateHcl;\n  function d3_interpolateHcl(a, b) {\n    a = d3.hcl(a);\n    b = d3.hcl(b);\n    var ah = a.h, ac = a.c, al = a.l, bh = b.h - ah, bc = b.c - ac, bl = b.l - al;\n    if (isNaN(bc)) bc = 0, ac = isNaN(ac) ? b.c : ac;\n    if (isNaN(bh)) bh = 0, ah = isNaN(ah) ? b.h : ah; else if (bh > 180) bh -= 360; else if (bh < -180) bh += 360;\n    return function(t) {\n      return d3_hcl_lab(ah + bh * t, ac + bc * t, al + bl * t) + \"\";\n    };\n  }\n  d3.interpolateHsl = d3_interpolateHsl;\n  function d3_interpolateHsl(a, b) {\n    a = d3.hsl(a);\n    b = d3.hsl(b);\n    var ah = a.h, as = a.s, al = a.l, bh = b.h - ah, bs = b.s - as, bl = b.l - al;\n    if (isNaN(bs)) bs = 0, as = isNaN(as) ? b.s : as;\n    if (isNaN(bh)) bh = 0, ah = isNaN(ah) ? b.h : ah; else if (bh > 180) bh -= 360; else if (bh < -180) bh += 360;\n    return function(t) {\n      return d3_hsl_rgb(ah + bh * t, as + bs * t, al + bl * t) + \"\";\n    };\n  }\n  d3.interpolateLab = d3_interpolateLab;\n  function d3_interpolateLab(a, b) {\n    a = d3.lab(a);\n    b = d3.lab(b);\n    var al = a.l, aa = a.a, ab = a.b, bl = b.l - al, ba = b.a - aa, bb = b.b - ab;\n    return function(t) {\n      return d3_lab_rgb(al + bl * t, aa + ba * t, ab + bb * t) + \"\";\n    };\n  }\n  d3.interpolateRound = d3_interpolateRound;\n  function d3_interpolateRound(a, b) {\n    b -= a;\n    return function(t) {\n      return Math.round(a + b * t);\n    };\n  }\n  d3.transform = function(string) {\n    var g = d3_document.createElementNS(d3.ns.prefix.svg, \"g\");\n    return (d3.transform = function(string) {\n      if (string != null) {\n        g.setAttribute(\"transform\", string);\n        var t = g.transform.baseVal.consolidate();\n      }\n      return new d3_transform(t ? t.matrix : d3_transformIdentity);\n    })(string);\n  };\n  function d3_transform(m) {\n    var r0 = [ m.a, m.b ], r1 = [ m.c, m.d ], kx = d3_transformNormalize(r0), kz = d3_transformDot(r0, r1), ky = d3_transformNormalize(d3_transformCombine(r1, r0, -kz)) || 0;\n    if (r0[0] * r1[1] < r1[0] * r0[1]) {\n      r0[0] *= -1;\n      r0[1] *= -1;\n      kx *= -1;\n      kz *= -1;\n    }\n    this.rotate = (kx ? Math.atan2(r0[1], r0[0]) : Math.atan2(-r1[0], r1[1])) * d3_degrees;\n    this.translate = [ m.e, m.f ];\n    this.scale = [ kx, ky ];\n    this.skew = ky ? Math.atan2(kz, ky) * d3_degrees : 0;\n  }\n  d3_transform.prototype.toString = function() {\n    return \"translate(\" + this.translate + \")rotate(\" + this.rotate + \")skewX(\" + this.skew + \")scale(\" + this.scale + \")\";\n  };\n  function d3_transformDot(a, b) {\n    return a[0] * b[0] + a[1] * b[1];\n  }\n  function d3_transformNormalize(a) {\n    var k = Math.sqrt(d3_transformDot(a, a));\n    if (k) {\n      a[0] /= k;\n      a[1] /= k;\n    }\n    return k;\n  }\n  function d3_transformCombine(a, b, k) {\n    a[0] += k * b[0];\n    a[1] += k * b[1];\n    return a;\n  }\n  var d3_transformIdentity = {\n    a: 1,\n    b: 0,\n    c: 0,\n    d: 1,\n    e: 0,\n    f: 0\n  };\n  d3.interpolateTransform = d3_interpolateTransform;\n  function d3_interpolateTransformPop(s) {\n    return s.length ? s.pop() + \",\" : \"\";\n  }\n  function d3_interpolateTranslate(ta, tb, s, q) {\n    if (ta[0] !== tb[0] || ta[1] !== tb[1]) {\n      var i = s.push(\"translate(\", null, \",\", null, \")\");\n      q.push({\n        i: i - 4,\n        x: d3_interpolateNumber(ta[0], tb[0])\n      }, {\n        i: i - 2,\n        x: d3_interpolateNumber(ta[1], tb[1])\n      });\n    } else if (tb[0] || tb[1]) {\n      s.push(\"translate(\" + tb + \")\");\n    }\n  }\n  function d3_interpolateRotate(ra, rb, s, q) {\n    if (ra !== rb) {\n      if (ra - rb > 180) rb += 360; else if (rb - ra > 180) ra += 360;\n      q.push({\n        i: s.push(d3_interpolateTransformPop(s) + \"rotate(\", null, \")\") - 2,\n        x: d3_interpolateNumber(ra, rb)\n      });\n    } else if (rb) {\n      s.push(d3_interpolateTransformPop(s) + \"rotate(\" + rb + \")\");\n    }\n  }\n  function d3_interpolateSkew(wa, wb, s, q) {\n    if (wa !== wb) {\n      q.push({\n        i: s.push(d3_interpolateTransformPop(s) + \"skewX(\", null, \")\") - 2,\n        x: d3_interpolateNumber(wa, wb)\n      });\n    } else if (wb) {\n      s.push(d3_interpolateTransformPop(s) + \"skewX(\" + wb + \")\");\n    }\n  }\n  function d3_interpolateScale(ka, kb, s, q) {\n    if (ka[0] !== kb[0] || ka[1] !== kb[1]) {\n      var i = s.push(d3_interpolateTransformPop(s) + \"scale(\", null, \",\", null, \")\");\n      q.push({\n        i: i - 4,\n        x: d3_interpolateNumber(ka[0], kb[0])\n      }, {\n        i: i - 2,\n        x: d3_interpolateNumber(ka[1], kb[1])\n      });\n    } else if (kb[0] !== 1 || kb[1] !== 1) {\n      s.push(d3_interpolateTransformPop(s) + \"scale(\" + kb + \")\");\n    }\n  }\n  function d3_interpolateTransform(a, b) {\n    var s = [], q = [];\n    a = d3.transform(a), b = d3.transform(b);\n    d3_interpolateTranslate(a.translate, b.translate, s, q);\n    d3_interpolateRotate(a.rotate, b.rotate, s, q);\n    d3_interpolateSkew(a.skew, b.skew, s, q);\n    d3_interpolateScale(a.scale, b.scale, s, q);\n    a = b = null;\n    return function(t) {\n      var i = -1, n = q.length, o;\n      while (++i < n) s[(o = q[i]).i] = o.x(t);\n      return s.join(\"\");\n    };\n  }\n  function d3_uninterpolateNumber(a, b) {\n    b = (b -= a = +a) || 1 / b;\n    return function(x) {\n      return (x - a) / b;\n    };\n  }\n  function d3_uninterpolateClamp(a, b) {\n    b = (b -= a = +a) || 1 / b;\n    return function(x) {\n      return Math.max(0, Math.min(1, (x - a) / b));\n    };\n  }\n  d3.layout = {};\n  d3.layout.bundle = function() {\n    return function(links) {\n      var paths = [], i = -1, n = links.length;\n      while (++i < n) paths.push(d3_layout_bundlePath(links[i]));\n      return paths;\n    };\n  };\n  function d3_layout_bundlePath(link) {\n    var start = link.source, end = link.target, lca = d3_layout_bundleLeastCommonAncestor(start, end), points = [ start ];\n    while (start !== lca) {\n      start = start.parent;\n      points.push(start);\n    }\n    var k = points.length;\n    while (end !== lca) {\n      points.splice(k, 0, end);\n      end = end.parent;\n    }\n    return points;\n  }\n  function d3_layout_bundleAncestors(node) {\n    var ancestors = [], parent = node.parent;\n    while (parent != null) {\n      ancestors.push(node);\n      node = parent;\n      parent = parent.parent;\n    }\n    ancestors.push(node);\n    return ancestors;\n  }\n  function d3_layout_bundleLeastCommonAncestor(a, b) {\n    if (a === b) return a;\n    var aNodes = d3_layout_bundleAncestors(a), bNodes = d3_layout_bundleAncestors(b), aNode = aNodes.pop(), bNode = bNodes.pop(), sharedNode = null;\n    while (aNode === bNode) {\n      sharedNode = aNode;\n      aNode = aNodes.pop();\n      bNode = bNodes.pop();\n    }\n    return sharedNode;\n  }\n  d3.layout.chord = function() {\n    var chord = {}, chords, groups, matrix, n, padding = 0, sortGroups, sortSubgroups, sortChords;\n    function relayout() {\n      var subgroups = {}, groupSums = [], groupIndex = d3.range(n), subgroupIndex = [], k, x, x0, i, j;\n      chords = [];\n      groups = [];\n      k = 0, i = -1;\n      while (++i < n) {\n        x = 0, j = -1;\n        while (++j < n) {\n          x += matrix[i][j];\n        }\n        groupSums.push(x);\n        subgroupIndex.push(d3.range(n));\n        k += x;\n      }\n      if (sortGroups) {\n        groupIndex.sort(function(a, b) {\n          return sortGroups(groupSums[a], groupSums[b]);\n        });\n      }\n      if (sortSubgroups) {\n        subgroupIndex.forEach(function(d, i) {\n          d.sort(function(a, b) {\n            return sortSubgroups(matrix[i][a], matrix[i][b]);\n          });\n        });\n      }\n      k = (τ - padding * n) / k;\n      x = 0, i = -1;\n      while (++i < n) {\n        x0 = x, j = -1;\n        while (++j < n) {\n          var di = groupIndex[i], dj = subgroupIndex[di][j], v = matrix[di][dj], a0 = x, a1 = x += v * k;\n          subgroups[di + \"-\" + dj] = {\n            index: di,\n            subindex: dj,\n            startAngle: a0,\n            endAngle: a1,\n            value: v\n          };\n        }\n        groups[di] = {\n          index: di,\n          startAngle: x0,\n          endAngle: x,\n          value: groupSums[di]\n        };\n        x += padding;\n      }\n      i = -1;\n      while (++i < n) {\n        j = i - 1;\n        while (++j < n) {\n          var source = subgroups[i + \"-\" + j], target = subgroups[j + \"-\" + i];\n          if (source.value || target.value) {\n            chords.push(source.value < target.value ? {\n              source: target,\n              target: source\n            } : {\n              source: source,\n              target: target\n            });\n          }\n        }\n      }\n      if (sortChords) resort();\n    }\n    function resort() {\n      chords.sort(function(a, b) {\n        return sortChords((a.source.value + a.target.value) / 2, (b.source.value + b.target.value) / 2);\n      });\n    }\n    chord.matrix = function(x) {\n      if (!arguments.length) return matrix;\n      n = (matrix = x) && matrix.length;\n      chords = groups = null;\n      return chord;\n    };\n    chord.padding = function(x) {\n      if (!arguments.length) return padding;\n      padding = x;\n      chords = groups = null;\n      return chord;\n    };\n    chord.sortGroups = function(x) {\n      if (!arguments.length) return sortGroups;\n      sortGroups = x;\n      chords = groups = null;\n      return chord;\n    };\n    chord.sortSubgroups = function(x) {\n      if (!arguments.length) return sortSubgroups;\n      sortSubgroups = x;\n      chords = null;\n      return chord;\n    };\n    chord.sortChords = function(x) {\n      if (!arguments.length) return sortChords;\n      sortChords = x;\n      if (chords) resort();\n      return chord;\n    };\n    chord.chords = function() {\n      if (!chords) relayout();\n      return chords;\n    };\n    chord.groups = function() {\n      if (!groups) relayout();\n      return groups;\n    };\n    return chord;\n  };\n  d3.layout.force = function() {\n    var force = {}, event = d3.dispatch(\"start\", \"tick\", \"end\"), timer, size = [ 1, 1 ], drag, alpha, friction = .9, linkDistance = d3_layout_forceLinkDistance, linkStrength = d3_layout_forceLinkStrength, charge = -30, chargeDistance2 = d3_layout_forceChargeDistance2, gravity = .1, theta2 = .64, nodes = [], links = [], distances, strengths, charges;\n    function repulse(node) {\n      return function(quad, x1, _, x2) {\n        if (quad.point !== node) {\n          var dx = quad.cx - node.x, dy = quad.cy - node.y, dw = x2 - x1, dn = dx * dx + dy * dy;\n          if (dw * dw / theta2 < dn) {\n            if (dn < chargeDistance2) {\n              var k = quad.charge / dn;\n              node.px -= dx * k;\n              node.py -= dy * k;\n            }\n            return true;\n          }\n          if (quad.point && dn && dn < chargeDistance2) {\n            var k = quad.pointCharge / dn;\n            node.px -= dx * k;\n            node.py -= dy * k;\n          }\n        }\n        return !quad.charge;\n      };\n    }\n    force.tick = function() {\n      if ((alpha *= .99) < .005) {\n        timer = null;\n        event.end({\n          type: \"end\",\n          alpha: alpha = 0\n        });\n        return true;\n      }\n      var n = nodes.length, m = links.length, q, i, o, s, t, l, k, x, y;\n      for (i = 0; i < m; ++i) {\n        o = links[i];\n        s = o.source;\n        t = o.target;\n        x = t.x - s.x;\n        y = t.y - s.y;\n        if (l = x * x + y * y) {\n          l = alpha * strengths[i] * ((l = Math.sqrt(l)) - distances[i]) / l;\n          x *= l;\n          y *= l;\n          t.x -= x * (k = s.weight + t.weight ? s.weight / (s.weight + t.weight) : .5);\n          t.y -= y * k;\n          s.x += x * (k = 1 - k);\n          s.y += y * k;\n        }\n      }\n      if (k = alpha * gravity) {\n        x = size[0] / 2;\n        y = size[1] / 2;\n        i = -1;\n        if (k) while (++i < n) {\n          o = nodes[i];\n          o.x += (x - o.x) * k;\n          o.y += (y - o.y) * k;\n        }\n      }\n      if (charge) {\n        d3_layout_forceAccumulate(q = d3.geom.quadtree(nodes), alpha, charges);\n        i = -1;\n        while (++i < n) {\n          if (!(o = nodes[i]).fixed) {\n            q.visit(repulse(o));\n          }\n        }\n      }\n      i = -1;\n      while (++i < n) {\n        o = nodes[i];\n        if (o.fixed) {\n          o.x = o.px;\n          o.y = o.py;\n        } else {\n          o.x -= (o.px - (o.px = o.x)) * friction;\n          o.y -= (o.py - (o.py = o.y)) * friction;\n        }\n      }\n      event.tick({\n        type: \"tick\",\n        alpha: alpha\n      });\n    };\n    force.nodes = function(x) {\n      if (!arguments.length) return nodes;\n      nodes = x;\n      return force;\n    };\n    force.links = function(x) {\n      if (!arguments.length) return links;\n      links = x;\n      return force;\n    };\n    force.size = function(x) {\n      if (!arguments.length) return size;\n      size = x;\n      return force;\n    };\n    force.linkDistance = function(x) {\n      if (!arguments.length) return linkDistance;\n      linkDistance = typeof x === \"function\" ? x : +x;\n      return force;\n    };\n    force.distance = force.linkDistance;\n    force.linkStrength = function(x) {\n      if (!arguments.length) return linkStrength;\n      linkStrength = typeof x === \"function\" ? x : +x;\n      return force;\n    };\n    force.friction = function(x) {\n      if (!arguments.length) return friction;\n      friction = +x;\n      return force;\n    };\n    force.charge = function(x) {\n      if (!arguments.length) return charge;\n      charge = typeof x === \"function\" ? x : +x;\n      return force;\n    };\n    force.chargeDistance = function(x) {\n      if (!arguments.length) return Math.sqrt(chargeDistance2);\n      chargeDistance2 = x * x;\n      return force;\n    };\n    force.gravity = function(x) {\n      if (!arguments.length) return gravity;\n      gravity = +x;\n      return force;\n    };\n    force.theta = function(x) {\n      if (!arguments.length) return Math.sqrt(theta2);\n      theta2 = x * x;\n      return force;\n    };\n    force.alpha = function(x) {\n      if (!arguments.length) return alpha;\n      x = +x;\n      if (alpha) {\n        if (x > 0) {\n          alpha = x;\n        } else {\n          timer.c = null, timer.t = NaN, timer = null;\n          event.end({\n            type: \"end\",\n            alpha: alpha = 0\n          });\n        }\n      } else if (x > 0) {\n        event.start({\n          type: \"start\",\n          alpha: alpha = x\n        });\n        timer = d3_timer(force.tick);\n      }\n      return force;\n    };\n    force.start = function() {\n      var i, n = nodes.length, m = links.length, w = size[0], h = size[1], neighbors, o;\n      for (i = 0; i < n; ++i) {\n        (o = nodes[i]).index = i;\n        o.weight = 0;\n      }\n      for (i = 0; i < m; ++i) {\n        o = links[i];\n        if (typeof o.source == \"number\") o.source = nodes[o.source];\n        if (typeof o.target == \"number\") o.target = nodes[o.target];\n        ++o.source.weight;\n        ++o.target.weight;\n      }\n      for (i = 0; i < n; ++i) {\n        o = nodes[i];\n        if (isNaN(o.x)) o.x = position(\"x\", w);\n        if (isNaN(o.y)) o.y = position(\"y\", h);\n        if (isNaN(o.px)) o.px = o.x;\n        if (isNaN(o.py)) o.py = o.y;\n      }\n      distances = [];\n      if (typeof linkDistance === \"function\") for (i = 0; i < m; ++i) distances[i] = +linkDistance.call(this, links[i], i); else for (i = 0; i < m; ++i) distances[i] = linkDistance;\n      strengths = [];\n      if (typeof linkStrength === \"function\") for (i = 0; i < m; ++i) strengths[i] = +linkStrength.call(this, links[i], i); else for (i = 0; i < m; ++i) strengths[i] = linkStrength;\n      charges = [];\n      if (typeof charge === \"function\") for (i = 0; i < n; ++i) charges[i] = +charge.call(this, nodes[i], i); else for (i = 0; i < n; ++i) charges[i] = charge;\n      function position(dimension, size) {\n        if (!neighbors) {\n          neighbors = new Array(n);\n          for (j = 0; j < n; ++j) {\n            neighbors[j] = [];\n          }\n          for (j = 0; j < m; ++j) {\n            var o = links[j];\n            neighbors[o.source.index].push(o.target);\n            neighbors[o.target.index].push(o.source);\n          }\n        }\n        var candidates = neighbors[i], j = -1, l = candidates.length, x;\n        while (++j < l) if (!isNaN(x = candidates[j][dimension])) return x;\n        return Math.random() * size;\n      }\n      return force.resume();\n    };\n    force.resume = function() {\n      return force.alpha(.1);\n    };\n    force.stop = function() {\n      return force.alpha(0);\n    };\n    force.drag = function() {\n      if (!drag) drag = d3.behavior.drag().origin(d3_identity).on(\"dragstart.force\", d3_layout_forceDragstart).on(\"drag.force\", dragmove).on(\"dragend.force\", d3_layout_forceDragend);\n      if (!arguments.length) return drag;\n      this.on(\"mouseover.force\", d3_layout_forceMouseover).on(\"mouseout.force\", d3_layout_forceMouseout).call(drag);\n    };\n    function dragmove(d) {\n      d.px = d3.event.x, d.py = d3.event.y;\n      force.resume();\n    }\n    return d3.rebind(force, event, \"on\");\n  };\n  function d3_layout_forceDragstart(d) {\n    d.fixed |= 2;\n  }\n  function d3_layout_forceDragend(d) {\n    d.fixed &= ~6;\n  }\n  function d3_layout_forceMouseover(d) {\n    d.fixed |= 4;\n    d.px = d.x, d.py = d.y;\n  }\n  function d3_layout_forceMouseout(d) {\n    d.fixed &= ~4;\n  }\n  function d3_layout_forceAccumulate(quad, alpha, charges) {\n    var cx = 0, cy = 0;\n    quad.charge = 0;\n    if (!quad.leaf) {\n      var nodes = quad.nodes, n = nodes.length, i = -1, c;\n      while (++i < n) {\n        c = nodes[i];\n        if (c == null) continue;\n        d3_layout_forceAccumulate(c, alpha, charges);\n        quad.charge += c.charge;\n        cx += c.charge * c.cx;\n        cy += c.charge * c.cy;\n      }\n    }\n    if (quad.point) {\n      if (!quad.leaf) {\n        quad.point.x += Math.random() - .5;\n        quad.point.y += Math.random() - .5;\n      }\n      var k = alpha * charges[quad.point.index];\n      quad.charge += quad.pointCharge = k;\n      cx += k * quad.point.x;\n      cy += k * quad.point.y;\n    }\n    quad.cx = cx / quad.charge;\n    quad.cy = cy / quad.charge;\n  }\n  var d3_layout_forceLinkDistance = 20, d3_layout_forceLinkStrength = 1, d3_layout_forceChargeDistance2 = Infinity;\n  d3.layout.hierarchy = function() {\n    var sort = d3_layout_hierarchySort, children = d3_layout_hierarchyChildren, value = d3_layout_hierarchyValue;\n    function hierarchy(root) {\n      var stack = [ root ], nodes = [], node;\n      root.depth = 0;\n      while ((node = stack.pop()) != null) {\n        nodes.push(node);\n        if ((childs = children.call(hierarchy, node, node.depth)) && (n = childs.length)) {\n          var n, childs, child;\n          while (--n >= 0) {\n            stack.push(child = childs[n]);\n            child.parent = node;\n            child.depth = node.depth + 1;\n          }\n          if (value) node.value = 0;\n          node.children = childs;\n        } else {\n          if (value) node.value = +value.call(hierarchy, node, node.depth) || 0;\n          delete node.children;\n        }\n      }\n      d3_layout_hierarchyVisitAfter(root, function(node) {\n        var childs, parent;\n        if (sort && (childs = node.children)) childs.sort(sort);\n        if (value && (parent = node.parent)) parent.value += node.value;\n      });\n      return nodes;\n    }\n    hierarchy.sort = function(x) {\n      if (!arguments.length) return sort;\n      sort = x;\n      return hierarchy;\n    };\n    hierarchy.children = function(x) {\n      if (!arguments.length) return children;\n      children = x;\n      return hierarchy;\n    };\n    hierarchy.value = function(x) {\n      if (!arguments.length) return value;\n      value = x;\n      return hierarchy;\n    };\n    hierarchy.revalue = function(root) {\n      if (value) {\n        d3_layout_hierarchyVisitBefore(root, function(node) {\n          if (node.children) node.value = 0;\n        });\n        d3_layout_hierarchyVisitAfter(root, function(node) {\n          var parent;\n          if (!node.children) node.value = +value.call(hierarchy, node, node.depth) || 0;\n          if (parent = node.parent) parent.value += node.value;\n        });\n      }\n      return root;\n    };\n    return hierarchy;\n  };\n  function d3_layout_hierarchyRebind(object, hierarchy) {\n    d3.rebind(object, hierarchy, \"sort\", \"children\", \"value\");\n    object.nodes = object;\n    object.links = d3_layout_hierarchyLinks;\n    return object;\n  }\n  function d3_layout_hierarchyVisitBefore(node, callback) {\n    var nodes = [ node ];\n    while ((node = nodes.pop()) != null) {\n      callback(node);\n      if ((children = node.children) && (n = children.length)) {\n        var n, children;\n        while (--n >= 0) nodes.push(children[n]);\n      }\n    }\n  }\n  function d3_layout_hierarchyVisitAfter(node, callback) {\n    var nodes = [ node ], nodes2 = [];\n    while ((node = nodes.pop()) != null) {\n      nodes2.push(node);\n      if ((children = node.children) && (n = children.length)) {\n        var i = -1, n, children;\n        while (++i < n) nodes.push(children[i]);\n      }\n    }\n    while ((node = nodes2.pop()) != null) {\n      callback(node);\n    }\n  }\n  function d3_layout_hierarchyChildren(d) {\n    return d.children;\n  }\n  function d3_layout_hierarchyValue(d) {\n    return d.value;\n  }\n  function d3_layout_hierarchySort(a, b) {\n    return b.value - a.value;\n  }\n  function d3_layout_hierarchyLinks(nodes) {\n    return d3.merge(nodes.map(function(parent) {\n      return (parent.children || []).map(function(child) {\n        return {\n          source: parent,\n          target: child\n        };\n      });\n    }));\n  }\n  d3.layout.partition = function() {\n    var hierarchy = d3.layout.hierarchy(), size = [ 1, 1 ];\n    function position(node, x, dx, dy) {\n      var children = node.children;\n      node.x = x;\n      node.y = node.depth * dy;\n      node.dx = dx;\n      node.dy = dy;\n      if (children && (n = children.length)) {\n        var i = -1, n, c, d;\n        dx = node.value ? dx / node.value : 0;\n        while (++i < n) {\n          position(c = children[i], x, d = c.value * dx, dy);\n          x += d;\n        }\n      }\n    }\n    function depth(node) {\n      var children = node.children, d = 0;\n      if (children && (n = children.length)) {\n        var i = -1, n;\n        while (++i < n) d = Math.max(d, depth(children[i]));\n      }\n      return 1 + d;\n    }\n    function partition(d, i) {\n      var nodes = hierarchy.call(this, d, i);\n      position(nodes[0], 0, size[0], size[1] / depth(nodes[0]));\n      return nodes;\n    }\n    partition.size = function(x) {\n      if (!arguments.length) return size;\n      size = x;\n      return partition;\n    };\n    return d3_layout_hierarchyRebind(partition, hierarchy);\n  };\n  d3.layout.pie = function() {\n    var value = Number, sort = d3_layout_pieSortByValue, startAngle = 0, endAngle = τ, padAngle = 0;\n    function pie(data) {\n      var n = data.length, values = data.map(function(d, i) {\n        return +value.call(pie, d, i);\n      }), a = +(typeof startAngle === \"function\" ? startAngle.apply(this, arguments) : startAngle), da = (typeof endAngle === \"function\" ? endAngle.apply(this, arguments) : endAngle) - a, p = Math.min(Math.abs(da) / n, +(typeof padAngle === \"function\" ? padAngle.apply(this, arguments) : padAngle)), pa = p * (da < 0 ? -1 : 1), sum = d3.sum(values), k = sum ? (da - n * pa) / sum : 0, index = d3.range(n), arcs = [], v;\n      if (sort != null) index.sort(sort === d3_layout_pieSortByValue ? function(i, j) {\n        return values[j] - values[i];\n      } : function(i, j) {\n        return sort(data[i], data[j]);\n      });\n      index.forEach(function(i) {\n        arcs[i] = {\n          data: data[i],\n          value: v = values[i],\n          startAngle: a,\n          endAngle: a += v * k + pa,\n          padAngle: p\n        };\n      });\n      return arcs;\n    }\n    pie.value = function(_) {\n      if (!arguments.length) return value;\n      value = _;\n      return pie;\n    };\n    pie.sort = function(_) {\n      if (!arguments.length) return sort;\n      sort = _;\n      return pie;\n    };\n    pie.startAngle = function(_) {\n      if (!arguments.length) return startAngle;\n      startAngle = _;\n      return pie;\n    };\n    pie.endAngle = function(_) {\n      if (!arguments.length) return endAngle;\n      endAngle = _;\n      return pie;\n    };\n    pie.padAngle = function(_) {\n      if (!arguments.length) return padAngle;\n      padAngle = _;\n      return pie;\n    };\n    return pie;\n  };\n  var d3_layout_pieSortByValue = {};\n  d3.layout.stack = function() {\n    var values = d3_identity, order = d3_layout_stackOrderDefault, offset = d3_layout_stackOffsetZero, out = d3_layout_stackOut, x = d3_layout_stackX, y = d3_layout_stackY;\n    function stack(data, index) {\n      if (!(n = data.length)) return data;\n      var series = data.map(function(d, i) {\n        return values.call(stack, d, i);\n      });\n      var points = series.map(function(d) {\n        return d.map(function(v, i) {\n          return [ x.call(stack, v, i), y.call(stack, v, i) ];\n        });\n      });\n      var orders = order.call(stack, points, index);\n      series = d3.permute(series, orders);\n      points = d3.permute(points, orders);\n      var offsets = offset.call(stack, points, index);\n      var m = series[0].length, n, i, j, o;\n      for (j = 0; j < m; ++j) {\n        out.call(stack, series[0][j], o = offsets[j], points[0][j][1]);\n        for (i = 1; i < n; ++i) {\n          out.call(stack, series[i][j], o += points[i - 1][j][1], points[i][j][1]);\n        }\n      }\n      return data;\n    }\n    stack.values = function(x) {\n      if (!arguments.length) return values;\n      values = x;\n      return stack;\n    };\n    stack.order = function(x) {\n      if (!arguments.length) return order;\n      order = typeof x === \"function\" ? x : d3_layout_stackOrders.get(x) || d3_layout_stackOrderDefault;\n      return stack;\n    };\n    stack.offset = function(x) {\n      if (!arguments.length) return offset;\n      offset = typeof x === \"function\" ? x : d3_layout_stackOffsets.get(x) || d3_layout_stackOffsetZero;\n      return stack;\n    };\n    stack.x = function(z) {\n      if (!arguments.length) return x;\n      x = z;\n      return stack;\n    };\n    stack.y = function(z) {\n      if (!arguments.length) return y;\n      y = z;\n      return stack;\n    };\n    stack.out = function(z) {\n      if (!arguments.length) return out;\n      out = z;\n      return stack;\n    };\n    return stack;\n  };\n  function d3_layout_stackX(d) {\n    return d.x;\n  }\n  function d3_layout_stackY(d) {\n    return d.y;\n  }\n  function d3_layout_stackOut(d, y0, y) {\n    d.y0 = y0;\n    d.y = y;\n  }\n  var d3_layout_stackOrders = d3.map({\n    \"inside-out\": function(data) {\n      var n = data.length, i, j, max = data.map(d3_layout_stackMaxIndex), sums = data.map(d3_layout_stackReduceSum), index = d3.range(n).sort(function(a, b) {\n        return max[a] - max[b];\n      }), top = 0, bottom = 0, tops = [], bottoms = [];\n      for (i = 0; i < n; ++i) {\n        j = index[i];\n        if (top < bottom) {\n          top += sums[j];\n          tops.push(j);\n        } else {\n          bottom += sums[j];\n          bottoms.push(j);\n        }\n      }\n      return bottoms.reverse().concat(tops);\n    },\n    reverse: function(data) {\n      return d3.range(data.length).reverse();\n    },\n    \"default\": d3_layout_stackOrderDefault\n  });\n  var d3_layout_stackOffsets = d3.map({\n    silhouette: function(data) {\n      var n = data.length, m = data[0].length, sums = [], max = 0, i, j, o, y0 = [];\n      for (j = 0; j < m; ++j) {\n        for (i = 0, o = 0; i < n; i++) o += data[i][j][1];\n        if (o > max) max = o;\n        sums.push(o);\n      }\n      for (j = 0; j < m; ++j) {\n        y0[j] = (max - sums[j]) / 2;\n      }\n      return y0;\n    },\n    wiggle: function(data) {\n      var n = data.length, x = data[0], m = x.length, i, j, k, s1, s2, s3, dx, o, o0, y0 = [];\n      y0[0] = o = o0 = 0;\n      for (j = 1; j < m; ++j) {\n        for (i = 0, s1 = 0; i < n; ++i) s1 += data[i][j][1];\n        for (i = 0, s2 = 0, dx = x[j][0] - x[j - 1][0]; i < n; ++i) {\n          for (k = 0, s3 = (data[i][j][1] - data[i][j - 1][1]) / (2 * dx); k < i; ++k) {\n            s3 += (data[k][j][1] - data[k][j - 1][1]) / dx;\n          }\n          s2 += s3 * data[i][j][1];\n        }\n        y0[j] = o -= s1 ? s2 / s1 * dx : 0;\n        if (o < o0) o0 = o;\n      }\n      for (j = 0; j < m; ++j) y0[j] -= o0;\n      return y0;\n    },\n    expand: function(data) {\n      var n = data.length, m = data[0].length, k = 1 / n, i, j, o, y0 = [];\n      for (j = 0; j < m; ++j) {\n        for (i = 0, o = 0; i < n; i++) o += data[i][j][1];\n        if (o) for (i = 0; i < n; i++) data[i][j][1] /= o; else for (i = 0; i < n; i++) data[i][j][1] = k;\n      }\n      for (j = 0; j < m; ++j) y0[j] = 0;\n      return y0;\n    },\n    zero: d3_layout_stackOffsetZero\n  });\n  function d3_layout_stackOrderDefault(data) {\n    return d3.range(data.length);\n  }\n  function d3_layout_stackOffsetZero(data) {\n    var j = -1, m = data[0].length, y0 = [];\n    while (++j < m) y0[j] = 0;\n    return y0;\n  }\n  function d3_layout_stackMaxIndex(array) {\n    var i = 1, j = 0, v = array[0][1], k, n = array.length;\n    for (;i < n; ++i) {\n      if ((k = array[i][1]) > v) {\n        j = i;\n        v = k;\n      }\n    }\n    return j;\n  }\n  function d3_layout_stackReduceSum(d) {\n    return d.reduce(d3_layout_stackSum, 0);\n  }\n  function d3_layout_stackSum(p, d) {\n    return p + d[1];\n  }\n  d3.layout.histogram = function() {\n    var frequency = true, valuer = Number, ranger = d3_layout_histogramRange, binner = d3_layout_histogramBinSturges;\n    function histogram(data, i) {\n      var bins = [], values = data.map(valuer, this), range = ranger.call(this, values, i), thresholds = binner.call(this, range, values, i), bin, i = -1, n = values.length, m = thresholds.length - 1, k = frequency ? 1 : 1 / n, x;\n      while (++i < m) {\n        bin = bins[i] = [];\n        bin.dx = thresholds[i + 1] - (bin.x = thresholds[i]);\n        bin.y = 0;\n      }\n      if (m > 0) {\n        i = -1;\n        while (++i < n) {\n          x = values[i];\n          if (x >= range[0] && x <= range[1]) {\n            bin = bins[d3.bisect(thresholds, x, 1, m) - 1];\n            bin.y += k;\n            bin.push(data[i]);\n          }\n        }\n      }\n      return bins;\n    }\n    histogram.value = function(x) {\n      if (!arguments.length) return valuer;\n      valuer = x;\n      return histogram;\n    };\n    histogram.range = function(x) {\n      if (!arguments.length) return ranger;\n      ranger = d3_functor(x);\n      return histogram;\n    };\n    histogram.bins = function(x) {\n      if (!arguments.length) return binner;\n      binner = typeof x === \"number\" ? function(range) {\n        return d3_layout_histogramBinFixed(range, x);\n      } : d3_functor(x);\n      return histogram;\n    };\n    histogram.frequency = function(x) {\n      if (!arguments.length) return frequency;\n      frequency = !!x;\n      return histogram;\n    };\n    return histogram;\n  };\n  function d3_layout_histogramBinSturges(range, values) {\n    return d3_layout_histogramBinFixed(range, Math.ceil(Math.log(values.length) / Math.LN2 + 1));\n  }\n  function d3_layout_histogramBinFixed(range, n) {\n    var x = -1, b = +range[0], m = (range[1] - b) / n, f = [];\n    while (++x <= n) f[x] = m * x + b;\n    return f;\n  }\n  function d3_layout_histogramRange(values) {\n    return [ d3.min(values), d3.max(values) ];\n  }\n  d3.layout.pack = function() {\n    var hierarchy = d3.layout.hierarchy().sort(d3_layout_packSort), padding = 0, size = [ 1, 1 ], radius;\n    function pack(d, i) {\n      var nodes = hierarchy.call(this, d, i), root = nodes[0], w = size[0], h = size[1], r = radius == null ? Math.sqrt : typeof radius === \"function\" ? radius : function() {\n        return radius;\n      };\n      root.x = root.y = 0;\n      d3_layout_hierarchyVisitAfter(root, function(d) {\n        d.r = +r(d.value);\n      });\n      d3_layout_hierarchyVisitAfter(root, d3_layout_packSiblings);\n      if (padding) {\n        var dr = padding * (radius ? 1 : Math.max(2 * root.r / w, 2 * root.r / h)) / 2;\n        d3_layout_hierarchyVisitAfter(root, function(d) {\n          d.r += dr;\n        });\n        d3_layout_hierarchyVisitAfter(root, d3_layout_packSiblings);\n        d3_layout_hierarchyVisitAfter(root, function(d) {\n          d.r -= dr;\n        });\n      }\n      d3_layout_packTransform(root, w / 2, h / 2, radius ? 1 : 1 / Math.max(2 * root.r / w, 2 * root.r / h));\n      return nodes;\n    }\n    pack.size = function(_) {\n      if (!arguments.length) return size;\n      size = _;\n      return pack;\n    };\n    pack.radius = function(_) {\n      if (!arguments.length) return radius;\n      radius = _ == null || typeof _ === \"function\" ? _ : +_;\n      return pack;\n    };\n    pack.padding = function(_) {\n      if (!arguments.length) return padding;\n      padding = +_;\n      return pack;\n    };\n    return d3_layout_hierarchyRebind(pack, hierarchy);\n  };\n  function d3_layout_packSort(a, b) {\n    return a.value - b.value;\n  }\n  function d3_layout_packInsert(a, b) {\n    var c = a._pack_next;\n    a._pack_next = b;\n    b._pack_prev = a;\n    b._pack_next = c;\n    c._pack_prev = b;\n  }\n  function d3_layout_packSplice(a, b) {\n    a._pack_next = b;\n    b._pack_prev = a;\n  }\n  function d3_layout_packIntersects(a, b) {\n    var dx = b.x - a.x, dy = b.y - a.y, dr = a.r + b.r;\n    return .999 * dr * dr > dx * dx + dy * dy;\n  }\n  function d3_layout_packSiblings(node) {\n    if (!(nodes = node.children) || !(n = nodes.length)) return;\n    var nodes, xMin = Infinity, xMax = -Infinity, yMin = Infinity, yMax = -Infinity, a, b, c, i, j, k, n;\n    function bound(node) {\n      xMin = Math.min(node.x - node.r, xMin);\n      xMax = Math.max(node.x + node.r, xMax);\n      yMin = Math.min(node.y - node.r, yMin);\n      yMax = Math.max(node.y + node.r, yMax);\n    }\n    nodes.forEach(d3_layout_packLink);\n    a = nodes[0];\n    a.x = -a.r;\n    a.y = 0;\n    bound(a);\n    if (n > 1) {\n      b = nodes[1];\n      b.x = b.r;\n      b.y = 0;\n      bound(b);\n      if (n > 2) {\n        c = nodes[2];\n        d3_layout_packPlace(a, b, c);\n        bound(c);\n        d3_layout_packInsert(a, c);\n        a._pack_prev = c;\n        d3_layout_packInsert(c, b);\n        b = a._pack_next;\n        for (i = 3; i < n; i++) {\n          d3_layout_packPlace(a, b, c = nodes[i]);\n          var isect = 0, s1 = 1, s2 = 1;\n          for (j = b._pack_next; j !== b; j = j._pack_next, s1++) {\n            if (d3_layout_packIntersects(j, c)) {\n              isect = 1;\n              break;\n            }\n          }\n          if (isect == 1) {\n            for (k = a._pack_prev; k !== j._pack_prev; k = k._pack_prev, s2++) {\n              if (d3_layout_packIntersects(k, c)) {\n                break;\n              }\n            }\n          }\n          if (isect) {\n            if (s1 < s2 || s1 == s2 && b.r < a.r) d3_layout_packSplice(a, b = j); else d3_layout_packSplice(a = k, b);\n            i--;\n          } else {\n            d3_layout_packInsert(a, c);\n            b = c;\n            bound(c);\n          }\n        }\n      }\n    }\n    var cx = (xMin + xMax) / 2, cy = (yMin + yMax) / 2, cr = 0;\n    for (i = 0; i < n; i++) {\n      c = nodes[i];\n      c.x -= cx;\n      c.y -= cy;\n      cr = Math.max(cr, c.r + Math.sqrt(c.x * c.x + c.y * c.y));\n    }\n    node.r = cr;\n    nodes.forEach(d3_layout_packUnlink);\n  }\n  function d3_layout_packLink(node) {\n    node._pack_next = node._pack_prev = node;\n  }\n  function d3_layout_packUnlink(node) {\n    delete node._pack_next;\n    delete node._pack_prev;\n  }\n  function d3_layout_packTransform(node, x, y, k) {\n    var children = node.children;\n    node.x = x += k * node.x;\n    node.y = y += k * node.y;\n    node.r *= k;\n    if (children) {\n      var i = -1, n = children.length;\n      while (++i < n) d3_layout_packTransform(children[i], x, y, k);\n    }\n  }\n  function d3_layout_packPlace(a, b, c) {\n    var db = a.r + c.r, dx = b.x - a.x, dy = b.y - a.y;\n    if (db && (dx || dy)) {\n      var da = b.r + c.r, dc = dx * dx + dy * dy;\n      da *= da;\n      db *= db;\n      var x = .5 + (db - da) / (2 * dc), y = Math.sqrt(Math.max(0, 2 * da * (db + dc) - (db -= dc) * db - da * da)) / (2 * dc);\n      c.x = a.x + x * dx + y * dy;\n      c.y = a.y + x * dy - y * dx;\n    } else {\n      c.x = a.x + db;\n      c.y = a.y;\n    }\n  }\n  d3.layout.tree = function() {\n    var hierarchy = d3.layout.hierarchy().sort(null).value(null), separation = d3_layout_treeSeparation, size = [ 1, 1 ], nodeSize = null;\n    function tree(d, i) {\n      var nodes = hierarchy.call(this, d, i), root0 = nodes[0], root1 = wrapTree(root0);\n      d3_layout_hierarchyVisitAfter(root1, firstWalk), root1.parent.m = -root1.z;\n      d3_layout_hierarchyVisitBefore(root1, secondWalk);\n      if (nodeSize) d3_layout_hierarchyVisitBefore(root0, sizeNode); else {\n        var left = root0, right = root0, bottom = root0;\n        d3_layout_hierarchyVisitBefore(root0, function(node) {\n          if (node.x < left.x) left = node;\n          if (node.x > right.x) right = node;\n          if (node.depth > bottom.depth) bottom = node;\n        });\n        var tx = separation(left, right) / 2 - left.x, kx = size[0] / (right.x + separation(right, left) / 2 + tx), ky = size[1] / (bottom.depth || 1);\n        d3_layout_hierarchyVisitBefore(root0, function(node) {\n          node.x = (node.x + tx) * kx;\n          node.y = node.depth * ky;\n        });\n      }\n      return nodes;\n    }\n    function wrapTree(root0) {\n      var root1 = {\n        A: null,\n        children: [ root0 ]\n      }, queue = [ root1 ], node1;\n      while ((node1 = queue.pop()) != null) {\n        for (var children = node1.children, child, i = 0, n = children.length; i < n; ++i) {\n          queue.push((children[i] = child = {\n            _: children[i],\n            parent: node1,\n            children: (child = children[i].children) && child.slice() || [],\n            A: null,\n            a: null,\n            z: 0,\n            m: 0,\n            c: 0,\n            s: 0,\n            t: null,\n            i: i\n          }).a = child);\n        }\n      }\n      return root1.children[0];\n    }\n    function firstWalk(v) {\n      var children = v.children, siblings = v.parent.children, w = v.i ? siblings[v.i - 1] : null;\n      if (children.length) {\n        d3_layout_treeShift(v);\n        var midpoint = (children[0].z + children[children.length - 1].z) / 2;\n        if (w) {\n          v.z = w.z + separation(v._, w._);\n          v.m = v.z - midpoint;\n        } else {\n          v.z = midpoint;\n        }\n      } else if (w) {\n        v.z = w.z + separation(v._, w._);\n      }\n      v.parent.A = apportion(v, w, v.parent.A || siblings[0]);\n    }\n    function secondWalk(v) {\n      v._.x = v.z + v.parent.m;\n      v.m += v.parent.m;\n    }\n    function apportion(v, w, ancestor) {\n      if (w) {\n        var vip = v, vop = v, vim = w, vom = vip.parent.children[0], sip = vip.m, sop = vop.m, sim = vim.m, som = vom.m, shift;\n        while (vim = d3_layout_treeRight(vim), vip = d3_layout_treeLeft(vip), vim && vip) {\n          vom = d3_layout_treeLeft(vom);\n          vop = d3_layout_treeRight(vop);\n          vop.a = v;\n          shift = vim.z + sim - vip.z - sip + separation(vim._, vip._);\n          if (shift > 0) {\n            d3_layout_treeMove(d3_layout_treeAncestor(vim, v, ancestor), v, shift);\n            sip += shift;\n            sop += shift;\n          }\n          sim += vim.m;\n          sip += vip.m;\n          som += vom.m;\n          sop += vop.m;\n        }\n        if (vim && !d3_layout_treeRight(vop)) {\n          vop.t = vim;\n          vop.m += sim - sop;\n        }\n        if (vip && !d3_layout_treeLeft(vom)) {\n          vom.t = vip;\n          vom.m += sip - som;\n          ancestor = v;\n        }\n      }\n      return ancestor;\n    }\n    function sizeNode(node) {\n      node.x *= size[0];\n      node.y = node.depth * size[1];\n    }\n    tree.separation = function(x) {\n      if (!arguments.length) return separation;\n      separation = x;\n      return tree;\n    };\n    tree.size = function(x) {\n      if (!arguments.length) return nodeSize ? null : size;\n      nodeSize = (size = x) == null ? sizeNode : null;\n      return tree;\n    };\n    tree.nodeSize = function(x) {\n      if (!arguments.length) return nodeSize ? size : null;\n      nodeSize = (size = x) == null ? null : sizeNode;\n      return tree;\n    };\n    return d3_layout_hierarchyRebind(tree, hierarchy);\n  };\n  function d3_layout_treeSeparation(a, b) {\n    return a.parent == b.parent ? 1 : 2;\n  }\n  function d3_layout_treeLeft(v) {\n    var children = v.children;\n    return children.length ? children[0] : v.t;\n  }\n  function d3_layout_treeRight(v) {\n    var children = v.children, n;\n    return (n = children.length) ? children[n - 1] : v.t;\n  }\n  function d3_layout_treeMove(wm, wp, shift) {\n    var change = shift / (wp.i - wm.i);\n    wp.c -= change;\n    wp.s += shift;\n    wm.c += change;\n    wp.z += shift;\n    wp.m += shift;\n  }\n  function d3_layout_treeShift(v) {\n    var shift = 0, change = 0, children = v.children, i = children.length, w;\n    while (--i >= 0) {\n      w = children[i];\n      w.z += shift;\n      w.m += shift;\n      shift += w.s + (change += w.c);\n    }\n  }\n  function d3_layout_treeAncestor(vim, v, ancestor) {\n    return vim.a.parent === v.parent ? vim.a : ancestor;\n  }\n  d3.layout.cluster = function() {\n    var hierarchy = d3.layout.hierarchy().sort(null).value(null), separation = d3_layout_treeSeparation, size = [ 1, 1 ], nodeSize = false;\n    function cluster(d, i) {\n      var nodes = hierarchy.call(this, d, i), root = nodes[0], previousNode, x = 0;\n      d3_layout_hierarchyVisitAfter(root, function(node) {\n        var children = node.children;\n        if (children && children.length) {\n          node.x = d3_layout_clusterX(children);\n          node.y = d3_layout_clusterY(children);\n        } else {\n          node.x = previousNode ? x += separation(node, previousNode) : 0;\n          node.y = 0;\n          previousNode = node;\n        }\n      });\n      var left = d3_layout_clusterLeft(root), right = d3_layout_clusterRight(root), x0 = left.x - separation(left, right) / 2, x1 = right.x + separation(right, left) / 2;\n      d3_layout_hierarchyVisitAfter(root, nodeSize ? function(node) {\n        node.x = (node.x - root.x) * size[0];\n        node.y = (root.y - node.y) * size[1];\n      } : function(node) {\n        node.x = (node.x - x0) / (x1 - x0) * size[0];\n        node.y = (1 - (root.y ? node.y / root.y : 1)) * size[1];\n      });\n      return nodes;\n    }\n    cluster.separation = function(x) {\n      if (!arguments.length) return separation;\n      separation = x;\n      return cluster;\n    };\n    cluster.size = function(x) {\n      if (!arguments.length) return nodeSize ? null : size;\n      nodeSize = (size = x) == null;\n      return cluster;\n    };\n    cluster.nodeSize = function(x) {\n      if (!arguments.length) return nodeSize ? size : null;\n      nodeSize = (size = x) != null;\n      return cluster;\n    };\n    return d3_layout_hierarchyRebind(cluster, hierarchy);\n  };\n  function d3_layout_clusterY(children) {\n    return 1 + d3.max(children, function(child) {\n      return child.y;\n    });\n  }\n  function d3_layout_clusterX(children) {\n    return children.reduce(function(x, child) {\n      return x + child.x;\n    }, 0) / children.length;\n  }\n  function d3_layout_clusterLeft(node) {\n    var children = node.children;\n    return children && children.length ? d3_layout_clusterLeft(children[0]) : node;\n  }\n  function d3_layout_clusterRight(node) {\n    var children = node.children, n;\n    return children && (n = children.length) ? d3_layout_clusterRight(children[n - 1]) : node;\n  }\n  d3.layout.treemap = function() {\n    var hierarchy = d3.layout.hierarchy(), round = Math.round, size = [ 1, 1 ], padding = null, pad = d3_layout_treemapPadNull, sticky = false, stickies, mode = \"squarify\", ratio = .5 * (1 + Math.sqrt(5));\n    function scale(children, k) {\n      var i = -1, n = children.length, child, area;\n      while (++i < n) {\n        area = (child = children[i]).value * (k < 0 ? 0 : k);\n        child.area = isNaN(area) || area <= 0 ? 0 : area;\n      }\n    }\n    function squarify(node) {\n      var children = node.children;\n      if (children && children.length) {\n        var rect = pad(node), row = [], remaining = children.slice(), child, best = Infinity, score, u = mode === \"slice\" ? rect.dx : mode === \"dice\" ? rect.dy : mode === \"slice-dice\" ? node.depth & 1 ? rect.dy : rect.dx : Math.min(rect.dx, rect.dy), n;\n        scale(remaining, rect.dx * rect.dy / node.value);\n        row.area = 0;\n        while ((n = remaining.length) > 0) {\n          row.push(child = remaining[n - 1]);\n          row.area += child.area;\n          if (mode !== \"squarify\" || (score = worst(row, u)) <= best) {\n            remaining.pop();\n            best = score;\n          } else {\n            row.area -= row.pop().area;\n            position(row, u, rect, false);\n            u = Math.min(rect.dx, rect.dy);\n            row.length = row.area = 0;\n            best = Infinity;\n          }\n        }\n        if (row.length) {\n          position(row, u, rect, true);\n          row.length = row.area = 0;\n        }\n        children.forEach(squarify);\n      }\n    }\n    function stickify(node) {\n      var children = node.children;\n      if (children && children.length) {\n        var rect = pad(node), remaining = children.slice(), child, row = [];\n        scale(remaining, rect.dx * rect.dy / node.value);\n        row.area = 0;\n        while (child = remaining.pop()) {\n          row.push(child);\n          row.area += child.area;\n          if (child.z != null) {\n            position(row, child.z ? rect.dx : rect.dy, rect, !remaining.length);\n            row.length = row.area = 0;\n          }\n        }\n        children.forEach(stickify);\n      }\n    }\n    function worst(row, u) {\n      var s = row.area, r, rmax = 0, rmin = Infinity, i = -1, n = row.length;\n      while (++i < n) {\n        if (!(r = row[i].area)) continue;\n        if (r < rmin) rmin = r;\n        if (r > rmax) rmax = r;\n      }\n      s *= s;\n      u *= u;\n      return s ? Math.max(u * rmax * ratio / s, s / (u * rmin * ratio)) : Infinity;\n    }\n    function position(row, u, rect, flush) {\n      var i = -1, n = row.length, x = rect.x, y = rect.y, v = u ? round(row.area / u) : 0, o;\n      if (u == rect.dx) {\n        if (flush || v > rect.dy) v = rect.dy;\n        while (++i < n) {\n          o = row[i];\n          o.x = x;\n          o.y = y;\n          o.dy = v;\n          x += o.dx = Math.min(rect.x + rect.dx - x, v ? round(o.area / v) : 0);\n        }\n        o.z = true;\n        o.dx += rect.x + rect.dx - x;\n        rect.y += v;\n        rect.dy -= v;\n      } else {\n        if (flush || v > rect.dx) v = rect.dx;\n        while (++i < n) {\n          o = row[i];\n          o.x = x;\n          o.y = y;\n          o.dx = v;\n          y += o.dy = Math.min(rect.y + rect.dy - y, v ? round(o.area / v) : 0);\n        }\n        o.z = false;\n        o.dy += rect.y + rect.dy - y;\n        rect.x += v;\n        rect.dx -= v;\n      }\n    }\n    function treemap(d) {\n      var nodes = stickies || hierarchy(d), root = nodes[0];\n      root.x = root.y = 0;\n      if (root.value) root.dx = size[0], root.dy = size[1]; else root.dx = root.dy = 0;\n      if (stickies) hierarchy.revalue(root);\n      scale([ root ], root.dx * root.dy / root.value);\n      (stickies ? stickify : squarify)(root);\n      if (sticky) stickies = nodes;\n      return nodes;\n    }\n    treemap.size = function(x) {\n      if (!arguments.length) return size;\n      size = x;\n      return treemap;\n    };\n    treemap.padding = function(x) {\n      if (!arguments.length) return padding;\n      function padFunction(node) {\n        var p = x.call(treemap, node, node.depth);\n        return p == null ? d3_layout_treemapPadNull(node) : d3_layout_treemapPad(node, typeof p === \"number\" ? [ p, p, p, p ] : p);\n      }\n      function padConstant(node) {\n        return d3_layout_treemapPad(node, x);\n      }\n      var type;\n      pad = (padding = x) == null ? d3_layout_treemapPadNull : (type = typeof x) === \"function\" ? padFunction : type === \"number\" ? (x = [ x, x, x, x ], \n      padConstant) : padConstant;\n      return treemap;\n    };\n    treemap.round = function(x) {\n      if (!arguments.length) return round != Number;\n      round = x ? Math.round : Number;\n      return treemap;\n    };\n    treemap.sticky = function(x) {\n      if (!arguments.length) return sticky;\n      sticky = x;\n      stickies = null;\n      return treemap;\n    };\n    treemap.ratio = function(x) {\n      if (!arguments.length) return ratio;\n      ratio = x;\n      return treemap;\n    };\n    treemap.mode = function(x) {\n      if (!arguments.length) return mode;\n      mode = x + \"\";\n      return treemap;\n    };\n    return d3_layout_hierarchyRebind(treemap, hierarchy);\n  };\n  function d3_layout_treemapPadNull(node) {\n    return {\n      x: node.x,\n      y: node.y,\n      dx: node.dx,\n      dy: node.dy\n    };\n  }\n  function d3_layout_treemapPad(node, padding) {\n    var x = node.x + padding[3], y = node.y + padding[0], dx = node.dx - padding[1] - padding[3], dy = node.dy - padding[0] - padding[2];\n    if (dx < 0) {\n      x += dx / 2;\n      dx = 0;\n    }\n    if (dy < 0) {\n      y += dy / 2;\n      dy = 0;\n    }\n    return {\n      x: x,\n      y: y,\n      dx: dx,\n      dy: dy\n    };\n  }\n  d3.random = {\n    normal: function(µ, σ) {\n      var n = arguments.length;\n      if (n < 2) σ = 1;\n      if (n < 1) µ = 0;\n      return function() {\n        var x, y, r;\n        do {\n          x = Math.random() * 2 - 1;\n          y = Math.random() * 2 - 1;\n          r = x * x + y * y;\n        } while (!r || r > 1);\n        return µ + σ * x * Math.sqrt(-2 * Math.log(r) / r);\n      };\n    },\n    logNormal: function() {\n      var random = d3.random.normal.apply(d3, arguments);\n      return function() {\n        return Math.exp(random());\n      };\n    },\n    bates: function(m) {\n      var random = d3.random.irwinHall(m);\n      return function() {\n        return random() / m;\n      };\n    },\n    irwinHall: function(m) {\n      return function() {\n        for (var s = 0, j = 0; j < m; j++) s += Math.random();\n        return s;\n      };\n    }\n  };\n  d3.scale = {};\n  function d3_scaleExtent(domain) {\n    var start = domain[0], stop = domain[domain.length - 1];\n    return start < stop ? [ start, stop ] : [ stop, start ];\n  }\n  function d3_scaleRange(scale) {\n    return scale.rangeExtent ? scale.rangeExtent() : d3_scaleExtent(scale.range());\n  }\n  function d3_scale_bilinear(domain, range, uninterpolate, interpolate) {\n    var u = uninterpolate(domain[0], domain[1]), i = interpolate(range[0], range[1]);\n    return function(x) {\n      return i(u(x));\n    };\n  }\n  function d3_scale_nice(domain, nice) {\n    var i0 = 0, i1 = domain.length - 1, x0 = domain[i0], x1 = domain[i1], dx;\n    if (x1 < x0) {\n      dx = i0, i0 = i1, i1 = dx;\n      dx = x0, x0 = x1, x1 = dx;\n    }\n    domain[i0] = nice.floor(x0);\n    domain[i1] = nice.ceil(x1);\n    return domain;\n  }\n  function d3_scale_niceStep(step) {\n    return step ? {\n      floor: function(x) {\n        return Math.floor(x / step) * step;\n      },\n      ceil: function(x) {\n        return Math.ceil(x / step) * step;\n      }\n    } : d3_scale_niceIdentity;\n  }\n  var d3_scale_niceIdentity = {\n    floor: d3_identity,\n    ceil: d3_identity\n  };\n  function d3_scale_polylinear(domain, range, uninterpolate, interpolate) {\n    var u = [], i = [], j = 0, k = Math.min(domain.length, range.length) - 1;\n    if (domain[k] < domain[0]) {\n      domain = domain.slice().reverse();\n      range = range.slice().reverse();\n    }\n    while (++j <= k) {\n      u.push(uninterpolate(domain[j - 1], domain[j]));\n      i.push(interpolate(range[j - 1], range[j]));\n    }\n    return function(x) {\n      var j = d3.bisect(domain, x, 1, k) - 1;\n      return i[j](u[j](x));\n    };\n  }\n  d3.scale.linear = function() {\n    return d3_scale_linear([ 0, 1 ], [ 0, 1 ], d3_interpolate, false);\n  };\n  function d3_scale_linear(domain, range, interpolate, clamp) {\n    var output, input;\n    function rescale() {\n      var linear = Math.min(domain.length, range.length) > 2 ? d3_scale_polylinear : d3_scale_bilinear, uninterpolate = clamp ? d3_uninterpolateClamp : d3_uninterpolateNumber;\n      output = linear(domain, range, uninterpolate, interpolate);\n      input = linear(range, domain, uninterpolate, d3_interpolate);\n      return scale;\n    }\n    function scale(x) {\n      return output(x);\n    }\n    scale.invert = function(y) {\n      return input(y);\n    };\n    scale.domain = function(x) {\n      if (!arguments.length) return domain;\n      domain = x.map(Number);\n      return rescale();\n    };\n    scale.range = function(x) {\n      if (!arguments.length) return range;\n      range = x;\n      return rescale();\n    };\n    scale.rangeRound = function(x) {\n      return scale.range(x).interpolate(d3_interpolateRound);\n    };\n    scale.clamp = function(x) {\n      if (!arguments.length) return clamp;\n      clamp = x;\n      return rescale();\n    };\n    scale.interpolate = function(x) {\n      if (!arguments.length) return interpolate;\n      interpolate = x;\n      return rescale();\n    };\n    scale.ticks = function(m) {\n      return d3_scale_linearTicks(domain, m);\n    };\n    scale.tickFormat = function(m, format) {\n      return d3_scale_linearTickFormat(domain, m, format);\n    };\n    scale.nice = function(m) {\n      d3_scale_linearNice(domain, m);\n      return rescale();\n    };\n    scale.copy = function() {\n      return d3_scale_linear(domain, range, interpolate, clamp);\n    };\n    return rescale();\n  }\n  function d3_scale_linearRebind(scale, linear) {\n    return d3.rebind(scale, linear, \"range\", \"rangeRound\", \"interpolate\", \"clamp\");\n  }\n  function d3_scale_linearNice(domain, m) {\n    d3_scale_nice(domain, d3_scale_niceStep(d3_scale_linearTickRange(domain, m)[2]));\n    d3_scale_nice(domain, d3_scale_niceStep(d3_scale_linearTickRange(domain, m)[2]));\n    return domain;\n  }\n  function d3_scale_linearTickRange(domain, m) {\n    if (m == null) m = 10;\n    var extent = d3_scaleExtent(domain), span = extent[1] - extent[0], step = Math.pow(10, Math.floor(Math.log(span / m) / Math.LN10)), err = m / span * step;\n    if (err <= .15) step *= 10; else if (err <= .35) step *= 5; else if (err <= .75) step *= 2;\n    extent[0] = Math.ceil(extent[0] / step) * step;\n    extent[1] = Math.floor(extent[1] / step) * step + step * .5;\n    extent[2] = step;\n    return extent;\n  }\n  function d3_scale_linearTicks(domain, m) {\n    return d3.range.apply(d3, d3_scale_linearTickRange(domain, m));\n  }\n  function d3_scale_linearTickFormat(domain, m, format) {\n    var range = d3_scale_linearTickRange(domain, m);\n    if (format) {\n      var match = d3_format_re.exec(format);\n      match.shift();\n      if (match[8] === \"s\") {\n        var prefix = d3.formatPrefix(Math.max(abs(range[0]), abs(range[1])));\n        if (!match[7]) match[7] = \".\" + d3_scale_linearPrecision(prefix.scale(range[2]));\n        match[8] = \"f\";\n        format = d3.format(match.join(\"\"));\n        return function(d) {\n          return format(prefix.scale(d)) + prefix.symbol;\n        };\n      }\n      if (!match[7]) match[7] = \".\" + d3_scale_linearFormatPrecision(match[8], range);\n      format = match.join(\"\");\n    } else {\n      format = \",.\" + d3_scale_linearPrecision(range[2]) + \"f\";\n    }\n    return d3.format(format);\n  }\n  var d3_scale_linearFormatSignificant = {\n    s: 1,\n    g: 1,\n    p: 1,\n    r: 1,\n    e: 1\n  };\n  function d3_scale_linearPrecision(value) {\n    return -Math.floor(Math.log(value) / Math.LN10 + .01);\n  }\n  function d3_scale_linearFormatPrecision(type, range) {\n    var p = d3_scale_linearPrecision(range[2]);\n    return type in d3_scale_linearFormatSignificant ? Math.abs(p - d3_scale_linearPrecision(Math.max(abs(range[0]), abs(range[1])))) + +(type !== \"e\") : p - (type === \"%\") * 2;\n  }\n  d3.scale.log = function() {\n    return d3_scale_log(d3.scale.linear().domain([ 0, 1 ]), 10, true, [ 1, 10 ]);\n  };\n  function d3_scale_log(linear, base, positive, domain) {\n    function log(x) {\n      return (positive ? Math.log(x < 0 ? 0 : x) : -Math.log(x > 0 ? 0 : -x)) / Math.log(base);\n    }\n    function pow(x) {\n      return positive ? Math.pow(base, x) : -Math.pow(base, -x);\n    }\n    function scale(x) {\n      return linear(log(x));\n    }\n    scale.invert = function(x) {\n      return pow(linear.invert(x));\n    };\n    scale.domain = function(x) {\n      if (!arguments.length) return domain;\n      positive = x[0] >= 0;\n      linear.domain((domain = x.map(Number)).map(log));\n      return scale;\n    };\n    scale.base = function(_) {\n      if (!arguments.length) return base;\n      base = +_;\n      linear.domain(domain.map(log));\n      return scale;\n    };\n    scale.nice = function() {\n      var niced = d3_scale_nice(domain.map(log), positive ? Math : d3_scale_logNiceNegative);\n      linear.domain(niced);\n      domain = niced.map(pow);\n      return scale;\n    };\n    scale.ticks = function() {\n      var extent = d3_scaleExtent(domain), ticks = [], u = extent[0], v = extent[1], i = Math.floor(log(u)), j = Math.ceil(log(v)), n = base % 1 ? 2 : base;\n      if (isFinite(j - i)) {\n        if (positive) {\n          for (;i < j; i++) for (var k = 1; k < n; k++) ticks.push(pow(i) * k);\n          ticks.push(pow(i));\n        } else {\n          ticks.push(pow(i));\n          for (;i++ < j; ) for (var k = n - 1; k > 0; k--) ticks.push(pow(i) * k);\n        }\n        for (i = 0; ticks[i] < u; i++) {}\n        for (j = ticks.length; ticks[j - 1] > v; j--) {}\n        ticks = ticks.slice(i, j);\n      }\n      return ticks;\n    };\n    scale.tickFormat = function(n, format) {\n      if (!arguments.length) return d3_scale_logFormat;\n      if (arguments.length < 2) format = d3_scale_logFormat; else if (typeof format !== \"function\") format = d3.format(format);\n      var k = Math.max(1, base * n / scale.ticks().length);\n      return function(d) {\n        var i = d / pow(Math.round(log(d)));\n        if (i * base < base - .5) i *= base;\n        return i <= k ? format(d) : \"\";\n      };\n    };\n    scale.copy = function() {\n      return d3_scale_log(linear.copy(), base, positive, domain);\n    };\n    return d3_scale_linearRebind(scale, linear);\n  }\n  var d3_scale_logFormat = d3.format(\".0e\"), d3_scale_logNiceNegative = {\n    floor: function(x) {\n      return -Math.ceil(-x);\n    },\n    ceil: function(x) {\n      return -Math.floor(-x);\n    }\n  };\n  d3.scale.pow = function() {\n    return d3_scale_pow(d3.scale.linear(), 1, [ 0, 1 ]);\n  };\n  function d3_scale_pow(linear, exponent, domain) {\n    var powp = d3_scale_powPow(exponent), powb = d3_scale_powPow(1 / exponent);\n    function scale(x) {\n      return linear(powp(x));\n    }\n    scale.invert = function(x) {\n      return powb(linear.invert(x));\n    };\n    scale.domain = function(x) {\n      if (!arguments.length) return domain;\n      linear.domain((domain = x.map(Number)).map(powp));\n      return scale;\n    };\n    scale.ticks = function(m) {\n      return d3_scale_linearTicks(domain, m);\n    };\n    scale.tickFormat = function(m, format) {\n      return d3_scale_linearTickFormat(domain, m, format);\n    };\n    scale.nice = function(m) {\n      return scale.domain(d3_scale_linearNice(domain, m));\n    };\n    scale.exponent = function(x) {\n      if (!arguments.length) return exponent;\n      powp = d3_scale_powPow(exponent = x);\n      powb = d3_scale_powPow(1 / exponent);\n      linear.domain(domain.map(powp));\n      return scale;\n    };\n    scale.copy = function() {\n      return d3_scale_pow(linear.copy(), exponent, domain);\n    };\n    return d3_scale_linearRebind(scale, linear);\n  }\n  function d3_scale_powPow(e) {\n    return function(x) {\n      return x < 0 ? -Math.pow(-x, e) : Math.pow(x, e);\n    };\n  }\n  d3.scale.sqrt = function() {\n    return d3.scale.pow().exponent(.5);\n  };\n  d3.scale.ordinal = function() {\n    return d3_scale_ordinal([], {\n      t: \"range\",\n      a: [ [] ]\n    });\n  };\n  function d3_scale_ordinal(domain, ranger) {\n    var index, range, rangeBand;\n    function scale(x) {\n      return range[((index.get(x) || (ranger.t === \"range\" ? index.set(x, domain.push(x)) : NaN)) - 1) % range.length];\n    }\n    function steps(start, step) {\n      return d3.range(domain.length).map(function(i) {\n        return start + step * i;\n      });\n    }\n    scale.domain = function(x) {\n      if (!arguments.length) return domain;\n      domain = [];\n      index = new d3_Map();\n      var i = -1, n = x.length, xi;\n      while (++i < n) if (!index.has(xi = x[i])) index.set(xi, domain.push(xi));\n      return scale[ranger.t].apply(scale, ranger.a);\n    };\n    scale.range = function(x) {\n      if (!arguments.length) return range;\n      range = x;\n      rangeBand = 0;\n      ranger = {\n        t: \"range\",\n        a: arguments\n      };\n      return scale;\n    };\n    scale.rangePoints = function(x, padding) {\n      if (arguments.length < 2) padding = 0;\n      var start = x[0], stop = x[1], step = domain.length < 2 ? (start = (start + stop) / 2, \n      0) : (stop - start) / (domain.length - 1 + padding);\n      range = steps(start + step * padding / 2, step);\n      rangeBand = 0;\n      ranger = {\n        t: \"rangePoints\",\n        a: arguments\n      };\n      return scale;\n    };\n    scale.rangeRoundPoints = function(x, padding) {\n      if (arguments.length < 2) padding = 0;\n      var start = x[0], stop = x[1], step = domain.length < 2 ? (start = stop = Math.round((start + stop) / 2), \n      0) : (stop - start) / (domain.length - 1 + padding) | 0;\n      range = steps(start + Math.round(step * padding / 2 + (stop - start - (domain.length - 1 + padding) * step) / 2), step);\n      rangeBand = 0;\n      ranger = {\n        t: \"rangeRoundPoints\",\n        a: arguments\n      };\n      return scale;\n    };\n    scale.rangeBands = function(x, padding, outerPadding) {\n      if (arguments.length < 2) padding = 0;\n      if (arguments.length < 3) outerPadding = padding;\n      var reverse = x[1] < x[0], start = x[reverse - 0], stop = x[1 - reverse], step = (stop - start) / (domain.length - padding + 2 * outerPadding);\n      range = steps(start + step * outerPadding, step);\n      if (reverse) range.reverse();\n      rangeBand = step * (1 - padding);\n      ranger = {\n        t: \"rangeBands\",\n        a: arguments\n      };\n      return scale;\n    };\n    scale.rangeRoundBands = function(x, padding, outerPadding) {\n      if (arguments.length < 2) padding = 0;\n      if (arguments.length < 3) outerPadding = padding;\n      var reverse = x[1] < x[0], start = x[reverse - 0], stop = x[1 - reverse], step = Math.floor((stop - start) / (domain.length - padding + 2 * outerPadding));\n      range = steps(start + Math.round((stop - start - (domain.length - padding) * step) / 2), step);\n      if (reverse) range.reverse();\n      rangeBand = Math.round(step * (1 - padding));\n      ranger = {\n        t: \"rangeRoundBands\",\n        a: arguments\n      };\n      return scale;\n    };\n    scale.rangeBand = function() {\n      return rangeBand;\n    };\n    scale.rangeExtent = function() {\n      return d3_scaleExtent(ranger.a[0]);\n    };\n    scale.copy = function() {\n      return d3_scale_ordinal(domain, ranger);\n    };\n    return scale.domain(domain);\n  }\n  d3.scale.category10 = function() {\n    return d3.scale.ordinal().range(d3_category10);\n  };\n  d3.scale.category20 = function() {\n    return d3.scale.ordinal().range(d3_category20);\n  };\n  d3.scale.category20b = function() {\n    return d3.scale.ordinal().range(d3_category20b);\n  };\n  d3.scale.category20c = function() {\n    return d3.scale.ordinal().range(d3_category20c);\n  };\n  var d3_category10 = [ 2062260, 16744206, 2924588, 14034728, 9725885, 9197131, 14907330, 8355711, 12369186, 1556175 ].map(d3_rgbString);\n  var d3_category20 = [ 2062260, 11454440, 16744206, 16759672, 2924588, 10018698, 14034728, 16750742, 9725885, 12955861, 9197131, 12885140, 14907330, 16234194, 8355711, 13092807, 12369186, 14408589, 1556175, 10410725 ].map(d3_rgbString);\n  var d3_category20b = [ 3750777, 5395619, 7040719, 10264286, 6519097, 9216594, 11915115, 13556636, 9202993, 12426809, 15186514, 15190932, 8666169, 11356490, 14049643, 15177372, 8077683, 10834324, 13528509, 14589654 ].map(d3_rgbString);\n  var d3_category20c = [ 3244733, 7057110, 10406625, 13032431, 15095053, 16616764, 16625259, 16634018, 3253076, 7652470, 10607003, 13101504, 7695281, 10394312, 12369372, 14342891, 6513507, 9868950, 12434877, 14277081 ].map(d3_rgbString);\n  d3.scale.quantile = function() {\n    return d3_scale_quantile([], []);\n  };\n  function d3_scale_quantile(domain, range) {\n    var thresholds;\n    function rescale() {\n      var k = 0, q = range.length;\n      thresholds = [];\n      while (++k < q) thresholds[k - 1] = d3.quantile(domain, k / q);\n      return scale;\n    }\n    function scale(x) {\n      if (!isNaN(x = +x)) return range[d3.bisect(thresholds, x)];\n    }\n    scale.domain = function(x) {\n      if (!arguments.length) return domain;\n      domain = x.map(d3_number).filter(d3_numeric).sort(d3_ascending);\n      return rescale();\n    };\n    scale.range = function(x) {\n      if (!arguments.length) return range;\n      range = x;\n      return rescale();\n    };\n    scale.quantiles = function() {\n      return thresholds;\n    };\n    scale.invertExtent = function(y) {\n      y = range.indexOf(y);\n      return y < 0 ? [ NaN, NaN ] : [ y > 0 ? thresholds[y - 1] : domain[0], y < thresholds.length ? thresholds[y] : domain[domain.length - 1] ];\n    };\n    scale.copy = function() {\n      return d3_scale_quantile(domain, range);\n    };\n    return rescale();\n  }\n  d3.scale.quantize = function() {\n    return d3_scale_quantize(0, 1, [ 0, 1 ]);\n  };\n  function d3_scale_quantize(x0, x1, range) {\n    var kx, i;\n    function scale(x) {\n      return range[Math.max(0, Math.min(i, Math.floor(kx * (x - x0))))];\n    }\n    function rescale() {\n      kx = range.length / (x1 - x0);\n      i = range.length - 1;\n      return scale;\n    }\n    scale.domain = function(x) {\n      if (!arguments.length) return [ x0, x1 ];\n      x0 = +x[0];\n      x1 = +x[x.length - 1];\n      return rescale();\n    };\n    scale.range = function(x) {\n      if (!arguments.length) return range;\n      range = x;\n      return rescale();\n    };\n    scale.invertExtent = function(y) {\n      y = range.indexOf(y);\n      y = y < 0 ? NaN : y / kx + x0;\n      return [ y, y + 1 / kx ];\n    };\n    scale.copy = function() {\n      return d3_scale_quantize(x0, x1, range);\n    };\n    return rescale();\n  }\n  d3.scale.threshold = function() {\n    return d3_scale_threshold([ .5 ], [ 0, 1 ]);\n  };\n  function d3_scale_threshold(domain, range) {\n    function scale(x) {\n      if (x <= x) return range[d3.bisect(domain, x)];\n    }\n    scale.domain = function(_) {\n      if (!arguments.length) return domain;\n      domain = _;\n      return scale;\n    };\n    scale.range = function(_) {\n      if (!arguments.length) return range;\n      range = _;\n      return scale;\n    };\n    scale.invertExtent = function(y) {\n      y = range.indexOf(y);\n      return [ domain[y - 1], domain[y] ];\n    };\n    scale.copy = function() {\n      return d3_scale_threshold(domain, range);\n    };\n    return scale;\n  }\n  d3.scale.identity = function() {\n    return d3_scale_identity([ 0, 1 ]);\n  };\n  function d3_scale_identity(domain) {\n    function identity(x) {\n      return +x;\n    }\n    identity.invert = identity;\n    identity.domain = identity.range = function(x) {\n      if (!arguments.length) return domain;\n      domain = x.map(identity);\n      return identity;\n    };\n    identity.ticks = function(m) {\n      return d3_scale_linearTicks(domain, m);\n    };\n    identity.tickFormat = function(m, format) {\n      return d3_scale_linearTickFormat(domain, m, format);\n    };\n    identity.copy = function() {\n      return d3_scale_identity(domain);\n    };\n    return identity;\n  }\n  d3.svg = {};\n  function d3_zero() {\n    return 0;\n  }\n  d3.svg.arc = function() {\n    var innerRadius = d3_svg_arcInnerRadius, outerRadius = d3_svg_arcOuterRadius, cornerRadius = d3_zero, padRadius = d3_svg_arcAuto, startAngle = d3_svg_arcStartAngle, endAngle = d3_svg_arcEndAngle, padAngle = d3_svg_arcPadAngle;\n    function arc() {\n      var r0 = Math.max(0, +innerRadius.apply(this, arguments)), r1 = Math.max(0, +outerRadius.apply(this, arguments)), a0 = startAngle.apply(this, arguments) - halfπ, a1 = endAngle.apply(this, arguments) - halfπ, da = Math.abs(a1 - a0), cw = a0 > a1 ? 0 : 1;\n      if (r1 < r0) rc = r1, r1 = r0, r0 = rc;\n      if (da >= τε) return circleSegment(r1, cw) + (r0 ? circleSegment(r0, 1 - cw) : \"\") + \"Z\";\n      var rc, cr, rp, ap, p0 = 0, p1 = 0, x0, y0, x1, y1, x2, y2, x3, y3, path = [];\n      if (ap = (+padAngle.apply(this, arguments) || 0) / 2) {\n        rp = padRadius === d3_svg_arcAuto ? Math.sqrt(r0 * r0 + r1 * r1) : +padRadius.apply(this, arguments);\n        if (!cw) p1 *= -1;\n        if (r1) p1 = d3_asin(rp / r1 * Math.sin(ap));\n        if (r0) p0 = d3_asin(rp / r0 * Math.sin(ap));\n      }\n      if (r1) {\n        x0 = r1 * Math.cos(a0 + p1);\n        y0 = r1 * Math.sin(a0 + p1);\n        x1 = r1 * Math.cos(a1 - p1);\n        y1 = r1 * Math.sin(a1 - p1);\n        var l1 = Math.abs(a1 - a0 - 2 * p1) <= π ? 0 : 1;\n        if (p1 && d3_svg_arcSweep(x0, y0, x1, y1) === cw ^ l1) {\n          var h1 = (a0 + a1) / 2;\n          x0 = r1 * Math.cos(h1);\n          y0 = r1 * Math.sin(h1);\n          x1 = y1 = null;\n        }\n      } else {\n        x0 = y0 = 0;\n      }\n      if (r0) {\n        x2 = r0 * Math.cos(a1 - p0);\n        y2 = r0 * Math.sin(a1 - p0);\n        x3 = r0 * Math.cos(a0 + p0);\n        y3 = r0 * Math.sin(a0 + p0);\n        var l0 = Math.abs(a0 - a1 + 2 * p0) <= π ? 0 : 1;\n        if (p0 && d3_svg_arcSweep(x2, y2, x3, y3) === 1 - cw ^ l0) {\n          var h0 = (a0 + a1) / 2;\n          x2 = r0 * Math.cos(h0);\n          y2 = r0 * Math.sin(h0);\n          x3 = y3 = null;\n        }\n      } else {\n        x2 = y2 = 0;\n      }\n      if (da > ε && (rc = Math.min(Math.abs(r1 - r0) / 2, +cornerRadius.apply(this, arguments))) > .001) {\n        cr = r0 < r1 ^ cw ? 0 : 1;\n        var rc1 = rc, rc0 = rc;\n        if (da < π) {\n          var oc = x3 == null ? [ x2, y2 ] : x1 == null ? [ x0, y0 ] : d3_geom_polygonIntersect([ x0, y0 ], [ x3, y3 ], [ x1, y1 ], [ x2, y2 ]), ax = x0 - oc[0], ay = y0 - oc[1], bx = x1 - oc[0], by = y1 - oc[1], kc = 1 / Math.sin(Math.acos((ax * bx + ay * by) / (Math.sqrt(ax * ax + ay * ay) * Math.sqrt(bx * bx + by * by))) / 2), lc = Math.sqrt(oc[0] * oc[0] + oc[1] * oc[1]);\n          rc0 = Math.min(rc, (r0 - lc) / (kc - 1));\n          rc1 = Math.min(rc, (r1 - lc) / (kc + 1));\n        }\n        if (x1 != null) {\n          var t30 = d3_svg_arcCornerTangents(x3 == null ? [ x2, y2 ] : [ x3, y3 ], [ x0, y0 ], r1, rc1, cw), t12 = d3_svg_arcCornerTangents([ x1, y1 ], [ x2, y2 ], r1, rc1, cw);\n          if (rc === rc1) {\n            path.push(\"M\", t30[0], \"A\", rc1, \",\", rc1, \" 0 0,\", cr, \" \", t30[1], \"A\", r1, \",\", r1, \" 0 \", 1 - cw ^ d3_svg_arcSweep(t30[1][0], t30[1][1], t12[1][0], t12[1][1]), \",\", cw, \" \", t12[1], \"A\", rc1, \",\", rc1, \" 0 0,\", cr, \" \", t12[0]);\n          } else {\n            path.push(\"M\", t30[0], \"A\", rc1, \",\", rc1, \" 0 1,\", cr, \" \", t12[0]);\n          }\n        } else {\n          path.push(\"M\", x0, \",\", y0);\n        }\n        if (x3 != null) {\n          var t03 = d3_svg_arcCornerTangents([ x0, y0 ], [ x3, y3 ], r0, -rc0, cw), t21 = d3_svg_arcCornerTangents([ x2, y2 ], x1 == null ? [ x0, y0 ] : [ x1, y1 ], r0, -rc0, cw);\n          if (rc === rc0) {\n            path.push(\"L\", t21[0], \"A\", rc0, \",\", rc0, \" 0 0,\", cr, \" \", t21[1], \"A\", r0, \",\", r0, \" 0 \", cw ^ d3_svg_arcSweep(t21[1][0], t21[1][1], t03[1][0], t03[1][1]), \",\", 1 - cw, \" \", t03[1], \"A\", rc0, \",\", rc0, \" 0 0,\", cr, \" \", t03[0]);\n          } else {\n            path.push(\"L\", t21[0], \"A\", rc0, \",\", rc0, \" 0 0,\", cr, \" \", t03[0]);\n          }\n        } else {\n          path.push(\"L\", x2, \",\", y2);\n        }\n      } else {\n        path.push(\"M\", x0, \",\", y0);\n        if (x1 != null) path.push(\"A\", r1, \",\", r1, \" 0 \", l1, \",\", cw, \" \", x1, \",\", y1);\n        path.push(\"L\", x2, \",\", y2);\n        if (x3 != null) path.push(\"A\", r0, \",\", r0, \" 0 \", l0, \",\", 1 - cw, \" \", x3, \",\", y3);\n      }\n      path.push(\"Z\");\n      return path.join(\"\");\n    }\n    function circleSegment(r1, cw) {\n      return \"M0,\" + r1 + \"A\" + r1 + \",\" + r1 + \" 0 1,\" + cw + \" 0,\" + -r1 + \"A\" + r1 + \",\" + r1 + \" 0 1,\" + cw + \" 0,\" + r1;\n    }\n    arc.innerRadius = function(v) {\n      if (!arguments.length) return innerRadius;\n      innerRadius = d3_functor(v);\n      return arc;\n    };\n    arc.outerRadius = function(v) {\n      if (!arguments.length) return outerRadius;\n      outerRadius = d3_functor(v);\n      return arc;\n    };\n    arc.cornerRadius = function(v) {\n      if (!arguments.length) return cornerRadius;\n      cornerRadius = d3_functor(v);\n      return arc;\n    };\n    arc.padRadius = function(v) {\n      if (!arguments.length) return padRadius;\n      padRadius = v == d3_svg_arcAuto ? d3_svg_arcAuto : d3_functor(v);\n      return arc;\n    };\n    arc.startAngle = function(v) {\n      if (!arguments.length) return startAngle;\n      startAngle = d3_functor(v);\n      return arc;\n    };\n    arc.endAngle = function(v) {\n      if (!arguments.length) return endAngle;\n      endAngle = d3_functor(v);\n      return arc;\n    };\n    arc.padAngle = function(v) {\n      if (!arguments.length) return padAngle;\n      padAngle = d3_functor(v);\n      return arc;\n    };\n    arc.centroid = function() {\n      var r = (+innerRadius.apply(this, arguments) + +outerRadius.apply(this, arguments)) / 2, a = (+startAngle.apply(this, arguments) + +endAngle.apply(this, arguments)) / 2 - halfπ;\n      return [ Math.cos(a) * r, Math.sin(a) * r ];\n    };\n    return arc;\n  };\n  var d3_svg_arcAuto = \"auto\";\n  function d3_svg_arcInnerRadius(d) {\n    return d.innerRadius;\n  }\n  function d3_svg_arcOuterRadius(d) {\n    return d.outerRadius;\n  }\n  function d3_svg_arcStartAngle(d) {\n    return d.startAngle;\n  }\n  function d3_svg_arcEndAngle(d) {\n    return d.endAngle;\n  }\n  function d3_svg_arcPadAngle(d) {\n    return d && d.padAngle;\n  }\n  function d3_svg_arcSweep(x0, y0, x1, y1) {\n    return (x0 - x1) * y0 - (y0 - y1) * x0 > 0 ? 0 : 1;\n  }\n  function d3_svg_arcCornerTangents(p0, p1, r1, rc, cw) {\n    var x01 = p0[0] - p1[0], y01 = p0[1] - p1[1], lo = (cw ? rc : -rc) / Math.sqrt(x01 * x01 + y01 * y01), ox = lo * y01, oy = -lo * x01, x1 = p0[0] + ox, y1 = p0[1] + oy, x2 = p1[0] + ox, y2 = p1[1] + oy, x3 = (x1 + x2) / 2, y3 = (y1 + y2) / 2, dx = x2 - x1, dy = y2 - y1, d2 = dx * dx + dy * dy, r = r1 - rc, D = x1 * y2 - x2 * y1, d = (dy < 0 ? -1 : 1) * Math.sqrt(Math.max(0, r * r * d2 - D * D)), cx0 = (D * dy - dx * d) / d2, cy0 = (-D * dx - dy * d) / d2, cx1 = (D * dy + dx * d) / d2, cy1 = (-D * dx + dy * d) / d2, dx0 = cx0 - x3, dy0 = cy0 - y3, dx1 = cx1 - x3, dy1 = cy1 - y3;\n    if (dx0 * dx0 + dy0 * dy0 > dx1 * dx1 + dy1 * dy1) cx0 = cx1, cy0 = cy1;\n    return [ [ cx0 - ox, cy0 - oy ], [ cx0 * r1 / r, cy0 * r1 / r ] ];\n  }\n  function d3_svg_line(projection) {\n    var x = d3_geom_pointX, y = d3_geom_pointY, defined = d3_true, interpolate = d3_svg_lineLinear, interpolateKey = interpolate.key, tension = .7;\n    function line(data) {\n      var segments = [], points = [], i = -1, n = data.length, d, fx = d3_functor(x), fy = d3_functor(y);\n      function segment() {\n        segments.push(\"M\", interpolate(projection(points), tension));\n      }\n      while (++i < n) {\n        if (defined.call(this, d = data[i], i)) {\n          points.push([ +fx.call(this, d, i), +fy.call(this, d, i) ]);\n        } else if (points.length) {\n          segment();\n          points = [];\n        }\n      }\n      if (points.length) segment();\n      return segments.length ? segments.join(\"\") : null;\n    }\n    line.x = function(_) {\n      if (!arguments.length) return x;\n      x = _;\n      return line;\n    };\n    line.y = function(_) {\n      if (!arguments.length) return y;\n      y = _;\n      return line;\n    };\n    line.defined = function(_) {\n      if (!arguments.length) return defined;\n      defined = _;\n      return line;\n    };\n    line.interpolate = function(_) {\n      if (!arguments.length) return interpolateKey;\n      if (typeof _ === \"function\") interpolateKey = interpolate = _; else interpolateKey = (interpolate = d3_svg_lineInterpolators.get(_) || d3_svg_lineLinear).key;\n      return line;\n    };\n    line.tension = function(_) {\n      if (!arguments.length) return tension;\n      tension = _;\n      return line;\n    };\n    return line;\n  }\n  d3.svg.line = function() {\n    return d3_svg_line(d3_identity);\n  };\n  var d3_svg_lineInterpolators = d3.map({\n    linear: d3_svg_lineLinear,\n    \"linear-closed\": d3_svg_lineLinearClosed,\n    step: d3_svg_lineStep,\n    \"step-before\": d3_svg_lineStepBefore,\n    \"step-after\": d3_svg_lineStepAfter,\n    basis: d3_svg_lineBasis,\n    \"basis-open\": d3_svg_lineBasisOpen,\n    \"basis-closed\": d3_svg_lineBasisClosed,\n    bundle: d3_svg_lineBundle,\n    cardinal: d3_svg_lineCardinal,\n    \"cardinal-open\": d3_svg_lineCardinalOpen,\n    \"cardinal-closed\": d3_svg_lineCardinalClosed,\n    monotone: d3_svg_lineMonotone\n  });\n  d3_svg_lineInterpolators.forEach(function(key, value) {\n    value.key = key;\n    value.closed = /-closed$/.test(key);\n  });\n  function d3_svg_lineLinear(points) {\n    return points.length > 1 ? points.join(\"L\") : points + \"Z\";\n  }\n  function d3_svg_lineLinearClosed(points) {\n    return points.join(\"L\") + \"Z\";\n  }\n  function d3_svg_lineStep(points) {\n    var i = 0, n = points.length, p = points[0], path = [ p[0], \",\", p[1] ];\n    while (++i < n) path.push(\"H\", (p[0] + (p = points[i])[0]) / 2, \"V\", p[1]);\n    if (n > 1) path.push(\"H\", p[0]);\n    return path.join(\"\");\n  }\n  function d3_svg_lineStepBefore(points) {\n    var i = 0, n = points.length, p = points[0], path = [ p[0], \",\", p[1] ];\n    while (++i < n) path.push(\"V\", (p = points[i])[1], \"H\", p[0]);\n    return path.join(\"\");\n  }\n  function d3_svg_lineStepAfter(points) {\n    var i = 0, n = points.length, p = points[0], path = [ p[0], \",\", p[1] ];\n    while (++i < n) path.push(\"H\", (p = points[i])[0], \"V\", p[1]);\n    return path.join(\"\");\n  }\n  function d3_svg_lineCardinalOpen(points, tension) {\n    return points.length < 4 ? d3_svg_lineLinear(points) : points[1] + d3_svg_lineHermite(points.slice(1, -1), d3_svg_lineCardinalTangents(points, tension));\n  }\n  function d3_svg_lineCardinalClosed(points, tension) {\n    return points.length < 3 ? d3_svg_lineLinearClosed(points) : points[0] + d3_svg_lineHermite((points.push(points[0]), \n    points), d3_svg_lineCardinalTangents([ points[points.length - 2] ].concat(points, [ points[1] ]), tension));\n  }\n  function d3_svg_lineCardinal(points, tension) {\n    return points.length < 3 ? d3_svg_lineLinear(points) : points[0] + d3_svg_lineHermite(points, d3_svg_lineCardinalTangents(points, tension));\n  }\n  function d3_svg_lineHermite(points, tangents) {\n    if (tangents.length < 1 || points.length != tangents.length && points.length != tangents.length + 2) {\n      return d3_svg_lineLinear(points);\n    }\n    var quad = points.length != tangents.length, path = \"\", p0 = points[0], p = points[1], t0 = tangents[0], t = t0, pi = 1;\n    if (quad) {\n      path += \"Q\" + (p[0] - t0[0] * 2 / 3) + \",\" + (p[1] - t0[1] * 2 / 3) + \",\" + p[0] + \",\" + p[1];\n      p0 = points[1];\n      pi = 2;\n    }\n    if (tangents.length > 1) {\n      t = tangents[1];\n      p = points[pi];\n      pi++;\n      path += \"C\" + (p0[0] + t0[0]) + \",\" + (p0[1] + t0[1]) + \",\" + (p[0] - t[0]) + \",\" + (p[1] - t[1]) + \",\" + p[0] + \",\" + p[1];\n      for (var i = 2; i < tangents.length; i++, pi++) {\n        p = points[pi];\n        t = tangents[i];\n        path += \"S\" + (p[0] - t[0]) + \",\" + (p[1] - t[1]) + \",\" + p[0] + \",\" + p[1];\n      }\n    }\n    if (quad) {\n      var lp = points[pi];\n      path += \"Q\" + (p[0] + t[0] * 2 / 3) + \",\" + (p[1] + t[1] * 2 / 3) + \",\" + lp[0] + \",\" + lp[1];\n    }\n    return path;\n  }\n  function d3_svg_lineCardinalTangents(points, tension) {\n    var tangents = [], a = (1 - tension) / 2, p0, p1 = points[0], p2 = points[1], i = 1, n = points.length;\n    while (++i < n) {\n      p0 = p1;\n      p1 = p2;\n      p2 = points[i];\n      tangents.push([ a * (p2[0] - p0[0]), a * (p2[1] - p0[1]) ]);\n    }\n    return tangents;\n  }\n  function d3_svg_lineBasis(points) {\n    if (points.length < 3) return d3_svg_lineLinear(points);\n    var i = 1, n = points.length, pi = points[0], x0 = pi[0], y0 = pi[1], px = [ x0, x0, x0, (pi = points[1])[0] ], py = [ y0, y0, y0, pi[1] ], path = [ x0, \",\", y0, \"L\", d3_svg_lineDot4(d3_svg_lineBasisBezier3, px), \",\", d3_svg_lineDot4(d3_svg_lineBasisBezier3, py) ];\n    points.push(points[n - 1]);\n    while (++i <= n) {\n      pi = points[i];\n      px.shift();\n      px.push(pi[0]);\n      py.shift();\n      py.push(pi[1]);\n      d3_svg_lineBasisBezier(path, px, py);\n    }\n    points.pop();\n    path.push(\"L\", pi);\n    return path.join(\"\");\n  }\n  function d3_svg_lineBasisOpen(points) {\n    if (points.length < 4) return d3_svg_lineLinear(points);\n    var path = [], i = -1, n = points.length, pi, px = [ 0 ], py = [ 0 ];\n    while (++i < 3) {\n      pi = points[i];\n      px.push(pi[0]);\n      py.push(pi[1]);\n    }\n    path.push(d3_svg_lineDot4(d3_svg_lineBasisBezier3, px) + \",\" + d3_svg_lineDot4(d3_svg_lineBasisBezier3, py));\n    --i;\n    while (++i < n) {\n      pi = points[i];\n      px.shift();\n      px.push(pi[0]);\n      py.shift();\n      py.push(pi[1]);\n      d3_svg_lineBasisBezier(path, px, py);\n    }\n    return path.join(\"\");\n  }\n  function d3_svg_lineBasisClosed(points) {\n    var path, i = -1, n = points.length, m = n + 4, pi, px = [], py = [];\n    while (++i < 4) {\n      pi = points[i % n];\n      px.push(pi[0]);\n      py.push(pi[1]);\n    }\n    path = [ d3_svg_lineDot4(d3_svg_lineBasisBezier3, px), \",\", d3_svg_lineDot4(d3_svg_lineBasisBezier3, py) ];\n    --i;\n    while (++i < m) {\n      pi = points[i % n];\n      px.shift();\n      px.push(pi[0]);\n      py.shift();\n      py.push(pi[1]);\n      d3_svg_lineBasisBezier(path, px, py);\n    }\n    return path.join(\"\");\n  }\n  function d3_svg_lineBundle(points, tension) {\n    var n = points.length - 1;\n    if (n) {\n      var x0 = points[0][0], y0 = points[0][1], dx = points[n][0] - x0, dy = points[n][1] - y0, i = -1, p, t;\n      while (++i <= n) {\n        p = points[i];\n        t = i / n;\n        p[0] = tension * p[0] + (1 - tension) * (x0 + t * dx);\n        p[1] = tension * p[1] + (1 - tension) * (y0 + t * dy);\n      }\n    }\n    return d3_svg_lineBasis(points);\n  }\n  function d3_svg_lineDot4(a, b) {\n    return a[0] * b[0] + a[1] * b[1] + a[2] * b[2] + a[3] * b[3];\n  }\n  var d3_svg_lineBasisBezier1 = [ 0, 2 / 3, 1 / 3, 0 ], d3_svg_lineBasisBezier2 = [ 0, 1 / 3, 2 / 3, 0 ], d3_svg_lineBasisBezier3 = [ 0, 1 / 6, 2 / 3, 1 / 6 ];\n  function d3_svg_lineBasisBezier(path, x, y) {\n    path.push(\"C\", d3_svg_lineDot4(d3_svg_lineBasisBezier1, x), \",\", d3_svg_lineDot4(d3_svg_lineBasisBezier1, y), \",\", d3_svg_lineDot4(d3_svg_lineBasisBezier2, x), \",\", d3_svg_lineDot4(d3_svg_lineBasisBezier2, y), \",\", d3_svg_lineDot4(d3_svg_lineBasisBezier3, x), \",\", d3_svg_lineDot4(d3_svg_lineBasisBezier3, y));\n  }\n  function d3_svg_lineSlope(p0, p1) {\n    return (p1[1] - p0[1]) / (p1[0] - p0[0]);\n  }\n  function d3_svg_lineFiniteDifferences(points) {\n    var i = 0, j = points.length - 1, m = [], p0 = points[0], p1 = points[1], d = m[0] = d3_svg_lineSlope(p0, p1);\n    while (++i < j) {\n      m[i] = (d + (d = d3_svg_lineSlope(p0 = p1, p1 = points[i + 1]))) / 2;\n    }\n    m[i] = d;\n    return m;\n  }\n  function d3_svg_lineMonotoneTangents(points) {\n    var tangents = [], d, a, b, s, m = d3_svg_lineFiniteDifferences(points), i = -1, j = points.length - 1;\n    while (++i < j) {\n      d = d3_svg_lineSlope(points[i], points[i + 1]);\n      if (abs(d) < ε) {\n        m[i] = m[i + 1] = 0;\n      } else {\n        a = m[i] / d;\n        b = m[i + 1] / d;\n        s = a * a + b * b;\n        if (s > 9) {\n          s = d * 3 / Math.sqrt(s);\n          m[i] = s * a;\n          m[i + 1] = s * b;\n        }\n      }\n    }\n    i = -1;\n    while (++i <= j) {\n      s = (points[Math.min(j, i + 1)][0] - points[Math.max(0, i - 1)][0]) / (6 * (1 + m[i] * m[i]));\n      tangents.push([ s || 0, m[i] * s || 0 ]);\n    }\n    return tangents;\n  }\n  function d3_svg_lineMonotone(points) {\n    return points.length < 3 ? d3_svg_lineLinear(points) : points[0] + d3_svg_lineHermite(points, d3_svg_lineMonotoneTangents(points));\n  }\n  d3.svg.line.radial = function() {\n    var line = d3_svg_line(d3_svg_lineRadial);\n    line.radius = line.x, delete line.x;\n    line.angle = line.y, delete line.y;\n    return line;\n  };\n  function d3_svg_lineRadial(points) {\n    var point, i = -1, n = points.length, r, a;\n    while (++i < n) {\n      point = points[i];\n      r = point[0];\n      a = point[1] - halfπ;\n      point[0] = r * Math.cos(a);\n      point[1] = r * Math.sin(a);\n    }\n    return points;\n  }\n  function d3_svg_area(projection) {\n    var x0 = d3_geom_pointX, x1 = d3_geom_pointX, y0 = 0, y1 = d3_geom_pointY, defined = d3_true, interpolate = d3_svg_lineLinear, interpolateKey = interpolate.key, interpolateReverse = interpolate, L = \"L\", tension = .7;\n    function area(data) {\n      var segments = [], points0 = [], points1 = [], i = -1, n = data.length, d, fx0 = d3_functor(x0), fy0 = d3_functor(y0), fx1 = x0 === x1 ? function() {\n        return x;\n      } : d3_functor(x1), fy1 = y0 === y1 ? function() {\n        return y;\n      } : d3_functor(y1), x, y;\n      function segment() {\n        segments.push(\"M\", interpolate(projection(points1), tension), L, interpolateReverse(projection(points0.reverse()), tension), \"Z\");\n      }\n      while (++i < n) {\n        if (defined.call(this, d = data[i], i)) {\n          points0.push([ x = +fx0.call(this, d, i), y = +fy0.call(this, d, i) ]);\n          points1.push([ +fx1.call(this, d, i), +fy1.call(this, d, i) ]);\n        } else if (points0.length) {\n          segment();\n          points0 = [];\n          points1 = [];\n        }\n      }\n      if (points0.length) segment();\n      return segments.length ? segments.join(\"\") : null;\n    }\n    area.x = function(_) {\n      if (!arguments.length) return x1;\n      x0 = x1 = _;\n      return area;\n    };\n    area.x0 = function(_) {\n      if (!arguments.length) return x0;\n      x0 = _;\n      return area;\n    };\n    area.x1 = function(_) {\n      if (!arguments.length) return x1;\n      x1 = _;\n      return area;\n    };\n    area.y = function(_) {\n      if (!arguments.length) return y1;\n      y0 = y1 = _;\n      return area;\n    };\n    area.y0 = function(_) {\n      if (!arguments.length) return y0;\n      y0 = _;\n      return area;\n    };\n    area.y1 = function(_) {\n      if (!arguments.length) return y1;\n      y1 = _;\n      return area;\n    };\n    area.defined = function(_) {\n      if (!arguments.length) return defined;\n      defined = _;\n      return area;\n    };\n    area.interpolate = function(_) {\n      if (!arguments.length) return interpolateKey;\n      if (typeof _ === \"function\") interpolateKey = interpolate = _; else interpolateKey = (interpolate = d3_svg_lineInterpolators.get(_) || d3_svg_lineLinear).key;\n      interpolateReverse = interpolate.reverse || interpolate;\n      L = interpolate.closed ? \"M\" : \"L\";\n      return area;\n    };\n    area.tension = function(_) {\n      if (!arguments.length) return tension;\n      tension = _;\n      return area;\n    };\n    return area;\n  }\n  d3_svg_lineStepBefore.reverse = d3_svg_lineStepAfter;\n  d3_svg_lineStepAfter.reverse = d3_svg_lineStepBefore;\n  d3.svg.area = function() {\n    return d3_svg_area(d3_identity);\n  };\n  d3.svg.area.radial = function() {\n    var area = d3_svg_area(d3_svg_lineRadial);\n    area.radius = area.x, delete area.x;\n    area.innerRadius = area.x0, delete area.x0;\n    area.outerRadius = area.x1, delete area.x1;\n    area.angle = area.y, delete area.y;\n    area.startAngle = area.y0, delete area.y0;\n    area.endAngle = area.y1, delete area.y1;\n    return area;\n  };\n  d3.svg.chord = function() {\n    var source = d3_source, target = d3_target, radius = d3_svg_chordRadius, startAngle = d3_svg_arcStartAngle, endAngle = d3_svg_arcEndAngle;\n    function chord(d, i) {\n      var s = subgroup(this, source, d, i), t = subgroup(this, target, d, i);\n      return \"M\" + s.p0 + arc(s.r, s.p1, s.a1 - s.a0) + (equals(s, t) ? curve(s.r, s.p1, s.r, s.p0) : curve(s.r, s.p1, t.r, t.p0) + arc(t.r, t.p1, t.a1 - t.a0) + curve(t.r, t.p1, s.r, s.p0)) + \"Z\";\n    }\n    function subgroup(self, f, d, i) {\n      var subgroup = f.call(self, d, i), r = radius.call(self, subgroup, i), a0 = startAngle.call(self, subgroup, i) - halfπ, a1 = endAngle.call(self, subgroup, i) - halfπ;\n      return {\n        r: r,\n        a0: a0,\n        a1: a1,\n        p0: [ r * Math.cos(a0), r * Math.sin(a0) ],\n        p1: [ r * Math.cos(a1), r * Math.sin(a1) ]\n      };\n    }\n    function equals(a, b) {\n      return a.a0 == b.a0 && a.a1 == b.a1;\n    }\n    function arc(r, p, a) {\n      return \"A\" + r + \",\" + r + \" 0 \" + +(a > π) + \",1 \" + p;\n    }\n    function curve(r0, p0, r1, p1) {\n      return \"Q 0,0 \" + p1;\n    }\n    chord.radius = function(v) {\n      if (!arguments.length) return radius;\n      radius = d3_functor(v);\n      return chord;\n    };\n    chord.source = function(v) {\n      if (!arguments.length) return source;\n      source = d3_functor(v);\n      return chord;\n    };\n    chord.target = function(v) {\n      if (!arguments.length) return target;\n      target = d3_functor(v);\n      return chord;\n    };\n    chord.startAngle = function(v) {\n      if (!arguments.length) return startAngle;\n      startAngle = d3_functor(v);\n      return chord;\n    };\n    chord.endAngle = function(v) {\n      if (!arguments.length) return endAngle;\n      endAngle = d3_functor(v);\n      return chord;\n    };\n    return chord;\n  };\n  function d3_svg_chordRadius(d) {\n    return d.radius;\n  }\n  d3.svg.diagonal = function() {\n    var source = d3_source, target = d3_target, projection = d3_svg_diagonalProjection;\n    function diagonal(d, i) {\n      var p0 = source.call(this, d, i), p3 = target.call(this, d, i), m = (p0.y + p3.y) / 2, p = [ p0, {\n        x: p0.x,\n        y: m\n      }, {\n        x: p3.x,\n        y: m\n      }, p3 ];\n      p = p.map(projection);\n      return \"M\" + p[0] + \"C\" + p[1] + \" \" + p[2] + \" \" + p[3];\n    }\n    diagonal.source = function(x) {\n      if (!arguments.length) return source;\n      source = d3_functor(x);\n      return diagonal;\n    };\n    diagonal.target = function(x) {\n      if (!arguments.length) return target;\n      target = d3_functor(x);\n      return diagonal;\n    };\n    diagonal.projection = function(x) {\n      if (!arguments.length) return projection;\n      projection = x;\n      return diagonal;\n    };\n    return diagonal;\n  };\n  function d3_svg_diagonalProjection(d) {\n    return [ d.x, d.y ];\n  }\n  d3.svg.diagonal.radial = function() {\n    var diagonal = d3.svg.diagonal(), projection = d3_svg_diagonalProjection, projection_ = diagonal.projection;\n    diagonal.projection = function(x) {\n      return arguments.length ? projection_(d3_svg_diagonalRadialProjection(projection = x)) : projection;\n    };\n    return diagonal;\n  };\n  function d3_svg_diagonalRadialProjection(projection) {\n    return function() {\n      var d = projection.apply(this, arguments), r = d[0], a = d[1] - halfπ;\n      return [ r * Math.cos(a), r * Math.sin(a) ];\n    };\n  }\n  d3.svg.symbol = function() {\n    var type = d3_svg_symbolType, size = d3_svg_symbolSize;\n    function symbol(d, i) {\n      return (d3_svg_symbols.get(type.call(this, d, i)) || d3_svg_symbolCircle)(size.call(this, d, i));\n    }\n    symbol.type = function(x) {\n      if (!arguments.length) return type;\n      type = d3_functor(x);\n      return symbol;\n    };\n    symbol.size = function(x) {\n      if (!arguments.length) return size;\n      size = d3_functor(x);\n      return symbol;\n    };\n    return symbol;\n  };\n  function d3_svg_symbolSize() {\n    return 64;\n  }\n  function d3_svg_symbolType() {\n    return \"circle\";\n  }\n  function d3_svg_symbolCircle(size) {\n    var r = Math.sqrt(size / π);\n    return \"M0,\" + r + \"A\" + r + \",\" + r + \" 0 1,1 0,\" + -r + \"A\" + r + \",\" + r + \" 0 1,1 0,\" + r + \"Z\";\n  }\n  var d3_svg_symbols = d3.map({\n    circle: d3_svg_symbolCircle,\n    cross: function(size) {\n      var r = Math.sqrt(size / 5) / 2;\n      return \"M\" + -3 * r + \",\" + -r + \"H\" + -r + \"V\" + -3 * r + \"H\" + r + \"V\" + -r + \"H\" + 3 * r + \"V\" + r + \"H\" + r + \"V\" + 3 * r + \"H\" + -r + \"V\" + r + \"H\" + -3 * r + \"Z\";\n    },\n    diamond: function(size) {\n      var ry = Math.sqrt(size / (2 * d3_svg_symbolTan30)), rx = ry * d3_svg_symbolTan30;\n      return \"M0,\" + -ry + \"L\" + rx + \",0\" + \" 0,\" + ry + \" \" + -rx + \",0\" + \"Z\";\n    },\n    square: function(size) {\n      var r = Math.sqrt(size) / 2;\n      return \"M\" + -r + \",\" + -r + \"L\" + r + \",\" + -r + \" \" + r + \",\" + r + \" \" + -r + \",\" + r + \"Z\";\n    },\n    \"triangle-down\": function(size) {\n      var rx = Math.sqrt(size / d3_svg_symbolSqrt3), ry = rx * d3_svg_symbolSqrt3 / 2;\n      return \"M0,\" + ry + \"L\" + rx + \",\" + -ry + \" \" + -rx + \",\" + -ry + \"Z\";\n    },\n    \"triangle-up\": function(size) {\n      var rx = Math.sqrt(size / d3_svg_symbolSqrt3), ry = rx * d3_svg_symbolSqrt3 / 2;\n      return \"M0,\" + -ry + \"L\" + rx + \",\" + ry + \" \" + -rx + \",\" + ry + \"Z\";\n    }\n  });\n  d3.svg.symbolTypes = d3_svg_symbols.keys();\n  var d3_svg_symbolSqrt3 = Math.sqrt(3), d3_svg_symbolTan30 = Math.tan(30 * d3_radians);\n  d3_selectionPrototype.transition = function(name) {\n    var id = d3_transitionInheritId || ++d3_transitionId, ns = d3_transitionNamespace(name), subgroups = [], subgroup, node, transition = d3_transitionInherit || {\n      time: Date.now(),\n      ease: d3_ease_cubicInOut,\n      delay: 0,\n      duration: 250\n    };\n    for (var j = -1, m = this.length; ++j < m; ) {\n      subgroups.push(subgroup = []);\n      for (var group = this[j], i = -1, n = group.length; ++i < n; ) {\n        if (node = group[i]) d3_transitionNode(node, i, ns, id, transition);\n        subgroup.push(node);\n      }\n    }\n    return d3_transition(subgroups, ns, id);\n  };\n  d3_selectionPrototype.interrupt = function(name) {\n    return this.each(name == null ? d3_selection_interrupt : d3_selection_interruptNS(d3_transitionNamespace(name)));\n  };\n  var d3_selection_interrupt = d3_selection_interruptNS(d3_transitionNamespace());\n  function d3_selection_interruptNS(ns) {\n    return function() {\n      var lock, activeId, active;\n      if ((lock = this[ns]) && (active = lock[activeId = lock.active])) {\n        active.timer.c = null;\n        active.timer.t = NaN;\n        if (--lock.count) delete lock[activeId]; else delete this[ns];\n        lock.active += .5;\n        active.event && active.event.interrupt.call(this, this.__data__, active.index);\n      }\n    };\n  }\n  function d3_transition(groups, ns, id) {\n    d3_subclass(groups, d3_transitionPrototype);\n    groups.namespace = ns;\n    groups.id = id;\n    return groups;\n  }\n  var d3_transitionPrototype = [], d3_transitionId = 0, d3_transitionInheritId, d3_transitionInherit;\n  d3_transitionPrototype.call = d3_selectionPrototype.call;\n  d3_transitionPrototype.empty = d3_selectionPrototype.empty;\n  d3_transitionPrototype.node = d3_selectionPrototype.node;\n  d3_transitionPrototype.size = d3_selectionPrototype.size;\n  d3.transition = function(selection, name) {\n    return selection && selection.transition ? d3_transitionInheritId ? selection.transition(name) : selection : d3.selection().transition(selection);\n  };\n  d3.transition.prototype = d3_transitionPrototype;\n  d3_transitionPrototype.select = function(selector) {\n    var id = this.id, ns = this.namespace, subgroups = [], subgroup, subnode, node;\n    selector = d3_selection_selector(selector);\n    for (var j = -1, m = this.length; ++j < m; ) {\n      subgroups.push(subgroup = []);\n      for (var group = this[j], i = -1, n = group.length; ++i < n; ) {\n        if ((node = group[i]) && (subnode = selector.call(node, node.__data__, i, j))) {\n          if (\"__data__\" in node) subnode.__data__ = node.__data__;\n          d3_transitionNode(subnode, i, ns, id, node[ns][id]);\n          subgroup.push(subnode);\n        } else {\n          subgroup.push(null);\n        }\n      }\n    }\n    return d3_transition(subgroups, ns, id);\n  };\n  d3_transitionPrototype.selectAll = function(selector) {\n    var id = this.id, ns = this.namespace, subgroups = [], subgroup, subnodes, node, subnode, transition;\n    selector = d3_selection_selectorAll(selector);\n    for (var j = -1, m = this.length; ++j < m; ) {\n      for (var group = this[j], i = -1, n = group.length; ++i < n; ) {\n        if (node = group[i]) {\n          transition = node[ns][id];\n          subnodes = selector.call(node, node.__data__, i, j);\n          subgroups.push(subgroup = []);\n          for (var k = -1, o = subnodes.length; ++k < o; ) {\n            if (subnode = subnodes[k]) d3_transitionNode(subnode, k, ns, id, transition);\n            subgroup.push(subnode);\n          }\n        }\n      }\n    }\n    return d3_transition(subgroups, ns, id);\n  };\n  d3_transitionPrototype.filter = function(filter) {\n    var subgroups = [], subgroup, group, node;\n    if (typeof filter !== \"function\") filter = d3_selection_filter(filter);\n    for (var j = 0, m = this.length; j < m; j++) {\n      subgroups.push(subgroup = []);\n      for (var group = this[j], i = 0, n = group.length; i < n; i++) {\n        if ((node = group[i]) && filter.call(node, node.__data__, i, j)) {\n          subgroup.push(node);\n        }\n      }\n    }\n    return d3_transition(subgroups, this.namespace, this.id);\n  };\n  d3_transitionPrototype.tween = function(name, tween) {\n    var id = this.id, ns = this.namespace;\n    if (arguments.length < 2) return this.node()[ns][id].tween.get(name);\n    return d3_selection_each(this, tween == null ? function(node) {\n      node[ns][id].tween.remove(name);\n    } : function(node) {\n      node[ns][id].tween.set(name, tween);\n    });\n  };\n  function d3_transition_tween(groups, name, value, tween) {\n    var id = groups.id, ns = groups.namespace;\n    return d3_selection_each(groups, typeof value === \"function\" ? function(node, i, j) {\n      node[ns][id].tween.set(name, tween(value.call(node, node.__data__, i, j)));\n    } : (value = tween(value), function(node) {\n      node[ns][id].tween.set(name, value);\n    }));\n  }\n  d3_transitionPrototype.attr = function(nameNS, value) {\n    if (arguments.length < 2) {\n      for (value in nameNS) this.attr(value, nameNS[value]);\n      return this;\n    }\n    var interpolate = nameNS == \"transform\" ? d3_interpolateTransform : d3_interpolate, name = d3.ns.qualify(nameNS);\n    function attrNull() {\n      this.removeAttribute(name);\n    }\n    function attrNullNS() {\n      this.removeAttributeNS(name.space, name.local);\n    }\n    function attrTween(b) {\n      return b == null ? attrNull : (b += \"\", function() {\n        var a = this.getAttribute(name), i;\n        return a !== b && (i = interpolate(a, b), function(t) {\n          this.setAttribute(name, i(t));\n        });\n      });\n    }\n    function attrTweenNS(b) {\n      return b == null ? attrNullNS : (b += \"\", function() {\n        var a = this.getAttributeNS(name.space, name.local), i;\n        return a !== b && (i = interpolate(a, b), function(t) {\n          this.setAttributeNS(name.space, name.local, i(t));\n        });\n      });\n    }\n    return d3_transition_tween(this, \"attr.\" + nameNS, value, name.local ? attrTweenNS : attrTween);\n  };\n  d3_transitionPrototype.attrTween = function(nameNS, tween) {\n    var name = d3.ns.qualify(nameNS);\n    function attrTween(d, i) {\n      var f = tween.call(this, d, i, this.getAttribute(name));\n      return f && function(t) {\n        this.setAttribute(name, f(t));\n      };\n    }\n    function attrTweenNS(d, i) {\n      var f = tween.call(this, d, i, this.getAttributeNS(name.space, name.local));\n      return f && function(t) {\n        this.setAttributeNS(name.space, name.local, f(t));\n      };\n    }\n    return this.tween(\"attr.\" + nameNS, name.local ? attrTweenNS : attrTween);\n  };\n  d3_transitionPrototype.style = function(name, value, priority) {\n    var n = arguments.length;\n    if (n < 3) {\n      if (typeof name !== \"string\") {\n        if (n < 2) value = \"\";\n        for (priority in name) this.style(priority, name[priority], value);\n        return this;\n      }\n      priority = \"\";\n    }\n    function styleNull() {\n      this.style.removeProperty(name);\n    }\n    function styleString(b) {\n      return b == null ? styleNull : (b += \"\", function() {\n        var a = d3_window(this).getComputedStyle(this, null).getPropertyValue(name), i;\n        return a !== b && (i = d3_interpolate(a, b), function(t) {\n          this.style.setProperty(name, i(t), priority);\n        });\n      });\n    }\n    return d3_transition_tween(this, \"style.\" + name, value, styleString);\n  };\n  d3_transitionPrototype.styleTween = function(name, tween, priority) {\n    if (arguments.length < 3) priority = \"\";\n    function styleTween(d, i) {\n      var f = tween.call(this, d, i, d3_window(this).getComputedStyle(this, null).getPropertyValue(name));\n      return f && function(t) {\n        this.style.setProperty(name, f(t), priority);\n      };\n    }\n    return this.tween(\"style.\" + name, styleTween);\n  };\n  d3_transitionPrototype.text = function(value) {\n    return d3_transition_tween(this, \"text\", value, d3_transition_text);\n  };\n  function d3_transition_text(b) {\n    if (b == null) b = \"\";\n    return function() {\n      this.textContent = b;\n    };\n  }\n  d3_transitionPrototype.remove = function() {\n    var ns = this.namespace;\n    return this.each(\"end.transition\", function() {\n      var p;\n      if (this[ns].count < 2 && (p = this.parentNode)) p.removeChild(this);\n    });\n  };\n  d3_transitionPrototype.ease = function(value) {\n    var id = this.id, ns = this.namespace;\n    if (arguments.length < 1) return this.node()[ns][id].ease;\n    if (typeof value !== \"function\") value = d3.ease.apply(d3, arguments);\n    return d3_selection_each(this, function(node) {\n      node[ns][id].ease = value;\n    });\n  };\n  d3_transitionPrototype.delay = function(value) {\n    var id = this.id, ns = this.namespace;\n    if (arguments.length < 1) return this.node()[ns][id].delay;\n    return d3_selection_each(this, typeof value === \"function\" ? function(node, i, j) {\n      node[ns][id].delay = +value.call(node, node.__data__, i, j);\n    } : (value = +value, function(node) {\n      node[ns][id].delay = value;\n    }));\n  };\n  d3_transitionPrototype.duration = function(value) {\n    var id = this.id, ns = this.namespace;\n    if (arguments.length < 1) return this.node()[ns][id].duration;\n    return d3_selection_each(this, typeof value === \"function\" ? function(node, i, j) {\n      node[ns][id].duration = Math.max(1, value.call(node, node.__data__, i, j));\n    } : (value = Math.max(1, value), function(node) {\n      node[ns][id].duration = value;\n    }));\n  };\n  d3_transitionPrototype.each = function(type, listener) {\n    var id = this.id, ns = this.namespace;\n    if (arguments.length < 2) {\n      var inherit = d3_transitionInherit, inheritId = d3_transitionInheritId;\n      try {\n        d3_transitionInheritId = id;\n        d3_selection_each(this, function(node, i, j) {\n          d3_transitionInherit = node[ns][id];\n          type.call(node, node.__data__, i, j);\n        });\n      } finally {\n        d3_transitionInherit = inherit;\n        d3_transitionInheritId = inheritId;\n      }\n    } else {\n      d3_selection_each(this, function(node) {\n        var transition = node[ns][id];\n        (transition.event || (transition.event = d3.dispatch(\"start\", \"end\", \"interrupt\"))).on(type, listener);\n      });\n    }\n    return this;\n  };\n  d3_transitionPrototype.transition = function() {\n    var id0 = this.id, id1 = ++d3_transitionId, ns = this.namespace, subgroups = [], subgroup, group, node, transition;\n    for (var j = 0, m = this.length; j < m; j++) {\n      subgroups.push(subgroup = []);\n      for (var group = this[j], i = 0, n = group.length; i < n; i++) {\n        if (node = group[i]) {\n          transition = node[ns][id0];\n          d3_transitionNode(node, i, ns, id1, {\n            time: transition.time,\n            ease: transition.ease,\n            delay: transition.delay + transition.duration,\n            duration: transition.duration\n          });\n        }\n        subgroup.push(node);\n      }\n    }\n    return d3_transition(subgroups, ns, id1);\n  };\n  function d3_transitionNamespace(name) {\n    return name == null ? \"__transition__\" : \"__transition_\" + name + \"__\";\n  }\n  function d3_transitionNode(node, i, ns, id, inherit) {\n    var lock = node[ns] || (node[ns] = {\n      active: 0,\n      count: 0\n    }), transition = lock[id], time, timer, duration, ease, tweens;\n    function schedule(elapsed) {\n      var delay = transition.delay;\n      timer.t = delay + time;\n      if (delay <= elapsed) return start(elapsed - delay);\n      timer.c = start;\n    }\n    function start(elapsed) {\n      var activeId = lock.active, active = lock[activeId];\n      if (active) {\n        active.timer.c = null;\n        active.timer.t = NaN;\n        --lock.count;\n        delete lock[activeId];\n        active.event && active.event.interrupt.call(node, node.__data__, active.index);\n      }\n      for (var cancelId in lock) {\n        if (+cancelId < id) {\n          var cancel = lock[cancelId];\n          cancel.timer.c = null;\n          cancel.timer.t = NaN;\n          --lock.count;\n          delete lock[cancelId];\n        }\n      }\n      timer.c = tick;\n      d3_timer(function() {\n        if (timer.c && tick(elapsed || 1)) {\n          timer.c = null;\n          timer.t = NaN;\n        }\n        return 1;\n      }, 0, time);\n      lock.active = id;\n      transition.event && transition.event.start.call(node, node.__data__, i);\n      tweens = [];\n      transition.tween.forEach(function(key, value) {\n        if (value = value.call(node, node.__data__, i)) {\n          tweens.push(value);\n        }\n      });\n      ease = transition.ease;\n      duration = transition.duration;\n    }\n    function tick(elapsed) {\n      var t = elapsed / duration, e = ease(t), n = tweens.length;\n      while (n > 0) {\n        tweens[--n].call(node, e);\n      }\n      if (t >= 1) {\n        transition.event && transition.event.end.call(node, node.__data__, i);\n        if (--lock.count) delete lock[id]; else delete node[ns];\n        return 1;\n      }\n    }\n    if (!transition) {\n      time = inherit.time;\n      timer = d3_timer(schedule, 0, time);\n      transition = lock[id] = {\n        tween: new d3_Map(),\n        time: time,\n        timer: timer,\n        delay: inherit.delay,\n        duration: inherit.duration,\n        ease: inherit.ease,\n        index: i\n      };\n      inherit = null;\n      ++lock.count;\n    }\n  }\n  d3.svg.axis = function() {\n    var scale = d3.scale.linear(), orient = d3_svg_axisDefaultOrient, innerTickSize = 6, outerTickSize = 6, tickPadding = 3, tickArguments_ = [ 10 ], tickValues = null, tickFormat_;\n    function axis(g) {\n      g.each(function() {\n        var g = d3.select(this);\n        var scale0 = this.__chart__ || scale, scale1 = this.__chart__ = scale.copy();\n        var ticks = tickValues == null ? scale1.ticks ? scale1.ticks.apply(scale1, tickArguments_) : scale1.domain() : tickValues, tickFormat = tickFormat_ == null ? scale1.tickFormat ? scale1.tickFormat.apply(scale1, tickArguments_) : d3_identity : tickFormat_, tick = g.selectAll(\".tick\").data(ticks, scale1), tickEnter = tick.enter().insert(\"g\", \".domain\").attr(\"class\", \"tick\").style(\"opacity\", ε), tickExit = d3.transition(tick.exit()).style(\"opacity\", ε).remove(), tickUpdate = d3.transition(tick.order()).style(\"opacity\", 1), tickSpacing = Math.max(innerTickSize, 0) + tickPadding, tickTransform;\n        var range = d3_scaleRange(scale1), path = g.selectAll(\".domain\").data([ 0 ]), pathUpdate = (path.enter().append(\"path\").attr(\"class\", \"domain\"), \n        d3.transition(path));\n        tickEnter.append(\"line\");\n        tickEnter.append(\"text\");\n        var lineEnter = tickEnter.select(\"line\"), lineUpdate = tickUpdate.select(\"line\"), text = tick.select(\"text\").text(tickFormat), textEnter = tickEnter.select(\"text\"), textUpdate = tickUpdate.select(\"text\"), sign = orient === \"top\" || orient === \"left\" ? -1 : 1, x1, x2, y1, y2;\n        if (orient === \"bottom\" || orient === \"top\") {\n          tickTransform = d3_svg_axisX, x1 = \"x\", y1 = \"y\", x2 = \"x2\", y2 = \"y2\";\n          text.attr(\"dy\", sign < 0 ? \"0em\" : \".71em\").style(\"text-anchor\", \"middle\");\n          pathUpdate.attr(\"d\", \"M\" + range[0] + \",\" + sign * outerTickSize + \"V0H\" + range[1] + \"V\" + sign * outerTickSize);\n        } else {\n          tickTransform = d3_svg_axisY, x1 = \"y\", y1 = \"x\", x2 = \"y2\", y2 = \"x2\";\n          text.attr(\"dy\", \".32em\").style(\"text-anchor\", sign < 0 ? \"end\" : \"start\");\n          pathUpdate.attr(\"d\", \"M\" + sign * outerTickSize + \",\" + range[0] + \"H0V\" + range[1] + \"H\" + sign * outerTickSize);\n        }\n        lineEnter.attr(y2, sign * innerTickSize);\n        textEnter.attr(y1, sign * tickSpacing);\n        lineUpdate.attr(x2, 0).attr(y2, sign * innerTickSize);\n        textUpdate.attr(x1, 0).attr(y1, sign * tickSpacing);\n        if (scale1.rangeBand) {\n          var x = scale1, dx = x.rangeBand() / 2;\n          scale0 = scale1 = function(d) {\n            return x(d) + dx;\n          };\n        } else if (scale0.rangeBand) {\n          scale0 = scale1;\n        } else {\n          tickExit.call(tickTransform, scale1, scale0);\n        }\n        tickEnter.call(tickTransform, scale0, scale1);\n        tickUpdate.call(tickTransform, scale1, scale1);\n      });\n    }\n    axis.scale = function(x) {\n      if (!arguments.length) return scale;\n      scale = x;\n      return axis;\n    };\n    axis.orient = function(x) {\n      if (!arguments.length) return orient;\n      orient = x in d3_svg_axisOrients ? x + \"\" : d3_svg_axisDefaultOrient;\n      return axis;\n    };\n    axis.ticks = function() {\n      if (!arguments.length) return tickArguments_;\n      tickArguments_ = d3_array(arguments);\n      return axis;\n    };\n    axis.tickValues = function(x) {\n      if (!arguments.length) return tickValues;\n      tickValues = x;\n      return axis;\n    };\n    axis.tickFormat = function(x) {\n      if (!arguments.length) return tickFormat_;\n      tickFormat_ = x;\n      return axis;\n    };\n    axis.tickSize = function(x) {\n      var n = arguments.length;\n      if (!n) return innerTickSize;\n      innerTickSize = +x;\n      outerTickSize = +arguments[n - 1];\n      return axis;\n    };\n    axis.innerTickSize = function(x) {\n      if (!arguments.length) return innerTickSize;\n      innerTickSize = +x;\n      return axis;\n    };\n    axis.outerTickSize = function(x) {\n      if (!arguments.length) return outerTickSize;\n      outerTickSize = +x;\n      return axis;\n    };\n    axis.tickPadding = function(x) {\n      if (!arguments.length) return tickPadding;\n      tickPadding = +x;\n      return axis;\n    };\n    axis.tickSubdivide = function() {\n      return arguments.length && axis;\n    };\n    return axis;\n  };\n  var d3_svg_axisDefaultOrient = \"bottom\", d3_svg_axisOrients = {\n    top: 1,\n    right: 1,\n    bottom: 1,\n    left: 1\n  };\n  function d3_svg_axisX(selection, x0, x1) {\n    selection.attr(\"transform\", function(d) {\n      var v0 = x0(d);\n      return \"translate(\" + (isFinite(v0) ? v0 : x1(d)) + \",0)\";\n    });\n  }\n  function d3_svg_axisY(selection, y0, y1) {\n    selection.attr(\"transform\", function(d) {\n      var v0 = y0(d);\n      return \"translate(0,\" + (isFinite(v0) ? v0 : y1(d)) + \")\";\n    });\n  }\n  d3.svg.brush = function() {\n    var event = d3_eventDispatch(brush, \"brushstart\", \"brush\", \"brushend\"), x = null, y = null, xExtent = [ 0, 0 ], yExtent = [ 0, 0 ], xExtentDomain, yExtentDomain, xClamp = true, yClamp = true, resizes = d3_svg_brushResizes[0];\n    function brush(g) {\n      g.each(function() {\n        var g = d3.select(this).style(\"pointer-events\", \"all\").style(\"-webkit-tap-highlight-color\", \"rgba(0,0,0,0)\").on(\"mousedown.brush\", brushstart).on(\"touchstart.brush\", brushstart);\n        var background = g.selectAll(\".background\").data([ 0 ]);\n        background.enter().append(\"rect\").attr(\"class\", \"background\").style(\"visibility\", \"hidden\").style(\"cursor\", \"crosshair\");\n        g.selectAll(\".extent\").data([ 0 ]).enter().append(\"rect\").attr(\"class\", \"extent\").style(\"cursor\", \"move\");\n        var resize = g.selectAll(\".resize\").data(resizes, d3_identity);\n        resize.exit().remove();\n        resize.enter().append(\"g\").attr(\"class\", function(d) {\n          return \"resize \" + d;\n        }).style(\"cursor\", function(d) {\n          return d3_svg_brushCursor[d];\n        }).append(\"rect\").attr(\"x\", function(d) {\n          return /[ew]$/.test(d) ? -3 : null;\n        }).attr(\"y\", function(d) {\n          return /^[ns]/.test(d) ? -3 : null;\n        }).attr(\"width\", 6).attr(\"height\", 6).style(\"visibility\", \"hidden\");\n        resize.style(\"display\", brush.empty() ? \"none\" : null);\n        var gUpdate = d3.transition(g), backgroundUpdate = d3.transition(background), range;\n        if (x) {\n          range = d3_scaleRange(x);\n          backgroundUpdate.attr(\"x\", range[0]).attr(\"width\", range[1] - range[0]);\n          redrawX(gUpdate);\n        }\n        if (y) {\n          range = d3_scaleRange(y);\n          backgroundUpdate.attr(\"y\", range[0]).attr(\"height\", range[1] - range[0]);\n          redrawY(gUpdate);\n        }\n        redraw(gUpdate);\n      });\n    }\n    brush.event = function(g) {\n      g.each(function() {\n        var event_ = event.of(this, arguments), extent1 = {\n          x: xExtent,\n          y: yExtent,\n          i: xExtentDomain,\n          j: yExtentDomain\n        }, extent0 = this.__chart__ || extent1;\n        this.__chart__ = extent1;\n        if (d3_transitionInheritId) {\n          d3.select(this).transition().each(\"start.brush\", function() {\n            xExtentDomain = extent0.i;\n            yExtentDomain = extent0.j;\n            xExtent = extent0.x;\n            yExtent = extent0.y;\n            event_({\n              type: \"brushstart\"\n            });\n          }).tween(\"brush:brush\", function() {\n            var xi = d3_interpolateArray(xExtent, extent1.x), yi = d3_interpolateArray(yExtent, extent1.y);\n            xExtentDomain = yExtentDomain = null;\n            return function(t) {\n              xExtent = extent1.x = xi(t);\n              yExtent = extent1.y = yi(t);\n              event_({\n                type: \"brush\",\n                mode: \"resize\"\n              });\n            };\n          }).each(\"end.brush\", function() {\n            xExtentDomain = extent1.i;\n            yExtentDomain = extent1.j;\n            event_({\n              type: \"brush\",\n              mode: \"resize\"\n            });\n            event_({\n              type: \"brushend\"\n            });\n          });\n        } else {\n          event_({\n            type: \"brushstart\"\n          });\n          event_({\n            type: \"brush\",\n            mode: \"resize\"\n          });\n          event_({\n            type: \"brushend\"\n          });\n        }\n      });\n    };\n    function redraw(g) {\n      g.selectAll(\".resize\").attr(\"transform\", function(d) {\n        return \"translate(\" + xExtent[+/e$/.test(d)] + \",\" + yExtent[+/^s/.test(d)] + \")\";\n      });\n    }\n    function redrawX(g) {\n      g.select(\".extent\").attr(\"x\", xExtent[0]);\n      g.selectAll(\".extent,.n>rect,.s>rect\").attr(\"width\", xExtent[1] - xExtent[0]);\n    }\n    function redrawY(g) {\n      g.select(\".extent\").attr(\"y\", yExtent[0]);\n      g.selectAll(\".extent,.e>rect,.w>rect\").attr(\"height\", yExtent[1] - yExtent[0]);\n    }\n    function brushstart() {\n      var target = this, eventTarget = d3.select(d3.event.target), event_ = event.of(target, arguments), g = d3.select(target), resizing = eventTarget.datum(), resizingX = !/^(n|s)$/.test(resizing) && x, resizingY = !/^(e|w)$/.test(resizing) && y, dragging = eventTarget.classed(\"extent\"), dragRestore = d3_event_dragSuppress(target), center, origin = d3.mouse(target), offset;\n      var w = d3.select(d3_window(target)).on(\"keydown.brush\", keydown).on(\"keyup.brush\", keyup);\n      if (d3.event.changedTouches) {\n        w.on(\"touchmove.brush\", brushmove).on(\"touchend.brush\", brushend);\n      } else {\n        w.on(\"mousemove.brush\", brushmove).on(\"mouseup.brush\", brushend);\n      }\n      g.interrupt().selectAll(\"*\").interrupt();\n      if (dragging) {\n        origin[0] = xExtent[0] - origin[0];\n        origin[1] = yExtent[0] - origin[1];\n      } else if (resizing) {\n        var ex = +/w$/.test(resizing), ey = +/^n/.test(resizing);\n        offset = [ xExtent[1 - ex] - origin[0], yExtent[1 - ey] - origin[1] ];\n        origin[0] = xExtent[ex];\n        origin[1] = yExtent[ey];\n      } else if (d3.event.altKey) center = origin.slice();\n      g.style(\"pointer-events\", \"none\").selectAll(\".resize\").style(\"display\", null);\n      d3.select(\"body\").style(\"cursor\", eventTarget.style(\"cursor\"));\n      event_({\n        type: \"brushstart\"\n      });\n      brushmove();\n      function keydown() {\n        if (d3.event.keyCode == 32) {\n          if (!dragging) {\n            center = null;\n            origin[0] -= xExtent[1];\n            origin[1] -= yExtent[1];\n            dragging = 2;\n          }\n          d3_eventPreventDefault();\n        }\n      }\n      function keyup() {\n        if (d3.event.keyCode == 32 && dragging == 2) {\n          origin[0] += xExtent[1];\n          origin[1] += yExtent[1];\n          dragging = 0;\n          d3_eventPreventDefault();\n        }\n      }\n      function brushmove() {\n        var point = d3.mouse(target), moved = false;\n        if (offset) {\n          point[0] += offset[0];\n          point[1] += offset[1];\n        }\n        if (!dragging) {\n          if (d3.event.altKey) {\n            if (!center) center = [ (xExtent[0] + xExtent[1]) / 2, (yExtent[0] + yExtent[1]) / 2 ];\n            origin[0] = xExtent[+(point[0] < center[0])];\n            origin[1] = yExtent[+(point[1] < center[1])];\n          } else center = null;\n        }\n        if (resizingX && move1(point, x, 0)) {\n          redrawX(g);\n          moved = true;\n        }\n        if (resizingY && move1(point, y, 1)) {\n          redrawY(g);\n          moved = true;\n        }\n        if (moved) {\n          redraw(g);\n          event_({\n            type: \"brush\",\n            mode: dragging ? \"move\" : \"resize\"\n          });\n        }\n      }\n      function move1(point, scale, i) {\n        var range = d3_scaleRange(scale), r0 = range[0], r1 = range[1], position = origin[i], extent = i ? yExtent : xExtent, size = extent[1] - extent[0], min, max;\n        if (dragging) {\n          r0 -= position;\n          r1 -= size + position;\n        }\n        min = (i ? yClamp : xClamp) ? Math.max(r0, Math.min(r1, point[i])) : point[i];\n        if (dragging) {\n          max = (min += position) + size;\n        } else {\n          if (center) position = Math.max(r0, Math.min(r1, 2 * center[i] - min));\n          if (position < min) {\n            max = min;\n            min = position;\n          } else {\n            max = position;\n          }\n        }\n        if (extent[0] != min || extent[1] != max) {\n          if (i) yExtentDomain = null; else xExtentDomain = null;\n          extent[0] = min;\n          extent[1] = max;\n          return true;\n        }\n      }\n      function brushend() {\n        brushmove();\n        g.style(\"pointer-events\", \"all\").selectAll(\".resize\").style(\"display\", brush.empty() ? \"none\" : null);\n        d3.select(\"body\").style(\"cursor\", null);\n        w.on(\"mousemove.brush\", null).on(\"mouseup.brush\", null).on(\"touchmove.brush\", null).on(\"touchend.brush\", null).on(\"keydown.brush\", null).on(\"keyup.brush\", null);\n        dragRestore();\n        event_({\n          type: \"brushend\"\n        });\n      }\n    }\n    brush.x = function(z) {\n      if (!arguments.length) return x;\n      x = z;\n      resizes = d3_svg_brushResizes[!x << 1 | !y];\n      return brush;\n    };\n    brush.y = function(z) {\n      if (!arguments.length) return y;\n      y = z;\n      resizes = d3_svg_brushResizes[!x << 1 | !y];\n      return brush;\n    };\n    brush.clamp = function(z) {\n      if (!arguments.length) return x && y ? [ xClamp, yClamp ] : x ? xClamp : y ? yClamp : null;\n      if (x && y) xClamp = !!z[0], yClamp = !!z[1]; else if (x) xClamp = !!z; else if (y) yClamp = !!z;\n      return brush;\n    };\n    brush.extent = function(z) {\n      var x0, x1, y0, y1, t;\n      if (!arguments.length) {\n        if (x) {\n          if (xExtentDomain) {\n            x0 = xExtentDomain[0], x1 = xExtentDomain[1];\n          } else {\n            x0 = xExtent[0], x1 = xExtent[1];\n            if (x.invert) x0 = x.invert(x0), x1 = x.invert(x1);\n            if (x1 < x0) t = x0, x0 = x1, x1 = t;\n          }\n        }\n        if (y) {\n          if (yExtentDomain) {\n            y0 = yExtentDomain[0], y1 = yExtentDomain[1];\n          } else {\n            y0 = yExtent[0], y1 = yExtent[1];\n            if (y.invert) y0 = y.invert(y0), y1 = y.invert(y1);\n            if (y1 < y0) t = y0, y0 = y1, y1 = t;\n          }\n        }\n        return x && y ? [ [ x0, y0 ], [ x1, y1 ] ] : x ? [ x0, x1 ] : y && [ y0, y1 ];\n      }\n      if (x) {\n        x0 = z[0], x1 = z[1];\n        if (y) x0 = x0[0], x1 = x1[0];\n        xExtentDomain = [ x0, x1 ];\n        if (x.invert) x0 = x(x0), x1 = x(x1);\n        if (x1 < x0) t = x0, x0 = x1, x1 = t;\n        if (x0 != xExtent[0] || x1 != xExtent[1]) xExtent = [ x0, x1 ];\n      }\n      if (y) {\n        y0 = z[0], y1 = z[1];\n        if (x) y0 = y0[1], y1 = y1[1];\n        yExtentDomain = [ y0, y1 ];\n        if (y.invert) y0 = y(y0), y1 = y(y1);\n        if (y1 < y0) t = y0, y0 = y1, y1 = t;\n        if (y0 != yExtent[0] || y1 != yExtent[1]) yExtent = [ y0, y1 ];\n      }\n      return brush;\n    };\n    brush.clear = function() {\n      if (!brush.empty()) {\n        xExtent = [ 0, 0 ], yExtent = [ 0, 0 ];\n        xExtentDomain = yExtentDomain = null;\n      }\n      return brush;\n    };\n    brush.empty = function() {\n      return !!x && xExtent[0] == xExtent[1] || !!y && yExtent[0] == yExtent[1];\n    };\n    return d3.rebind(brush, event, \"on\");\n  };\n  var d3_svg_brushCursor = {\n    n: \"ns-resize\",\n    e: \"ew-resize\",\n    s: \"ns-resize\",\n    w: \"ew-resize\",\n    nw: \"nwse-resize\",\n    ne: \"nesw-resize\",\n    se: \"nwse-resize\",\n    sw: \"nesw-resize\"\n  };\n  var d3_svg_brushResizes = [ [ \"n\", \"e\", \"s\", \"w\", \"nw\", \"ne\", \"se\", \"sw\" ], [ \"e\", \"w\" ], [ \"n\", \"s\" ], [] ];\n  var d3_time_format = d3_time.format = d3_locale_enUS.timeFormat;\n  var d3_time_formatUtc = d3_time_format.utc;\n  var d3_time_formatIso = d3_time_formatUtc(\"%Y-%m-%dT%H:%M:%S.%LZ\");\n  d3_time_format.iso = Date.prototype.toISOString && +new Date(\"2000-01-01T00:00:00.000Z\") ? d3_time_formatIsoNative : d3_time_formatIso;\n  function d3_time_formatIsoNative(date) {\n    return date.toISOString();\n  }\n  d3_time_formatIsoNative.parse = function(string) {\n    var date = new Date(string);\n    return isNaN(date) ? null : date;\n  };\n  d3_time_formatIsoNative.toString = d3_time_formatIso.toString;\n  d3_time.second = d3_time_interval(function(date) {\n    return new d3_date(Math.floor(date / 1e3) * 1e3);\n  }, function(date, offset) {\n    date.setTime(date.getTime() + Math.floor(offset) * 1e3);\n  }, function(date) {\n    return date.getSeconds();\n  });\n  d3_time.seconds = d3_time.second.range;\n  d3_time.seconds.utc = d3_time.second.utc.range;\n  d3_time.minute = d3_time_interval(function(date) {\n    return new d3_date(Math.floor(date / 6e4) * 6e4);\n  }, function(date, offset) {\n    date.setTime(date.getTime() + Math.floor(offset) * 6e4);\n  }, function(date) {\n    return date.getMinutes();\n  });\n  d3_time.minutes = d3_time.minute.range;\n  d3_time.minutes.utc = d3_time.minute.utc.range;\n  d3_time.hour = d3_time_interval(function(date) {\n    var timezone = date.getTimezoneOffset() / 60;\n    return new d3_date((Math.floor(date / 36e5 - timezone) + timezone) * 36e5);\n  }, function(date, offset) {\n    date.setTime(date.getTime() + Math.floor(offset) * 36e5);\n  }, function(date) {\n    return date.getHours();\n  });\n  d3_time.hours = d3_time.hour.range;\n  d3_time.hours.utc = d3_time.hour.utc.range;\n  d3_time.month = d3_time_interval(function(date) {\n    date = d3_time.day(date);\n    date.setDate(1);\n    return date;\n  }, function(date, offset) {\n    date.setMonth(date.getMonth() + offset);\n  }, function(date) {\n    return date.getMonth();\n  });\n  d3_time.months = d3_time.month.range;\n  d3_time.months.utc = d3_time.month.utc.range;\n  function d3_time_scale(linear, methods, format) {\n    function scale(x) {\n      return linear(x);\n    }\n    scale.invert = function(x) {\n      return d3_time_scaleDate(linear.invert(x));\n    };\n    scale.domain = function(x) {\n      if (!arguments.length) return linear.domain().map(d3_time_scaleDate);\n      linear.domain(x);\n      return scale;\n    };\n    function tickMethod(extent, count) {\n      var span = extent[1] - extent[0], target = span / count, i = d3.bisect(d3_time_scaleSteps, target);\n      return i == d3_time_scaleSteps.length ? [ methods.year, d3_scale_linearTickRange(extent.map(function(d) {\n        return d / 31536e6;\n      }), count)[2] ] : !i ? [ d3_time_scaleMilliseconds, d3_scale_linearTickRange(extent, count)[2] ] : methods[target / d3_time_scaleSteps[i - 1] < d3_time_scaleSteps[i] / target ? i - 1 : i];\n    }\n    scale.nice = function(interval, skip) {\n      var domain = scale.domain(), extent = d3_scaleExtent(domain), method = interval == null ? tickMethod(extent, 10) : typeof interval === \"number\" && tickMethod(extent, interval);\n      if (method) interval = method[0], skip = method[1];\n      function skipped(date) {\n        return !isNaN(date) && !interval.range(date, d3_time_scaleDate(+date + 1), skip).length;\n      }\n      return scale.domain(d3_scale_nice(domain, skip > 1 ? {\n        floor: function(date) {\n          while (skipped(date = interval.floor(date))) date = d3_time_scaleDate(date - 1);\n          return date;\n        },\n        ceil: function(date) {\n          while (skipped(date = interval.ceil(date))) date = d3_time_scaleDate(+date + 1);\n          return date;\n        }\n      } : interval));\n    };\n    scale.ticks = function(interval, skip) {\n      var extent = d3_scaleExtent(scale.domain()), method = interval == null ? tickMethod(extent, 10) : typeof interval === \"number\" ? tickMethod(extent, interval) : !interval.range && [ {\n        range: interval\n      }, skip ];\n      if (method) interval = method[0], skip = method[1];\n      return interval.range(extent[0], d3_time_scaleDate(+extent[1] + 1), skip < 1 ? 1 : skip);\n    };\n    scale.tickFormat = function() {\n      return format;\n    };\n    scale.copy = function() {\n      return d3_time_scale(linear.copy(), methods, format);\n    };\n    return d3_scale_linearRebind(scale, linear);\n  }\n  function d3_time_scaleDate(t) {\n    return new Date(t);\n  }\n  var d3_time_scaleSteps = [ 1e3, 5e3, 15e3, 3e4, 6e4, 3e5, 9e5, 18e5, 36e5, 108e5, 216e5, 432e5, 864e5, 1728e5, 6048e5, 2592e6, 7776e6, 31536e6 ];\n  var d3_time_scaleLocalMethods = [ [ d3_time.second, 1 ], [ d3_time.second, 5 ], [ d3_time.second, 15 ], [ d3_time.second, 30 ], [ d3_time.minute, 1 ], [ d3_time.minute, 5 ], [ d3_time.minute, 15 ], [ d3_time.minute, 30 ], [ d3_time.hour, 1 ], [ d3_time.hour, 3 ], [ d3_time.hour, 6 ], [ d3_time.hour, 12 ], [ d3_time.day, 1 ], [ d3_time.day, 2 ], [ d3_time.week, 1 ], [ d3_time.month, 1 ], [ d3_time.month, 3 ], [ d3_time.year, 1 ] ];\n  var d3_time_scaleLocalFormat = d3_time_format.multi([ [ \".%L\", function(d) {\n    return d.getMilliseconds();\n  } ], [ \":%S\", function(d) {\n    return d.getSeconds();\n  } ], [ \"%I:%M\", function(d) {\n    return d.getMinutes();\n  } ], [ \"%I %p\", function(d) {\n    return d.getHours();\n  } ], [ \"%a %d\", function(d) {\n    return d.getDay() && d.getDate() != 1;\n  } ], [ \"%b %d\", function(d) {\n    return d.getDate() != 1;\n  } ], [ \"%B\", function(d) {\n    return d.getMonth();\n  } ], [ \"%Y\", d3_true ] ]);\n  var d3_time_scaleMilliseconds = {\n    range: function(start, stop, step) {\n      return d3.range(Math.ceil(start / step) * step, +stop, step).map(d3_time_scaleDate);\n    },\n    floor: d3_identity,\n    ceil: d3_identity\n  };\n  d3_time_scaleLocalMethods.year = d3_time.year;\n  d3_time.scale = function() {\n    return d3_time_scale(d3.scale.linear(), d3_time_scaleLocalMethods, d3_time_scaleLocalFormat);\n  };\n  var d3_time_scaleUtcMethods = d3_time_scaleLocalMethods.map(function(m) {\n    return [ m[0].utc, m[1] ];\n  });\n  var d3_time_scaleUtcFormat = d3_time_formatUtc.multi([ [ \".%L\", function(d) {\n    return d.getUTCMilliseconds();\n  } ], [ \":%S\", function(d) {\n    return d.getUTCSeconds();\n  } ], [ \"%I:%M\", function(d) {\n    return d.getUTCMinutes();\n  } ], [ \"%I %p\", function(d) {\n    return d.getUTCHours();\n  } ], [ \"%a %d\", function(d) {\n    return d.getUTCDay() && d.getUTCDate() != 1;\n  } ], [ \"%b %d\", function(d) {\n    return d.getUTCDate() != 1;\n  } ], [ \"%B\", function(d) {\n    return d.getUTCMonth();\n  } ], [ \"%Y\", d3_true ] ]);\n  d3_time_scaleUtcMethods.year = d3_time.year.utc;\n  d3_time.scale.utc = function() {\n    return d3_time_scale(d3.scale.linear(), d3_time_scaleUtcMethods, d3_time_scaleUtcFormat);\n  };\n  d3.text = d3_xhrType(function(request) {\n    return request.responseText;\n  });\n  d3.json = function(url, callback) {\n    return d3_xhr(url, \"application/json\", d3_json, callback);\n  };\n  function d3_json(request) {\n    return JSON.parse(request.responseText);\n  }\n  d3.html = function(url, callback) {\n    return d3_xhr(url, \"text/html\", d3_html, callback);\n  };\n  function d3_html(request) {\n    var range = d3_document.createRange();\n    range.selectNode(d3_document.body);\n    return range.createContextualFragment(request.responseText);\n  }\n  d3.xml = d3_xhrType(function(request) {\n    return request.responseXML;\n  });\n  if (typeof define === \"function\" && define.amd) this.d3 = d3, define(d3); else if (typeof module === \"object\" && module.exports) module.exports = d3; else this.d3 = d3;\n}();\n/* nvd3 version 1.8.1 (https://github.com/novus/nvd3) 2015-06-15 */\n(function(){\n\n// set up main nv object\nvar nv = {};\n\n// the major global objects under the nv namespace\nnv.dev = false; //set false when in production\nnv.tooltip = nv.tooltip || {}; // For the tooltip system\nnv.utils = nv.utils || {}; // Utility subsystem\nnv.models = nv.models || {}; //stores all the possible models/components\nnv.charts = {}; //stores all the ready to use charts\nnv.logs = {}; //stores some statistics and potential error messages\nnv.dom = {}; //DOM manipulation functions\n\nnv.dispatch = d3.dispatch('render_start', 'render_end');\n\n// Function bind polyfill\n// Needed ONLY for phantomJS as it's missing until version 2.0 which is unreleased as of this comment\n// https://github.com/ariya/phantomjs/issues/10522\n// http://kangax.github.io/compat-table/es5/#Function.prototype.bind\n// phantomJS is used for running the test suite\nif (!Function.prototype.bind) {\n    Function.prototype.bind = function (oThis) {\n        if (typeof this !== \"function\") {\n            // closest thing possible to the ECMAScript 5 internal IsCallable function\n            throw new TypeError(\"Function.prototype.bind - what is trying to be bound is not callable\");\n        }\n\n        var aArgs = Array.prototype.slice.call(arguments, 1),\n            fToBind = this,\n            fNOP = function () {},\n            fBound = function () {\n                return fToBind.apply(this instanceof fNOP && oThis\n                        ? this\n                        : oThis,\n                    aArgs.concat(Array.prototype.slice.call(arguments)));\n            };\n\n        fNOP.prototype = this.prototype;\n        fBound.prototype = new fNOP();\n        return fBound;\n    };\n}\n\n//  Development render timers - disabled if dev = false\nif (nv.dev) {\n    nv.dispatch.on('render_start', function(e) {\n        nv.logs.startTime = +new Date();\n    });\n\n    nv.dispatch.on('render_end', function(e) {\n        nv.logs.endTime = +new Date();\n        nv.logs.totalTime = nv.logs.endTime - nv.logs.startTime;\n        nv.log('total', nv.logs.totalTime); // used for development, to keep track of graph generation times\n    });\n}\n\n// Logs all arguments, and returns the last so you can test things in place\n// Note: in IE8 console.log is an object not a function, and if modernizr is used\n// then calling Function.prototype.bind with with anything other than a function\n// causes a TypeError to be thrown.\nnv.log = function() {\n    if (nv.dev && window.console && console.log && console.log.apply)\n        console.log.apply(console, arguments);\n    else if (nv.dev && window.console && typeof console.log == \"function\" && Function.prototype.bind) {\n        var log = Function.prototype.bind.call(console.log, console);\n        log.apply(console, arguments);\n    }\n    return arguments[arguments.length - 1];\n};\n\n// print console warning, should be used by deprecated functions\nnv.deprecated = function(name, info) {\n    if (console && console.warn) {\n        console.warn('nvd3 warning: `' + name + '` has been deprecated. ', info || '');\n    }\n};\n\n// The nv.render function is used to queue up chart rendering\n// in non-blocking async functions.\n// When all queued charts are done rendering, nv.dispatch.render_end is invoked.\nnv.render = function render(step) {\n    // number of graphs to generate in each timeout loop\n    step = step || 1;\n\n    nv.render.active = true;\n    nv.dispatch.render_start();\n\n    var renderLoop = function() {\n        var chart, graph;\n\n        for (var i = 0; i < step && (graph = nv.render.queue[i]); i++) {\n            chart = graph.generate();\n            if (typeof graph.callback == typeof(Function)) graph.callback(chart);\n        }\n\n        nv.render.queue.splice(0, i);\n\n        if (nv.render.queue.length) {\n            setTimeout(renderLoop);\n        }\n        else {\n            nv.dispatch.render_end();\n            nv.render.active = false;\n        }\n    };\n\n    setTimeout(renderLoop);\n};\n\nnv.render.active = false;\nnv.render.queue = [];\n\n/*\nAdds a chart to the async rendering queue. This method can take arguments in two forms:\nnv.addGraph({\n    generate: <Function>\n    callback: <Function>\n})\n\nor\n\nnv.addGraph(<generate Function>, <callback Function>)\n\nThe generate function should contain code that creates the NVD3 model, sets options\non it, adds data to an SVG element, and invokes the chart model. The generate function\nshould return the chart model.  See examples/lineChart.html for a usage example.\n\nThe callback function is optional, and it is called when the generate function completes.\n*/\nnv.addGraph = function(obj) {\n    if (typeof arguments[0] === typeof(Function)) {\n        obj = {generate: arguments[0], callback: arguments[1]};\n    }\n\n    nv.render.queue.push(obj);\n\n    if (!nv.render.active) {\n        nv.render();\n    }\n};\n\n// Node/CommonJS exports\nif (typeof(module) !== 'undefined' && typeof(exports) !== 'undefined') {\n  module.exports = nv;\n}\n\nif (typeof(window) !== 'undefined') {\n  window.nv = nv;\n}\n/* Facade for queueing DOM write operations\r\n * with Fastdom (https://github.com/wilsonpage/fastdom)\r\n * if available.\r\n * This could easily be extended to support alternate\r\n * implementations in the future.\r\n */\r\nnv.dom.write = function(callback) {\r\n\tif (window.fastdom !== undefined) {\r\n\t\treturn fastdom.write(callback);\r\n\t}\r\n\treturn callback();\r\n};\r\n\r\n/* Facade for queueing DOM read operations\r\n * with Fastdom (https://github.com/wilsonpage/fastdom)\r\n * if available.\r\n * This could easily be extended to support alternate\r\n * implementations in the future.\r\n */\r\nnv.dom.read = function(callback) {\r\n\tif (window.fastdom !== undefined) {\r\n\t\treturn fastdom.read(callback);\r\n\t}\r\n\treturn callback();\r\n};/* Utility class to handle creation of an interactive layer.\n This places a rectangle on top of the chart. When you mouse move over it, it sends a dispatch\n containing the X-coordinate. It can also render a vertical line where the mouse is located.\n\n dispatch.elementMousemove is the important event to latch onto.  It is fired whenever the mouse moves over\n the rectangle. The dispatch is given one object which contains the mouseX/Y location.\n It also has 'pointXValue', which is the conversion of mouseX to the x-axis scale.\n */\nnv.interactiveGuideline = function() {\n    \"use strict\";\n\n    var tooltip = nv.models.tooltip();\n    tooltip.duration(0).hideDelay(0)._isInteractiveLayer(true).hidden(false);\n\n    //Public settings\n    var width = null;\n    var height = null;\n\n    //Please pass in the bounding chart's top and left margins\n    //This is important for calculating the correct mouseX/Y positions.\n    var margin = {left: 0, top: 0}\n        , xScale = d3.scale.linear()\n        , dispatch = d3.dispatch('elementMousemove', 'elementMouseout', 'elementClick', 'elementDblclick')\n        , showGuideLine = true;\n    //Must pass in the bounding chart's <svg> container.\n    //The mousemove event is attached to this container.\n    var svgContainer = null;\n\n    // check if IE by looking for activeX\n    var isMSIE = \"ActiveXObject\" in window;\n\n\n    function layer(selection) {\n        selection.each(function(data) {\n            var container = d3.select(this);\n            var availableWidth = (width || 960), availableHeight = (height || 400);\n            var wrap = container.selectAll(\"g.nv-wrap.nv-interactiveLineLayer\")\n                .data([data]);\n            var wrapEnter = wrap.enter()\n                .append(\"g\").attr(\"class\", \" nv-wrap nv-interactiveLineLayer\");\n            wrapEnter.append(\"g\").attr(\"class\",\"nv-interactiveGuideLine\");\n\n            if (!svgContainer) {\n                return;\n            }\n\n            function mouseHandler() {\n                var d3mouse = d3.mouse(this);\n                var mouseX = d3mouse[0];\n                var mouseY = d3mouse[1];\n                var subtractMargin = true;\n                var mouseOutAnyReason = false;\n                if (isMSIE) {\n                    /*\n                     D3.js (or maybe SVG.getScreenCTM) has a nasty bug in Internet Explorer 10.\n                     d3.mouse() returns incorrect X,Y mouse coordinates when mouse moving\n                     over a rect in IE 10.\n                     However, d3.event.offsetX/Y also returns the mouse coordinates\n                     relative to the triggering <rect>. So we use offsetX/Y on IE.\n                     */\n                    mouseX = d3.event.offsetX;\n                    mouseY = d3.event.offsetY;\n\n                    /*\n                     On IE, if you attach a mouse event listener to the <svg> container,\n                     it will actually trigger it for all the child elements (like <path>, <circle>, etc).\n                     When this happens on IE, the offsetX/Y is set to where ever the child element\n                     is located.\n                     As a result, we do NOT need to subtract margins to figure out the mouse X/Y\n                     position under this scenario. Removing the line below *will* cause\n                     the interactive layer to not work right on IE.\n                     */\n                    if(d3.event.target.tagName !== \"svg\") {\n                        subtractMargin = false;\n                    }\n\n                    if (d3.event.target.className.baseVal.match(\"nv-legend\")) {\n                        mouseOutAnyReason = true;\n                    }\n\n                }\n\n                if(subtractMargin) {\n                    mouseX -= margin.left;\n                    mouseY -= margin.top;\n                }\n\n                /* If mouseX/Y is outside of the chart's bounds,\n                 trigger a mouseOut event.\n                 */\n                if (mouseX < 0 || mouseY < 0\n                    || mouseX > availableWidth || mouseY > availableHeight\n                    || (d3.event.relatedTarget && d3.event.relatedTarget.ownerSVGElement === undefined)\n                    || mouseOutAnyReason\n                    ) {\n\n                    if (isMSIE) {\n                        if (d3.event.relatedTarget\n                            && d3.event.relatedTarget.ownerSVGElement === undefined\n                            && (d3.event.relatedTarget.className === undefined\n                                || d3.event.relatedTarget.className.match(tooltip.nvPointerEventsClass))) {\n\n                            return;\n                        }\n                    }\n                    dispatch.elementMouseout({\n                        mouseX: mouseX,\n                        mouseY: mouseY\n                    });\n                    layer.renderGuideLine(null); //hide the guideline\n                    tooltip.hidden(true);\n                    return;\n                } else {\n                    tooltip.hidden(false);\n                }\n\n                var pointXValue = xScale.invert(mouseX);\n                dispatch.elementMousemove({\n                    mouseX: mouseX,\n                    mouseY: mouseY,\n                    pointXValue: pointXValue\n                });\n\n                //If user double clicks the layer, fire a elementDblclick\n                if (d3.event.type === \"dblclick\") {\n                    dispatch.elementDblclick({\n                        mouseX: mouseX,\n                        mouseY: mouseY,\n                        pointXValue: pointXValue\n                    });\n                }\n\n                // if user single clicks the layer, fire elementClick\n                if (d3.event.type === 'click') {\n                    dispatch.elementClick({\n                        mouseX: mouseX,\n                        mouseY: mouseY,\n                        pointXValue: pointXValue\n                    });\n                }\n            }\n\n            svgContainer\n                .on(\"touchmove\",mouseHandler)\n                .on(\"mousemove\",mouseHandler, true)\n                .on(\"mouseout\" ,mouseHandler,true)\n                .on(\"dblclick\" ,mouseHandler)\n                .on(\"click\", mouseHandler)\n            ;\n\n            layer.guideLine = null;\n            //Draws a vertical guideline at the given X postion.\n            layer.renderGuideLine = function(x) {\n                if (!showGuideLine) return;\n                if (layer.guideLine && layer.guideLine.attr(\"x1\") === x) return;\n                nv.dom.write(function() {\n                    var line = wrap.select(\".nv-interactiveGuideLine\")\n                        .selectAll(\"line\")\n                        .data((x != null) ? [nv.utils.NaNtoZero(x)] : [], String);\n                    line.enter()\n                        .append(\"line\")\n                        .attr(\"class\", \"nv-guideline\")\n                        .attr(\"x1\", function(d) { return d;})\n                        .attr(\"x2\", function(d) { return d;})\n                        .attr(\"y1\", availableHeight)\n                        .attr(\"y2\",0);\n                    line.exit().remove();\n                });\n            }\n        });\n    }\n\n    layer.dispatch = dispatch;\n    layer.tooltip = tooltip;\n\n    layer.margin = function(_) {\n        if (!arguments.length) return margin;\n        margin.top    = typeof _.top    != 'undefined' ? _.top    : margin.top;\n        margin.left   = typeof _.left   != 'undefined' ? _.left   : margin.left;\n        return layer;\n    };\n\n    layer.width = function(_) {\n        if (!arguments.length) return width;\n        width = _;\n        return layer;\n    };\n\n    layer.height = function(_) {\n        if (!arguments.length) return height;\n        height = _;\n        return layer;\n    };\n\n    layer.xScale = function(_) {\n        if (!arguments.length) return xScale;\n        xScale = _;\n        return layer;\n    };\n\n    layer.showGuideLine = function(_) {\n        if (!arguments.length) return showGuideLine;\n        showGuideLine = _;\n        return layer;\n    };\n\n    layer.svgContainer = function(_) {\n        if (!arguments.length) return svgContainer;\n        svgContainer = _;\n        return layer;\n    };\n\n    return layer;\n};\n\n/* Utility class that uses d3.bisect to find the index in a given array, where a search value can be inserted.\n This is different from normal bisectLeft; this function finds the nearest index to insert the search value.\n\n For instance, lets say your array is [1,2,3,5,10,30], and you search for 28.\n Normal d3.bisectLeft will return 4, because 28 is inserted after the number 10.  But interactiveBisect will return 5\n because 28 is closer to 30 than 10.\n\n Unit tests can be found in: interactiveBisectTest.html\n\n Has the following known issues:\n * Will not work if the data points move backwards (ie, 10,9,8,7, etc) or if the data points are in random order.\n * Won't work if there are duplicate x coordinate values.\n */\nnv.interactiveBisect = function (values, searchVal, xAccessor) {\n    \"use strict\";\n    if (! (values instanceof Array)) {\n        return null;\n    }\n    var _xAccessor;\n    if (typeof xAccessor !== 'function') {\n        _xAccessor = function(d) {\n            return d.x;\n        }\n    } else {\n        _xAccessor = xAccessor;\n    }\n    var _cmp = function(d, v) {\n        // Accessors are no longer passed the index of the element along with\n        // the element itself when invoked by d3.bisector.\n        //\n        // Starting at D3 v3.4.4, d3.bisector() started inspecting the\n        // function passed to determine if it should consider it an accessor\n        // or a comparator. This meant that accessors that take two arguments\n        // (expecting an index as the second parameter) are treated as\n        // comparators where the second argument is the search value against\n        // which the first argument is compared.\n        return _xAccessor(d) - v;\n    };\n\n    var bisect = d3.bisector(_cmp).left;\n    var index = d3.max([0, bisect(values,searchVal) - 1]);\n    var currentValue = _xAccessor(values[index]);\n\n    if (typeof currentValue === 'undefined') {\n        currentValue = index;\n    }\n\n    if (currentValue === searchVal) {\n        return index; //found exact match\n    }\n\n    var nextIndex = d3.min([index+1, values.length - 1]);\n    var nextValue = _xAccessor(values[nextIndex]);\n\n    if (typeof nextValue === 'undefined') {\n        nextValue = nextIndex;\n    }\n\n    if (Math.abs(nextValue - searchVal) >= Math.abs(currentValue - searchVal)) {\n        return index;\n    } else {\n        return nextIndex\n    }\n};\n\n/*\n Returns the index in the array \"values\" that is closest to searchVal.\n Only returns an index if searchVal is within some \"threshold\".\n Otherwise, returns null.\n */\nnv.nearestValueIndex = function (values, searchVal, threshold) {\n    \"use strict\";\n    var yDistMax = Infinity, indexToHighlight = null;\n    values.forEach(function(d,i) {\n        var delta = Math.abs(searchVal - d);\n        if ( d != null && delta <= yDistMax && delta < threshold) {\n            yDistMax = delta;\n            indexToHighlight = i;\n        }\n    });\n    return indexToHighlight;\n};\n/* Tooltip rendering model for nvd3 charts.\n window.nv.models.tooltip is the updated,new way to render tooltips.\n\n window.nv.tooltip.show is the old tooltip code.\n window.nv.tooltip.* also has various helper methods.\n */\n(function() {\n    \"use strict\";\n\n    /* Model which can be instantiated to handle tooltip rendering.\n     Example usage:\n     var tip = nv.models.tooltip().gravity('w').distance(23)\n     .data(myDataObject);\n\n     tip();    //just invoke the returned function to render tooltip.\n     */\n    nv.models.tooltip = function() {\n\n        /*\n        Tooltip data. If data is given in the proper format, a consistent tooltip is generated.\n        Example Format of data:\n        {\n            key: \"Date\",\n            value: \"August 2009\",\n            series: [\n                {key: \"Series 1\", value: \"Value 1\", color: \"#000\"},\n                {key: \"Series 2\", value: \"Value 2\", color: \"#00f\"}\n            ]\n        }\n        */\n        var data = null;\n        var gravity = 'w'   //Can be 'n','s','e','w'. Determines how tooltip is positioned.\n            ,   distance = 25   //Distance to offset tooltip from the mouse location.\n            ,   snapDistance = 0   //Tolerance allowed before tooltip is moved from its current position (creates 'snapping' effect)\n            ,   fixedTop = null //If not null, this fixes the top position of the tooltip.\n            ,   classes = null  //Attaches additional CSS classes to the tooltip DIV that is created.\n            ,   chartContainer = null   //Parent dom element of the SVG that holds the chart.\n            ,   hidden = true  // start off hidden, toggle with hide/show functions below\n            ,   hideDelay = 400  // delay before the tooltip hides after calling hide()\n            ,   tooltip = null // d3 select of tooltipElem below\n            ,   tooltipElem = null  //actual DOM element representing the tooltip.\n            ,   position = {left: null, top: null}   //Relative position of the tooltip inside chartContainer.\n            ,   offset = {left: 0, top: 0}   //Offset of tooltip against the pointer\n            ,   enabled = true  //True -> tooltips are rendered. False -> don't render tooltips.\n            ,   duration = 100 // duration for tooltip movement\n            ,   headerEnabled = true\n        ;\n\n        // set to true by interactive layer to adjust tooltip positions\n        // eventually we should probably fix interactive layer to get the position better.\n        // for now this is needed if you want to set chartContainer for normal tooltips, else it \"fixes\" it to broken\n        var isInteractiveLayer = false;\n\n        //Generates a unique id when you create a new tooltip() object\n        var id = \"nvtooltip-\" + Math.floor(Math.random() * 100000);\n\n        //CSS class to specify whether element should not have mouse events.\n        var  nvPointerEventsClass = \"nv-pointer-events-none\";\n\n        //Format function for the tooltip values column\n        var valueFormatter = function(d,i) {\n            return d;\n        };\n\n        //Format function for the tooltip header value.\n        var headerFormatter = function(d) {\n            return d;\n        };\n\n        var keyFormatter = function(d, i) {\n            return d;\n        };\n\n        //By default, the tooltip model renders a beautiful table inside a DIV.\n        //You can override this function if a custom tooltip is desired.\n        var contentGenerator = function(d) {\n            if (d === null) {\n                return '';\n            }\n\n            var table = d3.select(document.createElement(\"table\"));\n            if (headerEnabled) {\n                var theadEnter = table.selectAll(\"thead\")\n                    .data([d])\n                    .enter().append(\"thead\");\n\n                theadEnter.append(\"tr\")\n                    .append(\"td\")\n                    .attr(\"colspan\", 3)\n                    .append(\"strong\")\n                    .classed(\"x-value\", true)\n                    .html(headerFormatter(d.value));\n            }\n\n            var tbodyEnter = table.selectAll(\"tbody\")\n                .data([d])\n                .enter().append(\"tbody\");\n\n            var trowEnter = tbodyEnter.selectAll(\"tr\")\n                    .data(function(p) { return p.series})\n                    .enter()\n                    .append(\"tr\")\n                    .classed(\"highlight\", function(p) { return p.highlight});\n\n            trowEnter.append(\"td\")\n                .classed(\"legend-color-guide\",true)\n                .append(\"div\")\n                .style(\"background-color\", function(p) { return p.color});\n\n            trowEnter.append(\"td\")\n                .classed(\"key\",true)\n                .html(function(p, i) {return keyFormatter(p.key, i)});\n\n            trowEnter.append(\"td\")\n                .classed(\"value\",true)\n                .html(function(p, i) { return valueFormatter(p.value, i) });\n\n\n            trowEnter.selectAll(\"td\").each(function(p) {\n                if (p.highlight) {\n                    var opacityScale = d3.scale.linear().domain([0,1]).range([\"#fff\",p.color]);\n                    var opacity = 0.6;\n                    d3.select(this)\n                        .style(\"border-bottom-color\", opacityScale(opacity))\n                        .style(\"border-top-color\", opacityScale(opacity))\n                    ;\n                }\n            });\n\n            var html = table.node().outerHTML;\n            if (d.footer !== undefined)\n                html += \"<div class='footer'>\" + d.footer + \"</div>\";\n            return html;\n\n        };\n\n        var dataSeriesExists = function(d) {\n            if (d && d.series) {\n                if (d.series instanceof Array) {\n                    return !!d.series.length;\n                }\n                // if object, it's okay just convert to array of the object\n                if (d.series instanceof Object) {\n                    d.series = [d.series];\n                    return true;\n                }\n            }\n            return false;\n        };\n\n        var calcTooltipPosition = function(pos) {\n            if (!tooltipElem) return;\n\n            nv.dom.read(function() {\n                var height = parseInt(tooltipElem.offsetHeight, 10),\n                    width = parseInt(tooltipElem.offsetWidth, 10),\n                    windowWidth = nv.utils.windowSize().width,\n                    windowHeight = nv.utils.windowSize().height,\n                    scrollTop = window.pageYOffset,\n                    scrollLeft = window.pageXOffset,\n                    left, top;\n\n                windowHeight = window.innerWidth >= document.body.scrollWidth ? windowHeight : windowHeight - 16;\n                windowWidth = window.innerHeight >= document.body.scrollHeight ? windowWidth : windowWidth - 16;\n\n\n                //Helper functions to find the total offsets of a given DOM element.\n                //Looks up the entire ancestry of an element, up to the first relatively positioned element.\n                var tooltipTop = function ( Elem ) {\n                    var offsetTop = top;\n                    do {\n                        if( !isNaN( Elem.offsetTop ) ) {\n                            offsetTop += (Elem.offsetTop);\n                        }\n                        Elem = Elem.offsetParent;\n                    } while( Elem );\n                    return offsetTop;\n                };\n                var tooltipLeft = function ( Elem ) {\n                    var offsetLeft = left;\n                    do {\n                        if( !isNaN( Elem.offsetLeft ) ) {\n                            offsetLeft += (Elem.offsetLeft);\n                        }\n                        Elem = Elem.offsetParent;\n                    } while( Elem );\n                    return offsetLeft;\n                };\n\n                // calculate position based on gravity\n                var tLeft, tTop;\n                switch (gravity) {\n                    case 'e':\n                        left = pos[0] - width - distance;\n                        top = pos[1] - (height / 2);\n                        tLeft = tooltipLeft(tooltipElem);\n                        tTop = tooltipTop(tooltipElem);\n                        if (tLeft < scrollLeft) left = pos[0] + distance > scrollLeft ? pos[0] + distance : scrollLeft - tLeft + left;\n                        if (tTop < scrollTop) top = scrollTop - tTop + top;\n                        if (tTop + height > scrollTop + windowHeight) top = scrollTop + windowHeight - tTop + top - height;\n                        break;\n                    case 'w':\n                        left = pos[0] + distance;\n                        top = pos[1] - (height / 2);\n                        tLeft = tooltipLeft(tooltipElem);\n                        tTop = tooltipTop(tooltipElem);\n                        if (tLeft + width > windowWidth) left = pos[0] - width - distance;\n                        if (tTop < scrollTop) top = scrollTop + 5;\n                        if (tTop + height > scrollTop + windowHeight) top = scrollTop + windowHeight - tTop + top - height;\n                        break;\n                    case 'n':\n                        left = pos[0] - (width / 2) - 5;\n                        top = pos[1] + distance;\n                        tLeft = tooltipLeft(tooltipElem);\n                        tTop = tooltipTop(tooltipElem);\n                        if (tLeft < scrollLeft) left = scrollLeft + 5;\n                        if (tLeft + width > windowWidth) left = left - width/2 + 5;\n                        if (tTop + height > scrollTop + windowHeight) top = scrollTop + windowHeight - tTop + top - height;\n                        break;\n                    case 's':\n                        left = pos[0] - (width / 2);\n                        top = pos[1] - height - distance;\n                        tLeft = tooltipLeft(tooltipElem);\n                        tTop = tooltipTop(tooltipElem);\n                        if (tLeft < scrollLeft) left = scrollLeft + 5;\n                        if (tLeft + width > windowWidth) left = left - width/2 + 5;\n                        if (scrollTop > tTop) top = scrollTop;\n                        break;\n                    case 'none':\n                        left = pos[0];\n                        top = pos[1] - distance;\n                        tLeft = tooltipLeft(tooltipElem);\n                        tTop = tooltipTop(tooltipElem);\n                        break;\n                }\n                \n                // adjust tooltip offsets\n                left -= offset.left;\n                top -= offset.top;\n\n                // using tooltip.style('transform') returns values un-usable for tween\n                var box = tooltipElem.getBoundingClientRect();\n                var scrollTop  = window.pageYOffset || document.documentElement.scrollTop;\n                var scrollLeft = window.pageXOffset || document.documentElement.scrollLeft;\n                var old_translate = 'translate(' + (box.left + scrollLeft) + 'px, ' + (box.top + scrollTop) + 'px)';\n                var new_translate = 'translate(' + left + 'px, ' + top + 'px)';\n                var translateInterpolator = d3.interpolateString(old_translate, new_translate);\n\n                var is_hidden = tooltip.style('opacity') < 0.1;\n\n                // delay hiding a bit to avoid flickering\n                if (hidden) {\n                    tooltip\n                        .transition()\n                        .delay(hideDelay)\n                        .duration(0)\n                        .style('opacity', 0);\n                } else {\n                    tooltip\n                        .interrupt() // cancel running transitions\n                        .transition()\n                        .duration(is_hidden ? 0 : duration)\n                        // using tween since some versions of d3 can't auto-tween a translate on a div\n                        .styleTween('transform', function (d) {\n                            return translateInterpolator;\n                        }, 'important')\n                        // Safari has its own `-webkit-transform` and does not support `transform` \n                        // transform tooltip without transition only in Safari\n                        .style('-webkit-transform', new_translate)\n                        .style('opacity', 1);\n                }\n\n\n\n            });\n        };\n\n        //In situations where the chart is in a 'viewBox', re-position the tooltip based on how far chart is zoomed.\n        function convertViewBoxRatio() {\n            if (chartContainer) {\n                var svg = d3.select(chartContainer);\n                if (svg.node().tagName !== \"svg\") {\n                    svg = svg.select(\"svg\");\n                }\n                var viewBox = (svg.node()) ? svg.attr('viewBox') : null;\n                if (viewBox) {\n                    viewBox = viewBox.split(' ');\n                    var ratio = parseInt(svg.style('width'), 10) / viewBox[2];\n\n                    position.left = position.left * ratio;\n                    position.top  = position.top * ratio;\n                }\n            }\n        }\n\n        //Creates new tooltip container, or uses existing one on DOM.\n        function initTooltip() {\n            if (!tooltip) {\n                var body;\n                if (chartContainer) {\n                    body = chartContainer;\n                } else {\n                    body = document.body;\n                }\n                //Create new tooltip div if it doesn't exist on DOM.\n                tooltip = d3.select(body).append(\"div\")\n                    .attr(\"class\", \"nvtooltip \" + (classes ? classes : \"xy-tooltip\"))\n                    .attr(\"id\", id);\n                tooltip.style(\"top\", 0).style(\"left\", 0);\n                tooltip.style('opacity', 0);\n                tooltip.selectAll(\"div, table, td, tr\").classed(nvPointerEventsClass, true);\n                tooltip.classed(nvPointerEventsClass, true);\n                tooltipElem = tooltip.node();\n            }\n        }\n\n        //Draw the tooltip onto the DOM.\n        function nvtooltip() {\n            if (!enabled) return;\n            if (!dataSeriesExists(data)) return;\n\n            convertViewBoxRatio();\n\n            var left = position.left;\n            var top = (fixedTop !== null) ? fixedTop : position.top;\n\n            nv.dom.write(function () {\n                initTooltip();\n                // generate data and set it into tooltip\n                // Bonus - If you override contentGenerator and return falsey you can use something like\n                //         React or Knockout to bind the data for your tooltip\n                var newContent = contentGenerator(data);\n                if (newContent) {\n                    tooltipElem.innerHTML = newContent;\n                }\n\n                if (chartContainer && isInteractiveLayer) {\n                    nv.dom.read(function() {\n                        var svgComp = chartContainer.getElementsByTagName(\"svg\")[0];\n                        var svgOffset = {left:0,top:0};\n                        if (svgComp) {\n                            var svgBound = svgComp.getBoundingClientRect();\n                            var chartBound = chartContainer.getBoundingClientRect();\n                            var svgBoundTop = svgBound.top;\n\n                            //Defensive code. Sometimes, svgBoundTop can be a really negative\n                            //  number, like -134254. That's a bug.\n                            //  If such a number is found, use zero instead. FireFox bug only\n                            if (svgBoundTop < 0) {\n                                var containerBound = chartContainer.getBoundingClientRect();\n                                svgBoundTop = (Math.abs(svgBoundTop) > containerBound.height) ? 0 : svgBoundTop;\n                            }\n                            svgOffset.top = Math.abs(svgBoundTop - chartBound.top);\n                            svgOffset.left = Math.abs(svgBound.left - chartBound.left);\n                        }\n                        //If the parent container is an overflow <div> with scrollbars, subtract the scroll offsets.\n                        //You need to also add any offset between the <svg> element and its containing <div>\n                        //Finally, add any offset of the containing <div> on the whole page.\n                        left += chartContainer.offsetLeft + svgOffset.left - 2*chartContainer.scrollLeft;\n                        top += chartContainer.offsetTop + svgOffset.top - 2*chartContainer.scrollTop;\n\n                        if (snapDistance && snapDistance > 0) {\n                            top = Math.floor(top/snapDistance) * snapDistance;\n                        }\n                        calcTooltipPosition([left,top]);\n                    });\n                } else {\n                    calcTooltipPosition([left,top]);\n                }\n            });\n\n            return nvtooltip;\n        }\n\n        nvtooltip.nvPointerEventsClass = nvPointerEventsClass;\n        nvtooltip.options = nv.utils.optionsFunc.bind(nvtooltip);\n\n        nvtooltip._options = Object.create({}, {\n            // simple read/write options\n            duration: {get: function(){return duration;}, set: function(_){duration=_;}},\n            gravity: {get: function(){return gravity;}, set: function(_){gravity=_;}},\n            distance: {get: function(){return distance;}, set: function(_){distance=_;}},\n            snapDistance: {get: function(){return snapDistance;}, set: function(_){snapDistance=_;}},\n            classes: {get: function(){return classes;}, set: function(_){classes=_;}},\n            chartContainer: {get: function(){return chartContainer;}, set: function(_){chartContainer=_;}},\n            fixedTop: {get: function(){return fixedTop;}, set: function(_){fixedTop=_;}},\n            enabled: {get: function(){return enabled;}, set: function(_){enabled=_;}},\n            hideDelay: {get: function(){return hideDelay;}, set: function(_){hideDelay=_;}},\n            contentGenerator: {get: function(){return contentGenerator;}, set: function(_){contentGenerator=_;}},\n            valueFormatter: {get: function(){return valueFormatter;}, set: function(_){valueFormatter=_;}},\n            headerFormatter: {get: function(){return headerFormatter;}, set: function(_){headerFormatter=_;}},\n            keyFormatter: {get: function(){return keyFormatter;}, set: function(_){keyFormatter=_;}},\n            headerEnabled:   {get: function(){return headerEnabled;}, set: function(_){headerEnabled=_;}},\n\n            // internal use only, set by interactive layer to adjust position.\n            _isInteractiveLayer: {get: function(){return isInteractiveLayer;}, set: function(_){isInteractiveLayer=!!_;}},\n\n            // options with extra logic\n            position: {get: function(){return position;}, set: function(_){\n                position.left = _.left !== undefined ? _.left : position.left;\n                position.top  = _.top  !== undefined ? _.top  : position.top;\n            }},\n            offset: {get: function(){return offset;}, set: function(_){\n                offset.left = _.left !== undefined ? _.left : offset.left;\n                offset.top  = _.top  !== undefined ? _.top  : offset.top;\n            }},\n            hidden: {get: function(){return hidden;}, set: function(_){\n                if (hidden != _) {\n                    hidden = !!_;\n                    nvtooltip();\n                }\n            }},\n            data: {get: function(){return data;}, set: function(_){\n                // if showing a single data point, adjust data format with that\n                if (_.point) {\n                    _.value = _.point.x;\n                    _.series = _.series || {};\n                    _.series.value = _.point.y;\n                    _.series.color = _.point.color || _.series.color;\n                }\n                data = _;\n            }},\n\n            // read only properties\n            tooltipElem: {get: function(){return tooltipElem;}, set: function(_){}},\n            id: {get: function(){return id;}, set: function(_){}}\n        });\n\n        nv.utils.initOptions(nvtooltip);\n        return nvtooltip;\n    };\n\n})();\n\n\n/*\nGets the browser window size\n\nReturns object with height and width properties\n */\nnv.utils.windowSize = function() {\n    // Sane defaults\n    var size = {width: 640, height: 480};\n\n    // Most recent browsers use\n    if (window.innerWidth && window.innerHeight) {\n        size.width = window.innerWidth;\n        size.height = window.innerHeight;\n        return (size);\n    }\n\n    // IE can use depending on mode it is in\n    if (document.compatMode=='CSS1Compat' &&\n        document.documentElement &&\n        document.documentElement.offsetWidth ) {\n\n        size.width = document.documentElement.offsetWidth;\n        size.height = document.documentElement.offsetHeight;\n        return (size);\n    }\n\n    // Earlier IE uses Doc.body\n    if (document.body && document.body.offsetWidth) {\n        size.width = document.body.offsetWidth;\n        size.height = document.body.offsetHeight;\n        return (size);\n    }\n\n    return (size);\n};\n\n/*\nBinds callback function to run when window is resized\n */\nnv.utils.windowResize = function(handler) {\n    if (window.addEventListener) {\n        window.addEventListener('resize', handler);\n    } else {\n        nv.log(\"ERROR: Failed to bind to window.resize with: \", handler);\n    }\n    // return object with clear function to remove the single added callback.\n    return {\n        callback: handler,\n        clear: function() {\n            window.removeEventListener('resize', handler);\n        }\n    }\n};\n\n\n/*\nBackwards compatible way to implement more d3-like coloring of graphs.\nCan take in nothing, an array, or a function/scale\nTo use a normal scale, get the range and pass that because we must be able\nto take two arguments and use the index to keep backward compatibility\n*/\nnv.utils.getColor = function(color) {\n    //if you pass in nothing, get default colors back\n    if (color === undefined) {\n        return nv.utils.defaultColor();\n\n    //if passed an array, turn it into a color scale\n    // use isArray, instanceof fails if d3 range is created in an iframe\n    } else if(Array.isArray(color)) {\n        var color_scale = d3.scale.ordinal().range(color);\n        return function(d, i) {\n            var key = i === undefined ? d : i;\n            return d.color || color_scale(key);\n        };\n\n    //if passed a function or scale, return it, or whatever it may be\n    //external libs, such as angularjs-nvd3-directives use this\n    } else {\n        //can't really help it if someone passes rubbish as color\n        return color;\n    }\n};\n\n\n/*\nDefault color chooser uses a color scale of 20 colors from D3\n https://github.com/mbostock/d3/wiki/Ordinal-Scales#categorical-colors\n */\nnv.utils.defaultColor = function() {\n    // get range of the scale so we'll turn it into our own function.\n    return nv.utils.getColor(d3.scale.category20().range());\n};\n\n\n/*\nReturns a color function that takes the result of 'getKey' for each series and\nlooks for a corresponding color from the dictionary\n*/\nnv.utils.customTheme = function(dictionary, getKey, defaultColors) {\n    // use default series.key if getKey is undefined\n    getKey = getKey || function(series) { return series.key };\n    defaultColors = defaultColors || d3.scale.category20().range();\n\n    // start at end of default color list and walk back to index 0\n    var defIndex = defaultColors.length;\n\n    return function(series, index) {\n        var key = getKey(series);\n        if (typeof dictionary[key] === 'function') {\n            return dictionary[key]();\n        } else if (dictionary[key] !== undefined) {\n            return dictionary[key];\n        } else {\n            // no match in dictionary, use a default color\n            if (!defIndex) {\n                // used all the default colors, start over\n                defIndex = defaultColors.length;\n            }\n            defIndex = defIndex - 1;\n            return defaultColors[defIndex];\n        }\n    };\n};\n\n\n/*\nFrom the PJAX example on d3js.org, while this is not really directly needed\nit's a very cool method for doing pjax, I may expand upon it a little bit,\nopen to suggestions on anything that may be useful\n*/\nnv.utils.pjax = function(links, content) {\n\n    var load = function(href) {\n        d3.html(href, function(fragment) {\n            var target = d3.select(content).node();\n            target.parentNode.replaceChild(\n                d3.select(fragment).select(content).node(),\n                target);\n            nv.utils.pjax(links, content);\n        });\n    };\n\n    d3.selectAll(links).on(\"click\", function() {\n        history.pushState(this.href, this.textContent, this.href);\n        load(this.href);\n        d3.event.preventDefault();\n    });\n\n    d3.select(window).on(\"popstate\", function() {\n        if (d3.event.state) {\n            load(d3.event.state);\n        }\n    });\n};\n\n\n/*\nFor when we want to approximate the width in pixels for an SVG:text element.\nMost common instance is when the element is in a display:none; container.\nForumla is : text.length * font-size * constant_factor\n*/\nnv.utils.calcApproxTextWidth = function (svgTextElem) {\n    if (typeof svgTextElem.style === 'function'\n        && typeof svgTextElem.text === 'function') {\n\n        var fontSize = parseInt(svgTextElem.style(\"font-size\").replace(\"px\",\"\"), 10);\n        var textLength = svgTextElem.text().length;\n        return textLength * fontSize * 0.5;\n    }\n    return 0;\n};\n\n\n/*\nNumbers that are undefined, null or NaN, convert them to zeros.\n*/\nnv.utils.NaNtoZero = function(n) {\n    if (typeof n !== 'number'\n        || isNaN(n)\n        || n === null\n        || n === Infinity\n        || n === -Infinity) {\n\n        return 0;\n    }\n    return n;\n};\n\n/*\nAdd a way to watch for d3 transition ends to d3\n*/\nd3.selection.prototype.watchTransition = function(renderWatch){\n    var args = [this].concat([].slice.call(arguments, 1));\n    return renderWatch.transition.apply(renderWatch, args);\n};\n\n\n/*\nHelper object to watch when d3 has rendered something\n*/\nnv.utils.renderWatch = function(dispatch, duration) {\n    if (!(this instanceof nv.utils.renderWatch)) {\n        return new nv.utils.renderWatch(dispatch, duration);\n    }\n\n    var _duration = duration !== undefined ? duration : 250;\n    var renderStack = [];\n    var self = this;\n\n    this.models = function(models) {\n        models = [].slice.call(arguments, 0);\n        models.forEach(function(model){\n            model.__rendered = false;\n            (function(m){\n                m.dispatch.on('renderEnd', function(arg){\n                    m.__rendered = true;\n                    self.renderEnd('model');\n                });\n            })(model);\n\n            if (renderStack.indexOf(model) < 0) {\n                renderStack.push(model);\n            }\n        });\n    return this;\n    };\n\n    this.reset = function(duration) {\n        if (duration !== undefined) {\n            _duration = duration;\n        }\n        renderStack = [];\n    };\n\n    this.transition = function(selection, args, duration) {\n        args = arguments.length > 1 ? [].slice.call(arguments, 1) : [];\n\n        if (args.length > 1) {\n            duration = args.pop();\n        } else {\n            duration = _duration !== undefined ? _duration : 250;\n        }\n        selection.__rendered = false;\n\n        if (renderStack.indexOf(selection) < 0) {\n            renderStack.push(selection);\n        }\n\n        if (duration === 0) {\n            selection.__rendered = true;\n            selection.delay = function() { return this; };\n            selection.duration = function() { return this; };\n            return selection;\n        } else {\n            if (selection.length === 0) {\n                selection.__rendered = true;\n            } else if (selection.every( function(d){ return !d.length; } )) {\n                selection.__rendered = true;\n            } else {\n                selection.__rendered = false;\n            }\n\n            var n = 0;\n            return selection\n                .transition()\n                .duration(duration)\n                .each(function(){ ++n; })\n                .each('end', function(d, i) {\n                    if (--n === 0) {\n                        selection.__rendered = true;\n                        self.renderEnd.apply(this, args);\n                    }\n                });\n        }\n    };\n\n    this.renderEnd = function() {\n        if (renderStack.every( function(d){ return d.__rendered; } )) {\n            renderStack.forEach( function(d){ d.__rendered = false; });\n            dispatch.renderEnd.apply(this, arguments);\n        }\n    }\n\n};\n\n\n/*\nTakes multiple objects and combines them into the first one (dst)\nexample:  nv.utils.deepExtend({a: 1}, {a: 2, b: 3}, {c: 4});\ngives:  {a: 2, b: 3, c: 4}\n*/\nnv.utils.deepExtend = function(dst){\n    var sources = arguments.length > 1 ? [].slice.call(arguments, 1) : [];\n    sources.forEach(function(source) {\n        for (var key in source) {\n            var isArray = dst[key] instanceof Array;\n            var isObject = typeof dst[key] === 'object';\n            var srcObj = typeof source[key] === 'object';\n\n            if (isObject && !isArray && srcObj) {\n                nv.utils.deepExtend(dst[key], source[key]);\n            } else {\n                dst[key] = source[key];\n            }\n        }\n    });\n};\n\n\n/*\nstate utility object, used to track d3 states in the models\n*/\nnv.utils.state = function(){\n    if (!(this instanceof nv.utils.state)) {\n        return new nv.utils.state();\n    }\n    var state = {};\n    var _self = this;\n    var _setState = function(){};\n    var _getState = function(){ return {}; };\n    var init = null;\n    var changed = null;\n\n    this.dispatch = d3.dispatch('change', 'set');\n\n    this.dispatch.on('set', function(state){\n        _setState(state, true);\n    });\n\n    this.getter = function(fn){\n        _getState = fn;\n        return this;\n    };\n\n    this.setter = function(fn, callback) {\n        if (!callback) {\n            callback = function(){};\n        }\n        _setState = function(state, update){\n            fn(state);\n            if (update) {\n                callback();\n            }\n        };\n        return this;\n    };\n\n    this.init = function(state){\n        init = init || {};\n        nv.utils.deepExtend(init, state);\n    };\n\n    var _set = function(){\n        var settings = _getState();\n\n        if (JSON.stringify(settings) === JSON.stringify(state)) {\n            return false;\n        }\n\n        for (var key in settings) {\n            if (state[key] === undefined) {\n                state[key] = {};\n            }\n            state[key] = settings[key];\n            changed = true;\n        }\n        return true;\n    };\n\n    this.update = function(){\n        if (init) {\n            _setState(init, false);\n            init = null;\n        }\n        if (_set.call(this)) {\n            this.dispatch.change(state);\n        }\n    };\n\n};\n\n\n/*\nSnippet of code you can insert into each nv.models.* to give you the ability to\ndo things like:\nchart.options({\n  showXAxis: true,\n  tooltips: true\n});\n\nTo enable in the chart:\nchart.options = nv.utils.optionsFunc.bind(chart);\n*/\nnv.utils.optionsFunc = function(args) {\n    if (args) {\n        d3.map(args).forEach((function(key,value) {\n            if (typeof this[key] === \"function\") {\n                this[key](value);\n            }\n        }).bind(this));\n    }\n    return this;\n};\n\n\n/*\nnumTicks:  requested number of ticks\ndata:  the chart data\n\nreturns the number of ticks to actually use on X axis, based on chart data\nto avoid duplicate ticks with the same value\n*/\nnv.utils.calcTicksX = function(numTicks, data) {\n    // find max number of values from all data streams\n    var numValues = 1;\n    var i = 0;\n    for (i; i < data.length; i += 1) {\n        var stream_len = data[i] && data[i].values ? data[i].values.length : 0;\n        numValues = stream_len > numValues ? stream_len : numValues;\n    }\n    nv.log(\"Requested number of ticks: \", numTicks);\n    nv.log(\"Calculated max values to be: \", numValues);\n    // make sure we don't have more ticks than values to avoid duplicates\n    numTicks = numTicks > numValues ? numTicks = numValues - 1 : numTicks;\n    // make sure we have at least one tick\n    numTicks = numTicks < 1 ? 1 : numTicks;\n    // make sure it's an integer\n    numTicks = Math.floor(numTicks);\n    nv.log(\"Calculating tick count as: \", numTicks);\n    return numTicks;\n};\n\n\n/*\nreturns number of ticks to actually use on Y axis, based on chart data\n*/\nnv.utils.calcTicksY = function(numTicks, data) {\n    // currently uses the same logic but we can adjust here if needed later\n    return nv.utils.calcTicksX(numTicks, data);\n};\n\n\n/*\nAdd a particular option from an options object onto chart\nOptions exposed on a chart are a getter/setter function that returns chart\non set to mimic typical d3 option chaining, e.g. svg.option1('a').option2('b');\n\noption objects should be generated via Object.create() to provide\nthe option of manipulating data via get/set functions.\n*/\nnv.utils.initOption = function(chart, name) {\n    // if it's a call option, just call it directly, otherwise do get/set\n    if (chart._calls && chart._calls[name]) {\n        chart[name] = chart._calls[name];\n    } else {\n        chart[name] = function (_) {\n            if (!arguments.length) return chart._options[name];\n            chart._overrides[name] = true;\n            chart._options[name] = _;\n            return chart;\n        };\n        // calling the option as _option will ignore if set by option already\n        // so nvd3 can set options internally but the stop if set manually\n        chart['_' + name] = function(_) {\n            if (!arguments.length) return chart._options[name];\n            if (!chart._overrides[name]) {\n                chart._options[name] = _;\n            }\n            return chart;\n        }\n    }\n};\n\n\n/*\nAdd all options in an options object to the chart\n*/\nnv.utils.initOptions = function(chart) {\n    chart._overrides = chart._overrides || {};\n    var ops = Object.getOwnPropertyNames(chart._options || {});\n    var calls = Object.getOwnPropertyNames(chart._calls || {});\n    ops = ops.concat(calls);\n    for (var i in ops) {\n        nv.utils.initOption(chart, ops[i]);\n    }\n};\n\n\n/*\nInherit options from a D3 object\nd3.rebind makes calling the function on target actually call it on source\nAlso use _d3options so we can track what we inherit for documentation and chained inheritance\n*/\nnv.utils.inheritOptionsD3 = function(target, d3_source, oplist) {\n    target._d3options = oplist.concat(target._d3options || []);\n    oplist.unshift(d3_source);\n    oplist.unshift(target);\n    d3.rebind.apply(this, oplist);\n};\n\n\n/*\nRemove duplicates from an array\n*/\nnv.utils.arrayUnique = function(a) {\n    return a.sort().filter(function(item, pos) {\n        return !pos || item != a[pos - 1];\n    });\n};\n\n\n/*\nKeeps a list of custom symbols to draw from in addition to d3.svg.symbol\nNecessary since d3 doesn't let you extend its list -_-\nAdd new symbols by doing nv.utils.symbols.set('name', function(size){...});\n*/\nnv.utils.symbolMap = d3.map();\n\n\n/*\nReplaces d3.svg.symbol so that we can look both there and our own map\n */\nnv.utils.symbol = function() {\n    var type,\n        size = 64;\n    function symbol(d,i) {\n        var t = type.call(this,d,i);\n        var s = size.call(this,d,i);\n        if (d3.svg.symbolTypes.indexOf(t) !== -1) {\n            return d3.svg.symbol().type(t).size(s)();\n        } else {\n            return nv.utils.symbolMap.get(t)(s);\n        }\n    }\n    symbol.type = function(_) {\n        if (!arguments.length) return type;\n        type = d3.functor(_);\n        return symbol;\n    };\n    symbol.size = function(_) {\n        if (!arguments.length) return size;\n        size = d3.functor(_);\n        return symbol;\n    };\n    return symbol;\n};\n\n\n/*\nInherit option getter/setter functions from source to target\nd3.rebind makes calling the function on target actually call it on source\nAlso track via _inherited and _d3options so we can track what we inherit\nfor documentation generation purposes and chained inheritance\n*/\nnv.utils.inheritOptions = function(target, source) {\n    // inherit all the things\n    var ops = Object.getOwnPropertyNames(source._options || {});\n    var calls = Object.getOwnPropertyNames(source._calls || {});\n    var inherited = source._inherited || [];\n    var d3ops = source._d3options || [];\n    var args = ops.concat(calls).concat(inherited).concat(d3ops);\n    args.unshift(source);\n    args.unshift(target);\n    d3.rebind.apply(this, args);\n    // pass along the lists to keep track of them, don't allow duplicates\n    target._inherited = nv.utils.arrayUnique(ops.concat(calls).concat(inherited).concat(ops).concat(target._inherited || []));\n    target._d3options = nv.utils.arrayUnique(d3ops.concat(target._d3options || []));\n};\n\n\n/*\nRuns common initialize code on the svg before the chart builds\n*/\nnv.utils.initSVG = function(svg) {\n    svg.classed({'nvd3-svg':true});\n};\n\n\n/*\nSanitize and provide default for the container height.\n*/\nnv.utils.sanitizeHeight = function(height, container) {\n    return (height || parseInt(container.style('height'), 10) || 400);\n};\n\n\n/*\nSanitize and provide default for the container width.\n*/\nnv.utils.sanitizeWidth = function(width, container) {\n    return (width || parseInt(container.style('width'), 10) || 960);\n};\n\n\n/*\nCalculate the available height for a chart.\n*/\nnv.utils.availableHeight = function(height, container, margin) {\n    return nv.utils.sanitizeHeight(height, container) - margin.top - margin.bottom;\n};\n\n/*\nCalculate the available width for a chart.\n*/\nnv.utils.availableWidth = function(width, container, margin) {\n    return nv.utils.sanitizeWidth(width, container) - margin.left - margin.right;\n};\n\n/*\nClear any rendered chart components and display a chart's 'noData' message\n*/\nnv.utils.noData = function(chart, container) {\n    var opt = chart.options(),\n        margin = opt.margin(),\n        noData = opt.noData(),\n        data = (noData == null) ? [\"No Data Available.\"] : [noData],\n        height = nv.utils.availableHeight(opt.height(), container, margin),\n        width = nv.utils.availableWidth(opt.width(), container, margin),\n        x = margin.left + width/2,\n        y = margin.top + height/2;\n\n    //Remove any previously created chart components\n    container.selectAll('g').remove();\n\n    var noDataText = container.selectAll('.nv-noData').data(data);\n\n    noDataText.enter().append('text')\n        .attr('class', 'nvd3 nv-noData')\n        .attr('dy', '-.7em')\n        .style('text-anchor', 'middle');\n\n    noDataText\n        .attr('x', x)\n        .attr('y', y)\n        .text(function(t){ return t; });\n};\n\nnv.models.axis = function() {\n    \"use strict\";\n\n    //============================================================\n    // Public Variables with Default Settings\n    //------------------------------------------------------------\n\n    var axis = d3.svg.axis();\n    var scale = d3.scale.linear();\n\n    var margin = {top: 0, right: 0, bottom: 0, left: 0}\n        , width = 75 //only used for tickLabel currently\n        , height = 60 //only used for tickLabel currently\n        , axisLabelText = null\n        , showMaxMin = true //TODO: showMaxMin should be disabled on all ordinal scaled axes\n        , rotateLabels = 0\n        , rotateYLabel = true\n        , staggerLabels = false\n        , isOrdinal = false\n        , ticks = null\n        , axisLabelDistance = 0\n        , duration = 250\n        , dispatch = d3.dispatch('renderEnd')\n        ;\n    axis\n        .scale(scale)\n        .orient('bottom')\n        .tickFormat(function(d) { return d })\n    ;\n\n    //============================================================\n    // Private Variables\n    //------------------------------------------------------------\n\n    var scale0;\n    var renderWatch = nv.utils.renderWatch(dispatch, duration);\n\n    function chart(selection) {\n        renderWatch.reset();\n        selection.each(function(data) {\n            var container = d3.select(this);\n            nv.utils.initSVG(container);\n\n            // Setup containers and skeleton of chart\n            var wrap = container.selectAll('g.nv-wrap.nv-axis').data([data]);\n            var wrapEnter = wrap.enter().append('g').attr('class', 'nvd3 nv-wrap nv-axis');\n            var gEnter = wrapEnter.append('g');\n            var g = wrap.select('g');\n\n            if (ticks !== null)\n                axis.ticks(ticks);\n            else if (axis.orient() == 'top' || axis.orient() == 'bottom')\n                axis.ticks(Math.abs(scale.range()[1] - scale.range()[0]) / 100);\n\n            //TODO: consider calculating width/height based on whether or not label is added, for reference in charts using this component\n            g.watchTransition(renderWatch, 'axis').call(axis);\n\n            scale0 = scale0 || axis.scale();\n\n            var fmt = axis.tickFormat();\n            if (fmt == null) {\n                fmt = scale0.tickFormat();\n            }\n\n            var axisLabel = g.selectAll('text.nv-axislabel')\n                .data([axisLabelText || null]);\n            axisLabel.exit().remove();\n\n            var xLabelMargin;\n            var axisMaxMin;\n            var w;\n            switch (axis.orient()) {\n                case 'top':\n                    axisLabel.enter().append('text').attr('class', 'nv-axislabel');\n                    if (scale.range().length < 2) {\n                        w = 0;\n                    } else if (scale.range().length === 2) {\n                        w = scale.range()[1];\n                    } else {\n                        w = scale.range()[scale.range().length-1]+(scale.range()[1]-scale.range()[0]);\n                    }\n                    axisLabel\n                        .attr('text-anchor', 'middle')\n                        .attr('y', 0)\n                        .attr('x', w/2);\n                    if (showMaxMin) {\n                        axisMaxMin = wrap.selectAll('g.nv-axisMaxMin')\n                            .data(scale.domain());\n                        axisMaxMin.enter().append('g').attr('class',function(d,i){\n                                return ['nv-axisMaxMin','nv-axisMaxMin-x',(i == 0 ? 'nv-axisMin-x':'nv-axisMax-x')].join(' ')\n                        }).append('text');\n                        axisMaxMin.exit().remove();\n                        axisMaxMin\n                            .attr('transform', function(d,i) {\n                                return 'translate(' + nv.utils.NaNtoZero(scale(d)) + ',0)'\n                            })\n                            .select('text')\n                            .attr('dy', '-0.5em')\n                            .attr('y', -axis.tickPadding())\n                            .attr('text-anchor', 'middle')\n                            .text(function(d,i) {\n                                var v = fmt(d);\n                                return ('' + v).match('NaN') ? '' : v;\n                            });\n                        axisMaxMin.watchTransition(renderWatch, 'min-max top')\n                            .attr('transform', function(d,i) {\n                                return 'translate(' + nv.utils.NaNtoZero(scale.range()[i]) + ',0)'\n                            });\n                    }\n                    break;\n                case 'bottom':\n                    xLabelMargin = axisLabelDistance + 36;\n                    var maxTextWidth = 30;\n                    var textHeight = 0;\n                    var xTicks = g.selectAll('g').select(\"text\");\n                    var rotateLabelsRule = '';\n                    if (rotateLabels%360) {\n                        //Calculate the longest xTick width\n                        xTicks.each(function(d,i){\n                            var box = this.getBoundingClientRect();\n                            var width = box.width;\n                            textHeight = box.height;\n                            if(width > maxTextWidth) maxTextWidth = width;\n                        });\n                        rotateLabelsRule = 'rotate(' + rotateLabels + ' 0,' + (textHeight/2 + axis.tickPadding()) + ')';\n                        //Convert to radians before calculating sin. Add 30 to margin for healthy padding.\n                        var sin = Math.abs(Math.sin(rotateLabels*Math.PI/180));\n                        xLabelMargin = (sin ? sin*maxTextWidth : maxTextWidth)+30;\n                        //Rotate all xTicks\n                        xTicks\n                            .attr('transform', rotateLabelsRule)\n                            .style('text-anchor', rotateLabels%360 > 0 ? 'start' : 'end');\n                    }\n                    axisLabel.enter().append('text').attr('class', 'nv-axislabel');\n                    if (scale.range().length < 2) {\n                        w = 0;\n                    } else if (scale.range().length === 2) {\n                        w = scale.range()[1];\n                    } else {\n                        w = scale.range()[scale.range().length-1]+(scale.range()[1]-scale.range()[0]);\n                    }\n                    axisLabel\n                        .attr('text-anchor', 'middle')\n                        .attr('y', xLabelMargin)\n                        .attr('x', w/2);\n                    if (showMaxMin) {\n                        //if (showMaxMin && !isOrdinal) {\n                        axisMaxMin = wrap.selectAll('g.nv-axisMaxMin')\n                            //.data(scale.domain())\n                            .data([scale.domain()[0], scale.domain()[scale.domain().length - 1]]);\n                        axisMaxMin.enter().append('g').attr('class',function(d,i){\n                                return ['nv-axisMaxMin','nv-axisMaxMin-x',(i == 0 ? 'nv-axisMin-x':'nv-axisMax-x')].join(' ')\n                        }).append('text');\n                        axisMaxMin.exit().remove();\n                        axisMaxMin\n                            .attr('transform', function(d,i) {\n                                return 'translate(' + nv.utils.NaNtoZero((scale(d) + (isOrdinal ? scale.rangeBand() / 2 : 0))) + ',0)'\n                            })\n                            .select('text')\n                            .attr('dy', '.71em')\n                            .attr('y', axis.tickPadding())\n                            .attr('transform', rotateLabelsRule)\n                            .style('text-anchor', rotateLabels ? (rotateLabels%360 > 0 ? 'start' : 'end') : 'middle')\n                            .text(function(d,i) {\n                                var v = fmt(d);\n                                return ('' + v).match('NaN') ? '' : v;\n                            });\n                        axisMaxMin.watchTransition(renderWatch, 'min-max bottom')\n                            .attr('transform', function(d,i) {\n                                return 'translate(' + nv.utils.NaNtoZero((scale(d) + (isOrdinal ? scale.rangeBand() / 2 : 0))) + ',0)'\n                            });\n                    }\n                    if (staggerLabels)\n                        xTicks\n                            .attr('transform', function(d,i) {\n                                return 'translate(0,' + (i % 2 == 0 ? '0' : '12') + ')'\n                            });\n\n                    break;\n                case 'right':\n                    axisLabel.enter().append('text').attr('class', 'nv-axislabel');\n                    axisLabel\n                        .style('text-anchor', rotateYLabel ? 'middle' : 'begin')\n                        .attr('transform', rotateYLabel ? 'rotate(90)' : '')\n                        .attr('y', rotateYLabel ? (-Math.max(margin.right, width) + 12) : -10) //TODO: consider calculating this based on largest tick width... OR at least expose this on chart\n                        .attr('x', rotateYLabel ? (d3.max(scale.range()) / 2) : axis.tickPadding());\n                    if (showMaxMin) {\n                        axisMaxMin = wrap.selectAll('g.nv-axisMaxMin')\n                            .data(scale.domain());\n                       \taxisMaxMin.enter().append('g').attr('class',function(d,i){\n                                return ['nv-axisMaxMin','nv-axisMaxMin-y',(i == 0 ? 'nv-axisMin-y':'nv-axisMax-y')].join(' ')\n                        }).append('text')\n                            .style('opacity', 0);\n                        axisMaxMin.exit().remove();\n                        axisMaxMin\n                            .attr('transform', function(d,i) {\n                                return 'translate(0,' + nv.utils.NaNtoZero(scale(d)) + ')'\n                            })\n                            .select('text')\n                            .attr('dy', '.32em')\n                            .attr('y', 0)\n                            .attr('x', axis.tickPadding())\n                            .style('text-anchor', 'start')\n                            .text(function(d, i) {\n                                var v = fmt(d);\n                                return ('' + v).match('NaN') ? '' : v;\n                            });\n                        axisMaxMin.watchTransition(renderWatch, 'min-max right')\n                            .attr('transform', function(d,i) {\n                                return 'translate(0,' + nv.utils.NaNtoZero(scale.range()[i]) + ')'\n                            })\n                            .select('text')\n                            .style('opacity', 1);\n                    }\n                    break;\n                case 'left':\n                    /*\n                     //For dynamically placing the label. Can be used with dynamically-sized chart axis margins\n                     var yTicks = g.selectAll('g').select(\"text\");\n                     yTicks.each(function(d,i){\n                     var labelPadding = this.getBoundingClientRect().width + axis.tickPadding() + 16;\n                     if(labelPadding > width) width = labelPadding;\n                     });\n                     */\n                    axisLabel.enter().append('text').attr('class', 'nv-axislabel');\n                    axisLabel\n                        .style('text-anchor', rotateYLabel ? 'middle' : 'end')\n                        .attr('transform', rotateYLabel ? 'rotate(-90)' : '')\n                        .attr('y', rotateYLabel ? (-Math.max(margin.left, width) + 25 - (axisLabelDistance || 0)) : -10)\n                        .attr('x', rotateYLabel ? (-d3.max(scale.range()) / 2) : -axis.tickPadding());\n                    if (showMaxMin) {\n                        axisMaxMin = wrap.selectAll('g.nv-axisMaxMin')\n                            .data(scale.domain());\n                        axisMaxMin.enter().append('g').attr('class',function(d,i){\n                                return ['nv-axisMaxMin','nv-axisMaxMin-y',(i == 0 ? 'nv-axisMin-y':'nv-axisMax-y')].join(' ')\n                        }).append('text')\n                            .style('opacity', 0);\n                        axisMaxMin.exit().remove();\n                        axisMaxMin\n                            .attr('transform', function(d,i) {\n                                return 'translate(0,' + nv.utils.NaNtoZero(scale0(d)) + ')'\n                            })\n                            .select('text')\n                            .attr('dy', '.32em')\n                            .attr('y', 0)\n                            .attr('x', -axis.tickPadding())\n                            .attr('text-anchor', 'end')\n                            .text(function(d,i) {\n                                var v = fmt(d);\n                                return ('' + v).match('NaN') ? '' : v;\n                            });\n                        axisMaxMin.watchTransition(renderWatch, 'min-max right')\n                            .attr('transform', function(d,i) {\n                                return 'translate(0,' + nv.utils.NaNtoZero(scale.range()[i]) + ')'\n                            })\n                            .select('text')\n                            .style('opacity', 1);\n                    }\n                    break;\n            }\n            axisLabel.text(function(d) { return d });\n\n            if (showMaxMin && (axis.orient() === 'left' || axis.orient() === 'right')) {\n                //check if max and min overlap other values, if so, hide the values that overlap\n                g.selectAll('g') // the g's wrapping each tick\n                    .each(function(d,i) {\n                        d3.select(this).select('text').attr('opacity', 1);\n                        if (scale(d) < scale.range()[1] + 10 || scale(d) > scale.range()[0] - 10) { // 10 is assuming text height is 16... if d is 0, leave it!\n                            if (d > 1e-10 || d < -1e-10) // accounts for minor floating point errors... though could be problematic if the scale is EXTREMELY SMALL\n                                d3.select(this).attr('opacity', 0);\n\n                            d3.select(this).select('text').attr('opacity', 0); // Don't remove the ZERO line!!\n                        }\n                    });\n\n                //if Max and Min = 0 only show min, Issue #281\n                if (scale.domain()[0] == scale.domain()[1] && scale.domain()[0] == 0) {\n                    wrap.selectAll('g.nv-axisMaxMin').style('opacity', function (d, i) {\n                        return !i ? 1 : 0\n                    });\n                }\n            }\n\n            if (showMaxMin && (axis.orient() === 'top' || axis.orient() === 'bottom')) {\n                var maxMinRange = [];\n                wrap.selectAll('g.nv-axisMaxMin')\n                    .each(function(d,i) {\n                        try {\n                            if (i) // i== 1, max position\n                                maxMinRange.push(scale(d) - this.getBoundingClientRect().width - 4);  //assuming the max and min labels are as wide as the next tick (with an extra 4 pixels just in case)\n                            else // i==0, min position\n                                maxMinRange.push(scale(d) + this.getBoundingClientRect().width + 4)\n                        }catch (err) {\n                            if (i) // i== 1, max position\n                                maxMinRange.push(scale(d) - 4);  //assuming the max and min labels are as wide as the next tick (with an extra 4 pixels just in case)\n                            else // i==0, min position\n                                maxMinRange.push(scale(d) + 4);\n                        }\n                    });\n                // the g's wrapping each tick\n                g.selectAll('g').each(function(d, i) {\n                    if (scale(d) < maxMinRange[0] || scale(d) > maxMinRange[1]) {\n                        if (d > 1e-10 || d < -1e-10) // accounts for minor floating point errors... though could be problematic if the scale is EXTREMELY SMALL\n                            d3.select(this).remove();\n                        else\n                            d3.select(this).select('text').remove(); // Don't remove the ZERO line!!\n                    }\n                });\n            }\n\n            //Highlight zero tick line\n            g.selectAll('.tick')\n                .filter(function (d) {\n                    /*\n                    The filter needs to return only ticks at or near zero.\n                    Numbers like 0.00001 need to count as zero as well,\n                    and the arithmetic trick below solves that.\n                    */\n                    return !parseFloat(Math.round(d * 100000) / 1000000) && (d !== undefined)\n                }) \n                .classed('zero', true);\n            \n            //store old scales for use in transitions on update\n            scale0 = scale.copy();\n\n        });\n\n        renderWatch.renderEnd('axis immediate');\n        return chart;\n    }\n\n    //============================================================\n    // Expose Public Variables\n    //------------------------------------------------------------\n\n    // expose chart's sub-components\n    chart.axis = axis;\n    chart.dispatch = dispatch;\n\n    chart.options = nv.utils.optionsFunc.bind(chart);\n    chart._options = Object.create({}, {\n        // simple options, just get/set the necessary values\n        axisLabelDistance: {get: function(){return axisLabelDistance;}, set: function(_){axisLabelDistance=_;}},\n        staggerLabels:     {get: function(){return staggerLabels;}, set: function(_){staggerLabels=_;}},\n        rotateLabels:      {get: function(){return rotateLabels;}, set: function(_){rotateLabels=_;}},\n        rotateYLabel:      {get: function(){return rotateYLabel;}, set: function(_){rotateYLabel=_;}},\n        showMaxMin:        {get: function(){return showMaxMin;}, set: function(_){showMaxMin=_;}},\n        axisLabel:         {get: function(){return axisLabelText;}, set: function(_){axisLabelText=_;}},\n        height:            {get: function(){return height;}, set: function(_){height=_;}},\n        ticks:             {get: function(){return ticks;}, set: function(_){ticks=_;}},\n        width:             {get: function(){return width;}, set: function(_){width=_;}},\n\n        // options that require extra logic in the setter\n        margin: {get: function(){return margin;}, set: function(_){\n            margin.top    = _.top !== undefined    ? _.top    : margin.top;\n            margin.right  = _.right !== undefined  ? _.right  : margin.right;\n            margin.bottom = _.bottom !== undefined ? _.bottom : margin.bottom;\n            margin.left   = _.left !== undefined   ? _.left   : margin.left;\n        }},\n        duration: {get: function(){return duration;}, set: function(_){\n            duration=_;\n            renderWatch.reset(duration);\n        }},\n        scale: {get: function(){return scale;}, set: function(_){\n            scale = _;\n            axis.scale(scale);\n            isOrdinal = typeof scale.rangeBands === 'function';\n            nv.utils.inheritOptionsD3(chart, scale, ['domain', 'range', 'rangeBand', 'rangeBands']);\n        }}\n    });\n\n    nv.utils.initOptions(chart);\n    nv.utils.inheritOptionsD3(chart, axis, ['orient', 'tickValues', 'tickSubdivide', 'tickSize', 'tickPadding', 'tickFormat']);\n    nv.utils.inheritOptionsD3(chart, scale, ['domain', 'range', 'rangeBand', 'rangeBands']);\n\n    return chart;\n};\nnv.models.boxPlot = function() {\n    \"use strict\";\n\n    //============================================================\n    // Public Variables with Default Settings\n    //------------------------------------------------------------\n\n    var margin = {top: 0, right: 0, bottom: 0, left: 0}\n        , width = 960\n        , height = 500\n        , id = Math.floor(Math.random() * 10000) //Create semi-unique ID in case user doesn't select one\n        , x = d3.scale.ordinal()\n        , y = d3.scale.linear()\n        , getX = function(d) { return d.x }\n        , getY = function(d) { return d.y }\n        , color = nv.utils.defaultColor()\n        , container = null\n        , xDomain\n        , yDomain\n        , xRange\n        , yRange\n        , dispatch = d3.dispatch('elementMouseover', 'elementMouseout', 'elementMousemove', 'renderEnd')\n        , duration = 250\n        , maxBoxWidth = null\n        ;\n\n    //============================================================\n    // Private Variables\n    //------------------------------------------------------------\n\n    var x0, y0;\n    var renderWatch = nv.utils.renderWatch(dispatch, duration);\n\n    function chart(selection) {\n        renderWatch.reset();\n        selection.each(function(data) {\n            var availableWidth = width - margin.left - margin.right,\n                availableHeight = height - margin.top - margin.bottom;\n\n            container = d3.select(this);\n            nv.utils.initSVG(container);\n\n            // Setup Scales\n            x   .domain(xDomain || data.map(function(d,i) { return getX(d,i); }))\n                .rangeBands(xRange || [0, availableWidth], .1);\n\n            // if we know yDomain, no need to calculate\n            var yData = []\n            if (!yDomain) {\n                // (y-range is based on quartiles, whiskers and outliers)\n\n                // lower values\n                var yMin = d3.min(data.map(function(d) {\n                    var min_arr = [];\n\n                    min_arr.push(d.values.Q1);\n                    if (d.values.hasOwnProperty('whisker_low') && d.values.whisker_low !== null) { min_arr.push(d.values.whisker_low); }\n                    if (d.values.hasOwnProperty('outliers') && d.values.outliers !== null) { min_arr = min_arr.concat(d.values.outliers); }\n\n                    return d3.min(min_arr);\n                }));\n\n                // upper values\n                var yMax = d3.max(data.map(function(d) {\n                    var max_arr = [];\n\n                    max_arr.push(d.values.Q3);\n                    if (d.values.hasOwnProperty('whisker_high') && d.values.whisker_high !== null) { max_arr.push(d.values.whisker_high); }\n                    if (d.values.hasOwnProperty('outliers') && d.values.outliers !== null) { max_arr = max_arr.concat(d.values.outliers); }\n\n                    return d3.max(max_arr);\n                }));\n\n                yData = [ yMin, yMax ] ;\n            }\n\n            y.domain(yDomain || yData);\n            y.range(yRange || [availableHeight, 0]);\n\n            //store old scales if they exist\n            x0 = x0 || x;\n            y0 = y0 || y.copy().range([y(0),y(0)]);\n\n            // Setup containers and skeleton of chart\n            var wrap = container.selectAll('g.nv-wrap').data([data]);\n            var wrapEnter = wrap.enter().append('g').attr('class', 'nvd3 nv-wrap');\n            wrap.attr('transform', 'translate(' + margin.left + ',' + margin.top + ')');\n\n            var boxplots = wrap.selectAll('.nv-boxplot').data(function(d) { return d });\n            var boxEnter = boxplots.enter().append('g').style('stroke-opacity', 1e-6).style('fill-opacity', 1e-6);\n            boxplots\n                .attr('class', 'nv-boxplot')\n                .attr('transform', function(d,i,j) { return 'translate(' + (x(getX(d,i)) + x.rangeBand() * .05) + ', 0)'; })\n                .classed('hover', function(d) { return d.hover });\n            boxplots\n                .watchTransition(renderWatch, 'nv-boxplot: boxplots')\n                .style('stroke-opacity', 1)\n                .style('fill-opacity', .75)\n                .delay(function(d,i) { return i * duration / data.length })\n                .attr('transform', function(d,i) {\n                    return 'translate(' + (x(getX(d,i)) + x.rangeBand() * .05) + ', 0)';\n                });\n            boxplots.exit().remove();\n\n            // ----- add the SVG elements for each boxPlot -----\n\n            // conditionally append whisker lines\n            boxEnter.each(function(d,i) {\n              var box = d3.select(this);\n\n              ['low', 'high'].forEach(function(key) {\n                if (d.values.hasOwnProperty('whisker_' + key) && d.values['whisker_' + key] !== null) {\n                  box.append('line')\n                    .style('stroke', (d.color) ? d.color : color(d,i))\n                    .attr('class', 'nv-boxplot-whisker nv-boxplot-' + key);\n\n                  box.append('line')\n                    .style('stroke', (d.color) ? d.color : color(d,i))\n                    .attr('class', 'nv-boxplot-tick nv-boxplot-' + key);\n                }\n              });\n            });\n\n            // outliers\n            // TODO: support custom colors here\n            var outliers = boxplots.selectAll('.nv-boxplot-outlier').data(function(d) {\n                if (d.values.hasOwnProperty('outliers') && d.values.outliers !== null) { return d.values.outliers; }\n                else { return []; }\n            });\n            outliers.enter().append('circle')\n                .style('fill', function(d,i,j) { return color(d,j) }).style('stroke', function(d,i,j) { return color(d,j) })\n                .on('mouseover', function(d,i,j) {\n                    d3.select(this).classed('hover', true);\n                    dispatch.elementMouseover({\n                        series: { key: d, color: color(d,j) },\n                        e: d3.event\n                    });\n                })\n                .on('mouseout', function(d,i,j) {\n                    d3.select(this).classed('hover', false);\n                    dispatch.elementMouseout({\n                        series: { key: d, color: color(d,j) },\n                        e: d3.event\n                    });\n                })\n                .on('mousemove', function(d,i) {\n                    dispatch.elementMousemove({e: d3.event});\n                });\n\n            outliers.attr('class', 'nv-boxplot-outlier');\n            outliers\n              .watchTransition(renderWatch, 'nv-boxplot: nv-boxplot-outlier')\n                .attr('cx', x.rangeBand() * .45)\n                .attr('cy', function(d,i,j) { return y(d); })\n                .attr('r', '3');\n            outliers.exit().remove();\n\n            var box_width = function() { return (maxBoxWidth === null ? x.rangeBand() * .9 : Math.min(75, x.rangeBand() * .9)); };\n            var box_left  = function() { return x.rangeBand() * .45 - box_width()/2; };\n            var box_right = function() { return x.rangeBand() * .45 + box_width()/2; };\n\n            // update whisker lines and ticks\n            ['low', 'high'].forEach(function(key) {\n              var endpoint = (key === 'low') ? 'Q1' : 'Q3';\n\n              boxplots.select('line.nv-boxplot-whisker.nv-boxplot-' + key)\n                .watchTransition(renderWatch, 'nv-boxplot: boxplots')\n                  .attr('x1', x.rangeBand() * .45 )\n                  .attr('y1', function(d,i) { return y(d.values['whisker_' + key]); })\n                  .attr('x2', x.rangeBand() * .45 )\n                  .attr('y2', function(d,i) { return y(d.values[endpoint]); });\n\n              boxplots.select('line.nv-boxplot-tick.nv-boxplot-' + key)\n                .watchTransition(renderWatch, 'nv-boxplot: boxplots')\n                  .attr('x1', box_left )\n                  .attr('y1', function(d,i) { return y(d.values['whisker_' + key]); })\n                  .attr('x2', box_right )\n                  .attr('y2', function(d,i) { return y(d.values['whisker_' + key]); });\n            });\n\n            ['low', 'high'].forEach(function(key) {\n              boxEnter.selectAll('.nv-boxplot-' + key)\n                .on('mouseover', function(d,i,j) {\n                    d3.select(this).classed('hover', true);\n                    dispatch.elementMouseover({\n                        series: { key: d.values['whisker_' + key], color: color(d,j) },\n                        e: d3.event\n                    });\n                })\n                .on('mouseout', function(d,i,j) {\n                    d3.select(this).classed('hover', false);\n                    dispatch.elementMouseout({\n                        series: { key: d.values['whisker_' + key], color: color(d,j) },\n                        e: d3.event\n                    });\n                })\n                .on('mousemove', function(d,i) {\n                    dispatch.elementMousemove({e: d3.event});\n                });\n            });\n\n            // boxes\n            boxEnter.append('rect')\n                .attr('class', 'nv-boxplot-box')\n                // tooltip events\n                .on('mouseover', function(d,i) {\n                    d3.select(this).classed('hover', true);\n                    dispatch.elementMouseover({\n                        key: d.label,\n                        value: d.label,\n                        series: [\n                            { key: 'Q3', value: d.values.Q3, color: d.color || color(d,i) },\n                            { key: 'Q2', value: d.values.Q2, color: d.color || color(d,i) },\n                            { key: 'Q1', value: d.values.Q1, color: d.color || color(d,i) }\n                        ],\n                        data: d,\n                        index: i,\n                        e: d3.event\n                    });\n                })\n                .on('mouseout', function(d,i) {\n                    d3.select(this).classed('hover', false);\n                    dispatch.elementMouseout({\n                        key: d.label,\n                        value: d.label,\n                        series: [\n                            { key: 'Q3', value: d.values.Q3, color: d.color || color(d,i) },\n                            { key: 'Q2', value: d.values.Q2, color: d.color || color(d,i) },\n                            { key: 'Q1', value: d.values.Q1, color: d.color || color(d,i) }\n                        ],\n                        data: d,\n                        index: i,\n                        e: d3.event\n                    });\n                })\n                .on('mousemove', function(d,i) {\n                    dispatch.elementMousemove({e: d3.event});\n                });\n\n            // box transitions\n            boxplots.select('rect.nv-boxplot-box')\n              .watchTransition(renderWatch, 'nv-boxplot: boxes')\n                .attr('y', function(d,i) { return y(d.values.Q3); })\n                .attr('width', box_width)\n                .attr('x', box_left )\n\n                .attr('height', function(d,i) { return Math.abs(y(d.values.Q3) - y(d.values.Q1)) || 1 })\n                .style('fill', function(d,i) { return d.color || color(d,i) })\n                .style('stroke', function(d,i) { return d.color || color(d,i) });\n\n            // median line\n            boxEnter.append('line').attr('class', 'nv-boxplot-median');\n\n            boxplots.select('line.nv-boxplot-median')\n              .watchTransition(renderWatch, 'nv-boxplot: boxplots line')\n                .attr('x1', box_left)\n                .attr('y1', function(d,i) { return y(d.values.Q2); })\n                .attr('x2', box_right)\n                .attr('y2', function(d,i) { return y(d.values.Q2); });\n\n            //store old scales for use in transitions on update\n            x0 = x.copy();\n            y0 = y.copy();\n        });\n\n        renderWatch.renderEnd('nv-boxplot immediate');\n        return chart;\n    }\n\n    //============================================================\n    // Expose Public Variables\n    //------------------------------------------------------------\n\n    chart.dispatch = dispatch;\n    chart.options = nv.utils.optionsFunc.bind(chart);\n\n    chart._options = Object.create({}, {\n        // simple options, just get/set the necessary values\n        width:   {get: function(){return width;}, set: function(_){width=_;}},\n        height:  {get: function(){return height;}, set: function(_){height=_;}},\n        maxBoxWidth: {get: function(){return maxBoxWidth;}, set: function(_){maxBoxWidth=_;}},\n        x:       {get: function(){return getX;}, set: function(_){getX=_;}},\n        y:       {get: function(){return getY;}, set: function(_){getY=_;}},\n        xScale:  {get: function(){return x;}, set: function(_){x=_;}},\n        yScale:  {get: function(){return y;}, set: function(_){y=_;}},\n        xDomain: {get: function(){return xDomain;}, set: function(_){xDomain=_;}},\n        yDomain: {get: function(){return yDomain;}, set: function(_){yDomain=_;}},\n        xRange:  {get: function(){return xRange;}, set: function(_){xRange=_;}},\n        yRange:  {get: function(){return yRange;}, set: function(_){yRange=_;}},\n        id:          {get: function(){return id;}, set: function(_){id=_;}},\n        // rectClass: {get: function(){return rectClass;}, set: function(_){rectClass=_;}},\n\n        // options that require extra logic in the setter\n        margin: {get: function(){return margin;}, set: function(_){\n            margin.top    = _.top    !== undefined ? _.top    : margin.top;\n            margin.right  = _.right  !== undefined ? _.right  : margin.right;\n            margin.bottom = _.bottom !== undefined ? _.bottom : margin.bottom;\n            margin.left   = _.left   !== undefined ? _.left   : margin.left;\n        }},\n        color:  {get: function(){return color;}, set: function(_){\n            color = nv.utils.getColor(_);\n        }},\n        duration: {get: function(){return duration;}, set: function(_){\n            duration = _;\n            renderWatch.reset(duration);\n        }}\n    });\n\n    nv.utils.initOptions(chart);\n\n    return chart;\n};\nnv.models.boxPlotChart = function() {\n    \"use strict\";\n\n    //============================================================\n    // Public Variables with Default Settings\n    //------------------------------------------------------------\n\n    var boxplot = nv.models.boxPlot()\n        , xAxis = nv.models.axis()\n        , yAxis = nv.models.axis()\n        ;\n\n    var margin = {top: 15, right: 10, bottom: 50, left: 60}\n        , width = null\n        , height = null\n        , color = nv.utils.getColor()\n        , showXAxis = true\n        , showYAxis = true\n        , rightAlignYAxis = false\n        , staggerLabels = false\n        , tooltip = nv.models.tooltip()\n        , x\n        , y\n        , noData = \"No Data Available.\"\n        , dispatch = d3.dispatch('tooltipShow', 'tooltipHide', 'beforeUpdate', 'renderEnd')\n        , duration = 250\n        ;\n\n    xAxis\n        .orient('bottom')\n        .showMaxMin(false)\n        .tickFormat(function(d) { return d })\n    ;\n    yAxis\n        .orient((rightAlignYAxis) ? 'right' : 'left')\n        .tickFormat(d3.format(',.1f'))\n    ;\n    \n    tooltip.duration(0);\n\n    //============================================================\n    // Private Variables\n    //------------------------------------------------------------\n\n    var renderWatch = nv.utils.renderWatch(dispatch, duration);\n\n    function chart(selection) {\n        renderWatch.reset();\n        renderWatch.models(boxplot);\n        if (showXAxis) renderWatch.models(xAxis);\n        if (showYAxis) renderWatch.models(yAxis);\n\n        selection.each(function(data) {\n            var container = d3.select(this),\n                that = this;\n            nv.utils.initSVG(container);\n            var availableWidth = (width  || parseInt(container.style('width')) || 960)\n                    - margin.left - margin.right,\n                availableHeight = (height || parseInt(container.style('height')) || 400)\n                    - margin.top - margin.bottom;\n\n            chart.update = function() {\n                dispatch.beforeUpdate();\n                container.transition().duration(duration).call(chart);\n            };\n            chart.container = this;\n\n            // Display No Data message if there's nothing to show. (quartiles required at minimum)\n            if (!data || !data.length || \n                    !data.filter(function(d) { return d.values.hasOwnProperty(\"Q1\") && d.values.hasOwnProperty(\"Q2\") && d.values.hasOwnProperty(\"Q3\"); }).length) {\n                var noDataText = container.selectAll('.nv-noData').data([noData]);\n\n                noDataText.enter().append('text')\n                    .attr('class', 'nvd3 nv-noData')\n                    .attr('dy', '-.7em')\n                    .style('text-anchor', 'middle');\n\n                noDataText\n                    .attr('x', margin.left + availableWidth / 2)\n                    .attr('y', margin.top + availableHeight / 2)\n                    .text(function(d) { return d });\n\n                return chart;\n            } else {\n                container.selectAll('.nv-noData').remove();\n            }\n\n            // Setup Scales\n            x = boxplot.xScale();\n            y = boxplot.yScale().clamp(true);\n\n            // Setup containers and skeleton of chart\n            var wrap = container.selectAll('g.nv-wrap.nv-boxPlotWithAxes').data([data]);\n            var gEnter = wrap.enter().append('g').attr('class', 'nvd3 nv-wrap nv-boxPlotWithAxes').append('g');\n            var defsEnter = gEnter.append('defs');\n            var g = wrap.select('g');\n\n            gEnter.append('g').attr('class', 'nv-x nv-axis');\n            gEnter.append('g').attr('class', 'nv-y nv-axis')\n                .append('g').attr('class', 'nv-zeroLine')\n                .append('line');\n\n            gEnter.append('g').attr('class', 'nv-barsWrap');\n\n            g.attr('transform', 'translate(' + margin.left + ',' + margin.top + ')');\n\n            if (rightAlignYAxis) {\n                g.select(\".nv-y.nv-axis\")\n                    .attr(\"transform\", \"translate(\" + availableWidth + \",0)\");\n            }\n\n            // Main Chart Component(s)\n            boxplot\n                .width(availableWidth)\n                .height(availableHeight);\n\n            var barsWrap = g.select('.nv-barsWrap')\n                .datum(data.filter(function(d) { return !d.disabled }))\n\n            barsWrap.transition().call(boxplot);\n\n\n            defsEnter.append('clipPath')\n                .attr('id', 'nv-x-label-clip-' + boxplot.id())\n                .append('rect');\n\n            g.select('#nv-x-label-clip-' + boxplot.id() + ' rect')\n                .attr('width', x.rangeBand() * (staggerLabels ? 2 : 1))\n                .attr('height', 16)\n                .attr('x', -x.rangeBand() / (staggerLabels ? 1 : 2 ));\n\n            // Setup Axes\n            if (showXAxis) {\n                xAxis\n                    .scale(x)\n                    .ticks( nv.utils.calcTicksX(availableWidth/100, data) )\n                    .tickSize(-availableHeight, 0);\n\n                g.select('.nv-x.nv-axis').attr('transform', 'translate(0,' + y.range()[0] + ')');\n                g.select('.nv-x.nv-axis').call(xAxis);\n\n                var xTicks = g.select('.nv-x.nv-axis').selectAll('g');\n                if (staggerLabels) {\n                    xTicks\n                        .selectAll('text')\n                        .attr('transform', function(d,i,j) { return 'translate(0,' + (j % 2 == 0 ? '5' : '17') + ')' })\n                }\n            }\n\n            if (showYAxis) {\n                yAxis\n                    .scale(y)\n                    .ticks( Math.floor(availableHeight/36) ) // can't use nv.utils.calcTicksY with Object data\n                    .tickSize( -availableWidth, 0);\n\n                g.select('.nv-y.nv-axis').call(yAxis);\n            }\n\n            // Zero line\n            g.select(\".nv-zeroLine line\")\n                .attr(\"x1\",0)\n                .attr(\"x2\",availableWidth)\n                .attr(\"y1\", y(0))\n                .attr(\"y2\", y(0))\n            ;\n\n            //============================================================\n            // Event Handling/Dispatching (in chart's scope)\n            //------------------------------------------------------------\n        });\n\n        renderWatch.renderEnd('nv-boxplot chart immediate');\n        return chart;\n    }\n\n    //============================================================\n    // Event Handling/Dispatching (out of chart's scope)\n    //------------------------------------------------------------\n\n    boxplot.dispatch.on('elementMouseover.tooltip', function(evt) {\n        tooltip.data(evt).hidden(false);\n    });\n\n    boxplot.dispatch.on('elementMouseout.tooltip', function(evt) {\n        tooltip.data(evt).hidden(true);\n    });\n\n    boxplot.dispatch.on('elementMousemove.tooltip', function(evt) {\n        tooltip.position({top: d3.event.pageY, left: d3.event.pageX})();\n    });\n\n    //============================================================\n    // Expose Public Variables\n    //------------------------------------------------------------\n\n    chart.dispatch = dispatch;\n    chart.boxplot = boxplot;\n    chart.xAxis = xAxis;\n    chart.yAxis = yAxis;\n    chart.tooltip = tooltip;\n\n    chart.options = nv.utils.optionsFunc.bind(chart);\n\n    chart._options = Object.create({}, {\n        // simple options, just get/set the necessary values\n        width:      {get: function(){return width;}, set: function(_){width=_;}},\n        height:     {get: function(){return height;}, set: function(_){height=_;}},\n        staggerLabels: {get: function(){return staggerLabels;}, set: function(_){staggerLabels=_;}},\n        showXAxis: {get: function(){return showXAxis;}, set: function(_){showXAxis=_;}},\n        showYAxis: {get: function(){return showYAxis;}, set: function(_){showYAxis=_;}},\n        tooltips:    {get: function(){return tooltips;}, set: function(_){tooltips=_;}},\n        tooltipContent:    {get: function(){return tooltip;}, set: function(_){tooltip=_;}},\n        noData:    {get: function(){return noData;}, set: function(_){noData=_;}},\n\n        // options that require extra logic in the setter\n        margin: {get: function(){return margin;}, set: function(_){\n            margin.top    = _.top    !== undefined ? _.top    : margin.top;\n            margin.right  = _.right  !== undefined ? _.right  : margin.right;\n            margin.bottom = _.bottom !== undefined ? _.bottom : margin.bottom;\n            margin.left   = _.left   !== undefined ? _.left   : margin.left;\n        }},\n        duration: {get: function(){return duration;}, set: function(_){\n            duration = _;\n            renderWatch.reset(duration);\n            boxplot.duration(duration);\n            xAxis.duration(duration);\n            yAxis.duration(duration);\n        }},\n        color:  {get: function(){return color;}, set: function(_){\n            color = nv.utils.getColor(_);\n            boxplot.color(color);\n        }},\n        rightAlignYAxis: {get: function(){return rightAlignYAxis;}, set: function(_){\n            rightAlignYAxis = _;\n            yAxis.orient( (_) ? 'right' : 'left');\n        }}\n    });\n\n    nv.utils.inheritOptions(chart, boxplot);\n    nv.utils.initOptions(chart);\n\n    return chart;\n}\n// Chart design based on the recommendations of Stephen Few. Implementation\n// based on the work of Clint Ivy, Jamie Love, and Jason Davies.\n// http://projects.instantcognition.com/protovis/bulletchart/\n\nnv.models.bullet = function() {\n    \"use strict\";\n\n    //============================================================\n    // Public Variables with Default Settings\n    //------------------------------------------------------------\n\n    var margin = {top: 0, right: 0, bottom: 0, left: 0}\n        , orient = 'left' // TODO top & bottom\n        , reverse = false\n        , ranges = function(d) { return d.ranges }\n        , markers = function(d) { return d.markers ? d.markers : [0] }\n        , measures = function(d) { return d.measures }\n        , rangeLabels = function(d) { return d.rangeLabels ? d.rangeLabels : [] }\n        , markerLabels = function(d) { return d.markerLabels ? d.markerLabels : []  }\n        , measureLabels = function(d) { return d.measureLabels ? d.measureLabels : []  }\n        , forceX = [0] // List of numbers to Force into the X scale (ie. 0, or a max / min, etc.)\n        , width = 380\n        , height = 30\n        , container = null\n        , tickFormat = null\n        , color = nv.utils.getColor(['#1f77b4'])\n        , dispatch = d3.dispatch('elementMouseover', 'elementMouseout', 'elementMousemove')\n        ;\n\n    function chart(selection) {\n        selection.each(function(d, i) {\n            var availableWidth = width - margin.left - margin.right,\n                availableHeight = height - margin.top - margin.bottom;\n\n            container = d3.select(this);\n            nv.utils.initSVG(container);\n\n            var rangez = ranges.call(this, d, i).slice().sort(d3.descending),\n                markerz = markers.call(this, d, i).slice().sort(d3.descending),\n                measurez = measures.call(this, d, i).slice().sort(d3.descending),\n                rangeLabelz = rangeLabels.call(this, d, i).slice(),\n                markerLabelz = markerLabels.call(this, d, i).slice(),\n                measureLabelz = measureLabels.call(this, d, i).slice();\n\n            // Setup Scales\n            // Compute the new x-scale.\n            var x1 = d3.scale.linear()\n                .domain( d3.extent(d3.merge([forceX, rangez])) )\n                .range(reverse ? [availableWidth, 0] : [0, availableWidth]);\n\n            // Retrieve the old x-scale, if this is an update.\n            var x0 = this.__chart__ || d3.scale.linear()\n                .domain([0, Infinity])\n                .range(x1.range());\n\n            // Stash the new scale.\n            this.__chart__ = x1;\n\n            var rangeMin = d3.min(rangez), //rangez[2]\n                rangeMax = d3.max(rangez), //rangez[0]\n                rangeAvg = rangez[1];\n\n            // Setup containers and skeleton of chart\n            var wrap = container.selectAll('g.nv-wrap.nv-bullet').data([d]);\n            var wrapEnter = wrap.enter().append('g').attr('class', 'nvd3 nv-wrap nv-bullet');\n            var gEnter = wrapEnter.append('g');\n            var g = wrap.select('g');\n\n            gEnter.append('rect').attr('class', 'nv-range nv-rangeMax');\n            gEnter.append('rect').attr('class', 'nv-range nv-rangeAvg');\n            gEnter.append('rect').attr('class', 'nv-range nv-rangeMin');\n            gEnter.append('rect').attr('class', 'nv-measure');\n\n            wrap.attr('transform', 'translate(' + margin.left + ',' + margin.top + ')');\n\n            var w0 = function(d) { return Math.abs(x0(d) - x0(0)) }, // TODO: could optimize by precalculating x0(0) and x1(0)\n                w1 = function(d) { return Math.abs(x1(d) - x1(0)) };\n            var xp0 = function(d) { return d < 0 ? x0(d) : x0(0) },\n                xp1 = function(d) { return d < 0 ? x1(d) : x1(0) };\n\n            g.select('rect.nv-rangeMax')\n                .attr('height', availableHeight)\n                .attr('width', w1(rangeMax > 0 ? rangeMax : rangeMin))\n                .attr('x', xp1(rangeMax > 0 ? rangeMax : rangeMin))\n                .datum(rangeMax > 0 ? rangeMax : rangeMin)\n\n            g.select('rect.nv-rangeAvg')\n                .attr('height', availableHeight)\n                .attr('width', w1(rangeAvg))\n                .attr('x', xp1(rangeAvg))\n                .datum(rangeAvg)\n\n            g.select('rect.nv-rangeMin')\n                .attr('height', availableHeight)\n                .attr('width', w1(rangeMax))\n                .attr('x', xp1(rangeMax))\n                .attr('width', w1(rangeMax > 0 ? rangeMin : rangeMax))\n                .attr('x', xp1(rangeMax > 0 ? rangeMin : rangeMax))\n                .datum(rangeMax > 0 ? rangeMin : rangeMax)\n\n            g.select('rect.nv-measure')\n                .style('fill', color)\n                .attr('height', availableHeight / 3)\n                .attr('y', availableHeight / 3)\n                .attr('width', measurez < 0 ?\n                    x1(0) - x1(measurez[0])\n                    : x1(measurez[0]) - x1(0))\n                .attr('x', xp1(measurez))\n                .on('mouseover', function() {\n                    dispatch.elementMouseover({\n                        value: measurez[0],\n                        label: measureLabelz[0] || 'Current',\n                        color: d3.select(this).style(\"fill\")\n                    })\n                })\n                .on('mousemove', function() {\n                    dispatch.elementMousemove({\n                        value: measurez[0],\n                        label: measureLabelz[0] || 'Current',\n                        color: d3.select(this).style(\"fill\")\n                    })\n                })\n                .on('mouseout', function() {\n                    dispatch.elementMouseout({\n                        value: measurez[0],\n                        label: measureLabelz[0] || 'Current',\n                        color: d3.select(this).style(\"fill\")\n                    })\n                });\n\n            var h3 =  availableHeight / 6;\n\n            var markerData = markerz.map( function(marker, index) {\n                return {value: marker, label: markerLabelz[index]}\n            });\n            gEnter\n              .selectAll(\"path.nv-markerTriangle\")\n              .data(markerData)\n              .enter()\n              .append('path')\n              .attr('class', 'nv-markerTriangle')\n              .attr('transform', function(d) { return 'translate(' + x1(d.value) + ',' + (availableHeight / 2) + ')' })\n              .attr('d', 'M0,' + h3 + 'L' + h3 + ',' + (-h3) + ' ' + (-h3) + ',' + (-h3) + 'Z')\n              .on('mouseover', function(d) {\n                dispatch.elementMouseover({\n                  value: d.value,\n                  label: d.label || 'Previous',\n                  color: d3.select(this).style(\"fill\"),\n                  pos: [x1(d.value), availableHeight/2]\n                })\n\n              })\n              .on('mousemove', function(d) {\n                  dispatch.elementMousemove({\n                      value: d.value,\n                      label: d.label || 'Previous',\n                      color: d3.select(this).style(\"fill\")\n                  })\n              })\n              .on('mouseout', function(d, i) {\n                  dispatch.elementMouseout({\n                      value: d.value,\n                      label: d.label || 'Previous',\n                      color: d3.select(this).style(\"fill\")\n                  })\n              });\n\n            wrap.selectAll('.nv-range')\n                .on('mouseover', function(d,i) {\n                    var label = rangeLabelz[i] || (!i ? \"Maximum\" : i == 1 ? \"Mean\" : \"Minimum\");\n                    dispatch.elementMouseover({\n                        value: d,\n                        label: label,\n                        color: d3.select(this).style(\"fill\")\n                    })\n                })\n                .on('mousemove', function() {\n                    dispatch.elementMousemove({\n                        value: measurez[0],\n                        label: measureLabelz[0] || 'Previous',\n                        color: d3.select(this).style(\"fill\")\n                    })\n                })\n                .on('mouseout', function(d,i) {\n                    var label = rangeLabelz[i] || (!i ? \"Maximum\" : i == 1 ? \"Mean\" : \"Minimum\");\n                    dispatch.elementMouseout({\n                        value: d,\n                        label: label,\n                        color: d3.select(this).style(\"fill\")\n                    })\n                });\n        });\n\n        return chart;\n    }\n\n    //============================================================\n    // Expose Public Variables\n    //------------------------------------------------------------\n\n    chart.dispatch = dispatch;\n    chart.options = nv.utils.optionsFunc.bind(chart);\n\n    chart._options = Object.create({}, {\n        // simple options, just get/set the necessary values\n        ranges:      {get: function(){return ranges;}, set: function(_){ranges=_;}}, // ranges (bad, satisfactory, good)\n        markers:     {get: function(){return markers;}, set: function(_){markers=_;}}, // markers (previous, goal)\n        measures: {get: function(){return measures;}, set: function(_){measures=_;}}, // measures (actual, forecast)\n        forceX:      {get: function(){return forceX;}, set: function(_){forceX=_;}},\n        width:    {get: function(){return width;}, set: function(_){width=_;}},\n        height:    {get: function(){return height;}, set: function(_){height=_;}},\n        tickFormat:    {get: function(){return tickFormat;}, set: function(_){tickFormat=_;}},\n\n        // options that require extra logic in the setter\n        margin: {get: function(){return margin;}, set: function(_){\n            margin.top    = _.top    !== undefined ? _.top    : margin.top;\n            margin.right  = _.right  !== undefined ? _.right  : margin.right;\n            margin.bottom = _.bottom !== undefined ? _.bottom : margin.bottom;\n            margin.left   = _.left   !== undefined ? _.left   : margin.left;\n        }},\n        orient: {get: function(){return orient;}, set: function(_){ // left, right, top, bottom\n            orient = _;\n            reverse = orient == 'right' || orient == 'bottom';\n        }},\n        color:  {get: function(){return color;}, set: function(_){\n            color = nv.utils.getColor(_);\n        }}\n    });\n\n    nv.utils.initOptions(chart);\n    return chart;\n};\n\n\n\n// Chart design based on the recommendations of Stephen Few. Implementation\n// based on the work of Clint Ivy, Jamie Love, and Jason Davies.\n// http://projects.instantcognition.com/protovis/bulletchart/\nnv.models.bulletChart = function() {\n    \"use strict\";\n\n    //============================================================\n    // Public Variables with Default Settings\n    //------------------------------------------------------------\n\n    var bullet = nv.models.bullet();\n    var tooltip = nv.models.tooltip();\n\n    var orient = 'left' // TODO top & bottom\n        , reverse = false\n        , margin = {top: 5, right: 40, bottom: 20, left: 120}\n        , ranges = function(d) { return d.ranges }\n        , markers = function(d) { return d.markers ? d.markers : [0] }\n        , measures = function(d) { return d.measures }\n        , width = null\n        , height = 55\n        , tickFormat = null\n\t, ticks = null\n        , noData = null\n        , dispatch = d3.dispatch('tooltipShow', 'tooltipHide')\n        ;\n\n    tooltip.duration(0).headerEnabled(false);\n\n    function chart(selection) {\n        selection.each(function(d, i) {\n            var container = d3.select(this);\n            nv.utils.initSVG(container);\n\n            var availableWidth = nv.utils.availableWidth(width, container, margin),\n                availableHeight = height - margin.top - margin.bottom,\n                that = this;\n\n            chart.update = function() { chart(selection) };\n            chart.container = this;\n\n            // Display No Data message if there's nothing to show.\n            if (!d || !ranges.call(this, d, i)) {\n                nv.utils.noData(chart, container)\n                return chart;\n            } else {\n                container.selectAll('.nv-noData').remove();\n            }\n\n            var rangez = ranges.call(this, d, i).slice().sort(d3.descending),\n                markerz = markers.call(this, d, i).slice().sort(d3.descending),\n                measurez = measures.call(this, d, i).slice().sort(d3.descending);\n\n            // Setup containers and skeleton of chart\n            var wrap = container.selectAll('g.nv-wrap.nv-bulletChart').data([d]);\n            var wrapEnter = wrap.enter().append('g').attr('class', 'nvd3 nv-wrap nv-bulletChart');\n            var gEnter = wrapEnter.append('g');\n            var g = wrap.select('g');\n\n            gEnter.append('g').attr('class', 'nv-bulletWrap');\n            gEnter.append('g').attr('class', 'nv-titles');\n\n            wrap.attr('transform', 'translate(' + margin.left + ',' + margin.top + ')');\n\n            // Compute the new x-scale.\n            var x1 = d3.scale.linear()\n                .domain([0, Math.max(rangez[0], markerz[0], measurez[0])])  // TODO: need to allow forceX and forceY, and xDomain, yDomain\n                .range(reverse ? [availableWidth, 0] : [0, availableWidth]);\n\n            // Retrieve the old x-scale, if this is an update.\n            var x0 = this.__chart__ || d3.scale.linear()\n                .domain([0, Infinity])\n                .range(x1.range());\n\n            // Stash the new scale.\n            this.__chart__ = x1;\n\n            var w0 = function(d) { return Math.abs(x0(d) - x0(0)) }, // TODO: could optimize by precalculating x0(0) and x1(0)\n                w1 = function(d) { return Math.abs(x1(d) - x1(0)) };\n\n            var title = gEnter.select('.nv-titles').append('g')\n                .attr('text-anchor', 'end')\n                .attr('transform', 'translate(-6,' + (height - margin.top - margin.bottom) / 2 + ')');\n            title.append('text')\n                .attr('class', 'nv-title')\n                .text(function(d) { return d.title; });\n\n            title.append('text')\n                .attr('class', 'nv-subtitle')\n                .attr('dy', '1em')\n                .text(function(d) { return d.subtitle; });\n\n            bullet\n                .width(availableWidth)\n                .height(availableHeight)\n\n            var bulletWrap = g.select('.nv-bulletWrap');\n            d3.transition(bulletWrap).call(bullet);\n\n            // Compute the tick format.\n            var format = tickFormat || x1.tickFormat( availableWidth / 100 );\n\n            // Update the tick groups.\n            var tick = g.selectAll('g.nv-tick')\n                .data(x1.ticks( ticks ? ticks : (availableWidth / 50) ), function(d) {\n                    return this.textContent || format(d);\n                });\n\n            // Initialize the ticks with the old scale, x0.\n            var tickEnter = tick.enter().append('g')\n                .attr('class', 'nv-tick')\n                .attr('transform', function(d) { return 'translate(' + x0(d) + ',0)' })\n                .style('opacity', 1e-6);\n\n            tickEnter.append('line')\n                .attr('y1', availableHeight)\n                .attr('y2', availableHeight * 7 / 6);\n\n            tickEnter.append('text')\n                .attr('text-anchor', 'middle')\n                .attr('dy', '1em')\n                .attr('y', availableHeight * 7 / 6)\n                .text(format);\n\n            // Transition the updating ticks to the new scale, x1.\n            var tickUpdate = d3.transition(tick)\n                .attr('transform', function(d) { return 'translate(' + x1(d) + ',0)' })\n                .style('opacity', 1);\n\n            tickUpdate.select('line')\n                .attr('y1', availableHeight)\n                .attr('y2', availableHeight * 7 / 6);\n\n            tickUpdate.select('text')\n                .attr('y', availableHeight * 7 / 6);\n\n            // Transition the exiting ticks to the new scale, x1.\n            d3.transition(tick.exit())\n                .attr('transform', function(d) { return 'translate(' + x1(d) + ',0)' })\n                .style('opacity', 1e-6)\n                .remove();\n        });\n\n        d3.timer.flush();\n        return chart;\n    }\n\n    //============================================================\n    // Event Handling/Dispatching (out of chart's scope)\n    //------------------------------------------------------------\n\n    bullet.dispatch.on('elementMouseover.tooltip', function(evt) {\n        evt['series'] = {\n            key: evt.label,\n            value: evt.value,\n            color: evt.color\n        };\n        tooltip.data(evt).hidden(false);\n    });\n\n    bullet.dispatch.on('elementMouseout.tooltip', function(evt) {\n        tooltip.hidden(true);\n    });\n\n    bullet.dispatch.on('elementMousemove.tooltip', function(evt) {\n        tooltip.position({top: d3.event.pageY, left: d3.event.pageX})();\n    });\n\n    //============================================================\n    // Expose Public Variables\n    //------------------------------------------------------------\n\n    chart.bullet = bullet;\n    chart.dispatch = dispatch;\n    chart.tooltip = tooltip;\n\n    chart.options = nv.utils.optionsFunc.bind(chart);\n\n    chart._options = Object.create({}, {\n        // simple options, just get/set the necessary values\n        ranges:      {get: function(){return ranges;}, set: function(_){ranges=_;}}, // ranges (bad, satisfactory, good)\n        markers:     {get: function(){return markers;}, set: function(_){markers=_;}}, // markers (previous, goal)\n        measures: {get: function(){return measures;}, set: function(_){measures=_;}}, // measures (actual, forecast)\n        width:    {get: function(){return width;}, set: function(_){width=_;}},\n        height:    {get: function(){return height;}, set: function(_){height=_;}},\n        tickFormat:    {get: function(){return tickFormat;}, set: function(_){tickFormat=_;}},\n        ticks:    {get: function(){return ticks;}, set: function(_){ticks=_;}},\n        noData:    {get: function(){return noData;}, set: function(_){noData=_;}},\n\n        // deprecated options\n        tooltips:    {get: function(){return tooltip.enabled();}, set: function(_){\n            // deprecated after 1.7.1\n            nv.deprecated('tooltips', 'use chart.tooltip.enabled() instead');\n            tooltip.enabled(!!_);\n        }},\n        tooltipContent:    {get: function(){return tooltip.contentGenerator();}, set: function(_){\n            // deprecated after 1.7.1\n            nv.deprecated('tooltipContent', 'use chart.tooltip.contentGenerator() instead');\n            tooltip.contentGenerator(_);\n        }},\n\n        // options that require extra logic in the setter\n        margin: {get: function(){return margin;}, set: function(_){\n            margin.top    = _.top    !== undefined ? _.top    : margin.top;\n            margin.right  = _.right  !== undefined ? _.right  : margin.right;\n            margin.bottom = _.bottom !== undefined ? _.bottom : margin.bottom;\n            margin.left   = _.left   !== undefined ? _.left   : margin.left;\n        }},\n        orient: {get: function(){return orient;}, set: function(_){ // left, right, top, bottom\n            orient = _;\n            reverse = orient == 'right' || orient == 'bottom';\n        }}\n    });\n\n    nv.utils.inheritOptions(chart, bullet);\n    nv.utils.initOptions(chart);\n\n    return chart;\n};\n\n\n\nnv.models.candlestickBar = function() {\n    \"use strict\";\n\n    //============================================================\n    // Public Variables with Default Settings\n    //------------------------------------------------------------\n\n    var margin = {top: 0, right: 0, bottom: 0, left: 0}\n        , width = null\n        , height = null\n        , id = Math.floor(Math.random() * 10000) //Create semi-unique ID in case user doesn't select one\n        , container\n        , x = d3.scale.linear()\n        , y = d3.scale.linear()\n        , getX = function(d) { return d.x }\n        , getY = function(d) { return d.y }\n        , getOpen = function(d) { return d.open }\n        , getClose = function(d) { return d.close }\n        , getHigh = function(d) { return d.high }\n        , getLow = function(d) { return d.low }\n        , forceX = []\n        , forceY = []\n        , padData     = false // If true, adds half a data points width to front and back, for lining up a line chart with a bar chart\n        , clipEdge = true\n        , color = nv.utils.defaultColor()\n        , interactive = false\n        , xDomain\n        , yDomain\n        , xRange\n        , yRange\n        , dispatch = d3.dispatch('tooltipShow', 'tooltipHide', 'stateChange', 'changeState', 'renderEnd', 'chartClick', 'elementClick', 'elementDblClick', 'elementMouseover', 'elementMouseout', 'elementMousemove')\n        ;\n\n    //============================================================\n    // Private Variables\n    //------------------------------------------------------------\n\n    function chart(selection) {\n        selection.each(function(data) {\n            container = d3.select(this);\n            var availableWidth = nv.utils.availableWidth(width, container, margin),\n                availableHeight = nv.utils.availableHeight(height, container, margin);\n\n            nv.utils.initSVG(container);\n\n            // Width of the candlestick bars.\n            var barWidth = (availableWidth / data[0].values.length) * .45;\n\n            // Setup Scales\n            x.domain(xDomain || d3.extent(data[0].values.map(getX).concat(forceX) ));\n\n            if (padData)\n                x.range(xRange || [availableWidth * .5 / data[0].values.length, availableWidth * (data[0].values.length - .5)  / data[0].values.length ]);\n            else\n                x.range(xRange || [5 + barWidth / 2, availableWidth - barWidth / 2 - 5]);\n\n            y.domain(yDomain || [\n                    d3.min(data[0].values.map(getLow).concat(forceY)),\n                    d3.max(data[0].values.map(getHigh).concat(forceY))\n                ]\n            ).range(yRange || [availableHeight, 0]);\n\n            // If scale's domain don't have a range, slightly adjust to make one... so a chart can show a single data point\n            if (x.domain()[0] === x.domain()[1])\n                x.domain()[0] ?\n                    x.domain([x.domain()[0] - x.domain()[0] * 0.01, x.domain()[1] + x.domain()[1] * 0.01])\n                    : x.domain([-1,1]);\n\n            if (y.domain()[0] === y.domain()[1])\n                y.domain()[0] ?\n                    y.domain([y.domain()[0] + y.domain()[0] * 0.01, y.domain()[1] - y.domain()[1] * 0.01])\n                    : y.domain([-1,1]);\n\n            // Setup containers and skeleton of chart\n            var wrap = d3.select(this).selectAll('g.nv-wrap.nv-candlestickBar').data([data[0].values]);\n            var wrapEnter = wrap.enter().append('g').attr('class', 'nvd3 nv-wrap nv-candlestickBar');\n            var defsEnter = wrapEnter.append('defs');\n            var gEnter = wrapEnter.append('g');\n            var g = wrap.select('g');\n\n            gEnter.append('g').attr('class', 'nv-ticks');\n\n            wrap.attr('transform', 'translate(' + margin.left + ',' + margin.top + ')');\n\n            container\n                .on('click', function(d,i) {\n                    dispatch.chartClick({\n                        data: d,\n                        index: i,\n                        pos: d3.event,\n                        id: id\n                    });\n                });\n\n            defsEnter.append('clipPath')\n                .attr('id', 'nv-chart-clip-path-' + id)\n                .append('rect');\n\n            wrap.select('#nv-chart-clip-path-' + id + ' rect')\n                .attr('width', availableWidth)\n                .attr('height', availableHeight);\n\n            g   .attr('clip-path', clipEdge ? 'url(#nv-chart-clip-path-' + id + ')' : '');\n\n            var ticks = wrap.select('.nv-ticks').selectAll('.nv-tick')\n                .data(function(d) { return d });\n            ticks.exit().remove();\n\n            // The colors are currently controlled by CSS.\n            var tickGroups = ticks.enter().append('g')\n                .attr('class', function(d, i, j) { return (getOpen(d, i) > getClose(d, i) ? 'nv-tick negative' : 'nv-tick positive') + ' nv-tick-' + j + '-' + i});\n\n            var lines = tickGroups.append('line')\n                .attr('class', 'nv-candlestick-lines')\n                .attr('transform', function(d, i) { return 'translate(' + x(getX(d, i)) + ',0)'; })\n                .attr('x1', 0)\n                .attr('y1', function(d, i) { return y(getHigh(d, i)); })\n                .attr('x2', 0)\n                .attr('y2', function(d, i) { return y(getLow(d, i)); });\n\n            var rects = tickGroups.append('rect')\n                .attr('class', 'nv-candlestick-rects nv-bars')\n                .attr('transform', function(d, i) {\n                    return 'translate(' + (x(getX(d, i)) - barWidth/2) + ','\n                    + (y(getY(d, i)) - (getOpen(d, i) > getClose(d, i) ? (y(getClose(d, i)) - y(getOpen(d, i))) : 0))\n                    + ')';\n                })\n                .attr('x', 0)\n                .attr('y', 0)\n                .attr('width', barWidth)\n                .attr('height', function(d, i) {\n                    var open = getOpen(d, i);\n                    var close = getClose(d, i);\n                    return open > close ? y(close) - y(open) : y(open) - y(close);\n                });\n\n            container.selectAll('.nv-candlestick-lines').transition()\n                .attr('transform', function(d, i) { return 'translate(' + x(getX(d, i)) + ',0)'; })\n                .attr('x1', 0)\n                .attr('y1', function(d, i) { return y(getHigh(d, i)); })\n                .attr('x2', 0)\n                .attr('y2', function(d, i) { return y(getLow(d, i)); });\n\n            container.selectAll('.nv-candlestick-rects').transition()\n                .attr('transform', function(d, i) {\n                    return 'translate(' + (x(getX(d, i)) - barWidth/2) + ','\n                    + (y(getY(d, i)) - (getOpen(d, i) > getClose(d, i) ? (y(getClose(d, i)) - y(getOpen(d, i))) : 0))\n                    + ')';\n                })\n                .attr('x', 0)\n                .attr('y', 0)\n                .attr('width', barWidth)\n                .attr('height', function(d, i) {\n                    var open = getOpen(d, i);\n                    var close = getClose(d, i);\n                    return open > close ? y(close) - y(open) : y(open) - y(close);\n                });\n        });\n\n        return chart;\n    }\n\n\n    //Create methods to allow outside functions to highlight a specific bar.\n    chart.highlightPoint = function(pointIndex, isHoverOver) {\n        chart.clearHighlights();\n        container.select(\".nv-candlestickBar .nv-tick-0-\" + pointIndex)\n            .classed(\"hover\", isHoverOver)\n        ;\n    };\n\n    chart.clearHighlights = function() {\n        container.select(\".nv-candlestickBar .nv-tick.hover\")\n            .classed(\"hover\", false)\n        ;\n    };\n\n    //============================================================\n    // Expose Public Variables\n    //------------------------------------------------------------\n\n    chart.dispatch = dispatch;\n    chart.options = nv.utils.optionsFunc.bind(chart);\n\n    chart._options = Object.create({}, {\n        // simple options, just get/set the necessary values\n        width:    {get: function(){return width;}, set: function(_){width=_;}},\n        height:   {get: function(){return height;}, set: function(_){height=_;}},\n        xScale:   {get: function(){return x;}, set: function(_){x=_;}},\n        yScale:   {get: function(){return y;}, set: function(_){y=_;}},\n        xDomain:  {get: function(){return xDomain;}, set: function(_){xDomain=_;}},\n        yDomain:  {get: function(){return yDomain;}, set: function(_){yDomain=_;}},\n        xRange:   {get: function(){return xRange;}, set: function(_){xRange=_;}},\n        yRange:   {get: function(){return yRange;}, set: function(_){yRange=_;}},\n        forceX:   {get: function(){return forceX;}, set: function(_){forceX=_;}},\n        forceY:   {get: function(){return forceY;}, set: function(_){forceY=_;}},\n        padData:  {get: function(){return padData;}, set: function(_){padData=_;}},\n        clipEdge: {get: function(){return clipEdge;}, set: function(_){clipEdge=_;}},\n        id:       {get: function(){return id;}, set: function(_){id=_;}},\n        interactive: {get: function(){return interactive;}, set: function(_){interactive=_;}},\n\n        x:     {get: function(){return getX;}, set: function(_){getX=_;}},\n        y:     {get: function(){return getY;}, set: function(_){getY=_;}},\n        open:  {get: function(){return getOpen();}, set: function(_){getOpen=_;}},\n        close: {get: function(){return getClose();}, set: function(_){getClose=_;}},\n        high:  {get: function(){return getHigh;}, set: function(_){getHigh=_;}},\n        low:   {get: function(){return getLow;}, set: function(_){getLow=_;}},\n\n        // options that require extra logic in the setter\n        margin: {get: function(){return margin;}, set: function(_){\n            margin.top    = _.top    != undefined ? _.top    : margin.top;\n            margin.right  = _.right  != undefined ? _.right  : margin.right;\n            margin.bottom = _.bottom != undefined ? _.bottom : margin.bottom;\n            margin.left   = _.left   != undefined ? _.left   : margin.left;\n        }},\n        color:  {get: function(){return color;}, set: function(_){\n            color = nv.utils.getColor(_);\n        }}\n    });\n\n    nv.utils.initOptions(chart);\n    return chart;\n};\n\nnv.models.cumulativeLineChart = function() {\n    \"use strict\";\n\n    //============================================================\n    // Public Variables with Default Settings\n    //------------------------------------------------------------\n\n    var lines = nv.models.line()\n        , xAxis = nv.models.axis()\n        , yAxis = nv.models.axis()\n        , legend = nv.models.legend()\n        , controls = nv.models.legend()\n        , interactiveLayer = nv.interactiveGuideline()\n        , tooltip = nv.models.tooltip()\n        ;\n\n    var margin = {top: 30, right: 30, bottom: 50, left: 60}\n        , color = nv.utils.defaultColor()\n        , width = null\n        , height = null\n        , showLegend = true\n        , showXAxis = true\n        , showYAxis = true\n        , rightAlignYAxis = false\n        , showControls = true\n        , useInteractiveGuideline = false\n        , rescaleY = true\n        , x //can be accessed via chart.xScale()\n        , y //can be accessed via chart.yScale()\n        , id = lines.id()\n        , state = nv.utils.state()\n        , defaultState = null\n        , noData = null\n        , average = function(d) { return d.average }\n        , dispatch = d3.dispatch('stateChange', 'changeState', 'renderEnd')\n        , transitionDuration = 250\n        , duration = 250\n        , noErrorCheck = false  //if set to TRUE, will bypass an error check in the indexify function.\n        ;\n\n    state.index = 0;\n    state.rescaleY = rescaleY;\n\n    xAxis.orient('bottom').tickPadding(7);\n    yAxis.orient((rightAlignYAxis) ? 'right' : 'left');\n\n    tooltip.valueFormatter(function(d, i) {\n        return yAxis.tickFormat()(d, i);\n    }).headerFormatter(function(d, i) {\n        return xAxis.tickFormat()(d, i);\n    });\n\n    controls.updateState(false);\n\n    //============================================================\n    // Private Variables\n    //------------------------------------------------------------\n\n    var dx = d3.scale.linear()\n        , index = {i: 0, x: 0}\n        , renderWatch = nv.utils.renderWatch(dispatch, duration)\n        ;\n\n    var stateGetter = function(data) {\n        return function(){\n            return {\n                active: data.map(function(d) { return !d.disabled }),\n                index: index.i,\n                rescaleY: rescaleY\n            };\n        }\n    };\n\n    var stateSetter = function(data) {\n        return function(state) {\n            if (state.index !== undefined)\n                index.i = state.index;\n            if (state.rescaleY !== undefined)\n                rescaleY = state.rescaleY;\n            if (state.active !== undefined)\n                data.forEach(function(series,i) {\n                    series.disabled = !state.active[i];\n                });\n        }\n    };\n\n    function chart(selection) {\n        renderWatch.reset();\n        renderWatch.models(lines);\n        if (showXAxis) renderWatch.models(xAxis);\n        if (showYAxis) renderWatch.models(yAxis);\n        selection.each(function(data) {\n            var container = d3.select(this);\n            nv.utils.initSVG(container);\n            container.classed('nv-chart-' + id, true);\n            var that = this;\n\n            var availableWidth = nv.utils.availableWidth(width, container, margin),\n                availableHeight = nv.utils.availableHeight(height, container, margin);\n\n            chart.update = function() {\n                if (duration === 0)\n                    container.call(chart);\n                else\n                    container.transition().duration(duration).call(chart)\n            };\n            chart.container = this;\n\n            state\n                .setter(stateSetter(data), chart.update)\n                .getter(stateGetter(data))\n                .update();\n\n            // DEPRECATED set state.disableddisabled\n            state.disabled = data.map(function(d) { return !!d.disabled });\n\n            if (!defaultState) {\n                var key;\n                defaultState = {};\n                for (key in state) {\n                    if (state[key] instanceof Array)\n                        defaultState[key] = state[key].slice(0);\n                    else\n                        defaultState[key] = state[key];\n                }\n            }\n\n            var indexDrag = d3.behavior.drag()\n                .on('dragstart', dragStart)\n                .on('drag', dragMove)\n                .on('dragend', dragEnd);\n\n\n            function dragStart(d,i) {\n                d3.select(chart.container)\n                    .style('cursor', 'ew-resize');\n            }\n\n            function dragMove(d,i) {\n                index.x = d3.event.x;\n                index.i = Math.round(dx.invert(index.x));\n                updateZero();\n            }\n\n            function dragEnd(d,i) {\n                d3.select(chart.container)\n                    .style('cursor', 'auto');\n\n                // update state and send stateChange with new index\n                state.index = index.i;\n                dispatch.stateChange(state);\n            }\n\n            // Display No Data message if there's nothing to show.\n            if (!data || !data.length || !data.filter(function(d) { return d.values.length }).length) {\n                nv.utils.noData(chart, container)\n                return chart;\n            } else {\n                container.selectAll('.nv-noData').remove();\n            }\n\n            // Setup Scales\n            x = lines.xScale();\n            y = lines.yScale();\n\n            if (!rescaleY) {\n                var seriesDomains = data\n                    .filter(function(series) { return !series.disabled })\n                    .map(function(series,i) {\n                        var initialDomain = d3.extent(series.values, lines.y());\n\n                        //account for series being disabled when losing 95% or more\n                        if (initialDomain[0] < -.95) initialDomain[0] = -.95;\n\n                        return [\n                                (initialDomain[0] - initialDomain[1]) / (1 + initialDomain[1]),\n                                (initialDomain[1] - initialDomain[0]) / (1 + initialDomain[0])\n                        ];\n                    });\n\n                var completeDomain = [\n                    d3.min(seriesDomains, function(d) { return d[0] }),\n                    d3.max(seriesDomains, function(d) { return d[1] })\n                ];\n\n                lines.yDomain(completeDomain);\n            } else {\n                lines.yDomain(null);\n            }\n\n            dx.domain([0, data[0].values.length - 1]) //Assumes all series have same length\n                .range([0, availableWidth])\n                .clamp(true);\n\n            var data = indexify(index.i, data);\n\n            // Setup containers and skeleton of chart\n            var interactivePointerEvents = (useInteractiveGuideline) ? \"none\" : \"all\";\n            var wrap = container.selectAll('g.nv-wrap.nv-cumulativeLine').data([data]);\n            var gEnter = wrap.enter().append('g').attr('class', 'nvd3 nv-wrap nv-cumulativeLine').append('g');\n            var g = wrap.select('g');\n\n            gEnter.append('g').attr('class', 'nv-interactive');\n            gEnter.append('g').attr('class', 'nv-x nv-axis').style(\"pointer-events\",\"none\");\n            gEnter.append('g').attr('class', 'nv-y nv-axis');\n            gEnter.append('g').attr('class', 'nv-background');\n            gEnter.append('g').attr('class', 'nv-linesWrap').style(\"pointer-events\",interactivePointerEvents);\n            gEnter.append('g').attr('class', 'nv-avgLinesWrap').style(\"pointer-events\",\"none\");\n            gEnter.append('g').attr('class', 'nv-legendWrap');\n            gEnter.append('g').attr('class', 'nv-controlsWrap');\n\n            // Legend\n            if (showLegend) {\n                legend.width(availableWidth);\n\n                g.select('.nv-legendWrap')\n                    .datum(data)\n                    .call(legend);\n\n                if ( margin.top != legend.height()) {\n                    margin.top = legend.height();\n                    availableHeight = nv.utils.availableHeight(height, container, margin);\n                }\n\n                g.select('.nv-legendWrap')\n                    .attr('transform', 'translate(0,' + (-margin.top) +')')\n            }\n\n            // Controls\n            if (showControls) {\n                var controlsData = [\n                    { key: 'Re-scale y-axis', disabled: !rescaleY }\n                ];\n\n                controls\n                    .width(140)\n                    .color(['#444', '#444', '#444'])\n                    .rightAlign(false)\n                    .margin({top: 5, right: 0, bottom: 5, left: 20})\n                ;\n\n                g.select('.nv-controlsWrap')\n                    .datum(controlsData)\n                    .attr('transform', 'translate(0,' + (-margin.top) +')')\n                    .call(controls);\n            }\n\n            wrap.attr('transform', 'translate(' + margin.left + ',' + margin.top + ')');\n\n            if (rightAlignYAxis) {\n                g.select(\".nv-y.nv-axis\")\n                    .attr(\"transform\", \"translate(\" + availableWidth + \",0)\");\n            }\n\n            // Show error if series goes below 100%\n            var tempDisabled = data.filter(function(d) { return d.tempDisabled });\n\n            wrap.select('.tempDisabled').remove(); //clean-up and prevent duplicates\n            if (tempDisabled.length) {\n                wrap.append('text').attr('class', 'tempDisabled')\n                    .attr('x', availableWidth / 2)\n                    .attr('y', '-.71em')\n                    .style('text-anchor', 'end')\n                    .text(tempDisabled.map(function(d) { return d.key }).join(', ') + ' values cannot be calculated for this time period.');\n            }\n\n            //Set up interactive layer\n            if (useInteractiveGuideline) {\n                interactiveLayer\n                    .width(availableWidth)\n                    .height(availableHeight)\n                    .margin({left:margin.left,top:margin.top})\n                    .svgContainer(container)\n                    .xScale(x);\n                wrap.select(\".nv-interactive\").call(interactiveLayer);\n            }\n\n            gEnter.select('.nv-background')\n                .append('rect');\n\n            g.select('.nv-background rect')\n                .attr('width', availableWidth)\n                .attr('height', availableHeight);\n\n            lines\n                //.x(function(d) { return d.x })\n                .y(function(d) { return d.display.y })\n                .width(availableWidth)\n                .height(availableHeight)\n                .color(data.map(function(d,i) {\n                    return d.color || color(d, i);\n                }).filter(function(d,i) { return !data[i].disabled && !data[i].tempDisabled; }));\n\n            var linesWrap = g.select('.nv-linesWrap')\n                .datum(data.filter(function(d) { return  !d.disabled && !d.tempDisabled }));\n\n            linesWrap.call(lines);\n\n            //Store a series index number in the data array.\n            data.forEach(function(d,i) {\n                d.seriesIndex = i;\n            });\n\n            var avgLineData = data.filter(function(d) {\n                return !d.disabled && !!average(d);\n            });\n\n            var avgLines = g.select(\".nv-avgLinesWrap\").selectAll(\"line\")\n                .data(avgLineData, function(d) { return d.key; });\n\n            var getAvgLineY = function(d) {\n                //If average lines go off the svg element, clamp them to the svg bounds.\n                var yVal = y(average(d));\n                if (yVal < 0) return 0;\n                if (yVal > availableHeight) return availableHeight;\n                return yVal;\n            };\n\n            avgLines.enter()\n                .append('line')\n                .style('stroke-width',2)\n                .style('stroke-dasharray','10,10')\n                .style('stroke',function (d,i) {\n                    return lines.color()(d,d.seriesIndex);\n                })\n                .attr('x1',0)\n                .attr('x2',availableWidth)\n                .attr('y1', getAvgLineY)\n                .attr('y2', getAvgLineY);\n\n            avgLines\n                .style('stroke-opacity',function(d){\n                    //If average lines go offscreen, make them transparent\n                    var yVal = y(average(d));\n                    if (yVal < 0 || yVal > availableHeight) return 0;\n                    return 1;\n                })\n                .attr('x1',0)\n                .attr('x2',availableWidth)\n                .attr('y1', getAvgLineY)\n                .attr('y2', getAvgLineY);\n\n            avgLines.exit().remove();\n\n            //Create index line\n            var indexLine = linesWrap.selectAll('.nv-indexLine')\n                .data([index]);\n            indexLine.enter().append('rect').attr('class', 'nv-indexLine')\n                .attr('width', 3)\n                .attr('x', -2)\n                .attr('fill', 'red')\n                .attr('fill-opacity', .5)\n                .style(\"pointer-events\",\"all\")\n                .call(indexDrag);\n\n            indexLine\n                .attr('transform', function(d) { return 'translate(' + dx(d.i) + ',0)' })\n                .attr('height', availableHeight);\n\n            // Setup Axes\n            if (showXAxis) {\n                xAxis\n                    .scale(x)\n                    ._ticks( nv.utils.calcTicksX(availableWidth/70, data) )\n                    .tickSize(-availableHeight, 0);\n\n                g.select('.nv-x.nv-axis')\n                    .attr('transform', 'translate(0,' + y.range()[0] + ')');\n                g.select('.nv-x.nv-axis')\n                    .call(xAxis);\n            }\n\n            if (showYAxis) {\n                yAxis\n                    .scale(y)\n                    ._ticks( nv.utils.calcTicksY(availableHeight/36, data) )\n                    .tickSize( -availableWidth, 0);\n\n                g.select('.nv-y.nv-axis')\n                    .call(yAxis);\n            }\n\n            //============================================================\n            // Event Handling/Dispatching (in chart's scope)\n            //------------------------------------------------------------\n\n            function updateZero() {\n                indexLine\n                    .data([index]);\n\n                //When dragging the index line, turn off line transitions.\n                // Then turn them back on when done dragging.\n                var oldDuration = chart.duration();\n                chart.duration(0);\n                chart.update();\n                chart.duration(oldDuration);\n            }\n\n            g.select('.nv-background rect')\n                .on('click', function() {\n                    index.x = d3.mouse(this)[0];\n                    index.i = Math.round(dx.invert(index.x));\n\n                    // update state and send stateChange with new index\n                    state.index = index.i;\n                    dispatch.stateChange(state);\n\n                    updateZero();\n                });\n\n            lines.dispatch.on('elementClick', function(e) {\n                index.i = e.pointIndex;\n                index.x = dx(index.i);\n\n                // update state and send stateChange with new index\n                state.index = index.i;\n                dispatch.stateChange(state);\n\n                updateZero();\n            });\n\n            controls.dispatch.on('legendClick', function(d,i) {\n                d.disabled = !d.disabled;\n                rescaleY = !d.disabled;\n\n                state.rescaleY = rescaleY;\n                dispatch.stateChange(state);\n                chart.update();\n            });\n\n            legend.dispatch.on('stateChange', function(newState) {\n                for (var key in newState)\n                    state[key] = newState[key];\n                dispatch.stateChange(state);\n                chart.update();\n            });\n\n            interactiveLayer.dispatch.on('elementMousemove', function(e) {\n                lines.clearHighlights();\n                var singlePoint, pointIndex, pointXLocation, allData = [];\n\n                data\n                    .filter(function(series, i) {\n                        series.seriesIndex = i;\n                        return !series.disabled;\n                    })\n                    .forEach(function(series,i) {\n                        pointIndex = nv.interactiveBisect(series.values, e.pointXValue, chart.x());\n                        lines.highlightPoint(i, pointIndex, true);\n                        var point = series.values[pointIndex];\n                        if (typeof point === 'undefined') return;\n                        if (typeof singlePoint === 'undefined') singlePoint = point;\n                        if (typeof pointXLocation === 'undefined') pointXLocation = chart.xScale()(chart.x()(point,pointIndex));\n                        allData.push({\n                            key: series.key,\n                            value: chart.y()(point, pointIndex),\n                            color: color(series,series.seriesIndex)\n                        });\n                    });\n\n                //Highlight the tooltip entry based on which point the mouse is closest to.\n                if (allData.length > 2) {\n                    var yValue = chart.yScale().invert(e.mouseY);\n                    var domainExtent = Math.abs(chart.yScale().domain()[0] - chart.yScale().domain()[1]);\n                    var threshold = 0.03 * domainExtent;\n                    var indexToHighlight = nv.nearestValueIndex(allData.map(function(d){return d.value}),yValue,threshold);\n                    if (indexToHighlight !== null)\n                        allData[indexToHighlight].highlight = true;\n                }\n\n                var xValue = xAxis.tickFormat()(chart.x()(singlePoint,pointIndex), pointIndex);\n                interactiveLayer.tooltip\n                    .position({left: pointXLocation + margin.left, top: e.mouseY + margin.top})\n                    .chartContainer(that.parentNode)\n                    .valueFormatter(function(d,i) {\n                        return yAxis.tickFormat()(d);\n                    })\n                    .data(\n                    {\n                        value: xValue,\n                        series: allData\n                    }\n                )();\n\n                interactiveLayer.renderGuideLine(pointXLocation);\n            });\n\n            interactiveLayer.dispatch.on(\"elementMouseout\",function(e) {\n                lines.clearHighlights();\n            });\n\n            // Update chart from a state object passed to event handler\n            dispatch.on('changeState', function(e) {\n                if (typeof e.disabled !== 'undefined') {\n                    data.forEach(function(series,i) {\n                        series.disabled = e.disabled[i];\n                    });\n\n                    state.disabled = e.disabled;\n                }\n\n                if (typeof e.index !== 'undefined') {\n                    index.i = e.index;\n                    index.x = dx(index.i);\n\n                    state.index = e.index;\n\n                    indexLine\n                        .data([index]);\n                }\n\n                if (typeof e.rescaleY !== 'undefined') {\n                    rescaleY = e.rescaleY;\n                }\n\n                chart.update();\n            });\n\n        });\n\n        renderWatch.renderEnd('cumulativeLineChart immediate');\n\n        return chart;\n    }\n\n    //============================================================\n    // Event Handling/Dispatching (out of chart's scope)\n    //------------------------------------------------------------\n\n    lines.dispatch.on('elementMouseover.tooltip', function(evt) {\n        var point = {\n            x: chart.x()(evt.point),\n            y: chart.y()(evt.point),\n            color: evt.point.color\n        };\n        evt.point = point;\n        tooltip.data(evt).position(evt.pos).hidden(false);\n    });\n\n    lines.dispatch.on('elementMouseout.tooltip', function(evt) {\n        tooltip.hidden(true)\n    });\n\n    //============================================================\n    // Functions\n    //------------------------------------------------------------\n\n    var indexifyYGetter = null;\n    /* Normalize the data according to an index point. */\n    function indexify(idx, data) {\n        if (!indexifyYGetter) indexifyYGetter = lines.y();\n        return data.map(function(line, i) {\n            if (!line.values) {\n                return line;\n            }\n            var indexValue = line.values[idx];\n            if (indexValue == null) {\n                return line;\n            }\n            var v = indexifyYGetter(indexValue, idx);\n\n            //TODO: implement check below, and disable series if series loses 100% or more cause divide by 0 issue\n            if (v < -.95 && !noErrorCheck) {\n                //if a series loses more than 100%, calculations fail.. anything close can cause major distortion (but is mathematically correct till it hits 100)\n\n                line.tempDisabled = true;\n                return line;\n            }\n\n            line.tempDisabled = false;\n\n            line.values = line.values.map(function(point, pointIndex) {\n                point.display = {'y': (indexifyYGetter(point, pointIndex) - v) / (1 + v) };\n                return point;\n            });\n\n            return line;\n        })\n    }\n\n    //============================================================\n    // Expose Public Variables\n    //------------------------------------------------------------\n\n    // expose chart's sub-components\n    chart.dispatch = dispatch;\n    chart.lines = lines;\n    chart.legend = legend;\n    chart.controls = controls;\n    chart.xAxis = xAxis;\n    chart.yAxis = yAxis;\n    chart.interactiveLayer = interactiveLayer;\n    chart.state = state;\n    chart.tooltip = tooltip;\n\n    chart.options = nv.utils.optionsFunc.bind(chart);\n\n    chart._options = Object.create({}, {\n        // simple options, just get/set the necessary values\n        width:      {get: function(){return width;}, set: function(_){width=_;}},\n        height:     {get: function(){return height;}, set: function(_){height=_;}},\n        rescaleY:     {get: function(){return rescaleY;}, set: function(_){rescaleY=_;}},\n        showControls:     {get: function(){return showControls;}, set: function(_){showControls=_;}},\n        showLegend: {get: function(){return showLegend;}, set: function(_){showLegend=_;}},\n        average: {get: function(){return average;}, set: function(_){average=_;}},\n        defaultState:    {get: function(){return defaultState;}, set: function(_){defaultState=_;}},\n        noData:    {get: function(){return noData;}, set: function(_){noData=_;}},\n        showXAxis:    {get: function(){return showXAxis;}, set: function(_){showXAxis=_;}},\n        showYAxis:    {get: function(){return showYAxis;}, set: function(_){showYAxis=_;}},\n        noErrorCheck:    {get: function(){return noErrorCheck;}, set: function(_){noErrorCheck=_;}},\n\n        // deprecated options\n        tooltips:    {get: function(){return tooltip.enabled();}, set: function(_){\n            // deprecated after 1.7.1\n            nv.deprecated('tooltips', 'use chart.tooltip.enabled() instead');\n            tooltip.enabled(!!_);\n        }},\n        tooltipContent:    {get: function(){return tooltip.contentGenerator();}, set: function(_){\n            // deprecated after 1.7.1\n            nv.deprecated('tooltipContent', 'use chart.tooltip.contentGenerator() instead');\n            tooltip.contentGenerator(_);\n        }},\n\n        // options that require extra logic in the setter\n        margin: {get: function(){return margin;}, set: function(_){\n            margin.top    = _.top    !== undefined ? _.top    : margin.top;\n            margin.right  = _.right  !== undefined ? _.right  : margin.right;\n            margin.bottom = _.bottom !== undefined ? _.bottom : margin.bottom;\n            margin.left   = _.left   !== undefined ? _.left   : margin.left;\n        }},\n        color:  {get: function(){return color;}, set: function(_){\n            color = nv.utils.getColor(_);\n            legend.color(color);\n        }},\n        useInteractiveGuideline: {get: function(){return useInteractiveGuideline;}, set: function(_){\n            useInteractiveGuideline = _;\n            if (_ === true) {\n                chart.interactive(false);\n                chart.useVoronoi(false);\n            }\n        }},\n        rightAlignYAxis: {get: function(){return rightAlignYAxis;}, set: function(_){\n            rightAlignYAxis = _;\n            yAxis.orient( (_) ? 'right' : 'left');\n        }},\n        duration:    {get: function(){return duration;}, set: function(_){\n            duration = _;\n            lines.duration(duration);\n            xAxis.duration(duration);\n            yAxis.duration(duration);\n            renderWatch.reset(duration);\n        }}\n    });\n\n    nv.utils.inheritOptions(chart, lines);\n    nv.utils.initOptions(chart);\n\n    return chart;\n};\n//TODO: consider deprecating by adding necessary features to multiBar model\nnv.models.discreteBar = function() {\n    \"use strict\";\n\n    //============================================================\n    // Public Variables with Default Settings\n    //------------------------------------------------------------\n\n    var margin = {top: 0, right: 0, bottom: 0, left: 0}\n        , width = 960\n        , height = 500\n        , id = Math.floor(Math.random() * 10000) //Create semi-unique ID in case user doesn't select one\n        , container\n        , x = d3.scale.ordinal()\n        , y = d3.scale.linear()\n        , getX = function(d) { return d.x }\n        , getY = function(d) { return d.y }\n        , forceY = [0] // 0 is forced by default.. this makes sense for the majority of bar graphs... user can always do chart.forceY([]) to remove\n        , color = nv.utils.defaultColor()\n        , showValues = false\n        , valueFormat = d3.format(',.2f')\n        , xDomain\n        , yDomain\n        , xRange\n        , yRange\n        , dispatch = d3.dispatch('chartClick', 'elementClick', 'elementDblClick', 'elementMouseover', 'elementMouseout', 'elementMousemove', 'renderEnd')\n        , rectClass = 'discreteBar'\n        , duration = 250\n        ;\n\n    //============================================================\n    // Private Variables\n    //------------------------------------------------------------\n\n    var x0, y0;\n    var renderWatch = nv.utils.renderWatch(dispatch, duration);\n\n    function chart(selection) {\n        renderWatch.reset();\n        selection.each(function(data) {\n            var availableWidth = width - margin.left - margin.right,\n                availableHeight = height - margin.top - margin.bottom;\n\n            container = d3.select(this);\n            nv.utils.initSVG(container);\n\n            //add series index to each data point for reference\n            data.forEach(function(series, i) {\n                series.values.forEach(function(point) {\n                    point.series = i;\n                });\n            });\n\n            // Setup Scales\n            // remap and flatten the data for use in calculating the scales' domains\n            var seriesData = (xDomain && yDomain) ? [] : // if we know xDomain and yDomain, no need to calculate\n                data.map(function(d) {\n                    return d.values.map(function(d,i) {\n                        return { x: getX(d,i), y: getY(d,i), y0: d.y0 }\n                    })\n                });\n\n            x   .domain(xDomain || d3.merge(seriesData).map(function(d) { return d.x }))\n                .rangeBands(xRange || [0, availableWidth], .1);\n            y   .domain(yDomain || d3.extent(d3.merge(seriesData).map(function(d) { return d.y }).concat(forceY)));\n\n            // If showValues, pad the Y axis range to account for label height\n            if (showValues) y.range(yRange || [availableHeight - (y.domain()[0] < 0 ? 12 : 0), y.domain()[1] > 0 ? 12 : 0]);\n            else y.range(yRange || [availableHeight, 0]);\n\n            //store old scales if they exist\n            x0 = x0 || x;\n            y0 = y0 || y.copy().range([y(0),y(0)]);\n\n            // Setup containers and skeleton of chart\n            var wrap = container.selectAll('g.nv-wrap.nv-discretebar').data([data]);\n            var wrapEnter = wrap.enter().append('g').attr('class', 'nvd3 nv-wrap nv-discretebar');\n            var gEnter = wrapEnter.append('g');\n            var g = wrap.select('g');\n\n            gEnter.append('g').attr('class', 'nv-groups');\n            wrap.attr('transform', 'translate(' + margin.left + ',' + margin.top + ')');\n\n            //TODO: by definition, the discrete bar should not have multiple groups, will modify/remove later\n            var groups = wrap.select('.nv-groups').selectAll('.nv-group')\n                .data(function(d) { return d }, function(d) { return d.key });\n            groups.enter().append('g')\n                .style('stroke-opacity', 1e-6)\n                .style('fill-opacity', 1e-6);\n            groups.exit()\n                .watchTransition(renderWatch, 'discreteBar: exit groups')\n                .style('stroke-opacity', 1e-6)\n                .style('fill-opacity', 1e-6)\n                .remove();\n            groups\n                .attr('class', function(d,i) { return 'nv-group nv-series-' + i })\n                .classed('hover', function(d) { return d.hover });\n            groups\n                .watchTransition(renderWatch, 'discreteBar: groups')\n                .style('stroke-opacity', 1)\n                .style('fill-opacity', .75);\n\n            var bars = groups.selectAll('g.nv-bar')\n                .data(function(d) { return d.values });\n            bars.exit().remove();\n\n            var barsEnter = bars.enter().append('g')\n                .attr('transform', function(d,i,j) {\n                    return 'translate(' + (x(getX(d,i)) + x.rangeBand() * .05 ) + ', ' + y(0) + ')'\n                })\n                .on('mouseover', function(d,i) { //TODO: figure out why j works above, but not here\n                    d3.select(this).classed('hover', true);\n                    dispatch.elementMouseover({\n                        data: d,\n                        index: i,\n                        color: d3.select(this).style(\"fill\")\n                    });\n                })\n                .on('mouseout', function(d,i) {\n                    d3.select(this).classed('hover', false);\n                    dispatch.elementMouseout({\n                        data: d,\n                        index: i,\n                        color: d3.select(this).style(\"fill\")\n                    });\n                })\n                .on('mousemove', function(d,i) {\n                    dispatch.elementMousemove({\n                        data: d,\n                        index: i,\n                        color: d3.select(this).style(\"fill\")\n                    });\n                })\n                .on('click', function(d,i) {\n                    dispatch.elementClick({\n                        data: d,\n                        index: i,\n                        color: d3.select(this).style(\"fill\")\n                    });\n                    d3.event.stopPropagation();\n                })\n                .on('dblclick', function(d,i) {\n                    dispatch.elementDblClick({\n                        data: d,\n                        index: i,\n                        color: d3.select(this).style(\"fill\")\n                    });\n                    d3.event.stopPropagation();\n                });\n\n            barsEnter.append('rect')\n                .attr('height', 0)\n                .attr('width', x.rangeBand() * .9 / data.length )\n\n            if (showValues) {\n                barsEnter.append('text')\n                    .attr('text-anchor', 'middle')\n                ;\n\n                bars.select('text')\n                    .text(function(d,i) { return valueFormat(getY(d,i)) })\n                    .watchTransition(renderWatch, 'discreteBar: bars text')\n                    .attr('x', x.rangeBand() * .9 / 2)\n                    .attr('y', function(d,i) { return getY(d,i) < 0 ? y(getY(d,i)) - y(0) + 12 : -4 })\n\n                ;\n            } else {\n                bars.selectAll('text').remove();\n            }\n\n            bars\n                .attr('class', function(d,i) { return getY(d,i) < 0 ? 'nv-bar negative' : 'nv-bar positive' })\n                .style('fill', function(d,i) { return d.color || color(d,i) })\n                .style('stroke', function(d,i) { return d.color || color(d,i) })\n                .select('rect')\n                .attr('class', rectClass)\n                .watchTransition(renderWatch, 'discreteBar: bars rect')\n                .attr('width', x.rangeBand() * .9 / data.length);\n            bars.watchTransition(renderWatch, 'discreteBar: bars')\n                //.delay(function(d,i) { return i * 1200 / data[0].values.length })\n                .attr('transform', function(d,i) {\n                    var left = x(getX(d,i)) + x.rangeBand() * .05,\n                        top = getY(d,i) < 0 ?\n                            y(0) :\n                                y(0) - y(getY(d,i)) < 1 ?\n                            y(0) - 1 : //make 1 px positive bars show up above y=0\n                            y(getY(d,i));\n\n                    return 'translate(' + left + ', ' + top + ')'\n                })\n                .select('rect')\n                .attr('height', function(d,i) {\n                    return  Math.max(Math.abs(y(getY(d,i)) - y((yDomain && yDomain[0]) || 0)) || 1)\n                });\n\n\n            //store old scales for use in transitions on update\n            x0 = x.copy();\n            y0 = y.copy();\n\n        });\n\n        renderWatch.renderEnd('discreteBar immediate');\n        return chart;\n    }\n\n    //============================================================\n    // Expose Public Variables\n    //------------------------------------------------------------\n\n    chart.dispatch = dispatch;\n    chart.options = nv.utils.optionsFunc.bind(chart);\n\n    chart._options = Object.create({}, {\n        // simple options, just get/set the necessary values\n        width:   {get: function(){return width;}, set: function(_){width=_;}},\n        height:  {get: function(){return height;}, set: function(_){height=_;}},\n        forceY:  {get: function(){return forceY;}, set: function(_){forceY=_;}},\n        showValues: {get: function(){return showValues;}, set: function(_){showValues=_;}},\n        x:       {get: function(){return getX;}, set: function(_){getX=_;}},\n        y:       {get: function(){return getY;}, set: function(_){getY=_;}},\n        xScale:  {get: function(){return x;}, set: function(_){x=_;}},\n        yScale:  {get: function(){return y;}, set: function(_){y=_;}},\n        xDomain: {get: function(){return xDomain;}, set: function(_){xDomain=_;}},\n        yDomain: {get: function(){return yDomain;}, set: function(_){yDomain=_;}},\n        xRange:  {get: function(){return xRange;}, set: function(_){xRange=_;}},\n        yRange:  {get: function(){return yRange;}, set: function(_){yRange=_;}},\n        valueFormat:    {get: function(){return valueFormat;}, set: function(_){valueFormat=_;}},\n        id:          {get: function(){return id;}, set: function(_){id=_;}},\n        rectClass: {get: function(){return rectClass;}, set: function(_){rectClass=_;}},\n\n        // options that require extra logic in the setter\n        margin: {get: function(){return margin;}, set: function(_){\n            margin.top    = _.top    !== undefined ? _.top    : margin.top;\n            margin.right  = _.right  !== undefined ? _.right  : margin.right;\n            margin.bottom = _.bottom !== undefined ? _.bottom : margin.bottom;\n            margin.left   = _.left   !== undefined ? _.left   : margin.left;\n        }},\n        color:  {get: function(){return color;}, set: function(_){\n            color = nv.utils.getColor(_);\n        }},\n        duration: {get: function(){return duration;}, set: function(_){\n            duration = _;\n            renderWatch.reset(duration);\n        }}\n    });\n\n    nv.utils.initOptions(chart);\n\n    return chart;\n};\n\nnv.models.discreteBarChart = function() {\n    \"use strict\";\n\n    //============================================================\n    // Public Variables with Default Settings\n    //------------------------------------------------------------\n\n    var discretebar = nv.models.discreteBar()\n        , xAxis = nv.models.axis()\n        , yAxis = nv.models.axis()\n        , tooltip = nv.models.tooltip()\n        ;\n\n    var margin = {top: 15, right: 10, bottom: 50, left: 60}\n        , width = null\n        , height = null\n        , color = nv.utils.getColor()\n        , showXAxis = true\n        , showYAxis = true\n        , rightAlignYAxis = false\n        , staggerLabels = false\n        , x\n        , y\n        , noData = null\n        , dispatch = d3.dispatch('beforeUpdate','renderEnd')\n        , duration = 250\n        ;\n\n    xAxis\n        .orient('bottom')\n        .showMaxMin(false)\n        .tickFormat(function(d) { return d })\n    ;\n    yAxis\n        .orient((rightAlignYAxis) ? 'right' : 'left')\n        .tickFormat(d3.format(',.1f'))\n    ;\n\n    tooltip\n        .duration(0)\n        .headerEnabled(false)\n        .valueFormatter(function(d, i) {\n            return yAxis.tickFormat()(d, i);\n        })\n        .keyFormatter(function(d, i) {\n            return xAxis.tickFormat()(d, i);\n        });\n\n    //============================================================\n    // Private Variables\n    //------------------------------------------------------------\n\n    var renderWatch = nv.utils.renderWatch(dispatch, duration);\n\n    function chart(selection) {\n        renderWatch.reset();\n        renderWatch.models(discretebar);\n        if (showXAxis) renderWatch.models(xAxis);\n        if (showYAxis) renderWatch.models(yAxis);\n\n        selection.each(function(data) {\n            var container = d3.select(this),\n                that = this;\n            nv.utils.initSVG(container);\n            var availableWidth = nv.utils.availableWidth(width, container, margin),\n                availableHeight = nv.utils.availableHeight(height, container, margin);\n\n            chart.update = function() {\n                dispatch.beforeUpdate();\n                container.transition().duration(duration).call(chart);\n            };\n            chart.container = this;\n\n            // Display No Data message if there's nothing to show.\n            if (!data || !data.length || !data.filter(function(d) { return d.values.length }).length) {\n                nv.utils.noData(chart, container);\n                return chart;\n            } else {\n                container.selectAll('.nv-noData').remove();\n            }\n\n            // Setup Scales\n            x = discretebar.xScale();\n            y = discretebar.yScale().clamp(true);\n\n            // Setup containers and skeleton of chart\n            var wrap = container.selectAll('g.nv-wrap.nv-discreteBarWithAxes').data([data]);\n            var gEnter = wrap.enter().append('g').attr('class', 'nvd3 nv-wrap nv-discreteBarWithAxes').append('g');\n            var defsEnter = gEnter.append('defs');\n            var g = wrap.select('g');\n\n            gEnter.append('g').attr('class', 'nv-x nv-axis');\n            gEnter.append('g').attr('class', 'nv-y nv-axis')\n                .append('g').attr('class', 'nv-zeroLine')\n                .append('line');\n\n            gEnter.append('g').attr('class', 'nv-barsWrap');\n\n            g.attr('transform', 'translate(' + margin.left + ',' + margin.top + ')');\n\n            if (rightAlignYAxis) {\n                g.select(\".nv-y.nv-axis\")\n                    .attr(\"transform\", \"translate(\" + availableWidth + \",0)\");\n            }\n\n            // Main Chart Component(s)\n            discretebar\n                .width(availableWidth)\n                .height(availableHeight);\n\n            var barsWrap = g.select('.nv-barsWrap')\n                .datum(data.filter(function(d) { return !d.disabled }));\n\n            barsWrap.transition().call(discretebar);\n\n\n            defsEnter.append('clipPath')\n                .attr('id', 'nv-x-label-clip-' + discretebar.id())\n                .append('rect');\n\n            g.select('#nv-x-label-clip-' + discretebar.id() + ' rect')\n                .attr('width', x.rangeBand() * (staggerLabels ? 2 : 1))\n                .attr('height', 16)\n                .attr('x', -x.rangeBand() / (staggerLabels ? 1 : 2 ));\n\n            // Setup Axes\n            if (showXAxis) {\n                xAxis\n                    .scale(x)\n                    ._ticks( nv.utils.calcTicksX(availableWidth/100, data) )\n                    .tickSize(-availableHeight, 0);\n\n                g.select('.nv-x.nv-axis')\n                    .attr('transform', 'translate(0,' + (y.range()[0] + ((discretebar.showValues() && y.domain()[0] < 0) ? 16 : 0)) + ')');\n                g.select('.nv-x.nv-axis').call(xAxis);\n\n                var xTicks = g.select('.nv-x.nv-axis').selectAll('g');\n                if (staggerLabels) {\n                    xTicks\n                        .selectAll('text')\n                        .attr('transform', function(d,i,j) { return 'translate(0,' + (j % 2 == 0 ? '5' : '17') + ')' })\n                }\n            }\n\n            if (showYAxis) {\n                yAxis\n                    .scale(y)\n                    ._ticks( nv.utils.calcTicksY(availableHeight/36, data) )\n                    .tickSize( -availableWidth, 0);\n\n                g.select('.nv-y.nv-axis').call(yAxis);\n            }\n\n            // Zero line\n            g.select(\".nv-zeroLine line\")\n                .attr(\"x1\",0)\n                .attr(\"x2\",availableWidth)\n                .attr(\"y1\", y(0))\n                .attr(\"y2\", y(0))\n            ;\n        });\n\n        renderWatch.renderEnd('discreteBar chart immediate');\n        return chart;\n    }\n\n    //============================================================\n    // Event Handling/Dispatching (out of chart's scope)\n    //------------------------------------------------------------\n\n    discretebar.dispatch.on('elementMouseover.tooltip', function(evt) {\n        evt['series'] = {\n            key: chart.x()(evt.data),\n            value: chart.y()(evt.data),\n            color: evt.color\n        };\n        tooltip.data(evt).hidden(false);\n    });\n\n    discretebar.dispatch.on('elementMouseout.tooltip', function(evt) {\n        tooltip.hidden(true);\n    });\n\n    discretebar.dispatch.on('elementMousemove.tooltip', function(evt) {\n        tooltip.position({top: d3.event.pageY, left: d3.event.pageX})();\n    });\n\n    //============================================================\n    // Expose Public Variables\n    //------------------------------------------------------------\n\n    chart.dispatch = dispatch;\n    chart.discretebar = discretebar;\n    chart.xAxis = xAxis;\n    chart.yAxis = yAxis;\n    chart.tooltip = tooltip;\n\n    chart.options = nv.utils.optionsFunc.bind(chart);\n\n    chart._options = Object.create({}, {\n        // simple options, just get/set the necessary values\n        width:      {get: function(){return width;}, set: function(_){width=_;}},\n        height:     {get: function(){return height;}, set: function(_){height=_;}},\n        staggerLabels: {get: function(){return staggerLabels;}, set: function(_){staggerLabels=_;}},\n        showXAxis: {get: function(){return showXAxis;}, set: function(_){showXAxis=_;}},\n        showYAxis: {get: function(){return showYAxis;}, set: function(_){showYAxis=_;}},\n        noData:    {get: function(){return noData;}, set: function(_){noData=_;}},\n\n        // deprecated options\n        tooltips:    {get: function(){return tooltip.enabled();}, set: function(_){\n            // deprecated after 1.7.1\n            nv.deprecated('tooltips', 'use chart.tooltip.enabled() instead');\n            tooltip.enabled(!!_);\n        }},\n        tooltipContent:    {get: function(){return tooltip.contentGenerator();}, set: function(_){\n            // deprecated after 1.7.1\n            nv.deprecated('tooltipContent', 'use chart.tooltip.contentGenerator() instead');\n            tooltip.contentGenerator(_);\n        }},\n\n        // options that require extra logic in the setter\n        margin: {get: function(){return margin;}, set: function(_){\n            margin.top    = _.top    !== undefined ? _.top    : margin.top;\n            margin.right  = _.right  !== undefined ? _.right  : margin.right;\n            margin.bottom = _.bottom !== undefined ? _.bottom : margin.bottom;\n            margin.left   = _.left   !== undefined ? _.left   : margin.left;\n        }},\n        duration: {get: function(){return duration;}, set: function(_){\n            duration = _;\n            renderWatch.reset(duration);\n            discretebar.duration(duration);\n            xAxis.duration(duration);\n            yAxis.duration(duration);\n        }},\n        color:  {get: function(){return color;}, set: function(_){\n            color = nv.utils.getColor(_);\n            discretebar.color(color);\n        }},\n        rightAlignYAxis: {get: function(){return rightAlignYAxis;}, set: function(_){\n            rightAlignYAxis = _;\n            yAxis.orient( (_) ? 'right' : 'left');\n        }}\n    });\n\n    nv.utils.inheritOptions(chart, discretebar);\n    nv.utils.initOptions(chart);\n\n    return chart;\n}\n\nnv.models.distribution = function() {\n    \"use strict\";\n    //============================================================\n    // Public Variables with Default Settings\n    //------------------------------------------------------------\n\n    var margin = {top: 0, right: 0, bottom: 0, left: 0}\n        , width = 400 //technically width or height depending on x or y....\n        , size = 8\n        , axis = 'x' // 'x' or 'y'... horizontal or vertical\n        , getData = function(d) { return d[axis] }  // defaults d.x or d.y\n        , color = nv.utils.defaultColor()\n        , scale = d3.scale.linear()\n        , domain\n        , duration = 250\n        , dispatch = d3.dispatch('renderEnd')\n        ;\n\n    //============================================================\n\n\n    //============================================================\n    // Private Variables\n    //------------------------------------------------------------\n\n    var scale0;\n    var renderWatch = nv.utils.renderWatch(dispatch, duration);\n\n    //============================================================\n\n\n    function chart(selection) {\n        renderWatch.reset();\n        selection.each(function(data) {\n            var availableLength = width - (axis === 'x' ? margin.left + margin.right : margin.top + margin.bottom),\n                naxis = axis == 'x' ? 'y' : 'x',\n                container = d3.select(this);\n            nv.utils.initSVG(container);\n\n            //------------------------------------------------------------\n            // Setup Scales\n\n            scale0 = scale0 || scale;\n\n            //------------------------------------------------------------\n\n\n            //------------------------------------------------------------\n            // Setup containers and skeleton of chart\n\n            var wrap = container.selectAll('g.nv-distribution').data([data]);\n            var wrapEnter = wrap.enter().append('g').attr('class', 'nvd3 nv-distribution');\n            var gEnter = wrapEnter.append('g');\n            var g = wrap.select('g');\n\n            wrap.attr('transform', 'translate(' + margin.left + ',' + margin.top + ')')\n\n            //------------------------------------------------------------\n\n\n            var distWrap = g.selectAll('g.nv-dist')\n                .data(function(d) { return d }, function(d) { return d.key });\n\n            distWrap.enter().append('g');\n            distWrap\n                .attr('class', function(d,i) { return 'nv-dist nv-series-' + i })\n                .style('stroke', function(d,i) { return color(d, i) });\n\n            var dist = distWrap.selectAll('line.nv-dist' + axis)\n                .data(function(d) { return d.values })\n            dist.enter().append('line')\n                .attr(axis + '1', function(d,i) { return scale0(getData(d,i)) })\n                .attr(axis + '2', function(d,i) { return scale0(getData(d,i)) })\n            renderWatch.transition(distWrap.exit().selectAll('line.nv-dist' + axis), 'dist exit')\n                // .transition()\n                .attr(axis + '1', function(d,i) { return scale(getData(d,i)) })\n                .attr(axis + '2', function(d,i) { return scale(getData(d,i)) })\n                .style('stroke-opacity', 0)\n                .remove();\n            dist\n                .attr('class', function(d,i) { return 'nv-dist' + axis + ' nv-dist' + axis + '-' + i })\n                .attr(naxis + '1', 0)\n                .attr(naxis + '2', size);\n            renderWatch.transition(dist, 'dist')\n                // .transition()\n                .attr(axis + '1', function(d,i) { return scale(getData(d,i)) })\n                .attr(axis + '2', function(d,i) { return scale(getData(d,i)) })\n\n\n            scale0 = scale.copy();\n\n        });\n        renderWatch.renderEnd('distribution immediate');\n        return chart;\n    }\n\n\n    //============================================================\n    // Expose Public Variables\n    //------------------------------------------------------------\n    chart.options = nv.utils.optionsFunc.bind(chart);\n    chart.dispatch = dispatch;\n\n    chart.margin = function(_) {\n        if (!arguments.length) return margin;\n        margin.top    = typeof _.top    != 'undefined' ? _.top    : margin.top;\n        margin.right  = typeof _.right  != 'undefined' ? _.right  : margin.right;\n        margin.bottom = typeof _.bottom != 'undefined' ? _.bottom : margin.bottom;\n        margin.left   = typeof _.left   != 'undefined' ? _.left   : margin.left;\n        return chart;\n    };\n\n    chart.width = function(_) {\n        if (!arguments.length) return width;\n        width = _;\n        return chart;\n    };\n\n    chart.axis = function(_) {\n        if (!arguments.length) return axis;\n        axis = _;\n        return chart;\n    };\n\n    chart.size = function(_) {\n        if (!arguments.length) return size;\n        size = _;\n        return chart;\n    };\n\n    chart.getData = function(_) {\n        if (!arguments.length) return getData;\n        getData = d3.functor(_);\n        return chart;\n    };\n\n    chart.scale = function(_) {\n        if (!arguments.length) return scale;\n        scale = _;\n        return chart;\n    };\n\n    chart.color = function(_) {\n        if (!arguments.length) return color;\n        color = nv.utils.getColor(_);\n        return chart;\n    };\n\n    chart.duration = function(_) {\n        if (!arguments.length) return duration;\n        duration = _;\n        renderWatch.reset(duration);\n        return chart;\n    };\n    //============================================================\n\n\n    return chart;\n}\nnv.models.furiousLegend = function() {\n    \"use strict\";\n\n    //============================================================\n    // Public Variables with Default Settings\n    //------------------------------------------------------------\n\n    var margin = {top: 5, right: 0, bottom: 5, left: 0}\n        , width = 400\n        , height = 20\n        , getKey = function(d) { return d.key }\n        , color = nv.utils.getColor()\n        , align = true\n        , padding = 28 //define how much space between legend items. - recommend 32 for furious version\n        , rightAlign = true\n        , updateState = true   //If true, legend will update data.disabled and trigger a 'stateChange' dispatch.\n        , radioButtonMode = false   //If true, clicking legend items will cause it to behave like a radio button. (only one can be selected at a time)\n        , expanded = false\n        , dispatch = d3.dispatch('legendClick', 'legendDblclick', 'legendMouseover', 'legendMouseout', 'stateChange')\n        , vers = 'classic' //Options are \"classic\" and \"furious\"\n        ;\n\n    function chart(selection) {\n        selection.each(function(data) {\n            var availableWidth = width - margin.left - margin.right,\n                container = d3.select(this);\n            nv.utils.initSVG(container);\n\n            // Setup containers and skeleton of chart\n            var wrap = container.selectAll('g.nv-legend').data([data]);\n            var gEnter = wrap.enter().append('g').attr('class', 'nvd3 nv-legend').append('g');\n            var g = wrap.select('g');\n\n            wrap.attr('transform', 'translate(' + margin.left + ',' + margin.top + ')');\n\n            var series = g.selectAll('.nv-series')\n                .data(function(d) {\n                    if(vers != 'furious') return d;\n\n                    return d.filter(function(n) {\n                        return expanded ? true : !n.disengaged;\n                    });\n                });\n            var seriesEnter = series.enter().append('g').attr('class', 'nv-series')\n\n            var seriesShape;\n\n            if(vers == 'classic') {\n                seriesEnter.append('circle')\n                    .style('stroke-width', 2)\n                    .attr('class','nv-legend-symbol')\n                    .attr('r', 5);\n\n                seriesShape = series.select('circle');\n            } else if (vers == 'furious') {\n                seriesEnter.append('rect')\n                    .style('stroke-width', 2)\n                    .attr('class','nv-legend-symbol')\n                    .attr('rx', 3)\n                    .attr('ry', 3);\n\n                seriesShape = series.select('rect');\n\n                seriesEnter.append('g')\n                    .attr('class', 'nv-check-box')\n                    .property('innerHTML','<path d=\"M0.5,5 L22.5,5 L22.5,26.5 L0.5,26.5 L0.5,5 Z\" class=\"nv-box\"></path><path d=\"M5.5,12.8618467 L11.9185089,19.2803556 L31,0.198864511\" class=\"nv-check\"></path>')\n                    .attr('transform', 'translate(-10,-8)scale(0.5)');\n\n                var seriesCheckbox = series.select('.nv-check-box');\n\n                seriesCheckbox.each(function(d,i) {\n                    d3.select(this).selectAll('path')\n                        .attr('stroke', setTextColor(d,i));\n                });\n            }\n\n            seriesEnter.append('text')\n                .attr('text-anchor', 'start')\n                .attr('class','nv-legend-text')\n                .attr('dy', '.32em')\n                .attr('dx', '8');\n\n            var seriesText = series.select('text.nv-legend-text');\n\n            series\n                .on('mouseover', function(d,i) {\n                    dispatch.legendMouseover(d,i);  //TODO: Make consistent with other event objects\n                })\n                .on('mouseout', function(d,i) {\n                    dispatch.legendMouseout(d,i);\n                })\n                .on('click', function(d,i) {\n                    dispatch.legendClick(d,i);\n                    // make sure we re-get data in case it was modified\n                    var data = series.data();\n                    if (updateState) {\n                        if(vers =='classic') {\n                            if (radioButtonMode) {\n                                //Radio button mode: set every series to disabled,\n                                //  and enable the clicked series.\n                                data.forEach(function(series) { series.disabled = true});\n                                d.disabled = false;\n                            }\n                            else {\n                                d.disabled = !d.disabled;\n                                if (data.every(function(series) { return series.disabled})) {\n                                    //the default behavior of NVD3 legends is, if every single series\n                                    // is disabled, turn all series' back on.\n                                    data.forEach(function(series) { series.disabled = false});\n                                }\n                            }\n                        } else if(vers == 'furious') {\n                            if(expanded) {\n                                d.disengaged = !d.disengaged;\n                                d.userDisabled = d.userDisabled == undefined ? !!d.disabled : d.userDisabled;\n                                d.disabled = d.disengaged || d.userDisabled;\n                            } else if (!expanded) {\n                                d.disabled = !d.disabled;\n                                d.userDisabled = d.disabled;\n                                var engaged = data.filter(function(d) { return !d.disengaged; });\n                                if (engaged.every(function(series) { return series.userDisabled })) {\n                                    //the default behavior of NVD3 legends is, if every single series\n                                    // is disabled, turn all series' back on.\n                                    data.forEach(function(series) {\n                                        series.disabled = series.userDisabled = false;\n                                    });\n                                }\n                            }\n                        }\n                        dispatch.stateChange({\n                            disabled: data.map(function(d) { return !!d.disabled }),\n                            disengaged: data.map(function(d) { return !!d.disengaged })\n                        });\n\n                    }\n                })\n                .on('dblclick', function(d,i) {\n                    if(vers == 'furious' && expanded) return;\n                    dispatch.legendDblclick(d,i);\n                    if (updateState) {\n                        // make sure we re-get data in case it was modified\n                        var data = series.data();\n                        //the default behavior of NVD3 legends, when double clicking one,\n                        // is to set all other series' to false, and make the double clicked series enabled.\n                        data.forEach(function(series) {\n                            series.disabled = true;\n                            if(vers == 'furious') series.userDisabled = series.disabled;\n                        });\n                        d.disabled = false;\n                        if(vers == 'furious') d.userDisabled = d.disabled;\n                        dispatch.stateChange({\n                            disabled: data.map(function(d) { return !!d.disabled })\n                        });\n                    }\n                });\n\n            series.classed('nv-disabled', function(d) { return d.userDisabled });\n            series.exit().remove();\n\n            seriesText\n                .attr('fill', setTextColor)\n                .text(getKey);\n\n            //TODO: implement fixed-width and max-width options (max-width is especially useful with the align option)\n            // NEW ALIGNING CODE, TODO: clean up\n\n            var versPadding;\n            switch(vers) {\n                case 'furious' :\n                    versPadding = 23;\n                    break;\n                case 'classic' :\n                    versPadding = 20;\n            }\n\n            if (align) {\n\n                var seriesWidths = [];\n                series.each(function(d,i) {\n                    var legendText = d3.select(this).select('text');\n                    var nodeTextLength;\n                    try {\n                        nodeTextLength = legendText.node().getComputedTextLength();\n                        // If the legendText is display:none'd (nodeTextLength == 0), simulate an error so we approximate, instead\n                        if(nodeTextLength <= 0) throw Error();\n                    }\n                    catch(e) {\n                        nodeTextLength = nv.utils.calcApproxTextWidth(legendText);\n                    }\n\n                    seriesWidths.push(nodeTextLength + padding);\n                });\n\n                var seriesPerRow = 0;\n                var legendWidth = 0;\n                var columnWidths = [];\n\n                while ( legendWidth < availableWidth && seriesPerRow < seriesWidths.length) {\n                    columnWidths[seriesPerRow] = seriesWidths[seriesPerRow];\n                    legendWidth += seriesWidths[seriesPerRow++];\n                }\n                if (seriesPerRow === 0) seriesPerRow = 1; //minimum of one series per row\n\n                while ( legendWidth > availableWidth && seriesPerRow > 1 ) {\n                    columnWidths = [];\n                    seriesPerRow--;\n\n                    for (var k = 0; k < seriesWidths.length; k++) {\n                        if (seriesWidths[k] > (columnWidths[k % seriesPerRow] || 0) )\n                            columnWidths[k % seriesPerRow] = seriesWidths[k];\n                    }\n\n                    legendWidth = columnWidths.reduce(function(prev, cur, index, array) {\n                        return prev + cur;\n                    });\n                }\n\n                var xPositions = [];\n                for (var i = 0, curX = 0; i < seriesPerRow; i++) {\n                    xPositions[i] = curX;\n                    curX += columnWidths[i];\n                }\n\n                series\n                    .attr('transform', function(d, i) {\n                        return 'translate(' + xPositions[i % seriesPerRow] + ',' + (5 + Math.floor(i / seriesPerRow) * versPadding) + ')';\n                    });\n\n                //position legend as far right as possible within the total width\n                if (rightAlign) {\n                    g.attr('transform', 'translate(' + (width - margin.right - legendWidth) + ',' + margin.top + ')');\n                }\n                else {\n                    g.attr('transform', 'translate(0' + ',' + margin.top + ')');\n                }\n\n                height = margin.top + margin.bottom + (Math.ceil(seriesWidths.length / seriesPerRow) * versPadding);\n\n            } else {\n\n                var ypos = 5,\n                    newxpos = 5,\n                    maxwidth = 0,\n                    xpos;\n                series\n                    .attr('transform', function(d, i) {\n                        var length = d3.select(this).select('text').node().getComputedTextLength() + padding;\n                        xpos = newxpos;\n\n                        if (width < margin.left + margin.right + xpos + length) {\n                            newxpos = xpos = 5;\n                            ypos += versPadding;\n                        }\n\n                        newxpos += length;\n                        if (newxpos > maxwidth) maxwidth = newxpos;\n\n                        return 'translate(' + xpos + ',' + ypos + ')';\n                    });\n\n                //position legend as far right as possible within the total width\n                g.attr('transform', 'translate(' + (width - margin.right - maxwidth) + ',' + margin.top + ')');\n\n                height = margin.top + margin.bottom + ypos + 15;\n            }\n\n            if(vers == 'furious') {\n                // Size rectangles after text is placed\n                seriesShape\n                    .attr('width', function(d,i) {\n                        return seriesText[0][i].getComputedTextLength() + 27;\n                    })\n                    .attr('height', 18)\n                    .attr('y', -9)\n                    .attr('x', -15)\n            }\n\n            seriesShape\n                .style('fill', setBGColor)\n                .style('stroke', function(d,i) { return d.color || color(d, i) });\n        });\n\n        function setTextColor(d,i) {\n            if(vers != 'furious') return '#000';\n            if(expanded) {\n                return d.disengaged ? color(d,i) : '#fff';\n            } else if (!expanded) {\n                return !!d.disabled ? color(d,i) : '#fff';\n            }\n        }\n\n        function setBGColor(d,i) {\n            if(expanded && vers == 'furious') {\n                return d.disengaged ? '#fff' : color(d,i);\n            } else {\n                return !!d.disabled ? '#fff' : color(d,i);\n            }\n        }\n\n        return chart;\n    }\n\n    //============================================================\n    // Expose Public Variables\n    //------------------------------------------------------------\n\n    chart.dispatch = dispatch;\n    chart.options = nv.utils.optionsFunc.bind(chart);\n\n    chart._options = Object.create({}, {\n        // simple options, just get/set the necessary values\n        width:      {get: function(){return width;}, set: function(_){width=_;}},\n        height:     {get: function(){return height;}, set: function(_){height=_;}},\n        key:        {get: function(){return getKey;}, set: function(_){getKey=_;}},\n        align:      {get: function(){return align;}, set: function(_){align=_;}},\n        rightAlign:    {get: function(){return rightAlign;}, set: function(_){rightAlign=_;}},\n        padding:       {get: function(){return padding;}, set: function(_){padding=_;}},\n        updateState:   {get: function(){return updateState;}, set: function(_){updateState=_;}},\n        radioButtonMode:    {get: function(){return radioButtonMode;}, set: function(_){radioButtonMode=_;}},\n        expanded:   {get: function(){return expanded;}, set: function(_){expanded=_;}},\n        vers:   {get: function(){return vers;}, set: function(_){vers=_;}},\n\n        // options that require extra logic in the setter\n        margin: {get: function(){return margin;}, set: function(_){\n            margin.top    = _.top    !== undefined ? _.top    : margin.top;\n            margin.right  = _.right  !== undefined ? _.right  : margin.right;\n            margin.bottom = _.bottom !== undefined ? _.bottom : margin.bottom;\n            margin.left   = _.left   !== undefined ? _.left   : margin.left;\n        }},\n        color:  {get: function(){return color;}, set: function(_){\n            color = nv.utils.getColor(_);\n        }}\n    });\n\n    nv.utils.initOptions(chart);\n\n    return chart;\n};\n//TODO: consider deprecating and using multibar with single series for this\nnv.models.historicalBar = function() {\n    \"use strict\";\n\n    //============================================================\n    // Public Variables with Default Settings\n    //------------------------------------------------------------\n\n    var margin = {top: 0, right: 0, bottom: 0, left: 0}\n        , width = null\n        , height = null\n        , id = Math.floor(Math.random() * 10000) //Create semi-unique ID in case user doesn't select one\n        , container = null\n        , x = d3.scale.linear()\n        , y = d3.scale.linear()\n        , getX = function(d) { return d.x }\n        , getY = function(d) { return d.y }\n        , forceX = []\n        , forceY = [0]\n        , padData = false\n        , clipEdge = true\n        , color = nv.utils.defaultColor()\n        , xDomain\n        , yDomain\n        , xRange\n        , yRange\n        , dispatch = d3.dispatch('chartClick', 'elementClick', 'elementDblClick', 'elementMouseover', 'elementMouseout', 'elementMousemove', 'renderEnd')\n        , interactive = true\n        ;\n\n    var renderWatch = nv.utils.renderWatch(dispatch, 0);\n\n    function chart(selection) {\n        selection.each(function(data) {\n            renderWatch.reset();\n\n            container = d3.select(this);\n            var availableWidth = nv.utils.availableWidth(width, container, margin),\n                availableHeight = nv.utils.availableHeight(height, container, margin);\n\n            nv.utils.initSVG(container);\n\n            // Setup Scales\n            x.domain(xDomain || d3.extent(data[0].values.map(getX).concat(forceX) ));\n\n            if (padData)\n                x.range(xRange || [availableWidth * .5 / data[0].values.length, availableWidth * (data[0].values.length - .5)  / data[0].values.length ]);\n            else\n                x.range(xRange || [0, availableWidth]);\n\n            y.domain(yDomain || d3.extent(data[0].values.map(getY).concat(forceY) ))\n                .range(yRange || [availableHeight, 0]);\n\n            // If scale's domain don't have a range, slightly adjust to make one... so a chart can show a single data point\n            if (x.domain()[0] === x.domain()[1])\n                x.domain()[0] ?\n                    x.domain([x.domain()[0] - x.domain()[0] * 0.01, x.domain()[1] + x.domain()[1] * 0.01])\n                    : x.domain([-1,1]);\n\n            if (y.domain()[0] === y.domain()[1])\n                y.domain()[0] ?\n                    y.domain([y.domain()[0] + y.domain()[0] * 0.01, y.domain()[1] - y.domain()[1] * 0.01])\n                    : y.domain([-1,1]);\n\n            // Setup containers and skeleton of chart\n            var wrap = container.selectAll('g.nv-wrap.nv-historicalBar-' + id).data([data[0].values]);\n            var wrapEnter = wrap.enter().append('g').attr('class', 'nvd3 nv-wrap nv-historicalBar-' + id);\n            var defsEnter = wrapEnter.append('defs');\n            var gEnter = wrapEnter.append('g');\n            var g = wrap.select('g');\n\n            gEnter.append('g').attr('class', 'nv-bars');\n            wrap.attr('transform', 'translate(' + margin.left + ',' + margin.top + ')');\n\n            container\n                .on('click', function(d,i) {\n                    dispatch.chartClick({\n                        data: d,\n                        index: i,\n                        pos: d3.event,\n                        id: id\n                    });\n                });\n\n            defsEnter.append('clipPath')\n                .attr('id', 'nv-chart-clip-path-' + id)\n                .append('rect');\n\n            wrap.select('#nv-chart-clip-path-' + id + ' rect')\n                .attr('width', availableWidth)\n                .attr('height', availableHeight);\n\n            g.attr('clip-path', clipEdge ? 'url(#nv-chart-clip-path-' + id + ')' : '');\n\n            var bars = wrap.select('.nv-bars').selectAll('.nv-bar')\n                .data(function(d) { return d }, function(d,i) {return getX(d,i)});\n            bars.exit().remove();\n\n            bars.enter().append('rect')\n                .attr('x', 0 )\n                .attr('y', function(d,i) {  return nv.utils.NaNtoZero(y(Math.max(0, getY(d,i)))) })\n                .attr('height', function(d,i) { return nv.utils.NaNtoZero(Math.abs(y(getY(d,i)) - y(0))) })\n                .attr('transform', function(d,i) { return 'translate(' + (x(getX(d,i)) - availableWidth / data[0].values.length * .45) + ',0)'; })\n                .on('mouseover', function(d,i) {\n                    if (!interactive) return;\n                    d3.select(this).classed('hover', true);\n                    dispatch.elementMouseover({\n                        data: d,\n                        index: i,\n                        color: d3.select(this).style(\"fill\")\n                    });\n\n                })\n                .on('mouseout', function(d,i) {\n                    if (!interactive) return;\n                    d3.select(this).classed('hover', false);\n                    dispatch.elementMouseout({\n                        data: d,\n                        index: i,\n                        color: d3.select(this).style(\"fill\")\n                    });\n                })\n                .on('mousemove', function(d,i) {\n                    if (!interactive) return;\n                    dispatch.elementMousemove({\n                        data: d,\n                        index: i,\n                        color: d3.select(this).style(\"fill\")\n                    });\n                })\n                .on('click', function(d,i) {\n                    if (!interactive) return;\n                    dispatch.elementClick({\n                        data: d,\n                        index: i,\n                        color: d3.select(this).style(\"fill\")\n                    });\n                    d3.event.stopPropagation();\n                })\n                .on('dblclick', function(d,i) {\n                    if (!interactive) return;\n                    dispatch.elementDblClick({\n                        data: d,\n                        index: i,\n                        color: d3.select(this).style(\"fill\")\n                    });\n                    d3.event.stopPropagation();\n                });\n\n            bars\n                .attr('fill', function(d,i) { return color(d, i); })\n                .attr('class', function(d,i,j) { return (getY(d,i) < 0 ? 'nv-bar negative' : 'nv-bar positive') + ' nv-bar-' + j + '-' + i })\n                .watchTransition(renderWatch, 'bars')\n                .attr('transform', function(d,i) { return 'translate(' + (x(getX(d,i)) - availableWidth / data[0].values.length * .45) + ',0)'; })\n                //TODO: better width calculations that don't assume always uniform data spacing;w\n                .attr('width', (availableWidth / data[0].values.length) * .9 );\n\n            bars.watchTransition(renderWatch, 'bars')\n                .attr('y', function(d,i) {\n                    var rval = getY(d,i) < 0 ?\n                        y(0) :\n                            y(0) - y(getY(d,i)) < 1 ?\n                        y(0) - 1 :\n                        y(getY(d,i));\n                    return nv.utils.NaNtoZero(rval);\n                })\n                .attr('height', function(d,i) { return nv.utils.NaNtoZero(Math.max(Math.abs(y(getY(d,i)) - y(0)),1)) });\n\n        });\n\n        renderWatch.renderEnd('historicalBar immediate');\n        return chart;\n    }\n\n    //Create methods to allow outside functions to highlight a specific bar.\n    chart.highlightPoint = function(pointIndex, isHoverOver) {\n        container\n            .select(\".nv-bars .nv-bar-0-\" + pointIndex)\n            .classed(\"hover\", isHoverOver)\n        ;\n    };\n\n    chart.clearHighlights = function() {\n        container\n            .select(\".nv-bars .nv-bar.hover\")\n            .classed(\"hover\", false)\n        ;\n    };\n\n    //============================================================\n    // Expose Public Variables\n    //------------------------------------------------------------\n\n    chart.dispatch = dispatch;\n    chart.options = nv.utils.optionsFunc.bind(chart);\n\n    chart._options = Object.create({}, {\n        // simple options, just get/set the necessary values\n        width:   {get: function(){return width;}, set: function(_){width=_;}},\n        height:  {get: function(){return height;}, set: function(_){height=_;}},\n        forceX:  {get: function(){return forceX;}, set: function(_){forceX=_;}},\n        forceY:  {get: function(){return forceY;}, set: function(_){forceY=_;}},\n        padData: {get: function(){return padData;}, set: function(_){padData=_;}},\n        x:       {get: function(){return getX;}, set: function(_){getX=_;}},\n        y:       {get: function(){return getY;}, set: function(_){getY=_;}},\n        xScale:  {get: function(){return x;}, set: function(_){x=_;}},\n        yScale:  {get: function(){return y;}, set: function(_){y=_;}},\n        xDomain: {get: function(){return xDomain;}, set: function(_){xDomain=_;}},\n        yDomain: {get: function(){return yDomain;}, set: function(_){yDomain=_;}},\n        xRange:  {get: function(){return xRange;}, set: function(_){xRange=_;}},\n        yRange:  {get: function(){return yRange;}, set: function(_){yRange=_;}},\n        clipEdge:    {get: function(){return clipEdge;}, set: function(_){clipEdge=_;}},\n        id:          {get: function(){return id;}, set: function(_){id=_;}},\n        interactive: {get: function(){return interactive;}, set: function(_){interactive=_;}},\n\n        // options that require extra logic in the setter\n        margin: {get: function(){return margin;}, set: function(_){\n            margin.top    = _.top    !== undefined ? _.top    : margin.top;\n            margin.right  = _.right  !== undefined ? _.right  : margin.right;\n            margin.bottom = _.bottom !== undefined ? _.bottom : margin.bottom;\n            margin.left   = _.left   !== undefined ? _.left   : margin.left;\n        }},\n        color:  {get: function(){return color;}, set: function(_){\n            color = nv.utils.getColor(_);\n        }}\n    });\n\n    nv.utils.initOptions(chart);\n\n    return chart;\n};\n\nnv.models.historicalBarChart = function(bar_model) {\n    \"use strict\";\n\n    //============================================================\n    // Public Variables with Default Settings\n    //------------------------------------------------------------\n\n    var bars = bar_model || nv.models.historicalBar()\n        , xAxis = nv.models.axis()\n        , yAxis = nv.models.axis()\n        , legend = nv.models.legend()\n        , interactiveLayer = nv.interactiveGuideline()\n        , tooltip = nv.models.tooltip()\n        ;\n\n\n    var margin = {top: 30, right: 90, bottom: 50, left: 90}\n        , color = nv.utils.defaultColor()\n        , width = null\n        , height = null\n        , showLegend = false\n        , showXAxis = true\n        , showYAxis = true\n        , rightAlignYAxis = false\n        , useInteractiveGuideline = false\n        , x\n        , y\n        , state = {}\n        , defaultState = null\n        , noData = null\n        , dispatch = d3.dispatch('tooltipHide', 'stateChange', 'changeState', 'renderEnd')\n        , transitionDuration = 250\n        ;\n\n    xAxis.orient('bottom').tickPadding(7);\n    yAxis.orient( (rightAlignYAxis) ? 'right' : 'left');\n    tooltip\n        .duration(0)\n        .headerEnabled(false)\n        .valueFormatter(function(d, i) {\n            return yAxis.tickFormat()(d, i);\n        })\n        .headerFormatter(function(d, i) {\n            return xAxis.tickFormat()(d, i);\n        });\n\n\n    //============================================================\n    // Private Variables\n    //------------------------------------------------------------\n\n    var renderWatch = nv.utils.renderWatch(dispatch, 0);\n\n    function chart(selection) {\n        selection.each(function(data) {\n            renderWatch.reset();\n            renderWatch.models(bars);\n            if (showXAxis) renderWatch.models(xAxis);\n            if (showYAxis) renderWatch.models(yAxis);\n\n            var container = d3.select(this),\n                that = this;\n            nv.utils.initSVG(container);\n            var availableWidth = nv.utils.availableWidth(width, container, margin),\n                availableHeight = nv.utils.availableHeight(height, container, margin);\n\n            chart.update = function() { container.transition().duration(transitionDuration).call(chart) };\n            chart.container = this;\n\n            //set state.disabled\n            state.disabled = data.map(function(d) { return !!d.disabled });\n\n            if (!defaultState) {\n                var key;\n                defaultState = {};\n                for (key in state) {\n                    if (state[key] instanceof Array)\n                        defaultState[key] = state[key].slice(0);\n                    else\n                        defaultState[key] = state[key];\n                }\n            }\n\n            // Display noData message if there's nothing to show.\n            if (!data || !data.length || !data.filter(function(d) { return d.values.length }).length) {\n                nv.utils.noData(chart, container)\n                return chart;\n            } else {\n                container.selectAll('.nv-noData').remove();\n            }\n\n            // Setup Scales\n            x = bars.xScale();\n            y = bars.yScale();\n\n            // Setup containers and skeleton of chart\n            var wrap = container.selectAll('g.nv-wrap.nv-historicalBarChart').data([data]);\n            var gEnter = wrap.enter().append('g').attr('class', 'nvd3 nv-wrap nv-historicalBarChart').append('g');\n            var g = wrap.select('g');\n\n            gEnter.append('g').attr('class', 'nv-x nv-axis');\n            gEnter.append('g').attr('class', 'nv-y nv-axis');\n            gEnter.append('g').attr('class', 'nv-barsWrap');\n            gEnter.append('g').attr('class', 'nv-legendWrap');\n            gEnter.append('g').attr('class', 'nv-interactive');\n\n            // Legend\n            if (showLegend) {\n                legend.width(availableWidth);\n\n                g.select('.nv-legendWrap')\n                    .datum(data)\n                    .call(legend);\n\n                if ( margin.top != legend.height()) {\n                    margin.top = legend.height();\n                    availableHeight = nv.utils.availableHeight(height, container, margin);\n                }\n\n                wrap.select('.nv-legendWrap')\n                    .attr('transform', 'translate(0,' + (-margin.top) +')')\n            }\n            wrap.attr('transform', 'translate(' + margin.left + ',' + margin.top + ')');\n\n            if (rightAlignYAxis) {\n                g.select(\".nv-y.nv-axis\")\n                    .attr(\"transform\", \"translate(\" + availableWidth + \",0)\");\n            }\n\n            //Set up interactive layer\n            if (useInteractiveGuideline) {\n                interactiveLayer\n                    .width(availableWidth)\n                    .height(availableHeight)\n                    .margin({left:margin.left, top:margin.top})\n                    .svgContainer(container)\n                    .xScale(x);\n                wrap.select(\".nv-interactive\").call(interactiveLayer);\n            }\n            bars\n                .width(availableWidth)\n                .height(availableHeight)\n                .color(data.map(function(d,i) {\n                    return d.color || color(d, i);\n                }).filter(function(d,i) { return !data[i].disabled }));\n\n            var barsWrap = g.select('.nv-barsWrap')\n                .datum(data.filter(function(d) { return !d.disabled }));\n            barsWrap.transition().call(bars);\n\n            // Setup Axes\n            if (showXAxis) {\n                xAxis\n                    .scale(x)\n                    ._ticks( nv.utils.calcTicksX(availableWidth/100, data) )\n                    .tickSize(-availableHeight, 0);\n\n                g.select('.nv-x.nv-axis')\n                    .attr('transform', 'translate(0,' + y.range()[0] + ')');\n                g.select('.nv-x.nv-axis')\n                    .transition()\n                    .call(xAxis);\n            }\n\n            if (showYAxis) {\n                yAxis\n                    .scale(y)\n                    ._ticks( nv.utils.calcTicksY(availableHeight/36, data) )\n                    .tickSize( -availableWidth, 0);\n\n                g.select('.nv-y.nv-axis')\n                    .transition()\n                    .call(yAxis);\n            }\n\n            //============================================================\n            // Event Handling/Dispatching (in chart's scope)\n            //------------------------------------------------------------\n\n            interactiveLayer.dispatch.on('elementMousemove', function(e) {\n                bars.clearHighlights();\n\n                var singlePoint, pointIndex, pointXLocation, allData = [];\n                data\n                    .filter(function(series, i) {\n                        series.seriesIndex = i;\n                        return !series.disabled;\n                    })\n                    .forEach(function(series,i) {\n                        pointIndex = nv.interactiveBisect(series.values, e.pointXValue, chart.x());\n                        bars.highlightPoint(pointIndex,true);\n                        var point = series.values[pointIndex];\n                        if (point === undefined) return;\n                        if (singlePoint === undefined) singlePoint = point;\n                        if (pointXLocation === undefined) pointXLocation = chart.xScale()(chart.x()(point,pointIndex));\n                        allData.push({\n                            key: series.key,\n                            value: chart.y()(point, pointIndex),\n                            color: color(series,series.seriesIndex),\n                            data: series.values[pointIndex]\n                        });\n                    });\n\n                var xValue = xAxis.tickFormat()(chart.x()(singlePoint,pointIndex));\n                interactiveLayer.tooltip\n                    .position({left: pointXLocation + margin.left, top: e.mouseY + margin.top})\n                    .chartContainer(that.parentNode)\n                    .valueFormatter(function(d,i) {\n                        return yAxis.tickFormat()(d);\n                    })\n                    .data({\n                        value: xValue,\n                        index: pointIndex,\n                        series: allData\n                    })();\n\n                interactiveLayer.renderGuideLine(pointXLocation);\n\n            });\n\n            interactiveLayer.dispatch.on(\"elementMouseout\",function(e) {\n                dispatch.tooltipHide();\n                bars.clearHighlights();\n            });\n\n            legend.dispatch.on('legendClick', function(d,i) {\n                d.disabled = !d.disabled;\n\n                if (!data.filter(function(d) { return !d.disabled }).length) {\n                    data.map(function(d) {\n                        d.disabled = false;\n                        wrap.selectAll('.nv-series').classed('disabled', false);\n                        return d;\n                    });\n                }\n\n                state.disabled = data.map(function(d) { return !!d.disabled });\n                dispatch.stateChange(state);\n\n                selection.transition().call(chart);\n            });\n\n            legend.dispatch.on('legendDblclick', function(d) {\n                //Double clicking should always enable current series, and disabled all others.\n                data.forEach(function(d) {\n                    d.disabled = true;\n                });\n                d.disabled = false;\n\n                state.disabled = data.map(function(d) { return !!d.disabled });\n                dispatch.stateChange(state);\n                chart.update();\n            });\n\n            dispatch.on('changeState', function(e) {\n                if (typeof e.disabled !== 'undefined') {\n                    data.forEach(function(series,i) {\n                        series.disabled = e.disabled[i];\n                    });\n\n                    state.disabled = e.disabled;\n                }\n\n                chart.update();\n            });\n        });\n\n        renderWatch.renderEnd('historicalBarChart immediate');\n        return chart;\n    }\n\n    //============================================================\n    // Event Handling/Dispatching (out of chart's scope)\n    //------------------------------------------------------------\n\n    bars.dispatch.on('elementMouseover.tooltip', function(evt) {\n        evt['series'] = {\n            key: chart.x()(evt.data),\n            value: chart.y()(evt.data),\n            color: evt.color\n        };\n        tooltip.data(evt).hidden(false);\n    });\n\n    bars.dispatch.on('elementMouseout.tooltip', function(evt) {\n        tooltip.hidden(true);\n    });\n\n    bars.dispatch.on('elementMousemove.tooltip', function(evt) {\n        tooltip.position({top: d3.event.pageY, left: d3.event.pageX})();\n    });\n\n    //============================================================\n    // Expose Public Variables\n    //------------------------------------------------------------\n\n    // expose chart's sub-components\n    chart.dispatch = dispatch;\n    chart.bars = bars;\n    chart.legend = legend;\n    chart.xAxis = xAxis;\n    chart.yAxis = yAxis;\n    chart.interactiveLayer = interactiveLayer;\n    chart.tooltip = tooltip;\n\n    chart.options = nv.utils.optionsFunc.bind(chart);\n\n    chart._options = Object.create({}, {\n        // simple options, just get/set the necessary values\n        width:      {get: function(){return width;}, set: function(_){width=_;}},\n        height:     {get: function(){return height;}, set: function(_){height=_;}},\n        showLegend: {get: function(){return showLegend;}, set: function(_){showLegend=_;}},\n        showXAxis: {get: function(){return showXAxis;}, set: function(_){showXAxis=_;}},\n        showYAxis: {get: function(){return showYAxis;}, set: function(_){showYAxis=_;}},\n        defaultState:    {get: function(){return defaultState;}, set: function(_){defaultState=_;}},\n        noData:    {get: function(){return noData;}, set: function(_){noData=_;}},\n\n        // deprecated options\n        tooltips:    {get: function(){return tooltip.enabled();}, set: function(_){\n            // deprecated after 1.7.1\n            nv.deprecated('tooltips', 'use chart.tooltip.enabled() instead');\n            tooltip.enabled(!!_);\n        }},\n        tooltipContent:    {get: function(){return tooltip.contentGenerator();}, set: function(_){\n            // deprecated after 1.7.1\n            nv.deprecated('tooltipContent', 'use chart.tooltip.contentGenerator() instead');\n            tooltip.contentGenerator(_);\n        }},\n\n        // options that require extra logic in the setter\n        margin: {get: function(){return margin;}, set: function(_){\n            margin.top    = _.top    !== undefined ? _.top    : margin.top;\n            margin.right  = _.right  !== undefined ? _.right  : margin.right;\n            margin.bottom = _.bottom !== undefined ? _.bottom : margin.bottom;\n            margin.left   = _.left   !== undefined ? _.left   : margin.left;\n        }},\n        color:  {get: function(){return color;}, set: function(_){\n            color = nv.utils.getColor(_);\n            legend.color(color);\n            bars.color(color);\n        }},\n        duration:    {get: function(){return transitionDuration;}, set: function(_){\n            transitionDuration=_;\n            renderWatch.reset(transitionDuration);\n            yAxis.duration(transitionDuration);\n            xAxis.duration(transitionDuration);\n        }},\n        rightAlignYAxis: {get: function(){return rightAlignYAxis;}, set: function(_){\n            rightAlignYAxis = _;\n            yAxis.orient( (_) ? 'right' : 'left');\n        }},\n        useInteractiveGuideline: {get: function(){return useInteractiveGuideline;}, set: function(_){\n            useInteractiveGuideline = _;\n            if (_ === true) {\n                chart.interactive(false);\n            }\n        }}\n    });\n\n    nv.utils.inheritOptions(chart, bars);\n    nv.utils.initOptions(chart);\n\n    return chart;\n};\n\n\n// ohlcChart is just a historical chart with ohlc bars and some tweaks\nnv.models.ohlcBarChart = function() {\n    var chart = nv.models.historicalBarChart(nv.models.ohlcBar());\n\n    // special default tooltip since we show multiple values per x\n    chart.useInteractiveGuideline(true);\n    chart.interactiveLayer.tooltip.contentGenerator(function(data) {\n        // we assume only one series exists for this chart\n        var d = data.series[0].data;\n        // match line colors as defined in nv.d3.css\n        var color = d.open < d.close ? \"2ca02c\" : \"d62728\";\n        return '' +\n            '<h3 style=\"color: #' + color + '\">' + data.value + '</h3>' +\n            '<table>' +\n            '<tr><td>open:</td><td>' + chart.yAxis.tickFormat()(d.open) + '</td></tr>' +\n            '<tr><td>close:</td><td>' + chart.yAxis.tickFormat()(d.close) + '</td></tr>' +\n            '<tr><td>high</td><td>' + chart.yAxis.tickFormat()(d.high) + '</td></tr>' +\n            '<tr><td>low:</td><td>' + chart.yAxis.tickFormat()(d.low) + '</td></tr>' +\n            '</table>';\n    });\n    return chart;\n};\n\n// candlestickChart is just a historical chart with candlestick bars and some tweaks\nnv.models.candlestickBarChart = function() {\n    var chart = nv.models.historicalBarChart(nv.models.candlestickBar());\n\n    // special default tooltip since we show multiple values per x\n    chart.useInteractiveGuideline(true);\n    chart.interactiveLayer.tooltip.contentGenerator(function(data) {\n        // we assume only one series exists for this chart\n        var d = data.series[0].data;\n        // match line colors as defined in nv.d3.css\n        var color = d.open < d.close ? \"2ca02c\" : \"d62728\";\n        return '' +\n            '<h3 style=\"color: #' + color + '\">' + data.value + '</h3>' +\n            '<table>' +\n            '<tr><td>open:</td><td>' + chart.yAxis.tickFormat()(d.open) + '</td></tr>' +\n            '<tr><td>close:</td><td>' + chart.yAxis.tickFormat()(d.close) + '</td></tr>' +\n            '<tr><td>high</td><td>' + chart.yAxis.tickFormat()(d.high) + '</td></tr>' +\n            '<tr><td>low:</td><td>' + chart.yAxis.tickFormat()(d.low) + '</td></tr>' +\n            '</table>';\n    });\n    return chart;\n};\nnv.models.legend = function() {\n    \"use strict\";\n\n    //============================================================\n    // Public Variables with Default Settings\n    //------------------------------------------------------------\n\n    var margin = {top: 5, right: 0, bottom: 5, left: 0}\n        , width = 400\n        , height = 20\n        , getKey = function(d) { return d.key }\n        , color = nv.utils.getColor()\n        , align = true\n        , padding = 32 //define how much space between legend items. - recommend 32 for furious version\n        , rightAlign = true\n        , updateState = true   //If true, legend will update data.disabled and trigger a 'stateChange' dispatch.\n        , radioButtonMode = false   //If true, clicking legend items will cause it to behave like a radio button. (only one can be selected at a time)\n        , expanded = false\n        , dispatch = d3.dispatch('legendClick', 'legendDblclick', 'legendMouseover', 'legendMouseout', 'stateChange')\n        , vers = 'classic' //Options are \"classic\" and \"furious\"\n        ;\n\n    function chart(selection) {\n        selection.each(function(data) {\n            var availableWidth = width - margin.left - margin.right,\n                container = d3.select(this);\n            nv.utils.initSVG(container);\n\n            // Setup containers and skeleton of chart\n            var wrap = container.selectAll('g.nv-legend').data([data]);\n            var gEnter = wrap.enter().append('g').attr('class', 'nvd3 nv-legend').append('g');\n            var g = wrap.select('g');\n\n            wrap.attr('transform', 'translate(' + margin.left + ',' + margin.top + ')');\n\n            var series = g.selectAll('.nv-series')\n                .data(function(d) {\n                    if(vers != 'furious') return d;\n\n                    return d.filter(function(n) {\n                        return expanded ? true : !n.disengaged;\n                    });\n                });\n\n            var seriesEnter = series.enter().append('g').attr('class', 'nv-series');\n            var seriesShape;\n\n            var versPadding;\n            switch(vers) {\n                case 'furious' :\n                    versPadding = 23;\n                    break;\n                case 'classic' :\n                    versPadding = 20;\n            }\n\n            if(vers == 'classic') {\n                seriesEnter.append('circle')\n                    .style('stroke-width', 2)\n                    .attr('class','nv-legend-symbol')\n                    .attr('r', 5);\n\n                seriesShape = series.select('circle');\n            } else if (vers == 'furious') {\n                seriesEnter.append('rect')\n                    .style('stroke-width', 2)\n                    .attr('class','nv-legend-symbol')\n                    .attr('rx', 3)\n                    .attr('ry', 3);\n\n                seriesShape = series.select('.nv-legend-symbol');\n\n                seriesEnter.append('g')\n                    .attr('class', 'nv-check-box')\n                    .property('innerHTML','<path d=\"M0.5,5 L22.5,5 L22.5,26.5 L0.5,26.5 L0.5,5 Z\" class=\"nv-box\"></path><path d=\"M5.5,12.8618467 L11.9185089,19.2803556 L31,0.198864511\" class=\"nv-check\"></path>')\n                    .attr('transform', 'translate(-10,-8)scale(0.5)');\n\n                var seriesCheckbox = series.select('.nv-check-box');\n\n                seriesCheckbox.each(function(d,i) {\n                    d3.select(this).selectAll('path')\n                        .attr('stroke', setTextColor(d,i));\n                });\n            }\n\n            seriesEnter.append('text')\n                .attr('text-anchor', 'start')\n                .attr('class','nv-legend-text')\n                .attr('dy', '.32em')\n                .attr('dx', '8');\n\n            var seriesText = series.select('text.nv-legend-text');\n\n            series\n                .on('mouseover', function(d,i) {\n                    dispatch.legendMouseover(d,i);  //TODO: Make consistent with other event objects\n                })\n                .on('mouseout', function(d,i) {\n                    dispatch.legendMouseout(d,i);\n                })\n                .on('click', function(d,i) {\n                    dispatch.legendClick(d,i);\n                    // make sure we re-get data in case it was modified\n                    var data = series.data();\n                    if (updateState) {\n                        if(vers =='classic') {\n                            if (radioButtonMode) {\n                                //Radio button mode: set every series to disabled,\n                                //  and enable the clicked series.\n                                data.forEach(function(series) { series.disabled = true});\n                                d.disabled = false;\n                            }\n                            else {\n                                d.disabled = !d.disabled;\n                                if (data.every(function(series) { return series.disabled})) {\n                                    //the default behavior of NVD3 legends is, if every single series\n                                    // is disabled, turn all series' back on.\n                                    data.forEach(function(series) { series.disabled = false});\n                                }\n                            }\n                        } else if(vers == 'furious') {\n                            if(expanded) {\n                                d.disengaged = !d.disengaged;\n                                d.userDisabled = d.userDisabled == undefined ? !!d.disabled : d.userDisabled;\n                                d.disabled = d.disengaged || d.userDisabled;\n                            } else if (!expanded) {\n                                d.disabled = !d.disabled;\n                                d.userDisabled = d.disabled;\n                                var engaged = data.filter(function(d) { return !d.disengaged; });\n                                if (engaged.every(function(series) { return series.userDisabled })) {\n                                    //the default behavior of NVD3 legends is, if every single series\n                                    // is disabled, turn all series' back on.\n                                    data.forEach(function(series) {\n                                        series.disabled = series.userDisabled = false;\n                                    });\n                                }\n                            }\n                        }\n                        dispatch.stateChange({\n                            disabled: data.map(function(d) { return !!d.disabled }),\n                            disengaged: data.map(function(d) { return !!d.disengaged })\n                        });\n\n                    }\n                })\n                .on('dblclick', function(d,i) {\n                    if(vers == 'furious' && expanded) return;\n                    dispatch.legendDblclick(d,i);\n                    if (updateState) {\n                        // make sure we re-get data in case it was modified\n                        var data = series.data();\n                        //the default behavior of NVD3 legends, when double clicking one,\n                        // is to set all other series' to false, and make the double clicked series enabled.\n                        data.forEach(function(series) {\n                            series.disabled = true;\n                            if(vers == 'furious') series.userDisabled = series.disabled;\n                        });\n                        d.disabled = false;\n                        if(vers == 'furious') d.userDisabled = d.disabled;\n                        dispatch.stateChange({\n                            disabled: data.map(function(d) { return !!d.disabled })\n                        });\n                    }\n                });\n\n            series.classed('nv-disabled', function(d) { return d.userDisabled });\n            series.exit().remove();\n\n            seriesText\n                .attr('fill', setTextColor)\n                .text(getKey);\n\n            //TODO: implement fixed-width and max-width options (max-width is especially useful with the align option)\n            // NEW ALIGNING CODE, TODO: clean up\n            var legendWidth = 0;\n            if (align) {\n\n                var seriesWidths = [];\n                series.each(function(d,i) {\n                    var legendText = d3.select(this).select('text');\n                    var nodeTextLength;\n                    try {\n                        nodeTextLength = legendText.node().getComputedTextLength();\n                        // If the legendText is display:none'd (nodeTextLength == 0), simulate an error so we approximate, instead\n                        if(nodeTextLength <= 0) throw Error();\n                    }\n                    catch(e) {\n                        nodeTextLength = nv.utils.calcApproxTextWidth(legendText);\n                    }\n\n                    seriesWidths.push(nodeTextLength + padding);\n                });\n\n                var seriesPerRow = 0;\n                var columnWidths = [];\n                legendWidth = 0;\n\n                while ( legendWidth < availableWidth && seriesPerRow < seriesWidths.length) {\n                    columnWidths[seriesPerRow] = seriesWidths[seriesPerRow];\n                    legendWidth += seriesWidths[seriesPerRow++];\n                }\n                if (seriesPerRow === 0) seriesPerRow = 1; //minimum of one series per row\n\n                while ( legendWidth > availableWidth && seriesPerRow > 1 ) {\n                    columnWidths = [];\n                    seriesPerRow--;\n\n                    for (var k = 0; k < seriesWidths.length; k++) {\n                        if (seriesWidths[k] > (columnWidths[k % seriesPerRow] || 0) )\n                            columnWidths[k % seriesPerRow] = seriesWidths[k];\n                    }\n\n                    legendWidth = columnWidths.reduce(function(prev, cur, index, array) {\n                        return prev + cur;\n                    });\n                }\n\n                var xPositions = [];\n                for (var i = 0, curX = 0; i < seriesPerRow; i++) {\n                    xPositions[i] = curX;\n                    curX += columnWidths[i];\n                }\n\n                series\n                    .attr('transform', function(d, i) {\n                        return 'translate(' + xPositions[i % seriesPerRow] + ',' + (5 + Math.floor(i / seriesPerRow) * versPadding) + ')';\n                    });\n\n                //position legend as far right as possible within the total width\n                if (rightAlign) {\n                    g.attr('transform', 'translate(' + (width - margin.right - legendWidth) + ',' + margin.top + ')');\n                }\n                else {\n                    g.attr('transform', 'translate(0' + ',' + margin.top + ')');\n                }\n\n                height = margin.top + margin.bottom + (Math.ceil(seriesWidths.length / seriesPerRow) * versPadding);\n\n            } else {\n\n                var ypos = 5,\n                    newxpos = 5,\n                    maxwidth = 0,\n                    xpos;\n                series\n                    .attr('transform', function(d, i) {\n                        var length = d3.select(this).select('text').node().getComputedTextLength() + padding;\n                        xpos = newxpos;\n\n                        if (width < margin.left + margin.right + xpos + length) {\n                            newxpos = xpos = 5;\n                            ypos += versPadding;\n                        }\n\n                        newxpos += length;\n                        if (newxpos > maxwidth) maxwidth = newxpos;\n\n                        if(legendWidth < xpos + maxwidth) {\n                            legendWidth = xpos + maxwidth;\n                        }\n                        return 'translate(' + xpos + ',' + ypos + ')';\n                    });\n\n                //position legend as far right as possible within the total width\n                g.attr('transform', 'translate(' + (width - margin.right - maxwidth) + ',' + margin.top + ')');\n\n                height = margin.top + margin.bottom + ypos + 15;\n            }\n\n            if(vers == 'furious') {\n                // Size rectangles after text is placed\n                seriesShape\n                    .attr('width', function(d,i) {\n                        return seriesText[0][i].getComputedTextLength() + 27;\n                    })\n                    .attr('height', 18)\n                    .attr('y', -9)\n                    .attr('x', -15);\n\n                // The background for the expanded legend (UI)\n                gEnter.insert('rect',':first-child')\n                    .attr('class', 'nv-legend-bg')\n                    .attr('fill', '#eee')\n                    // .attr('stroke', '#444')\n                    .attr('opacity',0);\n\n                var seriesBG = g.select('.nv-legend-bg');\n\n                seriesBG\n                .transition().duration(300)\n                    .attr('x', -versPadding )\n                    .attr('width', legendWidth + versPadding - 12)\n                    .attr('height', height + 10)\n                    .attr('y', -margin.top - 10)\n                    .attr('opacity', expanded ? 1 : 0);\n\n\n            }\n\n            seriesShape\n                .style('fill', setBGColor)\n                .style('fill-opacity', setBGOpacity)\n                .style('stroke', setBGColor);\n        });\n\n        function setTextColor(d,i) {\n            if(vers != 'furious') return '#000';\n            if(expanded) {\n                return d.disengaged ? '#000' : '#fff';\n            } else if (!expanded) {\n                if(!d.color) d.color = color(d,i);\n                return !!d.disabled ? d.color : '#fff';\n            }\n        }\n\n        function setBGColor(d,i) {\n            if(expanded && vers == 'furious') {\n                return d.disengaged ? '#eee' : d.color || color(d,i);\n            } else {\n                return d.color || color(d,i);\n            }\n        }\n\n\n        function setBGOpacity(d,i) {\n            if(expanded && vers == 'furious') {\n                return 1;\n            } else {\n                return !!d.disabled ? 0 : 1;\n            }\n        }\n\n        return chart;\n    }\n\n    //============================================================\n    // Expose Public Variables\n    //------------------------------------------------------------\n\n    chart.dispatch = dispatch;\n    chart.options = nv.utils.optionsFunc.bind(chart);\n\n    chart._options = Object.create({}, {\n        // simple options, just get/set the necessary values\n        width:      {get: function(){return width;}, set: function(_){width=_;}},\n        height:     {get: function(){return height;}, set: function(_){height=_;}},\n        key:        {get: function(){return getKey;}, set: function(_){getKey=_;}},\n        align:      {get: function(){return align;}, set: function(_){align=_;}},\n        rightAlign:    {get: function(){return rightAlign;}, set: function(_){rightAlign=_;}},\n        padding:       {get: function(){return padding;}, set: function(_){padding=_;}},\n        updateState:   {get: function(){return updateState;}, set: function(_){updateState=_;}},\n        radioButtonMode:    {get: function(){return radioButtonMode;}, set: function(_){radioButtonMode=_;}},\n        expanded:   {get: function(){return expanded;}, set: function(_){expanded=_;}},\n        vers:   {get: function(){return vers;}, set: function(_){vers=_;}},\n\n        // options that require extra logic in the setter\n        margin: {get: function(){return margin;}, set: function(_){\n            margin.top    = _.top    !== undefined ? _.top    : margin.top;\n            margin.right  = _.right  !== undefined ? _.right  : margin.right;\n            margin.bottom = _.bottom !== undefined ? _.bottom : margin.bottom;\n            margin.left   = _.left   !== undefined ? _.left   : margin.left;\n        }},\n        color:  {get: function(){return color;}, set: function(_){\n            color = nv.utils.getColor(_);\n        }}\n    });\n\n    nv.utils.initOptions(chart);\n\n    return chart;\n};\n\nnv.models.line = function() {\n    \"use strict\";\n    //============================================================\n    // Public Variables with Default Settings\n    //------------------------------------------------------------\n\n    var  scatter = nv.models.scatter()\n        ;\n\n    var margin = {top: 0, right: 0, bottom: 0, left: 0}\n        , width = 960\n        , height = 500\n        , container = null\n        , strokeWidth = 1.5\n        , color = nv.utils.defaultColor() // a function that returns a color\n        , getX = function(d) { return d.x } // accessor to get the x value from a data point\n        , getY = function(d) { return d.y } // accessor to get the y value from a data point\n        , defined = function(d,i) { return !isNaN(getY(d,i)) && getY(d,i) !== null } // allows a line to be not continuous when it is not defined\n        , isArea = function(d) { return d.area } // decides if a line is an area or just a line\n        , clipEdge = false // if true, masks lines within x and y scale\n        , x //can be accessed via chart.xScale()\n        , y //can be accessed via chart.yScale()\n        , interpolate = \"linear\" // controls the line interpolation\n        , duration = 250\n        , dispatch = d3.dispatch('elementClick', 'elementMouseover', 'elementMouseout', 'renderEnd')\n        ;\n\n    scatter\n        .pointSize(16) // default size\n        .pointDomain([16,256]) //set to speed up calculation, needs to be unset if there is a custom size accessor\n    ;\n\n    //============================================================\n\n\n    //============================================================\n    // Private Variables\n    //------------------------------------------------------------\n\n    var x0, y0 //used to store previous scales\n        , renderWatch = nv.utils.renderWatch(dispatch, duration)\n        ;\n\n    //============================================================\n\n\n    function chart(selection) {\n        renderWatch.reset();\n        renderWatch.models(scatter);\n        selection.each(function(data) {\n            container = d3.select(this);\n            var availableWidth = nv.utils.availableWidth(width, container, margin),\n                availableHeight = nv.utils.availableHeight(height, container, margin);\n            nv.utils.initSVG(container);\n\n            // Setup Scales\n            x = scatter.xScale();\n            y = scatter.yScale();\n\n            x0 = x0 || x;\n            y0 = y0 || y;\n\n            // Setup containers and skeleton of chart\n            var wrap = container.selectAll('g.nv-wrap.nv-line').data([data]);\n            var wrapEnter = wrap.enter().append('g').attr('class', 'nvd3 nv-wrap nv-line');\n            var defsEnter = wrapEnter.append('defs');\n            var gEnter = wrapEnter.append('g');\n            var g = wrap.select('g');\n\n            gEnter.append('g').attr('class', 'nv-groups');\n            gEnter.append('g').attr('class', 'nv-scatterWrap');\n\n            wrap.attr('transform', 'translate(' + margin.left + ',' + margin.top + ')');\n\n            scatter\n                .width(availableWidth)\n                .height(availableHeight);\n\n            var scatterWrap = wrap.select('.nv-scatterWrap');\n            scatterWrap.call(scatter);\n\n            defsEnter.append('clipPath')\n                .attr('id', 'nv-edge-clip-' + scatter.id())\n                .append('rect');\n\n            wrap.select('#nv-edge-clip-' + scatter.id() + ' rect')\n                .attr('width', availableWidth)\n                .attr('height', (availableHeight > 0) ? availableHeight : 0);\n\n            g   .attr('clip-path', clipEdge ? 'url(#nv-edge-clip-' + scatter.id() + ')' : '');\n            scatterWrap\n                .attr('clip-path', clipEdge ? 'url(#nv-edge-clip-' + scatter.id() + ')' : '');\n\n            var groups = wrap.select('.nv-groups').selectAll('.nv-group')\n                .data(function(d) { return d }, function(d) { return d.key });\n            groups.enter().append('g')\n                .style('stroke-opacity', 1e-6)\n                .style('stroke-width', function(d) { return d.strokeWidth || strokeWidth })\n                .style('fill-opacity', 1e-6);\n\n            groups.exit().remove();\n\n            groups\n                .attr('class', function(d,i) {\n                    return (d.classed || '') + ' nv-group nv-series-' + i;\n                })\n                .classed('hover', function(d) { return d.hover })\n                .style('fill', function(d,i){ return color(d, i) })\n                .style('stroke', function(d,i){ return color(d, i)});\n            groups.watchTransition(renderWatch, 'line: groups')\n                .style('stroke-opacity', 1)\n                .style('fill-opacity', function(d) { return d.fillOpacity || .5});\n\n            var areaPaths = groups.selectAll('path.nv-area')\n                .data(function(d) { return isArea(d) ? [d] : [] }); // this is done differently than lines because I need to check if series is an area\n            areaPaths.enter().append('path')\n                .attr('class', 'nv-area')\n                .attr('d', function(d) {\n                    return d3.svg.area()\n                        .interpolate(interpolate)\n                        .defined(defined)\n                        .x(function(d,i) { return nv.utils.NaNtoZero(x0(getX(d,i))) })\n                        .y0(function(d,i) { return nv.utils.NaNtoZero(y0(getY(d,i))) })\n                        .y1(function(d,i) { return y0( y.domain()[0] <= 0 ? y.domain()[1] >= 0 ? 0 : y.domain()[1] : y.domain()[0] ) })\n                        //.y1(function(d,i) { return y0(0) }) //assuming 0 is within y domain.. may need to tweak this\n                        .apply(this, [d.values])\n                });\n            groups.exit().selectAll('path.nv-area')\n                .remove();\n\n            areaPaths.watchTransition(renderWatch, 'line: areaPaths')\n                .attr('d', function(d) {\n                    return d3.svg.area()\n                        .interpolate(interpolate)\n                        .defined(defined)\n                        .x(function(d,i) { return nv.utils.NaNtoZero(x(getX(d,i))) })\n                        .y0(function(d,i) { return nv.utils.NaNtoZero(y(getY(d,i))) })\n                        .y1(function(d,i) { return y( y.domain()[0] <= 0 ? y.domain()[1] >= 0 ? 0 : y.domain()[1] : y.domain()[0] ) })\n                        //.y1(function(d,i) { return y0(0) }) //assuming 0 is within y domain.. may need to tweak this\n                        .apply(this, [d.values])\n                });\n\n            var linePaths = groups.selectAll('path.nv-line')\n                .data(function(d) { return [d.values] });\n\n            linePaths.enter().append('path')\n                .attr('class', 'nv-line')\n                .attr('d',\n                    d3.svg.line()\n                    .interpolate(interpolate)\n                    .defined(defined)\n                    .x(function(d,i) { return nv.utils.NaNtoZero(x0(getX(d,i))) })\n                    .y(function(d,i) { return nv.utils.NaNtoZero(y0(getY(d,i))) })\n            );\n\n            linePaths.watchTransition(renderWatch, 'line: linePaths')\n                .attr('d',\n                    d3.svg.line()\n                    .interpolate(interpolate)\n                    .defined(defined)\n                    .x(function(d,i) { return nv.utils.NaNtoZero(x(getX(d,i))) })\n                    .y(function(d,i) { return nv.utils.NaNtoZero(y(getY(d,i))) })\n            );\n\n            //store old scales for use in transitions on update\n            x0 = x.copy();\n            y0 = y.copy();\n        });\n        renderWatch.renderEnd('line immediate');\n        return chart;\n    }\n\n\n    //============================================================\n    // Expose Public Variables\n    //------------------------------------------------------------\n\n    chart.dispatch = dispatch;\n    chart.scatter = scatter;\n    // Pass through events\n    scatter.dispatch.on('elementClick', function(){ dispatch.elementClick.apply(this, arguments); });\n    scatter.dispatch.on('elementMouseover', function(){ dispatch.elementMouseover.apply(this, arguments); });\n    scatter.dispatch.on('elementMouseout', function(){ dispatch.elementMouseout.apply(this, arguments); });\n\n    chart.options = nv.utils.optionsFunc.bind(chart);\n\n    chart._options = Object.create({}, {\n        // simple options, just get/set the necessary values\n        width:      {get: function(){return width;}, set: function(_){width=_;}},\n        height:     {get: function(){return height;}, set: function(_){height=_;}},\n        defined: {get: function(){return defined;}, set: function(_){defined=_;}},\n        interpolate:      {get: function(){return interpolate;}, set: function(_){interpolate=_;}},\n        clipEdge:    {get: function(){return clipEdge;}, set: function(_){clipEdge=_;}},\n\n        // options that require extra logic in the setter\n        margin: {get: function(){return margin;}, set: function(_){\n            margin.top    = _.top    !== undefined ? _.top    : margin.top;\n            margin.right  = _.right  !== undefined ? _.right  : margin.right;\n            margin.bottom = _.bottom !== undefined ? _.bottom : margin.bottom;\n            margin.left   = _.left   !== undefined ? _.left   : margin.left;\n        }},\n        duration: {get: function(){return duration;}, set: function(_){\n            duration = _;\n            renderWatch.reset(duration);\n            scatter.duration(duration);\n        }},\n        isArea: {get: function(){return isArea;}, set: function(_){\n            isArea = d3.functor(_);\n        }},\n        x: {get: function(){return getX;}, set: function(_){\n            getX = _;\n            scatter.x(_);\n        }},\n        y: {get: function(){return getY;}, set: function(_){\n            getY = _;\n            scatter.y(_);\n        }},\n        color:  {get: function(){return color;}, set: function(_){\n            color = nv.utils.getColor(_);\n            scatter.color(color);\n        }}\n    });\n\n    nv.utils.inheritOptions(chart, scatter);\n    nv.utils.initOptions(chart);\n\n    return chart;\n};\nnv.models.lineChart = function() {\n    \"use strict\";\n\n    //============================================================\n    // Public Variables with Default Settings\n    //------------------------------------------------------------\n\n    var lines = nv.models.line()\n        , xAxis = nv.models.axis()\n        , yAxis = nv.models.axis()\n        , legend = nv.models.legend()\n        , interactiveLayer = nv.interactiveGuideline()\n        , tooltip = nv.models.tooltip()\n        ;\n\n    var margin = {top: 30, right: 20, bottom: 50, left: 60}\n        , color = nv.utils.defaultColor()\n        , width = null\n        , height = null\n        , showLegend = true\n        , showXAxis = true\n        , showYAxis = true\n        , rightAlignYAxis = false\n        , useInteractiveGuideline = false\n        , x\n        , y\n        , state = nv.utils.state()\n        , defaultState = null\n        , noData = null\n        , dispatch = d3.dispatch('tooltipShow', 'tooltipHide', 'stateChange', 'changeState', 'renderEnd')\n        , duration = 250\n        ;\n\n    // set options on sub-objects for this chart\n    xAxis.orient('bottom').tickPadding(7);\n    yAxis.orient(rightAlignYAxis ? 'right' : 'left');\n    tooltip.valueFormatter(function(d, i) {\n        return yAxis.tickFormat()(d, i);\n    }).headerFormatter(function(d, i) {\n        return xAxis.tickFormat()(d, i);\n    });\n\n\n    //============================================================\n    // Private Variables\n    //------------------------------------------------------------\n\n    var renderWatch = nv.utils.renderWatch(dispatch, duration);\n\n    var stateGetter = function(data) {\n        return function(){\n            return {\n                active: data.map(function(d) { return !d.disabled })\n            };\n        }\n    };\n\n    var stateSetter = function(data) {\n        return function(state) {\n            if (state.active !== undefined)\n                data.forEach(function(series,i) {\n                    series.disabled = !state.active[i];\n                });\n        }\n    };\n\n    function chart(selection) {\n        renderWatch.reset();\n        renderWatch.models(lines);\n        if (showXAxis) renderWatch.models(xAxis);\n        if (showYAxis) renderWatch.models(yAxis);\n\n        selection.each(function(data) {\n            var container = d3.select(this),\n                that = this;\n            nv.utils.initSVG(container);\n            var availableWidth = nv.utils.availableWidth(width, container, margin),\n                availableHeight = nv.utils.availableHeight(height, container, margin);\n\n            chart.update = function() {\n                if (duration === 0)\n                    container.call(chart);\n                else\n                    container.transition().duration(duration).call(chart)\n            };\n            chart.container = this;\n\n            state\n                .setter(stateSetter(data), chart.update)\n                .getter(stateGetter(data))\n                .update();\n\n            // DEPRECATED set state.disableddisabled\n            state.disabled = data.map(function(d) { return !!d.disabled });\n\n            if (!defaultState) {\n                var key;\n                defaultState = {};\n                for (key in state) {\n                    if (state[key] instanceof Array)\n                        defaultState[key] = state[key].slice(0);\n                    else\n                        defaultState[key] = state[key];\n                }\n            }\n\n            // Display noData message if there's nothing to show.\n            if (!data || !data.length || !data.filter(function(d) { return d.values.length }).length) {\n                nv.utils.noData(chart, container)\n                return chart;\n            } else {\n                container.selectAll('.nv-noData').remove();\n            }\n\n\n            // Setup Scales\n            x = lines.xScale();\n            y = lines.yScale();\n\n            // Setup containers and skeleton of chart\n            var wrap = container.selectAll('g.nv-wrap.nv-lineChart').data([data]);\n            var gEnter = wrap.enter().append('g').attr('class', 'nvd3 nv-wrap nv-lineChart').append('g');\n            var g = wrap.select('g');\n\n            gEnter.append(\"rect\").style(\"opacity\",0);\n            gEnter.append('g').attr('class', 'nv-x nv-axis');\n            gEnter.append('g').attr('class', 'nv-y nv-axis');\n            gEnter.append('g').attr('class', 'nv-linesWrap');\n            gEnter.append('g').attr('class', 'nv-legendWrap');\n            gEnter.append('g').attr('class', 'nv-interactive');\n\n            g.select(\"rect\")\n                .attr(\"width\",availableWidth)\n                .attr(\"height\",(availableHeight > 0) ? availableHeight : 0);\n\n            // Legend\n            if (showLegend) {\n                legend.width(availableWidth);\n\n                g.select('.nv-legendWrap')\n                    .datum(data)\n                    .call(legend);\n\n                if ( margin.top != legend.height()) {\n                    margin.top = legend.height();\n                    availableHeight = nv.utils.availableHeight(height, container, margin);\n                }\n\n                wrap.select('.nv-legendWrap')\n                    .attr('transform', 'translate(0,' + (-margin.top) +')')\n            }\n\n            wrap.attr('transform', 'translate(' + margin.left + ',' + margin.top + ')');\n\n            if (rightAlignYAxis) {\n                g.select(\".nv-y.nv-axis\")\n                    .attr(\"transform\", \"translate(\" + availableWidth + \",0)\");\n            }\n\n            //Set up interactive layer\n            if (useInteractiveGuideline) {\n                interactiveLayer\n                    .width(availableWidth)\n                    .height(availableHeight)\n                    .margin({left:margin.left, top:margin.top})\n                    .svgContainer(container)\n                    .xScale(x);\n                wrap.select(\".nv-interactive\").call(interactiveLayer);\n            }\n\n            lines\n                .width(availableWidth)\n                .height(availableHeight)\n                .color(data.map(function(d,i) {\n                    return d.color || color(d, i);\n                }).filter(function(d,i) { return !data[i].disabled }));\n\n\n            var linesWrap = g.select('.nv-linesWrap')\n                .datum(data.filter(function(d) { return !d.disabled }));\n\n            linesWrap.call(lines);\n\n            // Setup Axes\n            if (showXAxis) {\n                xAxis\n                    .scale(x)\n                    ._ticks(nv.utils.calcTicksX(availableWidth/100, data) )\n                    .tickSize(-availableHeight, 0);\n\n                g.select('.nv-x.nv-axis')\n                    .attr('transform', 'translate(0,' + y.range()[0] + ')');\n                g.select('.nv-x.nv-axis')\n                    .call(xAxis);\n            }\n\n            if (showYAxis) {\n                yAxis\n                    .scale(y)\n                    ._ticks(nv.utils.calcTicksY(availableHeight/36, data) )\n                    .tickSize( -availableWidth, 0);\n\n                g.select('.nv-y.nv-axis')\n                    .call(yAxis);\n            }\n\n            //============================================================\n            // Event Handling/Dispatching (in chart's scope)\n            //------------------------------------------------------------\n\n            legend.dispatch.on('stateChange', function(newState) {\n                for (var key in newState)\n                    state[key] = newState[key];\n                dispatch.stateChange(state);\n                chart.update();\n            });\n\n            interactiveLayer.dispatch.on('elementMousemove', function(e) {\n                lines.clearHighlights();\n                var singlePoint, pointIndex, pointXLocation, allData = [];\n                data\n                    .filter(function(series, i) {\n                        series.seriesIndex = i;\n                        return !series.disabled;\n                    })\n                    .forEach(function(series,i) {\n                        pointIndex = nv.interactiveBisect(series.values, e.pointXValue, chart.x());\n                        var point = series.values[pointIndex];\n                        var pointYValue = chart.y()(point, pointIndex);\n                        if (pointYValue != null) {\n                            lines.highlightPoint(i, pointIndex, true);\n                        }\n                        if (point === undefined) return;\n                        if (singlePoint === undefined) singlePoint = point;\n                        if (pointXLocation === undefined) pointXLocation = chart.xScale()(chart.x()(point,pointIndex));\n                        allData.push({\n                            key: series.key,\n                            value: pointYValue,\n                            color: color(series,series.seriesIndex)\n                        });\n                    });\n                //Highlight the tooltip entry based on which point the mouse is closest to.\n                if (allData.length > 2) {\n                    var yValue = chart.yScale().invert(e.mouseY);\n                    var domainExtent = Math.abs(chart.yScale().domain()[0] - chart.yScale().domain()[1]);\n                    var threshold = 0.03 * domainExtent;\n                    var indexToHighlight = nv.nearestValueIndex(allData.map(function(d){return d.value}),yValue,threshold);\n                    if (indexToHighlight !== null)\n                        allData[indexToHighlight].highlight = true;\n                }\n\n                var xValue = xAxis.tickFormat()(chart.x()(singlePoint,pointIndex));\n                interactiveLayer.tooltip\n                    .position({left: e.mouseX + margin.left, top: e.mouseY + margin.top})\n                    .chartContainer(that.parentNode)\n                    .valueFormatter(function(d,i) {\n                        return d == null ? \"N/A\" : yAxis.tickFormat()(d);\n                    })\n                    .data({\n                        value: xValue,\n                        index: pointIndex,\n                        series: allData\n                    })();\n\n                interactiveLayer.renderGuideLine(pointXLocation);\n\n            });\n\n            interactiveLayer.dispatch.on('elementClick', function(e) {\n                var pointXLocation, allData = [];\n\n                data.filter(function(series, i) {\n                    series.seriesIndex = i;\n                    return !series.disabled;\n                }).forEach(function(series) {\n                    var pointIndex = nv.interactiveBisect(series.values, e.pointXValue, chart.x());\n                    var point = series.values[pointIndex];\n                    if (typeof point === 'undefined') return;\n                    if (typeof pointXLocation === 'undefined') pointXLocation = chart.xScale()(chart.x()(point,pointIndex));\n                    var yPos = chart.yScale()(chart.y()(point,pointIndex));\n                    allData.push({\n                        point: point,\n                        pointIndex: pointIndex,\n                        pos: [pointXLocation, yPos],\n                        seriesIndex: series.seriesIndex,\n                        series: series\n                    });\n                });\n\n                lines.dispatch.elementClick(allData);\n            });\n\n            interactiveLayer.dispatch.on(\"elementMouseout\",function(e) {\n                lines.clearHighlights();\n            });\n\n            dispatch.on('changeState', function(e) {\n                if (typeof e.disabled !== 'undefined' && data.length === e.disabled.length) {\n                    data.forEach(function(series,i) {\n                        series.disabled = e.disabled[i];\n                    });\n\n                    state.disabled = e.disabled;\n                }\n\n                chart.update();\n            });\n\n        });\n\n        renderWatch.renderEnd('lineChart immediate');\n        return chart;\n    }\n\n    //============================================================\n    // Event Handling/Dispatching (out of chart's scope)\n    //------------------------------------------------------------\n\n    lines.dispatch.on('elementMouseover.tooltip', function(evt) {\n        tooltip.data(evt).position(evt.pos).hidden(false);\n    });\n\n    lines.dispatch.on('elementMouseout.tooltip', function(evt) {\n        tooltip.hidden(true)\n    });\n\n    //============================================================\n    // Expose Public Variables\n    //------------------------------------------------------------\n\n    // expose chart's sub-components\n    chart.dispatch = dispatch;\n    chart.lines = lines;\n    chart.legend = legend;\n    chart.xAxis = xAxis;\n    chart.yAxis = yAxis;\n    chart.interactiveLayer = interactiveLayer;\n    chart.tooltip = tooltip;\n\n    chart.dispatch = dispatch;\n    chart.options = nv.utils.optionsFunc.bind(chart);\n\n    chart._options = Object.create({}, {\n        // simple options, just get/set the necessary values\n        width:      {get: function(){return width;}, set: function(_){width=_;}},\n        height:     {get: function(){return height;}, set: function(_){height=_;}},\n        showLegend: {get: function(){return showLegend;}, set: function(_){showLegend=_;}},\n        showXAxis:      {get: function(){return showXAxis;}, set: function(_){showXAxis=_;}},\n        showYAxis:    {get: function(){return showYAxis;}, set: function(_){showYAxis=_;}},\n        defaultState:    {get: function(){return defaultState;}, set: function(_){defaultState=_;}},\n        noData:    {get: function(){return noData;}, set: function(_){noData=_;}},\n\n        // deprecated options\n        tooltips:    {get: function(){return tooltip.enabled();}, set: function(_){\n            // deprecated after 1.7.1\n            nv.deprecated('tooltips', 'use chart.tooltip.enabled() instead');\n            tooltip.enabled(!!_);\n        }},\n        tooltipContent:    {get: function(){return tooltip.contentGenerator();}, set: function(_){\n            // deprecated after 1.7.1\n            nv.deprecated('tooltipContent', 'use chart.tooltip.contentGenerator() instead');\n            tooltip.contentGenerator(_);\n        }},\n\n        // options that require extra logic in the setter\n        margin: {get: function(){return margin;}, set: function(_){\n            margin.top    = _.top    !== undefined ? _.top    : margin.top;\n            margin.right  = _.right  !== undefined ? _.right  : margin.right;\n            margin.bottom = _.bottom !== undefined ? _.bottom : margin.bottom;\n            margin.left   = _.left   !== undefined ? _.left   : margin.left;\n        }},\n        duration: {get: function(){return duration;}, set: function(_){\n            duration = _;\n            renderWatch.reset(duration);\n            lines.duration(duration);\n            xAxis.duration(duration);\n            yAxis.duration(duration);\n        }},\n        color:  {get: function(){return color;}, set: function(_){\n            color = nv.utils.getColor(_);\n            legend.color(color);\n            lines.color(color);\n        }},\n        rightAlignYAxis: {get: function(){return rightAlignYAxis;}, set: function(_){\n            rightAlignYAxis = _;\n            yAxis.orient( rightAlignYAxis ? 'right' : 'left');\n        }},\n        useInteractiveGuideline: {get: function(){return useInteractiveGuideline;}, set: function(_){\n            useInteractiveGuideline = _;\n            if (useInteractiveGuideline) {\n                lines.interactive(false);\n                lines.useVoronoi(false);\n            }\n        }}\n    });\n\n    nv.utils.inheritOptions(chart, lines);\n    nv.utils.initOptions(chart);\n\n    return chart;\n};\nnv.models.linePlusBarChart = function() {\n    \"use strict\";\n\n    //============================================================\n    // Public Variables with Default Settings\n    //------------------------------------------------------------\n\n    var lines = nv.models.line()\n        , lines2 = nv.models.line()\n        , bars = nv.models.historicalBar()\n        , bars2 = nv.models.historicalBar()\n        , xAxis = nv.models.axis()\n        , x2Axis = nv.models.axis()\n        , y1Axis = nv.models.axis()\n        , y2Axis = nv.models.axis()\n        , y3Axis = nv.models.axis()\n        , y4Axis = nv.models.axis()\n        , legend = nv.models.legend()\n        , brush = d3.svg.brush()\n        , tooltip = nv.models.tooltip()\n        ;\n\n    var margin = {top: 30, right: 30, bottom: 30, left: 60}\n        , margin2 = {top: 0, right: 30, bottom: 20, left: 60}\n        , width = null\n        , height = null\n        , getX = function(d) { return d.x }\n        , getY = function(d) { return d.y }\n        , color = nv.utils.defaultColor()\n        , showLegend = true\n        , focusEnable = true\n        , focusShowAxisY = false\n        , focusShowAxisX = true\n        , focusHeight = 50\n        , extent\n        , brushExtent = null\n        , x\n        , x2\n        , y1\n        , y2\n        , y3\n        , y4\n        , noData = null\n        , dispatch = d3.dispatch('brush', 'stateChange', 'changeState')\n        , transitionDuration = 0\n        , state = nv.utils.state()\n        , defaultState = null\n        , legendLeftAxisHint = ' (left axis)'\n        , legendRightAxisHint = ' (right axis)'\n        ;\n\n    lines.clipEdge(true);\n    lines2.interactive(false);\n    xAxis.orient('bottom').tickPadding(5);\n    y1Axis.orient('left');\n    y2Axis.orient('right');\n    x2Axis.orient('bottom').tickPadding(5);\n    y3Axis.orient('left');\n    y4Axis.orient('right');\n\n    tooltip.headerEnabled(true).headerFormatter(function(d, i) {\n        return xAxis.tickFormat()(d, i);\n    });\n\n    //============================================================\n    // Private Variables\n    //------------------------------------------------------------\n\n    var stateGetter = function(data) {\n        return function(){\n            return {\n                active: data.map(function(d) { return !d.disabled })\n            };\n        }\n    };\n\n    var stateSetter = function(data) {\n        return function(state) {\n            if (state.active !== undefined)\n                data.forEach(function(series,i) {\n                    series.disabled = !state.active[i];\n                });\n        }\n    };\n\n    function chart(selection) {\n        selection.each(function(data) {\n            var container = d3.select(this),\n                that = this;\n            nv.utils.initSVG(container);\n            var availableWidth = nv.utils.availableWidth(width, container, margin),\n                availableHeight1 = nv.utils.availableHeight(height, container, margin)\n                    - (focusEnable ? focusHeight : 0),\n                availableHeight2 = focusHeight - margin2.top - margin2.bottom;\n\n            chart.update = function() { container.transition().duration(transitionDuration).call(chart); };\n            chart.container = this;\n\n            state\n                .setter(stateSetter(data), chart.update)\n                .getter(stateGetter(data))\n                .update();\n\n            // DEPRECATED set state.disableddisabled\n            state.disabled = data.map(function(d) { return !!d.disabled });\n\n            if (!defaultState) {\n                var key;\n                defaultState = {};\n                for (key in state) {\n                    if (state[key] instanceof Array)\n                        defaultState[key] = state[key].slice(0);\n                    else\n                        defaultState[key] = state[key];\n                }\n            }\n\n            // Display No Data message if there's nothing to show.\n            if (!data || !data.length || !data.filter(function(d) { return d.values.length }).length) {\n                nv.utils.noData(chart, container)\n                return chart;\n            } else {\n                container.selectAll('.nv-noData').remove();\n            }\n\n            // Setup Scales\n            var dataBars = data.filter(function(d) { return !d.disabled && d.bar });\n            var dataLines = data.filter(function(d) { return !d.bar }); // removed the !d.disabled clause here to fix Issue #240\n\n            x = bars.xScale();\n            x2 = x2Axis.scale();\n            y1 = bars.yScale();\n            y2 = lines.yScale();\n            y3 = bars2.yScale();\n            y4 = lines2.yScale();\n\n            var series1 = data\n                .filter(function(d) { return !d.disabled && d.bar })\n                .map(function(d) {\n                    return d.values.map(function(d,i) {\n                        return { x: getX(d,i), y: getY(d,i) }\n                    })\n                });\n\n            var series2 = data\n                .filter(function(d) { return !d.disabled && !d.bar })\n                .map(function(d) {\n                    return d.values.map(function(d,i) {\n                        return { x: getX(d,i), y: getY(d,i) }\n                    })\n                });\n\n            x.range([0, availableWidth]);\n\n            x2  .domain(d3.extent(d3.merge(series1.concat(series2)), function(d) { return d.x } ))\n                .range([0, availableWidth]);\n\n            // Setup containers and skeleton of chart\n            var wrap = container.selectAll('g.nv-wrap.nv-linePlusBar').data([data]);\n            var gEnter = wrap.enter().append('g').attr('class', 'nvd3 nv-wrap nv-linePlusBar').append('g');\n            var g = wrap.select('g');\n\n            gEnter.append('g').attr('class', 'nv-legendWrap');\n\n            // this is the main chart\n            var focusEnter = gEnter.append('g').attr('class', 'nv-focus');\n            focusEnter.append('g').attr('class', 'nv-x nv-axis');\n            focusEnter.append('g').attr('class', 'nv-y1 nv-axis');\n            focusEnter.append('g').attr('class', 'nv-y2 nv-axis');\n            focusEnter.append('g').attr('class', 'nv-barsWrap');\n            focusEnter.append('g').attr('class', 'nv-linesWrap');\n\n            // context chart is where you can focus in\n            var contextEnter = gEnter.append('g').attr('class', 'nv-context');\n            contextEnter.append('g').attr('class', 'nv-x nv-axis');\n            contextEnter.append('g').attr('class', 'nv-y1 nv-axis');\n            contextEnter.append('g').attr('class', 'nv-y2 nv-axis');\n            contextEnter.append('g').attr('class', 'nv-barsWrap');\n            contextEnter.append('g').attr('class', 'nv-linesWrap');\n            contextEnter.append('g').attr('class', 'nv-brushBackground');\n            contextEnter.append('g').attr('class', 'nv-x nv-brush');\n\n            //============================================================\n            // Legend\n            //------------------------------------------------------------\n\n            if (showLegend) {\n                var legendWidth = legend.align() ? availableWidth / 2 : availableWidth;\n                var legendXPosition = legend.align() ? legendWidth : 0;\n\n                legend.width(legendWidth);\n\n                g.select('.nv-legendWrap')\n                    .datum(data.map(function(series) {\n                        series.originalKey = series.originalKey === undefined ? series.key : series.originalKey;\n                        series.key = series.originalKey + (series.bar ? legendLeftAxisHint : legendRightAxisHint);\n                        return series;\n                    }))\n                    .call(legend);\n\n                if ( margin.top != legend.height()) {\n                    margin.top = legend.height();\n                    // FIXME: shouldn't this be \"- (focusEnabled ? focusHeight : 0)\"?\n                    availableHeight1 = nv.utils.availableHeight(height, container, margin) - focusHeight;\n                }\n\n                g.select('.nv-legendWrap')\n                    .attr('transform', 'translate(' + legendXPosition + ',' + (-margin.top) +')');\n            }\n\n            wrap.attr('transform', 'translate(' + margin.left + ',' + margin.top + ')');\n\n            //============================================================\n            // Context chart (focus chart) components\n            //------------------------------------------------------------\n\n            // hide or show the focus context chart\n            g.select('.nv-context').style('display', focusEnable ? 'initial' : 'none');\n\n            bars2\n                .width(availableWidth)\n                .height(availableHeight2)\n                .color(data.map(function (d, i) {\n                    return d.color || color(d, i);\n                }).filter(function (d, i) {\n                    return !data[i].disabled && data[i].bar\n                }));\n            lines2\n                .width(availableWidth)\n                .height(availableHeight2)\n                .color(data.map(function (d, i) {\n                    return d.color || color(d, i);\n                }).filter(function (d, i) {\n                    return !data[i].disabled && !data[i].bar\n                }));\n\n            var bars2Wrap = g.select('.nv-context .nv-barsWrap')\n                .datum(dataBars.length ? dataBars : [\n                    {values: []}\n                ]);\n            var lines2Wrap = g.select('.nv-context .nv-linesWrap')\n                .datum(!dataLines[0].disabled ? dataLines : [\n                    {values: []}\n                ]);\n\n            g.select('.nv-context')\n                .attr('transform', 'translate(0,' + ( availableHeight1 + margin.bottom + margin2.top) + ')');\n\n            bars2Wrap.transition().call(bars2);\n            lines2Wrap.transition().call(lines2);\n\n            // context (focus chart) axis controls\n            if (focusShowAxisX) {\n                x2Axis\n                    ._ticks( nv.utils.calcTicksX(availableWidth / 100, data))\n                    .tickSize(-availableHeight2, 0);\n                g.select('.nv-context .nv-x.nv-axis')\n                    .attr('transform', 'translate(0,' + y3.range()[0] + ')');\n                g.select('.nv-context .nv-x.nv-axis').transition()\n                    .call(x2Axis);\n            }\n\n            if (focusShowAxisY) {\n                y3Axis\n                    .scale(y3)\n                    ._ticks( availableHeight2 / 36 )\n                    .tickSize( -availableWidth, 0);\n                y4Axis\n                    .scale(y4)\n                    ._ticks( availableHeight2 / 36 )\n                    .tickSize(dataBars.length ? 0 : -availableWidth, 0); // Show the y2 rules only if y1 has none\n\n                g.select('.nv-context .nv-y3.nv-axis')\n                    .style('opacity', dataBars.length ? 1 : 0)\n                    .attr('transform', 'translate(0,' + x2.range()[0] + ')');\n                g.select('.nv-context .nv-y2.nv-axis')\n                    .style('opacity', dataLines.length ? 1 : 0)\n                    .attr('transform', 'translate(' + x2.range()[1] + ',0)');\n\n                g.select('.nv-context .nv-y1.nv-axis').transition()\n                    .call(y3Axis);\n                g.select('.nv-context .nv-y2.nv-axis').transition()\n                    .call(y4Axis);\n            }\n\n            // Setup Brush\n            brush.x(x2).on('brush', onBrush);\n\n            if (brushExtent) brush.extent(brushExtent);\n\n            var brushBG = g.select('.nv-brushBackground').selectAll('g')\n                .data([brushExtent || brush.extent()]);\n\n            var brushBGenter = brushBG.enter()\n                .append('g');\n\n            brushBGenter.append('rect')\n                .attr('class', 'left')\n                .attr('x', 0)\n                .attr('y', 0)\n                .attr('height', availableHeight2);\n\n            brushBGenter.append('rect')\n                .attr('class', 'right')\n                .attr('x', 0)\n                .attr('y', 0)\n                .attr('height', availableHeight2);\n\n            var gBrush = g.select('.nv-x.nv-brush')\n                .call(brush);\n            gBrush.selectAll('rect')\n                //.attr('y', -5)\n                .attr('height', availableHeight2);\n            gBrush.selectAll('.resize').append('path').attr('d', resizePath);\n\n            //============================================================\n            // Event Handling/Dispatching (in chart's scope)\n            //------------------------------------------------------------\n\n            legend.dispatch.on('stateChange', function(newState) {\n                for (var key in newState)\n                    state[key] = newState[key];\n                dispatch.stateChange(state);\n                chart.update();\n            });\n\n            // Update chart from a state object passed to event handler\n            dispatch.on('changeState', function(e) {\n                if (typeof e.disabled !== 'undefined') {\n                    data.forEach(function(series,i) {\n                        series.disabled = e.disabled[i];\n                    });\n                    state.disabled = e.disabled;\n                }\n                chart.update();\n            });\n\n            //============================================================\n            // Functions\n            //------------------------------------------------------------\n\n            // Taken from crossfilter (http://square.github.com/crossfilter/)\n            function resizePath(d) {\n                var e = +(d == 'e'),\n                    x = e ? 1 : -1,\n                    y = availableHeight2 / 3;\n                return 'M' + (.5 * x) + ',' + y\n                    + 'A6,6 0 0 ' + e + ' ' + (6.5 * x) + ',' + (y + 6)\n                    + 'V' + (2 * y - 6)\n                    + 'A6,6 0 0 ' + e + ' ' + (.5 * x) + ',' + (2 * y)\n                    + 'Z'\n                    + 'M' + (2.5 * x) + ',' + (y + 8)\n                    + 'V' + (2 * y - 8)\n                    + 'M' + (4.5 * x) + ',' + (y + 8)\n                    + 'V' + (2 * y - 8);\n            }\n\n\n            function updateBrushBG() {\n                if (!brush.empty()) brush.extent(brushExtent);\n                brushBG\n                    .data([brush.empty() ? x2.domain() : brushExtent])\n                    .each(function(d,i) {\n                        var leftWidth = x2(d[0]) - x2.range()[0],\n                            rightWidth = x2.range()[1] - x2(d[1]);\n                        d3.select(this).select('.left')\n                            .attr('width',  leftWidth < 0 ? 0 : leftWidth);\n\n                        d3.select(this).select('.right')\n                            .attr('x', x2(d[1]))\n                            .attr('width', rightWidth < 0 ? 0 : rightWidth);\n                    });\n            }\n\n            function onBrush() {\n                brushExtent = brush.empty() ? null : brush.extent();\n                extent = brush.empty() ? x2.domain() : brush.extent();\n                dispatch.brush({extent: extent, brush: brush});\n                updateBrushBG();\n\n                // Prepare Main (Focus) Bars and Lines\n                bars\n                    .width(availableWidth)\n                    .height(availableHeight1)\n                    .color(data.map(function(d,i) {\n                        return d.color || color(d, i);\n                    }).filter(function(d,i) { return !data[i].disabled && data[i].bar }));\n\n                lines\n                    .width(availableWidth)\n                    .height(availableHeight1)\n                    .color(data.map(function(d,i) {\n                        return d.color || color(d, i);\n                    }).filter(function(d,i) { return !data[i].disabled && !data[i].bar }));\n\n                var focusBarsWrap = g.select('.nv-focus .nv-barsWrap')\n                    .datum(!dataBars.length ? [{values:[]}] :\n                        dataBars\n                            .map(function(d,i) {\n                                return {\n                                    key: d.key,\n                                    values: d.values.filter(function(d,i) {\n                                        return bars.x()(d,i) >= extent[0] && bars.x()(d,i) <= extent[1];\n                                    })\n                                }\n                            })\n                );\n\n                var focusLinesWrap = g.select('.nv-focus .nv-linesWrap')\n                    .datum(dataLines[0].disabled ? [{values:[]}] :\n                        dataLines\n                            .map(function(d,i) {\n                                return {\n                                    area: d.area,\n                                    fillOpacity: d.fillOpacity,\n                                    key: d.key,\n                                    values: d.values.filter(function(d,i) {\n                                        return lines.x()(d,i) >= extent[0] && lines.x()(d,i) <= extent[1];\n                                    })\n                                }\n                            })\n                );\n\n                // Update Main (Focus) X Axis\n                if (dataBars.length) {\n                    x = bars.xScale();\n                } else {\n                    x = lines.xScale();\n                }\n\n                xAxis\n                    .scale(x)\n                    ._ticks( nv.utils.calcTicksX(availableWidth/100, data) )\n                    .tickSize(-availableHeight1, 0);\n\n                xAxis.domain([Math.ceil(extent[0]), Math.floor(extent[1])]);\n\n                g.select('.nv-x.nv-axis').transition().duration(transitionDuration)\n                    .call(xAxis);\n\n                // Update Main (Focus) Bars and Lines\n                focusBarsWrap.transition().duration(transitionDuration).call(bars);\n                focusLinesWrap.transition().duration(transitionDuration).call(lines);\n\n                // Setup and Update Main (Focus) Y Axes\n                g.select('.nv-focus .nv-x.nv-axis')\n                    .attr('transform', 'translate(0,' + y1.range()[0] + ')');\n\n                y1Axis\n                    .scale(y1)\n                    ._ticks( nv.utils.calcTicksY(availableHeight1/36, data) )\n                    .tickSize(-availableWidth, 0);\n                y2Axis\n                    .scale(y2)\n                    ._ticks( nv.utils.calcTicksY(availableHeight1/36, data) )\n                    .tickSize(dataBars.length ? 0 : -availableWidth, 0); // Show the y2 rules only if y1 has none\n\n                g.select('.nv-focus .nv-y1.nv-axis')\n                    .style('opacity', dataBars.length ? 1 : 0);\n                g.select('.nv-focus .nv-y2.nv-axis')\n                    .style('opacity', dataLines.length && !dataLines[0].disabled ? 1 : 0)\n                    .attr('transform', 'translate(' + x.range()[1] + ',0)');\n\n                g.select('.nv-focus .nv-y1.nv-axis').transition().duration(transitionDuration)\n                    .call(y1Axis);\n                g.select('.nv-focus .nv-y2.nv-axis').transition().duration(transitionDuration)\n                    .call(y2Axis);\n            }\n\n            onBrush();\n\n        });\n\n        return chart;\n    }\n\n    //============================================================\n    // Event Handling/Dispatching (out of chart's scope)\n    //------------------------------------------------------------\n\n    lines.dispatch.on('elementMouseover.tooltip', function(evt) {\n        tooltip\n            .duration(100)\n            .valueFormatter(function(d, i) {\n                return y2Axis.tickFormat()(d, i);\n            })\n            .data(evt)\n            .position(evt.pos)\n            .hidden(false);\n    });\n\n    lines.dispatch.on('elementMouseout.tooltip', function(evt) {\n        tooltip.hidden(true)\n    });\n\n    bars.dispatch.on('elementMouseover.tooltip', function(evt) {\n        evt.value = chart.x()(evt.data);\n        evt['series'] = {\n            value: chart.y()(evt.data),\n            color: evt.color\n        };\n        tooltip\n            .duration(0)\n            .valueFormatter(function(d, i) {\n                return y1Axis.tickFormat()(d, i);\n            })\n            .data(evt)\n            .hidden(false);\n    });\n\n    bars.dispatch.on('elementMouseout.tooltip', function(evt) {\n        tooltip.hidden(true);\n    });\n\n    bars.dispatch.on('elementMousemove.tooltip', function(evt) {\n        tooltip.position({top: d3.event.pageY, left: d3.event.pageX})();\n    });\n\n    //============================================================\n\n\n    //============================================================\n    // Expose Public Variables\n    //------------------------------------------------------------\n\n    // expose chart's sub-components\n    chart.dispatch = dispatch;\n    chart.legend = legend;\n    chart.lines = lines;\n    chart.lines2 = lines2;\n    chart.bars = bars;\n    chart.bars2 = bars2;\n    chart.xAxis = xAxis;\n    chart.x2Axis = x2Axis;\n    chart.y1Axis = y1Axis;\n    chart.y2Axis = y2Axis;\n    chart.y3Axis = y3Axis;\n    chart.y4Axis = y4Axis;\n    chart.tooltip = tooltip;\n\n    chart.options = nv.utils.optionsFunc.bind(chart);\n\n    chart._options = Object.create({}, {\n        // simple options, just get/set the necessary values\n        width:      {get: function(){return width;}, set: function(_){width=_;}},\n        height:     {get: function(){return height;}, set: function(_){height=_;}},\n        showLegend: {get: function(){return showLegend;}, set: function(_){showLegend=_;}},\n        brushExtent:    {get: function(){return brushExtent;}, set: function(_){brushExtent=_;}},\n        noData:    {get: function(){return noData;}, set: function(_){noData=_;}},\n        focusEnable:    {get: function(){return focusEnable;}, set: function(_){focusEnable=_;}},\n        focusHeight:    {get: function(){return focusHeight;}, set: function(_){focusHeight=_;}},\n        focusShowAxisX:    {get: function(){return focusShowAxisX;}, set: function(_){focusShowAxisX=_;}},\n        focusShowAxisY:    {get: function(){return focusShowAxisY;}, set: function(_){focusShowAxisY=_;}},\n        legendLeftAxisHint:    {get: function(){return legendLeftAxisHint;}, set: function(_){legendLeftAxisHint=_;}},\n        legendRightAxisHint:    {get: function(){return legendRightAxisHint;}, set: function(_){legendRightAxisHint=_;}},\n\n        // deprecated options\n        tooltips:    {get: function(){return tooltip.enabled();}, set: function(_){\n            // deprecated after 1.7.1\n            nv.deprecated('tooltips', 'use chart.tooltip.enabled() instead');\n            tooltip.enabled(!!_);\n        }},\n        tooltipContent:    {get: function(){return tooltip.contentGenerator();}, set: function(_){\n            // deprecated after 1.7.1\n            nv.deprecated('tooltipContent', 'use chart.tooltip.contentGenerator() instead');\n            tooltip.contentGenerator(_);\n        }},\n\n        // options that require extra logic in the setter\n        margin: {get: function(){return margin;}, set: function(_){\n            margin.top    = _.top    !== undefined ? _.top    : margin.top;\n            margin.right  = _.right  !== undefined ? _.right  : margin.right;\n            margin.bottom = _.bottom !== undefined ? _.bottom : margin.bottom;\n            margin.left   = _.left   !== undefined ? _.left   : margin.left;\n        }},\n        duration: {get: function(){return transitionDuration;}, set: function(_){\n            transitionDuration = _;\n        }},\n        color:  {get: function(){return color;}, set: function(_){\n            color = nv.utils.getColor(_);\n            legend.color(color);\n        }},\n        x: {get: function(){return getX;}, set: function(_){\n            getX = _;\n            lines.x(_);\n            lines2.x(_);\n            bars.x(_);\n            bars2.x(_);\n        }},\n        y: {get: function(){return getY;}, set: function(_){\n            getY = _;\n            lines.y(_);\n            lines2.y(_);\n            bars.y(_);\n            bars2.y(_);\n        }}\n    });\n\n    nv.utils.inheritOptions(chart, lines);\n    nv.utils.initOptions(chart);\n\n    return chart;\n};\nnv.models.lineWithFocusChart = function() {\n    \"use strict\";\n\n    //============================================================\n    // Public Variables with Default Settings\n    //------------------------------------------------------------\n\n    var lines = nv.models.line()\n        , lines2 = nv.models.line()\n        , xAxis = nv.models.axis()\n        , yAxis = nv.models.axis()\n        , x2Axis = nv.models.axis()\n        , y2Axis = nv.models.axis()\n        , legend = nv.models.legend()\n        , brush = d3.svg.brush()\n        , tooltip = nv.models.tooltip()\n        , interactiveLayer = nv.interactiveGuideline()\n        ;\n\n    var margin = {top: 30, right: 30, bottom: 30, left: 60}\n        , margin2 = {top: 0, right: 30, bottom: 20, left: 60}\n        , color = nv.utils.defaultColor()\n        , width = null\n        , height = null\n        , height2 = 50\n        , useInteractiveGuideline = false\n        , x\n        , y\n        , x2\n        , y2\n        , showLegend = true\n        , brushExtent = null\n        , noData = null\n        , dispatch = d3.dispatch('brush', 'stateChange', 'changeState')\n        , transitionDuration = 250\n        , state = nv.utils.state()\n        , defaultState = null\n        ;\n\n    lines.clipEdge(true).duration(0);\n    lines2.interactive(false);\n    xAxis.orient('bottom').tickPadding(5);\n    yAxis.orient('left');\n    x2Axis.orient('bottom').tickPadding(5);\n    y2Axis.orient('left');\n\n    tooltip.valueFormatter(function(d, i) {\n        return yAxis.tickFormat()(d, i);\n    }).headerFormatter(function(d, i) {\n        return xAxis.tickFormat()(d, i);\n    });\n\n    //============================================================\n    // Private Variables\n    //------------------------------------------------------------\n\n    var stateGetter = function(data) {\n        return function(){\n            return {\n                active: data.map(function(d) { return !d.disabled })\n            };\n        }\n    };\n\n    var stateSetter = function(data) {\n        return function(state) {\n            if (state.active !== undefined)\n                data.forEach(function(series,i) {\n                    series.disabled = !state.active[i];\n                });\n        }\n    };\n\n    function chart(selection) {\n        selection.each(function(data) {\n            var container = d3.select(this),\n                that = this;\n            nv.utils.initSVG(container);\n            var availableWidth = nv.utils.availableWidth(width, container, margin),\n                availableHeight1 = nv.utils.availableHeight(height, container, margin) - height2,\n                availableHeight2 = height2 - margin2.top - margin2.bottom;\n\n            chart.update = function() { container.transition().duration(transitionDuration).call(chart) };\n            chart.container = this;\n\n            state\n                .setter(stateSetter(data), chart.update)\n                .getter(stateGetter(data))\n                .update();\n\n            // DEPRECATED set state.disableddisabled\n            state.disabled = data.map(function(d) { return !!d.disabled });\n\n            if (!defaultState) {\n                var key;\n                defaultState = {};\n                for (key in state) {\n                    if (state[key] instanceof Array)\n                        defaultState[key] = state[key].slice(0);\n                    else\n                        defaultState[key] = state[key];\n                }\n            }\n\n            // Display No Data message if there's nothing to show.\n            if (!data || !data.length || !data.filter(function(d) { return d.values.length }).length) {\n                nv.utils.noData(chart, container)\n                return chart;\n            } else {\n                container.selectAll('.nv-noData').remove();\n            }\n\n            // Setup Scales\n            x = lines.xScale();\n            y = lines.yScale();\n            x2 = lines2.xScale();\n            y2 = lines2.yScale();\n\n            // Setup containers and skeleton of chart\n            var wrap = container.selectAll('g.nv-wrap.nv-lineWithFocusChart').data([data]);\n            var gEnter = wrap.enter().append('g').attr('class', 'nvd3 nv-wrap nv-lineWithFocusChart').append('g');\n            var g = wrap.select('g');\n\n            gEnter.append('g').attr('class', 'nv-legendWrap');\n\n            var focusEnter = gEnter.append('g').attr('class', 'nv-focus');\n            focusEnter.append('g').attr('class', 'nv-x nv-axis');\n            focusEnter.append('g').attr('class', 'nv-y nv-axis');\n            focusEnter.append('g').attr('class', 'nv-linesWrap');\n            focusEnter.append('g').attr('class', 'nv-interactive');\n\n            var contextEnter = gEnter.append('g').attr('class', 'nv-context');\n            contextEnter.append('g').attr('class', 'nv-x nv-axis');\n            contextEnter.append('g').attr('class', 'nv-y nv-axis');\n            contextEnter.append('g').attr('class', 'nv-linesWrap');\n            contextEnter.append('g').attr('class', 'nv-brushBackground');\n            contextEnter.append('g').attr('class', 'nv-x nv-brush');\n\n            // Legend\n            if (showLegend) {\n                legend.width(availableWidth);\n\n                g.select('.nv-legendWrap')\n                    .datum(data)\n                    .call(legend);\n\n                if ( margin.top != legend.height()) {\n                    margin.top = legend.height();\n                    availableHeight1 = nv.utils.availableHeight(height, container, margin) - height2;\n                }\n\n                g.select('.nv-legendWrap')\n                    .attr('transform', 'translate(0,' + (-margin.top) +')')\n            }\n\n            wrap.attr('transform', 'translate(' + margin.left + ',' + margin.top + ')');\n\n            \n            //Set up interactive layer\n            if (useInteractiveGuideline) {\n                interactiveLayer\n                    .width(availableWidth)\n                    .height(availableHeight1)\n                    .margin({left:margin.left, top:margin.top})\n                    .svgContainer(container)\n                    .xScale(x);\n                wrap.select(\".nv-interactive\").call(interactiveLayer);\n            }\n\n            // Main Chart Component(s)\n            lines\n                .width(availableWidth)\n                .height(availableHeight1)\n                .color(\n                data\n                    .map(function(d,i) {\n                        return d.color || color(d, i);\n                    })\n                    .filter(function(d,i) {\n                        return !data[i].disabled;\n                    })\n            );\n\n            lines2\n                .defined(lines.defined())\n                .width(availableWidth)\n                .height(availableHeight2)\n                .color(\n                data\n                    .map(function(d,i) {\n                        return d.color || color(d, i);\n                    })\n                    .filter(function(d,i) {\n                        return !data[i].disabled;\n                    })\n            );\n\n            g.select('.nv-context')\n                .attr('transform', 'translate(0,' + ( availableHeight1 + margin.bottom + margin2.top) + ')')\n\n            var contextLinesWrap = g.select('.nv-context .nv-linesWrap')\n                .datum(data.filter(function(d) { return !d.disabled }))\n\n            d3.transition(contextLinesWrap).call(lines2);\n\n            // Setup Main (Focus) Axes\n            xAxis\n                .scale(x)\n                ._ticks( nv.utils.calcTicksX(availableWidth/100, data) )\n                .tickSize(-availableHeight1, 0);\n\n            yAxis\n                .scale(y)\n                ._ticks( nv.utils.calcTicksY(availableHeight1/36, data) )\n                .tickSize( -availableWidth, 0);\n\n            g.select('.nv-focus .nv-x.nv-axis')\n                .attr('transform', 'translate(0,' + availableHeight1 + ')');\n\n            // Setup Brush\n            brush\n                .x(x2)\n                .on('brush', function() {\n                    onBrush();\n                });\n\n            if (brushExtent) brush.extent(brushExtent);\n\n            var brushBG = g.select('.nv-brushBackground').selectAll('g')\n                .data([brushExtent || brush.extent()])\n\n            var brushBGenter = brushBG.enter()\n                .append('g');\n\n            brushBGenter.append('rect')\n                .attr('class', 'left')\n                .attr('x', 0)\n                .attr('y', 0)\n                .attr('height', availableHeight2);\n\n            brushBGenter.append('rect')\n                .attr('class', 'right')\n                .attr('x', 0)\n                .attr('y', 0)\n                .attr('height', availableHeight2);\n\n            var gBrush = g.select('.nv-x.nv-brush')\n                .call(brush);\n            gBrush.selectAll('rect')\n                .attr('height', availableHeight2);\n            gBrush.selectAll('.resize').append('path').attr('d', resizePath);\n\n            onBrush();\n\n            // Setup Secondary (Context) Axes\n            x2Axis\n                .scale(x2)\n                ._ticks( nv.utils.calcTicksX(availableWidth/100, data) )\n                .tickSize(-availableHeight2, 0);\n\n            g.select('.nv-context .nv-x.nv-axis')\n                .attr('transform', 'translate(0,' + y2.range()[0] + ')');\n            d3.transition(g.select('.nv-context .nv-x.nv-axis'))\n                .call(x2Axis);\n\n            y2Axis\n                .scale(y2)\n                ._ticks( nv.utils.calcTicksY(availableHeight2/36, data) )\n                .tickSize( -availableWidth, 0);\n\n            d3.transition(g.select('.nv-context .nv-y.nv-axis'))\n                .call(y2Axis);\n\n            g.select('.nv-context .nv-x.nv-axis')\n                .attr('transform', 'translate(0,' + y2.range()[0] + ')');\n\n            //============================================================\n            // Event Handling/Dispatching (in chart's scope)\n            //------------------------------------------------------------\n\n            legend.dispatch.on('stateChange', function(newState) {\n                for (var key in newState)\n                    state[key] = newState[key];\n                dispatch.stateChange(state);\n                chart.update();\n            });\n\n            interactiveLayer.dispatch.on('elementMousemove', function(e) {\n                lines.clearHighlights();\n                var singlePoint, pointIndex, pointXLocation, allData = [];\n                data\n                    .filter(function(series, i) {\n                        series.seriesIndex = i;\n                        return !series.disabled;\n                    })\n                    .forEach(function(series,i) {\n                            var extent = brush.empty() ? x2.domain() : brush.extent();\n                            var currentValues = series.values.filter(function(d,i) {\n                            return lines.x()(d,i) >= extent[0] && lines.x()(d,i) <= extent[1];\n                        });\n \n                        pointIndex = nv.interactiveBisect(currentValues, e.pointXValue, lines.x());\n                        var point = currentValues[pointIndex];\n                        var pointYValue = chart.y()(point, pointIndex);\n                        if (pointYValue != null) {\n                            lines.highlightPoint(i, pointIndex, true);\n                        }\n                        if (point === undefined) return;\n                        if (singlePoint === undefined) singlePoint = point;\n                        if (pointXLocation === undefined) pointXLocation = chart.xScale()(chart.x()(point,pointIndex));\n                        allData.push({\n                            key: series.key,\n                            value: chart.y()(point, pointIndex),\n                            color: color(series,series.seriesIndex)\n                        });\n                    });\n                //Highlight the tooltip entry based on which point the mouse is closest to.\n                if (allData.length > 2) {\n                    var yValue = chart.yScale().invert(e.mouseY);\n                    var domainExtent = Math.abs(chart.yScale().domain()[0] - chart.yScale().domain()[1]);\n                    var threshold = 0.03 * domainExtent;\n                    var indexToHighlight = nv.nearestValueIndex(allData.map(function(d){return d.value}),yValue,threshold);\n                    if (indexToHighlight !== null)\n                        allData[indexToHighlight].highlight = true;\n                }\n\n                var xValue = xAxis.tickFormat()(chart.x()(singlePoint,pointIndex));\n                interactiveLayer.tooltip\n                    .position({left: e.mouseX + margin.left, top: e.mouseY + margin.top})\n                    .chartContainer(that.parentNode)\n                    .valueFormatter(function(d,i) {\n                        return d == null ? \"N/A\" : yAxis.tickFormat()(d);\n                    })\n                    .data({\n                        value: xValue,\n                        index: pointIndex,\n                        series: allData\n                    })();\n\n                interactiveLayer.renderGuideLine(pointXLocation);\n\n            });\n\n            interactiveLayer.dispatch.on(\"elementMouseout\",function(e) {\n                lines.clearHighlights();\n            });\n\n            dispatch.on('changeState', function(e) {\n                if (typeof e.disabled !== 'undefined') {\n                    data.forEach(function(series,i) {\n                        series.disabled = e.disabled[i];\n                    });\n                }\n                chart.update();\n            });\n\n            //============================================================\n            // Functions\n            //------------------------------------------------------------\n\n            // Taken from crossfilter (http://square.github.com/crossfilter/)\n            function resizePath(d) {\n                var e = +(d == 'e'),\n                    x = e ? 1 : -1,\n                    y = availableHeight2 / 3;\n                return 'M' + (.5 * x) + ',' + y\n                    + 'A6,6 0 0 ' + e + ' ' + (6.5 * x) + ',' + (y + 6)\n                    + 'V' + (2 * y - 6)\n                    + 'A6,6 0 0 ' + e + ' ' + (.5 * x) + ',' + (2 * y)\n                    + 'Z'\n                    + 'M' + (2.5 * x) + ',' + (y + 8)\n                    + 'V' + (2 * y - 8)\n                    + 'M' + (4.5 * x) + ',' + (y + 8)\n                    + 'V' + (2 * y - 8);\n            }\n\n\n            function updateBrushBG() {\n                if (!brush.empty()) brush.extent(brushExtent);\n                brushBG\n                    .data([brush.empty() ? x2.domain() : brushExtent])\n                    .each(function(d,i) {\n                        var leftWidth = x2(d[0]) - x.range()[0],\n                            rightWidth = availableWidth - x2(d[1]);\n                        d3.select(this).select('.left')\n                            .attr('width',  leftWidth < 0 ? 0 : leftWidth);\n\n                        d3.select(this).select('.right')\n                            .attr('x', x2(d[1]))\n                            .attr('width', rightWidth < 0 ? 0 : rightWidth);\n                    });\n            }\n\n\n            function onBrush() {\n                brushExtent = brush.empty() ? null : brush.extent();\n                var extent = brush.empty() ? x2.domain() : brush.extent();\n\n                //The brush extent cannot be less than one.  If it is, don't update the line chart.\n                if (Math.abs(extent[0] - extent[1]) <= 1) {\n                    return;\n                }\n\n                dispatch.brush({extent: extent, brush: brush});\n\n\n                updateBrushBG();\n\n                // Update Main (Focus)\n                var focusLinesWrap = g.select('.nv-focus .nv-linesWrap')\n                    .datum(\n                    data\n                        .filter(function(d) { return !d.disabled })\n                        .map(function(d,i) {\n                            return {\n                                key: d.key,\n                                area: d.area,\n                                values: d.values.filter(function(d,i) {\n                                    return lines.x()(d,i) >= extent[0] && lines.x()(d,i) <= extent[1];\n                                })\n                            }\n                        })\n                );\n                focusLinesWrap.transition().duration(transitionDuration).call(lines);\n\n\n                // Update Main (Focus) Axes\n                g.select('.nv-focus .nv-x.nv-axis').transition().duration(transitionDuration)\n                    .call(xAxis);\n                g.select('.nv-focus .nv-y.nv-axis').transition().duration(transitionDuration)\n                    .call(yAxis);\n            }\n        });\n\n        return chart;\n    }\n\n    //============================================================\n    // Event Handling/Dispatching (out of chart's scope)\n    //------------------------------------------------------------\n\n    lines.dispatch.on('elementMouseover.tooltip', function(evt) {\n        tooltip.data(evt).position(evt.pos).hidden(false);\n    });\n\n    lines.dispatch.on('elementMouseout.tooltip', function(evt) {\n        tooltip.hidden(true)\n    });\n\n    //============================================================\n    // Expose Public Variables\n    //------------------------------------------------------------\n\n    // expose chart's sub-components\n    chart.dispatch = dispatch;\n    chart.legend = legend;\n    chart.lines = lines;\n    chart.lines2 = lines2;\n    chart.xAxis = xAxis;\n    chart.yAxis = yAxis;\n    chart.x2Axis = x2Axis;\n    chart.y2Axis = y2Axis;\n    chart.interactiveLayer = interactiveLayer;\n    chart.tooltip = tooltip;\n\n    chart.options = nv.utils.optionsFunc.bind(chart);\n\n    chart._options = Object.create({}, {\n        // simple options, just get/set the necessary values\n        width:      {get: function(){return width;}, set: function(_){width=_;}},\n        height:     {get: function(){return height;}, set: function(_){height=_;}},\n        focusHeight:     {get: function(){return height2;}, set: function(_){height2=_;}},\n        showLegend: {get: function(){return showLegend;}, set: function(_){showLegend=_;}},\n        brushExtent: {get: function(){return brushExtent;}, set: function(_){brushExtent=_;}},\n        defaultState:    {get: function(){return defaultState;}, set: function(_){defaultState=_;}},\n        noData:    {get: function(){return noData;}, set: function(_){noData=_;}},\n\n        // deprecated options\n        tooltips:    {get: function(){return tooltip.enabled();}, set: function(_){\n            // deprecated after 1.7.1\n            nv.deprecated('tooltips', 'use chart.tooltip.enabled() instead');\n            tooltip.enabled(!!_);\n        }},\n        tooltipContent:    {get: function(){return tooltip.contentGenerator();}, set: function(_){\n            // deprecated after 1.7.1\n            nv.deprecated('tooltipContent', 'use chart.tooltip.contentGenerator() instead');\n            tooltip.contentGenerator(_);\n        }},\n\n        // options that require extra logic in the setter\n        margin: {get: function(){return margin;}, set: function(_){\n            margin.top    = _.top    !== undefined ? _.top    : margin.top;\n            margin.right  = _.right  !== undefined ? _.right  : margin.right;\n            margin.bottom = _.bottom !== undefined ? _.bottom : margin.bottom;\n            margin.left   = _.left   !== undefined ? _.left   : margin.left;\n        }},\n        color:  {get: function(){return color;}, set: function(_){\n            color = nv.utils.getColor(_);\n            legend.color(color);\n            // line color is handled above?\n        }},\n        interpolate: {get: function(){return lines.interpolate();}, set: function(_){\n            lines.interpolate(_);\n            lines2.interpolate(_);\n        }},\n        xTickFormat: {get: function(){return xAxis.tickFormat();}, set: function(_){\n            xAxis.tickFormat(_);\n            x2Axis.tickFormat(_);\n        }},\n        yTickFormat: {get: function(){return yAxis.tickFormat();}, set: function(_){\n            yAxis.tickFormat(_);\n            y2Axis.tickFormat(_);\n        }},\n        duration:    {get: function(){return transitionDuration;}, set: function(_){\n            transitionDuration=_;\n            yAxis.duration(transitionDuration);\n            y2Axis.duration(transitionDuration);\n            xAxis.duration(transitionDuration);\n            x2Axis.duration(transitionDuration);\n        }},\n        x: {get: function(){return lines.x();}, set: function(_){\n            lines.x(_);\n            lines2.x(_);\n        }},\n        y: {get: function(){return lines.y();}, set: function(_){\n            lines.y(_);\n            lines2.y(_);\n        }},\n        useInteractiveGuideline: {get: function(){return useInteractiveGuideline;}, set: function(_){\n            useInteractiveGuideline = _;\n            if (useInteractiveGuideline) {\n                lines.interactive(false);\n                lines.useVoronoi(false);\n            }\n        }}\n    });\n\n    nv.utils.inheritOptions(chart, lines);\n    nv.utils.initOptions(chart);\n\n    return chart;\n};\n\nnv.models.multiBar = function() {\n    \"use strict\";\n\n    //============================================================\n    // Public Variables with Default Settings\n    //------------------------------------------------------------\n\n    var margin = {top: 0, right: 0, bottom: 0, left: 0}\n        , width = 960\n        , height = 500\n        , x = d3.scale.ordinal()\n        , y = d3.scale.linear()\n        , id = Math.floor(Math.random() * 10000) //Create semi-unique ID in case user doesn't select one\n        , container = null\n        , getX = function(d) { return d.x }\n        , getY = function(d) { return d.y }\n        , forceY = [0] // 0 is forced by default.. this makes sense for the majority of bar graphs... user can always do chart.forceY([]) to remove\n        , clipEdge = true\n        , stacked = false\n        , stackOffset = 'zero' // options include 'silhouette', 'wiggle', 'expand', 'zero', or a custom function\n        , color = nv.utils.defaultColor()\n        , hideable = false\n        , barColor = null // adding the ability to set the color for each rather than the whole group\n        , disabled // used in conjunction with barColor to communicate from multiBarHorizontalChart what series are disabled\n        , duration = 500\n        , xDomain\n        , yDomain\n        , xRange\n        , yRange\n        , groupSpacing = 0.1\n        , dispatch = d3.dispatch('chartClick', 'elementClick', 'elementDblClick', 'elementMouseover', 'elementMouseout', 'elementMousemove', 'renderEnd')\n        ;\n\n    //============================================================\n    // Private Variables\n    //------------------------------------------------------------\n\n    var x0, y0 //used to store previous scales\n        , renderWatch = nv.utils.renderWatch(dispatch, duration)\n        ;\n\n    var last_datalength = 0;\n\n    function chart(selection) {\n        renderWatch.reset();\n        selection.each(function(data) {\n            var availableWidth = width - margin.left - margin.right,\n                availableHeight = height - margin.top - margin.bottom;\n\n            container = d3.select(this);\n            nv.utils.initSVG(container);\n            var nonStackableCount = 0;\n            // This function defines the requirements for render complete\n            var endFn = function(d, i) {\n                if (d.series === data.length - 1 && i === data[0].values.length - 1)\n                    return true;\n                return false;\n            };\n\n            if(hideable && data.length) hideable = [{\n                values: data[0].values.map(function(d) {\n                        return {\n                            x: d.x,\n                            y: 0,\n                            series: d.series,\n                            size: 0.01\n                        };}\n                )}];\n\n            if (stacked) {\n                var parsed = d3.layout.stack()\n                    .offset(stackOffset)\n                    .values(function(d){ return d.values })\n                    .y(getY)\n                (!data.length && hideable ? hideable : data);\n\n                parsed.forEach(function(series, i){\n                    // if series is non-stackable, use un-parsed data\n                    if (series.nonStackable) {\n                        data[i].nonStackableSeries = nonStackableCount++; \n                        parsed[i] = data[i];\n                    } else {\n                        // don't stack this seires on top of the nonStackable seriees \n                        if (i > 0 && parsed[i - 1].nonStackable){\n                            parsed[i].values.map(function(d,j){\n                                d.y0 -= parsed[i - 1].values[j].y;\n                                d.y1 = d.y0 + d.y;\n                            });\n                        }\n                    }\n                });\n                data = parsed;\n            }\n            //add series index and key to each data point for reference\n            data.forEach(function(series, i) {\n                series.values.forEach(function(point) {\n                    point.series = i;\n                    point.key = series.key;\n                });\n            });\n\n            // HACK for negative value stacking\n            if (stacked) {\n                data[0].values.map(function(d,i) {\n                    var posBase = 0, negBase = 0;\n                    data.map(function(d, idx) {\n                        if (!data[idx].nonStackable) {\n                            var f = d.values[i]\n                            f.size = Math.abs(f.y);\n                            if (f.y<0)  {\n                                f.y1 = negBase;\n                                negBase = negBase - f.size;\n                            } else\n                            {\n                                f.y1 = f.size + posBase;\n                                posBase = posBase + f.size;\n                            }\n                        }\n                        \n                    });\n                });\n            }\n            // Setup Scales\n            // remap and flatten the data for use in calculating the scales' domains\n            var seriesData = (xDomain && yDomain) ? [] : // if we know xDomain and yDomain, no need to calculate\n                data.map(function(d, idx) {\n                    return d.values.map(function(d,i) {\n                        return { x: getX(d,i), y: getY(d,i), y0: d.y0, y1: d.y1, idx:idx }\n                    })\n                });\n\n            x.domain(xDomain || d3.merge(seriesData).map(function(d) { return d.x }))\n                .rangeBands(xRange || [0, availableWidth], groupSpacing);\n\n            y.domain(yDomain || d3.extent(d3.merge(seriesData).map(function(d) {\n                var domain = d.y;\n                // increase the domain range if this series is stackable\n                if (stacked && !data[d.idx].nonStackable) {\n                    if (d.y > 0){\n                        domain = d.y1\n                    } else {\n                        domain = d.y1 + d.y\n                    }\n                }\n                return domain;\n            }).concat(forceY)))\n            .range(yRange || [availableHeight, 0]);\n\n            // If scale's domain don't have a range, slightly adjust to make one... so a chart can show a single data point\n            if (x.domain()[0] === x.domain()[1])\n                x.domain()[0] ?\n                    x.domain([x.domain()[0] - x.domain()[0] * 0.01, x.domain()[1] + x.domain()[1] * 0.01])\n                    : x.domain([-1,1]);\n\n            if (y.domain()[0] === y.domain()[1])\n                y.domain()[0] ?\n                    y.domain([y.domain()[0] + y.domain()[0] * 0.01, y.domain()[1] - y.domain()[1] * 0.01])\n                    : y.domain([-1,1]);\n\n            x0 = x0 || x;\n            y0 = y0 || y;\n\n            // Setup containers and skeleton of chart\n            var wrap = container.selectAll('g.nv-wrap.nv-multibar').data([data]);\n            var wrapEnter = wrap.enter().append('g').attr('class', 'nvd3 nv-wrap nv-multibar');\n            var defsEnter = wrapEnter.append('defs');\n            var gEnter = wrapEnter.append('g');\n            var g = wrap.select('g');\n\n            gEnter.append('g').attr('class', 'nv-groups');\n            wrap.attr('transform', 'translate(' + margin.left + ',' + margin.top + ')');\n\n            defsEnter.append('clipPath')\n                .attr('id', 'nv-edge-clip-' + id)\n                .append('rect');\n            wrap.select('#nv-edge-clip-' + id + ' rect')\n                .attr('width', availableWidth)\n                .attr('height', availableHeight);\n\n            g.attr('clip-path', clipEdge ? 'url(#nv-edge-clip-' + id + ')' : '');\n\n            var groups = wrap.select('.nv-groups').selectAll('.nv-group')\n                .data(function(d) { return d }, function(d,i) { return i });\n            groups.enter().append('g')\n                .style('stroke-opacity', 1e-6)\n                .style('fill-opacity', 1e-6);\n\n            var exitTransition = renderWatch\n                .transition(groups.exit().selectAll('rect.nv-bar'), 'multibarExit', Math.min(100, duration))\n                .attr('y', function(d, i, j) {\n                    var yVal = y0(0) || 0;\n                    if (stacked) {\n                        if (data[d.series] && !data[d.series].nonStackable) {\n                            yVal = y0(d.y0);\n                        }\n                    }\n                    return yVal;\n                })\n                .attr('height', 0)\n                .remove();\n            if (exitTransition.delay)\n                exitTransition.delay(function(d,i) {\n                    var delay = i * (duration / (last_datalength + 1)) - i;\n                    return delay;\n                });\n            groups\n                .attr('class', function(d,i) { return 'nv-group nv-series-' + i })\n                .classed('hover', function(d) { return d.hover })\n                .style('fill', function(d,i){ return color(d, i) })\n                .style('stroke', function(d,i){ return color(d, i) });\n            groups\n                .style('stroke-opacity', 1)\n                .style('fill-opacity', 0.75);\n\n            var bars = groups.selectAll('rect.nv-bar')\n                .data(function(d) { return (hideable && !data.length) ? hideable.values : d.values });\n            bars.exit().remove();\n\n            var barsEnter = bars.enter().append('rect')\n                    .attr('class', function(d,i) { return getY(d,i) < 0 ? 'nv-bar negative' : 'nv-bar positive'})\n                    .attr('x', function(d,i,j) {\n                        return stacked && !data[j].nonStackable ? 0 : (j * x.rangeBand() / data.length )\n                    })\n                    .attr('y', function(d,i,j) { return y0(stacked && !data[j].nonStackable ? d.y0 : 0) || 0 })\n                    .attr('height', 0)\n                    .attr('width', function(d,i,j) { return x.rangeBand() / (stacked && !data[j].nonStackable ? 1 : data.length) })\n                    .attr('transform', function(d,i) { return 'translate(' + x(getX(d,i)) + ',0)'; })\n                ;\n            bars\n                .style('fill', function(d,i,j){ return color(d, j, i);  })\n                .style('stroke', function(d,i,j){ return color(d, j, i); })\n                .on('mouseover', function(d,i) { //TODO: figure out why j works above, but not here\n                    d3.select(this).classed('hover', true);\n                    dispatch.elementMouseover({\n                        data: d,\n                        index: i,\n                        color: d3.select(this).style(\"fill\")\n                    });\n                })\n                .on('mouseout', function(d,i) {\n                    d3.select(this).classed('hover', false);\n                    dispatch.elementMouseout({\n                        data: d,\n                        index: i,\n                        color: d3.select(this).style(\"fill\")\n                    });\n                })\n                .on('mousemove', function(d,i) {\n                    dispatch.elementMousemove({\n                        data: d,\n                        index: i,\n                        color: d3.select(this).style(\"fill\")\n                    });\n                })\n                .on('click', function(d,i) {\n                    dispatch.elementClick({\n                        data: d,\n                        index: i,\n                        color: d3.select(this).style(\"fill\")\n                    });\n                    d3.event.stopPropagation();\n                })\n                .on('dblclick', function(d,i) {\n                    dispatch.elementDblClick({\n                        data: d,\n                        index: i,\n                        color: d3.select(this).style(\"fill\")\n                    });\n                    d3.event.stopPropagation();\n                });\n            bars\n                .attr('class', function(d,i) { return getY(d,i) < 0 ? 'nv-bar negative' : 'nv-bar positive'})\n                .attr('transform', function(d,i) { return 'translate(' + x(getX(d,i)) + ',0)'; })\n\n            if (barColor) {\n                if (!disabled) disabled = data.map(function() { return true });\n                bars\n                    .style('fill', function(d,i,j) { return d3.rgb(barColor(d,i)).darker(  disabled.map(function(d,i) { return i }).filter(function(d,i){ return !disabled[i]  })[j]   ).toString(); })\n                    .style('stroke', function(d,i,j) { return d3.rgb(barColor(d,i)).darker(  disabled.map(function(d,i) { return i }).filter(function(d,i){ return !disabled[i]  })[j]   ).toString(); });\n            }\n\n            var barSelection =\n                bars.watchTransition(renderWatch, 'multibar', Math.min(250, duration))\n                    .delay(function(d,i) {\n                        return i * duration / data[0].values.length;\n                    });\n            if (stacked){\n                barSelection\n                    .attr('y', function(d,i,j) {\n                        var yVal = 0;\n                        // if stackable, stack it on top of the previous series\n                        if (!data[j].nonStackable) {\n                            yVal = y(d.y1);\n                        } else {\n                            if (getY(d,i) < 0){\n                                yVal = y(0);\n                            } else {\n                                if (y(0) - y(getY(d,i)) < -1){\n                                    yVal = y(0) - 1;\n                                } else {\n                                    yVal = y(getY(d, i)) || 0;\n                                }\n                            }\n                        }\n                        return yVal;\n                    })\n                    .attr('height', function(d,i,j) {\n                        if (!data[j].nonStackable) {\n                            return Math.max(Math.abs(y(d.y+d.y0) - y(d.y0)), 1);\n                        } else {\n                            return Math.max(Math.abs(y(getY(d,i)) - y(0)),1) || 0;\n                        }\n                    })\n                    .attr('x', function(d,i,j) {\n                        var width = 0;\n                        if (data[j].nonStackable) {\n                            width = d.series * x.rangeBand() / data.length;\n                            if (data.length !== nonStackableCount){\n                                width = data[j].nonStackableSeries * x.rangeBand()/(nonStackableCount*2); \n                            }\n                        }\n                        return width;\n                    })\n                    .attr('width', function(d,i,j){\n                        if (!data[j].nonStackable) {\n                            return x.rangeBand();\n                        } else {\n                            // if all series are nonStacable, take the full width\n                            var width = (x.rangeBand() / nonStackableCount);\n                            // otherwise, nonStackable graph will be only taking the half-width \n                            // of the x rangeBand\n                            if (data.length !== nonStackableCount) {\n                                width = x.rangeBand()/(nonStackableCount*2);\n                            }\n                            return width;\n                        }\n                    });\n            }\n            else {\n                barSelection\n                    .attr('x', function(d,i) {\n                        return d.series * x.rangeBand() / data.length;\n                    })\n                    .attr('width', x.rangeBand() / data.length)\n                    .attr('y', function(d,i) {\n                        return getY(d,i) < 0 ?\n                            y(0) :\n                                y(0) - y(getY(d,i)) < 1 ?\n                            y(0) - 1 :\n                            y(getY(d,i)) || 0;\n                    })\n                    .attr('height', function(d,i) {\n                        return Math.max(Math.abs(y(getY(d,i)) - y(0)),1) || 0;\n                    });\n            }\n\n            //store old scales for use in transitions on update\n            x0 = x.copy();\n            y0 = y.copy();\n\n            // keep track of the last data value length for transition calculations\n            if (data[0] && data[0].values) {\n                last_datalength = data[0].values.length;\n            }\n\n        });\n\n        renderWatch.renderEnd('multibar immediate');\n\n        return chart;\n    }\n\n    //============================================================\n    // Expose Public Variables\n    //------------------------------------------------------------\n\n    chart.dispatch = dispatch;\n\n    chart.options = nv.utils.optionsFunc.bind(chart);\n\n    chart._options = Object.create({}, {\n        // simple options, just get/set the necessary values\n        width:   {get: function(){return width;}, set: function(_){width=_;}},\n        height:  {get: function(){return height;}, set: function(_){height=_;}},\n        x:       {get: function(){return getX;}, set: function(_){getX=_;}},\n        y:       {get: function(){return getY;}, set: function(_){getY=_;}},\n        xScale:  {get: function(){return x;}, set: function(_){x=_;}},\n        yScale:  {get: function(){return y;}, set: function(_){y=_;}},\n        xDomain: {get: function(){return xDomain;}, set: function(_){xDomain=_;}},\n        yDomain: {get: function(){return yDomain;}, set: function(_){yDomain=_;}},\n        xRange:  {get: function(){return xRange;}, set: function(_){xRange=_;}},\n        yRange:  {get: function(){return yRange;}, set: function(_){yRange=_;}},\n        forceY:  {get: function(){return forceY;}, set: function(_){forceY=_;}},\n        stacked: {get: function(){return stacked;}, set: function(_){stacked=_;}},\n        stackOffset: {get: function(){return stackOffset;}, set: function(_){stackOffset=_;}},\n        clipEdge:    {get: function(){return clipEdge;}, set: function(_){clipEdge=_;}},\n        disabled:    {get: function(){return disabled;}, set: function(_){disabled=_;}},\n        id:          {get: function(){return id;}, set: function(_){id=_;}},\n        hideable:    {get: function(){return hideable;}, set: function(_){hideable=_;}},\n        groupSpacing:{get: function(){return groupSpacing;}, set: function(_){groupSpacing=_;}},\n\n        // options that require extra logic in the setter\n        margin: {get: function(){return margin;}, set: function(_){\n            margin.top    = _.top    !== undefined ? _.top    : margin.top;\n            margin.right  = _.right  !== undefined ? _.right  : margin.right;\n            margin.bottom = _.bottom !== undefined ? _.bottom : margin.bottom;\n            margin.left   = _.left   !== undefined ? _.left   : margin.left;\n        }},\n        duration: {get: function(){return duration;}, set: function(_){\n            duration = _;\n            renderWatch.reset(duration);\n        }},\n        color:  {get: function(){return color;}, set: function(_){\n            color = nv.utils.getColor(_);\n        }},\n        barColor:  {get: function(){return barColor;}, set: function(_){\n            barColor = _ ? nv.utils.getColor(_) : null;\n        }}\n    });\n\n    nv.utils.initOptions(chart);\n\n    return chart;\n};\nnv.models.multiBarChart = function() {\n    \"use strict\";\n\n    //============================================================\n    // Public Variables with Default Settings\n    //------------------------------------------------------------\n\n    var multibar = nv.models.multiBar()\n        , xAxis = nv.models.axis()\n        , yAxis = nv.models.axis()\n        , legend = nv.models.legend()\n        , controls = nv.models.legend()\n        , tooltip = nv.models.tooltip()\n        ;\n\n    var margin = {top: 30, right: 20, bottom: 50, left: 60}\n        , width = null\n        , height = null\n        , color = nv.utils.defaultColor()\n        , showControls = true\n        , controlLabels = {}\n        , showLegend = true\n        , showXAxis = true\n        , showYAxis = true\n        , rightAlignYAxis = false\n        , reduceXTicks = true // if false a tick will show for every data point\n        , staggerLabels = false\n        , rotateLabels = 0\n        , x //can be accessed via chart.xScale()\n        , y //can be accessed via chart.yScale()\n        , state = nv.utils.state()\n        , defaultState = null\n        , noData = null\n        , dispatch = d3.dispatch('stateChange', 'changeState', 'renderEnd')\n        , controlWidth = function() { return showControls ? 180 : 0 }\n        , duration = 250\n        ;\n\n    state.stacked = false // DEPRECATED Maintained for backward compatibility\n\n    multibar.stacked(false);\n    xAxis\n        .orient('bottom')\n        .tickPadding(7)\n        .showMaxMin(false)\n        .tickFormat(function(d) { return d })\n    ;\n    yAxis\n        .orient((rightAlignYAxis) ? 'right' : 'left')\n        .tickFormat(d3.format(',.1f'))\n    ;\n\n    tooltip\n        .duration(0)\n        .valueFormatter(function(d, i) {\n            return yAxis.tickFormat()(d, i);\n        })\n        .headerFormatter(function(d, i) {\n            return xAxis.tickFormat()(d, i);\n        });\n\n    controls.updateState(false);\n\n    //============================================================\n    // Private Variables\n    //------------------------------------------------------------\n\n    var renderWatch = nv.utils.renderWatch(dispatch);\n    var stacked = false;\n\n    var stateGetter = function(data) {\n        return function(){\n            return {\n                active: data.map(function(d) { return !d.disabled }),\n                stacked: stacked\n            };\n        }\n    };\n\n    var stateSetter = function(data) {\n        return function(state) {\n            if (state.stacked !== undefined)\n                stacked = state.stacked;\n            if (state.active !== undefined)\n                data.forEach(function(series,i) {\n                    series.disabled = !state.active[i];\n                });\n        }\n    };\n\n    function chart(selection) {\n        renderWatch.reset();\n        renderWatch.models(multibar);\n        if (showXAxis) renderWatch.models(xAxis);\n        if (showYAxis) renderWatch.models(yAxis);\n\n        selection.each(function(data) {\n            var container = d3.select(this),\n                that = this;\n            nv.utils.initSVG(container);\n            var availableWidth = nv.utils.availableWidth(width, container, margin),\n                availableHeight = nv.utils.availableHeight(height, container, margin);\n\n            chart.update = function() {\n                if (duration === 0)\n                    container.call(chart);\n                else\n                    container.transition()\n                        .duration(duration)\n                        .call(chart);\n            };\n            chart.container = this;\n\n            state\n                .setter(stateSetter(data), chart.update)\n                .getter(stateGetter(data))\n                .update();\n\n            // DEPRECATED set state.disableddisabled\n            state.disabled = data.map(function(d) { return !!d.disabled });\n\n            if (!defaultState) {\n                var key;\n                defaultState = {};\n                for (key in state) {\n                    if (state[key] instanceof Array)\n                        defaultState[key] = state[key].slice(0);\n                    else\n                        defaultState[key] = state[key];\n                }\n            }\n\n            // Display noData message if there's nothing to show.\n            if (!data || !data.length || !data.filter(function(d) { return d.values.length }).length) {\n                nv.utils.noData(chart, container)\n                return chart;\n            } else {\n                container.selectAll('.nv-noData').remove();\n            }\n\n            // Setup Scales\n            x = multibar.xScale();\n            y = multibar.yScale();\n\n            // Setup containers and skeleton of chart\n            var wrap = container.selectAll('g.nv-wrap.nv-multiBarWithLegend').data([data]);\n            var gEnter = wrap.enter().append('g').attr('class', 'nvd3 nv-wrap nv-multiBarWithLegend').append('g');\n            var g = wrap.select('g');\n\n            gEnter.append('g').attr('class', 'nv-x nv-axis');\n            gEnter.append('g').attr('class', 'nv-y nv-axis');\n            gEnter.append('g').attr('class', 'nv-barsWrap');\n            gEnter.append('g').attr('class', 'nv-legendWrap');\n            gEnter.append('g').attr('class', 'nv-controlsWrap');\n\n            // Legend\n            if (showLegend) {\n                legend.width(availableWidth - controlWidth());\n\n                g.select('.nv-legendWrap')\n                    .datum(data)\n                    .call(legend);\n\n                if ( margin.top != legend.height()) {\n                    margin.top = legend.height();\n                    availableHeight = nv.utils.availableHeight(height, container, margin);\n                }\n\n                g.select('.nv-legendWrap')\n                    .attr('transform', 'translate(' + controlWidth() + ',' + (-margin.top) +')');\n            }\n\n            // Controls\n            if (showControls) {\n                var controlsData = [\n                    { key: controlLabels.grouped || 'Grouped', disabled: multibar.stacked() },\n                    { key: controlLabels.stacked || 'Stacked', disabled: !multibar.stacked() }\n                ];\n\n                controls.width(controlWidth()).color(['#444', '#444', '#444']);\n                g.select('.nv-controlsWrap')\n                    .datum(controlsData)\n                    .attr('transform', 'translate(0,' + (-margin.top) +')')\n                    .call(controls);\n            }\n\n            wrap.attr('transform', 'translate(' + margin.left + ',' + margin.top + ')');\n            if (rightAlignYAxis) {\n                g.select(\".nv-y.nv-axis\")\n                    .attr(\"transform\", \"translate(\" + availableWidth + \",0)\");\n            }\n\n            // Main Chart Component(s)\n            multibar\n                .disabled(data.map(function(series) { return series.disabled }))\n                .width(availableWidth)\n                .height(availableHeight)\n                .color(data.map(function(d,i) {\n                    return d.color || color(d, i);\n                }).filter(function(d,i) { return !data[i].disabled }));\n\n\n            var barsWrap = g.select('.nv-barsWrap')\n                .datum(data.filter(function(d) { return !d.disabled }));\n\n            barsWrap.call(multibar);\n\n            // Setup Axes\n            if (showXAxis) {\n                xAxis\n                    .scale(x)\n                    ._ticks( nv.utils.calcTicksX(availableWidth/100, data) )\n                    .tickSize(-availableHeight, 0);\n\n                g.select('.nv-x.nv-axis')\n                    .attr('transform', 'translate(0,' + y.range()[0] + ')');\n                g.select('.nv-x.nv-axis')\n                    .call(xAxis);\n\n                var xTicks = g.select('.nv-x.nv-axis > g').selectAll('g');\n\n                xTicks\n                    .selectAll('line, text')\n                    .style('opacity', 1)\n\n                if (staggerLabels) {\n                    var getTranslate = function(x,y) {\n                        return \"translate(\" + x + \",\" + y + \")\";\n                    };\n\n                    var staggerUp = 5, staggerDown = 17;  //pixels to stagger by\n                    // Issue #140\n                    xTicks\n                        .selectAll(\"text\")\n                        .attr('transform', function(d,i,j) {\n                            return  getTranslate(0, (j % 2 == 0 ? staggerUp : staggerDown));\n                        });\n\n                    var totalInBetweenTicks = d3.selectAll(\".nv-x.nv-axis .nv-wrap g g text\")[0].length;\n                    g.selectAll(\".nv-x.nv-axis .nv-axisMaxMin text\")\n                        .attr(\"transform\", function(d,i) {\n                            return getTranslate(0, (i === 0 || totalInBetweenTicks % 2 !== 0) ? staggerDown : staggerUp);\n                        });\n                }\n\n                if (reduceXTicks)\n                    xTicks\n                        .filter(function(d,i) {\n                            return i % Math.ceil(data[0].values.length / (availableWidth / 100)) !== 0;\n                        })\n                        .selectAll('text, line')\n                        .style('opacity', 0);\n\n                if(rotateLabels)\n                    xTicks\n                        .selectAll('.tick text')\n                        .attr('transform', 'rotate(' + rotateLabels + ' 0,0)')\n                        .style('text-anchor', rotateLabels > 0 ? 'start' : 'end');\n\n                g.select('.nv-x.nv-axis').selectAll('g.nv-axisMaxMin text')\n                    .style('opacity', 1);\n            }\n\n            if (showYAxis) {\n                yAxis\n                    .scale(y)\n                    ._ticks( nv.utils.calcTicksY(availableHeight/36, data) )\n                    .tickSize( -availableWidth, 0);\n\n                g.select('.nv-y.nv-axis')\n                    .call(yAxis);\n            }\n\n            //============================================================\n            // Event Handling/Dispatching (in chart's scope)\n            //------------------------------------------------------------\n\n            legend.dispatch.on('stateChange', function(newState) {\n                for (var key in newState)\n                    state[key] = newState[key];\n                dispatch.stateChange(state);\n                chart.update();\n            });\n\n            controls.dispatch.on('legendClick', function(d,i) {\n                if (!d.disabled) return;\n                controlsData = controlsData.map(function(s) {\n                    s.disabled = true;\n                    return s;\n                });\n                d.disabled = false;\n\n                switch (d.key) {\n                    case 'Grouped':\n                    case controlLabels.grouped:\n                        multibar.stacked(false);\n                        break;\n                    case 'Stacked':\n                    case controlLabels.stacked:\n                        multibar.stacked(true);\n                        break;\n                }\n\n                state.stacked = multibar.stacked();\n                dispatch.stateChange(state);\n                chart.update();\n            });\n\n            // Update chart from a state object passed to event handler\n            dispatch.on('changeState', function(e) {\n                if (typeof e.disabled !== 'undefined') {\n                    data.forEach(function(series,i) {\n                        series.disabled = e.disabled[i];\n                    });\n                    state.disabled = e.disabled;\n                }\n                if (typeof e.stacked !== 'undefined') {\n                    multibar.stacked(e.stacked);\n                    state.stacked = e.stacked;\n                    stacked = e.stacked;\n                }\n                chart.update();\n            });\n        });\n\n        renderWatch.renderEnd('multibarchart immediate');\n        return chart;\n    }\n\n    //============================================================\n    // Event Handling/Dispatching (out of chart's scope)\n    //------------------------------------------------------------\n\n    multibar.dispatch.on('elementMouseover.tooltip', function(evt) {\n        evt.value = chart.x()(evt.data);\n        evt['series'] = {\n            key: evt.data.key,\n            value: chart.y()(evt.data),\n            color: evt.color\n        };\n        tooltip.data(evt).hidden(false);\n    });\n\n    multibar.dispatch.on('elementMouseout.tooltip', function(evt) {\n        tooltip.hidden(true);\n    });\n\n    multibar.dispatch.on('elementMousemove.tooltip', function(evt) {\n        tooltip.position({top: d3.event.pageY, left: d3.event.pageX})();\n    });\n\n    //============================================================\n    // Expose Public Variables\n    //------------------------------------------------------------\n\n    // expose chart's sub-components\n    chart.dispatch = dispatch;\n    chart.multibar = multibar;\n    chart.legend = legend;\n    chart.controls = controls;\n    chart.xAxis = xAxis;\n    chart.yAxis = yAxis;\n    chart.state = state;\n    chart.tooltip = tooltip;\n\n    chart.options = nv.utils.optionsFunc.bind(chart);\n\n    chart._options = Object.create({}, {\n        // simple options, just get/set the necessary values\n        width:      {get: function(){return width;}, set: function(_){width=_;}},\n        height:     {get: function(){return height;}, set: function(_){height=_;}},\n        showLegend: {get: function(){return showLegend;}, set: function(_){showLegend=_;}},\n        showControls: {get: function(){return showControls;}, set: function(_){showControls=_;}},\n        controlLabels: {get: function(){return controlLabels;}, set: function(_){controlLabels=_;}},\n        showXAxis:      {get: function(){return showXAxis;}, set: function(_){showXAxis=_;}},\n        showYAxis:    {get: function(){return showYAxis;}, set: function(_){showYAxis=_;}},\n        defaultState:    {get: function(){return defaultState;}, set: function(_){defaultState=_;}},\n        noData:    {get: function(){return noData;}, set: function(_){noData=_;}},\n        reduceXTicks:    {get: function(){return reduceXTicks;}, set: function(_){reduceXTicks=_;}},\n        rotateLabels:    {get: function(){return rotateLabels;}, set: function(_){rotateLabels=_;}},\n        staggerLabels:    {get: function(){return staggerLabels;}, set: function(_){staggerLabels=_;}},\n\n        // deprecated options\n        tooltips:    {get: function(){return tooltip.enabled();}, set: function(_){\n            // deprecated after 1.7.1\n            nv.deprecated('tooltips', 'use chart.tooltip.enabled() instead');\n            tooltip.enabled(!!_);\n        }},\n        tooltipContent:    {get: function(){return tooltip.contentGenerator();}, set: function(_){\n            // deprecated after 1.7.1\n            nv.deprecated('tooltipContent', 'use chart.tooltip.contentGenerator() instead');\n            tooltip.contentGenerator(_);\n        }},\n\n        // options that require extra logic in the setter\n        margin: {get: function(){return margin;}, set: function(_){\n            margin.top    = _.top    !== undefined ? _.top    : margin.top;\n            margin.right  = _.right  !== undefined ? _.right  : margin.right;\n            margin.bottom = _.bottom !== undefined ? _.bottom : margin.bottom;\n            margin.left   = _.left   !== undefined ? _.left   : margin.left;\n        }},\n        duration: {get: function(){return duration;}, set: function(_){\n            duration = _;\n            multibar.duration(duration);\n            xAxis.duration(duration);\n            yAxis.duration(duration);\n            renderWatch.reset(duration);\n        }},\n        color:  {get: function(){return color;}, set: function(_){\n            color = nv.utils.getColor(_);\n            legend.color(color);\n        }},\n        rightAlignYAxis: {get: function(){return rightAlignYAxis;}, set: function(_){\n            rightAlignYAxis = _;\n            yAxis.orient( rightAlignYAxis ? 'right' : 'left');\n        }},\n        barColor:  {get: function(){return multibar.barColor;}, set: function(_){\n            multibar.barColor(_);\n            legend.color(function(d,i) {return d3.rgb('#ccc').darker(i * 1.5).toString();})\n        }}\n    });\n\n    nv.utils.inheritOptions(chart, multibar);\n    nv.utils.initOptions(chart);\n\n    return chart;\n};\n\nnv.models.multiBarHorizontal = function() {\n    \"use strict\";\n\n    //============================================================\n    // Public Variables with Default Settings\n    //------------------------------------------------------------\n\n    var margin = {top: 0, right: 0, bottom: 0, left: 0}\n        , width = 960\n        , height = 500\n        , id = Math.floor(Math.random() * 10000) //Create semi-unique ID in case user doesn't select one\n        , container = null\n        , x = d3.scale.ordinal()\n        , y = d3.scale.linear()\n        , getX = function(d) { return d.x }\n        , getY = function(d) { return d.y }\n        , getYerr = function(d) { return d.yErr }\n        , forceY = [0] // 0 is forced by default.. this makes sense for the majority of bar graphs... user can always do chart.forceY([]) to remove\n        , color = nv.utils.defaultColor()\n        , barColor = null // adding the ability to set the color for each rather than the whole group\n        , disabled // used in conjunction with barColor to communicate from multiBarHorizontalChart what series are disabled\n        , stacked = false\n        , showValues = false\n        , showBarLabels = false\n        , valuePadding = 60\n        , groupSpacing = 0.1\n        , valueFormat = d3.format(',.2f')\n        , delay = 1200\n        , xDomain\n        , yDomain\n        , xRange\n        , yRange\n        , duration = 250\n        , dispatch = d3.dispatch('chartClick', 'elementClick', 'elementDblClick', 'elementMouseover', 'elementMouseout', 'elementMousemove', 'renderEnd')\n        ;\n\n    //============================================================\n    // Private Variables\n    //------------------------------------------------------------\n\n    var x0, y0; //used to store previous scales\n    var renderWatch = nv.utils.renderWatch(dispatch, duration);\n\n    function chart(selection) {\n        renderWatch.reset();\n        selection.each(function(data) {\n            var availableWidth = width - margin.left - margin.right,\n                availableHeight = height - margin.top - margin.bottom;\n\n            container = d3.select(this);\n            nv.utils.initSVG(container);\n\n            if (stacked)\n                data = d3.layout.stack()\n                    .offset('zero')\n                    .values(function(d){ return d.values })\n                    .y(getY)\n                (data);\n\n            //add series index and key to each data point for reference\n            data.forEach(function(series, i) {\n                series.values.forEach(function(point) {\n                    point.series = i;\n                    point.key = series.key;\n                });\n            });\n\n            // HACK for negative value stacking\n            if (stacked)\n                data[0].values.map(function(d,i) {\n                    var posBase = 0, negBase = 0;\n                    data.map(function(d) {\n                        var f = d.values[i]\n                        f.size = Math.abs(f.y);\n                        if (f.y<0)  {\n                            f.y1 = negBase - f.size;\n                            negBase = negBase - f.size;\n                        } else\n                        {\n                            f.y1 = posBase;\n                            posBase = posBase + f.size;\n                        }\n                    });\n                });\n\n            // Setup Scales\n            // remap and flatten the data for use in calculating the scales' domains\n            var seriesData = (xDomain && yDomain) ? [] : // if we know xDomain and yDomain, no need to calculate\n                data.map(function(d) {\n                    return d.values.map(function(d,i) {\n                        return { x: getX(d,i), y: getY(d,i), y0: d.y0, y1: d.y1 }\n                    })\n                });\n\n            x.domain(xDomain || d3.merge(seriesData).map(function(d) { return d.x }))\n                .rangeBands(xRange || [0, availableHeight], groupSpacing);\n\n            y.domain(yDomain || d3.extent(d3.merge(seriesData).map(function(d) { return stacked ? (d.y > 0 ? d.y1 + d.y : d.y1 ) : d.y }).concat(forceY)))\n\n            if (showValues && !stacked)\n                y.range(yRange || [(y.domain()[0] < 0 ? valuePadding : 0), availableWidth - (y.domain()[1] > 0 ? valuePadding : 0) ]);\n            else\n                y.range(yRange || [0, availableWidth]);\n\n            x0 = x0 || x;\n            y0 = y0 || d3.scale.linear().domain(y.domain()).range([y(0),y(0)]);\n\n            // Setup containers and skeleton of chart\n            var wrap = d3.select(this).selectAll('g.nv-wrap.nv-multibarHorizontal').data([data]);\n            var wrapEnter = wrap.enter().append('g').attr('class', 'nvd3 nv-wrap nv-multibarHorizontal');\n            var defsEnter = wrapEnter.append('defs');\n            var gEnter = wrapEnter.append('g');\n            var g = wrap.select('g');\n\n            gEnter.append('g').attr('class', 'nv-groups');\n            wrap.attr('transform', 'translate(' + margin.left + ',' + margin.top + ')');\n\n            var groups = wrap.select('.nv-groups').selectAll('.nv-group')\n                .data(function(d) { return d }, function(d,i) { return i });\n            groups.enter().append('g')\n                .style('stroke-opacity', 1e-6)\n                .style('fill-opacity', 1e-6);\n            groups.exit().watchTransition(renderWatch, 'multibarhorizontal: exit groups')\n                .style('stroke-opacity', 1e-6)\n                .style('fill-opacity', 1e-6)\n                .remove();\n            groups\n                .attr('class', function(d,i) { return 'nv-group nv-series-' + i })\n                .classed('hover', function(d) { return d.hover })\n                .style('fill', function(d,i){ return color(d, i) })\n                .style('stroke', function(d,i){ return color(d, i) });\n            groups.watchTransition(renderWatch, 'multibarhorizontal: groups')\n                .style('stroke-opacity', 1)\n                .style('fill-opacity', .75);\n\n            var bars = groups.selectAll('g.nv-bar')\n                .data(function(d) { return d.values });\n            bars.exit().remove();\n\n            var barsEnter = bars.enter().append('g')\n                .attr('transform', function(d,i,j) {\n                    return 'translate(' + y0(stacked ? d.y0 : 0) + ',' + (stacked ? 0 : (j * x.rangeBand() / data.length ) + x(getX(d,i))) + ')'\n                });\n\n            barsEnter.append('rect')\n                .attr('width', 0)\n                .attr('height', x.rangeBand() / (stacked ? 1 : data.length) )\n\n            bars\n                .on('mouseover', function(d,i) { //TODO: figure out why j works above, but not here\n                    d3.select(this).classed('hover', true);\n                    dispatch.elementMouseover({\n                        data: d,\n                        index: i,\n                        color: d3.select(this).style(\"fill\")\n                    });\n                })\n                .on('mouseout', function(d,i) {\n                    d3.select(this).classed('hover', false);\n                    dispatch.elementMouseout({\n                        data: d,\n                        index: i,\n                        color: d3.select(this).style(\"fill\")\n                    });\n                })\n                .on('mouseout', function(d,i) {\n                    dispatch.elementMouseout({\n                        data: d,\n                        index: i,\n                        color: d3.select(this).style(\"fill\")\n                    });\n                })\n                .on('mousemove', function(d,i) {\n                    dispatch.elementMousemove({\n                        data: d,\n                        index: i,\n                        color: d3.select(this).style(\"fill\")\n                    });\n                })\n                .on('click', function(d,i) {\n                    dispatch.elementClick({\n                        data: d,\n                        index: i,\n                        color: d3.select(this).style(\"fill\")\n                    });\n                    d3.event.stopPropagation();\n                })\n                .on('dblclick', function(d,i) {\n                    dispatch.elementDblClick({\n                        data: d,\n                        index: i,\n                        color: d3.select(this).style(\"fill\")\n                    });\n                    d3.event.stopPropagation();\n                });\n\n            if (getYerr(data[0],0)) {\n                barsEnter.append('polyline');\n\n                bars.select('polyline')\n                    .attr('fill', 'none')\n                    .attr('points', function(d,i) {\n                        var xerr = getYerr(d,i)\n                            , mid = 0.8 * x.rangeBand() / ((stacked ? 1 : data.length) * 2);\n                        xerr = xerr.length ? xerr : [-Math.abs(xerr), Math.abs(xerr)];\n                        xerr = xerr.map(function(e) { return y(e) - y(0); });\n                        var a = [[xerr[0],-mid], [xerr[0],mid], [xerr[0],0], [xerr[1],0], [xerr[1],-mid], [xerr[1],mid]];\n                        return a.map(function (path) { return path.join(',') }).join(' ');\n                    })\n                    .attr('transform', function(d,i) {\n                        var mid = x.rangeBand() / ((stacked ? 1 : data.length) * 2);\n                        return 'translate(' + (getY(d,i) < 0 ? 0 : y(getY(d,i)) - y(0)) + ', ' + mid + ')'\n                    });\n            }\n\n            barsEnter.append('text');\n\n            if (showValues && !stacked) {\n                bars.select('text')\n                    .attr('text-anchor', function(d,i) { return getY(d,i) < 0 ? 'end' : 'start' })\n                    .attr('y', x.rangeBand() / (data.length * 2))\n                    .attr('dy', '.32em')\n                    .text(function(d,i) {\n                        var t = valueFormat(getY(d,i))\n                            , yerr = getYerr(d,i);\n                        if (yerr === undefined)\n                            return t;\n                        if (!yerr.length)\n                            return t + '±' + valueFormat(Math.abs(yerr));\n                        return t + '+' + valueFormat(Math.abs(yerr[1])) + '-' + valueFormat(Math.abs(yerr[0]));\n                    });\n                bars.watchTransition(renderWatch, 'multibarhorizontal: bars')\n                    .select('text')\n                    .attr('x', function(d,i) { return getY(d,i) < 0 ? -4 : y(getY(d,i)) - y(0) + 4 })\n            } else {\n                bars.selectAll('text').text('');\n            }\n\n            if (showBarLabels && !stacked) {\n                barsEnter.append('text').classed('nv-bar-label',true);\n                bars.select('text.nv-bar-label')\n                    .attr('text-anchor', function(d,i) { return getY(d,i) < 0 ? 'start' : 'end' })\n                    .attr('y', x.rangeBand() / (data.length * 2))\n                    .attr('dy', '.32em')\n                    .text(function(d,i) { return getX(d,i) });\n                bars.watchTransition(renderWatch, 'multibarhorizontal: bars')\n                    .select('text.nv-bar-label')\n                    .attr('x', function(d,i) { return getY(d,i) < 0 ? y(0) - y(getY(d,i)) + 4 : -4 });\n            }\n            else {\n                bars.selectAll('text.nv-bar-label').text('');\n            }\n\n            bars\n                .attr('class', function(d,i) { return getY(d,i) < 0 ? 'nv-bar negative' : 'nv-bar positive'})\n\n            if (barColor) {\n                if (!disabled) disabled = data.map(function() { return true });\n                bars\n                    .style('fill', function(d,i,j) { return d3.rgb(barColor(d,i)).darker(  disabled.map(function(d,i) { return i }).filter(function(d,i){ return !disabled[i]  })[j]   ).toString(); })\n                    .style('stroke', function(d,i,j) { return d3.rgb(barColor(d,i)).darker(  disabled.map(function(d,i) { return i }).filter(function(d,i){ return !disabled[i]  })[j]   ).toString(); });\n            }\n\n            if (stacked)\n                bars.watchTransition(renderWatch, 'multibarhorizontal: bars')\n                    .attr('transform', function(d,i) {\n                        return 'translate(' + y(d.y1) + ',' + x(getX(d,i)) + ')'\n                    })\n                    .select('rect')\n                    .attr('width', function(d,i) {\n                        return Math.abs(y(getY(d,i) + d.y0) - y(d.y0))\n                    })\n                    .attr('height', x.rangeBand() );\n            else\n                bars.watchTransition(renderWatch, 'multibarhorizontal: bars')\n                    .attr('transform', function(d,i) {\n                        //TODO: stacked must be all positive or all negative, not both?\n                        return 'translate(' +\n                            (getY(d,i) < 0 ? y(getY(d,i)) : y(0))\n                            + ',' +\n                            (d.series * x.rangeBand() / data.length\n                                +\n                                x(getX(d,i)) )\n                            + ')'\n                    })\n                    .select('rect')\n                    .attr('height', x.rangeBand() / data.length )\n                    .attr('width', function(d,i) {\n                        return Math.max(Math.abs(y(getY(d,i)) - y(0)),1)\n                    });\n\n            //store old scales for use in transitions on update\n            x0 = x.copy();\n            y0 = y.copy();\n\n        });\n\n        renderWatch.renderEnd('multibarHorizontal immediate');\n        return chart;\n    }\n\n    //============================================================\n    // Expose Public Variables\n    //------------------------------------------------------------\n\n    chart.dispatch = dispatch;\n\n    chart.options = nv.utils.optionsFunc.bind(chart);\n\n    chart._options = Object.create({}, {\n        // simple options, just get/set the necessary values\n        width:   {get: function(){return width;}, set: function(_){width=_;}},\n        height:  {get: function(){return height;}, set: function(_){height=_;}},\n        x:       {get: function(){return getX;}, set: function(_){getX=_;}},\n        y:       {get: function(){return getY;}, set: function(_){getY=_;}},\n        yErr:       {get: function(){return getYerr;}, set: function(_){getYerr=_;}},\n        xScale:  {get: function(){return x;}, set: function(_){x=_;}},\n        yScale:  {get: function(){return y;}, set: function(_){y=_;}},\n        xDomain: {get: function(){return xDomain;}, set: function(_){xDomain=_;}},\n        yDomain: {get: function(){return yDomain;}, set: function(_){yDomain=_;}},\n        xRange:  {get: function(){return xRange;}, set: function(_){xRange=_;}},\n        yRange:  {get: function(){return yRange;}, set: function(_){yRange=_;}},\n        forceY:  {get: function(){return forceY;}, set: function(_){forceY=_;}},\n        stacked: {get: function(){return stacked;}, set: function(_){stacked=_;}},\n        showValues: {get: function(){return showValues;}, set: function(_){showValues=_;}},\n        // this shows the group name, seems pointless?\n        //showBarLabels:    {get: function(){return showBarLabels;}, set: function(_){showBarLabels=_;}},\n        disabled:     {get: function(){return disabled;}, set: function(_){disabled=_;}},\n        id:           {get: function(){return id;}, set: function(_){id=_;}},\n        valueFormat:  {get: function(){return valueFormat;}, set: function(_){valueFormat=_;}},\n        valuePadding: {get: function(){return valuePadding;}, set: function(_){valuePadding=_;}},\n        groupSpacing:{get: function(){return groupSpacing;}, set: function(_){groupSpacing=_;}},\n\n        // options that require extra logic in the setter\n        margin: {get: function(){return margin;}, set: function(_){\n            margin.top    = _.top    !== undefined ? _.top    : margin.top;\n            margin.right  = _.right  !== undefined ? _.right  : margin.right;\n            margin.bottom = _.bottom !== undefined ? _.bottom : margin.bottom;\n            margin.left   = _.left   !== undefined ? _.left   : margin.left;\n        }},\n        duration: {get: function(){return duration;}, set: function(_){\n            duration = _;\n            renderWatch.reset(duration);\n        }},\n        color:  {get: function(){return color;}, set: function(_){\n            color = nv.utils.getColor(_);\n        }},\n        barColor:  {get: function(){return barColor;}, set: function(_){\n            barColor = _ ? nv.utils.getColor(_) : null;\n        }}\n    });\n\n    nv.utils.initOptions(chart);\n\n    return chart;\n};\n\nnv.models.multiBarHorizontalChart = function() {\n    \"use strict\";\n\n    //============================================================\n    // Public Variables with Default Settings\n    //------------------------------------------------------------\n\n    var multibar = nv.models.multiBarHorizontal()\n        , xAxis = nv.models.axis()\n        , yAxis = nv.models.axis()\n        , legend = nv.models.legend().height(30)\n        , controls = nv.models.legend().height(30)\n        , tooltip = nv.models.tooltip()\n        ;\n\n    var margin = {top: 30, right: 20, bottom: 50, left: 60}\n        , width = null\n        , height = null\n        , color = nv.utils.defaultColor()\n        , showControls = true\n        , controlLabels = {}\n        , showLegend = true\n        , showXAxis = true\n        , showYAxis = true\n        , stacked = false\n        , x //can be accessed via chart.xScale()\n        , y //can be accessed via chart.yScale()\n        , state = nv.utils.state()\n        , defaultState = null\n        , noData = null\n        , dispatch = d3.dispatch('stateChange', 'changeState','renderEnd')\n        , controlWidth = function() { return showControls ? 180 : 0 }\n        , duration = 250\n        ;\n\n    state.stacked = false; // DEPRECATED Maintained for backward compatibility\n\n    multibar.stacked(stacked);\n\n    xAxis\n        .orient('left')\n        .tickPadding(5)\n        .showMaxMin(false)\n        .tickFormat(function(d) { return d })\n    ;\n    yAxis\n        .orient('bottom')\n        .tickFormat(d3.format(',.1f'))\n    ;\n\n    tooltip\n        .duration(0)\n        .valueFormatter(function(d, i) {\n            return yAxis.tickFormat()(d, i);\n        })\n        .headerFormatter(function(d, i) {\n            return xAxis.tickFormat()(d, i);\n        });\n\n    controls.updateState(false);\n\n    //============================================================\n    // Private Variables\n    //------------------------------------------------------------\n\n    var stateGetter = function(data) {\n        return function(){\n            return {\n                active: data.map(function(d) { return !d.disabled }),\n                stacked: stacked\n            };\n        }\n    };\n\n    var stateSetter = function(data) {\n        return function(state) {\n            if (state.stacked !== undefined)\n                stacked = state.stacked;\n            if (state.active !== undefined)\n                data.forEach(function(series,i) {\n                    series.disabled = !state.active[i];\n                });\n        }\n    };\n\n    var renderWatch = nv.utils.renderWatch(dispatch, duration);\n\n    function chart(selection) {\n        renderWatch.reset();\n        renderWatch.models(multibar);\n        if (showXAxis) renderWatch.models(xAxis);\n        if (showYAxis) renderWatch.models(yAxis);\n\n        selection.each(function(data) {\n            var container = d3.select(this),\n                that = this;\n            nv.utils.initSVG(container);\n            var availableWidth = nv.utils.availableWidth(width, container, margin),\n                availableHeight = nv.utils.availableHeight(height, container, margin);\n\n            chart.update = function() { container.transition().duration(duration).call(chart) };\n            chart.container = this;\n\n            stacked = multibar.stacked();\n\n            state\n                .setter(stateSetter(data), chart.update)\n                .getter(stateGetter(data))\n                .update();\n\n            // DEPRECATED set state.disableddisabled\n            state.disabled = data.map(function(d) { return !!d.disabled });\n\n            if (!defaultState) {\n                var key;\n                defaultState = {};\n                for (key in state) {\n                    if (state[key] instanceof Array)\n                        defaultState[key] = state[key].slice(0);\n                    else\n                        defaultState[key] = state[key];\n                }\n            }\n\n            // Display No Data message if there's nothing to show.\n            if (!data || !data.length || !data.filter(function(d) { return d.values.length }).length) {\n                nv.utils.noData(chart, container)\n                return chart;\n            } else {\n                container.selectAll('.nv-noData').remove();\n            }\n\n            // Setup Scales\n            x = multibar.xScale();\n            y = multibar.yScale();\n\n            // Setup containers and skeleton of chart\n            var wrap = container.selectAll('g.nv-wrap.nv-multiBarHorizontalChart').data([data]);\n            var gEnter = wrap.enter().append('g').attr('class', 'nvd3 nv-wrap nv-multiBarHorizontalChart').append('g');\n            var g = wrap.select('g');\n\n            gEnter.append('g').attr('class', 'nv-x nv-axis');\n            gEnter.append('g').attr('class', 'nv-y nv-axis')\n                .append('g').attr('class', 'nv-zeroLine')\n                .append('line');\n            gEnter.append('g').attr('class', 'nv-barsWrap');\n            gEnter.append('g').attr('class', 'nv-legendWrap');\n            gEnter.append('g').attr('class', 'nv-controlsWrap');\n\n            // Legend\n            if (showLegend) {\n                legend.width(availableWidth - controlWidth());\n\n                g.select('.nv-legendWrap')\n                    .datum(data)\n                    .call(legend);\n\n                if ( margin.top != legend.height()) {\n                    margin.top = legend.height();\n                    availableHeight = nv.utils.availableHeight(height, container, margin);\n                }\n\n                g.select('.nv-legendWrap')\n                    .attr('transform', 'translate(' + controlWidth() + ',' + (-margin.top) +')');\n            }\n\n            // Controls\n            if (showControls) {\n                var controlsData = [\n                    { key: controlLabels.grouped || 'Grouped', disabled: multibar.stacked() },\n                    { key: controlLabels.stacked || 'Stacked', disabled: !multibar.stacked() }\n                ];\n\n                controls.width(controlWidth()).color(['#444', '#444', '#444']);\n                g.select('.nv-controlsWrap')\n                    .datum(controlsData)\n                    .attr('transform', 'translate(0,' + (-margin.top) +')')\n                    .call(controls);\n            }\n\n            wrap.attr('transform', 'translate(' + margin.left + ',' + margin.top + ')');\n\n            // Main Chart Component(s)\n            multibar\n                .disabled(data.map(function(series) { return series.disabled }))\n                .width(availableWidth)\n                .height(availableHeight)\n                .color(data.map(function(d,i) {\n                    return d.color || color(d, i);\n                }).filter(function(d,i) { return !data[i].disabled }));\n\n            var barsWrap = g.select('.nv-barsWrap')\n                .datum(data.filter(function(d) { return !d.disabled }));\n\n            barsWrap.transition().call(multibar);\n\n            // Setup Axes\n            if (showXAxis) {\n                xAxis\n                    .scale(x)\n                    ._ticks( nv.utils.calcTicksY(availableHeight/24, data) )\n                    .tickSize(-availableWidth, 0);\n\n                g.select('.nv-x.nv-axis').call(xAxis);\n\n                var xTicks = g.select('.nv-x.nv-axis').selectAll('g');\n\n                xTicks\n                    .selectAll('line, text');\n            }\n\n            if (showYAxis) {\n                yAxis\n                    .scale(y)\n                    ._ticks( nv.utils.calcTicksX(availableWidth/100, data) )\n                    .tickSize( -availableHeight, 0);\n\n                g.select('.nv-y.nv-axis')\n                    .attr('transform', 'translate(0,' + availableHeight + ')');\n                g.select('.nv-y.nv-axis').call(yAxis);\n            }\n\n            // Zero line\n            g.select(\".nv-zeroLine line\")\n                .attr(\"x1\", y(0))\n                .attr(\"x2\", y(0))\n                .attr(\"y1\", 0)\n                .attr(\"y2\", -availableHeight)\n            ;\n\n            //============================================================\n            // Event Handling/Dispatching (in chart's scope)\n            //------------------------------------------------------------\n\n            legend.dispatch.on('stateChange', function(newState) {\n                for (var key in newState)\n                    state[key] = newState[key];\n                dispatch.stateChange(state);\n                chart.update();\n            });\n\n            controls.dispatch.on('legendClick', function(d,i) {\n                if (!d.disabled) return;\n                controlsData = controlsData.map(function(s) {\n                    s.disabled = true;\n                    return s;\n                });\n                d.disabled = false;\n\n                switch (d.key) {\n                    case 'Grouped':\n                        multibar.stacked(false);\n                        break;\n                    case 'Stacked':\n                        multibar.stacked(true);\n                        break;\n                }\n\n                state.stacked = multibar.stacked();\n                dispatch.stateChange(state);\n                stacked = multibar.stacked();\n\n                chart.update();\n            });\n\n            // Update chart from a state object passed to event handler\n            dispatch.on('changeState', function(e) {\n\n                if (typeof e.disabled !== 'undefined') {\n                    data.forEach(function(series,i) {\n                        series.disabled = e.disabled[i];\n                    });\n\n                    state.disabled = e.disabled;\n                }\n\n                if (typeof e.stacked !== 'undefined') {\n                    multibar.stacked(e.stacked);\n                    state.stacked = e.stacked;\n                    stacked = e.stacked;\n                }\n\n                chart.update();\n            });\n        });\n        renderWatch.renderEnd('multibar horizontal chart immediate');\n        return chart;\n    }\n\n    //============================================================\n    // Event Handling/Dispatching (out of chart's scope)\n    //------------------------------------------------------------\n\n    multibar.dispatch.on('elementMouseover.tooltip', function(evt) {\n        evt.value = chart.x()(evt.data);\n        evt['series'] = {\n            key: evt.data.key,\n            value: chart.y()(evt.data),\n            color: evt.color\n        };\n        tooltip.data(evt).hidden(false);\n    });\n\n    multibar.dispatch.on('elementMouseout.tooltip', function(evt) {\n        tooltip.hidden(true);\n    });\n\n    multibar.dispatch.on('elementMousemove.tooltip', function(evt) {\n        tooltip.position({top: d3.event.pageY, left: d3.event.pageX})();\n    });\n\n    //============================================================\n    // Expose Public Variables\n    //------------------------------------------------------------\n\n    // expose chart's sub-components\n    chart.dispatch = dispatch;\n    chart.multibar = multibar;\n    chart.legend = legend;\n    chart.controls = controls;\n    chart.xAxis = xAxis;\n    chart.yAxis = yAxis;\n    chart.state = state;\n    chart.tooltip = tooltip;\n\n    chart.options = nv.utils.optionsFunc.bind(chart);\n\n    chart._options = Object.create({}, {\n        // simple options, just get/set the necessary values\n        width:      {get: function(){return width;}, set: function(_){width=_;}},\n        height:     {get: function(){return height;}, set: function(_){height=_;}},\n        showLegend: {get: function(){return showLegend;}, set: function(_){showLegend=_;}},\n        showControls: {get: function(){return showControls;}, set: function(_){showControls=_;}},\n        controlLabels: {get: function(){return controlLabels;}, set: function(_){controlLabels=_;}},\n        showXAxis:      {get: function(){return showXAxis;}, set: function(_){showXAxis=_;}},\n        showYAxis:    {get: function(){return showYAxis;}, set: function(_){showYAxis=_;}},\n        defaultState:    {get: function(){return defaultState;}, set: function(_){defaultState=_;}},\n        noData:    {get: function(){return noData;}, set: function(_){noData=_;}},\n\n        // deprecated options\n        tooltips:    {get: function(){return tooltip.enabled();}, set: function(_){\n            // deprecated after 1.7.1\n            nv.deprecated('tooltips', 'use chart.tooltip.enabled() instead');\n            tooltip.enabled(!!_);\n        }},\n        tooltipContent:    {get: function(){return tooltip.contentGenerator();}, set: function(_){\n            // deprecated after 1.7.1\n            nv.deprecated('tooltipContent', 'use chart.tooltip.contentGenerator() instead');\n            tooltip.contentGenerator(_);\n        }},\n\n        // options that require extra logic in the setter\n        margin: {get: function(){return margin;}, set: function(_){\n            margin.top    = _.top    !== undefined ? _.top    : margin.top;\n            margin.right  = _.right  !== undefined ? _.right  : margin.right;\n            margin.bottom = _.bottom !== undefined ? _.bottom : margin.bottom;\n            margin.left   = _.left   !== undefined ? _.left   : margin.left;\n        }},\n        duration: {get: function(){return duration;}, set: function(_){\n            duration = _;\n            renderWatch.reset(duration);\n            multibar.duration(duration);\n            xAxis.duration(duration);\n            yAxis.duration(duration);\n        }},\n        color:  {get: function(){return color;}, set: function(_){\n            color = nv.utils.getColor(_);\n            legend.color(color);\n        }},\n        barColor:  {get: function(){return multibar.barColor;}, set: function(_){\n            multibar.barColor(_);\n            legend.color(function(d,i) {return d3.rgb('#ccc').darker(i * 1.5).toString();})\n        }}\n    });\n\n    nv.utils.inheritOptions(chart, multibar);\n    nv.utils.initOptions(chart);\n\n    return chart;\n};\nnv.models.multiChart = function() {\n    \"use strict\";\n\n    //============================================================\n    // Public Variables with Default Settings\n    //------------------------------------------------------------\n\n    var margin = {top: 30, right: 20, bottom: 50, left: 60},\n        color = nv.utils.defaultColor(),\n        width = null,\n        height = null,\n        showLegend = true,\n        noData = null,\n        yDomain1,\n        yDomain2,\n        getX = function(d) { return d.x },\n        getY = function(d) { return d.y},\n        interpolate = 'monotone',\n        useVoronoi = true\n        ;\n\n    //============================================================\n    // Private Variables\n    //------------------------------------------------------------\n\n    var x = d3.scale.linear(),\n        yScale1 = d3.scale.linear(),\n        yScale2 = d3.scale.linear(),\n\n        lines1 = nv.models.line().yScale(yScale1),\n        lines2 = nv.models.line().yScale(yScale2),\n\n        bars1 = nv.models.multiBar().stacked(false).yScale(yScale1),\n        bars2 = nv.models.multiBar().stacked(false).yScale(yScale2),\n\n        stack1 = nv.models.stackedArea().yScale(yScale1),\n        stack2 = nv.models.stackedArea().yScale(yScale2),\n\n        xAxis = nv.models.axis().scale(x).orient('bottom').tickPadding(5),\n        yAxis1 = nv.models.axis().scale(yScale1).orient('left'),\n        yAxis2 = nv.models.axis().scale(yScale2).orient('right'),\n\n        legend = nv.models.legend().height(30),\n        tooltip = nv.models.tooltip(),\n        dispatch = d3.dispatch();\n\n    function chart(selection) {\n        selection.each(function(data) {\n            var container = d3.select(this),\n                that = this;\n            nv.utils.initSVG(container);\n\n            chart.update = function() { container.transition().call(chart); };\n            chart.container = this;\n\n            var availableWidth = nv.utils.availableWidth(width, container, margin),\n                availableHeight = nv.utils.availableHeight(height, container, margin);\n\n            var dataLines1 = data.filter(function(d) {return d.type == 'line' && d.yAxis == 1});\n            var dataLines2 = data.filter(function(d) {return d.type == 'line' && d.yAxis == 2});\n            var dataBars1 =  data.filter(function(d) {return d.type == 'bar'  && d.yAxis == 1});\n            var dataBars2 =  data.filter(function(d) {return d.type == 'bar'  && d.yAxis == 2});\n            var dataStack1 = data.filter(function(d) {return d.type == 'area' && d.yAxis == 1});\n            var dataStack2 = data.filter(function(d) {return d.type == 'area' && d.yAxis == 2});\n\n            // Display noData message if there's nothing to show.\n            if (!data || !data.length || !data.filter(function(d) { return d.values.length }).length) {\n                nv.utils.noData(chart, container);\n                return chart;\n            } else {\n                container.selectAll('.nv-noData').remove();\n            }\n\n            var series1 = data.filter(function(d) {return !d.disabled && d.yAxis == 1})\n                .map(function(d) {\n                    return d.values.map(function(d,i) {\n                        return { x: d.x, y: d.y }\n                    })\n                });\n\n            var series2 = data.filter(function(d) {return !d.disabled && d.yAxis == 2})\n                .map(function(d) {\n                    return d.values.map(function(d,i) {\n                        return { x: d.x, y: d.y }\n                    })\n                });\n\n            x   .domain(d3.extent(d3.merge(series1.concat(series2)), function(d) { return d.x } ))\n                .range([0, availableWidth]);\n\n            var wrap = container.selectAll('g.wrap.multiChart').data([data]);\n            var gEnter = wrap.enter().append('g').attr('class', 'wrap nvd3 multiChart').append('g');\n\n            gEnter.append('g').attr('class', 'nv-x nv-axis');\n            gEnter.append('g').attr('class', 'nv-y1 nv-axis');\n            gEnter.append('g').attr('class', 'nv-y2 nv-axis');\n            gEnter.append('g').attr('class', 'lines1Wrap');\n            gEnter.append('g').attr('class', 'lines2Wrap');\n            gEnter.append('g').attr('class', 'bars1Wrap');\n            gEnter.append('g').attr('class', 'bars2Wrap');\n            gEnter.append('g').attr('class', 'stack1Wrap');\n            gEnter.append('g').attr('class', 'stack2Wrap');\n            gEnter.append('g').attr('class', 'legendWrap');\n\n            var g = wrap.select('g');\n\n            var color_array = data.map(function(d,i) {\n                return data[i].color || color(d, i);\n            });\n\n            if (showLegend) {\n                var legendWidth = legend.align() ? availableWidth / 2 : availableWidth;\n                var legendXPosition = legend.align() ? legendWidth : 0;\n\n                legend.width(legendWidth);\n                legend.color(color_array);\n\n                g.select('.legendWrap')\n                    .datum(data.map(function(series) {\n                        series.originalKey = series.originalKey === undefined ? series.key : series.originalKey;\n                        series.key = series.originalKey + (series.yAxis == 1 ? '' : ' (right axis)');\n                        return series;\n                    }))\n                    .call(legend);\n\n                if ( margin.top != legend.height()) {\n                    margin.top = legend.height();\n                    availableHeight = nv.utils.availableHeight(height, container, margin);\n                }\n\n                g.select('.legendWrap')\n                    .attr('transform', 'translate(' + legendXPosition + ',' + (-margin.top) +')');\n            }\n\n            lines1\n                .width(availableWidth)\n                .height(availableHeight)\n                .interpolate(interpolate)\n                .color(color_array.filter(function(d,i) { return !data[i].disabled && data[i].yAxis == 1 && data[i].type == 'line'}));\n            lines2\n                .width(availableWidth)\n                .height(availableHeight)\n                .interpolate(interpolate)\n                .color(color_array.filter(function(d,i) { return !data[i].disabled && data[i].yAxis == 2 && data[i].type == 'line'}));\n            bars1\n                .width(availableWidth)\n                .height(availableHeight)\n                .color(color_array.filter(function(d,i) { return !data[i].disabled && data[i].yAxis == 1 && data[i].type == 'bar'}));\n            bars2\n                .width(availableWidth)\n                .height(availableHeight)\n                .color(color_array.filter(function(d,i) { return !data[i].disabled && data[i].yAxis == 2 && data[i].type == 'bar'}));\n            stack1\n                .width(availableWidth)\n                .height(availableHeight)\n                .color(color_array.filter(function(d,i) { return !data[i].disabled && data[i].yAxis == 1 && data[i].type == 'area'}));\n            stack2\n                .width(availableWidth)\n                .height(availableHeight)\n                .color(color_array.filter(function(d,i) { return !data[i].disabled && data[i].yAxis == 2 && data[i].type == 'area'}));\n\n            g.attr('transform', 'translate(' + margin.left + ',' + margin.top + ')');\n\n            var lines1Wrap = g.select('.lines1Wrap')\n                .datum(dataLines1.filter(function(d){return !d.disabled}));\n            var bars1Wrap = g.select('.bars1Wrap')\n                .datum(dataBars1.filter(function(d){return !d.disabled}));\n            var stack1Wrap = g.select('.stack1Wrap')\n                .datum(dataStack1.filter(function(d){return !d.disabled}));\n            var lines2Wrap = g.select('.lines2Wrap')\n                .datum(dataLines2.filter(function(d){return !d.disabled}));\n            var bars2Wrap = g.select('.bars2Wrap')\n                .datum(dataBars2.filter(function(d){return !d.disabled}));\n            var stack2Wrap = g.select('.stack2Wrap')\n                .datum(dataStack2.filter(function(d){return !d.disabled}));\n\n            var extraValue1 = dataStack1.length ? dataStack1.map(function(a){return a.values}).reduce(function(a,b){\n                return a.map(function(aVal,i){return {x: aVal.x, y: aVal.y + b[i].y}})\n            }).concat([{x:0, y:0}]) : [];\n            var extraValue2 = dataStack2.length ? dataStack2.map(function(a){return a.values}).reduce(function(a,b){\n                return a.map(function(aVal,i){return {x: aVal.x, y: aVal.y + b[i].y}})\n            }).concat([{x:0, y:0}]) : [];\n\n            yScale1 .domain(yDomain1 || d3.extent(d3.merge(series1).concat(extraValue1), function(d) { return d.y } ))\n                .range([0, availableHeight]);\n\n            yScale2 .domain(yDomain2 || d3.extent(d3.merge(series2).concat(extraValue2), function(d) { return d.y } ))\n                .range([0, availableHeight]);\n\n            lines1.yDomain(yScale1.domain());\n            bars1.yDomain(yScale1.domain());\n            stack1.yDomain(yScale1.domain());\n\n            lines2.yDomain(yScale2.domain());\n            bars2.yDomain(yScale2.domain());\n            stack2.yDomain(yScale2.domain());\n\n            if(dataStack1.length){d3.transition(stack1Wrap).call(stack1);}\n            if(dataStack2.length){d3.transition(stack2Wrap).call(stack2);}\n\n            if(dataBars1.length){d3.transition(bars1Wrap).call(bars1);}\n            if(dataBars2.length){d3.transition(bars2Wrap).call(bars2);}\n\n            if(dataLines1.length){d3.transition(lines1Wrap).call(lines1);}\n            if(dataLines2.length){d3.transition(lines2Wrap).call(lines2);}\n\n            xAxis\n                ._ticks( nv.utils.calcTicksX(availableWidth/100, data) )\n                .tickSize(-availableHeight, 0);\n\n            g.select('.nv-x.nv-axis')\n                .attr('transform', 'translate(0,' + availableHeight + ')');\n            d3.transition(g.select('.nv-x.nv-axis'))\n                .call(xAxis);\n\n            yAxis1\n                ._ticks( nv.utils.calcTicksY(availableHeight/36, data) )\n                .tickSize( -availableWidth, 0);\n\n\n            d3.transition(g.select('.nv-y1.nv-axis'))\n                .call(yAxis1);\n\n            yAxis2\n                ._ticks( nv.utils.calcTicksY(availableHeight/36, data) )\n                .tickSize( -availableWidth, 0);\n\n            d3.transition(g.select('.nv-y2.nv-axis'))\n                .call(yAxis2);\n\n            g.select('.nv-y1.nv-axis')\n                .classed('nv-disabled', series1.length ? false : true)\n                .attr('transform', 'translate(' + x.range()[0] + ',0)');\n\n            g.select('.nv-y2.nv-axis')\n                .classed('nv-disabled', series2.length ? false : true)\n                .attr('transform', 'translate(' + x.range()[1] + ',0)');\n\n            legend.dispatch.on('stateChange', function(newState) {\n                chart.update();\n            });\n\n            //============================================================\n            // Event Handling/Dispatching\n            //------------------------------------------------------------\n\n            function mouseover_line(evt) {\n                var yaxis = data[evt.seriesIndex].yAxis === 2 ? yAxis2 : yAxis1;\n                evt.value = evt.point.x;\n                evt.series = {\n                    value: evt.point.y,\n                    color: evt.point.color\n                };\n                tooltip\n                    .duration(100)\n                    .valueFormatter(function(d, i) {\n                        return yaxis.tickFormat()(d, i);\n                    })\n                    .data(evt)\n                    .position(evt.pos)\n                    .hidden(false);\n            }\n\n            function mouseover_stack(evt) {\n                var yaxis = data[evt.seriesIndex].yAxis === 2 ? yAxis2 : yAxis1;\n                evt.point['x'] = stack1.x()(evt.point);\n                evt.point['y'] = stack1.y()(evt.point);\n                tooltip\n                    .duration(100)\n                    .valueFormatter(function(d, i) {\n                        return yaxis.tickFormat()(d, i);\n                    })\n                    .data(evt)\n                    .position(evt.pos)\n                    .hidden(false);\n            }\n\n            function mouseover_bar(evt) {\n                var yaxis = data[evt.data.series].yAxis === 2 ? yAxis2 : yAxis1;\n\n                evt.value = bars1.x()(evt.data);\n                evt['series'] = {\n                    value: bars1.y()(evt.data),\n                    color: evt.color\n                };\n                tooltip\n                    .duration(0)\n                    .valueFormatter(function(d, i) {\n                        return yaxis.tickFormat()(d, i);\n                    })\n                    .data(evt)\n                    .hidden(false);\n            }\n\n            lines1.dispatch.on('elementMouseover.tooltip', mouseover_line);\n            lines2.dispatch.on('elementMouseover.tooltip', mouseover_line);\n            lines1.dispatch.on('elementMouseout.tooltip', function(evt) {\n                tooltip.hidden(true)\n            });\n            lines2.dispatch.on('elementMouseout.tooltip', function(evt) {\n                tooltip.hidden(true)\n            });\n\n            stack1.dispatch.on('elementMouseover.tooltip', mouseover_stack);\n            stack2.dispatch.on('elementMouseover.tooltip', mouseover_stack);\n            stack1.dispatch.on('elementMouseout.tooltip', function(evt) {\n                tooltip.hidden(true)\n            });\n            stack2.dispatch.on('elementMouseout.tooltip', function(evt) {\n                tooltip.hidden(true)\n            });\n\n            bars1.dispatch.on('elementMouseover.tooltip', mouseover_bar);\n            bars2.dispatch.on('elementMouseover.tooltip', mouseover_bar);\n\n            bars1.dispatch.on('elementMouseout.tooltip', function(evt) {\n                tooltip.hidden(true);\n            });\n            bars2.dispatch.on('elementMouseout.tooltip', function(evt) {\n                tooltip.hidden(true);\n            });\n            bars1.dispatch.on('elementMousemove.tooltip', function(evt) {\n                tooltip.position({top: d3.event.pageY, left: d3.event.pageX})();\n            });\n            bars2.dispatch.on('elementMousemove.tooltip', function(evt) {\n                tooltip.position({top: d3.event.pageY, left: d3.event.pageX})();\n            });\n\n        });\n\n        return chart;\n    }\n\n    //============================================================\n    // Global getters and setters\n    //------------------------------------------------------------\n\n    chart.dispatch = dispatch;\n    chart.lines1 = lines1;\n    chart.lines2 = lines2;\n    chart.bars1 = bars1;\n    chart.bars2 = bars2;\n    chart.stack1 = stack1;\n    chart.stack2 = stack2;\n    chart.xAxis = xAxis;\n    chart.yAxis1 = yAxis1;\n    chart.yAxis2 = yAxis2;\n    chart.tooltip = tooltip;\n\n    chart.options = nv.utils.optionsFunc.bind(chart);\n\n    chart._options = Object.create({}, {\n        // simple options, just get/set the necessary values\n        width:      {get: function(){return width;}, set: function(_){width=_;}},\n        height:     {get: function(){return height;}, set: function(_){height=_;}},\n        showLegend: {get: function(){return showLegend;}, set: function(_){showLegend=_;}},\n        yDomain1:      {get: function(){return yDomain1;}, set: function(_){yDomain1=_;}},\n        yDomain2:    {get: function(){return yDomain2;}, set: function(_){yDomain2=_;}},\n        noData:    {get: function(){return noData;}, set: function(_){noData=_;}},\n        interpolate:    {get: function(){return interpolate;}, set: function(_){interpolate=_;}},\n\n        // deprecated options\n        tooltips:    {get: function(){return tooltip.enabled();}, set: function(_){\n            // deprecated after 1.7.1\n            nv.deprecated('tooltips', 'use chart.tooltip.enabled() instead');\n            tooltip.enabled(!!_);\n        }},\n        tooltipContent:    {get: function(){return tooltip.contentGenerator();}, set: function(_){\n            // deprecated after 1.7.1\n            nv.deprecated('tooltipContent', 'use chart.tooltip.contentGenerator() instead');\n            tooltip.contentGenerator(_);\n        }},\n\n        // options that require extra logic in the setter\n        margin: {get: function(){return margin;}, set: function(_){\n            margin.top    = _.top    !== undefined ? _.top    : margin.top;\n            margin.right  = _.right  !== undefined ? _.right  : margin.right;\n            margin.bottom = _.bottom !== undefined ? _.bottom : margin.bottom;\n            margin.left   = _.left   !== undefined ? _.left   : margin.left;\n        }},\n        color:  {get: function(){return color;}, set: function(_){\n            color = nv.utils.getColor(_);\n        }},\n        x: {get: function(){return getX;}, set: function(_){\n            getX = _;\n            lines1.x(_);\n            lines2.x(_);\n            bars1.x(_);\n            bars2.x(_);\n            stack1.x(_);\n            stack2.x(_);\n        }},\n        y: {get: function(){return getY;}, set: function(_){\n            getY = _;\n            lines1.y(_);\n            lines2.y(_);\n            stack1.y(_);\n            stack2.y(_);\n            bars1.y(_);\n            bars2.y(_);\n        }},\n        useVoronoi: {get: function(){return useVoronoi;}, set: function(_){\n            useVoronoi=_;\n            lines1.useVoronoi(_);\n            lines2.useVoronoi(_);\n            stack1.useVoronoi(_);\n            stack2.useVoronoi(_);\n        }}\n    });\n\n    nv.utils.initOptions(chart);\n\n    return chart;\n};\n\n\nnv.models.ohlcBar = function() {\n    \"use strict\";\n\n    //============================================================\n    // Public Variables with Default Settings\n    //------------------------------------------------------------\n\n    var margin = {top: 0, right: 0, bottom: 0, left: 0}\n        , width = null\n        , height = null\n        , id = Math.floor(Math.random() * 10000) //Create semi-unique ID in case user doesn't select one\n        , container = null\n        , x = d3.scale.linear()\n        , y = d3.scale.linear()\n        , getX = function(d) { return d.x }\n        , getY = function(d) { return d.y }\n        , getOpen = function(d) { return d.open }\n        , getClose = function(d) { return d.close }\n        , getHigh = function(d) { return d.high }\n        , getLow = function(d) { return d.low }\n        , forceX = []\n        , forceY = []\n        , padData     = false // If true, adds half a data points width to front and back, for lining up a line chart with a bar chart\n        , clipEdge = true\n        , color = nv.utils.defaultColor()\n        , interactive = false\n        , xDomain\n        , yDomain\n        , xRange\n        , yRange\n        , dispatch = d3.dispatch('tooltipShow', 'tooltipHide', 'stateChange', 'changeState', 'renderEnd', 'chartClick', 'elementClick', 'elementDblClick', 'elementMouseover', 'elementMouseout', 'elementMousemove')\n        ;\n\n    //============================================================\n    // Private Variables\n    //------------------------------------------------------------\n\n    function chart(selection) {\n        selection.each(function(data) {\n            container = d3.select(this);\n            var availableWidth = nv.utils.availableWidth(width, container, margin),\n                availableHeight = nv.utils.availableHeight(height, container, margin);\n\n            nv.utils.initSVG(container);\n\n            // ohlc bar width.\n            var w = (availableWidth / data[0].values.length) * .9;\n\n            // Setup Scales\n            x.domain(xDomain || d3.extent(data[0].values.map(getX).concat(forceX) ));\n\n            if (padData)\n                x.range(xRange || [availableWidth * .5 / data[0].values.length, availableWidth * (data[0].values.length - .5)  / data[0].values.length ]);\n            else\n                x.range(xRange || [5 + w/2, availableWidth - w/2 - 5]);\n\n            y.domain(yDomain || [\n                    d3.min(data[0].values.map(getLow).concat(forceY)),\n                    d3.max(data[0].values.map(getHigh).concat(forceY))\n                ]\n            ).range(yRange || [availableHeight, 0]);\n\n            // If scale's domain don't have a range, slightly adjust to make one... so a chart can show a single data point\n            if (x.domain()[0] === x.domain()[1])\n                x.domain()[0] ?\n                    x.domain([x.domain()[0] - x.domain()[0] * 0.01, x.domain()[1] + x.domain()[1] * 0.01])\n                    : x.domain([-1,1]);\n\n            if (y.domain()[0] === y.domain()[1])\n                y.domain()[0] ?\n                    y.domain([y.domain()[0] + y.domain()[0] * 0.01, y.domain()[1] - y.domain()[1] * 0.01])\n                    : y.domain([-1,1]);\n\n            // Setup containers and skeleton of chart\n            var wrap = d3.select(this).selectAll('g.nv-wrap.nv-ohlcBar').data([data[0].values]);\n            var wrapEnter = wrap.enter().append('g').attr('class', 'nvd3 nv-wrap nv-ohlcBar');\n            var defsEnter = wrapEnter.append('defs');\n            var gEnter = wrapEnter.append('g');\n            var g = wrap.select('g');\n\n            gEnter.append('g').attr('class', 'nv-ticks');\n\n            wrap.attr('transform', 'translate(' + margin.left + ',' + margin.top + ')');\n\n            container\n                .on('click', function(d,i) {\n                    dispatch.chartClick({\n                        data: d,\n                        index: i,\n                        pos: d3.event,\n                        id: id\n                    });\n                });\n\n            defsEnter.append('clipPath')\n                .attr('id', 'nv-chart-clip-path-' + id)\n                .append('rect');\n\n            wrap.select('#nv-chart-clip-path-' + id + ' rect')\n                .attr('width', availableWidth)\n                .attr('height', availableHeight);\n\n            g   .attr('clip-path', clipEdge ? 'url(#nv-chart-clip-path-' + id + ')' : '');\n\n            var ticks = wrap.select('.nv-ticks').selectAll('.nv-tick')\n                .data(function(d) { return d });\n            ticks.exit().remove();\n\n            ticks.enter().append('path')\n                .attr('class', function(d,i,j) { return (getOpen(d,i) > getClose(d,i) ? 'nv-tick negative' : 'nv-tick positive') + ' nv-tick-' + j + '-' + i })\n                .attr('d', function(d,i) {\n                    return 'm0,0l0,'\n                        + (y(getOpen(d,i))\n                            - y(getHigh(d,i)))\n                        + 'l'\n                        + (-w/2)\n                        + ',0l'\n                        + (w/2)\n                        + ',0l0,'\n                        + (y(getLow(d,i)) - y(getOpen(d,i)))\n                        + 'l0,'\n                        + (y(getClose(d,i))\n                            - y(getLow(d,i)))\n                        + 'l'\n                        + (w/2)\n                        + ',0l'\n                        + (-w/2)\n                        + ',0z';\n                })\n                .attr('transform', function(d,i) { return 'translate(' + x(getX(d,i)) + ',' + y(getHigh(d,i)) + ')'; })\n                .attr('fill', function(d,i) { return color[0]; })\n                .attr('stroke', function(d,i) { return color[0]; })\n                .attr('x', 0 )\n                .attr('y', function(d,i) {  return y(Math.max(0, getY(d,i))) })\n                .attr('height', function(d,i) { return Math.abs(y(getY(d,i)) - y(0)) });\n\n            // the bar colors are controlled by CSS currently\n            ticks.attr('class', function(d,i,j) {\n                return (getOpen(d,i) > getClose(d,i) ? 'nv-tick negative' : 'nv-tick positive') + ' nv-tick-' + j + '-' + i;\n            });\n\n            d3.transition(ticks)\n                .attr('transform', function(d,i) { return 'translate(' + x(getX(d,i)) + ',' + y(getHigh(d,i)) + ')'; })\n                .attr('d', function(d,i) {\n                    var w = (availableWidth / data[0].values.length) * .9;\n                    return 'm0,0l0,'\n                        + (y(getOpen(d,i))\n                            - y(getHigh(d,i)))\n                        + 'l'\n                        + (-w/2)\n                        + ',0l'\n                        + (w/2)\n                        + ',0l0,'\n                        + (y(getLow(d,i))\n                            - y(getOpen(d,i)))\n                        + 'l0,'\n                        + (y(getClose(d,i))\n                            - y(getLow(d,i)))\n                        + 'l'\n                        + (w/2)\n                        + ',0l'\n                        + (-w/2)\n                        + ',0z';\n                });\n        });\n\n        return chart;\n    }\n\n\n    //Create methods to allow outside functions to highlight a specific bar.\n    chart.highlightPoint = function(pointIndex, isHoverOver) {\n        chart.clearHighlights();\n        container.select(\".nv-ohlcBar .nv-tick-0-\" + pointIndex)\n            .classed(\"hover\", isHoverOver)\n        ;\n    };\n\n    chart.clearHighlights = function() {\n        container.select(\".nv-ohlcBar .nv-tick.hover\")\n            .classed(\"hover\", false)\n        ;\n    };\n\n    //============================================================\n    // Expose Public Variables\n    //------------------------------------------------------------\n\n    chart.dispatch = dispatch;\n    chart.options = nv.utils.optionsFunc.bind(chart);\n\n    chart._options = Object.create({}, {\n        // simple options, just get/set the necessary values\n        width:    {get: function(){return width;}, set: function(_){width=_;}},\n        height:   {get: function(){return height;}, set: function(_){height=_;}},\n        xScale:   {get: function(){return x;}, set: function(_){x=_;}},\n        yScale:   {get: function(){return y;}, set: function(_){y=_;}},\n        xDomain:  {get: function(){return xDomain;}, set: function(_){xDomain=_;}},\n        yDomain:  {get: function(){return yDomain;}, set: function(_){yDomain=_;}},\n        xRange:   {get: function(){return xRange;}, set: function(_){xRange=_;}},\n        yRange:   {get: function(){return yRange;}, set: function(_){yRange=_;}},\n        forceX:   {get: function(){return forceX;}, set: function(_){forceX=_;}},\n        forceY:   {get: function(){return forceY;}, set: function(_){forceY=_;}},\n        padData:  {get: function(){return padData;}, set: function(_){padData=_;}},\n        clipEdge: {get: function(){return clipEdge;}, set: function(_){clipEdge=_;}},\n        id:       {get: function(){return id;}, set: function(_){id=_;}},\n        interactive: {get: function(){return interactive;}, set: function(_){interactive=_;}},\n\n        x:     {get: function(){return getX;}, set: function(_){getX=_;}},\n        y:     {get: function(){return getY;}, set: function(_){getY=_;}},\n        open:  {get: function(){return getOpen();}, set: function(_){getOpen=_;}},\n        close: {get: function(){return getClose();}, set: function(_){getClose=_;}},\n        high:  {get: function(){return getHigh;}, set: function(_){getHigh=_;}},\n        low:   {get: function(){return getLow;}, set: function(_){getLow=_;}},\n\n        // options that require extra logic in the setter\n        margin: {get: function(){return margin;}, set: function(_){\n            margin.top    = _.top    != undefined ? _.top    : margin.top;\n            margin.right  = _.right  != undefined ? _.right  : margin.right;\n            margin.bottom = _.bottom != undefined ? _.bottom : margin.bottom;\n            margin.left   = _.left   != undefined ? _.left   : margin.left;\n        }},\n        color:  {get: function(){return color;}, set: function(_){\n            color = nv.utils.getColor(_);\n        }}\n    });\n\n    nv.utils.initOptions(chart);\n    return chart;\n};\n// Code adapted from Jason Davies' \"Parallel Coordinates\"\n// http://bl.ocks.org/jasondavies/1341281\nnv.models.parallelCoordinates = function() {\n    \"use strict\";\n\n    //============================================================\n    // Public Variables with Default Settings\n    //------------------------------------------------------------\n\n    var margin = {top: 30, right: 0, bottom: 10, left: 0}\n        , width = null\n        , height = null\n        , x = d3.scale.ordinal()\n        , y = {}\n        , dimensionNames = []\n        , dimensionFormats = []\n        , color = nv.utils.defaultColor()\n        , filters = []\n        , active = []\n        , dragging = []\n        , lineTension = 1\n        , dispatch = d3.dispatch('brush', 'elementMouseover', 'elementMouseout')\n        ;\n\n    //============================================================\n    // Private Variables\n    //------------------------------------------------------------\n\n    function chart(selection) {\n        selection.each(function(data) {\n            var container = d3.select(this);\n            var availableWidth = nv.utils.availableWidth(width, container, margin),\n                availableHeight = nv.utils.availableHeight(height, container, margin);\n\n            nv.utils.initSVG(container);\n\n            active = data; //set all active before first brush call\n\n            // Setup Scales\n            x.rangePoints([0, availableWidth], 1).domain(dimensionNames);\n\n            //Set as true if all values on an axis are missing.\n            var onlyNanValues = {};\n            // Extract the list of dimensions and create a scale for each.\n            dimensionNames.forEach(function(d) {\n                var extent = d3.extent(data, function(p) { return +p[d]; });\n                onlyNanValues[d] = false;\n                //If there is no values to display on an axis, set the extent to 0\n                if (extent[0] === undefined) {\n                    onlyNanValues[d] = true;\n                    extent[0] = 0;\n                    extent[1] = 0;\n                }\n                //Scale axis if there is only one value\n                if (extent[0] === extent[1]) {\n                    extent[0] = extent[0] - 1;\n                    extent[1] = extent[1] + 1;\n                }\n                //Use 90% of (availableHeight - 12) for the axis range, 12 reprensenting the space necessary to display \"undefined values\" text.\n                //The remaining 10% are used to display the missingValue line.\n                y[d] = d3.scale.linear()\n                    .domain(extent)\n                    .range([(availableHeight - 12) * 0.9, 0]);\n\n                y[d].brush = d3.svg.brush().y(y[d]).on('brush', brush);\n\n                return d != 'name';\n            });\n\n            // Setup containers and skeleton of chart\n            var wrap = container.selectAll('g.nv-wrap.nv-parallelCoordinates').data([data]);\n            var wrapEnter = wrap.enter().append('g').attr('class', 'nvd3 nv-wrap nv-parallelCoordinates');\n            var gEnter = wrapEnter.append('g');\n            var g = wrap.select('g');\n\n            gEnter.append('g').attr('class', 'nv-parallelCoordinates background');\n            gEnter.append('g').attr('class', 'nv-parallelCoordinates foreground');\n            gEnter.append('g').attr('class', 'nv-parallelCoordinates missingValuesline');\n\n            wrap.attr('transform', 'translate(' + margin.left + ',' + margin.top + ')');\n\n            var line = d3.svg.line().interpolate('cardinal').tension(lineTension),\n                axis = d3.svg.axis().orient('left'),\n                axisDrag = d3.behavior.drag()\n                        .on('dragstart', dragStart)\n                        .on('drag', dragMove)\n                        .on('dragend', dragEnd);\n\n            //Add missing value line at the bottom of the chart\n            var missingValuesline, missingValueslineText;\n            var step = x.range()[1] - x.range()[0];\n            var axisWithMissingValues = [];\n            var lineData = [0 + step / 2, availableHeight - 12, availableWidth - step / 2, availableHeight - 12];\n            missingValuesline = wrap.select('.missingValuesline').selectAll('line').data([lineData]);\n            missingValuesline.enter().append('line');\n            missingValuesline.exit().remove();\n            missingValuesline.attr(\"x1\", function(d) { return d[0]; })\n                    .attr(\"y1\", function(d) { return d[1]; })\n                    .attr(\"x2\", function(d) { return d[2]; })\n                    .attr(\"y2\", function(d) { return d[3]; });\n\n            //Add the text \"undefined values\" under the missing value line\n            missingValueslineText = wrap.select('.missingValuesline').selectAll('text').data([\"undefined values\"]);\n            missingValueslineText.append('text').data([\"undefined values\"]);\n            missingValueslineText.enter().append('text');\n            missingValueslineText.exit().remove();\n            missingValueslineText.attr(\"y\", availableHeight)\n                    //To have the text right align with the missingValues line, substract 92 representing the text size.\n                    .attr(\"x\", availableWidth - 92 - step / 2)\n                    .text(function(d) { return d; });\n\n            // Add grey background lines for context.\n            var background = wrap.select('.background').selectAll('path').data(data);\n            background.enter().append('path');\n            background.exit().remove();\n            background.attr('d', path);\n\n            // Add blue foreground lines for focus.\n            var foreground = wrap.select('.foreground').selectAll('path').data(data);\n            foreground.enter().append('path')\n            foreground.exit().remove();\n            foreground.attr('d', path).attr('stroke', color);\n            foreground.on(\"mouseover\", function (d, i) {\n                d3.select(this).classed('hover', true);\n                dispatch.elementMouseover({\n                    label: d.name,\n                    data: d.data,\n                    index: i,\n                    pos: [d3.mouse(this.parentNode)[0], d3.mouse(this.parentNode)[1]]\n                });\n\n            });\n            foreground.on(\"mouseout\", function (d, i) {\n                d3.select(this).classed('hover', false);\n                dispatch.elementMouseout({\n                    label: d.name,\n                    data: d.data,\n                    index: i\n                });\n            });\n\n            // Add a group element for each dimension.\n            var dimensions = g.selectAll('.dimension').data(dimensionNames);\n            var dimensionsEnter = dimensions.enter().append('g').attr('class', 'nv-parallelCoordinates dimension');\n            dimensionsEnter.append('g').attr('class', 'nv-parallelCoordinates nv-axis');\n            dimensionsEnter.append('g').attr('class', 'nv-parallelCoordinates-brush');\n            dimensionsEnter.append('text').attr('class', 'nv-parallelCoordinates nv-label');\n\n            dimensions.attr('transform', function(d) { return 'translate(' + x(d) + ',0)'; });\n            dimensions.exit().remove();\n\n            // Add an axis and title.\n            dimensions.select('.nv-label')\n                .style(\"cursor\", \"move\")\n                .attr('dy', '-1em')\n                .attr('text-anchor', 'middle')\n                .text(String)\n                .on(\"mouseover\", function(d, i) {\n                    dispatch.elementMouseover({\n                        dim: d,\n                        pos: [d3.mouse(this.parentNode.parentNode)[0], d3.mouse(this.parentNode.parentNode)[1]]\n                    });\n                })\n                .on(\"mouseout\", function(d, i) {\n                    dispatch.elementMouseout({\n                        dim: d\n                    });\n                })\n                .call(axisDrag);\n\n            dimensions.select('.nv-axis')\n                .each(function (d, i) {\n                    d3.select(this).call(axis.scale(y[d]).tickFormat(d3.format(dimensionFormats[i])));\n                });\n\n                dimensions.select('.nv-parallelCoordinates-brush')\n                .each(function (d) {\n                    d3.select(this).call(y[d].brush);\n                })\n                .selectAll('rect')\n                .attr('x', -8)\n                .attr('width', 16);\n\n            // Returns the path for a given data point.\n            function path(d) {\n                return line(dimensionNames.map(function (p) {\n                    //If value if missing, put the value on the missing value line\n                    if(isNaN(d[p]) || isNaN(parseFloat(d[p]))) {\n                        var domain = y[p].domain();\n                        var range = y[p].range();\n                        var min = domain[0] - (domain[1] - domain[0]) / 9;\n\n                        //If it's not already the case, allow brush to select undefined values\n                        if(axisWithMissingValues.indexOf(p) < 0) {\n\n                            var newscale = d3.scale.linear().domain([min, domain[1]]).range([availableHeight - 12, range[1]]);\n                            y[p].brush.y(newscale);\n                            axisWithMissingValues.push(p);\n                        }\n\n                        return [x(p), y[p](min)];\n                    }\n\n                    //If parallelCoordinate contain missing values show the missing values line otherwise, hide it.\n                    if(axisWithMissingValues.length > 0) {\n                        missingValuesline.style(\"display\", \"inline\");\n                        missingValueslineText.style(\"display\", \"inline\");\n                    } else {\n                        missingValuesline.style(\"display\", \"none\");\n                        missingValueslineText.style(\"display\", \"none\");\n                    }\n\n                     return [x(p), y[p](d[p])];\n                }));\n            }\n\n            // Handles a brush event, toggling the display of foreground lines.\n            function brush() {\n                var actives = dimensionNames.filter(function(p) { return !y[p].brush.empty(); }),\n                    extents = actives.map(function(p) { return y[p].brush.extent(); });\n\n                filters = []; //erase current filters\n                actives.forEach(function(d,i) {\n                    filters[i] = {\n                        dimension: d,\n                        extent: extents[i]\n                    }\n                });\n\n                active = []; //erase current active list\n                foreground.style('display', function(d) {\n                    var isActive = actives.every(function(p, i) {\n                        if(isNaN(d[p]) && extents[i][0] == y[p].brush.y().domain()[0]) return true;\n                        return extents[i][0] <= d[p] && d[p] <= extents[i][1];\n                    });\n                    if (isActive) active.push(d);\n                    return isActive ? null : 'none';\n                });\n\n                dispatch.brush({\n                    filters: filters,\n                    active: active\n                });\n            }\n\n            function dragStart(d, i) {\n                dragging[d] = this.parentNode.__origin__ = x(d);\n                background.attr(\"visibility\", \"hidden\");\n\n            }\n\n            function dragMove(d, i) {\n                dragging[d] = Math.min(availableWidth, Math.max(0, this.parentNode.__origin__ += d3.event.x));\n                foreground.attr(\"d\", path);\n                dimensionNames.sort(function (a, b) { return position(a) - position(b); });\n                x.domain(dimensionNames);\n                dimensions.attr(\"transform\", function(d) { return \"translate(\" + position(d) + \")\"; });\n            }\n\n            function dragEnd(d, i) {\n                delete this.parentNode.__origin__;\n                delete dragging[d];\n                d3.select(this.parentNode).attr(\"transform\", \"translate(\" + x(d) + \")\");\n                foreground\n                  .attr(\"d\", path);\n                background\n                  .attr(\"d\", path)\n                  .attr(\"visibility\", null);\n\n            }\n\n            function position(d) {\n                var v = dragging[d];\n                return v == null ? x(d) : v;\n            }\n        });\n\n        return chart;\n    }\n\n    //============================================================\n    // Expose Public Variables\n    //------------------------------------------------------------\n\n    chart.dispatch = dispatch;\n    chart.options = nv.utils.optionsFunc.bind(chart);\n\n    chart._options = Object.create({}, {\n        // simple options, just get/set the necessary values\n        width:         {get: function(){return width;},           set: function(_){width= _;}},\n        height:        {get: function(){return height;},          set: function(_){height= _;}},\n        dimensionNames: {get: function() { return dimensionNames;}, set: function(_){dimensionNames= _;}},\n        dimensionFormats : {get: function(){return dimensionFormats;}, set: function (_){dimensionFormats=_;}},\n        lineTension:   {get: function(){return lineTension;},     set: function(_){lineTension = _;}},\n\n        // deprecated options\n        dimensions: {get: function (){return dimensionNames;}, set: function(_){\n            // deprecated after 1.8.1\n            nv.deprecated('dimensions', 'use dimensionNames instead');\n            dimensionNames = _;\n        }},\n\n        // options that require extra logic in the setter\n        margin: {get: function(){return margin;}, set: function(_){\n            margin.top    =  _.top    !== undefined ? _.top    : margin.top;\n            margin.right  =  _.right  !== undefined ? _.right  : margin.right;\n            margin.bottom =  _.bottom !== undefined ? _.bottom : margin.bottom;\n            margin.left   =  _.left   !== undefined ? _.left   : margin.left;\n        }},\n        color:  {get: function(){return color;}, set: function(_){\n            color = nv.utils.getColor(_);\n        }}\n    });\n\n    nv.utils.initOptions(chart);\n    return chart;\n};\nnv.models.pie = function() {\n    \"use strict\";\n\n    //============================================================\n    // Public Variables with Default Settings\n    //------------------------------------------------------------\n\n    var margin = {top: 0, right: 0, bottom: 0, left: 0}\n        , width = 500\n        , height = 500\n        , getX = function(d) { return d.x }\n        , getY = function(d) { return d.y }\n        , id = Math.floor(Math.random() * 10000) //Create semi-unique ID in case user doesn't select one\n        , container = null\n        , color = nv.utils.defaultColor()\n        , valueFormat = d3.format(',.2f')\n        , showLabels = true\n        , labelsOutside = false\n        , labelType = \"key\"\n        , labelThreshold = .02 //if slice percentage is under this, don't show label\n        , donut = false\n        , title = false\n        , growOnHover = true\n        , titleOffset = 0\n        , labelSunbeamLayout = false\n        , startAngle = false\n        , padAngle = false\n        , endAngle = false\n        , cornerRadius = 0\n        , donutRatio = 0.5\n        , arcsRadius = []\n        , dispatch = d3.dispatch('chartClick', 'elementClick', 'elementDblClick', 'elementMouseover', 'elementMouseout', 'elementMousemove', 'renderEnd')\n        ;\n\n    var arcs = [];\n    var arcsOver = [];\n\n    //============================================================\n    // chart function\n    //------------------------------------------------------------\n\n    var renderWatch = nv.utils.renderWatch(dispatch);\n\n    function chart(selection) {\n        renderWatch.reset();\n        selection.each(function(data) {\n            var availableWidth = width - margin.left - margin.right\n                , availableHeight = height - margin.top - margin.bottom\n                , radius = Math.min(availableWidth, availableHeight) / 2\n                , arcsRadiusOuter = []\n                , arcsRadiusInner = []\n                ;\n\n            container = d3.select(this)\n            if (arcsRadius.length === 0) {\n                var outer = radius - radius / 5;\n                var inner = donutRatio * radius;\n                for (var i = 0; i < data[0].length; i++) {\n                    arcsRadiusOuter.push(outer);\n                    arcsRadiusInner.push(inner);\n                }\n            } else {\n                arcsRadiusOuter = arcsRadius.map(function (d) { return (d.outer - d.outer / 5) * radius; });\n                arcsRadiusInner = arcsRadius.map(function (d) { return (d.inner - d.inner / 5) * radius; });\n                donutRatio = d3.min(arcsRadius.map(function (d) { return (d.inner - d.inner / 5); }));\n            }\n            nv.utils.initSVG(container);\n\n            // Setup containers and skeleton of chart\n            var wrap = container.selectAll('.nv-wrap.nv-pie').data(data);\n            var wrapEnter = wrap.enter().append('g').attr('class','nvd3 nv-wrap nv-pie nv-chart-' + id);\n            var gEnter = wrapEnter.append('g');\n            var g = wrap.select('g');\n            var g_pie = gEnter.append('g').attr('class', 'nv-pie');\n            gEnter.append('g').attr('class', 'nv-pieLabels');\n\n            wrap.attr('transform', 'translate(' + margin.left + ',' + margin.top + ')');\n            g.select('.nv-pie').attr('transform', 'translate(' + availableWidth / 2 + ',' + availableHeight / 2 + ')');\n            g.select('.nv-pieLabels').attr('transform', 'translate(' + availableWidth / 2 + ',' + availableHeight / 2 + ')');\n\n            //\n            container.on('click', function(d,i) {\n                dispatch.chartClick({\n                    data: d,\n                    index: i,\n                    pos: d3.event,\n                    id: id\n                });\n            });\n\n            arcs = [];\n            arcsOver = [];\n            for (var i = 0; i < data[0].length; i++) {\n\n                var arc = d3.svg.arc().outerRadius(arcsRadiusOuter[i]);\n                var arcOver = d3.svg.arc().outerRadius(arcsRadiusOuter[i] + 5);\n\n                if (startAngle !== false) {\n                    arc.startAngle(startAngle);\n                    arcOver.startAngle(startAngle);\n                }\n                if (endAngle !== false) {\n                    arc.endAngle(endAngle);\n                    arcOver.endAngle(endAngle);\n                }\n                if (donut) {\n                    arc.innerRadius(arcsRadiusInner[i]);\n                    arcOver.innerRadius(arcsRadiusInner[i]);\n                }\n\n                if (arc.cornerRadius && cornerRadius) {\n                    arc.cornerRadius(cornerRadius);\n                    arcOver.cornerRadius(cornerRadius);\n                }\n\n                arcs.push(arc);\n                arcsOver.push(arcOver);\n            }\n\n            // Setup the Pie chart and choose the data element\n            var pie = d3.layout.pie()\n                .sort(null)\n                .value(function(d) { return d.disabled ? 0 : getY(d) });\n\n            // padAngle added in d3 3.5\n            if (pie.padAngle && padAngle) {\n                pie.padAngle(padAngle);\n            }\n\n            // if title is specified and donut, put it in the middle\n            if (donut && title) {\n                g_pie.append(\"text\").attr('class', 'nv-pie-title');\n\n                wrap.select('.nv-pie-title')\n                    .style(\"text-anchor\", \"middle\")\n                    .text(function (d) {\n                        return title;\n                    })\n                    .style(\"font-size\", (Math.min(availableWidth, availableHeight)) * donutRatio * 2 / (title.length + 2) + \"px\")\n                    .attr(\"dy\", \"0.35em\") // trick to vertically center text\n                    .attr('transform', function(d, i) {\n                        return 'translate(0, '+ titleOffset + ')';\n                    });\n            }\n\n            var slices = wrap.select('.nv-pie').selectAll('.nv-slice').data(pie);\n            var pieLabels = wrap.select('.nv-pieLabels').selectAll('.nv-label').data(pie);\n\n            slices.exit().remove();\n            pieLabels.exit().remove();\n\n            var ae = slices.enter().append('g');\n            ae.attr('class', 'nv-slice');\n            ae.on('mouseover', function(d, i) {\n                d3.select(this).classed('hover', true);\n                if (growOnHover) {\n                    d3.select(this).select(\"path\").transition()\n                        .duration(70)\n                        .attr(\"d\", arcsOver[i]);\n                }\n                dispatch.elementMouseover({\n                    data: d.data,\n                    index: i,\n                    color: d3.select(this).style(\"fill\")\n                });\n            });\n            ae.on('mouseout', function(d, i) {\n                d3.select(this).classed('hover', false);\n                if (growOnHover) {\n                    d3.select(this).select(\"path\").transition()\n                        .duration(50)\n                        .attr(\"d\", arcs[i]);\n                }\n                dispatch.elementMouseout({data: d.data, index: i});\n            });\n            ae.on('mousemove', function(d, i) {\n                dispatch.elementMousemove({data: d.data, index: i});\n            });\n            ae.on('click', function(d, i) {\n                dispatch.elementClick({\n                    data: d.data,\n                    index: i,\n                    color: d3.select(this).style(\"fill\")\n                });\n            });\n            ae.on('dblclick', function(d, i) {\n                dispatch.elementDblClick({\n                    data: d.data,\n                    index: i,\n                    color: d3.select(this).style(\"fill\")\n                });\n            });\n\n            slices.attr('fill', function(d,i) { return color(d.data, i); });\n            slices.attr('stroke', function(d,i) { return color(d.data, i); });\n\n            var paths = ae.append('path').each(function(d) {\n                this._current = d;\n            });\n\n            slices.select('path')\n                .transition()\n                .attr('d', function (d, i) { return arcs[i](d); })\n                .attrTween('d', arcTween);\n\n            if (showLabels) {\n                // This does the normal label\n                var labelsArc = [];\n                for (var i = 0; i < data[0].length; i++) {\n                    labelsArc.push(arcs[i]);\n\n                    if (labelsOutside) {\n                        if (donut) {\n                            labelsArc[i] = d3.svg.arc().outerRadius(arcs[i].outerRadius());\n                            if (startAngle !== false) labelsArc[i].startAngle(startAngle);\n                            if (endAngle !== false) labelsArc[i].endAngle(endAngle);\n                        }\n                    } else if (!donut) {\n                            labelsArc[i].innerRadius(0);\n                    }\n                }\n\n                pieLabels.enter().append(\"g\").classed(\"nv-label\",true).each(function(d,i) {\n                    var group = d3.select(this);\n\n                    group.attr('transform', function (d, i) {\n                        if (labelSunbeamLayout) {\n                            d.outerRadius = arcsRadiusOuter[i] + 10; // Set Outer Coordinate\n                            d.innerRadius = arcsRadiusOuter[i] + 15; // Set Inner Coordinate\n                            var rotateAngle = (d.startAngle + d.endAngle) / 2 * (180 / Math.PI);\n                            if ((d.startAngle + d.endAngle) / 2 < Math.PI) {\n                                rotateAngle -= 90;\n                            } else {\n                                rotateAngle += 90;\n                            }\n                            return 'translate(' + labelsArc[i].centroid(d) + ') rotate(' + rotateAngle + ')';\n                        } else {\n                            d.outerRadius = radius + 10; // Set Outer Coordinate\n                            d.innerRadius = radius + 15; // Set Inner Coordinate\n                            return 'translate(' + labelsArc[i].centroid(d) + ')'\n                        }\n                    });\n\n                    group.append('rect')\n                        .style('stroke', '#fff')\n                        .style('fill', '#fff')\n                        .attr(\"rx\", 3)\n                        .attr(\"ry\", 3);\n\n                    group.append('text')\n                        .style('text-anchor', labelSunbeamLayout ? ((d.startAngle + d.endAngle) / 2 < Math.PI ? 'start' : 'end') : 'middle') //center the text on it's origin or begin/end if orthogonal aligned\n                        .style('fill', '#000')\n                });\n\n                var labelLocationHash = {};\n                var avgHeight = 14;\n                var avgWidth = 140;\n                var createHashKey = function(coordinates) {\n                    return Math.floor(coordinates[0]/avgWidth) * avgWidth + ',' + Math.floor(coordinates[1]/avgHeight) * avgHeight;\n                };\n\n                pieLabels.watchTransition(renderWatch, 'pie labels').attr('transform', function (d, i) {\n                    if (labelSunbeamLayout) {\n                        d.outerRadius = arcsRadiusOuter[i] + 10; // Set Outer Coordinate\n                        d.innerRadius = arcsRadiusOuter[i] + 15; // Set Inner Coordinate\n                        var rotateAngle = (d.startAngle + d.endAngle) / 2 * (180 / Math.PI);\n                        if ((d.startAngle + d.endAngle) / 2 < Math.PI) {\n                            rotateAngle -= 90;\n                        } else {\n                            rotateAngle += 90;\n                        }\n                        return 'translate(' + labelsArc[i].centroid(d) + ') rotate(' + rotateAngle + ')';\n                    } else {\n                        d.outerRadius = radius + 10; // Set Outer Coordinate\n                        d.innerRadius = radius + 15; // Set Inner Coordinate\n\n                        /*\n                        Overlapping pie labels are not good. What this attempts to do is, prevent overlapping.\n                        Each label location is hashed, and if a hash collision occurs, we assume an overlap.\n                        Adjust the label's y-position to remove the overlap.\n                        */\n                        var center = labelsArc[i].centroid(d);\n                        if (d.value) {\n                            var hashKey = createHashKey(center);\n                            if (labelLocationHash[hashKey]) {\n                                center[1] -= avgHeight;\n                            }\n                            labelLocationHash[createHashKey(center)] = true;\n                        }\n                        return 'translate(' + center + ')'\n                    }\n                });\n\n                pieLabels.select(\".nv-label text\")\n                    .style('text-anchor', function(d,i) {\n                        //center the text on it's origin or begin/end if orthogonal aligned\n                        return labelSunbeamLayout ? ((d.startAngle + d.endAngle) / 2 < Math.PI ? 'start' : 'end') : 'middle';\n                    })\n                    .text(function(d, i) {\n                        var percent = (d.endAngle - d.startAngle) / (2 * Math.PI);\n                        var label = '';\n                        if (!d.value || percent < labelThreshold) return '';\n\n                        if(typeof labelType === 'function') {\n                            label = labelType(d, i, {\n                                'key': getX(d.data),\n                                'value': getY(d.data),\n                                'percent': valueFormat(percent)\n                            });\n                        } else {\n                            switch (labelType) {\n                                case 'key':\n                                    label = getX(d.data);\n                                    break;\n                                case 'value':\n                                    label = valueFormat(getY(d.data));\n                                    break;\n                                case 'percent':\n                                    label = d3.format('%')(percent);\n                                    break;\n                            }\n                        }\n                        return label;\n                    })\n                ;\n            }\n\n\n            // Computes the angle of an arc, converting from radians to degrees.\n            function angle(d) {\n                var a = (d.startAngle + d.endAngle) * 90 / Math.PI - 90;\n                return a > 90 ? a - 180 : a;\n            }\n\n            function arcTween(a, idx) {\n                a.endAngle = isNaN(a.endAngle) ? 0 : a.endAngle;\n                a.startAngle = isNaN(a.startAngle) ? 0 : a.startAngle;\n                if (!donut) a.innerRadius = 0;\n                var i = d3.interpolate(this._current, a);\n                this._current = i(0);\n                return function (t) {\n                    return arcs[idx](i(t));\n                };\n            }\n        });\n\n        renderWatch.renderEnd('pie immediate');\n        return chart;\n    }\n\n    //============================================================\n    // Expose Public Variables\n    //------------------------------------------------------------\n\n    chart.dispatch = dispatch;\n    chart.options = nv.utils.optionsFunc.bind(chart);\n\n    chart._options = Object.create({}, {\n        // simple options, just get/set the necessary values\n        arcsRadius: { get: function () { return arcsRadius; }, set: function (_) { arcsRadius = _; } },\n        width:      {get: function(){return width;}, set: function(_){width=_;}},\n        height:     {get: function(){return height;}, set: function(_){height=_;}},\n        showLabels: {get: function(){return showLabels;}, set: function(_){showLabels=_;}},\n        title:      {get: function(){return title;}, set: function(_){title=_;}},\n        titleOffset:    {get: function(){return titleOffset;}, set: function(_){titleOffset=_;}},\n        labelThreshold: {get: function(){return labelThreshold;}, set: function(_){labelThreshold=_;}},\n        valueFormat:    {get: function(){return valueFormat;}, set: function(_){valueFormat=_;}},\n        x:          {get: function(){return getX;}, set: function(_){getX=_;}},\n        id:         {get: function(){return id;}, set: function(_){id=_;}},\n        endAngle:   {get: function(){return endAngle;}, set: function(_){endAngle=_;}},\n        startAngle: {get: function(){return startAngle;}, set: function(_){startAngle=_;}},\n        padAngle:   {get: function(){return padAngle;}, set: function(_){padAngle=_;}},\n        cornerRadius: {get: function(){return cornerRadius;}, set: function(_){cornerRadius=_;}},\n        donutRatio:   {get: function(){return donutRatio;}, set: function(_){donutRatio=_;}},\n        labelsOutside: {get: function(){return labelsOutside;}, set: function(_){labelsOutside=_;}},\n        labelSunbeamLayout: {get: function(){return labelSunbeamLayout;}, set: function(_){labelSunbeamLayout=_;}},\n        donut:              {get: function(){return donut;}, set: function(_){donut=_;}},\n        growOnHover:        {get: function(){return growOnHover;}, set: function(_){growOnHover=_;}},\n\n        // depreciated after 1.7.1\n        pieLabelsOutside: {get: function(){return labelsOutside;}, set: function(_){\n            labelsOutside=_;\n            nv.deprecated('pieLabelsOutside', 'use labelsOutside instead');\n        }},\n        // depreciated after 1.7.1\n        donutLabelsOutside: {get: function(){return labelsOutside;}, set: function(_){\n            labelsOutside=_;\n            nv.deprecated('donutLabelsOutside', 'use labelsOutside instead');\n        }},\n        // deprecated after 1.7.1\n        labelFormat: {get: function(){ return valueFormat;}, set: function(_) {\n            valueFormat=_;\n            nv.deprecated('labelFormat','use valueFormat instead');\n        }},\n\n        // options that require extra logic in the setter\n        margin: {get: function(){return margin;}, set: function(_){\n            margin.top    = typeof _.top    != 'undefined' ? _.top    : margin.top;\n            margin.right  = typeof _.right  != 'undefined' ? _.right  : margin.right;\n            margin.bottom = typeof _.bottom != 'undefined' ? _.bottom : margin.bottom;\n            margin.left   = typeof _.left   != 'undefined' ? _.left   : margin.left;\n        }},\n        y: {get: function(){return getY;}, set: function(_){\n            getY=d3.functor(_);\n        }},\n        color: {get: function(){return color;}, set: function(_){\n            color=nv.utils.getColor(_);\n        }},\n        labelType:          {get: function(){return labelType;}, set: function(_){\n            labelType= _ || 'key';\n        }}\n    });\n\n    nv.utils.initOptions(chart);\n    return chart;\n};\nnv.models.pieChart = function() {\n    \"use strict\";\n\n    //============================================================\n    // Public Variables with Default Settings\n    //------------------------------------------------------------\n\n    var pie = nv.models.pie();\n    var legend = nv.models.legend();\n    var tooltip = nv.models.tooltip();\n\n    var margin = {top: 30, right: 20, bottom: 20, left: 20}\n        , width = null\n        , height = null\n        , showLegend = true\n        , legendPosition = \"top\"\n        , color = nv.utils.defaultColor()\n        , state = nv.utils.state()\n        , defaultState = null\n        , noData = null\n        , duration = 250\n        , dispatch = d3.dispatch('tooltipShow', 'tooltipHide', 'stateChange', 'changeState','renderEnd')\n        ;\n\n    tooltip\n        .headerEnabled(false)\n        .duration(0)\n        .valueFormatter(function(d, i) {\n            return pie.valueFormat()(d, i);\n        });\n\n    //============================================================\n    // Private Variables\n    //------------------------------------------------------------\n\n    var renderWatch = nv.utils.renderWatch(dispatch);\n\n    var stateGetter = function(data) {\n        return function(){\n            return {\n                active: data.map(function(d) { return !d.disabled })\n            };\n        }\n    };\n\n    var stateSetter = function(data) {\n        return function(state) {\n            if (state.active !== undefined) {\n                data.forEach(function (series, i) {\n                    series.disabled = !state.active[i];\n                });\n            }\n        }\n    };\n\n    //============================================================\n    // Chart function\n    //------------------------------------------------------------\n\n    function chart(selection) {\n        renderWatch.reset();\n        renderWatch.models(pie);\n\n        selection.each(function(data) {\n            var container = d3.select(this);\n            nv.utils.initSVG(container);\n\n            var that = this;\n            var availableWidth = nv.utils.availableWidth(width, container, margin),\n                availableHeight = nv.utils.availableHeight(height, container, margin);\n\n            chart.update = function() { container.transition().call(chart); };\n            chart.container = this;\n\n            state.setter(stateSetter(data), chart.update)\n                .getter(stateGetter(data))\n                .update();\n\n            //set state.disabled\n            state.disabled = data.map(function(d) { return !!d.disabled });\n\n            if (!defaultState) {\n                var key;\n                defaultState = {};\n                for (key in state) {\n                    if (state[key] instanceof Array)\n                        defaultState[key] = state[key].slice(0);\n                    else\n                        defaultState[key] = state[key];\n                }\n            }\n\n            // Display No Data message if there's nothing to show.\n            if (!data || !data.length) {\n                nv.utils.noData(chart, container);\n                return chart;\n            } else {\n                container.selectAll('.nv-noData').remove();\n            }\n\n            // Setup containers and skeleton of chart\n            var wrap = container.selectAll('g.nv-wrap.nv-pieChart').data([data]);\n            var gEnter = wrap.enter().append('g').attr('class', 'nvd3 nv-wrap nv-pieChart').append('g');\n            var g = wrap.select('g');\n\n            gEnter.append('g').attr('class', 'nv-pieWrap');\n            gEnter.append('g').attr('class', 'nv-legendWrap');\n\n            // Legend\n            if (showLegend) {\n                if (legendPosition === \"top\") {\n                    legend.width( availableWidth ).key(pie.x());\n\n                    wrap.select('.nv-legendWrap')\n                        .datum(data)\n                        .call(legend);\n\n                    if ( margin.top != legend.height()) {\n                        margin.top = legend.height();\n                        availableHeight = nv.utils.availableHeight(height, container, margin);\n                    }\n\n                    wrap.select('.nv-legendWrap')\n                        .attr('transform', 'translate(0,' + (-margin.top) +')');\n                } else if (legendPosition === \"right\") {\n                    var legendWidth = nv.models.legend().width();\n                    if (availableWidth / 2 < legendWidth) {\n                        legendWidth = (availableWidth / 2)\n                    }\n                    legend.height(availableHeight).key(pie.x());\n                    legend.width(legendWidth);\n                    availableWidth -= legend.width();\n\n                    wrap.select('.nv-legendWrap')\n                        .datum(data)\n                        .call(legend)\n                        .attr('transform', 'translate(' + (availableWidth) +',0)');\n                }\n            }\n            wrap.attr('transform', 'translate(' + margin.left + ',' + margin.top + ')');\n\n            // Main Chart Component(s)\n            pie.width(availableWidth).height(availableHeight);\n            var pieWrap = g.select('.nv-pieWrap').datum([data]);\n            d3.transition(pieWrap).call(pie);\n\n            //============================================================\n            // Event Handling/Dispatching (in chart's scope)\n            //------------------------------------------------------------\n\n            legend.dispatch.on('stateChange', function(newState) {\n                for (var key in newState) {\n                    state[key] = newState[key];\n                }\n                dispatch.stateChange(state);\n                chart.update();\n            });\n\n            // Update chart from a state object passed to event handler\n            dispatch.on('changeState', function(e) {\n                if (typeof e.disabled !== 'undefined') {\n                    data.forEach(function(series,i) {\n                        series.disabled = e.disabled[i];\n                    });\n                    state.disabled = e.disabled;\n                }\n                chart.update();\n            });\n        });\n\n        renderWatch.renderEnd('pieChart immediate');\n        return chart;\n    }\n\n    //============================================================\n    // Event Handling/Dispatching (out of chart's scope)\n    //------------------------------------------------------------\n\n    pie.dispatch.on('elementMouseover.tooltip', function(evt) {\n        evt['series'] = {\n            key: chart.x()(evt.data),\n            value: chart.y()(evt.data),\n            color: evt.color\n        };\n        tooltip.data(evt).hidden(false);\n    });\n\n    pie.dispatch.on('elementMouseout.tooltip', function(evt) {\n        tooltip.hidden(true);\n    });\n\n    pie.dispatch.on('elementMousemove.tooltip', function(evt) {\n        tooltip.position({top: d3.event.pageY, left: d3.event.pageX})();\n    });\n\n    //============================================================\n    // Expose Public Variables\n    //------------------------------------------------------------\n\n    // expose chart's sub-components\n    chart.legend = legend;\n    chart.dispatch = dispatch;\n    chart.pie = pie;\n    chart.tooltip = tooltip;\n    chart.options = nv.utils.optionsFunc.bind(chart);\n\n    // use Object get/set functionality to map between vars and chart functions\n    chart._options = Object.create({}, {\n        // simple options, just get/set the necessary values\n        noData:         {get: function(){return noData;},         set: function(_){noData=_;}},\n        showLegend:     {get: function(){return showLegend;},     set: function(_){showLegend=_;}},\n        legendPosition: {get: function(){return legendPosition;}, set: function(_){legendPosition=_;}},\n        defaultState:   {get: function(){return defaultState;},   set: function(_){defaultState=_;}},\n\n        // deprecated options\n        tooltips:    {get: function(){return tooltip.enabled();}, set: function(_){\n            // deprecated after 1.7.1\n            nv.deprecated('tooltips', 'use chart.tooltip.enabled() instead');\n            tooltip.enabled(!!_);\n        }},\n        tooltipContent:    {get: function(){return tooltip.contentGenerator();}, set: function(_){\n            // deprecated after 1.7.1\n            nv.deprecated('tooltipContent', 'use chart.tooltip.contentGenerator() instead');\n            tooltip.contentGenerator(_);\n        }},\n\n        // options that require extra logic in the setter\n        color: {get: function(){return color;}, set: function(_){\n            color = _;\n            legend.color(color);\n            pie.color(color);\n        }},\n        duration: {get: function(){return duration;}, set: function(_){\n            duration = _;\n            renderWatch.reset(duration);\n        }},\n        margin: {get: function(){return margin;}, set: function(_){\n            margin.top    = _.top    !== undefined ? _.top    : margin.top;\n            margin.right  = _.right  !== undefined ? _.right  : margin.right;\n            margin.bottom = _.bottom !== undefined ? _.bottom : margin.bottom;\n            margin.left   = _.left   !== undefined ? _.left   : margin.left;\n        }}\n    });\n    nv.utils.inheritOptions(chart, pie);\n    nv.utils.initOptions(chart);\n    return chart;\n};\n\nnv.models.scatter = function() {\n    \"use strict\";\n\n    //============================================================\n    // Public Variables with Default Settings\n    //------------------------------------------------------------\n\n    var margin       = {top: 0, right: 0, bottom: 0, left: 0}\n        , width        = null\n        , height       = null\n        , color        = nv.utils.defaultColor() // chooses color\n        , id           = Math.floor(Math.random() * 100000) //Create semi-unique ID incase user doesn't select one\n        , container    = null\n        , x            = d3.scale.linear()\n        , y            = d3.scale.linear()\n        , z            = d3.scale.linear() //linear because d3.svg.shape.size is treated as area\n        , getX         = function(d) { return d.x } // accessor to get the x value\n        , getY         = function(d) { return d.y } // accessor to get the y value\n        , getSize      = function(d) { return d.size || 1} // accessor to get the point size\n        , getShape     = function(d) { return d.shape || 'circle' } // accessor to get point shape\n        , forceX       = [] // List of numbers to Force into the X scale (ie. 0, or a max / min, etc.)\n        , forceY       = [] // List of numbers to Force into the Y scale\n        , forceSize    = [] // List of numbers to Force into the Size scale\n        , interactive  = true // If true, plots a voronoi overlay for advanced point intersection\n        , pointActive  = function(d) { return !d.notActive } // any points that return false will be filtered out\n        , padData      = false // If true, adds half a data points width to front and back, for lining up a line chart with a bar chart\n        , padDataOuter = .1 //outerPadding to imitate ordinal scale outer padding\n        , clipEdge     = false // if true, masks points within x and y scale\n        , clipVoronoi  = true // if true, masks each point with a circle... can turn off to slightly increase performance\n        , showVoronoi  = false // display the voronoi areas\n        , clipRadius   = function() { return 25 } // function to get the radius for voronoi point clips\n        , xDomain      = null // Override x domain (skips the calculation from data)\n        , yDomain      = null // Override y domain\n        , xRange       = null // Override x range\n        , yRange       = null // Override y range\n        , sizeDomain   = null // Override point size domain\n        , sizeRange    = null\n        , singlePoint  = false\n        , dispatch     = d3.dispatch('elementClick', 'elementDblClick', 'elementMouseover', 'elementMouseout', 'renderEnd')\n        , useVoronoi   = true\n        , duration     = 250\n        ;\n\n\n    //============================================================\n    // Private Variables\n    //------------------------------------------------------------\n\n    var x0, y0, z0 // used to store previous scales\n        , timeoutID\n        , needsUpdate = false // Flag for when the points are visually updating, but the interactive layer is behind, to disable tooltips\n        , renderWatch = nv.utils.renderWatch(dispatch, duration)\n        , _sizeRange_def = [16, 256]\n        ;\n\n    function chart(selection) {\n        renderWatch.reset();\n        selection.each(function(data) {\n            container = d3.select(this);\n            var availableWidth = nv.utils.availableWidth(width, container, margin),\n                availableHeight = nv.utils.availableHeight(height, container, margin);\n\n            nv.utils.initSVG(container);\n\n            //add series index to each data point for reference\n            data.forEach(function(series, i) {\n                series.values.forEach(function(point) {\n                    point.series = i;\n                });\n            });\n\n            // Setup Scales\n            // remap and flatten the data for use in calculating the scales' domains\n            var seriesData = (xDomain && yDomain && sizeDomain) ? [] : // if we know xDomain and yDomain and sizeDomain, no need to calculate.... if Size is constant remember to set sizeDomain to speed up performance\n                d3.merge(\n                    data.map(function(d) {\n                        return d.values.map(function(d,i) {\n                            return { x: getX(d,i), y: getY(d,i), size: getSize(d,i) }\n                        })\n                    })\n                );\n\n            x   .domain(xDomain || d3.extent(seriesData.map(function(d) { return d.x; }).concat(forceX)))\n\n            if (padData && data[0])\n                x.range(xRange || [(availableWidth * padDataOuter +  availableWidth) / (2 *data[0].values.length), availableWidth - availableWidth * (1 + padDataOuter) / (2 * data[0].values.length)  ]);\n            //x.range([availableWidth * .5 / data[0].values.length, availableWidth * (data[0].values.length - .5)  / data[0].values.length ]);\n            else\n                x.range(xRange || [0, availableWidth]);\n\n            y   .domain(yDomain || d3.extent(seriesData.map(function(d) { return d.y }).concat(forceY)))\n                .range(yRange || [availableHeight, 0]);\n\n            z   .domain(sizeDomain || d3.extent(seriesData.map(function(d) { return d.size }).concat(forceSize)))\n                .range(sizeRange || _sizeRange_def);\n\n            // If scale's domain don't have a range, slightly adjust to make one... so a chart can show a single data point\n            singlePoint = x.domain()[0] === x.domain()[1] || y.domain()[0] === y.domain()[1];\n\n            if (x.domain()[0] === x.domain()[1])\n                x.domain()[0] ?\n                    x.domain([x.domain()[0] - x.domain()[0] * 0.01, x.domain()[1] + x.domain()[1] * 0.01])\n                    : x.domain([-1,1]);\n\n            if (y.domain()[0] === y.domain()[1])\n                y.domain()[0] ?\n                    y.domain([y.domain()[0] - y.domain()[0] * 0.01, y.domain()[1] + y.domain()[1] * 0.01])\n                    : y.domain([-1,1]);\n\n            if ( isNaN(x.domain()[0])) {\n                x.domain([-1,1]);\n            }\n\n            if ( isNaN(y.domain()[0])) {\n                y.domain([-1,1]);\n            }\n\n            x0 = x0 || x;\n            y0 = y0 || y;\n            z0 = z0 || z;\n\n            // Setup containers and skeleton of chart\n            var wrap = container.selectAll('g.nv-wrap.nv-scatter').data([data]);\n            var wrapEnter = wrap.enter().append('g').attr('class', 'nvd3 nv-wrap nv-scatter nv-chart-' + id);\n            var defsEnter = wrapEnter.append('defs');\n            var gEnter = wrapEnter.append('g');\n            var g = wrap.select('g');\n\n            wrap.classed('nv-single-point', singlePoint);\n            gEnter.append('g').attr('class', 'nv-groups');\n            gEnter.append('g').attr('class', 'nv-point-paths');\n            wrapEnter.append('g').attr('class', 'nv-point-clips');\n\n            wrap.attr('transform', 'translate(' + margin.left + ',' + margin.top + ')');\n\n            defsEnter.append('clipPath')\n                .attr('id', 'nv-edge-clip-' + id)\n                .append('rect');\n\n            wrap.select('#nv-edge-clip-' + id + ' rect')\n                .attr('width', availableWidth)\n                .attr('height', (availableHeight > 0) ? availableHeight : 0);\n\n            g.attr('clip-path', clipEdge ? 'url(#nv-edge-clip-' + id + ')' : '');\n\n            function updateInteractiveLayer() {\n                // Always clear needs-update flag regardless of whether or not\n                // we will actually do anything (avoids needless invocations).\n                needsUpdate = false;\n\n                if (!interactive) return false;\n\n                // inject series and point index for reference into voronoi\n                if (useVoronoi === true) {\n                    var vertices = d3.merge(data.map(function(group, groupIndex) {\n                            return group.values\n                                .map(function(point, pointIndex) {\n                                    // *Adding noise to make duplicates very unlikely\n                                    // *Injecting series and point index for reference\n                                    /* *Adding a 'jitter' to the points, because there's an issue in d3.geom.voronoi.\n                                     */\n                                    var pX = getX(point,pointIndex);\n                                    var pY = getY(point,pointIndex);\n\n                                    return [x(pX)+ Math.random() * 1e-4,\n                                            y(pY)+ Math.random() * 1e-4,\n                                        groupIndex,\n                                        pointIndex, point]; //temp hack to add noise until I think of a better way so there are no duplicates\n                                })\n                                .filter(function(pointArray, pointIndex) {\n                                    return pointActive(pointArray[4], pointIndex); // Issue #237.. move filter to after map, so pointIndex is correct!\n                                })\n                        })\n                    );\n\n                    if (vertices.length == 0) return false;  // No active points, we're done\n                    if (vertices.length < 3) {\n                        // Issue #283 - Adding 2 dummy points to the voronoi b/c voronoi requires min 3 points to work\n                        vertices.push([x.range()[0] - 20, y.range()[0] - 20, null, null]);\n                        vertices.push([x.range()[1] + 20, y.range()[1] + 20, null, null]);\n                        vertices.push([x.range()[0] - 20, y.range()[0] + 20, null, null]);\n                        vertices.push([x.range()[1] + 20, y.range()[1] - 20, null, null]);\n                    }\n\n                    // keep voronoi sections from going more than 10 outside of graph\n                    // to avoid overlap with other things like legend etc\n                    var bounds = d3.geom.polygon([\n                        [-10,-10],\n                        [-10,height + 10],\n                        [width + 10,height + 10],\n                        [width + 10,-10]\n                    ]);\n\n                    var voronoi = d3.geom.voronoi(vertices).map(function(d, i) {\n                        return {\n                            'data': bounds.clip(d),\n                            'series': vertices[i][2],\n                            'point': vertices[i][3]\n                        }\n                    });\n\n                    // nuke all voronoi paths on reload and recreate them\n                    wrap.select('.nv-point-paths').selectAll('path').remove();\n                    var pointPaths = wrap.select('.nv-point-paths').selectAll('path').data(voronoi);\n                    var vPointPaths = pointPaths\n                        .enter().append(\"svg:path\")\n                        .attr(\"d\", function(d) {\n                            if (!d || !d.data || d.data.length === 0)\n                                return 'M 0 0';\n                            else\n                                return \"M\" + d.data.join(\",\") + \"Z\";\n                        })\n                        .attr(\"id\", function(d,i) {\n                            return \"nv-path-\"+i; })\n                        .attr(\"clip-path\", function(d,i) { return \"url(#nv-clip-\"+i+\")\"; })\n                        ;\n\n                    // good for debugging point hover issues\n                    if (showVoronoi) {\n                        vPointPaths.style(\"fill\", d3.rgb(230, 230, 230))\n                            .style('fill-opacity', 0.4)\n                            .style('stroke-opacity', 1)\n                            .style(\"stroke\", d3.rgb(200,200,200));\n                    }\n\n                    if (clipVoronoi) {\n                        // voronoi sections are already set to clip,\n                        // just create the circles with the IDs they expect\n                        wrap.select('.nv-point-clips').selectAll('clipPath').remove();\n                        wrap.select('.nv-point-clips').selectAll(\"clipPath\")\n                            .data(vertices)\n                            .enter().append(\"svg:clipPath\")\n                            .attr(\"id\", function(d, i) { return \"nv-clip-\"+i;})\n                            .append(\"svg:circle\")\n                            .attr('cx', function(d) { return d[0]; })\n                            .attr('cy', function(d) { return d[1]; })\n                            .attr('r', clipRadius);\n                    }\n\n                    var mouseEventCallback = function(d, mDispatch) {\n                        if (needsUpdate) return 0;\n                        var series = data[d.series];\n                        if (series === undefined) return;\n                        var point  = series.values[d.point];\n                        point['color'] = color(series, d.series);\n\n                        // standardize attributes for tooltip.\n                        point['x'] = getX(point);\n                        point['y'] = getY(point);\n\n                        // can't just get box of event node since it's actually a voronoi polygon\n                        var box = container.node().getBoundingClientRect();\n                        var scrollTop  = window.pageYOffset || document.documentElement.scrollTop;\n                        var scrollLeft = window.pageXOffset || document.documentElement.scrollLeft;\n\n                        var pos = {\n                            left: x(getX(point, d.point)) + box.left + scrollLeft + margin.left + 10,\n                            top: y(getY(point, d.point)) + box.top + scrollTop + margin.top + 10\n                        };\n\n                        mDispatch({\n                            point: point,\n                            series: series,\n                            pos: pos,\n                            seriesIndex: d.series,\n                            pointIndex: d.point\n                        });\n                    };\n\n                    pointPaths\n                        .on('click', function(d) {\n                            mouseEventCallback(d, dispatch.elementClick);\n                        })\n                        .on('dblclick', function(d) {\n                            mouseEventCallback(d, dispatch.elementDblClick);\n                        })\n                        .on('mouseover', function(d) {\n                            mouseEventCallback(d, dispatch.elementMouseover);\n                        })\n                        .on('mouseout', function(d, i) {\n                            mouseEventCallback(d, dispatch.elementMouseout);\n                        });\n\n                } else {\n                    // add event handlers to points instead voronoi paths\n                    wrap.select('.nv-groups').selectAll('.nv-group')\n                        .selectAll('.nv-point')\n                        //.data(dataWithPoints)\n                        //.style('pointer-events', 'auto') // recativate events, disabled by css\n                        .on('click', function(d,i) {\n                            //nv.log('test', d, i);\n                            if (needsUpdate || !data[d.series]) return 0; //check if this is a dummy point\n                            var series = data[d.series],\n                                point  = series.values[i];\n\n                            dispatch.elementClick({\n                                point: point,\n                                series: series,\n                                pos: [x(getX(point, i)) + margin.left, y(getY(point, i)) + margin.top],\n                                seriesIndex: d.series,\n                                pointIndex: i\n                            });\n                        })\n                        .on('dblclick', function(d,i) {\n                            if (needsUpdate || !data[d.series]) return 0; //check if this is a dummy point\n                            var series = data[d.series],\n                                point  = series.values[i];\n\n                            dispatch.elementDblClick({\n                                point: point,\n                                series: series,\n                                pos: [x(getX(point, i)) + margin.left, y(getY(point, i)) + margin.top],\n                                seriesIndex: d.series,\n                                pointIndex: i\n                            });\n                        })\n                        .on('mouseover', function(d,i) {\n                            if (needsUpdate || !data[d.series]) return 0; //check if this is a dummy point\n                            var series = data[d.series],\n                                point  = series.values[i];\n\n                            dispatch.elementMouseover({\n                                point: point,\n                                series: series,\n                                pos: [x(getX(point, i)) + margin.left, y(getY(point, i)) + margin.top],\n                                seriesIndex: d.series,\n                                pointIndex: i,\n                                color: color(d, i)\n                            });\n                        })\n                        .on('mouseout', function(d,i) {\n                            if (needsUpdate || !data[d.series]) return 0; //check if this is a dummy point\n                            var series = data[d.series],\n                                point  = series.values[i];\n\n                            dispatch.elementMouseout({\n                                point: point,\n                                series: series,\n                                seriesIndex: d.series,\n                                pointIndex: i,\n                                color: color(d, i)\n                            });\n                        });\n                }\n            }\n\n            needsUpdate = true;\n            var groups = wrap.select('.nv-groups').selectAll('.nv-group')\n                .data(function(d) { return d }, function(d) { return d.key });\n            groups.enter().append('g')\n                .style('stroke-opacity', 1e-6)\n                .style('fill-opacity', 1e-6);\n            groups.exit()\n                .remove();\n            groups\n                .attr('class', function(d,i) { return 'nv-group nv-series-' + i })\n                .classed('hover', function(d) { return d.hover });\n            groups.watchTransition(renderWatch, 'scatter: groups')\n                .style('fill', function(d,i) { return color(d, i) })\n                .style('stroke', function(d,i) { return color(d, i) })\n                .style('stroke-opacity', 1)\n                .style('fill-opacity', .5);\n\n            // create the points, maintaining their IDs from the original data set\n            var points = groups.selectAll('path.nv-point')\n                .data(function(d) {\n                    return d.values.map(\n                        function (point, pointIndex) {\n                            return [point, pointIndex]\n                        }).filter(\n                            function(pointArray, pointIndex) {\n                                return pointActive(pointArray[0], pointIndex)\n                            })\n                    });\n            points.enter().append('path')\n                .style('fill', function (d) { return d.color })\n                .style('stroke', function (d) { return d.color })\n                .attr('transform', function(d) {\n                    return 'translate(' + x0(getX(d[0],d[1])) + ',' + y0(getY(d[0],d[1])) + ')'\n                })\n                .attr('d',\n                    nv.utils.symbol()\n                    .type(function(d) { return getShape(d[0]); })\n                    .size(function(d) { return z(getSize(d[0],d[1])) })\n            );\n            points.exit().remove();\n            groups.exit().selectAll('path.nv-point')\n                .watchTransition(renderWatch, 'scatter exit')\n                .attr('transform', function(d) {\n                    return 'translate(' + x(getX(d[0],d[1])) + ',' + y(getY(d[0],d[1])) + ')'\n                })\n                .remove();\n            points.each(function(d) {\n                d3.select(this)\n                    .classed('nv-point', true)\n                    .classed('nv-point-' + d[1], true)\n                    .classed('nv-noninteractive', !interactive)\n                    .classed('hover',false)\n                ;\n            });\n            points\n                .watchTransition(renderWatch, 'scatter points')\n                .attr('transform', function(d) {\n                    //nv.log(d, getX(d[0],d[1]), x(getX(d[0],d[1])));\n                    return 'translate(' + x(getX(d[0],d[1])) + ',' + y(getY(d[0],d[1])) + ')'\n                })\n                .attr('d',\n                    nv.utils.symbol()\n                    .type(function(d) { return getShape(d[0]); })\n                    .size(function(d) { return z(getSize(d[0],d[1])) })\n            );\n\n            // Delay updating the invisible interactive layer for smoother animation\n            clearTimeout(timeoutID); // stop repeat calls to updateInteractiveLayer\n            timeoutID = setTimeout(updateInteractiveLayer, 300);\n            //updateInteractiveLayer();\n\n            //store old scales for use in transitions on update\n            x0 = x.copy();\n            y0 = y.copy();\n            z0 = z.copy();\n\n        });\n        renderWatch.renderEnd('scatter immediate');\n        return chart;\n    }\n\n    //============================================================\n    // Expose Public Variables\n    //------------------------------------------------------------\n\n    chart.dispatch = dispatch;\n    chart.options = nv.utils.optionsFunc.bind(chart);\n\n    // utility function calls provided by this chart\n    chart._calls = new function() {\n        this.clearHighlights = function () {\n            nv.dom.write(function() {\n                container.selectAll(\".nv-point.hover\").classed(\"hover\", false);\n            });\n            return null;\n        };\n        this.highlightPoint = function (seriesIndex, pointIndex, isHoverOver) {\n            nv.dom.write(function() {\n                container.select(\" .nv-series-\" + seriesIndex + \" .nv-point-\" + pointIndex)\n                    .classed(\"hover\", isHoverOver);\n            });\n        };\n    };\n\n    // trigger calls from events too\n    dispatch.on('elementMouseover.point', function(d) {\n        if (interactive) chart._calls.highlightPoint(d.seriesIndex,d.pointIndex,true);\n    });\n\n    dispatch.on('elementMouseout.point', function(d) {\n        if (interactive) chart._calls.highlightPoint(d.seriesIndex,d.pointIndex,false);\n    });\n\n    chart._options = Object.create({}, {\n        // simple options, just get/set the necessary values\n        width:        {get: function(){return width;}, set: function(_){width=_;}},\n        height:       {get: function(){return height;}, set: function(_){height=_;}},\n        xScale:       {get: function(){return x;}, set: function(_){x=_;}},\n        yScale:       {get: function(){return y;}, set: function(_){y=_;}},\n        pointScale:   {get: function(){return z;}, set: function(_){z=_;}},\n        xDomain:      {get: function(){return xDomain;}, set: function(_){xDomain=_;}},\n        yDomain:      {get: function(){return yDomain;}, set: function(_){yDomain=_;}},\n        pointDomain:  {get: function(){return sizeDomain;}, set: function(_){sizeDomain=_;}},\n        xRange:       {get: function(){return xRange;}, set: function(_){xRange=_;}},\n        yRange:       {get: function(){return yRange;}, set: function(_){yRange=_;}},\n        pointRange:   {get: function(){return sizeRange;}, set: function(_){sizeRange=_;}},\n        forceX:       {get: function(){return forceX;}, set: function(_){forceX=_;}},\n        forceY:       {get: function(){return forceY;}, set: function(_){forceY=_;}},\n        forcePoint:   {get: function(){return forceSize;}, set: function(_){forceSize=_;}},\n        interactive:  {get: function(){return interactive;}, set: function(_){interactive=_;}},\n        pointActive:  {get: function(){return pointActive;}, set: function(_){pointActive=_;}},\n        padDataOuter: {get: function(){return padDataOuter;}, set: function(_){padDataOuter=_;}},\n        padData:      {get: function(){return padData;}, set: function(_){padData=_;}},\n        clipEdge:     {get: function(){return clipEdge;}, set: function(_){clipEdge=_;}},\n        clipVoronoi:  {get: function(){return clipVoronoi;}, set: function(_){clipVoronoi=_;}},\n        clipRadius:   {get: function(){return clipRadius;}, set: function(_){clipRadius=_;}},\n        showVoronoi:   {get: function(){return showVoronoi;}, set: function(_){showVoronoi=_;}},\n        id:           {get: function(){return id;}, set: function(_){id=_;}},\n\n\n        // simple functor options\n        x:     {get: function(){return getX;}, set: function(_){getX = d3.functor(_);}},\n        y:     {get: function(){return getY;}, set: function(_){getY = d3.functor(_);}},\n        pointSize: {get: function(){return getSize;}, set: function(_){getSize = d3.functor(_);}},\n        pointShape: {get: function(){return getShape;}, set: function(_){getShape = d3.functor(_);}},\n\n        // options that require extra logic in the setter\n        margin: {get: function(){return margin;}, set: function(_){\n            margin.top    = _.top    !== undefined ? _.top    : margin.top;\n            margin.right  = _.right  !== undefined ? _.right  : margin.right;\n            margin.bottom = _.bottom !== undefined ? _.bottom : margin.bottom;\n            margin.left   = _.left   !== undefined ? _.left   : margin.left;\n        }},\n        duration: {get: function(){return duration;}, set: function(_){\n            duration = _;\n            renderWatch.reset(duration);\n        }},\n        color: {get: function(){return color;}, set: function(_){\n            color = nv.utils.getColor(_);\n        }},\n        useVoronoi: {get: function(){return useVoronoi;}, set: function(_){\n            useVoronoi = _;\n            if (useVoronoi === false) {\n                clipVoronoi = false;\n            }\n        }}\n    });\n\n    nv.utils.initOptions(chart);\n    return chart;\n};\n\nnv.models.scatterChart = function() {\n    \"use strict\";\n\n    //============================================================\n    // Public Variables with Default Settings\n    //------------------------------------------------------------\n\n    var scatter      = nv.models.scatter()\n        , xAxis        = nv.models.axis()\n        , yAxis        = nv.models.axis()\n        , legend       = nv.models.legend()\n        , distX        = nv.models.distribution()\n        , distY        = nv.models.distribution()\n        , tooltip      = nv.models.tooltip()\n        ;\n\n    var margin       = {top: 30, right: 20, bottom: 50, left: 75}\n        , width        = null\n        , height       = null\n        , container    = null\n        , color        = nv.utils.defaultColor()\n        , x            = scatter.xScale()\n        , y            = scatter.yScale()\n        , showDistX    = false\n        , showDistY    = false\n        , showLegend   = true\n        , showXAxis    = true\n        , showYAxis    = true\n        , rightAlignYAxis = false\n        , state = nv.utils.state()\n        , defaultState = null\n        , dispatch = d3.dispatch('stateChange', 'changeState', 'renderEnd')\n        , noData       = null\n        , duration = 250\n        ;\n\n    scatter.xScale(x).yScale(y);\n    xAxis.orient('bottom').tickPadding(10);\n    yAxis\n        .orient((rightAlignYAxis) ? 'right' : 'left')\n        .tickPadding(10)\n    ;\n    distX.axis('x');\n    distY.axis('y');\n    tooltip\n        .headerFormatter(function(d, i) {\n            return xAxis.tickFormat()(d, i);\n        })\n        .valueFormatter(function(d, i) {\n            return yAxis.tickFormat()(d, i);\n        });\n\n    //============================================================\n    // Private Variables\n    //------------------------------------------------------------\n\n    var x0, y0\n        , renderWatch = nv.utils.renderWatch(dispatch, duration);\n\n    var stateGetter = function(data) {\n        return function(){\n            return {\n                active: data.map(function(d) { return !d.disabled })\n            };\n        }\n    };\n\n    var stateSetter = function(data) {\n        return function(state) {\n            if (state.active !== undefined)\n                data.forEach(function(series,i) {\n                    series.disabled = !state.active[i];\n                });\n        }\n    };\n\n    function chart(selection) {\n        renderWatch.reset();\n        renderWatch.models(scatter);\n        if (showXAxis) renderWatch.models(xAxis);\n        if (showYAxis) renderWatch.models(yAxis);\n        if (showDistX) renderWatch.models(distX);\n        if (showDistY) renderWatch.models(distY);\n\n        selection.each(function(data) {\n            var that = this;\n\n            container = d3.select(this);\n            nv.utils.initSVG(container);\n\n            var availableWidth = nv.utils.availableWidth(width, container, margin),\n                availableHeight = nv.utils.availableHeight(height, container, margin);\n\n            chart.update = function() {\n                if (duration === 0)\n                    container.call(chart);\n                else\n                    container.transition().duration(duration).call(chart);\n            };\n            chart.container = this;\n\n            state\n                .setter(stateSetter(data), chart.update)\n                .getter(stateGetter(data))\n                .update();\n\n            // DEPRECATED set state.disableddisabled\n            state.disabled = data.map(function(d) { return !!d.disabled });\n\n            if (!defaultState) {\n                var key;\n                defaultState = {};\n                for (key in state) {\n                    if (state[key] instanceof Array)\n                        defaultState[key] = state[key].slice(0);\n                    else\n                        defaultState[key] = state[key];\n                }\n            }\n\n            // Display noData message if there's nothing to show.\n            if (!data || !data.length || !data.filter(function(d) { return d.values.length }).length) {\n                nv.utils.noData(chart, container);\n                renderWatch.renderEnd('scatter immediate');\n                return chart;\n            } else {\n                container.selectAll('.nv-noData').remove();\n            }\n\n            // Setup Scales\n            x = scatter.xScale();\n            y = scatter.yScale();\n\n            // Setup containers and skeleton of chart\n            var wrap = container.selectAll('g.nv-wrap.nv-scatterChart').data([data]);\n            var wrapEnter = wrap.enter().append('g').attr('class', 'nvd3 nv-wrap nv-scatterChart nv-chart-' + scatter.id());\n            var gEnter = wrapEnter.append('g');\n            var g = wrap.select('g');\n\n            // background for pointer events\n            gEnter.append('rect').attr('class', 'nvd3 nv-background').style(\"pointer-events\",\"none\");\n\n            gEnter.append('g').attr('class', 'nv-x nv-axis');\n            gEnter.append('g').attr('class', 'nv-y nv-axis');\n            gEnter.append('g').attr('class', 'nv-scatterWrap');\n            gEnter.append('g').attr('class', 'nv-regressionLinesWrap');\n            gEnter.append('g').attr('class', 'nv-distWrap');\n            gEnter.append('g').attr('class', 'nv-legendWrap');\n\n            if (rightAlignYAxis) {\n                g.select(\".nv-y.nv-axis\")\n                    .attr(\"transform\", \"translate(\" + availableWidth + \",0)\");\n            }\n\n            // Legend\n            if (showLegend) {\n                var legendWidth = availableWidth;\n                legend.width(legendWidth);\n\n                wrap.select('.nv-legendWrap')\n                    .datum(data)\n                    .call(legend);\n\n                if ( margin.top != legend.height()) {\n                    margin.top = legend.height();\n                    availableHeight = nv.utils.availableHeight(height, container, margin);\n                }\n\n                wrap.select('.nv-legendWrap')\n                    .attr('transform', 'translate(0' + ',' + (-margin.top) +')');\n            }\n\n            wrap.attr('transform', 'translate(' + margin.left + ',' + margin.top + ')');\n\n            // Main Chart Component(s)\n            scatter\n                .width(availableWidth)\n                .height(availableHeight)\n                .color(data.map(function(d,i) {\n                    d.color = d.color || color(d, i);\n                    return d.color;\n                }).filter(function(d,i) { return !data[i].disabled }));\n\n            wrap.select('.nv-scatterWrap')\n                .datum(data.filter(function(d) { return !d.disabled }))\n                .call(scatter);\n\n\n            wrap.select('.nv-regressionLinesWrap')\n                .attr('clip-path', 'url(#nv-edge-clip-' + scatter.id() + ')');\n\n            var regWrap = wrap.select('.nv-regressionLinesWrap').selectAll('.nv-regLines')\n                .data(function (d) {\n                    return d;\n                });\n\n            regWrap.enter().append('g').attr('class', 'nv-regLines');\n\n            var regLine = regWrap.selectAll('.nv-regLine')\n                .data(function (d) {\n                    return [d]\n                });\n\n            regLine.enter()\n                .append('line').attr('class', 'nv-regLine')\n                .style('stroke-opacity', 0);\n\n            // don't add lines unless we have slope and intercept to use\n            regLine.filter(function(d) {\n                return d.intercept && d.slope;\n            })\n                .watchTransition(renderWatch, 'scatterPlusLineChart: regline')\n                .attr('x1', x.range()[0])\n                .attr('x2', x.range()[1])\n                .attr('y1', function (d, i) {\n                    return y(x.domain()[0] * d.slope + d.intercept)\n                })\n                .attr('y2', function (d, i) {\n                    return y(x.domain()[1] * d.slope + d.intercept)\n                })\n                .style('stroke', function (d, i, j) {\n                    return color(d, j)\n                })\n                .style('stroke-opacity', function (d, i) {\n                    return (d.disabled || typeof d.slope === 'undefined' || typeof d.intercept === 'undefined') ? 0 : 1\n                });\n\n            // Setup Axes\n            if (showXAxis) {\n                xAxis\n                    .scale(x)\n                    ._ticks( nv.utils.calcTicksX(availableWidth/100, data) )\n                    .tickSize( -availableHeight , 0);\n\n                g.select('.nv-x.nv-axis')\n                    .attr('transform', 'translate(0,' + y.range()[0] + ')')\n                    .call(xAxis);\n            }\n\n            if (showYAxis) {\n                yAxis\n                    .scale(y)\n                    ._ticks( nv.utils.calcTicksY(availableHeight/36, data) )\n                    .tickSize( -availableWidth, 0);\n\n                g.select('.nv-y.nv-axis')\n                    .call(yAxis);\n            }\n\n\n            if (showDistX) {\n                distX\n                    .getData(scatter.x())\n                    .scale(x)\n                    .width(availableWidth)\n                    .color(data.map(function(d,i) {\n                        return d.color || color(d, i);\n                    }).filter(function(d,i) { return !data[i].disabled }));\n                gEnter.select('.nv-distWrap').append('g')\n                    .attr('class', 'nv-distributionX');\n                g.select('.nv-distributionX')\n                    .attr('transform', 'translate(0,' + y.range()[0] + ')')\n                    .datum(data.filter(function(d) { return !d.disabled }))\n                    .call(distX);\n            }\n\n            if (showDistY) {\n                distY\n                    .getData(scatter.y())\n                    .scale(y)\n                    .width(availableHeight)\n                    .color(data.map(function(d,i) {\n                        return d.color || color(d, i);\n                    }).filter(function(d,i) { return !data[i].disabled }));\n                gEnter.select('.nv-distWrap').append('g')\n                    .attr('class', 'nv-distributionY');\n                g.select('.nv-distributionY')\n                    .attr('transform', 'translate(' + (rightAlignYAxis ? availableWidth : -distY.size() ) + ',0)')\n                    .datum(data.filter(function(d) { return !d.disabled }))\n                    .call(distY);\n            }\n\n            //============================================================\n            // Event Handling/Dispatching (in chart's scope)\n            //------------------------------------------------------------\n\n            legend.dispatch.on('stateChange', function(newState) {\n                for (var key in newState)\n                    state[key] = newState[key];\n                dispatch.stateChange(state);\n                chart.update();\n            });\n\n            // Update chart from a state object passed to event handler\n            dispatch.on('changeState', function(e) {\n                if (typeof e.disabled !== 'undefined') {\n                    data.forEach(function(series,i) {\n                        series.disabled = e.disabled[i];\n                    });\n                    state.disabled = e.disabled;\n                }\n                chart.update();\n            });\n\n            // mouseover needs availableHeight so we just keep scatter mouse events inside the chart block\n            scatter.dispatch.on('elementMouseout.tooltip', function(evt) {\n                tooltip.hidden(true);\n                container.select('.nv-chart-' + scatter.id() + ' .nv-series-' + evt.seriesIndex + ' .nv-distx-' + evt.pointIndex)\n                    .attr('y1', 0);\n                container.select('.nv-chart-' + scatter.id() + ' .nv-series-' + evt.seriesIndex + ' .nv-disty-' + evt.pointIndex)\n                    .attr('x2', distY.size());\n            });\n\n            scatter.dispatch.on('elementMouseover.tooltip', function(evt) {\n                container.select('.nv-series-' + evt.seriesIndex + ' .nv-distx-' + evt.pointIndex)\n                    .attr('y1', evt.pos.top - availableHeight - margin.top);\n                container.select('.nv-series-' + evt.seriesIndex + ' .nv-disty-' + evt.pointIndex)\n                    .attr('x2', evt.pos.left + distX.size() - margin.left);\n                tooltip.position(evt.pos).data(evt).hidden(false);\n            });\n\n            //store old scales for use in transitions on update\n            x0 = x.copy();\n            y0 = y.copy();\n\n        });\n\n        renderWatch.renderEnd('scatter with line immediate');\n        return chart;\n    }\n\n    //============================================================\n    // Expose Public Variables\n    //------------------------------------------------------------\n\n    // expose chart's sub-components\n    chart.dispatch = dispatch;\n    chart.scatter = scatter;\n    chart.legend = legend;\n    chart.xAxis = xAxis;\n    chart.yAxis = yAxis;\n    chart.distX = distX;\n    chart.distY = distY;\n    chart.tooltip = tooltip;\n\n    chart.options = nv.utils.optionsFunc.bind(chart);\n    chart._options = Object.create({}, {\n        // simple options, just get/set the necessary values\n        width:      {get: function(){return width;}, set: function(_){width=_;}},\n        height:     {get: function(){return height;}, set: function(_){height=_;}},\n        container:  {get: function(){return container;}, set: function(_){container=_;}},\n        showDistX:  {get: function(){return showDistX;}, set: function(_){showDistX=_;}},\n        showDistY:  {get: function(){return showDistY;}, set: function(_){showDistY=_;}},\n        showLegend: {get: function(){return showLegend;}, set: function(_){showLegend=_;}},\n        showXAxis:  {get: function(){return showXAxis;}, set: function(_){showXAxis=_;}},\n        showYAxis:  {get: function(){return showYAxis;}, set: function(_){showYAxis=_;}},\n        defaultState:     {get: function(){return defaultState;}, set: function(_){defaultState=_;}},\n        noData:     {get: function(){return noData;}, set: function(_){noData=_;}},\n        duration:   {get: function(){return duration;}, set: function(_){duration=_;}},\n\n        // deprecated options\n        tooltips:    {get: function(){return tooltip.enabled();}, set: function(_){\n            // deprecated after 1.7.1\n            nv.deprecated('tooltips', 'use chart.tooltip.enabled() instead');\n            tooltip.enabled(!!_);\n        }},\n        tooltipContent:    {get: function(){return tooltip.contentGenerator();}, set: function(_){\n            // deprecated after 1.7.1\n            nv.deprecated('tooltipContent', 'use chart.tooltip.contentGenerator() instead');\n            tooltip.contentGenerator(_);\n        }},\n        tooltipXContent:    {get: function(){return tooltip.contentGenerator();}, set: function(_){\n            // deprecated after 1.7.1\n            nv.deprecated('tooltipContent', 'This option is removed, put values into main tooltip.');\n        }},\n        tooltipYContent:    {get: function(){return tooltip.contentGenerator();}, set: function(_){\n            // deprecated after 1.7.1\n            nv.deprecated('tooltipContent', 'This option is removed, put values into main tooltip.');\n        }},\n\n        // options that require extra logic in the setter\n        margin: {get: function(){return margin;}, set: function(_){\n            margin.top    = _.top    !== undefined ? _.top    : margin.top;\n            margin.right  = _.right  !== undefined ? _.right  : margin.right;\n            margin.bottom = _.bottom !== undefined ? _.bottom : margin.bottom;\n            margin.left   = _.left   !== undefined ? _.left   : margin.left;\n        }},\n        rightAlignYAxis: {get: function(){return rightAlignYAxis;}, set: function(_){\n            rightAlignYAxis = _;\n            yAxis.orient( (_) ? 'right' : 'left');\n        }},\n        color: {get: function(){return color;}, set: function(_){\n            color = nv.utils.getColor(_);\n            legend.color(color);\n            distX.color(color);\n            distY.color(color);\n        }}\n    });\n\n    nv.utils.inheritOptions(chart, scatter);\n    nv.utils.initOptions(chart);\n    return chart;\n};\n\nnv.models.sparkline = function() {\n    \"use strict\";\n\n    //============================================================\n    // Public Variables with Default Settings\n    //------------------------------------------------------------\n\n    var margin = {top: 2, right: 0, bottom: 2, left: 0}\n        , width = 400\n        , height = 32\n        , container = null\n        , animate = true\n        , x = d3.scale.linear()\n        , y = d3.scale.linear()\n        , getX = function(d) { return d.x }\n        , getY = function(d) { return d.y }\n        , color = nv.utils.getColor(['#000'])\n        , xDomain\n        , yDomain\n        , xRange\n        , yRange\n        ;\n\n    function chart(selection) {\n        selection.each(function(data) {\n            var availableWidth = width - margin.left - margin.right,\n                availableHeight = height - margin.top - margin.bottom;\n\n            container = d3.select(this);\n            nv.utils.initSVG(container);\n\n            // Setup Scales\n            x   .domain(xDomain || d3.extent(data, getX ))\n                .range(xRange || [0, availableWidth]);\n\n            y   .domain(yDomain || d3.extent(data, getY ))\n                .range(yRange || [availableHeight, 0]);\n\n            // Setup containers and skeleton of chart\n            var wrap = container.selectAll('g.nv-wrap.nv-sparkline').data([data]);\n            var wrapEnter = wrap.enter().append('g').attr('class', 'nvd3 nv-wrap nv-sparkline');\n            var gEnter = wrapEnter.append('g');\n            var g = wrap.select('g');\n\n            wrap.attr('transform', 'translate(' + margin.left + ',' + margin.top + ')')\n\n            var paths = wrap.selectAll('path')\n                .data(function(d) { return [d] });\n            paths.enter().append('path');\n            paths.exit().remove();\n            paths\n                .style('stroke', function(d,i) { return d.color || color(d, i) })\n                .attr('d', d3.svg.line()\n                    .x(function(d,i) { return x(getX(d,i)) })\n                    .y(function(d,i) { return y(getY(d,i)) })\n            );\n\n            // TODO: Add CURRENT data point (Need Min, Mac, Current / Most recent)\n            var points = wrap.selectAll('circle.nv-point')\n                .data(function(data) {\n                    var yValues = data.map(function(d, i) { return getY(d,i); });\n                    function pointIndex(index) {\n                        if (index != -1) {\n                            var result = data[index];\n                            result.pointIndex = index;\n                            return result;\n                        } else {\n                            return null;\n                        }\n                    }\n                    var maxPoint = pointIndex(yValues.lastIndexOf(y.domain()[1])),\n                        minPoint = pointIndex(yValues.indexOf(y.domain()[0])),\n                        currentPoint = pointIndex(yValues.length - 1);\n                    return [minPoint, maxPoint, currentPoint].filter(function (d) {return d != null;});\n                });\n            points.enter().append('circle');\n            points.exit().remove();\n            points\n                .attr('cx', function(d,i) { return x(getX(d,d.pointIndex)) })\n                .attr('cy', function(d,i) { return y(getY(d,d.pointIndex)) })\n                .attr('r', 2)\n                .attr('class', function(d,i) {\n                    return getX(d, d.pointIndex) == x.domain()[1] ? 'nv-point nv-currentValue' :\n                            getY(d, d.pointIndex) == y.domain()[0] ? 'nv-point nv-minValue' : 'nv-point nv-maxValue'\n                });\n        });\n\n        return chart;\n    }\n\n    //============================================================\n    // Expose Public Variables\n    //------------------------------------------------------------\n\n    chart.options = nv.utils.optionsFunc.bind(chart);\n\n    chart._options = Object.create({}, {\n        // simple options, just get/set the necessary values\n        width:     {get: function(){return width;}, set: function(_){width=_;}},\n        height:    {get: function(){return height;}, set: function(_){height=_;}},\n        xDomain:   {get: function(){return xDomain;}, set: function(_){xDomain=_;}},\n        yDomain:   {get: function(){return yDomain;}, set: function(_){yDomain=_;}},\n        xRange:    {get: function(){return xRange;}, set: function(_){xRange=_;}},\n        yRange:    {get: function(){return yRange;}, set: function(_){yRange=_;}},\n        xScale:    {get: function(){return x;}, set: function(_){x=_;}},\n        yScale:    {get: function(){return y;}, set: function(_){y=_;}},\n        animate:   {get: function(){return animate;}, set: function(_){animate=_;}},\n\n        //functor options\n        x: {get: function(){return getX;}, set: function(_){getX=d3.functor(_);}},\n        y: {get: function(){return getY;}, set: function(_){getY=d3.functor(_);}},\n\n        // options that require extra logic in the setter\n        margin: {get: function(){return margin;}, set: function(_){\n            margin.top    = _.top    !== undefined ? _.top    : margin.top;\n            margin.right  = _.right  !== undefined ? _.right  : margin.right;\n            margin.bottom = _.bottom !== undefined ? _.bottom : margin.bottom;\n            margin.left   = _.left   !== undefined ? _.left   : margin.left;\n        }},\n        color:  {get: function(){return color;}, set: function(_){\n            color = nv.utils.getColor(_);\n        }}\n    });\n\n    nv.utils.initOptions(chart);\n    return chart;\n};\n\nnv.models.sparklinePlus = function() {\n    \"use strict\";\n\n    //============================================================\n    // Public Variables with Default Settings\n    //------------------------------------------------------------\n\n    var sparkline = nv.models.sparkline();\n\n    var margin = {top: 15, right: 100, bottom: 10, left: 50}\n        , width = null\n        , height = null\n        , x\n        , y\n        , index = []\n        , paused = false\n        , xTickFormat = d3.format(',r')\n        , yTickFormat = d3.format(',.2f')\n        , showLastValue = true\n        , alignValue = true\n        , rightAlignValue = false\n        , noData = null\n        ;\n\n    function chart(selection) {\n        selection.each(function(data) {\n            var container = d3.select(this);\n            nv.utils.initSVG(container);\n\n            var availableWidth = nv.utils.availableWidth(width, container, margin),\n                availableHeight = nv.utils.availableHeight(height, container, margin);\n\n            chart.update = function() { container.call(chart); };\n            chart.container = this;\n\n            // Display No Data message if there's nothing to show.\n            if (!data || !data.length) {\n                nv.utils.noData(chart, container)\n                return chart;\n            } else {\n                container.selectAll('.nv-noData').remove();\n            }\n\n            var currentValue = sparkline.y()(data[data.length-1], data.length-1);\n\n            // Setup Scales\n            x = sparkline.xScale();\n            y = sparkline.yScale();\n\n            // Setup containers and skeleton of chart\n            var wrap = container.selectAll('g.nv-wrap.nv-sparklineplus').data([data]);\n            var wrapEnter = wrap.enter().append('g').attr('class', 'nvd3 nv-wrap nv-sparklineplus');\n            var gEnter = wrapEnter.append('g');\n            var g = wrap.select('g');\n\n            gEnter.append('g').attr('class', 'nv-sparklineWrap');\n            gEnter.append('g').attr('class', 'nv-valueWrap');\n            gEnter.append('g').attr('class', 'nv-hoverArea');\n\n            wrap.attr('transform', 'translate(' + margin.left + ',' + margin.top + ')');\n\n            // Main Chart Component(s)\n            var sparklineWrap = g.select('.nv-sparklineWrap');\n\n            sparkline.width(availableWidth).height(availableHeight);\n            sparklineWrap.call(sparkline);\n\n            if (showLastValue) {\n                var valueWrap = g.select('.nv-valueWrap');\n                var value = valueWrap.selectAll('.nv-currentValue')\n                    .data([currentValue]);\n\n                value.enter().append('text').attr('class', 'nv-currentValue')\n                    .attr('dx', rightAlignValue ? -8 : 8)\n                    .attr('dy', '.9em')\n                    .style('text-anchor', rightAlignValue ? 'end' : 'start');\n\n                value\n                    .attr('x', availableWidth + (rightAlignValue ? margin.right : 0))\n                    .attr('y', alignValue ? function (d) {\n                        return y(d)\n                    } : 0)\n                    .style('fill', sparkline.color()(data[data.length - 1], data.length - 1))\n                    .text(yTickFormat(currentValue));\n            }\n\n            gEnter.select('.nv-hoverArea').append('rect')\n                .on('mousemove', sparklineHover)\n                .on('click', function() { paused = !paused })\n                .on('mouseout', function() { index = []; updateValueLine(); });\n\n            g.select('.nv-hoverArea rect')\n                .attr('transform', function(d) { return 'translate(' + -margin.left + ',' + -margin.top + ')' })\n                .attr('width', availableWidth + margin.left + margin.right)\n                .attr('height', availableHeight + margin.top);\n\n            //index is currently global (within the chart), may or may not keep it that way\n            function updateValueLine() {\n                if (paused) return;\n\n                var hoverValue = g.selectAll('.nv-hoverValue').data(index);\n\n                var hoverEnter = hoverValue.enter()\n                    .append('g').attr('class', 'nv-hoverValue')\n                    .style('stroke-opacity', 0)\n                    .style('fill-opacity', 0);\n\n                hoverValue.exit()\n                    .transition().duration(250)\n                    .style('stroke-opacity', 0)\n                    .style('fill-opacity', 0)\n                    .remove();\n\n                hoverValue\n                    .attr('transform', function(d) { return 'translate(' + x(sparkline.x()(data[d],d)) + ',0)' })\n                    .transition().duration(250)\n                    .style('stroke-opacity', 1)\n                    .style('fill-opacity', 1);\n\n                if (!index.length) return;\n\n                hoverEnter.append('line')\n                    .attr('x1', 0)\n                    .attr('y1', -margin.top)\n                    .attr('x2', 0)\n                    .attr('y2', availableHeight);\n\n                hoverEnter.append('text').attr('class', 'nv-xValue')\n                    .attr('x', -6)\n                    .attr('y', -margin.top)\n                    .attr('text-anchor', 'end')\n                    .attr('dy', '.9em');\n\n                g.select('.nv-hoverValue .nv-xValue')\n                    .text(xTickFormat(sparkline.x()(data[index[0]], index[0])));\n\n                hoverEnter.append('text').attr('class', 'nv-yValue')\n                    .attr('x', 6)\n                    .attr('y', -margin.top)\n                    .attr('text-anchor', 'start')\n                    .attr('dy', '.9em');\n\n                g.select('.nv-hoverValue .nv-yValue')\n                    .text(yTickFormat(sparkline.y()(data[index[0]], index[0])));\n            }\n\n            function sparklineHover() {\n                if (paused) return;\n\n                var pos = d3.mouse(this)[0] - margin.left;\n\n                function getClosestIndex(data, x) {\n                    var distance = Math.abs(sparkline.x()(data[0], 0) - x);\n                    var closestIndex = 0;\n                    for (var i = 0; i < data.length; i++){\n                        if (Math.abs(sparkline.x()(data[i], i) - x) < distance) {\n                            distance = Math.abs(sparkline.x()(data[i], i) - x);\n                            closestIndex = i;\n                        }\n                    }\n                    return closestIndex;\n                }\n\n                index = [getClosestIndex(data, Math.round(x.invert(pos)))];\n                updateValueLine();\n            }\n\n        });\n\n        return chart;\n    }\n\n    //============================================================\n    // Expose Public Variables\n    //------------------------------------------------------------\n\n    // expose chart's sub-components\n    chart.sparkline = sparkline;\n\n    chart.options = nv.utils.optionsFunc.bind(chart);\n\n    chart._options = Object.create({}, {\n        // simple options, just get/set the necessary values\n        width:           {get: function(){return width;}, set: function(_){width=_;}},\n        height:          {get: function(){return height;}, set: function(_){height=_;}},\n        xTickFormat:     {get: function(){return xTickFormat;}, set: function(_){xTickFormat=_;}},\n        yTickFormat:     {get: function(){return yTickFormat;}, set: function(_){yTickFormat=_;}},\n        showLastValue:   {get: function(){return showLastValue;}, set: function(_){showLastValue=_;}},\n        alignValue:      {get: function(){return alignValue;}, set: function(_){alignValue=_;}},\n        rightAlignValue: {get: function(){return rightAlignValue;}, set: function(_){rightAlignValue=_;}},\n        noData:          {get: function(){return noData;}, set: function(_){noData=_;}},\n\n        // options that require extra logic in the setter\n        margin: {get: function(){return margin;}, set: function(_){\n            margin.top    = _.top    !== undefined ? _.top    : margin.top;\n            margin.right  = _.right  !== undefined ? _.right  : margin.right;\n            margin.bottom = _.bottom !== undefined ? _.bottom : margin.bottom;\n            margin.left   = _.left   !== undefined ? _.left   : margin.left;\n        }}\n    });\n\n    nv.utils.inheritOptions(chart, sparkline);\n    nv.utils.initOptions(chart);\n\n    return chart;\n};\n\nnv.models.stackedArea = function() {\n    \"use strict\";\n\n    //============================================================\n    // Public Variables with Default Settings\n    //------------------------------------------------------------\n\n    var margin = {top: 0, right: 0, bottom: 0, left: 0}\n        , width = 960\n        , height = 500\n        , color = nv.utils.defaultColor() // a function that computes the color\n        , id = Math.floor(Math.random() * 100000) //Create semi-unique ID incase user doesn't selet one\n        , container = null\n        , getX = function(d) { return d.x } // accessor to get the x value from a data point\n        , getY = function(d) { return d.y } // accessor to get the y value from a data point\n        , style = 'stack'\n        , offset = 'zero'\n        , order = 'default'\n        , interpolate = 'linear'  // controls the line interpolation\n        , clipEdge = false // if true, masks lines within x and y scale\n        , x //can be accessed via chart.xScale()\n        , y //can be accessed via chart.yScale()\n        , scatter = nv.models.scatter()\n        , duration = 250\n        , dispatch =  d3.dispatch('areaClick', 'areaMouseover', 'areaMouseout','renderEnd', 'elementClick', 'elementMouseover', 'elementMouseout')\n        ;\n\n    scatter\n        .pointSize(2.2) // default size\n        .pointDomain([2.2, 2.2]) // all the same size by default\n    ;\n\n    /************************************\n     * offset:\n     *   'wiggle' (stream)\n     *   'zero' (stacked)\n     *   'expand' (normalize to 100%)\n     *   'silhouette' (simple centered)\n     *\n     * order:\n     *   'inside-out' (stream)\n     *   'default' (input order)\n     ************************************/\n\n    var renderWatch = nv.utils.renderWatch(dispatch, duration);\n\n    function chart(selection) {\n        renderWatch.reset();\n        renderWatch.models(scatter);\n        selection.each(function(data) {\n            var availableWidth = width - margin.left - margin.right,\n                availableHeight = height - margin.top - margin.bottom;\n\n            container = d3.select(this);\n            nv.utils.initSVG(container);\n\n            // Setup Scales\n            x = scatter.xScale();\n            y = scatter.yScale();\n\n            var dataRaw = data;\n            // Injecting point index into each point because d3.layout.stack().out does not give index\n            data.forEach(function(aseries, i) {\n                aseries.seriesIndex = i;\n                aseries.values = aseries.values.map(function(d, j) {\n                    d.index = j;\n                    d.seriesIndex = i;\n                    return d;\n                });\n            });\n\n            var dataFiltered = data.filter(function(series) {\n                return !series.disabled;\n            });\n\n            data = d3.layout.stack()\n                .order(order)\n                .offset(offset)\n                .values(function(d) { return d.values })  //TODO: make values customizeable in EVERY model in this fashion\n                .x(getX)\n                .y(getY)\n                .out(function(d, y0, y) {\n                    d.display = {\n                        y: y,\n                        y0: y0\n                    };\n                })\n            (dataFiltered);\n\n            // Setup containers and skeleton of chart\n            var wrap = container.selectAll('g.nv-wrap.nv-stackedarea').data([data]);\n            var wrapEnter = wrap.enter().append('g').attr('class', 'nvd3 nv-wrap nv-stackedarea');\n            var defsEnter = wrapEnter.append('defs');\n            var gEnter = wrapEnter.append('g');\n            var g = wrap.select('g');\n\n            gEnter.append('g').attr('class', 'nv-areaWrap');\n            gEnter.append('g').attr('class', 'nv-scatterWrap');\n\n            wrap.attr('transform', 'translate(' + margin.left + ',' + margin.top + ')');\n            \n            // If the user has not specified forceY, make sure 0 is included in the domain\n            // Otherwise, use user-specified values for forceY\n            if (scatter.forceY().length == 0) {\n                scatter.forceY().push(0);\n            }\n            \n            scatter\n                .width(availableWidth)\n                .height(availableHeight)\n                .x(getX)\n                .y(function(d) { return d.display.y + d.display.y0 })\n                .forceY([0])\n                .color(data.map(function(d,i) {\n                    return d.color || color(d, d.seriesIndex);\n                }));\n\n            var scatterWrap = g.select('.nv-scatterWrap')\n                .datum(data);\n\n            scatterWrap.call(scatter);\n\n            defsEnter.append('clipPath')\n                .attr('id', 'nv-edge-clip-' + id)\n                .append('rect');\n\n            wrap.select('#nv-edge-clip-' + id + ' rect')\n                .attr('width', availableWidth)\n                .attr('height', availableHeight);\n\n            g.attr('clip-path', clipEdge ? 'url(#nv-edge-clip-' + id + ')' : '');\n\n            var area = d3.svg.area()\n                .x(function(d,i)  { return x(getX(d,i)) })\n                .y0(function(d) {\n                    return y(d.display.y0)\n                })\n                .y1(function(d) {\n                    return y(d.display.y + d.display.y0)\n                })\n                .interpolate(interpolate);\n\n            var zeroArea = d3.svg.area()\n                .x(function(d,i)  { return x(getX(d,i)) })\n                .y0(function(d) { return y(d.display.y0) })\n                .y1(function(d) { return y(d.display.y0) });\n\n            var path = g.select('.nv-areaWrap').selectAll('path.nv-area')\n                .data(function(d) { return d });\n\n            path.enter().append('path').attr('class', function(d,i) { return 'nv-area nv-area-' + i })\n                .attr('d', function(d,i){\n                    return zeroArea(d.values, d.seriesIndex);\n                })\n                .on('mouseover', function(d,i) {\n                    d3.select(this).classed('hover', true);\n                    dispatch.areaMouseover({\n                        point: d,\n                        series: d.key,\n                        pos: [d3.event.pageX, d3.event.pageY],\n                        seriesIndex: d.seriesIndex\n                    });\n                })\n                .on('mouseout', function(d,i) {\n                    d3.select(this).classed('hover', false);\n                    dispatch.areaMouseout({\n                        point: d,\n                        series: d.key,\n                        pos: [d3.event.pageX, d3.event.pageY],\n                        seriesIndex: d.seriesIndex\n                    });\n                })\n                .on('click', function(d,i) {\n                    d3.select(this).classed('hover', false);\n                    dispatch.areaClick({\n                        point: d,\n                        series: d.key,\n                        pos: [d3.event.pageX, d3.event.pageY],\n                        seriesIndex: d.seriesIndex\n                    });\n                });\n\n            path.exit().remove();\n            path.style('fill', function(d,i){\n                    return d.color || color(d, d.seriesIndex)\n                })\n                .style('stroke', function(d,i){ return d.color || color(d, d.seriesIndex) });\n            path.watchTransition(renderWatch,'stackedArea path')\n                .attr('d', function(d,i) {\n                    return area(d.values,i)\n                });\n\n            //============================================================\n            // Event Handling/Dispatching (in chart's scope)\n            //------------------------------------------------------------\n\n            scatter.dispatch.on('elementMouseover.area', function(e) {\n                g.select('.nv-chart-' + id + ' .nv-area-' + e.seriesIndex).classed('hover', true);\n            });\n            scatter.dispatch.on('elementMouseout.area', function(e) {\n                g.select('.nv-chart-' + id + ' .nv-area-' + e.seriesIndex).classed('hover', false);\n            });\n\n            //Special offset functions\n            chart.d3_stackedOffset_stackPercent = function(stackData) {\n                var n = stackData.length,    //How many series\n                    m = stackData[0].length,     //how many points per series\n                    i,\n                    j,\n                    o,\n                    y0 = [];\n\n                for (j = 0; j < m; ++j) { //Looping through all points\n                    for (i = 0, o = 0; i < dataRaw.length; i++) { //looping through all series\n                        o += getY(dataRaw[i].values[j]); //total y value of all series at a certian point in time.\n                    }\n\n                    if (o) for (i = 0; i < n; i++) { //(total y value of all series at point in time i) != 0\n                        stackData[i][j][1] /= o;\n                    } else { //(total y value of all series at point in time i) == 0\n                        for (i = 0; i < n; i++) {\n                            stackData[i][j][1] = 0;\n                        }\n                    }\n                }\n                for (j = 0; j < m; ++j) y0[j] = 0;\n                return y0;\n            };\n\n        });\n\n        renderWatch.renderEnd('stackedArea immediate');\n        return chart;\n    }\n\n    //============================================================\n    // Global getters and setters\n    //------------------------------------------------------------\n\n    chart.dispatch = dispatch;\n    chart.scatter = scatter;\n\n    scatter.dispatch.on('elementClick', function(){ dispatch.elementClick.apply(this, arguments); });\n    scatter.dispatch.on('elementMouseover', function(){ dispatch.elementMouseover.apply(this, arguments); });\n    scatter.dispatch.on('elementMouseout', function(){ dispatch.elementMouseout.apply(this, arguments); });\n\n    chart.interpolate = function(_) {\n        if (!arguments.length) return interpolate;\n        interpolate = _;\n        return chart;\n    };\n\n    chart.duration = function(_) {\n        if (!arguments.length) return duration;\n        duration = _;\n        renderWatch.reset(duration);\n        scatter.duration(duration);\n        return chart;\n    };\n\n    chart.dispatch = dispatch;\n    chart.scatter = scatter;\n    chart.options = nv.utils.optionsFunc.bind(chart);\n\n    chart._options = Object.create({}, {\n        // simple options, just get/set the necessary values\n        width:      {get: function(){return width;}, set: function(_){width=_;}},\n        height:     {get: function(){return height;}, set: function(_){height=_;}},\n        clipEdge: {get: function(){return clipEdge;}, set: function(_){clipEdge=_;}},\n        offset:      {get: function(){return offset;}, set: function(_){offset=_;}},\n        order:    {get: function(){return order;}, set: function(_){order=_;}},\n        interpolate:    {get: function(){return interpolate;}, set: function(_){interpolate=_;}},\n\n        // simple functor options\n        x:     {get: function(){return getX;}, set: function(_){getX = d3.functor(_);}},\n        y:     {get: function(){return getY;}, set: function(_){getY = d3.functor(_);}},\n\n        // options that require extra logic in the setter\n        margin: {get: function(){return margin;}, set: function(_){\n            margin.top    = _.top    !== undefined ? _.top    : margin.top;\n            margin.right  = _.right  !== undefined ? _.right  : margin.right;\n            margin.bottom = _.bottom !== undefined ? _.bottom : margin.bottom;\n            margin.left   = _.left   !== undefined ? _.left   : margin.left;\n        }},\n        color:  {get: function(){return color;}, set: function(_){\n            color = nv.utils.getColor(_);\n        }},\n        style: {get: function(){return style;}, set: function(_){\n            style = _;\n            switch (style) {\n                case 'stack':\n                    chart.offset('zero');\n                    chart.order('default');\n                    break;\n                case 'stream':\n                    chart.offset('wiggle');\n                    chart.order('inside-out');\n                    break;\n                case 'stream-center':\n                    chart.offset('silhouette');\n                    chart.order('inside-out');\n                    break;\n                case 'expand':\n                    chart.offset('expand');\n                    chart.order('default');\n                    break;\n                case 'stack_percent':\n                    chart.offset(chart.d3_stackedOffset_stackPercent);\n                    chart.order('default');\n                    break;\n            }\n        }},\n        duration: {get: function(){return duration;}, set: function(_){\n            duration = _;\n            renderWatch.reset(duration);\n            scatter.duration(duration);\n        }}\n    });\n\n    nv.utils.inheritOptions(chart, scatter);\n    nv.utils.initOptions(chart);\n\n    return chart;\n};\n\nnv.models.stackedAreaChart = function() {\n    \"use strict\";\n\n    //============================================================\n    // Public Variables with Default Settings\n    //------------------------------------------------------------\n\n    var stacked = nv.models.stackedArea()\n        , xAxis = nv.models.axis()\n        , yAxis = nv.models.axis()\n        , legend = nv.models.legend()\n        , controls = nv.models.legend()\n        , interactiveLayer = nv.interactiveGuideline()\n        , tooltip = nv.models.tooltip()\n        ;\n\n    var margin = {top: 30, right: 25, bottom: 50, left: 60}\n        , width = null\n        , height = null\n        , color = nv.utils.defaultColor()\n        , showControls = true\n        , showLegend = true\n        , showXAxis = true\n        , showYAxis = true\n        , rightAlignYAxis = false\n        , useInteractiveGuideline = false\n        , x //can be accessed via chart.xScale()\n        , y //can be accessed via chart.yScale()\n        , state = nv.utils.state()\n        , defaultState = null\n        , noData = null\n        , dispatch = d3.dispatch('stateChange', 'changeState','renderEnd')\n        , controlWidth = 250\n        , controlOptions = ['Stacked','Stream','Expanded']\n        , controlLabels = {}\n        , duration = 250\n        ;\n\n    state.style = stacked.style();\n    xAxis.orient('bottom').tickPadding(7);\n    yAxis.orient((rightAlignYAxis) ? 'right' : 'left');\n\n    tooltip\n        .headerFormatter(function(d, i) {\n            return xAxis.tickFormat()(d, i);\n        })\n        .valueFormatter(function(d, i) {\n            return yAxis.tickFormat()(d, i);\n        });\n\n    interactiveLayer.tooltip\n        .headerFormatter(function(d, i) {\n            return xAxis.tickFormat()(d, i);\n        })\n        .valueFormatter(function(d, i) {\n            return yAxis.tickFormat()(d, i);\n        });\n\n    var oldYTickFormat = null,\n        oldValueFormatter = null;\n\n    controls.updateState(false);\n\n    //============================================================\n    // Private Variables\n    //------------------------------------------------------------\n\n    var renderWatch = nv.utils.renderWatch(dispatch);\n    var style = stacked.style();\n\n    var stateGetter = function(data) {\n        return function(){\n            return {\n                active: data.map(function(d) { return !d.disabled }),\n                style: stacked.style()\n            };\n        }\n    };\n\n    var stateSetter = function(data) {\n        return function(state) {\n            if (state.style !== undefined)\n                style = state.style;\n            if (state.active !== undefined)\n                data.forEach(function(series,i) {\n                    series.disabled = !state.active[i];\n                });\n        }\n    };\n\n    var percentFormatter = d3.format('%');\n\n    function chart(selection) {\n        renderWatch.reset();\n        renderWatch.models(stacked);\n        if (showXAxis) renderWatch.models(xAxis);\n        if (showYAxis) renderWatch.models(yAxis);\n\n        selection.each(function(data) {\n            var container = d3.select(this),\n                that = this;\n            nv.utils.initSVG(container);\n\n            var availableWidth = nv.utils.availableWidth(width, container, margin),\n                availableHeight = nv.utils.availableHeight(height, container, margin);\n\n            chart.update = function() { container.transition().duration(duration).call(chart); };\n            chart.container = this;\n\n            state\n                .setter(stateSetter(data), chart.update)\n                .getter(stateGetter(data))\n                .update();\n\n            // DEPRECATED set state.disabled\n            state.disabled = data.map(function(d) { return !!d.disabled });\n\n            if (!defaultState) {\n                var key;\n                defaultState = {};\n                for (key in state) {\n                    if (state[key] instanceof Array)\n                        defaultState[key] = state[key].slice(0);\n                    else\n                        defaultState[key] = state[key];\n                }\n            }\n\n            // Display No Data message if there's nothing to show.\n            if (!data || !data.length || !data.filter(function(d) { return d.values.length }).length) {\n                nv.utils.noData(chart, container)\n                return chart;\n            } else {\n                container.selectAll('.nv-noData').remove();\n            }\n\n            // Setup Scales\n            x = stacked.xScale();\n            y = stacked.yScale();\n\n            // Setup containers and skeleton of chart\n            var wrap = container.selectAll('g.nv-wrap.nv-stackedAreaChart').data([data]);\n            var gEnter = wrap.enter().append('g').attr('class', 'nvd3 nv-wrap nv-stackedAreaChart').append('g');\n            var g = wrap.select('g');\n\n            gEnter.append(\"rect\").style(\"opacity\",0);\n            gEnter.append('g').attr('class', 'nv-x nv-axis');\n            gEnter.append('g').attr('class', 'nv-y nv-axis');\n            gEnter.append('g').attr('class', 'nv-stackedWrap');\n            gEnter.append('g').attr('class', 'nv-legendWrap');\n            gEnter.append('g').attr('class', 'nv-controlsWrap');\n            gEnter.append('g').attr('class', 'nv-interactive');\n\n            g.select(\"rect\").attr(\"width\",availableWidth).attr(\"height\",availableHeight);\n\n            // Legend\n            if (showLegend) {\n                var legendWidth = (showControls) ? availableWidth - controlWidth : availableWidth;\n\n                legend.width(legendWidth);\n                g.select('.nv-legendWrap').datum(data).call(legend);\n\n                if ( margin.top != legend.height()) {\n                    margin.top = legend.height();\n                    availableHeight = nv.utils.availableHeight(height, container, margin);\n                }\n\n                g.select('.nv-legendWrap')\n                    .attr('transform', 'translate(' + (availableWidth-legendWidth) + ',' + (-margin.top) +')');\n            }\n\n            // Controls\n            if (showControls) {\n                var controlsData = [\n                    {\n                        key: controlLabels.stacked || 'Stacked',\n                        metaKey: 'Stacked',\n                        disabled: stacked.style() != 'stack',\n                        style: 'stack'\n                    },\n                    {\n                        key: controlLabels.stream || 'Stream',\n                        metaKey: 'Stream',\n                        disabled: stacked.style() != 'stream',\n                        style: 'stream'\n                    },\n                    {\n                        key: controlLabels.expanded || 'Expanded',\n                        metaKey: 'Expanded',\n                        disabled: stacked.style() != 'expand',\n                        style: 'expand'\n                    },\n                    {\n                        key: controlLabels.stack_percent || 'Stack %',\n                        metaKey: 'Stack_Percent',\n                        disabled: stacked.style() != 'stack_percent',\n                        style: 'stack_percent'\n                    }\n                ];\n\n                controlWidth = (controlOptions.length/3) * 260;\n                controlsData = controlsData.filter(function(d) {\n                    return controlOptions.indexOf(d.metaKey) !== -1;\n                });\n\n                controls\n                    .width( controlWidth )\n                    .color(['#444', '#444', '#444']);\n\n                g.select('.nv-controlsWrap')\n                    .datum(controlsData)\n                    .call(controls);\n\n                if ( margin.top != Math.max(controls.height(), legend.height()) ) {\n                    margin.top = Math.max(controls.height(), legend.height());\n                    availableHeight = nv.utils.availableHeight(height, container, margin);\n                }\n\n                g.select('.nv-controlsWrap')\n                    .attr('transform', 'translate(0,' + (-margin.top) +')');\n            }\n\n            wrap.attr('transform', 'translate(' + margin.left + ',' + margin.top + ')');\n\n            if (rightAlignYAxis) {\n                g.select(\".nv-y.nv-axis\")\n                    .attr(\"transform\", \"translate(\" + availableWidth + \",0)\");\n            }\n\n            //Set up interactive layer\n            if (useInteractiveGuideline) {\n                interactiveLayer\n                    .width(availableWidth)\n                    .height(availableHeight)\n                    .margin({left: margin.left, top: margin.top})\n                    .svgContainer(container)\n                    .xScale(x);\n                wrap.select(\".nv-interactive\").call(interactiveLayer);\n            }\n\n            stacked\n                .width(availableWidth)\n                .height(availableHeight);\n\n            var stackedWrap = g.select('.nv-stackedWrap')\n                .datum(data);\n\n            stackedWrap.transition().call(stacked);\n\n            // Setup Axes\n            if (showXAxis) {\n                xAxis.scale(x)\n                    ._ticks( nv.utils.calcTicksX(availableWidth/100, data) )\n                    .tickSize( -availableHeight, 0);\n\n                g.select('.nv-x.nv-axis')\n                    .attr('transform', 'translate(0,' + availableHeight + ')');\n\n                g.select('.nv-x.nv-axis')\n                    .transition().duration(0)\n                    .call(xAxis);\n            }\n\n            if (showYAxis) {\n                var ticks;\n                if (stacked.offset() === 'wiggle') {\n                    ticks = 0;\n                }\n                else {\n                    ticks = nv.utils.calcTicksY(availableHeight/36, data);\n                }\n                yAxis.scale(y)\n                    ._ticks(ticks)\n                    .tickSize(-availableWidth, 0);\n\n                    if (stacked.style() === 'expand' || stacked.style() === 'stack_percent') {\n                        var currentFormat = yAxis.tickFormat();\n\n                        if ( !oldYTickFormat || currentFormat !== percentFormatter )\n                            oldYTickFormat = currentFormat;\n\n                        //Forces the yAxis to use percentage in 'expand' mode.\n                        yAxis.tickFormat(percentFormatter);\n                    }\n                    else {\n                        if (oldYTickFormat) {\n                            yAxis.tickFormat(oldYTickFormat);\n                            oldYTickFormat = null;\n                        }\n                    }\n\n                g.select('.nv-y.nv-axis')\n                    .transition().duration(0)\n                    .call(yAxis);\n            }\n\n            //============================================================\n            // Event Handling/Dispatching (in chart's scope)\n            //------------------------------------------------------------\n\n            stacked.dispatch.on('areaClick.toggle', function(e) {\n                if (data.filter(function(d) { return !d.disabled }).length === 1)\n                    data.forEach(function(d) {\n                        d.disabled = false;\n                    });\n                else\n                    data.forEach(function(d,i) {\n                        d.disabled = (i != e.seriesIndex);\n                    });\n\n                state.disabled = data.map(function(d) { return !!d.disabled });\n                dispatch.stateChange(state);\n\n                chart.update();\n            });\n\n            legend.dispatch.on('stateChange', function(newState) {\n                for (var key in newState)\n                    state[key] = newState[key];\n                dispatch.stateChange(state);\n                chart.update();\n            });\n\n            controls.dispatch.on('legendClick', function(d,i) {\n                if (!d.disabled) return;\n\n                controlsData = controlsData.map(function(s) {\n                    s.disabled = true;\n                    return s;\n                });\n                d.disabled = false;\n\n                stacked.style(d.style);\n\n\n                state.style = stacked.style();\n                dispatch.stateChange(state);\n\n                chart.update();\n            });\n\n            interactiveLayer.dispatch.on('elementMousemove', function(e) {\n                stacked.clearHighlights();\n                var singlePoint, pointIndex, pointXLocation, allData = [];\n                data\n                    .filter(function(series, i) {\n                        series.seriesIndex = i;\n                        return !series.disabled;\n                    })\n                    .forEach(function(series,i) {\n                        pointIndex = nv.interactiveBisect(series.values, e.pointXValue, chart.x());\n                        var point = series.values[pointIndex];\n                        var pointYValue = chart.y()(point, pointIndex);\n                        if (pointYValue != null) {\n                            stacked.highlightPoint(i, pointIndex, true);\n                        }\n                        if (typeof point === 'undefined') return;\n                        if (typeof singlePoint === 'undefined') singlePoint = point;\n                        if (typeof pointXLocation === 'undefined') pointXLocation = chart.xScale()(chart.x()(point,pointIndex));\n\n                        //If we are in 'expand' mode, use the stacked percent value instead of raw value.\n                        var tooltipValue = (stacked.style() == 'expand') ? point.display.y : chart.y()(point,pointIndex);\n                        allData.push({\n                            key: series.key,\n                            value: tooltipValue,\n                            color: color(series,series.seriesIndex),\n                            stackedValue: point.display\n                        });\n                    });\n\n                allData.reverse();\n\n                //Highlight the tooltip entry based on which stack the mouse is closest to.\n                if (allData.length > 2) {\n                    var yValue = chart.yScale().invert(e.mouseY);\n                    var yDistMax = Infinity, indexToHighlight = null;\n                    allData.forEach(function(series,i) {\n\n                        //To handle situation where the stacked area chart is negative, we need to use absolute values\n                        //when checking if the mouse Y value is within the stack area.\n                        yValue = Math.abs(yValue);\n                        var stackedY0 = Math.abs(series.stackedValue.y0);\n                        var stackedY = Math.abs(series.stackedValue.y);\n                        if ( yValue >= stackedY0 && yValue <= (stackedY + stackedY0))\n                        {\n                            indexToHighlight = i;\n                            return;\n                        }\n                    });\n                    if (indexToHighlight != null)\n                        allData[indexToHighlight].highlight = true;\n                }\n\n                var xValue = xAxis.tickFormat()(chart.x()(singlePoint,pointIndex));\n\n                var valueFormatter = interactiveLayer.tooltip.valueFormatter();\n                // Keeps track of the tooltip valueFormatter if the chart changes to expanded view\n                if (stacked.style() === 'expand' || stacked.style() === 'stack_percent') {\n                    if ( !oldValueFormatter ) {\n                        oldValueFormatter = valueFormatter;\n                    }\n                    //Forces the tooltip to use percentage in 'expand' mode.\n                    valueFormatter = d3.format(\".1%\");\n                }\n                else {\n                    if (oldValueFormatter) {\n                        valueFormatter = oldValueFormatter;\n                        oldValueFormatter = null;\n                    }\n                }\n\n                interactiveLayer.tooltip\n                    .position({left: pointXLocation + margin.left, top: e.mouseY + margin.top})\n                    .chartContainer(that.parentNode)\n                    .valueFormatter(valueFormatter)\n                    .data(\n                    {\n                        value: xValue,\n                        series: allData\n                    }\n                )();\n\n                interactiveLayer.renderGuideLine(pointXLocation);\n\n            });\n\n            interactiveLayer.dispatch.on(\"elementMouseout\",function(e) {\n                stacked.clearHighlights();\n            });\n\n            // Update chart from a state object passed to event handler\n            dispatch.on('changeState', function(e) {\n\n                if (typeof e.disabled !== 'undefined' && data.length === e.disabled.length) {\n                    data.forEach(function(series,i) {\n                        series.disabled = e.disabled[i];\n                    });\n\n                    state.disabled = e.disabled;\n                }\n\n                if (typeof e.style !== 'undefined') {\n                    stacked.style(e.style);\n                    style = e.style;\n                }\n\n                chart.update();\n            });\n\n        });\n\n        renderWatch.renderEnd('stacked Area chart immediate');\n        return chart;\n    }\n\n    //============================================================\n    // Event Handling/Dispatching (out of chart's scope)\n    //------------------------------------------------------------\n\n    stacked.dispatch.on('elementMouseover.tooltip', function(evt) {\n        evt.point['x'] = stacked.x()(evt.point);\n        evt.point['y'] = stacked.y()(evt.point);\n        tooltip.data(evt).position(evt.pos).hidden(false);\n    });\n\n    stacked.dispatch.on('elementMouseout.tooltip', function(evt) {\n        tooltip.hidden(true)\n    });\n\n    //============================================================\n    // Expose Public Variables\n    //------------------------------------------------------------\n\n    // expose chart's sub-components\n    chart.dispatch = dispatch;\n    chart.stacked = stacked;\n    chart.legend = legend;\n    chart.controls = controls;\n    chart.xAxis = xAxis;\n    chart.yAxis = yAxis;\n    chart.interactiveLayer = interactiveLayer;\n    chart.tooltip = tooltip;\n\n    chart.dispatch = dispatch;\n    chart.options = nv.utils.optionsFunc.bind(chart);\n\n    chart._options = Object.create({}, {\n        // simple options, just get/set the necessary values\n        width:      {get: function(){return width;}, set: function(_){width=_;}},\n        height:     {get: function(){return height;}, set: function(_){height=_;}},\n        showLegend: {get: function(){return showLegend;}, set: function(_){showLegend=_;}},\n        showXAxis:      {get: function(){return showXAxis;}, set: function(_){showXAxis=_;}},\n        showYAxis:    {get: function(){return showYAxis;}, set: function(_){showYAxis=_;}},\n        defaultState:    {get: function(){return defaultState;}, set: function(_){defaultState=_;}},\n        noData:    {get: function(){return noData;}, set: function(_){noData=_;}},\n        showControls:    {get: function(){return showControls;}, set: function(_){showControls=_;}},\n        controlLabels:    {get: function(){return controlLabels;}, set: function(_){controlLabels=_;}},\n        controlOptions:    {get: function(){return controlOptions;}, set: function(_){controlOptions=_;}},\n\n        // deprecated options\n        tooltips:    {get: function(){return tooltip.enabled();}, set: function(_){\n            // deprecated after 1.7.1\n            nv.deprecated('tooltips', 'use chart.tooltip.enabled() instead');\n            tooltip.enabled(!!_);\n        }},\n        tooltipContent:    {get: function(){return tooltip.contentGenerator();}, set: function(_){\n            // deprecated after 1.7.1\n            nv.deprecated('tooltipContent', 'use chart.tooltip.contentGenerator() instead');\n            tooltip.contentGenerator(_);\n        }},\n\n        // options that require extra logic in the setter\n        margin: {get: function(){return margin;}, set: function(_){\n            margin.top    = _.top    !== undefined ? _.top    : margin.top;\n            margin.right  = _.right  !== undefined ? _.right  : margin.right;\n            margin.bottom = _.bottom !== undefined ? _.bottom : margin.bottom;\n            margin.left   = _.left   !== undefined ? _.left   : margin.left;\n        }},\n        duration: {get: function(){return duration;}, set: function(_){\n            duration = _;\n            renderWatch.reset(duration);\n            stacked.duration(duration);\n            xAxis.duration(duration);\n            yAxis.duration(duration);\n        }},\n        color:  {get: function(){return color;}, set: function(_){\n            color = nv.utils.getColor(_);\n            legend.color(color);\n            stacked.color(color);\n        }},\n        rightAlignYAxis: {get: function(){return rightAlignYAxis;}, set: function(_){\n            rightAlignYAxis = _;\n            yAxis.orient( rightAlignYAxis ? 'right' : 'left');\n        }},\n        useInteractiveGuideline: {get: function(){return useInteractiveGuideline;}, set: function(_){\n            useInteractiveGuideline = !!_;\n            chart.interactive(!_);\n            chart.useVoronoi(!_);\n            stacked.scatter.interactive(!_);\n        }}\n    });\n\n    nv.utils.inheritOptions(chart, stacked);\n    nv.utils.initOptions(chart);\n\n    return chart;\n};\n// based on http://bl.ocks.org/kerryrodden/477c1bfb081b783f80ad\nnv.models.sunburst = function() {\n    \"use strict\";\n\n    //============================================================\n    // Public Variables with Default Settings\n    //------------------------------------------------------------\n\n    var margin = {top: 0, right: 0, bottom: 0, left: 0}\n        , width = null\n        , height = null\n        , mode = \"count\"\n        , modes = {count: function(d) { return 1; }, size: function(d) { return d.size }}\n        , id = Math.floor(Math.random() * 10000) //Create semi-unique ID in case user doesn't select one\n        , container = null\n        , color = nv.utils.defaultColor()\n        , duration = 500\n        , dispatch = d3.dispatch('chartClick', 'elementClick', 'elementDblClick', 'elementMousemove', 'elementMouseover', 'elementMouseout', 'renderEnd')\n        ;\n\n    var x = d3.scale.linear().range([0, 2 * Math.PI]);\n    var y = d3.scale.sqrt();\n\n    var partition = d3.layout.partition()\n        .sort(null)\n        .value(function(d) { return 1; });\n\n    var arc = d3.svg.arc()\n        .startAngle(function(d) { return Math.max(0, Math.min(2 * Math.PI, x(d.x))); })\n        .endAngle(function(d) { return Math.max(0, Math.min(2 * Math.PI, x(d.x + d.dx))); })\n        .innerRadius(function(d) { return Math.max(0, y(d.y)); })\n        .outerRadius(function(d) { return Math.max(0, y(d.y + d.dy)); });\n\n    // Keep track of the current and previous node being displayed as the root.\n    var node, prevNode;\n    // Keep track of the root node\n    var rootNode;\n\n    //============================================================\n    // chart function\n    //------------------------------------------------------------\n\n    var renderWatch = nv.utils.renderWatch(dispatch);\n\n    function chart(selection) {\n        renderWatch.reset();\n        selection.each(function(data) {\n            container = d3.select(this);\n            var availableWidth = nv.utils.availableWidth(width, container, margin);\n            var availableHeight = nv.utils.availableHeight(height, container, margin);\n            var radius = Math.min(availableWidth, availableHeight) / 2;\n            var path;\n\n            nv.utils.initSVG(container);\n\n            // Setup containers and skeleton of chart\n            var wrap = container.selectAll('.nv-wrap.nv-sunburst').data(data);\n            var wrapEnter = wrap.enter().append('g').attr('class', 'nvd3 nv-wrap nv-sunburst nv-chart-' + id);\n\n            var g = wrapEnter.selectAll('nv-sunburst');\n\n            wrap.attr('transform', 'translate(' + availableWidth / 2 + ',' + availableHeight / 2 + ')');\n\n            container.on('click', function (d, i) {\n                dispatch.chartClick({\n                    data: d,\n                    index: i,\n                    pos: d3.event,\n                    id: id\n                });\n            });\n\n            y.range([0, radius]);\n\n            node = node || data;\n            rootNode = data[0];\n            partition.value(modes[mode] || modes[\"count\"]);\n            path = g.data(partition.nodes).enter()\n                .append(\"path\")\n                .attr(\"d\", arc)\n                .style(\"fill\", function (d) {\n                    return color((d.children ? d : d.parent).name);\n                })\n                .style(\"stroke\", \"#FFF\")\n                .on(\"click\", function(d) {\n                    if (prevNode !== node && node !== d) prevNode = node;\n                    node = d;\n                    path.transition()\n                        .duration(duration)\n                        .attrTween(\"d\", arcTweenZoom(d));\n                })\n                .each(stash)\n                .on(\"dblclick\", function(d) {\n                    if (prevNode.parent == d) {\n                        path.transition()\n                            .duration(duration)\n                            .attrTween(\"d\", arcTweenZoom(rootNode));\n                    }\n                })\n                .each(stash)\n                .on('mouseover', function(d,i){\n                    d3.select(this).classed('hover', true).style('opacity', 0.8);\n                    dispatch.elementMouseover({\n                        data: d,\n                        color: d3.select(this).style(\"fill\")\n                    });\n                })\n                .on('mouseout', function(d,i){\n                    d3.select(this).classed('hover', false).style('opacity', 1);\n                    dispatch.elementMouseout({\n                        data: d\n                    });\n                })\n                .on('mousemove', function(d,i){\n                    dispatch.elementMousemove({\n                        data: d\n                    });\n                });\n\n\n\n            // Setup for switching data: stash the old values for transition.\n            function stash(d) {\n                d.x0 = d.x;\n                d.dx0 = d.dx;\n            }\n\n            // When switching data: interpolate the arcs in data space.\n            function arcTweenData(a, i) {\n                var oi = d3.interpolate({x: a.x0, dx: a.dx0}, a);\n\n                function tween(t) {\n                    var b = oi(t);\n                    a.x0 = b.x;\n                    a.dx0 = b.dx;\n                    return arc(b);\n                }\n\n                if (i == 0) {\n                    // If we are on the first arc, adjust the x domain to match the root node\n                    // at the current zoom level. (We only need to do this once.)\n                    var xd = d3.interpolate(x.domain(), [node.x, node.x + node.dx]);\n                    return function (t) {\n                        x.domain(xd(t));\n                        return tween(t);\n                    };\n                } else {\n                    return tween;\n                }\n            }\n\n            // When zooming: interpolate the scales.\n            function arcTweenZoom(d) {\n                var xd = d3.interpolate(x.domain(), [d.x, d.x + d.dx]),\n                    yd = d3.interpolate(y.domain(), [d.y, 1]),\n                    yr = d3.interpolate(y.range(), [d.y ? 20 : 0, radius]);\n                return function (d, i) {\n                    return i\n                        ? function (t) {\n                        return arc(d);\n                    }\n                        : function (t) {\n                        x.domain(xd(t));\n                        y.domain(yd(t)).range(yr(t));\n                        return arc(d);\n                    };\n                };\n            }\n\n        });\n\n        renderWatch.renderEnd('sunburst immediate');\n        return chart;\n    }\n\n    //============================================================\n    // Expose Public Variables\n    //------------------------------------------------------------\n\n    chart.dispatch = dispatch;\n    chart.options = nv.utils.optionsFunc.bind(chart);\n\n    chart._options = Object.create({}, {\n        // simple options, just get/set the necessary values\n        width:      {get: function(){return width;}, set: function(_){width=_;}},\n        height:     {get: function(){return height;}, set: function(_){height=_;}},\n        mode:       {get: function(){return mode;}, set: function(_){mode=_;}},\n        id:         {get: function(){return id;}, set: function(_){id=_;}},\n        duration:   {get: function(){return duration;}, set: function(_){duration=_;}},\n\n        // options that require extra logic in the setter\n        margin: {get: function(){return margin;}, set: function(_){\n            margin.top    = _.top    != undefined ? _.top    : margin.top;\n            margin.right  = _.right  != undefined ? _.right  : margin.right;\n            margin.bottom = _.bottom != undefined ? _.bottom : margin.bottom;\n            margin.left   = _.left   != undefined ? _.left   : margin.left;\n        }},\n        color: {get: function(){return color;}, set: function(_){\n            color=nv.utils.getColor(_);\n        }}\n    });\n\n    nv.utils.initOptions(chart);\n    return chart;\n};\nnv.models.sunburstChart = function() {\n    \"use strict\";\n\n    //============================================================\n    // Public Variables with Default Settings\n    //------------------------------------------------------------\n\n    var sunburst = nv.models.sunburst();\n    var tooltip = nv.models.tooltip();\n\n    var margin = {top: 30, right: 20, bottom: 20, left: 20}\n        , width = null\n        , height = null\n        , color = nv.utils.defaultColor()\n        , id = Math.round(Math.random() * 100000)\n        , defaultState = null\n        , noData = null\n        , duration = 250\n        , dispatch = d3.dispatch('tooltipShow', 'tooltipHide', 'stateChange', 'changeState','renderEnd')\n        ;\n\n    //============================================================\n    // Private Variables\n    //------------------------------------------------------------\n\n    var renderWatch = nv.utils.renderWatch(dispatch);\n    tooltip.headerEnabled(false).duration(0).valueFormatter(function(d, i) {\n        return d;\n    });\n\n    //============================================================\n    // Chart function\n    //------------------------------------------------------------\n\n    function chart(selection) {\n        renderWatch.reset();\n        renderWatch.models(sunburst);\n\n        selection.each(function(data) {\n            var container = d3.select(this);\n            nv.utils.initSVG(container);\n\n            var that = this;\n            var availableWidth = nv.utils.availableWidth(width, container, margin),\n                availableHeight = nv.utils.availableHeight(height, container, margin);\n\n            chart.update = function() {\n                if (duration === 0)\n                    container.call(chart);\n                else\n                    container.transition().duration(duration).call(chart)\n            };\n            chart.container = this;\n\n            // Display No Data message if there's nothing to show.\n            if (!data || !data.length) {\n                nv.utils.noData(chart, container);\n                return chart;\n            } else {\n                container.selectAll('.nv-noData').remove();\n            }\n\n            // Setup containers and skeleton of chart\n            var wrap = container.selectAll('g.nv-wrap.nv-sunburstChart').data(data);\n            var gEnter = wrap.enter().append('g').attr('class', 'nvd3 nv-wrap nv-sunburstChart').append('g');\n            var g = wrap.select('g');\n\n            gEnter.append('g').attr('class', 'nv-sunburstWrap');\n\n            wrap.attr('transform', 'translate(' + margin.left + ',' + margin.top + ')');\n\n            // Main Chart Component(s)\n            sunburst.width(availableWidth).height(availableHeight);\n            var sunWrap = g.select('.nv-sunburstWrap').datum(data);\n            d3.transition(sunWrap).call(sunburst);\n\n        });\n\n        renderWatch.renderEnd('sunburstChart immediate');\n        return chart;\n    }\n\n    //============================================================\n    // Event Handling/Dispatching (out of chart's scope)\n    //------------------------------------------------------------\n\n    sunburst.dispatch.on('elementMouseover.tooltip', function(evt) {\n        evt['series'] = {\n            key: evt.data.name,\n            value: evt.data.size,\n            color: evt.color\n        };\n        tooltip.data(evt).hidden(false);\n    });\n\n    sunburst.dispatch.on('elementMouseout.tooltip', function(evt) {\n        tooltip.hidden(true);\n    });\n\n    sunburst.dispatch.on('elementMousemove.tooltip', function(evt) {\n        tooltip.position({top: d3.event.pageY, left: d3.event.pageX})();\n    });\n\n    //============================================================\n    // Expose Public Variables\n    //------------------------------------------------------------\n\n    // expose chart's sub-components\n    chart.dispatch = dispatch;\n    chart.sunburst = sunburst;\n    chart.tooltip = tooltip;\n    chart.options = nv.utils.optionsFunc.bind(chart);\n\n    // use Object get/set functionality to map between vars and chart functions\n    chart._options = Object.create({}, {\n        // simple options, just get/set the necessary values\n        noData:         {get: function(){return noData;},         set: function(_){noData=_;}},\n        defaultState:   {get: function(){return defaultState;},   set: function(_){defaultState=_;}},\n\n        // options that require extra logic in the setter\n        color: {get: function(){return color;}, set: function(_){\n            color = _;\n            sunburst.color(color);\n        }},\n        duration: {get: function(){return duration;}, set: function(_){\n            duration = _;\n            renderWatch.reset(duration);\n            sunburst.duration(duration);\n        }},\n        margin: {get: function(){return margin;}, set: function(_){\n            margin.top    = _.top    !== undefined ? _.top    : margin.top;\n            margin.right  = _.right  !== undefined ? _.right  : margin.right;\n            margin.bottom = _.bottom !== undefined ? _.bottom : margin.bottom;\n            margin.left   = _.left   !== undefined ? _.left   : margin.left;\n        }}\n    });\n    nv.utils.inheritOptions(chart, sunburst);\n    nv.utils.initOptions(chart);\n    return chart;\n};\n\nnv.version = \"1.8.1\";\n})();\n/**************************************************************************\n* AngularJS-nvD3, v1.0.7; MIT\n* http://krispo.github.io/angular-nvd3\n**************************************************************************/\n(function(){\n\n    'use strict';\n\n    angular.module('nvd3', [])\n\n        .directive('nvd3', ['nvd3Utils', function(nvd3Utils){\n            return {\n                restrict: 'AE',\n                scope: {\n                    data: '=',      //chart data, [required]\n                    options: '=',   //chart options, according to nvd3 core api, [required]\n                    api: '=?',      //directive global api, [optional]\n                    events: '=?',   //global events that directive would subscribe to, [optional]\n                    config: '=?',    //global directive configuration, [optional]\n                    onReady: '&?' //callback function that is called with internal scope when directive is created [optional]\n                },\n                link: function(scope, element, attrs){\n                    var defaultConfig = {\n                        extended: false,\n                        visible: true,\n                        disabled: false,\n                        refreshDataOnly: true,\n                        deepWatchOptions: true,\n                        deepWatchData: true,\n                        deepWatchDataDepth: 2, // 0 - by reference (cheap), 1 - by collection item (the middle), 2 - by value (expensive)\n                        debounce: 10, // default 10ms, time silence to prevent refresh while multiple options changes at a time\n                        debounceImmediate: true // immediate flag for debounce function\n                    };\n\n                    //flag indicates if directive and chart is ready\n                    scope.isReady = false;\n\n                    //basic directive configuration\n                    scope._config = angular.extend(defaultConfig, scope.config);\n\n                    //directive global api\n                    scope.api = {\n                        // Fully refresh directive\n                        refresh: function(){\n                            scope.api.updateWithOptions(scope.options);\n                            scope.isReady = true;\n                        },\n\n                        // Fully refresh directive with specified timeout\n                        refreshWithTimeout: function(t){\n                            setTimeout(function(){\n                                scope.api.refresh();\n                            }, t);\n                        },\n\n                        // Update chart layout (for example if container is resized)\n                        update: function() {\n                            if (scope.chart && scope.svg) {\n                                scope.svg.datum(scope.data).call(scope.chart);\n                                // scope.chart.update();\n                            } else {\n                                scope.api.refresh();\n                            }\n                        },\n\n                        // Update chart layout with specified timeout\n                        updateWithTimeout: function(t){\n                            setTimeout(function(){\n                                scope.api.update();\n                            }, t);\n                        },\n\n                        // Update chart with new options\n                        updateWithOptions: function(options){\n                            // Clearing\n                            scope.api.clearElement();\n\n                            // Exit if options are not yet bound\n                            if (angular.isDefined(options) === false) return;\n\n                            // Exit if chart is hidden\n                            if (!scope._config.visible) return;\n\n                            // Initialize chart with specific type\n                            scope.chart = nv.models[options.chart.type]();\n\n                            // Generate random chart ID\n                            scope.chart.id = Math.random().toString(36).substr(2, 15);\n\n                            angular.forEach(scope.chart, function(value, key){\n                                if (key[0] === '_');\n                                else if ([\n                                        'clearHighlights',\n                                        'highlightPoint',\n                                        'id',\n                                        'options',\n                                        'resizeHandler',\n                                        'state',\n                                        'open',\n                                        'close',\n                                        'tooltipContent'\n                                    ].indexOf(key) >= 0);\n\n                                else if (key === 'dispatch') {\n                                    if (options.chart[key] === undefined || options.chart[key] === null) {\n                                        if (scope._config.extended) options.chart[key] = {};\n                                    }\n                                    configureEvents(scope.chart[key], options.chart[key]);\n                                }\n\n                                else if ([\n                                        'bars',\n                                        'bars1',\n                                        'bars2',\n                                        'boxplot',\n                                        'bullet',\n                                        'controls',\n                                        'discretebar',\n                                        'distX',\n                                        'distY',\n                                        'interactiveLayer',\n                                        'legend',\n                                        'lines',\n                                        'lines1',\n                                        'lines2',\n                                        'multibar',\n                                        'pie',\n                                        'scatter',\n                                        'scatters1',\n                                        'scatters2',\n                                        'sparkline',\n                                        'stack1',\n                                        'stack2',\n                                        'sunburst',\n                                        'tooltip',\n                                        'x2Axis',\n                                        'xAxis',\n                                        'y1Axis',\n                                        'y2Axis',\n                                        'y3Axis',\n                                        'y4Axis',\n                                        'yAxis',\n                                        'yAxis1',\n                                        'yAxis2'\n                                    ].indexOf(key) >= 0 ||\n                                        // stacked is a component for stackedAreaChart, but a boolean for multiBarChart and multiBarHorizontalChart\n                                    (key === 'stacked' && options.chart.type === 'stackedAreaChart')) {\n                                    if (options.chart[key] === undefined || options.chart[key] === null) {\n                                        if (scope._config.extended) options.chart[key] = {};\n                                    }\n                                    configure(scope.chart[key], options.chart[key], options.chart.type);\n                                }\n\n                                //TODO: need to fix bug in nvd3\n                                else if ((key === 'focusHeight') && options.chart.type === 'lineChart');\n                                else if ((key === 'focusHeight') && options.chart.type === 'lineWithFocusChart');\n                                else if ((key === 'xTickFormat' || key === 'yTickFormat') && options.chart.type === 'lineWithFocusChart');\n                                else if ((key === 'tooltips') && options.chart.type === 'boxPlotChart');\n                                else if ((key === 'tooltipXContent' || key === 'tooltipYContent') && options.chart.type === 'scatterChart');\n                                else if ((key === 'x' || key === 'y') && options.chart.type === 'forceDirectedGraph');\n\n                                else if (options.chart[key] === undefined || options.chart[key] === null){\n                                    if (scope._config.extended) {\n                                        if (key==='barColor')\n                                            options.chart[key] = value()();\n                                        else\n                                            options.chart[key] = value();\n                                    }\n                                }\n\n                                else scope.chart[key](options.chart[key]);\n                            });\n\n                            // Update with data\n                            if (options.chart.type === 'sunburstChart') {\n                                scope.api.updateWithData(angular.copy(scope.data));\n                            } else {\n                                scope.api.updateWithData(scope.data);\n                            }\n\n                            // Configure wrappers\n                            if (options['title'] || scope._config.extended) configureWrapper('title');\n                            if (options['subtitle'] || scope._config.extended) configureWrapper('subtitle');\n                            if (options['caption'] || scope._config.extended) configureWrapper('caption');\n\n\n                            // Configure styles\n                            if (options['styles'] || scope._config.extended) configureStyles();\n\n                            nv.addGraph(function() {\n                                if (!scope.chart) return;\n\n                                // Remove resize handler. Due to async execution should be placed here, not in the clearElement\n                                if (scope.chart.resizeHandler) scope.chart.resizeHandler.clear();\n\n                                // Update the chart when window resizes\n                                scope.chart.resizeHandler = nv.utils.windowResize(function() {\n                                    scope.chart && scope.chart.update && scope.chart.update();\n                                });\n\n                                /// Zoom feature\n                                if (options.chart.zoom !== undefined && [\n                                        'scatterChart',\n                                        'lineChart',\n                                        'candlestickBarChart',\n                                        'cumulativeLineChart',\n                                        'historicalBarChart',\n                                        'ohlcBarChart',\n                                        'stackedAreaChart'\n                                    ].indexOf(options.chart.type) > -1) {\n                                    nvd3Utils.zoom(scope, options);\n                                }\n\n                                return scope.chart;\n                            }, options.chart['callback']);\n                        },\n\n                        // Update chart with new data\n                        updateWithData: function (data){\n                            if (data) {\n                                // remove whole svg element with old data\n                                d3.select(element[0]).select('svg').remove();\n\n                                var h, w;\n\n                                // Select the current element to add <svg> element and to render the chart in\n                                scope.svg = d3.select(element[0]).append('svg');\n                                if (h = scope.options.chart.height) {\n                                    if (!isNaN(+h)) h += 'px'; //check if height is number\n                                    scope.svg.attr('height', h).style({height: h});\n                                }\n                                if (w = scope.options.chart.width) {\n                                    if (!isNaN(+w)) w += 'px'; //check if width is number\n                                    scope.svg.attr('width', w).style({width: w});\n                                } else {\n                                    scope.svg.attr('width', '100%').style({width: '100%'});\n                                }\n\n                                scope.svg.datum(data).call(scope.chart);\n                            }\n                        },\n\n                        // Fully clear directive element\n                        clearElement: function (){\n                            element.find('.title').remove();\n                            element.find('.subtitle').remove();\n                            element.find('.caption').remove();\n                            element.empty();\n\n                            // remove tooltip if exists\n                            if (scope.chart && scope.chart.tooltip && scope.chart.tooltip.id) {\n                                d3.select('#' + scope.chart.tooltip.id()).remove();\n                            }\n\n                            // To be compatible with old nvd3 (v1.7.1)\n                            if (nv.graphs && scope.chart) {\n                                for (var i = nv.graphs.length - 1; i >= 0; i--) {\n                                    if (nv.graphs[i] && (nv.graphs[i].id === scope.chart.id)) {\n                                        nv.graphs.splice(i, 1);\n                                    }\n                                }\n                            }\n                            if (nv.tooltip && nv.tooltip.cleanup) {\n                                nv.tooltip.cleanup();\n                            }\n                            if (scope.chart && scope.chart.resizeHandler) scope.chart.resizeHandler.clear();\n                            scope.chart = null;\n                        },\n\n                        // Get full directive scope\n                        getScope: function(){ return scope; },\n\n                        // Get directive element\n                        getElement: function(){ return element; }\n                    };\n\n                    // Configure the chart model with the passed options\n                    function configure(chart, options, chartType){\n                        if (chart && options){\n                            angular.forEach(chart, function(value, key){\n                                if (key[0] === '_');\n                                else if (key === 'dispatch') {\n                                    if (options[key] === undefined || options[key] === null) {\n                                        if (scope._config.extended) options[key] = {};\n                                    }\n                                    configureEvents(value, options[key]);\n                                }\n                                else if (key === 'tooltip') {\n                                    if (options[key] === undefined || options[key] === null) {\n                                        if (scope._config.extended) options[key] = {};\n                                    }\n                                    configure(chart[key], options[key], chartType);\n                                }\n                                else if (key === 'contentGenerator') {\n                                    if (options[key]) chart[key](options[key]);\n                                }\n                                else if ([\n                                        'axis',\n                                        'clearHighlights',\n                                        'defined',\n                                        'highlightPoint',\n                                        'nvPointerEventsClass',\n                                        'options',\n                                        'rangeBand',\n                                        'rangeBands',\n                                        'scatter',\n                                        'open',\n                                        'close',\n                                        'node'\n                                    ].indexOf(key) === -1) {\n                                    if (options[key] === undefined || options[key] === null){\n                                        if (scope._config.extended) options[key] = value();\n                                    }\n                                    else chart[key](options[key]);\n                                }\n                            });\n                        }\n                    }\n\n                    // Subscribe to the chart events (contained in 'dispatch')\n                    // and pass eventHandler functions in the 'options' parameter\n                    function configureEvents(dispatch, options){\n                        if (dispatch && options){\n                            angular.forEach(dispatch, function(value, key){\n                                if (options[key] === undefined || options[key] === null){\n                                    if (scope._config.extended) options[key] = value.on;\n                                }\n                                else dispatch.on(key + '._', options[key]);\n                            });\n                        }\n                    }\n\n                    // Configure 'title', 'subtitle', 'caption'.\n                    // nvd3 has no sufficient models for it yet.\n                    function configureWrapper(name){\n                        var _ = nvd3Utils.deepExtend(defaultWrapper(name), scope.options[name] || {});\n\n                        if (scope._config.extended) scope.options[name] = _;\n\n                        var wrapElement = angular.element('<div></div>').html(_['html'] || '')\n                            .addClass(name).addClass(_.className)\n                            .removeAttr('style')\n                            .css(_.css);\n\n                        if (!_['html']) wrapElement.text(_.text);\n\n                        if (_.enable) {\n                            if (name === 'title') element.prepend(wrapElement);\n                            else if (name === 'subtitle') angular.element(element[0].querySelector('.title')).after(wrapElement);\n                            else if (name === 'caption') element.append(wrapElement);\n                        }\n                    }\n\n                    // Add some styles to the whole directive element\n                    function configureStyles(){\n                        var _ = nvd3Utils.deepExtend(defaultStyles(), scope.options['styles'] || {});\n\n                        if (scope._config.extended) scope.options['styles'] = _;\n\n                        angular.forEach(_.classes, function(value, key){\n                            value ? element.addClass(key) : element.removeClass(key);\n                        });\n\n                        element.removeAttr('style').css(_.css);\n                    }\n\n                    // Default values for 'title', 'subtitle', 'caption'\n                    function defaultWrapper(_){\n                        switch (_){\n                            case 'title': return {\n                                enable: false,\n                                text: 'Write Your Title',\n                                className: 'h4',\n                                css: {\n                                    width: scope.options.chart.width + 'px',\n                                    textAlign: 'center'\n                                }\n                            };\n                            case 'subtitle': return {\n                                enable: false,\n                                text: 'Write Your Subtitle',\n                                css: {\n                                    width: scope.options.chart.width + 'px',\n                                    textAlign: 'center'\n                                }\n                            };\n                            case 'caption': return {\n                                enable: false,\n                                text: 'Figure 1. Write Your Caption text.',\n                                css: {\n                                    width: scope.options.chart.width + 'px',\n                                    textAlign: 'center'\n                                }\n                            };\n                        }\n                    }\n\n                    // Default values for styles\n                    function defaultStyles(){\n                        return {\n                            classes: {\n                                'with-3d-shadow': true,\n                                'with-transitions': true,\n                                'gallery': false\n                            },\n                            css: {}\n                        };\n                    }\n\n                    /* Event Handling */\n                    // Watching on options changing\n                    if (scope._config.deepWatchOptions) {\n                        scope.$watch('options', nvd3Utils.debounce(function(newOptions){\n                            if (!scope._config.disabled) scope.api.refresh();\n                        }, scope._config.debounce, scope._config.debounceImmediate), true);\n                    }\n\n                    // Watching on data changing\n                    function dataWatchFn(newData, oldData) {\n                        if (newData !== oldData){\n                            if (!scope._config.disabled) {\n                                scope._config.refreshDataOnly ? scope.api.update() : scope.api.refresh(); // if wanted to refresh data only, use update method, otherwise use full refresh.\n                            }\n                        }\n                    }\n                    if (scope._config.deepWatchData) {\n                        if (scope._config.deepWatchDataDepth === 1) {\n                            scope.$watchCollection('data', dataWatchFn);\n                        } else {\n                            scope.$watch('data', dataWatchFn, scope._config.deepWatchDataDepth === 2);\n                        }\n                    }\n\n                    // Watching on config changing\n                    scope.$watch('config', function(newConfig, oldConfig){\n                        if (newConfig !== oldConfig){\n                            scope._config = angular.extend(defaultConfig, newConfig);\n                            scope.api.refresh();\n                        }\n                    }, true);\n\n                    // Refresh chart first time if deepWatchOptions and deepWatchData are false\n                    if (!scope._config.deepWatchOptions && !scope._config.deepWatchData) {\n                        scope.api.refresh();\n                    }\n\n                    //subscribe on global events\n                    angular.forEach(scope.events, function(eventHandler, event){\n                        scope.$on(event, function(e, args){\n                            return eventHandler(e, scope, args);\n                        });\n                    });\n\n                    // remove completely when directive is destroyed\n                    element.on('$destroy', function () {\n                        scope.api.clearElement();\n                    });\n\n                    // trigger onReady callback if directive is ready\n                    scope.$watch('isReady', function(isReady){\n                        if (isReady) {\n                            if (scope.onReady && typeof scope.onReady() === 'function') scope.onReady()(scope, element);\n                        }\n                    });\n                }\n            };\n        }])\n\n        .factory('nvd3Utils', function(){\n            return {\n                debounce: function(func, wait, immediate) {\n                    var timeout;\n                    return function() {\n                        var context = this, args = arguments;\n                        var later = function() {\n                            timeout = null;\n                            if (!immediate) func.apply(context, args);\n                        };\n                        var callNow = immediate && !timeout;\n                        clearTimeout(timeout);\n                        timeout = setTimeout(later, wait);\n                        if (callNow) func.apply(context, args);\n                    };\n                },\n                deepExtend: function(dst){\n                    var me = this;\n                    angular.forEach(arguments, function(obj) {\n                        if (obj !== dst) {\n                            angular.forEach(obj, function(value, key) {\n                                if (dst[key] && dst[key].constructor && dst[key].constructor === Object) {\n                                    me.deepExtend(dst[key], value);\n                                } else {\n                                    dst[key] = value;\n                                }\n                            });\n                        }\n                    });\n                    return dst;\n                },\n                zoom: function(scope, options) {\n                    var zoom = options.chart.zoom;\n\n                    // check if zoom enabled\n                    var enabled = (typeof zoom.enabled === 'undefined' || zoom.enabled === null) ? true : zoom.enabled;\n                    if (!enabled) return;\n\n                    var xScale = scope.chart.xAxis.scale()\n                        , yScale = scope.chart.yAxis.scale()\n                        , xDomain = scope.chart.xDomain || xScale.domain\n                        , yDomain = scope.chart.yDomain || yScale.domain\n                        , x_boundary = xScale.domain().slice()\n                        , y_boundary = yScale.domain().slice()\n\n                    // initialize zoom options\n                        , scale = zoom.scale || 1\n                        , translate = zoom.translate || [0, 0]\n                        , scaleExtent = zoom.scaleExtent || [1, 10]\n                        , useFixedDomain = zoom.useFixedDomain || false\n                        , useNiceScale = zoom.useNiceScale || false\n                        , horizontalOff = zoom.horizontalOff || false\n                        , verticalOff = zoom.verticalOff || false\n                        , unzoomEventType = zoom.unzoomEventType || 'dblclick.zoom'\n\n                    // auxiliary functions\n                        , fixDomain\n                        , d3zoom\n                        , zoomed\n                        , unzoomed\n                        , zoomend\n                        ;\n\n                    // ensure nice axis\n                    if (useNiceScale) {\n                        xScale.nice();\n                        yScale.nice();\n                    }\n\n                    // fix domain\n                    fixDomain = function (domain, boundary) {\n                        domain[0] = Math.min(Math.max(domain[0], boundary[0]), boundary[1] - boundary[1] / scaleExtent[1]);\n                        domain[1] = Math.max(boundary[0] + boundary[1] / scaleExtent[1], Math.min(domain[1], boundary[1]));\n                        return domain;\n                    };\n\n                    // zoom event handler\n                    zoomed = function () {\n                        if (zoom.zoomed !== undefined) {\n                            var domains = zoom.zoomed(xScale.domain(), yScale.domain());\n                            if (!horizontalOff) xDomain([domains.x1, domains.x2]);\n                            if (!verticalOff) yDomain([domains.y1, domains.y2]);\n                        } else {\n                            if (!horizontalOff) xDomain(useFixedDomain ? fixDomain(xScale.domain(), x_boundary) : xScale.domain());\n                            if (!verticalOff) yDomain(useFixedDomain ? fixDomain(yScale.domain(), y_boundary) : yScale.domain());\n                        }\n                        scope.chart.update();\n                    };\n\n                    // unzoomed event handler\n                    unzoomed = function () {\n                        if (zoom.unzoomed !== undefined) {\n                            var domains = zoom.unzoomed(xScale.domain(), yScale.domain());\n                            if (!horizontalOff) xDomain([domains.x1, domains.x2]);\n                            if (!verticalOff) yDomain([domains.y1, domains.y2]);\n                        } else {\n                            if (!horizontalOff) xDomain(x_boundary);\n                            if (!verticalOff) yDomain(y_boundary);\n                        }\n                        d3zoom.scale(scale).translate(translate);\n                        scope.chart.update();\n                    };\n\n                    // zoomend event handler\n                    zoomend = function () {\n                        if (zoom.zoomend !== undefined) {\n                            zoom.zoomend();\n                        }\n                    };\n\n                    // create d3 zoom handler\n                    d3zoom = d3.behavior.zoom()\n                        .x(xScale)\n                        .y(yScale)\n                        .scaleExtent(scaleExtent)\n                        .on('zoom', zoomed)\n                        .on('zoomend', zoomend);\n\n                    scope.svg.call(d3zoom);\n\n                    d3zoom.scale(scale).translate(translate).event(scope.svg);\n\n                    if (unzoomEventType !== 'none') scope.svg.on(unzoomEventType, unzoomed);\n                }\n            };\n        });\n})();\n\n/*!\nangular-xeditable - 0.1.12\nEdit-in-place for angular.js\nBuild date: 2016-04-14 \n*/\n/**\n * Angular-xeditable module \n *\n */\nangular.module('xeditable', [])\n\n\n/**\n * Default options. \n *\n * @namespace editable-options\n */\n//todo: maybe better have editableDefaults, not options...\n.value('editableOptions', {\n  /**\n   * Theme. Possible values `bs3`, `bs2`, `default`.\n   * \n   * @var {string} theme\n   * @memberOf editable-options\n   */  \n  theme: 'default',\n  /**\n   * Icon Set. Possible values `font-awesome`, `default`.\n   * \n   * @var {string} icon set\n   * @memberOf editable-options\n   */  \n  icon_set: 'default',\n  /**\n   * Whether to show buttons for single editalbe element.  \n   * Possible values `right` (default), `no`.\n   * \n   * @var {string} buttons\n   * @memberOf editable-options\n   */    \n  buttons: 'right',\n  /**\n   * Default value for `blur` attribute of single editable element.  \n   * Can be `cancel|submit|ignore`.\n   * \n   * @var {string} blurElem\n   * @memberOf editable-options\n   */\n  blurElem: 'cancel',\n  /**\n   * Default value for `blur` attribute of editable form.  \n   * Can be `cancel|submit|ignore`.\n   * \n   * @var {string} blurForm\n   * @memberOf editable-options\n   */\n  blurForm: 'ignore',\n  /**\n   * How input elements get activated. Possible values: `focus|select|none`.\n   *\n   * @var {string} activate\n   * @memberOf editable-options\n   */\n  activate: 'focus',\n  /**\n   * Whether to disable x-editable. Can be overloaded on each element.\n   *\n   * @var {boolean} isDisabled\n   * @memberOf editable-options\n   */\n   isDisabled: false,\n  \n  /**\n   * Event, on which the edit mode gets activated. \n   * Can be any event.\n   *\n   * @var {string} activationEvent\n   * @memberOf editable-options\n   */\n  activationEvent: 'click'\n\n});\n\n/*\n Angular-ui bootstrap datepicker\n http://angular-ui.github.io/bootstrap/#/datepicker\n */\nangular.module('xeditable').directive('editableBsdate', ['editableDirectiveFactory',\n    function(editableDirectiveFactory) {\n        return editableDirectiveFactory({\n            directiveName: 'editableBsdate',\n            inputTpl: '<div></div>',\n            render: function() {\n                /** This basically renders a datepicker as in the example shown in\n                 **  http://angular-ui.github.io/bootstrap/#/datepicker\n                 **  The attributes are all the same as in the bootstrap-ui datepicker with e- as prefix\n                 **/\n                this.parent.render.call(this);\n\n                var inputDatePicker = angular.element('<input type=\"text\" class=\"form-control\" ng-model=\"$data\"/>');\n                var buttonDatePicker = angular.element('<button type=\"button\" class=\"btn btn-default\"><i class=\"glyphicon glyphicon-calendar\"></i></button>');\n                var buttonWrapper = angular.element('<span class=\"input-group-btn\"></span>');\n\n                inputDatePicker.attr('uib-datepicker-popup', this.attrs.eDatepickerPopupXEditable || 'yyyy/MM/dd' );\n                inputDatePicker.attr('is-open', this.attrs.eIsOpen);\n                inputDatePicker.attr('date-disabled', this.attrs.eDateDisabled);\n                inputDatePicker.attr('uib-datepicker-popup', this.attrs.eDatepickerPopup);\n                inputDatePicker.attr('min-date', this.attrs.eMinDate);\n                inputDatePicker.attr('max-date', this.attrs.eMaxDate);\n                inputDatePicker.attr('year-range', this.attrs.eYearRange || 20);\n                inputDatePicker.attr('show-button-bar', this.attrs.eShowButtonBar || true);\n                inputDatePicker.attr('current-text', this.attrs.eCurrentText || 'Today');\n                inputDatePicker.attr('clear-text', this.attrs.eClearText || 'Clear');\n                inputDatePicker.attr('close-text', this.attrs.eCloseText || 'Done');\n                inputDatePicker.attr('close-on-date-selection', this.attrs.eCloseOnDateSelection || true);\n                inputDatePicker.attr('datepicker-append-to-body', this.attrs.eDatePickerAppendToBody || false);\n                inputDatePicker.attr('date-disabled', this.attrs.eDateDisabled);\n                inputDatePicker.attr('name', this.attrs.eName);\n\n                this.scope.dateOptions = {\n                    formatDay:  this.attrs.eFormatDay || 'dd',\n                    formatMonth: this.attrs.eFormatMonth || 'MMMM',\n                    formatYear: this.attrs.eFormatYear || 'yyyy',\n                    formatDayHeader: this.attrs.eFormatDayHeader || 'EEE',\n                    formatDayTitle: this.attrs.eFormatDayTitle || 'MMMM yyyy',\n                    formatMonthTitle: this.attrs.eFormatMonthTitle || 'yyyy',\n                    showWeeks: this.attrs.eShowWeeks ? this.attrs.eShowWeeks.toLowerCase() === 'true' : true,\n                    startingDay: this.attrs.eStartingDay || 0,\n                    minMode: this.attrs.eMinMode || 'day',\n                    maxMode: this.attrs.eMaxMode || 'year',\n                    initDate: this.attrs.eInitDate || new Date(),\n                    datepickerMode: this.attrs.eDatepickerMode || 'day'\n                };\n\n                inputDatePicker.attr('datepicker-options', \"dateOptions\");\n\n                buttonDatePicker.attr('ng-click',this.attrs.eNgClick);\n\n                buttonWrapper.append(buttonDatePicker);\n                this.inputEl.prepend(inputDatePicker);\n                this.inputEl.append(buttonWrapper);\n\n                this.inputEl.removeAttr('class');\n                this.inputEl.removeAttr('ng-click');\n                this.inputEl.removeAttr('is-open');\n                this.inputEl.removeAttr('init-date');\n                this.inputEl.removeAttr('datepicker-popup');\n                this.inputEl.removeAttr('required');\n                this.inputEl.removeAttr('ng-model');\n                this.inputEl.removeAttr('date-picker-append-to-body');\n                this.inputEl.removeAttr('name');\n                this.inputEl.attr('class','input-group');\n            }\n\t});\n}]);\n/*\nAngular-ui bootstrap editable timepicker\nhttp://angular-ui.github.io/bootstrap/#/timepicker\n*/\nangular.module('xeditable').directive('editableBstime', ['editableDirectiveFactory',\n  function(editableDirectiveFactory) {\n    return editableDirectiveFactory({\n      directiveName: 'editableBstime',\n      inputTpl: '<uib-timepicker></uib-timepicker>',\n      render: function() {\n        this.parent.render.call(this);\n\n        // timepicker can't update model when ng-model set directly to it\n        // see: https://github.com/angular-ui/bootstrap/issues/1141\n        // so we wrap it into DIV\n        var div = angular.element('<div class=\"well well-small\" style=\"display:inline-block;\"></div>');\n\n        // move ng-model to wrapping div\n        div.attr('ng-model', this.inputEl.attr('ng-model'));\n        this.inputEl.removeAttr('ng-model');\n\n        // move ng-change to wrapping div\n        if(this.attrs.eNgChange) {\n          div.attr('ng-change', this.inputEl.attr('ng-change'));\n          this.inputEl.removeAttr('ng-change');\n        }\n\n        // wrap\n        this.inputEl.wrap(div);\n      }\n    });\n}]);\n//checkbox\nangular.module('xeditable').directive('editableCheckbox', ['editableDirectiveFactory',\n  function(editableDirectiveFactory) {\n    return editableDirectiveFactory({\n      directiveName: 'editableCheckbox',\n      inputTpl: '<input type=\"checkbox\">',\n      render: function() {\n        this.parent.render.call(this);\n        if(this.attrs.eTitle) {\n          this.inputEl.wrap('<label></label>');\n          this.inputEl.parent().append(this.attrs.eTitle);\n        }\n      },\n      autosubmit: function() {\n        var self = this;\n        self.inputEl.bind('change', function() {\n          setTimeout(function() {\n            self.scope.$apply(function() {\n              self.scope.$form.$submit();\n            });\n          }, 500);\n        });\n      }\n    });\n}]);\n\n// checklist\nangular.module('xeditable').directive('editableChecklist', [\n  'editableDirectiveFactory',\n  'editableNgOptionsParser',\n  function(editableDirectiveFactory, editableNgOptionsParser) {\n    return editableDirectiveFactory({\n      directiveName: 'editableChecklist',\n      inputTpl: '<span></span>',\n      useCopy: true,\n      render: function() {\n        this.parent.render.call(this);\n        var parsed = editableNgOptionsParser(this.attrs.eNgOptions);\n        var html = '<label ng-repeat=\"'+parsed.ngRepeat+'\">'+\n          '<input type=\"checkbox\" checklist-model=\"$parent.$data\" checklist-value=\"'+parsed.locals.valueFn+'\">'+\n          '<span ng-bind=\"'+parsed.locals.displayFn+'\"></span></label>';\n\n        this.inputEl.removeAttr('ng-model');\n        this.inputEl.removeAttr('ng-options');\n        this.inputEl.html(html);\n      }\n    });\n}]);\n\nangular.module('xeditable').directive('editableCombodate', ['editableDirectiveFactory', 'editableCombodate',\n  function(editableDirectiveFactory, editableCombodate) {\n    return editableDirectiveFactory({\n      directiveName: 'editableCombodate',\n      inputTpl: '<input type=\"text\">',\n      render: function() {\n        this.parent.render.call(this);\n\n        var options = {\n          value: new Date(this.scope.$data)\n        };\n        var self = this;\n        angular.forEach([\"format\", \"template\", \"minYear\", \"maxYear\", \"yearDescending\", \"minuteStep\", \"secondStep\", \"firstItem\", \"errorClass\", \"customClass\", \"roundTime\", \"smartDays\"], function(name) {\n\n          var attrName = \"e\" + name.charAt(0).toUpperCase() + name.slice(1);\n          if (attrName in self.attrs) {\n            options[name] = self.attrs[attrName];\n          }\n        });\n\n        var combodate = editableCombodate.getInstance(this.inputEl, options);\n        combodate.$widget.find('select').bind('change', function(e) {\n          self.scope.$data = (new Date(combodate.getValue())).toISOString();\n        });\n      }\n    });\n  }\n]);\n\n/*\nInput types: text|email|tel|number|url|search|color|date|datetime|time|month|week\n*/\n\n(function() {\n\n  var types = 'text|password|email|tel|number|url|search|color|date|datetime|time|month|week|file'.split('|');\n\n  //todo: datalist\n  \n  // generate directives\n  angular.forEach(types, function(type) {\n    var directiveName = 'editable'+type.charAt(0).toUpperCase() + type.slice(1);\n    angular.module('xeditable').directive(directiveName, ['editableDirectiveFactory',\n      function(editableDirectiveFactory) {\n        return editableDirectiveFactory({\n          directiveName: directiveName,\n          inputTpl: '<input type=\"'+type+'\">'\n        });\n    }]);\n  });\n\n  //`range` is bit specific\n  angular.module('xeditable').directive('editableRange', ['editableDirectiveFactory',\n    function(editableDirectiveFactory) {\n      return editableDirectiveFactory({\n        directiveName: 'editableRange',\n        inputTpl: '<input type=\"range\" id=\"range\" name=\"range\">',\n        render: function() {\n          this.parent.render.call(this);\n          this.inputEl.after('<output>{{$data}}</output>');\n        }        \n      });\n  }]);\n\n}());\n\n\n// radiolist\nangular.module('xeditable').directive('editableRadiolist', [\n  'editableDirectiveFactory',\n  'editableNgOptionsParser',\n  function(editableDirectiveFactory, editableNgOptionsParser) {\n    return editableDirectiveFactory({\n      directiveName: 'editableRadiolist',\n      inputTpl: '<span></span>',\n      render: function() {\n        this.parent.render.call(this);\n        var parsed = editableNgOptionsParser(this.attrs.eNgOptions);\n        var html = '<label ng-repeat=\"'+parsed.ngRepeat+'\">'+\n          '<input type=\"radio\" ng-disabled=\"' + this.attrs.eNgDisabled + '\" ng-model=\"$parent.$data\" value=\"{{'+parsed.locals.valueFn+'}}\">'+\n          '<span ng-bind=\"'+parsed.locals.displayFn+'\"></span></label>';\n\n        this.inputEl.removeAttr('ng-model');\n        this.inputEl.removeAttr('ng-options');\n        this.inputEl.html(html);\n      },\n      autosubmit: function() {\n        var self = this;\n        self.inputEl.bind('change', function() {\n          setTimeout(function() {\n            self.scope.$apply(function() {\n              self.scope.$form.$submit();\n            });\n          }, 500);\n        });\n      }\n    });\n}]);\n\n//select\nangular.module('xeditable').directive('editableSelect', ['editableDirectiveFactory',\n  function(editableDirectiveFactory) {\n    return editableDirectiveFactory({\n      directiveName: 'editableSelect',\n      inputTpl: '<select></select>',\n      autosubmit: function() {\n        var self = this;\n        self.inputEl.bind('change', function() {\n          self.scope.$apply(function() {\n            self.scope.$form.$submit();\n          });\n        });\n      }\n    });\n}]);\n//textarea\nangular.module('xeditable').directive('editableTextarea', ['editableDirectiveFactory',\n  function(editableDirectiveFactory) {\n    return editableDirectiveFactory({\n      directiveName: 'editableTextarea',\n      inputTpl: '<textarea></textarea>',\n      addListeners: function() {\n        var self = this;\n        self.parent.addListeners.call(self);\n        // submit textarea by ctrl+enter even with buttons\n        if (self.single && self.buttons !== 'no') {\n          self.autosubmit();\n        }\n      },\n      autosubmit: function() {\n        var self = this;\n        self.inputEl.bind('keydown', function(e) {\n          if ((e.ctrlKey || e.metaKey) && (e.keyCode === 13)) {\n            self.scope.$apply(function() {\n              self.scope.$form.$submit();\n            });\n          }\n        });\n      }\n    });\n}]);\n\n/*\n AngularJS-native version of Select2 and Selectize\n https://github.com/angular-ui/ui-select\n */\nangular.module('xeditable').directive('editableUiSelect',['editableDirectiveFactory',\n    function(editableDirectiveFactory) {\n        var rename = function (tag, el) {\n            var newEl = angular.element('<' + tag + '/>');\n            newEl.html(el.html());\n            var attrs = el[0].attributes;\n            for (var i = 0; i < attrs.length; ++i) {\n                newEl.attr(attrs.item(i).nodeName, attrs.item(i).value);\n            }\n            return newEl;\n        };\n\n        var match = null;\n        var choices = null;\n        var dir = editableDirectiveFactory({\n            directiveName: 'editableUiSelect',\n            inputTpl: '<ui-select></ui-select>',\n            render: function () {\n                this.parent.render.call(this);\n                this.inputEl.append(rename('ui-select-match', match));\n                this.inputEl.append(rename('ui-select-choices', choices));\n                this.inputEl.removeAttr('ng-model');\n                this.inputEl.attr('ng-model', '$parent.$data');\n            }\n        });\n\n        var linkOrg = dir.link;\n\n        dir.link = function (scope, el, attrs, ctrl) {\n            var matchEl = el.find('editable-ui-select-match');\n            var choicesEl = el.find('editable-ui-select-choices');\n\n            match = matchEl.clone();\n            choices = choicesEl.clone();\n\n            matchEl.remove();\n            choicesEl.remove();\n\n            return linkOrg(scope, el, attrs, ctrl);\n        };\n\n        return dir;\n    }]);\n/**\n * EditableController class. \n * Attached to element with `editable-xxx` directive.\n *\n * @namespace editable-element\n */\n/*\nTODO: this file should be refactored to work more clear without closures!\n*/\nangular.module('xeditable').factory('editableController', \n  ['$q', 'editableUtils',\n  function($q, editableUtils) {\n\n  //EditableController function\n  EditableController.$inject = ['$scope', '$attrs', '$element', '$parse', 'editableThemes', 'editableIcons', 'editableOptions', '$rootScope', '$compile', '$q'];\n  function EditableController($scope, $attrs, $element, $parse, editableThemes, editableIcons, editableOptions, $rootScope, $compile, $q) {\n    var valueGetter;\n\n    //if control is disabled - it does not participate in waiting process\n    var inWaiting;\n\n    var self = this;\n\n    self.scope = $scope;\n    self.elem = $element;\n    self.attrs = $attrs;\n    self.inputEl = null;\n    self.editorEl = null;\n    self.single = true;\n    self.error = '';\n    self.theme =  editableThemes[editableOptions.theme] || editableThemes['default'];\n    self.parent = {};\n\n    //will be undefined if icon_set is default and theme is default\n    self.icon_set = editableOptions.icon_set === 'default' ? editableIcons.default[editableOptions.theme] : editableIcons.external[editableOptions.icon_set];\n\n    //to be overwritten by directive\n    self.inputTpl = '';\n    self.directiveName = '';\n\n    // with majority of controls copy is not needed, but..\n    // copy MUST NOT be used for `select-multiple` with objects as items\n    // copy MUST be used for `checklist`\n    self.useCopy = false;\n\n    //runtime (defaults)\n    self.single = null;\n\n    /**\n     * Attributes defined with `e-*` prefix automatically transfered from original element to\n     * control.  \n     * For example, if you set `<span editable-text=\"user.name\" e-style=\"width: 100px\"`>\n     * then input will appear as `<input style=\"width: 100px\">`.  \n     * See [demo](#text-customize).\n     * \n     * @var {any|attribute} e-*\n     * @memberOf editable-element\n     */ \n\n    /**\n     * Whether to show ok/cancel buttons. Values: `right|no`.\n     * If set to `no` control automatically submitted when value changed.  \n     * If control is part of form buttons will never be shown. \n     * \n     * @var {string|attribute} buttons\n     * @memberOf editable-element\n     */    \n    self.buttons = 'right'; \n    /**\n     * Action when control losses focus. Values: `cancel|submit|ignore`.\n     * Has sense only for single editable element.\n     * Otherwise, if control is part of form - you should set `blur` of form, not of individual element.\n     * \n     * @var {string|attribute} blur\n     * @memberOf editable-element\n     */     \n    // no real `blur` property as it is transfered to editable form\n\n    //init\n    self.init = function(single) {\n      self.single = single;\n\n      self.name = $attrs.eName || $attrs[self.directiveName];\n      /*\n      if(!$attrs[directiveName] && !$attrs.eNgModel && ($attrs.eValue === undefined)) {\n        throw 'You should provide value for `'+directiveName+'` or `e-value` in editable element!';\n      }\n      */\n      if($attrs[self.directiveName]) {\n        valueGetter = $parse($attrs[self.directiveName]);\n      } else {\n        throw 'You should provide value for `'+self.directiveName+'` in editable element!';\n      }\n\n      // settings for single and non-single\n      if (!self.single) {\n        // hide buttons for non-single\n        self.buttons = 'no';\n      } else {\n        self.buttons = self.attrs.buttons || editableOptions.buttons;\n      }\n\n      //if name defined --> watch changes and update $data in form\n      if($attrs.eName) {\n        self.scope.$watch('$data', function(newVal){\n          self.scope.$form.$data[$attrs.eName] = newVal;\n        });\n      }\n\n      /**\n       * Called when control is shown.  \n       * See [demo](#select-remote).\n       * \n       * @var {method|attribute} onshow\n       * @memberOf editable-element\n       */\n      if($attrs.onshow) {\n        self.onshow = function() {\n          return self.catchError($parse($attrs.onshow)($scope));\n        };\n      }\n\n      /**\n       * Called when control is hidden after both save or cancel.  \n       * \n       * @var {method|attribute} onhide\n       * @memberOf editable-element\n       */\n      if($attrs.onhide) {\n        self.onhide = function() {\n          return $parse($attrs.onhide)($scope);\n        };\n      }\n\n      /**\n       * Called when control is cancelled.  \n       * \n       * @var {method|attribute} oncancel\n       * @memberOf editable-element\n       */\n      if($attrs.oncancel) {\n        self.oncancel = function() {\n          return $parse($attrs.oncancel)($scope);\n        };\n      }          \n\n      /**\n       * Called during submit before value is saved to model.  \n       * See [demo](#onbeforesave).\n       * \n       * @var {method|attribute} onbeforesave\n       * @memberOf editable-element\n       */\n      if ($attrs.onbeforesave) {\n        self.onbeforesave = function() {\n          return self.catchError($parse($attrs.onbeforesave)($scope));\n        };\n      }\n\n      /**\n       * Called during submit after value is saved to model.  \n       * See [demo](#onaftersave).\n       * \n       * @var {method|attribute} onaftersave\n       * @memberOf editable-element\n       */\n      if ($attrs.onaftersave) {\n        self.onaftersave = function() {\n          return self.catchError($parse($attrs.onaftersave)($scope));\n        };\n      }\n\n      // watch change of model to update editable element\n      // now only add/remove `editable-empty` class.\n      // Initially this method called with newVal = undefined, oldVal = undefined\n      // so no need initially call handleEmpty() explicitly\n      $scope.$parent.$watch($attrs[self.directiveName], function(newVal, oldVal) {\n        self.setLocalValue();\n        self.handleEmpty();\n      });\n    };\n\n    self.render = function() {\n      var theme = self.theme;\n\n      //build input\n      self.inputEl = angular.element(self.inputTpl);\n\n      //build controls\n      self.controlsEl = angular.element(theme.controlsTpl);\n      self.controlsEl.append(self.inputEl);\n\n      //build buttons\n      if(self.buttons !== 'no') {\n        self.buttonsEl = angular.element(theme.buttonsTpl);\n        self.submitEl = angular.element(theme.submitTpl);\n        self.cancelEl = angular.element(theme.cancelTpl);\n        if(self.icon_set) {\n          self.submitEl.find('span').addClass(self.icon_set.ok);\n          self.cancelEl.find('span').addClass(self.icon_set.cancel);\n        }\n        self.buttonsEl.append(self.submitEl).append(self.cancelEl);\n        self.controlsEl.append(self.buttonsEl);\n        \n        self.inputEl.addClass('editable-has-buttons');\n      }\n\n      //build error\n      self.errorEl = angular.element(theme.errorTpl);\n      self.controlsEl.append(self.errorEl);\n\n      //build editor\n      self.editorEl = angular.element(self.single ? theme.formTpl : theme.noformTpl);\n      self.editorEl.append(self.controlsEl);\n\n      // transfer `e-*|data-e-*|x-e-*` attributes\n      for(var k in $attrs.$attr) {\n        if(k.length <= 1) {\n          continue;\n        }\n        var transferAttr = false;\n        var nextLetter = k.substring(1, 2);\n\n        // if starts with `e` + uppercase letter\n        if(k.substring(0, 1) === 'e' && nextLetter === nextLetter.toUpperCase()) {\n          transferAttr = k.substring(1); // cut `e`\n        } else {\n          continue;\n        }\n        \n        // exclude `form` and `ng-submit`, \n        if(transferAttr === 'Form' || transferAttr === 'NgSubmit') {\n          continue;\n        }\n\n        // convert back to lowercase style\n        transferAttr = transferAttr.substring(0, 1).toLowerCase() + editableUtils.camelToDash(transferAttr.substring(1));  \n\n        // workaround for attributes without value (e.g. `multiple = \"multiple\"`)\n        // except for 'e-value'\n        var attrValue = (transferAttr !== 'value' && $attrs[k] === '') ? transferAttr : $attrs[k];\n\n        // set attributes to input\n        self.inputEl.attr(transferAttr, attrValue);\n      }\n\n      self.inputEl.addClass('editable-input');\n      self.inputEl.attr('ng-model', '$data');\n\n      // add directiveName class to editor, e.g. `editable-text`\n      self.editorEl.addClass(editableUtils.camelToDash(self.directiveName));\n\n      if(self.single) {\n        self.editorEl.attr('editable-form', '$form');\n        // transfer `blur` to form\n        self.editorEl.attr('blur', self.attrs.blur || (self.buttons === 'no' ? 'cancel' : editableOptions.blurElem));\n      }\n\n      //apply `postrender` method of theme\n      if(angular.isFunction(theme.postrender)) {\n        theme.postrender.call(self);\n      }\n\n    };\n\n    // with majority of controls copy is not needed, but..\n    // copy MUST NOT be used for `select-multiple` with objects as items\n    // copy MUST be used for `checklist`\n    self.setLocalValue = function() {\n      self.scope.$data = self.useCopy ? \n        angular.copy(valueGetter($scope.$parent)) : \n        valueGetter($scope.$parent);\n    };\n\n    //show\n    self.show = function() {\n      // set value of scope.$data\n      self.setLocalValue();\n\n      /*\n      Originally render() was inside init() method, but some directives polluting editorEl,\n      so it is broken on second openning.\n      Cloning is not a solution as jqLite can not clone with event handler's.\n      */\n      self.render();\n\n      // insert into DOM\n      $element.after(self.editorEl);\n\n      // compile (needed to attach ng-* events from markup)\n      $compile(self.editorEl)($scope);\n\n      // attach listeners (`escape`, autosubmit, etc)\n      self.addListeners();\n\n      // hide element\n      $element.addClass('editable-hide');\n\n      // onshow\n      return self.onshow();\n    };\n\n    //hide\n    self.hide = function() {\n      \n      self.editorEl.remove();\n      $element.removeClass('editable-hide');\n\n      // onhide\n      return self.onhide();\n    };\n\n    // cancel\n    self.cancel = function() {\n      // oncancel\n      self.oncancel();\n      // don't call hide() here as it called in form's code\n    };\n\n    /*\n    Called after show to attach listeners\n    */\n    self.addListeners = function() {\n      // bind keyup for `escape`\n      self.inputEl.bind('keyup', function(e) {\n          if(!self.single) {\n            return;\n          }\n\n          // todo: move this to editable-form!\n          switch(e.keyCode) {\n            // hide on `escape` press\n            case 27:\n              self.scope.$apply(function() {\n                self.scope.$form.$cancel();\n              });\n            break;\n          }\n      });\n\n      // autosubmit when `no buttons`\n      if (self.single && self.buttons === 'no') {\n        self.autosubmit();\n      }\n\n      // click - mark element as clicked to exclude in document click handler\n      self.editorEl.bind('click', function(e) {\n        // ignore right/middle button click\n        if (e.which && e.which !== 1) {\n          return;\n        }\n\n        if (self.scope.$form.$visible) {\n          self.scope.$form._clicked = true;\n        }\n      });\n    };\n\n    // setWaiting\n    self.setWaiting = function(value) {\n      if (value) {\n        // participate in waiting only if not disabled\n        inWaiting = !self.inputEl.attr('disabled') &&\n                    !self.inputEl.attr('ng-disabled') &&\n                    !self.inputEl.attr('ng-enabled');\n        if (inWaiting) {\n          self.inputEl.attr('disabled', 'disabled');\n          if(self.buttonsEl) {\n            self.buttonsEl.find('button').attr('disabled', 'disabled');\n          }\n        }\n      } else {\n        if (inWaiting) {\n          self.inputEl.removeAttr('disabled');\n          if (self.buttonsEl) {\n            self.buttonsEl.find('button').removeAttr('disabled');\n          }\n        }\n      }\n    };\n\n    self.activate = function(start, end) {\n      setTimeout(function() {\n        var el = self.inputEl[0];\n        if (editableOptions.activate === 'focus' && el.focus) {\n          if(start){\n            end = end || start;\n            el.onfocus = function(){\n              var that = this;\n              setTimeout(function(){\n                that.setSelectionRange(start,end);\n              });\n            };\n          }\n          el.focus();\n        }\n        if (editableOptions.activate === 'select' && el.select) {\n          el.select();\n        }\n      }, 0);\n    };\n\n    self.setError = function(msg) {\n      if(!angular.isObject(msg)) {\n        $scope.$error = msg;\n        self.error = msg;\n      }\n    };\n\n    /*\n    Checks that result is string or promise returned string and shows it as error message\n    Applied to onshow, onbeforesave, onaftersave\n    */\n    self.catchError = function(result, noPromise) {\n      if (angular.isObject(result) && noPromise !== true) {\n        $q.when(result).then(\n          //success and fail handlers are equal\n          angular.bind(this, function(r) {\n            this.catchError(r, true);\n          }),\n          angular.bind(this, function(r) {\n            this.catchError(r, true);\n          })\n        );\n      //check $http error\n      } else if (noPromise && angular.isObject(result) && result.status &&\n        (result.status !== 200) && result.data && angular.isString(result.data)) {\n        this.setError(result.data);\n        //set result to string: to let form know that there was error\n        result = result.data;\n      } else if (angular.isString(result)) {\n        this.setError(result);\n      }\n      return result;\n    };\n\n    self.save = function() {\n      valueGetter.assign($scope.$parent,\n          self.useCopy ? angular.copy(self.scope.$data) : self.scope.$data);\n\n      // no need to call handleEmpty here as we are watching change of model value\n      // self.handleEmpty();\n    };\n\n    /*\n    attach/detach `editable-empty` class to element\n    */\n    self.handleEmpty = function() {\n      var val = valueGetter($scope.$parent);\n      var isEmpty = val === null || val === undefined || val === \"\" || (angular.isArray(val) && val.length === 0); \n      $element.toggleClass('editable-empty', isEmpty);\n    };\n\n    /*\n    Called when `buttons = \"no\"` to submit automatically\n    */\n    self.autosubmit = angular.noop;\n\n    self.onshow = angular.noop;\n    self.onhide = angular.noop;\n    self.oncancel = angular.noop;\n    self.onbeforesave = angular.noop;\n    self.onaftersave = angular.noop;\n  }\n\n  return EditableController;\n}]);\n\n/*\neditableFactory is used to generate editable directives (see `/directives` folder)\nInside it does several things:\n- detect form for editable element. Form may be one of three types:\n  1. autogenerated form (for single editable elements)\n  2. wrapper form (element wrapped by <form> tag)\n  3. linked form (element has `e-form` attribute pointing to existing form)\n\n- attach editableController to element\n\nDepends on: editableController, editableFormFactory\n*/\nangular.module('xeditable').factory('editableDirectiveFactory',\n['$parse', '$compile', 'editableThemes', '$rootScope', '$document', 'editableController', 'editableFormController', 'editableOptions',\nfunction($parse, $compile, editableThemes, $rootScope, $document, editableController, editableFormController, editableOptions) {\n\n  //directive object\n  return function(overwrites) {\n    return {\n      restrict: 'A',\n      scope: true,\n      require: [overwrites.directiveName, '?^form'],\n      controller: editableController,\n      link: function(scope, elem, attrs, ctrl) {\n        // editable controller\n        var eCtrl = ctrl[0];\n\n        // form controller\n        var eFormCtrl;\n\n        // this variable indicates is element is bound to some existing form, \n        // or it's single element who's form will be generated automatically\n        // By default consider single element without any linked form.ß\n        var hasForm = false;\n     \n        // element wrapped by form\n        if(ctrl[1]) {\n          eFormCtrl = ctrl[1];\n          hasForm = attrs.eSingle === undefined;\n        } else if(attrs.eForm) { // element not wrapped by <form>, but we hane `e-form` attr\n          var getter = $parse(attrs.eForm)(scope);\n          if(getter) { // form exists in scope (above), e.g. editable column\n            eFormCtrl = getter;\n            hasForm = true;\n          } else { // form exists below or not exist at all: check document.forms\n            for(var i=0; i<$document[0].forms.length;i++){\n              if($document[0].forms[i].name === attrs.eForm) {\n                // form is below and not processed yet\n                eFormCtrl = null;\n                hasForm = true;\n                break;\n              }\n            }\n          }\n        }\n\n        /*\n        if(hasForm && !attrs.eName) {\n          throw 'You should provide `e-name` for editable element inside form!';\n        }\n        */\n\n        //check for `editable-form` attr in form\n        /*\n        if(eFormCtrl && ) {\n          throw 'You should provide `e-name` for editable element inside form!';\n        }\n        */\n\n        // store original props to `parent` before merge\n        angular.forEach(overwrites, function(v, k) {\n          if(eCtrl[k] !== undefined) {\n            eCtrl.parent[k] = eCtrl[k];\n          }\n        });\n\n        // merge overwrites to base editable controller\n        angular.extend(eCtrl, overwrites);\n\n        // x-editable can be disabled using editableOption or edit-disabled attribute\n        var disabled = angular.isDefined(attrs.editDisabled) ?\n          scope.$eval(attrs.editDisabled) :\n          editableOptions.isDisabled;\n\n        if (disabled) {\n          return;\n        }\n        \n        // init editable ctrl\n        eCtrl.init(!hasForm);\n\n        // publich editable controller as `$editable` to be referenced in html\n        scope.$editable = eCtrl;\n\n        // add `editable` class to element\n        elem.addClass('editable');\n\n        // hasForm\n        if(hasForm) {\n          if(eFormCtrl) {\n            scope.$form = eFormCtrl;\n            if(!scope.$form.$addEditable) {\n              throw 'Form with editable elements should have `editable-form` attribute.';\n            }\n            scope.$form.$addEditable(eCtrl);\n          } else {\n            // future form (below): add editable controller to buffer and add to form later\n            $rootScope.$$editableBuffer = $rootScope.$$editableBuffer || {};\n            $rootScope.$$editableBuffer[attrs.eForm] = $rootScope.$$editableBuffer[attrs.eForm] || [];\n            $rootScope.$$editableBuffer[attrs.eForm].push(eCtrl);\n            scope.$form = null; //will be re-assigned later\n          }\n        // !hasForm\n        } else {\n          // create editableform controller\n          scope.$form = editableFormController();\n          // add self to editable controller\n          scope.$form.$addEditable(eCtrl);\n\n          // if `e-form` provided, publish local $form in scope\n          if(attrs.eForm) {\n            scope.$parent[attrs.eForm] = scope.$form;\n          }\n\n          // bind click - if no external form defined\n          if(!attrs.eForm || attrs.eClickable) {\n            elem.addClass('editable-click');\n            elem.bind(editableOptions.activationEvent, function(e) {\n              e.preventDefault();\n              e.editable = eCtrl;\n              scope.$apply(function(){\n                scope.$form.$show();\n              });\n            });\n          }\n        }\n\n      }\n    };\n  };\n}]);\n\n/*\nReturns editableForm controller\n*/\nangular.module('xeditable').factory('editableFormController', \n  ['$parse', '$document', '$rootScope', 'editablePromiseCollection', 'editableUtils',\n  function($parse, $document, $rootScope, editablePromiseCollection, editableUtils) {\n\n  // array of opened editable forms\n  var shown = [];\n\n  //Check if the child element correspond or is a descendant of the parent element\n  var isSelfOrDescendant = function (parent, child) {\n    if (child == parent) {\n      return true;\n    }\n\n    var node = child.parentNode;\n    while (node !== null) {\n      if (node == parent) {\n        return true;\n      }\n      node = node.parentNode;\n    }\n    return false;\n  };\n  \n  //Check if it is a real blur : if the click event appear on a shown editable elem, this is not a blur.\n  var isBlur = function(shown, event) {\n    var isBlur = true;\n\n    var editables = shown.$editables;\n    angular.forEach(editables, function(v){\n      var element = v.editorEl[0];\n      if (isSelfOrDescendant(element, event.target))\n        isBlur = false;\n      \n    });\n    return isBlur;\n  };\n  \n  // bind click to body: cancel|submit|ignore forms\n  $document.bind('click', function(e) {\n    // ignore right/middle button click\n    if (e.which && e.which !== 1) {\n      return;\n    }\n\n    var toCancel = [];\n    var toSubmit = [];\n    for (var i=0; i<shown.length; i++) {\n\n      // exclude clicked\n      if (shown[i]._clicked) {\n        shown[i]._clicked = false;\n        continue;\n      }\n\n      // exclude waiting\n      if (shown[i].$waiting) {\n        continue;\n      }\n\n      if (shown[i]._blur === 'cancel' && isBlur(shown[i], e)) {\n        toCancel.push(shown[i]);\n      }\n\n      if (shown[i]._blur === 'submit' && isBlur(shown[i], e)) {\n        toSubmit.push(shown[i]);\n      }\n    }\n\n    if (toCancel.length || toSubmit.length) {\n      $rootScope.$apply(function() {\n        angular.forEach(toCancel, function(v){ v.$cancel(); });\n        angular.forEach(toSubmit, function(v){ v.$submit(); });\n      });\n    }\n  });\n \n  $rootScope.$on('closeEdit', function() {\n    for(var i=0; i < shown.length; i++) {\n      shown[i].$hide();\n    }\n  }); \n\n  var base = {\n    $addEditable: function(editable) {\n      //console.log('add editable', editable.elem, editable.elem.bind);\n      this.$editables.push(editable);\n\n      //'on' is not supported in angular 1.0.8\n      editable.elem.bind('$destroy', angular.bind(this, this.$removeEditable, editable));\n\n      //bind editable's local $form to self (if not bound yet, below form) \n      if (!editable.scope.$form) {\n        editable.scope.$form = this;\n      }\n\n      //if form already shown - call show() of new editable\n      if (this.$visible) {\n        editable.catchError(editable.show());\n      }\n      editable.catchError(editable.setWaiting(this.$waiting));\n    },\n\n    $removeEditable: function(editable) {\n      //arrayRemove\n      for(var i=0; i < this.$editables.length; i++) {\n        if(this.$editables[i] === editable) {\n          this.$editables.splice(i, 1);\n          return;\n        }\n      }\n    },\n\n    /**\n     * Shows form with editable controls.\n     * \n     * @method $show()\n     * @memberOf editable-form\n     */\n    $show: function() {\n      if (this.$visible) {\n        return;\n      }\n\n      this.$visible = true;\n\n      var pc = editablePromiseCollection();\n\n      //own show\n      pc.when(this.$onshow());\n\n      //clear errors\n      this.$setError(null, '');\n\n      //children show\n      angular.forEach(this.$editables, function(editable) {\n        pc.when(editable.show());\n      });\n\n      //wait promises and activate\n      pc.then({\n        onWait: angular.bind(this, this.$setWaiting), \n        onTrue: angular.bind(this, this.$activate), \n        onFalse: angular.bind(this, this.$activate), \n        onString: angular.bind(this, this.$activate)\n      });\n\n      // add to internal list of shown forms\n      // setTimeout needed to prevent closing right after opening (e.g. when trigger by button)\n      setTimeout(angular.bind(this, function() {\n        // clear `clicked` to get ready for clicks on visible form\n        this._clicked = false;\n        if(editableUtils.indexOf(shown, this) === -1) {\n          shown.push(this);\n        }\n      }), 0);      \n    },\n\n    /**\n     * Sets focus on form field specified by `name`.\n     * \n     * @method $activate(name)\n     * @param {string} name name of field\n     * @memberOf editable-form\n     */\n    $activate: function(name) {\n      var i;\n      if (this.$editables.length) {\n        //activate by name\n        if (angular.isString(name)) {\n          for(i=0; i<this.$editables.length; i++) {\n            if (this.$editables[i].name === name) {\n              this.$editables[i].activate();\n              return;\n            }\n          }\n        }\n\n        //try activate error field\n        for(i=0; i<this.$editables.length; i++) {\n          if (this.$editables[i].error) {\n            this.$editables[i].activate();\n            return;\n          }\n        }\n\n        //by default activate first field\n        this.$editables[0].activate(this.$editables[0].elem[0].selectionStart, this.$editables[0].elem[0].selectionEnd);\n      }\n    },\n\n    /**\n     * Hides form with editable controls without saving.\n     * \n     * @method $hide()\n     * @memberOf editable-form\n     */\n    $hide: function() {\n      if (!this.$visible) {\n        return;\n      }      \n      this.$visible = false;\n      // self hide\n      this.$onhide();\n      // children's hide\n      angular.forEach(this.$editables, function(editable) {\n        editable.hide();\n      });\n\n      // remove from internal list of shown forms\n      editableUtils.arrayRemove(shown, this);\n    },\n\n    /**\n     * Triggers `oncancel` event and calls `$hide()`.\n     * \n     * @method $cancel()\n     * @memberOf editable-form\n     */\n    $cancel: function() {\n      if (!this.$visible) {\n        return;\n      }      \n      // self cancel\n      this.$oncancel();\n      // children's cancel      \n      angular.forEach(this.$editables, function(editable) {\n        editable.cancel();\n      });\n      // self hide\n      this.$hide();\n    },    \n\n    $setWaiting: function(value) {\n      this.$waiting = !!value;\n      // we can't just set $waiting variable and use it via ng-disabled in children\n      // because in editable-row form is not accessible\n      angular.forEach(this.$editables, function(editable) {\n        editable.setWaiting(!!value);\n      });\n    },\n\n    /**\n     * Shows error message for particular field.\n     * \n     * @method $setError(name, msg)\n     * @param {string} name name of field\n     * @param {string} msg error message\n     * @memberOf editable-form\n     */\n    $setError: function(name, msg) {\n      angular.forEach(this.$editables, function(editable) {\n        if(!name || editable.name === name) {\n          editable.setError(msg);\n        }\n      });\n    },\n\n    $submit: function() {\n      if (this.$waiting) {\n        return;\n      } \n\n      //clear errors\n      this.$setError(null, '');\n\n      //children onbeforesave\n      var pc = editablePromiseCollection();\n      angular.forEach(this.$editables, function(editable) {\n        pc.when(editable.onbeforesave());\n      });\n\n      /*\n      onbeforesave result:\n      - true/undefined: save data and close form\n      - false: close form without saving\n      - string: keep form open and show error\n      */\n      pc.then({\n        onWait: angular.bind(this, this.$setWaiting), \n        onTrue: angular.bind(this, checkSelf, true), \n        onFalse: angular.bind(this, checkSelf, false), \n        onString: angular.bind(this, this.$activate)\n      });\n\n      //save\n      function checkSelf(childrenTrue){\n        var pc = editablePromiseCollection();\n        pc.when(this.$onbeforesave());\n        pc.then({\n          onWait: angular.bind(this, this.$setWaiting), \n          onTrue: childrenTrue ? angular.bind(this, this.$save) : angular.bind(this, this.$hide), \n          onFalse: angular.bind(this, this.$hide), \n          onString: angular.bind(this, this.$activate)\n        });\n      }\n    },\n\n    $save: function() {\n      // write model for each editable\n      angular.forEach(this.$editables, function(editable) {\n        editable.save();\n      });\n\n      //call onaftersave of self and children\n      var pc = editablePromiseCollection();\n      pc.when(this.$onaftersave());\n      angular.forEach(this.$editables, function(editable) {\n        pc.when(editable.onaftersave());\n      });\n\n      /*\n      onaftersave result:\n      - true/undefined/false: just close form\n      - string: keep form open and show error\n      */\n      pc.then({\n        onWait: angular.bind(this, this.$setWaiting), \n        onTrue: angular.bind(this, this.$hide), \n        onFalse: angular.bind(this, this.$hide), \n        onString: angular.bind(this, this.$activate)\n      });\n    },\n\n    $onshow: angular.noop,\n    $oncancel: angular.noop,\n    $onhide: angular.noop,\n    $onbeforesave: angular.noop,\n    $onaftersave: angular.noop\n  };\n\n  return function() {\n    return angular.extend({\n      $editables: [],\n      /**\n       * Form visibility flag.\n       * \n       * @var {bool} $visible\n       * @memberOf editable-form\n       */\n      $visible: false,\n      /**\n       * Form waiting flag. It becomes `true` when form is loading or saving data.\n       * \n       * @var {bool} $waiting\n       * @memberOf editable-form\n       */\n      $waiting: false,\n      $data: {},\n      _clicked: false,\n      _blur: null\n    }, base);\n  };\n}]);\n\n/**\n * EditableForm directive. Should be defined in <form> containing editable controls.  \n * It add some usefull methods to form variable exposed to scope by `name=\"myform\"` attribute.\n *\n * @namespace editable-form\n */\nangular.module('xeditable').directive('editableForm',\n  ['$rootScope', '$parse', 'editableFormController', 'editableOptions',\n  function($rootScope, $parse, editableFormController, editableOptions) {\n    return {\n      restrict: 'A',\n      require: ['form'],\n      //require: ['form', 'editableForm'],\n      //controller: EditableFormController,\n      compile: function() {\n        return {\n          pre: function(scope, elem, attrs, ctrl) {\n            var form = ctrl[0];\n            var eForm;\n\n            //if `editableForm` has value - publish smartly under this value\n            //this is required only for single editor form that is created and removed\n            if(attrs.editableForm) {\n              if(scope[attrs.editableForm] && scope[attrs.editableForm].$show) {\n                eForm = scope[attrs.editableForm];\n                angular.extend(form, eForm);\n              } else {\n                eForm = editableFormController();\n                scope[attrs.editableForm] = eForm;\n                angular.extend(eForm, form);\n              }\n            } else { //just merge to form and publish if form has name\n              eForm = editableFormController();\n              angular.extend(form, eForm);\n            }\n\n            //read editables from buffer (that appeared before FORM tag)\n            var buf = $rootScope.$$editableBuffer;\n            var name = form.$name;\n            if(name && buf && buf[name]) {\n              angular.forEach(buf[name], function(editable) {\n                eForm.$addEditable(editable);\n              });\n              delete buf[name];\n            }\n          },\n          post: function(scope, elem, attrs, ctrl) {\n            var eForm;\n\n            if(attrs.editableForm && scope[attrs.editableForm] && scope[attrs.editableForm].$show) {\n              eForm = scope[attrs.editableForm];\n            } else {\n              eForm = ctrl[0];\n            }\n\n            /**\n             * Called when form is shown.\n             * \n             * @var {method|attribute} onshow \n             * @memberOf editable-form\n             */\n            if(attrs.onshow) {\n              eForm.$onshow = angular.bind(eForm, $parse(attrs.onshow), scope);\n            }\n\n            /**\n             * Called when form hides after both save or cancel.\n             * \n             * @var {method|attribute} onhide \n             * @memberOf editable-form\n             */\n            if(attrs.onhide) {\n              eForm.$onhide = angular.bind(eForm, $parse(attrs.onhide), scope);\n            }\n\n            /**\n             * Called when form is cancelled.\n             * \n             * @var {method|attribute} oncancel\n             * @memberOf editable-form\n             */\n            if(attrs.oncancel) {\n              eForm.$oncancel = angular.bind(eForm, $parse(attrs.oncancel), scope);\n            }\n\n            /**\n             * Whether form initially rendered in shown state.\n             *\n             * @var {bool|attribute} shown\n             * @memberOf editable-form\n             */\n            if(attrs.shown && $parse(attrs.shown)(scope)) {\n              eForm.$show();\n            }\n\n            /**\n             * Action when form losses focus. Values: `cancel|submit|ignore`.\n             * Default is `ignore`.\n             * \n             * @var {string|attribute} blur\n             * @memberOf editable-form\n             */\n            eForm._blur = attrs.blur || editableOptions.blurForm;\n\n            // onbeforesave, onaftersave\n            if(!attrs.ngSubmit && !attrs.submit) {\n              /**\n               * Called after all children `onbeforesave` callbacks but before saving form values\n               * to model.  \n               * If at least one children callback returns `non-string` - it will not not be called.  \n               * See [editable-form demo](#editable-form) for details.\n               * \n               * @var {method|attribute} onbeforesave\n               * @memberOf editable-form\n               * \n               */\n              if(attrs.onbeforesave) {\n                eForm.$onbeforesave = function() {\n                  return $parse(attrs.onbeforesave)(scope, {$data: eForm.$data});\n                };\n              }\n\n              /**\n               * Called when form values are saved to model.  \n               * See [editable-form demo](#editable-form) for details.\n               * \n               * @var {method|attribute} onaftersave \n               * @memberOf editable-form\n               * \n               */\n              if(attrs.onaftersave) {\n                eForm.$onaftersave = function() {\n                  return $parse(attrs.onaftersave)(scope, {$data: eForm.$data});\n                };\n              }\n\n              elem.bind('submit', function(event) {\n                event.preventDefault();\n                scope.$apply(function() {\n                  eForm.$submit();\n                });\n              });\n            }\n\n\n            // click - mark form as clicked to exclude in document click handler\n            elem.bind('click', function(e) {\n              // ignore right/middle button click\n              if (e.which && e.which !== 1) {\n                return;\n              }\n\n              if (eForm.$visible) {\n                eForm._clicked = true;\n              }\n            });   \n\n          }\n        };\n      }\n    };\n}]);\n/**\n * editablePromiseCollection\n *  \n * Collect results of function calls. Shows waiting if there are promises. \n * Finally, applies callbacks if:\n * - onTrue(): all results are true and all promises resolved to true\n * - onFalse(): at least one result is false or promise resolved to false\n * - onString(): at least one result is string or promise rejected or promise resolved to string\n */\n\nangular.module('xeditable').factory('editablePromiseCollection', ['$q', function($q) { \n\n  function promiseCollection() {\n    return {\n      promises: [],\n      hasFalse: false,\n      hasString: false,\n      when: function(result, noPromise) {\n        if (result === false) {\n          this.hasFalse = true;\n        } else if (!noPromise && angular.isObject(result)) {\n          this.promises.push($q.when(result));\n        } else if (angular.isString(result)){\n          this.hasString = true;\n        } else { //result === true || result === undefined || result === null\n          return;\n        }\n      },\n      //callbacks: onTrue, onFalse, onString\n      then: function(callbacks) {\n        callbacks = callbacks || {};\n        var onTrue = callbacks.onTrue || angular.noop;\n        var onFalse = callbacks.onFalse || angular.noop;\n        var onString = callbacks.onString || angular.noop;\n        var onWait = callbacks.onWait || angular.noop;\n\n        var self = this;\n\n        if (this.promises.length) {\n          onWait(true);\n          $q.all(this.promises).then(\n            //all resolved       \n            function(results) {\n              onWait(false);\n              //check all results via same `when` method (without checking promises)\n              angular.forEach(results, function(result) {\n                self.when(result, true);  \n              });\n              applyCallback();\n            },\n            //some rejected\n            function(error) { \n              onWait(false);\n              onString();\n            }\n            );\n        } else {\n          applyCallback();\n        }\n\n        function applyCallback() {\n          if (!self.hasString && !self.hasFalse) {\n            onTrue();\n          } else if (!self.hasString && self.hasFalse) {\n            onFalse();\n          } else {\n            onString();\n          }\n        }\n\n      }\n    };\n  }\n\n  return promiseCollection;\n\n}]);\n\n/**\n * editableUtils\n */\n angular.module('xeditable').factory('editableUtils', [function() {\n  return {\n    indexOf: function (array, obj) {\n      if (array.indexOf) return array.indexOf(obj);\n\n      for ( var i = 0; i < array.length; i++) {\n        if (obj === array[i]) return i;\n      }\n      return -1;\n    },\n\n    arrayRemove: function (array, value) {\n      var index = this.indexOf(array, value);\n      if (index >= 0) {\n        array.splice(index, 1);\n      }\n      return value;\n    },\n\n    // copy from https://github.com/angular/angular.js/blob/master/src/Angular.js\n    camelToDash: function(str) {\n      var SNAKE_CASE_REGEXP = /[A-Z]/g;\n      return str.replace(SNAKE_CASE_REGEXP, function(letter, pos) {\n        return (pos ? '-' : '') + letter.toLowerCase();\n      });\n    },\n\n    dashToCamel: function(str) {\n      var SPECIAL_CHARS_REGEXP = /([\\:\\-\\_]+(.))/g;\n      var MOZ_HACK_REGEXP = /^moz([A-Z])/;\n      return str.\n      replace(SPECIAL_CHARS_REGEXP, function(_, separator, letter, offset) {\n        return offset ? letter.toUpperCase() : letter;\n      }).\n      replace(MOZ_HACK_REGEXP, 'Moz$1');\n    }\n  };\n}]);\n\n/**\n * editableNgOptionsParser\n *\n * see: https://github.com/angular/angular.js/blob/master/src/ng/directive/select.js#L131\n */\n angular.module('xeditable').factory('editableNgOptionsParser', [function() {\n  //0000111110000000000022220000000000000000000000333300000000000000444444444444444000000000555555555555555000000066666666666666600000000000000007777000000000000000000088888\n  var NG_OPTIONS_REGEXP = /^\\s*(.*?)(?:\\s+as\\s+(.*?))?(?:\\s+group\\s+by\\s+(.*))?\\s+for\\s+(?:([\\$\\w][\\$\\w]*)|(?:\\(\\s*([\\$\\w][\\$\\w]*)\\s*,\\s*([\\$\\w][\\$\\w]*)\\s*\\)))\\s+in\\s+(.*?)(?:\\s+track\\s+by\\s+(.*?))?$/;\n\n  function parser(optionsExp) {\n    var match;\n\n    if (! (match = optionsExp.match(NG_OPTIONS_REGEXP))) {\n      throw 'ng-options parse error';\n    }\n\n    var \n    displayFn = match[2] || match[1],\n    valueName = match[4] || match[6],\n    keyName = match[5],\n    groupByFn = match[3] || '',\n    valueFn = match[2] ? match[1] : valueName,\n    valuesFn = match[7],\n    track = match[8],\n    trackFn = track ? match[8] : null;\n\n    var ngRepeat;\n    if (keyName === undefined) { // array\n      ngRepeat = valueName + ' in ' + valuesFn;\n      if (track !== undefined) {\n        ngRepeat += ' track by '+trackFn;\n      }\n    } else { // object\n      ngRepeat = '('+keyName+', '+valueName+') in '+valuesFn;\n    }\n    \n    // group not supported yet\n    return {\n      ngRepeat: ngRepeat,\n      locals: {\n        valueName: valueName,\n        keyName: keyName,\n        valueFn: valueFn,\n        displayFn: displayFn\n      }\n    };\n  }\n\n  return parser;\n}]);\n\n/**\n * editableCombodate\n *\n * angular version of https://github.com/vitalets/combodate\n */\nangular.module('xeditable').factory('editableCombodate', [function() {\n  function Combodate(element, options) {\n    this.$element = angular.element(element);\n\n    if(this.$element[0].nodeName != 'INPUT') {\n      throw 'Combodate should be applied to INPUT element';\n    }\n\n    var currentYear = new Date().getFullYear();\n    this.defaults = {\n      //in this format value stored in original input\n      format: 'YYYY-MM-DD HH:mm',\n      //in this format items in dropdowns are displayed\n      template: 'D / MMM / YYYY   H : mm',\n      //initial value, can be `new Date()`\n      value: null,\n      minYear: 1970,\n      maxYear: currentYear,\n      yearDescending: true,\n      minuteStep: 5,\n      secondStep: 1,\n      firstItem: 'empty', //'name', 'empty', 'none'\n      errorClass: null,\n      customClass: '',\n      roundTime: true, // whether to round minutes and seconds if step > 1\n      smartDays: true // whether days in combo depend on selected month: 31, 30, 28\n    };\n\n    this.options = angular.extend({}, this.defaults, options);\n    this.init();\n  }\n\n  Combodate.prototype = {\n    constructor: Combodate,\n    init: function () {\n      this.map = {\n        //key   regexp    moment.method\n        day:    ['D',    'date'], \n        month:  ['M',    'month'], \n        year:   ['Y',    'year'], \n        hour:   ['[Hh]', 'hours'],\n        minute: ['m',    'minutes'], \n        second: ['s',    'seconds'],\n        ampm:   ['[Aa]', ''] \n      };\n      \n      this.$widget = angular.element('<span class=\"combodate\"></span>').html(this.getTemplate());\n      \n      this.initCombos();\n      \n      if (this.options.smartDays) {\n        var combo = this;\n        this.$widget.find('select').bind('change', function(e) {\n          // update days count if month or year changes\n          if (angular.element(e.target).hasClass('month') || angular.element(e.target).hasClass('year')) {\n            combo.fillCombo('day');\n          }\n        });        \n      }\n\n      this.$widget.find('select').css('width', 'auto');\n\n      // hide original input and insert widget                                       \n      this.$element.css('display', 'none').after(this.$widget);\n      \n      // set initial value\n      this.setValue(this.$element.val() || this.options.value);\n    },\n    \n    /*\n     Replace tokens in template with <select> elements \n     */         \n     getTemplate: function() {\n      var tpl = this.options.template;\n      var customClass = this.options.customClass;\n\n      //first pass\n      angular.forEach(this.map, function(v, k) {\n        v = v[0]; \n        var r = new RegExp(v+'+');\n        var token = v.length > 1 ? v.substring(1, 2) : v;\n        \n        tpl = tpl.replace(r, '{'+token+'}');\n      });\n\n      //replace spaces with &nbsp;\n      tpl = tpl.replace(/ /g, '&nbsp;');\n\n      //second pass\n      angular.forEach(this.map, function(v, k) {\n        v = v[0];\n        var token = v.length > 1 ? v.substring(1, 2) : v;\n\n        tpl = tpl.replace('{'+token+'}', '<select class=\"'+k+' '+customClass+'\"></select>');\n      });   \n\n      return tpl;\n    },\n    \n    /*\n     Initialize combos that presents in template \n     */        \n     initCombos: function() {\n      for (var k in this.map) {\n        var c = this.$widget[0].querySelectorAll('.'+k);\n        // set properties like this.$day, this.$month etc.\n        this['$'+k] = c.length ? angular.element(c) : null;\n        // fill with items\n        this.fillCombo(k);\n      }\n    },\n\n    /*\n     Fill combo with items \n     */        \n     fillCombo: function(k) {\n      var $combo = this['$'+k];\n      if (!$combo) {\n        return;\n      }\n\n      // define method name to fill items, e.g `fillDays`\n      var f = 'fill' + k.charAt(0).toUpperCase() + k.slice(1); \n      var items = this[f]();\n      var value = $combo.val();\n\n      $combo.html('');\n      for(var i=0; i<items.length; i++) {\n        $combo.append('<option value=\"'+items[i][0]+'\">'+items[i][1]+'</option>');\n      }\n\n      $combo.val(value);\n    },\n\n    /*\n     Initialize items of combos. Handles `firstItem` option \n     */\n     fillCommon: function(key) {\n      var values = [], relTime;\n\n      if(this.options.firstItem === 'name') {\n        //need both to support moment ver < 2 and  >= 2\n        relTime = moment.relativeTime || moment.langData()._relativeTime; \n        var header = typeof relTime[key] === 'function' ? relTime[key](1, true, key, false) : relTime[key];\n        //take last entry (see momentjs lang files structure) \n        header = header.split(' ').reverse()[0];                \n        values.push(['', header]);\n      } else if(this.options.firstItem === 'empty') {\n        values.push(['', '']);\n      }\n      return values;\n    },  \n\n\n    /*\n    fill day\n    */\n    fillDay: function() {\n      var items = this.fillCommon('d'), name, i,\n      twoDigit = this.options.template.indexOf('DD') !== -1,\n      daysCount = 31;\n\n      // detect days count (depends on month and year)\n      // originally https://github.com/vitalets/combodate/pull/7\n      if (this.options.smartDays && this.$month && this.$year) {\n        var month = parseInt(this.$month.val(), 10);\n        var year = parseInt(this.$year.val(), 10);\n\n        if (!isNaN(month) && !isNaN(year)) {\n          daysCount = moment([year, month]).daysInMonth();\n        }\n      }\n\n      for (i = 1; i <= daysCount; i++) {\n        name = twoDigit ? this.leadZero(i) : i;\n        items.push([i, name]);\n      }\n      return items;\n    },\n    \n    /*\n    fill month\n    */\n    fillMonth: function() {\n      var items = this.fillCommon('M'), name, i, \n      longNames = this.options.template.indexOf('MMMM') !== -1,\n      shortNames = this.options.template.indexOf('MMM') !== -1,\n      twoDigit = this.options.template.indexOf('MM') !== -1;\n\n      for(i=0; i<=11; i++) {\n        if(longNames) {\n          //see https://github.com/timrwood/momentjs.com/pull/36\n          name = moment().date(1).month(i).format('MMMM');\n        } else if(shortNames) {\n          name = moment().date(1).month(i).format('MMM');\n        } else if(twoDigit) {\n          name = this.leadZero(i+1);\n        } else {\n          name = i+1;\n        }\n        items.push([i, name]);\n      } \n      return items;\n    },\n    \n    /*\n    fill year\n    */\n    fillYear: function() {\n      var items = [], name, i, \n      longNames = this.options.template.indexOf('YYYY') !== -1;\n\n      for(i=this.options.maxYear; i>=this.options.minYear; i--) {\n        name = longNames ? i : (i+'').substring(2);\n        items[this.options.yearDescending ? 'push' : 'unshift']([i, name]);\n      }\n      \n      items = this.fillCommon('y').concat(items);\n      \n      return items;\n    },\n    \n    /*\n    fill hour\n    */\n    fillHour: function() {\n      var items = this.fillCommon('h'), name, i,\n      h12 = this.options.template.indexOf('h') !== -1,\n      h24 = this.options.template.indexOf('H') !== -1,\n      twoDigit = this.options.template.toLowerCase().indexOf('hh') !== -1,\n      min = h12 ? 1 : 0, \n      max = h12 ? 12 : 23;\n\n      for(i=min; i<=max; i++) {\n        name = twoDigit ? this.leadZero(i) : i;\n        items.push([i, name]);\n      } \n      return items;\n    },\n\n    /*\n    fill minute\n    */\n    fillMinute: function() {\n      var items = this.fillCommon('m'), name, i,\n      twoDigit = this.options.template.indexOf('mm') !== -1;\n\n      for(i=0; i<=59; i+= this.options.minuteStep) {\n        name = twoDigit ? this.leadZero(i) : i;\n        items.push([i, name]);\n      }\n      return items;\n    },\n    \n    /*\n    fill second\n    */\n    fillSecond: function() {\n      var items = this.fillCommon('s'), name, i,\n      twoDigit = this.options.template.indexOf('ss') !== -1;\n\n      for(i=0; i<=59; i+= this.options.secondStep) {\n        name = twoDigit ? this.leadZero(i) : i;\n        items.push([i, name]);\n      }    \n      return items;\n    },\n    \n    /*\n    fill ampm\n    */\n    fillAmpm: function() {\n      var ampmL = this.options.template.indexOf('a') !== -1,\n      ampmU = this.options.template.indexOf('A') !== -1,            \n      items = [\n      ['am', ampmL ? 'am' : 'AM'],\n      ['pm', ampmL ? 'pm' : 'PM']\n      ];\n      return items;\n    },\n\n    /*\n     Returns current date value from combos. \n     If format not specified - `options.format` used.\n     If format = `null` - Moment object returned.\n     */\n     getValue: function(format) {\n      var dt, values = {}, \n      that = this,\n      notSelected = false;\n\n      //getting selected values    \n      angular.forEach(this.map, function(v, k) {\n        if(k === 'ampm') {\n          return;\n        }\n        var def = k === 'day' ? 1 : 0;\n\n        values[k] = that['$'+k] ? parseInt(that['$'+k].val(), 10) : def; \n        \n        if(isNaN(values[k])) {\n         notSelected = true;\n         return false; \n       }\n     });\n      \n      //if at least one visible combo not selected - return empty string\n      if(notSelected) {\n       return '';\n     }\n\n      //convert hours 12h --> 24h \n      if(this.$ampm) {\n        //12:00 pm --> 12:00 (24-h format, midday), 12:00 am --> 00:00 (24-h format, midnight, start of day)\n        if(values.hour === 12) {\n          values.hour = this.$ampm.val() === 'am' ? 0 : 12;                    \n        } else {\n          values.hour = this.$ampm.val() === 'am' ? values.hour : values.hour+12;\n        }\n      }\n      \n      dt = moment([values.year, values.month, values.day, values.hour, values.minute, values.second]);\n      \n      //highlight invalid date\n      this.highlight(dt);\n\n      format = format === undefined ? this.options.format : format;\n      if(format === null) {\n       return dt.isValid() ? dt : null; \n     } else {\n       return dt.isValid() ? dt.format(format) : ''; \n     }\n   },\n\n   setValue: function(value) {\n    if(!value) {\n      return;\n    }\n\n      // parse in strict mode (third param `true`)\n      var dt = typeof value === 'string' ? moment(value, this.options.format, true) : moment(value),\n      that = this,\n      values = {};\n      \n      //function to find nearest value in select options\n      function getNearest($select, value) {\n        var delta = {};\n        angular.forEach($select.children('option'), function(opt, i){\n          var optValue = angular.element(opt).attr('value');\n\n          if(optValue === '') return;\n          var distance = Math.abs(optValue - value); \n          if(typeof delta.distance === 'undefined' || distance < delta.distance) {\n            delta = {value: optValue, distance: distance};\n          } \n        }); \n        return delta.value;\n      }\n      \n      if(dt.isValid()) {\n        //read values from date object\n        angular.forEach(this.map, function(v, k) {\n          if(k === 'ampm') {\n            return; \n          }\n          values[k] = dt[v[1]]();\n        });\n\n        if(this.$ampm) {\n          //12:00 pm --> 12:00 (24-h format, midday), 12:00 am --> 00:00 (24-h format, midnight, start of day)\n          if(values.hour >= 12) {\n            values.ampm = 'pm';\n            if(values.hour > 12) {\n              values.hour -= 12;\n            }\n          } else {\n            values.ampm = 'am';\n            if(values.hour === 0) {\n              values.hour = 12;\n            }\n          }\n        }\n\n        angular.forEach(values, function(v, k) {\n          //call val() for each existing combo, e.g. this.$hour.val()\n          if(that['$'+k]) {\n\n            if(k === 'minute' && that.options.minuteStep > 1 && that.options.roundTime) {\n             v = getNearest(that['$'+k], v);\n           }\n           \n           if(k === 'second' && that.options.secondStep > 1 && that.options.roundTime) {\n             v = getNearest(that['$'+k], v);\n           }                       \n           \n           that['$'+k].val(v);\n         }\n       });\n\n        // update days count\n        if (this.options.smartDays) {\n          this.fillCombo('day');\n        }\n\n        this.$element.val(dt.format(this.options.format)).triggerHandler('change');\n      }\n    },\n    \n    /*\n     highlight combos if date is invalid\n     */\n     highlight: function(dt) {\n      if(!dt.isValid()) {\n        if(this.options.errorClass) {\n          this.$widget.addClass(this.options.errorClass);\n        } else {\n          //store original border color\n          if(!this.borderColor) {\n            this.borderColor = this.$widget.find('select').css('border-color'); \n          }\n          this.$widget.find('select').css('border-color', 'red');\n        }\n      } else {\n        if(this.options.errorClass) {\n          this.$widget.removeClass(this.options.errorClass);\n        } else {\n          this.$widget.find('select').css('border-color', this.borderColor);\n        }  \n      }\n    },\n    \n    leadZero: function(v) {\n      return v <= 9 ? '0' + v : v; \n    },\n    \n    destroy: function() {\n      this.$widget.remove();\n      this.$element.removeData('combodate').show();\n    }\n\n  };\n\n  return {\n    getInstance: function(element, options) {\n      return new Combodate(element, options);\n    }\n  };\n}]);\n\n/*\nEditable icons:\n- default\n- font-awesome\n\n*/\nangular.module('xeditable').factory('editableIcons', function() {\n\n  var icons = {\n    //Icon-set to use, defaults to bootstrap icons\n    default: {\n      'bs2': {\n        ok: 'icon-ok icon-white',\n        cancel: 'icon-remove'\n      },\n      'bs3': {\n        ok: 'glyphicon glyphicon-ok',\n        cancel: 'glyphicon glyphicon-remove'\n      }\n    },\n    external: {\n      'font-awesome': {\n        ok: 'fa fa-check',\n        cancel: 'fa fa-times'\n      }\n    }\n  };\n\n  return icons;\n});\n\n/*\nEditable themes:\n- default\n- bootstrap 2\n- bootstrap 3\n- semantic-ui\n\nNote: in postrender() `this` is instance of editableController\n*/\nangular.module('xeditable').factory('editableThemes', function() {\n  var themes = {\n    //default\n    'default': {\n      formTpl:      '<form class=\"editable-wrap\"></form>',\n      noformTpl:    '<span class=\"editable-wrap\"></span>',\n      controlsTpl:  '<span class=\"editable-controls\"></span>',\n      inputTpl:     '',\n      errorTpl:     '<div class=\"editable-error\" ng-show=\"$error\" ng-bind=\"$error\"></div>',\n      buttonsTpl:   '<span class=\"editable-buttons\"></span>',\n      submitTpl:    '<button type=\"submit\">save</button>',\n      cancelTpl:    '<button type=\"button\" ng-click=\"$form.$cancel()\">cancel</button>'\n    },\n\n    //bs2\n    'bs2': {\n      formTpl:     '<form class=\"form-inline editable-wrap\" role=\"form\"></form>',\n      noformTpl:   '<span class=\"editable-wrap\"></span>',\n      controlsTpl: '<div class=\"editable-controls controls control-group\" ng-class=\"{\\'error\\': $error}\"></div>',\n      inputTpl:    '',\n      errorTpl:    '<div class=\"editable-error help-block\" ng-show=\"$error\" ng-bind=\"$error\"></div>',\n      buttonsTpl:  '<span class=\"editable-buttons\"></span>',\n      submitTpl:   '<button type=\"submit\" class=\"btn btn-primary\"><span></span></button>',\n      cancelTpl:   '<button type=\"button\" class=\"btn\" ng-click=\"$form.$cancel()\">'+\n                      '<span></span>'+\n                   '</button>'\n\n    },\n\n    //bs3\n    'bs3': {\n      formTpl:     '<form class=\"form-inline editable-wrap\" role=\"form\"></form>',\n      noformTpl:   '<span class=\"editable-wrap\"></span>',\n      controlsTpl: '<div class=\"editable-controls form-group\" ng-class=\"{\\'has-error\\': $error}\"></div>',\n      inputTpl:    '',\n      errorTpl:    '<div class=\"editable-error help-block\" ng-show=\"$error\" ng-bind=\"$error\"></div>',\n      buttonsTpl:  '<span class=\"editable-buttons\"></span>',\n      submitTpl:   '<button type=\"submit\" class=\"btn btn-primary\"><span></span></button>',\n      cancelTpl:   '<button type=\"button\" class=\"btn btn-default\" ng-click=\"$form.$cancel()\">'+\n                     '<span></span>'+\n                   '</button>',\n\n      //bs3 specific prop to change buttons class: btn-sm, btn-lg\n      buttonsClass: '',\n      //bs3 specific prop to change standard inputs class: input-sm, input-lg\n      inputClass: '',\n      postrender: function() {\n        //apply `form-control` class to std inputs\n        switch(this.directiveName) {\n          case 'editableText':\n          case 'editableSelect':\n          case 'editableTextarea':\n          case 'editableEmail':\n          case 'editableTel':\n          case 'editableNumber':\n          case 'editableUrl':\n          case 'editableSearch':\n          case 'editableDate':\n          case 'editableDatetime':\n          case 'editableBsdate':\n          case 'editableTime':\n          case 'editableMonth':\n          case 'editableWeek':\n          case 'editablePassword':\n            this.inputEl.addClass('form-control');\n            if(this.theme.inputClass) {\n              // don`t apply `input-sm` and `input-lg` to select multiple\n              // should be fixed in bs itself!\n              if(this.inputEl.attr('multiple') &&\n                (this.theme.inputClass === 'input-sm' || this.theme.inputClass === 'input-lg')) {\n                  break;\n              }\n              this.inputEl.addClass(this.theme.inputClass);\n            }\n          break;\n          case 'editableCheckbox':\n              this.editorEl.addClass('checkbox');\n        }\n\n        //apply buttonsClass (bs3 specific!)\n        if(this.buttonsEl && this.theme.buttonsClass) {\n          this.buttonsEl.find('button').addClass(this.theme.buttonsClass);\n        }\n      }\n    },\n    \n    //semantic-ui\n    'semantic': {\n      formTpl:     '<form class=\"editable-wrap ui form\" ng-class=\"{\\'error\\': $error}\" role=\"form\"></form>',\n      noformTpl:   '<span class=\"editable-wrap\"></span>',\n      controlsTpl: '<div class=\"editable-controls ui fluid input\" ng-class=\"{\\'error\\': $error}\"></div>',\n      inputTpl:    '',\n      errorTpl:    '<div class=\"editable-error ui error message\" ng-show=\"$error\" ng-bind=\"$error\"></div>',\n      buttonsTpl:  '<span class=\"mini ui buttons\"></span>',\n      submitTpl:   '<button type=\"submit\" class=\"ui primary button\"><i class=\"ui check icon\"></i></button>',\n      cancelTpl:   '<button type=\"button\" class=\"ui button\" ng-click=\"$form.$cancel()\">'+\n                      '<i class=\"ui cancel icon\"></i>'+\n                   '</button>'\n    }\n  };\n\n  return themes;\n});\n\n/**\n * @license MIT\n */\n(function(window, document, undefined) {'use strict';\n  if (!window || !document) {\n    console.warn('Flowjs needs window and document objects to work');\n    return;\n  }\n  // ie10+\n  var ie10plus = window.navigator.msPointerEnabled;\n  /**\n   * Flow.js is a library providing multiple simultaneous, stable and\n   * resumable uploads via the HTML5 File API.\n   * @param [opts]\n   * @param {number|Function} [opts.chunkSize]\n   * @param {bool} [opts.forceChunkSize]\n   * @param {number} [opts.simultaneousUploads]\n   * @param {bool} [opts.singleFile]\n   * @param {string} [opts.fileParameterName]\n   * @param {number} [opts.progressCallbacksInterval]\n   * @param {number} [opts.speedSmoothingFactor]\n   * @param {Object|Function} [opts.query]\n   * @param {Object|Function} [opts.headers]\n   * @param {bool} [opts.withCredentials]\n   * @param {Function} [opts.preprocess]\n   * @param {string} [opts.method]\n   * @param {string|Function} [opts.testMethod]\n   * @param {string|Function} [opts.uploadMethod]\n   * @param {bool} [opts.prioritizeFirstAndLastChunk]\n   * @param {bool} [opts.allowDuplicateUploads]\n   * @param {string|Function} [opts.target]\n   * @param {number} [opts.maxChunkRetries]\n   * @param {number} [opts.chunkRetryInterval]\n   * @param {Array.<number>} [opts.permanentErrors]\n   * @param {Array.<number>} [opts.successStatuses]\n   * @param {Function} [opts.initFileFn]\n   * @param {Function} [opts.readFileFn]\n   * @param {Function} [opts.generateUniqueIdentifier]\n   * @constructor\n   */\n  function Flow(opts) {\n    /**\n     * Supported by browser?\n     * @type {boolean}\n     */\n    this.support = (\n        typeof File !== 'undefined' &&\n        typeof Blob !== 'undefined' &&\n        typeof FileList !== 'undefined' &&\n        (\n          !!Blob.prototype.slice || !!Blob.prototype.webkitSlice || !!Blob.prototype.mozSlice ||\n          false\n        ) // slicing files support\n    );\n\n    if (!this.support) {\n      return ;\n    }\n\n    /**\n     * Check if directory upload is supported\n     * @type {boolean}\n     */\n    this.supportDirectory = (\n        /Chrome/.test(window.navigator.userAgent) ||\n        /Firefox/.test(window.navigator.userAgent) ||\n        /Edge/.test(window.navigator.userAgent)\n    );\n\n    /**\n     * List of FlowFile objects\n     * @type {Array.<FlowFile>}\n     */\n    this.files = [];\n\n    /**\n     * Default options for flow.js\n     * @type {Object}\n     */\n    this.defaults = {\n      chunkSize: 1024 * 1024,\n      forceChunkSize: false,\n      simultaneousUploads: 3,\n      singleFile: false,\n      fileParameterName: 'file',\n      progressCallbacksInterval: 500,\n      speedSmoothingFactor: 0.1,\n      query: {},\n      headers: {},\n      withCredentials: false,\n      preprocess: null,\n      changeRawDataBeforeSend: null,\n      method: 'multipart',\n      testMethod: 'GET',\n      uploadMethod: 'POST',\n      prioritizeFirstAndLastChunk: false,\n      allowDuplicateUploads: false,\n      target: '/',\n      testChunks: true,\n      generateUniqueIdentifier: null,\n      maxChunkRetries: 0,\n      chunkRetryInterval: null,\n      permanentErrors: [404, 413, 415, 500, 501],\n      successStatuses: [200, 201, 202],\n      onDropStopPropagation: false,\n      initFileFn: null,\n      readFileFn: webAPIFileRead\n    };\n\n    /**\n     * Current options\n     * @type {Object}\n     */\n    this.opts = {};\n\n    /**\n     * List of events:\n     *  key stands for event name\n     *  value array list of callbacks\n     * @type {}\n     */\n    this.events = {};\n\n    var $ = this;\n\n    /**\n     * On drop event\n     * @function\n     * @param {MouseEvent} event\n     */\n    this.onDrop = function (event) {\n      if ($.opts.onDropStopPropagation) {\n        event.stopPropagation();\n      }\n      event.preventDefault();\n      var dataTransfer = event.dataTransfer;\n      if (dataTransfer.items && dataTransfer.items[0] &&\n        dataTransfer.items[0].webkitGetAsEntry) {\n        $.webkitReadDataTransfer(event);\n      } else {\n        $.addFiles(dataTransfer.files, event);\n      }\n    };\n\n    /**\n     * Prevent default\n     * @function\n     * @param {MouseEvent} event\n     */\n    this.preventEvent = function (event) {\n      event.preventDefault();\n    };\n\n\n    /**\n     * Current options\n     * @type {Object}\n     */\n    this.opts = Flow.extend({}, this.defaults, opts || {});\n\n  }\n\n  Flow.prototype = {\n    /**\n     * Set a callback for an event, possible events:\n     * fileSuccess(file), fileProgress(file), fileAdded(file, event),\n     * fileRemoved(file), fileRetry(file), fileError(file, message),\n     * complete(), progress(), error(message, file), pause()\n     * @function\n     * @param {string} event\n     * @param {Function} callback\n     */\n    on: function (event, callback) {\n      event = event.toLowerCase();\n      if (!this.events.hasOwnProperty(event)) {\n        this.events[event] = [];\n      }\n      this.events[event].push(callback);\n    },\n\n    /**\n     * Remove event callback\n     * @function\n     * @param {string} [event] removes all events if not specified\n     * @param {Function} [fn] removes all callbacks of event if not specified\n     */\n    off: function (event, fn) {\n      if (event !== undefined) {\n        event = event.toLowerCase();\n        if (fn !== undefined) {\n          if (this.events.hasOwnProperty(event)) {\n            arrayRemove(this.events[event], fn);\n          }\n        } else {\n          delete this.events[event];\n        }\n      } else {\n        this.events = {};\n      }\n    },\n\n    /**\n     * Fire an event\n     * @function\n     * @param {string} event event name\n     * @param {...} args arguments of a callback\n     * @return {bool} value is false if at least one of the event handlers which handled this event\n     * returned false. Otherwise it returns true.\n     */\n    fire: function (event, args) {\n      // `arguments` is an object, not array, in FF, so:\n      args = Array.prototype.slice.call(arguments);\n      event = event.toLowerCase();\n      var preventDefault = false;\n      if (this.events.hasOwnProperty(event)) {\n        each(this.events[event], function (callback) {\n          preventDefault = callback.apply(this, args.slice(1)) === false || preventDefault;\n        }, this);\n      }\n      if (event != 'catchall') {\n        args.unshift('catchAll');\n        preventDefault = this.fire.apply(this, args) === false || preventDefault;\n      }\n      return !preventDefault;\n    },\n\n    /**\n     * Read webkit dataTransfer object\n     * @param event\n     */\n    webkitReadDataTransfer: function (event) {\n      var $ = this;\n      var queue = event.dataTransfer.items.length;\n      var files = [];\n      each(event.dataTransfer.items, function (item) {\n        var entry = item.webkitGetAsEntry();\n        if (!entry) {\n          decrement();\n          return ;\n        }\n        if (entry.isFile) {\n          // due to a bug in Chrome's File System API impl - #149735\n          fileReadSuccess(item.getAsFile(), entry.fullPath);\n        } else {\n          readDirectory(entry.createReader());\n        }\n      });\n      function readDirectory(reader) {\n        reader.readEntries(function (entries) {\n          if (entries.length) {\n            queue += entries.length;\n            each(entries, function(entry) {\n              if (entry.isFile) {\n                var fullPath = entry.fullPath;\n                entry.file(function (file) {\n                  fileReadSuccess(file, fullPath);\n                }, readError);\n              } else if (entry.isDirectory) {\n                readDirectory(entry.createReader());\n              }\n            });\n            readDirectory(reader);\n          } else {\n            decrement();\n          }\n        }, readError);\n      }\n      function fileReadSuccess(file, fullPath) {\n        // relative path should not start with \"/\"\n        file.relativePath = fullPath.substring(1);\n        files.push(file);\n        decrement();\n      }\n      function readError(fileError) {\n        decrement();\n        throw fileError;\n      }\n      function decrement() {\n        if (--queue == 0) {\n          $.addFiles(files, event);\n        }\n      }\n    },\n\n    /**\n     * Generate unique identifier for a file\n     * @function\n     * @param {FlowFile} file\n     * @returns {string}\n     */\n    generateUniqueIdentifier: function (file) {\n      var custom = this.opts.generateUniqueIdentifier;\n      if (typeof custom === 'function') {\n        return custom(file);\n      }\n      // Some confusion in different versions of Firefox\n      var relativePath = file.relativePath || file.webkitRelativePath || file.fileName || file.name;\n      return file.size + '-' + relativePath.replace(/[^0-9a-zA-Z_-]/img, '');\n    },\n\n    /**\n     * Upload next chunk from the queue\n     * @function\n     * @returns {boolean}\n     * @private\n     */\n    uploadNextChunk: function (preventEvents) {\n      // In some cases (such as videos) it's really handy to upload the first\n      // and last chunk of a file quickly; this let's the server check the file's\n      // metadata and determine if there's even a point in continuing.\n      var found = false;\n      if (this.opts.prioritizeFirstAndLastChunk) {\n        each(this.files, function (file) {\n          if (!file.paused && file.chunks.length &&\n            file.chunks[0].status() === 'pending') {\n            file.chunks[0].send();\n            found = true;\n            return false;\n          }\n          if (!file.paused && file.chunks.length > 1 &&\n            file.chunks[file.chunks.length - 1].status() === 'pending') {\n            file.chunks[file.chunks.length - 1].send();\n            found = true;\n            return false;\n          }\n        });\n        if (found) {\n          return found;\n        }\n      }\n\n      // Now, simply look for the next, best thing to upload\n      each(this.files, function (file) {\n        if (!file.paused) {\n          each(file.chunks, function (chunk) {\n            if (chunk.status() === 'pending') {\n              chunk.send();\n              found = true;\n              return false;\n            }\n          });\n        }\n        if (found) {\n          return false;\n        }\n      });\n      if (found) {\n        return true;\n      }\n\n      // The are no more outstanding chunks to upload, check is everything is done\n      var outstanding = false;\n      each(this.files, function (file) {\n        if (!file.isComplete()) {\n          outstanding = true;\n          return false;\n        }\n      });\n      if (!outstanding && !preventEvents) {\n        // All chunks have been uploaded, complete\n        async(function () {\n          this.fire('complete');\n        }, this);\n      }\n      return false;\n    },\n\n\n    /**\n     * Assign a browse action to one or more DOM nodes.\n     * @function\n     * @param {Element|Array.<Element>} domNodes\n     * @param {boolean} isDirectory Pass in true to allow directories to\n     * @param {boolean} singleFile prevent multi file upload\n     * @param {Object} attributes set custom attributes:\n     *  http://www.w3.org/TR/html-markup/input.file.html#input.file-attributes\n     *  eg: accept: 'image/*'\n     * be selected (Chrome only).\n     */\n    assignBrowse: function (domNodes, isDirectory, singleFile, attributes) {\n      if (domNodes instanceof Element) {\n        domNodes = [domNodes];\n      }\n\n      each(domNodes, function (domNode) {\n        var input;\n        if (domNode.tagName === 'INPUT' && domNode.type === 'file') {\n          input = domNode;\n        } else {\n          input = document.createElement('input');\n          input.setAttribute('type', 'file');\n          // display:none - not working in opera 12\n          extend(input.style, {\n            visibility: 'hidden',\n            position: 'absolute',\n            width: '1px',\n            height: '1px'\n          });\n          // for opera 12 browser, input must be assigned to a document\n          domNode.appendChild(input);\n          // https://developer.mozilla.org/en/using_files_from_web_applications)\n          // event listener is executed two times\n          // first one - original mouse click event\n          // second - input.click(), input is inside domNode\n          domNode.addEventListener('click', function() {\n            input.click();\n          }, false);\n        }\n        if (!this.opts.singleFile && !singleFile) {\n          input.setAttribute('multiple', 'multiple');\n        }\n        if (isDirectory) {\n          input.setAttribute('webkitdirectory', 'webkitdirectory');\n        }\n        each(attributes, function (value, key) {\n          input.setAttribute(key, value);\n        });\n        // When new files are added, simply append them to the overall list\n        var $ = this;\n        input.addEventListener('change', function (e) {\n       \t  if (e.target.value) {\n            $.addFiles(e.target.files, e);\n            e.target.value = '';\n       \t  }\n        }, false);\n      }, this);\n    },\n\n    /**\n     * Assign one or more DOM nodes as a drop target.\n     * @function\n     * @param {Element|Array.<Element>} domNodes\n     */\n    assignDrop: function (domNodes) {\n      if (typeof domNodes.length === 'undefined') {\n        domNodes = [domNodes];\n      }\n      each(domNodes, function (domNode) {\n        domNode.addEventListener('dragover', this.preventEvent, false);\n        domNode.addEventListener('dragenter', this.preventEvent, false);\n        domNode.addEventListener('drop', this.onDrop, false);\n      }, this);\n    },\n\n    /**\n     * Un-assign drop event from DOM nodes\n     * @function\n     * @param domNodes\n     */\n    unAssignDrop: function (domNodes) {\n      if (typeof domNodes.length === 'undefined') {\n        domNodes = [domNodes];\n      }\n      each(domNodes, function (domNode) {\n        domNode.removeEventListener('dragover', this.preventEvent);\n        domNode.removeEventListener('dragenter', this.preventEvent);\n        domNode.removeEventListener('drop', this.onDrop);\n      }, this);\n    },\n\n    /**\n     * Returns a boolean indicating whether or not the instance is currently\n     * uploading anything.\n     * @function\n     * @returns {boolean}\n     */\n    isUploading: function () {\n      var uploading = false;\n      each(this.files, function (file) {\n        if (file.isUploading()) {\n          uploading = true;\n          return false;\n        }\n      });\n      return uploading;\n    },\n\n    /**\n     * should upload next chunk\n     * @function\n     * @returns {boolean|number}\n     */\n    _shouldUploadNext: function () {\n      var num = 0;\n      var should = true;\n      var simultaneousUploads = this.opts.simultaneousUploads;\n      each(this.files, function (file) {\n        each(file.chunks, function(chunk) {\n          if (chunk.status() === 'uploading') {\n            num++;\n            if (num >= simultaneousUploads) {\n              should = false;\n              return false;\n            }\n          }\n        });\n      });\n      // if should is true then return uploading chunks's length\n      return should && num;\n    },\n\n    /**\n     * Start or resume uploading.\n     * @function\n     */\n    upload: function () {\n      // Make sure we don't start too many uploads at once\n      var ret = this._shouldUploadNext();\n      if (ret === false) {\n        return;\n      }\n      // Kick off the queue\n      this.fire('uploadStart');\n      var started = false;\n      for (var num = 1; num <= this.opts.simultaneousUploads - ret; num++) {\n        started = this.uploadNextChunk(true) || started;\n      }\n      if (!started) {\n        async(function () {\n          this.fire('complete');\n        }, this);\n      }\n    },\n\n    /**\n     * Resume uploading.\n     * @function\n     */\n    resume: function () {\n      each(this.files, function (file) {\n        if (!file.isComplete()) {\n          file.resume();\n        }\n      });\n    },\n\n    /**\n     * Pause uploading.\n     * @function\n     */\n    pause: function () {\n      each(this.files, function (file) {\n        file.pause();\n      });\n    },\n\n    /**\n     * Cancel upload of all FlowFile objects and remove them from the list.\n     * @function\n     */\n    cancel: function () {\n      for (var i = this.files.length - 1; i >= 0; i--) {\n        this.files[i].cancel();\n      }\n    },\n\n    /**\n     * Returns a number between 0 and 1 indicating the current upload progress\n     * of all files.\n     * @function\n     * @returns {number}\n     */\n    progress: function () {\n      var totalDone = 0;\n      var totalSize = 0;\n      // Resume all chunks currently being uploaded\n      each(this.files, function (file) {\n        totalDone += file.progress() * file.size;\n        totalSize += file.size;\n      });\n      return totalSize > 0 ? totalDone / totalSize : 0;\n    },\n\n    /**\n     * Add a HTML5 File object to the list of files.\n     * @function\n     * @param {File} file\n     * @param {Event} [event] event is optional\n     */\n    addFile: function (file, event) {\n      this.addFiles([file], event);\n    },\n\n    /**\n     * Add a HTML5 File object to the list of files.\n     * @function\n     * @param {FileList|Array} fileList\n     * @param {Event} [event] event is optional\n     */\n    addFiles: function (fileList, event) {\n      var files = [];\n      each(fileList, function (file) {\n        // https://github.com/flowjs/flow.js/issues/55\n        if ((!ie10plus || ie10plus && file.size > 0) && !(file.size % 4096 === 0 && (file.name === '.' || file.fileName === '.'))) {\n          var uniqueIdentifier = this.generateUniqueIdentifier(file);\n          if (this.opts.allowDuplicateUploads || !this.getFromUniqueIdentifier(uniqueIdentifier)) {\n            var f = new FlowFile(this, file, uniqueIdentifier);\n            if (this.fire('fileAdded', f, event)) {\n              files.push(f);\n            }\n          }\n        }\n      }, this);\n      if (this.fire('filesAdded', files, event)) {\n        each(files, function (file) {\n          if (this.opts.singleFile && this.files.length > 0) {\n            this.removeFile(this.files[0]);\n          }\n          this.files.push(file);\n        }, this);\n        this.fire('filesSubmitted', files, event);\n      }\n    },\n\n\n    /**\n     * Cancel upload of a specific FlowFile object from the list.\n     * @function\n     * @param {FlowFile} file\n     */\n    removeFile: function (file) {\n      for (var i = this.files.length - 1; i >= 0; i--) {\n        if (this.files[i] === file) {\n          this.files.splice(i, 1);\n          file.abort();\n          this.fire('fileRemoved', file);\n        }\n      }\n    },\n\n    /**\n     * Look up a FlowFile object by its unique identifier.\n     * @function\n     * @param {string} uniqueIdentifier\n     * @returns {boolean|FlowFile} false if file was not found\n     */\n    getFromUniqueIdentifier: function (uniqueIdentifier) {\n      var ret = false;\n      each(this.files, function (file) {\n        if (file.uniqueIdentifier === uniqueIdentifier) {\n          ret = file;\n        }\n      });\n      return ret;\n    },\n\n    /**\n     * Returns the total size of all files in bytes.\n     * @function\n     * @returns {number}\n     */\n    getSize: function () {\n      var totalSize = 0;\n      each(this.files, function (file) {\n        totalSize += file.size;\n      });\n      return totalSize;\n    },\n\n    /**\n     * Returns the total size uploaded of all files in bytes.\n     * @function\n     * @returns {number}\n     */\n    sizeUploaded: function () {\n      var size = 0;\n      each(this.files, function (file) {\n        size += file.sizeUploaded();\n      });\n      return size;\n    },\n\n    /**\n     * Returns remaining time to upload all files in seconds. Accuracy is based on average speed.\n     * If speed is zero, time remaining will be equal to positive infinity `Number.POSITIVE_INFINITY`\n     * @function\n     * @returns {number}\n     */\n    timeRemaining: function () {\n      var sizeDelta = 0;\n      var averageSpeed = 0;\n      each(this.files, function (file) {\n        if (!file.paused && !file.error) {\n          sizeDelta += file.size - file.sizeUploaded();\n          averageSpeed += file.averageSpeed;\n        }\n      });\n      if (sizeDelta && !averageSpeed) {\n        return Number.POSITIVE_INFINITY;\n      }\n      if (!sizeDelta && !averageSpeed) {\n        return 0;\n      }\n      return Math.floor(sizeDelta / averageSpeed);\n    }\n  };\n\n\n\n\n\n\n  /**\n   * FlowFile class\n   * @name FlowFile\n   * @param {Flow} flowObj\n   * @param {File} file\n   * @param {string} uniqueIdentifier\n   * @constructor\n   */\n  function FlowFile(flowObj, file, uniqueIdentifier) {\n\n    /**\n     * Reference to parent Flow instance\n     * @type {Flow}\n     */\n    this.flowObj = flowObj;\n\n    /**\n     * Used to store the bytes read\n     * @type {Blob|string}\n     */\n    this.bytes = null;\n\n    /**\n     * Reference to file\n     * @type {File}\n     */\n    this.file = file;\n\n    /**\n     * File name. Some confusion in different versions of Firefox\n     * @type {string}\n     */\n    this.name = file.fileName || file.name;\n\n    /**\n     * File size\n     * @type {number}\n     */\n    this.size = file.size;\n\n    /**\n     * Relative file path\n     * @type {string}\n     */\n    this.relativePath = file.relativePath || file.webkitRelativePath || this.name;\n\n    /**\n     * File unique identifier\n     * @type {string}\n     */\n    this.uniqueIdentifier = (uniqueIdentifier === undefined ? flowObj.generateUniqueIdentifier(file) : uniqueIdentifier);\n\n    /**\n     * Size of Each Chunk\n     * @type {number}\n     */\n    this.chunkSize = 0;\n\n    /**\n     * List of chunks\n     * @type {Array.<FlowChunk>}\n     */\n    this.chunks = [];\n\n    /**\n     * Indicated if file is paused\n     * @type {boolean}\n     */\n    this.paused = false;\n\n    /**\n     * Indicated if file has encountered an error\n     * @type {boolean}\n     */\n    this.error = false;\n\n    /**\n     * Average upload speed\n     * @type {number}\n     */\n    this.averageSpeed = 0;\n\n    /**\n     * Current upload speed\n     * @type {number}\n     */\n    this.currentSpeed = 0;\n\n    /**\n     * Date then progress was called last time\n     * @type {number}\n     * @private\n     */\n    this._lastProgressCallback = Date.now();\n\n    /**\n     * Previously uploaded file size\n     * @type {number}\n     * @private\n     */\n    this._prevUploadedSize = 0;\n\n    /**\n     * Holds previous progress\n     * @type {number}\n     * @private\n     */\n    this._prevProgress = 0;\n\n    this.bootstrap();\n  }\n\n  FlowFile.prototype = {\n    /**\n     * Update speed parameters\n     * @link http://stackoverflow.com/questions/2779600/how-to-estimate-download-time-remaining-accurately\n     * @function\n     */\n    measureSpeed: function () {\n      var timeSpan = Date.now() - this._lastProgressCallback;\n      if (!timeSpan) {\n        return ;\n      }\n      var smoothingFactor = this.flowObj.opts.speedSmoothingFactor;\n      var uploaded = this.sizeUploaded();\n      // Prevent negative upload speed after file upload resume\n      this.currentSpeed = Math.max((uploaded - this._prevUploadedSize) / timeSpan * 1000, 0);\n      this.averageSpeed = smoothingFactor * this.currentSpeed + (1 - smoothingFactor) * this.averageSpeed;\n      this._prevUploadedSize = uploaded;\n    },\n\n    /**\n     * For internal usage only.\n     * Callback when something happens within the chunk.\n     * @function\n     * @param {FlowChunk} chunk\n     * @param {string} event can be 'progress', 'success', 'error' or 'retry'\n     * @param {string} [message]\n     */\n    chunkEvent: function (chunk, event, message) {\n      switch (event) {\n        case 'progress':\n          if (Date.now() - this._lastProgressCallback <\n            this.flowObj.opts.progressCallbacksInterval) {\n            break;\n          }\n          this.measureSpeed();\n          this.flowObj.fire('fileProgress', this, chunk);\n          this.flowObj.fire('progress');\n          this._lastProgressCallback = Date.now();\n          break;\n        case 'error':\n          this.error = true;\n          this.abort(true);\n          this.flowObj.fire('fileError', this, message, chunk);\n          this.flowObj.fire('error', message, this, chunk);\n          break;\n        case 'success':\n          if (this.error) {\n            return;\n          }\n          this.measureSpeed();\n          this.flowObj.fire('fileProgress', this, chunk);\n          this.flowObj.fire('progress');\n          this._lastProgressCallback = Date.now();\n          if (this.isComplete()) {\n            this.currentSpeed = 0;\n            this.averageSpeed = 0;\n            this.flowObj.fire('fileSuccess', this, message, chunk);\n          }\n          break;\n        case 'retry':\n          this.flowObj.fire('fileRetry', this, chunk);\n          break;\n      }\n    },\n\n    /**\n     * Pause file upload\n     * @function\n     */\n    pause: function() {\n      this.paused = true;\n      this.abort();\n    },\n\n    /**\n     * Resume file upload\n     * @function\n     */\n    resume: function() {\n      this.paused = false;\n      this.flowObj.upload();\n    },\n\n    /**\n     * Abort current upload\n     * @function\n     */\n    abort: function (reset) {\n      this.currentSpeed = 0;\n      this.averageSpeed = 0;\n      var chunks = this.chunks;\n      if (reset) {\n        this.chunks = [];\n      }\n      each(chunks, function (c) {\n        if (c.status() === 'uploading') {\n          c.abort();\n          this.flowObj.uploadNextChunk();\n        }\n      }, this);\n    },\n\n    /**\n     * Cancel current upload and remove from a list\n     * @function\n     */\n    cancel: function () {\n      this.flowObj.removeFile(this);\n    },\n\n    /**\n     * Retry aborted file upload\n     * @function\n     */\n    retry: function () {\n      this.bootstrap();\n      this.flowObj.upload();\n    },\n\n    /**\n     * Clear current chunks and slice file again\n     * @function\n     */\n    bootstrap: function () {\n      if (typeof this.flowObj.opts.initFileFn === \"function\") {\n        this.flowObj.opts.initFileFn(this);\n      }\n\n      this.abort(true);\n      this.error = false;\n      // Rebuild stack of chunks from file\n      this._prevProgress = 0;\n      var round = this.flowObj.opts.forceChunkSize ? Math.ceil : Math.floor;\n      this.chunkSize = evalOpts(this.flowObj.opts.chunkSize, this);\n      var chunks = Math.max(\n        round(this.size / this.chunkSize), 1\n      );\n      for (var offset = 0; offset < chunks; offset++) {\n        this.chunks.push(\n          new FlowChunk(this.flowObj, this, offset)\n        );\n      }\n    },\n\n    /**\n     * Get current upload progress status\n     * @function\n     * @returns {number} from 0 to 1\n     */\n    progress: function () {\n      if (this.error) {\n        return 1;\n      }\n      if (this.chunks.length === 1) {\n        this._prevProgress = Math.max(this._prevProgress, this.chunks[0].progress());\n        return this._prevProgress;\n      }\n      // Sum up progress across everything\n      var bytesLoaded = 0;\n      each(this.chunks, function (c) {\n        // get chunk progress relative to entire file\n        bytesLoaded += c.progress() * (c.endByte - c.startByte);\n      });\n      var percent = bytesLoaded / this.size;\n      // We don't want to lose percentages when an upload is paused\n      this._prevProgress = Math.max(this._prevProgress, percent > 0.9999 ? 1 : percent);\n      return this._prevProgress;\n    },\n\n    /**\n     * Indicates if file is being uploaded at the moment\n     * @function\n     * @returns {boolean}\n     */\n    isUploading: function () {\n      var uploading = false;\n      each(this.chunks, function (chunk) {\n        if (chunk.status() === 'uploading') {\n          uploading = true;\n          return false;\n        }\n      });\n      return uploading;\n    },\n\n    /**\n     * Indicates if file is has finished uploading and received a response\n     * @function\n     * @returns {boolean}\n     */\n    isComplete: function () {\n      var outstanding = false;\n      each(this.chunks, function (chunk) {\n        var status = chunk.status();\n        if (status === 'pending' || status === 'uploading' || status === 'reading' || chunk.preprocessState === 1 || chunk.readState === 1) {\n          outstanding = true;\n          return false;\n        }\n      });\n      return !outstanding;\n    },\n\n    /**\n     * Count total size uploaded\n     * @function\n     * @returns {number}\n     */\n    sizeUploaded: function () {\n      var size = 0;\n      each(this.chunks, function (chunk) {\n        size += chunk.sizeUploaded();\n      });\n      return size;\n    },\n\n    /**\n     * Returns remaining time to finish upload file in seconds. Accuracy is based on average speed.\n     * If speed is zero, time remaining will be equal to positive infinity `Number.POSITIVE_INFINITY`\n     * @function\n     * @returns {number}\n     */\n    timeRemaining: function () {\n      if (this.paused || this.error) {\n        return 0;\n      }\n      var delta = this.size - this.sizeUploaded();\n      if (delta && !this.averageSpeed) {\n        return Number.POSITIVE_INFINITY;\n      }\n      if (!delta && !this.averageSpeed) {\n        return 0;\n      }\n      return Math.floor(delta / this.averageSpeed);\n    },\n\n    /**\n     * Get file type\n     * @function\n     * @returns {string}\n     */\n    getType: function () {\n      return this.file.type && this.file.type.split('/')[1];\n    },\n\n    /**\n     * Get file extension\n     * @function\n     * @returns {string}\n     */\n    getExtension: function () {\n      return this.name.substr((~-this.name.lastIndexOf(\".\") >>> 0) + 2).toLowerCase();\n    }\n  };\n\n  /**\n   * Default read function using the webAPI\n   *\n   * @function webAPIFileRead(fileObj, startByte, endByte, fileType, chunk)\n   *\n   */\n  function webAPIFileRead(fileObj, startByte, endByte, fileType, chunk) {\n    var function_name = 'slice';\n\n    if (fileObj.file.slice)\n      function_name =  'slice';\n    else if (fileObj.file.mozSlice)\n      function_name = 'mozSlice';\n    else if (fileObj.file.webkitSlice)\n      function_name = 'webkitSlice';\n\n    chunk.readFinished(fileObj.file[function_name](startByte, endByte, fileType));\n  }\n\n\n  /**\n   * Class for storing a single chunk\n   * @name FlowChunk\n   * @param {Flow} flowObj\n   * @param {FlowFile} fileObj\n   * @param {number} offset\n   * @constructor\n   */\n  function FlowChunk(flowObj, fileObj, offset) {\n\n    /**\n     * Reference to parent flow object\n     * @type {Flow}\n     */\n    this.flowObj = flowObj;\n\n    /**\n     * Reference to parent FlowFile object\n     * @type {FlowFile}\n     */\n    this.fileObj = fileObj;\n\n    /**\n     * File offset\n     * @type {number}\n     */\n    this.offset = offset;\n\n    /**\n     * Indicates if chunk existence was checked on the server\n     * @type {boolean}\n     */\n    this.tested = false;\n\n    /**\n     * Number of retries performed\n     * @type {number}\n     */\n    this.retries = 0;\n\n    /**\n     * Pending retry\n     * @type {boolean}\n     */\n    this.pendingRetry = false;\n\n    /**\n     * Preprocess state\n     * @type {number} 0 = unprocessed, 1 = processing, 2 = finished\n     */\n    this.preprocessState = 0;\n\n    /**\n     * Read state\n     * @type {number} 0 = not read, 1 = reading, 2 = finished\n     */\n    this.readState = 0;\n\n\n    /**\n     * Bytes transferred from total request size\n     * @type {number}\n     */\n    this.loaded = 0;\n\n    /**\n     * Total request size\n     * @type {number}\n     */\n    this.total = 0;\n\n    /**\n     * Size of a chunk\n     * @type {number}\n     */\n    this.chunkSize = this.fileObj.chunkSize;\n\n    /**\n     * Chunk start byte in a file\n     * @type {number}\n     */\n    this.startByte = this.offset * this.chunkSize;\n\n    /**\n     * A specific filename for this chunk which otherwise default to the main name\n     * @type {string}\n     */\n    this.filename = null;\n\n    /**\n      * Compute the endbyte in a file\n      *\n      */\n    this.computeEndByte = function() {\n      var endByte = Math.min(this.fileObj.size, (this.offset + 1) * this.chunkSize);\n      if (this.fileObj.size - endByte < this.chunkSize && !this.flowObj.opts.forceChunkSize) {\n        // The last chunk will be bigger than the chunk size,\n        // but less than 2 * this.chunkSize\n        endByte = this.fileObj.size;\n      }\n      return endByte;\n    }\n\n    /**\n     * Chunk end byte in a file\n     * @type {number}\n     */\n    this.endByte = this.computeEndByte();\n\n    /**\n     * XMLHttpRequest\n     * @type {XMLHttpRequest}\n     */\n    this.xhr = null;\n\n    var $ = this;\n\n    /**\n     * Send chunk event\n     * @param event\n     * @param {...} args arguments of a callback\n     */\n    this.event = function (event, args) {\n      args = Array.prototype.slice.call(arguments);\n      args.unshift($);\n      $.fileObj.chunkEvent.apply($.fileObj, args);\n    };\n    /**\n     * Catch progress event\n     * @param {ProgressEvent} event\n     */\n    this.progressHandler = function(event) {\n      if (event.lengthComputable) {\n        $.loaded = event.loaded ;\n        $.total = event.total;\n      }\n      $.event('progress', event);\n    };\n\n    /**\n     * Catch test event\n     * @param {Event} event\n     */\n    this.testHandler = function(event) {\n      var status = $.status(true);\n      if (status === 'error') {\n        $.event(status, $.message());\n        $.flowObj.uploadNextChunk();\n      } else if (status === 'success') {\n        $.tested = true;\n        $.event(status, $.message());\n        $.flowObj.uploadNextChunk();\n      } else if (!$.fileObj.paused) {\n        // Error might be caused by file pause method\n        // Chunks does not exist on the server side\n        $.tested = true;\n        $.send();\n      }\n    };\n\n    /**\n     * Upload has stopped\n     * @param {Event} event\n     */\n    this.doneHandler = function(event) {\n      var status = $.status();\n      if (status === 'success' || status === 'error') {\n        delete this.data;\n        $.event(status, $.message());\n        $.flowObj.uploadNextChunk();\n      } else if (!$.fileObj.paused) {\n        $.event('retry', $.message());\n        $.pendingRetry = true;\n        $.abort();\n        $.retries++;\n        var retryInterval = $.flowObj.opts.chunkRetryInterval;\n        if (retryInterval !== null) {\n          setTimeout(function () {\n            $.send();\n          }, retryInterval);\n        } else {\n          $.send();\n        }\n      }\n    };\n  }\n\n  FlowChunk.prototype = {\n    /**\n     * Get params for a request\n     * @function\n     */\n    getParams: function () {\n      return {\n        flowChunkNumber: this.offset + 1,\n        flowChunkSize: this.chunkSize,\n        flowCurrentChunkSize: this.endByte - this.startByte,\n        flowTotalSize: this.fileObj.size,\n        flowIdentifier: this.fileObj.uniqueIdentifier,\n        flowFilename: this.fileObj.name,\n        flowRelativePath: this.fileObj.relativePath,\n        flowTotalChunks: this.fileObj.chunks.length\n      };\n    },\n\n    /**\n     * Get target option with query params\n     * @function\n     * @param params\n     * @returns {string}\n     */\n    getTarget: function(target, params){\n      if (params.length == 0) {\n\treturn target;\n      }\n\n      if(target.indexOf('?') < 0) {\n        target += '?';\n      } else {\n        target += '&';\n      }\n      return target + params.join('&');\n    },\n\n    /**\n     * Makes a GET request without any data to see if the chunk has already\n     * been uploaded in a previous session\n     * @function\n     */\n    test: function () {\n      // Set up request and listen for event\n      this.xhr = new XMLHttpRequest();\n      this.xhr.addEventListener(\"load\", this.testHandler, false);\n      this.xhr.addEventListener(\"error\", this.testHandler, false);\n      var testMethod = evalOpts(this.flowObj.opts.testMethod, this.fileObj, this);\n      var data = this.prepareXhrRequest(testMethod, true);\n      this.xhr.send(data);\n    },\n\n    /**\n     * Finish preprocess state\n     * @function\n     */\n    preprocessFinished: function () {\n      // Re-compute the endByte after the preprocess function to allow an\n      // implementer of preprocess to set the fileObj size\n      this.endByte = this.computeEndByte();\n\n      this.preprocessState = 2;\n      this.send();\n    },\n\n    /**\n     * Finish read state\n     * @function\n     */\n    readFinished: function (bytes) {\n      this.readState = 2;\n      this.bytes = bytes;\n      this.send();\n    },\n\n\n    /**\n     * Uploads the actual data in a POST call\n     * @function\n     */\n    send: function () {\n      var preprocess = this.flowObj.opts.preprocess;\n      var read = this.flowObj.opts.readFileFn;\n      if (typeof preprocess === 'function') {\n        switch (this.preprocessState) {\n          case 0:\n            this.preprocessState = 1;\n            preprocess(this);\n            return;\n          case 1:\n            return;\n        }\n      }\n      switch (this.readState) {\n        case 0:\n          this.readState = 1;\n          read(this.fileObj, this.startByte, this.endByte, this.fileObj.file.type, this);\n          return;\n        case 1:\n          return;\n      }\n      if (this.flowObj.opts.testChunks && !this.tested) {\n        this.test();\n        return;\n      }\n\n      this.loaded = 0;\n      this.total = 0;\n      this.pendingRetry = false;\n\n      // Set up request and listen for event\n      this.xhr = new XMLHttpRequest();\n      this.xhr.upload.addEventListener('progress', this.progressHandler, false);\n      this.xhr.addEventListener(\"load\", this.doneHandler, false);\n      this.xhr.addEventListener(\"error\", this.doneHandler, false);\n\n      var uploadMethod = evalOpts(this.flowObj.opts.uploadMethod, this.fileObj, this);\n      var data = this.prepareXhrRequest(uploadMethod, false, this.flowObj.opts.method, this.bytes);\n      var changeRawDataBeforeSend = this.flowObj.opts.changeRawDataBeforeSend;\n      if (typeof changeRawDataBeforeSend === 'function') {\n        data = changeRawDataBeforeSend(this, data);\n      }\n      this.xhr.send(data);\n    },\n\n    /**\n     * Abort current xhr request\n     * @function\n     */\n    abort: function () {\n      // Abort and reset\n      var xhr = this.xhr;\n      this.xhr = null;\n      if (xhr) {\n        xhr.abort();\n      }\n    },\n\n    /**\n     * Retrieve current chunk upload status\n     * @function\n     * @returns {string} 'pending', 'uploading', 'success', 'error'\n     */\n    status: function (isTest) {\n      if (this.readState === 1) {\n        return 'reading';\n      } else if (this.pendingRetry || this.preprocessState === 1) {\n        // if pending retry then that's effectively the same as actively uploading,\n        // there might just be a slight delay before the retry starts\n        return 'uploading';\n      } else if (!this.xhr) {\n        return 'pending';\n      } else if (this.xhr.readyState < 4) {\n        // Status is really 'OPENED', 'HEADERS_RECEIVED'\n        // or 'LOADING' - meaning that stuff is happening\n        return 'uploading';\n      } else {\n        if (this.flowObj.opts.successStatuses.indexOf(this.xhr.status) > -1) {\n          // HTTP 200, perfect\n\t\t      // HTTP 202 Accepted - The request has been accepted for processing, but the processing has not been completed.\n          return 'success';\n        } else if (this.flowObj.opts.permanentErrors.indexOf(this.xhr.status) > -1 ||\n            !isTest && this.retries >= this.flowObj.opts.maxChunkRetries) {\n          // HTTP 413/415/500/501, permanent error\n          return 'error';\n        } else {\n          // this should never happen, but we'll reset and queue a retry\n          // a likely case for this would be 503 service unavailable\n          this.abort();\n          return 'pending';\n        }\n      }\n    },\n\n    /**\n     * Get response from xhr request\n     * @function\n     * @returns {String}\n     */\n    message: function () {\n      return this.xhr ? this.xhr.responseText : '';\n    },\n\n    /**\n     * Get upload progress\n     * @function\n     * @returns {number}\n     */\n    progress: function () {\n      if (this.pendingRetry) {\n        return 0;\n      }\n      var s = this.status();\n      if (s === 'success' || s === 'error') {\n        return 1;\n      } else if (s === 'pending') {\n        return 0;\n      } else {\n        return this.total > 0 ? this.loaded / this.total : 0;\n      }\n    },\n\n    /**\n     * Count total size uploaded\n     * @function\n     * @returns {number}\n     */\n    sizeUploaded: function () {\n      var size = this.endByte - this.startByte;\n      // can't return only chunk.loaded value, because it is bigger than chunk size\n      if (this.status() !== 'success') {\n        size = this.progress() * size;\n      }\n      return size;\n    },\n\n    /**\n     * Prepare Xhr request. Set query, headers and data\n     * @param {string} method GET or POST\n     * @param {bool} isTest is this a test request\n     * @param {string} [paramsMethod] octet or form\n     * @param {Blob} [blob] to send\n     * @returns {FormData|Blob|Null} data to send\n     */\n    prepareXhrRequest: function(method, isTest, paramsMethod, blob) {\n      // Add data from the query options\n      var query = evalOpts(this.flowObj.opts.query, this.fileObj, this, isTest);\n      query = extend(query || {}, this.getParams());\n\n      var target = evalOpts(this.flowObj.opts.target, this.fileObj, this, isTest);\n      var data = null;\n      if (method === 'GET' || paramsMethod === 'octet') {\n        // Add data from the query options\n        var params = [];\n        each(query, function (v, k) {\n          params.push([encodeURIComponent(k), encodeURIComponent(v)].join('='));\n        });\n        target = this.getTarget(target, params);\n        data = blob || null;\n      } else {\n        // Add data from the query options\n        data = new FormData();\n        each(query, function (v, k) {\n          data.append(k, v);\n        });\n        if (typeof blob !== \"undefined\") {\n            data.append(this.flowObj.opts.fileParameterName, blob, this.filename || this.fileObj.file.name);\n        }\n      }\n\n      this.xhr.open(method, target, true);\n      this.xhr.withCredentials = this.flowObj.opts.withCredentials;\n\n      // Add data from header options\n      each(evalOpts(this.flowObj.opts.headers, this.fileObj, this, isTest), function (v, k) {\n        this.xhr.setRequestHeader(k, v);\n      }, this);\n\n      return data;\n    }\n  };\n\n  /**\n   * Remove value from array\n   * @param array\n   * @param value\n   */\n  function arrayRemove(array, value) {\n    var index = array.indexOf(value);\n    if (index > -1) {\n      array.splice(index, 1);\n    }\n  }\n\n  /**\n   * If option is a function, evaluate it with given params\n   * @param {*} data\n   * @param {...} args arguments of a callback\n   * @returns {*}\n   */\n  function evalOpts(data, args) {\n    if (typeof data === \"function\") {\n      // `arguments` is an object, not array, in FF, so:\n      args = Array.prototype.slice.call(arguments);\n      data = data.apply(null, args.slice(1));\n    }\n    return data;\n  }\n  Flow.evalOpts = evalOpts;\n\n  /**\n   * Execute function asynchronously\n   * @param fn\n   * @param context\n   */\n  function async(fn, context) {\n    setTimeout(fn.bind(context), 0);\n  }\n\n  /**\n   * Extends the destination object `dst` by copying all of the properties from\n   * the `src` object(s) to `dst`. You can specify multiple `src` objects.\n   * @function\n   * @param {Object} dst Destination object.\n   * @param {...Object} src Source object(s).\n   * @returns {Object} Reference to `dst`.\n   */\n  function extend(dst, src) {\n    each(arguments, function(obj) {\n      if (obj !== dst) {\n        each(obj, function(value, key){\n          dst[key] = value;\n        });\n      }\n    });\n    return dst;\n  }\n  Flow.extend = extend;\n\n  /**\n   * Iterate each element of an object\n   * @function\n   * @param {Array|Object} obj object or an array to iterate\n   * @param {Function} callback first argument is a value and second is a key.\n   * @param {Object=} context Object to become context (`this`) for the iterator function.\n   */\n  function each(obj, callback, context) {\n    if (!obj) {\n      return ;\n    }\n    var key;\n    // Is Array?\n    // Array.isArray won't work, not only arrays can be iterated by index https://github.com/flowjs/ng-flow/issues/236#\n    if (typeof(obj.length) !== 'undefined') {\n      for (key = 0; key < obj.length; key++) {\n        if (callback.call(context, obj[key], key) === false) {\n          return ;\n        }\n      }\n    } else {\n      for (key in obj) {\n        if (obj.hasOwnProperty(key) && callback.call(context, obj[key], key) === false) {\n          return ;\n        }\n      }\n    }\n  }\n  Flow.each = each;\n\n  /**\n   * FlowFile constructor\n   * @type {FlowFile}\n   */\n  Flow.FlowFile = FlowFile;\n\n  /**\n   * FlowFile constructor\n   * @type {FlowChunk}\n   */\n  Flow.FlowChunk = FlowChunk;\n\n  /**\n   * Library version\n   * @type {string}\n   */\n  Flow.version = '2.14.1';\n\n  if ( typeof module === \"object\" && module && typeof module.exports === \"object\" ) {\n    // Expose Flow as module.exports in loaders that implement the Node\n    // module pattern (including browserify). Do not create the global, since\n    // the user will be storing it themselves locally, and globals are frowned\n    // upon in the Node module world.\n    module.exports = Flow;\n  } else {\n    // Otherwise expose Flow to the global object as usual\n    window.Flow = Flow;\n\n    // Register as a named AMD module, since Flow can be concatenated with other\n    // files that may use define, but not via a proper concatenation script that\n    // understands anonymous AMD modules. A named AMD is safest and most robust\n    // way to register. Lowercase flow is used because AMD module names are\n    // derived from file names, and Flow is normally delivered in a lowercase\n    // file name. Do this after creating the global so that if an AMD module wants\n    // to call noConflict to hide this version of Flow, it will work.\n    if ( typeof define === \"function\" && define.amd ) {\n      define( \"flow\", [], function () { return Flow; } );\n    }\n  }\n})(typeof window !== 'undefined' && window, typeof document !== 'undefined' && document);\n\n/**\n * @description\n * var app = angular.module('App', ['flow.provider'], function(flowFactoryProvider){\n *    flowFactoryProvider.defaults = {target: '/'};\n * });\n * @name flowFactoryProvider\n */\nangular.module('flow.provider', [])\n.provider('flowFactory', function() {\n  'use strict';\n  /**\n   * Define the default properties for flow.js\n   * @name flowFactoryProvider.defaults\n   * @type {Object}\n   */\n  this.defaults = {};\n\n  /**\n   * Flow, MaybeFlow or NotFlow\n   * @name flowFactoryProvider.factory\n   * @type {function}\n   * @return {Flow}\n   */\n  this.factory = function (options) {\n    return new Flow(options);\n  };\n\n  /**\n   * Define the default events\n   * @name flowFactoryProvider.events\n   * @type {Array}\n   * @private\n   */\n  this.events = [];\n\n  /**\n   * Add default events\n   * @name flowFactoryProvider.on\n   * @function\n   * @param {string} event\n   * @param {Function} callback\n   */\n  this.on = function (event, callback) {\n    this.events.push([event, callback]);\n  };\n\n  this.$get = function() {\n    var fn = this.factory;\n    var defaults = this.defaults;\n    var events = this.events;\n    return {\n      'create': function(opts) {\n        // combine default options with global options and options\n        var flow = fn(angular.extend({}, defaults, opts));\n        angular.forEach(events, function (event) {\n          flow.on(event[0], event[1]);\n        });\n        return flow;\n      }\n    };\n  };\n});\nangular.module('flow.init', ['flow.provider'])\n  .controller('flowCtrl', ['$scope', '$attrs', '$parse', 'flowFactory',\n  function ($scope, $attrs, $parse, flowFactory) {\n\n    var options = angular.extend({}, $scope.$eval($attrs.flowInit));\n\n    // use existing flow object or create a new one\n    var flow  = $scope.$eval($attrs.flowObject) || flowFactory.create(options);\n\n    var catchAllHandler = function(eventName){\n      var args = Array.prototype.slice.call(arguments);\n      args.shift();\n      var event = $scope.$broadcast.apply($scope, ['flow::' + eventName, flow].concat(args));\n      if ({\n        'progress':1, 'filesSubmitted':1, 'fileSuccess': 1, 'fileError': 1, 'complete': 1\n      }[eventName]) {\n        $scope.$apply();\n      }\n      if (event.defaultPrevented) {\n        return false;\n      }\n    };\n\n    flow.on('catchAll', catchAllHandler);\n    $scope.$on('$destroy', function(){\n        flow.off('catchAll', catchAllHandler);\n    });\n\n    $scope.$flow = flow;\n\n    if ($attrs.hasOwnProperty('flowName')) {\n      $parse($attrs.flowName).assign($scope, flow);\n      $scope.$on('$destroy', function () {\n        $parse($attrs.flowName).assign($scope);\n      });\n    }\n  }])\n  .directive('flowInit', [function() {\n    return {\n      scope: true,\n      controller: 'flowCtrl'\n    };\n  }]);\nangular.module('flow.btn', ['flow.init'])\n.directive('flowBtn', [function() {\n  return {\n    'restrict': 'EA',\n    'scope': false,\n    'require': '^flowInit',\n    'link': function(scope, element, attrs) {\n      var isDirectory = attrs.hasOwnProperty('flowDirectory');\n      var isSingleFile = attrs.hasOwnProperty('flowSingleFile');\n      var inputAttrs = attrs.hasOwnProperty('flowAttrs') && scope.$eval(attrs.flowAttrs);\n      scope.$flow.assignBrowse(element, isDirectory, isSingleFile, inputAttrs);\n    }\n  };\n}]);\nangular.module('flow.dragEvents', ['flow.init'])\n/**\n * @name flowPreventDrop\n * Prevent loading files then dropped on element\n */\n  .directive('flowPreventDrop', function() {\n    return {\n      'scope': false,\n      'link': function(scope, element, attrs) {\n        element.bind('drop dragover', function (event) {\n          event.preventDefault();\n        });\n      }\n    };\n  })\n/**\n * @name flowDragEnter\n * executes `flowDragEnter` and `flowDragLeave` events\n */\n  .directive('flowDragEnter', ['$timeout', function($timeout) {\n    return {\n      'scope': false,\n      'link': function(scope, element, attrs) {\n        var promise;\n        var enter = false;\n        element.bind('dragover', function (event) {\n          if (!isFileDrag(event)) {\n            return ;\n          }\n          if (!enter) {\n            scope.$apply(attrs.flowDragEnter);\n            enter = true;\n          }\n          $timeout.cancel(promise);\n          event.preventDefault();\n        });\n        element.bind('dragleave drop', function (event) {\n          $timeout.cancel(promise);\n          promise = $timeout(function () {\n            scope.$eval(attrs.flowDragLeave);\n            promise = null;\n            enter = false;\n          }, 100);\n        });\n        function isFileDrag(dragEvent) {\n          var fileDrag = false;\n          var dataTransfer = dragEvent.dataTransfer || dragEvent.originalEvent.dataTransfer;\n          angular.forEach(dataTransfer && dataTransfer.types, function(val) {\n            if (val === 'Files') {\n              fileDrag = true;\n            }\n          });\n          return fileDrag;\n        }\n      }\n    };\n  }]);\n\nangular.module('flow.drop', ['flow.init'])\n.directive('flowDrop', function() {\n  return {\n    'scope': false,\n    'require': '^flowInit',\n    'link': function(scope, element, attrs) {\n      if (attrs.flowDropEnabled) {\n        scope.$watch(attrs.flowDropEnabled, function (value) {\n          if (value) {\n            assignDrop();\n          } else {\n            unAssignDrop();\n          }\n        });\n      } else {\n        assignDrop();\n      }\n      function assignDrop() {\n        scope.$flow.assignDrop(element);\n      }\n      function unAssignDrop() {\n        scope.$flow.unAssignDrop(element);\n      }\n    }\n  };\n});\n\n!function (angular) {'use strict';\n  var module = angular.module('flow.events', ['flow.init']);\n  var events = {\n    fileSuccess: ['$file', '$message'],\n    fileProgress: ['$file'],\n    fileAdded: ['$file', '$event'],\n    filesAdded: ['$files', '$event'],\n    filesSubmitted: ['$files', '$event'],\n    fileRetry: ['$file'],\n    fileError: ['$file', '$message'],\n    uploadStart: [],\n    complete: [],\n    progress: [],\n    error: ['$message', '$file']\n  };\n\n  angular.forEach(events, function (eventArgs, eventName) {\n    var name = 'flow' + capitaliseFirstLetter(eventName);\n    if (name == 'flowUploadStart') {\n      name = 'flowUploadStarted';// event alias\n    }\n    module.directive(name, [function() {\n      return {\n        require: '^flowInit',\n        controller: ['$scope', '$attrs', function ($scope, $attrs) {\n          $scope.$on('flow::' + eventName, function () {\n            var funcArgs = Array.prototype.slice.call(arguments);\n            var event = funcArgs.shift();// remove angular event\n            // remove flow object and ignore event if it is from parent directive\n            if ($scope.$flow !== funcArgs.shift()) {\n              return ;\n            }\n            var args = {};\n            angular.forEach(eventArgs, function(value, key) {\n              args[value] = funcArgs[key];\n            });\n            if ($scope.$eval($attrs[name], args) === false) {\n              event.preventDefault();\n            }\n          });\n        }]\n      };\n    }]);\n  });\n\n  function capitaliseFirstLetter(string) {\n    return string.charAt(0).toUpperCase() + string.slice(1);\n  }\n}(angular);\nangular.module('flow.img', ['flow.init'])\n.directive('flowImg', [function() {\n  return {\n    'scope': false,\n    'require': '^flowInit',\n    'link': function(scope, element, attrs) {\n      var file = attrs.flowImg;\n      scope.$watch(file, function (file) {\n        if (!file) {\n          return ;\n        }\n        var fileReader = new FileReader();\n        fileReader.readAsDataURL(file.file);\n        fileReader.onload = function (event) {\n          scope.$apply(function () {\n            attrs.$set('src', event.target.result);\n          });\n        };\n      });\n    }\n  };\n}]);\nangular.module('flow.transfers', ['flow.init'])\n.directive('flowTransfers', [function() {\n  return {\n    'scope': true,\n    'require': '^flowInit',\n    'link': function(scope) {\n      scope.transfers = scope.$flow.files;\n    }\n  };\n}]);\nangular.module('flow', ['flow.provider', 'flow.init', 'flow.events', 'flow.btn',\n  'flow.drop', 'flow.transfers', 'flow.img', 'flow.dragEvents']);\n(function (global, factory) {\n\ttypeof exports === 'object' && typeof module !== 'undefined' ? module.exports = factory() :\n\ttypeof define === 'function' && define.amd ? define(factory) :\n\t(global.c3 = factory());\n}(this, (function () { 'use strict';\n\nvar CLASS = {\n    target: 'c3-target',\n    chart: 'c3-chart',\n    chartLine: 'c3-chart-line',\n    chartLines: 'c3-chart-lines',\n    chartBar: 'c3-chart-bar',\n    chartBars: 'c3-chart-bars',\n    chartText: 'c3-chart-text',\n    chartTexts: 'c3-chart-texts',\n    chartArc: 'c3-chart-arc',\n    chartArcs: 'c3-chart-arcs',\n    chartArcsTitle: 'c3-chart-arcs-title',\n    chartArcsBackground: 'c3-chart-arcs-background',\n    chartArcsGaugeUnit: 'c3-chart-arcs-gauge-unit',\n    chartArcsGaugeMax: 'c3-chart-arcs-gauge-max',\n    chartArcsGaugeMin: 'c3-chart-arcs-gauge-min',\n    selectedCircle: 'c3-selected-circle',\n    selectedCircles: 'c3-selected-circles',\n    eventRect: 'c3-event-rect',\n    eventRects: 'c3-event-rects',\n    eventRectsSingle: 'c3-event-rects-single',\n    eventRectsMultiple: 'c3-event-rects-multiple',\n    zoomRect: 'c3-zoom-rect',\n    brush: 'c3-brush',\n    focused: 'c3-focused',\n    defocused: 'c3-defocused',\n    region: 'c3-region',\n    regions: 'c3-regions',\n    title: 'c3-title',\n    tooltipContainer: 'c3-tooltip-container',\n    tooltip: 'c3-tooltip',\n    tooltipName: 'c3-tooltip-name',\n    shape: 'c3-shape',\n    shapes: 'c3-shapes',\n    line: 'c3-line',\n    lines: 'c3-lines',\n    bar: 'c3-bar',\n    bars: 'c3-bars',\n    circle: 'c3-circle',\n    circles: 'c3-circles',\n    arc: 'c3-arc',\n    arcs: 'c3-arcs',\n    area: 'c3-area',\n    areas: 'c3-areas',\n    empty: 'c3-empty',\n    text: 'c3-text',\n    texts: 'c3-texts',\n    gaugeValue: 'c3-gauge-value',\n    grid: 'c3-grid',\n    gridLines: 'c3-grid-lines',\n    xgrid: 'c3-xgrid',\n    xgrids: 'c3-xgrids',\n    xgridLine: 'c3-xgrid-line',\n    xgridLines: 'c3-xgrid-lines',\n    xgridFocus: 'c3-xgrid-focus',\n    ygrid: 'c3-ygrid',\n    ygrids: 'c3-ygrids',\n    ygridLine: 'c3-ygrid-line',\n    ygridLines: 'c3-ygrid-lines',\n    axis: 'c3-axis',\n    axisX: 'c3-axis-x',\n    axisXLabel: 'c3-axis-x-label',\n    axisY: 'c3-axis-y',\n    axisYLabel: 'c3-axis-y-label',\n    axisY2: 'c3-axis-y2',\n    axisY2Label: 'c3-axis-y2-label',\n    legendBackground: 'c3-legend-background',\n    legendItem: 'c3-legend-item',\n    legendItemEvent: 'c3-legend-item-event',\n    legendItemTile: 'c3-legend-item-tile',\n    legendItemHidden: 'c3-legend-item-hidden',\n    legendItemFocused: 'c3-legend-item-focused',\n    dragarea: 'c3-dragarea',\n    EXPANDED: '_expanded_',\n    SELECTED: '_selected_',\n    INCLUDED: '_included_'\n};\n\nvar _typeof = typeof Symbol === \"function\" && typeof Symbol.iterator === \"symbol\" ? function (obj) {\n  return typeof obj;\n} : function (obj) {\n  return obj && typeof Symbol === \"function\" && obj.constructor === Symbol && obj !== Symbol.prototype ? \"symbol\" : typeof obj;\n};\n\n\n\n\n\n\n\n\n\n\n\nvar classCallCheck = function (instance, Constructor) {\n  if (!(instance instanceof Constructor)) {\n    throw new TypeError(\"Cannot call a class as a function\");\n  }\n};\n\n\n\n\n\n\n\n\n\n\n\nvar inherits = function (subClass, superClass) {\n  if (typeof superClass !== \"function\" && superClass !== null) {\n    throw new TypeError(\"Super expression must either be null or a function, not \" + typeof superClass);\n  }\n\n  subClass.prototype = Object.create(superClass && superClass.prototype, {\n    constructor: {\n      value: subClass,\n      enumerable: false,\n      writable: true,\n      configurable: true\n    }\n  });\n  if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass;\n};\n\n\n\n\n\n\n\n\n\n\n\nvar possibleConstructorReturn = function (self, call) {\n  if (!self) {\n    throw new ReferenceError(\"this hasn't been initialised - super() hasn't been called\");\n  }\n\n  return call && (typeof call === \"object\" || typeof call === \"function\") ? call : self;\n};\n\nvar isValue = function isValue(v) {\n    return v || v === 0;\n};\nvar isFunction = function isFunction(o) {\n    return typeof o === 'function';\n};\nvar isArray = function isArray(o) {\n    return Array.isArray(o);\n};\nvar isString = function isString(o) {\n    return typeof o === 'string';\n};\nvar isUndefined = function isUndefined(v) {\n    return typeof v === 'undefined';\n};\nvar isDefined = function isDefined(v) {\n    return typeof v !== 'undefined';\n};\nvar ceil10 = function ceil10(v) {\n    return Math.ceil(v / 10) * 10;\n};\nvar asHalfPixel = function asHalfPixel(n) {\n    return Math.ceil(n) + 0.5;\n};\nvar diffDomain = function diffDomain(d) {\n    return d[1] - d[0];\n};\nvar isEmpty = function isEmpty(o) {\n    return typeof o === 'undefined' || o === null || isString(o) && o.length === 0 || (typeof o === 'undefined' ? 'undefined' : _typeof(o)) === 'object' && Object.keys(o).length === 0;\n};\nvar notEmpty = function notEmpty(o) {\n    return !c3_chart_internal_fn.isEmpty(o);\n};\nvar getOption = function getOption(options, key, defaultValue) {\n    return isDefined(options[key]) ? options[key] : defaultValue;\n};\nvar hasValue = function hasValue(dict, value) {\n    var found = false;\n    Object.keys(dict).forEach(function (key) {\n        if (dict[key] === value) {\n            found = true;\n        }\n    });\n    return found;\n};\nvar sanitise = function sanitise(str) {\n    return typeof str === 'string' ? str.replace(/</g, '&lt;').replace(/>/g, '&gt;') : str;\n};\nvar getPathBox = function getPathBox(path) {\n    var box = path.getBoundingClientRect(),\n        items = [path.pathSegList.getItem(0), path.pathSegList.getItem(1)],\n        minX = items[0].x,\n        minY = Math.min(items[0].y, items[1].y);\n    return { x: minX, y: minY, width: box.width, height: box.height };\n};\n\nvar c3_axis_fn;\nvar c3_axis_internal_fn;\n\nfunction AxisInternal(component, params) {\n    var internal = this;\n    internal.component = component;\n    internal.params = params || {};\n\n    internal.d3 = component.d3;\n    internal.scale = internal.d3.scale.linear();\n    internal.range;\n    internal.orient = \"bottom\";\n    internal.innerTickSize = 6;\n    internal.outerTickSize = this.params.withOuterTick ? 6 : 0;\n    internal.tickPadding = 3;\n    internal.tickValues = null;\n    internal.tickFormat;\n    internal.tickArguments;\n\n    internal.tickOffset = 0;\n    internal.tickCulling = true;\n    internal.tickCentered;\n    internal.tickTextCharSize;\n    internal.tickTextRotate = internal.params.tickTextRotate;\n    internal.tickLength;\n\n    internal.axis = internal.generateAxis();\n}\nc3_axis_internal_fn = AxisInternal.prototype;\n\nc3_axis_internal_fn.axisX = function (selection, x, tickOffset) {\n    selection.attr(\"transform\", function (d) {\n        return \"translate(\" + Math.ceil(x(d) + tickOffset) + \", 0)\";\n    });\n};\nc3_axis_internal_fn.axisY = function (selection, y) {\n    selection.attr(\"transform\", function (d) {\n        return \"translate(0,\" + Math.ceil(y(d)) + \")\";\n    });\n};\nc3_axis_internal_fn.scaleExtent = function (domain) {\n    var start = domain[0],\n        stop = domain[domain.length - 1];\n    return start < stop ? [start, stop] : [stop, start];\n};\nc3_axis_internal_fn.generateTicks = function (scale) {\n    var internal = this;\n    var i,\n        domain,\n        ticks = [];\n    if (scale.ticks) {\n        return scale.ticks.apply(scale, internal.tickArguments);\n    }\n    domain = scale.domain();\n    for (i = Math.ceil(domain[0]); i < domain[1]; i++) {\n        ticks.push(i);\n    }\n    if (ticks.length > 0 && ticks[0] > 0) {\n        ticks.unshift(ticks[0] - (ticks[1] - ticks[0]));\n    }\n    return ticks;\n};\nc3_axis_internal_fn.copyScale = function () {\n    var internal = this;\n    var newScale = internal.scale.copy(),\n        domain;\n    if (internal.params.isCategory) {\n        domain = internal.scale.domain();\n        newScale.domain([domain[0], domain[1] - 1]);\n    }\n    return newScale;\n};\nc3_axis_internal_fn.textFormatted = function (v) {\n    var internal = this,\n        formatted = internal.tickFormat ? internal.tickFormat(v) : v;\n    return typeof formatted !== 'undefined' ? formatted : '';\n};\nc3_axis_internal_fn.updateRange = function () {\n    var internal = this;\n    internal.range = internal.scale.rangeExtent ? internal.scale.rangeExtent() : internal.scaleExtent(internal.scale.range());\n    return internal.range;\n};\nc3_axis_internal_fn.updateTickTextCharSize = function (tick) {\n    var internal = this;\n    if (internal.tickTextCharSize) {\n        return internal.tickTextCharSize;\n    }\n    var size = {\n        h: 11.5,\n        w: 5.5\n    };\n    tick.select('text').text(function (d) {\n        return internal.textFormatted(d);\n    }).each(function (d) {\n        var box = this.getBoundingClientRect(),\n            text = internal.textFormatted(d),\n            h = box.height,\n            w = text ? box.width / text.length : undefined;\n        if (h && w) {\n            size.h = h;\n            size.w = w;\n        }\n    }).text('');\n    internal.tickTextCharSize = size;\n    return size;\n};\nc3_axis_internal_fn.transitionise = function (selection) {\n    return this.params.withoutTransition ? selection : this.d3.transition(selection);\n};\nc3_axis_internal_fn.isVertical = function () {\n    return this.orient === 'left' || this.orient === 'right';\n};\nc3_axis_internal_fn.tspanData = function (d, i, ticks, scale) {\n    var internal = this;\n    var splitted = internal.params.tickMultiline ? internal.splitTickText(d, ticks, scale) : [].concat(internal.textFormatted(d));\n    return splitted.map(function (s) {\n        return { index: i, splitted: s, length: splitted.length };\n    });\n};\nc3_axis_internal_fn.splitTickText = function (d, ticks, scale) {\n    var internal = this,\n        tickText = internal.textFormatted(d),\n        maxWidth = internal.params.tickWidth,\n        subtext,\n        spaceIndex,\n        textWidth,\n        splitted = [];\n\n    if (Object.prototype.toString.call(tickText) === \"[object Array]\") {\n        return tickText;\n    }\n\n    if (!maxWidth || maxWidth <= 0) {\n        maxWidth = internal.isVertical() ? 95 : internal.params.isCategory ? Math.ceil(scale(ticks[1]) - scale(ticks[0])) - 12 : 110;\n    }\n\n    function split(splitted, text) {\n        spaceIndex = undefined;\n        for (var i = 1; i < text.length; i++) {\n            if (text.charAt(i) === ' ') {\n                spaceIndex = i;\n            }\n            subtext = text.substr(0, i + 1);\n            textWidth = internal.tickTextCharSize.w * subtext.length;\n            // if text width gets over tick width, split by space index or crrent index\n            if (maxWidth < textWidth) {\n                return split(splitted.concat(text.substr(0, spaceIndex ? spaceIndex : i)), text.slice(spaceIndex ? spaceIndex + 1 : i));\n            }\n        }\n        return splitted.concat(text);\n    }\n\n    return split(splitted, tickText + \"\");\n};\nc3_axis_internal_fn.updateTickLength = function () {\n    var internal = this;\n    internal.tickLength = Math.max(internal.innerTickSize, 0) + internal.tickPadding;\n};\nc3_axis_internal_fn.lineY2 = function (d) {\n    var internal = this,\n        tickPosition = internal.scale(d) + (internal.tickCentered ? 0 : internal.tickOffset);\n    return internal.range[0] < tickPosition && tickPosition < internal.range[1] ? internal.innerTickSize : 0;\n};\nc3_axis_internal_fn.textY = function () {\n    var internal = this,\n        rotate = internal.tickTextRotate;\n    return rotate ? 11.5 - 2.5 * (rotate / 15) * (rotate > 0 ? 1 : -1) : internal.tickLength;\n};\nc3_axis_internal_fn.textTransform = function () {\n    var internal = this,\n        rotate = internal.tickTextRotate;\n    return rotate ? \"rotate(\" + rotate + \")\" : \"\";\n};\nc3_axis_internal_fn.textTextAnchor = function () {\n    var internal = this,\n        rotate = internal.tickTextRotate;\n    return rotate ? rotate > 0 ? \"start\" : \"end\" : \"middle\";\n};\nc3_axis_internal_fn.tspanDx = function () {\n    var internal = this,\n        rotate = internal.tickTextRotate;\n    return rotate ? 8 * Math.sin(Math.PI * (rotate / 180)) : 0;\n};\nc3_axis_internal_fn.tspanDy = function (d, i) {\n    var internal = this,\n        dy = internal.tickTextCharSize.h;\n    if (i === 0) {\n        if (internal.isVertical()) {\n            dy = -((d.length - 1) * (internal.tickTextCharSize.h / 2) - 3);\n        } else {\n            dy = \".71em\";\n        }\n    }\n    return dy;\n};\n\nc3_axis_internal_fn.generateAxis = function () {\n    var internal = this,\n        d3 = internal.d3,\n        params = internal.params;\n    function axis(g) {\n        g.each(function () {\n            var g = axis.g = d3.select(this);\n\n            var scale0 = this.__chart__ || internal.scale,\n                scale1 = this.__chart__ = internal.copyScale();\n\n            var ticks = internal.tickValues ? internal.tickValues : internal.generateTicks(scale1),\n                tick = g.selectAll(\".tick\").data(ticks, scale1),\n                tickEnter = tick.enter().insert(\"g\", \".domain\").attr(\"class\", \"tick\").style(\"opacity\", 1e-6),\n\n            // MEMO: No exit transition. The reason is this transition affects max tick width calculation because old tick will be included in the ticks.\n            tickExit = tick.exit().remove(),\n                tickUpdate = internal.transitionise(tick).style(\"opacity\", 1),\n                tickTransform,\n                tickX,\n                tickY;\n\n            if (params.isCategory) {\n                internal.tickOffset = Math.ceil((scale1(1) - scale1(0)) / 2);\n                tickX = internal.tickCentered ? 0 : internal.tickOffset;\n                tickY = internal.tickCentered ? internal.tickOffset : 0;\n            } else {\n                internal.tickOffset = tickX = 0;\n            }\n\n            tickEnter.append(\"line\");\n            tickEnter.append(\"text\");\n\n            internal.updateRange();\n            internal.updateTickLength();\n            internal.updateTickTextCharSize(g.select('.tick'));\n\n            var lineUpdate = tickUpdate.select(\"line\"),\n                textUpdate = tickUpdate.select(\"text\"),\n                tspanUpdate = tick.select(\"text\").selectAll('tspan').data(function (d, i) {\n                return internal.tspanData(d, i, ticks, scale1);\n            });\n\n            tspanUpdate.enter().append('tspan');\n            tspanUpdate.exit().remove();\n            tspanUpdate.text(function (d) {\n                return d.splitted;\n            });\n\n            var path = g.selectAll(\".domain\").data([0]),\n                pathUpdate = (path.enter().append(\"path\").attr(\"class\", \"domain\"), internal.transitionise(path));\n\n            // TODO: each attr should be one function and change its behavior by internal.orient, probably\n            switch (internal.orient) {\n                case \"bottom\":\n                    {\n                        tickTransform = internal.axisX;\n                        lineUpdate.attr(\"x1\", tickX).attr(\"x2\", tickX).attr(\"y2\", function (d, i) {\n                            return internal.lineY2(d, i);\n                        });\n                        textUpdate.attr(\"x\", 0).attr(\"y\", function (d, i) {\n                            return internal.textY(d, i);\n                        }).attr(\"transform\", function (d, i) {\n                            return internal.textTransform(d, i);\n                        }).style(\"text-anchor\", function (d, i) {\n                            return internal.textTextAnchor(d, i);\n                        });\n                        tspanUpdate.attr('x', 0).attr(\"dy\", function (d, i) {\n                            return internal.tspanDy(d, i);\n                        }).attr('dx', function (d, i) {\n                            return internal.tspanDx(d, i);\n                        });\n                        pathUpdate.attr(\"d\", \"M\" + internal.range[0] + \",\" + internal.outerTickSize + \"V0H\" + internal.range[1] + \"V\" + internal.outerTickSize);\n                        break;\n                    }\n                case \"top\":\n                    {\n                        // TODO: rotated tick text\n                        tickTransform = internal.axisX;\n                        lineUpdate.attr(\"x2\", 0).attr(\"y2\", -internal.innerTickSize);\n                        textUpdate.attr(\"x\", 0).attr(\"y\", -internal.tickLength).style(\"text-anchor\", \"middle\");\n                        tspanUpdate.attr('x', 0).attr(\"dy\", \"0em\");\n                        pathUpdate.attr(\"d\", \"M\" + internal.range[0] + \",\" + -internal.outerTickSize + \"V0H\" + internal.range[1] + \"V\" + -internal.outerTickSize);\n                        break;\n                    }\n                case \"left\":\n                    {\n                        tickTransform = internal.axisY;\n                        lineUpdate.attr(\"x2\", -internal.innerTickSize).attr(\"y1\", tickY).attr(\"y2\", tickY);\n                        textUpdate.attr(\"x\", -internal.tickLength).attr(\"y\", internal.tickOffset).style(\"text-anchor\", \"end\");\n                        tspanUpdate.attr('x', -internal.tickLength).attr(\"dy\", function (d, i) {\n                            return internal.tspanDy(d, i);\n                        });\n                        pathUpdate.attr(\"d\", \"M\" + -internal.outerTickSize + \",\" + internal.range[0] + \"H0V\" + internal.range[1] + \"H\" + -internal.outerTickSize);\n                        break;\n                    }\n                case \"right\":\n                    {\n                        tickTransform = internal.axisY;\n                        lineUpdate.attr(\"x2\", internal.innerTickSize).attr(\"y2\", 0);\n                        textUpdate.attr(\"x\", internal.tickLength).attr(\"y\", 0).style(\"text-anchor\", \"start\");\n                        tspanUpdate.attr('x', internal.tickLength).attr(\"dy\", function (d, i) {\n                            return internal.tspanDy(d, i);\n                        });\n                        pathUpdate.attr(\"d\", \"M\" + internal.outerTickSize + \",\" + internal.range[0] + \"H0V\" + internal.range[1] + \"H\" + internal.outerTickSize);\n                        break;\n                    }\n            }\n            if (scale1.rangeBand) {\n                var x = scale1,\n                    dx = x.rangeBand() / 2;\n                scale0 = scale1 = function scale1(d) {\n                    return x(d) + dx;\n                };\n            } else if (scale0.rangeBand) {\n                scale0 = scale1;\n            } else {\n                tickExit.call(tickTransform, scale1, internal.tickOffset);\n            }\n            tickEnter.call(tickTransform, scale0, internal.tickOffset);\n            tickUpdate.call(tickTransform, scale1, internal.tickOffset);\n        });\n    }\n    axis.scale = function (x) {\n        if (!arguments.length) {\n            return internal.scale;\n        }\n        internal.scale = x;\n        return axis;\n    };\n    axis.orient = function (x) {\n        if (!arguments.length) {\n            return internal.orient;\n        }\n        internal.orient = x in { top: 1, right: 1, bottom: 1, left: 1 } ? x + \"\" : \"bottom\";\n        return axis;\n    };\n    axis.tickFormat = function (format) {\n        if (!arguments.length) {\n            return internal.tickFormat;\n        }\n        internal.tickFormat = format;\n        return axis;\n    };\n    axis.tickCentered = function (isCentered) {\n        if (!arguments.length) {\n            return internal.tickCentered;\n        }\n        internal.tickCentered = isCentered;\n        return axis;\n    };\n    axis.tickOffset = function () {\n        return internal.tickOffset;\n    };\n    axis.tickInterval = function () {\n        var interval, length;\n        if (params.isCategory) {\n            interval = internal.tickOffset * 2;\n        } else {\n            length = axis.g.select('path.domain').node().getTotalLength() - internal.outerTickSize * 2;\n            interval = length / axis.g.selectAll('line').size();\n        }\n        return interval === Infinity ? 0 : interval;\n    };\n    axis.ticks = function () {\n        if (!arguments.length) {\n            return internal.tickArguments;\n        }\n        internal.tickArguments = arguments;\n        return axis;\n    };\n    axis.tickCulling = function (culling) {\n        if (!arguments.length) {\n            return internal.tickCulling;\n        }\n        internal.tickCulling = culling;\n        return axis;\n    };\n    axis.tickValues = function (x) {\n        if (typeof x === 'function') {\n            internal.tickValues = function () {\n                return x(internal.scale.domain());\n            };\n        } else {\n            if (!arguments.length) {\n                return internal.tickValues;\n            }\n            internal.tickValues = x;\n        }\n        return axis;\n    };\n    return axis;\n};\n\nvar Axis = function (_Component) {\n    inherits(Axis, _Component);\n\n    function Axis(owner) {\n        classCallCheck(this, Axis);\n\n        var fn = {\n            fn: c3_axis_fn,\n            internal: {\n                fn: c3_axis_internal_fn\n            }\n        };\n\n        var _this = possibleConstructorReturn(this, (Axis.__proto__ || Object.getPrototypeOf(Axis)).call(this, owner, 'axis', fn));\n\n        _this.d3 = owner.d3;\n        _this.internal = AxisInternal;\n        return _this;\n    }\n\n    return Axis;\n}(Component);\n\nc3_axis_fn = Axis.prototype;\n\nc3_axis_fn.init = function init() {\n    var $$ = this.owner,\n        config = $$.config,\n        main = $$.main;\n    $$.axes.x = main.append(\"g\").attr(\"class\", CLASS.axis + ' ' + CLASS.axisX).attr(\"clip-path\", $$.clipPathForXAxis).attr(\"transform\", $$.getTranslate('x')).style(\"visibility\", config.axis_x_show ? 'visible' : 'hidden');\n    $$.axes.x.append(\"text\").attr(\"class\", CLASS.axisXLabel).attr(\"transform\", config.axis_rotated ? \"rotate(-90)\" : \"\").style(\"text-anchor\", this.textAnchorForXAxisLabel.bind(this));\n    $$.axes.y = main.append(\"g\").attr(\"class\", CLASS.axis + ' ' + CLASS.axisY).attr(\"clip-path\", config.axis_y_inner ? \"\" : $$.clipPathForYAxis).attr(\"transform\", $$.getTranslate('y')).style(\"visibility\", config.axis_y_show ? 'visible' : 'hidden');\n    $$.axes.y.append(\"text\").attr(\"class\", CLASS.axisYLabel).attr(\"transform\", config.axis_rotated ? \"\" : \"rotate(-90)\").style(\"text-anchor\", this.textAnchorForYAxisLabel.bind(this));\n\n    $$.axes.y2 = main.append(\"g\").attr(\"class\", CLASS.axis + ' ' + CLASS.axisY2\n    // clip-path?\n    ).attr(\"transform\", $$.getTranslate('y2')).style(\"visibility\", config.axis_y2_show ? 'visible' : 'hidden');\n    $$.axes.y2.append(\"text\").attr(\"class\", CLASS.axisY2Label).attr(\"transform\", config.axis_rotated ? \"\" : \"rotate(-90)\").style(\"text-anchor\", this.textAnchorForY2AxisLabel.bind(this));\n};\nc3_axis_fn.getXAxis = function getXAxis(scale, orient, tickFormat, tickValues, withOuterTick, withoutTransition, withoutRotateTickText) {\n    var $$ = this.owner,\n        config = $$.config,\n        axisParams = {\n        isCategory: $$.isCategorized(),\n        withOuterTick: withOuterTick,\n        tickMultiline: config.axis_x_tick_multiline,\n        tickWidth: config.axis_x_tick_width,\n        tickTextRotate: withoutRotateTickText ? 0 : config.axis_x_tick_rotate,\n        withoutTransition: withoutTransition\n    },\n        axis = new this.internal(this, axisParams).axis.scale(scale).orient(orient);\n\n    if ($$.isTimeSeries() && tickValues && typeof tickValues !== \"function\") {\n        tickValues = tickValues.map(function (v) {\n            return $$.parseDate(v);\n        });\n    }\n\n    // Set tick\n    axis.tickFormat(tickFormat).tickValues(tickValues);\n    if ($$.isCategorized()) {\n        axis.tickCentered(config.axis_x_tick_centered);\n        if (isEmpty(config.axis_x_tick_culling)) {\n            config.axis_x_tick_culling = false;\n        }\n    }\n\n    return axis;\n};\nc3_axis_fn.updateXAxisTickValues = function updateXAxisTickValues(targets, axis) {\n    var $$ = this.owner,\n        config = $$.config,\n        tickValues;\n    if (config.axis_x_tick_fit || config.axis_x_tick_count) {\n        tickValues = this.generateTickValues($$.mapTargetsToUniqueXs(targets), config.axis_x_tick_count, $$.isTimeSeries());\n    }\n    if (axis) {\n        axis.tickValues(tickValues);\n    } else {\n        $$.xAxis.tickValues(tickValues);\n        $$.subXAxis.tickValues(tickValues);\n    }\n    return tickValues;\n};\nc3_axis_fn.getYAxis = function getYAxis(scale, orient, tickFormat, tickValues, withOuterTick, withoutTransition, withoutRotateTickText) {\n    var $$ = this.owner,\n        config = $$.config,\n        axisParams = {\n        withOuterTick: withOuterTick,\n        withoutTransition: withoutTransition,\n        tickTextRotate: withoutRotateTickText ? 0 : config.axis_y_tick_rotate\n    },\n        axis = new this.internal(this, axisParams).axis.scale(scale).orient(orient).tickFormat(tickFormat);\n    if ($$.isTimeSeriesY()) {\n        axis.ticks($$.d3.time[config.axis_y_tick_time_value], config.axis_y_tick_time_interval);\n    } else {\n        axis.tickValues(tickValues);\n    }\n    return axis;\n};\nc3_axis_fn.getId = function getId(id) {\n    var config = this.owner.config;\n    return id in config.data_axes ? config.data_axes[id] : 'y';\n};\nc3_axis_fn.getXAxisTickFormat = function getXAxisTickFormat() {\n    var $$ = this.owner,\n        config = $$.config,\n        format = $$.isTimeSeries() ? $$.defaultAxisTimeFormat : $$.isCategorized() ? $$.categoryName : function (v) {\n        return v < 0 ? v.toFixed(0) : v;\n    };\n    if (config.axis_x_tick_format) {\n        if (isFunction(config.axis_x_tick_format)) {\n            format = config.axis_x_tick_format;\n        } else if ($$.isTimeSeries()) {\n            format = function format(date) {\n                return date ? $$.axisTimeFormat(config.axis_x_tick_format)(date) : \"\";\n            };\n        }\n    }\n    return isFunction(format) ? function (v) {\n        return format.call($$, v);\n    } : format;\n};\nc3_axis_fn.getTickValues = function getTickValues(tickValues, axis) {\n    return tickValues ? tickValues : axis ? axis.tickValues() : undefined;\n};\nc3_axis_fn.getXAxisTickValues = function getXAxisTickValues() {\n    return this.getTickValues(this.owner.config.axis_x_tick_values, this.owner.xAxis);\n};\nc3_axis_fn.getYAxisTickValues = function getYAxisTickValues() {\n    return this.getTickValues(this.owner.config.axis_y_tick_values, this.owner.yAxis);\n};\nc3_axis_fn.getY2AxisTickValues = function getY2AxisTickValues() {\n    return this.getTickValues(this.owner.config.axis_y2_tick_values, this.owner.y2Axis);\n};\nc3_axis_fn.getLabelOptionByAxisId = function getLabelOptionByAxisId(axisId) {\n    var $$ = this.owner,\n        config = $$.config,\n        option;\n    if (axisId === 'y') {\n        option = config.axis_y_label;\n    } else if (axisId === 'y2') {\n        option = config.axis_y2_label;\n    } else if (axisId === 'x') {\n        option = config.axis_x_label;\n    }\n    return option;\n};\nc3_axis_fn.getLabelText = function getLabelText(axisId) {\n    var option = this.getLabelOptionByAxisId(axisId);\n    return isString(option) ? option : option ? option.text : null;\n};\nc3_axis_fn.setLabelText = function setLabelText(axisId, text) {\n    var $$ = this.owner,\n        config = $$.config,\n        option = this.getLabelOptionByAxisId(axisId);\n    if (isString(option)) {\n        if (axisId === 'y') {\n            config.axis_y_label = text;\n        } else if (axisId === 'y2') {\n            config.axis_y2_label = text;\n        } else if (axisId === 'x') {\n            config.axis_x_label = text;\n        }\n    } else if (option) {\n        option.text = text;\n    }\n};\nc3_axis_fn.getLabelPosition = function getLabelPosition(axisId, defaultPosition) {\n    var option = this.getLabelOptionByAxisId(axisId),\n        position = option && (typeof option === 'undefined' ? 'undefined' : _typeof(option)) === 'object' && option.position ? option.position : defaultPosition;\n    return {\n        isInner: position.indexOf('inner') >= 0,\n        isOuter: position.indexOf('outer') >= 0,\n        isLeft: position.indexOf('left') >= 0,\n        isCenter: position.indexOf('center') >= 0,\n        isRight: position.indexOf('right') >= 0,\n        isTop: position.indexOf('top') >= 0,\n        isMiddle: position.indexOf('middle') >= 0,\n        isBottom: position.indexOf('bottom') >= 0\n    };\n};\nc3_axis_fn.getXAxisLabelPosition = function getXAxisLabelPosition() {\n    return this.getLabelPosition('x', this.owner.config.axis_rotated ? 'inner-top' : 'inner-right');\n};\nc3_axis_fn.getYAxisLabelPosition = function getYAxisLabelPosition() {\n    return this.getLabelPosition('y', this.owner.config.axis_rotated ? 'inner-right' : 'inner-top');\n};\nc3_axis_fn.getY2AxisLabelPosition = function getY2AxisLabelPosition() {\n    return this.getLabelPosition('y2', this.owner.config.axis_rotated ? 'inner-right' : 'inner-top');\n};\nc3_axis_fn.getLabelPositionById = function getLabelPositionById(id) {\n    return id === 'y2' ? this.getY2AxisLabelPosition() : id === 'y' ? this.getYAxisLabelPosition() : this.getXAxisLabelPosition();\n};\nc3_axis_fn.textForXAxisLabel = function textForXAxisLabel() {\n    return this.getLabelText('x');\n};\nc3_axis_fn.textForYAxisLabel = function textForYAxisLabel() {\n    return this.getLabelText('y');\n};\nc3_axis_fn.textForY2AxisLabel = function textForY2AxisLabel() {\n    return this.getLabelText('y2');\n};\nc3_axis_fn.xForAxisLabel = function xForAxisLabel(forHorizontal, position) {\n    var $$ = this.owner;\n    if (forHorizontal) {\n        return position.isLeft ? 0 : position.isCenter ? $$.width / 2 : $$.width;\n    } else {\n        return position.isBottom ? -$$.height : position.isMiddle ? -$$.height / 2 : 0;\n    }\n};\nc3_axis_fn.dxForAxisLabel = function dxForAxisLabel(forHorizontal, position) {\n    if (forHorizontal) {\n        return position.isLeft ? \"0.5em\" : position.isRight ? \"-0.5em\" : \"0\";\n    } else {\n        return position.isTop ? \"-0.5em\" : position.isBottom ? \"0.5em\" : \"0\";\n    }\n};\nc3_axis_fn.textAnchorForAxisLabel = function textAnchorForAxisLabel(forHorizontal, position) {\n    if (forHorizontal) {\n        return position.isLeft ? 'start' : position.isCenter ? 'middle' : 'end';\n    } else {\n        return position.isBottom ? 'start' : position.isMiddle ? 'middle' : 'end';\n    }\n};\nc3_axis_fn.xForXAxisLabel = function xForXAxisLabel() {\n    return this.xForAxisLabel(!this.owner.config.axis_rotated, this.getXAxisLabelPosition());\n};\nc3_axis_fn.xForYAxisLabel = function xForYAxisLabel() {\n    return this.xForAxisLabel(this.owner.config.axis_rotated, this.getYAxisLabelPosition());\n};\nc3_axis_fn.xForY2AxisLabel = function xForY2AxisLabel() {\n    return this.xForAxisLabel(this.owner.config.axis_rotated, this.getY2AxisLabelPosition());\n};\nc3_axis_fn.dxForXAxisLabel = function dxForXAxisLabel() {\n    return this.dxForAxisLabel(!this.owner.config.axis_rotated, this.getXAxisLabelPosition());\n};\nc3_axis_fn.dxForYAxisLabel = function dxForYAxisLabel() {\n    return this.dxForAxisLabel(this.owner.config.axis_rotated, this.getYAxisLabelPosition());\n};\nc3_axis_fn.dxForY2AxisLabel = function dxForY2AxisLabel() {\n    return this.dxForAxisLabel(this.owner.config.axis_rotated, this.getY2AxisLabelPosition());\n};\nc3_axis_fn.dyForXAxisLabel = function dyForXAxisLabel() {\n    var $$ = this.owner,\n        config = $$.config,\n        position = this.getXAxisLabelPosition();\n    if (config.axis_rotated) {\n        return position.isInner ? \"1.2em\" : -25 - this.getMaxTickWidth('x');\n    } else {\n        return position.isInner ? \"-0.5em\" : config.axis_x_height ? config.axis_x_height - 10 : \"3em\";\n    }\n};\nc3_axis_fn.dyForYAxisLabel = function dyForYAxisLabel() {\n    var $$ = this.owner,\n        position = this.getYAxisLabelPosition();\n    if ($$.config.axis_rotated) {\n        return position.isInner ? \"-0.5em\" : \"3em\";\n    } else {\n        return position.isInner ? \"1.2em\" : -10 - ($$.config.axis_y_inner ? 0 : this.getMaxTickWidth('y') + 10);\n    }\n};\nc3_axis_fn.dyForY2AxisLabel = function dyForY2AxisLabel() {\n    var $$ = this.owner,\n        position = this.getY2AxisLabelPosition();\n    if ($$.config.axis_rotated) {\n        return position.isInner ? \"1.2em\" : \"-2.2em\";\n    } else {\n        return position.isInner ? \"-0.5em\" : 15 + ($$.config.axis_y2_inner ? 0 : this.getMaxTickWidth('y2') + 15);\n    }\n};\nc3_axis_fn.textAnchorForXAxisLabel = function textAnchorForXAxisLabel() {\n    var $$ = this.owner;\n    return this.textAnchorForAxisLabel(!$$.config.axis_rotated, this.getXAxisLabelPosition());\n};\nc3_axis_fn.textAnchorForYAxisLabel = function textAnchorForYAxisLabel() {\n    var $$ = this.owner;\n    return this.textAnchorForAxisLabel($$.config.axis_rotated, this.getYAxisLabelPosition());\n};\nc3_axis_fn.textAnchorForY2AxisLabel = function textAnchorForY2AxisLabel() {\n    var $$ = this.owner;\n    return this.textAnchorForAxisLabel($$.config.axis_rotated, this.getY2AxisLabelPosition());\n};\nc3_axis_fn.getMaxTickWidth = function getMaxTickWidth(id, withoutRecompute) {\n    var $$ = this.owner,\n        config = $$.config,\n        maxWidth = 0,\n        targetsToShow,\n        scale,\n        axis,\n        dummy,\n        svg;\n    if (withoutRecompute && $$.currentMaxTickWidths[id]) {\n        return $$.currentMaxTickWidths[id];\n    }\n    if ($$.svg) {\n        targetsToShow = $$.filterTargetsToShow($$.data.targets);\n        if (id === 'y') {\n            scale = $$.y.copy().domain($$.getYDomain(targetsToShow, 'y'));\n            axis = this.getYAxis(scale, $$.yOrient, config.axis_y_tick_format, $$.yAxisTickValues, false, true, true);\n        } else if (id === 'y2') {\n            scale = $$.y2.copy().domain($$.getYDomain(targetsToShow, 'y2'));\n            axis = this.getYAxis(scale, $$.y2Orient, config.axis_y2_tick_format, $$.y2AxisTickValues, false, true, true);\n        } else {\n            scale = $$.x.copy().domain($$.getXDomain(targetsToShow));\n            axis = this.getXAxis(scale, $$.xOrient, $$.xAxisTickFormat, $$.xAxisTickValues, false, true, true);\n            this.updateXAxisTickValues(targetsToShow, axis);\n        }\n        dummy = $$.d3.select('body').append('div').classed('c3', true);\n        svg = dummy.append(\"svg\").style('visibility', 'hidden').style('position', 'fixed').style('top', 0).style('left', 0), svg.append('g').call(axis).each(function () {\n            $$.d3.select(this).selectAll('text').each(function () {\n                var box = this.getBoundingClientRect();\n                if (maxWidth < box.width) {\n                    maxWidth = box.width;\n                }\n            });\n            dummy.remove();\n        });\n    }\n    $$.currentMaxTickWidths[id] = maxWidth <= 0 ? $$.currentMaxTickWidths[id] : maxWidth;\n    return $$.currentMaxTickWidths[id];\n};\n\nc3_axis_fn.updateLabels = function updateLabels(withTransition) {\n    var $$ = this.owner;\n    var axisXLabel = $$.main.select('.' + CLASS.axisX + ' .' + CLASS.axisXLabel),\n        axisYLabel = $$.main.select('.' + CLASS.axisY + ' .' + CLASS.axisYLabel),\n        axisY2Label = $$.main.select('.' + CLASS.axisY2 + ' .' + CLASS.axisY2Label);\n    (withTransition ? axisXLabel.transition() : axisXLabel).attr(\"x\", this.xForXAxisLabel.bind(this)).attr(\"dx\", this.dxForXAxisLabel.bind(this)).attr(\"dy\", this.dyForXAxisLabel.bind(this)).text(this.textForXAxisLabel.bind(this));\n    (withTransition ? axisYLabel.transition() : axisYLabel).attr(\"x\", this.xForYAxisLabel.bind(this)).attr(\"dx\", this.dxForYAxisLabel.bind(this)).attr(\"dy\", this.dyForYAxisLabel.bind(this)).text(this.textForYAxisLabel.bind(this));\n    (withTransition ? axisY2Label.transition() : axisY2Label).attr(\"x\", this.xForY2AxisLabel.bind(this)).attr(\"dx\", this.dxForY2AxisLabel.bind(this)).attr(\"dy\", this.dyForY2AxisLabel.bind(this)).text(this.textForY2AxisLabel.bind(this));\n};\nc3_axis_fn.getPadding = function getPadding(padding, key, defaultValue, domainLength) {\n    var p = typeof padding === 'number' ? padding : padding[key];\n    if (!isValue(p)) {\n        return defaultValue;\n    }\n    if (padding.unit === 'ratio') {\n        return padding[key] * domainLength;\n    }\n    // assume padding is pixels if unit is not specified\n    return this.convertPixelsToAxisPadding(p, domainLength);\n};\nc3_axis_fn.convertPixelsToAxisPadding = function convertPixelsToAxisPadding(pixels, domainLength) {\n    var $$ = this.owner,\n        length = $$.config.axis_rotated ? $$.width : $$.height;\n    return domainLength * (pixels / length);\n};\nc3_axis_fn.generateTickValues = function generateTickValues(values, tickCount, forTimeSeries) {\n    var tickValues = values,\n        targetCount,\n        start,\n        end,\n        count,\n        interval,\n        i,\n        tickValue;\n    if (tickCount) {\n        targetCount = isFunction(tickCount) ? tickCount() : tickCount;\n        // compute ticks according to tickCount\n        if (targetCount === 1) {\n            tickValues = [values[0]];\n        } else if (targetCount === 2) {\n            tickValues = [values[0], values[values.length - 1]];\n        } else if (targetCount > 2) {\n            count = targetCount - 2;\n            start = values[0];\n            end = values[values.length - 1];\n            interval = (end - start) / (count + 1);\n            // re-construct unique values\n            tickValues = [start];\n            for (i = 0; i < count; i++) {\n                tickValue = +start + interval * (i + 1);\n                tickValues.push(forTimeSeries ? new Date(tickValue) : tickValue);\n            }\n            tickValues.push(end);\n        }\n    }\n    if (!forTimeSeries) {\n        tickValues = tickValues.sort(function (a, b) {\n            return a - b;\n        });\n    }\n    return tickValues;\n};\nc3_axis_fn.generateTransitions = function generateTransitions(duration) {\n    var $$ = this.owner,\n        axes = $$.axes;\n    return {\n        axisX: duration ? axes.x.transition().duration(duration) : axes.x,\n        axisY: duration ? axes.y.transition().duration(duration) : axes.y,\n        axisY2: duration ? axes.y2.transition().duration(duration) : axes.y2,\n        axisSubX: duration ? axes.subx.transition().duration(duration) : axes.subx\n    };\n};\nc3_axis_fn.redraw = function redraw(transitions, isHidden) {\n    var $$ = this.owner;\n    $$.axes.x.style(\"opacity\", isHidden ? 0 : 1);\n    $$.axes.y.style(\"opacity\", isHidden ? 0 : 1);\n    $$.axes.y2.style(\"opacity\", isHidden ? 0 : 1);\n    $$.axes.subx.style(\"opacity\", isHidden ? 0 : 1);\n    transitions.axisX.call($$.xAxis);\n    transitions.axisY.call($$.yAxis);\n    transitions.axisY2.call($$.y2Axis);\n    transitions.axisSubX.call($$.subXAxis);\n};\n\nvar c3$1 = { version: \"0.4.18\" };\n\nvar c3_chart_fn;\nvar c3_chart_internal_fn;\n\nfunction Component(owner, componentKey, fn) {\n    this.owner = owner;\n    c3$1.chart.internal[componentKey] = fn;\n}\n\nfunction Chart(config) {\n    var $$ = this.internal = new ChartInternal(this);\n    $$.loadConfig(config);\n\n    $$.beforeInit(config);\n    $$.init();\n    $$.afterInit(config);\n\n    // bind \"this\" to nested API\n    (function bindThis(fn, target, argThis) {\n        Object.keys(fn).forEach(function (key) {\n            target[key] = fn[key].bind(argThis);\n            if (Object.keys(fn[key]).length > 0) {\n                bindThis(fn[key], target[key], argThis);\n            }\n        });\n    })(c3_chart_fn, this, this);\n}\n\nfunction ChartInternal(api) {\n    var $$ = this;\n    $$.d3 = window.d3 ? window.d3 : typeof require !== 'undefined' ? require(\"d3\") : undefined;\n    $$.api = api;\n    $$.config = $$.getDefaultConfig();\n    $$.data = {};\n    $$.cache = {};\n    $$.axes = {};\n}\n\nc3$1.generate = function (config) {\n    return new Chart(config);\n};\n\nc3$1.chart = {\n    fn: Chart.prototype,\n    internal: {\n        fn: ChartInternal.prototype\n    }\n};\nc3_chart_fn = c3$1.chart.fn;\nc3_chart_internal_fn = c3$1.chart.internal.fn;\n\nc3_chart_internal_fn.beforeInit = function () {\n    // can do something\n};\nc3_chart_internal_fn.afterInit = function () {\n    // can do something\n};\nc3_chart_internal_fn.init = function () {\n    var $$ = this,\n        config = $$.config;\n\n    $$.initParams();\n\n    if (config.data_url) {\n        $$.convertUrlToData(config.data_url, config.data_mimeType, config.data_headers, config.data_keys, $$.initWithData);\n    } else if (config.data_json) {\n        $$.initWithData($$.convertJsonToData(config.data_json, config.data_keys));\n    } else if (config.data_rows) {\n        $$.initWithData($$.convertRowsToData(config.data_rows));\n    } else if (config.data_columns) {\n        $$.initWithData($$.convertColumnsToData(config.data_columns));\n    } else {\n        throw Error('url or json or rows or columns is required.');\n    }\n};\n\nc3_chart_internal_fn.initParams = function () {\n    var $$ = this,\n        d3 = $$.d3,\n        config = $$.config;\n\n    // MEMO: clipId needs to be unique because it conflicts when multiple charts exist\n    $$.clipId = \"c3-\" + +new Date() + '-clip', $$.clipIdForXAxis = $$.clipId + '-xaxis', $$.clipIdForYAxis = $$.clipId + '-yaxis', $$.clipIdForGrid = $$.clipId + '-grid', $$.clipIdForSubchart = $$.clipId + '-subchart', $$.clipPath = $$.getClipPath($$.clipId), $$.clipPathForXAxis = $$.getClipPath($$.clipIdForXAxis), $$.clipPathForYAxis = $$.getClipPath($$.clipIdForYAxis);\n    $$.clipPathForGrid = $$.getClipPath($$.clipIdForGrid), $$.clipPathForSubchart = $$.getClipPath($$.clipIdForSubchart), $$.dragStart = null;\n    $$.dragging = false;\n    $$.flowing = false;\n    $$.cancelClick = false;\n    $$.mouseover = false;\n    $$.transiting = false;\n\n    $$.color = $$.generateColor();\n    $$.levelColor = $$.generateLevelColor();\n\n    $$.dataTimeFormat = config.data_xLocaltime ? d3.time.format : d3.time.format.utc;\n    $$.axisTimeFormat = config.axis_x_localtime ? d3.time.format : d3.time.format.utc;\n    $$.defaultAxisTimeFormat = $$.axisTimeFormat.multi([[\".%L\", function (d) {\n        return d.getMilliseconds();\n    }], [\":%S\", function (d) {\n        return d.getSeconds();\n    }], [\"%I:%M\", function (d) {\n        return d.getMinutes();\n    }], [\"%I %p\", function (d) {\n        return d.getHours();\n    }], [\"%-m/%-d\", function (d) {\n        return d.getDay() && d.getDate() !== 1;\n    }], [\"%-m/%-d\", function (d) {\n        return d.getDate() !== 1;\n    }], [\"%-m/%-d\", function (d) {\n        return d.getMonth();\n    }], [\"%Y/%-m/%-d\", function () {\n        return true;\n    }]]);\n\n    $$.hiddenTargetIds = [];\n    $$.hiddenLegendIds = [];\n    $$.focusedTargetIds = [];\n    $$.defocusedTargetIds = [];\n\n    $$.xOrient = config.axis_rotated ? \"left\" : \"bottom\";\n    $$.yOrient = config.axis_rotated ? config.axis_y_inner ? \"top\" : \"bottom\" : config.axis_y_inner ? \"right\" : \"left\";\n    $$.y2Orient = config.axis_rotated ? config.axis_y2_inner ? \"bottom\" : \"top\" : config.axis_y2_inner ? \"left\" : \"right\";\n    $$.subXOrient = config.axis_rotated ? \"left\" : \"bottom\";\n\n    $$.isLegendRight = config.legend_position === 'right';\n    $$.isLegendInset = config.legend_position === 'inset';\n    $$.isLegendTop = config.legend_inset_anchor === 'top-left' || config.legend_inset_anchor === 'top-right';\n    $$.isLegendLeft = config.legend_inset_anchor === 'top-left' || config.legend_inset_anchor === 'bottom-left';\n    $$.legendStep = 0;\n    $$.legendItemWidth = 0;\n    $$.legendItemHeight = 0;\n\n    $$.currentMaxTickWidths = {\n        x: 0,\n        y: 0,\n        y2: 0\n    };\n\n    $$.rotated_padding_left = 30;\n    $$.rotated_padding_right = config.axis_rotated && !config.axis_x_show ? 0 : 30;\n    $$.rotated_padding_top = 5;\n\n    $$.withoutFadeIn = {};\n\n    $$.intervalForObserveInserted = undefined;\n\n    $$.axes.subx = d3.selectAll([]); // needs when excluding subchart.js\n};\n\nc3_chart_internal_fn.initChartElements = function () {\n    if (this.initBar) {\n        this.initBar();\n    }\n    if (this.initLine) {\n        this.initLine();\n    }\n    if (this.initArc) {\n        this.initArc();\n    }\n    if (this.initGauge) {\n        this.initGauge();\n    }\n    if (this.initText) {\n        this.initText();\n    }\n};\n\nc3_chart_internal_fn.initWithData = function (data) {\n    var $$ = this,\n        d3 = $$.d3,\n        config = $$.config;\n    var defs,\n        main,\n        binding = true;\n\n    $$.axis = new Axis($$);\n\n    if ($$.initPie) {\n        $$.initPie();\n    }\n    if ($$.initBrush) {\n        $$.initBrush();\n    }\n    if ($$.initZoom) {\n        $$.initZoom();\n    }\n\n    if (!config.bindto) {\n        $$.selectChart = d3.selectAll([]);\n    } else if (typeof config.bindto.node === 'function') {\n        $$.selectChart = config.bindto;\n    } else {\n        $$.selectChart = d3.select(config.bindto);\n    }\n    if ($$.selectChart.empty()) {\n        $$.selectChart = d3.select(document.createElement('div')).style('opacity', 0);\n        $$.observeInserted($$.selectChart);\n        binding = false;\n    }\n    $$.selectChart.html(\"\").classed(\"c3\", true);\n\n    // Init data as targets\n    $$.data.xs = {};\n    $$.data.targets = $$.convertDataToTargets(data);\n\n    if (config.data_filter) {\n        $$.data.targets = $$.data.targets.filter(config.data_filter);\n    }\n\n    // Set targets to hide if needed\n    if (config.data_hide) {\n        $$.addHiddenTargetIds(config.data_hide === true ? $$.mapToIds($$.data.targets) : config.data_hide);\n    }\n    if (config.legend_hide) {\n        $$.addHiddenLegendIds(config.legend_hide === true ? $$.mapToIds($$.data.targets) : config.legend_hide);\n    }\n\n    // when gauge, hide legend // TODO: fix\n    if ($$.hasType('gauge')) {\n        config.legend_show = false;\n    }\n\n    // Init sizes and scales\n    $$.updateSizes();\n    $$.updateScales();\n\n    // Set domains for each scale\n    $$.x.domain(d3.extent($$.getXDomain($$.data.targets)));\n    $$.y.domain($$.getYDomain($$.data.targets, 'y'));\n    $$.y2.domain($$.getYDomain($$.data.targets, 'y2'));\n    $$.subX.domain($$.x.domain());\n    $$.subY.domain($$.y.domain());\n    $$.subY2.domain($$.y2.domain());\n\n    // Save original x domain for zoom update\n    $$.orgXDomain = $$.x.domain();\n\n    // Set initialized scales to brush and zoom\n    if ($$.brush) {\n        $$.brush.scale($$.subX);\n    }\n    if (config.zoom_enabled) {\n        $$.zoom.scale($$.x);\n    }\n\n    /*-- Basic Elements --*/\n\n    // Define svgs\n    $$.svg = $$.selectChart.append(\"svg\").style(\"overflow\", \"hidden\").on('mouseenter', function () {\n        return config.onmouseover.call($$);\n    }).on('mouseleave', function () {\n        return config.onmouseout.call($$);\n    });\n\n    if ($$.config.svg_classname) {\n        $$.svg.attr('class', $$.config.svg_classname);\n    }\n\n    // Define defs\n    defs = $$.svg.append(\"defs\");\n    $$.clipChart = $$.appendClip(defs, $$.clipId);\n    $$.clipXAxis = $$.appendClip(defs, $$.clipIdForXAxis);\n    $$.clipYAxis = $$.appendClip(defs, $$.clipIdForYAxis);\n    $$.clipGrid = $$.appendClip(defs, $$.clipIdForGrid);\n    $$.clipSubchart = $$.appendClip(defs, $$.clipIdForSubchart);\n    $$.updateSvgSize();\n\n    // Define regions\n    main = $$.main = $$.svg.append(\"g\").attr(\"transform\", $$.getTranslate('main'));\n\n    if ($$.initSubchart) {\n        $$.initSubchart();\n    }\n    if ($$.initTooltip) {\n        $$.initTooltip();\n    }\n    if ($$.initLegend) {\n        $$.initLegend();\n    }\n    if ($$.initTitle) {\n        $$.initTitle();\n    }\n\n    /*-- Main Region --*/\n\n    // text when empty\n    main.append(\"text\").attr(\"class\", CLASS.text + ' ' + CLASS.empty).attr(\"text-anchor\", \"middle\" // horizontal centering of text at x position in all browsers.\n    ).attr(\"dominant-baseline\", \"middle\"); // vertical centering of text at y position in all browsers, except IE.\n\n    // Regions\n    $$.initRegion();\n\n    // Grids\n    $$.initGrid();\n\n    // Define g for chart area\n    main.append('g').attr(\"clip-path\", $$.clipPath).attr('class', CLASS.chart);\n\n    // Grid lines\n    if (config.grid_lines_front) {\n        $$.initGridLines();\n    }\n\n    // Cover whole with rects for events\n    $$.initEventRect();\n\n    // Define g for chart\n    $$.initChartElements();\n\n    // if zoom privileged, insert rect to forefront\n    // TODO: is this needed?\n    main.insert('rect', config.zoom_privileged ? null : 'g.' + CLASS.regions).attr('class', CLASS.zoomRect).attr('width', $$.width).attr('height', $$.height).style('opacity', 0).on(\"dblclick.zoom\", null);\n\n    // Set default extent if defined\n    if (config.axis_x_extent) {\n        $$.brush.extent($$.getDefaultExtent());\n    }\n\n    // Add Axis\n    $$.axis.init();\n\n    // Set targets\n    $$.updateTargets($$.data.targets);\n\n    // Draw with targets\n    if (binding) {\n        $$.updateDimension();\n        $$.config.oninit.call($$);\n        $$.redraw({\n            withTransition: false,\n            withTransform: true,\n            withUpdateXDomain: true,\n            withUpdateOrgXDomain: true,\n            withTransitionForAxis: false\n        });\n    }\n\n    // Bind resize event\n    $$.bindResize();\n\n    // export element of the chart\n    $$.api.element = $$.selectChart.node();\n};\n\nc3_chart_internal_fn.smoothLines = function (el, type) {\n    var $$ = this;\n    if (type === 'grid') {\n        el.each(function () {\n            var g = $$.d3.select(this),\n                x1 = g.attr('x1'),\n                x2 = g.attr('x2'),\n                y1 = g.attr('y1'),\n                y2 = g.attr('y2');\n            g.attr({\n                'x1': Math.ceil(x1),\n                'x2': Math.ceil(x2),\n                'y1': Math.ceil(y1),\n                'y2': Math.ceil(y2)\n            });\n        });\n    }\n};\n\nc3_chart_internal_fn.updateSizes = function () {\n    var $$ = this,\n        config = $$.config;\n    var legendHeight = $$.legend ? $$.getLegendHeight() : 0,\n        legendWidth = $$.legend ? $$.getLegendWidth() : 0,\n        legendHeightForBottom = $$.isLegendRight || $$.isLegendInset ? 0 : legendHeight,\n        hasArc = $$.hasArcType(),\n        xAxisHeight = config.axis_rotated || hasArc ? 0 : $$.getHorizontalAxisHeight('x'),\n        subchartHeight = config.subchart_show && !hasArc ? config.subchart_size_height + xAxisHeight : 0;\n\n    $$.currentWidth = $$.getCurrentWidth();\n    $$.currentHeight = $$.getCurrentHeight();\n\n    // for main\n    $$.margin = config.axis_rotated ? {\n        top: $$.getHorizontalAxisHeight('y2') + $$.getCurrentPaddingTop(),\n        right: hasArc ? 0 : $$.getCurrentPaddingRight(),\n        bottom: $$.getHorizontalAxisHeight('y') + legendHeightForBottom + $$.getCurrentPaddingBottom(),\n        left: subchartHeight + (hasArc ? 0 : $$.getCurrentPaddingLeft())\n    } : {\n        top: 4 + $$.getCurrentPaddingTop(), // for top tick text\n        right: hasArc ? 0 : $$.getCurrentPaddingRight(),\n        bottom: xAxisHeight + subchartHeight + legendHeightForBottom + $$.getCurrentPaddingBottom(),\n        left: hasArc ? 0 : $$.getCurrentPaddingLeft()\n    };\n\n    // for subchart\n    $$.margin2 = config.axis_rotated ? {\n        top: $$.margin.top,\n        right: NaN,\n        bottom: 20 + legendHeightForBottom,\n        left: $$.rotated_padding_left\n    } : {\n        top: $$.currentHeight - subchartHeight - legendHeightForBottom,\n        right: NaN,\n        bottom: xAxisHeight + legendHeightForBottom,\n        left: $$.margin.left\n    };\n\n    // for legend\n    $$.margin3 = {\n        top: 0,\n        right: NaN,\n        bottom: 0,\n        left: 0\n    };\n    if ($$.updateSizeForLegend) {\n        $$.updateSizeForLegend(legendHeight, legendWidth);\n    }\n\n    $$.width = $$.currentWidth - $$.margin.left - $$.margin.right;\n    $$.height = $$.currentHeight - $$.margin.top - $$.margin.bottom;\n    if ($$.width < 0) {\n        $$.width = 0;\n    }\n    if ($$.height < 0) {\n        $$.height = 0;\n    }\n\n    $$.width2 = config.axis_rotated ? $$.margin.left - $$.rotated_padding_left - $$.rotated_padding_right : $$.width;\n    $$.height2 = config.axis_rotated ? $$.height : $$.currentHeight - $$.margin2.top - $$.margin2.bottom;\n    if ($$.width2 < 0) {\n        $$.width2 = 0;\n    }\n    if ($$.height2 < 0) {\n        $$.height2 = 0;\n    }\n\n    // for arc\n    $$.arcWidth = $$.width - ($$.isLegendRight ? legendWidth + 10 : 0);\n    $$.arcHeight = $$.height - ($$.isLegendRight ? 0 : 10);\n    if ($$.hasType('gauge') && !config.gauge_fullCircle) {\n        $$.arcHeight += $$.height - $$.getGaugeLabelHeight();\n    }\n    if ($$.updateRadius) {\n        $$.updateRadius();\n    }\n\n    if ($$.isLegendRight && hasArc) {\n        $$.margin3.left = $$.arcWidth / 2 + $$.radiusExpanded * 1.1;\n    }\n};\n\nc3_chart_internal_fn.updateTargets = function (targets) {\n    var $$ = this;\n\n    /*-- Main --*/\n\n    //-- Text --//\n    $$.updateTargetsForText(targets);\n\n    //-- Bar --//\n    $$.updateTargetsForBar(targets);\n\n    //-- Line --//\n    $$.updateTargetsForLine(targets);\n\n    //-- Arc --//\n    if ($$.hasArcType() && $$.updateTargetsForArc) {\n        $$.updateTargetsForArc(targets);\n    }\n\n    /*-- Sub --*/\n\n    if ($$.updateTargetsForSubchart) {\n        $$.updateTargetsForSubchart(targets);\n    }\n\n    // Fade-in each chart\n    $$.showTargets();\n};\nc3_chart_internal_fn.showTargets = function () {\n    var $$ = this;\n    $$.svg.selectAll('.' + CLASS.target).filter(function (d) {\n        return $$.isTargetToShow(d.id);\n    }).transition().duration($$.config.transition_duration).style(\"opacity\", 1);\n};\n\nc3_chart_internal_fn.redraw = function (options, transitions) {\n    var $$ = this,\n        main = $$.main,\n        d3 = $$.d3,\n        config = $$.config;\n    var areaIndices = $$.getShapeIndices($$.isAreaType),\n        barIndices = $$.getShapeIndices($$.isBarType),\n        lineIndices = $$.getShapeIndices($$.isLineType);\n    var withY, withSubchart, withTransition, withTransitionForExit, withTransitionForAxis, withTransform, withUpdateXDomain, withUpdateOrgXDomain, withTrimXDomain, withLegend, withEventRect, withDimension, withUpdateXAxis;\n    var hideAxis = $$.hasArcType();\n    var drawArea, drawBar, drawLine, xForText, yForText;\n    var duration, durationForExit, durationForAxis;\n    var waitForDraw, flow;\n    var targetsToShow = $$.filterTargetsToShow($$.data.targets),\n        tickValues,\n        i,\n        intervalForCulling,\n        xDomainForZoom;\n    var xv = $$.xv.bind($$),\n        cx,\n        cy;\n\n    options = options || {};\n    withY = getOption(options, \"withY\", true);\n    withSubchart = getOption(options, \"withSubchart\", true);\n    withTransition = getOption(options, \"withTransition\", true);\n    withTransform = getOption(options, \"withTransform\", false);\n    withUpdateXDomain = getOption(options, \"withUpdateXDomain\", false);\n    withUpdateOrgXDomain = getOption(options, \"withUpdateOrgXDomain\", false);\n    withTrimXDomain = getOption(options, \"withTrimXDomain\", true);\n    withUpdateXAxis = getOption(options, \"withUpdateXAxis\", withUpdateXDomain);\n    withLegend = getOption(options, \"withLegend\", false);\n    withEventRect = getOption(options, \"withEventRect\", true);\n    withDimension = getOption(options, \"withDimension\", true);\n    withTransitionForExit = getOption(options, \"withTransitionForExit\", withTransition);\n    withTransitionForAxis = getOption(options, \"withTransitionForAxis\", withTransition);\n\n    duration = withTransition ? config.transition_duration : 0;\n    durationForExit = withTransitionForExit ? duration : 0;\n    durationForAxis = withTransitionForAxis ? duration : 0;\n\n    transitions = transitions || $$.axis.generateTransitions(durationForAxis);\n\n    // update legend and transform each g\n    if (withLegend && config.legend_show) {\n        $$.updateLegend($$.mapToIds($$.data.targets), options, transitions);\n    } else if (withDimension) {\n        // need to update dimension (e.g. axis.y.tick.values) because y tick values should change\n        // no need to update axis in it because they will be updated in redraw()\n        $$.updateDimension(true);\n    }\n\n    // MEMO: needed for grids calculation\n    if ($$.isCategorized() && targetsToShow.length === 0) {\n        $$.x.domain([0, $$.axes.x.selectAll('.tick').size()]);\n    }\n\n    if (targetsToShow.length) {\n        $$.updateXDomain(targetsToShow, withUpdateXDomain, withUpdateOrgXDomain, withTrimXDomain);\n        if (!config.axis_x_tick_values) {\n            tickValues = $$.axis.updateXAxisTickValues(targetsToShow);\n        }\n    } else {\n        $$.xAxis.tickValues([]);\n        $$.subXAxis.tickValues([]);\n    }\n\n    if (config.zoom_rescale && !options.flow) {\n        xDomainForZoom = $$.x.orgDomain();\n    }\n\n    $$.y.domain($$.getYDomain(targetsToShow, 'y', xDomainForZoom));\n    $$.y2.domain($$.getYDomain(targetsToShow, 'y2', xDomainForZoom));\n\n    if (!config.axis_y_tick_values && config.axis_y_tick_count) {\n        $$.yAxis.tickValues($$.axis.generateTickValues($$.y.domain(), config.axis_y_tick_count));\n    }\n    if (!config.axis_y2_tick_values && config.axis_y2_tick_count) {\n        $$.y2Axis.tickValues($$.axis.generateTickValues($$.y2.domain(), config.axis_y2_tick_count));\n    }\n\n    // axes\n    $$.axis.redraw(transitions, hideAxis);\n\n    // Update axis label\n    $$.axis.updateLabels(withTransition);\n\n    // show/hide if manual culling needed\n    if ((withUpdateXDomain || withUpdateXAxis) && targetsToShow.length) {\n        if (config.axis_x_tick_culling && tickValues) {\n            for (i = 1; i < tickValues.length; i++) {\n                if (tickValues.length / i < config.axis_x_tick_culling_max) {\n                    intervalForCulling = i;\n                    break;\n                }\n            }\n            $$.svg.selectAll('.' + CLASS.axisX + ' .tick text').each(function (e) {\n                var index = tickValues.indexOf(e);\n                if (index >= 0) {\n                    d3.select(this).style('display', index % intervalForCulling ? 'none' : 'block');\n                }\n            });\n        } else {\n            $$.svg.selectAll('.' + CLASS.axisX + ' .tick text').style('display', 'block');\n        }\n    }\n\n    // setup drawer - MEMO: these must be called after axis updated\n    drawArea = $$.generateDrawArea ? $$.generateDrawArea(areaIndices, false) : undefined;\n    drawBar = $$.generateDrawBar ? $$.generateDrawBar(barIndices) : undefined;\n    drawLine = $$.generateDrawLine ? $$.generateDrawLine(lineIndices, false) : undefined;\n    xForText = $$.generateXYForText(areaIndices, barIndices, lineIndices, true);\n    yForText = $$.generateXYForText(areaIndices, barIndices, lineIndices, false);\n\n    // Update sub domain\n    if (withY) {\n        $$.subY.domain($$.getYDomain(targetsToShow, 'y'));\n        $$.subY2.domain($$.getYDomain(targetsToShow, 'y2'));\n    }\n\n    // xgrid focus\n    $$.updateXgridFocus();\n\n    // Data empty label positioning and text.\n    main.select(\"text.\" + CLASS.text + '.' + CLASS.empty).attr(\"x\", $$.width / 2).attr(\"y\", $$.height / 2).text(config.data_empty_label_text).transition().style('opacity', targetsToShow.length ? 0 : 1);\n\n    // grid\n    $$.updateGrid(duration);\n\n    // rect for regions\n    $$.updateRegion(duration);\n\n    // bars\n    $$.updateBar(durationForExit);\n\n    // lines, areas and cricles\n    $$.updateLine(durationForExit);\n    $$.updateArea(durationForExit);\n    $$.updateCircle();\n\n    // text\n    if ($$.hasDataLabel()) {\n        $$.updateText(durationForExit);\n    }\n\n    // title\n    if ($$.redrawTitle) {\n        $$.redrawTitle();\n    }\n\n    // arc\n    if ($$.redrawArc) {\n        $$.redrawArc(duration, durationForExit, withTransform);\n    }\n\n    // subchart\n    if ($$.redrawSubchart) {\n        $$.redrawSubchart(withSubchart, transitions, duration, durationForExit, areaIndices, barIndices, lineIndices);\n    }\n\n    // circles for select\n    main.selectAll('.' + CLASS.selectedCircles).filter($$.isBarType.bind($$)).selectAll('circle').remove();\n\n    // event rects will redrawn when flow called\n    if (config.interaction_enabled && !options.flow && withEventRect) {\n        $$.redrawEventRect();\n        if ($$.updateZoom) {\n            $$.updateZoom();\n        }\n    }\n\n    // update circleY based on updated parameters\n    $$.updateCircleY();\n\n    // generate circle x/y functions depending on updated params\n    cx = ($$.config.axis_rotated ? $$.circleY : $$.circleX).bind($$);\n    cy = ($$.config.axis_rotated ? $$.circleX : $$.circleY).bind($$);\n\n    if (options.flow) {\n        flow = $$.generateFlow({\n            targets: targetsToShow,\n            flow: options.flow,\n            duration: options.flow.duration,\n            drawBar: drawBar,\n            drawLine: drawLine,\n            drawArea: drawArea,\n            cx: cx,\n            cy: cy,\n            xv: xv,\n            xForText: xForText,\n            yForText: yForText\n        });\n    }\n\n    if ((duration || flow) && $$.isTabVisible()) {\n        // Only use transition if tab visible. See #938.\n        // transition should be derived from one transition\n        d3.transition().duration(duration).each(function () {\n            var transitionsToWait = [];\n\n            // redraw and gather transitions\n            [$$.redrawBar(drawBar, true), $$.redrawLine(drawLine, true), $$.redrawArea(drawArea, true), $$.redrawCircle(cx, cy, true), $$.redrawText(xForText, yForText, options.flow, true), $$.redrawRegion(true), $$.redrawGrid(true)].forEach(function (transitions) {\n                transitions.forEach(function (transition) {\n                    transitionsToWait.push(transition);\n                });\n            });\n\n            // Wait for end of transitions to call flow and onrendered callback\n            waitForDraw = $$.generateWait();\n            transitionsToWait.forEach(function (t) {\n                waitForDraw.add(t);\n            });\n        }).call(waitForDraw, function () {\n            if (flow) {\n                flow();\n            }\n            if (config.onrendered) {\n                config.onrendered.call($$);\n            }\n        });\n    } else {\n        $$.redrawBar(drawBar);\n        $$.redrawLine(drawLine);\n        $$.redrawArea(drawArea);\n        $$.redrawCircle(cx, cy);\n        $$.redrawText(xForText, yForText, options.flow);\n        $$.redrawRegion();\n        $$.redrawGrid();\n        if (config.onrendered) {\n            config.onrendered.call($$);\n        }\n    }\n\n    // update fadein condition\n    $$.mapToIds($$.data.targets).forEach(function (id) {\n        $$.withoutFadeIn[id] = true;\n    });\n};\n\nc3_chart_internal_fn.updateAndRedraw = function (options) {\n    var $$ = this,\n        config = $$.config,\n        transitions;\n    options = options || {};\n    // same with redraw\n    options.withTransition = getOption(options, \"withTransition\", true);\n    options.withTransform = getOption(options, \"withTransform\", false);\n    options.withLegend = getOption(options, \"withLegend\", false);\n    // NOT same with redraw\n    options.withUpdateXDomain = true;\n    options.withUpdateOrgXDomain = true;\n    options.withTransitionForExit = false;\n    options.withTransitionForTransform = getOption(options, \"withTransitionForTransform\", options.withTransition);\n    // MEMO: this needs to be called before updateLegend and it means this ALWAYS needs to be called)\n    $$.updateSizes();\n    // MEMO: called in updateLegend in redraw if withLegend\n    if (!(options.withLegend && config.legend_show)) {\n        transitions = $$.axis.generateTransitions(options.withTransitionForAxis ? config.transition_duration : 0);\n        // Update scales\n        $$.updateScales();\n        $$.updateSvgSize();\n        // Update g positions\n        $$.transformAll(options.withTransitionForTransform, transitions);\n    }\n    // Draw with new sizes & scales\n    $$.redraw(options, transitions);\n};\nc3_chart_internal_fn.redrawWithoutRescale = function () {\n    this.redraw({\n        withY: false,\n        withSubchart: false,\n        withEventRect: false,\n        withTransitionForAxis: false\n    });\n};\n\nc3_chart_internal_fn.isTimeSeries = function () {\n    return this.config.axis_x_type === 'timeseries';\n};\nc3_chart_internal_fn.isCategorized = function () {\n    return this.config.axis_x_type.indexOf('categor') >= 0;\n};\nc3_chart_internal_fn.isCustomX = function () {\n    var $$ = this,\n        config = $$.config;\n    return !$$.isTimeSeries() && (config.data_x || notEmpty(config.data_xs));\n};\n\nc3_chart_internal_fn.isTimeSeriesY = function () {\n    return this.config.axis_y_type === 'timeseries';\n};\n\nc3_chart_internal_fn.getTranslate = function (target) {\n    var $$ = this,\n        config = $$.config,\n        x,\n        y;\n    if (target === 'main') {\n        x = asHalfPixel($$.margin.left);\n        y = asHalfPixel($$.margin.top);\n    } else if (target === 'context') {\n        x = asHalfPixel($$.margin2.left);\n        y = asHalfPixel($$.margin2.top);\n    } else if (target === 'legend') {\n        x = $$.margin3.left;\n        y = $$.margin3.top;\n    } else if (target === 'x') {\n        x = 0;\n        y = config.axis_rotated ? 0 : $$.height;\n    } else if (target === 'y') {\n        x = 0;\n        y = config.axis_rotated ? $$.height : 0;\n    } else if (target === 'y2') {\n        x = config.axis_rotated ? 0 : $$.width;\n        y = config.axis_rotated ? 1 : 0;\n    } else if (target === 'subx') {\n        x = 0;\n        y = config.axis_rotated ? 0 : $$.height2;\n    } else if (target === 'arc') {\n        x = $$.arcWidth / 2;\n        y = $$.arcHeight / 2;\n    }\n    return \"translate(\" + x + \",\" + y + \")\";\n};\nc3_chart_internal_fn.initialOpacity = function (d) {\n    return d.value !== null && this.withoutFadeIn[d.id] ? 1 : 0;\n};\nc3_chart_internal_fn.initialOpacityForCircle = function (d) {\n    return d.value !== null && this.withoutFadeIn[d.id] ? this.opacityForCircle(d) : 0;\n};\nc3_chart_internal_fn.opacityForCircle = function (d) {\n    var isPointShouldBeShown = isFunction(this.config.point_show) ? this.config.point_show(d) : this.config.point_show;\n    var opacity = isPointShouldBeShown ? 1 : 0;\n    return isValue(d.value) ? this.isScatterType(d) ? 0.5 : opacity : 0;\n};\nc3_chart_internal_fn.opacityForText = function () {\n    return this.hasDataLabel() ? 1 : 0;\n};\nc3_chart_internal_fn.xx = function (d) {\n    return d ? this.x(d.x) : null;\n};\nc3_chart_internal_fn.xv = function (d) {\n    var $$ = this,\n        value = d.value;\n    if ($$.isTimeSeries()) {\n        value = $$.parseDate(d.value);\n    } else if ($$.isCategorized() && typeof d.value === 'string') {\n        value = $$.config.axis_x_categories.indexOf(d.value);\n    }\n    return Math.ceil($$.x(value));\n};\nc3_chart_internal_fn.yv = function (d) {\n    var $$ = this,\n        yScale = d.axis && d.axis === 'y2' ? $$.y2 : $$.y;\n    return Math.ceil(yScale(d.value));\n};\nc3_chart_internal_fn.subxx = function (d) {\n    return d ? this.subX(d.x) : null;\n};\n\nc3_chart_internal_fn.transformMain = function (withTransition, transitions) {\n    var $$ = this,\n        xAxis,\n        yAxis,\n        y2Axis;\n    if (transitions && transitions.axisX) {\n        xAxis = transitions.axisX;\n    } else {\n        xAxis = $$.main.select('.' + CLASS.axisX);\n        if (withTransition) {\n            xAxis = xAxis.transition();\n        }\n    }\n    if (transitions && transitions.axisY) {\n        yAxis = transitions.axisY;\n    } else {\n        yAxis = $$.main.select('.' + CLASS.axisY);\n        if (withTransition) {\n            yAxis = yAxis.transition();\n        }\n    }\n    if (transitions && transitions.axisY2) {\n        y2Axis = transitions.axisY2;\n    } else {\n        y2Axis = $$.main.select('.' + CLASS.axisY2);\n        if (withTransition) {\n            y2Axis = y2Axis.transition();\n        }\n    }\n    (withTransition ? $$.main.transition() : $$.main).attr(\"transform\", $$.getTranslate('main'));\n    xAxis.attr(\"transform\", $$.getTranslate('x'));\n    yAxis.attr(\"transform\", $$.getTranslate('y'));\n    y2Axis.attr(\"transform\", $$.getTranslate('y2'));\n    $$.main.select('.' + CLASS.chartArcs).attr(\"transform\", $$.getTranslate('arc'));\n};\nc3_chart_internal_fn.transformAll = function (withTransition, transitions) {\n    var $$ = this;\n    $$.transformMain(withTransition, transitions);\n    if ($$.config.subchart_show) {\n        $$.transformContext(withTransition, transitions);\n    }\n    if ($$.legend) {\n        $$.transformLegend(withTransition);\n    }\n};\n\nc3_chart_internal_fn.updateSvgSize = function () {\n    var $$ = this,\n        brush = $$.svg.select(\".c3-brush .background\");\n    $$.svg.attr('width', $$.currentWidth).attr('height', $$.currentHeight);\n    $$.svg.selectAll(['#' + $$.clipId, '#' + $$.clipIdForGrid]).select('rect').attr('width', $$.width).attr('height', $$.height);\n    $$.svg.select('#' + $$.clipIdForXAxis).select('rect').attr('x', $$.getXAxisClipX.bind($$)).attr('y', $$.getXAxisClipY.bind($$)).attr('width', $$.getXAxisClipWidth.bind($$)).attr('height', $$.getXAxisClipHeight.bind($$));\n    $$.svg.select('#' + $$.clipIdForYAxis).select('rect').attr('x', $$.getYAxisClipX.bind($$)).attr('y', $$.getYAxisClipY.bind($$)).attr('width', $$.getYAxisClipWidth.bind($$)).attr('height', $$.getYAxisClipHeight.bind($$));\n    $$.svg.select('#' + $$.clipIdForSubchart).select('rect').attr('width', $$.width).attr('height', brush.size() ? brush.attr('height') : 0);\n    $$.svg.select('.' + CLASS.zoomRect).attr('width', $$.width).attr('height', $$.height);\n    // MEMO: parent div's height will be bigger than svg when <!DOCTYPE html>\n    $$.selectChart.style('max-height', $$.currentHeight + \"px\");\n};\n\nc3_chart_internal_fn.updateDimension = function (withoutAxis) {\n    var $$ = this;\n    if (!withoutAxis) {\n        if ($$.config.axis_rotated) {\n            $$.axes.x.call($$.xAxis);\n            $$.axes.subx.call($$.subXAxis);\n        } else {\n            $$.axes.y.call($$.yAxis);\n            $$.axes.y2.call($$.y2Axis);\n        }\n    }\n    $$.updateSizes();\n    $$.updateScales();\n    $$.updateSvgSize();\n    $$.transformAll(false);\n};\n\nc3_chart_internal_fn.observeInserted = function (selection) {\n    var $$ = this,\n        observer;\n    if (typeof MutationObserver === 'undefined') {\n        window.console.error(\"MutationObserver not defined.\");\n        return;\n    }\n    observer = new MutationObserver(function (mutations) {\n        mutations.forEach(function (mutation) {\n            if (mutation.type === 'childList' && mutation.previousSibling) {\n                observer.disconnect();\n                // need to wait for completion of load because size calculation requires the actual sizes determined after that completion\n                $$.intervalForObserveInserted = window.setInterval(function () {\n                    // parentNode will NOT be null when completed\n                    if (selection.node().parentNode) {\n                        window.clearInterval($$.intervalForObserveInserted);\n                        $$.updateDimension();\n                        if ($$.brush) {\n                            $$.brush.update();\n                        }\n                        $$.config.oninit.call($$);\n                        $$.redraw({\n                            withTransform: true,\n                            withUpdateXDomain: true,\n                            withUpdateOrgXDomain: true,\n                            withTransition: false,\n                            withTransitionForTransform: false,\n                            withLegend: true\n                        });\n                        selection.transition().style('opacity', 1);\n                    }\n                }, 10);\n            }\n        });\n    });\n    observer.observe(selection.node(), { attributes: true, childList: true, characterData: true });\n};\n\nc3_chart_internal_fn.bindResize = function () {\n    var $$ = this,\n        config = $$.config;\n\n    $$.resizeFunction = $$.generateResize();\n\n    $$.resizeFunction.add(function () {\n        config.onresize.call($$);\n    });\n    if (config.resize_auto) {\n        $$.resizeFunction.add(function () {\n            if ($$.resizeTimeout !== undefined) {\n                window.clearTimeout($$.resizeTimeout);\n            }\n            $$.resizeTimeout = window.setTimeout(function () {\n                delete $$.resizeTimeout;\n                $$.api.flush();\n            }, 100);\n        });\n    }\n    $$.resizeFunction.add(function () {\n        config.onresized.call($$);\n    });\n\n    if (window.attachEvent) {\n        window.attachEvent('onresize', $$.resizeFunction);\n    } else if (window.addEventListener) {\n        window.addEventListener('resize', $$.resizeFunction, false);\n    } else {\n        // fallback to this, if this is a very old browser\n        var wrapper = window.onresize;\n        if (!wrapper) {\n            // create a wrapper that will call all charts\n            wrapper = $$.generateResize();\n        } else if (!wrapper.add || !wrapper.remove) {\n            // there is already a handler registered, make sure we call it too\n            wrapper = $$.generateResize();\n            wrapper.add(window.onresize);\n        }\n        // add this graph to the wrapper, we will be removed if the user calls destroy\n        wrapper.add($$.resizeFunction);\n        window.onresize = wrapper;\n    }\n};\n\nc3_chart_internal_fn.generateResize = function () {\n    var resizeFunctions = [];\n    function callResizeFunctions() {\n        resizeFunctions.forEach(function (f) {\n            f();\n        });\n    }\n    callResizeFunctions.add = function (f) {\n        resizeFunctions.push(f);\n    };\n    callResizeFunctions.remove = function (f) {\n        for (var i = 0; i < resizeFunctions.length; i++) {\n            if (resizeFunctions[i] === f) {\n                resizeFunctions.splice(i, 1);\n                break;\n            }\n        }\n    };\n    return callResizeFunctions;\n};\n\nc3_chart_internal_fn.endall = function (transition, callback) {\n    var n = 0;\n    transition.each(function () {\n        ++n;\n    }).each(\"end\", function () {\n        if (! --n) {\n            callback.apply(this, arguments);\n        }\n    });\n};\nc3_chart_internal_fn.generateWait = function () {\n    var transitionsToWait = [],\n        f = function f(transition, callback) {\n        var timer = setInterval(function () {\n            var done = 0;\n            transitionsToWait.forEach(function (t) {\n                if (t.empty()) {\n                    done += 1;\n                    return;\n                }\n                try {\n                    t.transition();\n                } catch (e) {\n                    done += 1;\n                }\n            });\n            if (done === transitionsToWait.length) {\n                clearInterval(timer);\n                if (callback) {\n                    callback();\n                }\n            }\n        }, 10);\n    };\n    f.add = function (transition) {\n        transitionsToWait.push(transition);\n    };\n    return f;\n};\n\nc3_chart_internal_fn.parseDate = function (date) {\n    var $$ = this,\n        parsedDate;\n    if (date instanceof Date) {\n        parsedDate = date;\n    } else if (typeof date === 'string') {\n        parsedDate = $$.dataTimeFormat($$.config.data_xFormat).parse(date);\n    } else if ((typeof date === 'undefined' ? 'undefined' : _typeof(date)) === 'object') {\n        parsedDate = new Date(+date);\n    } else if (typeof date === 'number' && !isNaN(date)) {\n        parsedDate = new Date(+date);\n    }\n    if (!parsedDate || isNaN(+parsedDate)) {\n        window.console.error(\"Failed to parse x '\" + date + \"' to Date object\");\n    }\n    return parsedDate;\n};\n\nc3_chart_internal_fn.isTabVisible = function () {\n    var hidden;\n    if (typeof document.hidden !== \"undefined\") {\n        // Opera 12.10 and Firefox 18 and later support\n        hidden = \"hidden\";\n    } else if (typeof document.mozHidden !== \"undefined\") {\n        hidden = \"mozHidden\";\n    } else if (typeof document.msHidden !== \"undefined\") {\n        hidden = \"msHidden\";\n    } else if (typeof document.webkitHidden !== \"undefined\") {\n        hidden = \"webkitHidden\";\n    }\n\n    return document[hidden] ? false : true;\n};\n\nc3_chart_internal_fn.isValue = isValue;\nc3_chart_internal_fn.isFunction = isFunction;\nc3_chart_internal_fn.isString = isString;\nc3_chart_internal_fn.isUndefined = isUndefined;\nc3_chart_internal_fn.isDefined = isDefined;\nc3_chart_internal_fn.ceil10 = ceil10;\nc3_chart_internal_fn.asHalfPixel = asHalfPixel;\nc3_chart_internal_fn.diffDomain = diffDomain;\nc3_chart_internal_fn.isEmpty = isEmpty;\nc3_chart_internal_fn.notEmpty = notEmpty;\nc3_chart_internal_fn.notEmpty = notEmpty;\nc3_chart_internal_fn.getOption = getOption;\nc3_chart_internal_fn.hasValue = hasValue;\nc3_chart_internal_fn.sanitise = sanitise;\nc3_chart_internal_fn.getPathBox = getPathBox;\nc3_chart_internal_fn.CLASS = CLASS;\n\n/* jshint ignore:start */\n\n// PhantomJS doesn't have support for Function.prototype.bind, which has caused confusion. Use\n// this polyfill to avoid the confusion.\n// https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Function/bind#Polyfill\n\nif (!Function.prototype.bind) {\n    Function.prototype.bind = function (oThis) {\n        if (typeof this !== 'function') {\n            // closest thing possible to the ECMAScript 5\n            // internal IsCallable function\n            throw new TypeError('Function.prototype.bind - what is trying to be bound is not callable');\n        }\n\n        var aArgs = Array.prototype.slice.call(arguments, 1),\n            fToBind = this,\n            fNOP = function fNOP() {},\n            fBound = function fBound() {\n            return fToBind.apply(this instanceof fNOP ? this : oThis, aArgs.concat(Array.prototype.slice.call(arguments)));\n        };\n\n        fNOP.prototype = this.prototype;\n        fBound.prototype = new fNOP();\n\n        return fBound;\n    };\n}\n\n// SVGPathSeg API polyfill\n// https://github.com/progers/pathseg\n//\n// This is a drop-in replacement for the SVGPathSeg and SVGPathSegList APIs that were removed from\n// SVG2 (https://lists.w3.org/Archives/Public/www-svg/2015Jun/0044.html), including the latest spec\n// changes which were implemented in Firefox 43 and Chrome 46.\n\n(function () {\n    \"use strict\";\n\n    if (!(\"SVGPathSeg\" in window)) {\n        // Spec: http://www.w3.org/TR/SVG11/single-page.html#paths-InterfaceSVGPathSeg\n        window.SVGPathSeg = function (type, typeAsLetter, owningPathSegList) {\n            this.pathSegType = type;\n            this.pathSegTypeAsLetter = typeAsLetter;\n            this._owningPathSegList = owningPathSegList;\n        };\n\n        window.SVGPathSeg.prototype.classname = \"SVGPathSeg\";\n\n        window.SVGPathSeg.PATHSEG_UNKNOWN = 0;\n        window.SVGPathSeg.PATHSEG_CLOSEPATH = 1;\n        window.SVGPathSeg.PATHSEG_MOVETO_ABS = 2;\n        window.SVGPathSeg.PATHSEG_MOVETO_REL = 3;\n        window.SVGPathSeg.PATHSEG_LINETO_ABS = 4;\n        window.SVGPathSeg.PATHSEG_LINETO_REL = 5;\n        window.SVGPathSeg.PATHSEG_CURVETO_CUBIC_ABS = 6;\n        window.SVGPathSeg.PATHSEG_CURVETO_CUBIC_REL = 7;\n        window.SVGPathSeg.PATHSEG_CURVETO_QUADRATIC_ABS = 8;\n        window.SVGPathSeg.PATHSEG_CURVETO_QUADRATIC_REL = 9;\n        window.SVGPathSeg.PATHSEG_ARC_ABS = 10;\n        window.SVGPathSeg.PATHSEG_ARC_REL = 11;\n        window.SVGPathSeg.PATHSEG_LINETO_HORIZONTAL_ABS = 12;\n        window.SVGPathSeg.PATHSEG_LINETO_HORIZONTAL_REL = 13;\n        window.SVGPathSeg.PATHSEG_LINETO_VERTICAL_ABS = 14;\n        window.SVGPathSeg.PATHSEG_LINETO_VERTICAL_REL = 15;\n        window.SVGPathSeg.PATHSEG_CURVETO_CUBIC_SMOOTH_ABS = 16;\n        window.SVGPathSeg.PATHSEG_CURVETO_CUBIC_SMOOTH_REL = 17;\n        window.SVGPathSeg.PATHSEG_CURVETO_QUADRATIC_SMOOTH_ABS = 18;\n        window.SVGPathSeg.PATHSEG_CURVETO_QUADRATIC_SMOOTH_REL = 19;\n\n        // Notify owning PathSegList on any changes so they can be synchronized back to the path element.\n        window.SVGPathSeg.prototype._segmentChanged = function () {\n            if (this._owningPathSegList) this._owningPathSegList.segmentChanged(this);\n        };\n\n        window.SVGPathSegClosePath = function (owningPathSegList) {\n            window.SVGPathSeg.call(this, window.SVGPathSeg.PATHSEG_CLOSEPATH, \"z\", owningPathSegList);\n        };\n        window.SVGPathSegClosePath.prototype = Object.create(window.SVGPathSeg.prototype);\n        window.SVGPathSegClosePath.prototype.toString = function () {\n            return \"[object SVGPathSegClosePath]\";\n        };\n        window.SVGPathSegClosePath.prototype._asPathString = function () {\n            return this.pathSegTypeAsLetter;\n        };\n        window.SVGPathSegClosePath.prototype.clone = function () {\n            return new window.SVGPathSegClosePath(undefined);\n        };\n\n        window.SVGPathSegMovetoAbs = function (owningPathSegList, x, y) {\n            window.SVGPathSeg.call(this, window.SVGPathSeg.PATHSEG_MOVETO_ABS, \"M\", owningPathSegList);\n            this._x = x;\n            this._y = y;\n        };\n        window.SVGPathSegMovetoAbs.prototype = Object.create(window.SVGPathSeg.prototype);\n        window.SVGPathSegMovetoAbs.prototype.toString = function () {\n            return \"[object SVGPathSegMovetoAbs]\";\n        };\n        window.SVGPathSegMovetoAbs.prototype._asPathString = function () {\n            return this.pathSegTypeAsLetter + \" \" + this._x + \" \" + this._y;\n        };\n        window.SVGPathSegMovetoAbs.prototype.clone = function () {\n            return new window.SVGPathSegMovetoAbs(undefined, this._x, this._y);\n        };\n        Object.defineProperty(window.SVGPathSegMovetoAbs.prototype, \"x\", { get: function get() {\n                return this._x;\n            }, set: function set(x) {\n                this._x = x;this._segmentChanged();\n            }, enumerable: true });\n        Object.defineProperty(window.SVGPathSegMovetoAbs.prototype, \"y\", { get: function get() {\n                return this._y;\n            }, set: function set(y) {\n                this._y = y;this._segmentChanged();\n            }, enumerable: true });\n\n        window.SVGPathSegMovetoRel = function (owningPathSegList, x, y) {\n            window.SVGPathSeg.call(this, window.SVGPathSeg.PATHSEG_MOVETO_REL, \"m\", owningPathSegList);\n            this._x = x;\n            this._y = y;\n        };\n        window.SVGPathSegMovetoRel.prototype = Object.create(window.SVGPathSeg.prototype);\n        window.SVGPathSegMovetoRel.prototype.toString = function () {\n            return \"[object SVGPathSegMovetoRel]\";\n        };\n        window.SVGPathSegMovetoRel.prototype._asPathString = function () {\n            return this.pathSegTypeAsLetter + \" \" + this._x + \" \" + this._y;\n        };\n        window.SVGPathSegMovetoRel.prototype.clone = function () {\n            return new window.SVGPathSegMovetoRel(undefined, this._x, this._y);\n        };\n        Object.defineProperty(window.SVGPathSegMovetoRel.prototype, \"x\", { get: function get() {\n                return this._x;\n            }, set: function set(x) {\n                this._x = x;this._segmentChanged();\n            }, enumerable: true });\n        Object.defineProperty(window.SVGPathSegMovetoRel.prototype, \"y\", { get: function get() {\n                return this._y;\n            }, set: function set(y) {\n                this._y = y;this._segmentChanged();\n            }, enumerable: true });\n\n        window.SVGPathSegLinetoAbs = function (owningPathSegList, x, y) {\n            window.SVGPathSeg.call(this, window.SVGPathSeg.PATHSEG_LINETO_ABS, \"L\", owningPathSegList);\n            this._x = x;\n            this._y = y;\n        };\n        window.SVGPathSegLinetoAbs.prototype = Object.create(window.SVGPathSeg.prototype);\n        window.SVGPathSegLinetoAbs.prototype.toString = function () {\n            return \"[object SVGPathSegLinetoAbs]\";\n        };\n        window.SVGPathSegLinetoAbs.prototype._asPathString = function () {\n            return this.pathSegTypeAsLetter + \" \" + this._x + \" \" + this._y;\n        };\n        window.SVGPathSegLinetoAbs.prototype.clone = function () {\n            return new window.SVGPathSegLinetoAbs(undefined, this._x, this._y);\n        };\n        Object.defineProperty(window.SVGPathSegLinetoAbs.prototype, \"x\", { get: function get() {\n                return this._x;\n            }, set: function set(x) {\n                this._x = x;this._segmentChanged();\n            }, enumerable: true });\n        Object.defineProperty(window.SVGPathSegLinetoAbs.prototype, \"y\", { get: function get() {\n                return this._y;\n            }, set: function set(y) {\n                this._y = y;this._segmentChanged();\n            }, enumerable: true });\n\n        window.SVGPathSegLinetoRel = function (owningPathSegList, x, y) {\n            window.SVGPathSeg.call(this, window.SVGPathSeg.PATHSEG_LINETO_REL, \"l\", owningPathSegList);\n            this._x = x;\n            this._y = y;\n        };\n        window.SVGPathSegLinetoRel.prototype = Object.create(window.SVGPathSeg.prototype);\n        window.SVGPathSegLinetoRel.prototype.toString = function () {\n            return \"[object SVGPathSegLinetoRel]\";\n        };\n        window.SVGPathSegLinetoRel.prototype._asPathString = function () {\n            return this.pathSegTypeAsLetter + \" \" + this._x + \" \" + this._y;\n        };\n        window.SVGPathSegLinetoRel.prototype.clone = function () {\n            return new window.SVGPathSegLinetoRel(undefined, this._x, this._y);\n        };\n        Object.defineProperty(window.SVGPathSegLinetoRel.prototype, \"x\", { get: function get() {\n                return this._x;\n            }, set: function set(x) {\n                this._x = x;this._segmentChanged();\n            }, enumerable: true });\n        Object.defineProperty(window.SVGPathSegLinetoRel.prototype, \"y\", { get: function get() {\n                return this._y;\n            }, set: function set(y) {\n                this._y = y;this._segmentChanged();\n            }, enumerable: true });\n\n        window.SVGPathSegCurvetoCubicAbs = function (owningPathSegList, x, y, x1, y1, x2, y2) {\n            window.SVGPathSeg.call(this, window.SVGPathSeg.PATHSEG_CURVETO_CUBIC_ABS, \"C\", owningPathSegList);\n            this._x = x;\n            this._y = y;\n            this._x1 = x1;\n            this._y1 = y1;\n            this._x2 = x2;\n            this._y2 = y2;\n        };\n        window.SVGPathSegCurvetoCubicAbs.prototype = Object.create(window.SVGPathSeg.prototype);\n        window.SVGPathSegCurvetoCubicAbs.prototype.toString = function () {\n            return \"[object SVGPathSegCurvetoCubicAbs]\";\n        };\n        window.SVGPathSegCurvetoCubicAbs.prototype._asPathString = function () {\n            return this.pathSegTypeAsLetter + \" \" + this._x1 + \" \" + this._y1 + \" \" + this._x2 + \" \" + this._y2 + \" \" + this._x + \" \" + this._y;\n        };\n        window.SVGPathSegCurvetoCubicAbs.prototype.clone = function () {\n            return new window.SVGPathSegCurvetoCubicAbs(undefined, this._x, this._y, this._x1, this._y1, this._x2, this._y2);\n        };\n        Object.defineProperty(window.SVGPathSegCurvetoCubicAbs.prototype, \"x\", { get: function get() {\n                return this._x;\n            }, set: function set(x) {\n                this._x = x;this._segmentChanged();\n            }, enumerable: true });\n        Object.defineProperty(window.SVGPathSegCurvetoCubicAbs.prototype, \"y\", { get: function get() {\n                return this._y;\n            }, set: function set(y) {\n                this._y = y;this._segmentChanged();\n            }, enumerable: true });\n        Object.defineProperty(window.SVGPathSegCurvetoCubicAbs.prototype, \"x1\", { get: function get() {\n                return this._x1;\n            }, set: function set(x1) {\n                this._x1 = x1;this._segmentChanged();\n            }, enumerable: true });\n        Object.defineProperty(window.SVGPathSegCurvetoCubicAbs.prototype, \"y1\", { get: function get() {\n                return this._y1;\n            }, set: function set(y1) {\n                this._y1 = y1;this._segmentChanged();\n            }, enumerable: true });\n        Object.defineProperty(window.SVGPathSegCurvetoCubicAbs.prototype, \"x2\", { get: function get() {\n                return this._x2;\n            }, set: function set(x2) {\n                this._x2 = x2;this._segmentChanged();\n            }, enumerable: true });\n        Object.defineProperty(window.SVGPathSegCurvetoCubicAbs.prototype, \"y2\", { get: function get() {\n                return this._y2;\n            }, set: function set(y2) {\n                this._y2 = y2;this._segmentChanged();\n            }, enumerable: true });\n\n        window.SVGPathSegCurvetoCubicRel = function (owningPathSegList, x, y, x1, y1, x2, y2) {\n            window.SVGPathSeg.call(this, window.SVGPathSeg.PATHSEG_CURVETO_CUBIC_REL, \"c\", owningPathSegList);\n            this._x = x;\n            this._y = y;\n            this._x1 = x1;\n            this._y1 = y1;\n            this._x2 = x2;\n            this._y2 = y2;\n        };\n        window.SVGPathSegCurvetoCubicRel.prototype = Object.create(window.SVGPathSeg.prototype);\n        window.SVGPathSegCurvetoCubicRel.prototype.toString = function () {\n            return \"[object SVGPathSegCurvetoCubicRel]\";\n        };\n        window.SVGPathSegCurvetoCubicRel.prototype._asPathString = function () {\n            return this.pathSegTypeAsLetter + \" \" + this._x1 + \" \" + this._y1 + \" \" + this._x2 + \" \" + this._y2 + \" \" + this._x + \" \" + this._y;\n        };\n        window.SVGPathSegCurvetoCubicRel.prototype.clone = function () {\n            return new window.SVGPathSegCurvetoCubicRel(undefined, this._x, this._y, this._x1, this._y1, this._x2, this._y2);\n        };\n        Object.defineProperty(window.SVGPathSegCurvetoCubicRel.prototype, \"x\", { get: function get() {\n                return this._x;\n            }, set: function set(x) {\n                this._x = x;this._segmentChanged();\n            }, enumerable: true });\n        Object.defineProperty(window.SVGPathSegCurvetoCubicRel.prototype, \"y\", { get: function get() {\n                return this._y;\n            }, set: function set(y) {\n                this._y = y;this._segmentChanged();\n            }, enumerable: true });\n        Object.defineProperty(window.SVGPathSegCurvetoCubicRel.prototype, \"x1\", { get: function get() {\n                return this._x1;\n            }, set: function set(x1) {\n                this._x1 = x1;this._segmentChanged();\n            }, enumerable: true });\n        Object.defineProperty(window.SVGPathSegCurvetoCubicRel.prototype, \"y1\", { get: function get() {\n                return this._y1;\n            }, set: function set(y1) {\n                this._y1 = y1;this._segmentChanged();\n            }, enumerable: true });\n        Object.defineProperty(window.SVGPathSegCurvetoCubicRel.prototype, \"x2\", { get: function get() {\n                return this._x2;\n            }, set: function set(x2) {\n                this._x2 = x2;this._segmentChanged();\n            }, enumerable: true });\n        Object.defineProperty(window.SVGPathSegCurvetoCubicRel.prototype, \"y2\", { get: function get() {\n                return this._y2;\n            }, set: function set(y2) {\n                this._y2 = y2;this._segmentChanged();\n            }, enumerable: true });\n\n        window.SVGPathSegCurvetoQuadraticAbs = function (owningPathSegList, x, y, x1, y1) {\n            window.SVGPathSeg.call(this, window.SVGPathSeg.PATHSEG_CURVETO_QUADRATIC_ABS, \"Q\", owningPathSegList);\n            this._x = x;\n            this._y = y;\n            this._x1 = x1;\n            this._y1 = y1;\n        };\n        window.SVGPathSegCurvetoQuadraticAbs.prototype = Object.create(window.SVGPathSeg.prototype);\n        window.SVGPathSegCurvetoQuadraticAbs.prototype.toString = function () {\n            return \"[object SVGPathSegCurvetoQuadraticAbs]\";\n        };\n        window.SVGPathSegCurvetoQuadraticAbs.prototype._asPathString = function () {\n            return this.pathSegTypeAsLetter + \" \" + this._x1 + \" \" + this._y1 + \" \" + this._x + \" \" + this._y;\n        };\n        window.SVGPathSegCurvetoQuadraticAbs.prototype.clone = function () {\n            return new window.SVGPathSegCurvetoQuadraticAbs(undefined, this._x, this._y, this._x1, this._y1);\n        };\n        Object.defineProperty(window.SVGPathSegCurvetoQuadraticAbs.prototype, \"x\", { get: function get() {\n                return this._x;\n            }, set: function set(x) {\n                this._x = x;this._segmentChanged();\n            }, enumerable: true });\n        Object.defineProperty(window.SVGPathSegCurvetoQuadraticAbs.prototype, \"y\", { get: function get() {\n                return this._y;\n            }, set: function set(y) {\n                this._y = y;this._segmentChanged();\n            }, enumerable: true });\n        Object.defineProperty(window.SVGPathSegCurvetoQuadraticAbs.prototype, \"x1\", { get: function get() {\n                return this._x1;\n            }, set: function set(x1) {\n                this._x1 = x1;this._segmentChanged();\n            }, enumerable: true });\n        Object.defineProperty(window.SVGPathSegCurvetoQuadraticAbs.prototype, \"y1\", { get: function get() {\n                return this._y1;\n            }, set: function set(y1) {\n                this._y1 = y1;this._segmentChanged();\n            }, enumerable: true });\n\n        window.SVGPathSegCurvetoQuadraticRel = function (owningPathSegList, x, y, x1, y1) {\n            window.SVGPathSeg.call(this, window.SVGPathSeg.PATHSEG_CURVETO_QUADRATIC_REL, \"q\", owningPathSegList);\n            this._x = x;\n            this._y = y;\n            this._x1 = x1;\n            this._y1 = y1;\n        };\n        window.SVGPathSegCurvetoQuadraticRel.prototype = Object.create(window.SVGPathSeg.prototype);\n        window.SVGPathSegCurvetoQuadraticRel.prototype.toString = function () {\n            return \"[object SVGPathSegCurvetoQuadraticRel]\";\n        };\n        window.SVGPathSegCurvetoQuadraticRel.prototype._asPathString = function () {\n            return this.pathSegTypeAsLetter + \" \" + this._x1 + \" \" + this._y1 + \" \" + this._x + \" \" + this._y;\n        };\n        window.SVGPathSegCurvetoQuadraticRel.prototype.clone = function () {\n            return new window.SVGPathSegCurvetoQuadraticRel(undefined, this._x, this._y, this._x1, this._y1);\n        };\n        Object.defineProperty(window.SVGPathSegCurvetoQuadraticRel.prototype, \"x\", { get: function get() {\n                return this._x;\n            }, set: function set(x) {\n                this._x = x;this._segmentChanged();\n            }, enumerable: true });\n        Object.defineProperty(window.SVGPathSegCurvetoQuadraticRel.prototype, \"y\", { get: function get() {\n                return this._y;\n            }, set: function set(y) {\n                this._y = y;this._segmentChanged();\n            }, enumerable: true });\n        Object.defineProperty(window.SVGPathSegCurvetoQuadraticRel.prototype, \"x1\", { get: function get() {\n                return this._x1;\n            }, set: function set(x1) {\n                this._x1 = x1;this._segmentChanged();\n            }, enumerable: true });\n        Object.defineProperty(window.SVGPathSegCurvetoQuadraticRel.prototype, \"y1\", { get: function get() {\n                return this._y1;\n            }, set: function set(y1) {\n                this._y1 = y1;this._segmentChanged();\n            }, enumerable: true });\n\n        window.SVGPathSegArcAbs = function (owningPathSegList, x, y, r1, r2, angle, largeArcFlag, sweepFlag) {\n            window.SVGPathSeg.call(this, window.SVGPathSeg.PATHSEG_ARC_ABS, \"A\", owningPathSegList);\n            this._x = x;\n            this._y = y;\n            this._r1 = r1;\n            this._r2 = r2;\n            this._angle = angle;\n            this._largeArcFlag = largeArcFlag;\n            this._sweepFlag = sweepFlag;\n        };\n        window.SVGPathSegArcAbs.prototype = Object.create(window.SVGPathSeg.prototype);\n        window.SVGPathSegArcAbs.prototype.toString = function () {\n            return \"[object SVGPathSegArcAbs]\";\n        };\n        window.SVGPathSegArcAbs.prototype._asPathString = function () {\n            return this.pathSegTypeAsLetter + \" \" + this._r1 + \" \" + this._r2 + \" \" + this._angle + \" \" + (this._largeArcFlag ? \"1\" : \"0\") + \" \" + (this._sweepFlag ? \"1\" : \"0\") + \" \" + this._x + \" \" + this._y;\n        };\n        window.SVGPathSegArcAbs.prototype.clone = function () {\n            return new window.SVGPathSegArcAbs(undefined, this._x, this._y, this._r1, this._r2, this._angle, this._largeArcFlag, this._sweepFlag);\n        };\n        Object.defineProperty(window.SVGPathSegArcAbs.prototype, \"x\", { get: function get() {\n                return this._x;\n            }, set: function set(x) {\n                this._x = x;this._segmentChanged();\n            }, enumerable: true });\n        Object.defineProperty(window.SVGPathSegArcAbs.prototype, \"y\", { get: function get() {\n                return this._y;\n            }, set: function set(y) {\n                this._y = y;this._segmentChanged();\n            }, enumerable: true });\n        Object.defineProperty(window.SVGPathSegArcAbs.prototype, \"r1\", { get: function get() {\n                return this._r1;\n            }, set: function set(r1) {\n                this._r1 = r1;this._segmentChanged();\n            }, enumerable: true });\n        Object.defineProperty(window.SVGPathSegArcAbs.prototype, \"r2\", { get: function get() {\n                return this._r2;\n            }, set: function set(r2) {\n                this._r2 = r2;this._segmentChanged();\n            }, enumerable: true });\n        Object.defineProperty(window.SVGPathSegArcAbs.prototype, \"angle\", { get: function get() {\n                return this._angle;\n            }, set: function set(angle) {\n                this._angle = angle;this._segmentChanged();\n            }, enumerable: true });\n        Object.defineProperty(window.SVGPathSegArcAbs.prototype, \"largeArcFlag\", { get: function get() {\n                return this._largeArcFlag;\n            }, set: function set(largeArcFlag) {\n                this._largeArcFlag = largeArcFlag;this._segmentChanged();\n            }, enumerable: true });\n        Object.defineProperty(window.SVGPathSegArcAbs.prototype, \"sweepFlag\", { get: function get() {\n                return this._sweepFlag;\n            }, set: function set(sweepFlag) {\n                this._sweepFlag = sweepFlag;this._segmentChanged();\n            }, enumerable: true });\n\n        window.SVGPathSegArcRel = function (owningPathSegList, x, y, r1, r2, angle, largeArcFlag, sweepFlag) {\n            window.SVGPathSeg.call(this, window.SVGPathSeg.PATHSEG_ARC_REL, \"a\", owningPathSegList);\n            this._x = x;\n            this._y = y;\n            this._r1 = r1;\n            this._r2 = r2;\n            this._angle = angle;\n            this._largeArcFlag = largeArcFlag;\n            this._sweepFlag = sweepFlag;\n        };\n        window.SVGPathSegArcRel.prototype = Object.create(window.SVGPathSeg.prototype);\n        window.SVGPathSegArcRel.prototype.toString = function () {\n            return \"[object SVGPathSegArcRel]\";\n        };\n        window.SVGPathSegArcRel.prototype._asPathString = function () {\n            return this.pathSegTypeAsLetter + \" \" + this._r1 + \" \" + this._r2 + \" \" + this._angle + \" \" + (this._largeArcFlag ? \"1\" : \"0\") + \" \" + (this._sweepFlag ? \"1\" : \"0\") + \" \" + this._x + \" \" + this._y;\n        };\n        window.SVGPathSegArcRel.prototype.clone = function () {\n            return new window.SVGPathSegArcRel(undefined, this._x, this._y, this._r1, this._r2, this._angle, this._largeArcFlag, this._sweepFlag);\n        };\n        Object.defineProperty(window.SVGPathSegArcRel.prototype, \"x\", { get: function get() {\n                return this._x;\n            }, set: function set(x) {\n                this._x = x;this._segmentChanged();\n            }, enumerable: true });\n        Object.defineProperty(window.SVGPathSegArcRel.prototype, \"y\", { get: function get() {\n                return this._y;\n            }, set: function set(y) {\n                this._y = y;this._segmentChanged();\n            }, enumerable: true });\n        Object.defineProperty(window.SVGPathSegArcRel.prototype, \"r1\", { get: function get() {\n                return this._r1;\n            }, set: function set(r1) {\n                this._r1 = r1;this._segmentChanged();\n            }, enumerable: true });\n        Object.defineProperty(window.SVGPathSegArcRel.prototype, \"r2\", { get: function get() {\n                return this._r2;\n            }, set: function set(r2) {\n                this._r2 = r2;this._segmentChanged();\n            }, enumerable: true });\n        Object.defineProperty(window.SVGPathSegArcRel.prototype, \"angle\", { get: function get() {\n                return this._angle;\n            }, set: function set(angle) {\n                this._angle = angle;this._segmentChanged();\n            }, enumerable: true });\n        Object.defineProperty(window.SVGPathSegArcRel.prototype, \"largeArcFlag\", { get: function get() {\n                return this._largeArcFlag;\n            }, set: function set(largeArcFlag) {\n                this._largeArcFlag = largeArcFlag;this._segmentChanged();\n            }, enumerable: true });\n        Object.defineProperty(window.SVGPathSegArcRel.prototype, \"sweepFlag\", { get: function get() {\n                return this._sweepFlag;\n            }, set: function set(sweepFlag) {\n                this._sweepFlag = sweepFlag;this._segmentChanged();\n            }, enumerable: true });\n\n        window.SVGPathSegLinetoHorizontalAbs = function (owningPathSegList, x) {\n            window.SVGPathSeg.call(this, window.SVGPathSeg.PATHSEG_LINETO_HORIZONTAL_ABS, \"H\", owningPathSegList);\n            this._x = x;\n        };\n        window.SVGPathSegLinetoHorizontalAbs.prototype = Object.create(window.SVGPathSeg.prototype);\n        window.SVGPathSegLinetoHorizontalAbs.prototype.toString = function () {\n            return \"[object SVGPathSegLinetoHorizontalAbs]\";\n        };\n        window.SVGPathSegLinetoHorizontalAbs.prototype._asPathString = function () {\n            return this.pathSegTypeAsLetter + \" \" + this._x;\n        };\n        window.SVGPathSegLinetoHorizontalAbs.prototype.clone = function () {\n            return new window.SVGPathSegLinetoHorizontalAbs(undefined, this._x);\n        };\n        Object.defineProperty(window.SVGPathSegLinetoHorizontalAbs.prototype, \"x\", { get: function get() {\n                return this._x;\n            }, set: function set(x) {\n                this._x = x;this._segmentChanged();\n            }, enumerable: true });\n\n        window.SVGPathSegLinetoHorizontalRel = function (owningPathSegList, x) {\n            window.SVGPathSeg.call(this, window.SVGPathSeg.PATHSEG_LINETO_HORIZONTAL_REL, \"h\", owningPathSegList);\n            this._x = x;\n        };\n        window.SVGPathSegLinetoHorizontalRel.prototype = Object.create(window.SVGPathSeg.prototype);\n        window.SVGPathSegLinetoHorizontalRel.prototype.toString = function () {\n            return \"[object SVGPathSegLinetoHorizontalRel]\";\n        };\n        window.SVGPathSegLinetoHorizontalRel.prototype._asPathString = function () {\n            return this.pathSegTypeAsLetter + \" \" + this._x;\n        };\n        window.SVGPathSegLinetoHorizontalRel.prototype.clone = function () {\n            return new window.SVGPathSegLinetoHorizontalRel(undefined, this._x);\n        };\n        Object.defineProperty(window.SVGPathSegLinetoHorizontalRel.prototype, \"x\", { get: function get() {\n                return this._x;\n            }, set: function set(x) {\n                this._x = x;this._segmentChanged();\n            }, enumerable: true });\n\n        window.SVGPathSegLinetoVerticalAbs = function (owningPathSegList, y) {\n            window.SVGPathSeg.call(this, window.SVGPathSeg.PATHSEG_LINETO_VERTICAL_ABS, \"V\", owningPathSegList);\n            this._y = y;\n        };\n        window.SVGPathSegLinetoVerticalAbs.prototype = Object.create(window.SVGPathSeg.prototype);\n        window.SVGPathSegLinetoVerticalAbs.prototype.toString = function () {\n            return \"[object SVGPathSegLinetoVerticalAbs]\";\n        };\n        window.SVGPathSegLinetoVerticalAbs.prototype._asPathString = function () {\n            return this.pathSegTypeAsLetter + \" \" + this._y;\n        };\n        window.SVGPathSegLinetoVerticalAbs.prototype.clone = function () {\n            return new window.SVGPathSegLinetoVerticalAbs(undefined, this._y);\n        };\n        Object.defineProperty(window.SVGPathSegLinetoVerticalAbs.prototype, \"y\", { get: function get() {\n                return this._y;\n            }, set: function set(y) {\n                this._y = y;this._segmentChanged();\n            }, enumerable: true });\n\n        window.SVGPathSegLinetoVerticalRel = function (owningPathSegList, y) {\n            window.SVGPathSeg.call(this, window.SVGPathSeg.PATHSEG_LINETO_VERTICAL_REL, \"v\", owningPathSegList);\n            this._y = y;\n        };\n        window.SVGPathSegLinetoVerticalRel.prototype = Object.create(window.SVGPathSeg.prototype);\n        window.SVGPathSegLinetoVerticalRel.prototype.toString = function () {\n            return \"[object SVGPathSegLinetoVerticalRel]\";\n        };\n        window.SVGPathSegLinetoVerticalRel.prototype._asPathString = function () {\n            return this.pathSegTypeAsLetter + \" \" + this._y;\n        };\n        window.SVGPathSegLinetoVerticalRel.prototype.clone = function () {\n            return new window.SVGPathSegLinetoVerticalRel(undefined, this._y);\n        };\n        Object.defineProperty(window.SVGPathSegLinetoVerticalRel.prototype, \"y\", { get: function get() {\n                return this._y;\n            }, set: function set(y) {\n                this._y = y;this._segmentChanged();\n            }, enumerable: true });\n\n        window.SVGPathSegCurvetoCubicSmoothAbs = function (owningPathSegList, x, y, x2, y2) {\n            window.SVGPathSeg.call(this, window.SVGPathSeg.PATHSEG_CURVETO_CUBIC_SMOOTH_ABS, \"S\", owningPathSegList);\n            this._x = x;\n            this._y = y;\n            this._x2 = x2;\n            this._y2 = y2;\n        };\n        window.SVGPathSegCurvetoCubicSmoothAbs.prototype = Object.create(window.SVGPathSeg.prototype);\n        window.SVGPathSegCurvetoCubicSmoothAbs.prototype.toString = function () {\n            return \"[object SVGPathSegCurvetoCubicSmoothAbs]\";\n        };\n        window.SVGPathSegCurvetoCubicSmoothAbs.prototype._asPathString = function () {\n            return this.pathSegTypeAsLetter + \" \" + this._x2 + \" \" + this._y2 + \" \" + this._x + \" \" + this._y;\n        };\n        window.SVGPathSegCurvetoCubicSmoothAbs.prototype.clone = function () {\n            return new window.SVGPathSegCurvetoCubicSmoothAbs(undefined, this._x, this._y, this._x2, this._y2);\n        };\n        Object.defineProperty(window.SVGPathSegCurvetoCubicSmoothAbs.prototype, \"x\", { get: function get() {\n                return this._x;\n            }, set: function set(x) {\n                this._x = x;this._segmentChanged();\n            }, enumerable: true });\n        Object.defineProperty(window.SVGPathSegCurvetoCubicSmoothAbs.prototype, \"y\", { get: function get() {\n                return this._y;\n            }, set: function set(y) {\n                this._y = y;this._segmentChanged();\n            }, enumerable: true });\n        Object.defineProperty(window.SVGPathSegCurvetoCubicSmoothAbs.prototype, \"x2\", { get: function get() {\n                return this._x2;\n            }, set: function set(x2) {\n                this._x2 = x2;this._segmentChanged();\n            }, enumerable: true });\n        Object.defineProperty(window.SVGPathSegCurvetoCubicSmoothAbs.prototype, \"y2\", { get: function get() {\n                return this._y2;\n            }, set: function set(y2) {\n                this._y2 = y2;this._segmentChanged();\n            }, enumerable: true });\n\n        window.SVGPathSegCurvetoCubicSmoothRel = function (owningPathSegList, x, y, x2, y2) {\n            window.SVGPathSeg.call(this, window.SVGPathSeg.PATHSEG_CURVETO_CUBIC_SMOOTH_REL, \"s\", owningPathSegList);\n            this._x = x;\n            this._y = y;\n            this._x2 = x2;\n            this._y2 = y2;\n        };\n        window.SVGPathSegCurvetoCubicSmoothRel.prototype = Object.create(window.SVGPathSeg.prototype);\n        window.SVGPathSegCurvetoCubicSmoothRel.prototype.toString = function () {\n            return \"[object SVGPathSegCurvetoCubicSmoothRel]\";\n        };\n        window.SVGPathSegCurvetoCubicSmoothRel.prototype._asPathString = function () {\n            return this.pathSegTypeAsLetter + \" \" + this._x2 + \" \" + this._y2 + \" \" + this._x + \" \" + this._y;\n        };\n        window.SVGPathSegCurvetoCubicSmoothRel.prototype.clone = function () {\n            return new window.SVGPathSegCurvetoCubicSmoothRel(undefined, this._x, this._y, this._x2, this._y2);\n        };\n        Object.defineProperty(window.SVGPathSegCurvetoCubicSmoothRel.prototype, \"x\", { get: function get() {\n                return this._x;\n            }, set: function set(x) {\n                this._x = x;this._segmentChanged();\n            }, enumerable: true });\n        Object.defineProperty(window.SVGPathSegCurvetoCubicSmoothRel.prototype, \"y\", { get: function get() {\n                return this._y;\n            }, set: function set(y) {\n                this._y = y;this._segmentChanged();\n            }, enumerable: true });\n        Object.defineProperty(window.SVGPathSegCurvetoCubicSmoothRel.prototype, \"x2\", { get: function get() {\n                return this._x2;\n            }, set: function set(x2) {\n                this._x2 = x2;this._segmentChanged();\n            }, enumerable: true });\n        Object.defineProperty(window.SVGPathSegCurvetoCubicSmoothRel.prototype, \"y2\", { get: function get() {\n                return this._y2;\n            }, set: function set(y2) {\n                this._y2 = y2;this._segmentChanged();\n            }, enumerable: true });\n\n        window.SVGPathSegCurvetoQuadraticSmoothAbs = function (owningPathSegList, x, y) {\n            window.SVGPathSeg.call(this, window.SVGPathSeg.PATHSEG_CURVETO_QUADRATIC_SMOOTH_ABS, \"T\", owningPathSegList);\n            this._x = x;\n            this._y = y;\n        };\n        window.SVGPathSegCurvetoQuadraticSmoothAbs.prototype = Object.create(window.SVGPathSeg.prototype);\n        window.SVGPathSegCurvetoQuadraticSmoothAbs.prototype.toString = function () {\n            return \"[object SVGPathSegCurvetoQuadraticSmoothAbs]\";\n        };\n        window.SVGPathSegCurvetoQuadraticSmoothAbs.prototype._asPathString = function () {\n            return this.pathSegTypeAsLetter + \" \" + this._x + \" \" + this._y;\n        };\n        window.SVGPathSegCurvetoQuadraticSmoothAbs.prototype.clone = function () {\n            return new window.SVGPathSegCurvetoQuadraticSmoothAbs(undefined, this._x, this._y);\n        };\n        Object.defineProperty(window.SVGPathSegCurvetoQuadraticSmoothAbs.prototype, \"x\", { get: function get() {\n                return this._x;\n            }, set: function set(x) {\n                this._x = x;this._segmentChanged();\n            }, enumerable: true });\n        Object.defineProperty(window.SVGPathSegCurvetoQuadraticSmoothAbs.prototype, \"y\", { get: function get() {\n                return this._y;\n            }, set: function set(y) {\n                this._y = y;this._segmentChanged();\n            }, enumerable: true });\n\n        window.SVGPathSegCurvetoQuadraticSmoothRel = function (owningPathSegList, x, y) {\n            window.SVGPathSeg.call(this, window.SVGPathSeg.PATHSEG_CURVETO_QUADRATIC_SMOOTH_REL, \"t\", owningPathSegList);\n            this._x = x;\n            this._y = y;\n        };\n        window.SVGPathSegCurvetoQuadraticSmoothRel.prototype = Object.create(window.SVGPathSeg.prototype);\n        window.SVGPathSegCurvetoQuadraticSmoothRel.prototype.toString = function () {\n            return \"[object SVGPathSegCurvetoQuadraticSmoothRel]\";\n        };\n        window.SVGPathSegCurvetoQuadraticSmoothRel.prototype._asPathString = function () {\n            return this.pathSegTypeAsLetter + \" \" + this._x + \" \" + this._y;\n        };\n        window.SVGPathSegCurvetoQuadraticSmoothRel.prototype.clone = function () {\n            return new window.SVGPathSegCurvetoQuadraticSmoothRel(undefined, this._x, this._y);\n        };\n        Object.defineProperty(window.SVGPathSegCurvetoQuadraticSmoothRel.prototype, \"x\", { get: function get() {\n                return this._x;\n            }, set: function set(x) {\n                this._x = x;this._segmentChanged();\n            }, enumerable: true });\n        Object.defineProperty(window.SVGPathSegCurvetoQuadraticSmoothRel.prototype, \"y\", { get: function get() {\n                return this._y;\n            }, set: function set(y) {\n                this._y = y;this._segmentChanged();\n            }, enumerable: true });\n\n        // Add createSVGPathSeg* functions to window.SVGPathElement.\n        // Spec: http://www.w3.org/TR/SVG11/single-page.html#paths-Interfacewindow.SVGPathElement.\n        window.SVGPathElement.prototype.createSVGPathSegClosePath = function () {\n            return new window.SVGPathSegClosePath(undefined);\n        };\n        window.SVGPathElement.prototype.createSVGPathSegMovetoAbs = function (x, y) {\n            return new window.SVGPathSegMovetoAbs(undefined, x, y);\n        };\n        window.SVGPathElement.prototype.createSVGPathSegMovetoRel = function (x, y) {\n            return new window.SVGPathSegMovetoRel(undefined, x, y);\n        };\n        window.SVGPathElement.prototype.createSVGPathSegLinetoAbs = function (x, y) {\n            return new window.SVGPathSegLinetoAbs(undefined, x, y);\n        };\n        window.SVGPathElement.prototype.createSVGPathSegLinetoRel = function (x, y) {\n            return new window.SVGPathSegLinetoRel(undefined, x, y);\n        };\n        window.SVGPathElement.prototype.createSVGPathSegCurvetoCubicAbs = function (x, y, x1, y1, x2, y2) {\n            return new window.SVGPathSegCurvetoCubicAbs(undefined, x, y, x1, y1, x2, y2);\n        };\n        window.SVGPathElement.prototype.createSVGPathSegCurvetoCubicRel = function (x, y, x1, y1, x2, y2) {\n            return new window.SVGPathSegCurvetoCubicRel(undefined, x, y, x1, y1, x2, y2);\n        };\n        window.SVGPathElement.prototype.createSVGPathSegCurvetoQuadraticAbs = function (x, y, x1, y1) {\n            return new window.SVGPathSegCurvetoQuadraticAbs(undefined, x, y, x1, y1);\n        };\n        window.SVGPathElement.prototype.createSVGPathSegCurvetoQuadraticRel = function (x, y, x1, y1) {\n            return new window.SVGPathSegCurvetoQuadraticRel(undefined, x, y, x1, y1);\n        };\n        window.SVGPathElement.prototype.createSVGPathSegArcAbs = function (x, y, r1, r2, angle, largeArcFlag, sweepFlag) {\n            return new window.SVGPathSegArcAbs(undefined, x, y, r1, r2, angle, largeArcFlag, sweepFlag);\n        };\n        window.SVGPathElement.prototype.createSVGPathSegArcRel = function (x, y, r1, r2, angle, largeArcFlag, sweepFlag) {\n            return new window.SVGPathSegArcRel(undefined, x, y, r1, r2, angle, largeArcFlag, sweepFlag);\n        };\n        window.SVGPathElement.prototype.createSVGPathSegLinetoHorizontalAbs = function (x) {\n            return new window.SVGPathSegLinetoHorizontalAbs(undefined, x);\n        };\n        window.SVGPathElement.prototype.createSVGPathSegLinetoHorizontalRel = function (x) {\n            return new window.SVGPathSegLinetoHorizontalRel(undefined, x);\n        };\n        window.SVGPathElement.prototype.createSVGPathSegLinetoVerticalAbs = function (y) {\n            return new window.SVGPathSegLinetoVerticalAbs(undefined, y);\n        };\n        window.SVGPathElement.prototype.createSVGPathSegLinetoVerticalRel = function (y) {\n            return new window.SVGPathSegLinetoVerticalRel(undefined, y);\n        };\n        window.SVGPathElement.prototype.createSVGPathSegCurvetoCubicSmoothAbs = function (x, y, x2, y2) {\n            return new window.SVGPathSegCurvetoCubicSmoothAbs(undefined, x, y, x2, y2);\n        };\n        window.SVGPathElement.prototype.createSVGPathSegCurvetoCubicSmoothRel = function (x, y, x2, y2) {\n            return new window.SVGPathSegCurvetoCubicSmoothRel(undefined, x, y, x2, y2);\n        };\n        window.SVGPathElement.prototype.createSVGPathSegCurvetoQuadraticSmoothAbs = function (x, y) {\n            return new window.SVGPathSegCurvetoQuadraticSmoothAbs(undefined, x, y);\n        };\n        window.SVGPathElement.prototype.createSVGPathSegCurvetoQuadraticSmoothRel = function (x, y) {\n            return new window.SVGPathSegCurvetoQuadraticSmoothRel(undefined, x, y);\n        };\n\n        if (!(\"getPathSegAtLength\" in window.SVGPathElement.prototype)) {\n            // Add getPathSegAtLength to SVGPathElement.\n            // Spec: https://www.w3.org/TR/SVG11/single-page.html#paths-__svg__SVGPathElement__getPathSegAtLength\n            // This polyfill requires SVGPathElement.getTotalLength to implement the distance-along-a-path algorithm.\n            window.SVGPathElement.prototype.getPathSegAtLength = function (distance) {\n                if (distance === undefined || !isFinite(distance)) throw \"Invalid arguments.\";\n\n                var measurementElement = document.createElementNS(\"http://www.w3.org/2000/svg\", \"path\");\n                measurementElement.setAttribute(\"d\", this.getAttribute(\"d\"));\n                var lastPathSegment = measurementElement.pathSegList.numberOfItems - 1;\n\n                // If the path is empty, return 0.\n                if (lastPathSegment <= 0) return 0;\n\n                do {\n                    measurementElement.pathSegList.removeItem(lastPathSegment);\n                    if (distance > measurementElement.getTotalLength()) break;\n                    lastPathSegment--;\n                } while (lastPathSegment > 0);\n                return lastPathSegment;\n            };\n        }\n    }\n\n    if (!(\"SVGPathSegList\" in window)) {\n        // Spec: http://www.w3.org/TR/SVG11/single-page.html#paths-InterfaceSVGPathSegList\n        window.SVGPathSegList = function (pathElement) {\n            this._pathElement = pathElement;\n            this._list = this._parsePath(this._pathElement.getAttribute(\"d\"));\n\n            // Use a MutationObserver to catch changes to the path's \"d\" attribute.\n            this._mutationObserverConfig = { \"attributes\": true, \"attributeFilter\": [\"d\"] };\n            this._pathElementMutationObserver = new MutationObserver(this._updateListFromPathMutations.bind(this));\n            this._pathElementMutationObserver.observe(this._pathElement, this._mutationObserverConfig);\n        };\n\n        window.SVGPathSegList.prototype.classname = \"SVGPathSegList\";\n\n        Object.defineProperty(window.SVGPathSegList.prototype, \"numberOfItems\", {\n            get: function get() {\n                this._checkPathSynchronizedToList();\n                return this._list.length;\n            },\n            enumerable: true\n        });\n\n        // Add the pathSegList accessors to window.SVGPathElement.\n        // Spec: http://www.w3.org/TR/SVG11/single-page.html#paths-InterfaceSVGAnimatedPathData\n        Object.defineProperty(window.SVGPathElement.prototype, \"pathSegList\", {\n            get: function get() {\n                if (!this._pathSegList) this._pathSegList = new window.SVGPathSegList(this);\n                return this._pathSegList;\n            },\n            enumerable: true\n        });\n        // FIXME: The following are not implemented and simply return window.SVGPathElement.pathSegList.\n        Object.defineProperty(window.SVGPathElement.prototype, \"normalizedPathSegList\", { get: function get() {\n                return this.pathSegList;\n            }, enumerable: true });\n        Object.defineProperty(window.SVGPathElement.prototype, \"animatedPathSegList\", { get: function get() {\n                return this.pathSegList;\n            }, enumerable: true });\n        Object.defineProperty(window.SVGPathElement.prototype, \"animatedNormalizedPathSegList\", { get: function get() {\n                return this.pathSegList;\n            }, enumerable: true });\n\n        // Process any pending mutations to the path element and update the list as needed.\n        // This should be the first call of all public functions and is needed because\n        // MutationObservers are not synchronous so we can have pending asynchronous mutations.\n        window.SVGPathSegList.prototype._checkPathSynchronizedToList = function () {\n            this._updateListFromPathMutations(this._pathElementMutationObserver.takeRecords());\n        };\n\n        window.SVGPathSegList.prototype._updateListFromPathMutations = function (mutationRecords) {\n            if (!this._pathElement) return;\n            var hasPathMutations = false;\n            mutationRecords.forEach(function (record) {\n                if (record.attributeName == \"d\") hasPathMutations = true;\n            });\n            if (hasPathMutations) this._list = this._parsePath(this._pathElement.getAttribute(\"d\"));\n        };\n\n        // Serialize the list and update the path's 'd' attribute.\n        window.SVGPathSegList.prototype._writeListToPath = function () {\n            this._pathElementMutationObserver.disconnect();\n            this._pathElement.setAttribute(\"d\", window.SVGPathSegList._pathSegArrayAsString(this._list));\n            this._pathElementMutationObserver.observe(this._pathElement, this._mutationObserverConfig);\n        };\n\n        // When a path segment changes the list needs to be synchronized back to the path element.\n        window.SVGPathSegList.prototype.segmentChanged = function (pathSeg) {\n            this._writeListToPath();\n        };\n\n        window.SVGPathSegList.prototype.clear = function () {\n            this._checkPathSynchronizedToList();\n\n            this._list.forEach(function (pathSeg) {\n                pathSeg._owningPathSegList = null;\n            });\n            this._list = [];\n            this._writeListToPath();\n        };\n\n        window.SVGPathSegList.prototype.initialize = function (newItem) {\n            this._checkPathSynchronizedToList();\n\n            this._list = [newItem];\n            newItem._owningPathSegList = this;\n            this._writeListToPath();\n            return newItem;\n        };\n\n        window.SVGPathSegList.prototype._checkValidIndex = function (index) {\n            if (isNaN(index) || index < 0 || index >= this.numberOfItems) throw \"INDEX_SIZE_ERR\";\n        };\n\n        window.SVGPathSegList.prototype.getItem = function (index) {\n            this._checkPathSynchronizedToList();\n\n            this._checkValidIndex(index);\n            return this._list[index];\n        };\n\n        window.SVGPathSegList.prototype.insertItemBefore = function (newItem, index) {\n            this._checkPathSynchronizedToList();\n\n            // Spec: If the index is greater than or equal to numberOfItems, then the new item is appended to the end of the list.\n            if (index > this.numberOfItems) index = this.numberOfItems;\n            if (newItem._owningPathSegList) {\n                // SVG2 spec says to make a copy.\n                newItem = newItem.clone();\n            }\n            this._list.splice(index, 0, newItem);\n            newItem._owningPathSegList = this;\n            this._writeListToPath();\n            return newItem;\n        };\n\n        window.SVGPathSegList.prototype.replaceItem = function (newItem, index) {\n            this._checkPathSynchronizedToList();\n\n            if (newItem._owningPathSegList) {\n                // SVG2 spec says to make a copy.\n                newItem = newItem.clone();\n            }\n            this._checkValidIndex(index);\n            this._list[index] = newItem;\n            newItem._owningPathSegList = this;\n            this._writeListToPath();\n            return newItem;\n        };\n\n        window.SVGPathSegList.prototype.removeItem = function (index) {\n            this._checkPathSynchronizedToList();\n\n            this._checkValidIndex(index);\n            var item = this._list[index];\n            this._list.splice(index, 1);\n            this._writeListToPath();\n            return item;\n        };\n\n        window.SVGPathSegList.prototype.appendItem = function (newItem) {\n            this._checkPathSynchronizedToList();\n\n            if (newItem._owningPathSegList) {\n                // SVG2 spec says to make a copy.\n                newItem = newItem.clone();\n            }\n            this._list.push(newItem);\n            newItem._owningPathSegList = this;\n            // TODO: Optimize this to just append to the existing attribute.\n            this._writeListToPath();\n            return newItem;\n        };\n\n        window.SVGPathSegList._pathSegArrayAsString = function (pathSegArray) {\n            var string = \"\";\n            var first = true;\n            pathSegArray.forEach(function (pathSeg) {\n                if (first) {\n                    first = false;\n                    string += pathSeg._asPathString();\n                } else {\n                    string += \" \" + pathSeg._asPathString();\n                }\n            });\n            return string;\n        };\n\n        // This closely follows SVGPathParser::parsePath from Source/core/svg/SVGPathParser.cpp.\n        window.SVGPathSegList.prototype._parsePath = function (string) {\n            if (!string || string.length == 0) return [];\n\n            var owningPathSegList = this;\n\n            var Builder = function Builder() {\n                this.pathSegList = [];\n            };\n\n            Builder.prototype.appendSegment = function (pathSeg) {\n                this.pathSegList.push(pathSeg);\n            };\n\n            var Source = function Source(string) {\n                this._string = string;\n                this._currentIndex = 0;\n                this._endIndex = this._string.length;\n                this._previousCommand = window.SVGPathSeg.PATHSEG_UNKNOWN;\n\n                this._skipOptionalSpaces();\n            };\n\n            Source.prototype._isCurrentSpace = function () {\n                var character = this._string[this._currentIndex];\n                return character <= \" \" && (character == \" \" || character == \"\\n\" || character == \"\\t\" || character == \"\\r\" || character == \"\\f\");\n            };\n\n            Source.prototype._skipOptionalSpaces = function () {\n                while (this._currentIndex < this._endIndex && this._isCurrentSpace()) {\n                    this._currentIndex++;\n                }return this._currentIndex < this._endIndex;\n            };\n\n            Source.prototype._skipOptionalSpacesOrDelimiter = function () {\n                if (this._currentIndex < this._endIndex && !this._isCurrentSpace() && this._string.charAt(this._currentIndex) != \",\") return false;\n                if (this._skipOptionalSpaces()) {\n                    if (this._currentIndex < this._endIndex && this._string.charAt(this._currentIndex) == \",\") {\n                        this._currentIndex++;\n                        this._skipOptionalSpaces();\n                    }\n                }\n                return this._currentIndex < this._endIndex;\n            };\n\n            Source.prototype.hasMoreData = function () {\n                return this._currentIndex < this._endIndex;\n            };\n\n            Source.prototype.peekSegmentType = function () {\n                var lookahead = this._string[this._currentIndex];\n                return this._pathSegTypeFromChar(lookahead);\n            };\n\n            Source.prototype._pathSegTypeFromChar = function (lookahead) {\n                switch (lookahead) {\n                    case \"Z\":\n                    case \"z\":\n                        return window.SVGPathSeg.PATHSEG_CLOSEPATH;\n                    case \"M\":\n                        return window.SVGPathSeg.PATHSEG_MOVETO_ABS;\n                    case \"m\":\n                        return window.SVGPathSeg.PATHSEG_MOVETO_REL;\n                    case \"L\":\n                        return window.SVGPathSeg.PATHSEG_LINETO_ABS;\n                    case \"l\":\n                        return window.SVGPathSeg.PATHSEG_LINETO_REL;\n                    case \"C\":\n                        return window.SVGPathSeg.PATHSEG_CURVETO_CUBIC_ABS;\n                    case \"c\":\n                        return window.SVGPathSeg.PATHSEG_CURVETO_CUBIC_REL;\n                    case \"Q\":\n                        return window.SVGPathSeg.PATHSEG_CURVETO_QUADRATIC_ABS;\n                    case \"q\":\n                        return window.SVGPathSeg.PATHSEG_CURVETO_QUADRATIC_REL;\n                    case \"A\":\n                        return window.SVGPathSeg.PATHSEG_ARC_ABS;\n                    case \"a\":\n                        return window.SVGPathSeg.PATHSEG_ARC_REL;\n                    case \"H\":\n                        return window.SVGPathSeg.PATHSEG_LINETO_HORIZONTAL_ABS;\n                    case \"h\":\n                        return window.SVGPathSeg.PATHSEG_LINETO_HORIZONTAL_REL;\n                    case \"V\":\n                        return window.SVGPathSeg.PATHSEG_LINETO_VERTICAL_ABS;\n                    case \"v\":\n                        return window.SVGPathSeg.PATHSEG_LINETO_VERTICAL_REL;\n                    case \"S\":\n                        return window.SVGPathSeg.PATHSEG_CURVETO_CUBIC_SMOOTH_ABS;\n                    case \"s\":\n                        return window.SVGPathSeg.PATHSEG_CURVETO_CUBIC_SMOOTH_REL;\n                    case \"T\":\n                        return window.SVGPathSeg.PATHSEG_CURVETO_QUADRATIC_SMOOTH_ABS;\n                    case \"t\":\n                        return window.SVGPathSeg.PATHSEG_CURVETO_QUADRATIC_SMOOTH_REL;\n                    default:\n                        return window.SVGPathSeg.PATHSEG_UNKNOWN;\n                }\n            };\n\n            Source.prototype._nextCommandHelper = function (lookahead, previousCommand) {\n                // Check for remaining coordinates in the current command.\n                if ((lookahead == \"+\" || lookahead == \"-\" || lookahead == \".\" || lookahead >= \"0\" && lookahead <= \"9\") && previousCommand != window.SVGPathSeg.PATHSEG_CLOSEPATH) {\n                    if (previousCommand == window.SVGPathSeg.PATHSEG_MOVETO_ABS) return window.SVGPathSeg.PATHSEG_LINETO_ABS;\n                    if (previousCommand == window.SVGPathSeg.PATHSEG_MOVETO_REL) return window.SVGPathSeg.PATHSEG_LINETO_REL;\n                    return previousCommand;\n                }\n                return window.SVGPathSeg.PATHSEG_UNKNOWN;\n            };\n\n            Source.prototype.initialCommandIsMoveTo = function () {\n                // If the path is empty it is still valid, so return true.\n                if (!this.hasMoreData()) return true;\n                var command = this.peekSegmentType();\n                // Path must start with moveTo.\n                return command == window.SVGPathSeg.PATHSEG_MOVETO_ABS || command == window.SVGPathSeg.PATHSEG_MOVETO_REL;\n            };\n\n            // Parse a number from an SVG path. This very closely follows genericParseNumber(...) from Source/core/svg/SVGParserUtilities.cpp.\n            // Spec: http://www.w3.org/TR/SVG11/single-page.html#paths-PathDataBNF\n            Source.prototype._parseNumber = function () {\n                var exponent = 0;\n                var integer = 0;\n                var frac = 1;\n                var decimal = 0;\n                var sign = 1;\n                var expsign = 1;\n\n                var startIndex = this._currentIndex;\n\n                this._skipOptionalSpaces();\n\n                // Read the sign.\n                if (this._currentIndex < this._endIndex && this._string.charAt(this._currentIndex) == \"+\") this._currentIndex++;else if (this._currentIndex < this._endIndex && this._string.charAt(this._currentIndex) == \"-\") {\n                    this._currentIndex++;\n                    sign = -1;\n                }\n\n                if (this._currentIndex == this._endIndex || (this._string.charAt(this._currentIndex) < \"0\" || this._string.charAt(this._currentIndex) > \"9\") && this._string.charAt(this._currentIndex) != \".\")\n                    // The first character of a number must be one of [0-9+-.].\n                    return undefined;\n\n                // Read the integer part, build right-to-left.\n                var startIntPartIndex = this._currentIndex;\n                while (this._currentIndex < this._endIndex && this._string.charAt(this._currentIndex) >= \"0\" && this._string.charAt(this._currentIndex) <= \"9\") {\n                    this._currentIndex++;\n                } // Advance to first non-digit.\n\n                if (this._currentIndex != startIntPartIndex) {\n                    var scanIntPartIndex = this._currentIndex - 1;\n                    var multiplier = 1;\n                    while (scanIntPartIndex >= startIntPartIndex) {\n                        integer += multiplier * (this._string.charAt(scanIntPartIndex--) - \"0\");\n                        multiplier *= 10;\n                    }\n                }\n\n                // Read the decimals.\n                if (this._currentIndex < this._endIndex && this._string.charAt(this._currentIndex) == \".\") {\n                    this._currentIndex++;\n\n                    // There must be a least one digit following the .\n                    if (this._currentIndex >= this._endIndex || this._string.charAt(this._currentIndex) < \"0\" || this._string.charAt(this._currentIndex) > \"9\") return undefined;\n                    while (this._currentIndex < this._endIndex && this._string.charAt(this._currentIndex) >= \"0\" && this._string.charAt(this._currentIndex) <= \"9\") {\n                        frac *= 10;\n                        decimal += (this._string.charAt(this._currentIndex) - \"0\") / frac;\n                        this._currentIndex += 1;\n                    }\n                }\n\n                // Read the exponent part.\n                if (this._currentIndex != startIndex && this._currentIndex + 1 < this._endIndex && (this._string.charAt(this._currentIndex) == \"e\" || this._string.charAt(this._currentIndex) == \"E\") && this._string.charAt(this._currentIndex + 1) != \"x\" && this._string.charAt(this._currentIndex + 1) != \"m\") {\n                    this._currentIndex++;\n\n                    // Read the sign of the exponent.\n                    if (this._string.charAt(this._currentIndex) == \"+\") {\n                        this._currentIndex++;\n                    } else if (this._string.charAt(this._currentIndex) == \"-\") {\n                        this._currentIndex++;\n                        expsign = -1;\n                    }\n\n                    // There must be an exponent.\n                    if (this._currentIndex >= this._endIndex || this._string.charAt(this._currentIndex) < \"0\" || this._string.charAt(this._currentIndex) > \"9\") return undefined;\n\n                    while (this._currentIndex < this._endIndex && this._string.charAt(this._currentIndex) >= \"0\" && this._string.charAt(this._currentIndex) <= \"9\") {\n                        exponent *= 10;\n                        exponent += this._string.charAt(this._currentIndex) - \"0\";\n                        this._currentIndex++;\n                    }\n                }\n\n                var number = integer + decimal;\n                number *= sign;\n\n                if (exponent) number *= Math.pow(10, expsign * exponent);\n\n                if (startIndex == this._currentIndex) return undefined;\n\n                this._skipOptionalSpacesOrDelimiter();\n\n                return number;\n            };\n\n            Source.prototype._parseArcFlag = function () {\n                if (this._currentIndex >= this._endIndex) return undefined;\n                var flag = false;\n                var flagChar = this._string.charAt(this._currentIndex++);\n                if (flagChar == \"0\") flag = false;else if (flagChar == \"1\") flag = true;else return undefined;\n\n                this._skipOptionalSpacesOrDelimiter();\n                return flag;\n            };\n\n            Source.prototype.parseSegment = function () {\n                var lookahead = this._string[this._currentIndex];\n                var command = this._pathSegTypeFromChar(lookahead);\n                if (command == window.SVGPathSeg.PATHSEG_UNKNOWN) {\n                    // Possibly an implicit command. Not allowed if this is the first command.\n                    if (this._previousCommand == window.SVGPathSeg.PATHSEG_UNKNOWN) return null;\n                    command = this._nextCommandHelper(lookahead, this._previousCommand);\n                    if (command == window.SVGPathSeg.PATHSEG_UNKNOWN) return null;\n                } else {\n                    this._currentIndex++;\n                }\n\n                this._previousCommand = command;\n\n                switch (command) {\n                    case window.SVGPathSeg.PATHSEG_MOVETO_REL:\n                        return new window.SVGPathSegMovetoRel(owningPathSegList, this._parseNumber(), this._parseNumber());\n                    case window.SVGPathSeg.PATHSEG_MOVETO_ABS:\n                        return new window.SVGPathSegMovetoAbs(owningPathSegList, this._parseNumber(), this._parseNumber());\n                    case window.SVGPathSeg.PATHSEG_LINETO_REL:\n                        return new window.SVGPathSegLinetoRel(owningPathSegList, this._parseNumber(), this._parseNumber());\n                    case window.SVGPathSeg.PATHSEG_LINETO_ABS:\n                        return new window.SVGPathSegLinetoAbs(owningPathSegList, this._parseNumber(), this._parseNumber());\n                    case window.SVGPathSeg.PATHSEG_LINETO_HORIZONTAL_REL:\n                        return new window.SVGPathSegLinetoHorizontalRel(owningPathSegList, this._parseNumber());\n                    case window.SVGPathSeg.PATHSEG_LINETO_HORIZONTAL_ABS:\n                        return new window.SVGPathSegLinetoHorizontalAbs(owningPathSegList, this._parseNumber());\n                    case window.SVGPathSeg.PATHSEG_LINETO_VERTICAL_REL:\n                        return new window.SVGPathSegLinetoVerticalRel(owningPathSegList, this._parseNumber());\n                    case window.SVGPathSeg.PATHSEG_LINETO_VERTICAL_ABS:\n                        return new window.SVGPathSegLinetoVerticalAbs(owningPathSegList, this._parseNumber());\n                    case window.SVGPathSeg.PATHSEG_CLOSEPATH:\n                        this._skipOptionalSpaces();\n                        return new window.SVGPathSegClosePath(owningPathSegList);\n                    case window.SVGPathSeg.PATHSEG_CURVETO_CUBIC_REL:\n                        var points = { x1: this._parseNumber(), y1: this._parseNumber(), x2: this._parseNumber(), y2: this._parseNumber(), x: this._parseNumber(), y: this._parseNumber() };\n                        return new window.SVGPathSegCurvetoCubicRel(owningPathSegList, points.x, points.y, points.x1, points.y1, points.x2, points.y2);\n                    case window.SVGPathSeg.PATHSEG_CURVETO_CUBIC_ABS:\n                        var points = { x1: this._parseNumber(), y1: this._parseNumber(), x2: this._parseNumber(), y2: this._parseNumber(), x: this._parseNumber(), y: this._parseNumber() };\n                        return new window.SVGPathSegCurvetoCubicAbs(owningPathSegList, points.x, points.y, points.x1, points.y1, points.x2, points.y2);\n                    case window.SVGPathSeg.PATHSEG_CURVETO_CUBIC_SMOOTH_REL:\n                        var points = { x2: this._parseNumber(), y2: this._parseNumber(), x: this._parseNumber(), y: this._parseNumber() };\n                        return new window.SVGPathSegCurvetoCubicSmoothRel(owningPathSegList, points.x, points.y, points.x2, points.y2);\n                    case window.SVGPathSeg.PATHSEG_CURVETO_CUBIC_SMOOTH_ABS:\n                        var points = { x2: this._parseNumber(), y2: this._parseNumber(), x: this._parseNumber(), y: this._parseNumber() };\n                        return new window.SVGPathSegCurvetoCubicSmoothAbs(owningPathSegList, points.x, points.y, points.x2, points.y2);\n                    case window.SVGPathSeg.PATHSEG_CURVETO_QUADRATIC_REL:\n                        var points = { x1: this._parseNumber(), y1: this._parseNumber(), x: this._parseNumber(), y: this._parseNumber() };\n                        return new window.SVGPathSegCurvetoQuadraticRel(owningPathSegList, points.x, points.y, points.x1, points.y1);\n                    case window.SVGPathSeg.PATHSEG_CURVETO_QUADRATIC_ABS:\n                        var points = { x1: this._parseNumber(), y1: this._parseNumber(), x: this._parseNumber(), y: this._parseNumber() };\n                        return new window.SVGPathSegCurvetoQuadraticAbs(owningPathSegList, points.x, points.y, points.x1, points.y1);\n                    case window.SVGPathSeg.PATHSEG_CURVETO_QUADRATIC_SMOOTH_REL:\n                        return new window.SVGPathSegCurvetoQuadraticSmoothRel(owningPathSegList, this._parseNumber(), this._parseNumber());\n                    case window.SVGPathSeg.PATHSEG_CURVETO_QUADRATIC_SMOOTH_ABS:\n                        return new window.SVGPathSegCurvetoQuadraticSmoothAbs(owningPathSegList, this._parseNumber(), this._parseNumber());\n                    case window.SVGPathSeg.PATHSEG_ARC_REL:\n                        var points = { x1: this._parseNumber(), y1: this._parseNumber(), arcAngle: this._parseNumber(), arcLarge: this._parseArcFlag(), arcSweep: this._parseArcFlag(), x: this._parseNumber(), y: this._parseNumber() };\n                        return new window.SVGPathSegArcRel(owningPathSegList, points.x, points.y, points.x1, points.y1, points.arcAngle, points.arcLarge, points.arcSweep);\n                    case window.SVGPathSeg.PATHSEG_ARC_ABS:\n                        var points = { x1: this._parseNumber(), y1: this._parseNumber(), arcAngle: this._parseNumber(), arcLarge: this._parseArcFlag(), arcSweep: this._parseArcFlag(), x: this._parseNumber(), y: this._parseNumber() };\n                        return new window.SVGPathSegArcAbs(owningPathSegList, points.x, points.y, points.x1, points.y1, points.arcAngle, points.arcLarge, points.arcSweep);\n                    default:\n                        throw \"Unknown path seg type.\";\n                }\n            };\n\n            var builder = new Builder();\n            var source = new Source(string);\n\n            if (!source.initialCommandIsMoveTo()) return [];\n            while (source.hasMoreData()) {\n                var pathSeg = source.parseSegment();\n                if (!pathSeg) return [];\n                builder.appendSegment(pathSeg);\n            }\n\n            return builder.pathSegList;\n        };\n    }\n})();\n\n/* jshint ignore:end */\n\nc3_chart_fn.axis = function () {};\nc3_chart_fn.axis.labels = function (labels) {\n    var $$ = this.internal;\n    if (arguments.length) {\n        Object.keys(labels).forEach(function (axisId) {\n            $$.axis.setLabelText(axisId, labels[axisId]);\n        });\n        $$.axis.updateLabels();\n    }\n    // TODO: return some values?\n};\nc3_chart_fn.axis.max = function (max) {\n    var $$ = this.internal,\n        config = $$.config;\n    if (arguments.length) {\n        if ((typeof max === 'undefined' ? 'undefined' : _typeof(max)) === 'object') {\n            if (isValue(max.x)) {\n                config.axis_x_max = max.x;\n            }\n            if (isValue(max.y)) {\n                config.axis_y_max = max.y;\n            }\n            if (isValue(max.y2)) {\n                config.axis_y2_max = max.y2;\n            }\n        } else {\n            config.axis_y_max = config.axis_y2_max = max;\n        }\n        $$.redraw({ withUpdateOrgXDomain: true, withUpdateXDomain: true });\n    } else {\n        return {\n            x: config.axis_x_max,\n            y: config.axis_y_max,\n            y2: config.axis_y2_max\n        };\n    }\n};\nc3_chart_fn.axis.min = function (min) {\n    var $$ = this.internal,\n        config = $$.config;\n    if (arguments.length) {\n        if ((typeof min === 'undefined' ? 'undefined' : _typeof(min)) === 'object') {\n            if (isValue(min.x)) {\n                config.axis_x_min = min.x;\n            }\n            if (isValue(min.y)) {\n                config.axis_y_min = min.y;\n            }\n            if (isValue(min.y2)) {\n                config.axis_y2_min = min.y2;\n            }\n        } else {\n            config.axis_y_min = config.axis_y2_min = min;\n        }\n        $$.redraw({ withUpdateOrgXDomain: true, withUpdateXDomain: true });\n    } else {\n        return {\n            x: config.axis_x_min,\n            y: config.axis_y_min,\n            y2: config.axis_y2_min\n        };\n    }\n};\nc3_chart_fn.axis.range = function (range) {\n    if (arguments.length) {\n        if (isDefined(range.max)) {\n            this.axis.max(range.max);\n        }\n        if (isDefined(range.min)) {\n            this.axis.min(range.min);\n        }\n    } else {\n        return {\n            max: this.axis.max(),\n            min: this.axis.min()\n        };\n    }\n};\n\nc3_chart_fn.category = function (i, category) {\n    var $$ = this.internal,\n        config = $$.config;\n    if (arguments.length > 1) {\n        config.axis_x_categories[i] = category;\n        $$.redraw();\n    }\n    return config.axis_x_categories[i];\n};\nc3_chart_fn.categories = function (categories) {\n    var $$ = this.internal,\n        config = $$.config;\n    if (!arguments.length) {\n        return config.axis_x_categories;\n    }\n    config.axis_x_categories = categories;\n    $$.redraw();\n    return config.axis_x_categories;\n};\n\nc3_chart_fn.resize = function (size) {\n    var $$ = this.internal,\n        config = $$.config;\n    config.size_width = size ? size.width : null;\n    config.size_height = size ? size.height : null;\n    this.flush();\n};\n\nc3_chart_fn.flush = function () {\n    var $$ = this.internal;\n    $$.updateAndRedraw({ withLegend: true, withTransition: false, withTransitionForTransform: false });\n};\n\nc3_chart_fn.destroy = function () {\n    var $$ = this.internal;\n\n    window.clearInterval($$.intervalForObserveInserted);\n\n    if ($$.resizeTimeout !== undefined) {\n        window.clearTimeout($$.resizeTimeout);\n    }\n\n    if (window.detachEvent) {\n        window.detachEvent('onresize', $$.resizeFunction);\n    } else if (window.removeEventListener) {\n        window.removeEventListener('resize', $$.resizeFunction);\n    } else {\n        var wrapper = window.onresize;\n        // check if no one else removed our wrapper and remove our resizeFunction from it\n        if (wrapper && wrapper.add && wrapper.remove) {\n            wrapper.remove($$.resizeFunction);\n        }\n    }\n\n    $$.selectChart.classed('c3', false).html(\"\");\n\n    // MEMO: this is needed because the reference of some elements will not be released, then memory leak will happen.\n    Object.keys($$).forEach(function (key) {\n        $$[key] = null;\n    });\n\n    return null;\n};\n\n// TODO: fix\nc3_chart_fn.color = function (id) {\n    var $$ = this.internal;\n    return $$.color(id); // more patterns\n};\n\nc3_chart_fn.data = function (targetIds) {\n    var targets = this.internal.data.targets;\n    return typeof targetIds === 'undefined' ? targets : targets.filter(function (t) {\n        return [].concat(targetIds).indexOf(t.id) >= 0;\n    });\n};\nc3_chart_fn.data.shown = function (targetIds) {\n    return this.internal.filterTargetsToShow(this.data(targetIds));\n};\nc3_chart_fn.data.values = function (targetId) {\n    var targets,\n        values = null;\n    if (targetId) {\n        targets = this.data(targetId);\n        values = targets[0] ? targets[0].values.map(function (d) {\n            return d.value;\n        }) : null;\n    }\n    return values;\n};\nc3_chart_fn.data.names = function (names) {\n    this.internal.clearLegendItemTextBoxCache();\n    return this.internal.updateDataAttributes('names', names);\n};\nc3_chart_fn.data.colors = function (colors) {\n    return this.internal.updateDataAttributes('colors', colors);\n};\nc3_chart_fn.data.axes = function (axes) {\n    return this.internal.updateDataAttributes('axes', axes);\n};\n\nc3_chart_fn.flow = function (args) {\n    var $$ = this.internal,\n        targets,\n        data,\n        notfoundIds = [],\n        orgDataCount = $$.getMaxDataCount(),\n        dataCount,\n        domain,\n        baseTarget,\n        baseValue,\n        length = 0,\n        tail = 0,\n        diff,\n        to;\n\n    if (args.json) {\n        data = $$.convertJsonToData(args.json, args.keys);\n    } else if (args.rows) {\n        data = $$.convertRowsToData(args.rows);\n    } else if (args.columns) {\n        data = $$.convertColumnsToData(args.columns);\n    } else {\n        return;\n    }\n    targets = $$.convertDataToTargets(data, true);\n\n    // Update/Add data\n    $$.data.targets.forEach(function (t) {\n        var found = false,\n            i,\n            j;\n        for (i = 0; i < targets.length; i++) {\n            if (t.id === targets[i].id) {\n                found = true;\n\n                if (t.values[t.values.length - 1]) {\n                    tail = t.values[t.values.length - 1].index + 1;\n                }\n                length = targets[i].values.length;\n\n                for (j = 0; j < length; j++) {\n                    targets[i].values[j].index = tail + j;\n                    if (!$$.isTimeSeries()) {\n                        targets[i].values[j].x = tail + j;\n                    }\n                }\n                t.values = t.values.concat(targets[i].values);\n\n                targets.splice(i, 1);\n                break;\n            }\n        }\n        if (!found) {\n            notfoundIds.push(t.id);\n        }\n    });\n\n    // Append null for not found targets\n    $$.data.targets.forEach(function (t) {\n        var i, j;\n        for (i = 0; i < notfoundIds.length; i++) {\n            if (t.id === notfoundIds[i]) {\n                tail = t.values[t.values.length - 1].index + 1;\n                for (j = 0; j < length; j++) {\n                    t.values.push({\n                        id: t.id,\n                        index: tail + j,\n                        x: $$.isTimeSeries() ? $$.getOtherTargetX(tail + j) : tail + j,\n                        value: null\n                    });\n                }\n            }\n        }\n    });\n\n    // Generate null values for new target\n    if ($$.data.targets.length) {\n        targets.forEach(function (t) {\n            var i,\n                missing = [];\n            for (i = $$.data.targets[0].values[0].index; i < tail; i++) {\n                missing.push({\n                    id: t.id,\n                    index: i,\n                    x: $$.isTimeSeries() ? $$.getOtherTargetX(i) : i,\n                    value: null\n                });\n            }\n            t.values.forEach(function (v) {\n                v.index += tail;\n                if (!$$.isTimeSeries()) {\n                    v.x += tail;\n                }\n            });\n            t.values = missing.concat(t.values);\n        });\n    }\n    $$.data.targets = $$.data.targets.concat(targets); // add remained\n\n    // check data count because behavior needs to change when it's only one\n    dataCount = $$.getMaxDataCount();\n    baseTarget = $$.data.targets[0];\n    baseValue = baseTarget.values[0];\n\n    // Update length to flow if needed\n    if (isDefined(args.to)) {\n        length = 0;\n        to = $$.isTimeSeries() ? $$.parseDate(args.to) : args.to;\n        baseTarget.values.forEach(function (v) {\n            if (v.x < to) {\n                length++;\n            }\n        });\n    } else if (isDefined(args.length)) {\n        length = args.length;\n    }\n\n    // If only one data, update the domain to flow from left edge of the chart\n    if (!orgDataCount) {\n        if ($$.isTimeSeries()) {\n            if (baseTarget.values.length > 1) {\n                diff = baseTarget.values[baseTarget.values.length - 1].x - baseValue.x;\n            } else {\n                diff = baseValue.x - $$.getXDomain($$.data.targets)[0];\n            }\n        } else {\n            diff = 1;\n        }\n        domain = [baseValue.x - diff, baseValue.x];\n        $$.updateXDomain(null, true, true, false, domain);\n    } else if (orgDataCount === 1) {\n        if ($$.isTimeSeries()) {\n            diff = (baseTarget.values[baseTarget.values.length - 1].x - baseValue.x) / 2;\n            domain = [new Date(+baseValue.x - diff), new Date(+baseValue.x + diff)];\n            $$.updateXDomain(null, true, true, false, domain);\n        }\n    }\n\n    // Set targets\n    $$.updateTargets($$.data.targets);\n\n    // Redraw with new targets\n    $$.redraw({\n        flow: {\n            index: baseValue.index,\n            length: length,\n            duration: isValue(args.duration) ? args.duration : $$.config.transition_duration,\n            done: args.done,\n            orgDataCount: orgDataCount\n        },\n        withLegend: true,\n        withTransition: orgDataCount > 1,\n        withTrimXDomain: false,\n        withUpdateXAxis: true\n    });\n};\n\nc3_chart_internal_fn.generateFlow = function (args) {\n    var $$ = this,\n        config = $$.config,\n        d3 = $$.d3;\n\n    return function () {\n        var targets = args.targets,\n            flow = args.flow,\n            drawBar = args.drawBar,\n            drawLine = args.drawLine,\n            drawArea = args.drawArea,\n            cx = args.cx,\n            cy = args.cy,\n            xv = args.xv,\n            xForText = args.xForText,\n            yForText = args.yForText,\n            duration = args.duration;\n\n        var translateX,\n            scaleX = 1,\n            transform,\n            flowIndex = flow.index,\n            flowLength = flow.length,\n            flowStart = $$.getValueOnIndex($$.data.targets[0].values, flowIndex),\n            flowEnd = $$.getValueOnIndex($$.data.targets[0].values, flowIndex + flowLength),\n            orgDomain = $$.x.domain(),\n            domain,\n            durationForFlow = flow.duration || duration,\n            done = flow.done || function () {},\n            wait = $$.generateWait();\n\n        var xgrid = $$.xgrid || d3.selectAll([]),\n            xgridLines = $$.xgridLines || d3.selectAll([]),\n            mainRegion = $$.mainRegion || d3.selectAll([]),\n            mainText = $$.mainText || d3.selectAll([]),\n            mainBar = $$.mainBar || d3.selectAll([]),\n            mainLine = $$.mainLine || d3.selectAll([]),\n            mainArea = $$.mainArea || d3.selectAll([]),\n            mainCircle = $$.mainCircle || d3.selectAll([]);\n\n        // set flag\n        $$.flowing = true;\n\n        // remove head data after rendered\n        $$.data.targets.forEach(function (d) {\n            d.values.splice(0, flowLength);\n        });\n\n        // update x domain to generate axis elements for flow\n        domain = $$.updateXDomain(targets, true, true);\n        // update elements related to x scale\n        if ($$.updateXGrid) {\n            $$.updateXGrid(true);\n        }\n\n        // generate transform to flow\n        if (!flow.orgDataCount) {\n            // if empty\n            if ($$.data.targets[0].values.length !== 1) {\n                translateX = $$.x(orgDomain[0]) - $$.x(domain[0]);\n            } else {\n                if ($$.isTimeSeries()) {\n                    flowStart = $$.getValueOnIndex($$.data.targets[0].values, 0);\n                    flowEnd = $$.getValueOnIndex($$.data.targets[0].values, $$.data.targets[0].values.length - 1);\n                    translateX = $$.x(flowStart.x) - $$.x(flowEnd.x);\n                } else {\n                    translateX = diffDomain(domain) / 2;\n                }\n            }\n        } else if (flow.orgDataCount === 1 || (flowStart && flowStart.x) === (flowEnd && flowEnd.x)) {\n            translateX = $$.x(orgDomain[0]) - $$.x(domain[0]);\n        } else {\n            if ($$.isTimeSeries()) {\n                translateX = $$.x(orgDomain[0]) - $$.x(domain[0]);\n            } else {\n                translateX = $$.x(flowStart.x) - $$.x(flowEnd.x);\n            }\n        }\n        scaleX = diffDomain(orgDomain) / diffDomain(domain);\n        transform = 'translate(' + translateX + ',0) scale(' + scaleX + ',1)';\n\n        $$.hideXGridFocus();\n\n        d3.transition().ease('linear').duration(durationForFlow).each(function () {\n            wait.add($$.axes.x.transition().call($$.xAxis));\n            wait.add(mainBar.transition().attr('transform', transform));\n            wait.add(mainLine.transition().attr('transform', transform));\n            wait.add(mainArea.transition().attr('transform', transform));\n            wait.add(mainCircle.transition().attr('transform', transform));\n            wait.add(mainText.transition().attr('transform', transform));\n            wait.add(mainRegion.filter($$.isRegionOnX).transition().attr('transform', transform));\n            wait.add(xgrid.transition().attr('transform', transform));\n            wait.add(xgridLines.transition().attr('transform', transform));\n        }).call(wait, function () {\n            var i,\n                shapes = [],\n                texts = [],\n                eventRects = [];\n\n            // remove flowed elements\n            if (flowLength) {\n                for (i = 0; i < flowLength; i++) {\n                    shapes.push('.' + CLASS.shape + '-' + (flowIndex + i));\n                    texts.push('.' + CLASS.text + '-' + (flowIndex + i));\n                    eventRects.push('.' + CLASS.eventRect + '-' + (flowIndex + i));\n                }\n                $$.svg.selectAll('.' + CLASS.shapes).selectAll(shapes).remove();\n                $$.svg.selectAll('.' + CLASS.texts).selectAll(texts).remove();\n                $$.svg.selectAll('.' + CLASS.eventRects).selectAll(eventRects).remove();\n                $$.svg.select('.' + CLASS.xgrid).remove();\n            }\n\n            // draw again for removing flowed elements and reverting attr\n            xgrid.attr('transform', null).attr($$.xgridAttr);\n            xgridLines.attr('transform', null);\n            xgridLines.select('line').attr(\"x1\", config.axis_rotated ? 0 : xv).attr(\"x2\", config.axis_rotated ? $$.width : xv);\n            xgridLines.select('text').attr(\"x\", config.axis_rotated ? $$.width : 0).attr(\"y\", xv);\n            mainBar.attr('transform', null).attr(\"d\", drawBar);\n            mainLine.attr('transform', null).attr(\"d\", drawLine);\n            mainArea.attr('transform', null).attr(\"d\", drawArea);\n            mainCircle.attr('transform', null).attr(\"cx\", cx).attr(\"cy\", cy);\n            mainText.attr('transform', null).attr('x', xForText).attr('y', yForText).style('fill-opacity', $$.opacityForText.bind($$));\n            mainRegion.attr('transform', null);\n            mainRegion.select('rect').filter($$.isRegionOnX).attr(\"x\", $$.regionX.bind($$)).attr(\"width\", $$.regionWidth.bind($$));\n\n            if (config.interaction_enabled) {\n                $$.redrawEventRect();\n            }\n\n            // callback for end of flow\n            done();\n\n            $$.flowing = false;\n        });\n    };\n};\n\nc3_chart_fn.focus = function (targetIds) {\n    var $$ = this.internal,\n        candidates;\n\n    targetIds = $$.mapToTargetIds(targetIds);\n    candidates = $$.svg.selectAll($$.selectorTargets(targetIds.filter($$.isTargetToShow, $$))), this.revert();\n    this.defocus();\n    candidates.classed(CLASS.focused, true).classed(CLASS.defocused, false);\n    if ($$.hasArcType()) {\n        $$.expandArc(targetIds);\n    }\n    $$.toggleFocusLegend(targetIds, true);\n\n    $$.focusedTargetIds = targetIds;\n    $$.defocusedTargetIds = $$.defocusedTargetIds.filter(function (id) {\n        return targetIds.indexOf(id) < 0;\n    });\n};\n\nc3_chart_fn.defocus = function (targetIds) {\n    var $$ = this.internal,\n        candidates;\n\n    targetIds = $$.mapToTargetIds(targetIds);\n    candidates = $$.svg.selectAll($$.selectorTargets(targetIds.filter($$.isTargetToShow, $$))), candidates.classed(CLASS.focused, false).classed(CLASS.defocused, true);\n    if ($$.hasArcType()) {\n        $$.unexpandArc(targetIds);\n    }\n    $$.toggleFocusLegend(targetIds, false);\n\n    $$.focusedTargetIds = $$.focusedTargetIds.filter(function (id) {\n        return targetIds.indexOf(id) < 0;\n    });\n    $$.defocusedTargetIds = targetIds;\n};\n\nc3_chart_fn.revert = function (targetIds) {\n    var $$ = this.internal,\n        candidates;\n\n    targetIds = $$.mapToTargetIds(targetIds);\n    candidates = $$.svg.selectAll($$.selectorTargets(targetIds)); // should be for all targets\n\n    candidates.classed(CLASS.focused, false).classed(CLASS.defocused, false);\n    if ($$.hasArcType()) {\n        $$.unexpandArc(targetIds);\n    }\n    if ($$.config.legend_show) {\n        $$.showLegend(targetIds.filter($$.isLegendToShow.bind($$)));\n        $$.legend.selectAll($$.selectorLegends(targetIds)).filter(function () {\n            return $$.d3.select(this).classed(CLASS.legendItemFocused);\n        }).classed(CLASS.legendItemFocused, false);\n    }\n\n    $$.focusedTargetIds = [];\n    $$.defocusedTargetIds = [];\n};\n\nc3_chart_fn.xgrids = function (grids) {\n    var $$ = this.internal,\n        config = $$.config;\n    if (!grids) {\n        return config.grid_x_lines;\n    }\n    config.grid_x_lines = grids;\n    $$.redrawWithoutRescale();\n    return config.grid_x_lines;\n};\nc3_chart_fn.xgrids.add = function (grids) {\n    var $$ = this.internal;\n    return this.xgrids($$.config.grid_x_lines.concat(grids ? grids : []));\n};\nc3_chart_fn.xgrids.remove = function (params) {\n    // TODO: multiple\n    var $$ = this.internal;\n    $$.removeGridLines(params, true);\n};\n\nc3_chart_fn.ygrids = function (grids) {\n    var $$ = this.internal,\n        config = $$.config;\n    if (!grids) {\n        return config.grid_y_lines;\n    }\n    config.grid_y_lines = grids;\n    $$.redrawWithoutRescale();\n    return config.grid_y_lines;\n};\nc3_chart_fn.ygrids.add = function (grids) {\n    var $$ = this.internal;\n    return this.ygrids($$.config.grid_y_lines.concat(grids ? grids : []));\n};\nc3_chart_fn.ygrids.remove = function (params) {\n    // TODO: multiple\n    var $$ = this.internal;\n    $$.removeGridLines(params, false);\n};\n\nc3_chart_fn.groups = function (groups) {\n    var $$ = this.internal,\n        config = $$.config;\n    if (isUndefined(groups)) {\n        return config.data_groups;\n    }\n    config.data_groups = groups;\n    $$.redraw();\n    return config.data_groups;\n};\n\nc3_chart_fn.legend = function () {};\nc3_chart_fn.legend.show = function (targetIds) {\n    var $$ = this.internal;\n    $$.showLegend($$.mapToTargetIds(targetIds));\n    $$.updateAndRedraw({ withLegend: true });\n};\nc3_chart_fn.legend.hide = function (targetIds) {\n    var $$ = this.internal;\n    $$.hideLegend($$.mapToTargetIds(targetIds));\n    $$.updateAndRedraw({ withLegend: true });\n};\n\nc3_chart_fn.load = function (args) {\n    var $$ = this.internal,\n        config = $$.config;\n    // update xs if specified\n    if (args.xs) {\n        $$.addXs(args.xs);\n    }\n    // update names if exists\n    if ('names' in args) {\n        c3_chart_fn.data.names.bind(this)(args.names);\n    }\n    // update classes if exists\n    if ('classes' in args) {\n        Object.keys(args.classes).forEach(function (id) {\n            config.data_classes[id] = args.classes[id];\n        });\n    }\n    // update categories if exists\n    if ('categories' in args && $$.isCategorized()) {\n        config.axis_x_categories = args.categories;\n    }\n    // update axes if exists\n    if ('axes' in args) {\n        Object.keys(args.axes).forEach(function (id) {\n            config.data_axes[id] = args.axes[id];\n        });\n    }\n    // update colors if exists\n    if ('colors' in args) {\n        Object.keys(args.colors).forEach(function (id) {\n            config.data_colors[id] = args.colors[id];\n        });\n    }\n    // use cache if exists\n    if ('cacheIds' in args && $$.hasCaches(args.cacheIds)) {\n        $$.load($$.getCaches(args.cacheIds), args.done);\n        return;\n    }\n    // unload if needed\n    if ('unload' in args) {\n        // TODO: do not unload if target will load (included in url/rows/columns)\n        $$.unload($$.mapToTargetIds(typeof args.unload === 'boolean' && args.unload ? null : args.unload), function () {\n            $$.loadFromArgs(args);\n        });\n    } else {\n        $$.loadFromArgs(args);\n    }\n};\n\nc3_chart_fn.unload = function (args) {\n    var $$ = this.internal;\n    args = args || {};\n    if (args instanceof Array) {\n        args = { ids: args };\n    } else if (typeof args === 'string') {\n        args = { ids: [args] };\n    }\n    $$.unload($$.mapToTargetIds(args.ids), function () {\n        $$.redraw({ withUpdateOrgXDomain: true, withUpdateXDomain: true, withLegend: true });\n        if (args.done) {\n            args.done();\n        }\n    });\n};\n\nc3_chart_fn.regions = function (regions) {\n    var $$ = this.internal,\n        config = $$.config;\n    if (!regions) {\n        return config.regions;\n    }\n    config.regions = regions;\n    $$.redrawWithoutRescale();\n    return config.regions;\n};\nc3_chart_fn.regions.add = function (regions) {\n    var $$ = this.internal,\n        config = $$.config;\n    if (!regions) {\n        return config.regions;\n    }\n    config.regions = config.regions.concat(regions);\n    $$.redrawWithoutRescale();\n    return config.regions;\n};\nc3_chart_fn.regions.remove = function (options) {\n    var $$ = this.internal,\n        config = $$.config,\n        duration,\n        classes,\n        regions;\n\n    options = options || {};\n    duration = $$.getOption(options, \"duration\", config.transition_duration);\n    classes = $$.getOption(options, \"classes\", [CLASS.region]);\n\n    regions = $$.main.select('.' + CLASS.regions).selectAll(classes.map(function (c) {\n        return '.' + c;\n    }));\n    (duration ? regions.transition().duration(duration) : regions).style('opacity', 0).remove();\n\n    config.regions = config.regions.filter(function (region) {\n        var found = false;\n        if (!region['class']) {\n            return true;\n        }\n        region['class'].split(' ').forEach(function (c) {\n            if (classes.indexOf(c) >= 0) {\n                found = true;\n            }\n        });\n        return !found;\n    });\n\n    return config.regions;\n};\n\nc3_chart_fn.selected = function (targetId) {\n    var $$ = this.internal,\n        d3 = $$.d3;\n    return d3.merge($$.main.selectAll('.' + CLASS.shapes + $$.getTargetSelectorSuffix(targetId)).selectAll('.' + CLASS.shape).filter(function () {\n        return d3.select(this).classed(CLASS.SELECTED);\n    }).map(function (d) {\n        return d.map(function (d) {\n            var data = d.__data__;return data.data ? data.data : data;\n        });\n    }));\n};\nc3_chart_fn.select = function (ids, indices, resetOther) {\n    var $$ = this.internal,\n        d3 = $$.d3,\n        config = $$.config;\n    if (!config.data_selection_enabled) {\n        return;\n    }\n    $$.main.selectAll('.' + CLASS.shapes).selectAll('.' + CLASS.shape).each(function (d, i) {\n        var shape = d3.select(this),\n            id = d.data ? d.data.id : d.id,\n            toggle = $$.getToggle(this, d).bind($$),\n            isTargetId = config.data_selection_grouped || !ids || ids.indexOf(id) >= 0,\n            isTargetIndex = !indices || indices.indexOf(i) >= 0,\n            isSelected = shape.classed(CLASS.SELECTED);\n        // line/area selection not supported yet\n        if (shape.classed(CLASS.line) || shape.classed(CLASS.area)) {\n            return;\n        }\n        if (isTargetId && isTargetIndex) {\n            if (config.data_selection_isselectable(d) && !isSelected) {\n                toggle(true, shape.classed(CLASS.SELECTED, true), d, i);\n            }\n        } else if (isDefined(resetOther) && resetOther) {\n            if (isSelected) {\n                toggle(false, shape.classed(CLASS.SELECTED, false), d, i);\n            }\n        }\n    });\n};\nc3_chart_fn.unselect = function (ids, indices) {\n    var $$ = this.internal,\n        d3 = $$.d3,\n        config = $$.config;\n    if (!config.data_selection_enabled) {\n        return;\n    }\n    $$.main.selectAll('.' + CLASS.shapes).selectAll('.' + CLASS.shape).each(function (d, i) {\n        var shape = d3.select(this),\n            id = d.data ? d.data.id : d.id,\n            toggle = $$.getToggle(this, d).bind($$),\n            isTargetId = config.data_selection_grouped || !ids || ids.indexOf(id) >= 0,\n            isTargetIndex = !indices || indices.indexOf(i) >= 0,\n            isSelected = shape.classed(CLASS.SELECTED);\n        // line/area selection not supported yet\n        if (shape.classed(CLASS.line) || shape.classed(CLASS.area)) {\n            return;\n        }\n        if (isTargetId && isTargetIndex) {\n            if (config.data_selection_isselectable(d)) {\n                if (isSelected) {\n                    toggle(false, shape.classed(CLASS.SELECTED, false), d, i);\n                }\n            }\n        }\n    });\n};\n\nc3_chart_fn.show = function (targetIds, options) {\n    var $$ = this.internal,\n        targets;\n\n    targetIds = $$.mapToTargetIds(targetIds);\n    options = options || {};\n\n    $$.removeHiddenTargetIds(targetIds);\n    targets = $$.svg.selectAll($$.selectorTargets(targetIds));\n\n    targets.transition().style('opacity', 1, 'important').call($$.endall, function () {\n        targets.style('opacity', null).style('opacity', 1);\n    });\n\n    if (options.withLegend) {\n        $$.showLegend(targetIds);\n    }\n\n    $$.redraw({ withUpdateOrgXDomain: true, withUpdateXDomain: true, withLegend: true });\n};\n\nc3_chart_fn.hide = function (targetIds, options) {\n    var $$ = this.internal,\n        targets;\n\n    targetIds = $$.mapToTargetIds(targetIds);\n    options = options || {};\n\n    $$.addHiddenTargetIds(targetIds);\n    targets = $$.svg.selectAll($$.selectorTargets(targetIds));\n\n    targets.transition().style('opacity', 0, 'important').call($$.endall, function () {\n        targets.style('opacity', null).style('opacity', 0);\n    });\n\n    if (options.withLegend) {\n        $$.hideLegend(targetIds);\n    }\n\n    $$.redraw({ withUpdateOrgXDomain: true, withUpdateXDomain: true, withLegend: true });\n};\n\nc3_chart_fn.toggle = function (targetIds, options) {\n    var that = this,\n        $$ = this.internal;\n    $$.mapToTargetIds(targetIds).forEach(function (targetId) {\n        $$.isTargetToShow(targetId) ? that.hide(targetId, options) : that.show(targetId, options);\n    });\n};\n\nc3_chart_fn.tooltip = function () {};\nc3_chart_fn.tooltip.show = function (args) {\n    var $$ = this.internal,\n        index,\n        mouse;\n\n    // determine mouse position on the chart\n    if (args.mouse) {\n        mouse = args.mouse;\n    }\n\n    // determine focus data\n    if (args.data) {\n        if ($$.isMultipleX()) {\n            // if multiple xs, target point will be determined by mouse\n            mouse = [$$.x(args.data.x), $$.getYScale(args.data.id)(args.data.value)];\n            index = null;\n        } else {\n            // TODO: when tooltip_grouped = false\n            index = isValue(args.data.index) ? args.data.index : $$.getIndexByX(args.data.x);\n        }\n    } else if (typeof args.x !== 'undefined') {\n        index = $$.getIndexByX(args.x);\n    } else if (typeof args.index !== 'undefined') {\n        index = args.index;\n    }\n\n    // emulate mouse events to show\n    $$.dispatchEvent('mouseover', index, mouse);\n    $$.dispatchEvent('mousemove', index, mouse);\n\n    $$.config.tooltip_onshow.call($$, args.data);\n};\nc3_chart_fn.tooltip.hide = function () {\n    // TODO: get target data by checking the state of focus\n    this.internal.dispatchEvent('mouseout', 0);\n\n    this.internal.config.tooltip_onhide.call(this);\n};\n\nc3_chart_fn.transform = function (type, targetIds) {\n    var $$ = this.internal,\n        options = ['pie', 'donut'].indexOf(type) >= 0 ? { withTransform: true } : null;\n    $$.transformTo(targetIds, type, options);\n};\n\nc3_chart_internal_fn.transformTo = function (targetIds, type, optionsForRedraw) {\n    var $$ = this,\n        withTransitionForAxis = !$$.hasArcType(),\n        options = optionsForRedraw || { withTransitionForAxis: withTransitionForAxis };\n    options.withTransitionForTransform = false;\n    $$.transiting = false;\n    $$.setTargetType(targetIds, type);\n    $$.updateTargets($$.data.targets); // this is needed when transforming to arc\n    $$.updateAndRedraw(options);\n};\n\nc3_chart_fn.x = function (x) {\n    var $$ = this.internal;\n    if (arguments.length) {\n        $$.updateTargetX($$.data.targets, x);\n        $$.redraw({ withUpdateOrgXDomain: true, withUpdateXDomain: true });\n    }\n    return $$.data.xs;\n};\nc3_chart_fn.xs = function (xs) {\n    var $$ = this.internal;\n    if (arguments.length) {\n        $$.updateTargetXs($$.data.targets, xs);\n        $$.redraw({ withUpdateOrgXDomain: true, withUpdateXDomain: true });\n    }\n    return $$.data.xs;\n};\n\nc3_chart_fn.zoom = function (domain) {\n    var $$ = this.internal;\n    if (domain) {\n        if ($$.isTimeSeries()) {\n            domain = domain.map(function (x) {\n                return $$.parseDate(x);\n            });\n        }\n        $$.brush.extent(domain);\n        $$.redraw({ withUpdateXDomain: true, withY: $$.config.zoom_rescale });\n        $$.config.zoom_onzoom.call(this, $$.x.orgDomain());\n    }\n    return $$.brush.extent();\n};\nc3_chart_fn.zoom.enable = function (enabled) {\n    var $$ = this.internal;\n    $$.config.zoom_enabled = enabled;\n    $$.updateAndRedraw();\n};\nc3_chart_fn.unzoom = function () {\n    var $$ = this.internal;\n    $$.brush.clear().update();\n    $$.redraw({ withUpdateXDomain: true });\n};\n\nc3_chart_fn.zoom.max = function (max) {\n    var $$ = this.internal,\n        config = $$.config,\n        d3 = $$.d3;\n    if (max === 0 || max) {\n        config.zoom_x_max = d3.max([$$.orgXDomain[1], max]);\n    } else {\n        return config.zoom_x_max;\n    }\n};\n\nc3_chart_fn.zoom.min = function (min) {\n    var $$ = this.internal,\n        config = $$.config,\n        d3 = $$.d3;\n    if (min === 0 || min) {\n        config.zoom_x_min = d3.min([$$.orgXDomain[0], min]);\n    } else {\n        return config.zoom_x_min;\n    }\n};\n\nc3_chart_fn.zoom.range = function (range) {\n    if (arguments.length) {\n        if (isDefined(range.max)) {\n            this.domain.max(range.max);\n        }\n        if (isDefined(range.min)) {\n            this.domain.min(range.min);\n        }\n    } else {\n        return {\n            max: this.domain.max(),\n            min: this.domain.min()\n        };\n    }\n};\n\nc3_chart_internal_fn.initPie = function () {\n    var $$ = this,\n        d3 = $$.d3;\n    $$.pie = d3.layout.pie().value(function (d) {\n        return d.values.reduce(function (a, b) {\n            return a + b.value;\n        }, 0);\n    });\n    $$.pie.sort($$.getOrderFunction() || null);\n};\n\nc3_chart_internal_fn.updateRadius = function () {\n    var $$ = this,\n        config = $$.config,\n        w = config.gauge_width || config.donut_width;\n    $$.radiusExpanded = Math.min($$.arcWidth, $$.arcHeight) / 2;\n    $$.radius = $$.radiusExpanded * 0.95;\n    $$.innerRadiusRatio = w ? ($$.radius - w) / $$.radius : 0.6;\n    $$.innerRadius = $$.hasType('donut') || $$.hasType('gauge') ? $$.radius * $$.innerRadiusRatio : 0;\n};\n\nc3_chart_internal_fn.updateArc = function () {\n    var $$ = this;\n    $$.svgArc = $$.getSvgArc();\n    $$.svgArcExpanded = $$.getSvgArcExpanded();\n    $$.svgArcExpandedSub = $$.getSvgArcExpanded(0.98);\n};\n\nc3_chart_internal_fn.updateAngle = function (d) {\n    var $$ = this,\n        config = $$.config,\n        found = false,\n        index = 0,\n        gMin,\n        gMax,\n        gTic,\n        gValue;\n\n    if (!config) {\n        return null;\n    }\n\n    $$.pie($$.filterTargetsToShow($$.data.targets)).forEach(function (t) {\n        if (!found && t.data.id === d.data.id) {\n            found = true;\n            d = t;\n            d.index = index;\n        }\n        index++;\n    });\n    if (isNaN(d.startAngle)) {\n        d.startAngle = 0;\n    }\n    if (isNaN(d.endAngle)) {\n        d.endAngle = d.startAngle;\n    }\n    if ($$.isGaugeType(d.data)) {\n        gMin = config.gauge_min;\n        gMax = config.gauge_max;\n        gTic = Math.PI * (config.gauge_fullCircle ? 2 : 1) / (gMax - gMin);\n        gValue = d.value < gMin ? 0 : d.value < gMax ? d.value - gMin : gMax - gMin;\n        d.startAngle = config.gauge_startingAngle;\n        d.endAngle = d.startAngle + gTic * gValue;\n    }\n    return found ? d : null;\n};\n\nc3_chart_internal_fn.getSvgArc = function () {\n    var $$ = this,\n        arc = $$.d3.svg.arc().outerRadius($$.radius).innerRadius($$.innerRadius),\n        newArc = function newArc(d, withoutUpdate) {\n        var updated;\n        if (withoutUpdate) {\n            return arc(d);\n        } // for interpolate\n        updated = $$.updateAngle(d);\n        return updated ? arc(updated) : \"M 0 0\";\n    };\n    // TODO: extends all function\n    newArc.centroid = arc.centroid;\n    return newArc;\n};\n\nc3_chart_internal_fn.getSvgArcExpanded = function (rate) {\n    var $$ = this,\n        arc = $$.d3.svg.arc().outerRadius($$.radiusExpanded * (rate ? rate : 1)).innerRadius($$.innerRadius);\n    return function (d) {\n        var updated = $$.updateAngle(d);\n        return updated ? arc(updated) : \"M 0 0\";\n    };\n};\n\nc3_chart_internal_fn.getArc = function (d, withoutUpdate, force) {\n    return force || this.isArcType(d.data) ? this.svgArc(d, withoutUpdate) : \"M 0 0\";\n};\n\nc3_chart_internal_fn.transformForArcLabel = function (d) {\n    var $$ = this,\n        config = $$.config,\n        updated = $$.updateAngle(d),\n        c,\n        x,\n        y,\n        h,\n        ratio,\n        translate = \"\";\n    if (updated && !$$.hasType('gauge')) {\n        c = this.svgArc.centroid(updated);\n        x = isNaN(c[0]) ? 0 : c[0];\n        y = isNaN(c[1]) ? 0 : c[1];\n        h = Math.sqrt(x * x + y * y);\n        if ($$.hasType('donut') && config.donut_label_ratio) {\n            ratio = isFunction(config.donut_label_ratio) ? config.donut_label_ratio(d, $$.radius, h) : config.donut_label_ratio;\n        } else if ($$.hasType('pie') && config.pie_label_ratio) {\n            ratio = isFunction(config.pie_label_ratio) ? config.pie_label_ratio(d, $$.radius, h) : config.pie_label_ratio;\n        } else {\n            ratio = $$.radius && h ? (36 / $$.radius > 0.375 ? 1.175 - 36 / $$.radius : 0.8) * $$.radius / h : 0;\n        }\n        translate = \"translate(\" + x * ratio + ',' + y * ratio + \")\";\n    }\n    return translate;\n};\n\nc3_chart_internal_fn.getArcRatio = function (d) {\n    var $$ = this,\n        config = $$.config,\n        whole = Math.PI * ($$.hasType('gauge') && !config.gauge_fullCircle ? 1 : 2);\n    return d ? (d.endAngle - d.startAngle) / whole : null;\n};\n\nc3_chart_internal_fn.convertToArcData = function (d) {\n    return this.addName({\n        id: d.data.id,\n        value: d.value,\n        ratio: this.getArcRatio(d),\n        index: d.index\n    });\n};\n\nc3_chart_internal_fn.textForArcLabel = function (d) {\n    var $$ = this,\n        updated,\n        value,\n        ratio,\n        id,\n        format;\n    if (!$$.shouldShowArcLabel()) {\n        return \"\";\n    }\n    updated = $$.updateAngle(d);\n    value = updated ? updated.value : null;\n    ratio = $$.getArcRatio(updated);\n    id = d.data.id;\n    if (!$$.hasType('gauge') && !$$.meetsArcLabelThreshold(ratio)) {\n        return \"\";\n    }\n    format = $$.getArcLabelFormat();\n    return format ? format(value, ratio, id) : $$.defaultArcValueFormat(value, ratio);\n};\n\nc3_chart_internal_fn.textForGaugeMinMax = function (value, isMax) {\n    var $$ = this,\n        format = $$.getGaugeLabelExtents();\n\n    return format ? format(value, isMax) : value;\n};\n\nc3_chart_internal_fn.expandArc = function (targetIds) {\n    var $$ = this,\n        interval;\n\n    // MEMO: avoid to cancel transition\n    if ($$.transiting) {\n        interval = window.setInterval(function () {\n            if (!$$.transiting) {\n                window.clearInterval(interval);\n                if ($$.legend.selectAll('.c3-legend-item-focused').size() > 0) {\n                    $$.expandArc(targetIds);\n                }\n            }\n        }, 10);\n        return;\n    }\n\n    targetIds = $$.mapToTargetIds(targetIds);\n\n    $$.svg.selectAll($$.selectorTargets(targetIds, '.' + CLASS.chartArc)).each(function (d) {\n        if (!$$.shouldExpand(d.data.id)) {\n            return;\n        }\n        $$.d3.select(this).selectAll('path').transition().duration($$.expandDuration(d.data.id)).attr(\"d\", $$.svgArcExpanded).transition().duration($$.expandDuration(d.data.id) * 2).attr(\"d\", $$.svgArcExpandedSub).each(function (d) {\n            if ($$.isDonutType(d.data)) {\n                // callback here\n            }\n        });\n    });\n};\n\nc3_chart_internal_fn.unexpandArc = function (targetIds) {\n    var $$ = this;\n\n    if ($$.transiting) {\n        return;\n    }\n\n    targetIds = $$.mapToTargetIds(targetIds);\n\n    $$.svg.selectAll($$.selectorTargets(targetIds, '.' + CLASS.chartArc)).selectAll('path').transition().duration(function (d) {\n        return $$.expandDuration(d.data.id);\n    }).attr(\"d\", $$.svgArc);\n    $$.svg.selectAll('.' + CLASS.arc);\n};\n\nc3_chart_internal_fn.expandDuration = function (id) {\n    var $$ = this,\n        config = $$.config;\n\n    if ($$.isDonutType(id)) {\n        return config.donut_expand_duration;\n    } else if ($$.isGaugeType(id)) {\n        return config.gauge_expand_duration;\n    } else if ($$.isPieType(id)) {\n        return config.pie_expand_duration;\n    } else {\n        return 50;\n    }\n};\n\nc3_chart_internal_fn.shouldExpand = function (id) {\n    var $$ = this,\n        config = $$.config;\n    return $$.isDonutType(id) && config.donut_expand || $$.isGaugeType(id) && config.gauge_expand || $$.isPieType(id) && config.pie_expand;\n};\n\nc3_chart_internal_fn.shouldShowArcLabel = function () {\n    var $$ = this,\n        config = $$.config,\n        shouldShow = true;\n    if ($$.hasType('donut')) {\n        shouldShow = config.donut_label_show;\n    } else if ($$.hasType('pie')) {\n        shouldShow = config.pie_label_show;\n    }\n    // when gauge, always true\n    return shouldShow;\n};\n\nc3_chart_internal_fn.meetsArcLabelThreshold = function (ratio) {\n    var $$ = this,\n        config = $$.config,\n        threshold = $$.hasType('donut') ? config.donut_label_threshold : config.pie_label_threshold;\n    return ratio >= threshold;\n};\n\nc3_chart_internal_fn.getArcLabelFormat = function () {\n    var $$ = this,\n        config = $$.config,\n        format = config.pie_label_format;\n    if ($$.hasType('gauge')) {\n        format = config.gauge_label_format;\n    } else if ($$.hasType('donut')) {\n        format = config.donut_label_format;\n    }\n    return format;\n};\n\nc3_chart_internal_fn.getGaugeLabelExtents = function () {\n    var $$ = this,\n        config = $$.config;\n    return config.gauge_label_extents;\n};\n\nc3_chart_internal_fn.getArcTitle = function () {\n    var $$ = this;\n    return $$.hasType('donut') ? $$.config.donut_title : \"\";\n};\n\nc3_chart_internal_fn.updateTargetsForArc = function (targets) {\n    var $$ = this,\n        main = $$.main,\n        mainPieUpdate,\n        mainPieEnter,\n        classChartArc = $$.classChartArc.bind($$),\n        classArcs = $$.classArcs.bind($$),\n        classFocus = $$.classFocus.bind($$);\n    mainPieUpdate = main.select('.' + CLASS.chartArcs).selectAll('.' + CLASS.chartArc).data($$.pie(targets)).attr(\"class\", function (d) {\n        return classChartArc(d) + classFocus(d.data);\n    });\n    mainPieEnter = mainPieUpdate.enter().append(\"g\").attr(\"class\", classChartArc);\n    mainPieEnter.append('g').attr('class', classArcs);\n    mainPieEnter.append(\"text\").attr(\"dy\", $$.hasType('gauge') ? \"-.1em\" : \".35em\").style(\"opacity\", 0).style(\"text-anchor\", \"middle\").style(\"pointer-events\", \"none\");\n    // MEMO: can not keep same color..., but not bad to update color in redraw\n    //mainPieUpdate.exit().remove();\n};\n\nc3_chart_internal_fn.initArc = function () {\n    var $$ = this;\n    $$.arcs = $$.main.select('.' + CLASS.chart).append(\"g\").attr(\"class\", CLASS.chartArcs).attr(\"transform\", $$.getTranslate('arc'));\n    $$.arcs.append('text').attr('class', CLASS.chartArcsTitle).style(\"text-anchor\", \"middle\").text($$.getArcTitle());\n};\n\nc3_chart_internal_fn.redrawArc = function (duration, durationForExit, withTransform) {\n    var $$ = this,\n        d3 = $$.d3,\n        config = $$.config,\n        main = $$.main,\n        mainArc;\n    mainArc = main.selectAll('.' + CLASS.arcs).selectAll('.' + CLASS.arc).data($$.arcData.bind($$));\n    mainArc.enter().append('path').attr(\"class\", $$.classArc.bind($$)).style(\"fill\", function (d) {\n        return $$.color(d.data);\n    }).style(\"cursor\", function (d) {\n        return config.interaction_enabled && config.data_selection_isselectable(d) ? \"pointer\" : null;\n    }).each(function (d) {\n        if ($$.isGaugeType(d.data)) {\n            d.startAngle = d.endAngle = config.gauge_startingAngle;\n        }\n        this._current = d;\n    });\n    mainArc.attr(\"transform\", function (d) {\n        return !$$.isGaugeType(d.data) && withTransform ? \"scale(0)\" : \"\";\n    }).on('mouseover', config.interaction_enabled ? function (d) {\n        var updated, arcData;\n        if ($$.transiting) {\n            // skip while transiting\n            return;\n        }\n        updated = $$.updateAngle(d);\n        if (updated) {\n            arcData = $$.convertToArcData(updated);\n            // transitions\n            $$.expandArc(updated.data.id);\n            $$.api.focus(updated.data.id);\n            $$.toggleFocusLegend(updated.data.id, true);\n            $$.config.data_onmouseover(arcData, this);\n        }\n    } : null).on('mousemove', config.interaction_enabled ? function (d) {\n        var updated = $$.updateAngle(d),\n            arcData,\n            selectedData;\n        if (updated) {\n            arcData = $$.convertToArcData(updated), selectedData = [arcData];\n            $$.showTooltip(selectedData, this);\n        }\n    } : null).on('mouseout', config.interaction_enabled ? function (d) {\n        var updated, arcData;\n        if ($$.transiting) {\n            // skip while transiting\n            return;\n        }\n        updated = $$.updateAngle(d);\n        if (updated) {\n            arcData = $$.convertToArcData(updated);\n            // transitions\n            $$.unexpandArc(updated.data.id);\n            $$.api.revert();\n            $$.revertLegend();\n            $$.hideTooltip();\n            $$.config.data_onmouseout(arcData, this);\n        }\n    } : null).on('click', config.interaction_enabled ? function (d, i) {\n        var updated = $$.updateAngle(d),\n            arcData;\n        if (updated) {\n            arcData = $$.convertToArcData(updated);\n            if ($$.toggleShape) {\n                $$.toggleShape(this, arcData, i);\n            }\n            $$.config.data_onclick.call($$.api, arcData, this);\n        }\n    } : null).each(function () {\n        $$.transiting = true;\n    }).transition().duration(duration).attrTween(\"d\", function (d) {\n        var updated = $$.updateAngle(d),\n            interpolate;\n        if (!updated) {\n            return function () {\n                return \"M 0 0\";\n            };\n        }\n        //                if (this._current === d) {\n        //                    this._current = {\n        //                        startAngle: Math.PI*2,\n        //                        endAngle: Math.PI*2,\n        //                    };\n        //                }\n        if (isNaN(this._current.startAngle)) {\n            this._current.startAngle = 0;\n        }\n        if (isNaN(this._current.endAngle)) {\n            this._current.endAngle = this._current.startAngle;\n        }\n        interpolate = d3.interpolate(this._current, updated);\n        this._current = interpolate(0);\n        return function (t) {\n            var interpolated = interpolate(t);\n            interpolated.data = d.data; // data.id will be updated by interporator\n            return $$.getArc(interpolated, true);\n        };\n    }).attr(\"transform\", withTransform ? \"scale(1)\" : \"\").style(\"fill\", function (d) {\n        return $$.levelColor ? $$.levelColor(d.data.values[0].value) : $$.color(d.data.id);\n    } // Where gauge reading color would receive customization.\n    ).call($$.endall, function () {\n        $$.transiting = false;\n    });\n    mainArc.exit().transition().duration(durationForExit).style('opacity', 0).remove();\n    main.selectAll('.' + CLASS.chartArc).select('text').style(\"opacity\", 0).attr('class', function (d) {\n        return $$.isGaugeType(d.data) ? CLASS.gaugeValue : '';\n    }).text($$.textForArcLabel.bind($$)).attr(\"transform\", $$.transformForArcLabel.bind($$)).style('font-size', function (d) {\n        return $$.isGaugeType(d.data) ? Math.round($$.radius / 5) + 'px' : '';\n    }).transition().duration(duration).style(\"opacity\", function (d) {\n        return $$.isTargetToShow(d.data.id) && $$.isArcType(d.data) ? 1 : 0;\n    });\n    main.select('.' + CLASS.chartArcsTitle).style(\"opacity\", $$.hasType('donut') || $$.hasType('gauge') ? 1 : 0);\n\n    if ($$.hasType('gauge')) {\n        $$.arcs.select('.' + CLASS.chartArcsBackground).attr(\"d\", function () {\n            var d = {\n                data: [{ value: config.gauge_max }],\n                startAngle: config.gauge_startingAngle,\n                endAngle: -1 * config.gauge_startingAngle\n            };\n            return $$.getArc(d, true, true);\n        });\n        $$.arcs.select('.' + CLASS.chartArcsGaugeUnit).attr(\"dy\", \".75em\").text(config.gauge_label_show ? config.gauge_units : '');\n        $$.arcs.select('.' + CLASS.chartArcsGaugeMin).attr(\"dx\", -1 * ($$.innerRadius + ($$.radius - $$.innerRadius) / (config.gauge_fullCircle ? 1 : 2)) + \"px\").attr(\"dy\", \"1.2em\").text(config.gauge_label_show ? $$.textForGaugeMinMax(config.gauge_min, false) : '');\n        $$.arcs.select('.' + CLASS.chartArcsGaugeMax).attr(\"dx\", $$.innerRadius + ($$.radius - $$.innerRadius) / (config.gauge_fullCircle ? 1 : 2) + \"px\").attr(\"dy\", \"1.2em\").text(config.gauge_label_show ? $$.textForGaugeMinMax(config.gauge_max, true) : '');\n    }\n};\nc3_chart_internal_fn.initGauge = function () {\n    var arcs = this.arcs;\n    if (this.hasType('gauge')) {\n        arcs.append('path').attr(\"class\", CLASS.chartArcsBackground);\n        arcs.append(\"text\").attr(\"class\", CLASS.chartArcsGaugeUnit).style(\"text-anchor\", \"middle\").style(\"pointer-events\", \"none\");\n        arcs.append(\"text\").attr(\"class\", CLASS.chartArcsGaugeMin).style(\"text-anchor\", \"middle\").style(\"pointer-events\", \"none\");\n        arcs.append(\"text\").attr(\"class\", CLASS.chartArcsGaugeMax).style(\"text-anchor\", \"middle\").style(\"pointer-events\", \"none\");\n    }\n};\nc3_chart_internal_fn.getGaugeLabelHeight = function () {\n    return this.config.gauge_label_show ? 20 : 0;\n};\n\nc3_chart_internal_fn.hasCaches = function (ids) {\n    for (var i = 0; i < ids.length; i++) {\n        if (!(ids[i] in this.cache)) {\n            return false;\n        }\n    }\n    return true;\n};\nc3_chart_internal_fn.addCache = function (id, target) {\n    this.cache[id] = this.cloneTarget(target);\n};\nc3_chart_internal_fn.getCaches = function (ids) {\n    var targets = [],\n        i;\n    for (i = 0; i < ids.length; i++) {\n        if (ids[i] in this.cache) {\n            targets.push(this.cloneTarget(this.cache[ids[i]]));\n        }\n    }\n    return targets;\n};\n\nc3_chart_internal_fn.categoryName = function (i) {\n    var config = this.config;\n    return i < config.axis_x_categories.length ? config.axis_x_categories[i] : i;\n};\n\nc3_chart_internal_fn.generateClass = function (prefix, targetId) {\n    return \" \" + prefix + \" \" + prefix + this.getTargetSelectorSuffix(targetId);\n};\nc3_chart_internal_fn.classText = function (d) {\n    return this.generateClass(CLASS.text, d.index);\n};\nc3_chart_internal_fn.classTexts = function (d) {\n    return this.generateClass(CLASS.texts, d.id);\n};\nc3_chart_internal_fn.classShape = function (d) {\n    return this.generateClass(CLASS.shape, d.index);\n};\nc3_chart_internal_fn.classShapes = function (d) {\n    return this.generateClass(CLASS.shapes, d.id);\n};\nc3_chart_internal_fn.classLine = function (d) {\n    return this.classShape(d) + this.generateClass(CLASS.line, d.id);\n};\nc3_chart_internal_fn.classLines = function (d) {\n    return this.classShapes(d) + this.generateClass(CLASS.lines, d.id);\n};\nc3_chart_internal_fn.classCircle = function (d) {\n    return this.classShape(d) + this.generateClass(CLASS.circle, d.index);\n};\nc3_chart_internal_fn.classCircles = function (d) {\n    return this.classShapes(d) + this.generateClass(CLASS.circles, d.id);\n};\nc3_chart_internal_fn.classBar = function (d) {\n    return this.classShape(d) + this.generateClass(CLASS.bar, d.index);\n};\nc3_chart_internal_fn.classBars = function (d) {\n    return this.classShapes(d) + this.generateClass(CLASS.bars, d.id);\n};\nc3_chart_internal_fn.classArc = function (d) {\n    return this.classShape(d.data) + this.generateClass(CLASS.arc, d.data.id);\n};\nc3_chart_internal_fn.classArcs = function (d) {\n    return this.classShapes(d.data) + this.generateClass(CLASS.arcs, d.data.id);\n};\nc3_chart_internal_fn.classArea = function (d) {\n    return this.classShape(d) + this.generateClass(CLASS.area, d.id);\n};\nc3_chart_internal_fn.classAreas = function (d) {\n    return this.classShapes(d) + this.generateClass(CLASS.areas, d.id);\n};\nc3_chart_internal_fn.classRegion = function (d, i) {\n    return this.generateClass(CLASS.region, i) + ' ' + ('class' in d ? d['class'] : '');\n};\nc3_chart_internal_fn.classEvent = function (d) {\n    return this.generateClass(CLASS.eventRect, d.index);\n};\nc3_chart_internal_fn.classTarget = function (id) {\n    var $$ = this;\n    var additionalClassSuffix = $$.config.data_classes[id],\n        additionalClass = '';\n    if (additionalClassSuffix) {\n        additionalClass = ' ' + CLASS.target + '-' + additionalClassSuffix;\n    }\n    return $$.generateClass(CLASS.target, id) + additionalClass;\n};\nc3_chart_internal_fn.classFocus = function (d) {\n    return this.classFocused(d) + this.classDefocused(d);\n};\nc3_chart_internal_fn.classFocused = function (d) {\n    return ' ' + (this.focusedTargetIds.indexOf(d.id) >= 0 ? CLASS.focused : '');\n};\nc3_chart_internal_fn.classDefocused = function (d) {\n    return ' ' + (this.defocusedTargetIds.indexOf(d.id) >= 0 ? CLASS.defocused : '');\n};\nc3_chart_internal_fn.classChartText = function (d) {\n    return CLASS.chartText + this.classTarget(d.id);\n};\nc3_chart_internal_fn.classChartLine = function (d) {\n    return CLASS.chartLine + this.classTarget(d.id);\n};\nc3_chart_internal_fn.classChartBar = function (d) {\n    return CLASS.chartBar + this.classTarget(d.id);\n};\nc3_chart_internal_fn.classChartArc = function (d) {\n    return CLASS.chartArc + this.classTarget(d.data.id);\n};\nc3_chart_internal_fn.getTargetSelectorSuffix = function (targetId) {\n    return targetId || targetId === 0 ? ('-' + targetId).replace(/[\\s?!@#$%^&*()_=+,.<>'\":;\\[\\]\\/|~`{}\\\\]/g, '-') : '';\n};\nc3_chart_internal_fn.selectorTarget = function (id, prefix) {\n    return (prefix || '') + '.' + CLASS.target + this.getTargetSelectorSuffix(id);\n};\nc3_chart_internal_fn.selectorTargets = function (ids, prefix) {\n    var $$ = this;\n    ids = ids || [];\n    return ids.length ? ids.map(function (id) {\n        return $$.selectorTarget(id, prefix);\n    }) : null;\n};\nc3_chart_internal_fn.selectorLegend = function (id) {\n    return '.' + CLASS.legendItem + this.getTargetSelectorSuffix(id);\n};\nc3_chart_internal_fn.selectorLegends = function (ids) {\n    var $$ = this;\n    return ids && ids.length ? ids.map(function (id) {\n        return $$.selectorLegend(id);\n    }) : null;\n};\n\nc3_chart_internal_fn.getClipPath = function (id) {\n    var isIE9 = window.navigator.appVersion.toLowerCase().indexOf(\"msie 9.\") >= 0;\n    return \"url(\" + (isIE9 ? \"\" : document.URL.split('#')[0]) + \"#\" + id + \")\";\n};\nc3_chart_internal_fn.appendClip = function (parent, id) {\n    return parent.append(\"clipPath\").attr(\"id\", id).append(\"rect\");\n};\nc3_chart_internal_fn.getAxisClipX = function (forHorizontal) {\n    // axis line width + padding for left\n    var left = Math.max(30, this.margin.left);\n    return forHorizontal ? -(1 + left) : -(left - 1);\n};\nc3_chart_internal_fn.getAxisClipY = function (forHorizontal) {\n    return forHorizontal ? -20 : -this.margin.top;\n};\nc3_chart_internal_fn.getXAxisClipX = function () {\n    var $$ = this;\n    return $$.getAxisClipX(!$$.config.axis_rotated);\n};\nc3_chart_internal_fn.getXAxisClipY = function () {\n    var $$ = this;\n    return $$.getAxisClipY(!$$.config.axis_rotated);\n};\nc3_chart_internal_fn.getYAxisClipX = function () {\n    var $$ = this;\n    return $$.config.axis_y_inner ? -1 : $$.getAxisClipX($$.config.axis_rotated);\n};\nc3_chart_internal_fn.getYAxisClipY = function () {\n    var $$ = this;\n    return $$.getAxisClipY($$.config.axis_rotated);\n};\nc3_chart_internal_fn.getAxisClipWidth = function (forHorizontal) {\n    var $$ = this,\n        left = Math.max(30, $$.margin.left),\n        right = Math.max(30, $$.margin.right);\n    // width + axis line width + padding for left/right\n    return forHorizontal ? $$.width + 2 + left + right : $$.margin.left + 20;\n};\nc3_chart_internal_fn.getAxisClipHeight = function (forHorizontal) {\n    // less than 20 is not enough to show the axis label 'outer' without legend\n    return (forHorizontal ? this.margin.bottom : this.margin.top + this.height) + 20;\n};\nc3_chart_internal_fn.getXAxisClipWidth = function () {\n    var $$ = this;\n    return $$.getAxisClipWidth(!$$.config.axis_rotated);\n};\nc3_chart_internal_fn.getXAxisClipHeight = function () {\n    var $$ = this;\n    return $$.getAxisClipHeight(!$$.config.axis_rotated);\n};\nc3_chart_internal_fn.getYAxisClipWidth = function () {\n    var $$ = this;\n    return $$.getAxisClipWidth($$.config.axis_rotated) + ($$.config.axis_y_inner ? 20 : 0);\n};\nc3_chart_internal_fn.getYAxisClipHeight = function () {\n    var $$ = this;\n    return $$.getAxisClipHeight($$.config.axis_rotated);\n};\n\nc3_chart_internal_fn.generateColor = function () {\n    var $$ = this,\n        config = $$.config,\n        d3 = $$.d3,\n        colors = config.data_colors,\n        pattern = notEmpty(config.color_pattern) ? config.color_pattern : d3.scale.category10().range(),\n        callback = config.data_color,\n        ids = [];\n\n    return function (d) {\n        var id = d.id || d.data && d.data.id || d,\n            color;\n\n        // if callback function is provided\n        if (colors[id] instanceof Function) {\n            color = colors[id](d);\n        }\n        // if specified, choose that color\n        else if (colors[id]) {\n                color = colors[id];\n            }\n            // if not specified, choose from pattern\n            else {\n                    if (ids.indexOf(id) < 0) {\n                        ids.push(id);\n                    }\n                    color = pattern[ids.indexOf(id) % pattern.length];\n                    colors[id] = color;\n                }\n        return callback instanceof Function ? callback(color, d) : color;\n    };\n};\nc3_chart_internal_fn.generateLevelColor = function () {\n    var $$ = this,\n        config = $$.config,\n        colors = config.color_pattern,\n        threshold = config.color_threshold,\n        asValue = threshold.unit === 'value',\n        values = threshold.values && threshold.values.length ? threshold.values : [],\n        max = threshold.max || 100;\n    return notEmpty(config.color_threshold) ? function (value) {\n        var i,\n            v,\n            color = colors[colors.length - 1];\n        for (i = 0; i < values.length; i++) {\n            v = asValue ? value : value * 100 / max;\n            if (v < values[i]) {\n                color = colors[i];\n                break;\n            }\n        }\n        return color;\n    } : null;\n};\n\nc3_chart_internal_fn.getDefaultConfig = function () {\n    var config = {\n        bindto: '#chart',\n        svg_classname: undefined,\n        size_width: undefined,\n        size_height: undefined,\n        padding_left: undefined,\n        padding_right: undefined,\n        padding_top: undefined,\n        padding_bottom: undefined,\n        resize_auto: true,\n        zoom_enabled: false,\n        zoom_extent: undefined,\n        zoom_privileged: false,\n        zoom_rescale: false,\n        zoom_onzoom: function zoom_onzoom() {},\n        zoom_onzoomstart: function zoom_onzoomstart() {},\n        zoom_onzoomend: function zoom_onzoomend() {},\n        zoom_x_min: undefined,\n        zoom_x_max: undefined,\n        interaction_brighten: true,\n        interaction_enabled: true,\n        onmouseover: function onmouseover() {},\n        onmouseout: function onmouseout() {},\n        onresize: function onresize() {},\n        onresized: function onresized() {},\n        oninit: function oninit() {},\n        onrendered: function onrendered() {},\n        transition_duration: 350,\n        data_x: undefined,\n        data_xs: {},\n        data_xFormat: '%Y-%m-%d',\n        data_xLocaltime: true,\n        data_xSort: true,\n        data_idConverter: function data_idConverter(id) {\n            return id;\n        },\n        data_names: {},\n        data_classes: {},\n        data_groups: [],\n        data_axes: {},\n        data_type: undefined,\n        data_types: {},\n        data_labels: {},\n        data_order: 'desc',\n        data_regions: {},\n        data_color: undefined,\n        data_colors: {},\n        data_hide: false,\n        data_filter: undefined,\n        data_selection_enabled: false,\n        data_selection_grouped: false,\n        data_selection_isselectable: function data_selection_isselectable() {\n            return true;\n        },\n        data_selection_multiple: true,\n        data_selection_draggable: false,\n        data_onclick: function data_onclick() {},\n        data_onmouseover: function data_onmouseover() {},\n        data_onmouseout: function data_onmouseout() {},\n        data_onselected: function data_onselected() {},\n        data_onunselected: function data_onunselected() {},\n        data_url: undefined,\n        data_headers: undefined,\n        data_json: undefined,\n        data_rows: undefined,\n        data_columns: undefined,\n        data_mimeType: undefined,\n        data_keys: undefined,\n        // configuration for no plot-able data supplied.\n        data_empty_label_text: \"\",\n        // subchart\n        subchart_show: false,\n        subchart_size_height: 60,\n        subchart_axis_x_show: true,\n        subchart_onbrush: function subchart_onbrush() {},\n        // color\n        color_pattern: [],\n        color_threshold: {},\n        // legend\n        legend_show: true,\n        legend_hide: false,\n        legend_position: 'bottom',\n        legend_inset_anchor: 'top-left',\n        legend_inset_x: 10,\n        legend_inset_y: 0,\n        legend_inset_step: undefined,\n        legend_item_onclick: undefined,\n        legend_item_onmouseover: undefined,\n        legend_item_onmouseout: undefined,\n        legend_equally: false,\n        legend_padding: 0,\n        legend_item_tile_width: 10,\n        legend_item_tile_height: 10,\n        // axis\n        axis_rotated: false,\n        axis_x_show: true,\n        axis_x_type: 'indexed',\n        axis_x_localtime: true,\n        axis_x_categories: [],\n        axis_x_tick_centered: false,\n        axis_x_tick_format: undefined,\n        axis_x_tick_culling: {},\n        axis_x_tick_culling_max: 10,\n        axis_x_tick_count: undefined,\n        axis_x_tick_fit: true,\n        axis_x_tick_values: null,\n        axis_x_tick_rotate: 0,\n        axis_x_tick_outer: true,\n        axis_x_tick_multiline: true,\n        axis_x_tick_width: null,\n        axis_x_max: undefined,\n        axis_x_min: undefined,\n        axis_x_padding: {},\n        axis_x_height: undefined,\n        axis_x_extent: undefined,\n        axis_x_label: {},\n        axis_y_show: true,\n        axis_y_type: undefined,\n        axis_y_max: undefined,\n        axis_y_min: undefined,\n        axis_y_inverted: false,\n        axis_y_center: undefined,\n        axis_y_inner: undefined,\n        axis_y_label: {},\n        axis_y_tick_format: undefined,\n        axis_y_tick_outer: true,\n        axis_y_tick_values: null,\n        axis_y_tick_rotate: 0,\n        axis_y_tick_count: undefined,\n        axis_y_tick_time_value: undefined,\n        axis_y_tick_time_interval: undefined,\n        axis_y_padding: {},\n        axis_y_default: undefined,\n        axis_y2_show: false,\n        axis_y2_max: undefined,\n        axis_y2_min: undefined,\n        axis_y2_inverted: false,\n        axis_y2_center: undefined,\n        axis_y2_inner: undefined,\n        axis_y2_label: {},\n        axis_y2_tick_format: undefined,\n        axis_y2_tick_outer: true,\n        axis_y2_tick_values: null,\n        axis_y2_tick_count: undefined,\n        axis_y2_padding: {},\n        axis_y2_default: undefined,\n        // grid\n        grid_x_show: false,\n        grid_x_type: 'tick',\n        grid_x_lines: [],\n        grid_y_show: false,\n        // not used\n        // grid_y_type: 'tick',\n        grid_y_lines: [],\n        grid_y_ticks: 10,\n        grid_focus_show: true,\n        grid_lines_front: true,\n        // point - point of each data\n        point_show: true,\n        point_r: 2.5,\n        point_sensitivity: 10,\n        point_focus_expand_enabled: true,\n        point_focus_expand_r: undefined,\n        point_select_r: undefined,\n        // line\n        line_connectNull: false,\n        line_step_type: 'step',\n        // bar\n        bar_width: undefined,\n        bar_width_ratio: 0.6,\n        bar_width_max: undefined,\n        bar_zerobased: true,\n        bar_space: 0,\n        // area\n        area_zerobased: true,\n        area_above: false,\n        // pie\n        pie_label_show: true,\n        pie_label_format: undefined,\n        pie_label_threshold: 0.05,\n        pie_label_ratio: undefined,\n        pie_expand: {},\n        pie_expand_duration: 50,\n        // gauge\n        gauge_fullCircle: false,\n        gauge_label_show: true,\n        gauge_label_format: undefined,\n        gauge_min: 0,\n        gauge_max: 100,\n        gauge_startingAngle: -1 * Math.PI / 2,\n        gauge_label_extents: undefined,\n        gauge_units: undefined,\n        gauge_width: undefined,\n        gauge_expand: {},\n        gauge_expand_duration: 50,\n        // donut\n        donut_label_show: true,\n        donut_label_format: undefined,\n        donut_label_threshold: 0.05,\n        donut_label_ratio: undefined,\n        donut_width: undefined,\n        donut_title: \"\",\n        donut_expand: {},\n        donut_expand_duration: 50,\n        // spline\n        spline_interpolation_type: 'cardinal',\n        // region - region to change style\n        regions: [],\n        // tooltip - show when mouseover on each data\n        tooltip_show: true,\n        tooltip_grouped: true,\n        tooltip_order: undefined,\n        tooltip_format_title: undefined,\n        tooltip_format_name: undefined,\n        tooltip_format_value: undefined,\n        tooltip_position: undefined,\n        tooltip_contents: function tooltip_contents(d, defaultTitleFormat, defaultValueFormat, color) {\n            return this.getTooltipContent ? this.getTooltipContent(d, defaultTitleFormat, defaultValueFormat, color) : '';\n        },\n        tooltip_init_show: false,\n        tooltip_init_x: 0,\n        tooltip_init_position: { top: '0px', left: '50px' },\n        tooltip_onshow: function tooltip_onshow() {},\n        tooltip_onhide: function tooltip_onhide() {},\n        // title\n        title_text: undefined,\n        title_padding: {\n            top: 0,\n            right: 0,\n            bottom: 0,\n            left: 0\n        },\n        title_position: 'top-center'\n    };\n\n    Object.keys(this.additionalConfig).forEach(function (key) {\n        config[key] = this.additionalConfig[key];\n    }, this);\n\n    return config;\n};\nc3_chart_internal_fn.additionalConfig = {};\n\nc3_chart_internal_fn.loadConfig = function (config) {\n    var this_config = this.config,\n        target,\n        keys,\n        read;\n    function find() {\n        var key = keys.shift();\n        //        console.log(\"key =>\", key, \", target =>\", target);\n        if (key && target && (typeof target === 'undefined' ? 'undefined' : _typeof(target)) === 'object' && key in target) {\n            target = target[key];\n            return find();\n        } else if (!key) {\n            return target;\n        } else {\n            return undefined;\n        }\n    }\n    Object.keys(this_config).forEach(function (key) {\n        target = config;\n        keys = key.split('_');\n        read = find();\n        //        console.log(\"CONFIG : \", key, read);\n        if (isDefined(read)) {\n            this_config[key] = read;\n        }\n    });\n};\n\nc3_chart_internal_fn.convertUrlToData = function (url, mimeType, headers, keys, done) {\n    var $$ = this,\n        type = mimeType ? mimeType : 'csv';\n    var req = $$.d3.xhr(url);\n    if (headers) {\n        Object.keys(headers).forEach(function (header) {\n            req.header(header, headers[header]);\n        });\n    }\n    req.get(function (error, data) {\n        var d;\n        var dataResponse = data.response || data.responseText; // Fixes IE9 XHR issue; see #1345\n        if (!data) {\n            throw new Error(error.responseURL + ' ' + error.status + ' (' + error.statusText + ')');\n        }\n        if (type === 'json') {\n            d = $$.convertJsonToData(JSON.parse(dataResponse), keys);\n        } else if (type === 'tsv') {\n            d = $$.convertTsvToData(dataResponse);\n        } else {\n            d = $$.convertCsvToData(dataResponse);\n        }\n        done.call($$, d);\n    });\n};\nc3_chart_internal_fn.convertXsvToData = function (xsv, parser) {\n    var rows = parser.parseRows(xsv),\n        d;\n    if (rows.length === 1) {\n        d = [{}];\n        rows[0].forEach(function (id) {\n            d[0][id] = null;\n        });\n    } else {\n        d = parser.parse(xsv);\n    }\n    return d;\n};\nc3_chart_internal_fn.convertCsvToData = function (csv) {\n    return this.convertXsvToData(csv, this.d3.csv);\n};\nc3_chart_internal_fn.convertTsvToData = function (tsv) {\n    return this.convertXsvToData(tsv, this.d3.tsv);\n};\nc3_chart_internal_fn.convertJsonToData = function (json, keys) {\n    var $$ = this,\n        new_rows = [],\n        targetKeys,\n        data;\n    if (keys) {\n        // when keys specified, json would be an array that includes objects\n        if (keys.x) {\n            targetKeys = keys.value.concat(keys.x);\n            $$.config.data_x = keys.x;\n        } else {\n            targetKeys = keys.value;\n        }\n        new_rows.push(targetKeys);\n        json.forEach(function (o) {\n            var new_row = [];\n            targetKeys.forEach(function (key) {\n                // convert undefined to null because undefined data will be removed in convertDataToTargets()\n                var v = $$.findValueInJson(o, key);\n                if (isUndefined(v)) {\n                    v = null;\n                }\n                new_row.push(v);\n            });\n            new_rows.push(new_row);\n        });\n        data = $$.convertRowsToData(new_rows);\n    } else {\n        Object.keys(json).forEach(function (key) {\n            new_rows.push([key].concat(json[key]));\n        });\n        data = $$.convertColumnsToData(new_rows);\n    }\n    return data;\n};\nc3_chart_internal_fn.findValueInJson = function (object, path) {\n    path = path.replace(/\\[(\\w+)\\]/g, '.$1'); // convert indexes to properties (replace [] with .)\n    path = path.replace(/^\\./, ''); // strip a leading dot\n    var pathArray = path.split('.');\n    for (var i = 0; i < pathArray.length; ++i) {\n        var k = pathArray[i];\n        if (k in object) {\n            object = object[k];\n        } else {\n            return;\n        }\n    }\n    return object;\n};\n\n/**\n * Converts the rows to normalized data.\n * @param {any[][]} rows The row data\n * @return {Object[]}\n */\nc3_chart_internal_fn.convertRowsToData = function (rows) {\n    var newRows = [];\n    var keys = rows[0];\n\n    for (var i = 1; i < rows.length; i++) {\n        var newRow = {};\n        for (var j = 0; j < rows[i].length; j++) {\n            if (isUndefined(rows[i][j])) {\n                throw new Error(\"Source data is missing a component at (\" + i + \",\" + j + \")!\");\n            }\n            newRow[keys[j]] = rows[i][j];\n        }\n        newRows.push(newRow);\n    }\n    return newRows;\n};\n\n/**\n * Converts the columns to normalized data.\n * @param {any[][]} columns The column data\n * @return {Object[]}\n */\nc3_chart_internal_fn.convertColumnsToData = function (columns) {\n    var newRows = [];\n\n    for (var i = 0; i < columns.length; i++) {\n        var key = columns[i][0];\n        for (var j = 1; j < columns[i].length; j++) {\n            if (isUndefined(newRows[j - 1])) {\n                newRows[j - 1] = {};\n            }\n            if (isUndefined(columns[i][j])) {\n                throw new Error(\"Source data is missing a component at (\" + i + \",\" + j + \")!\");\n            }\n            newRows[j - 1][key] = columns[i][j];\n        }\n    }\n\n    return newRows;\n};\n\nc3_chart_internal_fn.convertDataToTargets = function (data, appendXs) {\n    var $$ = this,\n        config = $$.config,\n        ids = $$.d3.keys(data[0]).filter($$.isNotX, $$),\n        xs = $$.d3.keys(data[0]).filter($$.isX, $$),\n        targets;\n\n    // save x for update data by load when custom x and c3.x API\n    ids.forEach(function (id) {\n        var xKey = $$.getXKey(id);\n\n        if ($$.isCustomX() || $$.isTimeSeries()) {\n            // if included in input data\n            if (xs.indexOf(xKey) >= 0) {\n                $$.data.xs[id] = (appendXs && $$.data.xs[id] ? $$.data.xs[id] : []).concat(data.map(function (d) {\n                    return d[xKey];\n                }).filter(isValue).map(function (rawX, i) {\n                    return $$.generateTargetX(rawX, id, i);\n                }));\n            }\n            // if not included in input data, find from preloaded data of other id's x\n            else if (config.data_x) {\n                    $$.data.xs[id] = $$.getOtherTargetXs();\n                }\n                // if not included in input data, find from preloaded data\n                else if (notEmpty(config.data_xs)) {\n                        $$.data.xs[id] = $$.getXValuesOfXKey(xKey, $$.data.targets);\n                    }\n            // MEMO: if no x included, use same x of current will be used\n        } else {\n            $$.data.xs[id] = data.map(function (d, i) {\n                return i;\n            });\n        }\n    });\n\n    // check x is defined\n    ids.forEach(function (id) {\n        if (!$$.data.xs[id]) {\n            throw new Error('x is not defined for id = \"' + id + '\".');\n        }\n    });\n\n    // convert to target\n    targets = ids.map(function (id, index) {\n        var convertedId = config.data_idConverter(id);\n        return {\n            id: convertedId,\n            id_org: id,\n            values: data.map(function (d, i) {\n                var xKey = $$.getXKey(id),\n                    rawX = d[xKey],\n                    value = d[id] !== null && !isNaN(d[id]) ? +d[id] : null,\n                    x;\n                // use x as categories if custom x and categorized\n                if ($$.isCustomX() && $$.isCategorized() && !isUndefined(rawX)) {\n                    if (index === 0 && i === 0) {\n                        config.axis_x_categories = [];\n                    }\n                    x = config.axis_x_categories.indexOf(rawX);\n                    if (x === -1) {\n                        x = config.axis_x_categories.length;\n                        config.axis_x_categories.push(rawX);\n                    }\n                } else {\n                    x = $$.generateTargetX(rawX, id, i);\n                }\n                // mark as x = undefined if value is undefined and filter to remove after mapped\n                if (isUndefined(d[id]) || $$.data.xs[id].length <= i) {\n                    x = undefined;\n                }\n                return { x: x, value: value, id: convertedId };\n            }).filter(function (v) {\n                return isDefined(v.x);\n            })\n        };\n    });\n\n    // finish targets\n    targets.forEach(function (t) {\n        var i;\n        // sort values by its x\n        if (config.data_xSort) {\n            t.values = t.values.sort(function (v1, v2) {\n                var x1 = v1.x || v1.x === 0 ? v1.x : Infinity,\n                    x2 = v2.x || v2.x === 0 ? v2.x : Infinity;\n                return x1 - x2;\n            });\n        }\n        // indexing each value\n        i = 0;\n        t.values.forEach(function (v) {\n            v.index = i++;\n        });\n        // this needs to be sorted because its index and value.index is identical\n        $$.data.xs[t.id].sort(function (v1, v2) {\n            return v1 - v2;\n        });\n    });\n\n    // cache information about values\n    $$.hasNegativeValue = $$.hasNegativeValueInTargets(targets);\n    $$.hasPositiveValue = $$.hasPositiveValueInTargets(targets);\n\n    // set target types\n    if (config.data_type) {\n        $$.setTargetType($$.mapToIds(targets).filter(function (id) {\n            return !(id in config.data_types);\n        }), config.data_type);\n    }\n\n    // cache as original id keyed\n    targets.forEach(function (d) {\n        $$.addCache(d.id_org, d);\n    });\n\n    return targets;\n};\n\nc3_chart_internal_fn.isX = function (key) {\n    var $$ = this,\n        config = $$.config;\n    return config.data_x && key === config.data_x || notEmpty(config.data_xs) && hasValue(config.data_xs, key);\n};\nc3_chart_internal_fn.isNotX = function (key) {\n    return !this.isX(key);\n};\nc3_chart_internal_fn.getXKey = function (id) {\n    var $$ = this,\n        config = $$.config;\n    return config.data_x ? config.data_x : notEmpty(config.data_xs) ? config.data_xs[id] : null;\n};\nc3_chart_internal_fn.getXValuesOfXKey = function (key, targets) {\n    var $$ = this,\n        xValues,\n        ids = targets && notEmpty(targets) ? $$.mapToIds(targets) : [];\n    ids.forEach(function (id) {\n        if ($$.getXKey(id) === key) {\n            xValues = $$.data.xs[id];\n        }\n    });\n    return xValues;\n};\nc3_chart_internal_fn.getIndexByX = function (x) {\n    var $$ = this,\n        data = $$.filterByX($$.data.targets, x);\n    return data.length ? data[0].index : null;\n};\nc3_chart_internal_fn.getXValue = function (id, i) {\n    var $$ = this;\n    return id in $$.data.xs && $$.data.xs[id] && isValue($$.data.xs[id][i]) ? $$.data.xs[id][i] : i;\n};\nc3_chart_internal_fn.getOtherTargetXs = function () {\n    var $$ = this,\n        idsForX = Object.keys($$.data.xs);\n    return idsForX.length ? $$.data.xs[idsForX[0]] : null;\n};\nc3_chart_internal_fn.getOtherTargetX = function (index) {\n    var xs = this.getOtherTargetXs();\n    return xs && index < xs.length ? xs[index] : null;\n};\nc3_chart_internal_fn.addXs = function (xs) {\n    var $$ = this;\n    Object.keys(xs).forEach(function (id) {\n        $$.config.data_xs[id] = xs[id];\n    });\n};\nc3_chart_internal_fn.hasMultipleX = function (xs) {\n    return this.d3.set(Object.keys(xs).map(function (id) {\n        return xs[id];\n    })).size() > 1;\n};\nc3_chart_internal_fn.isMultipleX = function () {\n    return notEmpty(this.config.data_xs) || !this.config.data_xSort || this.hasType('scatter');\n};\nc3_chart_internal_fn.addName = function (data) {\n    var $$ = this,\n        name;\n    if (data) {\n        name = $$.config.data_names[data.id];\n        data.name = name !== undefined ? name : data.id;\n    }\n    return data;\n};\nc3_chart_internal_fn.getValueOnIndex = function (values, index) {\n    var valueOnIndex = values.filter(function (v) {\n        return v.index === index;\n    });\n    return valueOnIndex.length ? valueOnIndex[0] : null;\n};\nc3_chart_internal_fn.updateTargetX = function (targets, x) {\n    var $$ = this;\n    targets.forEach(function (t) {\n        t.values.forEach(function (v, i) {\n            v.x = $$.generateTargetX(x[i], t.id, i);\n        });\n        $$.data.xs[t.id] = x;\n    });\n};\nc3_chart_internal_fn.updateTargetXs = function (targets, xs) {\n    var $$ = this;\n    targets.forEach(function (t) {\n        if (xs[t.id]) {\n            $$.updateTargetX([t], xs[t.id]);\n        }\n    });\n};\nc3_chart_internal_fn.generateTargetX = function (rawX, id, index) {\n    var $$ = this,\n        x;\n    if ($$.isTimeSeries()) {\n        x = rawX ? $$.parseDate(rawX) : $$.parseDate($$.getXValue(id, index));\n    } else if ($$.isCustomX() && !$$.isCategorized()) {\n        x = isValue(rawX) ? +rawX : $$.getXValue(id, index);\n    } else {\n        x = index;\n    }\n    return x;\n};\nc3_chart_internal_fn.cloneTarget = function (target) {\n    return {\n        id: target.id,\n        id_org: target.id_org,\n        values: target.values.map(function (d) {\n            return { x: d.x, value: d.value, id: d.id };\n        })\n    };\n};\nc3_chart_internal_fn.updateXs = function () {\n    var $$ = this;\n    if ($$.data.targets.length) {\n        $$.xs = [];\n        $$.data.targets[0].values.forEach(function (v) {\n            $$.xs[v.index] = v.x;\n        });\n    }\n};\nc3_chart_internal_fn.getPrevX = function (i) {\n    var x = this.xs[i - 1];\n    return typeof x !== 'undefined' ? x : null;\n};\nc3_chart_internal_fn.getNextX = function (i) {\n    var x = this.xs[i + 1];\n    return typeof x !== 'undefined' ? x : null;\n};\nc3_chart_internal_fn.getMaxDataCount = function () {\n    var $$ = this;\n    return $$.d3.max($$.data.targets, function (t) {\n        return t.values.length;\n    });\n};\nc3_chart_internal_fn.getMaxDataCountTarget = function (targets) {\n    var length = targets.length,\n        max = 0,\n        maxTarget;\n    if (length > 1) {\n        targets.forEach(function (t) {\n            if (t.values.length > max) {\n                maxTarget = t;\n                max = t.values.length;\n            }\n        });\n    } else {\n        maxTarget = length ? targets[0] : null;\n    }\n    return maxTarget;\n};\nc3_chart_internal_fn.getEdgeX = function (targets) {\n    var $$ = this;\n    return !targets.length ? [0, 0] : [$$.d3.min(targets, function (t) {\n        return t.values[0].x;\n    }), $$.d3.max(targets, function (t) {\n        return t.values[t.values.length - 1].x;\n    })];\n};\nc3_chart_internal_fn.mapToIds = function (targets) {\n    return targets.map(function (d) {\n        return d.id;\n    });\n};\nc3_chart_internal_fn.mapToTargetIds = function (ids) {\n    var $$ = this;\n    return ids ? [].concat(ids) : $$.mapToIds($$.data.targets);\n};\nc3_chart_internal_fn.hasTarget = function (targets, id) {\n    var ids = this.mapToIds(targets),\n        i;\n    for (i = 0; i < ids.length; i++) {\n        if (ids[i] === id) {\n            return true;\n        }\n    }\n    return false;\n};\nc3_chart_internal_fn.isTargetToShow = function (targetId) {\n    return this.hiddenTargetIds.indexOf(targetId) < 0;\n};\nc3_chart_internal_fn.isLegendToShow = function (targetId) {\n    return this.hiddenLegendIds.indexOf(targetId) < 0;\n};\nc3_chart_internal_fn.filterTargetsToShow = function (targets) {\n    var $$ = this;\n    return targets.filter(function (t) {\n        return $$.isTargetToShow(t.id);\n    });\n};\nc3_chart_internal_fn.mapTargetsToUniqueXs = function (targets) {\n    var $$ = this;\n    var xs = $$.d3.set($$.d3.merge(targets.map(function (t) {\n        return t.values.map(function (v) {\n            return +v.x;\n        });\n    }))).values();\n    xs = $$.isTimeSeries() ? xs.map(function (x) {\n        return new Date(+x);\n    }) : xs.map(function (x) {\n        return +x;\n    });\n    return xs.sort(function (a, b) {\n        return a < b ? -1 : a > b ? 1 : a >= b ? 0 : NaN;\n    });\n};\nc3_chart_internal_fn.addHiddenTargetIds = function (targetIds) {\n    targetIds = targetIds instanceof Array ? targetIds : new Array(targetIds);\n    for (var i = 0; i < targetIds.length; i++) {\n        if (this.hiddenTargetIds.indexOf(targetIds[i]) < 0) {\n            this.hiddenTargetIds = this.hiddenTargetIds.concat(targetIds[i]);\n        }\n    }\n};\nc3_chart_internal_fn.removeHiddenTargetIds = function (targetIds) {\n    this.hiddenTargetIds = this.hiddenTargetIds.filter(function (id) {\n        return targetIds.indexOf(id) < 0;\n    });\n};\nc3_chart_internal_fn.addHiddenLegendIds = function (targetIds) {\n    targetIds = targetIds instanceof Array ? targetIds : new Array(targetIds);\n    for (var i = 0; i < targetIds.length; i++) {\n        if (this.hiddenLegendIds.indexOf(targetIds[i]) < 0) {\n            this.hiddenLegendIds = this.hiddenLegendIds.concat(targetIds[i]);\n        }\n    }\n};\nc3_chart_internal_fn.removeHiddenLegendIds = function (targetIds) {\n    this.hiddenLegendIds = this.hiddenLegendIds.filter(function (id) {\n        return targetIds.indexOf(id) < 0;\n    });\n};\nc3_chart_internal_fn.getValuesAsIdKeyed = function (targets) {\n    var ys = {};\n    targets.forEach(function (t) {\n        ys[t.id] = [];\n        t.values.forEach(function (v) {\n            ys[t.id].push(v.value);\n        });\n    });\n    return ys;\n};\nc3_chart_internal_fn.checkValueInTargets = function (targets, checker) {\n    var ids = Object.keys(targets),\n        i,\n        j,\n        values;\n    for (i = 0; i < ids.length; i++) {\n        values = targets[ids[i]].values;\n        for (j = 0; j < values.length; j++) {\n            if (checker(values[j].value)) {\n                return true;\n            }\n        }\n    }\n    return false;\n};\nc3_chart_internal_fn.hasNegativeValueInTargets = function (targets) {\n    return this.checkValueInTargets(targets, function (v) {\n        return v < 0;\n    });\n};\nc3_chart_internal_fn.hasPositiveValueInTargets = function (targets) {\n    return this.checkValueInTargets(targets, function (v) {\n        return v > 0;\n    });\n};\nc3_chart_internal_fn.isOrderDesc = function () {\n    var config = this.config;\n    return typeof config.data_order === 'string' && config.data_order.toLowerCase() === 'desc';\n};\nc3_chart_internal_fn.isOrderAsc = function () {\n    var config = this.config;\n    return typeof config.data_order === 'string' && config.data_order.toLowerCase() === 'asc';\n};\nc3_chart_internal_fn.getOrderFunction = function () {\n    var $$ = this,\n        config = $$.config,\n        orderAsc = $$.isOrderAsc(),\n        orderDesc = $$.isOrderDesc();\n    if (orderAsc || orderDesc) {\n        return function (t1, t2) {\n            var reducer = function reducer(p, c) {\n                return p + Math.abs(c.value);\n            };\n            var t1Sum = t1.values.reduce(reducer, 0),\n                t2Sum = t2.values.reduce(reducer, 0);\n            return orderDesc ? t2Sum - t1Sum : t1Sum - t2Sum;\n        };\n    } else if (isFunction(config.data_order)) {\n        return config.data_order;\n    } else if (isArray(config.data_order)) {\n        var order = config.data_order;\n        return function (t1, t2) {\n            return order.indexOf(t1.id) - order.indexOf(t2.id);\n        };\n    }\n};\nc3_chart_internal_fn.orderTargets = function (targets) {\n    var fct = this.getOrderFunction();\n    if (fct) {\n        targets.sort(fct);\n        if (this.isOrderAsc() || this.isOrderDesc()) {\n            targets.reverse();\n        }\n    }\n    return targets;\n};\nc3_chart_internal_fn.filterByX = function (targets, x) {\n    return this.d3.merge(targets.map(function (t) {\n        return t.values;\n    })).filter(function (v) {\n        return v.x - x === 0;\n    });\n};\nc3_chart_internal_fn.filterRemoveNull = function (data) {\n    return data.filter(function (d) {\n        return isValue(d.value);\n    });\n};\nc3_chart_internal_fn.filterByXDomain = function (targets, xDomain) {\n    return targets.map(function (t) {\n        return {\n            id: t.id,\n            id_org: t.id_org,\n            values: t.values.filter(function (v) {\n                return xDomain[0] <= v.x && v.x <= xDomain[1];\n            })\n        };\n    });\n};\nc3_chart_internal_fn.hasDataLabel = function () {\n    var config = this.config;\n    if (typeof config.data_labels === 'boolean' && config.data_labels) {\n        return true;\n    } else if (_typeof(config.data_labels) === 'object' && notEmpty(config.data_labels)) {\n        return true;\n    }\n    return false;\n};\nc3_chart_internal_fn.getDataLabelLength = function (min, max, key) {\n    var $$ = this,\n        lengths = [0, 0],\n        paddingCoef = 1.3;\n    $$.selectChart.select('svg').selectAll('.dummy').data([min, max]).enter().append('text').text(function (d) {\n        return $$.dataLabelFormat(d.id)(d);\n    }).each(function (d, i) {\n        lengths[i] = this.getBoundingClientRect()[key] * paddingCoef;\n    }).remove();\n    return lengths;\n};\nc3_chart_internal_fn.isNoneArc = function (d) {\n    return this.hasTarget(this.data.targets, d.id);\n}, c3_chart_internal_fn.isArc = function (d) {\n    return 'data' in d && this.hasTarget(this.data.targets, d.data.id);\n};\nc3_chart_internal_fn.findSameXOfValues = function (values, index) {\n    var i,\n        targetX = values[index].x,\n        sames = [];\n    for (i = index - 1; i >= 0; i--) {\n        if (targetX !== values[i].x) {\n            break;\n        }\n        sames.push(values[i]);\n    }\n    for (i = index; i < values.length; i++) {\n        if (targetX !== values[i].x) {\n            break;\n        }\n        sames.push(values[i]);\n    }\n    return sames;\n};\n\nc3_chart_internal_fn.findClosestFromTargets = function (targets, pos) {\n    var $$ = this,\n        candidates;\n\n    // map to array of closest points of each target\n    candidates = targets.map(function (target) {\n        return $$.findClosest(target.values, pos);\n    });\n\n    // decide closest point and return\n    return $$.findClosest(candidates, pos);\n};\nc3_chart_internal_fn.findClosest = function (values, pos) {\n    var $$ = this,\n        minDist = $$.config.point_sensitivity,\n        closest;\n\n    // find mouseovering bar\n    values.filter(function (v) {\n        return v && $$.isBarType(v.id);\n    }).forEach(function (v) {\n        var shape = $$.main.select('.' + CLASS.bars + $$.getTargetSelectorSuffix(v.id) + ' .' + CLASS.bar + '-' + v.index).node();\n        if (!closest && $$.isWithinBar(shape)) {\n            closest = v;\n        }\n    });\n\n    // find closest point from non-bar\n    values.filter(function (v) {\n        return v && !$$.isBarType(v.id);\n    }).forEach(function (v) {\n        var d = $$.dist(v, pos);\n        if (d < minDist) {\n            minDist = d;\n            closest = v;\n        }\n    });\n\n    return closest;\n};\nc3_chart_internal_fn.dist = function (data, pos) {\n    var $$ = this,\n        config = $$.config,\n        xIndex = config.axis_rotated ? 1 : 0,\n        yIndex = config.axis_rotated ? 0 : 1,\n        y = $$.circleY(data, data.index),\n        x = $$.x(data.x);\n    return Math.sqrt(Math.pow(x - pos[xIndex], 2) + Math.pow(y - pos[yIndex], 2));\n};\nc3_chart_internal_fn.convertValuesToStep = function (values) {\n    var converted = [].concat(values),\n        i;\n\n    if (!this.isCategorized()) {\n        return values;\n    }\n\n    for (i = values.length + 1; 0 < i; i--) {\n        converted[i] = converted[i - 1];\n    }\n\n    converted[0] = {\n        x: converted[0].x - 1,\n        value: converted[0].value,\n        id: converted[0].id\n    };\n    converted[values.length + 1] = {\n        x: converted[values.length].x + 1,\n        value: converted[values.length].value,\n        id: converted[values.length].id\n    };\n\n    return converted;\n};\nc3_chart_internal_fn.updateDataAttributes = function (name, attrs) {\n    var $$ = this,\n        config = $$.config,\n        current = config['data_' + name];\n    if (typeof attrs === 'undefined') {\n        return current;\n    }\n    Object.keys(attrs).forEach(function (id) {\n        current[id] = attrs[id];\n    });\n    $$.redraw({ withLegend: true });\n    return current;\n};\n\nc3_chart_internal_fn.load = function (targets, args) {\n    var $$ = this;\n    if (targets) {\n        // filter loading targets if needed\n        if (args.filter) {\n            targets = targets.filter(args.filter);\n        }\n        // set type if args.types || args.type specified\n        if (args.type || args.types) {\n            targets.forEach(function (t) {\n                var type = args.types && args.types[t.id] ? args.types[t.id] : args.type;\n                $$.setTargetType(t.id, type);\n            });\n        }\n        // Update/Add data\n        $$.data.targets.forEach(function (d) {\n            for (var i = 0; i < targets.length; i++) {\n                if (d.id === targets[i].id) {\n                    d.values = targets[i].values;\n                    targets.splice(i, 1);\n                    break;\n                }\n            }\n        });\n        $$.data.targets = $$.data.targets.concat(targets); // add remained\n    }\n\n    // Set targets\n    $$.updateTargets($$.data.targets);\n\n    // Redraw with new targets\n    $$.redraw({ withUpdateOrgXDomain: true, withUpdateXDomain: true, withLegend: true });\n\n    if (args.done) {\n        args.done();\n    }\n};\nc3_chart_internal_fn.loadFromArgs = function (args) {\n    var $$ = this;\n    if (args.data) {\n        $$.load($$.convertDataToTargets(args.data), args);\n    } else if (args.url) {\n        $$.convertUrlToData(args.url, args.mimeType, args.headers, args.keys, function (data) {\n            $$.load($$.convertDataToTargets(data), args);\n        });\n    } else if (args.json) {\n        $$.load($$.convertDataToTargets($$.convertJsonToData(args.json, args.keys)), args);\n    } else if (args.rows) {\n        $$.load($$.convertDataToTargets($$.convertRowsToData(args.rows)), args);\n    } else if (args.columns) {\n        $$.load($$.convertDataToTargets($$.convertColumnsToData(args.columns)), args);\n    } else {\n        $$.load(null, args);\n    }\n};\nc3_chart_internal_fn.unload = function (targetIds, done) {\n    var $$ = this;\n    if (!done) {\n        done = function done() {};\n    }\n    // filter existing target\n    targetIds = targetIds.filter(function (id) {\n        return $$.hasTarget($$.data.targets, id);\n    });\n    // If no target, call done and return\n    if (!targetIds || targetIds.length === 0) {\n        done();\n        return;\n    }\n    $$.svg.selectAll(targetIds.map(function (id) {\n        return $$.selectorTarget(id);\n    })).transition().style('opacity', 0).remove().call($$.endall, done);\n    targetIds.forEach(function (id) {\n        // Reset fadein for future load\n        $$.withoutFadeIn[id] = false;\n        // Remove target's elements\n        if ($$.legend) {\n            $$.legend.selectAll('.' + CLASS.legendItem + $$.getTargetSelectorSuffix(id)).remove();\n        }\n        // Remove target\n        $$.data.targets = $$.data.targets.filter(function (t) {\n            return t.id !== id;\n        });\n    });\n};\n\nc3_chart_internal_fn.getYDomainMin = function (targets) {\n    var $$ = this,\n        config = $$.config,\n        ids = $$.mapToIds(targets),\n        ys = $$.getValuesAsIdKeyed(targets),\n        j,\n        k,\n        baseId,\n        idsInGroup,\n        id,\n        hasNegativeValue;\n    if (config.data_groups.length > 0) {\n        hasNegativeValue = $$.hasNegativeValueInTargets(targets);\n        for (j = 0; j < config.data_groups.length; j++) {\n            // Determine baseId\n            idsInGroup = config.data_groups[j].filter(function (id) {\n                return ids.indexOf(id) >= 0;\n            });\n            if (idsInGroup.length === 0) {\n                continue;\n            }\n            baseId = idsInGroup[0];\n            // Consider negative values\n            if (hasNegativeValue && ys[baseId]) {\n                ys[baseId].forEach(function (v, i) {\n                    ys[baseId][i] = v < 0 ? v : 0;\n                });\n            }\n            // Compute min\n            for (k = 1; k < idsInGroup.length; k++) {\n                id = idsInGroup[k];\n                if (!ys[id]) {\n                    continue;\n                }\n                ys[id].forEach(function (v, i) {\n                    if ($$.axis.getId(id) === $$.axis.getId(baseId) && ys[baseId] && !(hasNegativeValue && +v > 0)) {\n                        ys[baseId][i] += +v;\n                    }\n                });\n            }\n        }\n    }\n    return $$.d3.min(Object.keys(ys).map(function (key) {\n        return $$.d3.min(ys[key]);\n    }));\n};\nc3_chart_internal_fn.getYDomainMax = function (targets) {\n    var $$ = this,\n        config = $$.config,\n        ids = $$.mapToIds(targets),\n        ys = $$.getValuesAsIdKeyed(targets),\n        j,\n        k,\n        baseId,\n        idsInGroup,\n        id,\n        hasPositiveValue;\n    if (config.data_groups.length > 0) {\n        hasPositiveValue = $$.hasPositiveValueInTargets(targets);\n        for (j = 0; j < config.data_groups.length; j++) {\n            // Determine baseId\n            idsInGroup = config.data_groups[j].filter(function (id) {\n                return ids.indexOf(id) >= 0;\n            });\n            if (idsInGroup.length === 0) {\n                continue;\n            }\n            baseId = idsInGroup[0];\n            // Consider positive values\n            if (hasPositiveValue && ys[baseId]) {\n                ys[baseId].forEach(function (v, i) {\n                    ys[baseId][i] = v > 0 ? v : 0;\n                });\n            }\n            // Compute max\n            for (k = 1; k < idsInGroup.length; k++) {\n                id = idsInGroup[k];\n                if (!ys[id]) {\n                    continue;\n                }\n                ys[id].forEach(function (v, i) {\n                    if ($$.axis.getId(id) === $$.axis.getId(baseId) && ys[baseId] && !(hasPositiveValue && +v < 0)) {\n                        ys[baseId][i] += +v;\n                    }\n                });\n            }\n        }\n    }\n    return $$.d3.max(Object.keys(ys).map(function (key) {\n        return $$.d3.max(ys[key]);\n    }));\n};\nc3_chart_internal_fn.getYDomain = function (targets, axisId, xDomain) {\n    var $$ = this,\n        config = $$.config,\n        targetsByAxisId = targets.filter(function (t) {\n        return $$.axis.getId(t.id) === axisId;\n    }),\n        yTargets = xDomain ? $$.filterByXDomain(targetsByAxisId, xDomain) : targetsByAxisId,\n        yMin = axisId === 'y2' ? config.axis_y2_min : config.axis_y_min,\n        yMax = axisId === 'y2' ? config.axis_y2_max : config.axis_y_max,\n        yDomainMin = $$.getYDomainMin(yTargets),\n        yDomainMax = $$.getYDomainMax(yTargets),\n        domain,\n        domainLength,\n        padding,\n        padding_top,\n        padding_bottom,\n        center = axisId === 'y2' ? config.axis_y2_center : config.axis_y_center,\n        yDomainAbs,\n        lengths,\n        diff,\n        ratio,\n        isAllPositive,\n        isAllNegative,\n        isZeroBased = $$.hasType('bar', yTargets) && config.bar_zerobased || $$.hasType('area', yTargets) && config.area_zerobased,\n        isInverted = axisId === 'y2' ? config.axis_y2_inverted : config.axis_y_inverted,\n        showHorizontalDataLabel = $$.hasDataLabel() && config.axis_rotated,\n        showVerticalDataLabel = $$.hasDataLabel() && !config.axis_rotated;\n\n    // MEMO: avoid inverting domain unexpectedly\n    yDomainMin = isValue(yMin) ? yMin : isValue(yMax) ? yDomainMin < yMax ? yDomainMin : yMax - 10 : yDomainMin;\n    yDomainMax = isValue(yMax) ? yMax : isValue(yMin) ? yMin < yDomainMax ? yDomainMax : yMin + 10 : yDomainMax;\n\n    if (yTargets.length === 0) {\n        // use current domain if target of axisId is none\n        return axisId === 'y2' ? $$.y2.domain() : $$.y.domain();\n    }\n    if (isNaN(yDomainMin)) {\n        // set minimum to zero when not number\n        yDomainMin = 0;\n    }\n    if (isNaN(yDomainMax)) {\n        // set maximum to have same value as yDomainMin\n        yDomainMax = yDomainMin;\n    }\n    if (yDomainMin === yDomainMax) {\n        yDomainMin < 0 ? yDomainMax = 0 : yDomainMin = 0;\n    }\n    isAllPositive = yDomainMin >= 0 && yDomainMax >= 0;\n    isAllNegative = yDomainMin <= 0 && yDomainMax <= 0;\n\n    // Cancel zerobased if axis_*_min / axis_*_max specified\n    if (isValue(yMin) && isAllPositive || isValue(yMax) && isAllNegative) {\n        isZeroBased = false;\n    }\n\n    // Bar/Area chart should be 0-based if all positive|negative\n    if (isZeroBased) {\n        if (isAllPositive) {\n            yDomainMin = 0;\n        }\n        if (isAllNegative) {\n            yDomainMax = 0;\n        }\n    }\n\n    domainLength = Math.abs(yDomainMax - yDomainMin);\n    padding = padding_top = padding_bottom = domainLength * 0.1;\n\n    if (typeof center !== 'undefined') {\n        yDomainAbs = Math.max(Math.abs(yDomainMin), Math.abs(yDomainMax));\n        yDomainMax = center + yDomainAbs;\n        yDomainMin = center - yDomainAbs;\n    }\n    // add padding for data label\n    if (showHorizontalDataLabel) {\n        lengths = $$.getDataLabelLength(yDomainMin, yDomainMax, 'width');\n        diff = diffDomain($$.y.range());\n        ratio = [lengths[0] / diff, lengths[1] / diff];\n        padding_top += domainLength * (ratio[1] / (1 - ratio[0] - ratio[1]));\n        padding_bottom += domainLength * (ratio[0] / (1 - ratio[0] - ratio[1]));\n    } else if (showVerticalDataLabel) {\n        lengths = $$.getDataLabelLength(yDomainMin, yDomainMax, 'height');\n        padding_top += $$.axis.convertPixelsToAxisPadding(lengths[1], domainLength);\n        padding_bottom += $$.axis.convertPixelsToAxisPadding(lengths[0], domainLength);\n    }\n    if (axisId === 'y' && notEmpty(config.axis_y_padding)) {\n        padding_top = $$.axis.getPadding(config.axis_y_padding, 'top', padding_top, domainLength);\n        padding_bottom = $$.axis.getPadding(config.axis_y_padding, 'bottom', padding_bottom, domainLength);\n    }\n    if (axisId === 'y2' && notEmpty(config.axis_y2_padding)) {\n        padding_top = $$.axis.getPadding(config.axis_y2_padding, 'top', padding_top, domainLength);\n        padding_bottom = $$.axis.getPadding(config.axis_y2_padding, 'bottom', padding_bottom, domainLength);\n    }\n    // Bar/Area chart should be 0-based if all positive|negative\n    if (isZeroBased) {\n        if (isAllPositive) {\n            padding_bottom = yDomainMin;\n        }\n        if (isAllNegative) {\n            padding_top = -yDomainMax;\n        }\n    }\n    domain = [yDomainMin - padding_bottom, yDomainMax + padding_top];\n    return isInverted ? domain.reverse() : domain;\n};\nc3_chart_internal_fn.getXDomainMin = function (targets) {\n    var $$ = this,\n        config = $$.config;\n    return isDefined(config.axis_x_min) ? $$.isTimeSeries() ? this.parseDate(config.axis_x_min) : config.axis_x_min : $$.d3.min(targets, function (t) {\n        return $$.d3.min(t.values, function (v) {\n            return v.x;\n        });\n    });\n};\nc3_chart_internal_fn.getXDomainMax = function (targets) {\n    var $$ = this,\n        config = $$.config;\n    return isDefined(config.axis_x_max) ? $$.isTimeSeries() ? this.parseDate(config.axis_x_max) : config.axis_x_max : $$.d3.max(targets, function (t) {\n        return $$.d3.max(t.values, function (v) {\n            return v.x;\n        });\n    });\n};\nc3_chart_internal_fn.getXDomainPadding = function (domain) {\n    var $$ = this,\n        config = $$.config,\n        diff = domain[1] - domain[0],\n        maxDataCount,\n        padding,\n        paddingLeft,\n        paddingRight;\n    if ($$.isCategorized()) {\n        padding = 0;\n    } else if ($$.hasType('bar')) {\n        maxDataCount = $$.getMaxDataCount();\n        padding = maxDataCount > 1 ? diff / (maxDataCount - 1) / 2 : 0.5;\n    } else {\n        padding = diff * 0.01;\n    }\n    if (_typeof(config.axis_x_padding) === 'object' && notEmpty(config.axis_x_padding)) {\n        paddingLeft = isValue(config.axis_x_padding.left) ? config.axis_x_padding.left : padding;\n        paddingRight = isValue(config.axis_x_padding.right) ? config.axis_x_padding.right : padding;\n    } else if (typeof config.axis_x_padding === 'number') {\n        paddingLeft = paddingRight = config.axis_x_padding;\n    } else {\n        paddingLeft = paddingRight = padding;\n    }\n    return { left: paddingLeft, right: paddingRight };\n};\nc3_chart_internal_fn.getXDomain = function (targets) {\n    var $$ = this,\n        xDomain = [$$.getXDomainMin(targets), $$.getXDomainMax(targets)],\n        firstX = xDomain[0],\n        lastX = xDomain[1],\n        padding = $$.getXDomainPadding(xDomain),\n        min = 0,\n        max = 0;\n    // show center of x domain if min and max are the same\n    if (firstX - lastX === 0 && !$$.isCategorized()) {\n        if ($$.isTimeSeries()) {\n            firstX = new Date(firstX.getTime() * 0.5);\n            lastX = new Date(lastX.getTime() * 1.5);\n        } else {\n            firstX = firstX === 0 ? 1 : firstX * 0.5;\n            lastX = lastX === 0 ? -1 : lastX * 1.5;\n        }\n    }\n    if (firstX || firstX === 0) {\n        min = $$.isTimeSeries() ? new Date(firstX.getTime() - padding.left) : firstX - padding.left;\n    }\n    if (lastX || lastX === 0) {\n        max = $$.isTimeSeries() ? new Date(lastX.getTime() + padding.right) : lastX + padding.right;\n    }\n    return [min, max];\n};\nc3_chart_internal_fn.updateXDomain = function (targets, withUpdateXDomain, withUpdateOrgXDomain, withTrim, domain) {\n    var $$ = this,\n        config = $$.config;\n\n    if (withUpdateOrgXDomain) {\n        $$.x.domain(domain ? domain : $$.d3.extent($$.getXDomain(targets)));\n        $$.orgXDomain = $$.x.domain();\n        if (config.zoom_enabled) {\n            $$.zoom.scale($$.x).updateScaleExtent();\n        }\n        $$.subX.domain($$.x.domain());\n        if ($$.brush) {\n            $$.brush.scale($$.subX);\n        }\n    }\n    if (withUpdateXDomain) {\n        $$.x.domain(domain ? domain : !$$.brush || $$.brush.empty() ? $$.orgXDomain : $$.brush.extent());\n        if (config.zoom_enabled) {\n            $$.zoom.scale($$.x).updateScaleExtent();\n        }\n    }\n\n    // Trim domain when too big by zoom mousemove event\n    if (withTrim) {\n        $$.x.domain($$.trimXDomain($$.x.orgDomain()));\n    }\n\n    return $$.x.domain();\n};\nc3_chart_internal_fn.trimXDomain = function (domain) {\n    var zoomDomain = this.getZoomDomain(),\n        min = zoomDomain[0],\n        max = zoomDomain[1];\n    if (domain[0] <= min) {\n        domain[1] = +domain[1] + (min - domain[0]);\n        domain[0] = min;\n    }\n    if (max <= domain[1]) {\n        domain[0] = +domain[0] - (domain[1] - max);\n        domain[1] = max;\n    }\n    return domain;\n};\n\nc3_chart_internal_fn.drag = function (mouse) {\n    var $$ = this,\n        config = $$.config,\n        main = $$.main,\n        d3 = $$.d3;\n    var sx, sy, mx, my, minX, maxX, minY, maxY;\n\n    if ($$.hasArcType()) {\n        return;\n    }\n    if (!config.data_selection_enabled) {\n        return;\n    } // do nothing if not selectable\n    if (config.zoom_enabled && !$$.zoom.altDomain) {\n        return;\n    } // skip if zoomable because of conflict drag dehavior\n    if (!config.data_selection_multiple) {\n        return;\n    } // skip when single selection because drag is used for multiple selection\n\n    sx = $$.dragStart[0];\n    sy = $$.dragStart[1];\n    mx = mouse[0];\n    my = mouse[1];\n    minX = Math.min(sx, mx);\n    maxX = Math.max(sx, mx);\n    minY = config.data_selection_grouped ? $$.margin.top : Math.min(sy, my);\n    maxY = config.data_selection_grouped ? $$.height : Math.max(sy, my);\n\n    main.select('.' + CLASS.dragarea).attr('x', minX).attr('y', minY).attr('width', maxX - minX).attr('height', maxY - minY);\n    // TODO: binary search when multiple xs\n    main.selectAll('.' + CLASS.shapes).selectAll('.' + CLASS.shape).filter(function (d) {\n        return config.data_selection_isselectable(d);\n    }).each(function (d, i) {\n        var shape = d3.select(this),\n            isSelected = shape.classed(CLASS.SELECTED),\n            isIncluded = shape.classed(CLASS.INCLUDED),\n            _x,\n            _y,\n            _w,\n            _h,\n            toggle,\n            isWithin = false,\n            box;\n        if (shape.classed(CLASS.circle)) {\n            _x = shape.attr(\"cx\") * 1;\n            _y = shape.attr(\"cy\") * 1;\n            toggle = $$.togglePoint;\n            isWithin = minX < _x && _x < maxX && minY < _y && _y < maxY;\n        } else if (shape.classed(CLASS.bar)) {\n            box = getPathBox(this);\n            _x = box.x;\n            _y = box.y;\n            _w = box.width;\n            _h = box.height;\n            toggle = $$.togglePath;\n            isWithin = !(maxX < _x || _x + _w < minX) && !(maxY < _y || _y + _h < minY);\n        } else {\n            // line/area selection not supported yet\n            return;\n        }\n        if (isWithin ^ isIncluded) {\n            shape.classed(CLASS.INCLUDED, !isIncluded);\n            // TODO: included/unincluded callback here\n            shape.classed(CLASS.SELECTED, !isSelected);\n            toggle.call($$, !isSelected, shape, d, i);\n        }\n    });\n};\n\nc3_chart_internal_fn.dragstart = function (mouse) {\n    var $$ = this,\n        config = $$.config;\n    if ($$.hasArcType()) {\n        return;\n    }\n    if (!config.data_selection_enabled) {\n        return;\n    } // do nothing if not selectable\n    $$.dragStart = mouse;\n    $$.main.select('.' + CLASS.chart).append('rect').attr('class', CLASS.dragarea).style('opacity', 0.1);\n    $$.dragging = true;\n};\n\nc3_chart_internal_fn.dragend = function () {\n    var $$ = this,\n        config = $$.config;\n    if ($$.hasArcType()) {\n        return;\n    }\n    if (!config.data_selection_enabled) {\n        return;\n    } // do nothing if not selectable\n    $$.main.select('.' + CLASS.dragarea).transition().duration(100).style('opacity', 0).remove();\n    $$.main.selectAll('.' + CLASS.shape).classed(CLASS.INCLUDED, false);\n    $$.dragging = false;\n};\n\nc3_chart_internal_fn.getYFormat = function (forArc) {\n    var $$ = this,\n        formatForY = forArc && !$$.hasType('gauge') ? $$.defaultArcValueFormat : $$.yFormat,\n        formatForY2 = forArc && !$$.hasType('gauge') ? $$.defaultArcValueFormat : $$.y2Format;\n    return function (v, ratio, id) {\n        var format = $$.axis.getId(id) === 'y2' ? formatForY2 : formatForY;\n        return format.call($$, v, ratio);\n    };\n};\nc3_chart_internal_fn.yFormat = function (v) {\n    var $$ = this,\n        config = $$.config,\n        format = config.axis_y_tick_format ? config.axis_y_tick_format : $$.defaultValueFormat;\n    return format(v);\n};\nc3_chart_internal_fn.y2Format = function (v) {\n    var $$ = this,\n        config = $$.config,\n        format = config.axis_y2_tick_format ? config.axis_y2_tick_format : $$.defaultValueFormat;\n    return format(v);\n};\nc3_chart_internal_fn.defaultValueFormat = function (v) {\n    return isValue(v) ? +v : \"\";\n};\nc3_chart_internal_fn.defaultArcValueFormat = function (v, ratio) {\n    return (ratio * 100).toFixed(1) + '%';\n};\nc3_chart_internal_fn.dataLabelFormat = function (targetId) {\n    var $$ = this,\n        data_labels = $$.config.data_labels,\n        format,\n        defaultFormat = function defaultFormat(v) {\n        return isValue(v) ? +v : \"\";\n    };\n    // find format according to axis id\n    if (typeof data_labels.format === 'function') {\n        format = data_labels.format;\n    } else if (_typeof(data_labels.format) === 'object') {\n        if (data_labels.format[targetId]) {\n            format = data_labels.format[targetId] === true ? defaultFormat : data_labels.format[targetId];\n        } else {\n            format = function format() {\n                return '';\n            };\n        }\n    } else {\n        format = defaultFormat;\n    }\n    return format;\n};\n\nc3_chart_internal_fn.initGrid = function () {\n    var $$ = this,\n        config = $$.config,\n        d3 = $$.d3;\n    $$.grid = $$.main.append('g').attr(\"clip-path\", $$.clipPathForGrid).attr('class', CLASS.grid);\n    if (config.grid_x_show) {\n        $$.grid.append(\"g\").attr(\"class\", CLASS.xgrids);\n    }\n    if (config.grid_y_show) {\n        $$.grid.append('g').attr('class', CLASS.ygrids);\n    }\n    if (config.grid_focus_show) {\n        $$.grid.append('g').attr(\"class\", CLASS.xgridFocus).append('line').attr('class', CLASS.xgridFocus);\n    }\n    $$.xgrid = d3.selectAll([]);\n    if (!config.grid_lines_front) {\n        $$.initGridLines();\n    }\n};\nc3_chart_internal_fn.initGridLines = function () {\n    var $$ = this,\n        d3 = $$.d3;\n    $$.gridLines = $$.main.append('g').attr(\"clip-path\", $$.clipPathForGrid).attr('class', CLASS.grid + ' ' + CLASS.gridLines);\n    $$.gridLines.append('g').attr(\"class\", CLASS.xgridLines);\n    $$.gridLines.append('g').attr('class', CLASS.ygridLines);\n    $$.xgridLines = d3.selectAll([]);\n};\nc3_chart_internal_fn.updateXGrid = function (withoutUpdate) {\n    var $$ = this,\n        config = $$.config,\n        d3 = $$.d3,\n        xgridData = $$.generateGridData(config.grid_x_type, $$.x),\n        tickOffset = $$.isCategorized() ? $$.xAxis.tickOffset() : 0;\n\n    $$.xgridAttr = config.axis_rotated ? {\n        'x1': 0,\n        'x2': $$.width,\n        'y1': function y1(d) {\n            return $$.x(d) - tickOffset;\n        },\n        'y2': function y2(d) {\n            return $$.x(d) - tickOffset;\n        }\n    } : {\n        'x1': function x1(d) {\n            return $$.x(d) + tickOffset;\n        },\n        'x2': function x2(d) {\n            return $$.x(d) + tickOffset;\n        },\n        'y1': 0,\n        'y2': $$.height\n    };\n\n    $$.xgrid = $$.main.select('.' + CLASS.xgrids).selectAll('.' + CLASS.xgrid).data(xgridData);\n    $$.xgrid.enter().append('line').attr(\"class\", CLASS.xgrid);\n    if (!withoutUpdate) {\n        $$.xgrid.attr($$.xgridAttr).style(\"opacity\", function () {\n            return +d3.select(this).attr(config.axis_rotated ? 'y1' : 'x1') === (config.axis_rotated ? $$.height : 0) ? 0 : 1;\n        });\n    }\n    $$.xgrid.exit().remove();\n};\n\nc3_chart_internal_fn.updateYGrid = function () {\n    var $$ = this,\n        config = $$.config,\n        gridValues = $$.yAxis.tickValues() || $$.y.ticks(config.grid_y_ticks);\n    $$.ygrid = $$.main.select('.' + CLASS.ygrids).selectAll('.' + CLASS.ygrid).data(gridValues);\n    $$.ygrid.enter().append('line').attr('class', CLASS.ygrid);\n    $$.ygrid.attr(\"x1\", config.axis_rotated ? $$.y : 0).attr(\"x2\", config.axis_rotated ? $$.y : $$.width).attr(\"y1\", config.axis_rotated ? 0 : $$.y).attr(\"y2\", config.axis_rotated ? $$.height : $$.y);\n    $$.ygrid.exit().remove();\n    $$.smoothLines($$.ygrid, 'grid');\n};\n\nc3_chart_internal_fn.gridTextAnchor = function (d) {\n    return d.position ? d.position : \"end\";\n};\nc3_chart_internal_fn.gridTextDx = function (d) {\n    return d.position === 'start' ? 4 : d.position === 'middle' ? 0 : -4;\n};\nc3_chart_internal_fn.xGridTextX = function (d) {\n    return d.position === 'start' ? -this.height : d.position === 'middle' ? -this.height / 2 : 0;\n};\nc3_chart_internal_fn.yGridTextX = function (d) {\n    return d.position === 'start' ? 0 : d.position === 'middle' ? this.width / 2 : this.width;\n};\nc3_chart_internal_fn.updateGrid = function (duration) {\n    var $$ = this,\n        main = $$.main,\n        config = $$.config,\n        xgridLine,\n        ygridLine,\n        yv;\n\n    // hide if arc type\n    $$.grid.style('visibility', $$.hasArcType() ? 'hidden' : 'visible');\n\n    main.select('line.' + CLASS.xgridFocus).style(\"visibility\", \"hidden\");\n    if (config.grid_x_show) {\n        $$.updateXGrid();\n    }\n    $$.xgridLines = main.select('.' + CLASS.xgridLines).selectAll('.' + CLASS.xgridLine).data(config.grid_x_lines);\n    // enter\n    xgridLine = $$.xgridLines.enter().append('g').attr(\"class\", function (d) {\n        return CLASS.xgridLine + (d['class'] ? ' ' + d['class'] : '');\n    });\n    xgridLine.append('line').style(\"opacity\", 0);\n    xgridLine.append('text').attr(\"text-anchor\", $$.gridTextAnchor).attr(\"transform\", config.axis_rotated ? \"\" : \"rotate(-90)\").attr('dx', $$.gridTextDx).attr('dy', -5).style(\"opacity\", 0);\n    // udpate\n    // done in d3.transition() of the end of this function\n    // exit\n    $$.xgridLines.exit().transition().duration(duration).style(\"opacity\", 0).remove();\n\n    // Y-Grid\n    if (config.grid_y_show) {\n        $$.updateYGrid();\n    }\n    $$.ygridLines = main.select('.' + CLASS.ygridLines).selectAll('.' + CLASS.ygridLine).data(config.grid_y_lines);\n    // enter\n    ygridLine = $$.ygridLines.enter().append('g').attr(\"class\", function (d) {\n        return CLASS.ygridLine + (d['class'] ? ' ' + d['class'] : '');\n    });\n    ygridLine.append('line').style(\"opacity\", 0);\n    ygridLine.append('text').attr(\"text-anchor\", $$.gridTextAnchor).attr(\"transform\", config.axis_rotated ? \"rotate(-90)\" : \"\").attr('dx', $$.gridTextDx).attr('dy', -5).style(\"opacity\", 0);\n    // update\n    yv = $$.yv.bind($$);\n    $$.ygridLines.select('line').transition().duration(duration).attr(\"x1\", config.axis_rotated ? yv : 0).attr(\"x2\", config.axis_rotated ? yv : $$.width).attr(\"y1\", config.axis_rotated ? 0 : yv).attr(\"y2\", config.axis_rotated ? $$.height : yv).style(\"opacity\", 1);\n    $$.ygridLines.select('text').transition().duration(duration).attr(\"x\", config.axis_rotated ? $$.xGridTextX.bind($$) : $$.yGridTextX.bind($$)).attr(\"y\", yv).text(function (d) {\n        return d.text;\n    }).style(\"opacity\", 1);\n    // exit\n    $$.ygridLines.exit().transition().duration(duration).style(\"opacity\", 0).remove();\n};\nc3_chart_internal_fn.redrawGrid = function (withTransition) {\n    var $$ = this,\n        config = $$.config,\n        xv = $$.xv.bind($$),\n        lines = $$.xgridLines.select('line'),\n        texts = $$.xgridLines.select('text');\n    return [(withTransition ? lines.transition() : lines).attr(\"x1\", config.axis_rotated ? 0 : xv).attr(\"x2\", config.axis_rotated ? $$.width : xv).attr(\"y1\", config.axis_rotated ? xv : 0).attr(\"y2\", config.axis_rotated ? xv : $$.height).style(\"opacity\", 1), (withTransition ? texts.transition() : texts).attr(\"x\", config.axis_rotated ? $$.yGridTextX.bind($$) : $$.xGridTextX.bind($$)).attr(\"y\", xv).text(function (d) {\n        return d.text;\n    }).style(\"opacity\", 1)];\n};\nc3_chart_internal_fn.showXGridFocus = function (selectedData) {\n    var $$ = this,\n        config = $$.config,\n        dataToShow = selectedData.filter(function (d) {\n        return d && isValue(d.value);\n    }),\n        focusEl = $$.main.selectAll('line.' + CLASS.xgridFocus),\n        xx = $$.xx.bind($$);\n    if (!config.tooltip_show) {\n        return;\n    }\n    // Hide when scatter plot exists\n    if ($$.hasType('scatter') || $$.hasArcType()) {\n        return;\n    }\n    focusEl.style(\"visibility\", \"visible\").data([dataToShow[0]]).attr(config.axis_rotated ? 'y1' : 'x1', xx).attr(config.axis_rotated ? 'y2' : 'x2', xx);\n    $$.smoothLines(focusEl, 'grid');\n};\nc3_chart_internal_fn.hideXGridFocus = function () {\n    this.main.select('line.' + CLASS.xgridFocus).style(\"visibility\", \"hidden\");\n};\nc3_chart_internal_fn.updateXgridFocus = function () {\n    var $$ = this,\n        config = $$.config;\n    $$.main.select('line.' + CLASS.xgridFocus).attr(\"x1\", config.axis_rotated ? 0 : -10).attr(\"x2\", config.axis_rotated ? $$.width : -10).attr(\"y1\", config.axis_rotated ? -10 : 0).attr(\"y2\", config.axis_rotated ? -10 : $$.height);\n};\nc3_chart_internal_fn.generateGridData = function (type, scale) {\n    var $$ = this,\n        gridData = [],\n        xDomain,\n        firstYear,\n        lastYear,\n        i,\n        tickNum = $$.main.select(\".\" + CLASS.axisX).selectAll('.tick').size();\n    if (type === 'year') {\n        xDomain = $$.getXDomain();\n        firstYear = xDomain[0].getFullYear();\n        lastYear = xDomain[1].getFullYear();\n        for (i = firstYear; i <= lastYear; i++) {\n            gridData.push(new Date(i + '-01-01 00:00:00'));\n        }\n    } else {\n        gridData = scale.ticks(10);\n        if (gridData.length > tickNum) {\n            // use only int\n            gridData = gridData.filter(function (d) {\n                return (\"\" + d).indexOf('.') < 0;\n            });\n        }\n    }\n    return gridData;\n};\nc3_chart_internal_fn.getGridFilterToRemove = function (params) {\n    return params ? function (line) {\n        var found = false;\n        [].concat(params).forEach(function (param) {\n            if ('value' in param && line.value === param.value || 'class' in param && line['class'] === param['class']) {\n                found = true;\n            }\n        });\n        return found;\n    } : function () {\n        return true;\n    };\n};\nc3_chart_internal_fn.removeGridLines = function (params, forX) {\n    var $$ = this,\n        config = $$.config,\n        toRemove = $$.getGridFilterToRemove(params),\n        toShow = function toShow(line) {\n        return !toRemove(line);\n    },\n        classLines = forX ? CLASS.xgridLines : CLASS.ygridLines,\n        classLine = forX ? CLASS.xgridLine : CLASS.ygridLine;\n    $$.main.select('.' + classLines).selectAll('.' + classLine).filter(toRemove).transition().duration(config.transition_duration).style('opacity', 0).remove();\n    if (forX) {\n        config.grid_x_lines = config.grid_x_lines.filter(toShow);\n    } else {\n        config.grid_y_lines = config.grid_y_lines.filter(toShow);\n    }\n};\n\nc3_chart_internal_fn.initEventRect = function () {\n    var $$ = this;\n    $$.main.select('.' + CLASS.chart).append(\"g\").attr(\"class\", CLASS.eventRects).style('fill-opacity', 0);\n};\nc3_chart_internal_fn.redrawEventRect = function () {\n    var $$ = this,\n        config = $$.config,\n        eventRectUpdate,\n        maxDataCountTarget,\n        isMultipleX = $$.isMultipleX();\n\n    // rects for mouseover\n    var eventRects = $$.main.select('.' + CLASS.eventRects).style('cursor', config.zoom_enabled ? config.axis_rotated ? 'ns-resize' : 'ew-resize' : null).classed(CLASS.eventRectsMultiple, isMultipleX).classed(CLASS.eventRectsSingle, !isMultipleX);\n\n    // clear old rects\n    eventRects.selectAll('.' + CLASS.eventRect).remove();\n\n    // open as public variable\n    $$.eventRect = eventRects.selectAll('.' + CLASS.eventRect);\n\n    if (isMultipleX) {\n        eventRectUpdate = $$.eventRect.data([0]);\n        // enter : only one rect will be added\n        $$.generateEventRectsForMultipleXs(eventRectUpdate.enter());\n        // update\n        $$.updateEventRect(eventRectUpdate);\n        // exit : not needed because always only one rect exists\n    } else {\n        // Set data and update $$.eventRect\n        maxDataCountTarget = $$.getMaxDataCountTarget($$.data.targets);\n        eventRects.datum(maxDataCountTarget ? maxDataCountTarget.values : []);\n        $$.eventRect = eventRects.selectAll('.' + CLASS.eventRect);\n        eventRectUpdate = $$.eventRect.data(function (d) {\n            return d;\n        });\n        // enter\n        $$.generateEventRectsForSingleX(eventRectUpdate.enter());\n        // update\n        $$.updateEventRect(eventRectUpdate);\n        // exit\n        eventRectUpdate.exit().remove();\n    }\n};\nc3_chart_internal_fn.updateEventRect = function (eventRectUpdate) {\n    var $$ = this,\n        config = $$.config,\n        x,\n        y,\n        w,\n        h,\n        rectW,\n        rectX;\n\n    // set update selection if null\n    eventRectUpdate = eventRectUpdate || $$.eventRect.data(function (d) {\n        return d;\n    });\n\n    if ($$.isMultipleX()) {\n        // TODO: rotated not supported yet\n        x = 0;\n        y = 0;\n        w = $$.width;\n        h = $$.height;\n    } else {\n        if (($$.isCustomX() || $$.isTimeSeries()) && !$$.isCategorized()) {\n\n            // update index for x that is used by prevX and nextX\n            $$.updateXs();\n\n            rectW = function rectW(d) {\n                var prevX = $$.getPrevX(d.index),\n                    nextX = $$.getNextX(d.index);\n\n                // if there this is a single data point make the eventRect full width (or height)\n                if (prevX === null && nextX === null) {\n                    return config.axis_rotated ? $$.height : $$.width;\n                }\n\n                if (prevX === null) {\n                    prevX = $$.x.domain()[0];\n                }\n                if (nextX === null) {\n                    nextX = $$.x.domain()[1];\n                }\n\n                return Math.max(0, ($$.x(nextX) - $$.x(prevX)) / 2);\n            };\n            rectX = function rectX(d) {\n                var prevX = $$.getPrevX(d.index),\n                    nextX = $$.getNextX(d.index),\n                    thisX = $$.data.xs[d.id][d.index];\n\n                // if there this is a single data point position the eventRect at 0\n                if (prevX === null && nextX === null) {\n                    return 0;\n                }\n\n                if (prevX === null) {\n                    prevX = $$.x.domain()[0];\n                }\n\n                return ($$.x(thisX) + $$.x(prevX)) / 2;\n            };\n        } else {\n            rectW = $$.getEventRectWidth();\n            rectX = function rectX(d) {\n                return $$.x(d.x) - rectW / 2;\n            };\n        }\n        x = config.axis_rotated ? 0 : rectX;\n        y = config.axis_rotated ? rectX : 0;\n        w = config.axis_rotated ? $$.width : rectW;\n        h = config.axis_rotated ? rectW : $$.height;\n    }\n\n    eventRectUpdate.attr('class', $$.classEvent.bind($$)).attr(\"x\", x).attr(\"y\", y).attr(\"width\", w).attr(\"height\", h);\n};\nc3_chart_internal_fn.generateEventRectsForSingleX = function (eventRectEnter) {\n    var $$ = this,\n        d3 = $$.d3,\n        config = $$.config;\n    eventRectEnter.append(\"rect\").attr(\"class\", $$.classEvent.bind($$)).style(\"cursor\", config.data_selection_enabled && config.data_selection_grouped ? \"pointer\" : null).on('mouseover', function (d) {\n        var index = d.index;\n\n        if ($$.dragging || $$.flowing) {\n            return;\n        } // do nothing while dragging/flowing\n        if ($$.hasArcType()) {\n            return;\n        }\n\n        // Expand shapes for selection\n        if (config.point_focus_expand_enabled) {\n            $$.expandCircles(index, null, true);\n        }\n        $$.expandBars(index, null, true);\n\n        // Call event handler\n        $$.main.selectAll('.' + CLASS.shape + '-' + index).each(function (d) {\n            config.data_onmouseover.call($$.api, d);\n        });\n    }).on('mouseout', function (d) {\n        var index = d.index;\n        if (!$$.config) {\n            return;\n        } // chart is destroyed\n        if ($$.hasArcType()) {\n            return;\n        }\n        $$.hideXGridFocus();\n        $$.hideTooltip();\n        // Undo expanded shapes\n        $$.unexpandCircles();\n        $$.unexpandBars();\n        // Call event handler\n        $$.main.selectAll('.' + CLASS.shape + '-' + index).each(function (d) {\n            config.data_onmouseout.call($$.api, d);\n        });\n    }).on('mousemove', function (d) {\n        var selectedData,\n            index = d.index,\n            eventRect = $$.svg.select('.' + CLASS.eventRect + '-' + index);\n\n        if ($$.dragging || $$.flowing) {\n            return;\n        } // do nothing while dragging/flowing\n        if ($$.hasArcType()) {\n            return;\n        }\n\n        if ($$.isStepType(d) && $$.config.line_step_type === 'step-after' && d3.mouse(this)[0] < $$.x($$.getXValue(d.id, index))) {\n            index -= 1;\n        }\n\n        // Show tooltip\n        selectedData = $$.filterTargetsToShow($$.data.targets).map(function (t) {\n            return $$.addName($$.getValueOnIndex(t.values, index));\n        });\n\n        if (config.tooltip_grouped) {\n            $$.showTooltip(selectedData, this);\n            $$.showXGridFocus(selectedData);\n        }\n\n        if (config.tooltip_grouped && (!config.data_selection_enabled || config.data_selection_grouped)) {\n            return;\n        }\n\n        $$.main.selectAll('.' + CLASS.shape + '-' + index).each(function () {\n            d3.select(this).classed(CLASS.EXPANDED, true);\n            if (config.data_selection_enabled) {\n                eventRect.style('cursor', config.data_selection_grouped ? 'pointer' : null);\n            }\n            if (!config.tooltip_grouped) {\n                $$.hideXGridFocus();\n                $$.hideTooltip();\n                if (!config.data_selection_grouped) {\n                    $$.unexpandCircles(index);\n                    $$.unexpandBars(index);\n                }\n            }\n        }).filter(function (d) {\n            return $$.isWithinShape(this, d);\n        }).each(function (d) {\n            if (config.data_selection_enabled && (config.data_selection_grouped || config.data_selection_isselectable(d))) {\n                eventRect.style('cursor', 'pointer');\n            }\n            if (!config.tooltip_grouped) {\n                $$.showTooltip([d], this);\n                $$.showXGridFocus([d]);\n                if (config.point_focus_expand_enabled) {\n                    $$.expandCircles(index, d.id, true);\n                }\n                $$.expandBars(index, d.id, true);\n            }\n        });\n    }).on('click', function (d) {\n        var index = d.index;\n        if ($$.hasArcType() || !$$.toggleShape) {\n            return;\n        }\n        if ($$.cancelClick) {\n            $$.cancelClick = false;\n            return;\n        }\n        if ($$.isStepType(d) && config.line_step_type === 'step-after' && d3.mouse(this)[0] < $$.x($$.getXValue(d.id, index))) {\n            index -= 1;\n        }\n        $$.main.selectAll('.' + CLASS.shape + '-' + index).each(function (d) {\n            if (config.data_selection_grouped || $$.isWithinShape(this, d)) {\n                $$.toggleShape(this, d, index);\n                $$.config.data_onclick.call($$.api, d, this);\n            }\n        });\n    }).call(config.data_selection_draggable && $$.drag ? d3.behavior.drag().origin(Object).on('drag', function () {\n        $$.drag(d3.mouse(this));\n    }).on('dragstart', function () {\n        $$.dragstart(d3.mouse(this));\n    }).on('dragend', function () {\n        $$.dragend();\n    }) : function () {});\n};\n\nc3_chart_internal_fn.generateEventRectsForMultipleXs = function (eventRectEnter) {\n    var $$ = this,\n        d3 = $$.d3,\n        config = $$.config;\n\n    function mouseout() {\n        $$.svg.select('.' + CLASS.eventRect).style('cursor', null);\n        $$.hideXGridFocus();\n        $$.hideTooltip();\n        $$.unexpandCircles();\n        $$.unexpandBars();\n    }\n\n    eventRectEnter.append('rect').attr('x', 0).attr('y', 0).attr('width', $$.width).attr('height', $$.height).attr('class', CLASS.eventRect).on('mouseout', function () {\n        if (!$$.config) {\n            return;\n        } // chart is destroyed\n        if ($$.hasArcType()) {\n            return;\n        }\n        mouseout();\n    }).on('mousemove', function () {\n        var targetsToShow = $$.filterTargetsToShow($$.data.targets);\n        var mouse, closest, sameXData, selectedData;\n\n        if ($$.dragging) {\n            return;\n        } // do nothing when dragging\n        if ($$.hasArcType(targetsToShow)) {\n            return;\n        }\n\n        mouse = d3.mouse(this);\n        closest = $$.findClosestFromTargets(targetsToShow, mouse);\n\n        if ($$.mouseover && (!closest || closest.id !== $$.mouseover.id)) {\n            config.data_onmouseout.call($$.api, $$.mouseover);\n            $$.mouseover = undefined;\n        }\n\n        if (!closest) {\n            mouseout();\n            return;\n        }\n\n        if ($$.isScatterType(closest) || !config.tooltip_grouped) {\n            sameXData = [closest];\n        } else {\n            sameXData = $$.filterByX(targetsToShow, closest.x);\n        }\n\n        // show tooltip when cursor is close to some point\n        selectedData = sameXData.map(function (d) {\n            return $$.addName(d);\n        });\n        $$.showTooltip(selectedData, this);\n\n        // expand points\n        if (config.point_focus_expand_enabled) {\n            $$.expandCircles(closest.index, closest.id, true);\n        }\n        $$.expandBars(closest.index, closest.id, true);\n\n        // Show xgrid focus line\n        $$.showXGridFocus(selectedData);\n\n        // Show cursor as pointer if point is close to mouse position\n        if ($$.isBarType(closest.id) || $$.dist(closest, mouse) < config.point_sensitivity) {\n            $$.svg.select('.' + CLASS.eventRect).style('cursor', 'pointer');\n            if (!$$.mouseover) {\n                config.data_onmouseover.call($$.api, closest);\n                $$.mouseover = closest;\n            }\n        }\n    }).on('click', function () {\n        var targetsToShow = $$.filterTargetsToShow($$.data.targets);\n        var mouse, closest;\n        if ($$.hasArcType(targetsToShow)) {\n            return;\n        }\n\n        mouse = d3.mouse(this);\n        closest = $$.findClosestFromTargets(targetsToShow, mouse);\n        if (!closest) {\n            return;\n        }\n        // select if selection enabled\n        if ($$.isBarType(closest.id) || $$.dist(closest, mouse) < config.point_sensitivity) {\n            $$.main.selectAll('.' + CLASS.shapes + $$.getTargetSelectorSuffix(closest.id)).selectAll('.' + CLASS.shape + '-' + closest.index).each(function () {\n                if (config.data_selection_grouped || $$.isWithinShape(this, closest)) {\n                    $$.toggleShape(this, closest, closest.index);\n                    $$.config.data_onclick.call($$.api, closest, this);\n                }\n            });\n        }\n    }).call(config.data_selection_draggable && $$.drag ? d3.behavior.drag().origin(Object).on('drag', function () {\n        $$.drag(d3.mouse(this));\n    }).on('dragstart', function () {\n        $$.dragstart(d3.mouse(this));\n    }).on('dragend', function () {\n        $$.dragend();\n    }) : function () {});\n};\nc3_chart_internal_fn.dispatchEvent = function (type, index, mouse) {\n    var $$ = this,\n        selector = '.' + CLASS.eventRect + (!$$.isMultipleX() ? '-' + index : ''),\n        eventRect = $$.main.select(selector).node(),\n        box = eventRect.getBoundingClientRect(),\n        x = box.left + (mouse ? mouse[0] : 0),\n        y = box.top + (mouse ? mouse[1] : 0),\n        event = document.createEvent(\"MouseEvents\");\n\n    event.initMouseEvent(type, true, true, window, 0, x, y, x, y, false, false, false, false, 0, null);\n    eventRect.dispatchEvent(event);\n};\n\nc3_chart_internal_fn.initLegend = function () {\n    var $$ = this;\n    $$.legendItemTextBox = {};\n    $$.legendHasRendered = false;\n    $$.legend = $$.svg.append(\"g\").attr(\"transform\", $$.getTranslate('legend'));\n    if (!$$.config.legend_show) {\n        $$.legend.style('visibility', 'hidden');\n        $$.hiddenLegendIds = $$.mapToIds($$.data.targets);\n        return;\n    }\n    // MEMO: call here to update legend box and tranlate for all\n    // MEMO: translate will be upated by this, so transform not needed in updateLegend()\n    $$.updateLegendWithDefaults();\n};\nc3_chart_internal_fn.updateLegendWithDefaults = function () {\n    var $$ = this;\n    $$.updateLegend($$.mapToIds($$.data.targets), { withTransform: false, withTransitionForTransform: false, withTransition: false });\n};\nc3_chart_internal_fn.updateSizeForLegend = function (legendHeight, legendWidth) {\n    var $$ = this,\n        config = $$.config,\n        insetLegendPosition = {\n        top: $$.isLegendTop ? $$.getCurrentPaddingTop() + config.legend_inset_y + 5.5 : $$.currentHeight - legendHeight - $$.getCurrentPaddingBottom() - config.legend_inset_y,\n        left: $$.isLegendLeft ? $$.getCurrentPaddingLeft() + config.legend_inset_x + 0.5 : $$.currentWidth - legendWidth - $$.getCurrentPaddingRight() - config.legend_inset_x + 0.5\n    };\n\n    $$.margin3 = {\n        top: $$.isLegendRight ? 0 : $$.isLegendInset ? insetLegendPosition.top : $$.currentHeight - legendHeight,\n        right: NaN,\n        bottom: 0,\n        left: $$.isLegendRight ? $$.currentWidth - legendWidth : $$.isLegendInset ? insetLegendPosition.left : 0\n    };\n};\nc3_chart_internal_fn.transformLegend = function (withTransition) {\n    var $$ = this;\n    (withTransition ? $$.legend.transition() : $$.legend).attr(\"transform\", $$.getTranslate('legend'));\n};\nc3_chart_internal_fn.updateLegendStep = function (step) {\n    this.legendStep = step;\n};\nc3_chart_internal_fn.updateLegendItemWidth = function (w) {\n    this.legendItemWidth = w;\n};\nc3_chart_internal_fn.updateLegendItemHeight = function (h) {\n    this.legendItemHeight = h;\n};\nc3_chart_internal_fn.getLegendWidth = function () {\n    var $$ = this;\n    return $$.config.legend_show ? $$.isLegendRight || $$.isLegendInset ? $$.legendItemWidth * ($$.legendStep + 1) : $$.currentWidth : 0;\n};\nc3_chart_internal_fn.getLegendHeight = function () {\n    var $$ = this,\n        h = 0;\n    if ($$.config.legend_show) {\n        if ($$.isLegendRight) {\n            h = $$.currentHeight;\n        } else {\n            h = Math.max(20, $$.legendItemHeight) * ($$.legendStep + 1);\n        }\n    }\n    return h;\n};\nc3_chart_internal_fn.opacityForLegend = function (legendItem) {\n    return legendItem.classed(CLASS.legendItemHidden) ? null : 1;\n};\nc3_chart_internal_fn.opacityForUnfocusedLegend = function (legendItem) {\n    return legendItem.classed(CLASS.legendItemHidden) ? null : 0.3;\n};\nc3_chart_internal_fn.toggleFocusLegend = function (targetIds, focus) {\n    var $$ = this;\n    targetIds = $$.mapToTargetIds(targetIds);\n    $$.legend.selectAll('.' + CLASS.legendItem).filter(function (id) {\n        return targetIds.indexOf(id) >= 0;\n    }).classed(CLASS.legendItemFocused, focus).transition().duration(100).style('opacity', function () {\n        var opacity = focus ? $$.opacityForLegend : $$.opacityForUnfocusedLegend;\n        return opacity.call($$, $$.d3.select(this));\n    });\n};\nc3_chart_internal_fn.revertLegend = function () {\n    var $$ = this,\n        d3 = $$.d3;\n    $$.legend.selectAll('.' + CLASS.legendItem).classed(CLASS.legendItemFocused, false).transition().duration(100).style('opacity', function () {\n        return $$.opacityForLegend(d3.select(this));\n    });\n};\nc3_chart_internal_fn.showLegend = function (targetIds) {\n    var $$ = this,\n        config = $$.config;\n    if (!config.legend_show) {\n        config.legend_show = true;\n        $$.legend.style('visibility', 'visible');\n        if (!$$.legendHasRendered) {\n            $$.updateLegendWithDefaults();\n        }\n    }\n    $$.removeHiddenLegendIds(targetIds);\n    $$.legend.selectAll($$.selectorLegends(targetIds)).style('visibility', 'visible').transition().style('opacity', function () {\n        return $$.opacityForLegend($$.d3.select(this));\n    });\n};\nc3_chart_internal_fn.hideLegend = function (targetIds) {\n    var $$ = this,\n        config = $$.config;\n    if (config.legend_show && isEmpty(targetIds)) {\n        config.legend_show = false;\n        $$.legend.style('visibility', 'hidden');\n    }\n    $$.addHiddenLegendIds(targetIds);\n    $$.legend.selectAll($$.selectorLegends(targetIds)).style('opacity', 0).style('visibility', 'hidden');\n};\nc3_chart_internal_fn.clearLegendItemTextBoxCache = function () {\n    this.legendItemTextBox = {};\n};\nc3_chart_internal_fn.updateLegend = function (targetIds, options, transitions) {\n    var $$ = this,\n        config = $$.config;\n    var xForLegend, xForLegendText, xForLegendRect, yForLegend, yForLegendText, yForLegendRect, x1ForLegendTile, x2ForLegendTile, yForLegendTile;\n    var paddingTop = 4,\n        paddingRight = 10,\n        maxWidth = 0,\n        maxHeight = 0,\n        posMin = 10,\n        tileWidth = config.legend_item_tile_width + 5;\n    var l,\n        totalLength = 0,\n        offsets = {},\n        widths = {},\n        heights = {},\n        margins = [0],\n        steps = {},\n        step = 0;\n    var withTransition, withTransitionForTransform;\n    var texts, rects, tiles, background;\n\n    // Skip elements when their name is set to null\n    targetIds = targetIds.filter(function (id) {\n        return !isDefined(config.data_names[id]) || config.data_names[id] !== null;\n    });\n\n    options = options || {};\n    withTransition = getOption(options, \"withTransition\", true);\n    withTransitionForTransform = getOption(options, \"withTransitionForTransform\", true);\n\n    function getTextBox(textElement, id) {\n        if (!$$.legendItemTextBox[id]) {\n            $$.legendItemTextBox[id] = $$.getTextRect(textElement.textContent, CLASS.legendItem, textElement);\n        }\n        return $$.legendItemTextBox[id];\n    }\n\n    function updatePositions(textElement, id, index) {\n        var reset = index === 0,\n            isLast = index === targetIds.length - 1,\n            box = getTextBox(textElement, id),\n            itemWidth = box.width + tileWidth + (isLast && !($$.isLegendRight || $$.isLegendInset) ? 0 : paddingRight) + config.legend_padding,\n            itemHeight = box.height + paddingTop,\n            itemLength = $$.isLegendRight || $$.isLegendInset ? itemHeight : itemWidth,\n            areaLength = $$.isLegendRight || $$.isLegendInset ? $$.getLegendHeight() : $$.getLegendWidth(),\n            margin,\n            maxLength;\n\n        // MEMO: care about condifion of step, totalLength\n        function updateValues(id, withoutStep) {\n            if (!withoutStep) {\n                margin = (areaLength - totalLength - itemLength) / 2;\n                if (margin < posMin) {\n                    margin = (areaLength - itemLength) / 2;\n                    totalLength = 0;\n                    step++;\n                }\n            }\n            steps[id] = step;\n            margins[step] = $$.isLegendInset ? 10 : margin;\n            offsets[id] = totalLength;\n            totalLength += itemLength;\n        }\n\n        if (reset) {\n            totalLength = 0;\n            step = 0;\n            maxWidth = 0;\n            maxHeight = 0;\n        }\n\n        if (config.legend_show && !$$.isLegendToShow(id)) {\n            widths[id] = heights[id] = steps[id] = offsets[id] = 0;\n            return;\n        }\n\n        widths[id] = itemWidth;\n        heights[id] = itemHeight;\n\n        if (!maxWidth || itemWidth >= maxWidth) {\n            maxWidth = itemWidth;\n        }\n        if (!maxHeight || itemHeight >= maxHeight) {\n            maxHeight = itemHeight;\n        }\n        maxLength = $$.isLegendRight || $$.isLegendInset ? maxHeight : maxWidth;\n\n        if (config.legend_equally) {\n            Object.keys(widths).forEach(function (id) {\n                widths[id] = maxWidth;\n            });\n            Object.keys(heights).forEach(function (id) {\n                heights[id] = maxHeight;\n            });\n            margin = (areaLength - maxLength * targetIds.length) / 2;\n            if (margin < posMin) {\n                totalLength = 0;\n                step = 0;\n                targetIds.forEach(function (id) {\n                    updateValues(id);\n                });\n            } else {\n                updateValues(id, true);\n            }\n        } else {\n            updateValues(id);\n        }\n    }\n\n    if ($$.isLegendInset) {\n        step = config.legend_inset_step ? config.legend_inset_step : targetIds.length;\n        $$.updateLegendStep(step);\n    }\n\n    if ($$.isLegendRight) {\n        xForLegend = function xForLegend(id) {\n            return maxWidth * steps[id];\n        };\n        yForLegend = function yForLegend(id) {\n            return margins[steps[id]] + offsets[id];\n        };\n    } else if ($$.isLegendInset) {\n        xForLegend = function xForLegend(id) {\n            return maxWidth * steps[id] + 10;\n        };\n        yForLegend = function yForLegend(id) {\n            return margins[steps[id]] + offsets[id];\n        };\n    } else {\n        xForLegend = function xForLegend(id) {\n            return margins[steps[id]] + offsets[id];\n        };\n        yForLegend = function yForLegend(id) {\n            return maxHeight * steps[id];\n        };\n    }\n    xForLegendText = function xForLegendText(id, i) {\n        return xForLegend(id, i) + 4 + config.legend_item_tile_width;\n    };\n    yForLegendText = function yForLegendText(id, i) {\n        return yForLegend(id, i) + 9;\n    };\n    xForLegendRect = function xForLegendRect(id, i) {\n        return xForLegend(id, i);\n    };\n    yForLegendRect = function yForLegendRect(id, i) {\n        return yForLegend(id, i) - 5;\n    };\n    x1ForLegendTile = function x1ForLegendTile(id, i) {\n        return xForLegend(id, i) - 2;\n    };\n    x2ForLegendTile = function x2ForLegendTile(id, i) {\n        return xForLegend(id, i) - 2 + config.legend_item_tile_width;\n    };\n    yForLegendTile = function yForLegendTile(id, i) {\n        return yForLegend(id, i) + 4;\n    };\n\n    // Define g for legend area\n    l = $$.legend.selectAll('.' + CLASS.legendItem).data(targetIds).enter().append('g').attr('class', function (id) {\n        return $$.generateClass(CLASS.legendItem, id);\n    }).style('visibility', function (id) {\n        return $$.isLegendToShow(id) ? 'visible' : 'hidden';\n    }).style('cursor', 'pointer').on('click', function (id) {\n        if (config.legend_item_onclick) {\n            config.legend_item_onclick.call($$, id);\n        } else {\n            if ($$.d3.event.altKey) {\n                $$.api.hide();\n                $$.api.show(id);\n            } else {\n                $$.api.toggle(id);\n                $$.isTargetToShow(id) ? $$.api.focus(id) : $$.api.revert();\n            }\n        }\n    }).on('mouseover', function (id) {\n        if (config.legend_item_onmouseover) {\n            config.legend_item_onmouseover.call($$, id);\n        } else {\n            $$.d3.select(this).classed(CLASS.legendItemFocused, true);\n            if (!$$.transiting && $$.isTargetToShow(id)) {\n                $$.api.focus(id);\n            }\n        }\n    }).on('mouseout', function (id) {\n        if (config.legend_item_onmouseout) {\n            config.legend_item_onmouseout.call($$, id);\n        } else {\n            $$.d3.select(this).classed(CLASS.legendItemFocused, false);\n            $$.api.revert();\n        }\n    });\n    l.append('text').text(function (id) {\n        return isDefined(config.data_names[id]) ? config.data_names[id] : id;\n    }).each(function (id, i) {\n        updatePositions(this, id, i);\n    }).style(\"pointer-events\", \"none\").attr('x', $$.isLegendRight || $$.isLegendInset ? xForLegendText : -200).attr('y', $$.isLegendRight || $$.isLegendInset ? -200 : yForLegendText);\n    l.append('rect').attr(\"class\", CLASS.legendItemEvent).style('fill-opacity', 0).attr('x', $$.isLegendRight || $$.isLegendInset ? xForLegendRect : -200).attr('y', $$.isLegendRight || $$.isLegendInset ? -200 : yForLegendRect);\n    l.append('line').attr('class', CLASS.legendItemTile).style('stroke', $$.color).style(\"pointer-events\", \"none\").attr('x1', $$.isLegendRight || $$.isLegendInset ? x1ForLegendTile : -200).attr('y1', $$.isLegendRight || $$.isLegendInset ? -200 : yForLegendTile).attr('x2', $$.isLegendRight || $$.isLegendInset ? x2ForLegendTile : -200).attr('y2', $$.isLegendRight || $$.isLegendInset ? -200 : yForLegendTile).attr('stroke-width', config.legend_item_tile_height);\n\n    // Set background for inset legend\n    background = $$.legend.select('.' + CLASS.legendBackground + ' rect');\n    if ($$.isLegendInset && maxWidth > 0 && background.size() === 0) {\n        background = $$.legend.insert('g', '.' + CLASS.legendItem).attr(\"class\", CLASS.legendBackground).append('rect');\n    }\n\n    texts = $$.legend.selectAll('text').data(targetIds).text(function (id) {\n        return isDefined(config.data_names[id]) ? config.data_names[id] : id;\n    } // MEMO: needed for update\n    ).each(function (id, i) {\n        updatePositions(this, id, i);\n    });\n    (withTransition ? texts.transition() : texts).attr('x', xForLegendText).attr('y', yForLegendText);\n\n    rects = $$.legend.selectAll('rect.' + CLASS.legendItemEvent).data(targetIds);\n    (withTransition ? rects.transition() : rects).attr('width', function (id) {\n        return widths[id];\n    }).attr('height', function (id) {\n        return heights[id];\n    }).attr('x', xForLegendRect).attr('y', yForLegendRect);\n\n    tiles = $$.legend.selectAll('line.' + CLASS.legendItemTile).data(targetIds);\n    (withTransition ? tiles.transition() : tiles).style('stroke', $$.color).attr('x1', x1ForLegendTile).attr('y1', yForLegendTile).attr('x2', x2ForLegendTile).attr('y2', yForLegendTile);\n\n    if (background) {\n        (withTransition ? background.transition() : background).attr('height', $$.getLegendHeight() - 12).attr('width', maxWidth * (step + 1) + 10);\n    }\n\n    // toggle legend state\n    $$.legend.selectAll('.' + CLASS.legendItem).classed(CLASS.legendItemHidden, function (id) {\n        return !$$.isTargetToShow(id);\n    });\n\n    // Update all to reflect change of legend\n    $$.updateLegendItemWidth(maxWidth);\n    $$.updateLegendItemHeight(maxHeight);\n    $$.updateLegendStep(step);\n    // Update size and scale\n    $$.updateSizes();\n    $$.updateScales();\n    $$.updateSvgSize();\n    // Update g positions\n    $$.transformAll(withTransitionForTransform, transitions);\n    $$.legendHasRendered = true;\n};\n\nc3_chart_internal_fn.initRegion = function () {\n    var $$ = this;\n    $$.region = $$.main.append('g').attr(\"clip-path\", $$.clipPath).attr(\"class\", CLASS.regions);\n};\nc3_chart_internal_fn.updateRegion = function (duration) {\n    var $$ = this,\n        config = $$.config;\n\n    // hide if arc type\n    $$.region.style('visibility', $$.hasArcType() ? 'hidden' : 'visible');\n\n    $$.mainRegion = $$.main.select('.' + CLASS.regions).selectAll('.' + CLASS.region).data(config.regions);\n    $$.mainRegion.enter().append('g').append('rect').style(\"fill-opacity\", 0);\n    $$.mainRegion.attr('class', $$.classRegion.bind($$));\n    $$.mainRegion.exit().transition().duration(duration).style(\"opacity\", 0).remove();\n};\nc3_chart_internal_fn.redrawRegion = function (withTransition) {\n    var $$ = this,\n        regions = $$.mainRegion.selectAll('rect').each(function () {\n        // data is binded to g and it's not transferred to rect (child node) automatically,\n        // then data of each rect has to be updated manually.\n        // TODO: there should be more efficient way to solve this?\n        var parentData = $$.d3.select(this.parentNode).datum();\n        $$.d3.select(this).datum(parentData);\n    }),\n        x = $$.regionX.bind($$),\n        y = $$.regionY.bind($$),\n        w = $$.regionWidth.bind($$),\n        h = $$.regionHeight.bind($$);\n    return [(withTransition ? regions.transition() : regions).attr(\"x\", x).attr(\"y\", y).attr(\"width\", w).attr(\"height\", h).style(\"fill-opacity\", function (d) {\n        return isValue(d.opacity) ? d.opacity : 0.1;\n    })];\n};\nc3_chart_internal_fn.regionX = function (d) {\n    var $$ = this,\n        config = $$.config,\n        xPos,\n        yScale = d.axis === 'y' ? $$.y : $$.y2;\n    if (d.axis === 'y' || d.axis === 'y2') {\n        xPos = config.axis_rotated ? 'start' in d ? yScale(d.start) : 0 : 0;\n    } else {\n        xPos = config.axis_rotated ? 0 : 'start' in d ? $$.x($$.isTimeSeries() ? $$.parseDate(d.start) : d.start) : 0;\n    }\n    return xPos;\n};\nc3_chart_internal_fn.regionY = function (d) {\n    var $$ = this,\n        config = $$.config,\n        yPos,\n        yScale = d.axis === 'y' ? $$.y : $$.y2;\n    if (d.axis === 'y' || d.axis === 'y2') {\n        yPos = config.axis_rotated ? 0 : 'end' in d ? yScale(d.end) : 0;\n    } else {\n        yPos = config.axis_rotated ? 'start' in d ? $$.x($$.isTimeSeries() ? $$.parseDate(d.start) : d.start) : 0 : 0;\n    }\n    return yPos;\n};\nc3_chart_internal_fn.regionWidth = function (d) {\n    var $$ = this,\n        config = $$.config,\n        start = $$.regionX(d),\n        end,\n        yScale = d.axis === 'y' ? $$.y : $$.y2;\n    if (d.axis === 'y' || d.axis === 'y2') {\n        end = config.axis_rotated ? 'end' in d ? yScale(d.end) : $$.width : $$.width;\n    } else {\n        end = config.axis_rotated ? $$.width : 'end' in d ? $$.x($$.isTimeSeries() ? $$.parseDate(d.end) : d.end) : $$.width;\n    }\n    return end < start ? 0 : end - start;\n};\nc3_chart_internal_fn.regionHeight = function (d) {\n    var $$ = this,\n        config = $$.config,\n        start = this.regionY(d),\n        end,\n        yScale = d.axis === 'y' ? $$.y : $$.y2;\n    if (d.axis === 'y' || d.axis === 'y2') {\n        end = config.axis_rotated ? $$.height : 'start' in d ? yScale(d.start) : $$.height;\n    } else {\n        end = config.axis_rotated ? 'end' in d ? $$.x($$.isTimeSeries() ? $$.parseDate(d.end) : d.end) : $$.height : $$.height;\n    }\n    return end < start ? 0 : end - start;\n};\nc3_chart_internal_fn.isRegionOnX = function (d) {\n    return !d.axis || d.axis === 'x';\n};\n\nc3_chart_internal_fn.getScale = function (min, max, forTimeseries) {\n    return (forTimeseries ? this.d3.time.scale() : this.d3.scale.linear()).range([min, max]);\n};\nc3_chart_internal_fn.getX = function (min, max, domain, offset) {\n    var $$ = this,\n        scale = $$.getScale(min, max, $$.isTimeSeries()),\n        _scale = domain ? scale.domain(domain) : scale,\n        key;\n    // Define customized scale if categorized axis\n    if ($$.isCategorized()) {\n        offset = offset || function () {\n            return 0;\n        };\n        scale = function scale(d, raw) {\n            var v = _scale(d) + offset(d);\n            return raw ? v : Math.ceil(v);\n        };\n    } else {\n        scale = function scale(d, raw) {\n            var v = _scale(d);\n            return raw ? v : Math.ceil(v);\n        };\n    }\n    // define functions\n    for (key in _scale) {\n        scale[key] = _scale[key];\n    }\n    scale.orgDomain = function () {\n        return _scale.domain();\n    };\n    // define custom domain() for categorized axis\n    if ($$.isCategorized()) {\n        scale.domain = function (domain) {\n            if (!arguments.length) {\n                domain = this.orgDomain();\n                return [domain[0], domain[1] + 1];\n            }\n            _scale.domain(domain);\n            return scale;\n        };\n    }\n    return scale;\n};\nc3_chart_internal_fn.getY = function (min, max, domain) {\n    var scale = this.getScale(min, max, this.isTimeSeriesY());\n    if (domain) {\n        scale.domain(domain);\n    }\n    return scale;\n};\nc3_chart_internal_fn.getYScale = function (id) {\n    return this.axis.getId(id) === 'y2' ? this.y2 : this.y;\n};\nc3_chart_internal_fn.getSubYScale = function (id) {\n    return this.axis.getId(id) === 'y2' ? this.subY2 : this.subY;\n};\nc3_chart_internal_fn.updateScales = function () {\n    var $$ = this,\n        config = $$.config,\n        forInit = !$$.x;\n    // update edges\n    $$.xMin = config.axis_rotated ? 1 : 0;\n    $$.xMax = config.axis_rotated ? $$.height : $$.width;\n    $$.yMin = config.axis_rotated ? 0 : $$.height;\n    $$.yMax = config.axis_rotated ? $$.width : 1;\n    $$.subXMin = $$.xMin;\n    $$.subXMax = $$.xMax;\n    $$.subYMin = config.axis_rotated ? 0 : $$.height2;\n    $$.subYMax = config.axis_rotated ? $$.width2 : 1;\n    // update scales\n    $$.x = $$.getX($$.xMin, $$.xMax, forInit ? undefined : $$.x.orgDomain(), function () {\n        return $$.xAxis.tickOffset();\n    });\n    $$.y = $$.getY($$.yMin, $$.yMax, forInit ? config.axis_y_default : $$.y.domain());\n    $$.y2 = $$.getY($$.yMin, $$.yMax, forInit ? config.axis_y2_default : $$.y2.domain());\n    $$.subX = $$.getX($$.xMin, $$.xMax, $$.orgXDomain, function (d) {\n        return d % 1 ? 0 : $$.subXAxis.tickOffset();\n    });\n    $$.subY = $$.getY($$.subYMin, $$.subYMax, forInit ? config.axis_y_default : $$.subY.domain());\n    $$.subY2 = $$.getY($$.subYMin, $$.subYMax, forInit ? config.axis_y2_default : $$.subY2.domain());\n    // update axes\n    $$.xAxisTickFormat = $$.axis.getXAxisTickFormat();\n    $$.xAxisTickValues = $$.axis.getXAxisTickValues();\n    $$.yAxisTickValues = $$.axis.getYAxisTickValues();\n    $$.y2AxisTickValues = $$.axis.getY2AxisTickValues();\n\n    $$.xAxis = $$.axis.getXAxis($$.x, $$.xOrient, $$.xAxisTickFormat, $$.xAxisTickValues, config.axis_x_tick_outer);\n    $$.subXAxis = $$.axis.getXAxis($$.subX, $$.subXOrient, $$.xAxisTickFormat, $$.xAxisTickValues, config.axis_x_tick_outer);\n    $$.yAxis = $$.axis.getYAxis($$.y, $$.yOrient, config.axis_y_tick_format, $$.yAxisTickValues, config.axis_y_tick_outer);\n    $$.y2Axis = $$.axis.getYAxis($$.y2, $$.y2Orient, config.axis_y2_tick_format, $$.y2AxisTickValues, config.axis_y2_tick_outer);\n\n    // Set initialized scales to brush and zoom\n    if (!forInit) {\n        if ($$.brush) {\n            $$.brush.scale($$.subX);\n        }\n        if (config.zoom_enabled) {\n            $$.zoom.scale($$.x);\n        }\n    }\n    // update for arc\n    if ($$.updateArc) {\n        $$.updateArc();\n    }\n};\n\nc3_chart_internal_fn.selectPoint = function (target, d, i) {\n    var $$ = this,\n        config = $$.config,\n        cx = (config.axis_rotated ? $$.circleY : $$.circleX).bind($$),\n        cy = (config.axis_rotated ? $$.circleX : $$.circleY).bind($$),\n        r = $$.pointSelectR.bind($$);\n    config.data_onselected.call($$.api, d, target.node());\n    // add selected-circle on low layer g\n    $$.main.select('.' + CLASS.selectedCircles + $$.getTargetSelectorSuffix(d.id)).selectAll('.' + CLASS.selectedCircle + '-' + i).data([d]).enter().append('circle').attr(\"class\", function () {\n        return $$.generateClass(CLASS.selectedCircle, i);\n    }).attr(\"cx\", cx).attr(\"cy\", cy).attr(\"stroke\", function () {\n        return $$.color(d);\n    }).attr(\"r\", function (d) {\n        return $$.pointSelectR(d) * 1.4;\n    }).transition().duration(100).attr(\"r\", r);\n};\nc3_chart_internal_fn.unselectPoint = function (target, d, i) {\n    var $$ = this;\n    $$.config.data_onunselected.call($$.api, d, target.node());\n    // remove selected-circle from low layer g\n    $$.main.select('.' + CLASS.selectedCircles + $$.getTargetSelectorSuffix(d.id)).selectAll('.' + CLASS.selectedCircle + '-' + i).transition().duration(100).attr('r', 0).remove();\n};\nc3_chart_internal_fn.togglePoint = function (selected, target, d, i) {\n    selected ? this.selectPoint(target, d, i) : this.unselectPoint(target, d, i);\n};\nc3_chart_internal_fn.selectPath = function (target, d) {\n    var $$ = this;\n    $$.config.data_onselected.call($$, d, target.node());\n    if ($$.config.interaction_brighten) {\n        target.transition().duration(100).style(\"fill\", function () {\n            return $$.d3.rgb($$.color(d)).brighter(0.75);\n        });\n    }\n};\nc3_chart_internal_fn.unselectPath = function (target, d) {\n    var $$ = this;\n    $$.config.data_onunselected.call($$, d, target.node());\n    if ($$.config.interaction_brighten) {\n        target.transition().duration(100).style(\"fill\", function () {\n            return $$.color(d);\n        });\n    }\n};\nc3_chart_internal_fn.togglePath = function (selected, target, d, i) {\n    selected ? this.selectPath(target, d, i) : this.unselectPath(target, d, i);\n};\nc3_chart_internal_fn.getToggle = function (that, d) {\n    var $$ = this,\n        toggle;\n    if (that.nodeName === 'circle') {\n        if ($$.isStepType(d)) {\n            // circle is hidden in step chart, so treat as within the click area\n            toggle = function toggle() {}; // TODO: how to select step chart?\n        } else {\n            toggle = $$.togglePoint;\n        }\n    } else if (that.nodeName === 'path') {\n        toggle = $$.togglePath;\n    }\n    return toggle;\n};\nc3_chart_internal_fn.toggleShape = function (that, d, i) {\n    var $$ = this,\n        d3 = $$.d3,\n        config = $$.config,\n        shape = d3.select(that),\n        isSelected = shape.classed(CLASS.SELECTED),\n        toggle = $$.getToggle(that, d).bind($$);\n\n    if (config.data_selection_enabled && config.data_selection_isselectable(d)) {\n        if (!config.data_selection_multiple) {\n            $$.main.selectAll('.' + CLASS.shapes + (config.data_selection_grouped ? $$.getTargetSelectorSuffix(d.id) : \"\")).selectAll('.' + CLASS.shape).each(function (d, i) {\n                var shape = d3.select(this);\n                if (shape.classed(CLASS.SELECTED)) {\n                    toggle(false, shape.classed(CLASS.SELECTED, false), d, i);\n                }\n            });\n        }\n        shape.classed(CLASS.SELECTED, !isSelected);\n        toggle(!isSelected, shape, d, i);\n    }\n};\n\nc3_chart_internal_fn.initBar = function () {\n    var $$ = this;\n    $$.main.select('.' + CLASS.chart).append(\"g\").attr(\"class\", CLASS.chartBars);\n};\nc3_chart_internal_fn.updateTargetsForBar = function (targets) {\n    var $$ = this,\n        config = $$.config,\n        mainBarUpdate,\n        mainBarEnter,\n        classChartBar = $$.classChartBar.bind($$),\n        classBars = $$.classBars.bind($$),\n        classFocus = $$.classFocus.bind($$);\n    mainBarUpdate = $$.main.select('.' + CLASS.chartBars).selectAll('.' + CLASS.chartBar).data(targets).attr('class', function (d) {\n        return classChartBar(d) + classFocus(d);\n    });\n    mainBarEnter = mainBarUpdate.enter().append('g').attr('class', classChartBar).style(\"pointer-events\", \"none\");\n    // Bars for each data\n    mainBarEnter.append('g').attr(\"class\", classBars).style(\"cursor\", function (d) {\n        return config.data_selection_isselectable(d) ? \"pointer\" : null;\n    });\n};\nc3_chart_internal_fn.updateBar = function (durationForExit) {\n    var $$ = this,\n        barData = $$.barData.bind($$),\n        classBar = $$.classBar.bind($$),\n        initialOpacity = $$.initialOpacity.bind($$),\n        color = function color(d) {\n        return $$.color(d.id);\n    };\n    $$.mainBar = $$.main.selectAll('.' + CLASS.bars).selectAll('.' + CLASS.bar).data(barData);\n    $$.mainBar.enter().append('path').attr(\"class\", classBar).style(\"stroke\", color).style(\"fill\", color);\n    $$.mainBar.style(\"opacity\", initialOpacity);\n    $$.mainBar.exit().transition().duration(durationForExit).remove();\n};\nc3_chart_internal_fn.redrawBar = function (drawBar, withTransition) {\n    return [(withTransition ? this.mainBar.transition(Math.random().toString()) : this.mainBar).attr('d', drawBar).style(\"stroke\", this.color).style(\"fill\", this.color).style(\"opacity\", 1)];\n};\nc3_chart_internal_fn.getBarW = function (axis, barTargetsNum) {\n    var $$ = this,\n        config = $$.config,\n        w = typeof config.bar_width === 'number' ? config.bar_width : barTargetsNum ? axis.tickInterval() * config.bar_width_ratio / barTargetsNum : 0;\n    return config.bar_width_max && w > config.bar_width_max ? config.bar_width_max : w;\n};\nc3_chart_internal_fn.getBars = function (i, id) {\n    var $$ = this;\n    return (id ? $$.main.selectAll('.' + CLASS.bars + $$.getTargetSelectorSuffix(id)) : $$.main).selectAll('.' + CLASS.bar + (isValue(i) ? '-' + i : ''));\n};\nc3_chart_internal_fn.expandBars = function (i, id, reset) {\n    var $$ = this;\n    if (reset) {\n        $$.unexpandBars();\n    }\n    $$.getBars(i, id).classed(CLASS.EXPANDED, true);\n};\nc3_chart_internal_fn.unexpandBars = function (i) {\n    var $$ = this;\n    $$.getBars(i).classed(CLASS.EXPANDED, false);\n};\nc3_chart_internal_fn.generateDrawBar = function (barIndices, isSub) {\n    var $$ = this,\n        config = $$.config,\n        getPoints = $$.generateGetBarPoints(barIndices, isSub);\n    return function (d, i) {\n        // 4 points that make a bar\n        var points = getPoints(d, i);\n\n        // switch points if axis is rotated, not applicable for sub chart\n        var indexX = config.axis_rotated ? 1 : 0;\n        var indexY = config.axis_rotated ? 0 : 1;\n\n        var path = 'M ' + points[0][indexX] + ',' + points[0][indexY] + ' ' + 'L' + points[1][indexX] + ',' + points[1][indexY] + ' ' + 'L' + points[2][indexX] + ',' + points[2][indexY] + ' ' + 'L' + points[3][indexX] + ',' + points[3][indexY] + ' ' + 'z';\n\n        return path;\n    };\n};\nc3_chart_internal_fn.generateGetBarPoints = function (barIndices, isSub) {\n    var $$ = this,\n        axis = isSub ? $$.subXAxis : $$.xAxis,\n        barTargetsNum = barIndices.__max__ + 1,\n        barW = $$.getBarW(axis, barTargetsNum),\n        barX = $$.getShapeX(barW, barTargetsNum, barIndices, !!isSub),\n        barY = $$.getShapeY(!!isSub),\n        barOffset = $$.getShapeOffset($$.isBarType, barIndices, !!isSub),\n        barSpaceOffset = barW * ($$.config.bar_space / 2),\n        yScale = isSub ? $$.getSubYScale : $$.getYScale;\n    return function (d, i) {\n        var y0 = yScale.call($$, d.id)(0),\n            offset = barOffset(d, i) || y0,\n            // offset is for stacked bar chart\n        posX = barX(d),\n            posY = barY(d);\n        // fix posY not to overflow opposite quadrant\n        if ($$.config.axis_rotated) {\n            if (0 < d.value && posY < y0 || d.value < 0 && y0 < posY) {\n                posY = y0;\n            }\n        }\n        // 4 points that make a bar\n        return [[posX + barSpaceOffset, offset], [posX + barSpaceOffset, posY - (y0 - offset)], [posX + barW - barSpaceOffset, posY - (y0 - offset)], [posX + barW - barSpaceOffset, offset]];\n    };\n};\nc3_chart_internal_fn.isWithinBar = function (that) {\n    var mouse = this.d3.mouse(that),\n        box = that.getBoundingClientRect(),\n        seg0 = that.pathSegList.getItem(0),\n        seg1 = that.pathSegList.getItem(1),\n        x = Math.min(seg0.x, seg1.x),\n        y = Math.min(seg0.y, seg1.y),\n        w = box.width,\n        h = box.height,\n        offset = 2,\n        sx = x - offset,\n        ex = x + w + offset,\n        sy = y + h + offset,\n        ey = y - offset;\n    return sx < mouse[0] && mouse[0] < ex && ey < mouse[1] && mouse[1] < sy;\n};\n\nc3_chart_internal_fn.getShapeIndices = function (typeFilter) {\n    var $$ = this,\n        config = $$.config,\n        indices = {},\n        i = 0,\n        j,\n        k;\n    $$.filterTargetsToShow($$.data.targets.filter(typeFilter, $$)).forEach(function (d) {\n        for (j = 0; j < config.data_groups.length; j++) {\n            if (config.data_groups[j].indexOf(d.id) < 0) {\n                continue;\n            }\n            for (k = 0; k < config.data_groups[j].length; k++) {\n                if (config.data_groups[j][k] in indices) {\n                    indices[d.id] = indices[config.data_groups[j][k]];\n                    break;\n                }\n            }\n        }\n        if (isUndefined(indices[d.id])) {\n            indices[d.id] = i++;\n        }\n    });\n    indices.__max__ = i - 1;\n    return indices;\n};\nc3_chart_internal_fn.getShapeX = function (offset, targetsNum, indices, isSub) {\n    var $$ = this,\n        scale = isSub ? $$.subX : $$.x;\n    return function (d) {\n        var index = d.id in indices ? indices[d.id] : 0;\n        return d.x || d.x === 0 ? scale(d.x) - offset * (targetsNum / 2 - index) : 0;\n    };\n};\nc3_chart_internal_fn.getShapeY = function (isSub) {\n    var $$ = this;\n    return function (d) {\n        var scale = isSub ? $$.getSubYScale(d.id) : $$.getYScale(d.id);\n        return scale(d.value);\n    };\n};\nc3_chart_internal_fn.getShapeOffset = function (typeFilter, indices, isSub) {\n    var $$ = this,\n        targets = $$.orderTargets($$.filterTargetsToShow($$.data.targets.filter(typeFilter, $$))),\n        targetIds = targets.map(function (t) {\n        return t.id;\n    });\n    return function (d, i) {\n        var scale = isSub ? $$.getSubYScale(d.id) : $$.getYScale(d.id),\n            y0 = scale(0),\n            offset = y0;\n        targets.forEach(function (t) {\n            var values = $$.isStepType(d) ? $$.convertValuesToStep(t.values) : t.values;\n            if (t.id === d.id || indices[t.id] !== indices[d.id]) {\n                return;\n            }\n            if (targetIds.indexOf(t.id) < targetIds.indexOf(d.id)) {\n                // check if the x values line up\n                if (typeof values[i] === 'undefined' || +values[i].x !== +d.x) {\n                    // \"+\" for timeseries\n                    // if not, try to find the value that does line up\n                    i = -1;\n                    values.forEach(function (v, j) {\n                        if (v.x === d.x) {\n                            i = j;\n                        }\n                    });\n                }\n                if (i in values && values[i].value * d.value >= 0) {\n                    offset += scale(values[i].value) - y0;\n                }\n            }\n        });\n        return offset;\n    };\n};\nc3_chart_internal_fn.isWithinShape = function (that, d) {\n    var $$ = this,\n        shape = $$.d3.select(that),\n        isWithin;\n    if (!$$.isTargetToShow(d.id)) {\n        isWithin = false;\n    } else if (that.nodeName === 'circle') {\n        isWithin = $$.isStepType(d) ? $$.isWithinStep(that, $$.getYScale(d.id)(d.value)) : $$.isWithinCircle(that, $$.pointSelectR(d) * 1.5);\n    } else if (that.nodeName === 'path') {\n        isWithin = shape.classed(CLASS.bar) ? $$.isWithinBar(that) : true;\n    }\n    return isWithin;\n};\n\nc3_chart_internal_fn.getInterpolate = function (d) {\n    var $$ = this,\n        interpolation = $$.isInterpolationType($$.config.spline_interpolation_type) ? $$.config.spline_interpolation_type : 'cardinal';\n    return $$.isSplineType(d) ? interpolation : $$.isStepType(d) ? $$.config.line_step_type : \"linear\";\n};\n\nc3_chart_internal_fn.initLine = function () {\n    var $$ = this;\n    $$.main.select('.' + CLASS.chart).append(\"g\").attr(\"class\", CLASS.chartLines);\n};\nc3_chart_internal_fn.updateTargetsForLine = function (targets) {\n    var $$ = this,\n        config = $$.config,\n        mainLineUpdate,\n        mainLineEnter,\n        classChartLine = $$.classChartLine.bind($$),\n        classLines = $$.classLines.bind($$),\n        classAreas = $$.classAreas.bind($$),\n        classCircles = $$.classCircles.bind($$),\n        classFocus = $$.classFocus.bind($$);\n    mainLineUpdate = $$.main.select('.' + CLASS.chartLines).selectAll('.' + CLASS.chartLine).data(targets).attr('class', function (d) {\n        return classChartLine(d) + classFocus(d);\n    });\n    mainLineEnter = mainLineUpdate.enter().append('g').attr('class', classChartLine).style('opacity', 0).style(\"pointer-events\", \"none\");\n    // Lines for each data\n    mainLineEnter.append('g').attr(\"class\", classLines);\n    // Areas\n    mainLineEnter.append('g').attr('class', classAreas);\n    // Circles for each data point on lines\n    mainLineEnter.append('g').attr(\"class\", function (d) {\n        return $$.generateClass(CLASS.selectedCircles, d.id);\n    });\n    mainLineEnter.append('g').attr(\"class\", classCircles).style(\"cursor\", function (d) {\n        return config.data_selection_isselectable(d) ? \"pointer\" : null;\n    });\n    // Update date for selected circles\n    targets.forEach(function (t) {\n        $$.main.selectAll('.' + CLASS.selectedCircles + $$.getTargetSelectorSuffix(t.id)).selectAll('.' + CLASS.selectedCircle).each(function (d) {\n            d.value = t.values[d.index].value;\n        });\n    });\n    // MEMO: can not keep same color...\n    //mainLineUpdate.exit().remove();\n};\nc3_chart_internal_fn.updateLine = function (durationForExit) {\n    var $$ = this;\n    $$.mainLine = $$.main.selectAll('.' + CLASS.lines).selectAll('.' + CLASS.line).data($$.lineData.bind($$));\n    $$.mainLine.enter().append('path').attr('class', $$.classLine.bind($$)).style(\"stroke\", $$.color);\n    $$.mainLine.style(\"opacity\", $$.initialOpacity.bind($$)).style('shape-rendering', function (d) {\n        return $$.isStepType(d) ? 'crispEdges' : '';\n    }).attr('transform', null);\n    $$.mainLine.exit().transition().duration(durationForExit).style('opacity', 0).remove();\n};\nc3_chart_internal_fn.redrawLine = function (drawLine, withTransition) {\n    return [(withTransition ? this.mainLine.transition(Math.random().toString()) : this.mainLine).attr(\"d\", drawLine).style(\"stroke\", this.color).style(\"opacity\", 1)];\n};\nc3_chart_internal_fn.generateDrawLine = function (lineIndices, isSub) {\n    var $$ = this,\n        config = $$.config,\n        line = $$.d3.svg.line(),\n        getPoints = $$.generateGetLinePoints(lineIndices, isSub),\n        yScaleGetter = isSub ? $$.getSubYScale : $$.getYScale,\n        xValue = function xValue(d) {\n        return (isSub ? $$.subxx : $$.xx).call($$, d);\n    },\n        yValue = function yValue(d, i) {\n        return config.data_groups.length > 0 ? getPoints(d, i)[0][1] : yScaleGetter.call($$, d.id)(d.value);\n    };\n\n    line = config.axis_rotated ? line.x(yValue).y(xValue) : line.x(xValue).y(yValue);\n    if (!config.line_connectNull) {\n        line = line.defined(function (d) {\n            return d.value != null;\n        });\n    }\n    return function (d) {\n        var values = config.line_connectNull ? $$.filterRemoveNull(d.values) : d.values,\n            x = isSub ? $$.x : $$.subX,\n            y = yScaleGetter.call($$, d.id),\n            x0 = 0,\n            y0 = 0,\n            path;\n        if ($$.isLineType(d)) {\n            if (config.data_regions[d.id]) {\n                path = $$.lineWithRegions(values, x, y, config.data_regions[d.id]);\n            } else {\n                if ($$.isStepType(d)) {\n                    values = $$.convertValuesToStep(values);\n                }\n                path = line.interpolate($$.getInterpolate(d))(values);\n            }\n        } else {\n            if (values[0]) {\n                x0 = x(values[0].x);\n                y0 = y(values[0].value);\n            }\n            path = config.axis_rotated ? \"M \" + y0 + \" \" + x0 : \"M \" + x0 + \" \" + y0;\n        }\n        return path ? path : \"M 0 0\";\n    };\n};\nc3_chart_internal_fn.generateGetLinePoints = function (lineIndices, isSub) {\n    // partial duplication of generateGetBarPoints\n    var $$ = this,\n        config = $$.config,\n        lineTargetsNum = lineIndices.__max__ + 1,\n        x = $$.getShapeX(0, lineTargetsNum, lineIndices, !!isSub),\n        y = $$.getShapeY(!!isSub),\n        lineOffset = $$.getShapeOffset($$.isLineType, lineIndices, !!isSub),\n        yScale = isSub ? $$.getSubYScale : $$.getYScale;\n    return function (d, i) {\n        var y0 = yScale.call($$, d.id)(0),\n            offset = lineOffset(d, i) || y0,\n            // offset is for stacked area chart\n        posX = x(d),\n            posY = y(d);\n        // fix posY not to overflow opposite quadrant\n        if (config.axis_rotated) {\n            if (0 < d.value && posY < y0 || d.value < 0 && y0 < posY) {\n                posY = y0;\n            }\n        }\n        // 1 point that marks the line position\n        return [[posX, posY - (y0 - offset)], [posX, posY - (y0 - offset)], // needed for compatibility\n        [posX, posY - (y0 - offset)], // needed for compatibility\n        [posX, posY - (y0 - offset)] // needed for compatibility\n        ];\n    };\n};\n\nc3_chart_internal_fn.lineWithRegions = function (d, x, y, _regions) {\n    var $$ = this,\n        config = $$.config,\n        prev = -1,\n        i,\n        j,\n        s = \"M\",\n        sWithRegion,\n        xp,\n        yp,\n        dx,\n        dy,\n        dd,\n        diff,\n        diffx2,\n        xOffset = $$.isCategorized() ? 0.5 : 0,\n        xValue,\n        yValue,\n        regions = [];\n\n    function isWithinRegions(x, regions) {\n        var i;\n        for (i = 0; i < regions.length; i++) {\n            if (regions[i].start < x && x <= regions[i].end) {\n                return true;\n            }\n        }\n        return false;\n    }\n\n    // Check start/end of regions\n    if (isDefined(_regions)) {\n        for (i = 0; i < _regions.length; i++) {\n            regions[i] = {};\n            if (isUndefined(_regions[i].start)) {\n                regions[i].start = d[0].x;\n            } else {\n                regions[i].start = $$.isTimeSeries() ? $$.parseDate(_regions[i].start) : _regions[i].start;\n            }\n            if (isUndefined(_regions[i].end)) {\n                regions[i].end = d[d.length - 1].x;\n            } else {\n                regions[i].end = $$.isTimeSeries() ? $$.parseDate(_regions[i].end) : _regions[i].end;\n            }\n        }\n    }\n\n    // Set scales\n    xValue = config.axis_rotated ? function (d) {\n        return y(d.value);\n    } : function (d) {\n        return x(d.x);\n    };\n    yValue = config.axis_rotated ? function (d) {\n        return x(d.x);\n    } : function (d) {\n        return y(d.value);\n    };\n\n    // Define svg generator function for region\n    function generateM(points) {\n        return 'M' + points[0][0] + ' ' + points[0][1] + ' ' + points[1][0] + ' ' + points[1][1];\n    }\n    if ($$.isTimeSeries()) {\n        sWithRegion = function sWithRegion(d0, d1, j, diff) {\n            var x0 = d0.x.getTime(),\n                x_diff = d1.x - d0.x,\n                xv0 = new Date(x0 + x_diff * j),\n                xv1 = new Date(x0 + x_diff * (j + diff)),\n                points;\n            if (config.axis_rotated) {\n                points = [[y(yp(j)), x(xv0)], [y(yp(j + diff)), x(xv1)]];\n            } else {\n                points = [[x(xv0), y(yp(j))], [x(xv1), y(yp(j + diff))]];\n            }\n            return generateM(points);\n        };\n    } else {\n        sWithRegion = function sWithRegion(d0, d1, j, diff) {\n            var points;\n            if (config.axis_rotated) {\n                points = [[y(yp(j), true), x(xp(j))], [y(yp(j + diff), true), x(xp(j + diff))]];\n            } else {\n                points = [[x(xp(j), true), y(yp(j))], [x(xp(j + diff), true), y(yp(j + diff))]];\n            }\n            return generateM(points);\n        };\n    }\n\n    // Generate\n    for (i = 0; i < d.length; i++) {\n\n        // Draw as normal\n        if (isUndefined(regions) || !isWithinRegions(d[i].x, regions)) {\n            s += \" \" + xValue(d[i]) + \" \" + yValue(d[i]);\n        }\n        // Draw with region // TODO: Fix for horizotal charts\n        else {\n                xp = $$.getScale(d[i - 1].x + xOffset, d[i].x + xOffset, $$.isTimeSeries());\n                yp = $$.getScale(d[i - 1].value, d[i].value);\n\n                dx = x(d[i].x) - x(d[i - 1].x);\n                dy = y(d[i].value) - y(d[i - 1].value);\n                dd = Math.sqrt(Math.pow(dx, 2) + Math.pow(dy, 2));\n                diff = 2 / dd;\n                diffx2 = diff * 2;\n\n                for (j = diff; j <= 1; j += diffx2) {\n                    s += sWithRegion(d[i - 1], d[i], j, diff);\n                }\n            }\n        prev = d[i].x;\n    }\n\n    return s;\n};\n\nc3_chart_internal_fn.updateArea = function (durationForExit) {\n    var $$ = this,\n        d3 = $$.d3;\n    $$.mainArea = $$.main.selectAll('.' + CLASS.areas).selectAll('.' + CLASS.area).data($$.lineData.bind($$));\n    $$.mainArea.enter().append('path').attr(\"class\", $$.classArea.bind($$)).style(\"fill\", $$.color).style(\"opacity\", function () {\n        $$.orgAreaOpacity = +d3.select(this).style('opacity');return 0;\n    });\n    $$.mainArea.style(\"opacity\", $$.orgAreaOpacity);\n    $$.mainArea.exit().transition().duration(durationForExit).style('opacity', 0).remove();\n};\nc3_chart_internal_fn.redrawArea = function (drawArea, withTransition) {\n    return [(withTransition ? this.mainArea.transition(Math.random().toString()) : this.mainArea).attr(\"d\", drawArea).style(\"fill\", this.color).style(\"opacity\", this.orgAreaOpacity)];\n};\nc3_chart_internal_fn.generateDrawArea = function (areaIndices, isSub) {\n    var $$ = this,\n        config = $$.config,\n        area = $$.d3.svg.area(),\n        getPoints = $$.generateGetAreaPoints(areaIndices, isSub),\n        yScaleGetter = isSub ? $$.getSubYScale : $$.getYScale,\n        xValue = function xValue(d) {\n        return (isSub ? $$.subxx : $$.xx).call($$, d);\n    },\n        value0 = function value0(d, i) {\n        return config.data_groups.length > 0 ? getPoints(d, i)[0][1] : yScaleGetter.call($$, d.id)($$.getAreaBaseValue(d.id));\n    },\n        value1 = function value1(d, i) {\n        return config.data_groups.length > 0 ? getPoints(d, i)[1][1] : yScaleGetter.call($$, d.id)(d.value);\n    };\n\n    area = config.axis_rotated ? area.x0(value0).x1(value1).y(xValue) : area.x(xValue).y0(config.area_above ? 0 : value0).y1(value1);\n    if (!config.line_connectNull) {\n        area = area.defined(function (d) {\n            return d.value !== null;\n        });\n    }\n\n    return function (d) {\n        var values = config.line_connectNull ? $$.filterRemoveNull(d.values) : d.values,\n            x0 = 0,\n            y0 = 0,\n            path;\n        if ($$.isAreaType(d)) {\n            if ($$.isStepType(d)) {\n                values = $$.convertValuesToStep(values);\n            }\n            path = area.interpolate($$.getInterpolate(d))(values);\n        } else {\n            if (values[0]) {\n                x0 = $$.x(values[0].x);\n                y0 = $$.getYScale(d.id)(values[0].value);\n            }\n            path = config.axis_rotated ? \"M \" + y0 + \" \" + x0 : \"M \" + x0 + \" \" + y0;\n        }\n        return path ? path : \"M 0 0\";\n    };\n};\nc3_chart_internal_fn.getAreaBaseValue = function () {\n    return 0;\n};\nc3_chart_internal_fn.generateGetAreaPoints = function (areaIndices, isSub) {\n    // partial duplication of generateGetBarPoints\n    var $$ = this,\n        config = $$.config,\n        areaTargetsNum = areaIndices.__max__ + 1,\n        x = $$.getShapeX(0, areaTargetsNum, areaIndices, !!isSub),\n        y = $$.getShapeY(!!isSub),\n        areaOffset = $$.getShapeOffset($$.isAreaType, areaIndices, !!isSub),\n        yScale = isSub ? $$.getSubYScale : $$.getYScale;\n    return function (d, i) {\n        var y0 = yScale.call($$, d.id)(0),\n            offset = areaOffset(d, i) || y0,\n            // offset is for stacked area chart\n        posX = x(d),\n            posY = y(d);\n        // fix posY not to overflow opposite quadrant\n        if (config.axis_rotated) {\n            if (0 < d.value && posY < y0 || d.value < 0 && y0 < posY) {\n                posY = y0;\n            }\n        }\n        // 1 point that marks the area position\n        return [[posX, offset], [posX, posY - (y0 - offset)], [posX, posY - (y0 - offset)], // needed for compatibility\n        [posX, offset] // needed for compatibility\n        ];\n    };\n};\n\nc3_chart_internal_fn.updateCircle = function () {\n    var $$ = this;\n    $$.mainCircle = $$.main.selectAll('.' + CLASS.circles).selectAll('.' + CLASS.circle).data($$.lineOrScatterData.bind($$));\n    $$.mainCircle.enter().append(\"circle\").attr(\"class\", $$.classCircle.bind($$)).attr(\"r\", $$.pointR.bind($$)).style(\"fill\", $$.color);\n    $$.mainCircle.style(\"opacity\", $$.initialOpacityForCircle.bind($$));\n    $$.mainCircle.exit().remove();\n};\nc3_chart_internal_fn.redrawCircle = function (cx, cy, withTransition) {\n    var selectedCircles = this.main.selectAll('.' + CLASS.selectedCircle);\n    return [(withTransition ? this.mainCircle.transition(Math.random().toString()) : this.mainCircle).style('opacity', this.opacityForCircle.bind(this)).style(\"fill\", this.color).attr(\"cx\", cx).attr(\"cy\", cy), (withTransition ? selectedCircles.transition(Math.random().toString()) : selectedCircles).attr(\"cx\", cx).attr(\"cy\", cy)];\n};\nc3_chart_internal_fn.circleX = function (d) {\n    return d.x || d.x === 0 ? this.x(d.x) : null;\n};\nc3_chart_internal_fn.updateCircleY = function () {\n    var $$ = this,\n        lineIndices,\n        getPoints;\n    if ($$.config.data_groups.length > 0) {\n        lineIndices = $$.getShapeIndices($$.isLineType), getPoints = $$.generateGetLinePoints(lineIndices);\n        $$.circleY = function (d, i) {\n            return getPoints(d, i)[0][1];\n        };\n    } else {\n        $$.circleY = function (d) {\n            return $$.getYScale(d.id)(d.value);\n        };\n    }\n};\nc3_chart_internal_fn.getCircles = function (i, id) {\n    var $$ = this;\n    return (id ? $$.main.selectAll('.' + CLASS.circles + $$.getTargetSelectorSuffix(id)) : $$.main).selectAll('.' + CLASS.circle + (isValue(i) ? '-' + i : ''));\n};\nc3_chart_internal_fn.expandCircles = function (i, id, reset) {\n    var $$ = this,\n        r = $$.pointExpandedR.bind($$);\n    if (reset) {\n        $$.unexpandCircles();\n    }\n    $$.getCircles(i, id).classed(CLASS.EXPANDED, true).attr('r', r);\n};\nc3_chart_internal_fn.unexpandCircles = function (i) {\n    var $$ = this,\n        r = $$.pointR.bind($$);\n    $$.getCircles(i).filter(function () {\n        return $$.d3.select(this).classed(CLASS.EXPANDED);\n    }).classed(CLASS.EXPANDED, false).attr('r', r);\n};\nc3_chart_internal_fn.pointR = function (d) {\n    var $$ = this,\n        config = $$.config;\n    return $$.isStepType(d) ? 0 : isFunction(config.point_r) ? config.point_r(d) : config.point_r;\n};\nc3_chart_internal_fn.pointExpandedR = function (d) {\n    var $$ = this,\n        config = $$.config;\n    if (config.point_focus_expand_enabled) {\n        return isFunction(config.point_focus_expand_r) ? config.point_focus_expand_r(d) : config.point_focus_expand_r ? config.point_focus_expand_r : $$.pointR(d) * 1.75;\n    } else {\n        return $$.pointR(d);\n    }\n};\nc3_chart_internal_fn.pointSelectR = function (d) {\n    var $$ = this,\n        config = $$.config;\n    return isFunction(config.point_select_r) ? config.point_select_r(d) : config.point_select_r ? config.point_select_r : $$.pointR(d) * 4;\n};\nc3_chart_internal_fn.isWithinCircle = function (that, r) {\n    var d3 = this.d3,\n        mouse = d3.mouse(that),\n        d3_this = d3.select(that),\n        cx = +d3_this.attr(\"cx\"),\n        cy = +d3_this.attr(\"cy\");\n    return Math.sqrt(Math.pow(cx - mouse[0], 2) + Math.pow(cy - mouse[1], 2)) < r;\n};\nc3_chart_internal_fn.isWithinStep = function (that, y) {\n    return Math.abs(y - this.d3.mouse(that)[1]) < 30;\n};\n\nc3_chart_internal_fn.getCurrentWidth = function () {\n    var $$ = this,\n        config = $$.config;\n    return config.size_width ? config.size_width : $$.getParentWidth();\n};\nc3_chart_internal_fn.getCurrentHeight = function () {\n    var $$ = this,\n        config = $$.config,\n        h = config.size_height ? config.size_height : $$.getParentHeight();\n    return h > 0 ? h : 320 / ($$.hasType('gauge') && !config.gauge_fullCircle ? 2 : 1);\n};\nc3_chart_internal_fn.getCurrentPaddingTop = function () {\n    var $$ = this,\n        config = $$.config,\n        padding = isValue(config.padding_top) ? config.padding_top : 0;\n    if ($$.title && $$.title.node()) {\n        padding += $$.getTitlePadding();\n    }\n    return padding;\n};\nc3_chart_internal_fn.getCurrentPaddingBottom = function () {\n    var config = this.config;\n    return isValue(config.padding_bottom) ? config.padding_bottom : 0;\n};\nc3_chart_internal_fn.getCurrentPaddingLeft = function (withoutRecompute) {\n    var $$ = this,\n        config = $$.config;\n    if (isValue(config.padding_left)) {\n        return config.padding_left;\n    } else if (config.axis_rotated) {\n        return !config.axis_x_show ? 1 : Math.max(ceil10($$.getAxisWidthByAxisId('x', withoutRecompute)), 40);\n    } else if (!config.axis_y_show || config.axis_y_inner) {\n        // && !config.axis_rotated\n        return $$.axis.getYAxisLabelPosition().isOuter ? 30 : 1;\n    } else {\n        return ceil10($$.getAxisWidthByAxisId('y', withoutRecompute));\n    }\n};\nc3_chart_internal_fn.getCurrentPaddingRight = function () {\n    var $$ = this,\n        config = $$.config,\n        defaultPadding = 10,\n        legendWidthOnRight = $$.isLegendRight ? $$.getLegendWidth() + 20 : 0;\n    if (isValue(config.padding_right)) {\n        return config.padding_right + 1; // 1 is needed not to hide tick line\n    } else if (config.axis_rotated) {\n        return defaultPadding + legendWidthOnRight;\n    } else if (!config.axis_y2_show || config.axis_y2_inner) {\n        // && !config.axis_rotated\n        return 2 + legendWidthOnRight + ($$.axis.getY2AxisLabelPosition().isOuter ? 20 : 0);\n    } else {\n        return ceil10($$.getAxisWidthByAxisId('y2')) + legendWidthOnRight;\n    }\n};\n\nc3_chart_internal_fn.getParentRectValue = function (key) {\n    var parent = this.selectChart.node(),\n        v;\n    while (parent && parent.tagName !== 'BODY') {\n        try {\n            v = parent.getBoundingClientRect()[key];\n        } catch (e) {\n            if (key === 'width') {\n                // In IE in certain cases getBoundingClientRect\n                // will cause an \"unspecified error\"\n                v = parent.offsetWidth;\n            }\n        }\n        if (v) {\n            break;\n        }\n        parent = parent.parentNode;\n    }\n    return v;\n};\nc3_chart_internal_fn.getParentWidth = function () {\n    return this.getParentRectValue('width');\n};\nc3_chart_internal_fn.getParentHeight = function () {\n    var h = this.selectChart.style('height');\n    return h.indexOf('px') > 0 ? +h.replace('px', '') : 0;\n};\n\nc3_chart_internal_fn.getSvgLeft = function (withoutRecompute) {\n    var $$ = this,\n        config = $$.config,\n        hasLeftAxisRect = config.axis_rotated || !config.axis_rotated && !config.axis_y_inner,\n        leftAxisClass = config.axis_rotated ? CLASS.axisX : CLASS.axisY,\n        leftAxis = $$.main.select('.' + leftAxisClass).node(),\n        svgRect = leftAxis && hasLeftAxisRect ? leftAxis.getBoundingClientRect() : { right: 0 },\n        chartRect = $$.selectChart.node().getBoundingClientRect(),\n        hasArc = $$.hasArcType(),\n        svgLeft = svgRect.right - chartRect.left - (hasArc ? 0 : $$.getCurrentPaddingLeft(withoutRecompute));\n    return svgLeft > 0 ? svgLeft : 0;\n};\n\nc3_chart_internal_fn.getAxisWidthByAxisId = function (id, withoutRecompute) {\n    var $$ = this,\n        position = $$.axis.getLabelPositionById(id);\n    return $$.axis.getMaxTickWidth(id, withoutRecompute) + (position.isInner ? 20 : 40);\n};\nc3_chart_internal_fn.getHorizontalAxisHeight = function (axisId) {\n    var $$ = this,\n        config = $$.config,\n        h = 30;\n    if (axisId === 'x' && !config.axis_x_show) {\n        return 8;\n    }\n    if (axisId === 'x' && config.axis_x_height) {\n        return config.axis_x_height;\n    }\n    if (axisId === 'y' && !config.axis_y_show) {\n        return config.legend_show && !$$.isLegendRight && !$$.isLegendInset ? 10 : 1;\n    }\n    if (axisId === 'y2' && !config.axis_y2_show) {\n        return $$.rotated_padding_top;\n    }\n    // Calculate x axis height when tick rotated\n    if (axisId === 'x' && !config.axis_rotated && config.axis_x_tick_rotate) {\n        h = 30 + $$.axis.getMaxTickWidth(axisId) * Math.cos(Math.PI * (90 - config.axis_x_tick_rotate) / 180);\n    }\n    // Calculate y axis height when tick rotated\n    if (axisId === 'y' && config.axis_rotated && config.axis_y_tick_rotate) {\n        h = 30 + $$.axis.getMaxTickWidth(axisId) * Math.cos(Math.PI * (90 - config.axis_y_tick_rotate) / 180);\n    }\n    return h + ($$.axis.getLabelPositionById(axisId).isInner ? 0 : 10) + (axisId === 'y2' ? -10 : 0);\n};\n\nc3_chart_internal_fn.getEventRectWidth = function () {\n    return Math.max(0, this.xAxis.tickInterval());\n};\n\nc3_chart_internal_fn.initBrush = function () {\n    var $$ = this,\n        d3 = $$.d3;\n    $$.brush = d3.svg.brush().on(\"brush\", function () {\n        $$.redrawForBrush();\n    });\n    $$.brush.update = function () {\n        if ($$.context) {\n            $$.context.select('.' + CLASS.brush).call(this);\n        }\n        return this;\n    };\n    $$.brush.scale = function (scale) {\n        return $$.config.axis_rotated ? this.y(scale) : this.x(scale);\n    };\n};\nc3_chart_internal_fn.initSubchart = function () {\n    var $$ = this,\n        config = $$.config,\n        context = $$.context = $$.svg.append(\"g\").attr(\"transform\", $$.getTranslate('context')),\n        visibility = config.subchart_show ? 'visible' : 'hidden';\n\n    context.style('visibility', visibility);\n\n    // Define g for chart area\n    context.append('g').attr(\"clip-path\", $$.clipPathForSubchart).attr('class', CLASS.chart);\n\n    // Define g for bar chart area\n    context.select('.' + CLASS.chart).append(\"g\").attr(\"class\", CLASS.chartBars);\n\n    // Define g for line chart area\n    context.select('.' + CLASS.chart).append(\"g\").attr(\"class\", CLASS.chartLines);\n\n    // Add extent rect for Brush\n    context.append(\"g\").attr(\"clip-path\", $$.clipPath).attr(\"class\", CLASS.brush).call($$.brush);\n\n    // ATTENTION: This must be called AFTER chart added\n    // Add Axis\n    $$.axes.subx = context.append(\"g\").attr(\"class\", CLASS.axisX).attr(\"transform\", $$.getTranslate('subx')).attr(\"clip-path\", config.axis_rotated ? \"\" : $$.clipPathForXAxis).style(\"visibility\", config.subchart_axis_x_show ? visibility : 'hidden');\n};\nc3_chart_internal_fn.updateTargetsForSubchart = function (targets) {\n    var $$ = this,\n        context = $$.context,\n        config = $$.config,\n        contextLineEnter,\n        contextLineUpdate,\n        contextBarEnter,\n        contextBarUpdate,\n        classChartBar = $$.classChartBar.bind($$),\n        classBars = $$.classBars.bind($$),\n        classChartLine = $$.classChartLine.bind($$),\n        classLines = $$.classLines.bind($$),\n        classAreas = $$.classAreas.bind($$);\n\n    if (config.subchart_show) {\n        //-- Bar --//\n        contextBarUpdate = context.select('.' + CLASS.chartBars).selectAll('.' + CLASS.chartBar).data(targets).attr('class', classChartBar);\n        contextBarEnter = contextBarUpdate.enter().append('g').style('opacity', 0).attr('class', classChartBar);\n        // Bars for each data\n        contextBarEnter.append('g').attr(\"class\", classBars);\n\n        //-- Line --//\n        contextLineUpdate = context.select('.' + CLASS.chartLines).selectAll('.' + CLASS.chartLine).data(targets).attr('class', classChartLine);\n        contextLineEnter = contextLineUpdate.enter().append('g').style('opacity', 0).attr('class', classChartLine);\n        // Lines for each data\n        contextLineEnter.append(\"g\").attr(\"class\", classLines);\n        // Area\n        contextLineEnter.append(\"g\").attr(\"class\", classAreas);\n\n        //-- Brush --//\n        context.selectAll('.' + CLASS.brush + ' rect').attr(config.axis_rotated ? \"width\" : \"height\", config.axis_rotated ? $$.width2 : $$.height2);\n    }\n};\nc3_chart_internal_fn.updateBarForSubchart = function (durationForExit) {\n    var $$ = this;\n    $$.contextBar = $$.context.selectAll('.' + CLASS.bars).selectAll('.' + CLASS.bar).data($$.barData.bind($$));\n    $$.contextBar.enter().append('path').attr(\"class\", $$.classBar.bind($$)).style(\"stroke\", 'none').style(\"fill\", $$.color);\n    $$.contextBar.style(\"opacity\", $$.initialOpacity.bind($$));\n    $$.contextBar.exit().transition().duration(durationForExit).style('opacity', 0).remove();\n};\nc3_chart_internal_fn.redrawBarForSubchart = function (drawBarOnSub, withTransition, duration) {\n    (withTransition ? this.contextBar.transition(Math.random().toString()).duration(duration) : this.contextBar).attr('d', drawBarOnSub).style('opacity', 1);\n};\nc3_chart_internal_fn.updateLineForSubchart = function (durationForExit) {\n    var $$ = this;\n    $$.contextLine = $$.context.selectAll('.' + CLASS.lines).selectAll('.' + CLASS.line).data($$.lineData.bind($$));\n    $$.contextLine.enter().append('path').attr('class', $$.classLine.bind($$)).style('stroke', $$.color);\n    $$.contextLine.style(\"opacity\", $$.initialOpacity.bind($$));\n    $$.contextLine.exit().transition().duration(durationForExit).style('opacity', 0).remove();\n};\nc3_chart_internal_fn.redrawLineForSubchart = function (drawLineOnSub, withTransition, duration) {\n    (withTransition ? this.contextLine.transition(Math.random().toString()).duration(duration) : this.contextLine).attr(\"d\", drawLineOnSub).style('opacity', 1);\n};\nc3_chart_internal_fn.updateAreaForSubchart = function (durationForExit) {\n    var $$ = this,\n        d3 = $$.d3;\n    $$.contextArea = $$.context.selectAll('.' + CLASS.areas).selectAll('.' + CLASS.area).data($$.lineData.bind($$));\n    $$.contextArea.enter().append('path').attr(\"class\", $$.classArea.bind($$)).style(\"fill\", $$.color).style(\"opacity\", function () {\n        $$.orgAreaOpacity = +d3.select(this).style('opacity');return 0;\n    });\n    $$.contextArea.style(\"opacity\", 0);\n    $$.contextArea.exit().transition().duration(durationForExit).style('opacity', 0).remove();\n};\nc3_chart_internal_fn.redrawAreaForSubchart = function (drawAreaOnSub, withTransition, duration) {\n    (withTransition ? this.contextArea.transition(Math.random().toString()).duration(duration) : this.contextArea).attr(\"d\", drawAreaOnSub).style(\"fill\", this.color).style(\"opacity\", this.orgAreaOpacity);\n};\nc3_chart_internal_fn.redrawSubchart = function (withSubchart, transitions, duration, durationForExit, areaIndices, barIndices, lineIndices) {\n    var $$ = this,\n        d3 = $$.d3,\n        config = $$.config,\n        drawAreaOnSub,\n        drawBarOnSub,\n        drawLineOnSub;\n\n    $$.context.style('visibility', config.subchart_show ? 'visible' : 'hidden');\n\n    // subchart\n    if (config.subchart_show) {\n        // reflect main chart to extent on subchart if zoomed\n        if (d3.event && d3.event.type === 'zoom') {\n            $$.brush.extent($$.x.orgDomain()).update();\n        }\n        // update subchart elements if needed\n        if (withSubchart) {\n\n            // extent rect\n            if (!$$.brush.empty()) {\n                $$.brush.extent($$.x.orgDomain()).update();\n            }\n            // setup drawer - MEMO: this must be called after axis updated\n            drawAreaOnSub = $$.generateDrawArea(areaIndices, true);\n            drawBarOnSub = $$.generateDrawBar(barIndices, true);\n            drawLineOnSub = $$.generateDrawLine(lineIndices, true);\n\n            $$.updateBarForSubchart(duration);\n            $$.updateLineForSubchart(duration);\n            $$.updateAreaForSubchart(duration);\n\n            $$.redrawBarForSubchart(drawBarOnSub, duration, duration);\n            $$.redrawLineForSubchart(drawLineOnSub, duration, duration);\n            $$.redrawAreaForSubchart(drawAreaOnSub, duration, duration);\n        }\n    }\n};\nc3_chart_internal_fn.redrawForBrush = function () {\n    var $$ = this,\n        x = $$.x;\n    $$.redraw({\n        withTransition: false,\n        withY: $$.config.zoom_rescale,\n        withSubchart: false,\n        withUpdateXDomain: true,\n        withDimension: false\n    });\n    $$.config.subchart_onbrush.call($$.api, x.orgDomain());\n};\nc3_chart_internal_fn.transformContext = function (withTransition, transitions) {\n    var $$ = this,\n        subXAxis;\n    if (transitions && transitions.axisSubX) {\n        subXAxis = transitions.axisSubX;\n    } else {\n        subXAxis = $$.context.select('.' + CLASS.axisX);\n        if (withTransition) {\n            subXAxis = subXAxis.transition();\n        }\n    }\n    $$.context.attr(\"transform\", $$.getTranslate('context'));\n    subXAxis.attr(\"transform\", $$.getTranslate('subx'));\n};\nc3_chart_internal_fn.getDefaultExtent = function () {\n    var $$ = this,\n        config = $$.config,\n        extent = isFunction(config.axis_x_extent) ? config.axis_x_extent($$.getXDomain($$.data.targets)) : config.axis_x_extent;\n    if ($$.isTimeSeries()) {\n        extent = [$$.parseDate(extent[0]), $$.parseDate(extent[1])];\n    }\n    return extent;\n};\n\nc3_chart_internal_fn.initText = function () {\n    var $$ = this;\n    $$.main.select('.' + CLASS.chart).append(\"g\").attr(\"class\", CLASS.chartTexts);\n    $$.mainText = $$.d3.selectAll([]);\n};\nc3_chart_internal_fn.updateTargetsForText = function (targets) {\n    var $$ = this,\n        mainTextUpdate,\n        mainTextEnter,\n        classChartText = $$.classChartText.bind($$),\n        classTexts = $$.classTexts.bind($$),\n        classFocus = $$.classFocus.bind($$);\n    mainTextUpdate = $$.main.select('.' + CLASS.chartTexts).selectAll('.' + CLASS.chartText).data(targets).attr('class', function (d) {\n        return classChartText(d) + classFocus(d);\n    });\n    mainTextEnter = mainTextUpdate.enter().append('g').attr('class', classChartText).style('opacity', 0).style(\"pointer-events\", \"none\");\n    mainTextEnter.append('g').attr('class', classTexts);\n};\nc3_chart_internal_fn.updateText = function (durationForExit) {\n    var $$ = this,\n        config = $$.config,\n        barOrLineData = $$.barOrLineData.bind($$),\n        classText = $$.classText.bind($$);\n    $$.mainText = $$.main.selectAll('.' + CLASS.texts).selectAll('.' + CLASS.text).data(barOrLineData);\n    $$.mainText.enter().append('text').attr(\"class\", classText).attr('text-anchor', function (d) {\n        return config.axis_rotated ? d.value < 0 ? 'end' : 'start' : 'middle';\n    }).style(\"stroke\", 'none').style(\"fill\", function (d) {\n        return $$.color(d);\n    }).style(\"fill-opacity\", 0);\n    $$.mainText.text(function (d, i, j) {\n        return $$.dataLabelFormat(d.id)(d.value, d.id, i, j);\n    });\n    $$.mainText.exit().transition().duration(durationForExit).style('fill-opacity', 0).remove();\n};\nc3_chart_internal_fn.redrawText = function (xForText, yForText, forFlow, withTransition) {\n    return [(withTransition ? this.mainText.transition() : this.mainText).attr('x', xForText).attr('y', yForText).style(\"fill\", this.color).style(\"fill-opacity\", forFlow ? 0 : this.opacityForText.bind(this))];\n};\nc3_chart_internal_fn.getTextRect = function (text, cls, element) {\n    var dummy = this.d3.select('body').append('div').classed('c3', true),\n        svg = dummy.append(\"svg\").style('visibility', 'hidden').style('position', 'fixed').style('top', 0).style('left', 0),\n        font = this.d3.select(element).style('font'),\n        rect;\n    svg.selectAll('.dummy').data([text]).enter().append('text').classed(cls ? cls : \"\", true).style('font', font).text(text).each(function () {\n        rect = this.getBoundingClientRect();\n    });\n    dummy.remove();\n    return rect;\n};\nc3_chart_internal_fn.generateXYForText = function (areaIndices, barIndices, lineIndices, forX) {\n    var $$ = this,\n        getAreaPoints = $$.generateGetAreaPoints(areaIndices, false),\n        getBarPoints = $$.generateGetBarPoints(barIndices, false),\n        getLinePoints = $$.generateGetLinePoints(lineIndices, false),\n        getter = forX ? $$.getXForText : $$.getYForText;\n    return function (d, i) {\n        var getPoints = $$.isAreaType(d) ? getAreaPoints : $$.isBarType(d) ? getBarPoints : getLinePoints;\n        return getter.call($$, getPoints(d, i), d, this);\n    };\n};\nc3_chart_internal_fn.getXForText = function (points, d, textElement) {\n    var $$ = this,\n        box = textElement.getBoundingClientRect(),\n        xPos,\n        padding;\n    if ($$.config.axis_rotated) {\n        padding = $$.isBarType(d) ? 4 : 6;\n        xPos = points[2][1] + padding * (d.value < 0 ? -1 : 1);\n    } else {\n        xPos = $$.hasType('bar') ? (points[2][0] + points[0][0]) / 2 : points[0][0];\n    }\n    // show labels regardless of the domain if value is null\n    if (d.value === null) {\n        if (xPos > $$.width) {\n            xPos = $$.width - box.width;\n        } else if (xPos < 0) {\n            xPos = 4;\n        }\n    }\n    return xPos;\n};\nc3_chart_internal_fn.getYForText = function (points, d, textElement) {\n    var $$ = this,\n        box = textElement.getBoundingClientRect(),\n        yPos;\n    if ($$.config.axis_rotated) {\n        yPos = (points[0][0] + points[2][0] + box.height * 0.6) / 2;\n    } else {\n        yPos = points[2][1];\n        if (d.value < 0 || d.value === 0 && !$$.hasPositiveValue) {\n            yPos += box.height;\n            if ($$.isBarType(d) && $$.isSafari()) {\n                yPos -= 3;\n            } else if (!$$.isBarType(d) && $$.isChrome()) {\n                yPos += 3;\n            }\n        } else {\n            yPos += $$.isBarType(d) ? -3 : -6;\n        }\n    }\n    // show labels regardless of the domain if value is null\n    if (d.value === null && !$$.config.axis_rotated) {\n        if (yPos < box.height) {\n            yPos = box.height;\n        } else if (yPos > this.height) {\n            yPos = this.height - 4;\n        }\n    }\n    return yPos;\n};\n\nc3_chart_internal_fn.initTitle = function () {\n    var $$ = this;\n    $$.title = $$.svg.append(\"text\").text($$.config.title_text).attr(\"class\", $$.CLASS.title);\n};\nc3_chart_internal_fn.redrawTitle = function () {\n    var $$ = this;\n    $$.title.attr(\"x\", $$.xForTitle.bind($$)).attr(\"y\", $$.yForTitle.bind($$));\n};\nc3_chart_internal_fn.xForTitle = function () {\n    var $$ = this,\n        config = $$.config,\n        position = config.title_position || 'left',\n        x;\n    if (position.indexOf('right') >= 0) {\n        x = $$.currentWidth - $$.getTextRect($$.title.node().textContent, $$.CLASS.title, $$.title.node()).width - config.title_padding.right;\n    } else if (position.indexOf('center') >= 0) {\n        x = ($$.currentWidth - $$.getTextRect($$.title.node().textContent, $$.CLASS.title, $$.title.node()).width) / 2;\n    } else {\n        // left\n        x = config.title_padding.left;\n    }\n    return x;\n};\nc3_chart_internal_fn.yForTitle = function () {\n    var $$ = this;\n    return $$.config.title_padding.top + $$.getTextRect($$.title.node().textContent, $$.CLASS.title, $$.title.node()).height;\n};\nc3_chart_internal_fn.getTitlePadding = function () {\n    var $$ = this;\n    return $$.yForTitle() + $$.config.title_padding.bottom;\n};\n\nc3_chart_internal_fn.initTooltip = function () {\n    var $$ = this,\n        config = $$.config,\n        i;\n    $$.tooltip = $$.selectChart.style(\"position\", \"relative\").append(\"div\").attr('class', CLASS.tooltipContainer).style(\"position\", \"absolute\").style(\"pointer-events\", \"none\").style(\"display\", \"none\");\n    // Show tooltip if needed\n    if (config.tooltip_init_show) {\n        if ($$.isTimeSeries() && isString(config.tooltip_init_x)) {\n            config.tooltip_init_x = $$.parseDate(config.tooltip_init_x);\n            for (i = 0; i < $$.data.targets[0].values.length; i++) {\n                if ($$.data.targets[0].values[i].x - config.tooltip_init_x === 0) {\n                    break;\n                }\n            }\n            config.tooltip_init_x = i;\n        }\n        $$.tooltip.html(config.tooltip_contents.call($$, $$.data.targets.map(function (d) {\n            return $$.addName(d.values[config.tooltip_init_x]);\n        }), $$.axis.getXAxisTickFormat(), $$.getYFormat($$.hasArcType()), $$.color));\n        $$.tooltip.style(\"top\", config.tooltip_init_position.top).style(\"left\", config.tooltip_init_position.left).style(\"display\", \"block\");\n    }\n};\nc3_chart_internal_fn.getTooltipSortFunction = function () {\n    var $$ = this,\n        config = $$.config;\n\n    if (config.data_groups.length === 0 || config.tooltip_order !== undefined) {\n        // if data are not grouped or if an order is specified\n        // for the tooltip values we sort them by their values\n\n        var order = config.tooltip_order;\n        if (order === undefined) {\n            order = config.data_order;\n        }\n\n        var valueOf = function valueOf(obj) {\n            return obj ? obj.value : null;\n        };\n\n        // if data are not grouped, we sort them by their value\n        if (isString(order) && order.toLowerCase() === 'asc') {\n            return function (a, b) {\n                return valueOf(a) - valueOf(b);\n            };\n        } else if (isString(order) && order.toLowerCase() === 'desc') {\n            return function (a, b) {\n                return valueOf(b) - valueOf(a);\n            };\n        } else if (isFunction(order)) {\n\n            // if the function is from data_order we need\n            // to wrap the returned function in order to format\n            // the sorted value to the expected format\n\n            var sortFunction = order;\n\n            if (config.tooltip_order === undefined) {\n                sortFunction = function sortFunction(a, b) {\n                    return order(a ? {\n                        id: a.id,\n                        values: [a]\n                    } : null, b ? {\n                        id: b.id,\n                        values: [b]\n                    } : null);\n                };\n            }\n\n            return sortFunction;\n        } else if (isArray(order)) {\n            return function (a, b) {\n                return order.indexOf(a.id) - order.indexOf(b.id);\n            };\n        }\n    } else {\n        // if data are grouped, we follow the order of grouped targets\n        var ids = $$.orderTargets($$.data.targets).map(function (i) {\n            return i.id;\n        });\n\n        // if it was either asc or desc we need to invert the order\n        // returned by orderTargets\n        if ($$.isOrderAsc() || $$.isOrderDesc()) {\n            ids = ids.reverse();\n        }\n\n        return function (a, b) {\n            return ids.indexOf(a.id) - ids.indexOf(b.id);\n        };\n    }\n};\nc3_chart_internal_fn.getTooltipContent = function (d, defaultTitleFormat, defaultValueFormat, color) {\n    var $$ = this,\n        config = $$.config,\n        titleFormat = config.tooltip_format_title || defaultTitleFormat,\n        nameFormat = config.tooltip_format_name || function (name) {\n        return name;\n    },\n        valueFormat = config.tooltip_format_value || defaultValueFormat,\n        text,\n        i,\n        title,\n        value,\n        name,\n        bgcolor;\n\n    var tooltipSortFunction = this.getTooltipSortFunction();\n    if (tooltipSortFunction) {\n        d.sort(tooltipSortFunction);\n    }\n\n    for (i = 0; i < d.length; i++) {\n        if (!(d[i] && (d[i].value || d[i].value === 0))) {\n            continue;\n        }\n\n        if (!text) {\n            title = sanitise(titleFormat ? titleFormat(d[i].x) : d[i].x);\n            text = \"<table class='\" + $$.CLASS.tooltip + \"'>\" + (title || title === 0 ? \"<tr><th colspan='2'>\" + title + \"</th></tr>\" : \"\");\n        }\n\n        value = sanitise(valueFormat(d[i].value, d[i].ratio, d[i].id, d[i].index, d));\n        if (value !== undefined) {\n            // Skip elements when their name is set to null\n            if (d[i].name === null) {\n                continue;\n            }\n            name = sanitise(nameFormat(d[i].name, d[i].ratio, d[i].id, d[i].index));\n            bgcolor = $$.levelColor ? $$.levelColor(d[i].value) : color(d[i].id);\n\n            text += \"<tr class='\" + $$.CLASS.tooltipName + \"-\" + $$.getTargetSelectorSuffix(d[i].id) + \"'>\";\n            text += \"<td class='name'><span style='background-color:\" + bgcolor + \"'></span>\" + name + \"</td>\";\n            text += \"<td class='value'>\" + value + \"</td>\";\n            text += \"</tr>\";\n        }\n    }\n    return text + \"</table>\";\n};\nc3_chart_internal_fn.tooltipPosition = function (dataToShow, tWidth, tHeight, element) {\n    var $$ = this,\n        config = $$.config,\n        d3 = $$.d3;\n    var svgLeft, tooltipLeft, tooltipRight, tooltipTop, chartRight;\n    var forArc = $$.hasArcType(),\n        mouse = d3.mouse(element);\n    // Determin tooltip position\n    if (forArc) {\n        tooltipLeft = ($$.width - ($$.isLegendRight ? $$.getLegendWidth() : 0)) / 2 + mouse[0];\n        tooltipTop = $$.height / 2 + mouse[1] + 20;\n    } else {\n        svgLeft = $$.getSvgLeft(true);\n        if (config.axis_rotated) {\n            tooltipLeft = svgLeft + mouse[0] + 100;\n            tooltipRight = tooltipLeft + tWidth;\n            chartRight = $$.currentWidth - $$.getCurrentPaddingRight();\n            tooltipTop = $$.x(dataToShow[0].x) + 20;\n        } else {\n            tooltipLeft = svgLeft + $$.getCurrentPaddingLeft(true) + $$.x(dataToShow[0].x) + 20;\n            tooltipRight = tooltipLeft + tWidth;\n            chartRight = svgLeft + $$.currentWidth - $$.getCurrentPaddingRight();\n            tooltipTop = mouse[1] + 15;\n        }\n\n        if (tooltipRight > chartRight) {\n            // 20 is needed for Firefox to keep tooltip width\n            tooltipLeft -= tooltipRight - chartRight + 20;\n        }\n        if (tooltipTop + tHeight > $$.currentHeight) {\n            tooltipTop -= tHeight + 30;\n        }\n    }\n    if (tooltipTop < 0) {\n        tooltipTop = 0;\n    }\n    return { top: tooltipTop, left: tooltipLeft };\n};\nc3_chart_internal_fn.showTooltip = function (selectedData, element) {\n    var $$ = this,\n        config = $$.config;\n    var tWidth, tHeight, position;\n    var forArc = $$.hasArcType(),\n        dataToShow = selectedData.filter(function (d) {\n        return d && isValue(d.value);\n    }),\n        positionFunction = config.tooltip_position || c3_chart_internal_fn.tooltipPosition;\n    if (dataToShow.length === 0 || !config.tooltip_show) {\n        return;\n    }\n    $$.tooltip.html(config.tooltip_contents.call($$, selectedData, $$.axis.getXAxisTickFormat(), $$.getYFormat(forArc), $$.color)).style(\"display\", \"block\");\n\n    // Get tooltip dimensions\n    tWidth = $$.tooltip.property('offsetWidth');\n    tHeight = $$.tooltip.property('offsetHeight');\n\n    position = positionFunction.call(this, dataToShow, tWidth, tHeight, element);\n    // Set tooltip\n    $$.tooltip.style(\"top\", position.top + \"px\").style(\"left\", position.left + 'px');\n};\nc3_chart_internal_fn.hideTooltip = function () {\n    this.tooltip.style(\"display\", \"none\");\n};\n\nc3_chart_internal_fn.setTargetType = function (targetIds, type) {\n    var $$ = this,\n        config = $$.config;\n    $$.mapToTargetIds(targetIds).forEach(function (id) {\n        $$.withoutFadeIn[id] = type === config.data_types[id];\n        config.data_types[id] = type;\n    });\n    if (!targetIds) {\n        config.data_type = type;\n    }\n};\nc3_chart_internal_fn.hasType = function (type, targets) {\n    var $$ = this,\n        types = $$.config.data_types,\n        has = false;\n    targets = targets || $$.data.targets;\n    if (targets && targets.length) {\n        targets.forEach(function (target) {\n            var t = types[target.id];\n            if (t && t.indexOf(type) >= 0 || !t && type === 'line') {\n                has = true;\n            }\n        });\n    } else if (Object.keys(types).length) {\n        Object.keys(types).forEach(function (id) {\n            if (types[id] === type) {\n                has = true;\n            }\n        });\n    } else {\n        has = $$.config.data_type === type;\n    }\n    return has;\n};\nc3_chart_internal_fn.hasArcType = function (targets) {\n    return this.hasType('pie', targets) || this.hasType('donut', targets) || this.hasType('gauge', targets);\n};\nc3_chart_internal_fn.isLineType = function (d) {\n    var config = this.config,\n        id = isString(d) ? d : d.id;\n    return !config.data_types[id] || ['line', 'spline', 'area', 'area-spline', 'step', 'area-step'].indexOf(config.data_types[id]) >= 0;\n};\nc3_chart_internal_fn.isStepType = function (d) {\n    var id = isString(d) ? d : d.id;\n    return ['step', 'area-step'].indexOf(this.config.data_types[id]) >= 0;\n};\nc3_chart_internal_fn.isSplineType = function (d) {\n    var id = isString(d) ? d : d.id;\n    return ['spline', 'area-spline'].indexOf(this.config.data_types[id]) >= 0;\n};\nc3_chart_internal_fn.isAreaType = function (d) {\n    var id = isString(d) ? d : d.id;\n    return ['area', 'area-spline', 'area-step'].indexOf(this.config.data_types[id]) >= 0;\n};\nc3_chart_internal_fn.isBarType = function (d) {\n    var id = isString(d) ? d : d.id;\n    return this.config.data_types[id] === 'bar';\n};\nc3_chart_internal_fn.isScatterType = function (d) {\n    var id = isString(d) ? d : d.id;\n    return this.config.data_types[id] === 'scatter';\n};\nc3_chart_internal_fn.isPieType = function (d) {\n    var id = isString(d) ? d : d.id;\n    return this.config.data_types[id] === 'pie';\n};\nc3_chart_internal_fn.isGaugeType = function (d) {\n    var id = isString(d) ? d : d.id;\n    return this.config.data_types[id] === 'gauge';\n};\nc3_chart_internal_fn.isDonutType = function (d) {\n    var id = isString(d) ? d : d.id;\n    return this.config.data_types[id] === 'donut';\n};\nc3_chart_internal_fn.isArcType = function (d) {\n    return this.isPieType(d) || this.isDonutType(d) || this.isGaugeType(d);\n};\nc3_chart_internal_fn.lineData = function (d) {\n    return this.isLineType(d) ? [d] : [];\n};\nc3_chart_internal_fn.arcData = function (d) {\n    return this.isArcType(d.data) ? [d] : [];\n};\n/* not used\n function scatterData(d) {\n return isScatterType(d) ? d.values : [];\n }\n */\nc3_chart_internal_fn.barData = function (d) {\n    return this.isBarType(d) ? d.values : [];\n};\nc3_chart_internal_fn.lineOrScatterData = function (d) {\n    return this.isLineType(d) || this.isScatterType(d) ? d.values : [];\n};\nc3_chart_internal_fn.barOrLineData = function (d) {\n    return this.isBarType(d) || this.isLineType(d) ? d.values : [];\n};\nc3_chart_internal_fn.isInterpolationType = function (type) {\n    return ['linear', 'linear-closed', 'basis', 'basis-open', 'basis-closed', 'bundle', 'cardinal', 'cardinal-open', 'cardinal-closed', 'monotone'].indexOf(type) >= 0;\n};\n\nc3_chart_internal_fn.isSafari = function () {\n    var ua = window.navigator.userAgent;\n    return ua.indexOf('Safari') >= 0 && ua.indexOf('Chrome') < 0;\n};\nc3_chart_internal_fn.isChrome = function () {\n    var ua = window.navigator.userAgent;\n    return ua.indexOf('Chrome') >= 0;\n};\n\nc3_chart_internal_fn.initZoom = function () {\n    var $$ = this,\n        d3 = $$.d3,\n        config = $$.config,\n        startEvent;\n\n    $$.zoom = d3.behavior.zoom().on(\"zoomstart\", function () {\n        startEvent = d3.event.sourceEvent;\n        $$.zoom.altDomain = d3.event.sourceEvent.altKey ? $$.x.orgDomain() : null;\n        config.zoom_onzoomstart.call($$.api, d3.event.sourceEvent);\n    }).on(\"zoom\", function () {\n        $$.redrawForZoom.call($$);\n    }).on('zoomend', function () {\n        var event = d3.event.sourceEvent;\n        // if click, do nothing. otherwise, click interaction will be canceled.\n        if (event && startEvent.clientX === event.clientX && startEvent.clientY === event.clientY) {\n            return;\n        }\n        $$.redrawEventRect();\n        $$.updateZoom();\n        config.zoom_onzoomend.call($$.api, $$.x.orgDomain());\n    });\n    $$.zoom.scale = function (scale) {\n        return config.axis_rotated ? this.y(scale) : this.x(scale);\n    };\n    $$.zoom.orgScaleExtent = function () {\n        var extent = config.zoom_extent ? config.zoom_extent : [1, 10];\n        return [extent[0], Math.max($$.getMaxDataCount() / extent[1], extent[1])];\n    };\n    $$.zoom.updateScaleExtent = function () {\n        var ratio = diffDomain($$.x.orgDomain()) / diffDomain($$.getZoomDomain()),\n            extent = this.orgScaleExtent();\n        this.scaleExtent([extent[0] * ratio, extent[1] * ratio]);\n        return this;\n    };\n};\nc3_chart_internal_fn.getZoomDomain = function () {\n    var $$ = this,\n        config = $$.config,\n        d3 = $$.d3,\n        min = d3.min([$$.orgXDomain[0], config.zoom_x_min]),\n        max = d3.max([$$.orgXDomain[1], config.zoom_x_max]);\n    return [min, max];\n};\nc3_chart_internal_fn.updateZoom = function () {\n    var $$ = this,\n        z = $$.config.zoom_enabled ? $$.zoom : function () {};\n    $$.main.select('.' + CLASS.zoomRect).call(z).on(\"dblclick.zoom\", null);\n    $$.main.selectAll('.' + CLASS.eventRect).call(z).on(\"dblclick.zoom\", null);\n};\nc3_chart_internal_fn.redrawForZoom = function () {\n    var $$ = this,\n        d3 = $$.d3,\n        config = $$.config,\n        zoom = $$.zoom,\n        x = $$.x;\n    if (!config.zoom_enabled) {\n        return;\n    }\n    if ($$.filterTargetsToShow($$.data.targets).length === 0) {\n        return;\n    }\n    if (d3.event.sourceEvent.type === 'mousemove' && zoom.altDomain) {\n        x.domain(zoom.altDomain);\n        zoom.scale(x).updateScaleExtent();\n        return;\n    }\n    if ($$.isCategorized() && x.orgDomain()[0] === $$.orgXDomain[0]) {\n        x.domain([$$.orgXDomain[0] - 1e-10, x.orgDomain()[1]]);\n    }\n    $$.redraw({\n        withTransition: false,\n        withY: config.zoom_rescale,\n        withSubchart: false,\n        withEventRect: false,\n        withDimension: false\n    });\n    if (d3.event.sourceEvent.type === 'mousemove') {\n        $$.cancelClick = true;\n    }\n    config.zoom_onzoom.call($$.api, x.orgDomain());\n};\n\nreturn c3$1;\n\n})));\n\n/*! c3-angular - v1.3.1 - 2017-10-16\n* https://github.com/jettro/c3-angular-directive\n* Copyright (c) 2017 ; Licensed  */\nangular.module('gridshore.c3js.chart', []);\nangular.module('gridshore.c3js.chart')\n    .directive('chartAxes', ChartAxes);\n/**\n * @ngdoc directive\n * @name chartAxes\n * @description\n *  `chart-axes` is used to customize the axes properties. Using this directive you can select the propertie(s) to use for the different categories or for the time field. You can also configure for the different columns to use y or y2.\n *\n * Restrict To:\n *   Element\n *\n * Parent Element:\n *   c3chart\n *\n * @param {String} valuesX Specify the key in the data object to use for the x value\n *   \n *   {@link http://c3js.org/reference.html#data-x}\n * @param {String} valuesXs Specify the different keys for different data columns in format\n *   columnId:key,columnId:key\n *\n *   {@link http://c3js.org/reference.html#data-xs}\n * @param {String} y Set the id(s) of columns to use the first y value (y). Format is comma separated.\n * \n *   {@link http://c3js.org/reference.html#data-axes}\n * @param {String} y2 Set the id(s) of columns to use the second y value (y2) Format is comma separated.\n *\n *   {@link http://c3js.org/reference.html#data-axes}\n *\n * @example\n * Usage:\n *   <chart-axes values-x=\"...\" values-Xs=\"...\" y=\"...\" y2=\"...\"/>\n * Example:\n *   {@link http://jettro.github.io/c3-angular-directive/#examples}\n */\nfunction ChartAxes () {\n    var axesLinker = function (scope, element, attrs, chartCtrl) {\n        var x = attrs.valuesX;\n        if (x) {\n            chartCtrl.addXAxisValues(x);\n        }\n\n        var xs = attrs.valuesXs;\n        var xsValues = {};\n        if (xs) {\n            xsItems = xs.split(\",\");\n            for (var xsI in xsItems) {\n                xsItem = xsItems[xsI].split(\":\");\n                xsValues[xsItem[0]] = xsItem[1];\n            }\n            chartCtrl.addXSValues(xsValues);\n        }\n\n        var y = attrs.y;\n        var y2 = attrs.y2;\n        var yAxis = {};\n        if (y2) {\n            var items = y2.split(\",\");\n            for (var item in items) {\n                yAxis[items[item]] = \"y2\";\n            }\n            if (y) {\n                var yItems = y.split(\",\");\n                for (var yItem in yItems) {\n                    yAxis[yItems[yItem]] = \"y\";\n                }\n            }\n            chartCtrl.addYAxis(yAxis);\n        }\n    };\n\n    return {\n        \"require\": \"^c3chart\",\n        \"restrict\": \"E\",\n        \"scope\": {},\n        \"replace\": true,\n        \"link\": axesLinker\n    };\n};\n\nangular.module('gridshore.c3js.chart')\n    .directive('chartAxis', ChartAxis);\n\n/**\n * @ngdoc directive\n * @name chartAxis\n * @description\n *  `chart-axis` is used to customize the axis properties. Can be used to change the orientation of the axis.\n *\n * Restrict To:\n *   Element\n * \n * Parent element:\n *   c3chart\n *\n * @param {Boolean} axisRotate Configure to rotate the axis, javascript true means we rotate the axis.\n *   \n *   {@link http://c3js.org/reference.html#axis-rotated}\n *\n * @example\n * Usage:\n *   <chart-axis axis-rotate=\"true\"/>\n * Example:\n *   {@link http://jettro.github.io/c3-angular-directive/#examples}\n */\n\nfunction ChartAxis () {\n    var axisLinker = function (scope, element, attrs, chartCtrl) {\n        var rotate = attrs.axisRotate;\n        if (rotate) {\n            chartCtrl.rotateAxis();\n        }\n    };\n\n    return {\n        \"require\": \"^c3chart\",\n        \"restrict\": \"E\",\n        \"scope\": {},\n        \"transclude\": true,\n        \"template\": \"<div ng-transclude></div>\",\n        \"replace\": true,\n        \"link\": axisLinker\n    };\n};\n\nangular.module('gridshore.c3js.chart')\n    .directive('chartAxisX', ChartAxisX);\n\n/**\n * @ngdoc directive\n * @name chartAxisX\n * @description\n *  `chart-axis-x` is used to customize the x axis properties. Using this directive you can padding, size, visibility of the axis.\n *\n * Restrict To:\n *   Element\n *\n * Parent Element:\n *   chart-axis\n *\n * @param {String} axis-position Location of the label. Can have following values:\n *\n *   - Horizontal: inner-right (default), inner-center, inner-left, outer-right, outer-center, outer-left \n *   - Vertical: inner-top (default), inner-middle, inner-bottom, outer-top, outer-middle, outer-bottom\n *   \n *   {@link http://c3js.org/reference.html#data-x| c3js doc}\n * @param {String} axis-label Set the text for the label of the x axis.\n *\n *   {@link http://c3js.org/reference.html#axis-x-label| c3js doc}\n * @param {Number} padding-left Set padding on the left side of the x axis.\n * \n *   {@link http://c3js.org/reference.html#axis-x-padding| c3js doc}\n * @param {Number} padding-right Set padding on the right side of the x axis.\n *\n *   {@link http://c3js.org/reference.html#axis-x-padding| c3js doc}\n * @param {Number} axis-height Set the overall height of the x axis, unit in pixels.\n *\n *   {@link http://c3js.org/reference.html#axis-x-height| c3js doc}\n * @param {Boolean} show Show or hide the x axis.\n *\n *   {@link http://c3js.org/reference.html#axis-x-show| c3js doc}\n * @param {String} axis-localtime Default is to use localtime, but can be set to false to use UTC.\n *\n *   {@link http://c3js.org/reference.html#axis-x-localtime| c3js doc}\n * @param {String} axis-min Min value of the x axis.\n *\n *   {@link http://c3js.org/reference.html#axis-x-min| c3js doc}\n *\n * @param {String} axis-max Max value of the x axis.\n *\n *   {@link http://c3js.org/reference.html#axis-x-max | c3js doc}\n *\n * @param {String} axis-type The type of the x-axis can be one of the following three: timeseries, category or indexed (default).\n *\n *   {@link http://c3js.org/reference.html#axis-x-type | c3js doc}\n *\n * @param {String} axis-x-format Specify format of x axis data, usefull when using timeseries.\n *\n *   {@link http://c3js.org/reference.html#data-xFormat | c3js doc}\n *\n * @example\n * Usage:\n *   <chart-axis-x axis-position=\"...\" axis-label=\"...\" padding-left=\"...\" padding-right=\"...\" .../>\n * Example:\n *   {@link http://jettro.github.io/c3-angular-directive/#examples}\n *\n *   <chart-axis axis-rotate=\"true\">\n *     <chart-axis-x axis-position=\"outer-center\"\n *                   axis-label=\"The periods\"\n *                   axis-type=\"category\"/>\n *   </chart-axis>\n */\n\nfunction ChartAxisX () {\n    var axisLinker = function (scope, element, attrs, chartCtrl) {\n        var position = attrs.axisPosition;\n        var label = attrs.axisLabel;\n\n        var axis = {\"label\": {\"text\": label, \"position\": position}};\n\n        var paddingLeft = attrs.paddingLeft;\n        var paddingRight = attrs.paddingRight;\n        if (paddingLeft || paddingRight) {\n            paddingLeft = (paddingLeft) ? paddingLeft : 0;\n            paddingRight = (paddingRight) ? paddingRight : 0;\n            axis.padding = {\"left\": parseInt(paddingLeft), \"right\": parseInt(paddingRight)};\n        }\n        var height=attrs.axisHeight;\n        if (height) {\n            axis.height = parseInt(height);\n        }\n        \n        if (attrs.show === 'false') {\n            axis.show = false;\n        }\n        if (attrs.axisLocaltime === 'true') {\n            axis.localtime=true;\n        }\n        var max=attrs.axisMax;\n        if (max) {\n            axis.max=max;\n        }\n        var min=attrs.axisMin;\n        if (min) {\n            axis.min=min;\n        }\n        var type=attrs.axisType;\n        if (type) {\n            axis.type=type;   \n        }\n        chartCtrl.addAxisProperties('x', axis);\n\n        var xFormat = attrs.axisXFormat;\n        if (xFormat) {\n            chartCtrl.setXFormat(xFormat);\n        }\n    };\n\n    return {\n        \"require\": \"^c3chart\",\n        \"restrict\": \"E\",\n        \"scope\": {},\n        \"transclude\": true,\n        \"template\": \"<div ng-transclude></div>\",\n        \"replace\": true,\n        \"link\": axisLinker\n    };\n}\nangular.module('gridshore.c3js.chart')\n    .directive('chartAxisXTick', ChartAxisXTick);\n\n/**\n * @ngdoc directive\n * @name chartAxisXTick\n * @description\n *  `chart-axis-x-tick` is used to customize the x axis tick properties. You can change the amount of ticks, the format of the tick, culling, rotating.\n *\n * Restrict To:\n *   Element\n *\n * Parent Element:\n *   chart-axis-x\n *\n * @param {Number} tick-count Specify the number of ticks on the x axis.\n *   \n *   {@link http://c3js.org/reference.html#axis-x-tick-count| c3js doc}\n * @param {Boolean} tick-culling Culling means not all ticks will be shown, for category data this is by default false, for other data true.\n *\n *   {@link http://c3js.org/reference.html#axis-x-tick-culling| c3js doc}\n * @param {Number} tick-culling-max Set the maximum number of ticks, if specified culling is by default true.\n * \n *   {@link http://c3js.org/reference.html#axis-x-tick-culling-max| c3js doc}\n * @param {Boolean} tick-multiline Break the line if the tick length doesn't fit in space, default true.\n *\n *   {@link http://c3js.org/reference.html#axis-x-tick-multiline| c3js doc}\n * @param {Boolean} tick-centered Centers the tick on the x axis\n *\n *   {@link http://c3js.org/reference.html#axis-x-tick-centered| c3js doc}\n * @param {Number} tick-rotate Number of degrees to rotate the tick, can also be a negative number.\n *\n *   {@link http://c3js.org/reference.html#axis-x-tick-rotate| c3js doc}\n * @param {Boolean} tick-fit Default is to make the tick fit the chart, if false it will be at the exact position of the x value.\n *\n *   {@link http://c3js.org/reference.html#axis-x-tick-fit| c3js doc}\n *\n * @param {Boolean} tick-outer Default is not to show the outer tick, setting this to true will show the outer tick.\n *\n *   {@link http://c3js.org/reference.html#axis-x-tick-outer| c3js doc}\n *\n * @param {Array} tick-values An array containing the exact values to present a tick for.\n *\n *   {@link http://c3js.org/reference.html#axis-x-tick-values| c3js doc}\n *\n * @param {String} tick-format Provide a d3 based format for the tick value.\n *   format: '$,'\n *\n * @param {String} tick-format-time Provide a d3 based format for the tick value in case of timeseries data.\n *   format: '%Y-%m-%d %H:%M:%S'\n *\n *   {@link http://c3js.org/reference.html#data-xFormat| c3js doc}\n *\n * @param {Function} tick-format-function Provide a function to format the tick value.\n *   format: function (d) { return '$' + d; }\n *\n *   {@link http://c3js.org/reference.html#axis-x-tick-format| c3js doc}\n *\n * @example\n * Usage:\n *   <chart-axis-x-tick tick-rotate=\"...\" tick-count=\"...\"/>\n * \n * Example:\n *   {@link http://jettro.github.io/c3-angular-directive/#examples}\n *\n *   <chart-axis>\n *     <chart-axis-x axis-position=\"outer-center\" axis-label=\"Number by 10\"\n *                   axis-type=\"category\">\n *       <chart-axis-x-tick tick-rotate=\"50\"/>\n *     </chart-axis-x>\n *   </chart-axis>\n */\nfunction ChartAxisXTick() {\n    var tickLinker = function (scope, element, attrs, chartCtrl) {\n        var tick = {};\n\n        var count = attrs.tickCount;\n        if (count) {\n            tick.count = count;\n        }\n\n        var culling = attrs.tickCulling;\n        if (culling) {\n            culling = angular.lowercase(culling);\n            if (culling === 'true') {\n                tick.culling = true;\n            }\n            else if (culling === 'false') {\n                tick.culling = false;\n            }\n        }\n\n        var cullingMax = attrs.tickCullingMax;\n        if (cullingMax) {\n            tick.culling = { max: parseInt(cullingMax) }\n        }\n\n        var multiline = attrs.tickMultiline;\n        if (multiline) {\n            multiline = angular.lowercase(multiline);\n            if (multiline === 'true') {\n                tick.multiline = true;\n            }\n            else if (multiline === 'false') {\n                tick.multiline = false;\n            }\n        }\n\n        var centered = attrs.tickCentered;\n        if (centered) {\n            centered = angular.lowercase(centered);\n            if (centered === 'true') {\n                tick.centered = true;\n            }\n            else if (centered === 'false') {\n                tick.centered = false;\n            }\n        }\n\n        var rotate = attrs.tickRotate;\n        if (rotate) {\n            tick.rotate = rotate;\n        }\n\n        var fit = attrs.tickFit;\n        if (fit) {\n            fit = angular.lowercase(fit);\n            if (fit === 'true') {\n                tick.fit = true;\n            }\n            else if (fit === 'false') {\n                tick.fit = false;\n            }\n        }\n\n        var tickValues = attrs.tickValues;\n        if (tickValues) {\n            if (tickValues) {\n                if (tickValues.indexOf(',') > -1) {\n                    tick.values = tickValues.split(',');\n                } else {\n                    tick.values = tickValues;\n                }\n            }\n        }\n\n        var outer = attrs.tickOuter;\n        if (outer) {\n            outer = angular.lowercase(outer);\n            if (outer === 'true') {\n                tick.outer = true;\n            }\n            else if (outer === 'false') {\n                tick.outer = false;\n            }\n        }\n\n        var format = attrs.tickFormat;\n        if (format) {\n            tick.format = d3.format(format);\n        }\n\n        var formatTime = attrs.tickFormatTime;\n        if (formatTime) {\n            tick.format = d3.time.format(formatTime);\n        }\n\n        chartCtrl.addXTick(tick);\n\n        if (attrs.tickFormatFunction) {\n            chartCtrl.addXTickFormatFunction(scope.tickFormatFunction());\n        }\n\n    };\n\n    return {\n        \"require\": \"^c3chart\",\n        \"restrict\": \"E\",\n        \"scope\": {\n            \"tickFormatFunction\": \"&\"\n        },\n        \"replace\": true,\n        \"link\": tickLinker\n    };\n}\n\nangular.module('gridshore.c3js.chart')\n    .directive('chartAxisY', ChartAxisY);\n\n/**\n * @ngdoc directive\n * @name chartAxisY\n * @description\n *  `chart-axis-y` is used to customize the y and y2 axis properties. Using this directive you can padding, size, visibility of the axis.\n *\n * Restrict To:\n *   Element\n *\n * Parent Element:\n *   chart-axis\n *\n * @param {String} axis-id Default value is 'y' but you can also provide 'y2'\n *\n * @param {String} axis-position Location of the label. Can have following values:\n *\n *   - Horizontal: inner-right (default), inner-center, inner-left, outer-right, outer-center, outer-left \n *   - Vertical: inner-top (default), inner-middle, inner-bottom, outer-top, outer-middle, outer-bottom\n *   \n *   {@link http://c3js.org/reference.html#data-y| c3js doc}\n * @param {String} axis-label Set the text for the label of the y or y2 axis.\n *\n *   {@link http://c3js.org/reference.html#axis-y-label| c3js doc}\n * @param {Number} padding-top Set padding on the top side of the y or y2 axis.\n * \n *   {@link http://c3js.org/reference.html#axis-y-padding| c3js doc}\n * @param {Number} padding-bottom Set padding on the bottom side of the y or y2 axis.\n *\n *   {@link http://c3js.org/reference.html#axis-y-padding| c3js doc}\n * @param {Boolean} show Configure if the y or y2 axis should be shown.\n *\n *   {@link http://c3js.org/reference.html#axis-y-show| c3js doc}\n * @param {Number} axis-min Min value of the y our y2 axis in pixels.\n *\n *   {@link http://c3js.org/reference.html#axis-y-min| c3js doc}\n *\n * @param {Number} axis-max Max value of the y or y2 axis in pixels.\n *\n *   {@link http://c3js.org/reference.html#axis-y-max| c3js doc}\n *\n * @param {Boolean} axis-inner Position the y or y2 axis within the chart.\n *\n *   {@link http://c3js.org/reference.html#axis-y-inner| c3js doc}\n *\n * @param {Boolean} axis-inverted Invert the y or y2 axis, the default is true, from top to bottom.\n *\n *   {@link http://c3js.org/reference.html#axis-y-inverted| c3js doc}\n *\n * @param {Number} axis-center Set the center of the y or y2 axis, is a numeric value.\n *\n *   {@link http://c3js.org/reference.html#axis-y-center| c3js doc}\n *\n * @example\n * Usage:\n *   <chart-axis-y axis-position=\"...\" axis-label=\"...\" padding-top=\"...\" padding-bottom=\"...\" .../>\n * Example:\n *   {@link http://jettro.github.io/c3-angular-directive/#examples}\n *\n *   <chart-axis>\n *     <chart-axis-y axis-id=\"y\"\n *                 axis-position=\"outer-right\"\n *                 axis-label=\"Higher numbers\"\n *                 padding-top=\"100\"\n *                 padding-bottom=\"0\"\n *                 axis-min=\"0\"/>\n *     <chart-axis-y axis-id=\"y2\"\n *                 axis-position=\"outer-right\"\n *                 axis-label=\"Lower numbers\"\n *                 padding-top=\"10\"\n *                 padding-bottom=\"0\"\n *                 axis-max=\"100\"\n *                 axis-min=\"0\"/>\n *  </chart-axis>\n */\n\nfunction ChartAxisY() {\n    var axisLinker = function (scope, element, attrs, chartCtrl) {\n        var id = attrs.axisId;\n        var position = attrs.axisPosition;\n        var label = attrs.axisLabel;\n\n        id = ( id == undefined ? 'y' : id );\n\n        var axis = {\"label\": {\"text\": label, \"position\": position}};\n        if (attrs.show === 'false') {\n            axis.show = false;\n        } else if (id === 'y2') {\n            axis.show = true;\n        }\n        var paddingTop = attrs.paddingTop;\n        var paddingBottom = attrs.paddingBottom;\n        if (paddingTop || paddingBottom) {\n            paddingTop = (paddingTop) ? paddingTop : 0;\n            paddingBottom = (paddingBottom) ? paddingBottom : 0;\n            axis.padding = {\"top\": parseInt(paddingTop), \"bottom\": parseInt(paddingBottom)};\n        }\n        var axisMax = attrs.axisMax;\n        var axisMin = attrs.axisMin;\n        if (axisMax) {\n            axis.max = parseInt(axisMax);\n        }\n        if (axisMin) {\n            axis.min = parseInt(axisMin);\n        }\n        if (attrs.axisInverted === 'true') {\n            axis.inverted=true;\n        }\n        if (attrs.axisInner === 'true') {\n            axis.inner=true;\n        }\n        var axisCenter = attrs.axisCenter;\n        if (axisCenter) {\n            axis.center = parseInt(axisCenter);\n        }\n\n        chartCtrl.addAxisProperties(id, axis);\n    };\n\n    return {\n        \"require\": \"^c3chart\",\n        \"restrict\": \"E\",\n        \"scope\": {},\n        \"replace\": true,\n        \"link\": axisLinker\n    };\n}\nangular.module('gridshore.c3js.chart')\n    .directive('chartAxisYTick', ChartAxisYTick);\n\n/**\n * @ngdoc directive\n * @name chartAxisYTick\n * @description\n *  `chart-axis-y-tick` is used to customize the y or y2 axis tick properties. You can change the amount of ticks, the format of the tick, culling, rotating.\n *\n * Restrict To:\n *   Element\n *\n * Parent Element:\n *   chart-axis-y\n *\n * @param {Number} tick-count Specify the number of ticks on the x axis.\n *\n *   {@link http://c3js.org/reference.html#axis-y-tick-count| c3js doc}\n *\n * @param {Boolean} tick-outer Default is not to show the outer tick, setting this to true will show the outer tick.\n *\n *   {@link http://c3js.org/reference.html#axis-y-tick-outer| c3js doc}\n *\n * @param {Array} tick-values An array containing the exact values to present a tick for.\n *\n *   {@link http://c3js.org/reference.html#axis-y-tick-values| c3js doc}\n *\n * @param {Function} tick-format Provide a d3 based format for the tick value.\n *   format: '$,'\n *\n *   {@link http://c3js.org/reference.html#axis-x-tick-format| c3js doc}\n *\n * @param {Function} tick-format-function Provide a function to format the tick value.\n *\n *   {@link http://c3js.org/reference.html#axis-y-tick-format| c3js doc}\n *\n * @example\n * Usage:\n *   <chart-axis-y-tick tick-outer=\"...\" tick-count=\"...\"/>\n *\n * Example:\n *   {@link http://jettro.github.io/c3-angular-directive/#examples}\n *\n */\nfunction ChartAxisYTick() {\n    var tickLinker = function (scope, element, attrs, chartCtrl) {\n        var tick = {};\n\n        var count = attrs.tickCount;\n        if (count) {\n            tick.count = count;\n        }\n\n        var outer = attrs.tickOuter;\n        if (outer) {\n            outer = angular.lowercase(outer);\n            if (outer === 'true') {\n                tick.outer = true;\n            }\n            else if (outer === 'false') {\n                tick.outer = false;\n            }\n        }\n\n        var tickValues = attrs.tickValues;\n        if (tickValues) {\n            if (tickValues.indexOf(',') > -1) {\n                tick.values = tickValues.split(',');\n            } else {\n                tick.values = tickValues;\n            }\n        }\n\n        var format = attrs.tickFormat;\n        if (format) {\n            tick.format = d3.format(format);\n        }\n\n        chartCtrl.addYTick(tick);\n\n        if (attrs.tickFormatFunction) {\n            chartCtrl.addYTickFormatFunction(scope.tickFormatFunction());\n        }\n    };\n\n    return {\n        \"require\": \"^c3chart\",\n        \"restrict\": \"E\",\n        \"scope\": {\n            \"tickFormatFunction\": \"&\"\n        },\n        \"replace\": true,\n        \"link\": tickLinker\n    };\n}\nangular.module('gridshore.c3js.chart')\n    .directive('chartBar', ChartBar);\n/**\n * @ngdoc directive\n * @name chartBar\n * @description\n *  `chart-bar` is used to customize the axes properties. Using this directive you can select the propertie(s) to use for the different categories or for the time field. You can also configure for the different columns to use y or y2.\n *\n * Restrict To:\n *   Element\n *\n * Parent Element:\n *   c3chart\n *\n * @param {Number} width Fixed with of the bars in pixels\n *   \n *   {@link http://c3js.org/reference.html#bar-width| c3js doc}\n * \n * @param {Number} ratio Change the width of the bar by ratio\n *\n *   {@link http://c3js.org/reference.html#bar-width-ratio| c3js doc}\n * @param {Boolean} zerobased Set if we start from zero, default is true.\n * \n *   {@link http://c3js.org/reference.html#bar-zerobased| c3js doc}\n *\n * @example\n * Usage:\n *   <chart-bar width=\"...\" ratio=\"...\" zerobased=\"...\"/>\n * Example:\n *   {@link http://jettro.github.io/c3-angular-directive/#examples}\n * \n */\n\nfunction ChartBar() {\n    var barLinker = function (scope, element, attrs, chartCtrl) {\n        var bar = {};\n        if (attrs.width) {\n            bar.width = parseInt(attrs.width);\n        }\n        if (attrs.ratio) {\n            if (!bar.width) {\n                bar.width = {};\n            }\n            bar.width.ratio = parseFloat(attrs.ratio);\n        }\n        if (attrs.zerobased) {\n            bar.zerobased = (attrs.zerobased === 'true');\n        }\n        chartCtrl.addBar(bar);\n    };\n\n    return {\n        require: '^c3chart',\n        restrict: 'E',\n        scope: {},\n        replace: true,\n        link: barLinker\n    };\n}\nangular.module('gridshore.c3js.chart')\n    .directive('c3chart', ['$timeout', function(timeout) {\n        return C3Chart(timeout);\n    }]);\n\n/**\n * @ngdoc directive\n * @name C3Chart\n * @description\n *   `c3chart` is the main directive to create the chart. Use it to set the padding properties and include the other directives. You can also register the callback in this directive that receives the initialised chart object.\n *\n *   When using multiple charts in the same page you need to provide unique bind-id parameters.\n * \n * Restrict To:\n *   Element\n *\n * Parent Element:\n *   -\n *\n * @param {Number} padding-top Set the top padding of the chart.\n *   \n *   {@link http://c3js.org/reference.html#padding-top| c3js doc}\n * \n * @param {Number} padding-bottom Set the bottom padding of the chart.\n *\n *   {@link http://c3js.org/reference.html#padding-bottom| c3js doc}\n *\n * @param {Number} padding-right Set the right padding of the chart.\n * \n *   {@link http://c3js.org/reference.html#padding-right| c3js doc}\n *\n * @param {Number} padding-left Set the left padding of the chart.\n * \n *   {@link http://c3js.org/reference.html#padding-left| c3js doc}\n *\n * @param {String} empty-label Set text displayed when empty data.\n *\n *   {@link http://c3js.org/reference.html#data-empty-label-text| c3js doc}\n *\n * @param {String} bind-id Id of the chart, needs to be unique when using multiple charts on one page.\n * \n *   {@link http://c3js.org/reference.html#bindto| c3js doc}\n *\n * @param {String} sort-data You can enter three different versions: asc, desc, null. Using this sorting you can change the order of stacking and the order of the pieces of a pie or donut.\n * \n *   {@link http://c3js.org/reference.html#data-order| c3js doc}\n *\n * @param {Boolean} show-labels Configure to show the labels 'true' or not, default is false.\n * \n *   {@link http://c3js.org/reference.html#data-labels| c3js doc}\n *\n * @param {Function} labels-format-function Provide a function to format the labels.\n * \n *   {@link http://c3js.org/reference.html#data-labels-format| c3js doc}\n *\n * @param {Boolean} show-subchart Configure to show the subchart or not (default).\n * \n *   {@link http://c3js.org/reference.html#subchart-show| c3js doc}\n *\n * @param {Function} subchart-on-brush-function Use this if you want to do something after brush on subchart\n * \n *   {@link http://c3js.org/reference.html#subchart-onbrush| c3js doc}\n *\n * @param {Boolean} enable-zoom Configure to enable zoom in the chart or not (defaut).\n * \n *   {@link http://c3js.org/reference.html#zoom-enabled| c3js doc}\n *\n * @param {Boolean} rescale-zoom Use it to update the y domain according to the zoomed region.\n * \n *   {@link http://c3js.org/reference.html#zoom-rescale| c3js doc}\n *\n * @param {Function} on-zoom-end-function Use this if you want to do something after zooming\n * \n *   {@link http://c3js.org/reference.html#zoom-onzoomend| c3js doc} \n *\n * @param {Array} chart-data Provide a reference to a collection that can contain dynamic data. When providing this attrbiute you also need to provide the chart-columns attribute.\n * \n *   Array consisting of objects with values for the different columns: [{\"data1\":10,\"data2\":20},{\"data1\":50,\"data2\":60}]\n *\n * @param {Array} chart-columns Provide a reference to a collection that contains the columns. When providing this attrbiute you also need to provide the chart-data attribute.\n * \n *   Array consisting of objects with some properties for the different columns: [{\"id\": \"data1\", \"type\": \"line\"}, {\"id\": \"data2\", \"type\": \"bar\"}]\n *\n * @param {Object} chart-x Provide information about the x column. Used when adding dynamic data to specify the field that contains the x data value.\n * \n *   Object containing reference to the id of the x data field: {\"id\": \"x\", \"name\": \"My Data points\"}\n *\n * @param {Function} callback-function Use this if you want to interact with the chart object using the api\n * \n *   {@link http://c3js.org/reference.html#api-focus| c3js doc}\n *\n * @param {Number} transition-duration Duration of transition (in milliseconds) for chart animation. If you specify 0, transitions will be disabled which is good for large datasets.\n *\n *   {@link http://c3js.org/reference.html#transition-duration| c3js doc}\n *\n * @param {Object} initial-config Provide the initial config object to start the graph with.\n *\n * @example\n * Usage:\n *   <c3chart >\n *      <!-- sub elements -->\n *   </c3chart>\n * \n * Example:\n *\n *   {@link http://jettro.github.io/c3-angular-directive/#examples}\n * \n * Shows how to use dynamic data points.\n * \n * <c3chart bindto-id=\"dynamicpie\" chart-data=\"piePoints\" chart-columns=\"pieColumns\"/>\n * \n *     $scope.piePoints = [{\"data1\": 70, \"data2\": 30, \"data3\": \"100\"}];\n *     $scope.pieColumns = [{\"id\": \"data1\", \"type\": \"pie\"}, {\"id\": \"data2\", \"type\": \"pie\"}, {\n *       \"id\": \"data3\",\n *       \"type\": \"pie\"\n *\n * Show how to register a callback function and use it. The screen contains a button to toggle the legend visibility.\n *\n * <c3chart bindto-id=\"dynamicpie\" chart-data=\"piePoints\" chart-columns=\"pieColumns\"\n *        callback-function=\"handleCallback\"/>\n *\n *     $scope.handleCallback = function (chartObj) {\n *       $scope.theChart = chartObj;\n *   };\n *\n *   $scope.legendIsShown = true;\n *   $scope.toggleLegend = function() {\n *       if ($scope.legendIsShown) {\n *           $scope.theChart.legend.hide();\n *       } else {\n *           $scope.theChart.legend.show();\n *       }\n *       $scope.legendIsShown= !$scope.legendIsShown;\n *       $scope.theChart.flush();\n *   };\n */\nfunction C3Chart ($timeout) {\n    var chartLinker = function (scope, element, attrs, chartCtrl) {\n        var paddingTop = attrs.paddingTop;\n        var paddingRight = attrs.paddingRight;\n        var paddingBottom = attrs.paddingBottom;\n        var paddingLeft = attrs.paddingLeft;\n        var sortData = attrs.sortData;\n        var transitionDuration = attrs.transitionDuration;\n        var initialConfig = attrs.initialConfig;\n\n        if (attrs.interactionEnabled && attrs.interactionEnabled === 'false') {\n            chartCtrl.addInteractionEnabled(false);\n        }\n\n        if (paddingTop) {\n            chartCtrl.addPadding('top', paddingTop);\n        }\n        if (paddingRight) {\n            chartCtrl.addPadding('right', paddingRight);\n        }\n        if (paddingBottom) {\n            chartCtrl.addPadding('bottom', paddingBottom);\n        }\n        if (paddingLeft) {\n            chartCtrl.addPadding('left', paddingLeft);\n        }\n        if (sortData) {\n            chartCtrl.addSorting(sortData);\n        }\n        if (attrs.labelsFormatFunction) {\n            chartCtrl.addDataLabelsFormatFunction(scope.labelsFormatFunction());\n        }\n        if (attrs.onZoomEndFunction) {\n            chartCtrl.addOnZoomEndFunction(scope.onZoomEndFunction());\n        }\n        if (attrs.subchartOnBrushFunction){\n          chartCtrl.addSubchartOnBrushFunction(scope.subchartOnBrushFunction());          \n        }         \n        if (attrs.callbackFunction) {\n            chartCtrl.addChartCallbackFunction(scope.callbackFunction());\n        }\n        if (transitionDuration) {\n            chartCtrl.addTransitionDuration(transitionDuration);\n        }\n        if (initialConfig) {\n            chartCtrl.addInitialConfig(initialConfig);\n        }\n        // Trick to wait for all rendering of the DOM to be finished.\n        $timeout(function () {\n            chartCtrl.showGraph();\n        });\n    };\n\n    return {\n        \"restrict\": \"E\",\n        \"controller\": \"ChartController\",\n        \"scope\": {\n            \"bindto\": \"@bindtoId\",\n            \"showLabels\": \"@showLabels\",\n            \"labelsFormatFunction\": \"&\",\n            \"onZoomEndFunction\": \"&\",            \n            \"showSubchart\": \"@showSubchart\",\n            \"subchartOnBrushFunction\": \"&\",\n            \"enableZoom\": \"@enableZoom\",\n            \"rescaleZoom\": \"@rescaleZoom\",\n            \"chartData\": \"=chartData\",\n            \"chartColumns\": \"=chartColumns\",\n            \"chartX\": \"=chartX\",\n            \"callbackFunction\": \"&\",\n            \"emptyLabel\": \"@emptyLabel\"\n        },\n        \"template\": \"<div><div id='{{bindto}}'></div><div ng-transclude></div></div>\",\n        \"replace\": true,\n        \"transclude\": true,\n        \"link\": chartLinker\n    };\n}\n\nangular.module('gridshore.c3js.chart')\n    .directive('chartColors', ChartColors);\n\n/**\n * @ngdoc directive\n * @name chartColors\n * @description\n *  `chart-colors` is used to specify the colors to use in the chart. You can provide the colors or a function to determine the colors.\n *\n * Restrict To:\n *   Element\n *\n * Parent Element:\n *   c3chart\n *\n * @param {String} color-pattern A string containing comma separated hex colors\n * @param {String} thresholds A string containing comma separated numeric values\n *   \n * {@link http://c3js.org/reference.html#color-pattern| c3js docs}\n * @param {Function} color-function Provide a function that receives the value to determine a color for that value.\n *\n * {@link http://c3js.org/reference.html#data-color| c3js docs}\n *\n * @example\n * Usage:\n *   <chart-colors color-pattern=\"...\" color-function=\"...\" thresholds=\"...\"/>\n * \n * Example:\n *   {@link http://jettro.github.io/c3-angular-directive/#examples}\n * \n *   \n */\nfunction ChartColors () {\n    var colorsLinker = function (scope, element, attrs, chartCtrl) {\n        var pattern = attrs.colorPattern;\n        if (pattern) {\n            chartCtrl.addColorPatterns(pattern.split(\",\"));\n        }\n\n        var thresholds = attrs.thresholds;\n        if(thresholds){\n            chartCtrl.addColorThresholds(thresholds.split(\",\"));\n        }\n        \n        if (attrs.colorFunction) {\n            chartCtrl.addColorFunction(scope.colorFunction());\n        }\n    };\n\n    return {\n        \"require\": \"^c3chart\",\n        \"restrict\": \"E\",\n        \"scope\": {\n            \"colorFunction\": \"&\"\n        },\n        \"replace\": true,\n        \"link\": colorsLinker\n    };\n}\n\nangular.module('gridshore.c3js.chart')\n    .directive('chartColumn', ChartColumn);\n\n/**\n * @ngdoc directive\n * @name chartColumn\n * @description\n *  `chart-column` Used to provide data values for the chart as well as the name and some other config options.\n *\n * Restrict To:\n *   Element\n *\n * Parent Element:\n *   c3chart\n *\n * @param {String} column-id The id used to uniquely identify the column\n *   \n * @param {String} column-values The values for this column to plot.\n *\n * @param {String} column-type The type of the column to show: line, spline, bar, step, area, area-spline, area-step, scatter, pie, donut, gauge\n *\n *   {@link http://c3js.org/reference.html#data-type| c3js docs}\n *\n * @param {String} column-name The name of the column as used to print in the label.\n *\n *   {@link http://c3js.org/reference.html#data-names| c3js docs}\n *\n * @param {String} column-color The color to use for this column.\n *\n *   {@link http://c3js.org/reference.html#data-names| c3js docs}\n *\n * @example\n * Usage:\n *   <chart-column column-values=\"...\"/>\n * \n * Example:\n *   {@link http://jettro.github.io/c3-angular-directive/#examples}\n * \n * <chart-column column-id=\"data 1\"\n *               column-name=\"Data 1\"\n *               column-color=\"red\"\n *               column-values=\"30,200,100,400,150,250\"\n *               column-type=\"spline\"/>  \n * \n */\nfunction ChartColumn () {\n    var columnLinker = function (scope, element, attrs, chartCtrl) {\n        var column = attrs.columnValues.split(\",\");\n        column.unshift(attrs.columnId);\n        chartCtrl.addColumn(column, attrs.columnType, attrs.columnName, attrs.columnColor);\n    };\n\n    return {\n        \"require\": \"^c3chart\",\n        \"restrict\": \"E\",\n        \"scope\": {},\n        \"replace\": true,\n        \"link\": columnLinker\n    };\n}\n\nangular.module('gridshore.c3js.chart')\n/**\n * @controller\n */\n    .controller('ChartController', ChartController);\n\nChartController.$inject = ['$scope', '$timeout'];\nfunction ChartController($scope, $timeout) {\n    this.showGraph = showGraph;\n\n    this.addColumn = addColumn;\n    this.addAxisProperties = addAxisProperties;\n    this.rotateAxis = rotateAxis;\n    this.addPadding = addPadding;\n    this.addSorting = addSorting;\n    this.addInteractionEnabled = addInteractionEnabled;\n    this.addSize = addSize;\n    this.addEmptyLabel = addEmptyLabel;\n\n    this.addColorPatterns = addColorPatterns;\n    this.addColorThresholds = addColorThresholds;\n    this.addColorFunction = addColorFunction;\n\n    this.addGrid = addGrid;\n    this.addGridLine = addGridLine;\n    this.hideGridFocus = hideGridFocus;\n\n    this.addLegend = addLegend;\n\n    this.addTooltip = addTooltip;\n    this.addTooltipTitleFormatFunction = addTooltipTitleFormatFunction;\n    this.addTooltipNameFormatFunction = addTooltipNameFormatFunction;\n    this.addTooltipValueFormatFunction = addTooltipValueFormatFunction;\n    this.addTooltipContentFormatFunction = addTooltipContentFormatFunction;\n\n    this.addYAxis = addYAxis;\n    this.addYTick = addYTick;\n    this.addYTickFormatFunction = addYTickFormatFunction;\n\n    this.addXAxisValues = addXAxisValues;\n    this.addXTick = addXTick;\n    this.addXTickFormatFunction = addXTickFormatFunction;\n    this.addXType = addXType;\n    this.addXSValues = addXSValues;\n\n    this.addChartCallbackFunction = addChartCallbackFunction;\n    this.addInitialConfig = addInitialConfig;\n\n    this.addDataLabelsFormatFunction = addDataLabelsFormatFunction;\n    this.addTransitionDuration = addTransitionDuration;\n    \n    this.addSubchartOnBrushFunction = addSubchartOnBrushFunction;    \n    this.addOnZoomEndFunction = addOnZoomEndFunction;    \n\n    this.addGauge = addGauge;\n    this.addGaugeLabelFormatFunction = addGaugeLabelFormatFunction;\n\n    this.addBar = addBar;\n\n    this.addLine = addLine;\n\n    this.addRegion = addRegion;\n\n    this.addPie = addPie;\n    this.addPieLabelFormatFunction = addPieLabelFormatFunction;\n\n    this.addDonut = addDonut;\n    this.addDonutLabelFormatFunction = addDonutLabelFormatFunction;\n\n    this.addGroup = addGroup;\n\n    this.addPoint = addPoint;\n\n    this.addOnInitFunction = addOnInitFunction;\n    this.addOnMouseoverFunction = addOnMouseoverFunction;\n    this.addOnMouseoutFunction = addOnMouseoutFunction;\n    this.addOnRenderedFunction = addOnRenderedFunction;\n    this.addOnResizeFunction = addOnResizeFunction;\n    this.addOnResizedFunction = addOnResizedFunction;\n    this.addDataOnClickFunction = addDataOnClickFunction;\n    this.addDataOnMouseoverFunction = addDataOnMouseoverFunction;\n    this.addDataOnMouseoutFunction = addDataOnMouseoutFunction;\n\n    this.setXFormat = setXFormat;\n\n    this.addSelection = addSelection;\n\n    resetVars();\n\n    function resetVars() {\n        $scope.chart = null;\n        $scope.columns = [];\n        $scope.types = {};\n        $scope.regions = {};\n        $scope.axis = {};\n        $scope.axes = {};\n        $scope.padding = null;\n        $scope.emptyLabel = null;\n        $scope.xValues = null;\n        $scope.xFormat = null;\n        $scope.xsValues = null;\n        $scope.xTick = null;\n        $scope.yTick = null;\n        $scope.names = null;\n        $scope.grid = null;\n        $scope.legend = null;\n        $scope.tooltip = null;\n        $scope.chartSize = null;\n        $scope.colors = null;\n        $scope.colorThresholds = null;\n        $scope.gauge = null;\n        $scope.jsonKeys = null;\n        $scope.groups = null;\n        $scope.sorting = null;\n        $scope.transitionDuration = null;\n        $scope.initialConfig = null;\n        $scope.selection = null;\n    }\n\n    function showGraph() {\n        var config = {};\n        if ($scope.initialConfig) {\n            config = $scope.initialConfig;\n        }\n        config.bindto = \"#\" + $scope.bindto;\n        config.data = config.data || {};\n\n        if ($scope.xValues) {\n            config.data.x = $scope.xValues;\n        }\n        if ($scope.xsValues) {\n            config.data.xs = $scope.xsValues;\n        }\n        if ($scope.columns) {\n            config.data.columns = $scope.columns;\n        }\n        if ($scope.xFormat) {\n            config.data.xFormat = $scope.xFormat;\n        }\n        config.data.types = config.data.types || $scope.types;\n        config.data.axes = config.data.axes || $scope.axes;\n        if ($scope.names) {\n            config.data.names = $scope.names;\n        }\n        if ($scope.emptyLabel != null) {\n            config.data.empty = {\n                label: {\n                    text: $scope.emptyLabel\n                }\n            }\n        }\n        if ($scope.padding != null) {\n            config.padding = $scope.padding;\n        }\n        if ($scope.sorting != null) {\n            if ($scope.sorting == \"null\") {\n                config.data.order = null;\n            } else {\n                config.data.order = $scope.sorting;\n            }\n        }\n        if ($scope.transitionDuration != null) {\n            config.transition = config.transition || {};\n            config.transition.duration = $scope.transitionDuration;\n        }\n        if ($scope.showLabels && $scope.showLabels === \"true\") {\n            config.data.labels = true;\n        }\n        if ($scope.dataLabelsFormatFunction) {\n            config.data.labels = config.data.labels || {};\n            config.data.labels.format = $scope.dataLabelsFormatFunction;\n        }\n        if ($scope.groups != null) {\n            config.data.groups = $scope.groups;\n        }\n        if ($scope.showSubchart && $scope.showSubchart === \"true\") {\n            config.subchart = {\"show\": true};\n        }\n        if ($scope.subchartOnBrushFunction){\n            config.subchart = config.subchart || {};\n            config.subchart.onbrush = $scope.subchartOnBrushFunction;\n        }           \n        if ($scope.enableZoom && $scope.enableZoom === \"true\") {\n            config.zoom = {\"enabled\": true};\n        }\n        if ($scope.rescaleZoom && $scope.rescaleZoom === \"true\") {\n            config.zoom = config.zoom || {};\n            config.zoom.rescale = true;\n        }\n        if ($scope.onZoomEndFunction){\n            config.zoom = config.zoom || {};\n            config.zoom.onzoomend = $scope.onZoomEndFunction;\n        }          \n        config.axis = config.axis || $scope.axis;\n        if ($scope.xTick) {\n            config.axis.x.tick = $scope.xTick;\n        }\n        if ($scope.xTickFormatFunction) {\n            config.axis.x.tick = config.axis.x.tick || {};\n            config.axis.x.tick.format = $scope.xTickFormatFunction;\n        }\n\n        if ($scope.xType) {\n            config.axis.x.type = $scope.xType;\n        }\n        if ($scope.yTick) {\n            config.axis.y.tick = $scope.yTick;\n        }\n        if ($scope.yTickFormatFunction) {\n            config.axis.y.tick = config.axis.y.tick || {};\n            config.axis.y.tick.format = $scope.yTickFormatFunction;\n        }\n\n        if ($scope.grid != null) {\n            config.grid = $scope.grid;\n        }\n        if ($scope.legend != null) {\n            config.legend = $scope.legend;\n        }\n        if ($scope.tooltip != null) {\n            config.tooltip = $scope.tooltip;\n        } else {\n            config.tooltip = {}\n        }\n        if ($scope.tooltipTitleFormatFunction) {\n            config.tooltip.format = config.tooltip.format || {};\n            config.tooltip.format.title = $scope.tooltipTitleFormatFunction;\n        }\n        if ($scope.tooltipNameFormatFunction) {\n            config.tooltip.format = config.tooltip.format || {};\n            config.tooltip.format.name = $scope.tooltipNameFormatFunction;\n        }\n        if ($scope.tooltipValueFormatFunction) {\n            config.tooltip.format = config.tooltip.format || {};\n            config.tooltip.format.value = $scope.tooltipValueFormatFunction;\n        }\n\n        if ($scope.tooltipContentFormatFunction) {\n            config.tooltip.contents = $scope.tooltipContentFormatFunction;\n        }\n\n        if ($scope.chartSize != null) {\n            config.size = $scope.chartSize;\n        }\n\n        if ($scope.colors != null) {\n            // Colors per data column shoule be specified in $scope.colors\n            config.data.colors = $scope.colors;\n        }\n\n        if ($scope.colorFunction) {\n            config.data.color = $scope.colorFunction;\n        }\n\n        if ($scope.colorPatterns != null) {\n            // The colorPatters should contain an array with color patterns\n            if (config.color === undefined) {\n                config.color = {};\n            }\n            config.color.pattern = $scope.colorPatterns;\n        }\n\n        if ($scope.colorThresholds != null) {\n            if (config.color === undefined) {\n                config.color = {};\n            }\n            config.color.threshold = {\"values\": $scope.colorThresholds};\n        }\n\n        if ($scope.gauge != null) {\n            config.gauge = $scope.gauge;\n        } else {\n            config.gauge = {}\n        }\n        if ($scope.gaugeLabelFormatFunction) {\n            config.gauge.label = config.gauge.label || {};\n            config.gauge.label.format = $scope.gaugeLabelFormatFunction;\n        }\n        if ($scope.point != null) {\n            config.point = $scope.point;\n        }\n        if ($scope.bar != null) {\n            config.bar = $scope.bar;\n        }\n        if ($scope.line != null) {\n            config.line = $scope.line;\n        }\n        if ($scope.regions != null) {\n            config.data.regions = $scope.regions;\n        }\n        if ($scope.pie != null) {\n            config.pie = $scope.pie;\n        }\n        if ($scope.pieLabelFormatFunction) {\n            config.pie.label = config.pie.label || {};\n            config.pie.label.format = $scope.pieLabelFormatFunction;\n        }\n        if ($scope.donut != null) {\n            config.donut = $scope.donut;\n        } else {\n            config.donut = {}\n        }\n        if ($scope.donutLabelFormatFunction) {\n            config.donut.label = config.donut.label || {};\n            config.donut.label.format = $scope.donutLabelFormatFunction;\n        }\n        if ($scope.onInit != null) {\n            config.oninit = $scope.onInit;\n        }\n        if ($scope.onMouseover != null) {\n            config.onmouseover = $scope.onMouseover;\n        }\n        if ($scope.onMouseout != null) {\n            config.onmouseout = $scope.onMouseout;\n        }\n        if ($scope.onRendered != null) {\n            config.onrendered = $scope.onRendered;\n        }\n        if ($scope.onResize != null) {\n            config.onresize = $scope.onResize;\n        }\n        if ($scope.onResized != null) {\n            config.onresized = $scope.onResized;\n        }\n        if ($scope.dataOnClick != null) {\n            config.data.onclick = function (data, element) {\n                $scope.$apply(function () {\n                    $scope.dataOnClick({\"data\": data});\n                });\n            };\n        }\n        if ($scope.dataOnMouseover != null) {\n            config.data.onmouseover = function (data) {\n                $scope.$apply(function () {\n                    $scope.dataOnMouseover({\"data\": data});\n                });\n            };\n        }\n        if ($scope.dataOnMouseout != null) {\n            config.data.onmouseout = function (data) {\n                $scope.$apply(function () {\n                    $scope.dataOnMouseout({\"data\": data});\n                });\n            };\n        }\n        if ($scope.selection != null) {\n            config.data.selection = $scope.selection;\n        }\n        \n        if (typeof $scope.interactionEnabled === 'boolean') {\n            config.interaction = {\n              enabled: $scope.interactionEnabled\n            };\n        }\n\n        $scope.config = config;\n\n        if ($scope.chartData && $scope.chartColumns) {\n            $scope.$watch('chartData', function () {\n                loadChartData();\n            }, true);\n        } else {\n            $scope.chart = c3.generate($scope.config);\n            if ($scope.chartCallbackFunction) {\n                $scope.chartCallbackFunction($scope.chart);\n            }\n        }\n\n        $scope.$on('$destroy', function () {\n            $timeout(function () {\n                if (angular.isDefined($scope.chart)) {\n                    $scope.chart = $scope.chart.destroy();\n                    resetVars();\n                }\n            }, 10000)\n        });\n    }\n\n    function addColumn(column, columnType, columnName, columnColor) {\n        $scope.columns.push(column);\n        addColumnProperties(column[0], columnType, columnName, columnColor);\n    }\n\n    function addYAxis(yAxis) {\n        $scope.axes = yAxis;\n        if (!$scope.axis.y2) {\n            $scope.axis.y2 = {\"show\": true};\n        }\n    }\n\n    function addDataLabelsFormatFunction(dataLabelsFormatFunction) {\n        $scope.dataLabelsFormatFunction = dataLabelsFormatFunction;\n    }\n    \n    function addSubchartOnBrushFunction(subchartOnBrushFunction) {\n        $scope.subchartOnBrushFunction = subchartOnBrushFunction;\n    }\n    \n    function addOnZoomEndFunction(onZoomEndFunction) {\n        $scope.onZoomEndFunction = onZoomEndFunction;\n    }    \n\n    function addChartCallbackFunction(chartCallbackFunction) {\n        $scope.chartCallbackFunction = chartCallbackFunction;\n    }\n\n    function addTransitionDuration(transitionDuration) {\n        $scope.transitionDuration = transitionDuration;\n    }\n\n    function addXAxisValues(xValues) {\n        $scope.xValues = xValues;\n    }\n\n    function addXSValues(xsValues) {\n        $scope.xsValues = xsValues;\n    }\n\n    function addAxisProperties(id, axis) {\n        $scope.axis[id] = axis;\n    }\n\n    function addXTick(tick) {\n        $scope.xTick = tick;\n    }\n\n    function addXTickFormatFunction(xTickFormatFunction) {\n        $scope.xTickFormatFunction = xTickFormatFunction;\n    }\n\n    function addXType(type) {\n        $scope.xType = type;\n    }\n\n    function addYTick(tick) {\n        $scope.yTick = tick;\n    }\n\n    function addYTickFormatFunction(yTickFormatFunction) {\n        $scope.yTickFormatFunction = yTickFormatFunction;\n    }\n\n    function rotateAxis() {\n        $scope.axis.rotated = true;\n    }\n\n    function addEmptyLabel(text) {\n        $scope.emptyLabel = text;\n    }\n\n    function addPadding(side, amount) {\n        if ($scope.padding == null) {\n            $scope.padding = {};\n        }\n        $scope.padding[side] = parseInt(amount);\n    }\n\n    function addSorting(sorting) {\n        $scope.sorting = sorting;\n    }\n\n    function addInteractionEnabled(interactionEnabled) {\n        $scope.interactionEnabled = interactionEnabled;\n    }\n\n    function addGrid(axis) {\n        if ($scope.grid == null) {\n            $scope.grid = {};\n        }\n        if ($scope.grid[axis] == null) {\n            $scope.grid[axis] = {};\n        }\n        $scope.grid[axis].show = true;\n    }\n\n    function addGridLine(axis, value, text, gridClass, position) {\n        if ($scope.grid == null) {\n            $scope.grid = {};\n        }\n        if (axis === \"x\") {\n            if ($scope.grid.x === undefined) {\n                $scope.grid.x = {};\n            }\n            if ($scope.grid.x.lines === undefined) {\n                $scope.grid.x.lines = [];\n            }\n        } else {\n            if ($scope.grid.y === undefined) {\n                $scope.grid.y = {};\n            }\n            if ($scope.grid.y.lines === undefined) {\n                $scope.grid.y.lines = [];\n            }\n\n        }\n        var theGridLine = {};\n        theGridLine.value = isNaN(+value) ? value : +value;\n        theGridLine.text = text;\n        if (gridClass) {\n            theGridLine.class = gridClass;\n        }\n        if (position) {\n            theGridLine.position = position;\n        }\n        if (axis === \"y2\") {\n            theGridLine.axis = \"y2\";\n            $scope.grid.y.lines.push(theGridLine);\n        } else {\n            $scope.grid[axis].lines.push(theGridLine);\n        }\n    }\n\n    function addLegend(legend) {\n        $scope.legend = legend;\n    }\n\n    function addTooltip(tooltip) {\n        $scope.tooltip = tooltip;\n    }\n\n    function addTooltipTitleFormatFunction(tooltipTitleFormatFunction) {\n        $scope.tooltipTitleFormatFunction = tooltipTitleFormatFunction;\n    }\n\n    function addTooltipNameFormatFunction(tooltipNameFormatFunction) {\n        $scope.tooltipNameFormatFunction = tooltipNameFormatFunction;\n    }\n\n    function addTooltipValueFormatFunction(tooltipValueFormatFunction) {\n        $scope.tooltipValueFormatFunction = tooltipValueFormatFunction;\n    }\n\n    function addTooltipContentFormatFunction(tooltipContentFormatFunction) {\n        $scope.tooltipContentFormatFunction = tooltipContentFormatFunction;\n    }\n\n    function addSize(chartSize) {\n        $scope.chartSize = chartSize;\n    }\n\n    function addColorPatterns(colors) {\n        $scope.colorPatterns = colors;\n    }\n\n    function addColorThresholds(thresholds) {\n        $scope.colorThresholds = thresholds;\n        if ($scope.colors) {\n            $scope.colors.threshold = {\n                \"values\": $scope.colorThresholds\n            }\n        }\n    }\n\n    function addColorFunction(colorFunction) {\n        $scope.colorFunction = colorFunction;\n    }\n\n    function addOnInitFunction(onInitFunction) {\n        $scope.onInit = onInitFunction;\n    }\n\n    function addOnMouseoverFunction(onMouseoverFunction) {\n        $scope.onMouseover = onMouseoverFunction;\n    }\n\n    function addOnMouseoutFunction(onMouseoutFunction) {\n        $scope.onMouseout = onMouseoutFunction;\n    }\n\n    function addOnRenderedFunction(onRederedFunction) {\n        $scope.onRendered = onRederedFunction;\n    }\n\n    function addOnResizeFunction(onResizeFunction) {\n        $scope.onResize = onResizeFunction;\n    }\n\n    function addOnResizedFunction(onResizedFuncton) {\n        $scope.onResized = onResizedFuncton;\n    }\n\n    function addDataOnClickFunction(theFunction) {\n        $scope.dataOnClick = theFunction;\n    }\n\n    function addDataOnMouseoverFunction(theFunction) {\n        $scope.dataOnMouseover = theFunction;\n    }\n\n    function addDataOnMouseoutFunction(theFunction) {\n        $scope.dataOnMouseout = theFunction;\n    }\n\n    function addGauge(gauge) {\n        $scope.gauge = gauge;\n    }\n\n    function addGaugeLabelFormatFunction(gaugeLabelFormatFunction) {\n        $scope.gaugeLabelFormatFunction = gaugeLabelFormatFunction;\n    }\n\n    function addBar(bar) {\n        $scope.bar = bar;\n    }\n\n    function addLine(line) {\n        $scope.line = line;\n    }\n\n    function addRegion(id, intervals) {\n        $scope.regions[id] = intervals;\n    }\n\n    function addPie(pie) {\n        $scope.pie = pie;\n    }\n\n    function addPieLabelFormatFunction(pieLabelFormatFunction) {\n        $scope.pieLabelFormatFunction = pieLabelFormatFunction;\n    }\n\n    function addDonut(donut) {\n        $scope.donut = donut;\n    }\n\n    function addDonutLabelFormatFunction(donutLabelFormatFunction) {\n        $scope.donutLabelFormatFunction = donutLabelFormatFunction;\n    }\n\n    function addGroup(group) {\n        if ($scope.groups == null) {\n            $scope.groups = [];\n        }\n        $scope.groups.push(group);\n    }\n\n    function addPoint(point) {\n        $scope.point = point;\n    }\n\n    function hideGridFocus() {\n        if ($scope.grid == null) {\n            $scope.grid = {};\n        }\n        $scope.grid[\"focus\"] = {\"show\": false};\n    }\n\n    function setXFormat(xFormat) {\n        $scope.xFormat = xFormat;\n    }\n\n    function addInitialConfig(initialConfig) {\n        $scope.initialConfig = initialConfig;\n    }\n\n    function addColumnProperties(id, columnType, columnName, columnColor) {\n        if (columnType !== undefined) {\n            $scope.types[id] = columnType;\n        }\n        if (columnName !== undefined) {\n            if ($scope.names === null) {\n                $scope.names = {};\n            }\n            $scope.names[id] = columnName;\n        }\n        if (columnColor !== undefined) {\n            if ($scope.colors === null) {\n                $scope.colors = {};\n            }\n            $scope.colors[id] = columnColor;\n        }\n    }\n\n    function addSelection(selection) {\n        $scope.selection = selection;\n    }\n\n    function loadChartData() {\n        $scope.jsonKeys = {};\n        $scope.jsonKeys.value = [];\n        angular.forEach($scope.chartColumns, function (column) {\n            $scope.jsonKeys.value.push(column.id);\n            addColumnProperties(column.id, column.type, column.name, column.color);\n        });\n        if ($scope.chartX) {\n            $scope.jsonKeys.x = $scope.chartX.id;\n        }\n        if ($scope.names) {\n            $scope.config.data.names = $scope.names;\n        }\n        if ($scope.colors) {\n            $scope.config.data.colors = $scope.colors;\n        }\n        if ($scope.groups) {\n            $scope.config.data.groups = $scope.groups;\n        }\n\n        $scope.config.data.keys = $scope.jsonKeys;\n        $scope.config.data.json = $scope.chartData;\n\n        if (!$scope.chartIsGenerated) {\n            $scope.chart = c3.generate($scope.config);\n            $scope.chartIsGenerated = true;\n\n            // Use the API as documented here to interact with the chart object\n            // http://c3js.org/reference.html#api\n            if ($scope.chartCallbackFunction) {\n                $scope.chartCallbackFunction($scope.chart);\n            }\n        } else {\n            $scope.config.data.unload = true;\n            $scope.chart.load($scope.config.data);\n        }\n    }\n}\nangular.module('gridshore.c3js.chart')\n    .directive('chartDonut', ChartDonut);\n/**\n * @ngdoc directive\n * @name chartDonut\n * @description\n *  `chart-donut` SPecific configuration options for creating a donut chart.\n *\n * Restrict To:\n *   Element\n *\n * Parent Element:\n *   c3chart\n *\n * @param {Boolean} show-label Show labels in the Donut.\n *\n *   {@link http://c3js.org/reference.html#donut-label-show| c3js docs}\n *   \n * @param {Number} threshold-label Set the threshold to show or hide labels.\n *\n *   {@link http://c3js.org/reference.html#donut-label-threshold| c3js docs}\n * \n * @param {Boolean} expand Enable or disable whether to expand a pie part. True is the default.\n *\n *   {@link http://c3js.org/reference.html#donut-expand| c3js docs}\n *\n * @param {Number} width The width of the donut.\n *\n *   {@link http://c3js.org/reference.html#donut-width| c3js docs}\n *\n * @param {String} title The title for the donut chart.\n *\n *   {@link http://c3js.org/reference.html#donut-title| c3js docs}\n *\n * @param {Function} label-format-function Function to format the labels.\n *\n *   {@link http://c3js.org/reference.html#donut-label-format| c3js docs}\n *\n * @example\n * Usage:\n *   <chart-donut show-label=\"...\" threshold-label=\"...\" expand=\"...\" width=\"...\" title=\"...\"/>\n * \n * Example:\n *   {@link http://jettro.github.io/c3-angular-directive/#examples}\n * \n * <c3chart bindto-id=\"donut-plot1-chart\">\n *   <chart-column column-id=\"Data 1\"\n *                 column-values=\"70\"\n *                 column-type=\"donut\"/>\n *   <chart-column column-id=\"Data 2\"\n *                 column-values=\"35\"\n *                 column-type=\"donut\"/>\n *   <chart-column column-id=\"Data 3\"\n *                 column-values=\"60\"\n *                 column-type=\"donut\"/>\n *   <chart-donut title=\"Donut\" width=\"60\"/>\n * </c3chart>\n */    \nfunction ChartDonut() {\n    var donutLinker = function (scope, element, attrs, chartCtrl) {\n        var donut = {};\n        if (attrs.showLabel) {\n            donut.label = {\"show\": (attrs.showLabel === 'true')};\n        }\n        if (attrs.thresholdLabel) {\n            if (!donut.label) {\n                donut.label = {};\n            }\n            donut.label.threshold = parseFloat(attrs.thresholdLabel);\n        }\n        if (attrs.expand) {\n            donut.expand = (attrs.expand === 'true');\n        }\n        if (attrs.width) {\n            donut.width = parseInt(attrs.width);\n        }\n        if (attrs.title) {\n            donut.title = attrs.title;\n        }\n        chartCtrl.addDonut(donut);\n        if (attrs.labelFormatFunction) {\n            chartCtrl.addDonutLabelFormatFunction(scope.labelFormatFunction());\n        }\n    };\n\n    return {\n        require: '^c3chart',\n        restrict: 'E',\n        scope: {\n            \"labelFormatFunction\": \"&\"\n        },\n        replace: true,\n        link: donutLinker\n    };\n}\n\nangular.module('gridshore.c3js.chart')\n    .directive('chartEvents', ChartEvents);\n\n/**\n * @ngdoc directive\n * @name chartEvents\n * @description\n *  `chart-events` Used to provide callback functions to respond to events of the charts.\n *\n * Restrict To:\n *   Element\n *\n * Parent Element:\n *   c3chart\n *\n * @param {Function} on-init The on init callback function.\n *   \n *   {@link http://c3js.org/reference.html#oninit| c3js docs}\n *\n * @param {Function} on-rendered Provide the callback to respond to on-rendered. Basically, this callback will be called in each time when the chart is redrawed.\n *\n *   {@link http://c3js.org/reference.html#onrendered| c3js docs}\n *\n * @param {Function} on-mouseover Provide callback to be called when you hoover the chart.\n *\n *   {@link http://c3js.org/reference.html#onmouseover| c3js docs}\n *\n * @param {Function} on-mouseout Provide callback to be called when you hoover out of the chart.\n *\n *   {@link http://c3js.org/reference.html#onmouseout| c3js docs}\n *\n * @param {Function} on-resize Provide callback to be called when the chart is resizing.\n *\n *   {@link http://c3js.org/reference.html#onresize| c3js docs}\n *\n * @param {Function} on-resized Provide callback to be called when the chart is resized.\n *\n *   {@link http://c3js.org/reference.html#onresized| c3js docs}\n *\n * @param {Function} on-click-data Provide callback to be called one of the data points, lines, bars, etc. is clicked.\n *\n *   {@link http://c3js.org/reference.html#onclickdata| c3js docs}\n *\n * @param {Function} on-mouseover-data Provide callback to be called one of the data points, lines, bars, etc. is hoovered.\n *\n *   {@link http://c3js.org/reference.html#onclickdata| c3js docs}\n *\n * @param {Function} on-mouseout-data Provide callback to be called one of the data points, lines, bars, etc. is hoovered out.\n *\n *   {@link http://c3js.org/reference.html#onclickdata| c3js docs}\n *\n * @example\n * Usage:\n *   <chart-events on-init=\"...\" on-rendered=\"...\"/>\n * \n * Example:\n *   {@link http://jettro.github.io/c3-angular-directive/#examples}\n * \n *   <c3chart bindto-id=\"donut-plot1-chart\">\n *     <chart-column column-id=\"Data 1\"\n *                   column-values=\"70\"\n *                   column-type=\"donut\"/>\n *     <chart-column column-id=\"Data 2\"\n *                   column-values=\"35\"\n *                   column-type=\"donut\"/>\n *     <chart-column column-id=\"Data 3\"\n *                   column-values=\"60\"\n *                   column-type=\"donut\"/>\n *     <chart-donut title=\"Donut\" width=\"60\"/>\n *     <chart-events on-click-data=\"showClick(data)\"/>\n *   </c3chart>\n *\n *   graphApp.controller('GraphCtrl', function ($scope) {\n *     $scope.clicked = {};\n *     $scope.showClick = function(data) {\n *     $scope.clicked = data;\n *   }\n */\nfunction ChartEvents() {\n    var eventsLinker = function (scope, element, attrs, chartCtrl) {\n        if (attrs.onInit) {\n            chartCtrl.addOnInitFunction(scope.onInit);\n        }\n        if (attrs.onMouseover) {\n            chartCtrl.addOnMouseoverFunction(scope.onMouseover);\n        }\n        if (attrs.onMouseout) {\n            chartCtrl.addOnMouseoutFunction(scope.onMouseout);\n        }\n        if (attrs.onResize) {\n            chartCtrl.addOnResizeFunction(scope.onResize);\n        }\n        if (attrs.onResized) {\n            chartCtrl.addOnResizedFunction(scope.onResized);\n        }\n        if (attrs.onRendered) {\n            chartCtrl.addOnRenderedFunction(scope.onRendered);\n        }\n        if (attrs.onClickData) {\n            chartCtrl.addDataOnClickFunction(scope.onClickData);\n        }\n        if (attrs.onMouseoverData) {\n            chartCtrl.addDataOnMouseoverFunction(scope.onMouseoverData);\n        }\n        if (attrs.onMouseoutData) {\n            chartCtrl.addDataOnMouseoutFunction(scope.onMouseoutData);\n        }\n    };\n\n    return {\n        \"require\": \"^c3chart\",\n        \"restrict\": \"E\",\n        \"scope\": {\n            \"onInit\": \"&\",\n            \"onMouseover\": \"&\",\n            \"onMouseout\": \"&\",\n            \"onResize\": \"&\",\n            \"onResized\": \"&\",\n            \"onRendered\": \"&\",\n            \"onClickData\": \"&\",\n            \"onMouseoverData\": \"&\",\n            \"onMouseoutData\": \"&\"\n        },\n        \"replace\": true,\n        \"link\": eventsLinker\n    };\n}\n\nangular.module('gridshore.c3js.chart')\n    .directive('chartGauge', ChartGauge);\n/**\n * @ngdoc directive\n * @name chartGauge\n * @description\n *  `chart-gauge` is used to specify specific properties when creating a guage chart.\n *\n * Restrict To:\n *   Element\n *\n * Parent Element:\n *   c3chart\n *\n * @param {Number} min The minimum value used in the Gauge.\n *   \n *   {@link http://c3js.org/reference.html#gauge-min| c3js docs}\n *\n * @param {Number} max The maximum value used in the Guage.\n *\n *   {@link http://c3js.org/reference.html#gauge-max| c3js docs}\n *\n * @param {Number} width The width of the Guage.\n *\n *   {@link http://c3js.org/reference.html#gauge-width| c3js docs}\n *\n * @param {String} units Set the units of the gauge, ' %' for instance.\n *\n *   {@link http://c3js.org/reference.html#gauge-units| c3js docs}\n *\n * @param {Boolean} show-label Set to false to hide the labels, default is true.\n *\n *   {@link http://c3js.org/reference.html#gauge-label-show| c3js docs}\n *\n * @param {Boolean} expand Set to false to prevent expanding the gauge, default is true.\n *\n *   {@link http://c3js.org/reference.html#gauge-expand| c3js docs}\n *\n * @param {Function} label-format-function Function to format the labels.\n *\n *   {@link http://c3js.org/reference.html#gauge-label-format| c3js docs}\n *\n * @example\n * Usage:\n *   <chart-gauge min=\"...\" max=\"...\"/>\n * \n * Example:\n *   {@link http://jettro.github.io/c3-angular-directive/#examples}\n * \n *   \n */\nfunction ChartGauge () {\n    var gaugeLinker = function (scope, element, attrs, chartCtrl) {\n        var gauge = {};\n        if (attrs.min) {\n            gauge.min = parseInt(attrs.min);\n        }\n        if (attrs.max) {\n            gauge.max = parseInt(attrs.max);\n        }\n        if (attrs.width) {\n            gauge.width = parseInt(attrs.width);\n        }\n        if (attrs.units) {\n            gauge.units = attrs.units\n        }\n        if (attrs.showLabel) {\n            gauge.label = {\"show\": (attrs.showLabel === 'true')};\n        }\n        if (attrs.expand) {\n            gauge.expand = (attrs.expand === 'true');\n        }\n        chartCtrl.addGauge(gauge);\n        if (attrs.labelFormatFunction) {\n            chartCtrl.addGaugeLabelFormatFunction(scope.labelFormatFunction());\n        }\n    };\n\n    return {\n        require: '^c3chart',\n        restrict: 'E',\n        scope: {\n            'labelFormatFunction': \"&\"\n        },\n        replace: true,\n        link: gaugeLinker\n    };\n}\n\nangular.module('gridshore.c3js.chart')\n    .directive('chartGrid', ChartGrid);\n\n/**\n * @ngdoc directive\n * @name chartGrid\n * @description\n *  `chart-grid` is used to specify properties to show a grid.\n *\n * Restrict To:\n *   Element\n *\n * Parent Element:\n *   c3chart\n *\n * @param {Boolean} showX Whether to show the x axis grid.\n *   \n *   {@link http://c3js.org/reference.html#grid-x-show| c3js docs}\n *\n * @param {Boolean} showY Whether to show the y axis grid.\n *\n *   {@link http://c3js.org/reference.html#grid-y-show| c3js docs}\n *\n * @param {Boolean} showY2 Whether to show the y2 axis grid.\n *\n *   {@link http://c3js.org/reference.html#grid-y-show| c3js docs}\n *\n * @param {Boolean} showFocus Whether to enable the focus grid.\n *\n *   {@link http://c3js.org/reference.html#grid-focus-show| c3js docs}\n *\n * @example\n * Usage:\n *   <chart-grid showX=\"...\" showY=\"...\" showY2=\"...\"/>\n * \n * Example:\n *   {@link http://jettro.github.io/c3-angular-directive/#examples}\n * \n * <chart-grid show-x=\"false\" show-y=\"true\">\n *   <chart-grid-optional axis-id=\"x\" grid-value=\"1\" grid-text=\"Start\"/>\n *   <chart-grid-optional axis-id=\"y\" grid-value=\"20\" grid-text=\"Minimum\"/>\n *   <chart-grid-optional axis-id=\"y\" grid-value=\"200\" grid-text=\"Maximum\"/>\n * </chart-grid>  \n */\nfunction ChartGrid () {\n    var gridLinker = function (scope, element, attrs, chartCtrl) {\n        var showX = attrs.showX;\n        if (showX && showX === \"true\") {\n            chartCtrl.addGrid(\"x\");\n        }\n        var showY = attrs.showY;\n        if (showY && showY === \"true\") {\n            chartCtrl.addGrid(\"y\");\n        }\n        var showY2 = attrs.showY2;\n        if (showY2 && showY2 === \"true\") {\n            chartCtrl.addGrid(\"y2\");\n        }\n        var showFocus = attrs.showFocus;\n        if (showFocus && showFocus === \"false\") {\n            chartCtrl.hideGridFocus();\n        }\n    };\n\n    return {\n        \"require\": \"^c3chart\",\n        \"restrict\": \"E\",\n        \"scope\": {},\n        \"replace\": true,\n        \"link\": gridLinker,\n        \"transclude\": true,\n        \"template\": \"<div ng-transclude></div>\"\n    };\n}\nangular.module('gridshore.c3js.chart')\n    .directive('chartGridOptional', ChartGridOptional);\n/**\n * @ngdoc directive\n * @name chartGridOptional\n * @description\n *  `chart-grid-optional` is used to add optional grid lines to the chart. All attributes are mandatory\n *\n * Restrict To:\n *   Element\n *\n * Parent Element:\n *   gridDirective\n *\n * @param {String} axisId x, y or y2.\n *   \n *   {@link http://c3js.org/reference.html#grid-x-lines| c3js docs}\n *\n * @param {Number} value Value where to print the additional grid line.\n *\n *   {@link http://c3js.org/reference.html#grid-x-lines| c3js docs}\n *\n * @param {String} text Label to print at the grid line.\n *\n *   {@link http://c3js.org/reference.html#grid-x-lines| c3js docs}\n *\n * @param {String} gridClass Class to add to the grid line to be able to style them separately.\n *\n *   {@link http://c3js.org/reference.html#grid-x-lines| c3js docs}\n *\n * @param {String} position Sets the position for the label, values are: start, middle, end.\n *\n *   {@link http://c3js.org/reference.html#grid-x-lines| c3js docs}\n *\n * @example\n * Usage:\n *   <chart-grid-optional axis-id=\"...\" value=\"...\" text=\"...\"/>\n * \n * Example:\n *   {@link http://jettro.github.io/c3-angular-directive/#examples}\n * \n * <chart-grid show-x=\"false\" show-y=\"true\">\n *   <chart-grid-optional axis-id=\"x\" grid-value=\"1\" grid-text=\"Start\"/>\n *   <chart-grid-optional axis-id=\"y\" grid-value=\"20\" grid-text=\"Minimum\"/>\n *   <chart-grid-optional axis-id=\"y\" grid-value=\"200\" grid-text=\"Maximum\"/>\n * </chart-grid>  \n */\nfunction ChartGridOptional() {\n    var gridLinker = function (scope, element, attrs, chartCtrl) {\n        var axisId = attrs.axisId;\n        var value = attrs.gridValue;\n        var text = attrs.gridText;\n        var gridClass = attrs.gridClass;\n        var position = attrs.position;\n\n        chartCtrl.addGridLine(axisId, value, text, gridClass, position);\n    };\n\n    return {\n        \"require\": \"^c3chart\",\n        \"restrict\": \"E\",\n        \"scope\": {},\n        \"replace\": true,\n        \"link\": gridLinker\n    };\n}\n\nangular.module('gridshore.c3js.chart')\n    .directive('chartGroup', ChartGroup);\n\n/**\n * @ngdoc directive\n * @name chartGroup\n * @description\n *  `chart-group` is used to group columns, for instance to add them to the \n * same column for the same x value. Input is a comma separated string with the\n * id's of the columns to group.\n *\n * Restrict To:\n *   Element\n *\n * Parent Element:\n *   c3chart\n *\n * @param {String} groupValues Comma separated column ids.\n *   \n *   {@link http://c3js.org/reference.html#data-groups| c3js docs}\n *\n *\n * @example\n * Usage:\n *   <chart-group group-values=\"...\"/>\n * \n * Example:\n *   {@link http://jettro.github.io/c3-angular-directive/#examples}\n * \n * <c3chart bindto-id=\"stacked-bar-plot1-chart\">\n *   <chart-column column-id=\"data 1\"\n *             column-name=\"Data 1\"\n *             column-color=\"red\"\n *             column-values=\"30,200,100,400,150,250\"\n *             column-type=\"bar\"/>\n *   <chart-column column-id=\"data 2\"\n *             column-name=\"Data 2\"\n *             column-color=\"green\"\n *             column-values=\"50,20,10,40,15,25\"\n *             column-type=\"bar\"/>\n *   <chart-group group-values=\"data 1,data 2\"/>\n * </c3chart>  \n */\nfunction ChartGroup () {\n    var groupLinker = function (scope, element, attrs, chartCtrl) {\n        var group = attrs.groupValues.split(\",\");\n        chartCtrl.addGroup(group);\n    };\n\n    return {\n        \"require\": \"^c3chart\",\n        \"restrict\": \"E\",\n        \"scope\": {},\n        \"replace\": true,\n        \"link\": groupLinker\n    };\n}\n\nangular.module('gridshore.c3js.chart')\n    .directive('chartLegend', ChartLegend);\n\n/**\n * @ngdoc directive\n * @name chartLegend\n * @description\n *  `chart-legend` is used configure the legend to add to the chart. You can also add function to handle events related\n *  to the legend: onClick, onMouseOver and onMouseOut.\n *\n * Restrict To:\n *   Element\n *\n * Parent Element:\n *   c3chart\n *\n * @param {Boolean} showLegend Whether to show the legend or not, default is show.\n *\n *   {@link http://c3js.org/reference.html#legend-show| c3js docs}\n *\n * @param {String} legendPosition One of the following values: bottom, right, inset.\n *\n *   {@link http://c3js.org/reference.html#legend-position| c3js docs}\n *\n * @param {Function} onMouseover Provide callback to be called when you hoover the legend.\n *\n *   {@link http://c3js.org/reference.html#legend-item-onmouseover| c3js docs}\n *\n * @param {Function} onMouseout Provide callback to be called when you hoover out of the legend.\n *\n *   {@link http://c3js.org/reference.html#legend-item-onmouseout| c3js docs}\n *\n * @param {Function} onClick Provide callback to be called when you click the legend.\n *\n *   {@link http://c3js.org/reference.html#legend-item-onmouseout| c3js docs}\n *\n * @param {String} legendInset Where to show an inset legend, valid values are: top-left, top-right, bottom-left, bottom-right\n *\n *   {@link http://c3js.org/reference.html#legend-inset| c3js docs}\n *\n * @param {Number} legendInsetX X position for the inset.\n *\n *   {@link http://c3js.org/reference.html#legend-inset| c3js docs}\n *\n * @param {Number} legendInsetY Y position for the inset.\n *\n *   {@link http://c3js.org/reference.html#legend-inset| c3js docs}\n *\n * @param {Number} legendInsetStep Step for the inset.\n *\n *   {@link http://c3js.org/reference.html#legend-inset| c3js docs}\n *\n * @example\n * Usage:\n *   <chart-legend show-legend=\"...\" legend-position=\"...\" on-click=\"...\"/>\n * \n * Example:\n *   {@link http://jettro.github.io/c3-angular-directive/#examples}\n * \n * <chart-legend show-legend=\"true\" legend-position=\"right\"/>\n */\nfunction ChartLegend () {\n    var legendLinker = function (scope, element, attrs, chartCtrl) {\n        var legend = null;\n        var show = attrs.showLegend;\n        if (show && show === \"false\") {\n            legend = {\"show\": false};\n        } else {\n            var position = attrs.legendPosition;\n            if (position) {\n                legend = {\"position\": position};\n            }\n            var inset = attrs.legendInset;\n            if (inset) {\n                legend = {\"position\":\"inset\",\"inset\":{\"anchor\":inset}};\n\n                var insetX = attrs.legendInsetX;\n                if (insetX) {\n                    legend.inset.x = parseInt(insetX);\n                }\n                var insetY = attrs.legendInsetY;\n                if (insetY) {\n                    legend.inset.y = parseInt(insetY);\n                }\n                var insetStep = attrs.legendInsetStep;\n                if (insetStep) {\n                    legend.inset.step = parseInt(insetStep);\n                }\n            }\n        }\n\n        if (attrs.onMouseover) {\n            legend = legend || {};\n            legend.item = legend.item || {};\n            legend.item.onmouseover = function (data) {\n                scope.$apply(function () {\n                    scope.onMouseover({\"data\": data});\n                });\n            };\n        }\n        if (attrs.onMouseout) {\n            legend = legend || {};\n            legend.item = legend.item || {};\n            legend.item.onmouseout = function (data) {\n                scope.$apply(function () {\n                    scope.onMouseout({\"data\": data});\n                });\n            };\n        }\n        if (attrs.onClick) {\n            legend = legend || {};\n            legend.item = legend.item || {};\n\n            legend.item.onclick = function (data) {\n                scope.$apply(function () {\n                    scope.onClick({\"data\": data});\n                });\n            };\n        }\n\n        if (legend != null) {\n            chartCtrl.addLegend(legend);\n        }\n    };\n\n    return {\n        \"require\": \"^c3chart\",\n        \"restrict\": \"E\",\n        \"scope\": {\n            \"onMouseover\": \"&\",\n            \"onMouseout\": \"&\",\n            \"onClick\": \"&\"\n        },\n        \"replace\": true,\n        \"link\": legendLinker\n    };\n}\nangular.module('gridshore.c3js.chart')\n    .directive('chartLine', ChartLine);\n/**\n * @ngdoc directive\n * @name chartLine\n * @description\n *  `chart-line` is used to customize the line chart properties..\n *\n * Restrict To:\n *   Element\n *\n * Parent Element:\n *   c3chart\n *\n * @param {String} stepType Step types for step chart: step, step-before and step-after.\n *\n *   {@link http://c3js.org/reference.html#line-step_type| c3js doc}\n *\n * @param {Boolean} connectNull Should null data point be connected or not.\n *\n *   {@link http://c3js.org/reference.html#bar-width-ratio| c3js doc}\n *\n * @example\n * Usage:\n *   <chart-line step-type=\"...\" connect-null=\"...\"/>\n * Example:\n *   {@link http://jettro.github.io/c3-angular-directive/#examples}\n *\n */\n\nfunction ChartLine() {\n    var lineLinker = function (scope, element, attrs, chartCtrl) {\n        var line = {};\n        if (attrs.stepType) {\n            line.step = line.step || {};\n            line.step.type = attrs.stepType;\n        }\n        if (attrs.connectNull) {\n            line.connectNull = (attrs.connectNull === 'true');\n        }\n        chartCtrl.addLine(line);\n    };\n\n    return {\n        require: '^c3chart',\n        restrict: 'E',\n        scope: {},\n        replace: true,\n        link: lineLinker\n    };\n}\n\n\nangular.module('gridshore.c3js.chart')\n    .directive('chartPie', ChartPie);\n\n/**\n * @ngdoc directive\n * @name chartPie\n * @description\n *  `chart-pie` is used configure additional properties for a pie chart.\n *\n * Restrict To:\n *   Element\n *\n * Parent Element:\n *   c3chart\n *\n * @param {Boolean} showLabel Whether to show a label for each pie part.\n *   \n *   {@link http://c3js.org/reference.html#pie-label-show| c3js docs}\n *\n * @param {Boolean} expand Whether to expand on mouse over.\n *   \n *   {@link http://c3js.org/reference.html#pie-expand| c3js docs}\n *\n * @param {Number} thresholdLabel Show label if value is higher than the provided value.\n *\n *   {@link http://c3js.org/reference.html#pie-label-threshold| c3js docs}\n *\n * @param {Function} labelFormatFunction Present a function to format the label.\n *\n *   {@link http://c3js.org/reference.html#pie-label-format| c3js docs}\n *\n * @example\n * Usage:\n *   <chart-pie show-label=\"...\" expand=\"...\"/>\n * \n * Example:\n *   {@link http://jettro.github.io/c3-angular-directive/#examples}\n * \n * <c3chart bindto-id=\"pie-plot1-chart\">\n *   <chart-column column-id=\"Data 1\" column-values=\"70\" column-type=\"pie\"/>\n *   <chart-column column-id=\"Data 2\" column-values=\"35\" column-type=\"pie\"/>\n *   <chart-column column-id=\"Data 3\" column-values=\"60\" column-type=\"pie\"/>\n *   <chart-pie expand=\"true\"/>\n * </c3chart>\n */\nfunction ChartPie () {\n    var pieLinker = function (scope, element, attrs, chartCtrl) {\n        var pie = {};\n        if (attrs.showLabel) {\n            pie.label = {\"show\": (attrs.showLabel === 'true')};\n        }\n        if (attrs.thresholdLabel) {\n            if (!pie.label) {\n                pie.label = {};\n            }\n            pie.label.threshold = parseFloat(attrs.thresholdLabel);\n        }\n        if (attrs.expand) {\n            pie.expand = (attrs.expand === 'true');\n        }\n        chartCtrl.addPie(pie);\n        if (attrs.labelFormatFunction) {\n            chartCtrl.addPieLabelFormatFunction(scope.labelFormatFunction());\n        }\n    };\n\n    return {\n        require: '^c3chart',\n        restrict: 'E',\n        scope: {\n            \"labelFormatFunction\": \"&\"\n        },\n        replace: true,\n        link: pieLinker\n    };\n}\n\nangular.module('gridshore.c3js.chart')\n    .directive('chartPoints', ChartPoints);\n\n/**\n * @ngdoc directive\n * @name chartPoints\n * @description\n *  `chart-points` is used configure the points in for example a line chart. You can\n * configure the radius of the point in normal as well as expand state.\n *\n * Restrict To:\n *   Element\n *\n * Parent Element:\n *   c3chart\n *\n * @param {Boolean} showPoint Whether to show points in the chart.\n *   \n *   {@link http://c3js.org/reference.html#point-show| c3js docs}\n *\n * @param {Boolean} pointExpandEnabled Whether to expand on mouse over.\n *   \n *   {@link http://c3js.org/reference.html#point-focus-expand-enabled| c3js docs}\n *\n * @param {Number} pointExpandRadius Radius of the point when expanded. Default is 1.75 times the \n * normal radius.\n *\n *   {@link http://c3js.org/reference.html#point-focus-expand-r| c3js docs}\n *\n * @param {Number} pointRadius Radius of the point in normal mode. Default radius is 2.5\n *\n *   {@link http://c3js.org/reference.html#point-r| c3js docs}\n *\n * @param {Number} pointSelectRadius Radius of the point when selected, default is 4 times the normal radius.\n *\n *   {@link http://c3js.org/reference.html#point-select-r| c3js docs}\n *\n * @example\n * Usage:\n *   <chart-points show-point=\"...\" point-expand-enabled=\"...\"/>\n * \n * Example:\n *   {@link http://jettro.github.io/c3-angular-directive/#examples}\n * \n */\nfunction ChartPoints () {\n    var pointLinker = function (scope, element, attrs, chartCtrl) {\n        var point = {};\n        if (attrs.showPoint) {\n            point.show =  (attrs.showPoint === 'true');\n        }\n        if (attrs.pointExpandEnabled) {\n            if (!point.focus) {\n                point.focus = {\"expand\":{}};\n            }\n            point.focus.expand.enabled = (attrs.pointsFocusEnabled !== 'false');\n        }\n        if (attrs.pointExpandRadius) {\n            if (!point.focus) {\n                pie.focus = {\"expand\":{}};\n            }\n            point.focus.expand.r = parseInt(attrs.pointFocusRadius);\n        }\n        if (attrs.pointRadius) {\n            point.r = parseInt(attrs.pointRadius);\n        }\n        if (attrs.pointSelectRadius) {\n            point.select = {\"r\":parseInt(attrs.pointSelectRadius)};\n        }\n        chartCtrl.addPoint(point);\n    };\n\n    return {\n        require: '^c3chart',\n        restrict: 'E',\n        scope: {},\n        replace: true,\n        link: pointLinker\n    };\n}\nangular.module('gridshore.c3js.chart')\n    .directive('chartRegion', ChartRegion);\n/**\n * @ngdoc directive\n * @name chartRegion\n * @description\n *  `chart-region` is used to set a region property on a chart.\n *\n * Restrict To:\n *   Element\n *\n * Parent Element:\n *   c3chart\n *\n * @param {String} region-id The id used to uniquely identify the column\n *\n * @param {String} region-style Style to identify the regions.\n *\n *   {@link http://c3js.org/reference.html#data-regions| c3js doc}\n *\n * @param {String} region-starts The regions where the data starts.\n *\n * @param {String} region-ends The regions where the data starts.\n *\n * @example\n * Usage:\n *   <chart-region region-id=\"...\" region-style=\"...\" region-starts=\"...\" region-ends=\"...\"/>\n * Example:\n *   {@link http://jettro.github.io/c3-angular-directive/#examples}\n *\n */\n\nfunction ChartRegion() {\n    var regionLinker = function (scope, element, attrs, chartCtrl) {\n        var style = 'dashed',\n            starts = [],\n            ends = [],\n            intervals = [];\n        if (attrs.regionStyle) {\n            style = attrs.regionStyle;\n        }\n        if (attrs.regionStarts){\n            starts = attrs.regionStarts.split(\",\");\n        }\n        if (attrs.regionEnds){\n            ends = attrs.regionEnds.split(\",\");\n        }\n        if (starts.length > ends.length) {\n            intervals.push({'start': starts.pop(), 'style': style});\n        }\n        if (starts.length < ends.length) {\n            intervals.push({'end': ends.shift(), 'style': style});\n        }\n        starts.forEach(function (value, i) {\n             intervals.push({'start': starts[i], 'end': ends[i], 'style': style});\n        });\n        chartCtrl.addRegion(attrs.regionId, intervals);\n    };\n\n    return {\n        require: '^c3chart',\n        restrict: 'E',\n        scope: {},\n        replace: true,\n        link: regionLinker\n    };\n}\n\nangular.module('gridshore.c3js.chart')\n    .directive('selection', Selection);\n/**\n * @ngdoc directive\n * @name selection\n * @description\n *  `selection` is used to to configure whether it is possible to select elements and interact with the chart to find selected elements.\n *\n * Restrict To:\n *   Element\n *\n * Parent Element:\n *   c3chart\n *\n * @param {String} enabled Specify whether the selection should be enabled or not, default is true.\n *\n *   {@link http://c3js.org/reference.html#data-selection-enabled}\n *\n * @param {String} grouped Enables the grouped selection.\n *\n *   {@link http://c3js.org/reference.html#data-selection-grouped}\n *\n * @param {String} multiple Enables possibility to select multiple items.\n *\n *   {@link http://c3js.org/reference.html#data-selection-multiple}\n *\n * @example\n * Usage:\n *   <selection enabled=\"true\"/>\n * Example:\n *   {@link http://jettro.github.io/c3-angular-directive/#examples}\n */\nfunction Selection () {\n    var selectionLinker = function (scope, element, attrs, chartCtrl) {\n        var enabled = attrs.enabled;\n        var grouped = attrs.grouped;\n        var multiple = attrs.multiple;\n\n        if (enabled && enabled === 'true') {\n            var selection = {\"enabled\": true};\n            if (grouped && grouped === 'true') {\n                selection.grouped = true;\n            }\n            if (multiple && multiple === 'true') {\n                selection.multiple = true;\n            }\n            chartCtrl.addSelection(selection);\n        }\n    };\n\n    return {\n        \"require\": \"^c3chart\",\n        \"restrict\": \"E\",\n        \"scope\": {},\n        \"replace\": true,\n        \"link\": selectionLinker\n    };\n}\n\nangular.module('gridshore.c3js.chart')\n    .directive('chartSize', ChartSize);\n\n/**\n * @ngdoc directive\n * @name chartSize\n * @description\n *  `chart-size` is used to configure size properties of the chart.\n *\n * Restrict To:\n *   Element\n *\n * Parent Element:\n *   c3chart\n *\n * @param {Number} chartWidth Width of the chart element, by default it will be \n * calculated from the parent container.\n *   \n *   {@link http://c3js.org/reference.html#size-width| c3js docs}\n *\n * @param {Number} chartHeight Height of the chart element, by default it will be \n * calculated from the parent container.\n *   \n *   {@link http://c3js.org/reference.html#size-height| c3js docs}\n *\n * @example\n * Usage:\n *   <chart-size chart-height=\"...\" chart-width=\"...\"/>\n * \n * Example:\n *   {@link http://jettro.github.io/c3-angular-directive/#examples}\n * \n * <chart-size chart-height=\"600\" chart-width=\"600\"/>\n */\nfunction ChartSize() {\n    var sizeLinker = function (scope, element, attrs, chartCtrl) {\n        var chartSize = null;\n        var width = attrs.chartWidth;\n        var height = attrs.chartHeight;\n        if (width || height) {\n            chartSize = {};\n            if (width) {\n                chartSize.width = parseInt(width);\n            }\n            if (height) {\n                chartSize.height = parseInt(height);\n            }\n            chartCtrl.addSize(chartSize);\n        }\n    };\n\n    return {\n        \"require\": \"^c3chart\",\n        \"restrict\": \"E\",\n        \"scope\": {},\n        \"replace\": true,\n        \"link\": sizeLinker\n    };\n}\n\nangular.module('gridshore.c3js.chart')\n    .directive('chartTooltip', ChartTooltip);\n\n/**\n * @ngdoc directive\n * @name chartTooltip\n * @description\n *  `chart-tooltip` is used to configure the look and feel of the tooltip. You can\n * configure to show the tooltip or not and the formatting of labels, values, etc.\n *\n * Restrict To:\n *   Element\n *\n * Parent Element:\n *   c3chart\n *\n * @param {Boolean} showTooltip Whether to show the tooltip or not.\n *   \n *   {@link http://c3js.org/reference.html#tooltip-show| c3js docs}\n *\n * @param {Boolean} hideTooltipTitle Whether to show the tooltip title or not.\n *   \n * @param {Boolean} groupTooltip Whether to group all tooltips of the different \n * columns in the chart.\n *   \n *   {@link http://c3js.org/reference.html#tooltip-grouped| c3js docs}\n *\n * @param {Function} titleFormatFunction Function to format the title of the tooltip.\n *   \n *   {@link http://c3js.org/reference.html#tooltip-format-title| c3js docs}\n *\n * @param {Function} nameFormatFunction Function to format the name of the tooltip.\n *   \n *   {@link http://c3js.org/reference.html#tooltip-format-name| c3js docs}\n *\n * @param {Function} valueFormatFunction Function to format the value of the tooltip.\n *   \n *   {@link http://c3js.org/reference.html#tooltip-format-value| c3js docs}\n *\n * @param {Function} contentFormatFunction Function to format the content of the tooltip.\n *\n *   {@link http://c3js.org/reference.html#tooltip-contents| c3js docs}\n *\n * @example\n * Usage:\n *   <chart-tooltip show-tooltip=\"...\" value-format-function=\"...\"/>\n * \n * Example:\n *   {@link http://jettro.github.io/c3-angular-directive/#examples}\n * \n * <chart-tooltip show-tooltip=\"true\" value-format-function=\"vm.formatTooltip\"/>\n *\n * function Ctrl() {\n *   var vm = this;\n *   vm.formatTooltip = formatTooltip;\n *\n *   function formatTooltip(value, ratio, id, index) {\n *       return '$' + value;\n *   }\n * }\n *\n */\nfunction ChartTooltip () {\n    var tooltipLinker = function (scope, element, attrs, chartCtrl) {\n        var tooltip = null;\n        var show      = attrs.showTooltip;\n        var hideTitle = attrs.hideTooltipTitle;\n        var joined    = attrs.joinedTooltip;\n\n        if (show && show === \"false\") {\n            tooltip = {\"show\": false};\n        } else {\n            var grouped = attrs.groupTooltip;\n            if (grouped && grouped === \"false\") {\n                tooltip = {\"grouped\": false};\n            }\n        }\n\n        if (joined && joined === \"true\") {\n            tooltip = tooltip || {};\n            tooltip.contents = function (d, defaultTitleFormat, defaultValueFormat, color) {\n                var $$ = this, config = $$.config,\n                    titleFormat = config.tooltip_format_title || defaultTitleFormat,\n                    nameFormat  = config.tooltip_format_name || function (name) { return name; },\n                    valueFormat = config.tooltip_format_value || defaultValueFormat,\n                    text, i, title, value, name, bgcolor, CLASS;\n                CLASS = {\n                    tooltipContainer: 'c3-tooltip-container',\n                    tooltip         : 'c3-tooltip',\n                    tooltipName     : 'c3-tooltip-name'\n                };\n                for (i = d[0].x; i < (d[0].x + 1); i++) {\n                    if (! (d[i] && (d[i].value || d[i].value === 0))) { continue; }\n\n                    if (! text) {\n                        title = titleFormat ? titleFormat(d[i].x) : d[i].x;\n                        text = \"<table class='\" + CLASS.tooltip + \"'>\" + (title || title === 0 ? \"<tr><th colspan='2'>\" + title + \"</th></tr>\" : \"\");\n                    }\n\n                    value = valueFormat(d[i].value, d[i].ratio, d[i].id, d[i].index);\n                    if (value !== undefined) {\n                        name = nameFormat(d[i].name, d[i].ratio, d[i].id, d[i].index);\n                        bgcolor = $$.levelColor ? $$.levelColor(d[i].value) : color(d[i].id);\n\n                        text += \"<tr class='\" + CLASS.tooltipName + \"-\" + d[i].id + \"'>\";\n                        text += \"<td class='name'><span style='background-color:\" + bgcolor + \"'></span>\" + name + \"</td>\";\n                        text += \"<td class='value'>\" + value + \"</td>\";\n                        text += \"</tr>\";\n                    }\n                }\n                return text + \"</table>\";\n            }\n        }\n\n        if (tooltip != null) {\n            chartCtrl.addTooltip(tooltip);\n        }\n        if (attrs.titleFormatFunction) {\n            chartCtrl.addTooltipTitleFormatFunction(scope.titleFormatFunction());\n        }\n        if (attrs.nameFormatFunction) {\n            chartCtrl.addTooltipNameFormatFunction(scope.nameFormatFunction());\n        }\n        if (attrs.valueFormatFunction) {\n            chartCtrl.addTooltipValueFormatFunction(scope.valueFormatFunction());\n        }\n        if (attrs.contentFormatFunction) {\n            chartCtrl.addTooltipContentFormatFunction(scope.contentFormatFunction());\n        }\n\n    };\n\n    return {\n        \"require\": \"^c3chart\",\n        \"restrict\": \"E\",\n        \"scope\": {\n            \"valueFormatFunction\": \"&\",\n            \"nameFormatFunction\": \"&\",\n            \"titleFormatFunction\": \"&\",\n            \"contentFormatFunction\": \"&\"\n        },\n        \"replace\": true,\n        \"link\": tooltipLinker\n    };\n}\n/*! DataTables 1.10.21\n * ©2008-2020 SpryMedia Ltd - datatables.net/license\n */\n\n/**\n * @summary     DataTables\n * @description Paginate, search and order HTML tables\n * @version     1.10.21\n * @file        jquery.dataTables.js\n * @author      SpryMedia Ltd\n * @contact     www.datatables.net\n * @copyright   Copyright 2008-2020 SpryMedia Ltd.\n *\n * This source file is free software, available under the following license:\n *   MIT license - http://datatables.net/license\n *\n * This source file is distributed in the hope that it will be useful, but\n * WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY\n * or FITNESS FOR A PARTICULAR PURPOSE. See the license files for details.\n *\n * For details please refer to: http://www.datatables.net\n */\n\n/*jslint evil: true, undef: true, browser: true */\n/*globals $,require,jQuery,define,_selector_run,_selector_opts,_selector_first,_selector_row_indexes,_ext,_Api,_api_register,_api_registerPlural,_re_new_lines,_re_html,_re_formatted_numeric,_re_escape_regex,_empty,_intVal,_numToDecimal,_isNumber,_isHtml,_htmlNumeric,_pluck,_pluck_order,_range,_stripHtml,_unique,_fnBuildAjax,_fnAjaxUpdate,_fnAjaxParameters,_fnAjaxUpdateDraw,_fnAjaxDataSrc,_fnAddColumn,_fnColumnOptions,_fnAdjustColumnSizing,_fnVisibleToColumnIndex,_fnColumnIndexToVisible,_fnVisbleColumns,_fnGetColumns,_fnColumnTypes,_fnApplyColumnDefs,_fnHungarianMap,_fnCamelToHungarian,_fnLanguageCompat,_fnBrowserDetect,_fnAddData,_fnAddTr,_fnNodeToDataIndex,_fnNodeToColumnIndex,_fnGetCellData,_fnSetCellData,_fnSplitObjNotation,_fnGetObjectDataFn,_fnSetObjectDataFn,_fnGetDataMaster,_fnClearTable,_fnDeleteIndex,_fnInvalidate,_fnGetRowElements,_fnCreateTr,_fnBuildHead,_fnDrawHead,_fnDraw,_fnReDraw,_fnAddOptionsHtml,_fnDetectHeader,_fnGetUniqueThs,_fnFeatureHtmlFilter,_fnFilterComplete,_fnFilterCustom,_fnFilterColumn,_fnFilter,_fnFilterCreateSearch,_fnEscapeRegex,_fnFilterData,_fnFeatureHtmlInfo,_fnUpdateInfo,_fnInfoMacros,_fnInitialise,_fnInitComplete,_fnLengthChange,_fnFeatureHtmlLength,_fnFeatureHtmlPaginate,_fnPageChange,_fnFeatureHtmlProcessing,_fnProcessingDisplay,_fnFeatureHtmlTable,_fnScrollDraw,_fnApplyToChildren,_fnCalculateColumnWidths,_fnThrottle,_fnConvertToWidth,_fnGetWidestNode,_fnGetMaxLenString,_fnStringToCss,_fnSortFlatten,_fnSort,_fnSortAria,_fnSortListener,_fnSortAttachListener,_fnSortingClasses,_fnSortData,_fnSaveState,_fnLoadState,_fnSettingsFromNode,_fnLog,_fnMap,_fnBindAction,_fnCallbackReg,_fnCallbackFire,_fnLengthOverflow,_fnRenderer,_fnDataSource,_fnRowAttributes*/\n\n(function( factory ) {\n\t\"use strict\";\n\n\tif ( typeof define === 'function' && define.amd ) {\n\t\t// AMD\n\t\tdefine( ['jquery'], function ( $ ) {\n\t\t\treturn factory( $, window, document );\n\t\t} );\n\t}\n\telse if ( typeof exports === 'object' ) {\n\t\t// CommonJS\n\t\tmodule.exports = function (root, $) {\n\t\t\tif ( ! root ) {\n\t\t\t\t// CommonJS environments without a window global must pass a\n\t\t\t\t// root. This will give an error otherwise\n\t\t\t\troot = window;\n\t\t\t}\n\n\t\t\tif ( ! $ ) {\n\t\t\t\t$ = typeof window !== 'undefined' ? // jQuery's factory checks for a global window\n\t\t\t\t\trequire('jquery') :\n\t\t\t\t\trequire('jquery')( root );\n\t\t\t}\n\n\t\t\treturn factory( $, root, root.document );\n\t\t};\n\t}\n\telse {\n\t\t// Browser\n\t\tfactory( jQuery, window, document );\n\t}\n}\n(function( $, window, document, undefined ) {\n\t\"use strict\";\n\n\t/**\n\t * DataTables is a plug-in for the jQuery Javascript library. It is a highly\n\t * flexible tool, based upon the foundations of progressive enhancement,\n\t * which will add advanced interaction controls to any HTML table. For a\n\t * full list of features please refer to\n\t * [DataTables.net](href=\"http://datatables.net).\n\t *\n\t * Note that the `DataTable` object is not a global variable but is aliased\n\t * to `jQuery.fn.DataTable` and `jQuery.fn.dataTable` through which it may\n\t * be  accessed.\n\t *\n\t *  @class\n\t *  @param {object} [init={}] Configuration object for DataTables. Options\n\t *    are defined by {@link DataTable.defaults}\n\t *  @requires jQuery 1.7+\n\t *\n\t *  @example\n\t *    // Basic initialisation\n\t *    $(document).ready( function {\n\t *      $('#example').dataTable();\n\t *    } );\n\t *\n\t *  @example\n\t *    // Initialisation with configuration options - in this case, disable\n\t *    // pagination and sorting.\n\t *    $(document).ready( function {\n\t *      $('#example').dataTable( {\n\t *        \"paginate\": false,\n\t *        \"sort\": false\n\t *      } );\n\t *    } );\n\t */\n\tvar DataTable = function ( options )\n\t{\n\t\t/**\n\t\t * Perform a jQuery selector action on the table's TR elements (from the tbody) and\n\t\t * return the resulting jQuery object.\n\t\t *  @param {string|node|jQuery} sSelector jQuery selector or node collection to act on\n\t\t *  @param {object} [oOpts] Optional parameters for modifying the rows to be included\n\t\t *  @param {string} [oOpts.filter=none] Select TR elements that meet the current filter\n\t\t *    criterion (\"applied\") or all TR elements (i.e. no filter).\n\t\t *  @param {string} [oOpts.order=current] Order of the TR elements in the processed array.\n\t\t *    Can be either 'current', whereby the current sorting of the table is used, or\n\t\t *    'original' whereby the original order the data was read into the table is used.\n\t\t *  @param {string} [oOpts.page=all] Limit the selection to the currently displayed page\n\t\t *    (\"current\") or not (\"all\"). If 'current' is given, then order is assumed to be\n\t\t *    'current' and filter is 'applied', regardless of what they might be given as.\n\t\t *  @returns {object} jQuery object, filtered by the given selector.\n\t\t *  @dtopt API\n\t\t *  @deprecated Since v1.10\n\t\t *\n\t\t *  @example\n\t\t *    $(document).ready(function() {\n\t\t *      var oTable = $('#example').dataTable();\n\t\t *\n\t\t *      // Highlight every second row\n\t\t *      oTable.$('tr:odd').css('backgroundColor', 'blue');\n\t\t *    } );\n\t\t *\n\t\t *  @example\n\t\t *    $(document).ready(function() {\n\t\t *      var oTable = $('#example').dataTable();\n\t\t *\n\t\t *      // Filter to rows with 'Webkit' in them, add a background colour and then\n\t\t *      // remove the filter, thus highlighting the 'Webkit' rows only.\n\t\t *      oTable.fnFilter('Webkit');\n\t\t *      oTable.$('tr', {\"search\": \"applied\"}).css('backgroundColor', 'blue');\n\t\t *      oTable.fnFilter('');\n\t\t *    } );\n\t\t */\n\t\tthis.$ = function ( sSelector, oOpts )\n\t\t{\n\t\t\treturn this.api(true).$( sSelector, oOpts );\n\t\t};\n\t\t\n\t\t\n\t\t/**\n\t\t * Almost identical to $ in operation, but in this case returns the data for the matched\n\t\t * rows - as such, the jQuery selector used should match TR row nodes or TD/TH cell nodes\n\t\t * rather than any descendants, so the data can be obtained for the row/cell. If matching\n\t\t * rows are found, the data returned is the original data array/object that was used to\n\t\t * create the row (or a generated array if from a DOM source).\n\t\t *\n\t\t * This method is often useful in-combination with $ where both functions are given the\n\t\t * same parameters and the array indexes will match identically.\n\t\t *  @param {string|node|jQuery} sSelector jQuery selector or node collection to act on\n\t\t *  @param {object} [oOpts] Optional parameters for modifying the rows to be included\n\t\t *  @param {string} [oOpts.filter=none] Select elements that meet the current filter\n\t\t *    criterion (\"applied\") or all elements (i.e. no filter).\n\t\t *  @param {string} [oOpts.order=current] Order of the data in the processed array.\n\t\t *    Can be either 'current', whereby the current sorting of the table is used, or\n\t\t *    'original' whereby the original order the data was read into the table is used.\n\t\t *  @param {string} [oOpts.page=all] Limit the selection to the currently displayed page\n\t\t *    (\"current\") or not (\"all\"). If 'current' is given, then order is assumed to be\n\t\t *    'current' and filter is 'applied', regardless of what they might be given as.\n\t\t *  @returns {array} Data for the matched elements. If any elements, as a result of the\n\t\t *    selector, were not TR, TD or TH elements in the DataTable, they will have a null\n\t\t *    entry in the array.\n\t\t *  @dtopt API\n\t\t *  @deprecated Since v1.10\n\t\t *\n\t\t *  @example\n\t\t *    $(document).ready(function() {\n\t\t *      var oTable = $('#example').dataTable();\n\t\t *\n\t\t *      // Get the data from the first row in the table\n\t\t *      var data = oTable._('tr:first');\n\t\t *\n\t\t *      // Do something useful with the data\n\t\t *      alert( \"First cell is: \"+data[0] );\n\t\t *    } );\n\t\t *\n\t\t *  @example\n\t\t *    $(document).ready(function() {\n\t\t *      var oTable = $('#example').dataTable();\n\t\t *\n\t\t *      // Filter to 'Webkit' and get all data for\n\t\t *      oTable.fnFilter('Webkit');\n\t\t *      var data = oTable._('tr', {\"search\": \"applied\"});\n\t\t *\n\t\t *      // Do something with the data\n\t\t *      alert( data.length+\" rows matched the search\" );\n\t\t *    } );\n\t\t */\n\t\tthis._ = function ( sSelector, oOpts )\n\t\t{\n\t\t\treturn this.api(true).rows( sSelector, oOpts ).data();\n\t\t};\n\t\t\n\t\t\n\t\t/**\n\t\t * Create a DataTables Api instance, with the currently selected tables for\n\t\t * the Api's context.\n\t\t * @param {boolean} [traditional=false] Set the API instance's context to be\n\t\t *   only the table referred to by the `DataTable.ext.iApiIndex` option, as was\n\t\t *   used in the API presented by DataTables 1.9- (i.e. the traditional mode),\n\t\t *   or if all tables captured in the jQuery object should be used.\n\t\t * @return {DataTables.Api}\n\t\t */\n\t\tthis.api = function ( traditional )\n\t\t{\n\t\t\treturn traditional ?\n\t\t\t\tnew _Api(\n\t\t\t\t\t_fnSettingsFromNode( this[ _ext.iApiIndex ] )\n\t\t\t\t) :\n\t\t\t\tnew _Api( this );\n\t\t};\n\t\t\n\t\t\n\t\t/**\n\t\t * Add a single new row or multiple rows of data to the table. Please note\n\t\t * that this is suitable for client-side processing only - if you are using\n\t\t * server-side processing (i.e. \"bServerSide\": true), then to add data, you\n\t\t * must add it to the data source, i.e. the server-side, through an Ajax call.\n\t\t *  @param {array|object} data The data to be added to the table. This can be:\n\t\t *    <ul>\n\t\t *      <li>1D array of data - add a single row with the data provided</li>\n\t\t *      <li>2D array of arrays - add multiple rows in a single call</li>\n\t\t *      <li>object - data object when using <i>mData</i></li>\n\t\t *      <li>array of objects - multiple data objects when using <i>mData</i></li>\n\t\t *    </ul>\n\t\t *  @param {bool} [redraw=true] redraw the table or not\n\t\t *  @returns {array} An array of integers, representing the list of indexes in\n\t\t *    <i>aoData</i> ({@link DataTable.models.oSettings}) that have been added to\n\t\t *    the table.\n\t\t *  @dtopt API\n\t\t *  @deprecated Since v1.10\n\t\t *\n\t\t *  @example\n\t\t *    // Global var for counter\n\t\t *    var giCount = 2;\n\t\t *\n\t\t *    $(document).ready(function() {\n\t\t *      $('#example').dataTable();\n\t\t *    } );\n\t\t *\n\t\t *    function fnClickAddRow() {\n\t\t *      $('#example').dataTable().fnAddData( [\n\t\t *        giCount+\".1\",\n\t\t *        giCount+\".2\",\n\t\t *        giCount+\".3\",\n\t\t *        giCount+\".4\" ]\n\t\t *      );\n\t\t *\n\t\t *      giCount++;\n\t\t *    }\n\t\t */\n\t\tthis.fnAddData = function( data, redraw )\n\t\t{\n\t\t\tvar api = this.api( true );\n\t\t\n\t\t\t/* Check if we want to add multiple rows or not */\n\t\t\tvar rows = $.isArray(data) && ( $.isArray(data[0]) || $.isPlainObject(data[0]) ) ?\n\t\t\t\tapi.rows.add( data ) :\n\t\t\t\tapi.row.add( data );\n\t\t\n\t\t\tif ( redraw === undefined || redraw ) {\n\t\t\t\tapi.draw();\n\t\t\t}\n\t\t\n\t\t\treturn rows.flatten().toArray();\n\t\t};\n\t\t\n\t\t\n\t\t/**\n\t\t * This function will make DataTables recalculate the column sizes, based on the data\n\t\t * contained in the table and the sizes applied to the columns (in the DOM, CSS or\n\t\t * through the sWidth parameter). This can be useful when the width of the table's\n\t\t * parent element changes (for example a window resize).\n\t\t *  @param {boolean} [bRedraw=true] Redraw the table or not, you will typically want to\n\t\t *  @dtopt API\n\t\t *  @deprecated Since v1.10\n\t\t *\n\t\t *  @example\n\t\t *    $(document).ready(function() {\n\t\t *      var oTable = $('#example').dataTable( {\n\t\t *        \"sScrollY\": \"200px\",\n\t\t *        \"bPaginate\": false\n\t\t *      } );\n\t\t *\n\t\t *      $(window).on('resize', function () {\n\t\t *        oTable.fnAdjustColumnSizing();\n\t\t *      } );\n\t\t *    } );\n\t\t */\n\t\tthis.fnAdjustColumnSizing = function ( bRedraw )\n\t\t{\n\t\t\tvar api = this.api( true ).columns.adjust();\n\t\t\tvar settings = api.settings()[0];\n\t\t\tvar scroll = settings.oScroll;\n\t\t\n\t\t\tif ( bRedraw === undefined || bRedraw ) {\n\t\t\t\tapi.draw( false );\n\t\t\t}\n\t\t\telse if ( scroll.sX !== \"\" || scroll.sY !== \"\" ) {\n\t\t\t\t/* If not redrawing, but scrolling, we want to apply the new column sizes anyway */\n\t\t\t\t_fnScrollDraw( settings );\n\t\t\t}\n\t\t};\n\t\t\n\t\t\n\t\t/**\n\t\t * Quickly and simply clear a table\n\t\t *  @param {bool} [bRedraw=true] redraw the table or not\n\t\t *  @dtopt API\n\t\t *  @deprecated Since v1.10\n\t\t *\n\t\t *  @example\n\t\t *    $(document).ready(function() {\n\t\t *      var oTable = $('#example').dataTable();\n\t\t *\n\t\t *      // Immediately 'nuke' the current rows (perhaps waiting for an Ajax callback...)\n\t\t *      oTable.fnClearTable();\n\t\t *    } );\n\t\t */\n\t\tthis.fnClearTable = function( bRedraw )\n\t\t{\n\t\t\tvar api = this.api( true ).clear();\n\t\t\n\t\t\tif ( bRedraw === undefined || bRedraw ) {\n\t\t\t\tapi.draw();\n\t\t\t}\n\t\t};\n\t\t\n\t\t\n\t\t/**\n\t\t * The exact opposite of 'opening' a row, this function will close any rows which\n\t\t * are currently 'open'.\n\t\t *  @param {node} nTr the table row to 'close'\n\t\t *  @returns {int} 0 on success, or 1 if failed (can't find the row)\n\t\t *  @dtopt API\n\t\t *  @deprecated Since v1.10\n\t\t *\n\t\t *  @example\n\t\t *    $(document).ready(function() {\n\t\t *      var oTable;\n\t\t *\n\t\t *      // 'open' an information row when a row is clicked on\n\t\t *      $('#example tbody tr').click( function () {\n\t\t *        if ( oTable.fnIsOpen(this) ) {\n\t\t *          oTable.fnClose( this );\n\t\t *        } else {\n\t\t *          oTable.fnOpen( this, \"Temporary row opened\", \"info_row\" );\n\t\t *        }\n\t\t *      } );\n\t\t *\n\t\t *      oTable = $('#example').dataTable();\n\t\t *    } );\n\t\t */\n\t\tthis.fnClose = function( nTr )\n\t\t{\n\t\t\tthis.api( true ).row( nTr ).child.hide();\n\t\t};\n\t\t\n\t\t\n\t\t/**\n\t\t * Remove a row for the table\n\t\t *  @param {mixed} target The index of the row from aoData to be deleted, or\n\t\t *    the TR element you want to delete\n\t\t *  @param {function|null} [callBack] Callback function\n\t\t *  @param {bool} [redraw=true] Redraw the table or not\n\t\t *  @returns {array} The row that was deleted\n\t\t *  @dtopt API\n\t\t *  @deprecated Since v1.10\n\t\t *\n\t\t *  @example\n\t\t *    $(document).ready(function() {\n\t\t *      var oTable = $('#example').dataTable();\n\t\t *\n\t\t *      // Immediately remove the first row\n\t\t *      oTable.fnDeleteRow( 0 );\n\t\t *    } );\n\t\t */\n\t\tthis.fnDeleteRow = function( target, callback, redraw )\n\t\t{\n\t\t\tvar api = this.api( true );\n\t\t\tvar rows = api.rows( target );\n\t\t\tvar settings = rows.settings()[0];\n\t\t\tvar data = settings.aoData[ rows[0][0] ];\n\t\t\n\t\t\trows.remove();\n\t\t\n\t\t\tif ( callback ) {\n\t\t\t\tcallback.call( this, settings, data );\n\t\t\t}\n\t\t\n\t\t\tif ( redraw === undefined || redraw ) {\n\t\t\t\tapi.draw();\n\t\t\t}\n\t\t\n\t\t\treturn data;\n\t\t};\n\t\t\n\t\t\n\t\t/**\n\t\t * Restore the table to it's original state in the DOM by removing all of DataTables\n\t\t * enhancements, alterations to the DOM structure of the table and event listeners.\n\t\t *  @param {boolean} [remove=false] Completely remove the table from the DOM\n\t\t *  @dtopt API\n\t\t *  @deprecated Since v1.10\n\t\t *\n\t\t *  @example\n\t\t *    $(document).ready(function() {\n\t\t *      // This example is fairly pointless in reality, but shows how fnDestroy can be used\n\t\t *      var oTable = $('#example').dataTable();\n\t\t *      oTable.fnDestroy();\n\t\t *    } );\n\t\t */\n\t\tthis.fnDestroy = function ( remove )\n\t\t{\n\t\t\tthis.api( true ).destroy( remove );\n\t\t};\n\t\t\n\t\t\n\t\t/**\n\t\t * Redraw the table\n\t\t *  @param {bool} [complete=true] Re-filter and resort (if enabled) the table before the draw.\n\t\t *  @dtopt API\n\t\t *  @deprecated Since v1.10\n\t\t *\n\t\t *  @example\n\t\t *    $(document).ready(function() {\n\t\t *      var oTable = $('#example').dataTable();\n\t\t *\n\t\t *      // Re-draw the table - you wouldn't want to do it here, but it's an example :-)\n\t\t *      oTable.fnDraw();\n\t\t *    } );\n\t\t */\n\t\tthis.fnDraw = function( complete )\n\t\t{\n\t\t\t// Note that this isn't an exact match to the old call to _fnDraw - it takes\n\t\t\t// into account the new data, but can hold position.\n\t\t\tthis.api( true ).draw( complete );\n\t\t};\n\t\t\n\t\t\n\t\t/**\n\t\t * Filter the input based on data\n\t\t *  @param {string} sInput String to filter the table on\n\t\t *  @param {int|null} [iColumn] Column to limit filtering to\n\t\t *  @param {bool} [bRegex=false] Treat as regular expression or not\n\t\t *  @param {bool} [bSmart=true] Perform smart filtering or not\n\t\t *  @param {bool} [bShowGlobal=true] Show the input global filter in it's input box(es)\n\t\t *  @param {bool} [bCaseInsensitive=true] Do case-insensitive matching (true) or not (false)\n\t\t *  @dtopt API\n\t\t *  @deprecated Since v1.10\n\t\t *\n\t\t *  @example\n\t\t *    $(document).ready(function() {\n\t\t *      var oTable = $('#example').dataTable();\n\t\t *\n\t\t *      // Sometime later - filter...\n\t\t *      oTable.fnFilter( 'test string' );\n\t\t *    } );\n\t\t */\n\t\tthis.fnFilter = function( sInput, iColumn, bRegex, bSmart, bShowGlobal, bCaseInsensitive )\n\t\t{\n\t\t\tvar api = this.api( true );\n\t\t\n\t\t\tif ( iColumn === null || iColumn === undefined ) {\n\t\t\t\tapi.search( sInput, bRegex, bSmart, bCaseInsensitive );\n\t\t\t}\n\t\t\telse {\n\t\t\t\tapi.column( iColumn ).search( sInput, bRegex, bSmart, bCaseInsensitive );\n\t\t\t}\n\t\t\n\t\t\tapi.draw();\n\t\t};\n\t\t\n\t\t\n\t\t/**\n\t\t * Get the data for the whole table, an individual row or an individual cell based on the\n\t\t * provided parameters.\n\t\t *  @param {int|node} [src] A TR row node, TD/TH cell node or an integer. If given as\n\t\t *    a TR node then the data source for the whole row will be returned. If given as a\n\t\t *    TD/TH cell node then iCol will be automatically calculated and the data for the\n\t\t *    cell returned. If given as an integer, then this is treated as the aoData internal\n\t\t *    data index for the row (see fnGetPosition) and the data for that row used.\n\t\t *  @param {int} [col] Optional column index that you want the data of.\n\t\t *  @returns {array|object|string} If mRow is undefined, then the data for all rows is\n\t\t *    returned. If mRow is defined, just data for that row, and is iCol is\n\t\t *    defined, only data for the designated cell is returned.\n\t\t *  @dtopt API\n\t\t *  @deprecated Since v1.10\n\t\t *\n\t\t *  @example\n\t\t *    // Row data\n\t\t *    $(document).ready(function() {\n\t\t *      oTable = $('#example').dataTable();\n\t\t *\n\t\t *      oTable.$('tr').click( function () {\n\t\t *        var data = oTable.fnGetData( this );\n\t\t *        // ... do something with the array / object of data for the row\n\t\t *      } );\n\t\t *    } );\n\t\t *\n\t\t *  @example\n\t\t *    // Individual cell data\n\t\t *    $(document).ready(function() {\n\t\t *      oTable = $('#example').dataTable();\n\t\t *\n\t\t *      oTable.$('td').click( function () {\n\t\t *        var sData = oTable.fnGetData( this );\n\t\t *        alert( 'The cell clicked on had the value of '+sData );\n\t\t *      } );\n\t\t *    } );\n\t\t */\n\t\tthis.fnGetData = function( src, col )\n\t\t{\n\t\t\tvar api = this.api( true );\n\t\t\n\t\t\tif ( src !== undefined ) {\n\t\t\t\tvar type = src.nodeName ? src.nodeName.toLowerCase() : '';\n\t\t\n\t\t\t\treturn col !== undefined || type == 'td' || type == 'th' ?\n\t\t\t\t\tapi.cell( src, col ).data() :\n\t\t\t\t\tapi.row( src ).data() || null;\n\t\t\t}\n\t\t\n\t\t\treturn api.data().toArray();\n\t\t};\n\t\t\n\t\t\n\t\t/**\n\t\t * Get an array of the TR nodes that are used in the table's body. Note that you will\n\t\t * typically want to use the '$' API method in preference to this as it is more\n\t\t * flexible.\n\t\t *  @param {int} [iRow] Optional row index for the TR element you want\n\t\t *  @returns {array|node} If iRow is undefined, returns an array of all TR elements\n\t\t *    in the table's body, or iRow is defined, just the TR element requested.\n\t\t *  @dtopt API\n\t\t *  @deprecated Since v1.10\n\t\t *\n\t\t *  @example\n\t\t *    $(document).ready(function() {\n\t\t *      var oTable = $('#example').dataTable();\n\t\t *\n\t\t *      // Get the nodes from the table\n\t\t *      var nNodes = oTable.fnGetNodes( );\n\t\t *    } );\n\t\t */\n\t\tthis.fnGetNodes = function( iRow )\n\t\t{\n\t\t\tvar api = this.api( true );\n\t\t\n\t\t\treturn iRow !== undefined ?\n\t\t\t\tapi.row( iRow ).node() :\n\t\t\t\tapi.rows().nodes().flatten().toArray();\n\t\t};\n\t\t\n\t\t\n\t\t/**\n\t\t * Get the array indexes of a particular cell from it's DOM element\n\t\t * and column index including hidden columns\n\t\t *  @param {node} node this can either be a TR, TD or TH in the table's body\n\t\t *  @returns {int} If nNode is given as a TR, then a single index is returned, or\n\t\t *    if given as a cell, an array of [row index, column index (visible),\n\t\t *    column index (all)] is given.\n\t\t *  @dtopt API\n\t\t *  @deprecated Since v1.10\n\t\t *\n\t\t *  @example\n\t\t *    $(document).ready(function() {\n\t\t *      $('#example tbody td').click( function () {\n\t\t *        // Get the position of the current data from the node\n\t\t *        var aPos = oTable.fnGetPosition( this );\n\t\t *\n\t\t *        // Get the data array for this row\n\t\t *        var aData = oTable.fnGetData( aPos[0] );\n\t\t *\n\t\t *        // Update the data array and return the value\n\t\t *        aData[ aPos[1] ] = 'clicked';\n\t\t *        this.innerHTML = 'clicked';\n\t\t *      } );\n\t\t *\n\t\t *      // Init DataTables\n\t\t *      oTable = $('#example').dataTable();\n\t\t *    } );\n\t\t */\n\t\tthis.fnGetPosition = function( node )\n\t\t{\n\t\t\tvar api = this.api( true );\n\t\t\tvar nodeName = node.nodeName.toUpperCase();\n\t\t\n\t\t\tif ( nodeName == 'TR' ) {\n\t\t\t\treturn api.row( node ).index();\n\t\t\t}\n\t\t\telse if ( nodeName == 'TD' || nodeName == 'TH' ) {\n\t\t\t\tvar cell = api.cell( node ).index();\n\t\t\n\t\t\t\treturn [\n\t\t\t\t\tcell.row,\n\t\t\t\t\tcell.columnVisible,\n\t\t\t\t\tcell.column\n\t\t\t\t];\n\t\t\t}\n\t\t\treturn null;\n\t\t};\n\t\t\n\t\t\n\t\t/**\n\t\t * Check to see if a row is 'open' or not.\n\t\t *  @param {node} nTr the table row to check\n\t\t *  @returns {boolean} true if the row is currently open, false otherwise\n\t\t *  @dtopt API\n\t\t *  @deprecated Since v1.10\n\t\t *\n\t\t *  @example\n\t\t *    $(document).ready(function() {\n\t\t *      var oTable;\n\t\t *\n\t\t *      // 'open' an information row when a row is clicked on\n\t\t *      $('#example tbody tr').click( function () {\n\t\t *        if ( oTable.fnIsOpen(this) ) {\n\t\t *          oTable.fnClose( this );\n\t\t *        } else {\n\t\t *          oTable.fnOpen( this, \"Temporary row opened\", \"info_row\" );\n\t\t *        }\n\t\t *      } );\n\t\t *\n\t\t *      oTable = $('#example').dataTable();\n\t\t *    } );\n\t\t */\n\t\tthis.fnIsOpen = function( nTr )\n\t\t{\n\t\t\treturn this.api( true ).row( nTr ).child.isShown();\n\t\t};\n\t\t\n\t\t\n\t\t/**\n\t\t * This function will place a new row directly after a row which is currently\n\t\t * on display on the page, with the HTML contents that is passed into the\n\t\t * function. This can be used, for example, to ask for confirmation that a\n\t\t * particular record should be deleted.\n\t\t *  @param {node} nTr The table row to 'open'\n\t\t *  @param {string|node|jQuery} mHtml The HTML to put into the row\n\t\t *  @param {string} sClass Class to give the new TD cell\n\t\t *  @returns {node} The row opened. Note that if the table row passed in as the\n\t\t *    first parameter, is not found in the table, this method will silently\n\t\t *    return.\n\t\t *  @dtopt API\n\t\t *  @deprecated Since v1.10\n\t\t *\n\t\t *  @example\n\t\t *    $(document).ready(function() {\n\t\t *      var oTable;\n\t\t *\n\t\t *      // 'open' an information row when a row is clicked on\n\t\t *      $('#example tbody tr').click( function () {\n\t\t *        if ( oTable.fnIsOpen(this) ) {\n\t\t *          oTable.fnClose( this );\n\t\t *        } else {\n\t\t *          oTable.fnOpen( this, \"Temporary row opened\", \"info_row\" );\n\t\t *        }\n\t\t *      } );\n\t\t *\n\t\t *      oTable = $('#example').dataTable();\n\t\t *    } );\n\t\t */\n\t\tthis.fnOpen = function( nTr, mHtml, sClass )\n\t\t{\n\t\t\treturn this.api( true )\n\t\t\t\t.row( nTr )\n\t\t\t\t.child( mHtml, sClass )\n\t\t\t\t.show()\n\t\t\t\t.child()[0];\n\t\t};\n\t\t\n\t\t\n\t\t/**\n\t\t * Change the pagination - provides the internal logic for pagination in a simple API\n\t\t * function. With this function you can have a DataTables table go to the next,\n\t\t * previous, first or last pages.\n\t\t *  @param {string|int} mAction Paging action to take: \"first\", \"previous\", \"next\" or \"last\"\n\t\t *    or page number to jump to (integer), note that page 0 is the first page.\n\t\t *  @param {bool} [bRedraw=true] Redraw the table or not\n\t\t *  @dtopt API\n\t\t *  @deprecated Since v1.10\n\t\t *\n\t\t *  @example\n\t\t *    $(document).ready(function() {\n\t\t *      var oTable = $('#example').dataTable();\n\t\t *      oTable.fnPageChange( 'next' );\n\t\t *    } );\n\t\t */\n\t\tthis.fnPageChange = function ( mAction, bRedraw )\n\t\t{\n\t\t\tvar api = this.api( true ).page( mAction );\n\t\t\n\t\t\tif ( bRedraw === undefined || bRedraw ) {\n\t\t\t\tapi.draw(false);\n\t\t\t}\n\t\t};\n\t\t\n\t\t\n\t\t/**\n\t\t * Show a particular column\n\t\t *  @param {int} iCol The column whose display should be changed\n\t\t *  @param {bool} bShow Show (true) or hide (false) the column\n\t\t *  @param {bool} [bRedraw=true] Redraw the table or not\n\t\t *  @dtopt API\n\t\t *  @deprecated Since v1.10\n\t\t *\n\t\t *  @example\n\t\t *    $(document).ready(function() {\n\t\t *      var oTable = $('#example').dataTable();\n\t\t *\n\t\t *      // Hide the second column after initialisation\n\t\t *      oTable.fnSetColumnVis( 1, false );\n\t\t *    } );\n\t\t */\n\t\tthis.fnSetColumnVis = function ( iCol, bShow, bRedraw )\n\t\t{\n\t\t\tvar api = this.api( true ).column( iCol ).visible( bShow );\n\t\t\n\t\t\tif ( bRedraw === undefined || bRedraw ) {\n\t\t\t\tapi.columns.adjust().draw();\n\t\t\t}\n\t\t};\n\t\t\n\t\t\n\t\t/**\n\t\t * Get the settings for a particular table for external manipulation\n\t\t *  @returns {object} DataTables settings object. See\n\t\t *    {@link DataTable.models.oSettings}\n\t\t *  @dtopt API\n\t\t *  @deprecated Since v1.10\n\t\t *\n\t\t *  @example\n\t\t *    $(document).ready(function() {\n\t\t *      var oTable = $('#example').dataTable();\n\t\t *      var oSettings = oTable.fnSettings();\n\t\t *\n\t\t *      // Show an example parameter from the settings\n\t\t *      alert( oSettings._iDisplayStart );\n\t\t *    } );\n\t\t */\n\t\tthis.fnSettings = function()\n\t\t{\n\t\t\treturn _fnSettingsFromNode( this[_ext.iApiIndex] );\n\t\t};\n\t\t\n\t\t\n\t\t/**\n\t\t * Sort the table by a particular column\n\t\t *  @param {int} iCol the data index to sort on. Note that this will not match the\n\t\t *    'display index' if you have hidden data entries\n\t\t *  @dtopt API\n\t\t *  @deprecated Since v1.10\n\t\t *\n\t\t *  @example\n\t\t *    $(document).ready(function() {\n\t\t *      var oTable = $('#example').dataTable();\n\t\t *\n\t\t *      // Sort immediately with columns 0 and 1\n\t\t *      oTable.fnSort( [ [0,'asc'], [1,'asc'] ] );\n\t\t *    } );\n\t\t */\n\t\tthis.fnSort = function( aaSort )\n\t\t{\n\t\t\tthis.api( true ).order( aaSort ).draw();\n\t\t};\n\t\t\n\t\t\n\t\t/**\n\t\t * Attach a sort listener to an element for a given column\n\t\t *  @param {node} nNode the element to attach the sort listener to\n\t\t *  @param {int} iColumn the column that a click on this node will sort on\n\t\t *  @param {function} [fnCallback] callback function when sort is run\n\t\t *  @dtopt API\n\t\t *  @deprecated Since v1.10\n\t\t *\n\t\t *  @example\n\t\t *    $(document).ready(function() {\n\t\t *      var oTable = $('#example').dataTable();\n\t\t *\n\t\t *      // Sort on column 1, when 'sorter' is clicked on\n\t\t *      oTable.fnSortListener( document.getElementById('sorter'), 1 );\n\t\t *    } );\n\t\t */\n\t\tthis.fnSortListener = function( nNode, iColumn, fnCallback )\n\t\t{\n\t\t\tthis.api( true ).order.listener( nNode, iColumn, fnCallback );\n\t\t};\n\t\t\n\t\t\n\t\t/**\n\t\t * Update a table cell or row - this method will accept either a single value to\n\t\t * update the cell with, an array of values with one element for each column or\n\t\t * an object in the same format as the original data source. The function is\n\t\t * self-referencing in order to make the multi column updates easier.\n\t\t *  @param {object|array|string} mData Data to update the cell/row with\n\t\t *  @param {node|int} mRow TR element you want to update or the aoData index\n\t\t *  @param {int} [iColumn] The column to update, give as null or undefined to\n\t\t *    update a whole row.\n\t\t *  @param {bool} [bRedraw=true] Redraw the table or not\n\t\t *  @param {bool} [bAction=true] Perform pre-draw actions or not\n\t\t *  @returns {int} 0 on success, 1 on error\n\t\t *  @dtopt API\n\t\t *  @deprecated Since v1.10\n\t\t *\n\t\t *  @example\n\t\t *    $(document).ready(function() {\n\t\t *      var oTable = $('#example').dataTable();\n\t\t *      oTable.fnUpdate( 'Example update', 0, 0 ); // Single cell\n\t\t *      oTable.fnUpdate( ['a', 'b', 'c', 'd', 'e'], $('tbody tr')[0] ); // Row\n\t\t *    } );\n\t\t */\n\t\tthis.fnUpdate = function( mData, mRow, iColumn, bRedraw, bAction )\n\t\t{\n\t\t\tvar api = this.api( true );\n\t\t\n\t\t\tif ( iColumn === undefined || iColumn === null ) {\n\t\t\t\tapi.row( mRow ).data( mData );\n\t\t\t}\n\t\t\telse {\n\t\t\t\tapi.cell( mRow, iColumn ).data( mData );\n\t\t\t}\n\t\t\n\t\t\tif ( bAction === undefined || bAction ) {\n\t\t\t\tapi.columns.adjust();\n\t\t\t}\n\t\t\n\t\t\tif ( bRedraw === undefined || bRedraw ) {\n\t\t\t\tapi.draw();\n\t\t\t}\n\t\t\treturn 0;\n\t\t};\n\t\t\n\t\t\n\t\t/**\n\t\t * Provide a common method for plug-ins to check the version of DataTables being used, in order\n\t\t * to ensure compatibility.\n\t\t *  @param {string} sVersion Version string to check for, in the format \"X.Y.Z\". Note that the\n\t\t *    formats \"X\" and \"X.Y\" are also acceptable.\n\t\t *  @returns {boolean} true if this version of DataTables is greater or equal to the required\n\t\t *    version, or false if this version of DataTales is not suitable\n\t\t *  @method\n\t\t *  @dtopt API\n\t\t *  @deprecated Since v1.10\n\t\t *\n\t\t *  @example\n\t\t *    $(document).ready(function() {\n\t\t *      var oTable = $('#example').dataTable();\n\t\t *      alert( oTable.fnVersionCheck( '1.9.0' ) );\n\t\t *    } );\n\t\t */\n\t\tthis.fnVersionCheck = _ext.fnVersionCheck;\n\t\t\n\n\t\tvar _that = this;\n\t\tvar emptyInit = options === undefined;\n\t\tvar len = this.length;\n\n\t\tif ( emptyInit ) {\n\t\t\toptions = {};\n\t\t}\n\n\t\tthis.oApi = this.internal = _ext.internal;\n\n\t\t// Extend with old style plug-in API methods\n\t\tfor ( var fn in DataTable.ext.internal ) {\n\t\t\tif ( fn ) {\n\t\t\t\tthis[fn] = _fnExternApiFunc(fn);\n\t\t\t}\n\t\t}\n\n\t\tthis.each(function() {\n\t\t\t// For each initialisation we want to give it a clean initialisation\n\t\t\t// object that can be bashed around\n\t\t\tvar o = {};\n\t\t\tvar oInit = len > 1 ? // optimisation for single table case\n\t\t\t\t_fnExtend( o, options, true ) :\n\t\t\t\toptions;\n\n\t\t\t/*global oInit,_that,emptyInit*/\n\t\t\tvar i=0, iLen, j, jLen, k, kLen;\n\t\t\tvar sId = this.getAttribute( 'id' );\n\t\t\tvar bInitHandedOff = false;\n\t\t\tvar defaults = DataTable.defaults;\n\t\t\tvar $this = $(this);\n\t\t\t\n\t\t\t\n\t\t\t/* Sanity check */\n\t\t\tif ( this.nodeName.toLowerCase() != 'table' )\n\t\t\t{\n\t\t\t\t_fnLog( null, 0, 'Non-table node initialisation ('+this.nodeName+')', 2 );\n\t\t\t\treturn;\n\t\t\t}\n\t\t\t\n\t\t\t/* Backwards compatibility for the defaults */\n\t\t\t_fnCompatOpts( defaults );\n\t\t\t_fnCompatCols( defaults.column );\n\t\t\t\n\t\t\t/* Convert the camel-case defaults to Hungarian */\n\t\t\t_fnCamelToHungarian( defaults, defaults, true );\n\t\t\t_fnCamelToHungarian( defaults.column, defaults.column, true );\n\t\t\t\n\t\t\t/* Setting up the initialisation object */\n\t\t\t_fnCamelToHungarian( defaults, $.extend( oInit, $this.data() ), true );\n\t\t\t\n\t\t\t\n\t\t\t\n\t\t\t/* Check to see if we are re-initialising a table */\n\t\t\tvar allSettings = DataTable.settings;\n\t\t\tfor ( i=0, iLen=allSettings.length ; i<iLen ; i++ )\n\t\t\t{\n\t\t\t\tvar s = allSettings[i];\n\t\t\t\n\t\t\t\t/* Base check on table node */\n\t\t\t\tif (\n\t\t\t\t\ts.nTable == this ||\n\t\t\t\t\t(s.nTHead && s.nTHead.parentNode == this) ||\n\t\t\t\t\t(s.nTFoot && s.nTFoot.parentNode == this)\n\t\t\t\t) {\n\t\t\t\t\tvar bRetrieve = oInit.bRetrieve !== undefined ? oInit.bRetrieve : defaults.bRetrieve;\n\t\t\t\t\tvar bDestroy = oInit.bDestroy !== undefined ? oInit.bDestroy : defaults.bDestroy;\n\t\t\t\n\t\t\t\t\tif ( emptyInit || bRetrieve )\n\t\t\t\t\t{\n\t\t\t\t\t\treturn s.oInstance;\n\t\t\t\t\t}\n\t\t\t\t\telse if ( bDestroy )\n\t\t\t\t\t{\n\t\t\t\t\t\ts.oInstance.fnDestroy();\n\t\t\t\t\t\tbreak;\n\t\t\t\t\t}\n\t\t\t\t\telse\n\t\t\t\t\t{\n\t\t\t\t\t\t_fnLog( s, 0, 'Cannot reinitialise DataTable', 3 );\n\t\t\t\t\t\treturn;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\n\t\t\t\t/* If the element we are initialising has the same ID as a table which was previously\n\t\t\t\t * initialised, but the table nodes don't match (from before) then we destroy the old\n\t\t\t\t * instance by simply deleting it. This is under the assumption that the table has been\n\t\t\t\t * destroyed by other methods. Anyone using non-id selectors will need to do this manually\n\t\t\t\t */\n\t\t\t\tif ( s.sTableId == this.id )\n\t\t\t\t{\n\t\t\t\t\tallSettings.splice( i, 1 );\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t}\n\t\t\t\n\t\t\t/* Ensure the table has an ID - required for accessibility */\n\t\t\tif ( sId === null || sId === \"\" )\n\t\t\t{\n\t\t\t\tsId = \"DataTables_Table_\"+(DataTable.ext._unique++);\n\t\t\t\tthis.id = sId;\n\t\t\t}\n\t\t\t\n\t\t\t/* Create the settings object for this table and set some of the default parameters */\n\t\t\tvar oSettings = $.extend( true, {}, DataTable.models.oSettings, {\n\t\t\t\t\"sDestroyWidth\": $this[0].style.width,\n\t\t\t\t\"sInstance\":     sId,\n\t\t\t\t\"sTableId\":      sId\n\t\t\t} );\n\t\t\toSettings.nTable = this;\n\t\t\toSettings.oApi   = _that.internal;\n\t\t\toSettings.oInit  = oInit;\n\t\t\t\n\t\t\tallSettings.push( oSettings );\n\t\t\t\n\t\t\t// Need to add the instance after the instance after the settings object has been added\n\t\t\t// to the settings array, so we can self reference the table instance if more than one\n\t\t\toSettings.oInstance = (_that.length===1) ? _that : $this.dataTable();\n\t\t\t\n\t\t\t// Backwards compatibility, before we apply all the defaults\n\t\t\t_fnCompatOpts( oInit );\n\t\t\t_fnLanguageCompat( oInit.oLanguage );\n\t\t\t\n\t\t\t// If the length menu is given, but the init display length is not, use the length menu\n\t\t\tif ( oInit.aLengthMenu && ! oInit.iDisplayLength )\n\t\t\t{\n\t\t\t\toInit.iDisplayLength = $.isArray( oInit.aLengthMenu[0] ) ?\n\t\t\t\t\toInit.aLengthMenu[0][0] : oInit.aLengthMenu[0];\n\t\t\t}\n\t\t\t\n\t\t\t// Apply the defaults and init options to make a single init object will all\n\t\t\t// options defined from defaults and instance options.\n\t\t\toInit = _fnExtend( $.extend( true, {}, defaults ), oInit );\n\t\t\t\n\t\t\t\n\t\t\t// Map the initialisation options onto the settings object\n\t\t\t_fnMap( oSettings.oFeatures, oInit, [\n\t\t\t\t\"bPaginate\",\n\t\t\t\t\"bLengthChange\",\n\t\t\t\t\"bFilter\",\n\t\t\t\t\"bSort\",\n\t\t\t\t\"bSortMulti\",\n\t\t\t\t\"bInfo\",\n\t\t\t\t\"bProcessing\",\n\t\t\t\t\"bAutoWidth\",\n\t\t\t\t\"bSortClasses\",\n\t\t\t\t\"bServerSide\",\n\t\t\t\t\"bDeferRender\"\n\t\t\t] );\n\t\t\t_fnMap( oSettings, oInit, [\n\t\t\t\t\"asStripeClasses\",\n\t\t\t\t\"ajax\",\n\t\t\t\t\"fnServerData\",\n\t\t\t\t\"fnFormatNumber\",\n\t\t\t\t\"sServerMethod\",\n\t\t\t\t\"aaSorting\",\n\t\t\t\t\"aaSortingFixed\",\n\t\t\t\t\"aLengthMenu\",\n\t\t\t\t\"sPaginationType\",\n\t\t\t\t\"sAjaxSource\",\n\t\t\t\t\"sAjaxDataProp\",\n\t\t\t\t\"iStateDuration\",\n\t\t\t\t\"sDom\",\n\t\t\t\t\"bSortCellsTop\",\n\t\t\t\t\"iTabIndex\",\n\t\t\t\t\"fnStateLoadCallback\",\n\t\t\t\t\"fnStateSaveCallback\",\n\t\t\t\t\"renderer\",\n\t\t\t\t\"searchDelay\",\n\t\t\t\t\"rowId\",\n\t\t\t\t[ \"iCookieDuration\", \"iStateDuration\" ], // backwards compat\n\t\t\t\t[ \"oSearch\", \"oPreviousSearch\" ],\n\t\t\t\t[ \"aoSearchCols\", \"aoPreSearchCols\" ],\n\t\t\t\t[ \"iDisplayLength\", \"_iDisplayLength\" ]\n\t\t\t] );\n\t\t\t_fnMap( oSettings.oScroll, oInit, [\n\t\t\t\t[ \"sScrollX\", \"sX\" ],\n\t\t\t\t[ \"sScrollXInner\", \"sXInner\" ],\n\t\t\t\t[ \"sScrollY\", \"sY\" ],\n\t\t\t\t[ \"bScrollCollapse\", \"bCollapse\" ]\n\t\t\t] );\n\t\t\t_fnMap( oSettings.oLanguage, oInit, \"fnInfoCallback\" );\n\t\t\t\n\t\t\t/* Callback functions which are array driven */\n\t\t\t_fnCallbackReg( oSettings, 'aoDrawCallback',       oInit.fnDrawCallback,      'user' );\n\t\t\t_fnCallbackReg( oSettings, 'aoServerParams',       oInit.fnServerParams,      'user' );\n\t\t\t_fnCallbackReg( oSettings, 'aoStateSaveParams',    oInit.fnStateSaveParams,   'user' );\n\t\t\t_fnCallbackReg( oSettings, 'aoStateLoadParams',    oInit.fnStateLoadParams,   'user' );\n\t\t\t_fnCallbackReg( oSettings, 'aoStateLoaded',        oInit.fnStateLoaded,       'user' );\n\t\t\t_fnCallbackReg( oSettings, 'aoRowCallback',        oInit.fnRowCallback,       'user' );\n\t\t\t_fnCallbackReg( oSettings, 'aoRowCreatedCallback', oInit.fnCreatedRow,        'user' );\n\t\t\t_fnCallbackReg( oSettings, 'aoHeaderCallback',     oInit.fnHeaderCallback,    'user' );\n\t\t\t_fnCallbackReg( oSettings, 'aoFooterCallback',     oInit.fnFooterCallback,    'user' );\n\t\t\t_fnCallbackReg( oSettings, 'aoInitComplete',       oInit.fnInitComplete,      'user' );\n\t\t\t_fnCallbackReg( oSettings, 'aoPreDrawCallback',    oInit.fnPreDrawCallback,   'user' );\n\t\t\t\n\t\t\toSettings.rowIdFn = _fnGetObjectDataFn( oInit.rowId );\n\t\t\t\n\t\t\t/* Browser support detection */\n\t\t\t_fnBrowserDetect( oSettings );\n\t\t\t\n\t\t\tvar oClasses = oSettings.oClasses;\n\t\t\t\n\t\t\t$.extend( oClasses, DataTable.ext.classes, oInit.oClasses );\n\t\t\t$this.addClass( oClasses.sTable );\n\t\t\t\n\t\t\t\n\t\t\tif ( oSettings.iInitDisplayStart === undefined )\n\t\t\t{\n\t\t\t\t/* Display start point, taking into account the save saving */\n\t\t\t\toSettings.iInitDisplayStart = oInit.iDisplayStart;\n\t\t\t\toSettings._iDisplayStart = oInit.iDisplayStart;\n\t\t\t}\n\t\t\t\n\t\t\tif ( oInit.iDeferLoading !== null )\n\t\t\t{\n\t\t\t\toSettings.bDeferLoading = true;\n\t\t\t\tvar tmp = $.isArray( oInit.iDeferLoading );\n\t\t\t\toSettings._iRecordsDisplay = tmp ? oInit.iDeferLoading[0] : oInit.iDeferLoading;\n\t\t\t\toSettings._iRecordsTotal = tmp ? oInit.iDeferLoading[1] : oInit.iDeferLoading;\n\t\t\t}\n\t\t\t\n\t\t\t/* Language definitions */\n\t\t\tvar oLanguage = oSettings.oLanguage;\n\t\t\t$.extend( true, oLanguage, oInit.oLanguage );\n\t\t\t\n\t\t\tif ( oLanguage.sUrl )\n\t\t\t{\n\t\t\t\t/* Get the language definitions from a file - because this Ajax call makes the language\n\t\t\t\t * get async to the remainder of this function we use bInitHandedOff to indicate that\n\t\t\t\t * _fnInitialise will be fired by the returned Ajax handler, rather than the constructor\n\t\t\t\t */\n\t\t\t\t$.ajax( {\n\t\t\t\t\tdataType: 'json',\n\t\t\t\t\turl: oLanguage.sUrl,\n\t\t\t\t\tsuccess: function ( json ) {\n\t\t\t\t\t\t_fnLanguageCompat( json );\n\t\t\t\t\t\t_fnCamelToHungarian( defaults.oLanguage, json );\n\t\t\t\t\t\t$.extend( true, oLanguage, json );\n\t\t\t\t\t\t_fnInitialise( oSettings );\n\t\t\t\t\t},\n\t\t\t\t\terror: function () {\n\t\t\t\t\t\t// Error occurred loading language file, continue on as best we can\n\t\t\t\t\t\t_fnInitialise( oSettings );\n\t\t\t\t\t}\n\t\t\t\t} );\n\t\t\t\tbInitHandedOff = true;\n\t\t\t}\n\t\t\t\n\t\t\t/*\n\t\t\t * Stripes\n\t\t\t */\n\t\t\tif ( oInit.asStripeClasses === null )\n\t\t\t{\n\t\t\t\toSettings.asStripeClasses =[\n\t\t\t\t\toClasses.sStripeOdd,\n\t\t\t\t\toClasses.sStripeEven\n\t\t\t\t];\n\t\t\t}\n\t\t\t\n\t\t\t/* Remove row stripe classes if they are already on the table row */\n\t\t\tvar stripeClasses = oSettings.asStripeClasses;\n\t\t\tvar rowOne = $this.children('tbody').find('tr').eq(0);\n\t\t\tif ( $.inArray( true, $.map( stripeClasses, function(el, i) {\n\t\t\t\treturn rowOne.hasClass(el);\n\t\t\t} ) ) !== -1 ) {\n\t\t\t\t$('tbody tr', this).removeClass( stripeClasses.join(' ') );\n\t\t\t\toSettings.asDestroyStripes = stripeClasses.slice();\n\t\t\t}\n\t\t\t\n\t\t\t/*\n\t\t\t * Columns\n\t\t\t * See if we should load columns automatically or use defined ones\n\t\t\t */\n\t\t\tvar anThs = [];\n\t\t\tvar aoColumnsInit;\n\t\t\tvar nThead = this.getElementsByTagName('thead');\n\t\t\tif ( nThead.length !== 0 )\n\t\t\t{\n\t\t\t\t_fnDetectHeader( oSettings.aoHeader, nThead[0] );\n\t\t\t\tanThs = _fnGetUniqueThs( oSettings );\n\t\t\t}\n\t\t\t\n\t\t\t/* If not given a column array, generate one with nulls */\n\t\t\tif ( oInit.aoColumns === null )\n\t\t\t{\n\t\t\t\taoColumnsInit = [];\n\t\t\t\tfor ( i=0, iLen=anThs.length ; i<iLen ; i++ )\n\t\t\t\t{\n\t\t\t\t\taoColumnsInit.push( null );\n\t\t\t\t}\n\t\t\t}\n\t\t\telse\n\t\t\t{\n\t\t\t\taoColumnsInit = oInit.aoColumns;\n\t\t\t}\n\t\t\t\n\t\t\t/* Add the columns */\n\t\t\tfor ( i=0, iLen=aoColumnsInit.length ; i<iLen ; i++ )\n\t\t\t{\n\t\t\t\t_fnAddColumn( oSettings, anThs ? anThs[i] : null );\n\t\t\t}\n\t\t\t\n\t\t\t/* Apply the column definitions */\n\t\t\t_fnApplyColumnDefs( oSettings, oInit.aoColumnDefs, aoColumnsInit, function (iCol, oDef) {\n\t\t\t\t_fnColumnOptions( oSettings, iCol, oDef );\n\t\t\t} );\n\t\t\t\n\t\t\t/* HTML5 attribute detection - build an mData object automatically if the\n\t\t\t * attributes are found\n\t\t\t */\n\t\t\tif ( rowOne.length ) {\n\t\t\t\tvar a = function ( cell, name ) {\n\t\t\t\t\treturn cell.getAttribute( 'data-'+name ) !== null ? name : null;\n\t\t\t\t};\n\t\t\t\n\t\t\t\t$( rowOne[0] ).children('th, td').each( function (i, cell) {\n\t\t\t\t\tvar col = oSettings.aoColumns[i];\n\t\t\t\n\t\t\t\t\tif ( col.mData === i ) {\n\t\t\t\t\t\tvar sort = a( cell, 'sort' ) || a( cell, 'order' );\n\t\t\t\t\t\tvar filter = a( cell, 'filter' ) || a( cell, 'search' );\n\t\t\t\n\t\t\t\t\t\tif ( sort !== null || filter !== null ) {\n\t\t\t\t\t\t\tcol.mData = {\n\t\t\t\t\t\t\t\t_:      i+'.display',\n\t\t\t\t\t\t\t\tsort:   sort !== null   ? i+'.@data-'+sort   : undefined,\n\t\t\t\t\t\t\t\ttype:   sort !== null   ? i+'.@data-'+sort   : undefined,\n\t\t\t\t\t\t\t\tfilter: filter !== null ? i+'.@data-'+filter : undefined\n\t\t\t\t\t\t\t};\n\t\t\t\n\t\t\t\t\t\t\t_fnColumnOptions( oSettings, i );\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t} );\n\t\t\t}\n\t\t\t\n\t\t\tvar features = oSettings.oFeatures;\n\t\t\tvar loadedInit = function () {\n\t\t\t\t/*\n\t\t\t\t * Sorting\n\t\t\t\t * @todo For modularisation (1.11) this needs to do into a sort start up handler\n\t\t\t\t */\n\t\t\t\n\t\t\t\t// If aaSorting is not defined, then we use the first indicator in asSorting\n\t\t\t\t// in case that has been altered, so the default sort reflects that option\n\t\t\t\tif ( oInit.aaSorting === undefined ) {\n\t\t\t\t\tvar sorting = oSettings.aaSorting;\n\t\t\t\t\tfor ( i=0, iLen=sorting.length ; i<iLen ; i++ ) {\n\t\t\t\t\t\tsorting[i][1] = oSettings.aoColumns[ i ].asSorting[0];\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\n\t\t\t\t/* Do a first pass on the sorting classes (allows any size changes to be taken into\n\t\t\t\t * account, and also will apply sorting disabled classes if disabled\n\t\t\t\t */\n\t\t\t\t_fnSortingClasses( oSettings );\n\t\t\t\n\t\t\t\tif ( features.bSort ) {\n\t\t\t\t\t_fnCallbackReg( oSettings, 'aoDrawCallback', function () {\n\t\t\t\t\t\tif ( oSettings.bSorted ) {\n\t\t\t\t\t\t\tvar aSort = _fnSortFlatten( oSettings );\n\t\t\t\t\t\t\tvar sortedColumns = {};\n\t\t\t\n\t\t\t\t\t\t\t$.each( aSort, function (i, val) {\n\t\t\t\t\t\t\t\tsortedColumns[ val.src ] = val.dir;\n\t\t\t\t\t\t\t} );\n\t\t\t\n\t\t\t\t\t\t\t_fnCallbackFire( oSettings, null, 'order', [oSettings, aSort, sortedColumns] );\n\t\t\t\t\t\t\t_fnSortAria( oSettings );\n\t\t\t\t\t\t}\n\t\t\t\t\t} );\n\t\t\t\t}\n\t\t\t\n\t\t\t\t_fnCallbackReg( oSettings, 'aoDrawCallback', function () {\n\t\t\t\t\tif ( oSettings.bSorted || _fnDataSource( oSettings ) === 'ssp' || features.bDeferRender ) {\n\t\t\t\t\t\t_fnSortingClasses( oSettings );\n\t\t\t\t\t}\n\t\t\t\t}, 'sc' );\n\t\t\t\n\t\t\t\n\t\t\t\t/*\n\t\t\t\t * Final init\n\t\t\t\t * Cache the header, body and footer as required, creating them if needed\n\t\t\t\t */\n\t\t\t\n\t\t\t\t// Work around for Webkit bug 83867 - store the caption-side before removing from doc\n\t\t\t\tvar captions = $this.children('caption').each( function () {\n\t\t\t\t\tthis._captionSide = $(this).css('caption-side');\n\t\t\t\t} );\n\t\t\t\n\t\t\t\tvar thead = $this.children('thead');\n\t\t\t\tif ( thead.length === 0 ) {\n\t\t\t\t\tthead = $('<thead/>').appendTo($this);\n\t\t\t\t}\n\t\t\t\toSettings.nTHead = thead[0];\n\t\t\t\n\t\t\t\tvar tbody = $this.children('tbody');\n\t\t\t\tif ( tbody.length === 0 ) {\n\t\t\t\t\ttbody = $('<tbody/>').appendTo($this);\n\t\t\t\t}\n\t\t\t\toSettings.nTBody = tbody[0];\n\t\t\t\n\t\t\t\tvar tfoot = $this.children('tfoot');\n\t\t\t\tif ( tfoot.length === 0 && captions.length > 0 && (oSettings.oScroll.sX !== \"\" || oSettings.oScroll.sY !== \"\") ) {\n\t\t\t\t\t// If we are a scrolling table, and no footer has been given, then we need to create\n\t\t\t\t\t// a tfoot element for the caption element to be appended to\n\t\t\t\t\ttfoot = $('<tfoot/>').appendTo($this);\n\t\t\t\t}\n\t\t\t\n\t\t\t\tif ( tfoot.length === 0 || tfoot.children().length === 0 ) {\n\t\t\t\t\t$this.addClass( oClasses.sNoFooter );\n\t\t\t\t}\n\t\t\t\telse if ( tfoot.length > 0 ) {\n\t\t\t\t\toSettings.nTFoot = tfoot[0];\n\t\t\t\t\t_fnDetectHeader( oSettings.aoFooter, oSettings.nTFoot );\n\t\t\t\t}\n\t\t\t\n\t\t\t\t/* Check if there is data passing into the constructor */\n\t\t\t\tif ( oInit.aaData ) {\n\t\t\t\t\tfor ( i=0 ; i<oInit.aaData.length ; i++ ) {\n\t\t\t\t\t\t_fnAddData( oSettings, oInit.aaData[ i ] );\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\telse if ( oSettings.bDeferLoading || _fnDataSource( oSettings ) == 'dom' ) {\n\t\t\t\t\t/* Grab the data from the page - only do this when deferred loading or no Ajax\n\t\t\t\t\t * source since there is no point in reading the DOM data if we are then going\n\t\t\t\t\t * to replace it with Ajax data\n\t\t\t\t\t */\n\t\t\t\t\t_fnAddTr( oSettings, $(oSettings.nTBody).children('tr') );\n\t\t\t\t}\n\t\t\t\n\t\t\t\t/* Copy the data index array */\n\t\t\t\toSettings.aiDisplay = oSettings.aiDisplayMaster.slice();\n\t\t\t\n\t\t\t\t/* Initialisation complete - table can be drawn */\n\t\t\t\toSettings.bInitialised = true;\n\t\t\t\n\t\t\t\t/* Check if we need to initialise the table (it might not have been handed off to the\n\t\t\t\t * language processor)\n\t\t\t\t */\n\t\t\t\tif ( bInitHandedOff === false ) {\n\t\t\t\t\t_fnInitialise( oSettings );\n\t\t\t\t}\n\t\t\t};\n\t\t\t\n\t\t\t/* Must be done after everything which can be overridden by the state saving! */\n\t\t\tif ( oInit.bStateSave )\n\t\t\t{\n\t\t\t\tfeatures.bStateSave = true;\n\t\t\t\t_fnCallbackReg( oSettings, 'aoDrawCallback', _fnSaveState, 'state_save' );\n\t\t\t\t_fnLoadState( oSettings, oInit, loadedInit );\n\t\t\t}\n\t\t\telse {\n\t\t\t\tloadedInit();\n\t\t\t}\n\t\t\t\n\t\t} );\n\t\t_that = null;\n\t\treturn this;\n\t};\n\n\t\n\t/*\n\t * It is useful to have variables which are scoped locally so only the\n\t * DataTables functions can access them and they don't leak into global space.\n\t * At the same time these functions are often useful over multiple files in the\n\t * core and API, so we list, or at least document, all variables which are used\n\t * by DataTables as private variables here. This also ensures that there is no\n\t * clashing of variable names and that they can easily referenced for reuse.\n\t */\n\t\n\t\n\t// Defined else where\n\t//  _selector_run\n\t//  _selector_opts\n\t//  _selector_first\n\t//  _selector_row_indexes\n\t\n\tvar _ext; // DataTable.ext\n\tvar _Api; // DataTable.Api\n\tvar _api_register; // DataTable.Api.register\n\tvar _api_registerPlural; // DataTable.Api.registerPlural\n\t\n\tvar _re_dic = {};\n\tvar _re_new_lines = /[\\r\\n\\u2028]/g;\n\tvar _re_html = /<.*?>/g;\n\t\n\t// This is not strict ISO8601 - Date.parse() is quite lax, although\n\t// implementations differ between browsers.\n\tvar _re_date = /^\\d{2,4}[\\.\\/\\-]\\d{1,2}[\\.\\/\\-]\\d{1,2}([T ]{1}\\d{1,2}[:\\.]\\d{2}([\\.:]\\d{2})?)?$/;\n\t\n\t// Escape regular expression special characters\n\tvar _re_escape_regex = new RegExp( '(\\\\' + [ '/', '.', '*', '+', '?', '|', '(', ')', '[', ']', '{', '}', '\\\\', '$', '^', '-' ].join('|\\\\') + ')', 'g' );\n\t\n\t// http://en.wikipedia.org/wiki/Foreign_exchange_market\n\t// - \\u20BD - Russian ruble.\n\t// - \\u20a9 - South Korean Won\n\t// - \\u20BA - Turkish Lira\n\t// - \\u20B9 - Indian Rupee\n\t// - R - Brazil (R$) and South Africa\n\t// - fr - Swiss Franc\n\t// - kr - Swedish krona, Norwegian krone and Danish krone\n\t// - \\u2009 is thin space and \\u202F is narrow no-break space, both used in many\n\t// - Ƀ - Bitcoin\n\t// - Ξ - Ethereum\n\t//   standards as thousands separators.\n\tvar _re_formatted_numeric = /[',$£€¥%\\u2009\\u202F\\u20BD\\u20a9\\u20BArfkɃΞ]/gi;\n\t\n\t\n\tvar _empty = function ( d ) {\n\t\treturn !d || d === true || d === '-' ? true : false;\n\t};\n\t\n\t\n\tvar _intVal = function ( s ) {\n\t\tvar integer = parseInt( s, 10 );\n\t\treturn !isNaN(integer) && isFinite(s) ? integer : null;\n\t};\n\t\n\t// Convert from a formatted number with characters other than `.` as the\n\t// decimal place, to a Javascript number\n\tvar _numToDecimal = function ( num, decimalPoint ) {\n\t\t// Cache created regular expressions for speed as this function is called often\n\t\tif ( ! _re_dic[ decimalPoint ] ) {\n\t\t\t_re_dic[ decimalPoint ] = new RegExp( _fnEscapeRegex( decimalPoint ), 'g' );\n\t\t}\n\t\treturn typeof num === 'string' && decimalPoint !== '.' ?\n\t\t\tnum.replace( /\\./g, '' ).replace( _re_dic[ decimalPoint ], '.' ) :\n\t\t\tnum;\n\t};\n\t\n\t\n\tvar _isNumber = function ( d, decimalPoint, formatted ) {\n\t\tvar strType = typeof d === 'string';\n\t\n\t\t// If empty return immediately so there must be a number if it is a\n\t\t// formatted string (this stops the string \"k\", or \"kr\", etc being detected\n\t\t// as a formatted number for currency\n\t\tif ( _empty( d ) ) {\n\t\t\treturn true;\n\t\t}\n\t\n\t\tif ( decimalPoint && strType ) {\n\t\t\td = _numToDecimal( d, decimalPoint );\n\t\t}\n\t\n\t\tif ( formatted && strType ) {\n\t\t\td = d.replace( _re_formatted_numeric, '' );\n\t\t}\n\t\n\t\treturn !isNaN( parseFloat(d) ) && isFinite( d );\n\t};\n\t\n\t\n\t// A string without HTML in it can be considered to be HTML still\n\tvar _isHtml = function ( d ) {\n\t\treturn _empty( d ) || typeof d === 'string';\n\t};\n\t\n\t\n\tvar _htmlNumeric = function ( d, decimalPoint, formatted ) {\n\t\tif ( _empty( d ) ) {\n\t\t\treturn true;\n\t\t}\n\t\n\t\tvar html = _isHtml( d );\n\t\treturn ! html ?\n\t\t\tnull :\n\t\t\t_isNumber( _stripHtml( d ), decimalPoint, formatted ) ?\n\t\t\t\ttrue :\n\t\t\t\tnull;\n\t};\n\t\n\t\n\tvar _pluck = function ( a, prop, prop2 ) {\n\t\tvar out = [];\n\t\tvar i=0, ien=a.length;\n\t\n\t\t// Could have the test in the loop for slightly smaller code, but speed\n\t\t// is essential here\n\t\tif ( prop2 !== undefined ) {\n\t\t\tfor ( ; i<ien ; i++ ) {\n\t\t\t\tif ( a[i] && a[i][ prop ] ) {\n\t\t\t\t\tout.push( a[i][ prop ][ prop2 ] );\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\telse {\n\t\t\tfor ( ; i<ien ; i++ ) {\n\t\t\t\tif ( a[i] ) {\n\t\t\t\t\tout.push( a[i][ prop ] );\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\n\t\treturn out;\n\t};\n\t\n\t\n\t// Basically the same as _pluck, but rather than looping over `a` we use `order`\n\t// as the indexes to pick from `a`\n\tvar _pluck_order = function ( a, order, prop, prop2 )\n\t{\n\t\tvar out = [];\n\t\tvar i=0, ien=order.length;\n\t\n\t\t// Could have the test in the loop for slightly smaller code, but speed\n\t\t// is essential here\n\t\tif ( prop2 !== undefined ) {\n\t\t\tfor ( ; i<ien ; i++ ) {\n\t\t\t\tif ( a[ order[i] ][ prop ] ) {\n\t\t\t\t\tout.push( a[ order[i] ][ prop ][ prop2 ] );\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\telse {\n\t\t\tfor ( ; i<ien ; i++ ) {\n\t\t\t\tout.push( a[ order[i] ][ prop ] );\n\t\t\t}\n\t\t}\n\t\n\t\treturn out;\n\t};\n\t\n\t\n\tvar _range = function ( len, start )\n\t{\n\t\tvar out = [];\n\t\tvar end;\n\t\n\t\tif ( start === undefined ) {\n\t\t\tstart = 0;\n\t\t\tend = len;\n\t\t}\n\t\telse {\n\t\t\tend = start;\n\t\t\tstart = len;\n\t\t}\n\t\n\t\tfor ( var i=start ; i<end ; i++ ) {\n\t\t\tout.push( i );\n\t\t}\n\t\n\t\treturn out;\n\t};\n\t\n\t\n\tvar _removeEmpty = function ( a )\n\t{\n\t\tvar out = [];\n\t\n\t\tfor ( var i=0, ien=a.length ; i<ien ; i++ ) {\n\t\t\tif ( a[i] ) { // careful - will remove all falsy values!\n\t\t\t\tout.push( a[i] );\n\t\t\t}\n\t\t}\n\t\n\t\treturn out;\n\t};\n\t\n\t\n\tvar _stripHtml = function ( d ) {\n\t\treturn d.replace( _re_html, '' );\n\t};\n\t\n\t\n\t/**\n\t * Determine if all values in the array are unique. This means we can short\n\t * cut the _unique method at the cost of a single loop. A sorted array is used\n\t * to easily check the values.\n\t *\n\t * @param  {array} src Source array\n\t * @return {boolean} true if all unique, false otherwise\n\t * @ignore\n\t */\n\tvar _areAllUnique = function ( src ) {\n\t\tif ( src.length < 2 ) {\n\t\t\treturn true;\n\t\t}\n\t\n\t\tvar sorted = src.slice().sort();\n\t\tvar last = sorted[0];\n\t\n\t\tfor ( var i=1, ien=sorted.length ; i<ien ; i++ ) {\n\t\t\tif ( sorted[i] === last ) {\n\t\t\t\treturn false;\n\t\t\t}\n\t\n\t\t\tlast = sorted[i];\n\t\t}\n\t\n\t\treturn true;\n\t};\n\t\n\t\n\t/**\n\t * Find the unique elements in a source array.\n\t *\n\t * @param  {array} src Source array\n\t * @return {array} Array of unique items\n\t * @ignore\n\t */\n\tvar _unique = function ( src )\n\t{\n\t\tif ( _areAllUnique( src ) ) {\n\t\t\treturn src.slice();\n\t\t}\n\t\n\t\t// A faster unique method is to use object keys to identify used values,\n\t\t// but this doesn't work with arrays or objects, which we must also\n\t\t// consider. See jsperf.com/compare-array-unique-versions/4 for more\n\t\t// information.\n\t\tvar\n\t\t\tout = [],\n\t\t\tval,\n\t\t\ti, ien=src.length,\n\t\t\tj, k=0;\n\t\n\t\tagain: for ( i=0 ; i<ien ; i++ ) {\n\t\t\tval = src[i];\n\t\n\t\t\tfor ( j=0 ; j<k ; j++ ) {\n\t\t\t\tif ( out[j] === val ) {\n\t\t\t\t\tcontinue again;\n\t\t\t\t}\n\t\t\t}\n\t\n\t\t\tout.push( val );\n\t\t\tk++;\n\t\t}\n\t\n\t\treturn out;\n\t};\n\t\n\t\n\t/**\n\t * DataTables utility methods\n\t * \n\t * This namespace provides helper methods that DataTables uses internally to\n\t * create a DataTable, but which are not exclusively used only for DataTables.\n\t * These methods can be used by extension authors to save the duplication of\n\t * code.\n\t *\n\t *  @namespace\n\t */\n\tDataTable.util = {\n\t\t/**\n\t\t * Throttle the calls to a function. Arguments and context are maintained\n\t\t * for the throttled function.\n\t\t *\n\t\t * @param {function} fn Function to be called\n\t\t * @param {integer} freq Call frequency in mS\n\t\t * @return {function} Wrapped function\n\t\t */\n\t\tthrottle: function ( fn, freq ) {\n\t\t\tvar\n\t\t\t\tfrequency = freq !== undefined ? freq : 200,\n\t\t\t\tlast,\n\t\t\t\ttimer;\n\t\n\t\t\treturn function () {\n\t\t\t\tvar\n\t\t\t\t\tthat = this,\n\t\t\t\t\tnow  = +new Date(),\n\t\t\t\t\targs = arguments;\n\t\n\t\t\t\tif ( last && now < last + frequency ) {\n\t\t\t\t\tclearTimeout( timer );\n\t\n\t\t\t\t\ttimer = setTimeout( function () {\n\t\t\t\t\t\tlast = undefined;\n\t\t\t\t\t\tfn.apply( that, args );\n\t\t\t\t\t}, frequency );\n\t\t\t\t}\n\t\t\t\telse {\n\t\t\t\t\tlast = now;\n\t\t\t\t\tfn.apply( that, args );\n\t\t\t\t}\n\t\t\t};\n\t\t},\n\t\n\t\n\t\t/**\n\t\t * Escape a string such that it can be used in a regular expression\n\t\t *\n\t\t *  @param {string} val string to escape\n\t\t *  @returns {string} escaped string\n\t\t */\n\t\tescapeRegex: function ( val ) {\n\t\t\treturn val.replace( _re_escape_regex, '\\\\$1' );\n\t\t}\n\t};\n\t\n\t\n\t\n\t/**\n\t * Create a mapping object that allows camel case parameters to be looked up\n\t * for their Hungarian counterparts. The mapping is stored in a private\n\t * parameter called `_hungarianMap` which can be accessed on the source object.\n\t *  @param {object} o\n\t *  @memberof DataTable#oApi\n\t */\n\tfunction _fnHungarianMap ( o )\n\t{\n\t\tvar\n\t\t\thungarian = 'a aa ai ao as b fn i m o s ',\n\t\t\tmatch,\n\t\t\tnewKey,\n\t\t\tmap = {};\n\t\n\t\t$.each( o, function (key, val) {\n\t\t\tmatch = key.match(/^([^A-Z]+?)([A-Z])/);\n\t\n\t\t\tif ( match && hungarian.indexOf(match[1]+' ') !== -1 )\n\t\t\t{\n\t\t\t\tnewKey = key.replace( match[0], match[2].toLowerCase() );\n\t\t\t\tmap[ newKey ] = key;\n\t\n\t\t\t\tif ( match[1] === 'o' )\n\t\t\t\t{\n\t\t\t\t\t_fnHungarianMap( o[key] );\n\t\t\t\t}\n\t\t\t}\n\t\t} );\n\t\n\t\to._hungarianMap = map;\n\t}\n\t\n\t\n\t/**\n\t * Convert from camel case parameters to Hungarian, based on a Hungarian map\n\t * created by _fnHungarianMap.\n\t *  @param {object} src The model object which holds all parameters that can be\n\t *    mapped.\n\t *  @param {object} user The object to convert from camel case to Hungarian.\n\t *  @param {boolean} force When set to `true`, properties which already have a\n\t *    Hungarian value in the `user` object will be overwritten. Otherwise they\n\t *    won't be.\n\t *  @memberof DataTable#oApi\n\t */\n\tfunction _fnCamelToHungarian ( src, user, force )\n\t{\n\t\tif ( ! src._hungarianMap ) {\n\t\t\t_fnHungarianMap( src );\n\t\t}\n\t\n\t\tvar hungarianKey;\n\t\n\t\t$.each( user, function (key, val) {\n\t\t\thungarianKey = src._hungarianMap[ key ];\n\t\n\t\t\tif ( hungarianKey !== undefined && (force || user[hungarianKey] === undefined) )\n\t\t\t{\n\t\t\t\t// For objects, we need to buzz down into the object to copy parameters\n\t\t\t\tif ( hungarianKey.charAt(0) === 'o' )\n\t\t\t\t{\n\t\t\t\t\t// Copy the camelCase options over to the hungarian\n\t\t\t\t\tif ( ! user[ hungarianKey ] ) {\n\t\t\t\t\t\tuser[ hungarianKey ] = {};\n\t\t\t\t\t}\n\t\t\t\t\t$.extend( true, user[hungarianKey], user[key] );\n\t\n\t\t\t\t\t_fnCamelToHungarian( src[hungarianKey], user[hungarianKey], force );\n\t\t\t\t}\n\t\t\t\telse {\n\t\t\t\t\tuser[hungarianKey] = user[ key ];\n\t\t\t\t}\n\t\t\t}\n\t\t} );\n\t}\n\t\n\t\n\t/**\n\t * Language compatibility - when certain options are given, and others aren't, we\n\t * need to duplicate the values over, in order to provide backwards compatibility\n\t * with older language files.\n\t *  @param {object} oSettings dataTables settings object\n\t *  @memberof DataTable#oApi\n\t */\n\tfunction _fnLanguageCompat( lang )\n\t{\n\t\t// Note the use of the Hungarian notation for the parameters in this method as\n\t\t// this is called after the mapping of camelCase to Hungarian\n\t\tvar defaults = DataTable.defaults.oLanguage;\n\t\n\t\t// Default mapping\n\t\tvar defaultDecimal = defaults.sDecimal;\n\t\tif ( defaultDecimal ) {\n\t\t\t_addNumericSort( defaultDecimal );\n\t\t}\n\t\n\t\tif ( lang ) {\n\t\t\tvar zeroRecords = lang.sZeroRecords;\n\t\n\t\t\t// Backwards compatibility - if there is no sEmptyTable given, then use the same as\n\t\t\t// sZeroRecords - assuming that is given.\n\t\t\tif ( ! lang.sEmptyTable && zeroRecords &&\n\t\t\t\tdefaults.sEmptyTable === \"No data available in table\" )\n\t\t\t{\n\t\t\t\t_fnMap( lang, lang, 'sZeroRecords', 'sEmptyTable' );\n\t\t\t}\n\t\n\t\t\t// Likewise with loading records\n\t\t\tif ( ! lang.sLoadingRecords && zeroRecords &&\n\t\t\t\tdefaults.sLoadingRecords === \"Loading...\" )\n\t\t\t{\n\t\t\t\t_fnMap( lang, lang, 'sZeroRecords', 'sLoadingRecords' );\n\t\t\t}\n\t\n\t\t\t// Old parameter name of the thousands separator mapped onto the new\n\t\t\tif ( lang.sInfoThousands ) {\n\t\t\t\tlang.sThousands = lang.sInfoThousands;\n\t\t\t}\n\t\n\t\t\tvar decimal = lang.sDecimal;\n\t\t\tif ( decimal && defaultDecimal !== decimal ) {\n\t\t\t\t_addNumericSort( decimal );\n\t\t\t}\n\t\t}\n\t}\n\t\n\t\n\t/**\n\t * Map one parameter onto another\n\t *  @param {object} o Object to map\n\t *  @param {*} knew The new parameter name\n\t *  @param {*} old The old parameter name\n\t */\n\tvar _fnCompatMap = function ( o, knew, old ) {\n\t\tif ( o[ knew ] !== undefined ) {\n\t\t\to[ old ] = o[ knew ];\n\t\t}\n\t};\n\t\n\t\n\t/**\n\t * Provide backwards compatibility for the main DT options. Note that the new\n\t * options are mapped onto the old parameters, so this is an external interface\n\t * change only.\n\t *  @param {object} init Object to map\n\t */\n\tfunction _fnCompatOpts ( init )\n\t{\n\t\t_fnCompatMap( init, 'ordering',      'bSort' );\n\t\t_fnCompatMap( init, 'orderMulti',    'bSortMulti' );\n\t\t_fnCompatMap( init, 'orderClasses',  'bSortClasses' );\n\t\t_fnCompatMap( init, 'orderCellsTop', 'bSortCellsTop' );\n\t\t_fnCompatMap( init, 'order',         'aaSorting' );\n\t\t_fnCompatMap( init, 'orderFixed',    'aaSortingFixed' );\n\t\t_fnCompatMap( init, 'paging',        'bPaginate' );\n\t\t_fnCompatMap( init, 'pagingType',    'sPaginationType' );\n\t\t_fnCompatMap( init, 'pageLength',    'iDisplayLength' );\n\t\t_fnCompatMap( init, 'searching',     'bFilter' );\n\t\n\t\t// Boolean initialisation of x-scrolling\n\t\tif ( typeof init.sScrollX === 'boolean' ) {\n\t\t\tinit.sScrollX = init.sScrollX ? '100%' : '';\n\t\t}\n\t\tif ( typeof init.scrollX === 'boolean' ) {\n\t\t\tinit.scrollX = init.scrollX ? '100%' : '';\n\t\t}\n\t\n\t\t// Column search objects are in an array, so it needs to be converted\n\t\t// element by element\n\t\tvar searchCols = init.aoSearchCols;\n\t\n\t\tif ( searchCols ) {\n\t\t\tfor ( var i=0, ien=searchCols.length ; i<ien ; i++ ) {\n\t\t\t\tif ( searchCols[i] ) {\n\t\t\t\t\t_fnCamelToHungarian( DataTable.models.oSearch, searchCols[i] );\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\t\n\t\n\t/**\n\t * Provide backwards compatibility for column options. Note that the new options\n\t * are mapped onto the old parameters, so this is an external interface change\n\t * only.\n\t *  @param {object} init Object to map\n\t */\n\tfunction _fnCompatCols ( init )\n\t{\n\t\t_fnCompatMap( init, 'orderable',     'bSortable' );\n\t\t_fnCompatMap( init, 'orderData',     'aDataSort' );\n\t\t_fnCompatMap( init, 'orderSequence', 'asSorting' );\n\t\t_fnCompatMap( init, 'orderDataType', 'sortDataType' );\n\t\n\t\t// orderData can be given as an integer\n\t\tvar dataSort = init.aDataSort;\n\t\tif ( typeof dataSort === 'number' && ! $.isArray( dataSort ) ) {\n\t\t\tinit.aDataSort = [ dataSort ];\n\t\t}\n\t}\n\t\n\t\n\t/**\n\t * Browser feature detection for capabilities, quirks\n\t *  @param {object} settings dataTables settings object\n\t *  @memberof DataTable#oApi\n\t */\n\tfunction _fnBrowserDetect( settings )\n\t{\n\t\t// We don't need to do this every time DataTables is constructed, the values\n\t\t// calculated are specific to the browser and OS configuration which we\n\t\t// don't expect to change between initialisations\n\t\tif ( ! DataTable.__browser ) {\n\t\t\tvar browser = {};\n\t\t\tDataTable.__browser = browser;\n\t\n\t\t\t// Scrolling feature / quirks detection\n\t\t\tvar n = $('<div/>')\n\t\t\t\t.css( {\n\t\t\t\t\tposition: 'fixed',\n\t\t\t\t\ttop: 0,\n\t\t\t\t\tleft: $(window).scrollLeft()*-1, // allow for scrolling\n\t\t\t\t\theight: 1,\n\t\t\t\t\twidth: 1,\n\t\t\t\t\toverflow: 'hidden'\n\t\t\t\t} )\n\t\t\t\t.append(\n\t\t\t\t\t$('<div/>')\n\t\t\t\t\t\t.css( {\n\t\t\t\t\t\t\tposition: 'absolute',\n\t\t\t\t\t\t\ttop: 1,\n\t\t\t\t\t\t\tleft: 1,\n\t\t\t\t\t\t\twidth: 100,\n\t\t\t\t\t\t\toverflow: 'scroll'\n\t\t\t\t\t\t} )\n\t\t\t\t\t\t.append(\n\t\t\t\t\t\t\t$('<div/>')\n\t\t\t\t\t\t\t\t.css( {\n\t\t\t\t\t\t\t\t\twidth: '100%',\n\t\t\t\t\t\t\t\t\theight: 10\n\t\t\t\t\t\t\t\t} )\n\t\t\t\t\t\t)\n\t\t\t\t)\n\t\t\t\t.appendTo( 'body' );\n\t\n\t\t\tvar outer = n.children();\n\t\t\tvar inner = outer.children();\n\t\n\t\t\t// Numbers below, in order, are:\n\t\t\t// inner.offsetWidth, inner.clientWidth, outer.offsetWidth, outer.clientWidth\n\t\t\t//\n\t\t\t// IE6 XP:                           100 100 100  83\n\t\t\t// IE7 Vista:                        100 100 100  83\n\t\t\t// IE 8+ Windows:                     83  83 100  83\n\t\t\t// Evergreen Windows:                 83  83 100  83\n\t\t\t// Evergreen Mac with scrollbars:     85  85 100  85\n\t\t\t// Evergreen Mac without scrollbars: 100 100 100 100\n\t\n\t\t\t// Get scrollbar width\n\t\t\tbrowser.barWidth = outer[0].offsetWidth - outer[0].clientWidth;\n\t\n\t\t\t// IE6/7 will oversize a width 100% element inside a scrolling element, to\n\t\t\t// include the width of the scrollbar, while other browsers ensure the inner\n\t\t\t// element is contained without forcing scrolling\n\t\t\tbrowser.bScrollOversize = inner[0].offsetWidth === 100 && outer[0].clientWidth !== 100;\n\t\n\t\t\t// In rtl text layout, some browsers (most, but not all) will place the\n\t\t\t// scrollbar on the left, rather than the right.\n\t\t\tbrowser.bScrollbarLeft = Math.round( inner.offset().left ) !== 1;\n\t\n\t\t\t// IE8- don't provide height and width for getBoundingClientRect\n\t\t\tbrowser.bBounding = n[0].getBoundingClientRect().width ? true : false;\n\t\n\t\t\tn.remove();\n\t\t}\n\t\n\t\t$.extend( settings.oBrowser, DataTable.__browser );\n\t\tsettings.oScroll.iBarWidth = DataTable.__browser.barWidth;\n\t}\n\t\n\t\n\t/**\n\t * Array.prototype reduce[Right] method, used for browsers which don't support\n\t * JS 1.6. Done this way to reduce code size, since we iterate either way\n\t *  @param {object} settings dataTables settings object\n\t *  @memberof DataTable#oApi\n\t */\n\tfunction _fnReduce ( that, fn, init, start, end, inc )\n\t{\n\t\tvar\n\t\t\ti = start,\n\t\t\tvalue,\n\t\t\tisSet = false;\n\t\n\t\tif ( init !== undefined ) {\n\t\t\tvalue = init;\n\t\t\tisSet = true;\n\t\t}\n\t\n\t\twhile ( i !== end ) {\n\t\t\tif ( ! that.hasOwnProperty(i) ) {\n\t\t\t\tcontinue;\n\t\t\t}\n\t\n\t\t\tvalue = isSet ?\n\t\t\t\tfn( value, that[i], i, that ) :\n\t\t\t\tthat[i];\n\t\n\t\t\tisSet = true;\n\t\t\ti += inc;\n\t\t}\n\t\n\t\treturn value;\n\t}\n\t\n\t/**\n\t * Add a column to the list used for the table with default values\n\t *  @param {object} oSettings dataTables settings object\n\t *  @param {node} nTh The th element for this column\n\t *  @memberof DataTable#oApi\n\t */\n\tfunction _fnAddColumn( oSettings, nTh )\n\t{\n\t\t// Add column to aoColumns array\n\t\tvar oDefaults = DataTable.defaults.column;\n\t\tvar iCol = oSettings.aoColumns.length;\n\t\tvar oCol = $.extend( {}, DataTable.models.oColumn, oDefaults, {\n\t\t\t\"nTh\": nTh ? nTh : document.createElement('th'),\n\t\t\t\"sTitle\":    oDefaults.sTitle    ? oDefaults.sTitle    : nTh ? nTh.innerHTML : '',\n\t\t\t\"aDataSort\": oDefaults.aDataSort ? oDefaults.aDataSort : [iCol],\n\t\t\t\"mData\": oDefaults.mData ? oDefaults.mData : iCol,\n\t\t\tidx: iCol\n\t\t} );\n\t\toSettings.aoColumns.push( oCol );\n\t\n\t\t// Add search object for column specific search. Note that the `searchCols[ iCol ]`\n\t\t// passed into extend can be undefined. This allows the user to give a default\n\t\t// with only some of the parameters defined, and also not give a default\n\t\tvar searchCols = oSettings.aoPreSearchCols;\n\t\tsearchCols[ iCol ] = $.extend( {}, DataTable.models.oSearch, searchCols[ iCol ] );\n\t\n\t\t// Use the default column options function to initialise classes etc\n\t\t_fnColumnOptions( oSettings, iCol, $(nTh).data() );\n\t}\n\t\n\t\n\t/**\n\t * Apply options for a column\n\t *  @param {object} oSettings dataTables settings object\n\t *  @param {int} iCol column index to consider\n\t *  @param {object} oOptions object with sType, bVisible and bSearchable etc\n\t *  @memberof DataTable#oApi\n\t */\n\tfunction _fnColumnOptions( oSettings, iCol, oOptions )\n\t{\n\t\tvar oCol = oSettings.aoColumns[ iCol ];\n\t\tvar oClasses = oSettings.oClasses;\n\t\tvar th = $(oCol.nTh);\n\t\n\t\t// Try to get width information from the DOM. We can't get it from CSS\n\t\t// as we'd need to parse the CSS stylesheet. `width` option can override\n\t\tif ( ! oCol.sWidthOrig ) {\n\t\t\t// Width attribute\n\t\t\toCol.sWidthOrig = th.attr('width') || null;\n\t\n\t\t\t// Style attribute\n\t\t\tvar t = (th.attr('style') || '').match(/width:\\s*(\\d+[pxem%]+)/);\n\t\t\tif ( t ) {\n\t\t\t\toCol.sWidthOrig = t[1];\n\t\t\t}\n\t\t}\n\t\n\t\t/* User specified column options */\n\t\tif ( oOptions !== undefined && oOptions !== null )\n\t\t{\n\t\t\t// Backwards compatibility\n\t\t\t_fnCompatCols( oOptions );\n\t\n\t\t\t// Map camel case parameters to their Hungarian counterparts\n\t\t\t_fnCamelToHungarian( DataTable.defaults.column, oOptions, true );\n\t\n\t\t\t/* Backwards compatibility for mDataProp */\n\t\t\tif ( oOptions.mDataProp !== undefined && !oOptions.mData )\n\t\t\t{\n\t\t\t\toOptions.mData = oOptions.mDataProp;\n\t\t\t}\n\t\n\t\t\tif ( oOptions.sType )\n\t\t\t{\n\t\t\t\toCol._sManualType = oOptions.sType;\n\t\t\t}\n\t\n\t\t\t// `class` is a reserved word in Javascript, so we need to provide\n\t\t\t// the ability to use a valid name for the camel case input\n\t\t\tif ( oOptions.className && ! oOptions.sClass )\n\t\t\t{\n\t\t\t\toOptions.sClass = oOptions.className;\n\t\t\t}\n\t\t\tif ( oOptions.sClass ) {\n\t\t\t\tth.addClass( oOptions.sClass );\n\t\t\t}\n\t\n\t\t\t$.extend( oCol, oOptions );\n\t\t\t_fnMap( oCol, oOptions, \"sWidth\", \"sWidthOrig\" );\n\t\n\t\t\t/* iDataSort to be applied (backwards compatibility), but aDataSort will take\n\t\t\t * priority if defined\n\t\t\t */\n\t\t\tif ( oOptions.iDataSort !== undefined )\n\t\t\t{\n\t\t\t\toCol.aDataSort = [ oOptions.iDataSort ];\n\t\t\t}\n\t\t\t_fnMap( oCol, oOptions, \"aDataSort\" );\n\t\t}\n\t\n\t\t/* Cache the data get and set functions for speed */\n\t\tvar mDataSrc = oCol.mData;\n\t\tvar mData = _fnGetObjectDataFn( mDataSrc );\n\t\tvar mRender = oCol.mRender ? _fnGetObjectDataFn( oCol.mRender ) : null;\n\t\n\t\tvar attrTest = function( src ) {\n\t\t\treturn typeof src === 'string' && src.indexOf('@') !== -1;\n\t\t};\n\t\toCol._bAttrSrc = $.isPlainObject( mDataSrc ) && (\n\t\t\tattrTest(mDataSrc.sort) || attrTest(mDataSrc.type) || attrTest(mDataSrc.filter)\n\t\t);\n\t\toCol._setter = null;\n\t\n\t\toCol.fnGetData = function (rowData, type, meta) {\n\t\t\tvar innerData = mData( rowData, type, undefined, meta );\n\t\n\t\t\treturn mRender && type ?\n\t\t\t\tmRender( innerData, type, rowData, meta ) :\n\t\t\t\tinnerData;\n\t\t};\n\t\toCol.fnSetData = function ( rowData, val, meta ) {\n\t\t\treturn _fnSetObjectDataFn( mDataSrc )( rowData, val, meta );\n\t\t};\n\t\n\t\t// Indicate if DataTables should read DOM data as an object or array\n\t\t// Used in _fnGetRowElements\n\t\tif ( typeof mDataSrc !== 'number' ) {\n\t\t\toSettings._rowReadObject = true;\n\t\t}\n\t\n\t\t/* Feature sorting overrides column specific when off */\n\t\tif ( !oSettings.oFeatures.bSort )\n\t\t{\n\t\t\toCol.bSortable = false;\n\t\t\tth.addClass( oClasses.sSortableNone ); // Have to add class here as order event isn't called\n\t\t}\n\t\n\t\t/* Check that the class assignment is correct for sorting */\n\t\tvar bAsc = $.inArray('asc', oCol.asSorting) !== -1;\n\t\tvar bDesc = $.inArray('desc', oCol.asSorting) !== -1;\n\t\tif ( !oCol.bSortable || (!bAsc && !bDesc) )\n\t\t{\n\t\t\toCol.sSortingClass = oClasses.sSortableNone;\n\t\t\toCol.sSortingClassJUI = \"\";\n\t\t}\n\t\telse if ( bAsc && !bDesc )\n\t\t{\n\t\t\toCol.sSortingClass = oClasses.sSortableAsc;\n\t\t\toCol.sSortingClassJUI = oClasses.sSortJUIAscAllowed;\n\t\t}\n\t\telse if ( !bAsc && bDesc )\n\t\t{\n\t\t\toCol.sSortingClass = oClasses.sSortableDesc;\n\t\t\toCol.sSortingClassJUI = oClasses.sSortJUIDescAllowed;\n\t\t}\n\t\telse\n\t\t{\n\t\t\toCol.sSortingClass = oClasses.sSortable;\n\t\t\toCol.sSortingClassJUI = oClasses.sSortJUI;\n\t\t}\n\t}\n\t\n\t\n\t/**\n\t * Adjust the table column widths for new data. Note: you would probably want to\n\t * do a redraw after calling this function!\n\t *  @param {object} settings dataTables settings object\n\t *  @memberof DataTable#oApi\n\t */\n\tfunction _fnAdjustColumnSizing ( settings )\n\t{\n\t\t/* Not interested in doing column width calculation if auto-width is disabled */\n\t\tif ( settings.oFeatures.bAutoWidth !== false )\n\t\t{\n\t\t\tvar columns = settings.aoColumns;\n\t\n\t\t\t_fnCalculateColumnWidths( settings );\n\t\t\tfor ( var i=0 , iLen=columns.length ; i<iLen ; i++ )\n\t\t\t{\n\t\t\t\tcolumns[i].nTh.style.width = columns[i].sWidth;\n\t\t\t}\n\t\t}\n\t\n\t\tvar scroll = settings.oScroll;\n\t\tif ( scroll.sY !== '' || scroll.sX !== '')\n\t\t{\n\t\t\t_fnScrollDraw( settings );\n\t\t}\n\t\n\t\t_fnCallbackFire( settings, null, 'column-sizing', [settings] );\n\t}\n\t\n\t\n\t/**\n\t * Covert the index of a visible column to the index in the data array (take account\n\t * of hidden columns)\n\t *  @param {object} oSettings dataTables settings object\n\t *  @param {int} iMatch Visible column index to lookup\n\t *  @returns {int} i the data index\n\t *  @memberof DataTable#oApi\n\t */\n\tfunction _fnVisibleToColumnIndex( oSettings, iMatch )\n\t{\n\t\tvar aiVis = _fnGetColumns( oSettings, 'bVisible' );\n\t\n\t\treturn typeof aiVis[iMatch] === 'number' ?\n\t\t\taiVis[iMatch] :\n\t\t\tnull;\n\t}\n\t\n\t\n\t/**\n\t * Covert the index of an index in the data array and convert it to the visible\n\t *   column index (take account of hidden columns)\n\t *  @param {int} iMatch Column index to lookup\n\t *  @param {object} oSettings dataTables settings object\n\t *  @returns {int} i the data index\n\t *  @memberof DataTable#oApi\n\t */\n\tfunction _fnColumnIndexToVisible( oSettings, iMatch )\n\t{\n\t\tvar aiVis = _fnGetColumns( oSettings, 'bVisible' );\n\t\tvar iPos = $.inArray( iMatch, aiVis );\n\t\n\t\treturn iPos !== -1 ? iPos : null;\n\t}\n\t\n\t\n\t/**\n\t * Get the number of visible columns\n\t *  @param {object} oSettings dataTables settings object\n\t *  @returns {int} i the number of visible columns\n\t *  @memberof DataTable#oApi\n\t */\n\tfunction _fnVisbleColumns( oSettings )\n\t{\n\t\tvar vis = 0;\n\t\n\t\t// No reduce in IE8, use a loop for now\n\t\t$.each( oSettings.aoColumns, function ( i, col ) {\n\t\t\tif ( col.bVisible && $(col.nTh).css('display') !== 'none' ) {\n\t\t\t\tvis++;\n\t\t\t}\n\t\t} );\n\t\n\t\treturn vis;\n\t}\n\t\n\t\n\t/**\n\t * Get an array of column indexes that match a given property\n\t *  @param {object} oSettings dataTables settings object\n\t *  @param {string} sParam Parameter in aoColumns to look for - typically\n\t *    bVisible or bSearchable\n\t *  @returns {array} Array of indexes with matched properties\n\t *  @memberof DataTable#oApi\n\t */\n\tfunction _fnGetColumns( oSettings, sParam )\n\t{\n\t\tvar a = [];\n\t\n\t\t$.map( oSettings.aoColumns, function(val, i) {\n\t\t\tif ( val[sParam] ) {\n\t\t\t\ta.push( i );\n\t\t\t}\n\t\t} );\n\t\n\t\treturn a;\n\t}\n\t\n\t\n\t/**\n\t * Calculate the 'type' of a column\n\t *  @param {object} settings dataTables settings object\n\t *  @memberof DataTable#oApi\n\t */\n\tfunction _fnColumnTypes ( settings )\n\t{\n\t\tvar columns = settings.aoColumns;\n\t\tvar data = settings.aoData;\n\t\tvar types = DataTable.ext.type.detect;\n\t\tvar i, ien, j, jen, k, ken;\n\t\tvar col, cell, detectedType, cache;\n\t\n\t\t// For each column, spin over the \n\t\tfor ( i=0, ien=columns.length ; i<ien ; i++ ) {\n\t\t\tcol = columns[i];\n\t\t\tcache = [];\n\t\n\t\t\tif ( ! col.sType && col._sManualType ) {\n\t\t\t\tcol.sType = col._sManualType;\n\t\t\t}\n\t\t\telse if ( ! col.sType ) {\n\t\t\t\tfor ( j=0, jen=types.length ; j<jen ; j++ ) {\n\t\t\t\t\tfor ( k=0, ken=data.length ; k<ken ; k++ ) {\n\t\t\t\t\t\t// Use a cache array so we only need to get the type data\n\t\t\t\t\t\t// from the formatter once (when using multiple detectors)\n\t\t\t\t\t\tif ( cache[k] === undefined ) {\n\t\t\t\t\t\t\tcache[k] = _fnGetCellData( settings, k, i, 'type' );\n\t\t\t\t\t\t}\n\t\n\t\t\t\t\t\tdetectedType = types[j]( cache[k], settings );\n\t\n\t\t\t\t\t\t// If null, then this type can't apply to this column, so\n\t\t\t\t\t\t// rather than testing all cells, break out. There is an\n\t\t\t\t\t\t// exception for the last type which is `html`. We need to\n\t\t\t\t\t\t// scan all rows since it is possible to mix string and HTML\n\t\t\t\t\t\t// types\n\t\t\t\t\t\tif ( ! detectedType && j !== types.length-1 ) {\n\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\t}\n\t\n\t\t\t\t\t\t// Only a single match is needed for html type since it is\n\t\t\t\t\t\t// bottom of the pile and very similar to string\n\t\t\t\t\t\tif ( detectedType === 'html' ) {\n\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\n\t\t\t\t\t// Type is valid for all data points in the column - use this\n\t\t\t\t\t// type\n\t\t\t\t\tif ( detectedType ) {\n\t\t\t\t\t\tcol.sType = detectedType;\n\t\t\t\t\t\tbreak;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\n\t\t\t\t// Fall back - if no type was detected, always use string\n\t\t\t\tif ( ! col.sType ) {\n\t\t\t\t\tcol.sType = 'string';\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\t\n\t\n\t/**\n\t * Take the column definitions and static columns arrays and calculate how\n\t * they relate to column indexes. The callback function will then apply the\n\t * definition found for a column to a suitable configuration object.\n\t *  @param {object} oSettings dataTables settings object\n\t *  @param {array} aoColDefs The aoColumnDefs array that is to be applied\n\t *  @param {array} aoCols The aoColumns array that defines columns individually\n\t *  @param {function} fn Callback function - takes two parameters, the calculated\n\t *    column index and the definition for that column.\n\t *  @memberof DataTable#oApi\n\t */\n\tfunction _fnApplyColumnDefs( oSettings, aoColDefs, aoCols, fn )\n\t{\n\t\tvar i, iLen, j, jLen, k, kLen, def;\n\t\tvar columns = oSettings.aoColumns;\n\t\n\t\t// Column definitions with aTargets\n\t\tif ( aoColDefs )\n\t\t{\n\t\t\t/* Loop over the definitions array - loop in reverse so first instance has priority */\n\t\t\tfor ( i=aoColDefs.length-1 ; i>=0 ; i-- )\n\t\t\t{\n\t\t\t\tdef = aoColDefs[i];\n\t\n\t\t\t\t/* Each definition can target multiple columns, as it is an array */\n\t\t\t\tvar aTargets = def.targets !== undefined ?\n\t\t\t\t\tdef.targets :\n\t\t\t\t\tdef.aTargets;\n\t\n\t\t\t\tif ( ! $.isArray( aTargets ) )\n\t\t\t\t{\n\t\t\t\t\taTargets = [ aTargets ];\n\t\t\t\t}\n\t\n\t\t\t\tfor ( j=0, jLen=aTargets.length ; j<jLen ; j++ )\n\t\t\t\t{\n\t\t\t\t\tif ( typeof aTargets[j] === 'number' && aTargets[j] >= 0 )\n\t\t\t\t\t{\n\t\t\t\t\t\t/* Add columns that we don't yet know about */\n\t\t\t\t\t\twhile( columns.length <= aTargets[j] )\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\t_fnAddColumn( oSettings );\n\t\t\t\t\t\t}\n\t\n\t\t\t\t\t\t/* Integer, basic index */\n\t\t\t\t\t\tfn( aTargets[j], def );\n\t\t\t\t\t}\n\t\t\t\t\telse if ( typeof aTargets[j] === 'number' && aTargets[j] < 0 )\n\t\t\t\t\t{\n\t\t\t\t\t\t/* Negative integer, right to left column counting */\n\t\t\t\t\t\tfn( columns.length+aTargets[j], def );\n\t\t\t\t\t}\n\t\t\t\t\telse if ( typeof aTargets[j] === 'string' )\n\t\t\t\t\t{\n\t\t\t\t\t\t/* Class name matching on TH element */\n\t\t\t\t\t\tfor ( k=0, kLen=columns.length ; k<kLen ; k++ )\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tif ( aTargets[j] == \"_all\" ||\n\t\t\t\t\t\t\t     $(columns[k].nTh).hasClass( aTargets[j] ) )\n\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\tfn( k, def );\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\n\t\t// Statically defined columns array\n\t\tif ( aoCols )\n\t\t{\n\t\t\tfor ( i=0, iLen=aoCols.length ; i<iLen ; i++ )\n\t\t\t{\n\t\t\t\tfn( i, aoCols[i] );\n\t\t\t}\n\t\t}\n\t}\n\t\n\t/**\n\t * Add a data array to the table, creating DOM node etc. This is the parallel to\n\t * _fnGatherData, but for adding rows from a Javascript source, rather than a\n\t * DOM source.\n\t *  @param {object} oSettings dataTables settings object\n\t *  @param {array} aData data array to be added\n\t *  @param {node} [nTr] TR element to add to the table - optional. If not given,\n\t *    DataTables will create a row automatically\n\t *  @param {array} [anTds] Array of TD|TH elements for the row - must be given\n\t *    if nTr is.\n\t *  @returns {int} >=0 if successful (index of new aoData entry), -1 if failed\n\t *  @memberof DataTable#oApi\n\t */\n\tfunction _fnAddData ( oSettings, aDataIn, nTr, anTds )\n\t{\n\t\t/* Create the object for storing information about this new row */\n\t\tvar iRow = oSettings.aoData.length;\n\t\tvar oData = $.extend( true, {}, DataTable.models.oRow, {\n\t\t\tsrc: nTr ? 'dom' : 'data',\n\t\t\tidx: iRow\n\t\t} );\n\t\n\t\toData._aData = aDataIn;\n\t\toSettings.aoData.push( oData );\n\t\n\t\t/* Create the cells */\n\t\tvar nTd, sThisType;\n\t\tvar columns = oSettings.aoColumns;\n\t\n\t\t// Invalidate the column types as the new data needs to be revalidated\n\t\tfor ( var i=0, iLen=columns.length ; i<iLen ; i++ )\n\t\t{\n\t\t\tcolumns[i].sType = null;\n\t\t}\n\t\n\t\t/* Add to the display array */\n\t\toSettings.aiDisplayMaster.push( iRow );\n\t\n\t\tvar id = oSettings.rowIdFn( aDataIn );\n\t\tif ( id !== undefined ) {\n\t\t\toSettings.aIds[ id ] = oData;\n\t\t}\n\t\n\t\t/* Create the DOM information, or register it if already present */\n\t\tif ( nTr || ! oSettings.oFeatures.bDeferRender )\n\t\t{\n\t\t\t_fnCreateTr( oSettings, iRow, nTr, anTds );\n\t\t}\n\t\n\t\treturn iRow;\n\t}\n\t\n\t\n\t/**\n\t * Add one or more TR elements to the table. Generally we'd expect to\n\t * use this for reading data from a DOM sourced table, but it could be\n\t * used for an TR element. Note that if a TR is given, it is used (i.e.\n\t * it is not cloned).\n\t *  @param {object} settings dataTables settings object\n\t *  @param {array|node|jQuery} trs The TR element(s) to add to the table\n\t *  @returns {array} Array of indexes for the added rows\n\t *  @memberof DataTable#oApi\n\t */\n\tfunction _fnAddTr( settings, trs )\n\t{\n\t\tvar row;\n\t\n\t\t// Allow an individual node to be passed in\n\t\tif ( ! (trs instanceof $) ) {\n\t\t\ttrs = $(trs);\n\t\t}\n\t\n\t\treturn trs.map( function (i, el) {\n\t\t\trow = _fnGetRowElements( settings, el );\n\t\t\treturn _fnAddData( settings, row.data, el, row.cells );\n\t\t} );\n\t}\n\t\n\t\n\t/**\n\t * Take a TR element and convert it to an index in aoData\n\t *  @param {object} oSettings dataTables settings object\n\t *  @param {node} n the TR element to find\n\t *  @returns {int} index if the node is found, null if not\n\t *  @memberof DataTable#oApi\n\t */\n\tfunction _fnNodeToDataIndex( oSettings, n )\n\t{\n\t\treturn (n._DT_RowIndex!==undefined) ? n._DT_RowIndex : null;\n\t}\n\t\n\t\n\t/**\n\t * Take a TD element and convert it into a column data index (not the visible index)\n\t *  @param {object} oSettings dataTables settings object\n\t *  @param {int} iRow The row number the TD/TH can be found in\n\t *  @param {node} n The TD/TH element to find\n\t *  @returns {int} index if the node is found, -1 if not\n\t *  @memberof DataTable#oApi\n\t */\n\tfunction _fnNodeToColumnIndex( oSettings, iRow, n )\n\t{\n\t\treturn $.inArray( n, oSettings.aoData[ iRow ].anCells );\n\t}\n\t\n\t\n\t/**\n\t * Get the data for a given cell from the internal cache, taking into account data mapping\n\t *  @param {object} settings dataTables settings object\n\t *  @param {int} rowIdx aoData row id\n\t *  @param {int} colIdx Column index\n\t *  @param {string} type data get type ('display', 'type' 'filter' 'sort')\n\t *  @returns {*} Cell data\n\t *  @memberof DataTable#oApi\n\t */\n\tfunction _fnGetCellData( settings, rowIdx, colIdx, type )\n\t{\n\t\tvar draw           = settings.iDraw;\n\t\tvar col            = settings.aoColumns[colIdx];\n\t\tvar rowData        = settings.aoData[rowIdx]._aData;\n\t\tvar defaultContent = col.sDefaultContent;\n\t\tvar cellData       = col.fnGetData( rowData, type, {\n\t\t\tsettings: settings,\n\t\t\trow:      rowIdx,\n\t\t\tcol:      colIdx\n\t\t} );\n\t\n\t\tif ( cellData === undefined ) {\n\t\t\tif ( settings.iDrawError != draw && defaultContent === null ) {\n\t\t\t\t_fnLog( settings, 0, \"Requested unknown parameter \"+\n\t\t\t\t\t(typeof col.mData=='function' ? '{function}' : \"'\"+col.mData+\"'\")+\n\t\t\t\t\t\" for row \"+rowIdx+\", column \"+colIdx, 4 );\n\t\t\t\tsettings.iDrawError = draw;\n\t\t\t}\n\t\t\treturn defaultContent;\n\t\t}\n\t\n\t\t// When the data source is null and a specific data type is requested (i.e.\n\t\t// not the original data), we can use default column data\n\t\tif ( (cellData === rowData || cellData === null) && defaultContent !== null && type !== undefined ) {\n\t\t\tcellData = defaultContent;\n\t\t}\n\t\telse if ( typeof cellData === 'function' ) {\n\t\t\t// If the data source is a function, then we run it and use the return,\n\t\t\t// executing in the scope of the data object (for instances)\n\t\t\treturn cellData.call( rowData );\n\t\t}\n\t\n\t\tif ( cellData === null && type == 'display' ) {\n\t\t\treturn '';\n\t\t}\n\t\treturn cellData;\n\t}\n\t\n\t\n\t/**\n\t * Set the value for a specific cell, into the internal data cache\n\t *  @param {object} settings dataTables settings object\n\t *  @param {int} rowIdx aoData row id\n\t *  @param {int} colIdx Column index\n\t *  @param {*} val Value to set\n\t *  @memberof DataTable#oApi\n\t */\n\tfunction _fnSetCellData( settings, rowIdx, colIdx, val )\n\t{\n\t\tvar col     = settings.aoColumns[colIdx];\n\t\tvar rowData = settings.aoData[rowIdx]._aData;\n\t\n\t\tcol.fnSetData( rowData, val, {\n\t\t\tsettings: settings,\n\t\t\trow:      rowIdx,\n\t\t\tcol:      colIdx\n\t\t}  );\n\t}\n\t\n\t\n\t// Private variable that is used to match action syntax in the data property object\n\tvar __reArray = /\\[.*?\\]$/;\n\tvar __reFn = /\\(\\)$/;\n\t\n\t/**\n\t * Split string on periods, taking into account escaped periods\n\t * @param  {string} str String to split\n\t * @return {array} Split string\n\t */\n\tfunction _fnSplitObjNotation( str )\n\t{\n\t\treturn $.map( str.match(/(\\\\.|[^\\.])+/g) || [''], function ( s ) {\n\t\t\treturn s.replace(/\\\\\\./g, '.');\n\t\t} );\n\t}\n\t\n\t\n\t/**\n\t * Return a function that can be used to get data from a source object, taking\n\t * into account the ability to use nested objects as a source\n\t *  @param {string|int|function} mSource The data source for the object\n\t *  @returns {function} Data get function\n\t *  @memberof DataTable#oApi\n\t */\n\tfunction _fnGetObjectDataFn( mSource )\n\t{\n\t\tif ( $.isPlainObject( mSource ) )\n\t\t{\n\t\t\t/* Build an object of get functions, and wrap them in a single call */\n\t\t\tvar o = {};\n\t\t\t$.each( mSource, function (key, val) {\n\t\t\t\tif ( val ) {\n\t\t\t\t\to[key] = _fnGetObjectDataFn( val );\n\t\t\t\t}\n\t\t\t} );\n\t\n\t\t\treturn function (data, type, row, meta) {\n\t\t\t\tvar t = o[type] || o._;\n\t\t\t\treturn t !== undefined ?\n\t\t\t\t\tt(data, type, row, meta) :\n\t\t\t\t\tdata;\n\t\t\t};\n\t\t}\n\t\telse if ( mSource === null )\n\t\t{\n\t\t\t/* Give an empty string for rendering / sorting etc */\n\t\t\treturn function (data) { // type, row and meta also passed, but not used\n\t\t\t\treturn data;\n\t\t\t};\n\t\t}\n\t\telse if ( typeof mSource === 'function' )\n\t\t{\n\t\t\treturn function (data, type, row, meta) {\n\t\t\t\treturn mSource( data, type, row, meta );\n\t\t\t};\n\t\t}\n\t\telse if ( typeof mSource === 'string' && (mSource.indexOf('.') !== -1 ||\n\t\t\t      mSource.indexOf('[') !== -1 || mSource.indexOf('(') !== -1) )\n\t\t{\n\t\t\t/* If there is a . in the source string then the data source is in a\n\t\t\t * nested object so we loop over the data for each level to get the next\n\t\t\t * level down. On each loop we test for undefined, and if found immediately\n\t\t\t * return. This allows entire objects to be missing and sDefaultContent to\n\t\t\t * be used if defined, rather than throwing an error\n\t\t\t */\n\t\t\tvar fetchData = function (data, type, src) {\n\t\t\t\tvar arrayNotation, funcNotation, out, innerSrc;\n\t\n\t\t\t\tif ( src !== \"\" )\n\t\t\t\t{\n\t\t\t\t\tvar a = _fnSplitObjNotation( src );\n\t\n\t\t\t\t\tfor ( var i=0, iLen=a.length ; i<iLen ; i++ )\n\t\t\t\t\t{\n\t\t\t\t\t\t// Check if we are dealing with special notation\n\t\t\t\t\t\tarrayNotation = a[i].match(__reArray);\n\t\t\t\t\t\tfuncNotation = a[i].match(__reFn);\n\t\n\t\t\t\t\t\tif ( arrayNotation )\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\t// Array notation\n\t\t\t\t\t\t\ta[i] = a[i].replace(__reArray, '');\n\t\n\t\t\t\t\t\t\t// Condition allows simply [] to be passed in\n\t\t\t\t\t\t\tif ( a[i] !== \"\" ) {\n\t\t\t\t\t\t\t\tdata = data[ a[i] ];\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\tout = [];\n\t\n\t\t\t\t\t\t\t// Get the remainder of the nested object to get\n\t\t\t\t\t\t\ta.splice( 0, i+1 );\n\t\t\t\t\t\t\tinnerSrc = a.join('.');\n\t\n\t\t\t\t\t\t\t// Traverse each entry in the array getting the properties requested\n\t\t\t\t\t\t\tif ( $.isArray( data ) ) {\n\t\t\t\t\t\t\t\tfor ( var j=0, jLen=data.length ; j<jLen ; j++ ) {\n\t\t\t\t\t\t\t\t\tout.push( fetchData( data[j], type, innerSrc ) );\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t}\n\t\n\t\t\t\t\t\t\t// If a string is given in between the array notation indicators, that\n\t\t\t\t\t\t\t// is used to join the strings together, otherwise an array is returned\n\t\t\t\t\t\t\tvar join = arrayNotation[0].substring(1, arrayNotation[0].length-1);\n\t\t\t\t\t\t\tdata = (join===\"\") ? out : out.join(join);\n\t\n\t\t\t\t\t\t\t// The inner call to fetchData has already traversed through the remainder\n\t\t\t\t\t\t\t// of the source requested, so we exit from the loop\n\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\t}\n\t\t\t\t\t\telse if ( funcNotation )\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\t// Function call\n\t\t\t\t\t\t\ta[i] = a[i].replace(__reFn, '');\n\t\t\t\t\t\t\tdata = data[ a[i] ]();\n\t\t\t\t\t\t\tcontinue;\n\t\t\t\t\t\t}\n\t\n\t\t\t\t\t\tif ( data === null || data[ a[i] ] === undefined )\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\treturn undefined;\n\t\t\t\t\t\t}\n\t\t\t\t\t\tdata = data[ a[i] ];\n\t\t\t\t\t}\n\t\t\t\t}\n\t\n\t\t\t\treturn data;\n\t\t\t};\n\t\n\t\t\treturn function (data, type) { // row and meta also passed, but not used\n\t\t\t\treturn fetchData( data, type, mSource );\n\t\t\t};\n\t\t}\n\t\telse\n\t\t{\n\t\t\t/* Array or flat object mapping */\n\t\t\treturn function (data, type) { // row and meta also passed, but not used\n\t\t\t\treturn data[mSource];\n\t\t\t};\n\t\t}\n\t}\n\t\n\t\n\t/**\n\t * Return a function that can be used to set data from a source object, taking\n\t * into account the ability to use nested objects as a source\n\t *  @param {string|int|function} mSource The data source for the object\n\t *  @returns {function} Data set function\n\t *  @memberof DataTable#oApi\n\t */\n\tfunction _fnSetObjectDataFn( mSource )\n\t{\n\t\tif ( $.isPlainObject( mSource ) )\n\t\t{\n\t\t\t/* Unlike get, only the underscore (global) option is used for for\n\t\t\t * setting data since we don't know the type here. This is why an object\n\t\t\t * option is not documented for `mData` (which is read/write), but it is\n\t\t\t * for `mRender` which is read only.\n\t\t\t */\n\t\t\treturn _fnSetObjectDataFn( mSource._ );\n\t\t}\n\t\telse if ( mSource === null )\n\t\t{\n\t\t\t/* Nothing to do when the data source is null */\n\t\t\treturn function () {};\n\t\t}\n\t\telse if ( typeof mSource === 'function' )\n\t\t{\n\t\t\treturn function (data, val, meta) {\n\t\t\t\tmSource( data, 'set', val, meta );\n\t\t\t};\n\t\t}\n\t\telse if ( typeof mSource === 'string' && (mSource.indexOf('.') !== -1 ||\n\t\t\t      mSource.indexOf('[') !== -1 || mSource.indexOf('(') !== -1) )\n\t\t{\n\t\t\t/* Like the get, we need to get data from a nested object */\n\t\t\tvar setData = function (data, val, src) {\n\t\t\t\tvar a = _fnSplitObjNotation( src ), b;\n\t\t\t\tvar aLast = a[a.length-1];\n\t\t\t\tvar arrayNotation, funcNotation, o, innerSrc;\n\t\n\t\t\t\tfor ( var i=0, iLen=a.length-1 ; i<iLen ; i++ )\n\t\t\t\t{\n\t\t\t\t\t// Check if we are dealing with an array notation request\n\t\t\t\t\tarrayNotation = a[i].match(__reArray);\n\t\t\t\t\tfuncNotation = a[i].match(__reFn);\n\t\n\t\t\t\t\tif ( arrayNotation )\n\t\t\t\t\t{\n\t\t\t\t\t\ta[i] = a[i].replace(__reArray, '');\n\t\t\t\t\t\tdata[ a[i] ] = [];\n\t\n\t\t\t\t\t\t// Get the remainder of the nested object to set so we can recurse\n\t\t\t\t\t\tb = a.slice();\n\t\t\t\t\t\tb.splice( 0, i+1 );\n\t\t\t\t\t\tinnerSrc = b.join('.');\n\t\n\t\t\t\t\t\t// Traverse each entry in the array setting the properties requested\n\t\t\t\t\t\tif ( $.isArray( val ) )\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tfor ( var j=0, jLen=val.length ; j<jLen ; j++ )\n\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\to = {};\n\t\t\t\t\t\t\t\tsetData( o, val[j], innerSrc );\n\t\t\t\t\t\t\t\tdata[ a[i] ].push( o );\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t\telse\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\t// We've been asked to save data to an array, but it\n\t\t\t\t\t\t\t// isn't array data to be saved. Best that can be done\n\t\t\t\t\t\t\t// is to just save the value.\n\t\t\t\t\t\t\tdata[ a[i] ] = val;\n\t\t\t\t\t\t}\n\t\n\t\t\t\t\t\t// The inner call to setData has already traversed through the remainder\n\t\t\t\t\t\t// of the source and has set the data, thus we can exit here\n\t\t\t\t\t\treturn;\n\t\t\t\t\t}\n\t\t\t\t\telse if ( funcNotation )\n\t\t\t\t\t{\n\t\t\t\t\t\t// Function call\n\t\t\t\t\t\ta[i] = a[i].replace(__reFn, '');\n\t\t\t\t\t\tdata = data[ a[i] ]( val );\n\t\t\t\t\t}\n\t\n\t\t\t\t\t// If the nested object doesn't currently exist - since we are\n\t\t\t\t\t// trying to set the value - create it\n\t\t\t\t\tif ( data[ a[i] ] === null || data[ a[i] ] === undefined )\n\t\t\t\t\t{\n\t\t\t\t\t\tdata[ a[i] ] = {};\n\t\t\t\t\t}\n\t\t\t\t\tdata = data[ a[i] ];\n\t\t\t\t}\n\t\n\t\t\t\t// Last item in the input - i.e, the actual set\n\t\t\t\tif ( aLast.match(__reFn ) )\n\t\t\t\t{\n\t\t\t\t\t// Function call\n\t\t\t\t\tdata = data[ aLast.replace(__reFn, '') ]( val );\n\t\t\t\t}\n\t\t\t\telse\n\t\t\t\t{\n\t\t\t\t\t// If array notation is used, we just want to strip it and use the property name\n\t\t\t\t\t// and assign the value. If it isn't used, then we get the result we want anyway\n\t\t\t\t\tdata[ aLast.replace(__reArray, '') ] = val;\n\t\t\t\t}\n\t\t\t};\n\t\n\t\t\treturn function (data, val) { // meta is also passed in, but not used\n\t\t\t\treturn setData( data, val, mSource );\n\t\t\t};\n\t\t}\n\t\telse\n\t\t{\n\t\t\t/* Array or flat object mapping */\n\t\t\treturn function (data, val) { // meta is also passed in, but not used\n\t\t\t\tdata[mSource] = val;\n\t\t\t};\n\t\t}\n\t}\n\t\n\t\n\t/**\n\t * Return an array with the full table data\n\t *  @param {object} oSettings dataTables settings object\n\t *  @returns array {array} aData Master data array\n\t *  @memberof DataTable#oApi\n\t */\n\tfunction _fnGetDataMaster ( settings )\n\t{\n\t\treturn _pluck( settings.aoData, '_aData' );\n\t}\n\t\n\t\n\t/**\n\t * Nuke the table\n\t *  @param {object} oSettings dataTables settings object\n\t *  @memberof DataTable#oApi\n\t */\n\tfunction _fnClearTable( settings )\n\t{\n\t\tsettings.aoData.length = 0;\n\t\tsettings.aiDisplayMaster.length = 0;\n\t\tsettings.aiDisplay.length = 0;\n\t\tsettings.aIds = {};\n\t}\n\t\n\t\n\t /**\n\t * Take an array of integers (index array) and remove a target integer (value - not\n\t * the key!)\n\t *  @param {array} a Index array to target\n\t *  @param {int} iTarget value to find\n\t *  @memberof DataTable#oApi\n\t */\n\tfunction _fnDeleteIndex( a, iTarget, splice )\n\t{\n\t\tvar iTargetIndex = -1;\n\t\n\t\tfor ( var i=0, iLen=a.length ; i<iLen ; i++ )\n\t\t{\n\t\t\tif ( a[i] == iTarget )\n\t\t\t{\n\t\t\t\tiTargetIndex = i;\n\t\t\t}\n\t\t\telse if ( a[i] > iTarget )\n\t\t\t{\n\t\t\t\ta[i]--;\n\t\t\t}\n\t\t}\n\t\n\t\tif ( iTargetIndex != -1 && splice === undefined )\n\t\t{\n\t\t\ta.splice( iTargetIndex, 1 );\n\t\t}\n\t}\n\t\n\t\n\t/**\n\t * Mark cached data as invalid such that a re-read of the data will occur when\n\t * the cached data is next requested. Also update from the data source object.\n\t *\n\t * @param {object} settings DataTables settings object\n\t * @param {int}    rowIdx   Row index to invalidate\n\t * @param {string} [src]    Source to invalidate from: undefined, 'auto', 'dom'\n\t *     or 'data'\n\t * @param {int}    [colIdx] Column index to invalidate. If undefined the whole\n\t *     row will be invalidated\n\t * @memberof DataTable#oApi\n\t *\n\t * @todo For the modularisation of v1.11 this will need to become a callback, so\n\t *   the sort and filter methods can subscribe to it. That will required\n\t *   initialisation options for sorting, which is why it is not already baked in\n\t */\n\tfunction _fnInvalidate( settings, rowIdx, src, colIdx )\n\t{\n\t\tvar row = settings.aoData[ rowIdx ];\n\t\tvar i, ien;\n\t\tvar cellWrite = function ( cell, col ) {\n\t\t\t// This is very frustrating, but in IE if you just write directly\n\t\t\t// to innerHTML, and elements that are overwritten are GC'ed,\n\t\t\t// even if there is a reference to them elsewhere\n\t\t\twhile ( cell.childNodes.length ) {\n\t\t\t\tcell.removeChild( cell.firstChild );\n\t\t\t}\n\t\n\t\t\tcell.innerHTML = _fnGetCellData( settings, rowIdx, col, 'display' );\n\t\t};\n\t\n\t\t// Are we reading last data from DOM or the data object?\n\t\tif ( src === 'dom' || ((! src || src === 'auto') && row.src === 'dom') ) {\n\t\t\t// Read the data from the DOM\n\t\t\trow._aData = _fnGetRowElements(\n\t\t\t\t\tsettings, row, colIdx, colIdx === undefined ? undefined : row._aData\n\t\t\t\t)\n\t\t\t\t.data;\n\t\t}\n\t\telse {\n\t\t\t// Reading from data object, update the DOM\n\t\t\tvar cells = row.anCells;\n\t\n\t\t\tif ( cells ) {\n\t\t\t\tif ( colIdx !== undefined ) {\n\t\t\t\t\tcellWrite( cells[colIdx], colIdx );\n\t\t\t\t}\n\t\t\t\telse {\n\t\t\t\t\tfor ( i=0, ien=cells.length ; i<ien ; i++ ) {\n\t\t\t\t\t\tcellWrite( cells[i], i );\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\n\t\t// For both row and cell invalidation, the cached data for sorting and\n\t\t// filtering is nulled out\n\t\trow._aSortData = null;\n\t\trow._aFilterData = null;\n\t\n\t\t// Invalidate the type for a specific column (if given) or all columns since\n\t\t// the data might have changed\n\t\tvar cols = settings.aoColumns;\n\t\tif ( colIdx !== undefined ) {\n\t\t\tcols[ colIdx ].sType = null;\n\t\t}\n\t\telse {\n\t\t\tfor ( i=0, ien=cols.length ; i<ien ; i++ ) {\n\t\t\t\tcols[i].sType = null;\n\t\t\t}\n\t\n\t\t\t// Update DataTables special `DT_*` attributes for the row\n\t\t\t_fnRowAttributes( settings, row );\n\t\t}\n\t}\n\t\n\t\n\t/**\n\t * Build a data source object from an HTML row, reading the contents of the\n\t * cells that are in the row.\n\t *\n\t * @param {object} settings DataTables settings object\n\t * @param {node|object} TR element from which to read data or existing row\n\t *   object from which to re-read the data from the cells\n\t * @param {int} [colIdx] Optional column index\n\t * @param {array|object} [d] Data source object. If `colIdx` is given then this\n\t *   parameter should also be given and will be used to write the data into.\n\t *   Only the column in question will be written\n\t * @returns {object} Object with two parameters: `data` the data read, in\n\t *   document order, and `cells` and array of nodes (they can be useful to the\n\t *   caller, so rather than needing a second traversal to get them, just return\n\t *   them from here).\n\t * @memberof DataTable#oApi\n\t */\n\tfunction _fnGetRowElements( settings, row, colIdx, d )\n\t{\n\t\tvar\n\t\t\ttds = [],\n\t\t\ttd = row.firstChild,\n\t\t\tname, col, o, i=0, contents,\n\t\t\tcolumns = settings.aoColumns,\n\t\t\tobjectRead = settings._rowReadObject;\n\t\n\t\t// Allow the data object to be passed in, or construct\n\t\td = d !== undefined ?\n\t\t\td :\n\t\t\tobjectRead ?\n\t\t\t\t{} :\n\t\t\t\t[];\n\t\n\t\tvar attr = function ( str, td  ) {\n\t\t\tif ( typeof str === 'string' ) {\n\t\t\t\tvar idx = str.indexOf('@');\n\t\n\t\t\t\tif ( idx !== -1 ) {\n\t\t\t\t\tvar attr = str.substring( idx+1 );\n\t\t\t\t\tvar setter = _fnSetObjectDataFn( str );\n\t\t\t\t\tsetter( d, td.getAttribute( attr ) );\n\t\t\t\t}\n\t\t\t}\n\t\t};\n\t\n\t\t// Read data from a cell and store into the data object\n\t\tvar cellProcess = function ( cell ) {\n\t\t\tif ( colIdx === undefined || colIdx === i ) {\n\t\t\t\tcol = columns[i];\n\t\t\t\tcontents = $.trim(cell.innerHTML);\n\t\n\t\t\t\tif ( col && col._bAttrSrc ) {\n\t\t\t\t\tvar setter = _fnSetObjectDataFn( col.mData._ );\n\t\t\t\t\tsetter( d, contents );\n\t\n\t\t\t\t\tattr( col.mData.sort, cell );\n\t\t\t\t\tattr( col.mData.type, cell );\n\t\t\t\t\tattr( col.mData.filter, cell );\n\t\t\t\t}\n\t\t\t\telse {\n\t\t\t\t\t// Depending on the `data` option for the columns the data can\n\t\t\t\t\t// be read to either an object or an array.\n\t\t\t\t\tif ( objectRead ) {\n\t\t\t\t\t\tif ( ! col._setter ) {\n\t\t\t\t\t\t\t// Cache the setter function\n\t\t\t\t\t\t\tcol._setter = _fnSetObjectDataFn( col.mData );\n\t\t\t\t\t\t}\n\t\t\t\t\t\tcol._setter( d, contents );\n\t\t\t\t\t}\n\t\t\t\t\telse {\n\t\t\t\t\t\td[i] = contents;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\n\t\t\ti++;\n\t\t};\n\t\n\t\tif ( td ) {\n\t\t\t// `tr` element was passed in\n\t\t\twhile ( td ) {\n\t\t\t\tname = td.nodeName.toUpperCase();\n\t\n\t\t\t\tif ( name == \"TD\" || name == \"TH\" ) {\n\t\t\t\t\tcellProcess( td );\n\t\t\t\t\ttds.push( td );\n\t\t\t\t}\n\t\n\t\t\t\ttd = td.nextSibling;\n\t\t\t}\n\t\t}\n\t\telse {\n\t\t\t// Existing row object passed in\n\t\t\ttds = row.anCells;\n\t\n\t\t\tfor ( var j=0, jen=tds.length ; j<jen ; j++ ) {\n\t\t\t\tcellProcess( tds[j] );\n\t\t\t}\n\t\t}\n\t\n\t\t// Read the ID from the DOM if present\n\t\tvar rowNode = row.firstChild ? row : row.nTr;\n\t\n\t\tif ( rowNode ) {\n\t\t\tvar id = rowNode.getAttribute( 'id' );\n\t\n\t\t\tif ( id ) {\n\t\t\t\t_fnSetObjectDataFn( settings.rowId )( d, id );\n\t\t\t}\n\t\t}\n\t\n\t\treturn {\n\t\t\tdata: d,\n\t\t\tcells: tds\n\t\t};\n\t}\n\t/**\n\t * Create a new TR element (and it's TD children) for a row\n\t *  @param {object} oSettings dataTables settings object\n\t *  @param {int} iRow Row to consider\n\t *  @param {node} [nTrIn] TR element to add to the table - optional. If not given,\n\t *    DataTables will create a row automatically\n\t *  @param {array} [anTds] Array of TD|TH elements for the row - must be given\n\t *    if nTr is.\n\t *  @memberof DataTable#oApi\n\t */\n\tfunction _fnCreateTr ( oSettings, iRow, nTrIn, anTds )\n\t{\n\t\tvar\n\t\t\trow = oSettings.aoData[iRow],\n\t\t\trowData = row._aData,\n\t\t\tcells = [],\n\t\t\tnTr, nTd, oCol,\n\t\t\ti, iLen, create;\n\t\n\t\tif ( row.nTr === null )\n\t\t{\n\t\t\tnTr = nTrIn || document.createElement('tr');\n\t\n\t\t\trow.nTr = nTr;\n\t\t\trow.anCells = cells;\n\t\n\t\t\t/* Use a private property on the node to allow reserve mapping from the node\n\t\t\t * to the aoData array for fast look up\n\t\t\t */\n\t\t\tnTr._DT_RowIndex = iRow;\n\t\n\t\t\t/* Special parameters can be given by the data source to be used on the row */\n\t\t\t_fnRowAttributes( oSettings, row );\n\t\n\t\t\t/* Process each column */\n\t\t\tfor ( i=0, iLen=oSettings.aoColumns.length ; i<iLen ; i++ )\n\t\t\t{\n\t\t\t\toCol = oSettings.aoColumns[i];\n\t\t\t\tcreate = nTrIn ? false : true;\n\t\n\t\t\t\tnTd = create ? document.createElement( oCol.sCellType ) : anTds[i];\n\t\t\t\tnTd._DT_CellIndex = {\n\t\t\t\t\trow: iRow,\n\t\t\t\t\tcolumn: i\n\t\t\t\t};\n\t\t\t\t\n\t\t\t\tcells.push( nTd );\n\t\n\t\t\t\t// Need to create the HTML if new, or if a rendering function is defined\n\t\t\t\tif ( create || ((!nTrIn || oCol.mRender || oCol.mData !== i) &&\n\t\t\t\t\t (!$.isPlainObject(oCol.mData) || oCol.mData._ !== i+'.display')\n\t\t\t\t)) {\n\t\t\t\t\tnTd.innerHTML = _fnGetCellData( oSettings, iRow, i, 'display' );\n\t\t\t\t}\n\t\n\t\t\t\t/* Add user defined class */\n\t\t\t\tif ( oCol.sClass )\n\t\t\t\t{\n\t\t\t\t\tnTd.className += ' '+oCol.sClass;\n\t\t\t\t}\n\t\n\t\t\t\t// Visibility - add or remove as required\n\t\t\t\tif ( oCol.bVisible && ! nTrIn )\n\t\t\t\t{\n\t\t\t\t\tnTr.appendChild( nTd );\n\t\t\t\t}\n\t\t\t\telse if ( ! oCol.bVisible && nTrIn )\n\t\t\t\t{\n\t\t\t\t\tnTd.parentNode.removeChild( nTd );\n\t\t\t\t}\n\t\n\t\t\t\tif ( oCol.fnCreatedCell )\n\t\t\t\t{\n\t\t\t\t\toCol.fnCreatedCell.call( oSettings.oInstance,\n\t\t\t\t\t\tnTd, _fnGetCellData( oSettings, iRow, i ), rowData, iRow, i\n\t\t\t\t\t);\n\t\t\t\t}\n\t\t\t}\n\t\n\t\t\t_fnCallbackFire( oSettings, 'aoRowCreatedCallback', null, [nTr, rowData, iRow, cells] );\n\t\t}\n\t\n\t\t// Remove once webkit bug 131819 and Chromium bug 365619 have been resolved\n\t\t// and deployed\n\t\trow.nTr.setAttribute( 'role', 'row' );\n\t}\n\t\n\t\n\t/**\n\t * Add attributes to a row based on the special `DT_*` parameters in a data\n\t * source object.\n\t *  @param {object} settings DataTables settings object\n\t *  @param {object} DataTables row object for the row to be modified\n\t *  @memberof DataTable#oApi\n\t */\n\tfunction _fnRowAttributes( settings, row )\n\t{\n\t\tvar tr = row.nTr;\n\t\tvar data = row._aData;\n\t\n\t\tif ( tr ) {\n\t\t\tvar id = settings.rowIdFn( data );\n\t\n\t\t\tif ( id ) {\n\t\t\t\ttr.id = id;\n\t\t\t}\n\t\n\t\t\tif ( data.DT_RowClass ) {\n\t\t\t\t// Remove any classes added by DT_RowClass before\n\t\t\t\tvar a = data.DT_RowClass.split(' ');\n\t\t\t\trow.__rowc = row.__rowc ?\n\t\t\t\t\t_unique( row.__rowc.concat( a ) ) :\n\t\t\t\t\ta;\n\t\n\t\t\t\t$(tr)\n\t\t\t\t\t.removeClass( row.__rowc.join(' ') )\n\t\t\t\t\t.addClass( data.DT_RowClass );\n\t\t\t}\n\t\n\t\t\tif ( data.DT_RowAttr ) {\n\t\t\t\t$(tr).attr( data.DT_RowAttr );\n\t\t\t}\n\t\n\t\t\tif ( data.DT_RowData ) {\n\t\t\t\t$(tr).data( data.DT_RowData );\n\t\t\t}\n\t\t}\n\t}\n\t\n\t\n\t/**\n\t * Create the HTML header for the table\n\t *  @param {object} oSettings dataTables settings object\n\t *  @memberof DataTable#oApi\n\t */\n\tfunction _fnBuildHead( oSettings )\n\t{\n\t\tvar i, ien, cell, row, column;\n\t\tvar thead = oSettings.nTHead;\n\t\tvar tfoot = oSettings.nTFoot;\n\t\tvar createHeader = $('th, td', thead).length === 0;\n\t\tvar classes = oSettings.oClasses;\n\t\tvar columns = oSettings.aoColumns;\n\t\n\t\tif ( createHeader ) {\n\t\t\trow = $('<tr/>').appendTo( thead );\n\t\t}\n\t\n\t\tfor ( i=0, ien=columns.length ; i<ien ; i++ ) {\n\t\t\tcolumn = columns[i];\n\t\t\tcell = $( column.nTh ).addClass( column.sClass );\n\t\n\t\t\tif ( createHeader ) {\n\t\t\t\tcell.appendTo( row );\n\t\t\t}\n\t\n\t\t\t// 1.11 move into sorting\n\t\t\tif ( oSettings.oFeatures.bSort ) {\n\t\t\t\tcell.addClass( column.sSortingClass );\n\t\n\t\t\t\tif ( column.bSortable !== false ) {\n\t\t\t\t\tcell\n\t\t\t\t\t\t.attr( 'tabindex', oSettings.iTabIndex )\n\t\t\t\t\t\t.attr( 'aria-controls', oSettings.sTableId );\n\t\n\t\t\t\t\t_fnSortAttachListener( oSettings, column.nTh, i );\n\t\t\t\t}\n\t\t\t}\n\t\n\t\t\tif ( column.sTitle != cell[0].innerHTML ) {\n\t\t\t\tcell.html( column.sTitle );\n\t\t\t}\n\t\n\t\t\t_fnRenderer( oSettings, 'header' )(\n\t\t\t\toSettings, cell, column, classes\n\t\t\t);\n\t\t}\n\t\n\t\tif ( createHeader ) {\n\t\t\t_fnDetectHeader( oSettings.aoHeader, thead );\n\t\t}\n\t\t\n\t\t/* ARIA role for the rows */\n\t \t$(thead).find('>tr').attr('role', 'row');\n\t\n\t\t/* Deal with the footer - add classes if required */\n\t\t$(thead).find('>tr>th, >tr>td').addClass( classes.sHeaderTH );\n\t\t$(tfoot).find('>tr>th, >tr>td').addClass( classes.sFooterTH );\n\t\n\t\t// Cache the footer cells. Note that we only take the cells from the first\n\t\t// row in the footer. If there is more than one row the user wants to\n\t\t// interact with, they need to use the table().foot() method. Note also this\n\t\t// allows cells to be used for multiple columns using colspan\n\t\tif ( tfoot !== null ) {\n\t\t\tvar cells = oSettings.aoFooter[0];\n\t\n\t\t\tfor ( i=0, ien=cells.length ; i<ien ; i++ ) {\n\t\t\t\tcolumn = columns[i];\n\t\t\t\tcolumn.nTf = cells[i].cell;\n\t\n\t\t\t\tif ( column.sClass ) {\n\t\t\t\t\t$(column.nTf).addClass( column.sClass );\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\t\n\t\n\t/**\n\t * Draw the header (or footer) element based on the column visibility states. The\n\t * methodology here is to use the layout array from _fnDetectHeader, modified for\n\t * the instantaneous column visibility, to construct the new layout. The grid is\n\t * traversed over cell at a time in a rows x columns grid fashion, although each\n\t * cell insert can cover multiple elements in the grid - which is tracks using the\n\t * aApplied array. Cell inserts in the grid will only occur where there isn't\n\t * already a cell in that position.\n\t *  @param {object} oSettings dataTables settings object\n\t *  @param array {objects} aoSource Layout array from _fnDetectHeader\n\t *  @param {boolean} [bIncludeHidden=false] If true then include the hidden columns in the calc,\n\t *  @memberof DataTable#oApi\n\t */\n\tfunction _fnDrawHead( oSettings, aoSource, bIncludeHidden )\n\t{\n\t\tvar i, iLen, j, jLen, k, kLen, n, nLocalTr;\n\t\tvar aoLocal = [];\n\t\tvar aApplied = [];\n\t\tvar iColumns = oSettings.aoColumns.length;\n\t\tvar iRowspan, iColspan;\n\t\n\t\tif ( ! aoSource )\n\t\t{\n\t\t\treturn;\n\t\t}\n\t\n\t\tif (  bIncludeHidden === undefined )\n\t\t{\n\t\t\tbIncludeHidden = false;\n\t\t}\n\t\n\t\t/* Make a copy of the master layout array, but without the visible columns in it */\n\t\tfor ( i=0, iLen=aoSource.length ; i<iLen ; i++ )\n\t\t{\n\t\t\taoLocal[i] = aoSource[i].slice();\n\t\t\taoLocal[i].nTr = aoSource[i].nTr;\n\t\n\t\t\t/* Remove any columns which are currently hidden */\n\t\t\tfor ( j=iColumns-1 ; j>=0 ; j-- )\n\t\t\t{\n\t\t\t\tif ( !oSettings.aoColumns[j].bVisible && !bIncludeHidden )\n\t\t\t\t{\n\t\t\t\t\taoLocal[i].splice( j, 1 );\n\t\t\t\t}\n\t\t\t}\n\t\n\t\t\t/* Prep the applied array - it needs an element for each row */\n\t\t\taApplied.push( [] );\n\t\t}\n\t\n\t\tfor ( i=0, iLen=aoLocal.length ; i<iLen ; i++ )\n\t\t{\n\t\t\tnLocalTr = aoLocal[i].nTr;\n\t\n\t\t\t/* All cells are going to be replaced, so empty out the row */\n\t\t\tif ( nLocalTr )\n\t\t\t{\n\t\t\t\twhile( (n = nLocalTr.firstChild) )\n\t\t\t\t{\n\t\t\t\t\tnLocalTr.removeChild( n );\n\t\t\t\t}\n\t\t\t}\n\t\n\t\t\tfor ( j=0, jLen=aoLocal[i].length ; j<jLen ; j++ )\n\t\t\t{\n\t\t\t\tiRowspan = 1;\n\t\t\t\tiColspan = 1;\n\t\n\t\t\t\t/* Check to see if there is already a cell (row/colspan) covering our target\n\t\t\t\t * insert point. If there is, then there is nothing to do.\n\t\t\t\t */\n\t\t\t\tif ( aApplied[i][j] === undefined )\n\t\t\t\t{\n\t\t\t\t\tnLocalTr.appendChild( aoLocal[i][j].cell );\n\t\t\t\t\taApplied[i][j] = 1;\n\t\n\t\t\t\t\t/* Expand the cell to cover as many rows as needed */\n\t\t\t\t\twhile ( aoLocal[i+iRowspan] !== undefined &&\n\t\t\t\t\t        aoLocal[i][j].cell == aoLocal[i+iRowspan][j].cell )\n\t\t\t\t\t{\n\t\t\t\t\t\taApplied[i+iRowspan][j] = 1;\n\t\t\t\t\t\tiRowspan++;\n\t\t\t\t\t}\n\t\n\t\t\t\t\t/* Expand the cell to cover as many columns as needed */\n\t\t\t\t\twhile ( aoLocal[i][j+iColspan] !== undefined &&\n\t\t\t\t\t        aoLocal[i][j].cell == aoLocal[i][j+iColspan].cell )\n\t\t\t\t\t{\n\t\t\t\t\t\t/* Must update the applied array over the rows for the columns */\n\t\t\t\t\t\tfor ( k=0 ; k<iRowspan ; k++ )\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\taApplied[i+k][j+iColspan] = 1;\n\t\t\t\t\t\t}\n\t\t\t\t\t\tiColspan++;\n\t\t\t\t\t}\n\t\n\t\t\t\t\t/* Do the actual expansion in the DOM */\n\t\t\t\t\t$(aoLocal[i][j].cell)\n\t\t\t\t\t\t.attr('rowspan', iRowspan)\n\t\t\t\t\t\t.attr('colspan', iColspan);\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\t\n\t\n\t/**\n\t * Insert the required TR nodes into the table for display\n\t *  @param {object} oSettings dataTables settings object\n\t *  @memberof DataTable#oApi\n\t */\n\tfunction _fnDraw( oSettings )\n\t{\n\t\t/* Provide a pre-callback function which can be used to cancel the draw is false is returned */\n\t\tvar aPreDraw = _fnCallbackFire( oSettings, 'aoPreDrawCallback', 'preDraw', [oSettings] );\n\t\tif ( $.inArray( false, aPreDraw ) !== -1 )\n\t\t{\n\t\t\t_fnProcessingDisplay( oSettings, false );\n\t\t\treturn;\n\t\t}\n\t\n\t\tvar i, iLen, n;\n\t\tvar anRows = [];\n\t\tvar iRowCount = 0;\n\t\tvar asStripeClasses = oSettings.asStripeClasses;\n\t\tvar iStripes = asStripeClasses.length;\n\t\tvar iOpenRows = oSettings.aoOpenRows.length;\n\t\tvar oLang = oSettings.oLanguage;\n\t\tvar iInitDisplayStart = oSettings.iInitDisplayStart;\n\t\tvar bServerSide = _fnDataSource( oSettings ) == 'ssp';\n\t\tvar aiDisplay = oSettings.aiDisplay;\n\t\n\t\toSettings.bDrawing = true;\n\t\n\t\t/* Check and see if we have an initial draw position from state saving */\n\t\tif ( iInitDisplayStart !== undefined && iInitDisplayStart !== -1 )\n\t\t{\n\t\t\toSettings._iDisplayStart = bServerSide ?\n\t\t\t\tiInitDisplayStart :\n\t\t\t\tiInitDisplayStart >= oSettings.fnRecordsDisplay() ?\n\t\t\t\t\t0 :\n\t\t\t\t\tiInitDisplayStart;\n\t\n\t\t\toSettings.iInitDisplayStart = -1;\n\t\t}\n\t\n\t\tvar iDisplayStart = oSettings._iDisplayStart;\n\t\tvar iDisplayEnd = oSettings.fnDisplayEnd();\n\t\n\t\t/* Server-side processing draw intercept */\n\t\tif ( oSettings.bDeferLoading )\n\t\t{\n\t\t\toSettings.bDeferLoading = false;\n\t\t\toSettings.iDraw++;\n\t\t\t_fnProcessingDisplay( oSettings, false );\n\t\t}\n\t\telse if ( !bServerSide )\n\t\t{\n\t\t\toSettings.iDraw++;\n\t\t}\n\t\telse if ( !oSettings.bDestroying && !_fnAjaxUpdate( oSettings ) )\n\t\t{\n\t\t\treturn;\n\t\t}\n\t\n\t\tif ( aiDisplay.length !== 0 )\n\t\t{\n\t\t\tvar iStart = bServerSide ? 0 : iDisplayStart;\n\t\t\tvar iEnd = bServerSide ? oSettings.aoData.length : iDisplayEnd;\n\t\n\t\t\tfor ( var j=iStart ; j<iEnd ; j++ )\n\t\t\t{\n\t\t\t\tvar iDataIndex = aiDisplay[j];\n\t\t\t\tvar aoData = oSettings.aoData[ iDataIndex ];\n\t\t\t\tif ( aoData.nTr === null )\n\t\t\t\t{\n\t\t\t\t\t_fnCreateTr( oSettings, iDataIndex );\n\t\t\t\t}\n\t\n\t\t\t\tvar nRow = aoData.nTr;\n\t\n\t\t\t\t/* Remove the old striping classes and then add the new one */\n\t\t\t\tif ( iStripes !== 0 )\n\t\t\t\t{\n\t\t\t\t\tvar sStripe = asStripeClasses[ iRowCount % iStripes ];\n\t\t\t\t\tif ( aoData._sRowStripe != sStripe )\n\t\t\t\t\t{\n\t\t\t\t\t\t$(nRow).removeClass( aoData._sRowStripe ).addClass( sStripe );\n\t\t\t\t\t\taoData._sRowStripe = sStripe;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\n\t\t\t\t// Row callback functions - might want to manipulate the row\n\t\t\t\t// iRowCount and j are not currently documented. Are they at all\n\t\t\t\t// useful?\n\t\t\t\t_fnCallbackFire( oSettings, 'aoRowCallback', null,\n\t\t\t\t\t[nRow, aoData._aData, iRowCount, j, iDataIndex] );\n\t\n\t\t\t\tanRows.push( nRow );\n\t\t\t\tiRowCount++;\n\t\t\t}\n\t\t}\n\t\telse\n\t\t{\n\t\t\t/* Table is empty - create a row with an empty message in it */\n\t\t\tvar sZero = oLang.sZeroRecords;\n\t\t\tif ( oSettings.iDraw == 1 &&  _fnDataSource( oSettings ) == 'ajax' )\n\t\t\t{\n\t\t\t\tsZero = oLang.sLoadingRecords;\n\t\t\t}\n\t\t\telse if ( oLang.sEmptyTable && oSettings.fnRecordsTotal() === 0 )\n\t\t\t{\n\t\t\t\tsZero = oLang.sEmptyTable;\n\t\t\t}\n\t\n\t\t\tanRows[ 0 ] = $( '<tr/>', { 'class': iStripes ? asStripeClasses[0] : '' } )\n\t\t\t\t.append( $('<td />', {\n\t\t\t\t\t'valign':  'top',\n\t\t\t\t\t'colSpan': _fnVisbleColumns( oSettings ),\n\t\t\t\t\t'class':   oSettings.oClasses.sRowEmpty\n\t\t\t\t} ).html( sZero ) )[0];\n\t\t}\n\t\n\t\t/* Header and footer callbacks */\n\t\t_fnCallbackFire( oSettings, 'aoHeaderCallback', 'header', [ $(oSettings.nTHead).children('tr')[0],\n\t\t\t_fnGetDataMaster( oSettings ), iDisplayStart, iDisplayEnd, aiDisplay ] );\n\t\n\t\t_fnCallbackFire( oSettings, 'aoFooterCallback', 'footer', [ $(oSettings.nTFoot).children('tr')[0],\n\t\t\t_fnGetDataMaster( oSettings ), iDisplayStart, iDisplayEnd, aiDisplay ] );\n\t\n\t\tvar body = $(oSettings.nTBody);\n\t\n\t\tbody.children().detach();\n\t\tbody.append( $(anRows) );\n\t\n\t\t/* Call all required callback functions for the end of a draw */\n\t\t_fnCallbackFire( oSettings, 'aoDrawCallback', 'draw', [oSettings] );\n\t\n\t\t/* Draw is complete, sorting and filtering must be as well */\n\t\toSettings.bSorted = false;\n\t\toSettings.bFiltered = false;\n\t\toSettings.bDrawing = false;\n\t}\n\t\n\t\n\t/**\n\t * Redraw the table - taking account of the various features which are enabled\n\t *  @param {object} oSettings dataTables settings object\n\t *  @param {boolean} [holdPosition] Keep the current paging position. By default\n\t *    the paging is reset to the first page\n\t *  @memberof DataTable#oApi\n\t */\n\tfunction _fnReDraw( settings, holdPosition )\n\t{\n\t\tvar\n\t\t\tfeatures = settings.oFeatures,\n\t\t\tsort     = features.bSort,\n\t\t\tfilter   = features.bFilter;\n\t\n\t\tif ( sort ) {\n\t\t\t_fnSort( settings );\n\t\t}\n\t\n\t\tif ( filter ) {\n\t\t\t_fnFilterComplete( settings, settings.oPreviousSearch );\n\t\t}\n\t\telse {\n\t\t\t// No filtering, so we want to just use the display master\n\t\t\tsettings.aiDisplay = settings.aiDisplayMaster.slice();\n\t\t}\n\t\n\t\tif ( holdPosition !== true ) {\n\t\t\tsettings._iDisplayStart = 0;\n\t\t}\n\t\n\t\t// Let any modules know about the draw hold position state (used by\n\t\t// scrolling internally)\n\t\tsettings._drawHold = holdPosition;\n\t\n\t\t_fnDraw( settings );\n\t\n\t\tsettings._drawHold = false;\n\t}\n\t\n\t\n\t/**\n\t * Add the options to the page HTML for the table\n\t *  @param {object} oSettings dataTables settings object\n\t *  @memberof DataTable#oApi\n\t */\n\tfunction _fnAddOptionsHtml ( oSettings )\n\t{\n\t\tvar classes = oSettings.oClasses;\n\t\tvar table = $(oSettings.nTable);\n\t\tvar holding = $('<div/>').insertBefore( table ); // Holding element for speed\n\t\tvar features = oSettings.oFeatures;\n\t\n\t\t// All DataTables are wrapped in a div\n\t\tvar insert = $('<div/>', {\n\t\t\tid:      oSettings.sTableId+'_wrapper',\n\t\t\t'class': classes.sWrapper + (oSettings.nTFoot ? '' : ' '+classes.sNoFooter)\n\t\t} );\n\t\n\t\toSettings.nHolding = holding[0];\n\t\toSettings.nTableWrapper = insert[0];\n\t\toSettings.nTableReinsertBefore = oSettings.nTable.nextSibling;\n\t\n\t\t/* Loop over the user set positioning and place the elements as needed */\n\t\tvar aDom = oSettings.sDom.split('');\n\t\tvar featureNode, cOption, nNewNode, cNext, sAttr, j;\n\t\tfor ( var i=0 ; i<aDom.length ; i++ )\n\t\t{\n\t\t\tfeatureNode = null;\n\t\t\tcOption = aDom[i];\n\t\n\t\t\tif ( cOption == '<' )\n\t\t\t{\n\t\t\t\t/* New container div */\n\t\t\t\tnNewNode = $('<div/>')[0];\n\t\n\t\t\t\t/* Check to see if we should append an id and/or a class name to the container */\n\t\t\t\tcNext = aDom[i+1];\n\t\t\t\tif ( cNext == \"'\" || cNext == '\"' )\n\t\t\t\t{\n\t\t\t\t\tsAttr = \"\";\n\t\t\t\t\tj = 2;\n\t\t\t\t\twhile ( aDom[i+j] != cNext )\n\t\t\t\t\t{\n\t\t\t\t\t\tsAttr += aDom[i+j];\n\t\t\t\t\t\tj++;\n\t\t\t\t\t}\n\t\n\t\t\t\t\t/* Replace jQuery UI constants @todo depreciated */\n\t\t\t\t\tif ( sAttr == \"H\" )\n\t\t\t\t\t{\n\t\t\t\t\t\tsAttr = classes.sJUIHeader;\n\t\t\t\t\t}\n\t\t\t\t\telse if ( sAttr == \"F\" )\n\t\t\t\t\t{\n\t\t\t\t\t\tsAttr = classes.sJUIFooter;\n\t\t\t\t\t}\n\t\n\t\t\t\t\t/* The attribute can be in the format of \"#id.class\", \"#id\" or \"class\" This logic\n\t\t\t\t\t * breaks the string into parts and applies them as needed\n\t\t\t\t\t */\n\t\t\t\t\tif ( sAttr.indexOf('.') != -1 )\n\t\t\t\t\t{\n\t\t\t\t\t\tvar aSplit = sAttr.split('.');\n\t\t\t\t\t\tnNewNode.id = aSplit[0].substr(1, aSplit[0].length-1);\n\t\t\t\t\t\tnNewNode.className = aSplit[1];\n\t\t\t\t\t}\n\t\t\t\t\telse if ( sAttr.charAt(0) == \"#\" )\n\t\t\t\t\t{\n\t\t\t\t\t\tnNewNode.id = sAttr.substr(1, sAttr.length-1);\n\t\t\t\t\t}\n\t\t\t\t\telse\n\t\t\t\t\t{\n\t\t\t\t\t\tnNewNode.className = sAttr;\n\t\t\t\t\t}\n\t\n\t\t\t\t\ti += j; /* Move along the position array */\n\t\t\t\t}\n\t\n\t\t\t\tinsert.append( nNewNode );\n\t\t\t\tinsert = $(nNewNode);\n\t\t\t}\n\t\t\telse if ( cOption == '>' )\n\t\t\t{\n\t\t\t\t/* End container div */\n\t\t\t\tinsert = insert.parent();\n\t\t\t}\n\t\t\t// @todo Move options into their own plugins?\n\t\t\telse if ( cOption == 'l' && features.bPaginate && features.bLengthChange )\n\t\t\t{\n\t\t\t\t/* Length */\n\t\t\t\tfeatureNode = _fnFeatureHtmlLength( oSettings );\n\t\t\t}\n\t\t\telse if ( cOption == 'f' && features.bFilter )\n\t\t\t{\n\t\t\t\t/* Filter */\n\t\t\t\tfeatureNode = _fnFeatureHtmlFilter( oSettings );\n\t\t\t}\n\t\t\telse if ( cOption == 'r' && features.bProcessing )\n\t\t\t{\n\t\t\t\t/* pRocessing */\n\t\t\t\tfeatureNode = _fnFeatureHtmlProcessing( oSettings );\n\t\t\t}\n\t\t\telse if ( cOption == 't' )\n\t\t\t{\n\t\t\t\t/* Table */\n\t\t\t\tfeatureNode = _fnFeatureHtmlTable( oSettings );\n\t\t\t}\n\t\t\telse if ( cOption ==  'i' && features.bInfo )\n\t\t\t{\n\t\t\t\t/* Info */\n\t\t\t\tfeatureNode = _fnFeatureHtmlInfo( oSettings );\n\t\t\t}\n\t\t\telse if ( cOption == 'p' && features.bPaginate )\n\t\t\t{\n\t\t\t\t/* Pagination */\n\t\t\t\tfeatureNode = _fnFeatureHtmlPaginate( oSettings );\n\t\t\t}\n\t\t\telse if ( DataTable.ext.feature.length !== 0 )\n\t\t\t{\n\t\t\t\t/* Plug-in features */\n\t\t\t\tvar aoFeatures = DataTable.ext.feature;\n\t\t\t\tfor ( var k=0, kLen=aoFeatures.length ; k<kLen ; k++ )\n\t\t\t\t{\n\t\t\t\t\tif ( cOption == aoFeatures[k].cFeature )\n\t\t\t\t\t{\n\t\t\t\t\t\tfeatureNode = aoFeatures[k].fnInit( oSettings );\n\t\t\t\t\t\tbreak;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\n\t\t\t/* Add to the 2D features array */\n\t\t\tif ( featureNode )\n\t\t\t{\n\t\t\t\tvar aanFeatures = oSettings.aanFeatures;\n\t\n\t\t\t\tif ( ! aanFeatures[cOption] )\n\t\t\t\t{\n\t\t\t\t\taanFeatures[cOption] = [];\n\t\t\t\t}\n\t\n\t\t\t\taanFeatures[cOption].push( featureNode );\n\t\t\t\tinsert.append( featureNode );\n\t\t\t}\n\t\t}\n\t\n\t\t/* Built our DOM structure - replace the holding div with what we want */\n\t\tholding.replaceWith( insert );\n\t\toSettings.nHolding = null;\n\t}\n\t\n\t\n\t/**\n\t * Use the DOM source to create up an array of header cells. The idea here is to\n\t * create a layout grid (array) of rows x columns, which contains a reference\n\t * to the cell that that point in the grid (regardless of col/rowspan), such that\n\t * any column / row could be removed and the new grid constructed\n\t *  @param array {object} aLayout Array to store the calculated layout in\n\t *  @param {node} nThead The header/footer element for the table\n\t *  @memberof DataTable#oApi\n\t */\n\tfunction _fnDetectHeader ( aLayout, nThead )\n\t{\n\t\tvar nTrs = $(nThead).children('tr');\n\t\tvar nTr, nCell;\n\t\tvar i, k, l, iLen, jLen, iColShifted, iColumn, iColspan, iRowspan;\n\t\tvar bUnique;\n\t\tvar fnShiftCol = function ( a, i, j ) {\n\t\t\tvar k = a[i];\n\t                while ( k[j] ) {\n\t\t\t\tj++;\n\t\t\t}\n\t\t\treturn j;\n\t\t};\n\t\n\t\taLayout.splice( 0, aLayout.length );\n\t\n\t\t/* We know how many rows there are in the layout - so prep it */\n\t\tfor ( i=0, iLen=nTrs.length ; i<iLen ; i++ )\n\t\t{\n\t\t\taLayout.push( [] );\n\t\t}\n\t\n\t\t/* Calculate a layout array */\n\t\tfor ( i=0, iLen=nTrs.length ; i<iLen ; i++ )\n\t\t{\n\t\t\tnTr = nTrs[i];\n\t\t\tiColumn = 0;\n\t\n\t\t\t/* For every cell in the row... */\n\t\t\tnCell = nTr.firstChild;\n\t\t\twhile ( nCell ) {\n\t\t\t\tif ( nCell.nodeName.toUpperCase() == \"TD\" ||\n\t\t\t\t     nCell.nodeName.toUpperCase() == \"TH\" )\n\t\t\t\t{\n\t\t\t\t\t/* Get the col and rowspan attributes from the DOM and sanitise them */\n\t\t\t\t\tiColspan = nCell.getAttribute('colspan') * 1;\n\t\t\t\t\tiRowspan = nCell.getAttribute('rowspan') * 1;\n\t\t\t\t\tiColspan = (!iColspan || iColspan===0 || iColspan===1) ? 1 : iColspan;\n\t\t\t\t\tiRowspan = (!iRowspan || iRowspan===0 || iRowspan===1) ? 1 : iRowspan;\n\t\n\t\t\t\t\t/* There might be colspan cells already in this row, so shift our target\n\t\t\t\t\t * accordingly\n\t\t\t\t\t */\n\t\t\t\t\tiColShifted = fnShiftCol( aLayout, i, iColumn );\n\t\n\t\t\t\t\t/* Cache calculation for unique columns */\n\t\t\t\t\tbUnique = iColspan === 1 ? true : false;\n\t\n\t\t\t\t\t/* If there is col / rowspan, copy the information into the layout grid */\n\t\t\t\t\tfor ( l=0 ; l<iColspan ; l++ )\n\t\t\t\t\t{\n\t\t\t\t\t\tfor ( k=0 ; k<iRowspan ; k++ )\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\taLayout[i+k][iColShifted+l] = {\n\t\t\t\t\t\t\t\t\"cell\": nCell,\n\t\t\t\t\t\t\t\t\"unique\": bUnique\n\t\t\t\t\t\t\t};\n\t\t\t\t\t\t\taLayout[i+k].nTr = nTr;\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\tnCell = nCell.nextSibling;\n\t\t\t}\n\t\t}\n\t}\n\t\n\t\n\t/**\n\t * Get an array of unique th elements, one for each column\n\t *  @param {object} oSettings dataTables settings object\n\t *  @param {node} nHeader automatically detect the layout from this node - optional\n\t *  @param {array} aLayout thead/tfoot layout from _fnDetectHeader - optional\n\t *  @returns array {node} aReturn list of unique th's\n\t *  @memberof DataTable#oApi\n\t */\n\tfunction _fnGetUniqueThs ( oSettings, nHeader, aLayout )\n\t{\n\t\tvar aReturn = [];\n\t\tif ( !aLayout )\n\t\t{\n\t\t\taLayout = oSettings.aoHeader;\n\t\t\tif ( nHeader )\n\t\t\t{\n\t\t\t\taLayout = [];\n\t\t\t\t_fnDetectHeader( aLayout, nHeader );\n\t\t\t}\n\t\t}\n\t\n\t\tfor ( var i=0, iLen=aLayout.length ; i<iLen ; i++ )\n\t\t{\n\t\t\tfor ( var j=0, jLen=aLayout[i].length ; j<jLen ; j++ )\n\t\t\t{\n\t\t\t\tif ( aLayout[i][j].unique &&\n\t\t\t\t\t (!aReturn[j] || !oSettings.bSortCellsTop) )\n\t\t\t\t{\n\t\t\t\t\taReturn[j] = aLayout[i][j].cell;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\n\t\treturn aReturn;\n\t}\n\t\n\t/**\n\t * Create an Ajax call based on the table's settings, taking into account that\n\t * parameters can have multiple forms, and backwards compatibility.\n\t *\n\t * @param {object} oSettings dataTables settings object\n\t * @param {array} data Data to send to the server, required by\n\t *     DataTables - may be augmented by developer callbacks\n\t * @param {function} fn Callback function to run when data is obtained\n\t */\n\tfunction _fnBuildAjax( oSettings, data, fn )\n\t{\n\t\t// Compatibility with 1.9-, allow fnServerData and event to manipulate\n\t\t_fnCallbackFire( oSettings, 'aoServerParams', 'serverParams', [data] );\n\t\n\t\t// Convert to object based for 1.10+ if using the old array scheme which can\n\t\t// come from server-side processing or serverParams\n\t\tif ( data && $.isArray(data) ) {\n\t\t\tvar tmp = {};\n\t\t\tvar rbracket = /(.*?)\\[\\]$/;\n\t\n\t\t\t$.each( data, function (key, val) {\n\t\t\t\tvar match = val.name.match(rbracket);\n\t\n\t\t\t\tif ( match ) {\n\t\t\t\t\t// Support for arrays\n\t\t\t\t\tvar name = match[0];\n\t\n\t\t\t\t\tif ( ! tmp[ name ] ) {\n\t\t\t\t\t\ttmp[ name ] = [];\n\t\t\t\t\t}\n\t\t\t\t\ttmp[ name ].push( val.value );\n\t\t\t\t}\n\t\t\t\telse {\n\t\t\t\t\ttmp[val.name] = val.value;\n\t\t\t\t}\n\t\t\t} );\n\t\t\tdata = tmp;\n\t\t}\n\t\n\t\tvar ajaxData;\n\t\tvar ajax = oSettings.ajax;\n\t\tvar instance = oSettings.oInstance;\n\t\tvar callback = function ( json ) {\n\t\t\t_fnCallbackFire( oSettings, null, 'xhr', [oSettings, json, oSettings.jqXHR] );\n\t\t\tfn( json );\n\t\t};\n\t\n\t\tif ( $.isPlainObject( ajax ) && ajax.data )\n\t\t{\n\t\t\tajaxData = ajax.data;\n\t\n\t\t\tvar newData = typeof ajaxData === 'function' ?\n\t\t\t\tajaxData( data, oSettings ) :  // fn can manipulate data or return\n\t\t\t\tajaxData;                      // an object object or array to merge\n\t\n\t\t\t// If the function returned something, use that alone\n\t\t\tdata = typeof ajaxData === 'function' && newData ?\n\t\t\t\tnewData :\n\t\t\t\t$.extend( true, data, newData );\n\t\n\t\t\t// Remove the data property as we've resolved it already and don't want\n\t\t\t// jQuery to do it again (it is restored at the end of the function)\n\t\t\tdelete ajax.data;\n\t\t}\n\t\n\t\tvar baseAjax = {\n\t\t\t\"data\": data,\n\t\t\t\"success\": function (json) {\n\t\t\t\tvar error = json.error || json.sError;\n\t\t\t\tif ( error ) {\n\t\t\t\t\t_fnLog( oSettings, 0, error );\n\t\t\t\t}\n\t\n\t\t\t\toSettings.json = json;\n\t\t\t\tcallback( json );\n\t\t\t},\n\t\t\t\"dataType\": \"json\",\n\t\t\t\"cache\": false,\n\t\t\t\"type\": oSettings.sServerMethod,\n\t\t\t\"error\": function (xhr, error, thrown) {\n\t\t\t\tvar ret = _fnCallbackFire( oSettings, null, 'xhr', [oSettings, null, oSettings.jqXHR] );\n\t\n\t\t\t\tif ( $.inArray( true, ret ) === -1 ) {\n\t\t\t\t\tif ( error == \"parsererror\" ) {\n\t\t\t\t\t\t_fnLog( oSettings, 0, 'Invalid JSON response', 1 );\n\t\t\t\t\t}\n\t\t\t\t\telse if ( xhr.readyState === 4 ) {\n\t\t\t\t\t\t_fnLog( oSettings, 0, 'Ajax error', 7 );\n\t\t\t\t\t}\n\t\t\t\t}\n\t\n\t\t\t\t_fnProcessingDisplay( oSettings, false );\n\t\t\t}\n\t\t};\n\t\n\t\t// Store the data submitted for the API\n\t\toSettings.oAjaxData = data;\n\t\n\t\t// Allow plug-ins and external processes to modify the data\n\t\t_fnCallbackFire( oSettings, null, 'preXhr', [oSettings, data] );\n\t\n\t\tif ( oSettings.fnServerData )\n\t\t{\n\t\t\t// DataTables 1.9- compatibility\n\t\t\toSettings.fnServerData.call( instance,\n\t\t\t\toSettings.sAjaxSource,\n\t\t\t\t$.map( data, function (val, key) { // Need to convert back to 1.9 trad format\n\t\t\t\t\treturn { name: key, value: val };\n\t\t\t\t} ),\n\t\t\t\tcallback,\n\t\t\t\toSettings\n\t\t\t);\n\t\t}\n\t\telse if ( oSettings.sAjaxSource || typeof ajax === 'string' )\n\t\t{\n\t\t\t// DataTables 1.9- compatibility\n\t\t\toSettings.jqXHR = $.ajax( $.extend( baseAjax, {\n\t\t\t\turl: ajax || oSettings.sAjaxSource\n\t\t\t} ) );\n\t\t}\n\t\telse if ( typeof ajax === 'function' )\n\t\t{\n\t\t\t// Is a function - let the caller define what needs to be done\n\t\t\toSettings.jqXHR = ajax.call( instance, data, callback, oSettings );\n\t\t}\n\t\telse\n\t\t{\n\t\t\t// Object to extend the base settings\n\t\t\toSettings.jqXHR = $.ajax( $.extend( baseAjax, ajax ) );\n\t\n\t\t\t// Restore for next time around\n\t\t\tajax.data = ajaxData;\n\t\t}\n\t}\n\t\n\t\n\t/**\n\t * Update the table using an Ajax call\n\t *  @param {object} settings dataTables settings object\n\t *  @returns {boolean} Block the table drawing or not\n\t *  @memberof DataTable#oApi\n\t */\n\tfunction _fnAjaxUpdate( settings )\n\t{\n\t\tif ( settings.bAjaxDataGet ) {\n\t\t\tsettings.iDraw++;\n\t\t\t_fnProcessingDisplay( settings, true );\n\t\n\t\t\t_fnBuildAjax(\n\t\t\t\tsettings,\n\t\t\t\t_fnAjaxParameters( settings ),\n\t\t\t\tfunction(json) {\n\t\t\t\t\t_fnAjaxUpdateDraw( settings, json );\n\t\t\t\t}\n\t\t\t);\n\t\n\t\t\treturn false;\n\t\t}\n\t\treturn true;\n\t}\n\t\n\t\n\t/**\n\t * Build up the parameters in an object needed for a server-side processing\n\t * request. Note that this is basically done twice, is different ways - a modern\n\t * method which is used by default in DataTables 1.10 which uses objects and\n\t * arrays, or the 1.9- method with is name / value pairs. 1.9 method is used if\n\t * the sAjaxSource option is used in the initialisation, or the legacyAjax\n\t * option is set.\n\t *  @param {object} oSettings dataTables settings object\n\t *  @returns {bool} block the table drawing or not\n\t *  @memberof DataTable#oApi\n\t */\n\tfunction _fnAjaxParameters( settings )\n\t{\n\t\tvar\n\t\t\tcolumns = settings.aoColumns,\n\t\t\tcolumnCount = columns.length,\n\t\t\tfeatures = settings.oFeatures,\n\t\t\tpreSearch = settings.oPreviousSearch,\n\t\t\tpreColSearch = settings.aoPreSearchCols,\n\t\t\ti, data = [], dataProp, column, columnSearch,\n\t\t\tsort = _fnSortFlatten( settings ),\n\t\t\tdisplayStart = settings._iDisplayStart,\n\t\t\tdisplayLength = features.bPaginate !== false ?\n\t\t\t\tsettings._iDisplayLength :\n\t\t\t\t-1;\n\t\n\t\tvar param = function ( name, value ) {\n\t\t\tdata.push( { 'name': name, 'value': value } );\n\t\t};\n\t\n\t\t// DataTables 1.9- compatible method\n\t\tparam( 'sEcho',          settings.iDraw );\n\t\tparam( 'iColumns',       columnCount );\n\t\tparam( 'sColumns',       _pluck( columns, 'sName' ).join(',') );\n\t\tparam( 'iDisplayStart',  displayStart );\n\t\tparam( 'iDisplayLength', displayLength );\n\t\n\t\t// DataTables 1.10+ method\n\t\tvar d = {\n\t\t\tdraw:    settings.iDraw,\n\t\t\tcolumns: [],\n\t\t\torder:   [],\n\t\t\tstart:   displayStart,\n\t\t\tlength:  displayLength,\n\t\t\tsearch:  {\n\t\t\t\tvalue: preSearch.sSearch,\n\t\t\t\tregex: preSearch.bRegex\n\t\t\t}\n\t\t};\n\t\n\t\tfor ( i=0 ; i<columnCount ; i++ ) {\n\t\t\tcolumn = columns[i];\n\t\t\tcolumnSearch = preColSearch[i];\n\t\t\tdataProp = typeof column.mData==\"function\" ? 'function' : column.mData ;\n\t\n\t\t\td.columns.push( {\n\t\t\t\tdata:       dataProp,\n\t\t\t\tname:       column.sName,\n\t\t\t\tsearchable: column.bSearchable,\n\t\t\t\torderable:  column.bSortable,\n\t\t\t\tsearch:     {\n\t\t\t\t\tvalue: columnSearch.sSearch,\n\t\t\t\t\tregex: columnSearch.bRegex\n\t\t\t\t}\n\t\t\t} );\n\t\n\t\t\tparam( \"mDataProp_\"+i, dataProp );\n\t\n\t\t\tif ( features.bFilter ) {\n\t\t\t\tparam( 'sSearch_'+i,     columnSearch.sSearch );\n\t\t\t\tparam( 'bRegex_'+i,      columnSearch.bRegex );\n\t\t\t\tparam( 'bSearchable_'+i, column.bSearchable );\n\t\t\t}\n\t\n\t\t\tif ( features.bSort ) {\n\t\t\t\tparam( 'bSortable_'+i, column.bSortable );\n\t\t\t}\n\t\t}\n\t\n\t\tif ( features.bFilter ) {\n\t\t\tparam( 'sSearch', preSearch.sSearch );\n\t\t\tparam( 'bRegex', preSearch.bRegex );\n\t\t}\n\t\n\t\tif ( features.bSort ) {\n\t\t\t$.each( sort, function ( i, val ) {\n\t\t\t\td.order.push( { column: val.col, dir: val.dir } );\n\t\n\t\t\t\tparam( 'iSortCol_'+i, val.col );\n\t\t\t\tparam( 'sSortDir_'+i, val.dir );\n\t\t\t} );\n\t\n\t\t\tparam( 'iSortingCols', sort.length );\n\t\t}\n\t\n\t\t// If the legacy.ajax parameter is null, then we automatically decide which\n\t\t// form to use, based on sAjaxSource\n\t\tvar legacy = DataTable.ext.legacy.ajax;\n\t\tif ( legacy === null ) {\n\t\t\treturn settings.sAjaxSource ? data : d;\n\t\t}\n\t\n\t\t// Otherwise, if legacy has been specified then we use that to decide on the\n\t\t// form\n\t\treturn legacy ? data : d;\n\t}\n\t\n\t\n\t/**\n\t * Data the data from the server (nuking the old) and redraw the table\n\t *  @param {object} oSettings dataTables settings object\n\t *  @param {object} json json data return from the server.\n\t *  @param {string} json.sEcho Tracking flag for DataTables to match requests\n\t *  @param {int} json.iTotalRecords Number of records in the data set, not accounting for filtering\n\t *  @param {int} json.iTotalDisplayRecords Number of records in the data set, accounting for filtering\n\t *  @param {array} json.aaData The data to display on this page\n\t *  @param {string} [json.sColumns] Column ordering (sName, comma separated)\n\t *  @memberof DataTable#oApi\n\t */\n\tfunction _fnAjaxUpdateDraw ( settings, json )\n\t{\n\t\t// v1.10 uses camelCase variables, while 1.9 uses Hungarian notation.\n\t\t// Support both\n\t\tvar compat = function ( old, modern ) {\n\t\t\treturn json[old] !== undefined ? json[old] : json[modern];\n\t\t};\n\t\n\t\tvar data = _fnAjaxDataSrc( settings, json );\n\t\tvar draw            = compat( 'sEcho',                'draw' );\n\t\tvar recordsTotal    = compat( 'iTotalRecords',        'recordsTotal' );\n\t\tvar recordsFiltered = compat( 'iTotalDisplayRecords', 'recordsFiltered' );\n\t\n\t\tif ( draw !== undefined ) {\n\t\t\t// Protect against out of sequence returns\n\t\t\tif ( draw*1 < settings.iDraw ) {\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tsettings.iDraw = draw * 1;\n\t\t}\n\t\n\t\t_fnClearTable( settings );\n\t\tsettings._iRecordsTotal   = parseInt(recordsTotal, 10);\n\t\tsettings._iRecordsDisplay = parseInt(recordsFiltered, 10);\n\t\n\t\tfor ( var i=0, ien=data.length ; i<ien ; i++ ) {\n\t\t\t_fnAddData( settings, data[i] );\n\t\t}\n\t\tsettings.aiDisplay = settings.aiDisplayMaster.slice();\n\t\n\t\tsettings.bAjaxDataGet = false;\n\t\t_fnDraw( settings );\n\t\n\t\tif ( ! settings._bInitComplete ) {\n\t\t\t_fnInitComplete( settings, json );\n\t\t}\n\t\n\t\tsettings.bAjaxDataGet = true;\n\t\t_fnProcessingDisplay( settings, false );\n\t}\n\t\n\t\n\t/**\n\t * Get the data from the JSON data source to use for drawing a table. Using\n\t * `_fnGetObjectDataFn` allows the data to be sourced from a property of the\n\t * source object, or from a processing function.\n\t *  @param {object} oSettings dataTables settings object\n\t *  @param  {object} json Data source object / array from the server\n\t *  @return {array} Array of data to use\n\t */\n\tfunction _fnAjaxDataSrc ( oSettings, json )\n\t{\n\t\tvar dataSrc = $.isPlainObject( oSettings.ajax ) && oSettings.ajax.dataSrc !== undefined ?\n\t\t\toSettings.ajax.dataSrc :\n\t\t\toSettings.sAjaxDataProp; // Compatibility with 1.9-.\n\t\n\t\t// Compatibility with 1.9-. In order to read from aaData, check if the\n\t\t// default has been changed, if not, check for aaData\n\t\tif ( dataSrc === 'data' ) {\n\t\t\treturn json.aaData || json[dataSrc];\n\t\t}\n\t\n\t\treturn dataSrc !== \"\" ?\n\t\t\t_fnGetObjectDataFn( dataSrc )( json ) :\n\t\t\tjson;\n\t}\n\t\n\t/**\n\t * Generate the node required for filtering text\n\t *  @returns {node} Filter control element\n\t *  @param {object} oSettings dataTables settings object\n\t *  @memberof DataTable#oApi\n\t */\n\tfunction _fnFeatureHtmlFilter ( settings )\n\t{\n\t\tvar classes = settings.oClasses;\n\t\tvar tableId = settings.sTableId;\n\t\tvar language = settings.oLanguage;\n\t\tvar previousSearch = settings.oPreviousSearch;\n\t\tvar features = settings.aanFeatures;\n\t\tvar input = '<input type=\"search\" class=\"'+classes.sFilterInput+'\"/>';\n\t\n\t\tvar str = language.sSearch;\n\t\tstr = str.match(/_INPUT_/) ?\n\t\t\tstr.replace('_INPUT_', input) :\n\t\t\tstr+input;\n\t\n\t\tvar filter = $('<div/>', {\n\t\t\t\t'id': ! features.f ? tableId+'_filter' : null,\n\t\t\t\t'class': classes.sFilter\n\t\t\t} )\n\t\t\t.append( $('<label/>' ).append( str ) );\n\t\n\t\tvar searchFn = function() {\n\t\t\t/* Update all other filter input elements for the new display */\n\t\t\tvar n = features.f;\n\t\t\tvar val = !this.value ? \"\" : this.value; // mental IE8 fix :-(\n\t\n\t\t\t/* Now do the filter */\n\t\t\tif ( val != previousSearch.sSearch ) {\n\t\t\t\t_fnFilterComplete( settings, {\n\t\t\t\t\t\"sSearch\": val,\n\t\t\t\t\t\"bRegex\": previousSearch.bRegex,\n\t\t\t\t\t\"bSmart\": previousSearch.bSmart ,\n\t\t\t\t\t\"bCaseInsensitive\": previousSearch.bCaseInsensitive\n\t\t\t\t} );\n\t\n\t\t\t\t// Need to redraw, without resorting\n\t\t\t\tsettings._iDisplayStart = 0;\n\t\t\t\t_fnDraw( settings );\n\t\t\t}\n\t\t};\n\t\n\t\tvar searchDelay = settings.searchDelay !== null ?\n\t\t\tsettings.searchDelay :\n\t\t\t_fnDataSource( settings ) === 'ssp' ?\n\t\t\t\t400 :\n\t\t\t\t0;\n\t\n\t\tvar jqFilter = $('input', filter)\n\t\t\t.val( previousSearch.sSearch )\n\t\t\t.attr( 'placeholder', language.sSearchPlaceholder )\n\t\t\t.on(\n\t\t\t\t'keyup.DT search.DT input.DT paste.DT cut.DT',\n\t\t\t\tsearchDelay ?\n\t\t\t\t\t_fnThrottle( searchFn, searchDelay ) :\n\t\t\t\t\tsearchFn\n\t\t\t)\n\t\t\t.on( 'mouseup', function(e) {\n\t\t\t\t// Edge fix! Edge 17 does not trigger anything other than mouse events when clicking\n\t\t\t\t// on the clear icon (Edge bug 17584515). This is safe in other browsers as `searchFn`\n\t\t\t\t// checks the value to see if it has changed. In other browsers it won't have.\n\t\t\t\tsetTimeout( function () {\n\t\t\t\t\tsearchFn.call(jqFilter[0]);\n\t\t\t\t}, 10);\n\t\t\t} )\n\t\t\t.on( 'keypress.DT', function(e) {\n\t\t\t\t/* Prevent form submission */\n\t\t\t\tif ( e.keyCode == 13 ) {\n\t\t\t\t\treturn false;\n\t\t\t\t}\n\t\t\t} )\n\t\t\t.attr('aria-controls', tableId);\n\t\n\t\t// Update the input elements whenever the table is filtered\n\t\t$(settings.nTable).on( 'search.dt.DT', function ( ev, s ) {\n\t\t\tif ( settings === s ) {\n\t\t\t\t// IE9 throws an 'unknown error' if document.activeElement is used\n\t\t\t\t// inside an iframe or frame...\n\t\t\t\ttry {\n\t\t\t\t\tif ( jqFilter[0] !== document.activeElement ) {\n\t\t\t\t\t\tjqFilter.val( previousSearch.sSearch );\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\tcatch ( e ) {}\n\t\t\t}\n\t\t} );\n\t\n\t\treturn filter[0];\n\t}\n\t\n\t\n\t/**\n\t * Filter the table using both the global filter and column based filtering\n\t *  @param {object} oSettings dataTables settings object\n\t *  @param {object} oSearch search information\n\t *  @param {int} [iForce] force a research of the master array (1) or not (undefined or 0)\n\t *  @memberof DataTable#oApi\n\t */\n\tfunction _fnFilterComplete ( oSettings, oInput, iForce )\n\t{\n\t\tvar oPrevSearch = oSettings.oPreviousSearch;\n\t\tvar aoPrevSearch = oSettings.aoPreSearchCols;\n\t\tvar fnSaveFilter = function ( oFilter ) {\n\t\t\t/* Save the filtering values */\n\t\t\toPrevSearch.sSearch = oFilter.sSearch;\n\t\t\toPrevSearch.bRegex = oFilter.bRegex;\n\t\t\toPrevSearch.bSmart = oFilter.bSmart;\n\t\t\toPrevSearch.bCaseInsensitive = oFilter.bCaseInsensitive;\n\t\t};\n\t\tvar fnRegex = function ( o ) {\n\t\t\t// Backwards compatibility with the bEscapeRegex option\n\t\t\treturn o.bEscapeRegex !== undefined ? !o.bEscapeRegex : o.bRegex;\n\t\t};\n\t\n\t\t// Resolve any column types that are unknown due to addition or invalidation\n\t\t// @todo As per sort - can this be moved into an event handler?\n\t\t_fnColumnTypes( oSettings );\n\t\n\t\t/* In server-side processing all filtering is done by the server, so no point hanging around here */\n\t\tif ( _fnDataSource( oSettings ) != 'ssp' )\n\t\t{\n\t\t\t/* Global filter */\n\t\t\t_fnFilter( oSettings, oInput.sSearch, iForce, fnRegex(oInput), oInput.bSmart, oInput.bCaseInsensitive );\n\t\t\tfnSaveFilter( oInput );\n\t\n\t\t\t/* Now do the individual column filter */\n\t\t\tfor ( var i=0 ; i<aoPrevSearch.length ; i++ )\n\t\t\t{\n\t\t\t\t_fnFilterColumn( oSettings, aoPrevSearch[i].sSearch, i, fnRegex(aoPrevSearch[i]),\n\t\t\t\t\taoPrevSearch[i].bSmart, aoPrevSearch[i].bCaseInsensitive );\n\t\t\t}\n\t\n\t\t\t/* Custom filtering */\n\t\t\t_fnFilterCustom( oSettings );\n\t\t}\n\t\telse\n\t\t{\n\t\t\tfnSaveFilter( oInput );\n\t\t}\n\t\n\t\t/* Tell the draw function we have been filtering */\n\t\toSettings.bFiltered = true;\n\t\t_fnCallbackFire( oSettings, null, 'search', [oSettings] );\n\t}\n\t\n\t\n\t/**\n\t * Apply custom filtering functions\n\t *  @param {object} oSettings dataTables settings object\n\t *  @memberof DataTable#oApi\n\t */\n\tfunction _fnFilterCustom( settings )\n\t{\n\t\tvar filters = DataTable.ext.search;\n\t\tvar displayRows = settings.aiDisplay;\n\t\tvar row, rowIdx;\n\t\n\t\tfor ( var i=0, ien=filters.length ; i<ien ; i++ ) {\n\t\t\tvar rows = [];\n\t\n\t\t\t// Loop over each row and see if it should be included\n\t\t\tfor ( var j=0, jen=displayRows.length ; j<jen ; j++ ) {\n\t\t\t\trowIdx = displayRows[ j ];\n\t\t\t\trow = settings.aoData[ rowIdx ];\n\t\n\t\t\t\tif ( filters[i]( settings, row._aFilterData, rowIdx, row._aData, j ) ) {\n\t\t\t\t\trows.push( rowIdx );\n\t\t\t\t}\n\t\t\t}\n\t\n\t\t\t// So the array reference doesn't break set the results into the\n\t\t\t// existing array\n\t\t\tdisplayRows.length = 0;\n\t\t\t$.merge( displayRows, rows );\n\t\t}\n\t}\n\t\n\t\n\t/**\n\t * Filter the table on a per-column basis\n\t *  @param {object} oSettings dataTables settings object\n\t *  @param {string} sInput string to filter on\n\t *  @param {int} iColumn column to filter\n\t *  @param {bool} bRegex treat search string as a regular expression or not\n\t *  @param {bool} bSmart use smart filtering or not\n\t *  @param {bool} bCaseInsensitive Do case insenstive matching or not\n\t *  @memberof DataTable#oApi\n\t */\n\tfunction _fnFilterColumn ( settings, searchStr, colIdx, regex, smart, caseInsensitive )\n\t{\n\t\tif ( searchStr === '' ) {\n\t\t\treturn;\n\t\t}\n\t\n\t\tvar data;\n\t\tvar out = [];\n\t\tvar display = settings.aiDisplay;\n\t\tvar rpSearch = _fnFilterCreateSearch( searchStr, regex, smart, caseInsensitive );\n\t\n\t\tfor ( var i=0 ; i<display.length ; i++ ) {\n\t\t\tdata = settings.aoData[ display[i] ]._aFilterData[ colIdx ];\n\t\n\t\t\tif ( rpSearch.test( data ) ) {\n\t\t\t\tout.push( display[i] );\n\t\t\t}\n\t\t}\n\t\n\t\tsettings.aiDisplay = out;\n\t}\n\t\n\t\n\t/**\n\t * Filter the data table based on user input and draw the table\n\t *  @param {object} settings dataTables settings object\n\t *  @param {string} input string to filter on\n\t *  @param {int} force optional - force a research of the master array (1) or not (undefined or 0)\n\t *  @param {bool} regex treat as a regular expression or not\n\t *  @param {bool} smart perform smart filtering or not\n\t *  @param {bool} caseInsensitive Do case insenstive matching or not\n\t *  @memberof DataTable#oApi\n\t */\n\tfunction _fnFilter( settings, input, force, regex, smart, caseInsensitive )\n\t{\n\t\tvar rpSearch = _fnFilterCreateSearch( input, regex, smart, caseInsensitive );\n\t\tvar prevSearch = settings.oPreviousSearch.sSearch;\n\t\tvar displayMaster = settings.aiDisplayMaster;\n\t\tvar display, invalidated, i;\n\t\tvar filtered = [];\n\t\n\t\t// Need to take account of custom filtering functions - always filter\n\t\tif ( DataTable.ext.search.length !== 0 ) {\n\t\t\tforce = true;\n\t\t}\n\t\n\t\t// Check if any of the rows were invalidated\n\t\tinvalidated = _fnFilterData( settings );\n\t\n\t\t// If the input is blank - we just want the full data set\n\t\tif ( input.length <= 0 ) {\n\t\t\tsettings.aiDisplay = displayMaster.slice();\n\t\t}\n\t\telse {\n\t\t\t// New search - start from the master array\n\t\t\tif ( invalidated ||\n\t\t\t\t force ||\n\t\t\t\t regex ||\n\t\t\t\t prevSearch.length > input.length ||\n\t\t\t\t input.indexOf(prevSearch) !== 0 ||\n\t\t\t\t settings.bSorted // On resort, the display master needs to be\n\t\t\t\t                  // re-filtered since indexes will have changed\n\t\t\t) {\n\t\t\t\tsettings.aiDisplay = displayMaster.slice();\n\t\t\t}\n\t\n\t\t\t// Search the display array\n\t\t\tdisplay = settings.aiDisplay;\n\t\n\t\t\tfor ( i=0 ; i<display.length ; i++ ) {\n\t\t\t\tif ( rpSearch.test( settings.aoData[ display[i] ]._sFilterRow ) ) {\n\t\t\t\t\tfiltered.push( display[i] );\n\t\t\t\t}\n\t\t\t}\n\t\n\t\t\tsettings.aiDisplay = filtered;\n\t\t}\n\t}\n\t\n\t\n\t/**\n\t * Build a regular expression object suitable for searching a table\n\t *  @param {string} sSearch string to search for\n\t *  @param {bool} bRegex treat as a regular expression or not\n\t *  @param {bool} bSmart perform smart filtering or not\n\t *  @param {bool} bCaseInsensitive Do case insensitive matching or not\n\t *  @returns {RegExp} constructed object\n\t *  @memberof DataTable#oApi\n\t */\n\tfunction _fnFilterCreateSearch( search, regex, smart, caseInsensitive )\n\t{\n\t\tsearch = regex ?\n\t\t\tsearch :\n\t\t\t_fnEscapeRegex( search );\n\t\t\n\t\tif ( smart ) {\n\t\t\t/* For smart filtering we want to allow the search to work regardless of\n\t\t\t * word order. We also want double quoted text to be preserved, so word\n\t\t\t * order is important - a la google. So this is what we want to\n\t\t\t * generate:\n\t\t\t * \n\t\t\t * ^(?=.*?\\bone\\b)(?=.*?\\btwo three\\b)(?=.*?\\bfour\\b).*$\n\t\t\t */\n\t\t\tvar a = $.map( search.match( /\"[^\"]+\"|[^ ]+/g ) || [''], function ( word ) {\n\t\t\t\tif ( word.charAt(0) === '\"' ) {\n\t\t\t\t\tvar m = word.match( /^\"(.*)\"$/ );\n\t\t\t\t\tword = m ? m[1] : word;\n\t\t\t\t}\n\t\n\t\t\t\treturn word.replace('\"', '');\n\t\t\t} );\n\t\n\t\t\tsearch = '^(?=.*?'+a.join( ')(?=.*?' )+').*$';\n\t\t}\n\t\n\t\treturn new RegExp( search, caseInsensitive ? 'i' : '' );\n\t}\n\t\n\t\n\t/**\n\t * Escape a string such that it can be used in a regular expression\n\t *  @param {string} sVal string to escape\n\t *  @returns {string} escaped string\n\t *  @memberof DataTable#oApi\n\t */\n\tvar _fnEscapeRegex = DataTable.util.escapeRegex;\n\t\n\tvar __filter_div = $('<div>')[0];\n\tvar __filter_div_textContent = __filter_div.textContent !== undefined;\n\t\n\t// Update the filtering data for each row if needed (by invalidation or first run)\n\tfunction _fnFilterData ( settings )\n\t{\n\t\tvar columns = settings.aoColumns;\n\t\tvar column;\n\t\tvar i, j, ien, jen, filterData, cellData, row;\n\t\tvar fomatters = DataTable.ext.type.search;\n\t\tvar wasInvalidated = false;\n\t\n\t\tfor ( i=0, ien=settings.aoData.length ; i<ien ; i++ ) {\n\t\t\trow = settings.aoData[i];\n\t\n\t\t\tif ( ! row._aFilterData ) {\n\t\t\t\tfilterData = [];\n\t\n\t\t\t\tfor ( j=0, jen=columns.length ; j<jen ; j++ ) {\n\t\t\t\t\tcolumn = columns[j];\n\t\n\t\t\t\t\tif ( column.bSearchable ) {\n\t\t\t\t\t\tcellData = _fnGetCellData( settings, i, j, 'filter' );\n\t\n\t\t\t\t\t\tif ( fomatters[ column.sType ] ) {\n\t\t\t\t\t\t\tcellData = fomatters[ column.sType ]( cellData );\n\t\t\t\t\t\t}\n\t\n\t\t\t\t\t\t// Search in DataTables 1.10 is string based. In 1.11 this\n\t\t\t\t\t\t// should be altered to also allow strict type checking.\n\t\t\t\t\t\tif ( cellData === null ) {\n\t\t\t\t\t\t\tcellData = '';\n\t\t\t\t\t\t}\n\t\n\t\t\t\t\t\tif ( typeof cellData !== 'string' && cellData.toString ) {\n\t\t\t\t\t\t\tcellData = cellData.toString();\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t\telse {\n\t\t\t\t\t\tcellData = '';\n\t\t\t\t\t}\n\t\n\t\t\t\t\t// If it looks like there is an HTML entity in the string,\n\t\t\t\t\t// attempt to decode it so sorting works as expected. Note that\n\t\t\t\t\t// we could use a single line of jQuery to do this, but the DOM\n\t\t\t\t\t// method used here is much faster http://jsperf.com/html-decode\n\t\t\t\t\tif ( cellData.indexOf && cellData.indexOf('&') !== -1 ) {\n\t\t\t\t\t\t__filter_div.innerHTML = cellData;\n\t\t\t\t\t\tcellData = __filter_div_textContent ?\n\t\t\t\t\t\t\t__filter_div.textContent :\n\t\t\t\t\t\t\t__filter_div.innerText;\n\t\t\t\t\t}\n\t\n\t\t\t\t\tif ( cellData.replace ) {\n\t\t\t\t\t\tcellData = cellData.replace(/[\\r\\n\\u2028]/g, '');\n\t\t\t\t\t}\n\t\n\t\t\t\t\tfilterData.push( cellData );\n\t\t\t\t}\n\t\n\t\t\t\trow._aFilterData = filterData;\n\t\t\t\trow._sFilterRow = filterData.join('  ');\n\t\t\t\twasInvalidated = true;\n\t\t\t}\n\t\t}\n\t\n\t\treturn wasInvalidated;\n\t}\n\t\n\t\n\t/**\n\t * Convert from the internal Hungarian notation to camelCase for external\n\t * interaction\n\t *  @param {object} obj Object to convert\n\t *  @returns {object} Inverted object\n\t *  @memberof DataTable#oApi\n\t */\n\tfunction _fnSearchToCamel ( obj )\n\t{\n\t\treturn {\n\t\t\tsearch:          obj.sSearch,\n\t\t\tsmart:           obj.bSmart,\n\t\t\tregex:           obj.bRegex,\n\t\t\tcaseInsensitive: obj.bCaseInsensitive\n\t\t};\n\t}\n\t\n\t\n\t\n\t/**\n\t * Convert from camelCase notation to the internal Hungarian. We could use the\n\t * Hungarian convert function here, but this is cleaner\n\t *  @param {object} obj Object to convert\n\t *  @returns {object} Inverted object\n\t *  @memberof DataTable#oApi\n\t */\n\tfunction _fnSearchToHung ( obj )\n\t{\n\t\treturn {\n\t\t\tsSearch:          obj.search,\n\t\t\tbSmart:           obj.smart,\n\t\t\tbRegex:           obj.regex,\n\t\t\tbCaseInsensitive: obj.caseInsensitive\n\t\t};\n\t}\n\t\n\t/**\n\t * Generate the node required for the info display\n\t *  @param {object} oSettings dataTables settings object\n\t *  @returns {node} Information element\n\t *  @memberof DataTable#oApi\n\t */\n\tfunction _fnFeatureHtmlInfo ( settings )\n\t{\n\t\tvar\n\t\t\ttid = settings.sTableId,\n\t\t\tnodes = settings.aanFeatures.i,\n\t\t\tn = $('<div/>', {\n\t\t\t\t'class': settings.oClasses.sInfo,\n\t\t\t\t'id': ! nodes ? tid+'_info' : null\n\t\t\t} );\n\t\n\t\tif ( ! nodes ) {\n\t\t\t// Update display on each draw\n\t\t\tsettings.aoDrawCallback.push( {\n\t\t\t\t\"fn\": _fnUpdateInfo,\n\t\t\t\t\"sName\": \"information\"\n\t\t\t} );\n\t\n\t\t\tn\n\t\t\t\t.attr( 'role', 'status' )\n\t\t\t\t.attr( 'aria-live', 'polite' );\n\t\n\t\t\t// Table is described by our info div\n\t\t\t$(settings.nTable).attr( 'aria-describedby', tid+'_info' );\n\t\t}\n\t\n\t\treturn n[0];\n\t}\n\t\n\t\n\t/**\n\t * Update the information elements in the display\n\t *  @param {object} settings dataTables settings object\n\t *  @memberof DataTable#oApi\n\t */\n\tfunction _fnUpdateInfo ( settings )\n\t{\n\t\t/* Show information about the table */\n\t\tvar nodes = settings.aanFeatures.i;\n\t\tif ( nodes.length === 0 ) {\n\t\t\treturn;\n\t\t}\n\t\n\t\tvar\n\t\t\tlang  = settings.oLanguage,\n\t\t\tstart = settings._iDisplayStart+1,\n\t\t\tend   = settings.fnDisplayEnd(),\n\t\t\tmax   = settings.fnRecordsTotal(),\n\t\t\ttotal = settings.fnRecordsDisplay(),\n\t\t\tout   = total ?\n\t\t\t\tlang.sInfo :\n\t\t\t\tlang.sInfoEmpty;\n\t\n\t\tif ( total !== max ) {\n\t\t\t/* Record set after filtering */\n\t\t\tout += ' ' + lang.sInfoFiltered;\n\t\t}\n\t\n\t\t// Convert the macros\n\t\tout += lang.sInfoPostFix;\n\t\tout = _fnInfoMacros( settings, out );\n\t\n\t\tvar callback = lang.fnInfoCallback;\n\t\tif ( callback !== null ) {\n\t\t\tout = callback.call( settings.oInstance,\n\t\t\t\tsettings, start, end, max, total, out\n\t\t\t);\n\t\t}\n\t\n\t\t$(nodes).html( out );\n\t}\n\t\n\t\n\tfunction _fnInfoMacros ( settings, str )\n\t{\n\t\t// When infinite scrolling, we are always starting at 1. _iDisplayStart is used only\n\t\t// internally\n\t\tvar\n\t\t\tformatter  = settings.fnFormatNumber,\n\t\t\tstart      = settings._iDisplayStart+1,\n\t\t\tlen        = settings._iDisplayLength,\n\t\t\tvis        = settings.fnRecordsDisplay(),\n\t\t\tall        = len === -1;\n\t\n\t\treturn str.\n\t\t\treplace(/_START_/g, formatter.call( settings, start ) ).\n\t\t\treplace(/_END_/g,   formatter.call( settings, settings.fnDisplayEnd() ) ).\n\t\t\treplace(/_MAX_/g,   formatter.call( settings, settings.fnRecordsTotal() ) ).\n\t\t\treplace(/_TOTAL_/g, formatter.call( settings, vis ) ).\n\t\t\treplace(/_PAGE_/g,  formatter.call( settings, all ? 1 : Math.ceil( start / len ) ) ).\n\t\t\treplace(/_PAGES_/g, formatter.call( settings, all ? 1 : Math.ceil( vis / len ) ) );\n\t}\n\t\n\t\n\t\n\t/**\n\t * Draw the table for the first time, adding all required features\n\t *  @param {object} settings dataTables settings object\n\t *  @memberof DataTable#oApi\n\t */\n\tfunction _fnInitialise ( settings )\n\t{\n\t\tvar i, iLen, iAjaxStart=settings.iInitDisplayStart;\n\t\tvar columns = settings.aoColumns, column;\n\t\tvar features = settings.oFeatures;\n\t\tvar deferLoading = settings.bDeferLoading; // value modified by the draw\n\t\n\t\t/* Ensure that the table data is fully initialised */\n\t\tif ( ! settings.bInitialised ) {\n\t\t\tsetTimeout( function(){ _fnInitialise( settings ); }, 200 );\n\t\t\treturn;\n\t\t}\n\t\n\t\t/* Show the display HTML options */\n\t\t_fnAddOptionsHtml( settings );\n\t\n\t\t/* Build and draw the header / footer for the table */\n\t\t_fnBuildHead( settings );\n\t\t_fnDrawHead( settings, settings.aoHeader );\n\t\t_fnDrawHead( settings, settings.aoFooter );\n\t\n\t\t/* Okay to show that something is going on now */\n\t\t_fnProcessingDisplay( settings, true );\n\t\n\t\t/* Calculate sizes for columns */\n\t\tif ( features.bAutoWidth ) {\n\t\t\t_fnCalculateColumnWidths( settings );\n\t\t}\n\t\n\t\tfor ( i=0, iLen=columns.length ; i<iLen ; i++ ) {\n\t\t\tcolumn = columns[i];\n\t\n\t\t\tif ( column.sWidth ) {\n\t\t\t\tcolumn.nTh.style.width = _fnStringToCss( column.sWidth );\n\t\t\t}\n\t\t}\n\t\n\t\t_fnCallbackFire( settings, null, 'preInit', [settings] );\n\t\n\t\t// If there is default sorting required - let's do it. The sort function\n\t\t// will do the drawing for us. Otherwise we draw the table regardless of the\n\t\t// Ajax source - this allows the table to look initialised for Ajax sourcing\n\t\t// data (show 'loading' message possibly)\n\t\t_fnReDraw( settings );\n\t\n\t\t// Server-side processing init complete is done by _fnAjaxUpdateDraw\n\t\tvar dataSrc = _fnDataSource( settings );\n\t\tif ( dataSrc != 'ssp' || deferLoading ) {\n\t\t\t// if there is an ajax source load the data\n\t\t\tif ( dataSrc == 'ajax' ) {\n\t\t\t\t_fnBuildAjax( settings, [], function(json) {\n\t\t\t\t\tvar aData = _fnAjaxDataSrc( settings, json );\n\t\n\t\t\t\t\t// Got the data - add it to the table\n\t\t\t\t\tfor ( i=0 ; i<aData.length ; i++ ) {\n\t\t\t\t\t\t_fnAddData( settings, aData[i] );\n\t\t\t\t\t}\n\t\n\t\t\t\t\t// Reset the init display for cookie saving. We've already done\n\t\t\t\t\t// a filter, and therefore cleared it before. So we need to make\n\t\t\t\t\t// it appear 'fresh'\n\t\t\t\t\tsettings.iInitDisplayStart = iAjaxStart;\n\t\n\t\t\t\t\t_fnReDraw( settings );\n\t\n\t\t\t\t\t_fnProcessingDisplay( settings, false );\n\t\t\t\t\t_fnInitComplete( settings, json );\n\t\t\t\t}, settings );\n\t\t\t}\n\t\t\telse {\n\t\t\t\t_fnProcessingDisplay( settings, false );\n\t\t\t\t_fnInitComplete( settings );\n\t\t\t}\n\t\t}\n\t}\n\t\n\t\n\t/**\n\t * Draw the table for the first time, adding all required features\n\t *  @param {object} oSettings dataTables settings object\n\t *  @param {object} [json] JSON from the server that completed the table, if using Ajax source\n\t *    with client-side processing (optional)\n\t *  @memberof DataTable#oApi\n\t */\n\tfunction _fnInitComplete ( settings, json )\n\t{\n\t\tsettings._bInitComplete = true;\n\t\n\t\t// When data was added after the initialisation (data or Ajax) we need to\n\t\t// calculate the column sizing\n\t\tif ( json || settings.oInit.aaData ) {\n\t\t\t_fnAdjustColumnSizing( settings );\n\t\t}\n\t\n\t\t_fnCallbackFire( settings, null, 'plugin-init', [settings, json] );\n\t\t_fnCallbackFire( settings, 'aoInitComplete', 'init', [settings, json] );\n\t}\n\t\n\t\n\tfunction _fnLengthChange ( settings, val )\n\t{\n\t\tvar len = parseInt( val, 10 );\n\t\tsettings._iDisplayLength = len;\n\t\n\t\t_fnLengthOverflow( settings );\n\t\n\t\t// Fire length change event\n\t\t_fnCallbackFire( settings, null, 'length', [settings, len] );\n\t}\n\t\n\t\n\t/**\n\t * Generate the node required for user display length changing\n\t *  @param {object} settings dataTables settings object\n\t *  @returns {node} Display length feature node\n\t *  @memberof DataTable#oApi\n\t */\n\tfunction _fnFeatureHtmlLength ( settings )\n\t{\n\t\tvar\n\t\t\tclasses  = settings.oClasses,\n\t\t\ttableId  = settings.sTableId,\n\t\t\tmenu     = settings.aLengthMenu,\n\t\t\td2       = $.isArray( menu[0] ),\n\t\t\tlengths  = d2 ? menu[0] : menu,\n\t\t\tlanguage = d2 ? menu[1] : menu;\n\t\n\t\tvar select = $('<select/>', {\n\t\t\t'name':          tableId+'_length',\n\t\t\t'aria-controls': tableId,\n\t\t\t'class':         classes.sLengthSelect\n\t\t} );\n\t\n\t\tfor ( var i=0, ien=lengths.length ; i<ien ; i++ ) {\n\t\t\tselect[0][ i ] = new Option(\n\t\t\t\ttypeof language[i] === 'number' ?\n\t\t\t\t\tsettings.fnFormatNumber( language[i] ) :\n\t\t\t\t\tlanguage[i],\n\t\t\t\tlengths[i]\n\t\t\t);\n\t\t}\n\t\n\t\tvar div = $('<div><label/></div>').addClass( classes.sLength );\n\t\tif ( ! settings.aanFeatures.l ) {\n\t\t\tdiv[0].id = tableId+'_length';\n\t\t}\n\t\n\t\tdiv.children().append(\n\t\t\tsettings.oLanguage.sLengthMenu.replace( '_MENU_', select[0].outerHTML )\n\t\t);\n\t\n\t\t// Can't use `select` variable as user might provide their own and the\n\t\t// reference is broken by the use of outerHTML\n\t\t$('select', div)\n\t\t\t.val( settings._iDisplayLength )\n\t\t\t.on( 'change.DT', function(e) {\n\t\t\t\t_fnLengthChange( settings, $(this).val() );\n\t\t\t\t_fnDraw( settings );\n\t\t\t} );\n\t\n\t\t// Update node value whenever anything changes the table's length\n\t\t$(settings.nTable).on( 'length.dt.DT', function (e, s, len) {\n\t\t\tif ( settings === s ) {\n\t\t\t\t$('select', div).val( len );\n\t\t\t}\n\t\t} );\n\t\n\t\treturn div[0];\n\t}\n\t\n\t\n\t\n\t/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *\n\t * Note that most of the paging logic is done in\n\t * DataTable.ext.pager\n\t */\n\t\n\t/**\n\t * Generate the node required for default pagination\n\t *  @param {object} oSettings dataTables settings object\n\t *  @returns {node} Pagination feature node\n\t *  @memberof DataTable#oApi\n\t */\n\tfunction _fnFeatureHtmlPaginate ( settings )\n\t{\n\t\tvar\n\t\t\ttype   = settings.sPaginationType,\n\t\t\tplugin = DataTable.ext.pager[ type ],\n\t\t\tmodern = typeof plugin === 'function',\n\t\t\tredraw = function( settings ) {\n\t\t\t\t_fnDraw( settings );\n\t\t\t},\n\t\t\tnode = $('<div/>').addClass( settings.oClasses.sPaging + type )[0],\n\t\t\tfeatures = settings.aanFeatures;\n\t\n\t\tif ( ! modern ) {\n\t\t\tplugin.fnInit( settings, node, redraw );\n\t\t}\n\t\n\t\t/* Add a draw callback for the pagination on first instance, to update the paging display */\n\t\tif ( ! features.p )\n\t\t{\n\t\t\tnode.id = settings.sTableId+'_paginate';\n\t\n\t\t\tsettings.aoDrawCallback.push( {\n\t\t\t\t\"fn\": function( settings ) {\n\t\t\t\t\tif ( modern ) {\n\t\t\t\t\t\tvar\n\t\t\t\t\t\t\tstart      = settings._iDisplayStart,\n\t\t\t\t\t\t\tlen        = settings._iDisplayLength,\n\t\t\t\t\t\t\tvisRecords = settings.fnRecordsDisplay(),\n\t\t\t\t\t\t\tall        = len === -1,\n\t\t\t\t\t\t\tpage = all ? 0 : Math.ceil( start / len ),\n\t\t\t\t\t\t\tpages = all ? 1 : Math.ceil( visRecords / len ),\n\t\t\t\t\t\t\tbuttons = plugin(page, pages),\n\t\t\t\t\t\t\ti, ien;\n\t\n\t\t\t\t\t\tfor ( i=0, ien=features.p.length ; i<ien ; i++ ) {\n\t\t\t\t\t\t\t_fnRenderer( settings, 'pageButton' )(\n\t\t\t\t\t\t\t\tsettings, features.p[i], i, buttons, page, pages\n\t\t\t\t\t\t\t);\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t\telse {\n\t\t\t\t\t\tplugin.fnUpdate( settings, redraw );\n\t\t\t\t\t}\n\t\t\t\t},\n\t\t\t\t\"sName\": \"pagination\"\n\t\t\t} );\n\t\t}\n\t\n\t\treturn node;\n\t}\n\t\n\t\n\t/**\n\t * Alter the display settings to change the page\n\t *  @param {object} settings DataTables settings object\n\t *  @param {string|int} action Paging action to take: \"first\", \"previous\",\n\t *    \"next\" or \"last\" or page number to jump to (integer)\n\t *  @param [bool] redraw Automatically draw the update or not\n\t *  @returns {bool} true page has changed, false - no change\n\t *  @memberof DataTable#oApi\n\t */\n\tfunction _fnPageChange ( settings, action, redraw )\n\t{\n\t\tvar\n\t\t\tstart     = settings._iDisplayStart,\n\t\t\tlen       = settings._iDisplayLength,\n\t\t\trecords   = settings.fnRecordsDisplay();\n\t\n\t\tif ( records === 0 || len === -1 )\n\t\t{\n\t\t\tstart = 0;\n\t\t}\n\t\telse if ( typeof action === \"number\" )\n\t\t{\n\t\t\tstart = action * len;\n\t\n\t\t\tif ( start > records )\n\t\t\t{\n\t\t\t\tstart = 0;\n\t\t\t}\n\t\t}\n\t\telse if ( action == \"first\" )\n\t\t{\n\t\t\tstart = 0;\n\t\t}\n\t\telse if ( action == \"previous\" )\n\t\t{\n\t\t\tstart = len >= 0 ?\n\t\t\t\tstart - len :\n\t\t\t\t0;\n\t\n\t\t\tif ( start < 0 )\n\t\t\t{\n\t\t\t  start = 0;\n\t\t\t}\n\t\t}\n\t\telse if ( action == \"next\" )\n\t\t{\n\t\t\tif ( start + len < records )\n\t\t\t{\n\t\t\t\tstart += len;\n\t\t\t}\n\t\t}\n\t\telse if ( action == \"last\" )\n\t\t{\n\t\t\tstart = Math.floor( (records-1) / len) * len;\n\t\t}\n\t\telse\n\t\t{\n\t\t\t_fnLog( settings, 0, \"Unknown paging action: \"+action, 5 );\n\t\t}\n\t\n\t\tvar changed = settings._iDisplayStart !== start;\n\t\tsettings._iDisplayStart = start;\n\t\n\t\tif ( changed ) {\n\t\t\t_fnCallbackFire( settings, null, 'page', [settings] );\n\t\n\t\t\tif ( redraw ) {\n\t\t\t\t_fnDraw( settings );\n\t\t\t}\n\t\t}\n\t\n\t\treturn changed;\n\t}\n\t\n\t\n\t\n\t/**\n\t * Generate the node required for the processing node\n\t *  @param {object} settings dataTables settings object\n\t *  @returns {node} Processing element\n\t *  @memberof DataTable#oApi\n\t */\n\tfunction _fnFeatureHtmlProcessing ( settings )\n\t{\n\t\treturn $('<div/>', {\n\t\t\t\t'id': ! settings.aanFeatures.r ? settings.sTableId+'_processing' : null,\n\t\t\t\t'class': settings.oClasses.sProcessing\n\t\t\t} )\n\t\t\t.html( settings.oLanguage.sProcessing )\n\t\t\t.insertBefore( settings.nTable )[0];\n\t}\n\t\n\t\n\t/**\n\t * Display or hide the processing indicator\n\t *  @param {object} settings dataTables settings object\n\t *  @param {bool} show Show the processing indicator (true) or not (false)\n\t *  @memberof DataTable#oApi\n\t */\n\tfunction _fnProcessingDisplay ( settings, show )\n\t{\n\t\tif ( settings.oFeatures.bProcessing ) {\n\t\t\t$(settings.aanFeatures.r).css( 'display', show ? 'block' : 'none' );\n\t\t}\n\t\n\t\t_fnCallbackFire( settings, null, 'processing', [settings, show] );\n\t}\n\t\n\t/**\n\t * Add any control elements for the table - specifically scrolling\n\t *  @param {object} settings dataTables settings object\n\t *  @returns {node} Node to add to the DOM\n\t *  @memberof DataTable#oApi\n\t */\n\tfunction _fnFeatureHtmlTable ( settings )\n\t{\n\t\tvar table = $(settings.nTable);\n\t\n\t\t// Add the ARIA grid role to the table\n\t\ttable.attr( 'role', 'grid' );\n\t\n\t\t// Scrolling from here on in\n\t\tvar scroll = settings.oScroll;\n\t\n\t\tif ( scroll.sX === '' && scroll.sY === '' ) {\n\t\t\treturn settings.nTable;\n\t\t}\n\t\n\t\tvar scrollX = scroll.sX;\n\t\tvar scrollY = scroll.sY;\n\t\tvar classes = settings.oClasses;\n\t\tvar caption = table.children('caption');\n\t\tvar captionSide = caption.length ? caption[0]._captionSide : null;\n\t\tvar headerClone = $( table[0].cloneNode(false) );\n\t\tvar footerClone = $( table[0].cloneNode(false) );\n\t\tvar footer = table.children('tfoot');\n\t\tvar _div = '<div/>';\n\t\tvar size = function ( s ) {\n\t\t\treturn !s ? null : _fnStringToCss( s );\n\t\t};\n\t\n\t\tif ( ! footer.length ) {\n\t\t\tfooter = null;\n\t\t}\n\t\n\t\t/*\n\t\t * The HTML structure that we want to generate in this function is:\n\t\t *  div - scroller\n\t\t *    div - scroll head\n\t\t *      div - scroll head inner\n\t\t *        table - scroll head table\n\t\t *          thead - thead\n\t\t *    div - scroll body\n\t\t *      table - table (master table)\n\t\t *        thead - thead clone for sizing\n\t\t *        tbody - tbody\n\t\t *    div - scroll foot\n\t\t *      div - scroll foot inner\n\t\t *        table - scroll foot table\n\t\t *          tfoot - tfoot\n\t\t */\n\t\tvar scroller = $( _div, { 'class': classes.sScrollWrapper } )\n\t\t\t.append(\n\t\t\t\t$(_div, { 'class': classes.sScrollHead } )\n\t\t\t\t\t.css( {\n\t\t\t\t\t\toverflow: 'hidden',\n\t\t\t\t\t\tposition: 'relative',\n\t\t\t\t\t\tborder: 0,\n\t\t\t\t\t\twidth: scrollX ? size(scrollX) : '100%'\n\t\t\t\t\t} )\n\t\t\t\t\t.append(\n\t\t\t\t\t\t$(_div, { 'class': classes.sScrollHeadInner } )\n\t\t\t\t\t\t\t.css( {\n\t\t\t\t\t\t\t\t'box-sizing': 'content-box',\n\t\t\t\t\t\t\t\twidth: scroll.sXInner || '100%'\n\t\t\t\t\t\t\t} )\n\t\t\t\t\t\t\t.append(\n\t\t\t\t\t\t\t\theaderClone\n\t\t\t\t\t\t\t\t\t.removeAttr('id')\n\t\t\t\t\t\t\t\t\t.css( 'margin-left', 0 )\n\t\t\t\t\t\t\t\t\t.append( captionSide === 'top' ? caption : null )\n\t\t\t\t\t\t\t\t\t.append(\n\t\t\t\t\t\t\t\t\t\ttable.children('thead')\n\t\t\t\t\t\t\t\t\t)\n\t\t\t\t\t\t\t)\n\t\t\t\t\t)\n\t\t\t)\n\t\t\t.append(\n\t\t\t\t$(_div, { 'class': classes.sScrollBody } )\n\t\t\t\t\t.css( {\n\t\t\t\t\t\tposition: 'relative',\n\t\t\t\t\t\toverflow: 'auto',\n\t\t\t\t\t\twidth: size( scrollX )\n\t\t\t\t\t} )\n\t\t\t\t\t.append( table )\n\t\t\t);\n\t\n\t\tif ( footer ) {\n\t\t\tscroller.append(\n\t\t\t\t$(_div, { 'class': classes.sScrollFoot } )\n\t\t\t\t\t.css( {\n\t\t\t\t\t\toverflow: 'hidden',\n\t\t\t\t\t\tborder: 0,\n\t\t\t\t\t\twidth: scrollX ? size(scrollX) : '100%'\n\t\t\t\t\t} )\n\t\t\t\t\t.append(\n\t\t\t\t\t\t$(_div, { 'class': classes.sScrollFootInner } )\n\t\t\t\t\t\t\t.append(\n\t\t\t\t\t\t\t\tfooterClone\n\t\t\t\t\t\t\t\t\t.removeAttr('id')\n\t\t\t\t\t\t\t\t\t.css( 'margin-left', 0 )\n\t\t\t\t\t\t\t\t\t.append( captionSide === 'bottom' ? caption : null )\n\t\t\t\t\t\t\t\t\t.append(\n\t\t\t\t\t\t\t\t\t\ttable.children('tfoot')\n\t\t\t\t\t\t\t\t\t)\n\t\t\t\t\t\t\t)\n\t\t\t\t\t)\n\t\t\t);\n\t\t}\n\t\n\t\tvar children = scroller.children();\n\t\tvar scrollHead = children[0];\n\t\tvar scrollBody = children[1];\n\t\tvar scrollFoot = footer ? children[2] : null;\n\t\n\t\t// When the body is scrolled, then we also want to scroll the headers\n\t\tif ( scrollX ) {\n\t\t\t$(scrollBody).on( 'scroll.DT', function (e) {\n\t\t\t\tvar scrollLeft = this.scrollLeft;\n\t\n\t\t\t\tscrollHead.scrollLeft = scrollLeft;\n\t\n\t\t\t\tif ( footer ) {\n\t\t\t\t\tscrollFoot.scrollLeft = scrollLeft;\n\t\t\t\t}\n\t\t\t} );\n\t\t}\n\t\n\t\t$(scrollBody).css('max-height', scrollY);\n\t\tif (! scroll.bCollapse) {\n\t\t\t$(scrollBody).css('height', scrollY);\n\t\t}\n\t\n\t\tsettings.nScrollHead = scrollHead;\n\t\tsettings.nScrollBody = scrollBody;\n\t\tsettings.nScrollFoot = scrollFoot;\n\t\n\t\t// On redraw - align columns\n\t\tsettings.aoDrawCallback.push( {\n\t\t\t\"fn\": _fnScrollDraw,\n\t\t\t\"sName\": \"scrolling\"\n\t\t} );\n\t\n\t\treturn scroller[0];\n\t}\n\t\n\t\n\t\n\t/**\n\t * Update the header, footer and body tables for resizing - i.e. column\n\t * alignment.\n\t *\n\t * Welcome to the most horrible function DataTables. The process that this\n\t * function follows is basically:\n\t *   1. Re-create the table inside the scrolling div\n\t *   2. Take live measurements from the DOM\n\t *   3. Apply the measurements to align the columns\n\t *   4. Clean up\n\t *\n\t *  @param {object} settings dataTables settings object\n\t *  @memberof DataTable#oApi\n\t */\n\tfunction _fnScrollDraw ( settings )\n\t{\n\t\t// Given that this is such a monster function, a lot of variables are use\n\t\t// to try and keep the minimised size as small as possible\n\t\tvar\n\t\t\tscroll         = settings.oScroll,\n\t\t\tscrollX        = scroll.sX,\n\t\t\tscrollXInner   = scroll.sXInner,\n\t\t\tscrollY        = scroll.sY,\n\t\t\tbarWidth       = scroll.iBarWidth,\n\t\t\tdivHeader      = $(settings.nScrollHead),\n\t\t\tdivHeaderStyle = divHeader[0].style,\n\t\t\tdivHeaderInner = divHeader.children('div'),\n\t\t\tdivHeaderInnerStyle = divHeaderInner[0].style,\n\t\t\tdivHeaderTable = divHeaderInner.children('table'),\n\t\t\tdivBodyEl      = settings.nScrollBody,\n\t\t\tdivBody        = $(divBodyEl),\n\t\t\tdivBodyStyle   = divBodyEl.style,\n\t\t\tdivFooter      = $(settings.nScrollFoot),\n\t\t\tdivFooterInner = divFooter.children('div'),\n\t\t\tdivFooterTable = divFooterInner.children('table'),\n\t\t\theader         = $(settings.nTHead),\n\t\t\ttable          = $(settings.nTable),\n\t\t\ttableEl        = table[0],\n\t\t\ttableStyle     = tableEl.style,\n\t\t\tfooter         = settings.nTFoot ? $(settings.nTFoot) : null,\n\t\t\tbrowser        = settings.oBrowser,\n\t\t\tie67           = browser.bScrollOversize,\n\t\t\tdtHeaderCells  = _pluck( settings.aoColumns, 'nTh' ),\n\t\t\theaderTrgEls, footerTrgEls,\n\t\t\theaderSrcEls, footerSrcEls,\n\t\t\theaderCopy, footerCopy,\n\t\t\theaderWidths=[], footerWidths=[],\n\t\t\theaderContent=[], footerContent=[],\n\t\t\tidx, correction, sanityWidth,\n\t\t\tzeroOut = function(nSizer) {\n\t\t\t\tvar style = nSizer.style;\n\t\t\t\tstyle.paddingTop = \"0\";\n\t\t\t\tstyle.paddingBottom = \"0\";\n\t\t\t\tstyle.borderTopWidth = \"0\";\n\t\t\t\tstyle.borderBottomWidth = \"0\";\n\t\t\t\tstyle.height = 0;\n\t\t\t};\n\t\n\t\t// If the scrollbar visibility has changed from the last draw, we need to\n\t\t// adjust the column sizes as the table width will have changed to account\n\t\t// for the scrollbar\n\t\tvar scrollBarVis = divBodyEl.scrollHeight > divBodyEl.clientHeight;\n\t\t\n\t\tif ( settings.scrollBarVis !== scrollBarVis && settings.scrollBarVis !== undefined ) {\n\t\t\tsettings.scrollBarVis = scrollBarVis;\n\t\t\t_fnAdjustColumnSizing( settings );\n\t\t\treturn; // adjust column sizing will call this function again\n\t\t}\n\t\telse {\n\t\t\tsettings.scrollBarVis = scrollBarVis;\n\t\t}\n\t\n\t\t/*\n\t\t * 1. Re-create the table inside the scrolling div\n\t\t */\n\t\n\t\t// Remove the old minimised thead and tfoot elements in the inner table\n\t\ttable.children('thead, tfoot').remove();\n\t\n\t\tif ( footer ) {\n\t\t\tfooterCopy = footer.clone().prependTo( table );\n\t\t\tfooterTrgEls = footer.find('tr'); // the original tfoot is in its own table and must be sized\n\t\t\tfooterSrcEls = footerCopy.find('tr');\n\t\t}\n\t\n\t\t// Clone the current header and footer elements and then place it into the inner table\n\t\theaderCopy = header.clone().prependTo( table );\n\t\theaderTrgEls = header.find('tr'); // original header is in its own table\n\t\theaderSrcEls = headerCopy.find('tr');\n\t\theaderCopy.find('th, td').removeAttr('tabindex');\n\t\n\t\n\t\t/*\n\t\t * 2. Take live measurements from the DOM - do not alter the DOM itself!\n\t\t */\n\t\n\t\t// Remove old sizing and apply the calculated column widths\n\t\t// Get the unique column headers in the newly created (cloned) header. We want to apply the\n\t\t// calculated sizes to this header\n\t\tif ( ! scrollX )\n\t\t{\n\t\t\tdivBodyStyle.width = '100%';\n\t\t\tdivHeader[0].style.width = '100%';\n\t\t}\n\t\n\t\t$.each( _fnGetUniqueThs( settings, headerCopy ), function ( i, el ) {\n\t\t\tidx = _fnVisibleToColumnIndex( settings, i );\n\t\t\tel.style.width = settings.aoColumns[idx].sWidth;\n\t\t} );\n\t\n\t\tif ( footer ) {\n\t\t\t_fnApplyToChildren( function(n) {\n\t\t\t\tn.style.width = \"\";\n\t\t\t}, footerSrcEls );\n\t\t}\n\t\n\t\t// Size the table as a whole\n\t\tsanityWidth = table.outerWidth();\n\t\tif ( scrollX === \"\" ) {\n\t\t\t// No x scrolling\n\t\t\ttableStyle.width = \"100%\";\n\t\n\t\t\t// IE7 will make the width of the table when 100% include the scrollbar\n\t\t\t// - which is shouldn't. When there is a scrollbar we need to take this\n\t\t\t// into account.\n\t\t\tif ( ie67 && (table.find('tbody').height() > divBodyEl.offsetHeight ||\n\t\t\t\tdivBody.css('overflow-y') == \"scroll\")\n\t\t\t) {\n\t\t\t\ttableStyle.width = _fnStringToCss( table.outerWidth() - barWidth);\n\t\t\t}\n\t\n\t\t\t// Recalculate the sanity width\n\t\t\tsanityWidth = table.outerWidth();\n\t\t}\n\t\telse if ( scrollXInner !== \"\" ) {\n\t\t\t// legacy x scroll inner has been given - use it\n\t\t\ttableStyle.width = _fnStringToCss(scrollXInner);\n\t\n\t\t\t// Recalculate the sanity width\n\t\t\tsanityWidth = table.outerWidth();\n\t\t}\n\t\n\t\t// Hidden header should have zero height, so remove padding and borders. Then\n\t\t// set the width based on the real headers\n\t\n\t\t// Apply all styles in one pass\n\t\t_fnApplyToChildren( zeroOut, headerSrcEls );\n\t\n\t\t// Read all widths in next pass\n\t\t_fnApplyToChildren( function(nSizer) {\n\t\t\theaderContent.push( nSizer.innerHTML );\n\t\t\theaderWidths.push( _fnStringToCss( $(nSizer).css('width') ) );\n\t\t}, headerSrcEls );\n\t\n\t\t// Apply all widths in final pass\n\t\t_fnApplyToChildren( function(nToSize, i) {\n\t\t\t// Only apply widths to the DataTables detected header cells - this\n\t\t\t// prevents complex headers from having contradictory sizes applied\n\t\t\tif ( $.inArray( nToSize, dtHeaderCells ) !== -1 ) {\n\t\t\t\tnToSize.style.width = headerWidths[i];\n\t\t\t}\n\t\t}, headerTrgEls );\n\t\n\t\t$(headerSrcEls).height(0);\n\t\n\t\t/* Same again with the footer if we have one */\n\t\tif ( footer )\n\t\t{\n\t\t\t_fnApplyToChildren( zeroOut, footerSrcEls );\n\t\n\t\t\t_fnApplyToChildren( function(nSizer) {\n\t\t\t\tfooterContent.push( nSizer.innerHTML );\n\t\t\t\tfooterWidths.push( _fnStringToCss( $(nSizer).css('width') ) );\n\t\t\t}, footerSrcEls );\n\t\n\t\t\t_fnApplyToChildren( function(nToSize, i) {\n\t\t\t\tnToSize.style.width = footerWidths[i];\n\t\t\t}, footerTrgEls );\n\t\n\t\t\t$(footerSrcEls).height(0);\n\t\t}\n\t\n\t\n\t\t/*\n\t\t * 3. Apply the measurements\n\t\t */\n\t\n\t\t// \"Hide\" the header and footer that we used for the sizing. We need to keep\n\t\t// the content of the cell so that the width applied to the header and body\n\t\t// both match, but we want to hide it completely. We want to also fix their\n\t\t// width to what they currently are\n\t\t_fnApplyToChildren( function(nSizer, i) {\n\t\t\tnSizer.innerHTML = '<div class=\"dataTables_sizing\">'+headerContent[i]+'</div>';\n\t\t\tnSizer.childNodes[0].style.height = \"0\";\n\t\t\tnSizer.childNodes[0].style.overflow = \"hidden\";\n\t\t\tnSizer.style.width = headerWidths[i];\n\t\t}, headerSrcEls );\n\t\n\t\tif ( footer )\n\t\t{\n\t\t\t_fnApplyToChildren( function(nSizer, i) {\n\t\t\t\tnSizer.innerHTML = '<div class=\"dataTables_sizing\">'+footerContent[i]+'</div>';\n\t\t\t\tnSizer.childNodes[0].style.height = \"0\";\n\t\t\t\tnSizer.childNodes[0].style.overflow = \"hidden\";\n\t\t\t\tnSizer.style.width = footerWidths[i];\n\t\t\t}, footerSrcEls );\n\t\t}\n\t\n\t\t// Sanity check that the table is of a sensible width. If not then we are going to get\n\t\t// misalignment - try to prevent this by not allowing the table to shrink below its min width\n\t\tif ( table.outerWidth() < sanityWidth )\n\t\t{\n\t\t\t// The min width depends upon if we have a vertical scrollbar visible or not */\n\t\t\tcorrection = ((divBodyEl.scrollHeight > divBodyEl.offsetHeight ||\n\t\t\t\tdivBody.css('overflow-y') == \"scroll\")) ?\n\t\t\t\t\tsanityWidth+barWidth :\n\t\t\t\t\tsanityWidth;\n\t\n\t\t\t// IE6/7 are a law unto themselves...\n\t\t\tif ( ie67 && (divBodyEl.scrollHeight >\n\t\t\t\tdivBodyEl.offsetHeight || divBody.css('overflow-y') == \"scroll\")\n\t\t\t) {\n\t\t\t\ttableStyle.width = _fnStringToCss( correction-barWidth );\n\t\t\t}\n\t\n\t\t\t// And give the user a warning that we've stopped the table getting too small\n\t\t\tif ( scrollX === \"\" || scrollXInner !== \"\" ) {\n\t\t\t\t_fnLog( settings, 1, 'Possible column misalignment', 6 );\n\t\t\t}\n\t\t}\n\t\telse\n\t\t{\n\t\t\tcorrection = '100%';\n\t\t}\n\t\n\t\t// Apply to the container elements\n\t\tdivBodyStyle.width = _fnStringToCss( correction );\n\t\tdivHeaderStyle.width = _fnStringToCss( correction );\n\t\n\t\tif ( footer ) {\n\t\t\tsettings.nScrollFoot.style.width = _fnStringToCss( correction );\n\t\t}\n\t\n\t\n\t\t/*\n\t\t * 4. Clean up\n\t\t */\n\t\tif ( ! scrollY ) {\n\t\t\t/* IE7< puts a vertical scrollbar in place (when it shouldn't be) due to subtracting\n\t\t\t * the scrollbar height from the visible display, rather than adding it on. We need to\n\t\t\t * set the height in order to sort this. Don't want to do it in any other browsers.\n\t\t\t */\n\t\t\tif ( ie67 ) {\n\t\t\t\tdivBodyStyle.height = _fnStringToCss( tableEl.offsetHeight+barWidth );\n\t\t\t}\n\t\t}\n\t\n\t\t/* Finally set the width's of the header and footer tables */\n\t\tvar iOuterWidth = table.outerWidth();\n\t\tdivHeaderTable[0].style.width = _fnStringToCss( iOuterWidth );\n\t\tdivHeaderInnerStyle.width = _fnStringToCss( iOuterWidth );\n\t\n\t\t// Figure out if there are scrollbar present - if so then we need a the header and footer to\n\t\t// provide a bit more space to allow \"overflow\" scrolling (i.e. past the scrollbar)\n\t\tvar bScrolling = table.height() > divBodyEl.clientHeight || divBody.css('overflow-y') == \"scroll\";\n\t\tvar padding = 'padding' + (browser.bScrollbarLeft ? 'Left' : 'Right' );\n\t\tdivHeaderInnerStyle[ padding ] = bScrolling ? barWidth+\"px\" : \"0px\";\n\t\n\t\tif ( footer ) {\n\t\t\tdivFooterTable[0].style.width = _fnStringToCss( iOuterWidth );\n\t\t\tdivFooterInner[0].style.width = _fnStringToCss( iOuterWidth );\n\t\t\tdivFooterInner[0].style[padding] = bScrolling ? barWidth+\"px\" : \"0px\";\n\t\t}\n\t\n\t\t// Correct DOM ordering for colgroup - comes before the thead\n\t\ttable.children('colgroup').insertBefore( table.children('thead') );\n\t\n\t\t/* Adjust the position of the header in case we loose the y-scrollbar */\n\t\tdivBody.trigger('scroll');\n\t\n\t\t// If sorting or filtering has occurred, jump the scrolling back to the top\n\t\t// only if we aren't holding the position\n\t\tif ( (settings.bSorted || settings.bFiltered) && ! settings._drawHold ) {\n\t\t\tdivBodyEl.scrollTop = 0;\n\t\t}\n\t}\n\t\n\t\n\t\n\t/**\n\t * Apply a given function to the display child nodes of an element array (typically\n\t * TD children of TR rows\n\t *  @param {function} fn Method to apply to the objects\n\t *  @param array {nodes} an1 List of elements to look through for display children\n\t *  @param array {nodes} an2 Another list (identical structure to the first) - optional\n\t *  @memberof DataTable#oApi\n\t */\n\tfunction _fnApplyToChildren( fn, an1, an2 )\n\t{\n\t\tvar index=0, i=0, iLen=an1.length;\n\t\tvar nNode1, nNode2;\n\t\n\t\twhile ( i < iLen ) {\n\t\t\tnNode1 = an1[i].firstChild;\n\t\t\tnNode2 = an2 ? an2[i].firstChild : null;\n\t\n\t\t\twhile ( nNode1 ) {\n\t\t\t\tif ( nNode1.nodeType === 1 ) {\n\t\t\t\t\tif ( an2 ) {\n\t\t\t\t\t\tfn( nNode1, nNode2, index );\n\t\t\t\t\t}\n\t\t\t\t\telse {\n\t\t\t\t\t\tfn( nNode1, index );\n\t\t\t\t\t}\n\t\n\t\t\t\t\tindex++;\n\t\t\t\t}\n\t\n\t\t\t\tnNode1 = nNode1.nextSibling;\n\t\t\t\tnNode2 = an2 ? nNode2.nextSibling : null;\n\t\t\t}\n\t\n\t\t\ti++;\n\t\t}\n\t}\n\t\n\t\n\t\n\tvar __re_html_remove = /<.*?>/g;\n\t\n\t\n\t/**\n\t * Calculate the width of columns for the table\n\t *  @param {object} oSettings dataTables settings object\n\t *  @memberof DataTable#oApi\n\t */\n\tfunction _fnCalculateColumnWidths ( oSettings )\n\t{\n\t\tvar\n\t\t\ttable = oSettings.nTable,\n\t\t\tcolumns = oSettings.aoColumns,\n\t\t\tscroll = oSettings.oScroll,\n\t\t\tscrollY = scroll.sY,\n\t\t\tscrollX = scroll.sX,\n\t\t\tscrollXInner = scroll.sXInner,\n\t\t\tcolumnCount = columns.length,\n\t\t\tvisibleColumns = _fnGetColumns( oSettings, 'bVisible' ),\n\t\t\theaderCells = $('th', oSettings.nTHead),\n\t\t\ttableWidthAttr = table.getAttribute('width'), // from DOM element\n\t\t\ttableContainer = table.parentNode,\n\t\t\tuserInputs = false,\n\t\t\ti, column, columnIdx, width, outerWidth,\n\t\t\tbrowser = oSettings.oBrowser,\n\t\t\tie67 = browser.bScrollOversize;\n\t\n\t\tvar styleWidth = table.style.width;\n\t\tif ( styleWidth && styleWidth.indexOf('%') !== -1 ) {\n\t\t\ttableWidthAttr = styleWidth;\n\t\t}\n\t\n\t\t/* Convert any user input sizes into pixel sizes */\n\t\tfor ( i=0 ; i<visibleColumns.length ; i++ ) {\n\t\t\tcolumn = columns[ visibleColumns[i] ];\n\t\n\t\t\tif ( column.sWidth !== null ) {\n\t\t\t\tcolumn.sWidth = _fnConvertToWidth( column.sWidthOrig, tableContainer );\n\t\n\t\t\t\tuserInputs = true;\n\t\t\t}\n\t\t}\n\t\n\t\t/* If the number of columns in the DOM equals the number that we have to\n\t\t * process in DataTables, then we can use the offsets that are created by\n\t\t * the web- browser. No custom sizes can be set in order for this to happen,\n\t\t * nor scrolling used\n\t\t */\n\t\tif ( ie67 || ! userInputs && ! scrollX && ! scrollY &&\n\t\t     columnCount == _fnVisbleColumns( oSettings ) &&\n\t\t     columnCount == headerCells.length\n\t\t) {\n\t\t\tfor ( i=0 ; i<columnCount ; i++ ) {\n\t\t\t\tvar colIdx = _fnVisibleToColumnIndex( oSettings, i );\n\t\n\t\t\t\tif ( colIdx !== null ) {\n\t\t\t\t\tcolumns[ colIdx ].sWidth = _fnStringToCss( headerCells.eq(i).width() );\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\telse\n\t\t{\n\t\t\t// Otherwise construct a single row, worst case, table with the widest\n\t\t\t// node in the data, assign any user defined widths, then insert it into\n\t\t\t// the DOM and allow the browser to do all the hard work of calculating\n\t\t\t// table widths\n\t\t\tvar tmpTable = $(table).clone() // don't use cloneNode - IE8 will remove events on the main table\n\t\t\t\t.css( 'visibility', 'hidden' )\n\t\t\t\t.removeAttr( 'id' );\n\t\n\t\t\t// Clean up the table body\n\t\t\ttmpTable.find('tbody tr').remove();\n\t\t\tvar tr = $('<tr/>').appendTo( tmpTable.find('tbody') );\n\t\n\t\t\t// Clone the table header and footer - we can't use the header / footer\n\t\t\t// from the cloned table, since if scrolling is active, the table's\n\t\t\t// real header and footer are contained in different table tags\n\t\t\ttmpTable.find('thead, tfoot').remove();\n\t\t\ttmpTable\n\t\t\t\t.append( $(oSettings.nTHead).clone() )\n\t\t\t\t.append( $(oSettings.nTFoot).clone() );\n\t\n\t\t\t// Remove any assigned widths from the footer (from scrolling)\n\t\t\ttmpTable.find('tfoot th, tfoot td').css('width', '');\n\t\n\t\t\t// Apply custom sizing to the cloned header\n\t\t\theaderCells = _fnGetUniqueThs( oSettings, tmpTable.find('thead')[0] );\n\t\n\t\t\tfor ( i=0 ; i<visibleColumns.length ; i++ ) {\n\t\t\t\tcolumn = columns[ visibleColumns[i] ];\n\t\n\t\t\t\theaderCells[i].style.width = column.sWidthOrig !== null && column.sWidthOrig !== '' ?\n\t\t\t\t\t_fnStringToCss( column.sWidthOrig ) :\n\t\t\t\t\t'';\n\t\n\t\t\t\t// For scrollX we need to force the column width otherwise the\n\t\t\t\t// browser will collapse it. If this width is smaller than the\n\t\t\t\t// width the column requires, then it will have no effect\n\t\t\t\tif ( column.sWidthOrig && scrollX ) {\n\t\t\t\t\t$( headerCells[i] ).append( $('<div/>').css( {\n\t\t\t\t\t\twidth: column.sWidthOrig,\n\t\t\t\t\t\tmargin: 0,\n\t\t\t\t\t\tpadding: 0,\n\t\t\t\t\t\tborder: 0,\n\t\t\t\t\t\theight: 1\n\t\t\t\t\t} ) );\n\t\t\t\t}\n\t\t\t}\n\t\n\t\t\t// Find the widest cell for each column and put it into the table\n\t\t\tif ( oSettings.aoData.length ) {\n\t\t\t\tfor ( i=0 ; i<visibleColumns.length ; i++ ) {\n\t\t\t\t\tcolumnIdx = visibleColumns[i];\n\t\t\t\t\tcolumn = columns[ columnIdx ];\n\t\n\t\t\t\t\t$( _fnGetWidestNode( oSettings, columnIdx ) )\n\t\t\t\t\t\t.clone( false )\n\t\t\t\t\t\t.append( column.sContentPadding )\n\t\t\t\t\t\t.appendTo( tr );\n\t\t\t\t}\n\t\t\t}\n\t\n\t\t\t// Tidy the temporary table - remove name attributes so there aren't\n\t\t\t// duplicated in the dom (radio elements for example)\n\t\t\t$('[name]', tmpTable).removeAttr('name');\n\t\n\t\t\t// Table has been built, attach to the document so we can work with it.\n\t\t\t// A holding element is used, positioned at the top of the container\n\t\t\t// with minimal height, so it has no effect on if the container scrolls\n\t\t\t// or not. Otherwise it might trigger scrolling when it actually isn't\n\t\t\t// needed\n\t\t\tvar holder = $('<div/>').css( scrollX || scrollY ?\n\t\t\t\t\t{\n\t\t\t\t\t\tposition: 'absolute',\n\t\t\t\t\t\ttop: 0,\n\t\t\t\t\t\tleft: 0,\n\t\t\t\t\t\theight: 1,\n\t\t\t\t\t\tright: 0,\n\t\t\t\t\t\toverflow: 'hidden'\n\t\t\t\t\t} :\n\t\t\t\t\t{}\n\t\t\t\t)\n\t\t\t\t.append( tmpTable )\n\t\t\t\t.appendTo( tableContainer );\n\t\n\t\t\t// When scrolling (X or Y) we want to set the width of the table as \n\t\t\t// appropriate. However, when not scrolling leave the table width as it\n\t\t\t// is. This results in slightly different, but I think correct behaviour\n\t\t\tif ( scrollX && scrollXInner ) {\n\t\t\t\ttmpTable.width( scrollXInner );\n\t\t\t}\n\t\t\telse if ( scrollX ) {\n\t\t\t\ttmpTable.css( 'width', 'auto' );\n\t\t\t\ttmpTable.removeAttr('width');\n\t\n\t\t\t\t// If there is no width attribute or style, then allow the table to\n\t\t\t\t// collapse\n\t\t\t\tif ( tmpTable.width() < tableContainer.clientWidth && tableWidthAttr ) {\n\t\t\t\t\ttmpTable.width( tableContainer.clientWidth );\n\t\t\t\t}\n\t\t\t}\n\t\t\telse if ( scrollY ) {\n\t\t\t\ttmpTable.width( tableContainer.clientWidth );\n\t\t\t}\n\t\t\telse if ( tableWidthAttr ) {\n\t\t\t\ttmpTable.width( tableWidthAttr );\n\t\t\t}\n\t\n\t\t\t// Get the width of each column in the constructed table - we need to\n\t\t\t// know the inner width (so it can be assigned to the other table's\n\t\t\t// cells) and the outer width so we can calculate the full width of the\n\t\t\t// table. This is safe since DataTables requires a unique cell for each\n\t\t\t// column, but if ever a header can span multiple columns, this will\n\t\t\t// need to be modified.\n\t\t\tvar total = 0;\n\t\t\tfor ( i=0 ; i<visibleColumns.length ; i++ ) {\n\t\t\t\tvar cell = $(headerCells[i]);\n\t\t\t\tvar border = cell.outerWidth() - cell.width();\n\t\n\t\t\t\t// Use getBounding... where possible (not IE8-) because it can give\n\t\t\t\t// sub-pixel accuracy, which we then want to round up!\n\t\t\t\tvar bounding = browser.bBounding ?\n\t\t\t\t\tMath.ceil( headerCells[i].getBoundingClientRect().width ) :\n\t\t\t\t\tcell.outerWidth();\n\t\n\t\t\t\t// Total is tracked to remove any sub-pixel errors as the outerWidth\n\t\t\t\t// of the table might not equal the total given here (IE!).\n\t\t\t\ttotal += bounding;\n\t\n\t\t\t\t// Width for each column to use\n\t\t\t\tcolumns[ visibleColumns[i] ].sWidth = _fnStringToCss( bounding - border );\n\t\t\t}\n\t\n\t\t\ttable.style.width = _fnStringToCss( total );\n\t\n\t\t\t// Finished with the table - ditch it\n\t\t\tholder.remove();\n\t\t}\n\t\n\t\t// If there is a width attr, we want to attach an event listener which\n\t\t// allows the table sizing to automatically adjust when the window is\n\t\t// resized. Use the width attr rather than CSS, since we can't know if the\n\t\t// CSS is a relative value or absolute - DOM read is always px.\n\t\tif ( tableWidthAttr ) {\n\t\t\ttable.style.width = _fnStringToCss( tableWidthAttr );\n\t\t}\n\t\n\t\tif ( (tableWidthAttr || scrollX) && ! oSettings._reszEvt ) {\n\t\t\tvar bindResize = function () {\n\t\t\t\t$(window).on('resize.DT-'+oSettings.sInstance, _fnThrottle( function () {\n\t\t\t\t\t_fnAdjustColumnSizing( oSettings );\n\t\t\t\t} ) );\n\t\t\t};\n\t\n\t\t\t// IE6/7 will crash if we bind a resize event handler on page load.\n\t\t\t// To be removed in 1.11 which drops IE6/7 support\n\t\t\tif ( ie67 ) {\n\t\t\t\tsetTimeout( bindResize, 1000 );\n\t\t\t}\n\t\t\telse {\n\t\t\t\tbindResize();\n\t\t\t}\n\t\n\t\t\toSettings._reszEvt = true;\n\t\t}\n\t}\n\t\n\t\n\t/**\n\t * Throttle the calls to a function. Arguments and context are maintained for\n\t * the throttled function\n\t *  @param {function} fn Function to be called\n\t *  @param {int} [freq=200] call frequency in mS\n\t *  @returns {function} wrapped function\n\t *  @memberof DataTable#oApi\n\t */\n\tvar _fnThrottle = DataTable.util.throttle;\n\t\n\t\n\t/**\n\t * Convert a CSS unit width to pixels (e.g. 2em)\n\t *  @param {string} width width to be converted\n\t *  @param {node} parent parent to get the with for (required for relative widths) - optional\n\t *  @returns {int} width in pixels\n\t *  @memberof DataTable#oApi\n\t */\n\tfunction _fnConvertToWidth ( width, parent )\n\t{\n\t\tif ( ! width ) {\n\t\t\treturn 0;\n\t\t}\n\t\n\t\tvar n = $('<div/>')\n\t\t\t.css( 'width', _fnStringToCss( width ) )\n\t\t\t.appendTo( parent || document.body );\n\t\n\t\tvar val = n[0].offsetWidth;\n\t\tn.remove();\n\t\n\t\treturn val;\n\t}\n\t\n\t\n\t/**\n\t * Get the widest node\n\t *  @param {object} settings dataTables settings object\n\t *  @param {int} colIdx column of interest\n\t *  @returns {node} widest table node\n\t *  @memberof DataTable#oApi\n\t */\n\tfunction _fnGetWidestNode( settings, colIdx )\n\t{\n\t\tvar idx = _fnGetMaxLenString( settings, colIdx );\n\t\tif ( idx < 0 ) {\n\t\t\treturn null;\n\t\t}\n\t\n\t\tvar data = settings.aoData[ idx ];\n\t\treturn ! data.nTr ? // Might not have been created when deferred rendering\n\t\t\t$('<td/>').html( _fnGetCellData( settings, idx, colIdx, 'display' ) )[0] :\n\t\t\tdata.anCells[ colIdx ];\n\t}\n\t\n\t\n\t/**\n\t * Get the maximum strlen for each data column\n\t *  @param {object} settings dataTables settings object\n\t *  @param {int} colIdx column of interest\n\t *  @returns {string} max string length for each column\n\t *  @memberof DataTable#oApi\n\t */\n\tfunction _fnGetMaxLenString( settings, colIdx )\n\t{\n\t\tvar s, max=-1, maxIdx = -1;\n\t\n\t\tfor ( var i=0, ien=settings.aoData.length ; i<ien ; i++ ) {\n\t\t\ts = _fnGetCellData( settings, i, colIdx, 'display' )+'';\n\t\t\ts = s.replace( __re_html_remove, '' );\n\t\t\ts = s.replace( /&nbsp;/g, ' ' );\n\t\n\t\t\tif ( s.length > max ) {\n\t\t\t\tmax = s.length;\n\t\t\t\tmaxIdx = i;\n\t\t\t}\n\t\t}\n\t\n\t\treturn maxIdx;\n\t}\n\t\n\t\n\t/**\n\t * Append a CSS unit (only if required) to a string\n\t *  @param {string} value to css-ify\n\t *  @returns {string} value with css unit\n\t *  @memberof DataTable#oApi\n\t */\n\tfunction _fnStringToCss( s )\n\t{\n\t\tif ( s === null ) {\n\t\t\treturn '0px';\n\t\t}\n\t\n\t\tif ( typeof s == 'number' ) {\n\t\t\treturn s < 0 ?\n\t\t\t\t'0px' :\n\t\t\t\ts+'px';\n\t\t}\n\t\n\t\t// Check it has a unit character already\n\t\treturn s.match(/\\d$/) ?\n\t\t\ts+'px' :\n\t\t\ts;\n\t}\n\t\n\t\n\t\n\tfunction _fnSortFlatten ( settings )\n\t{\n\t\tvar\n\t\t\ti, iLen, k, kLen,\n\t\t\taSort = [],\n\t\t\taiOrig = [],\n\t\t\taoColumns = settings.aoColumns,\n\t\t\taDataSort, iCol, sType, srcCol,\n\t\t\tfixed = settings.aaSortingFixed,\n\t\t\tfixedObj = $.isPlainObject( fixed ),\n\t\t\tnestedSort = [],\n\t\t\tadd = function ( a ) {\n\t\t\t\tif ( a.length && ! $.isArray( a[0] ) ) {\n\t\t\t\t\t// 1D array\n\t\t\t\t\tnestedSort.push( a );\n\t\t\t\t}\n\t\t\t\telse {\n\t\t\t\t\t// 2D array\n\t\t\t\t\t$.merge( nestedSort, a );\n\t\t\t\t}\n\t\t\t};\n\t\n\t\t// Build the sort array, with pre-fix and post-fix options if they have been\n\t\t// specified\n\t\tif ( $.isArray( fixed ) ) {\n\t\t\tadd( fixed );\n\t\t}\n\t\n\t\tif ( fixedObj && fixed.pre ) {\n\t\t\tadd( fixed.pre );\n\t\t}\n\t\n\t\tadd( settings.aaSorting );\n\t\n\t\tif (fixedObj && fixed.post ) {\n\t\t\tadd( fixed.post );\n\t\t}\n\t\n\t\tfor ( i=0 ; i<nestedSort.length ; i++ )\n\t\t{\n\t\t\tsrcCol = nestedSort[i][0];\n\t\t\taDataSort = aoColumns[ srcCol ].aDataSort;\n\t\n\t\t\tfor ( k=0, kLen=aDataSort.length ; k<kLen ; k++ )\n\t\t\t{\n\t\t\t\tiCol = aDataSort[k];\n\t\t\t\tsType = aoColumns[ iCol ].sType || 'string';\n\t\n\t\t\t\tif ( nestedSort[i]._idx === undefined ) {\n\t\t\t\t\tnestedSort[i]._idx = $.inArray( nestedSort[i][1], aoColumns[iCol].asSorting );\n\t\t\t\t}\n\t\n\t\t\t\taSort.push( {\n\t\t\t\t\tsrc:       srcCol,\n\t\t\t\t\tcol:       iCol,\n\t\t\t\t\tdir:       nestedSort[i][1],\n\t\t\t\t\tindex:     nestedSort[i]._idx,\n\t\t\t\t\ttype:      sType,\n\t\t\t\t\tformatter: DataTable.ext.type.order[ sType+\"-pre\" ]\n\t\t\t\t} );\n\t\t\t}\n\t\t}\n\t\n\t\treturn aSort;\n\t}\n\t\n\t/**\n\t * Change the order of the table\n\t *  @param {object} oSettings dataTables settings object\n\t *  @memberof DataTable#oApi\n\t *  @todo This really needs split up!\n\t */\n\tfunction _fnSort ( oSettings )\n\t{\n\t\tvar\n\t\t\ti, ien, iLen, j, jLen, k, kLen,\n\t\t\tsDataType, nTh,\n\t\t\taiOrig = [],\n\t\t\toExtSort = DataTable.ext.type.order,\n\t\t\taoData = oSettings.aoData,\n\t\t\taoColumns = oSettings.aoColumns,\n\t\t\taDataSort, data, iCol, sType, oSort,\n\t\t\tformatters = 0,\n\t\t\tsortCol,\n\t\t\tdisplayMaster = oSettings.aiDisplayMaster,\n\t\t\taSort;\n\t\n\t\t// Resolve any column types that are unknown due to addition or invalidation\n\t\t// @todo Can this be moved into a 'data-ready' handler which is called when\n\t\t//   data is going to be used in the table?\n\t\t_fnColumnTypes( oSettings );\n\t\n\t\taSort = _fnSortFlatten( oSettings );\n\t\n\t\tfor ( i=0, ien=aSort.length ; i<ien ; i++ ) {\n\t\t\tsortCol = aSort[i];\n\t\n\t\t\t// Track if we can use the fast sort algorithm\n\t\t\tif ( sortCol.formatter ) {\n\t\t\t\tformatters++;\n\t\t\t}\n\t\n\t\t\t// Load the data needed for the sort, for each cell\n\t\t\t_fnSortData( oSettings, sortCol.col );\n\t\t}\n\t\n\t\t/* No sorting required if server-side or no sorting array */\n\t\tif ( _fnDataSource( oSettings ) != 'ssp' && aSort.length !== 0 )\n\t\t{\n\t\t\t// Create a value - key array of the current row positions such that we can use their\n\t\t\t// current position during the sort, if values match, in order to perform stable sorting\n\t\t\tfor ( i=0, iLen=displayMaster.length ; i<iLen ; i++ ) {\n\t\t\t\taiOrig[ displayMaster[i] ] = i;\n\t\t\t}\n\t\n\t\t\t/* Do the sort - here we want multi-column sorting based on a given data source (column)\n\t\t\t * and sorting function (from oSort) in a certain direction. It's reasonably complex to\n\t\t\t * follow on it's own, but this is what we want (example two column sorting):\n\t\t\t *  fnLocalSorting = function(a,b){\n\t\t\t *    var iTest;\n\t\t\t *    iTest = oSort['string-asc']('data11', 'data12');\n\t\t\t *      if (iTest !== 0)\n\t\t\t *        return iTest;\n\t\t\t *    iTest = oSort['numeric-desc']('data21', 'data22');\n\t\t\t *    if (iTest !== 0)\n\t\t\t *      return iTest;\n\t\t\t *    return oSort['numeric-asc']( aiOrig[a], aiOrig[b] );\n\t\t\t *  }\n\t\t\t * Basically we have a test for each sorting column, if the data in that column is equal,\n\t\t\t * test the next column. If all columns match, then we use a numeric sort on the row\n\t\t\t * positions in the original data array to provide a stable sort.\n\t\t\t *\n\t\t\t * Note - I know it seems excessive to have two sorting methods, but the first is around\n\t\t\t * 15% faster, so the second is only maintained for backwards compatibility with sorting\n\t\t\t * methods which do not have a pre-sort formatting function.\n\t\t\t */\n\t\t\tif ( formatters === aSort.length ) {\n\t\t\t\t// All sort types have formatting functions\n\t\t\t\tdisplayMaster.sort( function ( a, b ) {\n\t\t\t\t\tvar\n\t\t\t\t\t\tx, y, k, test, sort,\n\t\t\t\t\t\tlen=aSort.length,\n\t\t\t\t\t\tdataA = aoData[a]._aSortData,\n\t\t\t\t\t\tdataB = aoData[b]._aSortData;\n\t\n\t\t\t\t\tfor ( k=0 ; k<len ; k++ ) {\n\t\t\t\t\t\tsort = aSort[k];\n\t\n\t\t\t\t\t\tx = dataA[ sort.col ];\n\t\t\t\t\t\ty = dataB[ sort.col ];\n\t\n\t\t\t\t\t\ttest = x<y ? -1 : x>y ? 1 : 0;\n\t\t\t\t\t\tif ( test !== 0 ) {\n\t\t\t\t\t\t\treturn sort.dir === 'asc' ? test : -test;\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\n\t\t\t\t\tx = aiOrig[a];\n\t\t\t\t\ty = aiOrig[b];\n\t\t\t\t\treturn x<y ? -1 : x>y ? 1 : 0;\n\t\t\t\t} );\n\t\t\t}\n\t\t\telse {\n\t\t\t\t// Depreciated - remove in 1.11 (providing a plug-in option)\n\t\t\t\t// Not all sort types have formatting methods, so we have to call their sorting\n\t\t\t\t// methods.\n\t\t\t\tdisplayMaster.sort( function ( a, b ) {\n\t\t\t\t\tvar\n\t\t\t\t\t\tx, y, k, l, test, sort, fn,\n\t\t\t\t\t\tlen=aSort.length,\n\t\t\t\t\t\tdataA = aoData[a]._aSortData,\n\t\t\t\t\t\tdataB = aoData[b]._aSortData;\n\t\n\t\t\t\t\tfor ( k=0 ; k<len ; k++ ) {\n\t\t\t\t\t\tsort = aSort[k];\n\t\n\t\t\t\t\t\tx = dataA[ sort.col ];\n\t\t\t\t\t\ty = dataB[ sort.col ];\n\t\n\t\t\t\t\t\tfn = oExtSort[ sort.type+\"-\"+sort.dir ] || oExtSort[ \"string-\"+sort.dir ];\n\t\t\t\t\t\ttest = fn( x, y );\n\t\t\t\t\t\tif ( test !== 0 ) {\n\t\t\t\t\t\t\treturn test;\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\n\t\t\t\t\tx = aiOrig[a];\n\t\t\t\t\ty = aiOrig[b];\n\t\t\t\t\treturn x<y ? -1 : x>y ? 1 : 0;\n\t\t\t\t} );\n\t\t\t}\n\t\t}\n\t\n\t\t/* Tell the draw function that we have sorted the data */\n\t\toSettings.bSorted = true;\n\t}\n\t\n\t\n\tfunction _fnSortAria ( settings )\n\t{\n\t\tvar label;\n\t\tvar nextSort;\n\t\tvar columns = settings.aoColumns;\n\t\tvar aSort = _fnSortFlatten( settings );\n\t\tvar oAria = settings.oLanguage.oAria;\n\t\n\t\t// ARIA attributes - need to loop all columns, to update all (removing old\n\t\t// attributes as needed)\n\t\tfor ( var i=0, iLen=columns.length ; i<iLen ; i++ )\n\t\t{\n\t\t\tvar col = columns[i];\n\t\t\tvar asSorting = col.asSorting;\n\t\t\tvar sTitle = col.sTitle.replace( /<.*?>/g, \"\" );\n\t\t\tvar th = col.nTh;\n\t\n\t\t\t// IE7 is throwing an error when setting these properties with jQuery's\n\t\t\t// attr() and removeAttr() methods...\n\t\t\tth.removeAttribute('aria-sort');\n\t\n\t\t\t/* In ARIA only the first sorting column can be marked as sorting - no multi-sort option */\n\t\t\tif ( col.bSortable ) {\n\t\t\t\tif ( aSort.length > 0 && aSort[0].col == i ) {\n\t\t\t\t\tth.setAttribute('aria-sort', aSort[0].dir==\"asc\" ? \"ascending\" : \"descending\" );\n\t\t\t\t\tnextSort = asSorting[ aSort[0].index+1 ] || asSorting[0];\n\t\t\t\t}\n\t\t\t\telse {\n\t\t\t\t\tnextSort = asSorting[0];\n\t\t\t\t}\n\t\n\t\t\t\tlabel = sTitle + ( nextSort === \"asc\" ?\n\t\t\t\t\toAria.sSortAscending :\n\t\t\t\t\toAria.sSortDescending\n\t\t\t\t);\n\t\t\t}\n\t\t\telse {\n\t\t\t\tlabel = sTitle;\n\t\t\t}\n\t\n\t\t\tth.setAttribute('aria-label', label);\n\t\t}\n\t}\n\t\n\t\n\t/**\n\t * Function to run on user sort request\n\t *  @param {object} settings dataTables settings object\n\t *  @param {node} attachTo node to attach the handler to\n\t *  @param {int} colIdx column sorting index\n\t *  @param {boolean} [append=false] Append the requested sort to the existing\n\t *    sort if true (i.e. multi-column sort)\n\t *  @param {function} [callback] callback function\n\t *  @memberof DataTable#oApi\n\t */\n\tfunction _fnSortListener ( settings, colIdx, append, callback )\n\t{\n\t\tvar col = settings.aoColumns[ colIdx ];\n\t\tvar sorting = settings.aaSorting;\n\t\tvar asSorting = col.asSorting;\n\t\tvar nextSortIdx;\n\t\tvar next = function ( a, overflow ) {\n\t\t\tvar idx = a._idx;\n\t\t\tif ( idx === undefined ) {\n\t\t\t\tidx = $.inArray( a[1], asSorting );\n\t\t\t}\n\t\n\t\t\treturn idx+1 < asSorting.length ?\n\t\t\t\tidx+1 :\n\t\t\t\toverflow ?\n\t\t\t\t\tnull :\n\t\t\t\t\t0;\n\t\t};\n\t\n\t\t// Convert to 2D array if needed\n\t\tif ( typeof sorting[0] === 'number' ) {\n\t\t\tsorting = settings.aaSorting = [ sorting ];\n\t\t}\n\t\n\t\t// If appending the sort then we are multi-column sorting\n\t\tif ( append && settings.oFeatures.bSortMulti ) {\n\t\t\t// Are we already doing some kind of sort on this column?\n\t\t\tvar sortIdx = $.inArray( colIdx, _pluck(sorting, '0') );\n\t\n\t\t\tif ( sortIdx !== -1 ) {\n\t\t\t\t// Yes, modify the sort\n\t\t\t\tnextSortIdx = next( sorting[sortIdx], true );\n\t\n\t\t\t\tif ( nextSortIdx === null && sorting.length === 1 ) {\n\t\t\t\t\tnextSortIdx = 0; // can't remove sorting completely\n\t\t\t\t}\n\t\n\t\t\t\tif ( nextSortIdx === null ) {\n\t\t\t\t\tsorting.splice( sortIdx, 1 );\n\t\t\t\t}\n\t\t\t\telse {\n\t\t\t\t\tsorting[sortIdx][1] = asSorting[ nextSortIdx ];\n\t\t\t\t\tsorting[sortIdx]._idx = nextSortIdx;\n\t\t\t\t}\n\t\t\t}\n\t\t\telse {\n\t\t\t\t// No sort on this column yet\n\t\t\t\tsorting.push( [ colIdx, asSorting[0], 0 ] );\n\t\t\t\tsorting[sorting.length-1]._idx = 0;\n\t\t\t}\n\t\t}\n\t\telse if ( sorting.length && sorting[0][0] == colIdx ) {\n\t\t\t// Single column - already sorting on this column, modify the sort\n\t\t\tnextSortIdx = next( sorting[0] );\n\t\n\t\t\tsorting.length = 1;\n\t\t\tsorting[0][1] = asSorting[ nextSortIdx ];\n\t\t\tsorting[0]._idx = nextSortIdx;\n\t\t}\n\t\telse {\n\t\t\t// Single column - sort only on this column\n\t\t\tsorting.length = 0;\n\t\t\tsorting.push( [ colIdx, asSorting[0] ] );\n\t\t\tsorting[0]._idx = 0;\n\t\t}\n\t\n\t\t// Run the sort by calling a full redraw\n\t\t_fnReDraw( settings );\n\t\n\t\t// callback used for async user interaction\n\t\tif ( typeof callback == 'function' ) {\n\t\t\tcallback( settings );\n\t\t}\n\t}\n\t\n\t\n\t/**\n\t * Attach a sort handler (click) to a node\n\t *  @param {object} settings dataTables settings object\n\t *  @param {node} attachTo node to attach the handler to\n\t *  @param {int} colIdx column sorting index\n\t *  @param {function} [callback] callback function\n\t *  @memberof DataTable#oApi\n\t */\n\tfunction _fnSortAttachListener ( settings, attachTo, colIdx, callback )\n\t{\n\t\tvar col = settings.aoColumns[ colIdx ];\n\t\n\t\t_fnBindAction( attachTo, {}, function (e) {\n\t\t\t/* If the column is not sortable - don't to anything */\n\t\t\tif ( col.bSortable === false ) {\n\t\t\t\treturn;\n\t\t\t}\n\t\n\t\t\t// If processing is enabled use a timeout to allow the processing\n\t\t\t// display to be shown - otherwise to it synchronously\n\t\t\tif ( settings.oFeatures.bProcessing ) {\n\t\t\t\t_fnProcessingDisplay( settings, true );\n\t\n\t\t\t\tsetTimeout( function() {\n\t\t\t\t\t_fnSortListener( settings, colIdx, e.shiftKey, callback );\n\t\n\t\t\t\t\t// In server-side processing, the draw callback will remove the\n\t\t\t\t\t// processing display\n\t\t\t\t\tif ( _fnDataSource( settings ) !== 'ssp' ) {\n\t\t\t\t\t\t_fnProcessingDisplay( settings, false );\n\t\t\t\t\t}\n\t\t\t\t}, 0 );\n\t\t\t}\n\t\t\telse {\n\t\t\t\t_fnSortListener( settings, colIdx, e.shiftKey, callback );\n\t\t\t}\n\t\t} );\n\t}\n\t\n\t\n\t/**\n\t * Set the sorting classes on table's body, Note: it is safe to call this function\n\t * when bSort and bSortClasses are false\n\t *  @param {object} oSettings dataTables settings object\n\t *  @memberof DataTable#oApi\n\t */\n\tfunction _fnSortingClasses( settings )\n\t{\n\t\tvar oldSort = settings.aLastSort;\n\t\tvar sortClass = settings.oClasses.sSortColumn;\n\t\tvar sort = _fnSortFlatten( settings );\n\t\tvar features = settings.oFeatures;\n\t\tvar i, ien, colIdx;\n\t\n\t\tif ( features.bSort && features.bSortClasses ) {\n\t\t\t// Remove old sorting classes\n\t\t\tfor ( i=0, ien=oldSort.length ; i<ien ; i++ ) {\n\t\t\t\tcolIdx = oldSort[i].src;\n\t\n\t\t\t\t// Remove column sorting\n\t\t\t\t$( _pluck( settings.aoData, 'anCells', colIdx ) )\n\t\t\t\t\t.removeClass( sortClass + (i<2 ? i+1 : 3) );\n\t\t\t}\n\t\n\t\t\t// Add new column sorting\n\t\t\tfor ( i=0, ien=sort.length ; i<ien ; i++ ) {\n\t\t\t\tcolIdx = sort[i].src;\n\t\n\t\t\t\t$( _pluck( settings.aoData, 'anCells', colIdx ) )\n\t\t\t\t\t.addClass( sortClass + (i<2 ? i+1 : 3) );\n\t\t\t}\n\t\t}\n\t\n\t\tsettings.aLastSort = sort;\n\t}\n\t\n\t\n\t// Get the data to sort a column, be it from cache, fresh (populating the\n\t// cache), or from a sort formatter\n\tfunction _fnSortData( settings, idx )\n\t{\n\t\t// Custom sorting function - provided by the sort data type\n\t\tvar column = settings.aoColumns[ idx ];\n\t\tvar customSort = DataTable.ext.order[ column.sSortDataType ];\n\t\tvar customData;\n\t\n\t\tif ( customSort ) {\n\t\t\tcustomData = customSort.call( settings.oInstance, settings, idx,\n\t\t\t\t_fnColumnIndexToVisible( settings, idx )\n\t\t\t);\n\t\t}\n\t\n\t\t// Use / populate cache\n\t\tvar row, cellData;\n\t\tvar formatter = DataTable.ext.type.order[ column.sType+\"-pre\" ];\n\t\n\t\tfor ( var i=0, ien=settings.aoData.length ; i<ien ; i++ ) {\n\t\t\trow = settings.aoData[i];\n\t\n\t\t\tif ( ! row._aSortData ) {\n\t\t\t\trow._aSortData = [];\n\t\t\t}\n\t\n\t\t\tif ( ! row._aSortData[idx] || customSort ) {\n\t\t\t\tcellData = customSort ?\n\t\t\t\t\tcustomData[i] : // If there was a custom sort function, use data from there\n\t\t\t\t\t_fnGetCellData( settings, i, idx, 'sort' );\n\t\n\t\t\t\trow._aSortData[ idx ] = formatter ?\n\t\t\t\t\tformatter( cellData ) :\n\t\t\t\t\tcellData;\n\t\t\t}\n\t\t}\n\t}\n\t\n\t\n\t\n\t/**\n\t * Save the state of a table\n\t *  @param {object} oSettings dataTables settings object\n\t *  @memberof DataTable#oApi\n\t */\n\tfunction _fnSaveState ( settings )\n\t{\n\t\tif ( !settings.oFeatures.bStateSave || settings.bDestroying )\n\t\t{\n\t\t\treturn;\n\t\t}\n\t\n\t\t/* Store the interesting variables */\n\t\tvar state = {\n\t\t\ttime:    +new Date(),\n\t\t\tstart:   settings._iDisplayStart,\n\t\t\tlength:  settings._iDisplayLength,\n\t\t\torder:   $.extend( true, [], settings.aaSorting ),\n\t\t\tsearch:  _fnSearchToCamel( settings.oPreviousSearch ),\n\t\t\tcolumns: $.map( settings.aoColumns, function ( col, i ) {\n\t\t\t\treturn {\n\t\t\t\t\tvisible: col.bVisible,\n\t\t\t\t\tsearch: _fnSearchToCamel( settings.aoPreSearchCols[i] )\n\t\t\t\t};\n\t\t\t} )\n\t\t};\n\t\n\t\t_fnCallbackFire( settings, \"aoStateSaveParams\", 'stateSaveParams', [settings, state] );\n\t\n\t\tsettings.oSavedState = state;\n\t\tsettings.fnStateSaveCallback.call( settings.oInstance, settings, state );\n\t}\n\t\n\t\n\t/**\n\t * Attempt to load a saved table state\n\t *  @param {object} oSettings dataTables settings object\n\t *  @param {object} oInit DataTables init object so we can override settings\n\t *  @param {function} callback Callback to execute when the state has been loaded\n\t *  @memberof DataTable#oApi\n\t */\n\tfunction _fnLoadState ( settings, oInit, callback )\n\t{\n\t\tvar i, ien;\n\t\tvar columns = settings.aoColumns;\n\t\tvar loaded = function ( s ) {\n\t\t\tif ( ! s || ! s.time ) {\n\t\t\t\tcallback();\n\t\t\t\treturn;\n\t\t\t}\n\t\n\t\t\t// Allow custom and plug-in manipulation functions to alter the saved data set and\n\t\t\t// cancelling of loading by returning false\n\t\t\tvar abStateLoad = _fnCallbackFire( settings, 'aoStateLoadParams', 'stateLoadParams', [settings, s] );\n\t\t\tif ( $.inArray( false, abStateLoad ) !== -1 ) {\n\t\t\t\tcallback();\n\t\t\t\treturn;\n\t\t\t}\n\t\n\t\t\t// Reject old data\n\t\t\tvar duration = settings.iStateDuration;\n\t\t\tif ( duration > 0 && s.time < +new Date() - (duration*1000) ) {\n\t\t\t\tcallback();\n\t\t\t\treturn;\n\t\t\t}\n\t\n\t\t\t// Number of columns have changed - all bets are off, no restore of settings\n\t\t\tif ( s.columns && columns.length !== s.columns.length ) {\n\t\t\t\tcallback();\n\t\t\t\treturn;\n\t\t\t}\n\t\n\t\t\t// Store the saved state so it might be accessed at any time\n\t\t\tsettings.oLoadedState = $.extend( true, {}, s );\n\t\n\t\t\t// Restore key features - todo - for 1.11 this needs to be done by\n\t\t\t// subscribed events\n\t\t\tif ( s.start !== undefined ) {\n\t\t\t\tsettings._iDisplayStart    = s.start;\n\t\t\t\tsettings.iInitDisplayStart = s.start;\n\t\t\t}\n\t\t\tif ( s.length !== undefined ) {\n\t\t\t\tsettings._iDisplayLength   = s.length;\n\t\t\t}\n\t\n\t\t\t// Order\n\t\t\tif ( s.order !== undefined ) {\n\t\t\t\tsettings.aaSorting = [];\n\t\t\t\t$.each( s.order, function ( i, col ) {\n\t\t\t\t\tsettings.aaSorting.push( col[0] >= columns.length ?\n\t\t\t\t\t\t[ 0, col[1] ] :\n\t\t\t\t\t\tcol\n\t\t\t\t\t);\n\t\t\t\t} );\n\t\t\t}\n\t\n\t\t\t// Search\n\t\t\tif ( s.search !== undefined ) {\n\t\t\t\t$.extend( settings.oPreviousSearch, _fnSearchToHung( s.search ) );\n\t\t\t}\n\t\n\t\t\t// Columns\n\t\t\t//\n\t\t\tif ( s.columns ) {\n\t\t\t\tfor ( i=0, ien=s.columns.length ; i<ien ; i++ ) {\n\t\t\t\t\tvar col = s.columns[i];\n\t\n\t\t\t\t\t// Visibility\n\t\t\t\t\tif ( col.visible !== undefined ) {\n\t\t\t\t\t\tcolumns[i].bVisible = col.visible;\n\t\t\t\t\t}\n\t\n\t\t\t\t\t// Search\n\t\t\t\t\tif ( col.search !== undefined ) {\n\t\t\t\t\t\t$.extend( settings.aoPreSearchCols[i], _fnSearchToHung( col.search ) );\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\n\t\t\t_fnCallbackFire( settings, 'aoStateLoaded', 'stateLoaded', [settings, s] );\n\t\t\tcallback();\n\t\t};\n\t\n\t\tif ( ! settings.oFeatures.bStateSave ) {\n\t\t\tcallback();\n\t\t\treturn;\n\t\t}\n\t\n\t\tvar state = settings.fnStateLoadCallback.call( settings.oInstance, settings, loaded );\n\t\n\t\tif ( state !== undefined ) {\n\t\t\tloaded( state );\n\t\t}\n\t\t// otherwise, wait for the loaded callback to be executed\n\t}\n\t\n\t\n\t/**\n\t * Return the settings object for a particular table\n\t *  @param {node} table table we are using as a dataTable\n\t *  @returns {object} Settings object - or null if not found\n\t *  @memberof DataTable#oApi\n\t */\n\tfunction _fnSettingsFromNode ( table )\n\t{\n\t\tvar settings = DataTable.settings;\n\t\tvar idx = $.inArray( table, _pluck( settings, 'nTable' ) );\n\t\n\t\treturn idx !== -1 ?\n\t\t\tsettings[ idx ] :\n\t\t\tnull;\n\t}\n\t\n\t\n\t/**\n\t * Log an error message\n\t *  @param {object} settings dataTables settings object\n\t *  @param {int} level log error messages, or display them to the user\n\t *  @param {string} msg error message\n\t *  @param {int} tn Technical note id to get more information about the error.\n\t *  @memberof DataTable#oApi\n\t */\n\tfunction _fnLog( settings, level, msg, tn )\n\t{\n\t\tmsg = 'DataTables warning: '+\n\t\t\t(settings ? 'table id='+settings.sTableId+' - ' : '')+msg;\n\t\n\t\tif ( tn ) {\n\t\t\tmsg += '. For more information about this error, please see '+\n\t\t\t'http://datatables.net/tn/'+tn;\n\t\t}\n\t\n\t\tif ( ! level  ) {\n\t\t\t// Backwards compatibility pre 1.10\n\t\t\tvar ext = DataTable.ext;\n\t\t\tvar type = ext.sErrMode || ext.errMode;\n\t\n\t\t\tif ( settings ) {\n\t\t\t\t_fnCallbackFire( settings, null, 'error', [ settings, tn, msg ] );\n\t\t\t}\n\t\n\t\t\tif ( type == 'alert' ) {\n\t\t\t\talert( msg );\n\t\t\t}\n\t\t\telse if ( type == 'throw' ) {\n\t\t\t\tthrow new Error(msg);\n\t\t\t}\n\t\t\telse if ( typeof type == 'function' ) {\n\t\t\t\ttype( settings, tn, msg );\n\t\t\t}\n\t\t}\n\t\telse if ( window.console && console.log ) {\n\t\t\tconsole.log( msg );\n\t\t}\n\t}\n\t\n\t\n\t/**\n\t * See if a property is defined on one object, if so assign it to the other object\n\t *  @param {object} ret target object\n\t *  @param {object} src source object\n\t *  @param {string} name property\n\t *  @param {string} [mappedName] name to map too - optional, name used if not given\n\t *  @memberof DataTable#oApi\n\t */\n\tfunction _fnMap( ret, src, name, mappedName )\n\t{\n\t\tif ( $.isArray( name ) ) {\n\t\t\t$.each( name, function (i, val) {\n\t\t\t\tif ( $.isArray( val ) ) {\n\t\t\t\t\t_fnMap( ret, src, val[0], val[1] );\n\t\t\t\t}\n\t\t\t\telse {\n\t\t\t\t\t_fnMap( ret, src, val );\n\t\t\t\t}\n\t\t\t} );\n\t\n\t\t\treturn;\n\t\t}\n\t\n\t\tif ( mappedName === undefined ) {\n\t\t\tmappedName = name;\n\t\t}\n\t\n\t\tif ( src[name] !== undefined ) {\n\t\t\tret[mappedName] = src[name];\n\t\t}\n\t}\n\t\n\t\n\t/**\n\t * Extend objects - very similar to jQuery.extend, but deep copy objects, and\n\t * shallow copy arrays. The reason we need to do this, is that we don't want to\n\t * deep copy array init values (such as aaSorting) since the dev wouldn't be\n\t * able to override them, but we do want to deep copy arrays.\n\t *  @param {object} out Object to extend\n\t *  @param {object} extender Object from which the properties will be applied to\n\t *      out\n\t *  @param {boolean} breakRefs If true, then arrays will be sliced to take an\n\t *      independent copy with the exception of the `data` or `aaData` parameters\n\t *      if they are present. This is so you can pass in a collection to\n\t *      DataTables and have that used as your data source without breaking the\n\t *      references\n\t *  @returns {object} out Reference, just for convenience - out === the return.\n\t *  @memberof DataTable#oApi\n\t *  @todo This doesn't take account of arrays inside the deep copied objects.\n\t */\n\tfunction _fnExtend( out, extender, breakRefs )\n\t{\n\t\tvar val;\n\t\n\t\tfor ( var prop in extender ) {\n\t\t\tif ( extender.hasOwnProperty(prop) ) {\n\t\t\t\tval = extender[prop];\n\t\n\t\t\t\tif ( $.isPlainObject( val ) ) {\n\t\t\t\t\tif ( ! $.isPlainObject( out[prop] ) ) {\n\t\t\t\t\t\tout[prop] = {};\n\t\t\t\t\t}\n\t\t\t\t\t$.extend( true, out[prop], val );\n\t\t\t\t}\n\t\t\t\telse if ( breakRefs && prop !== 'data' && prop !== 'aaData' && $.isArray(val) ) {\n\t\t\t\t\tout[prop] = val.slice();\n\t\t\t\t}\n\t\t\t\telse {\n\t\t\t\t\tout[prop] = val;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\n\t\treturn out;\n\t}\n\t\n\t\n\t/**\n\t * Bind an event handers to allow a click or return key to activate the callback.\n\t * This is good for accessibility since a return on the keyboard will have the\n\t * same effect as a click, if the element has focus.\n\t *  @param {element} n Element to bind the action to\n\t *  @param {object} oData Data object to pass to the triggered function\n\t *  @param {function} fn Callback function for when the event is triggered\n\t *  @memberof DataTable#oApi\n\t */\n\tfunction _fnBindAction( n, oData, fn )\n\t{\n\t\t$(n)\n\t\t\t.on( 'click.DT', oData, function (e) {\n\t\t\t\t\t$(n).trigger('blur'); // Remove focus outline for mouse users\n\t\t\t\t\tfn(e);\n\t\t\t\t} )\n\t\t\t.on( 'keypress.DT', oData, function (e){\n\t\t\t\t\tif ( e.which === 13 ) {\n\t\t\t\t\t\te.preventDefault();\n\t\t\t\t\t\tfn(e);\n\t\t\t\t\t}\n\t\t\t\t} )\n\t\t\t.on( 'selectstart.DT', function () {\n\t\t\t\t\t/* Take the brutal approach to cancelling text selection */\n\t\t\t\t\treturn false;\n\t\t\t\t} );\n\t}\n\t\n\t\n\t/**\n\t * Register a callback function. Easily allows a callback function to be added to\n\t * an array store of callback functions that can then all be called together.\n\t *  @param {object} oSettings dataTables settings object\n\t *  @param {string} sStore Name of the array storage for the callbacks in oSettings\n\t *  @param {function} fn Function to be called back\n\t *  @param {string} sName Identifying name for the callback (i.e. a label)\n\t *  @memberof DataTable#oApi\n\t */\n\tfunction _fnCallbackReg( oSettings, sStore, fn, sName )\n\t{\n\t\tif ( fn )\n\t\t{\n\t\t\toSettings[sStore].push( {\n\t\t\t\t\"fn\": fn,\n\t\t\t\t\"sName\": sName\n\t\t\t} );\n\t\t}\n\t}\n\t\n\t\n\t/**\n\t * Fire callback functions and trigger events. Note that the loop over the\n\t * callback array store is done backwards! Further note that you do not want to\n\t * fire off triggers in time sensitive applications (for example cell creation)\n\t * as its slow.\n\t *  @param {object} settings dataTables settings object\n\t *  @param {string} callbackArr Name of the array storage for the callbacks in\n\t *      oSettings\n\t *  @param {string} eventName Name of the jQuery custom event to trigger. If\n\t *      null no trigger is fired\n\t *  @param {array} args Array of arguments to pass to the callback function /\n\t *      trigger\n\t *  @memberof DataTable#oApi\n\t */\n\tfunction _fnCallbackFire( settings, callbackArr, eventName, args )\n\t{\n\t\tvar ret = [];\n\t\n\t\tif ( callbackArr ) {\n\t\t\tret = $.map( settings[callbackArr].slice().reverse(), function (val, i) {\n\t\t\t\treturn val.fn.apply( settings.oInstance, args );\n\t\t\t} );\n\t\t}\n\t\n\t\tif ( eventName !== null ) {\n\t\t\tvar e = $.Event( eventName+'.dt' );\n\t\n\t\t\t$(settings.nTable).trigger( e, args );\n\t\n\t\t\tret.push( e.result );\n\t\t}\n\t\n\t\treturn ret;\n\t}\n\t\n\t\n\tfunction _fnLengthOverflow ( settings )\n\t{\n\t\tvar\n\t\t\tstart = settings._iDisplayStart,\n\t\t\tend = settings.fnDisplayEnd(),\n\t\t\tlen = settings._iDisplayLength;\n\t\n\t\t/* If we have space to show extra rows (backing up from the end point - then do so */\n\t\tif ( start >= end )\n\t\t{\n\t\t\tstart = end - len;\n\t\t}\n\t\n\t\t// Keep the start record on the current page\n\t\tstart -= (start % len);\n\t\n\t\tif ( len === -1 || start < 0 )\n\t\t{\n\t\t\tstart = 0;\n\t\t}\n\t\n\t\tsettings._iDisplayStart = start;\n\t}\n\t\n\t\n\tfunction _fnRenderer( settings, type )\n\t{\n\t\tvar renderer = settings.renderer;\n\t\tvar host = DataTable.ext.renderer[type];\n\t\n\t\tif ( $.isPlainObject( renderer ) && renderer[type] ) {\n\t\t\t// Specific renderer for this type. If available use it, otherwise use\n\t\t\t// the default.\n\t\t\treturn host[renderer[type]] || host._;\n\t\t}\n\t\telse if ( typeof renderer === 'string' ) {\n\t\t\t// Common renderer - if there is one available for this type use it,\n\t\t\t// otherwise use the default\n\t\t\treturn host[renderer] || host._;\n\t\t}\n\t\n\t\t// Use the default\n\t\treturn host._;\n\t}\n\t\n\t\n\t/**\n\t * Detect the data source being used for the table. Used to simplify the code\n\t * a little (ajax) and to make it compress a little smaller.\n\t *\n\t *  @param {object} settings dataTables settings object\n\t *  @returns {string} Data source\n\t *  @memberof DataTable#oApi\n\t */\n\tfunction _fnDataSource ( settings )\n\t{\n\t\tif ( settings.oFeatures.bServerSide ) {\n\t\t\treturn 'ssp';\n\t\t}\n\t\telse if ( settings.ajax || settings.sAjaxSource ) {\n\t\t\treturn 'ajax';\n\t\t}\n\t\treturn 'dom';\n\t}\n\t\n\n\t\n\t\n\t/**\n\t * Computed structure of the DataTables API, defined by the options passed to\n\t * `DataTable.Api.register()` when building the API.\n\t *\n\t * The structure is built in order to speed creation and extension of the Api\n\t * objects since the extensions are effectively pre-parsed.\n\t *\n\t * The array is an array of objects with the following structure, where this\n\t * base array represents the Api prototype base:\n\t *\n\t *     [\n\t *       {\n\t *         name:      'data'                -- string   - Property name\n\t *         val:       function () {},       -- function - Api method (or undefined if just an object\n\t *         methodExt: [ ... ],              -- array    - Array of Api object definitions to extend the method result\n\t *         propExt:   [ ... ]               -- array    - Array of Api object definitions to extend the property\n\t *       },\n\t *       {\n\t *         name:     'row'\n\t *         val:       {},\n\t *         methodExt: [ ... ],\n\t *         propExt:   [\n\t *           {\n\t *             name:      'data'\n\t *             val:       function () {},\n\t *             methodExt: [ ... ],\n\t *             propExt:   [ ... ]\n\t *           },\n\t *           ...\n\t *         ]\n\t *       }\n\t *     ]\n\t *\n\t * @type {Array}\n\t * @ignore\n\t */\n\tvar __apiStruct = [];\n\t\n\t\n\t/**\n\t * `Array.prototype` reference.\n\t *\n\t * @type object\n\t * @ignore\n\t */\n\tvar __arrayProto = Array.prototype;\n\t\n\t\n\t/**\n\t * Abstraction for `context` parameter of the `Api` constructor to allow it to\n\t * take several different forms for ease of use.\n\t *\n\t * Each of the input parameter types will be converted to a DataTables settings\n\t * object where possible.\n\t *\n\t * @param  {string|node|jQuery|object} mixed DataTable identifier. Can be one\n\t *   of:\n\t *\n\t *   * `string` - jQuery selector. Any DataTables' matching the given selector\n\t *     with be found and used.\n\t *   * `node` - `TABLE` node which has already been formed into a DataTable.\n\t *   * `jQuery` - A jQuery object of `TABLE` nodes.\n\t *   * `object` - DataTables settings object\n\t *   * `DataTables.Api` - API instance\n\t * @return {array|null} Matching DataTables settings objects. `null` or\n\t *   `undefined` is returned if no matching DataTable is found.\n\t * @ignore\n\t */\n\tvar _toSettings = function ( mixed )\n\t{\n\t\tvar idx, jq;\n\t\tvar settings = DataTable.settings;\n\t\tvar tables = $.map( settings, function (el, i) {\n\t\t\treturn el.nTable;\n\t\t} );\n\t\n\t\tif ( ! mixed ) {\n\t\t\treturn [];\n\t\t}\n\t\telse if ( mixed.nTable && mixed.oApi ) {\n\t\t\t// DataTables settings object\n\t\t\treturn [ mixed ];\n\t\t}\n\t\telse if ( mixed.nodeName && mixed.nodeName.toLowerCase() === 'table' ) {\n\t\t\t// Table node\n\t\t\tidx = $.inArray( mixed, tables );\n\t\t\treturn idx !== -1 ? [ settings[idx] ] : null;\n\t\t}\n\t\telse if ( mixed && typeof mixed.settings === 'function' ) {\n\t\t\treturn mixed.settings().toArray();\n\t\t}\n\t\telse if ( typeof mixed === 'string' ) {\n\t\t\t// jQuery selector\n\t\t\tjq = $(mixed);\n\t\t}\n\t\telse if ( mixed instanceof $ ) {\n\t\t\t// jQuery object (also DataTables instance)\n\t\t\tjq = mixed;\n\t\t}\n\t\n\t\tif ( jq ) {\n\t\t\treturn jq.map( function(i) {\n\t\t\t\tidx = $.inArray( this, tables );\n\t\t\t\treturn idx !== -1 ? settings[idx] : null;\n\t\t\t} ).toArray();\n\t\t}\n\t};\n\t\n\t\n\t/**\n\t * DataTables API class - used to control and interface with  one or more\n\t * DataTables enhanced tables.\n\t *\n\t * The API class is heavily based on jQuery, presenting a chainable interface\n\t * that you can use to interact with tables. Each instance of the API class has\n\t * a \"context\" - i.e. the tables that it will operate on. This could be a single\n\t * table, all tables on a page or a sub-set thereof.\n\t *\n\t * Additionally the API is designed to allow you to easily work with the data in\n\t * the tables, retrieving and manipulating it as required. This is done by\n\t * presenting the API class as an array like interface. The contents of the\n\t * array depend upon the actions requested by each method (for example\n\t * `rows().nodes()` will return an array of nodes, while `rows().data()` will\n\t * return an array of objects or arrays depending upon your table's\n\t * configuration). The API object has a number of array like methods (`push`,\n\t * `pop`, `reverse` etc) as well as additional helper methods (`each`, `pluck`,\n\t * `unique` etc) to assist your working with the data held in a table.\n\t *\n\t * Most methods (those which return an Api instance) are chainable, which means\n\t * the return from a method call also has all of the methods available that the\n\t * top level object had. For example, these two calls are equivalent:\n\t *\n\t *     // Not chained\n\t *     api.row.add( {...} );\n\t *     api.draw();\n\t *\n\t *     // Chained\n\t *     api.row.add( {...} ).draw();\n\t *\n\t * @class DataTable.Api\n\t * @param {array|object|string|jQuery} context DataTable identifier. This is\n\t *   used to define which DataTables enhanced tables this API will operate on.\n\t *   Can be one of:\n\t *\n\t *   * `string` - jQuery selector. Any DataTables' matching the given selector\n\t *     with be found and used.\n\t *   * `node` - `TABLE` node which has already been formed into a DataTable.\n\t *   * `jQuery` - A jQuery object of `TABLE` nodes.\n\t *   * `object` - DataTables settings object\n\t * @param {array} [data] Data to initialise the Api instance with.\n\t *\n\t * @example\n\t *   // Direct initialisation during DataTables construction\n\t *   var api = $('#example').DataTable();\n\t *\n\t * @example\n\t *   // Initialisation using a DataTables jQuery object\n\t *   var api = $('#example').dataTable().api();\n\t *\n\t * @example\n\t *   // Initialisation as a constructor\n\t *   var api = new $.fn.DataTable.Api( 'table.dataTable' );\n\t */\n\t_Api = function ( context, data )\n\t{\n\t\tif ( ! (this instanceof _Api) ) {\n\t\t\treturn new _Api( context, data );\n\t\t}\n\t\n\t\tvar settings = [];\n\t\tvar ctxSettings = function ( o ) {\n\t\t\tvar a = _toSettings( o );\n\t\t\tif ( a ) {\n\t\t\t\tsettings.push.apply( settings, a );\n\t\t\t}\n\t\t};\n\t\n\t\tif ( $.isArray( context ) ) {\n\t\t\tfor ( var i=0, ien=context.length ; i<ien ; i++ ) {\n\t\t\t\tctxSettings( context[i] );\n\t\t\t}\n\t\t}\n\t\telse {\n\t\t\tctxSettings( context );\n\t\t}\n\t\n\t\t// Remove duplicates\n\t\tthis.context = _unique( settings );\n\t\n\t\t// Initial data\n\t\tif ( data ) {\n\t\t\t$.merge( this, data );\n\t\t}\n\t\n\t\t// selector\n\t\tthis.selector = {\n\t\t\trows: null,\n\t\t\tcols: null,\n\t\t\topts: null\n\t\t};\n\t\n\t\t_Api.extend( this, this, __apiStruct );\n\t};\n\t\n\tDataTable.Api = _Api;\n\t\n\t// Don't destroy the existing prototype, just extend it. Required for jQuery 2's\n\t// isPlainObject.\n\t$.extend( _Api.prototype, {\n\t\tany: function ()\n\t\t{\n\t\t\treturn this.count() !== 0;\n\t\t},\n\t\n\t\n\t\tconcat:  __arrayProto.concat,\n\t\n\t\n\t\tcontext: [], // array of table settings objects\n\t\n\t\n\t\tcount: function ()\n\t\t{\n\t\t\treturn this.flatten().length;\n\t\t},\n\t\n\t\n\t\teach: function ( fn )\n\t\t{\n\t\t\tfor ( var i=0, ien=this.length ; i<ien; i++ ) {\n\t\t\t\tfn.call( this, this[i], i, this );\n\t\t\t}\n\t\n\t\t\treturn this;\n\t\t},\n\t\n\t\n\t\teq: function ( idx )\n\t\t{\n\t\t\tvar ctx = this.context;\n\t\n\t\t\treturn ctx.length > idx ?\n\t\t\t\tnew _Api( ctx[idx], this[idx] ) :\n\t\t\t\tnull;\n\t\t},\n\t\n\t\n\t\tfilter: function ( fn )\n\t\t{\n\t\t\tvar a = [];\n\t\n\t\t\tif ( __arrayProto.filter ) {\n\t\t\t\ta = __arrayProto.filter.call( this, fn, this );\n\t\t\t}\n\t\t\telse {\n\t\t\t\t// Compatibility for browsers without EMCA-252-5 (JS 1.6)\n\t\t\t\tfor ( var i=0, ien=this.length ; i<ien ; i++ ) {\n\t\t\t\t\tif ( fn.call( this, this[i], i, this ) ) {\n\t\t\t\t\t\ta.push( this[i] );\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\n\t\t\treturn new _Api( this.context, a );\n\t\t},\n\t\n\t\n\t\tflatten: function ()\n\t\t{\n\t\t\tvar a = [];\n\t\t\treturn new _Api( this.context, a.concat.apply( a, this.toArray() ) );\n\t\t},\n\t\n\t\n\t\tjoin:    __arrayProto.join,\n\t\n\t\n\t\tindexOf: __arrayProto.indexOf || function (obj, start)\n\t\t{\n\t\t\tfor ( var i=(start || 0), ien=this.length ; i<ien ; i++ ) {\n\t\t\t\tif ( this[i] === obj ) {\n\t\t\t\t\treturn i;\n\t\t\t\t}\n\t\t\t}\n\t\t\treturn -1;\n\t\t},\n\t\n\t\titerator: function ( flatten, type, fn, alwaysNew ) {\n\t\t\tvar\n\t\t\t\ta = [], ret,\n\t\t\t\ti, ien, j, jen,\n\t\t\t\tcontext = this.context,\n\t\t\t\trows, items, item,\n\t\t\t\tselector = this.selector;\n\t\n\t\t\t// Argument shifting\n\t\t\tif ( typeof flatten === 'string' ) {\n\t\t\t\talwaysNew = fn;\n\t\t\t\tfn = type;\n\t\t\t\ttype = flatten;\n\t\t\t\tflatten = false;\n\t\t\t}\n\t\n\t\t\tfor ( i=0, ien=context.length ; i<ien ; i++ ) {\n\t\t\t\tvar apiInst = new _Api( context[i] );\n\t\n\t\t\t\tif ( type === 'table' ) {\n\t\t\t\t\tret = fn.call( apiInst, context[i], i );\n\t\n\t\t\t\t\tif ( ret !== undefined ) {\n\t\t\t\t\t\ta.push( ret );\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\telse if ( type === 'columns' || type === 'rows' ) {\n\t\t\t\t\t// this has same length as context - one entry for each table\n\t\t\t\t\tret = fn.call( apiInst, context[i], this[i], i );\n\t\n\t\t\t\t\tif ( ret !== undefined ) {\n\t\t\t\t\t\ta.push( ret );\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\telse if ( type === 'column' || type === 'column-rows' || type === 'row' || type === 'cell' ) {\n\t\t\t\t\t// columns and rows share the same structure.\n\t\t\t\t\t// 'this' is an array of column indexes for each context\n\t\t\t\t\titems = this[i];\n\t\n\t\t\t\t\tif ( type === 'column-rows' ) {\n\t\t\t\t\t\trows = _selector_row_indexes( context[i], selector.opts );\n\t\t\t\t\t}\n\t\n\t\t\t\t\tfor ( j=0, jen=items.length ; j<jen ; j++ ) {\n\t\t\t\t\t\titem = items[j];\n\t\n\t\t\t\t\t\tif ( type === 'cell' ) {\n\t\t\t\t\t\t\tret = fn.call( apiInst, context[i], item.row, item.column, i, j );\n\t\t\t\t\t\t}\n\t\t\t\t\t\telse {\n\t\t\t\t\t\t\tret = fn.call( apiInst, context[i], item, i, j, rows );\n\t\t\t\t\t\t}\n\t\n\t\t\t\t\t\tif ( ret !== undefined ) {\n\t\t\t\t\t\t\ta.push( ret );\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\n\t\t\tif ( a.length || alwaysNew ) {\n\t\t\t\tvar api = new _Api( context, flatten ? a.concat.apply( [], a ) : a );\n\t\t\t\tvar apiSelector = api.selector;\n\t\t\t\tapiSelector.rows = selector.rows;\n\t\t\t\tapiSelector.cols = selector.cols;\n\t\t\t\tapiSelector.opts = selector.opts;\n\t\t\t\treturn api;\n\t\t\t}\n\t\t\treturn this;\n\t\t},\n\t\n\t\n\t\tlastIndexOf: __arrayProto.lastIndexOf || function (obj, start)\n\t\t{\n\t\t\t// Bit cheeky...\n\t\t\treturn this.indexOf.apply( this.toArray.reverse(), arguments );\n\t\t},\n\t\n\t\n\t\tlength:  0,\n\t\n\t\n\t\tmap: function ( fn )\n\t\t{\n\t\t\tvar a = [];\n\t\n\t\t\tif ( __arrayProto.map ) {\n\t\t\t\ta = __arrayProto.map.call( this, fn, this );\n\t\t\t}\n\t\t\telse {\n\t\t\t\t// Compatibility for browsers without EMCA-252-5 (JS 1.6)\n\t\t\t\tfor ( var i=0, ien=this.length ; i<ien ; i++ ) {\n\t\t\t\t\ta.push( fn.call( this, this[i], i ) );\n\t\t\t\t}\n\t\t\t}\n\t\n\t\t\treturn new _Api( this.context, a );\n\t\t},\n\t\n\t\n\t\tpluck: function ( prop )\n\t\t{\n\t\t\treturn this.map( function ( el ) {\n\t\t\t\treturn el[ prop ];\n\t\t\t} );\n\t\t},\n\t\n\t\tpop:     __arrayProto.pop,\n\t\n\t\n\t\tpush:    __arrayProto.push,\n\t\n\t\n\t\t// Does not return an API instance\n\t\treduce: __arrayProto.reduce || function ( fn, init )\n\t\t{\n\t\t\treturn _fnReduce( this, fn, init, 0, this.length, 1 );\n\t\t},\n\t\n\t\n\t\treduceRight: __arrayProto.reduceRight || function ( fn, init )\n\t\t{\n\t\t\treturn _fnReduce( this, fn, init, this.length-1, -1, -1 );\n\t\t},\n\t\n\t\n\t\treverse: __arrayProto.reverse,\n\t\n\t\n\t\t// Object with rows, columns and opts\n\t\tselector: null,\n\t\n\t\n\t\tshift:   __arrayProto.shift,\n\t\n\t\n\t\tslice: function () {\n\t\t\treturn new _Api( this.context, this );\n\t\t},\n\t\n\t\n\t\tsort:    __arrayProto.sort, // ? name - order?\n\t\n\t\n\t\tsplice:  __arrayProto.splice,\n\t\n\t\n\t\ttoArray: function ()\n\t\t{\n\t\t\treturn __arrayProto.slice.call( this );\n\t\t},\n\t\n\t\n\t\tto$: function ()\n\t\t{\n\t\t\treturn $( this );\n\t\t},\n\t\n\t\n\t\ttoJQuery: function ()\n\t\t{\n\t\t\treturn $( this );\n\t\t},\n\t\n\t\n\t\tunique: function ()\n\t\t{\n\t\t\treturn new _Api( this.context, _unique(this) );\n\t\t},\n\t\n\t\n\t\tunshift: __arrayProto.unshift\n\t} );\n\t\n\t\n\t_Api.extend = function ( scope, obj, ext )\n\t{\n\t\t// Only extend API instances and static properties of the API\n\t\tif ( ! ext.length || ! obj || ( ! (obj instanceof _Api) && ! obj.__dt_wrapper ) ) {\n\t\t\treturn;\n\t\t}\n\t\n\t\tvar\n\t\t\ti, ien,\n\t\t\tstruct,\n\t\t\tmethodScoping = function ( scope, fn, struc ) {\n\t\t\t\treturn function () {\n\t\t\t\t\tvar ret = fn.apply( scope, arguments );\n\t\n\t\t\t\t\t// Method extension\n\t\t\t\t\t_Api.extend( ret, ret, struc.methodExt );\n\t\t\t\t\treturn ret;\n\t\t\t\t};\n\t\t\t};\n\t\n\t\tfor ( i=0, ien=ext.length ; i<ien ; i++ ) {\n\t\t\tstruct = ext[i];\n\t\n\t\t\t// Value\n\t\t\tobj[ struct.name ] = struct.type === 'function' ?\n\t\t\t\tmethodScoping( scope, struct.val, struct ) :\n\t\t\t\tstruct.type === 'object' ?\n\t\t\t\t\t{} :\n\t\t\t\t\tstruct.val;\n\t\n\t\t\tobj[ struct.name ].__dt_wrapper = true;\n\t\n\t\t\t// Property extension\n\t\t\t_Api.extend( scope, obj[ struct.name ], struct.propExt );\n\t\t}\n\t};\n\t\n\t\n\t// @todo - Is there need for an augment function?\n\t// _Api.augment = function ( inst, name )\n\t// {\n\t// \t// Find src object in the structure from the name\n\t// \tvar parts = name.split('.');\n\t\n\t// \t_Api.extend( inst, obj );\n\t// };\n\t\n\t\n\t//     [\n\t//       {\n\t//         name:      'data'                -- string   - Property name\n\t//         val:       function () {},       -- function - Api method (or undefined if just an object\n\t//         methodExt: [ ... ],              -- array    - Array of Api object definitions to extend the method result\n\t//         propExt:   [ ... ]               -- array    - Array of Api object definitions to extend the property\n\t//       },\n\t//       {\n\t//         name:     'row'\n\t//         val:       {},\n\t//         methodExt: [ ... ],\n\t//         propExt:   [\n\t//           {\n\t//             name:      'data'\n\t//             val:       function () {},\n\t//             methodExt: [ ... ],\n\t//             propExt:   [ ... ]\n\t//           },\n\t//           ...\n\t//         ]\n\t//       }\n\t//     ]\n\t\n\t_Api.register = _api_register = function ( name, val )\n\t{\n\t\tif ( $.isArray( name ) ) {\n\t\t\tfor ( var j=0, jen=name.length ; j<jen ; j++ ) {\n\t\t\t\t_Api.register( name[j], val );\n\t\t\t}\n\t\t\treturn;\n\t\t}\n\t\n\t\tvar\n\t\t\ti, ien,\n\t\t\their = name.split('.'),\n\t\t\tstruct = __apiStruct,\n\t\t\tkey, method;\n\t\n\t\tvar find = function ( src, name ) {\n\t\t\tfor ( var i=0, ien=src.length ; i<ien ; i++ ) {\n\t\t\t\tif ( src[i].name === name ) {\n\t\t\t\t\treturn src[i];\n\t\t\t\t}\n\t\t\t}\n\t\t\treturn null;\n\t\t};\n\t\n\t\tfor ( i=0, ien=heir.length ; i<ien ; i++ ) {\n\t\t\tmethod = heir[i].indexOf('()') !== -1;\n\t\t\tkey = method ?\n\t\t\t\their[i].replace('()', '') :\n\t\t\t\their[i];\n\t\n\t\t\tvar src = find( struct, key );\n\t\t\tif ( ! src ) {\n\t\t\t\tsrc = {\n\t\t\t\t\tname:      key,\n\t\t\t\t\tval:       {},\n\t\t\t\t\tmethodExt: [],\n\t\t\t\t\tpropExt:   [],\n\t\t\t\t\ttype:      'object'\n\t\t\t\t};\n\t\t\t\tstruct.push( src );\n\t\t\t}\n\t\n\t\t\tif ( i === ien-1 ) {\n\t\t\t\tsrc.val = val;\n\t\t\t\tsrc.type = typeof val === 'function' ?\n\t\t\t\t\t'function' :\n\t\t\t\t\t$.isPlainObject( val ) ?\n\t\t\t\t\t\t'object' :\n\t\t\t\t\t\t'other';\n\t\t\t}\n\t\t\telse {\n\t\t\t\tstruct = method ?\n\t\t\t\t\tsrc.methodExt :\n\t\t\t\t\tsrc.propExt;\n\t\t\t}\n\t\t}\n\t};\n\t\n\t_Api.registerPlural = _api_registerPlural = function ( pluralName, singularName, val ) {\n\t\t_Api.register( pluralName, val );\n\t\n\t\t_Api.register( singularName, function () {\n\t\t\tvar ret = val.apply( this, arguments );\n\t\n\t\t\tif ( ret === this ) {\n\t\t\t\t// Returned item is the API instance that was passed in, return it\n\t\t\t\treturn this;\n\t\t\t}\n\t\t\telse if ( ret instanceof _Api ) {\n\t\t\t\t// New API instance returned, want the value from the first item\n\t\t\t\t// in the returned array for the singular result.\n\t\t\t\treturn ret.length ?\n\t\t\t\t\t$.isArray( ret[0] ) ?\n\t\t\t\t\t\tnew _Api( ret.context, ret[0] ) : // Array results are 'enhanced'\n\t\t\t\t\t\tret[0] :\n\t\t\t\t\tundefined;\n\t\t\t}\n\t\n\t\t\t// Non-API return - just fire it back\n\t\t\treturn ret;\n\t\t} );\n\t};\n\t\n\t\n\t/**\n\t * Selector for HTML tables. Apply the given selector to the give array of\n\t * DataTables settings objects.\n\t *\n\t * @param {string|integer} [selector] jQuery selector string or integer\n\t * @param  {array} Array of DataTables settings objects to be filtered\n\t * @return {array}\n\t * @ignore\n\t */\n\tvar __table_selector = function ( selector, a )\n\t{\n\t\tif ( $.isArray(selector) ) {\n\t\t\treturn $.map( selector, function (item) {\n\t\t\t\treturn __table_selector(item, a);\n\t\t\t} );\n\t\t}\n\t\n\t\t// Integer is used to pick out a table by index\n\t\tif ( typeof selector === 'number' ) {\n\t\t\treturn [ a[ selector ] ];\n\t\t}\n\t\n\t\t// Perform a jQuery selector on the table nodes\n\t\tvar nodes = $.map( a, function (el, i) {\n\t\t\treturn el.nTable;\n\t\t} );\n\t\n\t\treturn $(nodes)\n\t\t\t.filter( selector )\n\t\t\t.map( function (i) {\n\t\t\t\t// Need to translate back from the table node to the settings\n\t\t\t\tvar idx = $.inArray( this, nodes );\n\t\t\t\treturn a[ idx ];\n\t\t\t} )\n\t\t\t.toArray();\n\t};\n\t\n\t\n\t\n\t/**\n\t * Context selector for the API's context (i.e. the tables the API instance\n\t * refers to.\n\t *\n\t * @name    DataTable.Api#tables\n\t * @param {string|integer} [selector] Selector to pick which tables the iterator\n\t *   should operate on. If not given, all tables in the current context are\n\t *   used. This can be given as a jQuery selector (for example `':gt(0)'`) to\n\t *   select multiple tables or as an integer to select a single table.\n\t * @returns {DataTable.Api} Returns a new API instance if a selector is given.\n\t */\n\t_api_register( 'tables()', function ( selector ) {\n\t\t// A new instance is created if there was a selector specified\n\t\treturn selector !== undefined && selector !== null ?\n\t\t\tnew _Api( __table_selector( selector, this.context ) ) :\n\t\t\tthis;\n\t} );\n\t\n\t\n\t_api_register( 'table()', function ( selector ) {\n\t\tvar tables = this.tables( selector );\n\t\tvar ctx = tables.context;\n\t\n\t\t// Truncate to the first matched table\n\t\treturn ctx.length ?\n\t\t\tnew _Api( ctx[0] ) :\n\t\t\ttables;\n\t} );\n\t\n\t\n\t_api_registerPlural( 'tables().nodes()', 'table().node()' , function () {\n\t\treturn this.iterator( 'table', function ( ctx ) {\n\t\t\treturn ctx.nTable;\n\t\t}, 1 );\n\t} );\n\t\n\t\n\t_api_registerPlural( 'tables().body()', 'table().body()' , function () {\n\t\treturn this.iterator( 'table', function ( ctx ) {\n\t\t\treturn ctx.nTBody;\n\t\t}, 1 );\n\t} );\n\t\n\t\n\t_api_registerPlural( 'tables().header()', 'table().header()' , function () {\n\t\treturn this.iterator( 'table', function ( ctx ) {\n\t\t\treturn ctx.nTHead;\n\t\t}, 1 );\n\t} );\n\t\n\t\n\t_api_registerPlural( 'tables().footer()', 'table().footer()' , function () {\n\t\treturn this.iterator( 'table', function ( ctx ) {\n\t\t\treturn ctx.nTFoot;\n\t\t}, 1 );\n\t} );\n\t\n\t\n\t_api_registerPlural( 'tables().containers()', 'table().container()' , function () {\n\t\treturn this.iterator( 'table', function ( ctx ) {\n\t\t\treturn ctx.nTableWrapper;\n\t\t}, 1 );\n\t} );\n\t\n\t\n\t\n\t/**\n\t * Redraw the tables in the current context.\n\t */\n\t_api_register( 'draw()', function ( paging ) {\n\t\treturn this.iterator( 'table', function ( settings ) {\n\t\t\tif ( paging === 'page' ) {\n\t\t\t\t_fnDraw( settings );\n\t\t\t}\n\t\t\telse {\n\t\t\t\tif ( typeof paging === 'string' ) {\n\t\t\t\t\tpaging = paging === 'full-hold' ?\n\t\t\t\t\t\tfalse :\n\t\t\t\t\t\ttrue;\n\t\t\t\t}\n\t\n\t\t\t\t_fnReDraw( settings, paging===false );\n\t\t\t}\n\t\t} );\n\t} );\n\t\n\t\n\t\n\t/**\n\t * Get the current page index.\n\t *\n\t * @return {integer} Current page index (zero based)\n\t *//**\n\t * Set the current page.\n\t *\n\t * Note that if you attempt to show a page which does not exist, DataTables will\n\t * not throw an error, but rather reset the paging.\n\t *\n\t * @param {integer|string} action The paging action to take. This can be one of:\n\t *  * `integer` - The page index to jump to\n\t *  * `string` - An action to take:\n\t *    * `first` - Jump to first page.\n\t *    * `next` - Jump to the next page\n\t *    * `previous` - Jump to previous page\n\t *    * `last` - Jump to the last page.\n\t * @returns {DataTables.Api} this\n\t */\n\t_api_register( 'page()', function ( action ) {\n\t\tif ( action === undefined ) {\n\t\t\treturn this.page.info().page; // not an expensive call\n\t\t}\n\t\n\t\t// else, have an action to take on all tables\n\t\treturn this.iterator( 'table', function ( settings ) {\n\t\t\t_fnPageChange( settings, action );\n\t\t} );\n\t} );\n\t\n\t\n\t/**\n\t * Paging information for the first table in the current context.\n\t *\n\t * If you require paging information for another table, use the `table()` method\n\t * with a suitable selector.\n\t *\n\t * @return {object} Object with the following properties set:\n\t *  * `page` - Current page index (zero based - i.e. the first page is `0`)\n\t *  * `pages` - Total number of pages\n\t *  * `start` - Display index for the first record shown on the current page\n\t *  * `end` - Display index for the last record shown on the current page\n\t *  * `length` - Display length (number of records). Note that generally `start\n\t *    + length = end`, but this is not always true, for example if there are\n\t *    only 2 records to show on the final page, with a length of 10.\n\t *  * `recordsTotal` - Full data set length\n\t *  * `recordsDisplay` - Data set length once the current filtering criterion\n\t *    are applied.\n\t */\n\t_api_register( 'page.info()', function ( action ) {\n\t\tif ( this.context.length === 0 ) {\n\t\t\treturn undefined;\n\t\t}\n\t\n\t\tvar\n\t\t\tsettings   = this.context[0],\n\t\t\tstart      = settings._iDisplayStart,\n\t\t\tlen        = settings.oFeatures.bPaginate ? settings._iDisplayLength : -1,\n\t\t\tvisRecords = settings.fnRecordsDisplay(),\n\t\t\tall        = len === -1;\n\t\n\t\treturn {\n\t\t\t\"page\":           all ? 0 : Math.floor( start / len ),\n\t\t\t\"pages\":          all ? 1 : Math.ceil( visRecords / len ),\n\t\t\t\"start\":          start,\n\t\t\t\"end\":            settings.fnDisplayEnd(),\n\t\t\t\"length\":         len,\n\t\t\t\"recordsTotal\":   settings.fnRecordsTotal(),\n\t\t\t\"recordsDisplay\": visRecords,\n\t\t\t\"serverSide\":     _fnDataSource( settings ) === 'ssp'\n\t\t};\n\t} );\n\t\n\t\n\t/**\n\t * Get the current page length.\n\t *\n\t * @return {integer} Current page length. Note `-1` indicates that all records\n\t *   are to be shown.\n\t *//**\n\t * Set the current page length.\n\t *\n\t * @param {integer} Page length to set. Use `-1` to show all records.\n\t * @returns {DataTables.Api} this\n\t */\n\t_api_register( 'page.len()', function ( len ) {\n\t\t// Note that we can't call this function 'length()' because `length`\n\t\t// is a Javascript property of functions which defines how many arguments\n\t\t// the function expects.\n\t\tif ( len === undefined ) {\n\t\t\treturn this.context.length !== 0 ?\n\t\t\t\tthis.context[0]._iDisplayLength :\n\t\t\t\tundefined;\n\t\t}\n\t\n\t\t// else, set the page length\n\t\treturn this.iterator( 'table', function ( settings ) {\n\t\t\t_fnLengthChange( settings, len );\n\t\t} );\n\t} );\n\t\n\t\n\t\n\tvar __reload = function ( settings, holdPosition, callback ) {\n\t\t// Use the draw event to trigger a callback\n\t\tif ( callback ) {\n\t\t\tvar api = new _Api( settings );\n\t\n\t\t\tapi.one( 'draw', function () {\n\t\t\t\tcallback( api.ajax.json() );\n\t\t\t} );\n\t\t}\n\t\n\t\tif ( _fnDataSource( settings ) == 'ssp' ) {\n\t\t\t_fnReDraw( settings, holdPosition );\n\t\t}\n\t\telse {\n\t\t\t_fnProcessingDisplay( settings, true );\n\t\n\t\t\t// Cancel an existing request\n\t\t\tvar xhr = settings.jqXHR;\n\t\t\tif ( xhr && xhr.readyState !== 4 ) {\n\t\t\t\txhr.abort();\n\t\t\t}\n\t\n\t\t\t// Trigger xhr\n\t\t\t_fnBuildAjax( settings, [], function( json ) {\n\t\t\t\t_fnClearTable( settings );\n\t\n\t\t\t\tvar data = _fnAjaxDataSrc( settings, json );\n\t\t\t\tfor ( var i=0, ien=data.length ; i<ien ; i++ ) {\n\t\t\t\t\t_fnAddData( settings, data[i] );\n\t\t\t\t}\n\t\n\t\t\t\t_fnReDraw( settings, holdPosition );\n\t\t\t\t_fnProcessingDisplay( settings, false );\n\t\t\t} );\n\t\t}\n\t};\n\t\n\t\n\t/**\n\t * Get the JSON response from the last Ajax request that DataTables made to the\n\t * server. Note that this returns the JSON from the first table in the current\n\t * context.\n\t *\n\t * @return {object} JSON received from the server.\n\t */\n\t_api_register( 'ajax.json()', function () {\n\t\tvar ctx = this.context;\n\t\n\t\tif ( ctx.length > 0 ) {\n\t\t\treturn ctx[0].json;\n\t\t}\n\t\n\t\t// else return undefined;\n\t} );\n\t\n\t\n\t/**\n\t * Get the data submitted in the last Ajax request\n\t */\n\t_api_register( 'ajax.params()', function () {\n\t\tvar ctx = this.context;\n\t\n\t\tif ( ctx.length > 0 ) {\n\t\t\treturn ctx[0].oAjaxData;\n\t\t}\n\t\n\t\t// else return undefined;\n\t} );\n\t\n\t\n\t/**\n\t * Reload tables from the Ajax data source. Note that this function will\n\t * automatically re-draw the table when the remote data has been loaded.\n\t *\n\t * @param {boolean} [reset=true] Reset (default) or hold the current paging\n\t *   position. A full re-sort and re-filter is performed when this method is\n\t *   called, which is why the pagination reset is the default action.\n\t * @returns {DataTables.Api} this\n\t */\n\t_api_register( 'ajax.reload()', function ( callback, resetPaging ) {\n\t\treturn this.iterator( 'table', function (settings) {\n\t\t\t__reload( settings, resetPaging===false, callback );\n\t\t} );\n\t} );\n\t\n\t\n\t/**\n\t * Get the current Ajax URL. Note that this returns the URL from the first\n\t * table in the current context.\n\t *\n\t * @return {string} Current Ajax source URL\n\t *//**\n\t * Set the Ajax URL. Note that this will set the URL for all tables in the\n\t * current context.\n\t *\n\t * @param {string} url URL to set.\n\t * @returns {DataTables.Api} this\n\t */\n\t_api_register( 'ajax.url()', function ( url ) {\n\t\tvar ctx = this.context;\n\t\n\t\tif ( url === undefined ) {\n\t\t\t// get\n\t\t\tif ( ctx.length === 0 ) {\n\t\t\t\treturn undefined;\n\t\t\t}\n\t\t\tctx = ctx[0];\n\t\n\t\t\treturn ctx.ajax ?\n\t\t\t\t$.isPlainObject( ctx.ajax ) ?\n\t\t\t\t\tctx.ajax.url :\n\t\t\t\t\tctx.ajax :\n\t\t\t\tctx.sAjaxSource;\n\t\t}\n\t\n\t\t// set\n\t\treturn this.iterator( 'table', function ( settings ) {\n\t\t\tif ( $.isPlainObject( settings.ajax ) ) {\n\t\t\t\tsettings.ajax.url = url;\n\t\t\t}\n\t\t\telse {\n\t\t\t\tsettings.ajax = url;\n\t\t\t}\n\t\t\t// No need to consider sAjaxSource here since DataTables gives priority\n\t\t\t// to `ajax` over `sAjaxSource`. So setting `ajax` here, renders any\n\t\t\t// value of `sAjaxSource` redundant.\n\t\t} );\n\t} );\n\t\n\t\n\t/**\n\t * Load data from the newly set Ajax URL. Note that this method is only\n\t * available when `ajax.url()` is used to set a URL. Additionally, this method\n\t * has the same effect as calling `ajax.reload()` but is provided for\n\t * convenience when setting a new URL. Like `ajax.reload()` it will\n\t * automatically redraw the table once the remote data has been loaded.\n\t *\n\t * @returns {DataTables.Api} this\n\t */\n\t_api_register( 'ajax.url().load()', function ( callback, resetPaging ) {\n\t\t// Same as a reload, but makes sense to present it for easy access after a\n\t\t// url change\n\t\treturn this.iterator( 'table', function ( ctx ) {\n\t\t\t__reload( ctx, resetPaging===false, callback );\n\t\t} );\n\t} );\n\t\n\t\n\t\n\t\n\tvar _selector_run = function ( type, selector, selectFn, settings, opts )\n\t{\n\t\tvar\n\t\t\tout = [], res,\n\t\t\ta, i, ien, j, jen,\n\t\t\tselectorType = typeof selector;\n\t\n\t\t// Can't just check for isArray here, as an API or jQuery instance might be\n\t\t// given with their array like look\n\t\tif ( ! selector || selectorType === 'string' || selectorType === 'function' || selector.length === undefined ) {\n\t\t\tselector = [ selector ];\n\t\t}\n\t\n\t\tfor ( i=0, ien=selector.length ; i<ien ; i++ ) {\n\t\t\t// Only split on simple strings - complex expressions will be jQuery selectors\n\t\t\ta = selector[i] && selector[i].split && ! selector[i].match(/[\\[\\(:]/) ?\n\t\t\t\tselector[i].split(',') :\n\t\t\t\t[ selector[i] ];\n\t\n\t\t\tfor ( j=0, jen=a.length ; j<jen ; j++ ) {\n\t\t\t\tres = selectFn( typeof a[j] === 'string' ? $.trim(a[j]) : a[j] );\n\t\n\t\t\t\tif ( res && res.length ) {\n\t\t\t\t\tout = out.concat( res );\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\n\t\t// selector extensions\n\t\tvar ext = _ext.selector[ type ];\n\t\tif ( ext.length ) {\n\t\t\tfor ( i=0, ien=ext.length ; i<ien ; i++ ) {\n\t\t\t\tout = ext[i]( settings, opts, out );\n\t\t\t}\n\t\t}\n\t\n\t\treturn _unique( out );\n\t};\n\t\n\t\n\tvar _selector_opts = function ( opts )\n\t{\n\t\tif ( ! opts ) {\n\t\t\topts = {};\n\t\t}\n\t\n\t\t// Backwards compatibility for 1.9- which used the terminology filter rather\n\t\t// than search\n\t\tif ( opts.filter && opts.search === undefined ) {\n\t\t\topts.search = opts.filter;\n\t\t}\n\t\n\t\treturn $.extend( {\n\t\t\tsearch: 'none',\n\t\t\torder: 'current',\n\t\t\tpage: 'all'\n\t\t}, opts );\n\t};\n\t\n\t\n\tvar _selector_first = function ( inst )\n\t{\n\t\t// Reduce the API instance to the first item found\n\t\tfor ( var i=0, ien=inst.length ; i<ien ; i++ ) {\n\t\t\tif ( inst[i].length > 0 ) {\n\t\t\t\t// Assign the first element to the first item in the instance\n\t\t\t\t// and truncate the instance and context\n\t\t\t\tinst[0] = inst[i];\n\t\t\t\tinst[0].length = 1;\n\t\t\t\tinst.length = 1;\n\t\t\t\tinst.context = [ inst.context[i] ];\n\t\n\t\t\t\treturn inst;\n\t\t\t}\n\t\t}\n\t\n\t\t// Not found - return an empty instance\n\t\tinst.length = 0;\n\t\treturn inst;\n\t};\n\t\n\t\n\tvar _selector_row_indexes = function ( settings, opts )\n\t{\n\t\tvar\n\t\t\ti, ien, tmp, a=[],\n\t\t\tdisplayFiltered = settings.aiDisplay,\n\t\t\tdisplayMaster = settings.aiDisplayMaster;\n\t\n\t\tvar\n\t\t\tsearch = opts.search,  // none, applied, removed\n\t\t\torder  = opts.order,   // applied, current, index (original - compatibility with 1.9)\n\t\t\tpage   = opts.page;    // all, current\n\t\n\t\tif ( _fnDataSource( settings ) == 'ssp' ) {\n\t\t\t// In server-side processing mode, most options are irrelevant since\n\t\t\t// rows not shown don't exist and the index order is the applied order\n\t\t\t// Removed is a special case - for consistency just return an empty\n\t\t\t// array\n\t\t\treturn search === 'removed' ?\n\t\t\t\t[] :\n\t\t\t\t_range( 0, displayMaster.length );\n\t\t}\n\t\telse if ( page == 'current' ) {\n\t\t\t// Current page implies that order=current and fitler=applied, since it is\n\t\t\t// fairly senseless otherwise, regardless of what order and search actually\n\t\t\t// are\n\t\t\tfor ( i=settings._iDisplayStart, ien=settings.fnDisplayEnd() ; i<ien ; i++ ) {\n\t\t\t\ta.push( displayFiltered[i] );\n\t\t\t}\n\t\t}\n\t\telse if ( order == 'current' || order == 'applied' ) {\n\t\t\tif ( search == 'none') {\n\t\t\t\ta = displayMaster.slice();\n\t\t\t}\n\t\t\telse if ( search == 'applied' ) {\n\t\t\t\ta = displayFiltered.slice();\n\t\t\t}\n\t\t\telse if ( search == 'removed' ) {\n\t\t\t\t// O(n+m) solution by creating a hash map\n\t\t\t\tvar displayFilteredMap = {};\n\t\n\t\t\t\tfor ( var i=0, ien=displayFiltered.length ; i<ien ; i++ ) {\n\t\t\t\t\tdisplayFilteredMap[displayFiltered[i]] = null;\n\t\t\t\t}\n\t\n\t\t\t\ta = $.map( displayMaster, function (el) {\n\t\t\t\t\treturn ! displayFilteredMap.hasOwnProperty(el) ?\n\t\t\t\t\t\tel :\n\t\t\t\t\t\tnull;\n\t\t\t\t} );\n\t\t\t}\n\t\t}\n\t\telse if ( order == 'index' || order == 'original' ) {\n\t\t\tfor ( i=0, ien=settings.aoData.length ; i<ien ; i++ ) {\n\t\t\t\tif ( search == 'none' ) {\n\t\t\t\t\ta.push( i );\n\t\t\t\t}\n\t\t\t\telse { // applied | removed\n\t\t\t\t\ttmp = $.inArray( i, displayFiltered );\n\t\n\t\t\t\t\tif ((tmp === -1 && search == 'removed') ||\n\t\t\t\t\t\t(tmp >= 0   && search == 'applied') )\n\t\t\t\t\t{\n\t\t\t\t\t\ta.push( i );\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\n\t\treturn a;\n\t};\n\t\n\t\n\t/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *\n\t * Rows\n\t *\n\t * {}          - no selector - use all available rows\n\t * {integer}   - row aoData index\n\t * {node}      - TR node\n\t * {string}    - jQuery selector to apply to the TR elements\n\t * {array}     - jQuery array of nodes, or simply an array of TR nodes\n\t *\n\t */\n\tvar __row_selector = function ( settings, selector, opts )\n\t{\n\t\tvar rows;\n\t\tvar run = function ( sel ) {\n\t\t\tvar selInt = _intVal( sel );\n\t\t\tvar i, ien;\n\t\t\tvar aoData = settings.aoData;\n\t\n\t\t\t// Short cut - selector is a number and no options provided (default is\n\t\t\t// all records, so no need to check if the index is in there, since it\n\t\t\t// must be - dev error if the index doesn't exist).\n\t\t\tif ( selInt !== null && ! opts ) {\n\t\t\t\treturn [ selInt ];\n\t\t\t}\n\t\n\t\t\tif ( ! rows ) {\n\t\t\t\trows = _selector_row_indexes( settings, opts );\n\t\t\t}\n\t\n\t\t\tif ( selInt !== null && $.inArray( selInt, rows ) !== -1 ) {\n\t\t\t\t// Selector - integer\n\t\t\t\treturn [ selInt ];\n\t\t\t}\n\t\t\telse if ( sel === null || sel === undefined || sel === '' ) {\n\t\t\t\t// Selector - none\n\t\t\t\treturn rows;\n\t\t\t}\n\t\n\t\t\t// Selector - function\n\t\t\tif ( typeof sel === 'function' ) {\n\t\t\t\treturn $.map( rows, function (idx) {\n\t\t\t\t\tvar row = aoData[ idx ];\n\t\t\t\t\treturn sel( idx, row._aData, row.nTr ) ? idx : null;\n\t\t\t\t} );\n\t\t\t}\n\t\n\t\t\t// Selector - node\n\t\t\tif ( sel.nodeName ) {\n\t\t\t\tvar rowIdx = sel._DT_RowIndex;  // Property added by DT for fast lookup\n\t\t\t\tvar cellIdx = sel._DT_CellIndex;\n\t\n\t\t\t\tif ( rowIdx !== undefined ) {\n\t\t\t\t\t// Make sure that the row is actually still present in the table\n\t\t\t\t\treturn aoData[ rowIdx ] && aoData[ rowIdx ].nTr === sel ?\n\t\t\t\t\t\t[ rowIdx ] :\n\t\t\t\t\t\t[];\n\t\t\t\t}\n\t\t\t\telse if ( cellIdx ) {\n\t\t\t\t\treturn aoData[ cellIdx.row ] && aoData[ cellIdx.row ].nTr === sel.parentNode ?\n\t\t\t\t\t\t[ cellIdx.row ] :\n\t\t\t\t\t\t[];\n\t\t\t\t}\n\t\t\t\telse {\n\t\t\t\t\tvar host = $(sel).closest('*[data-dt-row]');\n\t\t\t\t\treturn host.length ?\n\t\t\t\t\t\t[ host.data('dt-row') ] :\n\t\t\t\t\t\t[];\n\t\t\t\t}\n\t\t\t}\n\t\n\t\t\t// ID selector. Want to always be able to select rows by id, regardless\n\t\t\t// of if the tr element has been created or not, so can't rely upon\n\t\t\t// jQuery here - hence a custom implementation. This does not match\n\t\t\t// Sizzle's fast selector or HTML4 - in HTML5 the ID can be anything,\n\t\t\t// but to select it using a CSS selector engine (like Sizzle or\n\t\t\t// querySelect) it would need to need to be escaped for some characters.\n\t\t\t// DataTables simplifies this for row selectors since you can select\n\t\t\t// only a row. A # indicates an id any anything that follows is the id -\n\t\t\t// unescaped.\n\t\t\tif ( typeof sel === 'string' && sel.charAt(0) === '#' ) {\n\t\t\t\t// get row index from id\n\t\t\t\tvar rowObj = settings.aIds[ sel.replace( /^#/, '' ) ];\n\t\t\t\tif ( rowObj !== undefined ) {\n\t\t\t\t\treturn [ rowObj.idx ];\n\t\t\t\t}\n\t\n\t\t\t\t// need to fall through to jQuery in case there is DOM id that\n\t\t\t\t// matches\n\t\t\t}\n\t\t\t\n\t\t\t// Get nodes in the order from the `rows` array with null values removed\n\t\t\tvar nodes = _removeEmpty(\n\t\t\t\t_pluck_order( settings.aoData, rows, 'nTr' )\n\t\t\t);\n\t\n\t\t\t// Selector - jQuery selector string, array of nodes or jQuery object/\n\t\t\t// As jQuery's .filter() allows jQuery objects to be passed in filter,\n\t\t\t// it also allows arrays, so this will cope with all three options\n\t\t\treturn $(nodes)\n\t\t\t\t.filter( sel )\n\t\t\t\t.map( function () {\n\t\t\t\t\treturn this._DT_RowIndex;\n\t\t\t\t} )\n\t\t\t\t.toArray();\n\t\t};\n\t\n\t\treturn _selector_run( 'row', selector, run, settings, opts );\n\t};\n\t\n\t\n\t_api_register( 'rows()', function ( selector, opts ) {\n\t\t// argument shifting\n\t\tif ( selector === undefined ) {\n\t\t\tselector = '';\n\t\t}\n\t\telse if ( $.isPlainObject( selector ) ) {\n\t\t\topts = selector;\n\t\t\tselector = '';\n\t\t}\n\t\n\t\topts = _selector_opts( opts );\n\t\n\t\tvar inst = this.iterator( 'table', function ( settings ) {\n\t\t\treturn __row_selector( settings, selector, opts );\n\t\t}, 1 );\n\t\n\t\t// Want argument shifting here and in __row_selector?\n\t\tinst.selector.rows = selector;\n\t\tinst.selector.opts = opts;\n\t\n\t\treturn inst;\n\t} );\n\t\n\t_api_register( 'rows().nodes()', function () {\n\t\treturn this.iterator( 'row', function ( settings, row ) {\n\t\t\treturn settings.aoData[ row ].nTr || undefined;\n\t\t}, 1 );\n\t} );\n\t\n\t_api_register( 'rows().data()', function () {\n\t\treturn this.iterator( true, 'rows', function ( settings, rows ) {\n\t\t\treturn _pluck_order( settings.aoData, rows, '_aData' );\n\t\t}, 1 );\n\t} );\n\t\n\t_api_registerPlural( 'rows().cache()', 'row().cache()', function ( type ) {\n\t\treturn this.iterator( 'row', function ( settings, row ) {\n\t\t\tvar r = settings.aoData[ row ];\n\t\t\treturn type === 'search' ? r._aFilterData : r._aSortData;\n\t\t}, 1 );\n\t} );\n\t\n\t_api_registerPlural( 'rows().invalidate()', 'row().invalidate()', function ( src ) {\n\t\treturn this.iterator( 'row', function ( settings, row ) {\n\t\t\t_fnInvalidate( settings, row, src );\n\t\t} );\n\t} );\n\t\n\t_api_registerPlural( 'rows().indexes()', 'row().index()', function () {\n\t\treturn this.iterator( 'row', function ( settings, row ) {\n\t\t\treturn row;\n\t\t}, 1 );\n\t} );\n\t\n\t_api_registerPlural( 'rows().ids()', 'row().id()', function ( hash ) {\n\t\tvar a = [];\n\t\tvar context = this.context;\n\t\n\t\t// `iterator` will drop undefined values, but in this case we want them\n\t\tfor ( var i=0, ien=context.length ; i<ien ; i++ ) {\n\t\t\tfor ( var j=0, jen=this[i].length ; j<jen ; j++ ) {\n\t\t\t\tvar id = context[i].rowIdFn( context[i].aoData[ this[i][j] ]._aData );\n\t\t\t\ta.push( (hash === true ? '#' : '' )+ id );\n\t\t\t}\n\t\t}\n\t\n\t\treturn new _Api( context, a );\n\t} );\n\t\n\t_api_registerPlural( 'rows().remove()', 'row().remove()', function () {\n\t\tvar that = this;\n\t\n\t\tthis.iterator( 'row', function ( settings, row, thatIdx ) {\n\t\t\tvar data = settings.aoData;\n\t\t\tvar rowData = data[ row ];\n\t\t\tvar i, ien, j, jen;\n\t\t\tvar loopRow, loopCells;\n\t\n\t\t\tdata.splice( row, 1 );\n\t\n\t\t\t// Update the cached indexes\n\t\t\tfor ( i=0, ien=data.length ; i<ien ; i++ ) {\n\t\t\t\tloopRow = data[i];\n\t\t\t\tloopCells = loopRow.anCells;\n\t\n\t\t\t\t// Rows\n\t\t\t\tif ( loopRow.nTr !== null ) {\n\t\t\t\t\tloopRow.nTr._DT_RowIndex = i;\n\t\t\t\t}\n\t\n\t\t\t\t// Cells\n\t\t\t\tif ( loopCells !== null ) {\n\t\t\t\t\tfor ( j=0, jen=loopCells.length ; j<jen ; j++ ) {\n\t\t\t\t\t\tloopCells[j]._DT_CellIndex.row = i;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\n\t\t\t// Delete from the display arrays\n\t\t\t_fnDeleteIndex( settings.aiDisplayMaster, row );\n\t\t\t_fnDeleteIndex( settings.aiDisplay, row );\n\t\t\t_fnDeleteIndex( that[ thatIdx ], row, false ); // maintain local indexes\n\t\n\t\t\t// For server-side processing tables - subtract the deleted row from the count\n\t\t\tif ( settings._iRecordsDisplay > 0 ) {\n\t\t\t\tsettings._iRecordsDisplay--;\n\t\t\t}\n\t\n\t\t\t// Check for an 'overflow' they case for displaying the table\n\t\t\t_fnLengthOverflow( settings );\n\t\n\t\t\t// Remove the row's ID reference if there is one\n\t\t\tvar id = settings.rowIdFn( rowData._aData );\n\t\t\tif ( id !== undefined ) {\n\t\t\t\tdelete settings.aIds[ id ];\n\t\t\t}\n\t\t} );\n\t\n\t\tthis.iterator( 'table', function ( settings ) {\n\t\t\tfor ( var i=0, ien=settings.aoData.length ; i<ien ; i++ ) {\n\t\t\t\tsettings.aoData[i].idx = i;\n\t\t\t}\n\t\t} );\n\t\n\t\treturn this;\n\t} );\n\t\n\t\n\t_api_register( 'rows.add()', function ( rows ) {\n\t\tvar newRows = this.iterator( 'table', function ( settings ) {\n\t\t\t\tvar row, i, ien;\n\t\t\t\tvar out = [];\n\t\n\t\t\t\tfor ( i=0, ien=rows.length ; i<ien ; i++ ) {\n\t\t\t\t\trow = rows[i];\n\t\n\t\t\t\t\tif ( row.nodeName && row.nodeName.toUpperCase() === 'TR' ) {\n\t\t\t\t\t\tout.push( _fnAddTr( settings, row )[0] );\n\t\t\t\t\t}\n\t\t\t\t\telse {\n\t\t\t\t\t\tout.push( _fnAddData( settings, row ) );\n\t\t\t\t\t}\n\t\t\t\t}\n\t\n\t\t\t\treturn out;\n\t\t\t}, 1 );\n\t\n\t\t// Return an Api.rows() extended instance, so rows().nodes() etc can be used\n\t\tvar modRows = this.rows( -1 );\n\t\tmodRows.pop();\n\t\t$.merge( modRows, newRows );\n\t\n\t\treturn modRows;\n\t} );\n\t\n\t\n\t\n\t\n\t\n\t/**\n\t *\n\t */\n\t_api_register( 'row()', function ( selector, opts ) {\n\t\treturn _selector_first( this.rows( selector, opts ) );\n\t} );\n\t\n\t\n\t_api_register( 'row().data()', function ( data ) {\n\t\tvar ctx = this.context;\n\t\n\t\tif ( data === undefined ) {\n\t\t\t// Get\n\t\t\treturn ctx.length && this.length ?\n\t\t\t\tctx[0].aoData[ this[0] ]._aData :\n\t\t\t\tundefined;\n\t\t}\n\t\n\t\t// Set\n\t\tvar row = ctx[0].aoData[ this[0] ];\n\t\trow._aData = data;\n\t\n\t\t// If the DOM has an id, and the data source is an array\n\t\tif ( $.isArray( data ) && row.nTr && row.nTr.id ) {\n\t\t\t_fnSetObjectDataFn( ctx[0].rowId )( data, row.nTr.id );\n\t\t}\n\t\n\t\t// Automatically invalidate\n\t\t_fnInvalidate( ctx[0], this[0], 'data' );\n\t\n\t\treturn this;\n\t} );\n\t\n\t\n\t_api_register( 'row().node()', function () {\n\t\tvar ctx = this.context;\n\t\n\t\treturn ctx.length && this.length ?\n\t\t\tctx[0].aoData[ this[0] ].nTr || null :\n\t\t\tnull;\n\t} );\n\t\n\t\n\t_api_register( 'row.add()', function ( row ) {\n\t\t// Allow a jQuery object to be passed in - only a single row is added from\n\t\t// it though - the first element in the set\n\t\tif ( row instanceof $ && row.length ) {\n\t\t\trow = row[0];\n\t\t}\n\t\n\t\tvar rows = this.iterator( 'table', function ( settings ) {\n\t\t\tif ( row.nodeName && row.nodeName.toUpperCase() === 'TR' ) {\n\t\t\t\treturn _fnAddTr( settings, row )[0];\n\t\t\t}\n\t\t\treturn _fnAddData( settings, row );\n\t\t} );\n\t\n\t\t// Return an Api.rows() extended instance, with the newly added row selected\n\t\treturn this.row( rows[0] );\n\t} );\n\t\n\t\n\t\n\tvar __details_add = function ( ctx, row, data, klass )\n\t{\n\t\t// Convert to array of TR elements\n\t\tvar rows = [];\n\t\tvar addRow = function ( r, k ) {\n\t\t\t// Recursion to allow for arrays of jQuery objects\n\t\t\tif ( $.isArray( r ) || r instanceof $ ) {\n\t\t\t\tfor ( var i=0, ien=r.length ; i<ien ; i++ ) {\n\t\t\t\t\taddRow( r[i], k );\n\t\t\t\t}\n\t\t\t\treturn;\n\t\t\t}\n\t\n\t\t\t// If we get a TR element, then just add it directly - up to the dev\n\t\t\t// to add the correct number of columns etc\n\t\t\tif ( r.nodeName && r.nodeName.toLowerCase() === 'tr' ) {\n\t\t\t\trows.push( r );\n\t\t\t}\n\t\t\telse {\n\t\t\t\t// Otherwise create a row with a wrapper\n\t\t\t\tvar created = $('<tr><td/></tr>').addClass( k );\n\t\t\t\t$('td', created)\n\t\t\t\t\t.addClass( k )\n\t\t\t\t\t.html( r )\n\t\t\t\t\t[0].colSpan = _fnVisbleColumns( ctx );\n\t\n\t\t\t\trows.push( created[0] );\n\t\t\t}\n\t\t};\n\t\n\t\taddRow( data, klass );\n\t\n\t\tif ( row._details ) {\n\t\t\trow._details.detach();\n\t\t}\n\t\n\t\trow._details = $(rows);\n\t\n\t\t// If the children were already shown, that state should be retained\n\t\tif ( row._detailsShow ) {\n\t\t\trow._details.insertAfter( row.nTr );\n\t\t}\n\t};\n\t\n\t\n\tvar __details_remove = function ( api, idx )\n\t{\n\t\tvar ctx = api.context;\n\t\n\t\tif ( ctx.length ) {\n\t\t\tvar row = ctx[0].aoData[ idx !== undefined ? idx : api[0] ];\n\t\n\t\t\tif ( row && row._details ) {\n\t\t\t\trow._details.remove();\n\t\n\t\t\t\trow._detailsShow = undefined;\n\t\t\t\trow._details = undefined;\n\t\t\t}\n\t\t}\n\t};\n\t\n\t\n\tvar __details_display = function ( api, show ) {\n\t\tvar ctx = api.context;\n\t\n\t\tif ( ctx.length && api.length ) {\n\t\t\tvar row = ctx[0].aoData[ api[0] ];\n\t\n\t\t\tif ( row._details ) {\n\t\t\t\trow._detailsShow = show;\n\t\n\t\t\t\tif ( show ) {\n\t\t\t\t\trow._details.insertAfter( row.nTr );\n\t\t\t\t}\n\t\t\t\telse {\n\t\t\t\t\trow._details.detach();\n\t\t\t\t}\n\t\n\t\t\t\t__details_events( ctx[0] );\n\t\t\t}\n\t\t}\n\t};\n\t\n\t\n\tvar __details_events = function ( settings )\n\t{\n\t\tvar api = new _Api( settings );\n\t\tvar namespace = '.dt.DT_details';\n\t\tvar drawEvent = 'draw'+namespace;\n\t\tvar colvisEvent = 'column-visibility'+namespace;\n\t\tvar destroyEvent = 'destroy'+namespace;\n\t\tvar data = settings.aoData;\n\t\n\t\tapi.off( drawEvent +' '+ colvisEvent +' '+ destroyEvent );\n\t\n\t\tif ( _pluck( data, '_details' ).length > 0 ) {\n\t\t\t// On each draw, insert the required elements into the document\n\t\t\tapi.on( drawEvent, function ( e, ctx ) {\n\t\t\t\tif ( settings !== ctx ) {\n\t\t\t\t\treturn;\n\t\t\t\t}\n\t\n\t\t\t\tapi.rows( {page:'current'} ).eq(0).each( function (idx) {\n\t\t\t\t\t// Internal data grab\n\t\t\t\t\tvar row = data[ idx ];\n\t\n\t\t\t\t\tif ( row._detailsShow ) {\n\t\t\t\t\t\trow._details.insertAfter( row.nTr );\n\t\t\t\t\t}\n\t\t\t\t} );\n\t\t\t} );\n\t\n\t\t\t// Column visibility change - update the colspan\n\t\t\tapi.on( colvisEvent, function ( e, ctx, idx, vis ) {\n\t\t\t\tif ( settings !== ctx ) {\n\t\t\t\t\treturn;\n\t\t\t\t}\n\t\n\t\t\t\t// Update the colspan for the details rows (note, only if it already has\n\t\t\t\t// a colspan)\n\t\t\t\tvar row, visible = _fnVisbleColumns( ctx );\n\t\n\t\t\t\tfor ( var i=0, ien=data.length ; i<ien ; i++ ) {\n\t\t\t\t\trow = data[i];\n\t\n\t\t\t\t\tif ( row._details ) {\n\t\t\t\t\t\trow._details.children('td[colspan]').attr('colspan', visible );\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t} );\n\t\n\t\t\t// Table destroyed - nuke any child rows\n\t\t\tapi.on( destroyEvent, function ( e, ctx ) {\n\t\t\t\tif ( settings !== ctx ) {\n\t\t\t\t\treturn;\n\t\t\t\t}\n\t\n\t\t\t\tfor ( var i=0, ien=data.length ; i<ien ; i++ ) {\n\t\t\t\t\tif ( data[i]._details ) {\n\t\t\t\t\t\t__details_remove( api, i );\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t} );\n\t\t}\n\t};\n\t\n\t// Strings for the method names to help minification\n\tvar _emp = '';\n\tvar _child_obj = _emp+'row().child';\n\tvar _child_mth = _child_obj+'()';\n\t\n\t// data can be:\n\t//  tr\n\t//  string\n\t//  jQuery or array of any of the above\n\t_api_register( _child_mth, function ( data, klass ) {\n\t\tvar ctx = this.context;\n\t\n\t\tif ( data === undefined ) {\n\t\t\t// get\n\t\t\treturn ctx.length && this.length ?\n\t\t\t\tctx[0].aoData[ this[0] ]._details :\n\t\t\t\tundefined;\n\t\t}\n\t\telse if ( data === true ) {\n\t\t\t// show\n\t\t\tthis.child.show();\n\t\t}\n\t\telse if ( data === false ) {\n\t\t\t// remove\n\t\t\t__details_remove( this );\n\t\t}\n\t\telse if ( ctx.length && this.length ) {\n\t\t\t// set\n\t\t\t__details_add( ctx[0], ctx[0].aoData[ this[0] ], data, klass );\n\t\t}\n\t\n\t\treturn this;\n\t} );\n\t\n\t\n\t_api_register( [\n\t\t_child_obj+'.show()',\n\t\t_child_mth+'.show()' // only when `child()` was called with parameters (without\n\t], function ( show ) {   // it returns an object and this method is not executed)\n\t\t__details_display( this, true );\n\t\treturn this;\n\t} );\n\t\n\t\n\t_api_register( [\n\t\t_child_obj+'.hide()',\n\t\t_child_mth+'.hide()' // only when `child()` was called with parameters (without\n\t], function () {         // it returns an object and this method is not executed)\n\t\t__details_display( this, false );\n\t\treturn this;\n\t} );\n\t\n\t\n\t_api_register( [\n\t\t_child_obj+'.remove()',\n\t\t_child_mth+'.remove()' // only when `child()` was called with parameters (without\n\t], function () {           // it returns an object and this method is not executed)\n\t\t__details_remove( this );\n\t\treturn this;\n\t} );\n\t\n\t\n\t_api_register( _child_obj+'.isShown()', function () {\n\t\tvar ctx = this.context;\n\t\n\t\tif ( ctx.length && this.length ) {\n\t\t\t// _detailsShown as false or undefined will fall through to return false\n\t\t\treturn ctx[0].aoData[ this[0] ]._detailsShow || false;\n\t\t}\n\t\treturn false;\n\t} );\n\t\n\t\n\t\n\t/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *\n\t * Columns\n\t *\n\t * {integer}           - column index (>=0 count from left, <0 count from right)\n\t * \"{integer}:visIdx\"  - visible column index (i.e. translate to column index)  (>=0 count from left, <0 count from right)\n\t * \"{integer}:visible\" - alias for {integer}:visIdx  (>=0 count from left, <0 count from right)\n\t * \"{string}:name\"     - column name\n\t * \"{string}\"          - jQuery selector on column header nodes\n\t *\n\t */\n\t\n\t// can be an array of these items, comma separated list, or an array of comma\n\t// separated lists\n\t\n\tvar __re_column_selector = /^([^:]+):(name|visIdx|visible)$/;\n\t\n\t\n\t// r1 and r2 are redundant - but it means that the parameters match for the\n\t// iterator callback in columns().data()\n\tvar __columnData = function ( settings, column, r1, r2, rows ) {\n\t\tvar a = [];\n\t\tfor ( var row=0, ien=rows.length ; row<ien ; row++ ) {\n\t\t\ta.push( _fnGetCellData( settings, rows[row], column ) );\n\t\t}\n\t\treturn a;\n\t};\n\t\n\t\n\tvar __column_selector = function ( settings, selector, opts )\n\t{\n\t\tvar\n\t\t\tcolumns = settings.aoColumns,\n\t\t\tnames = _pluck( columns, 'sName' ),\n\t\t\tnodes = _pluck( columns, 'nTh' );\n\t\n\t\tvar run = function ( s ) {\n\t\t\tvar selInt = _intVal( s );\n\t\n\t\t\t// Selector - all\n\t\t\tif ( s === '' ) {\n\t\t\t\treturn _range( columns.length );\n\t\t\t}\n\t\n\t\t\t// Selector - index\n\t\t\tif ( selInt !== null ) {\n\t\t\t\treturn [ selInt >= 0 ?\n\t\t\t\t\tselInt : // Count from left\n\t\t\t\t\tcolumns.length + selInt // Count from right (+ because its a negative value)\n\t\t\t\t];\n\t\t\t}\n\t\n\t\t\t// Selector = function\n\t\t\tif ( typeof s === 'function' ) {\n\t\t\t\tvar rows = _selector_row_indexes( settings, opts );\n\t\n\t\t\t\treturn $.map( columns, function (col, idx) {\n\t\t\t\t\treturn s(\n\t\t\t\t\t\t\tidx,\n\t\t\t\t\t\t\t__columnData( settings, idx, 0, 0, rows ),\n\t\t\t\t\t\t\tnodes[ idx ]\n\t\t\t\t\t\t) ? idx : null;\n\t\t\t\t} );\n\t\t\t}\n\t\n\t\t\t// jQuery or string selector\n\t\t\tvar match = typeof s === 'string' ?\n\t\t\t\ts.match( __re_column_selector ) :\n\t\t\t\t'';\n\t\n\t\t\tif ( match ) {\n\t\t\t\tswitch( match[2] ) {\n\t\t\t\t\tcase 'visIdx':\n\t\t\t\t\tcase 'visible':\n\t\t\t\t\t\tvar idx = parseInt( match[1], 10 );\n\t\t\t\t\t\t// Visible index given, convert to column index\n\t\t\t\t\t\tif ( idx < 0 ) {\n\t\t\t\t\t\t\t// Counting from the right\n\t\t\t\t\t\t\tvar visColumns = $.map( columns, function (col,i) {\n\t\t\t\t\t\t\t\treturn col.bVisible ? i : null;\n\t\t\t\t\t\t\t} );\n\t\t\t\t\t\t\treturn [ visColumns[ visColumns.length + idx ] ];\n\t\t\t\t\t\t}\n\t\t\t\t\t\t// Counting from the left\n\t\t\t\t\t\treturn [ _fnVisibleToColumnIndex( settings, idx ) ];\n\t\n\t\t\t\t\tcase 'name':\n\t\t\t\t\t\t// match by name. `names` is column index complete and in order\n\t\t\t\t\t\treturn $.map( names, function (name, i) {\n\t\t\t\t\t\t\treturn name === match[1] ? i : null;\n\t\t\t\t\t\t} );\n\t\n\t\t\t\t\tdefault:\n\t\t\t\t\t\treturn [];\n\t\t\t\t}\n\t\t\t}\n\t\n\t\t\t// Cell in the table body\n\t\t\tif ( s.nodeName && s._DT_CellIndex ) {\n\t\t\t\treturn [ s._DT_CellIndex.column ];\n\t\t\t}\n\t\n\t\t\t// jQuery selector on the TH elements for the columns\n\t\t\tvar jqResult = $( nodes )\n\t\t\t\t.filter( s )\n\t\t\t\t.map( function () {\n\t\t\t\t\treturn $.inArray( this, nodes ); // `nodes` is column index complete and in order\n\t\t\t\t} )\n\t\t\t\t.toArray();\n\t\n\t\t\tif ( jqResult.length || ! s.nodeName ) {\n\t\t\t\treturn jqResult;\n\t\t\t}\n\t\n\t\t\t// Otherwise a node which might have a `dt-column` data attribute, or be\n\t\t\t// a child or such an element\n\t\t\tvar host = $(s).closest('*[data-dt-column]');\n\t\t\treturn host.length ?\n\t\t\t\t[ host.data('dt-column') ] :\n\t\t\t\t[];\n\t\t};\n\t\n\t\treturn _selector_run( 'column', selector, run, settings, opts );\n\t};\n\t\n\t\n\tvar __setColumnVis = function ( settings, column, vis ) {\n\t\tvar\n\t\t\tcols = settings.aoColumns,\n\t\t\tcol  = cols[ column ],\n\t\t\tdata = settings.aoData,\n\t\t\trow, cells, i, ien, tr;\n\t\n\t\t// Get\n\t\tif ( vis === undefined ) {\n\t\t\treturn col.bVisible;\n\t\t}\n\t\n\t\t// Set\n\t\t// No change\n\t\tif ( col.bVisible === vis ) {\n\t\t\treturn;\n\t\t}\n\t\n\t\tif ( vis ) {\n\t\t\t// Insert column\n\t\t\t// Need to decide if we should use appendChild or insertBefore\n\t\t\tvar insertBefore = $.inArray( true, _pluck(cols, 'bVisible'), column+1 );\n\t\n\t\t\tfor ( i=0, ien=data.length ; i<ien ; i++ ) {\n\t\t\t\ttr = data[i].nTr;\n\t\t\t\tcells = data[i].anCells;\n\t\n\t\t\t\tif ( tr ) {\n\t\t\t\t\t// insertBefore can act like appendChild if 2nd arg is null\n\t\t\t\t\ttr.insertBefore( cells[ column ], cells[ insertBefore ] || null );\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\telse {\n\t\t\t// Remove column\n\t\t\t$( _pluck( settings.aoData, 'anCells', column ) ).detach();\n\t\t}\n\t\n\t\t// Common actions\n\t\tcol.bVisible = vis;\n\t};\n\t\n\t\n\t_api_register( 'columns()', function ( selector, opts ) {\n\t\t// argument shifting\n\t\tif ( selector === undefined ) {\n\t\t\tselector = '';\n\t\t}\n\t\telse if ( $.isPlainObject( selector ) ) {\n\t\t\topts = selector;\n\t\t\tselector = '';\n\t\t}\n\t\n\t\topts = _selector_opts( opts );\n\t\n\t\tvar inst = this.iterator( 'table', function ( settings ) {\n\t\t\treturn __column_selector( settings, selector, opts );\n\t\t}, 1 );\n\t\n\t\t// Want argument shifting here and in _row_selector?\n\t\tinst.selector.cols = selector;\n\t\tinst.selector.opts = opts;\n\t\n\t\treturn inst;\n\t} );\n\t\n\t_api_registerPlural( 'columns().header()', 'column().header()', function ( selector, opts ) {\n\t\treturn this.iterator( 'column', function ( settings, column ) {\n\t\t\treturn settings.aoColumns[column].nTh;\n\t\t}, 1 );\n\t} );\n\t\n\t_api_registerPlural( 'columns().footer()', 'column().footer()', function ( selector, opts ) {\n\t\treturn this.iterator( 'column', function ( settings, column ) {\n\t\t\treturn settings.aoColumns[column].nTf;\n\t\t}, 1 );\n\t} );\n\t\n\t_api_registerPlural( 'columns().data()', 'column().data()', function () {\n\t\treturn this.iterator( 'column-rows', __columnData, 1 );\n\t} );\n\t\n\t_api_registerPlural( 'columns().dataSrc()', 'column().dataSrc()', function () {\n\t\treturn this.iterator( 'column', function ( settings, column ) {\n\t\t\treturn settings.aoColumns[column].mData;\n\t\t}, 1 );\n\t} );\n\t\n\t_api_registerPlural( 'columns().cache()', 'column().cache()', function ( type ) {\n\t\treturn this.iterator( 'column-rows', function ( settings, column, i, j, rows ) {\n\t\t\treturn _pluck_order( settings.aoData, rows,\n\t\t\t\ttype === 'search' ? '_aFilterData' : '_aSortData', column\n\t\t\t);\n\t\t}, 1 );\n\t} );\n\t\n\t_api_registerPlural( 'columns().nodes()', 'column().nodes()', function () {\n\t\treturn this.iterator( 'column-rows', function ( settings, column, i, j, rows ) {\n\t\t\treturn _pluck_order( settings.aoData, rows, 'anCells', column ) ;\n\t\t}, 1 );\n\t} );\n\t\n\t_api_registerPlural( 'columns().visible()', 'column().visible()', function ( vis, calc ) {\n\t\tvar that = this;\n\t\tvar ret = this.iterator( 'column', function ( settings, column ) {\n\t\t\tif ( vis === undefined ) {\n\t\t\t\treturn settings.aoColumns[ column ].bVisible;\n\t\t\t} // else\n\t\t\t__setColumnVis( settings, column, vis );\n\t\t} );\n\t\n\t\t// Group the column visibility changes\n\t\tif ( vis !== undefined ) {\n\t\t\tthis.iterator( 'table', function ( settings ) {\n\t\t\t\t// Redraw the header after changes\n\t\t\t\t_fnDrawHead( settings, settings.aoHeader );\n\t\t\t\t_fnDrawHead( settings, settings.aoFooter );\n\t\t\n\t\t\t\t// Update colspan for no records display. Child rows and extensions will use their own\n\t\t\t\t// listeners to do this - only need to update the empty table item here\n\t\t\t\tif ( ! settings.aiDisplay.length ) {\n\t\t\t\t\t$(settings.nTBody).find('td[colspan]').attr('colspan', _fnVisbleColumns(settings));\n\t\t\t\t}\n\t\t\n\t\t\t\t_fnSaveState( settings );\n\t\n\t\t\t\t// Second loop once the first is done for events\n\t\t\t\tthat.iterator( 'column', function ( settings, column ) {\n\t\t\t\t\t_fnCallbackFire( settings, null, 'column-visibility', [settings, column, vis, calc] );\n\t\t\t\t} );\n\t\n\t\t\t\tif ( calc === undefined || calc ) {\n\t\t\t\t\tthat.columns.adjust();\n\t\t\t\t}\n\t\t\t});\n\t\t}\n\t\n\t\treturn ret;\n\t} );\n\t\n\t_api_registerPlural( 'columns().indexes()', 'column().index()', function ( type ) {\n\t\treturn this.iterator( 'column', function ( settings, column ) {\n\t\t\treturn type === 'visible' ?\n\t\t\t\t_fnColumnIndexToVisible( settings, column ) :\n\t\t\t\tcolumn;\n\t\t}, 1 );\n\t} );\n\t\n\t_api_register( 'columns.adjust()', function () {\n\t\treturn this.iterator( 'table', function ( settings ) {\n\t\t\t_fnAdjustColumnSizing( settings );\n\t\t}, 1 );\n\t} );\n\t\n\t_api_register( 'column.index()', function ( type, idx ) {\n\t\tif ( this.context.length !== 0 ) {\n\t\t\tvar ctx = this.context[0];\n\t\n\t\t\tif ( type === 'fromVisible' || type === 'toData' ) {\n\t\t\t\treturn _fnVisibleToColumnIndex( ctx, idx );\n\t\t\t}\n\t\t\telse if ( type === 'fromData' || type === 'toVisible' ) {\n\t\t\t\treturn _fnColumnIndexToVisible( ctx, idx );\n\t\t\t}\n\t\t}\n\t} );\n\t\n\t_api_register( 'column()', function ( selector, opts ) {\n\t\treturn _selector_first( this.columns( selector, opts ) );\n\t} );\n\t\n\t\n\t\n\tvar __cell_selector = function ( settings, selector, opts )\n\t{\n\t\tvar data = settings.aoData;\n\t\tvar rows = _selector_row_indexes( settings, opts );\n\t\tvar cells = _removeEmpty( _pluck_order( data, rows, 'anCells' ) );\n\t\tvar allCells = $( [].concat.apply([], cells) );\n\t\tvar row;\n\t\tvar columns = settings.aoColumns.length;\n\t\tvar a, i, ien, j, o, host;\n\t\n\t\tvar run = function ( s ) {\n\t\t\tvar fnSelector = typeof s === 'function';\n\t\n\t\t\tif ( s === null || s === undefined || fnSelector ) {\n\t\t\t\t// All cells and function selectors\n\t\t\t\ta = [];\n\t\n\t\t\t\tfor ( i=0, ien=rows.length ; i<ien ; i++ ) {\n\t\t\t\t\trow = rows[i];\n\t\n\t\t\t\t\tfor ( j=0 ; j<columns ; j++ ) {\n\t\t\t\t\t\to = {\n\t\t\t\t\t\t\trow: row,\n\t\t\t\t\t\t\tcolumn: j\n\t\t\t\t\t\t};\n\t\n\t\t\t\t\t\tif ( fnSelector ) {\n\t\t\t\t\t\t\t// Selector - function\n\t\t\t\t\t\t\thost = data[ row ];\n\t\n\t\t\t\t\t\t\tif ( s( o, _fnGetCellData(settings, row, j), host.anCells ? host.anCells[j] : null ) ) {\n\t\t\t\t\t\t\t\ta.push( o );\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t\telse {\n\t\t\t\t\t\t\t// Selector - all\n\t\t\t\t\t\t\ta.push( o );\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\t\n\t\t\t\treturn a;\n\t\t\t}\n\t\t\t\n\t\t\t// Selector - index\n\t\t\tif ( $.isPlainObject( s ) ) {\n\t\t\t\t// Valid cell index and its in the array of selectable rows\n\t\t\t\treturn s.column !== undefined && s.row !== undefined && $.inArray( s.row, rows ) !== -1 ?\n\t\t\t\t\t[s] :\n\t\t\t\t\t[];\n\t\t\t}\n\t\n\t\t\t// Selector - jQuery filtered cells\n\t\t\tvar jqResult = allCells\n\t\t\t\t.filter( s )\n\t\t\t\t.map( function (i, el) {\n\t\t\t\t\treturn { // use a new object, in case someone changes the values\n\t\t\t\t\t\trow:    el._DT_CellIndex.row,\n\t\t\t\t\t\tcolumn: el._DT_CellIndex.column\n\t \t\t\t\t};\n\t\t\t\t} )\n\t\t\t\t.toArray();\n\t\n\t\t\tif ( jqResult.length || ! s.nodeName ) {\n\t\t\t\treturn jqResult;\n\t\t\t}\n\t\n\t\t\t// Otherwise the selector is a node, and there is one last option - the\n\t\t\t// element might be a child of an element which has dt-row and dt-column\n\t\t\t// data attributes\n\t\t\thost = $(s).closest('*[data-dt-row]');\n\t\t\treturn host.length ?\n\t\t\t\t[ {\n\t\t\t\t\trow: host.data('dt-row'),\n\t\t\t\t\tcolumn: host.data('dt-column')\n\t\t\t\t} ] :\n\t\t\t\t[];\n\t\t};\n\t\n\t\treturn _selector_run( 'cell', selector, run, settings, opts );\n\t};\n\t\n\t\n\t\n\t\n\t_api_register( 'cells()', function ( rowSelector, columnSelector, opts ) {\n\t\t// Argument shifting\n\t\tif ( $.isPlainObject( rowSelector ) ) {\n\t\t\t// Indexes\n\t\t\tif ( rowSelector.row === undefined ) {\n\t\t\t\t// Selector options in first parameter\n\t\t\t\topts = rowSelector;\n\t\t\t\trowSelector = null;\n\t\t\t}\n\t\t\telse {\n\t\t\t\t// Cell index objects in first parameter\n\t\t\t\topts = columnSelector;\n\t\t\t\tcolumnSelector = null;\n\t\t\t}\n\t\t}\n\t\tif ( $.isPlainObject( columnSelector ) ) {\n\t\t\topts = columnSelector;\n\t\t\tcolumnSelector = null;\n\t\t}\n\t\n\t\t// Cell selector\n\t\tif ( columnSelector === null || columnSelector === undefined ) {\n\t\t\treturn this.iterator( 'table', function ( settings ) {\n\t\t\t\treturn __cell_selector( settings, rowSelector, _selector_opts( opts ) );\n\t\t\t} );\n\t\t}\n\t\n\t\t// The default built in options need to apply to row and columns\n\t\tvar internalOpts = opts ? {\n\t\t\tpage: opts.page,\n\t\t\torder: opts.order,\n\t\t\tsearch: opts.search\n\t\t} : {};\n\t\n\t\t// Row + column selector\n\t\tvar columns = this.columns( columnSelector, internalOpts );\n\t\tvar rows = this.rows( rowSelector, internalOpts );\n\t\tvar i, ien, j, jen;\n\t\n\t\tvar cellsNoOpts = this.iterator( 'table', function ( settings, idx ) {\n\t\t\tvar a = [];\n\t\n\t\t\tfor ( i=0, ien=rows[idx].length ; i<ien ; i++ ) {\n\t\t\t\tfor ( j=0, jen=columns[idx].length ; j<jen ; j++ ) {\n\t\t\t\t\ta.push( {\n\t\t\t\t\t\trow:    rows[idx][i],\n\t\t\t\t\t\tcolumn: columns[idx][j]\n\t\t\t\t\t} );\n\t\t\t\t}\n\t\t\t}\n\t\n\t\t\treturn a;\n\t\t}, 1 );\n\t\n\t\t// There is currently only one extension which uses a cell selector extension\n\t\t// It is a _major_ performance drag to run this if it isn't needed, so this is\n\t\t// an extension specific check at the moment\n\t\tvar cells = opts && opts.selected ?\n\t\t\tthis.cells( cellsNoOpts, opts ) :\n\t\t\tcellsNoOpts;\n\t\n\t\t$.extend( cells.selector, {\n\t\t\tcols: columnSelector,\n\t\t\trows: rowSelector,\n\t\t\topts: opts\n\t\t} );\n\t\n\t\treturn cells;\n\t} );\n\t\n\t\n\t_api_registerPlural( 'cells().nodes()', 'cell().node()', function () {\n\t\treturn this.iterator( 'cell', function ( settings, row, column ) {\n\t\t\tvar data = settings.aoData[ row ];\n\t\n\t\t\treturn data && data.anCells ?\n\t\t\t\tdata.anCells[ column ] :\n\t\t\t\tundefined;\n\t\t}, 1 );\n\t} );\n\t\n\t\n\t_api_register( 'cells().data()', function () {\n\t\treturn this.iterator( 'cell', function ( settings, row, column ) {\n\t\t\treturn _fnGetCellData( settings, row, column );\n\t\t}, 1 );\n\t} );\n\t\n\t\n\t_api_registerPlural( 'cells().cache()', 'cell().cache()', function ( type ) {\n\t\ttype = type === 'search' ? '_aFilterData' : '_aSortData';\n\t\n\t\treturn this.iterator( 'cell', function ( settings, row, column ) {\n\t\t\treturn settings.aoData[ row ][ type ][ column ];\n\t\t}, 1 );\n\t} );\n\t\n\t\n\t_api_registerPlural( 'cells().render()', 'cell().render()', function ( type ) {\n\t\treturn this.iterator( 'cell', function ( settings, row, column ) {\n\t\t\treturn _fnGetCellData( settings, row, column, type );\n\t\t}, 1 );\n\t} );\n\t\n\t\n\t_api_registerPlural( 'cells().indexes()', 'cell().index()', function () {\n\t\treturn this.iterator( 'cell', function ( settings, row, column ) {\n\t\t\treturn {\n\t\t\t\trow: row,\n\t\t\t\tcolumn: column,\n\t\t\t\tcolumnVisible: _fnColumnIndexToVisible( settings, column )\n\t\t\t};\n\t\t}, 1 );\n\t} );\n\t\n\t\n\t_api_registerPlural( 'cells().invalidate()', 'cell().invalidate()', function ( src ) {\n\t\treturn this.iterator( 'cell', function ( settings, row, column ) {\n\t\t\t_fnInvalidate( settings, row, src, column );\n\t\t} );\n\t} );\n\t\n\t\n\t\n\t_api_register( 'cell()', function ( rowSelector, columnSelector, opts ) {\n\t\treturn _selector_first( this.cells( rowSelector, columnSelector, opts ) );\n\t} );\n\t\n\t\n\t_api_register( 'cell().data()', function ( data ) {\n\t\tvar ctx = this.context;\n\t\tvar cell = this[0];\n\t\n\t\tif ( data === undefined ) {\n\t\t\t// Get\n\t\t\treturn ctx.length && cell.length ?\n\t\t\t\t_fnGetCellData( ctx[0], cell[0].row, cell[0].column ) :\n\t\t\t\tundefined;\n\t\t}\n\t\n\t\t// Set\n\t\t_fnSetCellData( ctx[0], cell[0].row, cell[0].column, data );\n\t\t_fnInvalidate( ctx[0], cell[0].row, 'data', cell[0].column );\n\t\n\t\treturn this;\n\t} );\n\t\n\t\n\t\n\t/**\n\t * Get current ordering (sorting) that has been applied to the table.\n\t *\n\t * @returns {array} 2D array containing the sorting information for the first\n\t *   table in the current context. Each element in the parent array represents\n\t *   a column being sorted upon (i.e. multi-sorting with two columns would have\n\t *   2 inner arrays). The inner arrays may have 2 or 3 elements. The first is\n\t *   the column index that the sorting condition applies to, the second is the\n\t *   direction of the sort (`desc` or `asc`) and, optionally, the third is the\n\t *   index of the sorting order from the `column.sorting` initialisation array.\n\t *//**\n\t * Set the ordering for the table.\n\t *\n\t * @param {integer} order Column index to sort upon.\n\t * @param {string} direction Direction of the sort to be applied (`asc` or `desc`)\n\t * @returns {DataTables.Api} this\n\t *//**\n\t * Set the ordering for the table.\n\t *\n\t * @param {array} order 1D array of sorting information to be applied.\n\t * @param {array} [...] Optional additional sorting conditions\n\t * @returns {DataTables.Api} this\n\t *//**\n\t * Set the ordering for the table.\n\t *\n\t * @param {array} order 2D array of sorting information to be applied.\n\t * @returns {DataTables.Api} this\n\t */\n\t_api_register( 'order()', function ( order, dir ) {\n\t\tvar ctx = this.context;\n\t\n\t\tif ( order === undefined ) {\n\t\t\t// get\n\t\t\treturn ctx.length !== 0 ?\n\t\t\t\tctx[0].aaSorting :\n\t\t\t\tundefined;\n\t\t}\n\t\n\t\t// set\n\t\tif ( typeof order === 'number' ) {\n\t\t\t// Simple column / direction passed in\n\t\t\torder = [ [ order, dir ] ];\n\t\t}\n\t\telse if ( order.length && ! $.isArray( order[0] ) ) {\n\t\t\t// Arguments passed in (list of 1D arrays)\n\t\t\torder = Array.prototype.slice.call( arguments );\n\t\t}\n\t\t// otherwise a 2D array was passed in\n\t\n\t\treturn this.iterator( 'table', function ( settings ) {\n\t\t\tsettings.aaSorting = order.slice();\n\t\t} );\n\t} );\n\t\n\t\n\t/**\n\t * Attach a sort listener to an element for a given column\n\t *\n\t * @param {node|jQuery|string} node Identifier for the element(s) to attach the\n\t *   listener to. This can take the form of a single DOM node, a jQuery\n\t *   collection of nodes or a jQuery selector which will identify the node(s).\n\t * @param {integer} column the column that a click on this node will sort on\n\t * @param {function} [callback] callback function when sort is run\n\t * @returns {DataTables.Api} this\n\t */\n\t_api_register( 'order.listener()', function ( node, column, callback ) {\n\t\treturn this.iterator( 'table', function ( settings ) {\n\t\t\t_fnSortAttachListener( settings, node, column, callback );\n\t\t} );\n\t} );\n\t\n\t\n\t_api_register( 'order.fixed()', function ( set ) {\n\t\tif ( ! set ) {\n\t\t\tvar ctx = this.context;\n\t\t\tvar fixed = ctx.length ?\n\t\t\t\tctx[0].aaSortingFixed :\n\t\t\t\tundefined;\n\t\n\t\t\treturn $.isArray( fixed ) ?\n\t\t\t\t{ pre: fixed } :\n\t\t\t\tfixed;\n\t\t}\n\t\n\t\treturn this.iterator( 'table', function ( settings ) {\n\t\t\tsettings.aaSortingFixed = $.extend( true, {}, set );\n\t\t} );\n\t} );\n\t\n\t\n\t// Order by the selected column(s)\n\t_api_register( [\n\t\t'columns().order()',\n\t\t'column().order()'\n\t], function ( dir ) {\n\t\tvar that = this;\n\t\n\t\treturn this.iterator( 'table', function ( settings, i ) {\n\t\t\tvar sort = [];\n\t\n\t\t\t$.each( that[i], function (j, col) {\n\t\t\t\tsort.push( [ col, dir ] );\n\t\t\t} );\n\t\n\t\t\tsettings.aaSorting = sort;\n\t\t} );\n\t} );\n\t\n\t\n\t\n\t_api_register( 'search()', function ( input, regex, smart, caseInsen ) {\n\t\tvar ctx = this.context;\n\t\n\t\tif ( input === undefined ) {\n\t\t\t// get\n\t\t\treturn ctx.length !== 0 ?\n\t\t\t\tctx[0].oPreviousSearch.sSearch :\n\t\t\t\tundefined;\n\t\t}\n\t\n\t\t// set\n\t\treturn this.iterator( 'table', function ( settings ) {\n\t\t\tif ( ! settings.oFeatures.bFilter ) {\n\t\t\t\treturn;\n\t\t\t}\n\t\n\t\t\t_fnFilterComplete( settings, $.extend( {}, settings.oPreviousSearch, {\n\t\t\t\t\"sSearch\": input+\"\",\n\t\t\t\t\"bRegex\":  regex === null ? false : regex,\n\t\t\t\t\"bSmart\":  smart === null ? true  : smart,\n\t\t\t\t\"bCaseInsensitive\": caseInsen === null ? true : caseInsen\n\t\t\t} ), 1 );\n\t\t} );\n\t} );\n\t\n\t\n\t_api_registerPlural(\n\t\t'columns().search()',\n\t\t'column().search()',\n\t\tfunction ( input, regex, smart, caseInsen ) {\n\t\t\treturn this.iterator( 'column', function ( settings, column ) {\n\t\t\t\tvar preSearch = settings.aoPreSearchCols;\n\t\n\t\t\t\tif ( input === undefined ) {\n\t\t\t\t\t// get\n\t\t\t\t\treturn preSearch[ column ].sSearch;\n\t\t\t\t}\n\t\n\t\t\t\t// set\n\t\t\t\tif ( ! settings.oFeatures.bFilter ) {\n\t\t\t\t\treturn;\n\t\t\t\t}\n\t\n\t\t\t\t$.extend( preSearch[ column ], {\n\t\t\t\t\t\"sSearch\": input+\"\",\n\t\t\t\t\t\"bRegex\":  regex === null ? false : regex,\n\t\t\t\t\t\"bSmart\":  smart === null ? true  : smart,\n\t\t\t\t\t\"bCaseInsensitive\": caseInsen === null ? true : caseInsen\n\t\t\t\t} );\n\t\n\t\t\t\t_fnFilterComplete( settings, settings.oPreviousSearch, 1 );\n\t\t\t} );\n\t\t}\n\t);\n\t\n\t/*\n\t * State API methods\n\t */\n\t\n\t_api_register( 'state()', function () {\n\t\treturn this.context.length ?\n\t\t\tthis.context[0].oSavedState :\n\t\t\tnull;\n\t} );\n\t\n\t\n\t_api_register( 'state.clear()', function () {\n\t\treturn this.iterator( 'table', function ( settings ) {\n\t\t\t// Save an empty object\n\t\t\tsettings.fnStateSaveCallback.call( settings.oInstance, settings, {} );\n\t\t} );\n\t} );\n\t\n\t\n\t_api_register( 'state.loaded()', function () {\n\t\treturn this.context.length ?\n\t\t\tthis.context[0].oLoadedState :\n\t\t\tnull;\n\t} );\n\t\n\t\n\t_api_register( 'state.save()', function () {\n\t\treturn this.iterator( 'table', function ( settings ) {\n\t\t\t_fnSaveState( settings );\n\t\t} );\n\t} );\n\t\n\t\n\t\n\t/**\n\t * Provide a common method for plug-ins to check the version of DataTables being\n\t * used, in order to ensure compatibility.\n\t *\n\t *  @param {string} version Version string to check for, in the format \"X.Y.Z\".\n\t *    Note that the formats \"X\" and \"X.Y\" are also acceptable.\n\t *  @returns {boolean} true if this version of DataTables is greater or equal to\n\t *    the required version, or false if this version of DataTales is not\n\t *    suitable\n\t *  @static\n\t *  @dtopt API-Static\n\t *\n\t *  @example\n\t *    alert( $.fn.dataTable.versionCheck( '1.9.0' ) );\n\t */\n\tDataTable.versionCheck = DataTable.fnVersionCheck = function( version )\n\t{\n\t\tvar aThis = DataTable.version.split('.');\n\t\tvar aThat = version.split('.');\n\t\tvar iThis, iThat;\n\t\n\t\tfor ( var i=0, iLen=aThat.length ; i<iLen ; i++ ) {\n\t\t\tiThis = parseInt( aThis[i], 10 ) || 0;\n\t\t\tiThat = parseInt( aThat[i], 10 ) || 0;\n\t\n\t\t\t// Parts are the same, keep comparing\n\t\t\tif (iThis === iThat) {\n\t\t\t\tcontinue;\n\t\t\t}\n\t\n\t\t\t// Parts are different, return immediately\n\t\t\treturn iThis > iThat;\n\t\t}\n\t\n\t\treturn true;\n\t};\n\t\n\t\n\t/**\n\t * Check if a `<table>` node is a DataTable table already or not.\n\t *\n\t *  @param {node|jquery|string} table Table node, jQuery object or jQuery\n\t *      selector for the table to test. Note that if more than more than one\n\t *      table is passed on, only the first will be checked\n\t *  @returns {boolean} true the table given is a DataTable, or false otherwise\n\t *  @static\n\t *  @dtopt API-Static\n\t *\n\t *  @example\n\t *    if ( ! $.fn.DataTable.isDataTable( '#example' ) ) {\n\t *      $('#example').dataTable();\n\t *    }\n\t */\n\tDataTable.isDataTable = DataTable.fnIsDataTable = function ( table )\n\t{\n\t\tvar t = $(table).get(0);\n\t\tvar is = false;\n\t\n\t\tif ( table instanceof DataTable.Api ) {\n\t\t\treturn true;\n\t\t}\n\t\n\t\t$.each( DataTable.settings, function (i, o) {\n\t\t\tvar head = o.nScrollHead ? $('table', o.nScrollHead)[0] : null;\n\t\t\tvar foot = o.nScrollFoot ? $('table', o.nScrollFoot)[0] : null;\n\t\n\t\t\tif ( o.nTable === t || head === t || foot === t ) {\n\t\t\t\tis = true;\n\t\t\t}\n\t\t} );\n\t\n\t\treturn is;\n\t};\n\t\n\t\n\t/**\n\t * Get all DataTable tables that have been initialised - optionally you can\n\t * select to get only currently visible tables.\n\t *\n\t *  @param {boolean} [visible=false] Flag to indicate if you want all (default)\n\t *    or visible tables only.\n\t *  @returns {array} Array of `table` nodes (not DataTable instances) which are\n\t *    DataTables\n\t *  @static\n\t *  @dtopt API-Static\n\t *\n\t *  @example\n\t *    $.each( $.fn.dataTable.tables(true), function () {\n\t *      $(table).DataTable().columns.adjust();\n\t *    } );\n\t */\n\tDataTable.tables = DataTable.fnTables = function ( visible )\n\t{\n\t\tvar api = false;\n\t\n\t\tif ( $.isPlainObject( visible ) ) {\n\t\t\tapi = visible.api;\n\t\t\tvisible = visible.visible;\n\t\t}\n\t\n\t\tvar a = $.map( DataTable.settings, function (o) {\n\t\t\tif ( !visible || (visible && $(o.nTable).is(':visible')) ) {\n\t\t\t\treturn o.nTable;\n\t\t\t}\n\t\t} );\n\t\n\t\treturn api ?\n\t\t\tnew _Api( a ) :\n\t\t\ta;\n\t};\n\t\n\t\n\t/**\n\t * Convert from camel case parameters to Hungarian notation. This is made public\n\t * for the extensions to provide the same ability as DataTables core to accept\n\t * either the 1.9 style Hungarian notation, or the 1.10+ style camelCase\n\t * parameters.\n\t *\n\t *  @param {object} src The model object which holds all parameters that can be\n\t *    mapped.\n\t *  @param {object} user The object to convert from camel case to Hungarian.\n\t *  @param {boolean} force When set to `true`, properties which already have a\n\t *    Hungarian value in the `user` object will be overwritten. Otherwise they\n\t *    won't be.\n\t */\n\tDataTable.camelToHungarian = _fnCamelToHungarian;\n\t\n\t\n\t\n\t/**\n\t *\n\t */\n\t_api_register( '$()', function ( selector, opts ) {\n\t\tvar\n\t\t\trows   = this.rows( opts ).nodes(), // Get all rows\n\t\t\tjqRows = $(rows);\n\t\n\t\treturn $( [].concat(\n\t\t\tjqRows.filter( selector ).toArray(),\n\t\t\tjqRows.find( selector ).toArray()\n\t\t) );\n\t} );\n\t\n\t\n\t// jQuery functions to operate on the tables\n\t$.each( [ 'on', 'one', 'off' ], function (i, key) {\n\t\t_api_register( key+'()', function ( /* event, handler */ ) {\n\t\t\tvar args = Array.prototype.slice.call(arguments);\n\t\n\t\t\t// Add the `dt` namespace automatically if it isn't already present\n\t\t\targs[0] = $.map( args[0].split( /\\s/ ), function ( e ) {\n\t\t\t\treturn ! e.match(/\\.dt\\b/) ?\n\t\t\t\t\te+'.dt' :\n\t\t\t\t\te;\n\t\t\t\t} ).join( ' ' );\n\t\n\t\t\tvar inst = $( this.tables().nodes() );\n\t\t\tinst[key].apply( inst, args );\n\t\t\treturn this;\n\t\t} );\n\t} );\n\t\n\t\n\t_api_register( 'clear()', function () {\n\t\treturn this.iterator( 'table', function ( settings ) {\n\t\t\t_fnClearTable( settings );\n\t\t} );\n\t} );\n\t\n\t\n\t_api_register( 'settings()', function () {\n\t\treturn new _Api( this.context, this.context );\n\t} );\n\t\n\t\n\t_api_register( 'init()', function () {\n\t\tvar ctx = this.context;\n\t\treturn ctx.length ? ctx[0].oInit : null;\n\t} );\n\t\n\t\n\t_api_register( 'data()', function () {\n\t\treturn this.iterator( 'table', function ( settings ) {\n\t\t\treturn _pluck( settings.aoData, '_aData' );\n\t\t} ).flatten();\n\t} );\n\t\n\t\n\t_api_register( 'destroy()', function ( remove ) {\n\t\tremove = remove || false;\n\t\n\t\treturn this.iterator( 'table', function ( settings ) {\n\t\t\tvar orig      = settings.nTableWrapper.parentNode;\n\t\t\tvar classes   = settings.oClasses;\n\t\t\tvar table     = settings.nTable;\n\t\t\tvar tbody     = settings.nTBody;\n\t\t\tvar thead     = settings.nTHead;\n\t\t\tvar tfoot     = settings.nTFoot;\n\t\t\tvar jqTable   = $(table);\n\t\t\tvar jqTbody   = $(tbody);\n\t\t\tvar jqWrapper = $(settings.nTableWrapper);\n\t\t\tvar rows      = $.map( settings.aoData, function (r) { return r.nTr; } );\n\t\t\tvar i, ien;\n\t\n\t\t\t// Flag to note that the table is currently being destroyed - no action\n\t\t\t// should be taken\n\t\t\tsettings.bDestroying = true;\n\t\n\t\t\t// Fire off the destroy callbacks for plug-ins etc\n\t\t\t_fnCallbackFire( settings, \"aoDestroyCallback\", \"destroy\", [settings] );\n\t\n\t\t\t// If not being removed from the document, make all columns visible\n\t\t\tif ( ! remove ) {\n\t\t\t\tnew _Api( settings ).columns().visible( true );\n\t\t\t}\n\t\n\t\t\t// Blitz all `DT` namespaced events (these are internal events, the\n\t\t\t// lowercase, `dt` events are user subscribed and they are responsible\n\t\t\t// for removing them\n\t\t\tjqWrapper.off('.DT').find(':not(tbody *)').off('.DT');\n\t\t\t$(window).off('.DT-'+settings.sInstance);\n\t\n\t\t\t// When scrolling we had to break the table up - restore it\n\t\t\tif ( table != thead.parentNode ) {\n\t\t\t\tjqTable.children('thead').detach();\n\t\t\t\tjqTable.append( thead );\n\t\t\t}\n\t\n\t\t\tif ( tfoot && table != tfoot.parentNode ) {\n\t\t\t\tjqTable.children('tfoot').detach();\n\t\t\t\tjqTable.append( tfoot );\n\t\t\t}\n\t\n\t\t\tsettings.aaSorting = [];\n\t\t\tsettings.aaSortingFixed = [];\n\t\t\t_fnSortingClasses( settings );\n\t\n\t\t\t$( rows ).removeClass( settings.asStripeClasses.join(' ') );\n\t\n\t\t\t$('th, td', thead).removeClass( classes.sSortable+' '+\n\t\t\t\tclasses.sSortableAsc+' '+classes.sSortableDesc+' '+classes.sSortableNone\n\t\t\t);\n\t\n\t\t\t// Add the TR elements back into the table in their original order\n\t\t\tjqTbody.children().detach();\n\t\t\tjqTbody.append( rows );\n\t\n\t\t\t// Remove the DataTables generated nodes, events and classes\n\t\t\tvar removedMethod = remove ? 'remove' : 'detach';\n\t\t\tjqTable[ removedMethod ]();\n\t\t\tjqWrapper[ removedMethod ]();\n\t\n\t\t\t// If we need to reattach the table to the document\n\t\t\tif ( ! remove && orig ) {\n\t\t\t\t// insertBefore acts like appendChild if !arg[1]\n\t\t\t\torig.insertBefore( table, settings.nTableReinsertBefore );\n\t\n\t\t\t\t// Restore the width of the original table - was read from the style property,\n\t\t\t\t// so we can restore directly to that\n\t\t\t\tjqTable\n\t\t\t\t\t.css( 'width', settings.sDestroyWidth )\n\t\t\t\t\t.removeClass( classes.sTable );\n\t\n\t\t\t\t// If the were originally stripe classes - then we add them back here.\n\t\t\t\t// Note this is not fool proof (for example if not all rows had stripe\n\t\t\t\t// classes - but it's a good effort without getting carried away\n\t\t\t\tien = settings.asDestroyStripes.length;\n\t\n\t\t\t\tif ( ien ) {\n\t\t\t\t\tjqTbody.children().each( function (i) {\n\t\t\t\t\t\t$(this).addClass( settings.asDestroyStripes[i % ien] );\n\t\t\t\t\t} );\n\t\t\t\t}\n\t\t\t}\n\t\n\t\t\t/* Remove the settings object from the settings array */\n\t\t\tvar idx = $.inArray( settings, DataTable.settings );\n\t\t\tif ( idx !== -1 ) {\n\t\t\t\tDataTable.settings.splice( idx, 1 );\n\t\t\t}\n\t\t} );\n\t} );\n\t\n\t\n\t// Add the `every()` method for rows, columns and cells in a compact form\n\t$.each( [ 'column', 'row', 'cell' ], function ( i, type ) {\n\t\t_api_register( type+'s().every()', function ( fn ) {\n\t\t\tvar opts = this.selector.opts;\n\t\t\tvar api = this;\n\t\n\t\t\treturn this.iterator( type, function ( settings, arg1, arg2, arg3, arg4 ) {\n\t\t\t\t// Rows and columns:\n\t\t\t\t//  arg1 - index\n\t\t\t\t//  arg2 - table counter\n\t\t\t\t//  arg3 - loop counter\n\t\t\t\t//  arg4 - undefined\n\t\t\t\t// Cells:\n\t\t\t\t//  arg1 - row index\n\t\t\t\t//  arg2 - column index\n\t\t\t\t//  arg3 - table counter\n\t\t\t\t//  arg4 - loop counter\n\t\t\t\tfn.call(\n\t\t\t\t\tapi[ type ](\n\t\t\t\t\t\targ1,\n\t\t\t\t\t\ttype==='cell' ? arg2 : opts,\n\t\t\t\t\t\ttype==='cell' ? opts : undefined\n\t\t\t\t\t),\n\t\t\t\t\targ1, arg2, arg3, arg4\n\t\t\t\t);\n\t\t\t} );\n\t\t} );\n\t} );\n\t\n\t\n\t// i18n method for extensions to be able to use the language object from the\n\t// DataTable\n\t_api_register( 'i18n()', function ( token, def, plural ) {\n\t\tvar ctx = this.context[0];\n\t\tvar resolved = _fnGetObjectDataFn( token )( ctx.oLanguage );\n\t\n\t\tif ( resolved === undefined ) {\n\t\t\tresolved = def;\n\t\t}\n\t\n\t\tif ( plural !== undefined && $.isPlainObject( resolved ) ) {\n\t\t\tresolved = resolved[ plural ] !== undefined ?\n\t\t\t\tresolved[ plural ] :\n\t\t\t\tresolved._;\n\t\t}\n\t\n\t\treturn resolved.replace( '%d', plural ); // nb: plural might be undefined,\n\t} );\n\t/**\n\t * Version string for plug-ins to check compatibility. Allowed format is\n\t * `a.b.c-d` where: a:int, b:int, c:int, d:string(dev|beta|alpha). `d` is used\n\t * only for non-release builds. See http://semver.org/ for more information.\n\t *  @member\n\t *  @type string\n\t *  @default Version number\n\t */\n\tDataTable.version = \"1.10.21\";\n\n\t/**\n\t * Private data store, containing all of the settings objects that are\n\t * created for the tables on a given page.\n\t *\n\t * Note that the `DataTable.settings` object is aliased to\n\t * `jQuery.fn.dataTableExt` through which it may be accessed and\n\t * manipulated, or `jQuery.fn.dataTable.settings`.\n\t *  @member\n\t *  @type array\n\t *  @default []\n\t *  @private\n\t */\n\tDataTable.settings = [];\n\n\t/**\n\t * Object models container, for the various models that DataTables has\n\t * available to it. These models define the objects that are used to hold\n\t * the active state and configuration of the table.\n\t *  @namespace\n\t */\n\tDataTable.models = {};\n\t\n\t\n\t\n\t/**\n\t * Template object for the way in which DataTables holds information about\n\t * search information for the global filter and individual column filters.\n\t *  @namespace\n\t */\n\tDataTable.models.oSearch = {\n\t\t/**\n\t\t * Flag to indicate if the filtering should be case insensitive or not\n\t\t *  @type boolean\n\t\t *  @default true\n\t\t */\n\t\t\"bCaseInsensitive\": true,\n\t\n\t\t/**\n\t\t * Applied search term\n\t\t *  @type string\n\t\t *  @default <i>Empty string</i>\n\t\t */\n\t\t\"sSearch\": \"\",\n\t\n\t\t/**\n\t\t * Flag to indicate if the search term should be interpreted as a\n\t\t * regular expression (true) or not (false) and therefore and special\n\t\t * regex characters escaped.\n\t\t *  @type boolean\n\t\t *  @default false\n\t\t */\n\t\t\"bRegex\": false,\n\t\n\t\t/**\n\t\t * Flag to indicate if DataTables is to use its smart filtering or not.\n\t\t *  @type boolean\n\t\t *  @default true\n\t\t */\n\t\t\"bSmart\": true\n\t};\n\t\n\t\n\t\n\t\n\t/**\n\t * Template object for the way in which DataTables holds information about\n\t * each individual row. This is the object format used for the settings\n\t * aoData array.\n\t *  @namespace\n\t */\n\tDataTable.models.oRow = {\n\t\t/**\n\t\t * TR element for the row\n\t\t *  @type node\n\t\t *  @default null\n\t\t */\n\t\t\"nTr\": null,\n\t\n\t\t/**\n\t\t * Array of TD elements for each row. This is null until the row has been\n\t\t * created.\n\t\t *  @type array nodes\n\t\t *  @default []\n\t\t */\n\t\t\"anCells\": null,\n\t\n\t\t/**\n\t\t * Data object from the original data source for the row. This is either\n\t\t * an array if using the traditional form of DataTables, or an object if\n\t\t * using mData options. The exact type will depend on the passed in\n\t\t * data from the data source, or will be an array if using DOM a data\n\t\t * source.\n\t\t *  @type array|object\n\t\t *  @default []\n\t\t */\n\t\t\"_aData\": [],\n\t\n\t\t/**\n\t\t * Sorting data cache - this array is ostensibly the same length as the\n\t\t * number of columns (although each index is generated only as it is\n\t\t * needed), and holds the data that is used for sorting each column in the\n\t\t * row. We do this cache generation at the start of the sort in order that\n\t\t * the formatting of the sort data need be done only once for each cell\n\t\t * per sort. This array should not be read from or written to by anything\n\t\t * other than the master sorting methods.\n\t\t *  @type array\n\t\t *  @default null\n\t\t *  @private\n\t\t */\n\t\t\"_aSortData\": null,\n\t\n\t\t/**\n\t\t * Per cell filtering data cache. As per the sort data cache, used to\n\t\t * increase the performance of the filtering in DataTables\n\t\t *  @type array\n\t\t *  @default null\n\t\t *  @private\n\t\t */\n\t\t\"_aFilterData\": null,\n\t\n\t\t/**\n\t\t * Filtering data cache. This is the same as the cell filtering cache, but\n\t\t * in this case a string rather than an array. This is easily computed with\n\t\t * a join on `_aFilterData`, but is provided as a cache so the join isn't\n\t\t * needed on every search (memory traded for performance)\n\t\t *  @type array\n\t\t *  @default null\n\t\t *  @private\n\t\t */\n\t\t\"_sFilterRow\": null,\n\t\n\t\t/**\n\t\t * Cache of the class name that DataTables has applied to the row, so we\n\t\t * can quickly look at this variable rather than needing to do a DOM check\n\t\t * on className for the nTr property.\n\t\t *  @type string\n\t\t *  @default <i>Empty string</i>\n\t\t *  @private\n\t\t */\n\t\t\"_sRowStripe\": \"\",\n\t\n\t\t/**\n\t\t * Denote if the original data source was from the DOM, or the data source\n\t\t * object. This is used for invalidating data, so DataTables can\n\t\t * automatically read data from the original source, unless uninstructed\n\t\t * otherwise.\n\t\t *  @type string\n\t\t *  @default null\n\t\t *  @private\n\t\t */\n\t\t\"src\": null,\n\t\n\t\t/**\n\t\t * Index in the aoData array. This saves an indexOf lookup when we have the\n\t\t * object, but want to know the index\n\t\t *  @type integer\n\t\t *  @default -1\n\t\t *  @private\n\t\t */\n\t\t\"idx\": -1\n\t};\n\t\n\t\n\t/**\n\t * Template object for the column information object in DataTables. This object\n\t * is held in the settings aoColumns array and contains all the information that\n\t * DataTables needs about each individual column.\n\t *\n\t * Note that this object is related to {@link DataTable.defaults.column}\n\t * but this one is the internal data store for DataTables's cache of columns.\n\t * It should NOT be manipulated outside of DataTables. Any configuration should\n\t * be done through the initialisation options.\n\t *  @namespace\n\t */\n\tDataTable.models.oColumn = {\n\t\t/**\n\t\t * Column index. This could be worked out on-the-fly with $.inArray, but it\n\t\t * is faster to just hold it as a variable\n\t\t *  @type integer\n\t\t *  @default null\n\t\t */\n\t\t\"idx\": null,\n\t\n\t\t/**\n\t\t * A list of the columns that sorting should occur on when this column\n\t\t * is sorted. That this property is an array allows multi-column sorting\n\t\t * to be defined for a column (for example first name / last name columns\n\t\t * would benefit from this). The values are integers pointing to the\n\t\t * columns to be sorted on (typically it will be a single integer pointing\n\t\t * at itself, but that doesn't need to be the case).\n\t\t *  @type array\n\t\t */\n\t\t\"aDataSort\": null,\n\t\n\t\t/**\n\t\t * Define the sorting directions that are applied to the column, in sequence\n\t\t * as the column is repeatedly sorted upon - i.e. the first value is used\n\t\t * as the sorting direction when the column if first sorted (clicked on).\n\t\t * Sort it again (click again) and it will move on to the next index.\n\t\t * Repeat until loop.\n\t\t *  @type array\n\t\t */\n\t\t\"asSorting\": null,\n\t\n\t\t/**\n\t\t * Flag to indicate if the column is searchable, and thus should be included\n\t\t * in the filtering or not.\n\t\t *  @type boolean\n\t\t */\n\t\t\"bSearchable\": null,\n\t\n\t\t/**\n\t\t * Flag to indicate if the column is sortable or not.\n\t\t *  @type boolean\n\t\t */\n\t\t\"bSortable\": null,\n\t\n\t\t/**\n\t\t * Flag to indicate if the column is currently visible in the table or not\n\t\t *  @type boolean\n\t\t */\n\t\t\"bVisible\": null,\n\t\n\t\t/**\n\t\t * Store for manual type assignment using the `column.type` option. This\n\t\t * is held in store so we can manipulate the column's `sType` property.\n\t\t *  @type string\n\t\t *  @default null\n\t\t *  @private\n\t\t */\n\t\t\"_sManualType\": null,\n\t\n\t\t/**\n\t\t * Flag to indicate if HTML5 data attributes should be used as the data\n\t\t * source for filtering or sorting. True is either are.\n\t\t *  @type boolean\n\t\t *  @default false\n\t\t *  @private\n\t\t */\n\t\t\"_bAttrSrc\": false,\n\t\n\t\t/**\n\t\t * Developer definable function that is called whenever a cell is created (Ajax source,\n\t\t * etc) or processed for input (DOM source). This can be used as a compliment to mRender\n\t\t * allowing you to modify the DOM element (add background colour for example) when the\n\t\t * element is available.\n\t\t *  @type function\n\t\t *  @param {element} nTd The TD node that has been created\n\t\t *  @param {*} sData The Data for the cell\n\t\t *  @param {array|object} oData The data for the whole row\n\t\t *  @param {int} iRow The row index for the aoData data store\n\t\t *  @default null\n\t\t */\n\t\t\"fnCreatedCell\": null,\n\t\n\t\t/**\n\t\t * Function to get data from a cell in a column. You should <b>never</b>\n\t\t * access data directly through _aData internally in DataTables - always use\n\t\t * the method attached to this property. It allows mData to function as\n\t\t * required. This function is automatically assigned by the column\n\t\t * initialisation method\n\t\t *  @type function\n\t\t *  @param {array|object} oData The data array/object for the array\n\t\t *    (i.e. aoData[]._aData)\n\t\t *  @param {string} sSpecific The specific data type you want to get -\n\t\t *    'display', 'type' 'filter' 'sort'\n\t\t *  @returns {*} The data for the cell from the given row's data\n\t\t *  @default null\n\t\t */\n\t\t\"fnGetData\": null,\n\t\n\t\t/**\n\t\t * Function to set data for a cell in the column. You should <b>never</b>\n\t\t * set the data directly to _aData internally in DataTables - always use\n\t\t * this method. It allows mData to function as required. This function\n\t\t * is automatically assigned by the column initialisation method\n\t\t *  @type function\n\t\t *  @param {array|object} oData The data array/object for the array\n\t\t *    (i.e. aoData[]._aData)\n\t\t *  @param {*} sValue Value to set\n\t\t *  @default null\n\t\t */\n\t\t\"fnSetData\": null,\n\t\n\t\t/**\n\t\t * Property to read the value for the cells in the column from the data\n\t\t * source array / object. If null, then the default content is used, if a\n\t\t * function is given then the return from the function is used.\n\t\t *  @type function|int|string|null\n\t\t *  @default null\n\t\t */\n\t\t\"mData\": null,\n\t\n\t\t/**\n\t\t * Partner property to mData which is used (only when defined) to get\n\t\t * the data - i.e. it is basically the same as mData, but without the\n\t\t * 'set' option, and also the data fed to it is the result from mData.\n\t\t * This is the rendering method to match the data method of mData.\n\t\t *  @type function|int|string|null\n\t\t *  @default null\n\t\t */\n\t\t\"mRender\": null,\n\t\n\t\t/**\n\t\t * Unique header TH/TD element for this column - this is what the sorting\n\t\t * listener is attached to (if sorting is enabled.)\n\t\t *  @type node\n\t\t *  @default null\n\t\t */\n\t\t\"nTh\": null,\n\t\n\t\t/**\n\t\t * Unique footer TH/TD element for this column (if there is one). Not used\n\t\t * in DataTables as such, but can be used for plug-ins to reference the\n\t\t * footer for each column.\n\t\t *  @type node\n\t\t *  @default null\n\t\t */\n\t\t\"nTf\": null,\n\t\n\t\t/**\n\t\t * The class to apply to all TD elements in the table's TBODY for the column\n\t\t *  @type string\n\t\t *  @default null\n\t\t */\n\t\t\"sClass\": null,\n\t\n\t\t/**\n\t\t * When DataTables calculates the column widths to assign to each column,\n\t\t * it finds the longest string in each column and then constructs a\n\t\t * temporary table and reads the widths from that. The problem with this\n\t\t * is that \"mmm\" is much wider then \"iiii\", but the latter is a longer\n\t\t * string - thus the calculation can go wrong (doing it properly and putting\n\t\t * it into an DOM object and measuring that is horribly(!) slow). Thus as\n\t\t * a \"work around\" we provide this option. It will append its value to the\n\t\t * text that is found to be the longest string for the column - i.e. padding.\n\t\t *  @type string\n\t\t */\n\t\t\"sContentPadding\": null,\n\t\n\t\t/**\n\t\t * Allows a default value to be given for a column's data, and will be used\n\t\t * whenever a null data source is encountered (this can be because mData\n\t\t * is set to null, or because the data source itself is null).\n\t\t *  @type string\n\t\t *  @default null\n\t\t */\n\t\t\"sDefaultContent\": null,\n\t\n\t\t/**\n\t\t * Name for the column, allowing reference to the column by name as well as\n\t\t * by index (needs a lookup to work by name).\n\t\t *  @type string\n\t\t */\n\t\t\"sName\": null,\n\t\n\t\t/**\n\t\t * Custom sorting data type - defines which of the available plug-ins in\n\t\t * afnSortData the custom sorting will use - if any is defined.\n\t\t *  @type string\n\t\t *  @default std\n\t\t */\n\t\t\"sSortDataType\": 'std',\n\t\n\t\t/**\n\t\t * Class to be applied to the header element when sorting on this column\n\t\t *  @type string\n\t\t *  @default null\n\t\t */\n\t\t\"sSortingClass\": null,\n\t\n\t\t/**\n\t\t * Class to be applied to the header element when sorting on this column -\n\t\t * when jQuery UI theming is used.\n\t\t *  @type string\n\t\t *  @default null\n\t\t */\n\t\t\"sSortingClassJUI\": null,\n\t\n\t\t/**\n\t\t * Title of the column - what is seen in the TH element (nTh).\n\t\t *  @type string\n\t\t */\n\t\t\"sTitle\": null,\n\t\n\t\t/**\n\t\t * Column sorting and filtering type\n\t\t *  @type string\n\t\t *  @default null\n\t\t */\n\t\t\"sType\": null,\n\t\n\t\t/**\n\t\t * Width of the column\n\t\t *  @type string\n\t\t *  @default null\n\t\t */\n\t\t\"sWidth\": null,\n\t\n\t\t/**\n\t\t * Width of the column when it was first \"encountered\"\n\t\t *  @type string\n\t\t *  @default null\n\t\t */\n\t\t\"sWidthOrig\": null\n\t};\n\t\n\t\n\t/*\n\t * Developer note: The properties of the object below are given in Hungarian\n\t * notation, that was used as the interface for DataTables prior to v1.10, however\n\t * from v1.10 onwards the primary interface is camel case. In order to avoid\n\t * breaking backwards compatibility utterly with this change, the Hungarian\n\t * version is still, internally the primary interface, but is is not documented\n\t * - hence the @name tags in each doc comment. This allows a Javascript function\n\t * to create a map from Hungarian notation to camel case (going the other direction\n\t * would require each property to be listed, which would at around 3K to the size\n\t * of DataTables, while this method is about a 0.5K hit.\n\t *\n\t * Ultimately this does pave the way for Hungarian notation to be dropped\n\t * completely, but that is a massive amount of work and will break current\n\t * installs (therefore is on-hold until v2).\n\t */\n\t\n\t/**\n\t * Initialisation options that can be given to DataTables at initialisation\n\t * time.\n\t *  @namespace\n\t */\n\tDataTable.defaults = {\n\t\t/**\n\t\t * An array of data to use for the table, passed in at initialisation which\n\t\t * will be used in preference to any data which is already in the DOM. This is\n\t\t * particularly useful for constructing tables purely in Javascript, for\n\t\t * example with a custom Ajax call.\n\t\t *  @type array\n\t\t *  @default null\n\t\t *\n\t\t *  @dtopt Option\n\t\t *  @name DataTable.defaults.data\n\t\t *\n\t\t *  @example\n\t\t *    // Using a 2D array data source\n\t\t *    $(document).ready( function () {\n\t\t *      $('#example').dataTable( {\n\t\t *        \"data\": [\n\t\t *          ['Trident', 'Internet Explorer 4.0', 'Win 95+', 4, 'X'],\n\t\t *          ['Trident', 'Internet Explorer 5.0', 'Win 95+', 5, 'C'],\n\t\t *        ],\n\t\t *        \"columns\": [\n\t\t *          { \"title\": \"Engine\" },\n\t\t *          { \"title\": \"Browser\" },\n\t\t *          { \"title\": \"Platform\" },\n\t\t *          { \"title\": \"Version\" },\n\t\t *          { \"title\": \"Grade\" }\n\t\t *        ]\n\t\t *      } );\n\t\t *    } );\n\t\t *\n\t\t *  @example\n\t\t *    // Using an array of objects as a data source (`data`)\n\t\t *    $(document).ready( function () {\n\t\t *      $('#example').dataTable( {\n\t\t *        \"data\": [\n\t\t *          {\n\t\t *            \"engine\":   \"Trident\",\n\t\t *            \"browser\":  \"Internet Explorer 4.0\",\n\t\t *            \"platform\": \"Win 95+\",\n\t\t *            \"version\":  4,\n\t\t *            \"grade\":    \"X\"\n\t\t *          },\n\t\t *          {\n\t\t *            \"engine\":   \"Trident\",\n\t\t *            \"browser\":  \"Internet Explorer 5.0\",\n\t\t *            \"platform\": \"Win 95+\",\n\t\t *            \"version\":  5,\n\t\t *            \"grade\":    \"C\"\n\t\t *          }\n\t\t *        ],\n\t\t *        \"columns\": [\n\t\t *          { \"title\": \"Engine\",   \"data\": \"engine\" },\n\t\t *          { \"title\": \"Browser\",  \"data\": \"browser\" },\n\t\t *          { \"title\": \"Platform\", \"data\": \"platform\" },\n\t\t *          { \"title\": \"Version\",  \"data\": \"version\" },\n\t\t *          { \"title\": \"Grade\",    \"data\": \"grade\" }\n\t\t *        ]\n\t\t *      } );\n\t\t *    } );\n\t\t */\n\t\t\"aaData\": null,\n\t\n\t\n\t\t/**\n\t\t * If ordering is enabled, then DataTables will perform a first pass sort on\n\t\t * initialisation. You can define which column(s) the sort is performed\n\t\t * upon, and the sorting direction, with this variable. The `sorting` array\n\t\t * should contain an array for each column to be sorted initially containing\n\t\t * the column's index and a direction string ('asc' or 'desc').\n\t\t *  @type array\n\t\t *  @default [[0,'asc']]\n\t\t *\n\t\t *  @dtopt Option\n\t\t *  @name DataTable.defaults.order\n\t\t *\n\t\t *  @example\n\t\t *    // Sort by 3rd column first, and then 4th column\n\t\t *    $(document).ready( function() {\n\t\t *      $('#example').dataTable( {\n\t\t *        \"order\": [[2,'asc'], [3,'desc']]\n\t\t *      } );\n\t\t *    } );\n\t\t *\n\t\t *    // No initial sorting\n\t\t *    $(document).ready( function() {\n\t\t *      $('#example').dataTable( {\n\t\t *        \"order\": []\n\t\t *      } );\n\t\t *    } );\n\t\t */\n\t\t\"aaSorting\": [[0,'asc']],\n\t\n\t\n\t\t/**\n\t\t * This parameter is basically identical to the `sorting` parameter, but\n\t\t * cannot be overridden by user interaction with the table. What this means\n\t\t * is that you could have a column (visible or hidden) which the sorting\n\t\t * will always be forced on first - any sorting after that (from the user)\n\t\t * will then be performed as required. This can be useful for grouping rows\n\t\t * together.\n\t\t *  @type array\n\t\t *  @default null\n\t\t *\n\t\t *  @dtopt Option\n\t\t *  @name DataTable.defaults.orderFixed\n\t\t *\n\t\t *  @example\n\t\t *    $(document).ready( function() {\n\t\t *      $('#example').dataTable( {\n\t\t *        \"orderFixed\": [[0,'asc']]\n\t\t *      } );\n\t\t *    } )\n\t\t */\n\t\t\"aaSortingFixed\": [],\n\t\n\t\n\t\t/**\n\t\t * DataTables can be instructed to load data to display in the table from a\n\t\t * Ajax source. This option defines how that Ajax call is made and where to.\n\t\t *\n\t\t * The `ajax` property has three different modes of operation, depending on\n\t\t * how it is defined. These are:\n\t\t *\n\t\t * * `string` - Set the URL from where the data should be loaded from.\n\t\t * * `object` - Define properties for `jQuery.ajax`.\n\t\t * * `function` - Custom data get function\n\t\t *\n\t\t * `string`\n\t\t * --------\n\t\t *\n\t\t * As a string, the `ajax` property simply defines the URL from which\n\t\t * DataTables will load data.\n\t\t *\n\t\t * `object`\n\t\t * --------\n\t\t *\n\t\t * As an object, the parameters in the object are passed to\n\t\t * [jQuery.ajax](http://api.jquery.com/jQuery.ajax/) allowing fine control\n\t\t * of the Ajax request. DataTables has a number of default parameters which\n\t\t * you can override using this option. Please refer to the jQuery\n\t\t * documentation for a full description of the options available, although\n\t\t * the following parameters provide additional options in DataTables or\n\t\t * require special consideration:\n\t\t *\n\t\t * * `data` - As with jQuery, `data` can be provided as an object, but it\n\t\t *   can also be used as a function to manipulate the data DataTables sends\n\t\t *   to the server. The function takes a single parameter, an object of\n\t\t *   parameters with the values that DataTables has readied for sending. An\n\t\t *   object may be returned which will be merged into the DataTables\n\t\t *   defaults, or you can add the items to the object that was passed in and\n\t\t *   not return anything from the function. This supersedes `fnServerParams`\n\t\t *   from DataTables 1.9-.\n\t\t *\n\t\t * * `dataSrc` - By default DataTables will look for the property `data` (or\n\t\t *   `aaData` for compatibility with DataTables 1.9-) when obtaining data\n\t\t *   from an Ajax source or for server-side processing - this parameter\n\t\t *   allows that property to be changed. You can use Javascript dotted\n\t\t *   object notation to get a data source for multiple levels of nesting, or\n\t\t *   it my be used as a function. As a function it takes a single parameter,\n\t\t *   the JSON returned from the server, which can be manipulated as\n\t\t *   required, with the returned value being that used by DataTables as the\n\t\t *   data source for the table. This supersedes `sAjaxDataProp` from\n\t\t *   DataTables 1.9-.\n\t\t *\n\t\t * * `success` - Should not be overridden it is used internally in\n\t\t *   DataTables. To manipulate / transform the data returned by the server\n\t\t *   use `ajax.dataSrc`, or use `ajax` as a function (see below).\n\t\t *\n\t\t * `function`\n\t\t * ----------\n\t\t *\n\t\t * As a function, making the Ajax call is left up to yourself allowing\n\t\t * complete control of the Ajax request. Indeed, if desired, a method other\n\t\t * than Ajax could be used to obtain the required data, such as Web storage\n\t\t * or an AIR database.\n\t\t *\n\t\t * The function is given four parameters and no return is required. The\n\t\t * parameters are:\n\t\t *\n\t\t * 1. _object_ - Data to send to the server\n\t\t * 2. _function_ - Callback function that must be executed when the required\n\t\t *    data has been obtained. That data should be passed into the callback\n\t\t *    as the only parameter\n\t\t * 3. _object_ - DataTables settings object for the table\n\t\t *\n\t\t * Note that this supersedes `fnServerData` from DataTables 1.9-.\n\t\t *\n\t\t *  @type string|object|function\n\t\t *  @default null\n\t\t *\n\t\t *  @dtopt Option\n\t\t *  @name DataTable.defaults.ajax\n\t\t *  @since 1.10.0\n\t\t *\n\t\t * @example\n\t\t *   // Get JSON data from a file via Ajax.\n\t\t *   // Note DataTables expects data in the form `{ data: [ ...data... ] }` by default).\n\t\t *   $('#example').dataTable( {\n\t\t *     \"ajax\": \"data.json\"\n\t\t *   } );\n\t\t *\n\t\t * @example\n\t\t *   // Get JSON data from a file via Ajax, using `dataSrc` to change\n\t\t *   // `data` to `tableData` (i.e. `{ tableData: [ ...data... ] }`)\n\t\t *   $('#example').dataTable( {\n\t\t *     \"ajax\": {\n\t\t *       \"url\": \"data.json\",\n\t\t *       \"dataSrc\": \"tableData\"\n\t\t *     }\n\t\t *   } );\n\t\t *\n\t\t * @example\n\t\t *   // Get JSON data from a file via Ajax, using `dataSrc` to read data\n\t\t *   // from a plain array rather than an array in an object\n\t\t *   $('#example').dataTable( {\n\t\t *     \"ajax\": {\n\t\t *       \"url\": \"data.json\",\n\t\t *       \"dataSrc\": \"\"\n\t\t *     }\n\t\t *   } );\n\t\t *\n\t\t * @example\n\t\t *   // Manipulate the data returned from the server - add a link to data\n\t\t *   // (note this can, should, be done using `render` for the column - this\n\t\t *   // is just a simple example of how the data can be manipulated).\n\t\t *   $('#example').dataTable( {\n\t\t *     \"ajax\": {\n\t\t *       \"url\": \"data.json\",\n\t\t *       \"dataSrc\": function ( json ) {\n\t\t *         for ( var i=0, ien=json.length ; i<ien ; i++ ) {\n\t\t *           json[i][0] = '<a href=\"/message/'+json[i][0]+'>View message</a>';\n\t\t *         }\n\t\t *         return json;\n\t\t *       }\n\t\t *     }\n\t\t *   } );\n\t\t *\n\t\t * @example\n\t\t *   // Add data to the request\n\t\t *   $('#example').dataTable( {\n\t\t *     \"ajax\": {\n\t\t *       \"url\": \"data.json\",\n\t\t *       \"data\": function ( d ) {\n\t\t *         return {\n\t\t *           \"extra_search\": $('#extra').val()\n\t\t *         };\n\t\t *       }\n\t\t *     }\n\t\t *   } );\n\t\t *\n\t\t * @example\n\t\t *   // Send request as POST\n\t\t *   $('#example').dataTable( {\n\t\t *     \"ajax\": {\n\t\t *       \"url\": \"data.json\",\n\t\t *       \"type\": \"POST\"\n\t\t *     }\n\t\t *   } );\n\t\t *\n\t\t * @example\n\t\t *   // Get the data from localStorage (could interface with a form for\n\t\t *   // adding, editing and removing rows).\n\t\t *   $('#example').dataTable( {\n\t\t *     \"ajax\": function (data, callback, settings) {\n\t\t *       callback(\n\t\t *         JSON.parse( localStorage.getItem('dataTablesData') )\n\t\t *       );\n\t\t *     }\n\t\t *   } );\n\t\t */\n\t\t\"ajax\": null,\n\t\n\t\n\t\t/**\n\t\t * This parameter allows you to readily specify the entries in the length drop\n\t\t * down menu that DataTables shows when pagination is enabled. It can be\n\t\t * either a 1D array of options which will be used for both the displayed\n\t\t * option and the value, or a 2D array which will use the array in the first\n\t\t * position as the value, and the array in the second position as the\n\t\t * displayed options (useful for language strings such as 'All').\n\t\t *\n\t\t * Note that the `pageLength` property will be automatically set to the\n\t\t * first value given in this array, unless `pageLength` is also provided.\n\t\t *  @type array\n\t\t *  @default [ 10, 25, 50, 100 ]\n\t\t *\n\t\t *  @dtopt Option\n\t\t *  @name DataTable.defaults.lengthMenu\n\t\t *\n\t\t *  @example\n\t\t *    $(document).ready( function() {\n\t\t *      $('#example').dataTable( {\n\t\t *        \"lengthMenu\": [[10, 25, 50, -1], [10, 25, 50, \"All\"]]\n\t\t *      } );\n\t\t *    } );\n\t\t */\n\t\t\"aLengthMenu\": [ 10, 25, 50, 100 ],\n\t\n\t\n\t\t/**\n\t\t * The `columns` option in the initialisation parameter allows you to define\n\t\t * details about the way individual columns behave. For a full list of\n\t\t * column options that can be set, please see\n\t\t * {@link DataTable.defaults.column}. Note that if you use `columns` to\n\t\t * define your columns, you must have an entry in the array for every single\n\t\t * column that you have in your table (these can be null if you don't which\n\t\t * to specify any options).\n\t\t *  @member\n\t\t *\n\t\t *  @name DataTable.defaults.column\n\t\t */\n\t\t\"aoColumns\": null,\n\t\n\t\t/**\n\t\t * Very similar to `columns`, `columnDefs` allows you to target a specific\n\t\t * column, multiple columns, or all columns, using the `targets` property of\n\t\t * each object in the array. This allows great flexibility when creating\n\t\t * tables, as the `columnDefs` arrays can be of any length, targeting the\n\t\t * columns you specifically want. `columnDefs` may use any of the column\n\t\t * options available: {@link DataTable.defaults.column}, but it _must_\n\t\t * have `targets` defined in each object in the array. Values in the `targets`\n\t\t * array may be:\n\t\t *   <ul>\n\t\t *     <li>a string - class name will be matched on the TH for the column</li>\n\t\t *     <li>0 or a positive integer - column index counting from the left</li>\n\t\t *     <li>a negative integer - column index counting from the right</li>\n\t\t *     <li>the string \"_all\" - all columns (i.e. assign a default)</li>\n\t\t *   </ul>\n\t\t *  @member\n\t\t *\n\t\t *  @name DataTable.defaults.columnDefs\n\t\t */\n\t\t\"aoColumnDefs\": null,\n\t\n\t\n\t\t/**\n\t\t * Basically the same as `search`, this parameter defines the individual column\n\t\t * filtering state at initialisation time. The array must be of the same size\n\t\t * as the number of columns, and each element be an object with the parameters\n\t\t * `search` and `escapeRegex` (the latter is optional). 'null' is also\n\t\t * accepted and the default will be used.\n\t\t *  @type array\n\t\t *  @default []\n\t\t *\n\t\t *  @dtopt Option\n\t\t *  @name DataTable.defaults.searchCols\n\t\t *\n\t\t *  @example\n\t\t *    $(document).ready( function() {\n\t\t *      $('#example').dataTable( {\n\t\t *        \"searchCols\": [\n\t\t *          null,\n\t\t *          { \"search\": \"My filter\" },\n\t\t *          null,\n\t\t *          { \"search\": \"^[0-9]\", \"escapeRegex\": false }\n\t\t *        ]\n\t\t *      } );\n\t\t *    } )\n\t\t */\n\t\t\"aoSearchCols\": [],\n\t\n\t\n\t\t/**\n\t\t * An array of CSS classes that should be applied to displayed rows. This\n\t\t * array may be of any length, and DataTables will apply each class\n\t\t * sequentially, looping when required.\n\t\t *  @type array\n\t\t *  @default null <i>Will take the values determined by the `oClasses.stripe*`\n\t\t *    options</i>\n\t\t *\n\t\t *  @dtopt Option\n\t\t *  @name DataTable.defaults.stripeClasses\n\t\t *\n\t\t *  @example\n\t\t *    $(document).ready( function() {\n\t\t *      $('#example').dataTable( {\n\t\t *        \"stripeClasses\": [ 'strip1', 'strip2', 'strip3' ]\n\t\t *      } );\n\t\t *    } )\n\t\t */\n\t\t\"asStripeClasses\": null,\n\t\n\t\n\t\t/**\n\t\t * Enable or disable automatic column width calculation. This can be disabled\n\t\t * as an optimisation (it takes some time to calculate the widths) if the\n\t\t * tables widths are passed in using `columns`.\n\t\t *  @type boolean\n\t\t *  @default true\n\t\t *\n\t\t *  @dtopt Features\n\t\t *  @name DataTable.defaults.autoWidth\n\t\t *\n\t\t *  @example\n\t\t *    $(document).ready( function () {\n\t\t *      $('#example').dataTable( {\n\t\t *        \"autoWidth\": false\n\t\t *      } );\n\t\t *    } );\n\t\t */\n\t\t\"bAutoWidth\": true,\n\t\n\t\n\t\t/**\n\t\t * Deferred rendering can provide DataTables with a huge speed boost when you\n\t\t * are using an Ajax or JS data source for the table. This option, when set to\n\t\t * true, will cause DataTables to defer the creation of the table elements for\n\t\t * each row until they are needed for a draw - saving a significant amount of\n\t\t * time.\n\t\t *  @type boolean\n\t\t *  @default false\n\t\t *\n\t\t *  @dtopt Features\n\t\t *  @name DataTable.defaults.deferRender\n\t\t *\n\t\t *  @example\n\t\t *    $(document).ready( function() {\n\t\t *      $('#example').dataTable( {\n\t\t *        \"ajax\": \"sources/arrays.txt\",\n\t\t *        \"deferRender\": true\n\t\t *      } );\n\t\t *    } );\n\t\t */\n\t\t\"bDeferRender\": false,\n\t\n\t\n\t\t/**\n\t\t * Replace a DataTable which matches the given selector and replace it with\n\t\t * one which has the properties of the new initialisation object passed. If no\n\t\t * table matches the selector, then the new DataTable will be constructed as\n\t\t * per normal.\n\t\t *  @type boolean\n\t\t *  @default false\n\t\t *\n\t\t *  @dtopt Options\n\t\t *  @name DataTable.defaults.destroy\n\t\t *\n\t\t *  @example\n\t\t *    $(document).ready( function() {\n\t\t *      $('#example').dataTable( {\n\t\t *        \"srollY\": \"200px\",\n\t\t *        \"paginate\": false\n\t\t *      } );\n\t\t *\n\t\t *      // Some time later....\n\t\t *      $('#example').dataTable( {\n\t\t *        \"filter\": false,\n\t\t *        \"destroy\": true\n\t\t *      } );\n\t\t *    } );\n\t\t */\n\t\t\"bDestroy\": false,\n\t\n\t\n\t\t/**\n\t\t * Enable or disable filtering of data. Filtering in DataTables is \"smart\" in\n\t\t * that it allows the end user to input multiple words (space separated) and\n\t\t * will match a row containing those words, even if not in the order that was\n\t\t * specified (this allow matching across multiple columns). Note that if you\n\t\t * wish to use filtering in DataTables this must remain 'true' - to remove the\n\t\t * default filtering input box and retain filtering abilities, please use\n\t\t * {@link DataTable.defaults.dom}.\n\t\t *  @type boolean\n\t\t *  @default true\n\t\t *\n\t\t *  @dtopt Features\n\t\t *  @name DataTable.defaults.searching\n\t\t *\n\t\t *  @example\n\t\t *    $(document).ready( function () {\n\t\t *      $('#example').dataTable( {\n\t\t *        \"searching\": false\n\t\t *      } );\n\t\t *    } );\n\t\t */\n\t\t\"bFilter\": true,\n\t\n\t\n\t\t/**\n\t\t * Enable or disable the table information display. This shows information\n\t\t * about the data that is currently visible on the page, including information\n\t\t * about filtered data if that action is being performed.\n\t\t *  @type boolean\n\t\t *  @default true\n\t\t *\n\t\t *  @dtopt Features\n\t\t *  @name DataTable.defaults.info\n\t\t *\n\t\t *  @example\n\t\t *    $(document).ready( function () {\n\t\t *      $('#example').dataTable( {\n\t\t *        \"info\": false\n\t\t *      } );\n\t\t *    } );\n\t\t */\n\t\t\"bInfo\": true,\n\t\n\t\n\t\t/**\n\t\t * Allows the end user to select the size of a formatted page from a select\n\t\t * menu (sizes are 10, 25, 50 and 100). Requires pagination (`paginate`).\n\t\t *  @type boolean\n\t\t *  @default true\n\t\t *\n\t\t *  @dtopt Features\n\t\t *  @name DataTable.defaults.lengthChange\n\t\t *\n\t\t *  @example\n\t\t *    $(document).ready( function () {\n\t\t *      $('#example').dataTable( {\n\t\t *        \"lengthChange\": false\n\t\t *      } );\n\t\t *    } );\n\t\t */\n\t\t\"bLengthChange\": true,\n\t\n\t\n\t\t/**\n\t\t * Enable or disable pagination.\n\t\t *  @type boolean\n\t\t *  @default true\n\t\t *\n\t\t *  @dtopt Features\n\t\t *  @name DataTable.defaults.paging\n\t\t *\n\t\t *  @example\n\t\t *    $(document).ready( function () {\n\t\t *      $('#example').dataTable( {\n\t\t *        \"paging\": false\n\t\t *      } );\n\t\t *    } );\n\t\t */\n\t\t\"bPaginate\": true,\n\t\n\t\n\t\t/**\n\t\t * Enable or disable the display of a 'processing' indicator when the table is\n\t\t * being processed (e.g. a sort). This is particularly useful for tables with\n\t\t * large amounts of data where it can take a noticeable amount of time to sort\n\t\t * the entries.\n\t\t *  @type boolean\n\t\t *  @default false\n\t\t *\n\t\t *  @dtopt Features\n\t\t *  @name DataTable.defaults.processing\n\t\t *\n\t\t *  @example\n\t\t *    $(document).ready( function () {\n\t\t *      $('#example').dataTable( {\n\t\t *        \"processing\": true\n\t\t *      } );\n\t\t *    } );\n\t\t */\n\t\t\"bProcessing\": false,\n\t\n\t\n\t\t/**\n\t\t * Retrieve the DataTables object for the given selector. Note that if the\n\t\t * table has already been initialised, this parameter will cause DataTables\n\t\t * to simply return the object that has already been set up - it will not take\n\t\t * account of any changes you might have made to the initialisation object\n\t\t * passed to DataTables (setting this parameter to true is an acknowledgement\n\t\t * that you understand this). `destroy` can be used to reinitialise a table if\n\t\t * you need.\n\t\t *  @type boolean\n\t\t *  @default false\n\t\t *\n\t\t *  @dtopt Options\n\t\t *  @name DataTable.defaults.retrieve\n\t\t *\n\t\t *  @example\n\t\t *    $(document).ready( function() {\n\t\t *      initTable();\n\t\t *      tableActions();\n\t\t *    } );\n\t\t *\n\t\t *    function initTable ()\n\t\t *    {\n\t\t *      return $('#example').dataTable( {\n\t\t *        \"scrollY\": \"200px\",\n\t\t *        \"paginate\": false,\n\t\t *        \"retrieve\": true\n\t\t *      } );\n\t\t *    }\n\t\t *\n\t\t *    function tableActions ()\n\t\t *    {\n\t\t *      var table = initTable();\n\t\t *      // perform API operations with oTable\n\t\t *    }\n\t\t */\n\t\t\"bRetrieve\": false,\n\t\n\t\n\t\t/**\n\t\t * When vertical (y) scrolling is enabled, DataTables will force the height of\n\t\t * the table's viewport to the given height at all times (useful for layout).\n\t\t * However, this can look odd when filtering data down to a small data set,\n\t\t * and the footer is left \"floating\" further down. This parameter (when\n\t\t * enabled) will cause DataTables to collapse the table's viewport down when\n\t\t * the result set will fit within the given Y height.\n\t\t *  @type boolean\n\t\t *  @default false\n\t\t *\n\t\t *  @dtopt Options\n\t\t *  @name DataTable.defaults.scrollCollapse\n\t\t *\n\t\t *  @example\n\t\t *    $(document).ready( function() {\n\t\t *      $('#example').dataTable( {\n\t\t *        \"scrollY\": \"200\",\n\t\t *        \"scrollCollapse\": true\n\t\t *      } );\n\t\t *    } );\n\t\t */\n\t\t\"bScrollCollapse\": false,\n\t\n\t\n\t\t/**\n\t\t * Configure DataTables to use server-side processing. Note that the\n\t\t * `ajax` parameter must also be given in order to give DataTables a\n\t\t * source to obtain the required data for each draw.\n\t\t *  @type boolean\n\t\t *  @default false\n\t\t *\n\t\t *  @dtopt Features\n\t\t *  @dtopt Server-side\n\t\t *  @name DataTable.defaults.serverSide\n\t\t *\n\t\t *  @example\n\t\t *    $(document).ready( function () {\n\t\t *      $('#example').dataTable( {\n\t\t *        \"serverSide\": true,\n\t\t *        \"ajax\": \"xhr.php\"\n\t\t *      } );\n\t\t *    } );\n\t\t */\n\t\t\"bServerSide\": false,\n\t\n\t\n\t\t/**\n\t\t * Enable or disable sorting of columns. Sorting of individual columns can be\n\t\t * disabled by the `sortable` option for each column.\n\t\t *  @type boolean\n\t\t *  @default true\n\t\t *\n\t\t *  @dtopt Features\n\t\t *  @name DataTable.defaults.ordering\n\t\t *\n\t\t *  @example\n\t\t *    $(document).ready( function () {\n\t\t *      $('#example').dataTable( {\n\t\t *        \"ordering\": false\n\t\t *      } );\n\t\t *    } );\n\t\t */\n\t\t\"bSort\": true,\n\t\n\t\n\t\t/**\n\t\t * Enable or display DataTables' ability to sort multiple columns at the\n\t\t * same time (activated by shift-click by the user).\n\t\t *  @type boolean\n\t\t *  @default true\n\t\t *\n\t\t *  @dtopt Options\n\t\t *  @name DataTable.defaults.orderMulti\n\t\t *\n\t\t *  @example\n\t\t *    // Disable multiple column sorting ability\n\t\t *    $(document).ready( function () {\n\t\t *      $('#example').dataTable( {\n\t\t *        \"orderMulti\": false\n\t\t *      } );\n\t\t *    } );\n\t\t */\n\t\t\"bSortMulti\": true,\n\t\n\t\n\t\t/**\n\t\t * Allows control over whether DataTables should use the top (true) unique\n\t\t * cell that is found for a single column, or the bottom (false - default).\n\t\t * This is useful when using complex headers.\n\t\t *  @type boolean\n\t\t *  @default false\n\t\t *\n\t\t *  @dtopt Options\n\t\t *  @name DataTable.defaults.orderCellsTop\n\t\t *\n\t\t *  @example\n\t\t *    $(document).ready( function() {\n\t\t *      $('#example').dataTable( {\n\t\t *        \"orderCellsTop\": true\n\t\t *      } );\n\t\t *    } );\n\t\t */\n\t\t\"bSortCellsTop\": false,\n\t\n\t\n\t\t/**\n\t\t * Enable or disable the addition of the classes `sorting\\_1`, `sorting\\_2` and\n\t\t * `sorting\\_3` to the columns which are currently being sorted on. This is\n\t\t * presented as a feature switch as it can increase processing time (while\n\t\t * classes are removed and added) so for large data sets you might want to\n\t\t * turn this off.\n\t\t *  @type boolean\n\t\t *  @default true\n\t\t *\n\t\t *  @dtopt Features\n\t\t *  @name DataTable.defaults.orderClasses\n\t\t *\n\t\t *  @example\n\t\t *    $(document).ready( function () {\n\t\t *      $('#example').dataTable( {\n\t\t *        \"orderClasses\": false\n\t\t *      } );\n\t\t *    } );\n\t\t */\n\t\t\"bSortClasses\": true,\n\t\n\t\n\t\t/**\n\t\t * Enable or disable state saving. When enabled HTML5 `localStorage` will be\n\t\t * used to save table display information such as pagination information,\n\t\t * display length, filtering and sorting. As such when the end user reloads\n\t\t * the page the display display will match what thy had previously set up.\n\t\t *\n\t\t * Due to the use of `localStorage` the default state saving is not supported\n\t\t * in IE6 or 7. If state saving is required in those browsers, use\n\t\t * `stateSaveCallback` to provide a storage solution such as cookies.\n\t\t *  @type boolean\n\t\t *  @default false\n\t\t *\n\t\t *  @dtopt Features\n\t\t *  @name DataTable.defaults.stateSave\n\t\t *\n\t\t *  @example\n\t\t *    $(document).ready( function () {\n\t\t *      $('#example').dataTable( {\n\t\t *        \"stateSave\": true\n\t\t *      } );\n\t\t *    } );\n\t\t */\n\t\t\"bStateSave\": false,\n\t\n\t\n\t\t/**\n\t\t * This function is called when a TR element is created (and all TD child\n\t\t * elements have been inserted), or registered if using a DOM source, allowing\n\t\t * manipulation of the TR element (adding classes etc).\n\t\t *  @type function\n\t\t *  @param {node} row \"TR\" element for the current row\n\t\t *  @param {array} data Raw data array for this row\n\t\t *  @param {int} dataIndex The index of this row in the internal aoData array\n\t\t *\n\t\t *  @dtopt Callbacks\n\t\t *  @name DataTable.defaults.createdRow\n\t\t *\n\t\t *  @example\n\t\t *    $(document).ready( function() {\n\t\t *      $('#example').dataTable( {\n\t\t *        \"createdRow\": function( row, data, dataIndex ) {\n\t\t *          // Bold the grade for all 'A' grade browsers\n\t\t *          if ( data[4] == \"A\" )\n\t\t *          {\n\t\t *            $('td:eq(4)', row).html( '<b>A</b>' );\n\t\t *          }\n\t\t *        }\n\t\t *      } );\n\t\t *    } );\n\t\t */\n\t\t\"fnCreatedRow\": null,\n\t\n\t\n\t\t/**\n\t\t * This function is called on every 'draw' event, and allows you to\n\t\t * dynamically modify any aspect you want about the created DOM.\n\t\t *  @type function\n\t\t *  @param {object} settings DataTables settings object\n\t\t *\n\t\t *  @dtopt Callbacks\n\t\t *  @name DataTable.defaults.drawCallback\n\t\t *\n\t\t *  @example\n\t\t *    $(document).ready( function() {\n\t\t *      $('#example').dataTable( {\n\t\t *        \"drawCallback\": function( settings ) {\n\t\t *          alert( 'DataTables has redrawn the table' );\n\t\t *        }\n\t\t *      } );\n\t\t *    } );\n\t\t */\n\t\t\"fnDrawCallback\": null,\n\t\n\t\n\t\t/**\n\t\t * Identical to fnHeaderCallback() but for the table footer this function\n\t\t * allows you to modify the table footer on every 'draw' event.\n\t\t *  @type function\n\t\t *  @param {node} foot \"TR\" element for the footer\n\t\t *  @param {array} data Full table data (as derived from the original HTML)\n\t\t *  @param {int} start Index for the current display starting point in the\n\t\t *    display array\n\t\t *  @param {int} end Index for the current display ending point in the\n\t\t *    display array\n\t\t *  @param {array int} display Index array to translate the visual position\n\t\t *    to the full data array\n\t\t *\n\t\t *  @dtopt Callbacks\n\t\t *  @name DataTable.defaults.footerCallback\n\t\t *\n\t\t *  @example\n\t\t *    $(document).ready( function() {\n\t\t *      $('#example').dataTable( {\n\t\t *        \"footerCallback\": function( tfoot, data, start, end, display ) {\n\t\t *          tfoot.getElementsByTagName('th')[0].innerHTML = \"Starting index is \"+start;\n\t\t *        }\n\t\t *      } );\n\t\t *    } )\n\t\t */\n\t\t\"fnFooterCallback\": null,\n\t\n\t\n\t\t/**\n\t\t * When rendering large numbers in the information element for the table\n\t\t * (i.e. \"Showing 1 to 10 of 57 entries\") DataTables will render large numbers\n\t\t * to have a comma separator for the 'thousands' units (e.g. 1 million is\n\t\t * rendered as \"1,000,000\") to help readability for the end user. This\n\t\t * function will override the default method DataTables uses.\n\t\t *  @type function\n\t\t *  @member\n\t\t *  @param {int} toFormat number to be formatted\n\t\t *  @returns {string} formatted string for DataTables to show the number\n\t\t *\n\t\t *  @dtopt Callbacks\n\t\t *  @name DataTable.defaults.formatNumber\n\t\t *\n\t\t *  @example\n\t\t *    // Format a number using a single quote for the separator (note that\n\t\t *    // this can also be done with the language.thousands option)\n\t\t *    $(document).ready( function() {\n\t\t *      $('#example').dataTable( {\n\t\t *        \"formatNumber\": function ( toFormat ) {\n\t\t *          return toFormat.toString().replace(\n\t\t *            /\\B(?=(\\d{3})+(?!\\d))/g, \"'\"\n\t\t *          );\n\t\t *        };\n\t\t *      } );\n\t\t *    } );\n\t\t */\n\t\t\"fnFormatNumber\": function ( toFormat ) {\n\t\t\treturn toFormat.toString().replace(\n\t\t\t\t/\\B(?=(\\d{3})+(?!\\d))/g,\n\t\t\t\tthis.oLanguage.sThousands\n\t\t\t);\n\t\t},\n\t\n\t\n\t\t/**\n\t\t * This function is called on every 'draw' event, and allows you to\n\t\t * dynamically modify the header row. This can be used to calculate and\n\t\t * display useful information about the table.\n\t\t *  @type function\n\t\t *  @param {node} head \"TR\" element for the header\n\t\t *  @param {array} data Full table data (as derived from the original HTML)\n\t\t *  @param {int} start Index for the current display starting point in the\n\t\t *    display array\n\t\t *  @param {int} end Index for the current display ending point in the\n\t\t *    display array\n\t\t *  @param {array int} display Index array to translate the visual position\n\t\t *    to the full data array\n\t\t *\n\t\t *  @dtopt Callbacks\n\t\t *  @name DataTable.defaults.headerCallback\n\t\t *\n\t\t *  @example\n\t\t *    $(document).ready( function() {\n\t\t *      $('#example').dataTable( {\n\t\t *        \"fheaderCallback\": function( head, data, start, end, display ) {\n\t\t *          head.getElementsByTagName('th')[0].innerHTML = \"Displaying \"+(end-start)+\" records\";\n\t\t *        }\n\t\t *      } );\n\t\t *    } )\n\t\t */\n\t\t\"fnHeaderCallback\": null,\n\t\n\t\n\t\t/**\n\t\t * The information element can be used to convey information about the current\n\t\t * state of the table. Although the internationalisation options presented by\n\t\t * DataTables are quite capable of dealing with most customisations, there may\n\t\t * be times where you wish to customise the string further. This callback\n\t\t * allows you to do exactly that.\n\t\t *  @type function\n\t\t *  @param {object} oSettings DataTables settings object\n\t\t *  @param {int} start Starting position in data for the draw\n\t\t *  @param {int} end End position in data for the draw\n\t\t *  @param {int} max Total number of rows in the table (regardless of\n\t\t *    filtering)\n\t\t *  @param {int} total Total number of rows in the data set, after filtering\n\t\t *  @param {string} pre The string that DataTables has formatted using it's\n\t\t *    own rules\n\t\t *  @returns {string} The string to be displayed in the information element.\n\t\t *\n\t\t *  @dtopt Callbacks\n\t\t *  @name DataTable.defaults.infoCallback\n\t\t *\n\t\t *  @example\n\t\t *    $('#example').dataTable( {\n\t\t *      \"infoCallback\": function( settings, start, end, max, total, pre ) {\n\t\t *        return start +\" to \"+ end;\n\t\t *      }\n\t\t *    } );\n\t\t */\n\t\t\"fnInfoCallback\": null,\n\t\n\t\n\t\t/**\n\t\t * Called when the table has been initialised. Normally DataTables will\n\t\t * initialise sequentially and there will be no need for this function,\n\t\t * however, this does not hold true when using external language information\n\t\t * since that is obtained using an async XHR call.\n\t\t *  @type function\n\t\t *  @param {object} settings DataTables settings object\n\t\t *  @param {object} json The JSON object request from the server - only\n\t\t *    present if client-side Ajax sourced data is used\n\t\t *\n\t\t *  @dtopt Callbacks\n\t\t *  @name DataTable.defaults.initComplete\n\t\t *\n\t\t *  @example\n\t\t *    $(document).ready( function() {\n\t\t *      $('#example').dataTable( {\n\t\t *        \"initComplete\": function(settings, json) {\n\t\t *          alert( 'DataTables has finished its initialisation.' );\n\t\t *        }\n\t\t *      } );\n\t\t *    } )\n\t\t */\n\t\t\"fnInitComplete\": null,\n\t\n\t\n\t\t/**\n\t\t * Called at the very start of each table draw and can be used to cancel the\n\t\t * draw by returning false, any other return (including undefined) results in\n\t\t * the full draw occurring).\n\t\t *  @type function\n\t\t *  @param {object} settings DataTables settings object\n\t\t *  @returns {boolean} False will cancel the draw, anything else (including no\n\t\t *    return) will allow it to complete.\n\t\t *\n\t\t *  @dtopt Callbacks\n\t\t *  @name DataTable.defaults.preDrawCallback\n\t\t *\n\t\t *  @example\n\t\t *    $(document).ready( function() {\n\t\t *      $('#example').dataTable( {\n\t\t *        \"preDrawCallback\": function( settings ) {\n\t\t *          if ( $('#test').val() == 1 ) {\n\t\t *            return false;\n\t\t *          }\n\t\t *        }\n\t\t *      } );\n\t\t *    } );\n\t\t */\n\t\t\"fnPreDrawCallback\": null,\n\t\n\t\n\t\t/**\n\t\t * This function allows you to 'post process' each row after it have been\n\t\t * generated for each table draw, but before it is rendered on screen. This\n\t\t * function might be used for setting the row class name etc.\n\t\t *  @type function\n\t\t *  @param {node} row \"TR\" element for the current row\n\t\t *  @param {array} data Raw data array for this row\n\t\t *  @param {int} displayIndex The display index for the current table draw\n\t\t *  @param {int} displayIndexFull The index of the data in the full list of\n\t\t *    rows (after filtering)\n\t\t *\n\t\t *  @dtopt Callbacks\n\t\t *  @name DataTable.defaults.rowCallback\n\t\t *\n\t\t *  @example\n\t\t *    $(document).ready( function() {\n\t\t *      $('#example').dataTable( {\n\t\t *        \"rowCallback\": function( row, data, displayIndex, displayIndexFull ) {\n\t\t *          // Bold the grade for all 'A' grade browsers\n\t\t *          if ( data[4] == \"A\" ) {\n\t\t *            $('td:eq(4)', row).html( '<b>A</b>' );\n\t\t *          }\n\t\t *        }\n\t\t *      } );\n\t\t *    } );\n\t\t */\n\t\t\"fnRowCallback\": null,\n\t\n\t\n\t\t/**\n\t\t * __Deprecated__ The functionality provided by this parameter has now been\n\t\t * superseded by that provided through `ajax`, which should be used instead.\n\t\t *\n\t\t * This parameter allows you to override the default function which obtains\n\t\t * the data from the server so something more suitable for your application.\n\t\t * For example you could use POST data, or pull information from a Gears or\n\t\t * AIR database.\n\t\t *  @type function\n\t\t *  @member\n\t\t *  @param {string} source HTTP source to obtain the data from (`ajax`)\n\t\t *  @param {array} data A key/value pair object containing the data to send\n\t\t *    to the server\n\t\t *  @param {function} callback to be called on completion of the data get\n\t\t *    process that will draw the data on the page.\n\t\t *  @param {object} settings DataTables settings object\n\t\t *\n\t\t *  @dtopt Callbacks\n\t\t *  @dtopt Server-side\n\t\t *  @name DataTable.defaults.serverData\n\t\t *\n\t\t *  @deprecated 1.10. Please use `ajax` for this functionality now.\n\t\t */\n\t\t\"fnServerData\": null,\n\t\n\t\n\t\t/**\n\t\t * __Deprecated__ The functionality provided by this parameter has now been\n\t\t * superseded by that provided through `ajax`, which should be used instead.\n\t\t *\n\t\t *  It is often useful to send extra data to the server when making an Ajax\n\t\t * request - for example custom filtering information, and this callback\n\t\t * function makes it trivial to send extra information to the server. The\n\t\t * passed in parameter is the data set that has been constructed by\n\t\t * DataTables, and you can add to this or modify it as you require.\n\t\t *  @type function\n\t\t *  @param {array} data Data array (array of objects which are name/value\n\t\t *    pairs) that has been constructed by DataTables and will be sent to the\n\t\t *    server. In the case of Ajax sourced data with server-side processing\n\t\t *    this will be an empty array, for server-side processing there will be a\n\t\t *    significant number of parameters!\n\t\t *  @returns {undefined} Ensure that you modify the data array passed in,\n\t\t *    as this is passed by reference.\n\t\t *\n\t\t *  @dtopt Callbacks\n\t\t *  @dtopt Server-side\n\t\t *  @name DataTable.defaults.serverParams\n\t\t *\n\t\t *  @deprecated 1.10. Please use `ajax` for this functionality now.\n\t\t */\n\t\t\"fnServerParams\": null,\n\t\n\t\n\t\t/**\n\t\t * Load the table state. With this function you can define from where, and how, the\n\t\t * state of a table is loaded. By default DataTables will load from `localStorage`\n\t\t * but you might wish to use a server-side database or cookies.\n\t\t *  @type function\n\t\t *  @member\n\t\t *  @param {object} settings DataTables settings object\n\t\t *  @param {object} callback Callback that can be executed when done. It\n\t\t *    should be passed the loaded state object.\n\t\t *  @return {object} The DataTables state object to be loaded\n\t\t *\n\t\t *  @dtopt Callbacks\n\t\t *  @name DataTable.defaults.stateLoadCallback\n\t\t *\n\t\t *  @example\n\t\t *    $(document).ready( function() {\n\t\t *      $('#example').dataTable( {\n\t\t *        \"stateSave\": true,\n\t\t *        \"stateLoadCallback\": function (settings, callback) {\n\t\t *          $.ajax( {\n\t\t *            \"url\": \"/state_load\",\n\t\t *            \"dataType\": \"json\",\n\t\t *            \"success\": function (json) {\n\t\t *              callback( json );\n\t\t *            }\n\t\t *          } );\n\t\t *        }\n\t\t *      } );\n\t\t *    } );\n\t\t */\n\t\t\"fnStateLoadCallback\": function ( settings ) {\n\t\t\ttry {\n\t\t\t\treturn JSON.parse(\n\t\t\t\t\t(settings.iStateDuration === -1 ? sessionStorage : localStorage).getItem(\n\t\t\t\t\t\t'DataTables_'+settings.sInstance+'_'+location.pathname\n\t\t\t\t\t)\n\t\t\t\t);\n\t\t\t} catch (e) {\n\t\t\t\treturn {};\n\t\t\t}\n\t\t},\n\t\n\t\n\t\t/**\n\t\t * Callback which allows modification of the saved state prior to loading that state.\n\t\t * This callback is called when the table is loading state from the stored data, but\n\t\t * prior to the settings object being modified by the saved state. Note that for\n\t\t * plug-in authors, you should use the `stateLoadParams` event to load parameters for\n\t\t * a plug-in.\n\t\t *  @type function\n\t\t *  @param {object} settings DataTables settings object\n\t\t *  @param {object} data The state object that is to be loaded\n\t\t *\n\t\t *  @dtopt Callbacks\n\t\t *  @name DataTable.defaults.stateLoadParams\n\t\t *\n\t\t *  @example\n\t\t *    // Remove a saved filter, so filtering is never loaded\n\t\t *    $(document).ready( function() {\n\t\t *      $('#example').dataTable( {\n\t\t *        \"stateSave\": true,\n\t\t *        \"stateLoadParams\": function (settings, data) {\n\t\t *          data.oSearch.sSearch = \"\";\n\t\t *        }\n\t\t *      } );\n\t\t *    } );\n\t\t *\n\t\t *  @example\n\t\t *    // Disallow state loading by returning false\n\t\t *    $(document).ready( function() {\n\t\t *      $('#example').dataTable( {\n\t\t *        \"stateSave\": true,\n\t\t *        \"stateLoadParams\": function (settings, data) {\n\t\t *          return false;\n\t\t *        }\n\t\t *      } );\n\t\t *    } );\n\t\t */\n\t\t\"fnStateLoadParams\": null,\n\t\n\t\n\t\t/**\n\t\t * Callback that is called when the state has been loaded from the state saving method\n\t\t * and the DataTables settings object has been modified as a result of the loaded state.\n\t\t *  @type function\n\t\t *  @param {object} settings DataTables settings object\n\t\t *  @param {object} data The state object that was loaded\n\t\t *\n\t\t *  @dtopt Callbacks\n\t\t *  @name DataTable.defaults.stateLoaded\n\t\t *\n\t\t *  @example\n\t\t *    // Show an alert with the filtering value that was saved\n\t\t *    $(document).ready( function() {\n\t\t *      $('#example').dataTable( {\n\t\t *        \"stateSave\": true,\n\t\t *        \"stateLoaded\": function (settings, data) {\n\t\t *          alert( 'Saved filter was: '+data.oSearch.sSearch );\n\t\t *        }\n\t\t *      } );\n\t\t *    } );\n\t\t */\n\t\t\"fnStateLoaded\": null,\n\t\n\t\n\t\t/**\n\t\t * Save the table state. This function allows you to define where and how the state\n\t\t * information for the table is stored By default DataTables will use `localStorage`\n\t\t * but you might wish to use a server-side database or cookies.\n\t\t *  @type function\n\t\t *  @member\n\t\t *  @param {object} settings DataTables settings object\n\t\t *  @param {object} data The state object to be saved\n\t\t *\n\t\t *  @dtopt Callbacks\n\t\t *  @name DataTable.defaults.stateSaveCallback\n\t\t *\n\t\t *  @example\n\t\t *    $(document).ready( function() {\n\t\t *      $('#example').dataTable( {\n\t\t *        \"stateSave\": true,\n\t\t *        \"stateSaveCallback\": function (settings, data) {\n\t\t *          // Send an Ajax request to the server with the state object\n\t\t *          $.ajax( {\n\t\t *            \"url\": \"/state_save\",\n\t\t *            \"data\": data,\n\t\t *            \"dataType\": \"json\",\n\t\t *            \"method\": \"POST\"\n\t\t *            \"success\": function () {}\n\t\t *          } );\n\t\t *        }\n\t\t *      } );\n\t\t *    } );\n\t\t */\n\t\t\"fnStateSaveCallback\": function ( settings, data ) {\n\t\t\ttry {\n\t\t\t\t(settings.iStateDuration === -1 ? sessionStorage : localStorage).setItem(\n\t\t\t\t\t'DataTables_'+settings.sInstance+'_'+location.pathname,\n\t\t\t\t\tJSON.stringify( data )\n\t\t\t\t);\n\t\t\t} catch (e) {}\n\t\t},\n\t\n\t\n\t\t/**\n\t\t * Callback which allows modification of the state to be saved. Called when the table\n\t\t * has changed state a new state save is required. This method allows modification of\n\t\t * the state saving object prior to actually doing the save, including addition or\n\t\t * other state properties or modification. Note that for plug-in authors, you should\n\t\t * use the `stateSaveParams` event to save parameters for a plug-in.\n\t\t *  @type function\n\t\t *  @param {object} settings DataTables settings object\n\t\t *  @param {object} data The state object to be saved\n\t\t *\n\t\t *  @dtopt Callbacks\n\t\t *  @name DataTable.defaults.stateSaveParams\n\t\t *\n\t\t *  @example\n\t\t *    // Remove a saved filter, so filtering is never saved\n\t\t *    $(document).ready( function() {\n\t\t *      $('#example').dataTable( {\n\t\t *        \"stateSave\": true,\n\t\t *        \"stateSaveParams\": function (settings, data) {\n\t\t *          data.oSearch.sSearch = \"\";\n\t\t *        }\n\t\t *      } );\n\t\t *    } );\n\t\t */\n\t\t\"fnStateSaveParams\": null,\n\t\n\t\n\t\t/**\n\t\t * Duration for which the saved state information is considered valid. After this period\n\t\t * has elapsed the state will be returned to the default.\n\t\t * Value is given in seconds.\n\t\t *  @type int\n\t\t *  @default 7200 <i>(2 hours)</i>\n\t\t *\n\t\t *  @dtopt Options\n\t\t *  @name DataTable.defaults.stateDuration\n\t\t *\n\t\t *  @example\n\t\t *    $(document).ready( function() {\n\t\t *      $('#example').dataTable( {\n\t\t *        \"stateDuration\": 60*60*24; // 1 day\n\t\t *      } );\n\t\t *    } )\n\t\t */\n\t\t\"iStateDuration\": 7200,\n\t\n\t\n\t\t/**\n\t\t * When enabled DataTables will not make a request to the server for the first\n\t\t * page draw - rather it will use the data already on the page (no sorting etc\n\t\t * will be applied to it), thus saving on an XHR at load time. `deferLoading`\n\t\t * is used to indicate that deferred loading is required, but it is also used\n\t\t * to tell DataTables how many records there are in the full table (allowing\n\t\t * the information element and pagination to be displayed correctly). In the case\n\t\t * where a filtering is applied to the table on initial load, this can be\n\t\t * indicated by giving the parameter as an array, where the first element is\n\t\t * the number of records available after filtering and the second element is the\n\t\t * number of records without filtering (allowing the table information element\n\t\t * to be shown correctly).\n\t\t *  @type int | array\n\t\t *  @default null\n\t\t *\n\t\t *  @dtopt Options\n\t\t *  @name DataTable.defaults.deferLoading\n\t\t *\n\t\t *  @example\n\t\t *    // 57 records available in the table, no filtering applied\n\t\t *    $(document).ready( function() {\n\t\t *      $('#example').dataTable( {\n\t\t *        \"serverSide\": true,\n\t\t *        \"ajax\": \"scripts/server_processing.php\",\n\t\t *        \"deferLoading\": 57\n\t\t *      } );\n\t\t *    } );\n\t\t *\n\t\t *  @example\n\t\t *    // 57 records after filtering, 100 without filtering (an initial filter applied)\n\t\t *    $(document).ready( function() {\n\t\t *      $('#example').dataTable( {\n\t\t *        \"serverSide\": true,\n\t\t *        \"ajax\": \"scripts/server_processing.php\",\n\t\t *        \"deferLoading\": [ 57, 100 ],\n\t\t *        \"search\": {\n\t\t *          \"search\": \"my_filter\"\n\t\t *        }\n\t\t *      } );\n\t\t *    } );\n\t\t */\n\t\t\"iDeferLoading\": null,\n\t\n\t\n\t\t/**\n\t\t * Number of rows to display on a single page when using pagination. If\n\t\t * feature enabled (`lengthChange`) then the end user will be able to override\n\t\t * this to a custom setting using a pop-up menu.\n\t\t *  @type int\n\t\t *  @default 10\n\t\t *\n\t\t *  @dtopt Options\n\t\t *  @name DataTable.defaults.pageLength\n\t\t *\n\t\t *  @example\n\t\t *    $(document).ready( function() {\n\t\t *      $('#example').dataTable( {\n\t\t *        \"pageLength\": 50\n\t\t *      } );\n\t\t *    } )\n\t\t */\n\t\t\"iDisplayLength\": 10,\n\t\n\t\n\t\t/**\n\t\t * Define the starting point for data display when using DataTables with\n\t\t * pagination. Note that this parameter is the number of records, rather than\n\t\t * the page number, so if you have 10 records per page and want to start on\n\t\t * the third page, it should be \"20\".\n\t\t *  @type int\n\t\t *  @default 0\n\t\t *\n\t\t *  @dtopt Options\n\t\t *  @name DataTable.defaults.displayStart\n\t\t *\n\t\t *  @example\n\t\t *    $(document).ready( function() {\n\t\t *      $('#example').dataTable( {\n\t\t *        \"displayStart\": 20\n\t\t *      } );\n\t\t *    } )\n\t\t */\n\t\t\"iDisplayStart\": 0,\n\t\n\t\n\t\t/**\n\t\t * By default DataTables allows keyboard navigation of the table (sorting, paging,\n\t\t * and filtering) by adding a `tabindex` attribute to the required elements. This\n\t\t * allows you to tab through the controls and press the enter key to activate them.\n\t\t * The tabindex is default 0, meaning that the tab follows the flow of the document.\n\t\t * You can overrule this using this parameter if you wish. Use a value of -1 to\n\t\t * disable built-in keyboard navigation.\n\t\t *  @type int\n\t\t *  @default 0\n\t\t *\n\t\t *  @dtopt Options\n\t\t *  @name DataTable.defaults.tabIndex\n\t\t *\n\t\t *  @example\n\t\t *    $(document).ready( function() {\n\t\t *      $('#example').dataTable( {\n\t\t *        \"tabIndex\": 1\n\t\t *      } );\n\t\t *    } );\n\t\t */\n\t\t\"iTabIndex\": 0,\n\t\n\t\n\t\t/**\n\t\t * Classes that DataTables assigns to the various components and features\n\t\t * that it adds to the HTML table. This allows classes to be configured\n\t\t * during initialisation in addition to through the static\n\t\t * {@link DataTable.ext.oStdClasses} object).\n\t\t *  @namespace\n\t\t *  @name DataTable.defaults.classes\n\t\t */\n\t\t\"oClasses\": {},\n\t\n\t\n\t\t/**\n\t\t * All strings that DataTables uses in the user interface that it creates\n\t\t * are defined in this object, allowing you to modified them individually or\n\t\t * completely replace them all as required.\n\t\t *  @namespace\n\t\t *  @name DataTable.defaults.language\n\t\t */\n\t\t\"oLanguage\": {\n\t\t\t/**\n\t\t\t * Strings that are used for WAI-ARIA labels and controls only (these are not\n\t\t\t * actually visible on the page, but will be read by screenreaders, and thus\n\t\t\t * must be internationalised as well).\n\t\t\t *  @namespace\n\t\t\t *  @name DataTable.defaults.language.aria\n\t\t\t */\n\t\t\t\"oAria\": {\n\t\t\t\t/**\n\t\t\t\t * ARIA label that is added to the table headers when the column may be\n\t\t\t\t * sorted ascending by activing the column (click or return when focused).\n\t\t\t\t * Note that the column header is prefixed to this string.\n\t\t\t\t *  @type string\n\t\t\t\t *  @default : activate to sort column ascending\n\t\t\t\t *\n\t\t\t\t *  @dtopt Language\n\t\t\t\t *  @name DataTable.defaults.language.aria.sortAscending\n\t\t\t\t *\n\t\t\t\t *  @example\n\t\t\t\t *    $(document).ready( function() {\n\t\t\t\t *      $('#example').dataTable( {\n\t\t\t\t *        \"language\": {\n\t\t\t\t *          \"aria\": {\n\t\t\t\t *            \"sortAscending\": \" - click/return to sort ascending\"\n\t\t\t\t *          }\n\t\t\t\t *        }\n\t\t\t\t *      } );\n\t\t\t\t *    } );\n\t\t\t\t */\n\t\t\t\t\"sSortAscending\": \": activate to sort column ascending\",\n\t\n\t\t\t\t/**\n\t\t\t\t * ARIA label that is added to the table headers when the column may be\n\t\t\t\t * sorted descending by activing the column (click or return when focused).\n\t\t\t\t * Note that the column header is prefixed to this string.\n\t\t\t\t *  @type string\n\t\t\t\t *  @default : activate to sort column ascending\n\t\t\t\t *\n\t\t\t\t *  @dtopt Language\n\t\t\t\t *  @name DataTable.defaults.language.aria.sortDescending\n\t\t\t\t *\n\t\t\t\t *  @example\n\t\t\t\t *    $(document).ready( function() {\n\t\t\t\t *      $('#example').dataTable( {\n\t\t\t\t *        \"language\": {\n\t\t\t\t *          \"aria\": {\n\t\t\t\t *            \"sortDescending\": \" - click/return to sort descending\"\n\t\t\t\t *          }\n\t\t\t\t *        }\n\t\t\t\t *      } );\n\t\t\t\t *    } );\n\t\t\t\t */\n\t\t\t\t\"sSortDescending\": \": activate to sort column descending\"\n\t\t\t},\n\t\n\t\t\t/**\n\t\t\t * Pagination string used by DataTables for the built-in pagination\n\t\t\t * control types.\n\t\t\t *  @namespace\n\t\t\t *  @name DataTable.defaults.language.paginate\n\t\t\t */\n\t\t\t\"oPaginate\": {\n\t\t\t\t/**\n\t\t\t\t * Text to use when using the 'full_numbers' type of pagination for the\n\t\t\t\t * button to take the user to the first page.\n\t\t\t\t *  @type string\n\t\t\t\t *  @default First\n\t\t\t\t *\n\t\t\t\t *  @dtopt Language\n\t\t\t\t *  @name DataTable.defaults.language.paginate.first\n\t\t\t\t *\n\t\t\t\t *  @example\n\t\t\t\t *    $(document).ready( function() {\n\t\t\t\t *      $('#example').dataTable( {\n\t\t\t\t *        \"language\": {\n\t\t\t\t *          \"paginate\": {\n\t\t\t\t *            \"first\": \"First page\"\n\t\t\t\t *          }\n\t\t\t\t *        }\n\t\t\t\t *      } );\n\t\t\t\t *    } );\n\t\t\t\t */\n\t\t\t\t\"sFirst\": \"First\",\n\t\n\t\n\t\t\t\t/**\n\t\t\t\t * Text to use when using the 'full_numbers' type of pagination for the\n\t\t\t\t * button to take the user to the last page.\n\t\t\t\t *  @type string\n\t\t\t\t *  @default Last\n\t\t\t\t *\n\t\t\t\t *  @dtopt Language\n\t\t\t\t *  @name DataTable.defaults.language.paginate.last\n\t\t\t\t *\n\t\t\t\t *  @example\n\t\t\t\t *    $(document).ready( function() {\n\t\t\t\t *      $('#example').dataTable( {\n\t\t\t\t *        \"language\": {\n\t\t\t\t *          \"paginate\": {\n\t\t\t\t *            \"last\": \"Last page\"\n\t\t\t\t *          }\n\t\t\t\t *        }\n\t\t\t\t *      } );\n\t\t\t\t *    } );\n\t\t\t\t */\n\t\t\t\t\"sLast\": \"Last\",\n\t\n\t\n\t\t\t\t/**\n\t\t\t\t * Text to use for the 'next' pagination button (to take the user to the\n\t\t\t\t * next page).\n\t\t\t\t *  @type string\n\t\t\t\t *  @default Next\n\t\t\t\t *\n\t\t\t\t *  @dtopt Language\n\t\t\t\t *  @name DataTable.defaults.language.paginate.next\n\t\t\t\t *\n\t\t\t\t *  @example\n\t\t\t\t *    $(document).ready( function() {\n\t\t\t\t *      $('#example').dataTable( {\n\t\t\t\t *        \"language\": {\n\t\t\t\t *          \"paginate\": {\n\t\t\t\t *            \"next\": \"Next page\"\n\t\t\t\t *          }\n\t\t\t\t *        }\n\t\t\t\t *      } );\n\t\t\t\t *    } );\n\t\t\t\t */\n\t\t\t\t\"sNext\": \"Next\",\n\t\n\t\n\t\t\t\t/**\n\t\t\t\t * Text to use for the 'previous' pagination button (to take the user to\n\t\t\t\t * the previous page).\n\t\t\t\t *  @type string\n\t\t\t\t *  @default Previous\n\t\t\t\t *\n\t\t\t\t *  @dtopt Language\n\t\t\t\t *  @name DataTable.defaults.language.paginate.previous\n\t\t\t\t *\n\t\t\t\t *  @example\n\t\t\t\t *    $(document).ready( function() {\n\t\t\t\t *      $('#example').dataTable( {\n\t\t\t\t *        \"language\": {\n\t\t\t\t *          \"paginate\": {\n\t\t\t\t *            \"previous\": \"Previous page\"\n\t\t\t\t *          }\n\t\t\t\t *        }\n\t\t\t\t *      } );\n\t\t\t\t *    } );\n\t\t\t\t */\n\t\t\t\t\"sPrevious\": \"Previous\"\n\t\t\t},\n\t\n\t\t\t/**\n\t\t\t * This string is shown in preference to `zeroRecords` when the table is\n\t\t\t * empty of data (regardless of filtering). Note that this is an optional\n\t\t\t * parameter - if it is not given, the value of `zeroRecords` will be used\n\t\t\t * instead (either the default or given value).\n\t\t\t *  @type string\n\t\t\t *  @default No data available in table\n\t\t\t *\n\t\t\t *  @dtopt Language\n\t\t\t *  @name DataTable.defaults.language.emptyTable\n\t\t\t *\n\t\t\t *  @example\n\t\t\t *    $(document).ready( function() {\n\t\t\t *      $('#example').dataTable( {\n\t\t\t *        \"language\": {\n\t\t\t *          \"emptyTable\": \"No data available in table\"\n\t\t\t *        }\n\t\t\t *      } );\n\t\t\t *    } );\n\t\t\t */\n\t\t\t\"sEmptyTable\": \"No data available in table\",\n\t\n\t\n\t\t\t/**\n\t\t\t * This string gives information to the end user about the information\n\t\t\t * that is current on display on the page. The following tokens can be\n\t\t\t * used in the string and will be dynamically replaced as the table\n\t\t\t * display updates. This tokens can be placed anywhere in the string, or\n\t\t\t * removed as needed by the language requires:\n\t\t\t *\n\t\t\t * * `\\_START\\_` - Display index of the first record on the current page\n\t\t\t * * `\\_END\\_` - Display index of the last record on the current page\n\t\t\t * * `\\_TOTAL\\_` - Number of records in the table after filtering\n\t\t\t * * `\\_MAX\\_` - Number of records in the table without filtering\n\t\t\t * * `\\_PAGE\\_` - Current page number\n\t\t\t * * `\\_PAGES\\_` - Total number of pages of data in the table\n\t\t\t *\n\t\t\t *  @type string\n\t\t\t *  @default Showing _START_ to _END_ of _TOTAL_ entries\n\t\t\t *\n\t\t\t *  @dtopt Language\n\t\t\t *  @name DataTable.defaults.language.info\n\t\t\t *\n\t\t\t *  @example\n\t\t\t *    $(document).ready( function() {\n\t\t\t *      $('#example').dataTable( {\n\t\t\t *        \"language\": {\n\t\t\t *          \"info\": \"Showing page _PAGE_ of _PAGES_\"\n\t\t\t *        }\n\t\t\t *      } );\n\t\t\t *    } );\n\t\t\t */\n\t\t\t\"sInfo\": \"Showing _START_ to _END_ of _TOTAL_ entries\",\n\t\n\t\n\t\t\t/**\n\t\t\t * Display information string for when the table is empty. Typically the\n\t\t\t * format of this string should match `info`.\n\t\t\t *  @type string\n\t\t\t *  @default Showing 0 to 0 of 0 entries\n\t\t\t *\n\t\t\t *  @dtopt Language\n\t\t\t *  @name DataTable.defaults.language.infoEmpty\n\t\t\t *\n\t\t\t *  @example\n\t\t\t *    $(document).ready( function() {\n\t\t\t *      $('#example').dataTable( {\n\t\t\t *        \"language\": {\n\t\t\t *          \"infoEmpty\": \"No entries to show\"\n\t\t\t *        }\n\t\t\t *      } );\n\t\t\t *    } );\n\t\t\t */\n\t\t\t\"sInfoEmpty\": \"Showing 0 to 0 of 0 entries\",\n\t\n\t\n\t\t\t/**\n\t\t\t * When a user filters the information in a table, this string is appended\n\t\t\t * to the information (`info`) to give an idea of how strong the filtering\n\t\t\t * is. The variable _MAX_ is dynamically updated.\n\t\t\t *  @type string\n\t\t\t *  @default (filtered from _MAX_ total entries)\n\t\t\t *\n\t\t\t *  @dtopt Language\n\t\t\t *  @name DataTable.defaults.language.infoFiltered\n\t\t\t *\n\t\t\t *  @example\n\t\t\t *    $(document).ready( function() {\n\t\t\t *      $('#example').dataTable( {\n\t\t\t *        \"language\": {\n\t\t\t *          \"infoFiltered\": \" - filtering from _MAX_ records\"\n\t\t\t *        }\n\t\t\t *      } );\n\t\t\t *    } );\n\t\t\t */\n\t\t\t\"sInfoFiltered\": \"(filtered from _MAX_ total entries)\",\n\t\n\t\n\t\t\t/**\n\t\t\t * If can be useful to append extra information to the info string at times,\n\t\t\t * and this variable does exactly that. This information will be appended to\n\t\t\t * the `info` (`infoEmpty` and `infoFiltered` in whatever combination they are\n\t\t\t * being used) at all times.\n\t\t\t *  @type string\n\t\t\t *  @default <i>Empty string</i>\n\t\t\t *\n\t\t\t *  @dtopt Language\n\t\t\t *  @name DataTable.defaults.language.infoPostFix\n\t\t\t *\n\t\t\t *  @example\n\t\t\t *    $(document).ready( function() {\n\t\t\t *      $('#example').dataTable( {\n\t\t\t *        \"language\": {\n\t\t\t *          \"infoPostFix\": \"All records shown are derived from real information.\"\n\t\t\t *        }\n\t\t\t *      } );\n\t\t\t *    } );\n\t\t\t */\n\t\t\t\"sInfoPostFix\": \"\",\n\t\n\t\n\t\t\t/**\n\t\t\t * This decimal place operator is a little different from the other\n\t\t\t * language options since DataTables doesn't output floating point\n\t\t\t * numbers, so it won't ever use this for display of a number. Rather,\n\t\t\t * what this parameter does is modify the sort methods of the table so\n\t\t\t * that numbers which are in a format which has a character other than\n\t\t\t * a period (`.`) as a decimal place will be sorted numerically.\n\t\t\t *\n\t\t\t * Note that numbers with different decimal places cannot be shown in\n\t\t\t * the same table and still be sortable, the table must be consistent.\n\t\t\t * However, multiple different tables on the page can use different\n\t\t\t * decimal place characters.\n\t\t\t *  @type string\n\t\t\t *  @default \n\t\t\t *\n\t\t\t *  @dtopt Language\n\t\t\t *  @name DataTable.defaults.language.decimal\n\t\t\t *\n\t\t\t *  @example\n\t\t\t *    $(document).ready( function() {\n\t\t\t *      $('#example').dataTable( {\n\t\t\t *        \"language\": {\n\t\t\t *          \"decimal\": \",\"\n\t\t\t *          \"thousands\": \".\"\n\t\t\t *        }\n\t\t\t *      } );\n\t\t\t *    } );\n\t\t\t */\n\t\t\t\"sDecimal\": \"\",\n\t\n\t\n\t\t\t/**\n\t\t\t * DataTables has a build in number formatter (`formatNumber`) which is\n\t\t\t * used to format large numbers that are used in the table information.\n\t\t\t * By default a comma is used, but this can be trivially changed to any\n\t\t\t * character you wish with this parameter.\n\t\t\t *  @type string\n\t\t\t *  @default ,\n\t\t\t *\n\t\t\t *  @dtopt Language\n\t\t\t *  @name DataTable.defaults.language.thousands\n\t\t\t *\n\t\t\t *  @example\n\t\t\t *    $(document).ready( function() {\n\t\t\t *      $('#example').dataTable( {\n\t\t\t *        \"language\": {\n\t\t\t *          \"thousands\": \"'\"\n\t\t\t *        }\n\t\t\t *      } );\n\t\t\t *    } );\n\t\t\t */\n\t\t\t\"sThousands\": \",\",\n\t\n\t\n\t\t\t/**\n\t\t\t * Detail the action that will be taken when the drop down menu for the\n\t\t\t * pagination length option is changed. The '_MENU_' variable is replaced\n\t\t\t * with a default select list of 10, 25, 50 and 100, and can be replaced\n\t\t\t * with a custom select box if required.\n\t\t\t *  @type string\n\t\t\t *  @default Show _MENU_ entries\n\t\t\t *\n\t\t\t *  @dtopt Language\n\t\t\t *  @name DataTable.defaults.language.lengthMenu\n\t\t\t *\n\t\t\t *  @example\n\t\t\t *    // Language change only\n\t\t\t *    $(document).ready( function() {\n\t\t\t *      $('#example').dataTable( {\n\t\t\t *        \"language\": {\n\t\t\t *          \"lengthMenu\": \"Display _MENU_ records\"\n\t\t\t *        }\n\t\t\t *      } );\n\t\t\t *    } );\n\t\t\t *\n\t\t\t *  @example\n\t\t\t *    // Language and options change\n\t\t\t *    $(document).ready( function() {\n\t\t\t *      $('#example').dataTable( {\n\t\t\t *        \"language\": {\n\t\t\t *          \"lengthMenu\": 'Display <select>'+\n\t\t\t *            '<option value=\"10\">10</option>'+\n\t\t\t *            '<option value=\"20\">20</option>'+\n\t\t\t *            '<option value=\"30\">30</option>'+\n\t\t\t *            '<option value=\"40\">40</option>'+\n\t\t\t *            '<option value=\"50\">50</option>'+\n\t\t\t *            '<option value=\"-1\">All</option>'+\n\t\t\t *            '</select> records'\n\t\t\t *        }\n\t\t\t *      } );\n\t\t\t *    } );\n\t\t\t */\n\t\t\t\"sLengthMenu\": \"Show _MENU_ entries\",\n\t\n\t\n\t\t\t/**\n\t\t\t * When using Ajax sourced data and during the first draw when DataTables is\n\t\t\t * gathering the data, this message is shown in an empty row in the table to\n\t\t\t * indicate to the end user the the data is being loaded. Note that this\n\t\t\t * parameter is not used when loading data by server-side processing, just\n\t\t\t * Ajax sourced data with client-side processing.\n\t\t\t *  @type string\n\t\t\t *  @default Loading...\n\t\t\t *\n\t\t\t *  @dtopt Language\n\t\t\t *  @name DataTable.defaults.language.loadingRecords\n\t\t\t *\n\t\t\t *  @example\n\t\t\t *    $(document).ready( function() {\n\t\t\t *      $('#example').dataTable( {\n\t\t\t *        \"language\": {\n\t\t\t *          \"loadingRecords\": \"Please wait - loading...\"\n\t\t\t *        }\n\t\t\t *      } );\n\t\t\t *    } );\n\t\t\t */\n\t\t\t\"sLoadingRecords\": \"Loading...\",\n\t\n\t\n\t\t\t/**\n\t\t\t * Text which is displayed when the table is processing a user action\n\t\t\t * (usually a sort command or similar).\n\t\t\t *  @type string\n\t\t\t *  @default Processing...\n\t\t\t *\n\t\t\t *  @dtopt Language\n\t\t\t *  @name DataTable.defaults.language.processing\n\t\t\t *\n\t\t\t *  @example\n\t\t\t *    $(document).ready( function() {\n\t\t\t *      $('#example').dataTable( {\n\t\t\t *        \"language\": {\n\t\t\t *          \"processing\": \"DataTables is currently busy\"\n\t\t\t *        }\n\t\t\t *      } );\n\t\t\t *    } );\n\t\t\t */\n\t\t\t\"sProcessing\": \"Processing...\",\n\t\n\t\n\t\t\t/**\n\t\t\t * Details the actions that will be taken when the user types into the\n\t\t\t * filtering input text box. The variable \"_INPUT_\", if used in the string,\n\t\t\t * is replaced with the HTML text box for the filtering input allowing\n\t\t\t * control over where it appears in the string. If \"_INPUT_\" is not given\n\t\t\t * then the input box is appended to the string automatically.\n\t\t\t *  @type string\n\t\t\t *  @default Search:\n\t\t\t *\n\t\t\t *  @dtopt Language\n\t\t\t *  @name DataTable.defaults.language.search\n\t\t\t *\n\t\t\t *  @example\n\t\t\t *    // Input text box will be appended at the end automatically\n\t\t\t *    $(document).ready( function() {\n\t\t\t *      $('#example').dataTable( {\n\t\t\t *        \"language\": {\n\t\t\t *          \"search\": \"Filter records:\"\n\t\t\t *        }\n\t\t\t *      } );\n\t\t\t *    } );\n\t\t\t *\n\t\t\t *  @example\n\t\t\t *    // Specify where the filter should appear\n\t\t\t *    $(document).ready( function() {\n\t\t\t *      $('#example').dataTable( {\n\t\t\t *        \"language\": {\n\t\t\t *          \"search\": \"Apply filter _INPUT_ to table\"\n\t\t\t *        }\n\t\t\t *      } );\n\t\t\t *    } );\n\t\t\t */\n\t\t\t\"sSearch\": \"Search:\",\n\t\n\t\n\t\t\t/**\n\t\t\t * Assign a `placeholder` attribute to the search `input` element\n\t\t\t *  @type string\n\t\t\t *  @default \n\t\t\t *\n\t\t\t *  @dtopt Language\n\t\t\t *  @name DataTable.defaults.language.searchPlaceholder\n\t\t\t */\n\t\t\t\"sSearchPlaceholder\": \"\",\n\t\n\t\n\t\t\t/**\n\t\t\t * All of the language information can be stored in a file on the\n\t\t\t * server-side, which DataTables will look up if this parameter is passed.\n\t\t\t * It must store the URL of the language file, which is in a JSON format,\n\t\t\t * and the object has the same properties as the oLanguage object in the\n\t\t\t * initialiser object (i.e. the above parameters). Please refer to one of\n\t\t\t * the example language files to see how this works in action.\n\t\t\t *  @type string\n\t\t\t *  @default <i>Empty string - i.e. disabled</i>\n\t\t\t *\n\t\t\t *  @dtopt Language\n\t\t\t *  @name DataTable.defaults.language.url\n\t\t\t *\n\t\t\t *  @example\n\t\t\t *    $(document).ready( function() {\n\t\t\t *      $('#example').dataTable( {\n\t\t\t *        \"language\": {\n\t\t\t *          \"url\": \"http://www.sprymedia.co.uk/dataTables/lang.txt\"\n\t\t\t *        }\n\t\t\t *      } );\n\t\t\t *    } );\n\t\t\t */\n\t\t\t\"sUrl\": \"\",\n\t\n\t\n\t\t\t/**\n\t\t\t * Text shown inside the table records when the is no information to be\n\t\t\t * displayed after filtering. `emptyTable` is shown when there is simply no\n\t\t\t * information in the table at all (regardless of filtering).\n\t\t\t *  @type string\n\t\t\t *  @default No matching records found\n\t\t\t *\n\t\t\t *  @dtopt Language\n\t\t\t *  @name DataTable.defaults.language.zeroRecords\n\t\t\t *\n\t\t\t *  @example\n\t\t\t *    $(document).ready( function() {\n\t\t\t *      $('#example').dataTable( {\n\t\t\t *        \"language\": {\n\t\t\t *          \"zeroRecords\": \"No records to display\"\n\t\t\t *        }\n\t\t\t *      } );\n\t\t\t *    } );\n\t\t\t */\n\t\t\t\"sZeroRecords\": \"No matching records found\"\n\t\t},\n\t\n\t\n\t\t/**\n\t\t * This parameter allows you to have define the global filtering state at\n\t\t * initialisation time. As an object the `search` parameter must be\n\t\t * defined, but all other parameters are optional. When `regex` is true,\n\t\t * the search string will be treated as a regular expression, when false\n\t\t * (default) it will be treated as a straight string. When `smart`\n\t\t * DataTables will use it's smart filtering methods (to word match at\n\t\t * any point in the data), when false this will not be done.\n\t\t *  @namespace\n\t\t *  @extends DataTable.models.oSearch\n\t\t *\n\t\t *  @dtopt Options\n\t\t *  @name DataTable.defaults.search\n\t\t *\n\t\t *  @example\n\t\t *    $(document).ready( function() {\n\t\t *      $('#example').dataTable( {\n\t\t *        \"search\": {\"search\": \"Initial search\"}\n\t\t *      } );\n\t\t *    } )\n\t\t */\n\t\t\"oSearch\": $.extend( {}, DataTable.models.oSearch ),\n\t\n\t\n\t\t/**\n\t\t * __Deprecated__ The functionality provided by this parameter has now been\n\t\t * superseded by that provided through `ajax`, which should be used instead.\n\t\t *\n\t\t * By default DataTables will look for the property `data` (or `aaData` for\n\t\t * compatibility with DataTables 1.9-) when obtaining data from an Ajax\n\t\t * source or for server-side processing - this parameter allows that\n\t\t * property to be changed. You can use Javascript dotted object notation to\n\t\t * get a data source for multiple levels of nesting.\n\t\t *  @type string\n\t\t *  @default data\n\t\t *\n\t\t *  @dtopt Options\n\t\t *  @dtopt Server-side\n\t\t *  @name DataTable.defaults.ajaxDataProp\n\t\t *\n\t\t *  @deprecated 1.10. Please use `ajax` for this functionality now.\n\t\t */\n\t\t\"sAjaxDataProp\": \"data\",\n\t\n\t\n\t\t/**\n\t\t * __Deprecated__ The functionality provided by this parameter has now been\n\t\t * superseded by that provided through `ajax`, which should be used instead.\n\t\t *\n\t\t * You can instruct DataTables to load data from an external\n\t\t * source using this parameter (use aData if you want to pass data in you\n\t\t * already have). Simply provide a url a JSON object can be obtained from.\n\t\t *  @type string\n\t\t *  @default null\n\t\t *\n\t\t *  @dtopt Options\n\t\t *  @dtopt Server-side\n\t\t *  @name DataTable.defaults.ajaxSource\n\t\t *\n\t\t *  @deprecated 1.10. Please use `ajax` for this functionality now.\n\t\t */\n\t\t\"sAjaxSource\": null,\n\t\n\t\n\t\t/**\n\t\t * This initialisation variable allows you to specify exactly where in the\n\t\t * DOM you want DataTables to inject the various controls it adds to the page\n\t\t * (for example you might want the pagination controls at the top of the\n\t\t * table). DIV elements (with or without a custom class) can also be added to\n\t\t * aid styling. The follow syntax is used:\n\t\t *   <ul>\n\t\t *     <li>The following options are allowed:\n\t\t *       <ul>\n\t\t *         <li>'l' - Length changing</li>\n\t\t *         <li>'f' - Filtering input</li>\n\t\t *         <li>'t' - The table!</li>\n\t\t *         <li>'i' - Information</li>\n\t\t *         <li>'p' - Pagination</li>\n\t\t *         <li>'r' - pRocessing</li>\n\t\t *       </ul>\n\t\t *     </li>\n\t\t *     <li>The following constants are allowed:\n\t\t *       <ul>\n\t\t *         <li>'H' - jQueryUI theme \"header\" classes ('fg-toolbar ui-widget-header ui-corner-tl ui-corner-tr ui-helper-clearfix')</li>\n\t\t *         <li>'F' - jQueryUI theme \"footer\" classes ('fg-toolbar ui-widget-header ui-corner-bl ui-corner-br ui-helper-clearfix')</li>\n\t\t *       </ul>\n\t\t *     </li>\n\t\t *     <li>The following syntax is expected:\n\t\t *       <ul>\n\t\t *         <li>'&lt;' and '&gt;' - div elements</li>\n\t\t *         <li>'&lt;\"class\" and '&gt;' - div with a class</li>\n\t\t *         <li>'&lt;\"#id\" and '&gt;' - div with an ID</li>\n\t\t *       </ul>\n\t\t *     </li>\n\t\t *     <li>Examples:\n\t\t *       <ul>\n\t\t *         <li>'&lt;\"wrapper\"flipt&gt;'</li>\n\t\t *         <li>'&lt;lf&lt;t&gt;ip&gt;'</li>\n\t\t *       </ul>\n\t\t *     </li>\n\t\t *   </ul>\n\t\t *  @type string\n\t\t *  @default lfrtip <i>(when `jQueryUI` is false)</i> <b>or</b>\n\t\t *    <\"H\"lfr>t<\"F\"ip> <i>(when `jQueryUI` is true)</i>\n\t\t *\n\t\t *  @dtopt Options\n\t\t *  @name DataTable.defaults.dom\n\t\t *\n\t\t *  @example\n\t\t *    $(document).ready( function() {\n\t\t *      $('#example').dataTable( {\n\t\t *        \"dom\": '&lt;\"top\"i&gt;rt&lt;\"bottom\"flp&gt;&lt;\"clear\"&gt;'\n\t\t *      } );\n\t\t *    } );\n\t\t */\n\t\t\"sDom\": \"lfrtip\",\n\t\n\t\n\t\t/**\n\t\t * Search delay option. This will throttle full table searches that use the\n\t\t * DataTables provided search input element (it does not effect calls to\n\t\t * `dt-api search()`, providing a delay before the search is made.\n\t\t *  @type integer\n\t\t *  @default 0\n\t\t *\n\t\t *  @dtopt Options\n\t\t *  @name DataTable.defaults.searchDelay\n\t\t *\n\t\t *  @example\n\t\t *    $(document).ready( function() {\n\t\t *      $('#example').dataTable( {\n\t\t *        \"searchDelay\": 200\n\t\t *      } );\n\t\t *    } )\n\t\t */\n\t\t\"searchDelay\": null,\n\t\n\t\n\t\t/**\n\t\t * DataTables features six different built-in options for the buttons to\n\t\t * display for pagination control:\n\t\t *\n\t\t * * `numbers` - Page number buttons only\n\t\t * * `simple` - 'Previous' and 'Next' buttons only\n\t\t * * 'simple_numbers` - 'Previous' and 'Next' buttons, plus page numbers\n\t\t * * `full` - 'First', 'Previous', 'Next' and 'Last' buttons\n\t\t * * `full_numbers` - 'First', 'Previous', 'Next' and 'Last' buttons, plus page numbers\n\t\t * * `first_last_numbers` - 'First' and 'Last' buttons, plus page numbers\n\t\t *  \n\t\t * Further methods can be added using {@link DataTable.ext.oPagination}.\n\t\t *  @type string\n\t\t *  @default simple_numbers\n\t\t *\n\t\t *  @dtopt Options\n\t\t *  @name DataTable.defaults.pagingType\n\t\t *\n\t\t *  @example\n\t\t *    $(document).ready( function() {\n\t\t *      $('#example').dataTable( {\n\t\t *        \"pagingType\": \"full_numbers\"\n\t\t *      } );\n\t\t *    } )\n\t\t */\n\t\t\"sPaginationType\": \"simple_numbers\",\n\t\n\t\n\t\t/**\n\t\t * Enable horizontal scrolling. When a table is too wide to fit into a\n\t\t * certain layout, or you have a large number of columns in the table, you\n\t\t * can enable x-scrolling to show the table in a viewport, which can be\n\t\t * scrolled. This property can be `true` which will allow the table to\n\t\t * scroll horizontally when needed, or any CSS unit, or a number (in which\n\t\t * case it will be treated as a pixel measurement). Setting as simply `true`\n\t\t * is recommended.\n\t\t *  @type boolean|string\n\t\t *  @default <i>blank string - i.e. disabled</i>\n\t\t *\n\t\t *  @dtopt Features\n\t\t *  @name DataTable.defaults.scrollX\n\t\t *\n\t\t *  @example\n\t\t *    $(document).ready( function() {\n\t\t *      $('#example').dataTable( {\n\t\t *        \"scrollX\": true,\n\t\t *        \"scrollCollapse\": true\n\t\t *      } );\n\t\t *    } );\n\t\t */\n\t\t\"sScrollX\": \"\",\n\t\n\t\n\t\t/**\n\t\t * This property can be used to force a DataTable to use more width than it\n\t\t * might otherwise do when x-scrolling is enabled. For example if you have a\n\t\t * table which requires to be well spaced, this parameter is useful for\n\t\t * \"over-sizing\" the table, and thus forcing scrolling. This property can by\n\t\t * any CSS unit, or a number (in which case it will be treated as a pixel\n\t\t * measurement).\n\t\t *  @type string\n\t\t *  @default <i>blank string - i.e. disabled</i>\n\t\t *\n\t\t *  @dtopt Options\n\t\t *  @name DataTable.defaults.scrollXInner\n\t\t *\n\t\t *  @example\n\t\t *    $(document).ready( function() {\n\t\t *      $('#example').dataTable( {\n\t\t *        \"scrollX\": \"100%\",\n\t\t *        \"scrollXInner\": \"110%\"\n\t\t *      } );\n\t\t *    } );\n\t\t */\n\t\t\"sScrollXInner\": \"\",\n\t\n\t\n\t\t/**\n\t\t * Enable vertical scrolling. Vertical scrolling will constrain the DataTable\n\t\t * to the given height, and enable scrolling for any data which overflows the\n\t\t * current viewport. This can be used as an alternative to paging to display\n\t\t * a lot of data in a small area (although paging and scrolling can both be\n\t\t * enabled at the same time). This property can be any CSS unit, or a number\n\t\t * (in which case it will be treated as a pixel measurement).\n\t\t *  @type string\n\t\t *  @default <i>blank string - i.e. disabled</i>\n\t\t *\n\t\t *  @dtopt Features\n\t\t *  @name DataTable.defaults.scrollY\n\t\t *\n\t\t *  @example\n\t\t *    $(document).ready( function() {\n\t\t *      $('#example').dataTable( {\n\t\t *        \"scrollY\": \"200px\",\n\t\t *        \"paginate\": false\n\t\t *      } );\n\t\t *    } );\n\t\t */\n\t\t\"sScrollY\": \"\",\n\t\n\t\n\t\t/**\n\t\t * __Deprecated__ The functionality provided by this parameter has now been\n\t\t * superseded by that provided through `ajax`, which should be used instead.\n\t\t *\n\t\t * Set the HTTP method that is used to make the Ajax call for server-side\n\t\t * processing or Ajax sourced data.\n\t\t *  @type string\n\t\t *  @default GET\n\t\t *\n\t\t *  @dtopt Options\n\t\t *  @dtopt Server-side\n\t\t *  @name DataTable.defaults.serverMethod\n\t\t *\n\t\t *  @deprecated 1.10. Please use `ajax` for this functionality now.\n\t\t */\n\t\t\"sServerMethod\": \"GET\",\n\t\n\t\n\t\t/**\n\t\t * DataTables makes use of renderers when displaying HTML elements for\n\t\t * a table. These renderers can be added or modified by plug-ins to\n\t\t * generate suitable mark-up for a site. For example the Bootstrap\n\t\t * integration plug-in for DataTables uses a paging button renderer to\n\t\t * display pagination buttons in the mark-up required by Bootstrap.\n\t\t *\n\t\t * For further information about the renderers available see\n\t\t * DataTable.ext.renderer\n\t\t *  @type string|object\n\t\t *  @default null\n\t\t *\n\t\t *  @name DataTable.defaults.renderer\n\t\t *\n\t\t */\n\t\t\"renderer\": null,\n\t\n\t\n\t\t/**\n\t\t * Set the data property name that DataTables should use to get a row's id\n\t\t * to set as the `id` property in the node.\n\t\t *  @type string\n\t\t *  @default DT_RowId\n\t\t *\n\t\t *  @name DataTable.defaults.rowId\n\t\t */\n\t\t\"rowId\": \"DT_RowId\"\n\t};\n\t\n\t_fnHungarianMap( DataTable.defaults );\n\t\n\t\n\t\n\t/*\n\t * Developer note - See note in model.defaults.js about the use of Hungarian\n\t * notation and camel case.\n\t */\n\t\n\t/**\n\t * Column options that can be given to DataTables at initialisation time.\n\t *  @namespace\n\t */\n\tDataTable.defaults.column = {\n\t\t/**\n\t\t * Define which column(s) an order will occur on for this column. This\n\t\t * allows a column's ordering to take multiple columns into account when\n\t\t * doing a sort or use the data from a different column. For example first\n\t\t * name / last name columns make sense to do a multi-column sort over the\n\t\t * two columns.\n\t\t *  @type array|int\n\t\t *  @default null <i>Takes the value of the column index automatically</i>\n\t\t *\n\t\t *  @name DataTable.defaults.column.orderData\n\t\t *  @dtopt Columns\n\t\t *\n\t\t *  @example\n\t\t *    // Using `columnDefs`\n\t\t *    $(document).ready( function() {\n\t\t *      $('#example').dataTable( {\n\t\t *        \"columnDefs\": [\n\t\t *          { \"orderData\": [ 0, 1 ], \"targets\": [ 0 ] },\n\t\t *          { \"orderData\": [ 1, 0 ], \"targets\": [ 1 ] },\n\t\t *          { \"orderData\": 2, \"targets\": [ 2 ] }\n\t\t *        ]\n\t\t *      } );\n\t\t *    } );\n\t\t *\n\t\t *  @example\n\t\t *    // Using `columns`\n\t\t *    $(document).ready( function() {\n\t\t *      $('#example').dataTable( {\n\t\t *        \"columns\": [\n\t\t *          { \"orderData\": [ 0, 1 ] },\n\t\t *          { \"orderData\": [ 1, 0 ] },\n\t\t *          { \"orderData\": 2 },\n\t\t *          null,\n\t\t *          null\n\t\t *        ]\n\t\t *      } );\n\t\t *    } );\n\t\t */\n\t\t\"aDataSort\": null,\n\t\t\"iDataSort\": -1,\n\t\n\t\n\t\t/**\n\t\t * You can control the default ordering direction, and even alter the\n\t\t * behaviour of the sort handler (i.e. only allow ascending ordering etc)\n\t\t * using this parameter.\n\t\t *  @type array\n\t\t *  @default [ 'asc', 'desc' ]\n\t\t *\n\t\t *  @name DataTable.defaults.column.orderSequence\n\t\t *  @dtopt Columns\n\t\t *\n\t\t *  @example\n\t\t *    // Using `columnDefs`\n\t\t *    $(document).ready( function() {\n\t\t *      $('#example').dataTable( {\n\t\t *        \"columnDefs\": [\n\t\t *          { \"orderSequence\": [ \"asc\" ], \"targets\": [ 1 ] },\n\t\t *          { \"orderSequence\": [ \"desc\", \"asc\", \"asc\" ], \"targets\": [ 2 ] },\n\t\t *          { \"orderSequence\": [ \"desc\" ], \"targets\": [ 3 ] }\n\t\t *        ]\n\t\t *      } );\n\t\t *    } );\n\t\t *\n\t\t *  @example\n\t\t *    // Using `columns`\n\t\t *    $(document).ready( function() {\n\t\t *      $('#example').dataTable( {\n\t\t *        \"columns\": [\n\t\t *          null,\n\t\t *          { \"orderSequence\": [ \"asc\" ] },\n\t\t *          { \"orderSequence\": [ \"desc\", \"asc\", \"asc\" ] },\n\t\t *          { \"orderSequence\": [ \"desc\" ] },\n\t\t *          null\n\t\t *        ]\n\t\t *      } );\n\t\t *    } );\n\t\t */\n\t\t\"asSorting\": [ 'asc', 'desc' ],\n\t\n\t\n\t\t/**\n\t\t * Enable or disable filtering on the data in this column.\n\t\t *  @type boolean\n\t\t *  @default true\n\t\t *\n\t\t *  @name DataTable.defaults.column.searchable\n\t\t *  @dtopt Columns\n\t\t *\n\t\t *  @example\n\t\t *    // Using `columnDefs`\n\t\t *    $(document).ready( function() {\n\t\t *      $('#example').dataTable( {\n\t\t *        \"columnDefs\": [\n\t\t *          { \"searchable\": false, \"targets\": [ 0 ] }\n\t\t *        ] } );\n\t\t *    } );\n\t\t *\n\t\t *  @example\n\t\t *    // Using `columns`\n\t\t *    $(document).ready( function() {\n\t\t *      $('#example').dataTable( {\n\t\t *        \"columns\": [\n\t\t *          { \"searchable\": false },\n\t\t *          null,\n\t\t *          null,\n\t\t *          null,\n\t\t *          null\n\t\t *        ] } );\n\t\t *    } );\n\t\t */\n\t\t\"bSearchable\": true,\n\t\n\t\n\t\t/**\n\t\t * Enable or disable ordering on this column.\n\t\t *  @type boolean\n\t\t *  @default true\n\t\t *\n\t\t *  @name DataTable.defaults.column.orderable\n\t\t *  @dtopt Columns\n\t\t *\n\t\t *  @example\n\t\t *    // Using `columnDefs`\n\t\t *    $(document).ready( function() {\n\t\t *      $('#example').dataTable( {\n\t\t *        \"columnDefs\": [\n\t\t *          { \"orderable\": false, \"targets\": [ 0 ] }\n\t\t *        ] } );\n\t\t *    } );\n\t\t *\n\t\t *  @example\n\t\t *    // Using `columns`\n\t\t *    $(document).ready( function() {\n\t\t *      $('#example').dataTable( {\n\t\t *        \"columns\": [\n\t\t *          { \"orderable\": false },\n\t\t *          null,\n\t\t *          null,\n\t\t *          null,\n\t\t *          null\n\t\t *        ] } );\n\t\t *    } );\n\t\t */\n\t\t\"bSortable\": true,\n\t\n\t\n\t\t/**\n\t\t * Enable or disable the display of this column.\n\t\t *  @type boolean\n\t\t *  @default true\n\t\t *\n\t\t *  @name DataTable.defaults.column.visible\n\t\t *  @dtopt Columns\n\t\t *\n\t\t *  @example\n\t\t *    // Using `columnDefs`\n\t\t *    $(document).ready( function() {\n\t\t *      $('#example').dataTable( {\n\t\t *        \"columnDefs\": [\n\t\t *          { \"visible\": false, \"targets\": [ 0 ] }\n\t\t *        ] } );\n\t\t *    } );\n\t\t *\n\t\t *  @example\n\t\t *    // Using `columns`\n\t\t *    $(document).ready( function() {\n\t\t *      $('#example').dataTable( {\n\t\t *        \"columns\": [\n\t\t *          { \"visible\": false },\n\t\t *          null,\n\t\t *          null,\n\t\t *          null,\n\t\t *          null\n\t\t *        ] } );\n\t\t *    } );\n\t\t */\n\t\t\"bVisible\": true,\n\t\n\t\n\t\t/**\n\t\t * Developer definable function that is called whenever a cell is created (Ajax source,\n\t\t * etc) or processed for input (DOM source). This can be used as a compliment to mRender\n\t\t * allowing you to modify the DOM element (add background colour for example) when the\n\t\t * element is available.\n\t\t *  @type function\n\t\t *  @param {element} td The TD node that has been created\n\t\t *  @param {*} cellData The Data for the cell\n\t\t *  @param {array|object} rowData The data for the whole row\n\t\t *  @param {int} row The row index for the aoData data store\n\t\t *  @param {int} col The column index for aoColumns\n\t\t *\n\t\t *  @name DataTable.defaults.column.createdCell\n\t\t *  @dtopt Columns\n\t\t *\n\t\t *  @example\n\t\t *    $(document).ready( function() {\n\t\t *      $('#example').dataTable( {\n\t\t *        \"columnDefs\": [ {\n\t\t *          \"targets\": [3],\n\t\t *          \"createdCell\": function (td, cellData, rowData, row, col) {\n\t\t *            if ( cellData == \"1.7\" ) {\n\t\t *              $(td).css('color', 'blue')\n\t\t *            }\n\t\t *          }\n\t\t *        } ]\n\t\t *      });\n\t\t *    } );\n\t\t */\n\t\t\"fnCreatedCell\": null,\n\t\n\t\n\t\t/**\n\t\t * This parameter has been replaced by `data` in DataTables to ensure naming\n\t\t * consistency. `dataProp` can still be used, as there is backwards\n\t\t * compatibility in DataTables for this option, but it is strongly\n\t\t * recommended that you use `data` in preference to `dataProp`.\n\t\t *  @name DataTable.defaults.column.dataProp\n\t\t */\n\t\n\t\n\t\t/**\n\t\t * This property can be used to read data from any data source property,\n\t\t * including deeply nested objects / properties. `data` can be given in a\n\t\t * number of different ways which effect its behaviour:\n\t\t *\n\t\t * * `integer` - treated as an array index for the data source. This is the\n\t\t *   default that DataTables uses (incrementally increased for each column).\n\t\t * * `string` - read an object property from the data source. There are\n\t\t *   three 'special' options that can be used in the string to alter how\n\t\t *   DataTables reads the data from the source object:\n\t\t *    * `.` - Dotted Javascript notation. Just as you use a `.` in\n\t\t *      Javascript to read from nested objects, so to can the options\n\t\t *      specified in `data`. For example: `browser.version` or\n\t\t *      `browser.name`. If your object parameter name contains a period, use\n\t\t *      `\\\\` to escape it - i.e. `first\\\\.name`.\n\t\t *    * `[]` - Array notation. DataTables can automatically combine data\n\t\t *      from and array source, joining the data with the characters provided\n\t\t *      between the two brackets. For example: `name[, ]` would provide a\n\t\t *      comma-space separated list from the source array. If no characters\n\t\t *      are provided between the brackets, the original array source is\n\t\t *      returned.\n\t\t *    * `()` - Function notation. Adding `()` to the end of a parameter will\n\t\t *      execute a function of the name given. For example: `browser()` for a\n\t\t *      simple function on the data source, `browser.version()` for a\n\t\t *      function in a nested property or even `browser().version` to get an\n\t\t *      object property if the function called returns an object. Note that\n\t\t *      function notation is recommended for use in `render` rather than\n\t\t *      `data` as it is much simpler to use as a renderer.\n\t\t * * `null` - use the original data source for the row rather than plucking\n\t\t *   data directly from it. This action has effects on two other\n\t\t *   initialisation options:\n\t\t *    * `defaultContent` - When null is given as the `data` option and\n\t\t *      `defaultContent` is specified for the column, the value defined by\n\t\t *      `defaultContent` will be used for the cell.\n\t\t *    * `render` - When null is used for the `data` option and the `render`\n\t\t *      option is specified for the column, the whole data source for the\n\t\t *      row is used for the renderer.\n\t\t * * `function` - the function given will be executed whenever DataTables\n\t\t *   needs to set or get the data for a cell in the column. The function\n\t\t *   takes three parameters:\n\t\t *    * Parameters:\n\t\t *      * `{array|object}` The data source for the row\n\t\t *      * `{string}` The type call data requested - this will be 'set' when\n\t\t *        setting data or 'filter', 'display', 'type', 'sort' or undefined\n\t\t *        when gathering data. Note that when `undefined` is given for the\n\t\t *        type DataTables expects to get the raw data for the object back<\n\t\t *      * `{*}` Data to set when the second parameter is 'set'.\n\t\t *    * Return:\n\t\t *      * The return value from the function is not required when 'set' is\n\t\t *        the type of call, but otherwise the return is what will be used\n\t\t *        for the data requested.\n\t\t *\n\t\t * Note that `data` is a getter and setter option. If you just require\n\t\t * formatting of data for output, you will likely want to use `render` which\n\t\t * is simply a getter and thus simpler to use.\n\t\t *\n\t\t * Note that prior to DataTables 1.9.2 `data` was called `mDataProp`. The\n\t\t * name change reflects the flexibility of this property and is consistent\n\t\t * with the naming of mRender. If 'mDataProp' is given, then it will still\n\t\t * be used by DataTables, as it automatically maps the old name to the new\n\t\t * if required.\n\t\t *\n\t\t *  @type string|int|function|null\n\t\t *  @default null <i>Use automatically calculated column index</i>\n\t\t *\n\t\t *  @name DataTable.defaults.column.data\n\t\t *  @dtopt Columns\n\t\t *\n\t\t *  @example\n\t\t *    // Read table data from objects\n\t\t *    // JSON structure for each row:\n\t\t *    //   {\n\t\t *    //      \"engine\": {value},\n\t\t *    //      \"browser\": {value},\n\t\t *    //      \"platform\": {value},\n\t\t *    //      \"version\": {value},\n\t\t *    //      \"grade\": {value}\n\t\t *    //   }\n\t\t *    $(document).ready( function() {\n\t\t *      $('#example').dataTable( {\n\t\t *        \"ajaxSource\": \"sources/objects.txt\",\n\t\t *        \"columns\": [\n\t\t *          { \"data\": \"engine\" },\n\t\t *          { \"data\": \"browser\" },\n\t\t *          { \"data\": \"platform\" },\n\t\t *          { \"data\": \"version\" },\n\t\t *          { \"data\": \"grade\" }\n\t\t *        ]\n\t\t *      } );\n\t\t *    } );\n\t\t *\n\t\t *  @example\n\t\t *    // Read information from deeply nested objects\n\t\t *    // JSON structure for each row:\n\t\t *    //   {\n\t\t *    //      \"engine\": {value},\n\t\t *    //      \"browser\": {value},\n\t\t *    //      \"platform\": {\n\t\t *    //         \"inner\": {value}\n\t\t *    //      },\n\t\t *    //      \"details\": [\n\t\t *    //         {value}, {value}\n\t\t *    //      ]\n\t\t *    //   }\n\t\t *    $(document).ready( function() {\n\t\t *      $('#example').dataTable( {\n\t\t *        \"ajaxSource\": \"sources/deep.txt\",\n\t\t *        \"columns\": [\n\t\t *          { \"data\": \"engine\" },\n\t\t *          { \"data\": \"browser\" },\n\t\t *          { \"data\": \"platform.inner\" },\n\t\t *          { \"data\": \"details.0\" },\n\t\t *          { \"data\": \"details.1\" }\n\t\t *        ]\n\t\t *      } );\n\t\t *    } );\n\t\t *\n\t\t *  @example\n\t\t *    // Using `data` as a function to provide different information for\n\t\t *    // sorting, filtering and display. In this case, currency (price)\n\t\t *    $(document).ready( function() {\n\t\t *      $('#example').dataTable( {\n\t\t *        \"columnDefs\": [ {\n\t\t *          \"targets\": [ 0 ],\n\t\t *          \"data\": function ( source, type, val ) {\n\t\t *            if (type === 'set') {\n\t\t *              source.price = val;\n\t\t *              // Store the computed dislay and filter values for efficiency\n\t\t *              source.price_display = val==\"\" ? \"\" : \"$\"+numberFormat(val);\n\t\t *              source.price_filter  = val==\"\" ? \"\" : \"$\"+numberFormat(val)+\" \"+val;\n\t\t *              return;\n\t\t *            }\n\t\t *            else if (type === 'display') {\n\t\t *              return source.price_display;\n\t\t *            }\n\t\t *            else if (type === 'filter') {\n\t\t *              return source.price_filter;\n\t\t *            }\n\t\t *            // 'sort', 'type' and undefined all just use the integer\n\t\t *            return source.price;\n\t\t *          }\n\t\t *        } ]\n\t\t *      } );\n\t\t *    } );\n\t\t *\n\t\t *  @example\n\t\t *    // Using default content\n\t\t *    $(document).ready( function() {\n\t\t *      $('#example').dataTable( {\n\t\t *        \"columnDefs\": [ {\n\t\t *          \"targets\": [ 0 ],\n\t\t *          \"data\": null,\n\t\t *          \"defaultContent\": \"Click to edit\"\n\t\t *        } ]\n\t\t *      } );\n\t\t *    } );\n\t\t *\n\t\t *  @example\n\t\t *    // Using array notation - outputting a list from an array\n\t\t *    $(document).ready( function() {\n\t\t *      $('#example').dataTable( {\n\t\t *        \"columnDefs\": [ {\n\t\t *          \"targets\": [ 0 ],\n\t\t *          \"data\": \"name[, ]\"\n\t\t *        } ]\n\t\t *      } );\n\t\t *    } );\n\t\t *\n\t\t */\n\t\t\"mData\": null,\n\t\n\t\n\t\t/**\n\t\t * This property is the rendering partner to `data` and it is suggested that\n\t\t * when you want to manipulate data for display (including filtering,\n\t\t * sorting etc) without altering the underlying data for the table, use this\n\t\t * property. `render` can be considered to be the the read only companion to\n\t\t * `data` which is read / write (then as such more complex). Like `data`\n\t\t * this option can be given in a number of different ways to effect its\n\t\t * behaviour:\n\t\t *\n\t\t * * `integer` - treated as an array index for the data source. This is the\n\t\t *   default that DataTables uses (incrementally increased for each column).\n\t\t * * `string` - read an object property from the data source. There are\n\t\t *   three 'special' options that can be used in the string to alter how\n\t\t *   DataTables reads the data from the source object:\n\t\t *    * `.` - Dotted Javascript notation. Just as you use a `.` in\n\t\t *      Javascript to read from nested objects, so to can the options\n\t\t *      specified in `data`. For example: `browser.version` or\n\t\t *      `browser.name`. If your object parameter name contains a period, use\n\t\t *      `\\\\` to escape it - i.e. `first\\\\.name`.\n\t\t *    * `[]` - Array notation. DataTables can automatically combine data\n\t\t *      from and array source, joining the data with the characters provided\n\t\t *      between the two brackets. For example: `name[, ]` would provide a\n\t\t *      comma-space separated list from the source array. If no characters\n\t\t *      are provided between the brackets, the original array source is\n\t\t *      returned.\n\t\t *    * `()` - Function notation. Adding `()` to the end of a parameter will\n\t\t *      execute a function of the name given. For example: `browser()` for a\n\t\t *      simple function on the data source, `browser.version()` for a\n\t\t *      function in a nested property or even `browser().version` to get an\n\t\t *      object property if the function called returns an object.\n\t\t * * `object` - use different data for the different data types requested by\n\t\t *   DataTables ('filter', 'display', 'type' or 'sort'). The property names\n\t\t *   of the object is the data type the property refers to and the value can\n\t\t *   defined using an integer, string or function using the same rules as\n\t\t *   `render` normally does. Note that an `_` option _must_ be specified.\n\t\t *   This is the default value to use if you haven't specified a value for\n\t\t *   the data type requested by DataTables.\n\t\t * * `function` - the function given will be executed whenever DataTables\n\t\t *   needs to set or get the data for a cell in the column. The function\n\t\t *   takes three parameters:\n\t\t *    * Parameters:\n\t\t *      * {array|object} The data source for the row (based on `data`)\n\t\t *      * {string} The type call data requested - this will be 'filter',\n\t\t *        'display', 'type' or 'sort'.\n\t\t *      * {array|object} The full data source for the row (not based on\n\t\t *        `data`)\n\t\t *    * Return:\n\t\t *      * The return value from the function is what will be used for the\n\t\t *        data requested.\n\t\t *\n\t\t *  @type string|int|function|object|null\n\t\t *  @default null Use the data source value.\n\t\t *\n\t\t *  @name DataTable.defaults.column.render\n\t\t *  @dtopt Columns\n\t\t *\n\t\t *  @example\n\t\t *    // Create a comma separated list from an array of objects\n\t\t *    $(document).ready( function() {\n\t\t *      $('#example').dataTable( {\n\t\t *        \"ajaxSource\": \"sources/deep.txt\",\n\t\t *        \"columns\": [\n\t\t *          { \"data\": \"engine\" },\n\t\t *          { \"data\": \"browser\" },\n\t\t *          {\n\t\t *            \"data\": \"platform\",\n\t\t *            \"render\": \"[, ].name\"\n\t\t *          }\n\t\t *        ]\n\t\t *      } );\n\t\t *    } );\n\t\t *\n\t\t *  @example\n\t\t *    // Execute a function to obtain data\n\t\t *    $(document).ready( function() {\n\t\t *      $('#example').dataTable( {\n\t\t *        \"columnDefs\": [ {\n\t\t *          \"targets\": [ 0 ],\n\t\t *          \"data\": null, // Use the full data source object for the renderer's source\n\t\t *          \"render\": \"browserName()\"\n\t\t *        } ]\n\t\t *      } );\n\t\t *    } );\n\t\t *\n\t\t *  @example\n\t\t *    // As an object, extracting different data for the different types\n\t\t *    // This would be used with a data source such as:\n\t\t *    //   { \"phone\": 5552368, \"phone_filter\": \"5552368 555-2368\", \"phone_display\": \"555-2368\" }\n\t\t *    // Here the `phone` integer is used for sorting and type detection, while `phone_filter`\n\t\t *    // (which has both forms) is used for filtering for if a user inputs either format, while\n\t\t *    // the formatted phone number is the one that is shown in the table.\n\t\t *    $(document).ready( function() {\n\t\t *      $('#example').dataTable( {\n\t\t *        \"columnDefs\": [ {\n\t\t *          \"targets\": [ 0 ],\n\t\t *          \"data\": null, // Use the full data source object for the renderer's source\n\t\t *          \"render\": {\n\t\t *            \"_\": \"phone\",\n\t\t *            \"filter\": \"phone_filter\",\n\t\t *            \"display\": \"phone_display\"\n\t\t *          }\n\t\t *        } ]\n\t\t *      } );\n\t\t *    } );\n\t\t *\n\t\t *  @example\n\t\t *    // Use as a function to create a link from the data source\n\t\t *    $(document).ready( function() {\n\t\t *      $('#example').dataTable( {\n\t\t *        \"columnDefs\": [ {\n\t\t *          \"targets\": [ 0 ],\n\t\t *          \"data\": \"download_link\",\n\t\t *          \"render\": function ( data, type, full ) {\n\t\t *            return '<a href=\"'+data+'\">Download</a>';\n\t\t *          }\n\t\t *        } ]\n\t\t *      } );\n\t\t *    } );\n\t\t */\n\t\t\"mRender\": null,\n\t\n\t\n\t\t/**\n\t\t * Change the cell type created for the column - either TD cells or TH cells. This\n\t\t * can be useful as TH cells have semantic meaning in the table body, allowing them\n\t\t * to act as a header for a row (you may wish to add scope='row' to the TH elements).\n\t\t *  @type string\n\t\t *  @default td\n\t\t *\n\t\t *  @name DataTable.defaults.column.cellType\n\t\t *  @dtopt Columns\n\t\t *\n\t\t *  @example\n\t\t *    // Make the first column use TH cells\n\t\t *    $(document).ready( function() {\n\t\t *      $('#example').dataTable( {\n\t\t *        \"columnDefs\": [ {\n\t\t *          \"targets\": [ 0 ],\n\t\t *          \"cellType\": \"th\"\n\t\t *        } ]\n\t\t *      } );\n\t\t *    } );\n\t\t */\n\t\t\"sCellType\": \"td\",\n\t\n\t\n\t\t/**\n\t\t * Class to give to each cell in this column.\n\t\t *  @type string\n\t\t *  @default <i>Empty string</i>\n\t\t *\n\t\t *  @name DataTable.defaults.column.class\n\t\t *  @dtopt Columns\n\t\t *\n\t\t *  @example\n\t\t *    // Using `columnDefs`\n\t\t *    $(document).ready( function() {\n\t\t *      $('#example').dataTable( {\n\t\t *        \"columnDefs\": [\n\t\t *          { \"class\": \"my_class\", \"targets\": [ 0 ] }\n\t\t *        ]\n\t\t *      } );\n\t\t *    } );\n\t\t *\n\t\t *  @example\n\t\t *    // Using `columns`\n\t\t *    $(document).ready( function() {\n\t\t *      $('#example').dataTable( {\n\t\t *        \"columns\": [\n\t\t *          { \"class\": \"my_class\" },\n\t\t *          null,\n\t\t *          null,\n\t\t *          null,\n\t\t *          null\n\t\t *        ]\n\t\t *      } );\n\t\t *    } );\n\t\t */\n\t\t\"sClass\": \"\",\n\t\n\t\t/**\n\t\t * When DataTables calculates the column widths to assign to each column,\n\t\t * it finds the longest string in each column and then constructs a\n\t\t * temporary table and reads the widths from that. The problem with this\n\t\t * is that \"mmm\" is much wider then \"iiii\", but the latter is a longer\n\t\t * string - thus the calculation can go wrong (doing it properly and putting\n\t\t * it into an DOM object and measuring that is horribly(!) slow). Thus as\n\t\t * a \"work around\" we provide this option. It will append its value to the\n\t\t * text that is found to be the longest string for the column - i.e. padding.\n\t\t * Generally you shouldn't need this!\n\t\t *  @type string\n\t\t *  @default <i>Empty string<i>\n\t\t *\n\t\t *  @name DataTable.defaults.column.contentPadding\n\t\t *  @dtopt Columns\n\t\t *\n\t\t *  @example\n\t\t *    // Using `columns`\n\t\t *    $(document).ready( function() {\n\t\t *      $('#example').dataTable( {\n\t\t *        \"columns\": [\n\t\t *          null,\n\t\t *          null,\n\t\t *          null,\n\t\t *          {\n\t\t *            \"contentPadding\": \"mmm\"\n\t\t *          }\n\t\t *        ]\n\t\t *      } );\n\t\t *    } );\n\t\t */\n\t\t\"sContentPadding\": \"\",\n\t\n\t\n\t\t/**\n\t\t * Allows a default value to be given for a column's data, and will be used\n\t\t * whenever a null data source is encountered (this can be because `data`\n\t\t * is set to null, or because the data source itself is null).\n\t\t *  @type string\n\t\t *  @default null\n\t\t *\n\t\t *  @name DataTable.defaults.column.defaultContent\n\t\t *  @dtopt Columns\n\t\t *\n\t\t *  @example\n\t\t *    // Using `columnDefs`\n\t\t *    $(document).ready( function() {\n\t\t *      $('#example').dataTable( {\n\t\t *        \"columnDefs\": [\n\t\t *          {\n\t\t *            \"data\": null,\n\t\t *            \"defaultContent\": \"Edit\",\n\t\t *            \"targets\": [ -1 ]\n\t\t *          }\n\t\t *        ]\n\t\t *      } );\n\t\t *    } );\n\t\t *\n\t\t *  @example\n\t\t *    // Using `columns`\n\t\t *    $(document).ready( function() {\n\t\t *      $('#example').dataTable( {\n\t\t *        \"columns\": [\n\t\t *          null,\n\t\t *          null,\n\t\t *          null,\n\t\t *          {\n\t\t *            \"data\": null,\n\t\t *            \"defaultContent\": \"Edit\"\n\t\t *          }\n\t\t *        ]\n\t\t *      } );\n\t\t *    } );\n\t\t */\n\t\t\"sDefaultContent\": null,\n\t\n\t\n\t\t/**\n\t\t * This parameter is only used in DataTables' server-side processing. It can\n\t\t * be exceptionally useful to know what columns are being displayed on the\n\t\t * client side, and to map these to database fields. When defined, the names\n\t\t * also allow DataTables to reorder information from the server if it comes\n\t\t * back in an unexpected order (i.e. if you switch your columns around on the\n\t\t * client-side, your server-side code does not also need updating).\n\t\t *  @type string\n\t\t *  @default <i>Empty string</i>\n\t\t *\n\t\t *  @name DataTable.defaults.column.name\n\t\t *  @dtopt Columns\n\t\t *\n\t\t *  @example\n\t\t *    // Using `columnDefs`\n\t\t *    $(document).ready( function() {\n\t\t *      $('#example').dataTable( {\n\t\t *        \"columnDefs\": [\n\t\t *          { \"name\": \"engine\", \"targets\": [ 0 ] },\n\t\t *          { \"name\": \"browser\", \"targets\": [ 1 ] },\n\t\t *          { \"name\": \"platform\", \"targets\": [ 2 ] },\n\t\t *          { \"name\": \"version\", \"targets\": [ 3 ] },\n\t\t *          { \"name\": \"grade\", \"targets\": [ 4 ] }\n\t\t *        ]\n\t\t *      } );\n\t\t *    } );\n\t\t *\n\t\t *  @example\n\t\t *    // Using `columns`\n\t\t *    $(document).ready( function() {\n\t\t *      $('#example').dataTable( {\n\t\t *        \"columns\": [\n\t\t *          { \"name\": \"engine\" },\n\t\t *          { \"name\": \"browser\" },\n\t\t *          { \"name\": \"platform\" },\n\t\t *          { \"name\": \"version\" },\n\t\t *          { \"name\": \"grade\" }\n\t\t *        ]\n\t\t *      } );\n\t\t *    } );\n\t\t */\n\t\t\"sName\": \"\",\n\t\n\t\n\t\t/**\n\t\t * Defines a data source type for the ordering which can be used to read\n\t\t * real-time information from the table (updating the internally cached\n\t\t * version) prior to ordering. This allows ordering to occur on user\n\t\t * editable elements such as form inputs.\n\t\t *  @type string\n\t\t *  @default std\n\t\t *\n\t\t *  @name DataTable.defaults.column.orderDataType\n\t\t *  @dtopt Columns\n\t\t *\n\t\t *  @example\n\t\t *    // Using `columnDefs`\n\t\t *    $(document).ready( function() {\n\t\t *      $('#example').dataTable( {\n\t\t *        \"columnDefs\": [\n\t\t *          { \"orderDataType\": \"dom-text\", \"targets\": [ 2, 3 ] },\n\t\t *          { \"type\": \"numeric\", \"targets\": [ 3 ] },\n\t\t *          { \"orderDataType\": \"dom-select\", \"targets\": [ 4 ] },\n\t\t *          { \"orderDataType\": \"dom-checkbox\", \"targets\": [ 5 ] }\n\t\t *        ]\n\t\t *      } );\n\t\t *    } );\n\t\t *\n\t\t *  @example\n\t\t *    // Using `columns`\n\t\t *    $(document).ready( function() {\n\t\t *      $('#example').dataTable( {\n\t\t *        \"columns\": [\n\t\t *          null,\n\t\t *          null,\n\t\t *          { \"orderDataType\": \"dom-text\" },\n\t\t *          { \"orderDataType\": \"dom-text\", \"type\": \"numeric\" },\n\t\t *          { \"orderDataType\": \"dom-select\" },\n\t\t *          { \"orderDataType\": \"dom-checkbox\" }\n\t\t *        ]\n\t\t *      } );\n\t\t *    } );\n\t\t */\n\t\t\"sSortDataType\": \"std\",\n\t\n\t\n\t\t/**\n\t\t * The title of this column.\n\t\t *  @type string\n\t\t *  @default null <i>Derived from the 'TH' value for this column in the\n\t\t *    original HTML table.</i>\n\t\t *\n\t\t *  @name DataTable.defaults.column.title\n\t\t *  @dtopt Columns\n\t\t *\n\t\t *  @example\n\t\t *    // Using `columnDefs`\n\t\t *    $(document).ready( function() {\n\t\t *      $('#example').dataTable( {\n\t\t *        \"columnDefs\": [\n\t\t *          { \"title\": \"My column title\", \"targets\": [ 0 ] }\n\t\t *        ]\n\t\t *      } );\n\t\t *    } );\n\t\t *\n\t\t *  @example\n\t\t *    // Using `columns`\n\t\t *    $(document).ready( function() {\n\t\t *      $('#example').dataTable( {\n\t\t *        \"columns\": [\n\t\t *          { \"title\": \"My column title\" },\n\t\t *          null,\n\t\t *          null,\n\t\t *          null,\n\t\t *          null\n\t\t *        ]\n\t\t *      } );\n\t\t *    } );\n\t\t */\n\t\t\"sTitle\": null,\n\t\n\t\n\t\t/**\n\t\t * The type allows you to specify how the data for this column will be\n\t\t * ordered. Four types (string, numeric, date and html (which will strip\n\t\t * HTML tags before ordering)) are currently available. Note that only date\n\t\t * formats understood by Javascript's Date() object will be accepted as type\n\t\t * date. For example: \"Mar 26, 2008 5:03 PM\". May take the values: 'string',\n\t\t * 'numeric', 'date' or 'html' (by default). Further types can be adding\n\t\t * through plug-ins.\n\t\t *  @type string\n\t\t *  @default null <i>Auto-detected from raw data</i>\n\t\t *\n\t\t *  @name DataTable.defaults.column.type\n\t\t *  @dtopt Columns\n\t\t *\n\t\t *  @example\n\t\t *    // Using `columnDefs`\n\t\t *    $(document).ready( function() {\n\t\t *      $('#example').dataTable( {\n\t\t *        \"columnDefs\": [\n\t\t *          { \"type\": \"html\", \"targets\": [ 0 ] }\n\t\t *        ]\n\t\t *      } );\n\t\t *    } );\n\t\t *\n\t\t *  @example\n\t\t *    // Using `columns`\n\t\t *    $(document).ready( function() {\n\t\t *      $('#example').dataTable( {\n\t\t *        \"columns\": [\n\t\t *          { \"type\": \"html\" },\n\t\t *          null,\n\t\t *          null,\n\t\t *          null,\n\t\t *          null\n\t\t *        ]\n\t\t *      } );\n\t\t *    } );\n\t\t */\n\t\t\"sType\": null,\n\t\n\t\n\t\t/**\n\t\t * Defining the width of the column, this parameter may take any CSS value\n\t\t * (3em, 20px etc). DataTables applies 'smart' widths to columns which have not\n\t\t * been given a specific width through this interface ensuring that the table\n\t\t * remains readable.\n\t\t *  @type string\n\t\t *  @default null <i>Automatic</i>\n\t\t *\n\t\t *  @name DataTable.defaults.column.width\n\t\t *  @dtopt Columns\n\t\t *\n\t\t *  @example\n\t\t *    // Using `columnDefs`\n\t\t *    $(document).ready( function() {\n\t\t *      $('#example').dataTable( {\n\t\t *        \"columnDefs\": [\n\t\t *          { \"width\": \"20%\", \"targets\": [ 0 ] }\n\t\t *        ]\n\t\t *      } );\n\t\t *    } );\n\t\t *\n\t\t *  @example\n\t\t *    // Using `columns`\n\t\t *    $(document).ready( function() {\n\t\t *      $('#example').dataTable( {\n\t\t *        \"columns\": [\n\t\t *          { \"width\": \"20%\" },\n\t\t *          null,\n\t\t *          null,\n\t\t *          null,\n\t\t *          null\n\t\t *        ]\n\t\t *      } );\n\t\t *    } );\n\t\t */\n\t\t\"sWidth\": null\n\t};\n\t\n\t_fnHungarianMap( DataTable.defaults.column );\n\t\n\t\n\t\n\t/**\n\t * DataTables settings object - this holds all the information needed for a\n\t * given table, including configuration, data and current application of the\n\t * table options. DataTables does not have a single instance for each DataTable\n\t * with the settings attached to that instance, but rather instances of the\n\t * DataTable \"class\" are created on-the-fly as needed (typically by a\n\t * $().dataTable() call) and the settings object is then applied to that\n\t * instance.\n\t *\n\t * Note that this object is related to {@link DataTable.defaults} but this\n\t * one is the internal data store for DataTables's cache of columns. It should\n\t * NOT be manipulated outside of DataTables. Any configuration should be done\n\t * through the initialisation options.\n\t *  @namespace\n\t *  @todo Really should attach the settings object to individual instances so we\n\t *    don't need to create new instances on each $().dataTable() call (if the\n\t *    table already exists). It would also save passing oSettings around and\n\t *    into every single function. However, this is a very significant\n\t *    architecture change for DataTables and will almost certainly break\n\t *    backwards compatibility with older installations. This is something that\n\t *    will be done in 2.0.\n\t */\n\tDataTable.models.oSettings = {\n\t\t/**\n\t\t * Primary features of DataTables and their enablement state.\n\t\t *  @namespace\n\t\t */\n\t\t\"oFeatures\": {\n\t\n\t\t\t/**\n\t\t\t * Flag to say if DataTables should automatically try to calculate the\n\t\t\t * optimum table and columns widths (true) or not (false).\n\t\t\t * Note that this parameter will be set by the initialisation routine. To\n\t\t\t * set a default use {@link DataTable.defaults}.\n\t\t\t *  @type boolean\n\t\t\t */\n\t\t\t\"bAutoWidth\": null,\n\t\n\t\t\t/**\n\t\t\t * Delay the creation of TR and TD elements until they are actually\n\t\t\t * needed by a driven page draw. This can give a significant speed\n\t\t\t * increase for Ajax source and Javascript source data, but makes no\n\t\t\t * difference at all fro DOM and server-side processing tables.\n\t\t\t * Note that this parameter will be set by the initialisation routine. To\n\t\t\t * set a default use {@link DataTable.defaults}.\n\t\t\t *  @type boolean\n\t\t\t */\n\t\t\t\"bDeferRender\": null,\n\t\n\t\t\t/**\n\t\t\t * Enable filtering on the table or not. Note that if this is disabled\n\t\t\t * then there is no filtering at all on the table, including fnFilter.\n\t\t\t * To just remove the filtering input use sDom and remove the 'f' option.\n\t\t\t * Note that this parameter will be set by the initialisation routine. To\n\t\t\t * set a default use {@link DataTable.defaults}.\n\t\t\t *  @type boolean\n\t\t\t */\n\t\t\t\"bFilter\": null,\n\t\n\t\t\t/**\n\t\t\t * Table information element (the 'Showing x of y records' div) enable\n\t\t\t * flag.\n\t\t\t * Note that this parameter will be set by the initialisation routine. To\n\t\t\t * set a default use {@link DataTable.defaults}.\n\t\t\t *  @type boolean\n\t\t\t */\n\t\t\t\"bInfo\": null,\n\t\n\t\t\t/**\n\t\t\t * Present a user control allowing the end user to change the page size\n\t\t\t * when pagination is enabled.\n\t\t\t * Note that this parameter will be set by the initialisation routine. To\n\t\t\t * set a default use {@link DataTable.defaults}.\n\t\t\t *  @type boolean\n\t\t\t */\n\t\t\t\"bLengthChange\": null,\n\t\n\t\t\t/**\n\t\t\t * Pagination enabled or not. Note that if this is disabled then length\n\t\t\t * changing must also be disabled.\n\t\t\t * Note that this parameter will be set by the initialisation routine. To\n\t\t\t * set a default use {@link DataTable.defaults}.\n\t\t\t *  @type boolean\n\t\t\t */\n\t\t\t\"bPaginate\": null,\n\t\n\t\t\t/**\n\t\t\t * Processing indicator enable flag whenever DataTables is enacting a\n\t\t\t * user request - typically an Ajax request for server-side processing.\n\t\t\t * Note that this parameter will be set by the initialisation routine. To\n\t\t\t * set a default use {@link DataTable.defaults}.\n\t\t\t *  @type boolean\n\t\t\t */\n\t\t\t\"bProcessing\": null,\n\t\n\t\t\t/**\n\t\t\t * Server-side processing enabled flag - when enabled DataTables will\n\t\t\t * get all data from the server for every draw - there is no filtering,\n\t\t\t * sorting or paging done on the client-side.\n\t\t\t * Note that this parameter will be set by the initialisation routine. To\n\t\t\t * set a default use {@link DataTable.defaults}.\n\t\t\t *  @type boolean\n\t\t\t */\n\t\t\t\"bServerSide\": null,\n\t\n\t\t\t/**\n\t\t\t * Sorting enablement flag.\n\t\t\t * Note that this parameter will be set by the initialisation routine. To\n\t\t\t * set a default use {@link DataTable.defaults}.\n\t\t\t *  @type boolean\n\t\t\t */\n\t\t\t\"bSort\": null,\n\t\n\t\t\t/**\n\t\t\t * Multi-column sorting\n\t\t\t * Note that this parameter will be set by the initialisation routine. To\n\t\t\t * set a default use {@link DataTable.defaults}.\n\t\t\t *  @type boolean\n\t\t\t */\n\t\t\t\"bSortMulti\": null,\n\t\n\t\t\t/**\n\t\t\t * Apply a class to the columns which are being sorted to provide a\n\t\t\t * visual highlight or not. This can slow things down when enabled since\n\t\t\t * there is a lot of DOM interaction.\n\t\t\t * Note that this parameter will be set by the initialisation routine. To\n\t\t\t * set a default use {@link DataTable.defaults}.\n\t\t\t *  @type boolean\n\t\t\t */\n\t\t\t\"bSortClasses\": null,\n\t\n\t\t\t/**\n\t\t\t * State saving enablement flag.\n\t\t\t * Note that this parameter will be set by the initialisation routine. To\n\t\t\t * set a default use {@link DataTable.defaults}.\n\t\t\t *  @type boolean\n\t\t\t */\n\t\t\t\"bStateSave\": null\n\t\t},\n\t\n\t\n\t\t/**\n\t\t * Scrolling settings for a table.\n\t\t *  @namespace\n\t\t */\n\t\t\"oScroll\": {\n\t\t\t/**\n\t\t\t * When the table is shorter in height than sScrollY, collapse the\n\t\t\t * table container down to the height of the table (when true).\n\t\t\t * Note that this parameter will be set by the initialisation routine. To\n\t\t\t * set a default use {@link DataTable.defaults}.\n\t\t\t *  @type boolean\n\t\t\t */\n\t\t\t\"bCollapse\": null,\n\t\n\t\t\t/**\n\t\t\t * Width of the scrollbar for the web-browser's platform. Calculated\n\t\t\t * during table initialisation.\n\t\t\t *  @type int\n\t\t\t *  @default 0\n\t\t\t */\n\t\t\t\"iBarWidth\": 0,\n\t\n\t\t\t/**\n\t\t\t * Viewport width for horizontal scrolling. Horizontal scrolling is\n\t\t\t * disabled if an empty string.\n\t\t\t * Note that this parameter will be set by the initialisation routine. To\n\t\t\t * set a default use {@link DataTable.defaults}.\n\t\t\t *  @type string\n\t\t\t */\n\t\t\t\"sX\": null,\n\t\n\t\t\t/**\n\t\t\t * Width to expand the table to when using x-scrolling. Typically you\n\t\t\t * should not need to use this.\n\t\t\t * Note that this parameter will be set by the initialisation routine. To\n\t\t\t * set a default use {@link DataTable.defaults}.\n\t\t\t *  @type string\n\t\t\t *  @deprecated\n\t\t\t */\n\t\t\t\"sXInner\": null,\n\t\n\t\t\t/**\n\t\t\t * Viewport height for vertical scrolling. Vertical scrolling is disabled\n\t\t\t * if an empty string.\n\t\t\t * Note that this parameter will be set by the initialisation routine. To\n\t\t\t * set a default use {@link DataTable.defaults}.\n\t\t\t *  @type string\n\t\t\t */\n\t\t\t\"sY\": null\n\t\t},\n\t\n\t\t/**\n\t\t * Language information for the table.\n\t\t *  @namespace\n\t\t *  @extends DataTable.defaults.oLanguage\n\t\t */\n\t\t\"oLanguage\": {\n\t\t\t/**\n\t\t\t * Information callback function. See\n\t\t\t * {@link DataTable.defaults.fnInfoCallback}\n\t\t\t *  @type function\n\t\t\t *  @default null\n\t\t\t */\n\t\t\t\"fnInfoCallback\": null\n\t\t},\n\t\n\t\t/**\n\t\t * Browser support parameters\n\t\t *  @namespace\n\t\t */\n\t\t\"oBrowser\": {\n\t\t\t/**\n\t\t\t * Indicate if the browser incorrectly calculates width:100% inside a\n\t\t\t * scrolling element (IE6/7)\n\t\t\t *  @type boolean\n\t\t\t *  @default false\n\t\t\t */\n\t\t\t\"bScrollOversize\": false,\n\t\n\t\t\t/**\n\t\t\t * Determine if the vertical scrollbar is on the right or left of the\n\t\t\t * scrolling container - needed for rtl language layout, although not\n\t\t\t * all browsers move the scrollbar (Safari).\n\t\t\t *  @type boolean\n\t\t\t *  @default false\n\t\t\t */\n\t\t\t\"bScrollbarLeft\": false,\n\t\n\t\t\t/**\n\t\t\t * Flag for if `getBoundingClientRect` is fully supported or not\n\t\t\t *  @type boolean\n\t\t\t *  @default false\n\t\t\t */\n\t\t\t\"bBounding\": false,\n\t\n\t\t\t/**\n\t\t\t * Browser scrollbar width\n\t\t\t *  @type integer\n\t\t\t *  @default 0\n\t\t\t */\n\t\t\t\"barWidth\": 0\n\t\t},\n\t\n\t\n\t\t\"ajax\": null,\n\t\n\t\n\t\t/**\n\t\t * Array referencing the nodes which are used for the features. The\n\t\t * parameters of this object match what is allowed by sDom - i.e.\n\t\t *   <ul>\n\t\t *     <li>'l' - Length changing</li>\n\t\t *     <li>'f' - Filtering input</li>\n\t\t *     <li>'t' - The table!</li>\n\t\t *     <li>'i' - Information</li>\n\t\t *     <li>'p' - Pagination</li>\n\t\t *     <li>'r' - pRocessing</li>\n\t\t *   </ul>\n\t\t *  @type array\n\t\t *  @default []\n\t\t */\n\t\t\"aanFeatures\": [],\n\t\n\t\t/**\n\t\t * Store data information - see {@link DataTable.models.oRow} for detailed\n\t\t * information.\n\t\t *  @type array\n\t\t *  @default []\n\t\t */\n\t\t\"aoData\": [],\n\t\n\t\t/**\n\t\t * Array of indexes which are in the current display (after filtering etc)\n\t\t *  @type array\n\t\t *  @default []\n\t\t */\n\t\t\"aiDisplay\": [],\n\t\n\t\t/**\n\t\t * Array of indexes for display - no filtering\n\t\t *  @type array\n\t\t *  @default []\n\t\t */\n\t\t\"aiDisplayMaster\": [],\n\t\n\t\t/**\n\t\t * Map of row ids to data indexes\n\t\t *  @type object\n\t\t *  @default {}\n\t\t */\n\t\t\"aIds\": {},\n\t\n\t\t/**\n\t\t * Store information about each column that is in use\n\t\t *  @type array\n\t\t *  @default []\n\t\t */\n\t\t\"aoColumns\": [],\n\t\n\t\t/**\n\t\t * Store information about the table's header\n\t\t *  @type array\n\t\t *  @default []\n\t\t */\n\t\t\"aoHeader\": [],\n\t\n\t\t/**\n\t\t * Store information about the table's footer\n\t\t *  @type array\n\t\t *  @default []\n\t\t */\n\t\t\"aoFooter\": [],\n\t\n\t\t/**\n\t\t * Store the applied global search information in case we want to force a\n\t\t * research or compare the old search to a new one.\n\t\t * Note that this parameter will be set by the initialisation routine. To\n\t\t * set a default use {@link DataTable.defaults}.\n\t\t *  @namespace\n\t\t *  @extends DataTable.models.oSearch\n\t\t */\n\t\t\"oPreviousSearch\": {},\n\t\n\t\t/**\n\t\t * Store the applied search for each column - see\n\t\t * {@link DataTable.models.oSearch} for the format that is used for the\n\t\t * filtering information for each column.\n\t\t *  @type array\n\t\t *  @default []\n\t\t */\n\t\t\"aoPreSearchCols\": [],\n\t\n\t\t/**\n\t\t * Sorting that is applied to the table. Note that the inner arrays are\n\t\t * used in the following manner:\n\t\t * <ul>\n\t\t *   <li>Index 0 - column number</li>\n\t\t *   <li>Index 1 - current sorting direction</li>\n\t\t * </ul>\n\t\t * Note that this parameter will be set by the initialisation routine. To\n\t\t * set a default use {@link DataTable.defaults}.\n\t\t *  @type array\n\t\t *  @todo These inner arrays should really be objects\n\t\t */\n\t\t\"aaSorting\": null,\n\t\n\t\t/**\n\t\t * Sorting that is always applied to the table (i.e. prefixed in front of\n\t\t * aaSorting).\n\t\t * Note that this parameter will be set by the initialisation routine. To\n\t\t * set a default use {@link DataTable.defaults}.\n\t\t *  @type array\n\t\t *  @default []\n\t\t */\n\t\t\"aaSortingFixed\": [],\n\t\n\t\t/**\n\t\t * Classes to use for the striping of a table.\n\t\t * Note that this parameter will be set by the initialisation routine. To\n\t\t * set a default use {@link DataTable.defaults}.\n\t\t *  @type array\n\t\t *  @default []\n\t\t */\n\t\t\"asStripeClasses\": null,\n\t\n\t\t/**\n\t\t * If restoring a table - we should restore its striping classes as well\n\t\t *  @type array\n\t\t *  @default []\n\t\t */\n\t\t\"asDestroyStripes\": [],\n\t\n\t\t/**\n\t\t * If restoring a table - we should restore its width\n\t\t *  @type int\n\t\t *  @default 0\n\t\t */\n\t\t\"sDestroyWidth\": 0,\n\t\n\t\t/**\n\t\t * Callback functions array for every time a row is inserted (i.e. on a draw).\n\t\t *  @type array\n\t\t *  @default []\n\t\t */\n\t\t\"aoRowCallback\": [],\n\t\n\t\t/**\n\t\t * Callback functions for the header on each draw.\n\t\t *  @type array\n\t\t *  @default []\n\t\t */\n\t\t\"aoHeaderCallback\": [],\n\t\n\t\t/**\n\t\t * Callback function for the footer on each draw.\n\t\t *  @type array\n\t\t *  @default []\n\t\t */\n\t\t\"aoFooterCallback\": [],\n\t\n\t\t/**\n\t\t * Array of callback functions for draw callback functions\n\t\t *  @type array\n\t\t *  @default []\n\t\t */\n\t\t\"aoDrawCallback\": [],\n\t\n\t\t/**\n\t\t * Array of callback functions for row created function\n\t\t *  @type array\n\t\t *  @default []\n\t\t */\n\t\t\"aoRowCreatedCallback\": [],\n\t\n\t\t/**\n\t\t * Callback functions for just before the table is redrawn. A return of\n\t\t * false will be used to cancel the draw.\n\t\t *  @type array\n\t\t *  @default []\n\t\t */\n\t\t\"aoPreDrawCallback\": [],\n\t\n\t\t/**\n\t\t * Callback functions for when the table has been initialised.\n\t\t *  @type array\n\t\t *  @default []\n\t\t */\n\t\t\"aoInitComplete\": [],\n\t\n\t\n\t\t/**\n\t\t * Callbacks for modifying the settings to be stored for state saving, prior to\n\t\t * saving state.\n\t\t *  @type array\n\t\t *  @default []\n\t\t */\n\t\t\"aoStateSaveParams\": [],\n\t\n\t\t/**\n\t\t * Callbacks for modifying the settings that have been stored for state saving\n\t\t * prior to using the stored values to restore the state.\n\t\t *  @type array\n\t\t *  @default []\n\t\t */\n\t\t\"aoStateLoadParams\": [],\n\t\n\t\t/**\n\t\t * Callbacks for operating on the settings object once the saved state has been\n\t\t * loaded\n\t\t *  @type array\n\t\t *  @default []\n\t\t */\n\t\t\"aoStateLoaded\": [],\n\t\n\t\t/**\n\t\t * Cache the table ID for quick access\n\t\t *  @type string\n\t\t *  @default <i>Empty string</i>\n\t\t */\n\t\t\"sTableId\": \"\",\n\t\n\t\t/**\n\t\t * The TABLE node for the main table\n\t\t *  @type node\n\t\t *  @default null\n\t\t */\n\t\t\"nTable\": null,\n\t\n\t\t/**\n\t\t * Permanent ref to the thead element\n\t\t *  @type node\n\t\t *  @default null\n\t\t */\n\t\t\"nTHead\": null,\n\t\n\t\t/**\n\t\t * Permanent ref to the tfoot element - if it exists\n\t\t *  @type node\n\t\t *  @default null\n\t\t */\n\t\t\"nTFoot\": null,\n\t\n\t\t/**\n\t\t * Permanent ref to the tbody element\n\t\t *  @type node\n\t\t *  @default null\n\t\t */\n\t\t\"nTBody\": null,\n\t\n\t\t/**\n\t\t * Cache the wrapper node (contains all DataTables controlled elements)\n\t\t *  @type node\n\t\t *  @default null\n\t\t */\n\t\t\"nTableWrapper\": null,\n\t\n\t\t/**\n\t\t * Indicate if when using server-side processing the loading of data\n\t\t * should be deferred until the second draw.\n\t\t * Note that this parameter will be set by the initialisation routine. To\n\t\t * set a default use {@link DataTable.defaults}.\n\t\t *  @type boolean\n\t\t *  @default false\n\t\t */\n\t\t\"bDeferLoading\": false,\n\t\n\t\t/**\n\t\t * Indicate if all required information has been read in\n\t\t *  @type boolean\n\t\t *  @default false\n\t\t */\n\t\t\"bInitialised\": false,\n\t\n\t\t/**\n\t\t * Information about open rows. Each object in the array has the parameters\n\t\t * 'nTr' and 'nParent'\n\t\t *  @type array\n\t\t *  @default []\n\t\t */\n\t\t\"aoOpenRows\": [],\n\t\n\t\t/**\n\t\t * Dictate the positioning of DataTables' control elements - see\n\t\t * {@link DataTable.model.oInit.sDom}.\n\t\t * Note that this parameter will be set by the initialisation routine. To\n\t\t * set a default use {@link DataTable.defaults}.\n\t\t *  @type string\n\t\t *  @default null\n\t\t */\n\t\t\"sDom\": null,\n\t\n\t\t/**\n\t\t * Search delay (in mS)\n\t\t *  @type integer\n\t\t *  @default null\n\t\t */\n\t\t\"searchDelay\": null,\n\t\n\t\t/**\n\t\t * Which type of pagination should be used.\n\t\t * Note that this parameter will be set by the initialisation routine. To\n\t\t * set a default use {@link DataTable.defaults}.\n\t\t *  @type string\n\t\t *  @default two_button\n\t\t */\n\t\t\"sPaginationType\": \"two_button\",\n\t\n\t\t/**\n\t\t * The state duration (for `stateSave`) in seconds.\n\t\t * Note that this parameter will be set by the initialisation routine. To\n\t\t * set a default use {@link DataTable.defaults}.\n\t\t *  @type int\n\t\t *  @default 0\n\t\t */\n\t\t\"iStateDuration\": 0,\n\t\n\t\t/**\n\t\t * Array of callback functions for state saving. Each array element is an\n\t\t * object with the following parameters:\n\t\t *   <ul>\n\t\t *     <li>function:fn - function to call. Takes two parameters, oSettings\n\t\t *       and the JSON string to save that has been thus far created. Returns\n\t\t *       a JSON string to be inserted into a json object\n\t\t *       (i.e. '\"param\": [ 0, 1, 2]')</li>\n\t\t *     <li>string:sName - name of callback</li>\n\t\t *   </ul>\n\t\t *  @type array\n\t\t *  @default []\n\t\t */\n\t\t\"aoStateSave\": [],\n\t\n\t\t/**\n\t\t * Array of callback functions for state loading. Each array element is an\n\t\t * object with the following parameters:\n\t\t *   <ul>\n\t\t *     <li>function:fn - function to call. Takes two parameters, oSettings\n\t\t *       and the object stored. May return false to cancel state loading</li>\n\t\t *     <li>string:sName - name of callback</li>\n\t\t *   </ul>\n\t\t *  @type array\n\t\t *  @default []\n\t\t */\n\t\t\"aoStateLoad\": [],\n\t\n\t\t/**\n\t\t * State that was saved. Useful for back reference\n\t\t *  @type object\n\t\t *  @default null\n\t\t */\n\t\t\"oSavedState\": null,\n\t\n\t\t/**\n\t\t * State that was loaded. Useful for back reference\n\t\t *  @type object\n\t\t *  @default null\n\t\t */\n\t\t\"oLoadedState\": null,\n\t\n\t\t/**\n\t\t * Source url for AJAX data for the table.\n\t\t * Note that this parameter will be set by the initialisation routine. To\n\t\t * set a default use {@link DataTable.defaults}.\n\t\t *  @type string\n\t\t *  @default null\n\t\t */\n\t\t\"sAjaxSource\": null,\n\t\n\t\t/**\n\t\t * Property from a given object from which to read the table data from. This\n\t\t * can be an empty string (when not server-side processing), in which case\n\t\t * it is  assumed an an array is given directly.\n\t\t * Note that this parameter will be set by the initialisation routine. To\n\t\t * set a default use {@link DataTable.defaults}.\n\t\t *  @type string\n\t\t */\n\t\t\"sAjaxDataProp\": null,\n\t\n\t\t/**\n\t\t * Note if draw should be blocked while getting data\n\t\t *  @type boolean\n\t\t *  @default true\n\t\t */\n\t\t\"bAjaxDataGet\": true,\n\t\n\t\t/**\n\t\t * The last jQuery XHR object that was used for server-side data gathering.\n\t\t * This can be used for working with the XHR information in one of the\n\t\t * callbacks\n\t\t *  @type object\n\t\t *  @default null\n\t\t */\n\t\t\"jqXHR\": null,\n\t\n\t\t/**\n\t\t * JSON returned from the server in the last Ajax request\n\t\t *  @type object\n\t\t *  @default undefined\n\t\t */\n\t\t\"json\": undefined,\n\t\n\t\t/**\n\t\t * Data submitted as part of the last Ajax request\n\t\t *  @type object\n\t\t *  @default undefined\n\t\t */\n\t\t\"oAjaxData\": undefined,\n\t\n\t\t/**\n\t\t * Function to get the server-side data.\n\t\t * Note that this parameter will be set by the initialisation routine. To\n\t\t * set a default use {@link DataTable.defaults}.\n\t\t *  @type function\n\t\t */\n\t\t\"fnServerData\": null,\n\t\n\t\t/**\n\t\t * Functions which are called prior to sending an Ajax request so extra\n\t\t * parameters can easily be sent to the server\n\t\t *  @type array\n\t\t *  @default []\n\t\t */\n\t\t\"aoServerParams\": [],\n\t\n\t\t/**\n\t\t * Send the XHR HTTP method - GET or POST (could be PUT or DELETE if\n\t\t * required).\n\t\t * Note that this parameter will be set by the initialisation routine. To\n\t\t * set a default use {@link DataTable.defaults}.\n\t\t *  @type string\n\t\t */\n\t\t\"sServerMethod\": null,\n\t\n\t\t/**\n\t\t * Format numbers for display.\n\t\t * Note that this parameter will be set by the initialisation routine. To\n\t\t * set a default use {@link DataTable.defaults}.\n\t\t *  @type function\n\t\t */\n\t\t\"fnFormatNumber\": null,\n\t\n\t\t/**\n\t\t * List of options that can be used for the user selectable length menu.\n\t\t * Note that this parameter will be set by the initialisation routine. To\n\t\t * set a default use {@link DataTable.defaults}.\n\t\t *  @type array\n\t\t *  @default []\n\t\t */\n\t\t\"aLengthMenu\": null,\n\t\n\t\t/**\n\t\t * Counter for the draws that the table does. Also used as a tracker for\n\t\t * server-side processing\n\t\t *  @type int\n\t\t *  @default 0\n\t\t */\n\t\t\"iDraw\": 0,\n\t\n\t\t/**\n\t\t * Indicate if a redraw is being done - useful for Ajax\n\t\t *  @type boolean\n\t\t *  @default false\n\t\t */\n\t\t\"bDrawing\": false,\n\t\n\t\t/**\n\t\t * Draw index (iDraw) of the last error when parsing the returned data\n\t\t *  @type int\n\t\t *  @default -1\n\t\t */\n\t\t\"iDrawError\": -1,\n\t\n\t\t/**\n\t\t * Paging display length\n\t\t *  @type int\n\t\t *  @default 10\n\t\t */\n\t\t\"_iDisplayLength\": 10,\n\t\n\t\t/**\n\t\t * Paging start point - aiDisplay index\n\t\t *  @type int\n\t\t *  @default 0\n\t\t */\n\t\t\"_iDisplayStart\": 0,\n\t\n\t\t/**\n\t\t * Server-side processing - number of records in the result set\n\t\t * (i.e. before filtering), Use fnRecordsTotal rather than\n\t\t * this property to get the value of the number of records, regardless of\n\t\t * the server-side processing setting.\n\t\t *  @type int\n\t\t *  @default 0\n\t\t *  @private\n\t\t */\n\t\t\"_iRecordsTotal\": 0,\n\t\n\t\t/**\n\t\t * Server-side processing - number of records in the current display set\n\t\t * (i.e. after filtering). Use fnRecordsDisplay rather than\n\t\t * this property to get the value of the number of records, regardless of\n\t\t * the server-side processing setting.\n\t\t *  @type boolean\n\t\t *  @default 0\n\t\t *  @private\n\t\t */\n\t\t\"_iRecordsDisplay\": 0,\n\t\n\t\t/**\n\t\t * The classes to use for the table\n\t\t *  @type object\n\t\t *  @default {}\n\t\t */\n\t\t\"oClasses\": {},\n\t\n\t\t/**\n\t\t * Flag attached to the settings object so you can check in the draw\n\t\t * callback if filtering has been done in the draw. Deprecated in favour of\n\t\t * events.\n\t\t *  @type boolean\n\t\t *  @default false\n\t\t *  @deprecated\n\t\t */\n\t\t\"bFiltered\": false,\n\t\n\t\t/**\n\t\t * Flag attached to the settings object so you can check in the draw\n\t\t * callback if sorting has been done in the draw. Deprecated in favour of\n\t\t * events.\n\t\t *  @type boolean\n\t\t *  @default false\n\t\t *  @deprecated\n\t\t */\n\t\t\"bSorted\": false,\n\t\n\t\t/**\n\t\t * Indicate that if multiple rows are in the header and there is more than\n\t\t * one unique cell per column, if the top one (true) or bottom one (false)\n\t\t * should be used for sorting / title by DataTables.\n\t\t * Note that this parameter will be set by the initialisation routine. To\n\t\t * set a default use {@link DataTable.defaults}.\n\t\t *  @type boolean\n\t\t */\n\t\t\"bSortCellsTop\": null,\n\t\n\t\t/**\n\t\t * Initialisation object that is used for the table\n\t\t *  @type object\n\t\t *  @default null\n\t\t */\n\t\t\"oInit\": null,\n\t\n\t\t/**\n\t\t * Destroy callback functions - for plug-ins to attach themselves to the\n\t\t * destroy so they can clean up markup and events.\n\t\t *  @type array\n\t\t *  @default []\n\t\t */\n\t\t\"aoDestroyCallback\": [],\n\t\n\t\n\t\t/**\n\t\t * Get the number of records in the current record set, before filtering\n\t\t *  @type function\n\t\t */\n\t\t\"fnRecordsTotal\": function ()\n\t\t{\n\t\t\treturn _fnDataSource( this ) == 'ssp' ?\n\t\t\t\tthis._iRecordsTotal * 1 :\n\t\t\t\tthis.aiDisplayMaster.length;\n\t\t},\n\t\n\t\t/**\n\t\t * Get the number of records in the current record set, after filtering\n\t\t *  @type function\n\t\t */\n\t\t\"fnRecordsDisplay\": function ()\n\t\t{\n\t\t\treturn _fnDataSource( this ) == 'ssp' ?\n\t\t\t\tthis._iRecordsDisplay * 1 :\n\t\t\t\tthis.aiDisplay.length;\n\t\t},\n\t\n\t\t/**\n\t\t * Get the display end point - aiDisplay index\n\t\t *  @type function\n\t\t */\n\t\t\"fnDisplayEnd\": function ()\n\t\t{\n\t\t\tvar\n\t\t\t\tlen      = this._iDisplayLength,\n\t\t\t\tstart    = this._iDisplayStart,\n\t\t\t\tcalc     = start + len,\n\t\t\t\trecords  = this.aiDisplay.length,\n\t\t\t\tfeatures = this.oFeatures,\n\t\t\t\tpaginate = features.bPaginate;\n\t\n\t\t\tif ( features.bServerSide ) {\n\t\t\t\treturn paginate === false || len === -1 ?\n\t\t\t\t\tstart + records :\n\t\t\t\t\tMath.min( start+len, this._iRecordsDisplay );\n\t\t\t}\n\t\t\telse {\n\t\t\t\treturn ! paginate || calc>records || len===-1 ?\n\t\t\t\t\trecords :\n\t\t\t\t\tcalc;\n\t\t\t}\n\t\t},\n\t\n\t\t/**\n\t\t * The DataTables object for this table\n\t\t *  @type object\n\t\t *  @default null\n\t\t */\n\t\t\"oInstance\": null,\n\t\n\t\t/**\n\t\t * Unique identifier for each instance of the DataTables object. If there\n\t\t * is an ID on the table node, then it takes that value, otherwise an\n\t\t * incrementing internal counter is used.\n\t\t *  @type string\n\t\t *  @default null\n\t\t */\n\t\t\"sInstance\": null,\n\t\n\t\t/**\n\t\t * tabindex attribute value that is added to DataTables control elements, allowing\n\t\t * keyboard navigation of the table and its controls.\n\t\t */\n\t\t\"iTabIndex\": 0,\n\t\n\t\t/**\n\t\t * DIV container for the footer scrolling table if scrolling\n\t\t */\n\t\t\"nScrollHead\": null,\n\t\n\t\t/**\n\t\t * DIV container for the footer scrolling table if scrolling\n\t\t */\n\t\t\"nScrollFoot\": null,\n\t\n\t\t/**\n\t\t * Last applied sort\n\t\t *  @type array\n\t\t *  @default []\n\t\t */\n\t\t\"aLastSort\": [],\n\t\n\t\t/**\n\t\t * Stored plug-in instances\n\t\t *  @type object\n\t\t *  @default {}\n\t\t */\n\t\t\"oPlugins\": {},\n\t\n\t\t/**\n\t\t * Function used to get a row's id from the row's data\n\t\t *  @type function\n\t\t *  @default null\n\t\t */\n\t\t\"rowIdFn\": null,\n\t\n\t\t/**\n\t\t * Data location where to store a row's id\n\t\t *  @type string\n\t\t *  @default null\n\t\t */\n\t\t\"rowId\": null\n\t};\n\n\t/**\n\t * Extension object for DataTables that is used to provide all extension\n\t * options.\n\t *\n\t * Note that the `DataTable.ext` object is available through\n\t * `jQuery.fn.dataTable.ext` where it may be accessed and manipulated. It is\n\t * also aliased to `jQuery.fn.dataTableExt` for historic reasons.\n\t *  @namespace\n\t *  @extends DataTable.models.ext\n\t */\n\t\n\t\n\t/**\n\t * DataTables extensions\n\t * \n\t * This namespace acts as a collection area for plug-ins that can be used to\n\t * extend DataTables capabilities. Indeed many of the build in methods\n\t * use this method to provide their own capabilities (sorting methods for\n\t * example).\n\t *\n\t * Note that this namespace is aliased to `jQuery.fn.dataTableExt` for legacy\n\t * reasons\n\t *\n\t *  @namespace\n\t */\n\tDataTable.ext = _ext = {\n\t\t/**\n\t\t * Buttons. For use with the Buttons extension for DataTables. This is\n\t\t * defined here so other extensions can define buttons regardless of load\n\t\t * order. It is _not_ used by DataTables core.\n\t\t *\n\t\t *  @type object\n\t\t *  @default {}\n\t\t */\n\t\tbuttons: {},\n\t\n\t\n\t\t/**\n\t\t * Element class names\n\t\t *\n\t\t *  @type object\n\t\t *  @default {}\n\t\t */\n\t\tclasses: {},\n\t\n\t\n\t\t/**\n\t\t * DataTables build type (expanded by the download builder)\n\t\t *\n\t\t *  @type string\n\t\t */\n\t\tbuilder: \"-source-\",\n\t\n\t\n\t\t/**\n\t\t * Error reporting.\n\t\t * \n\t\t * How should DataTables report an error. Can take the value 'alert',\n\t\t * 'throw', 'none' or a function.\n\t\t *\n\t\t *  @type string|function\n\t\t *  @default alert\n\t\t */\n\t\terrMode: \"alert\",\n\t\n\t\n\t\t/**\n\t\t * Feature plug-ins.\n\t\t * \n\t\t * This is an array of objects which describe the feature plug-ins that are\n\t\t * available to DataTables. These feature plug-ins are then available for\n\t\t * use through the `dom` initialisation option.\n\t\t * \n\t\t * Each feature plug-in is described by an object which must have the\n\t\t * following properties:\n\t\t * \n\t\t * * `fnInit` - function that is used to initialise the plug-in,\n\t\t * * `cFeature` - a character so the feature can be enabled by the `dom`\n\t\t *   instillation option. This is case sensitive.\n\t\t *\n\t\t * The `fnInit` function has the following input parameters:\n\t\t *\n\t\t * 1. `{object}` DataTables settings object: see\n\t\t *    {@link DataTable.models.oSettings}\n\t\t *\n\t\t * And the following return is expected:\n\t\t * \n\t\t * * {node|null} The element which contains your feature. Note that the\n\t\t *   return may also be void if your plug-in does not require to inject any\n\t\t *   DOM elements into DataTables control (`dom`) - for example this might\n\t\t *   be useful when developing a plug-in which allows table control via\n\t\t *   keyboard entry\n\t\t *\n\t\t *  @type array\n\t\t *\n\t\t *  @example\n\t\t *    $.fn.dataTable.ext.features.push( {\n\t\t *      \"fnInit\": function( oSettings ) {\n\t\t *        return new TableTools( { \"oDTSettings\": oSettings } );\n\t\t *      },\n\t\t *      \"cFeature\": \"T\"\n\t\t *    } );\n\t\t */\n\t\tfeature: [],\n\t\n\t\n\t\t/**\n\t\t * Row searching.\n\t\t * \n\t\t * This method of searching is complimentary to the default type based\n\t\t * searching, and a lot more comprehensive as it allows you complete control\n\t\t * over the searching logic. Each element in this array is a function\n\t\t * (parameters described below) that is called for every row in the table,\n\t\t * and your logic decides if it should be included in the searching data set\n\t\t * or not.\n\t\t *\n\t\t * Searching functions have the following input parameters:\n\t\t *\n\t\t * 1. `{object}` DataTables settings object: see\n\t\t *    {@link DataTable.models.oSettings}\n\t\t * 2. `{array|object}` Data for the row to be processed (same as the\n\t\t *    original format that was passed in as the data source, or an array\n\t\t *    from a DOM data source\n\t\t * 3. `{int}` Row index ({@link DataTable.models.oSettings.aoData}), which\n\t\t *    can be useful to retrieve the `TR` element if you need DOM interaction.\n\t\t *\n\t\t * And the following return is expected:\n\t\t *\n\t\t * * {boolean} Include the row in the searched result set (true) or not\n\t\t *   (false)\n\t\t *\n\t\t * Note that as with the main search ability in DataTables, technically this\n\t\t * is \"filtering\", since it is subtractive. However, for consistency in\n\t\t * naming we call it searching here.\n\t\t *\n\t\t *  @type array\n\t\t *  @default []\n\t\t *\n\t\t *  @example\n\t\t *    // The following example shows custom search being applied to the\n\t\t *    // fourth column (i.e. the data[3] index) based on two input values\n\t\t *    // from the end-user, matching the data in a certain range.\n\t\t *    $.fn.dataTable.ext.search.push(\n\t\t *      function( settings, data, dataIndex ) {\n\t\t *        var min = document.getElementById('min').value * 1;\n\t\t *        var max = document.getElementById('max').value * 1;\n\t\t *        var version = data[3] == \"-\" ? 0 : data[3]*1;\n\t\t *\n\t\t *        if ( min == \"\" && max == \"\" ) {\n\t\t *          return true;\n\t\t *        }\n\t\t *        else if ( min == \"\" && version < max ) {\n\t\t *          return true;\n\t\t *        }\n\t\t *        else if ( min < version && \"\" == max ) {\n\t\t *          return true;\n\t\t *        }\n\t\t *        else if ( min < version && version < max ) {\n\t\t *          return true;\n\t\t *        }\n\t\t *        return false;\n\t\t *      }\n\t\t *    );\n\t\t */\n\t\tsearch: [],\n\t\n\t\n\t\t/**\n\t\t * Selector extensions\n\t\t *\n\t\t * The `selector` option can be used to extend the options available for the\n\t\t * selector modifier options (`selector-modifier` object data type) that\n\t\t * each of the three built in selector types offer (row, column and cell +\n\t\t * their plural counterparts). For example the Select extension uses this\n\t\t * mechanism to provide an option to select only rows, columns and cells\n\t\t * that have been marked as selected by the end user (`{selected: true}`),\n\t\t * which can be used in conjunction with the existing built in selector\n\t\t * options.\n\t\t *\n\t\t * Each property is an array to which functions can be pushed. The functions\n\t\t * take three attributes:\n\t\t *\n\t\t * * Settings object for the host table\n\t\t * * Options object (`selector-modifier` object type)\n\t\t * * Array of selected item indexes\n\t\t *\n\t\t * The return is an array of the resulting item indexes after the custom\n\t\t * selector has been applied.\n\t\t *\n\t\t *  @type object\n\t\t */\n\t\tselector: {\n\t\t\tcell: [],\n\t\t\tcolumn: [],\n\t\t\trow: []\n\t\t},\n\t\n\t\n\t\t/**\n\t\t * Internal functions, exposed for used in plug-ins.\n\t\t * \n\t\t * Please note that you should not need to use the internal methods for\n\t\t * anything other than a plug-in (and even then, try to avoid if possible).\n\t\t * The internal function may change between releases.\n\t\t *\n\t\t *  @type object\n\t\t *  @default {}\n\t\t */\n\t\tinternal: {},\n\t\n\t\n\t\t/**\n\t\t * Legacy configuration options. Enable and disable legacy options that\n\t\t * are available in DataTables.\n\t\t *\n\t\t *  @type object\n\t\t */\n\t\tlegacy: {\n\t\t\t/**\n\t\t\t * Enable / disable DataTables 1.9 compatible server-side processing\n\t\t\t * requests\n\t\t\t *\n\t\t\t *  @type boolean\n\t\t\t *  @default null\n\t\t\t */\n\t\t\tajax: null\n\t\t},\n\t\n\t\n\t\t/**\n\t\t * Pagination plug-in methods.\n\t\t * \n\t\t * Each entry in this object is a function and defines which buttons should\n\t\t * be shown by the pagination rendering method that is used for the table:\n\t\t * {@link DataTable.ext.renderer.pageButton}. The renderer addresses how the\n\t\t * buttons are displayed in the document, while the functions here tell it\n\t\t * what buttons to display. This is done by returning an array of button\n\t\t * descriptions (what each button will do).\n\t\t *\n\t\t * Pagination types (the four built in options and any additional plug-in\n\t\t * options defined here) can be used through the `paginationType`\n\t\t * initialisation parameter.\n\t\t *\n\t\t * The functions defined take two parameters:\n\t\t *\n\t\t * 1. `{int} page` The current page index\n\t\t * 2. `{int} pages` The number of pages in the table\n\t\t *\n\t\t * Each function is expected to return an array where each element of the\n\t\t * array can be one of:\n\t\t *\n\t\t * * `first` - Jump to first page when activated\n\t\t * * `last` - Jump to last page when activated\n\t\t * * `previous` - Show previous page when activated\n\t\t * * `next` - Show next page when activated\n\t\t * * `{int}` - Show page of the index given\n\t\t * * `{array}` - A nested array containing the above elements to add a\n\t\t *   containing 'DIV' element (might be useful for styling).\n\t\t *\n\t\t * Note that DataTables v1.9- used this object slightly differently whereby\n\t\t * an object with two functions would be defined for each plug-in. That\n\t\t * ability is still supported by DataTables 1.10+ to provide backwards\n\t\t * compatibility, but this option of use is now decremented and no longer\n\t\t * documented in DataTables 1.10+.\n\t\t *\n\t\t *  @type object\n\t\t *  @default {}\n\t\t *\n\t\t *  @example\n\t\t *    // Show previous, next and current page buttons only\n\t\t *    $.fn.dataTableExt.oPagination.current = function ( page, pages ) {\n\t\t *      return [ 'previous', page, 'next' ];\n\t\t *    };\n\t\t */\n\t\tpager: {},\n\t\n\t\n\t\trenderer: {\n\t\t\tpageButton: {},\n\t\t\theader: {}\n\t\t},\n\t\n\t\n\t\t/**\n\t\t * Ordering plug-ins - custom data source\n\t\t * \n\t\t * The extension options for ordering of data available here is complimentary\n\t\t * to the default type based ordering that DataTables typically uses. It\n\t\t * allows much greater control over the the data that is being used to\n\t\t * order a column, but is necessarily therefore more complex.\n\t\t * \n\t\t * This type of ordering is useful if you want to do ordering based on data\n\t\t * live from the DOM (for example the contents of an 'input' element) rather\n\t\t * than just the static string that DataTables knows of.\n\t\t * \n\t\t * The way these plug-ins work is that you create an array of the values you\n\t\t * wish to be ordering for the column in question and then return that\n\t\t * array. The data in the array much be in the index order of the rows in\n\t\t * the table (not the currently ordering order!). Which order data gathering\n\t\t * function is run here depends on the `dt-init columns.orderDataType`\n\t\t * parameter that is used for the column (if any).\n\t\t *\n\t\t * The functions defined take two parameters:\n\t\t *\n\t\t * 1. `{object}` DataTables settings object: see\n\t\t *    {@link DataTable.models.oSettings}\n\t\t * 2. `{int}` Target column index\n\t\t *\n\t\t * Each function is expected to return an array:\n\t\t *\n\t\t * * `{array}` Data for the column to be ordering upon\n\t\t *\n\t\t *  @type array\n\t\t *\n\t\t *  @example\n\t\t *    // Ordering using `input` node values\n\t\t *    $.fn.dataTable.ext.order['dom-text'] = function  ( settings, col )\n\t\t *    {\n\t\t *      return this.api().column( col, {order:'index'} ).nodes().map( function ( td, i ) {\n\t\t *        return $('input', td).val();\n\t\t *      } );\n\t\t *    }\n\t\t */\n\t\torder: {},\n\t\n\t\n\t\t/**\n\t\t * Type based plug-ins.\n\t\t *\n\t\t * Each column in DataTables has a type assigned to it, either by automatic\n\t\t * detection or by direct assignment using the `type` option for the column.\n\t\t * The type of a column will effect how it is ordering and search (plug-ins\n\t\t * can also make use of the column type if required).\n\t\t *\n\t\t * @namespace\n\t\t */\n\t\ttype: {\n\t\t\t/**\n\t\t\t * Type detection functions.\n\t\t\t *\n\t\t\t * The functions defined in this object are used to automatically detect\n\t\t\t * a column's type, making initialisation of DataTables super easy, even\n\t\t\t * when complex data is in the table.\n\t\t\t *\n\t\t\t * The functions defined take two parameters:\n\t\t\t *\n\t\t     *  1. `{*}` Data from the column cell to be analysed\n\t\t     *  2. `{settings}` DataTables settings object. This can be used to\n\t\t     *     perform context specific type detection - for example detection\n\t\t     *     based on language settings such as using a comma for a decimal\n\t\t     *     place. Generally speaking the options from the settings will not\n\t\t     *     be required\n\t\t\t *\n\t\t\t * Each function is expected to return:\n\t\t\t *\n\t\t\t * * `{string|null}` Data type detected, or null if unknown (and thus\n\t\t\t *   pass it on to the other type detection functions.\n\t\t\t *\n\t\t\t *  @type array\n\t\t\t *\n\t\t\t *  @example\n\t\t\t *    // Currency type detection plug-in:\n\t\t\t *    $.fn.dataTable.ext.type.detect.push(\n\t\t\t *      function ( data, settings ) {\n\t\t\t *        // Check the numeric part\n\t\t\t *        if ( ! data.substring(1).match(/[0-9]/) ) {\n\t\t\t *          return null;\n\t\t\t *        }\n\t\t\t *\n\t\t\t *        // Check prefixed by currency\n\t\t\t *        if ( data.charAt(0) == '$' || data.charAt(0) == '&pound;' ) {\n\t\t\t *          return 'currency';\n\t\t\t *        }\n\t\t\t *        return null;\n\t\t\t *      }\n\t\t\t *    );\n\t\t\t */\n\t\t\tdetect: [],\n\t\n\t\n\t\t\t/**\n\t\t\t * Type based search formatting.\n\t\t\t *\n\t\t\t * The type based searching functions can be used to pre-format the\n\t\t\t * data to be search on. For example, it can be used to strip HTML\n\t\t\t * tags or to de-format telephone numbers for numeric only searching.\n\t\t\t *\n\t\t\t * Note that is a search is not defined for a column of a given type,\n\t\t\t * no search formatting will be performed.\n\t\t\t * \n\t\t\t * Pre-processing of searching data plug-ins - When you assign the sType\n\t\t\t * for a column (or have it automatically detected for you by DataTables\n\t\t\t * or a type detection plug-in), you will typically be using this for\n\t\t\t * custom sorting, but it can also be used to provide custom searching\n\t\t\t * by allowing you to pre-processing the data and returning the data in\n\t\t\t * the format that should be searched upon. This is done by adding\n\t\t\t * functions this object with a parameter name which matches the sType\n\t\t\t * for that target column. This is the corollary of <i>afnSortData</i>\n\t\t\t * for searching data.\n\t\t\t *\n\t\t\t * The functions defined take a single parameter:\n\t\t\t *\n\t\t     *  1. `{*}` Data from the column cell to be prepared for searching\n\t\t\t *\n\t\t\t * Each function is expected to return:\n\t\t\t *\n\t\t\t * * `{string|null}` Formatted string that will be used for the searching.\n\t\t\t *\n\t\t\t *  @type object\n\t\t\t *  @default {}\n\t\t\t *\n\t\t\t *  @example\n\t\t\t *    $.fn.dataTable.ext.type.search['title-numeric'] = function ( d ) {\n\t\t\t *      return d.replace(/\\n/g,\" \").replace( /<.*?>/g, \"\" );\n\t\t\t *    }\n\t\t\t */\n\t\t\tsearch: {},\n\t\n\t\n\t\t\t/**\n\t\t\t * Type based ordering.\n\t\t\t *\n\t\t\t * The column type tells DataTables what ordering to apply to the table\n\t\t\t * when a column is sorted upon. The order for each type that is defined,\n\t\t\t * is defined by the functions available in this object.\n\t\t\t *\n\t\t\t * Each ordering option can be described by three properties added to\n\t\t\t * this object:\n\t\t\t *\n\t\t\t * * `{type}-pre` - Pre-formatting function\n\t\t\t * * `{type}-asc` - Ascending order function\n\t\t\t * * `{type}-desc` - Descending order function\n\t\t\t *\n\t\t\t * All three can be used together, only `{type}-pre` or only\n\t\t\t * `{type}-asc` and `{type}-desc` together. It is generally recommended\n\t\t\t * that only `{type}-pre` is used, as this provides the optimal\n\t\t\t * implementation in terms of speed, although the others are provided\n\t\t\t * for compatibility with existing Javascript sort functions.\n\t\t\t *\n\t\t\t * `{type}-pre`: Functions defined take a single parameter:\n\t\t\t *\n\t\t     *  1. `{*}` Data from the column cell to be prepared for ordering\n\t\t\t *\n\t\t\t * And return:\n\t\t\t *\n\t\t\t * * `{*}` Data to be sorted upon\n\t\t\t *\n\t\t\t * `{type}-asc` and `{type}-desc`: Functions are typical Javascript sort\n\t\t\t * functions, taking two parameters:\n\t\t\t *\n\t\t     *  1. `{*}` Data to compare to the second parameter\n\t\t     *  2. `{*}` Data to compare to the first parameter\n\t\t\t *\n\t\t\t * And returning:\n\t\t\t *\n\t\t\t * * `{*}` Ordering match: <0 if first parameter should be sorted lower\n\t\t\t *   than the second parameter, ===0 if the two parameters are equal and\n\t\t\t *   >0 if the first parameter should be sorted height than the second\n\t\t\t *   parameter.\n\t\t\t * \n\t\t\t *  @type object\n\t\t\t *  @default {}\n\t\t\t *\n\t\t\t *  @example\n\t\t\t *    // Numeric ordering of formatted numbers with a pre-formatter\n\t\t\t *    $.extend( $.fn.dataTable.ext.type.order, {\n\t\t\t *      \"string-pre\": function(x) {\n\t\t\t *        a = (a === \"-\" || a === \"\") ? 0 : a.replace( /[^\\d\\-\\.]/g, \"\" );\n\t\t\t *        return parseFloat( a );\n\t\t\t *      }\n\t\t\t *    } );\n\t\t\t *\n\t\t\t *  @example\n\t\t\t *    // Case-sensitive string ordering, with no pre-formatting method\n\t\t\t *    $.extend( $.fn.dataTable.ext.order, {\n\t\t\t *      \"string-case-asc\": function(x,y) {\n\t\t\t *        return ((x < y) ? -1 : ((x > y) ? 1 : 0));\n\t\t\t *      },\n\t\t\t *      \"string-case-desc\": function(x,y) {\n\t\t\t *        return ((x < y) ? 1 : ((x > y) ? -1 : 0));\n\t\t\t *      }\n\t\t\t *    } );\n\t\t\t */\n\t\t\torder: {}\n\t\t},\n\t\n\t\t/**\n\t\t * Unique DataTables instance counter\n\t\t *\n\t\t * @type int\n\t\t * @private\n\t\t */\n\t\t_unique: 0,\n\t\n\t\n\t\t//\n\t\t// Depreciated\n\t\t// The following properties are retained for backwards compatiblity only.\n\t\t// The should not be used in new projects and will be removed in a future\n\t\t// version\n\t\t//\n\t\n\t\t/**\n\t\t * Version check function.\n\t\t *  @type function\n\t\t *  @depreciated Since 1.10\n\t\t */\n\t\tfnVersionCheck: DataTable.fnVersionCheck,\n\t\n\t\n\t\t/**\n\t\t * Index for what 'this' index API functions should use\n\t\t *  @type int\n\t\t *  @deprecated Since v1.10\n\t\t */\n\t\tiApiIndex: 0,\n\t\n\t\n\t\t/**\n\t\t * jQuery UI class container\n\t\t *  @type object\n\t\t *  @deprecated Since v1.10\n\t\t */\n\t\toJUIClasses: {},\n\t\n\t\n\t\t/**\n\t\t * Software version\n\t\t *  @type string\n\t\t *  @deprecated Since v1.10\n\t\t */\n\t\tsVersion: DataTable.version\n\t};\n\t\n\t\n\t//\n\t// Backwards compatibility. Alias to pre 1.10 Hungarian notation counter parts\n\t//\n\t$.extend( _ext, {\n\t\tafnFiltering: _ext.search,\n\t\taTypes:       _ext.type.detect,\n\t\tofnSearch:    _ext.type.search,\n\t\toSort:        _ext.type.order,\n\t\tafnSortData:  _ext.order,\n\t\taoFeatures:   _ext.feature,\n\t\toApi:         _ext.internal,\n\t\toStdClasses:  _ext.classes,\n\t\toPagination:  _ext.pager\n\t} );\n\t\n\t\n\t$.extend( DataTable.ext.classes, {\n\t\t\"sTable\": \"dataTable\",\n\t\t\"sNoFooter\": \"no-footer\",\n\t\n\t\t/* Paging buttons */\n\t\t\"sPageButton\": \"paginate_button\",\n\t\t\"sPageButtonActive\": \"current\",\n\t\t\"sPageButtonDisabled\": \"disabled\",\n\t\n\t\t/* Striping classes */\n\t\t\"sStripeOdd\": \"odd\",\n\t\t\"sStripeEven\": \"even\",\n\t\n\t\t/* Empty row */\n\t\t\"sRowEmpty\": \"dataTables_empty\",\n\t\n\t\t/* Features */\n\t\t\"sWrapper\": \"dataTables_wrapper\",\n\t\t\"sFilter\": \"dataTables_filter\",\n\t\t\"sInfo\": \"dataTables_info\",\n\t\t\"sPaging\": \"dataTables_paginate paging_\", /* Note that the type is postfixed */\n\t\t\"sLength\": \"dataTables_length\",\n\t\t\"sProcessing\": \"dataTables_processing\",\n\t\n\t\t/* Sorting */\n\t\t\"sSortAsc\": \"sorting_asc\",\n\t\t\"sSortDesc\": \"sorting_desc\",\n\t\t\"sSortable\": \"sorting\", /* Sortable in both directions */\n\t\t\"sSortableAsc\": \"sorting_asc_disabled\",\n\t\t\"sSortableDesc\": \"sorting_desc_disabled\",\n\t\t\"sSortableNone\": \"sorting_disabled\",\n\t\t\"sSortColumn\": \"sorting_\", /* Note that an int is postfixed for the sorting order */\n\t\n\t\t/* Filtering */\n\t\t\"sFilterInput\": \"\",\n\t\n\t\t/* Page length */\n\t\t\"sLengthSelect\": \"\",\n\t\n\t\t/* Scrolling */\n\t\t\"sScrollWrapper\": \"dataTables_scroll\",\n\t\t\"sScrollHead\": \"dataTables_scrollHead\",\n\t\t\"sScrollHeadInner\": \"dataTables_scrollHeadInner\",\n\t\t\"sScrollBody\": \"dataTables_scrollBody\",\n\t\t\"sScrollFoot\": \"dataTables_scrollFoot\",\n\t\t\"sScrollFootInner\": \"dataTables_scrollFootInner\",\n\t\n\t\t/* Misc */\n\t\t\"sHeaderTH\": \"\",\n\t\t\"sFooterTH\": \"\",\n\t\n\t\t// Deprecated\n\t\t\"sSortJUIAsc\": \"\",\n\t\t\"sSortJUIDesc\": \"\",\n\t\t\"sSortJUI\": \"\",\n\t\t\"sSortJUIAscAllowed\": \"\",\n\t\t\"sSortJUIDescAllowed\": \"\",\n\t\t\"sSortJUIWrapper\": \"\",\n\t\t\"sSortIcon\": \"\",\n\t\t\"sJUIHeader\": \"\",\n\t\t\"sJUIFooter\": \"\"\n\t} );\n\t\n\t\n\tvar extPagination = DataTable.ext.pager;\n\t\n\tfunction _numbers ( page, pages ) {\n\t\tvar\n\t\t\tnumbers = [],\n\t\t\tbuttons = extPagination.numbers_length,\n\t\t\thalf = Math.floor( buttons / 2 ),\n\t\t\ti = 1;\n\t\n\t\tif ( pages <= buttons ) {\n\t\t\tnumbers = _range( 0, pages );\n\t\t}\n\t\telse if ( page <= half ) {\n\t\t\tnumbers = _range( 0, buttons-2 );\n\t\t\tnumbers.push( 'ellipsis' );\n\t\t\tnumbers.push( pages-1 );\n\t\t}\n\t\telse if ( page >= pages - 1 - half ) {\n\t\t\tnumbers = _range( pages-(buttons-2), pages );\n\t\t\tnumbers.splice( 0, 0, 'ellipsis' ); // no unshift in ie6\n\t\t\tnumbers.splice( 0, 0, 0 );\n\t\t}\n\t\telse {\n\t\t\tnumbers = _range( page-half+2, page+half-1 );\n\t\t\tnumbers.push( 'ellipsis' );\n\t\t\tnumbers.push( pages-1 );\n\t\t\tnumbers.splice( 0, 0, 'ellipsis' );\n\t\t\tnumbers.splice( 0, 0, 0 );\n\t\t}\n\t\n\t\tnumbers.DT_el = 'span';\n\t\treturn numbers;\n\t}\n\t\n\t\n\t$.extend( extPagination, {\n\t\tsimple: function ( page, pages ) {\n\t\t\treturn [ 'previous', 'next' ];\n\t\t},\n\t\n\t\tfull: function ( page, pages ) {\n\t\t\treturn [  'first', 'previous', 'next', 'last' ];\n\t\t},\n\t\n\t\tnumbers: function ( page, pages ) {\n\t\t\treturn [ _numbers(page, pages) ];\n\t\t},\n\t\n\t\tsimple_numbers: function ( page, pages ) {\n\t\t\treturn [ 'previous', _numbers(page, pages), 'next' ];\n\t\t},\n\t\n\t\tfull_numbers: function ( page, pages ) {\n\t\t\treturn [ 'first', 'previous', _numbers(page, pages), 'next', 'last' ];\n\t\t},\n\t\t\n\t\tfirst_last_numbers: function (page, pages) {\n\t \t\treturn ['first', _numbers(page, pages), 'last'];\n\t \t},\n\t\n\t\t// For testing and plug-ins to use\n\t\t_numbers: _numbers,\n\t\n\t\t// Number of number buttons (including ellipsis) to show. _Must be odd!_\n\t\tnumbers_length: 7\n\t} );\n\t\n\t\n\t$.extend( true, DataTable.ext.renderer, {\n\t\tpageButton: {\n\t\t\t_: function ( settings, host, idx, buttons, page, pages ) {\n\t\t\t\tvar classes = settings.oClasses;\n\t\t\t\tvar lang = settings.oLanguage.oPaginate;\n\t\t\t\tvar aria = settings.oLanguage.oAria.paginate || {};\n\t\t\t\tvar btnDisplay, btnClass, counter=0;\n\t\n\t\t\t\tvar attach = function( container, buttons ) {\n\t\t\t\t\tvar i, ien, node, button, tabIndex;\n\t\t\t\t\tvar disabledClass = classes.sPageButtonDisabled;\n\t\t\t\t\tvar clickHandler = function ( e ) {\n\t\t\t\t\t\t_fnPageChange( settings, e.data.action, true );\n\t\t\t\t\t};\n\t\n\t\t\t\t\tfor ( i=0, ien=buttons.length ; i<ien ; i++ ) {\n\t\t\t\t\t\tbutton = buttons[i];\n\t\n\t\t\t\t\t\tif ( $.isArray( button ) ) {\n\t\t\t\t\t\t\tvar inner = $( '<'+(button.DT_el || 'div')+'/>' )\n\t\t\t\t\t\t\t\t.appendTo( container );\n\t\t\t\t\t\t\tattach( inner, button );\n\t\t\t\t\t\t}\n\t\t\t\t\t\telse {\n\t\t\t\t\t\t\tbtnDisplay = null;\n\t\t\t\t\t\t\tbtnClass = button;\n\t\t\t\t\t\t\ttabIndex = settings.iTabIndex;\n\t\n\t\t\t\t\t\t\tswitch ( button ) {\n\t\t\t\t\t\t\t\tcase 'ellipsis':\n\t\t\t\t\t\t\t\t\tcontainer.append('<span class=\"ellipsis\">&#x2026;</span>');\n\t\t\t\t\t\t\t\t\tbreak;\n\t\n\t\t\t\t\t\t\t\tcase 'first':\n\t\t\t\t\t\t\t\t\tbtnDisplay = lang.sFirst;\n\t\n\t\t\t\t\t\t\t\t\tif ( page === 0 ) {\n\t\t\t\t\t\t\t\t\t\ttabIndex = -1;\n\t\t\t\t\t\t\t\t\t\tbtnClass += ' ' + disabledClass;\n\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\tbreak;\n\t\n\t\t\t\t\t\t\t\tcase 'previous':\n\t\t\t\t\t\t\t\t\tbtnDisplay = lang.sPrevious;\n\t\n\t\t\t\t\t\t\t\t\tif ( page === 0 ) {\n\t\t\t\t\t\t\t\t\t\ttabIndex = -1;\n\t\t\t\t\t\t\t\t\t\tbtnClass += ' ' + disabledClass;\n\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\tbreak;\n\t\n\t\t\t\t\t\t\t\tcase 'next':\n\t\t\t\t\t\t\t\t\tbtnDisplay = lang.sNext;\n\t\n\t\t\t\t\t\t\t\t\tif ( pages === 0 || page === pages-1 ) {\n\t\t\t\t\t\t\t\t\t\ttabIndex = -1;\n\t\t\t\t\t\t\t\t\t\tbtnClass += ' ' + disabledClass;\n\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\tbreak;\n\t\n\t\t\t\t\t\t\t\tcase 'last':\n\t\t\t\t\t\t\t\t\tbtnDisplay = lang.sLast;\n\t\n\t\t\t\t\t\t\t\t\tif ( page === pages-1 ) {\n\t\t\t\t\t\t\t\t\t\ttabIndex = -1;\n\t\t\t\t\t\t\t\t\t\tbtnClass += ' ' + disabledClass;\n\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\tbreak;\n\t\n\t\t\t\t\t\t\t\tdefault:\n\t\t\t\t\t\t\t\t\tbtnDisplay = button + 1;\n\t\t\t\t\t\t\t\t\tbtnClass = page === button ?\n\t\t\t\t\t\t\t\t\t\tclasses.sPageButtonActive : '';\n\t\t\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\t\t}\n\t\n\t\t\t\t\t\t\tif ( btnDisplay !== null ) {\n\t\t\t\t\t\t\t\tnode = $('<a>', {\n\t\t\t\t\t\t\t\t\t\t'class': classes.sPageButton+' '+btnClass,\n\t\t\t\t\t\t\t\t\t\t'aria-controls': settings.sTableId,\n\t\t\t\t\t\t\t\t\t\t'aria-label': aria[ button ],\n\t\t\t\t\t\t\t\t\t\t'data-dt-idx': counter,\n\t\t\t\t\t\t\t\t\t\t'tabindex': tabIndex,\n\t\t\t\t\t\t\t\t\t\t'id': idx === 0 && typeof button === 'string' ?\n\t\t\t\t\t\t\t\t\t\t\tsettings.sTableId +'_'+ button :\n\t\t\t\t\t\t\t\t\t\t\tnull\n\t\t\t\t\t\t\t\t\t} )\n\t\t\t\t\t\t\t\t\t.html( btnDisplay )\n\t\t\t\t\t\t\t\t\t.appendTo( container );\n\t\n\t\t\t\t\t\t\t\t_fnBindAction(\n\t\t\t\t\t\t\t\t\tnode, {action: button}, clickHandler\n\t\t\t\t\t\t\t\t);\n\t\n\t\t\t\t\t\t\t\tcounter++;\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t};\n\t\n\t\t\t\t// IE9 throws an 'unknown error' if document.activeElement is used\n\t\t\t\t// inside an iframe or frame. Try / catch the error. Not good for\n\t\t\t\t// accessibility, but neither are frames.\n\t\t\t\tvar activeEl;\n\t\n\t\t\t\ttry {\n\t\t\t\t\t// Because this approach is destroying and recreating the paging\n\t\t\t\t\t// elements, focus is lost on the select button which is bad for\n\t\t\t\t\t// accessibility. So we want to restore focus once the draw has\n\t\t\t\t\t// completed\n\t\t\t\t\tactiveEl = $(host).find(document.activeElement).data('dt-idx');\n\t\t\t\t}\n\t\t\t\tcatch (e) {}\n\t\n\t\t\t\tattach( $(host).empty(), buttons );\n\t\n\t\t\t\tif ( activeEl !== undefined ) {\n\t\t\t\t\t$(host).find( '[data-dt-idx='+activeEl+']' ).trigger('focus');\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t} );\n\t\n\t\n\t\n\t// Built in type detection. See model.ext.aTypes for information about\n\t// what is required from this methods.\n\t$.extend( DataTable.ext.type.detect, [\n\t\t// Plain numbers - first since V8 detects some plain numbers as dates\n\t\t// e.g. Date.parse('55') (but not all, e.g. Date.parse('22')...).\n\t\tfunction ( d, settings )\n\t\t{\n\t\t\tvar decimal = settings.oLanguage.sDecimal;\n\t\t\treturn _isNumber( d, decimal ) ? 'num'+decimal : null;\n\t\t},\n\t\n\t\t// Dates (only those recognised by the browser's Date.parse)\n\t\tfunction ( d, settings )\n\t\t{\n\t\t\t// V8 tries _very_ hard to make a string passed into `Date.parse()`\n\t\t\t// valid, so we need to use a regex to restrict date formats. Use a\n\t\t\t// plug-in for anything other than ISO8601 style strings\n\t\t\tif ( d && !(d instanceof Date) && ! _re_date.test(d) ) {\n\t\t\t\treturn null;\n\t\t\t}\n\t\t\tvar parsed = Date.parse(d);\n\t\t\treturn (parsed !== null && !isNaN(parsed)) || _empty(d) ? 'date' : null;\n\t\t},\n\t\n\t\t// Formatted numbers\n\t\tfunction ( d, settings )\n\t\t{\n\t\t\tvar decimal = settings.oLanguage.sDecimal;\n\t\t\treturn _isNumber( d, decimal, true ) ? 'num-fmt'+decimal : null;\n\t\t},\n\t\n\t\t// HTML numeric\n\t\tfunction ( d, settings )\n\t\t{\n\t\t\tvar decimal = settings.oLanguage.sDecimal;\n\t\t\treturn _htmlNumeric( d, decimal ) ? 'html-num'+decimal : null;\n\t\t},\n\t\n\t\t// HTML numeric, formatted\n\t\tfunction ( d, settings )\n\t\t{\n\t\t\tvar decimal = settings.oLanguage.sDecimal;\n\t\t\treturn _htmlNumeric( d, decimal, true ) ? 'html-num-fmt'+decimal : null;\n\t\t},\n\t\n\t\t// HTML (this is strict checking - there must be html)\n\t\tfunction ( d, settings )\n\t\t{\n\t\t\treturn _empty( d ) || (typeof d === 'string' && d.indexOf('<') !== -1) ?\n\t\t\t\t'html' : null;\n\t\t}\n\t] );\n\t\n\t\n\t\n\t// Filter formatting functions. See model.ext.ofnSearch for information about\n\t// what is required from these methods.\n\t// \n\t// Note that additional search methods are added for the html numbers and\n\t// html formatted numbers by `_addNumericSort()` when we know what the decimal\n\t// place is\n\t\n\t\n\t$.extend( DataTable.ext.type.search, {\n\t\thtml: function ( data ) {\n\t\t\treturn _empty(data) ?\n\t\t\t\tdata :\n\t\t\t\ttypeof data === 'string' ?\n\t\t\t\t\tdata\n\t\t\t\t\t\t.replace( _re_new_lines, \" \" )\n\t\t\t\t\t\t.replace( _re_html, \"\" ) :\n\t\t\t\t\t'';\n\t\t},\n\t\n\t\tstring: function ( data ) {\n\t\t\treturn _empty(data) ?\n\t\t\t\tdata :\n\t\t\t\ttypeof data === 'string' ?\n\t\t\t\t\tdata.replace( _re_new_lines, \" \" ) :\n\t\t\t\t\tdata;\n\t\t}\n\t} );\n\t\n\t\n\t\n\tvar __numericReplace = function ( d, decimalPlace, re1, re2 ) {\n\t\tif ( d !== 0 && (!d || d === '-') ) {\n\t\t\treturn -Infinity;\n\t\t}\n\t\n\t\t// If a decimal place other than `.` is used, it needs to be given to the\n\t\t// function so we can detect it and replace with a `.` which is the only\n\t\t// decimal place Javascript recognises - it is not locale aware.\n\t\tif ( decimalPlace ) {\n\t\t\td = _numToDecimal( d, decimalPlace );\n\t\t}\n\t\n\t\tif ( d.replace ) {\n\t\t\tif ( re1 ) {\n\t\t\t\td = d.replace( re1, '' );\n\t\t\t}\n\t\n\t\t\tif ( re2 ) {\n\t\t\t\td = d.replace( re2, '' );\n\t\t\t}\n\t\t}\n\t\n\t\treturn d * 1;\n\t};\n\t\n\t\n\t// Add the numeric 'deformatting' functions for sorting and search. This is done\n\t// in a function to provide an easy ability for the language options to add\n\t// additional methods if a non-period decimal place is used.\n\tfunction _addNumericSort ( decimalPlace ) {\n\t\t$.each(\n\t\t\t{\n\t\t\t\t// Plain numbers\n\t\t\t\t\"num\": function ( d ) {\n\t\t\t\t\treturn __numericReplace( d, decimalPlace );\n\t\t\t\t},\n\t\n\t\t\t\t// Formatted numbers\n\t\t\t\t\"num-fmt\": function ( d ) {\n\t\t\t\t\treturn __numericReplace( d, decimalPlace, _re_formatted_numeric );\n\t\t\t\t},\n\t\n\t\t\t\t// HTML numeric\n\t\t\t\t\"html-num\": function ( d ) {\n\t\t\t\t\treturn __numericReplace( d, decimalPlace, _re_html );\n\t\t\t\t},\n\t\n\t\t\t\t// HTML numeric, formatted\n\t\t\t\t\"html-num-fmt\": function ( d ) {\n\t\t\t\t\treturn __numericReplace( d, decimalPlace, _re_html, _re_formatted_numeric );\n\t\t\t\t}\n\t\t\t},\n\t\t\tfunction ( key, fn ) {\n\t\t\t\t// Add the ordering method\n\t\t\t\t_ext.type.order[ key+decimalPlace+'-pre' ] = fn;\n\t\n\t\t\t\t// For HTML types add a search formatter that will strip the HTML\n\t\t\t\tif ( key.match(/^html\\-/) ) {\n\t\t\t\t\t_ext.type.search[ key+decimalPlace ] = _ext.type.search.html;\n\t\t\t\t}\n\t\t\t}\n\t\t);\n\t}\n\t\n\t\n\t// Default sort methods\n\t$.extend( _ext.type.order, {\n\t\t// Dates\n\t\t\"date-pre\": function ( d ) {\n\t\t\tvar ts = Date.parse( d );\n\t\t\treturn isNaN(ts) ? -Infinity : ts;\n\t\t},\n\t\n\t\t// html\n\t\t\"html-pre\": function ( a ) {\n\t\t\treturn _empty(a) ?\n\t\t\t\t'' :\n\t\t\t\ta.replace ?\n\t\t\t\t\ta.replace( /<.*?>/g, \"\" ).toLowerCase() :\n\t\t\t\t\ta+'';\n\t\t},\n\t\n\t\t// string\n\t\t\"string-pre\": function ( a ) {\n\t\t\t// This is a little complex, but faster than always calling toString,\n\t\t\t// http://jsperf.com/tostring-v-check\n\t\t\treturn _empty(a) ?\n\t\t\t\t'' :\n\t\t\t\ttypeof a === 'string' ?\n\t\t\t\t\ta.toLowerCase() :\n\t\t\t\t\t! a.toString ?\n\t\t\t\t\t\t'' :\n\t\t\t\t\t\ta.toString();\n\t\t},\n\t\n\t\t// string-asc and -desc are retained only for compatibility with the old\n\t\t// sort methods\n\t\t\"string-asc\": function ( x, y ) {\n\t\t\treturn ((x < y) ? -1 : ((x > y) ? 1 : 0));\n\t\t},\n\t\n\t\t\"string-desc\": function ( x, y ) {\n\t\t\treturn ((x < y) ? 1 : ((x > y) ? -1 : 0));\n\t\t}\n\t} );\n\t\n\t\n\t// Numeric sorting types - order doesn't matter here\n\t_addNumericSort( '' );\n\t\n\t\n\t$.extend( true, DataTable.ext.renderer, {\n\t\theader: {\n\t\t\t_: function ( settings, cell, column, classes ) {\n\t\t\t\t// No additional mark-up required\n\t\t\t\t// Attach a sort listener to update on sort - note that using the\n\t\t\t\t// `DT` namespace will allow the event to be removed automatically\n\t\t\t\t// on destroy, while the `dt` namespaced event is the one we are\n\t\t\t\t// listening for\n\t\t\t\t$(settings.nTable).on( 'order.dt.DT', function ( e, ctx, sorting, columns ) {\n\t\t\t\t\tif ( settings !== ctx ) { // need to check this this is the host\n\t\t\t\t\t\treturn;               // table, not a nested one\n\t\t\t\t\t}\n\t\n\t\t\t\t\tvar colIdx = column.idx;\n\t\n\t\t\t\t\tcell\n\t\t\t\t\t\t.removeClass(\n\t\t\t\t\t\t\tcolumn.sSortingClass +' '+\n\t\t\t\t\t\t\tclasses.sSortAsc +' '+\n\t\t\t\t\t\t\tclasses.sSortDesc\n\t\t\t\t\t\t)\n\t\t\t\t\t\t.addClass( columns[ colIdx ] == 'asc' ?\n\t\t\t\t\t\t\tclasses.sSortAsc : columns[ colIdx ] == 'desc' ?\n\t\t\t\t\t\t\t\tclasses.sSortDesc :\n\t\t\t\t\t\t\t\tcolumn.sSortingClass\n\t\t\t\t\t\t);\n\t\t\t\t} );\n\t\t\t},\n\t\n\t\t\tjqueryui: function ( settings, cell, column, classes ) {\n\t\t\t\t$('<div/>')\n\t\t\t\t\t.addClass( classes.sSortJUIWrapper )\n\t\t\t\t\t.append( cell.contents() )\n\t\t\t\t\t.append( $('<span/>')\n\t\t\t\t\t\t.addClass( classes.sSortIcon+' '+column.sSortingClassJUI )\n\t\t\t\t\t)\n\t\t\t\t\t.appendTo( cell );\n\t\n\t\t\t\t// Attach a sort listener to update on sort\n\t\t\t\t$(settings.nTable).on( 'order.dt.DT', function ( e, ctx, sorting, columns ) {\n\t\t\t\t\tif ( settings !== ctx ) {\n\t\t\t\t\t\treturn;\n\t\t\t\t\t}\n\t\n\t\t\t\t\tvar colIdx = column.idx;\n\t\n\t\t\t\t\tcell\n\t\t\t\t\t\t.removeClass( classes.sSortAsc +\" \"+classes.sSortDesc )\n\t\t\t\t\t\t.addClass( columns[ colIdx ] == 'asc' ?\n\t\t\t\t\t\t\tclasses.sSortAsc : columns[ colIdx ] == 'desc' ?\n\t\t\t\t\t\t\t\tclasses.sSortDesc :\n\t\t\t\t\t\t\t\tcolumn.sSortingClass\n\t\t\t\t\t\t);\n\t\n\t\t\t\t\tcell\n\t\t\t\t\t\t.find( 'span.'+classes.sSortIcon )\n\t\t\t\t\t\t.removeClass(\n\t\t\t\t\t\t\tclasses.sSortJUIAsc +\" \"+\n\t\t\t\t\t\t\tclasses.sSortJUIDesc +\" \"+\n\t\t\t\t\t\t\tclasses.sSortJUI +\" \"+\n\t\t\t\t\t\t\tclasses.sSortJUIAscAllowed +\" \"+\n\t\t\t\t\t\t\tclasses.sSortJUIDescAllowed\n\t\t\t\t\t\t)\n\t\t\t\t\t\t.addClass( columns[ colIdx ] == 'asc' ?\n\t\t\t\t\t\t\tclasses.sSortJUIAsc : columns[ colIdx ] == 'desc' ?\n\t\t\t\t\t\t\t\tclasses.sSortJUIDesc :\n\t\t\t\t\t\t\t\tcolumn.sSortingClassJUI\n\t\t\t\t\t\t);\n\t\t\t\t} );\n\t\t\t}\n\t\t}\n\t} );\n\t\n\t/*\n\t * Public helper functions. These aren't used internally by DataTables, or\n\t * called by any of the options passed into DataTables, but they can be used\n\t * externally by developers working with DataTables. They are helper functions\n\t * to make working with DataTables a little bit easier.\n\t */\n\t\n\tvar __htmlEscapeEntities = function ( d ) {\n\t\treturn typeof d === 'string' ?\n\t\t\td\n\t\t\t\t.replace(/&/g, '&amp;')\n\t\t\t\t.replace(/</g, '&lt;')\n\t\t\t\t.replace(/>/g, '&gt;')\n\t\t\t\t.replace(/\"/g, '&quot;') :\n\t\t\td;\n\t};\n\t\n\t/**\n\t * Helpers for `columns.render`.\n\t *\n\t * The options defined here can be used with the `columns.render` initialisation\n\t * option to provide a display renderer. The following functions are defined:\n\t *\n\t * * `number` - Will format numeric data (defined by `columns.data`) for\n\t *   display, retaining the original unformatted data for sorting and filtering.\n\t *   It takes 5 parameters:\n\t *   * `string` - Thousands grouping separator\n\t *   * `string` - Decimal point indicator\n\t *   * `integer` - Number of decimal points to show\n\t *   * `string` (optional) - Prefix.\n\t *   * `string` (optional) - Postfix (/suffix).\n\t * * `text` - Escape HTML to help prevent XSS attacks. It has no optional\n\t *   parameters.\n\t *\n\t * @example\n\t *   // Column definition using the number renderer\n\t *   {\n\t *     data: \"salary\",\n\t *     render: $.fn.dataTable.render.number( '\\'', '.', 0, '$' )\n\t *   }\n\t *\n\t * @namespace\n\t */\n\tDataTable.render = {\n\t\tnumber: function ( thousands, decimal, precision, prefix, postfix ) {\n\t\t\treturn {\n\t\t\t\tdisplay: function ( d ) {\n\t\t\t\t\tif ( typeof d !== 'number' && typeof d !== 'string' ) {\n\t\t\t\t\t\treturn d;\n\t\t\t\t\t}\n\t\n\t\t\t\t\tvar negative = d < 0 ? '-' : '';\n\t\t\t\t\tvar flo = parseFloat( d );\n\t\n\t\t\t\t\t// If NaN then there isn't much formatting that we can do - just\n\t\t\t\t\t// return immediately, escaping any HTML (this was supposed to\n\t\t\t\t\t// be a number after all)\n\t\t\t\t\tif ( isNaN( flo ) ) {\n\t\t\t\t\t\treturn __htmlEscapeEntities( d );\n\t\t\t\t\t}\n\t\n\t\t\t\t\tflo = flo.toFixed( precision );\n\t\t\t\t\td = Math.abs( flo );\n\t\n\t\t\t\t\tvar intPart = parseInt( d, 10 );\n\t\t\t\t\tvar floatPart = precision ?\n\t\t\t\t\t\tdecimal+(d - intPart).toFixed( precision ).substring( 2 ):\n\t\t\t\t\t\t'';\n\t\n\t\t\t\t\treturn negative + (prefix||'') +\n\t\t\t\t\t\tintPart.toString().replace(\n\t\t\t\t\t\t\t/\\B(?=(\\d{3})+(?!\\d))/g, thousands\n\t\t\t\t\t\t) +\n\t\t\t\t\t\tfloatPart +\n\t\t\t\t\t\t(postfix||'');\n\t\t\t\t}\n\t\t\t};\n\t\t},\n\t\n\t\ttext: function () {\n\t\t\treturn {\n\t\t\t\tdisplay: __htmlEscapeEntities,\n\t\t\t\tfilter: __htmlEscapeEntities\n\t\t\t};\n\t\t}\n\t};\n\t\n\t\n\t/*\n\t * This is really a good bit rubbish this method of exposing the internal methods\n\t * publicly... - To be fixed in 2.0 using methods on the prototype\n\t */\n\t\n\t\n\t/**\n\t * Create a wrapper function for exporting an internal functions to an external API.\n\t *  @param {string} fn API function name\n\t *  @returns {function} wrapped function\n\t *  @memberof DataTable#internal\n\t */\n\tfunction _fnExternApiFunc (fn)\n\t{\n\t\treturn function() {\n\t\t\tvar args = [_fnSettingsFromNode( this[DataTable.ext.iApiIndex] )].concat(\n\t\t\t\tArray.prototype.slice.call(arguments)\n\t\t\t);\n\t\t\treturn DataTable.ext.internal[fn].apply( this, args );\n\t\t};\n\t}\n\t\n\t\n\t/**\n\t * Reference to internal functions for use by plug-in developers. Note that\n\t * these methods are references to internal functions and are considered to be\n\t * private. If you use these methods, be aware that they are liable to change\n\t * between versions.\n\t *  @namespace\n\t */\n\t$.extend( DataTable.ext.internal, {\n\t\t_fnExternApiFunc: _fnExternApiFunc,\n\t\t_fnBuildAjax: _fnBuildAjax,\n\t\t_fnAjaxUpdate: _fnAjaxUpdate,\n\t\t_fnAjaxParameters: _fnAjaxParameters,\n\t\t_fnAjaxUpdateDraw: _fnAjaxUpdateDraw,\n\t\t_fnAjaxDataSrc: _fnAjaxDataSrc,\n\t\t_fnAddColumn: _fnAddColumn,\n\t\t_fnColumnOptions: _fnColumnOptions,\n\t\t_fnAdjustColumnSizing: _fnAdjustColumnSizing,\n\t\t_fnVisibleToColumnIndex: _fnVisibleToColumnIndex,\n\t\t_fnColumnIndexToVisible: _fnColumnIndexToVisible,\n\t\t_fnVisbleColumns: _fnVisbleColumns,\n\t\t_fnGetColumns: _fnGetColumns,\n\t\t_fnColumnTypes: _fnColumnTypes,\n\t\t_fnApplyColumnDefs: _fnApplyColumnDefs,\n\t\t_fnHungarianMap: _fnHungarianMap,\n\t\t_fnCamelToHungarian: _fnCamelToHungarian,\n\t\t_fnLanguageCompat: _fnLanguageCompat,\n\t\t_fnBrowserDetect: _fnBrowserDetect,\n\t\t_fnAddData: _fnAddData,\n\t\t_fnAddTr: _fnAddTr,\n\t\t_fnNodeToDataIndex: _fnNodeToDataIndex,\n\t\t_fnNodeToColumnIndex: _fnNodeToColumnIndex,\n\t\t_fnGetCellData: _fnGetCellData,\n\t\t_fnSetCellData: _fnSetCellData,\n\t\t_fnSplitObjNotation: _fnSplitObjNotation,\n\t\t_fnGetObjectDataFn: _fnGetObjectDataFn,\n\t\t_fnSetObjectDataFn: _fnSetObjectDataFn,\n\t\t_fnGetDataMaster: _fnGetDataMaster,\n\t\t_fnClearTable: _fnClearTable,\n\t\t_fnDeleteIndex: _fnDeleteIndex,\n\t\t_fnInvalidate: _fnInvalidate,\n\t\t_fnGetRowElements: _fnGetRowElements,\n\t\t_fnCreateTr: _fnCreateTr,\n\t\t_fnBuildHead: _fnBuildHead,\n\t\t_fnDrawHead: _fnDrawHead,\n\t\t_fnDraw: _fnDraw,\n\t\t_fnReDraw: _fnReDraw,\n\t\t_fnAddOptionsHtml: _fnAddOptionsHtml,\n\t\t_fnDetectHeader: _fnDetectHeader,\n\t\t_fnGetUniqueThs: _fnGetUniqueThs,\n\t\t_fnFeatureHtmlFilter: _fnFeatureHtmlFilter,\n\t\t_fnFilterComplete: _fnFilterComplete,\n\t\t_fnFilterCustom: _fnFilterCustom,\n\t\t_fnFilterColumn: _fnFilterColumn,\n\t\t_fnFilter: _fnFilter,\n\t\t_fnFilterCreateSearch: _fnFilterCreateSearch,\n\t\t_fnEscapeRegex: _fnEscapeRegex,\n\t\t_fnFilterData: _fnFilterData,\n\t\t_fnFeatureHtmlInfo: _fnFeatureHtmlInfo,\n\t\t_fnUpdateInfo: _fnUpdateInfo,\n\t\t_fnInfoMacros: _fnInfoMacros,\n\t\t_fnInitialise: _fnInitialise,\n\t\t_fnInitComplete: _fnInitComplete,\n\t\t_fnLengthChange: _fnLengthChange,\n\t\t_fnFeatureHtmlLength: _fnFeatureHtmlLength,\n\t\t_fnFeatureHtmlPaginate: _fnFeatureHtmlPaginate,\n\t\t_fnPageChange: _fnPageChange,\n\t\t_fnFeatureHtmlProcessing: _fnFeatureHtmlProcessing,\n\t\t_fnProcessingDisplay: _fnProcessingDisplay,\n\t\t_fnFeatureHtmlTable: _fnFeatureHtmlTable,\n\t\t_fnScrollDraw: _fnScrollDraw,\n\t\t_fnApplyToChildren: _fnApplyToChildren,\n\t\t_fnCalculateColumnWidths: _fnCalculateColumnWidths,\n\t\t_fnThrottle: _fnThrottle,\n\t\t_fnConvertToWidth: _fnConvertToWidth,\n\t\t_fnGetWidestNode: _fnGetWidestNode,\n\t\t_fnGetMaxLenString: _fnGetMaxLenString,\n\t\t_fnStringToCss: _fnStringToCss,\n\t\t_fnSortFlatten: _fnSortFlatten,\n\t\t_fnSort: _fnSort,\n\t\t_fnSortAria: _fnSortAria,\n\t\t_fnSortListener: _fnSortListener,\n\t\t_fnSortAttachListener: _fnSortAttachListener,\n\t\t_fnSortingClasses: _fnSortingClasses,\n\t\t_fnSortData: _fnSortData,\n\t\t_fnSaveState: _fnSaveState,\n\t\t_fnLoadState: _fnLoadState,\n\t\t_fnSettingsFromNode: _fnSettingsFromNode,\n\t\t_fnLog: _fnLog,\n\t\t_fnMap: _fnMap,\n\t\t_fnBindAction: _fnBindAction,\n\t\t_fnCallbackReg: _fnCallbackReg,\n\t\t_fnCallbackFire: _fnCallbackFire,\n\t\t_fnLengthOverflow: _fnLengthOverflow,\n\t\t_fnRenderer: _fnRenderer,\n\t\t_fnDataSource: _fnDataSource,\n\t\t_fnRowAttributes: _fnRowAttributes,\n\t\t_fnExtend: _fnExtend,\n\t\t_fnCalculateEnd: function () {} // Used by a lot of plug-ins, but redundant\n\t\t                                // in 1.10, so this dead-end function is\n\t\t                                // added to prevent errors\n\t} );\n\t\n\n\t// jQuery access\n\t$.fn.dataTable = DataTable;\n\n\t// Provide access to the host jQuery object (circular reference)\n\tDataTable.$ = $;\n\n\t// Legacy aliases\n\t$.fn.dataTableSettings = DataTable.settings;\n\t$.fn.dataTableExt = DataTable.ext;\n\n\t// With a capital `D` we return a DataTables API instance rather than a\n\t// jQuery object\n\t$.fn.DataTable = function ( opts ) {\n\t\treturn $(this).dataTable( opts ).api();\n\t};\n\n\t// All properties that are available to $.fn.dataTable should also be\n\t// available on $.fn.DataTable\n\t$.each( DataTable, function ( prop, val ) {\n\t\t$.fn.DataTable[ prop ] = val;\n\t} );\n\n\n\t// Information about events fired by DataTables - for documentation.\n\t/**\n\t * Draw event, fired whenever the table is redrawn on the page, at the same\n\t * point as fnDrawCallback. This may be useful for binding events or\n\t * performing calculations when the table is altered at all.\n\t *  @name DataTable#draw.dt\n\t *  @event\n\t *  @param {event} e jQuery event object\n\t *  @param {object} o DataTables settings object {@link DataTable.models.oSettings}\n\t */\n\n\t/**\n\t * Search event, fired when the searching applied to the table (using the\n\t * built-in global search, or column filters) is altered.\n\t *  @name DataTable#search.dt\n\t *  @event\n\t *  @param {event} e jQuery event object\n\t *  @param {object} o DataTables settings object {@link DataTable.models.oSettings}\n\t */\n\n\t/**\n\t * Page change event, fired when the paging of the table is altered.\n\t *  @name DataTable#page.dt\n\t *  @event\n\t *  @param {event} e jQuery event object\n\t *  @param {object} o DataTables settings object {@link DataTable.models.oSettings}\n\t */\n\n\t/**\n\t * Order event, fired when the ordering applied to the table is altered.\n\t *  @name DataTable#order.dt\n\t *  @event\n\t *  @param {event} e jQuery event object\n\t *  @param {object} o DataTables settings object {@link DataTable.models.oSettings}\n\t */\n\n\t/**\n\t * DataTables initialisation complete event, fired when the table is fully\n\t * drawn, including Ajax data loaded, if Ajax data is required.\n\t *  @name DataTable#init.dt\n\t *  @event\n\t *  @param {event} e jQuery event object\n\t *  @param {object} oSettings DataTables settings object\n\t *  @param {object} json The JSON object request from the server - only\n\t *    present if client-side Ajax sourced data is used</li></ol>\n\t */\n\n\t/**\n\t * State save event, fired when the table has changed state a new state save\n\t * is required. This event allows modification of the state saving object\n\t * prior to actually doing the save, including addition or other state\n\t * properties (for plug-ins) or modification of a DataTables core property.\n\t *  @name DataTable#stateSaveParams.dt\n\t *  @event\n\t *  @param {event} e jQuery event object\n\t *  @param {object} oSettings DataTables settings object\n\t *  @param {object} json The state information to be saved\n\t */\n\n\t/**\n\t * State load event, fired when the table is loading state from the stored\n\t * data, but prior to the settings object being modified by the saved state\n\t * - allowing modification of the saved state is required or loading of\n\t * state for a plug-in.\n\t *  @name DataTable#stateLoadParams.dt\n\t *  @event\n\t *  @param {event} e jQuery event object\n\t *  @param {object} oSettings DataTables settings object\n\t *  @param {object} json The saved state information\n\t */\n\n\t/**\n\t * State loaded event, fired when state has been loaded from stored data and\n\t * the settings object has been modified by the loaded data.\n\t *  @name DataTable#stateLoaded.dt\n\t *  @event\n\t *  @param {event} e jQuery event object\n\t *  @param {object} oSettings DataTables settings object\n\t *  @param {object} json The saved state information\n\t */\n\n\t/**\n\t * Processing event, fired when DataTables is doing some kind of processing\n\t * (be it, order, search or anything else). It can be used to indicate to\n\t * the end user that there is something happening, or that something has\n\t * finished.\n\t *  @name DataTable#processing.dt\n\t *  @event\n\t *  @param {event} e jQuery event object\n\t *  @param {object} oSettings DataTables settings object\n\t *  @param {boolean} bShow Flag for if DataTables is doing processing or not\n\t */\n\n\t/**\n\t * Ajax (XHR) event, fired whenever an Ajax request is completed from a\n\t * request to made to the server for new data. This event is called before\n\t * DataTables processed the returned data, so it can also be used to pre-\n\t * process the data returned from the server, if needed.\n\t *\n\t * Note that this trigger is called in `fnServerData`, if you override\n\t * `fnServerData` and which to use this event, you need to trigger it in you\n\t * success function.\n\t *  @name DataTable#xhr.dt\n\t *  @event\n\t *  @param {event} e jQuery event object\n\t *  @param {object} o DataTables settings object {@link DataTable.models.oSettings}\n\t *  @param {object} json JSON returned from the server\n\t *\n\t *  @example\n\t *     // Use a custom property returned from the server in another DOM element\n\t *     $('#table').dataTable().on('xhr.dt', function (e, settings, json) {\n\t *       $('#status').html( json.status );\n\t *     } );\n\t *\n\t *  @example\n\t *     // Pre-process the data returned from the server\n\t *     $('#table').dataTable().on('xhr.dt', function (e, settings, json) {\n\t *       for ( var i=0, ien=json.aaData.length ; i<ien ; i++ ) {\n\t *         json.aaData[i].sum = json.aaData[i].one + json.aaData[i].two;\n\t *       }\n\t *       // Note no return - manipulate the data directly in the JSON object.\n\t *     } );\n\t */\n\n\t/**\n\t * Destroy event, fired when the DataTable is destroyed by calling fnDestroy\n\t * or passing the bDestroy:true parameter in the initialisation object. This\n\t * can be used to remove bound events, added DOM nodes, etc.\n\t *  @name DataTable#destroy.dt\n\t *  @event\n\t *  @param {event} e jQuery event object\n\t *  @param {object} o DataTables settings object {@link DataTable.models.oSettings}\n\t */\n\n\t/**\n\t * Page length change event, fired when number of records to show on each\n\t * page (the length) is changed.\n\t *  @name DataTable#length.dt\n\t *  @event\n\t *  @param {event} e jQuery event object\n\t *  @param {object} o DataTables settings object {@link DataTable.models.oSettings}\n\t *  @param {integer} len New length\n\t */\n\n\t/**\n\t * Column sizing has changed.\n\t *  @name DataTable#column-sizing.dt\n\t *  @event\n\t *  @param {event} e jQuery event object\n\t *  @param {object} o DataTables settings object {@link DataTable.models.oSettings}\n\t */\n\n\t/**\n\t * Column visibility has changed.\n\t *  @name DataTable#column-visibility.dt\n\t *  @event\n\t *  @param {event} e jQuery event object\n\t *  @param {object} o DataTables settings object {@link DataTable.models.oSettings}\n\t *  @param {int} column Column index\n\t *  @param {bool} vis `false` if column now hidden, or `true` if visible\n\t */\n\n\treturn $.fn.dataTable;\n}));\n\n/*! Responsive 2.1.0\n * 2014-2016 SpryMedia Ltd - datatables.net/license\n */\n\n/**\n * @summary     Responsive\n * @description Responsive tables plug-in for DataTables\n * @version     2.1.0\n * @file        dataTables.responsive.js\n * @author      SpryMedia Ltd (www.sprymedia.co.uk)\n * @contact     www.sprymedia.co.uk/contact\n * @copyright   Copyright 2014-2016 SpryMedia Ltd.\n *\n * This source file is free software, available under the following license:\n *   MIT license - http://datatables.net/license/mit\n *\n * This source file is distributed in the hope that it will be useful, but\n * WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY\n * or FITNESS FOR A PARTICULAR PURPOSE. See the license files for details.\n *\n * For details please refer to: http://www.datatables.net\n */\n(function( factory ){\n\tif ( typeof define === 'function' && define.amd ) {\n\t\t// AMD\n\t\tdefine( ['jquery', 'datatables.net'], function ( $ ) {\n\t\t\treturn factory( $, window, document );\n\t\t} );\n\t}\n\telse if ( typeof exports === 'object' ) {\n\t\t// CommonJS\n\t\tmodule.exports = function (root, $) {\n\t\t\tif ( ! root ) {\n\t\t\t\troot = window;\n\t\t\t}\n\n\t\t\tif ( ! $ || ! $.fn.dataTable ) {\n\t\t\t\t$ = require('datatables.net')(root, $).$;\n\t\t\t}\n\n\t\t\treturn factory( $, root, root.document );\n\t\t};\n\t}\n\telse {\n\t\t// Browser\n\t\tfactory( jQuery, window, document );\n\t}\n}(function( $, window, document, undefined ) {\n'use strict';\nvar DataTable = $.fn.dataTable;\n\n\n/**\n * Responsive is a plug-in for the DataTables library that makes use of\n * DataTables' ability to change the visibility of columns, changing the\n * visibility of columns so the displayed columns fit into the table container.\n * The end result is that complex tables will be dynamically adjusted to fit\n * into the viewport, be it on a desktop, tablet or mobile browser.\n *\n * Responsive for DataTables has two modes of operation, which can used\n * individually or combined:\n *\n * * Class name based control - columns assigned class names that match the\n *   breakpoint logic can be shown / hidden as required for each breakpoint.\n * * Automatic control - columns are automatically hidden when there is no\n *   room left to display them. Columns removed from the right.\n *\n * In additional to column visibility control, Responsive also has built into\n * options to use DataTables' child row display to show / hide the information\n * from the table that has been hidden. There are also two modes of operation\n * for this child row display:\n *\n * * Inline - when the control element that the user can use to show / hide\n *   child rows is displayed inside the first column of the table.\n * * Column - where a whole column is dedicated to be the show / hide control.\n *\n * Initialisation of Responsive is performed by:\n *\n * * Adding the class `responsive` or `dt-responsive` to the table. In this case\n *   Responsive will automatically be initialised with the default configuration\n *   options when the DataTable is created.\n * * Using the `responsive` option in the DataTables configuration options. This\n *   can also be used to specify the configuration options, or simply set to\n *   `true` to use the defaults.\n *\n *  @class\n *  @param {object} settings DataTables settings object for the host table\n *  @param {object} [opts] Configuration options\n *  @requires jQuery 1.7+\n *  @requires DataTables 1.10.3+\n *\n *  @example\n *      $('#example').DataTable( {\n *        responsive: true\n *      } );\n *    } );\n */\nvar Responsive = function ( settings, opts ) {\n\t// Sanity check that we are using DataTables 1.10 or newer\n\tif ( ! DataTable.versionCheck || ! DataTable.versionCheck( '1.10.3' ) ) {\n\t\tthrow 'DataTables Responsive requires DataTables 1.10.3 or newer';\n\t}\n\n\tthis.s = {\n\t\tdt: new DataTable.Api( settings ),\n\t\tcolumns: [],\n\t\tcurrent: []\n\t};\n\n\t// Check if responsive has already been initialised on this table\n\tif ( this.s.dt.settings()[0].responsive ) {\n\t\treturn;\n\t}\n\n\t// details is an object, but for simplicity the user can give it as a string\n\t// or a boolean\n\tif ( opts && typeof opts.details === 'string' ) {\n\t\topts.details = { type: opts.details };\n\t}\n\telse if ( opts && opts.details === false ) {\n\t\topts.details = { type: false };\n\t}\n\telse if ( opts && opts.details === true ) {\n\t\topts.details = { type: 'inline' };\n\t}\n\n\tthis.c = $.extend( true, {}, Responsive.defaults, DataTable.defaults.responsive, opts );\n\tsettings.responsive = this;\n\tthis._constructor();\n};\n\n$.extend( Responsive.prototype, {\n\t/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *\n\t * Constructor\n\t */\n\n\t/**\n\t * Initialise the Responsive instance\n\t *\n\t * @private\n\t */\n\t_constructor: function ()\n\t{\n\t\tvar that = this;\n\t\tvar dt = this.s.dt;\n\t\tvar dtPrivateSettings = dt.settings()[0];\n\t\tvar oldWindowWidth = $(window).width();\n\n\t\tdt.settings()[0]._responsive = this;\n\n\t\t// Use DataTables' throttle function to avoid processor thrashing on\n\t\t// resize\n\t\t$(window).on( 'resize.dtr orientationchange.dtr', DataTable.util.throttle( function () {\n\t\t\t// iOS has a bug whereby resize can fire when only scrolling\n\t\t\t// See: http://stackoverflow.com/questions/8898412\n\t\t\tvar width = $(window).width();\n\n\t\t\tif ( width !== oldWindowWidth ) {\n\t\t\t\tthat._resize();\n\t\t\t\toldWindowWidth = width;\n\t\t\t}\n\t\t} ) );\n\n\t\t// DataTables doesn't currently trigger an event when a row is added, so\n\t\t// we need to hook into its private API to enforce the hidden rows when\n\t\t// new data is added\n\t\tdtPrivateSettings.oApi._fnCallbackReg( dtPrivateSettings, 'aoRowCreatedCallback', function (tr, data, idx) {\n\t\t\tif ( $.inArray( false, that.s.current ) !== -1 ) {\n\t\t\t\t$('td, th', tr).each( function ( i ) {\n\t\t\t\t\tvar idx = dt.column.index( 'toData', i );\n\n\t\t\t\t\tif ( that.s.current[idx] === false ) {\n\t\t\t\t\t\t$(this).css('display', 'none');\n\t\t\t\t\t}\n\t\t\t\t} );\n\t\t\t}\n\t\t} );\n\n\t\t// Destroy event handler\n\t\tdt.on( 'destroy.dtr', function () {\n\t\t\tdt.off( '.dtr' );\n\t\t\t$( dt.table().body() ).off( '.dtr' );\n\t\t\t$(window).off( 'resize.dtr orientationchange.dtr' );\n\n\t\t\t// Restore the columns that we've hidden\n\t\t\t$.each( that.s.current, function ( i, val ) {\n\t\t\t\tif ( val === false ) {\n\t\t\t\t\tthat._setColumnVis( i, true );\n\t\t\t\t}\n\t\t\t} );\n\t\t} );\n\n\t\t// Reorder the breakpoints array here in case they have been added out\n\t\t// of order\n\t\tthis.c.breakpoints.sort( function (a, b) {\n\t\t\treturn a.width < b.width ? 1 :\n\t\t\t\ta.width > b.width ? -1 : 0;\n\t\t} );\n\n\t\tthis._classLogic();\n\t\tthis._resizeAuto();\n\n\t\t// Details handler\n\t\tvar details = this.c.details;\n\n\t\tif ( details.type !== false ) {\n\t\t\tthat._detailsInit();\n\n\t\t\t// DataTables will trigger this event on every column it shows and\n\t\t\t// hides individually\n\t\t\tdt.on( 'column-visibility.dtr', function (e, ctx, col, vis) {\n\t\t\t\tthat._classLogic();\n\t\t\t\tthat._resizeAuto();\n\t\t\t\tthat._resize();\n\t\t\t} );\n\n\t\t\t// Redraw the details box on each draw which will happen if the data\n\t\t\t// has changed. This is used until DataTables implements a native\n\t\t\t// `updated` event for rows\n\t\t\tdt.on( 'draw.dtr', function () {\n\t\t\t\tthat._redrawChildren();\n\t\t\t} );\n\n\t\t\t$(dt.table().node()).addClass( 'dtr-'+details.type );\n\t\t}\n\n\t\tdt.on( 'column-reorder.dtr', function (e, settings, details) {\n\t\t\tthat._classLogic();\n\t\t\tthat._resizeAuto();\n\t\t\tthat._resize();\n\t\t} );\n\n\t\t// Change in column sizes means we need to calc\n\t\tdt.on( 'column-sizing.dtr', function () {\n\t\t\tthat._resizeAuto();\n\t\t\tthat._resize();\n\t\t});\n\n\t\tdt.on( 'init.dtr', function (e, settings, details) {\n\t\t\tthat._resizeAuto();\n\t\t\tthat._resize();\n\n\t\t\t// If columns were hidden, then DataTables needs to adjust the\n\t\t\t// column sizing\n\t\t\tif ( $.inArray( false, that.s.current ) ) {\n\t\t\t\tdt.columns.adjust();\n\t\t\t}\n\t\t} );\n\n\t\t// First pass - draw the table for the current viewport size\n\t\tthis._resize();\n\t},\n\n\n\t/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *\n\t * Private methods\n\t */\n\n\t/**\n\t * Calculate the visibility for the columns in a table for a given\n\t * breakpoint. The result is pre-determined based on the class logic if\n\t * class names are used to control all columns, but the width of the table\n\t * is also used if there are columns which are to be automatically shown\n\t * and hidden.\n\t *\n\t * @param  {string} breakpoint Breakpoint name to use for the calculation\n\t * @return {array} Array of boolean values initiating the visibility of each\n\t *   column.\n\t *  @private\n\t */\n\t_columnsVisiblity: function ( breakpoint )\n\t{\n\t\tvar dt = this.s.dt;\n\t\tvar columns = this.s.columns;\n\t\tvar i, ien;\n\n\t\t// Create an array that defines the column ordering based first on the\n\t\t// column's priority, and secondly the column index. This allows the\n\t\t// columns to be removed from the right if the priority matches\n\t\tvar order = columns\n\t\t\t.map( function ( col, idx ) {\n\t\t\t\treturn {\n\t\t\t\t\tcolumnIdx: idx,\n\t\t\t\t\tpriority: col.priority\n\t\t\t\t};\n\t\t\t} )\n\t\t\t.sort( function ( a, b ) {\n\t\t\t\tif ( a.priority !== b.priority ) {\n\t\t\t\t\treturn a.priority - b.priority;\n\t\t\t\t}\n\t\t\t\treturn a.columnIdx - b.columnIdx;\n\t\t\t} );\n\n\t\t// Class logic - determine which columns are in this breakpoint based\n\t\t// on the classes. If no class control (i.e. `auto`) then `-` is used\n\t\t// to indicate this to the rest of the function\n\t\tvar display = $.map( columns, function ( col ) {\n\t\t\treturn col.auto && col.minWidth === null ?\n\t\t\t\tfalse :\n\t\t\t\tcol.auto === true ?\n\t\t\t\t\t'-' :\n\t\t\t\t\t$.inArray( breakpoint, col.includeIn ) !== -1;\n\t\t} );\n\n\t\t// Auto column control - first pass: how much width is taken by the\n\t\t// ones that must be included from the non-auto columns\n\t\tvar requiredWidth = 0;\n\t\tfor ( i=0, ien=display.length ; i<ien ; i++ ) {\n\t\t\tif ( display[i] === true ) {\n\t\t\t\trequiredWidth += columns[i].minWidth;\n\t\t\t}\n\t\t}\n\n\t\t// Second pass, use up any remaining width for other columns. For\n\t\t// scrolling tables we need to subtract the width of the scrollbar. It\n\t\t// may not be requires which makes this sub-optimal, but it would\n\t\t// require another full redraw to make complete use of those extra few\n\t\t// pixels\n\t\tvar scrolling = dt.settings()[0].oScroll;\n\t\tvar bar = scrolling.sY || scrolling.sX ? scrolling.iBarWidth : 0;\n\t\tvar widthAvailable = dt.table().container().offsetWidth - bar;\n\t\tvar usedWidth = widthAvailable - requiredWidth;\n\n\t\t// Control column needs to always be included. This makes it sub-\n\t\t// optimal in terms of using the available with, but to stop layout\n\t\t// thrashing or overflow. Also we need to account for the control column\n\t\t// width first so we know how much width is available for the other\n\t\t// columns, since the control column might not be the first one shown\n\t\tfor ( i=0, ien=display.length ; i<ien ; i++ ) {\n\t\t\tif ( columns[i].control ) {\n\t\t\t\tusedWidth -= columns[i].minWidth;\n\t\t\t}\n\t\t}\n\n\t\t// Allow columns to be shown (counting by priority and then right to\n\t\t// left) until we run out of room\n\t\tvar empty = false;\n\t\tfor ( i=0, ien=order.length ; i<ien ; i++ ) {\n\t\t\tvar colIdx = order[i].columnIdx;\n\n\t\t\tif ( display[colIdx] === '-' && ! columns[colIdx].control && columns[colIdx].minWidth ) {\n\t\t\t\t// Once we've found a column that won't fit we don't let any\n\t\t\t\t// others display either, or columns might disappear in the\n\t\t\t\t// middle of the table\n\t\t\t\tif ( empty || usedWidth - columns[colIdx].minWidth < 0 ) {\n\t\t\t\t\tempty = true;\n\t\t\t\t\tdisplay[colIdx] = false;\n\t\t\t\t}\n\t\t\t\telse {\n\t\t\t\t\tdisplay[colIdx] = true;\n\t\t\t\t}\n\n\t\t\t\tusedWidth -= columns[colIdx].minWidth;\n\t\t\t}\n\t\t}\n\n\t\t// Determine if the 'control' column should be shown (if there is one).\n\t\t// This is the case when there is a hidden column (that is not the\n\t\t// control column). The two loops look inefficient here, but they are\n\t\t// trivial and will fly through. We need to know the outcome from the\n\t\t// first , before the action in the second can be taken\n\t\tvar showControl = false;\n\n\t\tfor ( i=0, ien=columns.length ; i<ien ; i++ ) {\n\t\t\tif ( ! columns[i].control && ! columns[i].never && ! display[i] ) {\n\t\t\t\tshowControl = true;\n\t\t\t\tbreak;\n\t\t\t}\n\t\t}\n\n\t\tfor ( i=0, ien=columns.length ; i<ien ; i++ ) {\n\t\t\tif ( columns[i].control ) {\n\t\t\t\tdisplay[i] = showControl;\n\t\t\t}\n\t\t}\n\n\t\t// Finally we need to make sure that there is at least one column that\n\t\t// is visible\n\t\tif ( $.inArray( true, display ) === -1 ) {\n\t\t\tdisplay[0] = true;\n\t\t}\n\n\t\treturn display;\n\t},\n\n\n\t/**\n\t * Create the internal `columns` array with information about the columns\n\t * for the table. This includes determining which breakpoints the column\n\t * will appear in, based upon class names in the column, which makes up the\n\t * vast majority of this method.\n\t *\n\t * @private\n\t */\n\t_classLogic: function ()\n\t{\n\t\tvar that = this;\n\t\tvar calc = {};\n\t\tvar breakpoints = this.c.breakpoints;\n\t\tvar dt = this.s.dt;\n\t\tvar columns = dt.columns().eq(0).map( function (i) {\n\t\t\tvar column = this.column(i);\n\t\t\tvar className = column.header().className;\n\t\t\tvar priority = dt.settings()[0].aoColumns[i].responsivePriority;\n\n\t\t\tif ( priority === undefined ) {\n\t\t\t\tvar dataPriority = $(column.header()).data('priority');\n\n\t\t\t\tpriority = dataPriority !== undefined ?\n\t\t\t\t\tdataPriority * 1 :\n\t\t\t\t\t10000;\n\t\t\t}\n\n\t\t\treturn {\n\t\t\t\tclassName: className,\n\t\t\t\tincludeIn: [],\n\t\t\t\tauto:      false,\n\t\t\t\tcontrol:   false,\n\t\t\t\tnever:     className.match(/\\bnever\\b/) ? true : false,\n\t\t\t\tpriority:  priority\n\t\t\t};\n\t\t} );\n\n\t\t// Simply add a breakpoint to `includeIn` array, ensuring that there are\n\t\t// no duplicates\n\t\tvar add = function ( colIdx, name ) {\n\t\t\tvar includeIn = columns[ colIdx ].includeIn;\n\n\t\t\tif ( $.inArray( name, includeIn ) === -1 ) {\n\t\t\t\tincludeIn.push( name );\n\t\t\t}\n\t\t};\n\n\t\tvar column = function ( colIdx, name, operator, matched ) {\n\t\t\tvar size, i, ien;\n\n\t\t\tif ( ! operator ) {\n\t\t\t\tcolumns[ colIdx ].includeIn.push( name );\n\t\t\t}\n\t\t\telse if ( operator === 'max-' ) {\n\t\t\t\t// Add this breakpoint and all smaller\n\t\t\t\tsize = that._find( name ).width;\n\n\t\t\t\tfor ( i=0, ien=breakpoints.length ; i<ien ; i++ ) {\n\t\t\t\t\tif ( breakpoints[i].width <= size ) {\n\t\t\t\t\t\tadd( colIdx, breakpoints[i].name );\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t\telse if ( operator === 'min-' ) {\n\t\t\t\t// Add this breakpoint and all larger\n\t\t\t\tsize = that._find( name ).width;\n\n\t\t\t\tfor ( i=0, ien=breakpoints.length ; i<ien ; i++ ) {\n\t\t\t\t\tif ( breakpoints[i].width >= size ) {\n\t\t\t\t\t\tadd( colIdx, breakpoints[i].name );\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t\telse if ( operator === 'not-' ) {\n\t\t\t\t// Add all but this breakpoint\n\t\t\t\tfor ( i=0, ien=breakpoints.length ; i<ien ; i++ ) {\n\t\t\t\t\tif ( breakpoints[i].name.indexOf( matched ) === -1 ) {\n\t\t\t\t\t\tadd( colIdx, breakpoints[i].name );\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t};\n\n\t\t// Loop over each column and determine if it has a responsive control\n\t\t// class\n\t\tcolumns.each( function ( col, i ) {\n\t\t\tvar classNames = col.className.split(' ');\n\t\t\tvar hasClass = false;\n\n\t\t\t// Split the class name up so multiple rules can be applied if needed\n\t\t\tfor ( var k=0, ken=classNames.length ; k<ken ; k++ ) {\n\t\t\t\tvar className = $.trim( classNames[k] );\n\n\t\t\t\tif ( className === 'all' ) {\n\t\t\t\t\t// Include in all\n\t\t\t\t\thasClass = true;\n\t\t\t\t\tcol.includeIn = $.map( breakpoints, function (a) {\n\t\t\t\t\t\treturn a.name;\n\t\t\t\t\t} );\n\t\t\t\t\treturn;\n\t\t\t\t}\n\t\t\t\telse if ( className === 'none' || col.never ) {\n\t\t\t\t\t// Include in none (default) and no auto\n\t\t\t\t\thasClass = true;\n\t\t\t\t\treturn;\n\t\t\t\t}\n\t\t\t\telse if ( className === 'control' ) {\n\t\t\t\t\t// Special column that is only visible, when one of the other\n\t\t\t\t\t// columns is hidden. This is used for the details control\n\t\t\t\t\thasClass = true;\n\t\t\t\t\tcol.control = true;\n\t\t\t\t\treturn;\n\t\t\t\t}\n\n\t\t\t\t$.each( breakpoints, function ( j, breakpoint ) {\n\t\t\t\t\t// Does this column have a class that matches this breakpoint?\n\t\t\t\t\tvar brokenPoint = breakpoint.name.split('-');\n\t\t\t\t\tvar re = new RegExp( '(min\\\\-|max\\\\-|not\\\\-)?('+brokenPoint[0]+')(\\\\-[_a-zA-Z0-9])?' );\n\t\t\t\t\tvar match = className.match( re );\n\n\t\t\t\t\tif ( match ) {\n\t\t\t\t\t\thasClass = true;\n\n\t\t\t\t\t\tif ( match[2] === brokenPoint[0] && match[3] === '-'+brokenPoint[1] ) {\n\t\t\t\t\t\t\t// Class name matches breakpoint name fully\n\t\t\t\t\t\t\tcolumn( i, breakpoint.name, match[1], match[2]+match[3] );\n\t\t\t\t\t\t}\n\t\t\t\t\t\telse if ( match[2] === brokenPoint[0] && ! match[3] ) {\n\t\t\t\t\t\t\t// Class name matched primary breakpoint name with no qualifier\n\t\t\t\t\t\t\tcolumn( i, breakpoint.name, match[1], match[2] );\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t} );\n\t\t\t}\n\n\t\t\t// If there was no control class, then automatic sizing is used\n\t\t\tif ( ! hasClass ) {\n\t\t\t\tcol.auto = true;\n\t\t\t}\n\t\t} );\n\n\t\tthis.s.columns = columns;\n\t},\n\n\n\t/**\n\t * Show the details for the child row\n\t *\n\t * @param  {DataTables.Api} row    API instance for the row\n\t * @param  {boolean}        update Update flag\n\t * @private\n\t */\n\t_detailsDisplay: function ( row, update )\n\t{\n\t\tvar that = this;\n\t\tvar dt = this.s.dt;\n\t\tvar details = this.c.details;\n\n\t\tif ( details && details.type !== false ) {\n\t\t\tvar res = details.display( row, update, function () {\n\t\t\t\treturn details.renderer(\n\t\t\t\t\tdt, row[0], that._detailsObj(row[0])\n\t\t\t\t);\n\t\t\t} );\n\n\t\t\tif ( res === true || res === false ) {\n\t\t\t\t$(dt.table().node()).triggerHandler( 'responsive-display.dt', [dt, row, res, update] );\n\t\t\t}\n\t\t}\n\t},\n\n\n\t/**\n\t * Initialisation for the details handler\n\t *\n\t * @private\n\t */\n\t_detailsInit: function ()\n\t{\n\t\tvar that    = this;\n\t\tvar dt      = this.s.dt;\n\t\tvar details = this.c.details;\n\n\t\t// The inline type always uses the first child as the target\n\t\tif ( details.type === 'inline' ) {\n\t\t\tdetails.target = 'td:first-child, th:first-child';\n\t\t}\n\n\t\t// Keyboard accessibility\n\t\tdt.on( 'draw.dtr', function () {\n\t\t\tthat._tabIndexes();\n\t\t} );\n\t\tthat._tabIndexes(); // Initial draw has already happened\n\n\t\t$( dt.table().body() ).on( 'keyup.dtr', 'td, th', function (e) {\n\t\t\tif ( e.keyCode === 13 && $(this).data('dtr-keyboard') ) {\n\t\t\t\t$(this).click();\n\t\t\t}\n\t\t} );\n\n\t\t// type.target can be a string jQuery selector or a column index\n\t\tvar target   = details.target;\n\t\tvar selector = typeof target === 'string' ? target : 'td, th';\n\n\t\t// Click handler to show / hide the details rows when they are available\n\t\t$( dt.table().body() )\n\t\t\t.on( 'click.dtr mousedown.dtr mouseup.dtr', selector, function (e) {\n\t\t\t\t// If the table is not collapsed (i.e. there is no hidden columns)\n\t\t\t\t// then take no action\n\t\t\t\tif ( ! $(dt.table().node()).hasClass('collapsed' ) ) {\n\t\t\t\t\treturn;\n\t\t\t\t}\n\n\t\t\t\t// Check that the row is actually a DataTable's controlled node\n\t\t\t\tif ( ! dt.row( $(this).closest('tr') ).length ) {\n\t\t\t\t\treturn;\n\t\t\t\t}\n\n\t\t\t\t// For column index, we determine if we should act or not in the\n\t\t\t\t// handler - otherwise it is already okay\n\t\t\t\tif ( typeof target === 'number' ) {\n\t\t\t\t\tvar targetIdx = target < 0 ?\n\t\t\t\t\t\tdt.columns().eq(0).length + target :\n\t\t\t\t\t\ttarget;\n\n\t\t\t\t\tif ( dt.cell( this ).index().column !== targetIdx ) {\n\t\t\t\t\t\treturn;\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\t// $().closest() includes itself in its check\n\t\t\t\tvar row = dt.row( $(this).closest('tr') );\n\n\t\t\t\t// Check event type to do an action\n\t\t\t\tif ( e.type === 'click' ) {\n\t\t\t\t\t// The renderer is given as a function so the caller can execute it\n\t\t\t\t\t// only when they need (i.e. if hiding there is no point is running\n\t\t\t\t\t// the renderer)\n\t\t\t\t\tthat._detailsDisplay( row, false );\n\t\t\t\t}\n\t\t\t\telse if ( e.type === 'mousedown' ) {\n\t\t\t\t\t// For mouse users, prevent the focus ring from showing\n\t\t\t\t\t$(this).css('outline', 'none');\n\t\t\t\t}\n\t\t\t\telse if ( e.type === 'mouseup' ) {\n\t\t\t\t\t// And then re-allow at the end of the click\n\t\t\t\t\t$(this).blur().css('outline', '');\n\t\t\t\t}\n\t\t\t} );\n\t},\n\n\n\t/**\n\t * Get the details to pass to a renderer for a row\n\t * @param  {int} rowIdx Row index\n\t * @private\n\t */\n\t_detailsObj: function ( rowIdx )\n\t{\n\t\tvar that = this;\n\t\tvar dt = this.s.dt;\n\n\t\treturn $.map( this.s.columns, function( col, i ) {\n\t\t\t// Never and control columns should not be passed to the renderer\n\t\t\tif ( col.never || col.control ) {\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\treturn {\n\t\t\t\ttitle:       dt.settings()[0].aoColumns[ i ].sTitle,\n\t\t\t\tdata:        dt.cell( rowIdx, i ).render( that.c.orthogonal ),\n\t\t\t\thidden:      dt.column( i ).visible() && !that.s.current[ i ],\n\t\t\t\tcolumnIndex: i,\n\t\t\t\trowIndex:    rowIdx\n\t\t\t};\n\t\t} );\n\t},\n\n\n\t/**\n\t * Find a breakpoint object from a name\n\t *\n\t * @param  {string} name Breakpoint name to find\n\t * @return {object}      Breakpoint description object\n\t * @private\n\t */\n\t_find: function ( name )\n\t{\n\t\tvar breakpoints = this.c.breakpoints;\n\n\t\tfor ( var i=0, ien=breakpoints.length ; i<ien ; i++ ) {\n\t\t\tif ( breakpoints[i].name === name ) {\n\t\t\t\treturn breakpoints[i];\n\t\t\t}\n\t\t}\n\t},\n\n\n\t/**\n\t * Re-create the contents of the child rows as the display has changed in\n\t * some way.\n\t *\n\t * @private\n\t */\n\t_redrawChildren: function ()\n\t{\n\t\tvar that = this;\n\t\tvar dt = this.s.dt;\n\n\t\tdt.rows( {page: 'current'} ).iterator( 'row', function ( settings, idx ) {\n\t\t\tvar row = dt.row( idx );\n\n\t\t\tthat._detailsDisplay( dt.row( idx ), true );\n\t\t} );\n\t},\n\n\n\t/**\n\t * Alter the table display for a resized viewport. This involves first\n\t * determining what breakpoint the window currently is in, getting the\n\t * column visibilities to apply and then setting them.\n\t *\n\t * @private\n\t */\n\t_resize: function ()\n\t{\n\t\tvar that = this;\n\t\tvar dt = this.s.dt;\n\t\tvar width = $(window).width();\n\t\tvar breakpoints = this.c.breakpoints;\n\t\tvar breakpoint = breakpoints[0].name;\n\t\tvar columns = this.s.columns;\n\t\tvar i, ien;\n\t\tvar oldVis = this.s.current.slice();\n\n\t\t// Determine what breakpoint we are currently at\n\t\tfor ( i=breakpoints.length-1 ; i>=0 ; i-- ) {\n\t\t\tif ( width <= breakpoints[i].width ) {\n\t\t\t\tbreakpoint = breakpoints[i].name;\n\t\t\t\tbreak;\n\t\t\t}\n\t\t}\n\t\t\n\t\t// Show the columns for that break point\n\t\tvar columnsVis = this._columnsVisiblity( breakpoint );\n\t\tthis.s.current = columnsVis;\n\n\t\t// Set the class before the column visibility is changed so event\n\t\t// listeners know what the state is. Need to determine if there are\n\t\t// any columns that are not visible but can be shown\n\t\tvar collapsedClass = false;\n\t\tfor ( i=0, ien=columns.length ; i<ien ; i++ ) {\n\t\t\tif ( columnsVis[i] === false && ! columns[i].never && ! columns[i].control ) {\n\t\t\t\tcollapsedClass = true;\n\t\t\t\tbreak;\n\t\t\t}\n\t\t}\n\n\t\t$( dt.table().node() ).toggleClass( 'collapsed', collapsedClass );\n\n\t\tvar changed = false;\n\n\t\tdt.columns().eq(0).each( function ( colIdx, i ) {\n\t\t\tif ( columnsVis[i] !== oldVis[i] ) {\n\t\t\t\tchanged = true;\n\t\t\t\tthat._setColumnVis( colIdx, columnsVis[i] );\n\t\t\t}\n\t\t} );\n\n\t\tif ( changed ) {\n\t\t\tthis._redrawChildren();\n\n\t\t\t// Inform listeners of the change\n\t\t\t$(dt.table().node()).trigger( 'responsive-resize.dt', [dt, this.s.current] );\n\t\t}\n\t},\n\n\n\t/**\n\t * Determine the width of each column in the table so the auto column hiding\n\t * has that information to work with. This method is never going to be 100%\n\t * perfect since column widths can change slightly per page, but without\n\t * seriously compromising performance this is quite effective.\n\t *\n\t * @private\n\t */\n\t_resizeAuto: function ()\n\t{\n\t\tvar dt = this.s.dt;\n\t\tvar columns = this.s.columns;\n\n\t\t// Are we allowed to do auto sizing?\n\t\tif ( ! this.c.auto ) {\n\t\t\treturn;\n\t\t}\n\n\t\t// Are there any columns that actually need auto-sizing, or do they all\n\t\t// have classes defined\n\t\tif ( $.inArray( true, $.map( columns, function (c) { return c.auto; } ) ) === -1 ) {\n\t\t\treturn;\n\t\t}\n\n\t\t// Clone the table with the current data in it\n\t\tvar tableWidth   = dt.table().node().offsetWidth;\n\t\tvar columnWidths = dt.columns;\n\t\tvar clonedTable  = dt.table().node().cloneNode( false );\n\t\tvar clonedHeader = $( dt.table().header().cloneNode( false ) ).appendTo( clonedTable );\n\t\tvar clonedBody   = $( dt.table().body() ).clone( false, false ).empty().appendTo( clonedTable ); // use jQuery because of IE8\n\n\t\t// Header\n\t\tvar headerCells = dt.columns()\n\t\t\t.header()\n\t\t\t.filter( function (idx) {\n\t\t\t\treturn dt.column(idx).visible();\n\t\t\t} )\n\t\t\t.to$()\n\t\t\t.clone( false )\n\t\t\t.css( 'display', 'table-cell' );\n\n\t\t// Body rows - we don't need to take account of DataTables' column\n\t\t// visibility since we implement our own here (hence the `display` set)\n\t\t$(clonedBody)\n\t\t\t.append( $(dt.rows( { page: 'current' } ).nodes()).clone( false ) )\n\t\t\t.find( 'th, td' ).css( 'display', '' );\n\n\t\t// Footer\n\t\tvar footer = dt.table().footer();\n\t\tif ( footer ) {\n\t\t\tvar clonedFooter = $( footer.cloneNode( false ) ).appendTo( clonedTable );\n\t\t\tvar footerCells = dt.columns()\n\t\t\t\t.footer()\n\t\t\t\t.filter( function (idx) {\n\t\t\t\t\treturn dt.column(idx).visible();\n\t\t\t\t} )\n\t\t\t\t.to$()\n\t\t\t\t.clone( false )\n\t\t\t\t.css( 'display', 'table-cell' );\n\n\t\t\t$('<tr/>')\n\t\t\t\t.append( footerCells )\n\t\t\t\t.appendTo( clonedFooter );\n\t\t}\n\n\t\t$('<tr/>')\n\t\t\t.append( headerCells )\n\t\t\t.appendTo( clonedHeader );\n\n\t\t// In the inline case extra padding is applied to the first column to\n\t\t// give space for the show / hide icon. We need to use this in the\n\t\t// calculation\n\t\tif ( this.c.details.type === 'inline' ) {\n\t\t\t$(clonedTable).addClass( 'dtr-inline collapsed' );\n\t\t}\n\t\t\n\t\t// It is unsafe to insert elements with the same name into the DOM\n\t\t// multiple times. For example, cloning and inserting a checked radio\n\t\t// clears the chcecked state of the original radio.\n\t\t$( clonedTable ).find( '[name]' ).removeAttr( 'name' );\n\t\t\n\t\tvar inserted = $('<div/>')\n\t\t\t.css( {\n\t\t\t\twidth: 1,\n\t\t\t\theight: 1,\n\t\t\t\toverflow: 'hidden'\n\t\t\t} )\n\t\t\t.append( clonedTable );\n\n\t\tinserted.insertBefore( dt.table().node() );\n\n\t\t// The cloned header now contains the smallest that each column can be\n\t\theaderCells.each( function (i) {\n\t\t\tvar idx = dt.column.index( 'fromVisible', i );\n\t\t\tcolumns[ idx ].minWidth =  this.offsetWidth || 0;\n\t\t} );\n\n\t\tinserted.remove();\n\t},\n\n\t/**\n\t * Set a column's visibility.\n\t *\n\t * We don't use DataTables' column visibility controls in order to ensure\n\t * that column visibility can Responsive can no-exist. Since only IE8+ is\n\t * supported (and all evergreen browsers of course) the control of the\n\t * display attribute works well.\n\t *\n\t * @param {integer} col      Column index\n\t * @param {boolean} showHide Show or hide (true or false)\n\t * @private\n\t */\n\t_setColumnVis: function ( col, showHide )\n\t{\n\t\tvar dt = this.s.dt;\n\t\tvar display = showHide ? '' : 'none'; // empty string will remove the attr\n\n\t\t$( dt.column( col ).header() ).css( 'display', display );\n\t\t$( dt.column( col ).footer() ).css( 'display', display );\n\t\tdt.column( col ).nodes().to$().css( 'display', display );\n\t},\n\n\n\t/**\n\t * Update the cell tab indexes for keyboard accessibility. This is called on\n\t * every table draw - that is potentially inefficient, but also the least\n\t * complex option given that column visibility can change on the fly. Its a\n\t * shame user-focus was removed from CSS 3 UI, as it would have solved this\n\t * issue with a single CSS statement.\n\t *\n\t * @private\n\t */\n\t_tabIndexes: function ()\n\t{\n\t\tvar dt = this.s.dt;\n\t\tvar cells = dt.cells( { page: 'current' } ).nodes().to$();\n\t\tvar ctx = dt.settings()[0];\n\t\tvar target = this.c.details.target;\n\n\t\tcells.filter( '[data-dtr-keyboard]' ).removeData( '[data-dtr-keyboard]' );\n\n\t\tvar selector = typeof target === 'number' ?\n\t\t\t':eq('+target+')' :\n\t\t\ttarget;\n\n\t\t$( selector, dt.rows( { page: 'current' } ).nodes() )\n\t\t\t.attr( 'tabIndex', ctx.iTabIndex )\n\t\t\t.data( 'dtr-keyboard', 1 );\n\t}\n} );\n\n\n/**\n * List of default breakpoints. Each item in the array is an object with two\n * properties:\n *\n * * `name` - the breakpoint name.\n * * `width` - the breakpoint width\n *\n * @name Responsive.breakpoints\n * @static\n */\nResponsive.breakpoints = [\n\t{ name: 'desktop',  width: Infinity },\n\t{ name: 'tablet-l', width: 1024 },\n\t{ name: 'tablet-p', width: 768 },\n\t{ name: 'mobile-l', width: 480 },\n\t{ name: 'mobile-p', width: 320 }\n];\n\n\n/**\n * Display methods - functions which define how the hidden data should be shown\n * in the table.\n *\n * @namespace\n * @name Responsive.defaults\n * @static\n */\nResponsive.display = {\n\tchildRow: function ( row, update, render ) {\n\t\tif ( update ) {\n\t\t\tif ( $(row.node()).hasClass('parent') ) {\n\t\t\t\trow.child( render(), 'child' ).show();\n\n\t\t\t\treturn true;\n\t\t\t}\n\t\t}\n\t\telse {\n\t\t\tif ( ! row.child.isShown()  ) {\n\t\t\t\trow.child( render(), 'child' ).show();\n\t\t\t\t$( row.node() ).addClass( 'parent' );\n\n\t\t\t\treturn true;\n\t\t\t}\n\t\t\telse {\n\t\t\t\trow.child( false );\n\t\t\t\t$( row.node() ).removeClass( 'parent' );\n\n\t\t\t\treturn false;\n\t\t\t}\n\t\t}\n\t},\n\n\tchildRowImmediate: function ( row, update, render ) {\n\t\tif ( (! update && row.child.isShown()) || ! row.responsive.hasHidden() ) {\n\t\t\t// User interaction and the row is show, or nothing to show\n\t\t\trow.child( false );\n\t\t\t$( row.node() ).removeClass( 'parent' );\n\n\t\t\treturn false;\n\t\t}\n\t\telse {\n\t\t\t// Display\n\t\t\trow.child( render(), 'child' ).show();\n\t\t\t$( row.node() ).addClass( 'parent' );\n\n\t\t\treturn true;\n\t\t}\n\t},\n\n\t// This is a wrapper so the modal options for Bootstrap and jQuery UI can\n\t// have options passed into them. This specific one doesn't need to be a\n\t// function but it is for consistency in the `modal` name\n\tmodal: function ( options ) {\n\t\treturn function ( row, update, render ) {\n\t\t\tif ( ! update ) {\n\t\t\t\t// Show a modal\n\t\t\t\tvar close = function () {\n\t\t\t\t\tmodal.remove(); // will tidy events for us\n\t\t\t\t\t$(document).off( 'keypress.dtr' );\n\t\t\t\t};\n\n\t\t\t\tvar modal = $('<div class=\"dtr-modal\"/>')\n\t\t\t\t\t.append( $('<div class=\"dtr-modal-display\"/>')\n\t\t\t\t\t\t.append( $('<div class=\"dtr-modal-content\"/>')\n\t\t\t\t\t\t\t.append( render() )\n\t\t\t\t\t\t)\n\t\t\t\t\t\t.append( $('<div class=\"dtr-modal-close\">&times;</div>' )\n\t\t\t\t\t\t\t.click( function () {\n\t\t\t\t\t\t\t\tclose();\n\t\t\t\t\t\t\t} )\n\t\t\t\t\t\t)\n\t\t\t\t\t)\n\t\t\t\t\t.append( $('<div class=\"dtr-modal-background\"/>')\n\t\t\t\t\t\t.click( function () {\n\t\t\t\t\t\t\tclose();\n\t\t\t\t\t\t} )\n\t\t\t\t\t)\n\t\t\t\t\t.appendTo( 'body' );\n\n\t\t\t\t$(document).on( 'keyup.dtr', function (e) {\n\t\t\t\t\tif ( e.keyCode === 27 ) {\n\t\t\t\t\t\te.stopPropagation();\n\n\t\t\t\t\t\tclose();\n\t\t\t\t\t}\n\t\t\t\t} );\n\t\t\t}\n\t\t\telse {\n\t\t\t\t$('div.dtr-modal-content')\n\t\t\t\t\t.empty()\n\t\t\t\t\t.append( render() );\n\t\t\t}\n\n\t\t\tif ( options && options.header ) {\n\t\t\t\t$('div.dtr-modal-content').prepend(\n\t\t\t\t\t'<h2>'+options.header( row )+'</h2>'\n\t\t\t\t);\n\t\t\t}\n\t\t};\n\t}\n};\n\n\n/**\n * Display methods - functions which define how the hidden data should be shown\n * in the table.\n *\n * @namespace\n * @name Responsive.defaults\n * @static\n */\nResponsive.renderer = {\n\tlistHidden: function () {\n\t\treturn function ( api, rowIdx, columns ) {\n\t\t\tvar data = $.map( columns, function ( col ) {\n\t\t\t\treturn col.hidden ?\n\t\t\t\t\t'<li data-dtr-index=\"'+col.columnIndex+'\" data-dt-row=\"'+col.rowIndex+'\" data-dt-column=\"'+col.columnIndex+'\">'+\n\t\t\t\t\t\t'<span class=\"dtr-title\">'+\n\t\t\t\t\t\t\tcol.title+\n\t\t\t\t\t\t'</span> '+\n\t\t\t\t\t\t'<span class=\"dtr-data\">'+\n\t\t\t\t\t\t\tcol.data+\n\t\t\t\t\t\t'</span>'+\n\t\t\t\t\t'</li>' :\n\t\t\t\t\t'';\n\t\t\t} ).join('');\n\n\t\t\treturn data ?\n\t\t\t\t$('<ul data-dtr-index=\"'+rowIdx+'\"/>').append( data ) :\n\t\t\t\tfalse;\n\t\t}\n\t},\n\n\ttableAll: function ( options ) {\n\t\toptions = $.extend( {\n\t\t\ttableClass: ''\n\t\t}, options );\n\n\t\treturn function ( api, rowIdx, columns ) {\n\t\t\tvar data = $.map( columns, function ( col ) {\n\t\t\t\treturn '<tr data-dt-row=\"'+col.rowIndex+'\" data-dt-column=\"'+col.columnIndex+'\">'+\n\t\t\t\t\t\t'<td>'+col.title+':'+'</td> '+\n\t\t\t\t\t\t'<td>'+col.data+'</td>'+\n\t\t\t\t\t'</tr>';\n\t\t\t} ).join('');\n\n\t\t\treturn $('<table class=\"'+options.tableClass+'\" width=\"100%\"/>').append( data );\n\t\t}\n\t}\n};\n\n/**\n * Responsive default settings for initialisation\n *\n * @namespace\n * @name Responsive.defaults\n * @static\n */\nResponsive.defaults = {\n\t/**\n\t * List of breakpoints for the instance. Note that this means that each\n\t * instance can have its own breakpoints. Additionally, the breakpoints\n\t * cannot be changed once an instance has been creased.\n\t *\n\t * @type {Array}\n\t * @default Takes the value of `Responsive.breakpoints`\n\t */\n\tbreakpoints: Responsive.breakpoints,\n\n\t/**\n\t * Enable / disable auto hiding calculations. It can help to increase\n\t * performance slightly if you disable this option, but all columns would\n\t * need to have breakpoint classes assigned to them\n\t *\n\t * @type {Boolean}\n\t * @default  `true`\n\t */\n\tauto: true,\n\n\t/**\n\t * Details control. If given as a string value, the `type` property of the\n\t * default object is set to that value, and the defaults used for the rest\n\t * of the object - this is for ease of implementation.\n\t *\n\t * The object consists of the following properties:\n\t *\n\t * * `display` - A function that is used to show and hide the hidden details\n\t * * `renderer` - function that is called for display of the child row data.\n\t *   The default function will show the data from the hidden columns\n\t * * `target` - Used as the selector for what objects to attach the child\n\t *   open / close to\n\t * * `type` - `false` to disable the details display, `inline` or `column`\n\t *   for the two control types\n\t *\n\t * @type {Object|string}\n\t */\n\tdetails: {\n\t\tdisplay: Responsive.display.childRow,\n\n\t\trenderer: Responsive.renderer.listHidden(),\n\n\t\ttarget: 0,\n\n\t\ttype: 'inline'\n\t},\n\n\t/**\n\t * Orthogonal data request option. This is used to define the data type\n\t * requested when Responsive gets the data to show in the child row.\n\t *\n\t * @type {String}\n\t */\n\torthogonal: 'display'\n};\n\n\n/*\n * API\n */\nvar Api = $.fn.dataTable.Api;\n\n// Doesn't do anything - work around for a bug in DT... Not documented\nApi.register( 'responsive()', function () {\n\treturn this;\n} );\n\nApi.register( 'responsive.index()', function ( li ) {\n\tli = $(li);\n\n\treturn {\n\t\tcolumn: li.data('dtr-index'),\n\t\trow:    li.parent().data('dtr-index')\n\t};\n} );\n\nApi.register( 'responsive.rebuild()', function () {\n\treturn this.iterator( 'table', function ( ctx ) {\n\t\tif ( ctx._responsive ) {\n\t\t\tctx._responsive._classLogic();\n\t\t}\n\t} );\n} );\n\nApi.register( 'responsive.recalc()', function () {\n\treturn this.iterator( 'table', function ( ctx ) {\n\t\tif ( ctx._responsive ) {\n\t\t\tctx._responsive._resizeAuto();\n\t\t\tctx._responsive._resize();\n\t\t}\n\t} );\n} );\n\nApi.register( 'responsive.hasHidden()', function () {\n\tvar ctx = this.context[0];\n\n\treturn ctx._responsive ?\n\t\t$.inArray( false, ctx._responsive.s.current ) !== -1 :\n\t\tfalse;\n} );\n\n\n/**\n * Version information\n *\n * @name Responsive.version\n * @static\n */\nResponsive.version = '2.1.0';\n\n\n$.fn.dataTable.Responsive = Responsive;\n$.fn.DataTable.Responsive = Responsive;\n\n// Attach a listener to the document which listens for DataTables initialisation\n// events so we can automatically initialise\n$(document).on( 'preInit.dt.dtr', function (e, settings, json) {\n\tif ( e.namespace !== 'dt' ) {\n\t\treturn;\n\t}\n\n\tif ( $(settings.nTable).hasClass( 'responsive' ) ||\n\t\t $(settings.nTable).hasClass( 'dt-responsive' ) ||\n\t\t settings.oInit.responsive ||\n\t\t DataTable.defaults.responsive\n\t) {\n\t\tvar init = settings.oInit.responsive;\n\n\t\tif ( init !== false ) {\n\t\t\tnew Responsive( settings, $.isPlainObject( init ) ? init : {}  );\n\t\t}\n\t}\n} );\n\n\nreturn Responsive;\n}));\n\n/**\n * Rangy, a cross-browser JavaScript range and selection library\n * https://github.com/timdown/rangy\n *\n * Copyright 2024, Tim Down\n * Licensed under the MIT license.\n * Version: 1.3.2\n * Build date: 2 November 2024\n */\n\n(function(factory, root) {\n    if (typeof define == \"function\" && define.amd) {\n        // AMD. Register as an anonymous module.\n        define(factory);\n    } else if (typeof module != \"undefined\" && typeof exports == \"object\") {\n        // Node/CommonJS style\n        module.exports = factory();\n    } else {\n        // No AMD or CommonJS support so we place Rangy in (probably) the global variable\n        root.rangy = factory();\n    }\n})(function() {\n\n    var OBJECT = \"object\", FUNCTION = \"function\", UNDEFINED = \"undefined\";\n\n    // Minimal set of properties required for DOM Level 2 Range compliance. Comparison constants such as START_TO_START\n    // are omitted because ranges in KHTML do not have them but otherwise work perfectly well. See issue 113.\n    var domRangeProperties = [\"startContainer\", \"startOffset\", \"endContainer\", \"endOffset\", \"collapsed\",\n        \"commonAncestorContainer\"];\n\n    // Minimal set of methods required for DOM Level 2 Range compliance\n    var domRangeMethods = [\"setStart\", \"setStartBefore\", \"setStartAfter\", \"setEnd\", \"setEndBefore\",\n        \"setEndAfter\", \"collapse\", \"selectNode\", \"selectNodeContents\", \"compareBoundaryPoints\", \"deleteContents\",\n        \"extractContents\", \"cloneContents\", \"insertNode\", \"surroundContents\", \"cloneRange\", \"toString\", \"detach\"];\n\n    var textRangeProperties = [\"boundingHeight\", \"boundingLeft\", \"boundingTop\", \"boundingWidth\", \"htmlText\", \"text\"];\n\n    // Subset of TextRange's full set of methods that we're interested in\n    var textRangeMethods = [\"collapse\", \"compareEndPoints\", \"duplicate\", \"moveToElementText\", \"parentElement\", \"select\",\n        \"setEndPoint\", \"getBoundingClientRect\"];\n\n    /*----------------------------------------------------------------------------------------------------------------*/\n\n    // Trio of functions taken from Peter Michaux's article:\n    // http://peter.michaux.ca/articles/feature-detection-state-of-the-art-browser-scripting\n    function isHostMethod(o, p) {\n        var t = typeof o[p];\n        return t == FUNCTION || (!!(t == OBJECT && o[p])) || t == \"unknown\";\n    }\n\n    function isHostObject(o, p) {\n        return !!(typeof o[p] == OBJECT && o[p]);\n    }\n\n    function isHostProperty(o, p) {\n        return typeof o[p] != UNDEFINED;\n    }\n\n    // Creates a convenience function to save verbose repeated calls to tests functions\n    function createMultiplePropertyTest(testFunc) {\n        return function(o, props) {\n            var i = props.length;\n            while (i--) {\n                if (!testFunc(o, props[i])) {\n                    return false;\n                }\n            }\n            return true;\n        };\n    }\n\n    // Next trio of functions are a convenience to save verbose repeated calls to previous two functions\n    var areHostMethods = createMultiplePropertyTest(isHostMethod);\n    var areHostObjects = createMultiplePropertyTest(isHostObject);\n    var areHostProperties = createMultiplePropertyTest(isHostProperty);\n\n    function isTextRange(range) {\n        return range && areHostMethods(range, textRangeMethods) && areHostProperties(range, textRangeProperties);\n    }\n\n    function getBody(doc) {\n        return isHostObject(doc, \"body\") ? doc.body : doc.getElementsByTagName(\"body\")[0];\n    }\n\n    var forEach = [].forEach ?\n        function(arr, func) {\n            arr.forEach(func);\n        } :\n        function(arr, func) {\n            for (var i = 0, len = arr.length; i < len; ++i) {\n                func(arr[i], i);\n            }\n        };\n\n    var modules = {};\n\n    var isBrowser = (typeof window != UNDEFINED && typeof document != UNDEFINED);\n\n    var util = {\n        isHostMethod: isHostMethod,\n        isHostObject: isHostObject,\n        isHostProperty: isHostProperty,\n        areHostMethods: areHostMethods,\n        areHostObjects: areHostObjects,\n        areHostProperties: areHostProperties,\n        isTextRange: isTextRange,\n        getBody: getBody,\n        forEach: forEach\n    };\n\n    var api = {\n        version: \"1.3.2\",\n        initialized: false,\n        isBrowser: isBrowser,\n        supported: true,\n        util: util,\n        features: {},\n        modules: modules,\n        config: {\n            alertOnFail: false,\n            alertOnWarn: false,\n            preferTextRange: false,\n            autoInitialize: (typeof rangyAutoInitialize == UNDEFINED) ? true : rangyAutoInitialize\n        }\n    };\n\n    function consoleLog(msg) {\n        if (typeof console != UNDEFINED && isHostMethod(console, \"log\")) {\n            console.log(msg);\n        }\n    }\n\n    function alertOrLog(msg, shouldAlert) {\n        if (isBrowser && shouldAlert) {\n            alert(msg);\n        } else  {\n            consoleLog(msg);\n        }\n    }\n\n    function fail(reason) {\n        api.initialized = true;\n        api.supported = false;\n        alertOrLog(\"Rangy is not supported in this environment. Reason: \" + reason, api.config.alertOnFail);\n    }\n\n    api.fail = fail;\n\n    function warn(msg) {\n        alertOrLog(\"Rangy warning: \" + msg, api.config.alertOnWarn);\n    }\n\n    api.warn = warn;\n\n    // Add utility extend() method\n    var extend;\n    if ({}.hasOwnProperty) {\n        util.extend = extend = function(obj, props, deep) {\n            var o, p;\n            for (var i in props) {\n                if (i === \"__proto__\" || i === \"constructor\" || i === \"prototype\") {\n                    continue;\n                }\n                if (props.hasOwnProperty(i)) {\n                    o = obj[i];\n                    p = props[i];\n                    if (deep && o !== null && typeof o == \"object\" && p !== null && typeof p == \"object\") {\n                        extend(o, p, true);\n                    }\n                    obj[i] = p;\n                }\n            }\n            // Special case for toString, which does not show up in for...in loops in IE <= 8\n            if (props.hasOwnProperty(\"toString\")) {\n                obj.toString = props.toString;\n            }\n            return obj;\n        };\n\n        util.createOptions = function(optionsParam, defaults) {\n            var options = {};\n            extend(options, defaults);\n            if (optionsParam) {\n                extend(options, optionsParam);\n            }\n            return options;\n        };\n    } else {\n        fail(\"hasOwnProperty not supported\");\n    }\n\n    // Test whether we're in a browser and bail out if not\n    if (!isBrowser) {\n        fail(\"Rangy can only run in a browser\");\n    }\n\n    // Test whether Array.prototype.slice can be relied on for NodeLists and use an alternative toArray() if not\n    (function() {\n        var toArray;\n\n        if (isBrowser) {\n            var el = document.createElement(\"div\");\n            el.appendChild(document.createElement(\"span\"));\n            var slice = [].slice;\n            try {\n                if (slice.call(el.childNodes, 0)[0].nodeType == 1) {\n                    toArray = function(arrayLike) {\n                        return slice.call(arrayLike, 0);\n                    };\n                }\n            } catch (e) {}\n        }\n\n        if (!toArray) {\n            toArray = function(arrayLike) {\n                var arr = [];\n                for (var i = 0, len = arrayLike.length; i < len; ++i) {\n                    arr[i] = arrayLike[i];\n                }\n                return arr;\n            };\n        }\n\n        util.toArray = toArray;\n    })();\n\n    // Very simple event handler wrapper function that doesn't attempt to solve issues such as \"this\" handling or\n    // normalization of event properties because we don't need this.\n    var addListener;\n    if (isBrowser) {\n        if (isHostMethod(document, \"addEventListener\")) {\n            addListener = function(obj, eventType, listener) {\n                obj.addEventListener(eventType, listener, false);\n            };\n        } else if (isHostMethod(document, \"attachEvent\")) {\n            addListener = function(obj, eventType, listener) {\n                obj.attachEvent(\"on\" + eventType, listener);\n            };\n        } else {\n            fail(\"Document does not have required addEventListener or attachEvent method\");\n        }\n\n        util.addListener = addListener;\n    }\n\n    var initListeners = [];\n\n    function getErrorDesc(ex) {\n        return ex.message || ex.description || String(ex);\n    }\n\n    // Initialization\n    function init() {\n        if (!isBrowser || api.initialized) {\n            return;\n        }\n        var testRange;\n        var implementsDomRange = false, implementsTextRange = false;\n\n        // First, perform basic feature tests\n\n        if (isHostMethod(document, \"createRange\")) {\n            testRange = document.createRange();\n            if (areHostMethods(testRange, domRangeMethods) && areHostProperties(testRange, domRangeProperties)) {\n                implementsDomRange = true;\n            }\n        }\n\n        var body = getBody(document);\n        if (!body || body.nodeName.toLowerCase() != \"body\") {\n            fail(\"No body element found\");\n            return;\n        }\n\n        if (body && isHostMethod(body, \"createTextRange\")) {\n            testRange = body.createTextRange();\n            if (isTextRange(testRange)) {\n                implementsTextRange = true;\n            }\n        }\n\n        if (!implementsDomRange && !implementsTextRange) {\n            fail(\"Neither Range nor TextRange are available\");\n            return;\n        }\n\n        api.initialized = true;\n        api.features = {\n            implementsDomRange: implementsDomRange,\n            implementsTextRange: implementsTextRange\n        };\n\n        // Initialize modules\n        var module, errorMessage;\n        for (var moduleName in modules) {\n            if ( (module = modules[moduleName]) instanceof Module ) {\n                module.init(module, api);\n            }\n        }\n\n        // Call init listeners\n        for (var i = 0, len = initListeners.length; i < len; ++i) {\n            try {\n                initListeners[i](api);\n            } catch (ex) {\n                errorMessage = \"Rangy init listener threw an exception. Continuing. Detail: \" + getErrorDesc(ex);\n                consoleLog(errorMessage);\n            }\n        }\n    }\n\n    function deprecationNotice(deprecated, replacement, module) {\n        if (module) {\n            deprecated += \" in module \" + module.name;\n        }\n        api.warn(\"DEPRECATED: \" + deprecated + \" is deprecated. Please use \" +\n        replacement + \" instead.\");\n    }\n\n    function createAliasForDeprecatedMethod(owner, deprecated, replacement, module) {\n        owner[deprecated] = function() {\n            deprecationNotice(deprecated, replacement, module);\n            return owner[replacement].apply(owner, util.toArray(arguments));\n        };\n    }\n\n    util.deprecationNotice = deprecationNotice;\n    util.createAliasForDeprecatedMethod = createAliasForDeprecatedMethod;\n\n    // Allow external scripts to initialize this library in case it's loaded after the document has loaded\n    api.init = init;\n\n    // Execute listener immediately if already initialized\n    api.addInitListener = function(listener) {\n        if (api.initialized) {\n            listener(api);\n        } else {\n            initListeners.push(listener);\n        }\n    };\n\n    var shimListeners = [];\n\n    api.addShimListener = function(listener) {\n        shimListeners.push(listener);\n    };\n\n    function shim(win) {\n        win = win || window;\n        init();\n\n        // Notify listeners\n        for (var i = 0, len = shimListeners.length; i < len; ++i) {\n            shimListeners[i](win);\n        }\n    }\n\n    if (isBrowser) {\n        api.shim = api.createMissingNativeApi = shim;\n        createAliasForDeprecatedMethod(api, \"createMissingNativeApi\", \"shim\");\n    }\n\n    function Module(name, dependencies, initializer) {\n        this.name = name;\n        this.dependencies = dependencies;\n        this.initialized = false;\n        this.supported = false;\n        this.initializer = initializer;\n    }\n\n    Module.prototype = {\n        init: function() {\n            var requiredModuleNames = this.dependencies || [];\n            for (var i = 0, len = requiredModuleNames.length, requiredModule, moduleName; i < len; ++i) {\n                moduleName = requiredModuleNames[i];\n\n                requiredModule = modules[moduleName];\n                if (!requiredModule || !(requiredModule instanceof Module)) {\n                    throw new Error(\"required module '\" + moduleName + \"' not found\");\n                }\n\n                requiredModule.init();\n\n                if (!requiredModule.supported) {\n                    throw new Error(\"required module '\" + moduleName + \"' not supported\");\n                }\n            }\n\n            // Now run initializer\n            this.initializer(this);\n        },\n\n        fail: function(reason) {\n            this.initialized = true;\n            this.supported = false;\n            throw new Error(reason);\n        },\n\n        warn: function(msg) {\n            api.warn(\"Module \" + this.name + \": \" + msg);\n        },\n\n        deprecationNotice: function(deprecated, replacement) {\n            api.warn(\"DEPRECATED: \" + deprecated + \" in module \" + this.name + \" is deprecated. Please use \" +\n                replacement + \" instead\");\n        },\n\n        createError: function(msg) {\n            return new Error(\"Error in Rangy \" + this.name + \" module: \" + msg);\n        }\n    };\n\n    function createModule(name, dependencies, initFunc) {\n        var newModule = new Module(name, dependencies, function(module) {\n            if (!module.initialized) {\n                module.initialized = true;\n                try {\n                    initFunc(api, module);\n                    module.supported = true;\n                } catch (ex) {\n                    var errorMessage = \"Module '\" + name + \"' failed to load: \" + getErrorDesc(ex);\n                    consoleLog(errorMessage);\n                    if (ex.stack) {\n                        consoleLog(ex.stack);\n                    }\n                }\n            }\n        });\n        modules[name] = newModule;\n        return newModule;\n    }\n\n    api.createModule = function(name) {\n        // Allow 2 or 3 arguments (second argument is an optional array of dependencies)\n        var initFunc, dependencies;\n        if (arguments.length == 2) {\n            initFunc = arguments[1];\n            dependencies = [];\n        } else {\n            initFunc = arguments[2];\n            dependencies = arguments[1];\n        }\n\n        var module = createModule(name, dependencies, initFunc);\n\n        // Initialize the module immediately if the core is already initialized\n        if (api.initialized && api.supported) {\n            module.init();\n        }\n    };\n\n    api.createCoreModule = function(name, dependencies, initFunc) {\n        createModule(name, dependencies, initFunc);\n    };\n\n    /*----------------------------------------------------------------------------------------------------------------*/\n\n    // Ensure rangy.rangePrototype and rangy.selectionPrototype are available immediately\n\n    function RangePrototype() {}\n    api.RangePrototype = RangePrototype;\n    api.rangePrototype = new RangePrototype();\n\n    function SelectionPrototype() {}\n    api.selectionPrototype = new SelectionPrototype();\n\n    /*----------------------------------------------------------------------------------------------------------------*/\n\n    // DOM utility methods used by Rangy\n    api.createCoreModule(\"DomUtil\", [], function(api, module) {\n        var UNDEF = \"undefined\";\n        var util = api.util;\n        var getBody = util.getBody;\n\n        // Perform feature tests\n        if (!util.areHostMethods(document, [\"createDocumentFragment\", \"createElement\", \"createTextNode\"])) {\n            module.fail(\"document missing a Node creation method\");\n        }\n\n        if (!util.isHostMethod(document, \"getElementsByTagName\")) {\n            module.fail(\"document missing getElementsByTagName method\");\n        }\n\n        var el = document.createElement(\"div\");\n        if (!util.areHostMethods(el, [\"insertBefore\", \"appendChild\", \"cloneNode\"] ||\n                !util.areHostObjects(el, [\"previousSibling\", \"nextSibling\", \"childNodes\", \"parentNode\"]))) {\n            module.fail(\"Incomplete Element implementation\");\n        }\n\n        // innerHTML is required for Range's createContextualFragment method\n        if (!util.isHostProperty(el, \"innerHTML\")) {\n            module.fail(\"Element is missing innerHTML property\");\n        }\n\n        var textNode = document.createTextNode(\"test\");\n        if (!util.areHostMethods(textNode, [\"splitText\", \"deleteData\", \"insertData\", \"appendData\", \"cloneNode\"] ||\n                !util.areHostObjects(el, [\"previousSibling\", \"nextSibling\", \"childNodes\", \"parentNode\"]) ||\n                !util.areHostProperties(textNode, [\"data\"]))) {\n            module.fail(\"Incomplete Text Node implementation\");\n        }\n\n        /*----------------------------------------------------------------------------------------------------------------*/\n\n        // Removed use of indexOf because of a bizarre bug in Opera that is thrown in one of the Acid3 tests. I haven't been\n        // able to replicate it outside of the test. The bug is that indexOf returns -1 when called on an Array that\n        // contains just the document as a single element and the value searched for is the document.\n        var arrayContains = /*Array.prototype.indexOf ?\n            function(arr, val) {\n                return arr.indexOf(val) > -1;\n            }:*/\n\n            function(arr, val) {\n                var i = arr.length;\n                while (i--) {\n                    if (arr[i] === val) {\n                        return true;\n                    }\n                }\n                return false;\n            };\n\n        // Opera 11 puts HTML elements in the null namespace, it seems, and IE 7 has undefined namespaceURI\n        function isHtmlNamespace(node) {\n            var ns;\n            return typeof node.namespaceURI == UNDEF || ((ns = node.namespaceURI) === null || ns == \"http://www.w3.org/1999/xhtml\");\n        }\n\n        function parentElement(node) {\n            var parent = node.parentNode;\n            return (parent.nodeType == 1) ? parent : null;\n        }\n\n        function getNodeIndex(node) {\n            var i = 0;\n            while( (node = node.previousSibling) ) {\n                ++i;\n            }\n            return i;\n        }\n\n        function getNodeLength(node) {\n            switch (node.nodeType) {\n                case 7:\n                case 10:\n                    return 0;\n                case 3:\n                case 8:\n                    return node.length;\n                default:\n                    return node.childNodes.length;\n            }\n        }\n\n        function getCommonAncestor(node1, node2) {\n            var ancestors = [], n;\n            for (n = node1; n; n = n.parentNode) {\n                ancestors.push(n);\n            }\n\n            for (n = node2; n; n = n.parentNode) {\n                if (arrayContains(ancestors, n)) {\n                    return n;\n                }\n            }\n\n            return null;\n        }\n\n        function isAncestorOf(ancestor, descendant, selfIsAncestor) {\n            var n = selfIsAncestor ? descendant : descendant.parentNode;\n            while (n) {\n                if (n === ancestor) {\n                    return true;\n                } else {\n                    n = n.parentNode;\n                }\n            }\n            return false;\n        }\n\n        function isOrIsAncestorOf(ancestor, descendant) {\n            return isAncestorOf(ancestor, descendant, true);\n        }\n\n        function getClosestAncestorIn(node, ancestor, selfIsAncestor) {\n            var p, n = selfIsAncestor ? node : node.parentNode;\n            while (n) {\n                p = n.parentNode;\n                if (p === ancestor) {\n                    return n;\n                }\n                n = p;\n            }\n            return null;\n        }\n\n        function isCharacterDataNode(node) {\n            var t = node.nodeType;\n            return t == 3 || t == 4 || t == 8 ; // Text, CDataSection or Comment\n        }\n\n        function isTextOrCommentNode(node) {\n            if (!node) {\n                return false;\n            }\n            var t = node.nodeType;\n            return t == 3 || t == 8 ; // Text or Comment\n        }\n\n        function insertAfter(node, precedingNode) {\n            var nextNode = precedingNode.nextSibling, parent = precedingNode.parentNode;\n            if (nextNode) {\n                parent.insertBefore(node, nextNode);\n            } else {\n                parent.appendChild(node);\n            }\n            return node;\n        }\n\n        // Note that we cannot use splitText() because it is bugridden in IE 9.\n        function splitDataNode(node, index, positionsToPreserve) {\n            var newNode = node.cloneNode(false);\n            newNode.deleteData(0, index);\n            node.deleteData(index, node.length - index);\n            insertAfter(newNode, node);\n\n            // Preserve positions\n            if (positionsToPreserve) {\n                for (var i = 0, position; position = positionsToPreserve[i++]; ) {\n                    // Handle case where position was inside the portion of node after the split point\n                    if (position.node == node && position.offset > index) {\n                        position.node = newNode;\n                        position.offset -= index;\n                    }\n                    // Handle the case where the position is a node offset within node's parent\n                    else if (position.node == node.parentNode && position.offset > getNodeIndex(node)) {\n                        ++position.offset;\n                    }\n                }\n            }\n            return newNode;\n        }\n\n        function getDocument(node) {\n            if (node.nodeType == 9) {\n                return node;\n            } else if (typeof node.ownerDocument != UNDEF) {\n                return node.ownerDocument;\n            } else if (typeof node.document != UNDEF) {\n                return node.document;\n            } else if (node.parentNode) {\n                return getDocument(node.parentNode);\n            } else {\n                throw module.createError(\"getDocument: no document found for node\");\n            }\n        }\n\n        function getWindow(node) {\n            var doc = getDocument(node);\n            if (typeof doc.defaultView != UNDEF) {\n                return doc.defaultView;\n            } else if (typeof doc.parentWindow != UNDEF) {\n                return doc.parentWindow;\n            } else {\n                throw module.createError(\"Cannot get a window object for node\");\n            }\n        }\n\n        function getIframeDocument(iframeEl) {\n            if (typeof iframeEl.contentDocument != UNDEF) {\n                return iframeEl.contentDocument;\n            } else if (typeof iframeEl.contentWindow != UNDEF) {\n                return iframeEl.contentWindow.document;\n            } else {\n                throw module.createError(\"getIframeDocument: No Document object found for iframe element\");\n            }\n        }\n\n        function getIframeWindow(iframeEl) {\n            if (typeof iframeEl.contentWindow != UNDEF) {\n                return iframeEl.contentWindow;\n            } else if (typeof iframeEl.contentDocument != UNDEF) {\n                return iframeEl.contentDocument.defaultView;\n            } else {\n                throw module.createError(\"getIframeWindow: No Window object found for iframe element\");\n            }\n        }\n\n        // This looks bad. Is it worth it?\n        function isWindow(obj) {\n            return obj && util.isHostMethod(obj, \"setTimeout\") && util.isHostObject(obj, \"document\");\n        }\n\n        function getContentDocument(obj, module, methodName) {\n            var doc;\n\n            if (!obj) {\n                doc = document;\n            }\n\n            // Test if a DOM node has been passed and obtain a document object for it if so\n            else if (util.isHostProperty(obj, \"nodeType\")) {\n                doc = (obj.nodeType == 1 && obj.tagName.toLowerCase() == \"iframe\") ?\n                    getIframeDocument(obj) : getDocument(obj);\n            }\n\n            // Test if the doc parameter appears to be a Window object\n            else if (isWindow(obj)) {\n                doc = obj.document;\n            }\n\n            if (!doc) {\n                throw module.createError(methodName + \"(): Parameter must be a Window object or DOM node\");\n            }\n\n            return doc;\n        }\n\n        function getRootContainer(node) {\n            var parent;\n            while ( (parent = node.parentNode) ) {\n                node = parent;\n            }\n            return node;\n        }\n\n        function comparePoints(nodeA, offsetA, nodeB, offsetB) {\n            // See http://www.w3.org/TR/DOM-Level-2-Traversal-Range/ranges.html#Level-2-Range-Comparing\n            var nodeC, root, childA, childB, n;\n            if (nodeA == nodeB) {\n                // Case 1: nodes are the same\n                return offsetA === offsetB ? 0 : (offsetA < offsetB) ? -1 : 1;\n            } else if ( (nodeC = getClosestAncestorIn(nodeB, nodeA, true)) ) {\n                // Case 2: node C (container B or an ancestor) is a child node of A\n                return offsetA <= getNodeIndex(nodeC) ? -1 : 1;\n            } else if ( (nodeC = getClosestAncestorIn(nodeA, nodeB, true)) ) {\n                // Case 3: node C (container A or an ancestor) is a child node of B\n                return getNodeIndex(nodeC) < offsetB  ? -1 : 1;\n            } else {\n                root = getCommonAncestor(nodeA, nodeB);\n                if (!root) {\n                    throw new Error(\"comparePoints error: nodes have no common ancestor\");\n                }\n\n                // Case 4: containers are siblings or descendants of siblings\n                childA = (nodeA === root) ? root : getClosestAncestorIn(nodeA, root, true);\n                childB = (nodeB === root) ? root : getClosestAncestorIn(nodeB, root, true);\n\n                if (childA === childB) {\n                    // This shouldn't be possible\n                    throw module.createError(\"comparePoints got to case 4 and childA and childB are the same!\");\n                } else {\n                    n = root.firstChild;\n                    while (n) {\n                        if (n === childA) {\n                            return -1;\n                        } else if (n === childB) {\n                            return 1;\n                        }\n                        n = n.nextSibling;\n                    }\n                }\n            }\n        }\n\n        /*----------------------------------------------------------------------------------------------------------------*/\n\n        // Test for IE's crash (IE 6/7) or exception (IE >= 8) when a reference to garbage-collected text node is queried\n        var crashyTextNodes = false;\n\n        function isBrokenNode(node) {\n            var n;\n            try {\n                n = node.parentNode;\n                return false;\n            } catch (e) {\n                return true;\n            }\n        }\n\n        (function() {\n            var el = document.createElement(\"b\");\n            el.innerHTML = \"1\";\n            var textNode = el.firstChild;\n            el.innerHTML = \"<br />\";\n            crashyTextNodes = isBrokenNode(textNode);\n\n            api.features.crashyTextNodes = crashyTextNodes;\n        })();\n\n        /*----------------------------------------------------------------------------------------------------------------*/\n\n        function inspectNode(node) {\n            if (!node) {\n                return \"[No node]\";\n            }\n            if (crashyTextNodes && isBrokenNode(node)) {\n                return \"[Broken node]\";\n            }\n            if (isCharacterDataNode(node)) {\n                return '\"' + node.data + '\"';\n            }\n            if (node.nodeType == 1) {\n                var idAttr = node.id ? ' id=\"' + node.id + '\"' : \"\";\n                return \"<\" + node.nodeName + idAttr + \">[index:\" + getNodeIndex(node) + \",length:\" + node.childNodes.length + \"][\" + (node.innerHTML || \"[innerHTML not supported]\").slice(0, 25) + \"]\";\n            }\n            return node.nodeName;\n        }\n\n        function fragmentFromNodeChildren(node) {\n            var fragment = getDocument(node).createDocumentFragment(), child;\n            while ( (child = node.firstChild) ) {\n                fragment.appendChild(child);\n            }\n            return fragment;\n        }\n\n        var getComputedStyleProperty;\n        if (typeof window.getComputedStyle != UNDEF) {\n            getComputedStyleProperty = function(el, propName) {\n                return getWindow(el).getComputedStyle(el, null)[propName];\n            };\n        } else if (typeof document.documentElement.currentStyle != UNDEF) {\n            getComputedStyleProperty = function(el, propName) {\n                return el.currentStyle ? el.currentStyle[propName] : \"\";\n            };\n        } else {\n            module.fail(\"No means of obtaining computed style properties found\");\n        }\n\n        function createTestElement(doc, html, contentEditable) {\n            var body = getBody(doc);\n            var el = doc.createElement(\"div\");\n            el.contentEditable = \"\" + !!contentEditable;\n            if (html) {\n                el.innerHTML = html;\n            }\n\n            // Insert the test element at the start of the body to prevent scrolling to the bottom in iOS (issue #292)\n            var bodyFirstChild = body.firstChild;\n            if (bodyFirstChild) {\n                body.insertBefore(el, bodyFirstChild);\n            } else {\n                body.appendChild(el);\n            }\n\n            return el;\n        }\n\n        function removeNode(node) {\n            return node.parentNode.removeChild(node);\n        }\n\n        function NodeIterator(root) {\n            this.root = root;\n            this._next = root;\n        }\n\n        NodeIterator.prototype = {\n            _current: null,\n\n            hasNext: function() {\n                return !!this._next;\n            },\n\n            next: function() {\n                var n = this._current = this._next;\n                var child, next;\n                if (this._current) {\n                    child = n.firstChild;\n                    if (child) {\n                        this._next = child;\n                    } else {\n                        next = null;\n                        while ((n !== this.root) && !(next = n.nextSibling)) {\n                            n = n.parentNode;\n                        }\n                        this._next = next;\n                    }\n                }\n                return this._current;\n            },\n\n            detach: function() {\n                this._current = this._next = this.root = null;\n            }\n        };\n\n        function createIterator(root) {\n            return new NodeIterator(root);\n        }\n\n        function DomPosition(node, offset) {\n            this.node = node;\n            this.offset = offset;\n        }\n\n        DomPosition.prototype = {\n            equals: function(pos) {\n                return !!pos && this.node === pos.node && this.offset == pos.offset;\n            },\n\n            inspect: function() {\n                return \"[DomPosition(\" + inspectNode(this.node) + \":\" + this.offset + \")]\";\n            },\n\n            toString: function() {\n                return this.inspect();\n            }\n        };\n\n        function DOMException(codeName) {\n            this.code = this[codeName];\n            this.codeName = codeName;\n            this.message = \"DOMException: \" + this.codeName;\n        }\n\n        DOMException.prototype = {\n            INDEX_SIZE_ERR: 1,\n            HIERARCHY_REQUEST_ERR: 3,\n            WRONG_DOCUMENT_ERR: 4,\n            NO_MODIFICATION_ALLOWED_ERR: 7,\n            NOT_FOUND_ERR: 8,\n            NOT_SUPPORTED_ERR: 9,\n            INVALID_STATE_ERR: 11,\n            INVALID_NODE_TYPE_ERR: 24\n        };\n\n        DOMException.prototype.toString = function() {\n            return this.message;\n        };\n\n        api.dom = {\n            arrayContains: arrayContains,\n            isHtmlNamespace: isHtmlNamespace,\n            parentElement: parentElement,\n            getNodeIndex: getNodeIndex,\n            getNodeLength: getNodeLength,\n            getCommonAncestor: getCommonAncestor,\n            isAncestorOf: isAncestorOf,\n            isOrIsAncestorOf: isOrIsAncestorOf,\n            getClosestAncestorIn: getClosestAncestorIn,\n            isCharacterDataNode: isCharacterDataNode,\n            isTextOrCommentNode: isTextOrCommentNode,\n            insertAfter: insertAfter,\n            splitDataNode: splitDataNode,\n            getDocument: getDocument,\n            getWindow: getWindow,\n            getIframeWindow: getIframeWindow,\n            getIframeDocument: getIframeDocument,\n            getBody: getBody,\n            isWindow: isWindow,\n            getContentDocument: getContentDocument,\n            getRootContainer: getRootContainer,\n            comparePoints: comparePoints,\n            isBrokenNode: isBrokenNode,\n            inspectNode: inspectNode,\n            getComputedStyleProperty: getComputedStyleProperty,\n            createTestElement: createTestElement,\n            removeNode: removeNode,\n            fragmentFromNodeChildren: fragmentFromNodeChildren,\n            createIterator: createIterator,\n            DomPosition: DomPosition\n        };\n\n        api.DOMException = DOMException;\n    });\n\n    /*----------------------------------------------------------------------------------------------------------------*/\n\n    // Pure JavaScript implementation of DOM Range\n    api.createCoreModule(\"DomRange\", [\"DomUtil\"], function(api, module) {\n        var dom = api.dom;\n        var util = api.util;\n        var DomPosition = dom.DomPosition;\n        var DOMException = api.DOMException;\n\n        var isCharacterDataNode = dom.isCharacterDataNode;\n        var getNodeIndex = dom.getNodeIndex;\n        var isOrIsAncestorOf = dom.isOrIsAncestorOf;\n        var getDocument = dom.getDocument;\n        var comparePoints = dom.comparePoints;\n        var splitDataNode = dom.splitDataNode;\n        var getClosestAncestorIn = dom.getClosestAncestorIn;\n        var getNodeLength = dom.getNodeLength;\n        var arrayContains = dom.arrayContains;\n        var getRootContainer = dom.getRootContainer;\n        var crashyTextNodes = api.features.crashyTextNodes;\n\n        var removeNode = dom.removeNode;\n\n        /*----------------------------------------------------------------------------------------------------------------*/\n\n        // Utility functions\n\n        function isNonTextPartiallySelected(node, range) {\n            return (node.nodeType != 3) &&\n                   (isOrIsAncestorOf(node, range.startContainer) || isOrIsAncestorOf(node, range.endContainer));\n        }\n\n        function getRangeDocument(range) {\n            return range.document || getDocument(range.startContainer);\n        }\n\n        function getRangeRoot(range) {\n            return getRootContainer(range.startContainer);\n        }\n\n        function getBoundaryBeforeNode(node) {\n            return new DomPosition(node.parentNode, getNodeIndex(node));\n        }\n\n        function getBoundaryAfterNode(node) {\n            return new DomPosition(node.parentNode, getNodeIndex(node) + 1);\n        }\n\n        function insertNodeAtPosition(node, n, o) {\n            var firstNodeInserted = node.nodeType == 11 ? node.firstChild : node;\n            if (isCharacterDataNode(n)) {\n                if (o == n.length) {\n                    dom.insertAfter(node, n);\n                } else {\n                    n.parentNode.insertBefore(node, o == 0 ? n : splitDataNode(n, o));\n                }\n            } else if (o >= n.childNodes.length) {\n                n.appendChild(node);\n            } else {\n                n.insertBefore(node, n.childNodes[o]);\n            }\n            return firstNodeInserted;\n        }\n\n        function rangesIntersect(rangeA, rangeB, touchingIsIntersecting) {\n            assertRangeValid(rangeA);\n            assertRangeValid(rangeB);\n\n            if (getRangeDocument(rangeB) != getRangeDocument(rangeA)) {\n                throw new DOMException(\"WRONG_DOCUMENT_ERR\");\n            }\n\n            var startComparison = comparePoints(rangeA.startContainer, rangeA.startOffset, rangeB.endContainer, rangeB.endOffset),\n                endComparison = comparePoints(rangeA.endContainer, rangeA.endOffset, rangeB.startContainer, rangeB.startOffset);\n\n            return touchingIsIntersecting ? startComparison <= 0 && endComparison >= 0 : startComparison < 0 && endComparison > 0;\n        }\n\n        function cloneSubtree(iterator) {\n            var partiallySelected;\n            for (var node, frag = getRangeDocument(iterator.range).createDocumentFragment(), subIterator; node = iterator.next(); ) {\n                partiallySelected = iterator.isPartiallySelectedSubtree();\n                node = node.cloneNode(!partiallySelected);\n                if (partiallySelected) {\n                    subIterator = iterator.getSubtreeIterator();\n                    node.appendChild(cloneSubtree(subIterator));\n                    subIterator.detach();\n                }\n\n                if (node.nodeType == 10) { // DocumentType\n                    throw new DOMException(\"HIERARCHY_REQUEST_ERR\");\n                }\n                frag.appendChild(node);\n            }\n            return frag;\n        }\n\n        function iterateSubtree(rangeIterator, func, iteratorState) {\n            var it, n;\n            iteratorState = iteratorState || { stop: false };\n            for (var node, subRangeIterator; node = rangeIterator.next(); ) {\n                if (rangeIterator.isPartiallySelectedSubtree()) {\n                    if (func(node) === false) {\n                        iteratorState.stop = true;\n                        return;\n                    } else {\n                        // The node is partially selected by the Range, so we can use a new RangeIterator on the portion of\n                        // the node selected by the Range.\n                        subRangeIterator = rangeIterator.getSubtreeIterator();\n                        iterateSubtree(subRangeIterator, func, iteratorState);\n                        subRangeIterator.detach();\n                        if (iteratorState.stop) {\n                            return;\n                        }\n                    }\n                } else {\n                    // The whole node is selected, so we can use efficient DOM iteration to iterate over the node and its\n                    // descendants\n                    it = dom.createIterator(node);\n                    while ( (n = it.next()) ) {\n                        if (func(n) === false) {\n                            iteratorState.stop = true;\n                            return;\n                        }\n                    }\n                }\n            }\n        }\n\n        function deleteSubtree(iterator) {\n            var subIterator;\n            while (iterator.next()) {\n                if (iterator.isPartiallySelectedSubtree()) {\n                    subIterator = iterator.getSubtreeIterator();\n                    deleteSubtree(subIterator);\n                    subIterator.detach();\n                } else {\n                    iterator.remove();\n                }\n            }\n        }\n\n        function extractSubtree(iterator) {\n            for (var node, frag = getRangeDocument(iterator.range).createDocumentFragment(), subIterator; node = iterator.next(); ) {\n\n                if (iterator.isPartiallySelectedSubtree()) {\n                    node = node.cloneNode(false);\n                    subIterator = iterator.getSubtreeIterator();\n                    node.appendChild(extractSubtree(subIterator));\n                    subIterator.detach();\n                } else {\n                    iterator.remove();\n                }\n                if (node.nodeType == 10) { // DocumentType\n                    throw new DOMException(\"HIERARCHY_REQUEST_ERR\");\n                }\n                frag.appendChild(node);\n            }\n            return frag;\n        }\n\n        function getNodesInRange(range, nodeTypes, filter) {\n            var filterNodeTypes = !!(nodeTypes && nodeTypes.length), regex;\n            var filterExists = !!filter;\n            if (filterNodeTypes) {\n                regex = new RegExp(\"^(\" + nodeTypes.join(\"|\") + \")$\");\n            }\n\n            var nodes = [];\n            iterateSubtree(new RangeIterator(range, false), function(node) {\n                if (filterNodeTypes && !regex.test(node.nodeType)) {\n                    return;\n                }\n                if (filterExists && !filter(node)) {\n                    return;\n                }\n                // Don't include a boundary container if it is a character data node and the range does not contain any\n                // of its character data. See issue 190.\n                var sc = range.startContainer;\n                if (node == sc && isCharacterDataNode(sc) && range.startOffset == sc.length) {\n                    return;\n                }\n\n                var ec = range.endContainer;\n                if (node == ec && isCharacterDataNode(ec) && range.endOffset == 0) {\n                    return;\n                }\n\n                nodes.push(node);\n            });\n            return nodes;\n        }\n\n        function inspect(range) {\n            var name = (typeof range.getName == \"undefined\") ? \"Range\" : range.getName();\n            return \"[\" + name + \"(\" + dom.inspectNode(range.startContainer) + \":\" + range.startOffset + \", \" +\n                    dom.inspectNode(range.endContainer) + \":\" + range.endOffset + \")]\";\n        }\n\n        /*----------------------------------------------------------------------------------------------------------------*/\n\n        // RangeIterator code partially borrows from IERange by Tim Ryan (http://github.com/timcameronryan/IERange)\n\n        function RangeIterator(range, clonePartiallySelectedTextNodes) {\n            this.range = range;\n            this.clonePartiallySelectedTextNodes = clonePartiallySelectedTextNodes;\n\n\n            if (!range.collapsed) {\n                this.sc = range.startContainer;\n                this.so = range.startOffset;\n                this.ec = range.endContainer;\n                this.eo = range.endOffset;\n                var root = range.commonAncestorContainer;\n\n                if (this.sc === this.ec && isCharacterDataNode(this.sc)) {\n                    this.isSingleCharacterDataNode = true;\n                    this._first = this._last = this._next = this.sc;\n                } else {\n                    this._first = this._next = (this.sc === root && !isCharacterDataNode(this.sc)) ?\n                        this.sc.childNodes[this.so] : getClosestAncestorIn(this.sc, root, true);\n                    this._last = (this.ec === root && !isCharacterDataNode(this.ec)) ?\n                        this.ec.childNodes[this.eo - 1] : getClosestAncestorIn(this.ec, root, true);\n                }\n            }\n        }\n\n        RangeIterator.prototype = {\n            _current: null,\n            _next: null,\n            _first: null,\n            _last: null,\n            isSingleCharacterDataNode: false,\n\n            reset: function() {\n                this._current = null;\n                this._next = this._first;\n            },\n\n            hasNext: function() {\n                return !!this._next;\n            },\n\n            next: function() {\n                // Move to next node\n                var current = this._current = this._next;\n                if (current) {\n                    this._next = (current !== this._last) ? current.nextSibling : null;\n\n                    // Check for partially selected text nodes\n                    if (isCharacterDataNode(current) && this.clonePartiallySelectedTextNodes) {\n                        if (current === this.ec) {\n                            (current = current.cloneNode(true)).deleteData(this.eo, current.length - this.eo);\n                        }\n                        if (this._current === this.sc) {\n                            (current = current.cloneNode(true)).deleteData(0, this.so);\n                        }\n                    }\n                }\n\n                return current;\n            },\n\n            remove: function() {\n                var current = this._current, start, end;\n\n                if (isCharacterDataNode(current) && (current === this.sc || current === this.ec)) {\n                    start = (current === this.sc) ? this.so : 0;\n                    end = (current === this.ec) ? this.eo : current.length;\n                    if (start != end) {\n                        current.deleteData(start, end - start);\n                    }\n                } else {\n                    if (current.parentNode) {\n                        removeNode(current);\n                    } else {\n                    }\n                }\n            },\n\n            // Checks if the current node is partially selected\n            isPartiallySelectedSubtree: function() {\n                var current = this._current;\n                return isNonTextPartiallySelected(current, this.range);\n            },\n\n            getSubtreeIterator: function() {\n                var subRange;\n                if (this.isSingleCharacterDataNode) {\n                    subRange = this.range.cloneRange();\n                    subRange.collapse(false);\n                } else {\n                    subRange = new Range(getRangeDocument(this.range));\n                    var current = this._current;\n                    var startContainer = current, startOffset = 0, endContainer = current, endOffset = getNodeLength(current);\n\n                    if (isOrIsAncestorOf(current, this.sc)) {\n                        startContainer = this.sc;\n                        startOffset = this.so;\n                    }\n                    if (isOrIsAncestorOf(current, this.ec)) {\n                        endContainer = this.ec;\n                        endOffset = this.eo;\n                    }\n\n                    updateBoundaries(subRange, startContainer, startOffset, endContainer, endOffset);\n                }\n                return new RangeIterator(subRange, this.clonePartiallySelectedTextNodes);\n            },\n\n            detach: function() {\n                this.range = this._current = this._next = this._first = this._last = this.sc = this.so = this.ec = this.eo = null;\n            }\n        };\n\n        /*----------------------------------------------------------------------------------------------------------------*/\n\n        var beforeAfterNodeTypes = [1, 3, 4, 5, 7, 8, 10];\n        var rootContainerNodeTypes = [2, 9, 11];\n        var readonlyNodeTypes = [5, 6, 10, 12];\n        var insertableNodeTypes = [1, 3, 4, 5, 7, 8, 10, 11];\n        var surroundNodeTypes = [1, 3, 4, 5, 7, 8];\n\n        function createAncestorFinder(nodeTypes) {\n            return function(node, selfIsAncestor) {\n                var t, n = selfIsAncestor ? node : node.parentNode;\n                while (n) {\n                    t = n.nodeType;\n                    if (arrayContains(nodeTypes, t)) {\n                        return n;\n                    }\n                    n = n.parentNode;\n                }\n                return null;\n            };\n        }\n\n        var getDocumentOrFragmentContainer = createAncestorFinder( [9, 11] );\n        var getReadonlyAncestor = createAncestorFinder(readonlyNodeTypes);\n        var getDocTypeNotationEntityAncestor = createAncestorFinder( [6, 10, 12] );\n        var getElementAncestor = createAncestorFinder( [1] );\n\n        function assertNoDocTypeNotationEntityAncestor(node, allowSelf) {\n            if (getDocTypeNotationEntityAncestor(node, allowSelf)) {\n                throw new DOMException(\"INVALID_NODE_TYPE_ERR\");\n            }\n        }\n\n        function assertValidNodeType(node, invalidTypes) {\n            if (!arrayContains(invalidTypes, node.nodeType)) {\n                throw new DOMException(\"INVALID_NODE_TYPE_ERR\");\n            }\n        }\n\n        function assertValidOffset(node, offset) {\n            if (offset < 0 || offset > (isCharacterDataNode(node) ? node.length : node.childNodes.length)) {\n                throw new DOMException(\"INDEX_SIZE_ERR\");\n            }\n        }\n\n        function assertSameDocumentOrFragment(node1, node2) {\n            if (getDocumentOrFragmentContainer(node1, true) !== getDocumentOrFragmentContainer(node2, true)) {\n                throw new DOMException(\"WRONG_DOCUMENT_ERR\");\n            }\n        }\n\n        function assertNodeNotReadOnly(node) {\n            if (getReadonlyAncestor(node, true)) {\n                throw new DOMException(\"NO_MODIFICATION_ALLOWED_ERR\");\n            }\n        }\n\n        function assertNode(node, codeName) {\n            if (!node) {\n                throw new DOMException(codeName);\n            }\n        }\n\n        function isValidOffset(node, offset) {\n            return offset <= (isCharacterDataNode(node) ? node.length : node.childNodes.length);\n        }\n\n        function isRangeValid(range) {\n            return (!!range.startContainer && !!range.endContainer &&\n                    !(crashyTextNodes && (dom.isBrokenNode(range.startContainer) || dom.isBrokenNode(range.endContainer))) &&\n                    getRootContainer(range.startContainer) == getRootContainer(range.endContainer) &&\n                    isValidOffset(range.startContainer, range.startOffset) &&\n                    isValidOffset(range.endContainer, range.endOffset));\n        }\n\n        function assertRangeValid(range) {\n            if (!isRangeValid(range)) {\n                throw new Error(\"Range error: Range is not valid. This usually happens after DOM mutation. Range: (\" + range.inspect() + \")\");\n            }\n        }\n\n        /*----------------------------------------------------------------------------------------------------------------*/\n\n        // Test the browser's innerHTML support to decide how to implement createContextualFragment\n        var styleEl = document.createElement(\"style\");\n        var htmlParsingConforms = false;\n        try {\n            styleEl.innerHTML = \"<b>x</b>\";\n            htmlParsingConforms = (styleEl.firstChild.nodeType == 3); // Pre-Blink Opera incorrectly creates an element node\n        } catch (e) {\n            // IE 6 and 7 throw\n        }\n\n        api.features.htmlParsingConforms = htmlParsingConforms;\n\n        var createContextualFragment = htmlParsingConforms ?\n\n            // Implementation as per HTML parsing spec, trusting in the browser's implementation of innerHTML. See\n            // discussion and base code for this implementation at issue 67.\n            // Spec: http://html5.org/specs/dom-parsing.html#extensions-to-the-range-interface\n            // Thanks to Aleks Williams.\n            function(fragmentStr) {\n                // \"Let node the context object's start's node.\"\n                var node = this.startContainer;\n                var doc = getDocument(node);\n\n                // \"If the context object's start's node is null, raise an INVALID_STATE_ERR\n                // exception and abort these steps.\"\n                if (!node) {\n                    throw new DOMException(\"INVALID_STATE_ERR\");\n                }\n\n                // \"Let element be as follows, depending on node's interface:\"\n                // Document, Document Fragment: null\n                var el = null;\n\n                // \"Element: node\"\n                if (node.nodeType == 1) {\n                    el = node;\n\n                // \"Text, Comment: node's parentElement\"\n                } else if (isCharacterDataNode(node)) {\n                    el = dom.parentElement(node);\n                }\n\n                // \"If either element is null or element's ownerDocument is an HTML document\n                // and element's local name is \"html\" and element's namespace is the HTML\n                // namespace\"\n                if (el === null || (\n                    el.nodeName == \"HTML\" &&\n                    dom.isHtmlNamespace(getDocument(el).documentElement) &&\n                    dom.isHtmlNamespace(el)\n                )) {\n\n                // \"let element be a new Element with \"body\" as its local name and the HTML\n                // namespace as its namespace.\"\"\n                    el = doc.createElement(\"body\");\n                } else {\n                    el = el.cloneNode(false);\n                }\n\n                // \"If the node's document is an HTML document: Invoke the HTML fragment parsing algorithm.\"\n                // \"If the node's document is an XML document: Invoke the XML fragment parsing algorithm.\"\n                // \"In either case, the algorithm must be invoked with fragment as the input\n                // and element as the context element.\"\n                el.innerHTML = fragmentStr;\n\n                // \"If this raises an exception, then abort these steps. Otherwise, let new\n                // children be the nodes returned.\"\n\n                // \"Let fragment be a new DocumentFragment.\"\n                // \"Append all new children to fragment.\"\n                // \"Return fragment.\"\n                return dom.fragmentFromNodeChildren(el);\n            } :\n\n            // In this case, innerHTML cannot be trusted, so fall back to a simpler, non-conformant implementation that\n            // previous versions of Rangy used (with the exception of using a body element rather than a div)\n            function(fragmentStr) {\n                var doc = getRangeDocument(this);\n                var el = doc.createElement(\"body\");\n                el.innerHTML = fragmentStr;\n\n                return dom.fragmentFromNodeChildren(el);\n            };\n\n        function splitRangeBoundaries(range, positionsToPreserve) {\n            assertRangeValid(range);\n\n            var sc = range.startContainer, so = range.startOffset, ec = range.endContainer, eo = range.endOffset;\n            var startEndSame = (sc === ec);\n\n            if (isCharacterDataNode(ec) && eo > 0 && eo < ec.length) {\n                splitDataNode(ec, eo, positionsToPreserve);\n            }\n\n            if (isCharacterDataNode(sc) && so > 0 && so < sc.length) {\n                sc = splitDataNode(sc, so, positionsToPreserve);\n                if (startEndSame) {\n                    eo -= so;\n                    ec = sc;\n                } else if (ec == sc.parentNode && eo >= getNodeIndex(sc)) {\n                    eo++;\n                }\n                so = 0;\n            }\n            range.setStartAndEnd(sc, so, ec, eo);\n        }\n\n        function rangeToHtml(range) {\n            assertRangeValid(range);\n            var container = range.commonAncestorContainer.parentNode.cloneNode(false);\n            container.appendChild( range.cloneContents() );\n            return container.innerHTML;\n        }\n\n        /*----------------------------------------------------------------------------------------------------------------*/\n\n        var rangeProperties = [\"startContainer\", \"startOffset\", \"endContainer\", \"endOffset\", \"collapsed\",\n            \"commonAncestorContainer\"];\n\n        var s2s = 0, s2e = 1, e2e = 2, e2s = 3;\n        var n_b = 0, n_a = 1, n_b_a = 2, n_i = 3;\n\n        util.extend(api.rangePrototype, {\n            compareBoundaryPoints: function(how, range) {\n                assertRangeValid(this);\n                assertSameDocumentOrFragment(this.startContainer, range.startContainer);\n\n                var nodeA, offsetA, nodeB, offsetB;\n                var prefixA = (how == e2s || how == s2s) ? \"start\" : \"end\";\n                var prefixB = (how == s2e || how == s2s) ? \"start\" : \"end\";\n                nodeA = this[prefixA + \"Container\"];\n                offsetA = this[prefixA + \"Offset\"];\n                nodeB = range[prefixB + \"Container\"];\n                offsetB = range[prefixB + \"Offset\"];\n                return comparePoints(nodeA, offsetA, nodeB, offsetB);\n            },\n\n            insertNode: function(node) {\n                assertRangeValid(this);\n                assertValidNodeType(node, insertableNodeTypes);\n                assertNodeNotReadOnly(this.startContainer);\n\n                if (isOrIsAncestorOf(node, this.startContainer)) {\n                    throw new DOMException(\"HIERARCHY_REQUEST_ERR\");\n                }\n\n                // No check for whether the container of the start of the Range is of a type that does not allow\n                // children of the type of node: the browser's DOM implementation should do this for us when we attempt\n                // to add the node\n\n                var firstNodeInserted = insertNodeAtPosition(node, this.startContainer, this.startOffset);\n                this.setStartBefore(firstNodeInserted);\n            },\n\n            cloneContents: function() {\n                assertRangeValid(this);\n\n                var clone, frag;\n                if (this.collapsed) {\n                    return getRangeDocument(this).createDocumentFragment();\n                } else {\n                    if (this.startContainer === this.endContainer && isCharacterDataNode(this.startContainer)) {\n                        clone = this.startContainer.cloneNode(true);\n                        clone.data = clone.data.slice(this.startOffset, this.endOffset);\n                        frag = getRangeDocument(this).createDocumentFragment();\n                        frag.appendChild(clone);\n                        return frag;\n                    } else {\n                        var iterator = new RangeIterator(this, true);\n                        clone = cloneSubtree(iterator);\n                        iterator.detach();\n                    }\n                    return clone;\n                }\n            },\n\n            canSurroundContents: function() {\n                assertRangeValid(this);\n                assertNodeNotReadOnly(this.startContainer);\n                assertNodeNotReadOnly(this.endContainer);\n\n                // Check if the contents can be surrounded. Specifically, this means whether the range partially selects\n                // no non-text nodes.\n                var iterator = new RangeIterator(this, true);\n                var boundariesInvalid = (iterator._first && (isNonTextPartiallySelected(iterator._first, this)) ||\n                        (iterator._last && isNonTextPartiallySelected(iterator._last, this)));\n                iterator.detach();\n                return !boundariesInvalid;\n            },\n\n            surroundContents: function(node) {\n                assertValidNodeType(node, surroundNodeTypes);\n\n                if (!this.canSurroundContents()) {\n                    throw new DOMException(\"INVALID_STATE_ERR\");\n                }\n\n                // Extract the contents\n                var content = this.extractContents();\n\n                // Clear the children of the node\n                if (node.hasChildNodes()) {\n                    while (node.lastChild) {\n                        node.removeChild(node.lastChild);\n                    }\n                }\n\n                // Insert the new node and add the extracted contents\n                insertNodeAtPosition(node, this.startContainer, this.startOffset);\n                node.appendChild(content);\n\n                this.selectNode(node);\n            },\n\n            cloneRange: function() {\n                assertRangeValid(this);\n                var range = new Range(getRangeDocument(this));\n                var i = rangeProperties.length, prop;\n                while (i--) {\n                    prop = rangeProperties[i];\n                    range[prop] = this[prop];\n                }\n                return range;\n            },\n\n            toString: function() {\n                assertRangeValid(this);\n                var sc = this.startContainer;\n                if (sc === this.endContainer && isCharacterDataNode(sc)) {\n                    return (sc.nodeType == 3 || sc.nodeType == 4) ? sc.data.slice(this.startOffset, this.endOffset) : \"\";\n                } else {\n                    var textParts = [], iterator = new RangeIterator(this, true);\n                    iterateSubtree(iterator, function(node) {\n                        // Accept only text or CDATA nodes, not comments\n                        if (node.nodeType == 3 || node.nodeType == 4) {\n                            textParts.push(node.data);\n                        }\n                    });\n                    iterator.detach();\n                    return textParts.join(\"\");\n                }\n            },\n\n            // The methods below are all non-standard. The following batch were introduced by Mozilla but have since\n            // been removed from Mozilla.\n\n            compareNode: function(node) {\n                assertRangeValid(this);\n\n                var parent = node.parentNode;\n                var nodeIndex = getNodeIndex(node);\n\n                if (!parent) {\n                    throw new DOMException(\"NOT_FOUND_ERR\");\n                }\n\n                var startComparison = this.comparePoint(parent, nodeIndex),\n                    endComparison = this.comparePoint(parent, nodeIndex + 1);\n\n                if (startComparison < 0) { // Node starts before\n                    return (endComparison > 0) ? n_b_a : n_b;\n                } else {\n                    return (endComparison > 0) ? n_a : n_i;\n                }\n            },\n\n            comparePoint: function(node, offset) {\n                assertRangeValid(this);\n                assertNode(node, \"HIERARCHY_REQUEST_ERR\");\n                assertSameDocumentOrFragment(node, this.startContainer);\n\n                if (comparePoints(node, offset, this.startContainer, this.startOffset) < 0) {\n                    return -1;\n                } else if (comparePoints(node, offset, this.endContainer, this.endOffset) > 0) {\n                    return 1;\n                }\n                return 0;\n            },\n\n            createContextualFragment: createContextualFragment,\n\n            toHtml: function() {\n                return rangeToHtml(this);\n            },\n\n            // touchingIsIntersecting determines whether this method considers a node that borders a range intersects\n            // with it (as in WebKit) or not (as in Gecko pre-1.9, and the default)\n            intersectsNode: function(node, touchingIsIntersecting) {\n                assertRangeValid(this);\n                if (getRootContainer(node) != getRangeRoot(this)) {\n                    return false;\n                }\n\n                var parent = node.parentNode, offset = getNodeIndex(node);\n                if (!parent) {\n                    return true;\n                }\n\n                var startComparison = comparePoints(parent, offset, this.endContainer, this.endOffset),\n                    endComparison = comparePoints(parent, offset + 1, this.startContainer, this.startOffset);\n\n                return touchingIsIntersecting ? startComparison <= 0 && endComparison >= 0 : startComparison < 0 && endComparison > 0;\n            },\n\n            isPointInRange: function(node, offset) {\n                assertRangeValid(this);\n                assertNode(node, \"HIERARCHY_REQUEST_ERR\");\n                assertSameDocumentOrFragment(node, this.startContainer);\n\n                return (comparePoints(node, offset, this.startContainer, this.startOffset) >= 0) &&\n                       (comparePoints(node, offset, this.endContainer, this.endOffset) <= 0);\n            },\n\n            // The methods below are non-standard and invented by me.\n\n            // Sharing a boundary start-to-end or end-to-start does not count as intersection.\n            intersectsRange: function(range) {\n                return rangesIntersect(this, range, false);\n            },\n\n            // Sharing a boundary start-to-end or end-to-start does count as intersection.\n            intersectsOrTouchesRange: function(range) {\n                return rangesIntersect(this, range, true);\n            },\n\n            intersection: function(range) {\n                if (this.intersectsRange(range)) {\n                    var startComparison = comparePoints(this.startContainer, this.startOffset, range.startContainer, range.startOffset),\n                        endComparison = comparePoints(this.endContainer, this.endOffset, range.endContainer, range.endOffset);\n\n                    var intersectionRange = this.cloneRange();\n                    if (startComparison == -1) {\n                        intersectionRange.setStart(range.startContainer, range.startOffset);\n                    }\n                    if (endComparison == 1) {\n                        intersectionRange.setEnd(range.endContainer, range.endOffset);\n                    }\n                    return intersectionRange;\n                }\n                return null;\n            },\n\n            union: function(range) {\n                if (this.intersectsOrTouchesRange(range)) {\n                    var unionRange = this.cloneRange();\n                    if (comparePoints(range.startContainer, range.startOffset, this.startContainer, this.startOffset) == -1) {\n                        unionRange.setStart(range.startContainer, range.startOffset);\n                    }\n                    if (comparePoints(range.endContainer, range.endOffset, this.endContainer, this.endOffset) == 1) {\n                        unionRange.setEnd(range.endContainer, range.endOffset);\n                    }\n                    return unionRange;\n                } else {\n                    throw new DOMException(\"Ranges do not intersect\");\n                }\n            },\n\n            containsNode: function(node, allowPartial) {\n                if (allowPartial) {\n                    return this.intersectsNode(node, false);\n                } else {\n                    return this.compareNode(node) == n_i;\n                }\n            },\n\n            containsNodeContents: function(node) {\n                return this.comparePoint(node, 0) >= 0 && this.comparePoint(node, getNodeLength(node)) <= 0;\n            },\n\n            containsRange: function(range) {\n                var intersection = this.intersection(range);\n                return intersection !== null && range.equals(intersection);\n            },\n\n            containsNodeText: function(node) {\n                var nodeRange = this.cloneRange();\n                nodeRange.selectNode(node);\n                var textNodes = nodeRange.getNodes([3]);\n                if (textNodes.length > 0) {\n                    nodeRange.setStart(textNodes[0], 0);\n                    var lastTextNode = textNodes.pop();\n                    nodeRange.setEnd(lastTextNode, lastTextNode.length);\n                    return this.containsRange(nodeRange);\n                } else {\n                    return this.containsNodeContents(node);\n                }\n            },\n\n            getNodes: function(nodeTypes, filter) {\n                assertRangeValid(this);\n                return getNodesInRange(this, nodeTypes, filter);\n            },\n\n            getDocument: function() {\n                return getRangeDocument(this);\n            },\n\n            collapseBefore: function(node) {\n                this.setEndBefore(node);\n                this.collapse(false);\n            },\n\n            collapseAfter: function(node) {\n                this.setStartAfter(node);\n                this.collapse(true);\n            },\n\n            getBookmark: function(containerNode) {\n                var doc = getRangeDocument(this);\n                var preSelectionRange = api.createRange(doc);\n                containerNode = containerNode || dom.getBody(doc);\n                preSelectionRange.selectNodeContents(containerNode);\n                var range = this.intersection(preSelectionRange);\n                var start = 0, end = 0;\n                if (range) {\n                    preSelectionRange.setEnd(range.startContainer, range.startOffset);\n                    start = preSelectionRange.toString().length;\n                    end = start + range.toString().length;\n                }\n\n                return {\n                    start: start,\n                    end: end,\n                    containerNode: containerNode\n                };\n            },\n\n            moveToBookmark: function(bookmark) {\n                var containerNode = bookmark.containerNode;\n                var charIndex = 0;\n                this.setStart(containerNode, 0);\n                this.collapse(true);\n                var nodeStack = [containerNode], node, foundStart = false, stop = false;\n                var nextCharIndex, i, childNodes;\n\n                while (!stop && (node = nodeStack.pop())) {\n                    if (node.nodeType == 3) {\n                        nextCharIndex = charIndex + node.length;\n                        if (!foundStart && bookmark.start >= charIndex && bookmark.start <= nextCharIndex) {\n                            this.setStart(node, bookmark.start - charIndex);\n                            foundStart = true;\n                        }\n                        if (foundStart && bookmark.end >= charIndex && bookmark.end <= nextCharIndex) {\n                            this.setEnd(node, bookmark.end - charIndex);\n                            stop = true;\n                        }\n                        charIndex = nextCharIndex;\n                    } else {\n                        childNodes = node.childNodes;\n                        i = childNodes.length;\n                        while (i--) {\n                            nodeStack.push(childNodes[i]);\n                        }\n                    }\n                }\n            },\n\n            getName: function() {\n                return \"DomRange\";\n            },\n\n            equals: function(range) {\n                return Range.rangesEqual(this, range);\n            },\n\n            isValid: function() {\n                return isRangeValid(this);\n            },\n\n            inspect: function() {\n                return inspect(this);\n            },\n\n            detach: function() {\n                // In DOM4, detach() is now a no-op.\n            }\n        });\n\n        function copyComparisonConstantsToObject(obj) {\n            obj.START_TO_START = s2s;\n            obj.START_TO_END = s2e;\n            obj.END_TO_END = e2e;\n            obj.END_TO_START = e2s;\n\n            obj.NODE_BEFORE = n_b;\n            obj.NODE_AFTER = n_a;\n            obj.NODE_BEFORE_AND_AFTER = n_b_a;\n            obj.NODE_INSIDE = n_i;\n        }\n\n        function copyComparisonConstants(constructor) {\n            copyComparisonConstantsToObject(constructor);\n            copyComparisonConstantsToObject(constructor.prototype);\n        }\n\n        function createRangeContentRemover(remover, boundaryUpdater) {\n            return function() {\n                assertRangeValid(this);\n\n                var sc = this.startContainer, so = this.startOffset, root = this.commonAncestorContainer;\n\n                var iterator = new RangeIterator(this, true);\n\n                // Work out where to position the range after content removal\n                var node, boundary;\n                if (sc !== root) {\n                    node = getClosestAncestorIn(sc, root, true);\n                    boundary = getBoundaryAfterNode(node);\n                    sc = boundary.node;\n                    so = boundary.offset;\n                }\n\n                // Check none of the range is read-only\n                iterateSubtree(iterator, assertNodeNotReadOnly);\n\n                iterator.reset();\n\n                // Remove the content\n                var returnValue = remover(iterator);\n                iterator.detach();\n\n                // Move to the new position\n                boundaryUpdater(this, sc, so, sc, so);\n\n                return returnValue;\n            };\n        }\n\n        function createPrototypeRange(constructor, boundaryUpdater) {\n            function createBeforeAfterNodeSetter(isBefore, isStart) {\n                return function(node) {\n                    assertValidNodeType(node, beforeAfterNodeTypes);\n                    assertValidNodeType(getRootContainer(node), rootContainerNodeTypes);\n\n                    var boundary = (isBefore ? getBoundaryBeforeNode : getBoundaryAfterNode)(node);\n                    (isStart ? setRangeStart : setRangeEnd)(this, boundary.node, boundary.offset);\n                };\n            }\n\n            function setRangeStart(range, node, offset) {\n                var ec = range.endContainer, eo = range.endOffset;\n                if (node !== range.startContainer || offset !== range.startOffset) {\n                    // Check the root containers of the range and the new boundary, and also check whether the new boundary\n                    // is after the current end. In either case, collapse the range to the new position\n                    if (getRootContainer(node) != getRootContainer(ec) || comparePoints(node, offset, ec, eo) == 1) {\n                        ec = node;\n                        eo = offset;\n                    }\n                    boundaryUpdater(range, node, offset, ec, eo);\n                }\n            }\n\n            function setRangeEnd(range, node, offset) {\n                var sc = range.startContainer, so = range.startOffset;\n                if (node !== range.endContainer || offset !== range.endOffset) {\n                    // Check the root containers of the range and the new boundary, and also check whether the new boundary\n                    // is after the current end. In either case, collapse the range to the new position\n                    if (getRootContainer(node) != getRootContainer(sc) || comparePoints(node, offset, sc, so) == -1) {\n                        sc = node;\n                        so = offset;\n                    }\n                    boundaryUpdater(range, sc, so, node, offset);\n                }\n            }\n\n            // Set up inheritance\n            var F = function() {};\n            F.prototype = api.rangePrototype;\n            constructor.prototype = new F();\n\n            util.extend(constructor.prototype, {\n                setStart: function(node, offset) {\n                    assertNoDocTypeNotationEntityAncestor(node, true);\n                    assertValidOffset(node, offset);\n\n                    setRangeStart(this, node, offset);\n                },\n\n                setEnd: function(node, offset) {\n                    assertNoDocTypeNotationEntityAncestor(node, true);\n                    assertValidOffset(node, offset);\n\n                    setRangeEnd(this, node, offset);\n                },\n\n                /**\n                 * Convenience method to set a range's start and end boundaries. Overloaded as follows:\n                 * - Two parameters (node, offset) creates a collapsed range at that position\n                 * - Three parameters (node, startOffset, endOffset) creates a range contained with node starting at\n                 *   startOffset and ending at endOffset\n                 * - Four parameters (startNode, startOffset, endNode, endOffset) creates a range starting at startOffset in\n                 *   startNode and ending at endOffset in endNode\n                 */\n                setStartAndEnd: function() {\n                    var args = arguments;\n                    var sc = args[0], so = args[1], ec = sc, eo = so;\n\n                    switch (args.length) {\n                        case 3:\n                            eo = args[2];\n                            break;\n                        case 4:\n                            ec = args[2];\n                            eo = args[3];\n                            break;\n                    }\n\n                    assertNoDocTypeNotationEntityAncestor(sc, true);\n                    assertValidOffset(sc, so);\n\n                    assertNoDocTypeNotationEntityAncestor(ec, true);\n                    assertValidOffset(ec, eo);\n\n                    boundaryUpdater(this, sc, so, ec, eo);\n                },\n\n                setBoundary: function(node, offset, isStart) {\n                    this[\"set\" + (isStart ? \"Start\" : \"End\")](node, offset);\n                },\n\n                setStartBefore: createBeforeAfterNodeSetter(true, true),\n                setStartAfter: createBeforeAfterNodeSetter(false, true),\n                setEndBefore: createBeforeAfterNodeSetter(true, false),\n                setEndAfter: createBeforeAfterNodeSetter(false, false),\n\n                collapse: function(isStart) {\n                    assertRangeValid(this);\n                    if (isStart) {\n                        boundaryUpdater(this, this.startContainer, this.startOffset, this.startContainer, this.startOffset);\n                    } else {\n                        boundaryUpdater(this, this.endContainer, this.endOffset, this.endContainer, this.endOffset);\n                    }\n                },\n\n                selectNodeContents: function(node) {\n                    assertNoDocTypeNotationEntityAncestor(node, true);\n\n                    boundaryUpdater(this, node, 0, node, getNodeLength(node));\n                },\n\n                selectNode: function(node) {\n                    assertNoDocTypeNotationEntityAncestor(node, false);\n                    assertValidNodeType(node, beforeAfterNodeTypes);\n\n                    var start = getBoundaryBeforeNode(node), end = getBoundaryAfterNode(node);\n                    boundaryUpdater(this, start.node, start.offset, end.node, end.offset);\n                },\n\n                extractContents: createRangeContentRemover(extractSubtree, boundaryUpdater),\n\n                deleteContents: createRangeContentRemover(deleteSubtree, boundaryUpdater),\n\n                canSurroundContents: function() {\n                    assertRangeValid(this);\n                    assertNodeNotReadOnly(this.startContainer);\n                    assertNodeNotReadOnly(this.endContainer);\n\n                    // Check if the contents can be surrounded. Specifically, this means whether the range partially selects\n                    // no non-text nodes.\n                    var iterator = new RangeIterator(this, true);\n                    var boundariesInvalid = (iterator._first && isNonTextPartiallySelected(iterator._first, this) ||\n                            (iterator._last && isNonTextPartiallySelected(iterator._last, this)));\n                    iterator.detach();\n                    return !boundariesInvalid;\n                },\n\n                splitBoundaries: function() {\n                    splitRangeBoundaries(this);\n                },\n\n                splitBoundariesPreservingPositions: function(positionsToPreserve) {\n                    splitRangeBoundaries(this, positionsToPreserve);\n                },\n\n                normalizeBoundaries: function() {\n                    assertRangeValid(this);\n\n                    var sc = this.startContainer, so = this.startOffset, ec = this.endContainer, eo = this.endOffset;\n\n                    var mergeForward = function(node) {\n                        var sibling = node.nextSibling;\n                        if (sibling && sibling.nodeType == node.nodeType) {\n                            ec = node;\n                            eo = node.length;\n                            node.appendData(sibling.data);\n                            removeNode(sibling);\n                        }\n                    };\n\n                    var mergeBackward = function(node) {\n                        var sibling = node.previousSibling;\n                        if (sibling && sibling.nodeType == node.nodeType) {\n                            sc = node;\n                            var nodeLength = node.length;\n                            so = sibling.length;\n                            node.insertData(0, sibling.data);\n                            removeNode(sibling);\n                            if (sc == ec) {\n                                eo += so;\n                                ec = sc;\n                            } else if (ec == node.parentNode) {\n                                var nodeIndex = getNodeIndex(node);\n                                if (eo == nodeIndex) {\n                                    ec = node;\n                                    eo = nodeLength;\n                                } else if (eo > nodeIndex) {\n                                    eo--;\n                                }\n                            }\n                        }\n                    };\n\n                    var normalizeStart = true;\n                    var sibling;\n\n                    if (isCharacterDataNode(ec)) {\n                        if (eo == ec.length) {\n                            mergeForward(ec);\n                        } else if (eo == 0) {\n                            sibling = ec.previousSibling;\n                            if (sibling && sibling.nodeType == ec.nodeType) {\n                                eo = sibling.length;\n                                if (sc == ec) {\n                                    normalizeStart = false;\n                                }\n                                sibling.appendData(ec.data);\n                                removeNode(ec);\n                                ec = sibling;\n                            }\n                        }\n                    } else {\n                        if (eo > 0) {\n                            var endNode = ec.childNodes[eo - 1];\n                            if (endNode && isCharacterDataNode(endNode)) {\n                                mergeForward(endNode);\n                            }\n                        }\n                        normalizeStart = !this.collapsed;\n                    }\n\n                    if (normalizeStart) {\n                        if (isCharacterDataNode(sc)) {\n                            if (so == 0) {\n                                mergeBackward(sc);\n                            } else if (so == sc.length) {\n                                sibling = sc.nextSibling;\n                                if (sibling && sibling.nodeType == sc.nodeType) {\n                                    if (ec == sibling) {\n                                        ec = sc;\n                                        eo += sc.length;\n                                    }\n                                    sc.appendData(sibling.data);\n                                    removeNode(sibling);\n                                }\n                            }\n                        } else {\n                            if (so < sc.childNodes.length) {\n                                var startNode = sc.childNodes[so];\n                                if (startNode && isCharacterDataNode(startNode)) {\n                                    mergeBackward(startNode);\n                                }\n                            }\n                        }\n                    } else {\n                        sc = ec;\n                        so = eo;\n                    }\n\n                    boundaryUpdater(this, sc, so, ec, eo);\n                },\n\n                collapseToPoint: function(node, offset) {\n                    assertNoDocTypeNotationEntityAncestor(node, true);\n                    assertValidOffset(node, offset);\n                    this.setStartAndEnd(node, offset);\n                },\n\n                parentElement: function() {\n                    assertRangeValid(this);\n                    var parentNode = this.commonAncestorContainer;\n                    return parentNode ? getElementAncestor(this.commonAncestorContainer, true) : null;\n                }\n            });\n\n            copyComparisonConstants(constructor);\n        }\n\n        /*----------------------------------------------------------------------------------------------------------------*/\n\n        // Updates commonAncestorContainer and collapsed after boundary change\n        function updateCollapsedAndCommonAncestor(range) {\n            range.collapsed = (range.startContainer === range.endContainer && range.startOffset === range.endOffset);\n            range.commonAncestorContainer = range.collapsed ?\n                range.startContainer : dom.getCommonAncestor(range.startContainer, range.endContainer);\n        }\n\n        function updateBoundaries(range, startContainer, startOffset, endContainer, endOffset) {\n            range.startContainer = startContainer;\n            range.startOffset = startOffset;\n            range.endContainer = endContainer;\n            range.endOffset = endOffset;\n            range.document = dom.getDocument(startContainer);\n            updateCollapsedAndCommonAncestor(range);\n        }\n\n        function Range(doc) {\n            updateBoundaries(this, doc, 0, doc, 0);\n        }\n\n        createPrototypeRange(Range, updateBoundaries);\n\n        util.extend(Range, {\n            rangeProperties: rangeProperties,\n            RangeIterator: RangeIterator,\n            copyComparisonConstants: copyComparisonConstants,\n            createPrototypeRange: createPrototypeRange,\n            inspect: inspect,\n            toHtml: rangeToHtml,\n            getRangeDocument: getRangeDocument,\n            rangesEqual: function(r1, r2) {\n                return r1.startContainer === r2.startContainer &&\n                    r1.startOffset === r2.startOffset &&\n                    r1.endContainer === r2.endContainer &&\n                    r1.endOffset === r2.endOffset;\n            }\n        });\n\n        api.DomRange = Range;\n    });\n\n    /*----------------------------------------------------------------------------------------------------------------*/\n\n    // Wrappers for the browser's native DOM Range and/or TextRange implementation\n    api.createCoreModule(\"WrappedRange\", [\"DomRange\"], function(api, module) {\n        var WrappedRange, WrappedTextRange;\n        var dom = api.dom;\n        var util = api.util;\n        var DomPosition = dom.DomPosition;\n        var DomRange = api.DomRange;\n        var getBody = dom.getBody;\n        var getContentDocument = dom.getContentDocument;\n        var isCharacterDataNode = dom.isCharacterDataNode;\n\n\n        /*----------------------------------------------------------------------------------------------------------------*/\n\n        if (api.features.implementsDomRange) {\n            // This is a wrapper around the browser's native DOM Range. It has two aims:\n            // - Provide workarounds for specific browser bugs\n            // - provide convenient extensions, which are inherited from Rangy's DomRange\n\n            (function() {\n                var rangeProto;\n                var rangeProperties = DomRange.rangeProperties;\n\n                function updateRangeProperties(range) {\n                    var i = rangeProperties.length, prop;\n                    while (i--) {\n                        prop = rangeProperties[i];\n                        range[prop] = range.nativeRange[prop];\n                    }\n                    // Fix for broken collapsed property in IE 9.\n                    range.collapsed = (range.startContainer === range.endContainer && range.startOffset === range.endOffset);\n                }\n\n                function updateNativeRange(range, startContainer, startOffset, endContainer, endOffset) {\n                    var startMoved = (range.startContainer !== startContainer || range.startOffset != startOffset);\n                    var endMoved = (range.endContainer !== endContainer || range.endOffset != endOffset);\n                    var nativeRangeDifferent = !range.equals(range.nativeRange);\n\n                    // Always set both boundaries for the benefit of IE9 (see issue 35)\n                    if (startMoved || endMoved || nativeRangeDifferent) {\n                        range.setEnd(endContainer, endOffset);\n                        range.setStart(startContainer, startOffset);\n                    }\n                }\n\n                var createBeforeAfterNodeSetter;\n\n                WrappedRange = function(range) {\n                    if (!range) {\n                        throw module.createError(\"WrappedRange: Range must be specified\");\n                    }\n                    this.nativeRange = range;\n                    updateRangeProperties(this);\n                };\n\n                DomRange.createPrototypeRange(WrappedRange, updateNativeRange);\n\n                rangeProto = WrappedRange.prototype;\n\n                rangeProto.selectNode = function(node) {\n                    this.nativeRange.selectNode(node);\n                    updateRangeProperties(this);\n                };\n\n                rangeProto.cloneContents = function() {\n                    return this.nativeRange.cloneContents();\n                };\n\n                // Due to a long-standing Firefox bug that I have not been able to find a reliable way to detect,\n                // insertNode() is never delegated to the native range.\n\n                rangeProto.surroundContents = function(node) {\n                    this.nativeRange.surroundContents(node);\n                    updateRangeProperties(this);\n                };\n\n                rangeProto.collapse = function(isStart) {\n                    this.nativeRange.collapse(isStart);\n                    updateRangeProperties(this);\n                };\n\n                rangeProto.cloneRange = function() {\n                    return new WrappedRange(this.nativeRange.cloneRange());\n                };\n\n                rangeProto.refresh = function() {\n                    updateRangeProperties(this);\n                };\n\n                rangeProto.toString = function() {\n                    return this.nativeRange.toString();\n                };\n\n                // Create test range and node for feature detection\n\n                var testTextNode = document.createTextNode(\"test\");\n                getBody(document).appendChild(testTextNode);\n                var range = document.createRange();\n\n                /*--------------------------------------------------------------------------------------------------------*/\n\n                // Test for Firefox 2 bug that prevents moving the start of a Range to a point after its current end and\n                // correct for it\n\n                range.setStart(testTextNode, 0);\n                range.setEnd(testTextNode, 0);\n\n                try {\n                    range.setStart(testTextNode, 1);\n\n                    rangeProto.setStart = function(node, offset) {\n                        this.nativeRange.setStart(node, offset);\n                        updateRangeProperties(this);\n                    };\n\n                    rangeProto.setEnd = function(node, offset) {\n                        this.nativeRange.setEnd(node, offset);\n                        updateRangeProperties(this);\n                    };\n\n                    createBeforeAfterNodeSetter = function(name) {\n                        return function(node) {\n                            this.nativeRange[name](node);\n                            updateRangeProperties(this);\n                        };\n                    };\n\n                } catch(ex) {\n\n                    rangeProto.setStart = function(node, offset) {\n                        try {\n                            this.nativeRange.setStart(node, offset);\n                        } catch (ex) {\n                            this.nativeRange.setEnd(node, offset);\n                            this.nativeRange.setStart(node, offset);\n                        }\n                        updateRangeProperties(this);\n                    };\n\n                    rangeProto.setEnd = function(node, offset) {\n                        try {\n                            this.nativeRange.setEnd(node, offset);\n                        } catch (ex) {\n                            this.nativeRange.setStart(node, offset);\n                            this.nativeRange.setEnd(node, offset);\n                        }\n                        updateRangeProperties(this);\n                    };\n\n                    createBeforeAfterNodeSetter = function(name, oppositeName) {\n                        return function(node) {\n                            try {\n                                this.nativeRange[name](node);\n                            } catch (ex) {\n                                this.nativeRange[oppositeName](node);\n                                this.nativeRange[name](node);\n                            }\n                            updateRangeProperties(this);\n                        };\n                    };\n                }\n\n                rangeProto.setStartBefore = createBeforeAfterNodeSetter(\"setStartBefore\", \"setEndBefore\");\n                rangeProto.setStartAfter = createBeforeAfterNodeSetter(\"setStartAfter\", \"setEndAfter\");\n                rangeProto.setEndBefore = createBeforeAfterNodeSetter(\"setEndBefore\", \"setStartBefore\");\n                rangeProto.setEndAfter = createBeforeAfterNodeSetter(\"setEndAfter\", \"setStartAfter\");\n\n                /*--------------------------------------------------------------------------------------------------------*/\n\n                // Always use DOM4-compliant selectNodeContents implementation: it's simpler and less code than testing\n                // whether the native implementation can be trusted\n                rangeProto.selectNodeContents = function(node) {\n                    this.setStartAndEnd(node, 0, dom.getNodeLength(node));\n                };\n\n                /*--------------------------------------------------------------------------------------------------------*/\n\n                // Test for and correct WebKit bug that has the behaviour of compareBoundaryPoints round the wrong way for\n                // constants START_TO_END and END_TO_START: https://bugs.webkit.org/show_bug.cgi?id=20738\n\n                range.selectNodeContents(testTextNode);\n                range.setEnd(testTextNode, 3);\n\n                var range2 = document.createRange();\n                range2.selectNodeContents(testTextNode);\n                range2.setEnd(testTextNode, 4);\n                range2.setStart(testTextNode, 2);\n\n                if (range.compareBoundaryPoints(range.START_TO_END, range2) == -1 &&\n                        range.compareBoundaryPoints(range.END_TO_START, range2) == 1) {\n                    // This is the wrong way round, so correct for it\n\n                    rangeProto.compareBoundaryPoints = function(type, range) {\n                        range = range.nativeRange || range;\n                        if (type == range.START_TO_END) {\n                            type = range.END_TO_START;\n                        } else if (type == range.END_TO_START) {\n                            type = range.START_TO_END;\n                        }\n                        return this.nativeRange.compareBoundaryPoints(type, range);\n                    };\n                } else {\n                    rangeProto.compareBoundaryPoints = function(type, range) {\n                        return this.nativeRange.compareBoundaryPoints(type, range.nativeRange || range);\n                    };\n                }\n\n                /*--------------------------------------------------------------------------------------------------------*/\n\n                // Test for IE deleteContents() and extractContents() bug and correct it. See issue 107.\n\n                var el = document.createElement(\"div\");\n                el.innerHTML = \"123\";\n                var textNode = el.firstChild;\n                var body = getBody(document);\n                body.appendChild(el);\n\n                range.setStart(textNode, 1);\n                range.setEnd(textNode, 2);\n                range.deleteContents();\n\n                if (textNode.data == \"13\") {\n                    // Behaviour is correct per DOM4 Range so wrap the browser's implementation of deleteContents() and\n                    // extractContents()\n                    rangeProto.deleteContents = function() {\n                        this.nativeRange.deleteContents();\n                        updateRangeProperties(this);\n                    };\n\n                    rangeProto.extractContents = function() {\n                        var frag = this.nativeRange.extractContents();\n                        updateRangeProperties(this);\n                        return frag;\n                    };\n                } else {\n                }\n\n                body.removeChild(el);\n                body = null;\n\n                /*--------------------------------------------------------------------------------------------------------*/\n\n                // Test for existence of createContextualFragment and delegate to it if it exists\n                if (util.isHostMethod(range, \"createContextualFragment\")) {\n                    rangeProto.createContextualFragment = function(fragmentStr) {\n                        return this.nativeRange.createContextualFragment(fragmentStr);\n                    };\n                }\n\n                /*--------------------------------------------------------------------------------------------------------*/\n\n                // Clean up\n                getBody(document).removeChild(testTextNode);\n\n                rangeProto.getName = function() {\n                    return \"WrappedRange\";\n                };\n\n                api.WrappedRange = WrappedRange;\n\n                api.createNativeRange = function(doc) {\n                    doc = getContentDocument(doc, module, \"createNativeRange\");\n                    return doc.createRange();\n                };\n            })();\n        }\n\n        if (api.features.implementsTextRange) {\n            /*\n            This is a workaround for a bug where IE returns the wrong container element from the TextRange's parentElement()\n            method. For example, in the following (where pipes denote the selection boundaries):\n\n            <ul id=\"ul\"><li id=\"a\">| a </li><li id=\"b\"> b |</li></ul>\n\n            var range = document.selection.createRange();\n            alert(range.parentElement().id); // Should alert \"ul\" but alerts \"b\"\n\n            This method returns the common ancestor node of the following:\n            - the parentElement() of the textRange\n            - the parentElement() of the textRange after calling collapse(true)\n            - the parentElement() of the textRange after calling collapse(false)\n            */\n            var getTextRangeContainerElement = function(textRange) {\n                var parentEl = textRange.parentElement();\n                var range = textRange.duplicate();\n                range.collapse(true);\n                var startEl = range.parentElement();\n                range = textRange.duplicate();\n                range.collapse(false);\n                var endEl = range.parentElement();\n                var startEndContainer = (startEl == endEl) ? startEl : dom.getCommonAncestor(startEl, endEl);\n\n                return startEndContainer == parentEl ? startEndContainer : dom.getCommonAncestor(parentEl, startEndContainer);\n            };\n\n            var textRangeIsCollapsed = function(textRange) {\n                return textRange.compareEndPoints(\"StartToEnd\", textRange) == 0;\n            };\n\n            // Gets the boundary of a TextRange expressed as a node and an offset within that node. This function started\n            // out as an improved version of code found in Tim Cameron Ryan's IERange (http://code.google.com/p/ierange/)\n            // but has grown, fixing problems with line breaks in preformatted text, adding workaround for IE TextRange\n            // bugs, handling for inputs and images, plus optimizations.\n            var getTextRangeBoundaryPosition = function(textRange, wholeRangeContainerElement, isStart, isCollapsed, startInfo) {\n                var workingRange = textRange.duplicate();\n                workingRange.collapse(isStart);\n                var containerElement = workingRange.parentElement();\n\n                // Sometimes collapsing a TextRange that's at the start of a text node can move it into the previous node, so\n                // check for that\n                if (!dom.isOrIsAncestorOf(wholeRangeContainerElement, containerElement)) {\n                    containerElement = wholeRangeContainerElement;\n                }\n\n\n                // Deal with nodes that cannot \"contain rich HTML markup\". In practice, this means form inputs, images and\n                // similar. See http://msdn.microsoft.com/en-us/library/aa703950%28VS.85%29.aspx\n                if (!containerElement.canHaveHTML) {\n                    var pos = new DomPosition(containerElement.parentNode, dom.getNodeIndex(containerElement));\n                    return {\n                        boundaryPosition: pos,\n                        nodeInfo: {\n                            nodeIndex: pos.offset,\n                            containerElement: pos.node\n                        }\n                    };\n                }\n\n                var workingNode = dom.getDocument(containerElement).createElement(\"span\");\n\n                // Workaround for HTML5 Shiv's insane violation of document.createElement(). See Rangy issue 104 and HTML5\n                // Shiv issue 64: https://github.com/aFarkas/html5shiv/issues/64\n                if (workingNode.parentNode) {\n                    dom.removeNode(workingNode);\n                }\n\n                var comparison, workingComparisonType = isStart ? \"StartToStart\" : \"StartToEnd\";\n                var previousNode, nextNode, boundaryPosition, boundaryNode;\n                var start = (startInfo && startInfo.containerElement == containerElement) ? startInfo.nodeIndex : 0;\n                var childNodeCount = containerElement.childNodes.length;\n                var end = childNodeCount;\n\n                // Check end first. Code within the loop assumes that the endth child node of the container is definitely\n                // after the range boundary.\n                var nodeIndex = end;\n\n                while (true) {\n                    if (nodeIndex == childNodeCount) {\n                        containerElement.appendChild(workingNode);\n                    } else {\n                        containerElement.insertBefore(workingNode, containerElement.childNodes[nodeIndex]);\n                    }\n                    workingRange.moveToElementText(workingNode);\n                    comparison = workingRange.compareEndPoints(workingComparisonType, textRange);\n                    if (comparison == 0 || start == end) {\n                        break;\n                    } else if (comparison == -1) {\n                        if (end == start + 1) {\n                            // We know the endth child node is after the range boundary, so we must be done.\n                            break;\n                        } else {\n                            start = nodeIndex;\n                        }\n                    } else {\n                        end = (end == start + 1) ? start : nodeIndex;\n                    }\n                    nodeIndex = Math.floor((start + end) / 2);\n                    containerElement.removeChild(workingNode);\n                }\n\n\n                // We've now reached or gone past the boundary of the text range we're interested in\n                // so have identified the node we want\n                boundaryNode = workingNode.nextSibling;\n\n                if (comparison == -1 && boundaryNode && isCharacterDataNode(boundaryNode)) {\n                    // This is a character data node (text, comment, cdata). The working range is collapsed at the start of\n                    // the node containing the text range's boundary, so we move the end of the working range to the\n                    // boundary point and measure the length of its text to get the boundary's offset within the node.\n                    workingRange.setEndPoint(isStart ? \"EndToStart\" : \"EndToEnd\", textRange);\n\n                    var offset;\n\n                    if (/[\\r\\n]/.test(boundaryNode.data)) {\n                        /*\n                        For the particular case of a boundary within a text node containing rendered line breaks (within a\n                        <pre> element, for example), we need a slightly complicated approach to get the boundary's offset in\n                        IE. The facts:\n\n                        - Each line break is represented as \\r in the text node's data/nodeValue properties\n                        - Each line break is represented as \\r\\n in the TextRange's 'text' property\n                        - The 'text' property of the TextRange does not contain trailing line breaks\n\n                        To get round the problem presented by the final fact above, we can use the fact that TextRange's\n                        moveStart() and moveEnd() methods return the actual number of characters moved, which is not\n                        necessarily the same as the number of characters it was instructed to move. The simplest approach is\n                        to use this to store the characters moved when moving both the start and end of the range to the\n                        start of the document body and subtracting the start offset from the end offset (the\n                        \"move-negative-gazillion\" method). However, this is extremely slow when the document is large and\n                        the range is near the end of it. Clearly doing the mirror image (i.e. moving the range boundaries to\n                        the end of the document) has the same problem.\n\n                        Another approach that works is to use moveStart() to move the start boundary of the range up to the\n                        end boundary one character at a time and incrementing a counter with the value returned by the\n                        moveStart() call. However, the check for whether the start boundary has reached the end boundary is\n                        expensive, so this method is slow (although unlike \"move-negative-gazillion\" is largely unaffected\n                        by the location of the range within the document).\n\n                        The approach used below is a hybrid of the two methods above. It uses the fact that a string\n                        containing the TextRange's 'text' property with each \\r\\n converted to a single \\r character cannot\n                        be longer than the text of the TextRange, so the start of the range is moved that length initially\n                        and then a character at a time to make up for any trailing line breaks not contained in the 'text'\n                        property. This has good performance in most situations compared to the previous two methods.\n                        */\n                        var tempRange = workingRange.duplicate();\n                        var rangeLength = tempRange.text.replace(/\\r\\n/g, \"\\r\").length;\n\n                        offset = tempRange.moveStart(\"character\", rangeLength);\n                        while ( (comparison = tempRange.compareEndPoints(\"StartToEnd\", tempRange)) == -1) {\n                            offset++;\n                            tempRange.moveStart(\"character\", 1);\n                        }\n                    } else {\n                        offset = workingRange.text.length;\n                    }\n                    boundaryPosition = new DomPosition(boundaryNode, offset);\n                } else {\n\n                    // If the boundary immediately follows a character data node and this is the end boundary, we should favour\n                    // a position within that, and likewise for a start boundary preceding a character data node\n                    previousNode = (isCollapsed || !isStart) && workingNode.previousSibling;\n                    nextNode = (isCollapsed || isStart) && workingNode.nextSibling;\n                    if (nextNode && isCharacterDataNode(nextNode)) {\n                        boundaryPosition = new DomPosition(nextNode, 0);\n                    } else if (previousNode && isCharacterDataNode(previousNode)) {\n                        boundaryPosition = new DomPosition(previousNode, previousNode.data.length);\n                    } else {\n                        boundaryPosition = new DomPosition(containerElement, dom.getNodeIndex(workingNode));\n                    }\n                }\n\n                // Clean up\n                dom.removeNode(workingNode);\n\n                return {\n                    boundaryPosition: boundaryPosition,\n                    nodeInfo: {\n                        nodeIndex: nodeIndex,\n                        containerElement: containerElement\n                    }\n                };\n            };\n\n            // Returns a TextRange representing the boundary of a TextRange expressed as a node and an offset within that\n            // node. This function started out as an optimized version of code found in Tim Cameron Ryan's IERange\n            // (http://code.google.com/p/ierange/)\n            var createBoundaryTextRange = function(boundaryPosition, isStart) {\n                var boundaryNode, boundaryParent, boundaryOffset = boundaryPosition.offset;\n                var doc = dom.getDocument(boundaryPosition.node);\n                var workingNode, childNodes, workingRange = getBody(doc).createTextRange();\n                var nodeIsDataNode = isCharacterDataNode(boundaryPosition.node);\n\n                if (nodeIsDataNode) {\n                    boundaryNode = boundaryPosition.node;\n                    boundaryParent = boundaryNode.parentNode;\n                } else {\n                    childNodes = boundaryPosition.node.childNodes;\n                    boundaryNode = (boundaryOffset < childNodes.length) ? childNodes[boundaryOffset] : null;\n                    boundaryParent = boundaryPosition.node;\n                }\n\n                // Position the range immediately before the node containing the boundary\n                workingNode = doc.createElement(\"span\");\n\n                // Making the working element non-empty element persuades IE to consider the TextRange boundary to be within\n                // the element rather than immediately before or after it\n                workingNode.innerHTML = \"&#feff;\";\n\n                // insertBefore is supposed to work like appendChild if the second parameter is null. However, a bug report\n                // for IERange suggests that it can crash the browser: http://code.google.com/p/ierange/issues/detail?id=12\n                if (boundaryNode) {\n                    boundaryParent.insertBefore(workingNode, boundaryNode);\n                } else {\n                    boundaryParent.appendChild(workingNode);\n                }\n\n                workingRange.moveToElementText(workingNode);\n                workingRange.collapse(!isStart);\n\n                // Clean up\n                boundaryParent.removeChild(workingNode);\n\n                // Move the working range to the text offset, if required\n                if (nodeIsDataNode) {\n                    workingRange[isStart ? \"moveStart\" : \"moveEnd\"](\"character\", boundaryOffset);\n                }\n\n                return workingRange;\n            };\n\n            /*------------------------------------------------------------------------------------------------------------*/\n\n            // This is a wrapper around a TextRange, providing full DOM Range functionality using rangy's DomRange as a\n            // prototype\n\n            WrappedTextRange = function(textRange) {\n                this.textRange = textRange;\n                this.refresh();\n            };\n\n            WrappedTextRange.prototype = new DomRange(document);\n\n            WrappedTextRange.prototype.refresh = function() {\n                var start, end, startBoundary;\n\n                // TextRange's parentElement() method cannot be trusted. getTextRangeContainerElement() works around that.\n                var rangeContainerElement = getTextRangeContainerElement(this.textRange);\n\n                if (textRangeIsCollapsed(this.textRange)) {\n                    end = start = getTextRangeBoundaryPosition(this.textRange, rangeContainerElement, true,\n                        true).boundaryPosition;\n                } else {\n                    startBoundary = getTextRangeBoundaryPosition(this.textRange, rangeContainerElement, true, false);\n                    start = startBoundary.boundaryPosition;\n\n                    // An optimization used here is that if the start and end boundaries have the same parent element, the\n                    // search scope for the end boundary can be limited to exclude the portion of the element that precedes\n                    // the start boundary\n                    end = getTextRangeBoundaryPosition(this.textRange, rangeContainerElement, false, false,\n                        startBoundary.nodeInfo).boundaryPosition;\n                }\n\n                this.setStart(start.node, start.offset);\n                this.setEnd(end.node, end.offset);\n            };\n\n            WrappedTextRange.prototype.getName = function() {\n                return \"WrappedTextRange\";\n            };\n\n            DomRange.copyComparisonConstants(WrappedTextRange);\n\n            var rangeToTextRange = function(range) {\n                if (range.collapsed) {\n                    return createBoundaryTextRange(new DomPosition(range.startContainer, range.startOffset), true);\n                } else {\n                    var startRange = createBoundaryTextRange(new DomPosition(range.startContainer, range.startOffset), true);\n                    var endRange = createBoundaryTextRange(new DomPosition(range.endContainer, range.endOffset), false);\n                    var textRange = getBody( DomRange.getRangeDocument(range) ).createTextRange();\n                    textRange.setEndPoint(\"StartToStart\", startRange);\n                    textRange.setEndPoint(\"EndToEnd\", endRange);\n                    return textRange;\n                }\n            };\n\n            WrappedTextRange.rangeToTextRange = rangeToTextRange;\n\n            WrappedTextRange.prototype.toTextRange = function() {\n                return rangeToTextRange(this);\n            };\n\n            api.WrappedTextRange = WrappedTextRange;\n\n            // IE 9 and above have both implementations and Rangy makes both available. The next few lines sets which\n            // implementation to use by default.\n            if (!api.features.implementsDomRange || api.config.preferTextRange) {\n                // Add WrappedTextRange as the Range property of the global object to allow expression like Range.END_TO_END to work\n                var globalObj = (function(f) { return f(\"return this;\")(); })(Function);\n                if (typeof globalObj.Range == \"undefined\") {\n                    globalObj.Range = WrappedTextRange;\n                }\n\n                api.createNativeRange = function(doc) {\n                    doc = getContentDocument(doc, module, \"createNativeRange\");\n                    return getBody(doc).createTextRange();\n                };\n\n                api.WrappedRange = WrappedTextRange;\n            }\n        }\n\n        api.createRange = function(doc) {\n            doc = getContentDocument(doc, module, \"createRange\");\n            return new api.WrappedRange(api.createNativeRange(doc));\n        };\n\n        api.createRangyRange = function(doc) {\n            doc = getContentDocument(doc, module, \"createRangyRange\");\n            return new DomRange(doc);\n        };\n\n        util.createAliasForDeprecatedMethod(api, \"createIframeRange\", \"createRange\");\n        util.createAliasForDeprecatedMethod(api, \"createIframeRangyRange\", \"createRangyRange\");\n\n        api.addShimListener(function(win) {\n            var doc = win.document;\n            if (typeof doc.createRange == \"undefined\") {\n                doc.createRange = function() {\n                    return api.createRange(doc);\n                };\n            }\n            doc = win = null;\n        });\n    });\n\n    /*----------------------------------------------------------------------------------------------------------------*/\n\n    // This module creates a selection object wrapper that conforms as closely as possible to the Selection specification\n    // in the W3C Selection API spec (https://www.w3.org/TR/selection-api)\n    api.createCoreModule(\"WrappedSelection\", [\"DomRange\", \"WrappedRange\"], function(api, module) {\n        api.config.checkSelectionRanges = true;\n\n        var BOOLEAN = \"boolean\";\n        var NUMBER = \"number\";\n        var dom = api.dom;\n        var util = api.util;\n        var isHostMethod = util.isHostMethod;\n        var DomRange = api.DomRange;\n        var WrappedRange = api.WrappedRange;\n        var DOMException = api.DOMException;\n        var DomPosition = dom.DomPosition;\n        var getNativeSelection;\n        var selectionIsCollapsed;\n        var features = api.features;\n        var CONTROL = \"Control\";\n        var getDocument = dom.getDocument;\n        var getBody = dom.getBody;\n        var rangesEqual = DomRange.rangesEqual;\n\n\n        // Utility function to support direction parameters in the API that may be a string (\"backward\", \"backwards\",\n        // \"forward\" or \"forwards\") or a Boolean (true for backwards).\n        function isDirectionBackward(dir) {\n            return (typeof dir == \"string\") ? /^backward(s)?$/i.test(dir) : !!dir;\n        }\n\n        function getWindow(win, methodName) {\n            if (!win) {\n                return window;\n            } else if (dom.isWindow(win)) {\n                return win;\n            } else if (win instanceof WrappedSelection) {\n                return win.win;\n            } else {\n                var doc = dom.getContentDocument(win, module, methodName);\n                return dom.getWindow(doc);\n            }\n        }\n\n        function getWinSelection(winParam) {\n            return getWindow(winParam, \"getWinSelection\").getSelection();\n        }\n\n        function getDocSelection(winParam) {\n            return getWindow(winParam, \"getDocSelection\").document.selection;\n        }\n\n        function winSelectionIsBackward(sel) {\n            var backward = false;\n            if (sel.anchorNode) {\n                backward = (dom.comparePoints(sel.anchorNode, sel.anchorOffset, sel.focusNode, sel.focusOffset) == 1);\n            }\n            return backward;\n        }\n\n        // Test for the Range/TextRange and Selection features required\n        // Test for ability to retrieve selection\n        var implementsWinGetSelection = isHostMethod(window, \"getSelection\"),\n            implementsDocSelection = util.isHostObject(document, \"selection\");\n\n        features.implementsWinGetSelection = implementsWinGetSelection;\n        features.implementsDocSelection = implementsDocSelection;\n\n        var useDocumentSelection = implementsDocSelection && (!implementsWinGetSelection || api.config.preferTextRange);\n\n        if (useDocumentSelection) {\n            getNativeSelection = getDocSelection;\n            api.isSelectionValid = function(winParam) {\n                var doc = getWindow(winParam, \"isSelectionValid\").document, nativeSel = doc.selection;\n\n                // Check whether the selection TextRange is actually contained within the correct document\n                return (nativeSel.type != \"None\" || getDocument(nativeSel.createRange().parentElement()) == doc);\n            };\n        } else if (implementsWinGetSelection) {\n            getNativeSelection = getWinSelection;\n            api.isSelectionValid = function() {\n                return true;\n            };\n        } else {\n            module.fail(\"Neither document.selection or window.getSelection() detected.\");\n            return false;\n        }\n\n        api.getNativeSelection = getNativeSelection;\n\n        var testSelection = getNativeSelection();\n\n        // In Firefox, the selection is null in an iframe with display: none. See issue #138.\n        if (!testSelection) {\n            module.fail(\"Native selection was null (possibly issue 138?)\");\n            return false;\n        }\n\n        var testRange = api.createNativeRange(document);\n        var body = getBody(document);\n\n        // Obtaining a range from a selection\n        var selectionHasAnchorAndFocus = util.areHostProperties(testSelection,\n            [\"anchorNode\", \"focusNode\", \"anchorOffset\", \"focusOffset\"]);\n\n        features.selectionHasAnchorAndFocus = selectionHasAnchorAndFocus;\n\n        // Test for existence of native selection extend() method\n        var selectionHasExtend = isHostMethod(testSelection, \"extend\");\n        features.selectionHasExtend = selectionHasExtend;\n\n        // Test for existence of native selection setBaseAndExtent() method\n        var selectionHasSetBaseAndExtent = isHostMethod(testSelection, \"setBaseAndExtent\");\n        features.selectionHasSetBaseAndExtent = selectionHasSetBaseAndExtent;\n\n        // Test if rangeCount exists\n        var selectionHasRangeCount = (typeof testSelection.rangeCount == NUMBER);\n        features.selectionHasRangeCount = selectionHasRangeCount;\n\n        var selectionSupportsMultipleRanges = false;\n        var collapsedNonEditableSelectionsSupported = true;\n\n        var addRangeBackwardToNative = selectionHasExtend ?\n            function(nativeSelection, range) {\n                var doc = DomRange.getRangeDocument(range);\n                var endRange = api.createRange(doc);\n                endRange.collapseToPoint(range.endContainer, range.endOffset);\n                nativeSelection.addRange(getNativeRange(endRange));\n                nativeSelection.extend(range.startContainer, range.startOffset);\n            } : null;\n\n        if (util.areHostMethods(testSelection, [\"addRange\", \"getRangeAt\", \"removeAllRanges\"]) &&\n                typeof testSelection.rangeCount == NUMBER && features.implementsDomRange) {\n\n            (function() {\n                // Previously an iframe was used but this caused problems in some circumstances in IE, so tests are\n                // performed on the current document's selection. See issue 109.\n\n                // Note also that if a selection previously existed, it is wiped and later restored by these tests. This\n                // will result in the selection direction being reversed if the original selection was backwards and the\n                // browser does not support setting backwards selections (Internet Explorer, I'm looking at you).\n                var sel = window.getSelection();\n                if (sel) {\n                    // Store the current selection\n                    var originalSelectionRangeCount = sel.rangeCount;\n                    var selectionHasMultipleRanges = (originalSelectionRangeCount > 1);\n                    var originalSelectionRanges = [];\n                    var originalSelectionBackward = winSelectionIsBackward(sel);\n                    for (var i = 0; i < originalSelectionRangeCount; ++i) {\n                        originalSelectionRanges[i] = sel.getRangeAt(i);\n                    }\n\n                    // Create some test elements\n                    var testEl = dom.createTestElement(document, \"\", false);\n                    var textNode = testEl.appendChild( document.createTextNode(\"\\u00a0\\u00a0\\u00a0\") );\n\n                    // Test whether the native selection will allow a collapsed selection within a non-editable element\n                    var r1 = document.createRange();\n\n                    r1.setStart(textNode, 1);\n                    r1.collapse(true);\n                    sel.removeAllRanges();\n                    sel.addRange(r1);\n                    collapsedNonEditableSelectionsSupported = (sel.rangeCount == 1);\n                    sel.removeAllRanges();\n\n                    // Test whether the native selection is capable of supporting multiple ranges.\n                    if (!selectionHasMultipleRanges) {\n                        // Doing the original feature test here in Chrome 36 (and presumably later versions) prints a\n                        // console error of \"Discontiguous selection is not supported.\" that cannot be suppressed. There's\n                        // nothing we can do about this while retaining the feature test so we have to resort to a browser\n                        // sniff. I'm not happy about it. See\n                        // https://code.google.com/p/chromium/issues/detail?id=399791\n                        var chromeMatch = window.navigator.appVersion.match(/Chrome\\/(.*?) /);\n                        if (chromeMatch && parseInt(chromeMatch[1]) >= 36) {\n                            selectionSupportsMultipleRanges = false;\n                        } else {\n                            var r2 = r1.cloneRange();\n                            r1.setStart(textNode, 0);\n                            r2.setEnd(textNode, 3);\n                            r2.setStart(textNode, 2);\n                            sel.addRange(r1);\n                            sel.addRange(r2);\n                            selectionSupportsMultipleRanges = (sel.rangeCount == 2);\n                        }\n                    }\n\n                    // Clean up\n                    dom.removeNode(testEl);\n                    sel.removeAllRanges();\n\n                    for (i = 0; i < originalSelectionRangeCount; ++i) {\n                        if (i == 0 && originalSelectionBackward) {\n                            if (addRangeBackwardToNative) {\n                                addRangeBackwardToNative(sel, originalSelectionRanges[i]);\n                            } else {\n                                api.warn(\"Rangy initialization: original selection was backwards but selection has been restored forwards because the browser does not support Selection.extend\");\n                                sel.addRange(originalSelectionRanges[i]);\n                            }\n                        } else {\n                            sel.addRange(originalSelectionRanges[i]);\n                        }\n                    }\n                }\n            })();\n        }\n\n        features.selectionSupportsMultipleRanges = selectionSupportsMultipleRanges;\n        features.collapsedNonEditableSelectionsSupported = collapsedNonEditableSelectionsSupported;\n\n        // ControlRanges\n        var implementsControlRange = false, testControlRange;\n\n        if (body && isHostMethod(body, \"createControlRange\")) {\n            testControlRange = body.createControlRange();\n            if (util.areHostProperties(testControlRange, [\"item\", \"add\"])) {\n                implementsControlRange = true;\n            }\n        }\n        features.implementsControlRange = implementsControlRange;\n\n        // Selection collapsedness\n        if (selectionHasAnchorAndFocus) {\n            selectionIsCollapsed = function(sel) {\n                return sel.anchorNode === sel.focusNode && sel.anchorOffset === sel.focusOffset;\n            };\n        } else {\n            selectionIsCollapsed = function(sel) {\n                return sel.rangeCount ? sel.getRangeAt(sel.rangeCount - 1).collapsed : false;\n            };\n        }\n\n        function updateAnchorAndFocusFromRange(sel, range, backward) {\n            var anchorPrefix = backward ? \"end\" : \"start\", focusPrefix = backward ? \"start\" : \"end\";\n            sel.anchorNode = range[anchorPrefix + \"Container\"];\n            sel.anchorOffset = range[anchorPrefix + \"Offset\"];\n            sel.focusNode = range[focusPrefix + \"Container\"];\n            sel.focusOffset = range[focusPrefix + \"Offset\"];\n        }\n\n        function updateAnchorAndFocusFromNativeSelection(sel) {\n            var nativeSel = sel.nativeSelection;\n            sel.anchorNode = nativeSel.anchorNode;\n            sel.anchorOffset = nativeSel.anchorOffset;\n            sel.focusNode = nativeSel.focusNode;\n            sel.focusOffset = nativeSel.focusOffset;\n        }\n\n        function updateEmptySelection(sel) {\n            sel.anchorNode = sel.focusNode = null;\n            sel.anchorOffset = sel.focusOffset = 0;\n            sel.rangeCount = 0;\n            sel.isCollapsed = true;\n            sel._ranges.length = 0;\n            updateType(sel);\n        }\n\n        function updateType(sel) {\n            sel.type = (sel.rangeCount == 0) ? \"None\" : (selectionIsCollapsed(sel) ? \"Caret\" : \"Range\");\n        }\n\n        function getNativeRange(range) {\n            var nativeRange;\n            if (range instanceof DomRange) {\n                nativeRange = api.createNativeRange(range.getDocument());\n                nativeRange.setEnd(range.endContainer, range.endOffset);\n                nativeRange.setStart(range.startContainer, range.startOffset);\n            } else if (range instanceof WrappedRange) {\n                nativeRange = range.nativeRange;\n            } else if (features.implementsDomRange && (range instanceof dom.getWindow(range.startContainer).Range)) {\n                nativeRange = range;\n            }\n            return nativeRange;\n        }\n\n        function rangeContainsSingleElement(rangeNodes) {\n            if (!rangeNodes.length || rangeNodes[0].nodeType != 1) {\n                return false;\n            }\n            for (var i = 1, len = rangeNodes.length; i < len; ++i) {\n                if (!dom.isAncestorOf(rangeNodes[0], rangeNodes[i])) {\n                    return false;\n                }\n            }\n            return true;\n        }\n\n        function getSingleElementFromRange(range) {\n            var nodes = range.getNodes();\n            if (!rangeContainsSingleElement(nodes)) {\n                throw module.createError(\"getSingleElementFromRange: range \" + range.inspect() + \" did not consist of a single element\");\n            }\n            return nodes[0];\n        }\n\n        // Simple, quick test which only needs to distinguish between a TextRange and a ControlRange\n        function isTextRange(range) {\n            return !!range && typeof range.text != \"undefined\";\n        }\n\n        function updateFromTextRange(sel, range) {\n            // Create a Range from the selected TextRange\n            var wrappedRange = new WrappedRange(range);\n            sel._ranges = [wrappedRange];\n\n            updateAnchorAndFocusFromRange(sel, wrappedRange, false);\n            sel.rangeCount = 1;\n            sel.isCollapsed = wrappedRange.collapsed;\n            updateType(sel);\n        }\n\n        function updateControlSelection(sel) {\n            // Update the wrapped selection based on what's now in the native selection\n            sel._ranges.length = 0;\n            if (sel.docSelection.type == \"None\") {\n                updateEmptySelection(sel);\n            } else {\n                var controlRange = sel.docSelection.createRange();\n                if (isTextRange(controlRange)) {\n                    // This case (where the selection type is \"Control\" and calling createRange() on the selection returns\n                    // a TextRange) can happen in IE 9. It happens, for example, when all elements in the selected\n                    // ControlRange have been removed from the ControlRange and removed from the document.\n                    updateFromTextRange(sel, controlRange);\n                } else {\n                    sel.rangeCount = controlRange.length;\n                    var range, doc = getDocument(controlRange.item(0));\n                    for (var i = 0; i < sel.rangeCount; ++i) {\n                        range = api.createRange(doc);\n                        range.selectNode(controlRange.item(i));\n                        sel._ranges.push(range);\n                    }\n                    sel.isCollapsed = sel.rangeCount == 1 && sel._ranges[0].collapsed;\n                    updateAnchorAndFocusFromRange(sel, sel._ranges[sel.rangeCount - 1], false);\n                    updateType(sel);\n                }\n            }\n        }\n\n        function addRangeToControlSelection(sel, range) {\n            var controlRange = sel.docSelection.createRange();\n            var rangeElement = getSingleElementFromRange(range);\n\n            // Create a new ControlRange containing all the elements in the selected ControlRange plus the element\n            // contained by the supplied range\n            var doc = getDocument(controlRange.item(0));\n            var newControlRange = getBody(doc).createControlRange();\n            for (var i = 0, len = controlRange.length; i < len; ++i) {\n                newControlRange.add(controlRange.item(i));\n            }\n            try {\n                newControlRange.add(rangeElement);\n            } catch (ex) {\n                throw module.createError(\"addRange(): Element within the specified Range could not be added to control selection (does it have layout?)\");\n            }\n            newControlRange.select();\n\n            // Update the wrapped selection based on what's now in the native selection\n            updateControlSelection(sel);\n        }\n\n        var getSelectionRangeAt;\n\n        if (isHostMethod(testSelection, \"getRangeAt\")) {\n            // try/catch is present because getRangeAt() must have thrown an error in some browser and some situation.\n            // Unfortunately, I didn't write a comment about the specifics and am now scared to take it out. Let that be a\n            // lesson to us all, especially me.\n            getSelectionRangeAt = function(sel, index) {\n                try {\n                    return sel.getRangeAt(index);\n                } catch (ex) {\n                    return null;\n                }\n            };\n        } else if (selectionHasAnchorAndFocus) {\n            getSelectionRangeAt = function(sel) {\n                var doc = getDocument(sel.anchorNode);\n                var range = api.createRange(doc);\n                range.setStartAndEnd(sel.anchorNode, sel.anchorOffset, sel.focusNode, sel.focusOffset);\n\n                // Handle the case when the selection was selected backwards (from the end to the start in the\n                // document)\n                if (range.collapsed !== this.isCollapsed) {\n                    range.setStartAndEnd(sel.focusNode, sel.focusOffset, sel.anchorNode, sel.anchorOffset);\n                }\n\n                return range;\n            };\n        }\n\n        function WrappedSelection(selection, docSelection, win) {\n            this.nativeSelection = selection;\n            this.docSelection = docSelection;\n            this._ranges = [];\n            this.win = win;\n            this.refresh();\n        }\n\n        WrappedSelection.prototype = api.selectionPrototype;\n\n        function deleteProperties(sel) {\n            sel.win = sel.anchorNode = sel.focusNode = sel._ranges = null;\n            sel.rangeCount = sel.anchorOffset = sel.focusOffset = 0;\n            sel.detached = true;\n            updateType(sel);\n        }\n\n        var cachedRangySelections = [];\n\n        function actOnCachedSelection(win, action) {\n            var i = cachedRangySelections.length, cached, sel;\n            while (i--) {\n                cached = cachedRangySelections[i];\n                sel = cached.selection;\n                if (action == \"deleteAll\") {\n                    deleteProperties(sel);\n                } else if (cached.win == win) {\n                    if (action == \"delete\") {\n                        cachedRangySelections.splice(i, 1);\n                        return true;\n                    } else {\n                        return sel;\n                    }\n                }\n            }\n            if (action == \"deleteAll\") {\n                cachedRangySelections.length = 0;\n            }\n            return null;\n        }\n\n        var getSelection = function(win) {\n            // Check if the parameter is a Rangy Selection object\n            if (win && win instanceof WrappedSelection) {\n                win.refresh();\n                return win;\n            }\n\n            win = getWindow(win, \"getNativeSelection\");\n\n            var sel = actOnCachedSelection(win);\n            var nativeSel = getNativeSelection(win), docSel = implementsDocSelection ? getDocSelection(win) : null;\n            if (sel) {\n                sel.nativeSelection = nativeSel;\n                sel.docSelection = docSel;\n                sel.refresh();\n            } else {\n                sel = new WrappedSelection(nativeSel, docSel, win);\n                cachedRangySelections.push( { win: win, selection: sel } );\n            }\n            return sel;\n        };\n\n        api.getSelection = getSelection;\n\n        util.createAliasForDeprecatedMethod(api, \"getIframeSelection\", \"getSelection\");\n\n        var selProto = WrappedSelection.prototype;\n\n        function createControlSelection(sel, ranges) {\n            // Ensure that the selection becomes of type \"Control\"\n            var doc = getDocument(ranges[0].startContainer);\n            var controlRange = getBody(doc).createControlRange();\n            for (var i = 0, el, len = ranges.length; i < len; ++i) {\n                el = getSingleElementFromRange(ranges[i]);\n                try {\n                    controlRange.add(el);\n                } catch (ex) {\n                    throw module.createError(\"setRanges(): Element within one of the specified Ranges could not be added to control selection (does it have layout?)\");\n                }\n            }\n            controlRange.select();\n\n            // Update the wrapped selection based on what's now in the native selection\n            updateControlSelection(sel);\n        }\n\n        // Selecting a range\n        if (!useDocumentSelection && selectionHasAnchorAndFocus && util.areHostMethods(testSelection, [\"removeAllRanges\", \"addRange\"])) {\n            selProto.removeAllRanges = function() {\n                this.nativeSelection.removeAllRanges();\n                updateEmptySelection(this);\n            };\n\n            var addRangeBackward = function(sel, range) {\n                addRangeBackwardToNative(sel.nativeSelection, range);\n                sel.refresh();\n            };\n\n            if (selectionHasRangeCount) {\n                selProto.addRange = function(range, direction) {\n                    if (implementsControlRange && implementsDocSelection && this.docSelection.type == CONTROL) {\n                        addRangeToControlSelection(this, range);\n                    } else {\n                        if (isDirectionBackward(direction) && selectionHasExtend) {\n                            addRangeBackward(this, range);\n                        } else {\n                            var previousRangeCount;\n                            if (selectionSupportsMultipleRanges) {\n                                previousRangeCount = this.rangeCount;\n                            } else {\n                                this.removeAllRanges();\n                                previousRangeCount = 0;\n                            }\n                            // Clone the native range so that changing the selected range does not affect the selection.\n                            // This is contrary to the spec but is the only way to achieve consistency between browsers. See\n                            // issue 80.\n                            var clonedNativeRange = getNativeRange(range).cloneRange();\n                            try {\n                                this.nativeSelection.addRange(clonedNativeRange);\n                            } catch (ex) {\n                            }\n\n                            // Check whether adding the range was successful\n                            this.rangeCount = this.nativeSelection.rangeCount;\n\n                            if (this.rangeCount == previousRangeCount + 1) {\n                                // The range was added successfully\n\n                                // Check whether the range that we added to the selection is reflected in the last range extracted from\n                                // the selection\n                                if (api.config.checkSelectionRanges) {\n                                    var nativeRange = getSelectionRangeAt(this.nativeSelection, this.rangeCount - 1);\n                                    if (nativeRange && !rangesEqual(nativeRange, range)) {\n                                        // Happens in WebKit with, for example, a selection placed at the start of a text node\n                                        range = new WrappedRange(nativeRange);\n                                    }\n                                }\n                                this._ranges[this.rangeCount - 1] = range;\n                                updateAnchorAndFocusFromRange(this, range, selectionIsBackward(this.nativeSelection));\n                                this.isCollapsed = selectionIsCollapsed(this);\n                                updateType(this);\n                            } else {\n                                // The range was not added successfully. The simplest thing is to refresh\n                                this.refresh();\n                            }\n                        }\n                    }\n                };\n            } else {\n                selProto.addRange = function(range, direction) {\n                    if (isDirectionBackward(direction) && selectionHasExtend) {\n                        addRangeBackward(this, range);\n                    } else {\n                        this.nativeSelection.addRange(getNativeRange(range));\n                        this.refresh();\n                    }\n                };\n            }\n\n            selProto.setRanges = function(ranges) {\n                if (implementsControlRange && implementsDocSelection && ranges.length > 1) {\n                    createControlSelection(this, ranges);\n                } else {\n                    this.removeAllRanges();\n                    for (var i = 0, len = ranges.length; i < len; ++i) {\n                        this.addRange(ranges[i]);\n                    }\n                }\n            };\n        } else if (isHostMethod(testSelection, \"empty\") && isHostMethod(testRange, \"select\") &&\n                   implementsControlRange && useDocumentSelection) {\n\n            selProto.removeAllRanges = function() {\n                // Added try/catch as fix for issue #21\n                try {\n                    this.docSelection.empty();\n\n                    // Check for empty() not working (issue #24)\n                    if (this.docSelection.type != \"None\") {\n                        // Work around failure to empty a control selection by instead selecting a TextRange and then\n                        // calling empty()\n                        var doc;\n                        if (this.anchorNode) {\n                            doc = getDocument(this.anchorNode);\n                        } else if (this.docSelection.type == CONTROL) {\n                            var controlRange = this.docSelection.createRange();\n                            if (controlRange.length) {\n                                doc = getDocument( controlRange.item(0) );\n                            }\n                        }\n                        if (doc) {\n                            var textRange = getBody(doc).createTextRange();\n                            textRange.select();\n                            this.docSelection.empty();\n                        }\n                    }\n                } catch(ex) {}\n                updateEmptySelection(this);\n            };\n\n            selProto.addRange = function(range) {\n                if (this.docSelection.type == CONTROL) {\n                    addRangeToControlSelection(this, range);\n                } else {\n                    api.WrappedTextRange.rangeToTextRange(range).select();\n                    this._ranges[0] = range;\n                    this.rangeCount = 1;\n                    this.isCollapsed = this._ranges[0].collapsed;\n                    updateAnchorAndFocusFromRange(this, range, false);\n                    updateType(this);\n                }\n            };\n\n            selProto.setRanges = function(ranges) {\n                this.removeAllRanges();\n                var rangeCount = ranges.length;\n                if (rangeCount > 1) {\n                    createControlSelection(this, ranges);\n                } else if (rangeCount) {\n                    this.addRange(ranges[0]);\n                }\n            };\n        } else {\n            module.fail(\"No means of selecting a Range or TextRange was found\");\n            return false;\n        }\n\n        selProto.getRangeAt = function(index) {\n            if (index < 0 || index >= this.rangeCount) {\n                throw new DOMException(\"INDEX_SIZE_ERR\");\n            } else {\n                // Clone the range to preserve selection-range independence. See issue 80.\n                return this._ranges[index].cloneRange();\n            }\n        };\n\n        var refreshSelection;\n\n        if (useDocumentSelection) {\n            refreshSelection = function(sel) {\n                var range;\n                if (api.isSelectionValid(sel.win)) {\n                    range = sel.docSelection.createRange();\n                } else {\n                    range = getBody(sel.win.document).createTextRange();\n                    range.collapse(true);\n                }\n\n                if (sel.docSelection.type == CONTROL) {\n                    updateControlSelection(sel);\n                } else if (isTextRange(range)) {\n                    updateFromTextRange(sel, range);\n                } else {\n                    updateEmptySelection(sel);\n                }\n            };\n        } else if (isHostMethod(testSelection, \"getRangeAt\") && typeof testSelection.rangeCount == NUMBER) {\n            refreshSelection = function(sel) {\n                if (implementsControlRange && implementsDocSelection && sel.docSelection.type == CONTROL) {\n                    updateControlSelection(sel);\n                } else {\n                    sel._ranges.length = sel.rangeCount = sel.nativeSelection.rangeCount;\n                    if (sel.rangeCount) {\n                        for (var i = 0, len = sel.rangeCount; i < len; ++i) {\n                            sel._ranges[i] = new api.WrappedRange(sel.nativeSelection.getRangeAt(i));\n                        }\n                        updateAnchorAndFocusFromRange(sel, sel._ranges[sel.rangeCount - 1], selectionIsBackward(sel.nativeSelection));\n                        sel.isCollapsed = selectionIsCollapsed(sel);\n                        updateType(sel);\n                    } else {\n                        updateEmptySelection(sel);\n                    }\n                }\n            };\n        } else if (selectionHasAnchorAndFocus && typeof testSelection.isCollapsed == BOOLEAN && typeof testRange.collapsed == BOOLEAN && features.implementsDomRange) {\n            refreshSelection = function(sel) {\n                var range, nativeSel = sel.nativeSelection;\n                if (nativeSel.anchorNode) {\n                    range = getSelectionRangeAt(nativeSel, 0);\n                    sel._ranges = [range];\n                    sel.rangeCount = 1;\n                    updateAnchorAndFocusFromNativeSelection(sel);\n                    sel.isCollapsed = selectionIsCollapsed(sel);\n                    updateType(sel);\n                } else {\n                    updateEmptySelection(sel);\n                }\n            };\n        } else {\n            module.fail(\"No means of obtaining a Range or TextRange from the user's selection was found\");\n            return false;\n        }\n\n        selProto.refresh = function(checkForChanges) {\n            var oldRanges = checkForChanges ? this._ranges.slice(0) : null;\n            var oldAnchorNode = this.anchorNode, oldAnchorOffset = this.anchorOffset;\n\n            refreshSelection(this);\n            if (checkForChanges) {\n                // Check the range count first\n                var i = oldRanges.length;\n                if (i != this._ranges.length) {\n                    return true;\n                }\n\n                // Now check the direction. Checking the anchor position is the same is enough since we're checking all the\n                // ranges after this\n                if (this.anchorNode != oldAnchorNode || this.anchorOffset != oldAnchorOffset) {\n                    return true;\n                }\n\n                // Finally, compare each range in turn\n                while (i--) {\n                    if (!rangesEqual(oldRanges[i], this._ranges[i])) {\n                        return true;\n                    }\n                }\n                return false;\n            }\n        };\n\n        // Removal of a single range\n        var removeRangeManually = function(sel, range) {\n            var ranges = sel.getAllRanges();\n            sel.removeAllRanges();\n            for (var i = 0, len = ranges.length; i < len; ++i) {\n                if (!rangesEqual(range, ranges[i])) {\n                    sel.addRange(ranges[i]);\n                }\n            }\n            if (!sel.rangeCount) {\n                updateEmptySelection(sel);\n            }\n        };\n\n        if (implementsControlRange && implementsDocSelection) {\n            selProto.removeRange = function(range) {\n                if (this.docSelection.type == CONTROL) {\n                    var controlRange = this.docSelection.createRange();\n                    var rangeElement = getSingleElementFromRange(range);\n\n                    // Create a new ControlRange containing all the elements in the selected ControlRange minus the\n                    // element contained by the supplied range\n                    var doc = getDocument(controlRange.item(0));\n                    var newControlRange = getBody(doc).createControlRange();\n                    var el, removed = false;\n                    for (var i = 0, len = controlRange.length; i < len; ++i) {\n                        el = controlRange.item(i);\n                        if (el !== rangeElement || removed) {\n                            newControlRange.add(controlRange.item(i));\n                        } else {\n                            removed = true;\n                        }\n                    }\n                    newControlRange.select();\n\n                    // Update the wrapped selection based on what's now in the native selection\n                    updateControlSelection(this);\n                } else {\n                    removeRangeManually(this, range);\n                }\n            };\n        } else {\n            selProto.removeRange = function(range) {\n                removeRangeManually(this, range);\n            };\n        }\n\n        // Detecting if a selection is backward\n        var selectionIsBackward;\n        if (!useDocumentSelection && selectionHasAnchorAndFocus && features.implementsDomRange) {\n            selectionIsBackward = winSelectionIsBackward;\n\n            selProto.isBackward = function() {\n                return selectionIsBackward(this);\n            };\n        } else {\n            selectionIsBackward = selProto.isBackward = function() {\n                return false;\n            };\n        }\n\n        // Create an alias for backwards compatibility. From 1.3, everything is \"backward\" rather than \"backwards\"\n        selProto.isBackwards = selProto.isBackward;\n\n        // Selection stringifier\n        // This is conformant to the old HTML5 selections draft spec but differs from WebKit and Mozilla's implementation.\n        // The current spec does not yet define this method.\n        selProto.toString = function() {\n            var rangeTexts = [];\n            for (var i = 0, len = this.rangeCount; i < len; ++i) {\n                rangeTexts[i] = \"\" + this._ranges[i];\n            }\n            return rangeTexts.join(\"\");\n        };\n\n        function assertNodeInSameDocument(sel, node) {\n            if (sel.win.document != getDocument(node)) {\n                throw new DOMException(\"WRONG_DOCUMENT_ERR\");\n            }\n        }\n\n        function assertValidOffset(node, offset) {\n            if (offset < 0 || offset > (dom.isCharacterDataNode(node) ? node.length : node.childNodes.length)) {\n                throw new DOMException(\"INDEX_SIZE_ERR\");\n            }\n        }\n\n        // No current browser conforms fully to the spec for this method, so Rangy's own method is always used\n        selProto.collapse = function(node, offset) {\n            assertNodeInSameDocument(this, node);\n            var range = api.createRange(node);\n            range.collapseToPoint(node, offset);\n            this.setSingleRange(range);\n            this.isCollapsed = true;\n        };\n\n        selProto.collapseToStart = function() {\n            if (this.rangeCount) {\n                var range = this._ranges[0];\n                this.collapse(range.startContainer, range.startOffset);\n            } else {\n                throw new DOMException(\"INVALID_STATE_ERR\");\n            }\n        };\n\n        selProto.collapseToEnd = function() {\n            if (this.rangeCount) {\n                var range = this._ranges[this.rangeCount - 1];\n                this.collapse(range.endContainer, range.endOffset);\n            } else {\n                throw new DOMException(\"INVALID_STATE_ERR\");\n            }\n        };\n\n        // The spec is very specific on how selectAllChildren should be implemented and not all browsers implement it as\n        // specified so the native implementation is never used by Rangy.\n        selProto.selectAllChildren = function(node) {\n            assertNodeInSameDocument(this, node);\n            var range = api.createRange(node);\n            range.selectNodeContents(node);\n            this.setSingleRange(range);\n        };\n\n        if (selectionHasSetBaseAndExtent) {\n            selProto.setBaseAndExtent = function(anchorNode, anchorOffset, focusNode, focusOffset) {\n                this.nativeSelection.setBaseAndExtent(anchorNode, anchorOffset, focusNode, focusOffset);\n                this.refresh();\n            };\n        } else if (selectionHasExtend) {\n            selProto.setBaseAndExtent = function(anchorNode, anchorOffset, focusNode, focusOffset) {\n                assertValidOffset(anchorNode, anchorOffset);\n                assertValidOffset(focusNode, focusOffset);\n                assertNodeInSameDocument(this, anchorNode);\n                assertNodeInSameDocument(this, focusNode);\n                var range = api.createRange(node);\n                var isBackwards = (dom.comparePoints(anchorNode, anchorOffset, focusNode, focusOffset) == -1);\n                if (isBackwards) {\n                    range.setStartAndEnd(focusNode, focusOffset, anchorNode, anchorOffset);\n                } else {\n                    range.setStartAndEnd(anchorNode, anchorOffset, focusNode, focusOffset);\n                }\n                this.setSingleRange(range, isBackwards);\n            };\n        }\n\n        selProto.deleteFromDocument = function() {\n            // Sepcial behaviour required for IE's control selections\n            if (implementsControlRange && implementsDocSelection && this.docSelection.type == CONTROL) {\n                var controlRange = this.docSelection.createRange();\n                var element;\n                while (controlRange.length) {\n                    element = controlRange.item(0);\n                    controlRange.remove(element);\n                    dom.removeNode(element);\n                }\n                this.refresh();\n            } else if (this.rangeCount) {\n                var ranges = this.getAllRanges();\n                if (ranges.length) {\n                    this.removeAllRanges();\n                    for (var i = 0, len = ranges.length; i < len; ++i) {\n                        ranges[i].deleteContents();\n                    }\n                    // The spec says nothing about what the selection should contain after calling deleteContents on each\n                    // range. Firefox moves the selection to where the final selected range was, so we emulate that\n                    this.addRange(ranges[len - 1]);\n                }\n            }\n        };\n\n        // The following are non-standard extensions\n        selProto.eachRange = function(func, returnValue) {\n            for (var i = 0, len = this._ranges.length; i < len; ++i) {\n                if ( func( this.getRangeAt(i) ) ) {\n                    return returnValue;\n                }\n            }\n        };\n\n        selProto.getAllRanges = function() {\n            var ranges = [];\n            this.eachRange(function(range) {\n                ranges.push(range);\n            });\n            return ranges;\n        };\n\n        selProto.setSingleRange = function(range, direction) {\n            this.removeAllRanges();\n            this.addRange(range, direction);\n        };\n\n        selProto.callMethodOnEachRange = function(methodName, params) {\n            var results = [];\n            this.eachRange( function(range) {\n                results.push( range[methodName].apply(range, params || []) );\n            } );\n            return results;\n        };\n\n        function createStartOrEndSetter(isStart) {\n            return function(node, offset) {\n                var range;\n                if (this.rangeCount) {\n                    range = this.getRangeAt(0);\n                    range[\"set\" + (isStart ? \"Start\" : \"End\")](node, offset);\n                } else {\n                    range = api.createRange(this.win.document);\n                    range.setStartAndEnd(node, offset);\n                }\n                this.setSingleRange(range, this.isBackward());\n            };\n        }\n\n        selProto.setStart = createStartOrEndSetter(true);\n        selProto.setEnd = createStartOrEndSetter(false);\n\n        // Add select() method to Range prototype. Any existing selection will be removed.\n        api.rangePrototype.select = function(direction) {\n            getSelection( this.getDocument() ).setSingleRange(this, direction);\n        };\n\n        selProto.changeEachRange = function(func) {\n            var ranges = [];\n            var backward = this.isBackward();\n\n            this.eachRange(function(range) {\n                func(range);\n                ranges.push(range);\n            });\n\n            this.removeAllRanges();\n            if (backward && ranges.length == 1) {\n                this.addRange(ranges[0], \"backward\");\n            } else {\n                this.setRanges(ranges);\n            }\n        };\n\n        selProto.containsNode = function(node, allowPartial) {\n            return this.eachRange( function(range) {\n                return range.containsNode(node, allowPartial);\n            }, true ) || false;\n        };\n\n        selProto.getBookmark = function(containerNode) {\n            return {\n                backward: this.isBackward(),\n                rangeBookmarks: this.callMethodOnEachRange(\"getBookmark\", [containerNode])\n            };\n        };\n\n        selProto.moveToBookmark = function(bookmark) {\n            var selRanges = [];\n            for (var i = 0, rangeBookmark, range; rangeBookmark = bookmark.rangeBookmarks[i++]; ) {\n                range = api.createRange(this.win);\n                range.moveToBookmark(rangeBookmark);\n                selRanges.push(range);\n            }\n            if (bookmark.backward) {\n                this.setSingleRange(selRanges[0], \"backward\");\n            } else {\n                this.setRanges(selRanges);\n            }\n        };\n\n        selProto.saveRanges = function() {\n            return {\n                backward: this.isBackward(),\n                ranges: this.callMethodOnEachRange(\"cloneRange\")\n            };\n        };\n\n        selProto.restoreRanges = function(selRanges) {\n            this.removeAllRanges();\n            for (var i = 0, range; range = selRanges.ranges[i]; ++i) {\n                this.addRange(range, (selRanges.backward && i == 0));\n            }\n        };\n\n        selProto.toHtml = function() {\n            var rangeHtmls = [];\n            this.eachRange(function(range) {\n                rangeHtmls.push( DomRange.toHtml(range) );\n            });\n            return rangeHtmls.join(\"\");\n        };\n\n        if (features.implementsTextRange) {\n            selProto.getNativeTextRange = function() {\n                var sel, textRange;\n                if ( (sel = this.docSelection) ) {\n                    var range = sel.createRange();\n                    if (isTextRange(range)) {\n                        return range;\n                    } else {\n                        throw module.createError(\"getNativeTextRange: selection is a control selection\");\n                    }\n                } else if (this.rangeCount > 0) {\n                    return api.WrappedTextRange.rangeToTextRange( this.getRangeAt(0) );\n                } else {\n                    throw module.createError(\"getNativeTextRange: selection contains no range\");\n                }\n            };\n        }\n\n        function inspect(sel) {\n            var rangeInspects = [];\n            var anchor = new DomPosition(sel.anchorNode, sel.anchorOffset);\n            var focus = new DomPosition(sel.focusNode, sel.focusOffset);\n            var name = (typeof sel.getName == \"function\") ? sel.getName() : \"Selection\";\n\n            if (typeof sel.rangeCount != \"undefined\") {\n                for (var i = 0, len = sel.rangeCount; i < len; ++i) {\n                    rangeInspects[i] = DomRange.inspect(sel.getRangeAt(i));\n                }\n            }\n            return \"[\" + name + \"(Ranges: \" + rangeInspects.join(\", \") +\n                    \")(anchor: \" + anchor.inspect() + \", focus: \" + focus.inspect() + \"]\";\n        }\n\n        selProto.getName = function() {\n            return \"WrappedSelection\";\n        };\n\n        selProto.inspect = function() {\n            return inspect(this);\n        };\n\n        selProto.detach = function() {\n            actOnCachedSelection(this.win, \"delete\");\n            deleteProperties(this);\n        };\n\n        WrappedSelection.detachAll = function() {\n            actOnCachedSelection(null, \"deleteAll\");\n        };\n\n        WrappedSelection.inspect = inspect;\n        WrappedSelection.isDirectionBackward = isDirectionBackward;\n\n        api.Selection = WrappedSelection;\n\n        api.selectionPrototype = selProto;\n\n        api.addShimListener(function(win) {\n            if (typeof win.getSelection == \"undefined\") {\n                win.getSelection = function() {\n                    return getSelection(win);\n                };\n            }\n            win = null;\n        });\n    });\n    \n\n    /*----------------------------------------------------------------------------------------------------------------*/\n\n    // Wait for document to load before initializing\n    var docReady = false;\n\n    var loadHandler = function(e) {\n        if (!docReady) {\n            docReady = true;\n            if (!api.initialized && api.config.autoInitialize) {\n                init();\n            }\n        }\n    };\n\n    if (isBrowser) {\n        // Test whether the document has already been loaded and initialize immediately if so\n        if (document.readyState == \"complete\") {\n            loadHandler();\n        } else {\n            if (isHostMethod(document, \"addEventListener\")) {\n                document.addEventListener(\"DOMContentLoaded\", loadHandler, false);\n            }\n\n            // Add a fallback in case the DOMContentLoaded event isn't supported\n            addListener(window, \"load\", loadHandler);\n        }\n    }\n\n    return api;\n}, this);\n/**\n * Class Applier module for Rangy.\n * Adds, removes and toggles classes on Ranges and Selections\n *\n * Part of Rangy, a cross-browser JavaScript range and selection library\n * https://github.com/timdown/rangy\n *\n * Depends on Rangy core.\n *\n * Copyright 2024, Tim Down\n * Licensed under the MIT license.\n * Version: 1.3.2\n * Build date: 2 November 2024\n */\n(function(factory, root) {\n    if (typeof define == \"function\" && define.amd) {\n        // AMD. Register as an anonymous module with a dependency on Rangy.\n        define([\"./rangy-core\"], factory);\n    } else if (typeof module != \"undefined\" && typeof exports == \"object\") {\n        // Node/CommonJS style\n        module.exports = factory( require(\"rangy\") );\n    } else {\n        // No AMD or CommonJS support so we use the rangy property of root (probably the global variable)\n        factory(root.rangy);\n    }\n})(function(rangy) {\n    rangy.createModule(\"ClassApplier\", [\"WrappedSelection\"], function(api, module) {\n        var dom = api.dom;\n        var DomPosition = dom.DomPosition;\n        var contains = dom.arrayContains;\n        var util = api.util;\n        var forEach = util.forEach;\n\n\n        var defaultTagName = \"span\";\n        var createElementNSSupported = util.isHostMethod(document, \"createElementNS\");\n\n        function each(obj, func) {\n            for (var i in obj) {\n                if (obj.hasOwnProperty(i)) {\n                    if (func(i, obj[i]) === false) {\n                        return false;\n                    }\n                }\n            }\n            return true;\n        }\n\n        function trim(str) {\n            return str.replace(/^\\s\\s*/, \"\").replace(/\\s\\s*$/, \"\");\n        }\n\n        function classNameContainsClass(fullClassName, className) {\n            return !!fullClassName && new RegExp(\"(?:^|\\\\s)\" + className + \"(?:\\\\s|$)\").test(fullClassName);\n        }\n\n        // Inefficient, inelegant nonsense for IE's svg element, which has no classList and non-HTML className implementation\n        function hasClass(el, className) {\n            if (typeof el.classList == \"object\") {\n                return el.classList.contains(className);\n            } else {\n                var classNameSupported = (typeof el.className == \"string\");\n                var elClass = classNameSupported ? el.className : el.getAttribute(\"class\");\n                return classNameContainsClass(elClass, className);\n            }\n        }\n\n        function addClass(el, className) {\n            if (typeof el.classList == \"object\") {\n                el.classList.add(className);\n            } else {\n                var classNameSupported = (typeof el.className == \"string\");\n                var elClass = classNameSupported ? el.className : el.getAttribute(\"class\");\n                if (elClass) {\n                    if (!classNameContainsClass(elClass, className)) {\n                        elClass += \" \" + className;\n                    }\n                } else {\n                    elClass = className;\n                }\n                if (classNameSupported) {\n                    el.className = elClass;\n                } else {\n                    el.setAttribute(\"class\", elClass);\n                }\n            }\n        }\n\n        var removeClass = (function() {\n            function replacer(matched, whiteSpaceBefore, whiteSpaceAfter) {\n                return (whiteSpaceBefore && whiteSpaceAfter) ? \" \" : \"\";\n            }\n\n            return function(el, className) {\n                if (typeof el.classList == \"object\") {\n                    el.classList.remove(className);\n                } else {\n                    var classNameSupported = (typeof el.className == \"string\");\n                    var elClass = classNameSupported ? el.className : el.getAttribute(\"class\");\n                    elClass = elClass.replace(new RegExp(\"(^|\\\\s)\" + className + \"(\\\\s|$)\"), replacer);\n                    if (classNameSupported) {\n                        el.className = elClass;\n                    } else {\n                        el.setAttribute(\"class\", elClass);\n                    }\n                }\n            };\n        })();\n\n        function getClass(el) {\n            var classNameSupported = (typeof el.className == \"string\");\n            return classNameSupported ? el.className : el.getAttribute(\"class\");\n        }\n\n        function sortClassName(className) {\n            return className && className.split(/\\s+/).sort().join(\" \");\n        }\n\n        function getSortedClassName(el) {\n            return sortClassName( getClass(el) );\n        }\n\n        function haveSameClasses(el1, el2) {\n            return getSortedClassName(el1) == getSortedClassName(el2);\n        }\n\n        function hasAllClasses(el, className) {\n            var classes = className.split(/\\s+/);\n            for (var i = 0, len = classes.length; i < len; ++i) {\n                if (!hasClass(el, trim(classes[i]))) {\n                    return false;\n                }\n            }\n            return true;\n        }\n\n        function canTextBeStyled(textNode) {\n            var parent = textNode.parentNode;\n            return (parent && parent.nodeType == 1 && !/^(textarea|style|script|select|iframe)$/i.test(parent.nodeName));\n        }\n\n        function movePosition(position, oldParent, oldIndex, newParent, newIndex) {\n            var posNode = position.node, posOffset = position.offset;\n            var newNode = posNode, newOffset = posOffset;\n\n            if (posNode == newParent && posOffset > newIndex) {\n                ++newOffset;\n            }\n\n            if (posNode == oldParent && (posOffset == oldIndex  || posOffset == oldIndex + 1)) {\n                newNode = newParent;\n                newOffset += newIndex - oldIndex;\n            }\n\n            if (posNode == oldParent && posOffset > oldIndex + 1) {\n                --newOffset;\n            }\n\n            position.node = newNode;\n            position.offset = newOffset;\n        }\n\n        function movePositionWhenRemovingNode(position, parentNode, index) {\n            if (position.node == parentNode && position.offset > index) {\n                --position.offset;\n            }\n        }\n\n        function movePreservingPositions(node, newParent, newIndex, positionsToPreserve) {\n            // For convenience, allow newIndex to be -1 to mean \"insert at the end\".\n            if (newIndex == -1) {\n                newIndex = newParent.childNodes.length;\n            }\n\n            var oldParent = node.parentNode;\n            var oldIndex = dom.getNodeIndex(node);\n\n            forEach(positionsToPreserve, function(position) {\n                movePosition(position, oldParent, oldIndex, newParent, newIndex);\n            });\n\n            // Now actually move the node.\n            if (newParent.childNodes.length == newIndex) {\n                newParent.appendChild(node);\n            } else {\n                newParent.insertBefore(node, newParent.childNodes[newIndex]);\n            }\n        }\n\n        function removePreservingPositions(node, positionsToPreserve) {\n\n            var oldParent = node.parentNode;\n            var oldIndex = dom.getNodeIndex(node);\n\n            forEach(positionsToPreserve, function(position) {\n                movePositionWhenRemovingNode(position, oldParent, oldIndex);\n            });\n\n            dom.removeNode(node);\n        }\n\n        function moveChildrenPreservingPositions(node, newParent, newIndex, removeNode, positionsToPreserve) {\n            var child, children = [];\n            while ( (child = node.firstChild) ) {\n                movePreservingPositions(child, newParent, newIndex++, positionsToPreserve);\n                children.push(child);\n            }\n            if (removeNode) {\n                removePreservingPositions(node, positionsToPreserve);\n            }\n            return children;\n        }\n\n        function replaceWithOwnChildrenPreservingPositions(element, positionsToPreserve) {\n            return moveChildrenPreservingPositions(element, element.parentNode, dom.getNodeIndex(element), true, positionsToPreserve);\n        }\n\n        function rangeSelectsAnyText(range, textNode) {\n            var textNodeRange = range.cloneRange();\n            textNodeRange.selectNodeContents(textNode);\n\n            var intersectionRange = textNodeRange.intersection(range);\n            var text = intersectionRange ? intersectionRange.toString() : \"\";\n\n            return text != \"\";\n        }\n\n        function getEffectiveTextNodes(range) {\n            var nodes = range.getNodes([3]);\n\n            // Optimization as per issue 145\n\n            // Remove non-intersecting text nodes from the start of the range\n            var start = 0, node;\n            while ( (node = nodes[start]) && !rangeSelectsAnyText(range, node) ) {\n                ++start;\n            }\n\n            // Remove non-intersecting text nodes from the start of the range\n            var end = nodes.length - 1;\n            while ( (node = nodes[end]) && !rangeSelectsAnyText(range, node) ) {\n                --end;\n            }\n\n            return nodes.slice(start, end + 1);\n        }\n\n        function elementsHaveSameNonClassAttributes(el1, el2) {\n            if (el1.attributes.length != el2.attributes.length) return false;\n            for (var i = 0, len = el1.attributes.length, attr1, attr2, name; i < len; ++i) {\n                attr1 = el1.attributes[i];\n                name = attr1.name;\n                if (name != \"class\") {\n                    attr2 = el2.attributes.getNamedItem(name);\n                    if ( (attr1 === null) != (attr2 === null) ) return false;\n                    if (attr1.specified != attr2.specified) return false;\n                    if (attr1.specified && attr1.nodeValue !== attr2.nodeValue) return false;\n                }\n            }\n            return true;\n        }\n\n        function elementHasNonClassAttributes(el, exceptions) {\n            for (var i = 0, len = el.attributes.length, attrName; i < len; ++i) {\n                attrName = el.attributes[i].name;\n                if ( !(exceptions && contains(exceptions, attrName)) && el.attributes[i].specified && attrName != \"class\") {\n                    return true;\n                }\n            }\n            return false;\n        }\n\n        var getComputedStyleProperty = dom.getComputedStyleProperty;\n        var isEditableElement = (function() {\n            var testEl = document.createElement(\"div\");\n            return typeof testEl.isContentEditable == \"boolean\" ?\n                function (node) {\n                    return node && node.nodeType == 1 && node.isContentEditable;\n                } :\n                function (node) {\n                    if (!node || node.nodeType != 1 || node.contentEditable == \"false\") {\n                        return false;\n                    }\n                    return node.contentEditable == \"true\" || isEditableElement(node.parentNode);\n                };\n        })();\n\n        function isEditingHost(node) {\n            var parent;\n            return node && node.nodeType == 1 &&\n                (( (parent = node.parentNode) && parent.nodeType == 9 && parent.designMode == \"on\") ||\n                (isEditableElement(node) && !isEditableElement(node.parentNode)));\n        }\n\n        function isEditable(node) {\n            return (isEditableElement(node) || (node.nodeType != 1 && isEditableElement(node.parentNode))) && !isEditingHost(node);\n        }\n\n        var inlineDisplayRegex = /^inline(-block|-table)?$/i;\n\n        function isNonInlineElement(node) {\n            return node && node.nodeType == 1 && !inlineDisplayRegex.test(getComputedStyleProperty(node, \"display\"));\n        }\n\n        // White space characters as defined by HTML 4 (http://www.w3.org/TR/html401/struct/text.html)\n        var htmlNonWhiteSpaceRegex = /[^\\r\\n\\t\\f \\u200B]/;\n\n        function isUnrenderedWhiteSpaceNode(node) {\n            if (node.data.length == 0) {\n                return true;\n            }\n            if (htmlNonWhiteSpaceRegex.test(node.data)) {\n                return false;\n            }\n            var cssWhiteSpace = getComputedStyleProperty(node.parentNode, \"whiteSpace\");\n            switch (cssWhiteSpace) {\n                case \"pre\":\n                case \"pre-wrap\":\n                case \"-moz-pre-wrap\":\n                    return false;\n                case \"pre-line\":\n                    if (/[\\r\\n]/.test(node.data)) {\n                        return false;\n                    }\n            }\n\n            // We now have a whitespace-only text node that may be rendered depending on its context. If it is adjacent to a\n            // non-inline element, it will not be rendered. This seems to be a good enough definition.\n            return isNonInlineElement(node.previousSibling) || isNonInlineElement(node.nextSibling);\n        }\n\n        function getRangeBoundaries(ranges) {\n            var positions = [], i, range;\n            for (i = 0; range = ranges[i++]; ) {\n                positions.push(\n                    new DomPosition(range.startContainer, range.startOffset),\n                    new DomPosition(range.endContainer, range.endOffset)\n                );\n            }\n            return positions;\n        }\n\n        function updateRangesFromBoundaries(ranges, positions) {\n            for (var i = 0, range, start, end, len = ranges.length; i < len; ++i) {\n                range = ranges[i];\n                start = positions[i * 2];\n                end = positions[i * 2 + 1];\n                range.setStartAndEnd(start.node, start.offset, end.node, end.offset);\n            }\n        }\n\n        function isSplitPoint(node, offset) {\n            if (dom.isCharacterDataNode(node)) {\n                if (offset == 0) {\n                    return !!node.previousSibling;\n                } else if (offset == node.length) {\n                    return !!node.nextSibling;\n                } else {\n                    return true;\n                }\n            }\n\n            return offset > 0 && offset < node.childNodes.length;\n        }\n\n        function splitNodeAt(node, descendantNode, descendantOffset, positionsToPreserve) {\n            var newNode, parentNode;\n            var splitAtStart = (descendantOffset == 0);\n\n            if (dom.isAncestorOf(descendantNode, node)) {\n                return node;\n            }\n\n            if (dom.isCharacterDataNode(descendantNode)) {\n                var descendantIndex = dom.getNodeIndex(descendantNode);\n                if (descendantOffset == 0) {\n                    descendantOffset = descendantIndex;\n                } else if (descendantOffset == descendantNode.length) {\n                    descendantOffset = descendantIndex + 1;\n                } else {\n                    throw module.createError(\"splitNodeAt() should not be called with offset in the middle of a data node (\" +\n                        descendantOffset + \" in \" + descendantNode.data);\n                }\n                descendantNode = descendantNode.parentNode;\n            }\n\n            if (isSplitPoint(descendantNode, descendantOffset)) {\n                // descendantNode is now guaranteed not to be a text or other character node\n                newNode = descendantNode.cloneNode(false);\n                parentNode = descendantNode.parentNode;\n                if (newNode.id) {\n                    newNode.removeAttribute(\"id\");\n                }\n                var child, newChildIndex = 0;\n\n                while ( (child = descendantNode.childNodes[descendantOffset]) ) {\n                    movePreservingPositions(child, newNode, newChildIndex++, positionsToPreserve);\n                }\n                movePreservingPositions(newNode, parentNode, dom.getNodeIndex(descendantNode) + 1, positionsToPreserve);\n                return (descendantNode == node) ? newNode : splitNodeAt(node, parentNode, dom.getNodeIndex(newNode), positionsToPreserve);\n            } else if (node != descendantNode) {\n                newNode = descendantNode.parentNode;\n\n                // Work out a new split point in the parent node\n                var newNodeIndex = dom.getNodeIndex(descendantNode);\n\n                if (!splitAtStart) {\n                    newNodeIndex++;\n                }\n                return splitNodeAt(node, newNode, newNodeIndex, positionsToPreserve);\n            }\n            return node;\n        }\n\n        function areElementsMergeable(el1, el2) {\n            return el1.namespaceURI == el2.namespaceURI &&\n                el1.tagName.toLowerCase() == el2.tagName.toLowerCase() &&\n                haveSameClasses(el1, el2) &&\n                elementsHaveSameNonClassAttributes(el1, el2) &&\n                getComputedStyleProperty(el1, \"display\") == \"inline\" &&\n                getComputedStyleProperty(el2, \"display\") == \"inline\";\n        }\n\n        function createAdjacentMergeableTextNodeGetter(forward) {\n            var siblingPropName = forward ? \"nextSibling\" : \"previousSibling\";\n\n            return function(textNode, checkParentElement) {\n                var el = textNode.parentNode;\n                var adjacentNode = textNode[siblingPropName];\n                if (adjacentNode) {\n                    // Can merge if the node's previous/next sibling is a text node\n                    if (adjacentNode && adjacentNode.nodeType == 3) {\n                        return adjacentNode;\n                    }\n                } else if (checkParentElement) {\n                    // Compare text node parent element with its sibling\n                    adjacentNode = el[siblingPropName];\n                    if (adjacentNode && adjacentNode.nodeType == 1 && areElementsMergeable(el, adjacentNode)) {\n                        var adjacentNodeChild = adjacentNode[forward ? \"firstChild\" : \"lastChild\"];\n                        if (adjacentNodeChild && adjacentNodeChild.nodeType == 3) {\n                            return adjacentNodeChild;\n                        }\n                    }\n                }\n                return null;\n            };\n        }\n\n        var getPreviousMergeableTextNode = createAdjacentMergeableTextNodeGetter(false),\n            getNextMergeableTextNode = createAdjacentMergeableTextNodeGetter(true);\n\n    \n        function Merge(firstNode) {\n            this.isElementMerge = (firstNode.nodeType == 1);\n            this.textNodes = [];\n            var firstTextNode = this.isElementMerge ? firstNode.lastChild : firstNode;\n            if (firstTextNode) {\n                this.textNodes[0] = firstTextNode;\n            }\n        }\n\n        Merge.prototype = {\n            doMerge: function(positionsToPreserve) {\n                var textNodes = this.textNodes;\n                var firstTextNode = textNodes[0];\n                if (textNodes.length > 1) {\n                    var firstTextNodeIndex = dom.getNodeIndex(firstTextNode);\n                    var textParts = [], combinedTextLength = 0, textNode, parent;\n                    forEach(textNodes, function(textNode, i) {\n                        parent = textNode.parentNode;\n                        if (i > 0) {\n                            parent.removeChild(textNode);\n                            if (!parent.hasChildNodes()) {\n                                dom.removeNode(parent);\n                            }\n                            if (positionsToPreserve) {\n                                forEach(positionsToPreserve, function(position) {\n                                    // Handle case where position is inside the text node being merged into a preceding node\n                                    if (position.node == textNode) {\n                                        position.node = firstTextNode;\n                                        position.offset += combinedTextLength;\n                                    }\n                                    // Handle case where both text nodes precede the position within the same parent node\n                                    if (position.node == parent && position.offset > firstTextNodeIndex) {\n                                        --position.offset;\n                                        if (position.offset == firstTextNodeIndex + 1 && i < textNodes.length - 1) {\n                                            position.node = firstTextNode;\n                                            position.offset = combinedTextLength;\n                                        }\n                                    }\n                                });\n                            }\n                        }\n                        textParts[i] = textNode.data;\n                        combinedTextLength += textNode.data.length;\n                    });\n                    firstTextNode.data = textParts.join(\"\");\n                }\n                return firstTextNode.data;\n            },\n\n            getLength: function() {\n                var i = this.textNodes.length, len = 0;\n                while (i--) {\n                    len += this.textNodes[i].length;\n                }\n                return len;\n            },\n\n            toString: function() {\n                var textParts = [];\n                forEach(this.textNodes, function(textNode, i) {\n                    textParts[i] = \"'\" + textNode.data + \"'\";\n                });\n                return \"[Merge(\" + textParts.join(\",\") + \")]\";\n            }\n        };\n\n        var optionProperties = [\"elementTagName\", \"ignoreWhiteSpace\", \"applyToEditableOnly\", \"useExistingElements\",\n            \"removeEmptyElements\", \"onElementCreate\"];\n\n        // TODO: Populate this with every attribute name that corresponds to a property with a different name. Really??\n        var attrNamesForProperties = {};\n\n        function ClassApplier(className, options, tagNames) {\n            var normalize, i, len, propName, applier = this;\n            applier.cssClass = applier.className = className; // cssClass property is for backward compatibility\n\n            var elementPropertiesFromOptions = null, elementAttributes = {};\n\n            // Initialize from options object\n            if (typeof options == \"object\" && options !== null) {\n                if (typeof options.elementTagName !== \"undefined\") {\n                    options.elementTagName = options.elementTagName.toLowerCase();\n                }\n                tagNames = options.tagNames;\n                elementPropertiesFromOptions = options.elementProperties;\n                elementAttributes = options.elementAttributes;\n\n                for (i = 0; propName = optionProperties[i++]; ) {\n                    if (options.hasOwnProperty(propName)) {\n                        applier[propName] = options[propName];\n                    }\n                }\n                normalize = options.normalize;\n            } else {\n                normalize = options;\n            }\n\n            // Backward compatibility: the second parameter can also be a Boolean indicating to normalize after unapplying\n            applier.normalize = (typeof normalize == \"undefined\") ? true : normalize;\n\n            // Initialize element properties and attribute exceptions\n            applier.attrExceptions = [];\n            var el = document.createElement(applier.elementTagName);\n            applier.elementProperties = applier.copyPropertiesToElement(elementPropertiesFromOptions, el, true);\n            each(elementAttributes, function(attrName, attrValue) {\n                applier.attrExceptions.push(attrName);\n                // Ensure each attribute value is a string\n                elementAttributes[attrName] = \"\" + attrValue;\n            });\n            applier.elementAttributes = elementAttributes;\n\n            applier.elementSortedClassName = applier.elementProperties.hasOwnProperty(\"className\") ?\n                sortClassName(applier.elementProperties.className + \" \" + className) : className;\n\n            // Initialize tag names\n            applier.applyToAnyTagName = false;\n            var type = typeof tagNames;\n            if (type == \"string\") {\n                if (tagNames == \"*\") {\n                    applier.applyToAnyTagName = true;\n                } else {\n                    applier.tagNames = trim(tagNames.toLowerCase()).split(/\\s*,\\s*/);\n                }\n            } else if (type == \"object\" && typeof tagNames.length == \"number\") {\n                applier.tagNames = [];\n                for (i = 0, len = tagNames.length; i < len; ++i) {\n                    if (tagNames[i] == \"*\") {\n                        applier.applyToAnyTagName = true;\n                    } else {\n                        applier.tagNames.push(tagNames[i].toLowerCase());\n                    }\n                }\n            } else {\n                applier.tagNames = [applier.elementTagName];\n            }\n        }\n\n        ClassApplier.prototype = {\n            elementTagName: defaultTagName,\n            elementProperties: {},\n            elementAttributes: {},\n            ignoreWhiteSpace: true,\n            applyToEditableOnly: false,\n            useExistingElements: true,\n            removeEmptyElements: true,\n            onElementCreate: null,\n\n            copyPropertiesToElement: function(props, el, createCopy) {\n                var s, elStyle, elProps = {}, elPropsStyle, propValue, elPropValue, attrName;\n\n                for (var p in props) {\n                    if (props.hasOwnProperty(p)) {\n                        propValue = props[p];\n                        elPropValue = el[p];\n\n                        // Special case for class. The copied properties object has the applier's class as well as its own\n                        // to simplify checks when removing styling elements\n                        if (p == \"className\") {\n                            addClass(el, propValue);\n                            addClass(el, this.className);\n                            el[p] = sortClassName(el[p]);\n                            if (createCopy) {\n                                elProps[p] = propValue;\n                            }\n                        }\n\n                        // Special case for style\n                        else if (p == \"style\") {\n                            elStyle = elPropValue;\n                            if (createCopy) {\n                                elProps[p] = elPropsStyle = {};\n                            }\n                            for (s in props[p]) {\n                                if (props[p].hasOwnProperty(s)) {\n                                    elStyle[s] = propValue[s];\n                                    if (createCopy) {\n                                        elPropsStyle[s] = elStyle[s];\n                                    }\n                                }\n                            }\n                            this.attrExceptions.push(p);\n                        } else {\n                            el[p] = propValue;\n                            // Copy the property back from the dummy element so that later comparisons to check whether\n                            // elements may be removed are checking against the right value. For example, the href property\n                            // of an element returns a fully qualified URL even if it was previously assigned a relative\n                            // URL.\n                            if (createCopy) {\n                                elProps[p] = el[p];\n\n                                // Not all properties map to identically-named attributes\n                                attrName = attrNamesForProperties.hasOwnProperty(p) ? attrNamesForProperties[p] : p;\n                                this.attrExceptions.push(attrName);\n                            }\n                        }\n                    }\n                }\n\n                return createCopy ? elProps : \"\";\n            },\n\n            copyAttributesToElement: function(attrs, el) {\n                for (var attrName in attrs) {\n                    if (attrs.hasOwnProperty(attrName) && !/^class(?:Name)?$/i.test(attrName)) {\n                        el.setAttribute(attrName, attrs[attrName]);\n                    }\n                }\n            },\n\n            appliesToElement: function(el) {\n                return contains(this.tagNames, el.tagName.toLowerCase());\n            },\n\n            getEmptyElements: function(range) {\n                var applier = this;\n                return range.getNodes([1], function(el) {\n                    return applier.appliesToElement(el) && !el.hasChildNodes();\n                });\n            },\n\n            hasClass: function(node) {\n                return node.nodeType == 1 &&\n                    (this.applyToAnyTagName || this.appliesToElement(node)) &&\n                    hasClass(node, this.className);\n            },\n\n            getSelfOrAncestorWithClass: function(node) {\n                while (node) {\n                    if (this.hasClass(node)) {\n                        return node;\n                    }\n                    node = node.parentNode;\n                }\n                return null;\n            },\n\n            isModifiable: function(node) {\n                return !this.applyToEditableOnly || isEditable(node);\n            },\n\n            // White space adjacent to an unwrappable node can be ignored for wrapping\n            isIgnorableWhiteSpaceNode: function(node) {\n                return this.ignoreWhiteSpace && node && node.nodeType == 3 && isUnrenderedWhiteSpaceNode(node);\n            },\n\n            // Normalizes nodes after applying a class to a Range.\n            postApply: function(textNodes, range, positionsToPreserve, isUndo) {\n                var firstNode = textNodes[0], lastNode = textNodes[textNodes.length - 1];\n                var merges = [], currentMerge;\n                var rangeStartNode = firstNode, rangeEndNode = lastNode;\n                var rangeStartOffset = 0, rangeEndOffset = lastNode.length;\n                var precedingTextNode;\n\n                // Check for every required merge and create a Merge object for each\n                forEach(textNodes, function(textNode) {\n                    precedingTextNode = getPreviousMergeableTextNode(textNode, !isUndo);\n                    if (precedingTextNode) {\n                        if (!currentMerge) {\n                            currentMerge = new Merge(precedingTextNode);\n                            merges.push(currentMerge);\n                        }\n                        currentMerge.textNodes.push(textNode);\n                        if (textNode === firstNode) {\n                            rangeStartNode = currentMerge.textNodes[0];\n                            rangeStartOffset = rangeStartNode.length;\n                        }\n                        if (textNode === lastNode) {\n                            rangeEndNode = currentMerge.textNodes[0];\n                            rangeEndOffset = currentMerge.getLength();\n                        }\n                    } else {\n                        currentMerge = null;\n                    }\n                });\n\n                // Test whether the first node after the range needs merging\n                var nextTextNode = getNextMergeableTextNode(lastNode, !isUndo);\n\n                if (nextTextNode) {\n                    if (!currentMerge) {\n                        currentMerge = new Merge(lastNode);\n                        merges.push(currentMerge);\n                    }\n                    currentMerge.textNodes.push(nextTextNode);\n                }\n\n                // Apply the merges\n                if (merges.length) {\n                    for (var i = 0, len = merges.length; i < len; ++i) {\n                        merges[i].doMerge(positionsToPreserve);\n                    }\n\n                    // Set the range boundaries\n                    range.setStartAndEnd(rangeStartNode, rangeStartOffset, rangeEndNode, rangeEndOffset);\n                }\n            },\n\n            createContainer: function(parentNode) {\n                var doc = dom.getDocument(parentNode);\n                var namespace;\n                var el = createElementNSSupported && !dom.isHtmlNamespace(parentNode) && (namespace = parentNode.namespaceURI) ?\n                    doc.createElementNS(parentNode.namespaceURI, this.elementTagName) :\n                    doc.createElement(this.elementTagName);\n\n                this.copyPropertiesToElement(this.elementProperties, el, false);\n                this.copyAttributesToElement(this.elementAttributes, el);\n                addClass(el, this.className);\n                if (this.onElementCreate) {\n                    this.onElementCreate(el, this);\n                }\n                return el;\n            },\n\n            elementHasProperties: function(el, props) {\n                var applier = this;\n                return each(props, function(p, propValue) {\n                    if (p == \"className\") {\n                        // For checking whether we should reuse an existing element, we just want to check that the element\n                        // has all the classes specified in the className property. When deciding whether the element is\n                        // removable when unapplying a class, there is separate special handling to check whether the\n                        // element has extra classes so the same simple check will do.\n                        return hasAllClasses(el, propValue);\n                    } else if (typeof propValue == \"object\") {\n                        if (!applier.elementHasProperties(el[p], propValue)) {\n                            return false;\n                        }\n                    } else if (el[p] !== propValue) {\n                        return false;\n                    }\n                });\n            },\n\n            elementHasAttributes: function(el, attrs) {\n                return each(attrs, function(name, value) {\n                    if (el.getAttribute(name) !== value) {\n                        return false;\n                    }\n                });\n            },\n\n            applyToTextNode: function(textNode, positionsToPreserve) {\n\n                // Check whether the text node can be styled. Text within a <style> or <script> element, for example,\n                // should not be styled. See issue 283.\n                if (canTextBeStyled(textNode)) {\n                    var parent = textNode.parentNode;\n                    if (parent.childNodes.length == 1 &&\n                        this.useExistingElements &&\n                        this.appliesToElement(parent) &&\n                        this.elementHasProperties(parent, this.elementProperties) &&\n                        this.elementHasAttributes(parent, this.elementAttributes)) {\n\n                        addClass(parent, this.className);\n                    } else {\n                        var textNodeParent = textNode.parentNode;\n                        var el = this.createContainer(textNodeParent);\n                        textNodeParent.insertBefore(el, textNode);\n                        el.appendChild(textNode);\n                    }\n                }\n\n            },\n\n            isRemovable: function(el) {\n                return el.tagName.toLowerCase() == this.elementTagName &&\n                    getSortedClassName(el) == this.elementSortedClassName &&\n                    this.elementHasProperties(el, this.elementProperties) &&\n                    !elementHasNonClassAttributes(el, this.attrExceptions) &&\n                    this.elementHasAttributes(el, this.elementAttributes) &&\n                    this.isModifiable(el);\n            },\n\n            isEmptyContainer: function(el) {\n                var childNodeCount = el.childNodes.length;\n                return el.nodeType == 1 &&\n                    this.isRemovable(el) &&\n                    (childNodeCount == 0 || (childNodeCount == 1 && this.isEmptyContainer(el.firstChild)));\n            },\n\n            removeEmptyContainers: function(range) {\n                var applier = this;\n                var nodesToRemove = range.getNodes([1], function(el) {\n                    return applier.isEmptyContainer(el);\n                });\n\n                var rangesToPreserve = [range];\n                var positionsToPreserve = getRangeBoundaries(rangesToPreserve);\n\n                forEach(nodesToRemove, function(node) {\n                    removePreservingPositions(node, positionsToPreserve);\n                });\n\n                // Update the range from the preserved boundary positions\n                updateRangesFromBoundaries(rangesToPreserve, positionsToPreserve);\n            },\n\n            undoToTextNode: function(textNode, range, ancestorWithClass, positionsToPreserve) {\n                if (!range.containsNode(ancestorWithClass)) {\n                    // Split out the portion of the ancestor from which we can remove the class\n                    //var parent = ancestorWithClass.parentNode, index = dom.getNodeIndex(ancestorWithClass);\n                    var ancestorRange = range.cloneRange();\n                    ancestorRange.selectNode(ancestorWithClass);\n                    if (ancestorRange.isPointInRange(range.endContainer, range.endOffset)) {\n                        splitNodeAt(ancestorWithClass, range.endContainer, range.endOffset, positionsToPreserve);\n                        range.setEndAfter(ancestorWithClass);\n                    }\n                    if (ancestorRange.isPointInRange(range.startContainer, range.startOffset)) {\n                        ancestorWithClass = splitNodeAt(ancestorWithClass, range.startContainer, range.startOffset, positionsToPreserve);\n                    }\n                }\n\n                if (this.isRemovable(ancestorWithClass)) {\n                    replaceWithOwnChildrenPreservingPositions(ancestorWithClass, positionsToPreserve);\n                } else {\n                    removeClass(ancestorWithClass, this.className);\n                }\n            },\n\n            splitAncestorWithClass: function(container, offset, positionsToPreserve) {\n                var ancestorWithClass = this.getSelfOrAncestorWithClass(container);\n                if (ancestorWithClass) {\n                    splitNodeAt(ancestorWithClass, container, offset, positionsToPreserve);\n                }\n            },\n\n            undoToAncestor: function(ancestorWithClass, positionsToPreserve) {\n                if (this.isRemovable(ancestorWithClass)) {\n                    replaceWithOwnChildrenPreservingPositions(ancestorWithClass, positionsToPreserve);\n                } else {\n                    removeClass(ancestorWithClass, this.className);\n                }\n            },\n\n            applyToRange: function(range, rangesToPreserve) {\n                var applier = this;\n                rangesToPreserve = rangesToPreserve || [];\n\n                // Create an array of range boundaries to preserve\n                var positionsToPreserve = getRangeBoundaries(rangesToPreserve || []);\n\n                range.splitBoundariesPreservingPositions(positionsToPreserve);\n\n                // Tidy up the DOM by removing empty containers\n                if (applier.removeEmptyElements) {\n                    applier.removeEmptyContainers(range);\n                }\n\n                var textNodes = getEffectiveTextNodes(range);\n\n                if (textNodes.length) {\n                    forEach(textNodes, function(textNode) {\n                        if (!applier.isIgnorableWhiteSpaceNode(textNode) && !applier.getSelfOrAncestorWithClass(textNode) &&\n                                applier.isModifiable(textNode)) {\n                            applier.applyToTextNode(textNode, positionsToPreserve);\n                        }\n                    });\n                    var lastTextNode = textNodes[textNodes.length - 1];\n                    range.setStartAndEnd(textNodes[0], 0, lastTextNode, lastTextNode.length);\n                    if (applier.normalize) {\n                        applier.postApply(textNodes, range, positionsToPreserve, false);\n                    }\n\n                    // Update the ranges from the preserved boundary positions\n                    updateRangesFromBoundaries(rangesToPreserve, positionsToPreserve);\n                }\n\n                // Apply classes to any appropriate empty elements\n                var emptyElements = applier.getEmptyElements(range);\n\n                forEach(emptyElements, function(el) {\n                    addClass(el, applier.className);\n                });\n            },\n\n            applyToRanges: function(ranges) {\n\n                var i = ranges.length;\n                while (i--) {\n                    this.applyToRange(ranges[i], ranges);\n                }\n\n\n                return ranges;\n            },\n\n            applyToSelection: function(win) {\n                var sel = api.getSelection(win);\n                sel.setRanges( this.applyToRanges(sel.getAllRanges()) );\n            },\n\n            undoToRange: function(range, rangesToPreserve) {\n                var applier = this;\n                // Create an array of range boundaries to preserve\n                rangesToPreserve = rangesToPreserve || [];\n                var positionsToPreserve = getRangeBoundaries(rangesToPreserve);\n\n\n                range.splitBoundariesPreservingPositions(positionsToPreserve);\n\n                // Tidy up the DOM by removing empty containers\n                if (applier.removeEmptyElements) {\n                    applier.removeEmptyContainers(range, positionsToPreserve);\n                }\n\n                var textNodes = getEffectiveTextNodes(range);\n                var textNode, ancestorWithClass;\n                var lastTextNode = textNodes[textNodes.length - 1];\n\n                if (textNodes.length) {\n                    applier.splitAncestorWithClass(range.endContainer, range.endOffset, positionsToPreserve);\n                    applier.splitAncestorWithClass(range.startContainer, range.startOffset, positionsToPreserve);\n                    for (var i = 0, len = textNodes.length; i < len; ++i) {\n                        textNode = textNodes[i];\n                        ancestorWithClass = applier.getSelfOrAncestorWithClass(textNode);\n                        if (ancestorWithClass && applier.isModifiable(textNode)) {\n                            applier.undoToAncestor(ancestorWithClass, positionsToPreserve);\n                        }\n                    }\n                    // Ensure the range is still valid\n                    range.setStartAndEnd(textNodes[0], 0, lastTextNode, lastTextNode.length);\n\n\n                    if (applier.normalize) {\n                        applier.postApply(textNodes, range, positionsToPreserve, true);\n                    }\n\n                    // Update the ranges from the preserved boundary positions\n                    updateRangesFromBoundaries(rangesToPreserve, positionsToPreserve);\n                }\n\n                // Remove class from any appropriate empty elements\n                var emptyElements = applier.getEmptyElements(range);\n\n                forEach(emptyElements, function(el) {\n                    removeClass(el, applier.className);\n                });\n            },\n\n            undoToRanges: function(ranges) {\n                // Get ranges returned in document order\n                var i = ranges.length;\n\n                while (i--) {\n                    this.undoToRange(ranges[i], ranges);\n                }\n\n                return ranges;\n            },\n\n            undoToSelection: function(win) {\n                var sel = api.getSelection(win);\n                var ranges = api.getSelection(win).getAllRanges();\n                this.undoToRanges(ranges);\n                sel.setRanges(ranges);\n            },\n\n            isAppliedToRange: function(range) {\n                if (range.collapsed || range.toString() == \"\") {\n                    return !!this.getSelfOrAncestorWithClass(range.commonAncestorContainer);\n                } else {\n                    var textNodes = range.getNodes( [3] );\n                    if (textNodes.length)\n                    for (var i = 0, textNode; textNode = textNodes[i++]; ) {\n                        if (!this.isIgnorableWhiteSpaceNode(textNode) && rangeSelectsAnyText(range, textNode) &&\n                                this.isModifiable(textNode) && !this.getSelfOrAncestorWithClass(textNode)) {\n                            return false;\n                        }\n                    }\n                    return true;\n                }\n            },\n\n            isAppliedToRanges: function(ranges) {\n                var i = ranges.length;\n                if (i == 0) {\n                    return false;\n                }\n                while (i--) {\n                    if (!this.isAppliedToRange(ranges[i])) {\n                        return false;\n                    }\n                }\n                return true;\n            },\n\n            isAppliedToSelection: function(win) {\n                var sel = api.getSelection(win);\n                return this.isAppliedToRanges(sel.getAllRanges());\n            },\n\n            toggleRange: function(range) {\n                if (this.isAppliedToRange(range)) {\n                    this.undoToRange(range);\n                } else {\n                    this.applyToRange(range);\n                }\n            },\n\n            toggleSelection: function(win) {\n                if (this.isAppliedToSelection(win)) {\n                    this.undoToSelection(win);\n                } else {\n                    this.applyToSelection(win);\n                }\n            },\n\n            getElementsWithClassIntersectingRange: function(range) {\n                var elements = [];\n                var applier = this;\n                range.getNodes([3], function(textNode) {\n                    var el = applier.getSelfOrAncestorWithClass(textNode);\n                    if (el && !contains(elements, el)) {\n                        elements.push(el);\n                    }\n                });\n                return elements;\n            },\n\n            detach: function() {}\n        };\n\n        function createClassApplier(className, options, tagNames) {\n            return new ClassApplier(className, options, tagNames);\n        }\n\n        ClassApplier.util = {\n            hasClass: hasClass,\n            addClass: addClass,\n            removeClass: removeClass,\n            getClass: getClass,\n            hasSameClasses: haveSameClasses,\n            hasAllClasses: hasAllClasses,\n            replaceWithOwnChildren: replaceWithOwnChildrenPreservingPositions,\n            elementsHaveSameNonClassAttributes: elementsHaveSameNonClassAttributes,\n            elementHasNonClassAttributes: elementHasNonClassAttributes,\n            splitNodeAt: splitNodeAt,\n            isEditableElement: isEditableElement,\n            isEditingHost: isEditingHost,\n            isEditable: isEditable\n        };\n\n        api.CssClassApplier = api.ClassApplier = ClassApplier;\n        api.createClassApplier = createClassApplier;\n        util.createAliasForDeprecatedMethod(api, \"createCssClassApplier\", \"createClassApplier\", module);\n    });\n    \n    return rangy;\n}, this);\n\n/**\n * Highlighter module for Rangy, a cross-browser JavaScript range and selection library\n * https://github.com/timdown/rangy\n *\n * Depends on Rangy core, ClassApplier and optionally TextRange modules.\n *\n * Copyright 2024, Tim Down\n * Licensed under the MIT license.\n * Version: 1.3.2\n * Build date: 2 November 2024\n */\n(function(factory, root) {\n    if (typeof define == \"function\" && define.amd) {\n        // AMD. Register as an anonymous module with a dependency on Rangy.\n        define([\"./rangy-core\"], factory);\n    } else if (typeof module != \"undefined\" && typeof exports == \"object\") {\n        // Node/CommonJS style\n        module.exports = factory( require(\"rangy\") );\n    } else {\n        // No AMD or CommonJS support so we use the rangy property of root (probably the global variable)\n        factory(root.rangy);\n    }\n})(function(rangy) {\n    rangy.createModule(\"Highlighter\", [\"ClassApplier\"], function(api, module) {\n        var dom = api.dom;\n        var contains = dom.arrayContains;\n        var getBody = dom.getBody;\n        var createOptions = api.util.createOptions;\n        var forEach = api.util.forEach;\n        var nextHighlightId = 1;\n\n        // Puts highlights in order, last in document first.\n        function compareHighlights(h1, h2) {\n            return h1.characterRange.start - h2.characterRange.start;\n        }\n\n        function getContainerElement(doc, id) {\n            return id ? doc.getElementById(id) : getBody(doc);\n        }\n\n        /*----------------------------------------------------------------------------------------------------------------*/\n\n        var highlighterTypes = {};\n\n        function HighlighterType(type, converterCreator) {\n            this.type = type;\n            this.converterCreator = converterCreator;\n        }\n\n        HighlighterType.prototype.create = function() {\n            var converter = this.converterCreator();\n            converter.type = this.type;\n            return converter;\n        };\n\n        function registerHighlighterType(type, converterCreator) {\n            highlighterTypes[type] = new HighlighterType(type, converterCreator);\n        }\n\n        function getConverter(type) {\n            var highlighterType = highlighterTypes[type];\n            if (highlighterType instanceof HighlighterType) {\n                return highlighterType.create();\n            } else {\n                throw new Error(\"Highlighter type '\" + type + \"' is not valid\");\n            }\n        }\n\n        api.registerHighlighterType = registerHighlighterType;\n\n        /*----------------------------------------------------------------------------------------------------------------*/\n\n        function CharacterRange(start, end) {\n            this.start = start;\n            this.end = end;\n        }\n\n        CharacterRange.prototype = {\n            intersects: function(charRange) {\n                return this.start < charRange.end && this.end > charRange.start;\n            },\n\n            isContiguousWith: function(charRange) {\n                return this.start == charRange.end || this.end == charRange.start;\n            },\n\n            union: function(charRange) {\n                return new CharacterRange(Math.min(this.start, charRange.start), Math.max(this.end, charRange.end));\n            },\n\n            intersection: function(charRange) {\n                return new CharacterRange(Math.max(this.start, charRange.start), Math.min(this.end, charRange.end));\n            },\n\n            getComplements: function(charRange) {\n                var ranges = [];\n                if (this.start >= charRange.start) {\n                    if (this.end <= charRange.end) {\n                        return [];\n                    }\n                    ranges.push(new CharacterRange(charRange.end, this.end));\n                } else {\n                    ranges.push(new CharacterRange(this.start, Math.min(this.end, charRange.start)));\n                    if (this.end > charRange.end) {\n                        ranges.push(new CharacterRange(charRange.end, this.end));\n                    }\n                }\n                return ranges;\n            },\n\n            toString: function() {\n                return \"[CharacterRange(\" + this.start + \", \" + this.end + \")]\";\n            }\n        };\n\n        CharacterRange.fromCharacterRange = function(charRange) {\n            return new CharacterRange(charRange.start, charRange.end);\n        };\n\n        /*----------------------------------------------------------------------------------------------------------------*/\n\n        var textContentConverter = {\n            rangeToCharacterRange: function(range, containerNode) {\n                var bookmark = range.getBookmark(containerNode);\n                return new CharacterRange(bookmark.start, bookmark.end);\n            },\n\n            characterRangeToRange: function(doc, characterRange, containerNode) {\n                var range = api.createRange(doc);\n                range.moveToBookmark({\n                    start: characterRange.start,\n                    end: characterRange.end,\n                    containerNode: containerNode\n                });\n\n                return range;\n            },\n\n            serializeSelection: function(selection, containerNode) {\n                var ranges = selection.getAllRanges(), rangeCount = ranges.length;\n                var rangeInfos = [];\n\n                var backward = rangeCount == 1 && selection.isBackward();\n\n                for (var i = 0, len = ranges.length; i < len; ++i) {\n                    rangeInfos[i] = {\n                        characterRange: this.rangeToCharacterRange(ranges[i], containerNode),\n                        backward: backward\n                    };\n                }\n\n                return rangeInfos;\n            },\n\n            restoreSelection: function(selection, savedSelection, containerNode) {\n                selection.removeAllRanges();\n                var doc = selection.win.document;\n                for (var i = 0, len = savedSelection.length, range, rangeInfo, characterRange; i < len; ++i) {\n                    rangeInfo = savedSelection[i];\n                    characterRange = rangeInfo.characterRange;\n                    range = this.characterRangeToRange(doc, rangeInfo.characterRange, containerNode);\n                    selection.addRange(range, rangeInfo.backward);\n                }\n            }\n        };\n\n        registerHighlighterType(\"textContent\", function() {\n            return textContentConverter;\n        });\n\n        /*----------------------------------------------------------------------------------------------------------------*/\n\n        // Lazily load the TextRange-based converter so that the dependency is only checked when required.\n        registerHighlighterType(\"TextRange\", (function() {\n            var converter;\n\n            return function() {\n                if (!converter) {\n                    // Test that textRangeModule exists and is supported\n                    var textRangeModule = api.modules.TextRange;\n                    if (!textRangeModule) {\n                        throw new Error(\"TextRange module is missing.\");\n                    } else if (!textRangeModule.supported) {\n                        throw new Error(\"TextRange module is present but not supported.\");\n                    }\n\n                    converter = {\n                        rangeToCharacterRange: function(range, containerNode) {\n                            return CharacterRange.fromCharacterRange( range.toCharacterRange(containerNode) );\n                        },\n\n                        characterRangeToRange: function(doc, characterRange, containerNode) {\n                            var range = api.createRange(doc);\n                            range.selectCharacters(containerNode, characterRange.start, characterRange.end);\n                            return range;\n                        },\n\n                        serializeSelection: function(selection, containerNode) {\n                            return selection.saveCharacterRanges(containerNode);\n                        },\n\n                        restoreSelection: function(selection, savedSelection, containerNode) {\n                            selection.restoreCharacterRanges(containerNode, savedSelection);\n                        }\n                    };\n                }\n\n                return converter;\n            };\n        })());\n\n        /*----------------------------------------------------------------------------------------------------------------*/\n\n        function Highlight(doc, characterRange, classApplier, converter, id, containerElementId) {\n            if (id) {\n                this.id = id;\n                nextHighlightId = Math.max(nextHighlightId, id + 1);\n            } else {\n                this.id = nextHighlightId++;\n            }\n            this.characterRange = characterRange;\n            this.doc = doc;\n            this.classApplier = classApplier;\n            this.converter = converter;\n            this.containerElementId = containerElementId || null;\n            this.applied = false;\n        }\n\n        Highlight.prototype = {\n            getContainerElement: function() {\n                return getContainerElement(this.doc, this.containerElementId);\n            },\n\n            getRange: function() {\n                return this.converter.characterRangeToRange(this.doc, this.characterRange, this.getContainerElement());\n            },\n\n            fromRange: function(range) {\n                this.characterRange = this.converter.rangeToCharacterRange(range, this.getContainerElement());\n            },\n\n            getText: function() {\n                return this.getRange().toString();\n            },\n\n            containsElement: function(el) {\n                return this.getRange().containsNodeContents(el.firstChild);\n            },\n\n            unapply: function() {\n                this.classApplier.undoToRange(this.getRange());\n                this.applied = false;\n            },\n\n            apply: function() {\n                this.classApplier.applyToRange(this.getRange());\n                this.applied = true;\n            },\n\n            getHighlightElements: function() {\n                return this.classApplier.getElementsWithClassIntersectingRange(this.getRange());\n            },\n\n            toString: function() {\n                return \"[Highlight(ID: \" + this.id + \", class: \" + this.classApplier.className + \", character range: \" +\n                    this.characterRange.start + \" - \" + this.characterRange.end + \")]\";\n            }\n        };\n\n        /*----------------------------------------------------------------------------------------------------------------*/\n\n        function Highlighter(doc, type) {\n            type = type || \"textContent\";\n            this.doc = doc || document;\n            this.classAppliers = {};\n            this.highlights = [];\n            this.converter = getConverter(type);\n        }\n\n        Highlighter.prototype = {\n            addClassApplier: function(classApplier) {\n                this.classAppliers[classApplier.className] = classApplier;\n            },\n\n            getHighlightForElement: function(el) {\n                var highlights = this.highlights;\n                for (var i = 0, len = highlights.length; i < len; ++i) {\n                    if (highlights[i].containsElement(el)) {\n                        return highlights[i];\n                    }\n                }\n                return null;\n            },\n\n            removeHighlights: function(highlights) {\n                for (var i = 0, len = this.highlights.length, highlight; i < len; ++i) {\n                    highlight = this.highlights[i];\n                    if (contains(highlights, highlight)) {\n                        highlight.unapply();\n                        this.highlights.splice(i--, 1);\n                    }\n                }\n            },\n\n            removeAllHighlights: function() {\n                this.removeHighlights(this.highlights);\n            },\n\n            getIntersectingHighlights: function(ranges) {\n                // Test each range against each of the highlighted ranges to see whether they overlap\n                var intersectingHighlights = [], highlights = this.highlights;\n                forEach(ranges, function(range) {\n                    //var selCharRange = converter.rangeToCharacterRange(range);\n                    forEach(highlights, function(highlight) {\n                        if (range.intersectsRange( highlight.getRange() ) && !contains(intersectingHighlights, highlight)) {\n                            intersectingHighlights.push(highlight);\n                        }\n                    });\n                });\n\n                return intersectingHighlights;\n            },\n\n            highlightCharacterRanges: function(className, charRanges, options) {\n                var i, len, j;\n                var highlights = this.highlights;\n                var converter = this.converter;\n                var doc = this.doc;\n                var highlightsToRemove = [];\n                var classApplier = className ? this.classAppliers[className] : null;\n\n                options = createOptions(options, {\n                    containerElementId: null,\n                    exclusive: true\n                });\n\n                var containerElementId = options.containerElementId;\n                var exclusive = options.exclusive;\n\n                var containerElement, containerElementRange, containerElementCharRange;\n                if (containerElementId) {\n                    containerElement = this.doc.getElementById(containerElementId);\n                    if (containerElement) {\n                        containerElementRange = api.createRange(this.doc);\n                        containerElementRange.selectNodeContents(containerElement);\n                        containerElementCharRange = new CharacterRange(0, containerElementRange.toString().length);\n                    }\n                }\n\n                var charRange, highlightCharRange, removeHighlight, isSameClassApplier, highlightsToKeep, splitHighlight;\n\n                for (i = 0, len = charRanges.length; i < len; ++i) {\n                    charRange = charRanges[i];\n                    highlightsToKeep = [];\n\n                    // Restrict character range to container element, if it exists\n                    if (containerElementCharRange) {\n                        charRange = charRange.intersection(containerElementCharRange);\n                    }\n\n                    // Ignore empty ranges\n                    if (charRange.start == charRange.end) {\n                        continue;\n                    }\n\n                    // Check for intersection with existing highlights. For each intersection, create a new highlight\n                    // which is the union of the highlight range and the selected range\n                    for (j = 0; j < highlights.length; ++j) {\n                        removeHighlight = false;\n\n                        if (containerElementId == highlights[j].containerElementId) {\n                            highlightCharRange = highlights[j].characterRange;\n                            isSameClassApplier = (classApplier == highlights[j].classApplier);\n                            splitHighlight = !isSameClassApplier && exclusive;\n\n                            // Replace the existing highlight if it needs to be:\n                            //  1. merged (isSameClassApplier)\n                            //  2. partially or entirely erased (className === null)\n                            //  3. partially or entirely replaced (isSameClassApplier == false && exclusive == true)\n                            if (    (highlightCharRange.intersects(charRange) || highlightCharRange.isContiguousWith(charRange)) &&\n                                    (isSameClassApplier || splitHighlight) ) {\n\n                                // Remove existing highlights, keeping the unselected parts\n                                if (splitHighlight) {\n                                    forEach(highlightCharRange.getComplements(charRange), function(rangeToAdd) {\n                                        highlightsToKeep.push( new Highlight(doc, rangeToAdd, highlights[j].classApplier, converter, null, containerElementId) );\n                                    });\n                                }\n\n                                removeHighlight = true;\n                                if (isSameClassApplier) {\n                                    charRange = highlightCharRange.union(charRange);\n                                }\n                            }\n                        }\n\n                        if (removeHighlight) {\n                            highlightsToRemove.push(highlights[j]);\n                            highlights[j] = new Highlight(doc, highlightCharRange.union(charRange), classApplier, converter, null, containerElementId);\n                        } else {\n                            highlightsToKeep.push(highlights[j]);\n                        }\n                    }\n\n                    // Add new range\n                    if (classApplier) {\n                        highlightsToKeep.push(new Highlight(doc, charRange, classApplier, converter, null, containerElementId));\n                    }\n                    this.highlights = highlights = highlightsToKeep;\n                }\n\n                // Remove the old highlights\n                forEach(highlightsToRemove, function(highlightToRemove) {\n                    highlightToRemove.unapply();\n                });\n\n                // Apply new highlights\n                var newHighlights = [];\n                forEach(highlights, function(highlight) {\n                    if (!highlight.applied) {\n                        highlight.apply();\n                        newHighlights.push(highlight);\n                    }\n                });\n\n                return newHighlights;\n            },\n\n            highlightRanges: function(className, ranges, options) {\n                var selCharRanges = [];\n                var converter = this.converter;\n\n                options = createOptions(options, {\n                    containerElement: null,\n                    exclusive: true\n                });\n\n                var containerElement = options.containerElement;\n                var containerElementId = containerElement ? containerElement.id : null;\n                var containerElementRange;\n                if (containerElement) {\n                    containerElementRange = api.createRange(containerElement);\n                    containerElementRange.selectNodeContents(containerElement);\n                }\n\n                forEach(ranges, function(range) {\n                    var scopedRange = containerElement ? containerElementRange.intersection(range) : range;\n                    selCharRanges.push( converter.rangeToCharacterRange(scopedRange, containerElement || getBody(range.getDocument())) );\n                });\n\n                return this.highlightCharacterRanges(className, selCharRanges, {\n                    containerElementId: containerElementId,\n                    exclusive: options.exclusive\n                });\n            },\n\n            highlightSelection: function(className, options) {\n                var converter = this.converter;\n                var classApplier = className ? this.classAppliers[className] : false;\n\n                options = createOptions(options, {\n                    containerElementId: null,\n                    exclusive: true\n                });\n\n                var containerElementId = options.containerElementId;\n                var exclusive = options.exclusive;\n                var selection = options.selection || api.getSelection(this.doc);\n                var doc = selection.win.document;\n                var containerElement = getContainerElement(doc, containerElementId);\n\n                if (!classApplier && className !== false) {\n                    throw new Error(\"No class applier found for class '\" + className + \"'\");\n                }\n\n                // Store the existing selection as character ranges\n                var serializedSelection = converter.serializeSelection(selection, containerElement);\n\n                // Create an array of selected character ranges\n                var selCharRanges = [];\n                forEach(serializedSelection, function(rangeInfo) {\n                    selCharRanges.push( CharacterRange.fromCharacterRange(rangeInfo.characterRange) );\n                });\n\n                var newHighlights = this.highlightCharacterRanges(className, selCharRanges, {\n                    containerElementId: containerElementId,\n                    exclusive: exclusive\n                });\n\n                // Restore selection\n                converter.restoreSelection(selection, serializedSelection, containerElement);\n\n                return newHighlights;\n            },\n\n            unhighlightSelection: function(selection) {\n                selection = selection || api.getSelection(this.doc);\n                var intersectingHighlights = this.getIntersectingHighlights( selection.getAllRanges() );\n                this.removeHighlights(intersectingHighlights);\n                selection.removeAllRanges();\n                return intersectingHighlights;\n            },\n\n            getHighlightsInSelection: function(selection) {\n                selection = selection || api.getSelection(this.doc);\n                return this.getIntersectingHighlights(selection.getAllRanges());\n            },\n\n            selectionOverlapsHighlight: function(selection) {\n                return this.getHighlightsInSelection(selection).length > 0;\n            },\n\n            serialize: function(options) {\n                var highlighter = this;\n                var highlights = highlighter.highlights;\n                var serializedType, serializedHighlights, convertType, serializationConverter;\n\n                highlights.sort(compareHighlights);\n                options = createOptions(options, {\n                    serializeHighlightText: false,\n                    type: highlighter.converter.type\n                });\n\n                serializedType = options.type;\n                convertType = (serializedType != highlighter.converter.type);\n\n                if (convertType) {\n                    serializationConverter = getConverter(serializedType);\n                }\n\n                serializedHighlights = [\"type:\" + serializedType];\n\n                forEach(highlights, function(highlight) {\n                    var characterRange = highlight.characterRange;\n                    var containerElement;\n\n                    // Convert to the current Highlighter's type, if different from the serialization type\n                    if (convertType) {\n                        containerElement = highlight.getContainerElement();\n                        characterRange = serializationConverter.rangeToCharacterRange(\n                            highlighter.converter.characterRangeToRange(highlighter.doc, characterRange, containerElement),\n                            containerElement\n                        );\n                    }\n\n                    var parts = [\n                        characterRange.start,\n                        characterRange.end,\n                        highlight.id,\n                        highlight.classApplier.className,\n                        highlight.containerElementId\n                    ];\n\n                    if (options.serializeHighlightText) {\n                        parts.push(highlight.getText());\n                    }\n                    serializedHighlights.push( parts.join(\"$\") );\n                });\n\n                return serializedHighlights.join(\"|\");\n            },\n\n            deserialize: function(serialized) {\n                var serializedHighlights = serialized.split(\"|\");\n                var highlights = [];\n\n                var firstHighlight = serializedHighlights[0];\n                var regexResult;\n                var serializationType, serializationConverter, convertType = false;\n                if ( firstHighlight && (regexResult = /^type:(\\w+)$/.exec(firstHighlight)) ) {\n                    serializationType = regexResult[1];\n                    if (serializationType != this.converter.type) {\n                        serializationConverter = getConverter(serializationType);\n                        convertType = true;\n                    }\n                    serializedHighlights.shift();\n                } else {\n                    throw new Error(\"Serialized highlights are invalid.\");\n                }\n\n                var classApplier, highlight, characterRange, containerElementId, containerElement;\n\n                for (var i = serializedHighlights.length, parts; i-- > 0; ) {\n                    parts = serializedHighlights[i].split(\"$\");\n                    characterRange = new CharacterRange(+parts[0], +parts[1]);\n                    containerElementId = parts[4] || null;\n\n                    // Convert to the current Highlighter's type, if different from the serialization type\n                    if (convertType) {\n                        containerElement = getContainerElement(this.doc, containerElementId);\n                        characterRange = this.converter.rangeToCharacterRange(\n                            serializationConverter.characterRangeToRange(this.doc, characterRange, containerElement),\n                            containerElement\n                        );\n                    }\n\n                    classApplier = this.classAppliers[ parts[3] ];\n\n                    if (!classApplier) {\n                        throw new Error(\"No class applier found for class '\" + parts[3] + \"'\");\n                    }\n\n                    highlight = new Highlight(this.doc, characterRange, classApplier, this.converter, parseInt(parts[2]), containerElementId);\n                    highlight.apply();\n                    highlights.push(highlight);\n                }\n                this.highlights = highlights;\n            }\n        };\n\n        api.Highlighter = Highlighter;\n\n        api.createHighlighter = function(doc, rangeCharacterOffsetConverterType) {\n            return new Highlighter(doc, rangeCharacterOffsetConverterType);\n        };\n    });\n    \n    return rangy;\n}, this);\n\n/**\n * Selection save and restore module for Rangy.\n * Saves and restores user selections using marker invisible elements in the DOM.\n *\n * Part of Rangy, a cross-browser JavaScript range and selection library\n * https://github.com/timdown/rangy\n *\n * Depends on Rangy core.\n *\n * Copyright 2024, Tim Down\n * Licensed under the MIT license.\n * Version: 1.3.2\n * Build date: 2 November 2024\n */\n(function(factory, root) {\n    if (typeof define == \"function\" && define.amd) {\n        // AMD. Register as an anonymous module with a dependency on Rangy.\n        define([\"./rangy-core\"], factory);\n    } else if (typeof module != \"undefined\" && typeof exports == \"object\") {\n        // Node/CommonJS style\n        module.exports = factory( require(\"rangy\") );\n    } else {\n        // No AMD or CommonJS support so we use the rangy property of root (probably the global variable)\n        factory(root.rangy);\n    }\n})(function(rangy) {\n    rangy.createModule(\"SaveRestore\", [\"WrappedSelection\"], function(api, module) {\n        var dom = api.dom;\n        var removeNode = dom.removeNode;\n        var isDirectionBackward = api.Selection.isDirectionBackward;\n        var markerTextChar = \"\\ufeff\";\n\n        function gEBI(id, doc) {\n            return (doc || document).getElementById(id);\n        }\n\n        function insertRangeBoundaryMarker(range, atStart) {\n            var markerId = \"selectionBoundary_\" + (+new Date()) + \"_\" + (\"\" + Math.random()).slice(2);\n            var markerEl;\n            var doc = dom.getDocument(range.startContainer);\n\n            // Clone the Range and collapse to the appropriate boundary point\n            var boundaryRange = range.cloneRange();\n            boundaryRange.collapse(atStart);\n\n            // Create the marker element containing a single invisible character using DOM methods and insert it\n            markerEl = doc.createElement(\"span\");\n            markerEl.id = markerId;\n            markerEl.style.lineHeight = \"0\";\n            markerEl.style.display = \"none\";\n            markerEl.className = \"rangySelectionBoundary\";\n            markerEl.appendChild(doc.createTextNode(markerTextChar));\n\n            boundaryRange.insertNode(markerEl);\n            return markerEl;\n        }\n\n        function setRangeBoundary(doc, range, markerId, atStart) {\n            var markerEl = gEBI(markerId, doc);\n            if (markerEl) {\n                range[atStart ? \"setStartBefore\" : \"setEndBefore\"](markerEl);\n                removeNode(markerEl);\n            } else {\n                module.warn(\"Marker element has been removed. Cannot restore selection.\");\n            }\n        }\n\n        function compareRanges(r1, r2) {\n            return r2.compareBoundaryPoints(r1.START_TO_START, r1);\n        }\n\n        function saveRange(range, direction) {\n            var startEl, endEl, doc = api.DomRange.getRangeDocument(range), text = range.toString();\n            var backward = isDirectionBackward(direction);\n\n            if (range.collapsed) {\n                endEl = insertRangeBoundaryMarker(range, false);\n                return {\n                    document: doc,\n                    markerId: endEl.id,\n                    collapsed: true\n                };\n            } else {\n                endEl = insertRangeBoundaryMarker(range, false);\n                startEl = insertRangeBoundaryMarker(range, true);\n\n                return {\n                    document: doc,\n                    startMarkerId: startEl.id,\n                    endMarkerId: endEl.id,\n                    collapsed: false,\n                    backward: backward,\n                    toString: function() {\n                        return \"original text: '\" + text + \"', new text: '\" + range.toString() + \"'\";\n                    }\n                };\n            }\n        }\n\n        function restoreRange(rangeInfo, normalize) {\n            var doc = rangeInfo.document;\n            if (typeof normalize == \"undefined\") {\n                normalize = true;\n            }\n            var range = api.createRange(doc);\n            if (rangeInfo.collapsed) {\n                var markerEl = gEBI(rangeInfo.markerId, doc);\n                if (markerEl) {\n                    markerEl.style.display = \"inline\";\n                    var previousNode = markerEl.previousSibling;\n\n                    // Workaround for issue 17\n                    if (previousNode && previousNode.nodeType == 3) {\n                        removeNode(markerEl);\n                        range.collapseToPoint(previousNode, previousNode.length);\n                    } else {\n                        range.collapseBefore(markerEl);\n                        removeNode(markerEl);\n                    }\n                } else {\n                    module.warn(\"Marker element has been removed. Cannot restore selection.\");\n                }\n            } else {\n                setRangeBoundary(doc, range, rangeInfo.startMarkerId, true);\n                setRangeBoundary(doc, range, rangeInfo.endMarkerId, false);\n            }\n\n            if (normalize) {\n                range.normalizeBoundaries();\n            }\n\n            return range;\n        }\n\n        function saveRanges(ranges, direction) {\n            var rangeInfos = [], range, doc;\n            var backward = isDirectionBackward(direction);\n\n            // Order the ranges by position within the DOM, latest first, cloning the array to leave the original untouched\n            ranges = ranges.slice(0);\n            ranges.sort(compareRanges);\n\n            for (var i = 0, len = ranges.length; i < len; ++i) {\n                rangeInfos[i] = saveRange(ranges[i], backward);\n            }\n\n            // Now that all the markers are in place and DOM manipulation over, adjust each range's boundaries to lie\n            // between its markers\n            for (i = len - 1; i >= 0; --i) {\n                range = ranges[i];\n                doc = api.DomRange.getRangeDocument(range);\n                if (range.collapsed) {\n                    range.collapseAfter(gEBI(rangeInfos[i].markerId, doc));\n                } else {\n                    range.setEndBefore(gEBI(rangeInfos[i].endMarkerId, doc));\n                    range.setStartAfter(gEBI(rangeInfos[i].startMarkerId, doc));\n                }\n            }\n\n            return rangeInfos;\n        }\n\n        function saveSelection(win) {\n            if (!api.isSelectionValid(win)) {\n                module.warn(\"Cannot save selection. This usually happens when the selection is collapsed and the selection document has lost focus.\");\n                return null;\n            }\n            var sel = api.getSelection(win);\n            var ranges = sel.getAllRanges();\n            var backward = (ranges.length == 1 && sel.isBackward());\n\n            var rangeInfos = saveRanges(ranges, backward);\n\n            // Ensure current selection is unaffected\n            if (backward) {\n                sel.setSingleRange(ranges[0], backward);\n            } else {\n                sel.setRanges(ranges);\n            }\n\n            return {\n                win: win,\n                rangeInfos: rangeInfos,\n                restored: false\n            };\n        }\n\n        function restoreRanges(rangeInfos) {\n            var ranges = [];\n\n            // Ranges are in reverse order of appearance in the DOM. We want to restore earliest first to avoid\n            // normalization affecting previously restored ranges.\n            var rangeCount = rangeInfos.length;\n\n            for (var i = rangeCount - 1; i >= 0; i--) {\n                ranges[i] = restoreRange(rangeInfos[i], true);\n            }\n\n            return ranges;\n        }\n\n        function restoreSelection(savedSelection, preserveDirection) {\n            if (!savedSelection.restored) {\n                var rangeInfos = savedSelection.rangeInfos;\n                var sel = api.getSelection(savedSelection.win);\n                var ranges = restoreRanges(rangeInfos), rangeCount = rangeInfos.length;\n\n                if (rangeCount == 1 && preserveDirection && api.features.selectionHasExtend && rangeInfos[0].backward) {\n                    sel.removeAllRanges();\n                    sel.addRange(ranges[0], true);\n                } else {\n                    sel.setRanges(ranges);\n                }\n\n                savedSelection.restored = true;\n            }\n        }\n\n        function removeMarkerElement(doc, markerId) {\n            var markerEl = gEBI(markerId, doc);\n            if (markerEl) {\n                removeNode(markerEl);\n            }\n        }\n\n        function removeMarkers(savedSelection) {\n            var rangeInfos = savedSelection.rangeInfos;\n            for (var i = 0, len = rangeInfos.length, rangeInfo; i < len; ++i) {\n                rangeInfo = rangeInfos[i];\n                if (rangeInfo.collapsed) {\n                    removeMarkerElement(savedSelection.doc, rangeInfo.markerId);\n                } else {\n                    removeMarkerElement(savedSelection.doc, rangeInfo.startMarkerId);\n                    removeMarkerElement(savedSelection.doc, rangeInfo.endMarkerId);\n                }\n            }\n        }\n\n        api.util.extend(api, {\n            saveRange: saveRange,\n            restoreRange: restoreRange,\n            saveRanges: saveRanges,\n            restoreRanges: restoreRanges,\n            saveSelection: saveSelection,\n            restoreSelection: restoreSelection,\n            removeMarkerElement: removeMarkerElement,\n            removeMarkers: removeMarkers\n        });\n    });\n    \n    return rangy;\n}, this);\n/**\n * Serializer module for Rangy.\n * Serializes Ranges and Selections. An example use would be to store a user's selection on a particular page in a\n * cookie or local storage and restore it on the user's next visit to the same page.\n *\n * Part of Rangy, a cross-browser JavaScript range and selection library\n * https://github.com/timdown/rangy\n *\n * Depends on Rangy core.\n *\n * Copyright 2024, Tim Down\n * Licensed under the MIT license.\n * Version: 1.3.2\n * Build date: 2 November 2024\n */\n(function(factory, root) {\n    if (typeof define == \"function\" && define.amd) {\n        // AMD. Register as an anonymous module with a dependency on Rangy.\n        define([\"./rangy-core\"], factory);\n    } else if (typeof module != \"undefined\" && typeof exports == \"object\") {\n        // Node/CommonJS style\n        module.exports = factory( require(\"rangy\") );\n    } else {\n        // No AMD or CommonJS support so we use the rangy property of root (probably the global variable)\n        factory(root.rangy);\n    }\n})(function(rangy) {\n    rangy.createModule(\"Serializer\", [\"WrappedSelection\"], function(api, module) {\n        var UNDEF = \"undefined\";\n        var util = api.util;\n\n        // encodeURIComponent and decodeURIComponent are required for cookie handling\n        if (typeof encodeURIComponent == UNDEF || typeof decodeURIComponent == UNDEF) {\n            module.fail(\"encodeURIComponent and/or decodeURIComponent method is missing\");\n        }\n\n        // Checksum for checking whether range can be serialized\n        var crc32 = (function() {\n            function utf8encode(str) {\n                var utf8CharCodes = [];\n\n                for (var i = 0, len = str.length, c; i < len; ++i) {\n                    c = str.charCodeAt(i);\n                    if (c < 128) {\n                        utf8CharCodes.push(c);\n                    } else if (c < 2048) {\n                        utf8CharCodes.push((c >> 6) | 192, (c & 63) | 128);\n                    } else {\n                        utf8CharCodes.push((c >> 12) | 224, ((c >> 6) & 63) | 128, (c & 63) | 128);\n                    }\n                }\n                return utf8CharCodes;\n            }\n\n            var cachedCrcTable = null;\n\n            function buildCRCTable() {\n                var table = [];\n                for (var i = 0, j, crc; i < 256; ++i) {\n                    crc = i;\n                    j = 8;\n                    while (j--) {\n                        if ((crc & 1) == 1) {\n                            crc = (crc >>> 1) ^ 0xEDB88320;\n                        } else {\n                            crc >>>= 1;\n                        }\n                    }\n                    table[i] = crc >>> 0;\n                }\n                return table;\n            }\n\n            function getCrcTable() {\n                if (!cachedCrcTable) {\n                    cachedCrcTable = buildCRCTable();\n                }\n                return cachedCrcTable;\n            }\n\n            return function(str) {\n                var utf8CharCodes = utf8encode(str), crc = -1, crcTable = getCrcTable();\n                for (var i = 0, len = utf8CharCodes.length, y; i < len; ++i) {\n                    y = (crc ^ utf8CharCodes[i]) & 0xFF;\n                    crc = (crc >>> 8) ^ crcTable[y];\n                }\n                return (crc ^ -1) >>> 0;\n            };\n        })();\n\n        var dom = api.dom;\n\n        function escapeTextForHtml(str) {\n            return str.replace(/</g, \"&lt;\").replace(/>/g, \"&gt;\");\n        }\n\n        function nodeToInfoString(node, infoParts) {\n            infoParts = infoParts || [];\n            var nodeType = node.nodeType, children = node.childNodes, childCount = children.length;\n            var nodeInfo = [nodeType, node.nodeName, childCount].join(\":\");\n            var start = \"\", end = \"\";\n            switch (nodeType) {\n                case 3: // Text node\n                    start = escapeTextForHtml(node.nodeValue);\n                    break;\n                case 8: // Comment\n                    start = \"<!--\" + escapeTextForHtml(node.nodeValue) + \"-->\";\n                    break;\n                default:\n                    start = \"<\" + nodeInfo + \">\";\n                    end = \"</>\";\n                    break;\n            }\n            if (start) {\n                infoParts.push(start);\n            }\n            for (var i = 0; i < childCount; ++i) {\n                nodeToInfoString(children[i], infoParts);\n            }\n            if (end) {\n                infoParts.push(end);\n            }\n            return infoParts;\n        }\n\n        // Creates a string representation of the specified element's contents that is similar to innerHTML but omits all\n        // attributes and comments and includes child node counts. This is done instead of using innerHTML to work around\n        // IE <= 8's policy of including element properties in attributes, which ruins things by changing an element's\n        // innerHTML whenever the user changes an input within the element.\n        function getElementChecksum(el) {\n            var info = nodeToInfoString(el).join(\"\");\n            return crc32(info).toString(16);\n        }\n\n        function serializePosition(node, offset, rootNode) {\n            var pathParts = [], n = node;\n            rootNode = rootNode || dom.getDocument(node).documentElement;\n            while (n && n != rootNode) {\n                pathParts.push(dom.getNodeIndex(n, true));\n                n = n.parentNode;\n            }\n            return pathParts.join(\"/\") + \":\" + offset;\n        }\n\n        function deserializePosition(serialized, rootNode, doc) {\n            if (!rootNode) {\n                rootNode = (doc || document).documentElement;\n            }\n            var parts = serialized.split(\":\");\n            var node = rootNode;\n            var nodeIndices = parts[0] ? parts[0].split(\"/\") : [], i = nodeIndices.length, nodeIndex;\n\n            while (i--) {\n                nodeIndex = parseInt(nodeIndices[i], 10);\n                if (nodeIndex < node.childNodes.length) {\n                    node = node.childNodes[nodeIndex];\n                } else {\n                    throw module.createError(\"deserializePosition() failed: node \" + dom.inspectNode(node) +\n                            \" has no child with index \" + nodeIndex + \", \" + i);\n                }\n            }\n\n            return new dom.DomPosition(node, parseInt(parts[1], 10));\n        }\n\n        function serializeRange(range, omitChecksum, rootNode) {\n            rootNode = rootNode || api.DomRange.getRangeDocument(range).documentElement;\n            if (!dom.isOrIsAncestorOf(rootNode, range.commonAncestorContainer)) {\n                throw module.createError(\"serializeRange(): range \" + range.inspect() +\n                    \" is not wholly contained within specified root node \" + dom.inspectNode(rootNode));\n            }\n            var serialized = serializePosition(range.startContainer, range.startOffset, rootNode) + \",\" +\n                serializePosition(range.endContainer, range.endOffset, rootNode);\n            if (!omitChecksum) {\n                serialized += \"{\" + getElementChecksum(rootNode) + \"}\";\n            }\n            return serialized;\n        }\n\n        var deserializeRegex = /^([^,]+),([^,\\{]+)(\\{([^}]+)\\})?$/;\n\n        function deserializeRange(serialized, rootNode, doc) {\n            if (rootNode) {\n                doc = doc || dom.getDocument(rootNode);\n            } else {\n                doc = doc || document;\n                rootNode = doc.documentElement;\n            }\n            var result = deserializeRegex.exec(serialized);\n            var checksum = result[4];\n            if (checksum) {\n                var rootNodeChecksum = getElementChecksum(rootNode);\n                if (checksum !== rootNodeChecksum) {\n                    throw module.createError(\"deserializeRange(): checksums of serialized range root node (\" + checksum +\n                        \") and target root node (\" + rootNodeChecksum + \") do not match\");\n                }\n            }\n            var start = deserializePosition(result[1], rootNode, doc), end = deserializePosition(result[2], rootNode, doc);\n            var range = api.createRange(doc);\n            range.setStartAndEnd(start.node, start.offset, end.node, end.offset);\n            return range;\n        }\n\n        function canDeserializeRange(serialized, rootNode, doc) {\n            if (!rootNode) {\n                rootNode = (doc || document).documentElement;\n            }\n            var result = deserializeRegex.exec(serialized);\n            var checksum = result[3];\n            return !checksum || checksum === getElementChecksum(rootNode);\n        }\n\n        function serializeSelection(selection, omitChecksum, rootNode) {\n            selection = api.getSelection(selection);\n            var ranges = selection.getAllRanges(), serializedRanges = [];\n            for (var i = 0, len = ranges.length; i < len; ++i) {\n                serializedRanges[i] = serializeRange(ranges[i], omitChecksum, rootNode);\n            }\n            return serializedRanges.join(\"|\");\n        }\n\n        function deserializeSelection(serialized, rootNode, win) {\n            if (rootNode) {\n                win = win || dom.getWindow(rootNode);\n            } else {\n                win = win || window;\n                rootNode = win.document.documentElement;\n            }\n            var serializedRanges = serialized.split(\"|\");\n            var sel = api.getSelection(win);\n            var ranges = [];\n\n            for (var i = 0, len = serializedRanges.length; i < len; ++i) {\n                ranges[i] = deserializeRange(serializedRanges[i], rootNode, win.document);\n            }\n            sel.setRanges(ranges);\n\n            return sel;\n        }\n\n        function canDeserializeSelection(serialized, rootNode, win) {\n            var doc;\n            if (rootNode) {\n                doc = win ? win.document : dom.getDocument(rootNode);\n            } else {\n                win = win || window;\n                rootNode = win.document.documentElement;\n            }\n            var serializedRanges = serialized.split(\"|\");\n\n            for (var i = 0, len = serializedRanges.length; i < len; ++i) {\n                if (!canDeserializeRange(serializedRanges[i], rootNode, doc)) {\n                    return false;\n                }\n            }\n\n            return true;\n        }\n\n        var cookieName = \"rangySerializedSelection\";\n\n        function getSerializedSelectionFromCookie(cookie) {\n            var parts = cookie.split(/[;,]/);\n            for (var i = 0, len = parts.length, nameVal, val; i < len; ++i) {\n                nameVal = parts[i].split(\"=\");\n                if (nameVal[0].replace(/^\\s+/, \"\") == cookieName) {\n                    val = nameVal[1];\n                    if (val) {\n                        return decodeURIComponent(val.replace(/\\s+$/, \"\"));\n                    }\n                }\n            }\n            return null;\n        }\n\n        function restoreSelectionFromCookie(win) {\n            win = win || window;\n            var serialized = getSerializedSelectionFromCookie(win.document.cookie);\n            if (serialized) {\n                deserializeSelection(serialized, win.doc);\n            }\n        }\n\n        function saveSelectionCookie(win, props) {\n            win = win || window;\n            props = (typeof props == \"object\") ? props : {};\n            var expires = props.expires ? \";expires=\" + props.expires.toUTCString() : \"\";\n            var path = props.path ? \";path=\" + props.path : \"\";\n            var domain = props.domain ? \";domain=\" + props.domain : \"\";\n            var secure = props.secure ? \";secure\" : \"\";\n            var serialized = serializeSelection(api.getSelection(win));\n            win.document.cookie = encodeURIComponent(cookieName) + \"=\" + encodeURIComponent(serialized) + expires + path + domain + secure;\n        }\n\n        util.extend(api, {\n            serializePosition: serializePosition,\n            deserializePosition: deserializePosition,\n            serializeRange: serializeRange,\n            deserializeRange: deserializeRange,\n            canDeserializeRange: canDeserializeRange,\n            serializeSelection: serializeSelection,\n            deserializeSelection: deserializeSelection,\n            canDeserializeSelection: canDeserializeSelection,\n            restoreSelectionFromCookie: restoreSelectionFromCookie,\n            saveSelectionCookie: saveSelectionCookie,\n            getElementChecksum: getElementChecksum,\n            nodeToInfoString: nodeToInfoString\n        });\n\n        util.crc32 = crc32;\n    });\n    \n    return rangy;\n}, this);\n/**\n * Text range module for Rangy.\n * Text-based manipulation and searching of ranges and selections.\n *\n * Features\n *\n * - Ability to move range boundaries by character or word offsets\n * - Customizable word tokenizer\n * - Ignores text nodes inside <script> or <style> elements or those hidden by CSS display and visibility properties\n * - Range findText method to search for text or regex within the page or within a range. Flags for whole words and case\n *   sensitivity\n * - Selection and range save/restore as text offsets within a node\n * - Methods to return visible text within a range or selection\n * - innerText method for elements\n *\n * References\n *\n * https://www.w3.org/Bugs/Public/show_bug.cgi?id=13145\n * http://aryeh.name/spec/innertext/innertext.html\n * http://dvcs.w3.org/hg/editing/raw-file/tip/editing.html\n *\n * Part of Rangy, a cross-browser JavaScript range and selection library\n * https://github.com/timdown/rangy\n *\n * Depends on Rangy core.\n *\n * Copyright 2024, Tim Down\n * Licensed under the MIT license.\n * Version: 1.3.2\n * Build date: 2 November 2024\n */\n\n/**\n * Problem: handling of trailing spaces before line breaks is handled inconsistently between browsers.\n *\n * First, a <br>: this is relatively simple. For the following HTML:\n *\n * 1 <br>2\n *\n * - IE and WebKit render the space, include it in the selection (i.e. when the content is selected and pasted into a\n *   textarea, the space is present) and allow the caret to be placed after it.\n * - Firefox does not acknowledge the space in the selection but it is possible to place the caret after it.\n * - Opera does not render the space but has two separate caret positions on either side of the space (left and right\n *   arrow keys show this) and includes the space in the selection.\n *\n * The other case is the line break or breaks implied by block elements. For the following HTML:\n *\n * <p>1 </p><p>2<p>\n *\n * - WebKit does not acknowledge the space in any way\n * - Firefox, IE and Opera as per <br>\n *\n * One more case is trailing spaces before line breaks in elements with white-space: pre-line. For the following HTML:\n *\n * <p style=\"white-space: pre-line\">1\n * 2</p>\n *\n * - Firefox and WebKit include the space in caret positions\n * - IE does not support pre-line up to and including version 9\n * - Opera ignores the space\n * - Trailing space only renders if there is a non-collapsed character in the line\n *\n * Problem is whether Rangy should ever acknowledge the space and if so, when. Another problem is whether this can be\n * feature-tested\n */\n(function(factory, root) {\n    if (typeof define == \"function\" && define.amd) {\n        // AMD. Register as an anonymous module with a dependency on Rangy.\n        define([\"./rangy-core\"], factory);\n    } else if (typeof module != \"undefined\" && typeof exports == \"object\") {\n        // Node/CommonJS style\n        module.exports = factory( require(\"rangy\") );\n    } else {\n        // No AMD or CommonJS support so we use the rangy property of root (probably the global variable)\n        factory(root.rangy);\n    }\n})(function(rangy) {\n    rangy.createModule(\"TextRange\", [\"WrappedSelection\"], function(api, module) {\n        var UNDEF = \"undefined\";\n        var CHARACTER = \"character\", WORD = \"word\";\n        var dom = api.dom, util = api.util;\n        var extend = util.extend;\n        var createOptions = util.createOptions;\n        var getBody = dom.getBody;\n\n\n        var spacesRegex = /^[ \\t\\f\\r\\n]+$/;\n        var spacesMinusLineBreaksRegex = /^[ \\t\\f\\r]+$/;\n        var allWhiteSpaceRegex = /^[\\t-\\r \\u0085\\u00A0\\u1680\\u180E\\u2000-\\u200B\\u2028\\u2029\\u202F\\u205F\\u3000]+$/;\n        var nonLineBreakWhiteSpaceRegex = /^[\\t \\u00A0\\u1680\\u180E\\u2000-\\u200B\\u202F\\u205F\\u3000]+$/;\n        var lineBreakRegex = /^[\\n-\\r\\u0085\\u2028\\u2029]$/;\n\n        var defaultLanguage = \"en\";\n\n        var isDirectionBackward = api.Selection.isDirectionBackward;\n\n        // Properties representing whether trailing spaces inside blocks are completely collapsed (as they are in WebKit,\n        // but not other browsers). Also test whether trailing spaces before <br> elements are collapsed.\n        var trailingSpaceInBlockCollapses = false;\n        var trailingSpaceBeforeBrCollapses = false;\n        var trailingSpaceBeforeBlockCollapses = false;\n        var trailingSpaceBeforeLineBreakInPreLineCollapses = true;\n\n        (function() {\n            var el = dom.createTestElement(document, \"<p>1 </p><p></p>\", true);\n            var p = el.firstChild;\n            var sel = api.getSelection();\n            sel.collapse(p.lastChild, 2);\n            sel.setStart(p.firstChild, 0);\n            trailingSpaceInBlockCollapses = (\"\" + sel).length == 1;\n\n            el.innerHTML = \"1 <br />\";\n            sel.collapse(el, 2);\n            sel.setStart(el.firstChild, 0);\n            trailingSpaceBeforeBrCollapses = (\"\" + sel).length == 1;\n\n            el.innerHTML = \"1 <p>1</p>\";\n            sel.collapse(el, 2);\n            sel.setStart(el.firstChild, 0);\n            trailingSpaceBeforeBlockCollapses = (\"\" + sel).length == 1;\n\n            dom.removeNode(el);\n            sel.removeAllRanges();\n        })();\n\n        /*----------------------------------------------------------------------------------------------------------------*/\n\n        // This function must create word and non-word tokens for the whole of the text supplied to it\n        function defaultTokenizer(chars, wordOptions) {\n            var word = chars.join(\"\"), result, tokenRanges = [];\n\n            function createTokenRange(start, end, isWord) {\n                tokenRanges.push( { start: start, end: end, isWord: isWord } );\n            }\n\n            // Match words and mark characters\n            var lastWordEnd = 0, wordStart, wordEnd;\n            while ( (result = wordOptions.wordRegex.exec(word)) ) {\n                wordStart = result.index;\n                wordEnd = wordStart + result[0].length;\n\n                // Create token for non-word characters preceding this word\n                if (wordStart > lastWordEnd) {\n                    createTokenRange(lastWordEnd, wordStart, false);\n                }\n\n                // Get trailing space characters for word\n                if (wordOptions.includeTrailingSpace) {\n                    while ( nonLineBreakWhiteSpaceRegex.test(chars[wordEnd]) ) {\n                        ++wordEnd;\n                    }\n                }\n                createTokenRange(wordStart, wordEnd, true);\n                lastWordEnd = wordEnd;\n            }\n\n            // Create token for trailing non-word characters, if any exist\n            if (lastWordEnd < chars.length) {\n                createTokenRange(lastWordEnd, chars.length, false);\n            }\n\n            return tokenRanges;\n        }\n\n        function convertCharRangeToToken(chars, tokenRange) {\n            var tokenChars = chars.slice(tokenRange.start, tokenRange.end);\n            var token = {\n                isWord: tokenRange.isWord,\n                chars: tokenChars,\n                toString: function() {\n                    return tokenChars.join(\"\");\n                }\n            };\n            for (var i = 0, len = tokenChars.length; i < len; ++i) {\n                tokenChars[i].token = token;\n            }\n            return token;\n        }\n\n        function tokenize(chars, wordOptions, tokenizer) {\n            var tokenRanges = tokenizer(chars, wordOptions);\n            var tokens = [];\n            for (var i = 0, tokenRange; tokenRange = tokenRanges[i++]; ) {\n                tokens.push( convertCharRangeToToken(chars, tokenRange) );\n            }\n            return tokens;\n        }\n\n        var defaultCharacterOptions = {\n            includeBlockContentTrailingSpace: true,\n            includeSpaceBeforeBr: true,\n            includeSpaceBeforeBlock: true,\n            includePreLineTrailingSpace: true,\n            ignoreCharacters: \"\"\n        };\n\n        function normalizeIgnoredCharacters(ignoredCharacters) {\n            // Check if character is ignored\n            var ignoredChars = ignoredCharacters || \"\";\n\n            // Normalize ignored characters into a string consisting of characters in ascending order of character code\n            var ignoredCharsArray = (typeof ignoredChars == \"string\") ? ignoredChars.split(\"\") : ignoredChars;\n            ignoredCharsArray.sort(function(char1, char2) {\n                return char1.charCodeAt(0) - char2.charCodeAt(0);\n            });\n\n            /// Convert back to a string and remove duplicates\n            return ignoredCharsArray.join(\"\").replace(/(.)\\1+/g, \"$1\");\n        }\n\n        var defaultCaretCharacterOptions = {\n            includeBlockContentTrailingSpace: !trailingSpaceBeforeLineBreakInPreLineCollapses,\n            includeSpaceBeforeBr: !trailingSpaceBeforeBrCollapses,\n            includeSpaceBeforeBlock: !trailingSpaceBeforeBlockCollapses,\n            includePreLineTrailingSpace: true\n        };\n\n        var defaultWordOptions = {\n            \"en\": {\n                wordRegex: /[a-z0-9]+('[a-z0-9]+)*/gi,\n                includeTrailingSpace: false,\n                tokenizer: defaultTokenizer\n            }\n        };\n\n        var defaultFindOptions = {\n            caseSensitive: false,\n            withinRange: null,\n            wholeWordsOnly: false,\n            wrap: false,\n            direction: \"forward\",\n            wordOptions: null,\n            characterOptions: null\n        };\n\n        var defaultMoveOptions = {\n            wordOptions: null,\n            characterOptions: null\n        };\n\n        var defaultExpandOptions = {\n            wordOptions: null,\n            characterOptions: null,\n            trim: false,\n            trimStart: true,\n            trimEnd: true\n        };\n\n        var defaultWordIteratorOptions = {\n            wordOptions: null,\n            characterOptions: null,\n            direction: \"forward\"\n        };\n\n        function createWordOptions(options) {\n            var lang, defaults;\n            if (!options) {\n                return defaultWordOptions[defaultLanguage];\n            } else {\n                lang = options.language || defaultLanguage;\n                defaults = {};\n                extend(defaults, defaultWordOptions[lang] || defaultWordOptions[defaultLanguage]);\n                extend(defaults, options);\n                return defaults;\n            }\n        }\n\n        function createNestedOptions(optionsParam, defaults) {\n            var options = createOptions(optionsParam, defaults);\n            if (defaults.hasOwnProperty(\"wordOptions\")) {\n                options.wordOptions = createWordOptions(options.wordOptions);\n            }\n            if (defaults.hasOwnProperty(\"characterOptions\")) {\n                options.characterOptions = createOptions(options.characterOptions, defaultCharacterOptions);\n            }\n            return options;\n        }\n\n        /*----------------------------------------------------------------------------------------------------------------*/\n\n        /* DOM utility functions */\n        var getComputedStyleProperty = dom.getComputedStyleProperty;\n\n        // Create cachable versions of DOM functions\n\n        // Test for old IE's incorrect display properties\n        var tableCssDisplayBlock;\n        (function() {\n            var table = document.createElement(\"table\");\n            var body = getBody(document);\n            body.appendChild(table);\n            tableCssDisplayBlock = (getComputedStyleProperty(table, \"display\") == \"block\");\n            body.removeChild(table);\n        })();\n\n        var defaultDisplayValueForTag = {\n            table: \"table\",\n            caption: \"table-caption\",\n            colgroup: \"table-column-group\",\n            col: \"table-column\",\n            thead: \"table-header-group\",\n            tbody: \"table-row-group\",\n            tfoot: \"table-footer-group\",\n            tr: \"table-row\",\n            td: \"table-cell\",\n            th: \"table-cell\"\n        };\n\n        // Corrects IE's \"block\" value for table-related elements\n        function getComputedDisplay(el, win) {\n            var display = getComputedStyleProperty(el, \"display\", win);\n            var tagName = el.tagName.toLowerCase();\n            return (display == \"block\" &&\n                    tableCssDisplayBlock &&\n                    defaultDisplayValueForTag.hasOwnProperty(tagName)) ?\n                defaultDisplayValueForTag[tagName] : display;\n        }\n\n        function isHidden(node) {\n            var ancestors = getAncestorsAndSelf(node);\n            for (var i = 0, len = ancestors.length; i < len; ++i) {\n                if (ancestors[i].nodeType == 1 && getComputedDisplay(ancestors[i]) == \"none\") {\n                    return true;\n                }\n            }\n\n            return false;\n        }\n\n        function isVisibilityHiddenTextNode(textNode) {\n            var el;\n            return textNode.nodeType == 3 &&\n                (el = textNode.parentNode) &&\n                getComputedStyleProperty(el, \"visibility\") == \"hidden\";\n        }\n\n        /*----------------------------------------------------------------------------------------------------------------*/\n\n    \n        // \"A block node is either an Element whose \"display\" property does not have\n        // resolved value \"inline\" or \"inline-block\" or \"inline-table\" or \"none\", or a\n        // Document, or a DocumentFragment.\"\n        function isBlockNode(node) {\n            return node &&\n                ((node.nodeType == 1 && !/^(inline(-block|-table)?|none)$/.test(getComputedDisplay(node))) ||\n                node.nodeType == 9 || node.nodeType == 11);\n        }\n\n        function getLastDescendantOrSelf(node) {\n            var lastChild = node.lastChild;\n            return lastChild ? getLastDescendantOrSelf(lastChild) : node;\n        }\n\n        function containsPositions(node) {\n            return dom.isCharacterDataNode(node) ||\n                !/^(area|base|basefont|br|col|frame|hr|img|input|isindex|link|meta|param)$/i.test(node.nodeName);\n        }\n\n        function getAncestors(node) {\n            var ancestors = [];\n            while (node.parentNode) {\n                ancestors.unshift(node.parentNode);\n                node = node.parentNode;\n            }\n            return ancestors;\n        }\n\n        function getAncestorsAndSelf(node) {\n            return getAncestors(node).concat([node]);\n        }\n\n        function nextNodeDescendants(node) {\n            while (node && !node.nextSibling) {\n                node = node.parentNode;\n            }\n            if (!node) {\n                return null;\n            }\n            return node.nextSibling;\n        }\n\n        function nextNode(node, excludeChildren) {\n            if (!excludeChildren && node.hasChildNodes()) {\n                return node.firstChild;\n            }\n            return nextNodeDescendants(node);\n        }\n\n        function previousNode(node) {\n            var previous = node.previousSibling;\n            if (previous) {\n                node = previous;\n                while (node.hasChildNodes()) {\n                    node = node.lastChild;\n                }\n                return node;\n            }\n            var parent = node.parentNode;\n            if (parent && parent.nodeType == 1) {\n                return parent;\n            }\n            return null;\n        }\n\n        // Adpated from Aryeh's code.\n        // \"A whitespace node is either a Text node whose data is the empty string; or\n        // a Text node whose data consists only of one or more tabs (0x0009), line\n        // feeds (0x000A), carriage returns (0x000D), and/or spaces (0x0020), and whose\n        // parent is an Element whose resolved value for \"white-space\" is \"normal\" or\n        // \"nowrap\"; or a Text node whose data consists only of one or more tabs\n        // (0x0009), carriage returns (0x000D), and/or spaces (0x0020), and whose\n        // parent is an Element whose resolved value for \"white-space\" is \"pre-line\".\"\n        function isWhitespaceNode(node) {\n            if (!node || node.nodeType != 3) {\n                return false;\n            }\n            var text = node.data;\n            if (text === \"\") {\n                return true;\n            }\n            var parent = node.parentNode;\n            if (!parent || parent.nodeType != 1) {\n                return false;\n            }\n            var computedWhiteSpace = getComputedStyleProperty(node.parentNode, \"whiteSpace\");\n\n            return (/^[\\t\\n\\r ]+$/.test(text) && /^(normal|nowrap)$/.test(computedWhiteSpace)) ||\n                (/^[\\t\\r ]+$/.test(text) && computedWhiteSpace == \"pre-line\");\n        }\n\n        // Adpated from Aryeh's code.\n        // \"node is a collapsed whitespace node if the following algorithm returns\n        // true:\"\n        function isCollapsedWhitespaceNode(node) {\n            // \"If node's data is the empty string, return true.\"\n            if (node.data === \"\") {\n                return true;\n            }\n\n            // \"If node is not a whitespace node, return false.\"\n            if (!isWhitespaceNode(node)) {\n                return false;\n            }\n\n            // \"Let ancestor be node's parent.\"\n            var ancestor = node.parentNode;\n\n            // \"If ancestor is null, return true.\"\n            if (!ancestor) {\n                return true;\n            }\n\n            // \"If the \"display\" property of some ancestor of node has resolved value \"none\", return true.\"\n            if (isHidden(node)) {\n                return true;\n            }\n\n            return false;\n        }\n\n        function isCollapsedNode(node) {\n            var type = node.nodeType;\n            return type == 7 /* PROCESSING_INSTRUCTION */ ||\n                type == 8 /* COMMENT */ ||\n                isHidden(node) ||\n                /^(script|style)$/i.test(node.nodeName) ||\n                isVisibilityHiddenTextNode(node) ||\n                isCollapsedWhitespaceNode(node);\n        }\n\n        function isIgnoredNode(node, win) {\n            var type = node.nodeType;\n            return type == 7 /* PROCESSING_INSTRUCTION */ ||\n                type == 8 /* COMMENT */ ||\n                (type == 1 && getComputedDisplay(node, win) == \"none\");\n        }\n\n        /*----------------------------------------------------------------------------------------------------------------*/\n\n        // Possibly overengineered caching system to prevent repeated DOM calls slowing everything down\n\n        function Cache() {\n            this.store = {};\n        }\n\n        Cache.prototype = {\n            get: function(key) {\n                return this.store.hasOwnProperty(key) ? this.store[key] : null;\n            },\n\n            set: function(key, value) {\n                return this.store[key] = value;\n            }\n        };\n\n        var cachedCount = 0, uncachedCount = 0;\n\n        function createCachingGetter(methodName, func, objProperty) {\n            return function(args) {\n                var cache = this.cache;\n                if (cache.hasOwnProperty(methodName)) {\n                    cachedCount++;\n                    return cache[methodName];\n                } else {\n                    uncachedCount++;\n                    var value = func.call(this, objProperty ? this[objProperty] : this, args);\n                    cache[methodName] = value;\n                    return value;\n                }\n            };\n        }\n\n        /*----------------------------------------------------------------------------------------------------------------*/\n\n        function NodeWrapper(node, session) {\n            this.node = node;\n            this.session = session;\n            this.cache = new Cache();\n            this.positions = new Cache();\n        }\n\n        var nodeProto = {\n            getPosition: function(offset) {\n                var positions = this.positions;\n                return positions.get(offset) || positions.set(offset, new Position(this, offset));\n            },\n\n            toString: function() {\n                return \"[NodeWrapper(\" + dom.inspectNode(this.node) + \")]\";\n            }\n        };\n\n        NodeWrapper.prototype = nodeProto;\n\n        var EMPTY = \"EMPTY\",\n            NON_SPACE = \"NON_SPACE\",\n            UNCOLLAPSIBLE_SPACE = \"UNCOLLAPSIBLE_SPACE\",\n            COLLAPSIBLE_SPACE = \"COLLAPSIBLE_SPACE\",\n            TRAILING_SPACE_BEFORE_BLOCK = \"TRAILING_SPACE_BEFORE_BLOCK\",\n            TRAILING_SPACE_IN_BLOCK = \"TRAILING_SPACE_IN_BLOCK\",\n            TRAILING_SPACE_BEFORE_BR = \"TRAILING_SPACE_BEFORE_BR\",\n            PRE_LINE_TRAILING_SPACE_BEFORE_LINE_BREAK = \"PRE_LINE_TRAILING_SPACE_BEFORE_LINE_BREAK\",\n            TRAILING_LINE_BREAK_AFTER_BR = \"TRAILING_LINE_BREAK_AFTER_BR\",\n            INCLUDED_TRAILING_LINE_BREAK_AFTER_BR = \"INCLUDED_TRAILING_LINE_BREAK_AFTER_BR\";\n\n        extend(nodeProto, {\n            isCharacterDataNode: createCachingGetter(\"isCharacterDataNode\", dom.isCharacterDataNode, \"node\"),\n            getNodeIndex: createCachingGetter(\"nodeIndex\", dom.getNodeIndex, \"node\"),\n            getLength: createCachingGetter(\"nodeLength\", dom.getNodeLength, \"node\"),\n            containsPositions: createCachingGetter(\"containsPositions\", containsPositions, \"node\"),\n            isWhitespace: createCachingGetter(\"isWhitespace\", isWhitespaceNode, \"node\"),\n            isCollapsedWhitespace: createCachingGetter(\"isCollapsedWhitespace\", isCollapsedWhitespaceNode, \"node\"),\n            getComputedDisplay: createCachingGetter(\"computedDisplay\", getComputedDisplay, \"node\"),\n            isCollapsed: createCachingGetter(\"collapsed\", isCollapsedNode, \"node\"),\n            isIgnored: createCachingGetter(\"ignored\", isIgnoredNode, \"node\"),\n            next: createCachingGetter(\"nextPos\", nextNode, \"node\"),\n            previous: createCachingGetter(\"previous\", previousNode, \"node\"),\n\n            getTextNodeInfo: createCachingGetter(\"textNodeInfo\", function(textNode) {\n                var spaceRegex = null, collapseSpaces = false;\n                var cssWhitespace = getComputedStyleProperty(textNode.parentNode, \"whiteSpace\");\n                var preLine = (cssWhitespace == \"pre-line\");\n                if (preLine) {\n                    spaceRegex = spacesMinusLineBreaksRegex;\n                    collapseSpaces = true;\n                } else if (cssWhitespace == \"normal\" || cssWhitespace == \"nowrap\") {\n                    spaceRegex = spacesRegex;\n                    collapseSpaces = true;\n                }\n\n                return {\n                    node: textNode,\n                    text: textNode.data,\n                    spaceRegex: spaceRegex,\n                    collapseSpaces: collapseSpaces,\n                    preLine: preLine\n                };\n            }, \"node\"),\n\n            hasInnerText: createCachingGetter(\"hasInnerText\", function(el, backward) {\n                var session = this.session;\n                var posAfterEl = session.getPosition(el.parentNode, this.getNodeIndex() + 1);\n                var firstPosInEl = session.getPosition(el, 0);\n\n                var pos = backward ? posAfterEl : firstPosInEl;\n                var endPos = backward ? firstPosInEl : posAfterEl;\n\n                /*\n                 <body><p>X  </p><p>Y</p></body>\n\n                 Positions:\n\n                 body:0:\"\"\n                 p:0:\"\"\n                 text:0:\"\"\n                 text:1:\"X\"\n                 text:2:TRAILING_SPACE_IN_BLOCK\n                 text:3:COLLAPSED_SPACE\n                 p:1:\"\"\n                 body:1:\"\\n\"\n                 p:0:\"\"\n                 text:0:\"\"\n                 text:1:\"Y\"\n\n                 A character is a TRAILING_SPACE_IN_BLOCK iff:\n\n                 - There is no uncollapsed character after it within the visible containing block element\n\n                 A character is a TRAILING_SPACE_BEFORE_BR iff:\n\n                 - There is no uncollapsed character after it preceding a <br> element\n\n                 An element has inner text iff\n\n                 - It is not hidden\n                 - It contains an uncollapsed character\n\n                 All trailing spaces (pre-line, before <br>, end of block) require definite non-empty characters to render.\n                 */\n\n                while (pos !== endPos) {\n                    pos.prepopulateChar();\n                    if (pos.isDefinitelyNonEmpty()) {\n                        return true;\n                    }\n                    pos = backward ? pos.previousVisible() : pos.nextVisible();\n                }\n\n                return false;\n            }, \"node\"),\n\n            isRenderedBlock: createCachingGetter(\"isRenderedBlock\", function(el) {\n                // Ensure that a block element containing a <br> is considered to have inner text\n                var brs = el.getElementsByTagName(\"br\");\n                for (var i = 0, len = brs.length; i < len; ++i) {\n                    if (!isCollapsedNode(brs[i])) {\n                        return true;\n                    }\n                }\n                return this.hasInnerText();\n            }, \"node\"),\n\n            getTrailingSpace: createCachingGetter(\"trailingSpace\", function(el) {\n                if (el.tagName.toLowerCase() == \"br\") {\n                    return \"\";\n                } else {\n                    switch (this.getComputedDisplay()) {\n                        case \"inline\":\n                            var child = el.lastChild;\n                            while (child) {\n                                if (!isIgnoredNode(child)) {\n                                    return (child.nodeType == 1) ? this.session.getNodeWrapper(child).getTrailingSpace() : \"\";\n                                }\n                                child = child.previousSibling;\n                            }\n                            break;\n                        case \"inline-block\":\n                        case \"inline-table\":\n                        case \"none\":\n                        case \"table-column\":\n                        case \"table-column-group\":\n                            break;\n                        case \"table-cell\":\n                            return \"\\t\";\n                        default:\n                            return this.isRenderedBlock(true) ? \"\\n\" : \"\";\n                    }\n                }\n                return \"\";\n            }, \"node\"),\n\n            getLeadingSpace: createCachingGetter(\"leadingSpace\", function(el) {\n                switch (this.getComputedDisplay()) {\n                    case \"inline\":\n                    case \"inline-block\":\n                    case \"inline-table\":\n                    case \"none\":\n                    case \"table-column\":\n                    case \"table-column-group\":\n                    case \"table-cell\":\n                        break;\n                    default:\n                        return this.isRenderedBlock(false) ? \"\\n\" : \"\";\n                }\n                return \"\";\n            }, \"node\")\n        });\n\n        /*----------------------------------------------------------------------------------------------------------------*/\n\n        function Position(nodeWrapper, offset) {\n            this.offset = offset;\n            this.nodeWrapper = nodeWrapper;\n            this.node = nodeWrapper.node;\n            this.session = nodeWrapper.session;\n            this.cache = new Cache();\n        }\n\n        function inspectPosition() {\n            return \"[Position(\" + dom.inspectNode(this.node) + \":\" + this.offset + \")]\";\n        }\n\n        var positionProto = {\n            character: \"\",\n            characterType: EMPTY,\n            isBr: false,\n\n            /*\n            This method:\n            - Fully populates positions that have characters that can be determined independently of any other characters.\n            - Populates most types of space positions with a provisional character. The character is finalized later.\n             */\n            prepopulateChar: function() {\n                var pos = this;\n                if (!pos.prepopulatedChar) {\n                    var node = pos.node, offset = pos.offset;\n                    var visibleChar = \"\", charType = EMPTY;\n                    var finalizedChar = false;\n                    if (offset > 0) {\n                        if (node.nodeType == 3) {\n                            var text = node.data;\n                            var textChar = text.charAt(offset - 1);\n\n                            var nodeInfo = pos.nodeWrapper.getTextNodeInfo();\n                            var spaceRegex = nodeInfo.spaceRegex;\n                            if (nodeInfo.collapseSpaces) {\n                                if (spaceRegex.test(textChar)) {\n                                    // \"If the character at position is from set, append a single space (U+0020) to newdata and advance\n                                    // position until the character at position is not from set.\"\n\n                                    // We also need to check for the case where we're in a pre-line and we have a space preceding a\n                                    // line break, because such spaces are collapsed in some browsers\n                                    if (offset > 1 && spaceRegex.test(text.charAt(offset - 2))) {\n                                    } else if (nodeInfo.preLine && text.charAt(offset) === \"\\n\") {\n                                        visibleChar = \" \";\n                                        charType = PRE_LINE_TRAILING_SPACE_BEFORE_LINE_BREAK;\n                                    } else {\n                                        visibleChar = \" \";\n                                        //pos.checkForFollowingLineBreak = true;\n                                        charType = COLLAPSIBLE_SPACE;\n                                    }\n                                } else {\n                                    visibleChar = textChar;\n                                    charType = NON_SPACE;\n                                    finalizedChar = true;\n                                }\n                            } else {\n                                visibleChar = textChar;\n                                charType = UNCOLLAPSIBLE_SPACE;\n                                finalizedChar = true;\n                            }\n                        } else {\n                            var nodePassed = node.childNodes[offset - 1];\n                            if (nodePassed && nodePassed.nodeType == 1 && !isCollapsedNode(nodePassed)) {\n                                if (nodePassed.tagName.toLowerCase() == \"br\") {\n                                    visibleChar = \"\\n\";\n                                    pos.isBr = true;\n                                    charType = COLLAPSIBLE_SPACE;\n                                    finalizedChar = false;\n                                } else {\n                                    pos.checkForTrailingSpace = true;\n                                }\n                            }\n\n                            // Check the leading space of the next node for the case when a block element follows an inline\n                            // element or text node. In that case, there is an implied line break between the two nodes.\n                            if (!visibleChar) {\n                                var nextNode = node.childNodes[offset];\n                                if (nextNode && nextNode.nodeType == 1 && !isCollapsedNode(nextNode)) {\n                                    pos.checkForLeadingSpace = true;\n                                }\n                            }\n                        }\n                    }\n\n                    pos.prepopulatedChar = true;\n                    pos.character = visibleChar;\n                    pos.characterType = charType;\n                    pos.isCharInvariant = finalizedChar;\n                }\n            },\n\n            isDefinitelyNonEmpty: function() {\n                var charType = this.characterType;\n                return charType == NON_SPACE || charType == UNCOLLAPSIBLE_SPACE;\n            },\n\n            // Resolve leading and trailing spaces, which may involve prepopulating other positions\n            resolveLeadingAndTrailingSpaces: function() {\n                if (!this.prepopulatedChar) {\n                    this.prepopulateChar();\n                }\n                if (this.checkForTrailingSpace) {\n                    var trailingSpace = this.session.getNodeWrapper(this.node.childNodes[this.offset - 1]).getTrailingSpace();\n                    if (trailingSpace) {\n                        this.isTrailingSpace = true;\n                        this.character = trailingSpace;\n                        this.characterType = COLLAPSIBLE_SPACE;\n                    }\n                    this.checkForTrailingSpace = false;\n                }\n                if (this.checkForLeadingSpace) {\n                    var leadingSpace = this.session.getNodeWrapper(this.node.childNodes[this.offset]).getLeadingSpace();\n                    if (leadingSpace) {\n                        this.isLeadingSpace = true;\n                        this.character = leadingSpace;\n                        this.characterType = COLLAPSIBLE_SPACE;\n                    }\n                    this.checkForLeadingSpace = false;\n                }\n            },\n\n            getPrecedingUncollapsedPosition: function(characterOptions) {\n                var pos = this, character;\n                while ( (pos = pos.previousVisible()) ) {\n                    character = pos.getCharacter(characterOptions);\n                    if (character !== \"\") {\n                        return pos;\n                    }\n                }\n\n                return null;\n            },\n\n            getCharacter: function(characterOptions) {\n                this.resolveLeadingAndTrailingSpaces();\n\n                var thisChar = this.character, returnChar;\n\n                // Check if character is ignored\n                var ignoredChars = normalizeIgnoredCharacters(characterOptions.ignoreCharacters);\n                var isIgnoredCharacter = (thisChar !== \"\" && ignoredChars.indexOf(thisChar) > -1);\n\n                // Check if this position's  character is invariant (i.e. not dependent on character options) and return it\n                // if so\n                if (this.isCharInvariant) {\n                    returnChar = isIgnoredCharacter ? \"\" : thisChar;\n                    return returnChar;\n                }\n\n                var cacheKey = [\"character\", characterOptions.includeSpaceBeforeBr, characterOptions.includeBlockContentTrailingSpace, characterOptions.includePreLineTrailingSpace, ignoredChars].join(\"_\");\n                var cachedChar = this.cache.get(cacheKey);\n                if (cachedChar !== null) {\n                    return cachedChar;\n                }\n\n                // We need to actually get the character now\n                var character = \"\";\n                var collapsible = (this.characterType == COLLAPSIBLE_SPACE);\n\n                var nextPos, previousPos;\n                var gotPreviousPos = false;\n                var pos = this;\n\n                function getPreviousPos() {\n                    if (!gotPreviousPos) {\n                        previousPos = pos.getPrecedingUncollapsedPosition(characterOptions);\n                        gotPreviousPos = true;\n                    }\n                    return previousPos;\n                }\n\n                // Disallow a collapsible space that is followed by a line break or is the last character\n                if (collapsible) {\n                    // Allow a trailing space that we've previously determined should be included\n                    if (this.type == INCLUDED_TRAILING_LINE_BREAK_AFTER_BR) {\n                        character = \"\\n\";\n                    }\n                    // Disallow a collapsible space that follows a trailing space or line break, or is the first character,\n                    // or follows a collapsible included space\n                    else if (thisChar == \" \" &&\n                            (!getPreviousPos() || previousPos.isTrailingSpace || previousPos.character == \"\\n\" || (previousPos.character == \" \" && previousPos.characterType == COLLAPSIBLE_SPACE))) {\n                    }\n                    // Allow a leading line break unless it follows a line break\n                    else if (thisChar == \"\\n\" && this.isLeadingSpace) {\n                        if (getPreviousPos() && previousPos.character != \"\\n\") {\n                            character = \"\\n\";\n                        } else {\n                        }\n                    } else {\n                        nextPos = this.nextUncollapsed();\n                        if (nextPos) {\n                            if (nextPos.isBr) {\n                                this.type = TRAILING_SPACE_BEFORE_BR;\n                            } else if (nextPos.isTrailingSpace && nextPos.character == \"\\n\") {\n                                this.type = TRAILING_SPACE_IN_BLOCK;\n                            } else if (nextPos.isLeadingSpace && nextPos.character == \"\\n\") {\n                                this.type = TRAILING_SPACE_BEFORE_BLOCK;\n                            }\n\n                            if (nextPos.character == \"\\n\") {\n                                if (this.type == TRAILING_SPACE_BEFORE_BR && !characterOptions.includeSpaceBeforeBr) {\n                                } else if (this.type == TRAILING_SPACE_BEFORE_BLOCK && !characterOptions.includeSpaceBeforeBlock) {\n                                } else if (this.type == TRAILING_SPACE_IN_BLOCK && nextPos.isTrailingSpace && !characterOptions.includeBlockContentTrailingSpace) {\n                                } else if (this.type == PRE_LINE_TRAILING_SPACE_BEFORE_LINE_BREAK && nextPos.type == NON_SPACE && !characterOptions.includePreLineTrailingSpace) {\n                                } else if (thisChar == \"\\n\") {\n                                    if (nextPos.isTrailingSpace) {\n                                        if (this.isTrailingSpace) {\n                                        } else if (this.isBr) {\n                                            nextPos.type = TRAILING_LINE_BREAK_AFTER_BR;\n\n                                            if (getPreviousPos() && previousPos.isLeadingSpace && !previousPos.isTrailingSpace && previousPos.character == \"\\n\") {\n                                                nextPos.character = \"\";\n                                            } else {\n                                                nextPos.type = INCLUDED_TRAILING_LINE_BREAK_AFTER_BR;\n                                            }\n                                        }\n                                    } else {\n                                        character = \"\\n\";\n                                    }\n                                } else if (thisChar == \" \") {\n                                    character = \" \";\n                                } else {\n                                }\n                            } else {\n                                character = thisChar;\n                            }\n                        } else {\n                        }\n                    }\n                }\n\n                if (ignoredChars.indexOf(character) > -1) {\n                    character = \"\";\n                }\n\n\n                this.cache.set(cacheKey, character);\n\n                return character;\n            },\n\n            equals: function(pos) {\n                return !!pos && this.node === pos.node && this.offset === pos.offset;\n            },\n\n            inspect: inspectPosition,\n\n            toString: function() {\n                return this.character;\n            }\n        };\n\n        Position.prototype = positionProto;\n\n        extend(positionProto, {\n            next: createCachingGetter(\"nextPos\", function(pos) {\n                var nodeWrapper = pos.nodeWrapper, node = pos.node, offset = pos.offset, session = nodeWrapper.session;\n                if (!node) {\n                    return null;\n                }\n                var nextNode, nextOffset, child;\n                if (offset == nodeWrapper.getLength()) {\n                    // Move onto the next node\n                    nextNode = node.parentNode;\n                    nextOffset = nextNode ? nodeWrapper.getNodeIndex() + 1 : 0;\n                } else {\n                    if (nodeWrapper.isCharacterDataNode()) {\n                        nextNode = node;\n                        nextOffset = offset + 1;\n                    } else {\n                        child = node.childNodes[offset];\n                        // Go into the children next, if children there are\n                        if (session.getNodeWrapper(child).containsPositions()) {\n                            nextNode = child;\n                            nextOffset = 0;\n                        } else {\n                            nextNode = node;\n                            nextOffset = offset + 1;\n                        }\n                    }\n                }\n\n                return nextNode ? session.getPosition(nextNode, nextOffset) : null;\n            }),\n\n            previous: createCachingGetter(\"previous\", function(pos) {\n                var nodeWrapper = pos.nodeWrapper, node = pos.node, offset = pos.offset, session = nodeWrapper.session;\n                var previousNode, previousOffset, child;\n                if (offset == 0) {\n                    previousNode = node.parentNode;\n                    previousOffset = previousNode ? nodeWrapper.getNodeIndex() : 0;\n                } else {\n                    if (nodeWrapper.isCharacterDataNode()) {\n                        previousNode = node;\n                        previousOffset = offset - 1;\n                    } else {\n                        child = node.childNodes[offset - 1];\n                        // Go into the children next, if children there are\n                        if (session.getNodeWrapper(child).containsPositions()) {\n                            previousNode = child;\n                            previousOffset = dom.getNodeLength(child);\n                        } else {\n                            previousNode = node;\n                            previousOffset = offset - 1;\n                        }\n                    }\n                }\n                return previousNode ? session.getPosition(previousNode, previousOffset) : null;\n            }),\n\n            /*\n             Next and previous position moving functions that filter out\n\n             - Hidden (CSS visibility/display) elements\n             - Script and style elements\n             */\n            nextVisible: createCachingGetter(\"nextVisible\", function(pos) {\n                var next = pos.next();\n                if (!next) {\n                    return null;\n                }\n                var nodeWrapper = next.nodeWrapper, node = next.node;\n                var newPos = next;\n                if (nodeWrapper.isCollapsed()) {\n                    // We're skipping this node and all its descendants\n                    newPos = nodeWrapper.session.getPosition(node.parentNode, nodeWrapper.getNodeIndex() + 1);\n                }\n                return newPos;\n            }),\n\n            nextUncollapsed: createCachingGetter(\"nextUncollapsed\", function(pos) {\n                var nextPos = pos;\n                while ( (nextPos = nextPos.nextVisible()) ) {\n                    nextPos.resolveLeadingAndTrailingSpaces();\n                    if (nextPos.character !== \"\") {\n                        return nextPos;\n                    }\n                }\n                return null;\n            }),\n\n            previousVisible: createCachingGetter(\"previousVisible\", function(pos) {\n                var previous = pos.previous();\n                if (!previous) {\n                    return null;\n                }\n                var nodeWrapper = previous.nodeWrapper, node = previous.node;\n                var newPos = previous;\n                if (nodeWrapper.isCollapsed()) {\n                    // We're skipping this node and all its descendants\n                    newPos = nodeWrapper.session.getPosition(node.parentNode, nodeWrapper.getNodeIndex());\n                }\n                return newPos;\n            })\n        });\n\n        /*----------------------------------------------------------------------------------------------------------------*/\n\n        var currentSession = null;\n\n        var Session = (function() {\n            function createWrapperCache(nodeProperty) {\n                var cache = new Cache();\n\n                return {\n                    get: function(node) {\n                        var wrappersByProperty = cache.get(node[nodeProperty]);\n                        if (wrappersByProperty) {\n                            for (var i = 0, wrapper; wrapper = wrappersByProperty[i++]; ) {\n                                if (wrapper.node === node) {\n                                    return wrapper;\n                                }\n                            }\n                        }\n                        return null;\n                    },\n\n                    set: function(nodeWrapper) {\n                        var property = nodeWrapper.node[nodeProperty];\n                        var wrappersByProperty = cache.get(property) || cache.set(property, []);\n                        wrappersByProperty.push(nodeWrapper);\n                    }\n                };\n            }\n\n            var uniqueIDSupported = util.isHostProperty(document.documentElement, \"uniqueID\");\n\n            function Session() {\n                this.initCaches();\n            }\n\n            Session.prototype = {\n                initCaches: function() {\n                    this.elementCache = uniqueIDSupported ? (function() {\n                        var elementsCache = new Cache();\n\n                        return {\n                            get: function(el) {\n                                return elementsCache.get(el.uniqueID);\n                            },\n\n                            set: function(elWrapper) {\n                                elementsCache.set(elWrapper.node.uniqueID, elWrapper);\n                            }\n                        };\n                    })() : createWrapperCache(\"tagName\");\n\n                    // Store text nodes keyed by data, although we may need to truncate this\n                    this.textNodeCache = createWrapperCache(\"data\");\n                    this.otherNodeCache = createWrapperCache(\"nodeName\");\n                },\n\n                getNodeWrapper: function(node) {\n                    var wrapperCache;\n                    switch (node.nodeType) {\n                        case 1:\n                            wrapperCache = this.elementCache;\n                            break;\n                        case 3:\n                            wrapperCache = this.textNodeCache;\n                            break;\n                        default:\n                            wrapperCache = this.otherNodeCache;\n                            break;\n                    }\n\n                    var wrapper = wrapperCache.get(node);\n                    if (!wrapper) {\n                        wrapper = new NodeWrapper(node, this);\n                        wrapperCache.set(wrapper);\n                    }\n                    return wrapper;\n                },\n\n                getPosition: function(node, offset) {\n                    return this.getNodeWrapper(node).getPosition(offset);\n                },\n\n                getRangeBoundaryPosition: function(range, isStart) {\n                    var prefix = isStart ? \"start\" : \"end\";\n                    return this.getPosition(range[prefix + \"Container\"], range[prefix + \"Offset\"]);\n                },\n\n                detach: function() {\n                    this.elementCache = this.textNodeCache = this.otherNodeCache = null;\n                }\n            };\n\n            return Session;\n        })();\n\n        /*----------------------------------------------------------------------------------------------------------------*/\n\n        function startSession() {\n            endSession();\n            return (currentSession = new Session());\n        }\n\n        function getSession() {\n            return currentSession || startSession();\n        }\n\n        function endSession() {\n            if (currentSession) {\n                currentSession.detach();\n            }\n            currentSession = null;\n        }\n\n        /*----------------------------------------------------------------------------------------------------------------*/\n\n        // Extensions to the rangy.dom utility object\n\n        extend(dom, {\n            nextNode: nextNode,\n            previousNode: previousNode\n        });\n\n        /*----------------------------------------------------------------------------------------------------------------*/\n\n        function createCharacterIterator(startPos, backward, endPos, characterOptions) {\n\n            // Adjust the end position to ensure that it is actually reached\n            if (endPos) {\n                if (backward) {\n                    if (isCollapsedNode(endPos.node)) {\n                        endPos = startPos.previousVisible();\n                    }\n                } else {\n                    if (isCollapsedNode(endPos.node)) {\n                        endPos = endPos.nextVisible();\n                    }\n                }\n            }\n\n            var pos = startPos, finished = false;\n\n            function next() {\n                var charPos = null;\n                if (backward) {\n                    charPos = pos;\n                    if (!finished) {\n                        pos = pos.previousVisible();\n                        finished = !pos || (endPos && pos.equals(endPos));\n                    }\n                } else {\n                    if (!finished) {\n                        charPos = pos = pos.nextVisible();\n                        finished = !pos || (endPos && pos.equals(endPos));\n                    }\n                }\n                if (finished) {\n                    pos = null;\n                }\n                return charPos;\n            }\n\n            var previousTextPos, returnPreviousTextPos = false;\n\n            return {\n                next: function() {\n                    if (returnPreviousTextPos) {\n                        returnPreviousTextPos = false;\n                        return previousTextPos;\n                    } else {\n                        var pos, character;\n                        while ( (pos = next()) ) {\n                            character = pos.getCharacter(characterOptions);\n                            if (character) {\n                                previousTextPos = pos;\n                                return pos;\n                            }\n                        }\n                        return null;\n                    }\n                },\n\n                rewind: function() {\n                    if (previousTextPos) {\n                        returnPreviousTextPos = true;\n                    } else {\n                        throw module.createError(\"createCharacterIterator: cannot rewind. Only one position can be rewound.\");\n                    }\n                },\n\n                dispose: function() {\n                    startPos = endPos = null;\n                }\n            };\n        }\n\n        var arrayIndexOf = Array.prototype.indexOf ?\n            function(arr, val) {\n                return arr.indexOf(val);\n            } :\n            function(arr, val) {\n                for (var i = 0, len = arr.length; i < len; ++i) {\n                    if (arr[i] === val) {\n                        return i;\n                    }\n                }\n                return -1;\n            };\n\n        // Provides a pair of iterators over text positions, tokenized. Transparently requests more text when next()\n        // is called and there is no more tokenized text\n        function createTokenizedTextProvider(pos, characterOptions, wordOptions) {\n            var forwardIterator = createCharacterIterator(pos, false, null, characterOptions);\n            var backwardIterator = createCharacterIterator(pos, true, null, characterOptions);\n            var tokenizer = wordOptions.tokenizer;\n\n            // Consumes a word and the whitespace beyond it\n            function consumeWord(forward) {\n                var pos, textChar;\n                var newChars = [], it = forward ? forwardIterator : backwardIterator;\n\n                var passedWordBoundary = false, insideWord = false;\n\n                while ( (pos = it.next()) ) {\n                    textChar = pos.character;\n\n\n                    if (allWhiteSpaceRegex.test(textChar)) {\n                        if (insideWord) {\n                            insideWord = false;\n                            passedWordBoundary = true;\n                        }\n                    } else {\n                        if (passedWordBoundary) {\n                            it.rewind();\n                            break;\n                        } else {\n                            insideWord = true;\n                        }\n                    }\n                    newChars.push(pos);\n                }\n\n\n                return newChars;\n            }\n\n            // Get initial word surrounding initial position and tokenize it\n            var forwardChars = consumeWord(true);\n            var backwardChars = consumeWord(false).reverse();\n            var tokens = tokenize(backwardChars.concat(forwardChars), wordOptions, tokenizer);\n\n            // Create initial token buffers\n            var forwardTokensBuffer = forwardChars.length ?\n                tokens.slice(arrayIndexOf(tokens, forwardChars[0].token)) : [];\n\n            var backwardTokensBuffer = backwardChars.length ?\n                tokens.slice(0, arrayIndexOf(tokens, backwardChars.pop().token) + 1) : [];\n\n            function inspectBuffer(buffer) {\n                var textPositions = [\"[\" + buffer.length + \"]\"];\n                for (var i = 0; i < buffer.length; ++i) {\n                    textPositions.push(\"(word: \" + buffer[i] + \", is word: \" + buffer[i].isWord + \")\");\n                }\n                return textPositions;\n            }\n\n\n            return {\n                nextEndToken: function() {\n                    var lastToken, forwardChars;\n\n                    // If we're down to the last token, consume character chunks until we have a word or run out of\n                    // characters to consume\n                    while ( forwardTokensBuffer.length == 1 &&\n                        !(lastToken = forwardTokensBuffer[0]).isWord &&\n                        (forwardChars = consumeWord(true)).length > 0) {\n\n                        // Merge trailing non-word into next word and tokenize\n                        forwardTokensBuffer = tokenize(lastToken.chars.concat(forwardChars), wordOptions, tokenizer);\n                    }\n\n                    return forwardTokensBuffer.shift();\n                },\n\n                previousStartToken: function() {\n                    var lastToken, backwardChars;\n\n                    // If we're down to the last token, consume character chunks until we have a word or run out of\n                    // characters to consume\n                    while ( backwardTokensBuffer.length == 1 &&\n                        !(lastToken = backwardTokensBuffer[0]).isWord &&\n                        (backwardChars = consumeWord(false)).length > 0) {\n\n                        // Merge leading non-word into next word and tokenize\n                        backwardTokensBuffer = tokenize(backwardChars.reverse().concat(lastToken.chars), wordOptions, tokenizer);\n                    }\n\n                    return backwardTokensBuffer.pop();\n                },\n\n                dispose: function() {\n                    forwardIterator.dispose();\n                    backwardIterator.dispose();\n                    forwardTokensBuffer = backwardTokensBuffer = null;\n                }\n            };\n        }\n\n        function movePositionBy(pos, unit, count, characterOptions, wordOptions) {\n            var unitsMoved = 0, currentPos, newPos = pos, charIterator, nextPos, absCount = Math.abs(count), token;\n            if (count !== 0) {\n                var backward = (count < 0);\n\n                switch (unit) {\n                    case CHARACTER:\n                        charIterator = createCharacterIterator(pos, backward, null, characterOptions);\n                        while ( (currentPos = charIterator.next()) && unitsMoved < absCount ) {\n                            ++unitsMoved;\n                            newPos = currentPos;\n                        }\n                        nextPos = currentPos;\n                        charIterator.dispose();\n                        break;\n                    case WORD:\n                        var tokenizedTextProvider = createTokenizedTextProvider(pos, characterOptions, wordOptions);\n                        var next = backward ? tokenizedTextProvider.previousStartToken : tokenizedTextProvider.nextEndToken;\n\n                        while ( (token = next()) && unitsMoved < absCount ) {\n                            if (token.isWord) {\n                                ++unitsMoved;\n                                newPos = backward ? token.chars[0] : token.chars[token.chars.length - 1];\n                            }\n                        }\n                        break;\n                    default:\n                        throw new Error(\"movePositionBy: unit '\" + unit + \"' not implemented\");\n                }\n\n                // Perform any necessary position tweaks\n                if (backward) {\n                    newPos = newPos.previousVisible();\n                    unitsMoved = -unitsMoved;\n                } else if (newPos && newPos.isLeadingSpace && !newPos.isTrailingSpace) {\n                    // Tweak the position for the case of a leading space. The problem is that an uncollapsed leading space\n                    // before a block element (for example, the line break between \"1\" and \"2\" in the following HTML:\n                    // \"1<p>2</p>\") is considered to be attached to the position immediately before the block element, which\n                    // corresponds with a different selection position in most browsers from the one we want (i.e. at the\n                    // start of the contents of the block element). We get round this by advancing the position returned to\n                    // the last possible equivalent visible position.\n                    if (unit == WORD) {\n                        charIterator = createCharacterIterator(pos, false, null, characterOptions);\n                        nextPos = charIterator.next();\n                        charIterator.dispose();\n                    }\n                    if (nextPos) {\n                        newPos = nextPos.previousVisible();\n                    }\n                }\n            }\n\n\n            return {\n                position: newPos,\n                unitsMoved: unitsMoved\n            };\n        }\n\n        function createRangeCharacterIterator(session, range, characterOptions, backward) {\n            var rangeStart = session.getRangeBoundaryPosition(range, true);\n            var rangeEnd = session.getRangeBoundaryPosition(range, false);\n            var itStart = backward ? rangeEnd : rangeStart;\n            var itEnd = backward ? rangeStart : rangeEnd;\n\n            return createCharacterIterator(itStart, !!backward, itEnd, characterOptions);\n        }\n\n        function getRangeCharacters(session, range, characterOptions) {\n\n            var chars = [], it = createRangeCharacterIterator(session, range, characterOptions), pos;\n            while ( (pos = it.next()) ) {\n                chars.push(pos);\n            }\n\n            it.dispose();\n            return chars;\n        }\n\n        function isWholeWord(startPos, endPos, wordOptions) {\n            var range = api.createRange(startPos.node);\n            range.setStartAndEnd(startPos.node, startPos.offset, endPos.node, endPos.offset);\n            return !range.expand(\"word\", { wordOptions: wordOptions });\n        }\n\n        function findTextFromPosition(initialPos, searchTerm, isRegex, searchScopeRange, findOptions) {\n            var backward = isDirectionBackward(findOptions.direction);\n            var it = createCharacterIterator(\n                initialPos,\n                backward,\n                initialPos.session.getRangeBoundaryPosition(searchScopeRange, backward),\n                findOptions.characterOptions\n            );\n            var text = \"\", chars = [], pos, currentChar, matchStartIndex, matchEndIndex;\n            var result, insideRegexMatch;\n            var returnValue = null;\n\n            function handleMatch(startIndex, endIndex) {\n                var startPos = chars[startIndex].previousVisible();\n                var endPos = chars[endIndex - 1];\n                var valid = (!findOptions.wholeWordsOnly || isWholeWord(startPos, endPos, findOptions.wordOptions));\n\n                return {\n                    startPos: startPos,\n                    endPos: endPos,\n                    valid: valid\n                };\n            }\n\n            while ( (pos = it.next()) ) {\n                currentChar = pos.character;\n                if (!isRegex && !findOptions.caseSensitive) {\n                    currentChar = currentChar.toLowerCase();\n                }\n\n                if (backward) {\n                    chars.unshift(pos);\n                    text = currentChar + text;\n                } else {\n                    chars.push(pos);\n                    text += currentChar;\n                }\n\n                if (isRegex) {\n                    result = searchTerm.exec(text);\n                    if (result) {\n                        matchStartIndex = result.index;\n                        matchEndIndex = matchStartIndex + result[0].length;\n                        if (insideRegexMatch) {\n                            // Check whether the match is now over\n                            if ((!backward && matchEndIndex < text.length) || (backward && matchStartIndex > 0)) {\n                                returnValue = handleMatch(matchStartIndex, matchEndIndex);\n                                break;\n                            }\n                        } else {\n                            insideRegexMatch = true;\n                        }\n                    }\n                } else if ( (matchStartIndex = text.indexOf(searchTerm)) != -1 ) {\n                    returnValue = handleMatch(matchStartIndex, matchStartIndex + searchTerm.length);\n                    break;\n                }\n            }\n\n            // Check whether regex match extends to the end of the range\n            if (insideRegexMatch) {\n                returnValue = handleMatch(matchStartIndex, matchEndIndex);\n            }\n            it.dispose();\n\n            return returnValue;\n        }\n\n        function createEntryPointFunction(func) {\n            return function() {\n                var sessionRunning = !!currentSession;\n                var session = getSession();\n                var args = [session].concat( util.toArray(arguments) );\n                var returnValue = func.apply(this, args);\n                if (!sessionRunning) {\n                    endSession();\n                }\n                return returnValue;\n            };\n        }\n\n        /*----------------------------------------------------------------------------------------------------------------*/\n\n        // Extensions to the Rangy Range object\n\n        function createRangeBoundaryMover(isStart, collapse) {\n            /*\n             Unit can be \"character\" or \"word\"\n             Options:\n\n             - includeTrailingSpace\n             - wordRegex\n             - tokenizer\n             - collapseSpaceBeforeLineBreak\n             */\n            return createEntryPointFunction(\n                function(session, unit, count, moveOptions) {\n                    if (typeof count == UNDEF) {\n                        count = unit;\n                        unit = CHARACTER;\n                    }\n                    moveOptions = createNestedOptions(moveOptions, defaultMoveOptions);\n\n                    var boundaryIsStart = isStart;\n                    if (collapse) {\n                        boundaryIsStart = (count >= 0);\n                        this.collapse(!boundaryIsStart);\n                    }\n                    var moveResult = movePositionBy(session.getRangeBoundaryPosition(this, boundaryIsStart), unit, count, moveOptions.characterOptions, moveOptions.wordOptions);\n                    var newPos = moveResult.position;\n                    this[boundaryIsStart ? \"setStart\" : \"setEnd\"](newPos.node, newPos.offset);\n                    return moveResult.unitsMoved;\n                }\n            );\n        }\n\n        function createRangeTrimmer(isStart) {\n            return createEntryPointFunction(\n                function(session, characterOptions) {\n                    characterOptions = createOptions(characterOptions, defaultCharacterOptions);\n                    var pos;\n                    var it = createRangeCharacterIterator(session, this, characterOptions, !isStart);\n                    var trimCharCount = 0;\n                    while ( (pos = it.next()) && allWhiteSpaceRegex.test(pos.character) ) {\n                        ++trimCharCount;\n                    }\n                    it.dispose();\n                    var trimmed = (trimCharCount > 0);\n                    if (trimmed) {\n                        this[isStart ? \"moveStart\" : \"moveEnd\"](\n                            \"character\",\n                            isStart ? trimCharCount : -trimCharCount,\n                            { characterOptions: characterOptions }\n                        );\n                    }\n                    return trimmed;\n                }\n            );\n        }\n\n        extend(api.rangePrototype, {\n            moveStart: createRangeBoundaryMover(true, false),\n\n            moveEnd: createRangeBoundaryMover(false, false),\n\n            move: createRangeBoundaryMover(true, true),\n\n            trimStart: createRangeTrimmer(true),\n\n            trimEnd: createRangeTrimmer(false),\n\n            trim: createEntryPointFunction(\n                function(session, characterOptions) {\n                    var startTrimmed = this.trimStart(characterOptions), endTrimmed = this.trimEnd(characterOptions);\n                    return startTrimmed || endTrimmed;\n                }\n            ),\n\n            expand: createEntryPointFunction(\n                function(session, unit, expandOptions) {\n                    var moved = false;\n                    expandOptions = createNestedOptions(expandOptions, defaultExpandOptions);\n                    var characterOptions = expandOptions.characterOptions;\n                    if (!unit) {\n                        unit = CHARACTER;\n                    }\n                    if (unit == WORD) {\n                        var wordOptions = expandOptions.wordOptions;\n                        var startPos = session.getRangeBoundaryPosition(this, true);\n                        var endPos = session.getRangeBoundaryPosition(this, false);\n\n                        var startTokenizedTextProvider = createTokenizedTextProvider(startPos, characterOptions, wordOptions);\n                        var startToken = startTokenizedTextProvider.nextEndToken();\n                        var newStartPos = startToken.chars[0].previousVisible();\n                        var endToken, newEndPos;\n\n                        if (this.collapsed) {\n                            endToken = startToken;\n                        } else {\n                            var endTokenizedTextProvider = createTokenizedTextProvider(endPos, characterOptions, wordOptions);\n                            endToken = endTokenizedTextProvider.previousStartToken();\n                        }\n                        newEndPos = endToken.chars[endToken.chars.length - 1];\n\n                        if (!newStartPos.equals(startPos)) {\n                            this.setStart(newStartPos.node, newStartPos.offset);\n                            moved = true;\n                        }\n                        if (newEndPos && !newEndPos.equals(endPos)) {\n                            this.setEnd(newEndPos.node, newEndPos.offset);\n                            moved = true;\n                        }\n\n                        if (expandOptions.trim) {\n                            if (expandOptions.trimStart) {\n                                moved = this.trimStart(characterOptions) || moved;\n                            }\n                            if (expandOptions.trimEnd) {\n                                moved = this.trimEnd(characterOptions) || moved;\n                            }\n                        }\n\n                        return moved;\n                    } else {\n                        return this.moveEnd(CHARACTER, 1, expandOptions);\n                    }\n                }\n            ),\n\n            text: createEntryPointFunction(\n                function(session, characterOptions) {\n                    return this.collapsed ?\n                        \"\" : getRangeCharacters(session, this, createOptions(characterOptions, defaultCharacterOptions)).join(\"\");\n                }\n            ),\n\n            selectCharacters: createEntryPointFunction(\n                function(session, containerNode, startIndex, endIndex, characterOptions) {\n                    var moveOptions = { characterOptions: characterOptions };\n                    if (!containerNode) {\n                        containerNode = getBody( this.getDocument() );\n                    }\n                    this.selectNodeContents(containerNode);\n                    this.collapse(true);\n                    this.moveStart(\"character\", startIndex, moveOptions);\n                    this.collapse(true);\n                    this.moveEnd(\"character\", endIndex - startIndex, moveOptions);\n                }\n            ),\n\n            // Character indexes are relative to the start of node\n            toCharacterRange: createEntryPointFunction(\n                function(session, containerNode, characterOptions) {\n                    if (!containerNode) {\n                        containerNode = getBody( this.getDocument() );\n                    }\n                    var parent = containerNode.parentNode, nodeIndex = dom.getNodeIndex(containerNode);\n                    var rangeStartsBeforeNode = (dom.comparePoints(this.startContainer, this.endContainer, parent, nodeIndex) == -1);\n                    var rangeBetween = this.cloneRange();\n                    var startIndex, endIndex;\n                    if (rangeStartsBeforeNode) {\n                        rangeBetween.setStartAndEnd(this.startContainer, this.startOffset, parent, nodeIndex);\n                        startIndex = -rangeBetween.text(characterOptions).length;\n                    } else {\n                        rangeBetween.setStartAndEnd(parent, nodeIndex, this.startContainer, this.startOffset);\n                        startIndex = rangeBetween.text(characterOptions).length;\n                    }\n                    endIndex = startIndex + this.text(characterOptions).length;\n\n                    return {\n                        start: startIndex,\n                        end: endIndex\n                    };\n                }\n            ),\n\n            findText: createEntryPointFunction(\n                function(session, searchTermParam, findOptions) {\n                    // Set up options\n                    findOptions = createNestedOptions(findOptions, defaultFindOptions);\n\n                    // Create word options if we're matching whole words only\n                    if (findOptions.wholeWordsOnly) {\n                        // We don't ever want trailing spaces for search results\n                        findOptions.wordOptions.includeTrailingSpace = false;\n                    }\n\n                    var backward = isDirectionBackward(findOptions.direction);\n\n                    // Create a range representing the search scope if none was provided\n                    var searchScopeRange = findOptions.withinRange;\n                    if (!searchScopeRange) {\n                        searchScopeRange = api.createRange();\n                        searchScopeRange.selectNodeContents(this.getDocument());\n                    }\n\n                    // Examine and prepare the search term\n                    var searchTerm = searchTermParam, isRegex = false;\n                    if (typeof searchTerm == \"string\") {\n                        if (!findOptions.caseSensitive) {\n                            searchTerm = searchTerm.toLowerCase();\n                        }\n                    } else {\n                        isRegex = true;\n                    }\n\n                    var initialPos = session.getRangeBoundaryPosition(this, !backward);\n\n                    // Adjust initial position if it lies outside the search scope\n                    var comparison = searchScopeRange.comparePoint(initialPos.node, initialPos.offset);\n\n                    if (comparison === -1) {\n                        initialPos = session.getRangeBoundaryPosition(searchScopeRange, true);\n                    } else if (comparison === 1) {\n                        initialPos = session.getRangeBoundaryPosition(searchScopeRange, false);\n                    }\n\n                    var pos = initialPos;\n                    var wrappedAround = false;\n\n                    // Try to find a match and ignore invalid ones\n                    var findResult;\n                    while (true) {\n                        findResult = findTextFromPosition(pos, searchTerm, isRegex, searchScopeRange, findOptions);\n\n                        if (findResult) {\n                            if (findResult.valid) {\n                                this.setStartAndEnd(findResult.startPos.node, findResult.startPos.offset, findResult.endPos.node, findResult.endPos.offset);\n                                return true;\n                            } else {\n                                // We've found a match that is not a whole word, so we carry on searching from the point immediately\n                                // after the match\n                                pos = backward ? findResult.startPos : findResult.endPos;\n                            }\n                        } else if (findOptions.wrap && !wrappedAround) {\n                            // No result found but we're wrapping around and limiting the scope to the unsearched part of the range\n                            searchScopeRange = searchScopeRange.cloneRange();\n                            pos = session.getRangeBoundaryPosition(searchScopeRange, !backward);\n                            searchScopeRange.setBoundary(initialPos.node, initialPos.offset, backward);\n                            wrappedAround = true;\n                        } else {\n                            // Nothing found and we can't wrap around, so we're done\n                            return false;\n                        }\n                    }\n                }\n            ),\n\n            pasteHtml: function(html) {\n                this.deleteContents();\n                if (html) {\n                    var frag = this.createContextualFragment(html);\n                    var lastChild = frag.lastChild;\n                    this.insertNode(frag);\n                    this.collapseAfter(lastChild);\n                }\n            }\n        });\n\n        /*----------------------------------------------------------------------------------------------------------------*/\n\n        // Extensions to the Rangy Selection object\n\n        function createSelectionTrimmer(methodName) {\n            return createEntryPointFunction(\n                function(session, characterOptions) {\n                    var trimmed = false;\n                    this.changeEachRange(function(range) {\n                        trimmed = range[methodName](characterOptions) || trimmed;\n                    });\n                    return trimmed;\n                }\n            );\n        }\n\n        extend(api.selectionPrototype, {\n            expand: createEntryPointFunction(\n                function(session, unit, expandOptions) {\n                    this.changeEachRange(function(range) {\n                        range.expand(unit, expandOptions);\n                    });\n                }\n            ),\n\n            move: createEntryPointFunction(\n                function(session, unit, count, options) {\n                    var unitsMoved = 0;\n                    if (this.focusNode) {\n                        this.collapse(this.focusNode, this.focusOffset);\n                        var range = this.getRangeAt(0);\n                        if (!options) {\n                            options = {};\n                        }\n                        options.characterOptions = createOptions(options.characterOptions, defaultCaretCharacterOptions);\n                        unitsMoved = range.move(unit, count, options);\n                        this.setSingleRange(range);\n                    }\n                    return unitsMoved;\n                }\n            ),\n\n            trimStart: createSelectionTrimmer(\"trimStart\"),\n            trimEnd: createSelectionTrimmer(\"trimEnd\"),\n            trim: createSelectionTrimmer(\"trim\"),\n\n            selectCharacters: createEntryPointFunction(\n                function(session, containerNode, startIndex, endIndex, direction, characterOptions) {\n                    var range = api.createRange(containerNode);\n                    range.selectCharacters(containerNode, startIndex, endIndex, characterOptions);\n                    this.setSingleRange(range, direction);\n                }\n            ),\n\n            saveCharacterRanges: createEntryPointFunction(\n                function(session, containerNode, characterOptions) {\n                    var ranges = this.getAllRanges(), rangeCount = ranges.length;\n                    var rangeInfos = [];\n\n                    var backward = rangeCount == 1 && this.isBackward();\n\n                    for (var i = 0, len = ranges.length; i < len; ++i) {\n                        rangeInfos[i] = {\n                            characterRange: ranges[i].toCharacterRange(containerNode, characterOptions),\n                            backward: backward,\n                            characterOptions: characterOptions\n                        };\n                    }\n\n                    return rangeInfos;\n                }\n            ),\n\n            restoreCharacterRanges: createEntryPointFunction(\n                function(session, containerNode, saved) {\n                    this.removeAllRanges();\n                    for (var i = 0, len = saved.length, range, rangeInfo, characterRange; i < len; ++i) {\n                        rangeInfo = saved[i];\n                        characterRange = rangeInfo.characterRange;\n                        range = api.createRange(containerNode);\n                        range.selectCharacters(containerNode, characterRange.start, characterRange.end, rangeInfo.characterOptions);\n                        this.addRange(range, rangeInfo.backward);\n                    }\n                }\n            ),\n\n            text: createEntryPointFunction(\n                function(session, characterOptions) {\n                    var rangeTexts = [];\n                    for (var i = 0, len = this.rangeCount; i < len; ++i) {\n                        rangeTexts[i] = this.getRangeAt(i).text(characterOptions);\n                    }\n                    return rangeTexts.join(\"\");\n                }\n            )\n        });\n\n        /*----------------------------------------------------------------------------------------------------------------*/\n\n        // Extensions to the core rangy object\n\n        api.innerText = function(el, characterOptions) {\n            var range = api.createRange(el);\n            range.selectNodeContents(el);\n            var text = range.text(characterOptions);\n            return text;\n        };\n\n        api.createWordIterator = function(startNode, startOffset, iteratorOptions) {\n            var session = getSession();\n            iteratorOptions = createNestedOptions(iteratorOptions, defaultWordIteratorOptions);\n            var startPos = session.getPosition(startNode, startOffset);\n            var tokenizedTextProvider = createTokenizedTextProvider(startPos, iteratorOptions.characterOptions, iteratorOptions.wordOptions);\n            var backward = isDirectionBackward(iteratorOptions.direction);\n\n            return {\n                next: function() {\n                    return backward ? tokenizedTextProvider.previousStartToken() : tokenizedTextProvider.nextEndToken();\n                },\n\n                dispose: function() {\n                    tokenizedTextProvider.dispose();\n                    this.next = function() {};\n                }\n            };\n        };\n\n        /*----------------------------------------------------------------------------------------------------------------*/\n\n        api.noMutation = function(func) {\n            var session = getSession();\n            func(session);\n            endSession();\n        };\n\n        api.noMutation.createEntryPointFunction = createEntryPointFunction;\n\n        api.textRange = {\n            isBlockNode: isBlockNode,\n            isCollapsedWhitespaceNode: isCollapsedWhitespaceNode,\n\n            createPosition: createEntryPointFunction(\n                function(session, node, offset) {\n                    return session.getPosition(node, offset);\n                }\n            )\n        };\n    });\n    \n    return rangy;\n}, this);\n/*\n@license textAngular\nAuthor : Austin Anderson\nLicense : 2013 MIT\nVersion 1.5.16\n\nSee README.md or https://github.com/fraywing/textAngular/wiki for requirements and use.\n*/\n\n/*\nCommonjs package manager support (eg componentjs).\n*/\n\n\n\"use strict\";// NOTE: textAngularVersion must match the Gruntfile.js 'setVersion' task.... and have format v/d+./d+./d+\nvar textAngularVersion = 'v1.5.16';   // This is automatically updated during the build process to the current release!\n\n\n// IE version detection - http://stackoverflow.com/questions/4169160/javascript-ie-detection-why-not-use-simple-conditional-comments\n// We need this as IE sometimes plays funny tricks with the contenteditable.\n// ----------------------------------------------------------\n// If you're not in IE (or IE version is less than 5) then:\n// ie === undefined\n// If you're in IE (>=5) then you can determine which version:\n// ie === 7; // IE7\n// Thus, to detect IE:\n// if (ie) {}\n// And to detect the version:\n// ie === 6 // IE6\n// ie > 7 // IE8, IE9, IE10 ...\n// ie < 9 // Anything less than IE9\n// ----------------------------------------------------------\n/* istanbul ignore next: untestable browser check */\nvar _browserDetect = {\n\tie: (function(){\n\t\tvar undef,\n\t\t\tv = 3,\n\t\t\tdiv = document.createElement('div'),\n\t\t\tall = div.getElementsByTagName('i');\n\n\t\twhile (\n\t\t\tdiv.innerHTML = '<!--[if gt IE ' + (++v) + ']><i></i><![endif]-->',\n\t\t\tall[0]\n\t\t);\n\n\t\treturn v > 4 ? v : undef;\n\t}()),\n\twebkit: /AppleWebKit\\/([\\d.]+)/i.test(navigator.userAgent),\n\tisFirefox: navigator.userAgent.toLowerCase().indexOf('firefox') > -1\n};\n\n// Global to textAngular to measure performance where needed\n/* istanbul ignore next: untestable browser check */\nvar performance = performance || {};\n/* istanbul ignore next: untestable browser check */\nperformance.now = (function() {\n\treturn performance.now       ||\n\t\tperformance.mozNow    ||\n\t\tperformance.msNow     ||\n\t\tperformance.oNow      ||\n\t\tperformance.webkitNow ||\n\t\tfunction() { return new Date().getTime(); };\n})();\n// usage is:\n// var t0 = performance.now();\n// doSomething();\n// var t1 = performance.now();\n// console.log('Took', (t1 - t0).toFixed(4), 'milliseconds to do something!');\n//\n\n// turn html into pure text that shows visiblity\nfunction stripHtmlToText(html)\n{\n\tvar tmp = document.createElement(\"DIV\");\n\ttmp.innerHTML = html;\n\tvar res = tmp.textContent || tmp.innerText || '';\n\tres.replace('\\u200B', ''); // zero width space\n\tres = res.trim();\n\treturn res;\n}\n// get html\nfunction getDomFromHtml(html)\n{\n\tvar tmp = document.createElement(\"DIV\");\n\ttmp.innerHTML = html;\n\treturn tmp;\n}\n\n\n// Global to textAngular REGEXP vars for block and list elements.\n\nvar BLOCKELEMENTS = /^(address|article|aside|audio|blockquote|canvas|center|dd|div|dl|fieldset|figcaption|figure|footer|form|h1|h2|h3|h4|h5|h6|header|hgroup|hr|noscript|ol|output|p|pre|section|table|tfoot|ul|video)$/i;\nvar LISTELEMENTS = /^(ul|li|ol)$/i;\n// updated VALIDELEMENTS to include #text and span so that we can use nodeName instead of tagName\nvar VALIDELEMENTS = /^(#text|span|address|article|aside|audio|blockquote|canvas|center|dd|div|dl|fieldset|figcaption|figure|footer|form|h1|h2|h3|h4|h5|h6|header|hgroup|hr|noscript|ol|output|p|pre|section|table|tfoot|ul|video|li)$/i;\n\n\n// https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/String/Trim#Compatibility\n/* istanbul ignore next: trim shim for older browsers */\nif (!String.prototype.trim) {\n\tString.prototype.trim = function () {\n\t\treturn this.replace(/^\\s+|\\s+$/g, '');\n\t};\n}\n\n/*\n\tCustom stylesheet for the placeholders rules.\n\tCredit to: http://davidwalsh.name/add-rules-stylesheets\n*/\nvar sheet, addCSSRule, removeCSSRule, _addCSSRule, _removeCSSRule, _getRuleIndex;\n/* istanbul ignore else: IE <8 test*/\nif(_browserDetect.ie > 8 || _browserDetect.ie === undefined){\n\tvar _sheets = document.styleSheets;\n\t/* istanbul ignore next: preference for stylesheet loaded externally */\n\tfor(var i = 0; i < _sheets.length; i++){\n\t\tif(_sheets[i].media.length === 0 || _sheets[i].media.mediaText.match(/(all|screen)/ig)){\n\t\t\tif(_sheets[i].href){\n\t\t\t\tif(_sheets[i].href.match(/textangular\\.(min\\.|)css/ig)){\n\t\t\t\t\tsheet = _sheets[i];\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\t/* istanbul ignore next: preference for stylesheet loaded externally */\n\tif(!sheet){\n\t\t// this sheet is used for the placeholders later on.\n\t\tsheet = (function() {\n\t\t\t// Create the <style> tag\n\t\t\tvar style = document.createElement(\"style\");\n\t\t\t/* istanbul ignore else : WebKit hack :( */\n\t\t\tif(_browserDetect.webkit) style.appendChild(document.createTextNode(\"\"));\n\n\t\t\t// Add the <style> element to the page, add as first so the styles can be overridden by custom stylesheets\n\t\t\tdocument.getElementsByTagName('head')[0].appendChild(style);\n\n\t\t\treturn style.sheet;\n\t\t})();\n\t}\n\n\t// use as: addCSSRule(\"header\", \"float: left\");\n\taddCSSRule = function(selector, rules) {\n\t\treturn _addCSSRule(sheet, selector, rules);\n\t};\n\t_addCSSRule = function(_sheet, selector, rules){\n\t\tvar insertIndex;\n\t\tvar insertedRule;\n\t\t// This order is important as IE 11 has both cssRules and rules but they have different lengths - cssRules is correct, rules gives an error in IE 11\n\t\t/* istanbul ignore next: browser catches */\n\t\tif(_sheet.cssRules) insertIndex = Math.max(_sheet.cssRules.length - 1, 0);\n\t\telse if(_sheet.rules) insertIndex = Math.max(_sheet.rules.length - 1, 0);\n\n\t\t/* istanbul ignore else: untestable IE option */\n\t\tif(_sheet.insertRule) {\n\t\t\t_sheet.insertRule(selector + \"{\" + rules + \"}\", insertIndex);\n\t\t}\n\t\telse {\n\t\t\t_sheet.addRule(selector, rules, insertIndex);\n\t\t}\n\t\t/* istanbul ignore next: browser catches */\n\t\tif(sheet.rules) insertedRule = sheet.rules[insertIndex];\n\t\telse if(sheet.cssRules) insertedRule = sheet.cssRules[insertIndex];\n\t\t// return the inserted stylesheet rule\n\t\treturn insertedRule;\n\t};\n\n\t_getRuleIndex = function(rule, rules) {\n\t\tvar i, ruleIndex;\n\t\tfor (i=0; i < rules.length; i++) {\n\t\t\t/* istanbul ignore else: check for correct rule */\n\t\t\tif (rules[i].cssText === rule.cssText) {\n\t\t\t\truleIndex = i;\n\t\t\t\tbreak;\n\t\t\t}\n\t\t}\n\t\treturn ruleIndex;\n\t};\n\n\tremoveCSSRule = function(rule){\n\t\t_removeCSSRule(sheet, rule);\n\t};\n\t/* istanbul ignore next: tests are browser specific */\n\t_removeCSSRule = function(sheet, rule){\n\t\tvar rules = sheet.cssRules || sheet.rules;\n\t\tif(!rules || rules.length === 0) return;\n\t\tvar ruleIndex = _getRuleIndex(rule, rules);\n\t\tif(sheet.removeRule){\n\t\t\tsheet.removeRule(ruleIndex);\n\t\t}else{\n\t\t\tsheet.deleteRule(ruleIndex);\n\t\t}\n\t};\n}\n\nangular.module('textAngular.factories', [])\n.factory('taBrowserTag', [function(){\n    return function(tag){\n        /* istanbul ignore next: ie specific test */\n        if(!tag) return (_browserDetect.ie <= 8)? 'P' : 'p';\n        else if(tag === '') return (_browserDetect.ie === undefined)? 'div' : (_browserDetect.ie <= 8)? 'P' : 'p';\n        else return (_browserDetect.ie <= 8)? tag.toUpperCase() : tag;\n    };\n}]).factory('taApplyCustomRenderers', ['taCustomRenderers', 'taDOM', function(taCustomRenderers, taDOM){\n    return function(val){\n        var element = angular.element('<div></div>');\n        element[0].innerHTML = val;\n\n        angular.forEach(taCustomRenderers, function(renderer){\n            var elements = [];\n            // get elements based on what is defined. If both defined do secondary filter in the forEach after using selector string\n            if(renderer.selector && renderer.selector !== '')\n                elements = element.find(renderer.selector);\n            /* istanbul ignore else: shouldn't fire, if it does we're ignoring everything */\n            else if(renderer.customAttribute && renderer.customAttribute !== '')\n                elements = taDOM.getByAttribute(element, renderer.customAttribute);\n            // process elements if any found\n            angular.forEach(elements, function(_element){\n                _element = angular.element(_element);\n                if(renderer.selector && renderer.selector !== '' && renderer.customAttribute && renderer.customAttribute !== ''){\n                    if(_element.attr(renderer.customAttribute) !== undefined) renderer.renderLogic(_element);\n                } else renderer.renderLogic(_element);\n            });\n        });\n\n        return element[0].innerHTML;\n    };\n}]).factory('taFixChrome', function(){\n    // get whaterever rubbish is inserted in chrome\n    // should be passed an html string, returns an html string\n    var taFixChrome = function(html, keepStyles){\n        if(!html || !angular.isString(html) || html.length <= 0) return html;\n        // grab all elements with a style attibute\n        // a betterSpanMatch matches only a style=... with matching quotes\n        // this captures the whole:\n        // 'style=\"background-color: rgb(255, 255, 255);\"'\n        var betterSpanMatch = /style\\s?=\\s?([\"'])(?:(?=(\\\\?))\\2.)*?\\1/ig;\n        // where the original spanMatch = /<([^>\\/]+?)style=(\"([^\\\"]+)\"|'([^']+)')([^>]*)>/ig;\n        // captures too much and includes the front tag!\n        var spanMatch = /<([^>\\/]+?)style=(\"([^\\\"]+)\"|'([^']+)')([^>]*)>/ig;\n        var appleConvertedSpaceMatch = /<span class=\"Apple-converted-space\">([^<]+)<\\/span>/ig;\n        var match, styleVal, appleSpaceVal, newTag, finalHtml = '', lastIndex = 0;\n        // remove all the Apple-converted-space spans and replace with the content of the span\n        //console.log('before:', html);\n        /* istanbul ignore next: apple-contereted-space span match */\n        while(match = appleConvertedSpaceMatch.exec(html)){\n            appleSpaceVal = match[1];\n            appleSpaceVal = appleSpaceVal.replace(/&nbsp;/ig, ' ');\n            finalHtml += html.substring(lastIndex, match.index) + appleSpaceVal;\n            lastIndex = match.index + match[0].length;\n        }\n        /* istanbul ignore next: apple-contereted-space span has matched */\n        if (lastIndex) {\n            // modified....\n            finalHtml += html.substring(lastIndex);\n            html=finalHtml;\n            finalHtml='';\n            lastIndex=0;\n        }\n        /////////////////////////////////////////////////////////////\n        //\n        // Allow control of this modification\n        // taKeepStyles: False - removes these modification\n        //\n        // taFixChrome removes the following styles:\n        //    font-family: inherit;\n        //    line-height: <number>\n        //    color: inherit;\n        //    color: rgb( <rgb-component>#{3} )\n        //    background-color: rgb( <rgb-component>#{3} )\n        //\n        /////////////////////////////////////////////////////////////\n        if (!keepStyles) {\n            while (match = betterSpanMatch.exec(html)) {\n                finalHtml += html.substring(lastIndex, match.index-1);\n                styleVal = match[0];\n                // test for chrome inserted junk\n                match = /font-family: inherit;|line-height: 1.[0-9]{3,12};|color: inherit; line-height: 1.1;|color: rgb\\(\\d{1,3}, \\d{1,3}, \\d{1,3}\\);|background-color: rgb\\(\\d{1,3}, \\d{1,3}, \\d{1,3}\\);/gi.exec(styleVal);\n                if (match) {\n                    styleVal = styleVal.replace(/( |)font-family: inherit;|( |)line-height: 1.[0-9]{3,12};|( |)color: inherit;|( |)color: rgb\\(\\d{1,3}, \\d{1,3}, \\d{1,3}\\);|( |)background-color: rgb\\(\\d{1,3}, \\d{1,3}, \\d{1,3}\\);/ig, '');\n                    //console.log(styleVal, styleVal.length);\n                    if (styleVal.length > 8) {\n                        finalHtml += ' ' + styleVal;\n                    }\n                } else {\n                    finalHtml += ' ' + styleVal;\n                }\n                lastIndex = betterSpanMatch.lastIndex;\n            }\n            finalHtml += html.substring(lastIndex);\n        }\n        //console.log('final:', finalHtml);\n        // only replace when something has changed, else we get focus problems on inserting lists\n        if(lastIndex > 0){\n            // replace all empty strings\n            var fe = finalHtml.replace(/<span\\s?>(.*?)<\\/span>(<br(\\/|)>|)/ig, '$1');\n            return fe;\n        } else return html;\n    };\n    return taFixChrome;\n}).factory('taSanitize', ['$sanitize', function taSanitizeFactory($sanitize){\n\n    var convert_infos = [\n        {\n            property: 'font-weight',\n            values: [ 'bold' ],\n            tag: 'b'\n        },\n        {\n            property: 'font-style',\n            values: [ 'italic' ],\n            tag: 'i'\n        }\n    ];\n\n    var styleMatch = [];\n    for(var i = 0; i < convert_infos.length; i++){\n        var _partialStyle = '(' + convert_infos[i].property + ':\\\\s*(';\n        for(var j = 0; j < convert_infos[i].values.length; j++){\n            /* istanbul ignore next: not needed to be tested yet */\n            if(j > 0) _partialStyle += '|';\n            _partialStyle += convert_infos[i].values[j];\n        }\n        _partialStyle += ');)';\n        styleMatch.push(_partialStyle);\n    }\n    var styleRegexString = '(' + styleMatch.join('|') + ')';\n\n    function wrapNested(html, wrapTag) {\n        var depth = 0;\n        var lastIndex = 0;\n        var match;\n        var tagRegex = /<[^>]*>/ig;\n        while(match = tagRegex.exec(html)){\n            lastIndex = match.index;\n            if(match[0].substr(1, 1) === '/'){\n                if(depth === 0) break;\n                else depth--;\n            }else depth++;\n        }\n        return wrapTag +\n            html.substring(0, lastIndex) +\n            // get the start tags reversed - this is safe as we construct the strings with no content except the tags\n            angular.element(wrapTag)[0].outerHTML.substring(wrapTag.length) +\n            html.substring(lastIndex);\n    }\n\n    function transformLegacyStyles(html){\n        if(!html || !angular.isString(html) || html.length <= 0) return html;\n        var i;\n        var styleElementMatch = /<([^>\\/]+?)style=(\"([^\"]+)\"|'([^']+)')([^>]*)>/ig;\n        var match, subMatch, styleVal, newTag, lastNewTag = '', newHtml, finalHtml = '', lastIndex = 0;\n        while(match = styleElementMatch.exec(html)){\n            // one of the quoted values ' or \"\n            /* istanbul ignore next: quotations match */\n            styleVal = match[3] || match[4];\n            var styleRegex = new RegExp(styleRegexString, 'i');\n            // test for style values to change\n            if(angular.isString(styleVal) && styleRegex.test(styleVal)){\n                // remove build tag list\n                newTag = '';\n                // init regex here for exec\n                var styleRegexExec = new RegExp(styleRegexString, 'ig');\n                // find relevand tags and build a string of them\n                while(subMatch = styleRegexExec.exec(styleVal)){\n                    for(i = 0; i < convert_infos.length; i++){\n                        if(!!subMatch[(i*2) + 2]){\n                            newTag += '<' + convert_infos[i].tag + '>';\n                        }\n                    }\n                }\n                // recursively find more legacy styles in html before this tag and after the previous match (if any)\n                newHtml = transformLegacyStyles(html.substring(lastIndex, match.index));\n                // build up html\n                if(lastNewTag.length > 0){\n                    finalHtml += wrapNested(newHtml, lastNewTag);\n                }else finalHtml += newHtml;\n                // grab the style val without the transformed values\n                styleVal = styleVal.replace(new RegExp(styleRegexString, 'ig'), '');\n                // build the html tag\n                finalHtml += '<' + match[1].trim();\n                if(styleVal.length > 0) finalHtml += ' style=\"' + styleVal + '\"';\n                finalHtml += match[5] + '>';\n                // update the start index to after this tag\n                lastIndex = match.index + match[0].length;\n                lastNewTag = newTag;\n            }\n        }\n        if(lastNewTag.length > 0){\n            finalHtml += wrapNested(html.substring(lastIndex), lastNewTag);\n        }\n        else finalHtml += html.substring(lastIndex);\n        return finalHtml;\n    }\n\n    function transformLegacyAttributes(html){\n        if(!html || !angular.isString(html) || html.length <= 0) return html;\n        // replace all align='...' tags with text-align attributes\n        var attrElementMatch = /<([^>\\/]+?)align=(\"([^\"]+)\"|'([^']+)')([^>]*)>/ig;\n        var match, finalHtml = '', lastIndex = 0;\n        // match all attr tags\n        while(match = attrElementMatch.exec(html)){\n            // add all html before this tag\n            finalHtml += html.substring(lastIndex, match.index);\n            // record last index after this tag\n            lastIndex = match.index + match[0].length;\n            // construct tag without the align attribute\n            var newTag = '<' + match[1] + match[5];\n            // add the style attribute\n            if(/style=(\"([^\"]+)\"|'([^']+)')/ig.test(newTag)){\n                /* istanbul ignore next: quotations match */\n                newTag = newTag.replace(/style=(\"([^\"]+)\"|'([^']+)')/i, 'style=\"$2$3 text-align:' + (match[3] || match[4]) + ';\"');\n            }else{\n                /* istanbul ignore next: quotations match */\n                newTag += ' style=\"text-align:' + (match[3] || match[4]) + ';\"';\n            }\n            newTag += '>';\n            // add to html\n            finalHtml += newTag;\n        }\n        // return with remaining html\n        return finalHtml + html.substring(lastIndex);\n    }\n\n    // use precompiled regexp for speed\n    var rsb1 = new RegExp(/<span id=\"selectionBoundary_\\d+_\\d+\" class=\"rangySelectionBoundary\">[^<>]+?<\\/span>/ig);\n    var rsb2 = new RegExp(/<span class=\"rangySelectionBoundary\" id=\"selectionBoundary_\\d+_\\d+\">[^<>]+?<\\/span>/ig);\n    var rsb3 = new RegExp(/<span id=\"selectionBoundary_\\d+_\\d+\" class=\"rangySelectionBoundary\">[^<>]+?<\\/span>/ig);\n\n    return function taSanitize(unsafe, oldsafe, ignore){\n        // unsafe html should NEVER built into a DOM object via angular.element. This allows XSS to be inserted and run.\n        if ( !ignore ) {\n            try {\n                unsafe = transformLegacyStyles(unsafe);\n            } catch (e) {\n            }\n        }\n\n        // unsafe and oldsafe should be valid HTML strings\n        // any exceptions (lets say, color for example) should be made here but with great care\n        // setup unsafe element for modification\n        unsafe = transformLegacyAttributes(unsafe);\n\n        // we had an issue in the past, where we dumped a whole bunch of <span>'s into the content...\n        // so we remove them here\n        // IN A FUTURE release this can be removed after all have updated through release 1.5.9\n        if (unsafe) {\n            try {\n                unsafe = unsafe.replace(rsb1, '');\n                unsafe = unsafe.replace(rsb2, '');\n                unsafe = unsafe.replace(rsb1, '');\n                unsafe = unsafe.replace(rsb3, '');\n            } catch (e) {\n            }\n        }\n\n        var safe;\n        try {\n            safe = $sanitize(unsafe);\n            // do this afterwards, then the $sanitizer should still throw for bad markup\n            if(ignore) safe = unsafe;\n        } catch (e){\n            safe = oldsafe || '';\n        }\n\n        // Do processing for <pre> tags, removing tabs and return carriages outside of them\n\n        var _preTags = safe.match(/(<pre[^>]*>.*?<\\/pre[^>]*>)/ig);\n        var processedSafe = safe.replace(/(&#(9|10);)*/ig, '');\n        var re = /<pre[^>]*>.*?<\\/pre[^>]*>/ig;\n        var index = 0;\n        var lastIndex = 0;\n        var origTag;\n        safe = '';\n        while((origTag = re.exec(processedSafe)) !== null && index < _preTags.length){\n            safe += processedSafe.substring(lastIndex, origTag.index) + _preTags[index];\n            lastIndex = origTag.index + origTag[0].length;\n            index++;\n        }\n        return safe + processedSafe.substring(lastIndex);\n    };\n}]).factory('taToolExecuteAction', ['$q', '$log', function($q, $log){\n    // this must be called on a toolScope or instance\n    return function(editor){\n        if(editor !== undefined) this.$editor = function(){ return editor; };\n        var deferred = $q.defer(),\n            promise = deferred.promise,\n            _editor = this.$editor();\n        // pass into the action the deferred function and also the function to reload the current selection if rangy available\n        var result;\n        try{\n            result = this.action(deferred, _editor.startAction());\n            // We set the .finally callback here to make sure it doesn't get executed before any other .then callback.\n            promise['finally'](function(){\n                _editor.endAction.call(_editor);\n            });\n        }catch(exc){\n            $log.error(exc);\n        }\n        if(result || result === undefined){\n            // if true or undefined is returned then the action has finished. Otherwise the deferred action will be resolved manually.\n            deferred.resolve();\n        }\n    };\n}]);\n\nangular.module('textAngular.DOM', ['textAngular.factories'])\n.factory('taExecCommand', ['taSelection', 'taBrowserTag', '$document', function(taSelection, taBrowserTag, $document){\n    var listToDefault = function(listElement, defaultWrap){\n        var $target, i;\n        // if all selected then we should remove the list\n        // grab all li elements and convert to taDefaultWrap tags\n        var children = listElement.find('li');\n        for(i = children.length - 1; i >= 0; i--){\n            $target = angular.element('<' + defaultWrap + '>' + children[i].innerHTML + '</' + defaultWrap + '>');\n            listElement.after($target);\n        }\n        listElement.remove();\n        taSelection.setSelectionToElementEnd($target[0]);\n    };\n    var listElementToSelfTag = function(list, listElement, selfTag, bDefault, defaultWrap){\n        var $target, i;\n        // if all selected then we should remove the list\n        // grab all li elements\n        var priorElement;\n        var nextElement;\n        var children = list.find('li');\n        var foundIndex;\n        for (i = 0; i<children.length; i++) {\n            if (children[i].outerHTML === listElement[0].outerHTML) {\n                // found it...\n                foundIndex = i;\n                if (i>0) {\n                    priorElement = children[i-1];\n                }\n                if (i+1<children.length) {\n                    nextElement = children[i+1];\n                }\n                break;\n            }\n        }\n        //console.log('listElementToSelfTag', list, listElement, selfTag, bDefault, priorElement, nextElement);\n        // un-list the listElement\n        var html = '';\n        if (bDefault) {\n            html += '<' + defaultWrap + '>' + listElement[0].innerHTML + '</' + defaultWrap + '>';\n        } else {\n            html += '<' + taBrowserTag(selfTag) + '>';\n            html += '<li>' + listElement[0].innerHTML + '</li>';\n            html += '</' + taBrowserTag(selfTag) + '>';\n        }\n        $target = angular.element(html);\n        //console.log('$target', $target[0]);\n        if (!priorElement) {\n            // this is the first the list, so we just remove it...\n            listElement.remove();\n            list.after(angular.element(list[0].outerHTML));\n            list.after($target);\n            list.remove();\n            taSelection.setSelectionToElementEnd($target[0]);\n            return;\n        } else if (!nextElement) {\n            // this is the last in the list, so we just remove it..\n            listElement.remove();\n            list.after($target);\n            taSelection.setSelectionToElementEnd($target[0]);\n        } else {\n            var p = list.parent();\n            // okay it was some where in the middle... so we need to break apart the list...\n            var html1 = '';\n            var listTag = list[0].nodeName.toLowerCase();\n            html1 += '<' + listTag + '>';\n            for(i = 0; i < foundIndex; i++){\n                html1 += '<li>' + children[i].innerHTML + '</li>';\n            }\n            html1 += '</' + listTag + '>';\n            var html2 = '';\n            html2 += '<' + listTag + '>';\n            for(i = foundIndex+1; i < children.length; i++){\n                html2 += '<li>' + children[i].innerHTML + '</li>';\n            }\n            html2 += '</' + listTag + '>';\n            //console.log(html1, $target[0], html2);\n            list.after(angular.element(html2));\n            list.after($target);\n            list.after(angular.element(html1));\n            list.remove();\n            //console.log('parent ******XXX*****', p[0]);\n            taSelection.setSelectionToElementEnd($target[0]);\n        }\n    };\n    var listElementsToSelfTag = function(list, listElements, selfTag, bDefault, defaultWrap){\n        var $target, i, j, p;\n        // grab all li elements\n        var priorElement;\n        var afterElement;\n        //console.log('list:', list, 'listElements:', listElements, 'selfTag:', selfTag, 'bDefault:', bDefault);\n        var children = list.find('li');\n        var foundIndexes = [];\n        for (i = 0; i<children.length; i++) {\n            for (j = 0; j<listElements.length; j++) {\n                if (children[i].isEqualNode(listElements[j])) {\n                    // found it...\n                    foundIndexes[j] = i;\n                }\n            }\n        }\n        if (foundIndexes[0] > 0) {\n            priorElement = children[foundIndexes[0] - 1];\n        }\n        if (foundIndexes[listElements.length-1] + 1 < children.length) {\n            afterElement = children[foundIndexes[listElements.length-1] + 1];\n        }\n        //console.log('listElementsToSelfTag', list, listElements, selfTag, bDefault, !priorElement, !afterElement, foundIndexes[listElements.length-1], children.length);\n        // un-list the listElements\n        var html = '';\n        if (bDefault) {\n            for (j = 0; j < listElements.length; j++) {\n                html += '<' + defaultWrap + '>' + listElements[j].innerHTML + '</' + defaultWrap + '>';\n                listElements[j].remove();\n            }\n        } else {\n            html += '<' + taBrowserTag(selfTag) + '>';\n            for (j = 0; j < listElements.length; j++) {\n                html += listElements[j].outerHTML;\n                listElements[j].remove();\n            }\n            html += '</' + taBrowserTag(selfTag) + '>';\n        }\n        $target = angular.element(html);\n        if (!priorElement) {\n            // this is the first the list, so we just remove it...\n            list.after(angular.element(list[0].outerHTML));\n            list.after($target);\n            list.remove();\n            taSelection.setSelectionToElementEnd($target[0]);\n            return;\n        } else if (!afterElement) {\n            // this is the last in the list, so we just remove it..\n            list.after($target);\n            taSelection.setSelectionToElementEnd($target[0]);\n            return;\n        } else {\n            // okay it was some where in the middle... so we need to break apart the list...\n            var html1 = '';\n            var listTag = list[0].nodeName.toLowerCase();\n            html1 += '<' + listTag + '>';\n            for(i = 0; i < foundIndexes[0]; i++){\n                html1 += '<li>' + children[i].innerHTML + '</li>';\n            }\n            html1 += '</' + listTag + '>';\n            var html2 = '';\n            html2 += '<' + listTag + '>';\n            for(i = foundIndexes[listElements.length-1]+1; i < children.length; i++){\n                html2 += '<li>' + children[i].innerHTML + '</li>';\n            }\n            html2 += '</' + listTag + '>';\n            list.after(angular.element(html2));\n            list.after($target);\n            list.after(angular.element(html1));\n            list.remove();\n            //console.log('parent ******YYY*****', list.parent()[0]);\n            taSelection.setSelectionToElementEnd($target[0]);\n        }\n    };\n    var selectLi = function(liElement){\n        if(/(<br(|\\/)>)$/i.test(liElement.innerHTML.trim())) taSelection.setSelectionBeforeElement(angular.element(liElement).find(\"br\")[0]);\n        else taSelection.setSelectionToElementEnd(liElement);\n    };\n    var listToList = function(listElement, newListTag){\n        var $target = angular.element('<' + newListTag + '>' + listElement[0].innerHTML + '</' + newListTag + '>');\n        listElement.after($target);\n        listElement.remove();\n        selectLi($target.find('li')[0]);\n    };\n    var childElementsToList = function(elements, listElement, newListTag){\n        var html = '';\n        for(var i = 0; i < elements.length; i++){\n            html += '<' + taBrowserTag('li') + '>' + elements[i].innerHTML + '</' + taBrowserTag('li') + '>';\n        }\n        var $target = angular.element('<' + newListTag + '>' + html + '</' + newListTag + '>');\n        listElement.after($target);\n        listElement.remove();\n        selectLi($target.find('li')[0]);\n    };\n    var turnBlockIntoBlocks = function(element, options) {\n        for(var i = 0; i<element.childNodes.length; i++) {\n            var _n = element.childNodes[i];\n            /* istanbul ignore next - more complex testing*/\n            if (_n.tagName && _n.tagName.match(BLOCKELEMENTS)) {\n                turnBlockIntoBlocks(_n, options);\n            }\n        }\n        /* istanbul ignore next - very rare condition that we do not test*/\n        if (element.parentNode === null) {\n            // nothing left to do..\n            return element;\n        }\n        /* istanbul ignore next - not sure have to test this */\n        if (options === '<br>'){\n            return element;\n        }\n        else {\n            var $target = angular.element(options);\n            $target[0].innerHTML = element.innerHTML;\n            element.parentNode.insertBefore($target[0], element);\n            element.parentNode.removeChild(element);\n            return $target;\n        }\n    };\n    return function(taDefaultWrap, topNode){\n        // NOTE: here we are dealing with the html directly from the browser and not the html the user sees.\n        // IF you want to modify the html the user sees, do it when the user does a switchView\n        taDefaultWrap = taBrowserTag(taDefaultWrap);\n        return function(command, showUI, options, defaultTagAttributes){\n            var i, $target, html, _nodes, next, optionsTagName, selectedElement, ourSelection;\n            var defaultWrapper = angular.element('<' + taDefaultWrap + '>');\n            try{\n                if (taSelection.getSelection) {\n                    ourSelection = taSelection.getSelection();\n                }\n                selectedElement = taSelection.getSelectionElement();\n                // special checks and fixes when we are selecting the whole container\n                var __h, _innerNode;\n                /* istanbul ignore next */\n                if (selectedElement.tagName !== undefined) {\n                    if (selectedElement.tagName.toLowerCase() === 'div' &&\n                        /taTextElement.+/.test(selectedElement.id) &&\n                        ourSelection && ourSelection.start &&\n                        ourSelection.start.offset === 1 &&\n                        ourSelection.end.offset === 1) {\n                        // opps we are actually selecting the whole container!\n                        //console.log('selecting whole container!');\n                        __h = selectedElement.innerHTML;\n                        if (/<br>/i.test(__h)) {\n                            // Firefox adds <br>'s and so we remove the <br>\n                            __h = __h.replace(/<br>/i, '&#8203;');  // no space-space\n                        }\n                        if (/<br\\/>/i.test(__h)) {\n                            // Firefox adds <br/>'s and so we remove the <br/>\n                            __h = __h.replace(/<br\\/>/i, '&#8203;');  // no space-space\n                        }\n                        // remove stacked up <span>'s\n                        if (/<span>(<span>)+/i.test(__h)) {\n                            __h = __.replace(/<span>(<span>)+/i, '<span>');\n                        }\n                        // remove stacked up </span>'s\n                        if (/<\\/span>(<\\/span>)+/i.test(__h)) {\n                            __h = __.replace(/<\\/span>(<\\/span>)+/i, '<\\/span>');\n                        }\n                        if (/<span><\\/span>/i.test(__h)) {\n                            // if we end up with a <span></span> here we remove it...\n                            __h = __h.replace(/<span><\\/span>/i, '');\n                        }\n                        //console.log('inner whole container', selectedElement.childNodes);\n                        _innerNode = '<div>' + __h + '</div>';\n                        selectedElement.innerHTML = _innerNode;\n                        taSelection.setSelectionToElementEnd(selectedElement.childNodes[0]);\n                        selectedElement = taSelection.getSelectionElement();\n                    } else if (selectedElement.tagName.toLowerCase() === 'span' &&\n                        ourSelection && ourSelection.start &&\n                        ourSelection.start.offset === 1 &&\n                        ourSelection.end.offset === 1) {\n                        // just a span -- this is a problem...\n                        //console.log('selecting span!');\n                        __h = selectedElement.innerHTML;\n                        if (/<br>/i.test(__h)) {\n                            // Firefox adds <br>'s and so we remove the <br>\n                            __h = __h.replace(/<br>/i, '&#8203;');  // no space-space\n                        }\n                        if (/<br\\/>/i.test(__h)) {\n                            // Firefox adds <br/>'s and so we remove the <br/>\n                            __h = __h.replace(/<br\\/>/i, '&#8203;');  // no space-space\n                        }\n                        // remove stacked up <span>'s\n                        if (/<span>(<span>)+/i.test(__h)) {\n                            __h = __.replace(/<span>(<span>)+/i, '<span>');\n                        }\n                        // remove stacked up </span>'s\n                        if (/<\\/span>(<\\/span>)+/i.test(__h)) {\n                            __h = __.replace(/<\\/span>(<\\/span>)+/i, '<\\/span>');\n                        }\n                        if (/<span><\\/span>/i.test(__h)) {\n                            // if we end up with a <span></span> here we remove it...\n                            __h = __h.replace(/<span><\\/span>/i, '');\n                        }\n                        //console.log('inner span', selectedElement.childNodes);\n                        // we wrap this in a <div> because otherwise the browser get confused when we attempt to select the whole node\n                        // and the focus is not set correctly no matter what we do\n                        _innerNode = '<div>' + __h + '</div>';\n                        selectedElement.innerHTML = _innerNode;\n                        taSelection.setSelectionToElementEnd(selectedElement.childNodes[0]);\n                        selectedElement = taSelection.getSelectionElement();\n                        //console.log(selectedElement.innerHTML);\n                    } else if (selectedElement.tagName.toLowerCase() === 'p' &&\n                        ourSelection && ourSelection.start &&\n                        ourSelection.start.offset === 1 &&\n                        ourSelection.end.offset === 1) {\n                        //console.log('p special');\n                        // we need to remove the </br> that firefox adds!\n                        __h = selectedElement.innerHTML;\n                        if (/<br>/i.test(__h)) {\n                            // Firefox adds <br>'s and so we remove the <br>\n                            __h = __h.replace(/<br>/i, '&#8203;');  // no space-space\n                            selectedElement.innerHTML = __h;\n                        }\n                    } else if (selectedElement.tagName.toLowerCase() === 'li' &&\n                        ourSelection && ourSelection.start &&\n                        ourSelection.start.offset === ourSelection.end.offset) {\n                        // we need to remove the </br> that firefox adds!\n                        __h = selectedElement.innerHTML;\n                        if (/<br>/i.test(__h)) {\n                            // Firefox adds <br>'s and so we remove the <br>\n                            __h = __h.replace(/<br>/i, '');  // nothing\n                            selectedElement.innerHTML = __h;\n                        }\n                    }\n                }\n            }catch(e){}\n            //console.log('************** selectedElement:', selectedElement);\n            /* istanbul ignore if: */\n            if (!selectedElement){return;}\n            var $selected = angular.element(selectedElement);\n            var tagName = (selectedElement && selectedElement.tagName && selectedElement.tagName.toLowerCase()) ||\n                /* istanbul ignore next: */ \"\";\n            if(command.toLowerCase() === 'insertorderedlist' || command.toLowerCase() === 'insertunorderedlist'){\n                var selfTag = taBrowserTag((command.toLowerCase() === 'insertorderedlist')? 'ol' : 'ul');\n                var selectedElements = taSelection.getOnlySelectedElements();\n                //console.log('PPPPPPPPPPPPP', tagName, selfTag, selectedElements, tagName.match(BLOCKELEMENTS), $selected.hasClass('ta-bind'), $selected.parent()[0].tagName);\n                if (selectedElements.length>1 && (tagName === 'ol' ||  tagName === 'ul' )) {\n                    return listElementsToSelfTag($selected, selectedElements, selfTag, selfTag===tagName, taDefaultWrap);\n                }\n                if(tagName === selfTag){\n                    // if all selected then we should remove the list\n                    // grab all li elements and convert to taDefaultWrap tags\n                    //console.log('tagName===selfTag');\n                    if ($selected[0].childNodes.length !== selectedElements.length && selectedElements.length===1) {\n                        $selected = angular.element(selectedElements[0]);\n                        return listElementToSelfTag($selected.parent(), $selected, selfTag, true, taDefaultWrap);\n                    } else {\n                        return listToDefault($selected, taDefaultWrap);\n                    }\n                }else if(tagName === 'li' &&\n                    $selected.parent()[0].tagName.toLowerCase() === selfTag &&\n                    $selected.parent().children().length === 1){\n                    // catch for the previous statement if only one li exists\n                    return listToDefault($selected.parent(), taDefaultWrap);\n                }else if(tagName === 'li' &&\n                    $selected.parent()[0].tagName.toLowerCase() !== selfTag &&\n                    $selected.parent().children().length === 1){\n                    // catch for the previous statement if only one li exists\n                    return listToList($selected.parent(), selfTag);\n                }else if(tagName.match(BLOCKELEMENTS) && !$selected.hasClass('ta-bind')){\n                    // if it's one of those block elements we have to change the contents\n                    // if it's a ol/ul we are changing from one to the other\n                    if (selectedElements.length) {\n                        if ($selected[0].childNodes.length !== selectedElements.length && selectedElements.length===1) {\n                            //console.log('&&&&&&&&&&&&&&& --------- &&&&&&&&&&&&&&&&', selectedElements[0], $selected[0].childNodes);\n                            $selected = angular.element(selectedElements[0]);\n                            return listElementToSelfTag($selected.parent(), $selected, selfTag, selfTag===tagName, taDefaultWrap);\n                        }\n                    }\n                    if(tagName === 'ol' || tagName === 'ul'){\n                        // now if this is a set of selected elements... behave diferently\n                        return listToList($selected, selfTag);\n                    }else{\n                        var childBlockElements = false;\n                        angular.forEach($selected.children(), function(elem){\n                            if(elem.tagName.match(BLOCKELEMENTS)) {\n                                childBlockElements = true;\n                            }\n                        });\n                        if(childBlockElements){\n                            return childElementsToList($selected.children(), $selected, selfTag);\n                        }else{\n                            return childElementsToList([angular.element('<div>' + selectedElement.innerHTML + '</div>')[0]], $selected, selfTag);\n                        }\n                    }\n                }else if(tagName.match(BLOCKELEMENTS)){\n                    // if we get here then the contents of the ta-bind are selected\n                    _nodes = taSelection.getOnlySelectedElements();\n                    //console.log('_nodes', _nodes, tagName);\n                    if(_nodes.length === 0){\n                        // here is if there is only text in ta-bind ie <div ta-bind>test content</div>\n                        $target = angular.element('<' + selfTag + '><li>' + selectedElement.innerHTML + '</li></' + selfTag + '>');\n                        $selected.html('');\n                        $selected.append($target);\n                    }else if(_nodes.length === 1 && (_nodes[0].tagName.toLowerCase() === 'ol' || _nodes[0].tagName.toLowerCase() === 'ul')){\n                        if(_nodes[0].tagName.toLowerCase() === selfTag){\n                            // remove\n                            return listToDefault(angular.element(_nodes[0]), taDefaultWrap);\n                        }else{\n                            return listToList(angular.element(_nodes[0]), selfTag);\n                        }\n                    }else{\n                        html = '';\n                        var $nodes = [];\n                        for(i = 0; i < _nodes.length; i++){\n                            /* istanbul ignore else: catch for real-world can't make it occur in testing */\n                            if(_nodes[i].nodeType !== 3){\n                                var $n = angular.element(_nodes[i]);\n                                /* istanbul ignore if: browser check only, phantomjs doesn't return children nodes but chrome at least does */\n                                if(_nodes[i].tagName.toLowerCase() === 'li') continue;\n                                else if(_nodes[i].tagName.toLowerCase() === 'ol' || _nodes[i].tagName.toLowerCase() === 'ul'){\n                                    html += $n[0].innerHTML; // if it's a list, add all it's children\n                                }else if(_nodes[i].tagName.toLowerCase() === 'span' && (_nodes[i].childNodes[0].tagName.toLowerCase() === 'ol' || _nodes[i].childNodes[0].tagName.toLowerCase() === 'ul')){\n                                    html += $n[0].childNodes[0].innerHTML; // if it's a list, add all it's children\n                                }else{\n                                    html += '<' + taBrowserTag('li') + '>' + $n[0].innerHTML + '</' + taBrowserTag('li') + '>';\n                                }\n                                $nodes.unshift($n);\n                            }\n                        }\n                        //console.log('$nodes', $nodes);\n                        $target = angular.element('<' + selfTag + '>' + html + '</' + selfTag + '>');\n                        $nodes.pop().replaceWith($target);\n                        angular.forEach($nodes, function($node){ $node.remove(); });\n                    }\n                    taSelection.setSelectionToElementEnd($target[0]);\n                    return;\n                }\n            }else if(command.toLowerCase() === 'formatblock'){\n                optionsTagName = options.toLowerCase().replace(/[<>]/ig, '');\n                if(optionsTagName.trim() === 'default') {\n                    optionsTagName = taDefaultWrap;\n                    options = '<' + taDefaultWrap + '>';\n                }\n                if(tagName === 'li') {\n                    $target = $selected.parent();\n                }\n                else {\n                    $target = $selected;\n                }\n                // find the first blockElement\n                while(!$target[0].tagName || !$target[0].tagName.match(BLOCKELEMENTS) && !$target.parent().attr('contenteditable')){\n                    $target = $target.parent();\n                    /* istanbul ignore next */\n                    tagName = ($target[0].tagName || '').toLowerCase();\n                }\n                if(tagName === optionsTagName){\n                    // $target is wrap element\n                    _nodes = $target.children();\n                    var hasBlock = false;\n                    for(i = 0; i < _nodes.length; i++){\n                        hasBlock = hasBlock || _nodes[i].tagName.match(BLOCKELEMENTS);\n                    }\n                    if(hasBlock){\n                        $target.after(_nodes);\n                        next = $target.next();\n                        $target.remove();\n                        $target = next;\n                    }else{\n                        defaultWrapper.append($target[0].childNodes);\n                        $target.after(defaultWrapper);\n                        $target.remove();\n                        $target = defaultWrapper;\n                    }\n                }else if($target.parent()[0].tagName.toLowerCase() === optionsTagName &&\n                    !$target.parent().hasClass('ta-bind')){\n                    //unwrap logic for parent\n                    var blockElement = $target.parent();\n                    var contents = blockElement.contents();\n                    for(i = 0; i < contents.length; i ++){\n                        /* istanbul ignore next: can't test - some wierd thing with how phantomjs works */\n                        if(blockElement.parent().hasClass('ta-bind') && contents[i].nodeType === 3){\n                            defaultWrapper = angular.element('<' + taDefaultWrap + '>');\n                            defaultWrapper[0].innerHTML = contents[i].outerHTML;\n                            contents[i] = defaultWrapper[0];\n                        }\n                        blockElement.parent()[0].insertBefore(contents[i], blockElement[0]);\n                    }\n                    blockElement.remove();\n                }else if(tagName.match(LISTELEMENTS)){\n                    // wrapping a list element\n                    $target.wrap(options);\n                }else{\n                    // default wrap behaviour\n                    _nodes = taSelection.getOnlySelectedElements();\n                    if(_nodes.length === 0) {\n                        // no nodes at all....\n                        _nodes = [$target[0]];\n                    }\n                    // find the parent block element if any of the nodes are inline or text\n                    for(i = 0; i < _nodes.length; i++){\n                        if(_nodes[i].nodeType === 3 || !_nodes[i].tagName.match(BLOCKELEMENTS)){\n                            while(_nodes[i].nodeType === 3 || !_nodes[i].tagName || !_nodes[i].tagName.match(BLOCKELEMENTS)){\n                                _nodes[i] = _nodes[i].parentNode;\n                            }\n                        }\n                    }\n                    // remove any duplicates from the array of _nodes!\n                    _nodes = _nodes.filter(function(value, index, self) {\n                        return self.indexOf(value) === index;\n                    });\n                    // remove all whole taTextElement if it is here... unless it is the only element!\n                    if (_nodes.length>1) {\n                        _nodes = _nodes.filter(function (value, index, self) {\n                            return !(value.nodeName.toLowerCase() === 'div' && /^taTextElement/.test(value.id));\n                        });\n                    }\n                    if(angular.element(_nodes[0]).hasClass('ta-bind')){\n                        $target = angular.element(options);\n                        $target[0].innerHTML = _nodes[0].innerHTML;\n                        _nodes[0].innerHTML = $target[0].outerHTML;\n                    }else if(optionsTagName === 'blockquote'){\n                        // blockquotes wrap other block elements\n                        html = '';\n                        for(i = 0; i < _nodes.length; i++){\n                            html += _nodes[i].outerHTML;\n                        }\n                        $target = angular.element(options);\n                        $target[0].innerHTML = html;\n                        _nodes[0].parentNode.insertBefore($target[0],_nodes[0]);\n                        for(i = _nodes.length - 1; i >= 0; i--){\n                            /* istanbul ignore else:  */\n                            if (_nodes[i].parentNode) _nodes[i].parentNode.removeChild(_nodes[i]);\n                        }\n                    } else /* istanbul ignore next: not tested since identical to blockquote */\n                    if (optionsTagName === 'pre' && taSelection.getStateShiftKey()) {\n                        //console.log('shift pre', _nodes);\n                        // pre wrap other block elements\n                        html = '';\n                        for (i = 0; i < _nodes.length; i++) {\n                            html += _nodes[i].outerHTML;\n                        }\n                        $target = angular.element(options);\n                        $target[0].innerHTML = html;\n                        _nodes[0].parentNode.insertBefore($target[0], _nodes[0]);\n                        for (i = _nodes.length - 1; i >= 0; i--) {\n                            /* istanbul ignore else:  */\n                            if (_nodes[i].parentNode) _nodes[i].parentNode.removeChild(_nodes[i]);\n                        }\n                    }\n                    else {\n                        //console.log(optionsTagName, _nodes);\n                        // regular block elements replace other block elements\n                        for (i = 0; i < _nodes.length; i++) {\n                            var newBlock = turnBlockIntoBlocks(_nodes[i], options);\n                            if (_nodes[i] === $target[0]) {\n                                $target = angular.element(newBlock);\n                            }\n                        }\n                    }\n                }\n                taSelection.setSelectionToElementEnd($target[0]);\n                // looses focus when we have the whole container selected and no text!\n                // refocus on the shown display element, this fixes a bug when using firefox\n                $target[0].focus();\n                return;\n            }else if(command.toLowerCase() === 'createlink'){\n                /* istanbul ignore next: firefox specific fix */\n                if (tagName === 'a') {\n                    // already a link!!! we are just replacing it...\n                    taSelection.getSelectionElement().href = options;\n                    return;\n                }\n                var tagBegin = '<a href=\"' + options + '\" target=\"' +\n                        (defaultTagAttributes.a.target ? defaultTagAttributes.a.target : '') +\n                        '\">',\n                    tagEnd = '</a>',\n                    _selection = taSelection.getSelection();\n                if(_selection.collapsed){\n                    //console.log('collapsed');\n                    // insert text at selection, then select then just let normal exec-command run\n                    taSelection.insertHtml(tagBegin + options + tagEnd, topNode);\n                }else if(rangy.getSelection().getRangeAt(0).canSurroundContents()){\n                    var node = angular.element(tagBegin + tagEnd)[0];\n                    rangy.getSelection().getRangeAt(0).surroundContents(node);\n                }\n                return;\n            }else if(command.toLowerCase() === 'inserthtml'){\n                //console.log('inserthtml');\n                taSelection.insertHtml(options, topNode);\n                return;\n            }\n            try{\n                $document[0].execCommand(command, showUI, options);\n            }catch(e){}\n        };\n    };\n}]).service('taSelection', ['$document', 'taDOM', '$log',\n/* istanbul ignore next: all browser specifics and PhantomJS dosen't seem to support half of it */\nfunction($document, taDOM, $log){\n    // need to dereference the document else the calls don't work correctly\n    var _document = $document[0];\n    var bShiftState;\n    var brException = function (element, offset) {\n        /* check if selection is a BR element at the beginning of a container. If so, get\n        * the parentNode instead.\n        * offset should be zero in this case. Otherwise, return the original\n        * element.\n        */\n        if (element.tagName && element.tagName.match(/^br$/i) && offset === 0 && !element.previousSibling) {\n            return {\n                element: element.parentNode,\n                offset: 0\n            };\n        } else {\n            return {\n                element: element,\n                offset: offset\n            };\n        }\n    };\n    var api = {\n        getSelection: function(){\n            var range;\n            try {\n                // catch any errors from rangy and ignore the issue\n                range = rangy.getSelection().getRangeAt(0);\n            } catch(e) {\n                //console.info(e);\n                return undefined;\n            }\n            var container = range.commonAncestorContainer;\n            var selection = {\n                start: brException(range.startContainer, range.startOffset),\n                end: brException(range.endContainer, range.endOffset),\n                collapsed: range.collapsed\n            };\n            // This has problems under Firefox.\n            // On Firefox with\n            // <p>Try me !</p>\n            // <ul>\n            // <li>line 1</li>\n            // <li>line 2</li>\n            // </ul>\n            // <p>line 3</p>\n            // <ul>\n            // <li>line 4</li>\n            // <li>line 5</li>\n            // </ul>\n            // <p>Hello textAngular</p>\n            // WITH the cursor after the 3 on line 3, it gets the commonAncestorContainer as:\n            // <TextNode textContent='line 3'>\n            // AND Chrome gets the commonAncestorContainer as:\n            // <p>line 3</p>\n            //\n            // Check if the container is a text node and return its parent if so\n            // unless this is the whole taTextElement.  If so we return the textNode\n            if (container.nodeType === 3) {\n                if (container.parentNode.nodeName.toLowerCase() === 'div' &&\n                    /^taTextElement/.test(container.parentNode.id)) {\n                    // textNode where the parent is the whole <div>!!!\n                    //console.log('textNode ***************** container:', container);\n                } else {\n                    container = container.parentNode;\n                }\n            }\n            if (container.nodeName.toLowerCase() === 'div' &&\n                /^taTextElement/.test(container.id)) {\n                //console.log('*********taTextElement************');\n                //console.log('commonAncestorContainer:', container);\n                selection.start.element = container.childNodes[selection.start.offset];\n                selection.end.element = container.childNodes[selection.end.offset];\n                selection.container = container;\n            } else {\n                if (container.parentNode === selection.start.element ||\n                    container.parentNode === selection.end.element) {\n                    selection.container = container.parentNode;\n                } else {\n                    selection.container = container;\n                }\n            }\n            //console.log('***selection container:', selection.container.nodeName, selection.start.offset, selection.container);\n            return selection;\n        },\n        // if we use the LEFT_ARROW and we are at the special place <span>&#65279;</span> we move the cursor over by one...\n        // Chrome and Firefox behave differently so so fix this for Firefox here.  No adjustment needed for Chrome.\n        updateLeftArrowKey: function(element) {\n            var range = rangy.getSelection().getRangeAt(0);\n            if (range && range.collapsed) {\n                var _nodes = api.getFlattenedDom(range);\n                if (!_nodes.findIndex) return;\n                var _node = range.startContainer;\n                var indexStartContainer = _nodes.findIndex(function(element, index){\n                    if (element.node===_node) return true;\n                    var _indexp = element.parents.indexOf(_node);\n                    return (_indexp !== -1);\n                });\n                var m;\n                var nextNodeToRight;\n                //console.log('indexStartContainer', indexStartContainer, _nodes.length, 'startContainer:', _node, _node === _nodes[indexStartContainer].node);\n                _nodes.forEach(function (n, i) {\n                    //console.log(i, n.node);\n                    n.parents.forEach(function (nn, j){\n                        //console.log(i, j, nn);\n                    });\n                });\n                if (indexStartContainer+1 < _nodes.length) {\n                    // we need the node just after this startContainer\n                    // so we can check and see it this is a special place\n                    nextNodeToRight = _nodes[indexStartContainer+1].node;\n                    //console.log(nextNodeToRight, range.startContainer);\n                }\n                //console.log('updateLeftArrowKey', range.startOffset, range.startContainer.textContent);\n                // this first section handles the case for Chrome browser\n                // if the first character of the nextNode is a \\ufeff we know that we are just before the special span...\n                // and so we most left by one character\n                if (nextNodeToRight && nextNodeToRight.textContent) {\n                    m = /^\\ufeff([^\\ufeff]*)$/.exec(nextNodeToRight.textContent);\n                    if (m) {\n                        // we are before the special node with begins with a \\ufeff character\n                        //console.log('LEFT ...found it...', 'startOffset:', range.startOffset, m[0].length, m[1].length);\n                        // no need to change anything in this case\n                        return;\n                    }\n                }\n                var nextNodeToLeft;\n                if (indexStartContainer > 0) {\n                    // we need the node just after this startContainer\n                    // so we can check and see it this is a special place\n                    nextNodeToLeft = _nodes[indexStartContainer-1].node;\n                    //console.log(nextNodeToLeft, nextNodeToLeft);\n                }\n                if (range.startOffset === 0 && nextNodeToLeft) {\n                    //console.log(nextNodeToLeft, range.startOffset, nextNodeToLeft.textContent);\n                    m = /^\\ufeff([^\\ufeff]*)$/.exec(nextNodeToLeft.textContent);\n                    if (m) {\n                        //console.log('LEFT &&&&&&&&&&&&&&&&&&&...found it...&&&&&&&&&&&', nextNodeToLeft, m[0].length, m[1].length);\n                        // move over to the left my one -- Firefox triggers this case\n                        api.setSelectionToElementEnd(nextNodeToLeft);\n                        return;\n                    }\n                }\n            }\n            return;\n        },\n        // if we use the RIGHT_ARROW and we are at the special place <span>&#65279;</span> we move the cursor over by one...\n        updateRightArrowKey: function(element) {\n            // we do not need to make any adjustments here, so we ignore all this code\n            if (false) {\n                var range = rangy.getSelection().getRangeAt(0);\n                if (range && range.collapsed) {\n                    var _nodes = api.getFlattenedDom(range);\n                    if (!_nodes.findIndex) return;\n                    var _node = range.startContainer;\n                    var indexStartContainer = _nodes.findIndex(function (element, index) {\n                        if (element.node === _node) return true;\n                        var _indexp = element.parents.indexOf(_node);\n                        return (_indexp !== -1);\n                    });\n                    var _sel;\n                    var i;\n                    var m;\n\n                    // if the last character is a \\ufeff we know that we are just before the special span...\n                    // and so we most right by one character\n                    var indexFound = _nodes.findIndex(function (n, index) {\n                        if (n.textContent) {\n                            var m = /^\\ufeff([^\\ufeff]*)$/.exec(n.textContent);\n                            if (m) {\n                                return true;\n                            } else {\n                                return false;\n                            }\n                        } else {\n                            return false;\n                        }\n                    });\n                    if (indexFound === -1) {\n                        return;\n                    }\n                    //console.log(indexFound, range.startContainer, range.startOffset);\n                    _node = _nodes[indexStartContainer];\n                    //console.log('indexStartContainer', indexStartContainer);\n                    if (_node && _node.textContent) {\n                        m = /^\\ufeff([^\\ufeff]*)$/.exec(_node.textContent);\n                        if (m && range.startOffset - 1 === m[1].length) {\n                            //console.log('RIGHT found it...&&&&&&&&&&&', range.startOffset);\n                            // no need to make any adjustment\n                            return;\n                        }\n                    }\n                    //console.log(range.startOffset);\n                    if (_nodes && range.startOffset === 0) {\n                        indexStartContainer = _nodes.indexOf(range.startContainer);\n                        if (indexStartContainer !== -1 && indexStartContainer > 0) {\n                            _node = _nodes[indexStartContainer - 1];\n                            if (_node.textContent) {\n                                m = /\\ufeff([^\\ufeff]*)$/.exec(_node.textContent);\n                                if (m && true || range.startOffset === m[1].length + 1) {\n                                    //console.log('RIGHT &&&&&&&&&&&&&&&&&&&...found it...&&&&&&&&&&&', range.startOffset, m[1].length);\n                                    // no need to make any adjustment\n                                    return;\n                                }\n                            }\n                        }\n                    }\n                }\n            }\n        },\n        getFlattenedDom: function(range) {\n            var parent = range.commonAncestorContainer.parentNode;\n            if (!parent) {\n                return range.commonAncestorContainer.childNodes;\n            }\n            var nodes = Array.prototype.slice.call(parent.childNodes); // converts NodeList to Array\n            var indexStartContainer = nodes.indexOf(range.startContainer);\n            // make sure that we have a big enough set of nodes\n            if (indexStartContainer+1 < nodes.length && indexStartContainer > 0) {\n                // we are good\n                // we can go down one node or up one node\n            } else {\n                if (parent.parentNode) {\n                    parent = parent.parentNode;\n                }\n            }\n            // now walk the parent\n            nodes = [];\n            function addNodes(_set) {\n                if (_set.node.childNodes.length) {\n                    var childNodes = Array.prototype.slice.call(_set.node.childNodes); // converts NodeList to Array\n                    childNodes.forEach(function(n) {\n                        var _t = _set.parents.slice();\n                        if (_t.slice(-1)[0]!==_set.node) {\n                            _t.push(_set.node);\n                        }\n                        addNodes({parents: _t, node: n});\n                    });\n                } else {\n                    nodes.push({parents: _set.parents, node: _set.node});\n                }\n            }\n            addNodes({parents: [parent], node: parent});\n            return nodes;\n        },\n        getOnlySelectedElements: function(){\n            var range = rangy.getSelection().getRangeAt(0);\n            var container = range.commonAncestorContainer;\n            // Node.TEXT_NODE === 3\n            // Node.ELEMENT_NODE === 1\n            // Node.COMMENT_NODE === 8\n            // Check if the container is a text node and return its parent if so\n            container = container.nodeType === 3 ? container.parentNode : container;\n            // get the nodes in the range that are ELEMENT_NODE and are children of the container\n            // in this range...\n            return range.getNodes([1], function(node){\n                return node.parentNode === container;\n            });\n        },\n        // this includes the container element if all children are selected\n        getAllSelectedElements: function(){\n            var range = rangy.getSelection().getRangeAt(0);\n            var container = range.commonAncestorContainer;\n            // Node.TEXT_NODE === 3\n            // Node.ELEMENT_NODE === 1\n            // Node.COMMENT_NODE === 8\n            // Check if the container is a text node and return its parent if so\n            container = container.nodeType === 3 ? container.parentNode : container;\n            // get the nodes in the range that are ELEMENT_NODE and are children of the container\n            // in this range...\n            var selectedNodes = range.getNodes([1], function(node){\n                return node.parentNode === container;\n            });\n            var innerHtml = container.innerHTML;\n            // remove the junk that rangy has put down\n            innerHtml = innerHtml.replace(/<span id=.selectionBoundary[^>]+>\\ufeff?<\\/span>/ig, '');\n            //console.log(innerHtml);\n            //console.log(range.toHtml());\n            //console.log(innerHtml === range.toHtml());\n            if (innerHtml === range.toHtml() &&\n                // not the whole taTextElement\n                (!(container.nodeName.toLowerCase() === 'div' &&  /^taTextElement/.test(container.id)))\n            ) {\n                var arr = [];\n                for(var i = selectedNodes.length; i--; arr.unshift(selectedNodes[i]));\n                selectedNodes = arr;\n                selectedNodes.push(container);\n                //$log.debug(selectedNodes);\n            }\n            return selectedNodes;\n        },\n        // Some basic selection functions\n        getSelectionElement: function () {\n            var s = api.getSelection();\n            if (s) {\n                return api.getSelection().container;\n            } else {\n                return undefined;\n            }\n        },\n        setSelection: function(elStart, elEnd, start, end){\n            var range = rangy.createRange();\n\n            range.setStart(elStart, start);\n            range.setEnd(elEnd, end);\n\n            rangy.getSelection().setSingleRange(range);\n        },\n        setSelectionBeforeElement: function (el){\n            var range = rangy.createRange();\n\n            range.selectNode(el);\n            range.collapse(true);\n\n            rangy.getSelection().setSingleRange(range);\n        },\n        setSelectionAfterElement: function (el){\n            var range = rangy.createRange();\n\n            range.selectNode(el);\n            range.collapse(false);\n\n            rangy.getSelection().setSingleRange(range);\n        },\n        setSelectionToElementStart: function (el){\n            var range = rangy.createRange();\n\n            range.selectNodeContents(el);\n            range.collapse(true);\n\n            rangy.getSelection().setSingleRange(range);\n        },\n        setSelectionToElementEnd: function (el){\n            var range = rangy.createRange();\n\n            range.selectNodeContents(el);\n            range.collapse(false);\n            if(el.childNodes && el.childNodes[el.childNodes.length - 1] && el.childNodes[el.childNodes.length - 1].nodeName === 'br'){\n                range.startOffset = range.endOffset = range.startOffset - 1;\n            }\n            rangy.getSelection().setSingleRange(range);\n        },\n        setStateShiftKey: function(bS) {\n            bShiftState = bS;\n        },\n        getStateShiftKey: function() {\n            return bShiftState;\n        },\n        // from http://stackoverflow.com/questions/6690752/insert-html-at-caret-in-a-contenteditable-div\n        // topNode is the contenteditable normally, all manipulation MUST be inside this.\n        insertHtml: function(html, topNode){\n            var parent, secondParent, _childI, nodes, i, lastNode, _tempFrag;\n            var element = angular.element(\"<div>\" + html + \"</div>\");\n            var range = rangy.getSelection().getRangeAt(0);\n            var frag = _document.createDocumentFragment();\n            var children = element[0].childNodes;\n            var isInline = true;\n\n            if(children.length > 0){\n                // NOTE!! We need to do the following:\n                // check for blockelements - if they exist then we have to split the current element in half (and all others up to the closest block element) and insert all children in-between.\n                // If there are no block elements, or there is a mixture we need to create textNodes for the non wrapped text (we don't want them spans messing up the picture).\n                nodes = [];\n                for(_childI = 0; _childI < children.length; _childI++){\n                    var _cnode = children[_childI];\n                    if (_cnode.nodeName.toLowerCase() === 'p' &&\n                        _cnode.innerHTML.trim() === '') { // empty p element\n                        continue;\n                    }\n                    /****************\n                     *  allow any text to be inserted...\n                    if((   _cnode.nodeType === 3 &&\n                           _cnode.nodeValue === '\\ufeff'[0] &&\n                           _cnode.nodeValue.trim() === '') // empty no-space space element\n                        ) {\n                        // no change to isInline\n                        nodes.push(_cnode);\n                        continue;\n                    }\n                    if(_cnode.nodeType === 3 &&\n                         _cnode.nodeValue.trim() === '') { // empty text node\n                        continue;\n                    }\n                    *****************/\n                    isInline = isInline && !BLOCKELEMENTS.test(_cnode.nodeName);\n                    nodes.push(_cnode);\n                }\n                for(var _n = 0; _n < nodes.length; _n++) {\n                    lastNode = frag.appendChild(nodes[_n]);\n                }\n                if( !isInline &&\n                    range.collapsed &&\n                    /^(|<br(|\\/)>)$/i.test(range.startContainer.innerHTML) ) {\n                    range.selectNode(range.startContainer);\n                }\n            }else{\n                isInline = true;\n                // paste text of some sort\n                lastNode = frag = _document.createTextNode(html);\n            }\n\n            // Other Edge case - selected data spans multiple blocks.\n            if(isInline){\n                range.deleteContents();\n            }else{ // not inline insert\n                if(range.collapsed && range.startContainer !== topNode){\n                    if(range.startContainer.innerHTML && range.startContainer.innerHTML.match(/^<[^>]*>$/i)){\n                        // this log is to catch when innerHTML is something like `<img ...>`\n                        parent = range.startContainer;\n                        if(range.startOffset === 1){\n                            // before single tag\n                            range.setStartAfter(parent);\n                            range.setEndAfter(parent);\n                        }else{\n                            // after single tag\n                            range.setStartBefore(parent);\n                            range.setEndBefore(parent);\n                        }\n                    }else{\n                        // split element into 2 and insert block element in middle\n                        if(range.startContainer.nodeType === 3 && range.startContainer.parentNode !== topNode){ // if text node\n                            parent = range.startContainer.parentNode;\n                            secondParent = parent.cloneNode();\n                            // split the nodes into two lists - before and after, splitting the node with the selection into 2 text nodes.\n                            taDOM.splitNodes(parent.childNodes, parent, secondParent, range.startContainer, range.startOffset);\n\n                            // Escape out of the inline tags like b\n                            while(!VALIDELEMENTS.test(parent.nodeName)){\n                                angular.element(parent).after(secondParent);\n                                parent = parent.parentNode;\n                                var _lastSecondParent = secondParent;\n                                secondParent = parent.cloneNode();\n                                // split the nodes into two lists - before and after, splitting the node with the selection into 2 text nodes.\n                                taDOM.splitNodes(parent.childNodes, parent, secondParent, _lastSecondParent);\n                            }\n                        }else{\n                            parent = range.startContainer;\n                            secondParent = parent.cloneNode();\n                            taDOM.splitNodes(parent.childNodes, parent, secondParent, undefined, undefined, range.startOffset);\n                        }\n\n                        angular.element(parent).after(secondParent);\n                        // put cursor to end of inserted content\n                        //console.log('setStartAfter', parent);\n                        range.setStartAfter(parent);\n                        range.setEndAfter(parent);\n\n                        if(/^(|<br(|\\/)>)$/i.test(parent.innerHTML.trim())){\n                            range.setStartBefore(parent);\n                            range.setEndBefore(parent);\n                            angular.element(parent).remove();\n                        }\n                        if(/^(|<br(|\\/)>)$/i.test(secondParent.innerHTML.trim())) angular.element(secondParent).remove();\n                        if(parent.nodeName.toLowerCase() === 'li'){\n                            _tempFrag = _document.createDocumentFragment();\n                            for(i = 0; i < frag.childNodes.length; i++){\n                                element = angular.element('<li>');\n                                taDOM.transferChildNodes(frag.childNodes[i], element[0]);\n                                taDOM.transferNodeAttributes(frag.childNodes[i], element[0]);\n                                _tempFrag.appendChild(element[0]);\n                            }\n                            frag = _tempFrag;\n                            if(lastNode){\n                                lastNode = frag.childNodes[frag.childNodes.length - 1];\n                                lastNode = lastNode.childNodes[lastNode.childNodes.length - 1];\n                            }\n                        }\n                    }\n                }else{\n                    range.deleteContents();\n                }\n            }\n\n            range.insertNode(frag);\n            if(lastNode){\n                api.setSelectionToElementEnd(lastNode);\n            }\n        }\n\n        /* NOT FUNCTIONAL YET\n         // under Firefox, we may have a selection that needs to be normalized\n         isSelectionContainerWhole_taTextElement: function (){\n         var range = rangy.getSelection().getRangeAt(0);\n         var container = range.commonAncestorContainer;\n         if (container.nodeName.toLowerCase() === 'div' &&\n         /^taTextElement/.test(container.id)) {\n         // container is the whole taTextElement\n         return true;\n         }\n         return false;\n         },\n         setNormalizedSelection: function (){\n         var range = rangy.getSelection().getRangeAt(0);\n         var container = range.commonAncestorContainer;\n         console.log(range);\n         console.log(container.childNodes);\n         if (range.collapsed) {\n         // we know what to do...\n         console.log(container.childNodes[range.startOffset]);\n         api.setSelectionToElementStart(container.childNodes[range.startOffset]);\n         }\n         },\n         */\n    };\n    return api;\n}]).service('taDOM', function(){\n    var taDOM = {\n        // recursive function that returns an array of angular.elements that have the passed attribute set on them\n        getByAttribute: function(element, attribute){\n            var resultingElements = [];\n            var childNodes = element.children();\n            if(childNodes.length){\n                angular.forEach(childNodes, function(child){\n                    resultingElements = resultingElements.concat(taDOM.getByAttribute(angular.element(child), attribute));\n                });\n            }\n            if(element.attr(attribute) !== undefined) resultingElements.push(element);\n            return resultingElements;\n        },\n\n        transferChildNodes: function(source, target){\n            // clear out target\n            target.innerHTML = '';\n            while(source.childNodes.length > 0) target.appendChild(source.childNodes[0]);\n            return target;\n        },\n\n        splitNodes: function(nodes, target1, target2, splitNode, subSplitIndex, splitIndex){\n            if(!splitNode && isNaN(splitIndex)) throw new Error('taDOM.splitNodes requires a splitNode or splitIndex');\n            var startNodes = document.createDocumentFragment();\n            var endNodes = document.createDocumentFragment();\n            var index = 0;\n\n            while(nodes.length > 0 && (isNaN(splitIndex) || splitIndex !== index) && nodes[0] !== splitNode){\n                startNodes.appendChild(nodes[0]); // this removes from the nodes array (if proper childNodes object.\n                index++;\n            }\n\n            if(!isNaN(subSplitIndex) && subSplitIndex >= 0 && nodes[0]){\n                startNodes.appendChild(document.createTextNode(nodes[0].nodeValue.substring(0, subSplitIndex)));\n                nodes[0].nodeValue = nodes[0].nodeValue.substring(subSplitIndex);\n            }\n            while(nodes.length > 0) endNodes.appendChild(nodes[0]);\n\n            taDOM.transferChildNodes(startNodes, target1);\n            taDOM.transferChildNodes(endNodes, target2);\n        },\n\n        transferNodeAttributes: function(source, target){\n            for(var i = 0; i < source.attributes.length; i++) target.setAttribute(source.attributes[i].name, source.attributes[i].value);\n            return target;\n        }\n    };\n    return taDOM;\n});\n\nangular.module('textAngular.validators', [])\n.directive('taMaxText', function(){\n    return {\n        restrict: 'A',\n        require: 'ngModel',\n        link: function(scope, elem, attrs, ctrl){\n            var max = parseInt(scope.$eval(attrs.taMaxText));\n            if (isNaN(max)){\n                throw('Max text must be an integer');\n            }\n            attrs.$observe('taMaxText', function(value){\n                max = parseInt(value);\n                if (isNaN(max)){\n                    throw('Max text must be an integer');\n                }\n                if (ctrl.$dirty){\n                    ctrl.$validate();\n                }\n            });\n            ctrl.$validators.taMaxText = function(viewValue){\n                var source = angular.element('<div/>');\n                source.html(viewValue);\n                return source.text().length <= max;\n            };\n        }\n    };\n}).directive('taMinText', function(){\n    return {\n        restrict: 'A',\n        require: 'ngModel',\n        link: function(scope, elem, attrs, ctrl){\n            var min = parseInt(scope.$eval(attrs.taMinText));\n            if (isNaN(min)){\n                throw('Min text must be an integer');\n            }\n            attrs.$observe('taMinText', function(value){\n                min = parseInt(value);\n                if (isNaN(min)){\n                    throw('Min text must be an integer');\n                }\n                if (ctrl.$dirty){\n                    ctrl.$validate();\n                }\n            });\n            ctrl.$validators.taMinText = function(viewValue){\n                var source = angular.element('<div/>');\n                source.html(viewValue);\n                return !source.text().length || source.text().length >= min;\n            };\n        }\n    };\n});\nangular.module('textAngular.taBind', ['textAngular.factories', 'textAngular.DOM'])\n.service('_taBlankTest', [function(){\n    return function(_blankVal){\n        // we radically restructure this code.\n        // what was here before was incredibly fragile.\n        // What we do now is to check that the html is non-blank visually\n        // which we check by looking at html->text\n        if(!_blankVal) return true;\n        // find first non-tag match - ie start of string or after tag that is not whitespace\n        // var t0 = performance.now();\n        // Takes a small fraction of a mSec to do this...\n        var _text_ = stripHtmlToText(_blankVal);\n        // var t1 = performance.now();\n        // console.log('Took', (t1 - t0).toFixed(4), 'milliseconds to generate:');\n        if (_text_=== '') {\n            // img generates a visible item so it is not blank!\n            if (/<img[^>]+>/.test(_blankVal)) {\n                return false;\n            }\n            return true;\n        } else {\n            return false;\n        }\n    };\n}])\n.directive('taButton', [function(){\n    return {\n        link: function(scope, element, attrs){\n            element.attr('unselectable', 'on');\n            element.on('mousedown', function(e, eventData){\n                /* istanbul ignore else: this is for catching the jqLite testing*/\n                if(eventData) angular.extend(e, eventData);\n                // this prevents focusout from firing on the editor when clicking toolbar buttons\n                e.preventDefault();\n                return false;\n            });\n        }\n    };\n}])\n.directive('taBind', [\n        'taSanitize', '$timeout', '$document', 'taFixChrome', 'taBrowserTag',\n        'taSelection', 'taSelectableElements', 'taApplyCustomRenderers', 'taOptions',\n        '_taBlankTest', '$parse', 'taDOM', 'textAngularManager',\n        function(\n            taSanitize, $timeout, $document, taFixChrome, taBrowserTag,\n            taSelection, taSelectableElements, taApplyCustomRenderers, taOptions,\n            _taBlankTest, $parse, taDOM, textAngularManager){\n    // Uses for this are textarea or input with ng-model and ta-bind='text'\n    // OR any non-form element with contenteditable=\"contenteditable\" ta-bind=\"html|text\" ng-model\n    return {\n        priority: 2, // So we override validators correctly\n        require: ['ngModel','?ngModelOptions'],\n        link: function(scope, element, attrs, controller){\n            var ngModel = controller[0];\n            var ngModelOptions = controller[1] || {};\n            // the option to use taBind on an input or textarea is required as it will sanitize all input into it correctly.\n            var _isContentEditable = element.attr('contenteditable') !== undefined && element.attr('contenteditable');\n            var _isInputFriendly = _isContentEditable || element[0].tagName.toLowerCase() === 'textarea' || element[0].tagName.toLowerCase() === 'input';\n            var _isReadonly = false;\n            var _focussed = false;\n            var _skipRender = false;\n            var _disableSanitizer = attrs.taUnsafeSanitizer || taOptions.disableSanitizer;\n            var _keepStyles = attrs.taKeepStyles || taOptions.keepStyles;\n            var _lastKey;\n            // see http://www.javascripter.net/faq/keycodes.htm for good information\n            // NOTE Mute On|Off 173 (Opera MSIE Safari Chrome) 181 (Firefox)\n            // BLOCKED_KEYS are special keys...\n            // Tab, pause/break, CapsLock, Esc, Page Up, End, Home,\n            // Left arrow, Up arrow, Right arrow, Down arrow, Insert, Delete,\n            // f1, f2, f3, f4, f5, f6, f7, f8, f9, f10, f11, f12\n            // NumLock, ScrollLock\n            var BLOCKED_KEYS = /^(9|19|20|27|33|34|35|36|37|38|39|40|45|112|113|114|115|116|117|118|119|120|121|122|123|144|145)$/i;\n            // UNDO_TRIGGER_KEYS - spaces, enter, delete, backspace, all punctuation\n            // Backspace, Enter, Space, Delete, (; :) (Firefox), (= +) (Firefox),\n            // Numpad +, Numpad -, (; :), (= +),\n            // (, <), (- _), (. >), (/ ?), (` ~), ([ {), (\\ |), (] }), (' \")\n            // NOTE - Firefox: 173 = (- _) -- adding this to UNDO_TRIGGER_KEYS\n            var UNDO_TRIGGER_KEYS = /^(8|13|32|46|59|61|107|109|173|186|187|188|189|190|191|192|219|220|221|222)$/i;\n            var _pasteHandler;\n\n            // defaults to the paragraph element, but we need the line-break or it doesn't allow you to type into the empty element\n            // non IE is '<p><br/></p>', ie is '<p></p>' as for once IE gets it correct...\n            var _defaultVal, _defaultTest;\n\n            var _CTRL_KEY = 0x0001;\n            var _META_KEY = 0x0002;\n            var _ALT_KEY = 0x0004;\n            var _SHIFT_KEY = 0x0008;\n            // KEYCODEs we use\n            var _ENTER_KEYCODE = 13;\n            var _SHIFT_KEYCODE = 16;\n            var _TAB_KEYCODE = 9;\n            var _LEFT_ARROW_KEYCODE = 37;\n            var _RIGHT_ARROW_KEYCODE = 39;\n            // map events to special keys...\n            // mappings is an array of maps from events to specialKeys as declared in textAngularSetup\n            var _keyMappings = [\n                //\t\tctrl/command + z\n                {\n                    specialKey: 'UndoKey',\n                    forbiddenModifiers: _ALT_KEY + _SHIFT_KEY,\n                    mustHaveModifiers: [_META_KEY + _CTRL_KEY],\n                    keyCode: 90\n                },\n                //\t\tctrl/command + shift + z\n                {\n                    specialKey: 'RedoKey',\n                    forbiddenModifiers: _ALT_KEY,\n                    mustHaveModifiers: [_META_KEY + _CTRL_KEY, _SHIFT_KEY],\n                    keyCode: 90\n                },\n                //\t\tctrl/command + y\n                {\n                    specialKey: 'RedoKey',\n                    forbiddenModifiers: _ALT_KEY + _SHIFT_KEY,\n                    mustHaveModifiers: [_META_KEY + _CTRL_KEY],\n                    keyCode: 89\n                },\n                //\t\tTabKey\n                {\n                    specialKey: 'TabKey',\n                    forbiddenModifiers: _META_KEY + _SHIFT_KEY + _ALT_KEY + _CTRL_KEY,\n                    mustHaveModifiers: [],\n                    keyCode: _TAB_KEYCODE\n                },\n                //\t\tshift + TabKey\n                {\n                    specialKey: 'ShiftTabKey',\n                    forbiddenModifiers: _META_KEY + _ALT_KEY + _CTRL_KEY,\n                    mustHaveModifiers: [_SHIFT_KEY],\n                    keyCode: _TAB_KEYCODE\n                }\n            ];\n            function _mapKeys(event) {\n                var specialKey;\n                _keyMappings.forEach(function (map){\n                    if (map.keyCode === event.keyCode) {\n                        var netModifiers = (event.metaKey ? _META_KEY: 0) +\n                            (event.ctrlKey ? _CTRL_KEY: 0) +\n                            (event.shiftKey ? _SHIFT_KEY: 0) +\n                            (event.altKey ? _ALT_KEY: 0);\n                        if (map.forbiddenModifiers & netModifiers) return;\n                        if (map.mustHaveModifiers.every(function (modifier) { return netModifiers & modifier; })){\n                            specialKey = map.specialKey;\n                        }\n                    }\n                });\n                return specialKey;\n            }\n\n            // set the default to be a paragraph value\n            if(attrs.taDefaultWrap === undefined) attrs.taDefaultWrap = 'p';\n            /* istanbul ignore next: ie specific test */\n            if(attrs.taDefaultWrap === ''){\n                _defaultVal = '';\n                _defaultTest = (_browserDetect.ie === undefined)? '<div><br></div>' : (_browserDetect.ie >= 11)? '<p><br></p>' : (_browserDetect.ie <= 8)? '<P>&nbsp;</P>' : '<p>&nbsp;</p>';\n            }else{\n                _defaultVal = (_browserDetect.ie === undefined || _browserDetect.ie >= 11)?\n                    (attrs.taDefaultWrap.toLowerCase() === 'br' ? '<BR><BR>' : '<' + attrs.taDefaultWrap + '><br></' + attrs.taDefaultWrap + '>') :\n                    (_browserDetect.ie <= 8)?\n                        '<' + attrs.taDefaultWrap.toUpperCase() + '></' + attrs.taDefaultWrap.toUpperCase() + '>' :\n                        '<' + attrs.taDefaultWrap + '></' + attrs.taDefaultWrap + '>';\n                _defaultTest = (_browserDetect.ie === undefined || _browserDetect.ie >= 11)?\n                    (attrs.taDefaultWrap.toLowerCase() === 'br' ? '<br><br>' : '<' + attrs.taDefaultWrap + '><br></' + attrs.taDefaultWrap + '>') :\n                    (_browserDetect.ie <= 8)?\n                        '<' + attrs.taDefaultWrap.toUpperCase() + '>&nbsp;</' + attrs.taDefaultWrap.toUpperCase() + '>' :\n                        '<' + attrs.taDefaultWrap + '>&nbsp;</' + attrs.taDefaultWrap + '>';\n            }\n\n            /* istanbul ignore else */\n            if(!ngModelOptions.$options) ngModelOptions.$options = {}; // ng-model-options support\n\n            var _ensureContentWrapped = function(value) {\n                if (_taBlankTest(value)) return value;\n                var domTest = angular.element(\"<div>\" + value + \"</div>\");\n                //console.log('domTest.children().length():', domTest.children().length);\n                //console.log('_ensureContentWrapped', domTest.children());\n                //console.log(value, attrs.taDefaultWrap);\n                if (domTest.children().length === 0) {\n                    // if we have a <br> and the attrs.taDefaultWrap is a <p> we need to remove the <br>\n                    //value = value.replace(/<br>/i, '');\n                    value = \"<\" + attrs.taDefaultWrap + \">\" + value + \"</\" + attrs.taDefaultWrap + \">\";\n                } else {\n                    var _children = domTest[0].childNodes;\n                    var i;\n                    var _foundBlockElement = false;\n                    for (i = 0; i < _children.length; i++) {\n                        if (_foundBlockElement = _children[i].nodeName.toLowerCase().match(BLOCKELEMENTS)) break;\n                    }\n                    if (!_foundBlockElement) {\n                        value = \"<\" + attrs.taDefaultWrap + \">\" + value + \"</\" + attrs.taDefaultWrap + \">\";\n                    }\n                    else{\n                        value = \"\";\n                        for(i = 0; i < _children.length; i++){\n                            var node = _children[i];\n                            var nodeName = node.nodeName.toLowerCase();\n                            //console.log('node#:', i, 'name:', nodeName);\n                            if(nodeName === '#comment') {\n                                value += '<!--' + node.nodeValue + '-->';\n                            } else if(nodeName === '#text') {\n                                // determine if this is all whitespace, if so, we will leave it as it is.\n                                // otherwise, we will wrap it as it is\n                                var text = node.textContent;\n                                if (!text.trim()) {\n                                    // just whitespace\n                                    value += text;\n                                } else {\n                                    // not pure white space so wrap in <p>...</p> or whatever attrs.taDefaultWrap is set to.\n                                    value += \"<\" + attrs.taDefaultWrap + \">\" + text + \"</\" + attrs.taDefaultWrap + \">\";\n                                }\n                            } else if(!nodeName.match(BLOCKELEMENTS)){\n                                /* istanbul ignore  next: Doesn't seem to trigger on tests */\n                                var _subVal = (node.outerHTML || node.nodeValue);\n                                /* istanbul ignore else: Doesn't seem to trigger on tests, is tested though */\n                                if(_subVal.trim() !== '')\n                                    value += \"<\" + attrs.taDefaultWrap + \">\" + _subVal + \"</\" + attrs.taDefaultWrap + \">\";\n                                else value += _subVal;\n                            } else {\n                                value += node.outerHTML;\n                            }\n                            //console.log(value);\n                        }\n                    }\n                }\n                //console.log(value);\n                return value;\n            };\n\n            if(attrs.taPaste) {\n                _pasteHandler = $parse(attrs.taPaste);\n            }\n\n            element.addClass('ta-bind');\n\n            var _undoKeyupTimeout;\n\n            scope['$undoManager' + (attrs.id || '')] = ngModel.$undoManager = {\n                _stack: [],\n                _index: 0,\n                _max: 1000,\n                push: function(value){\n                    if((typeof value === \"undefined\" || value === null) ||\n                        ((typeof this.current() !== \"undefined\" && this.current() !== null) && value === this.current())) return value;\n                    if(this._index < this._stack.length - 1){\n                        this._stack = this._stack.slice(0,this._index+1);\n                    }\n                    this._stack.push(value);\n                    if(_undoKeyupTimeout) $timeout.cancel(_undoKeyupTimeout);\n                    if(this._stack.length > this._max) this._stack.shift();\n                    this._index = this._stack.length - 1;\n                    return value;\n                },\n                undo: function(){\n                    return this.setToIndex(this._index-1);\n                },\n                redo: function(){\n                    return this.setToIndex(this._index+1);\n                },\n                setToIndex: function(index){\n                    if(index < 0 || index > this._stack.length - 1){\n                        return undefined;\n                    }\n                    this._index = index;\n                    return this.current();\n                },\n                current: function(){\n                    return this._stack[this._index];\n                }\n            };\n\n            // in here we are undoing the converts used elsewhere to prevent the < > and & being displayed when they shouldn't in the code.\n            var _compileHtml = function(){\n                if(_isContentEditable) {\n                    return element[0].innerHTML;\n                }\n                if(_isInputFriendly) {\n                    return element.val();\n                }\n                throw ('textAngular Error: attempting to update non-editable taBind');\n            };\n\n            var selectorClickHandler = function(event){\n                // emit the element-select event, pass the element\n                scope.$emit('ta-element-select', this);\n                event.preventDefault();\n                return false;\n            };\n\n            //used for updating when inserting wrapped elements\n            var _reApplyOnSelectorHandlers = scope['reApplyOnSelectorHandlers' + (attrs.id || '')] = function(){\n                /* istanbul ignore else */\n                if(!_isReadonly) angular.forEach(taSelectableElements, function(selector){\n                    // check we don't apply the handler twice\n                    element.find(selector)\n                        .off('click', selectorClickHandler)\n                        .on('click', selectorClickHandler);\n                });\n            };\n\n            var _setViewValue = function(_val, triggerUndo, skipRender){\n                _skipRender = skipRender || false;\n                if(typeof triggerUndo === \"undefined\" || triggerUndo === null) triggerUndo = true && _isContentEditable; // if not contentEditable then the native undo/redo is fine\n                if(typeof _val === \"undefined\" || _val === null) _val = _compileHtml();\n                if(_taBlankTest(_val)){\n                    // this avoids us from tripping the ng-pristine flag if we click in and out with out typing\n                    if(ngModel.$viewValue !== '') ngModel.$setViewValue('');\n                    if(triggerUndo && ngModel.$undoManager.current() !== '') ngModel.$undoManager.push('');\n                }else{\n                    _reApplyOnSelectorHandlers();\n                    if(ngModel.$viewValue !== _val){\n                        ngModel.$setViewValue(_val);\n                        if(triggerUndo) ngModel.$undoManager.push(_val);\n                    }\n                }\n                ngModel.$render();\n            };\n\n            var _setInnerHTML = function(newval){\n                element[0].innerHTML = newval;\n            };\n\n            var _redoUndoTimeout;\n            var _undo = scope['$undoTaBind' + (attrs.id || '')] = function(){\n                /* istanbul ignore else: can't really test it due to all changes being ignored as well in readonly */\n                if(!_isReadonly && _isContentEditable){\n                    var content = ngModel.$undoManager.undo();\n                    if(typeof content !== \"undefined\" && content !== null){\n                        _setInnerHTML(content);\n                        _setViewValue(content, false);\n                        if(_redoUndoTimeout) $timeout.cancel(_redoUndoTimeout);\n                        _redoUndoTimeout = $timeout(function(){\n                            element[0].focus();\n                            taSelection.setSelectionToElementEnd(element[0]);\n                        }, 1);\n                    }\n                }\n            };\n\n            var _redo = scope['$redoTaBind' + (attrs.id || '')] = function(){\n                /* istanbul ignore else: can't really test it due to all changes being ignored as well in readonly */\n                if(!_isReadonly && _isContentEditable){\n                    var content = ngModel.$undoManager.redo();\n                    if(typeof content !== \"undefined\" && content !== null){\n                        _setInnerHTML(content);\n                        _setViewValue(content, false);\n                        /* istanbul ignore next */\n                        if(_redoUndoTimeout) $timeout.cancel(_redoUndoTimeout);\n                        _redoUndoTimeout = $timeout(function(){\n                            element[0].focus();\n                            taSelection.setSelectionToElementEnd(element[0]);\n                        }, 1);\n                    }\n                }\n            };\n\n            //used for updating when inserting wrapped elements\n            scope['updateTaBind' + (attrs.id || '')] = function(){\n                if(!_isReadonly) _setViewValue(undefined, undefined, true);\n            };\n\n            // catch DOM XSS via taSanitize\n            // Sanitizing both ways is identical\n            var _sanitize = function(unsafe){\n                return (ngModel.$oldViewValue = taSanitize(taFixChrome(unsafe, _keepStyles), ngModel.$oldViewValue, _disableSanitizer));\n            };\n\n            // trigger the validation calls\n            if(element.attr('required')) ngModel.$validators.required = function(modelValue, viewValue) {\n                return !_taBlankTest(modelValue || viewValue);\n            };\n            // parsers trigger from the above keyup function or any other time that the viewValue is updated and parses it for storage in the ngModel\n            ngModel.$parsers.push(_sanitize);\n            ngModel.$parsers.unshift(_ensureContentWrapped);\n            // because textAngular is bi-directional (which is awesome) we need to also sanitize values going in from the server\n            ngModel.$formatters.push(_sanitize);\n            ngModel.$formatters.unshift(_ensureContentWrapped);\n            ngModel.$formatters.unshift(function(value){\n                return ngModel.$undoManager.push(value || '');\n            });\n\n            //this code is used to update the models when data is entered/deleted\n            if(_isInputFriendly){\n                scope.events = {};\n                if(!_isContentEditable){\n                    // if a textarea or input just add in change and blur handlers, everything else is done by angulars input directive\n                    element.on('change blur', scope.events.change = scope.events.blur = function(){\n                        if(!_isReadonly) ngModel.$setViewValue(_compileHtml());\n                    });\n\n                    element.on('keydown', scope.events.keydown = function(event, eventData){\n                        /* istanbul ignore else: this is for catching the jqLite testing*/\n                        if(eventData) angular.extend(event, eventData);\n                        // Reference to http://stackoverflow.com/questions/6140632/how-to-handle-tab-in-textarea\n                        /* istanbul ignore else: otherwise normal functionality */\n                        if(event.keyCode === _TAB_KEYCODE){ // tab was pressed\n                            // get caret position/selection\n                            var start = this.selectionStart;\n                            var end = this.selectionEnd;\n\n                            var value = element.val();\n                            if(event.shiftKey){\n                                // find \\t\n                                var _linebreak = value.lastIndexOf('\\n', start), _tab = value.lastIndexOf('\\t', start);\n                                if(_tab !== -1 && _tab >= _linebreak){\n                                    // set textarea value to: text before caret + tab + text after caret\n                                    element.val(value.substring(0, _tab) + value.substring(_tab + 1));\n\n                                    // put caret at right position again (add one for the tab)\n                                    this.selectionStart = this.selectionEnd = start - 1;\n                                }\n                            }else{\n                                // set textarea value to: text before caret + tab + text after caret\n                                element.val(value.substring(0, start) + \"\\t\" + value.substring(end));\n\n                                // put caret at right position again (add one for the tab)\n                                this.selectionStart = this.selectionEnd = start + 1;\n                            }\n                            // prevent the focus lose\n                            event.preventDefault();\n                        }\n                    });\n\n                    var _repeat = function(string, n){\n                        var result = '';\n                        for(var _n = 0; _n < n; _n++) result += string;\n                        return result;\n                    };\n\n                    // add a forEach function that will work on a NodeList, etc..\n                    var forEach = function (array, callback, scope) {\n                        for (var i= 0; i<array.length; i++) {\n                            callback.call(scope, i, array[i]);\n                        }\n                    };\n\n                    // handle <ul> or <ol> nodes\n                    var recursiveListFormat = function(listNode, tablevel){\n                        var _html = '';\n                        var _subnodes = listNode.childNodes;\n                        tablevel++;\n                        // tab out and add the <ul> or <ol> html piece\n                        _html += _repeat('\\t', tablevel-1) + listNode.outerHTML.substring(0, 4);\n                        forEach(_subnodes, function (index, node) {\n                            /* istanbul ignore next: browser catch */\n                            var nodeName = node.nodeName.toLowerCase();\n                            if (nodeName === '#comment') {\n                                _html += '<!--' + node.nodeValue + '-->';\n                                return;\n                            }\n                            if (nodeName === '#text') {\n                                _html += node.textContent;\n                                return;\n                            }\n                            /* istanbul ignore next: not tested, and this was original code -- so not wanting to possibly cause an issue, leaving it... */\n                            if(!node.outerHTML) {\n                                // no html to add\n                                return;\n                            }\n                            if(nodeName === 'ul' || nodeName === 'ol') {\n                                _html += '\\n' + recursiveListFormat(node, tablevel);\n                            }\n                            else {\n                                // no reformatting within this subnode, so just do the tabing...\n                                _html += '\\n' + _repeat('\\t', tablevel) + node.outerHTML;\n                            }\n                        });\n                        // now add on the </ol> or </ul> piece\n                        _html += '\\n' + _repeat('\\t', tablevel-1) + listNode.outerHTML.substring(listNode.outerHTML.lastIndexOf('<'));\n                        return _html;\n                    };\n                    // handle formating of something like:\n                    // <ol><!--First comment-->\n                    //  <li>Test Line 1<!--comment test list 1--></li>\n                    //    <ul><!--comment ul-->\n                    //      <li>Nested Line 1</li>\n                    //        <!--comment between nested lines--><li>Nested Line 2</li>\n                    //    </ul>\n                    //  <li>Test Line 3</li>\n                    // </ol>\n                    ngModel.$formatters.unshift(function(htmlValue){\n                        // tabulate the HTML so it looks nicer\n                        //\n                        // first get a list of the nodes...\n                        // we do this by using the element parser...\n                        //\n                        // doing this -- which is simpiler -- breaks our tests...\n                        //var _nodes=angular.element(htmlValue);\n                        var _nodes = angular.element('<div>' + htmlValue + '</div>')[0].childNodes;\n                        if(_nodes.length > 0){\n                            // do the reformatting of the layout...\n                            htmlValue = '';\n                            forEach(_nodes, function (index, node) {\n                                var nodeName = node.nodeName.toLowerCase();\n                                if (nodeName === '#comment') {\n                                    htmlValue += '<!--' + node.nodeValue + '-->';\n                                    return;\n                                }\n                                if (nodeName === '#text') {\n                                    htmlValue += node.textContent;\n                                    return;\n                                }\n                                /* istanbul ignore next: not tested, and this was original code -- so not wanting to possibly cause an issue, leaving it... */\n                                if(!node.outerHTML)\n                                {\n                                    // nothing to format!\n                                    return;\n                                }\n                                if(htmlValue.length > 0) {\n                                    // we aready have some content, so drop to a new line\n                                    htmlValue += '\\n';\n                                }\n                                if(nodeName === 'ul' || nodeName === 'ol') {\n                                    // okay a set of list stuff we want to reformat in a nested way\n                                    htmlValue += '' + recursiveListFormat(node, 0);\n                                }\n                                else {\n                                    // just use the original without any additional formating\n                                    htmlValue += '' + node.outerHTML;\n                                }\n                            });\n                        }\n                        return htmlValue;\n                    });\n                }else{\n                    // all the code specific to contenteditable divs\n                    var _processingPaste = false;\n                    /* istanbul ignore next: phantom js cannot test this for some reason */\n                    var processpaste = function(text) {\n                       var _isOneNote = text!==undefined? text.match(/content=[\"']*OneNote.File/i): false;\n                        /* istanbul ignore else: don't care if nothing pasted */\n                        //console.log(text);\n                        if(text && text.trim().length){\n                            // test paste from word/microsoft product\n                            if(text.match(/class=[\"']*Mso(Normal|List)/i) || text.match(/content=[\"']*Word.Document/i) || text.match(/content=[\"']*OneNote.File/i)){\n                                var textFragment = text.match(/<!--StartFragment-->([\\s\\S]*?)<!--EndFragment-->/i);\n                                if(!textFragment) textFragment = text;\n                                else textFragment = textFragment[1];\n                                textFragment = textFragment.replace(/<o:p>[\\s\\S]*?<\\/o:p>/ig, '').replace(/class=([\"']|)MsoNormal([\"']|)/ig, '');\n                                var dom = angular.element(\"<div>\" + textFragment + \"</div>\");\n                                var targetDom = angular.element(\"<div></div>\");\n                                var _list = {\n                                    element: null,\n                                    lastIndent: [],\n                                    lastLi: null,\n                                    isUl: false\n                                };\n                                _list.lastIndent.peek = function(){\n                                    var n = this.length;\n                                    if (n>0) return this[n-1];\n                                };\n                                var _resetList = function(isUl){\n                                    _list.isUl = isUl;\n                                    _list.element = angular.element(isUl ? \"<ul>\" : \"<ol>\");\n                                    _list.lastIndent = [];\n                                    _list.lastIndent.peek = function(){\n                                        var n = this.length;\n                                        if (n>0) return this[n-1];\n                                    };\n                                    _list.lastLevelMatch = null;\n                                };\n                                for(var i = 0; i <= dom[0].childNodes.length; i++){\n                                    if(!dom[0].childNodes[i] || dom[0].childNodes[i].nodeName === \"#text\"){\n                                        continue;\n                                    } else {\n                                        var tagName = dom[0].childNodes[i].tagName.toLowerCase();\n                                        if(tagName !== 'p' &&\n                                            tagName !== 'ul' &&\n                                            tagName !== 'h1' &&\n                                            tagName !== 'h2' &&\n                                            tagName !== 'h3' &&\n                                            tagName !== 'h4' &&\n                                            tagName !== 'h5' &&\n                                            tagName !== 'h6' &&\n                                            tagName !== 'table'){\n                                            continue;\n                                        }\n                                    }\n                                    var el = angular.element(dom[0].childNodes[i]);\n                                    var _listMatch = (el.attr('class') || '').match(/MsoList(Bullet|Number|Paragraph)(CxSp(First|Middle|Last)|)/i);\n\n                                    if(_listMatch){\n                                        if(el[0].childNodes.length < 2 || el[0].childNodes[1].childNodes.length < 1){\n                                            continue;\n                                        }\n                                        var isUl = _listMatch[1].toLowerCase() === 'bullet' || (_listMatch[1].toLowerCase() !== 'number' && !(/^[^0-9a-z<]*[0-9a-z]+[^0-9a-z<>]</i.test(el[0].childNodes[1].innerHTML) || /^[^0-9a-z<]*[0-9a-z]+[^0-9a-z<>]</i.test(el[0].childNodes[1].childNodes[0].innerHTML)));\n                                        var _indentMatch = (el.attr('style') || '').match(/margin-left:([\\-\\.0-9]*)/i);\n                                        var indent = parseFloat((_indentMatch)?_indentMatch[1]:0);\n                                        var _levelMatch = (el.attr('style') || '').match(/mso-list:l([0-9]+) level([0-9]+) lfo[0-9+]($|;)/i);\n                                        // prefers the mso-list syntax\n\n                                        if(_levelMatch && _levelMatch[2]) indent = parseInt(_levelMatch[2]);\n\n                                        if ((_levelMatch && (!_list.lastLevelMatch || _levelMatch[1] !== _list.lastLevelMatch[1])) || !_listMatch[3] || _listMatch[3].toLowerCase() === 'first' || (_list.lastIndent.peek() === null) || (_list.isUl !== isUl && _list.lastIndent.peek() === indent)) {\n                                            _resetList(isUl);\n                                            targetDom.append(_list.element);\n                                        } else if (_list.lastIndent.peek() != null && _list.lastIndent.peek() < indent){\n                                            _list.element = angular.element(isUl ? '<ul>' : '<ol>');\n                                            _list.lastLi.append(_list.element);\n                                        } else if (_list.lastIndent.peek() != null && _list.lastIndent.peek() > indent){\n                                            while(_list.lastIndent.peek() != null && _list.lastIndent.peek() > indent){\n                                                if(_list.element.parent()[0].tagName.toLowerCase() === 'li'){\n                                                    _list.element = _list.element.parent();\n                                                    continue;\n                                                }else if(/[uo]l/i.test(_list.element.parent()[0].tagName.toLowerCase())){\n                                                    _list.element = _list.element.parent();\n                                                }else{ // else it's it should be a sibling\n                                                    break;\n                                                }\n                                                _list.lastIndent.pop();\n                                            }\n                                            _list.isUl = _list.element[0].tagName.toLowerCase() === 'ul';\n                                            if (isUl !== _list.isUl) {\n                                                _resetList(isUl);\n                                                targetDom.append(_list.element);\n                                            }\n                                        }\n\n                                        _list.lastLevelMatch = _levelMatch;\n                                        if(indent !== _list.lastIndent.peek()) _list.lastIndent.push(indent);\n                                        _list.lastLi = angular.element('<li>');\n                                        _list.element.append(_list.lastLi);\n                                        _list.lastLi.html(el.html().replace(/<!(--|)\\[if !supportLists\\](--|)>[\\s\\S]*?<!(--|)\\[endif\\](--|)>/ig, ''));\n                                        el.remove();\n                                    }else{\n                                        _resetList(false);\n                                        targetDom.append(el);\n                                    }\n                                }\n                                var _unwrapElement = function(node){\n                                    node = angular.element(node);\n                                    for(var _n = node[0].childNodes.length - 1; _n >= 0; _n--) node.after(node[0].childNodes[_n]);\n                                    node.remove();\n                                };\n\n                                angular.forEach(targetDom.find('span'), function(node){\n                                    node.removeAttribute('lang');\n                                    if(node.attributes.length <= 0) _unwrapElement(node);\n                                });\n                                angular.forEach(targetDom.find('font'), _unwrapElement);\n\n                                text = targetDom.html();\n                                if(_isOneNote){\n                                    text = targetDom.html() || dom.html();\n                                }\n                                // LF characters instead of spaces in some spots and they are replaced by '/n', so we need to just swap them to spaces\n                                text = text.replace(/\\n/g, ' ');\n                            }else{\n                                // remove unnecessary chrome insert\n                                text = text.replace(/<(|\\/)meta[^>]*?>/ig, '');\n                                if(text.match(/<[^>]*?(ta-bind)[^>]*?>/)){\n                                    // entire text-angular or ta-bind has been pasted, REMOVE AT ONCE!!\n                                    if(text.match(/<[^>]*?(text-angular)[^>]*?>/)){\n                                        var _el = angular.element('<div>' + text + '</div>');\n                                        _el.find('textarea').remove();\n                                        for(var _b = 0; _b < binds.length; _b++){\n                                            var _target = binds[_b][0].parentNode.parentNode;\n                                            for(var _c = 0; _c < binds[_b][0].childNodes.length; _c++){\n                                                _target.parentNode.insertBefore(binds[_b][0].childNodes[_c], _target);\n                                            }\n                                            _target.parentNode.removeChild(_target);\n                                        }\n                                        text = _el.html().replace('<br class=\"Apple-interchange-newline\">', '');\n                                    }\n                                }else if(text.match(/^<span/)){\n                                    // in case of pasting only a span - chrome paste, remove them. THis is just some wierd formatting\n                                    // if we remove the '<span class=\"Apple-converted-space\"> </span>' here we destroy the spacing\n                                    // on paste from even ourselves!\n                                    if (!text.match(/<span class=(\\\"Apple-converted-space\\\"|\\'Apple-converted-space\\')>.<\\/span>/ig)) {\n                                        text = text.replace(/<(|\\/)span[^>]*?>/ig, '');\n                                    }\n                                }\n                                // Webkit on Apple tags\n                                text = text.replace(/<br class=\"Apple-interchange-newline\"[^>]*?>/ig, '').replace(/<span class=\"Apple-converted-space\">( |&nbsp;)<\\/span>/ig, '&nbsp;');\n                            }\n\n                            if (/<li(\\s.*)?>/i.test(text) && /(<ul(\\s.*)?>|<ol(\\s.*)?>).*<li(\\s.*)?>/i.test(text) === false) {\n                                // insert missing parent of li element\n                                text = text.replace(/<li(\\s.*)?>.*<\\/li(\\s.*)?>/i, '<ul>$&</ul>');\n                            }\n\n                            // parse whitespace from plaintext input, starting with preceding spaces that get stripped on paste\n                            text = text.replace(/^[ |\\u00A0]+/gm, function (match) {\n                                var result = '';\n                                for (var i = 0; i < match.length; i++) {\n                                    result += '&nbsp;';\n                                }\n                                return result;\n                            }).replace(/\\n|\\r\\n|\\r/g, '<br />').replace(/\\t/g, '&nbsp;&nbsp;&nbsp;&nbsp;');\n\n                            if(_pasteHandler) text = _pasteHandler(scope, {$html: text}) || text;\n\n                            // turn span vertical-align:super into <sup></sup>\n                            text = text.replace(/<span style=(\"|')([^<]*?)vertical-align\\s*:\\s*super;?([^>]*?)(\"|')>([^<]+?)<\\/span>/g, \"<sup style='$2$3'>$5</sup>\");\n\n                            text = taSanitize(text, '', _disableSanitizer);\n                            //console.log('DONE\\n', text);\n\n                            taSelection.insertHtml(text, element[0]);\n                            $timeout(function(){\n                                ngModel.$setViewValue(_compileHtml());\n                                _processingPaste = false;\n                                element.removeClass('processing-paste');\n                            }, 0);\n                        }else{\n                            _processingPaste = false;\n                            element.removeClass('processing-paste');\n                        }\n                    };\n\n                    element.on('paste', scope.events.paste = function(e, eventData){\n                        /* istanbul ignore else: this is for catching the jqLite testing*/\n                        if(eventData) angular.extend(e, eventData);\n                        if(_isReadonly || _processingPaste){\n                            e.stopPropagation();\n                            e.preventDefault();\n                            return false;\n                        }\n\n                        // Code adapted from http://stackoverflow.com/questions/2176861/javascript-get-clipboard-data-on-paste-event-cross-browser/6804718#6804718\n                        _processingPaste = true;\n                        element.addClass('processing-paste');\n                        var pastedContent;\n                        var clipboardData = (e.originalEvent || e).clipboardData;\n                        /* istanbul ignore next: Handle legacy IE paste */\n                        if ( !clipboardData && window.clipboardData && window.clipboardData.getData ){\n                            pastedContent = window.clipboardData.getData(\"Text\");\n                            processpaste(pastedContent);\n                            e.stopPropagation();\n                            e.preventDefault();\n                            return false;\n                        }\n                        if (clipboardData && clipboardData.getData && clipboardData.types.length > 0) {// Webkit - get data from clipboard, put into editdiv, cleanup, then cancel event\n                            var _types = \"\";\n                            for(var _t = 0; _t < clipboardData.types.length; _t++){\n                                _types += \" \" + clipboardData.types[_t];\n                            }\n                            /* istanbul ignore next: browser tests */\n                            if (/text\\/html/i.test(_types)) {\n                                pastedContent = clipboardData.getData('text/html');\n                            } else if (/text\\/plain/i.test(_types)) {\n                                pastedContent = clipboardData.getData('text/plain');\n                            }\n                            processpaste(pastedContent);\n                            e.stopPropagation();\n                            e.preventDefault();\n                            return false;\n                        } else {// Everything else - empty editdiv and allow browser to paste content into it, then cleanup\n                            var _savedSelection = rangy.saveSelection(),\n                                _tempDiv = angular.element('<div class=\"ta-hidden-input\" contenteditable=\"true\"></div>');\n                            $document.find('body').append(_tempDiv);\n                            _tempDiv[0].focus();\n                            $timeout(function(){\n                                // restore selection\n                                rangy.restoreSelection(_savedSelection);\n                                processpaste(_tempDiv[0].innerHTML);\n                                element[0].focus();\n                                _tempDiv.remove();\n                            }, 0);\n                        }\n                    });\n                    element.on('cut', scope.events.cut = function(e){\n                        // timeout to next is needed as otherwise the paste/cut event has not finished actually changing the display\n                        if(!_isReadonly) $timeout(function(){\n                            ngModel.$setViewValue(_compileHtml());\n                        }, 0);\n                        else e.preventDefault();\n                    });\n\n                    element.on('keydown', scope.events.keydown = function(event, eventData){\n                        /* istanbul ignore else: this is for catching the jqLite testing*/\n                        if(eventData) angular.extend(event, eventData);\n                        if (event.keyCode === _SHIFT_KEYCODE) {\n                            taSelection.setStateShiftKey(true);\n                        } else {\n                            taSelection.setStateShiftKey(false);\n                        }\n                        event.specialKey = _mapKeys(event);\n                        var userSpecialKey;\n                        /* istanbul ignore next: difficult to test */\n                        taOptions.keyMappings.forEach(function (mapping) {\n                            if (event.specialKey === mapping.commandKeyCode) {\n                                // taOptions has remapped this binding... so\n                                // we disable our own\n                                event.specialKey = undefined;\n                            }\n                            if (mapping.testForKey(event)) {\n                                userSpecialKey = mapping.commandKeyCode;\n                            }\n                            if ((mapping.commandKeyCode === 'UndoKey') || (mapping.commandKeyCode === 'RedoKey')) {\n                                // this is necessary to fully stop the propagation.\n                                if (!mapping.enablePropagation) {\n                                    event.preventDefault();\n                                }\n                            }\n                        });\n                        /* istanbul ignore next: difficult to test */\n                        if (typeof userSpecialKey !== 'undefined') {\n                            event.specialKey = userSpecialKey;\n                        }\n                        /* istanbul ignore next: difficult to test as can't seem to select */\n                        if ((typeof event.specialKey !== 'undefined') && (\n                                event.specialKey !== 'UndoKey' || event.specialKey !== 'RedoKey'\n                            )) {\n                            event.preventDefault();\n                            textAngularManager.sendKeyCommand(scope, event);\n                        }\n                        /* istanbul ignore else: readonly check */\n                        if(!_isReadonly){\n                            if (event.specialKey==='UndoKey') {\n                                _undo();\n                                event.preventDefault();\n                            }\n                            if (event.specialKey==='RedoKey') {\n                                _redo();\n                                event.preventDefault();\n                            }\n                            /* istanbul ignore next: difficult to test as can't seem to select */\n                            if(event.keyCode === _ENTER_KEYCODE && !event.shiftKey && !event.ctrlKey && !event.metaKey && !event.altKey)\n                            {\n                                var contains = function(a, obj) {\n                                    for (var i = 0; i < a.length; i++) {\n                                        if (a[i] === obj) {\n                                            return true;\n                                        }\n                                    }\n                                    return false;\n                                };\n                                var $selection;\n                                var selection = taSelection.getSelectionElement();\n                                // shifted to nodeName here from tagName since it is more widely supported see: http://stackoverflow.com/questions/4878484/difference-between-tagname-and-nodename\n                                if(!selection.nodeName.match(VALIDELEMENTS)) return;\n                                var _new = angular.element(_defaultVal);\n                                // if we are in the last element of a blockquote, or ul or ol and the element is blank\n                                // we need to pull the element outside of the said type\n                                var moveOutsideElements = ['blockquote', 'ul', 'ol'];\n                                if (contains(moveOutsideElements, selection.parentNode.tagName.toLowerCase())) {\n                                    if (/^<br(|\\/)>$/i.test(selection.innerHTML.trim()) && !selection.nextSibling) {\n                                        // if last element is blank, pull element outside.\n                                        $selection = angular.element(selection);\n                                        var _parent = $selection.parent();\n                                        _parent.after(_new);\n                                        $selection.remove();\n                                        if (_parent.children().length === 0) _parent.remove();\n                                        taSelection.setSelectionToElementStart(_new[0]);\n                                        event.preventDefault();\n                                    }\n                                    if (/^<[^>]+><br(|\\/)><\\/[^>]+>$/i.test(selection.innerHTML.trim())) {\n                                        $selection = angular.element(selection);\n                                        $selection.after(_new);\n                                        $selection.remove();\n                                        taSelection.setSelectionToElementStart(_new[0]);\n                                        event.preventDefault();\n                                    }\n                                }\n                            }\n                        }\n                    });\n                    var _keyupTimeout;\n                    element.on('keyup', scope.events.keyup = function(event, eventData){\n                        /* istanbul ignore else: this is for catching the jqLite testing*/\n                        if(eventData) angular.extend(event, eventData);\n                        taSelection.setStateShiftKey(false);\t// clear the ShiftKey state\n                        /* istanbul ignore next: FF specific bug fix */\n                        if (event.keyCode === _TAB_KEYCODE) {\n                            var _selection = taSelection.getSelection();\n                            if(_selection.start.element === element[0] && element.children().length) taSelection.setSelectionToElementStart(element.children()[0]);\n                            return;\n                        }\n                        // we do this here during the 'keyup' so that the browser has already moved the slection by one character...\n                        if (event.keyCode === _LEFT_ARROW_KEYCODE && !event.shiftKey) {\n                            taSelection.updateLeftArrowKey(element);\n                        }\n                        // we do this here during the 'keyup' so that the browser has already moved the slection by one character...\n                        if (event.keyCode === _RIGHT_ARROW_KEYCODE && !event.shiftKey) {\n                            taSelection.updateRightArrowKey(element);\n                        }\n                        if(_undoKeyupTimeout) $timeout.cancel(_undoKeyupTimeout);\n                        if(!_isReadonly && !BLOCKED_KEYS.test(event.keyCode)){\n                            /* istanbul ignore next: Ignore any _ENTER_KEYCODE that has ctrlKey, metaKey or alKey */\n                            if (event.keyCode === _ENTER_KEYCODE && (event.ctrlKey || event.metaKey || event.altKey)) {\n                                // we ignore any ENTER_\tKEYCODE that is anything but plain or a shift one...\n                            } else {\n                                // if enter - insert new taDefaultWrap, if shift+enter insert <br/>\n                                if(_defaultVal !== '' && _defaultVal !== '<BR><BR>' && event.keyCode === _ENTER_KEYCODE && !event.ctrlKey && !event.metaKey && !event.altKey){\n                                    var selection = taSelection.getSelectionElement();\n                                    while(!selection.nodeName.match(VALIDELEMENTS) && selection !== element[0]){\n                                        selection = selection.parentNode;\n                                    }\n                                    if(!event.shiftKey){\n                                        // new paragraph, br should be caught correctly\n                                        // shifted to nodeName here from tagName since it is more widely supported see: http://stackoverflow.com/questions/4878484/difference-between-tagname-and-nodename\n                                        //console.log('Enter', selection.nodeName, attrs.taDefaultWrap, selection.innerHTML.trim());\n                                        if(selection.tagName.toLowerCase() !==\n                                            attrs.taDefaultWrap &&\n                                            selection.nodeName.toLowerCase() !== 'li' &&\n                                            (selection.innerHTML.trim() === '' || selection.innerHTML.trim() === '<br>')\n                                        ) {\n                                            // Chrome starts with a <div><br></div> after an EnterKey\n                                            // so we replace this with the _defaultVal\n                                            var _new = angular.element(_defaultVal);\n                                            angular.element(selection).replaceWith(_new);\n                                            taSelection.setSelectionToElementStart(_new[0]);\n                                        }\n                                    } else {\n                                        // shift + Enter\n                                        var tagName = selection.tagName.toLowerCase();\n                                        //console.log('Shift+Enter', selection.tagName, attrs.taDefaultWrap, selection.innerHTML.trim());\n                                        // For an LI: We see: LI p ....<br><br>\n                                        // For a P: We see: P p ....<br><br>\n                                        // on Safari, the browser ignores the Shift+Enter and acts just as an Enter Key\n                                        // For an LI: We see: LI p <br>\n                                        // For a P: We see: P p <br>\n                                        if((tagName === attrs.taDefaultWrap ||\n                                            tagName === 'li' ||\n                                            tagName === 'pre' ||\n                                            tagName === 'div') &&\n                                            !/.+<br><br>/.test(selection.innerHTML.trim())) {\n                                            var ps = selection.previousSibling;\n                                            //console.log('wrong....', ps);\n                                            // we need to remove this selection and fix the previousSibling up...\n                                            if (ps) {\n                                                ps.innerHTML = ps.innerHTML + '<br><br>';\n                                                angular.element(selection).remove();\n                                                taSelection.setSelectionToElementEnd(ps);\n                                            }\n                                        }\n                                    }\n                                }\n                                var val = _compileHtml();\n                                if(_defaultVal !== '' && (val.trim() === '' || val.trim() === '<br>')){\n                                    _setInnerHTML(_defaultVal);\n                                    taSelection.setSelectionToElementStart(element.children()[0]);\n                                }else if(val.substring(0, 1) !== '<' && attrs.taDefaultWrap !== ''){\n                                    /* we no longer do this, since there can be comments here and white space\n                                     var _savedSelection = rangy.saveSelection();\n                                     val = _compileHtml();\n                                     val = \"<\" + attrs.taDefaultWrap + \">\" + val + \"</\" + attrs.taDefaultWrap + \">\";\n                                     _setInnerHTML(val);\n                                     rangy.restoreSelection(_savedSelection);\n                                     */\n                                }\n                                var triggerUndo = _lastKey !== event.keyCode && UNDO_TRIGGER_KEYS.test(event.keyCode);\n                                if(_keyupTimeout) $timeout.cancel(_keyupTimeout);\n                                _keyupTimeout = $timeout(function() {\n                                    _setViewValue(val, triggerUndo, true);\n                                }, ngModelOptions.$options.debounce || 400);\n                                if(!triggerUndo) _undoKeyupTimeout = $timeout(function(){ ngModel.$undoManager.push(val); }, 250);\n                                _lastKey = event.keyCode;\n                            }\n                        }\n                    });\n\n                    // when there is a change from a spelling correction in the browser, the only\n                    // change that is seen is a 'input' and the $watch('html') sees nothing... So\n                    // we added this element.on('input') to catch this change and call the _setViewValue()\n                    // so the ngModel is updated and all works as it should.\n                    var _inputTimeout;\n                    element.on('input', function() {\n                        if (_compileHtml() !== ngModel.$viewValue) {\n                            // we wait a time now to allow the natural $watch('html') to handle this change\n                            // and then after a 1 second delay, if there is still a difference we will do the\n                            // _setViewValue() call.\n                            /* istanbul ignore if: can't test */\n                            if(_inputTimeout) $timeout.cancel(_inputTimeout);\n                            /* istanbul ignore next: cant' test? */\n                            _inputTimeout = $timeout(function() {\n                                var _savedSelection = rangy.saveSelection();\n                                var _val = _compileHtml();\n                                if (_val !== ngModel.$viewValue) {\n                                    //console.log('_setViewValue');\n                                    //console.log('old:', ngModel.$viewValue);\n                                    //console.log('new:', _val);\n                                    _setViewValue(_val, true);\n                                }\n                                // if the savedSelection marker is gone at this point, we cannot restore the selection!!!\n                                //console.log('rangy.restoreSelection', ngModel.$viewValue.length, _savedSelection);\n                                if (ngModel.$viewValue.length !== 0) {\n                                    rangy.restoreSelection(_savedSelection);\n                                }\n                            }, 1000);\n                        }\n                    });\n\n                    element.on('blur', scope.events.blur = function(){\n                        _focussed = false;\n                        /* istanbul ignore else: if readonly don't update model */\n                        if(!_isReadonly){\n                            _setViewValue(undefined, undefined, true);\n                        }else{\n                            _skipRender = true; // don't redo the whole thing, just check the placeholder logic\n                            ngModel.$render();\n                        }\n                    });\n\n                    // Placeholders not supported on ie 8 and below\n                    if(attrs.placeholder && (_browserDetect.ie > 8 || _browserDetect.ie === undefined)){\n                        var rule;\n                        if(attrs.id) rule = addCSSRule('#' + attrs.id + '.placeholder-text:before', 'content: \"' + attrs.placeholder + '\"');\n                        else throw('textAngular Error: An unique ID is required for placeholders to work');\n\n                        scope.$on('$destroy', function(){\n                            removeCSSRule(rule);\n                        });\n                    }\n\n                    element.on('focus', scope.events.focus = function(){\n                        _focussed = true;\n                        element.removeClass('placeholder-text');\n                        _reApplyOnSelectorHandlers();\n                    });\n\n                    element.on('mouseup', scope.events.mouseup = function(){\n                        var _selection = taSelection.getSelection();\n                        if(_selection && _selection.start.element === element[0] && element.children().length) taSelection.setSelectionToElementStart(element.children()[0]);\n                    });\n\n                    // prevent propagation on mousedown in editor, see #206\n                    element.on('mousedown', scope.events.mousedown = function(event, eventData){\n                        /* istanbul ignore else: this is for catching the jqLite testing*/\n                        if(eventData) angular.extend(event, eventData);\n                        event.stopPropagation();\n                    });\n                }\n            }\n\n            var fileDropHandler = function(event, eventData){\n                /* istanbul ignore else: this is for catching the jqLite testing*/\n                if(eventData) angular.extend(event, eventData);\n                // emit the drop event, pass the element, preventing should be done elsewhere\n                if(!dropFired && !_isReadonly){\n                    dropFired = true;\n                    var dataTransfer;\n                    if(event.originalEvent) dataTransfer = event.originalEvent.dataTransfer;\n                    else dataTransfer = event.dataTransfer;\n                    scope.$emit('ta-drop-event', this, event, dataTransfer);\n                    $timeout(function(){\n                        dropFired = false;\n                        _setViewValue(undefined, undefined, true);\n                    }, 100);\n                }\n            };\n\n            var _renderTimeout;\n            var _renderInProgress = false;\n            // changes to the model variable from outside the html/text inputs\n            ngModel.$render = function(){\n                /* istanbul ignore if: Catches rogue renders, hard to replicate in tests */\n                if(_renderInProgress) return;\n                else _renderInProgress = true;\n                // catch model being null or undefined\n                var val = ngModel.$viewValue || '';\n                // if the editor isn't focused it needs to be updated, otherwise it's receiving user input\n                if(!_skipRender){\n                    /* istanbul ignore else: in other cases we don't care */\n                    if(_isContentEditable && _focussed){\n                        // update while focussed\n                        element.removeClass('placeholder-text');\n                        /* istanbul ignore next: don't know how to test this */\n                        if(_renderTimeout) $timeout.cancel(_renderTimeout);\n                        _renderTimeout = $timeout(function(){\n                            /* istanbul ignore if: Can't be bothered testing this... */\n                            if(!_focussed){\n                                element[0].focus();\n                                taSelection.setSelectionToElementEnd(element.children()[element.children().length - 1]);\n                            }\n                            _renderTimeout = undefined;\n                        }, 1);\n                    }\n                    if(_isContentEditable){\n                        // WYSIWYG Mode\n                        if(attrs.placeholder){\n                            if(val === ''){\n                                // blank\n                                _setInnerHTML(_defaultVal);\n                            }else{\n                                // not-blank\n                                _setInnerHTML(val);\n                            }\n                        }else{\n                            _setInnerHTML((val === '') ? _defaultVal : val);\n                        }\n                        // if in WYSIWYG and readOnly we kill the use of links by clicking\n                        if(!_isReadonly){\n                            _reApplyOnSelectorHandlers();\n                            element.on('drop', fileDropHandler);\n                        }else{\n                            element.off('drop', fileDropHandler);\n                        }\n                    }else if(element[0].tagName.toLowerCase() !== 'textarea' && element[0].tagName.toLowerCase() !== 'input'){\n                        // make sure the end user can SEE the html code as a display. This is a read-only display element\n                        _setInnerHTML(taApplyCustomRenderers(val));\n                    }else{\n                        // only for input and textarea inputs\n                        element.val(val);\n                    }\n                }\n                if(_isContentEditable && attrs.placeholder){\n                    if(val === ''){\n                        if(_focussed) element.removeClass('placeholder-text');\n                        else element.addClass('placeholder-text');\n                    }else{\n                        element.removeClass('placeholder-text');\n                    }\n                }\n                _renderInProgress = _skipRender = false;\n            };\n\n            if(attrs.taReadonly){\n                //set initial value\n                _isReadonly = scope.$eval(attrs.taReadonly);\n                if(_isReadonly){\n                    element.addClass('ta-readonly');\n                    // we changed to readOnly mode (taReadonly='true')\n                    if(element[0].tagName.toLowerCase() === 'textarea' || element[0].tagName.toLowerCase() === 'input'){\n                        element.attr('disabled', 'disabled');\n                    }\n                    if(element.attr('contenteditable') !== undefined && element.attr('contenteditable')){\n                        element.removeAttr('contenteditable');\n                    }\n                }else{\n                    element.removeClass('ta-readonly');\n                    // we changed to NOT readOnly mode (taReadonly='false')\n                    if(element[0].tagName.toLowerCase() === 'textarea' || element[0].tagName.toLowerCase() === 'input'){\n                        element.removeAttr('disabled');\n                    }else if(_isContentEditable){\n                        element.attr('contenteditable', 'true');\n                    }\n                }\n                // taReadonly only has an effect if the taBind element is an input or textarea or has contenteditable='true' on it.\n                // Otherwise it is readonly by default\n                scope.$watch(attrs.taReadonly, function(newVal, oldVal){\n                    if(oldVal === newVal) return;\n                    if(newVal){\n                        element.addClass('ta-readonly');\n                        // we changed to readOnly mode (taReadonly='true')\n                        if(element[0].tagName.toLowerCase() === 'textarea' || element[0].tagName.toLowerCase() === 'input'){\n                            element.attr('disabled', 'disabled');\n                        }\n                        if(element.attr('contenteditable') !== undefined && element.attr('contenteditable')){\n                            element.removeAttr('contenteditable');\n                        }\n                        // turn ON selector click handlers\n                        angular.forEach(taSelectableElements, function(selector){\n                            element.find(selector).on('click', selectorClickHandler);\n                        });\n                        element.off('drop', fileDropHandler);\n                    }else{\n                        element.removeClass('ta-readonly');\n                        // we changed to NOT readOnly mode (taReadonly='false')\n                        if(element[0].tagName.toLowerCase() === 'textarea' || element[0].tagName.toLowerCase() === 'input'){\n                            element.removeAttr('disabled');\n                        }else if(_isContentEditable){\n                            element.attr('contenteditable', 'true');\n                        }\n                        // remove the selector click handlers\n                        angular.forEach(taSelectableElements, function(selector){\n                            element.find(selector).off('click', selectorClickHandler);\n                        });\n                        element.on('drop', fileDropHandler);\n                    }\n                    _isReadonly = newVal;\n                });\n            }\n\n            // Initialise the selectableElements\n            // if in WYSIWYG and readOnly we kill the use of links by clicking\n            if(_isContentEditable && !_isReadonly){\n                angular.forEach(taSelectableElements, function(selector){\n                    element.find(selector).on('click', selectorClickHandler);\n                });\n                element.on('drop', fileDropHandler);\n            }\n        }\n    };\n}]);\n\n// this global var is used to prevent multiple fires of the drop event. Needs to be global to the textAngular file.\nvar dropFired = false;\nvar textAngular = angular.module(\"textAngular\", ['ngSanitize', 'textAngularSetup', 'textAngular.factories', 'textAngular.DOM', 'textAngular.validators', 'textAngular.taBind']); //This makes ngSanitize required\n\ntextAngular.config([function(){\n    // clear taTools variable. Just catches testing and any other time that this config may run multiple times...\n    angular.forEach(taTools, function(value, key){ delete taTools[key];\t});\n}]);\n\ntextAngular.directive(\"textAngular\", [\n    '$compile', '$timeout', 'taOptions', 'taSelection', 'taExecCommand',\n    'textAngularManager', '$document', '$animate', '$log', '$q', '$parse',\n    function($compile, $timeout, taOptions, taSelection, taExecCommand,\n        textAngularManager, $document, $animate, $log, $q, $parse){\n        return {\n            require: '?ngModel',\n            scope: {},\n            restrict: \"EA\",\n            priority: 2, // So we override validators correctly\n            link: function(scope, element, attrs, ngModel){\n                // all these vars should not be accessable outside this directive\n                var _keydown, _keyup, _keypress, _mouseup, _focusin, _focusout,\n                    _originalContents, _editorFunctions,\n                    _serial = (attrs.serial) ? attrs.serial : Math.floor(Math.random() * 10000000000000000),\n                    _taExecCommand, _resizeMouseDown, _updateSelectedStylesTimeout;\n                var _resizeTimeout;\n\n                scope._name = (attrs.name) ? attrs.name : 'textAngularEditor' + _serial;\n\n                var oneEvent = function(_element, event, action){\n                    $timeout(function(){\n                        _element.one(event, action);\n                    }, 100);\n                };\n                _taExecCommand = taExecCommand(attrs.taDefaultWrap);\n                // get the settings from the defaults and add our specific functions that need to be on the scope\n                angular.extend(scope, angular.copy(taOptions), {\n                    // wraps the selection in the provided tag / execCommand function. Should only be called in WYSIWYG mode.\n                    wrapSelection: function(command, opt, isSelectableElementTool){\n                        // we restore the saved selection that was saved when focus was lost\n                        /* NOT FUNCTIONAL YET */\n                        /* textAngularManager.restoreFocusSelection(scope._name, scope); */\n                        if(command.toLowerCase() === \"undo\"){\n                            scope['$undoTaBindtaTextElement' + _serial]();\n                        }else if(command.toLowerCase() === \"redo\"){\n                            scope['$redoTaBindtaTextElement' + _serial]();\n                        }else{\n                            // catch errors like FF erroring when you try to force an undo with nothing done\n                            _taExecCommand(command, false, opt, scope.defaultTagAttributes);\n                            if(isSelectableElementTool){\n                                // re-apply the selectable tool events\n                                scope['reApplyOnSelectorHandlerstaTextElement' + _serial]();\n                            }\n                            // refocus on the shown display element, this fixes a display bug when using :focus styles to outline the box.\n                            // You still have focus on the text/html input it just doesn't show up\n                            scope.displayElements.text[0].focus();\n                        }\n                    },\n                    showHtml: scope.$eval(attrs.taShowHtml) || false\n                });\n                // setup the options from the optional attributes\n                if(attrs.taFocussedClass)\t\t\tscope.classes.focussed = attrs.taFocussedClass;\n                if(attrs.taTextEditorClass)\t\t\tscope.classes.textEditor = attrs.taTextEditorClass;\n                if(attrs.taHtmlEditorClass)\t\t\tscope.classes.htmlEditor = attrs.taHtmlEditorClass;\n                if(attrs.taDefaultTagAttributes){\n                    try\t{\n                        //\tTODO: This should use angular.merge to enhance functionality once angular 1.4 is required\n                        angular.extend(scope.defaultTagAttributes, angular.fromJson(attrs.taDefaultTagAttributes));\n                    } catch (error) {\n                        $log.error(error);\n                    }\n                }\n                // optional setup functions\n                if(attrs.taTextEditorSetup)\t\t\tscope.setup.textEditorSetup = scope.$parent.$eval(attrs.taTextEditorSetup);\n                if(attrs.taHtmlEditorSetup)\t\t\tscope.setup.htmlEditorSetup = scope.$parent.$eval(attrs.taHtmlEditorSetup);\n                // optional fileDropHandler function\n                if(attrs.taFileDrop)\t\t\t\tscope.fileDropHandler = scope.$parent.$eval(attrs.taFileDrop);\n                else\t\t\t\t\t\t\t\tscope.fileDropHandler = scope.defaultFileDropHandler;\n\n                _originalContents = element[0].innerHTML;\n                // clear the original content\n                element[0].innerHTML = '';\n\n                // Setup the HTML elements as variable references for use later\n                scope.displayElements = {\n                    // we still need the hidden input even with a textarea as the textarea may have invalid/old input in it,\n                    // wheras the input will ALLWAYS have the correct value.\n                    forminput: angular.element(\"<input type='hidden' tabindex='-1' style='display: none;'>\"),\n                    html: angular.element(\"<textarea></textarea>\"),\n                    text: angular.element(\"<div></div>\"),\n                    // other toolbased elements\n                    scrollWindow: angular.element(\"<div class='ta-scroll-window'></div>\"),\n                    popover: angular.element('<div class=\"popover fade bottom\" style=\"max-width: none; width: 305px;\"></div>'),\n                    popoverArrow: angular.element('<div class=\"arrow\"></div>'),\n                    popoverContainer: angular.element('<div class=\"popover-content\"></div>'),\n                    resize: {\n                        overlay: angular.element('<div class=\"ta-resizer-handle-overlay\"></div>'),\n                        background: angular.element('<div class=\"ta-resizer-handle-background\"></div>'),\n                        anchors: [\n                            angular.element('<div class=\"ta-resizer-handle-corner ta-resizer-handle-corner-tl\"></div>'),\n                            angular.element('<div class=\"ta-resizer-handle-corner ta-resizer-handle-corner-tr\"></div>'),\n                            angular.element('<div class=\"ta-resizer-handle-corner ta-resizer-handle-corner-bl\"></div>'),\n                            angular.element('<div class=\"ta-resizer-handle-corner ta-resizer-handle-corner-br\"></div>')\n                        ],\n                        info: angular.element('<div class=\"ta-resizer-handle-info\"></div>')\n                    }\n                };\n\n                // Setup the popover\n                scope.displayElements.popover.append(scope.displayElements.popoverArrow);\n                scope.displayElements.popover.append(scope.displayElements.popoverContainer);\n                scope.displayElements.scrollWindow.append(scope.displayElements.popover);\n\n                scope.displayElements.popover.on('mousedown', function(e, eventData){\n                    /* istanbul ignore else: this is for catching the jqLite testing*/\n                    if(eventData) angular.extend(e, eventData);\n                    // this prevents focusout from firing on the editor when clicking anything in the popover\n                    e.preventDefault();\n                    return false;\n                });\n\n                /* istanbul ignore next: popover resize and scroll events handled */\n                scope.handlePopoverEvents = function() {\n                    if (scope.displayElements.popover.css('display')==='block') {\n                        if(_resizeTimeout) $timeout.cancel(_resizeTimeout);\n                        _resizeTimeout = $timeout(function() {\n                            //console.log('resize', scope.displayElements.popover.css('display'));\n                            scope.reflowPopover(scope.resizeElement);\n                            scope.reflowResizeOverlay(scope.resizeElement);\n                        }, 100);\n                    }\n                };\n\n                /* istanbul ignore next: browser resize check */\n                angular.element(window).on('resize', scope.handlePopoverEvents);\n\n                /* istanbul ignore next: browser scroll check */\n                angular.element(window).on('scroll', scope.handlePopoverEvents);\n\n                // we want to know if a given node has a scrollbar!\n                // credit to lotif on http://stackoverflow.com/questions/4880381/check-whether-html-element-has-scrollbars\n                var isScrollable = function(node) {\n                    var cs;\n                    var _notScrollable = {\n                        vertical: false,\n                        horizontal: false,\n                    };\n                    try {\n                        cs = window.getComputedStyle(node);\n                        if (cs === null) {\n                            return _notScrollable;\n                        }\n                    } catch (e) {\n                        /* istanbul ignore next: error handler */\n                        return _notScrollable;\n                    }\n                    var overflowY = cs['overflow-y'];\n                    var overflowX = cs['overflow-x'];\n                    return {\n                        vertical: (overflowY === 'scroll' || overflowY === 'auto') &&\n                                    /* istanbul ignore next: not tested */\n                                    node.scrollHeight > node.clientHeight,\n                        horizontal: (overflowX === 'scroll' || overflowX === 'auto') &&\n                                    /* istanbul ignore next: not tested */\n                                    node.scrollWidth > node.clientWidth,\n                    };\n                };\n\n                // getScrollTop\n                //\n                // we structure this so that it can climb the parents of the _el and when it finds\n                // one with scrollbars, it adds an EventListener, so that no matter how the\n                // DOM is structured in the user APP, if there is a scrollbar not as part of the\n                // ta-scroll-window, we will still capture the 'scroll' events...\n                // and handle the scroll event properly and do the resize, etc.\n                //\n                scope.getScrollTop = function (_el, bAddListener) {\n                    var scrollTop = _el.scrollTop;\n                    if (typeof scrollTop === 'undefined') {\n                        scrollTop = 0;\n                    }\n                    /* istanbul ignore next: triggered only if has scrollbar */\n                    if (bAddListener && isScrollable(_el).vertical) {\n                        // remove element eventListener\n                        _el.removeEventListener('scroll', scope._scrollListener, false);\n                        _el.addEventListener('scroll', scope._scrollListener, false);\n                    }\n                    /* istanbul ignore next: triggered only if has scrollbar and scrolled */\n                    if (scrollTop !== 0) {\n                        return { node:_el.nodeName, top:scrollTop };\n                    }\n                    /* istanbul ignore else: catches only if no scroll */\n                    if (_el.parentNode) {\n                        return scope.getScrollTop(_el.parentNode, bAddListener);\n                    } else {\n                        return { node:'<none>', top:0 };\n                    }\n                };\n\n                // define the popover show and hide functions\n                scope.showPopover = function(_el){\n                    scope.getScrollTop(scope.displayElements.scrollWindow[0], true);\n                    scope.displayElements.popover.css('display', 'block');\n                    // we must use a $timeout here, or the css change to the\n                    // displayElements.resize.overlay will not take!!!\n                    // WHY???\n                    $timeout(function() {\n                        scope.displayElements.resize.overlay.css('display', 'block');\n                    });\n                    scope.resizeElement = _el;\n                    scope.reflowPopover(_el);\n                    $animate.addClass(scope.displayElements.popover, 'in');\n                    oneEvent($document.find('body'), 'click keyup', function(){scope.hidePopover();});\n                };\n\n                /* istanbul ignore next: browser scroll event handler */\n                scope._scrollListener = function (e, eventData){\n                    scope.handlePopoverEvents();\n                };\n\n                scope.reflowPopover = function(_el){\n                    var scrollTop = scope.getScrollTop(scope.displayElements.scrollWindow[0], false);\n                    var spaceAboveImage = _el[0].offsetTop-scrollTop.top;\n                    //var spaceBelowImage = scope.displayElements.text[0].offsetHeight - _el[0].offsetHeight - spaceAboveImage;\n                    //console.log(spaceAboveImage, spaceBelowImage);\n\n                    /* istanbul ignore if: catches only if near bottom of editor */\n                    if(spaceAboveImage < 51) {\n                        scope.displayElements.popover.css('top', _el[0].offsetTop + _el[0].offsetHeight + scope.displayElements.scrollWindow[0].scrollTop + 'px');\n                        scope.displayElements.popover.removeClass('top').addClass('bottom');\n                    } else {\n                        scope.displayElements.popover.css('top', _el[0].offsetTop - 54 + scope.displayElements.scrollWindow[0].scrollTop + 'px');\n                        scope.displayElements.popover.removeClass('bottom').addClass('top');\n                    }\n                    var _maxLeft = scope.displayElements.text[0].offsetWidth - scope.displayElements.popover[0].offsetWidth;\n                    var _targetLeft = _el[0].offsetLeft + (_el[0].offsetWidth / 2.0) - (scope.displayElements.popover[0].offsetWidth / 2.0);\n                    var _rleft = Math.max(0, Math.min(_maxLeft, _targetLeft));\n                    var _marginLeft = (Math.min(_targetLeft, (Math.max(0, _targetLeft - _maxLeft))) - 11);\n                    _rleft += window.scrollX;\n                    _marginLeft -= window.scrollX;\n                    scope.displayElements.popover.css('left', _rleft + 'px');\n                    scope.displayElements.popoverArrow.css('margin-left', _marginLeft + 'px');\n                };\n                scope.hidePopover = function(){\n                    scope.displayElements.popover.css('display', 'none');\n                    scope.displayElements.popoverContainer.attr('style', '');\n                    scope.displayElements.popoverContainer.attr('class', 'popover-content');\n                    scope.displayElements.popover.removeClass('in');\n                    scope.displayElements.resize.overlay.css('display', 'none');\n                };\n\n                // setup the resize overlay\n                scope.displayElements.resize.overlay.append(scope.displayElements.resize.background);\n                angular.forEach(scope.displayElements.resize.anchors, function(anchor){ scope.displayElements.resize.overlay.append(anchor);});\n                scope.displayElements.resize.overlay.append(scope.displayElements.resize.info);\n                scope.displayElements.scrollWindow.append(scope.displayElements.resize.overlay);\n\n                // A click event on the resize.background will now shift the focus to the editor\n                /* istanbul ignore next: click on the resize.background to focus back to editor */\n                scope.displayElements.resize.background.on('click', function(e) {\n                    scope.displayElements.text[0].focus();\n                });\n\n                // define the show and hide events\n                scope.reflowResizeOverlay = function(_el){\n                    _el = angular.element(_el)[0];\n                    scope.displayElements.resize.overlay.css({\n                        'display': 'block',\n                        'left': _el.offsetLeft - 5 + 'px',\n                        'top': _el.offsetTop - 5 + 'px',\n                        'width': _el.offsetWidth + 10 + 'px',\n                        'height': _el.offsetHeight + 10 + 'px'\n                    });\n                    scope.displayElements.resize.info.text(_el.offsetWidth + ' x ' + _el.offsetHeight);\n                };\n                /* istanbul ignore next: pretty sure phantomjs won't test this */\n                scope.showResizeOverlay = function(_el){\n                    var _body = $document.find('body');\n                    _resizeMouseDown = function(event){\n                        var startPosition = {\n                            width: parseInt(_el.attr('width')),\n                            height: parseInt(_el.attr('height')),\n                            x: event.clientX,\n                            y: event.clientY\n                        };\n                        if(startPosition.width === undefined || isNaN(startPosition.width)) startPosition.width = _el[0].offsetWidth;\n                        if(startPosition.height === undefined || isNaN(startPosition.height)) startPosition.height = _el[0].offsetHeight;\n                        scope.hidePopover();\n                        var ratio = startPosition.height / startPosition.width;\n                        var mousemove = function(event){\n                            // calculate new size\n                            var pos = {\n                                x: Math.max(0, startPosition.width + (event.clientX - startPosition.x)),\n                                y: Math.max(0, startPosition.height + (event.clientY - startPosition.y))\n                            };\n\n                            // DEFAULT: the aspect ratio is not locked unless the Shift key is pressed.\n                            //\n                            // attribute: ta-resize-force-aspect-ratio -- locks resize into maintaing the aspect ratio\n                            var bForceAspectRatio = (attrs.taResizeForceAspectRatio !== undefined);\n                            // attribute: ta-resize-maintain-aspect-ratio=true causes the space ratio to remain locked\n                            // unless the Shift key is pressed\n                            var bFlipKeyBinding = attrs.taResizeMaintainAspectRatio;\n                            var bKeepRatio =  bForceAspectRatio || (bFlipKeyBinding && !event.shiftKey);\n                            if(bKeepRatio) {\n                                var newRatio = pos.y / pos.x;\n                                pos.x = ratio > newRatio ? pos.x : pos.y / ratio;\n                                pos.y = ratio > newRatio ? pos.x * ratio : pos.y;\n                            }\n                            var el = angular.element(_el);\n                            function roundedMaxVal(val) {\n                                return Math.round(Math.max(0, val));\n                            }\n                            el.css('height', roundedMaxVal(pos.y) + 'px');\n                            el.css('width', roundedMaxVal(pos.x) + 'px');\n\n                            // reflow the popover tooltip\n                            scope.reflowResizeOverlay(_el);\n                        };\n                        _body.on('mousemove', mousemove);\n                        oneEvent(_body, 'mouseup', function(event){\n                            event.preventDefault();\n                            event.stopPropagation();\n                            _body.off('mousemove', mousemove);\n                            // at this point, we need to force the model to update! since the css has changed!\n                            // this fixes bug: #862 - we now hide the popover -- as this seems more consitent.\n                            // there are still issues under firefox, the window does not repaint. -- not sure\n                            // how best to resolve this, but clicking anywhere works.\n                            scope.$apply(function (){\n                                scope.hidePopover();\n                                scope.updateTaBindtaTextElement();\n                            }, 100);\n                        });\n                        event.stopPropagation();\n                        event.preventDefault();\n                    };\n\n                    scope.displayElements.resize.anchors[3].off('mousedown');\n                    scope.displayElements.resize.anchors[3].on('mousedown', _resizeMouseDown);\n\n                    scope.reflowResizeOverlay(_el);\n                    oneEvent(_body, 'click', function(){scope.hideResizeOverlay();});\n                };\n                /* istanbul ignore next: pretty sure phantomjs won't test this */\n                scope.hideResizeOverlay = function(){\n                    scope.displayElements.resize.anchors[3].off('mousedown', _resizeMouseDown);\n                    scope.displayElements.resize.overlay.css('display', 'none');\n                };\n\n                // allow for insertion of custom directives on the textarea and div\n                scope.setup.htmlEditorSetup(scope.displayElements.html);\n                scope.setup.textEditorSetup(scope.displayElements.text);\n                scope.displayElements.html.attr({\n                    'id': 'taHtmlElement' + _serial,\n                    'ng-show': 'showHtml',\n                    'ta-bind': 'ta-bind',\n                    'ng-model': 'html',\n                    'ng-model-options': element.attr('ng-model-options')\n                });\n                scope.displayElements.text.attr({\n                    'id': 'taTextElement' + _serial,\n                    'contentEditable': 'true',\n                    'ta-bind': 'ta-bind',\n                    'ng-model': 'html',\n                    'ng-model-options': element.attr('ng-model-options')\n                });\n                scope.displayElements.scrollWindow.attr({'ng-hide': 'showHtml'});\n                if(attrs.taDefaultWrap) {\n                    // taDefaultWrap is only applied to the text and not the html view\n                    scope.displayElements.text.attr('ta-default-wrap', attrs.taDefaultWrap);\n                }\n\n                if(attrs.taUnsafeSanitizer){\n                    scope.displayElements.text.attr('ta-unsafe-sanitizer', attrs.taUnsafeSanitizer);\n                    scope.displayElements.html.attr('ta-unsafe-sanitizer', attrs.taUnsafeSanitizer);\n                }\n\n                if(attrs.taKeepStyles){\n                    scope.displayElements.text.attr('ta-keep-styles', attrs.taKeepStyles);\n                    scope.displayElements.html.attr('ta-keep-styles', attrs.taKeepStyles);\n                }\n\n                // add the main elements to the origional element\n                scope.displayElements.scrollWindow.append(scope.displayElements.text);\n                element.append(scope.displayElements.scrollWindow);\n                element.append(scope.displayElements.html);\n\n                scope.displayElements.forminput.attr('name', scope._name);\n                element.append(scope.displayElements.forminput);\n\n                if(attrs.tabindex){\n                    element.removeAttr('tabindex');\n                    scope.displayElements.text.attr('tabindex', attrs.tabindex);\n                    scope.displayElements.html.attr('tabindex', attrs.tabindex);\n                }\n\n                if (attrs.placeholder) {\n                    scope.displayElements.text.attr('placeholder', attrs.placeholder);\n                    scope.displayElements.html.attr('placeholder', attrs.placeholder);\n                }\n\n                if(attrs.taDisabled){\n                    scope.displayElements.text.attr('ta-readonly', 'disabled');\n                    scope.displayElements.html.attr('ta-readonly', 'disabled');\n                    scope.disabled = scope.$parent.$eval(attrs.taDisabled);\n                    scope.$parent.$watch(attrs.taDisabled, function(newVal){\n                        scope.disabled = newVal;\n                        if(scope.disabled){\n                            element.addClass(scope.classes.disabled);\n                        }else{\n                            element.removeClass(scope.classes.disabled);\n                        }\n                    });\n                }\n\n                if(attrs.taPaste){\n                    scope._pasteHandler = function(_html){\n                        return $parse(attrs.taPaste)(scope.$parent, {$html: _html});\n                    };\n                    scope.displayElements.text.attr('ta-paste', '_pasteHandler($html)');\n                }\n\n                // compile the scope with the text and html elements only - if we do this with the main element it causes a compile loop\n                $compile(scope.displayElements.scrollWindow)(scope);\n                $compile(scope.displayElements.html)(scope);\n\n                scope.updateTaBindtaTextElement = scope['updateTaBindtaTextElement' + _serial];\n                scope.updateTaBindtaHtmlElement = scope['updateTaBindtaHtmlElement' + _serial];\n\n                // add the classes manually last\n                element.addClass(\"ta-root\");\n                scope.displayElements.scrollWindow.addClass(\"ta-text ta-editor \" + scope.classes.textEditor);\n                scope.displayElements.html.addClass(\"ta-html ta-editor \" + scope.classes.htmlEditor);\n\n                var testAndSet = function(choice, beforeState) {\n                    /* istanbul ignore next: this is only here because of a bug in rangy where rangy.saveSelection() has cleared the state */\n                    if (beforeState !== $document[0].queryCommandState(choice)) {\n                        $document[0].execCommand(choice, false, null);\n                    }\n                };\n                // used in the toolbar actions\n                scope._actionRunning = false;\n                var _savedSelection = false;\n                scope.startAction = function(){\n                    var _beforeStateBold = false;\n                    var _beforeStateItalic = false;\n                    var _beforeStateUnderline = false;\n                    var _beforeStateStrikethough = false;\n                    scope._actionRunning = true;\n                    _beforeStateBold = $document[0].queryCommandState('bold');\n                    _beforeStateItalic = $document[0].queryCommandState('italic');\n                    _beforeStateUnderline = $document[0].queryCommandState('underline');\n                    _beforeStateStrikethough = $document[0].queryCommandState('strikeThrough');\n                    //console.log('B', _beforeStateBold, 'I', _beforeStateItalic, '_', _beforeStateUnderline, 'S', _beforeStateStrikethough);\n                    // if rangy library is loaded return a function to reload the current selection\n                    _savedSelection = rangy.saveSelection();\n                    // rangy.saveSelection() clear the state of bold, italic, underline, strikethrough\n                    // so we reset them here....!!!\n                    // this fixes bugs #423, #1129, #1105, #693 which are actually rangy bugs!\n                    testAndSet('bold', _beforeStateBold);\n                    testAndSet('italic', _beforeStateItalic);\n                    testAndSet('underline', _beforeStateUnderline);\n                    testAndSet('strikeThrough', _beforeStateStrikethough);\n                    //console.log('B', $document[0].queryCommandState('bold'), 'I', $document[0].queryCommandState('italic'), '_', $document[0].queryCommandState('underline'), 'S', $document[0].queryCommandState('strikeThrough') );\n                    return function(){\n                        if(_savedSelection) rangy.restoreSelection(_savedSelection);\n                        // perhaps if we restore the selections here, we would do better overall???\n                        // BUT what we do above does well in 90% of the cases...\n                    };\n                };\n                scope.endAction = function(){\n                    scope._actionRunning = false;\n                    if(_savedSelection){\n                        if(scope.showHtml){\n                            scope.displayElements.html[0].focus();\n                        }else{\n                            scope.displayElements.text[0].focus();\n                        }\n                        // rangy.restoreSelection(_savedSelection);\n                        rangy.removeMarkers(_savedSelection);\n                    }\n                    _savedSelection = false;\n                    scope.updateSelectedStyles();\n                    // only update if in text or WYSIWYG mode\n                    if(!scope.showHtml) scope['updateTaBindtaTextElement' + _serial]();\n                };\n\n                // note that focusout > focusin is called everytime we click a button - except bad support: http://www.quirksmode.org/dom/events/blurfocus.html\n                // cascades to displayElements.text and displayElements.html automatically.\n                _focusin = function(e){\n                    scope.focussed = true;\n                    element.addClass(scope.classes.focussed);\n/*******  NOT FUNCTIONAL YET\n                    if (e.target.id === 'taTextElement' + _serial) {\n                        console.log('_focusin taTextElement');\n                        // we only do this if NOT focussed\n                        textAngularManager.restoreFocusSelection(scope._name);\n                    }\n*******/\n                    _editorFunctions.focus();\n                    element.triggerHandler('focus');\n                    // we call editorScope.updateSelectedStyles() here because we want the toolbar to be focussed\n                    // as soon as we have focus.  Otherwise this only happens on mousedown or keydown etc...\n                    /* istanbul ignore else: don't run if already running */\n                    if(scope.updateSelectedStyles && !scope._bUpdateSelectedStyles){\n                        // we don't set editorScope._bUpdateSelectedStyles here, because we do not want the\n                        // updateSelectedStyles() to run twice which it will do after 200 msec if we have\n                        // set editorScope._bUpdateSelectedStyles\n                        //\n                        // WOW, normally I would do a scope.$apply here, but this causes ERRORs when doing tests!\n                        $timeout(function () {\n                            scope.updateSelectedStyles();\n                        }, 0);\n                    }\n                };\n                scope.displayElements.html.on('focus', _focusin);\n                scope.displayElements.text.on('focus', _focusin);\n                _focusout = function(e){\n                    /****************** NOT FUNCTIONAL YET\n                    try {\n                        var _s = rangy.getSelection();\n                        if (_s) {\n                            // we save the selection when we loose focus so that if do a wrapSelection, the\n                            // apropriate selection in the editor is restored before action.\n                            var _savedFocusRange = rangy.saveRange(_s.getRangeAt(0));\n                            textAngularManager.saveFocusSelection(scope._name, _savedFocusRange);\n                        }\n                    } catch(error) { }\n                    *****************/\n                    // if we are NOT runnig an action and have NOT focussed again on the text etc then fire the blur events\n                    if(!scope._actionRunning &&\n                        $document[0].activeElement !== scope.displayElements.html[0] &&\n                        $document[0].activeElement !== scope.displayElements.text[0])\n                    {\n                        element.removeClass(scope.classes.focussed);\n                        _editorFunctions.unfocus();\n                        // to prevent multiple apply error defer to next seems to work.\n                        $timeout(function(){\n                            scope._bUpdateSelectedStyles = false;\n                            element.triggerHandler('blur');\n                            scope.focussed = false;\n                        }, 0);\n                    }\n                    e.preventDefault();\n                    return false;\n                };\n                scope.displayElements.html.on('blur', _focusout);\n                scope.displayElements.text.on('blur', _focusout);\n\n                scope.displayElements.text.on('paste', function(event){\n                    element.triggerHandler('paste', event);\n                });\n\n                // Setup the default toolbar tools, this way allows the user to add new tools like plugins.\n                // This is on the editor for future proofing if we find a better way to do this.\n                scope.queryFormatBlockState = function(command){\n                    // $document[0].queryCommandValue('formatBlock') errors in Firefox if we call this when focussed on the textarea\n                    return !scope.showHtml && command.toLowerCase() === $document[0].queryCommandValue('formatBlock').toLowerCase();\n                };\n                scope.queryCommandState = function(command){\n                    // $document[0].queryCommandValue('formatBlock') errors in Firefox if we call this when focussed on the textarea\n                    return (!scope.showHtml) ? $document[0].queryCommandState(command) : '';\n                };\n                scope.switchView = function(){\n                    scope.showHtml = !scope.showHtml;\n                    $animate.enabled(false, scope.displayElements.html);\n                    $animate.enabled(false, scope.displayElements.text);\n                    //Show the HTML view\n                    /* istanbul ignore next: ngModel exists check */\n/* THIS is not the correct thing to do, here....\n   The ngModel is correct, but it is not formatted as the user as done it...\n                    var _model;\n                    if (ngModel) {\n                        _model = ngModel.$viewValue;\n                    } else {\n                        _model = scope.html;\n                    }\n                    var _html = scope.displayElements.html[0].value;\n                    if (getDomFromHtml(_html).childElementCount !== getDomFromHtml(_model).childElementCount) {\n                        // the model and the html do not agree\n                        // they can get out of sync and when they do, we correct that here...\n                        scope.displayElements.html.val(_model);\n                    }\n*/\n                    if(scope.showHtml){\n                        //defer until the element is visible\n                        $timeout(function(){\n                            $animate.enabled(true, scope.displayElements.html);\n                            $animate.enabled(true, scope.displayElements.text);\n                            // [0] dereferences the DOM object from the angular.element\n                            return scope.displayElements.html[0].focus();\n                        }, 100);\n                    }else{\n                        //Show the WYSIWYG view\n                        //defer until the element is visible\n                        $timeout(function(){\n                            $animate.enabled(true, scope.displayElements.html);\n                            $animate.enabled(true, scope.displayElements.text);\n                            // [0] dereferences the DOM object from the angular.element\n                            return scope.displayElements.text[0].focus();\n                        }, 100);\n                    }\n                };\n\n                // changes to the model variable from outside the html/text inputs\n                // if no ngModel, then the only input is from inside text-angular\n                if(attrs.ngModel){\n                    var _firstRun = true;\n                    ngModel.$render = function(){\n                        if(_firstRun){\n                            // we need this firstRun to set the originalContents otherwise it gets overrided by the setting of ngModel to undefined from NaN\n                            _firstRun = false;\n                            // if view value is null or undefined initially and there was original content, set to the original content\n                            var _initialValue = scope.$parent.$eval(attrs.ngModel);\n                            if((_initialValue === undefined || _initialValue === null) && (_originalContents && _originalContents !== '')){\n                                // on passing through to taBind it will be sanitised\n                                ngModel.$setViewValue(_originalContents);\n                            }\n                        }\n                        scope.displayElements.forminput.val(ngModel.$viewValue);\n                        // if the editors aren't focused they need to be updated, otherwise they are doing the updating\n                        scope.html = ngModel.$viewValue || '';\n                    };\n                    // trigger the validation calls\n                    if(element.attr('required')) ngModel.$validators.required = function(modelValue, viewValue) {\n                        var value = modelValue || viewValue;\n                        return !(!value || value.trim() === '');\n                    };\n                }else{\n                    // if no ngModel then update from the contents of the origional html.\n                    scope.displayElements.forminput.val(_originalContents);\n                    scope.html = _originalContents;\n                }\n\n                // changes from taBind back up to here\n                scope.$watch('html', function(newValue, oldValue){\n                    if(newValue !== oldValue){\n                        if(attrs.ngModel && ngModel.$viewValue !== newValue) {\n                            ngModel.$setViewValue(newValue);\n                        }\n                        scope.displayElements.forminput.val(newValue);\n                    }\n                });\n\n                if(attrs.taTargetToolbars) {\n                    _editorFunctions = textAngularManager.registerEditor(scope._name, scope, attrs.taTargetToolbars.split(','));\n                }\n                else{\n                    var _toolbar = angular.element('<div text-angular-toolbar name=\"textAngularToolbar' + _serial + '\">');\n                    // passthrough init of toolbar options\n                    if(attrs.taToolbar)\t\t\t\t\t\t_toolbar.attr('ta-toolbar', attrs.taToolbar);\n                    if(attrs.taToolbarClass)\t\t\t\t_toolbar.attr('ta-toolbar-class', attrs.taToolbarClass);\n                    if(attrs.taToolbarGroupClass)\t\t\t_toolbar.attr('ta-toolbar-group-class', attrs.taToolbarGroupClass);\n                    if(attrs.taToolbarButtonClass)\t\t\t_toolbar.attr('ta-toolbar-button-class', attrs.taToolbarButtonClass);\n                    if(attrs.taToolbarActiveButtonClass)\t_toolbar.attr('ta-toolbar-active-button-class', attrs.taToolbarActiveButtonClass);\n                    if(attrs.taFocussedClass)\t\t\t\t_toolbar.attr('ta-focussed-class', attrs.taFocussedClass);\n\n                    element.prepend(_toolbar);\n                    $compile(_toolbar)(scope.$parent);\n                    _editorFunctions = textAngularManager.registerEditor(scope._name, scope, ['textAngularToolbar' + _serial]);\n                }\n\n                scope.$on('$destroy', function(){\n                    textAngularManager.unregisterEditor(scope._name);\n                    angular.element(window).off('blur');\n                    angular.element(window).off('resize', scope.handlePopoverEvents);\n                    angular.element(window).off('scroll', scope.handlePopoverEvents);\n                });\n\n                // catch element select event and pass to toolbar tools\n                scope.$on('ta-element-select', function(event, element){\n                    if(_editorFunctions.triggerElementSelect(event, element)){\n                        scope['reApplyOnSelectorHandlerstaTextElement' + _serial]();\n                    }\n                });\n\n/******************* no working fully\n                var distanceFromPoint = function (px, py, x, y) {\n                    return Math.sqrt((px-x)*(px-x)+(py-y)*(py-y));\n                };\n                // because each object is a rectangle and we have a single point,\n                // we need to give priority if the point is inside the rectangle\n                var getPositionDistance = function(el, x, y) {\n                    var range = document.createRange();\n                    range.selectNode(el);\n                    var rect = range.getBoundingClientRect();\n                    console.log(el, rect);\n                    range.detach();\n                    var bcr = rect;\n                    // top left\n                    var d1 = distanceFromPoint(bcr.left, bcr.top, x, y);\n                    // bottom left\n                    var d2 = distanceFromPoint(bcr.left, bcr.bottom, x, y);\n                    // top right\n                    var d3 = distanceFromPoint(bcr.right, bcr.top, x, y);\n                    // bottom right\n                    var d4 = distanceFromPoint(bcr.right, bcr.bottom, x, y);\n                    return Math.min(d1, d2, d3, d4);\n                };\n                var findClosest = function(el, minElement, maxDistance, x, y) {\n                    var _d=0;\n                    for (var i = 0; i < el.childNodes.length; i++) {\n                        var _n = el.childNodes[i];\n                        if (!_n.childNodes.length) {\n                            _d = getPositionDistance(_n, x, y);\n                            //console.log(_n, _n.childNodes, _d);\n                            if (_d < maxDistance) {\n                                maxDistance = _d;\n                                minElement = _n;\n                            }\n                        }\n                        var res = findClosest(_n, minElement, maxDistance, x, y);\n                        if (res.max < maxDistance) {\n                            maxDistance = res.max;\n                            minElement = res.min;\n                        }\n                    }\n                    return { max: maxDistance, min: minElement };\n                };\n                var getClosestElement = function (el, x, y) {\n                    return findClosest(el, null, 12341234124, x, y);\n                };\n****************/\n\n                scope.$on('ta-drop-event', function(event, element, dropEvent, dataTransfer){\n                    if(dataTransfer && dataTransfer.files && dataTransfer.files.length > 0){\n                        scope.displayElements.text[0].focus();\n                        // we must set the location of the drop!\n                        //console.log(dropEvent.clientX, dropEvent.clientY, dropEvent.target);\n                        taSelection.setSelectionToElementEnd(dropEvent.target);\n                        angular.forEach(dataTransfer.files, function(file){\n                            // taking advantage of boolean execution, if the fileDropHandler returns true, nothing else after it is executed\n                            // If it is false then execute the defaultFileDropHandler if the fileDropHandler is NOT the default one\n                            // Once one of these has been executed wrap the result as a promise, if undefined or variable update the taBind, else we should wait for the promise\n                            try{\n                                $q.when(scope.fileDropHandler(file, scope.wrapSelection) ||\n                                    (scope.fileDropHandler !== scope.defaultFileDropHandler &&\n                                    $q.when(scope.defaultFileDropHandler(file, scope.wrapSelection)))).then(function(){\n                                        scope['updateTaBindtaTextElement' + _serial]();\n                                    });\n                            }catch(error){\n                                $log.error(error);\n                            }\n                        });\n                        dropEvent.preventDefault();\n                        dropEvent.stopPropagation();\n                    /* istanbul ignore else, the updates if moved text */\n                    }else{\n                        $timeout(function(){\n                            scope['updateTaBindtaTextElement' + _serial]();\n                        }, 0);\n                    }\n                });\n\n                // the following is for applying the active states to the tools that support it\n                scope._bUpdateSelectedStyles = false;\n                /* istanbul ignore next: browser window/tab leave check */\n                angular.element(window).on('blur', function(){\n                    scope._bUpdateSelectedStyles = false;\n                    scope.focussed = false;\n                });\n                // loop through all the tools polling their activeState function if it exists\n                scope.updateSelectedStyles = function(){\n                    var _selection;\n                    /* istanbul ignore next: This check is to ensure multiple timeouts don't exist */\n                    if(_updateSelectedStylesTimeout) $timeout.cancel(_updateSelectedStylesTimeout);\n                    // test if the common element ISN'T the root ta-text node\n                    if((_selection = taSelection.getSelectionElement()) !== undefined && _selection.parentNode !== scope.displayElements.text[0]){\n                        _editorFunctions.updateSelectedStyles(angular.element(_selection));\n                    }else _editorFunctions.updateSelectedStyles();\n                    // used to update the active state when a key is held down, ie the left arrow\n                    /* istanbul ignore else: browser only check */\n                    if(scope._bUpdateSelectedStyles) _updateSelectedStylesTimeout = $timeout(scope.updateSelectedStyles, 200);\n                };\n                // start updating on keydown\n                _keydown = function(){\n                    /* istanbul ignore next: ie catch */\n                    if(!scope.focussed){\n                        scope._bUpdateSelectedStyles = false;\n                        return;\n                    }\n                    /* istanbul ignore else: don't run if already running */\n                    if(!scope._bUpdateSelectedStyles){\n                        scope._bUpdateSelectedStyles = true;\n                        scope.$apply(function(){\n                            scope.updateSelectedStyles();\n                        });\n                    }\n                };\n                scope.displayElements.html.on('keydown', _keydown);\n                scope.displayElements.text.on('keydown', _keydown);\n                // stop updating on key up and update the display/model\n                _keyup = function(){\n                    scope._bUpdateSelectedStyles = false;\n                };\n                scope.displayElements.html.on('keyup', _keyup);\n                scope.displayElements.text.on('keyup', _keyup);\n                // stop updating on key up and update the display/model\n                _keypress = function(event, eventData){\n                    // bug fix for Firefox.  If we are selecting a <a> already, any characters will\n                    // be added within the <a> which is bad!\n                    /* istanbul ignore next: don't see how to test this... */\n                    if (taSelection.getSelection) {\n                        var _selection = taSelection.getSelection();\n                        // in a weird case (can't reproduce) taSelection.getSelectionElement() can be undefined!!\n                        // this comes from range.commonAncestorContainer;\n                        // so I check for this here which fixes the error case\n                        if (taSelection.getSelectionElement() && taSelection.getSelectionElement().nodeName.toLowerCase() === 'a') {\n                            // check and see if we are at the edge of the <a>\n                            if (_selection.start.element.nodeType === 3 &&\n                                _selection.start.element.textContent.length === _selection.end.offset) {\n                                // we are at the end of the <a>!!!\n                                // so move the selection to after the <a>!!\n                                taSelection.setSelectionAfterElement(taSelection.getSelectionElement());\n                            }\n                            if (_selection.start.element.nodeType === 3 &&\n                                _selection.start.offset === 0) {\n                                // we are at the start of the <a>!!!\n                                // so move the selection before the <a>!!\n                                taSelection.setSelectionBeforeElement(taSelection.getSelectionElement());\n                            }\n                        }\n                    }\n                    /* istanbul ignore else: this is for catching the jqLite testing*/\n                    if(eventData) angular.extend(event, eventData);\n                    scope.$apply(function(){\n                        if(_editorFunctions.sendKeyCommand(event)){\n                            /* istanbul ignore else: don't run if already running */\n                            if(!scope._bUpdateSelectedStyles){\n                                scope.updateSelectedStyles();\n                            }\n                            event.preventDefault();\n                            return false;\n                        }\n                    });\n                };\n                scope.displayElements.html.on('keypress', _keypress);\n                scope.displayElements.text.on('keypress', _keypress);\n                // update the toolbar active states when we click somewhere in the text/html boxed\n                _mouseup = function(){\n                    // ensure only one execution of updateSelectedStyles()\n                    scope._bUpdateSelectedStyles = false;\n                    // for some reason, unless we do a $timeout here, after a _mouseup when the line is\n                    // highlighted, and instead use a scope.$apply(function(){ scope.updateSelectedStyles(); });\n                    // doesn't work properly, so we replaced this with:\n                    /* istanbul ignore next: not tested  */\n                    $timeout(function() { scope.updateSelectedStyles(); }, 0);\n                };\n                scope.displayElements.html.on('mouseup', _mouseup);\n                scope.displayElements.text.on('mouseup', _mouseup);\n            }\n        };\n    }\n]);\ntextAngular.service('textAngularManager', ['taToolExecuteAction', 'taTools', 'taRegisterTool', '$interval', '$rootScope', '$log',\n    function(taToolExecuteAction, taTools, taRegisterTool, $interval, $rootScope, $log){\n    // this service is used to manage all textAngular editors and toolbars.\n    // All publicly published functions that modify/need to access the toolbar or editor scopes should be in here\n    // these contain references to all the editors and toolbars that have been initialised in this app\n    var toolbars = {}, editors = {};\n    // we touch the time any change occurs through register of an editor or tool so that we\n    // in the future will fire and event to trigger an updateSelection\n    var timeRecentModification = 0;\n    var updateStyles = function(selectedElement){\n        angular.forEach(editors, function(editor) {\n            editor.editorFunctions.updateSelectedStyles(selectedElement);\n        });\n    };\n    var triggerInterval = 50;\n    var triggerIntervalTimer;\n    var setupTriggerUpdateStyles = function() {\n        timeRecentModification = Date.now();\n        /* istanbul ignore next: setup a one time updateStyles() */\n        triggerIntervalTimer = $interval(function() {\n            updateStyles();\n            triggerIntervalTimer = undefined;\n        }, triggerInterval, 1); // only trigger once\n    };\n    /* istanbul ignore next: make sure clean up on destroy */\n    $rootScope.$on('destroy', function() {\n        if (triggerIntervalTimer) {\n            $interval.cancel(triggerIntervalTimer);\n            triggerIntervalTimer = undefined;\n        }\n    });\n    var touchModification = function() {\n        if (Math.abs(Date.now() - timeRecentModification) > triggerInterval) {\n            // we have already triggered the updateStyles a long time back... so setup it again...\n            setupTriggerUpdateStyles();\n        }\n    };\n    // when we focus into a toolbar, we need to set the TOOLBAR's $parent to be the toolbars it's linked to.\n    // We also need to set the tools to be updated to be the toolbars...\n    return {\n        // register an editor and the toolbars that it is affected by\n        registerEditor: function(editorName, editorScope, targetToolbars){\n            // NOTE: name === editorScope._name\n            // targetToolbars is an [] of 'toolbar name's\n            // targetToolbars are optional, we don't require a toolbar to function\n            if(!editorName || editorName === '') throw('textAngular Error: An editor requires a name');\n            if(!editorScope) throw('textAngular Error: An editor requires a scope');\n            if(editors[editorName]) throw('textAngular Error: An Editor with name \"' + editorName + '\" already exists');\n            editors[editorName] = {\n                scope: editorScope,\n                toolbars: targetToolbars,\n                // toolbarScopes used by this editor\n                toolbarScopes: [],\n                _registerToolbarScope: function(toolbarScope){\n                    // add to the list late\n                    if(this.toolbars.indexOf(toolbarScope.name) >= 0) {\n                        // if this toolbarScope is being used by this editor we add it as one of the scopes\n                        this.toolbarScopes.push(toolbarScope);\n                    }\n                },\n                // this is a suite of functions the editor should use to update all it's linked toolbars\n                editorFunctions: {\n                    disable: function(){\n                        // disable all linked toolbars\n                        angular.forEach(editors[editorName].toolbarScopes, function(toolbarScope){\n                            toolbarScope.disabled = true;\n                        });\n                    },\n                    enable: function(){\n                        // enable all linked toolbars\n                        angular.forEach(editors[editorName].toolbarScopes, function(toolbarScope){\n                            toolbarScope.disabled = false;\n                        });\n                    },\n                    focus: function(){\n                        // this should be called when the editor is focussed\n                        angular.forEach(editors[editorName].toolbarScopes, function(toolbarScope){\n                            toolbarScope._parent = editorScope;\n                            toolbarScope.disabled = false;\n                            toolbarScope.focussed = true;\n                        });\n                        editorScope.focussed = true;\n                    },\n                    unfocus: function(){\n                        // this should be called when the editor becomes unfocussed\n                        angular.forEach(editors[editorName].toolbarScopes, function(toolbarScope){\n                            toolbarScope.disabled = true;\n                            toolbarScope.focussed = false;\n                        });\n                        editorScope.focussed = false;\n                    },\n                    updateSelectedStyles: function(selectedElement){\n                        // update the active state of all buttons on liked toolbars\n                        angular.forEach(editors[editorName].toolbarScopes, function(toolbarScope){\n                            angular.forEach(toolbarScope.tools, function(toolScope){\n                                if(toolScope.activeState){\n                                    toolbarScope._parent = editorScope;\n                                    // selectedElement may be undefined if nothing selected\n                                    toolScope.active = toolScope.activeState(selectedElement);\n                                }\n                            });\n                        });\n                    },\n                    sendKeyCommand: function(event){\n                        // we return true if we applied an action, false otherwise\n                        var result = false;\n                        if(event.ctrlKey || event.metaKey || event.specialKey) angular.forEach(taTools, function(tool, name){\n                            if(tool.commandKeyCode && (tool.commandKeyCode === event.which || tool.commandKeyCode === event.specialKey)){\n                                for(var _t = 0; _t < editors[editorName].toolbarScopes.length; _t++){\n                                    if(editors[editorName].toolbarScopes[_t].tools[name] !== undefined){\n                                        taToolExecuteAction.call(editors[editorName].toolbarScopes[_t].tools[name], editorScope);\n                                        result = true;\n                                        break;\n                                    }\n                                }\n                            }\n                        });\n                        return result;\n                    },\n                    triggerElementSelect: function(event, element){\n                        // search through the taTools to see if a match for the tag is made.\n                        // if there is, see if the tool is on a registered toolbar and not disabled.\n                        // NOTE: This can trigger on MULTIPLE tools simultaneously.\n                        var elementHasAttrs = function(_element, attrs){\n                            var result = true;\n                            for(var i = 0; i < attrs.length; i++) result = result && _element.attr(attrs[i]);\n                            return result;\n                        };\n                        var workerTools = [];\n                        var unfilteredTools = {};\n                        var result = false;\n                        element = angular.element(element);\n                        // get all valid tools by element name, keep track if one matches the\n                        var onlyWithAttrsFilter = false;\n                        angular.forEach(taTools, function(tool, name){\n                            if(\n                                tool.onElementSelect &&\n                                tool.onElementSelect.element &&\n                                tool.onElementSelect.element.toLowerCase() === element[0].tagName.toLowerCase() &&\n                                (!tool.onElementSelect.filter || tool.onElementSelect.filter(element))\n                            ){\n                                // this should only end up true if the element matches the only attributes\n                                onlyWithAttrsFilter = onlyWithAttrsFilter ||\n                                    (angular.isArray(tool.onElementSelect.onlyWithAttrs) && elementHasAttrs(element, tool.onElementSelect.onlyWithAttrs));\n                                if(!tool.onElementSelect.onlyWithAttrs || elementHasAttrs(element, tool.onElementSelect.onlyWithAttrs)) unfilteredTools[name] = tool;\n                            }\n                        });\n                        // if we matched attributes to filter on, then filter, else continue\n                        if(onlyWithAttrsFilter){\n                            angular.forEach(unfilteredTools, function(tool, name){\n                                if(tool.onElementSelect.onlyWithAttrs && elementHasAttrs(element, tool.onElementSelect.onlyWithAttrs)) workerTools.push({'name': name, 'tool': tool});\n                            });\n                            // sort most specific (most attrs to find) first\n                            workerTools.sort(function(a,b){\n                                return b.tool.onElementSelect.onlyWithAttrs.length - a.tool.onElementSelect.onlyWithAttrs.length;\n                            });\n                        }else{\n                            angular.forEach(unfilteredTools, function(tool, name){\n                                workerTools.push({'name': name, 'tool': tool});\n                            });\n                        }\n                        // Run the actions on the first visible filtered tool only\n                        if(workerTools.length > 0){\n                            for(var _i = 0; _i < workerTools.length; _i++){\n                                var tool = workerTools[_i].tool;\n                                var name = workerTools[_i].name;\n                                for(var _t = 0; _t < editors[editorName].toolbarScopes.length; _t++){\n                                    if(editors[editorName].toolbarScopes[_t].tools[name] !== undefined){\n                                        tool.onElementSelect.action.call(editors[editorName].toolbarScopes[_t].tools[name], event, element, editorScope);\n                                        result = true;\n                                        break;\n                                    }\n                                }\n                                if(result) break;\n                            }\n                        }\n                        return result;\n                    }\n                }\n            };\n            angular.forEach(targetToolbars, function(_name){\n                if(toolbars[_name]) {\n                    editors[editorName].toolbarScopes.push(toolbars[_name]);\n                }\n                // if it doesn't exist it may not have been compiled yet and it will be added later\n            });\n            touchModification();\n            return editors[editorName].editorFunctions;\n        },\n        // retrieve editor by name, largely used by testing suites only\n        retrieveEditor: function(name){\n            return editors[name];\n        },\n        unregisterEditor: function(name){\n            delete editors[name];\n            touchModification();\n        },\n        // registers a toolbar such that it can be linked to editors\n        registerToolbar: function(toolbarScope){\n            if(!toolbarScope) throw('textAngular Error: A toolbar requires a scope');\n            if(!toolbarScope.name || toolbarScope.name === '') throw('textAngular Error: A toolbar requires a name');\n            if(toolbars[toolbarScope.name]) throw('textAngular Error: A toolbar with name \"' + toolbarScope.name + '\" already exists');\n            toolbars[toolbarScope.name] = toolbarScope;\n            // walk all the editors and connect this toolbarScope to the editors.... if we need to.  This way, it does\n            // not matter if we register the editors after the toolbars or not\n            // Note the editor will ignore this toolbarScope if it is not connected to it...\n            angular.forEach(editors, function(_editor){\n                _editor._registerToolbarScope(toolbarScope);\n            });\n            touchModification();\n        },\n        // retrieve toolbar by name, largely used by testing suites only\n        retrieveToolbar: function(name){\n            return toolbars[name];\n        },\n        // retrieve toolbars by editor name, largely used by testing suites only\n        retrieveToolbarsViaEditor: function(name){\n            var result = [], _this = this;\n            angular.forEach(this.retrieveEditor(name).toolbars, function(name){\n                result.push(_this.retrieveToolbar(name));\n            });\n            return result;\n        },\n        unregisterToolbar: function(name){\n            delete toolbars[name];\n            touchModification();\n        },\n        // functions for updating the toolbar buttons display\n        updateToolsDisplay: function(newTaTools){\n            // pass a partial struct of the taTools, this allows us to update the tools on the fly, will not change the defaults.\n            var _this = this;\n            angular.forEach(newTaTools, function(_newTool, key){\n                _this.updateToolDisplay(key, _newTool);\n            });\n        },\n        // this function resets all toolbars to their default tool definitions\n        resetToolsDisplay: function(){\n            var _this = this;\n            angular.forEach(taTools, function(_newTool, key){\n                _this.resetToolDisplay(key);\n            });\n            touchModification();\n        },\n        // update a tool on all toolbars\n        updateToolDisplay: function(toolKey, _newTool){\n            var _this = this;\n            angular.forEach(toolbars, function(toolbarScope, toolbarKey){\n                _this.updateToolbarToolDisplay(toolbarKey, toolKey, _newTool);\n            });\n            touchModification();\n        },\n        // resets a tool to the default/starting state on all toolbars\n        resetToolDisplay: function(toolKey){\n            var _this = this;\n            angular.forEach(toolbars, function(toolbarScope, toolbarKey){\n                _this.resetToolbarToolDisplay(toolbarKey, toolKey);\n            });\n            touchModification();\n        },\n        // update a tool on a specific toolbar\n        updateToolbarToolDisplay: function(toolbarKey, toolKey, _newTool){\n            if(toolbars[toolbarKey]) toolbars[toolbarKey].updateToolDisplay(toolKey, _newTool);\n            else throw('textAngular Error: No Toolbar with name \"' + toolbarKey + '\" exists');\n        },\n        // reset a tool on a specific toolbar to it's default starting value\n        resetToolbarToolDisplay: function(toolbarKey, toolKey){\n            if(toolbars[toolbarKey]) toolbars[toolbarKey].updateToolDisplay(toolKey, taTools[toolKey], true);\n            else throw('textAngular Error: No Toolbar with name \"' + toolbarKey + '\" exists');\n        },\n        // removes a tool from all toolbars and it's definition\n        removeTool: function(toolKey){\n            delete taTools[toolKey];\n            angular.forEach(toolbars, function(toolbarScope){\n                delete toolbarScope.tools[toolKey];\n                for(var i = 0; i < toolbarScope.toolbar.length; i++){\n                    var toolbarIndex;\n                    for(var j = 0; j < toolbarScope.toolbar[i].length; j++){\n                        if(toolbarScope.toolbar[i][j] === toolKey){\n                            toolbarIndex = {\n                                group: i,\n                                index: j\n                            };\n                            break;\n                        }\n                        if(toolbarIndex !== undefined) break;\n                    }\n                    if(toolbarIndex !== undefined){\n                        toolbarScope.toolbar[toolbarIndex.group].slice(toolbarIndex.index, 1);\n                        toolbarScope._$element.children().eq(toolbarIndex.group).children().eq(toolbarIndex.index).remove();\n                    }\n                }\n            });\n            touchModification();\n        },\n        // toolkey, toolDefinition are required. If group is not specified will pick the last group, if index isnt defined will append to group\n        addTool: function(toolKey, toolDefinition, group, index){\n            taRegisterTool(toolKey, toolDefinition);\n            angular.forEach(toolbars, function(toolbarScope){\n                toolbarScope.addTool(toolKey, toolDefinition, group, index);\n            });\n            touchModification();\n        },\n        // adds a Tool but only to one toolbar not all\n        addToolToToolbar: function(toolKey, toolDefinition, toolbarKey, group, index){\n            taRegisterTool(toolKey, toolDefinition);\n            toolbars[toolbarKey].addTool(toolKey, toolDefinition, group, index);\n            touchModification();\n        },\n        // this is used when externally the html of an editor has been changed and textAngular needs to be notified to update the model.\n        // this will call a $digest if not already happening\n        refreshEditor: function(name){\n            if(editors[name]){\n                editors[name].scope.updateTaBindtaTextElement();\n                /* istanbul ignore else: phase catch */\n                if(!editors[name].scope.$$phase) editors[name].scope.$digest();\n            }else throw('textAngular Error: No Editor with name \"' + name + '\" exists');\n            touchModification();\n        },\n        // this is used by taBind to send a key command in response to a special key event\n        sendKeyCommand: function(scope, event){\n            var _editor = editors[scope._name];\n            /* istanbul ignore else: if nothing to do, do nothing */\n            if (_editor && _editor.editorFunctions.sendKeyCommand(event)) {\n                /* istanbul ignore else: don't run if already running */\n                if(!scope._bUpdateSelectedStyles){\n                    scope.updateSelectedStyles();\n                }\n                event.preventDefault();\n                return false;\n            }\n        },\n        //\n        // When a toolbar and tools are created, it isn't until there is a key event or mouse event\n        // that the updateSelectedStyles() is called behind the scenes.\n        // This function forces an update through the existing editors to help the application make sure\n        // the inital state is correct.\n        //\n        updateStyles: updateStyles,\n        // return the current version of textAngular in use to the user\n        getVersion: function () { return textAngularVersion; },\n        // for testing\n        getToolbarScopes: function () {\n            var tmp=[];\n            angular.forEach(editors, function (_editor) {\n                tmp = tmp.concat(_editor.toolbarScopes);\n            });\n            return tmp;\n        }\n/********************** not functional yet\n        // save the selection ('range') for the given editor\n        saveFocusSelection: function (name, range) {\n            editors[name].savedFocusRange = range;\n        },\n        // restore the saved selection from when the focus was lost\n        restoreFocusSelection: function(name, scope) {\n            // we only do this if NOT focussed and saved...\n            if (editors[name].savedFocusRange && !scope.focussed) {\n                try {\n                    var _r = rangy.restoreRange(editors[name].savedFocusRange);\n                    var _sel = rangy.getSelection();\n                    _sel.addRange(_r);\n                } catch(e) {}\n            }\n        }\n*************/\n    };\n}]);\ntextAngular.directive('textAngularToolbar', [\n    '$compile', 'textAngularManager', 'taOptions', 'taTools', 'taToolExecuteAction', '$window',\n    function($compile, textAngularManager, taOptions, taTools, taToolExecuteAction, $window){\n        return {\n            scope: {\n                name: '@' // a name IS required\n            },\n            restrict: \"EA\",\n            link: function(scope, element, attrs){\n                if(!scope.name || scope.name === '') throw('textAngular Error: A toolbar requires a name');\n                angular.extend(scope, angular.copy(taOptions));\n                if(attrs.taToolbar)\t\t\t\t\t\tscope.toolbar = scope.$parent.$eval(attrs.taToolbar);\n                if(attrs.taToolbarClass)\t\t\t\tscope.classes.toolbar = attrs.taToolbarClass;\n                if(attrs.taToolbarGroupClass)\t\t\tscope.classes.toolbarGroup = attrs.taToolbarGroupClass;\n                if(attrs.taToolbarButtonClass)\t\t\tscope.classes.toolbarButton = attrs.taToolbarButtonClass;\n                if(attrs.taToolbarActiveButtonClass)\tscope.classes.toolbarButtonActive = attrs.taToolbarActiveButtonClass;\n                if(attrs.taFocussedClass)\t\t\t\tscope.classes.focussed = attrs.taFocussedClass;\n\n                scope.disabled = true;\n                scope.focussed = false;\n                scope._$element = element;\n                element[0].innerHTML = '';\n                element.addClass(\"ta-toolbar \" + scope.classes.toolbar);\n\n                scope.$watch('focussed', function(){\n                    if(scope.focussed) element.addClass(scope.classes.focussed);\n                    else element.removeClass(scope.classes.focussed);\n                });\n\n                var setupToolElement = function(toolDefinition, toolScope){\n                    var toolElement;\n                    if(toolDefinition && toolDefinition.display){\n                        toolElement = angular.element(toolDefinition.display);\n                    }\n                    else toolElement = angular.element(\"<button type='button'>\");\n\n                    if(toolDefinition && toolDefinition[\"class\"]) toolElement.addClass(toolDefinition[\"class\"]);\n                    else toolElement.addClass(scope.classes.toolbarButton);\n\n                    toolElement.attr('name', toolScope.name);\n                    // important to not take focus from the main text/html entry\n                    toolElement.attr('ta-button', 'ta-button');\n                    toolElement.attr('ng-disabled', 'isDisabled()');\n                    toolElement.attr('tabindex', '-1');\n                    toolElement.attr('ng-click', 'executeAction()');\n                    toolElement.attr('ng-class', 'displayActiveToolClass(active)');\n\n                    if (toolDefinition && toolDefinition.tooltiptext) {\n                        toolElement.attr('title', toolDefinition.tooltiptext);\n                    }\n                    if(toolDefinition && !toolDefinition.display && !toolScope._display){\n                        // first clear out the current contents if any\n                        toolElement[0].innerHTML = '';\n                        // add the buttonText\n                        if(toolDefinition.buttontext) toolElement[0].innerHTML = toolDefinition.buttontext;\n                        // add the icon to the front of the button if there is content\n                        if(toolDefinition.iconclass){\n                            var icon = angular.element('<i>'), content = toolElement[0].innerHTML;\n                            icon.addClass(toolDefinition.iconclass);\n                            toolElement[0].innerHTML = '';\n                            toolElement.append(icon);\n                            if(content && content !== '') toolElement.append('&nbsp;' + content);\n                        }\n                    }\n\n                    toolScope._lastToolDefinition = angular.copy(toolDefinition);\n\n                    return $compile(toolElement)(toolScope);\n                };\n\n                // Keep a reference for updating the active states later\n                scope.tools = {};\n                // create the tools in the toolbar\n                // default functions and values to prevent errors in testing and on init\n                scope._parent = {\n                    disabled: true,\n                    showHtml: false,\n                    queryFormatBlockState: function(){ return false; },\n                    queryCommandState: function(){ return false; }\n                };\n                var defaultChildScope = {\n                    $window: $window,\n                    $editor: function(){\n                        // dynamically gets the editor as it is set\n                        return scope._parent;\n                    },\n                    isDisabled: function(){\n                        // view selection button is always enabled since it doesn not depend on a selction!\n                        if (this.name === 'html' && scope._parent.startAction) {\n                            return false;\n                        }\n                        // to set your own disabled logic set a function or boolean on the tool called 'disabled'\n                        return ( // this bracket is important as without it it just returns the first bracket and ignores the rest\n                            // when the button's disabled function/value evaluates to true\n                            (typeof this.$eval('disabled') !== 'function' && this.$eval('disabled')) || this.$eval('disabled()') ||\n                            // all buttons except the HTML Switch button should be disabled in the showHtml (RAW html) mode\n                            (this.name !== 'html' && this.$editor().showHtml) ||\n                            // if the toolbar is disabled\n                            this.$parent.disabled ||\n                            // if the current editor is disabled\n                            this.$editor().disabled\n                        );\n                    },\n                    displayActiveToolClass: function(active){\n                        return (active)? scope.classes.toolbarButtonActive : '';\n                    },\n                    executeAction: taToolExecuteAction\n                };\n\n                angular.forEach(scope.toolbar, function(group){\n                    // setup the toolbar group\n                    var groupElement = angular.element(\"<div>\");\n                    groupElement.addClass(scope.classes.toolbarGroup);\n                    angular.forEach(group, function(tool){\n                        // init and add the tools to the group\n                        // a tool name (key name from taTools struct)\n                        //creates a child scope of the main angularText scope and then extends the childScope with the functions of this particular tool\n                        // reference to the scope and element kept\n                        scope.tools[tool] = angular.extend(scope.$new(true), taTools[tool], defaultChildScope, {name: tool});\n                        scope.tools[tool].$element = setupToolElement(taTools[tool], scope.tools[tool]);\n                        // append the tool compiled with the childScope to the group element\n                        groupElement.append(scope.tools[tool].$element);\n                    });\n                    // append the group to the toolbar\n                    element.append(groupElement);\n                });\n\n                // update a tool\n                // if a value is set to null, remove from the display\n                // when forceNew is set to true it will ignore all previous settings, used to reset to taTools definition\n                // to reset to defaults pass in taTools[key] as _newTool and forceNew as true, ie `updateToolDisplay(key, taTools[key], true);`\n                scope.updateToolDisplay = function(key, _newTool, forceNew){\n                    var toolInstance = scope.tools[key];\n                    if(toolInstance){\n                        // get the last toolDefinition, then override with the new definition\n                        if(toolInstance._lastToolDefinition && !forceNew) _newTool = angular.extend({}, toolInstance._lastToolDefinition, _newTool);\n                        if(_newTool.buttontext === null && _newTool.iconclass === null && _newTool.display === null)\n                            throw('textAngular Error: Tool Definition for updating \"' + key + '\" does not have a valid display/iconclass/buttontext value');\n\n                        // if tool is defined on this toolbar, update/redo the tool\n                        if(_newTool.buttontext === null){\n                            delete _newTool.buttontext;\n                        }\n                        if(_newTool.iconclass === null){\n                            delete _newTool.iconclass;\n                        }\n                        if(_newTool.display === null){\n                            delete _newTool.display;\n                        }\n\n                        var toolElement = setupToolElement(_newTool, toolInstance);\n                        toolInstance.$element.replaceWith(toolElement);\n                        toolInstance.$element = toolElement;\n                    }\n                };\n\n                // we assume here that all values passed are valid and correct\n                scope.addTool = function(key, _newTool, groupIndex, index){\n                    scope.tools[key] = angular.extend(scope.$new(true), taTools[key], defaultChildScope, {name: key});\n                    scope.tools[key].$element = setupToolElement(taTools[key], scope.tools[key]);\n                    var group;\n                    if(groupIndex === undefined) groupIndex = scope.toolbar.length - 1;\n                    group = angular.element(element.children()[groupIndex]);\n\n                    if(index === undefined){\n                        group.append(scope.tools[key].$element);\n                        scope.toolbar[groupIndex][scope.toolbar[groupIndex].length - 1] = key;\n                    }else{\n                        group.children().eq(index).after(scope.tools[key].$element);\n                        scope.toolbar[groupIndex][index] = key;\n                    }\n                };\n\n                textAngularManager.registerToolbar(scope);\n\n                scope.$on('$destroy', function(){\n                    textAngularManager.unregisterToolbar(scope.name);\n                });\n            }\n        };\n    }\n]);\ntextAngular.directive('textAngularVersion', ['textAngularManager',\n    function(textAngularManager) {\n        var version = textAngularManager.getVersion();\n        return {\n            restrict: \"EA\",\n            link: function (scope, element, attrs) {\n                element.html(version);\n            }\n        };\n    }\n]);\n\n/**\n * @license AngularJS v1.3.10\n * (c) 2010-2014 Google, Inc. http://angularjs.org\n * License: MIT\n */\n(function(window, angular, undefined) {'use strict';\n\nvar $sanitizeMinErr = angular.$$minErr('$sanitize');\n\n/**\n * @ngdoc module\n * @name ngSanitize\n * @description\n *\n * # ngSanitize\n *\n * The `ngSanitize` module provides functionality to sanitize HTML.\n *\n *\n * <div doc-module-components=\"ngSanitize\"></div>\n *\n * See {@link ngSanitize.$sanitize `$sanitize`} for usage.\n */\n\n/*\n * HTML Parser By Misko Hevery (misko@hevery.com)\n * based on:  HTML Parser By John Resig (ejohn.org)\n * Original code by Erik Arvidsson, Mozilla Public License\n * http://erik.eae.net/simplehtmlparser/simplehtmlparser.js\n *\n * // Use like so:\n * htmlParser(htmlString, {\n *     start: function(tag, attrs, unary) {},\n *     end: function(tag) {},\n *     chars: function(text) {},\n *     comment: function(text) {}\n * });\n *\n */\n\n\n/**\n * @ngdoc service\n * @name $sanitize\n * @kind function\n *\n * @description\n *   The input is sanitized by parsing the HTML into tokens. All safe tokens (from a whitelist) are\n *   then serialized back to properly escaped html string. This means that no unsafe input can make\n *   it into the returned string, however, since our parser is more strict than a typical browser\n *   parser, it's possible that some obscure input, which would be recognized as valid HTML by a\n *   browser, won't make it through the sanitizer. The input may also contain SVG markup.\n *   The whitelist is configured using the functions `aHrefSanitizationWhitelist` and\n *   `imgSrcSanitizationWhitelist` of {@link ng.$compileProvider `$compileProvider`}.\n *\n * @param {string} html HTML input.\n * @returns {string} Sanitized HTML.\n *\n * @example\n   <example module=\"sanitizeExample\" deps=\"angular-sanitize.js\">\n   <file name=\"index.ced81ed4.html\">\n     <script>\n         angular.module('sanitizeExample', ['ngSanitize'])\n           .controller('ExampleController', ['$scope', '$sce', function($scope, $sce) {\n             $scope.snippet =\n               '<p style=\"color:blue\">an html\\n' +\n               '<em onmouseover=\"this.textContent=\\'PWN3D!\\'\">click here</em>\\n' +\n               'snippet</p>';\n             $scope.deliberatelyTrustDangerousSnippet = function() {\n               return $sce.trustAsHtml($scope.snippet);\n             };\n           }]);\n     </script>\n     <div ng-controller=\"ExampleController\">\n        Snippet: <textarea ng-model=\"snippet\" cols=\"60\" rows=\"3\"></textarea>\n       <table>\n         <tr>\n           <td>Directive</td>\n           <td>How</td>\n           <td>Source</td>\n           <td>Rendered</td>\n         </tr>\n         <tr id=\"bind-html-with-sanitize\">\n           <td>ng-bind-html</td>\n           <td>Automatically uses $sanitize</td>\n           <td><pre>&lt;div ng-bind-html=\"snippet\"&gt;<br/>&lt;/div&gt;</pre></td>\n           <td><div ng-bind-html=\"snippet\"></div></td>\n         </tr>\n         <tr id=\"bind-html-with-trust\">\n           <td>ng-bind-html</td>\n           <td>Bypass $sanitize by explicitly trusting the dangerous value</td>\n           <td>\n           <pre>&lt;div ng-bind-html=\"deliberatelyTrustDangerousSnippet()\"&gt;\n&lt;/div&gt;</pre>\n           </td>\n           <td><div ng-bind-html=\"deliberatelyTrustDangerousSnippet()\"></div></td>\n         </tr>\n         <tr id=\"bind-default\">\n           <td>ng-bind</td>\n           <td>Automatically escapes</td>\n           <td><pre>&lt;div ng-bind=\"snippet\"&gt;<br/>&lt;/div&gt;</pre></td>\n           <td><div ng-bind=\"snippet\"></div></td>\n         </tr>\n       </table>\n       </div>\n   </file>\n   <file name=\"protractor.js\" type=\"protractor\">\n     it('should sanitize the html snippet by default', function() {\n       expect(element(by.css('#bind-html-with-sanitize div')).getInnerHtml()).\n         toBe('<p>an html\\n<em>click here</em>\\nsnippet</p>');\n     });\n\n     it('should inline raw snippet if bound to a trusted value', function() {\n       expect(element(by.css('#bind-html-with-trust div')).getInnerHtml()).\n         toBe(\"<p style=\\\"color:blue\\\">an html\\n\" +\n              \"<em onmouseover=\\\"this.textContent='PWN3D!'\\\">click here</em>\\n\" +\n              \"snippet</p>\");\n     });\n\n     it('should escape snippet without any filter', function() {\n       expect(element(by.css('#bind-default div')).getInnerHtml()).\n         toBe(\"&lt;p style=\\\"color:blue\\\"&gt;an html\\n\" +\n              \"&lt;em onmouseover=\\\"this.textContent='PWN3D!'\\\"&gt;click here&lt;/em&gt;\\n\" +\n              \"snippet&lt;/p&gt;\");\n     });\n\n     it('should update', function() {\n       element(by.model('snippet')).clear();\n       element(by.model('snippet')).sendKeys('new <b onclick=\"alert(1)\">text</b>');\n       expect(element(by.css('#bind-html-with-sanitize div')).getInnerHtml()).\n         toBe('new <b>text</b>');\n       expect(element(by.css('#bind-html-with-trust div')).getInnerHtml()).toBe(\n         'new <b onclick=\"alert(1)\">text</b>');\n       expect(element(by.css('#bind-default div')).getInnerHtml()).toBe(\n         \"new &lt;b onclick=\\\"alert(1)\\\"&gt;text&lt;/b&gt;\");\n     });\n   </file>\n   </example>\n */\nfunction $SanitizeProvider() {\n  this.$get = ['$$sanitizeUri', function($$sanitizeUri) {\n    return function(html) {\n      if (typeof arguments[1] != 'undefined') {\n        arguments[1].version = 'taSanitize';\n      }\n      var buf = [];\n      htmlParser(html, htmlSanitizeWriter(buf, function(uri, isImage) {\n        return !/^unsafe/.test($$sanitizeUri(uri, isImage));\n      }));\n      return buf.join('');\n    };\n  }];\n}\n\nfunction sanitizeText(chars) {\n  var buf = [];\n  var writer = htmlSanitizeWriter(buf, angular.noop);\n  writer.chars(chars);\n  return buf.join('');\n}\n\n\n// Regular Expressions for parsing tags and attributes\nvar START_TAG_REGEXP =\n       /^<((?:[a-zA-Z])[\\w:-]*)((?:\\s+[\\w:-]+(?:\\s*=\\s*(?:(?:\"[^\"]*\")|(?:'[^']*')|[^>\\s]+))?)*)\\s*(\\/?)\\s*(>?)/,\n  END_TAG_REGEXP = /^<\\/\\s*([\\w:-]+)[^>]*>/,\n  ATTR_REGEXP = /([\\w:-]+)(?:\\s*=\\s*(?:(?:\"((?:[^\"])*)\")|(?:'((?:[^'])*)')|([^>\\s]+)))?/g,\n  BEGIN_TAG_REGEXP = /^</,\n  BEGING_END_TAGE_REGEXP = /^<\\//,\n  COMMENT_REGEXP = /<!--(.*?)-->/g,\n  SINGLE_COMMENT_REGEXP = /(^<!--.*?-->)/,\n  DOCTYPE_REGEXP = /<!DOCTYPE([^>]*?)>/i,\n  CDATA_REGEXP = /<!\\[CDATA\\[(.*?)]]>/g,\n  SURROGATE_PAIR_REGEXP = /[\\uD800-\\uDBFF][\\uDC00-\\uDFFF]/g,\n  // Match everything outside of normal chars and \" (quote character)\n  NON_ALPHANUMERIC_REGEXP = /([^\\#-~| |!])/g,\n  WHITE_SPACE_REGEXP = /^(\\s+)/;\n\n\n// Good source of info about elements and attributes\n// http://dev.w3.org/html5/spec/Overview.html#semantics\n// http://simon.html5.org/html-elements\n\n// Safe Void Elements - HTML5\n// http://dev.w3.org/html5/spec/Overview.html#void-elements\nvar voidElements = makeMap(\"area,br,col,hr,img,wbr,input\");\n\n// Elements that you can, intentionally, leave open (and which close themselves)\n// http://dev.w3.org/html5/spec/Overview.html#optional-tags\nvar optionalEndTagBlockElements = makeMap(\"colgroup,dd,dt,li,p,tbody,td,tfoot,th,thead,tr\"),\n    optionalEndTagInlineElements = makeMap(\"rp,rt\"),\n    optionalEndTagElements = angular.extend({},\n                                            optionalEndTagInlineElements,\n                                            optionalEndTagBlockElements);\n\n// Safe Block Elements - HTML5\nvar blockElements = angular.extend({}, optionalEndTagBlockElements, makeMap(\"address,article,\" +\n        \"aside,blockquote,caption,center,del,dir,div,dl,figure,figcaption,footer,h1,h2,h3,h4,h5,\" +\n        \"h6,header,hgroup,hr,ins,map,menu,nav,ol,pre,script,section,table,ul\"));\n\n// Inline Elements - HTML5\nvar inlineElements = angular.extend({}, optionalEndTagInlineElements, makeMap(\"a,abbr,acronym,b,\" +\n        \"bdi,bdo,big,br,cite,code,del,dfn,em,font,i,img,ins,kbd,label,map,mark,q,ruby,rp,rt,s,\" +\n        \"samp,small,span,strike,strong,sub,sup,time,tt,u,var\"));\n\n// SVG Elements\n// https://wiki.whatwg.org/wiki/Sanitization_rules#svg_Elements\nvar svgElements = makeMap(\"animate,animateColor,animateMotion,animateTransform,circle,defs,\" +\n        \"desc,ellipse,font-face,font-face-name,font-face-src,g,glyph,hkern,image,linearGradient,\" +\n        \"line,marker,metadata,missing-glyph,mpath,path,polygon,polyline,radialGradient,rect,set,\" +\n        \"stop,svg,switch,text,title,tspan,use\");\n\n// Special Elements (can contain anything)\nvar specialElements = makeMap(\"script,style\");\n\nvar validElements = angular.extend({},\n                                   voidElements,\n                                   blockElements,\n                                   inlineElements,\n                                   optionalEndTagElements,\n                                   svgElements);\n\n//Attributes that have href and hence need to be sanitized\nvar uriAttrs = makeMap(\"background,cite,href,longdesc,src,usemap,xlink:href\");\n\nvar htmlAttrs = makeMap('abbr,align,alt,axis,bgcolor,border,cellpadding,cellspacing,class,clear,'+\n    'color,cols,colspan,compact,coords,dir,face,headers,height,hreflang,hspace,'+\n    'id,ismap,lang,language,nohref,nowrap,rel,rev,rows,rowspan,rules,'+\n    'scope,scrolling,shape,size,span,start,summary,target,title,type,'+\n    'valign,value,vspace,width');\n\n// SVG attributes (without \"id\" and \"name\" attributes)\n// https://wiki.whatwg.org/wiki/Sanitization_rules#svg_Attributes\nvar svgAttrs = makeMap('accent-height,accumulate,additive,alphabetic,arabic-form,ascent,' +\n    'attributeName,attributeType,baseProfile,bbox,begin,by,calcMode,cap-height,class,color,' +\n    'color-rendering,content,cx,cy,d,dx,dy,descent,display,dur,end,fill,fill-rule,font-family,' +\n    'font-size,font-stretch,font-style,font-variant,font-weight,from,fx,fy,g1,g2,glyph-name,' +\n    'gradientUnits,hanging,height,horiz-adv-x,horiz-origin-x,ideographic,k,keyPoints,' +\n    'keySplines,keyTimes,lang,marker-end,marker-mid,marker-start,markerHeight,markerUnits,' +\n    'markerWidth,mathematical,max,min,offset,opacity,orient,origin,overline-position,' +\n    'overline-thickness,panose-1,path,pathLength,points,preserveAspectRatio,r,refX,refY,' +\n    'repeatCount,repeatDur,requiredExtensions,requiredFeatures,restart,rotate,rx,ry,slope,stemh,' +\n    'stemv,stop-color,stop-opacity,strikethrough-position,strikethrough-thickness,stroke,' +\n    'stroke-dasharray,stroke-dashoffset,stroke-linecap,stroke-linejoin,stroke-miterlimit,' +\n    'stroke-opacity,stroke-width,systemLanguage,target,text-anchor,to,transform,type,u1,u2,' +\n    'underline-position,underline-thickness,unicode,unicode-range,units-per-em,values,version,' +\n    'viewBox,visibility,width,widths,x,x-height,x1,x2,xlink:actuate,xlink:arcrole,xlink:role,' +\n    'xlink:show,xlink:title,xlink:type,xml:base,xml:lang,xml:space,xmlns,xmlns:xlink,y,y1,y2,' +\n    'zoomAndPan');\n\nvar validAttrs = angular.extend({},\n                                uriAttrs,\n                                svgAttrs,\n                                htmlAttrs);\n\nfunction makeMap(str) {\n  var obj = {}, items = str.split(','), i;\n  for (i = 0; i < items.length; i++) obj[items[i]] = true;\n  return obj;\n}\n\n\n/**\n * @example\n * htmlParser(htmlString, {\n *     start: function(tag, attrs, unary) {},\n *     end: function(tag) {},\n *     chars: function(text) {},\n *     comment: function(text) {}\n * });\n *\n * @param {string} html string\n * @param {object} handler\n */\nfunction htmlParser(html, handler) {\n  if (typeof html !== 'string') {\n    if (html === null || typeof html === 'undefined') {\n      html = '';\n    } else {\n      html = '' + html;\n    }\n  }\n  var index, chars, match, stack = [], last = html, text;\n  stack.last = function() { return stack[ stack.length - 1 ]; };\n\n  while (html) {\n    text = '';\n    chars = true;\n\n    // Make sure we're not in a script or style element\n    if (!stack.last() || !specialElements[ stack.last() ]) {\n\n      // White space\n      if (WHITE_SPACE_REGEXP.test(html)) {\n        match = html.match(WHITE_SPACE_REGEXP);\n\n        if (match) {\n          var mat = match[0];\n          if (handler.whitespace) handler.whitespace(match[0]);\n          html = html.replace(match[0], '');\n          chars = false;\n        }\n      //Comment\n      } else if (SINGLE_COMMENT_REGEXP.test(html)) {\n        match = html.match(SINGLE_COMMENT_REGEXP);\n\n        if (match) {\n          if (handler.comment) handler.comment(match[1]);\n          html = html.replace(match[0], '');\n          chars = false;\n        }\n      // DOCTYPE\n      } else if (DOCTYPE_REGEXP.test(html)) {\n        match = html.match(DOCTYPE_REGEXP);\n\n        if (match) {\n          html = html.replace(match[0], '');\n          chars = false;\n        }\n      // end tag\n      } else if (BEGING_END_TAGE_REGEXP.test(html)) {\n        match = html.match(END_TAG_REGEXP);\n\n        if (match) {\n          html = html.substring(match[0].length);\n          match[0].replace(END_TAG_REGEXP, parseEndTag);\n          chars = false;\n        }\n\n      // start tag\n      } else if (BEGIN_TAG_REGEXP.test(html)) {\n        match = html.match(START_TAG_REGEXP);\n\n        if (match) {\n          // We only have a valid start-tag if there is a '>'.\n          if (match[4]) {\n            html = html.substring(match[0].length);\n            match[0].replace(START_TAG_REGEXP, parseStartTag);\n          }\n          chars = false;\n        } else {\n          // no ending tag found --- this piece should be encoded as an entity.\n          text += '<';\n          html = html.substring(1);\n        }\n      }\n\n      if (chars) {\n        index = html.indexOf(\"<\");\n\n        text += index < 0 ? html : html.substring(0, index);\n        html = index < 0 ? \"\" : html.substring(index);\n\n        if (handler.chars) handler.chars(decodeEntities(text));\n      }\n\n    } else {\n      html = html.replace(new RegExp(\"([^]*)<\\\\s*\\\\/\\\\s*\" + stack.last() + \"[^>]*>\", 'i'),\n        function(all, text) {\n          text = text.replace(COMMENT_REGEXP, \"$1\").replace(CDATA_REGEXP, \"$1\");\n\n          if (handler.chars) handler.chars(decodeEntities(text));\n\n          return \"\";\n      });\n\n      parseEndTag(\"\", stack.last());\n    }\n\n    if (html == last) {\n      throw $sanitizeMinErr('badparse', \"The sanitizer was unable to parse the following block \" +\n                                        \"of html: {0}\", html);\n    }\n    last = html;\n  }\n\n  // Clean up any remaining tags\n  parseEndTag();\n\n  function parseStartTag(tag, tagName, rest, unary) {\n    tagName = angular.lowercase(tagName);\n    if (blockElements[ tagName ]) {\n      while (stack.last() && inlineElements[ stack.last() ]) {\n        parseEndTag(\"\", stack.last());\n      }\n    }\n\n    if (optionalEndTagElements[ tagName ] && stack.last() == tagName) {\n      parseEndTag(\"\", tagName);\n    }\n\n    unary = voidElements[ tagName ] || !!unary;\n\n    if (!unary)\n      stack.push(tagName);\n\n    var attrs = {};\n\n    rest.replace(ATTR_REGEXP,\n      function(match, name, doubleQuotedValue, singleQuotedValue, unquotedValue) {\n        var value = doubleQuotedValue\n          || singleQuotedValue\n          || unquotedValue\n          || '';\n\n        attrs[name] = decodeEntities(value);\n    });\n    if (handler.start) handler.start(tagName, attrs, unary);\n  }\n\n  function parseEndTag(tag, tagName) {\n    var pos = 0, i;\n    tagName = angular.lowercase(tagName);\n    if (tagName)\n      // Find the closest opened tag of the same type\n      for (pos = stack.length - 1; pos >= 0; pos--)\n        if (stack[ pos ] == tagName)\n          break;\n\n    if (pos >= 0) {\n      // Close all the open elements, up the stack\n      for (i = stack.length - 1; i >= pos; i--)\n        if (handler.end) handler.end(stack[ i ]);\n\n      // Remove the open elements from the stack\n      stack.length = pos;\n    }\n  }\n}\n\nvar hiddenPre=document.createElement(\"pre\");\nvar spaceRe = /^(\\s*)([\\s\\S]*?)(\\s*)$/;\n/**\n * decodes all entities into regular string\n * @param value\n * @returns {string} A string with decoded entities.\n */\nfunction decodeEntities(value) {\n  if (!value) { return ''; }\n\n  // Note: IE8 does not preserve spaces at the start/end of innerHTML\n  // so we must capture them and reattach them afterward\n  var parts = spaceRe.exec(value);\n  var spaceBefore = parts[1];\n  var spaceAfter = parts[3];\n  var content = parts[2];\n  if (content) {\n    hiddenPre.innerHTML=content.replace(/</g,\"&lt;\");\n    // innerText depends on styling as it doesn't display hidden elements.\n    // Therefore, it's better to use textContent not to cause unnecessary\n    // reflows. However, IE<9 don't support textContent so the innerText\n    // fallback is necessary.\n    content = 'textContent' in hiddenPre ?\n      hiddenPre.textContent : hiddenPre.innerText;\n  }\n  return spaceBefore + content + spaceAfter;\n}\n\n/**\n * Escapes all potentially dangerous characters, so that the\n * resulting string can be safely inserted into attribute or\n * element text.\n * @param value\n * @returns {string} escaped text\n */\nfunction encodeEntities(value) {\n  return value.\n    replace(/&/g, '&amp;').\n    replace(SURROGATE_PAIR_REGEXP, function(value) {\n      var hi = value.charCodeAt(0);\n      var low = value.charCodeAt(1);\n      return '&#' + (((hi - 0xD800) * 0x400) + (low - 0xDC00) + 0x10000) + ';';\n    }).\n    replace(NON_ALPHANUMERIC_REGEXP, function(value) {\n      // unsafe chars are: \\u0000-\\u001f \\u007f-\\u009f \\u00ad \\u0600-\\u0604 \\u070f \\u17b4 \\u17b5 \\u200c-\\u200f \\u2028-\\u202f \\u2060-\\u206f \\ufeff \\ufff0-\\uffff from jslint.com/lint.html\n      // decimal values are: 0-31, 127-159, 173, 1536-1540, 1807, 6068, 6069, 8204-8207, 8232-8239, 8288-8303, 65279, 65520-65535\n      var c = value.charCodeAt(0);\n      // if unsafe character encode\n      if(c <= 159 ||\n        c == 173 ||\n        (c >= 1536 && c <= 1540) ||\n        c == 1807 ||\n        c == 6068 ||\n        c == 6069 ||\n        (c >= 8204 && c <= 8207) ||\n        (c >= 8232 && c <= 8239) ||\n        (c >= 8288 && c <= 8303) ||\n        c == 65279 ||\n        (c >= 65520 && c <= 65535)) return '&#' + c + ';';\n      return value; // avoids multilingual issues\n    }).\n    replace(/</g, '&lt;').\n    replace(/>/g, '&gt;');\n}\n\nvar trim = (function() {\n  // native trim is way faster: http://jsperf.com/angular-trim-test\n  // but IE doesn't have it... :-(\n  // TODO: we should move this into IE/ES5 polyfill\n  if (!String.prototype.trim) {\n    return function(value) {\n      return angular.isString(value) ? value.replace(/^\\s\\s*/, '').replace(/\\s\\s*$/, '') : value;\n    };\n  }\n  return function(value) {\n    return angular.isString(value) ? value.trim() : value;\n  };\n})();\n\n// Custom logic for accepting certain style options only - textAngular\n// Currently allows only the color, background-color, text-align, float, width and height attributes\n// all other attributes should be easily done through classes.\nfunction validStyles(styleAttr){\n\tvar result = '';\n\tvar styleArray = styleAttr.split(';');\n\tangular.forEach(styleArray, function(value){\n\t\tvar v = value.split(':');\n\t\tif(v.length == 2){\n\t\t\tvar key = trim(angular.lowercase(v[0]));\n\t\t\tvar value = trim(angular.lowercase(v[1]));\n\t\t\tif(\n\t\t\t\t(key === 'color' || key === 'background-color') && (\n\t\t\t\t\tvalue.match(/^rgb\\([0-9%,\\. ]*\\)$/i)\n\t\t\t\t\t|| value.match(/^rgba\\([0-9%,\\. ]*\\)$/i)\n\t\t\t\t\t|| value.match(/^hsl\\([0-9%,\\. ]*\\)$/i)\n\t\t\t\t\t|| value.match(/^hsla\\([0-9%,\\. ]*\\)$/i)\n\t\t\t\t\t|| value.match(/^#[0-9a-f]{3,6}$/i)\n\t\t\t\t\t|| value.match(/^[a-z]*$/i)\n\t\t\t\t)\n\t\t\t||\n\t\t\t\tkey === 'text-align' && (\n\t\t\t\t\tvalue === 'left'\n\t\t\t\t\t|| value === 'right'\n\t\t\t\t\t|| value === 'center'\n\t\t\t\t\t|| value === 'justify'\n\t\t\t\t)\n\t\t\t||\n        key === 'text-decoration' && (\n            value === 'underline'\n            || value === 'line-through'\n        )\n      || \n        key === 'font-weight' && (\n            value === 'bold'\n        )\n      ||\n        key === 'font-style' && (\n          value === 'italic'\n        )\n      ||\n        key === 'float' && (\n            value === 'left'\n            || value === 'right'\n            || value === 'none'\n        )\n      ||\n        key === 'vertical-align' && (\n            value === 'baseline'\n            || value === 'sub'\n            || value === 'super'\n            || value === 'test-top'\n            || value === 'text-bottom'\n            || value === 'middle'\n            || value === 'top'\n            || value === 'bottom'\n            || value.match(/[0-9]*(px|em)/)\n            || value.match(/[0-9]+?%/)\n        )\n      ||\n        key === 'font-size' && (\n            value === 'xx-small'\n            || value === 'x-small'\n            || value === 'small'\n            || value === 'medium'\n            || value === 'large'\n            || value === 'x-large'\n            || value === 'xx-large'\n            || value === 'larger'\n            || value === 'smaller'\n            || value.match(/[0-9]*\\.?[0-9]*(px|em|rem|mm|q|cm|in|pt|pc|%)/)\n                               )\n\t\t\t||\n\t\t\t\t(key === 'width' || key === 'height') && (\n\t\t\t\t\tvalue.match(/[0-9\\.]*(px|em|rem|%)/)\n\t\t\t\t)\n\t\t\t|| // Reference #520\n\t\t\t\t(key === 'direction' && value.match(/^ltr|rtl|initial|inherit$/))\n\t\t\t) result += key + ': ' + value + ';';\n\t\t}\n\t});\n\treturn result;\n}\n\n// this function is used to manually allow specific attributes on specific tags with certain prerequisites\nfunction validCustomTag(tag, attrs, lkey, value){\n\t// catch the div placeholder for the iframe replacement\n    if (tag === 'img' && attrs['ta-insert-video']){\n        if(lkey === 'ta-insert-video' || lkey === 'allowfullscreen' || lkey === 'frameborder' || (lkey === 'contenteditable' && value === 'false')) return true;\n    }\n    return false;\n}\n\n/**\n * create an HTML/XML writer which writes to buffer\n * @param {Array} buf use buf.jain('') to get out sanitized html string\n * @returns {object} in the form of {\n *     start: function(tag, attrs, unary) {},\n *     end: function(tag) {},\n *     chars: function(text) {},\n *     comment: function(text) {}\n * }\n */\nfunction htmlSanitizeWriter(buf, uriValidator) {\n  var ignore = false;\n  var out = angular.bind(buf, buf.push);\n  return {\n    start: function(tag, attrs, unary) {\n      tag = angular.lowercase(tag);\n      if (!ignore && specialElements[tag]) {\n        ignore = tag;\n      }\n      if (!ignore && validElements[tag] === true) {\n        out('<');\n        out(tag);\n        angular.forEach(attrs, function(value, key) {\n          var lkey=angular.lowercase(key);\n          var isImage=(tag === 'img' && lkey === 'src') || (lkey === 'background');\n          if ((lkey === 'style' && (value = validStyles(value)) !== '') || validCustomTag(tag, attrs, lkey, value) || validAttrs[lkey] === true &&\n            (uriAttrs[lkey] !== true || uriValidator(value, isImage))) {\n            out(' ');\n            out(key);\n            out('=\"');\n            out(encodeEntities(value));\n            out('\"');\n          }\n        });\n        out(unary ? '/>' : '>');\n      }\n    },\n    comment: function (com) {\n      out(com);\n    },\n    whitespace: function (ws) {\n      out(encodeEntities(ws));\n    },\n    end: function(tag) {\n        tag = angular.lowercase(tag);\n        if (!ignore && validElements[tag] === true) {\n          out('</');\n          out(tag);\n          out('>');\n        }\n        if (tag == ignore) {\n          ignore = false;\n        }\n      },\n    chars: function(chars) {\n        if (!ignore) {\n          out(encodeEntities(chars));\n        }\n      }\n  };\n}\n\n\n// define ngSanitize module and register $sanitize service\nangular.module('ngSanitize', []).provider('$sanitize', $SanitizeProvider);\n\n/* global sanitizeText: false */\n\n/**\n * @ngdoc filter\n * @name linky\n * @kind function\n *\n * @description\n * Finds links in text input and turns them into html links. Supports http/https/ftp/mailto and\n * plain email address links.\n *\n * Requires the {@link ngSanitize `ngSanitize`} module to be installed.\n *\n * @param {string} text Input text.\n * @param {string} target Window (_blank|_self|_parent|_top) or named frame to open links in.\n * @returns {string} Html-linkified text.\n *\n * @usage\n   <span ng-bind-html=\"linky_expression | linky\"></span>\n *\n * @example\n   <example module=\"linkyExample\" deps=\"angular-sanitize.js\">\n     <file name=\"index.ced81ed4.html\">\n       <script>\n         angular.module('linkyExample', ['ngSanitize'])\n           .controller('ExampleController', ['$scope', function($scope) {\n             $scope.snippet =\n               'Pretty text with some links:\\n'+\n               'http://angularjs.org/,\\n'+\n               'mailto:us@somewhere.org,\\n'+\n               'another@somewhere.org,\\n'+\n               'and one more: ftp://127.0.0.1/.';\n             $scope.snippetWithTarget = 'http://angularjs.org/';\n           }]);\n       </script>\n       <div ng-controller=\"ExampleController\">\n       Snippet: <textarea ng-model=\"snippet\" cols=\"60\" rows=\"3\"></textarea>\n       <table>\n         <tr>\n           <td>Filter</td>\n           <td>Source</td>\n           <td>Rendered</td>\n         </tr>\n         <tr id=\"linky-filter\">\n           <td>linky filter</td>\n           <td>\n             <pre>&lt;div ng-bind-html=\"snippet | linky\"&gt;<br>&lt;/div&gt;</pre>\n           </td>\n           <td>\n             <div ng-bind-html=\"snippet | linky\"></div>\n           </td>\n         </tr>\n         <tr id=\"linky-target\">\n          <td>linky target</td>\n          <td>\n            <pre>&lt;div ng-bind-html=\"snippetWithTarget | linky:'_blank'\"&gt;<br>&lt;/div&gt;</pre>\n          </td>\n          <td>\n            <div ng-bind-html=\"snippetWithTarget | linky:'_blank'\"></div>\n          </td>\n         </tr>\n         <tr id=\"escaped-html\">\n           <td>no filter</td>\n           <td><pre>&lt;div ng-bind=\"snippet\"&gt;<br>&lt;/div&gt;</pre></td>\n           <td><div ng-bind=\"snippet\"></div></td>\n         </tr>\n       </table>\n     </file>\n     <file name=\"protractor.js\" type=\"protractor\">\n       it('should linkify the snippet with urls', function() {\n         expect(element(by.id('linky-filter')).element(by.binding('snippet | linky')).getText()).\n             toBe('Pretty text with some links: http://angularjs.org/, us@somewhere.org, ' +\n                  'another@somewhere.org, and one more: ftp://127.0.0.1/.');\n         expect(element.all(by.css('#linky-filter a')).count()).toEqual(4);\n       });\n\n       it('should not linkify snippet without the linky filter', function() {\n         expect(element(by.id('escaped-html')).element(by.binding('snippet')).getText()).\n             toBe('Pretty text with some links: http://angularjs.org/, mailto:us@somewhere.org, ' +\n                  'another@somewhere.org, and one more: ftp://127.0.0.1/.');\n         expect(element.all(by.css('#escaped-html a')).count()).toEqual(0);\n       });\n\n       it('should update', function() {\n         element(by.model('snippet')).clear();\n         element(by.model('snippet')).sendKeys('new http://link.');\n         expect(element(by.id('linky-filter')).element(by.binding('snippet | linky')).getText()).\n             toBe('new http://link.');\n         expect(element.all(by.css('#linky-filter a')).count()).toEqual(1);\n         expect(element(by.id('escaped-html')).element(by.binding('snippet')).getText())\n             .toBe('new http://link.');\n       });\n\n       it('should work with the target property', function() {\n        expect(element(by.id('linky-target')).\n            element(by.binding(\"snippetWithTarget | linky:'_blank'\")).getText()).\n            toBe('http://angularjs.org/');\n        expect(element(by.css('#linky-target a')).getAttribute('target')).toEqual('_blank');\n       });\n     </file>\n   </example>\n */\nangular.module('ngSanitize').filter('linky', ['$sanitize', function($sanitize) {\n  var LINKY_URL_REGEXP =\n        /((ftp|https?):\\/\\/|(www\\.)|(mailto:)?[A-Za-z0-9._%+-]+@)\\S*[^\\s.;,(){}<>\"”’]/,\n      MAILTO_REGEXP = /^mailto:/;\n\n  return function(text, target) {\n    if (!text) return text;\n    var match;\n    var raw = text;\n    var html = [];\n    var url;\n    var i;\n    while ((match = raw.match(LINKY_URL_REGEXP))) {\n      // We can not end in these as they are sometimes found at the end of the sentence\n      url = match[0];\n      // if we did not match ftp/http/www/mailto then assume mailto\n      if (!match[2] && !match[4]) {\n        url = (match[3] ? 'http://' : 'mailto:') + url;\n      }\n      i = match.index;\n      addText(raw.substr(0, i));\n      addLink(url, match[0].replace(MAILTO_REGEXP, ''));\n      raw = raw.substring(i + match[0].length);\n    }\n    addText(raw);\n    return $sanitize(html.join(''));\n\n    function addText(text) {\n      if (!text) {\n        return;\n      }\n      html.push(sanitizeText(text));\n    }\n\n    function addLink(url, text) {\n      html.push('<a ');\n      if (angular.isDefined(target)) {\n        html.push('target=\"',\n                  target,\n                  '\" ');\n      }\n      html.push('href=\"',\n                url.replace(/\"/g, '&quot;'),\n                '\">');\n      addText(text);\n      html.push('</a>');\n    }\n  };\n}]);\n\n\n})(window, window.angular);\n\n\n// tests against the current jqLite/jquery implementation if this can be an element\nfunction validElementString(string){\n    try{\n        return angular.element(string).length !== 0;\n    }catch(any){\n        return false;\n    }\n}\n// setup the global contstant functions for setting up the toolbar\n\n// all tool definitions\nvar taTools = {};\n/*\n    A tool definition is an object with the following key/value parameters:\n        action: [function(deferred, restoreSelection)]\n                a function that is executed on clicking on the button - this will allways be executed using ng-click and will\n                overwrite any ng-click value in the display attribute.\n                The function is passed a deferred object ($q.defer()), if this is wanted to be used `return false;` from the action and\n                manually call `deferred.resolve();` elsewhere to notify the editor that the action has finished.\n                restoreSelection is only defined if the rangy library is included and it can be called as `restoreSelection()` to restore the users\n                selection in the WYSIWYG editor.\n        display: [string]?\n                Optional, an HTML element to be displayed as the button. The `scope` of the button is the tool definition object with some additional functions\n                If set this will cause buttontext and iconclass to be ignored\n        class: [string]?\n                Optional, if set will override the taOptions.classes.toolbarButton class.\n        buttontext: [string]?\n                if this is defined it will replace the contents of the element contained in the `display` element\n        iconclass: [string]?\n                if this is defined an icon (<i>) will be appended to the `display` element with this string as it's class\n        tooltiptext: [string]?\n                Optional, a plain text description of the action, used for the title attribute of the action button in the toolbar by default.\n        activestate: [function(commonElement)]?\n                this function is called on every caret movement, if it returns true then the class taOptions.classes.toolbarButtonActive\n                will be applied to the `display` element, else the class will be removed\n        disabled: [function()]?\n                if this function returns true then the tool will have the class taOptions.classes.disabled applied to it, else it will be removed\n    Other functions available on the scope are:\n        name: [string]\n                the name of the tool, this is the first parameter passed into taRegisterTool\n        isDisabled: [function()]\n                returns true if the tool is disabled, false if it isn't\n        displayActiveToolClass: [function(boolean)]\n                returns true if the tool is 'active' in the currently focussed toolbar\n        onElementSelect: [Object]\n                This object contains the following key/value pairs and is used to trigger the ta-element-select event\n                element: [String]\n                    an element name, will only trigger the onElementSelect action if the tagName of the element matches this string\n                filter: [function(element)]?\n                    an optional filter that returns a boolean, if true it will trigger the onElementSelect.\n                action: [function(event, element, editorScope)]\n                    the action that should be executed if the onElementSelect function runs\n*/\n// name and toolDefinition to add into the tools available to be added on the toolbar\nfunction registerTextAngularTool(name, toolDefinition){\n    if(!name || name === '' || taTools.hasOwnProperty(name)) throw('textAngular Error: A unique name is required for a Tool Definition');\n    if(\n        (toolDefinition.display && (toolDefinition.display === '' || !validElementString(toolDefinition.display))) ||\n        (!toolDefinition.display && !toolDefinition.buttontext && !toolDefinition.iconclass)\n    )\n        throw('textAngular Error: Tool Definition for \"' + name + '\" does not have a valid display/iconclass/buttontext value');\n    taTools[name] = toolDefinition;\n}\n\nangular.module('textAngularSetup', [])\n.constant('taRegisterTool', registerTextAngularTool)\n.value('taTools', taTools)\n// Here we set up the global display defaults, to set your own use a angular $provider#decorator.\n.value('taOptions',  {\n    //////////////////////////////////////////////////////////////////////////////////////\n    // forceTextAngularSanitize\n    // set false to allow the textAngular-sanitize provider to be replaced\n    // with angular-sanitize or a custom provider.\n    forceTextAngularSanitize: true,\n    ///////////////////////////////////////////////////////////////////////////////////////\n    // keyMappings\n    // allow customizable keyMappings for specialized key boards or languages\n    //\n    // keyMappings provides key mappings that are attached to a given commandKeyCode.\n    // To modify a specific keyboard binding, simply provide function which returns true\n    // for the event you wish to map to.\n    // Or to disable a specific keyboard binding, provide a function which returns false.\n    // Note: 'RedoKey' and 'UndoKey' are internally bound to the redo and undo functionality.\n    // At present, the following commandKeyCodes are in use:\n    // 98, 'TabKey', 'ShiftTabKey', 105, 117, 'UndoKey', 'RedoKey'\n    //\n    // To map to an new commandKeyCode, add a new key mapping such as:\n    // {commandKeyCode: 'CustomKey', testForKey: function (event) {\n    //  if (event.keyCode=57 && event.ctrlKey && !event.shiftKey && !event.altKey) return true;\n    // } }\n    // to the keyMappings. This example maps ctrl+9 to 'CustomKey'\n    // Then where taRegisterTool(...) is called, add a commandKeyCode: 'CustomKey' and your\n    // tool will be bound to ctrl+9.\n    //\n    // To disble one of the already bound commandKeyCodes such as 'RedoKey' or 'UndoKey' add:\n    // {commandKeyCode: 'RedoKey', testForKey: function (event) { return false; } },\n    // {commandKeyCode: 'UndoKey', testForKey: function (event) { return false; } },\n    // to disable them.\n    //\n    keyMappings : [],\n    toolbar: [\n        ['h1', 'h2', 'h3', 'h4', 'h5', 'h6', 'p', 'pre', 'quote'],\n        ['bold', 'italics', 'underline', 'strikeThrough', 'ul', 'ol', 'redo', 'undo', 'clear'],\n        ['justifyLeft','justifyCenter','justifyRight','justifyFull','indent','outdent'],\n        ['html', 'insertImage', 'insertLink', 'insertVideo', 'wordcount', 'charcount']\n    ],\n    classes: {\n        focussed: \"focussed\",\n        toolbar: \"btn-toolbar\",\n        toolbarGroup: \"btn-group\",\n        toolbarButton: \"btn btn-default\",\n        toolbarButtonActive: \"active\",\n        disabled: \"disabled\",\n        textEditor: 'form-control',\n        htmlEditor: 'form-control'\n    },\n    defaultTagAttributes : {\n        a: {target:\"\"}\n    },\n    setup: {\n        // wysiwyg mode\n        textEditorSetup: function($element){ /* Do some processing here */ },\n        // raw html\n        htmlEditorSetup: function($element){ /* Do some processing here */ }\n    },\n    defaultFileDropHandler:\n        /* istanbul ignore next: untestable image processing */\n        function(file, insertAction){\n            var reader = new FileReader();\n            if(file.type.substring(0, 5) === 'image'){\n                reader.onload = function() {\n                    if(reader.result !== '') insertAction('insertImage', reader.result, true);\n                };\n\n                reader.readAsDataURL(file);\n                // NOTE: For async procedures return a promise and resolve it when the editor should update the model.\n                return true;\n            }\n            return false;\n        }\n})\n\n// This is the element selector string that is used to catch click events within a taBind, prevents the default and $emits a 'ta-element-select' event\n// these are individually used in an angular.element().find() call. What can go here depends on whether you have full jQuery loaded or just jQLite with angularjs.\n// div is only used as div.ta-insert-video caught in filter.\n.value('taSelectableElements', ['a','img'])\n\n// This is an array of objects with the following options:\n//\t\t\t\tselector: <string> a jqLite or jQuery selector string\n//\t\t\t\tcustomAttribute: <string> an attribute to search for\n//\t\t\t\trenderLogic: <function(element)>\n// Both or one of selector and customAttribute must be defined.\n.value('taCustomRenderers', [\n    {\n        // Parse back out: '<div class=\"ta-insert-video\" ta-insert-video src=\"' + urlLink + '\" allowfullscreen=\"true\" width=\"300\" frameborder=\"0\" height=\"250\"></div>'\n        // To correct video element. For now only support youtube\n        selector: 'img',\n        customAttribute: 'ta-insert-video',\n        renderLogic: function(element){\n            var iframe = angular.element('<iframe></iframe>');\n            var attributes = element.prop(\"attributes\");\n            // loop through element attributes and apply them on iframe\n            angular.forEach(attributes, function(attr) {\n                iframe.attr(attr.name, attr.value);\n            });\n            iframe.attr('src', iframe.attr('ta-insert-video'));\n            element.replaceWith(iframe);\n        }\n    }\n])\n\n.value('taTranslations', {\n    // moved to sub-elements\n    //toggleHTML: \"Toggle HTML\",\n    //insertImage: \"Please enter a image URL to insert\",\n    //insertLink: \"Please enter a URL to insert\",\n    //insertVideo: \"Please enter a youtube URL to embed\",\n    html: {\n        tooltip: 'Toggle html / Rich Text'\n    },\n    // tooltip for heading - might be worth splitting\n    heading: {\n        tooltip: 'Heading '\n    },\n    p: {\n        tooltip: 'Paragraph'\n    },\n    pre: {\n        tooltip: 'Preformatted text'\n    },\n    ul: {\n        tooltip: 'Unordered List'\n    },\n    ol: {\n        tooltip: 'Ordered List'\n    },\n    quote: {\n        tooltip: 'Quote/unquote selection or paragraph'\n    },\n    undo: {\n        tooltip: 'Undo'\n    },\n    redo: {\n        tooltip: 'Redo'\n    },\n    bold: {\n        tooltip: 'Bold'\n    },\n    italic: {\n        tooltip: 'Italic'\n    },\n    underline: {\n        tooltip: 'Underline'\n    },\n    strikeThrough:{\n        tooltip: 'Strikethrough'\n    },\n    justifyLeft: {\n        tooltip: 'Align text left'\n    },\n    justifyRight: {\n        tooltip: 'Align text right'\n    },\n    justifyFull: {\n        tooltip: 'Justify text'\n    },\n    justifyCenter: {\n        tooltip: 'Center'\n    },\n    indent: {\n        tooltip: 'Increase indent'\n    },\n    outdent: {\n        tooltip: 'Decrease indent'\n    },\n    clear: {\n        tooltip: 'Clear formatting'\n    },\n    insertImage: {\n        dialogPrompt: 'Please enter an image URL to insert',\n        tooltip: 'Insert image',\n        hotkey: 'the - possibly language dependent hotkey ... for some future implementation'\n    },\n    insertVideo: {\n        tooltip: 'Insert video',\n        dialogPrompt: 'Please enter a youtube URL to embed'\n    },\n    insertLink: {\n        tooltip: 'Insert / edit link',\n        dialogPrompt: \"Please enter a URL to insert\"\n    },\n    editLink: {\n        reLinkButton: {\n            tooltip: \"Relink\"\n        },\n        unLinkButton: {\n            tooltip: \"Unlink\"\n        },\n        targetToggle: {\n            buttontext: \"Open in New Window\"\n        }\n    },\n    wordcount: {\n        tooltip: 'Display words Count'\n    },\n        charcount: {\n        tooltip: 'Display characters Count'\n    }\n})\n.factory('taToolFunctions', ['$window','taTranslations', function($window, taTranslations) {\n    return {\n        imgOnSelectAction: function(event, $element, editorScope){\n            // setup the editor toolbar\n            // Credit to the work at http://hackerwins.github.io/summernote/ for this editbar logic/display\n            var finishEdit = function(){\n                editorScope.updateTaBindtaTextElement();\n                editorScope.hidePopover();\n            };\n            event.preventDefault();\n            editorScope.displayElements.popover.css('width', '375px');\n            var container = editorScope.displayElements.popoverContainer;\n            container.empty();\n            var buttonGroup = angular.element('<div class=\"btn-group\" style=\"padding-right: 6px;\">');\n            var fullButton = angular.element('<button type=\"button\" class=\"btn btn-default btn-sm btn-small\" unselectable=\"on\" tabindex=\"-1\">100% </button>');\n            fullButton.on('click', function(event){\n                event.preventDefault();\n                $element.css({\n                    'width': '100%',\n                    'height': ''\n                });\n                finishEdit();\n            });\n            var halfButton = angular.element('<button type=\"button\" class=\"btn btn-default btn-sm btn-small\" unselectable=\"on\" tabindex=\"-1\">50% </button>');\n            halfButton.on('click', function(event){\n                event.preventDefault();\n                $element.css({\n                    'width': '50%',\n                    'height': ''\n                });\n                finishEdit();\n            });\n            var quartButton = angular.element('<button type=\"button\" class=\"btn btn-default btn-sm btn-small\" unselectable=\"on\" tabindex=\"-1\">25% </button>');\n            quartButton.on('click', function(event){\n                event.preventDefault();\n                $element.css({\n                    'width': '25%',\n                    'height': ''\n                });\n                finishEdit();\n            });\n            var resetButton = angular.element('<button type=\"button\" class=\"btn btn-default btn-sm btn-small\" unselectable=\"on\" tabindex=\"-1\">Reset</button>');\n            resetButton.on('click', function(event){\n                event.preventDefault();\n                $element.css({\n                    width: '',\n                    height: ''\n                });\n                finishEdit();\n            });\n            buttonGroup.append(fullButton);\n            buttonGroup.append(halfButton);\n            buttonGroup.append(quartButton);\n            buttonGroup.append(resetButton);\n            container.append(buttonGroup);\n\n            buttonGroup = angular.element('<div class=\"btn-group\" style=\"padding-right: 6px;\">');\n            var floatLeft = angular.element('<button type=\"button\" class=\"btn btn-default btn-sm btn-small\" unselectable=\"on\" tabindex=\"-1\"><i class=\"fa fa-align-left\"></i></button>');\n            floatLeft.on('click', function(event){\n                event.preventDefault();\n                // webkit\n                $element.css('float', 'left');\n                // firefox\n                $element.css('cssFloat', 'left');\n                // IE < 8\n                $element.css('styleFloat', 'left');\n                finishEdit();\n            });\n            var floatRight = angular.element('<button type=\"button\" class=\"btn btn-default btn-sm btn-small\" unselectable=\"on\" tabindex=\"-1\"><i class=\"fa fa-align-right\"></i></button>');\n            floatRight.on('click', function(event){\n                event.preventDefault();\n                // webkit\n                $element.css('float', 'right');\n                // firefox\n                $element.css('cssFloat', 'right');\n                // IE < 8\n                $element.css('styleFloat', 'right');\n                finishEdit();\n            });\n            var floatNone = angular.element('<button type=\"button\" class=\"btn btn-default btn-sm btn-small\" unselectable=\"on\" tabindex=\"-1\"><i class=\"fa fa-align-justify\"></i></button>');\n            floatNone.on('click', function(event){\n                event.preventDefault();\n                // webkit\n                $element.css('float', '');\n                // firefox\n                $element.css('cssFloat', '');\n                // IE < 8\n                $element.css('styleFloat', '');\n                finishEdit();\n            });\n            buttonGroup.append(floatLeft);\n            buttonGroup.append(floatNone);\n            buttonGroup.append(floatRight);\n            container.append(buttonGroup);\n\n            buttonGroup = angular.element('<div class=\"btn-group\">');\n            var remove = angular.element('<button type=\"button\" class=\"btn btn-default btn-sm btn-small\" unselectable=\"on\" tabindex=\"-1\"><i class=\"fa fa-trash-o\"></i></button>');\n            remove.on('click', function(event){\n                event.preventDefault();\n                $element.remove();\n                finishEdit();\n            });\n            buttonGroup.append(remove);\n            container.append(buttonGroup);\n\n            editorScope.showPopover($element);\n            editorScope.showResizeOverlay($element);\n        },\n        aOnSelectAction: function(event, $element, editorScope){\n            // setup the editor toolbar\n            // Credit to the work at http://hackerwins.github.io/summernote/ for this editbar logic\n            event.preventDefault();\n            editorScope.displayElements.popover.css('width', '436px');\n            var container = editorScope.displayElements.popoverContainer;\n            container.empty();\n            container.css('line-height', '28px');\n            var link = angular.element('<a href=\"' + $element.attr('href') + '\" target=\"_blank\">' + $element.attr('href') + '</a>');\n            link.css({\n                'display': 'inline-block',\n                'max-width': '200px',\n                'overflow': 'hidden',\n                'text-overflow': 'ellipsis',\n                'white-space': 'nowrap',\n                'vertical-align': 'middle'\n            });\n            container.append(link);\n            var buttonGroup = angular.element('<div class=\"btn-group pull-right\">');\n            var reLinkButton = angular.element('<button type=\"button\" class=\"btn btn-default btn-sm btn-small\" tabindex=\"-1\" unselectable=\"on\" title=\"' + taTranslations.editLink.reLinkButton.tooltip + '\"><i class=\"fa fa-edit icon-edit\"></i></button>');\n            reLinkButton.on('click', function(event){\n                event.preventDefault();\n                var urlLink = $window.prompt(taTranslations.insertLink.dialogPrompt, $element.attr('href'));\n                if(urlLink && urlLink !== '' && urlLink !== 'http://'){\n                    $element.attr('href', urlLink);\n                    editorScope.updateTaBindtaTextElement();\n                }\n                editorScope.hidePopover();\n            });\n            buttonGroup.append(reLinkButton);\n            var unLinkButton = angular.element('<button type=\"button\" class=\"btn btn-default btn-sm btn-small\" tabindex=\"-1\" unselectable=\"on\" title=\"' + taTranslations.editLink.unLinkButton.tooltip + '\"><i class=\"fa fa-unlink icon-unlink\"></i></button>');\n            // directly before this click event is fired a digest is fired off whereby the reference to $element is orphaned off\n            unLinkButton.on('click', function(event){\n                event.preventDefault();\n                $element.replaceWith($element.contents());\n                editorScope.updateTaBindtaTextElement();\n                editorScope.hidePopover();\n            });\n            buttonGroup.append(unLinkButton);\n            var targetToggle = angular.element('<button type=\"button\" class=\"btn btn-default btn-sm btn-small\" tabindex=\"-1\" unselectable=\"on\">' + taTranslations.editLink.targetToggle.buttontext + '</button>');\n            if($element.attr('target') === '_blank'){\n                targetToggle.addClass('active');\n            }\n            targetToggle.on('click', function(event){\n                event.preventDefault();\n                $element.attr('target', ($element.attr('target') === '_blank') ? '' : '_blank');\n                targetToggle.toggleClass('active');\n                editorScope.updateTaBindtaTextElement();\n            });\n            buttonGroup.append(targetToggle);\n            container.append(buttonGroup);\n            editorScope.showPopover($element);\n        },\n        extractYoutubeVideoId: function(url) {\n            var re = /(?:youtube(?:-nocookie)?\\.com\\/(?:[^\\/\\n\\s]+\\/\\S+\\/|(?:v|e(?:mbed)?)\\/|\\S*?[?&]v=)|youtu\\.be\\/)([a-zA-Z0-9_-]{11})/i;\n            var match = url.match(re);\n            return (match && match[1]) || null;\n        }\n    };\n}])\n.run(['taRegisterTool', '$window', 'taTranslations', 'taSelection', 'taToolFunctions', '$sanitize', 'taOptions', '$log',\n    function(taRegisterTool, $window, taTranslations, taSelection, taToolFunctions, $sanitize, taOptions, $log){\n    // test for the version of $sanitize that is in use\n    // You can disable this check by setting taOptions.textAngularSanitize == false\n    var gv = {}; $sanitize('', gv);\n    /* istanbul ignore next, throws error */\n    if ((taOptions.forceTextAngularSanitize===true) && (gv.version !== 'taSanitize')) {\n        throw angular.$$minErr('textAngular')(\"textAngularSetup\", \"The textAngular-sanitize provider has been replaced by another -- have you included angular-sanitize by mistake?\");\n    }\n    taRegisterTool(\"html\", {\n        iconclass: 'fa fa-code',\n        tooltiptext: taTranslations.html.tooltip,\n        action: function(){\n            this.$editor().switchView();\n        },\n        activeState: function(){\n            return this.$editor().showHtml;\n        }\n    });\n    // add the Header tools\n    // convenience functions so that the loop works correctly\n    var _retActiveStateFunction = function(q){\n        return function(){ return this.$editor().queryFormatBlockState(q); };\n    };\n    var headerAction = function(){\n        return this.$editor().wrapSelection(\"formatBlock\", \"<\" + this.name.toUpperCase() +\">\");\n    };\n    angular.forEach(['h1','h2','h3','h4','h5','h6'], function(h){\n        taRegisterTool(h.toLowerCase(), {\n            buttontext: h.toUpperCase(),\n            tooltiptext: taTranslations.heading.tooltip + h.charAt(1),\n            action: headerAction,\n            activeState: _retActiveStateFunction(h.toLowerCase())\n        });\n    });\n    taRegisterTool('p', {\n        buttontext: 'P',\n        tooltiptext: taTranslations.p.tooltip,\n        action: function(){\n            return this.$editor().wrapSelection(\"formatBlock\", \"<P>\");\n        },\n        activeState: function(){ return this.$editor().queryFormatBlockState('p'); }\n    });\n    // key: pre -> taTranslations[key].tooltip, taTranslations[key].buttontext\n    taRegisterTool('pre', {\n        buttontext: 'pre',\n        tooltiptext: taTranslations.pre.tooltip,\n        action: function(){\n            return this.$editor().wrapSelection(\"formatBlock\", \"<PRE>\");\n        },\n        activeState: function(){ return this.$editor().queryFormatBlockState('pre'); }\n    });\n    taRegisterTool('ul', {\n        iconclass: 'fa fa-list-ul',\n        tooltiptext: taTranslations.ul.tooltip,\n        action: function(){\n            return this.$editor().wrapSelection(\"insertUnorderedList\", null);\n        },\n        activeState: function(){ return this.$editor().queryCommandState('insertUnorderedList'); }\n    });\n    taRegisterTool('ol', {\n        iconclass: 'fa fa-list-ol',\n        tooltiptext: taTranslations.ol.tooltip,\n        action: function(){\n            return this.$editor().wrapSelection(\"insertOrderedList\", null);\n        },\n        activeState: function(){ return this.$editor().queryCommandState('insertOrderedList'); }\n    });\n    taRegisterTool('quote', {\n        iconclass: 'fa fa-quote-right',\n        tooltiptext: taTranslations.quote.tooltip,\n        action: function(){\n            return this.$editor().wrapSelection(\"formatBlock\", \"<BLOCKQUOTE>\");\n        },\n        activeState: function(){ return this.$editor().queryFormatBlockState('blockquote'); }\n    });\n    taRegisterTool('undo', {\n        iconclass: 'fa fa-undo',\n        tooltiptext: taTranslations.undo.tooltip,\n        action: function(){\n            return this.$editor().wrapSelection(\"undo\", null);\n        }\n    });\n    taRegisterTool('redo', {\n        iconclass: 'fa fa-repeat',\n        tooltiptext: taTranslations.redo.tooltip,\n        action: function(){\n            return this.$editor().wrapSelection(\"redo\", null);\n        }\n    });\n    taRegisterTool('bold', {\n        iconclass: 'fa fa-bold',\n        tooltiptext: taTranslations.bold.tooltip,\n        action: function(){\n            return this.$editor().wrapSelection(\"bold\", null);\n        },\n        activeState: function(){\n            return this.$editor().queryCommandState('bold');\n        },\n        commandKeyCode: 98\n    });\n    taRegisterTool('justifyLeft', {\n        iconclass: 'fa fa-align-left',\n        tooltiptext: taTranslations.justifyLeft.tooltip,\n        action: function(){\n            return this.$editor().wrapSelection(\"justifyLeft\", null);\n        },\n        activeState: function(commonElement){\n            /* istanbul ignore next: */\n            if (commonElement && commonElement.nodeName === '#document') return false;\n            var result = false;\n            if (commonElement) {\n                // commonELement.css('text-align') can throw an error 'Cannot read property 'defaultView' of null' in rare conditions\n                // so we do try catch here...\n                try {\n                    result =\n                        commonElement.css('text-align') === 'left' ||\n                        commonElement.attr('align') === 'left' ||\n                        (\n                            commonElement.css('text-align') !== 'right' &&\n                            commonElement.css('text-align') !== 'center' &&\n                            commonElement.css('text-align') !== 'justify' && !this.$editor().queryCommandState('justifyRight') && !this.$editor().queryCommandState('justifyCenter')\n                        ) && !this.$editor().queryCommandState('justifyFull');\n                } catch(e) {\n                    /* istanbul ignore next: error handler */\n                    //console.log(e);\n                    result = false;\n                }\n            }\n            result = result || this.$editor().queryCommandState('justifyLeft');\n            return result;\n        }\n    });\n    taRegisterTool('justifyRight', {\n        iconclass: 'fa fa-align-right',\n        tooltiptext: taTranslations.justifyRight.tooltip,\n        action: function(){\n            return this.$editor().wrapSelection(\"justifyRight\", null);\n        },\n        activeState: function(commonElement){\n            /* istanbul ignore next: */\n            if (commonElement && commonElement.nodeName === '#document') return false;\n            var result = false;\n            if(commonElement) {\n                // commonELement.css('text-align') can throw an error 'Cannot read property 'defaultView' of null' in rare conditions\n                // so we do try catch here...\n                try {\n                    result = commonElement.css('text-align') === 'right';\n                } catch(e) {\n                    /* istanbul ignore next: error handler */\n                    //console.log(e);\n                    result = false;\n                }\n            }\n            result = result || this.$editor().queryCommandState('justifyRight');\n            return result;\n        }\n    });\n    taRegisterTool('justifyFull', {\n        iconclass: 'fa fa-align-justify',\n        tooltiptext: taTranslations.justifyFull.tooltip,\n        action: function(){\n            return this.$editor().wrapSelection(\"justifyFull\", null);\n        },\n        activeState: function(commonElement){\n            var result = false;\n            if(commonElement) {\n                // commonELement.css('text-align') can throw an error 'Cannot read property 'defaultView' of null' in rare conditions\n                // so we do try catch here...\n                try {\n                    result = commonElement.css('text-align') === 'justify';\n                } catch(e) {\n                    /* istanbul ignore next: error handler */\n                    //console.log(e);\n                    result = false;\n                }\n            }\n            result = result || this.$editor().queryCommandState('justifyFull');\n            return result;\n        }\n    });\n    taRegisterTool('justifyCenter', {\n        iconclass: 'fa fa-align-center',\n        tooltiptext: taTranslations.justifyCenter.tooltip,\n        action: function(){\n            return this.$editor().wrapSelection(\"justifyCenter\", null);\n        },\n        activeState: function(commonElement){\n            /* istanbul ignore next: */\n            if (commonElement && commonElement.nodeName === '#document') return false;\n            var result = false;\n            if(commonElement) {\n                // commonELement.css('text-align') can throw an error 'Cannot read property 'defaultView' of null' in rare conditions\n                // so we do try catch here...\n                try {\n                    result = commonElement.css('text-align') === 'center';\n                } catch(e) {\n                    /* istanbul ignore next: error handler */\n                    //console.log(e);\n                    result = false;\n                }\n\n            }\n            result = result || this.$editor().queryCommandState('justifyCenter');\n            return result;\n        }\n    });\n    taRegisterTool('indent', {\n        iconclass: 'fa fa-indent',\n        tooltiptext: taTranslations.indent.tooltip,\n        action: function(){\n            return this.$editor().wrapSelection(\"indent\", null);\n        },\n        activeState: function(){\n            return this.$editor().queryFormatBlockState('blockquote');\n        },\n        commandKeyCode: 'TabKey'\n    });\n    taRegisterTool('outdent', {\n        iconclass: 'fa fa-outdent',\n        tooltiptext: taTranslations.outdent.tooltip,\n        action: function(){\n            return this.$editor().wrapSelection(\"outdent\", null);\n        },\n        activeState: function(){\n            return false;\n        },\n        commandKeyCode: 'ShiftTabKey'\n    });\n    taRegisterTool('italics', {\n        iconclass: 'fa fa-italic',\n        tooltiptext: taTranslations.italic.tooltip,\n        action: function(){\n            return this.$editor().wrapSelection(\"italic\", null);\n        },\n        activeState: function(){\n            return this.$editor().queryCommandState('italic');\n        },\n        commandKeyCode: 105\n    });\n    taRegisterTool('underline', {\n        iconclass: 'fa fa-underline',\n        tooltiptext: taTranslations.underline.tooltip,\n        action: function(){\n            return this.$editor().wrapSelection(\"underline\", null);\n        },\n        activeState: function(){\n            return this.$editor().queryCommandState('underline');\n        },\n        commandKeyCode: 117\n    });\n    taRegisterTool('strikeThrough', {\n        iconclass: 'fa fa-strikethrough',\n        tooltiptext: taTranslations.strikeThrough.tooltip,\n        action: function(){\n            return this.$editor().wrapSelection(\"strikeThrough\", null);\n        },\n        activeState: function(){\n            return document.queryCommandState('strikeThrough');\n        }\n    });\n    taRegisterTool('clear', {\n        iconclass: 'fa fa-ban',\n        tooltiptext: taTranslations.clear.tooltip,\n        action: function(deferred, restoreSelection){\n            var i, selectedElements, elementsSeen;\n\n            this.$editor().wrapSelection(\"removeFormat\", null);\n            var possibleNodes = angular.element(taSelection.getSelectionElement());\n            selectedElements = taSelection.getAllSelectedElements();\n            //$log.log('selectedElements:', selectedElements);\n            // remove lists\n            var removeListElements = function(list, pe){\n                list = angular.element(list);\n                var prevElement = pe;\n                if (!pe) {\n                    prevElement = list;\n                }\n                angular.forEach(list.children(), function(liElem){\n                    if (liElem.tagName.toLowerCase() === 'ul' ||\n                        liElem.tagName.toLowerCase() === 'ol') {\n                        prevElement = removeListElements(liElem, prevElement);\n                    } else {\n                        var newElem = angular.element('<p></p>');\n                        newElem.html(angular.element(liElem).html());\n                        prevElement.after(newElem);\n                        prevElement = newElem;\n                    }\n                });\n                list.remove();\n                return prevElement;\n            };\n\n            angular.forEach(selectedElements, function(element) {\n                if (element.nodeName.toLowerCase() === 'ul' ||\n                    element.nodeName.toLowerCase() === 'ol') {\n                    //console.log('removeListElements', element);\n                    removeListElements(element);\n                }\n            });\n\n            angular.forEach(possibleNodes.find(\"ul\"), removeListElements);\n            angular.forEach(possibleNodes.find(\"ol\"), removeListElements);\n\n            // clear out all class attributes. These do not seem to be cleared via removeFormat\n            var $editor = this.$editor();\n            var recursiveRemoveClass = function(node){\n                node = angular.element(node);\n                /* istanbul ignore next: this is not triggered in tests any longer since we now never select the whole displayELement */\n                if(node[0] !== $editor.displayElements.text[0]) {\n                    node.removeAttr('class');\n                }\n                angular.forEach(node.children(), recursiveRemoveClass);\n            };\n            angular.forEach(possibleNodes, recursiveRemoveClass);\n            // check if in list. If not in list then use formatBlock option\n            if(possibleNodes[0] && possibleNodes[0].tagName.toLowerCase() !== 'li' &&\n                possibleNodes[0].tagName.toLowerCase() !== 'ol' &&\n                possibleNodes[0].tagName.toLowerCase() !== 'ul' &&\n                possibleNodes[0].getAttribute(\"contenteditable\") !== \"true\") {\n                this.$editor().wrapSelection(\"formatBlock\", \"default\");\n            }\n            restoreSelection();\n        }\n    });\n\n        /* jshint -W099 */\n    /****************************\n     //  we don't use this code - since the previous way CLEAR is expected to work does not clear partially selected <li>\n\n     var removeListElement = function(listE){\n                console.log(listE);\n                var _list = listE.parentNode.childNodes;\n                console.log('_list', _list);\n                var _preLis = [], _postLis = [], _found = false;\n                for (i = 0; i < _list.length; i++) {\n                    if (_list[i] === listE) {\n                        _found = true;\n                    } else if (!_found) _preLis.push(_list[i]);\n                    else _postLis.push(_list[i]);\n                }\n                var _parent = angular.element(listE.parentNode);\n                var newElem = angular.element('<p></p>');\n                newElem.html(angular.element(listE).html());\n                if (_preLis.length === 0 || _postLis.length === 0) {\n                    if (_postLis.length === 0) _parent.after(newElem);\n                    else _parent[0].parentNode.insertBefore(newElem[0], _parent[0]);\n\n                    if (_preLis.length === 0 && _postLis.length === 0) _parent.remove();\n                    else angular.element(listE).remove();\n                } else {\n                    var _firstList = angular.element('<' + _parent[0].tagName + '></' + _parent[0].tagName + '>');\n                    var _secondList = angular.element('<' + _parent[0].tagName + '></' + _parent[0].tagName + '>');\n                    for (i = 0; i < _preLis.length; i++) _firstList.append(angular.element(_preLis[i]));\n                    for (i = 0; i < _postLis.length; i++) _secondList.append(angular.element(_postLis[i]));\n                    _parent.after(_secondList);\n                    _parent.after(newElem);\n                    _parent.after(_firstList);\n                    _parent.remove();\n                }\n                taSelection.setSelectionToElementEnd(newElem[0]);\n            };\n\n     elementsSeen = [];\n     if (selectedElements.length !==0) console.log(selectedElements);\n     angular.forEach(selectedElements, function (element) {\n                if (elementsSeen.indexOf(element) !== -1 || elementsSeen.indexOf(element.parentElement) !== -1) {\n                    return;\n                }\n                elementsSeen.push(element);\n                if (element.nodeName.toLowerCase() === 'li') {\n                    console.log('removeListElement', element);\n                    removeListElement(element);\n                }\n                else if (element.parentElement && element.parentElement.nodeName.toLowerCase() === 'li') {\n                    console.log('removeListElement', element.parentElement);\n                    elementsSeen.push(element.parentElement);\n                    removeListElement(element.parentElement);\n                }\n            });\n     **********************/\n\n    /**********************\n     if(possibleNodes[0].tagName.toLowerCase() === 'li'){\n                var _list = possibleNodes[0].parentNode.childNodes;\n                var _preLis = [], _postLis = [], _found = false;\n                for(i = 0; i < _list.length; i++){\n                    if(_list[i] === possibleNodes[0]){\n                        _found = true;\n                    }else if(!_found) _preLis.push(_list[i]);\n                    else _postLis.push(_list[i]);\n                }\n                var _parent = angular.element(possibleNodes[0].parentNode);\n                var newElem = angular.element('<p></p>');\n                newElem.html(angular.element(possibleNodes[0]).html());\n                if(_preLis.length === 0 || _postLis.length === 0){\n                    if(_postLis.length === 0) _parent.after(newElem);\n                    else _parent[0].parentNode.insertBefore(newElem[0], _parent[0]);\n\n                    if(_preLis.length === 0 && _postLis.length === 0) _parent.remove();\n                    else angular.element(possibleNodes[0]).remove();\n                }else{\n                    var _firstList = angular.element('<'+_parent[0].tagName+'></'+_parent[0].tagName+'>');\n                    var _secondList = angular.element('<'+_parent[0].tagName+'></'+_parent[0].tagName+'>');\n                    for(i = 0; i < _preLis.length; i++) _firstList.append(angular.element(_preLis[i]));\n                    for(i = 0; i < _postLis.length; i++) _secondList.append(angular.element(_postLis[i]));\n                    _parent.after(_secondList);\n                    _parent.after(newElem);\n                    _parent.after(_firstList);\n                    _parent.remove();\n                }\n                taSelection.setSelectionToElementEnd(newElem[0]);\n            }\n     *******************/\n\n\n    /* istanbul ignore next: if it's javascript don't worry - though probably should show some kind of error message */\n    var blockJavascript = function (link) {\n        if (link.toLowerCase().indexOf('javascript')!==-1) {\n            return true;\n        }\n        return false;\n    };\n\n    taRegisterTool('insertImage', {\n        iconclass: 'fa fa-picture-o',\n        tooltiptext: taTranslations.insertImage.tooltip,\n        action: function(){\n            var imageLink;\n            imageLink = $window.prompt(taTranslations.insertImage.dialogPrompt, 'http://');\n            if(imageLink && imageLink !== '' && imageLink !== 'http://'){\n                /* istanbul ignore next: don't know how to test this... since it needs a dialogPrompt */\n                // block javascript here\n                if (!blockJavascript(imageLink)) {\n                    if (taSelection.getSelectionElement().tagName && taSelection.getSelectionElement().tagName.toLowerCase() === 'a') {\n                        // due to differences in implementation between FireFox and Chrome, we must move the\n                        // insertion point past the <a> element, otherwise FireFox inserts inside the <a>\n                        // With this change, both FireFox and Chrome behave the same way!\n                        taSelection.setSelectionAfterElement(taSelection.getSelectionElement());\n                    }\n                    // In the past we used the simple statement:\n                    //return this.$editor().wrapSelection('insertImage', imageLink, true);\n                    //\n                    // However on Firefox only, when the content is empty this is a problem\n                    // See Issue #1201\n                    // Investigation reveals that Firefox only inserts a <p> only!!!!\n                    // So now we use insertHTML here and all is fine.\n                    // NOTE: this is what 'insertImage' is supposed to do anyway!\n                    var embed = '<img src=\"' + imageLink + '\">';\n                    return this.$editor().wrapSelection('insertHTML', embed, true);\n                }\n            }\n        },\n        onElementSelect: {\n            element: 'img',\n            action: taToolFunctions.imgOnSelectAction\n        }\n    });\n    taRegisterTool('insertVideo', {\n        iconclass: 'fa fa-youtube-play',\n        tooltiptext: taTranslations.insertVideo.tooltip,\n        action: function(){\n            var urlPrompt;\n            urlPrompt = $window.prompt(taTranslations.insertVideo.dialogPrompt, 'https://');\n            // block javascript here\n            /* istanbul ignore else: if it's javascript don't worry - though probably should show some kind of error message */\n            if (!blockJavascript(urlPrompt)) {\n\n                if (urlPrompt && urlPrompt !== '' && urlPrompt !== 'https://') {\n\n                    videoId = taToolFunctions.extractYoutubeVideoId(urlPrompt);\n\n                    /* istanbul ignore else: if it's invalid don't worry - though probably should show some kind of error message */\n                    if (videoId) {\n                        // create the embed link\n                        var urlLink = \"https://www.youtube.com/embed/\" + videoId;\n                        // create the HTML\n                        // for all options see: http://stackoverflow.com/questions/2068344/how-do-i-get-a-youtube-video-thumbnail-from-the-youtube-api\n                        // maxresdefault.jpg seems to be undefined on some.\n                        var embed = '<img class=\"ta-insert-video\" src=\"https://img.youtube.com/vi/' + videoId + '/hqdefault.jpg\" ta-insert-video=\"' + urlLink + '\" contenteditable=\"false\" allowfullscreen=\"true\" frameborder=\"0\" />';\n                        /* istanbul ignore next: don't know how to test this... since it needs a dialogPrompt */\n                        if (taSelection.getSelectionElement().tagName && taSelection.getSelectionElement().tagName.toLowerCase() === 'a') {\n                            // due to differences in implementation between FireFox and Chrome, we must move the\n                            // insertion point past the <a> element, otherwise FireFox inserts inside the <a>\n                            // With this change, both FireFox and Chrome behave the same way!\n                            taSelection.setSelectionAfterElement(taSelection.getSelectionElement());\n                        }\n                        // insert\n                        return this.$editor().wrapSelection('insertHTML', embed, true);\n                    }\n                }\n            }\n        },\n        onElementSelect: {\n            element: 'img',\n            onlyWithAttrs: ['ta-insert-video'],\n            action: taToolFunctions.imgOnSelectAction\n        }\n    });\n    taRegisterTool('insertLink', {\n        tooltiptext: taTranslations.insertLink.tooltip,\n        iconclass: 'fa fa-link',\n        action: function(){\n            var urlLink;\n            // if this link has already been set, we need to just edit the existing link\n            /* istanbul ignore if: we do not test this */\n            if (taSelection.getSelectionElement().tagName && taSelection.getSelectionElement().tagName.toLowerCase() === 'a') {\n                urlLink = $window.prompt(taTranslations.insertLink.dialogPrompt, taSelection.getSelectionElement().href);\n            } else {\n                urlLink = $window.prompt(taTranslations.insertLink.dialogPrompt, 'http://');\n            }\n            if(urlLink && urlLink !== '' && urlLink !== 'http://'){\n                // block javascript here\n                /* istanbul ignore else: if it's javascript don't worry - though probably should show some kind of error message */\n                if (!blockJavascript(urlLink)) {\n                    return this.$editor().wrapSelection('createLink', urlLink, true);\n                }\n            }\n        },\n        activeState: function(commonElement){\n            if(commonElement) return commonElement[0].tagName === 'A';\n            return false;\n        },\n        onElementSelect: {\n            element: 'a',\n            action: taToolFunctions.aOnSelectAction\n        }\n    });\n    taRegisterTool('wordcount', {\n        display: '<div id=\"toolbarWC\" style=\"display:block; min-width:100px;\">Words: <span ng-bind=\"wordcount\"></span></div>',\n        disabled: true,\n        wordcount: 0,\n        activeState: function(){ // this fires on keyup\n            var textElement = this.$editor().displayElements.text;\n            /* istanbul ignore next: will default to '' when undefined */\n            var workingHTML = textElement[0].innerHTML || '';\n            var noOfWords = 0;\n\n            /* istanbul ignore if: will default to '' when undefined */\n            if (workingHTML.replace(/\\s*<[^>]*?>\\s*/g, '') !== '') {\n                if (workingHTML.trim() !== '') {\n                    noOfWords = workingHTML.replace(/<\\/?(b|i|em|strong|span|u|strikethrough|a|img|small|sub|sup|label)( [^>*?])?>/gi, '') // remove inline tags without adding spaces\n                        .replace(/(<[^>]*?>\\s*<[^>]*?>)/ig, ' ') // replace adjacent tags with possible space between with a space\n                        .replace(/(<[^>]*?>)/ig, '') // remove any singular tags\n                        .replace(/\\s+/ig, ' ') // condense spacing\n                        .match(/\\S+/g).length; // count remaining non-space strings\n                }\n            }\n\n            //Set current scope\n            this.wordcount = noOfWords;\n            //Set editor scope\n            this.$editor().wordcount = noOfWords;\n\n            return false;\n        }\n    });\n    taRegisterTool('charcount', {\n        display: '<div id=\"toolbarCC\" style=\"display:block; min-width:120px;\">Characters: <span ng-bind=\"charcount\"></span></div>',\n        disabled: true,\n        charcount: 0,\n        activeState: function(){ // this fires on keyup\n            var textElement = this.$editor().displayElements.text;\n            var sourceText = textElement[0].innerText || textElement[0].textContent; // to cover the non-jquery use case.\n\n            // Caculate number of chars\n            var noOfChars = sourceText.replace(/(\\r\\n|\\n|\\r)/gm,\"\").replace(/^\\s+/g,' ').replace(/\\s+$/g, ' ').length;\n            //Set current scope\n            this.charcount = noOfChars;\n            //Set editor scope\n            this.$editor().charcount = noOfChars;\n            return false;\n        }\n    });\n}]);\n\n/**\n * angular-drag-and-drop-lists v2.1.0\n *\n * Copyright (c) 2014 Marcel Juenemann marcel@juenemann.cc\n * Copyright (c) 2014-2017 Google Inc.\n * https://github.com/marceljuenemann/angular-drag-and-drop-lists\n *\n * License: MIT\n */\n(function(dndLists) {\n\n  // In standard-compliant browsers we use a custom mime type and also encode the dnd-type in it.\n  // However, IE and Edge only support a limited number of mime types. The workarounds are described\n  // in https://github.com/marceljuenemann/angular-drag-and-drop-lists/wiki/Data-Transfer-Design\n  var MIME_TYPE = 'application/x-dnd';\n  var EDGE_MIME_TYPE = 'application/json';\n  var MSIE_MIME_TYPE = 'Text';\n\n  // All valid HTML5 drop effects, in the order in which we prefer to use them.\n  var ALL_EFFECTS = ['move', 'copy', 'link'];\n\n  /**\n   * Use the dnd-draggable attribute to make your element draggable\n   *\n   * Attributes:\n   * - dnd-draggable      Required attribute. The value has to be an object that represents the data\n   *                      of the element. In case of a drag and drop operation the object will be\n   *                      serialized and unserialized on the receiving end.\n   * - dnd-effect-allowed Use this attribute to limit the operations that can be performed. Valid\n   *                      options are \"move\", \"copy\" and \"link\", as well as \"all\", \"copyMove\",\n   *                      \"copyLink\" and \"linkMove\". The semantics of these operations are up to you\n   *                      and have to be implemented using the callbacks described below. If you\n   *                      allow multiple options, the user can choose between them by using the\n   *                      modifier keys (OS specific). The cursor will be changed accordingly,\n   *                      expect for IE and Edge, where this is not supported.\n   * - dnd-type           Use this attribute if you have different kinds of items in your\n   *                      application and you want to limit which items can be dropped into which\n   *                      lists. Combine with dnd-allowed-types on the dnd-list(s). This attribute\n   *                      must be a lower case string. Upper case characters can be used, but will\n   *                      be converted to lower case automatically.\n   * - dnd-disable-if     You can use this attribute to dynamically disable the draggability of the\n   *                      element. This is useful if you have certain list items that you don't want\n   *                      to be draggable, or if you want to disable drag & drop completely without\n   *                      having two different code branches (e.g. only allow for admins).\n   *\n   * Callbacks:\n   * - dnd-dragstart      Callback that is invoked when the element was dragged. The original\n   *                      dragstart event will be provided in the local event variable.\n   * - dnd-moved          Callback that is invoked when the element was moved. Usually you will\n   *                      remove your element from the original list in this callback, since the\n   *                      directive is not doing that for you automatically. The original dragend\n   *                      event will be provided in the local event variable.\n   * - dnd-copied         Same as dnd-moved, just that it is called when the element was copied\n   *                      instead of moved, so you probably want to implement a different logic.\n   * - dnd-linked         Same as dnd-moved, just that it is called when the element was linked\n   *                      instead of moved, so you probably want to implement a different logic.\n   * - dnd-canceled       Callback that is invoked if the element was dragged, but the operation was\n   *                      canceled and the element was not dropped. The original dragend event will\n   *                      be provided in the local event variable.\n   * - dnd-dragend        Callback that is invoked when the drag operation ended. Available local\n   *                      variables are event and dropEffect.\n   * - dnd-selected       Callback that is invoked when the element was clicked but not dragged.\n   *                      The original click event will be provided in the local event variable.\n   * - dnd-callback       Custom callback that is passed to dropzone callbacks and can be used to\n   *                      communicate between source and target scopes. The dropzone can pass user\n   *                      defined variables to this callback.\n   *\n   * CSS classes:\n   * - dndDragging        This class will be added to the element while the element is being\n   *                      dragged. It will affect both the element you see while dragging and the\n   *                      source element that stays at it's position. Do not try to hide the source\n   *                      element with this class, because that will abort the drag operation.\n   * - dndDraggingSource  This class will be added to the element after the drag operation was\n   *                      started, meaning it only affects the original element that is still at\n   *                      it's source position, and not the \"element\" that the user is dragging with\n   *                      his mouse pointer.\n   */\n  dndLists.directive('dndDraggable', ['$parse', '$timeout', function($parse, $timeout) {\n    return function(scope, element, attr) {\n      // Set the HTML5 draggable attribute on the element.\n      element.attr(\"draggable\", \"true\");\n\n      // If the dnd-disable-if attribute is set, we have to watch that.\n      if (attr.dndDisableIf) {\n        scope.$watch(attr.dndDisableIf, function(disabled) {\n          element.attr(\"draggable\", !disabled);\n        });\n      }\n\n      /**\n       * When the drag operation is started we have to prepare the dataTransfer object,\n       * which is the primary way we communicate with the target element\n       */\n      element.on('dragstart', function(event) {\n        event = event.originalEvent || event;\n\n        // Check whether the element is draggable, since dragstart might be triggered on a child.\n        if (element.attr('draggable') == 'false') return true;\n\n        // Initialize global state.\n        dndState.isDragging = true;\n        dndState.itemType = attr.dndType && scope.$eval(attr.dndType).toLowerCase();\n\n        // Set the allowed drop effects. See below for special IE handling.\n        dndState.dropEffect = \"none\";\n        dndState.effectAllowed = attr.dndEffectAllowed || ALL_EFFECTS[0];\n        event.dataTransfer.effectAllowed = dndState.effectAllowed;\n\n        // Internet Explorer and Microsoft Edge don't support custom mime types, see design doc:\n        // https://github.com/marceljuenemann/angular-drag-and-drop-lists/wiki/Data-Transfer-Design\n        var item = scope.$eval(attr.dndDraggable);\n        var mimeType = MIME_TYPE + (dndState.itemType ? ('-' + dndState.itemType) : '');\n        try {\n          event.dataTransfer.setData(mimeType, angular.toJson(item));\n        } catch (e) {\n          // Setting a custom MIME type did not work, we are probably in IE or Edge.\n          var data = angular.toJson({item: item, type: dndState.itemType});\n          try {\n            event.dataTransfer.setData(EDGE_MIME_TYPE, data);\n          } catch (e) {\n            // We are in Internet Explorer and can only use the Text MIME type. Also note that IE\n            // does not allow changing the cursor in the dragover event, therefore we have to choose\n            // the one we want to display now by setting effectAllowed.\n            var effectsAllowed = filterEffects(ALL_EFFECTS, dndState.effectAllowed);\n            event.dataTransfer.effectAllowed = effectsAllowed[0];\n            event.dataTransfer.setData(MSIE_MIME_TYPE, data);\n          }\n        }\n\n        // Add CSS classes. See documentation above.\n        element.addClass(\"dndDragging\");\n        $timeout(function() { element.addClass(\"dndDraggingSource\"); }, 0);\n\n        // Try setting a proper drag image if triggered on a dnd-handle (won't work in IE).\n        if (event._dndHandle && event.dataTransfer.setDragImage) {\n          event.dataTransfer.setDragImage(element[0], 0, 0);\n        }\n\n        // Invoke dragstart callback and prepare extra callback for dropzone.\n        $parse(attr.dndDragstart)(scope, {event: event});\n        if (attr.dndCallback) {\n          var callback = $parse(attr.dndCallback);\n          dndState.callback = function(params) { return callback(scope, params || {}); };\n        }\n\n        event.stopPropagation();\n      });\n\n      /**\n       * The dragend event is triggered when the element was dropped or when the drag\n       * operation was aborted (e.g. hit escape button). Depending on the executed action\n       * we will invoke the callbacks specified with the dnd-moved or dnd-copied attribute.\n       */\n      element.on('dragend', function(event) {\n        event = event.originalEvent || event;\n\n        // Invoke callbacks. Usually we would use event.dataTransfer.dropEffect to determine\n        // the used effect, but Chrome has not implemented that field correctly. On Windows\n        // it always sets it to 'none', while Chrome on Linux sometimes sets it to something\n        // else when it's supposed to send 'none' (drag operation aborted).\n        scope.$apply(function() {\n          var dropEffect = dndState.dropEffect;\n          var cb = {copy: 'dndCopied', link: 'dndLinked', move: 'dndMoved', none: 'dndCanceled'};\n          $parse(attr[cb[dropEffect]])(scope, {event: event});\n          $parse(attr.dndDragend)(scope, {event: event, dropEffect: dropEffect});\n        });\n\n        // Clean up\n        dndState.isDragging = false;\n        dndState.callback = undefined;\n        element.removeClass(\"dndDragging\");\n        element.removeClass(\"dndDraggingSource\");\n        event.stopPropagation();\n\n        // In IE9 it is possible that the timeout from dragstart triggers after the dragend handler.\n        $timeout(function() { element.removeClass(\"dndDraggingSource\"); }, 0);\n      });\n\n      /**\n       * When the element is clicked we invoke the callback function\n       * specified with the dnd-selected attribute.\n       */\n      element.on('click', function(event) {\n        if (!attr.dndSelected) return;\n\n        event = event.originalEvent || event;\n        scope.$apply(function() {\n          $parse(attr.dndSelected)(scope, {event: event});\n        });\n\n        // Prevent triggering dndSelected in parent elements.\n        event.stopPropagation();\n      });\n\n      /**\n       * Workaround to make element draggable in IE9\n       */\n      element.on('selectstart', function() {\n        if (this.dragDrop) this.dragDrop();\n      });\n    };\n  }]);\n\n  /**\n   * Use the dnd-list attribute to make your list element a dropzone. Usually you will add a single\n   * li element as child with the ng-repeat directive. If you don't do that, we will not be able to\n   * position the dropped element correctly. If you want your list to be sortable, also add the\n   * dnd-draggable directive to your li element(s).\n   *\n   * Attributes:\n   * - dnd-list             Required attribute. The value has to be the array in which the data of\n   *                        the dropped element should be inserted. The value can be blank if used\n   *                        with a custom dnd-drop handler that always returns true.\n   * - dnd-allowed-types    Optional array of allowed item types. When used, only items that had a\n   *                        matching dnd-type attribute will be dropable. Upper case characters will\n   *                        automatically be converted to lower case.\n   * - dnd-effect-allowed   Optional string expression that limits the drop effects that can be\n   *                        performed in the list. See dnd-effect-allowed on dnd-draggable for more\n   *                        details on allowed options. The default value is all.\n   * - dnd-disable-if       Optional boolean expresssion. When it evaluates to true, no dropping\n   *                        into the list is possible. Note that this also disables rearranging\n   *                        items inside the list.\n   * - dnd-horizontal-list  Optional boolean expresssion. When it evaluates to true, the positioning\n   *                        algorithm will use the left and right halfs of the list items instead of\n   *                        the upper and lower halfs.\n   * - dnd-external-sources Optional boolean expression. When it evaluates to true, the list accepts\n   *                        drops from sources outside of the current browser tab. This allows to\n   *                        drag and drop accross different browser tabs. The only major browser\n   *                        that does not support this is currently Microsoft Edge.\n   *\n   * Callbacks:\n   * - dnd-dragover         Optional expression that is invoked when an element is dragged over the\n   *                        list. If the expression is set, but does not return true, the element is\n   *                        not allowed to be dropped. The following variables will be available:\n   *                        - event: The original dragover event sent by the browser.\n   *                        - index: The position in the list at which the element would be dropped.\n   *                        - type: The dnd-type set on the dnd-draggable, or undefined if non was\n   *                          set. Will be null for drops from external sources in IE and Edge,\n   *                          since we don't know the type in those cases.\n   *                        - dropEffect: One of move, copy or link, see dnd-effect-allowed.\n   *                        - external: Whether the element was dragged from an external source.\n   *                        - callback: If dnd-callback was set on the source element, this is a\n   *                          function reference to the callback. The callback can be invoked with\n   *                          custom variables like this: callback({var1: value1, var2: value2}).\n   *                          The callback will be executed on the scope of the source element. If\n   *                          dnd-external-sources was set and external is true, this callback will\n   *                          not be available.\n   * - dnd-drop             Optional expression that is invoked when an element is dropped on the\n   *                        list. The same variables as for dnd-dragover will be available, with the\n   *                        exception that type is always known and therefore never null. There\n   *                        will also be an item variable, which is the transferred object. The\n   *                        return value determines the further handling of the drop:\n   *                        - falsy: The drop will be canceled and the element won't be inserted.\n   *                        - true: Signalises that the drop is allowed, but the dnd-drop\n   *                          callback already took care of inserting the element.\n   *                        - otherwise: All other return values will be treated as the object to\n   *                          insert into the array. In most cases you want to simply return the\n   *                          item parameter, but there are no restrictions on what you can return.\n   * - dnd-inserted         Optional expression that is invoked after a drop if the element was\n   *                        actually inserted into the list. The same local variables as for\n   *                        dnd-drop will be available. Note that for reorderings inside the same\n   *                        list the old element will still be in the list due to the fact that\n   *                        dnd-moved was not called yet.\n   *\n   * CSS classes:\n   * - dndPlaceholder       When an element is dragged over the list, a new placeholder child\n   *                        element will be added. This element is of type li and has the class\n   *                        dndPlaceholder set. Alternatively, you can define your own placeholder\n   *                        by creating a child element with dndPlaceholder class.\n   * - dndDragover          Will be added to the list while an element is dragged over the list.\n   */\n  dndLists.directive('dndList', ['$parse', function($parse) {\n    return function(scope, element, attr) {\n      // While an element is dragged over the list, this placeholder element is inserted\n      // at the location where the element would be inserted after dropping.\n      var placeholder = getPlaceholderElement();\n      placeholder.remove();\n\n      var placeholderNode = placeholder[0];\n      var listNode = element[0];\n      var listSettings = {};\n\n      /**\n       * The dragenter event is fired when a dragged element or text selection enters a valid drop\n       * target. According to the spec, we either need to have a dropzone attribute or listen on\n       * dragenter events and call preventDefault(). It should be noted though that no browser seems\n       * to enforce this behaviour.\n       */\n      element.on('dragenter', function (event) {\n        event = event.originalEvent || event;\n\n        // Calculate list properties, so that we don't have to repeat this on every dragover event.\n        var types = attr.dndAllowedTypes && scope.$eval(attr.dndAllowedTypes);\n        listSettings = {\n          allowedTypes: angular.isArray(types) && types.join('|').toLowerCase().split('|'),\n          disabled: attr.dndDisableIf && scope.$eval(attr.dndDisableIf),\n          externalSources: attr.dndExternalSources && scope.$eval(attr.dndExternalSources),\n          horizontal: attr.dndHorizontalList && scope.$eval(attr.dndHorizontalList)\n        };\n\n        var mimeType = getMimeType(event.dataTransfer.types);\n        if (!mimeType || !isDropAllowed(getItemType(mimeType))) return true;\n        event.preventDefault();\n      });\n\n      /**\n       * The dragover event is triggered \"every few hundred milliseconds\" while an element\n       * is being dragged over our list, or over an child element.\n       */\n      element.on('dragover', function(event) {\n        event = event.originalEvent || event;\n\n        // Check whether the drop is allowed and determine mime type.\n        var mimeType = getMimeType(event.dataTransfer.types);\n        var itemType = getItemType(mimeType);\n        if (!mimeType || !isDropAllowed(itemType)) return true;\n\n        // Make sure the placeholder is shown, which is especially important if the list is empty.\n        if (placeholderNode.parentNode != listNode) {\n          element.append(placeholder);\n        }\n\n        if (event.target != listNode) {\n          // Try to find the node direct directly below the list node.\n          var listItemNode = event.target;\n          while (listItemNode.parentNode != listNode && listItemNode.parentNode) {\n            listItemNode = listItemNode.parentNode;\n          }\n\n          if (listItemNode.parentNode == listNode && listItemNode != placeholderNode) {\n            // If the mouse pointer is in the upper half of the list item element,\n            // we position the placeholder before the list item, otherwise after it.\n            var rect = listItemNode.getBoundingClientRect();\n            if (listSettings.horizontal) {\n              var isFirstHalf = event.clientX < rect.left + rect.width / 2;\n            } else {\n              var isFirstHalf = event.clientY < rect.top + rect.height / 2;\n            }\n            listNode.insertBefore(placeholderNode,\n                isFirstHalf ? listItemNode : listItemNode.nextSibling);\n          }\n        }\n\n        // In IE we set a fake effectAllowed in dragstart to get the correct cursor, we therefore\n        // ignore the effectAllowed passed in dataTransfer. We must also not access dataTransfer for\n        // drops from external sources, as that throws an exception.\n        var ignoreDataTransfer = mimeType == MSIE_MIME_TYPE;\n        var dropEffect = getDropEffect(event, ignoreDataTransfer);\n        if (dropEffect == 'none') return stopDragover();\n\n        // At this point we invoke the callback, which still can disallow the drop.\n        // We can't do this earlier because we want to pass the index of the placeholder.\n        if (attr.dndDragover && !invokeCallback(attr.dndDragover, event, dropEffect, itemType)) {\n          return stopDragover();\n        }\n\n        // Set dropEffect to modify the cursor shown by the browser, unless we're in IE, where this\n        // is not supported. This must be done after preventDefault in Firefox.\n        event.preventDefault();\n        if (!ignoreDataTransfer) {\n          event.dataTransfer.dropEffect = dropEffect;\n        }\n\n        element.addClass(\"dndDragover\");\n        event.stopPropagation();\n        return false;\n      });\n\n      /**\n       * When the element is dropped, we use the position of the placeholder element as the\n       * position where we insert the transferred data. This assumes that the list has exactly\n       * one child element per array element.\n       */\n      element.on('drop', function(event) {\n        event = event.originalEvent || event;\n\n        // Check whether the drop is allowed and determine mime type.\n        var mimeType = getMimeType(event.dataTransfer.types);\n        var itemType = getItemType(mimeType);\n        if (!mimeType || !isDropAllowed(itemType)) return true;\n\n        // The default behavior in Firefox is to interpret the dropped element as URL and\n        // forward to it. We want to prevent that even if our drop is aborted.\n        event.preventDefault();\n\n        // Unserialize the data that was serialized in dragstart.\n        try {\n          var data = JSON.parse(event.dataTransfer.getData(mimeType));\n        } catch(e) {\n          return stopDragover();\n        }\n\n        // Drops with invalid types from external sources might not have been filtered out yet.\n        if (mimeType == MSIE_MIME_TYPE || mimeType == EDGE_MIME_TYPE) {\n          itemType = data.type || undefined;\n          data = data.item;\n          if (!isDropAllowed(itemType)) return stopDragover();\n        }\n\n        // Special handling for internal IE drops, see dragover handler.\n        var ignoreDataTransfer = mimeType == MSIE_MIME_TYPE;\n        var dropEffect = getDropEffect(event, ignoreDataTransfer);\n        if (dropEffect == 'none') return stopDragover();\n\n        // Invoke the callback, which can transform the transferredObject and even abort the drop.\n        var index = getPlaceholderIndex();\n        if (attr.dndDrop) {\n          data = invokeCallback(attr.dndDrop, event, dropEffect, itemType, index, data);\n          if (!data) return stopDragover();\n        }\n\n        // The drop is definitely going to happen now, store the dropEffect.\n        dndState.dropEffect = dropEffect;\n        if (!ignoreDataTransfer) {\n          event.dataTransfer.dropEffect = dropEffect;\n        }\n\n        // Insert the object into the array, unless dnd-drop took care of that (returned true).\n        if (data !== true) {\n          scope.$apply(function() {\n            scope.$eval(attr.dndList).splice(index, 0, data);\n          });\n        }\n        invokeCallback(attr.dndInserted, event, dropEffect, itemType, index, data);\n\n        // Clean up\n        stopDragover();\n        event.stopPropagation();\n        return false;\n      });\n\n      /**\n       * We have to remove the placeholder when the element is no longer dragged over our list. The\n       * problem is that the dragleave event is not only fired when the element leaves our list,\n       * but also when it leaves a child element. Therefore, we determine whether the mouse cursor\n       * is still pointing to an element inside the list or not.\n       */\n      element.on('dragleave', function(event) {\n        event = event.originalEvent || event;\n\n        var newTarget = document.elementFromPoint(event.clientX, event.clientY);\n        if (listNode.contains(newTarget) && !event._dndPhShown) {\n          // Signalize to potential parent lists that a placeholder is already shown.\n          event._dndPhShown = true;\n        } else {\n          stopDragover();\n        }\n      });\n\n      /**\n       * Given the types array from the DataTransfer object, returns the first valid mime type.\n       * A type is valid if it starts with MIME_TYPE, or it equals MSIE_MIME_TYPE or EDGE_MIME_TYPE.\n       */\n      function getMimeType(types) {\n        if (!types) return MSIE_MIME_TYPE; // IE 9 workaround.\n        for (var i = 0; i < types.length; i++) {\n          if (types[i] == MSIE_MIME_TYPE || types[i] == EDGE_MIME_TYPE ||\n              types[i].substr(0, MIME_TYPE.length) == MIME_TYPE) {\n            return types[i];\n          }\n        }\n        return null;\n      }\n\n      /**\n       * Determines the type of the item from the dndState, or from the mime type for items from\n       * external sources. Returns undefined if no item type was set and null if the item type could\n       * not be determined.\n       */\n      function getItemType(mimeType) {\n        if (dndState.isDragging) return dndState.itemType || undefined;\n        if (mimeType == MSIE_MIME_TYPE || mimeType == EDGE_MIME_TYPE) return null;\n        return (mimeType && mimeType.substr(MIME_TYPE.length + 1)) || undefined;\n      }\n\n      /**\n       * Checks various conditions that must be fulfilled for a drop to be allowed, including the\n       * dnd-allowed-types attribute. If the item Type is unknown (null), the drop will be allowed.\n       */\n      function isDropAllowed(itemType) {\n        if (listSettings.disabled) return false;\n        if (!listSettings.externalSources && !dndState.isDragging) return false;\n        if (!listSettings.allowedTypes || itemType === null) return true;\n        return itemType && listSettings.allowedTypes.indexOf(itemType) != -1;\n      }\n\n      /**\n       * Determines which drop effect to use for the given event. In Internet Explorer we have to\n       * ignore the effectAllowed field on dataTransfer, since we set a fake value in dragstart.\n       * In those cases we rely on dndState to filter effects. Read the design doc for more details:\n       * https://github.com/marceljuenemann/angular-drag-and-drop-lists/wiki/Data-Transfer-Design\n       */\n      function getDropEffect(event, ignoreDataTransfer) {\n        var effects = ALL_EFFECTS;\n        if (!ignoreDataTransfer) {\n          effects = filterEffects(effects, event.dataTransfer.effectAllowed);\n        }\n        if (dndState.isDragging) {\n          effects = filterEffects(effects, dndState.effectAllowed);\n        }\n        if (attr.dndEffectAllowed) {\n          effects = filterEffects(effects, attr.dndEffectAllowed);\n        }\n        // MacOS automatically filters dataTransfer.effectAllowed depending on the modifier keys,\n        // therefore the following modifier keys will only affect other operating systems.\n        if (!effects.length) {\n          return 'none';\n        } else if (event.ctrlKey && effects.indexOf('copy') != -1) {\n          return 'copy';\n        } else if (event.altKey && effects.indexOf('link') != -1) {\n          return 'link';\n        } else {\n          return effects[0];\n        }\n      }\n\n      /**\n       * Small helper function that cleans up if we aborted a drop.\n       */\n      function stopDragover() {\n        placeholder.remove();\n        element.removeClass(\"dndDragover\");\n        return true;\n      }\n\n      /**\n       * Invokes a callback with some interesting parameters and returns the callbacks return value.\n       */\n      function invokeCallback(expression, event, dropEffect, itemType, index, item) {\n        return $parse(expression)(scope, {\n          callback: dndState.callback,\n          dropEffect: dropEffect,\n          event: event,\n          external: !dndState.isDragging,\n          index: index !== undefined ? index : getPlaceholderIndex(),\n          item: item || undefined,\n          type: itemType\n        });\n      }\n\n      /**\n       * We use the position of the placeholder node to determine at which position of the array the\n       * object needs to be inserted\n       */\n      function getPlaceholderIndex() {\n        return Array.prototype.indexOf.call(listNode.children, placeholderNode);\n      }\n\n      /**\n       * Tries to find a child element that has the dndPlaceholder class set. If none was found, a\n       * new li element is created.\n       */\n      function getPlaceholderElement() {\n        var placeholder;\n        angular.forEach(element.children(), function(childNode) {\n          var child = angular.element(childNode);\n          if (child.hasClass('dndPlaceholder')) {\n            placeholder = child;\n          }\n        });\n        return placeholder || angular.element(\"<li class='dndPlaceholder'></li>\");\n      }\n    };\n  }]);\n\n  /**\n   * Use the dnd-nodrag attribute inside of dnd-draggable elements to prevent them from starting\n   * drag operations. This is especially useful if you want to use input elements inside of\n   * dnd-draggable elements or create specific handle elements. Note: This directive does not work\n   * in Internet Explorer 9.\n   */\n  dndLists.directive('dndNodrag', function() {\n    return function(scope, element, attr) {\n      // Set as draggable so that we can cancel the events explicitly\n      element.attr(\"draggable\", \"true\");\n\n      /**\n       * Since the element is draggable, the browser's default operation is to drag it on dragstart.\n       * We will prevent that and also stop the event from bubbling up.\n       */\n      element.on('dragstart', function(event) {\n        event = event.originalEvent || event;\n\n        if (!event._dndHandle) {\n          // If a child element already reacted to dragstart and set a dataTransfer object, we will\n          // allow that. For example, this is the case for user selections inside of input elements.\n          if (!(event.dataTransfer.types && event.dataTransfer.types.length)) {\n            event.preventDefault();\n          }\n          event.stopPropagation();\n        }\n      });\n\n      /**\n       * Stop propagation of dragend events, otherwise dnd-moved might be triggered and the element\n       * would be removed.\n       */\n      element.on('dragend', function(event) {\n        event = event.originalEvent || event;\n        if (!event._dndHandle) {\n          event.stopPropagation();\n        }\n      });\n    };\n  });\n\n  /**\n   * Use the dnd-handle directive within a dnd-nodrag element in order to allow dragging with that\n   * element after all. Therefore, by combining dnd-nodrag and dnd-handle you can allow\n   * dnd-draggable elements to only be dragged via specific \"handle\" elements. Note that Internet\n   * Explorer will show the handle element as drag image instead of the dnd-draggable element. You\n   * can work around this by styling the handle element differently when it is being dragged. Use\n   * the CSS selector .dndDragging:not(.dndDraggingSource) [dnd-handle] for that.\n   */\n  dndLists.directive('dndHandle', function() {\n    return function(scope, element, attr) {\n      element.attr(\"draggable\", \"true\");\n\n      element.on('dragstart dragend', function(event) {\n        event = event.originalEvent || event;\n        event._dndHandle = true;\n      });\n    };\n  });\n\n  /**\n   * Filters an array of drop effects using a HTML5 effectAllowed string.\n   */\n  function filterEffects(effects, effectAllowed) {\n    if (effectAllowed == 'all') return effects;\n    return effects.filter(function(effect) {\n      return effectAllowed.toLowerCase().indexOf(effect) != -1;\n    });\n  }\n\n  /**\n   * For some features we need to maintain global state. This is done here, with these fields:\n   * - callback: A callback function set at dragstart that is passed to internal dropzone handlers.\n   * - dropEffect: Set in dragstart to \"none\" and to the actual value in the drop handler. We don't\n   *   rely on the dropEffect passed by the browser, since there are various bugs in Chrome and\n   *   Safari, and Internet Explorer defaults to copy if effectAllowed is copyMove.\n   * - effectAllowed: Set in dragstart based on dnd-effect-allowed. This is needed for IE because\n   *   setting effectAllowed on dataTransfer might result in an undesired cursor.\n   * - isDragging: True between dragstart and dragend. Falsy for drops from external sources.\n   * - itemType: The item type of the dragged element set via dnd-type. This is needed because IE\n   *   and Edge don't support custom mime types that we can use to transfer this information.\n   */\n  var dndState = {};\n\n})(angular.module('dndLists', []));\n\n/**\n * @license AngularJS v1.5.11\n * (c) 2010-2017 Google, Inc. http://angularjs.org\n * License: MIT\n */\n(function(window, angular) {'use strict';\n\n/* global ngTouchClickDirectiveFactory: false */\n\n/**\n * @ngdoc module\n * @name ngTouch\n * @description\n *\n * # ngTouch\n *\n * The `ngTouch` module provides touch events and other helpers for touch-enabled devices.\n * The implementation is based on jQuery Mobile touch event handling\n * ([jquerymobile.com](http://jquerymobile.com/)).\n *\n *\n * See {@link ngTouch.$swipe `$swipe`} for usage.\n *\n * <div doc-module-components=\"ngTouch\"></div>\n *\n */\n\n// define ngTouch module\n/* global -ngTouch */\nvar ngTouch = angular.module('ngTouch', []);\n\nngTouch.provider('$touch', $TouchProvider);\n\nfunction nodeName_(element) {\n  return angular.lowercase(element.nodeName || (element[0] && element[0].nodeName));\n}\n\n/**\n * @ngdoc provider\n * @name $touchProvider\n *\n * @description\n * The `$touchProvider` allows enabling / disabling {@link ngTouch.ngClick ngTouch's ngClick directive}.\n */\n$TouchProvider.$inject = ['$provide', '$compileProvider'];\nfunction $TouchProvider($provide, $compileProvider) {\n\n  /**\n   * @ngdoc method\n   * @name  $touchProvider#ngClickOverrideEnabled\n   *\n   * @param {boolean=} enabled update the ngClickOverrideEnabled state if provided, otherwise just return the\n   * current ngClickOverrideEnabled state\n   * @returns {*} current value if used as getter or itself (chaining) if used as setter\n   *\n   * @kind function\n   *\n   * @description\n   * Call this method to enable/disable {@link ngTouch.ngClick ngTouch's ngClick directive}. If enabled,\n   * the default ngClick directive will be replaced by a version that eliminates the 300ms delay for\n   * click events on browser for touch-devices.\n   *\n   * The default is `false`.\n   *\n   */\n  var ngClickOverrideEnabled = false;\n  var ngClickDirectiveAdded = false;\n  // eslint-disable-next-line no-invalid-this\n  this.ngClickOverrideEnabled = function(enabled) {\n    if (angular.isDefined(enabled)) {\n\n      if (enabled && !ngClickDirectiveAdded) {\n        ngClickDirectiveAdded = true;\n\n        // Use this to identify the correct directive in the delegate\n        ngTouchClickDirectiveFactory.$$moduleName = 'ngTouch';\n        $compileProvider.directive('ngClick', ngTouchClickDirectiveFactory);\n\n        $provide.decorator('ngClickDirective', ['$delegate', function($delegate) {\n          if (ngClickOverrideEnabled) {\n            // drop the default ngClick directive\n            $delegate.shift();\n          } else {\n            // drop the ngTouch ngClick directive if the override has been re-disabled (because\n            // we cannot de-register added directives)\n            var i = $delegate.length - 1;\n            while (i >= 0) {\n              if ($delegate[i].$$moduleName === 'ngTouch') {\n                $delegate.splice(i, 1);\n                break;\n              }\n              i--;\n            }\n          }\n\n          return $delegate;\n        }]);\n      }\n\n      ngClickOverrideEnabled = enabled;\n      return this;\n    }\n\n    return ngClickOverrideEnabled;\n  };\n\n  /**\n  * @ngdoc service\n  * @name $touch\n  * @kind object\n  *\n  * @description\n  * Provides the {@link ngTouch.$touch#ngClickOverrideEnabled `ngClickOverrideEnabled`} method.\n  *\n  */\n  // eslint-disable-next-line no-invalid-this\n  this.$get = function() {\n    return {\n      /**\n       * @ngdoc method\n       * @name  $touch#ngClickOverrideEnabled\n       *\n       * @returns {*} current value of `ngClickOverrideEnabled` set in the {@link ngTouch.$touchProvider $touchProvider},\n       * i.e. if {@link ngTouch.ngClick ngTouch's ngClick} directive is enabled.\n       *\n       * @kind function\n       */\n      ngClickOverrideEnabled: function() {\n        return ngClickOverrideEnabled;\n      }\n    };\n  };\n\n}\n\n/* global ngTouch: false */\n\n    /**\n     * @ngdoc service\n     * @name $swipe\n     *\n     * @description\n     * The `$swipe` service is a service that abstracts the messier details of hold-and-drag swipe\n     * behavior, to make implementing swipe-related directives more convenient.\n     *\n     * Requires the {@link ngTouch `ngTouch`} module to be installed.\n     *\n     * `$swipe` is used by the `ngSwipeLeft` and `ngSwipeRight` directives in `ngTouch`.\n     *\n     * # Usage\n     * The `$swipe` service is an object with a single method: `bind`. `bind` takes an element\n     * which is to be watched for swipes, and an object with four handler functions. See the\n     * documentation for `bind` below.\n     */\n\nngTouch.factory('$swipe', [function() {\n  // The total distance in any direction before we make the call on swipe vs. scroll.\n  var MOVE_BUFFER_RADIUS = 10;\n\n  var POINTER_EVENTS = {\n    'mouse': {\n      start: 'mousedown',\n      move: 'mousemove',\n      end: 'mouseup'\n    },\n    'touch': {\n      start: 'touchstart',\n      move: 'touchmove',\n      end: 'touchend',\n      cancel: 'touchcancel'\n    },\n    'pointer': {\n      start: 'pointerdown',\n      move: 'pointermove',\n      end: 'pointerup',\n      cancel: 'pointercancel'\n    }\n  };\n\n  function getCoordinates(event) {\n    var originalEvent = event.originalEvent || event;\n    var touches = originalEvent.touches && originalEvent.touches.length ? originalEvent.touches : [originalEvent];\n    var e = (originalEvent.changedTouches && originalEvent.changedTouches[0]) || touches[0];\n\n    return {\n      x: e.clientX,\n      y: e.clientY\n    };\n  }\n\n  function getEvents(pointerTypes, eventType) {\n    var res = [];\n    angular.forEach(pointerTypes, function(pointerType) {\n      var eventName = POINTER_EVENTS[pointerType][eventType];\n      if (eventName) {\n        res.push(eventName);\n      }\n    });\n    return res.join(' ');\n  }\n\n  return {\n    /**\n     * @ngdoc method\n     * @name $swipe#bind\n     *\n     * @description\n     * The main method of `$swipe`. It takes an element to be watched for swipe motions, and an\n     * object containing event handlers.\n     * The pointer types that should be used can be specified via the optional\n     * third argument, which is an array of strings `'mouse'`, `'touch'` and `'pointer'`. By default,\n     * `$swipe` will listen for `mouse`, `touch` and `pointer` events.\n     *\n     * The four events are `start`, `move`, `end`, and `cancel`. `start`, `move`, and `end`\n     * receive as a parameter a coordinates object of the form `{ x: 150, y: 310 }` and the raw\n     * `event`. `cancel` receives the raw `event` as its single parameter.\n     *\n     * `start` is called on either `mousedown`, `touchstart` or `pointerdown`. After this event, `$swipe` is\n     * watching for `touchmove`, `mousemove` or `pointermove` events. These events are ignored until the total\n     * distance moved in either dimension exceeds a small threshold.\n     *\n     * Once this threshold is exceeded, either the horizontal or vertical delta is greater.\n     * - If the horizontal distance is greater, this is a swipe and `move` and `end` events follow.\n     * - If the vertical distance is greater, this is a scroll, and we let the browser take over.\n     *   A `cancel` event is sent.\n     *\n     * `move` is called on `mousemove`, `touchmove` and `pointermove` after the above logic has determined that\n     * a swipe is in progress.\n     *\n     * `end` is called when a swipe is successfully completed with a `touchend`, `mouseup` or `pointerup`.\n     *\n     * `cancel` is called either on a `touchcancel` or `pointercancel`  from the browser, or when we begin scrolling\n     * as described above.\n     *\n     */\n    bind: function(element, eventHandlers, pointerTypes) {\n      // Absolute total movement, used to control swipe vs. scroll.\n      var totalX, totalY;\n      // Coordinates of the start position.\n      var startCoords;\n      // Last event's position.\n      var lastPos;\n      // Whether a swipe is active.\n      var active = false;\n\n      pointerTypes = pointerTypes || ['mouse', 'touch', 'pointer'];\n      element.on(getEvents(pointerTypes, 'start'), function(event) {\n        startCoords = getCoordinates(event);\n        active = true;\n        totalX = 0;\n        totalY = 0;\n        lastPos = startCoords;\n        if (eventHandlers['start']) {\n          eventHandlers['start'](startCoords, event);\n        }\n      });\n      var events = getEvents(pointerTypes, 'cancel');\n      if (events) {\n        element.on(events, function(event) {\n          active = false;\n          if (eventHandlers['cancel']) {\n            eventHandlers['cancel'](event);\n          }\n        });\n      }\n\n      element.on(getEvents(pointerTypes, 'move'), function(event) {\n        if (!active) return;\n\n        // Android will send a touchcancel if it thinks we're starting to scroll.\n        // So when the total distance (+ or - or both) exceeds 10px in either direction,\n        // we either:\n        // - On totalX > totalY, we send preventDefault() and treat this as a swipe.\n        // - On totalY > totalX, we let the browser handle it as a scroll.\n\n        if (!startCoords) return;\n        var coords = getCoordinates(event);\n\n        totalX += Math.abs(coords.x - lastPos.x);\n        totalY += Math.abs(coords.y - lastPos.y);\n\n        lastPos = coords;\n\n        if (totalX < MOVE_BUFFER_RADIUS && totalY < MOVE_BUFFER_RADIUS) {\n          return;\n        }\n\n        // One of totalX or totalY has exceeded the buffer, so decide on swipe vs. scroll.\n        if (totalY > totalX) {\n          // Allow native scrolling to take over.\n          active = false;\n          if (eventHandlers['cancel']) {\n            eventHandlers['cancel'](event);\n          }\n          return;\n        } else {\n          // Prevent the browser from scrolling.\n          event.preventDefault();\n          if (eventHandlers['move']) {\n            eventHandlers['move'](coords, event);\n          }\n        }\n      });\n\n      element.on(getEvents(pointerTypes, 'end'), function(event) {\n        if (!active) return;\n        active = false;\n        if (eventHandlers['end']) {\n          eventHandlers['end'](getCoordinates(event), event);\n        }\n      });\n    }\n  };\n}]);\n\n/* global ngTouch: false,\n  nodeName_: false\n*/\n\n/**\n * @ngdoc directive\n * @name ngClick\n * @deprecated\n * sinceVersion=\"v1.5.0\"\n * This directive is deprecated and **disabled** by default.\n * The directive will receive no further support and might be removed from future releases.\n * If you need the directive, you can enable it with the {@link ngTouch.$touchProvider $touchProvider#ngClickOverrideEnabled}\n * function. We also recommend that you migrate to [FastClick](https://github.com/ftlabs/fastclick).\n * To learn more about the 300ms delay, this [Telerik article](http://developer.telerik.com/featured/300-ms-click-delay-ios-8/)\n * gives a good overview.\n *\n * @description\n * A more powerful replacement for the default ngClick designed to be used on touchscreen\n * devices. Most mobile browsers wait about 300ms after a tap-and-release before sending\n * the click event. This version handles them immediately, and then prevents the\n * following click event from propagating.\n *\n * Requires the {@link ngTouch `ngTouch`} module to be installed.\n *\n * This directive can fall back to using an ordinary click event, and so works on desktop\n * browsers as well as mobile.\n *\n * This directive also sets the CSS class `ng-click-active` while the element is being held\n * down (by a mouse click or touch) so you can restyle the depressed element if you wish.\n *\n * @element ANY\n * @param {expression} ngClick {@link guide/expression Expression} to evaluate\n * upon tap. (Event object is available as `$event`)\n *\n * @example\n    <example module=\"ngClickExample\" deps=\"angular-touch.js\" name=\"ng-touch-ng-click\">\n      <file name=\"index.ced81ed4.html\">\n        <button ng-click=\"count = count + 1\" ng-init=\"count=0\">\n          Increment\n        </button>\n        count: {{ count }}\n      </file>\n      <file name=\"script.js\">\n        angular.module('ngClickExample', ['ngTouch']);\n      </file>\n    </example>\n */\n\nvar ngTouchClickDirectiveFactory = ['$parse', '$timeout', '$rootElement',\n    function($parse, $timeout, $rootElement) {\n  var TAP_DURATION = 750; // Shorter than 750ms is a tap, longer is a taphold or drag.\n  var MOVE_TOLERANCE = 12; // 12px seems to work in most mobile browsers.\n  var PREVENT_DURATION = 2500; // 2.5 seconds maximum from preventGhostClick call to click\n  var CLICKBUSTER_THRESHOLD = 25; // 25 pixels in any dimension is the limit for busting clicks.\n\n  var ACTIVE_CLASS_NAME = 'ng-click-active';\n  var lastPreventedTime;\n  var touchCoordinates;\n  var lastLabelClickCoordinates;\n\n\n  // TAP EVENTS AND GHOST CLICKS\n  //\n  // Why tap events?\n  // Mobile browsers detect a tap, then wait a moment (usually ~300ms) to see if you're\n  // double-tapping, and then fire a click event.\n  //\n  // This delay sucks and makes mobile apps feel unresponsive.\n  // So we detect touchstart, touchcancel and touchend ourselves and determine when\n  // the user has tapped on something.\n  //\n  // What happens when the browser then generates a click event?\n  // The browser, of course, also detects the tap and fires a click after a delay. This results in\n  // tapping/clicking twice. We do \"clickbusting\" to prevent it.\n  //\n  // How does it work?\n  // We attach global touchstart and click handlers, that run during the capture (early) phase.\n  // So the sequence for a tap is:\n  // - global touchstart: Sets an \"allowable region\" at the point touched.\n  // - element's touchstart: Starts a touch\n  // (- touchcancel ends the touch, no click follows)\n  // - element's touchend: Determines if the tap is valid (didn't move too far away, didn't hold\n  //   too long) and fires the user's tap handler. The touchend also calls preventGhostClick().\n  // - preventGhostClick() removes the allowable region the global touchstart created.\n  // - The browser generates a click event.\n  // - The global click handler catches the click, and checks whether it was in an allowable region.\n  //     - If preventGhostClick was called, the region will have been removed, the click is busted.\n  //     - If the region is still there, the click proceeds normally. Therefore clicks on links and\n  //       other elements without ngTap on them work normally.\n  //\n  // This is an ugly, terrible hack!\n  // Yeah, tell me about it. The alternatives are using the slow click events, or making our users\n  // deal with the ghost clicks, so I consider this the least of evils. Fortunately Angular\n  // encapsulates this ugly logic away from the user.\n  //\n  // Why not just put click handlers on the element?\n  // We do that too, just to be sure. If the tap event caused the DOM to change,\n  // it is possible another element is now in that position. To take account for these possibly\n  // distinct elements, the handlers are global and care only about coordinates.\n\n  // Checks if the coordinates are close enough to be within the region.\n  function hit(x1, y1, x2, y2) {\n    return Math.abs(x1 - x2) < CLICKBUSTER_THRESHOLD && Math.abs(y1 - y2) < CLICKBUSTER_THRESHOLD;\n  }\n\n  // Checks a list of allowable regions against a click location.\n  // Returns true if the click should be allowed.\n  // Splices out the allowable region from the list after it has been used.\n  function checkAllowableRegions(touchCoordinates, x, y) {\n    for (var i = 0; i < touchCoordinates.length; i += 2) {\n      if (hit(touchCoordinates[i], touchCoordinates[i + 1], x, y)) {\n        touchCoordinates.splice(i, i + 2);\n        return true; // allowable region\n      }\n    }\n    return false; // No allowable region; bust it.\n  }\n\n  // Global click handler that prevents the click if it's in a bustable zone and preventGhostClick\n  // was called recently.\n  function onClick(event) {\n    if (Date.now() - lastPreventedTime > PREVENT_DURATION) {\n      return; // Too old.\n    }\n\n    var touches = event.touches && event.touches.length ? event.touches : [event];\n    var x = touches[0].clientX;\n    var y = touches[0].clientY;\n    // Work around desktop Webkit quirk where clicking a label will fire two clicks (on the label\n    // and on the input element). Depending on the exact browser, this second click we don't want\n    // to bust has either (0,0), negative coordinates, or coordinates equal to triggering label\n    // click event\n    if (x < 1 && y < 1) {\n      return; // offscreen\n    }\n    if (lastLabelClickCoordinates &&\n        lastLabelClickCoordinates[0] === x && lastLabelClickCoordinates[1] === y) {\n      return; // input click triggered by label click\n    }\n    // reset label click coordinates on first subsequent click\n    if (lastLabelClickCoordinates) {\n      lastLabelClickCoordinates = null;\n    }\n    // remember label click coordinates to prevent click busting of trigger click event on input\n    if (nodeName_(event.target) === 'label') {\n      lastLabelClickCoordinates = [x, y];\n    }\n\n    // Look for an allowable region containing this click.\n    // If we find one, that means it was created by touchstart and not removed by\n    // preventGhostClick, so we don't bust it.\n    if (checkAllowableRegions(touchCoordinates, x, y)) {\n      return;\n    }\n\n    // If we didn't find an allowable region, bust the click.\n    event.stopPropagation();\n    event.preventDefault();\n\n    // Blur focused form elements\n    if (event.target && event.target.blur) {\n      event.target.blur();\n    }\n  }\n\n\n  // Global touchstart handler that creates an allowable region for a click event.\n  // This allowable region can be removed by preventGhostClick if we want to bust it.\n  function onTouchStart(event) {\n    var touches = event.touches && event.touches.length ? event.touches : [event];\n    var x = touches[0].clientX;\n    var y = touches[0].clientY;\n    touchCoordinates.push(x, y);\n\n    $timeout(function() {\n      // Remove the allowable region.\n      for (var i = 0; i < touchCoordinates.length; i += 2) {\n        if (touchCoordinates[i] === x && touchCoordinates[i + 1] === y) {\n          touchCoordinates.splice(i, i + 2);\n          return;\n        }\n      }\n    }, PREVENT_DURATION, false);\n  }\n\n  // On the first call, attaches some event handlers. Then whenever it gets called, it creates a\n  // zone around the touchstart where clicks will get busted.\n  function preventGhostClick(x, y) {\n    if (!touchCoordinates) {\n      $rootElement[0].addEventListener('click', onClick, true);\n      $rootElement[0].addEventListener('touchstart', onTouchStart, true);\n      touchCoordinates = [];\n    }\n\n    lastPreventedTime = Date.now();\n\n    checkAllowableRegions(touchCoordinates, x, y);\n  }\n\n  // Actual linking function.\n  return function(scope, element, attr) {\n    var clickHandler = $parse(attr.ngClick),\n        tapping = false,\n        tapElement,  // Used to blur the element after a tap.\n        startTime,   // Used to check if the tap was held too long.\n        touchStartX,\n        touchStartY;\n\n    function resetState() {\n      tapping = false;\n      element.removeClass(ACTIVE_CLASS_NAME);\n    }\n\n    element.on('touchstart', function(event) {\n      tapping = true;\n      tapElement = event.target ? event.target : event.srcElement; // IE uses srcElement.\n      // Hack for Safari, which can target text nodes instead of containers.\n      if (tapElement.nodeType === 3) {\n        tapElement = tapElement.parentNode;\n      }\n\n      element.addClass(ACTIVE_CLASS_NAME);\n\n      startTime = Date.now();\n\n      // Use jQuery originalEvent\n      var originalEvent = event.originalEvent || event;\n      var touches = originalEvent.touches && originalEvent.touches.length ? originalEvent.touches : [originalEvent];\n      var e = touches[0];\n      touchStartX = e.clientX;\n      touchStartY = e.clientY;\n    });\n\n    element.on('touchcancel', function(event) {\n      resetState();\n    });\n\n    element.on('touchend', function(event) {\n      var diff = Date.now() - startTime;\n\n      // Use jQuery originalEvent\n      var originalEvent = event.originalEvent || event;\n      var touches = (originalEvent.changedTouches && originalEvent.changedTouches.length) ?\n          originalEvent.changedTouches :\n          ((originalEvent.touches && originalEvent.touches.length) ? originalEvent.touches : [originalEvent]);\n      var e = touches[0];\n      var x = e.clientX;\n      var y = e.clientY;\n      var dist = Math.sqrt(Math.pow(x - touchStartX, 2) + Math.pow(y - touchStartY, 2));\n\n      if (tapping && diff < TAP_DURATION && dist < MOVE_TOLERANCE) {\n        // Call preventGhostClick so the clickbuster will catch the corresponding click.\n        preventGhostClick(x, y);\n\n        // Blur the focused element (the button, probably) before firing the callback.\n        // This doesn't work perfectly on Android Chrome, but seems to work elsewhere.\n        // I couldn't get anything to work reliably on Android Chrome.\n        if (tapElement) {\n          tapElement.blur();\n        }\n\n        if (!angular.isDefined(attr.disabled) || attr.disabled === false) {\n          element.triggerHandler('click', [event]);\n        }\n      }\n\n      resetState();\n    });\n\n    // Hack for iOS Safari's benefit. It goes searching for onclick handlers and is liable to click\n    // something else nearby.\n    element.onclick = function(event) { };\n\n    // Actual click handler.\n    // There are three different kinds of clicks, only two of which reach this point.\n    // - On desktop browsers without touch events, their clicks will always come here.\n    // - On mobile browsers, the simulated \"fast\" click will call this.\n    // - But the browser's follow-up slow click will be \"busted\" before it reaches this handler.\n    // Therefore it's safe to use this directive on both mobile and desktop.\n    element.on('click', function(event, touchend) {\n      scope.$apply(function() {\n        clickHandler(scope, {$event: (touchend || event)});\n      });\n    });\n\n    element.on('mousedown', function(event) {\n      element.addClass(ACTIVE_CLASS_NAME);\n    });\n\n    element.on('mousemove mouseup', function(event) {\n      element.removeClass(ACTIVE_CLASS_NAME);\n    });\n\n  };\n}];\n\n/* global ngTouch: false */\n\n/**\n * @ngdoc directive\n * @name ngSwipeLeft\n *\n * @description\n * Specify custom behavior when an element is swiped to the left on a touchscreen device.\n * A leftward swipe is a quick, right-to-left slide of the finger.\n * Though ngSwipeLeft is designed for touch-based devices, it will work with a mouse click and drag\n * too.\n *\n * To disable the mouse click and drag functionality, add `ng-swipe-disable-mouse` to\n * the `ng-swipe-left` or `ng-swipe-right` DOM Element.\n *\n * Requires the {@link ngTouch `ngTouch`} module to be installed.\n *\n * @element ANY\n * @param {expression} ngSwipeLeft {@link guide/expression Expression} to evaluate\n * upon left swipe. (Event object is available as `$event`)\n *\n * @example\n    <example module=\"ngSwipeLeftExample\" deps=\"angular-touch.js\" name=\"ng-swipe-left\">\n      <file name=\"index.ced81ed4.html\">\n        <div ng-show=\"!showActions\" ng-swipe-left=\"showActions = true\">\n          Some list content, like an email in the inbox\n        </div>\n        <div ng-show=\"showActions\" ng-swipe-right=\"showActions = false\">\n          <button ng-click=\"reply()\">Reply</button>\n          <button ng-click=\"delete()\">Delete</button>\n        </div>\n      </file>\n      <file name=\"script.js\">\n        angular.module('ngSwipeLeftExample', ['ngTouch']);\n      </file>\n    </example>\n */\n\n/**\n * @ngdoc directive\n * @name ngSwipeRight\n *\n * @description\n * Specify custom behavior when an element is swiped to the right on a touchscreen device.\n * A rightward swipe is a quick, left-to-right slide of the finger.\n * Though ngSwipeRight is designed for touch-based devices, it will work with a mouse click and drag\n * too.\n *\n * Requires the {@link ngTouch `ngTouch`} module to be installed.\n *\n * @element ANY\n * @param {expression} ngSwipeRight {@link guide/expression Expression} to evaluate\n * upon right swipe. (Event object is available as `$event`)\n *\n * @example\n    <example module=\"ngSwipeRightExample\" deps=\"angular-touch.js\" name=\"ng-swipe-right\">\n      <file name=\"index.ced81ed4.html\">\n        <div ng-show=\"!showActions\" ng-swipe-left=\"showActions = true\">\n          Some list content, like an email in the inbox\n        </div>\n        <div ng-show=\"showActions\" ng-swipe-right=\"showActions = false\">\n          <button ng-click=\"reply()\">Reply</button>\n          <button ng-click=\"delete()\">Delete</button>\n        </div>\n      </file>\n      <file name=\"script.js\">\n        angular.module('ngSwipeRightExample', ['ngTouch']);\n      </file>\n    </example>\n */\n\nfunction makeSwipeDirective(directiveName, direction, eventName) {\n  ngTouch.directive(directiveName, ['$parse', '$swipe', function($parse, $swipe) {\n    // The maximum vertical delta for a swipe should be less than 75px.\n    var MAX_VERTICAL_DISTANCE = 75;\n    // Vertical distance should not be more than a fraction of the horizontal distance.\n    var MAX_VERTICAL_RATIO = 0.3;\n    // At least a 30px lateral motion is necessary for a swipe.\n    var MIN_HORIZONTAL_DISTANCE = 30;\n\n    return function(scope, element, attr) {\n      var swipeHandler = $parse(attr[directiveName]);\n\n      var startCoords, valid;\n\n      function validSwipe(coords) {\n        // Check that it's within the coordinates.\n        // Absolute vertical distance must be within tolerances.\n        // Horizontal distance, we take the current X - the starting X.\n        // This is negative for leftward swipes and positive for rightward swipes.\n        // After multiplying by the direction (-1 for left, +1 for right), legal swipes\n        // (ie. same direction as the directive wants) will have a positive delta and\n        // illegal ones a negative delta.\n        // Therefore this delta must be positive, and larger than the minimum.\n        if (!startCoords) return false;\n        var deltaY = Math.abs(coords.y - startCoords.y);\n        var deltaX = (coords.x - startCoords.x) * direction;\n        return valid && // Short circuit for already-invalidated swipes.\n            deltaY < MAX_VERTICAL_DISTANCE &&\n            deltaX > 0 &&\n            deltaX > MIN_HORIZONTAL_DISTANCE &&\n            deltaY / deltaX < MAX_VERTICAL_RATIO;\n      }\n\n      var pointerTypes = ['touch'];\n      if (!angular.isDefined(attr['ngSwipeDisableMouse'])) {\n        pointerTypes.push('mouse');\n      }\n      $swipe.bind(element, {\n        'start': function(coords, event) {\n          startCoords = coords;\n          valid = true;\n        },\n        'cancel': function(event) {\n          valid = false;\n        },\n        'end': function(coords, event) {\n          if (validSwipe(coords)) {\n            scope.$apply(function() {\n              element.triggerHandler(eventName);\n              swipeHandler(scope, {$event: event});\n            });\n          }\n        }\n      }, pointerTypes);\n    };\n  }]);\n}\n\n// Left is negative X-coordinate, right is positive.\nmakeSwipeDirective('ngSwipeLeft', -1, 'swipeleft');\nmakeSwipeDirective('ngSwipeRight', 1, 'swiperight');\n\n\n\n})(window, window.angular);\n\n(function ()\n{\n    'use strict';\n\n    imageOnLoadDirective.$inject = [\"$log\"];\n    wipImageZoomDirective.$inject = [\"$timeout\"];\n    angular\n        .module('wipImageZoom', ['ngSanitize', 'ngTouch'])\n        .provider('wipImageZoomConfig', wipImageZoomConfig)\n        .directive('imageOnLoad', imageOnLoadDirective)\n        .directive('wipImageZoom', wipImageZoomDirective)\n        .directive('wipImageZoomTracker', wipImageZoomTrackerDirective)\n        .directive('wipImageZoomLens', wipImageZoomLensDirective)\n        .directive('wipImageZoomMask', wipImageZoomMaskDirective)\n        .directive('wipImageZoomImage', wipImageZoomImageDirective)\n        .directive('wipImageZoomThumbs', wipImageZoomThumbsDirective);\n\n\n    function wipImageZoomConfig()\n    {\n        this.defaults = {\n            zoomEnable          : true,\n            defaultIndex        : 0, // Order of the default selected Image\n            /* You should give images in array with object properties\n             [{\n             thumb : 'assets/images/1-thumb.jpg',\n             medium: 'assets/images/1-medium.jpg',\n             large : 'assets/images/1-large.jpg'\n             }] */\n            images              : [],\n            style               : 'inner', // inner or box\n            boxPos              : 'right-top', // e.g., right-top, right-middle, right-bottom, top-center, top-left, top-right ...\n            boxW                : 400, // Box width\n            boxH                : 400, // Box height\n            method              : 'lens', // fallow 'lens' or 'pointer'\n            cursor              : 'crosshair', // 'none', 'default', 'crosshair', 'pointer', 'move'\n            lens                : true, // Lens toggle\n            zoomLevel           : 3, // 0: not scales, uses the original large image size, use 1 and above to adjust.\n            immersiveMode       : '769', // false or 0 for disable, always, max width(px) for trigger\n            immersiveModeOptions: {}, // can extend immersed mode options\n            immersiveModeMessage: 'Click to Zoom', // Immersive mode message\n            prevThumbButton     : '&#9665;', // Prev thumb button (html)\n            nextThumbButton     : '&#9655;', // Next thumb button (html)\n            thumbsPos           : 'bottom', // Thumbs position: 'top', 'bottom'\n            thumbCol            : 3, // Thumb column count\n            thumbColPadding     : 4 // Padding between thumbs\n        };\n\n        this.setDefaults = function (defaults)\n        {\n            this.defaults = angular.extend(this.defaults, defaults);\n        };\n\n        this.$get = function ()\n        {\n            return this;\n        };\n\n    }\n\n    function wipImageZoomDirective($timeout)\n    {\n        return {\n            restrict    : 'EA',\n            template    : '<div class=\"wip-image-zoom {{vm.options.style}}-style {{vm.options.thumbsPos}}-thumbs\"\\n     ng-class=\"{\\n     \\'active\\':vm.zoomActive, \\n     \\'immersive-mode\\':vm.immersiveModeActive && !immersive,\\n     \\'zoom-disabled\\':!vm.options.zoomEnable,\\n     \\'box-style\\':vm.options.style == \\'box\\' ,\\n     \\'inner-style\\':vm.options.style == \\'inner\\'}\">\\n\\n    <wip-image-zoom-thumbs ng-if=\"vm.options.thumbsPos === \\'top\\' && vm.images.length > 1\"></wip-image-zoom-thumbs>\\n\\n    <div ng-hide=\"!vm.options.zoomEnable && immersive\" class=\"main-image-wrapper\" ng-class=\"{\\'loading\\':vm.largeImageLoading}\">\\n        <div class=\"image-zoom-tracker\" wip-image-zoom-tracker></div>\\n        <div class=\"image-zoom-lens\" wip-image-zoom-lens></div>\\n        <img class=\"main-image\" ng-src=\"{{vm.mainImage.medium}}\" image-on-load=\"vm.initZoom()\">\\n        <div class=\"zoom-mask\"\\n             ng-class=\"vm.options.style == \\'box\\'? vm.options.boxPos : \\'\\'\"\\n             wip-image-zoom-mask>\\n            <img wip-image-zoom-image class=\"zoom-image main-image-large\" image-on-load=\"vm.largeImageLoaded()\"\\n                 ng-src=\"{{vm.mainImage.large}}\">\\n        </div>\\n        <div ng-if=\"vm.immersiveModeActive && !immersive && vm.options.immersiveModeMessage !== \\'\\'\"\\n             class=\"immersive-mode-message\" ng-bind=\"vm.options.immersiveModeMessage\"></div>\\n    </div>\\n\\n    <div class=\"immersive-no-zoom-image-wrapper\" ng-show=\"!vm.options.zoomEnable && immersive\">\\n        <img class=\"main-image-large\" ng-src=\"{{vm.mainImage.large}}\">\\n    </div>\\n\\n    <wip-image-zoom-thumbs\\n            ng-if=\"vm.options.thumbsPos === \\'bottom\\' && vm.images.length > 1\"></wip-image-zoom-thumbs>\\n</div>',\n            replace     : true,\n            scope       : {\n                selectedModel: '=?',\n                selectedIndex: '=?',\n                wipImageZoom : '=',\n                immersive    : '=?'\n            },\n            controllerAs: 'vm',\n            link        : function (scope, element, attrs, ctrl)\n            {\n                ctrl.el = element;\n                ctrl.attrs = attrs;\n                ctrl.init();\n            },\n            controller  : [\"$scope\", \"$document\", \"$window\", \"$compile\", \"wipImageZoomConfig\", function ($scope, $document, $window, $compile, wipImageZoomConfig)\n            {\n                var vm = this,\n                    evPosX, evPosY, trackerW, trackerH, trackerL, trackerT, maskW, maskH, zoomImgW, zoomImgH, lensW, lensH, lensPosX, lensPosY, zoomLevelRatio,\n                    defaultOpts = angular.copy(wipImageZoomConfig.defaults),\n                    updateTimeout = true;\n\n                vm.el = {};\n                vm.zoomTracker = {};\n                vm.zoomLens = {};\n                vm.zoomImageEl = {};\n                vm.thumbsWrapper = {};\n                vm.thumbsEl = {};\n                vm.mainImage = {};\n                vm.options = {};\n                vm.images = [];\n                vm.zoomActive = false;\n                vm.largeImageLoading = true;\n\n                vm.prevThumbActive = false;\n                vm.nextThumbActive = false;\n                vm.thumbWidth = 0;\n                vm.thumbsWrapperWidth = 0;\n                vm.thumbsWidth = 0;\n                vm.thumbsPos = 0;\n                vm.immersiveModeActive = false;\n\n                vm.init = init;\n                vm.initZoom = initZoom;\n                vm.initThumbs = initThumbs;\n                vm.largeImageLoaded = largeImageLoaded;\n\n                vm.updateMainImage = updateMainImage;\n                vm.nextThumb = nextThumb;\n                vm.prevThumb = prevThumb;\n                vm.disableImmersiveMode = disableImmersiveMode;\n\n                function init()\n                {\n                    vm.options = !$scope.wipImageZoom ? defaultOpts : angular.extend(defaultOpts, $scope.wipImageZoom);\n\n                    setImages();\n\n                    $scope.selectedIndex = vm.options.defaultIndex;\n                    $scope.selectedModel = vm.mainImage;\n                }\n\n                function setImages()\n                {\n                    if ( vm.options.images.length <= 0 )\n                    {\n                        vm.options.images = [\n                            {\n                                thumb : vm.attrs.src,\n                                medium: vm.attrs.src,\n                                large : vm.attrs.src\n                            }\n                        ];\n                    }\n\n                    vm.images = vm.options.images;\n                    vm.mainImage = vm.images[vm.options.defaultIndex];\n                }\n\n                function update()\n                {\n                    // Debounce for update\n                    if ( updateTimeout )\n                    {\n                        $timeout.cancel(updateTimeout);\n                    }\n\n                    updateTimeout = $timeout(function ()\n                    {\n                        initThumbs();\n                        initZoom();\n                        updateThumbsPos();\n                    }, 400);\n                }\n\n                function initZoom()\n                {\n                    if ( !vm.options.zoomEnable )\n                    {\n                        return;\n                    }\n\n                    initSizes();\n\n                    vm.zoomTracker.style.cursor = vm.options.cursor;\n\n                    if ( vm.options.lens )\n                    {\n                        vm.zoomLens.style.display = 'block';\n                    }\n                    else\n                    {\n                        vm.zoomLens.style.display = 'none';\n                    }\n\n                    // Reset Event Listeners\n                    removeEventListeners();\n\n                    vm.immersiveModeActive = vm.options.immersiveMode && vm.options.immersiveMode > $window.innerWidth || vm.options.immersiveMode === 'always';\n\n                    if ( vm.immersiveModeActive && !$scope.immersive )\n                    {\n                        vm.zoomTracker.addEventListener('mousedown', enableImmersiveMode);\n                    }\n\n                    if ( !vm.immersiveModeActive || $scope.immersive )\n                    {\n                        addEventListeners();\n                    }\n\n                }\n\n                function addEventListeners()\n                {\n                    vm.zoomTracker.addEventListener('mousemove', zoomStateEnable);\n                    vm.zoomTracker.addEventListener('touchstart', zoomStateEnable);\n\n                    vm.zoomTracker.addEventListener('mouseleave', zoomStateDisable);\n                    vm.zoomTracker.addEventListener('touchend', zoomStateDisable);\n\n                    vm.zoomTracker.addEventListener('mousemove', setZoomImagePosition);\n                    vm.zoomTracker.addEventListener('touchmove', setZoomImagePosition);\n                }\n\n                function removeEventListeners()\n                {\n                    vm.zoomTracker.removeEventListener('mousedown', enableImmersiveMode);\n\n                    vm.zoomTracker.removeEventListener('mousemove', zoomStateEnable);\n                    vm.zoomTracker.removeEventListener('touchstart', zoomStateEnable);\n\n                    vm.zoomTracker.removeEventListener('mouseleave', zoomStateDisable);\n                    vm.zoomTracker.removeEventListener('touchend', zoomStateDisable);\n\n                    vm.zoomTracker.removeEventListener('mousemove', setZoomImagePosition);\n                    vm.zoomTracker.removeEventListener('touchmove', setZoomImagePosition);\n                }\n\n                function disableImmersiveMode()\n                {\n                    $document.find('html').removeClass('wip-image-zoom-immersive-mode-enabled');\n                    removeEventListeners();\n                    vm.immersedEl.remove();\n                    update();\n                }\n\n                function enableImmersiveMode(ev)\n                {\n                    ev.preventDefault();\n                    ev.stopPropagation();\n                    $scope.$apply(function ()\n                    {\n                        $document.find('html').addClass('wip-image-zoom-immersive-mode-enabled');\n                        var body = $document.find('body').eq(0);\n                        vm.immersedImageOpt = angular.extend(angular.copy(vm.options), vm.options.immersiveModeOptions);\n                        vm.immersedImageOpt.defaultIndex = $scope.selectedIndex;\n                        vm.immersedImageOpt.style = 'inner';\n                        vm.immersedEl = $compile('<div class=\"immersive-wip-image-zoom\">\\n    <div class=\"disable-immersive-mode-button\" ng-click=\"vm.disableImmersiveMode()\">&#10006;</div>\\n    <img src=\"\" wip-image-zoom=\"vm.immersedImageOpt\" immersive=\"true\" selected-index=\"selectedIndex\">\\n</div>\\n')($scope);\n                        body.append(vm.immersedEl);\n                        update();\n                    });\n                }\n\n                function initThumbs()\n                {\n                    if ( vm.images.length <= 1 )\n                    {\n                        return;\n                    }\n                    vm.thumbsWrapperWidth = vm.thumbsWrapper.clientWidth;\n                    vm.thumbWidth = Math.round((vm.thumbsWrapperWidth + vm.options.thumbColPadding) / vm.options.thumbCol);\n                    vm.thumbsWidth = vm.thumbWidth * vm.images.length;\n                    vm.maxPosX = vm.images.length - vm.options.thumbCol;\n\n                    // Set Thumbnail width\n                    $scope.$evalAsync(function ()\n                    {\n                        if ( vm.options.thumbsPos === 'top' )\n                        {\n                            vm.thumbsEl.style.paddingBottom = vm.options.thumbColPadding + 'px';\n                            vm.thumbsEl.style.paddingTop = 0;\n                        }\n                        else\n                        {\n                            vm.thumbsEl.style.paddingTop = vm.options.thumbColPadding + 'px';\n                            vm.thumbsEl.style.paddingBottom = 0;\n                        }\n\n                        for ( var i = 0; i < vm.thumbsEl.children.length; i++ )\n                        {\n                            var thumb = vm.thumbsEl.children[i];\n                            thumb.style.width = vm.thumbWidth + 'px';\n                            thumb.style.paddingRight = vm.options.thumbColPadding + 'px';\n                        }\n                    });\n                }\n\n                function nextThumb()\n                {\n                    scrollThumbs(vm.thumbsPos + 1);\n                }\n\n                function prevThumb()\n                {\n                    scrollThumbs(vm.thumbsPos - 1);\n                }\n\n                function scrollThumbs(newPosX)\n                {\n                    newPosX = newPosX < 0 ? 0 : newPosX;\n                    newPosX = newPosX > vm.maxPosX ? vm.maxPosX : newPosX;\n                    vm.thumbsPos = newPosX;\n                    var scrollX = vm.thumbsPos * vm.thumbWidth * -1;\n                    vm.thumbsEl.style.transform = 'translate3d(' + scrollX + 'px, 0px, 0)';\n                }\n\n                function initSizes()\n                {\n                    var tracker = vm.zoomTracker.getBoundingClientRect();\n                    trackerW = tracker.width;\n                    trackerH = tracker.height;\n                    trackerL = tracker.left + $window.scrollX;\n                    trackerT = tracker.top + $window.scrollY;\n                    // Box Style\n                    if ( vm.options.style === 'box' && !$scope.immersive )\n                    {\n                        maskW = vm.options.boxW;\n                        maskH = vm.options.boxH;\n                        vm.zoomMaskEl.style.width = maskW + 'px';\n                        vm.zoomMaskEl.style.height = maskH + 'px';\n                    }\n                    // Inner Style\n                    else\n                    {\n                        maskW = trackerW;\n                        maskH = trackerH;\n                        vm.zoomMaskEl.style.width = '100%';\n                        vm.zoomMaskEl.style.height = '100%';\n                    }\n\n                    if ( vm.options.zoomLevel > 1 )\n                    {\n                        vm.zoomImageEl.style.width = trackerW * vm.options.zoomLevel + 'px';\n                        vm.zoomImageEl.style.height = trackerH * vm.options.zoomLevel + 'px';\n                    }\n\n                    zoomImgW = vm.zoomImageEl.offsetWidth;\n                    zoomImgH = vm.zoomImageEl.offsetHeight;\n\n                    setLensSize();\n\n                }\n\n                function setZoomImagePosition(e)\n                {\n                    e.preventDefault();\n                    var te = e.type === 'touchmove' && e.touches && e.touches[0];\n\n                    evPosX = te && te.pageX || e.pageX;\n                    evPosY = te && te.pageY || e.pageY;\n\n                    setLensPosition();\n\n                    if ( vm.options.method === 'lens' )\n                    {\n                        trackLens();\n                    }\n                    // pointer\n                    else\n                    {\n                        trackPointer();\n                    }\n\n                }\n\n                function trackLens()\n                {\n                    var posX = [(zoomImgW - maskW + lensW * 1 / zoomLevelRatio) * [(lensPosX / trackerW)]];\n                    var posY = [(zoomImgH - maskH + lensH * 1 / zoomLevelRatio) * [lensPosY / trackerH]];\n                    vm.zoomImageEl.style.transform = 'translate3d(' + posX * -1 + 'px,' + posY * -1 + 'px,0)';\n                }\n\n                function trackPointer()\n                {\n                    var posX = [(zoomImgW - maskW) * [(evPosX - trackerL) / trackerW]];\n                    var posY = [(zoomImgH - maskH) * [(evPosY - trackerT) / trackerH]];\n\n                    // Touch Fixes\n                    posX = evPosX < trackerL ? 0 : posX;\n                    posY = evPosY < trackerT ? 0 : posY;\n                    posX = evPosX > trackerL + trackerW ? (zoomImgW - maskW) : posX;\n                    posY = evPosY > trackerT + trackerH ? (zoomImgH - maskH) : posY;\n\n                    vm.zoomImageEl.style.transform = 'translate3d(' + posX * -1 + 'px,' + posY * -1 + 'px,0)';\n                }\n\n                function setLensSize()\n                {\n                    zoomLevelRatio = trackerW / zoomImgW;\n                    lensW = maskW * zoomLevelRatio;\n                    lensH = maskH * zoomLevelRatio;\n                    vm.zoomLens.style.width = lensW + 'px';\n                    vm.zoomLens.style.height = lensH + 'px';\n                }\n\n                function setLensPosition()\n                {\n                    lensPosX = (evPosX - trackerL) - lensW * 0.5;\n                    lensPosY = (evPosY - trackerT) - lensH * 0.5;\n\n                    lensPosX = lensPosX > (trackerW - lensW) ? trackerW - lensW : lensPosX;\n                    lensPosX = lensPosX < 0 ? 0 : lensPosX;\n\n                    lensPosY = lensPosY > (trackerH - lensH) ? trackerH - lensH : lensPosY;\n                    lensPosY = lensPosY < 0 ? 0 : lensPosY;\n\n                    vm.zoomLens.style.transform = 'translate3d(' + lensPosX + 'px,' + lensPosY + 'px,0)';\n                }\n\n                function updateThumbsPos()\n                {\n                    if ( vm.images.length <= 1 )\n                    {\n                        return;\n                    }\n                    var selectedIndex = getSelectedIndex();\n                    var isInView = vm.thumbsPos + vm.options.thumbCol > selectedIndex && vm.thumbsPos < selectedIndex;\n                    if ( isInView )\n                    {\n                        scrollThumbs(vm.thumbsPos);\n                        return;\n                    }\n                    scrollThumbs(selectedIndex);\n                }\n\n                function getSelectedIndex()\n                {\n                    for ( var i = 0; i < vm.images.length; i++ )\n                    {\n                        if ( vm.images[i].medium === vm.mainImage.medium )\n                        {\n                            return i;\n                        }\n                    }\n                }\n\n                function zoomStateEnable()\n                {\n                    $scope.$evalAsync(function ()\n                    {\n                        vm.zoomActive = true;\n                    });\n                }\n\n                function zoomStateDisable()\n                {\n                    $scope.$evalAsync(function ()\n                    {\n                        vm.zoomActive = false;\n                    });\n                }\n\n                function updateMainImage(image)\n                {\n                    vm.largeImageLoading = true;\n                    vm.mainImage = image;\n                    $scope.selectedModel = vm.mainImage;\n                    $scope.selectedIndex = vm.images.indexOf(vm.mainImage);\n                }\n\n                function largeImageLoaded()\n                {\n                    vm.largeImageLoading = false;\n                    initSizes();\n                }\n\n                $scope.$watch('selectedModel', function (newVal, oldVal)\n                {\n                    if ( angular.isDefined(newVal) && newVal !== oldVal )\n                    {\n                        vm.mainImage = newVal;\n                        updateThumbsPos();\n                    }\n                }, true);\n\n                $scope.$watch('selectedIndex', function (newVal, oldVal)\n                {\n                    if ( angular.isDefined(newVal) && newVal !== oldVal )\n                    {\n                        vm.mainImage = vm.images[newVal];\n                        updateThumbsPos();\n                    }\n                }, true);\n\n                angular.element(window).on('resize', function ()\n                {\n                    update();\n                });\n\n                if ( $window.Ps )\n                {\n                    angular.element(document).on('ps-scroll-y', function ()\n                    {\n                        initSizes();\n                    });\n                }\n\n                $scope.$watch(function ()\n                {\n                    return {\n                        left: vm.zoomTracker.getBoundingClientRect().left + $window.scrollX,\n                        top : vm.zoomTracker.getBoundingClientRect().top + $window.scrollY\n                    };\n                }, function (newVal, oldVal)\n                {\n                    if ( angular.isDefined(newVal) && newVal !== oldVal )\n                    {\n                        update();\n                    }\n                }, true);\n\n                $scope.$watch('wipImageZoom', function (newVal, oldVal)\n                {\n                    if ( angular.isDefined(newVal) && newVal !== oldVal )\n                    {\n                        init();\n                        update();\n                    }\n                }, true);\n            }]\n        };\n    }\n\n    function wipImageZoomLensDirective()\n    {\n        return {\n            restrict: 'EA',\n            require : '^wipImageZoom',\n            link    : function (scope, element, attrs, ctrl)\n            {\n                ctrl.zoomLens = element[0];\n            }\n        };\n    }\n\n    function wipImageZoomTrackerDirective()\n    {\n        return {\n            restrict: 'EA',\n            require : '^wipImageZoom',\n            link    : function (scope, element, attrs, ctrl)\n            {\n                ctrl.zoomTracker = element[0];\n            }\n        };\n    }\n\n    function wipImageZoomMaskDirective()\n    {\n        return {\n            restrict: 'EA',\n            require : '^wipImageZoom',\n            link    : function (scope, element, attrs, ctrl)\n            {\n                ctrl.zoomMaskEl = element[0];\n            }\n        };\n    }\n\n    function wipImageZoomImageDirective()\n    {\n        return {\n            restrict: 'EA',\n            require : '^wipImageZoom',\n            link    : function (scope, element, attrs, ctrl)\n            {\n                ctrl.zoomImageEl = element[0];\n            }\n        };\n    }\n\n    function wipImageZoomThumbsDirective()\n    {\n        return {\n            restrict: 'EA',\n            require : '^wipImageZoom',\n            template: '<div class=\"thumbs-wrapper\" ng-swipe-left=\"vm.nextThumb()\" ng-swipe-right=\"vm.prevThumb()\">\\n    <div class=\"thumbs\" >\\n        <div class=\"thumb-wrapper\" ng-repeat=\"image in vm.images\">\\n            <img ng-src=\"{{image.thumb}}\" ng-click=\"vm.updateMainImage(image)\"\\n                 ng-class=\"{\\'selected\\': vm.mainImage.thumb === image.thumb}\">\\n        </div>\\n    </div>\\n</div>\\n<div class=\"prev-button\"\\n     ng-if=\"vm.thumbsPos !== 0\"\\n     ng-click=\"vm.prevThumb()\"\\n     ng-bind-html=\"vm.options.prevThumbButton\">Prev\\n</div>\\n<div class=\"next-button\"\\n     ng-if=\"vm.thumbsPos !== vm.maxPosX\"\\n     ng-click=\"vm.nextThumb()\"\\n     ng-bind-html=\"vm.options.nextThumbButton\">Next\\n</div>',\n            link    : function (scope, element, attrs, ctrl)\n            {\n                ctrl.thumbsWrapper = element[0].getElementsByClassName('thumbs-wrapper')[0];\n                ctrl.thumbsEl = element[0].getElementsByClassName('thumbs')[0];\n                ctrl.initThumbs();\n            }\n        };\n    }\n\n    function imageOnLoadDirective($log)\n    {\n        return {\n            restrict: 'A',\n            link    : function (scope, element, attrs)\n            {\n                element[0].addEventListener('load', function ()\n                {\n                    scope.$apply(attrs.imageOnLoad);\n                }, false);\n                element[0].addEventListener('error', function ()\n                {\n                    $log.warn('image could not be loaded');\n                });\n            }\n        };\n    }\n\n})();\n\n/******/ (function(modules) { // webpackBootstrap\n/******/ \t// The module cache\n/******/ \tvar installedModules = {};\n\n/******/ \t// The require function\n/******/ \tfunction __webpack_require__(moduleId) {\n\n/******/ \t\t// Check if module is in cache\n/******/ \t\tif(installedModules[moduleId])\n/******/ \t\t\treturn installedModules[moduleId].exports;\n\n/******/ \t\t// Create a new module (and put it into the cache)\n/******/ \t\tvar module = installedModules[moduleId] = {\n/******/ \t\t\texports: {},\n/******/ \t\t\tid: moduleId,\n/******/ \t\t\tloaded: false\n/******/ \t\t};\n\n/******/ \t\t// Execute the module function\n/******/ \t\tmodules[moduleId].call(module.exports, module, module.exports, __webpack_require__);\n\n/******/ \t\t// Flag the module as loaded\n/******/ \t\tmodule.loaded = true;\n\n/******/ \t\t// Return the exports of the module\n/******/ \t\treturn module.exports;\n/******/ \t}\n\n\n/******/ \t// expose the modules object (__webpack_modules__)\n/******/ \t__webpack_require__.m = modules;\n\n/******/ \t// expose the module cache\n/******/ \t__webpack_require__.c = installedModules;\n\n/******/ \t// __webpack_public_path__\n/******/ \t__webpack_require__.p = \"\";\n\n/******/ \t// Load entry module and return exports\n/******/ \treturn __webpack_require__(0);\n/******/ })\n/************************************************************************/\n/******/ ([\n/* 0 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\t// Generated by CoffeeScript 1.12.5\n\t'use strict';\n\n\tvar IBAN;\n\n\tIBAN = __webpack_require__(1);\n\n\tangular.module('mm.iban', ['ng']).directive('ngIban', function () {\n\t  return {\n\t    restrict: 'A',\n\t    require: 'ngModel',\n\t    scope: {\n\t      ngModel: '='\n\t    },\n\t    link: function link(scope, elem, attrs, ctrl) {\n\t      var isValidIban, parseIban;\n\t      parseIban = function parseIban(value) {\n\t        if (value != null) {\n\t          return IBAN.electronicFormat(value);\n\t        } else {\n\t          return void 0;\n\t        }\n\t      };\n\t      isValidIban = function isValidIban(value) {\n\t        var iban;\n\t        if (!(attrs.required || value)) {\n\t          return true;\n\t        }\n\t        iban = parseIban(value);\n\t        return IBAN.isValid(iban);\n\t      };\n\t      ctrl.$validators.ngIban = function (modelValue) {\n\t        return isValidIban(modelValue);\n\t      };\n\t      ctrl.$parsers.unshift(function (viewValue) {\n\t        var parsed, pretty, valid;\n\t        if (viewValue != null) {\n\t          valid = isValidIban(viewValue);\n\t          if (valid) {\n\t            parsed = parseIban(viewValue);\n\t            pretty = IBAN.printFormat(parsed);\n\t            if (pretty !== viewValue) {\n\t              ctrl.$setViewValue(pretty);\n\t              ctrl.$render();\n\t            }\n\t            return parsed;\n\t          } else {\n\t            return viewValue;\n\t          }\n\t        }\n\t      });\n\t      ctrl.$formatters.unshift(function (modelValue) {\n\t        var parsed, pretty, valid;\n\t        if (modelValue != null) {\n\t          valid = isValidIban(modelValue);\n\t          if (valid) {\n\t            parsed = parseIban(modelValue);\n\t            if (parsed !== modelValue) {\n\t              scope.ngModel = parsed;\n\t            }\n\t            return pretty = IBAN.printFormat(parsed);\n\t          } else {\n\t            return modelValue;\n\t          }\n\t        }\n\t      });\n\t    }\n\t  };\n\t}).filter('iban', function () {\n\t  return function (string, separator) {\n\t    var isValidIban, parseIban, valid;\n\t    parseIban = function parseIban(value) {\n\t      if (value != null) {\n\t        return value.toUpperCase().replace(/\\s/g, '');\n\t      } else {\n\t        return void 0;\n\t      }\n\t    };\n\t    isValidIban = function isValidIban(value) {\n\t      var iban;\n\t      iban = parseIban(value);\n\t      return IBAN.isValid(iban);\n\t    };\n\t    valid = isValidIban(string);\n\t    if (valid) {\n\t      return IBAN.printFormat(string, separator);\n\t    } else {\n\t      return string;\n\t    }\n\t  };\n\t});\n\n/***/ }),\n/* 1 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\tvar __WEBPACK_AMD_DEFINE_FACTORY__, __WEBPACK_AMD_DEFINE_ARRAY__, __WEBPACK_AMD_DEFINE_RESULT__;(function (root, factory) {\n\t    if (true) {\n\t        // AMD. Register as an anonymous module.\n\t        !(__WEBPACK_AMD_DEFINE_ARRAY__ = [exports], __WEBPACK_AMD_DEFINE_FACTORY__ = (factory), __WEBPACK_AMD_DEFINE_RESULT__ = (typeof __WEBPACK_AMD_DEFINE_FACTORY__ === 'function' ? (__WEBPACK_AMD_DEFINE_FACTORY__.apply(exports, __WEBPACK_AMD_DEFINE_ARRAY__)) : __WEBPACK_AMD_DEFINE_FACTORY__), __WEBPACK_AMD_DEFINE_RESULT__ !== undefined && (module.exports = __WEBPACK_AMD_DEFINE_RESULT__));\n\t    } else if (typeof exports === 'object' && typeof exports.nodeName !== 'string') {\n\t        // CommonJS\n\t        factory(exports);\n\t    } else {\n\t        // Browser globals\n\t        factory(root.IBAN = {});\n\t    }\n\t}(this, function(exports){\n\n\t    // Array.prototype.map polyfill\n\t    // code from https://developer.mozilla.org/en-US/docs/JavaScript/Reference/Global_Objects/Array/map\n\t    if (!Array.prototype.map){\n\t        Array.prototype.map = function(fun /*, thisArg */){\n\t            \"use strict\";\n\n\t            if (this === void 0 || this === null)\n\t                throw new TypeError();\n\n\t            var t = Object(this);\n\t            var len = t.length >>> 0;\n\t            if (typeof fun !== \"function\")\n\t                throw new TypeError();\n\n\t            var res = new Array(len);\n\t            var thisArg = arguments.length >= 2 ? arguments[1] : void 0;\n\t            for (var i = 0; i < len; i++)\n\t            {\n\t                // NOTE: Absolute correctness would demand Object.defineProperty\n\t                //       be used.  But this method is fairly new, and failure is\n\t                //       possible only if Object.prototype or Array.prototype\n\t                //       has a property |i| (very unlikely), so use a less-correct\n\t                //       but more portable alternative.\n\t                if (i in t)\n\t                    res[i] = fun.call(thisArg, t[i], i, t);\n\t            }\n\n\t            return res;\n\t        };\n\t    }\n\n\t    var A = 'A'.charCodeAt(0),\n\t        Z = 'Z'.charCodeAt(0);\n\n\t    /**\n\t     * Prepare an IBAN for mod 97 computation by moving the first 4 chars to the end and transforming the letters to\n\t     * numbers (A = 10, B = 11, ..., Z = 35), as specified in ISO13616.\n\t     *\n\t     * @param {string} iban the IBAN\n\t     * @returns {string} the prepared IBAN\n\t     */\n\t    function iso13616Prepare(iban) {\n\t        iban = iban.toUpperCase();\n\t        iban = iban.substr(4) + iban.substr(0,4);\n\n\t        return iban.split('').map(function(n){\n\t            var code = n.charCodeAt(0);\n\t            if (code >= A && code <= Z){\n\t                // A = 10, B = 11, ... Z = 35\n\t                return code - A + 10;\n\t            } else {\n\t                return n;\n\t            }\n\t        }).join('');\n\t    }\n\n\t    /**\n\t     * Calculates the MOD 97 10 of the passed IBAN as specified in ISO7064.\n\t     *\n\t     * @param iban\n\t     * @returns {number}\n\t     */\n\t    function iso7064Mod97_10(iban) {\n\t        var remainder = iban,\n\t            block;\n\n\t        while (remainder.length > 2){\n\t            block = remainder.slice(0, 9);\n\t            remainder = parseInt(block, 10) % 97 + remainder.slice(block.length);\n\t        }\n\n\t        return parseInt(remainder, 10) % 97;\n\t    }\n\n\t    /**\n\t     * Parse the BBAN structure used to configure each IBAN Specification and returns a matching regular expression.\n\t     * A structure is composed of blocks of 3 characters (one letter and 2 digits). Each block represents\n\t     * a logical group in the typical representation of the BBAN. For each group, the letter indicates which characters\n\t     * are allowed in this group and the following 2-digits number tells the length of the group.\n\t     *\n\t     * @param {string} structure the structure to parse\n\t     * @returns {RegExp}\n\t     */\n\t    function parseStructure(structure){\n\t        // split in blocks of 3 chars\n\t        var regex = structure.match(/(.{3})/g).map(function(block){\n\n\t            // parse each structure block (1-char + 2-digits)\n\t            var format,\n\t                pattern = block.slice(0, 1),\n\t                repeats = parseInt(block.slice(1), 10);\n\n\t            switch (pattern){\n\t                case \"A\": format = \"0-9A-Za-z\"; break;\n\t                case \"B\": format = \"0-9A-Z\"; break;\n\t                case \"C\": format = \"A-Za-z\"; break;\n\t                case \"F\": format = \"0-9\"; break;\n\t                case \"L\": format = \"a-z\"; break;\n\t                case \"U\": format = \"A-Z\"; break;\n\t                case \"W\": format = \"0-9a-z\"; break;\n\t            }\n\n\t            return '([' + format + ']{' + repeats + '})';\n\t        });\n\n\t        return new RegExp('^' + regex.join('') + '$');\n\t    }\n\n\t    /**\n\t     *\n\t     * @param iban\n\t     * @returns {string}\n\t     */\n\t    function electronicFormat(iban){\n\t        return iban.replace(NON_ALPHANUM, '').toUpperCase();\n\t    }\n\n\n\t    /**\n\t     * Create a new Specification for a valid IBAN number.\n\t     *\n\t     * @param countryCode the code of the country\n\t     * @param length the length of the IBAN\n\t     * @param structure the structure of the underlying BBAN (for validation and formatting)\n\t     * @param example an example valid IBAN\n\t     * @constructor\n\t     */\n\t    function Specification(countryCode, length, structure, example){\n\n\t        this.countryCode = countryCode;\n\t        this.length = length;\n\t        this.structure = structure;\n\t        this.example = example;\n\t    }\n\n\t    /**\n\t     * Lazy-loaded regex (parse the structure and construct the regular expression the first time we need it for validation)\n\t     */\n\t    Specification.prototype._regex = function(){\n\t        return this._cachedRegex || (this._cachedRegex = parseStructure(this.structure))\n\t    };\n\n\t    /**\n\t     * Check if the passed iban is valid according to this specification.\n\t     *\n\t     * @param {String} iban the iban to validate\n\t     * @returns {boolean} true if valid, false otherwise\n\t     */\n\t    Specification.prototype.isValid = function(iban){\n\t        return this.length == iban.length\n\t            && this.countryCode === iban.slice(0,2)\n\t            && this._regex().test(iban.slice(4))\n\t            && iso7064Mod97_10(iso13616Prepare(iban)) == 1;\n\t    };\n\n\t    /**\n\t     * Convert the passed IBAN to a country-specific BBAN.\n\t     *\n\t     * @param iban the IBAN to convert\n\t     * @param separator the separator to use between BBAN blocks\n\t     * @returns {string} the BBAN\n\t     */\n\t    Specification.prototype.toBBAN = function(iban, separator) {\n\t        return this._regex().exec(iban.slice(4)).slice(1).join(separator);\n\t    };\n\n\t    /**\n\t     * Convert the passed BBAN to an IBAN for this country specification.\n\t     * Please note that <i>\"generation of the IBAN shall be the exclusive responsibility of the bank/branch servicing the account\"</i>.\n\t     * This method implements the preferred algorithm described in http://en.wikipedia.org/wiki/International_Bank_Account_Number#Generating_IBAN_check_digits\n\t     *\n\t     * @param bban the BBAN to convert to IBAN\n\t     * @returns {string} the IBAN\n\t     */\n\t    Specification.prototype.fromBBAN = function(bban) {\n\t        if (!this.isValidBBAN(bban)){\n\t            throw new Error('Invalid BBAN');\n\t        }\n\n\t        var remainder = iso7064Mod97_10(iso13616Prepare(this.countryCode + '00' + bban)),\n\t            checkDigit = ('0' + (98 - remainder)).slice(-2);\n\n\t        return this.countryCode + checkDigit + bban;\n\t    };\n\n\t    /**\n\t     * Check of the passed BBAN is valid.\n\t     * This function only checks the format of the BBAN (length and matching the letetr/number specs) but does not\n\t     * verify the check digit.\n\t     *\n\t     * @param bban the BBAN to validate\n\t     * @returns {boolean} true if the passed bban is a valid BBAN according to this specification, false otherwise\n\t     */\n\t    Specification.prototype.isValidBBAN = function(bban) {\n\t        return this.length - 4 == bban.length\n\t            && this._regex().test(bban);\n\t    };\n\n\t    var countries = {};\n\n\t    function addSpecification(IBAN){\n\t        countries[IBAN.countryCode] = IBAN;\n\t    }\n\n\t    addSpecification(new Specification(\"AD\", 24, \"F04F04A12\",          \"AD1200012030200359100100\"));\n\t    addSpecification(new Specification(\"AE\", 23, \"F03F16\",             \"AE070331234567890123456\"));\n\t    addSpecification(new Specification(\"AL\", 28, \"F08A16\",             \"AL47212110090000000235698741\"));\n\t    addSpecification(new Specification(\"AT\", 20, \"F05F11\",             \"AT611904300234573201\"));\n\t    addSpecification(new Specification(\"AZ\", 28, \"U04A20\",             \"AZ21NABZ00000000137010001944\"));\n\t    addSpecification(new Specification(\"BA\", 20, \"F03F03F08F02\",       \"BA391290079401028494\"));\n\t    addSpecification(new Specification(\"BE\", 16, \"F03F07F02\",          \"BE68539007547034\"));\n\t    addSpecification(new Specification(\"BG\", 22, \"U04F04F02A08\",       \"BG80BNBG96611020345678\"));\n\t    addSpecification(new Specification(\"BH\", 22, \"U04A14\",             \"BH67BMAG00001299123456\"));\n\t    addSpecification(new Specification(\"BR\", 29, \"F08F05F10U01A01\",    \"BR9700360305000010009795493P1\"));\n\t    addSpecification(new Specification(\"BY\", 28, \"A04F04A16\",          \"BY13NBRB3600900000002Z00AB00\"));\n\t    addSpecification(new Specification(\"CH\", 21, \"F05A12\",             \"CH9300762011623852957\"));\n\t    addSpecification(new Specification(\"CR\", 22, \"F04F14\",             \"CR72012300000171549015\"));\n\t    addSpecification(new Specification(\"CY\", 28, \"F03F05A16\",          \"CY17002001280000001200527600\"));\n\t    addSpecification(new Specification(\"CZ\", 24, \"F04F06F10\",          \"CZ6508000000192000145399\"));\n\t    addSpecification(new Specification(\"DE\", 22, \"F08F10\",             \"DE89370400440532013000\"));\n\t    addSpecification(new Specification(\"DK\", 18, \"F04F09F01\",          \"DK5000400440116243\"));\n\t    addSpecification(new Specification(\"DO\", 28, \"U04F20\",             \"DO28BAGR00000001212453611324\"));\n\t    addSpecification(new Specification(\"EE\", 20, \"F02F02F11F01\",       \"EE382200221020145685\"));\n\t    addSpecification(new Specification(\"ES\", 24, \"F04F04F01F01F10\",    \"ES9121000418450200051332\"));\n\t    addSpecification(new Specification(\"FI\", 18, \"F06F07F01\",          \"FI2112345600000785\"));\n\t    addSpecification(new Specification(\"FO\", 18, \"F04F09F01\",          \"FO6264600001631634\"));\n\t    addSpecification(new Specification(\"FR\", 27, \"F05F05A11F02\",       \"FR1420041010050500013M02606\"));\n\t    addSpecification(new Specification(\"GB\", 22, \"U04F06F08\",          \"GB29NWBK60161331926819\"));\n\t    addSpecification(new Specification(\"GE\", 22, \"U02F16\",             \"GE29NB0000000101904917\"));\n\t    addSpecification(new Specification(\"GI\", 23, \"U04A15\",             \"GI75NWBK000000007099453\"));\n\t    addSpecification(new Specification(\"GL\", 18, \"F04F09F01\",          \"GL8964710001000206\"));\n\t    addSpecification(new Specification(\"GR\", 27, \"F03F04A16\",          \"GR1601101250000000012300695\"));\n\t    addSpecification(new Specification(\"GT\", 28, \"A04A20\",             \"GT82TRAJ01020000001210029690\"));\n\t    addSpecification(new Specification(\"HR\", 21, \"F07F10\",             \"HR1210010051863000160\"));\n\t    addSpecification(new Specification(\"HU\", 28, \"F03F04F01F15F01\",    \"HU42117730161111101800000000\"));\n\t    addSpecification(new Specification(\"IE\", 22, \"U04F06F08\",          \"IE29AIBK93115212345678\"));\n\t    addSpecification(new Specification(\"IL\", 23, \"F03F03F13\",          \"IL620108000000099999999\"));\n\t    addSpecification(new Specification(\"IS\", 26, \"F04F02F06F10\",       \"IS140159260076545510730339\"));\n\t    addSpecification(new Specification(\"IT\", 27, \"U01F05F05A12\",       \"IT60X0542811101000000123456\"));\n\t    addSpecification(new Specification(\"IQ\", 23, \"U04F03A12\",          \"IQ98NBIQ850123456789012\"));\n\t    addSpecification(new Specification(\"JO\", 30, \"A04F22\",             \"JO15AAAA1234567890123456789012\"));\n\t    addSpecification(new Specification(\"KW\", 30, \"U04A22\",             \"KW81CBKU0000000000001234560101\"));\n\t    addSpecification(new Specification(\"KZ\", 20, \"F03A13\",             \"KZ86125KZT5004100100\"));\n\t    addSpecification(new Specification(\"LB\", 28, \"F04A20\",             \"LB62099900000001001901229114\"));\n\t    addSpecification(new Specification(\"LC\", 32, \"U04F24\",             \"LC07HEMM000100010012001200013015\"));\n\t    addSpecification(new Specification(\"LI\", 21, \"F05A12\",             \"LI21088100002324013AA\"));\n\t    addSpecification(new Specification(\"LT\", 20, \"F05F11\",             \"LT121000011101001000\"));\n\t    addSpecification(new Specification(\"LU\", 20, \"F03A13\",             \"LU280019400644750000\"));\n\t    addSpecification(new Specification(\"LV\", 21, \"U04A13\",             \"LV80BANK0000435195001\"));\n\t    addSpecification(new Specification(\"MC\", 27, \"F05F05A11F02\",       \"MC5811222000010123456789030\"));\n\t    addSpecification(new Specification(\"MD\", 24, \"U02A18\",             \"MD24AG000225100013104168\"));\n\t    addSpecification(new Specification(\"ME\", 22, \"F03F13F02\",          \"ME25505000012345678951\"));\n\t    addSpecification(new Specification(\"MK\", 19, \"F03A10F02\",          \"MK07250120000058984\"));\n\t    addSpecification(new Specification(\"MR\", 27, \"F05F05F11F02\",       \"MR1300020001010000123456753\"));\n\t    addSpecification(new Specification(\"MT\", 31, \"U04F05A18\",          \"MT84MALT011000012345MTLCAST001S\"));\n\t    addSpecification(new Specification(\"MU\", 30, \"U04F02F02F12F03U03\", \"MU17BOMM0101101030300200000MUR\"));\n\t    addSpecification(new Specification(\"NL\", 18, \"U04F10\",             \"NL91ABNA0417164300\"));\n\t    addSpecification(new Specification(\"NO\", 15, \"F04F06F01\",          \"NO9386011117947\"));\n\t    addSpecification(new Specification(\"PK\", 24, \"U04A16\",             \"PK36SCBL0000001123456702\"));\n\t    addSpecification(new Specification(\"PL\", 28, \"F08F16\",             \"PL61109010140000071219812874\"));\n\t    addSpecification(new Specification(\"PS\", 29, \"U04A21\",             \"PS92PALS000000000400123456702\"));\n\t    addSpecification(new Specification(\"PT\", 25, \"F04F04F11F02\",       \"PT50000201231234567890154\"));\n\t    addSpecification(new Specification(\"QA\", 29, \"U04A21\",             \"QA30AAAA123456789012345678901\"));\n\t    addSpecification(new Specification(\"RO\", 24, \"U04A16\",             \"RO49AAAA1B31007593840000\"));\n\t    addSpecification(new Specification(\"RS\", 22, \"F03F13F02\",          \"RS35260005601001611379\"));\n\t    addSpecification(new Specification(\"SA\", 24, \"F02A18\",             \"SA0380000000608010167519\"));\n\t    addSpecification(new Specification(\"SC\", 31, \"U04F04F16U03\",       \"SC18SSCB11010000000000001497USD\"));\n\t    addSpecification(new Specification(\"SE\", 24, \"F03F16F01\",          \"SE4550000000058398257466\"));\n\t    addSpecification(new Specification(\"SI\", 19, \"F05F08F02\",          \"SI56263300012039086\"));\n\t    addSpecification(new Specification(\"SK\", 24, \"F04F06F10\",          \"SK3112000000198742637541\"));\n\t    addSpecification(new Specification(\"SM\", 27, \"U01F05F05A12\",       \"SM86U0322509800000000270100\"));\n\t    addSpecification(new Specification(\"ST\", 25, \"F08F11F02\",          \"ST68000100010051845310112\"));\n\t    addSpecification(new Specification(\"SV\", 28, \"U04F20\",             \"SV62CENR00000000000000700025\"));\n\t    addSpecification(new Specification(\"TL\", 23, \"F03F14F02\",          \"TL380080012345678910157\"));\n\t    addSpecification(new Specification(\"TN\", 24, \"F02F03F13F02\",       \"TN5910006035183598478831\"));\n\t    addSpecification(new Specification(\"TR\", 26, \"F05F01A16\",          \"TR330006100519786457841326\"));\n\t    addSpecification(new Specification(\"UA\", 29, \"F25\",                \"UA511234567890123456789012345\"));\n\t    addSpecification(new Specification(\"VA\", 22, \"F18\",                \"VA59001123000012345678\"));\n\t    addSpecification(new Specification(\"VG\", 24, \"U04F16\",             \"VG96VPVG0000012345678901\"));\n\t    addSpecification(new Specification(\"XK\", 20, \"F04F10F02\",          \"XK051212012345678906\"));\n\n\n\t    // The following countries are not included in the official IBAN registry but use the IBAN specification\n\n\t    // Angola\n\t    addSpecification(new Specification(\"AO\", 25, \"F21\",                \"AO69123456789012345678901\"));\n\t    // Burkina\n\t    addSpecification(new Specification(\"BF\", 27, \"F23\",                \"BF2312345678901234567890123\"));\n\t    // Burundi\n\t    addSpecification(new Specification(\"BI\", 16, \"F12\",                \"BI41123456789012\"));\n\t    // Benin\n\t    addSpecification(new Specification(\"BJ\", 28, \"F24\",                \"BJ39123456789012345678901234\"));\n\t    // Ivory\n\t    addSpecification(new Specification(\"CI\", 28, \"U02F22\",             \"CI70CI1234567890123456789012\"));\n\t    // Cameron\n\t    addSpecification(new Specification(\"CM\", 27, \"F23\",                \"CM9012345678901234567890123\"));\n\t    // Cape Verde\n\t    addSpecification(new Specification(\"CV\", 25, \"F21\",                \"CV30123456789012345678901\"));\n\t    // Algeria\n\t    addSpecification(new Specification(\"DZ\", 24, \"F20\",                \"DZ8612345678901234567890\"));\n\t    // Iran\n\t    addSpecification(new Specification(\"IR\", 26, \"F22\",                \"IR861234568790123456789012\"));\n\t    // Madagascar\n\t    addSpecification(new Specification(\"MG\", 27, \"F23\",                \"MG1812345678901234567890123\"));\n\t    // Mali\n\t    addSpecification(new Specification(\"ML\", 28, \"U01F23\",             \"ML15A12345678901234567890123\"));\n\t    // Mozambique\n\t    addSpecification(new Specification(\"MZ\", 25, \"F21\",                \"MZ25123456789012345678901\"));\n\t    // Senegal\n\t    addSpecification(new Specification(\"SN\", 28, \"U01F23\",             \"SN52A12345678901234567890123\"));\n\n\t    var NON_ALPHANUM = /[^a-zA-Z0-9]/g,\n\t        EVERY_FOUR_CHARS =/(.{4})(?!$)/g;\n\n\t    /**\n\t     * Utility function to check if a variable is a String.\n\t     *\n\t     * @param v\n\t     * @returns {boolean} true if the passed variable is a String, false otherwise.\n\t     */\n\t    function isString(v){\n\t        return (typeof v == 'string' || v instanceof String);\n\t    }\n\n\t    /**\n\t     * Check if an IBAN is valid.\n\t     *\n\t     * @param {String} iban the IBAN to validate.\n\t     * @returns {boolean} true if the passed IBAN is valid, false otherwise\n\t     */\n\t    exports.isValid = function(iban){\n\t        if (!isString(iban)){\n\t            return false;\n\t        }\n\t        iban = electronicFormat(iban);\n\t        var countryStructure = countries[iban.slice(0,2)];\n\t        return !!countryStructure && countryStructure.isValid(iban);\n\t    };\n\n\t    /**\n\t     * Convert an IBAN to a BBAN.\n\t     *\n\t     * @param iban\n\t     * @param {String} [separator] the separator to use between the blocks of the BBAN, defaults to ' '\n\t     * @returns {string|*}\n\t     */\n\t    exports.toBBAN = function(iban, separator){\n\t        if (typeof separator == 'undefined'){\n\t            separator = ' ';\n\t        }\n\t        iban = electronicFormat(iban);\n\t        var countryStructure = countries[iban.slice(0,2)];\n\t        if (!countryStructure) {\n\t            throw new Error('No country with code ' + iban.slice(0,2));\n\t        }\n\t        return countryStructure.toBBAN(iban, separator);\n\t    };\n\n\t    /**\n\t     * Convert the passed BBAN to an IBAN for this country specification.\n\t     * Please note that <i>\"generation of the IBAN shall be the exclusive responsibility of the bank/branch servicing the account\"</i>.\n\t     * This method implements the preferred algorithm described in http://en.wikipedia.org/wiki/International_Bank_Account_Number#Generating_IBAN_check_digits\n\t     *\n\t     * @param countryCode the country of the BBAN\n\t     * @param bban the BBAN to convert to IBAN\n\t     * @returns {string} the IBAN\n\t     */\n\t    exports.fromBBAN = function(countryCode, bban){\n\t        var countryStructure = countries[countryCode];\n\t        if (!countryStructure) {\n\t            throw new Error('No country with code ' + countryCode);\n\t        }\n\t        return countryStructure.fromBBAN(electronicFormat(bban));\n\t    };\n\n\t    /**\n\t     * Check the validity of the passed BBAN.\n\t     *\n\t     * @param countryCode the country of the BBAN\n\t     * @param bban the BBAN to check the validity of\n\t     */\n\t    exports.isValidBBAN = function(countryCode, bban){\n\t        if (!isString(bban)){\n\t            return false;\n\t        }\n\t        var countryStructure = countries[countryCode];\n\t        return countryStructure && countryStructure.isValidBBAN(electronicFormat(bban));\n\t    };\n\n\t    /**\n\t     *\n\t     * @param iban\n\t     * @param separator\n\t     * @returns {string}\n\t     */\n\t    exports.printFormat = function(iban, separator){\n\t        if (typeof separator == 'undefined'){\n\t            separator = ' ';\n\t        }\n\t        return electronicFormat(iban).replace(EVERY_FOUR_CHARS, \"$1\" + separator);\n\t    };\n\n\t    exports.electronicFormat = electronicFormat;\n\t    /**\n\t     * An object containing all the known IBAN specifications.\n\t     */\n\t    exports.countries = countries;\n\n\t}));\n\n\n/***/ })\n/******/ ]);\n/*! \n * angular-hotkeys v1.7.0\n * https://chieffancypants.github.io/angular-hotkeys\n * Copyright (c) 2016 Wes Cruver\n * License: MIT\n */\n/*\n * angular-hotkeys\n *\n * Automatic keyboard shortcuts for your angular apps\n *\n * (c) 2016 Wes Cruver\n * License: MIT\n */\n\n(function() {\n\n  'use strict';\n\n  angular.module('cfp.hotkeys', []).provider('hotkeys', ['$injector', function($injector) {\n\n    /**\n     * Configurable setting to disable the cheatsheet entirely\n     * @type {Boolean}\n     */\n    this.includeCheatSheet = true;\n\n    /**\n     * Configurable setting to disable ngRoute hooks\n     * @type {Boolean}\n     */\n    this.useNgRoute = $injector.has('ngViewDirective');\n\n    /**\n     * Configurable setting for the cheat sheet title\n     * @type {String}\n     */\n\n    this.templateTitle = 'Keyboard Shortcuts:';\n\n    /**\n     * Configurable settings for the cheat sheet header and footer.  Both are HTML, and the header\n     * overrides the normal title if specified.\n     * @type {String}\n     */\n    this.templateHeader = null;\n    this.templateFooter = null;\n\n    /**\n     * Cheat sheet template in the event you want to totally customize it.\n     * @type {String}\n     */\n    this.template = '<div class=\"cfp-hotkeys-container fade\" ng-class=\"{in: helpVisible}\" style=\"display: none;\"><div class=\"cfp-hotkeys\">' +\n                      '<h4 class=\"cfp-hotkeys-title\" ng-if=\"!header\">{{ title }}</h4>' +\n                      '<div ng-bind-html=\"header\" ng-if=\"header\"></div>' +\n                      '<table><tbody>' +\n                        '<tr ng-repeat=\"hotkey in hotkeys | filter:{ description: \\'!$$undefined$$\\' }\">' +\n                          '<td class=\"cfp-hotkeys-keys\">' +\n                            '<span ng-repeat=\"key in hotkey.format() track by $index\" class=\"cfp-hotkeys-key\">{{ key }}</span>' +\n                          '</td>' +\n                          '<td class=\"cfp-hotkeys-text\">{{ hotkey.description }}</td>' +\n                        '</tr>' +\n                      '</tbody></table>' +\n                      '<div ng-bind-html=\"footer\" ng-if=\"footer\"></div>' +\n                      '<div class=\"cfp-hotkeys-close\" ng-click=\"toggleCheatSheet()\">&#215;</div>' +\n                    '</div></div>';\n\n    /**\n     * Configurable setting for the cheat sheet hotkey\n     * @type {String}\n     */\n    this.cheatSheetHotkey = '?';\n\n    /**\n     * Configurable setting for the cheat sheet description\n     * @type {String}\n     */\n    this.cheatSheetDescription = 'Show / hide this help menu';\n\n    this.$get = ['$rootElement', '$rootScope', '$compile', '$window', '$document', function ($rootElement, $rootScope, $compile, $window, $document) {\n\n      var mouseTrapEnabled = true;\n\n      function pause() {\n        mouseTrapEnabled = false;\n      }\n\n      function unpause() {\n        mouseTrapEnabled = true;\n      }\n\n      // monkeypatch Mousetrap's stopCallback() function\n      // this version doesn't return true when the element is an INPUT, SELECT, or TEXTAREA\n      // (instead we will perform this check per-key in the _add() method)\n      Mousetrap.prototype.stopCallback = function(event, element) {\n        if (!mouseTrapEnabled) {\n          return true;\n        }\n\n        // if the element has the class \"mousetrap\" then no need to stop\n        if ((' ' + element.className + ' ').indexOf(' mousetrap ') > -1) {\n          return false;\n        }\n\n        return (element.contentEditable && element.contentEditable == 'true');\n      };\n\n      /**\n       * Convert strings like cmd into symbols like ⌘\n       * @param  {String} combo Key combination, e.g. 'mod+f'\n       * @return {String}       The key combination with symbols\n       */\n      function symbolize (combo) {\n        var map = {\n          command   : '\\u2318',     // ⌘\n          shift     : '\\u21E7',     // ⇧\n          left      : '\\u2190',     // ←\n          right     : '\\u2192',     // →\n          up        : '\\u2191',     // ↑\n          down      : '\\u2193',     // ↓\n          'return'  : '\\u23CE',     // ⏎\n          backspace : '\\u232B'      // ⌫\n        };\n        combo = combo.split('+');\n\n        for (var i = 0; i < combo.length; i++) {\n          // try to resolve command / ctrl based on OS:\n          if (combo[i] === 'mod') {\n            if ($window.navigator && $window.navigator.platform.indexOf('Mac') >=0 ) {\n              combo[i] = 'command';\n            } else {\n              combo[i] = 'ctrl';\n            }\n          }\n\n          combo[i] = map[combo[i]] || combo[i];\n        }\n\n        return combo.join(' + ');\n      }\n\n      /**\n       * Hotkey object used internally for consistency\n       *\n       * @param {array}    combo       The keycombo. it's an array to support multiple combos\n       * @param {String}   description Description for the keycombo\n       * @param {Function} callback    function to execute when keycombo pressed\n       * @param {string}   action      the type of event to listen for (for mousetrap)\n       * @param {array}    allowIn     an array of tag names to allow this combo in ('INPUT', 'SELECT', and/or 'TEXTAREA')\n       * @param {Boolean}  persistent  Whether the hotkey persists navigation events\n       */\n      function Hotkey (combo, description, callback, action, allowIn, persistent) {\n        // TODO: Check that the values are sane because we could\n        // be trying to instantiate a new Hotkey with outside dev's\n        // supplied values\n\n        this.combo = combo instanceof Array ? combo : [combo];\n        this.description = description;\n        this.callback = callback;\n        this.action = action;\n        this.allowIn = allowIn;\n        this.persistent = persistent;\n        this._formated = null;\n      }\n\n      /**\n       * Helper method to format (symbolize) the key combo for display\n       *\n       * @return {[Array]} An array of the key combination sequence\n       *   for example: \"command+g c i\" becomes [\"⌘ + g\", \"c\", \"i\"]\n       *\n       */\n      Hotkey.prototype.format = function() {\n        if (this._formated === null) {\n          // Don't show all the possible key combos, just the first one.  Not sure\n          // of usecase here, so open a ticket if my assumptions are wrong\n          var combo = this.combo[0];\n\n          var sequence = combo.split(/[\\s]/);\n          for (var i = 0; i < sequence.length; i++) {\n            sequence[i] = symbolize(sequence[i]);\n          }\n          this._formated = sequence;\n        }\n\n        return this._formated;\n      };\n\n      /**\n       * A new scope used internally for the cheatsheet\n       * @type {$rootScope.Scope}\n       */\n      var scope = $rootScope.$new();\n\n      /**\n       * Holds an array of Hotkey objects currently bound\n       * @type {Array}\n       */\n      scope.hotkeys = [];\n\n      /**\n       * Contains the state of the help's visibility\n       * @type {Boolean}\n       */\n      scope.helpVisible = false;\n\n      /**\n       * Holds the title string for the help menu\n       * @type {String}\n       */\n      scope.title = this.templateTitle;\n\n      /**\n       * Holds the header HTML for the help menu\n       * @type {String}\n       */\n      scope.header = this.templateHeader;\n\n      /**\n       * Holds the footer HTML for the help menu\n       * @type {String}\n       */\n      scope.footer = this.templateFooter;\n\n      /**\n       * Expose toggleCheatSheet to hotkeys scope so we can call it using\n       * ng-click from the template\n       * @type {function}\n       */\n      scope.toggleCheatSheet = toggleCheatSheet;\n\n\n      /**\n       * Holds references to the different scopes that have bound hotkeys\n       * attached.  This is useful to catch when the scopes are `$destroy`d and\n       * then automatically unbind the hotkey.\n       *\n       * @type {Object}\n       */\n      var boundScopes = {};\n\n      if (this.useNgRoute) {\n        $rootScope.$on('$routeChangeSuccess', function (event, route) {\n          purgeHotkeys();\n\n          if (route && route.hotkeys) {\n            angular.forEach(route.hotkeys, function (hotkey) {\n              // a string was given, which implies this is a function that is to be\n              // $eval()'d within that controller's scope\n              // TODO: hotkey here is super confusing.  sometimes a function (that gets turned into an array), sometimes a string\n              var callback = hotkey[2];\n              if (typeof(callback) === 'string' || callback instanceof String) {\n                hotkey[2] = [callback, route];\n              }\n\n              // todo: perform check to make sure not already defined:\n              // this came from a route, so it's likely not meant to be persistent\n              hotkey[5] = false;\n              _add.apply(this, hotkey);\n            });\n          }\n        });\n      }\n\n\n\n      // Auto-create a help menu:\n      if (this.includeCheatSheet) {\n        var document = $document[0];\n        var element = $rootElement[0];\n        var helpMenu = angular.element(this.template);\n        _add(this.cheatSheetHotkey, this.cheatSheetDescription, toggleCheatSheet);\n\n        // If $rootElement is document or documentElement, then body must be used\n        if (element === document || element === document.documentElement) {\n          element = document.body;\n        }\n\n        angular.element(element).append($compile(helpMenu)(scope));\n      }\n\n\n      /**\n       * Purges all non-persistent hotkeys (such as those defined in routes)\n       *\n       * Without this, the same hotkey would get recreated everytime\n       * the route is accessed.\n       */\n      function purgeHotkeys() {\n        var i = scope.hotkeys.length;\n        while (i--) {\n          var hotkey = scope.hotkeys[i];\n          if (hotkey && !hotkey.persistent) {\n            _del(hotkey);\n          }\n        }\n      }\n\n      /**\n       * Toggles the help menu element's visiblity\n       */\n      var previousEsc = false;\n\n      function toggleCheatSheet() {\n        scope.helpVisible = !scope.helpVisible;\n\n        // Bind to esc to remove the cheat sheet.  Ideally, this would be done\n        // as a directive in the template, but that would create a nasty\n        // circular dependency issue that I don't feel like sorting out.\n        if (scope.helpVisible) {\n          previousEsc = _get('esc');\n          _del('esc');\n\n          // Here's an odd way to do this: we're going to use the original\n          // description of the hotkey on the cheat sheet so that it shows up.\n          // without it, no entry for esc will ever show up (#22)\n          _add('esc', previousEsc.description, toggleCheatSheet, null, ['INPUT', 'SELECT', 'TEXTAREA']);\n        } else {\n          _del('esc');\n\n          // restore the previously bound ESC key\n          if (previousEsc !== false) {\n            _add(previousEsc);\n          }\n        }\n      }\n\n      /**\n       * Creates a new Hotkey and creates the Mousetrap binding\n       *\n       * @param {string}   combo       mousetrap key binding\n       * @param {string}   description description for the help menu\n       * @param {Function} callback    method to call when key is pressed\n       * @param {string}   action      the type of event to listen for (for mousetrap)\n       * @param {array}    allowIn     an array of tag names to allow this combo in ('INPUT', 'SELECT', and/or 'TEXTAREA')\n       * @param {boolean}  persistent  if true, the binding is preserved upon route changes\n       */\n      function _add (combo, description, callback, action, allowIn, persistent) {\n\n        // used to save original callback for \"allowIn\" wrapping:\n        var _callback;\n\n        // these elements are prevented by the default Mousetrap.stopCallback():\n        var preventIn = ['INPUT', 'SELECT', 'TEXTAREA'];\n\n        // Determine if object format was given:\n        var objType = Object.prototype.toString.call(combo);\n\n        if (objType === '[object Object]') {\n          description = combo.description;\n          callback    = combo.callback;\n          action      = combo.action;\n          persistent  = combo.persistent;\n          allowIn     = combo.allowIn;\n          combo       = combo.combo;\n        }\n\n        // no duplicates please\n        _del(combo);\n\n        // description is optional:\n        if (description instanceof Function) {\n          action = callback;\n          callback = description;\n          description = '$$undefined$$';\n        } else if (angular.isUndefined(description)) {\n          description = '$$undefined$$';\n        }\n\n        // any items added through the public API are for controllers\n        // that persist through navigation, and thus undefined should mean\n        // true in this case.\n        if (persistent === undefined) {\n          persistent = true;\n        }\n        // if callback is defined, then wrap it in a function\n        // that checks if the event originated from a form element.\n        // the function blocks the callback from executing unless the element is specified\n        // in allowIn (emulates Mousetrap.stopCallback() on a per-key level)\n        if (typeof callback === 'function') {\n\n          // save the original callback\n          _callback = callback;\n\n          // make sure allowIn is an array\n          if (!(allowIn instanceof Array)) {\n            allowIn = [];\n          }\n\n          // remove anything from preventIn that's present in allowIn\n          var index;\n          for (var i=0; i < allowIn.length; i++) {\n            allowIn[i] = allowIn[i].toUpperCase();\n            index = preventIn.indexOf(allowIn[i]);\n            if (index !== -1) {\n              preventIn.splice(index, 1);\n            }\n          }\n\n          // create the new wrapper callback\n          callback = function(event) {\n            var shouldExecute = true;\n\n            // if the callback is executed directly `hotkey.get('w').callback()`\n            // there will be no event, so just execute the callback.\n            if (event) {\n              var target = event.target || event.srcElement; // srcElement is IE only\n              var nodeName = target.nodeName.toUpperCase();\n\n              // check if the input has a mousetrap class, and skip checking preventIn if so\n              if ((' ' + target.className + ' ').indexOf(' mousetrap ') > -1) {\n                shouldExecute = true;\n              } else {\n                // don't execute callback if the event was fired from inside an element listed in preventIn\n                for (var i=0; i<preventIn.length; i++) {\n                  if (preventIn[i] === nodeName) {\n                    shouldExecute = false;\n                    break;\n                  }\n                }\n              }\n            }\n\n            if (shouldExecute) {\n              wrapApply(_callback.apply(this, arguments));\n            }\n          };\n        }\n\n        if (typeof(action) === 'string') {\n          Mousetrap.bind(combo, wrapApply(callback), action);\n        } else {\n          Mousetrap.bind(combo, wrapApply(callback));\n        }\n\n        var hotkey = new Hotkey(combo, description, callback, action, allowIn, persistent);\n        scope.hotkeys.push(hotkey);\n        return hotkey;\n      }\n\n      /**\n       * delete and unbind a Hotkey\n       *\n       * @param  {mixed} hotkey   Either the bound key or an instance of Hotkey\n       * @return {boolean}        true if successful\n       */\n      function _del (hotkey) {\n        var combo = (hotkey instanceof Hotkey) ? hotkey.combo : hotkey;\n\n        Mousetrap.unbind(combo);\n\n        if (angular.isArray(combo)) {\n          var retStatus = true;\n          var i = combo.length;\n          while (i--) {\n            retStatus = _del(combo[i]) && retStatus;\n          }\n          return retStatus;\n        } else {\n          var index = scope.hotkeys.indexOf(_get(combo));\n\n          if (index > -1) {\n            // if the combo has other combos bound, don't unbind the whole thing, just the one combo:\n            if (scope.hotkeys[index].combo.length > 1) {\n              scope.hotkeys[index].combo.splice(scope.hotkeys[index].combo.indexOf(combo), 1);\n            } else {\n\n              // remove hotkey from bound scopes\n              angular.forEach(boundScopes, function (boundScope) {\n                var scopeIndex = boundScope.indexOf(scope.hotkeys[index]);\n                if (scopeIndex !== -1) {\n                    boundScope.splice(scopeIndex, 1);\n                }\n              });\n\n              scope.hotkeys.splice(index, 1);\n            }\n            return true;\n          }\n        }\n\n        return false;\n\n      }\n\n      /**\n       * Get a Hotkey object by key binding\n       *\n       * @param  {[string]} [combo]  the key the Hotkey is bound to. Returns all key bindings if no key is passed\n       * @return {Hotkey}          The Hotkey object\n       */\n      function _get (combo) {\n\n        if (!combo) {\n          return scope.hotkeys;\n        }\n\n        var hotkey;\n\n        for (var i = 0; i < scope.hotkeys.length; i++) {\n          hotkey = scope.hotkeys[i];\n\n          if (hotkey.combo.indexOf(combo) > -1) {\n            return hotkey;\n          }\n        }\n\n        return false;\n      }\n\n      /**\n       * Binds the hotkey to a particular scope.  Useful if the scope is\n       * destroyed, we can automatically destroy the hotkey binding.\n       *\n       * @param  {Object} scope The scope to bind to\n       */\n      function bindTo (scope) {\n        // Only initialize once to allow multiple calls for same scope.\n        if (!(scope.$id in boundScopes)) {\n\n          // Add the scope to the list of bound scopes\n          boundScopes[scope.$id] = [];\n\n          scope.$on('$destroy', function () {\n            var i = boundScopes[scope.$id].length;\n            while (i--) {\n              _del(boundScopes[scope.$id].pop());\n            }\n          });\n        }\n        // return an object with an add function so we can keep track of the\n        // hotkeys and their scope that we added via this chaining method\n        return {\n          add: function (args) {\n            var hotkey;\n\n            if (arguments.length > 1) {\n              hotkey = _add.apply(this, arguments);\n            } else {\n              hotkey = _add(args);\n            }\n\n            boundScopes[scope.$id].push(hotkey);\n            return this;\n          }\n        };\n      }\n\n      /**\n       * All callbacks sent to Mousetrap are wrapped using this function\n       * so that we can force a $scope.$apply()\n       *\n       * @param  {Function} callback [description]\n       * @return {[type]}            [description]\n       */\n      function wrapApply (callback) {\n        // return mousetrap a function to call\n        return function (event, combo) {\n\n          // if this is an array, it means we provided a route object\n          // because the scope wasn't available yet, so rewrap the callback\n          // now that the scope is available:\n          if (callback instanceof Array) {\n            var funcString = callback[0];\n            var route = callback[1];\n            callback = function (event) {\n              route.scope.$eval(funcString);\n            };\n          }\n\n          // this takes place outside angular, so we'll have to call\n          // $apply() to make sure angular's digest happens\n          $rootScope.$apply(function() {\n            // call the original hotkey callback with the keyboard event\n            callback(event, _get(combo));\n          });\n        };\n      }\n\n      var publicApi = {\n        add                   : _add,\n        del                   : _del,\n        get                   : _get,\n        bindTo                : bindTo,\n        template              : this.template,\n        toggleCheatSheet      : toggleCheatSheet,\n        includeCheatSheet     : this.includeCheatSheet,\n        cheatSheetHotkey      : this.cheatSheetHotkey,\n        cheatSheetDescription : this.cheatSheetDescription,\n        useNgRoute            : this.useNgRoute,\n        purgeHotkeys          : purgeHotkeys,\n        templateTitle         : this.templateTitle,\n        pause                 : pause,\n        unpause               : unpause\n      };\n\n      return publicApi;\n\n    }];\n\n\n  }])\n\n  .directive('hotkey', ['hotkeys', function (hotkeys) {\n    return {\n      restrict: 'A',\n      link: function (scope, el, attrs) {\n        var keys = [],\n            allowIn;\n\n        angular.forEach(scope.$eval(attrs.hotkey), function (func, hotkey) {\n          // split and trim the hotkeys string into array\n          allowIn = typeof attrs.hotkeyAllowIn === \"string\" ? attrs.hotkeyAllowIn.split(/[\\s,]+/) : [];\n\n          keys.push(hotkey);\n\n          hotkeys.add({\n            combo: hotkey,\n            description: attrs.hotkeyDescription,\n            callback: func,\n            action: attrs.hotkeyAction,\n            allowIn: allowIn\n          });\n        });\n\n        // remove the hotkey if the directive is destroyed:\n        el.bind('$destroy', function() {\n          angular.forEach(keys, hotkeys.del);\n        });\n      }\n    };\n  }])\n\n  .run(['hotkeys', function(hotkeys) {\n    // force hotkeys to run by injecting it. Without this, hotkeys only runs\n    // when a controller or something else asks for it via DI.\n  }]);\n\n})();\n\n/*global define:false */\n/**\n * Copyright 2015 Craig Campbell\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 * Mousetrap is a simple keyboard shortcut library for Javascript with\n * no external dependencies\n *\n * @version 1.5.2\n * @url craig.is/killing/mice\n */\n(function(window, document, undefined) {\n\n    /**\n     * mapping of special keycodes to their corresponding keys\n     *\n     * everything in this dictionary cannot use keypress events\n     * so it has to be here to map to the correct keycodes for\n     * keyup/keydown events\n     *\n     * @type {Object}\n     */\n    var _MAP = {\n        8: 'backspace',\n        9: 'tab',\n        13: 'enter',\n        16: 'shift',\n        17: 'ctrl',\n        18: 'alt',\n        20: 'capslock',\n        27: 'esc',\n        32: 'space',\n        33: 'pageup',\n        34: 'pagedown',\n        35: 'end',\n        36: 'home',\n        37: 'left',\n        38: 'up',\n        39: 'right',\n        40: 'down',\n        45: 'ins',\n        46: 'del',\n        91: 'meta',\n        93: 'meta',\n        224: 'meta'\n    };\n\n    /**\n     * mapping for special characters so they can support\n     *\n     * this dictionary is only used incase you want to bind a\n     * keyup or keydown event to one of these keys\n     *\n     * @type {Object}\n     */\n    var _KEYCODE_MAP = {\n        106: '*',\n        107: '+',\n        109: '-',\n        110: '.',\n        111 : '/',\n        186: ';',\n        187: '=',\n        188: ',',\n        189: '-',\n        190: '.',\n        191: '/',\n        192: '`',\n        219: '[',\n        220: '\\\\',\n        221: ']',\n        222: '\\''\n    };\n\n    /**\n     * this is a mapping of keys that require shift on a US keypad\n     * back to the non shift equivelents\n     *\n     * this is so you can use keyup events with these keys\n     *\n     * note that this will only work reliably on US keyboards\n     *\n     * @type {Object}\n     */\n    var _SHIFT_MAP = {\n        '~': '`',\n        '!': '1',\n        '@': '2',\n        '#': '3',\n        '$': '4',\n        '%': '5',\n        '^': '6',\n        '&': '7',\n        '*': '8',\n        '(': '9',\n        ')': '0',\n        '_': '-',\n        '+': '=',\n        ':': ';',\n        '\\\"': '\\'',\n        '<': ',',\n        '>': '.',\n        '?': '/',\n        '|': '\\\\'\n    };\n\n    /**\n     * this is a list of special strings you can use to map\n     * to modifier keys when you specify your keyboard shortcuts\n     *\n     * @type {Object}\n     */\n    var _SPECIAL_ALIASES = {\n        'option': 'alt',\n        'command': 'meta',\n        'return': 'enter',\n        'escape': 'esc',\n        'plus': '+',\n        'mod': /Mac|iPod|iPhone|iPad/.test(navigator.platform) ? 'meta' : 'ctrl'\n    };\n\n    /**\n     * variable to store the flipped version of _MAP from above\n     * needed to check if we should use keypress or not when no action\n     * is specified\n     *\n     * @type {Object|undefined}\n     */\n    var _REVERSE_MAP;\n\n    /**\n     * loop through the f keys, f1 to f19 and add them to the map\n     * programatically\n     */\n    for (var i = 1; i < 20; ++i) {\n        _MAP[111 + i] = 'f' + i;\n    }\n\n    /**\n     * loop through to map numbers on the numeric keypad\n     */\n    for (i = 0; i <= 9; ++i) {\n        _MAP[i + 96] = i;\n    }\n\n    /**\n     * cross browser add event method\n     *\n     * @param {Element|HTMLDocument} object\n     * @param {string} type\n     * @param {Function} callback\n     * @returns void\n     */\n    function _addEvent(object, type, callback) {\n        if (object.addEventListener) {\n            object.addEventListener(type, callback, false);\n            return;\n        }\n\n        object.attachEvent('on' + type, callback);\n    }\n\n    /**\n     * takes the event and returns the key character\n     *\n     * @param {Event} e\n     * @return {string}\n     */\n    function _characterFromEvent(e) {\n\n        // for keypress events we should return the character as is\n        if (e.type == 'keypress') {\n            var character = String.fromCharCode(e.which);\n\n            // if the shift key is not pressed then it is safe to assume\n            // that we want the character to be lowercase.  this means if\n            // you accidentally have caps lock on then your key bindings\n            // will continue to work\n            //\n            // the only side effect that might not be desired is if you\n            // bind something like 'A' cause you want to trigger an\n            // event when capital A is pressed caps lock will no longer\n            // trigger the event.  shift+a will though.\n            if (!e.shiftKey) {\n                character = character.toLowerCase();\n            }\n\n            return character;\n        }\n\n        // for non keypress events the special maps are needed\n        if (_MAP[e.which]) {\n            return _MAP[e.which];\n        }\n\n        if (_KEYCODE_MAP[e.which]) {\n            return _KEYCODE_MAP[e.which];\n        }\n\n        // if it is not in the special map\n\n        // with keydown and keyup events the character seems to always\n        // come in as an uppercase character whether you are pressing shift\n        // or not.  we should make sure it is always lowercase for comparisons\n        return String.fromCharCode(e.which).toLowerCase();\n    }\n\n    /**\n     * checks if two arrays are equal\n     *\n     * @param {Array} modifiers1\n     * @param {Array} modifiers2\n     * @returns {boolean}\n     */\n    function _modifiersMatch(modifiers1, modifiers2) {\n        return modifiers1.sort().join(',') === modifiers2.sort().join(',');\n    }\n\n    /**\n     * takes a key event and figures out what the modifiers are\n     *\n     * @param {Event} e\n     * @returns {Array}\n     */\n    function _eventModifiers(e) {\n        var modifiers = [];\n\n        if (e.shiftKey) {\n            modifiers.push('shift');\n        }\n\n        if (e.altKey) {\n            modifiers.push('alt');\n        }\n\n        if (e.ctrlKey) {\n            modifiers.push('ctrl');\n        }\n\n        if (e.metaKey) {\n            modifiers.push('meta');\n        }\n\n        return modifiers;\n    }\n\n    /**\n     * prevents default for this event\n     *\n     * @param {Event} e\n     * @returns void\n     */\n    function _preventDefault(e) {\n        if (e.preventDefault) {\n            e.preventDefault();\n            return;\n        }\n\n        e.returnValue = false;\n    }\n\n    /**\n     * stops propogation for this event\n     *\n     * @param {Event} e\n     * @returns void\n     */\n    function _stopPropagation(e) {\n        if (e.stopPropagation) {\n            e.stopPropagation();\n            return;\n        }\n\n        e.cancelBubble = true;\n    }\n\n    /**\n     * determines if the keycode specified is a modifier key or not\n     *\n     * @param {string} key\n     * @returns {boolean}\n     */\n    function _isModifier(key) {\n        return key == 'shift' || key == 'ctrl' || key == 'alt' || key == 'meta';\n    }\n\n    /**\n     * reverses the map lookup so that we can look for specific keys\n     * to see what can and can't use keypress\n     *\n     * @return {Object}\n     */\n    function _getReverseMap() {\n        if (!_REVERSE_MAP) {\n            _REVERSE_MAP = {};\n            for (var key in _MAP) {\n\n                // pull out the numeric keypad from here cause keypress should\n                // be able to detect the keys from the character\n                if (key > 95 && key < 112) {\n                    continue;\n                }\n\n                if (_MAP.hasOwnProperty(key)) {\n                    _REVERSE_MAP[_MAP[key]] = key;\n                }\n            }\n        }\n        return _REVERSE_MAP;\n    }\n\n    /**\n     * picks the best action based on the key combination\n     *\n     * @param {string} key - character for key\n     * @param {Array} modifiers\n     * @param {string=} action passed in\n     */\n    function _pickBestAction(key, modifiers, action) {\n\n        // if no action was picked in we should try to pick the one\n        // that we think would work best for this key\n        if (!action) {\n            action = _getReverseMap()[key] ? 'keydown' : 'keypress';\n        }\n\n        // modifier keys don't work as expected with keypress,\n        // switch to keydown\n        if (action == 'keypress' && modifiers.length) {\n            action = 'keydown';\n        }\n\n        return action;\n    }\n\n    /**\n     * Converts from a string key combination to an array\n     *\n     * @param  {string} combination like \"command+shift+l\"\n     * @return {Array}\n     */\n    function _keysFromString(combination) {\n        if (combination === '+') {\n            return ['+'];\n        }\n\n        combination = combination.replace(/\\+{2}/g, '+plus');\n        return combination.split('+');\n    }\n\n    /**\n     * Gets info for a specific key combination\n     *\n     * @param  {string} combination key combination (\"command+s\" or \"a\" or \"*\")\n     * @param  {string=} action\n     * @returns {Object}\n     */\n    function _getKeyInfo(combination, action) {\n        var keys;\n        var key;\n        var i;\n        var modifiers = [];\n\n        // take the keys from this pattern and figure out what the actual\n        // pattern is all about\n        keys = _keysFromString(combination);\n\n        for (i = 0; i < keys.length; ++i) {\n            key = keys[i];\n\n            // normalize key names\n            if (_SPECIAL_ALIASES[key]) {\n                key = _SPECIAL_ALIASES[key];\n            }\n\n            // if this is not a keypress event then we should\n            // be smart about using shift keys\n            // this will only work for US keyboards however\n            if (action && action != 'keypress' && _SHIFT_MAP[key]) {\n                key = _SHIFT_MAP[key];\n                modifiers.push('shift');\n            }\n\n            // if this key is a modifier then add it to the list of modifiers\n            if (_isModifier(key)) {\n                modifiers.push(key);\n            }\n        }\n\n        // depending on what the key combination is\n        // we will try to pick the best event for it\n        action = _pickBestAction(key, modifiers, action);\n\n        return {\n            key: key,\n            modifiers: modifiers,\n            action: action\n        };\n    }\n\n    function _belongsTo(element, ancestor) {\n        if (element === document) {\n            return false;\n        }\n\n        if (element === ancestor) {\n            return true;\n        }\n\n        return _belongsTo(element.parentNode, ancestor);\n    }\n\n    function Mousetrap(targetElement) {\n        var self = this;\n\n        targetElement = targetElement || document;\n\n        if (!(self instanceof Mousetrap)) {\n            return new Mousetrap(targetElement);\n        }\n\n        /**\n         * element to attach key events to\n         *\n         * @type {Element}\n         */\n        self.target = targetElement;\n\n        /**\n         * a list of all the callbacks setup via Mousetrap.bind()\n         *\n         * @type {Object}\n         */\n        self._callbacks = {};\n\n        /**\n         * direct map of string combinations to callbacks used for trigger()\n         *\n         * @type {Object}\n         */\n        self._directMap = {};\n\n        /**\n         * keeps track of what level each sequence is at since multiple\n         * sequences can start out with the same sequence\n         *\n         * @type {Object}\n         */\n        var _sequenceLevels = {};\n\n        /**\n         * variable to store the setTimeout call\n         *\n         * @type {null|number}\n         */\n        var _resetTimer;\n\n        /**\n         * temporary state where we will ignore the next keyup\n         *\n         * @type {boolean|string}\n         */\n        var _ignoreNextKeyup = false;\n\n        /**\n         * temporary state where we will ignore the next keypress\n         *\n         * @type {boolean}\n         */\n        var _ignoreNextKeypress = false;\n\n        /**\n         * are we currently inside of a sequence?\n         * type of action (\"keyup\" or \"keydown\" or \"keypress\") or false\n         *\n         * @type {boolean|string}\n         */\n        var _nextExpectedAction = false;\n\n        /**\n         * resets all sequence counters except for the ones passed in\n         *\n         * @param {Object} doNotReset\n         * @returns void\n         */\n        function _resetSequences(doNotReset) {\n            doNotReset = doNotReset || {};\n\n            var activeSequences = false,\n                key;\n\n            for (key in _sequenceLevels) {\n                if (doNotReset[key]) {\n                    activeSequences = true;\n                    continue;\n                }\n                _sequenceLevels[key] = 0;\n            }\n\n            if (!activeSequences) {\n                _nextExpectedAction = false;\n            }\n        }\n\n        /**\n         * finds all callbacks that match based on the keycode, modifiers,\n         * and action\n         *\n         * @param {string} character\n         * @param {Array} modifiers\n         * @param {Event|Object} e\n         * @param {string=} sequenceName - name of the sequence we are looking for\n         * @param {string=} combination\n         * @param {number=} level\n         * @returns {Array}\n         */\n        function _getMatches(character, modifiers, e, sequenceName, combination, level) {\n            var i;\n            var callback;\n            var matches = [];\n            var action = e.type;\n\n            // if there are no events related to this keycode\n            if (!self._callbacks[character]) {\n                return [];\n            }\n\n            // if a modifier key is coming up on its own we should allow it\n            if (action == 'keyup' && _isModifier(character)) {\n                modifiers = [character];\n            }\n\n            // loop through all callbacks for the key that was pressed\n            // and see if any of them match\n            for (i = 0; i < self._callbacks[character].length; ++i) {\n                callback = self._callbacks[character][i];\n\n                // if a sequence name is not specified, but this is a sequence at\n                // the wrong level then move onto the next match\n                if (!sequenceName && callback.seq && _sequenceLevels[callback.seq] != callback.level) {\n                    continue;\n                }\n\n                // if the action we are looking for doesn't match the action we got\n                // then we should keep going\n                if (action != callback.action) {\n                    continue;\n                }\n\n                // if this is a keypress event and the meta key and control key\n                // are not pressed that means that we need to only look at the\n                // character, otherwise check the modifiers as well\n                //\n                // chrome will not fire a keypress if meta or control is down\n                // safari will fire a keypress if meta or meta+shift is down\n                // firefox will fire a keypress if meta or control is down\n                if ((action == 'keypress' && !e.metaKey && !e.ctrlKey) || _modifiersMatch(modifiers, callback.modifiers)) {\n\n                    // when you bind a combination or sequence a second time it\n                    // should overwrite the first one.  if a sequenceName or\n                    // combination is specified in this call it does just that\n                    //\n                    // @todo make deleting its own method?\n                    var deleteCombo = !sequenceName && callback.combo == combination;\n                    var deleteSequence = sequenceName && callback.seq == sequenceName && callback.level == level;\n                    if (deleteCombo || deleteSequence) {\n                        self._callbacks[character].splice(i, 1);\n                    }\n\n                    matches.push(callback);\n                }\n            }\n\n            return matches;\n        }\n\n        /**\n         * actually calls the callback function\n         *\n         * if your callback function returns false this will use the jquery\n         * convention - prevent default and stop propogation on the event\n         *\n         * @param {Function} callback\n         * @param {Event} e\n         * @returns void\n         */\n        function _fireCallback(callback, e, combo, sequence) {\n\n            // if this event should not happen stop here\n            if (self.stopCallback(e, e.target || e.srcElement, combo, sequence)) {\n                return;\n            }\n\n            if (callback(e, combo) === false) {\n                _preventDefault(e);\n                _stopPropagation(e);\n            }\n        }\n\n        /**\n         * handles a character key event\n         *\n         * @param {string} character\n         * @param {Array} modifiers\n         * @param {Event} e\n         * @returns void\n         */\n        self._handleKey = function(character, modifiers, e) {\n            var callbacks = _getMatches(character, modifiers, e);\n            var i;\n            var doNotReset = {};\n            var maxLevel = 0;\n            var processedSequenceCallback = false;\n\n            // Calculate the maxLevel for sequences so we can only execute the longest callback sequence\n            for (i = 0; i < callbacks.length; ++i) {\n                if (callbacks[i].seq) {\n                    maxLevel = Math.max(maxLevel, callbacks[i].level);\n                }\n            }\n\n            // loop through matching callbacks for this key event\n            for (i = 0; i < callbacks.length; ++i) {\n\n                // fire for all sequence callbacks\n                // this is because if for example you have multiple sequences\n                // bound such as \"g i\" and \"g t\" they both need to fire the\n                // callback for matching g cause otherwise you can only ever\n                // match the first one\n                if (callbacks[i].seq) {\n\n                    // only fire callbacks for the maxLevel to prevent\n                    // subsequences from also firing\n                    //\n                    // for example 'a option b' should not cause 'option b' to fire\n                    // even though 'option b' is part of the other sequence\n                    //\n                    // any sequences that do not match here will be discarded\n                    // below by the _resetSequences call\n                    if (callbacks[i].level != maxLevel) {\n                        continue;\n                    }\n\n                    processedSequenceCallback = true;\n\n                    // keep a list of which sequences were matches for later\n                    doNotReset[callbacks[i].seq] = 1;\n                    _fireCallback(callbacks[i].callback, e, callbacks[i].combo, callbacks[i].seq);\n                    continue;\n                }\n\n                // if there were no sequence matches but we are still here\n                // that means this is a regular match so we should fire that\n                if (!processedSequenceCallback) {\n                    _fireCallback(callbacks[i].callback, e, callbacks[i].combo);\n                }\n            }\n\n            // if the key you pressed matches the type of sequence without\n            // being a modifier (ie \"keyup\" or \"keypress\") then we should\n            // reset all sequences that were not matched by this event\n            //\n            // this is so, for example, if you have the sequence \"h a t\" and you\n            // type \"h e a r t\" it does not match.  in this case the \"e\" will\n            // cause the sequence to reset\n            //\n            // modifier keys are ignored because you can have a sequence\n            // that contains modifiers such as \"enter ctrl+space\" and in most\n            // cases the modifier key will be pressed before the next key\n            //\n            // also if you have a sequence such as \"ctrl+b a\" then pressing the\n            // \"b\" key will trigger a \"keypress\" and a \"keydown\"\n            //\n            // the \"keydown\" is expected when there is a modifier, but the\n            // \"keypress\" ends up matching the _nextExpectedAction since it occurs\n            // after and that causes the sequence to reset\n            //\n            // we ignore keypresses in a sequence that directly follow a keydown\n            // for the same character\n            var ignoreThisKeypress = e.type == 'keypress' && _ignoreNextKeypress;\n            if (e.type == _nextExpectedAction && !_isModifier(character) && !ignoreThisKeypress) {\n                _resetSequences(doNotReset);\n            }\n\n            _ignoreNextKeypress = processedSequenceCallback && e.type == 'keydown';\n        };\n\n        /**\n         * handles a keydown event\n         *\n         * @param {Event} e\n         * @returns void\n         */\n        function _handleKeyEvent(e) {\n\n            // normalize e.which for key events\n            // @see http://stackoverflow.com/questions/4285627/javascript-keycode-vs-charcode-utter-confusion\n            if (typeof e.which !== 'number') {\n                e.which = e.keyCode;\n            }\n\n            var character = _characterFromEvent(e);\n\n            // no character found then stop\n            if (!character) {\n                return;\n            }\n\n            // need to use === for the character check because the character can be 0\n            if (e.type == 'keyup' && _ignoreNextKeyup === character) {\n                _ignoreNextKeyup = false;\n                return;\n            }\n\n            self.handleKey(character, _eventModifiers(e), e);\n        }\n\n        /**\n         * called to set a 1 second timeout on the specified sequence\n         *\n         * this is so after each key press in the sequence you have 1 second\n         * to press the next key before you have to start over\n         *\n         * @returns void\n         */\n        function _resetSequenceTimer() {\n            clearTimeout(_resetTimer);\n            _resetTimer = setTimeout(_resetSequences, 1000);\n        }\n\n        /**\n         * binds a key sequence to an event\n         *\n         * @param {string} combo - combo specified in bind call\n         * @param {Array} keys\n         * @param {Function} callback\n         * @param {string=} action\n         * @returns void\n         */\n        function _bindSequence(combo, keys, callback, action) {\n\n            // start off by adding a sequence level record for this combination\n            // and setting the level to 0\n            _sequenceLevels[combo] = 0;\n\n            /**\n             * callback to increase the sequence level for this sequence and reset\n             * all other sequences that were active\n             *\n             * @param {string} nextAction\n             * @returns {Function}\n             */\n            function _increaseSequence(nextAction) {\n                return function() {\n                    _nextExpectedAction = nextAction;\n                    ++_sequenceLevels[combo];\n                    _resetSequenceTimer();\n                };\n            }\n\n            /**\n             * wraps the specified callback inside of another function in order\n             * to reset all sequence counters as soon as this sequence is done\n             *\n             * @param {Event} e\n             * @returns void\n             */\n            function _callbackAndReset(e) {\n                _fireCallback(callback, e, combo);\n\n                // we should ignore the next key up if the action is key down\n                // or keypress.  this is so if you finish a sequence and\n                // release the key the final key will not trigger a keyup\n                if (action !== 'keyup') {\n                    _ignoreNextKeyup = _characterFromEvent(e);\n                }\n\n                // weird race condition if a sequence ends with the key\n                // another sequence begins with\n                setTimeout(_resetSequences, 10);\n            }\n\n            // loop through keys one at a time and bind the appropriate callback\n            // function.  for any key leading up to the final one it should\n            // increase the sequence. after the final, it should reset all sequences\n            //\n            // if an action is specified in the original bind call then that will\n            // be used throughout.  otherwise we will pass the action that the\n            // next key in the sequence should match.  this allows a sequence\n            // to mix and match keypress and keydown events depending on which\n            // ones are better suited to the key provided\n            for (var i = 0; i < keys.length; ++i) {\n                var isFinal = i + 1 === keys.length;\n                var wrappedCallback = isFinal ? _callbackAndReset : _increaseSequence(action || _getKeyInfo(keys[i + 1]).action);\n                _bindSingle(keys[i], wrappedCallback, action, combo, i);\n            }\n        }\n\n        /**\n         * binds a single keyboard combination\n         *\n         * @param {string} combination\n         * @param {Function} callback\n         * @param {string=} action\n         * @param {string=} sequenceName - name of sequence if part of sequence\n         * @param {number=} level - what part of the sequence the command is\n         * @returns void\n         */\n        function _bindSingle(combination, callback, action, sequenceName, level) {\n\n            // store a direct mapped reference for use with Mousetrap.trigger\n            self._directMap[combination + ':' + action] = callback;\n\n            // make sure multiple spaces in a row become a single space\n            combination = combination.replace(/\\s+/g, ' ');\n\n            var sequence = combination.split(' ');\n            var info;\n\n            // if this pattern is a sequence of keys then run through this method\n            // to reprocess each pattern one key at a time\n            if (sequence.length > 1) {\n                _bindSequence(combination, sequence, callback, action);\n                return;\n            }\n\n            info = _getKeyInfo(combination, action);\n\n            // make sure to initialize array if this is the first time\n            // a callback is added for this key\n            self._callbacks[info.key] = self._callbacks[info.key] || [];\n\n            // remove an existing match if there is one\n            _getMatches(info.key, info.modifiers, {type: info.action}, sequenceName, combination, level);\n\n            // add this call back to the array\n            // if it is a sequence put it at the beginning\n            // if not put it at the end\n            //\n            // this is important because the way these are processed expects\n            // the sequence ones to come first\n            self._callbacks[info.key][sequenceName ? 'unshift' : 'push']({\n                callback: callback,\n                modifiers: info.modifiers,\n                action: info.action,\n                seq: sequenceName,\n                level: level,\n                combo: combination\n            });\n        }\n\n        /**\n         * binds multiple combinations to the same callback\n         *\n         * @param {Array} combinations\n         * @param {Function} callback\n         * @param {string|undefined} action\n         * @returns void\n         */\n        self._bindMultiple = function(combinations, callback, action) {\n            for (var i = 0; i < combinations.length; ++i) {\n                _bindSingle(combinations[i], callback, action);\n            }\n        };\n\n        // start!\n        _addEvent(targetElement, 'keypress', _handleKeyEvent);\n        _addEvent(targetElement, 'keydown', _handleKeyEvent);\n        _addEvent(targetElement, 'keyup', _handleKeyEvent);\n    }\n\n    /**\n     * binds an event to mousetrap\n     *\n     * can be a single key, a combination of keys separated with +,\n     * an array of keys, or a sequence of keys separated by spaces\n     *\n     * be sure to list the modifier keys first to make sure that the\n     * correct key ends up getting bound (the last key in the pattern)\n     *\n     * @param {string|Array} keys\n     * @param {Function} callback\n     * @param {string=} action - 'keypress', 'keydown', or 'keyup'\n     * @returns void\n     */\n    Mousetrap.prototype.bind = function(keys, callback, action) {\n        var self = this;\n        keys = keys instanceof Array ? keys : [keys];\n        self._bindMultiple.call(self, keys, callback, action);\n        return self;\n    };\n\n    /**\n     * unbinds an event to mousetrap\n     *\n     * the unbinding sets the callback function of the specified key combo\n     * to an empty function and deletes the corresponding key in the\n     * _directMap dict.\n     *\n     * TODO: actually remove this from the _callbacks dictionary instead\n     * of binding an empty function\n     *\n     * the keycombo+action has to be exactly the same as\n     * it was defined in the bind method\n     *\n     * @param {string|Array} keys\n     * @param {string} action\n     * @returns void\n     */\n    Mousetrap.prototype.unbind = function(keys, action) {\n        var self = this;\n        return self.bind.call(self, keys, function() {}, action);\n    };\n\n    /**\n     * triggers an event that has already been bound\n     *\n     * @param {string} keys\n     * @param {string=} action\n     * @returns void\n     */\n    Mousetrap.prototype.trigger = function(keys, action) {\n        var self = this;\n        if (self._directMap[keys + ':' + action]) {\n            self._directMap[keys + ':' + action]({}, keys);\n        }\n        return self;\n    };\n\n    /**\n     * resets the library back to its initial state.  this is useful\n     * if you want to clear out the current keyboard shortcuts and bind\n     * new ones - for example if you switch to another page\n     *\n     * @returns void\n     */\n    Mousetrap.prototype.reset = function() {\n        var self = this;\n        self._callbacks = {};\n        self._directMap = {};\n        return self;\n    };\n\n    /**\n     * should we stop this event before firing off callbacks\n     *\n     * @param {Event} e\n     * @param {Element} element\n     * @return {boolean}\n     */\n    Mousetrap.prototype.stopCallback = function(e, element) {\n        var self = this;\n\n        // if the element has the class \"mousetrap\" then no need to stop\n        if ((' ' + element.className + ' ').indexOf(' mousetrap ') > -1) {\n            return false;\n        }\n\n        if (_belongsTo(element, self.target)) {\n            return false;\n        }\n\n        // stop for input, select, and textarea\n        return element.tagName == 'INPUT' || element.tagName == 'SELECT' || element.tagName == 'TEXTAREA' || element.isContentEditable;\n    };\n\n    /**\n     * exposes _handleKey publicly so it can be overwritten by extensions\n     */\n    Mousetrap.prototype.handleKey = function() {\n        var self = this;\n        return self._handleKey.apply(self, arguments);\n    };\n\n    /**\n     * Init the global mousetrap functions\n     *\n     * This method is needed to allow the global mousetrap functions to work\n     * now that mousetrap is a constructor function.\n     */\n    Mousetrap.init = function() {\n        var documentMousetrap = Mousetrap(document);\n        for (var method in documentMousetrap) {\n            if (method.charAt(0) !== '_') {\n                Mousetrap[method] = (function(method) {\n                    return function() {\n                        return documentMousetrap[method].apply(documentMousetrap, arguments);\n                    };\n                } (method));\n            }\n        }\n    };\n\n    Mousetrap.init();\n\n    // expose mousetrap to the global object\n    window.Mousetrap = Mousetrap;\n\n    // expose as a common js module\n    if (typeof module !== 'undefined' && module.exports) {\n        module.exports = Mousetrap;\n    }\n\n    // expose mousetrap as an AMD module\n    if (typeof define === 'function' && define.amd) {\n        define(function() {\n            return Mousetrap;\n        });\n    }\n}) (window, document);\n\n/**\n * angular barcode\n * @version v0.0.4 - 2016-02-11 * @link https://github.com/ryanmc2033/angular-barcode\n * @author Ryan McLaughlin <ryanmc@justechn.com>\n * @license MIT License, http://www.opensource.org/licenses/MIT\n */\n angular.module(\"barcode\",[]).directive(\"barcode\",[\"BarcodeService\",\"Code39Service\",\"Code128BService\",\"Code128CService\",\"EanService\",\"Itf14NumberService\",\"ItfNumberService\",\"UpcService\",function(a,b,c,d,e,f,g,h){function i(i,j,k){var l={width:2,height:100,quite:10,displayValue:!1,font:\"monospace\",textAlign:\"center\",fontSize:12,backgroundColor:\"\",lineColor:\"#000\"},m=[];m=a.merge(l,i.options);var n=j.find(\"canvas\")[0];if(\"img\"==k.render&&(n=document.createElement(\"canvas\")),!n.getContext)return null;var o=\"\";switch(k.type){case\"upc\":o=h;break;case\"ean\":o=e;break;case\"code39\":o=b;break;case\"code128b\":o=c;break;case\"code128c\":o=d;break;case\"itf\":o=g;break;case\"itf14\":o=f}if(\"\"!==o){var p=o.encoded(k.string);if(!angular.isUndefined(p)){var q=function(a){var b,c;c=m.height,r.font=m.fontSize+\"px \"+m.font,r.textBaseline=\"bottom\",r.textBaseline=\"top\",\"left\"==m.textAlign?(b=m.quite,r.textAlign=\"left\"):\"right\"==m.textAlign?(b=n.width-m.quite,r.textAlign=\"right\"):(b=n.width/2,r.textAlign=\"center\"),r.fillText(a,b,c)},r=n.getContext(\"2d\");n.width=p.length*m.width+2*m.quite,n.height=m.height+(m.displayValue?1.3*m.fontSize:0),r.clearRect(0,0,n.width,n.height),m.backgroundColor&&(r.fillStyle=m.backgroundColor,r.fillRect(0,0,n.width,n.height)),r.fillStyle=m.lineColor;for(var s=0;s<p.length;s++){var t=s*m.width+m.quite;\"1\"==p[s]&&r.fillRect(t,0,m.width,m.height)}if(m.displayValue&&q(k.string),\"img\"==k.render){var u=n.toDataURL(\"image/png\"),v=j.find(\"img\")[0];v.setAttribute(\"src\",u)}}}}function j(a,b,c){c.$observe(\"string\",function(){i(a,b,c)})}function k(a,b){var c=\"<canvas>\";return\"img\"==b.render&&(c=\"<img>\"),a.append(c),{post:j}}return{restrict:\"E\",scope:{options:\"=options\"},compile:k}}]),angular.module(\"barcode\").factory(\"BarcodeService\",[function(){\"use strict\";var a={};return a.merge=function(a,b){var c={};for(var d in a)c[d]=a[d];for(var e in b)c[e]=b[e];return c},a}]),angular.module(\"barcode\").factory(\"Code128Service\",[function(){\"use strict\";var a={},b=[[\" \",\"11011001100\",0],[\"!\",\"11001101100\",1],['\"',\"11001100110\",2],[\"#\",\"10010011000\",3],[\"$\",\"10010001100\",4],[\"%\",\"10001001100\",5],[\"&\",\"10011001000\",6],[\"'\",\"10011000100\",7],[\"(\",\"10001100100\",8],[\")\",\"11001001000\",9],[\"*\",\"11001000100\",10],[\"+\",\"11000100100\",11],[\",\",\"10110011100\",12],[\"-\",\"10011011100\",13],[\".\",\"10011001110\",14],[\"/\",\"10111001100\",15],[\"0\",\"10011101100\",16],[\"1\",\"10011100110\",17],[\"2\",\"11001110010\",18],[\"3\",\"11001011100\",19],[\"4\",\"11001001110\",20],[\"5\",\"11011100100\",21],[\"6\",\"11001110100\",22],[\"7\",\"11101101110\",23],[\"8\",\"11101001100\",24],[\"9\",\"11100101100\",25],[\":\",\"11100100110\",26],[\";\",\"11101100100\",27],[\"<\",\"11100110100\",28],[\"=\",\"11100110010\",29],[\">\",\"11011011000\",30],[\"?\",\"11011000110\",31],[\"@\",\"11000110110\",32],[\"A\",\"10100011000\",33],[\"B\",\"10001011000\",34],[\"C\",\"10001000110\",35],[\"D\",\"10110001000\",36],[\"E\",\"10001101000\",37],[\"F\",\"10001100010\",38],[\"G\",\"11010001000\",39],[\"H\",\"11000101000\",40],[\"I\",\"11000100010\",41],[\"J\",\"10110111000\",42],[\"K\",\"10110001110\",43],[\"L\",\"10001101110\",44],[\"M\",\"10111011000\",45],[\"N\",\"10111000110\",46],[\"O\",\"10001110110\",47],[\"P\",\"11101110110\",48],[\"Q\",\"11010001110\",49],[\"R\",\"11000101110\",50],[\"S\",\"11011101000\",51],[\"T\",\"11011100010\",52],[\"U\",\"11011101110\",53],[\"V\",\"11101011000\",54],[\"W\",\"11101000110\",55],[\"X\",\"11100010110\",56],[\"Y\",\"11101101000\",57],[\"Z\",\"11101100010\",58],[\"[\",\"11100011010\",59],[\"\\\\\",\"11101111010\",60],[\"]\",\"11001000010\",61],[\"^\",\"11110001010\",62],[\"_\",\"10100110000\",63],[\"`\",\"10100001100\",64],[\"a\",\"10010110000\",65],[\"b\",\"10010000110\",66],[\"c\",\"10000101100\",67],[\"d\",\"10000100110\",68],[\"e\",\"10110010000\",69],[\"f\",\"10110000100\",70],[\"g\",\"10011010000\",71],[\"h\",\"10011000010\",72],[\"i\",\"10000110100\",73],[\"j\",\"10000110010\",74],[\"k\",\"11000010010\",75],[\"l\",\"11001010000\",76],[\"m\",\"11110111010\",77],[\"n\",\"11000010100\",78],[\"o\",\"10001111010\",79],[\"p\",\"10100111100\",80],[\"q\",\"10010111100\",81],[\"r\",\"10010011110\",82],[\"s\",\"10111100100\",83],[\"t\",\"10011110100\",84],[\"u\",\"10011110010\",85],[\"v\",\"11110100100\",86],[\"w\",\"11110010100\",87],[\"x\",\"11110010010\",88],[\"y\",\"11011011110\",89],[\"z\",\"11011110110\",90],[\"{\",\"11110110110\",91],[\"|\",\"10101111000\",92],[\"}\",\"10100011110\",93],[\"~\",\"10001011110\",94],[String.fromCharCode(127),\"10111101000\",95],[String.fromCharCode(128),\"10111100010\",96],[String.fromCharCode(129),\"11110101000\",97],[String.fromCharCode(130),\"11110100010\",98],[String.fromCharCode(131),\"10111011110\",99],[String.fromCharCode(132),\"10111101110\",100],[String.fromCharCode(133),\"11101011110\",101],[String.fromCharCode(134),\"11110101110\",102],[String.fromCharCode(135),\"11010000100\",103],[String.fromCharCode(136),\"11010010000\",104],[String.fromCharCode(137),\"11010011100\",105]],c=\"1100011101011\",d=/^[!-~ ]+$/;return a.valid=function(a){return-1==a.search(d)?!1:!0},a.calculateCode128=function(b,d,e,f){var g=\"\";return g+=a.encodingById(e),g+=d(b),g+=a.encodingById(f(b,e)),g+=c},a.encodingById=function(a){for(var c=0;c<b.length;c++)if(b[c][2]==a)return b[c][1];return\"\"},a.weightByCharacter=function(a){for(var c=0;c<b.length;c++)if(b[c][0]==a)return b[c][2];return 0},a.encodingByChar=function(a){for(var c=0;c<b.length;c++)if(b[c][0]==a)return b[c][1];return\"\"},a}]),angular.module(\"barcode\").factory(\"Code128BService\",[\"Code128Service\",function(a){\"use strict\";function b(b){for(var c=\"\",d=0;d<b.length;d++)c+=a.encodingByChar(b[d]);return c}function c(b,c){for(var d=0,e=0;e<b.length;e++)d+=a.weightByCharacter(b[e])*(e+1);return(d+c)%103}var d={};return d.valid=function(b){return a.valid(b)},d.encoded=function(e){return d.valid(e)?a.calculateCode128(e,b,104,c):\"\"},d}]),angular.module(\"barcode\").factory(\"Code128CService\",[\"Code128Service\",function(a){\"use strict\";function b(b){for(var c=\"\",d=0;d<b.length;d+=2)c+=a.encodingById(parseInt(b.substr(d,2)));return c}function c(a,b){for(var c=0,d=1,e=0;e<a.length;e+=2)c+=parseInt(a.substr(e,2))*d,d++;return(c+b)%103}var d={};return d.valid=function(b){return a.valid(b)},d.encoded=function(e){return d.valid(e)?(e=e.replace(/ /g,\"\"),a.calculateCode128(e,b,105,c)):\"\"},d}]),angular.module(\"barcode\").factory(\"Code39Service\",[function(){\"use strict\";function a(a){return-1==a.search(f)?!1:!0}function b(a){a=a.toUpperCase();var b=\"\";b+=\"1000101110111010\";for(var d=0;d<a.length;d++)b+=c(a[d])+\"0\";return b+=\"1000101110111010\"}function c(a){for(var b=0;b<e.length;b++)if(e[b][1]==a)return e[b][2];return\"\"}var d={},e=[[0,\"0\",\"101000111011101\"],[1,\"1\",\"111010001010111\"],[2,\"2\",\"101110001010111\"],[3,\"3\",\"111011100010101\"],[4,\"4\",\"101000111010111\"],[5,\"5\",\"111010001110101\"],[6,\"6\",\"101110001110101\"],[7,\"7\",\"101000101110111\"],[8,\"8\",\"111010001011101\"],[9,\"9\",\"101110001011101\"],[10,\"A\",\"111010100010111\"],[11,\"B\",\"101110100010111\"],[12,\"C\",\"111011101000101\"],[13,\"D\",\"101011100010111\"],[14,\"E\",\"111010111000101\"],[15,\"F\",\"101110111000101\"],[16,\"G\",\"101010001110111\"],[17,\"H\",\"111010100011101\"],[18,\"I\",\"101110100011101\"],[19,\"J\",\"101011100011101\"],[20,\"K\",\"111010101000111\"],[21,\"L\",\"101110101000111\"],[22,\"M\",\"111011101010001\"],[23,\"N\",\"101011101000111\"],[24,\"O\",\"111010111010001\"],[25,\"P\",\"101110111010001\"],[26,\"Q\",\"101010111000111\"],[27,\"R\",\"111010101110001\"],[28,\"S\",\"101110101110001\"],[29,\"T\",\"101011101110001\"],[30,\"U\",\"111000101010111\"],[31,\"V\",\"100011101010111\"],[32,\"W\",\"111000111010101\"],[33,\"X\",\"100010111010111\"],[34,\"Y\",\"111000101110101\"],[35,\"Z\",\"100011101110101\"],[36,\"-\",\"100010101110111\"],[37,\".\",\"111000101011101\"],[38,\" \",\"100011101011101\"],[39,\"$\",\"100010001000101\"],[40,\"/\",\"100010001010001\"],[41,\"+\",\"100010100010001\"],[42,\"%\",\"101000100010001\"]];d.valid=function(b){return a(b)},d.encoded=function(c){return a(c)?b(c):\"\"};var f=/^[0-9a-zA-Z\\-\\.\\ \\$\\/\\+\\%]+$/;return d}]),angular.module(\"barcode\").factory(\"EanService\",[function(){\"use strict\";function a(a){var c=\"\",d=a[0],e=a.substr(1,7),f=a.substr(7,6);return c+=j,c+=b(e,i[d]),c+=l,c+=b(f,\"RRRRRR\"),c+=k}function b(a,b){for(var c=\"\",d=0;d<a.length;d++)\"L\"==b[d]?c+=f[a[d]]:\"G\"==b[d]?c+=g[a[d]]:\"R\"==b[d]&&(c+=h[a[d]]);return c}function c(a){for(var b=0,c=0;12>c;c+=2)b+=parseInt(a[c]);for(var d=1;12>d;d+=2)b+=3*parseInt(a[d]);return(10-b%10)%10}function d(a){return-1==a.search(m)?!1:a[12]==c(a)}var e={};e.valid=function(a){return d(a)},e.encoded=function(b){return d(b)?a(b):\"\"};var f={0:\"0001101\",1:\"0011001\",2:\"0010011\",3:\"0111101\",4:\"0100011\",5:\"0110001\",6:\"0101111\",7:\"0111011\",8:\"0110111\",9:\"0001011\"},g={0:\"0100111\",1:\"0110011\",2:\"0011011\",3:\"0100001\",4:\"0011101\",5:\"0111001\",6:\"0000101\",7:\"0010001\",8:\"0001001\",9:\"0010111\"},h={0:\"1110010\",1:\"1100110\",2:\"1101100\",3:\"1000010\",4:\"1011100\",5:\"1001110\",6:\"1010000\",7:\"1000100\",8:\"1001000\",9:\"1110100\"},i={0:\"LLLLLL\",1:\"LLGLGG\",2:\"LLGGLG\",3:\"LLGGGL\",4:\"LGLLGG\",5:\"LGGLLG\",6:\"LGGGLL\",7:\"LGLGLG\",8:\"LGLGGL\",9:\"LGGLGL\"},j=\"101\",k=\"101\",l=\"01010\",m=/^[0-9]{13}$/;return e}]),angular.module(\"barcode\").factory(\"Itf14NumberService\",[function(){\"use strict\";function a(a){var d=\"\";13==a.length&&(a+=c(a)),d+=g;for(var e=0;14>e;e+=2)d+=b(a.substr(e,2));return d+=h}function b(a){for(var b=\"\",c=f[a[0]],d=f[a[1]],e=0;5>e;e++)b+=\"1\"==c[e]?\"111\":\"1\",b+=\"1\"==d[e]?\"000\":\"0\";return b}function c(a){for(var b=0,c=0;13>c;c++)b+=parseInt(a[c])*(3-c%2*2);return 10-b%10}function d(a){return-1==a.search(i)?!1:14==a.length?a[13]==c(a):!0}var e={};e.valid=function(a){return d(a)},e.encoded=function(b){return d(b)?a(b):\"\"};var f={0:\"00110\",1:\"10001\",2:\"01001\",3:\"11000\",4:\"00101\",5:\"10100\",6:\"01100\",7:\"00011\",8:\"10010\",9:\"01010\"},g=\"1010\",h=\"11101\",i=/^[0-9]{13,14}$/;return e}]),angular.module(\"barcode\").factory(\"ItfNumberService\",[function(){\"use strict\";function a(a){var c=\"\";c+=f;for(var d=0;d<a.length;d+=2)c+=b(a.substr(d,2));return c+=g}function b(a){for(var b=\"\",c=e[a[0]],d=e[a[1]],f=0;5>f;f++)b+=\"1\"==c[f]?\"111\":\"1\",b+=\"1\"==d[f]?\"000\":\"0\";return b}function c(a){return-1!==a.search(h)}var d={};d.valid=function(a){return c(a)},d.encoded=function(b){return c(b)?a(b):\"\"};var e={0:\"00110\",1:\"10001\",2:\"01001\",3:\"11000\",4:\"00101\",5:\"10100\",6:\"01100\",7:\"00011\",8:\"10010\",9:\"01010\"},f=\"1010\",g=\"11101\",h=/^([0-9][0-9])+$/;return d}]),angular.module(\"barcode\").factory(\"UpcService\",[function(){\"use strict\";function a(a){var c=\"\",d=a[0],e=a.substr(1,7),f=a.substr(7,6);return c+=j,c+=b(e,i[d]),c+=l,c+=b(f,\"RRRRRR\"),c+=k}function b(a,b){for(var c=\"\",d=0;d<a.length;d++)\"L\"==b[d]?c+=f[a[d]]:\"G\"==b[d]?c+=g[a[d]]:\"R\"==b[d]&&(c+=h[a[d]]);return c}function c(a){for(var b=0,c=0;12>c;c+=2)b+=parseInt(a[c]);for(var d=1;12>d;d+=2)b+=3*parseInt(a[d]);return(10-b%10)%10}function d(a){return-1==a.search(m)?!1:a[12]==c(a)}var e={};e.valid=function(a){return d(\"0\"+a)},e.encoded=function(b){return d(\"0\"+b)?a(\"0\"+b):\"\"};var f={0:\"0001101\",1:\"0011001\",2:\"0010011\",3:\"0111101\",4:\"0100011\",5:\"0110001\",6:\"0101111\",7:\"0111011\",8:\"0110111\",9:\"0001011\"},g={0:\"0100111\",1:\"0110011\",2:\"0011011\",3:\"0100001\",4:\"0011101\",5:\"0111001\",6:\"0000101\",7:\"0010001\",8:\"0001001\",9:\"0010111\"},h={0:\"1110010\",1:\"1100110\",2:\"1101100\",3:\"1000010\",4:\"1011100\",5:\"1001110\",6:\"1010000\",7:\"1000100\",8:\"1001000\",9:\"1110100\"},i={0:\"LLLLLL\",1:\"LLGLGG\",2:\"LLGGLG\",3:\"LLGGGL\",4:\"LGLLGG\",5:\"LGGLLG\",6:\"LGGGLL\",7:\"LGLGLG\",8:\"LGLGGL\",9:\"LGGLGL\"},j=\"101\",k=\"101\",l=\"01010\",m=/^[0-9]{13}$/;return e}]);\n/*! JsBarcode v3.12.3 | (c) Johan Lindell | MIT license */\n!function(t){var e={};function n(r){if(e[r])return e[r].exports;var o=e[r]={i:r,l:!1,exports:{}};return t[r].call(o.exports,o,o.exports,n),o.l=!0,o.exports}n.m=t,n.c=e,n.d=function(t,e,r){n.o(t,e)||Object.defineProperty(t,e,{enumerable:!0,get:r})},n.r=function(t){\"undefined\"!=typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(t,Symbol.toStringTag,{value:\"Module\"}),Object.defineProperty(t,\"__esModule\",{value:!0})},n.t=function(t,e){if(1&e&&(t=n(t)),8&e)return t;if(4&e&&\"object\"==typeof t&&t&&t.__esModule)return t;var r=Object.create(null);if(n.r(r),Object.defineProperty(r,\"default\",{enumerable:!0,value:t}),2&e&&\"string\"!=typeof t)for(var o in t)n.d(r,o,function(e){return t[e]}.bind(null,o));return r},n.n=function(t){var e=t&&t.__esModule?function(){return t.default}:function(){return t};return n.d(e,\"a\",e),e},n.o=function(t,e){return Object.prototype.hasOwnProperty.call(t,e)},n.p=\"\",n(n.s=16)}([function(t,e,n){\"use strict\";Object.defineProperty(e,\"__esModule\",{value:!0});e.default=function t(e,n){!function(t,e){if(!(t instanceof e))throw new TypeError(\"Cannot call a class as a function\")}(this,t),this.data=e,this.text=n.text||e,this.options=n}},function(t,e,n){\"use strict\";var r;function o(t,e,n){return e in t?Object.defineProperty(t,e,{value:n,enumerable:!0,configurable:!0,writable:!0}):t[e]=n,t}Object.defineProperty(e,\"__esModule\",{value:!0});var i=e.SET_A=0,a=e.SET_B=1,u=e.SET_C=2,f=(e.SHIFT=98,e.START_A=103),c=e.START_B=104,s=e.START_C=105;e.MODULO=103,e.STOP=106,e.FNC1=207,e.SET_BY_CODE=(o(r={},f,i),o(r,c,a),o(r,s,u),r),e.SWAP={101:i,100:a,99:u},e.A_START_CHAR=String.fromCharCode(208),e.B_START_CHAR=String.fromCharCode(209),e.C_START_CHAR=String.fromCharCode(210),e.A_CHARS=\"[\\0-_È-Ï]\",e.B_CHARS=\"[ -È-Ï]\",e.C_CHARS=\"(Ï*[0-9]{2}Ï*)\",e.BARS=[11011001100,11001101100,11001100110,10010011e3,10010001100,10001001100,10011001e3,10011000100,10001100100,11001001e3,11001000100,11000100100,10110011100,10011011100,10011001110,10111001100,10011101100,10011100110,11001110010,11001011100,11001001110,11011100100,11001110100,11101101110,11101001100,11100101100,11100100110,11101100100,11100110100,11100110010,11011011e3,11011000110,11000110110,10100011e3,10001011e3,10001000110,10110001e3,10001101e3,10001100010,11010001e3,11000101e3,11000100010,10110111e3,10110001110,10001101110,10111011e3,10111000110,10001110110,11101110110,11010001110,11000101110,11011101e3,11011100010,11011101110,11101011e3,11101000110,11100010110,11101101e3,11101100010,11100011010,11101111010,11001000010,11110001010,1010011e4,10100001100,1001011e4,10010000110,10000101100,10000100110,1011001e4,10110000100,1001101e4,10011000010,10000110100,10000110010,11000010010,1100101e4,11110111010,11000010100,10001111010,10100111100,10010111100,10010011110,10111100100,10011110100,10011110010,11110100100,11110010100,11110010010,11011011110,11011110110,11110110110,10101111e3,10100011110,10001011110,10111101e3,10111100010,11110101e3,11110100010,10111011110,10111101110,11101011110,11110101110,11010000100,1101001e4,11010011100,1100011101011]},function(t,e,n){\"use strict\";Object.defineProperty(e,\"__esModule\",{value:!0});e.SIDE_BIN=\"101\",e.MIDDLE_BIN=\"01010\",e.BINARIES={L:[\"0001101\",\"0011001\",\"0010011\",\"0111101\",\"0100011\",\"0110001\",\"0101111\",\"0111011\",\"0110111\",\"0001011\"],G:[\"0100111\",\"0110011\",\"0011011\",\"0100001\",\"0011101\",\"0111001\",\"0000101\",\"0010001\",\"0001001\",\"0010111\"],R:[\"1110010\",\"1100110\",\"1101100\",\"1000010\",\"1011100\",\"1001110\",\"1010000\",\"1000100\",\"1001000\",\"1110100\"],O:[\"0001101\",\"0011001\",\"0010011\",\"0111101\",\"0100011\",\"0110001\",\"0101111\",\"0111011\",\"0110111\",\"0001011\"],E:[\"0100111\",\"0110011\",\"0011011\",\"0100001\",\"0011101\",\"0111001\",\"0000101\",\"0010001\",\"0001001\",\"0010111\"]},e.EAN2_STRUCTURE=[\"LL\",\"LG\",\"GL\",\"GG\"],e.EAN5_STRUCTURE=[\"GGLLL\",\"GLGLL\",\"GLLGL\",\"GLLLG\",\"LGGLL\",\"LLGGL\",\"LLLGG\",\"LGLGL\",\"LGLLG\",\"LLGLG\"],e.EAN13_STRUCTURE=[\"LLLLLL\",\"LLGLGG\",\"LLGGLG\",\"LLGGGL\",\"LGLLGG\",\"LGGLLG\",\"LGGGLL\",\"LGLGLG\",\"LGLGGL\",\"LGGLGL\"]},function(t,e,n){\"use strict\";Object.defineProperty(e,\"__esModule\",{value:!0});var r=n(2);e.default=function(t,e,n){var o=t.split(\"\").map((function(t,n){return r.BINARIES[e[n]]})).map((function(e,n){return e?e[t[n]]:\"\"}));if(n){var i=t.length-1;o=o.map((function(t,e){return e<i?t+n:t}))}return o.join(\"\")}},function(t,e,n){\"use strict\";Object.defineProperty(e,\"__esModule\",{value:!0});var r,o=function(){function t(t,e){for(var n=0;n<e.length;n++){var r=e[n];r.enumerable=r.enumerable||!1,r.configurable=!0,\"value\"in r&&(r.writable=!0),Object.defineProperty(t,r.key,r)}}return function(e,n,r){return n&&t(e.prototype,n),r&&t(e,r),e}}(),i=n(0);var a=function(t){function e(t,n){return function(t,e){if(!(t instanceof e))throw new TypeError(\"Cannot call a class as a function\")}(this,e),function(t,e){if(!t)throw new ReferenceError(\"this hasn't been initialised - super() hasn't been called\");return!e||\"object\"!=typeof e&&\"function\"!=typeof e?t:e}(this,(e.__proto__||Object.getPrototypeOf(e)).call(this,t,n))}return function(t,e){if(\"function\"!=typeof e&&null!==e)throw new TypeError(\"Super expression must either be null or a function, not \"+typeof e);t.prototype=Object.create(e&&e.prototype,{constructor:{value:t,enumerable:!1,writable:!0,configurable:!0}}),e&&(Object.setPrototypeOf?Object.setPrototypeOf(t,e):t.__proto__=e)}(e,t),o(e,[{key:\"encode\",value:function(){for(var t=\"110\",e=0;e<this.data.length;e++){var n=parseInt(this.data[e]).toString(2);n=u(n,4-n.length);for(var r=0;r<n.length;r++)t+=\"0\"==n[r]?\"100\":\"110\"}return{data:t+=\"1001\",text:this.text}}},{key:\"valid\",value:function(){return-1!==this.data.search(/^[0-9]+$/)}}]),e}(((r=i)&&r.__esModule?r:{default:r}).default);function u(t,e){for(var n=0;n<e;n++)t=\"0\"+t;return t}e.default=a},function(t,e,n){\"use strict\";Object.defineProperty(e,\"__esModule\",{value:!0});var r,o=function(){function t(t,e){for(var n=0;n<e.length;n++){var r=e[n];r.enumerable=r.enumerable||!1,r.configurable=!0,\"value\"in r&&(r.writable=!0),Object.defineProperty(t,r.key,r)}}return function(e,n,r){return n&&t(e.prototype,n),r&&t(e,r),e}}(),i=n(0),a=(r=i)&&r.__esModule?r:{default:r},u=n(1);var f=function(t){function e(t,n){!function(t,e){if(!(t instanceof e))throw new TypeError(\"Cannot call a class as a function\")}(this,e);var r=function(t,e){if(!t)throw new ReferenceError(\"this hasn't been initialised - super() hasn't been called\");return!e||\"object\"!=typeof e&&\"function\"!=typeof e?t:e}(this,(e.__proto__||Object.getPrototypeOf(e)).call(this,t.substring(1),n));return r.bytes=t.split(\"\").map((function(t){return t.charCodeAt(0)})),r}return function(t,e){if(\"function\"!=typeof e&&null!==e)throw new TypeError(\"Super expression must either be null or a function, not \"+typeof e);t.prototype=Object.create(e&&e.prototype,{constructor:{value:t,enumerable:!1,writable:!0,configurable:!0}}),e&&(Object.setPrototypeOf?Object.setPrototypeOf(t,e):t.__proto__=e)}(e,t),o(e,[{key:\"valid\",value:function(){return/^[\\x00-\\x7F\\xC8-\\xD3]+$/.test(this.data)}},{key:\"encode\",value:function(){var t=this.bytes,n=t.shift()-105,r=u.SET_BY_CODE[n];if(void 0===r)throw new RangeError(\"The encoding does not start with a start character.\");!0===this.shouldEncodeAsEan128()&&t.unshift(u.FNC1);var o=e.next(t,1,r);return{text:this.text===this.data?this.text.replace(/[^\\x20-\\x7E]/g,\"\"):this.text,data:e.getBar(n)+o.result+e.getBar((o.checksum+n)%u.MODULO)+e.getBar(u.STOP)}}},{key:\"shouldEncodeAsEan128\",value:function(){var t=this.options.ean128||!1;return\"string\"==typeof t&&(t=\"true\"===t.toLowerCase()),t}}],[{key:\"getBar\",value:function(t){return u.BARS[t]?u.BARS[t].toString():\"\"}},{key:\"correctIndex\",value:function(t,e){if(e===u.SET_A){var n=t.shift();return n<32?n+64:n-32}return e===u.SET_B?t.shift()-32:10*(t.shift()-48)+t.shift()-48}},{key:\"next\",value:function(t,n,r){if(!t.length)return{result:\"\",checksum:0};var o=void 0,i=void 0;if(t[0]>=200){i=t.shift()-105;var a=u.SWAP[i];void 0!==a?o=e.next(t,n+1,a):(r!==u.SET_A&&r!==u.SET_B||i!==u.SHIFT||(t[0]=r===u.SET_A?t[0]>95?t[0]-96:t[0]:t[0]<32?t[0]+96:t[0]),o=e.next(t,n+1,r))}else i=e.correctIndex(t,r),o=e.next(t,n+1,r);var f=i*n;return{result:e.getBar(i)+o.result,checksum:f+o.checksum}}}]),e}(a.default);e.default=f},function(t,e,n){\"use strict\";Object.defineProperty(e,\"__esModule\",{value:!0}),e.mod10=function(t){for(var e=0,n=0;n<t.length;n++){var r=parseInt(t[n]);(n+t.length)%2==0?e+=r:e+=2*r%10+Math.floor(2*r/10)}return(10-e%10)%10},e.mod11=function(t){for(var e=0,n=[2,3,4,5,6,7],r=0;r<t.length;r++){var o=parseInt(t[t.length-1-r]);e+=n[r%n.length]*o}return(11-e%11)%11}},function(t,e,n){\"use strict\";Object.defineProperty(e,\"__esModule\",{value:!0});var r=Object.assign||function(t){for(var e=1;e<arguments.length;e++){var n=arguments[e];for(var r in n)Object.prototype.hasOwnProperty.call(n,r)&&(t[r]=n[r])}return t};e.default=function(t,e){return r({},t,e)}},function(t,e,n){\"use strict\";Object.defineProperty(e,\"__esModule\",{value:!0});var r=function(){function t(t,e){for(var n=0;n<e.length;n++){var r=e[n];r.enumerable=r.enumerable||!1,r.configurable=!0,\"value\"in r&&(r.writable=!0),Object.defineProperty(t,r.key,r)}}return function(e,n,r){return n&&t(e.prototype,n),r&&t(e,r),e}}(),o=n(2),i=a(n(3));function a(t){return t&&t.__esModule?t:{default:t}}var u=function(t){function e(t,n){!function(t,e){if(!(t instanceof e))throw new TypeError(\"Cannot call a class as a function\")}(this,e);var r=function(t,e){if(!t)throw new ReferenceError(\"this hasn't been initialised - super() hasn't been called\");return!e||\"object\"!=typeof e&&\"function\"!=typeof e?t:e}(this,(e.__proto__||Object.getPrototypeOf(e)).call(this,t,n));return r.fontSize=!n.flat&&n.fontSize>10*n.width?10*n.width:n.fontSize,r.guardHeight=n.height+r.fontSize/2+n.textMargin,r}return function(t,e){if(\"function\"!=typeof e&&null!==e)throw new TypeError(\"Super expression must either be null or a function, not \"+typeof e);t.prototype=Object.create(e&&e.prototype,{constructor:{value:t,enumerable:!1,writable:!0,configurable:!0}}),e&&(Object.setPrototypeOf?Object.setPrototypeOf(t,e):t.__proto__=e)}(e,t),r(e,[{key:\"encode\",value:function(){return this.options.flat?this.encodeFlat():this.encodeGuarded()}},{key:\"leftText\",value:function(t,e){return this.text.substr(t,e)}},{key:\"leftEncode\",value:function(t,e){return(0,i.default)(t,e)}},{key:\"rightText\",value:function(t,e){return this.text.substr(t,e)}},{key:\"rightEncode\",value:function(t,e){return(0,i.default)(t,e)}},{key:\"encodeGuarded\",value:function(){var t={fontSize:this.fontSize},e={height:this.guardHeight};return[{data:o.SIDE_BIN,options:e},{data:this.leftEncode(),text:this.leftText(),options:t},{data:o.MIDDLE_BIN,options:e},{data:this.rightEncode(),text:this.rightText(),options:t},{data:o.SIDE_BIN,options:e}]}},{key:\"encodeFlat\",value:function(){return{data:[o.SIDE_BIN,this.leftEncode(),o.MIDDLE_BIN,this.rightEncode(),o.SIDE_BIN].join(\"\"),text:this.text}}}]),e}(a(n(0)).default);e.default=u},function(t,e,n){\"use strict\";Object.defineProperty(e,\"__esModule\",{value:!0});var r=function(){function t(t,e){for(var n=0;n<e.length;n++){var r=e[n];r.enumerable=r.enumerable||!1,r.configurable=!0,\"value\"in r&&(r.writable=!0),Object.defineProperty(t,r.key,r)}}return function(e,n,r){return n&&t(e.prototype,n),r&&t(e,r),e}}();e.checksum=u;var o=i(n(3));function i(t){return t&&t.__esModule?t:{default:t}}var a=function(t){function e(t,n){!function(t,e){if(!(t instanceof e))throw new TypeError(\"Cannot call a class as a function\")}(this,e),-1!==t.search(/^[0-9]{11}$/)&&(t+=u(t));var r=function(t,e){if(!t)throw new ReferenceError(\"this hasn't been initialised - super() hasn't been called\");return!e||\"object\"!=typeof e&&\"function\"!=typeof e?t:e}(this,(e.__proto__||Object.getPrototypeOf(e)).call(this,t,n));return r.displayValue=n.displayValue,n.fontSize>10*n.width?r.fontSize=10*n.width:r.fontSize=n.fontSize,r.guardHeight=n.height+r.fontSize/2+n.textMargin,r}return function(t,e){if(\"function\"!=typeof e&&null!==e)throw new TypeError(\"Super expression must either be null or a function, not \"+typeof e);t.prototype=Object.create(e&&e.prototype,{constructor:{value:t,enumerable:!1,writable:!0,configurable:!0}}),e&&(Object.setPrototypeOf?Object.setPrototypeOf(t,e):t.__proto__=e)}(e,t),r(e,[{key:\"valid\",value:function(){return-1!==this.data.search(/^[0-9]{12}$/)&&this.data[11]==u(this.data)}},{key:\"encode\",value:function(){return this.options.flat?this.flatEncoding():this.guardedEncoding()}},{key:\"flatEncoding\",value:function(){var t=\"\";return t+=\"101\",t+=(0,o.default)(this.data.substr(0,6),\"LLLLLL\"),t+=\"01010\",t+=(0,o.default)(this.data.substr(6,6),\"RRRRRR\"),{data:t+=\"101\",text:this.text}}},{key:\"guardedEncoding\",value:function(){var t=[];return this.displayValue&&t.push({data:\"00000000\",text:this.text.substr(0,1),options:{textAlign:\"left\",fontSize:this.fontSize}}),t.push({data:\"101\"+(0,o.default)(this.data[0],\"L\"),options:{height:this.guardHeight}}),t.push({data:(0,o.default)(this.data.substr(1,5),\"LLLLL\"),text:this.text.substr(1,5),options:{fontSize:this.fontSize}}),t.push({data:\"01010\",options:{height:this.guardHeight}}),t.push({data:(0,o.default)(this.data.substr(6,5),\"RRRRR\"),text:this.text.substr(6,5),options:{fontSize:this.fontSize}}),t.push({data:(0,o.default)(this.data[11],\"R\")+\"101\",options:{height:this.guardHeight}}),this.displayValue&&t.push({data:\"00000000\",text:this.text.substr(11,1),options:{textAlign:\"right\",fontSize:this.fontSize}}),t}}]),e}(i(n(0)).default);function u(t){var e,n=0;for(e=1;e<11;e+=2)n+=parseInt(t[e]);for(e=0;e<11;e+=2)n+=3*parseInt(t[e]);return(10-n%10)%10}e.default=a},function(t,e,n){\"use strict\";Object.defineProperty(e,\"__esModule\",{value:!0});var r,o=function(){function t(t,e){for(var n=0;n<e.length;n++){var r=e[n];r.enumerable=r.enumerable||!1,r.configurable=!0,\"value\"in r&&(r.writable=!0),Object.defineProperty(t,r.key,r)}}return function(e,n,r){return n&&t(e.prototype,n),r&&t(e,r),e}}(),i=n(32),a=n(0);function u(t,e){if(!(t instanceof e))throw new TypeError(\"Cannot call a class as a function\")}function f(t,e){if(!t)throw new ReferenceError(\"this hasn't been initialised - super() hasn't been called\");return!e||\"object\"!=typeof e&&\"function\"!=typeof e?t:e}var c=function(t){function e(){return u(this,e),f(this,(e.__proto__||Object.getPrototypeOf(e)).apply(this,arguments))}return function(t,e){if(\"function\"!=typeof e&&null!==e)throw new TypeError(\"Super expression must either be null or a function, not \"+typeof e);t.prototype=Object.create(e&&e.prototype,{constructor:{value:t,enumerable:!1,writable:!0,configurable:!0}}),e&&(Object.setPrototypeOf?Object.setPrototypeOf(t,e):t.__proto__=e)}(e,t),o(e,[{key:\"valid\",value:function(){return-1!==this.data.search(/^([0-9]{2})+$/)}},{key:\"encode\",value:function(){var t=this,e=this.data.match(/.{2}/g).map((function(e){return t.encodePair(e)})).join(\"\");return{data:i.START_BIN+e+i.END_BIN,text:this.text}}},{key:\"encodePair\",value:function(t){var e=i.BINARIES[t[1]];return i.BINARIES[t[0]].split(\"\").map((function(t,n){return(\"1\"===t?\"111\":\"1\")+(\"1\"===e[n]?\"000\":\"0\")})).join(\"\")}}]),e}(((r=a)&&r.__esModule?r:{default:r}).default);e.default=c},function(t,e,n){\"use strict\";Object.defineProperty(e,\"__esModule\",{value:!0});var r,o=function(){function t(t,e){for(var n=0;n<e.length;n++){var r=e[n];r.enumerable=r.enumerable||!1,r.configurable=!0,\"value\"in r&&(r.writable=!0),Object.defineProperty(t,r.key,r)}}return function(e,n,r){return n&&t(e.prototype,n),r&&t(e,r),e}}(),i=n(42),a=n(0);var u=function(t){function e(t,n){return function(t,e){if(!(t instanceof e))throw new TypeError(\"Cannot call a class as a function\")}(this,e),function(t,e){if(!t)throw new ReferenceError(\"this hasn't been initialised - super() hasn't been called\");return!e||\"object\"!=typeof e&&\"function\"!=typeof e?t:e}(this,(e.__proto__||Object.getPrototypeOf(e)).call(this,t,n))}return function(t,e){if(\"function\"!=typeof e&&null!==e)throw new TypeError(\"Super expression must either be null or a function, not \"+typeof e);t.prototype=Object.create(e&&e.prototype,{constructor:{value:t,enumerable:!1,writable:!0,configurable:!0}}),e&&(Object.setPrototypeOf?Object.setPrototypeOf(t,e):t.__proto__=e)}(e,t),o(e,[{key:\"valid\",value:function(){return/^[0-9A-Z\\-. $/+%]+$/.test(this.data)}},{key:\"encode\",value:function(){var t=this.data.split(\"\").flatMap((function(t){return i.MULTI_SYMBOLS[t]||t})),n=t.map((function(t){return e.getEncoding(t)})).join(\"\"),r=e.checksum(t,20),o=e.checksum(t.concat(r),15);return{text:this.text,data:e.getEncoding(\"ÿ\")+n+e.getEncoding(r)+e.getEncoding(o)+e.getEncoding(\"ÿ\")+\"1\"}}}],[{key:\"getEncoding\",value:function(t){return i.BINARIES[e.symbolValue(t)]}},{key:\"getSymbol\",value:function(t){return i.SYMBOLS[t]}},{key:\"symbolValue\",value:function(t){return i.SYMBOLS.indexOf(t)}},{key:\"checksum\",value:function(t,n){var r=t.slice().reverse().reduce((function(t,r,o){var i=o%n+1;return t+e.symbolValue(r)*i}),0);return e.getSymbol(r%47)}}]),e}(((r=a)&&r.__esModule?r:{default:r}).default);e.default=u},function(t,e,n){\"use strict\";Object.defineProperty(e,\"__esModule\",{value:!0}),e.default=function(t){var e=[\"width\",\"height\",\"textMargin\",\"fontSize\",\"margin\",\"marginTop\",\"marginBottom\",\"marginLeft\",\"marginRight\"];for(var n in e)e.hasOwnProperty(n)&&(n=e[n],\"string\"==typeof t[n]&&(t[n]=parseInt(t[n],10)));\"string\"==typeof t.displayValue&&(t.displayValue=\"false\"!=t.displayValue);return t}},function(t,e,n){\"use strict\";Object.defineProperty(e,\"__esModule\",{value:!0});var r={width:2,height:100,format:\"auto\",displayValue:!0,fontOptions:\"\",font:\"monospace\",text:void 0,textAlign:\"center\",textPosition:\"bottom\",textMargin:2,fontSize:20,background:\"#ffffff\",lineColor:\"#000000\",margin:10,marginTop:void 0,marginBottom:void 0,marginLeft:void 0,marginRight:void 0,valid:function(){}};e.default=r},function(t,e,n){\"use strict\";Object.defineProperty(e,\"__esModule\",{value:!0}),e.getTotalWidthOfEncodings=e.calculateEncodingAttributes=e.getBarcodePadding=e.getEncodingHeight=e.getMaximumHeightOfEncodings=void 0;var r,o=n(7),i=(r=o)&&r.__esModule?r:{default:r};function a(t,e){return e.height+(e.displayValue&&t.text.length>0?e.fontSize+e.textMargin:0)+e.marginTop+e.marginBottom}function u(t,e,n){if(n.displayValue&&e<t){if(\"center\"==n.textAlign)return Math.floor((t-e)/2);if(\"left\"==n.textAlign)return 0;if(\"right\"==n.textAlign)return Math.floor(t-e)}return 0}function f(t,e,n){var r;if(n)r=n;else{if(\"undefined\"==typeof document)return 0;r=document.createElement(\"canvas\").getContext(\"2d\")}r.font=e.fontOptions+\" \"+e.fontSize+\"px \"+e.font;var o=r.measureText(t);return o?o.width:0}e.getMaximumHeightOfEncodings=function(t){for(var e=0,n=0;n<t.length;n++)t[n].height>e&&(e=t[n].height);return e},e.getEncodingHeight=a,e.getBarcodePadding=u,e.calculateEncodingAttributes=function(t,e,n){for(var r=0;r<t.length;r++){var o,c=t[r],s=(0,i.default)(e,c.options);o=s.displayValue?f(c.text,s,n):0;var l=c.data.length*s.width;c.width=Math.ceil(Math.max(o,l)),c.height=a(c,s),c.barcodePadding=u(o,l,s)}},e.getTotalWidthOfEncodings=function(t){for(var e=0,n=0;n<t.length;n++)e+=t[n].width;return e}},function(t,e,n){\"use strict\";function r(t,e){if(!(t instanceof e))throw new TypeError(\"Cannot call a class as a function\")}function o(t,e){if(!t)throw new ReferenceError(\"this hasn't been initialised - super() hasn't been called\");return!e||\"object\"!=typeof e&&\"function\"!=typeof e?t:e}function i(t,e){if(\"function\"!=typeof e&&null!==e)throw new TypeError(\"Super expression must either be null or a function, not \"+typeof e);t.prototype=Object.create(e&&e.prototype,{constructor:{value:t,enumerable:!1,writable:!0,configurable:!0}}),e&&(Object.setPrototypeOf?Object.setPrototypeOf(t,e):t.__proto__=e)}Object.defineProperty(e,\"__esModule\",{value:!0});var a=function(t){function e(t,n){r(this,e);var i=o(this,(e.__proto__||Object.getPrototypeOf(e)).call(this));return i.name=\"InvalidInputException\",i.symbology=t,i.input=n,i.message='\"'+i.input+'\" is not a valid input for '+i.symbology,i}return i(e,Error),e}(),u=function(t){function e(){r(this,e);var t=o(this,(e.__proto__||Object.getPrototypeOf(e)).call(this));return t.name=\"InvalidElementException\",t.message=\"Not supported type to render on\",t}return i(e,Error),e}(),f=function(t){function e(){r(this,e);var t=o(this,(e.__proto__||Object.getPrototypeOf(e)).call(this));return t.name=\"NoElementException\",t.message=\"No element to render on.\",t}return i(e,Error),e}();e.InvalidInputException=a,e.InvalidElementException=u,e.NoElementException=f},function(t,e,n){\"use strict\";var r=p(n(17)),o=p(n(7)),i=p(n(45)),a=p(n(46)),u=p(n(47)),f=p(n(12)),c=p(n(53)),s=n(15),l=p(n(13));function p(t){return t&&t.__esModule?t:{default:t}}var d=function(){},h=function(t,e,n){var r=new d;if(void 0===t)throw Error(\"No element to render on was provided.\");return r._renderProperties=(0,u.default)(t),r._encodings=[],r._options=l.default,r._errorHandler=new c.default(r),void 0!==e&&((n=n||{}).format||(n.format=_()),r.options(n)[n.format](e,n).render()),r};for(var y in h.getModule=function(t){return r.default[t]},r.default)r.default.hasOwnProperty(y)&&b(r.default,y);function b(t,e){d.prototype[e]=d.prototype[e.toUpperCase()]=d.prototype[e.toLowerCase()]=function(n,r){var i=this;return i._errorHandler.wrapBarcodeCall((function(){r.text=void 0===r.text?void 0:\"\"+r.text;var a=(0,o.default)(i._options,r);a=(0,f.default)(a);var u=t[e],c=v(n,u,a);return i._encodings.push(c),i}))}}function v(t,e,n){var r=new e(t=\"\"+t,n);if(!r.valid())throw new s.InvalidInputException(r.constructor.name,t);var a=r.encode();a=(0,i.default)(a);for(var u=0;u<a.length;u++)a[u].options=(0,o.default)(n,a[u].options);return a}function _(){return r.default.CODE128?\"CODE128\":Object.keys(r.default)[0]}function g(t,e,n){e=(0,i.default)(e);for(var r=0;r<e.length;r++)e[r].options=(0,o.default)(n,e[r].options),(0,a.default)(e[r].options);(0,a.default)(n),new(0,t.renderer)(t.element,e,n).render(),t.afterRender&&t.afterRender()}d.prototype.options=function(t){return this._options=(0,o.default)(this._options,t),this},d.prototype.blank=function(t){var e=new Array(t+1).join(\"0\");return this._encodings.push({data:e}),this},d.prototype.init=function(){var t;if(this._renderProperties)for(var e in Array.isArray(this._renderProperties)||(this._renderProperties=[this._renderProperties]),this._renderProperties){t=this._renderProperties[e];var n=(0,o.default)(this._options,t.options);\"auto\"==n.format&&(n.format=_()),this._errorHandler.wrapBarcodeCall((function(){var e=v(n.value,r.default[n.format.toUpperCase()],n);g(t,e,n)}))}},d.prototype.render=function(){if(!this._renderProperties)throw new s.NoElementException;if(Array.isArray(this._renderProperties))for(var t=0;t<this._renderProperties.length;t++)g(this._renderProperties[t],this._encodings,this._options);else g(this._renderProperties,this._encodings,this._options);return this},d.prototype._defaults=l.default,\"undefined\"!=typeof window&&(window.JsBarcode=h),\"undefined\"!=typeof jQuery&&(jQuery.fn.JsBarcode=function(t,e){var n=[];return jQuery(this).each((function(){n.push(this)})),h(n,t,e)}),t.exports=h},function(t,e,n){\"use strict\";Object.defineProperty(e,\"__esModule\",{value:!0});var r=n(18),o=n(19),i=n(25),a=n(31),u=n(34),f=n(39),c=n(40),s=n(41),l=n(44);e.default={CODE39:r.CODE39,CODE128:o.CODE128,CODE128A:o.CODE128A,CODE128B:o.CODE128B,CODE128C:o.CODE128C,EAN13:i.EAN13,EAN8:i.EAN8,EAN5:i.EAN5,EAN2:i.EAN2,UPC:i.UPC,UPCE:i.UPCE,ITF14:a.ITF14,ITF:a.ITF,MSI:u.MSI,MSI10:u.MSI10,MSI11:u.MSI11,MSI1010:u.MSI1010,MSI1110:u.MSI1110,pharmacode:f.pharmacode,codabar:c.codabar,CODE93:s.CODE93,CODE93FullASCII:s.CODE93FullASCII,GenericBarcode:l.GenericBarcode}},function(t,e,n){\"use strict\";Object.defineProperty(e,\"__esModule\",{value:!0}),e.CODE39=void 0;var r,o=function(){function t(t,e){for(var n=0;n<e.length;n++){var r=e[n];r.enumerable=r.enumerable||!1,r.configurable=!0,\"value\"in r&&(r.writable=!0),Object.defineProperty(t,r.key,r)}}return function(e,n,r){return n&&t(e.prototype,n),r&&t(e,r),e}}(),i=n(0);var a=function(t){function e(t,n){return function(t,e){if(!(t instanceof e))throw new TypeError(\"Cannot call a class as a function\")}(this,e),t=t.toUpperCase(),n.mod43&&(t+=function(t){return u[t]}(function(t){for(var e=0,n=0;n<t.length;n++)e+=s(t[n]);return e%=43}(t))),function(t,e){if(!t)throw new ReferenceError(\"this hasn't been initialised - super() hasn't been called\");return!e||\"object\"!=typeof e&&\"function\"!=typeof e?t:e}(this,(e.__proto__||Object.getPrototypeOf(e)).call(this,t,n))}return function(t,e){if(\"function\"!=typeof e&&null!==e)throw new TypeError(\"Super expression must either be null or a function, not \"+typeof e);t.prototype=Object.create(e&&e.prototype,{constructor:{value:t,enumerable:!1,writable:!0,configurable:!0}}),e&&(Object.setPrototypeOf?Object.setPrototypeOf(t,e):t.__proto__=e)}(e,t),o(e,[{key:\"encode\",value:function(){for(var t=c(\"*\"),e=0;e<this.data.length;e++)t+=c(this.data[e])+\"0\";return{data:t+=c(\"*\"),text:this.text}}},{key:\"valid\",value:function(){return-1!==this.data.search(/^[0-9A-Z\\-\\.\\ \\$\\/\\+\\%]+$/)}}]),e}(((r=i)&&r.__esModule?r:{default:r}).default),u=[\"0\",\"1\",\"2\",\"3\",\"4\",\"5\",\"6\",\"7\",\"8\",\"9\",\"A\",\"B\",\"C\",\"D\",\"E\",\"F\",\"G\",\"H\",\"I\",\"J\",\"K\",\"L\",\"M\",\"N\",\"O\",\"P\",\"Q\",\"R\",\"S\",\"T\",\"U\",\"V\",\"W\",\"X\",\"Y\",\"Z\",\"-\",\".\",\" \",\"$\",\"/\",\"+\",\"%\",\"*\"],f=[20957,29783,23639,30485,20951,29813,23669,20855,29789,23645,29975,23831,30533,22295,30149,24005,21623,29981,23837,22301,30023,23879,30545,22343,30161,24017,21959,30065,23921,22385,29015,18263,29141,17879,29045,18293,17783,29021,18269,17477,17489,17681,20753,35770];function c(t){return function(t){return f[t].toString(2)}(s(t))}function s(t){return u.indexOf(t)}e.CODE39=a},function(t,e,n){\"use strict\";Object.defineProperty(e,\"__esModule\",{value:!0}),e.CODE128C=e.CODE128B=e.CODE128A=e.CODE128=void 0;var r=u(n(20)),o=u(n(22)),i=u(n(23)),a=u(n(24));function u(t){return t&&t.__esModule?t:{default:t}}e.CODE128=r.default,e.CODE128A=o.default,e.CODE128B=i.default,e.CODE128C=a.default},function(t,e,n){\"use strict\";Object.defineProperty(e,\"__esModule\",{value:!0});var r=i(n(5)),o=i(n(21));function i(t){return t&&t.__esModule?t:{default:t}}function a(t,e){if(!t)throw new ReferenceError(\"this hasn't been initialised - super() hasn't been called\");return!e||\"object\"!=typeof e&&\"function\"!=typeof e?t:e}var u=function(t){function e(t,n){if(function(t,e){if(!(t instanceof e))throw new TypeError(\"Cannot call a class as a function\")}(this,e),/^[\\x00-\\x7F\\xC8-\\xD3]+$/.test(t))var r=a(this,(e.__proto__||Object.getPrototypeOf(e)).call(this,(0,o.default)(t),n));else r=a(this,(e.__proto__||Object.getPrototypeOf(e)).call(this,t,n));return a(r)}return function(t,e){if(\"function\"!=typeof e&&null!==e)throw new TypeError(\"Super expression must either be null or a function, not \"+typeof e);t.prototype=Object.create(e&&e.prototype,{constructor:{value:t,enumerable:!1,writable:!0,configurable:!0}}),e&&(Object.setPrototypeOf?Object.setPrototypeOf(t,e):t.__proto__=e)}(e,t),e}(r.default);e.default=u},function(t,e,n){\"use strict\";Object.defineProperty(e,\"__esModule\",{value:!0});var r=n(1),o=function(t){return t.match(new RegExp(\"^\"+r.A_CHARS+\"*\"))[0].length},i=function(t){return t.match(new RegExp(\"^\"+r.B_CHARS+\"*\"))[0].length},a=function(t){return t.match(new RegExp(\"^\"+r.C_CHARS+\"*\"))[0]};function u(t,e){var n=e?r.A_CHARS:r.B_CHARS,o=t.match(new RegExp(\"^(\"+n+\"+?)(([0-9]{2}){2,})([^0-9]|$)\"));if(o)return o[1]+String.fromCharCode(204)+f(t.substring(o[1].length));var i=t.match(new RegExp(\"^\"+n+\"+\"))[0];return i.length===t.length?t:i+String.fromCharCode(e?205:206)+u(t.substring(i.length),!e)}function f(t){var e=a(t),n=e.length;if(n===t.length)return t;t=t.substring(n);var r=o(t)>=i(t);return e+String.fromCharCode(r?206:205)+u(t,r)}e.default=function(t){var e=void 0;if(a(t).length>=2)e=r.C_START_CHAR+f(t);else{var n=o(t)>i(t);e=(n?r.A_START_CHAR:r.B_START_CHAR)+u(t,n)}return e.replace(/[\\xCD\\xCE]([^])[\\xCD\\xCE]/,(function(t,e){return String.fromCharCode(203)+e}))}},function(t,e,n){\"use strict\";Object.defineProperty(e,\"__esModule\",{value:!0});var r,o=function(){function t(t,e){for(var n=0;n<e.length;n++){var r=e[n];r.enumerable=r.enumerable||!1,r.configurable=!0,\"value\"in r&&(r.writable=!0),Object.defineProperty(t,r.key,r)}}return function(e,n,r){return n&&t(e.prototype,n),r&&t(e,r),e}}(),i=n(5),a=(r=i)&&r.__esModule?r:{default:r},u=n(1);var f=function(t){function e(t,n){return function(t,e){if(!(t instanceof e))throw new TypeError(\"Cannot call a class as a function\")}(this,e),function(t,e){if(!t)throw new ReferenceError(\"this hasn't been initialised - super() hasn't been called\");return!e||\"object\"!=typeof e&&\"function\"!=typeof e?t:e}(this,(e.__proto__||Object.getPrototypeOf(e)).call(this,u.A_START_CHAR+t,n))}return function(t,e){if(\"function\"!=typeof e&&null!==e)throw new TypeError(\"Super expression must either be null or a function, not \"+typeof e);t.prototype=Object.create(e&&e.prototype,{constructor:{value:t,enumerable:!1,writable:!0,configurable:!0}}),e&&(Object.setPrototypeOf?Object.setPrototypeOf(t,e):t.__proto__=e)}(e,t),o(e,[{key:\"valid\",value:function(){return new RegExp(\"^\"+u.A_CHARS+\"+$\").test(this.data)}}]),e}(a.default);e.default=f},function(t,e,n){\"use strict\";Object.defineProperty(e,\"__esModule\",{value:!0});var r,o=function(){function t(t,e){for(var n=0;n<e.length;n++){var r=e[n];r.enumerable=r.enumerable||!1,r.configurable=!0,\"value\"in r&&(r.writable=!0),Object.defineProperty(t,r.key,r)}}return function(e,n,r){return n&&t(e.prototype,n),r&&t(e,r),e}}(),i=n(5),a=(r=i)&&r.__esModule?r:{default:r},u=n(1);var f=function(t){function e(t,n){return function(t,e){if(!(t instanceof e))throw new TypeError(\"Cannot call a class as a function\")}(this,e),function(t,e){if(!t)throw new ReferenceError(\"this hasn't been initialised - super() hasn't been called\");return!e||\"object\"!=typeof e&&\"function\"!=typeof e?t:e}(this,(e.__proto__||Object.getPrototypeOf(e)).call(this,u.B_START_CHAR+t,n))}return function(t,e){if(\"function\"!=typeof e&&null!==e)throw new TypeError(\"Super expression must either be null or a function, not \"+typeof e);t.prototype=Object.create(e&&e.prototype,{constructor:{value:t,enumerable:!1,writable:!0,configurable:!0}}),e&&(Object.setPrototypeOf?Object.setPrototypeOf(t,e):t.__proto__=e)}(e,t),o(e,[{key:\"valid\",value:function(){return new RegExp(\"^\"+u.B_CHARS+\"+$\").test(this.data)}}]),e}(a.default);e.default=f},function(t,e,n){\"use strict\";Object.defineProperty(e,\"__esModule\",{value:!0});var r,o=function(){function t(t,e){for(var n=0;n<e.length;n++){var r=e[n];r.enumerable=r.enumerable||!1,r.configurable=!0,\"value\"in r&&(r.writable=!0),Object.defineProperty(t,r.key,r)}}return function(e,n,r){return n&&t(e.prototype,n),r&&t(e,r),e}}(),i=n(5),a=(r=i)&&r.__esModule?r:{default:r},u=n(1);var f=function(t){function e(t,n){return function(t,e){if(!(t instanceof e))throw new TypeError(\"Cannot call a class as a function\")}(this,e),function(t,e){if(!t)throw new ReferenceError(\"this hasn't been initialised - super() hasn't been called\");return!e||\"object\"!=typeof e&&\"function\"!=typeof e?t:e}(this,(e.__proto__||Object.getPrototypeOf(e)).call(this,u.C_START_CHAR+t,n))}return function(t,e){if(\"function\"!=typeof e&&null!==e)throw new TypeError(\"Super expression must either be null or a function, not \"+typeof e);t.prototype=Object.create(e&&e.prototype,{constructor:{value:t,enumerable:!1,writable:!0,configurable:!0}}),e&&(Object.setPrototypeOf?Object.setPrototypeOf(t,e):t.__proto__=e)}(e,t),o(e,[{key:\"valid\",value:function(){return new RegExp(\"^\"+u.C_CHARS+\"+$\").test(this.data)}}]),e}(a.default);e.default=f},function(t,e,n){\"use strict\";Object.defineProperty(e,\"__esModule\",{value:!0}),e.UPCE=e.UPC=e.EAN2=e.EAN5=e.EAN8=e.EAN13=void 0;var r=c(n(26)),o=c(n(27)),i=c(n(28)),a=c(n(29)),u=c(n(9)),f=c(n(30));function c(t){return t&&t.__esModule?t:{default:t}}e.EAN13=r.default,e.EAN8=o.default,e.EAN5=i.default,e.EAN2=a.default,e.UPC=u.default,e.UPCE=f.default},function(t,e,n){\"use strict\";Object.defineProperty(e,\"__esModule\",{value:!0});var r,o=function(){function t(t,e){for(var n=0;n<e.length;n++){var r=e[n];r.enumerable=r.enumerable||!1,r.configurable=!0,\"value\"in r&&(r.writable=!0),Object.defineProperty(t,r.key,r)}}return function(e,n,r){return n&&t(e.prototype,n),r&&t(e,r),e}}(),i=function t(e,n,r){null===e&&(e=Function.prototype);var o=Object.getOwnPropertyDescriptor(e,n);if(void 0===o){var i=Object.getPrototypeOf(e);return null===i?void 0:t(i,n,r)}if(\"value\"in o)return o.value;var a=o.get;return void 0!==a?a.call(r):void 0},a=n(2),u=n(8),f=(r=u)&&r.__esModule?r:{default:r};var c=function(t){return(10-t.substr(0,12).split(\"\").map((function(t){return+t})).reduce((function(t,e,n){return n%2?t+3*e:t+e}),0)%10)%10},s=function(t){function e(t,n){!function(t,e){if(!(t instanceof e))throw new TypeError(\"Cannot call a class as a function\")}(this,e),-1!==t.search(/^[0-9]{12}$/)&&(t+=c(t));var r=function(t,e){if(!t)throw new ReferenceError(\"this hasn't been initialised - super() hasn't been called\");return!e||\"object\"!=typeof e&&\"function\"!=typeof e?t:e}(this,(e.__proto__||Object.getPrototypeOf(e)).call(this,t,n));return r.lastChar=n.lastChar,r}return function(t,e){if(\"function\"!=typeof e&&null!==e)throw new TypeError(\"Super expression must either be null or a function, not \"+typeof e);t.prototype=Object.create(e&&e.prototype,{constructor:{value:t,enumerable:!1,writable:!0,configurable:!0}}),e&&(Object.setPrototypeOf?Object.setPrototypeOf(t,e):t.__proto__=e)}(e,t),o(e,[{key:\"valid\",value:function(){return-1!==this.data.search(/^[0-9]{13}$/)&&+this.data[12]===c(this.data)}},{key:\"leftText\",value:function(){return i(e.prototype.__proto__||Object.getPrototypeOf(e.prototype),\"leftText\",this).call(this,1,6)}},{key:\"leftEncode\",value:function(){var t=this.data.substr(1,6),n=a.EAN13_STRUCTURE[this.data[0]];return i(e.prototype.__proto__||Object.getPrototypeOf(e.prototype),\"leftEncode\",this).call(this,t,n)}},{key:\"rightText\",value:function(){return i(e.prototype.__proto__||Object.getPrototypeOf(e.prototype),\"rightText\",this).call(this,7,6)}},{key:\"rightEncode\",value:function(){var t=this.data.substr(7,6);return i(e.prototype.__proto__||Object.getPrototypeOf(e.prototype),\"rightEncode\",this).call(this,t,\"RRRRRR\")}},{key:\"encodeGuarded\",value:function(){var t=i(e.prototype.__proto__||Object.getPrototypeOf(e.prototype),\"encodeGuarded\",this).call(this);return this.options.displayValue&&(t.unshift({data:\"000000000000\",text:this.text.substr(0,1),options:{textAlign:\"left\",fontSize:this.fontSize}}),this.options.lastChar&&(t.push({data:\"00\"}),t.push({data:\"00000\",text:this.options.lastChar,options:{fontSize:this.fontSize}}))),t}}]),e}(f.default);e.default=s},function(t,e,n){\"use strict\";Object.defineProperty(e,\"__esModule\",{value:!0});var r,o=function(){function t(t,e){for(var n=0;n<e.length;n++){var r=e[n];r.enumerable=r.enumerable||!1,r.configurable=!0,\"value\"in r&&(r.writable=!0),Object.defineProperty(t,r.key,r)}}return function(e,n,r){return n&&t(e.prototype,n),r&&t(e,r),e}}(),i=function t(e,n,r){null===e&&(e=Function.prototype);var o=Object.getOwnPropertyDescriptor(e,n);if(void 0===o){var i=Object.getPrototypeOf(e);return null===i?void 0:t(i,n,r)}if(\"value\"in o)return o.value;var a=o.get;return void 0!==a?a.call(r):void 0},a=n(8),u=(r=a)&&r.__esModule?r:{default:r};var f=function(t){return(10-t.substr(0,7).split(\"\").map((function(t){return+t})).reduce((function(t,e,n){return n%2?t+e:t+3*e}),0)%10)%10},c=function(t){function e(t,n){return function(t,e){if(!(t instanceof e))throw new TypeError(\"Cannot call a class as a function\")}(this,e),-1!==t.search(/^[0-9]{7}$/)&&(t+=f(t)),function(t,e){if(!t)throw new ReferenceError(\"this hasn't been initialised - super() hasn't been called\");return!e||\"object\"!=typeof e&&\"function\"!=typeof e?t:e}(this,(e.__proto__||Object.getPrototypeOf(e)).call(this,t,n))}return function(t,e){if(\"function\"!=typeof e&&null!==e)throw new TypeError(\"Super expression must either be null or a function, not \"+typeof e);t.prototype=Object.create(e&&e.prototype,{constructor:{value:t,enumerable:!1,writable:!0,configurable:!0}}),e&&(Object.setPrototypeOf?Object.setPrototypeOf(t,e):t.__proto__=e)}(e,t),o(e,[{key:\"valid\",value:function(){return-1!==this.data.search(/^[0-9]{8}$/)&&+this.data[7]===f(this.data)}},{key:\"leftText\",value:function(){return i(e.prototype.__proto__||Object.getPrototypeOf(e.prototype),\"leftText\",this).call(this,0,4)}},{key:\"leftEncode\",value:function(){var t=this.data.substr(0,4);return i(e.prototype.__proto__||Object.getPrototypeOf(e.prototype),\"leftEncode\",this).call(this,t,\"LLLL\")}},{key:\"rightText\",value:function(){return i(e.prototype.__proto__||Object.getPrototypeOf(e.prototype),\"rightText\",this).call(this,4,4)}},{key:\"rightEncode\",value:function(){var t=this.data.substr(4,4);return i(e.prototype.__proto__||Object.getPrototypeOf(e.prototype),\"rightEncode\",this).call(this,t,\"RRRR\")}}]),e}(u.default);e.default=c},function(t,e,n){\"use strict\";Object.defineProperty(e,\"__esModule\",{value:!0});var r=function(){function t(t,e){for(var n=0;n<e.length;n++){var r=e[n];r.enumerable=r.enumerable||!1,r.configurable=!0,\"value\"in r&&(r.writable=!0),Object.defineProperty(t,r.key,r)}}return function(e,n,r){return n&&t(e.prototype,n),r&&t(e,r),e}}(),o=n(2),i=u(n(3)),a=u(n(0));function u(t){return t&&t.__esModule?t:{default:t}}var f=function(t){function e(t,n){return function(t,e){if(!(t instanceof e))throw new TypeError(\"Cannot call a class as a function\")}(this,e),function(t,e){if(!t)throw new ReferenceError(\"this hasn't been initialised - super() hasn't been called\");return!e||\"object\"!=typeof e&&\"function\"!=typeof e?t:e}(this,(e.__proto__||Object.getPrototypeOf(e)).call(this,t,n))}return function(t,e){if(\"function\"!=typeof e&&null!==e)throw new TypeError(\"Super expression must either be null or a function, not \"+typeof e);t.prototype=Object.create(e&&e.prototype,{constructor:{value:t,enumerable:!1,writable:!0,configurable:!0}}),e&&(Object.setPrototypeOf?Object.setPrototypeOf(t,e):t.__proto__=e)}(e,t),r(e,[{key:\"valid\",value:function(){return-1!==this.data.search(/^[0-9]{5}$/)}},{key:\"encode\",value:function(){var t,e=o.EAN5_STRUCTURE[(t=this.data,t.split(\"\").map((function(t){return+t})).reduce((function(t,e,n){return n%2?t+9*e:t+3*e}),0)%10)];return{data:\"1011\"+(0,i.default)(this.data,e,\"01\"),text:this.text}}}]),e}(a.default);e.default=f},function(t,e,n){\"use strict\";Object.defineProperty(e,\"__esModule\",{value:!0});var r=function(){function t(t,e){for(var n=0;n<e.length;n++){var r=e[n];r.enumerable=r.enumerable||!1,r.configurable=!0,\"value\"in r&&(r.writable=!0),Object.defineProperty(t,r.key,r)}}return function(e,n,r){return n&&t(e.prototype,n),r&&t(e,r),e}}(),o=n(2),i=a(n(3));function a(t){return t&&t.__esModule?t:{default:t}}var u=function(t){function e(t,n){return function(t,e){if(!(t instanceof e))throw new TypeError(\"Cannot call a class as a function\")}(this,e),function(t,e){if(!t)throw new ReferenceError(\"this hasn't been initialised - super() hasn't been called\");return!e||\"object\"!=typeof e&&\"function\"!=typeof e?t:e}(this,(e.__proto__||Object.getPrototypeOf(e)).call(this,t,n))}return function(t,e){if(\"function\"!=typeof e&&null!==e)throw new TypeError(\"Super expression must either be null or a function, not \"+typeof e);t.prototype=Object.create(e&&e.prototype,{constructor:{value:t,enumerable:!1,writable:!0,configurable:!0}}),e&&(Object.setPrototypeOf?Object.setPrototypeOf(t,e):t.__proto__=e)}(e,t),r(e,[{key:\"valid\",value:function(){return-1!==this.data.search(/^[0-9]{2}$/)}},{key:\"encode\",value:function(){var t=o.EAN2_STRUCTURE[parseInt(this.data)%4];return{data:\"1011\"+(0,i.default)(this.data,t,\"01\"),text:this.text}}}]),e}(a(n(0)).default);e.default=u},function(t,e,n){\"use strict\";Object.defineProperty(e,\"__esModule\",{value:!0});var r=function(){function t(t,e){for(var n=0;n<e.length;n++){var r=e[n];r.enumerable=r.enumerable||!1,r.configurable=!0,\"value\"in r&&(r.writable=!0),Object.defineProperty(t,r.key,r)}}return function(e,n,r){return n&&t(e.prototype,n),r&&t(e,r),e}}(),o=u(n(3)),i=u(n(0)),a=n(9);function u(t){return t&&t.__esModule?t:{default:t}}function f(t,e){if(!t)throw new ReferenceError(\"this hasn't been initialised - super() hasn't been called\");return!e||\"object\"!=typeof e&&\"function\"!=typeof e?t:e}var c=[\"XX00000XXX\",\"XX10000XXX\",\"XX20000XXX\",\"XXX00000XX\",\"XXXX00000X\",\"XXXXX00005\",\"XXXXX00006\",\"XXXXX00007\",\"XXXXX00008\",\"XXXXX00009\"],s=[[\"EEEOOO\",\"OOOEEE\"],[\"EEOEOO\",\"OOEOEE\"],[\"EEOOEO\",\"OOEEOE\"],[\"EEOOOE\",\"OOEEEO\"],[\"EOEEOO\",\"OEOOEE\"],[\"EOOEEO\",\"OEEOOE\"],[\"EOOOEE\",\"OEEEOO\"],[\"EOEOEO\",\"OEOEOE\"],[\"EOEOOE\",\"OEOEEO\"],[\"EOOEOE\",\"OEEOEO\"]],l=function(t){function e(t,n){!function(t,e){if(!(t instanceof e))throw new TypeError(\"Cannot call a class as a function\")}(this,e);var r=f(this,(e.__proto__||Object.getPrototypeOf(e)).call(this,t,n));if(r.isValid=!1,-1!==t.search(/^[0-9]{6}$/))r.middleDigits=t,r.upcA=p(t,\"0\"),r.text=n.text||\"\"+r.upcA[0]+t+r.upcA[r.upcA.length-1],r.isValid=!0;else{if(-1===t.search(/^[01][0-9]{7}$/))return f(r);if(r.middleDigits=t.substring(1,t.length-1),r.upcA=p(r.middleDigits,t[0]),r.upcA[r.upcA.length-1]!==t[t.length-1])return f(r);r.isValid=!0}return r.displayValue=n.displayValue,n.fontSize>10*n.width?r.fontSize=10*n.width:r.fontSize=n.fontSize,r.guardHeight=n.height+r.fontSize/2+n.textMargin,r}return function(t,e){if(\"function\"!=typeof e&&null!==e)throw new TypeError(\"Super expression must either be null or a function, not \"+typeof e);t.prototype=Object.create(e&&e.prototype,{constructor:{value:t,enumerable:!1,writable:!0,configurable:!0}}),e&&(Object.setPrototypeOf?Object.setPrototypeOf(t,e):t.__proto__=e)}(e,t),r(e,[{key:\"valid\",value:function(){return this.isValid}},{key:\"encode\",value:function(){return this.options.flat?this.flatEncoding():this.guardedEncoding()}},{key:\"flatEncoding\",value:function(){var t=\"\";return t+=\"101\",t+=this.encodeMiddleDigits(),{data:t+=\"010101\",text:this.text}}},{key:\"guardedEncoding\",value:function(){var t=[];return this.displayValue&&t.push({data:\"00000000\",text:this.text[0],options:{textAlign:\"left\",fontSize:this.fontSize}}),t.push({data:\"101\",options:{height:this.guardHeight}}),t.push({data:this.encodeMiddleDigits(),text:this.text.substring(1,7),options:{fontSize:this.fontSize}}),t.push({data:\"010101\",options:{height:this.guardHeight}}),this.displayValue&&t.push({data:\"00000000\",text:this.text[7],options:{textAlign:\"right\",fontSize:this.fontSize}}),t}},{key:\"encodeMiddleDigits\",value:function(){var t=this.upcA[0],e=this.upcA[this.upcA.length-1],n=s[parseInt(e)][parseInt(t)];return(0,o.default)(this.middleDigits,n)}}]),e}(i.default);function p(t,e){for(var n=parseInt(t[t.length-1]),r=c[n],o=\"\",i=0,u=0;u<r.length;u++){var f=r[u];o+=\"X\"===f?t[i++]:f}return\"\"+(o=\"\"+e+o)+(0,a.checksum)(o)}e.default=l},function(t,e,n){\"use strict\";Object.defineProperty(e,\"__esModule\",{value:!0}),e.ITF14=e.ITF=void 0;var r=i(n(10)),o=i(n(33));function i(t){return t&&t.__esModule?t:{default:t}}e.ITF=r.default,e.ITF14=o.default},function(t,e,n){\"use strict\";Object.defineProperty(e,\"__esModule\",{value:!0});e.START_BIN=\"1010\",e.END_BIN=\"11101\",e.BINARIES=[\"00110\",\"10001\",\"01001\",\"11000\",\"00101\",\"10100\",\"01100\",\"00011\",\"10010\",\"01010\"]},function(t,e,n){\"use strict\";Object.defineProperty(e,\"__esModule\",{value:!0});var r,o=function(){function t(t,e){for(var n=0;n<e.length;n++){var r=e[n];r.enumerable=r.enumerable||!1,r.configurable=!0,\"value\"in r&&(r.writable=!0),Object.defineProperty(t,r.key,r)}}return function(e,n,r){return n&&t(e.prototype,n),r&&t(e,r),e}}(),i=n(10),a=(r=i)&&r.__esModule?r:{default:r};var u=function(t){var e=t.substr(0,13).split(\"\").map((function(t){return parseInt(t,10)})).reduce((function(t,e,n){return t+e*(3-n%2*2)}),0);return 10*Math.ceil(e/10)-e},f=function(t){function e(t,n){return function(t,e){if(!(t instanceof e))throw new TypeError(\"Cannot call a class as a function\")}(this,e),-1!==t.search(/^[0-9]{13}$/)&&(t+=u(t)),function(t,e){if(!t)throw new ReferenceError(\"this hasn't been initialised - super() hasn't been called\");return!e||\"object\"!=typeof e&&\"function\"!=typeof e?t:e}(this,(e.__proto__||Object.getPrototypeOf(e)).call(this,t,n))}return function(t,e){if(\"function\"!=typeof e&&null!==e)throw new TypeError(\"Super expression must either be null or a function, not \"+typeof e);t.prototype=Object.create(e&&e.prototype,{constructor:{value:t,enumerable:!1,writable:!0,configurable:!0}}),e&&(Object.setPrototypeOf?Object.setPrototypeOf(t,e):t.__proto__=e)}(e,t),o(e,[{key:\"valid\",value:function(){return-1!==this.data.search(/^[0-9]{14}$/)&&+this.data[13]===u(this.data)}}]),e}(a.default);e.default=f},function(t,e,n){\"use strict\";Object.defineProperty(e,\"__esModule\",{value:!0}),e.MSI1110=e.MSI1010=e.MSI11=e.MSI10=e.MSI=void 0;var r=f(n(4)),o=f(n(35)),i=f(n(36)),a=f(n(37)),u=f(n(38));function f(t){return t&&t.__esModule?t:{default:t}}e.MSI=r.default,e.MSI10=o.default,e.MSI11=i.default,e.MSI1010=a.default,e.MSI1110=u.default},function(t,e,n){\"use strict\";Object.defineProperty(e,\"__esModule\",{value:!0});var r,o=n(4),i=(r=o)&&r.__esModule?r:{default:r},a=n(6);var u=function(t){function e(t,n){return function(t,e){if(!(t instanceof e))throw new TypeError(\"Cannot call a class as a function\")}(this,e),function(t,e){if(!t)throw new ReferenceError(\"this hasn't been initialised - super() hasn't been called\");return!e||\"object\"!=typeof e&&\"function\"!=typeof e?t:e}(this,(e.__proto__||Object.getPrototypeOf(e)).call(this,t+(0,a.mod10)(t),n))}return function(t,e){if(\"function\"!=typeof e&&null!==e)throw new TypeError(\"Super expression must either be null or a function, not \"+typeof e);t.prototype=Object.create(e&&e.prototype,{constructor:{value:t,enumerable:!1,writable:!0,configurable:!0}}),e&&(Object.setPrototypeOf?Object.setPrototypeOf(t,e):t.__proto__=e)}(e,t),e}(i.default);e.default=u},function(t,e,n){\"use strict\";Object.defineProperty(e,\"__esModule\",{value:!0});var r,o=n(4),i=(r=o)&&r.__esModule?r:{default:r},a=n(6);var u=function(t){function e(t,n){return function(t,e){if(!(t instanceof e))throw new TypeError(\"Cannot call a class as a function\")}(this,e),function(t,e){if(!t)throw new ReferenceError(\"this hasn't been initialised - super() hasn't been called\");return!e||\"object\"!=typeof e&&\"function\"!=typeof e?t:e}(this,(e.__proto__||Object.getPrototypeOf(e)).call(this,t+(0,a.mod11)(t),n))}return function(t,e){if(\"function\"!=typeof e&&null!==e)throw new TypeError(\"Super expression must either be null or a function, not \"+typeof e);t.prototype=Object.create(e&&e.prototype,{constructor:{value:t,enumerable:!1,writable:!0,configurable:!0}}),e&&(Object.setPrototypeOf?Object.setPrototypeOf(t,e):t.__proto__=e)}(e,t),e}(i.default);e.default=u},function(t,e,n){\"use strict\";Object.defineProperty(e,\"__esModule\",{value:!0});var r,o=n(4),i=(r=o)&&r.__esModule?r:{default:r},a=n(6);var u=function(t){function e(t,n){return function(t,e){if(!(t instanceof e))throw new TypeError(\"Cannot call a class as a function\")}(this,e),t+=(0,a.mod10)(t),t+=(0,a.mod10)(t),function(t,e){if(!t)throw new ReferenceError(\"this hasn't been initialised - super() hasn't been called\");return!e||\"object\"!=typeof e&&\"function\"!=typeof e?t:e}(this,(e.__proto__||Object.getPrototypeOf(e)).call(this,t,n))}return function(t,e){if(\"function\"!=typeof e&&null!==e)throw new TypeError(\"Super expression must either be null or a function, not \"+typeof e);t.prototype=Object.create(e&&e.prototype,{constructor:{value:t,enumerable:!1,writable:!0,configurable:!0}}),e&&(Object.setPrototypeOf?Object.setPrototypeOf(t,e):t.__proto__=e)}(e,t),e}(i.default);e.default=u},function(t,e,n){\"use strict\";Object.defineProperty(e,\"__esModule\",{value:!0});var r,o=n(4),i=(r=o)&&r.__esModule?r:{default:r},a=n(6);var u=function(t){function e(t,n){return function(t,e){if(!(t instanceof e))throw new TypeError(\"Cannot call a class as a function\")}(this,e),t+=(0,a.mod11)(t),t+=(0,a.mod10)(t),function(t,e){if(!t)throw new ReferenceError(\"this hasn't been initialised - super() hasn't been called\");return!e||\"object\"!=typeof e&&\"function\"!=typeof e?t:e}(this,(e.__proto__||Object.getPrototypeOf(e)).call(this,t,n))}return function(t,e){if(\"function\"!=typeof e&&null!==e)throw new TypeError(\"Super expression must either be null or a function, not \"+typeof e);t.prototype=Object.create(e&&e.prototype,{constructor:{value:t,enumerable:!1,writable:!0,configurable:!0}}),e&&(Object.setPrototypeOf?Object.setPrototypeOf(t,e):t.__proto__=e)}(e,t),e}(i.default);e.default=u},function(t,e,n){\"use strict\";Object.defineProperty(e,\"__esModule\",{value:!0}),e.pharmacode=void 0;var r,o=function(){function t(t,e){for(var n=0;n<e.length;n++){var r=e[n];r.enumerable=r.enumerable||!1,r.configurable=!0,\"value\"in r&&(r.writable=!0),Object.defineProperty(t,r.key,r)}}return function(e,n,r){return n&&t(e.prototype,n),r&&t(e,r),e}}(),i=n(0);var a=function(t){function e(t,n){!function(t,e){if(!(t instanceof e))throw new TypeError(\"Cannot call a class as a function\")}(this,e);var r=function(t,e){if(!t)throw new ReferenceError(\"this hasn't been initialised - super() hasn't been called\");return!e||\"object\"!=typeof e&&\"function\"!=typeof e?t:e}(this,(e.__proto__||Object.getPrototypeOf(e)).call(this,t,n));return r.number=parseInt(t,10),r}return function(t,e){if(\"function\"!=typeof e&&null!==e)throw new TypeError(\"Super expression must either be null or a function, not \"+typeof e);t.prototype=Object.create(e&&e.prototype,{constructor:{value:t,enumerable:!1,writable:!0,configurable:!0}}),e&&(Object.setPrototypeOf?Object.setPrototypeOf(t,e):t.__proto__=e)}(e,t),o(e,[{key:\"encode\",value:function(){for(var t=this.number,e=\"\";!isNaN(t)&&0!=t;)t%2==0?(e=\"11100\"+e,t=(t-2)/2):(e=\"100\"+e,t=(t-1)/2);return{data:e=e.slice(0,-2),text:this.text}}},{key:\"valid\",value:function(){return this.number>=3&&this.number<=131070}}]),e}(((r=i)&&r.__esModule?r:{default:r}).default);e.pharmacode=a},function(t,e,n){\"use strict\";Object.defineProperty(e,\"__esModule\",{value:!0}),e.codabar=void 0;var r,o=function(){function t(t,e){for(var n=0;n<e.length;n++){var r=e[n];r.enumerable=r.enumerable||!1,r.configurable=!0,\"value\"in r&&(r.writable=!0),Object.defineProperty(t,r.key,r)}}return function(e,n,r){return n&&t(e.prototype,n),r&&t(e,r),e}}(),i=n(0);var a=function(t){function e(t,n){!function(t,e){if(!(t instanceof e))throw new TypeError(\"Cannot call a class as a function\")}(this,e),0===t.search(/^[0-9\\-\\$\\:\\.\\+\\/]+$/)&&(t=\"A\"+t+\"A\");var r=function(t,e){if(!t)throw new ReferenceError(\"this hasn't been initialised - super() hasn't been called\");return!e||\"object\"!=typeof e&&\"function\"!=typeof e?t:e}(this,(e.__proto__||Object.getPrototypeOf(e)).call(this,t.toUpperCase(),n));return r.text=r.options.text||r.text.replace(/[A-D]/g,\"\"),r}return function(t,e){if(\"function\"!=typeof e&&null!==e)throw new TypeError(\"Super expression must either be null or a function, not \"+typeof e);t.prototype=Object.create(e&&e.prototype,{constructor:{value:t,enumerable:!1,writable:!0,configurable:!0}}),e&&(Object.setPrototypeOf?Object.setPrototypeOf(t,e):t.__proto__=e)}(e,t),o(e,[{key:\"valid\",value:function(){return-1!==this.data.search(/^[A-D][0-9\\-\\$\\:\\.\\+\\/]+[A-D]$/)}},{key:\"encode\",value:function(){for(var t=[],e=this.getEncodings(),n=0;n<this.data.length;n++)t.push(e[this.data.charAt(n)]),n!==this.data.length-1&&t.push(\"0\");return{text:this.text,data:t.join(\"\")}}},{key:\"getEncodings\",value:function(){return{0:\"101010011\",1:\"101011001\",2:\"101001011\",3:\"110010101\",4:\"101101001\",5:\"110101001\",6:\"100101011\",7:\"100101101\",8:\"100110101\",9:\"110100101\",\"-\":\"101001101\",$:\"101100101\",\":\":\"1101011011\",\"/\":\"1101101011\",\".\":\"1101101101\",\"+\":\"1011011011\",A:\"1011001001\",B:\"1001001011\",C:\"1010010011\",D:\"1010011001\"}}}]),e}(((r=i)&&r.__esModule?r:{default:r}).default);e.codabar=a},function(t,e,n){\"use strict\";Object.defineProperty(e,\"__esModule\",{value:!0}),e.CODE93FullASCII=e.CODE93=void 0;var r=i(n(11)),o=i(n(43));function i(t){return t&&t.__esModule?t:{default:t}}e.CODE93=r.default,e.CODE93FullASCII=o.default},function(t,e,n){\"use strict\";Object.defineProperty(e,\"__esModule\",{value:!0});e.SYMBOLS=[\"0\",\"1\",\"2\",\"3\",\"4\",\"5\",\"6\",\"7\",\"8\",\"9\",\"A\",\"B\",\"C\",\"D\",\"E\",\"F\",\"G\",\"H\",\"I\",\"J\",\"K\",\"L\",\"M\",\"N\",\"O\",\"P\",\"Q\",\"R\",\"S\",\"T\",\"U\",\"V\",\"W\",\"X\",\"Y\",\"Z\",\"-\",\".\",\" \",\"$\",\"/\",\"+\",\"%\",\"($)\",\"(%)\",\"(/)\",\"(+)\",\"ÿ\"],e.BINARIES=[\"100010100\",\"101001000\",\"101000100\",\"101000010\",\"100101000\",\"100100100\",\"100100010\",\"101010000\",\"100010010\",\"100001010\",\"110101000\",\"110100100\",\"110100010\",\"110010100\",\"110010010\",\"110001010\",\"101101000\",\"101100100\",\"101100010\",\"100110100\",\"100011010\",\"101011000\",\"101001100\",\"101000110\",\"100101100\",\"100010110\",\"110110100\",\"110110010\",\"110101100\",\"110100110\",\"110010110\",\"110011010\",\"101101100\",\"101100110\",\"100110110\",\"100111010\",\"100101110\",\"111010100\",\"111010010\",\"111001010\",\"101101110\",\"101110110\",\"110101110\",\"100100110\",\"111011010\",\"111010110\",\"100110010\",\"101011110\"],e.MULTI_SYMBOLS={\"\\0\":[\"(%)\",\"U\"],\"\u0001\":[\"($)\",\"A\"],\"\u0002\":[\"($)\",\"B\"],\"\u0003\":[\"($)\",\"C\"],\"\u0004\":[\"($)\",\"D\"],\"\u0005\":[\"($)\",\"E\"],\"\u0006\":[\"($)\",\"F\"],\"\u0007\":[\"($)\",\"G\"],\"\\b\":[\"($)\",\"H\"],\"\\t\":[\"($)\",\"I\"],\"\\n\":[\"($)\",\"J\"],\"\\v\":[\"($)\",\"K\"],\"\\f\":[\"($)\",\"L\"],\"\\r\":[\"($)\",\"M\"],\"\u000e\":[\"($)\",\"N\"],\"\u000f\":[\"($)\",\"O\"],\"\u0010\":[\"($)\",\"P\"],\"\u0011\":[\"($)\",\"Q\"],\"\u0012\":[\"($)\",\"R\"],\"\u0013\":[\"($)\",\"S\"],\"\u0014\":[\"($)\",\"T\"],\"\u0015\":[\"($)\",\"U\"],\"\u0016\":[\"($)\",\"V\"],\"\u0017\":[\"($)\",\"W\"],\"\u0018\":[\"($)\",\"X\"],\"\u0019\":[\"($)\",\"Y\"],\"\u001a\":[\"($)\",\"Z\"],\"\u001b\":[\"(%)\",\"A\"],\"\u001c\":[\"(%)\",\"B\"],\"\u001d\":[\"(%)\",\"C\"],\"\u001e\":[\"(%)\",\"D\"],\"\u001f\":[\"(%)\",\"E\"],\"!\":[\"(/)\",\"A\"],'\"':[\"(/)\",\"B\"],\"#\":[\"(/)\",\"C\"],\"&\":[\"(/)\",\"F\"],\"'\":[\"(/)\",\"G\"],\"(\":[\"(/)\",\"H\"],\")\":[\"(/)\",\"I\"],\"*\":[\"(/)\",\"J\"],\",\":[\"(/)\",\"L\"],\":\":[\"(/)\",\"Z\"],\";\":[\"(%)\",\"F\"],\"<\":[\"(%)\",\"G\"],\"=\":[\"(%)\",\"H\"],\">\":[\"(%)\",\"I\"],\"?\":[\"(%)\",\"J\"],\"@\":[\"(%)\",\"V\"],\"[\":[\"(%)\",\"K\"],\"\\\\\":[\"(%)\",\"L\"],\"]\":[\"(%)\",\"M\"],\"^\":[\"(%)\",\"N\"],_:[\"(%)\",\"O\"],\"`\":[\"(%)\",\"W\"],a:[\"(+)\",\"A\"],b:[\"(+)\",\"B\"],c:[\"(+)\",\"C\"],d:[\"(+)\",\"D\"],e:[\"(+)\",\"E\"],f:[\"(+)\",\"F\"],g:[\"(+)\",\"G\"],h:[\"(+)\",\"H\"],i:[\"(+)\",\"I\"],j:[\"(+)\",\"J\"],k:[\"(+)\",\"K\"],l:[\"(+)\",\"L\"],m:[\"(+)\",\"M\"],n:[\"(+)\",\"N\"],o:[\"(+)\",\"O\"],p:[\"(+)\",\"P\"],q:[\"(+)\",\"Q\"],r:[\"(+)\",\"R\"],s:[\"(+)\",\"S\"],t:[\"(+)\",\"T\"],u:[\"(+)\",\"U\"],v:[\"(+)\",\"V\"],w:[\"(+)\",\"W\"],x:[\"(+)\",\"X\"],y:[\"(+)\",\"Y\"],z:[\"(+)\",\"Z\"],\"{\":[\"(%)\",\"P\"],\"|\":[\"(%)\",\"Q\"],\"}\":[\"(%)\",\"R\"],\"~\":[\"(%)\",\"S\"],\"\":[\"(%)\",\"T\"]}},function(t,e,n){\"use strict\";Object.defineProperty(e,\"__esModule\",{value:!0});var r,o=function(){function t(t,e){for(var n=0;n<e.length;n++){var r=e[n];r.enumerable=r.enumerable||!1,r.configurable=!0,\"value\"in r&&(r.writable=!0),Object.defineProperty(t,r.key,r)}}return function(e,n,r){return n&&t(e.prototype,n),r&&t(e,r),e}}(),i=n(11);var a=function(t){function e(t,n){return function(t,e){if(!(t instanceof e))throw new TypeError(\"Cannot call a class as a function\")}(this,e),function(t,e){if(!t)throw new ReferenceError(\"this hasn't been initialised - super() hasn't been called\");return!e||\"object\"!=typeof e&&\"function\"!=typeof e?t:e}(this,(e.__proto__||Object.getPrototypeOf(e)).call(this,t,n))}return function(t,e){if(\"function\"!=typeof e&&null!==e)throw new TypeError(\"Super expression must either be null or a function, not \"+typeof e);t.prototype=Object.create(e&&e.prototype,{constructor:{value:t,enumerable:!1,writable:!0,configurable:!0}}),e&&(Object.setPrototypeOf?Object.setPrototypeOf(t,e):t.__proto__=e)}(e,t),o(e,[{key:\"valid\",value:function(){return/^[\\x00-\\x7f]+$/.test(this.data)}}]),e}(((r=i)&&r.__esModule?r:{default:r}).default);e.default=a},function(t,e,n){\"use strict\";Object.defineProperty(e,\"__esModule\",{value:!0}),e.GenericBarcode=void 0;var r,o=function(){function t(t,e){for(var n=0;n<e.length;n++){var r=e[n];r.enumerable=r.enumerable||!1,r.configurable=!0,\"value\"in r&&(r.writable=!0),Object.defineProperty(t,r.key,r)}}return function(e,n,r){return n&&t(e.prototype,n),r&&t(e,r),e}}(),i=n(0);var a=function(t){function e(t,n){return function(t,e){if(!(t instanceof e))throw new TypeError(\"Cannot call a class as a function\")}(this,e),function(t,e){if(!t)throw new ReferenceError(\"this hasn't been initialised - super() hasn't been called\");return!e||\"object\"!=typeof e&&\"function\"!=typeof e?t:e}(this,(e.__proto__||Object.getPrototypeOf(e)).call(this,t,n))}return function(t,e){if(\"function\"!=typeof e&&null!==e)throw new TypeError(\"Super expression must either be null or a function, not \"+typeof e);t.prototype=Object.create(e&&e.prototype,{constructor:{value:t,enumerable:!1,writable:!0,configurable:!0}}),e&&(Object.setPrototypeOf?Object.setPrototypeOf(t,e):t.__proto__=e)}(e,t),o(e,[{key:\"encode\",value:function(){return{data:\"10101010101010101010101010101010101010101\",text:this.text}}},{key:\"valid\",value:function(){return!0}}]),e}(((r=i)&&r.__esModule?r:{default:r}).default);e.GenericBarcode=a},function(t,e,n){\"use strict\";Object.defineProperty(e,\"__esModule\",{value:!0}),e.default=function(t){var e=[];return function t(n){if(Array.isArray(n))for(var r=0;r<n.length;r++)t(n[r]);else n.text=n.text||\"\",n.data=n.data||\"\",e.push(n)}(t),e}},function(t,e,n){\"use strict\";Object.defineProperty(e,\"__esModule\",{value:!0}),e.default=function(t){return t.marginTop=t.marginTop||t.margin,t.marginBottom=t.marginBottom||t.margin,t.marginRight=t.marginRight||t.margin,t.marginLeft=t.marginLeft||t.margin,t}},function(t,e,n){\"use strict\";Object.defineProperty(e,\"__esModule\",{value:!0});var r=\"function\"==typeof Symbol&&\"symbol\"==typeof Symbol.iterator?function(t){return typeof t}:function(t){return t&&\"function\"==typeof Symbol&&t.constructor===Symbol&&t!==Symbol.prototype?\"symbol\":typeof t},o=u(n(48)),i=u(n(49)),a=n(15);function u(t){return t&&t.__esModule?t:{default:t}}function f(t){if(\"string\"==typeof t)return function(t){var e=document.querySelectorAll(t);if(0===e.length)return;for(var n=[],r=0;r<e.length;r++)n.push(f(e[r]));return n}(t);if(Array.isArray(t)){for(var e=[],n=0;n<t.length;n++)e.push(f(t[n]));return e}if(\"undefined\"!=typeof HTMLCanvasElement&&t instanceof HTMLImageElement)return u=t,{element:c=document.createElement(\"canvas\"),options:(0,o.default)(u),renderer:i.default.CanvasRenderer,afterRender:function(){u.setAttribute(\"src\",c.toDataURL())}};if(t&&t.nodeName&&\"svg\"===t.nodeName.toLowerCase()||\"undefined\"!=typeof SVGElement&&t instanceof SVGElement)return{element:t,options:(0,o.default)(t),renderer:i.default.SVGRenderer};if(\"undefined\"!=typeof HTMLCanvasElement&&t instanceof HTMLCanvasElement)return{element:t,options:(0,o.default)(t),renderer:i.default.CanvasRenderer};if(t&&t.getContext)return{element:t,renderer:i.default.CanvasRenderer};if(t&&\"object\"===(void 0===t?\"undefined\":r(t))&&!t.nodeName)return{element:t,renderer:i.default.ObjectRenderer};throw new a.InvalidElementException;var u,c}e.default=f},function(t,e,n){\"use strict\";Object.defineProperty(e,\"__esModule\",{value:!0});var r=i(n(12)),o=i(n(13));function i(t){return t&&t.__esModule?t:{default:t}}e.default=function(t){var e={};for(var n in o.default)o.default.hasOwnProperty(n)&&(t.hasAttribute(\"jsbarcode-\"+n.toLowerCase())&&(e[n]=t.getAttribute(\"jsbarcode-\"+n.toLowerCase())),t.hasAttribute(\"data-\"+n.toLowerCase())&&(e[n]=t.getAttribute(\"data-\"+n.toLowerCase())));return e.value=t.getAttribute(\"jsbarcode-value\")||t.getAttribute(\"data-value\"),e=(0,r.default)(e)}},function(t,e,n){\"use strict\";Object.defineProperty(e,\"__esModule\",{value:!0});var r=a(n(50)),o=a(n(51)),i=a(n(52));function a(t){return t&&t.__esModule?t:{default:t}}e.default={CanvasRenderer:r.default,SVGRenderer:o.default,ObjectRenderer:i.default}},function(t,e,n){\"use strict\";Object.defineProperty(e,\"__esModule\",{value:!0});var r,o=function(){function t(t,e){for(var n=0;n<e.length;n++){var r=e[n];r.enumerable=r.enumerable||!1,r.configurable=!0,\"value\"in r&&(r.writable=!0),Object.defineProperty(t,r.key,r)}}return function(e,n,r){return n&&t(e.prototype,n),r&&t(e,r),e}}(),i=n(7),a=(r=i)&&r.__esModule?r:{default:r},u=n(14);var f=function(){function t(e,n,r){!function(t,e){if(!(t instanceof e))throw new TypeError(\"Cannot call a class as a function\")}(this,t),this.canvas=e,this.encodings=n,this.options=r}return o(t,[{key:\"render\",value:function(){if(!this.canvas.getContext)throw new Error(\"The browser does not support canvas.\");this.prepareCanvas();for(var t=0;t<this.encodings.length;t++){var e=(0,a.default)(this.options,this.encodings[t].options);this.drawCanvasBarcode(e,this.encodings[t]),this.drawCanvasText(e,this.encodings[t]),this.moveCanvasDrawing(this.encodings[t])}this.restoreCanvas()}},{key:\"prepareCanvas\",value:function(){var t=this.canvas.getContext(\"2d\");t.save(),(0,u.calculateEncodingAttributes)(this.encodings,this.options,t);var e=(0,u.getTotalWidthOfEncodings)(this.encodings),n=(0,u.getMaximumHeightOfEncodings)(this.encodings);this.canvas.width=e+this.options.marginLeft+this.options.marginRight,this.canvas.height=n,t.clearRect(0,0,this.canvas.width,this.canvas.height),this.options.background&&(t.fillStyle=this.options.background,t.fillRect(0,0,this.canvas.width,this.canvas.height)),t.translate(this.options.marginLeft,0)}},{key:\"drawCanvasBarcode\",value:function(t,e){var n,r=this.canvas.getContext(\"2d\"),o=e.data;n=\"top\"==t.textPosition?t.marginTop+t.fontSize+t.textMargin:t.marginTop,r.fillStyle=t.lineColor;for(var i=0;i<o.length;i++){var a=i*t.width+e.barcodePadding;\"1\"===o[i]?r.fillRect(a,n,t.width,t.height):o[i]&&r.fillRect(a,n,t.width,t.height*o[i])}}},{key:\"drawCanvasText\",value:function(t,e){var n,r,o=this.canvas.getContext(\"2d\"),i=t.fontOptions+\" \"+t.fontSize+\"px \"+t.font;t.displayValue&&(r=\"top\"==t.textPosition?t.marginTop+t.fontSize-t.textMargin:t.height+t.textMargin+t.marginTop+t.fontSize,o.font=i,\"left\"==t.textAlign||e.barcodePadding>0?(n=0,o.textAlign=\"left\"):\"right\"==t.textAlign?(n=e.width-1,o.textAlign=\"right\"):(n=e.width/2,o.textAlign=\"center\"),o.fillText(e.text,n,r))}},{key:\"moveCanvasDrawing\",value:function(t){this.canvas.getContext(\"2d\").translate(t.width,0)}},{key:\"restoreCanvas\",value:function(){this.canvas.getContext(\"2d\").restore()}}]),t}();e.default=f},function(t,e,n){\"use strict\";Object.defineProperty(e,\"__esModule\",{value:!0});var r,o=function(){function t(t,e){for(var n=0;n<e.length;n++){var r=e[n];r.enumerable=r.enumerable||!1,r.configurable=!0,\"value\"in r&&(r.writable=!0),Object.defineProperty(t,r.key,r)}}return function(e,n,r){return n&&t(e.prototype,n),r&&t(e,r),e}}(),i=n(7),a=(r=i)&&r.__esModule?r:{default:r},u=n(14);var f=\"http://www.w3.org/2000/svg\",c=function(){function t(e,n,r){!function(t,e){if(!(t instanceof e))throw new TypeError(\"Cannot call a class as a function\")}(this,t),this.svg=e,this.encodings=n,this.options=r,this.document=r.xmlDocument||document}return o(t,[{key:\"render\",value:function(){var t=this.options.marginLeft;this.prepareSVG();for(var e=0;e<this.encodings.length;e++){var n=this.encodings[e],r=(0,a.default)(this.options,n.options),o=this.createGroup(t,r.marginTop,this.svg);this.setGroupOptions(o,r),this.drawSvgBarcode(o,r,n),this.drawSVGText(o,r,n),t+=n.width}}},{key:\"prepareSVG\",value:function(){for(;this.svg.firstChild;)this.svg.removeChild(this.svg.firstChild);(0,u.calculateEncodingAttributes)(this.encodings,this.options);var t=(0,u.getTotalWidthOfEncodings)(this.encodings),e=(0,u.getMaximumHeightOfEncodings)(this.encodings),n=t+this.options.marginLeft+this.options.marginRight;this.setSvgAttributes(n,e),this.options.background&&this.drawRect(0,0,n,e,this.svg).setAttribute(\"fill\",this.options.background)}},{key:\"drawSvgBarcode\",value:function(t,e,n){var r,o=n.data;r=\"top\"==e.textPosition?e.fontSize+e.textMargin:0;for(var i=0,a=0,u=0;u<o.length;u++)a=u*e.width+n.barcodePadding,\"1\"===o[u]?i++:i>0&&(this.drawRect(a-e.width*i,r,e.width*i,e.height,t),i=0);i>0&&this.drawRect(a-e.width*(i-1),r,e.width*i,e.height,t)}},{key:\"drawSVGText\",value:function(t,e,n){var r,o,i=this.document.createElementNS(f,\"text\");e.displayValue&&(i.setAttribute(\"font-family\",e.font),i.setAttribute(\"font-size\",e.fontSize),e.fontOptions.includes(\"bold\")&&i.setAttribute(\"font-weight\",\"bold\"),e.fontOptions.includes(\"italic\")&&i.setAttribute(\"font-style\",\"italic\"),o=\"top\"==e.textPosition?e.fontSize-e.textMargin:e.height+e.textMargin+e.fontSize,\"left\"==e.textAlign||n.barcodePadding>0?(r=0,i.setAttribute(\"text-anchor\",\"start\")):\"right\"==e.textAlign?(r=n.width-1,i.setAttribute(\"text-anchor\",\"end\")):(r=n.width/2,i.setAttribute(\"text-anchor\",\"middle\")),i.setAttribute(\"x\",r),i.setAttribute(\"y\",o),i.appendChild(this.document.createTextNode(n.text)),t.appendChild(i))}},{key:\"setSvgAttributes\",value:function(t,e){var n=this.svg;n.setAttribute(\"width\",t+\"px\"),n.setAttribute(\"height\",e+\"px\"),n.setAttribute(\"x\",\"0px\"),n.setAttribute(\"y\",\"0px\"),n.setAttribute(\"viewBox\",\"0 0 \"+t+\" \"+e),n.setAttribute(\"xmlns\",f),n.setAttribute(\"version\",\"1.1\")}},{key:\"createGroup\",value:function(t,e,n){var r=this.document.createElementNS(f,\"g\");return r.setAttribute(\"transform\",\"translate(\"+t+\", \"+e+\")\"),n.appendChild(r),r}},{key:\"setGroupOptions\",value:function(t,e){t.setAttribute(\"fill\",e.lineColor)}},{key:\"drawRect\",value:function(t,e,n,r,o){var i=this.document.createElementNS(f,\"rect\");return i.setAttribute(\"x\",t),i.setAttribute(\"y\",e),i.setAttribute(\"width\",n),i.setAttribute(\"height\",r),o.appendChild(i),i}}]),t}();e.default=c},function(t,e,n){\"use strict\";Object.defineProperty(e,\"__esModule\",{value:!0});var r=function(){function t(t,e){for(var n=0;n<e.length;n++){var r=e[n];r.enumerable=r.enumerable||!1,r.configurable=!0,\"value\"in r&&(r.writable=!0),Object.defineProperty(t,r.key,r)}}return function(e,n,r){return n&&t(e.prototype,n),r&&t(e,r),e}}();var o=function(){function t(e,n,r){!function(t,e){if(!(t instanceof e))throw new TypeError(\"Cannot call a class as a function\")}(this,t),this.object=e,this.encodings=n,this.options=r}return r(t,[{key:\"render\",value:function(){this.object.encodings=this.encodings}}]),t}();e.default=o},function(t,e,n){\"use strict\";Object.defineProperty(e,\"__esModule\",{value:!0});var r=function(){function t(t,e){for(var n=0;n<e.length;n++){var r=e[n];r.enumerable=r.enumerable||!1,r.configurable=!0,\"value\"in r&&(r.writable=!0),Object.defineProperty(t,r.key,r)}}return function(e,n,r){return n&&t(e.prototype,n),r&&t(e,r),e}}();var o=function(){function t(e){!function(t,e){if(!(t instanceof e))throw new TypeError(\"Cannot call a class as a function\")}(this,t),this.api=e}return r(t,[{key:\"handleCatch\",value:function(t){if(\"InvalidInputException\"!==t.name)throw t;if(this.api._options.valid===this.api._defaults.valid)throw t.message;this.api._options.valid(!1),this.api.render=function(){}}},{key:\"wrapBarcodeCall\",value:function(t){try{var e=t.apply(void 0,arguments);return this.api._options.valid(!0),e}catch(t){return this.handleCatch(t),this.api}}}]),t}();e.default=o}]);\n/*! Raven.js 3.27.2 (6d91db933) | github.com/getsentry/raven-js */\n\n/*\n * Includes TraceKit\n * https://github.com/getsentry/TraceKit\n *\n * Copyright (c) 2019 Sentry (https://sentry.io) and individual contributors.\n * All rights reserved.\n * https://github.com/getsentry/sentry-javascript/blob/master/packages/raven-js/LICENSE\n *\n */\n\n(function(f){if(typeof exports===\"object\"&&typeof module!==\"undefined\"){module.exports=f()}else if(typeof define===\"function\"&&define.amd){define([],f)}else{var g;if(typeof window!==\"undefined\"){g=window}else if(typeof global!==\"undefined\"){g=global}else if(typeof self!==\"undefined\"){g=self}else{g=this}g.Raven = f()}})(function(){var define,module,exports;return (function e(t,n,r){function s(o,u){if(!n[o]){if(!t[o]){var a=typeof require==\"function\"&&require;if(!u&&a)return a(o,!0);if(i)return i(o,!0);var f=new Error(\"Cannot find module '\"+o+\"'\");throw f.code=\"MODULE_NOT_FOUND\",f}var l=n[o]={exports:{}};t[o][0].call(l.exports,function(e){var n=t[o][1][e];return s(n?n:e)},l,l.exports,e,t,n,r)}return n[o].exports}var i=typeof require==\"function\"&&require;for(var o=0;o<r.length;o++)s(r[o]);return s})({1:[function(_dereq_,module,exports){\nfunction RavenConfigError(message) {\n  this.name = 'RavenConfigError';\n  this.message = message;\n}\nRavenConfigError.prototype = new Error();\nRavenConfigError.prototype.constructor = RavenConfigError;\n\nmodule.exports = RavenConfigError;\n\n},{}],2:[function(_dereq_,module,exports){\nvar utils = _dereq_(5);\n\nvar wrapMethod = function(console, level, callback) {\n  var originalConsoleLevel = console[level];\n  var originalConsole = console;\n\n  if (!(level in console)) {\n    return;\n  }\n\n  var sentryLevel = level === 'warn' ? 'warning' : level;\n\n  console[level] = function() {\n    var args = [].slice.call(arguments);\n\n    var msg = utils.safeJoin(args, ' ');\n    var data = {level: sentryLevel, logger: 'console', extra: {arguments: args}};\n\n    if (level === 'assert') {\n      if (args[0] === false) {\n        // Default browsers message\n        msg =\n          'Assertion failed: ' + (utils.safeJoin(args.slice(1), ' ') || 'console.assert');\n        data.extra.arguments = args.slice(1);\n        callback && callback(msg, data);\n      }\n    } else {\n      callback && callback(msg, data);\n    }\n\n    // this fails for some browsers. :(\n    if (originalConsoleLevel) {\n      // IE9 doesn't allow calling apply on console functions directly\n      // See: https://stackoverflow.com/questions/5472938/does-ie9-support-console-log-and-is-it-a-real-function#answer-5473193\n      Function.prototype.apply.call(originalConsoleLevel, originalConsole, args);\n    }\n  };\n};\n\nmodule.exports = {\n  wrapMethod: wrapMethod\n};\n\n},{\"5\":5}],3:[function(_dereq_,module,exports){\n(function (global){\n/*global XDomainRequest:false */\n\nvar TraceKit = _dereq_(6);\nvar stringify = _dereq_(7);\nvar md5 = _dereq_(8);\nvar RavenConfigError = _dereq_(1);\n\nvar utils = _dereq_(5);\nvar isErrorEvent = utils.isErrorEvent;\nvar isDOMError = utils.isDOMError;\nvar isDOMException = utils.isDOMException;\nvar isError = utils.isError;\nvar isObject = utils.isObject;\nvar isPlainObject = utils.isPlainObject;\nvar isUndefined = utils.isUndefined;\nvar isFunction = utils.isFunction;\nvar isString = utils.isString;\nvar isArray = utils.isArray;\nvar isEmptyObject = utils.isEmptyObject;\nvar each = utils.each;\nvar objectMerge = utils.objectMerge;\nvar truncate = utils.truncate;\nvar objectFrozen = utils.objectFrozen;\nvar hasKey = utils.hasKey;\nvar joinRegExp = utils.joinRegExp;\nvar urlencode = utils.urlencode;\nvar uuid4 = utils.uuid4;\nvar htmlTreeAsString = utils.htmlTreeAsString;\nvar isSameException = utils.isSameException;\nvar isSameStacktrace = utils.isSameStacktrace;\nvar parseUrl = utils.parseUrl;\nvar fill = utils.fill;\nvar supportsFetch = utils.supportsFetch;\nvar supportsReferrerPolicy = utils.supportsReferrerPolicy;\nvar serializeKeysForMessage = utils.serializeKeysForMessage;\nvar serializeException = utils.serializeException;\nvar sanitize = utils.sanitize;\n\nvar wrapConsoleMethod = _dereq_(2).wrapMethod;\n\nvar dsnKeys = 'source protocol user pass host port path'.split(' '),\n  dsnPattern = /^(?:(\\w+):)?\\/\\/(?:(\\w+)(:\\w+)?@)?([\\w\\.-]+)(?::(\\d+))?(\\/.*)/;\n\nfunction now() {\n  return +new Date();\n}\n\n// This is to be defensive in environments where window does not exist (see https://github.com/getsentry/raven-js/pull/785)\nvar _window =\n  typeof window !== 'undefined'\n    ? window\n    : typeof global !== 'undefined' ? global : typeof self !== 'undefined' ? self : {};\nvar _document = _window.document;\nvar _navigator = _window.navigator;\n\nfunction keepOriginalCallback(original, callback) {\n  return isFunction(callback)\n    ? function(data) {\n        return callback(data, original);\n      }\n    : callback;\n}\n\n// First, check for JSON support\n// If there is no JSON, we no-op the core features of Raven\n// since JSON is required to encode the payload\nfunction Raven() {\n  this._hasJSON = !!(typeof JSON === 'object' && JSON.stringify);\n  // Raven can run in contexts where there's no document (react-native)\n  this._hasDocument = !isUndefined(_document);\n  this._hasNavigator = !isUndefined(_navigator);\n  this._lastCapturedException = null;\n  this._lastData = null;\n  this._lastEventId = null;\n  this._globalServer = null;\n  this._globalKey = null;\n  this._globalProject = null;\n  this._globalContext = {};\n  this._globalOptions = {\n    // SENTRY_RELEASE can be injected by https://github.com/getsentry/sentry-webpack-plugin\n    release: _window.SENTRY_RELEASE && _window.SENTRY_RELEASE.id,\n    logger: 'javascript',\n    ignoreErrors: [],\n    ignoreUrls: [],\n    whitelistUrls: [],\n    includePaths: [],\n    headers: null,\n    collectWindowErrors: true,\n    captureUnhandledRejections: true,\n    maxMessageLength: 0,\n    // By default, truncates URL values to 250 chars\n    maxUrlLength: 250,\n    stackTraceLimit: 50,\n    autoBreadcrumbs: true,\n    instrument: true,\n    sampleRate: 1,\n    sanitizeKeys: []\n  };\n  this._fetchDefaults = {\n    method: 'POST',\n    // Despite all stars in the sky saying that Edge supports old draft syntax, aka 'never', 'always', 'origin' and 'default\n    // https://caniuse.com/#feat=referrer-policy\n    // It doesn't. And it throw exception instead of ignoring this parameter...\n    // REF: https://github.com/getsentry/raven-js/issues/1233\n    referrerPolicy: supportsReferrerPolicy() ? 'origin' : ''\n  };\n  this._ignoreOnError = 0;\n  this._isRavenInstalled = false;\n  this._originalErrorStackTraceLimit = Error.stackTraceLimit;\n  // capture references to window.console *and* all its methods first\n  // before the console plugin has a chance to monkey patch\n  this._originalConsole = _window.console || {};\n  this._originalConsoleMethods = {};\n  this._plugins = [];\n  this._startTime = now();\n  this._wrappedBuiltIns = [];\n  this._breadcrumbs = [];\n  this._lastCapturedEvent = null;\n  this._keypressTimeout;\n  this._location = _window.location;\n  this._lastHref = this._location && this._location.href;\n  this._resetBackoff();\n\n  // eslint-disable-next-line guard-for-in\n  for (var method in this._originalConsole) {\n    this._originalConsoleMethods[method] = this._originalConsole[method];\n  }\n}\n\n/*\n * The core Raven singleton\n *\n * @this {Raven}\n */\n\nRaven.prototype = {\n  // Hardcode version string so that raven source can be loaded directly via\n  // webpack (using a build step causes webpack #1617). Grunt verifies that\n  // this value matches package.json during build.\n  //   See: https://github.com/getsentry/raven-js/issues/465\n  VERSION: '3.27.2',\n\n  debug: false,\n\n  TraceKit: TraceKit, // alias to TraceKit\n\n  /*\n     * Configure Raven with a DSN and extra options\n     *\n     * @param {string} dsn The public Sentry DSN\n     * @param {object} options Set of global options [optional]\n     * @return {Raven}\n     */\n  config: function(dsn, options) {\n    var self = this;\n\n    if (self._globalServer) {\n      this._logDebug('error', 'Error: Raven has already been configured');\n      return self;\n    }\n    if (!dsn) return self;\n\n    var globalOptions = self._globalOptions;\n\n    // merge in options\n    if (options) {\n      each(options, function(key, value) {\n        // tags and extra are special and need to be put into context\n        if (key === 'tags' || key === 'extra' || key === 'user') {\n          self._globalContext[key] = value;\n        } else {\n          globalOptions[key] = value;\n        }\n      });\n    }\n\n    self.setDSN(dsn);\n\n    // \"Script error.\" is hard coded into browsers for errors that it can't read.\n    // this is the result of a script being pulled in from an external domain and CORS.\n    globalOptions.ignoreErrors.push(/^Script error\\.?$/);\n    globalOptions.ignoreErrors.push(/^Javascript error: Script error\\.? on line 0$/);\n\n    // join regexp rules into one big rule\n    globalOptions.ignoreErrors = joinRegExp(globalOptions.ignoreErrors);\n    globalOptions.ignoreUrls = globalOptions.ignoreUrls.length\n      ? joinRegExp(globalOptions.ignoreUrls)\n      : false;\n    globalOptions.whitelistUrls = globalOptions.whitelistUrls.length\n      ? joinRegExp(globalOptions.whitelistUrls)\n      : false;\n    globalOptions.includePaths = joinRegExp(globalOptions.includePaths);\n    globalOptions.maxBreadcrumbs = Math.max(\n      0,\n      Math.min(globalOptions.maxBreadcrumbs || 100, 100)\n    ); // default and hard limit is 100\n\n    var autoBreadcrumbDefaults = {\n      xhr: true,\n      console: true,\n      dom: true,\n      location: true,\n      sentry: true\n    };\n\n    var autoBreadcrumbs = globalOptions.autoBreadcrumbs;\n    if ({}.toString.call(autoBreadcrumbs) === '[object Object]') {\n      autoBreadcrumbs = objectMerge(autoBreadcrumbDefaults, autoBreadcrumbs);\n    } else if (autoBreadcrumbs !== false) {\n      autoBreadcrumbs = autoBreadcrumbDefaults;\n    }\n    globalOptions.autoBreadcrumbs = autoBreadcrumbs;\n\n    var instrumentDefaults = {\n      tryCatch: true\n    };\n\n    var instrument = globalOptions.instrument;\n    if ({}.toString.call(instrument) === '[object Object]') {\n      instrument = objectMerge(instrumentDefaults, instrument);\n    } else if (instrument !== false) {\n      instrument = instrumentDefaults;\n    }\n    globalOptions.instrument = instrument;\n\n    TraceKit.collectWindowErrors = !!globalOptions.collectWindowErrors;\n\n    // return for chaining\n    return self;\n  },\n\n  /*\n     * Installs a global window.onerror error handler\n     * to capture and report uncaught exceptions.\n     * At this point, install() is required to be called due\n     * to the way TraceKit is set up.\n     *\n     * @return {Raven}\n     */\n  install: function() {\n    var self = this;\n    if (self.isSetup() && !self._isRavenInstalled) {\n      TraceKit.report.subscribe(function() {\n        self._handleOnErrorStackInfo.apply(self, arguments);\n      });\n\n      if (self._globalOptions.captureUnhandledRejections) {\n        self._attachPromiseRejectionHandler();\n      }\n\n      self._patchFunctionToString();\n\n      if (self._globalOptions.instrument && self._globalOptions.instrument.tryCatch) {\n        self._instrumentTryCatch();\n      }\n\n      if (self._globalOptions.autoBreadcrumbs) self._instrumentBreadcrumbs();\n\n      // Install all of the plugins\n      self._drainPlugins();\n\n      self._isRavenInstalled = true;\n    }\n\n    Error.stackTraceLimit = self._globalOptions.stackTraceLimit;\n    return this;\n  },\n\n  /*\n     * Set the DSN (can be called multiple time unlike config)\n     *\n     * @param {string} dsn The public Sentry DSN\n     */\n  setDSN: function(dsn) {\n    var self = this,\n      uri = self._parseDSN(dsn),\n      lastSlash = uri.path.lastIndexOf('/'),\n      path = uri.path.substr(1, lastSlash);\n\n    self._dsn = dsn;\n    self._globalKey = uri.user;\n    self._globalSecret = uri.pass && uri.pass.substr(1);\n    self._globalProject = uri.path.substr(lastSlash + 1);\n\n    self._globalServer = self._getGlobalServer(uri);\n\n    self._globalEndpoint =\n      self._globalServer + '/' + path + 'api/' + self._globalProject + '/store/';\n\n    // Reset backoff state since we may be pointing at a\n    // new project/server\n    this._resetBackoff();\n  },\n\n  /*\n     * Wrap code within a context so Raven can capture errors\n     * reliably across domains that is executed immediately.\n     *\n     * @param {object} options A specific set of options for this context [optional]\n     * @param {function} func The callback to be immediately executed within the context\n     * @param {array} args An array of arguments to be called with the callback [optional]\n     */\n  context: function(options, func, args) {\n    if (isFunction(options)) {\n      args = func || [];\n      func = options;\n      options = {};\n    }\n\n    return this.wrap(options, func).apply(this, args);\n  },\n\n  /*\n     * Wrap code within a context and returns back a new function to be executed\n     *\n     * @param {object} options A specific set of options for this context [optional]\n     * @param {function} func The function to be wrapped in a new context\n     * @param {function} _before A function to call before the try/catch wrapper [optional, private]\n     * @return {function} The newly wrapped functions with a context\n     */\n  wrap: function(options, func, _before) {\n    var self = this;\n    // 1 argument has been passed, and it's not a function\n    // so just return it\n    if (isUndefined(func) && !isFunction(options)) {\n      return options;\n    }\n\n    // options is optional\n    if (isFunction(options)) {\n      func = options;\n      options = undefined;\n    }\n\n    // At this point, we've passed along 2 arguments, and the second one\n    // is not a function either, so we'll just return the second argument.\n    if (!isFunction(func)) {\n      return func;\n    }\n\n    // We don't wanna wrap it twice!\n    try {\n      if (func.__raven__) {\n        return func;\n      }\n\n      // If this has already been wrapped in the past, return that\n      if (func.__raven_wrapper__) {\n        return func.__raven_wrapper__;\n      }\n    } catch (e) {\n      // Just accessing custom props in some Selenium environments\n      // can cause a \"Permission denied\" exception (see raven-js#495).\n      // Bail on wrapping and return the function as-is (defers to window.onerror).\n      return func;\n    }\n\n    function wrapped() {\n      var args = [],\n        i = arguments.length,\n        deep = !options || (options && options.deep !== false);\n\n      if (_before && isFunction(_before)) {\n        _before.apply(this, arguments);\n      }\n\n      // Recursively wrap all of a function's arguments that are\n      // functions themselves.\n      while (i--) args[i] = deep ? self.wrap(options, arguments[i]) : arguments[i];\n\n      try {\n        // Attempt to invoke user-land function\n        // NOTE: If you are a Sentry user, and you are seeing this stack frame, it\n        //       means Raven caught an error invoking your application code. This is\n        //       expected behavior and NOT indicative of a bug with Raven.js.\n        return func.apply(this, args);\n      } catch (e) {\n        self._ignoreNextOnError();\n        self.captureException(e, options);\n        throw e;\n      }\n    }\n\n    // copy over properties of the old function\n    for (var property in func) {\n      if (hasKey(func, property)) {\n        wrapped[property] = func[property];\n      }\n    }\n    wrapped.prototype = func.prototype;\n\n    func.__raven_wrapper__ = wrapped;\n    // Signal that this function has been wrapped/filled already\n    // for both debugging and to prevent it to being wrapped/filled twice\n    wrapped.__raven__ = true;\n    wrapped.__orig__ = func;\n\n    return wrapped;\n  },\n\n  /**\n   * Uninstalls the global error handler.\n   *\n   * @return {Raven}\n   */\n  uninstall: function() {\n    TraceKit.report.uninstall();\n\n    this._detachPromiseRejectionHandler();\n    this._unpatchFunctionToString();\n    this._restoreBuiltIns();\n    this._restoreConsole();\n\n    Error.stackTraceLimit = this._originalErrorStackTraceLimit;\n    this._isRavenInstalled = false;\n\n    return this;\n  },\n\n  /**\n   * Callback used for `unhandledrejection` event\n   *\n   * @param {PromiseRejectionEvent} event An object containing\n   *   promise: the Promise that was rejected\n   *   reason: the value with which the Promise was rejected\n   * @return void\n   */\n  _promiseRejectionHandler: function(event) {\n    this._logDebug('debug', 'Raven caught unhandled promise rejection:', event);\n    this.captureException(event.reason, {\n      mechanism: {\n        type: 'onunhandledrejection',\n        handled: false\n      }\n    });\n  },\n\n  /**\n   * Installs the global promise rejection handler.\n   *\n   * @return {raven}\n   */\n  _attachPromiseRejectionHandler: function() {\n    this._promiseRejectionHandler = this._promiseRejectionHandler.bind(this);\n    _window.addEventListener &&\n      _window.addEventListener('unhandledrejection', this._promiseRejectionHandler);\n    return this;\n  },\n\n  /**\n   * Uninstalls the global promise rejection handler.\n   *\n   * @return {raven}\n   */\n  _detachPromiseRejectionHandler: function() {\n    _window.removeEventListener &&\n      _window.removeEventListener('unhandledrejection', this._promiseRejectionHandler);\n    return this;\n  },\n\n  /**\n   * Manually capture an exception and send it over to Sentry\n   *\n   * @param {error} ex An exception to be logged\n   * @param {object} options A specific set of options for this error [optional]\n   * @return {Raven}\n   */\n  captureException: function(ex, options) {\n    options = objectMerge({trimHeadFrames: 0}, options ? options : {});\n\n    if (isErrorEvent(ex) && ex.error) {\n      // If it is an ErrorEvent with `error` property, extract it to get actual Error\n      ex = ex.error;\n    } else if (isDOMError(ex) || isDOMException(ex)) {\n      // If it is a DOMError or DOMException (which are legacy APIs, but still supported in some browsers)\n      // then we just extract the name and message, as they don't provide anything else\n      // https://developer.mozilla.org/en-US/docs/Web/API/DOMError\n      // https://developer.mozilla.org/en-US/docs/Web/API/DOMException\n      var name = ex.name || (isDOMError(ex) ? 'DOMError' : 'DOMException');\n      var message = ex.message ? name + ': ' + ex.message : name;\n\n      return this.captureMessage(\n        message,\n        objectMerge(options, {\n          // neither DOMError or DOMException provide stack trace and we most likely wont get it this way as well\n          // but it's barely any overhead so we may at least try\n          stacktrace: true,\n          trimHeadFrames: options.trimHeadFrames + 1\n        })\n      );\n    } else if (isError(ex)) {\n      // we have a real Error object\n      ex = ex;\n    } else if (isPlainObject(ex)) {\n      // If it is plain Object, serialize it manually and extract options\n      // This will allow us to group events based on top-level keys\n      // which is much better than creating new group when any key/value change\n      options = this._getCaptureExceptionOptionsFromPlainObject(options, ex);\n      ex = new Error(options.message);\n    } else {\n      // If none of previous checks were valid, then it means that\n      // it's not a DOMError/DOMException\n      // it's not a plain Object\n      // it's not a valid ErrorEvent (one with an error property)\n      // it's not an Error\n      // So bail out and capture it as a simple message:\n      return this.captureMessage(\n        ex,\n        objectMerge(options, {\n          stacktrace: true, // if we fall back to captureMessage, default to attempting a new trace\n          trimHeadFrames: options.trimHeadFrames + 1\n        })\n      );\n    }\n\n    // Store the raw exception object for potential debugging and introspection\n    this._lastCapturedException = ex;\n\n    // TraceKit.report will re-raise any exception passed to it,\n    // which means you have to wrap it in try/catch. Instead, we\n    // can wrap it here and only re-raise if TraceKit.report\n    // raises an exception different from the one we asked to\n    // report on.\n    try {\n      var stack = TraceKit.computeStackTrace(ex);\n      this._handleStackInfo(stack, options);\n    } catch (ex1) {\n      if (ex !== ex1) {\n        throw ex1;\n      }\n    }\n\n    return this;\n  },\n\n  _getCaptureExceptionOptionsFromPlainObject: function(currentOptions, ex) {\n    var exKeys = Object.keys(ex).sort();\n    var options = objectMerge(currentOptions, {\n      message:\n        'Non-Error exception captured with keys: ' + serializeKeysForMessage(exKeys),\n      fingerprint: [md5(exKeys)],\n      extra: currentOptions.extra || {}\n    });\n    options.extra.__serialized__ = serializeException(ex);\n\n    return options;\n  },\n\n  /*\n     * Manually send a message to Sentry\n     *\n     * @param {string} msg A plain message to be captured in Sentry\n     * @param {object} options A specific set of options for this message [optional]\n     * @return {Raven}\n     */\n  captureMessage: function(msg, options) {\n    // config() automagically converts ignoreErrors from a list to a RegExp so we need to test for an\n    // early call; we'll error on the side of logging anything called before configuration since it's\n    // probably something you should see:\n    if (\n      !!this._globalOptions.ignoreErrors.test &&\n      this._globalOptions.ignoreErrors.test(msg)\n    ) {\n      return;\n    }\n\n    options = options || {};\n    msg = msg + ''; // Make sure it's actually a string\n\n    var data = objectMerge(\n      {\n        message: msg\n      },\n      options\n    );\n\n    var ex;\n    // Generate a \"synthetic\" stack trace from this point.\n    // NOTE: If you are a Sentry user, and you are seeing this stack frame, it is NOT indicative\n    //       of a bug with Raven.js. Sentry generates synthetic traces either by configuration,\n    //       or if it catches a thrown object without a \"stack\" property.\n    try {\n      throw new Error(msg);\n    } catch (ex1) {\n      ex = ex1;\n    }\n\n    // null exception name so `Error` isn't prefixed to msg\n    ex.name = null;\n    var stack = TraceKit.computeStackTrace(ex);\n\n    // stack[0] is `throw new Error(msg)` call itself, we are interested in the frame that was just before that, stack[1]\n    var initialCall = isArray(stack.stack) && stack.stack[1];\n\n    // if stack[1] is `Raven.captureException`, it means that someone passed a string to it and we redirected that call\n    // to be handled by `captureMessage`, thus `initialCall` is the 3rd one, not 2nd\n    // initialCall => captureException(string) => captureMessage(string)\n    if (initialCall && initialCall.func === 'Raven.captureException') {\n      initialCall = stack.stack[2];\n    }\n\n    var fileurl = (initialCall && initialCall.url) || '';\n\n    if (\n      !!this._globalOptions.ignoreUrls.test &&\n      this._globalOptions.ignoreUrls.test(fileurl)\n    ) {\n      return;\n    }\n\n    if (\n      !!this._globalOptions.whitelistUrls.test &&\n      !this._globalOptions.whitelistUrls.test(fileurl)\n    ) {\n      return;\n    }\n\n    // Always attempt to get stacktrace if message is empty.\n    // It's the only way to provide any helpful information to the user.\n    if (this._globalOptions.stacktrace || options.stacktrace || data.message === '') {\n      // fingerprint on msg, not stack trace (legacy behavior, could be revisited)\n      data.fingerprint = data.fingerprint == null ? msg : data.fingerprint;\n\n      options = objectMerge(\n        {\n          trimHeadFrames: 0\n        },\n        options\n      );\n      // Since we know this is a synthetic trace, the top frame (this function call)\n      // MUST be from Raven.js, so mark it for trimming\n      // We add to the trim counter so that callers can choose to trim extra frames, such\n      // as utility functions.\n      options.trimHeadFrames += 1;\n\n      var frames = this._prepareFrames(stack, options);\n      data.stacktrace = {\n        // Sentry expects frames oldest to newest\n        frames: frames.reverse()\n      };\n    }\n\n    // Make sure that fingerprint is always wrapped in an array\n    if (data.fingerprint) {\n      data.fingerprint = isArray(data.fingerprint)\n        ? data.fingerprint\n        : [data.fingerprint];\n    }\n\n    // Fire away!\n    this._send(data);\n\n    return this;\n  },\n\n  captureBreadcrumb: function(obj) {\n    var crumb = objectMerge(\n      {\n        timestamp: now() / 1000\n      },\n      obj\n    );\n\n    if (isFunction(this._globalOptions.breadcrumbCallback)) {\n      var result = this._globalOptions.breadcrumbCallback(crumb);\n\n      if (isObject(result) && !isEmptyObject(result)) {\n        crumb = result;\n      } else if (result === false) {\n        return this;\n      }\n    }\n\n    this._breadcrumbs.push(crumb);\n    if (this._breadcrumbs.length > this._globalOptions.maxBreadcrumbs) {\n      this._breadcrumbs.shift();\n    }\n    return this;\n  },\n\n  addPlugin: function(plugin /*arg1, arg2, ... argN*/) {\n    var pluginArgs = [].slice.call(arguments, 1);\n\n    this._plugins.push([plugin, pluginArgs]);\n    if (this._isRavenInstalled) {\n      this._drainPlugins();\n    }\n\n    return this;\n  },\n\n  /*\n     * Set/clear a user to be sent along with the payload.\n     *\n     * @param {object} user An object representing user data [optional]\n     * @return {Raven}\n     */\n  setUserContext: function(user) {\n    // Intentionally do not merge here since that's an unexpected behavior.\n    this._globalContext.user = user;\n\n    return this;\n  },\n\n  /*\n     * Merge extra attributes to be sent along with the payload.\n     *\n     * @param {object} extra An object representing extra data [optional]\n     * @return {Raven}\n     */\n  setExtraContext: function(extra) {\n    this._mergeContext('extra', extra);\n\n    return this;\n  },\n\n  /*\n     * Merge tags to be sent along with the payload.\n     *\n     * @param {object} tags An object representing tags [optional]\n     * @return {Raven}\n     */\n  setTagsContext: function(tags) {\n    this._mergeContext('tags', tags);\n\n    return this;\n  },\n\n  /*\n     * Clear all of the context.\n     *\n     * @return {Raven}\n     */\n  clearContext: function() {\n    this._globalContext = {};\n\n    return this;\n  },\n\n  /*\n     * Get a copy of the current context. This cannot be mutated.\n     *\n     * @return {object} copy of context\n     */\n  getContext: function() {\n    // lol javascript\n    return JSON.parse(stringify(this._globalContext));\n  },\n\n  /*\n     * Set environment of application\n     *\n     * @param {string} environment Typically something like 'production'.\n     * @return {Raven}\n     */\n  setEnvironment: function(environment) {\n    this._globalOptions.environment = environment;\n\n    return this;\n  },\n\n  /*\n     * Set release version of application\n     *\n     * @param {string} release Typically something like a git SHA to identify version\n     * @return {Raven}\n     */\n  setRelease: function(release) {\n    this._globalOptions.release = release;\n\n    return this;\n  },\n\n  /*\n     * Set the dataCallback option\n     *\n     * @param {function} callback The callback to run which allows the\n     *                            data blob to be mutated before sending\n     * @return {Raven}\n     */\n  setDataCallback: function(callback) {\n    var original = this._globalOptions.dataCallback;\n    this._globalOptions.dataCallback = keepOriginalCallback(original, callback);\n    return this;\n  },\n\n  /*\n     * Set the breadcrumbCallback option\n     *\n     * @param {function} callback The callback to run which allows filtering\n     *                            or mutating breadcrumbs\n     * @return {Raven}\n     */\n  setBreadcrumbCallback: function(callback) {\n    var original = this._globalOptions.breadcrumbCallback;\n    this._globalOptions.breadcrumbCallback = keepOriginalCallback(original, callback);\n    return this;\n  },\n\n  /*\n     * Set the shouldSendCallback option\n     *\n     * @param {function} callback The callback to run which allows\n     *                            introspecting the blob before sending\n     * @return {Raven}\n     */\n  setShouldSendCallback: function(callback) {\n    var original = this._globalOptions.shouldSendCallback;\n    this._globalOptions.shouldSendCallback = keepOriginalCallback(original, callback);\n    return this;\n  },\n\n  /**\n   * Override the default HTTP transport mechanism that transmits data\n   * to the Sentry server.\n   *\n   * @param {function} transport Function invoked instead of the default\n   *                             `makeRequest` handler.\n   *\n   * @return {Raven}\n   */\n  setTransport: function(transport) {\n    this._globalOptions.transport = transport;\n\n    return this;\n  },\n\n  /*\n     * Get the latest raw exception that was captured by Raven.\n     *\n     * @return {error}\n     */\n  lastException: function() {\n    return this._lastCapturedException;\n  },\n\n  /*\n     * Get the last event id\n     *\n     * @return {string}\n     */\n  lastEventId: function() {\n    return this._lastEventId;\n  },\n\n  /*\n     * Determine if Raven is setup and ready to go.\n     *\n     * @return {boolean}\n     */\n  isSetup: function() {\n    if (!this._hasJSON) return false; // needs JSON support\n    if (!this._globalServer) {\n      if (!this.ravenNotConfiguredError) {\n        this.ravenNotConfiguredError = true;\n        this._logDebug('error', 'Error: Raven has not been configured.');\n      }\n      return false;\n    }\n    return true;\n  },\n\n  afterLoad: function() {\n    // TODO: remove window dependence?\n\n    // Attempt to initialize Raven on load\n    var RavenConfig = _window.RavenConfig;\n    if (RavenConfig) {\n      this.config(RavenConfig.dsn, RavenConfig.config).install();\n    }\n  },\n\n  showReportDialog: function(options) {\n    if (\n      !_document // doesn't work without a document (React native)\n    )\n      return;\n\n    options = objectMerge(\n      {\n        eventId: this.lastEventId(),\n        dsn: this._dsn,\n        user: this._globalContext.user || {}\n      },\n      options\n    );\n\n    if (!options.eventId) {\n      throw new RavenConfigError('Missing eventId');\n    }\n\n    if (!options.dsn) {\n      throw new RavenConfigError('Missing DSN');\n    }\n\n    var encode = encodeURIComponent;\n    var encodedOptions = [];\n\n    for (var key in options) {\n      if (key === 'user') {\n        var user = options.user;\n        if (user.name) encodedOptions.push('name=' + encode(user.name));\n        if (user.email) encodedOptions.push('email=' + encode(user.email));\n      } else {\n        encodedOptions.push(encode(key) + '=' + encode(options[key]));\n      }\n    }\n    var globalServer = this._getGlobalServer(this._parseDSN(options.dsn));\n\n    var script = _document.createElement('script');\n    script.async = true;\n    script.src = globalServer + '/api/embed/error-page/?' + encodedOptions.join('&');\n    (_document.head || _document.body).appendChild(script);\n  },\n\n  /**** Private functions ****/\n  _ignoreNextOnError: function() {\n    var self = this;\n    this._ignoreOnError += 1;\n    setTimeout(function() {\n      // onerror should trigger before setTimeout\n      self._ignoreOnError -= 1;\n    });\n  },\n\n  _triggerEvent: function(eventType, options) {\n    // NOTE: `event` is a native browser thing, so let's avoid conflicting wiht it\n    var evt, key;\n\n    if (!this._hasDocument) return;\n\n    options = options || {};\n\n    eventType = 'raven' + eventType.substr(0, 1).toUpperCase() + eventType.substr(1);\n\n    if (_document.createEvent) {\n      evt = _document.createEvent('HTMLEvents');\n      evt.initEvent(eventType, true, true);\n    } else {\n      evt = _document.createEventObject();\n      evt.eventType = eventType;\n    }\n\n    for (key in options)\n      if (hasKey(options, key)) {\n        evt[key] = options[key];\n      }\n\n    if (_document.createEvent) {\n      // IE9 if standards\n      _document.dispatchEvent(evt);\n    } else {\n      // IE8 regardless of Quirks or Standards\n      // IE9 if quirks\n      try {\n        _document.fireEvent('on' + evt.eventType.toLowerCase(), evt);\n      } catch (e) {\n        // Do nothing\n      }\n    }\n  },\n\n  /**\n   * Wraps addEventListener to capture UI breadcrumbs\n   * @param evtName the event name (e.g. \"click\")\n   * @returns {Function}\n   * @private\n   */\n  _breadcrumbEventHandler: function(evtName) {\n    var self = this;\n    return function(evt) {\n      // reset keypress timeout; e.g. triggering a 'click' after\n      // a 'keypress' will reset the keypress debounce so that a new\n      // set of keypresses can be recorded\n      self._keypressTimeout = null;\n\n      // It's possible this handler might trigger multiple times for the same\n      // event (e.g. event propagation through node ancestors). Ignore if we've\n      // already captured the event.\n      if (self._lastCapturedEvent === evt) return;\n\n      self._lastCapturedEvent = evt;\n\n      // try/catch both:\n      // - accessing evt.target (see getsentry/raven-js#838, #768)\n      // - `htmlTreeAsString` because it's complex, and just accessing the DOM incorrectly\n      //   can throw an exception in some circumstances.\n      var target;\n      try {\n        target = htmlTreeAsString(evt.target);\n      } catch (e) {\n        target = '<unknown>';\n      }\n\n      self.captureBreadcrumb({\n        category: 'ui.' + evtName, // e.g. ui.click, ui.input\n        message: target\n      });\n    };\n  },\n\n  /**\n   * Wraps addEventListener to capture keypress UI events\n   * @returns {Function}\n   * @private\n   */\n  _keypressEventHandler: function() {\n    var self = this,\n      debounceDuration = 1000; // milliseconds\n\n    // TODO: if somehow user switches keypress target before\n    //       debounce timeout is triggered, we will only capture\n    //       a single breadcrumb from the FIRST target (acceptable?)\n    return function(evt) {\n      var target;\n      try {\n        target = evt.target;\n      } catch (e) {\n        // just accessing event properties can throw an exception in some rare circumstances\n        // see: https://github.com/getsentry/raven-js/issues/838\n        return;\n      }\n      var tagName = target && target.tagName;\n\n      // only consider keypress events on actual input elements\n      // this will disregard keypresses targeting body (e.g. tabbing\n      // through elements, hotkeys, etc)\n      if (\n        !tagName ||\n        (tagName !== 'INPUT' && tagName !== 'TEXTAREA' && !target.isContentEditable)\n      )\n        return;\n\n      // record first keypress in a series, but ignore subsequent\n      // keypresses until debounce clears\n      var timeout = self._keypressTimeout;\n      if (!timeout) {\n        self._breadcrumbEventHandler('input')(evt);\n      }\n      clearTimeout(timeout);\n      self._keypressTimeout = setTimeout(function() {\n        self._keypressTimeout = null;\n      }, debounceDuration);\n    };\n  },\n\n  /**\n   * Captures a breadcrumb of type \"navigation\", normalizing input URLs\n   * @param to the originating URL\n   * @param from the target URL\n   * @private\n   */\n  _captureUrlChange: function(from, to) {\n    var parsedLoc = parseUrl(this._location.href);\n    var parsedTo = parseUrl(to);\n    var parsedFrom = parseUrl(from);\n\n    // because onpopstate only tells you the \"new\" (to) value of location.href, and\n    // not the previous (from) value, we need to track the value of the current URL\n    // state ourselves\n    this._lastHref = to;\n\n    // Use only the path component of the URL if the URL matches the current\n    // document (almost all the time when using pushState)\n    if (parsedLoc.protocol === parsedTo.protocol && parsedLoc.host === parsedTo.host)\n      to = parsedTo.relative;\n    if (parsedLoc.protocol === parsedFrom.protocol && parsedLoc.host === parsedFrom.host)\n      from = parsedFrom.relative;\n\n    this.captureBreadcrumb({\n      category: 'navigation',\n      data: {\n        to: to,\n        from: from\n      }\n    });\n  },\n\n  _patchFunctionToString: function() {\n    var self = this;\n    self._originalFunctionToString = Function.prototype.toString;\n    // eslint-disable-next-line no-extend-native\n    Function.prototype.toString = function() {\n      if (typeof this === 'function' && this.__raven__) {\n        return self._originalFunctionToString.apply(this.__orig__, arguments);\n      }\n      return self._originalFunctionToString.apply(this, arguments);\n    };\n  },\n\n  _unpatchFunctionToString: function() {\n    if (this._originalFunctionToString) {\n      // eslint-disable-next-line no-extend-native\n      Function.prototype.toString = this._originalFunctionToString;\n    }\n  },\n\n  /**\n   * Wrap timer functions and event targets to catch errors and provide\n   * better metadata.\n   */\n  _instrumentTryCatch: function() {\n    var self = this;\n\n    var wrappedBuiltIns = self._wrappedBuiltIns;\n\n    function wrapTimeFn(orig) {\n      return function(fn, t) {\n        // preserve arity\n        // Make a copy of the arguments to prevent deoptimization\n        // https://github.com/petkaantonov/bluebird/wiki/Optimization-killers#32-leaking-arguments\n        var args = new Array(arguments.length);\n        for (var i = 0; i < args.length; ++i) {\n          args[i] = arguments[i];\n        }\n        var originalCallback = args[0];\n        if (isFunction(originalCallback)) {\n          args[0] = self.wrap(\n            {\n              mechanism: {\n                type: 'instrument',\n                data: {function: orig.name || '<anonymous>'}\n              }\n            },\n            originalCallback\n          );\n        }\n\n        // IE < 9 doesn't support .call/.apply on setInterval/setTimeout, but it\n        // also supports only two arguments and doesn't care what this is, so we\n        // can just call the original function directly.\n        if (orig.apply) {\n          return orig.apply(this, args);\n        } else {\n          return orig(args[0], args[1]);\n        }\n      };\n    }\n\n    var autoBreadcrumbs = this._globalOptions.autoBreadcrumbs;\n\n    function wrapEventTarget(global) {\n      var proto = _window[global] && _window[global].prototype;\n      if (proto && proto.hasOwnProperty && proto.hasOwnProperty('addEventListener')) {\n        fill(\n          proto,\n          'addEventListener',\n          function(orig) {\n            return function(evtName, fn, capture, secure) {\n              // preserve arity\n              try {\n                if (fn && fn.handleEvent) {\n                  fn.handleEvent = self.wrap(\n                    {\n                      mechanism: {\n                        type: 'instrument',\n                        data: {\n                          target: global,\n                          function: 'handleEvent',\n                          handler: (fn && fn.name) || '<anonymous>'\n                        }\n                      }\n                    },\n                    fn.handleEvent\n                  );\n                }\n              } catch (err) {\n                // can sometimes get 'Permission denied to access property \"handle Event'\n              }\n\n              // More breadcrumb DOM capture ... done here and not in `_instrumentBreadcrumbs`\n              // so that we don't have more than one wrapper function\n              var before, clickHandler, keypressHandler;\n\n              if (\n                autoBreadcrumbs &&\n                autoBreadcrumbs.dom &&\n                (global === 'EventTarget' || global === 'Node')\n              ) {\n                // NOTE: generating multiple handlers per addEventListener invocation, should\n                //       revisit and verify we can just use one (almost certainly)\n                clickHandler = self._breadcrumbEventHandler('click');\n                keypressHandler = self._keypressEventHandler();\n                before = function(evt) {\n                  // need to intercept every DOM event in `before` argument, in case that\n                  // same wrapped method is re-used for different events (e.g. mousemove THEN click)\n                  // see #724\n                  if (!evt) return;\n\n                  var eventType;\n                  try {\n                    eventType = evt.type;\n                  } catch (e) {\n                    // just accessing event properties can throw an exception in some rare circumstances\n                    // see: https://github.com/getsentry/raven-js/issues/838\n                    return;\n                  }\n                  if (eventType === 'click') return clickHandler(evt);\n                  else if (eventType === 'keypress') return keypressHandler(evt);\n                };\n              }\n              return orig.call(\n                this,\n                evtName,\n                self.wrap(\n                  {\n                    mechanism: {\n                      type: 'instrument',\n                      data: {\n                        target: global,\n                        function: 'addEventListener',\n                        handler: (fn && fn.name) || '<anonymous>'\n                      }\n                    }\n                  },\n                  fn,\n                  before\n                ),\n                capture,\n                secure\n              );\n            };\n          },\n          wrappedBuiltIns\n        );\n        fill(\n          proto,\n          'removeEventListener',\n          function(orig) {\n            return function(evt, fn, capture, secure) {\n              try {\n                fn = fn && (fn.__raven_wrapper__ ? fn.__raven_wrapper__ : fn);\n              } catch (e) {\n                // ignore, accessing __raven_wrapper__ will throw in some Selenium environments\n              }\n              return orig.call(this, evt, fn, capture, secure);\n            };\n          },\n          wrappedBuiltIns\n        );\n      }\n    }\n\n    fill(_window, 'setTimeout', wrapTimeFn, wrappedBuiltIns);\n    fill(_window, 'setInterval', wrapTimeFn, wrappedBuiltIns);\n    if (_window.requestAnimationFrame) {\n      fill(\n        _window,\n        'requestAnimationFrame',\n        function(orig) {\n          return function(cb) {\n            return orig(\n              self.wrap(\n                {\n                  mechanism: {\n                    type: 'instrument',\n                    data: {\n                      function: 'requestAnimationFrame',\n                      handler: (orig && orig.name) || '<anonymous>'\n                    }\n                  }\n                },\n                cb\n              )\n            );\n          };\n        },\n        wrappedBuiltIns\n      );\n    }\n\n    // event targets borrowed from bugsnag-js:\n    // https://github.com/bugsnag/bugsnag-js/blob/master/src/bugsnag.js#L666\n    var eventTargets = [\n      'EventTarget',\n      'Window',\n      'Node',\n      'ApplicationCache',\n      'AudioTrackList',\n      'ChannelMergerNode',\n      'CryptoOperation',\n      'EventSource',\n      'FileReader',\n      'HTMLUnknownElement',\n      'IDBDatabase',\n      'IDBRequest',\n      'IDBTransaction',\n      'KeyOperation',\n      'MediaController',\n      'MessagePort',\n      'ModalWindow',\n      'Notification',\n      'SVGElementInstance',\n      'Screen',\n      'TextTrack',\n      'TextTrackCue',\n      'TextTrackList',\n      'WebSocket',\n      'WebSocketWorker',\n      'Worker',\n      'XMLHttpRequest',\n      'XMLHttpRequestEventTarget',\n      'XMLHttpRequestUpload'\n    ];\n    for (var i = 0; i < eventTargets.length; i++) {\n      wrapEventTarget(eventTargets[i]);\n    }\n  },\n\n  /**\n   * Instrument browser built-ins w/ breadcrumb capturing\n   *  - XMLHttpRequests\n   *  - DOM interactions (click/typing)\n   *  - window.location changes\n   *  - console\n   *\n   * Can be disabled or individually configured via the `autoBreadcrumbs` config option\n   */\n  _instrumentBreadcrumbs: function() {\n    var self = this;\n    var autoBreadcrumbs = this._globalOptions.autoBreadcrumbs;\n\n    var wrappedBuiltIns = self._wrappedBuiltIns;\n\n    function wrapProp(prop, xhr) {\n      if (prop in xhr && isFunction(xhr[prop])) {\n        fill(xhr, prop, function(orig) {\n          return self.wrap(\n            {\n              mechanism: {\n                type: 'instrument',\n                data: {function: prop, handler: (orig && orig.name) || '<anonymous>'}\n              }\n            },\n            orig\n          );\n        }); // intentionally don't track filled methods on XHR instances\n      }\n    }\n\n    if (autoBreadcrumbs.xhr && 'XMLHttpRequest' in _window) {\n      var xhrproto = _window.XMLHttpRequest && _window.XMLHttpRequest.prototype;\n      fill(\n        xhrproto,\n        'open',\n        function(origOpen) {\n          return function(method, url) {\n            // preserve arity\n\n            // if Sentry key appears in URL, don't capture\n            if (isString(url) && url.indexOf(self._globalKey) === -1) {\n              this.__raven_xhr = {\n                method: method,\n                url: url,\n                status_code: null\n              };\n            }\n\n            return origOpen.apply(this, arguments);\n          };\n        },\n        wrappedBuiltIns\n      );\n\n      fill(\n        xhrproto,\n        'send',\n        function(origSend) {\n          return function() {\n            // preserve arity\n            var xhr = this;\n\n            function onreadystatechangeHandler() {\n              if (xhr.__raven_xhr && xhr.readyState === 4) {\n                try {\n                  // touching statusCode in some platforms throws\n                  // an exception\n                  xhr.__raven_xhr.status_code = xhr.status;\n                } catch (e) {\n                  /* do nothing */\n                }\n\n                self.captureBreadcrumb({\n                  type: 'http',\n                  category: 'xhr',\n                  data: xhr.__raven_xhr\n                });\n              }\n            }\n\n            var props = ['onload', 'onerror', 'onprogress'];\n            for (var j = 0; j < props.length; j++) {\n              wrapProp(props[j], xhr);\n            }\n\n            if ('onreadystatechange' in xhr && isFunction(xhr.onreadystatechange)) {\n              fill(\n                xhr,\n                'onreadystatechange',\n                function(orig) {\n                  return self.wrap(\n                    {\n                      mechanism: {\n                        type: 'instrument',\n                        data: {\n                          function: 'onreadystatechange',\n                          handler: (orig && orig.name) || '<anonymous>'\n                        }\n                      }\n                    },\n                    orig,\n                    onreadystatechangeHandler\n                  );\n                } /* intentionally don't track this instrumentation */\n              );\n            } else {\n              // if onreadystatechange wasn't actually set by the page on this xhr, we\n              // are free to set our own and capture the breadcrumb\n              xhr.onreadystatechange = onreadystatechangeHandler;\n            }\n\n            return origSend.apply(this, arguments);\n          };\n        },\n        wrappedBuiltIns\n      );\n    }\n\n    if (autoBreadcrumbs.xhr && supportsFetch()) {\n      fill(\n        _window,\n        'fetch',\n        function(origFetch) {\n          return function() {\n            // preserve arity\n            // Make a copy of the arguments to prevent deoptimization\n            // https://github.com/petkaantonov/bluebird/wiki/Optimization-killers#32-leaking-arguments\n            var args = new Array(arguments.length);\n            for (var i = 0; i < args.length; ++i) {\n              args[i] = arguments[i];\n            }\n\n            var fetchInput = args[0];\n            var method = 'GET';\n            var url;\n\n            if (typeof fetchInput === 'string') {\n              url = fetchInput;\n            } else if ('Request' in _window && fetchInput instanceof _window.Request) {\n              url = fetchInput.url;\n              if (fetchInput.method) {\n                method = fetchInput.method;\n              }\n            } else {\n              url = '' + fetchInput;\n            }\n\n            // if Sentry key appears in URL, don't capture, as it's our own request\n            if (url.indexOf(self._globalKey) !== -1) {\n              return origFetch.apply(this, args);\n            }\n\n            if (args[1] && args[1].method) {\n              method = args[1].method;\n            }\n\n            var fetchData = {\n              method: method,\n              url: url,\n              status_code: null\n            };\n\n            return origFetch\n              .apply(this, args)\n              .then(function(response) {\n                fetchData.status_code = response.status;\n\n                self.captureBreadcrumb({\n                  type: 'http',\n                  category: 'fetch',\n                  data: fetchData\n                });\n\n                return response;\n              })\n              ['catch'](function(err) {\n                // if there is an error performing the request\n                self.captureBreadcrumb({\n                  type: 'http',\n                  category: 'fetch',\n                  data: fetchData,\n                  level: 'error'\n                });\n\n                throw err;\n              });\n          };\n        },\n        wrappedBuiltIns\n      );\n    }\n\n    // Capture breadcrumbs from any click that is unhandled / bubbled up all the way\n    // to the document. Do this before we instrument addEventListener.\n    if (autoBreadcrumbs.dom && this._hasDocument) {\n      if (_document.addEventListener) {\n        _document.addEventListener('click', self._breadcrumbEventHandler('click'), false);\n        _document.addEventListener('keypress', self._keypressEventHandler(), false);\n      } else if (_document.attachEvent) {\n        // IE8 Compatibility\n        _document.attachEvent('onclick', self._breadcrumbEventHandler('click'));\n        _document.attachEvent('onkeypress', self._keypressEventHandler());\n      }\n    }\n\n    // record navigation (URL) changes\n    // NOTE: in Chrome App environment, touching history.pushState, *even inside\n    //       a try/catch block*, will cause Chrome to output an error to console.error\n    // borrowed from: https://github.com/angular/angular.js/pull/13945/files\n    var chrome = _window.chrome;\n    var isChromePackagedApp = chrome && chrome.app && chrome.app.runtime;\n    var hasPushAndReplaceState =\n      !isChromePackagedApp &&\n      _window.history &&\n      _window.history.pushState &&\n      _window.history.replaceState;\n    if (autoBreadcrumbs.location && hasPushAndReplaceState) {\n      // TODO: remove onpopstate handler on uninstall()\n      var oldOnPopState = _window.onpopstate;\n      _window.onpopstate = function() {\n        var currentHref = self._location.href;\n        self._captureUrlChange(self._lastHref, currentHref);\n\n        if (oldOnPopState) {\n          return oldOnPopState.apply(this, arguments);\n        }\n      };\n\n      var historyReplacementFunction = function(origHistFunction) {\n        // note history.pushState.length is 0; intentionally not declaring\n        // params to preserve 0 arity\n        return function(/* state, title, url */) {\n          var url = arguments.length > 2 ? arguments[2] : undefined;\n\n          // url argument is optional\n          if (url) {\n            // coerce to string (this is what pushState does)\n            self._captureUrlChange(self._lastHref, url + '');\n          }\n\n          return origHistFunction.apply(this, arguments);\n        };\n      };\n\n      fill(_window.history, 'pushState', historyReplacementFunction, wrappedBuiltIns);\n      fill(_window.history, 'replaceState', historyReplacementFunction, wrappedBuiltIns);\n    }\n\n    if (autoBreadcrumbs.console && 'console' in _window && console.log) {\n      // console\n      var consoleMethodCallback = function(msg, data) {\n        self.captureBreadcrumb({\n          message: msg,\n          level: data.level,\n          category: 'console'\n        });\n      };\n\n      each(['debug', 'info', 'warn', 'error', 'log'], function(_, level) {\n        wrapConsoleMethod(console, level, consoleMethodCallback);\n      });\n    }\n  },\n\n  _restoreBuiltIns: function() {\n    // restore any wrapped builtins\n    var builtin;\n    while (this._wrappedBuiltIns.length) {\n      builtin = this._wrappedBuiltIns.shift();\n\n      var obj = builtin[0],\n        name = builtin[1],\n        orig = builtin[2];\n\n      obj[name] = orig;\n    }\n  },\n\n  _restoreConsole: function() {\n    // eslint-disable-next-line guard-for-in\n    for (var method in this._originalConsoleMethods) {\n      this._originalConsole[method] = this._originalConsoleMethods[method];\n    }\n  },\n\n  _drainPlugins: function() {\n    var self = this;\n\n    // FIX ME TODO\n    each(this._plugins, function(_, plugin) {\n      var installer = plugin[0];\n      var args = plugin[1];\n      installer.apply(self, [self].concat(args));\n    });\n  },\n\n  _parseDSN: function(str) {\n    var m = dsnPattern.exec(str),\n      dsn = {},\n      i = 7;\n\n    try {\n      while (i--) dsn[dsnKeys[i]] = m[i] || '';\n    } catch (e) {\n      throw new RavenConfigError('Invalid DSN: ' + str);\n    }\n\n    if (dsn.pass && !this._globalOptions.allowSecretKey) {\n      throw new RavenConfigError(\n        'Do not specify your secret key in the DSN. See: http://bit.ly/raven-secret-key'\n      );\n    }\n\n    return dsn;\n  },\n\n  _getGlobalServer: function(uri) {\n    // assemble the endpoint from the uri pieces\n    var globalServer = '//' + uri.host + (uri.port ? ':' + uri.port : '');\n\n    if (uri.protocol) {\n      globalServer = uri.protocol + ':' + globalServer;\n    }\n    return globalServer;\n  },\n\n  _handleOnErrorStackInfo: function(stackInfo, options) {\n    options = options || {};\n    options.mechanism = options.mechanism || {\n      type: 'onerror',\n      handled: false\n    };\n\n    // if we are intentionally ignoring errors via onerror, bail out\n    if (!this._ignoreOnError) {\n      this._handleStackInfo(stackInfo, options);\n    }\n  },\n\n  _handleStackInfo: function(stackInfo, options) {\n    var frames = this._prepareFrames(stackInfo, options);\n\n    this._triggerEvent('handle', {\n      stackInfo: stackInfo,\n      options: options\n    });\n\n    this._processException(\n      stackInfo.name,\n      stackInfo.message,\n      stackInfo.url,\n      stackInfo.lineno,\n      frames,\n      options\n    );\n  },\n\n  _prepareFrames: function(stackInfo, options) {\n    var self = this;\n    var frames = [];\n    if (stackInfo.stack && stackInfo.stack.length) {\n      each(stackInfo.stack, function(i, stack) {\n        var frame = self._normalizeFrame(stack, stackInfo.url);\n        if (frame) {\n          frames.push(frame);\n        }\n      });\n\n      // e.g. frames captured via captureMessage throw\n      if (options && options.trimHeadFrames) {\n        for (var j = 0; j < options.trimHeadFrames && j < frames.length; j++) {\n          frames[j].in_app = false;\n        }\n      }\n    }\n    frames = frames.slice(0, this._globalOptions.stackTraceLimit);\n    return frames;\n  },\n\n  _normalizeFrame: function(frame, stackInfoUrl) {\n    // normalize the frames data\n    var normalized = {\n      filename: frame.url,\n      lineno: frame.line,\n      colno: frame.column,\n      function: frame.func || '?'\n    };\n\n    // Case when we don't have any information about the error\n    // E.g. throwing a string or raw object, instead of an `Error` in Firefox\n    // Generating synthetic error doesn't add any value here\n    //\n    // We should probably somehow let a user know that they should fix their code\n    if (!frame.url) {\n      normalized.filename = stackInfoUrl; // fallback to whole stacks url from onerror handler\n    }\n\n    normalized.in_app = !// determine if an exception came from outside of our app\n    // first we check the global includePaths list.\n    (\n      (!!this._globalOptions.includePaths.test &&\n        !this._globalOptions.includePaths.test(normalized.filename)) ||\n      // Now we check for fun, if the function name is Raven or TraceKit\n      /(Raven|TraceKit)\\./.test(normalized['function']) ||\n      // finally, we do a last ditch effort and check for raven.min.js\n      /raven\\.(min\\.)?js$/.test(normalized.filename)\n    );\n\n    return normalized;\n  },\n\n  _processException: function(type, message, fileurl, lineno, frames, options) {\n    var prefixedMessage = (type ? type + ': ' : '') + (message || '');\n    if (\n      !!this._globalOptions.ignoreErrors.test &&\n      (this._globalOptions.ignoreErrors.test(message) ||\n        this._globalOptions.ignoreErrors.test(prefixedMessage))\n    ) {\n      return;\n    }\n\n    var stacktrace;\n\n    if (frames && frames.length) {\n      fileurl = frames[0].filename || fileurl;\n      // Sentry expects frames oldest to newest\n      // and JS sends them as newest to oldest\n      frames.reverse();\n      stacktrace = {frames: frames};\n    } else if (fileurl) {\n      stacktrace = {\n        frames: [\n          {\n            filename: fileurl,\n            lineno: lineno,\n            in_app: true\n          }\n        ]\n      };\n    }\n\n    if (\n      !!this._globalOptions.ignoreUrls.test &&\n      this._globalOptions.ignoreUrls.test(fileurl)\n    ) {\n      return;\n    }\n\n    if (\n      !!this._globalOptions.whitelistUrls.test &&\n      !this._globalOptions.whitelistUrls.test(fileurl)\n    ) {\n      return;\n    }\n\n    var data = objectMerge(\n      {\n        // sentry.interfaces.Exception\n        exception: {\n          values: [\n            {\n              type: type,\n              value: message,\n              stacktrace: stacktrace\n            }\n          ]\n        },\n        transaction: fileurl\n      },\n      options\n    );\n\n    var ex = data.exception.values[0];\n    if (ex.type == null && ex.value === '') {\n      ex.value = 'Unrecoverable error caught';\n    }\n\n    // Move mechanism from options to exception interface\n    // We do this, as requiring user to pass `{exception:{mechanism:{ ... }}}` would be\n    // too much\n    if (!data.exception.mechanism && data.mechanism) {\n      data.exception.mechanism = data.mechanism;\n      delete data.mechanism;\n    }\n\n    data.exception.mechanism = objectMerge(\n      {\n        type: 'generic',\n        handled: true\n      },\n      data.exception.mechanism || {}\n    );\n\n    // Fire away!\n    this._send(data);\n  },\n\n  _trimPacket: function(data) {\n    // For now, we only want to truncate the two different messages\n    // but this could/should be expanded to just trim everything\n    var max = this._globalOptions.maxMessageLength;\n    if (data.message) {\n      data.message = truncate(data.message, max);\n    }\n    if (data.exception) {\n      var exception = data.exception.values[0];\n      exception.value = truncate(exception.value, max);\n    }\n\n    var request = data.request;\n    if (request) {\n      if (request.url) {\n        request.url = truncate(request.url, this._globalOptions.maxUrlLength);\n      }\n      if (request.Referer) {\n        request.Referer = truncate(request.Referer, this._globalOptions.maxUrlLength);\n      }\n    }\n\n    if (data.breadcrumbs && data.breadcrumbs.values)\n      this._trimBreadcrumbs(data.breadcrumbs);\n\n    return data;\n  },\n\n  /**\n   * Truncate breadcrumb values (right now just URLs)\n   */\n  _trimBreadcrumbs: function(breadcrumbs) {\n    // known breadcrumb properties with urls\n    // TODO: also consider arbitrary prop values that start with (https?)?://\n    var urlProps = ['to', 'from', 'url'],\n      urlProp,\n      crumb,\n      data;\n\n    for (var i = 0; i < breadcrumbs.values.length; ++i) {\n      crumb = breadcrumbs.values[i];\n      if (\n        !crumb.hasOwnProperty('data') ||\n        !isObject(crumb.data) ||\n        objectFrozen(crumb.data)\n      )\n        continue;\n\n      data = objectMerge({}, crumb.data);\n      for (var j = 0; j < urlProps.length; ++j) {\n        urlProp = urlProps[j];\n        if (data.hasOwnProperty(urlProp) && data[urlProp]) {\n          data[urlProp] = truncate(data[urlProp], this._globalOptions.maxUrlLength);\n        }\n      }\n      breadcrumbs.values[i].data = data;\n    }\n  },\n\n  _getHttpData: function() {\n    if (!this._hasNavigator && !this._hasDocument) return;\n    var httpData = {};\n\n    if (this._hasNavigator && _navigator.userAgent) {\n      httpData.headers = {\n        'User-Agent': _navigator.userAgent\n      };\n    }\n\n    // Check in `window` instead of `document`, as we may be in ServiceWorker environment\n    if (_window.location && _window.location.href) {\n      httpData.url = _window.location.href;\n    }\n\n    if (this._hasDocument && _document.referrer) {\n      if (!httpData.headers) httpData.headers = {};\n      httpData.headers.Referer = _document.referrer;\n    }\n\n    return httpData;\n  },\n\n  _resetBackoff: function() {\n    this._backoffDuration = 0;\n    this._backoffStart = null;\n  },\n\n  _shouldBackoff: function() {\n    return this._backoffDuration && now() - this._backoffStart < this._backoffDuration;\n  },\n\n  /**\n   * Returns true if the in-process data payload matches the signature\n   * of the previously-sent data\n   *\n   * NOTE: This has to be done at this level because TraceKit can generate\n   *       data from window.onerror WITHOUT an exception object (IE8, IE9,\n   *       other old browsers). This can take the form of an \"exception\"\n   *       data object with a single frame (derived from the onerror args).\n   */\n  _isRepeatData: function(current) {\n    var last = this._lastData;\n\n    if (\n      !last ||\n      current.message !== last.message || // defined for captureMessage\n      current.transaction !== last.transaction // defined for captureException/onerror\n    )\n      return false;\n\n    // Stacktrace interface (i.e. from captureMessage)\n    if (current.stacktrace || last.stacktrace) {\n      return isSameStacktrace(current.stacktrace, last.stacktrace);\n    } else if (current.exception || last.exception) {\n      // Exception interface (i.e. from captureException/onerror)\n      return isSameException(current.exception, last.exception);\n    } else if (current.fingerprint || last.fingerprint) {\n      return Boolean(current.fingerprint && last.fingerprint) &&\n        JSON.stringify(current.fingerprint) === JSON.stringify(last.fingerprint)\n    }\n\n    return true;\n  },\n\n  _setBackoffState: function(request) {\n    // If we are already in a backoff state, don't change anything\n    if (this._shouldBackoff()) {\n      return;\n    }\n\n    var status = request.status;\n\n    // 400 - project_id doesn't exist or some other fatal\n    // 401 - invalid/revoked dsn\n    // 429 - too many requests\n    if (!(status === 400 || status === 401 || status === 429)) return;\n\n    var retry;\n    try {\n      // If Retry-After is not in Access-Control-Expose-Headers, most\n      // browsers will throw an exception trying to access it\n      if (supportsFetch()) {\n        retry = request.headers.get('Retry-After');\n      } else {\n        retry = request.getResponseHeader('Retry-After');\n      }\n\n      // Retry-After is returned in seconds\n      retry = parseInt(retry, 10) * 1000;\n    } catch (e) {\n      /* eslint no-empty:0 */\n    }\n\n    this._backoffDuration = retry\n      ? // If Sentry server returned a Retry-After value, use it\n        retry\n      : // Otherwise, double the last backoff duration (starts at 1 sec)\n        this._backoffDuration * 2 || 1000;\n\n    this._backoffStart = now();\n  },\n\n  _send: function(data) {\n    var globalOptions = this._globalOptions;\n\n    var baseData = {\n        project: this._globalProject,\n        logger: globalOptions.logger,\n        platform: 'javascript'\n      },\n      httpData = this._getHttpData();\n\n    if (httpData) {\n      baseData.request = httpData;\n    }\n\n    // HACK: delete `trimHeadFrames` to prevent from appearing in outbound payload\n    if (data.trimHeadFrames) delete data.trimHeadFrames;\n\n    data = objectMerge(baseData, data);\n\n    // Merge in the tags and extra separately since objectMerge doesn't handle a deep merge\n    data.tags = objectMerge(objectMerge({}, this._globalContext.tags), data.tags);\n    data.extra = objectMerge(objectMerge({}, this._globalContext.extra), data.extra);\n\n    // Send along our own collected metadata with extra\n    data.extra['session:duration'] = now() - this._startTime;\n\n    if (this._breadcrumbs && this._breadcrumbs.length > 0) {\n      // intentionally make shallow copy so that additions\n      // to breadcrumbs aren't accidentally sent in this request\n      data.breadcrumbs = {\n        values: [].slice.call(this._breadcrumbs, 0)\n      };\n    }\n\n    if (this._globalContext.user) {\n      // sentry.interfaces.User\n      data.user = this._globalContext.user;\n    }\n\n    // Include the environment if it's defined in globalOptions\n    if (globalOptions.environment) data.environment = globalOptions.environment;\n\n    // Include the release if it's defined in globalOptions\n    if (globalOptions.release) data.release = globalOptions.release;\n\n    // Include server_name if it's defined in globalOptions\n    if (globalOptions.serverName) data.server_name = globalOptions.serverName;\n\n    data = this._sanitizeData(data);\n\n    // Cleanup empty properties before sending them to the server\n    Object.keys(data).forEach(function(key) {\n      if (data[key] == null || data[key] === '' || isEmptyObject(data[key])) {\n        delete data[key];\n      }\n    });\n\n    if (isFunction(globalOptions.dataCallback)) {\n      data = globalOptions.dataCallback(data) || data;\n    }\n\n    // Why??????????\n    if (!data || isEmptyObject(data)) {\n      return;\n    }\n\n    // Check if the request should be filtered or not\n    if (\n      isFunction(globalOptions.shouldSendCallback) &&\n      !globalOptions.shouldSendCallback(data)\n    ) {\n      return;\n    }\n\n    // Backoff state: Sentry server previously responded w/ an error (e.g. 429 - too many requests),\n    // so drop requests until \"cool-off\" period has elapsed.\n    if (this._shouldBackoff()) {\n      this._logDebug('warn', 'Raven dropped error due to backoff: ', data);\n      return;\n    }\n\n    if (typeof globalOptions.sampleRate === 'number') {\n      if (Math.random() < globalOptions.sampleRate) {\n        this._sendProcessedPayload(data);\n      }\n    } else {\n      this._sendProcessedPayload(data);\n    }\n  },\n\n  _sanitizeData: function(data) {\n    return sanitize(data, this._globalOptions.sanitizeKeys);\n  },\n\n  _getUuid: function() {\n    return uuid4();\n  },\n\n  _sendProcessedPayload: function(data, callback) {\n    var self = this;\n    var globalOptions = this._globalOptions;\n\n    if (!this.isSetup()) return;\n\n    // Try and clean up the packet before sending by truncating long values\n    data = this._trimPacket(data);\n\n    // ideally duplicate error testing should occur *before* dataCallback/shouldSendCallback,\n    // but this would require copying an un-truncated copy of the data packet, which can be\n    // arbitrarily deep (extra_data) -- could be worthwhile? will revisit\n    if (!this._globalOptions.allowDuplicates && this._isRepeatData(data)) {\n      this._logDebug('warn', 'Raven dropped repeat event: ', data);\n      return;\n    }\n\n    // Send along an event_id if not explicitly passed.\n    // This event_id can be used to reference the error within Sentry itself.\n    // Set lastEventId after we know the error should actually be sent\n    this._lastEventId = data.event_id || (data.event_id = this._getUuid());\n\n    // Store outbound payload after trim\n    this._lastData = data;\n\n    this._logDebug('debug', 'Raven about to send:', data);\n\n    var auth = {\n      sentry_version: '7',\n      sentry_client: 'raven-js/' + this.VERSION,\n      sentry_key: this._globalKey\n    };\n\n    if (this._globalSecret) {\n      auth.sentry_secret = this._globalSecret;\n    }\n\n    var exception = data.exception && data.exception.values[0];\n\n    // only capture 'sentry' breadcrumb is autoBreadcrumbs is truthy\n    if (\n      this._globalOptions.autoBreadcrumbs &&\n      this._globalOptions.autoBreadcrumbs.sentry\n    ) {\n      this.captureBreadcrumb({\n        category: 'sentry',\n        message: exception\n          ? (exception.type ? exception.type + ': ' : '') + exception.value\n          : data.message,\n        event_id: data.event_id,\n        level: data.level || 'error' // presume error unless specified\n      });\n    }\n\n    var url = this._globalEndpoint;\n    (globalOptions.transport || this._makeRequest).call(this, {\n      url: url,\n      auth: auth,\n      data: data,\n      options: globalOptions,\n      onSuccess: function success() {\n        self._resetBackoff();\n\n        self._triggerEvent('success', {\n          data: data,\n          src: url\n        });\n        callback && callback();\n      },\n      onError: function failure(error) {\n        self._logDebug('error', 'Raven transport failed to send: ', error);\n\n        if (error.request) {\n          self._setBackoffState(error.request);\n        }\n\n        self._triggerEvent('failure', {\n          data: data,\n          src: url\n        });\n        error = error || new Error('Raven send failed (no additional details provided)');\n        callback && callback(error);\n      }\n    });\n  },\n\n  _makeRequest: function(opts) {\n    // Auth is intentionally sent as part of query string (NOT as custom HTTP header) to avoid preflight CORS requests\n    var url = opts.url + '?' + urlencode(opts.auth);\n\n    var evaluatedHeaders = null;\n    var evaluatedFetchParameters = {};\n\n    if (opts.options.headers) {\n      evaluatedHeaders = this._evaluateHash(opts.options.headers);\n    }\n\n    if (opts.options.fetchParameters) {\n      evaluatedFetchParameters = this._evaluateHash(opts.options.fetchParameters);\n    }\n\n    if (supportsFetch()) {\n      evaluatedFetchParameters.body = stringify(opts.data);\n\n      var defaultFetchOptions = objectMerge({}, this._fetchDefaults);\n      var fetchOptions = objectMerge(defaultFetchOptions, evaluatedFetchParameters);\n\n      if (evaluatedHeaders) {\n        fetchOptions.headers = evaluatedHeaders;\n      }\n\n      return _window\n        .fetch(url, fetchOptions)\n        .then(function(response) {\n          if (response.ok) {\n            opts.onSuccess && opts.onSuccess();\n          } else {\n            var error = new Error('Sentry error code: ' + response.status);\n            // It's called request only to keep compatibility with XHR interface\n            // and not add more redundant checks in setBackoffState method\n            error.request = response;\n            opts.onError && opts.onError(error);\n          }\n        })\n        ['catch'](function() {\n          opts.onError &&\n            opts.onError(new Error('Sentry error code: network unavailable'));\n        });\n    }\n\n    var request = _window.XMLHttpRequest && new _window.XMLHttpRequest();\n    if (!request) return;\n\n    // if browser doesn't support CORS (e.g. IE7), we are out of luck\n    var hasCORS = 'withCredentials' in request || typeof XDomainRequest !== 'undefined';\n\n    if (!hasCORS) return;\n\n    if ('withCredentials' in request) {\n      request.onreadystatechange = function() {\n        if (request.readyState !== 4) {\n          return;\n        } else if (request.status === 200) {\n          opts.onSuccess && opts.onSuccess();\n        } else if (opts.onError) {\n          var err = new Error('Sentry error code: ' + request.status);\n          err.request = request;\n          opts.onError(err);\n        }\n      };\n    } else {\n      request = new XDomainRequest();\n      // xdomainrequest cannot go http -> https (or vice versa),\n      // so always use protocol relative\n      url = url.replace(/^https?:/, '');\n\n      // onreadystatechange not supported by XDomainRequest\n      if (opts.onSuccess) {\n        request.onload = opts.onSuccess;\n      }\n      if (opts.onError) {\n        request.onerror = function() {\n          var err = new Error('Sentry error code: XDomainRequest');\n          err.request = request;\n          opts.onError(err);\n        };\n      }\n    }\n\n    request.open('POST', url);\n\n    if (evaluatedHeaders) {\n      each(evaluatedHeaders, function(key, value) {\n        request.setRequestHeader(key, value);\n      });\n    }\n\n    request.send(stringify(opts.data));\n  },\n\n  _evaluateHash: function(hash) {\n    var evaluated = {};\n\n    for (var key in hash) {\n      if (hash.hasOwnProperty(key)) {\n        var value = hash[key];\n        evaluated[key] = typeof value === 'function' ? value() : value;\n      }\n    }\n\n    return evaluated;\n  },\n\n  _logDebug: function(level) {\n    // We allow `Raven.debug` and `Raven.config(DSN, { debug: true })` to not make backward incompatible API change\n    if (\n      this._originalConsoleMethods[level] &&\n      (this.debug || this._globalOptions.debug)\n    ) {\n      // In IE<10 console methods do not have their own 'apply' method\n      Function.prototype.apply.call(\n        this._originalConsoleMethods[level],\n        this._originalConsole,\n        [].slice.call(arguments, 1)\n      );\n    }\n  },\n\n  _mergeContext: function(key, context) {\n    if (isUndefined(context)) {\n      delete this._globalContext[key];\n    } else {\n      this._globalContext[key] = objectMerge(this._globalContext[key] || {}, context);\n    }\n  }\n};\n\n// Deprecations\nRaven.prototype.setUser = Raven.prototype.setUserContext;\nRaven.prototype.setReleaseContext = Raven.prototype.setRelease;\n\nmodule.exports = Raven;\n\n}).call(this,typeof global !== \"undefined\" ? global : typeof self !== \"undefined\" ? self : typeof window !== \"undefined\" ? window : {})\n},{\"1\":1,\"2\":2,\"5\":5,\"6\":6,\"7\":7,\"8\":8}],4:[function(_dereq_,module,exports){\n(function (global){\n/**\n * Enforces a single instance of the Raven client, and the\n * main entry point for Raven. If you are a consumer of the\n * Raven library, you SHOULD load this file (vs raven.js).\n **/\n\nvar RavenConstructor = _dereq_(3);\n\n// This is to be defensive in environments where window does not exist (see https://github.com/getsentry/raven-js/pull/785)\nvar _window =\n  typeof window !== 'undefined'\n    ? window\n    : typeof global !== 'undefined' ? global : typeof self !== 'undefined' ? self : {};\nvar _Raven = _window.Raven;\n\nvar Raven = new RavenConstructor();\n\n/*\n * Allow multiple versions of Raven to be installed.\n * Strip Raven from the global context and returns the instance.\n *\n * @return {Raven}\n */\nRaven.noConflict = function() {\n  _window.Raven = _Raven;\n  return Raven;\n};\n\nRaven.afterLoad();\n\nmodule.exports = Raven;\n\n/**\n * DISCLAIMER:\n *\n * Expose `Client` constructor for cases where user want to track multiple \"sub-applications\" in one larger app.\n * It's not meant to be used by a wide audience, so pleaaase make sure that you know what you're doing before using it.\n * Accidentally calling `install` multiple times, may result in an unexpected behavior that's very hard to debug.\n *\n * It's called `Client' to be in-line with Raven Node implementation.\n *\n * HOWTO:\n *\n * import Raven from 'raven-js';\n *\n * const someAppReporter = new Raven.Client();\n * const someOtherAppReporter = new Raven.Client();\n *\n * someAppReporter.config('__DSN__', {\n *   ...config goes here\n * });\n *\n * someOtherAppReporter.config('__OTHER_DSN__', {\n *   ...config goes here\n * });\n *\n * someAppReporter.captureMessage(...);\n * someAppReporter.captureException(...);\n * someAppReporter.captureBreadcrumb(...);\n *\n * someOtherAppReporter.captureMessage(...);\n * someOtherAppReporter.captureException(...);\n * someOtherAppReporter.captureBreadcrumb(...);\n *\n * It should \"just work\".\n */\nmodule.exports.Client = RavenConstructor;\n\n}).call(this,typeof global !== \"undefined\" ? global : typeof self !== \"undefined\" ? self : typeof window !== \"undefined\" ? window : {})\n},{\"3\":3}],5:[function(_dereq_,module,exports){\n(function (global){\nvar stringify = _dereq_(7);\n\nvar _window =\n  typeof window !== 'undefined'\n    ? window\n    : typeof global !== 'undefined'\n      ? global\n      : typeof self !== 'undefined'\n        ? self\n        : {};\n\nfunction isObject(what) {\n  return typeof what === 'object' && what !== null;\n}\n\n// Yanked from https://git.io/vS8DV re-used under CC0\n// with some tiny modifications\nfunction isError(value) {\n  switch (Object.prototype.toString.call(value)) {\n    case '[object Error]':\n      return true;\n    case '[object Exception]':\n      return true;\n    case '[object DOMException]':\n      return true;\n    default:\n      return value instanceof Error;\n  }\n}\n\nfunction isErrorEvent(value) {\n  return Object.prototype.toString.call(value) === '[object ErrorEvent]';\n}\n\nfunction isDOMError(value) {\n  return Object.prototype.toString.call(value) === '[object DOMError]';\n}\n\nfunction isDOMException(value) {\n  return Object.prototype.toString.call(value) === '[object DOMException]';\n}\n\nfunction isUndefined(what) {\n  return what === void 0;\n}\n\nfunction isFunction(what) {\n  return typeof what === 'function';\n}\n\nfunction isPlainObject(what) {\n  return Object.prototype.toString.call(what) === '[object Object]';\n}\n\nfunction isString(what) {\n  return Object.prototype.toString.call(what) === '[object String]';\n}\n\nfunction isArray(what) {\n  return Object.prototype.toString.call(what) === '[object Array]';\n}\n\nfunction isEmptyObject(what) {\n  if (!isPlainObject(what)) return false;\n\n  for (var _ in what) {\n    if (what.hasOwnProperty(_)) {\n      return false;\n    }\n  }\n  return true;\n}\n\nfunction supportsErrorEvent() {\n  try {\n    new ErrorEvent(''); // eslint-disable-line no-new\n    return true;\n  } catch (e) {\n    return false;\n  }\n}\n\nfunction supportsDOMError() {\n  try {\n    new DOMError(''); // eslint-disable-line no-new\n    return true;\n  } catch (e) {\n    return false;\n  }\n}\n\nfunction supportsDOMException() {\n  try {\n    new DOMException(''); // eslint-disable-line no-new\n    return true;\n  } catch (e) {\n    return false;\n  }\n}\n\nfunction supportsFetch() {\n  if (!('fetch' in _window)) return false;\n\n  try {\n    new Headers(); // eslint-disable-line no-new\n    new Request(''); // eslint-disable-line no-new\n    new Response(); // eslint-disable-line no-new\n    return true;\n  } catch (e) {\n    return false;\n  }\n}\n\n// Despite all stars in the sky saying that Edge supports old draft syntax, aka 'never', 'always', 'origin' and 'default\n// https://caniuse.com/#feat=referrer-policy\n// It doesn't. And it throw exception instead of ignoring this parameter...\n// REF: https://github.com/getsentry/raven-js/issues/1233\nfunction supportsReferrerPolicy() {\n  if (!supportsFetch()) return false;\n\n  try {\n    // eslint-disable-next-line no-new\n    new Request('pickleRick', {\n      referrerPolicy: 'origin'\n    });\n    return true;\n  } catch (e) {\n    return false;\n  }\n}\n\nfunction supportsPromiseRejectionEvent() {\n  return typeof PromiseRejectionEvent === 'function';\n}\n\nfunction wrappedCallback(callback) {\n  function dataCallback(data, original) {\n    var normalizedData = callback(data) || data;\n    if (original) {\n      return original(normalizedData) || normalizedData;\n    }\n    return normalizedData;\n  }\n\n  return dataCallback;\n}\n\nfunction each(obj, callback) {\n  var i, j;\n\n  if (isUndefined(obj.length)) {\n    for (i in obj) {\n      if (hasKey(obj, i)) {\n        callback.call(null, i, obj[i]);\n      }\n    }\n  } else {\n    j = obj.length;\n    if (j) {\n      for (i = 0; i < j; i++) {\n        callback.call(null, i, obj[i]);\n      }\n    }\n  }\n}\n\nfunction objectMerge(obj1, obj2) {\n  if (!obj2) {\n    return obj1;\n  }\n  each(obj2, function(key, value) {\n    obj1[key] = value;\n  });\n  return obj1;\n}\n\n/**\n * This function is only used for react-native.\n * react-native freezes object that have already been sent over the\n * js bridge. We need this function in order to check if the object is frozen.\n * So it's ok that objectFrozen returns false if Object.isFrozen is not\n * supported because it's not relevant for other \"platforms\". See related issue:\n * https://github.com/getsentry/react-native-sentry/issues/57\n */\nfunction objectFrozen(obj) {\n  if (!Object.isFrozen) {\n    return false;\n  }\n  return Object.isFrozen(obj);\n}\n\nfunction truncate(str, max) {\n  if (typeof max !== 'number') {\n    throw new Error('2nd argument to `truncate` function should be a number');\n  }\n  if (typeof str !== 'string' || max === 0) {\n    return str;\n  }\n  return str.length <= max ? str : str.substr(0, max) + '\\u2026';\n}\n\n/**\n * hasKey, a better form of hasOwnProperty\n * Example: hasKey(MainHostObject, property) === true/false\n *\n * @param {Object} host object to check property\n * @param {string} key to check\n */\nfunction hasKey(object, key) {\n  return Object.prototype.hasOwnProperty.call(object, key);\n}\n\nfunction joinRegExp(patterns) {\n  // Combine an array of regular expressions and strings into one large regexp\n  // Be mad.\n  var sources = [],\n    i = 0,\n    len = patterns.length,\n    pattern;\n\n  for (; i < len; i++) {\n    pattern = patterns[i];\n    if (isString(pattern)) {\n      // If it's a string, we need to escape it\n      // Taken from: https://developer.mozilla.org/en-US/docs/Web/JavaScript/Guide/Regular_Expressions\n      sources.push(pattern.replace(/([.*+?^=!:${}()|\\[\\]\\/\\\\])/g, '\\\\$1'));\n    } else if (pattern && pattern.source) {\n      // If it's a regexp already, we want to extract the source\n      sources.push(pattern.source);\n    }\n    // Intentionally skip other cases\n  }\n  return new RegExp(sources.join('|'), 'i');\n}\n\nfunction urlencode(o) {\n  var pairs = [];\n  each(o, function(key, value) {\n    pairs.push(encodeURIComponent(key) + '=' + encodeURIComponent(value));\n  });\n  return pairs.join('&');\n}\n\n// borrowed from https://tools.ietf.org/html/rfc3986#appendix-B\n// intentionally using regex and not <a/> href parsing trick because React Native and other\n// environments where DOM might not be available\nfunction parseUrl(url) {\n  if (typeof url !== 'string') return {};\n  var match = url.match(/^(([^:\\/?#]+):)?(\\/\\/([^\\/?#]*))?([^?#]*)(\\?([^#]*))?(#(.*))?$/);\n\n  // coerce to undefined values to empty string so we don't get 'undefined'\n  var query = match[6] || '';\n  var fragment = match[8] || '';\n  return {\n    protocol: match[2],\n    host: match[4],\n    path: match[5],\n    relative: match[5] + query + fragment // everything minus origin\n  };\n}\nfunction uuid4() {\n  var crypto = _window.crypto || _window.msCrypto;\n\n  if (!isUndefined(crypto) && crypto.getRandomValues) {\n    // Use window.crypto API if available\n    // eslint-disable-next-line no-undef\n    var arr = new Uint16Array(8);\n    crypto.getRandomValues(arr);\n\n    // set 4 in byte 7\n    arr[3] = (arr[3] & 0xfff) | 0x4000;\n    // set 2 most significant bits of byte 9 to '10'\n    arr[4] = (arr[4] & 0x3fff) | 0x8000;\n\n    var pad = function(num) {\n      var v = num.toString(16);\n      while (v.length < 4) {\n        v = '0' + v;\n      }\n      return v;\n    };\n\n    return (\n      pad(arr[0]) +\n      pad(arr[1]) +\n      pad(arr[2]) +\n      pad(arr[3]) +\n      pad(arr[4]) +\n      pad(arr[5]) +\n      pad(arr[6]) +\n      pad(arr[7])\n    );\n  } else {\n    // http://stackoverflow.com/questions/105034/how-to-create-a-guid-uuid-in-javascript/2117523#2117523\n    return 'xxxxxxxxxxxx4xxxyxxxxxxxxxxxxxxx'.replace(/[xy]/g, function(c) {\n      var r = (Math.random() * 16) | 0,\n        v = c === 'x' ? r : (r & 0x3) | 0x8;\n      return v.toString(16);\n    });\n  }\n}\n\n/**\n * Given a child DOM element, returns a query-selector statement describing that\n * and its ancestors\n * e.g. [HTMLElement] => body > div > input#foo.btn[name=baz]\n * @param elem\n * @returns {string}\n */\nfunction htmlTreeAsString(elem) {\n  /* eslint no-extra-parens:0*/\n  var MAX_TRAVERSE_HEIGHT = 5,\n    MAX_OUTPUT_LEN = 80,\n    out = [],\n    height = 0,\n    len = 0,\n    separator = ' > ',\n    sepLength = separator.length,\n    nextStr;\n\n  while (elem && height++ < MAX_TRAVERSE_HEIGHT) {\n    nextStr = htmlElementAsString(elem);\n    // bail out if\n    // - nextStr is the 'html' element\n    // - the length of the string that would be created exceeds MAX_OUTPUT_LEN\n    //   (ignore this limit if we are on the first iteration)\n    if (\n      nextStr === 'html' ||\n      (height > 1 && len + out.length * sepLength + nextStr.length >= MAX_OUTPUT_LEN)\n    ) {\n      break;\n    }\n\n    out.push(nextStr);\n\n    len += nextStr.length;\n    elem = elem.parentNode;\n  }\n\n  return out.reverse().join(separator);\n}\n\n/**\n * Returns a simple, query-selector representation of a DOM element\n * e.g. [HTMLElement] => input#foo.btn[name=baz]\n * @param HTMLElement\n * @returns {string}\n */\nfunction htmlElementAsString(elem) {\n  var out = [],\n    className,\n    classes,\n    key,\n    attr,\n    i;\n\n  if (!elem || !elem.tagName) {\n    return '';\n  }\n\n  out.push(elem.tagName.toLowerCase());\n  if (elem.id) {\n    out.push('#' + elem.id);\n  }\n\n  className = elem.className;\n  if (className && isString(className)) {\n    classes = className.split(/\\s+/);\n    for (i = 0; i < classes.length; i++) {\n      out.push('.' + classes[i]);\n    }\n  }\n  var attrWhitelist = ['type', 'name', 'title', 'alt'];\n  for (i = 0; i < attrWhitelist.length; i++) {\n    key = attrWhitelist[i];\n    attr = elem.getAttribute(key);\n    if (attr) {\n      out.push('[' + key + '=\"' + attr + '\"]');\n    }\n  }\n  return out.join('');\n}\n\n/**\n * Returns true if either a OR b is truthy, but not both\n */\nfunction isOnlyOneTruthy(a, b) {\n  return !!(!!a ^ !!b);\n}\n\n/**\n * Returns true if both parameters are undefined\n */\nfunction isBothUndefined(a, b) {\n  return isUndefined(a) && isUndefined(b);\n}\n\n/**\n * Returns true if the two input exception interfaces have the same content\n */\nfunction isSameException(ex1, ex2) {\n  if (isOnlyOneTruthy(ex1, ex2)) return false;\n\n  ex1 = ex1.values[0];\n  ex2 = ex2.values[0];\n\n  if (ex1.type !== ex2.type || ex1.value !== ex2.value) return false;\n\n  // in case both stacktraces are undefined, we can't decide so default to false\n  if (isBothUndefined(ex1.stacktrace, ex2.stacktrace)) return false;\n\n  return isSameStacktrace(ex1.stacktrace, ex2.stacktrace);\n}\n\n/**\n * Returns true if the two input stack trace interfaces have the same content\n */\nfunction isSameStacktrace(stack1, stack2) {\n  if (isOnlyOneTruthy(stack1, stack2)) return false;\n\n  var frames1 = stack1.frames;\n  var frames2 = stack2.frames;\n\n  // Exit early if stacktrace is malformed\n  if (frames1 === undefined || frames2 === undefined) return false;\n\n  // Exit early if frame count differs\n  if (frames1.length !== frames2.length) return false;\n\n  // Iterate through every frame; bail out if anything differs\n  var a, b;\n  for (var i = 0; i < frames1.length; i++) {\n    a = frames1[i];\n    b = frames2[i];\n    if (\n      a.filename !== b.filename ||\n      a.lineno !== b.lineno ||\n      a.colno !== b.colno ||\n      a['function'] !== b['function']\n    )\n      return false;\n  }\n  return true;\n}\n\n/**\n * Polyfill a method\n * @param obj object e.g. `document`\n * @param name method name present on object e.g. `addEventListener`\n * @param replacement replacement function\n * @param track {optional} record instrumentation to an array\n */\nfunction fill(obj, name, replacement, track) {\n  if (obj == null) return;\n  var orig = obj[name];\n  obj[name] = replacement(orig);\n  obj[name].__raven__ = true;\n  obj[name].__orig__ = orig;\n  if (track) {\n    track.push([obj, name, orig]);\n  }\n}\n\n/**\n * Join values in array\n * @param input array of values to be joined together\n * @param delimiter string to be placed in-between values\n * @returns {string}\n */\nfunction safeJoin(input, delimiter) {\n  if (!isArray(input)) return '';\n\n  var output = [];\n\n  for (var i = 0; i < input.length; i++) {\n    try {\n      output.push(String(input[i]));\n    } catch (e) {\n      output.push('[value cannot be serialized]');\n    }\n  }\n\n  return output.join(delimiter);\n}\n\n// Default Node.js REPL depth\nvar MAX_SERIALIZE_EXCEPTION_DEPTH = 3;\n// 50kB, as 100kB is max payload size, so half sounds reasonable\nvar MAX_SERIALIZE_EXCEPTION_SIZE = 50 * 1024;\nvar MAX_SERIALIZE_KEYS_LENGTH = 40;\n\nfunction utf8Length(value) {\n  return ~-encodeURI(value).split(/%..|./).length;\n}\n\nfunction jsonSize(value) {\n  return utf8Length(JSON.stringify(value));\n}\n\nfunction serializeValue(value) {\n  if (typeof value === 'string') {\n    var maxLength = 40;\n    return truncate(value, maxLength);\n  } else if (\n    typeof value === 'number' ||\n    typeof value === 'boolean' ||\n    typeof value === 'undefined'\n  ) {\n    return value;\n  }\n\n  var type = Object.prototype.toString.call(value);\n\n  // Node.js REPL notation\n  if (type === '[object Object]') return '[Object]';\n  if (type === '[object Array]') return '[Array]';\n  if (type === '[object Function]')\n    return value.name ? '[Function: ' + value.name + ']' : '[Function]';\n\n  return value;\n}\n\nfunction serializeObject(value, depth) {\n  if (depth === 0) return serializeValue(value);\n\n  if (isPlainObject(value)) {\n    return Object.keys(value).reduce(function(acc, key) {\n      acc[key] = serializeObject(value[key], depth - 1);\n      return acc;\n    }, {});\n  } else if (Array.isArray(value)) {\n    return value.map(function(val) {\n      return serializeObject(val, depth - 1);\n    });\n  }\n\n  return serializeValue(value);\n}\n\nfunction serializeException(ex, depth, maxSize) {\n  if (!isPlainObject(ex)) return ex;\n\n  depth = typeof depth !== 'number' ? MAX_SERIALIZE_EXCEPTION_DEPTH : depth;\n  maxSize = typeof depth !== 'number' ? MAX_SERIALIZE_EXCEPTION_SIZE : maxSize;\n\n  var serialized = serializeObject(ex, depth);\n\n  if (jsonSize(stringify(serialized)) > maxSize) {\n    return serializeException(ex, depth - 1);\n  }\n\n  return serialized;\n}\n\nfunction serializeKeysForMessage(keys, maxLength) {\n  if (typeof keys === 'number' || typeof keys === 'string') return keys.toString();\n  if (!Array.isArray(keys)) return '';\n\n  keys = keys.filter(function(key) {\n    return typeof key === 'string';\n  });\n  if (keys.length === 0) return '[object has no keys]';\n\n  maxLength = typeof maxLength !== 'number' ? MAX_SERIALIZE_KEYS_LENGTH : maxLength;\n  if (keys[0].length >= maxLength) return keys[0];\n\n  for (var usedKeys = keys.length; usedKeys > 0; usedKeys--) {\n    var serialized = keys.slice(0, usedKeys).join(', ');\n    if (serialized.length > maxLength) continue;\n    if (usedKeys === keys.length) return serialized;\n    return serialized + '\\u2026';\n  }\n\n  return '';\n}\n\nfunction sanitize(input, sanitizeKeys) {\n  if (!isArray(sanitizeKeys) || (isArray(sanitizeKeys) && sanitizeKeys.length === 0))\n    return input;\n\n  var sanitizeRegExp = joinRegExp(sanitizeKeys);\n  var sanitizeMask = '********';\n  var safeInput;\n\n  try {\n    safeInput = JSON.parse(stringify(input));\n  } catch (o_O) {\n    return input;\n  }\n\n  function sanitizeWorker(workerInput) {\n    if (isArray(workerInput)) {\n      return workerInput.map(function(val) {\n        return sanitizeWorker(val);\n      });\n    }\n\n    if (isPlainObject(workerInput)) {\n      return Object.keys(workerInput).reduce(function(acc, k) {\n        if (sanitizeRegExp.test(k)) {\n          acc[k] = sanitizeMask;\n        } else {\n          acc[k] = sanitizeWorker(workerInput[k]);\n        }\n        return acc;\n      }, {});\n    }\n\n    return workerInput;\n  }\n\n  return sanitizeWorker(safeInput);\n}\n\nmodule.exports = {\n  isObject: isObject,\n  isError: isError,\n  isErrorEvent: isErrorEvent,\n  isDOMError: isDOMError,\n  isDOMException: isDOMException,\n  isUndefined: isUndefined,\n  isFunction: isFunction,\n  isPlainObject: isPlainObject,\n  isString: isString,\n  isArray: isArray,\n  isEmptyObject: isEmptyObject,\n  supportsErrorEvent: supportsErrorEvent,\n  supportsDOMError: supportsDOMError,\n  supportsDOMException: supportsDOMException,\n  supportsFetch: supportsFetch,\n  supportsReferrerPolicy: supportsReferrerPolicy,\n  supportsPromiseRejectionEvent: supportsPromiseRejectionEvent,\n  wrappedCallback: wrappedCallback,\n  each: each,\n  objectMerge: objectMerge,\n  truncate: truncate,\n  objectFrozen: objectFrozen,\n  hasKey: hasKey,\n  joinRegExp: joinRegExp,\n  urlencode: urlencode,\n  uuid4: uuid4,\n  htmlTreeAsString: htmlTreeAsString,\n  htmlElementAsString: htmlElementAsString,\n  isSameException: isSameException,\n  isSameStacktrace: isSameStacktrace,\n  parseUrl: parseUrl,\n  fill: fill,\n  safeJoin: safeJoin,\n  serializeException: serializeException,\n  serializeKeysForMessage: serializeKeysForMessage,\n  sanitize: sanitize\n};\n\n}).call(this,typeof global !== \"undefined\" ? global : typeof self !== \"undefined\" ? self : typeof window !== \"undefined\" ? window : {})\n},{\"7\":7}],6:[function(_dereq_,module,exports){\n(function (global){\nvar utils = _dereq_(5);\n\n/*\n TraceKit - Cross brower stack traces\n\n This was originally forked from github.com/occ/TraceKit, but has since been\n largely re-written and is now maintained as part of raven-js.  Tests for\n this are in test/vendor.\n\n MIT license\n*/\n\nvar TraceKit = {\n  collectWindowErrors: true,\n  debug: false\n};\n\n// This is to be defensive in environments where window does not exist (see https://github.com/getsentry/raven-js/pull/785)\nvar _window =\n  typeof window !== 'undefined'\n    ? window\n    : typeof global !== 'undefined'\n    ? global\n    : typeof self !== 'undefined'\n    ? self\n    : {};\n\n// global reference to slice\nvar _slice = [].slice;\nvar UNKNOWN_FUNCTION = '?';\n\n// https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Error#Error_types\nvar ERROR_TYPES_RE = /^(?:[Uu]ncaught (?:exception: )?)?(?:((?:Eval|Internal|Range|Reference|Syntax|Type|URI|)Error): )?(.*)$/;\n\nfunction getLocationHref() {\n  if (typeof document === 'undefined' || document.location == null) return '';\n  return document.location.href;\n}\n\nfunction getLocationOrigin() {\n  if (typeof document === 'undefined' || document.location == null) return '';\n\n  // Oh dear IE10...\n  if (!document.location.origin) {\n    return (\n      document.location.protocol +\n      '//' +\n      document.location.hostname +\n      (document.location.port ? ':' + document.location.port : '')\n    );\n  }\n\n  return document.location.origin;\n}\n\n/**\n * TraceKit.report: cross-browser processing of unhandled exceptions\n *\n * Syntax:\n *   TraceKit.report.subscribe(function(stackInfo) { ... })\n *   TraceKit.report.unsubscribe(function(stackInfo) { ... })\n *   TraceKit.report(exception)\n *   try { ...code... } catch(ex) { TraceKit.report(ex); }\n *\n * Supports:\n *   - Firefox: full stack trace with line numbers, plus column number\n *              on top frame; column number is not guaranteed\n *   - Opera:   full stack trace with line and column numbers\n *   - Chrome:  full stack trace with line and column numbers\n *   - Safari:  line and column number for the top frame only; some frames\n *              may be missing, and column number is not guaranteed\n *   - IE:      line and column number for the top frame only; some frames\n *              may be missing, and column number is not guaranteed\n *\n * In theory, TraceKit should work on all of the following versions:\n *   - IE5.5+ (only 8.0 tested)\n *   - Firefox 0.9+ (only 3.5+ tested)\n *   - Opera 7+ (only 10.50 tested; versions 9 and earlier may require\n *     Exceptions Have Stacktrace to be enabled in opera:config)\n *   - Safari 3+ (only 4+ tested)\n *   - Chrome 1+ (only 5+ tested)\n *   - Konqueror 3.5+ (untested)\n *\n * Requires TraceKit.computeStackTrace.\n *\n * Tries to catch all unhandled exceptions and report them to the\n * subscribed handlers. Please note that TraceKit.report will rethrow the\n * exception. This is REQUIRED in order to get a useful stack trace in IE.\n * If the exception does not reach the top of the browser, you will only\n * get a stack trace from the point where TraceKit.report was called.\n *\n * Handlers receive a stackInfo object as described in the\n * TraceKit.computeStackTrace docs.\n */\nTraceKit.report = (function reportModuleWrapper() {\n  var handlers = [],\n    lastArgs = null,\n    lastException = null,\n    lastExceptionStack = null;\n\n  /**\n   * Add a crash handler.\n   * @param {Function} handler\n   */\n  function subscribe(handler) {\n    installGlobalHandler();\n    handlers.push(handler);\n  }\n\n  /**\n   * Remove a crash handler.\n   * @param {Function} handler\n   */\n  function unsubscribe(handler) {\n    for (var i = handlers.length - 1; i >= 0; --i) {\n      if (handlers[i] === handler) {\n        handlers.splice(i, 1);\n      }\n    }\n  }\n\n  /**\n   * Remove all crash handlers.\n   */\n  function unsubscribeAll() {\n    uninstallGlobalHandler();\n    handlers = [];\n  }\n\n  /**\n   * Dispatch stack information to all handlers.\n   * @param {Object.<string, *>} stack\n   */\n  function notifyHandlers(stack, isWindowError) {\n    var exception = null;\n    if (isWindowError && !TraceKit.collectWindowErrors) {\n      return;\n    }\n    for (var i in handlers) {\n      if (handlers.hasOwnProperty(i)) {\n        try {\n          handlers[i].apply(null, [stack].concat(_slice.call(arguments, 2)));\n        } catch (inner) {\n          exception = inner;\n        }\n      }\n    }\n\n    if (exception) {\n      throw exception;\n    }\n  }\n\n  var _oldOnerrorHandler, _onErrorHandlerInstalled;\n\n  /**\n   * Ensures all global unhandled exceptions are recorded.\n   * Supported by Gecko and IE.\n   * @param {string} msg Error message.\n   * @param {string} url URL of script that generated the exception.\n   * @param {(number|string)} lineNo The line number at which the error\n   * occurred.\n   * @param {?(number|string)} colNo The column number at which the error\n   * occurred.\n   * @param {?Error} ex The actual Error object.\n   */\n  function traceKitWindowOnError(msg, url, lineNo, colNo, ex) {\n    var stack = null;\n    // If 'ex' is ErrorEvent, get real Error from inside\n    var exception = utils.isErrorEvent(ex) ? ex.error : ex;\n    // If 'msg' is ErrorEvent, get real message from inside\n    var message = utils.isErrorEvent(msg) ? msg.message : msg;\n\n    if (lastExceptionStack) {\n      TraceKit.computeStackTrace.augmentStackTraceWithInitialElement(\n        lastExceptionStack,\n        url,\n        lineNo,\n        message\n      );\n      processLastException();\n    } else if (exception && utils.isError(exception)) {\n      // non-string `exception` arg; attempt to extract stack trace\n\n      // New chrome and blink send along a real error object\n      // Let's just report that like a normal error.\n      // See: https://mikewest.org/2013/08/debugging-runtime-errors-with-window-onerror\n      stack = TraceKit.computeStackTrace(exception);\n      notifyHandlers(stack, true);\n    } else {\n      var location = {\n        url: url,\n        line: lineNo,\n        column: colNo\n      };\n\n      var name = undefined;\n      var groups;\n\n      if ({}.toString.call(message) === '[object String]') {\n        var groups = message.match(ERROR_TYPES_RE);\n        if (groups) {\n          name = groups[1];\n          message = groups[2];\n        }\n      }\n\n      location.func = UNKNOWN_FUNCTION;\n\n      stack = {\n        name: name,\n        message: message,\n        url: getLocationHref(),\n        stack: [location]\n      };\n      notifyHandlers(stack, true);\n    }\n\n    if (_oldOnerrorHandler) {\n      return _oldOnerrorHandler.apply(this, arguments);\n    }\n\n    return false;\n  }\n\n  function installGlobalHandler() {\n    if (_onErrorHandlerInstalled) {\n      return;\n    }\n    _oldOnerrorHandler = _window.onerror;\n    _window.onerror = traceKitWindowOnError;\n    _onErrorHandlerInstalled = true;\n  }\n\n  function uninstallGlobalHandler() {\n    if (!_onErrorHandlerInstalled) {\n      return;\n    }\n    _window.onerror = _oldOnerrorHandler;\n    _onErrorHandlerInstalled = false;\n    _oldOnerrorHandler = undefined;\n  }\n\n  function processLastException() {\n    var _lastExceptionStack = lastExceptionStack,\n      _lastArgs = lastArgs;\n    lastArgs = null;\n    lastExceptionStack = null;\n    lastException = null;\n    notifyHandlers.apply(null, [_lastExceptionStack, false].concat(_lastArgs));\n  }\n\n  /**\n   * Reports an unhandled Error to TraceKit.\n   * @param {Error} ex\n   * @param {?boolean} rethrow If false, do not re-throw the exception.\n   * Only used for window.onerror to not cause an infinite loop of\n   * rethrowing.\n   */\n  function report(ex, rethrow) {\n    var args = _slice.call(arguments, 1);\n    if (lastExceptionStack) {\n      if (lastException === ex) {\n        return; // already caught by an inner catch block, ignore\n      } else {\n        processLastException();\n      }\n    }\n\n    var stack = TraceKit.computeStackTrace(ex);\n    lastExceptionStack = stack;\n    lastException = ex;\n    lastArgs = args;\n\n    // If the stack trace is incomplete, wait for 2 seconds for\n    // slow slow IE to see if onerror occurs or not before reporting\n    // this exception; otherwise, we will end up with an incomplete\n    // stack trace\n    setTimeout(\n      function() {\n        if (lastException === ex) {\n          processLastException();\n        }\n      },\n      stack.incomplete ? 2000 : 0\n    );\n\n    if (rethrow !== false) {\n      throw ex; // re-throw to propagate to the top level (and cause window.onerror)\n    }\n  }\n\n  report.subscribe = subscribe;\n  report.unsubscribe = unsubscribe;\n  report.uninstall = unsubscribeAll;\n  return report;\n})();\n\n/**\n * TraceKit.computeStackTrace: cross-browser stack traces in JavaScript\n *\n * Syntax:\n *   s = TraceKit.computeStackTrace(exception) // consider using TraceKit.report instead (see below)\n * Returns:\n *   s.name              - exception name\n *   s.message           - exception message\n *   s.stack[i].url      - JavaScript or HTML file URL\n *   s.stack[i].func     - function name, or empty for anonymous functions (if guessing did not work)\n *   s.stack[i].args     - arguments passed to the function, if known\n *   s.stack[i].line     - line number, if known\n *   s.stack[i].column   - column number, if known\n *\n * Supports:\n *   - Firefox:  full stack trace with line numbers and unreliable column\n *               number on top frame\n *   - Opera 10: full stack trace with line and column numbers\n *   - Opera 9-: full stack trace with line numbers\n *   - Chrome:   full stack trace with line and column numbers\n *   - Safari:   line and column number for the topmost stacktrace element\n *               only\n *   - IE:       no line numbers whatsoever\n *\n * Tries to guess names of anonymous functions by looking for assignments\n * in the source code. In IE and Safari, we have to guess source file names\n * by searching for function bodies inside all page scripts. This will not\n * work for scripts that are loaded cross-domain.\n * Here be dragons: some function names may be guessed incorrectly, and\n * duplicate functions may be mismatched.\n *\n * TraceKit.computeStackTrace should only be used for tracing purposes.\n * Logging of unhandled exceptions should be done with TraceKit.report,\n * which builds on top of TraceKit.computeStackTrace and provides better\n * IE support by utilizing the window.onerror event to retrieve information\n * about the top of the stack.\n *\n * Note: In IE and Safari, no stack trace is recorded on the Error object,\n * so computeStackTrace instead walks its *own* chain of callers.\n * This means that:\n *  * in Safari, some methods may be missing from the stack trace;\n *  * in IE, the topmost function in the stack trace will always be the\n *    caller of computeStackTrace.\n *\n * This is okay for tracing (because you are likely to be calling\n * computeStackTrace from the function you want to be the topmost element\n * of the stack trace anyway), but not okay for logging unhandled\n * exceptions (because your catch block will likely be far away from the\n * inner function that actually caused the exception).\n *\n */\nTraceKit.computeStackTrace = (function computeStackTraceWrapper() {\n  // Contents of Exception in various browsers.\n  //\n  // SAFARI:\n  // ex.message = Can't find variable: qq\n  // ex.line = 59\n  // ex.sourceId = 580238192\n  // ex.sourceURL = http://...\n  // ex.expressionBeginOffset = 96\n  // ex.expressionCaretOffset = 98\n  // ex.expressionEndOffset = 98\n  // ex.name = ReferenceError\n  //\n  // FIREFOX:\n  // ex.message = qq is not defined\n  // ex.fileName = http://...\n  // ex.lineNumber = 59\n  // ex.columnNumber = 69\n  // ex.stack = ...stack trace... (see the example below)\n  // ex.name = ReferenceError\n  //\n  // CHROME:\n  // ex.message = qq is not defined\n  // ex.name = ReferenceError\n  // ex.type = not_defined\n  // ex.arguments = ['aa']\n  // ex.stack = ...stack trace...\n  //\n  // INTERNET EXPLORER:\n  // ex.message = ...\n  // ex.name = ReferenceError\n  //\n  // OPERA:\n  // ex.message = ...message... (see the example below)\n  // ex.name = ReferenceError\n  // ex.opera#sourceloc = 11  (pretty much useless, duplicates the info in ex.message)\n  // ex.stacktrace = n/a; see 'opera:config#UserPrefs|Exceptions Have Stacktrace'\n\n  /**\n   * Computes stack trace information from the stack property.\n   * Chrome and Gecko use this property.\n   * @param {Error} ex\n   * @return {?Object.<string, *>} Stack trace information.\n   */\n  function computeStackTraceFromStackProp(ex) {\n    if (typeof ex.stack === 'undefined' || !ex.stack) return;\n\n    var chrome = /^\\s*at (?:(.*?) ?\\()?((?:file|https?|blob|chrome-extension|native|eval|webpack|<anonymous>|[a-z]:|\\/).*?)(?::(\\d+))?(?::(\\d+))?\\)?\\s*$/i;\n    var winjs = /^\\s*at (?:((?:\\[object object\\])?.+) )?\\(?((?:file|ms-appx(?:-web)|https?|webpack|blob):.*?):(\\d+)(?::(\\d+))?\\)?\\s*$/i;\n    // NOTE: blob urls are now supposed to always have an origin, therefore it's format\n    // which is `blob:http://url/path/with-some-uuid`, is matched by `blob.*?:\\/` as well\n    var gecko = /^\\s*(.*?)(?:\\((.*?)\\))?(?:^|@)((?:file|https?|blob|chrome|webpack|resource|moz-extension).*?:\\/.*?|\\[native code\\]|[^@]*(?:bundle|\\d+\\.js))(?::(\\d+))?(?::(\\d+))?\\s*$/i;\n    // Used to additionally parse URL/line/column from eval frames\n    var geckoEval = /(\\S+) line (\\d+)(?: > eval line \\d+)* > eval/i;\n    var chromeEval = /\\((\\S*)(?::(\\d+))(?::(\\d+))\\)/;\n    var lines = ex.stack.split('\\n');\n    var stack = [];\n    var submatch;\n    var parts;\n    var element;\n    var reference = /^(.*) is undefined$/.exec(ex.message);\n\n    for (var i = 0, j = lines.length; i < j; ++i) {\n      if ((parts = chrome.exec(lines[i]))) {\n        var isNative = parts[2] && parts[2].indexOf('native') === 0; // start of line\n        var isEval = parts[2] && parts[2].indexOf('eval') === 0; // start of line\n        if (isEval && (submatch = chromeEval.exec(parts[2]))) {\n          // throw out eval line/column and use top-most line/column number\n          parts[2] = submatch[1]; // url\n          parts[3] = submatch[2]; // line\n          parts[4] = submatch[3]; // column\n        }\n        element = {\n          url: !isNative ? parts[2] : null,\n          func: parts[1] || UNKNOWN_FUNCTION,\n          args: isNative ? [parts[2]] : [],\n          line: parts[3] ? +parts[3] : null,\n          column: parts[4] ? +parts[4] : null\n        };\n      } else if ((parts = winjs.exec(lines[i]))) {\n        element = {\n          url: parts[2],\n          func: parts[1] || UNKNOWN_FUNCTION,\n          args: [],\n          line: +parts[3],\n          column: parts[4] ? +parts[4] : null\n        };\n      } else if ((parts = gecko.exec(lines[i]))) {\n        var isEval = parts[3] && parts[3].indexOf(' > eval') > -1;\n        if (isEval && (submatch = geckoEval.exec(parts[3]))) {\n          // throw out eval line/column and use top-most line number\n          parts[3] = submatch[1];\n          parts[4] = submatch[2];\n          parts[5] = null; // no column when eval\n        } else if (i === 0 && !parts[5] && typeof ex.columnNumber !== 'undefined') {\n          // FireFox uses this awesome columnNumber property for its top frame\n          // Also note, Firefox's column number is 0-based and everything else expects 1-based,\n          // so adding 1\n          // NOTE: this hack doesn't work if top-most frame is eval\n          stack[0].column = ex.columnNumber + 1;\n        }\n        element = {\n          url: parts[3],\n          func: parts[1] || UNKNOWN_FUNCTION,\n          args: parts[2] ? parts[2].split(',') : [],\n          line: parts[4] ? +parts[4] : null,\n          column: parts[5] ? +parts[5] : null\n        };\n      } else {\n        continue;\n      }\n\n      if (!element.func && element.line) {\n        element.func = UNKNOWN_FUNCTION;\n      }\n\n      if (element.url && element.url.substr(0, 5) === 'blob:') {\n        // Special case for handling JavaScript loaded into a blob.\n        // We use a synchronous AJAX request here as a blob is already in\n        // memory - it's not making a network request.  This will generate a warning\n        // in the browser console, but there has already been an error so that's not\n        // that much of an issue.\n        var xhr = new XMLHttpRequest();\n        xhr.open('GET', element.url, false);\n        xhr.send(null);\n\n        // If we failed to download the source, skip this patch\n        if (xhr.status === 200) {\n          var source = xhr.responseText || '';\n\n          // We trim the source down to the last 300 characters as sourceMappingURL is always at the end of the file.\n          // Why 300? To be in line with: https://github.com/getsentry/sentry/blob/4af29e8f2350e20c28a6933354e4f42437b4ba42/src/sentry/lang/javascript/processor.py#L164-L175\n          source = source.slice(-300);\n\n          // Now we dig out the source map URL\n          var sourceMaps = source.match(/\\/\\/# sourceMappingURL=(.*)$/);\n\n          // If we don't find a source map comment or we find more than one, continue on to the next element.\n          if (sourceMaps) {\n            var sourceMapAddress = sourceMaps[1];\n\n            // Now we check to see if it's a relative URL.\n            // If it is, convert it to an absolute one.\n            if (sourceMapAddress.charAt(0) === '~') {\n              sourceMapAddress = getLocationOrigin() + sourceMapAddress.slice(1);\n            }\n\n            // Now we strip the '.map' off of the end of the URL and update the\n            // element so that Sentry can match the map to the blob.\n            element.url = sourceMapAddress.slice(0, -4);\n          }\n        }\n      }\n\n      stack.push(element);\n    }\n\n    if (!stack.length) {\n      return null;\n    }\n\n    return {\n      name: ex.name,\n      message: ex.message,\n      url: getLocationHref(),\n      stack: stack\n    };\n  }\n\n  /**\n   * Adds information about the first frame to incomplete stack traces.\n   * Safari and IE require this to get complete data on the first frame.\n   * @param {Object.<string, *>} stackInfo Stack trace information from\n   * one of the compute* methods.\n   * @param {string} url The URL of the script that caused an error.\n   * @param {(number|string)} lineNo The line number of the script that\n   * caused an error.\n   * @param {string=} message The error generated by the browser, which\n   * hopefully contains the name of the object that caused the error.\n   * @return {boolean} Whether or not the stack information was\n   * augmented.\n   */\n  function augmentStackTraceWithInitialElement(stackInfo, url, lineNo, message) {\n    var initial = {\n      url: url,\n      line: lineNo\n    };\n\n    if (initial.url && initial.line) {\n      stackInfo.incomplete = false;\n\n      if (!initial.func) {\n        initial.func = UNKNOWN_FUNCTION;\n      }\n\n      if (stackInfo.stack.length > 0) {\n        if (stackInfo.stack[0].url === initial.url) {\n          if (stackInfo.stack[0].line === initial.line) {\n            return false; // already in stack trace\n          } else if (\n            !stackInfo.stack[0].line &&\n            stackInfo.stack[0].func === initial.func\n          ) {\n            stackInfo.stack[0].line = initial.line;\n            return false;\n          }\n        }\n      }\n\n      stackInfo.stack.unshift(initial);\n      stackInfo.partial = true;\n      return true;\n    } else {\n      stackInfo.incomplete = true;\n    }\n\n    return false;\n  }\n\n  /**\n   * Computes stack trace information by walking the arguments.caller\n   * chain at the time the exception occurred. This will cause earlier\n   * frames to be missed but is the only way to get any stack trace in\n   * Safari and IE. The top frame is restored by\n   * {@link augmentStackTraceWithInitialElement}.\n   * @param {Error} ex\n   * @return {?Object.<string, *>} Stack trace information.\n   */\n  function computeStackTraceByWalkingCallerChain(ex, depth) {\n    var functionName = /function\\s+([_$a-zA-Z\\xA0-\\uFFFF][_$a-zA-Z0-9\\xA0-\\uFFFF]*)?\\s*\\(/i,\n      stack = [],\n      funcs = {},\n      recursion = false,\n      parts,\n      item,\n      source;\n\n    for (\n      var curr = computeStackTraceByWalkingCallerChain.caller;\n      curr && !recursion;\n      curr = curr.caller\n    ) {\n      if (curr === computeStackTrace || curr === TraceKit.report) {\n        // console.log('skipping internal function');\n        continue;\n      }\n\n      item = {\n        url: null,\n        func: UNKNOWN_FUNCTION,\n        line: null,\n        column: null\n      };\n\n      if (curr.name) {\n        item.func = curr.name;\n      } else if ((parts = functionName.exec(curr.toString()))) {\n        item.func = parts[1];\n      }\n\n      if (typeof item.func === 'undefined') {\n        try {\n          item.func = parts.input.substring(0, parts.input.indexOf('{'));\n        } catch (e) {}\n      }\n\n      if (funcs['' + curr]) {\n        recursion = true;\n      } else {\n        funcs['' + curr] = true;\n      }\n\n      stack.push(item);\n    }\n\n    if (depth) {\n      // console.log('depth is ' + depth);\n      // console.log('stack is ' + stack.length);\n      stack.splice(0, depth);\n    }\n\n    var result = {\n      name: ex.name,\n      message: ex.message,\n      url: getLocationHref(),\n      stack: stack\n    };\n    augmentStackTraceWithInitialElement(\n      result,\n      ex.sourceURL || ex.fileName,\n      ex.line || ex.lineNumber,\n      ex.message || ex.description\n    );\n    return result;\n  }\n\n  /**\n   * Computes a stack trace for an exception.\n   * @param {Error} ex\n   * @param {(string|number)=} depth\n   */\n  function computeStackTrace(ex, depth) {\n    var stack = null;\n    depth = depth == null ? 0 : +depth;\n\n    try {\n      stack = computeStackTraceFromStackProp(ex);\n      if (stack) {\n        return stack;\n      }\n    } catch (e) {\n      if (TraceKit.debug) {\n        throw e;\n      }\n    }\n\n    try {\n      stack = computeStackTraceByWalkingCallerChain(ex, depth + 1);\n      if (stack) {\n        return stack;\n      }\n    } catch (e) {\n      if (TraceKit.debug) {\n        throw e;\n      }\n    }\n    return {\n      name: ex.name,\n      message: ex.message,\n      url: getLocationHref()\n    };\n  }\n\n  computeStackTrace.augmentStackTraceWithInitialElement = augmentStackTraceWithInitialElement;\n  computeStackTrace.computeStackTraceFromStackProp = computeStackTraceFromStackProp;\n\n  return computeStackTrace;\n})();\n\nmodule.exports = TraceKit;\n\n}).call(this,typeof global !== \"undefined\" ? global : typeof self !== \"undefined\" ? self : typeof window !== \"undefined\" ? window : {})\n},{\"5\":5}],7:[function(_dereq_,module,exports){\n/*\n json-stringify-safe\n Like JSON.stringify, but doesn't throw on circular references.\n\n Originally forked from https://github.com/isaacs/json-stringify-safe\n version 5.0.1 on 3/8/2017 and modified to handle Errors serialization\n and IE8 compatibility. Tests for this are in test/vendor.\n\n ISC license: https://github.com/isaacs/json-stringify-safe/blob/master/LICENSE\n*/\n\nexports = module.exports = stringify;\nexports.getSerialize = serializer;\n\nfunction indexOf(haystack, needle) {\n  for (var i = 0; i < haystack.length; ++i) {\n    if (haystack[i] === needle) return i;\n  }\n  return -1;\n}\n\nfunction stringify(obj, replacer, spaces, cycleReplacer) {\n  return JSON.stringify(obj, serializer(replacer, cycleReplacer), spaces);\n}\n\n// https://github.com/ftlabs/js-abbreviate/blob/fa709e5f139e7770a71827b1893f22418097fbda/index.js#L95-L106\nfunction stringifyError(value) {\n  var err = {\n    // These properties are implemented as magical getters and don't show up in for in\n    stack: value.stack,\n    message: value.message,\n    name: value.name\n  };\n\n  for (var i in value) {\n    if (Object.prototype.hasOwnProperty.call(value, i)) {\n      err[i] = value[i];\n    }\n  }\n\n  return err;\n}\n\nfunction serializer(replacer, cycleReplacer) {\n  var stack = [];\n  var keys = [];\n\n  if (cycleReplacer == null) {\n    cycleReplacer = function(key, value) {\n      if (stack[0] === value) {\n        return '[Circular ~]';\n      }\n      return '[Circular ~.' + keys.slice(0, indexOf(stack, value)).join('.') + ']';\n    };\n  }\n\n  return function(key, value) {\n    if (stack.length > 0) {\n      var thisPos = indexOf(stack, this);\n      ~thisPos ? stack.splice(thisPos + 1) : stack.push(this);\n      ~thisPos ? keys.splice(thisPos, Infinity, key) : keys.push(key);\n\n      if (~indexOf(stack, value)) {\n        value = cycleReplacer.call(this, key, value);\n      }\n    } else {\n      stack.push(value);\n    }\n\n    return replacer == null\n      ? value instanceof Error ? stringifyError(value) : value\n      : replacer.call(this, key, value);\n  };\n}\n\n},{}],8:[function(_dereq_,module,exports){\n/*\n * JavaScript MD5\n * https://github.com/blueimp/JavaScript-MD5\n *\n * Copyright 2011, Sebastian Tschan\n * https://blueimp.net\n *\n * Licensed under the MIT license:\n * https://opensource.org/licenses/MIT\n *\n * Based on\n * A JavaScript implementation of the RSA Data Security, Inc. MD5 Message\n * Digest Algorithm, as defined in RFC 1321.\n * Version 2.2 Copyright (C) Paul Johnston 1999 - 2009\n * Other contributors: Greg Holt, Andrew Kepert, Ydnar, Lostinet\n * Distributed under the BSD License\n * See http://pajhome.org.uk/crypt/md5 for more info.\n */\n\n/*\n* Add integers, wrapping at 2^32. This uses 16-bit operations internally\n* to work around bugs in some JS interpreters.\n*/\nfunction safeAdd(x, y) {\n  var lsw = (x & 0xffff) + (y & 0xffff);\n  var msw = (x >> 16) + (y >> 16) + (lsw >> 16);\n  return (msw << 16) | (lsw & 0xffff);\n}\n\n/*\n* Bitwise rotate a 32-bit number to the left.\n*/\nfunction bitRotateLeft(num, cnt) {\n  return (num << cnt) | (num >>> (32 - cnt));\n}\n\n/*\n* These functions implement the four basic operations the algorithm uses.\n*/\nfunction md5cmn(q, a, b, x, s, t) {\n  return safeAdd(bitRotateLeft(safeAdd(safeAdd(a, q), safeAdd(x, t)), s), b);\n}\nfunction md5ff(a, b, c, d, x, s, t) {\n  return md5cmn((b & c) | (~b & d), a, b, x, s, t);\n}\nfunction md5gg(a, b, c, d, x, s, t) {\n  return md5cmn((b & d) | (c & ~d), a, b, x, s, t);\n}\nfunction md5hh(a, b, c, d, x, s, t) {\n  return md5cmn(b ^ c ^ d, a, b, x, s, t);\n}\nfunction md5ii(a, b, c, d, x, s, t) {\n  return md5cmn(c ^ (b | ~d), a, b, x, s, t);\n}\n\n/*\n* Calculate the MD5 of an array of little-endian words, and a bit length.\n*/\nfunction binlMD5(x, len) {\n  /* append padding */\n  x[len >> 5] |= 0x80 << (len % 32);\n  x[(((len + 64) >>> 9) << 4) + 14] = len;\n\n  var i;\n  var olda;\n  var oldb;\n  var oldc;\n  var oldd;\n  var a = 1732584193;\n  var b = -271733879;\n  var c = -1732584194;\n  var d = 271733878;\n\n  for (i = 0; i < x.length; i += 16) {\n    olda = a;\n    oldb = b;\n    oldc = c;\n    oldd = d;\n\n    a = md5ff(a, b, c, d, x[i], 7, -680876936);\n    d = md5ff(d, a, b, c, x[i + 1], 12, -389564586);\n    c = md5ff(c, d, a, b, x[i + 2], 17, 606105819);\n    b = md5ff(b, c, d, a, x[i + 3], 22, -1044525330);\n    a = md5ff(a, b, c, d, x[i + 4], 7, -176418897);\n    d = md5ff(d, a, b, c, x[i + 5], 12, 1200080426);\n    c = md5ff(c, d, a, b, x[i + 6], 17, -1473231341);\n    b = md5ff(b, c, d, a, x[i + 7], 22, -45705983);\n    a = md5ff(a, b, c, d, x[i + 8], 7, 1770035416);\n    d = md5ff(d, a, b, c, x[i + 9], 12, -1958414417);\n    c = md5ff(c, d, a, b, x[i + 10], 17, -42063);\n    b = md5ff(b, c, d, a, x[i + 11], 22, -1990404162);\n    a = md5ff(a, b, c, d, x[i + 12], 7, 1804603682);\n    d = md5ff(d, a, b, c, x[i + 13], 12, -40341101);\n    c = md5ff(c, d, a, b, x[i + 14], 17, -1502002290);\n    b = md5ff(b, c, d, a, x[i + 15], 22, 1236535329);\n\n    a = md5gg(a, b, c, d, x[i + 1], 5, -165796510);\n    d = md5gg(d, a, b, c, x[i + 6], 9, -1069501632);\n    c = md5gg(c, d, a, b, x[i + 11], 14, 643717713);\n    b = md5gg(b, c, d, a, x[i], 20, -373897302);\n    a = md5gg(a, b, c, d, x[i + 5], 5, -701558691);\n    d = md5gg(d, a, b, c, x[i + 10], 9, 38016083);\n    c = md5gg(c, d, a, b, x[i + 15], 14, -660478335);\n    b = md5gg(b, c, d, a, x[i + 4], 20, -405537848);\n    a = md5gg(a, b, c, d, x[i + 9], 5, 568446438);\n    d = md5gg(d, a, b, c, x[i + 14], 9, -1019803690);\n    c = md5gg(c, d, a, b, x[i + 3], 14, -187363961);\n    b = md5gg(b, c, d, a, x[i + 8], 20, 1163531501);\n    a = md5gg(a, b, c, d, x[i + 13], 5, -1444681467);\n    d = md5gg(d, a, b, c, x[i + 2], 9, -51403784);\n    c = md5gg(c, d, a, b, x[i + 7], 14, 1735328473);\n    b = md5gg(b, c, d, a, x[i + 12], 20, -1926607734);\n\n    a = md5hh(a, b, c, d, x[i + 5], 4, -378558);\n    d = md5hh(d, a, b, c, x[i + 8], 11, -2022574463);\n    c = md5hh(c, d, a, b, x[i + 11], 16, 1839030562);\n    b = md5hh(b, c, d, a, x[i + 14], 23, -35309556);\n    a = md5hh(a, b, c, d, x[i + 1], 4, -1530992060);\n    d = md5hh(d, a, b, c, x[i + 4], 11, 1272893353);\n    c = md5hh(c, d, a, b, x[i + 7], 16, -155497632);\n    b = md5hh(b, c, d, a, x[i + 10], 23, -1094730640);\n    a = md5hh(a, b, c, d, x[i + 13], 4, 681279174);\n    d = md5hh(d, a, b, c, x[i], 11, -358537222);\n    c = md5hh(c, d, a, b, x[i + 3], 16, -722521979);\n    b = md5hh(b, c, d, a, x[i + 6], 23, 76029189);\n    a = md5hh(a, b, c, d, x[i + 9], 4, -640364487);\n    d = md5hh(d, a, b, c, x[i + 12], 11, -421815835);\n    c = md5hh(c, d, a, b, x[i + 15], 16, 530742520);\n    b = md5hh(b, c, d, a, x[i + 2], 23, -995338651);\n\n    a = md5ii(a, b, c, d, x[i], 6, -198630844);\n    d = md5ii(d, a, b, c, x[i + 7], 10, 1126891415);\n    c = md5ii(c, d, a, b, x[i + 14], 15, -1416354905);\n    b = md5ii(b, c, d, a, x[i + 5], 21, -57434055);\n    a = md5ii(a, b, c, d, x[i + 12], 6, 1700485571);\n    d = md5ii(d, a, b, c, x[i + 3], 10, -1894986606);\n    c = md5ii(c, d, a, b, x[i + 10], 15, -1051523);\n    b = md5ii(b, c, d, a, x[i + 1], 21, -2054922799);\n    a = md5ii(a, b, c, d, x[i + 8], 6, 1873313359);\n    d = md5ii(d, a, b, c, x[i + 15], 10, -30611744);\n    c = md5ii(c, d, a, b, x[i + 6], 15, -1560198380);\n    b = md5ii(b, c, d, a, x[i + 13], 21, 1309151649);\n    a = md5ii(a, b, c, d, x[i + 4], 6, -145523070);\n    d = md5ii(d, a, b, c, x[i + 11], 10, -1120210379);\n    c = md5ii(c, d, a, b, x[i + 2], 15, 718787259);\n    b = md5ii(b, c, d, a, x[i + 9], 21, -343485551);\n\n    a = safeAdd(a, olda);\n    b = safeAdd(b, oldb);\n    c = safeAdd(c, oldc);\n    d = safeAdd(d, oldd);\n  }\n  return [a, b, c, d];\n}\n\n/*\n* Convert an array of little-endian words to a string\n*/\nfunction binl2rstr(input) {\n  var i;\n  var output = '';\n  var length32 = input.length * 32;\n  for (i = 0; i < length32; i += 8) {\n    output += String.fromCharCode((input[i >> 5] >>> (i % 32)) & 0xff);\n  }\n  return output;\n}\n\n/*\n* Convert a raw string to an array of little-endian words\n* Characters >255 have their high-byte silently ignored.\n*/\nfunction rstr2binl(input) {\n  var i;\n  var output = [];\n  output[(input.length >> 2) - 1] = undefined;\n  for (i = 0; i < output.length; i += 1) {\n    output[i] = 0;\n  }\n  var length8 = input.length * 8;\n  for (i = 0; i < length8; i += 8) {\n    output[i >> 5] |= (input.charCodeAt(i / 8) & 0xff) << (i % 32);\n  }\n  return output;\n}\n\n/*\n* Calculate the MD5 of a raw string\n*/\nfunction rstrMD5(s) {\n  return binl2rstr(binlMD5(rstr2binl(s), s.length * 8));\n}\n\n/*\n* Calculate the HMAC-MD5, of a key and some data (raw strings)\n*/\nfunction rstrHMACMD5(key, data) {\n  var i;\n  var bkey = rstr2binl(key);\n  var ipad = [];\n  var opad = [];\n  var hash;\n  ipad[15] = opad[15] = undefined;\n  if (bkey.length > 16) {\n    bkey = binlMD5(bkey, key.length * 8);\n  }\n  for (i = 0; i < 16; i += 1) {\n    ipad[i] = bkey[i] ^ 0x36363636;\n    opad[i] = bkey[i] ^ 0x5c5c5c5c;\n  }\n  hash = binlMD5(ipad.concat(rstr2binl(data)), 512 + data.length * 8);\n  return binl2rstr(binlMD5(opad.concat(hash), 512 + 128));\n}\n\n/*\n* Convert a raw string to a hex string\n*/\nfunction rstr2hex(input) {\n  var hexTab = '0123456789abcdef';\n  var output = '';\n  var x;\n  var i;\n  for (i = 0; i < input.length; i += 1) {\n    x = input.charCodeAt(i);\n    output += hexTab.charAt((x >>> 4) & 0x0f) + hexTab.charAt(x & 0x0f);\n  }\n  return output;\n}\n\n/*\n* Encode a string as utf-8\n*/\nfunction str2rstrUTF8(input) {\n  return unescape(encodeURIComponent(input));\n}\n\n/*\n* Take string arguments and return either raw or hex encoded strings\n*/\nfunction rawMD5(s) {\n  return rstrMD5(str2rstrUTF8(s));\n}\nfunction hexMD5(s) {\n  return rstr2hex(rawMD5(s));\n}\nfunction rawHMACMD5(k, d) {\n  return rstrHMACMD5(str2rstrUTF8(k), str2rstrUTF8(d));\n}\nfunction hexHMACMD5(k, d) {\n  return rstr2hex(rawHMACMD5(k, d));\n}\n\nfunction md5(string, key, raw) {\n  if (!key) {\n    if (!raw) {\n      return hexMD5(string);\n    }\n    return rawMD5(string);\n  }\n  if (!raw) {\n    return hexHMACMD5(key, string);\n  }\n  return rawHMACMD5(key, string);\n}\n\nmodule.exports = md5;\n\n},{}]},{},[4])(4)\n});\n\n/*\n* Name: md-date-range-picker\n* Version: 1.0.0\n* Build Date: 5/27/2021\n* Author: roel barreto <greatcodeideas@gmail.com>\n*/\n(function (window, angular) {\n\n    angular\n        .module('ngMaterialDateRangePicker', ['ngMaterial'])\n        .directive('mdDateRangePicker', mdDateRangePickerDirective)\n        .directive('mdDateRange', mdDateRangeDirective)\n        .controller('mdDateRangePickerCtrl', mdDateRangePickerCtrl)\n        .service('$mdDateRangePicker', mdDateRangePickerService);\n\n    /**\n     * scope here is non-bi-directional\n     */\n    mdDateRangePickerDirective.$inject = ['$mdDateRangePicker'];\n    function mdDateRangePickerDirective($mdDateRangePicker) {\n        var directive = {\n            scope: {\n                selectedTemplate: '=',\n                selectedTemplateName: '=',\n                dateStart: '=?',\n                dateEnd: '=?',\n                firstDayOfWeek: '=?',\n                showTemplate: '=?',\n                mdOnSelect: '&',\n                localizationMap: '=?',\n                customTemplates: '=?',\n                disableTemplates: '@',\n                maxRange: '=?',\n                onePanel: '=?',\n                isDisabledDate: '&?',\n                format: '=?',\n                autoFocusDateStart: '=?'\n            },\n            template: '<div class=\"md-date-range-picker md-whiteframe-1dp\" ng-class=\"{\\'md-date-range-picker__one-panel\\':onePanel}\"><div layout=\"column\"><div layout=\"row\" layout-margin><div class=\"md-date-range-picker__calendar-wrapper\"><div class=\"md-date-range-picker__month-year\" layout=\"row\" layout-align=\"center center\"><div flex layout=\"column\" layout-align=\"center center\"><span aria-label=\"Previous Month\" class=\"md-button md-icon-button\" event-key=\"prev\"><md-icon md-svg-src=\"data:image/svg+xml;base64,PHN2ZyB2ZXJzaW9uPSIxLjEiIHg9IjBweCIgeT0iMHB4IiB2aWV3Qm94PSIwIDAgMjQgMjQiPjxnPjxwb2x5Z29uIHBvaW50cz0iMTUuNCw3LjQgMTQsNiA4LDEyIDE0LDE4IDE1LjQsMTYuNiAxMC44LDEyICIvPjwvZz48L3N2Zz4=\"></md-icon></span></div><md-select md-container-class=\"md-date-range-picker__select\" md-on-close=\"updateActiveDate()\" ng-model=\"activeMonth\" placeholder=\"{{::getLocalizationVal(\\'Month\\')}}\" class=\"md-no-underline\"><md-option ng-value=\"::month.id\" ng-repeat=\"month in months\" ng-bind=\"::month.name\"></md-option></md-select><md-select md-container-class=\"md-date-range-picker__select\" md-on-close=\"updateActiveDate()\" ng-model=\"activeYear\" placeholder=\"{{::getLocalizationVal(\\'Year\\')}}\" class=\"md-no-underline\"><md-option ng-value=\"::year.id\" ng-repeat=\"year in years\" ng-bind=\"::year.name\"></md-option></md-select><div flex layout=\"column\" layout-align=\"center center\" class=\"hide-gt-sm show-sm show-xs\"><span aria-label=\"Next Month\" class=\"md-icon-button md-button\" event-key=\"next\"><md-icon style=\"transform: rotate(-180deg)\" md-svg-src=\"data:image/svg+xml;base64,PHN2ZyB2ZXJzaW9uPSIxLjEiIHg9IjBweCIgeT0iMHB4IiB2aWV3Qm94PSIwIDAgMjQgMjQiPjxnPjxwb2x5Z29uIHBvaW50cz0iMTUuNCw3LjQgMTQsNiA4LDEyIDE0LDE4IDE1LjQsMTYuNiAxMC44LDEyICIvPjwvZz48L3N2Zz4=\"></md-icon></span></div><div flex ng-if=\"onePanel\" layout=\"column\" layout-align=\"center center\" class=\"hide-sm hide-xs show-gt-sm\"><span aria-label=\"Next Month\" class=\"md-icon-button md-button\" event-key=\"next\"><md-icon style=\"transform: rotate(-180deg)\" md-svg-src=\"data:image/svg+xml;base64,PHN2ZyB2ZXJzaW9uPSIxLjEiIHg9IjBweCIgeT0iMHB4IiB2aWV3Qm94PSIwIDAgMjQgMjQiPjxnPjxwb2x5Z29uIHBvaW50cz0iMTUuNCw3LjQgMTQsNiA4LDEyIDE0LDE4IDE1LjQsMTYuNiAxMC44LDEyICIvPjwvZz48L3N2Zz4=\"></md-icon></span></div><div flex ng-if=\"!onePanel\" layout=\"column\" layout-align=\"center center\" class=\"hide-sm hide-xs show-gt-sm\"><span aria-label=\"Next Month\" ng-disabled=\"true\" aria-hidden=\"true\" class=\"md-icon-button md-button\"><md-icon></md-icon></span></div></div><div class=\"md-date-range-picker__week\" style=\"font-size: 0;\"><span class=\"md-date-range-picker__calendar__grid\" ng-repeat=\"day in days\">{{::day.name}}</span></div><div class=\"md-date-range-picker__calendar\"><span ng-repeat=\"date in dates\" class=\"md-date-range-picker__calendar__grid\" ng-class=\"{\\'md-date-range-picker__calendar__selected\\':inSelectedDateRange(date),\\'md-date-range-picker__calendar__start\\':isSelectedStartDate(date),\\'md-date-range-picker__calendar__end\\':isSelectedEndDate(date),\\'md-date-range-picker__calendar__not-in-active-month\\': !inCurrentMonth(date),\\'md-date-range-picker__calendar__today\\' : isToday(date),\\'md-date-range-picker__calendar__disabled\\': !isInMaxRange(date) || isDisabledDate({$date:date})}\" event-key=\"date1\" event-param=\"{{$index}}\"><span event-key=\"date1\" event-param=\"{{$index}}\" class=\"md-date-range-picker__calendar__selection\" ng-bind=\"{{::date.getDate()}}\"></span></span></div></div><div ng-show=\"!onePanel\" class=\"md-date-range-picker__calendar-wrapper hide-sm hide-xs show-gt-sm\"><div class=\"md-date-range-picker__month-year\" layout=\"row\" layout-align=\"center center\"><div flex layout=\"column\" layout-align=\"center center\" style=\"visibility: hidden\"><span aria-label=\"Previous Month\" class=\"md-button md-icon-button\" event-key=\"prev\"><md-icon md-svg-src=\"data:image/svg+xml;base64,PHN2ZyB2ZXJzaW9uPSIxLjEiIHg9IjBweCIgeT0iMHB4IiB2aWV3Qm94PSIwIDAgMjQgMjQiPjxnPjxwb2x5Z29uIHBvaW50cz0iMTUuNCw3LjQgMTQsNiA4LDEyIDE0LDE4IDE1LjQsMTYuNiAxMC44LDEyICIvPjwvZz48L3N2Zz4=\"></md-icon></span></div><md-select md-container-class=\"md-date-range-picker__select\" md-on-close=\"updateActiveDate(true)\" ng-model=\"activeMonth2\" placeholder=\"{{::getLocalizationVal(\\'Month\\')}}\" class=\"md-no-underline\"><md-option ng-value=\"::month.id\" ng-repeat=\"month in months\" ng-bind=\"::month.name\"></md-option></md-select><md-select md-container-class=\"md-date-range-picker__select\" md-on-close=\"updateActiveDate(true)\" ng-model=\"activeYear2\" placeholder=\"{{::getLocalizationVal(\\'Year\\')}}\" class=\"md-no-underline\"><md-option ng-value=\"::year.id\" ng-repeat=\"year in years\" ng-bind=\"::year.name\"></md-option></md-select><div flex layout=\"column\" layout-align=\"center center\"><span aria-label=\"Next Month\" class=\"md-icon-button md-button\" event-key=\"next\"><md-icon style=\"transform: rotate(-180deg)\" md-svg-src=\"data:image/svg+xml;base64,PHN2ZyB2ZXJzaW9uPSIxLjEiIHg9IjBweCIgeT0iMHB4IiB2aWV3Qm94PSIwIDAgMjQgMjQiPjxnPjxwb2x5Z29uIHBvaW50cz0iMTUuNCw3LjQgMTQsNiA4LDEyIDE0LDE4IDE1LjQsMTYuNiAxMC44LDEyICIvPjwvZz48L3N2Zz4=\"></md-icon></span></div></div><div class=\"md-date-range-picker__week\" style=\"font-size: 0;\" ng-if=\"!onePanel\"><span class=\"md-date-range-picker__calendar__grid\" ng-repeat=\"day in days\">{{::day.name}}</span></div><div class=\"md-date-range-picker__calendar\"><span ng-repeat=\"date in dates2\" class=\"md-date-range-picker__calendar__grid\" ng-class=\"{\\'md-date-range-picker__calendar__selected\\':inSelectedDateRange(date), \\'md-date-range-picker__calendar__start\\':isSelectedStartDate(date), \\'md-date-range-picker__calendar__end\\':isSelectedEndDate(date), \\'md-date-range-picker__calendar__not-in-active-month\\': !inCurrentMonth(date, true), \\'md-date-range-picker__calendar__today\\' : isToday(date),\\'md-date-range-picker__calendar__disabled\\': !isInMaxRange(date) || isDisabledDate({$date:date}) }\" event-key=\"date2\" event-param=\"{{$index}}\"><span event-key=\"date2\" event-param=\"{{$index}}\" class=\"md-date-range-picker__calendar__selection\" ng-bind=\"{{::date.getDate()}}\"></span></span></div></div></div><div class=\"md-date-range-picker__templates\" ng-if=\"showTemplate\"><div ng-if=\"!onePanel && !maxRange\" class=\"hide-xs hide-sm show-gt-sm\" layout=\"row\" layout-align=\"center center\" layout-wrap><div ng-repeat=\"(tmpltKey,tmpltName) in selectionTemplate\" class=\"md-button\" aria-label=\"{{::tmpltName}}\" ng-class=\"selectedTemplate === tmpltKey ? \\'md-primary md-raised\\' : \\'\\'\" event-key=\"{{tmpltKey}}\" ng-bind=\"::tmpltName\" flex=\"20\"></div><div ng-repeat=\"tmplt in customTemplates\" class=\"md-button\" aria-label=\"{{::tmplt.name}}\" ng-class=\"selectedTemplate === tmplt.name ? \\'md-primary md-raised\\' : \\'\\'\" ng-click=\"selectCustomRange(tmplt.name,tmplt)\" event-key=\"Custom Template\" ng-bind=\"::tmplt.name\" flex=\"20\"></div></div><div ng-if=\"!maxRange\" ng-class=\"{\\'hide-gt-sm\\':!onePanel}\" layout=\"column\" layout-padding><md-input-container><label>{{::getLocalizationVal(\\'Date Range Template\\')}}</label><md-select md-container-class=\"md-date-range-picker__select\" class=\"md-block\" placeholder=\"{{::getLocalizationVal(\\'Custom Date Range\\')}}\" ng-model=\"selectedTemplate\"><md-option value=\"\"></md-option><md-option ng-repeat=\"(tmpltKey,tmpltName) in selectionTemplate track by tmpltKey\" aria-label=\"{{::tmpltName}}\" ng-click=\"actionByKey(tmpltKey,null)\" ng-bind=\"::tmpltName\" value=\"{{tmpltKey}}\"></md-option><md-option ng-repeat=\"tmplt in customTemplates\" aria-label=\"{{::tmplt.name}}\" ng-click=\"selectCustomRange(tmplt.name,tmplt)\" ng-bind=\"::tmplt.name\" value=\"{{::tmplt.name}}\"></md-option></md-select></md-input-container></div></div></div></div>',\n            controller: 'mdDateRangePickerCtrl',\n            link: function (scope, element, attributes, ctrl) {\n                scope.actionByKey = function (eventKey, eventParam, e) {\n                    switch (eventKey) {\n                        case 'prev':\n                            scope.handleClickPrevMonth(e);\n                            scope.runIfNotInDigest();\n                            break;\n                        case 'next':\n                            scope.handleClickNextMonth(e);\n                            scope.runIfNotInDigest();\n                            break;\n                        case 'date1':\n                            if (scope.handleClickDate(e, scope.dates[eventParam])) {\n                                scope.runIfNotInDigest(scope.triggerChange);\n                            } else {\n                                scope.runIfNotInDigest();\n                            }\n                            break;\n                        case 'date2':\n                            if (scope.handleClickDate(e, scope.dates2[eventParam])) {\n                                scope.runIfNotInDigest(scope.triggerChange);\n                            } else {\n                                scope.runIfNotInDigest();\n                            }\n                            break;\n                        case 'TD':\n                            scope.handleClickSelectToday();\n                            scope.runIfNotInDigest(scope.triggerChange);\n                            break;\n                        case 'YD':\n                            scope.handleClickSelectYesterday();\n                            scope.runIfNotInDigest(scope.triggerChange);\n                            break;\n                        case 'TW':\n                            scope.handleClickSelectThisWeek();\n                            scope.runIfNotInDigest(scope.triggerChange);\n                            break;\n                        case 'LW':\n                            scope.handleClickSelectLastWeek();\n                            scope.runIfNotInDigest(scope.triggerChange);\n                            break;\n                        case 'TM':\n                            scope.handleClickSelectThisMonth();\n                            scope.runIfNotInDigest(scope.triggerChange);\n                            break;\n                        case 'LM':\n                            scope.handleClickSelectLastMonth();\n                            scope.runIfNotInDigest(scope.triggerChange);\n                            break;\n                        case 'TY':\n                            scope.handleClickSelectThisYear();\n                            scope.runIfNotInDigest(scope.triggerChange);\n                            break;\n                        case 'LY':\n                            scope.handleClickSelectLastYear();\n                            scope.runIfNotInDigest(scope.triggerChange);\n                            break;\n                        case 'Custom Template':\n                            scope.runIfNotInDigest(scope.triggerChange);\n                            break;\n                        default:\n                            break;\n                    }\n                }\n\n                scope.runIfNotInDigest = function (operation) {\n                    if (scope.$root != null && !scope.$root.$$phase) { // check if digest already in progress\n                        scope.$apply(); // launch digest;\n                        if (operation && typeof operation === 'function') {\n                            operation();\n                        }\n                    }\n                };\n                element.on('click', function (e) {\n                    var eventKey = e.target.getAttribute('event-key'),\n                        eventParam = e.target.getAttribute('event-param');\n                        scope.actionByKey(eventKey, eventParam, e);\n                });\n\n                scope.triggerChange = function triggerChange(e) {\n                    var $dates = $mdDateRangePicker.getSelectedDate(scope.dateStart, scope.dateEnd, scope.isDisabledDate, scope.maxRange); // All selected enabled dates\n                    if (scope.mdOnSelect) {\n                        scope.mdOnSelect({ $dates: $dates });\n                    }\n                };\n            }\n        };\n        return directive\n    }\n\n    mdDateRangePickerCtrl.$inject = ['$scope', '$filter'];\n    function mdDateRangePickerCtrl($scope, $filter) {\n        var ctrl = $scope, NUMBER_OF_MONTH_TO_DISPLAY = 2,\n            SELECTION_TEMPLATES = {\n                'TD': getLocalizationVal('Today'),\n                'YD': getLocalizationVal('Yesterday'),\n                'TW': getLocalizationVal('This Week'),\n                'LW': getLocalizationVal('Last Week'),\n                'TM': getLocalizationVal('This Month'),\n                'LM': getLocalizationVal('Last Month'),\n                'TY': getLocalizationVal('This Year'),\n                'LY': getLocalizationVal('Last Year')\n            }, START_OF_WEEK = 1\n        SELECTION_TEMPLATES_CUSTOM = {}\n            ;\n        $scope.isMenuContainer = false;\n        $scope.days = [];\n        $scope.label = 'Date range picker';\n        $scope.dates = [];\n        $scope.dates2 = [];\n        $scope.numberOfMonthToDisplay = 2;\n        $scope.today = new Date();\n        $scope.dateStart && $scope.dateStart.setHours(0, 0, 0, 0);\n        $scope.dateEnd && $scope.dateEnd.setHours(23, 59, 59, 999);\n        $scope.firstDayOfMonth = $scope.dateStart ? new Date($scope.dateStart.getFullYear(), $scope.dateStart.getMonth(), 1) : Date($scope.today.getFullYear(), $scope.today.getMonth(), 1);\n        $scope.lastDayOfMonth = $scope.dateStart ? new Date($scope.dateStart.getFullYear(), $scope.dateStart.getMonth() + 1, 0) : Date($scope.today.getFullYear(), $scope.today.getMonth() + 1, 0);\n        $scope.activeDate = $scope.dateStart || $scope.today;\n        $scope.activeDate2 = new Date($scope.activeDate.getFullYear(), $scope.activeDate.getMonth() + 1, 1);\n        $scope.activeMonth = $scope.activeDate.getMonth();\n        $scope.activeYear = $scope.activeDate.getFullYear();\n        $scope.activeMonth2 = $scope.activeDate2.getMonth();\n        $scope.activeYear2 = $scope.activeDate2.getFullYear();\n        $scope.months = [];\n        $scope.years = [];\n\n        $scope.inCurrentMonth = inCurrentMonth;\n        $scope.isToday = isToday;\n        $scope.handleClickDate = handleClickDate;\n        $scope.inSelectedDateRange = inSelectedDateRange;\n        $scope.isSelectedStartDate = isSelectedStartDate;\n        $scope.isSelectedEndDate = isSelectedEndDate;\n\n        $scope.updateActiveDate = updateActiveDate;\n        $scope.selectedDateText = selectedDateText;\n        $scope.focusToDate = focusToDate;\n\n        $scope.handleClickNextMonth = handleClickNextMonth;\n        $scope.handleClickPrevMonth = handleClickPrevMonth;\n\n        $scope.handleClickSelectToday = handleClickSelectToday;\n        $scope.handleClickSelectYesterday = handleClickSelectYesterday;\n        $scope.handleClickSelectThisWeek = handleClickSelectThisWeek;\n        $scope.handleClickSelectLastWeek = handleClickSelectLastWeek;\n        $scope.handleClickSelectThisMonth = handleClickSelectThisMonth;\n        $scope.handleClickSelectLastMonth = handleClickSelectLastMonth;\n        $scope.handleClickSelectThisYear = handleClickSelectThisYear;\n        $scope.handleClickSelectLastYear = handleClickSelectLastYear;\n\n        $scope.getLocalizationVal = getLocalizationVal;\n        $scope.selectCustomRange = selectCustomRange;\n        $scope.isInMaxRange = isInMaxRange;\n        $scope.selectionTemplate = {};\n\n        init();\n\n        function init() {\n            var mctr = 0;\n            var currTmpl;\n\n            /** \n             * add custom template to local custom template array \n            */\n            if ($scope.customTemplates != null) {\n                for (var i = 0; i < $scope.customTemplates.length; i++) {\n                    currTmpl = $scope.customTemplates[i];\n                    SELECTION_TEMPLATES_CUSTOM[currTmpl.name] = currTmpl;\n                }\n            }\n            if ($scope.selectedTemplate) {\n                switch ($scope.selectedTemplate) {\n                    case 'TD':\n                        $scope.handleClickSelectToday();\n                        break;\n                    case 'YD':\n                        $scope.handleClickSelectYesterday();\n                        break;\n                    case 'TW':\n                        $scope.handleClickSelectThisWeek();\n                        break;\n                    case 'LW':\n                        $scope.handleClickSelectLastWeek();\n                        break;\n                    case 'TM':\n                        $scope.handleClickSelectThisMonth();\n                        break;\n                    case 'LM':\n                        $scope.handleClickSelectLastMonth();\n                        break;\n                    case 'TY':\n                        $scope.handleClickSelectThisYear();\n                        break;\n                    case 'LY':\n                        $scope.handleClickSelectLastYear();\n                        break;\n                    default:\n                        if (SELECTION_TEMPLATES_CUSTOM && SELECTION_TEMPLATES_CUSTOM[$scope.selectedTemplate] && SELECTION_TEMPLATES_CUSTOM[$scope.selectedTemplate].dateStart && SELECTION_TEMPLATES_CUSTOM[$scope.selectedTemplate].dateEnd) {\n                            $scope.dateStart = SELECTION_TEMPLATES_CUSTOM[$scope.selectedTemplate].dateStart;\n                            $scope.dateEnd = SELECTION_TEMPLATES_CUSTOM[$scope.selectedTemplate].dateEnd;\n                        }\n                        $scope.selectedTemplateName = $scope.selectedDateText();\n                        break;\n                }\n                $scope.updateActiveDate();\n            } else {\n                $scope.selectedTemplate = '';\n                $scope.selectedTemplateName = $scope.selectedDateText();\n                $scope.updateActiveDate();\n            }\n\n            $scope.$watch('selectedTemplate', function (next, prev) {\n                if (next !== prev && $scope.dateStart && !$scope.inCurrentMonth($scope.dateStart) && !$scope.inCurrentMonth($scope.dateStart, true)) {\n                    $scope.focusToDate($scope.dateStart);\n                }\n            });\n            $scope.$watch('dateStart', function (next, prev) {\n                if (next !== prev && $scope.dateStart && $scope.autoFocusDateStart !== false && !$scope.inCurrentMonth($scope.dateStart) && !$scope.inCurrentMonth($scope.dateStart, true)) {\n                    $scope.focusToDate($scope.dateStart);\n                }\n            });\n\n            /**\n             * Generate Days of Week Names\n             * Fact: January 1st of 2017 is Sunday\n             */\n            var w = new Date(2017, 0, 1);\n            $scope.days = [];\n            for (mctr = 0; mctr < 7; mctr++) {\n                //add $scope.firstDayOfWeek to set the first Day of week e.g. -1 = Sunday, 0 = Monday \n                w.setDate(mctr + 1 + getFirstDayOfWeek());\n                $scope.days.push({ id: mctr, name: getLocalizationVal($filter('date')(w, 'EEE')) });\n            }\n            /**\n             * Generate Month Names, Might depend on localization\n            */\n            var m = null;\n            $scope.months = [];\n            for (mctr = 0; mctr < 12; mctr++) {\n                m = new Date(2017, mctr, 1);\n                $scope.months.push({ id: mctr, name: getLocalizationVal($filter('date')(m, 'MMMM')) });\n            }\n            /**\n             * Generate Year Selection\n            */\n            var y = $scope.activeYear, yctr = 0;\n            $scope.years = [];\n            for (yctr = y - 10; yctr < y + 10; yctr++) {\n                $scope.years.push({ id: yctr, name: getLocalizationVal(yctr) })\n            }\n\n            /**\n             * get the templates to use \n            */\n            for (var tmplKey in SELECTION_TEMPLATES) {\n                if (SELECTION_TEMPLATES.hasOwnProperty(tmplKey)) {\n                    //check if we have disable templates property \n                    if ($scope.disableTemplates != null && $scope.disableTemplates != '') {\n                        //if key is not exist in disableTemplates property add it\n                        if ($scope.disableTemplates.indexOf(tmplKey) < 0) {\n                            $scope.selectionTemplate[tmplKey] = SELECTION_TEMPLATES[tmplKey];\n                        }\n                    } else {\n                        $scope.selectionTemplate[tmplKey] = SELECTION_TEMPLATES[tmplKey];\n                    }\n\n                }\n            }\n\n\n        }\n\n        function selectCustomRange(tmpltKey, tmpltObj) {\n            $scope.dateStart = tmpltObj.dateStart;\n            $scope.dateEnd = tmpltObj.dateEnd;\n            $scope.selectedTemplate = tmpltKey;\n            $scope.selectedTemplateName = $scope.selectedDateText();\n        }\n        function getLocalizationVal(val) {\n            var ret = null;\n            if ($scope.localizationMap != null && $scope.localizationMap[val] != null) {\n                ret = $scope.localizationMap[val];\n            } else {\n                ret = val;\n            }\n            return ret;\n        }\n\n        function getFirstDayOfWeek() {\n            if ([undefined, null, '', NaN].indexOf($scope.firstDayOfWeek) !== -1 || [0, 1, 2, 3, 4, 5, 6].indexOf($scope.firstDayOfWeek) === -1) {\n                return START_OF_WEEK;\n            }\n            return $scope.firstDayOfWeek;\n        }\n        /**\n         * Fill the Calendar Dates\n         */\n        function fillDateGrid(currentDate) {\n\n            var dates = [],\n                monthStartDate = new Date(currentDate.getFullYear(), currentDate.getMonth(), 1),\n                monthEndDate = new Date(currentDate.getFullYear(), currentDate.getMonth() + 1, 0),\n                firstDay = getFirstDayOfWeek(),\n                ctr, day;\n\n            for (ctr = 1; ctr <= monthEndDate.getDate(); ctr++) {\n                dates.push(new Date(currentDate.getFullYear(), currentDate.getMonth(), ctr));\n            }\n\n            day = dates[0].getDay();\n            ctr = 0;\n            while (day !== firstDay) {\n                dates.unshift(new Date(currentDate.getFullYear(), currentDate.getMonth(), ctr));\n                day = day <= 0 ? 6 : day - 1;\n                ctr--;\n            }\n\n            day = (dates[dates.length - 1].getDay() + 1) % 7;\n            ctr = 1;\n            while (day !== firstDay) {\n                dates.push(new Date(currentDate.getFullYear(), currentDate.getMonth() + 1, ctr));\n                day = (day + 1) % 7;\n                ctr++\n            }\n            return dates;\n        }\n\n        /**\n         * Diff 2 Dates by Day Differences\n         * date1 < date2 return positive integer\n         * date1 = date2 return 0\n         * date1 > date2 return negative integer\n         */\n        function getDateDiff(date1, date2) {\n            if (!date1 || !date2) return;\n            var _d1 = new Date(date1.getFullYear(), date1.getMonth(), date1.getDate()),\n                _d2 = new Date(date2.getFullYear(), date2.getMonth(), date2.getDate());\n            return _d2 - _d1;\n        }\n\n        /**\n         * return Day Name in a week\n         */\n        function getDayName(day) {\n            var weekday = new Array(7), div = getFirstDayOfWeek();\n            weekday[0] = \"Sun\";\n            weekday[1] = \"Mon\";\n            weekday[2] = \"Tue\";\n            weekday[3] = \"Wed\";\n            weekday[4] = \"Thu\";\n            weekday[5] = \"Fri\";\n            weekday[6] = \"Sat\";\n            return weekday[day + div % 7];\n        }\n\n        /**\n         * Events\n         */\n\n        function inCurrentMonth(date, isSecondMonth) {\n            return !isSecondMonth ?\n                date.getMonth() === $scope.activeMonth && date.getFullYear() === $scope.activeYear :\n                date.getMonth() === $scope.activeMonth2 && date.getFullYear() === $scope.activeYear2;\n        }\n\n        function isInMaxRange(date) {\n            if (!$scope.dateStart) return true;\n            if (getDateDiff($scope.dateStart, $scope.dateEnd) !== 0) return true;\n            var diff = getDateDiff($scope.dateStart, date);\n            return ($scope.maxRange && Math.abs(Math.ceil(diff / (1000 * 3600 * 24))) + 1 <= $scope.maxRange || !$scope.maxRange);\n        }\n\n        function handleClickDate($event, date) {\n            var changed = false;\n            var shouldConfirm = false;\n            if (getDateDiff($scope.dateStart, $scope.dateEnd) === 0) {\n                if (getDateDiff($scope.dateStart, date) === 0) {\n                    shouldConfirm = true;\n                    changed = true;\n                } else if (!$scope.isDisabledDate || !$scope.isDisabledDate({ $date: date })) {\n                    var diff = getDateDiff($scope.dateStart, date);\n                    if (diff > 0) {\n                        // Check if maxRange\n                        if ($scope.maxRange && Math.abs(Math.ceil(diff / (1000 * 3600 * 24))) + 1 <= $scope.maxRange || !$scope.maxRange) {\n                            $scope.dateEnd = date;\n                            shouldConfirm = true;\n                            changed = true;\n                        }\n                    } else {\n                        // Check if maxRange\n                        if ($scope.maxRange && Math.abs(Math.ceil(diff / (1000 * 3600 * 24))) + 1 <= $scope.maxRange || !$scope.maxRange) {\n                            $scope.dateStart = date;\n                            shouldConfirm = true;\n                            changed = true;\n                        }\n                    }\n                }\n            } else {\n                if (!$scope.isDisabledDate || !$scope.isDisabledDate({ $date: date })) {\n                    $scope.dateStart = date;\n                    $scope.dateEnd = date;\n                    changed = true;\n                }\n            }\n            if (changed) {\n                $scope.selectedTemplate = false;\n                $scope.selectedTemplateName = $scope.selectedDateText();\n            }\n            return shouldConfirm;\n        }\n\n        function inSelectedDateRange(date) {\n            return $scope.dateStart && $scope.dateEnd\n                ? getDateDiff($scope.dateStart, date) >= 0 && 0 <= getDateDiff(date, $scope.dateEnd)\n                : false;\n        }\n\n        function updateActiveDate(isSecondMonth) {\n            var d = new Date($scope.activeYear, $scope.activeMonth, 1),\n                d2 = new Date($scope.activeYear2, $scope.activeMonth2, 1);\n            if (isSecondMonth) {\n                d = new Date($scope.activeYear2, $scope.activeMonth2 - 1, 1);\n                $scope.activeYear = d.getFullYear();\n                $scope.activeMonth = d.getMonth();\n            } else {\n                d2 = new Date($scope.activeYear, $scope.activeMonth + 1, 1);\n                $scope.activeYear2 = d2.getFullYear();\n                $scope.activeMonth2 = d2.getMonth();\n            }\n            $scope.focusToDate(d);\n        }\n\n        function handleClickNextMonth($event) {\n            var d = new Date($scope.activeDate.getFullYear(), $scope.activeDate.getMonth() + 1, 1);\n            $scope.focusToDate(d);\n        }\n\n        function handleClickPrevMonth($event) {\n            var d = new Date($scope.activeDate.getFullYear(), $scope.activeDate.getMonth() - 1, 1);\n            $scope.focusToDate(d);\n        }\n\n        function handleClickSelectToday() {\n            var d = new Date(), d1 = new Date(d.getFullYear(), d.getMonth(), d.getDate());\n\n            $scope.dateStart = d1;\n            $scope.dateEnd = d;\n            $scope.selectedTemplate = 'TD';\n            $scope.selectedTemplateName = $scope.selectedDateText();\n            //$scope.focusToDate(d);\n        }\n\n        function handleClickSelectYesterday() {\n            var d = new Date(), d1 = new Date(d.getFullYear(), d.getMonth(), d.getDate() - 1), \n            d2 = new Date(d.getFullYear(), d.getMonth(), d.getDate() - 1);\n\n            $scope.dateStart = d1;\n            $scope.dateEnd = d2;\n            $scope.selectedTemplate = 'YD';\n            $scope.selectedTemplateName = $scope.selectedDateText();\n            //$scope.focusToDate(d);\n        }\n\n\n        function handleClickSelectThisWeek() {\n            var p = new Date(),\n                d = new Date(p.getFullYear(), p.getMonth(), p.getDate()),\n                d1 = new Date(d.getFullYear(), d.getMonth(), d.getDate() - (d.getDay() - getFirstDayOfWeek())),\n                d2 = new Date(d.getFullYear(), d.getMonth(), d.getDate() + (6 - d.getDay() + getFirstDayOfWeek()));\n\n            $scope.dateStart = d1;\n            $scope.dateEnd = d2;\n            $scope.selectedTemplate = 'TW';\n            $scope.selectedTemplateName = $scope.selectedDateText();\n            //$scope.focusToDate(d);\n        }\n\n        function handleClickSelectLastWeek() {\n            var p = new Date(),\n                d = new Date(p.getFullYear(), p.getMonth(), p.getDate() - 7),\n                d1 = new Date(d.getFullYear(), d.getMonth(), d.getDate() - (d.getDay() - getFirstDayOfWeek())),\n                d2 = new Date(d.getFullYear(), d.getMonth(), d.getDate() + (6 - d.getDay() + getFirstDayOfWeek()));\n\n            $scope.dateStart = d1;\n            $scope.dateEnd = d2;\n            $scope.selectedTemplate = 'LW';\n            $scope.selectedTemplateName = $scope.selectedDateText();\n            //$scope.focusToDate(d);\n        }\n\n\n        function handleClickSelectThisMonth() {\n            var d = new Date(),\n                d1 = new Date(d.getFullYear(), d.getMonth(), 1),\n                d2 = new Date(d.getFullYear(), d.getMonth() + 1, 0);\n\n            $scope.dateStart = d1;\n            $scope.dateEnd = d2;\n            $scope.selectedTemplate = 'TM';\n            $scope.selectedTemplateName = $scope.selectedDateText();\n            //$scope.focusToDate(d);\n        }\n\n        function handleClickSelectLastMonth() {\n            var p = new Date(),\n                d = new Date(p.getFullYear(), p.getMonth(), 0),\n                d1 = new Date(d.getFullYear(), d.getMonth(), 1),\n                d2 = new Date(d.getFullYear(), d.getMonth() + 1, 0);\n\n            $scope.dateStart = d1;\n            $scope.dateEnd = d2;\n            $scope.selectedTemplate = 'LM';\n            $scope.selectedTemplateName = $scope.selectedDateText();\n            //$scope.focusToDate(d);\n        }\n\n        function handleClickSelectThisYear() {\n            var d = new Date(),\n                d1 = new Date(d.getFullYear(), 0, 1),\n                d2 = new Date(d.getFullYear(), 11, 31);\n\n            $scope.dateStart = d1;\n            $scope.dateEnd = d2;\n            $scope.selectedTemplate = 'TY';\n            $scope.selectedTemplateName = $scope.selectedDateText();\n            //$scope.focusToDate(d1);\n        }\n\n        function handleClickSelectLastYear() {\n            var d = new Date(),\n                d1 = new Date(d.getFullYear() - 1, 0, 1),\n                d2 = new Date(d.getFullYear() - 1, 11, 31);\n\n            $scope.dateStart = d1;\n            $scope.dateEnd = d2;\n            $scope.selectedTemplate = 'LY';\n            $scope.selectedTemplateName = $scope.selectedDateText();\n            //$scope.focusToDate(d1);\n        }\n\n        function isSelectedStartDate(date) {\n            return getDateDiff($scope.dateStart, date) === 0;\n        }\n\n        function isSelectedEndDate(date) {\n            return getDateDiff($scope.dateEnd, date) === 0;\n        }\n\n        function isToday(date) {\n            return getDateDiff(date, new Date()) === 0;\n        }\n\n        function selectedDateText() {\n            if ($scope.format && typeof $scope.format === 'function') {\n                return $scope.format($scope.dateStart, $scope.dateEnd, $scope.selectedTemplate, $scope.selectedTemplateName);\n            } else if (!$scope.dateStart || !$scope.dateEnd) {\n                return '';\n            } else if (!$scope.selectedTemplate) {\n                if (getDateDiff($scope.dateStart, $scope.dateEnd) === 0) {\n                    return $filter('date')($scope.dateStart, 'dd MMM yyyy');\n                } else {\n                    return $filter('date')(\n                        $scope.dateStart,\n                        'dd' + ($scope.dateStart.getMonth() !== $scope.dateEnd.getMonth() || $scope.dateStart.getFullYear() !== $scope.dateEnd.getFullYear() ? ' MMM' : '') + ($scope.dateStart.getFullYear() !== $scope.dateEnd.getFullYear() ? ' yyyy' : '')\n                    ) + ' - ' +\n                        $filter('date')(\n                            $scope.dateEnd,\n                            'dd MMM yyyy'\n                        );\n                }\n            } else if (SELECTION_TEMPLATES_CUSTOM != null && SELECTION_TEMPLATES_CUSTOM[$scope.selectedTemplate] != null) {\n                return SELECTION_TEMPLATES_CUSTOM[$scope.selectedTemplate].name;\n            } else {\n                return SELECTION_TEMPLATES[$scope.selectedTemplate];\n            }\n        }\n\n        function focusToDate(d) {\n            var d2 = new Date(d.getFullYear(), d.getMonth() + 1, 1);\n            $scope.activeDate = d;\n            $scope.activeMonth = d.getMonth();\n            $scope.activeYear = d.getFullYear();\n\n            $scope.activeDate2 = d2;\n            $scope.activeMonth2 = d2.getMonth();\n            $scope.activeYear2 = d2.getFullYear();\n\n            $scope.dates = fillDateGrid(d);\n            $scope.dates2 = fillDateGrid(d2);\n        }\n    }\n\n    function mdDateRangeDirective() {\n        return {\n            scope: {\n                ngModel: '=ngModel',\n                autoConfirm: '=autoConfirm',\n                ngDisabled: '=ngDisabled',\n                showTemplate: '=',\n                placeholder: '@',\n                isDisabledDate: '&',\n                localizationMap: '=?',\n                customTemplates: '=?',\n                disableTemplates: '@',\n                mdOnSelect: '&',\n                onePanel: '=?',\n                format: '=?',\n                maxRange: '=?',\n                firstDayOfWeek: '=?'\n            },\n            template: ['<md-menu ng-disabled=\"ngDisabled\">',\n                '<span class=\"md-select-value\" ng-click=\"!ngDisabled && (($mdMenu && $mdMenu.open) ? $mdMenu.open($event) : $mdOpenMenu($event))\">',\n                '  <span>{{ngModel.selectedTemplateName || placeholder}}</span>',\n                '  <span class=\"md-select-icon\" aria-hidden=\"true\"></span>',\n                '</span>',\n                '<md-menu-content class=\"md-custom-menu-content\" style=\"max-height: none!important; height: auto!important; padding: 0!important;\">',\n                '    <span style=\"text-align: left; padding: 12px 20px 0 20px\" disabled>{{ngModel.selectedTemplateName || placeholder}}</span>',\n                '    <md-date-range-picker first-day-of-week=\"firstDayOfWeek\" ',\n                '     md-on-select=\"autoConfirm && ok($dates)\" ',\n                '     date-start=\"ngModel.dateStart\" ',\n                '     date-end=\"ngModel.dateEnd\" ',\n                '     selected-template=\"ngModel.selectedTemplate\" ',\n                '     show-template=\"showTemplate\" ',\n                '     localization-map=\"localizationMap\" ',\n                '     custom-templates=\"customTemplates\" ',\n                '     disable-templates=\"{{disableTemplates}}\" ',\n                '     is-disabled-date=\"isDisabledDate({ $date: $date })\" ',\n                '     max-range=\"maxRange\" ',\n                '     one-panel=\"onePanel\" ',\n                '     format=\"format\" ',\n                '     selected-template-name=\"ngModel.selectedTemplateName\"></md-date-range-picker>',\n                '<p ng-if=\"!autoConfirm\" layout=\"row\" layout-align=\"end center\">',\n                '<md-button ng-if=\"ngModel.showClear\" class=\"md-raised\" ng-click=\"clear()\">{{getLocalizationVal(\"Clear\")}}</md-button>',\n                '<md-button class=\"md-raised md-primary\" ng-click=\"ok()\">{{getLocalizationVal(\"Ok\")}}</md-button>',\n                '</p>',\n                '</md-menu-content>',\n                '</md-menu>'].join(''),\n            controller: ['$scope', '$mdMenu', function ($scope, $mdMenu) {\n                $scope.ok = function ok($dates) {\n                    $scope.mdOnSelect({ $dates: $dates });\n                    $mdMenu.hide();\n                }\n                $scope.clear = function clear() {\n                    $scope.ngModel.selectedTemplateName = '';\n                    $scope.ngModel.selectedTemplate = null;\n                    $scope.ngModel.dateStart = null;\n                    $scope.ngModel.dateEnd = null;\n                }\n                $scope.getLocalizationVal = function getLocalizationVal(val) {\n                    var ret = null;\n                    if ($scope.ngModel && $scope.ngModel.localizationMap != null && $scope.ngModel.localizationMap[val] != null) {\n                        ret = $scope.ngModel.localizationMap[val];\n                    } else {\n                        ret = val;\n                    }\n                    return ret;\n                }\n            }]\n        };\n    }\n\n    mdDateRangePickerService.$inject = ['$mdDialog'];\n    function mdDateRangePickerService($mdDialog) {\n        var service = this;\n\n        service.show = show;\n        service.getSelectedDate = getSelectedDate;\n\n        /**\n         * @description returns all seleced date based on mmodel, filters and max range\n         * @param {*} model \n         * @param {*} isDisabledDateCallback \n         * @param {*} maxRange \n         */\n        function getSelectedDate(dateStart, dateEnd, isDisabledDateCallback, maxRange) {\n            var dates = [];\n            var limit = dateEnd.getTime();\n            var date = dateStart;\n            var ctr = 0;\n            var y = dateStart.getFullYear();\n            var m = dateStart.getMonth();\n            var d = dateStart.getDate();\n            while (date.getTime() <= limit) {\n                if (isDisabledDateCallback && !isDisabledDateCallback({ $date: date })) {\n                    dates.push(date);\n                }\n                ctr++;\n                date = new Date(y, m, d + ctr);\n                if (ctr > (maxRange || 10000)) break; // break on 10,000\n            }\n            return dates;\n        }\n\n        function show(config) {\n            return $mdDialog.show({\n                locals: {\n                    mdDateRangePickerServiceModel: angular.copy(config.model),\n                    mdDateRangePickerServiceConfig: angular.copy(config),\n                },\n                controller: ['$scope', 'mdDateRangePickerServiceModel', 'mdDateRangePickerServiceConfig', function ($scope, mdDateRangePickerServiceModel, mdDateRangePickerServiceConfig) {\n                    $scope.model = mdDateRangePickerServiceModel || {};\n                    $scope.config = mdDateRangePickerServiceConfig || {};\n                    $scope.model.selectedTemplateName = $scope.model.selectedTemplateName || '';\n                    $scope.ok = function () {\n                        $scope.model.dateStart && $scope.model.dateStart.setHours(0, 0, 0, 0);\n                        $scope.model.dateEnd && $scope.model.dateEnd.setHours(23, 59, 59, 999);\n                        $mdDialog.hide($scope.model);\n                    }\n                    $scope.cancel = function () {\n                        $mdDialog.cancel();\n                    }\n                    $scope.clear = function clear() {\n                        $scope.model.selectedTemplateName = '';\n                        $scope.model.selectedTemplate = null;\n                        $scope.model.dateStart = null;\n                        $scope.model.dateEnd = null;\n                    }\n                    $scope.handleOnSelect = function ($dates) {\n                        if (typeof $scope.config.mdOnSelect === 'function') {\n                            $scope.config.mdOnSelect($dates);\n                        }\n                        if ($scope.config.autoConfirm) {\n                            $scope.ok();\n                        }\n                    }\n                    $scope.getLocalizationVal = function getLocalizationVal(val) {\n                        var ret = null;\n                        if ($scope.model && $scope.model.localizationMap != null && $scope.model.localizationMap[val] != null) {\n                            ret = $scope.model.localizationMap[val];\n                        } else {\n                            ret = val;\n                        }\n                        return ret;\n                    }\n                    if ($scope.model.customTemplates) console.warn('model.customTemplates will be removed from model on next rlease, please use root config e.g. $mdDateRangePicker.show({customTemplates}) instead');\n                    if ($scope.model.localizationMap) console.warn('model.localizationMap will be removed from model on next rlease, please use root config e.g. $mdDateRangePicker.show({localizationMap}) instead');\n                    if ($scope.model.firstDayOfWeek) console.warn('model.firstDayOfWeek will be removed from model on next rlease, please use root config e.g. $mdDateRangePicker.show({firstDayOfWeek}) instead');\n                    if ($scope.model.showTemplate) console.warn('model.showTemplate will be removed from model on next rlease, please use root config e.g. $mdDateRangePicker.show({showTemplate}) instead');\n                    if ($scope.model.maxRange) console.warn('model.maxRange will be removed from model on next rlease, please use root config e.g. $mdDateRangePicker.show({maxRange}) instead');\n                    if ($scope.model.onePanel) console.warn('model.onePanel will be removed from model on next rlease, please use root config e.g. $mdDateRangePicker.show({onePanel}) instead');\n                    if ($scope.model.isDisabledDate) console.warn('model.isDisabledDate({ $date: $date }) will be removed from model on next rlease, please use root config e.g. $mdDateRangePicker.show({isDisabledDate:($date)=>{}}) instead');\n\n                }],\n                template: ['<md-dialog aria-label=\"Date Range Picker\">',\n                    '<md-toolbar class=\"md-primary\" layout=\"row\" layout-align=\"start center\">',\n                    '<md-button aria-label=\"Date Range Picker\" class=\"md-icon-button\" aria-hidden=\"true\" ng-disabled=\"true\">',\n                    '<md-icon md-svg-icon=\"data:image/svg+xml;base64,PHN2ZyBmaWxsPSIjRkZGRkZGIiBoZWlnaHQ9IjI0IiB2aWV3Qm94PSIwIDAgMjQgMjQiIHdpZHRoPSIyNCIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIj4KICAgIDxwYXRoIGQ9Ik05IDExSDd2Mmgydi0yem00IDBoLTJ2Mmgydi0yem00IDBoLTJ2Mmgydi0yem0yLTdoLTFWMmgtMnYySDhWMkg2djJINWMtMS4xMSAwLTEuOTkuOS0xLjk5IDJMMyAyMGMwIDEuMS44OSAyIDIgMmgxNGMxLjEgMCAyLS45IDItMlY2YzAtMS4xLS45LTItMi0yem0wIDE2SDVWOWgxNHYxMXoiLz4KICAgIDxwYXRoIGQ9Ik0wIDBoMjR2MjRIMHoiIGZpbGw9Im5vbmUiLz4KPC9zdmc+\"></md-icon>',\n                    '</md-button>',\n                    '<span md-truncate class=\"md-toolbar-tools\">{{model.selectedTemplateName}}</span>',\n                    '</md-toolbar>',\n                    '<md-dialog-content>',\n                    '<md-date-range-picker ',\n                    'date-start=\"model.dateStart\" ',\n                    'date-end=\"model.dateEnd\" ',\n                    'show-template=\"config.showTemplate || model.showTemplate\" ',\n                    'selected-template=\"model.selectedTemplate\" ',\n                    'selected-template-name=\"model.selectedTemplateName\" ',\n                    'first-day-of-week=\"config.firstDayOfWeek || model.firstDayOfWeek\" ',\n                    'localization-map=\"config.localizationMap || model.localizationMap\" ',\n                    'custom-templates=\"config.customTemplates || model.customTemplates\" ',\n                    'format=\"config.format\" ',\n                    'disable-templates=\"{{model.disableTemplates}}\" ',\n                    'md-on-select=\"handleOnSelect($dates)\" ',\n                    'is-disabled-date=\"config.isDisabledDate ? config.isDisabledDate($date) : model.isDisabledDate({ $date: $date })\" ',\n                    'max-range=\"config.maxRange || model.maxRange\" ',\n                    'one-panel=\"config.onePanel || model.onePanel\" ',\n                    '>',\n                    '</md-date-range-picker>',\n                    '</md-dialog-content>',\n                    '<md-dialog-actions layout=\"row\" layout-align=\"end center\">',\n                    '<md-button ng-click=\"cancel()\">{{getLocalizationVal(\"Cancel\")}}</md-button>',\n                    '<md-button ng-if=\"!config.autoConfirm\" class=\"md-raised\" ng-click=\"clear()\">{{getLocalizationVal(\"Clear\")}}</md-button>',\n                    '<md-button ng-if=\"!config.autoConfirm\" class=\"md-raised md-primary\" ng-click=\"ok()\">{{getLocalizationVal(\"Ok\")}}</md-button>',\n                    '</md-dialog-actions>',\n                    '</md-dialog>'].join(''),\n                parent: angular.element(document.body),\n                multiple: config.multiple,\n                targetEvent: config.targetEvent || document.body,\n                clickOutsideToClose: true,\n                fullscreen: config.model.fullscreen\n            });\n        }\n    }\n\n}(window, angular));\n\n/**\n * Angular Google Analytics - Easy tracking for your AngularJS application\n * @version v1.1.8 - 2016-12-30\n * @link http://github.com/revolunet/angular-google-analytics\n * @author Julien Bouquillon <julien@revolunet.com> (https://github.com/revolunet)\n * @contributors Julien Bouquillon (https://github.com/revolunet),Justin Saunders (https://github.com/justinsa),Chris Esplin (https://github.com/deltaepsilon),Adam Misiorny (https://github.com/adam187)\n * @license MIT License, http://www.opensource.org/licenses/MIT\n */\n!function(a,b){\"use strict\";\"undefined\"!=typeof module&&module.exports?(b(\"undefined\"==typeof angular?require(\"angular\"):angular),module.exports=\"angular-google-analytics\"):\"function\"==typeof define&&define.amd?define([\"angular\"],b):b(a.angular)}(this,function(a,b){\"use strict\";return a.module(\"angular-google-analytics\",[]).provider(\"Analytics\",function(){var c,d,e,f,g,h=!0,i=\"auto\",j=!1,k=!1,l=\"USD\",m=!1,n=!1,o=!1,p=!1,q=!1,r=!1,s=!1,t=!1,u=!1,v=!1,w=!1,x=\"$routeChangeSuccess\",y=!1,z=!1,A=!1,B=\"\",C=!0,D=!1;this.log=[],this.offlineQueue=[],this.setAccount=function(d){return c=a.isUndefined(d)||d===!1?b:a.isArray(d)?d:a.isObject(d)?[d]:[{tracker:d,trackEvent:!0}],this},this.trackPages=function(a){return C=!!a,this},this.trackPrefix=function(a){return B=a,this},this.setDomainName=function(a){return e=a,this},this.useDisplayFeatures=function(a){return o=!!a,this},this.useAnalytics=function(a){return h=!!a,this},this.useEnhancedLinkAttribution=function(a){return s=!!a,this},this.useCrossDomainLinker=function(a){return k=!!a,this},this.setCrossLinkDomains=function(a){return d=a,this},this.setPageEvent=function(a){return x=a,this},this.setCookieConfig=function(a){return i=a,this},this.useECommerce=function(a,b){return q=!!a,r=!!b,this},this.setCurrency=function(a){return l=a,this},this.setRemoveRegExp=function(a){return a instanceof RegExp&&(g=a),this},this.setExperimentId=function(a){return f=a,this},this.ignoreFirstPageLoad=function(a){return t=!!a,this},this.trackUrlParams=function(a){return D=!!a,this},this.disableAnalytics=function(a){return p=!!a,this},this.setHybridMobileSupport=function(a){return v=!!a,this},this.startOffline=function(a){return w=!!a,w===!0&&this.delayScriptTag(!0),this},this.delayScriptTag=function(a){return n=!!a,this},this.logAllCalls=function(a){return u=!!a,this},this.enterTestMode=function(){return z=!0,this},this.enterDebugMode=function(a){return m=!0,A=!!a,this},this.readFromRoute=function(a){return y=!!a,this},this.$get=[\"$document\",\"$location\",\"$log\",\"$rootScope\",\"$window\",\"$injector\",function(E,F,G,H,I,J){var K=this,L=function(b,c){return a.isObject(c)&&a.isDefined(c[b])},M=function(a,b,c){return L(a,b)&&b[a]===c},N=function(b,c){return a.isString(c)?c+\".\"+b:L(\"name\",c)?c.name+\".\"+b:b},O={};y&&(J.has(\"$route\")?O=J.get(\"$route\"):G.warn(\"$route service is not available. Make sure you have included ng-route in your application dependencies.\"));var P=function(){if(y&&O.current&&\"pageTrack\"in O.current)return O.current.pageTrack;var a=D?F.url():F.path();return g?a.replace(g,\"\"):a},Q=function(){var b={utm_source:\"campaignSource\",utm_medium:\"campaignMedium\",utm_term:\"campaignTerm\",utm_content:\"campaignContent\",utm_campaign:\"campaignName\"},c={};return a.forEach(F.search(),function(d,e){var f=b[e];a.isDefined(f)&&(c[f]=d)}),c},R=function(a,b,c,d,e,f,g,h,i){var j={};return a&&(j.id=a),b&&(j.affiliation=b),c&&(j.revenue=c),d&&(j.tax=d),e&&(j.shipping=e),f&&(j.coupon=f),g&&(j.list=g),h&&(j.step=h),i&&(j.option=i),j},S=function(b,c){var d=\"\",e=\"https:\"===document.location.protocol,f=\"chrome-extension:\"===document.location.protocol,g=h===!0&&v===!0;return b=a.isString(b)?b:\"\",c=a.isString(c)?c:\"\",\"\"!==b&&(d=\"http:\"+b),(f||g||e&&\"\"!==c)&&(d=\"https:\"+c),d},T=function(a){!h&&I._gaq&&\"function\"==typeof a&&a()},U=function(){var a=Array.prototype.slice.call(arguments);return w===!0?void K.offlineQueue.push([U,a]):(I._gaq||(I._gaq=[]),u===!0&&K._log.apply(K,a),void I._gaq.push(a))},V=function(a){h&&I.ga&&\"function\"==typeof a&&a()},W=function(){var a=Array.prototype.slice.call(arguments);return w===!0?void K.offlineQueue.push([W,a]):\"function\"!=typeof I.ga?void K._log(\"warn\",\"ga function not set on window\"):(u===!0&&K._log.apply(K,a),void I.ga.apply(null,a))},X=function(a){var b=Array.prototype.slice.call(arguments,1),d=b[0],e=[];return\"function\"==typeof a?c.forEach(function(b){a(b)&&e.push(b)}):e=c,0===e.length?void W.apply(K,b):void e.forEach(function(a){L(\"select\",a)&&\"function\"==typeof a.select&&!a.select(b)||(b[0]=N(d,a),W.apply(K,b))})};return this._log=function(){var a=Array.prototype.slice.call(arguments);if(a.length>0){if(a.length>1)switch(a[0]){case\"debug\":case\"error\":case\"info\":case\"log\":case\"warn\":G[a[0]](a.slice(1))}K.log.push(a)}},this._createScriptTag=function(){K._registerScriptTags(),K._registerTrackers()},this._createAnalyticsScriptTag=function(){K._registerScriptTags(),K._registerTrackers()},this._registerScriptTags=function(){var a,b=E[0],d=S();if(j===!0)return void K._log(\"warn\",\"Script tags already created\");if(p===!0&&c.forEach(function(a){K._log(\"info\",\"Analytics disabled: \"+a.tracker),I[\"ga-disable-\"+a.tracker]=!0}),h===!0){if(a=d+\"//www.google-analytics.com/\"+(m?\"analytics_debug.js\":\"analytics.js\"),z!==!0?!function(a,b,c,d,e,f,g){a.GoogleAnalyticsObject=e,a[e]=a[e]||function(){(a[e].q=a[e].q||[]).push(arguments)},a[e].l=1*new Date,f=b.createElement(c),g=b.getElementsByTagName(c)[0],f.async=1,f.src=d,g.parentNode.insertBefore(f,g)}(window,b,\"script\",a,\"ga\"):(\"function\"!=typeof I.ga&&(I.ga=function(){}),K._log(\"inject\",a)),A&&(I.ga_debug={trace:!0}),f){var e=b.createElement(\"script\"),g=b.getElementsByTagName(\"script\")[0];e.src=d+\"//www.google-analytics.com/cx/api.js?experiment=\"+f,g.parentNode.insertBefore(e,g)}}else a=S(\"//www\",\"//ssl\")+\".google-analytics.com/ga.js\",o===!0&&(a=d+\"//stats.g.doubleclick.net/dc.js\"),z!==!0?!function(){var c=b.createElement(\"script\");c.type=\"text/javascript\",c.async=!0,c.src=a;var d=b.getElementsByTagName(\"script\")[0];d.parentNode.insertBefore(c,d)}():K._log(\"inject\",a);return j=!0,!0},this._registerTrackers=function(){return!c||c.length<1?void K._log(\"warn\",\"No accounts to register\"):(h===!0?c.forEach(function(b){b.crossDomainLinker=L(\"crossDomainLinker\",b)?b.crossDomainLinker:k,b.crossLinkDomains=L(\"crossLinkDomains\",b)?b.crossLinkDomains:d,b.displayFeatures=L(\"displayFeatures\",b)?b.displayFeatures:o,b.enhancedLinkAttribution=L(\"enhancedLinkAttribution\",b)?b.enhancedLinkAttribution:s,b.set=L(\"set\",b)?b.set:{},b.trackEcommerce=L(\"trackEcommerce\",b)?b.trackEcommerce:q,b.trackEvent=!!L(\"trackEvent\",b)&&b.trackEvent;var c={};L(\"fields\",b)?c=b.fields:L(\"cookieConfig\",b)?a.isString(b.cookieConfig)?c.cookieDomain=b.cookieConfig:c=b.cookieConfig:a.isString(i)?c.cookieDomain=i:i&&(c=i),b.crossDomainLinker===!0&&(c.allowLinker=!0),L(\"name\",b)&&(c.name=b.name),b.fields=c,W(\"create\",b.tracker,b.fields),v===!0&&W(N(\"set\",b),\"checkProtocolTask\",null);for(var e in b.set)b.set.hasOwnProperty(e)&&W(N(\"set\",b),e,b.set[e]);b.crossDomainLinker===!0&&(W(N(\"require\",b),\"linker\"),a.isDefined(b.crossLinkDomains)&&W(N(\"linker:autoLink\",b),b.crossLinkDomains)),b.displayFeatures&&W(N(\"require\",b),\"displayfeatures\"),b.trackEcommerce&&(r?(W(N(\"require\",b),\"ec\"),W(N(\"set\",b),\"&cu\",l)):W(N(\"require\",b),\"ecommerce\")),b.enhancedLinkAttribution&&W(N(\"require\",b),\"linkid\"),C&&!t&&W(N(\"send\",b),\"pageview\",B+P())}):(c.length>1&&(K._log(\"warn\",\"Multiple trackers are not supported with ga.js. Using first tracker only\"),c=c.slice(0,1)),U(\"_setAccount\",c[0].tracker),e&&U(\"_setDomainName\",e),s&&U(\"_require\",\"inpage_linkid\",\"//www.google-analytics.com/plugins/ga/inpage_linkid.js\"),C&&!t&&(g?U(\"_trackPageview\",P()):U(\"_trackPageview\"))),!0)},this._ecommerceEnabled=function(a,b){var c=q&&!r;return a===!0&&c===!1&&(q&&r?K._log(\"warn\",b+\" is not available when Enhanced Ecommerce is enabled with analytics.js\"):K._log(\"warn\",\"Ecommerce must be enabled to use \"+b+\" with analytics.js\")),c},this._enhancedEcommerceEnabled=function(a,b){var c=q&&r;return a===!0&&c===!1&&K._log(\"warn\",\"Enhanced Ecommerce must be enabled to use \"+b+\" with analytics.js\"),c},this._trackPage=function(c,d,e){c=c?c:P(),d=d?d:E[0].title,T(function(){U(\"_set\",\"title\",d),U(\"_trackPageview\",B+c)}),V(function(){var f={page:B+c,title:d};a.extend(f,Q()),a.isObject(e)&&a.extend(f,e),X(b,\"send\",\"pageview\",f)})},this._trackEvent=function(b,c,d,e,f,g){T(function(){U(\"_trackEvent\",b,c,d,e,!!f)}),V(function(){var h={},i=function(a){return M(\"trackEvent\",a,!0)};a.isDefined(f)&&(h.nonInteraction=!!f),a.isObject(g)&&a.extend(h,g),a.isDefined(h.page)||(h.page=P()),X(i,\"send\",\"event\",b,c,d,e,h)})},this._addTrans=function(a,b,c,d,e,f,g,h,i){T(function(){U(\"_addTrans\",a,b,c,d,e,f,g,h)}),V(function(){if(K._ecommerceEnabled(!0,\"addTrans\")){var f=function(a){return M(\"trackEcommerce\",a,!0)};X(f,\"ecommerce:addTransaction\",{id:a,affiliation:b,revenue:c,tax:d,shipping:e,currency:i||\"USD\"})}})},this._addItem=function(a,b,c,d,e,f){T(function(){U(\"_addItem\",a,b,c,d,e,f)}),V(function(){if(K._ecommerceEnabled(!0,\"addItem\")){var g=function(a){return M(\"trackEcommerce\",a,!0)};X(g,\"ecommerce:addItem\",{id:a,name:c,sku:b,category:d,price:e,quantity:f})}})},this._trackTrans=function(){T(function(){U(\"_trackTrans\")}),V(function(){if(K._ecommerceEnabled(!0,\"trackTrans\")){var a=function(a){return M(\"trackEcommerce\",a,!0)};X(a,\"ecommerce:send\")}})},this._clearTrans=function(){V(function(){if(K._ecommerceEnabled(!0,\"clearTrans\")){var a=function(a){return M(\"trackEcommerce\",a,!0)};X(a,\"ecommerce:clear\")}})},this._addProduct=function(b,c,d,e,f,g,h,i,j,k){T(function(){U(\"_addProduct\",b,c,d,e,f,g,h,i,j)}),V(function(){if(K._enhancedEcommerceEnabled(!0,\"addProduct\")){var l=function(a){return M(\"trackEcommerce\",a,!0)},m={id:b,name:c,category:d,brand:e,variant:f,price:g,quantity:h,coupon:i,position:j};a.isObject(k)&&a.extend(m,k),X(l,\"ec:addProduct\",m)}})},this._addImpression=function(a,b,c,d,e,f,g,h){T(function(){U(\"_addImpression\",a,b,c,d,e,f,g,h)}),V(function(){if(K._enhancedEcommerceEnabled(!0,\"addImpression\")){var i=function(a){return M(\"trackEcommerce\",a,!0)};X(i,\"ec:addImpression\",{id:a,name:b,category:e,brand:d,variant:f,list:c,position:g,price:h})}})},this._addPromo=function(a,b,c,d){T(function(){U(\"_addPromo\",a,b,c,d)}),V(function(){if(K._enhancedEcommerceEnabled(!0,\"addPromo\")){var e=function(a){return M(\"trackEcommerce\",a,!0)};X(e,\"ec:addPromo\",{id:a,name:b,creative:c,position:d})}})},this._setAction=function(a,b){T(function(){U(\"_setAction\",a,b)}),V(function(){if(K._enhancedEcommerceEnabled(!0,\"setAction\")){var c=function(a){return M(\"trackEcommerce\",a,!0)};X(c,\"ec:setAction\",a,b)}})},this._trackTransaction=function(a,b,c,d,e,f,g,h,i){this._setAction(\"purchase\",R(a,b,c,d,e,f,g,h,i))},this._trackRefund=function(a){this._setAction(\"refund\",R(a))},this._trackCheckOut=function(a,b){this._setAction(\"checkout\",R(null,null,null,null,null,null,null,a,b))},this._trackDetail=function(){this._setAction(\"detail\"),this._pageView()},this._trackCart=function(a,b){[\"add\",\"remove\"].indexOf(a)!==-1&&(this._setAction(a,{list:b}),this._trackEvent(\"UX\",\"click\",a+(\"add\"===a?\" to cart\":\" from cart\")))},this._promoClick=function(a){this._setAction(\"promo_click\"),this._trackEvent(\"Internal Promotions\",\"click\",a)},this._productClick=function(a){this._setAction(\"click\",R(null,null,null,null,null,null,a,null,null)),this._trackEvent(\"UX\",\"click\",a)},this._pageView=function(a){V(function(){W(N(\"send\",a),\"pageview\")})},this._send=function(){var a=Array.prototype.slice.call(arguments);a.unshift(\"send\"),V(function(){W.apply(K,a)})},this._set=function(a,b,c){V(function(){W(N(\"set\",c),a,b)})},this._trackTimings=function(a,c,d,e){V(function(){X(b,\"send\",\"timing\",a,c,d,e)})},this._trackException=function(a,c){V(function(){X(b,\"send\",\"exception\",{exDescription:a,exFatal:!!c})})},n||(this._registerScriptTags(),this._registerTrackers()),C&&H.$on(x,function(){(!y||O.current&&O.current.templateUrl&&!O.current.doNotTrack)&&K._trackPage()}),{log:K.log,offlineQueue:K.offlineQueue,configuration:{accounts:c,universalAnalytics:h,crossDomainLinker:k,crossLinkDomains:d,currency:l,debugMode:m,delayScriptTag:n,disableAnalytics:p,displayFeatures:o,domainName:e,ecommerce:K._ecommerceEnabled(),enhancedEcommerce:K._enhancedEcommerceEnabled(),enhancedLinkAttribution:s,experimentId:f,hybridMobileSupport:v,ignoreFirstPageLoad:t,logAllCalls:u,pageEvent:x,readFromRoute:y,removeRegExp:g,testMode:z,traceDebuggingMode:A,trackPrefix:B,trackRoutes:C,trackUrlParams:D},getUrl:P,setCookieConfig:function(a){return K._log(\"warn\",\"DEPRECATION WARNING: setCookieConfig method is deprecated. Please use tracker fields instead.\"),K._setCookieConfig.apply(K,arguments)},getCookieConfig:function(){return K._log(\"warn\",\"DEPRECATION WARNING: getCookieConfig method is deprecated. Please use tracker fields instead.\"),i},createAnalyticsScriptTag:function(a){return K._log(\"warn\",\"DEPRECATION WARNING: createAnalyticsScriptTag method is deprecated. Please use registerScriptTags and registerTrackers methods instead.\"),a&&(i=a),K._createAnalyticsScriptTag()},createScriptTag:function(){return K._log(\"warn\",\"DEPRECATION WARNING: createScriptTag method is deprecated. Please use registerScriptTags and registerTrackers methods instead.\"),K._createScriptTag()},registerScriptTags:function(){return K._registerScriptTags()},registerTrackers:function(){return K._registerTrackers()},offline:function(a){if(a===!0&&w===!1&&(w=!0),a===!1&&w===!0)for(w=!1;K.offlineQueue.length>0;){var b=K.offlineQueue.shift();b[0].apply(K,b[1])}return w},trackPage:function(a,b,c){K._trackPage.apply(K,arguments)},trackEvent:function(a,b,c,d,e,f){K._trackEvent.apply(K,arguments)},addTrans:function(a,b,c,d,e,f,g,h,i){K._addTrans.apply(K,arguments)},addItem:function(a,b,c,d,e,f){K._addItem.apply(K,arguments)},trackTrans:function(){K._trackTrans.apply(K,arguments)},clearTrans:function(){K._clearTrans.apply(K,arguments)},addProduct:function(a,b,c,d,e,f,g,h,i,j){K._addProduct.apply(K,arguments)},addPromo:function(a,b,c,d){K._addPromo.apply(K,arguments)},addImpression:function(a,b,c,d,e,f,g,h){K._addImpression.apply(K,arguments)},productClick:function(a){K._productClick.apply(K,arguments)},promoClick:function(a){K._promoClick.apply(K,arguments)},trackDetail:function(){K._trackDetail.apply(K,arguments)},trackCart:function(a,b){K._trackCart.apply(K,arguments)},trackCheckout:function(a,b){K._trackCheckOut.apply(K,arguments)},trackTimings:function(a,b,c,d){K._trackTimings.apply(K,arguments)},trackTransaction:function(a,b,c,d,e,f,g,h,i){K._trackTransaction.apply(K,arguments)},trackException:function(a,b){K._trackException.apply(K,arguments)},setAction:function(a,b){K._setAction.apply(K,arguments)},pageView:function(){K._pageView.apply(K,arguments)},send:function(a){K._send.apply(K,arguments)},set:function(a,b,c){K._set.apply(K,arguments)}}}]}).directive(\"gaTrackEvent\",[\"Analytics\",\"$parse\",function(a,b){return{restrict:\"A\",link:function(c,d,e){var f=b(e.gaTrackEvent);d.bind(\"click\",function(){e.gaTrackEventIf&&!c.$eval(e.gaTrackEventIf)||f.length>1&&a.trackEvent.apply(a,f(c))})}}}]),a.module(\"angular-google-analytics\")});\n\n/*\n* Licensed to the Apache Software Foundation (ASF) under one\n* or more contributor license agreements.  See the NOTICE file\n* distributed with this work for additional information\n* regarding copyright ownership.  The ASF licenses this file\n* to you under the Apache License, Version 2.0 (the\n* \"License\"); you may not use this file except in compliance\n* with the License.  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,\n* software distributed under the License is distributed on an\n* \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\n* KIND, either express or implied.  See the License for the\n* specific language governing permissions and limitations\n* under the License.\n*/\n\n(function (global, factory) {\n    typeof exports === 'object' && typeof module !== 'undefined' ? factory(exports) :\n    typeof define === 'function' && define.amd ? define(['exports'], factory) :\n    (global = typeof globalThis !== 'undefined' ? globalThis : global || self, factory(global.echarts = {}));\n}(this, (function (exports) { 'use strict';\n\n    /*! *****************************************************************************\r\n    Copyright (c) Microsoft Corporation.\r\n\r\n    Permission to use, copy, modify, and/or distribute this software for any\r\n    purpose with or without fee is hereby granted.\r\n\r\n    THE SOFTWARE IS PROVIDED \"AS IS\" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH\r\n    REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY\r\n    AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT,\r\n    INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM\r\n    LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR\r\n    OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR\r\n    PERFORMANCE OF THIS SOFTWARE.\r\n    ***************************************************************************** */\r\n    /* global Reflect, Promise */\r\n\r\n    var extendStatics = function(d, b) {\r\n        extendStatics = Object.setPrototypeOf ||\r\n            ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||\r\n            function (d, b) { for (var p in b) if (Object.prototype.hasOwnProperty.call(b, p)) d[p] = b[p]; };\r\n        return extendStatics(d, b);\r\n    };\r\n\r\n    function __extends(d, b) {\r\n        if (typeof b !== \"function\" && b !== null)\r\n            throw new TypeError(\"Class extends value \" + String(b) + \" is not a constructor or null\");\r\n        extendStatics(d, b);\r\n        function __() { this.constructor = d; }\r\n        d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());\r\n    }\n\n    var Browser = (function () {\n        function Browser() {\n            this.firefox = false;\n            this.ie = false;\n            this.edge = false;\n            this.newEdge = false;\n            this.weChat = false;\n        }\n        return Browser;\n    }());\n    var Env = (function () {\n        function Env() {\n            this.browser = new Browser();\n            this.node = false;\n            this.wxa = false;\n            this.worker = false;\n            this.svgSupported = false;\n            this.touchEventsSupported = false;\n            this.pointerEventsSupported = false;\n            this.domSupported = false;\n            this.transformSupported = false;\n            this.transform3dSupported = false;\n            this.hasGlobalWindow = typeof window !== 'undefined';\n        }\n        return Env;\n    }());\n    var env = new Env();\n    if (typeof wx === 'object' && typeof wx.getSystemInfoSync === 'function') {\n        env.wxa = true;\n        env.touchEventsSupported = true;\n    }\n    else if (typeof document === 'undefined' && typeof self !== 'undefined') {\n        env.worker = true;\n    }\n    else if (!env.hasGlobalWindow || 'Deno' in window) {\n        env.node = true;\n        env.svgSupported = true;\n    }\n    else {\n        detect(navigator.userAgent, env);\n    }\n    function detect(ua, env) {\n        var browser = env.browser;\n        var firefox = ua.match(/Firefox\\/([\\d.]+)/);\n        var ie = ua.match(/MSIE\\s([\\d.]+)/)\n            || ua.match(/Trident\\/.+?rv:(([\\d.]+))/);\n        var edge = ua.match(/Edge?\\/([\\d.]+)/);\n        var weChat = (/micromessenger/i).test(ua);\n        if (firefox) {\n            browser.firefox = true;\n            browser.version = firefox[1];\n        }\n        if (ie) {\n            browser.ie = true;\n            browser.version = ie[1];\n        }\n        if (edge) {\n            browser.edge = true;\n            browser.version = edge[1];\n            browser.newEdge = +edge[1].split('.')[0] > 18;\n        }\n        if (weChat) {\n            browser.weChat = true;\n        }\n        env.svgSupported = typeof SVGRect !== 'undefined';\n        env.touchEventsSupported = 'ontouchstart' in window && !browser.ie && !browser.edge;\n        env.pointerEventsSupported = 'onpointerdown' in window\n            && (browser.edge || (browser.ie && +browser.version >= 11));\n        env.domSupported = typeof document !== 'undefined';\n        var style = document.documentElement.style;\n        env.transform3dSupported = ((browser.ie && 'transition' in style)\n            || browser.edge\n            || (('WebKitCSSMatrix' in window) && ('m11' in new WebKitCSSMatrix()))\n            || 'MozPerspective' in style)\n            && !('OTransition' in style);\n        env.transformSupported = env.transform3dSupported\n            || (browser.ie && +browser.version >= 9);\n    }\n\n    var DEFAULT_FONT_SIZE = 12;\n    var DEFAULT_FONT_FAMILY = 'sans-serif';\n    var DEFAULT_FONT = DEFAULT_FONT_SIZE + \"px \" + DEFAULT_FONT_FAMILY;\n    var OFFSET = 20;\n    var SCALE = 100;\n    var defaultWidthMapStr = \"007LLmW'55;N0500LLLLLLLLLL00NNNLzWW\\\\\\\\WQb\\\\0FWLg\\\\bWb\\\\WQ\\\\WrWWQ000CL5LLFLL0LL**F*gLLLL5F0LF\\\\FFF5.5N\";\n    function getTextWidthMap(mapStr) {\n        var map = {};\n        if (typeof JSON === 'undefined') {\n            return map;\n        }\n        for (var i = 0; i < mapStr.length; i++) {\n            var char = String.fromCharCode(i + 32);\n            var size = (mapStr.charCodeAt(i) - OFFSET) / SCALE;\n            map[char] = size;\n        }\n        return map;\n    }\n    var DEFAULT_TEXT_WIDTH_MAP = getTextWidthMap(defaultWidthMapStr);\n    var platformApi = {\n        createCanvas: function () {\n            return typeof document !== 'undefined'\n                && document.createElement('canvas');\n        },\n        measureText: (function () {\n            var _ctx;\n            var _cachedFont;\n            return function (text, font) {\n                if (!_ctx) {\n                    var canvas = platformApi.createCanvas();\n                    _ctx = canvas && canvas.getContext('2d');\n                }\n                if (_ctx) {\n                    if (_cachedFont !== font) {\n                        _cachedFont = _ctx.font = font || DEFAULT_FONT;\n                    }\n                    return _ctx.measureText(text);\n                }\n                else {\n                    text = text || '';\n                    font = font || DEFAULT_FONT;\n                    var res = /((?:\\d+)?\\.?\\d*)px/.exec(font);\n                    var fontSize = res && +res[1] || DEFAULT_FONT_SIZE;\n                    var width = 0;\n                    if (font.indexOf('mono') >= 0) {\n                        width = fontSize * text.length;\n                    }\n                    else {\n                        for (var i = 0; i < text.length; i++) {\n                            var preCalcWidth = DEFAULT_TEXT_WIDTH_MAP[text[i]];\n                            width += preCalcWidth == null ? fontSize : (preCalcWidth * fontSize);\n                        }\n                    }\n                    return { width: width };\n                }\n            };\n        })(),\n        loadImage: function (src, onload, onerror) {\n            var image = new Image();\n            image.onload = onload;\n            image.onerror = onerror;\n            image.src = src;\n            return image;\n        }\n    };\n    function setPlatformAPI(newPlatformApis) {\n        for (var key in platformApi) {\n            if (newPlatformApis[key]) {\n                platformApi[key] = newPlatformApis[key];\n            }\n        }\n    }\n\n    var BUILTIN_OBJECT = reduce([\n        'Function',\n        'RegExp',\n        'Date',\n        'Error',\n        'CanvasGradient',\n        'CanvasPattern',\n        'Image',\n        'Canvas'\n    ], function (obj, val) {\n        obj['[object ' + val + ']'] = true;\n        return obj;\n    }, {});\n    var TYPED_ARRAY = reduce([\n        'Int8',\n        'Uint8',\n        'Uint8Clamped',\n        'Int16',\n        'Uint16',\n        'Int32',\n        'Uint32',\n        'Float32',\n        'Float64'\n    ], function (obj, val) {\n        obj['[object ' + val + 'Array]'] = true;\n        return obj;\n    }, {});\n    var objToString = Object.prototype.toString;\n    var arrayProto = Array.prototype;\n    var nativeForEach = arrayProto.forEach;\n    var nativeFilter = arrayProto.filter;\n    var nativeSlice = arrayProto.slice;\n    var nativeMap = arrayProto.map;\n    var ctorFunction = function () { }.constructor;\n    var protoFunction = ctorFunction ? ctorFunction.prototype : null;\n    var protoKey = '__proto__';\n    var idStart = 0x0907;\n    function guid() {\n        return idStart++;\n    }\n    function logError() {\n        var args = [];\n        for (var _i = 0; _i < arguments.length; _i++) {\n            args[_i] = arguments[_i];\n        }\n        if (typeof console !== 'undefined') {\n            console.error.apply(console, args);\n        }\n    }\n    function clone(source) {\n        if (source == null || typeof source !== 'object') {\n            return source;\n        }\n        var result = source;\n        var typeStr = objToString.call(source);\n        if (typeStr === '[object Array]') {\n            if (!isPrimitive(source)) {\n                result = [];\n                for (var i = 0, len = source.length; i < len; i++) {\n                    result[i] = clone(source[i]);\n                }\n            }\n        }\n        else if (TYPED_ARRAY[typeStr]) {\n            if (!isPrimitive(source)) {\n                var Ctor = source.constructor;\n                if (Ctor.from) {\n                    result = Ctor.from(source);\n                }\n                else {\n                    result = new Ctor(source.length);\n                    for (var i = 0, len = source.length; i < len; i++) {\n                        result[i] = source[i];\n                    }\n                }\n            }\n        }\n        else if (!BUILTIN_OBJECT[typeStr] && !isPrimitive(source) && !isDom(source)) {\n            result = {};\n            for (var key in source) {\n                if (source.hasOwnProperty(key) && key !== protoKey) {\n                    result[key] = clone(source[key]);\n                }\n            }\n        }\n        return result;\n    }\n    function merge(target, source, overwrite) {\n        if (!isObject(source) || !isObject(target)) {\n            return overwrite ? clone(source) : target;\n        }\n        for (var key in source) {\n            if (source.hasOwnProperty(key) && key !== protoKey) {\n                var targetProp = target[key];\n                var sourceProp = source[key];\n                if (isObject(sourceProp)\n                    && isObject(targetProp)\n                    && !isArray(sourceProp)\n                    && !isArray(targetProp)\n                    && !isDom(sourceProp)\n                    && !isDom(targetProp)\n                    && !isBuiltInObject(sourceProp)\n                    && !isBuiltInObject(targetProp)\n                    && !isPrimitive(sourceProp)\n                    && !isPrimitive(targetProp)) {\n                    merge(targetProp, sourceProp, overwrite);\n                }\n                else if (overwrite || !(key in target)) {\n                    target[key] = clone(source[key]);\n                }\n            }\n        }\n        return target;\n    }\n    function mergeAll(targetAndSources, overwrite) {\n        var result = targetAndSources[0];\n        for (var i = 1, len = targetAndSources.length; i < len; i++) {\n            result = merge(result, targetAndSources[i], overwrite);\n        }\n        return result;\n    }\n    function extend(target, source) {\n        if (Object.assign) {\n            Object.assign(target, source);\n        }\n        else {\n            for (var key in source) {\n                if (source.hasOwnProperty(key) && key !== protoKey) {\n                    target[key] = source[key];\n                }\n            }\n        }\n        return target;\n    }\n    function defaults(target, source, overlay) {\n        var keysArr = keys(source);\n        for (var i = 0, len = keysArr.length; i < len; i++) {\n            var key = keysArr[i];\n            if ((overlay ? source[key] != null : target[key] == null)) {\n                target[key] = source[key];\n            }\n        }\n        return target;\n    }\n    var createCanvas = platformApi.createCanvas;\n    function indexOf(array, value) {\n        if (array) {\n            if (array.indexOf) {\n                return array.indexOf(value);\n            }\n            for (var i = 0, len = array.length; i < len; i++) {\n                if (array[i] === value) {\n                    return i;\n                }\n            }\n        }\n        return -1;\n    }\n    function inherits(clazz, baseClazz) {\n        var clazzPrototype = clazz.prototype;\n        function F() { }\n        F.prototype = baseClazz.prototype;\n        clazz.prototype = new F();\n        for (var prop in clazzPrototype) {\n            if (clazzPrototype.hasOwnProperty(prop)) {\n                clazz.prototype[prop] = clazzPrototype[prop];\n            }\n        }\n        clazz.prototype.constructor = clazz;\n        clazz.superClass = baseClazz;\n    }\n    function mixin(target, source, override) {\n        target = 'prototype' in target ? target.prototype : target;\n        source = 'prototype' in source ? source.prototype : source;\n        if (Object.getOwnPropertyNames) {\n            var keyList = Object.getOwnPropertyNames(source);\n            for (var i = 0; i < keyList.length; i++) {\n                var key = keyList[i];\n                if (key !== 'constructor') {\n                    if ((override ? source[key] != null : target[key] == null)) {\n                        target[key] = source[key];\n                    }\n                }\n            }\n        }\n        else {\n            defaults(target, source, override);\n        }\n    }\n    function isArrayLike(data) {\n        if (!data) {\n            return false;\n        }\n        if (typeof data === 'string') {\n            return false;\n        }\n        return typeof data.length === 'number';\n    }\n    function each(arr, cb, context) {\n        if (!(arr && cb)) {\n            return;\n        }\n        if (arr.forEach && arr.forEach === nativeForEach) {\n            arr.forEach(cb, context);\n        }\n        else if (arr.length === +arr.length) {\n            for (var i = 0, len = arr.length; i < len; i++) {\n                cb.call(context, arr[i], i, arr);\n            }\n        }\n        else {\n            for (var key in arr) {\n                if (arr.hasOwnProperty(key)) {\n                    cb.call(context, arr[key], key, arr);\n                }\n            }\n        }\n    }\n    function map(arr, cb, context) {\n        if (!arr) {\n            return [];\n        }\n        if (!cb) {\n            return slice(arr);\n        }\n        if (arr.map && arr.map === nativeMap) {\n            return arr.map(cb, context);\n        }\n        else {\n            var result = [];\n            for (var i = 0, len = arr.length; i < len; i++) {\n                result.push(cb.call(context, arr[i], i, arr));\n            }\n            return result;\n        }\n    }\n    function reduce(arr, cb, memo, context) {\n        if (!(arr && cb)) {\n            return;\n        }\n        for (var i = 0, len = arr.length; i < len; i++) {\n            memo = cb.call(context, memo, arr[i], i, arr);\n        }\n        return memo;\n    }\n    function filter(arr, cb, context) {\n        if (!arr) {\n            return [];\n        }\n        if (!cb) {\n            return slice(arr);\n        }\n        if (arr.filter && arr.filter === nativeFilter) {\n            return arr.filter(cb, context);\n        }\n        else {\n            var result = [];\n            for (var i = 0, len = arr.length; i < len; i++) {\n                if (cb.call(context, arr[i], i, arr)) {\n                    result.push(arr[i]);\n                }\n            }\n            return result;\n        }\n    }\n    function find(arr, cb, context) {\n        if (!(arr && cb)) {\n            return;\n        }\n        for (var i = 0, len = arr.length; i < len; i++) {\n            if (cb.call(context, arr[i], i, arr)) {\n                return arr[i];\n            }\n        }\n    }\n    function keys(obj) {\n        if (!obj) {\n            return [];\n        }\n        if (Object.keys) {\n            return Object.keys(obj);\n        }\n        var keyList = [];\n        for (var key in obj) {\n            if (obj.hasOwnProperty(key)) {\n                keyList.push(key);\n            }\n        }\n        return keyList;\n    }\n    function bindPolyfill(func, context) {\n        var args = [];\n        for (var _i = 2; _i < arguments.length; _i++) {\n            args[_i - 2] = arguments[_i];\n        }\n        return function () {\n            return func.apply(context, args.concat(nativeSlice.call(arguments)));\n        };\n    }\n    var bind = (protoFunction && isFunction(protoFunction.bind))\n        ? protoFunction.call.bind(protoFunction.bind)\n        : bindPolyfill;\n    function curry(func) {\n        var args = [];\n        for (var _i = 1; _i < arguments.length; _i++) {\n            args[_i - 1] = arguments[_i];\n        }\n        return function () {\n            return func.apply(this, args.concat(nativeSlice.call(arguments)));\n        };\n    }\n    function isArray(value) {\n        if (Array.isArray) {\n            return Array.isArray(value);\n        }\n        return objToString.call(value) === '[object Array]';\n    }\n    function isFunction(value) {\n        return typeof value === 'function';\n    }\n    function isString(value) {\n        return typeof value === 'string';\n    }\n    function isStringSafe(value) {\n        return objToString.call(value) === '[object String]';\n    }\n    function isNumber(value) {\n        return typeof value === 'number';\n    }\n    function isObject(value) {\n        var type = typeof value;\n        return type === 'function' || (!!value && type === 'object');\n    }\n    function isBuiltInObject(value) {\n        return !!BUILTIN_OBJECT[objToString.call(value)];\n    }\n    function isTypedArray(value) {\n        return !!TYPED_ARRAY[objToString.call(value)];\n    }\n    function isDom(value) {\n        return typeof value === 'object'\n            && typeof value.nodeType === 'number'\n            && typeof value.ownerDocument === 'object';\n    }\n    function isGradientObject(value) {\n        return value.colorStops != null;\n    }\n    function isImagePatternObject(value) {\n        return value.image != null;\n    }\n    function isRegExp(value) {\n        return objToString.call(value) === '[object RegExp]';\n    }\n    function eqNaN(value) {\n        return value !== value;\n    }\n    function retrieve() {\n        var args = [];\n        for (var _i = 0; _i < arguments.length; _i++) {\n            args[_i] = arguments[_i];\n        }\n        for (var i = 0, len = args.length; i < len; i++) {\n            if (args[i] != null) {\n                return args[i];\n            }\n        }\n    }\n    function retrieve2(value0, value1) {\n        return value0 != null\n            ? value0\n            : value1;\n    }\n    function retrieve3(value0, value1, value2) {\n        return value0 != null\n            ? value0\n            : value1 != null\n                ? value1\n                : value2;\n    }\n    function slice(arr) {\n        var args = [];\n        for (var _i = 1; _i < arguments.length; _i++) {\n            args[_i - 1] = arguments[_i];\n        }\n        return nativeSlice.apply(arr, args);\n    }\n    function normalizeCssArray(val) {\n        if (typeof (val) === 'number') {\n            return [val, val, val, val];\n        }\n        var len = val.length;\n        if (len === 2) {\n            return [val[0], val[1], val[0], val[1]];\n        }\n        else if (len === 3) {\n            return [val[0], val[1], val[2], val[1]];\n        }\n        return val;\n    }\n    function assert(condition, message) {\n        if (!condition) {\n            throw new Error(message);\n        }\n    }\n    function trim(str) {\n        if (str == null) {\n            return null;\n        }\n        else if (typeof str.trim === 'function') {\n            return str.trim();\n        }\n        else {\n            return str.replace(/^[\\s\\uFEFF\\xA0]+|[\\s\\uFEFF\\xA0]+$/g, '');\n        }\n    }\n    var primitiveKey = '__ec_primitive__';\n    function setAsPrimitive(obj) {\n        obj[primitiveKey] = true;\n    }\n    function isPrimitive(obj) {\n        return obj[primitiveKey];\n    }\n    var MapPolyfill = (function () {\n        function MapPolyfill() {\n            this.data = {};\n        }\n        MapPolyfill.prototype[\"delete\"] = function (key) {\n            var existed = this.has(key);\n            if (existed) {\n                delete this.data[key];\n            }\n            return existed;\n        };\n        MapPolyfill.prototype.has = function (key) {\n            return this.data.hasOwnProperty(key);\n        };\n        MapPolyfill.prototype.get = function (key) {\n            return this.data[key];\n        };\n        MapPolyfill.prototype.set = function (key, value) {\n            this.data[key] = value;\n            return this;\n        };\n        MapPolyfill.prototype.keys = function () {\n            return keys(this.data);\n        };\n        MapPolyfill.prototype.forEach = function (callback) {\n            var data = this.data;\n            for (var key in data) {\n                if (data.hasOwnProperty(key)) {\n                    callback(data[key], key);\n                }\n            }\n        };\n        return MapPolyfill;\n    }());\n    var isNativeMapSupported = typeof Map === 'function';\n    function maybeNativeMap() {\n        return (isNativeMapSupported ? new Map() : new MapPolyfill());\n    }\n    var HashMap = (function () {\n        function HashMap(obj) {\n            var isArr = isArray(obj);\n            this.data = maybeNativeMap();\n            var thisMap = this;\n            (obj instanceof HashMap)\n                ? obj.each(visit)\n                : (obj && each(obj, visit));\n            function visit(value, key) {\n                isArr ? thisMap.set(value, key) : thisMap.set(key, value);\n            }\n        }\n        HashMap.prototype.hasKey = function (key) {\n            return this.data.has(key);\n        };\n        HashMap.prototype.get = function (key) {\n            return this.data.get(key);\n        };\n        HashMap.prototype.set = function (key, value) {\n            this.data.set(key, value);\n            return value;\n        };\n        HashMap.prototype.each = function (cb, context) {\n            this.data.forEach(function (value, key) {\n                cb.call(context, value, key);\n            });\n        };\n        HashMap.prototype.keys = function () {\n            var keys = this.data.keys();\n            return isNativeMapSupported\n                ? Array.from(keys)\n                : keys;\n        };\n        HashMap.prototype.removeKey = function (key) {\n            this.data[\"delete\"](key);\n        };\n        return HashMap;\n    }());\n    function createHashMap(obj) {\n        return new HashMap(obj);\n    }\n    function concatArray(a, b) {\n        var newArray = new a.constructor(a.length + b.length);\n        for (var i = 0; i < a.length; i++) {\n            newArray[i] = a[i];\n        }\n        var offset = a.length;\n        for (var i = 0; i < b.length; i++) {\n            newArray[i + offset] = b[i];\n        }\n        return newArray;\n    }\n    function createObject(proto, properties) {\n        var obj;\n        if (Object.create) {\n            obj = Object.create(proto);\n        }\n        else {\n            var StyleCtor = function () { };\n            StyleCtor.prototype = proto;\n            obj = new StyleCtor();\n        }\n        if (properties) {\n            extend(obj, properties);\n        }\n        return obj;\n    }\n    function disableUserSelect(dom) {\n        var domStyle = dom.style;\n        domStyle.webkitUserSelect = 'none';\n        domStyle.userSelect = 'none';\n        domStyle.webkitTapHighlightColor = 'rgba(0,0,0,0)';\n        domStyle['-webkit-touch-callout'] = 'none';\n    }\n    function hasOwn(own, prop) {\n        return own.hasOwnProperty(prop);\n    }\n    function noop() { }\n    var RADIAN_TO_DEGREE = 180 / Math.PI;\n\n    var util = /*#__PURE__*/Object.freeze({\n        __proto__: null,\n        guid: guid,\n        logError: logError,\n        clone: clone,\n        merge: merge,\n        mergeAll: mergeAll,\n        extend: extend,\n        defaults: defaults,\n        createCanvas: createCanvas,\n        indexOf: indexOf,\n        inherits: inherits,\n        mixin: mixin,\n        isArrayLike: isArrayLike,\n        each: each,\n        map: map,\n        reduce: reduce,\n        filter: filter,\n        find: find,\n        keys: keys,\n        bind: bind,\n        curry: curry,\n        isArray: isArray,\n        isFunction: isFunction,\n        isString: isString,\n        isStringSafe: isStringSafe,\n        isNumber: isNumber,\n        isObject: isObject,\n        isBuiltInObject: isBuiltInObject,\n        isTypedArray: isTypedArray,\n        isDom: isDom,\n        isGradientObject: isGradientObject,\n        isImagePatternObject: isImagePatternObject,\n        isRegExp: isRegExp,\n        eqNaN: eqNaN,\n        retrieve: retrieve,\n        retrieve2: retrieve2,\n        retrieve3: retrieve3,\n        slice: slice,\n        normalizeCssArray: normalizeCssArray,\n        assert: assert,\n        trim: trim,\n        setAsPrimitive: setAsPrimitive,\n        isPrimitive: isPrimitive,\n        HashMap: HashMap,\n        createHashMap: createHashMap,\n        concatArray: concatArray,\n        createObject: createObject,\n        disableUserSelect: disableUserSelect,\n        hasOwn: hasOwn,\n        noop: noop,\n        RADIAN_TO_DEGREE: RADIAN_TO_DEGREE\n    });\n\n    function create(x, y) {\n        if (x == null) {\n            x = 0;\n        }\n        if (y == null) {\n            y = 0;\n        }\n        return [x, y];\n    }\n    function copy(out, v) {\n        out[0] = v[0];\n        out[1] = v[1];\n        return out;\n    }\n    function clone$1(v) {\n        return [v[0], v[1]];\n    }\n    function set(out, a, b) {\n        out[0] = a;\n        out[1] = b;\n        return out;\n    }\n    function add(out, v1, v2) {\n        out[0] = v1[0] + v2[0];\n        out[1] = v1[1] + v2[1];\n        return out;\n    }\n    function scaleAndAdd(out, v1, v2, a) {\n        out[0] = v1[0] + v2[0] * a;\n        out[1] = v1[1] + v2[1] * a;\n        return out;\n    }\n    function sub(out, v1, v2) {\n        out[0] = v1[0] - v2[0];\n        out[1] = v1[1] - v2[1];\n        return out;\n    }\n    function len(v) {\n        return Math.sqrt(lenSquare(v));\n    }\n    var length = len;\n    function lenSquare(v) {\n        return v[0] * v[0] + v[1] * v[1];\n    }\n    var lengthSquare = lenSquare;\n    function mul(out, v1, v2) {\n        out[0] = v1[0] * v2[0];\n        out[1] = v1[1] * v2[1];\n        return out;\n    }\n    function div(out, v1, v2) {\n        out[0] = v1[0] / v2[0];\n        out[1] = v1[1] / v2[1];\n        return out;\n    }\n    function dot(v1, v2) {\n        return v1[0] * v2[0] + v1[1] * v2[1];\n    }\n    function scale(out, v, s) {\n        out[0] = v[0] * s;\n        out[1] = v[1] * s;\n        return out;\n    }\n    function normalize(out, v) {\n        var d = len(v);\n        if (d === 0) {\n            out[0] = 0;\n            out[1] = 0;\n        }\n        else {\n            out[0] = v[0] / d;\n            out[1] = v[1] / d;\n        }\n        return out;\n    }\n    function distance(v1, v2) {\n        return Math.sqrt((v1[0] - v2[0]) * (v1[0] - v2[0])\n            + (v1[1] - v2[1]) * (v1[1] - v2[1]));\n    }\n    var dist = distance;\n    function distanceSquare(v1, v2) {\n        return (v1[0] - v2[0]) * (v1[0] - v2[0])\n            + (v1[1] - v2[1]) * (v1[1] - v2[1]);\n    }\n    var distSquare = distanceSquare;\n    function negate(out, v) {\n        out[0] = -v[0];\n        out[1] = -v[1];\n        return out;\n    }\n    function lerp(out, v1, v2, t) {\n        out[0] = v1[0] + t * (v2[0] - v1[0]);\n        out[1] = v1[1] + t * (v2[1] - v1[1]);\n        return out;\n    }\n    function applyTransform(out, v, m) {\n        var x = v[0];\n        var y = v[1];\n        out[0] = m[0] * x + m[2] * y + m[4];\n        out[1] = m[1] * x + m[3] * y + m[5];\n        return out;\n    }\n    function min(out, v1, v2) {\n        out[0] = Math.min(v1[0], v2[0]);\n        out[1] = Math.min(v1[1], v2[1]);\n        return out;\n    }\n    function max(out, v1, v2) {\n        out[0] = Math.max(v1[0], v2[0]);\n        out[1] = Math.max(v1[1], v2[1]);\n        return out;\n    }\n\n    var vector = /*#__PURE__*/Object.freeze({\n        __proto__: null,\n        create: create,\n        copy: copy,\n        clone: clone$1,\n        set: set,\n        add: add,\n        scaleAndAdd: scaleAndAdd,\n        sub: sub,\n        len: len,\n        length: length,\n        lenSquare: lenSquare,\n        lengthSquare: lengthSquare,\n        mul: mul,\n        div: div,\n        dot: dot,\n        scale: scale,\n        normalize: normalize,\n        distance: distance,\n        dist: dist,\n        distanceSquare: distanceSquare,\n        distSquare: distSquare,\n        negate: negate,\n        lerp: lerp,\n        applyTransform: applyTransform,\n        min: min,\n        max: max\n    });\n\n    var Param = (function () {\n        function Param(target, e) {\n            this.target = target;\n            this.topTarget = e && e.topTarget;\n        }\n        return Param;\n    }());\n    var Draggable = (function () {\n        function Draggable(handler) {\n            this.handler = handler;\n            handler.on('mousedown', this._dragStart, this);\n            handler.on('mousemove', this._drag, this);\n            handler.on('mouseup', this._dragEnd, this);\n        }\n        Draggable.prototype._dragStart = function (e) {\n            var draggingTarget = e.target;\n            while (draggingTarget && !draggingTarget.draggable) {\n                draggingTarget = draggingTarget.parent || draggingTarget.__hostTarget;\n            }\n            if (draggingTarget) {\n                this._draggingTarget = draggingTarget;\n                draggingTarget.dragging = true;\n                this._x = e.offsetX;\n                this._y = e.offsetY;\n                this.handler.dispatchToElement(new Param(draggingTarget, e), 'dragstart', e.event);\n            }\n        };\n        Draggable.prototype._drag = function (e) {\n            var draggingTarget = this._draggingTarget;\n            if (draggingTarget) {\n                var x = e.offsetX;\n                var y = e.offsetY;\n                var dx = x - this._x;\n                var dy = y - this._y;\n                this._x = x;\n                this._y = y;\n                draggingTarget.drift(dx, dy, e);\n                this.handler.dispatchToElement(new Param(draggingTarget, e), 'drag', e.event);\n                var dropTarget = this.handler.findHover(x, y, draggingTarget).target;\n                var lastDropTarget = this._dropTarget;\n                this._dropTarget = dropTarget;\n                if (draggingTarget !== dropTarget) {\n                    if (lastDropTarget && dropTarget !== lastDropTarget) {\n                        this.handler.dispatchToElement(new Param(lastDropTarget, e), 'dragleave', e.event);\n                    }\n                    if (dropTarget && dropTarget !== lastDropTarget) {\n                        this.handler.dispatchToElement(new Param(dropTarget, e), 'dragenter', e.event);\n                    }\n                }\n            }\n        };\n        Draggable.prototype._dragEnd = function (e) {\n            var draggingTarget = this._draggingTarget;\n            if (draggingTarget) {\n                draggingTarget.dragging = false;\n            }\n            this.handler.dispatchToElement(new Param(draggingTarget, e), 'dragend', e.event);\n            if (this._dropTarget) {\n                this.handler.dispatchToElement(new Param(this._dropTarget, e), 'drop', e.event);\n            }\n            this._draggingTarget = null;\n            this._dropTarget = null;\n        };\n        return Draggable;\n    }());\n\n    var Eventful = (function () {\n        function Eventful(eventProcessors) {\n            if (eventProcessors) {\n                this._$eventProcessor = eventProcessors;\n            }\n        }\n        Eventful.prototype.on = function (event, query, handler, context) {\n            if (!this._$handlers) {\n                this._$handlers = {};\n            }\n            var _h = this._$handlers;\n            if (typeof query === 'function') {\n                context = handler;\n                handler = query;\n                query = null;\n            }\n            if (!handler || !event) {\n                return this;\n            }\n            var eventProcessor = this._$eventProcessor;\n            if (query != null && eventProcessor && eventProcessor.normalizeQuery) {\n                query = eventProcessor.normalizeQuery(query);\n            }\n            if (!_h[event]) {\n                _h[event] = [];\n            }\n            for (var i = 0; i < _h[event].length; i++) {\n                if (_h[event][i].h === handler) {\n                    return this;\n                }\n            }\n            var wrap = {\n                h: handler,\n                query: query,\n                ctx: (context || this),\n                callAtLast: handler.zrEventfulCallAtLast\n            };\n            var lastIndex = _h[event].length - 1;\n            var lastWrap = _h[event][lastIndex];\n            (lastWrap && lastWrap.callAtLast)\n                ? _h[event].splice(lastIndex, 0, wrap)\n                : _h[event].push(wrap);\n            return this;\n        };\n        Eventful.prototype.isSilent = function (eventName) {\n            var _h = this._$handlers;\n            return !_h || !_h[eventName] || !_h[eventName].length;\n        };\n        Eventful.prototype.off = function (eventType, handler) {\n            var _h = this._$handlers;\n            if (!_h) {\n                return this;\n            }\n            if (!eventType) {\n                this._$handlers = {};\n                return this;\n            }\n            if (handler) {\n                if (_h[eventType]) {\n                    var newList = [];\n                    for (var i = 0, l = _h[eventType].length; i < l; i++) {\n                        if (_h[eventType][i].h !== handler) {\n                            newList.push(_h[eventType][i]);\n                        }\n                    }\n                    _h[eventType] = newList;\n                }\n                if (_h[eventType] && _h[eventType].length === 0) {\n                    delete _h[eventType];\n                }\n            }\n            else {\n                delete _h[eventType];\n            }\n            return this;\n        };\n        Eventful.prototype.trigger = function (eventType) {\n            var args = [];\n            for (var _i = 1; _i < arguments.length; _i++) {\n                args[_i - 1] = arguments[_i];\n            }\n            if (!this._$handlers) {\n                return this;\n            }\n            var _h = this._$handlers[eventType];\n            var eventProcessor = this._$eventProcessor;\n            if (_h) {\n                var argLen = args.length;\n                var len = _h.length;\n                for (var i = 0; i < len; i++) {\n                    var hItem = _h[i];\n                    if (eventProcessor\n                        && eventProcessor.filter\n                        && hItem.query != null\n                        && !eventProcessor.filter(eventType, hItem.query)) {\n                        continue;\n                    }\n                    switch (argLen) {\n                        case 0:\n                            hItem.h.call(hItem.ctx);\n                            break;\n                        case 1:\n                            hItem.h.call(hItem.ctx, args[0]);\n                            break;\n                        case 2:\n                            hItem.h.call(hItem.ctx, args[0], args[1]);\n                            break;\n                        default:\n                            hItem.h.apply(hItem.ctx, args);\n                            break;\n                    }\n                }\n            }\n            eventProcessor && eventProcessor.afterTrigger\n                && eventProcessor.afterTrigger(eventType);\n            return this;\n        };\n        Eventful.prototype.triggerWithContext = function (type) {\n            var args = [];\n            for (var _i = 1; _i < arguments.length; _i++) {\n                args[_i - 1] = arguments[_i];\n            }\n            if (!this._$handlers) {\n                return this;\n            }\n            var _h = this._$handlers[type];\n            var eventProcessor = this._$eventProcessor;\n            if (_h) {\n                var argLen = args.length;\n                var ctx = args[argLen - 1];\n                var len = _h.length;\n                for (var i = 0; i < len; i++) {\n                    var hItem = _h[i];\n                    if (eventProcessor\n                        && eventProcessor.filter\n                        && hItem.query != null\n                        && !eventProcessor.filter(type, hItem.query)) {\n                        continue;\n                    }\n                    switch (argLen) {\n                        case 0:\n                            hItem.h.call(ctx);\n                            break;\n                        case 1:\n                            hItem.h.call(ctx, args[0]);\n                            break;\n                        case 2:\n                            hItem.h.call(ctx, args[0], args[1]);\n                            break;\n                        default:\n                            hItem.h.apply(ctx, args.slice(1, argLen - 1));\n                            break;\n                    }\n                }\n            }\n            eventProcessor && eventProcessor.afterTrigger\n                && eventProcessor.afterTrigger(type);\n            return this;\n        };\n        return Eventful;\n    }());\n\n    var LN2 = Math.log(2);\n    function determinant(rows, rank, rowStart, rowMask, colMask, detCache) {\n        var cacheKey = rowMask + '-' + colMask;\n        var fullRank = rows.length;\n        if (detCache.hasOwnProperty(cacheKey)) {\n            return detCache[cacheKey];\n        }\n        if (rank === 1) {\n            var colStart = Math.round(Math.log(((1 << fullRank) - 1) & ~colMask) / LN2);\n            return rows[rowStart][colStart];\n        }\n        var subRowMask = rowMask | (1 << rowStart);\n        var subRowStart = rowStart + 1;\n        while (rowMask & (1 << subRowStart)) {\n            subRowStart++;\n        }\n        var sum = 0;\n        for (var j = 0, colLocalIdx = 0; j < fullRank; j++) {\n            var colTag = 1 << j;\n            if (!(colTag & colMask)) {\n                sum += (colLocalIdx % 2 ? -1 : 1) * rows[rowStart][j]\n                    * determinant(rows, rank - 1, subRowStart, subRowMask, colMask | colTag, detCache);\n                colLocalIdx++;\n            }\n        }\n        detCache[cacheKey] = sum;\n        return sum;\n    }\n    function buildTransformer(src, dest) {\n        var mA = [\n            [src[0], src[1], 1, 0, 0, 0, -dest[0] * src[0], -dest[0] * src[1]],\n            [0, 0, 0, src[0], src[1], 1, -dest[1] * src[0], -dest[1] * src[1]],\n            [src[2], src[3], 1, 0, 0, 0, -dest[2] * src[2], -dest[2] * src[3]],\n            [0, 0, 0, src[2], src[3], 1, -dest[3] * src[2], -dest[3] * src[3]],\n            [src[4], src[5], 1, 0, 0, 0, -dest[4] * src[4], -dest[4] * src[5]],\n            [0, 0, 0, src[4], src[5], 1, -dest[5] * src[4], -dest[5] * src[5]],\n            [src[6], src[7], 1, 0, 0, 0, -dest[6] * src[6], -dest[6] * src[7]],\n            [0, 0, 0, src[6], src[7], 1, -dest[7] * src[6], -dest[7] * src[7]]\n        ];\n        var detCache = {};\n        var det = determinant(mA, 8, 0, 0, 0, detCache);\n        if (det === 0) {\n            return;\n        }\n        var vh = [];\n        for (var i = 0; i < 8; i++) {\n            for (var j = 0; j < 8; j++) {\n                vh[j] == null && (vh[j] = 0);\n                vh[j] += ((i + j) % 2 ? -1 : 1)\n                    * determinant(mA, 7, i === 0 ? 1 : 0, 1 << i, 1 << j, detCache)\n                    / det * dest[i];\n            }\n        }\n        return function (out, srcPointX, srcPointY) {\n            var pk = srcPointX * vh[6] + srcPointY * vh[7] + 1;\n            out[0] = (srcPointX * vh[0] + srcPointY * vh[1] + vh[2]) / pk;\n            out[1] = (srcPointX * vh[3] + srcPointY * vh[4] + vh[5]) / pk;\n        };\n    }\n\n    var EVENT_SAVED_PROP = '___zrEVENTSAVED';\n    var _calcOut = [];\n    function transformLocalCoord(out, elFrom, elTarget, inX, inY) {\n        return transformCoordWithViewport(_calcOut, elFrom, inX, inY, true)\n            && transformCoordWithViewport(out, elTarget, _calcOut[0], _calcOut[1]);\n    }\n    function transformCoordWithViewport(out, el, inX, inY, inverse) {\n        if (el.getBoundingClientRect && env.domSupported && !isCanvasEl(el)) {\n            var saved = el[EVENT_SAVED_PROP] || (el[EVENT_SAVED_PROP] = {});\n            var markers = prepareCoordMarkers(el, saved);\n            var transformer = preparePointerTransformer(markers, saved, inverse);\n            if (transformer) {\n                transformer(out, inX, inY);\n                return true;\n            }\n        }\n        return false;\n    }\n    function prepareCoordMarkers(el, saved) {\n        var markers = saved.markers;\n        if (markers) {\n            return markers;\n        }\n        markers = saved.markers = [];\n        var propLR = ['left', 'right'];\n        var propTB = ['top', 'bottom'];\n        for (var i = 0; i < 4; i++) {\n            var marker = document.createElement('div');\n            var stl = marker.style;\n            var idxLR = i % 2;\n            var idxTB = (i >> 1) % 2;\n            stl.cssText = [\n                'position: absolute',\n                'visibility: hidden',\n                'padding: 0',\n                'margin: 0',\n                'border-width: 0',\n                'user-select: none',\n                'width:0',\n                'height:0',\n                propLR[idxLR] + ':0',\n                propTB[idxTB] + ':0',\n                propLR[1 - idxLR] + ':auto',\n                propTB[1 - idxTB] + ':auto',\n                ''\n            ].join('!important;');\n            el.appendChild(marker);\n            markers.push(marker);\n        }\n        return markers;\n    }\n    function preparePointerTransformer(markers, saved, inverse) {\n        var transformerName = inverse ? 'invTrans' : 'trans';\n        var transformer = saved[transformerName];\n        var oldSrcCoords = saved.srcCoords;\n        var srcCoords = [];\n        var destCoords = [];\n        var oldCoordTheSame = true;\n        for (var i = 0; i < 4; i++) {\n            var rect = markers[i].getBoundingClientRect();\n            var ii = 2 * i;\n            var x = rect.left;\n            var y = rect.top;\n            srcCoords.push(x, y);\n            oldCoordTheSame = oldCoordTheSame && oldSrcCoords && x === oldSrcCoords[ii] && y === oldSrcCoords[ii + 1];\n            destCoords.push(markers[i].offsetLeft, markers[i].offsetTop);\n        }\n        return (oldCoordTheSame && transformer)\n            ? transformer\n            : (saved.srcCoords = srcCoords,\n                saved[transformerName] = inverse\n                    ? buildTransformer(destCoords, srcCoords)\n                    : buildTransformer(srcCoords, destCoords));\n    }\n    function isCanvasEl(el) {\n        return el.nodeName.toUpperCase() === 'CANVAS';\n    }\n    var replaceReg = /([&<>\"'])/g;\n    var replaceMap = {\n        '&': '&amp;',\n        '<': '&lt;',\n        '>': '&gt;',\n        '\"': '&quot;',\n        '\\'': '&#39;'\n    };\n    function encodeHTML(source) {\n        return source == null\n            ? ''\n            : (source + '').replace(replaceReg, function (str, c) {\n                return replaceMap[c];\n            });\n    }\n\n    var MOUSE_EVENT_REG = /^(?:mouse|pointer|contextmenu|drag|drop)|click/;\n    var _calcOut$1 = [];\n    var firefoxNotSupportOffsetXY = env.browser.firefox\n        && +env.browser.version.split('.')[0] < 39;\n    function clientToLocal(el, e, out, calculate) {\n        out = out || {};\n        if (calculate) {\n            calculateZrXY(el, e, out);\n        }\n        else if (firefoxNotSupportOffsetXY\n            && e.layerX != null\n            && e.layerX !== e.offsetX) {\n            out.zrX = e.layerX;\n            out.zrY = e.layerY;\n        }\n        else if (e.offsetX != null) {\n            out.zrX = e.offsetX;\n            out.zrY = e.offsetY;\n        }\n        else {\n            calculateZrXY(el, e, out);\n        }\n        return out;\n    }\n    function calculateZrXY(el, e, out) {\n        if (env.domSupported && el.getBoundingClientRect) {\n            var ex = e.clientX;\n            var ey = e.clientY;\n            if (isCanvasEl(el)) {\n                var box = el.getBoundingClientRect();\n                out.zrX = ex - box.left;\n                out.zrY = ey - box.top;\n                return;\n            }\n            else {\n                if (transformCoordWithViewport(_calcOut$1, el, ex, ey)) {\n                    out.zrX = _calcOut$1[0];\n                    out.zrY = _calcOut$1[1];\n                    return;\n                }\n            }\n        }\n        out.zrX = out.zrY = 0;\n    }\n    function getNativeEvent(e) {\n        return e\n            || window.event;\n    }\n    function normalizeEvent(el, e, calculate) {\n        e = getNativeEvent(e);\n        if (e.zrX != null) {\n            return e;\n        }\n        var eventType = e.type;\n        var isTouch = eventType && eventType.indexOf('touch') >= 0;\n        if (!isTouch) {\n            clientToLocal(el, e, e, calculate);\n            var wheelDelta = getWheelDeltaMayPolyfill(e);\n            e.zrDelta = wheelDelta ? wheelDelta / 120 : -(e.detail || 0) / 3;\n        }\n        else {\n            var touch = eventType !== 'touchend'\n                ? e.targetTouches[0]\n                : e.changedTouches[0];\n            touch && clientToLocal(el, touch, e, calculate);\n        }\n        var button = e.button;\n        if (e.which == null && button !== undefined && MOUSE_EVENT_REG.test(e.type)) {\n            e.which = (button & 1 ? 1 : (button & 2 ? 3 : (button & 4 ? 2 : 0)));\n        }\n        return e;\n    }\n    function getWheelDeltaMayPolyfill(e) {\n        var rawWheelDelta = e.wheelDelta;\n        if (rawWheelDelta) {\n            return rawWheelDelta;\n        }\n        var deltaX = e.deltaX;\n        var deltaY = e.deltaY;\n        if (deltaX == null || deltaY == null) {\n            return rawWheelDelta;\n        }\n        var delta = deltaY !== 0 ? Math.abs(deltaY) : Math.abs(deltaX);\n        var sign = deltaY > 0 ? -1\n            : deltaY < 0 ? 1\n                : deltaX > 0 ? -1\n                    : 1;\n        return 3 * delta * sign;\n    }\n    function addEventListener(el, name, handler, opt) {\n        el.addEventListener(name, handler, opt);\n    }\n    function removeEventListener(el, name, handler, opt) {\n        el.removeEventListener(name, handler, opt);\n    }\n    var stop = function (e) {\n        e.preventDefault();\n        e.stopPropagation();\n        e.cancelBubble = true;\n    };\n    function isMiddleOrRightButtonOnMouseUpDown(e) {\n        return e.which === 2 || e.which === 3;\n    }\n\n    var GestureMgr = (function () {\n        function GestureMgr() {\n            this._track = [];\n        }\n        GestureMgr.prototype.recognize = function (event, target, root) {\n            this._doTrack(event, target, root);\n            return this._recognize(event);\n        };\n        GestureMgr.prototype.clear = function () {\n            this._track.length = 0;\n            return this;\n        };\n        GestureMgr.prototype._doTrack = function (event, target, root) {\n            var touches = event.touches;\n            if (!touches) {\n                return;\n            }\n            var trackItem = {\n                points: [],\n                touches: [],\n                target: target,\n                event: event\n            };\n            for (var i = 0, len = touches.length; i < len; i++) {\n                var touch = touches[i];\n                var pos = clientToLocal(root, touch, {});\n                trackItem.points.push([pos.zrX, pos.zrY]);\n                trackItem.touches.push(touch);\n            }\n            this._track.push(trackItem);\n        };\n        GestureMgr.prototype._recognize = function (event) {\n            for (var eventName in recognizers) {\n                if (recognizers.hasOwnProperty(eventName)) {\n                    var gestureInfo = recognizers[eventName](this._track, event);\n                    if (gestureInfo) {\n                        return gestureInfo;\n                    }\n                }\n            }\n        };\n        return GestureMgr;\n    }());\n    function dist$1(pointPair) {\n        var dx = pointPair[1][0] - pointPair[0][0];\n        var dy = pointPair[1][1] - pointPair[0][1];\n        return Math.sqrt(dx * dx + dy * dy);\n    }\n    function center(pointPair) {\n        return [\n            (pointPair[0][0] + pointPair[1][0]) / 2,\n            (pointPair[0][1] + pointPair[1][1]) / 2\n        ];\n    }\n    var recognizers = {\n        pinch: function (tracks, event) {\n            var trackLen = tracks.length;\n            if (!trackLen) {\n                return;\n            }\n            var pinchEnd = (tracks[trackLen - 1] || {}).points;\n            var pinchPre = (tracks[trackLen - 2] || {}).points || pinchEnd;\n            if (pinchPre\n                && pinchPre.length > 1\n                && pinchEnd\n                && pinchEnd.length > 1) {\n                var pinchScale = dist$1(pinchEnd) / dist$1(pinchPre);\n                !isFinite(pinchScale) && (pinchScale = 1);\n                event.pinchScale = pinchScale;\n                var pinchCenter = center(pinchEnd);\n                event.pinchX = pinchCenter[0];\n                event.pinchY = pinchCenter[1];\n                return {\n                    type: 'pinch',\n                    target: tracks[0].target,\n                    event: event\n                };\n            }\n        }\n    };\n\n    function create$1() {\n        return [1, 0, 0, 1, 0, 0];\n    }\n    function identity(out) {\n        out[0] = 1;\n        out[1] = 0;\n        out[2] = 0;\n        out[3] = 1;\n        out[4] = 0;\n        out[5] = 0;\n        return out;\n    }\n    function copy$1(out, m) {\n        out[0] = m[0];\n        out[1] = m[1];\n        out[2] = m[2];\n        out[3] = m[3];\n        out[4] = m[4];\n        out[5] = m[5];\n        return out;\n    }\n    function mul$1(out, m1, m2) {\n        var out0 = m1[0] * m2[0] + m1[2] * m2[1];\n        var out1 = m1[1] * m2[0] + m1[3] * m2[1];\n        var out2 = m1[0] * m2[2] + m1[2] * m2[3];\n        var out3 = m1[1] * m2[2] + m1[3] * m2[3];\n        var out4 = m1[0] * m2[4] + m1[2] * m2[5] + m1[4];\n        var out5 = m1[1] * m2[4] + m1[3] * m2[5] + m1[5];\n        out[0] = out0;\n        out[1] = out1;\n        out[2] = out2;\n        out[3] = out3;\n        out[4] = out4;\n        out[5] = out5;\n        return out;\n    }\n    function translate(out, a, v) {\n        out[0] = a[0];\n        out[1] = a[1];\n        out[2] = a[2];\n        out[3] = a[3];\n        out[4] = a[4] + v[0];\n        out[5] = a[5] + v[1];\n        return out;\n    }\n    function rotate(out, a, rad, pivot) {\n        if (pivot === void 0) { pivot = [0, 0]; }\n        var aa = a[0];\n        var ac = a[2];\n        var atx = a[4];\n        var ab = a[1];\n        var ad = a[3];\n        var aty = a[5];\n        var st = Math.sin(rad);\n        var ct = Math.cos(rad);\n        out[0] = aa * ct + ab * st;\n        out[1] = -aa * st + ab * ct;\n        out[2] = ac * ct + ad * st;\n        out[3] = -ac * st + ct * ad;\n        out[4] = ct * (atx - pivot[0]) + st * (aty - pivot[1]) + pivot[0];\n        out[5] = ct * (aty - pivot[1]) - st * (atx - pivot[0]) + pivot[1];\n        return out;\n    }\n    function scale$1(out, a, v) {\n        var vx = v[0];\n        var vy = v[1];\n        out[0] = a[0] * vx;\n        out[1] = a[1] * vy;\n        out[2] = a[2] * vx;\n        out[3] = a[3] * vy;\n        out[4] = a[4] * vx;\n        out[5] = a[5] * vy;\n        return out;\n    }\n    function invert(out, a) {\n        var aa = a[0];\n        var ac = a[2];\n        var atx = a[4];\n        var ab = a[1];\n        var ad = a[3];\n        var aty = a[5];\n        var det = aa * ad - ab * ac;\n        if (!det) {\n            return null;\n        }\n        det = 1.0 / det;\n        out[0] = ad * det;\n        out[1] = -ab * det;\n        out[2] = -ac * det;\n        out[3] = aa * det;\n        out[4] = (ac * aty - ad * atx) * det;\n        out[5] = (ab * atx - aa * aty) * det;\n        return out;\n    }\n    function clone$2(a) {\n        var b = create$1();\n        copy$1(b, a);\n        return b;\n    }\n\n    var matrix = /*#__PURE__*/Object.freeze({\n        __proto__: null,\n        create: create$1,\n        identity: identity,\n        copy: copy$1,\n        mul: mul$1,\n        translate: translate,\n        rotate: rotate,\n        scale: scale$1,\n        invert: invert,\n        clone: clone$2\n    });\n\n    var Point = (function () {\n        function Point(x, y) {\n            this.x = x || 0;\n            this.y = y || 0;\n        }\n        Point.prototype.copy = function (other) {\n            this.x = other.x;\n            this.y = other.y;\n            return this;\n        };\n        Point.prototype.clone = function () {\n            return new Point(this.x, this.y);\n        };\n        Point.prototype.set = function (x, y) {\n            this.x = x;\n            this.y = y;\n            return this;\n        };\n        Point.prototype.equal = function (other) {\n            return other.x === this.x && other.y === this.y;\n        };\n        Point.prototype.add = function (other) {\n            this.x += other.x;\n            this.y += other.y;\n            return this;\n        };\n        Point.prototype.scale = function (scalar) {\n            this.x *= scalar;\n            this.y *= scalar;\n        };\n        Point.prototype.scaleAndAdd = function (other, scalar) {\n            this.x += other.x * scalar;\n            this.y += other.y * scalar;\n        };\n        Point.prototype.sub = function (other) {\n            this.x -= other.x;\n            this.y -= other.y;\n            return this;\n        };\n        Point.prototype.dot = function (other) {\n            return this.x * other.x + this.y * other.y;\n        };\n        Point.prototype.len = function () {\n            return Math.sqrt(this.x * this.x + this.y * this.y);\n        };\n        Point.prototype.lenSquare = function () {\n            return this.x * this.x + this.y * this.y;\n        };\n        Point.prototype.normalize = function () {\n            var len = this.len();\n            this.x /= len;\n            this.y /= len;\n            return this;\n        };\n        Point.prototype.distance = function (other) {\n            var dx = this.x - other.x;\n            var dy = this.y - other.y;\n            return Math.sqrt(dx * dx + dy * dy);\n        };\n        Point.prototype.distanceSquare = function (other) {\n            var dx = this.x - other.x;\n            var dy = this.y - other.y;\n            return dx * dx + dy * dy;\n        };\n        Point.prototype.negate = function () {\n            this.x = -this.x;\n            this.y = -this.y;\n            return this;\n        };\n        Point.prototype.transform = function (m) {\n            if (!m) {\n                return;\n            }\n            var x = this.x;\n            var y = this.y;\n            this.x = m[0] * x + m[2] * y + m[4];\n            this.y = m[1] * x + m[3] * y + m[5];\n            return this;\n        };\n        Point.prototype.toArray = function (out) {\n            out[0] = this.x;\n            out[1] = this.y;\n            return out;\n        };\n        Point.prototype.fromArray = function (input) {\n            this.x = input[0];\n            this.y = input[1];\n        };\n        Point.set = function (p, x, y) {\n            p.x = x;\n            p.y = y;\n        };\n        Point.copy = function (p, p2) {\n            p.x = p2.x;\n            p.y = p2.y;\n        };\n        Point.len = function (p) {\n            return Math.sqrt(p.x * p.x + p.y * p.y);\n        };\n        Point.lenSquare = function (p) {\n            return p.x * p.x + p.y * p.y;\n        };\n        Point.dot = function (p0, p1) {\n            return p0.x * p1.x + p0.y * p1.y;\n        };\n        Point.add = function (out, p0, p1) {\n            out.x = p0.x + p1.x;\n            out.y = p0.y + p1.y;\n        };\n        Point.sub = function (out, p0, p1) {\n            out.x = p0.x - p1.x;\n            out.y = p0.y - p1.y;\n        };\n        Point.scale = function (out, p0, scalar) {\n            out.x = p0.x * scalar;\n            out.y = p0.y * scalar;\n        };\n        Point.scaleAndAdd = function (out, p0, p1, scalar) {\n            out.x = p0.x + p1.x * scalar;\n            out.y = p0.y + p1.y * scalar;\n        };\n        Point.lerp = function (out, p0, p1, t) {\n            var onet = 1 - t;\n            out.x = onet * p0.x + t * p1.x;\n            out.y = onet * p0.y + t * p1.y;\n        };\n        return Point;\n    }());\n\n    var mathMin = Math.min;\n    var mathMax = Math.max;\n    var lt = new Point();\n    var rb = new Point();\n    var lb = new Point();\n    var rt = new Point();\n    var minTv = new Point();\n    var maxTv = new Point();\n    var BoundingRect = (function () {\n        function BoundingRect(x, y, width, height) {\n            if (width < 0) {\n                x = x + width;\n                width = -width;\n            }\n            if (height < 0) {\n                y = y + height;\n                height = -height;\n            }\n            this.x = x;\n            this.y = y;\n            this.width = width;\n            this.height = height;\n        }\n        BoundingRect.prototype.union = function (other) {\n            var x = mathMin(other.x, this.x);\n            var y = mathMin(other.y, this.y);\n            if (isFinite(this.x) && isFinite(this.width)) {\n                this.width = mathMax(other.x + other.width, this.x + this.width) - x;\n            }\n            else {\n                this.width = other.width;\n            }\n            if (isFinite(this.y) && isFinite(this.height)) {\n                this.height = mathMax(other.y + other.height, this.y + this.height) - y;\n            }\n            else {\n                this.height = other.height;\n            }\n            this.x = x;\n            this.y = y;\n        };\n        BoundingRect.prototype.applyTransform = function (m) {\n            BoundingRect.applyTransform(this, this, m);\n        };\n        BoundingRect.prototype.calculateTransform = function (b) {\n            var a = this;\n            var sx = b.width / a.width;\n            var sy = b.height / a.height;\n            var m = create$1();\n            translate(m, m, [-a.x, -a.y]);\n            scale$1(m, m, [sx, sy]);\n            translate(m, m, [b.x, b.y]);\n            return m;\n        };\n        BoundingRect.prototype.intersect = function (b, mtv) {\n            if (!b) {\n                return false;\n            }\n            if (!(b instanceof BoundingRect)) {\n                b = BoundingRect.create(b);\n            }\n            var a = this;\n            var ax0 = a.x;\n            var ax1 = a.x + a.width;\n            var ay0 = a.y;\n            var ay1 = a.y + a.height;\n            var bx0 = b.x;\n            var bx1 = b.x + b.width;\n            var by0 = b.y;\n            var by1 = b.y + b.height;\n            var overlap = !(ax1 < bx0 || bx1 < ax0 || ay1 < by0 || by1 < ay0);\n            if (mtv) {\n                var dMin = Infinity;\n                var dMax = 0;\n                var d0 = Math.abs(ax1 - bx0);\n                var d1 = Math.abs(bx1 - ax0);\n                var d2 = Math.abs(ay1 - by0);\n                var d3 = Math.abs(by1 - ay0);\n                var dx = Math.min(d0, d1);\n                var dy = Math.min(d2, d3);\n                if (ax1 < bx0 || bx1 < ax0) {\n                    if (dx > dMax) {\n                        dMax = dx;\n                        if (d0 < d1) {\n                            Point.set(maxTv, -d0, 0);\n                        }\n                        else {\n                            Point.set(maxTv, d1, 0);\n                        }\n                    }\n                }\n                else {\n                    if (dx < dMin) {\n                        dMin = dx;\n                        if (d0 < d1) {\n                            Point.set(minTv, d0, 0);\n                        }\n                        else {\n                            Point.set(minTv, -d1, 0);\n                        }\n                    }\n                }\n                if (ay1 < by0 || by1 < ay0) {\n                    if (dy > dMax) {\n                        dMax = dy;\n                        if (d2 < d3) {\n                            Point.set(maxTv, 0, -d2);\n                        }\n                        else {\n                            Point.set(maxTv, 0, d3);\n                        }\n                    }\n                }\n                else {\n                    if (dx < dMin) {\n                        dMin = dx;\n                        if (d2 < d3) {\n                            Point.set(minTv, 0, d2);\n                        }\n                        else {\n                            Point.set(minTv, 0, -d3);\n                        }\n                    }\n                }\n            }\n            if (mtv) {\n                Point.copy(mtv, overlap ? minTv : maxTv);\n            }\n            return overlap;\n        };\n        BoundingRect.prototype.contain = function (x, y) {\n            var rect = this;\n            return x >= rect.x\n                && x <= (rect.x + rect.width)\n                && y >= rect.y\n                && y <= (rect.y + rect.height);\n        };\n        BoundingRect.prototype.clone = function () {\n            return new BoundingRect(this.x, this.y, this.width, this.height);\n        };\n        BoundingRect.prototype.copy = function (other) {\n            BoundingRect.copy(this, other);\n        };\n        BoundingRect.prototype.plain = function () {\n            return {\n                x: this.x,\n                y: this.y,\n                width: this.width,\n                height: this.height\n            };\n        };\n        BoundingRect.prototype.isFinite = function () {\n            return isFinite(this.x)\n                && isFinite(this.y)\n                && isFinite(this.width)\n                && isFinite(this.height);\n        };\n        BoundingRect.prototype.isZero = function () {\n            return this.width === 0 || this.height === 0;\n        };\n        BoundingRect.create = function (rect) {\n            return new BoundingRect(rect.x, rect.y, rect.width, rect.height);\n        };\n        BoundingRect.copy = function (target, source) {\n            target.x = source.x;\n            target.y = source.y;\n            target.width = source.width;\n            target.height = source.height;\n        };\n        BoundingRect.applyTransform = function (target, source, m) {\n            if (!m) {\n                if (target !== source) {\n                    BoundingRect.copy(target, source);\n                }\n                return;\n            }\n            if (m[1] < 1e-5 && m[1] > -1e-5 && m[2] < 1e-5 && m[2] > -1e-5) {\n                var sx = m[0];\n                var sy = m[3];\n                var tx = m[4];\n                var ty = m[5];\n                target.x = source.x * sx + tx;\n                target.y = source.y * sy + ty;\n                target.width = source.width * sx;\n                target.height = source.height * sy;\n                if (target.width < 0) {\n                    target.x += target.width;\n                    target.width = -target.width;\n                }\n                if (target.height < 0) {\n                    target.y += target.height;\n                    target.height = -target.height;\n                }\n                return;\n            }\n            lt.x = lb.x = source.x;\n            lt.y = rt.y = source.y;\n            rb.x = rt.x = source.x + source.width;\n            rb.y = lb.y = source.y + source.height;\n            lt.transform(m);\n            rt.transform(m);\n            rb.transform(m);\n            lb.transform(m);\n            target.x = mathMin(lt.x, rb.x, lb.x, rt.x);\n            target.y = mathMin(lt.y, rb.y, lb.y, rt.y);\n            var maxX = mathMax(lt.x, rb.x, lb.x, rt.x);\n            var maxY = mathMax(lt.y, rb.y, lb.y, rt.y);\n            target.width = maxX - target.x;\n            target.height = maxY - target.y;\n        };\n        return BoundingRect;\n    }());\n\n    var SILENT = 'silent';\n    function makeEventPacket(eveType, targetInfo, event) {\n        return {\n            type: eveType,\n            event: event,\n            target: targetInfo.target,\n            topTarget: targetInfo.topTarget,\n            cancelBubble: false,\n            offsetX: event.zrX,\n            offsetY: event.zrY,\n            gestureEvent: event.gestureEvent,\n            pinchX: event.pinchX,\n            pinchY: event.pinchY,\n            pinchScale: event.pinchScale,\n            wheelDelta: event.zrDelta,\n            zrByTouch: event.zrByTouch,\n            which: event.which,\n            stop: stopEvent\n        };\n    }\n    function stopEvent() {\n        stop(this.event);\n    }\n    var EmptyProxy = (function (_super) {\n        __extends(EmptyProxy, _super);\n        function EmptyProxy() {\n            var _this = _super !== null && _super.apply(this, arguments) || this;\n            _this.handler = null;\n            return _this;\n        }\n        EmptyProxy.prototype.dispose = function () { };\n        EmptyProxy.prototype.setCursor = function () { };\n        return EmptyProxy;\n    }(Eventful));\n    var HoveredResult = (function () {\n        function HoveredResult(x, y) {\n            this.x = x;\n            this.y = y;\n        }\n        return HoveredResult;\n    }());\n    var handlerNames = [\n        'click', 'dblclick', 'mousewheel', 'mouseout',\n        'mouseup', 'mousedown', 'mousemove', 'contextmenu'\n    ];\n    var tmpRect = new BoundingRect(0, 0, 0, 0);\n    var Handler = (function (_super) {\n        __extends(Handler, _super);\n        function Handler(storage, painter, proxy, painterRoot, pointerSize) {\n            var _this = _super.call(this) || this;\n            _this._hovered = new HoveredResult(0, 0);\n            _this.storage = storage;\n            _this.painter = painter;\n            _this.painterRoot = painterRoot;\n            _this._pointerSize = pointerSize;\n            proxy = proxy || new EmptyProxy();\n            _this.proxy = null;\n            _this.setHandlerProxy(proxy);\n            _this._draggingMgr = new Draggable(_this);\n            return _this;\n        }\n        Handler.prototype.setHandlerProxy = function (proxy) {\n            if (this.proxy) {\n                this.proxy.dispose();\n            }\n            if (proxy) {\n                each(handlerNames, function (name) {\n                    proxy.on && proxy.on(name, this[name], this);\n                }, this);\n                proxy.handler = this;\n            }\n            this.proxy = proxy;\n        };\n        Handler.prototype.mousemove = function (event) {\n            var x = event.zrX;\n            var y = event.zrY;\n            var isOutside = isOutsideBoundary(this, x, y);\n            var lastHovered = this._hovered;\n            var lastHoveredTarget = lastHovered.target;\n            if (lastHoveredTarget && !lastHoveredTarget.__zr) {\n                lastHovered = this.findHover(lastHovered.x, lastHovered.y);\n                lastHoveredTarget = lastHovered.target;\n            }\n            var hovered = this._hovered = isOutside ? new HoveredResult(x, y) : this.findHover(x, y);\n            var hoveredTarget = hovered.target;\n            var proxy = this.proxy;\n            proxy.setCursor && proxy.setCursor(hoveredTarget ? hoveredTarget.cursor : 'default');\n            if (lastHoveredTarget && hoveredTarget !== lastHoveredTarget) {\n                this.dispatchToElement(lastHovered, 'mouseout', event);\n            }\n            this.dispatchToElement(hovered, 'mousemove', event);\n            if (hoveredTarget && hoveredTarget !== lastHoveredTarget) {\n                this.dispatchToElement(hovered, 'mouseover', event);\n            }\n        };\n        Handler.prototype.mouseout = function (event) {\n            var eventControl = event.zrEventControl;\n            if (eventControl !== 'only_globalout') {\n                this.dispatchToElement(this._hovered, 'mouseout', event);\n            }\n            if (eventControl !== 'no_globalout') {\n                this.trigger('globalout', { type: 'globalout', event: event });\n            }\n        };\n        Handler.prototype.resize = function () {\n            this._hovered = new HoveredResult(0, 0);\n        };\n        Handler.prototype.dispatch = function (eventName, eventArgs) {\n            var handler = this[eventName];\n            handler && handler.call(this, eventArgs);\n        };\n        Handler.prototype.dispose = function () {\n            this.proxy.dispose();\n            this.storage = null;\n            this.proxy = null;\n            this.painter = null;\n        };\n        Handler.prototype.setCursorStyle = function (cursorStyle) {\n            var proxy = this.proxy;\n            proxy.setCursor && proxy.setCursor(cursorStyle);\n        };\n        Handler.prototype.dispatchToElement = function (targetInfo, eventName, event) {\n            targetInfo = targetInfo || {};\n            var el = targetInfo.target;\n            if (el && el.silent) {\n                return;\n            }\n            var eventKey = ('on' + eventName);\n            var eventPacket = makeEventPacket(eventName, targetInfo, event);\n            while (el) {\n                el[eventKey]\n                    && (eventPacket.cancelBubble = !!el[eventKey].call(el, eventPacket));\n                el.trigger(eventName, eventPacket);\n                el = el.__hostTarget ? el.__hostTarget : el.parent;\n                if (eventPacket.cancelBubble) {\n                    break;\n                }\n            }\n            if (!eventPacket.cancelBubble) {\n                this.trigger(eventName, eventPacket);\n                if (this.painter && this.painter.eachOtherLayer) {\n                    this.painter.eachOtherLayer(function (layer) {\n                        if (typeof (layer[eventKey]) === 'function') {\n                            layer[eventKey].call(layer, eventPacket);\n                        }\n                        if (layer.trigger) {\n                            layer.trigger(eventName, eventPacket);\n                        }\n                    });\n                }\n            }\n        };\n        Handler.prototype.findHover = function (x, y, exclude) {\n            var list = this.storage.getDisplayList();\n            var out = new HoveredResult(x, y);\n            setHoverTarget(list, out, x, y, exclude);\n            if (this._pointerSize && !out.target) {\n                var candidates = [];\n                var pointerSize = this._pointerSize;\n                var targetSizeHalf = pointerSize / 2;\n                var pointerRect = new BoundingRect(x - targetSizeHalf, y - targetSizeHalf, pointerSize, pointerSize);\n                for (var i = list.length - 1; i >= 0; i--) {\n                    var el = list[i];\n                    if (el !== exclude\n                        && !el.ignore\n                        && !el.ignoreCoarsePointer\n                        && (!el.parent || !el.parent.ignoreCoarsePointer)) {\n                        tmpRect.copy(el.getBoundingRect());\n                        if (el.transform) {\n                            tmpRect.applyTransform(el.transform);\n                        }\n                        if (tmpRect.intersect(pointerRect)) {\n                            candidates.push(el);\n                        }\n                    }\n                }\n                if (candidates.length) {\n                    var rStep = 4;\n                    var thetaStep = Math.PI / 12;\n                    var PI2 = Math.PI * 2;\n                    for (var r = 0; r < targetSizeHalf; r += rStep) {\n                        for (var theta = 0; theta < PI2; theta += thetaStep) {\n                            var x1 = x + r * Math.cos(theta);\n                            var y1 = y + r * Math.sin(theta);\n                            setHoverTarget(candidates, out, x1, y1, exclude);\n                            if (out.target) {\n                                return out;\n                            }\n                        }\n                    }\n                }\n            }\n            return out;\n        };\n        Handler.prototype.processGesture = function (event, stage) {\n            if (!this._gestureMgr) {\n                this._gestureMgr = new GestureMgr();\n            }\n            var gestureMgr = this._gestureMgr;\n            stage === 'start' && gestureMgr.clear();\n            var gestureInfo = gestureMgr.recognize(event, this.findHover(event.zrX, event.zrY, null).target, this.proxy.dom);\n            stage === 'end' && gestureMgr.clear();\n            if (gestureInfo) {\n                var type = gestureInfo.type;\n                event.gestureEvent = type;\n                var res = new HoveredResult();\n                res.target = gestureInfo.target;\n                this.dispatchToElement(res, type, gestureInfo.event);\n            }\n        };\n        return Handler;\n    }(Eventful));\n    each(['click', 'mousedown', 'mouseup', 'mousewheel', 'dblclick', 'contextmenu'], function (name) {\n        Handler.prototype[name] = function (event) {\n            var x = event.zrX;\n            var y = event.zrY;\n            var isOutside = isOutsideBoundary(this, x, y);\n            var hovered;\n            var hoveredTarget;\n            if (name !== 'mouseup' || !isOutside) {\n                hovered = this.findHover(x, y);\n                hoveredTarget = hovered.target;\n            }\n            if (name === 'mousedown') {\n                this._downEl = hoveredTarget;\n                this._downPoint = [event.zrX, event.zrY];\n                this._upEl = hoveredTarget;\n            }\n            else if (name === 'mouseup') {\n                this._upEl = hoveredTarget;\n            }\n            else if (name === 'click') {\n                if (this._downEl !== this._upEl\n                    || !this._downPoint\n                    || dist(this._downPoint, [event.zrX, event.zrY]) > 4) {\n                    return;\n                }\n                this._downPoint = null;\n            }\n            this.dispatchToElement(hovered, name, event);\n        };\n    });\n    function isHover(displayable, x, y) {\n        if (displayable[displayable.rectHover ? 'rectContain' : 'contain'](x, y)) {\n            var el = displayable;\n            var isSilent = void 0;\n            var ignoreClip = false;\n            while (el) {\n                if (el.ignoreClip) {\n                    ignoreClip = true;\n                }\n                if (!ignoreClip) {\n                    var clipPath = el.getClipPath();\n                    if (clipPath && !clipPath.contain(x, y)) {\n                        return false;\n                    }\n                }\n                if (el.silent) {\n                    isSilent = true;\n                }\n                var hostEl = el.__hostTarget;\n                el = hostEl ? hostEl : el.parent;\n            }\n            return isSilent ? SILENT : true;\n        }\n        return false;\n    }\n    function setHoverTarget(list, out, x, y, exclude) {\n        for (var i = list.length - 1; i >= 0; i--) {\n            var el = list[i];\n            var hoverCheckResult = void 0;\n            if (el !== exclude\n                && !el.ignore\n                && (hoverCheckResult = isHover(el, x, y))) {\n                !out.topTarget && (out.topTarget = el);\n                if (hoverCheckResult !== SILENT) {\n                    out.target = el;\n                    break;\n                }\n            }\n        }\n    }\n    function isOutsideBoundary(handlerInstance, x, y) {\n        var painter = handlerInstance.painter;\n        return x < 0 || x > painter.getWidth() || y < 0 || y > painter.getHeight();\n    }\n\n    var DEFAULT_MIN_MERGE = 32;\n    var DEFAULT_MIN_GALLOPING = 7;\n    function minRunLength(n) {\n        var r = 0;\n        while (n >= DEFAULT_MIN_MERGE) {\n            r |= n & 1;\n            n >>= 1;\n        }\n        return n + r;\n    }\n    function makeAscendingRun(array, lo, hi, compare) {\n        var runHi = lo + 1;\n        if (runHi === hi) {\n            return 1;\n        }\n        if (compare(array[runHi++], array[lo]) < 0) {\n            while (runHi < hi && compare(array[runHi], array[runHi - 1]) < 0) {\n                runHi++;\n            }\n            reverseRun(array, lo, runHi);\n        }\n        else {\n            while (runHi < hi && compare(array[runHi], array[runHi - 1]) >= 0) {\n                runHi++;\n            }\n        }\n        return runHi - lo;\n    }\n    function reverseRun(array, lo, hi) {\n        hi--;\n        while (lo < hi) {\n            var t = array[lo];\n            array[lo++] = array[hi];\n            array[hi--] = t;\n        }\n    }\n    function binaryInsertionSort(array, lo, hi, start, compare) {\n        if (start === lo) {\n            start++;\n        }\n        for (; start < hi; start++) {\n            var pivot = array[start];\n            var left = lo;\n            var right = start;\n            var mid;\n            while (left < right) {\n                mid = left + right >>> 1;\n                if (compare(pivot, array[mid]) < 0) {\n                    right = mid;\n                }\n                else {\n                    left = mid + 1;\n                }\n            }\n            var n = start - left;\n            switch (n) {\n                case 3:\n                    array[left + 3] = array[left + 2];\n                case 2:\n                    array[left + 2] = array[left + 1];\n                case 1:\n                    array[left + 1] = array[left];\n                    break;\n                default:\n                    while (n > 0) {\n                        array[left + n] = array[left + n - 1];\n                        n--;\n                    }\n            }\n            array[left] = pivot;\n        }\n    }\n    function gallopLeft(value, array, start, length, hint, compare) {\n        var lastOffset = 0;\n        var maxOffset = 0;\n        var offset = 1;\n        if (compare(value, array[start + hint]) > 0) {\n            maxOffset = length - hint;\n            while (offset < maxOffset && compare(value, array[start + hint + offset]) > 0) {\n                lastOffset = offset;\n                offset = (offset << 1) + 1;\n                if (offset <= 0) {\n                    offset = maxOffset;\n                }\n            }\n            if (offset > maxOffset) {\n                offset = maxOffset;\n            }\n            lastOffset += hint;\n            offset += hint;\n        }\n        else {\n            maxOffset = hint + 1;\n            while (offset < maxOffset && compare(value, array[start + hint - offset]) <= 0) {\n                lastOffset = offset;\n                offset = (offset << 1) + 1;\n                if (offset <= 0) {\n                    offset = maxOffset;\n                }\n            }\n            if (offset > maxOffset) {\n                offset = maxOffset;\n            }\n            var tmp = lastOffset;\n            lastOffset = hint - offset;\n            offset = hint - tmp;\n        }\n        lastOffset++;\n        while (lastOffset < offset) {\n            var m = lastOffset + (offset - lastOffset >>> 1);\n            if (compare(value, array[start + m]) > 0) {\n                lastOffset = m + 1;\n            }\n            else {\n                offset = m;\n            }\n        }\n        return offset;\n    }\n    function gallopRight(value, array, start, length, hint, compare) {\n        var lastOffset = 0;\n        var maxOffset = 0;\n        var offset = 1;\n        if (compare(value, array[start + hint]) < 0) {\n            maxOffset = hint + 1;\n            while (offset < maxOffset && compare(value, array[start + hint - offset]) < 0) {\n                lastOffset = offset;\n                offset = (offset << 1) + 1;\n                if (offset <= 0) {\n                    offset = maxOffset;\n                }\n            }\n            if (offset > maxOffset) {\n                offset = maxOffset;\n            }\n            var tmp = lastOffset;\n            lastOffset = hint - offset;\n            offset = hint - tmp;\n        }\n        else {\n            maxOffset = length - hint;\n            while (offset < maxOffset && compare(value, array[start + hint + offset]) >= 0) {\n                lastOffset = offset;\n                offset = (offset << 1) + 1;\n                if (offset <= 0) {\n                    offset = maxOffset;\n                }\n            }\n            if (offset > maxOffset) {\n                offset = maxOffset;\n            }\n            lastOffset += hint;\n            offset += hint;\n        }\n        lastOffset++;\n        while (lastOffset < offset) {\n            var m = lastOffset + (offset - lastOffset >>> 1);\n            if (compare(value, array[start + m]) < 0) {\n                offset = m;\n            }\n            else {\n                lastOffset = m + 1;\n            }\n        }\n        return offset;\n    }\n    function TimSort(array, compare) {\n        var minGallop = DEFAULT_MIN_GALLOPING;\n        var runStart;\n        var runLength;\n        var stackSize = 0;\n        var tmp = [];\n        runStart = [];\n        runLength = [];\n        function pushRun(_runStart, _runLength) {\n            runStart[stackSize] = _runStart;\n            runLength[stackSize] = _runLength;\n            stackSize += 1;\n        }\n        function mergeRuns() {\n            while (stackSize > 1) {\n                var n = stackSize - 2;\n                if ((n >= 1 && runLength[n - 1] <= runLength[n] + runLength[n + 1])\n                    || (n >= 2 && runLength[n - 2] <= runLength[n] + runLength[n - 1])) {\n                    if (runLength[n - 1] < runLength[n + 1]) {\n                        n--;\n                    }\n                }\n                else if (runLength[n] > runLength[n + 1]) {\n                    break;\n                }\n                mergeAt(n);\n            }\n        }\n        function forceMergeRuns() {\n            while (stackSize > 1) {\n                var n = stackSize - 2;\n                if (n > 0 && runLength[n - 1] < runLength[n + 1]) {\n                    n--;\n                }\n                mergeAt(n);\n            }\n        }\n        function mergeAt(i) {\n            var start1 = runStart[i];\n            var length1 = runLength[i];\n            var start2 = runStart[i + 1];\n            var length2 = runLength[i + 1];\n            runLength[i] = length1 + length2;\n            if (i === stackSize - 3) {\n                runStart[i + 1] = runStart[i + 2];\n                runLength[i + 1] = runLength[i + 2];\n            }\n            stackSize--;\n            var k = gallopRight(array[start2], array, start1, length1, 0, compare);\n            start1 += k;\n            length1 -= k;\n            if (length1 === 0) {\n                return;\n            }\n            length2 = gallopLeft(array[start1 + length1 - 1], array, start2, length2, length2 - 1, compare);\n            if (length2 === 0) {\n                return;\n            }\n            if (length1 <= length2) {\n                mergeLow(start1, length1, start2, length2);\n            }\n            else {\n                mergeHigh(start1, length1, start2, length2);\n            }\n        }\n        function mergeLow(start1, length1, start2, length2) {\n            var i = 0;\n            for (i = 0; i < length1; i++) {\n                tmp[i] = array[start1 + i];\n            }\n            var cursor1 = 0;\n            var cursor2 = start2;\n            var dest = start1;\n            array[dest++] = array[cursor2++];\n            if (--length2 === 0) {\n                for (i = 0; i < length1; i++) {\n                    array[dest + i] = tmp[cursor1 + i];\n                }\n                return;\n            }\n            if (length1 === 1) {\n                for (i = 0; i < length2; i++) {\n                    array[dest + i] = array[cursor2 + i];\n                }\n                array[dest + length2] = tmp[cursor1];\n                return;\n            }\n            var _minGallop = minGallop;\n            var count1;\n            var count2;\n            var exit;\n            while (1) {\n                count1 = 0;\n                count2 = 0;\n                exit = false;\n                do {\n                    if (compare(array[cursor2], tmp[cursor1]) < 0) {\n                        array[dest++] = array[cursor2++];\n                        count2++;\n                        count1 = 0;\n                        if (--length2 === 0) {\n                            exit = true;\n                            break;\n                        }\n                    }\n                    else {\n                        array[dest++] = tmp[cursor1++];\n                        count1++;\n                        count2 = 0;\n                        if (--length1 === 1) {\n                            exit = true;\n                            break;\n                        }\n                    }\n                } while ((count1 | count2) < _minGallop);\n                if (exit) {\n                    break;\n                }\n                do {\n                    count1 = gallopRight(array[cursor2], tmp, cursor1, length1, 0, compare);\n                    if (count1 !== 0) {\n                        for (i = 0; i < count1; i++) {\n                            array[dest + i] = tmp[cursor1 + i];\n                        }\n                        dest += count1;\n                        cursor1 += count1;\n                        length1 -= count1;\n                        if (length1 <= 1) {\n                            exit = true;\n                            break;\n                        }\n                    }\n                    array[dest++] = array[cursor2++];\n                    if (--length2 === 0) {\n                        exit = true;\n                        break;\n                    }\n                    count2 = gallopLeft(tmp[cursor1], array, cursor2, length2, 0, compare);\n                    if (count2 !== 0) {\n                        for (i = 0; i < count2; i++) {\n                            array[dest + i] = array[cursor2 + i];\n                        }\n                        dest += count2;\n                        cursor2 += count2;\n                        length2 -= count2;\n                        if (length2 === 0) {\n                            exit = true;\n                            break;\n                        }\n                    }\n                    array[dest++] = tmp[cursor1++];\n                    if (--length1 === 1) {\n                        exit = true;\n                        break;\n                    }\n                    _minGallop--;\n                } while (count1 >= DEFAULT_MIN_GALLOPING || count2 >= DEFAULT_MIN_GALLOPING);\n                if (exit) {\n                    break;\n                }\n                if (_minGallop < 0) {\n                    _minGallop = 0;\n                }\n                _minGallop += 2;\n            }\n            minGallop = _minGallop;\n            minGallop < 1 && (minGallop = 1);\n            if (length1 === 1) {\n                for (i = 0; i < length2; i++) {\n                    array[dest + i] = array[cursor2 + i];\n                }\n                array[dest + length2] = tmp[cursor1];\n            }\n            else if (length1 === 0) {\n                throw new Error();\n            }\n            else {\n                for (i = 0; i < length1; i++) {\n                    array[dest + i] = tmp[cursor1 + i];\n                }\n            }\n        }\n        function mergeHigh(start1, length1, start2, length2) {\n            var i = 0;\n            for (i = 0; i < length2; i++) {\n                tmp[i] = array[start2 + i];\n            }\n            var cursor1 = start1 + length1 - 1;\n            var cursor2 = length2 - 1;\n            var dest = start2 + length2 - 1;\n            var customCursor = 0;\n            var customDest = 0;\n            array[dest--] = array[cursor1--];\n            if (--length1 === 0) {\n                customCursor = dest - (length2 - 1);\n                for (i = 0; i < length2; i++) {\n                    array[customCursor + i] = tmp[i];\n                }\n                return;\n            }\n            if (length2 === 1) {\n                dest -= length1;\n                cursor1 -= length1;\n                customDest = dest + 1;\n                customCursor = cursor1 + 1;\n                for (i = length1 - 1; i >= 0; i--) {\n                    array[customDest + i] = array[customCursor + i];\n                }\n                array[dest] = tmp[cursor2];\n                return;\n            }\n            var _minGallop = minGallop;\n            while (true) {\n                var count1 = 0;\n                var count2 = 0;\n                var exit = false;\n                do {\n                    if (compare(tmp[cursor2], array[cursor1]) < 0) {\n                        array[dest--] = array[cursor1--];\n                        count1++;\n                        count2 = 0;\n                        if (--length1 === 0) {\n                            exit = true;\n                            break;\n                        }\n                    }\n                    else {\n                        array[dest--] = tmp[cursor2--];\n                        count2++;\n                        count1 = 0;\n                        if (--length2 === 1) {\n                            exit = true;\n                            break;\n                        }\n                    }\n                } while ((count1 | count2) < _minGallop);\n                if (exit) {\n                    break;\n                }\n                do {\n                    count1 = length1 - gallopRight(tmp[cursor2], array, start1, length1, length1 - 1, compare);\n                    if (count1 !== 0) {\n                        dest -= count1;\n                        cursor1 -= count1;\n                        length1 -= count1;\n                        customDest = dest + 1;\n                        customCursor = cursor1 + 1;\n                        for (i = count1 - 1; i >= 0; i--) {\n                            array[customDest + i] = array[customCursor + i];\n                        }\n                        if (length1 === 0) {\n                            exit = true;\n                            break;\n                        }\n                    }\n                    array[dest--] = tmp[cursor2--];\n                    if (--length2 === 1) {\n                        exit = true;\n                        break;\n                    }\n                    count2 = length2 - gallopLeft(array[cursor1], tmp, 0, length2, length2 - 1, compare);\n                    if (count2 !== 0) {\n                        dest -= count2;\n                        cursor2 -= count2;\n                        length2 -= count2;\n                        customDest = dest + 1;\n                        customCursor = cursor2 + 1;\n                        for (i = 0; i < count2; i++) {\n                            array[customDest + i] = tmp[customCursor + i];\n                        }\n                        if (length2 <= 1) {\n                            exit = true;\n                            break;\n                        }\n                    }\n                    array[dest--] = array[cursor1--];\n                    if (--length1 === 0) {\n                        exit = true;\n                        break;\n                    }\n                    _minGallop--;\n                } while (count1 >= DEFAULT_MIN_GALLOPING || count2 >= DEFAULT_MIN_GALLOPING);\n                if (exit) {\n                    break;\n                }\n                if (_minGallop < 0) {\n                    _minGallop = 0;\n                }\n                _minGallop += 2;\n            }\n            minGallop = _minGallop;\n            if (minGallop < 1) {\n                minGallop = 1;\n            }\n            if (length2 === 1) {\n                dest -= length1;\n                cursor1 -= length1;\n                customDest = dest + 1;\n                customCursor = cursor1 + 1;\n                for (i = length1 - 1; i >= 0; i--) {\n                    array[customDest + i] = array[customCursor + i];\n                }\n                array[dest] = tmp[cursor2];\n            }\n            else if (length2 === 0) {\n                throw new Error();\n            }\n            else {\n                customCursor = dest - (length2 - 1);\n                for (i = 0; i < length2; i++) {\n                    array[customCursor + i] = tmp[i];\n                }\n            }\n        }\n        return {\n            mergeRuns: mergeRuns,\n            forceMergeRuns: forceMergeRuns,\n            pushRun: pushRun\n        };\n    }\n    function sort(array, compare, lo, hi) {\n        if (!lo) {\n            lo = 0;\n        }\n        if (!hi) {\n            hi = array.length;\n        }\n        var remaining = hi - lo;\n        if (remaining < 2) {\n            return;\n        }\n        var runLength = 0;\n        if (remaining < DEFAULT_MIN_MERGE) {\n            runLength = makeAscendingRun(array, lo, hi, compare);\n            binaryInsertionSort(array, lo, hi, lo + runLength, compare);\n            return;\n        }\n        var ts = TimSort(array, compare);\n        var minRun = minRunLength(remaining);\n        do {\n            runLength = makeAscendingRun(array, lo, hi, compare);\n            if (runLength < minRun) {\n                var force = remaining;\n                if (force > minRun) {\n                    force = minRun;\n                }\n                binaryInsertionSort(array, lo, lo + force, lo + runLength, compare);\n                runLength = force;\n            }\n            ts.pushRun(lo, runLength);\n            ts.mergeRuns();\n            remaining -= runLength;\n            lo += runLength;\n        } while (remaining !== 0);\n        ts.forceMergeRuns();\n    }\n\n    var REDRAW_BIT = 1;\n    var STYLE_CHANGED_BIT = 2;\n    var SHAPE_CHANGED_BIT = 4;\n\n    var invalidZErrorLogged = false;\n    function logInvalidZError() {\n        if (invalidZErrorLogged) {\n            return;\n        }\n        invalidZErrorLogged = true;\n        console.warn('z / z2 / zlevel of displayable is invalid, which may cause unexpected errors');\n    }\n    function shapeCompareFunc(a, b) {\n        if (a.zlevel === b.zlevel) {\n            if (a.z === b.z) {\n                return a.z2 - b.z2;\n            }\n            return a.z - b.z;\n        }\n        return a.zlevel - b.zlevel;\n    }\n    var Storage = (function () {\n        function Storage() {\n            this._roots = [];\n            this._displayList = [];\n            this._displayListLen = 0;\n            this.displayableSortFunc = shapeCompareFunc;\n        }\n        Storage.prototype.traverse = function (cb, context) {\n            for (var i = 0; i < this._roots.length; i++) {\n                this._roots[i].traverse(cb, context);\n            }\n        };\n        Storage.prototype.getDisplayList = function (update, includeIgnore) {\n            includeIgnore = includeIgnore || false;\n            var displayList = this._displayList;\n            if (update || !displayList.length) {\n                this.updateDisplayList(includeIgnore);\n            }\n            return displayList;\n        };\n        Storage.prototype.updateDisplayList = function (includeIgnore) {\n            this._displayListLen = 0;\n            var roots = this._roots;\n            var displayList = this._displayList;\n            for (var i = 0, len = roots.length; i < len; i++) {\n                this._updateAndAddDisplayable(roots[i], null, includeIgnore);\n            }\n            displayList.length = this._displayListLen;\n            sort(displayList, shapeCompareFunc);\n        };\n        Storage.prototype._updateAndAddDisplayable = function (el, clipPaths, includeIgnore) {\n            if (el.ignore && !includeIgnore) {\n                return;\n            }\n            el.beforeUpdate();\n            el.update();\n            el.afterUpdate();\n            var userSetClipPath = el.getClipPath();\n            if (el.ignoreClip) {\n                clipPaths = null;\n            }\n            else if (userSetClipPath) {\n                if (clipPaths) {\n                    clipPaths = clipPaths.slice();\n                }\n                else {\n                    clipPaths = [];\n                }\n                var currentClipPath = userSetClipPath;\n                var parentClipPath = el;\n                while (currentClipPath) {\n                    currentClipPath.parent = parentClipPath;\n                    currentClipPath.updateTransform();\n                    clipPaths.push(currentClipPath);\n                    parentClipPath = currentClipPath;\n                    currentClipPath = currentClipPath.getClipPath();\n                }\n            }\n            if (el.childrenRef) {\n                var children = el.childrenRef();\n                for (var i = 0; i < children.length; i++) {\n                    var child = children[i];\n                    if (el.__dirty) {\n                        child.__dirty |= REDRAW_BIT;\n                    }\n                    this._updateAndAddDisplayable(child, clipPaths, includeIgnore);\n                }\n                el.__dirty = 0;\n            }\n            else {\n                var disp = el;\n                if (clipPaths && clipPaths.length) {\n                    disp.__clipPaths = clipPaths;\n                }\n                else if (disp.__clipPaths && disp.__clipPaths.length > 0) {\n                    disp.__clipPaths = [];\n                }\n                if (isNaN(disp.z)) {\n                    logInvalidZError();\n                    disp.z = 0;\n                }\n                if (isNaN(disp.z2)) {\n                    logInvalidZError();\n                    disp.z2 = 0;\n                }\n                if (isNaN(disp.zlevel)) {\n                    logInvalidZError();\n                    disp.zlevel = 0;\n                }\n                this._displayList[this._displayListLen++] = disp;\n            }\n            var decalEl = el.getDecalElement && el.getDecalElement();\n            if (decalEl) {\n                this._updateAndAddDisplayable(decalEl, clipPaths, includeIgnore);\n            }\n            var textGuide = el.getTextGuideLine();\n            if (textGuide) {\n                this._updateAndAddDisplayable(textGuide, clipPaths, includeIgnore);\n            }\n            var textEl = el.getTextContent();\n            if (textEl) {\n                this._updateAndAddDisplayable(textEl, clipPaths, includeIgnore);\n            }\n        };\n        Storage.prototype.addRoot = function (el) {\n            if (el.__zr && el.__zr.storage === this) {\n                return;\n            }\n            this._roots.push(el);\n        };\n        Storage.prototype.delRoot = function (el) {\n            if (el instanceof Array) {\n                for (var i = 0, l = el.length; i < l; i++) {\n                    this.delRoot(el[i]);\n                }\n                return;\n            }\n            var idx = indexOf(this._roots, el);\n            if (idx >= 0) {\n                this._roots.splice(idx, 1);\n            }\n        };\n        Storage.prototype.delAllRoots = function () {\n            this._roots = [];\n            this._displayList = [];\n            this._displayListLen = 0;\n            return;\n        };\n        Storage.prototype.getRoots = function () {\n            return this._roots;\n        };\n        Storage.prototype.dispose = function () {\n            this._displayList = null;\n            this._roots = null;\n        };\n        return Storage;\n    }());\n\n    var requestAnimationFrame;\n    requestAnimationFrame = (env.hasGlobalWindow\n        && ((window.requestAnimationFrame && window.requestAnimationFrame.bind(window))\n            || (window.msRequestAnimationFrame && window.msRequestAnimationFrame.bind(window))\n            || window.mozRequestAnimationFrame\n            || window.webkitRequestAnimationFrame)) || function (func) {\n        return setTimeout(func, 16);\n    };\n    var requestAnimationFrame$1 = requestAnimationFrame;\n\n    var easingFuncs = {\n        linear: function (k) {\n            return k;\n        },\n        quadraticIn: function (k) {\n            return k * k;\n        },\n        quadraticOut: function (k) {\n            return k * (2 - k);\n        },\n        quadraticInOut: function (k) {\n            if ((k *= 2) < 1) {\n                return 0.5 * k * k;\n            }\n            return -0.5 * (--k * (k - 2) - 1);\n        },\n        cubicIn: function (k) {\n            return k * k * k;\n        },\n        cubicOut: function (k) {\n            return --k * k * k + 1;\n        },\n        cubicInOut: function (k) {\n            if ((k *= 2) < 1) {\n                return 0.5 * k * k * k;\n            }\n            return 0.5 * ((k -= 2) * k * k + 2);\n        },\n        quarticIn: function (k) {\n            return k * k * k * k;\n        },\n        quarticOut: function (k) {\n            return 1 - (--k * k * k * k);\n        },\n        quarticInOut: function (k) {\n            if ((k *= 2) < 1) {\n                return 0.5 * k * k * k * k;\n            }\n            return -0.5 * ((k -= 2) * k * k * k - 2);\n        },\n        quinticIn: function (k) {\n            return k * k * k * k * k;\n        },\n        quinticOut: function (k) {\n            return --k * k * k * k * k + 1;\n        },\n        quinticInOut: function (k) {\n            if ((k *= 2) < 1) {\n                return 0.5 * k * k * k * k * k;\n            }\n            return 0.5 * ((k -= 2) * k * k * k * k + 2);\n        },\n        sinusoidalIn: function (k) {\n            return 1 - Math.cos(k * Math.PI / 2);\n        },\n        sinusoidalOut: function (k) {\n            return Math.sin(k * Math.PI / 2);\n        },\n        sinusoidalInOut: function (k) {\n            return 0.5 * (1 - Math.cos(Math.PI * k));\n        },\n        exponentialIn: function (k) {\n            return k === 0 ? 0 : Math.pow(1024, k - 1);\n        },\n        exponentialOut: function (k) {\n            return k === 1 ? 1 : 1 - Math.pow(2, -10 * k);\n        },\n        exponentialInOut: function (k) {\n            if (k === 0) {\n                return 0;\n            }\n            if (k === 1) {\n                return 1;\n            }\n            if ((k *= 2) < 1) {\n                return 0.5 * Math.pow(1024, k - 1);\n            }\n            return 0.5 * (-Math.pow(2, -10 * (k - 1)) + 2);\n        },\n        circularIn: function (k) {\n            return 1 - Math.sqrt(1 - k * k);\n        },\n        circularOut: function (k) {\n            return Math.sqrt(1 - (--k * k));\n        },\n        circularInOut: function (k) {\n            if ((k *= 2) < 1) {\n                return -0.5 * (Math.sqrt(1 - k * k) - 1);\n            }\n            return 0.5 * (Math.sqrt(1 - (k -= 2) * k) + 1);\n        },\n        elasticIn: function (k) {\n            var s;\n            var a = 0.1;\n            var p = 0.4;\n            if (k === 0) {\n                return 0;\n            }\n            if (k === 1) {\n                return 1;\n            }\n            if (!a || a < 1) {\n                a = 1;\n                s = p / 4;\n            }\n            else {\n                s = p * Math.asin(1 / a) / (2 * Math.PI);\n            }\n            return -(a * Math.pow(2, 10 * (k -= 1))\n                * Math.sin((k - s) * (2 * Math.PI) / p));\n        },\n        elasticOut: function (k) {\n            var s;\n            var a = 0.1;\n            var p = 0.4;\n            if (k === 0) {\n                return 0;\n            }\n            if (k === 1) {\n                return 1;\n            }\n            if (!a || a < 1) {\n                a = 1;\n                s = p / 4;\n            }\n            else {\n                s = p * Math.asin(1 / a) / (2 * Math.PI);\n            }\n            return (a * Math.pow(2, -10 * k)\n                * Math.sin((k - s) * (2 * Math.PI) / p) + 1);\n        },\n        elasticInOut: function (k) {\n            var s;\n            var a = 0.1;\n            var p = 0.4;\n            if (k === 0) {\n                return 0;\n            }\n            if (k === 1) {\n                return 1;\n            }\n            if (!a || a < 1) {\n                a = 1;\n                s = p / 4;\n            }\n            else {\n                s = p * Math.asin(1 / a) / (2 * Math.PI);\n            }\n            if ((k *= 2) < 1) {\n                return -0.5 * (a * Math.pow(2, 10 * (k -= 1))\n                    * Math.sin((k - s) * (2 * Math.PI) / p));\n            }\n            return a * Math.pow(2, -10 * (k -= 1))\n                * Math.sin((k - s) * (2 * Math.PI) / p) * 0.5 + 1;\n        },\n        backIn: function (k) {\n            var s = 1.70158;\n            return k * k * ((s + 1) * k - s);\n        },\n        backOut: function (k) {\n            var s = 1.70158;\n            return --k * k * ((s + 1) * k + s) + 1;\n        },\n        backInOut: function (k) {\n            var s = 1.70158 * 1.525;\n            if ((k *= 2) < 1) {\n                return 0.5 * (k * k * ((s + 1) * k - s));\n            }\n            return 0.5 * ((k -= 2) * k * ((s + 1) * k + s) + 2);\n        },\n        bounceIn: function (k) {\n            return 1 - easingFuncs.bounceOut(1 - k);\n        },\n        bounceOut: function (k) {\n            if (k < (1 / 2.75)) {\n                return 7.5625 * k * k;\n            }\n            else if (k < (2 / 2.75)) {\n                return 7.5625 * (k -= (1.5 / 2.75)) * k + 0.75;\n            }\n            else if (k < (2.5 / 2.75)) {\n                return 7.5625 * (k -= (2.25 / 2.75)) * k + 0.9375;\n            }\n            else {\n                return 7.5625 * (k -= (2.625 / 2.75)) * k + 0.984375;\n            }\n        },\n        bounceInOut: function (k) {\n            if (k < 0.5) {\n                return easingFuncs.bounceIn(k * 2) * 0.5;\n            }\n            return easingFuncs.bounceOut(k * 2 - 1) * 0.5 + 0.5;\n        }\n    };\n\n    var mathPow = Math.pow;\n    var mathSqrt = Math.sqrt;\n    var EPSILON = 1e-8;\n    var EPSILON_NUMERIC = 1e-4;\n    var THREE_SQRT = mathSqrt(3);\n    var ONE_THIRD = 1 / 3;\n    var _v0 = create();\n    var _v1 = create();\n    var _v2 = create();\n    function isAroundZero(val) {\n        return val > -EPSILON && val < EPSILON;\n    }\n    function isNotAroundZero(val) {\n        return val > EPSILON || val < -EPSILON;\n    }\n    function cubicAt(p0, p1, p2, p3, t) {\n        var onet = 1 - t;\n        return onet * onet * (onet * p0 + 3 * t * p1)\n            + t * t * (t * p3 + 3 * onet * p2);\n    }\n    function cubicDerivativeAt(p0, p1, p2, p3, t) {\n        var onet = 1 - t;\n        return 3 * (((p1 - p0) * onet + 2 * (p2 - p1) * t) * onet\n            + (p3 - p2) * t * t);\n    }\n    function cubicRootAt(p0, p1, p2, p3, val, roots) {\n        var a = p3 + 3 * (p1 - p2) - p0;\n        var b = 3 * (p2 - p1 * 2 + p0);\n        var c = 3 * (p1 - p0);\n        var d = p0 - val;\n        var A = b * b - 3 * a * c;\n        var B = b * c - 9 * a * d;\n        var C = c * c - 3 * b * d;\n        var n = 0;\n        if (isAroundZero(A) && isAroundZero(B)) {\n            if (isAroundZero(b)) {\n                roots[0] = 0;\n            }\n            else {\n                var t1 = -c / b;\n                if (t1 >= 0 && t1 <= 1) {\n                    roots[n++] = t1;\n                }\n            }\n        }\n        else {\n            var disc = B * B - 4 * A * C;\n            if (isAroundZero(disc)) {\n                var K = B / A;\n                var t1 = -b / a + K;\n                var t2 = -K / 2;\n                if (t1 >= 0 && t1 <= 1) {\n                    roots[n++] = t1;\n                }\n                if (t2 >= 0 && t2 <= 1) {\n                    roots[n++] = t2;\n                }\n            }\n            else if (disc > 0) {\n                var discSqrt = mathSqrt(disc);\n                var Y1 = A * b + 1.5 * a * (-B + discSqrt);\n                var Y2 = A * b + 1.5 * a * (-B - discSqrt);\n                if (Y1 < 0) {\n                    Y1 = -mathPow(-Y1, ONE_THIRD);\n                }\n                else {\n                    Y1 = mathPow(Y1, ONE_THIRD);\n                }\n                if (Y2 < 0) {\n                    Y2 = -mathPow(-Y2, ONE_THIRD);\n                }\n                else {\n                    Y2 = mathPow(Y2, ONE_THIRD);\n                }\n                var t1 = (-b - (Y1 + Y2)) / (3 * a);\n                if (t1 >= 0 && t1 <= 1) {\n                    roots[n++] = t1;\n                }\n            }\n            else {\n                var T = (2 * A * b - 3 * a * B) / (2 * mathSqrt(A * A * A));\n                var theta = Math.acos(T) / 3;\n                var ASqrt = mathSqrt(A);\n                var tmp = Math.cos(theta);\n                var t1 = (-b - 2 * ASqrt * tmp) / (3 * a);\n                var t2 = (-b + ASqrt * (tmp + THREE_SQRT * Math.sin(theta))) / (3 * a);\n                var t3 = (-b + ASqrt * (tmp - THREE_SQRT * Math.sin(theta))) / (3 * a);\n                if (t1 >= 0 && t1 <= 1) {\n                    roots[n++] = t1;\n                }\n                if (t2 >= 0 && t2 <= 1) {\n                    roots[n++] = t2;\n                }\n                if (t3 >= 0 && t3 <= 1) {\n                    roots[n++] = t3;\n                }\n            }\n        }\n        return n;\n    }\n    function cubicExtrema(p0, p1, p2, p3, extrema) {\n        var b = 6 * p2 - 12 * p1 + 6 * p0;\n        var a = 9 * p1 + 3 * p3 - 3 * p0 - 9 * p2;\n        var c = 3 * p1 - 3 * p0;\n        var n = 0;\n        if (isAroundZero(a)) {\n            if (isNotAroundZero(b)) {\n                var t1 = -c / b;\n                if (t1 >= 0 && t1 <= 1) {\n                    extrema[n++] = t1;\n                }\n            }\n        }\n        else {\n            var disc = b * b - 4 * a * c;\n            if (isAroundZero(disc)) {\n                extrema[0] = -b / (2 * a);\n            }\n            else if (disc > 0) {\n                var discSqrt = mathSqrt(disc);\n                var t1 = (-b + discSqrt) / (2 * a);\n                var t2 = (-b - discSqrt) / (2 * a);\n                if (t1 >= 0 && t1 <= 1) {\n                    extrema[n++] = t1;\n                }\n                if (t2 >= 0 && t2 <= 1) {\n                    extrema[n++] = t2;\n                }\n            }\n        }\n        return n;\n    }\n    function cubicSubdivide(p0, p1, p2, p3, t, out) {\n        var p01 = (p1 - p0) * t + p0;\n        var p12 = (p2 - p1) * t + p1;\n        var p23 = (p3 - p2) * t + p2;\n        var p012 = (p12 - p01) * t + p01;\n        var p123 = (p23 - p12) * t + p12;\n        var p0123 = (p123 - p012) * t + p012;\n        out[0] = p0;\n        out[1] = p01;\n        out[2] = p012;\n        out[3] = p0123;\n        out[4] = p0123;\n        out[5] = p123;\n        out[6] = p23;\n        out[7] = p3;\n    }\n    function cubicProjectPoint(x0, y0, x1, y1, x2, y2, x3, y3, x, y, out) {\n        var t;\n        var interval = 0.005;\n        var d = Infinity;\n        var prev;\n        var next;\n        var d1;\n        var d2;\n        _v0[0] = x;\n        _v0[1] = y;\n        for (var _t = 0; _t < 1; _t += 0.05) {\n            _v1[0] = cubicAt(x0, x1, x2, x3, _t);\n            _v1[1] = cubicAt(y0, y1, y2, y3, _t);\n            d1 = distSquare(_v0, _v1);\n            if (d1 < d) {\n                t = _t;\n                d = d1;\n            }\n        }\n        d = Infinity;\n        for (var i = 0; i < 32; i++) {\n            if (interval < EPSILON_NUMERIC) {\n                break;\n            }\n            prev = t - interval;\n            next = t + interval;\n            _v1[0] = cubicAt(x0, x1, x2, x3, prev);\n            _v1[1] = cubicAt(y0, y1, y2, y3, prev);\n            d1 = distSquare(_v1, _v0);\n            if (prev >= 0 && d1 < d) {\n                t = prev;\n                d = d1;\n            }\n            else {\n                _v2[0] = cubicAt(x0, x1, x2, x3, next);\n                _v2[1] = cubicAt(y0, y1, y2, y3, next);\n                d2 = distSquare(_v2, _v0);\n                if (next <= 1 && d2 < d) {\n                    t = next;\n                    d = d2;\n                }\n                else {\n                    interval *= 0.5;\n                }\n            }\n        }\n        if (out) {\n            out[0] = cubicAt(x0, x1, x2, x3, t);\n            out[1] = cubicAt(y0, y1, y2, y3, t);\n        }\n        return mathSqrt(d);\n    }\n    function cubicLength(x0, y0, x1, y1, x2, y2, x3, y3, iteration) {\n        var px = x0;\n        var py = y0;\n        var d = 0;\n        var step = 1 / iteration;\n        for (var i = 1; i <= iteration; i++) {\n            var t = i * step;\n            var x = cubicAt(x0, x1, x2, x3, t);\n            var y = cubicAt(y0, y1, y2, y3, t);\n            var dx = x - px;\n            var dy = y - py;\n            d += Math.sqrt(dx * dx + dy * dy);\n            px = x;\n            py = y;\n        }\n        return d;\n    }\n    function quadraticAt(p0, p1, p2, t) {\n        var onet = 1 - t;\n        return onet * (onet * p0 + 2 * t * p1) + t * t * p2;\n    }\n    function quadraticDerivativeAt(p0, p1, p2, t) {\n        return 2 * ((1 - t) * (p1 - p0) + t * (p2 - p1));\n    }\n    function quadraticRootAt(p0, p1, p2, val, roots) {\n        var a = p0 - 2 * p1 + p2;\n        var b = 2 * (p1 - p0);\n        var c = p0 - val;\n        var n = 0;\n        if (isAroundZero(a)) {\n            if (isNotAroundZero(b)) {\n                var t1 = -c / b;\n                if (t1 >= 0 && t1 <= 1) {\n                    roots[n++] = t1;\n                }\n            }\n        }\n        else {\n            var disc = b * b - 4 * a * c;\n            if (isAroundZero(disc)) {\n                var t1 = -b / (2 * a);\n                if (t1 >= 0 && t1 <= 1) {\n                    roots[n++] = t1;\n                }\n            }\n            else if (disc > 0) {\n                var discSqrt = mathSqrt(disc);\n                var t1 = (-b + discSqrt) / (2 * a);\n                var t2 = (-b - discSqrt) / (2 * a);\n                if (t1 >= 0 && t1 <= 1) {\n                    roots[n++] = t1;\n                }\n                if (t2 >= 0 && t2 <= 1) {\n                    roots[n++] = t2;\n                }\n            }\n        }\n        return n;\n    }\n    function quadraticExtremum(p0, p1, p2) {\n        var divider = p0 + p2 - 2 * p1;\n        if (divider === 0) {\n            return 0.5;\n        }\n        else {\n            return (p0 - p1) / divider;\n        }\n    }\n    function quadraticSubdivide(p0, p1, p2, t, out) {\n        var p01 = (p1 - p0) * t + p0;\n        var p12 = (p2 - p1) * t + p1;\n        var p012 = (p12 - p01) * t + p01;\n        out[0] = p0;\n        out[1] = p01;\n        out[2] = p012;\n        out[3] = p012;\n        out[4] = p12;\n        out[5] = p2;\n    }\n    function quadraticProjectPoint(x0, y0, x1, y1, x2, y2, x, y, out) {\n        var t;\n        var interval = 0.005;\n        var d = Infinity;\n        _v0[0] = x;\n        _v0[1] = y;\n        for (var _t = 0; _t < 1; _t += 0.05) {\n            _v1[0] = quadraticAt(x0, x1, x2, _t);\n            _v1[1] = quadraticAt(y0, y1, y2, _t);\n            var d1 = distSquare(_v0, _v1);\n            if (d1 < d) {\n                t = _t;\n                d = d1;\n            }\n        }\n        d = Infinity;\n        for (var i = 0; i < 32; i++) {\n            if (interval < EPSILON_NUMERIC) {\n                break;\n            }\n            var prev = t - interval;\n            var next = t + interval;\n            _v1[0] = quadraticAt(x0, x1, x2, prev);\n            _v1[1] = quadraticAt(y0, y1, y2, prev);\n            var d1 = distSquare(_v1, _v0);\n            if (prev >= 0 && d1 < d) {\n                t = prev;\n                d = d1;\n            }\n            else {\n                _v2[0] = quadraticAt(x0, x1, x2, next);\n                _v2[1] = quadraticAt(y0, y1, y2, next);\n                var d2 = distSquare(_v2, _v0);\n                if (next <= 1 && d2 < d) {\n                    t = next;\n                    d = d2;\n                }\n                else {\n                    interval *= 0.5;\n                }\n            }\n        }\n        if (out) {\n            out[0] = quadraticAt(x0, x1, x2, t);\n            out[1] = quadraticAt(y0, y1, y2, t);\n        }\n        return mathSqrt(d);\n    }\n    function quadraticLength(x0, y0, x1, y1, x2, y2, iteration) {\n        var px = x0;\n        var py = y0;\n        var d = 0;\n        var step = 1 / iteration;\n        for (var i = 1; i <= iteration; i++) {\n            var t = i * step;\n            var x = quadraticAt(x0, x1, x2, t);\n            var y = quadraticAt(y0, y1, y2, t);\n            var dx = x - px;\n            var dy = y - py;\n            d += Math.sqrt(dx * dx + dy * dy);\n            px = x;\n            py = y;\n        }\n        return d;\n    }\n\n    var regexp = /cubic-bezier\\(([0-9,\\.e ]+)\\)/;\n    function createCubicEasingFunc(cubicEasingStr) {\n        var cubic = cubicEasingStr && regexp.exec(cubicEasingStr);\n        if (cubic) {\n            var points = cubic[1].split(',');\n            var a_1 = +trim(points[0]);\n            var b_1 = +trim(points[1]);\n            var c_1 = +trim(points[2]);\n            var d_1 = +trim(points[3]);\n            if (isNaN(a_1 + b_1 + c_1 + d_1)) {\n                return;\n            }\n            var roots_1 = [];\n            return function (p) {\n                return p <= 0\n                    ? 0 : p >= 1\n                    ? 1\n                    : cubicRootAt(0, a_1, c_1, 1, p, roots_1) && cubicAt(0, b_1, d_1, 1, roots_1[0]);\n            };\n        }\n    }\n\n    var Clip = (function () {\n        function Clip(opts) {\n            this._inited = false;\n            this._startTime = 0;\n            this._pausedTime = 0;\n            this._paused = false;\n            this._life = opts.life || 1000;\n            this._delay = opts.delay || 0;\n            this.loop = opts.loop || false;\n            this.onframe = opts.onframe || noop;\n            this.ondestroy = opts.ondestroy || noop;\n            this.onrestart = opts.onrestart || noop;\n            opts.easing && this.setEasing(opts.easing);\n        }\n        Clip.prototype.step = function (globalTime, deltaTime) {\n            if (!this._inited) {\n                this._startTime = globalTime + this._delay;\n                this._inited = true;\n            }\n            if (this._paused) {\n                this._pausedTime += deltaTime;\n                return;\n            }\n            var life = this._life;\n            var elapsedTime = globalTime - this._startTime - this._pausedTime;\n            var percent = elapsedTime / life;\n            if (percent < 0) {\n                percent = 0;\n            }\n            percent = Math.min(percent, 1);\n            var easingFunc = this.easingFunc;\n            var schedule = easingFunc ? easingFunc(percent) : percent;\n            this.onframe(schedule);\n            if (percent === 1) {\n                if (this.loop) {\n                    var remainder = elapsedTime % life;\n                    this._startTime = globalTime - remainder;\n                    this._pausedTime = 0;\n                    this.onrestart();\n                }\n                else {\n                    return true;\n                }\n            }\n            return false;\n        };\n        Clip.prototype.pause = function () {\n            this._paused = true;\n        };\n        Clip.prototype.resume = function () {\n            this._paused = false;\n        };\n        Clip.prototype.setEasing = function (easing) {\n            this.easing = easing;\n            this.easingFunc = isFunction(easing)\n                ? easing\n                : easingFuncs[easing] || createCubicEasingFunc(easing);\n        };\n        return Clip;\n    }());\n\n    var Entry = (function () {\n        function Entry(val) {\n            this.value = val;\n        }\n        return Entry;\n    }());\n    var LinkedList = (function () {\n        function LinkedList() {\n            this._len = 0;\n        }\n        LinkedList.prototype.insert = function (val) {\n            var entry = new Entry(val);\n            this.insertEntry(entry);\n            return entry;\n        };\n        LinkedList.prototype.insertEntry = function (entry) {\n            if (!this.head) {\n                this.head = this.tail = entry;\n            }\n            else {\n                this.tail.next = entry;\n                entry.prev = this.tail;\n                entry.next = null;\n                this.tail = entry;\n            }\n            this._len++;\n        };\n        LinkedList.prototype.remove = function (entry) {\n            var prev = entry.prev;\n            var next = entry.next;\n            if (prev) {\n                prev.next = next;\n            }\n            else {\n                this.head = next;\n            }\n            if (next) {\n                next.prev = prev;\n            }\n            else {\n                this.tail = prev;\n            }\n            entry.next = entry.prev = null;\n            this._len--;\n        };\n        LinkedList.prototype.len = function () {\n            return this._len;\n        };\n        LinkedList.prototype.clear = function () {\n            this.head = this.tail = null;\n            this._len = 0;\n        };\n        return LinkedList;\n    }());\n    var LRU = (function () {\n        function LRU(maxSize) {\n            this._list = new LinkedList();\n            this._maxSize = 10;\n            this._map = {};\n            this._maxSize = maxSize;\n        }\n        LRU.prototype.put = function (key, value) {\n            var list = this._list;\n            var map = this._map;\n            var removed = null;\n            if (map[key] == null) {\n                var len = list.len();\n                var entry = this._lastRemovedEntry;\n                if (len >= this._maxSize && len > 0) {\n                    var leastUsedEntry = list.head;\n                    list.remove(leastUsedEntry);\n                    delete map[leastUsedEntry.key];\n                    removed = leastUsedEntry.value;\n                    this._lastRemovedEntry = leastUsedEntry;\n                }\n                if (entry) {\n                    entry.value = value;\n                }\n                else {\n                    entry = new Entry(value);\n                }\n                entry.key = key;\n                list.insertEntry(entry);\n                map[key] = entry;\n            }\n            return removed;\n        };\n        LRU.prototype.get = function (key) {\n            var entry = this._map[key];\n            var list = this._list;\n            if (entry != null) {\n                if (entry !== list.tail) {\n                    list.remove(entry);\n                    list.insertEntry(entry);\n                }\n                return entry.value;\n            }\n        };\n        LRU.prototype.clear = function () {\n            this._list.clear();\n            this._map = {};\n        };\n        LRU.prototype.len = function () {\n            return this._list.len();\n        };\n        return LRU;\n    }());\n\n    var kCSSColorTable = {\n        'transparent': [0, 0, 0, 0], 'aliceblue': [240, 248, 255, 1],\n        'antiquewhite': [250, 235, 215, 1], 'aqua': [0, 255, 255, 1],\n        'aquamarine': [127, 255, 212, 1], 'azure': [240, 255, 255, 1],\n        'beige': [245, 245, 220, 1], 'bisque': [255, 228, 196, 1],\n        'black': [0, 0, 0, 1], 'blanchedalmond': [255, 235, 205, 1],\n        'blue': [0, 0, 255, 1], 'blueviolet': [138, 43, 226, 1],\n        'brown': [165, 42, 42, 1], 'burlywood': [222, 184, 135, 1],\n        'cadetblue': [95, 158, 160, 1], 'chartreuse': [127, 255, 0, 1],\n        'chocolate': [210, 105, 30, 1], 'coral': [255, 127, 80, 1],\n        'cornflowerblue': [100, 149, 237, 1], 'cornsilk': [255, 248, 220, 1],\n        'crimson': [220, 20, 60, 1], 'cyan': [0, 255, 255, 1],\n        'darkblue': [0, 0, 139, 1], 'darkcyan': [0, 139, 139, 1],\n        'darkgoldenrod': [184, 134, 11, 1], 'darkgray': [169, 169, 169, 1],\n        'darkgreen': [0, 100, 0, 1], 'darkgrey': [169, 169, 169, 1],\n        'darkkhaki': [189, 183, 107, 1], 'darkmagenta': [139, 0, 139, 1],\n        'darkolivegreen': [85, 107, 47, 1], 'darkorange': [255, 140, 0, 1],\n        'darkorchid': [153, 50, 204, 1], 'darkred': [139, 0, 0, 1],\n        'darksalmon': [233, 150, 122, 1], 'darkseagreen': [143, 188, 143, 1],\n        'darkslateblue': [72, 61, 139, 1], 'darkslategray': [47, 79, 79, 1],\n        'darkslategrey': [47, 79, 79, 1], 'darkturquoise': [0, 206, 209, 1],\n        'darkviolet': [148, 0, 211, 1], 'deeppink': [255, 20, 147, 1],\n        'deepskyblue': [0, 191, 255, 1], 'dimgray': [105, 105, 105, 1],\n        'dimgrey': [105, 105, 105, 1], 'dodgerblue': [30, 144, 255, 1],\n        'firebrick': [178, 34, 34, 1], 'floralwhite': [255, 250, 240, 1],\n        'forestgreen': [34, 139, 34, 1], 'fuchsia': [255, 0, 255, 1],\n        'gainsboro': [220, 220, 220, 1], 'ghostwhite': [248, 248, 255, 1],\n        'gold': [255, 215, 0, 1], 'goldenrod': [218, 165, 32, 1],\n        'gray': [128, 128, 128, 1], 'green': [0, 128, 0, 1],\n        'greenyellow': [173, 255, 47, 1], 'grey': [128, 128, 128, 1],\n        'honeydew': [240, 255, 240, 1], 'hotpink': [255, 105, 180, 1],\n        'indianred': [205, 92, 92, 1], 'indigo': [75, 0, 130, 1],\n        'ivory': [255, 255, 240, 1], 'khaki': [240, 230, 140, 1],\n        'lavender': [230, 230, 250, 1], 'lavenderblush': [255, 240, 245, 1],\n        'lawngreen': [124, 252, 0, 1], 'lemonchiffon': [255, 250, 205, 1],\n        'lightblue': [173, 216, 230, 1], 'lightcoral': [240, 128, 128, 1],\n        'lightcyan': [224, 255, 255, 1], 'lightgoldenrodyellow': [250, 250, 210, 1],\n        'lightgray': [211, 211, 211, 1], 'lightgreen': [144, 238, 144, 1],\n        'lightgrey': [211, 211, 211, 1], 'lightpink': [255, 182, 193, 1],\n        'lightsalmon': [255, 160, 122, 1], 'lightseagreen': [32, 178, 170, 1],\n        'lightskyblue': [135, 206, 250, 1], 'lightslategray': [119, 136, 153, 1],\n        'lightslategrey': [119, 136, 153, 1], 'lightsteelblue': [176, 196, 222, 1],\n        'lightyellow': [255, 255, 224, 1], 'lime': [0, 255, 0, 1],\n        'limegreen': [50, 205, 50, 1], 'linen': [250, 240, 230, 1],\n        'magenta': [255, 0, 255, 1], 'maroon': [128, 0, 0, 1],\n        'mediumaquamarine': [102, 205, 170, 1], 'mediumblue': [0, 0, 205, 1],\n        'mediumorchid': [186, 85, 211, 1], 'mediumpurple': [147, 112, 219, 1],\n        'mediumseagreen': [60, 179, 113, 1], 'mediumslateblue': [123, 104, 238, 1],\n        'mediumspringgreen': [0, 250, 154, 1], 'mediumturquoise': [72, 209, 204, 1],\n        'mediumvioletred': [199, 21, 133, 1], 'midnightblue': [25, 25, 112, 1],\n        'mintcream': [245, 255, 250, 1], 'mistyrose': [255, 228, 225, 1],\n        'moccasin': [255, 228, 181, 1], 'navajowhite': [255, 222, 173, 1],\n        'navy': [0, 0, 128, 1], 'oldlace': [253, 245, 230, 1],\n        'olive': [128, 128, 0, 1], 'olivedrab': [107, 142, 35, 1],\n        'orange': [255, 165, 0, 1], 'orangered': [255, 69, 0, 1],\n        'orchid': [218, 112, 214, 1], 'palegoldenrod': [238, 232, 170, 1],\n        'palegreen': [152, 251, 152, 1], 'paleturquoise': [175, 238, 238, 1],\n        'palevioletred': [219, 112, 147, 1], 'papayawhip': [255, 239, 213, 1],\n        'peachpuff': [255, 218, 185, 1], 'peru': [205, 133, 63, 1],\n        'pink': [255, 192, 203, 1], 'plum': [221, 160, 221, 1],\n        'powderblue': [176, 224, 230, 1], 'purple': [128, 0, 128, 1],\n        'red': [255, 0, 0, 1], 'rosybrown': [188, 143, 143, 1],\n        'royalblue': [65, 105, 225, 1], 'saddlebrown': [139, 69, 19, 1],\n        'salmon': [250, 128, 114, 1], 'sandybrown': [244, 164, 96, 1],\n        'seagreen': [46, 139, 87, 1], 'seashell': [255, 245, 238, 1],\n        'sienna': [160, 82, 45, 1], 'silver': [192, 192, 192, 1],\n        'skyblue': [135, 206, 235, 1], 'slateblue': [106, 90, 205, 1],\n        'slategray': [112, 128, 144, 1], 'slategrey': [112, 128, 144, 1],\n        'snow': [255, 250, 250, 1], 'springgreen': [0, 255, 127, 1],\n        'steelblue': [70, 130, 180, 1], 'tan': [210, 180, 140, 1],\n        'teal': [0, 128, 128, 1], 'thistle': [216, 191, 216, 1],\n        'tomato': [255, 99, 71, 1], 'turquoise': [64, 224, 208, 1],\n        'violet': [238, 130, 238, 1], 'wheat': [245, 222, 179, 1],\n        'white': [255, 255, 255, 1], 'whitesmoke': [245, 245, 245, 1],\n        'yellow': [255, 255, 0, 1], 'yellowgreen': [154, 205, 50, 1]\n    };\n    function clampCssByte(i) {\n        i = Math.round(i);\n        return i < 0 ? 0 : i > 255 ? 255 : i;\n    }\n    function clampCssAngle(i) {\n        i = Math.round(i);\n        return i < 0 ? 0 : i > 360 ? 360 : i;\n    }\n    function clampCssFloat(f) {\n        return f < 0 ? 0 : f > 1 ? 1 : f;\n    }\n    function parseCssInt(val) {\n        var str = val;\n        if (str.length && str.charAt(str.length - 1) === '%') {\n            return clampCssByte(parseFloat(str) / 100 * 255);\n        }\n        return clampCssByte(parseInt(str, 10));\n    }\n    function parseCssFloat(val) {\n        var str = val;\n        if (str.length && str.charAt(str.length - 1) === '%') {\n            return clampCssFloat(parseFloat(str) / 100);\n        }\n        return clampCssFloat(parseFloat(str));\n    }\n    function cssHueToRgb(m1, m2, h) {\n        if (h < 0) {\n            h += 1;\n        }\n        else if (h > 1) {\n            h -= 1;\n        }\n        if (h * 6 < 1) {\n            return m1 + (m2 - m1) * h * 6;\n        }\n        if (h * 2 < 1) {\n            return m2;\n        }\n        if (h * 3 < 2) {\n            return m1 + (m2 - m1) * (2 / 3 - h) * 6;\n        }\n        return m1;\n    }\n    function lerpNumber(a, b, p) {\n        return a + (b - a) * p;\n    }\n    function setRgba(out, r, g, b, a) {\n        out[0] = r;\n        out[1] = g;\n        out[2] = b;\n        out[3] = a;\n        return out;\n    }\n    function copyRgba(out, a) {\n        out[0] = a[0];\n        out[1] = a[1];\n        out[2] = a[2];\n        out[3] = a[3];\n        return out;\n    }\n    var colorCache = new LRU(20);\n    var lastRemovedArr = null;\n    function putToCache(colorStr, rgbaArr) {\n        if (lastRemovedArr) {\n            copyRgba(lastRemovedArr, rgbaArr);\n        }\n        lastRemovedArr = colorCache.put(colorStr, lastRemovedArr || (rgbaArr.slice()));\n    }\n    function parse(colorStr, rgbaArr) {\n        if (!colorStr) {\n            return;\n        }\n        rgbaArr = rgbaArr || [];\n        var cached = colorCache.get(colorStr);\n        if (cached) {\n            return copyRgba(rgbaArr, cached);\n        }\n        colorStr = colorStr + '';\n        var str = colorStr.replace(/ /g, '').toLowerCase();\n        if (str in kCSSColorTable) {\n            copyRgba(rgbaArr, kCSSColorTable[str]);\n            putToCache(colorStr, rgbaArr);\n            return rgbaArr;\n        }\n        var strLen = str.length;\n        if (str.charAt(0) === '#') {\n            if (strLen === 4 || strLen === 5) {\n                var iv = parseInt(str.slice(1, 4), 16);\n                if (!(iv >= 0 && iv <= 0xfff)) {\n                    setRgba(rgbaArr, 0, 0, 0, 1);\n                    return;\n                }\n                setRgba(rgbaArr, ((iv & 0xf00) >> 4) | ((iv & 0xf00) >> 8), (iv & 0xf0) | ((iv & 0xf0) >> 4), (iv & 0xf) | ((iv & 0xf) << 4), strLen === 5 ? parseInt(str.slice(4), 16) / 0xf : 1);\n                putToCache(colorStr, rgbaArr);\n                return rgbaArr;\n            }\n            else if (strLen === 7 || strLen === 9) {\n                var iv = parseInt(str.slice(1, 7), 16);\n                if (!(iv >= 0 && iv <= 0xffffff)) {\n                    setRgba(rgbaArr, 0, 0, 0, 1);\n                    return;\n                }\n                setRgba(rgbaArr, (iv & 0xff0000) >> 16, (iv & 0xff00) >> 8, iv & 0xff, strLen === 9 ? parseInt(str.slice(7), 16) / 0xff : 1);\n                putToCache(colorStr, rgbaArr);\n                return rgbaArr;\n            }\n            return;\n        }\n        var op = str.indexOf('(');\n        var ep = str.indexOf(')');\n        if (op !== -1 && ep + 1 === strLen) {\n            var fname = str.substr(0, op);\n            var params = str.substr(op + 1, ep - (op + 1)).split(',');\n            var alpha = 1;\n            switch (fname) {\n                case 'rgba':\n                    if (params.length !== 4) {\n                        return params.length === 3\n                            ? setRgba(rgbaArr, +params[0], +params[1], +params[2], 1)\n                            : setRgba(rgbaArr, 0, 0, 0, 1);\n                    }\n                    alpha = parseCssFloat(params.pop());\n                case 'rgb':\n                    if (params.length >= 3) {\n                        setRgba(rgbaArr, parseCssInt(params[0]), parseCssInt(params[1]), parseCssInt(params[2]), params.length === 3 ? alpha : parseCssFloat(params[3]));\n                        putToCache(colorStr, rgbaArr);\n                        return rgbaArr;\n                    }\n                    else {\n                        setRgba(rgbaArr, 0, 0, 0, 1);\n                        return;\n                    }\n                case 'hsla':\n                    if (params.length !== 4) {\n                        setRgba(rgbaArr, 0, 0, 0, 1);\n                        return;\n                    }\n                    params[3] = parseCssFloat(params[3]);\n                    hsla2rgba(params, rgbaArr);\n                    putToCache(colorStr, rgbaArr);\n                    return rgbaArr;\n                case 'hsl':\n                    if (params.length !== 3) {\n                        setRgba(rgbaArr, 0, 0, 0, 1);\n                        return;\n                    }\n                    hsla2rgba(params, rgbaArr);\n                    putToCache(colorStr, rgbaArr);\n                    return rgbaArr;\n                default:\n                    return;\n            }\n        }\n        setRgba(rgbaArr, 0, 0, 0, 1);\n        return;\n    }\n    function hsla2rgba(hsla, rgba) {\n        var h = (((parseFloat(hsla[0]) % 360) + 360) % 360) / 360;\n        var s = parseCssFloat(hsla[1]);\n        var l = parseCssFloat(hsla[2]);\n        var m2 = l <= 0.5 ? l * (s + 1) : l + s - l * s;\n        var m1 = l * 2 - m2;\n        rgba = rgba || [];\n        setRgba(rgba, clampCssByte(cssHueToRgb(m1, m2, h + 1 / 3) * 255), clampCssByte(cssHueToRgb(m1, m2, h) * 255), clampCssByte(cssHueToRgb(m1, m2, h - 1 / 3) * 255), 1);\n        if (hsla.length === 4) {\n            rgba[3] = hsla[3];\n        }\n        return rgba;\n    }\n    function rgba2hsla(rgba) {\n        if (!rgba) {\n            return;\n        }\n        var R = rgba[0] / 255;\n        var G = rgba[1] / 255;\n        var B = rgba[2] / 255;\n        var vMin = Math.min(R, G, B);\n        var vMax = Math.max(R, G, B);\n        var delta = vMax - vMin;\n        var L = (vMax + vMin) / 2;\n        var H;\n        var S;\n        if (delta === 0) {\n            H = 0;\n            S = 0;\n        }\n        else {\n            if (L < 0.5) {\n                S = delta / (vMax + vMin);\n            }\n            else {\n                S = delta / (2 - vMax - vMin);\n            }\n            var deltaR = (((vMax - R) / 6) + (delta / 2)) / delta;\n            var deltaG = (((vMax - G) / 6) + (delta / 2)) / delta;\n            var deltaB = (((vMax - B) / 6) + (delta / 2)) / delta;\n            if (R === vMax) {\n                H = deltaB - deltaG;\n            }\n            else if (G === vMax) {\n                H = (1 / 3) + deltaR - deltaB;\n            }\n            else if (B === vMax) {\n                H = (2 / 3) + deltaG - deltaR;\n            }\n            if (H < 0) {\n                H += 1;\n            }\n            if (H > 1) {\n                H -= 1;\n            }\n        }\n        var hsla = [H * 360, S, L];\n        if (rgba[3] != null) {\n            hsla.push(rgba[3]);\n        }\n        return hsla;\n    }\n    function lift(color, level) {\n        var colorArr = parse(color);\n        if (colorArr) {\n            for (var i = 0; i < 3; i++) {\n                if (level < 0) {\n                    colorArr[i] = colorArr[i] * (1 - level) | 0;\n                }\n                else {\n                    colorArr[i] = ((255 - colorArr[i]) * level + colorArr[i]) | 0;\n                }\n                if (colorArr[i] > 255) {\n                    colorArr[i] = 255;\n                }\n                else if (colorArr[i] < 0) {\n                    colorArr[i] = 0;\n                }\n            }\n            return stringify(colorArr, colorArr.length === 4 ? 'rgba' : 'rgb');\n        }\n    }\n    function toHex(color) {\n        var colorArr = parse(color);\n        if (colorArr) {\n            return ((1 << 24) + (colorArr[0] << 16) + (colorArr[1] << 8) + (+colorArr[2])).toString(16).slice(1);\n        }\n    }\n    function fastLerp(normalizedValue, colors, out) {\n        if (!(colors && colors.length)\n            || !(normalizedValue >= 0 && normalizedValue <= 1)) {\n            return;\n        }\n        out = out || [];\n        var value = normalizedValue * (colors.length - 1);\n        var leftIndex = Math.floor(value);\n        var rightIndex = Math.ceil(value);\n        var leftColor = colors[leftIndex];\n        var rightColor = colors[rightIndex];\n        var dv = value - leftIndex;\n        out[0] = clampCssByte(lerpNumber(leftColor[0], rightColor[0], dv));\n        out[1] = clampCssByte(lerpNumber(leftColor[1], rightColor[1], dv));\n        out[2] = clampCssByte(lerpNumber(leftColor[2], rightColor[2], dv));\n        out[3] = clampCssFloat(lerpNumber(leftColor[3], rightColor[3], dv));\n        return out;\n    }\n    var fastMapToColor = fastLerp;\n    function lerp$1(normalizedValue, colors, fullOutput) {\n        if (!(colors && colors.length)\n            || !(normalizedValue >= 0 && normalizedValue <= 1)) {\n            return;\n        }\n        var value = normalizedValue * (colors.length - 1);\n        var leftIndex = Math.floor(value);\n        var rightIndex = Math.ceil(value);\n        var leftColor = parse(colors[leftIndex]);\n        var rightColor = parse(colors[rightIndex]);\n        var dv = value - leftIndex;\n        var color = stringify([\n            clampCssByte(lerpNumber(leftColor[0], rightColor[0], dv)),\n            clampCssByte(lerpNumber(leftColor[1], rightColor[1], dv)),\n            clampCssByte(lerpNumber(leftColor[2], rightColor[2], dv)),\n            clampCssFloat(lerpNumber(leftColor[3], rightColor[3], dv))\n        ], 'rgba');\n        return fullOutput\n            ? {\n                color: color,\n                leftIndex: leftIndex,\n                rightIndex: rightIndex,\n                value: value\n            }\n            : color;\n    }\n    var mapToColor = lerp$1;\n    function modifyHSL(color, h, s, l) {\n        var colorArr = parse(color);\n        if (color) {\n            colorArr = rgba2hsla(colorArr);\n            h != null && (colorArr[0] = clampCssAngle(h));\n            s != null && (colorArr[1] = parseCssFloat(s));\n            l != null && (colorArr[2] = parseCssFloat(l));\n            return stringify(hsla2rgba(colorArr), 'rgba');\n        }\n    }\n    function modifyAlpha(color, alpha) {\n        var colorArr = parse(color);\n        if (colorArr && alpha != null) {\n            colorArr[3] = clampCssFloat(alpha);\n            return stringify(colorArr, 'rgba');\n        }\n    }\n    function stringify(arrColor, type) {\n        if (!arrColor || !arrColor.length) {\n            return;\n        }\n        var colorStr = arrColor[0] + ',' + arrColor[1] + ',' + arrColor[2];\n        if (type === 'rgba' || type === 'hsva' || type === 'hsla') {\n            colorStr += ',' + arrColor[3];\n        }\n        return type + '(' + colorStr + ')';\n    }\n    function lum(color, backgroundLum) {\n        var arr = parse(color);\n        return arr\n            ? (0.299 * arr[0] + 0.587 * arr[1] + 0.114 * arr[2]) * arr[3] / 255\n                + (1 - arr[3]) * backgroundLum\n            : 0;\n    }\n    function random() {\n        return stringify([\n            Math.round(Math.random() * 255),\n            Math.round(Math.random() * 255),\n            Math.round(Math.random() * 255)\n        ], 'rgb');\n    }\n    var liftedColorCache = new LRU(100);\n    function liftColor(color) {\n        if (isString(color)) {\n            var liftedColor = liftedColorCache.get(color);\n            if (!liftedColor) {\n                liftedColor = lift(color, -0.1);\n                liftedColorCache.put(color, liftedColor);\n            }\n            return liftedColor;\n        }\n        else if (isGradientObject(color)) {\n            var ret = extend({}, color);\n            ret.colorStops = map(color.colorStops, function (stop) { return ({\n                offset: stop.offset,\n                color: lift(stop.color, -0.1)\n            }); });\n            return ret;\n        }\n        return color;\n    }\n\n    var color = /*#__PURE__*/Object.freeze({\n        __proto__: null,\n        parse: parse,\n        lift: lift,\n        toHex: toHex,\n        fastLerp: fastLerp,\n        fastMapToColor: fastMapToColor,\n        lerp: lerp$1,\n        mapToColor: mapToColor,\n        modifyHSL: modifyHSL,\n        modifyAlpha: modifyAlpha,\n        stringify: stringify,\n        lum: lum,\n        random: random,\n        liftColor: liftColor\n    });\n\n    var mathRound = Math.round;\n    function normalizeColor(color) {\n        var opacity;\n        if (!color || color === 'transparent') {\n            color = 'none';\n        }\n        else if (typeof color === 'string' && color.indexOf('rgba') > -1) {\n            var arr = parse(color);\n            if (arr) {\n                color = 'rgb(' + arr[0] + ',' + arr[1] + ',' + arr[2] + ')';\n                opacity = arr[3];\n            }\n        }\n        return {\n            color: color,\n            opacity: opacity == null ? 1 : opacity\n        };\n    }\n    var EPSILON$1 = 1e-4;\n    function isAroundZero$1(transform) {\n        return transform < EPSILON$1 && transform > -EPSILON$1;\n    }\n    function round3(transform) {\n        return mathRound(transform * 1e3) / 1e3;\n    }\n    function round4(transform) {\n        return mathRound(transform * 1e4) / 1e4;\n    }\n    function getMatrixStr(m) {\n        return 'matrix('\n            + round3(m[0]) + ','\n            + round3(m[1]) + ','\n            + round3(m[2]) + ','\n            + round3(m[3]) + ','\n            + round4(m[4]) + ','\n            + round4(m[5])\n            + ')';\n    }\n    var TEXT_ALIGN_TO_ANCHOR = {\n        left: 'start',\n        right: 'end',\n        center: 'middle',\n        middle: 'middle'\n    };\n    function adjustTextY(y, lineHeight, textBaseline) {\n        if (textBaseline === 'top') {\n            y += lineHeight / 2;\n        }\n        else if (textBaseline === 'bottom') {\n            y -= lineHeight / 2;\n        }\n        return y;\n    }\n    function hasShadow(style) {\n        return style\n            && (style.shadowBlur || style.shadowOffsetX || style.shadowOffsetY);\n    }\n    function getShadowKey(displayable) {\n        var style = displayable.style;\n        var globalScale = displayable.getGlobalScale();\n        return [\n            style.shadowColor,\n            (style.shadowBlur || 0).toFixed(2),\n            (style.shadowOffsetX || 0).toFixed(2),\n            (style.shadowOffsetY || 0).toFixed(2),\n            globalScale[0],\n            globalScale[1]\n        ].join(',');\n    }\n    function isImagePattern(val) {\n        return val && (!!val.image);\n    }\n    function isSVGPattern(val) {\n        return val && (!!val.svgElement);\n    }\n    function isPattern(val) {\n        return isImagePattern(val) || isSVGPattern(val);\n    }\n    function isLinearGradient(val) {\n        return val.type === 'linear';\n    }\n    function isRadialGradient(val) {\n        return val.type === 'radial';\n    }\n    function isGradient(val) {\n        return val && (val.type === 'linear'\n            || val.type === 'radial');\n    }\n    function getIdURL(id) {\n        return \"url(#\" + id + \")\";\n    }\n    function getPathPrecision(el) {\n        var scale = el.getGlobalScale();\n        var size = Math.max(scale[0], scale[1]);\n        return Math.max(Math.ceil(Math.log(size) / Math.log(10)), 1);\n    }\n    function getSRTTransformString(transform) {\n        var x = transform.x || 0;\n        var y = transform.y || 0;\n        var rotation = (transform.rotation || 0) * RADIAN_TO_DEGREE;\n        var scaleX = retrieve2(transform.scaleX, 1);\n        var scaleY = retrieve2(transform.scaleY, 1);\n        var skewX = transform.skewX || 0;\n        var skewY = transform.skewY || 0;\n        var res = [];\n        if (x || y) {\n            res.push(\"translate(\" + x + \"px,\" + y + \"px)\");\n        }\n        if (rotation) {\n            res.push(\"rotate(\" + rotation + \")\");\n        }\n        if (scaleX !== 1 || scaleY !== 1) {\n            res.push(\"scale(\" + scaleX + \",\" + scaleY + \")\");\n        }\n        if (skewX || skewY) {\n            res.push(\"skew(\" + mathRound(skewX * RADIAN_TO_DEGREE) + \"deg, \" + mathRound(skewY * RADIAN_TO_DEGREE) + \"deg)\");\n        }\n        return res.join(' ');\n    }\n    var encodeBase64 = (function () {\n        if (env.hasGlobalWindow && isFunction(window.btoa)) {\n            return function (str) {\n                return window.btoa(unescape(encodeURIComponent(str)));\n            };\n        }\n        if (typeof Buffer !== 'undefined') {\n            return function (str) {\n                return Buffer.from(str).toString('base64');\n            };\n        }\n        return function (str) {\n            if (\"development\" !== 'production') {\n                logError('Base64 isn\\'t natively supported in the current environment.');\n            }\n            return null;\n        };\n    })();\n\n    var arraySlice = Array.prototype.slice;\n    function interpolateNumber(p0, p1, percent) {\n        return (p1 - p0) * percent + p0;\n    }\n    function interpolate1DArray(out, p0, p1, percent) {\n        var len = p0.length;\n        for (var i = 0; i < len; i++) {\n            out[i] = interpolateNumber(p0[i], p1[i], percent);\n        }\n        return out;\n    }\n    function interpolate2DArray(out, p0, p1, percent) {\n        var len = p0.length;\n        var len2 = len && p0[0].length;\n        for (var i = 0; i < len; i++) {\n            if (!out[i]) {\n                out[i] = [];\n            }\n            for (var j = 0; j < len2; j++) {\n                out[i][j] = interpolateNumber(p0[i][j], p1[i][j], percent);\n            }\n        }\n        return out;\n    }\n    function add1DArray(out, p0, p1, sign) {\n        var len = p0.length;\n        for (var i = 0; i < len; i++) {\n            out[i] = p0[i] + p1[i] * sign;\n        }\n        return out;\n    }\n    function add2DArray(out, p0, p1, sign) {\n        var len = p0.length;\n        var len2 = len && p0[0].length;\n        for (var i = 0; i < len; i++) {\n            if (!out[i]) {\n                out[i] = [];\n            }\n            for (var j = 0; j < len2; j++) {\n                out[i][j] = p0[i][j] + p1[i][j] * sign;\n            }\n        }\n        return out;\n    }\n    function fillColorStops(val0, val1) {\n        var len0 = val0.length;\n        var len1 = val1.length;\n        var shorterArr = len0 > len1 ? val1 : val0;\n        var shorterLen = Math.min(len0, len1);\n        var last = shorterArr[shorterLen - 1] || { color: [0, 0, 0, 0], offset: 0 };\n        for (var i = shorterLen; i < Math.max(len0, len1); i++) {\n            shorterArr.push({\n                offset: last.offset,\n                color: last.color.slice()\n            });\n        }\n    }\n    function fillArray(val0, val1, arrDim) {\n        var arr0 = val0;\n        var arr1 = val1;\n        if (!arr0.push || !arr1.push) {\n            return;\n        }\n        var arr0Len = arr0.length;\n        var arr1Len = arr1.length;\n        if (arr0Len !== arr1Len) {\n            var isPreviousLarger = arr0Len > arr1Len;\n            if (isPreviousLarger) {\n                arr0.length = arr1Len;\n            }\n            else {\n                for (var i = arr0Len; i < arr1Len; i++) {\n                    arr0.push(arrDim === 1 ? arr1[i] : arraySlice.call(arr1[i]));\n                }\n            }\n        }\n        var len2 = arr0[0] && arr0[0].length;\n        for (var i = 0; i < arr0.length; i++) {\n            if (arrDim === 1) {\n                if (isNaN(arr0[i])) {\n                    arr0[i] = arr1[i];\n                }\n            }\n            else {\n                for (var j = 0; j < len2; j++) {\n                    if (isNaN(arr0[i][j])) {\n                        arr0[i][j] = arr1[i][j];\n                    }\n                }\n            }\n        }\n    }\n    function cloneValue(value) {\n        if (isArrayLike(value)) {\n            var len = value.length;\n            if (isArrayLike(value[0])) {\n                var ret = [];\n                for (var i = 0; i < len; i++) {\n                    ret.push(arraySlice.call(value[i]));\n                }\n                return ret;\n            }\n            return arraySlice.call(value);\n        }\n        return value;\n    }\n    function rgba2String(rgba) {\n        rgba[0] = Math.floor(rgba[0]) || 0;\n        rgba[1] = Math.floor(rgba[1]) || 0;\n        rgba[2] = Math.floor(rgba[2]) || 0;\n        rgba[3] = rgba[3] == null ? 1 : rgba[3];\n        return 'rgba(' + rgba.join(',') + ')';\n    }\n    function guessArrayDim(value) {\n        return isArrayLike(value && value[0]) ? 2 : 1;\n    }\n    var VALUE_TYPE_NUMBER = 0;\n    var VALUE_TYPE_1D_ARRAY = 1;\n    var VALUE_TYPE_2D_ARRAY = 2;\n    var VALUE_TYPE_COLOR = 3;\n    var VALUE_TYPE_LINEAR_GRADIENT = 4;\n    var VALUE_TYPE_RADIAL_GRADIENT = 5;\n    var VALUE_TYPE_UNKOWN = 6;\n    function isGradientValueType(valType) {\n        return valType === VALUE_TYPE_LINEAR_GRADIENT || valType === VALUE_TYPE_RADIAL_GRADIENT;\n    }\n    function isArrayValueType(valType) {\n        return valType === VALUE_TYPE_1D_ARRAY || valType === VALUE_TYPE_2D_ARRAY;\n    }\n    var tmpRgba = [0, 0, 0, 0];\n    var Track = (function () {\n        function Track(propName) {\n            this.keyframes = [];\n            this.discrete = false;\n            this._invalid = false;\n            this._needsSort = false;\n            this._lastFr = 0;\n            this._lastFrP = 0;\n            this.propName = propName;\n        }\n        Track.prototype.isFinished = function () {\n            return this._finished;\n        };\n        Track.prototype.setFinished = function () {\n            this._finished = true;\n            if (this._additiveTrack) {\n                this._additiveTrack.setFinished();\n            }\n        };\n        Track.prototype.needsAnimate = function () {\n            return this.keyframes.length >= 1;\n        };\n        Track.prototype.getAdditiveTrack = function () {\n            return this._additiveTrack;\n        };\n        Track.prototype.addKeyframe = function (time, rawValue, easing) {\n            this._needsSort = true;\n            var keyframes = this.keyframes;\n            var len = keyframes.length;\n            var discrete = false;\n            var valType = VALUE_TYPE_UNKOWN;\n            var value = rawValue;\n            if (isArrayLike(rawValue)) {\n                var arrayDim = guessArrayDim(rawValue);\n                valType = arrayDim;\n                if (arrayDim === 1 && !isNumber(rawValue[0])\n                    || arrayDim === 2 && !isNumber(rawValue[0][0])) {\n                    discrete = true;\n                }\n            }\n            else {\n                if (isNumber(rawValue) && !eqNaN(rawValue)) {\n                    valType = VALUE_TYPE_NUMBER;\n                }\n                else if (isString(rawValue)) {\n                    if (!isNaN(+rawValue)) {\n                        valType = VALUE_TYPE_NUMBER;\n                    }\n                    else {\n                        var colorArray = parse(rawValue);\n                        if (colorArray) {\n                            value = colorArray;\n                            valType = VALUE_TYPE_COLOR;\n                        }\n                    }\n                }\n                else if (isGradientObject(rawValue)) {\n                    var parsedGradient = extend({}, value);\n                    parsedGradient.colorStops = map(rawValue.colorStops, function (colorStop) { return ({\n                        offset: colorStop.offset,\n                        color: parse(colorStop.color)\n                    }); });\n                    if (isLinearGradient(rawValue)) {\n                        valType = VALUE_TYPE_LINEAR_GRADIENT;\n                    }\n                    else if (isRadialGradient(rawValue)) {\n                        valType = VALUE_TYPE_RADIAL_GRADIENT;\n                    }\n                    value = parsedGradient;\n                }\n            }\n            if (len === 0) {\n                this.valType = valType;\n            }\n            else if (valType !== this.valType || valType === VALUE_TYPE_UNKOWN) {\n                discrete = true;\n            }\n            this.discrete = this.discrete || discrete;\n            var kf = {\n                time: time,\n                value: value,\n                rawValue: rawValue,\n                percent: 0\n            };\n            if (easing) {\n                kf.easing = easing;\n                kf.easingFunc = isFunction(easing)\n                    ? easing\n                    : easingFuncs[easing] || createCubicEasingFunc(easing);\n            }\n            keyframes.push(kf);\n            return kf;\n        };\n        Track.prototype.prepare = function (maxTime, additiveTrack) {\n            var kfs = this.keyframes;\n            if (this._needsSort) {\n                kfs.sort(function (a, b) {\n                    return a.time - b.time;\n                });\n            }\n            var valType = this.valType;\n            var kfsLen = kfs.length;\n            var lastKf = kfs[kfsLen - 1];\n            var isDiscrete = this.discrete;\n            var isArr = isArrayValueType(valType);\n            var isGradient = isGradientValueType(valType);\n            for (var i = 0; i < kfsLen; i++) {\n                var kf = kfs[i];\n                var value = kf.value;\n                var lastValue = lastKf.value;\n                kf.percent = kf.time / maxTime;\n                if (!isDiscrete) {\n                    if (isArr && i !== kfsLen - 1) {\n                        fillArray(value, lastValue, valType);\n                    }\n                    else if (isGradient) {\n                        fillColorStops(value.colorStops, lastValue.colorStops);\n                    }\n                }\n            }\n            if (!isDiscrete\n                && valType !== VALUE_TYPE_RADIAL_GRADIENT\n                && additiveTrack\n                && this.needsAnimate()\n                && additiveTrack.needsAnimate()\n                && valType === additiveTrack.valType\n                && !additiveTrack._finished) {\n                this._additiveTrack = additiveTrack;\n                var startValue = kfs[0].value;\n                for (var i = 0; i < kfsLen; i++) {\n                    if (valType === VALUE_TYPE_NUMBER) {\n                        kfs[i].additiveValue = kfs[i].value - startValue;\n                    }\n                    else if (valType === VALUE_TYPE_COLOR) {\n                        kfs[i].additiveValue =\n                            add1DArray([], kfs[i].value, startValue, -1);\n                    }\n                    else if (isArrayValueType(valType)) {\n                        kfs[i].additiveValue = valType === VALUE_TYPE_1D_ARRAY\n                            ? add1DArray([], kfs[i].value, startValue, -1)\n                            : add2DArray([], kfs[i].value, startValue, -1);\n                    }\n                }\n            }\n        };\n        Track.prototype.step = function (target, percent) {\n            if (this._finished) {\n                return;\n            }\n            if (this._additiveTrack && this._additiveTrack._finished) {\n                this._additiveTrack = null;\n            }\n            var isAdditive = this._additiveTrack != null;\n            var valueKey = isAdditive ? 'additiveValue' : 'value';\n            var valType = this.valType;\n            var keyframes = this.keyframes;\n            var kfsNum = keyframes.length;\n            var propName = this.propName;\n            var isValueColor = valType === VALUE_TYPE_COLOR;\n            var frameIdx;\n            var lastFrame = this._lastFr;\n            var mathMin = Math.min;\n            var frame;\n            var nextFrame;\n            if (kfsNum === 1) {\n                frame = nextFrame = keyframes[0];\n            }\n            else {\n                if (percent < 0) {\n                    frameIdx = 0;\n                }\n                else if (percent < this._lastFrP) {\n                    var start = mathMin(lastFrame + 1, kfsNum - 1);\n                    for (frameIdx = start; frameIdx >= 0; frameIdx--) {\n                        if (keyframes[frameIdx].percent <= percent) {\n                            break;\n                        }\n                    }\n                    frameIdx = mathMin(frameIdx, kfsNum - 2);\n                }\n                else {\n                    for (frameIdx = lastFrame; frameIdx < kfsNum; frameIdx++) {\n                        if (keyframes[frameIdx].percent > percent) {\n                            break;\n                        }\n                    }\n                    frameIdx = mathMin(frameIdx - 1, kfsNum - 2);\n                }\n                nextFrame = keyframes[frameIdx + 1];\n                frame = keyframes[frameIdx];\n            }\n            if (!(frame && nextFrame)) {\n                return;\n            }\n            this._lastFr = frameIdx;\n            this._lastFrP = percent;\n            var interval = (nextFrame.percent - frame.percent);\n            var w = interval === 0 ? 1 : mathMin((percent - frame.percent) / interval, 1);\n            if (nextFrame.easingFunc) {\n                w = nextFrame.easingFunc(w);\n            }\n            var targetArr = isAdditive ? this._additiveValue\n                : (isValueColor ? tmpRgba : target[propName]);\n            if ((isArrayValueType(valType) || isValueColor) && !targetArr) {\n                targetArr = this._additiveValue = [];\n            }\n            if (this.discrete) {\n                target[propName] = w < 1 ? frame.rawValue : nextFrame.rawValue;\n            }\n            else if (isArrayValueType(valType)) {\n                valType === VALUE_TYPE_1D_ARRAY\n                    ? interpolate1DArray(targetArr, frame[valueKey], nextFrame[valueKey], w)\n                    : interpolate2DArray(targetArr, frame[valueKey], nextFrame[valueKey], w);\n            }\n            else if (isGradientValueType(valType)) {\n                var val = frame[valueKey];\n                var nextVal_1 = nextFrame[valueKey];\n                var isLinearGradient_1 = valType === VALUE_TYPE_LINEAR_GRADIENT;\n                target[propName] = {\n                    type: isLinearGradient_1 ? 'linear' : 'radial',\n                    x: interpolateNumber(val.x, nextVal_1.x, w),\n                    y: interpolateNumber(val.y, nextVal_1.y, w),\n                    colorStops: map(val.colorStops, function (colorStop, idx) {\n                        var nextColorStop = nextVal_1.colorStops[idx];\n                        return {\n                            offset: interpolateNumber(colorStop.offset, nextColorStop.offset, w),\n                            color: rgba2String(interpolate1DArray([], colorStop.color, nextColorStop.color, w))\n                        };\n                    }),\n                    global: nextVal_1.global\n                };\n                if (isLinearGradient_1) {\n                    target[propName].x2 = interpolateNumber(val.x2, nextVal_1.x2, w);\n                    target[propName].y2 = interpolateNumber(val.y2, nextVal_1.y2, w);\n                }\n                else {\n                    target[propName].r = interpolateNumber(val.r, nextVal_1.r, w);\n                }\n            }\n            else if (isValueColor) {\n                interpolate1DArray(targetArr, frame[valueKey], nextFrame[valueKey], w);\n                if (!isAdditive) {\n                    target[propName] = rgba2String(targetArr);\n                }\n            }\n            else {\n                var value = interpolateNumber(frame[valueKey], nextFrame[valueKey], w);\n                if (isAdditive) {\n                    this._additiveValue = value;\n                }\n                else {\n                    target[propName] = value;\n                }\n            }\n            if (isAdditive) {\n                this._addToTarget(target);\n            }\n        };\n        Track.prototype._addToTarget = function (target) {\n            var valType = this.valType;\n            var propName = this.propName;\n            var additiveValue = this._additiveValue;\n            if (valType === VALUE_TYPE_NUMBER) {\n                target[propName] = target[propName] + additiveValue;\n            }\n            else if (valType === VALUE_TYPE_COLOR) {\n                parse(target[propName], tmpRgba);\n                add1DArray(tmpRgba, tmpRgba, additiveValue, 1);\n                target[propName] = rgba2String(tmpRgba);\n            }\n            else if (valType === VALUE_TYPE_1D_ARRAY) {\n                add1DArray(target[propName], target[propName], additiveValue, 1);\n            }\n            else if (valType === VALUE_TYPE_2D_ARRAY) {\n                add2DArray(target[propName], target[propName], additiveValue, 1);\n            }\n        };\n        return Track;\n    }());\n    var Animator = (function () {\n        function Animator(target, loop, allowDiscreteAnimation, additiveTo) {\n            this._tracks = {};\n            this._trackKeys = [];\n            this._maxTime = 0;\n            this._started = 0;\n            this._clip = null;\n            this._target = target;\n            this._loop = loop;\n            if (loop && additiveTo) {\n                logError('Can\\' use additive animation on looped animation.');\n                return;\n            }\n            this._additiveAnimators = additiveTo;\n            this._allowDiscrete = allowDiscreteAnimation;\n        }\n        Animator.prototype.getMaxTime = function () {\n            return this._maxTime;\n        };\n        Animator.prototype.getDelay = function () {\n            return this._delay;\n        };\n        Animator.prototype.getLoop = function () {\n            return this._loop;\n        };\n        Animator.prototype.getTarget = function () {\n            return this._target;\n        };\n        Animator.prototype.changeTarget = function (target) {\n            this._target = target;\n        };\n        Animator.prototype.when = function (time, props, easing) {\n            return this.whenWithKeys(time, props, keys(props), easing);\n        };\n        Animator.prototype.whenWithKeys = function (time, props, propNames, easing) {\n            var tracks = this._tracks;\n            for (var i = 0; i < propNames.length; i++) {\n                var propName = propNames[i];\n                var track = tracks[propName];\n                if (!track) {\n                    track = tracks[propName] = new Track(propName);\n                    var initialValue = void 0;\n                    var additiveTrack = this._getAdditiveTrack(propName);\n                    if (additiveTrack) {\n                        var addtiveTrackKfs = additiveTrack.keyframes;\n                        var lastFinalKf = addtiveTrackKfs[addtiveTrackKfs.length - 1];\n                        initialValue = lastFinalKf && lastFinalKf.value;\n                        if (additiveTrack.valType === VALUE_TYPE_COLOR && initialValue) {\n                            initialValue = rgba2String(initialValue);\n                        }\n                    }\n                    else {\n                        initialValue = this._target[propName];\n                    }\n                    if (initialValue == null) {\n                        continue;\n                    }\n                    if (time > 0) {\n                        track.addKeyframe(0, cloneValue(initialValue), easing);\n                    }\n                    this._trackKeys.push(propName);\n                }\n                track.addKeyframe(time, cloneValue(props[propName]), easing);\n            }\n            this._maxTime = Math.max(this._maxTime, time);\n            return this;\n        };\n        Animator.prototype.pause = function () {\n            this._clip.pause();\n            this._paused = true;\n        };\n        Animator.prototype.resume = function () {\n            this._clip.resume();\n            this._paused = false;\n        };\n        Animator.prototype.isPaused = function () {\n            return !!this._paused;\n        };\n        Animator.prototype.duration = function (duration) {\n            this._maxTime = duration;\n            this._force = true;\n            return this;\n        };\n        Animator.prototype._doneCallback = function () {\n            this._setTracksFinished();\n            this._clip = null;\n            var doneList = this._doneCbs;\n            if (doneList) {\n                var len = doneList.length;\n                for (var i = 0; i < len; i++) {\n                    doneList[i].call(this);\n                }\n            }\n        };\n        Animator.prototype._abortedCallback = function () {\n            this._setTracksFinished();\n            var animation = this.animation;\n            var abortedList = this._abortedCbs;\n            if (animation) {\n                animation.removeClip(this._clip);\n            }\n            this._clip = null;\n            if (abortedList) {\n                for (var i = 0; i < abortedList.length; i++) {\n                    abortedList[i].call(this);\n                }\n            }\n        };\n        Animator.prototype._setTracksFinished = function () {\n            var tracks = this._tracks;\n            var tracksKeys = this._trackKeys;\n            for (var i = 0; i < tracksKeys.length; i++) {\n                tracks[tracksKeys[i]].setFinished();\n            }\n        };\n        Animator.prototype._getAdditiveTrack = function (trackName) {\n            var additiveTrack;\n            var additiveAnimators = this._additiveAnimators;\n            if (additiveAnimators) {\n                for (var i = 0; i < additiveAnimators.length; i++) {\n                    var track = additiveAnimators[i].getTrack(trackName);\n                    if (track) {\n                        additiveTrack = track;\n                    }\n                }\n            }\n            return additiveTrack;\n        };\n        Animator.prototype.start = function (easing) {\n            if (this._started > 0) {\n                return;\n            }\n            this._started = 1;\n            var self = this;\n            var tracks = [];\n            var maxTime = this._maxTime || 0;\n            for (var i = 0; i < this._trackKeys.length; i++) {\n                var propName = this._trackKeys[i];\n                var track = this._tracks[propName];\n                var additiveTrack = this._getAdditiveTrack(propName);\n                var kfs = track.keyframes;\n                var kfsNum = kfs.length;\n                track.prepare(maxTime, additiveTrack);\n                if (track.needsAnimate()) {\n                    if (!this._allowDiscrete && track.discrete) {\n                        var lastKf = kfs[kfsNum - 1];\n                        if (lastKf) {\n                            self._target[track.propName] = lastKf.rawValue;\n                        }\n                        track.setFinished();\n                    }\n                    else {\n                        tracks.push(track);\n                    }\n                }\n            }\n            if (tracks.length || this._force) {\n                var clip = new Clip({\n                    life: maxTime,\n                    loop: this._loop,\n                    delay: this._delay || 0,\n                    onframe: function (percent) {\n                        self._started = 2;\n                        var additiveAnimators = self._additiveAnimators;\n                        if (additiveAnimators) {\n                            var stillHasAdditiveAnimator = false;\n                            for (var i = 0; i < additiveAnimators.length; i++) {\n                                if (additiveAnimators[i]._clip) {\n                                    stillHasAdditiveAnimator = true;\n                                    break;\n                                }\n                            }\n                            if (!stillHasAdditiveAnimator) {\n                                self._additiveAnimators = null;\n                            }\n                        }\n                        for (var i = 0; i < tracks.length; i++) {\n                            tracks[i].step(self._target, percent);\n                        }\n                        var onframeList = self._onframeCbs;\n                        if (onframeList) {\n                            for (var i = 0; i < onframeList.length; i++) {\n                                onframeList[i](self._target, percent);\n                            }\n                        }\n                    },\n                    ondestroy: function () {\n                        self._doneCallback();\n                    }\n                });\n                this._clip = clip;\n                if (this.animation) {\n                    this.animation.addClip(clip);\n                }\n                if (easing) {\n                    clip.setEasing(easing);\n                }\n            }\n            else {\n                this._doneCallback();\n            }\n            return this;\n        };\n        Animator.prototype.stop = function (forwardToLast) {\n            if (!this._clip) {\n                return;\n            }\n            var clip = this._clip;\n            if (forwardToLast) {\n                clip.onframe(1);\n            }\n            this._abortedCallback();\n        };\n        Animator.prototype.delay = function (time) {\n            this._delay = time;\n            return this;\n        };\n        Animator.prototype.during = function (cb) {\n            if (cb) {\n                if (!this._onframeCbs) {\n                    this._onframeCbs = [];\n                }\n                this._onframeCbs.push(cb);\n            }\n            return this;\n        };\n        Animator.prototype.done = function (cb) {\n            if (cb) {\n                if (!this._doneCbs) {\n                    this._doneCbs = [];\n                }\n                this._doneCbs.push(cb);\n            }\n            return this;\n        };\n        Animator.prototype.aborted = function (cb) {\n            if (cb) {\n                if (!this._abortedCbs) {\n                    this._abortedCbs = [];\n                }\n                this._abortedCbs.push(cb);\n            }\n            return this;\n        };\n        Animator.prototype.getClip = function () {\n            return this._clip;\n        };\n        Animator.prototype.getTrack = function (propName) {\n            return this._tracks[propName];\n        };\n        Animator.prototype.getTracks = function () {\n            var _this = this;\n            return map(this._trackKeys, function (key) { return _this._tracks[key]; });\n        };\n        Animator.prototype.stopTracks = function (propNames, forwardToLast) {\n            if (!propNames.length || !this._clip) {\n                return true;\n            }\n            var tracks = this._tracks;\n            var tracksKeys = this._trackKeys;\n            for (var i = 0; i < propNames.length; i++) {\n                var track = tracks[propNames[i]];\n                if (track && !track.isFinished()) {\n                    if (forwardToLast) {\n                        track.step(this._target, 1);\n                    }\n                    else if (this._started === 1) {\n                        track.step(this._target, 0);\n                    }\n                    track.setFinished();\n                }\n            }\n            var allAborted = true;\n            for (var i = 0; i < tracksKeys.length; i++) {\n                if (!tracks[tracksKeys[i]].isFinished()) {\n                    allAborted = false;\n                    break;\n                }\n            }\n            if (allAborted) {\n                this._abortedCallback();\n            }\n            return allAborted;\n        };\n        Animator.prototype.saveTo = function (target, trackKeys, firstOrLast) {\n            if (!target) {\n                return;\n            }\n            trackKeys = trackKeys || this._trackKeys;\n            for (var i = 0; i < trackKeys.length; i++) {\n                var propName = trackKeys[i];\n                var track = this._tracks[propName];\n                if (!track || track.isFinished()) {\n                    continue;\n                }\n                var kfs = track.keyframes;\n                var kf = kfs[firstOrLast ? 0 : kfs.length - 1];\n                if (kf) {\n                    target[propName] = cloneValue(kf.rawValue);\n                }\n            }\n        };\n        Animator.prototype.__changeFinalValue = function (finalProps, trackKeys) {\n            trackKeys = trackKeys || keys(finalProps);\n            for (var i = 0; i < trackKeys.length; i++) {\n                var propName = trackKeys[i];\n                var track = this._tracks[propName];\n                if (!track) {\n                    continue;\n                }\n                var kfs = track.keyframes;\n                if (kfs.length > 1) {\n                    var lastKf = kfs.pop();\n                    track.addKeyframe(lastKf.time, finalProps[propName]);\n                    track.prepare(this._maxTime, track.getAdditiveTrack());\n                }\n            }\n        };\n        return Animator;\n    }());\n\n    function getTime() {\n        return new Date().getTime();\n    }\n    var Animation = (function (_super) {\n        __extends(Animation, _super);\n        function Animation(opts) {\n            var _this = _super.call(this) || this;\n            _this._running = false;\n            _this._time = 0;\n            _this._pausedTime = 0;\n            _this._pauseStart = 0;\n            _this._paused = false;\n            opts = opts || {};\n            _this.stage = opts.stage || {};\n            return _this;\n        }\n        Animation.prototype.addClip = function (clip) {\n            if (clip.animation) {\n                this.removeClip(clip);\n            }\n            if (!this._head) {\n                this._head = this._tail = clip;\n            }\n            else {\n                this._tail.next = clip;\n                clip.prev = this._tail;\n                clip.next = null;\n                this._tail = clip;\n            }\n            clip.animation = this;\n        };\n        Animation.prototype.addAnimator = function (animator) {\n            animator.animation = this;\n            var clip = animator.getClip();\n            if (clip) {\n                this.addClip(clip);\n            }\n        };\n        Animation.prototype.removeClip = function (clip) {\n            if (!clip.animation) {\n                return;\n            }\n            var prev = clip.prev;\n            var next = clip.next;\n            if (prev) {\n                prev.next = next;\n            }\n            else {\n                this._head = next;\n            }\n            if (next) {\n                next.prev = prev;\n            }\n            else {\n                this._tail = prev;\n            }\n            clip.next = clip.prev = clip.animation = null;\n        };\n        Animation.prototype.removeAnimator = function (animator) {\n            var clip = animator.getClip();\n            if (clip) {\n                this.removeClip(clip);\n            }\n            animator.animation = null;\n        };\n        Animation.prototype.update = function (notTriggerFrameAndStageUpdate) {\n            var time = getTime() - this._pausedTime;\n            var delta = time - this._time;\n            var clip = this._head;\n            while (clip) {\n                var nextClip = clip.next;\n                var finished = clip.step(time, delta);\n                if (finished) {\n                    clip.ondestroy();\n                    this.removeClip(clip);\n                    clip = nextClip;\n                }\n                else {\n                    clip = nextClip;\n                }\n            }\n            this._time = time;\n            if (!notTriggerFrameAndStageUpdate) {\n                this.trigger('frame', delta);\n                this.stage.update && this.stage.update();\n            }\n        };\n        Animation.prototype._startLoop = function () {\n            var self = this;\n            this._running = true;\n            function step() {\n                if (self._running) {\n                    requestAnimationFrame$1(step);\n                    !self._paused && self.update();\n                }\n            }\n            requestAnimationFrame$1(step);\n        };\n        Animation.prototype.start = function () {\n            if (this._running) {\n                return;\n            }\n            this._time = getTime();\n            this._pausedTime = 0;\n            this._startLoop();\n        };\n        Animation.prototype.stop = function () {\n            this._running = false;\n        };\n        Animation.prototype.pause = function () {\n            if (!this._paused) {\n                this._pauseStart = getTime();\n                this._paused = true;\n            }\n        };\n        Animation.prototype.resume = function () {\n            if (this._paused) {\n                this._pausedTime += getTime() - this._pauseStart;\n                this._paused = false;\n            }\n        };\n        Animation.prototype.clear = function () {\n            var clip = this._head;\n            while (clip) {\n                var nextClip = clip.next;\n                clip.prev = clip.next = clip.animation = null;\n                clip = nextClip;\n            }\n            this._head = this._tail = null;\n        };\n        Animation.prototype.isFinished = function () {\n            return this._head == null;\n        };\n        Animation.prototype.animate = function (target, options) {\n            options = options || {};\n            this.start();\n            var animator = new Animator(target, options.loop);\n            this.addAnimator(animator);\n            return animator;\n        };\n        return Animation;\n    }(Eventful));\n\n    var TOUCH_CLICK_DELAY = 300;\n    var globalEventSupported = env.domSupported;\n    var localNativeListenerNames = (function () {\n        var mouseHandlerNames = [\n            'click', 'dblclick', 'mousewheel', 'wheel', 'mouseout',\n            'mouseup', 'mousedown', 'mousemove', 'contextmenu'\n        ];\n        var touchHandlerNames = [\n            'touchstart', 'touchend', 'touchmove'\n        ];\n        var pointerEventNameMap = {\n            pointerdown: 1, pointerup: 1, pointermove: 1, pointerout: 1\n        };\n        var pointerHandlerNames = map(mouseHandlerNames, function (name) {\n            var nm = name.replace('mouse', 'pointer');\n            return pointerEventNameMap.hasOwnProperty(nm) ? nm : name;\n        });\n        return {\n            mouse: mouseHandlerNames,\n            touch: touchHandlerNames,\n            pointer: pointerHandlerNames\n        };\n    })();\n    var globalNativeListenerNames = {\n        mouse: ['mousemove', 'mouseup'],\n        pointer: ['pointermove', 'pointerup']\n    };\n    var wheelEventSupported = false;\n    function isPointerFromTouch(event) {\n        var pointerType = event.pointerType;\n        return pointerType === 'pen' || pointerType === 'touch';\n    }\n    function setTouchTimer(scope) {\n        scope.touching = true;\n        if (scope.touchTimer != null) {\n            clearTimeout(scope.touchTimer);\n            scope.touchTimer = null;\n        }\n        scope.touchTimer = setTimeout(function () {\n            scope.touching = false;\n            scope.touchTimer = null;\n        }, 700);\n    }\n    function markTouch(event) {\n        event && (event.zrByTouch = true);\n    }\n    function normalizeGlobalEvent(instance, event) {\n        return normalizeEvent(instance.dom, new FakeGlobalEvent(instance, event), true);\n    }\n    function isLocalEl(instance, el) {\n        var elTmp = el;\n        var isLocal = false;\n        while (elTmp && elTmp.nodeType !== 9\n            && !(isLocal = elTmp.domBelongToZr\n                || (elTmp !== el && elTmp === instance.painterRoot))) {\n            elTmp = elTmp.parentNode;\n        }\n        return isLocal;\n    }\n    var FakeGlobalEvent = (function () {\n        function FakeGlobalEvent(instance, event) {\n            this.stopPropagation = noop;\n            this.stopImmediatePropagation = noop;\n            this.preventDefault = noop;\n            this.type = event.type;\n            this.target = this.currentTarget = instance.dom;\n            this.pointerType = event.pointerType;\n            this.clientX = event.clientX;\n            this.clientY = event.clientY;\n        }\n        return FakeGlobalEvent;\n    }());\n    var localDOMHandlers = {\n        mousedown: function (event) {\n            event = normalizeEvent(this.dom, event);\n            this.__mayPointerCapture = [event.zrX, event.zrY];\n            this.trigger('mousedown', event);\n        },\n        mousemove: function (event) {\n            event = normalizeEvent(this.dom, event);\n            var downPoint = this.__mayPointerCapture;\n            if (downPoint && (event.zrX !== downPoint[0] || event.zrY !== downPoint[1])) {\n                this.__togglePointerCapture(true);\n            }\n            this.trigger('mousemove', event);\n        },\n        mouseup: function (event) {\n            event = normalizeEvent(this.dom, event);\n            this.__togglePointerCapture(false);\n            this.trigger('mouseup', event);\n        },\n        mouseout: function (event) {\n            event = normalizeEvent(this.dom, event);\n            var element = event.toElement || event.relatedTarget;\n            if (!isLocalEl(this, element)) {\n                if (this.__pointerCapturing) {\n                    event.zrEventControl = 'no_globalout';\n                }\n                this.trigger('mouseout', event);\n            }\n        },\n        wheel: function (event) {\n            wheelEventSupported = true;\n            event = normalizeEvent(this.dom, event);\n            this.trigger('mousewheel', event);\n        },\n        mousewheel: function (event) {\n            if (wheelEventSupported) {\n                return;\n            }\n            event = normalizeEvent(this.dom, event);\n            this.trigger('mousewheel', event);\n        },\n        touchstart: function (event) {\n            event = normalizeEvent(this.dom, event);\n            markTouch(event);\n            this.__lastTouchMoment = new Date();\n            this.handler.processGesture(event, 'start');\n            localDOMHandlers.mousemove.call(this, event);\n            localDOMHandlers.mousedown.call(this, event);\n        },\n        touchmove: function (event) {\n            event = normalizeEvent(this.dom, event);\n            markTouch(event);\n            this.handler.processGesture(event, 'change');\n            localDOMHandlers.mousemove.call(this, event);\n        },\n        touchend: function (event) {\n            event = normalizeEvent(this.dom, event);\n            markTouch(event);\n            this.handler.processGesture(event, 'end');\n            localDOMHandlers.mouseup.call(this, event);\n            if (+new Date() - (+this.__lastTouchMoment) < TOUCH_CLICK_DELAY) {\n                localDOMHandlers.click.call(this, event);\n            }\n        },\n        pointerdown: function (event) {\n            localDOMHandlers.mousedown.call(this, event);\n        },\n        pointermove: function (event) {\n            if (!isPointerFromTouch(event)) {\n                localDOMHandlers.mousemove.call(this, event);\n            }\n        },\n        pointerup: function (event) {\n            localDOMHandlers.mouseup.call(this, event);\n        },\n        pointerout: function (event) {\n            if (!isPointerFromTouch(event)) {\n                localDOMHandlers.mouseout.call(this, event);\n            }\n        }\n    };\n    each(['click', 'dblclick', 'contextmenu'], function (name) {\n        localDOMHandlers[name] = function (event) {\n            event = normalizeEvent(this.dom, event);\n            this.trigger(name, event);\n        };\n    });\n    var globalDOMHandlers = {\n        pointermove: function (event) {\n            if (!isPointerFromTouch(event)) {\n                globalDOMHandlers.mousemove.call(this, event);\n            }\n        },\n        pointerup: function (event) {\n            globalDOMHandlers.mouseup.call(this, event);\n        },\n        mousemove: function (event) {\n            this.trigger('mousemove', event);\n        },\n        mouseup: function (event) {\n            var pointerCaptureReleasing = this.__pointerCapturing;\n            this.__togglePointerCapture(false);\n            this.trigger('mouseup', event);\n            if (pointerCaptureReleasing) {\n                event.zrEventControl = 'only_globalout';\n                this.trigger('mouseout', event);\n            }\n        }\n    };\n    function mountLocalDOMEventListeners(instance, scope) {\n        var domHandlers = scope.domHandlers;\n        if (env.pointerEventsSupported) {\n            each(localNativeListenerNames.pointer, function (nativeEventName) {\n                mountSingleDOMEventListener(scope, nativeEventName, function (event) {\n                    domHandlers[nativeEventName].call(instance, event);\n                });\n            });\n        }\n        else {\n            if (env.touchEventsSupported) {\n                each(localNativeListenerNames.touch, function (nativeEventName) {\n                    mountSingleDOMEventListener(scope, nativeEventName, function (event) {\n                        domHandlers[nativeEventName].call(instance, event);\n                        setTouchTimer(scope);\n                    });\n                });\n            }\n            each(localNativeListenerNames.mouse, function (nativeEventName) {\n                mountSingleDOMEventListener(scope, nativeEventName, function (event) {\n                    event = getNativeEvent(event);\n                    if (!scope.touching) {\n                        domHandlers[nativeEventName].call(instance, event);\n                    }\n                });\n            });\n        }\n    }\n    function mountGlobalDOMEventListeners(instance, scope) {\n        if (env.pointerEventsSupported) {\n            each(globalNativeListenerNames.pointer, mount);\n        }\n        else if (!env.touchEventsSupported) {\n            each(globalNativeListenerNames.mouse, mount);\n        }\n        function mount(nativeEventName) {\n            function nativeEventListener(event) {\n                event = getNativeEvent(event);\n                if (!isLocalEl(instance, event.target)) {\n                    event = normalizeGlobalEvent(instance, event);\n                    scope.domHandlers[nativeEventName].call(instance, event);\n                }\n            }\n            mountSingleDOMEventListener(scope, nativeEventName, nativeEventListener, { capture: true });\n        }\n    }\n    function mountSingleDOMEventListener(scope, nativeEventName, listener, opt) {\n        scope.mounted[nativeEventName] = listener;\n        scope.listenerOpts[nativeEventName] = opt;\n        addEventListener(scope.domTarget, nativeEventName, listener, opt);\n    }\n    function unmountDOMEventListeners(scope) {\n        var mounted = scope.mounted;\n        for (var nativeEventName in mounted) {\n            if (mounted.hasOwnProperty(nativeEventName)) {\n                removeEventListener(scope.domTarget, nativeEventName, mounted[nativeEventName], scope.listenerOpts[nativeEventName]);\n            }\n        }\n        scope.mounted = {};\n    }\n    var DOMHandlerScope = (function () {\n        function DOMHandlerScope(domTarget, domHandlers) {\n            this.mounted = {};\n            this.listenerOpts = {};\n            this.touching = false;\n            this.domTarget = domTarget;\n            this.domHandlers = domHandlers;\n        }\n        return DOMHandlerScope;\n    }());\n    var HandlerDomProxy = (function (_super) {\n        __extends(HandlerDomProxy, _super);\n        function HandlerDomProxy(dom, painterRoot) {\n            var _this = _super.call(this) || this;\n            _this.__pointerCapturing = false;\n            _this.dom = dom;\n            _this.painterRoot = painterRoot;\n            _this._localHandlerScope = new DOMHandlerScope(dom, localDOMHandlers);\n            if (globalEventSupported) {\n                _this._globalHandlerScope = new DOMHandlerScope(document, globalDOMHandlers);\n            }\n            mountLocalDOMEventListeners(_this, _this._localHandlerScope);\n            return _this;\n        }\n        HandlerDomProxy.prototype.dispose = function () {\n            unmountDOMEventListeners(this._localHandlerScope);\n            if (globalEventSupported) {\n                unmountDOMEventListeners(this._globalHandlerScope);\n            }\n        };\n        HandlerDomProxy.prototype.setCursor = function (cursorStyle) {\n            this.dom.style && (this.dom.style.cursor = cursorStyle || 'default');\n        };\n        HandlerDomProxy.prototype.__togglePointerCapture = function (isPointerCapturing) {\n            this.__mayPointerCapture = null;\n            if (globalEventSupported\n                && ((+this.__pointerCapturing) ^ (+isPointerCapturing))) {\n                this.__pointerCapturing = isPointerCapturing;\n                var globalHandlerScope = this._globalHandlerScope;\n                isPointerCapturing\n                    ? mountGlobalDOMEventListeners(this, globalHandlerScope)\n                    : unmountDOMEventListeners(globalHandlerScope);\n            }\n        };\n        return HandlerDomProxy;\n    }(Eventful));\n\n    var dpr = 1;\n    if (env.hasGlobalWindow) {\n        dpr = Math.max(window.devicePixelRatio\n            || (window.screen && window.screen.deviceXDPI / window.screen.logicalXDPI)\n            || 1, 1);\n    }\n    var devicePixelRatio = dpr;\n    var DARK_MODE_THRESHOLD = 0.4;\n    var DARK_LABEL_COLOR = '#333';\n    var LIGHT_LABEL_COLOR = '#ccc';\n    var LIGHTER_LABEL_COLOR = '#eee';\n\n    var mIdentity = identity;\n    var EPSILON$2 = 5e-5;\n    function isNotAroundZero$1(val) {\n        return val > EPSILON$2 || val < -EPSILON$2;\n    }\n    var scaleTmp = [];\n    var tmpTransform = [];\n    var originTransform = create$1();\n    var abs = Math.abs;\n    var Transformable = (function () {\n        function Transformable() {\n        }\n        Transformable.prototype.getLocalTransform = function (m) {\n            return Transformable.getLocalTransform(this, m);\n        };\n        Transformable.prototype.setPosition = function (arr) {\n            this.x = arr[0];\n            this.y = arr[1];\n        };\n        Transformable.prototype.setScale = function (arr) {\n            this.scaleX = arr[0];\n            this.scaleY = arr[1];\n        };\n        Transformable.prototype.setSkew = function (arr) {\n            this.skewX = arr[0];\n            this.skewY = arr[1];\n        };\n        Transformable.prototype.setOrigin = function (arr) {\n            this.originX = arr[0];\n            this.originY = arr[1];\n        };\n        Transformable.prototype.needLocalTransform = function () {\n            return isNotAroundZero$1(this.rotation)\n                || isNotAroundZero$1(this.x)\n                || isNotAroundZero$1(this.y)\n                || isNotAroundZero$1(this.scaleX - 1)\n                || isNotAroundZero$1(this.scaleY - 1)\n                || isNotAroundZero$1(this.skewX)\n                || isNotAroundZero$1(this.skewY);\n        };\n        Transformable.prototype.updateTransform = function () {\n            var parentTransform = this.parent && this.parent.transform;\n            var needLocalTransform = this.needLocalTransform();\n            var m = this.transform;\n            if (!(needLocalTransform || parentTransform)) {\n                if (m) {\n                    mIdentity(m);\n                    this.invTransform = null;\n                }\n                return;\n            }\n            m = m || create$1();\n            if (needLocalTransform) {\n                this.getLocalTransform(m);\n            }\n            else {\n                mIdentity(m);\n            }\n            if (parentTransform) {\n                if (needLocalTransform) {\n                    mul$1(m, parentTransform, m);\n                }\n                else {\n                    copy$1(m, parentTransform);\n                }\n            }\n            this.transform = m;\n            this._resolveGlobalScaleRatio(m);\n        };\n        Transformable.prototype._resolveGlobalScaleRatio = function (m) {\n            var globalScaleRatio = this.globalScaleRatio;\n            if (globalScaleRatio != null && globalScaleRatio !== 1) {\n                this.getGlobalScale(scaleTmp);\n                var relX = scaleTmp[0] < 0 ? -1 : 1;\n                var relY = scaleTmp[1] < 0 ? -1 : 1;\n                var sx = ((scaleTmp[0] - relX) * globalScaleRatio + relX) / scaleTmp[0] || 0;\n                var sy = ((scaleTmp[1] - relY) * globalScaleRatio + relY) / scaleTmp[1] || 0;\n                m[0] *= sx;\n                m[1] *= sx;\n                m[2] *= sy;\n                m[3] *= sy;\n            }\n            this.invTransform = this.invTransform || create$1();\n            invert(this.invTransform, m);\n        };\n        Transformable.prototype.getComputedTransform = function () {\n            var transformNode = this;\n            var ancestors = [];\n            while (transformNode) {\n                ancestors.push(transformNode);\n                transformNode = transformNode.parent;\n            }\n            while (transformNode = ancestors.pop()) {\n                transformNode.updateTransform();\n            }\n            return this.transform;\n        };\n        Transformable.prototype.setLocalTransform = function (m) {\n            if (!m) {\n                return;\n            }\n            var sx = m[0] * m[0] + m[1] * m[1];\n            var sy = m[2] * m[2] + m[3] * m[3];\n            var rotation = Math.atan2(m[1], m[0]);\n            var shearX = Math.PI / 2 + rotation - Math.atan2(m[3], m[2]);\n            sy = Math.sqrt(sy) * Math.cos(shearX);\n            sx = Math.sqrt(sx);\n            this.skewX = shearX;\n            this.skewY = 0;\n            this.rotation = -rotation;\n            this.x = +m[4];\n            this.y = +m[5];\n            this.scaleX = sx;\n            this.scaleY = sy;\n            this.originX = 0;\n            this.originY = 0;\n        };\n        Transformable.prototype.decomposeTransform = function () {\n            if (!this.transform) {\n                return;\n            }\n            var parent = this.parent;\n            var m = this.transform;\n            if (parent && parent.transform) {\n                parent.invTransform = parent.invTransform || create$1();\n                mul$1(tmpTransform, parent.invTransform, m);\n                m = tmpTransform;\n            }\n            var ox = this.originX;\n            var oy = this.originY;\n            if (ox || oy) {\n                originTransform[4] = ox;\n                originTransform[5] = oy;\n                mul$1(tmpTransform, m, originTransform);\n                tmpTransform[4] -= ox;\n                tmpTransform[5] -= oy;\n                m = tmpTransform;\n            }\n            this.setLocalTransform(m);\n        };\n        Transformable.prototype.getGlobalScale = function (out) {\n            var m = this.transform;\n            out = out || [];\n            if (!m) {\n                out[0] = 1;\n                out[1] = 1;\n                return out;\n            }\n            out[0] = Math.sqrt(m[0] * m[0] + m[1] * m[1]);\n            out[1] = Math.sqrt(m[2] * m[2] + m[3] * m[3]);\n            if (m[0] < 0) {\n                out[0] = -out[0];\n            }\n            if (m[3] < 0) {\n                out[1] = -out[1];\n            }\n            return out;\n        };\n        Transformable.prototype.transformCoordToLocal = function (x, y) {\n            var v2 = [x, y];\n            var invTransform = this.invTransform;\n            if (invTransform) {\n                applyTransform(v2, v2, invTransform);\n            }\n            return v2;\n        };\n        Transformable.prototype.transformCoordToGlobal = function (x, y) {\n            var v2 = [x, y];\n            var transform = this.transform;\n            if (transform) {\n                applyTransform(v2, v2, transform);\n            }\n            return v2;\n        };\n        Transformable.prototype.getLineScale = function () {\n            var m = this.transform;\n            return m && abs(m[0] - 1) > 1e-10 && abs(m[3] - 1) > 1e-10\n                ? Math.sqrt(abs(m[0] * m[3] - m[2] * m[1]))\n                : 1;\n        };\n        Transformable.prototype.copyTransform = function (source) {\n            copyTransform(this, source);\n        };\n        Transformable.getLocalTransform = function (target, m) {\n            m = m || [];\n            var ox = target.originX || 0;\n            var oy = target.originY || 0;\n            var sx = target.scaleX;\n            var sy = target.scaleY;\n            var ax = target.anchorX;\n            var ay = target.anchorY;\n            var rotation = target.rotation || 0;\n            var x = target.x;\n            var y = target.y;\n            var skewX = target.skewX ? Math.tan(target.skewX) : 0;\n            var skewY = target.skewY ? Math.tan(-target.skewY) : 0;\n            if (ox || oy || ax || ay) {\n                var dx = ox + ax;\n                var dy = oy + ay;\n                m[4] = -dx * sx - skewX * dy * sy;\n                m[5] = -dy * sy - skewY * dx * sx;\n            }\n            else {\n                m[4] = m[5] = 0;\n            }\n            m[0] = sx;\n            m[3] = sy;\n            m[1] = skewY * sx;\n            m[2] = skewX * sy;\n            rotation && rotate(m, m, rotation);\n            m[4] += ox + x;\n            m[5] += oy + y;\n            return m;\n        };\n        Transformable.initDefaultProps = (function () {\n            var proto = Transformable.prototype;\n            proto.scaleX =\n                proto.scaleY =\n                    proto.globalScaleRatio = 1;\n            proto.x =\n                proto.y =\n                    proto.originX =\n                        proto.originY =\n                            proto.skewX =\n                                proto.skewY =\n                                    proto.rotation =\n                                        proto.anchorX =\n                                            proto.anchorY = 0;\n        })();\n        return Transformable;\n    }());\n    var TRANSFORMABLE_PROPS = [\n        'x', 'y', 'originX', 'originY', 'anchorX', 'anchorY', 'rotation', 'scaleX', 'scaleY', 'skewX', 'skewY'\n    ];\n    function copyTransform(target, source) {\n        for (var i = 0; i < TRANSFORMABLE_PROPS.length; i++) {\n            var propName = TRANSFORMABLE_PROPS[i];\n            target[propName] = source[propName];\n        }\n    }\n\n    var textWidthCache = {};\n    function getWidth(text, font) {\n        font = font || DEFAULT_FONT;\n        var cacheOfFont = textWidthCache[font];\n        if (!cacheOfFont) {\n            cacheOfFont = textWidthCache[font] = new LRU(500);\n        }\n        var width = cacheOfFont.get(text);\n        if (width == null) {\n            width = platformApi.measureText(text, font).width;\n            cacheOfFont.put(text, width);\n        }\n        return width;\n    }\n    function innerGetBoundingRect(text, font, textAlign, textBaseline) {\n        var width = getWidth(text, font);\n        var height = getLineHeight(font);\n        var x = adjustTextX(0, width, textAlign);\n        var y = adjustTextY$1(0, height, textBaseline);\n        var rect = new BoundingRect(x, y, width, height);\n        return rect;\n    }\n    function getBoundingRect(text, font, textAlign, textBaseline) {\n        var textLines = ((text || '') + '').split('\\n');\n        var len = textLines.length;\n        if (len === 1) {\n            return innerGetBoundingRect(textLines[0], font, textAlign, textBaseline);\n        }\n        else {\n            var uniondRect = new BoundingRect(0, 0, 0, 0);\n            for (var i = 0; i < textLines.length; i++) {\n                var rect = innerGetBoundingRect(textLines[i], font, textAlign, textBaseline);\n                i === 0 ? uniondRect.copy(rect) : uniondRect.union(rect);\n            }\n            return uniondRect;\n        }\n    }\n    function adjustTextX(x, width, textAlign) {\n        if (textAlign === 'right') {\n            x -= width;\n        }\n        else if (textAlign === 'center') {\n            x -= width / 2;\n        }\n        return x;\n    }\n    function adjustTextY$1(y, height, verticalAlign) {\n        if (verticalAlign === 'middle') {\n            y -= height / 2;\n        }\n        else if (verticalAlign === 'bottom') {\n            y -= height;\n        }\n        return y;\n    }\n    function getLineHeight(font) {\n        return getWidth('国', font);\n    }\n    function parsePercent(value, maxValue) {\n        if (typeof value === 'string') {\n            if (value.lastIndexOf('%') >= 0) {\n                return parseFloat(value) / 100 * maxValue;\n            }\n            return parseFloat(value);\n        }\n        return value;\n    }\n    function calculateTextPosition(out, opts, rect) {\n        var textPosition = opts.position || 'inside';\n        var distance = opts.distance != null ? opts.distance : 5;\n        var height = rect.height;\n        var width = rect.width;\n        var halfHeight = height / 2;\n        var x = rect.x;\n        var y = rect.y;\n        var textAlign = 'left';\n        var textVerticalAlign = 'top';\n        if (textPosition instanceof Array) {\n            x += parsePercent(textPosition[0], rect.width);\n            y += parsePercent(textPosition[1], rect.height);\n            textAlign = null;\n            textVerticalAlign = null;\n        }\n        else {\n            switch (textPosition) {\n                case 'left':\n                    x -= distance;\n                    y += halfHeight;\n                    textAlign = 'right';\n                    textVerticalAlign = 'middle';\n                    break;\n                case 'right':\n                    x += distance + width;\n                    y += halfHeight;\n                    textVerticalAlign = 'middle';\n                    break;\n                case 'top':\n                    x += width / 2;\n                    y -= distance;\n                    textAlign = 'center';\n                    textVerticalAlign = 'bottom';\n                    break;\n                case 'bottom':\n                    x += width / 2;\n                    y += height + distance;\n                    textAlign = 'center';\n                    break;\n                case 'inside':\n                    x += width / 2;\n                    y += halfHeight;\n                    textAlign = 'center';\n                    textVerticalAlign = 'middle';\n                    break;\n                case 'insideLeft':\n                    x += distance;\n                    y += halfHeight;\n                    textVerticalAlign = 'middle';\n                    break;\n                case 'insideRight':\n                    x += width - distance;\n                    y += halfHeight;\n                    textAlign = 'right';\n                    textVerticalAlign = 'middle';\n                    break;\n                case 'insideTop':\n                    x += width / 2;\n                    y += distance;\n                    textAlign = 'center';\n                    break;\n                case 'insideBottom':\n                    x += width / 2;\n                    y += height - distance;\n                    textAlign = 'center';\n                    textVerticalAlign = 'bottom';\n                    break;\n                case 'insideTopLeft':\n                    x += distance;\n                    y += distance;\n                    break;\n                case 'insideTopRight':\n                    x += width - distance;\n                    y += distance;\n                    textAlign = 'right';\n                    break;\n                case 'insideBottomLeft':\n                    x += distance;\n                    y += height - distance;\n                    textVerticalAlign = 'bottom';\n                    break;\n                case 'insideBottomRight':\n                    x += width - distance;\n                    y += height - distance;\n                    textAlign = 'right';\n                    textVerticalAlign = 'bottom';\n                    break;\n            }\n        }\n        out = out || {};\n        out.x = x;\n        out.y = y;\n        out.align = textAlign;\n        out.verticalAlign = textVerticalAlign;\n        return out;\n    }\n\n    var PRESERVED_NORMAL_STATE = '__zr_normal__';\n    var PRIMARY_STATES_KEYS = TRANSFORMABLE_PROPS.concat(['ignore']);\n    var DEFAULT_ANIMATABLE_MAP = reduce(TRANSFORMABLE_PROPS, function (obj, key) {\n        obj[key] = true;\n        return obj;\n    }, { ignore: false });\n    var tmpTextPosCalcRes = {};\n    var tmpBoundingRect = new BoundingRect(0, 0, 0, 0);\n    var Element = (function () {\n        function Element(props) {\n            this.id = guid();\n            this.animators = [];\n            this.currentStates = [];\n            this.states = {};\n            this._init(props);\n        }\n        Element.prototype._init = function (props) {\n            this.attr(props);\n        };\n        Element.prototype.drift = function (dx, dy, e) {\n            switch (this.draggable) {\n                case 'horizontal':\n                    dy = 0;\n                    break;\n                case 'vertical':\n                    dx = 0;\n                    break;\n            }\n            var m = this.transform;\n            if (!m) {\n                m = this.transform = [1, 0, 0, 1, 0, 0];\n            }\n            m[4] += dx;\n            m[5] += dy;\n            this.decomposeTransform();\n            this.markRedraw();\n        };\n        Element.prototype.beforeUpdate = function () { };\n        Element.prototype.afterUpdate = function () { };\n        Element.prototype.update = function () {\n            this.updateTransform();\n            if (this.__dirty) {\n                this.updateInnerText();\n            }\n        };\n        Element.prototype.updateInnerText = function (forceUpdate) {\n            var textEl = this._textContent;\n            if (textEl && (!textEl.ignore || forceUpdate)) {\n                if (!this.textConfig) {\n                    this.textConfig = {};\n                }\n                var textConfig = this.textConfig;\n                var isLocal = textConfig.local;\n                var innerTransformable = textEl.innerTransformable;\n                var textAlign = void 0;\n                var textVerticalAlign = void 0;\n                var textStyleChanged = false;\n                innerTransformable.parent = isLocal ? this : null;\n                var innerOrigin = false;\n                innerTransformable.copyTransform(textEl);\n                if (textConfig.position != null) {\n                    var layoutRect = tmpBoundingRect;\n                    if (textConfig.layoutRect) {\n                        layoutRect.copy(textConfig.layoutRect);\n                    }\n                    else {\n                        layoutRect.copy(this.getBoundingRect());\n                    }\n                    if (!isLocal) {\n                        layoutRect.applyTransform(this.transform);\n                    }\n                    if (this.calculateTextPosition) {\n                        this.calculateTextPosition(tmpTextPosCalcRes, textConfig, layoutRect);\n                    }\n                    else {\n                        calculateTextPosition(tmpTextPosCalcRes, textConfig, layoutRect);\n                    }\n                    innerTransformable.x = tmpTextPosCalcRes.x;\n                    innerTransformable.y = tmpTextPosCalcRes.y;\n                    textAlign = tmpTextPosCalcRes.align;\n                    textVerticalAlign = tmpTextPosCalcRes.verticalAlign;\n                    var textOrigin = textConfig.origin;\n                    if (textOrigin && textConfig.rotation != null) {\n                        var relOriginX = void 0;\n                        var relOriginY = void 0;\n                        if (textOrigin === 'center') {\n                            relOriginX = layoutRect.width * 0.5;\n                            relOriginY = layoutRect.height * 0.5;\n                        }\n                        else {\n                            relOriginX = parsePercent(textOrigin[0], layoutRect.width);\n                            relOriginY = parsePercent(textOrigin[1], layoutRect.height);\n                        }\n                        innerOrigin = true;\n                        innerTransformable.originX = -innerTransformable.x + relOriginX + (isLocal ? 0 : layoutRect.x);\n                        innerTransformable.originY = -innerTransformable.y + relOriginY + (isLocal ? 0 : layoutRect.y);\n                    }\n                }\n                if (textConfig.rotation != null) {\n                    innerTransformable.rotation = textConfig.rotation;\n                }\n                var textOffset = textConfig.offset;\n                if (textOffset) {\n                    innerTransformable.x += textOffset[0];\n                    innerTransformable.y += textOffset[1];\n                    if (!innerOrigin) {\n                        innerTransformable.originX = -textOffset[0];\n                        innerTransformable.originY = -textOffset[1];\n                    }\n                }\n                var isInside = textConfig.inside == null\n                    ? (typeof textConfig.position === 'string' && textConfig.position.indexOf('inside') >= 0)\n                    : textConfig.inside;\n                var innerTextDefaultStyle = this._innerTextDefaultStyle || (this._innerTextDefaultStyle = {});\n                var textFill = void 0;\n                var textStroke = void 0;\n                var autoStroke = void 0;\n                if (isInside && this.canBeInsideText()) {\n                    textFill = textConfig.insideFill;\n                    textStroke = textConfig.insideStroke;\n                    if (textFill == null || textFill === 'auto') {\n                        textFill = this.getInsideTextFill();\n                    }\n                    if (textStroke == null || textStroke === 'auto') {\n                        textStroke = this.getInsideTextStroke(textFill);\n                        autoStroke = true;\n                    }\n                }\n                else {\n                    textFill = textConfig.outsideFill;\n                    textStroke = textConfig.outsideStroke;\n                    if (textFill == null || textFill === 'auto') {\n                        textFill = this.getOutsideFill();\n                    }\n                    if (textStroke == null || textStroke === 'auto') {\n                        textStroke = this.getOutsideStroke(textFill);\n                        autoStroke = true;\n                    }\n                }\n                textFill = textFill || '#000';\n                if (textFill !== innerTextDefaultStyle.fill\n                    || textStroke !== innerTextDefaultStyle.stroke\n                    || autoStroke !== innerTextDefaultStyle.autoStroke\n                    || textAlign !== innerTextDefaultStyle.align\n                    || textVerticalAlign !== innerTextDefaultStyle.verticalAlign) {\n                    textStyleChanged = true;\n                    innerTextDefaultStyle.fill = textFill;\n                    innerTextDefaultStyle.stroke = textStroke;\n                    innerTextDefaultStyle.autoStroke = autoStroke;\n                    innerTextDefaultStyle.align = textAlign;\n                    innerTextDefaultStyle.verticalAlign = textVerticalAlign;\n                    textEl.setDefaultTextStyle(innerTextDefaultStyle);\n                }\n                textEl.__dirty |= REDRAW_BIT;\n                if (textStyleChanged) {\n                    textEl.dirtyStyle(true);\n                }\n            }\n        };\n        Element.prototype.canBeInsideText = function () {\n            return true;\n        };\n        Element.prototype.getInsideTextFill = function () {\n            return '#fff';\n        };\n        Element.prototype.getInsideTextStroke = function (textFill) {\n            return '#000';\n        };\n        Element.prototype.getOutsideFill = function () {\n            return this.__zr && this.__zr.isDarkMode() ? LIGHT_LABEL_COLOR : DARK_LABEL_COLOR;\n        };\n        Element.prototype.getOutsideStroke = function (textFill) {\n            var backgroundColor = this.__zr && this.__zr.getBackgroundColor();\n            var colorArr = typeof backgroundColor === 'string' && parse(backgroundColor);\n            if (!colorArr) {\n                colorArr = [255, 255, 255, 1];\n            }\n            var alpha = colorArr[3];\n            var isDark = this.__zr.isDarkMode();\n            for (var i = 0; i < 3; i++) {\n                colorArr[i] = colorArr[i] * alpha + (isDark ? 0 : 255) * (1 - alpha);\n            }\n            colorArr[3] = 1;\n            return stringify(colorArr, 'rgba');\n        };\n        Element.prototype.traverse = function (cb, context) { };\n        Element.prototype.attrKV = function (key, value) {\n            if (key === 'textConfig') {\n                this.setTextConfig(value);\n            }\n            else if (key === 'textContent') {\n                this.setTextContent(value);\n            }\n            else if (key === 'clipPath') {\n                this.setClipPath(value);\n            }\n            else if (key === 'extra') {\n                this.extra = this.extra || {};\n                extend(this.extra, value);\n            }\n            else {\n                this[key] = value;\n            }\n        };\n        Element.prototype.hide = function () {\n            this.ignore = true;\n            this.markRedraw();\n        };\n        Element.prototype.show = function () {\n            this.ignore = false;\n            this.markRedraw();\n        };\n        Element.prototype.attr = function (keyOrObj, value) {\n            if (typeof keyOrObj === 'string') {\n                this.attrKV(keyOrObj, value);\n            }\n            else if (isObject(keyOrObj)) {\n                var obj = keyOrObj;\n                var keysArr = keys(obj);\n                for (var i = 0; i < keysArr.length; i++) {\n                    var key = keysArr[i];\n                    this.attrKV(key, keyOrObj[key]);\n                }\n            }\n            this.markRedraw();\n            return this;\n        };\n        Element.prototype.saveCurrentToNormalState = function (toState) {\n            this._innerSaveToNormal(toState);\n            var normalState = this._normalState;\n            for (var i = 0; i < this.animators.length; i++) {\n                var animator = this.animators[i];\n                var fromStateTransition = animator.__fromStateTransition;\n                if (animator.getLoop() || fromStateTransition && fromStateTransition !== PRESERVED_NORMAL_STATE) {\n                    continue;\n                }\n                var targetName = animator.targetName;\n                var target = targetName\n                    ? normalState[targetName] : normalState;\n                animator.saveTo(target);\n            }\n        };\n        Element.prototype._innerSaveToNormal = function (toState) {\n            var normalState = this._normalState;\n            if (!normalState) {\n                normalState = this._normalState = {};\n            }\n            if (toState.textConfig && !normalState.textConfig) {\n                normalState.textConfig = this.textConfig;\n            }\n            this._savePrimaryToNormal(toState, normalState, PRIMARY_STATES_KEYS);\n        };\n        Element.prototype._savePrimaryToNormal = function (toState, normalState, primaryKeys) {\n            for (var i = 0; i < primaryKeys.length; i++) {\n                var key = primaryKeys[i];\n                if (toState[key] != null && !(key in normalState)) {\n                    normalState[key] = this[key];\n                }\n            }\n        };\n        Element.prototype.hasState = function () {\n            return this.currentStates.length > 0;\n        };\n        Element.prototype.getState = function (name) {\n            return this.states[name];\n        };\n        Element.prototype.ensureState = function (name) {\n            var states = this.states;\n            if (!states[name]) {\n                states[name] = {};\n            }\n            return states[name];\n        };\n        Element.prototype.clearStates = function (noAnimation) {\n            this.useState(PRESERVED_NORMAL_STATE, false, noAnimation);\n        };\n        Element.prototype.useState = function (stateName, keepCurrentStates, noAnimation, forceUseHoverLayer) {\n            var toNormalState = stateName === PRESERVED_NORMAL_STATE;\n            var hasStates = this.hasState();\n            if (!hasStates && toNormalState) {\n                return;\n            }\n            var currentStates = this.currentStates;\n            var animationCfg = this.stateTransition;\n            if (indexOf(currentStates, stateName) >= 0 && (keepCurrentStates || currentStates.length === 1)) {\n                return;\n            }\n            var state;\n            if (this.stateProxy && !toNormalState) {\n                state = this.stateProxy(stateName);\n            }\n            if (!state) {\n                state = (this.states && this.states[stateName]);\n            }\n            if (!state && !toNormalState) {\n                logError(\"State \" + stateName + \" not exists.\");\n                return;\n            }\n            if (!toNormalState) {\n                this.saveCurrentToNormalState(state);\n            }\n            var useHoverLayer = !!((state && state.hoverLayer) || forceUseHoverLayer);\n            if (useHoverLayer) {\n                this._toggleHoverLayerFlag(true);\n            }\n            this._applyStateObj(stateName, state, this._normalState, keepCurrentStates, !noAnimation && !this.__inHover && animationCfg && animationCfg.duration > 0, animationCfg);\n            var textContent = this._textContent;\n            var textGuide = this._textGuide;\n            if (textContent) {\n                textContent.useState(stateName, keepCurrentStates, noAnimation, useHoverLayer);\n            }\n            if (textGuide) {\n                textGuide.useState(stateName, keepCurrentStates, noAnimation, useHoverLayer);\n            }\n            if (toNormalState) {\n                this.currentStates = [];\n                this._normalState = {};\n            }\n            else {\n                if (!keepCurrentStates) {\n                    this.currentStates = [stateName];\n                }\n                else {\n                    this.currentStates.push(stateName);\n                }\n            }\n            this._updateAnimationTargets();\n            this.markRedraw();\n            if (!useHoverLayer && this.__inHover) {\n                this._toggleHoverLayerFlag(false);\n                this.__dirty &= ~REDRAW_BIT;\n            }\n            return state;\n        };\n        Element.prototype.useStates = function (states, noAnimation, forceUseHoverLayer) {\n            if (!states.length) {\n                this.clearStates();\n            }\n            else {\n                var stateObjects = [];\n                var currentStates = this.currentStates;\n                var len = states.length;\n                var notChange = len === currentStates.length;\n                if (notChange) {\n                    for (var i = 0; i < len; i++) {\n                        if (states[i] !== currentStates[i]) {\n                            notChange = false;\n                            break;\n                        }\n                    }\n                }\n                if (notChange) {\n                    return;\n                }\n                for (var i = 0; i < len; i++) {\n                    var stateName = states[i];\n                    var stateObj = void 0;\n                    if (this.stateProxy) {\n                        stateObj = this.stateProxy(stateName, states);\n                    }\n                    if (!stateObj) {\n                        stateObj = this.states[stateName];\n                    }\n                    if (stateObj) {\n                        stateObjects.push(stateObj);\n                    }\n                }\n                var lastStateObj = stateObjects[len - 1];\n                var useHoverLayer = !!((lastStateObj && lastStateObj.hoverLayer) || forceUseHoverLayer);\n                if (useHoverLayer) {\n                    this._toggleHoverLayerFlag(true);\n                }\n                var mergedState = this._mergeStates(stateObjects);\n                var animationCfg = this.stateTransition;\n                this.saveCurrentToNormalState(mergedState);\n                this._applyStateObj(states.join(','), mergedState, this._normalState, false, !noAnimation && !this.__inHover && animationCfg && animationCfg.duration > 0, animationCfg);\n                var textContent = this._textContent;\n                var textGuide = this._textGuide;\n                if (textContent) {\n                    textContent.useStates(states, noAnimation, useHoverLayer);\n                }\n                if (textGuide) {\n                    textGuide.useStates(states, noAnimation, useHoverLayer);\n                }\n                this._updateAnimationTargets();\n                this.currentStates = states.slice();\n                this.markRedraw();\n                if (!useHoverLayer && this.__inHover) {\n                    this._toggleHoverLayerFlag(false);\n                    this.__dirty &= ~REDRAW_BIT;\n                }\n            }\n        };\n        Element.prototype.isSilent = function () {\n            var isSilent = this.silent;\n            var ancestor = this.parent;\n            while (!isSilent && ancestor) {\n                if (ancestor.silent) {\n                    isSilent = true;\n                    break;\n                }\n                ancestor = ancestor.parent;\n            }\n            return isSilent;\n        };\n        Element.prototype._updateAnimationTargets = function () {\n            for (var i = 0; i < this.animators.length; i++) {\n                var animator = this.animators[i];\n                if (animator.targetName) {\n                    animator.changeTarget(this[animator.targetName]);\n                }\n            }\n        };\n        Element.prototype.removeState = function (state) {\n            var idx = indexOf(this.currentStates, state);\n            if (idx >= 0) {\n                var currentStates = this.currentStates.slice();\n                currentStates.splice(idx, 1);\n                this.useStates(currentStates);\n            }\n        };\n        Element.prototype.replaceState = function (oldState, newState, forceAdd) {\n            var currentStates = this.currentStates.slice();\n            var idx = indexOf(currentStates, oldState);\n            var newStateExists = indexOf(currentStates, newState) >= 0;\n            if (idx >= 0) {\n                if (!newStateExists) {\n                    currentStates[idx] = newState;\n                }\n                else {\n                    currentStates.splice(idx, 1);\n                }\n            }\n            else if (forceAdd && !newStateExists) {\n                currentStates.push(newState);\n            }\n            this.useStates(currentStates);\n        };\n        Element.prototype.toggleState = function (state, enable) {\n            if (enable) {\n                this.useState(state, true);\n            }\n            else {\n                this.removeState(state);\n            }\n        };\n        Element.prototype._mergeStates = function (states) {\n            var mergedState = {};\n            var mergedTextConfig;\n            for (var i = 0; i < states.length; i++) {\n                var state = states[i];\n                extend(mergedState, state);\n                if (state.textConfig) {\n                    mergedTextConfig = mergedTextConfig || {};\n                    extend(mergedTextConfig, state.textConfig);\n                }\n            }\n            if (mergedTextConfig) {\n                mergedState.textConfig = mergedTextConfig;\n            }\n            return mergedState;\n        };\n        Element.prototype._applyStateObj = function (stateName, state, normalState, keepCurrentStates, transition, animationCfg) {\n            var needsRestoreToNormal = !(state && keepCurrentStates);\n            if (state && state.textConfig) {\n                this.textConfig = extend({}, keepCurrentStates ? this.textConfig : normalState.textConfig);\n                extend(this.textConfig, state.textConfig);\n            }\n            else if (needsRestoreToNormal) {\n                if (normalState.textConfig) {\n                    this.textConfig = normalState.textConfig;\n                }\n            }\n            var transitionTarget = {};\n            var hasTransition = false;\n            for (var i = 0; i < PRIMARY_STATES_KEYS.length; i++) {\n                var key = PRIMARY_STATES_KEYS[i];\n                var propNeedsTransition = transition && DEFAULT_ANIMATABLE_MAP[key];\n                if (state && state[key] != null) {\n                    if (propNeedsTransition) {\n                        hasTransition = true;\n                        transitionTarget[key] = state[key];\n                    }\n                    else {\n                        this[key] = state[key];\n                    }\n                }\n                else if (needsRestoreToNormal) {\n                    if (normalState[key] != null) {\n                        if (propNeedsTransition) {\n                            hasTransition = true;\n                            transitionTarget[key] = normalState[key];\n                        }\n                        else {\n                            this[key] = normalState[key];\n                        }\n                    }\n                }\n            }\n            if (!transition) {\n                for (var i = 0; i < this.animators.length; i++) {\n                    var animator = this.animators[i];\n                    var targetName = animator.targetName;\n                    if (!animator.getLoop()) {\n                        animator.__changeFinalValue(targetName\n                            ? (state || normalState)[targetName]\n                            : (state || normalState));\n                    }\n                }\n            }\n            if (hasTransition) {\n                this._transitionState(stateName, transitionTarget, animationCfg);\n            }\n        };\n        Element.prototype._attachComponent = function (componentEl) {\n            if (componentEl.__zr && !componentEl.__hostTarget) {\n                if (\"development\" !== 'production') {\n                    throw new Error('Text element has been added to zrender.');\n                }\n                return;\n            }\n            if (componentEl === this) {\n                if (\"development\" !== 'production') {\n                    throw new Error('Recursive component attachment.');\n                }\n                return;\n            }\n            var zr = this.__zr;\n            if (zr) {\n                componentEl.addSelfToZr(zr);\n            }\n            componentEl.__zr = zr;\n            componentEl.__hostTarget = this;\n        };\n        Element.prototype._detachComponent = function (componentEl) {\n            if (componentEl.__zr) {\n                componentEl.removeSelfFromZr(componentEl.__zr);\n            }\n            componentEl.__zr = null;\n            componentEl.__hostTarget = null;\n        };\n        Element.prototype.getClipPath = function () {\n            return this._clipPath;\n        };\n        Element.prototype.setClipPath = function (clipPath) {\n            if (this._clipPath && this._clipPath !== clipPath) {\n                this.removeClipPath();\n            }\n            this._attachComponent(clipPath);\n            this._clipPath = clipPath;\n            this.markRedraw();\n        };\n        Element.prototype.removeClipPath = function () {\n            var clipPath = this._clipPath;\n            if (clipPath) {\n                this._detachComponent(clipPath);\n                this._clipPath = null;\n                this.markRedraw();\n            }\n        };\n        Element.prototype.getTextContent = function () {\n            return this._textContent;\n        };\n        Element.prototype.setTextContent = function (textEl) {\n            var previousTextContent = this._textContent;\n            if (previousTextContent === textEl) {\n                return;\n            }\n            if (previousTextContent && previousTextContent !== textEl) {\n                this.removeTextContent();\n            }\n            if (\"development\" !== 'production') {\n                if (textEl.__zr && !textEl.__hostTarget) {\n                    throw new Error('Text element has been added to zrender.');\n                }\n            }\n            textEl.innerTransformable = new Transformable();\n            this._attachComponent(textEl);\n            this._textContent = textEl;\n            this.markRedraw();\n        };\n        Element.prototype.setTextConfig = function (cfg) {\n            if (!this.textConfig) {\n                this.textConfig = {};\n            }\n            extend(this.textConfig, cfg);\n            this.markRedraw();\n        };\n        Element.prototype.removeTextConfig = function () {\n            this.textConfig = null;\n            this.markRedraw();\n        };\n        Element.prototype.removeTextContent = function () {\n            var textEl = this._textContent;\n            if (textEl) {\n                textEl.innerTransformable = null;\n                this._detachComponent(textEl);\n                this._textContent = null;\n                this._innerTextDefaultStyle = null;\n                this.markRedraw();\n            }\n        };\n        Element.prototype.getTextGuideLine = function () {\n            return this._textGuide;\n        };\n        Element.prototype.setTextGuideLine = function (guideLine) {\n            if (this._textGuide && this._textGuide !== guideLine) {\n                this.removeTextGuideLine();\n            }\n            this._attachComponent(guideLine);\n            this._textGuide = guideLine;\n            this.markRedraw();\n        };\n        Element.prototype.removeTextGuideLine = function () {\n            var textGuide = this._textGuide;\n            if (textGuide) {\n                this._detachComponent(textGuide);\n                this._textGuide = null;\n                this.markRedraw();\n            }\n        };\n        Element.prototype.markRedraw = function () {\n            this.__dirty |= REDRAW_BIT;\n            var zr = this.__zr;\n            if (zr) {\n                if (this.__inHover) {\n                    zr.refreshHover();\n                }\n                else {\n                    zr.refresh();\n                }\n            }\n            if (this.__hostTarget) {\n                this.__hostTarget.markRedraw();\n            }\n        };\n        Element.prototype.dirty = function () {\n            this.markRedraw();\n        };\n        Element.prototype._toggleHoverLayerFlag = function (inHover) {\n            this.__inHover = inHover;\n            var textContent = this._textContent;\n            var textGuide = this._textGuide;\n            if (textContent) {\n                textContent.__inHover = inHover;\n            }\n            if (textGuide) {\n                textGuide.__inHover = inHover;\n            }\n        };\n        Element.prototype.addSelfToZr = function (zr) {\n            if (this.__zr === zr) {\n                return;\n            }\n            this.__zr = zr;\n            var animators = this.animators;\n            if (animators) {\n                for (var i = 0; i < animators.length; i++) {\n                    zr.animation.addAnimator(animators[i]);\n                }\n            }\n            if (this._clipPath) {\n                this._clipPath.addSelfToZr(zr);\n            }\n            if (this._textContent) {\n                this._textContent.addSelfToZr(zr);\n            }\n            if (this._textGuide) {\n                this._textGuide.addSelfToZr(zr);\n            }\n        };\n        Element.prototype.removeSelfFromZr = function (zr) {\n            if (!this.__zr) {\n                return;\n            }\n            this.__zr = null;\n            var animators = this.animators;\n            if (animators) {\n                for (var i = 0; i < animators.length; i++) {\n                    zr.animation.removeAnimator(animators[i]);\n                }\n            }\n            if (this._clipPath) {\n                this._clipPath.removeSelfFromZr(zr);\n            }\n            if (this._textContent) {\n                this._textContent.removeSelfFromZr(zr);\n            }\n            if (this._textGuide) {\n                this._textGuide.removeSelfFromZr(zr);\n            }\n        };\n        Element.prototype.animate = function (key, loop, allowDiscreteAnimation) {\n            var target = key ? this[key] : this;\n            if (\"development\" !== 'production') {\n                if (!target) {\n                    logError('Property \"'\n                        + key\n                        + '\" is not existed in element '\n                        + this.id);\n                    return;\n                }\n            }\n            var animator = new Animator(target, loop, allowDiscreteAnimation);\n            key && (animator.targetName = key);\n            this.addAnimator(animator, key);\n            return animator;\n        };\n        Element.prototype.addAnimator = function (animator, key) {\n            var zr = this.__zr;\n            var el = this;\n            animator.during(function () {\n                el.updateDuringAnimation(key);\n            }).done(function () {\n                var animators = el.animators;\n                var idx = indexOf(animators, animator);\n                if (idx >= 0) {\n                    animators.splice(idx, 1);\n                }\n            });\n            this.animators.push(animator);\n            if (zr) {\n                zr.animation.addAnimator(animator);\n            }\n            zr && zr.wakeUp();\n        };\n        Element.prototype.updateDuringAnimation = function (key) {\n            this.markRedraw();\n        };\n        Element.prototype.stopAnimation = function (scope, forwardToLast) {\n            var animators = this.animators;\n            var len = animators.length;\n            var leftAnimators = [];\n            for (var i = 0; i < len; i++) {\n                var animator = animators[i];\n                if (!scope || scope === animator.scope) {\n                    animator.stop(forwardToLast);\n                }\n                else {\n                    leftAnimators.push(animator);\n                }\n            }\n            this.animators = leftAnimators;\n            return this;\n        };\n        Element.prototype.animateTo = function (target, cfg, animationProps) {\n            animateTo(this, target, cfg, animationProps);\n        };\n        Element.prototype.animateFrom = function (target, cfg, animationProps) {\n            animateTo(this, target, cfg, animationProps, true);\n        };\n        Element.prototype._transitionState = function (stateName, target, cfg, animationProps) {\n            var animators = animateTo(this, target, cfg, animationProps);\n            for (var i = 0; i < animators.length; i++) {\n                animators[i].__fromStateTransition = stateName;\n            }\n        };\n        Element.prototype.getBoundingRect = function () {\n            return null;\n        };\n        Element.prototype.getPaintRect = function () {\n            return null;\n        };\n        Element.initDefaultProps = (function () {\n            var elProto = Element.prototype;\n            elProto.type = 'element';\n            elProto.name = '';\n            elProto.ignore =\n                elProto.silent =\n                    elProto.isGroup =\n                        elProto.draggable =\n                            elProto.dragging =\n                                elProto.ignoreClip =\n                                    elProto.__inHover = false;\n            elProto.__dirty = REDRAW_BIT;\n            var logs = {};\n            function logDeprecatedError(key, xKey, yKey) {\n                if (!logs[key + xKey + yKey]) {\n                    console.warn(\"DEPRECATED: '\" + key + \"' has been deprecated. use '\" + xKey + \"', '\" + yKey + \"' instead\");\n                    logs[key + xKey + yKey] = true;\n                }\n            }\n            function createLegacyProperty(key, privateKey, xKey, yKey) {\n                Object.defineProperty(elProto, key, {\n                    get: function () {\n                        if (\"development\" !== 'production') {\n                            logDeprecatedError(key, xKey, yKey);\n                        }\n                        if (!this[privateKey]) {\n                            var pos = this[privateKey] = [];\n                            enhanceArray(this, pos);\n                        }\n                        return this[privateKey];\n                    },\n                    set: function (pos) {\n                        if (\"development\" !== 'production') {\n                            logDeprecatedError(key, xKey, yKey);\n                        }\n                        this[xKey] = pos[0];\n                        this[yKey] = pos[1];\n                        this[privateKey] = pos;\n                        enhanceArray(this, pos);\n                    }\n                });\n                function enhanceArray(self, pos) {\n                    Object.defineProperty(pos, 0, {\n                        get: function () {\n                            return self[xKey];\n                        },\n                        set: function (val) {\n                            self[xKey] = val;\n                        }\n                    });\n                    Object.defineProperty(pos, 1, {\n                        get: function () {\n                            return self[yKey];\n                        },\n                        set: function (val) {\n                            self[yKey] = val;\n                        }\n                    });\n                }\n            }\n            if (Object.defineProperty) {\n                createLegacyProperty('position', '_legacyPos', 'x', 'y');\n                createLegacyProperty('scale', '_legacyScale', 'scaleX', 'scaleY');\n                createLegacyProperty('origin', '_legacyOrigin', 'originX', 'originY');\n            }\n        })();\n        return Element;\n    }());\n    mixin(Element, Eventful);\n    mixin(Element, Transformable);\n    function animateTo(animatable, target, cfg, animationProps, reverse) {\n        cfg = cfg || {};\n        var animators = [];\n        animateToShallow(animatable, '', animatable, target, cfg, animationProps, animators, reverse);\n        var finishCount = animators.length;\n        var doneHappened = false;\n        var cfgDone = cfg.done;\n        var cfgAborted = cfg.aborted;\n        var doneCb = function () {\n            doneHappened = true;\n            finishCount--;\n            if (finishCount <= 0) {\n                doneHappened\n                    ? (cfgDone && cfgDone())\n                    : (cfgAborted && cfgAborted());\n            }\n        };\n        var abortedCb = function () {\n            finishCount--;\n            if (finishCount <= 0) {\n                doneHappened\n                    ? (cfgDone && cfgDone())\n                    : (cfgAborted && cfgAborted());\n            }\n        };\n        if (!finishCount) {\n            cfgDone && cfgDone();\n        }\n        if (animators.length > 0 && cfg.during) {\n            animators[0].during(function (target, percent) {\n                cfg.during(percent);\n            });\n        }\n        for (var i = 0; i < animators.length; i++) {\n            var animator = animators[i];\n            if (doneCb) {\n                animator.done(doneCb);\n            }\n            if (abortedCb) {\n                animator.aborted(abortedCb);\n            }\n            if (cfg.force) {\n                animator.duration(cfg.duration);\n            }\n            animator.start(cfg.easing);\n        }\n        return animators;\n    }\n    function copyArrShallow(source, target, len) {\n        for (var i = 0; i < len; i++) {\n            source[i] = target[i];\n        }\n    }\n    function is2DArray(value) {\n        return isArrayLike(value[0]);\n    }\n    function copyValue(target, source, key) {\n        if (isArrayLike(source[key])) {\n            if (!isArrayLike(target[key])) {\n                target[key] = [];\n            }\n            if (isTypedArray(source[key])) {\n                var len = source[key].length;\n                if (target[key].length !== len) {\n                    target[key] = new (source[key].constructor)(len);\n                    copyArrShallow(target[key], source[key], len);\n                }\n            }\n            else {\n                var sourceArr = source[key];\n                var targetArr = target[key];\n                var len0 = sourceArr.length;\n                if (is2DArray(sourceArr)) {\n                    var len1 = sourceArr[0].length;\n                    for (var i = 0; i < len0; i++) {\n                        if (!targetArr[i]) {\n                            targetArr[i] = Array.prototype.slice.call(sourceArr[i]);\n                        }\n                        else {\n                            copyArrShallow(targetArr[i], sourceArr[i], len1);\n                        }\n                    }\n                }\n                else {\n                    copyArrShallow(targetArr, sourceArr, len0);\n                }\n                targetArr.length = sourceArr.length;\n            }\n        }\n        else {\n            target[key] = source[key];\n        }\n    }\n    function isValueSame(val1, val2) {\n        return val1 === val2\n            || isArrayLike(val1) && isArrayLike(val2) && is1DArraySame(val1, val2);\n    }\n    function is1DArraySame(arr0, arr1) {\n        var len = arr0.length;\n        if (len !== arr1.length) {\n            return false;\n        }\n        for (var i = 0; i < len; i++) {\n            if (arr0[i] !== arr1[i]) {\n                return false;\n            }\n        }\n        return true;\n    }\n    function animateToShallow(animatable, topKey, animateObj, target, cfg, animationProps, animators, reverse) {\n        var targetKeys = keys(target);\n        var duration = cfg.duration;\n        var delay = cfg.delay;\n        var additive = cfg.additive;\n        var setToFinal = cfg.setToFinal;\n        var animateAll = !isObject(animationProps);\n        var existsAnimators = animatable.animators;\n        var animationKeys = [];\n        for (var k = 0; k < targetKeys.length; k++) {\n            var innerKey = targetKeys[k];\n            var targetVal = target[innerKey];\n            if (targetVal != null && animateObj[innerKey] != null\n                && (animateAll || animationProps[innerKey])) {\n                if (isObject(targetVal)\n                    && !isArrayLike(targetVal)\n                    && !isGradientObject(targetVal)) {\n                    if (topKey) {\n                        if (!reverse) {\n                            animateObj[innerKey] = targetVal;\n                            animatable.updateDuringAnimation(topKey);\n                        }\n                        continue;\n                    }\n                    animateToShallow(animatable, innerKey, animateObj[innerKey], targetVal, cfg, animationProps && animationProps[innerKey], animators, reverse);\n                }\n                else {\n                    animationKeys.push(innerKey);\n                }\n            }\n            else if (!reverse) {\n                animateObj[innerKey] = targetVal;\n                animatable.updateDuringAnimation(topKey);\n                animationKeys.push(innerKey);\n            }\n        }\n        var keyLen = animationKeys.length;\n        if (!additive && keyLen) {\n            for (var i = 0; i < existsAnimators.length; i++) {\n                var animator = existsAnimators[i];\n                if (animator.targetName === topKey) {\n                    var allAborted = animator.stopTracks(animationKeys);\n                    if (allAborted) {\n                        var idx = indexOf(existsAnimators, animator);\n                        existsAnimators.splice(idx, 1);\n                    }\n                }\n            }\n        }\n        if (!cfg.force) {\n            animationKeys = filter(animationKeys, function (key) { return !isValueSame(target[key], animateObj[key]); });\n            keyLen = animationKeys.length;\n        }\n        if (keyLen > 0\n            || (cfg.force && !animators.length)) {\n            var revertedSource = void 0;\n            var reversedTarget = void 0;\n            var sourceClone = void 0;\n            if (reverse) {\n                reversedTarget = {};\n                if (setToFinal) {\n                    revertedSource = {};\n                }\n                for (var i = 0; i < keyLen; i++) {\n                    var innerKey = animationKeys[i];\n                    reversedTarget[innerKey] = animateObj[innerKey];\n                    if (setToFinal) {\n                        revertedSource[innerKey] = target[innerKey];\n                    }\n                    else {\n                        animateObj[innerKey] = target[innerKey];\n                    }\n                }\n            }\n            else if (setToFinal) {\n                sourceClone = {};\n                for (var i = 0; i < keyLen; i++) {\n                    var innerKey = animationKeys[i];\n                    sourceClone[innerKey] = cloneValue(animateObj[innerKey]);\n                    copyValue(animateObj, target, innerKey);\n                }\n            }\n            var animator = new Animator(animateObj, false, false, additive ? filter(existsAnimators, function (animator) { return animator.targetName === topKey; }) : null);\n            animator.targetName = topKey;\n            if (cfg.scope) {\n                animator.scope = cfg.scope;\n            }\n            if (setToFinal && revertedSource) {\n                animator.whenWithKeys(0, revertedSource, animationKeys);\n            }\n            if (sourceClone) {\n                animator.whenWithKeys(0, sourceClone, animationKeys);\n            }\n            animator.whenWithKeys(duration == null ? 500 : duration, reverse ? reversedTarget : target, animationKeys).delay(delay || 0);\n            animatable.addAnimator(animator, topKey);\n            animators.push(animator);\n        }\n    }\n\n    var Group = (function (_super) {\n        __extends(Group, _super);\n        function Group(opts) {\n            var _this = _super.call(this) || this;\n            _this.isGroup = true;\n            _this._children = [];\n            _this.attr(opts);\n            return _this;\n        }\n        Group.prototype.childrenRef = function () {\n            return this._children;\n        };\n        Group.prototype.children = function () {\n            return this._children.slice();\n        };\n        Group.prototype.childAt = function (idx) {\n            return this._children[idx];\n        };\n        Group.prototype.childOfName = function (name) {\n            var children = this._children;\n            for (var i = 0; i < children.length; i++) {\n                if (children[i].name === name) {\n                    return children[i];\n                }\n            }\n        };\n        Group.prototype.childCount = function () {\n            return this._children.length;\n        };\n        Group.prototype.add = function (child) {\n            if (child) {\n                if (child !== this && child.parent !== this) {\n                    this._children.push(child);\n                    this._doAdd(child);\n                }\n                if (\"development\" !== 'production') {\n                    if (child.__hostTarget) {\n                        throw 'This elemenet has been used as an attachment';\n                    }\n                }\n            }\n            return this;\n        };\n        Group.prototype.addBefore = function (child, nextSibling) {\n            if (child && child !== this && child.parent !== this\n                && nextSibling && nextSibling.parent === this) {\n                var children = this._children;\n                var idx = children.indexOf(nextSibling);\n                if (idx >= 0) {\n                    children.splice(idx, 0, child);\n                    this._doAdd(child);\n                }\n            }\n            return this;\n        };\n        Group.prototype.replace = function (oldChild, newChild) {\n            var idx = indexOf(this._children, oldChild);\n            if (idx >= 0) {\n                this.replaceAt(newChild, idx);\n            }\n            return this;\n        };\n        Group.prototype.replaceAt = function (child, index) {\n            var children = this._children;\n            var old = children[index];\n            if (child && child !== this && child.parent !== this && child !== old) {\n                children[index] = child;\n                old.parent = null;\n                var zr = this.__zr;\n                if (zr) {\n                    old.removeSelfFromZr(zr);\n                }\n                this._doAdd(child);\n            }\n            return this;\n        };\n        Group.prototype._doAdd = function (child) {\n            if (child.parent) {\n                child.parent.remove(child);\n            }\n            child.parent = this;\n            var zr = this.__zr;\n            if (zr && zr !== child.__zr) {\n                child.addSelfToZr(zr);\n            }\n            zr && zr.refresh();\n        };\n        Group.prototype.remove = function (child) {\n            var zr = this.__zr;\n            var children = this._children;\n            var idx = indexOf(children, child);\n            if (idx < 0) {\n                return this;\n            }\n            children.splice(idx, 1);\n            child.parent = null;\n            if (zr) {\n                child.removeSelfFromZr(zr);\n            }\n            zr && zr.refresh();\n            return this;\n        };\n        Group.prototype.removeAll = function () {\n            var children = this._children;\n            var zr = this.__zr;\n            for (var i = 0; i < children.length; i++) {\n                var child = children[i];\n                if (zr) {\n                    child.removeSelfFromZr(zr);\n                }\n                child.parent = null;\n            }\n            children.length = 0;\n            return this;\n        };\n        Group.prototype.eachChild = function (cb, context) {\n            var children = this._children;\n            for (var i = 0; i < children.length; i++) {\n                var child = children[i];\n                cb.call(context, child, i);\n            }\n            return this;\n        };\n        Group.prototype.traverse = function (cb, context) {\n            for (var i = 0; i < this._children.length; i++) {\n                var child = this._children[i];\n                var stopped = cb.call(context, child);\n                if (child.isGroup && !stopped) {\n                    child.traverse(cb, context);\n                }\n            }\n            return this;\n        };\n        Group.prototype.addSelfToZr = function (zr) {\n            _super.prototype.addSelfToZr.call(this, zr);\n            for (var i = 0; i < this._children.length; i++) {\n                var child = this._children[i];\n                child.addSelfToZr(zr);\n            }\n        };\n        Group.prototype.removeSelfFromZr = function (zr) {\n            _super.prototype.removeSelfFromZr.call(this, zr);\n            for (var i = 0; i < this._children.length; i++) {\n                var child = this._children[i];\n                child.removeSelfFromZr(zr);\n            }\n        };\n        Group.prototype.getBoundingRect = function (includeChildren) {\n            var tmpRect = new BoundingRect(0, 0, 0, 0);\n            var children = includeChildren || this._children;\n            var tmpMat = [];\n            var rect = null;\n            for (var i = 0; i < children.length; i++) {\n                var child = children[i];\n                if (child.ignore || child.invisible) {\n                    continue;\n                }\n                var childRect = child.getBoundingRect();\n                var transform = child.getLocalTransform(tmpMat);\n                if (transform) {\n                    BoundingRect.applyTransform(tmpRect, childRect, transform);\n                    rect = rect || tmpRect.clone();\n                    rect.union(tmpRect);\n                }\n                else {\n                    rect = rect || childRect.clone();\n                    rect.union(childRect);\n                }\n            }\n            return rect || tmpRect;\n        };\n        return Group;\n    }(Element));\n    Group.prototype.type = 'group';\n\n    /*!\n    * ZRender, a high performance 2d drawing library.\n    *\n    * Copyright (c) 2013, Baidu Inc.\n    * All rights reserved.\n    *\n    * LICENSE\n    * https://github.com/ecomfe/zrender/blob/master/LICENSE.txt\n    */\n    var painterCtors = {};\n    var instances = {};\n    function delInstance(id) {\n        delete instances[id];\n    }\n    function isDarkMode(backgroundColor) {\n        if (!backgroundColor) {\n            return false;\n        }\n        if (typeof backgroundColor === 'string') {\n            return lum(backgroundColor, 1) < DARK_MODE_THRESHOLD;\n        }\n        else if (backgroundColor.colorStops) {\n            var colorStops = backgroundColor.colorStops;\n            var totalLum = 0;\n            var len = colorStops.length;\n            for (var i = 0; i < len; i++) {\n                totalLum += lum(colorStops[i].color, 1);\n            }\n            totalLum /= len;\n            return totalLum < DARK_MODE_THRESHOLD;\n        }\n        return false;\n    }\n    var ZRender = (function () {\n        function ZRender(id, dom, opts) {\n            var _this = this;\n            this._sleepAfterStill = 10;\n            this._stillFrameAccum = 0;\n            this._needsRefresh = true;\n            this._needsRefreshHover = true;\n            this._darkMode = false;\n            opts = opts || {};\n            this.dom = dom;\n            this.id = id;\n            var storage = new Storage();\n            var rendererType = opts.renderer || 'canvas';\n            if (!painterCtors[rendererType]) {\n                rendererType = keys(painterCtors)[0];\n            }\n            if (\"development\" !== 'production') {\n                if (!painterCtors[rendererType]) {\n                    throw new Error(\"Renderer '\" + rendererType + \"' is not imported. Please import it first.\");\n                }\n            }\n            opts.useDirtyRect = opts.useDirtyRect == null\n                ? false\n                : opts.useDirtyRect;\n            var painter = new painterCtors[rendererType](dom, storage, opts, id);\n            var ssrMode = opts.ssr || painter.ssrOnly;\n            this.storage = storage;\n            this.painter = painter;\n            var handlerProxy = (!env.node && !env.worker && !ssrMode)\n                ? new HandlerDomProxy(painter.getViewportRoot(), painter.root)\n                : null;\n            var useCoarsePointer = opts.useCoarsePointer;\n            var usePointerSize = (useCoarsePointer == null || useCoarsePointer === 'auto')\n                ? env.touchEventsSupported\n                : !!useCoarsePointer;\n            var defaultPointerSize = 44;\n            var pointerSize;\n            if (usePointerSize) {\n                pointerSize = retrieve2(opts.pointerSize, defaultPointerSize);\n            }\n            this.handler = new Handler(storage, painter, handlerProxy, painter.root, pointerSize);\n            this.animation = new Animation({\n                stage: {\n                    update: ssrMode ? null : function () { return _this._flush(true); }\n                }\n            });\n            if (!ssrMode) {\n                this.animation.start();\n            }\n        }\n        ZRender.prototype.add = function (el) {\n            if (this._disposed || !el) {\n                return;\n            }\n            this.storage.addRoot(el);\n            el.addSelfToZr(this);\n            this.refresh();\n        };\n        ZRender.prototype.remove = function (el) {\n            if (this._disposed || !el) {\n                return;\n            }\n            this.storage.delRoot(el);\n            el.removeSelfFromZr(this);\n            this.refresh();\n        };\n        ZRender.prototype.configLayer = function (zLevel, config) {\n            if (this._disposed) {\n                return;\n            }\n            if (this.painter.configLayer) {\n                this.painter.configLayer(zLevel, config);\n            }\n            this.refresh();\n        };\n        ZRender.prototype.setBackgroundColor = function (backgroundColor) {\n            if (this._disposed) {\n                return;\n            }\n            if (this.painter.setBackgroundColor) {\n                this.painter.setBackgroundColor(backgroundColor);\n            }\n            this.refresh();\n            this._backgroundColor = backgroundColor;\n            this._darkMode = isDarkMode(backgroundColor);\n        };\n        ZRender.prototype.getBackgroundColor = function () {\n            return this._backgroundColor;\n        };\n        ZRender.prototype.setDarkMode = function (darkMode) {\n            this._darkMode = darkMode;\n        };\n        ZRender.prototype.isDarkMode = function () {\n            return this._darkMode;\n        };\n        ZRender.prototype.refreshImmediately = function (fromInside) {\n            if (this._disposed) {\n                return;\n            }\n            if (!fromInside) {\n                this.animation.update(true);\n            }\n            this._needsRefresh = false;\n            this.painter.refresh();\n            this._needsRefresh = false;\n        };\n        ZRender.prototype.refresh = function () {\n            if (this._disposed) {\n                return;\n            }\n            this._needsRefresh = true;\n            this.animation.start();\n        };\n        ZRender.prototype.flush = function () {\n            if (this._disposed) {\n                return;\n            }\n            this._flush(false);\n        };\n        ZRender.prototype._flush = function (fromInside) {\n            var triggerRendered;\n            var start = getTime();\n            if (this._needsRefresh) {\n                triggerRendered = true;\n                this.refreshImmediately(fromInside);\n            }\n            if (this._needsRefreshHover) {\n                triggerRendered = true;\n                this.refreshHoverImmediately();\n            }\n            var end = getTime();\n            if (triggerRendered) {\n                this._stillFrameAccum = 0;\n                this.trigger('rendered', {\n                    elapsedTime: end - start\n                });\n            }\n            else if (this._sleepAfterStill > 0) {\n                this._stillFrameAccum++;\n                if (this._stillFrameAccum > this._sleepAfterStill) {\n                    this.animation.stop();\n                }\n            }\n        };\n        ZRender.prototype.setSleepAfterStill = function (stillFramesCount) {\n            this._sleepAfterStill = stillFramesCount;\n        };\n        ZRender.prototype.wakeUp = function () {\n            if (this._disposed) {\n                return;\n            }\n            this.animation.start();\n            this._stillFrameAccum = 0;\n        };\n        ZRender.prototype.refreshHover = function () {\n            this._needsRefreshHover = true;\n        };\n        ZRender.prototype.refreshHoverImmediately = function () {\n            if (this._disposed) {\n                return;\n            }\n            this._needsRefreshHover = false;\n            if (this.painter.refreshHover && this.painter.getType() === 'canvas') {\n                this.painter.refreshHover();\n            }\n        };\n        ZRender.prototype.resize = function (opts) {\n            if (this._disposed) {\n                return;\n            }\n            opts = opts || {};\n            this.painter.resize(opts.width, opts.height);\n            this.handler.resize();\n        };\n        ZRender.prototype.clearAnimation = function () {\n            if (this._disposed) {\n                return;\n            }\n            this.animation.clear();\n        };\n        ZRender.prototype.getWidth = function () {\n            if (this._disposed) {\n                return;\n            }\n            return this.painter.getWidth();\n        };\n        ZRender.prototype.getHeight = function () {\n            if (this._disposed) {\n                return;\n            }\n            return this.painter.getHeight();\n        };\n        ZRender.prototype.setCursorStyle = function (cursorStyle) {\n            if (this._disposed) {\n                return;\n            }\n            this.handler.setCursorStyle(cursorStyle);\n        };\n        ZRender.prototype.findHover = function (x, y) {\n            if (this._disposed) {\n                return;\n            }\n            return this.handler.findHover(x, y);\n        };\n        ZRender.prototype.on = function (eventName, eventHandler, context) {\n            if (!this._disposed) {\n                this.handler.on(eventName, eventHandler, context);\n            }\n            return this;\n        };\n        ZRender.prototype.off = function (eventName, eventHandler) {\n            if (this._disposed) {\n                return;\n            }\n            this.handler.off(eventName, eventHandler);\n        };\n        ZRender.prototype.trigger = function (eventName, event) {\n            if (this._disposed) {\n                return;\n            }\n            this.handler.trigger(eventName, event);\n        };\n        ZRender.prototype.clear = function () {\n            if (this._disposed) {\n                return;\n            }\n            var roots = this.storage.getRoots();\n            for (var i = 0; i < roots.length; i++) {\n                if (roots[i] instanceof Group) {\n                    roots[i].removeSelfFromZr(this);\n                }\n            }\n            this.storage.delAllRoots();\n            this.painter.clear();\n        };\n        ZRender.prototype.dispose = function () {\n            if (this._disposed) {\n                return;\n            }\n            this.animation.stop();\n            this.clear();\n            this.storage.dispose();\n            this.painter.dispose();\n            this.handler.dispose();\n            this.animation =\n                this.storage =\n                    this.painter =\n                        this.handler = null;\n            this._disposed = true;\n            delInstance(this.id);\n        };\n        return ZRender;\n    }());\n    function init(dom, opts) {\n        var zr = new ZRender(guid(), dom, opts);\n        instances[zr.id] = zr;\n        return zr;\n    }\n    function dispose(zr) {\n        zr.dispose();\n    }\n    function disposeAll() {\n        for (var key in instances) {\n            if (instances.hasOwnProperty(key)) {\n                instances[key].dispose();\n            }\n        }\n        instances = {};\n    }\n    function getInstance(id) {\n        return instances[id];\n    }\n    function registerPainter(name, Ctor) {\n        painterCtors[name] = Ctor;\n    }\n    var ssrDataGetter;\n    function getElementSSRData(el) {\n        if (typeof ssrDataGetter === 'function') {\n            return ssrDataGetter(el);\n        }\n    }\n    function registerSSRDataGetter(getter) {\n        ssrDataGetter = getter;\n    }\n    var version = '5.6.1';\n\n    var zrender = /*#__PURE__*/Object.freeze({\n        __proto__: null,\n        init: init,\n        dispose: dispose,\n        disposeAll: disposeAll,\n        getInstance: getInstance,\n        registerPainter: registerPainter,\n        getElementSSRData: getElementSSRData,\n        registerSSRDataGetter: registerSSRDataGetter,\n        version: version\n    });\n\n    var RADIAN_EPSILON = 1e-4;\n    // Although chrome already enlarge this number to 100 for `toFixed`, but\n    // we sill follow the spec for compatibility.\n    var ROUND_SUPPORTED_PRECISION_MAX = 20;\n    function _trim(str) {\n      return str.replace(/^\\s+|\\s+$/g, '');\n    }\n    /**\r\n     * Linear mapping a value from domain to range\r\n     * @param  val\r\n     * @param  domain Domain extent domain[0] can be bigger than domain[1]\r\n     * @param  range  Range extent range[0] can be bigger than range[1]\r\n     * @param  clamp Default to be false\r\n     */\n    function linearMap(val, domain, range, clamp) {\n      var d0 = domain[0];\n      var d1 = domain[1];\n      var r0 = range[0];\n      var r1 = range[1];\n      var subDomain = d1 - d0;\n      var subRange = r1 - r0;\n      if (subDomain === 0) {\n        return subRange === 0 ? r0 : (r0 + r1) / 2;\n      }\n      // Avoid accuracy problem in edge, such as\n      // 146.39 - 62.83 === 83.55999999999999.\n      // See echarts/test/ut/spec/util/number.js#linearMap#accuracyError\n      // It is a little verbose for efficiency considering this method\n      // is a hotspot.\n      if (clamp) {\n        if (subDomain > 0) {\n          if (val <= d0) {\n            return r0;\n          } else if (val >= d1) {\n            return r1;\n          }\n        } else {\n          if (val >= d0) {\n            return r0;\n          } else if (val <= d1) {\n            return r1;\n          }\n        }\n      } else {\n        if (val === d0) {\n          return r0;\n        }\n        if (val === d1) {\n          return r1;\n        }\n      }\n      return (val - d0) / subDomain * subRange + r0;\n    }\n    /**\r\n     * Convert a percent string to absolute number.\r\n     * Returns NaN if percent is not a valid string or number\r\n     */\n    function parsePercent$1(percent, all) {\n      switch (percent) {\n        case 'center':\n        case 'middle':\n          percent = '50%';\n          break;\n        case 'left':\n        case 'top':\n          percent = '0%';\n          break;\n        case 'right':\n        case 'bottom':\n          percent = '100%';\n          break;\n      }\n      if (isString(percent)) {\n        if (_trim(percent).match(/%$/)) {\n          return parseFloat(percent) / 100 * all;\n        }\n        return parseFloat(percent);\n      }\n      return percent == null ? NaN : +percent;\n    }\n    function round(x, precision, returnStr) {\n      if (precision == null) {\n        precision = 10;\n      }\n      // Avoid range error\n      precision = Math.min(Math.max(0, precision), ROUND_SUPPORTED_PRECISION_MAX);\n      // PENDING: 1.005.toFixed(2) is '1.00' rather than '1.01'\n      x = (+x).toFixed(precision);\n      return returnStr ? x : +x;\n    }\n    /**\r\n     * Inplacd asc sort arr.\r\n     * The input arr will be modified.\r\n     */\n    function asc(arr) {\n      arr.sort(function (a, b) {\n        return a - b;\n      });\n      return arr;\n    }\n    /**\r\n     * Get precision.\r\n     */\n    function getPrecision(val) {\n      val = +val;\n      if (isNaN(val)) {\n        return 0;\n      }\n      // It is much faster than methods converting number to string as follows\n      //      let tmp = val.toString();\n      //      return tmp.length - 1 - tmp.indexOf('.');\n      // especially when precision is low\n      // Notice:\n      // (1) If the loop count is over about 20, it is slower than `getPrecisionSafe`.\n      //     (see https://jsbench.me/2vkpcekkvw/1)\n      // (2) If the val is less than for example 1e-15, the result may be incorrect.\n      //     (see test/ut/spec/util/number.test.ts `getPrecision_equal_random`)\n      if (val > 1e-14) {\n        var e = 1;\n        for (var i = 0; i < 15; i++, e *= 10) {\n          if (Math.round(val * e) / e === val) {\n            return i;\n          }\n        }\n      }\n      return getPrecisionSafe(val);\n    }\n    /**\r\n     * Get precision with slow but safe method\r\n     */\n    function getPrecisionSafe(val) {\n      // toLowerCase for: '3.4E-12'\n      var str = val.toString().toLowerCase();\n      // Consider scientific notation: '3.4e-12' '3.4e+12'\n      var eIndex = str.indexOf('e');\n      var exp = eIndex > 0 ? +str.slice(eIndex + 1) : 0;\n      var significandPartLen = eIndex > 0 ? eIndex : str.length;\n      var dotIndex = str.indexOf('.');\n      var decimalPartLen = dotIndex < 0 ? 0 : significandPartLen - 1 - dotIndex;\n      return Math.max(0, decimalPartLen - exp);\n    }\n    /**\r\n     * Minimal dicernible data precisioin according to a single pixel.\r\n     */\n    function getPixelPrecision(dataExtent, pixelExtent) {\n      var log = Math.log;\n      var LN10 = Math.LN10;\n      var dataQuantity = Math.floor(log(dataExtent[1] - dataExtent[0]) / LN10);\n      var sizeQuantity = Math.round(log(Math.abs(pixelExtent[1] - pixelExtent[0])) / LN10);\n      // toFixed() digits argument must be between 0 and 20.\n      var precision = Math.min(Math.max(-dataQuantity + sizeQuantity, 0), 20);\n      return !isFinite(precision) ? 20 : precision;\n    }\n    /**\r\n     * Get a data of given precision, assuring the sum of percentages\r\n     * in valueList is 1.\r\n     * The largest remainder method is used.\r\n     * https://en.wikipedia.org/wiki/Largest_remainder_method\r\n     *\r\n     * @param valueList a list of all data\r\n     * @param idx index of the data to be processed in valueList\r\n     * @param precision integer number showing digits of precision\r\n     * @return percent ranging from 0 to 100\r\n     */\n    function getPercentWithPrecision(valueList, idx, precision) {\n      if (!valueList[idx]) {\n        return 0;\n      }\n      var seats = getPercentSeats(valueList, precision);\n      return seats[idx] || 0;\n    }\n    /**\r\n     * Get a data of given precision, assuring the sum of percentages\r\n     * in valueList is 1.\r\n     * The largest remainder method is used.\r\n     * https://en.wikipedia.org/wiki/Largest_remainder_method\r\n     *\r\n     * @param valueList a list of all data\r\n     * @param precision integer number showing digits of precision\r\n     * @return {Array<number>}\r\n     */\n    function getPercentSeats(valueList, precision) {\n      var sum = reduce(valueList, function (acc, val) {\n        return acc + (isNaN(val) ? 0 : val);\n      }, 0);\n      if (sum === 0) {\n        return [];\n      }\n      var digits = Math.pow(10, precision);\n      var votesPerQuota = map(valueList, function (val) {\n        return (isNaN(val) ? 0 : val) / sum * digits * 100;\n      });\n      var targetSeats = digits * 100;\n      var seats = map(votesPerQuota, function (votes) {\n        // Assign automatic seats.\n        return Math.floor(votes);\n      });\n      var currentSum = reduce(seats, function (acc, val) {\n        return acc + val;\n      }, 0);\n      var remainder = map(votesPerQuota, function (votes, idx) {\n        return votes - seats[idx];\n      });\n      // Has remainding votes.\n      while (currentSum < targetSeats) {\n        // Find next largest remainder.\n        var max = Number.NEGATIVE_INFINITY;\n        var maxId = null;\n        for (var i = 0, len = remainder.length; i < len; ++i) {\n          if (remainder[i] > max) {\n            max = remainder[i];\n            maxId = i;\n          }\n        }\n        // Add a vote to max remainder.\n        ++seats[maxId];\n        remainder[maxId] = 0;\n        ++currentSum;\n      }\n      return map(seats, function (seat) {\n        return seat / digits;\n      });\n    }\n    /**\r\n     * Solve the floating point adding problem like 0.1 + 0.2 === 0.30000000000000004\r\n     * See <http://0.30000000000000004.com/>\r\n     */\n    function addSafe(val0, val1) {\n      var maxPrecision = Math.max(getPrecision(val0), getPrecision(val1));\n      // const multiplier = Math.pow(10, maxPrecision);\n      // return (Math.round(val0 * multiplier) + Math.round(val1 * multiplier)) / multiplier;\n      var sum = val0 + val1;\n      // // PENDING: support more?\n      return maxPrecision > ROUND_SUPPORTED_PRECISION_MAX ? sum : round(sum, maxPrecision);\n    }\n    // Number.MAX_SAFE_INTEGER, ie do not support.\n    var MAX_SAFE_INTEGER = 9007199254740991;\n    /**\r\n     * To 0 - 2 * PI, considering negative radian.\r\n     */\n    function remRadian(radian) {\n      var pi2 = Math.PI * 2;\n      return (radian % pi2 + pi2) % pi2;\n    }\n    /**\r\n     * @param {type} radian\r\n     * @return {boolean}\r\n     */\n    function isRadianAroundZero(val) {\n      return val > -RADIAN_EPSILON && val < RADIAN_EPSILON;\n    }\n    // eslint-disable-next-line\n    var TIME_REG = /^(?:(\\d{4})(?:[-\\/](\\d{1,2})(?:[-\\/](\\d{1,2})(?:[T ](\\d{1,2})(?::(\\d{1,2})(?::(\\d{1,2})(?:[.,](\\d+))?)?)?(Z|[\\+\\-]\\d\\d:?\\d\\d)?)?)?)?)?$/; // jshint ignore:line\n    /**\r\n     * @param value valid type: number | string | Date, otherwise return `new Date(NaN)`\r\n     *   These values can be accepted:\r\n     *   + An instance of Date, represent a time in its own time zone.\r\n     *   + Or string in a subset of ISO 8601, only including:\r\n     *     + only year, month, date: '2012-03', '2012-03-01', '2012-03-01 05', '2012-03-01 05:06',\r\n     *     + separated with T or space: '2012-03-01T12:22:33.123', '2012-03-01 12:22:33.123',\r\n     *     + time zone: '2012-03-01T12:22:33Z', '2012-03-01T12:22:33+8000', '2012-03-01T12:22:33-05:00',\r\n     *     all of which will be treated as local time if time zone is not specified\r\n     *     (see <https://momentjs.com/>).\r\n     *   + Or other string format, including (all of which will be treated as local time):\r\n     *     '2012', '2012-3-1', '2012/3/1', '2012/03/01',\r\n     *     '2009/6/12 2:00', '2009/6/12 2:05:08', '2009/6/12 2:05:08.123'\r\n     *   + a timestamp, which represent a time in UTC.\r\n     * @return date Never be null/undefined. If invalid, return `new Date(NaN)`.\r\n     */\n    function parseDate(value) {\n      if (value instanceof Date) {\n        return value;\n      } else if (isString(value)) {\n        // Different browsers parse date in different way, so we parse it manually.\n        // Some other issues:\n        // new Date('1970-01-01') is UTC,\n        // new Date('1970/01/01') and new Date('1970-1-01') is local.\n        // See issue #3623\n        var match = TIME_REG.exec(value);\n        if (!match) {\n          // return Invalid Date.\n          return new Date(NaN);\n        }\n        // Use local time when no timezone offset is specified.\n        if (!match[8]) {\n          // match[n] can only be string or undefined.\n          // But take care of '12' + 1 => '121'.\n          return new Date(+match[1], +(match[2] || 1) - 1, +match[3] || 1, +match[4] || 0, +(match[5] || 0), +match[6] || 0, match[7] ? +match[7].substring(0, 3) : 0);\n        }\n        // Timezoneoffset of Javascript Date has considered DST (Daylight Saving Time,\n        // https://tc39.github.io/ecma262/#sec-daylight-saving-time-adjustment).\n        // For example, system timezone is set as \"Time Zone: America/Toronto\",\n        // then these code will get different result:\n        // `new Date(1478411999999).getTimezoneOffset();  // get 240`\n        // `new Date(1478412000000).getTimezoneOffset();  // get 300`\n        // So we should not use `new Date`, but use `Date.UTC`.\n        else {\n          var hour = +match[4] || 0;\n          if (match[8].toUpperCase() !== 'Z') {\n            hour -= +match[8].slice(0, 3);\n          }\n          return new Date(Date.UTC(+match[1], +(match[2] || 1) - 1, +match[3] || 1, hour, +(match[5] || 0), +match[6] || 0, match[7] ? +match[7].substring(0, 3) : 0));\n        }\n      } else if (value == null) {\n        return new Date(NaN);\n      }\n      return new Date(Math.round(value));\n    }\n    /**\r\n     * Quantity of a number. e.g. 0.1, 1, 10, 100\r\n     *\r\n     * @param val\r\n     * @return\r\n     */\n    function quantity(val) {\n      return Math.pow(10, quantityExponent(val));\n    }\n    /**\r\n     * Exponent of the quantity of a number\r\n     * e.g., 1234 equals to 1.234*10^3, so quantityExponent(1234) is 3\r\n     *\r\n     * @param val non-negative value\r\n     * @return\r\n     */\n    function quantityExponent(val) {\n      if (val === 0) {\n        return 0;\n      }\n      var exp = Math.floor(Math.log(val) / Math.LN10);\n      /**\r\n       * exp is expected to be the rounded-down result of the base-10 log of val.\r\n       * But due to the precision loss with Math.log(val), we need to restore it\r\n       * using 10^exp to make sure we can get val back from exp. #11249\r\n       */\n      if (val / Math.pow(10, exp) >= 10) {\n        exp++;\n      }\n      return exp;\n    }\n    /**\r\n     * find a “nice” number approximately equal to x. Round the number if round = true,\r\n     * take ceiling if round = false. The primary observation is that the “nicest”\r\n     * numbers in decimal are 1, 2, and 5, and all power-of-ten multiples of these numbers.\r\n     *\r\n     * See \"Nice Numbers for Graph Labels\" of Graphic Gems.\r\n     *\r\n     * @param  val Non-negative value.\r\n     * @param  round\r\n     * @return Niced number\r\n     */\n    function nice(val, round) {\n      var exponent = quantityExponent(val);\n      var exp10 = Math.pow(10, exponent);\n      var f = val / exp10; // 1 <= f < 10\n      var nf;\n      if (round) {\n        if (f < 1.5) {\n          nf = 1;\n        } else if (f < 2.5) {\n          nf = 2;\n        } else if (f < 4) {\n          nf = 3;\n        } else if (f < 7) {\n          nf = 5;\n        } else {\n          nf = 10;\n        }\n      } else {\n        if (f < 1) {\n          nf = 1;\n        } else if (f < 2) {\n          nf = 2;\n        } else if (f < 3) {\n          nf = 3;\n        } else if (f < 5) {\n          nf = 5;\n        } else {\n          nf = 10;\n        }\n      }\n      val = nf * exp10;\n      // Fix 3 * 0.1 === 0.30000000000000004 issue (see IEEE 754).\n      // 20 is the uppper bound of toFixed.\n      return exponent >= -20 ? +val.toFixed(exponent < 0 ? -exponent : 0) : val;\n    }\n    /**\r\n     * This code was copied from \"d3.js\"\r\n     * <https://github.com/d3/d3/blob/9cc9a875e636a1dcf36cc1e07bdf77e1ad6e2c74/src/arrays/quantile.js>.\r\n     * See the license statement at the head of this file.\r\n     * @param ascArr\r\n     */\n    function quantile(ascArr, p) {\n      var H = (ascArr.length - 1) * p + 1;\n      var h = Math.floor(H);\n      var v = +ascArr[h - 1];\n      var e = H - h;\n      return e ? v + e * (ascArr[h] - v) : v;\n    }\n    /**\r\n     * Order intervals asc, and split them when overlap.\r\n     * expect(numberUtil.reformIntervals([\r\n     *     {interval: [18, 62], close: [1, 1]},\r\n     *     {interval: [-Infinity, -70], close: [0, 0]},\r\n     *     {interval: [-70, -26], close: [1, 1]},\r\n     *     {interval: [-26, 18], close: [1, 1]},\r\n     *     {interval: [62, 150], close: [1, 1]},\r\n     *     {interval: [106, 150], close: [1, 1]},\r\n     *     {interval: [150, Infinity], close: [0, 0]}\r\n     * ])).toEqual([\r\n     *     {interval: [-Infinity, -70], close: [0, 0]},\r\n     *     {interval: [-70, -26], close: [1, 1]},\r\n     *     {interval: [-26, 18], close: [0, 1]},\r\n     *     {interval: [18, 62], close: [0, 1]},\r\n     *     {interval: [62, 150], close: [0, 1]},\r\n     *     {interval: [150, Infinity], close: [0, 0]}\r\n     * ]);\r\n     * @param list, where `close` mean open or close\r\n     *        of the interval, and Infinity can be used.\r\n     * @return The origin list, which has been reformed.\r\n     */\n    function reformIntervals(list) {\n      list.sort(function (a, b) {\n        return littleThan(a, b, 0) ? -1 : 1;\n      });\n      var curr = -Infinity;\n      var currClose = 1;\n      for (var i = 0; i < list.length;) {\n        var interval = list[i].interval;\n        var close_1 = list[i].close;\n        for (var lg = 0; lg < 2; lg++) {\n          if (interval[lg] <= curr) {\n            interval[lg] = curr;\n            close_1[lg] = !lg ? 1 - currClose : 1;\n          }\n          curr = interval[lg];\n          currClose = close_1[lg];\n        }\n        if (interval[0] === interval[1] && close_1[0] * close_1[1] !== 1) {\n          list.splice(i, 1);\n        } else {\n          i++;\n        }\n      }\n      return list;\n      function littleThan(a, b, lg) {\n        return a.interval[lg] < b.interval[lg] || a.interval[lg] === b.interval[lg] && (a.close[lg] - b.close[lg] === (!lg ? 1 : -1) || !lg && littleThan(a, b, 1));\n      }\n    }\n    /**\r\n     * [Numeric is defined as]:\r\n     *     `parseFloat(val) == val`\r\n     * For example:\r\n     * numeric:\r\n     *     typeof number except NaN, '-123', '123', '2e3', '-2e3', '011', 'Infinity', Infinity,\r\n     *     and they rounded by white-spaces or line-terminal like ' -123 \\n ' (see es spec)\r\n     * not-numeric:\r\n     *     null, undefined, [], {}, true, false, 'NaN', NaN, '123ab',\r\n     *     empty string, string with only white-spaces or line-terminal (see es spec),\r\n     *     0x12, '0x12', '-0x12', 012, '012', '-012',\r\n     *     non-string, ...\r\n     *\r\n     * @test See full test cases in `test/ut/spec/util/number.js`.\r\n     * @return Must be a typeof number. If not numeric, return NaN.\r\n     */\n    function numericToNumber(val) {\n      var valFloat = parseFloat(val);\n      return valFloat == val // eslint-disable-line eqeqeq\n      && (valFloat !== 0 || !isString(val) || val.indexOf('x') <= 0) // For case ' 0x0 '.\n      ? valFloat : NaN;\n    }\n    /**\r\n     * Definition of \"numeric\": see `numericToNumber`.\r\n     */\n    function isNumeric(val) {\n      return !isNaN(numericToNumber(val));\n    }\n    /**\r\n     * Use random base to prevent users hard code depending on\r\n     * this auto generated marker id.\r\n     * @return An positive integer.\r\n     */\n    function getRandomIdBase() {\n      return Math.round(Math.random() * 9);\n    }\n    /**\r\n     * Get the greatest common divisor.\r\n     *\r\n     * @param {number} a one number\r\n     * @param {number} b the other number\r\n     */\n    function getGreatestCommonDividor(a, b) {\n      if (b === 0) {\n        return a;\n      }\n      return getGreatestCommonDividor(b, a % b);\n    }\n    /**\r\n     * Get the least common multiple.\r\n     *\r\n     * @param {number} a one number\r\n     * @param {number} b the other number\r\n     */\n    function getLeastCommonMultiple(a, b) {\n      if (a == null) {\n        return b;\n      }\n      if (b == null) {\n        return a;\n      }\n      return a * b / getGreatestCommonDividor(a, b);\n    }\n\n    var ECHARTS_PREFIX = '[ECharts] ';\n    var storedLogs = {};\n    var hasConsole = typeof console !== 'undefined'\n    // eslint-disable-next-line\n    && console.warn && console.log;\n    function outputLog(type, str, onlyOnce) {\n      if (hasConsole) {\n        if (onlyOnce) {\n          if (storedLogs[str]) {\n            return;\n          }\n          storedLogs[str] = true;\n        }\n        // eslint-disable-next-line\n        console[type](ECHARTS_PREFIX + str);\n      }\n    }\n    function log(str, onlyOnce) {\n      outputLog('log', str, onlyOnce);\n    }\n    function warn(str, onlyOnce) {\n      outputLog('warn', str, onlyOnce);\n    }\n    function error(str, onlyOnce) {\n      outputLog('error', str, onlyOnce);\n    }\n    function deprecateLog(str) {\n      if (\"development\" !== 'production') {\n        // Not display duplicate message.\n        outputLog('warn', 'DEPRECATED: ' + str, true);\n      }\n    }\n    function deprecateReplaceLog(oldOpt, newOpt, scope) {\n      if (\"development\" !== 'production') {\n        deprecateLog((scope ? \"[\" + scope + \"]\" : '') + (oldOpt + \" is deprecated, use \" + newOpt + \" instead.\"));\n      }\n    }\n    /**\r\n     * If in __DEV__ environment, get console printable message for users hint.\r\n     * Parameters are separated by ' '.\r\n     * @usage\r\n     * makePrintable('This is an error on', someVar, someObj);\r\n     *\r\n     * @param hintInfo anything about the current execution context to hint users.\r\n     * @throws Error\r\n     */\n    function makePrintable() {\n      var hintInfo = [];\n      for (var _i = 0; _i < arguments.length; _i++) {\n        hintInfo[_i] = arguments[_i];\n      }\n      var msg = '';\n      if (\"development\" !== 'production') {\n        // Fuzzy stringify for print.\n        // This code only exist in dev environment.\n        var makePrintableStringIfPossible_1 = function (val) {\n          return val === void 0 ? 'undefined' : val === Infinity ? 'Infinity' : val === -Infinity ? '-Infinity' : eqNaN(val) ? 'NaN' : val instanceof Date ? 'Date(' + val.toISOString() + ')' : isFunction(val) ? 'function () { ... }' : isRegExp(val) ? val + '' : null;\n        };\n        msg = map(hintInfo, function (arg) {\n          if (isString(arg)) {\n            // Print without quotation mark for some statement.\n            return arg;\n          } else {\n            var printableStr = makePrintableStringIfPossible_1(arg);\n            if (printableStr != null) {\n              return printableStr;\n            } else if (typeof JSON !== 'undefined' && JSON.stringify) {\n              try {\n                return JSON.stringify(arg, function (n, val) {\n                  var printableStr = makePrintableStringIfPossible_1(val);\n                  return printableStr == null ? val : printableStr;\n                });\n                // In most cases the info object is small, so do not line break.\n              } catch (err) {\n                return '?';\n              }\n            } else {\n              return '?';\n            }\n          }\n        }).join(' ');\n      }\n      return msg;\n    }\n    /**\r\n     * @throws Error\r\n     */\n    function throwError(msg) {\n      throw new Error(msg);\n    }\n\n    function interpolateNumber$1(p0, p1, percent) {\n      return (p1 - p0) * percent + p0;\n    }\n    /**\r\n     * Make the name displayable. But we should\r\n     * make sure it is not duplicated with user\r\n     * specified name, so use '\\0';\r\n     */\n    var DUMMY_COMPONENT_NAME_PREFIX = 'series\\0';\n    var INTERNAL_COMPONENT_ID_PREFIX = '\\0_ec_\\0';\n    /**\r\n     * If value is not array, then translate it to array.\r\n     * @param  {*} value\r\n     * @return {Array} [value] or value\r\n     */\n    function normalizeToArray(value) {\n      return value instanceof Array ? value : value == null ? [] : [value];\n    }\n    /**\r\n     * Sync default option between normal and emphasis like `position` and `show`\r\n     * In case some one will write code like\r\n     *     label: {\r\n     *          show: false,\r\n     *          position: 'outside',\r\n     *          fontSize: 18\r\n     *     },\r\n     *     emphasis: {\r\n     *          label: { show: true }\r\n     *     }\r\n     */\n    function defaultEmphasis(opt, key, subOpts) {\n      // Caution: performance sensitive.\n      if (opt) {\n        opt[key] = opt[key] || {};\n        opt.emphasis = opt.emphasis || {};\n        opt.emphasis[key] = opt.emphasis[key] || {};\n        // Default emphasis option from normal\n        for (var i = 0, len = subOpts.length; i < len; i++) {\n          var subOptName = subOpts[i];\n          if (!opt.emphasis[key].hasOwnProperty(subOptName) && opt[key].hasOwnProperty(subOptName)) {\n            opt.emphasis[key][subOptName] = opt[key][subOptName];\n          }\n        }\n      }\n    }\n    var TEXT_STYLE_OPTIONS = ['fontStyle', 'fontWeight', 'fontSize', 'fontFamily', 'rich', 'tag', 'color', 'textBorderColor', 'textBorderWidth', 'width', 'height', 'lineHeight', 'align', 'verticalAlign', 'baseline', 'shadowColor', 'shadowBlur', 'shadowOffsetX', 'shadowOffsetY', 'textShadowColor', 'textShadowBlur', 'textShadowOffsetX', 'textShadowOffsetY', 'backgroundColor', 'borderColor', 'borderWidth', 'borderRadius', 'padding'];\n    // modelUtil.LABEL_OPTIONS = modelUtil.TEXT_STYLE_OPTIONS.concat([\n    //     'position', 'offset', 'rotate', 'origin', 'show', 'distance', 'formatter',\n    //     'fontStyle', 'fontWeight', 'fontSize', 'fontFamily',\n    //     // FIXME: deprecated, check and remove it.\n    //     'textStyle'\n    // ]);\n    /**\r\n     * The method does not ensure performance.\r\n     * data could be [12, 2323, {value: 223}, [1221, 23], {value: [2, 23]}]\r\n     * This helper method retrieves value from data.\r\n     */\n    function getDataItemValue(dataItem) {\n      return isObject(dataItem) && !isArray(dataItem) && !(dataItem instanceof Date) ? dataItem.value : dataItem;\n    }\n    /**\r\n     * data could be [12, 2323, {value: 223}, [1221, 23], {value: [2, 23]}]\r\n     * This helper method determine if dataItem has extra option besides value\r\n     */\n    function isDataItemOption(dataItem) {\n      return isObject(dataItem) && !(dataItem instanceof Array);\n      // // markLine data can be array\n      // && !(dataItem[0] && isObject(dataItem[0]) && !(dataItem[0] instanceof Array));\n    }\n    /**\r\n     * Mapping to existings for merge.\r\n     *\r\n     * Mode \"normalMege\":\r\n     *     The mapping result (merge result) will keep the order of the existing\r\n     *     component, rather than the order of new option. Because we should ensure\r\n     *     some specified index reference (like xAxisIndex) keep work.\r\n     *     And in most cases, \"merge option\" is used to update partial option but not\r\n     *     be expected to change the order.\r\n     *\r\n     * Mode \"replaceMege\":\r\n     *     (1) Only the id mapped components will be merged.\r\n     *     (2) Other existing components (except internal components) will be removed.\r\n     *     (3) Other new options will be used to create new component.\r\n     *     (4) The index of the existing components will not be modified.\r\n     *     That means their might be \"hole\" after the removal.\r\n     *     The new components are created first at those available index.\r\n     *\r\n     * Mode \"replaceAll\":\r\n     *     This mode try to support that reproduce an echarts instance from another\r\n     *     echarts instance (via `getOption`) in some simple cases.\r\n     *     In this scenario, the `result` index are exactly the consistent with the `newCmptOptions`,\r\n     *     which ensures the component index referring (like `xAxisIndex: ?`) corrent. That is,\r\n     *     the \"hole\" in `newCmptOptions` will also be kept.\r\n     *     On the contrary, other modes try best to eliminate holes.\r\n     *     PENDING: This is an experimental mode yet.\r\n     *\r\n     * @return See the comment of <MappingResult>.\r\n     */\n    function mappingToExists(existings, newCmptOptions, mode) {\n      var isNormalMergeMode = mode === 'normalMerge';\n      var isReplaceMergeMode = mode === 'replaceMerge';\n      var isReplaceAllMode = mode === 'replaceAll';\n      existings = existings || [];\n      newCmptOptions = (newCmptOptions || []).slice();\n      var existingIdIdxMap = createHashMap();\n      // Validate id and name on user input option.\n      each(newCmptOptions, function (cmptOption, index) {\n        if (!isObject(cmptOption)) {\n          newCmptOptions[index] = null;\n          return;\n        }\n        if (\"development\" !== 'production') {\n          // There is some legacy case that name is set as `false`.\n          // But should work normally rather than throw error.\n          if (cmptOption.id != null && !isValidIdOrName(cmptOption.id)) {\n            warnInvalidateIdOrName(cmptOption.id);\n          }\n          if (cmptOption.name != null && !isValidIdOrName(cmptOption.name)) {\n            warnInvalidateIdOrName(cmptOption.name);\n          }\n        }\n      });\n      var result = prepareResult(existings, existingIdIdxMap, mode);\n      if (isNormalMergeMode || isReplaceMergeMode) {\n        mappingById(result, existings, existingIdIdxMap, newCmptOptions);\n      }\n      if (isNormalMergeMode) {\n        mappingByName(result, newCmptOptions);\n      }\n      if (isNormalMergeMode || isReplaceMergeMode) {\n        mappingByIndex(result, newCmptOptions, isReplaceMergeMode);\n      } else if (isReplaceAllMode) {\n        mappingInReplaceAllMode(result, newCmptOptions);\n      }\n      makeIdAndName(result);\n      // The array `result` MUST NOT contain elided items, otherwise the\n      // forEach will omit those items and result in incorrect result.\n      return result;\n    }\n    function prepareResult(existings, existingIdIdxMap, mode) {\n      var result = [];\n      if (mode === 'replaceAll') {\n        return result;\n      }\n      // Do not use native `map` to in case that the array `existings`\n      // contains elided items, which will be omitted.\n      for (var index = 0; index < existings.length; index++) {\n        var existing = existings[index];\n        // Because of replaceMerge, `existing` may be null/undefined.\n        if (existing && existing.id != null) {\n          existingIdIdxMap.set(existing.id, index);\n        }\n        // For non-internal-componnets:\n        //     Mode \"normalMerge\": all existings kept.\n        //     Mode \"replaceMerge\": all existing removed unless mapped by id.\n        // For internal-components:\n        //     go with \"replaceMerge\" approach in both mode.\n        result.push({\n          existing: mode === 'replaceMerge' || isComponentIdInternal(existing) ? null : existing,\n          newOption: null,\n          keyInfo: null,\n          brandNew: null\n        });\n      }\n      return result;\n    }\n    function mappingById(result, existings, existingIdIdxMap, newCmptOptions) {\n      // Mapping by id if specified.\n      each(newCmptOptions, function (cmptOption, index) {\n        if (!cmptOption || cmptOption.id == null) {\n          return;\n        }\n        var optionId = makeComparableKey(cmptOption.id);\n        var existingIdx = existingIdIdxMap.get(optionId);\n        if (existingIdx != null) {\n          var resultItem = result[existingIdx];\n          assert(!resultItem.newOption, 'Duplicated option on id \"' + optionId + '\".');\n          resultItem.newOption = cmptOption;\n          // In both mode, if id matched, new option will be merged to\n          // the existings rather than creating new component model.\n          resultItem.existing = existings[existingIdx];\n          newCmptOptions[index] = null;\n        }\n      });\n    }\n    function mappingByName(result, newCmptOptions) {\n      // Mapping by name if specified.\n      each(newCmptOptions, function (cmptOption, index) {\n        if (!cmptOption || cmptOption.name == null) {\n          return;\n        }\n        for (var i = 0; i < result.length; i++) {\n          var existing = result[i].existing;\n          if (!result[i].newOption // Consider name: two map to one.\n          // Can not match when both ids existing but different.\n          && existing && (existing.id == null || cmptOption.id == null) && !isComponentIdInternal(cmptOption) && !isComponentIdInternal(existing) && keyExistAndEqual('name', existing, cmptOption)) {\n            result[i].newOption = cmptOption;\n            newCmptOptions[index] = null;\n            return;\n          }\n        }\n      });\n    }\n    function mappingByIndex(result, newCmptOptions, brandNew) {\n      each(newCmptOptions, function (cmptOption) {\n        if (!cmptOption) {\n          return;\n        }\n        // Find the first place that not mapped by id and not internal component (consider the \"hole\").\n        var resultItem;\n        var nextIdx = 0;\n        while (\n        // Be `!resultItem` only when `nextIdx >= result.length`.\n        (resultItem = result[nextIdx]\n        // (1) Existing models that already have id should be able to mapped to. Because\n        // after mapping performed, model will always be assigned with an id if user not given.\n        // After that all models have id.\n        // (2) If new option has id, it can only set to a hole or append to the last. It should\n        // not be merged to the existings with different id. Because id should not be overwritten.\n        // (3) Name can be overwritten, because axis use name as 'show label text'.\n        ) && (resultItem.newOption || isComponentIdInternal(resultItem.existing) ||\n        // In mode \"replaceMerge\", here no not-mapped-non-internal-existing.\n        resultItem.existing && cmptOption.id != null && !keyExistAndEqual('id', cmptOption, resultItem.existing))) {\n          nextIdx++;\n        }\n        if (resultItem) {\n          resultItem.newOption = cmptOption;\n          resultItem.brandNew = brandNew;\n        } else {\n          result.push({\n            newOption: cmptOption,\n            brandNew: brandNew,\n            existing: null,\n            keyInfo: null\n          });\n        }\n        nextIdx++;\n      });\n    }\n    function mappingInReplaceAllMode(result, newCmptOptions) {\n      each(newCmptOptions, function (cmptOption) {\n        // The feature \"reproduce\" requires \"hole\" will also reproduced\n        // in case that component index referring are broken.\n        result.push({\n          newOption: cmptOption,\n          brandNew: true,\n          existing: null,\n          keyInfo: null\n        });\n      });\n    }\n    /**\r\n     * Make id and name for mapping result (result of mappingToExists)\r\n     * into `keyInfo` field.\r\n     */\n    function makeIdAndName(mapResult) {\n      // We use this id to hash component models and view instances\n      // in echarts. id can be specified by user, or auto generated.\n      // The id generation rule ensures new view instance are able\n      // to mapped to old instance when setOption are called in\n      // no-merge mode. So we generate model id by name and plus\n      // type in view id.\n      // name can be duplicated among components, which is convenient\n      // to specify multi components (like series) by one name.\n      // Ensure that each id is distinct.\n      var idMap = createHashMap();\n      each(mapResult, function (item) {\n        var existing = item.existing;\n        existing && idMap.set(existing.id, item);\n      });\n      each(mapResult, function (item) {\n        var opt = item.newOption;\n        // Force ensure id not duplicated.\n        assert(!opt || opt.id == null || !idMap.get(opt.id) || idMap.get(opt.id) === item, 'id duplicates: ' + (opt && opt.id));\n        opt && opt.id != null && idMap.set(opt.id, item);\n        !item.keyInfo && (item.keyInfo = {});\n      });\n      // Make name and id.\n      each(mapResult, function (item, index) {\n        var existing = item.existing;\n        var opt = item.newOption;\n        var keyInfo = item.keyInfo;\n        if (!isObject(opt)) {\n          return;\n        }\n        // Name can be overwritten. Consider case: axis.name = '20km'.\n        // But id generated by name will not be changed, which affect\n        // only in that case: setOption with 'not merge mode' and view\n        // instance will be recreated, which can be accepted.\n        keyInfo.name = opt.name != null ? makeComparableKey(opt.name) : existing ? existing.name\n        // Avoid that different series has the same name,\n        // because name may be used like in color pallet.\n        : DUMMY_COMPONENT_NAME_PREFIX + index;\n        if (existing) {\n          keyInfo.id = makeComparableKey(existing.id);\n        } else if (opt.id != null) {\n          keyInfo.id = makeComparableKey(opt.id);\n        } else {\n          // Consider this situatoin:\n          //  optionA: [{name: 'a'}, {name: 'a'}, {..}]\n          //  optionB [{..}, {name: 'a'}, {name: 'a'}]\n          // Series with the same name between optionA and optionB\n          // should be mapped.\n          var idNum = 0;\n          do {\n            keyInfo.id = '\\0' + keyInfo.name + '\\0' + idNum++;\n          } while (idMap.get(keyInfo.id));\n        }\n        idMap.set(keyInfo.id, item);\n      });\n    }\n    function keyExistAndEqual(attr, obj1, obj2) {\n      var key1 = convertOptionIdName(obj1[attr], null);\n      var key2 = convertOptionIdName(obj2[attr], null);\n      // See `MappingExistingItem`. `id` and `name` trade string equals to number.\n      return key1 != null && key2 != null && key1 === key2;\n    }\n    /**\r\n     * @return return null if not exist.\r\n     */\n    function makeComparableKey(val) {\n      if (\"development\" !== 'production') {\n        if (val == null) {\n          throw new Error();\n        }\n      }\n      return convertOptionIdName(val, '');\n    }\n    function convertOptionIdName(idOrName, defaultValue) {\n      if (idOrName == null) {\n        return defaultValue;\n      }\n      return isString(idOrName) ? idOrName : isNumber(idOrName) || isStringSafe(idOrName) ? idOrName + '' : defaultValue;\n    }\n    function warnInvalidateIdOrName(idOrName) {\n      if (\"development\" !== 'production') {\n        warn('`' + idOrName + '` is invalid id or name. Must be a string or number.');\n      }\n    }\n    function isValidIdOrName(idOrName) {\n      return isStringSafe(idOrName) || isNumeric(idOrName);\n    }\n    function isNameSpecified(componentModel) {\n      var name = componentModel.name;\n      // Is specified when `indexOf` get -1 or > 0.\n      return !!(name && name.indexOf(DUMMY_COMPONENT_NAME_PREFIX));\n    }\n    /**\r\n     * @public\r\n     * @param {Object} cmptOption\r\n     * @return {boolean}\r\n     */\n    function isComponentIdInternal(cmptOption) {\n      return cmptOption && cmptOption.id != null && makeComparableKey(cmptOption.id).indexOf(INTERNAL_COMPONENT_ID_PREFIX) === 0;\n    }\n    function makeInternalComponentId(idSuffix) {\n      return INTERNAL_COMPONENT_ID_PREFIX + idSuffix;\n    }\n    function setComponentTypeToKeyInfo(mappingResult, mainType, componentModelCtor) {\n      // Set mainType and complete subType.\n      each(mappingResult, function (item) {\n        var newOption = item.newOption;\n        if (isObject(newOption)) {\n          item.keyInfo.mainType = mainType;\n          item.keyInfo.subType = determineSubType(mainType, newOption, item.existing, componentModelCtor);\n        }\n      });\n    }\n    function determineSubType(mainType, newCmptOption, existComponent, componentModelCtor) {\n      var subType = newCmptOption.type ? newCmptOption.type : existComponent ? existComponent.subType\n      // Use determineSubType only when there is no existComponent.\n      : componentModelCtor.determineSubType(mainType, newCmptOption);\n      // tooltip, markline, markpoint may always has no subType\n      return subType;\n    }\n    /**\r\n     * A helper for removing duplicate items between batchA and batchB,\r\n     * and in themselves, and categorize by series.\r\n     *\r\n     * @param batchA Like: [{seriesId: 2, dataIndex: [32, 4, 5]}, ...]\r\n     * @param batchB Like: [{seriesId: 2, dataIndex: [32, 4, 5]}, ...]\r\n     * @return result: [resultBatchA, resultBatchB]\r\n     */\n    function compressBatches(batchA, batchB) {\n      var mapA = {};\n      var mapB = {};\n      makeMap(batchA || [], mapA);\n      makeMap(batchB || [], mapB, mapA);\n      return [mapToArray(mapA), mapToArray(mapB)];\n      function makeMap(sourceBatch, map, otherMap) {\n        for (var i = 0, len = sourceBatch.length; i < len; i++) {\n          var seriesId = convertOptionIdName(sourceBatch[i].seriesId, null);\n          if (seriesId == null) {\n            return;\n          }\n          var dataIndices = normalizeToArray(sourceBatch[i].dataIndex);\n          var otherDataIndices = otherMap && otherMap[seriesId];\n          for (var j = 0, lenj = dataIndices.length; j < lenj; j++) {\n            var dataIndex = dataIndices[j];\n            if (otherDataIndices && otherDataIndices[dataIndex]) {\n              otherDataIndices[dataIndex] = null;\n            } else {\n              (map[seriesId] || (map[seriesId] = {}))[dataIndex] = 1;\n            }\n          }\n        }\n      }\n      function mapToArray(map, isData) {\n        var result = [];\n        for (var i in map) {\n          if (map.hasOwnProperty(i) && map[i] != null) {\n            if (isData) {\n              result.push(+i);\n            } else {\n              var dataIndices = mapToArray(map[i], true);\n              dataIndices.length && result.push({\n                seriesId: i,\n                dataIndex: dataIndices\n              });\n            }\n          }\n        }\n        return result;\n      }\n    }\n    /**\r\n     * @param payload Contains dataIndex (means rawIndex) / dataIndexInside / name\r\n     *                         each of which can be Array or primary type.\r\n     * @return dataIndex If not found, return undefined/null.\r\n     */\n    function queryDataIndex(data, payload) {\n      if (payload.dataIndexInside != null) {\n        return payload.dataIndexInside;\n      } else if (payload.dataIndex != null) {\n        return isArray(payload.dataIndex) ? map(payload.dataIndex, function (value) {\n          return data.indexOfRawIndex(value);\n        }) : data.indexOfRawIndex(payload.dataIndex);\n      } else if (payload.name != null) {\n        return isArray(payload.name) ? map(payload.name, function (value) {\n          return data.indexOfName(value);\n        }) : data.indexOfName(payload.name);\n      }\n    }\n    /**\r\n     * Enable property storage to any host object.\r\n     * Notice: Serialization is not supported.\r\n     *\r\n     * For example:\r\n     * let inner = zrUitl.makeInner();\r\n     *\r\n     * function some1(hostObj) {\r\n     *      inner(hostObj).someProperty = 1212;\r\n     *      ...\r\n     * }\r\n     * function some2() {\r\n     *      let fields = inner(this);\r\n     *      fields.someProperty1 = 1212;\r\n     *      fields.someProperty2 = 'xx';\r\n     *      ...\r\n     * }\r\n     *\r\n     * @return {Function}\r\n     */\n    function makeInner() {\n      var key = '__ec_inner_' + innerUniqueIndex++;\n      return function (hostObj) {\n        return hostObj[key] || (hostObj[key] = {});\n      };\n    }\n    var innerUniqueIndex = getRandomIdBase();\n    /**\r\n     * The same behavior as `component.getReferringComponents`.\r\n     */\n    function parseFinder(ecModel, finderInput, opt) {\n      var _a = preParseFinder(finderInput, opt),\n        mainTypeSpecified = _a.mainTypeSpecified,\n        queryOptionMap = _a.queryOptionMap,\n        others = _a.others;\n      var result = others;\n      var defaultMainType = opt ? opt.defaultMainType : null;\n      if (!mainTypeSpecified && defaultMainType) {\n        queryOptionMap.set(defaultMainType, {});\n      }\n      queryOptionMap.each(function (queryOption, mainType) {\n        var queryResult = queryReferringComponents(ecModel, mainType, queryOption, {\n          useDefault: defaultMainType === mainType,\n          enableAll: opt && opt.enableAll != null ? opt.enableAll : true,\n          enableNone: opt && opt.enableNone != null ? opt.enableNone : true\n        });\n        result[mainType + 'Models'] = queryResult.models;\n        result[mainType + 'Model'] = queryResult.models[0];\n      });\n      return result;\n    }\n    function preParseFinder(finderInput, opt) {\n      var finder;\n      if (isString(finderInput)) {\n        var obj = {};\n        obj[finderInput + 'Index'] = 0;\n        finder = obj;\n      } else {\n        finder = finderInput;\n      }\n      var queryOptionMap = createHashMap();\n      var others = {};\n      var mainTypeSpecified = false;\n      each(finder, function (value, key) {\n        // Exclude 'dataIndex' and other illgal keys.\n        if (key === 'dataIndex' || key === 'dataIndexInside') {\n          others[key] = value;\n          return;\n        }\n        var parsedKey = key.match(/^(\\w+)(Index|Id|Name)$/) || [];\n        var mainType = parsedKey[1];\n        var queryType = (parsedKey[2] || '').toLowerCase();\n        if (!mainType || !queryType || opt && opt.includeMainTypes && indexOf(opt.includeMainTypes, mainType) < 0) {\n          return;\n        }\n        mainTypeSpecified = mainTypeSpecified || !!mainType;\n        var queryOption = queryOptionMap.get(mainType) || queryOptionMap.set(mainType, {});\n        queryOption[queryType] = value;\n      });\n      return {\n        mainTypeSpecified: mainTypeSpecified,\n        queryOptionMap: queryOptionMap,\n        others: others\n      };\n    }\n    var SINGLE_REFERRING = {\n      useDefault: true,\n      enableAll: false,\n      enableNone: false\n    };\n    var MULTIPLE_REFERRING = {\n      useDefault: false,\n      enableAll: true,\n      enableNone: true\n    };\n    function queryReferringComponents(ecModel, mainType, userOption, opt) {\n      opt = opt || SINGLE_REFERRING;\n      var indexOption = userOption.index;\n      var idOption = userOption.id;\n      var nameOption = userOption.name;\n      var result = {\n        models: null,\n        specified: indexOption != null || idOption != null || nameOption != null\n      };\n      if (!result.specified) {\n        // Use the first as default if `useDefault`.\n        var firstCmpt = void 0;\n        result.models = opt.useDefault && (firstCmpt = ecModel.getComponent(mainType)) ? [firstCmpt] : [];\n        return result;\n      }\n      if (indexOption === 'none' || indexOption === false) {\n        assert(opt.enableNone, '`\"none\"` or `false` is not a valid value on index option.');\n        result.models = [];\n        return result;\n      }\n      // `queryComponents` will return all components if\n      // both all of index/id/name are null/undefined.\n      if (indexOption === 'all') {\n        assert(opt.enableAll, '`\"all\"` is not a valid value on index option.');\n        indexOption = idOption = nameOption = null;\n      }\n      result.models = ecModel.queryComponents({\n        mainType: mainType,\n        index: indexOption,\n        id: idOption,\n        name: nameOption\n      });\n      return result;\n    }\n    function setAttribute(dom, key, value) {\n      dom.setAttribute ? dom.setAttribute(key, value) : dom[key] = value;\n    }\n    function getAttribute(dom, key) {\n      return dom.getAttribute ? dom.getAttribute(key) : dom[key];\n    }\n    function getTooltipRenderMode(renderModeOption) {\n      if (renderModeOption === 'auto') {\n        // Using html when `document` exists, use richText otherwise\n        return env.domSupported ? 'html' : 'richText';\n      } else {\n        return renderModeOption || 'html';\n      }\n    }\n    /**\r\n     * Group a list by key.\r\n     */\n    function groupData(array, getKey // return key\n    ) {\n      var buckets = createHashMap();\n      var keys = [];\n      each(array, function (item) {\n        var key = getKey(item);\n        (buckets.get(key) || (keys.push(key), buckets.set(key, []))).push(item);\n      });\n      return {\n        keys: keys,\n        buckets: buckets\n      };\n    }\n    /**\r\n     * Interpolate raw values of a series with percent\r\n     *\r\n     * @param data         data\r\n     * @param labelModel   label model of the text element\r\n     * @param sourceValue  start value. May be null/undefined when init.\r\n     * @param targetValue  end value\r\n     * @param percent      0~1 percentage; 0 uses start value while 1 uses end value\r\n     * @return             interpolated values\r\n     *                     If `sourceValue` and `targetValue` are `number`, return `number`.\r\n     *                     If `sourceValue` and `targetValue` are `string`, return `string`.\r\n     *                     If `sourceValue` and `targetValue` are `(string | number)[]`, return `(string | number)[]`.\r\n     *                     Other cases do not supported.\r\n     */\n    function interpolateRawValues(data, precision, sourceValue, targetValue, percent) {\n      var isAutoPrecision = precision == null || precision === 'auto';\n      if (targetValue == null) {\n        return targetValue;\n      }\n      if (isNumber(targetValue)) {\n        var value = interpolateNumber$1(sourceValue || 0, targetValue, percent);\n        return round(value, isAutoPrecision ? Math.max(getPrecision(sourceValue || 0), getPrecision(targetValue)) : precision);\n      } else if (isString(targetValue)) {\n        return percent < 1 ? sourceValue : targetValue;\n      } else {\n        var interpolated = [];\n        var leftArr = sourceValue;\n        var rightArr = targetValue;\n        var length_1 = Math.max(leftArr ? leftArr.length : 0, rightArr.length);\n        for (var i = 0; i < length_1; ++i) {\n          var info = data.getDimensionInfo(i);\n          // Don't interpolate ordinal dims\n          if (info && info.type === 'ordinal') {\n            // In init, there is no `sourceValue`, but should better not to get undefined result.\n            interpolated[i] = (percent < 1 && leftArr ? leftArr : rightArr)[i];\n          } else {\n            var leftVal = leftArr && leftArr[i] ? leftArr[i] : 0;\n            var rightVal = rightArr[i];\n            var value = interpolateNumber$1(leftVal, rightVal, percent);\n            interpolated[i] = round(value, isAutoPrecision ? Math.max(getPrecision(leftVal), getPrecision(rightVal)) : precision);\n          }\n        }\n        return interpolated;\n      }\n    }\n\n    var TYPE_DELIMITER = '.';\n    var IS_CONTAINER = '___EC__COMPONENT__CONTAINER___';\n    var IS_EXTENDED_CLASS = '___EC__EXTENDED_CLASS___';\n    /**\r\n     * Notice, parseClassType('') should returns {main: '', sub: ''}\r\n     * @public\r\n     */\n    function parseClassType(componentType) {\n      var ret = {\n        main: '',\n        sub: ''\n      };\n      if (componentType) {\n        var typeArr = componentType.split(TYPE_DELIMITER);\n        ret.main = typeArr[0] || '';\n        ret.sub = typeArr[1] || '';\n      }\n      return ret;\n    }\n    /**\r\n     * @public\r\n     */\n    function checkClassType(componentType) {\n      assert(/^[a-zA-Z0-9_]+([.][a-zA-Z0-9_]+)?$/.test(componentType), 'componentType \"' + componentType + '\" illegal');\n    }\n    function isExtendedClass(clz) {\n      return !!(clz && clz[IS_EXTENDED_CLASS]);\n    }\n    /**\r\n     * Implements `ExtendableConstructor` for `rootClz`.\r\n     *\r\n     * @usage\r\n     * ```ts\r\n     * class Xxx {}\r\n     * type XxxConstructor = typeof Xxx & ExtendableConstructor\r\n     * enableClassExtend(Xxx as XxxConstructor);\r\n     * ```\r\n     */\n    function enableClassExtend(rootClz, mandatoryMethods) {\n      rootClz.$constructor = rootClz; // FIXME: not necessary?\n      rootClz.extend = function (proto) {\n        if (\"development\" !== 'production') {\n          each(mandatoryMethods, function (method) {\n            if (!proto[method]) {\n              console.warn('Method `' + method + '` should be implemented' + (proto.type ? ' in ' + proto.type : '') + '.');\n            }\n          });\n        }\n        var superClass = this;\n        var ExtendedClass;\n        if (isESClass(superClass)) {\n          ExtendedClass = /** @class */function (_super) {\n            __extends(class_1, _super);\n            function class_1() {\n              return _super.apply(this, arguments) || this;\n            }\n            return class_1;\n          }(superClass);\n        } else {\n          // For backward compat, we both support ts class inheritance and this\n          // \"extend\" approach.\n          // The constructor should keep the same behavior as ts class inheritance:\n          // If this constructor/$constructor is not declared, auto invoke the super\n          // constructor.\n          // If this constructor/$constructor is declared, it is responsible for\n          // calling the super constructor.\n          ExtendedClass = function () {\n            (proto.$constructor || superClass).apply(this, arguments);\n          };\n          inherits(ExtendedClass, this);\n        }\n        extend(ExtendedClass.prototype, proto);\n        ExtendedClass[IS_EXTENDED_CLASS] = true;\n        ExtendedClass.extend = this.extend;\n        ExtendedClass.superCall = superCall;\n        ExtendedClass.superApply = superApply;\n        ExtendedClass.superClass = superClass;\n        return ExtendedClass;\n      };\n    }\n    function isESClass(fn) {\n      return isFunction(fn) && /^class\\s/.test(Function.prototype.toString.call(fn));\n    }\n    /**\r\n     * A work around to both support ts extend and this extend mechanism.\r\n     * on sub-class.\r\n     * @usage\r\n     * ```ts\r\n     * class Component { ... }\r\n     * classUtil.enableClassExtend(Component);\r\n     * classUtil.enableClassManagement(Component, {registerWhenExtend: true});\r\n     *\r\n     * class Series extends Component { ... }\r\n     * // Without calling `markExtend`, `registerWhenExtend` will not work.\r\n     * Component.markExtend(Series);\r\n     * ```\r\n     */\n    function mountExtend(SubClz, SupperClz) {\n      SubClz.extend = SupperClz.extend;\n    }\n    // A random offset.\n    var classBase = Math.round(Math.random() * 10);\n    /**\r\n     * Implements `CheckableConstructor` for `target`.\r\n     * Can not use instanceof, consider different scope by\r\n     * cross domain or es module import in ec extensions.\r\n     * Mount a method \"isInstance()\" to Clz.\r\n     *\r\n     * @usage\r\n     * ```ts\r\n     * class Xxx {}\r\n     * type XxxConstructor = typeof Xxx & CheckableConstructor;\r\n     * enableClassCheck(Xxx as XxxConstructor)\r\n     * ```\r\n     */\n    function enableClassCheck(target) {\n      var classAttr = ['__\\0is_clz', classBase++].join('_');\n      target.prototype[classAttr] = true;\n      if (\"development\" !== 'production') {\n        assert(!target.isInstance, 'The method \"is\" can not be defined.');\n      }\n      target.isInstance = function (obj) {\n        return !!(obj && obj[classAttr]);\n      };\n    }\n    // superCall should have class info, which can not be fetched from 'this'.\n    // Consider this case:\n    // class A has method f,\n    // class B inherits class A, overrides method f, f call superApply('f'),\n    // class C inherits class B, does not override method f,\n    // then when method of class C is called, dead loop occurred.\n    function superCall(context, methodName) {\n      var args = [];\n      for (var _i = 2; _i < arguments.length; _i++) {\n        args[_i - 2] = arguments[_i];\n      }\n      return this.superClass.prototype[methodName].apply(context, args);\n    }\n    function superApply(context, methodName, args) {\n      return this.superClass.prototype[methodName].apply(context, args);\n    }\n    /**\r\n     * Implements `ClassManager` for `target`\r\n     *\r\n     * @usage\r\n     * ```ts\r\n     * class Xxx {}\r\n     * type XxxConstructor = typeof Xxx & ClassManager\r\n     * enableClassManagement(Xxx as XxxConstructor);\r\n     * ```\r\n     */\n    function enableClassManagement(target) {\n      /**\r\n       * Component model classes\r\n       * key: componentType,\r\n       * value:\r\n       *     componentClass, when componentType is 'a'\r\n       *     or Object.<subKey, componentClass>, when componentType is 'a.b'\r\n       */\n      var storage = {};\n      target.registerClass = function (clz) {\n        // `type` should not be a \"instance member\".\n        // If using TS class, should better declared as `static type = 'series.pie'`.\n        // otherwise users have to mount `type` on prototype manually.\n        // For backward compat and enable instance visit type via `this.type`,\n        // we still support fetch `type` from prototype.\n        var componentFullType = clz.type || clz.prototype.type;\n        if (componentFullType) {\n          checkClassType(componentFullType);\n          // If only static type declared, we assign it to prototype mandatorily.\n          clz.prototype.type = componentFullType;\n          var componentTypeInfo = parseClassType(componentFullType);\n          if (!componentTypeInfo.sub) {\n            if (\"development\" !== 'production') {\n              if (storage[componentTypeInfo.main]) {\n                console.warn(componentTypeInfo.main + ' exists.');\n              }\n            }\n            storage[componentTypeInfo.main] = clz;\n          } else if (componentTypeInfo.sub !== IS_CONTAINER) {\n            var container = makeContainer(componentTypeInfo);\n            container[componentTypeInfo.sub] = clz;\n          }\n        }\n        return clz;\n      };\n      target.getClass = function (mainType, subType, throwWhenNotFound) {\n        var clz = storage[mainType];\n        if (clz && clz[IS_CONTAINER]) {\n          clz = subType ? clz[subType] : null;\n        }\n        if (throwWhenNotFound && !clz) {\n          throw new Error(!subType ? mainType + '.' + 'type should be specified.' : 'Component ' + mainType + '.' + (subType || '') + ' is used but not imported.');\n        }\n        return clz;\n      };\n      target.getClassesByMainType = function (componentType) {\n        var componentTypeInfo = parseClassType(componentType);\n        var result = [];\n        var obj = storage[componentTypeInfo.main];\n        if (obj && obj[IS_CONTAINER]) {\n          each(obj, function (o, type) {\n            type !== IS_CONTAINER && result.push(o);\n          });\n        } else {\n          result.push(obj);\n        }\n        return result;\n      };\n      target.hasClass = function (componentType) {\n        // Just consider componentType.main.\n        var componentTypeInfo = parseClassType(componentType);\n        return !!storage[componentTypeInfo.main];\n      };\n      /**\r\n       * @return Like ['aa', 'bb'], but can not be ['aa.xx']\r\n       */\n      target.getAllClassMainTypes = function () {\n        var types = [];\n        each(storage, function (obj, type) {\n          types.push(type);\n        });\n        return types;\n      };\n      /**\r\n       * If a main type is container and has sub types\r\n       */\n      target.hasSubTypes = function (componentType) {\n        var componentTypeInfo = parseClassType(componentType);\n        var obj = storage[componentTypeInfo.main];\n        return obj && obj[IS_CONTAINER];\n      };\n      function makeContainer(componentTypeInfo) {\n        var container = storage[componentTypeInfo.main];\n        if (!container || !container[IS_CONTAINER]) {\n          container = storage[componentTypeInfo.main] = {};\n          container[IS_CONTAINER] = true;\n        }\n        return container;\n      }\n    }\n    // /**\n    //  * @param {string|Array.<string>} properties\n    //  */\n    // export function setReadOnly(obj, properties) {\n    // FIXME It seems broken in IE8 simulation of IE11\n    // if (!zrUtil.isArray(properties)) {\n    //     properties = properties != null ? [properties] : [];\n    // }\n    // zrUtil.each(properties, function (prop) {\n    //     let value = obj[prop];\n    //     Object.defineProperty\n    //         && Object.defineProperty(obj, prop, {\n    //             value: value, writable: false\n    //         });\n    //     zrUtil.isArray(obj[prop])\n    //         && Object.freeze\n    //         && Object.freeze(obj[prop]);\n    // });\n    // }\n\n    function makeStyleMapper(properties, ignoreParent) {\n      // Normalize\n      for (var i = 0; i < properties.length; i++) {\n        if (!properties[i][1]) {\n          properties[i][1] = properties[i][0];\n        }\n      }\n      ignoreParent = ignoreParent || false;\n      return function (model, excludes, includes) {\n        var style = {};\n        for (var i = 0; i < properties.length; i++) {\n          var propName = properties[i][1];\n          if (excludes && indexOf(excludes, propName) >= 0 || includes && indexOf(includes, propName) < 0) {\n            continue;\n          }\n          var val = model.getShallow(propName, ignoreParent);\n          if (val != null) {\n            style[properties[i][0]] = val;\n          }\n        }\n        // TODO Text or image?\n        return style;\n      };\n    }\n\n    var AREA_STYLE_KEY_MAP = [['fill', 'color'], ['shadowBlur'], ['shadowOffsetX'], ['shadowOffsetY'], ['opacity'], ['shadowColor']\n    // Option decal is in `DecalObject` but style.decal is in `PatternObject`.\n    // So do not transfer decal directly.\n    ];\n    var getAreaStyle = makeStyleMapper(AREA_STYLE_KEY_MAP);\n    var AreaStyleMixin = /** @class */function () {\n      function AreaStyleMixin() {}\n      AreaStyleMixin.prototype.getAreaStyle = function (excludes, includes) {\n        return getAreaStyle(this, excludes, includes);\n      };\n      return AreaStyleMixin;\n    }();\n\n    var globalImageCache = new LRU(50);\n    function findExistImage(newImageOrSrc) {\n        if (typeof newImageOrSrc === 'string') {\n            var cachedImgObj = globalImageCache.get(newImageOrSrc);\n            return cachedImgObj && cachedImgObj.image;\n        }\n        else {\n            return newImageOrSrc;\n        }\n    }\n    function createOrUpdateImage(newImageOrSrc, image, hostEl, onload, cbPayload) {\n        if (!newImageOrSrc) {\n            return image;\n        }\n        else if (typeof newImageOrSrc === 'string') {\n            if ((image && image.__zrImageSrc === newImageOrSrc) || !hostEl) {\n                return image;\n            }\n            var cachedImgObj = globalImageCache.get(newImageOrSrc);\n            var pendingWrap = { hostEl: hostEl, cb: onload, cbPayload: cbPayload };\n            if (cachedImgObj) {\n                image = cachedImgObj.image;\n                !isImageReady(image) && cachedImgObj.pending.push(pendingWrap);\n            }\n            else {\n                image = platformApi.loadImage(newImageOrSrc, imageOnLoad, imageOnLoad);\n                image.__zrImageSrc = newImageOrSrc;\n                globalImageCache.put(newImageOrSrc, image.__cachedImgObj = {\n                    image: image,\n                    pending: [pendingWrap]\n                });\n            }\n            return image;\n        }\n        else {\n            return newImageOrSrc;\n        }\n    }\n    function imageOnLoad() {\n        var cachedImgObj = this.__cachedImgObj;\n        this.onload = this.onerror = this.__cachedImgObj = null;\n        for (var i = 0; i < cachedImgObj.pending.length; i++) {\n            var pendingWrap = cachedImgObj.pending[i];\n            var cb = pendingWrap.cb;\n            cb && cb(this, pendingWrap.cbPayload);\n            pendingWrap.hostEl.dirty();\n        }\n        cachedImgObj.pending.length = 0;\n    }\n    function isImageReady(image) {\n        return image && image.width && image.height;\n    }\n\n    var STYLE_REG = /\\{([a-zA-Z0-9_]+)\\|([^}]*)\\}/g;\n    function truncateText(text, containerWidth, font, ellipsis, options) {\n        var out = {};\n        truncateText2(out, text, containerWidth, font, ellipsis, options);\n        return out.text;\n    }\n    function truncateText2(out, text, containerWidth, font, ellipsis, options) {\n        if (!containerWidth) {\n            out.text = '';\n            out.isTruncated = false;\n            return;\n        }\n        var textLines = (text + '').split('\\n');\n        options = prepareTruncateOptions(containerWidth, font, ellipsis, options);\n        var isTruncated = false;\n        var truncateOut = {};\n        for (var i = 0, len = textLines.length; i < len; i++) {\n            truncateSingleLine(truncateOut, textLines[i], options);\n            textLines[i] = truncateOut.textLine;\n            isTruncated = isTruncated || truncateOut.isTruncated;\n        }\n        out.text = textLines.join('\\n');\n        out.isTruncated = isTruncated;\n    }\n    function prepareTruncateOptions(containerWidth, font, ellipsis, options) {\n        options = options || {};\n        var preparedOpts = extend({}, options);\n        preparedOpts.font = font;\n        ellipsis = retrieve2(ellipsis, '...');\n        preparedOpts.maxIterations = retrieve2(options.maxIterations, 2);\n        var minChar = preparedOpts.minChar = retrieve2(options.minChar, 0);\n        preparedOpts.cnCharWidth = getWidth('国', font);\n        var ascCharWidth = preparedOpts.ascCharWidth = getWidth('a', font);\n        preparedOpts.placeholder = retrieve2(options.placeholder, '');\n        var contentWidth = containerWidth = Math.max(0, containerWidth - 1);\n        for (var i = 0; i < minChar && contentWidth >= ascCharWidth; i++) {\n            contentWidth -= ascCharWidth;\n        }\n        var ellipsisWidth = getWidth(ellipsis, font);\n        if (ellipsisWidth > contentWidth) {\n            ellipsis = '';\n            ellipsisWidth = 0;\n        }\n        contentWidth = containerWidth - ellipsisWidth;\n        preparedOpts.ellipsis = ellipsis;\n        preparedOpts.ellipsisWidth = ellipsisWidth;\n        preparedOpts.contentWidth = contentWidth;\n        preparedOpts.containerWidth = containerWidth;\n        return preparedOpts;\n    }\n    function truncateSingleLine(out, textLine, options) {\n        var containerWidth = options.containerWidth;\n        var font = options.font;\n        var contentWidth = options.contentWidth;\n        if (!containerWidth) {\n            out.textLine = '';\n            out.isTruncated = false;\n            return;\n        }\n        var lineWidth = getWidth(textLine, font);\n        if (lineWidth <= containerWidth) {\n            out.textLine = textLine;\n            out.isTruncated = false;\n            return;\n        }\n        for (var j = 0;; j++) {\n            if (lineWidth <= contentWidth || j >= options.maxIterations) {\n                textLine += options.ellipsis;\n                break;\n            }\n            var subLength = j === 0\n                ? estimateLength(textLine, contentWidth, options.ascCharWidth, options.cnCharWidth)\n                : lineWidth > 0\n                    ? Math.floor(textLine.length * contentWidth / lineWidth)\n                    : 0;\n            textLine = textLine.substr(0, subLength);\n            lineWidth = getWidth(textLine, font);\n        }\n        if (textLine === '') {\n            textLine = options.placeholder;\n        }\n        out.textLine = textLine;\n        out.isTruncated = true;\n    }\n    function estimateLength(text, contentWidth, ascCharWidth, cnCharWidth) {\n        var width = 0;\n        var i = 0;\n        for (var len = text.length; i < len && width < contentWidth; i++) {\n            var charCode = text.charCodeAt(i);\n            width += (0 <= charCode && charCode <= 127) ? ascCharWidth : cnCharWidth;\n        }\n        return i;\n    }\n    function parsePlainText(text, style) {\n        text != null && (text += '');\n        var overflow = style.overflow;\n        var padding = style.padding;\n        var font = style.font;\n        var truncate = overflow === 'truncate';\n        var calculatedLineHeight = getLineHeight(font);\n        var lineHeight = retrieve2(style.lineHeight, calculatedLineHeight);\n        var bgColorDrawn = !!(style.backgroundColor);\n        var truncateLineOverflow = style.lineOverflow === 'truncate';\n        var isTruncated = false;\n        var width = style.width;\n        var lines;\n        if (width != null && (overflow === 'break' || overflow === 'breakAll')) {\n            lines = text ? wrapText(text, style.font, width, overflow === 'breakAll', 0).lines : [];\n        }\n        else {\n            lines = text ? text.split('\\n') : [];\n        }\n        var contentHeight = lines.length * lineHeight;\n        var height = retrieve2(style.height, contentHeight);\n        if (contentHeight > height && truncateLineOverflow) {\n            var lineCount = Math.floor(height / lineHeight);\n            isTruncated = isTruncated || (lines.length > lineCount);\n            lines = lines.slice(0, lineCount);\n        }\n        if (text && truncate && width != null) {\n            var options = prepareTruncateOptions(width, font, style.ellipsis, {\n                minChar: style.truncateMinChar,\n                placeholder: style.placeholder\n            });\n            var singleOut = {};\n            for (var i = 0; i < lines.length; i++) {\n                truncateSingleLine(singleOut, lines[i], options);\n                lines[i] = singleOut.textLine;\n                isTruncated = isTruncated || singleOut.isTruncated;\n            }\n        }\n        var outerHeight = height;\n        var contentWidth = 0;\n        for (var i = 0; i < lines.length; i++) {\n            contentWidth = Math.max(getWidth(lines[i], font), contentWidth);\n        }\n        if (width == null) {\n            width = contentWidth;\n        }\n        var outerWidth = contentWidth;\n        if (padding) {\n            outerHeight += padding[0] + padding[2];\n            outerWidth += padding[1] + padding[3];\n            width += padding[1] + padding[3];\n        }\n        if (bgColorDrawn) {\n            outerWidth = width;\n        }\n        return {\n            lines: lines,\n            height: height,\n            outerWidth: outerWidth,\n            outerHeight: outerHeight,\n            lineHeight: lineHeight,\n            calculatedLineHeight: calculatedLineHeight,\n            contentWidth: contentWidth,\n            contentHeight: contentHeight,\n            width: width,\n            isTruncated: isTruncated\n        };\n    }\n    var RichTextToken = (function () {\n        function RichTextToken() {\n        }\n        return RichTextToken;\n    }());\n    var RichTextLine = (function () {\n        function RichTextLine(tokens) {\n            this.tokens = [];\n            if (tokens) {\n                this.tokens = tokens;\n            }\n        }\n        return RichTextLine;\n    }());\n    var RichTextContentBlock = (function () {\n        function RichTextContentBlock() {\n            this.width = 0;\n            this.height = 0;\n            this.contentWidth = 0;\n            this.contentHeight = 0;\n            this.outerWidth = 0;\n            this.outerHeight = 0;\n            this.lines = [];\n            this.isTruncated = false;\n        }\n        return RichTextContentBlock;\n    }());\n    function parseRichText(text, style) {\n        var contentBlock = new RichTextContentBlock();\n        text != null && (text += '');\n        if (!text) {\n            return contentBlock;\n        }\n        var topWidth = style.width;\n        var topHeight = style.height;\n        var overflow = style.overflow;\n        var wrapInfo = (overflow === 'break' || overflow === 'breakAll') && topWidth != null\n            ? { width: topWidth, accumWidth: 0, breakAll: overflow === 'breakAll' }\n            : null;\n        var lastIndex = STYLE_REG.lastIndex = 0;\n        var result;\n        while ((result = STYLE_REG.exec(text)) != null) {\n            var matchedIndex = result.index;\n            if (matchedIndex > lastIndex) {\n                pushTokens(contentBlock, text.substring(lastIndex, matchedIndex), style, wrapInfo);\n            }\n            pushTokens(contentBlock, result[2], style, wrapInfo, result[1]);\n            lastIndex = STYLE_REG.lastIndex;\n        }\n        if (lastIndex < text.length) {\n            pushTokens(contentBlock, text.substring(lastIndex, text.length), style, wrapInfo);\n        }\n        var pendingList = [];\n        var calculatedHeight = 0;\n        var calculatedWidth = 0;\n        var stlPadding = style.padding;\n        var truncate = overflow === 'truncate';\n        var truncateLine = style.lineOverflow === 'truncate';\n        var tmpTruncateOut = {};\n        function finishLine(line, lineWidth, lineHeight) {\n            line.width = lineWidth;\n            line.lineHeight = lineHeight;\n            calculatedHeight += lineHeight;\n            calculatedWidth = Math.max(calculatedWidth, lineWidth);\n        }\n        outer: for (var i = 0; i < contentBlock.lines.length; i++) {\n            var line = contentBlock.lines[i];\n            var lineHeight = 0;\n            var lineWidth = 0;\n            for (var j = 0; j < line.tokens.length; j++) {\n                var token = line.tokens[j];\n                var tokenStyle = token.styleName && style.rich[token.styleName] || {};\n                var textPadding = token.textPadding = tokenStyle.padding;\n                var paddingH = textPadding ? textPadding[1] + textPadding[3] : 0;\n                var font = token.font = tokenStyle.font || style.font;\n                token.contentHeight = getLineHeight(font);\n                var tokenHeight = retrieve2(tokenStyle.height, token.contentHeight);\n                token.innerHeight = tokenHeight;\n                textPadding && (tokenHeight += textPadding[0] + textPadding[2]);\n                token.height = tokenHeight;\n                token.lineHeight = retrieve3(tokenStyle.lineHeight, style.lineHeight, tokenHeight);\n                token.align = tokenStyle && tokenStyle.align || style.align;\n                token.verticalAlign = tokenStyle && tokenStyle.verticalAlign || 'middle';\n                if (truncateLine && topHeight != null && calculatedHeight + token.lineHeight > topHeight) {\n                    var originalLength = contentBlock.lines.length;\n                    if (j > 0) {\n                        line.tokens = line.tokens.slice(0, j);\n                        finishLine(line, lineWidth, lineHeight);\n                        contentBlock.lines = contentBlock.lines.slice(0, i + 1);\n                    }\n                    else {\n                        contentBlock.lines = contentBlock.lines.slice(0, i);\n                    }\n                    contentBlock.isTruncated = contentBlock.isTruncated || (contentBlock.lines.length < originalLength);\n                    break outer;\n                }\n                var styleTokenWidth = tokenStyle.width;\n                var tokenWidthNotSpecified = styleTokenWidth == null || styleTokenWidth === 'auto';\n                if (typeof styleTokenWidth === 'string' && styleTokenWidth.charAt(styleTokenWidth.length - 1) === '%') {\n                    token.percentWidth = styleTokenWidth;\n                    pendingList.push(token);\n                    token.contentWidth = getWidth(token.text, font);\n                }\n                else {\n                    if (tokenWidthNotSpecified) {\n                        var textBackgroundColor = tokenStyle.backgroundColor;\n                        var bgImg = textBackgroundColor && textBackgroundColor.image;\n                        if (bgImg) {\n                            bgImg = findExistImage(bgImg);\n                            if (isImageReady(bgImg)) {\n                                token.width = Math.max(token.width, bgImg.width * tokenHeight / bgImg.height);\n                            }\n                        }\n                    }\n                    var remainTruncWidth = truncate && topWidth != null\n                        ? topWidth - lineWidth : null;\n                    if (remainTruncWidth != null && remainTruncWidth < token.width) {\n                        if (!tokenWidthNotSpecified || remainTruncWidth < paddingH) {\n                            token.text = '';\n                            token.width = token.contentWidth = 0;\n                        }\n                        else {\n                            truncateText2(tmpTruncateOut, token.text, remainTruncWidth - paddingH, font, style.ellipsis, { minChar: style.truncateMinChar });\n                            token.text = tmpTruncateOut.text;\n                            contentBlock.isTruncated = contentBlock.isTruncated || tmpTruncateOut.isTruncated;\n                            token.width = token.contentWidth = getWidth(token.text, font);\n                        }\n                    }\n                    else {\n                        token.contentWidth = getWidth(token.text, font);\n                    }\n                }\n                token.width += paddingH;\n                lineWidth += token.width;\n                tokenStyle && (lineHeight = Math.max(lineHeight, token.lineHeight));\n            }\n            finishLine(line, lineWidth, lineHeight);\n        }\n        contentBlock.outerWidth = contentBlock.width = retrieve2(topWidth, calculatedWidth);\n        contentBlock.outerHeight = contentBlock.height = retrieve2(topHeight, calculatedHeight);\n        contentBlock.contentHeight = calculatedHeight;\n        contentBlock.contentWidth = calculatedWidth;\n        if (stlPadding) {\n            contentBlock.outerWidth += stlPadding[1] + stlPadding[3];\n            contentBlock.outerHeight += stlPadding[0] + stlPadding[2];\n        }\n        for (var i = 0; i < pendingList.length; i++) {\n            var token = pendingList[i];\n            var percentWidth = token.percentWidth;\n            token.width = parseInt(percentWidth, 10) / 100 * contentBlock.width;\n        }\n        return contentBlock;\n    }\n    function pushTokens(block, str, style, wrapInfo, styleName) {\n        var isEmptyStr = str === '';\n        var tokenStyle = styleName && style.rich[styleName] || {};\n        var lines = block.lines;\n        var font = tokenStyle.font || style.font;\n        var newLine = false;\n        var strLines;\n        var linesWidths;\n        if (wrapInfo) {\n            var tokenPadding = tokenStyle.padding;\n            var tokenPaddingH = tokenPadding ? tokenPadding[1] + tokenPadding[3] : 0;\n            if (tokenStyle.width != null && tokenStyle.width !== 'auto') {\n                var outerWidth_1 = parsePercent(tokenStyle.width, wrapInfo.width) + tokenPaddingH;\n                if (lines.length > 0) {\n                    if (outerWidth_1 + wrapInfo.accumWidth > wrapInfo.width) {\n                        strLines = str.split('\\n');\n                        newLine = true;\n                    }\n                }\n                wrapInfo.accumWidth = outerWidth_1;\n            }\n            else {\n                var res = wrapText(str, font, wrapInfo.width, wrapInfo.breakAll, wrapInfo.accumWidth);\n                wrapInfo.accumWidth = res.accumWidth + tokenPaddingH;\n                linesWidths = res.linesWidths;\n                strLines = res.lines;\n            }\n        }\n        else {\n            strLines = str.split('\\n');\n        }\n        for (var i = 0; i < strLines.length; i++) {\n            var text = strLines[i];\n            var token = new RichTextToken();\n            token.styleName = styleName;\n            token.text = text;\n            token.isLineHolder = !text && !isEmptyStr;\n            if (typeof tokenStyle.width === 'number') {\n                token.width = tokenStyle.width;\n            }\n            else {\n                token.width = linesWidths\n                    ? linesWidths[i]\n                    : getWidth(text, font);\n            }\n            if (!i && !newLine) {\n                var tokens = (lines[lines.length - 1] || (lines[0] = new RichTextLine())).tokens;\n                var tokensLen = tokens.length;\n                (tokensLen === 1 && tokens[0].isLineHolder)\n                    ? (tokens[0] = token)\n                    : ((text || !tokensLen || isEmptyStr) && tokens.push(token));\n            }\n            else {\n                lines.push(new RichTextLine([token]));\n            }\n        }\n    }\n    function isAlphabeticLetter(ch) {\n        var code = ch.charCodeAt(0);\n        return code >= 0x20 && code <= 0x24F\n            || code >= 0x370 && code <= 0x10FF\n            || code >= 0x1200 && code <= 0x13FF\n            || code >= 0x1E00 && code <= 0x206F;\n    }\n    var breakCharMap = reduce(',&?/;] '.split(''), function (obj, ch) {\n        obj[ch] = true;\n        return obj;\n    }, {});\n    function isWordBreakChar(ch) {\n        if (isAlphabeticLetter(ch)) {\n            if (breakCharMap[ch]) {\n                return true;\n            }\n            return false;\n        }\n        return true;\n    }\n    function wrapText(text, font, lineWidth, isBreakAll, lastAccumWidth) {\n        var lines = [];\n        var linesWidths = [];\n        var line = '';\n        var currentWord = '';\n        var currentWordWidth = 0;\n        var accumWidth = 0;\n        for (var i = 0; i < text.length; i++) {\n            var ch = text.charAt(i);\n            if (ch === '\\n') {\n                if (currentWord) {\n                    line += currentWord;\n                    accumWidth += currentWordWidth;\n                }\n                lines.push(line);\n                linesWidths.push(accumWidth);\n                line = '';\n                currentWord = '';\n                currentWordWidth = 0;\n                accumWidth = 0;\n                continue;\n            }\n            var chWidth = getWidth(ch, font);\n            var inWord = isBreakAll ? false : !isWordBreakChar(ch);\n            if (!lines.length\n                ? lastAccumWidth + accumWidth + chWidth > lineWidth\n                : accumWidth + chWidth > lineWidth) {\n                if (!accumWidth) {\n                    if (inWord) {\n                        lines.push(currentWord);\n                        linesWidths.push(currentWordWidth);\n                        currentWord = ch;\n                        currentWordWidth = chWidth;\n                    }\n                    else {\n                        lines.push(ch);\n                        linesWidths.push(chWidth);\n                    }\n                }\n                else if (line || currentWord) {\n                    if (inWord) {\n                        if (!line) {\n                            line = currentWord;\n                            currentWord = '';\n                            currentWordWidth = 0;\n                            accumWidth = currentWordWidth;\n                        }\n                        lines.push(line);\n                        linesWidths.push(accumWidth - currentWordWidth);\n                        currentWord += ch;\n                        currentWordWidth += chWidth;\n                        line = '';\n                        accumWidth = currentWordWidth;\n                    }\n                    else {\n                        if (currentWord) {\n                            line += currentWord;\n                            currentWord = '';\n                            currentWordWidth = 0;\n                        }\n                        lines.push(line);\n                        linesWidths.push(accumWidth);\n                        line = ch;\n                        accumWidth = chWidth;\n                    }\n                }\n                continue;\n            }\n            accumWidth += chWidth;\n            if (inWord) {\n                currentWord += ch;\n                currentWordWidth += chWidth;\n            }\n            else {\n                if (currentWord) {\n                    line += currentWord;\n                    currentWord = '';\n                    currentWordWidth = 0;\n                }\n                line += ch;\n            }\n        }\n        if (!lines.length && !line) {\n            line = text;\n            currentWord = '';\n            currentWordWidth = 0;\n        }\n        if (currentWord) {\n            line += currentWord;\n        }\n        if (line) {\n            lines.push(line);\n            linesWidths.push(accumWidth);\n        }\n        if (lines.length === 1) {\n            accumWidth += lastAccumWidth;\n        }\n        return {\n            accumWidth: accumWidth,\n            lines: lines,\n            linesWidths: linesWidths\n        };\n    }\n\n    var STYLE_MAGIC_KEY = '__zr_style_' + Math.round((Math.random() * 10));\n    var DEFAULT_COMMON_STYLE = {\n        shadowBlur: 0,\n        shadowOffsetX: 0,\n        shadowOffsetY: 0,\n        shadowColor: '#000',\n        opacity: 1,\n        blend: 'source-over'\n    };\n    var DEFAULT_COMMON_ANIMATION_PROPS = {\n        style: {\n            shadowBlur: true,\n            shadowOffsetX: true,\n            shadowOffsetY: true,\n            shadowColor: true,\n            opacity: true\n        }\n    };\n    DEFAULT_COMMON_STYLE[STYLE_MAGIC_KEY] = true;\n    var PRIMARY_STATES_KEYS$1 = ['z', 'z2', 'invisible'];\n    var PRIMARY_STATES_KEYS_IN_HOVER_LAYER = ['invisible'];\n    var Displayable = (function (_super) {\n        __extends(Displayable, _super);\n        function Displayable(props) {\n            return _super.call(this, props) || this;\n        }\n        Displayable.prototype._init = function (props) {\n            var keysArr = keys(props);\n            for (var i = 0; i < keysArr.length; i++) {\n                var key = keysArr[i];\n                if (key === 'style') {\n                    this.useStyle(props[key]);\n                }\n                else {\n                    _super.prototype.attrKV.call(this, key, props[key]);\n                }\n            }\n            if (!this.style) {\n                this.useStyle({});\n            }\n        };\n        Displayable.prototype.beforeBrush = function () { };\n        Displayable.prototype.afterBrush = function () { };\n        Displayable.prototype.innerBeforeBrush = function () { };\n        Displayable.prototype.innerAfterBrush = function () { };\n        Displayable.prototype.shouldBePainted = function (viewWidth, viewHeight, considerClipPath, considerAncestors) {\n            var m = this.transform;\n            if (this.ignore\n                || this.invisible\n                || this.style.opacity === 0\n                || (this.culling\n                    && isDisplayableCulled(this, viewWidth, viewHeight))\n                || (m && !m[0] && !m[3])) {\n                return false;\n            }\n            if (considerClipPath && this.__clipPaths) {\n                for (var i = 0; i < this.__clipPaths.length; ++i) {\n                    if (this.__clipPaths[i].isZeroArea()) {\n                        return false;\n                    }\n                }\n            }\n            if (considerAncestors && this.parent) {\n                var parent_1 = this.parent;\n                while (parent_1) {\n                    if (parent_1.ignore) {\n                        return false;\n                    }\n                    parent_1 = parent_1.parent;\n                }\n            }\n            return true;\n        };\n        Displayable.prototype.contain = function (x, y) {\n            return this.rectContain(x, y);\n        };\n        Displayable.prototype.traverse = function (cb, context) {\n            cb.call(context, this);\n        };\n        Displayable.prototype.rectContain = function (x, y) {\n            var coord = this.transformCoordToLocal(x, y);\n            var rect = this.getBoundingRect();\n            return rect.contain(coord[0], coord[1]);\n        };\n        Displayable.prototype.getPaintRect = function () {\n            var rect = this._paintRect;\n            if (!this._paintRect || this.__dirty) {\n                var transform = this.transform;\n                var elRect = this.getBoundingRect();\n                var style = this.style;\n                var shadowSize = style.shadowBlur || 0;\n                var shadowOffsetX = style.shadowOffsetX || 0;\n                var shadowOffsetY = style.shadowOffsetY || 0;\n                rect = this._paintRect || (this._paintRect = new BoundingRect(0, 0, 0, 0));\n                if (transform) {\n                    BoundingRect.applyTransform(rect, elRect, transform);\n                }\n                else {\n                    rect.copy(elRect);\n                }\n                if (shadowSize || shadowOffsetX || shadowOffsetY) {\n                    rect.width += shadowSize * 2 + Math.abs(shadowOffsetX);\n                    rect.height += shadowSize * 2 + Math.abs(shadowOffsetY);\n                    rect.x = Math.min(rect.x, rect.x + shadowOffsetX - shadowSize);\n                    rect.y = Math.min(rect.y, rect.y + shadowOffsetY - shadowSize);\n                }\n                var tolerance = this.dirtyRectTolerance;\n                if (!rect.isZero()) {\n                    rect.x = Math.floor(rect.x - tolerance);\n                    rect.y = Math.floor(rect.y - tolerance);\n                    rect.width = Math.ceil(rect.width + 1 + tolerance * 2);\n                    rect.height = Math.ceil(rect.height + 1 + tolerance * 2);\n                }\n            }\n            return rect;\n        };\n        Displayable.prototype.setPrevPaintRect = function (paintRect) {\n            if (paintRect) {\n                this._prevPaintRect = this._prevPaintRect || new BoundingRect(0, 0, 0, 0);\n                this._prevPaintRect.copy(paintRect);\n            }\n            else {\n                this._prevPaintRect = null;\n            }\n        };\n        Displayable.prototype.getPrevPaintRect = function () {\n            return this._prevPaintRect;\n        };\n        Displayable.prototype.animateStyle = function (loop) {\n            return this.animate('style', loop);\n        };\n        Displayable.prototype.updateDuringAnimation = function (targetKey) {\n            if (targetKey === 'style') {\n                this.dirtyStyle();\n            }\n            else {\n                this.markRedraw();\n            }\n        };\n        Displayable.prototype.attrKV = function (key, value) {\n            if (key !== 'style') {\n                _super.prototype.attrKV.call(this, key, value);\n            }\n            else {\n                if (!this.style) {\n                    this.useStyle(value);\n                }\n                else {\n                    this.setStyle(value);\n                }\n            }\n        };\n        Displayable.prototype.setStyle = function (keyOrObj, value) {\n            if (typeof keyOrObj === 'string') {\n                this.style[keyOrObj] = value;\n            }\n            else {\n                extend(this.style, keyOrObj);\n            }\n            this.dirtyStyle();\n            return this;\n        };\n        Displayable.prototype.dirtyStyle = function (notRedraw) {\n            if (!notRedraw) {\n                this.markRedraw();\n            }\n            this.__dirty |= STYLE_CHANGED_BIT;\n            if (this._rect) {\n                this._rect = null;\n            }\n        };\n        Displayable.prototype.dirty = function () {\n            this.dirtyStyle();\n        };\n        Displayable.prototype.styleChanged = function () {\n            return !!(this.__dirty & STYLE_CHANGED_BIT);\n        };\n        Displayable.prototype.styleUpdated = function () {\n            this.__dirty &= ~STYLE_CHANGED_BIT;\n        };\n        Displayable.prototype.createStyle = function (obj) {\n            return createObject(DEFAULT_COMMON_STYLE, obj);\n        };\n        Displayable.prototype.useStyle = function (obj) {\n            if (!obj[STYLE_MAGIC_KEY]) {\n                obj = this.createStyle(obj);\n            }\n            if (this.__inHover) {\n                this.__hoverStyle = obj;\n            }\n            else {\n                this.style = obj;\n            }\n            this.dirtyStyle();\n        };\n        Displayable.prototype.isStyleObject = function (obj) {\n            return obj[STYLE_MAGIC_KEY];\n        };\n        Displayable.prototype._innerSaveToNormal = function (toState) {\n            _super.prototype._innerSaveToNormal.call(this, toState);\n            var normalState = this._normalState;\n            if (toState.style && !normalState.style) {\n                normalState.style = this._mergeStyle(this.createStyle(), this.style);\n            }\n            this._savePrimaryToNormal(toState, normalState, PRIMARY_STATES_KEYS$1);\n        };\n        Displayable.prototype._applyStateObj = function (stateName, state, normalState, keepCurrentStates, transition, animationCfg) {\n            _super.prototype._applyStateObj.call(this, stateName, state, normalState, keepCurrentStates, transition, animationCfg);\n            var needsRestoreToNormal = !(state && keepCurrentStates);\n            var targetStyle;\n            if (state && state.style) {\n                if (transition) {\n                    if (keepCurrentStates) {\n                        targetStyle = state.style;\n                    }\n                    else {\n                        targetStyle = this._mergeStyle(this.createStyle(), normalState.style);\n                        this._mergeStyle(targetStyle, state.style);\n                    }\n                }\n                else {\n                    targetStyle = this._mergeStyle(this.createStyle(), keepCurrentStates ? this.style : normalState.style);\n                    this._mergeStyle(targetStyle, state.style);\n                }\n            }\n            else if (needsRestoreToNormal) {\n                targetStyle = normalState.style;\n            }\n            if (targetStyle) {\n                if (transition) {\n                    var sourceStyle = this.style;\n                    this.style = this.createStyle(needsRestoreToNormal ? {} : sourceStyle);\n                    if (needsRestoreToNormal) {\n                        var changedKeys = keys(sourceStyle);\n                        for (var i = 0; i < changedKeys.length; i++) {\n                            var key = changedKeys[i];\n                            if (key in targetStyle) {\n                                targetStyle[key] = targetStyle[key];\n                                this.style[key] = sourceStyle[key];\n                            }\n                        }\n                    }\n                    var targetKeys = keys(targetStyle);\n                    for (var i = 0; i < targetKeys.length; i++) {\n                        var key = targetKeys[i];\n                        this.style[key] = this.style[key];\n                    }\n                    this._transitionState(stateName, {\n                        style: targetStyle\n                    }, animationCfg, this.getAnimationStyleProps());\n                }\n                else {\n                    this.useStyle(targetStyle);\n                }\n            }\n            var statesKeys = this.__inHover ? PRIMARY_STATES_KEYS_IN_HOVER_LAYER : PRIMARY_STATES_KEYS$1;\n            for (var i = 0; i < statesKeys.length; i++) {\n                var key = statesKeys[i];\n                if (state && state[key] != null) {\n                    this[key] = state[key];\n                }\n                else if (needsRestoreToNormal) {\n                    if (normalState[key] != null) {\n                        this[key] = normalState[key];\n                    }\n                }\n            }\n        };\n        Displayable.prototype._mergeStates = function (states) {\n            var mergedState = _super.prototype._mergeStates.call(this, states);\n            var mergedStyle;\n            for (var i = 0; i < states.length; i++) {\n                var state = states[i];\n                if (state.style) {\n                    mergedStyle = mergedStyle || {};\n                    this._mergeStyle(mergedStyle, state.style);\n                }\n            }\n            if (mergedStyle) {\n                mergedState.style = mergedStyle;\n            }\n            return mergedState;\n        };\n        Displayable.prototype._mergeStyle = function (targetStyle, sourceStyle) {\n            extend(targetStyle, sourceStyle);\n            return targetStyle;\n        };\n        Displayable.prototype.getAnimationStyleProps = function () {\n            return DEFAULT_COMMON_ANIMATION_PROPS;\n        };\n        Displayable.initDefaultProps = (function () {\n            var dispProto = Displayable.prototype;\n            dispProto.type = 'displayable';\n            dispProto.invisible = false;\n            dispProto.z = 0;\n            dispProto.z2 = 0;\n            dispProto.zlevel = 0;\n            dispProto.culling = false;\n            dispProto.cursor = 'pointer';\n            dispProto.rectHover = false;\n            dispProto.incremental = false;\n            dispProto._rect = null;\n            dispProto.dirtyRectTolerance = 0;\n            dispProto.__dirty = REDRAW_BIT | STYLE_CHANGED_BIT;\n        })();\n        return Displayable;\n    }(Element));\n    var tmpRect$1 = new BoundingRect(0, 0, 0, 0);\n    var viewRect = new BoundingRect(0, 0, 0, 0);\n    function isDisplayableCulled(el, width, height) {\n        tmpRect$1.copy(el.getBoundingRect());\n        if (el.transform) {\n            tmpRect$1.applyTransform(el.transform);\n        }\n        viewRect.width = width;\n        viewRect.height = height;\n        return !tmpRect$1.intersect(viewRect);\n    }\n\n    var mathMin$1 = Math.min;\n    var mathMax$1 = Math.max;\n    var mathSin = Math.sin;\n    var mathCos = Math.cos;\n    var PI2 = Math.PI * 2;\n    var start = create();\n    var end = create();\n    var extremity = create();\n    function fromPoints(points, min, max) {\n        if (points.length === 0) {\n            return;\n        }\n        var p = points[0];\n        var left = p[0];\n        var right = p[0];\n        var top = p[1];\n        var bottom = p[1];\n        for (var i = 1; i < points.length; i++) {\n            p = points[i];\n            left = mathMin$1(left, p[0]);\n            right = mathMax$1(right, p[0]);\n            top = mathMin$1(top, p[1]);\n            bottom = mathMax$1(bottom, p[1]);\n        }\n        min[0] = left;\n        min[1] = top;\n        max[0] = right;\n        max[1] = bottom;\n    }\n    function fromLine(x0, y0, x1, y1, min, max) {\n        min[0] = mathMin$1(x0, x1);\n        min[1] = mathMin$1(y0, y1);\n        max[0] = mathMax$1(x0, x1);\n        max[1] = mathMax$1(y0, y1);\n    }\n    var xDim = [];\n    var yDim = [];\n    function fromCubic(x0, y0, x1, y1, x2, y2, x3, y3, min, max) {\n        var cubicExtrema$1 = cubicExtrema;\n        var cubicAt$1 = cubicAt;\n        var n = cubicExtrema$1(x0, x1, x2, x3, xDim);\n        min[0] = Infinity;\n        min[1] = Infinity;\n        max[0] = -Infinity;\n        max[1] = -Infinity;\n        for (var i = 0; i < n; i++) {\n            var x = cubicAt$1(x0, x1, x2, x3, xDim[i]);\n            min[0] = mathMin$1(x, min[0]);\n            max[0] = mathMax$1(x, max[0]);\n        }\n        n = cubicExtrema$1(y0, y1, y2, y3, yDim);\n        for (var i = 0; i < n; i++) {\n            var y = cubicAt$1(y0, y1, y2, y3, yDim[i]);\n            min[1] = mathMin$1(y, min[1]);\n            max[1] = mathMax$1(y, max[1]);\n        }\n        min[0] = mathMin$1(x0, min[0]);\n        max[0] = mathMax$1(x0, max[0]);\n        min[0] = mathMin$1(x3, min[0]);\n        max[0] = mathMax$1(x3, max[0]);\n        min[1] = mathMin$1(y0, min[1]);\n        max[1] = mathMax$1(y0, max[1]);\n        min[1] = mathMin$1(y3, min[1]);\n        max[1] = mathMax$1(y3, max[1]);\n    }\n    function fromQuadratic(x0, y0, x1, y1, x2, y2, min, max) {\n        var quadraticExtremum$1 = quadraticExtremum;\n        var quadraticAt$1 = quadraticAt;\n        var tx = mathMax$1(mathMin$1(quadraticExtremum$1(x0, x1, x2), 1), 0);\n        var ty = mathMax$1(mathMin$1(quadraticExtremum$1(y0, y1, y2), 1), 0);\n        var x = quadraticAt$1(x0, x1, x2, tx);\n        var y = quadraticAt$1(y0, y1, y2, ty);\n        min[0] = mathMin$1(x0, x2, x);\n        min[1] = mathMin$1(y0, y2, y);\n        max[0] = mathMax$1(x0, x2, x);\n        max[1] = mathMax$1(y0, y2, y);\n    }\n    function fromArc(x, y, rx, ry, startAngle, endAngle, anticlockwise, min$1, max$1) {\n        var vec2Min = min;\n        var vec2Max = max;\n        var diff = Math.abs(startAngle - endAngle);\n        if (diff % PI2 < 1e-4 && diff > 1e-4) {\n            min$1[0] = x - rx;\n            min$1[1] = y - ry;\n            max$1[0] = x + rx;\n            max$1[1] = y + ry;\n            return;\n        }\n        start[0] = mathCos(startAngle) * rx + x;\n        start[1] = mathSin(startAngle) * ry + y;\n        end[0] = mathCos(endAngle) * rx + x;\n        end[1] = mathSin(endAngle) * ry + y;\n        vec2Min(min$1, start, end);\n        vec2Max(max$1, start, end);\n        startAngle = startAngle % (PI2);\n        if (startAngle < 0) {\n            startAngle = startAngle + PI2;\n        }\n        endAngle = endAngle % (PI2);\n        if (endAngle < 0) {\n            endAngle = endAngle + PI2;\n        }\n        if (startAngle > endAngle && !anticlockwise) {\n            endAngle += PI2;\n        }\n        else if (startAngle < endAngle && anticlockwise) {\n            startAngle += PI2;\n        }\n        if (anticlockwise) {\n            var tmp = endAngle;\n            endAngle = startAngle;\n            startAngle = tmp;\n        }\n        for (var angle = 0; angle < endAngle; angle += Math.PI / 2) {\n            if (angle > startAngle) {\n                extremity[0] = mathCos(angle) * rx + x;\n                extremity[1] = mathSin(angle) * ry + y;\n                vec2Min(min$1, extremity, min$1);\n                vec2Max(max$1, extremity, max$1);\n            }\n        }\n    }\n\n    var CMD = {\n        M: 1,\n        L: 2,\n        C: 3,\n        Q: 4,\n        A: 5,\n        Z: 6,\n        R: 7\n    };\n    var tmpOutX = [];\n    var tmpOutY = [];\n    var min$1 = [];\n    var max$1 = [];\n    var min2 = [];\n    var max2 = [];\n    var mathMin$2 = Math.min;\n    var mathMax$2 = Math.max;\n    var mathCos$1 = Math.cos;\n    var mathSin$1 = Math.sin;\n    var mathAbs = Math.abs;\n    var PI = Math.PI;\n    var PI2$1 = PI * 2;\n    var hasTypedArray = typeof Float32Array !== 'undefined';\n    var tmpAngles = [];\n    function modPI2(radian) {\n        var n = Math.round(radian / PI * 1e8) / 1e8;\n        return (n % 2) * PI;\n    }\n    function normalizeArcAngles(angles, anticlockwise) {\n        var newStartAngle = modPI2(angles[0]);\n        if (newStartAngle < 0) {\n            newStartAngle += PI2$1;\n        }\n        var delta = newStartAngle - angles[0];\n        var newEndAngle = angles[1];\n        newEndAngle += delta;\n        if (!anticlockwise && newEndAngle - newStartAngle >= PI2$1) {\n            newEndAngle = newStartAngle + PI2$1;\n        }\n        else if (anticlockwise && newStartAngle - newEndAngle >= PI2$1) {\n            newEndAngle = newStartAngle - PI2$1;\n        }\n        else if (!anticlockwise && newStartAngle > newEndAngle) {\n            newEndAngle = newStartAngle + (PI2$1 - modPI2(newStartAngle - newEndAngle));\n        }\n        else if (anticlockwise && newStartAngle < newEndAngle) {\n            newEndAngle = newStartAngle - (PI2$1 - modPI2(newEndAngle - newStartAngle));\n        }\n        angles[0] = newStartAngle;\n        angles[1] = newEndAngle;\n    }\n    var PathProxy = (function () {\n        function PathProxy(notSaveData) {\n            this.dpr = 1;\n            this._xi = 0;\n            this._yi = 0;\n            this._x0 = 0;\n            this._y0 = 0;\n            this._len = 0;\n            if (notSaveData) {\n                this._saveData = false;\n            }\n            if (this._saveData) {\n                this.data = [];\n            }\n        }\n        PathProxy.prototype.increaseVersion = function () {\n            this._version++;\n        };\n        PathProxy.prototype.getVersion = function () {\n            return this._version;\n        };\n        PathProxy.prototype.setScale = function (sx, sy, segmentIgnoreThreshold) {\n            segmentIgnoreThreshold = segmentIgnoreThreshold || 0;\n            if (segmentIgnoreThreshold > 0) {\n                this._ux = mathAbs(segmentIgnoreThreshold / devicePixelRatio / sx) || 0;\n                this._uy = mathAbs(segmentIgnoreThreshold / devicePixelRatio / sy) || 0;\n            }\n        };\n        PathProxy.prototype.setDPR = function (dpr) {\n            this.dpr = dpr;\n        };\n        PathProxy.prototype.setContext = function (ctx) {\n            this._ctx = ctx;\n        };\n        PathProxy.prototype.getContext = function () {\n            return this._ctx;\n        };\n        PathProxy.prototype.beginPath = function () {\n            this._ctx && this._ctx.beginPath();\n            this.reset();\n            return this;\n        };\n        PathProxy.prototype.reset = function () {\n            if (this._saveData) {\n                this._len = 0;\n            }\n            if (this._pathSegLen) {\n                this._pathSegLen = null;\n                this._pathLen = 0;\n            }\n            this._version++;\n        };\n        PathProxy.prototype.moveTo = function (x, y) {\n            this._drawPendingPt();\n            this.addData(CMD.M, x, y);\n            this._ctx && this._ctx.moveTo(x, y);\n            this._x0 = x;\n            this._y0 = y;\n            this._xi = x;\n            this._yi = y;\n            return this;\n        };\n        PathProxy.prototype.lineTo = function (x, y) {\n            var dx = mathAbs(x - this._xi);\n            var dy = mathAbs(y - this._yi);\n            var exceedUnit = dx > this._ux || dy > this._uy;\n            this.addData(CMD.L, x, y);\n            if (this._ctx && exceedUnit) {\n                this._ctx.lineTo(x, y);\n            }\n            if (exceedUnit) {\n                this._xi = x;\n                this._yi = y;\n                this._pendingPtDist = 0;\n            }\n            else {\n                var d2 = dx * dx + dy * dy;\n                if (d2 > this._pendingPtDist) {\n                    this._pendingPtX = x;\n                    this._pendingPtY = y;\n                    this._pendingPtDist = d2;\n                }\n            }\n            return this;\n        };\n        PathProxy.prototype.bezierCurveTo = function (x1, y1, x2, y2, x3, y3) {\n            this._drawPendingPt();\n            this.addData(CMD.C, x1, y1, x2, y2, x3, y3);\n            if (this._ctx) {\n                this._ctx.bezierCurveTo(x1, y1, x2, y2, x3, y3);\n            }\n            this._xi = x3;\n            this._yi = y3;\n            return this;\n        };\n        PathProxy.prototype.quadraticCurveTo = function (x1, y1, x2, y2) {\n            this._drawPendingPt();\n            this.addData(CMD.Q, x1, y1, x2, y2);\n            if (this._ctx) {\n                this._ctx.quadraticCurveTo(x1, y1, x2, y2);\n            }\n            this._xi = x2;\n            this._yi = y2;\n            return this;\n        };\n        PathProxy.prototype.arc = function (cx, cy, r, startAngle, endAngle, anticlockwise) {\n            this._drawPendingPt();\n            tmpAngles[0] = startAngle;\n            tmpAngles[1] = endAngle;\n            normalizeArcAngles(tmpAngles, anticlockwise);\n            startAngle = tmpAngles[0];\n            endAngle = tmpAngles[1];\n            var delta = endAngle - startAngle;\n            this.addData(CMD.A, cx, cy, r, r, startAngle, delta, 0, anticlockwise ? 0 : 1);\n            this._ctx && this._ctx.arc(cx, cy, r, startAngle, endAngle, anticlockwise);\n            this._xi = mathCos$1(endAngle) * r + cx;\n            this._yi = mathSin$1(endAngle) * r + cy;\n            return this;\n        };\n        PathProxy.prototype.arcTo = function (x1, y1, x2, y2, radius) {\n            this._drawPendingPt();\n            if (this._ctx) {\n                this._ctx.arcTo(x1, y1, x2, y2, radius);\n            }\n            return this;\n        };\n        PathProxy.prototype.rect = function (x, y, w, h) {\n            this._drawPendingPt();\n            this._ctx && this._ctx.rect(x, y, w, h);\n            this.addData(CMD.R, x, y, w, h);\n            return this;\n        };\n        PathProxy.prototype.closePath = function () {\n            this._drawPendingPt();\n            this.addData(CMD.Z);\n            var ctx = this._ctx;\n            var x0 = this._x0;\n            var y0 = this._y0;\n            if (ctx) {\n                ctx.closePath();\n            }\n            this._xi = x0;\n            this._yi = y0;\n            return this;\n        };\n        PathProxy.prototype.fill = function (ctx) {\n            ctx && ctx.fill();\n            this.toStatic();\n        };\n        PathProxy.prototype.stroke = function (ctx) {\n            ctx && ctx.stroke();\n            this.toStatic();\n        };\n        PathProxy.prototype.len = function () {\n            return this._len;\n        };\n        PathProxy.prototype.setData = function (data) {\n            var len = data.length;\n            if (!(this.data && this.data.length === len) && hasTypedArray) {\n                this.data = new Float32Array(len);\n            }\n            for (var i = 0; i < len; i++) {\n                this.data[i] = data[i];\n            }\n            this._len = len;\n        };\n        PathProxy.prototype.appendPath = function (path) {\n            if (!(path instanceof Array)) {\n                path = [path];\n            }\n            var len = path.length;\n            var appendSize = 0;\n            var offset = this._len;\n            for (var i = 0; i < len; i++) {\n                appendSize += path[i].len();\n            }\n            if (hasTypedArray && (this.data instanceof Float32Array)) {\n                this.data = new Float32Array(offset + appendSize);\n            }\n            for (var i = 0; i < len; i++) {\n                var appendPathData = path[i].data;\n                for (var k = 0; k < appendPathData.length; k++) {\n                    this.data[offset++] = appendPathData[k];\n                }\n            }\n            this._len = offset;\n        };\n        PathProxy.prototype.addData = function (cmd, a, b, c, d, e, f, g, h) {\n            if (!this._saveData) {\n                return;\n            }\n            var data = this.data;\n            if (this._len + arguments.length > data.length) {\n                this._expandData();\n                data = this.data;\n            }\n            for (var i = 0; i < arguments.length; i++) {\n                data[this._len++] = arguments[i];\n            }\n        };\n        PathProxy.prototype._drawPendingPt = function () {\n            if (this._pendingPtDist > 0) {\n                this._ctx && this._ctx.lineTo(this._pendingPtX, this._pendingPtY);\n                this._pendingPtDist = 0;\n            }\n        };\n        PathProxy.prototype._expandData = function () {\n            if (!(this.data instanceof Array)) {\n                var newData = [];\n                for (var i = 0; i < this._len; i++) {\n                    newData[i] = this.data[i];\n                }\n                this.data = newData;\n            }\n        };\n        PathProxy.prototype.toStatic = function () {\n            if (!this._saveData) {\n                return;\n            }\n            this._drawPendingPt();\n            var data = this.data;\n            if (data instanceof Array) {\n                data.length = this._len;\n                if (hasTypedArray && this._len > 11) {\n                    this.data = new Float32Array(data);\n                }\n            }\n        };\n        PathProxy.prototype.getBoundingRect = function () {\n            min$1[0] = min$1[1] = min2[0] = min2[1] = Number.MAX_VALUE;\n            max$1[0] = max$1[1] = max2[0] = max2[1] = -Number.MAX_VALUE;\n            var data = this.data;\n            var xi = 0;\n            var yi = 0;\n            var x0 = 0;\n            var y0 = 0;\n            var i;\n            for (i = 0; i < this._len;) {\n                var cmd = data[i++];\n                var isFirst = i === 1;\n                if (isFirst) {\n                    xi = data[i];\n                    yi = data[i + 1];\n                    x0 = xi;\n                    y0 = yi;\n                }\n                switch (cmd) {\n                    case CMD.M:\n                        xi = x0 = data[i++];\n                        yi = y0 = data[i++];\n                        min2[0] = x0;\n                        min2[1] = y0;\n                        max2[0] = x0;\n                        max2[1] = y0;\n                        break;\n                    case CMD.L:\n                        fromLine(xi, yi, data[i], data[i + 1], min2, max2);\n                        xi = data[i++];\n                        yi = data[i++];\n                        break;\n                    case CMD.C:\n                        fromCubic(xi, yi, data[i++], data[i++], data[i++], data[i++], data[i], data[i + 1], min2, max2);\n                        xi = data[i++];\n                        yi = data[i++];\n                        break;\n                    case CMD.Q:\n                        fromQuadratic(xi, yi, data[i++], data[i++], data[i], data[i + 1], min2, max2);\n                        xi = data[i++];\n                        yi = data[i++];\n                        break;\n                    case CMD.A:\n                        var cx = data[i++];\n                        var cy = data[i++];\n                        var rx = data[i++];\n                        var ry = data[i++];\n                        var startAngle = data[i++];\n                        var endAngle = data[i++] + startAngle;\n                        i += 1;\n                        var anticlockwise = !data[i++];\n                        if (isFirst) {\n                            x0 = mathCos$1(startAngle) * rx + cx;\n                            y0 = mathSin$1(startAngle) * ry + cy;\n                        }\n                        fromArc(cx, cy, rx, ry, startAngle, endAngle, anticlockwise, min2, max2);\n                        xi = mathCos$1(endAngle) * rx + cx;\n                        yi = mathSin$1(endAngle) * ry + cy;\n                        break;\n                    case CMD.R:\n                        x0 = xi = data[i++];\n                        y0 = yi = data[i++];\n                        var width = data[i++];\n                        var height = data[i++];\n                        fromLine(x0, y0, x0 + width, y0 + height, min2, max2);\n                        break;\n                    case CMD.Z:\n                        xi = x0;\n                        yi = y0;\n                        break;\n                }\n                min(min$1, min$1, min2);\n                max(max$1, max$1, max2);\n            }\n            if (i === 0) {\n                min$1[0] = min$1[1] = max$1[0] = max$1[1] = 0;\n            }\n            return new BoundingRect(min$1[0], min$1[1], max$1[0] - min$1[0], max$1[1] - min$1[1]);\n        };\n        PathProxy.prototype._calculateLength = function () {\n            var data = this.data;\n            var len = this._len;\n            var ux = this._ux;\n            var uy = this._uy;\n            var xi = 0;\n            var yi = 0;\n            var x0 = 0;\n            var y0 = 0;\n            if (!this._pathSegLen) {\n                this._pathSegLen = [];\n            }\n            var pathSegLen = this._pathSegLen;\n            var pathTotalLen = 0;\n            var segCount = 0;\n            for (var i = 0; i < len;) {\n                var cmd = data[i++];\n                var isFirst = i === 1;\n                if (isFirst) {\n                    xi = data[i];\n                    yi = data[i + 1];\n                    x0 = xi;\n                    y0 = yi;\n                }\n                var l = -1;\n                switch (cmd) {\n                    case CMD.M:\n                        xi = x0 = data[i++];\n                        yi = y0 = data[i++];\n                        break;\n                    case CMD.L: {\n                        var x2 = data[i++];\n                        var y2 = data[i++];\n                        var dx = x2 - xi;\n                        var dy = y2 - yi;\n                        if (mathAbs(dx) > ux || mathAbs(dy) > uy || i === len - 1) {\n                            l = Math.sqrt(dx * dx + dy * dy);\n                            xi = x2;\n                            yi = y2;\n                        }\n                        break;\n                    }\n                    case CMD.C: {\n                        var x1 = data[i++];\n                        var y1 = data[i++];\n                        var x2 = data[i++];\n                        var y2 = data[i++];\n                        var x3 = data[i++];\n                        var y3 = data[i++];\n                        l = cubicLength(xi, yi, x1, y1, x2, y2, x3, y3, 10);\n                        xi = x3;\n                        yi = y3;\n                        break;\n                    }\n                    case CMD.Q: {\n                        var x1 = data[i++];\n                        var y1 = data[i++];\n                        var x2 = data[i++];\n                        var y2 = data[i++];\n                        l = quadraticLength(xi, yi, x1, y1, x2, y2, 10);\n                        xi = x2;\n                        yi = y2;\n                        break;\n                    }\n                    case CMD.A:\n                        var cx = data[i++];\n                        var cy = data[i++];\n                        var rx = data[i++];\n                        var ry = data[i++];\n                        var startAngle = data[i++];\n                        var delta = data[i++];\n                        var endAngle = delta + startAngle;\n                        i += 1;\n                        if (isFirst) {\n                            x0 = mathCos$1(startAngle) * rx + cx;\n                            y0 = mathSin$1(startAngle) * ry + cy;\n                        }\n                        l = mathMax$2(rx, ry) * mathMin$2(PI2$1, Math.abs(delta));\n                        xi = mathCos$1(endAngle) * rx + cx;\n                        yi = mathSin$1(endAngle) * ry + cy;\n                        break;\n                    case CMD.R: {\n                        x0 = xi = data[i++];\n                        y0 = yi = data[i++];\n                        var width = data[i++];\n                        var height = data[i++];\n                        l = width * 2 + height * 2;\n                        break;\n                    }\n                    case CMD.Z: {\n                        var dx = x0 - xi;\n                        var dy = y0 - yi;\n                        l = Math.sqrt(dx * dx + dy * dy);\n                        xi = x0;\n                        yi = y0;\n                        break;\n                    }\n                }\n                if (l >= 0) {\n                    pathSegLen[segCount++] = l;\n                    pathTotalLen += l;\n                }\n            }\n            this._pathLen = pathTotalLen;\n            return pathTotalLen;\n        };\n        PathProxy.prototype.rebuildPath = function (ctx, percent) {\n            var d = this.data;\n            var ux = this._ux;\n            var uy = this._uy;\n            var len = this._len;\n            var x0;\n            var y0;\n            var xi;\n            var yi;\n            var x;\n            var y;\n            var drawPart = percent < 1;\n            var pathSegLen;\n            var pathTotalLen;\n            var accumLength = 0;\n            var segCount = 0;\n            var displayedLength;\n            var pendingPtDist = 0;\n            var pendingPtX;\n            var pendingPtY;\n            if (drawPart) {\n                if (!this._pathSegLen) {\n                    this._calculateLength();\n                }\n                pathSegLen = this._pathSegLen;\n                pathTotalLen = this._pathLen;\n                displayedLength = percent * pathTotalLen;\n                if (!displayedLength) {\n                    return;\n                }\n            }\n            lo: for (var i = 0; i < len;) {\n                var cmd = d[i++];\n                var isFirst = i === 1;\n                if (isFirst) {\n                    xi = d[i];\n                    yi = d[i + 1];\n                    x0 = xi;\n                    y0 = yi;\n                }\n                if (cmd !== CMD.L && pendingPtDist > 0) {\n                    ctx.lineTo(pendingPtX, pendingPtY);\n                    pendingPtDist = 0;\n                }\n                switch (cmd) {\n                    case CMD.M:\n                        x0 = xi = d[i++];\n                        y0 = yi = d[i++];\n                        ctx.moveTo(xi, yi);\n                        break;\n                    case CMD.L: {\n                        x = d[i++];\n                        y = d[i++];\n                        var dx = mathAbs(x - xi);\n                        var dy = mathAbs(y - yi);\n                        if (dx > ux || dy > uy) {\n                            if (drawPart) {\n                                var l = pathSegLen[segCount++];\n                                if (accumLength + l > displayedLength) {\n                                    var t = (displayedLength - accumLength) / l;\n                                    ctx.lineTo(xi * (1 - t) + x * t, yi * (1 - t) + y * t);\n                                    break lo;\n                                }\n                                accumLength += l;\n                            }\n                            ctx.lineTo(x, y);\n                            xi = x;\n                            yi = y;\n                            pendingPtDist = 0;\n                        }\n                        else {\n                            var d2 = dx * dx + dy * dy;\n                            if (d2 > pendingPtDist) {\n                                pendingPtX = x;\n                                pendingPtY = y;\n                                pendingPtDist = d2;\n                            }\n                        }\n                        break;\n                    }\n                    case CMD.C: {\n                        var x1 = d[i++];\n                        var y1 = d[i++];\n                        var x2 = d[i++];\n                        var y2 = d[i++];\n                        var x3 = d[i++];\n                        var y3 = d[i++];\n                        if (drawPart) {\n                            var l = pathSegLen[segCount++];\n                            if (accumLength + l > displayedLength) {\n                                var t = (displayedLength - accumLength) / l;\n                                cubicSubdivide(xi, x1, x2, x3, t, tmpOutX);\n                                cubicSubdivide(yi, y1, y2, y3, t, tmpOutY);\n                                ctx.bezierCurveTo(tmpOutX[1], tmpOutY[1], tmpOutX[2], tmpOutY[2], tmpOutX[3], tmpOutY[3]);\n                                break lo;\n                            }\n                            accumLength += l;\n                        }\n                        ctx.bezierCurveTo(x1, y1, x2, y2, x3, y3);\n                        xi = x3;\n                        yi = y3;\n                        break;\n                    }\n                    case CMD.Q: {\n                        var x1 = d[i++];\n                        var y1 = d[i++];\n                        var x2 = d[i++];\n                        var y2 = d[i++];\n                        if (drawPart) {\n                            var l = pathSegLen[segCount++];\n                            if (accumLength + l > displayedLength) {\n                                var t = (displayedLength - accumLength) / l;\n                                quadraticSubdivide(xi, x1, x2, t, tmpOutX);\n                                quadraticSubdivide(yi, y1, y2, t, tmpOutY);\n                                ctx.quadraticCurveTo(tmpOutX[1], tmpOutY[1], tmpOutX[2], tmpOutY[2]);\n                                break lo;\n                            }\n                            accumLength += l;\n                        }\n                        ctx.quadraticCurveTo(x1, y1, x2, y2);\n                        xi = x2;\n                        yi = y2;\n                        break;\n                    }\n                    case CMD.A:\n                        var cx = d[i++];\n                        var cy = d[i++];\n                        var rx = d[i++];\n                        var ry = d[i++];\n                        var startAngle = d[i++];\n                        var delta = d[i++];\n                        var psi = d[i++];\n                        var anticlockwise = !d[i++];\n                        var r = (rx > ry) ? rx : ry;\n                        var isEllipse = mathAbs(rx - ry) > 1e-3;\n                        var endAngle = startAngle + delta;\n                        var breakBuild = false;\n                        if (drawPart) {\n                            var l = pathSegLen[segCount++];\n                            if (accumLength + l > displayedLength) {\n                                endAngle = startAngle + delta * (displayedLength - accumLength) / l;\n                                breakBuild = true;\n                            }\n                            accumLength += l;\n                        }\n                        if (isEllipse && ctx.ellipse) {\n                            ctx.ellipse(cx, cy, rx, ry, psi, startAngle, endAngle, anticlockwise);\n                        }\n                        else {\n                            ctx.arc(cx, cy, r, startAngle, endAngle, anticlockwise);\n                        }\n                        if (breakBuild) {\n                            break lo;\n                        }\n                        if (isFirst) {\n                            x0 = mathCos$1(startAngle) * rx + cx;\n                            y0 = mathSin$1(startAngle) * ry + cy;\n                        }\n                        xi = mathCos$1(endAngle) * rx + cx;\n                        yi = mathSin$1(endAngle) * ry + cy;\n                        break;\n                    case CMD.R:\n                        x0 = xi = d[i];\n                        y0 = yi = d[i + 1];\n                        x = d[i++];\n                        y = d[i++];\n                        var width = d[i++];\n                        var height = d[i++];\n                        if (drawPart) {\n                            var l = pathSegLen[segCount++];\n                            if (accumLength + l > displayedLength) {\n                                var d_1 = displayedLength - accumLength;\n                                ctx.moveTo(x, y);\n                                ctx.lineTo(x + mathMin$2(d_1, width), y);\n                                d_1 -= width;\n                                if (d_1 > 0) {\n                                    ctx.lineTo(x + width, y + mathMin$2(d_1, height));\n                                }\n                                d_1 -= height;\n                                if (d_1 > 0) {\n                                    ctx.lineTo(x + mathMax$2(width - d_1, 0), y + height);\n                                }\n                                d_1 -= width;\n                                if (d_1 > 0) {\n                                    ctx.lineTo(x, y + mathMax$2(height - d_1, 0));\n                                }\n                                break lo;\n                            }\n                            accumLength += l;\n                        }\n                        ctx.rect(x, y, width, height);\n                        break;\n                    case CMD.Z:\n                        if (drawPart) {\n                            var l = pathSegLen[segCount++];\n                            if (accumLength + l > displayedLength) {\n                                var t = (displayedLength - accumLength) / l;\n                                ctx.lineTo(xi * (1 - t) + x0 * t, yi * (1 - t) + y0 * t);\n                                break lo;\n                            }\n                            accumLength += l;\n                        }\n                        ctx.closePath();\n                        xi = x0;\n                        yi = y0;\n                }\n            }\n        };\n        PathProxy.prototype.clone = function () {\n            var newProxy = new PathProxy();\n            var data = this.data;\n            newProxy.data = data.slice ? data.slice()\n                : Array.prototype.slice.call(data);\n            newProxy._len = this._len;\n            return newProxy;\n        };\n        PathProxy.CMD = CMD;\n        PathProxy.initDefaultProps = (function () {\n            var proto = PathProxy.prototype;\n            proto._saveData = true;\n            proto._ux = 0;\n            proto._uy = 0;\n            proto._pendingPtDist = 0;\n            proto._version = 0;\n        })();\n        return PathProxy;\n    }());\n\n    function containStroke(x0, y0, x1, y1, lineWidth, x, y) {\n        if (lineWidth === 0) {\n            return false;\n        }\n        var _l = lineWidth;\n        var _a = 0;\n        var _b = x0;\n        if ((y > y0 + _l && y > y1 + _l)\n            || (y < y0 - _l && y < y1 - _l)\n            || (x > x0 + _l && x > x1 + _l)\n            || (x < x0 - _l && x < x1 - _l)) {\n            return false;\n        }\n        if (x0 !== x1) {\n            _a = (y0 - y1) / (x0 - x1);\n            _b = (x0 * y1 - x1 * y0) / (x0 - x1);\n        }\n        else {\n            return Math.abs(x - x0) <= _l / 2;\n        }\n        var tmp = _a * x - y + _b;\n        var _s = tmp * tmp / (_a * _a + 1);\n        return _s <= _l / 2 * _l / 2;\n    }\n\n    function containStroke$1(x0, y0, x1, y1, x2, y2, x3, y3, lineWidth, x, y) {\n        if (lineWidth === 0) {\n            return false;\n        }\n        var _l = lineWidth;\n        if ((y > y0 + _l && y > y1 + _l && y > y2 + _l && y > y3 + _l)\n            || (y < y0 - _l && y < y1 - _l && y < y2 - _l && y < y3 - _l)\n            || (x > x0 + _l && x > x1 + _l && x > x2 + _l && x > x3 + _l)\n            || (x < x0 - _l && x < x1 - _l && x < x2 - _l && x < x3 - _l)) {\n            return false;\n        }\n        var d = cubicProjectPoint(x0, y0, x1, y1, x2, y2, x3, y3, x, y, null);\n        return d <= _l / 2;\n    }\n\n    function containStroke$2(x0, y0, x1, y1, x2, y2, lineWidth, x, y) {\n        if (lineWidth === 0) {\n            return false;\n        }\n        var _l = lineWidth;\n        if ((y > y0 + _l && y > y1 + _l && y > y2 + _l)\n            || (y < y0 - _l && y < y1 - _l && y < y2 - _l)\n            || (x > x0 + _l && x > x1 + _l && x > x2 + _l)\n            || (x < x0 - _l && x < x1 - _l && x < x2 - _l)) {\n            return false;\n        }\n        var d = quadraticProjectPoint(x0, y0, x1, y1, x2, y2, x, y, null);\n        return d <= _l / 2;\n    }\n\n    var PI2$2 = Math.PI * 2;\n    function normalizeRadian(angle) {\n        angle %= PI2$2;\n        if (angle < 0) {\n            angle += PI2$2;\n        }\n        return angle;\n    }\n\n    var PI2$3 = Math.PI * 2;\n    function containStroke$3(cx, cy, r, startAngle, endAngle, anticlockwise, lineWidth, x, y) {\n        if (lineWidth === 0) {\n            return false;\n        }\n        var _l = lineWidth;\n        x -= cx;\n        y -= cy;\n        var d = Math.sqrt(x * x + y * y);\n        if ((d - _l > r) || (d + _l < r)) {\n            return false;\n        }\n        if (Math.abs(startAngle - endAngle) % PI2$3 < 1e-4) {\n            return true;\n        }\n        if (anticlockwise) {\n            var tmp = startAngle;\n            startAngle = normalizeRadian(endAngle);\n            endAngle = normalizeRadian(tmp);\n        }\n        else {\n            startAngle = normalizeRadian(startAngle);\n            endAngle = normalizeRadian(endAngle);\n        }\n        if (startAngle > endAngle) {\n            endAngle += PI2$3;\n        }\n        var angle = Math.atan2(y, x);\n        if (angle < 0) {\n            angle += PI2$3;\n        }\n        return (angle >= startAngle && angle <= endAngle)\n            || (angle + PI2$3 >= startAngle && angle + PI2$3 <= endAngle);\n    }\n\n    function windingLine(x0, y0, x1, y1, x, y) {\n        if ((y > y0 && y > y1) || (y < y0 && y < y1)) {\n            return 0;\n        }\n        if (y1 === y0) {\n            return 0;\n        }\n        var t = (y - y0) / (y1 - y0);\n        var dir = y1 < y0 ? 1 : -1;\n        if (t === 1 || t === 0) {\n            dir = y1 < y0 ? 0.5 : -0.5;\n        }\n        var x_ = t * (x1 - x0) + x0;\n        return x_ === x ? Infinity : x_ > x ? dir : 0;\n    }\n\n    var CMD$1 = PathProxy.CMD;\n    var PI2$4 = Math.PI * 2;\n    var EPSILON$3 = 1e-4;\n    function isAroundEqual(a, b) {\n        return Math.abs(a - b) < EPSILON$3;\n    }\n    var roots = [-1, -1, -1];\n    var extrema = [-1, -1];\n    function swapExtrema() {\n        var tmp = extrema[0];\n        extrema[0] = extrema[1];\n        extrema[1] = tmp;\n    }\n    function windingCubic(x0, y0, x1, y1, x2, y2, x3, y3, x, y) {\n        if ((y > y0 && y > y1 && y > y2 && y > y3)\n            || (y < y0 && y < y1 && y < y2 && y < y3)) {\n            return 0;\n        }\n        var nRoots = cubicRootAt(y0, y1, y2, y3, y, roots);\n        if (nRoots === 0) {\n            return 0;\n        }\n        else {\n            var w = 0;\n            var nExtrema = -1;\n            var y0_ = void 0;\n            var y1_ = void 0;\n            for (var i = 0; i < nRoots; i++) {\n                var t = roots[i];\n                var unit = (t === 0 || t === 1) ? 0.5 : 1;\n                var x_ = cubicAt(x0, x1, x2, x3, t);\n                if (x_ < x) {\n                    continue;\n                }\n                if (nExtrema < 0) {\n                    nExtrema = cubicExtrema(y0, y1, y2, y3, extrema);\n                    if (extrema[1] < extrema[0] && nExtrema > 1) {\n                        swapExtrema();\n                    }\n                    y0_ = cubicAt(y0, y1, y2, y3, extrema[0]);\n                    if (nExtrema > 1) {\n                        y1_ = cubicAt(y0, y1, y2, y3, extrema[1]);\n                    }\n                }\n                if (nExtrema === 2) {\n                    if (t < extrema[0]) {\n                        w += y0_ < y0 ? unit : -unit;\n                    }\n                    else if (t < extrema[1]) {\n                        w += y1_ < y0_ ? unit : -unit;\n                    }\n                    else {\n                        w += y3 < y1_ ? unit : -unit;\n                    }\n                }\n                else {\n                    if (t < extrema[0]) {\n                        w += y0_ < y0 ? unit : -unit;\n                    }\n                    else {\n                        w += y3 < y0_ ? unit : -unit;\n                    }\n                }\n            }\n            return w;\n        }\n    }\n    function windingQuadratic(x0, y0, x1, y1, x2, y2, x, y) {\n        if ((y > y0 && y > y1 && y > y2)\n            || (y < y0 && y < y1 && y < y2)) {\n            return 0;\n        }\n        var nRoots = quadraticRootAt(y0, y1, y2, y, roots);\n        if (nRoots === 0) {\n            return 0;\n        }\n        else {\n            var t = quadraticExtremum(y0, y1, y2);\n            if (t >= 0 && t <= 1) {\n                var w = 0;\n                var y_ = quadraticAt(y0, y1, y2, t);\n                for (var i = 0; i < nRoots; i++) {\n                    var unit = (roots[i] === 0 || roots[i] === 1) ? 0.5 : 1;\n                    var x_ = quadraticAt(x0, x1, x2, roots[i]);\n                    if (x_ < x) {\n                        continue;\n                    }\n                    if (roots[i] < t) {\n                        w += y_ < y0 ? unit : -unit;\n                    }\n                    else {\n                        w += y2 < y_ ? unit : -unit;\n                    }\n                }\n                return w;\n            }\n            else {\n                var unit = (roots[0] === 0 || roots[0] === 1) ? 0.5 : 1;\n                var x_ = quadraticAt(x0, x1, x2, roots[0]);\n                if (x_ < x) {\n                    return 0;\n                }\n                return y2 < y0 ? unit : -unit;\n            }\n        }\n    }\n    function windingArc(cx, cy, r, startAngle, endAngle, anticlockwise, x, y) {\n        y -= cy;\n        if (y > r || y < -r) {\n            return 0;\n        }\n        var tmp = Math.sqrt(r * r - y * y);\n        roots[0] = -tmp;\n        roots[1] = tmp;\n        var dTheta = Math.abs(startAngle - endAngle);\n        if (dTheta < 1e-4) {\n            return 0;\n        }\n        if (dTheta >= PI2$4 - 1e-4) {\n            startAngle = 0;\n            endAngle = PI2$4;\n            var dir = anticlockwise ? 1 : -1;\n            if (x >= roots[0] + cx && x <= roots[1] + cx) {\n                return dir;\n            }\n            else {\n                return 0;\n            }\n        }\n        if (startAngle > endAngle) {\n            var tmp_1 = startAngle;\n            startAngle = endAngle;\n            endAngle = tmp_1;\n        }\n        if (startAngle < 0) {\n            startAngle += PI2$4;\n            endAngle += PI2$4;\n        }\n        var w = 0;\n        for (var i = 0; i < 2; i++) {\n            var x_ = roots[i];\n            if (x_ + cx > x) {\n                var angle = Math.atan2(y, x_);\n                var dir = anticlockwise ? 1 : -1;\n                if (angle < 0) {\n                    angle = PI2$4 + angle;\n                }\n                if ((angle >= startAngle && angle <= endAngle)\n                    || (angle + PI2$4 >= startAngle && angle + PI2$4 <= endAngle)) {\n                    if (angle > Math.PI / 2 && angle < Math.PI * 1.5) {\n                        dir = -dir;\n                    }\n                    w += dir;\n                }\n            }\n        }\n        return w;\n    }\n    function containPath(path, lineWidth, isStroke, x, y) {\n        var data = path.data;\n        var len = path.len();\n        var w = 0;\n        var xi = 0;\n        var yi = 0;\n        var x0 = 0;\n        var y0 = 0;\n        var x1;\n        var y1;\n        for (var i = 0; i < len;) {\n            var cmd = data[i++];\n            var isFirst = i === 1;\n            if (cmd === CMD$1.M && i > 1) {\n                if (!isStroke) {\n                    w += windingLine(xi, yi, x0, y0, x, y);\n                }\n            }\n            if (isFirst) {\n                xi = data[i];\n                yi = data[i + 1];\n                x0 = xi;\n                y0 = yi;\n            }\n            switch (cmd) {\n                case CMD$1.M:\n                    x0 = data[i++];\n                    y0 = data[i++];\n                    xi = x0;\n                    yi = y0;\n                    break;\n                case CMD$1.L:\n                    if (isStroke) {\n                        if (containStroke(xi, yi, data[i], data[i + 1], lineWidth, x, y)) {\n                            return true;\n                        }\n                    }\n                    else {\n                        w += windingLine(xi, yi, data[i], data[i + 1], x, y) || 0;\n                    }\n                    xi = data[i++];\n                    yi = data[i++];\n                    break;\n                case CMD$1.C:\n                    if (isStroke) {\n                        if (containStroke$1(xi, yi, data[i++], data[i++], data[i++], data[i++], data[i], data[i + 1], lineWidth, x, y)) {\n                            return true;\n                        }\n                    }\n                    else {\n                        w += windingCubic(xi, yi, data[i++], data[i++], data[i++], data[i++], data[i], data[i + 1], x, y) || 0;\n                    }\n                    xi = data[i++];\n                    yi = data[i++];\n                    break;\n                case CMD$1.Q:\n                    if (isStroke) {\n                        if (containStroke$2(xi, yi, data[i++], data[i++], data[i], data[i + 1], lineWidth, x, y)) {\n                            return true;\n                        }\n                    }\n                    else {\n                        w += windingQuadratic(xi, yi, data[i++], data[i++], data[i], data[i + 1], x, y) || 0;\n                    }\n                    xi = data[i++];\n                    yi = data[i++];\n                    break;\n                case CMD$1.A:\n                    var cx = data[i++];\n                    var cy = data[i++];\n                    var rx = data[i++];\n                    var ry = data[i++];\n                    var theta = data[i++];\n                    var dTheta = data[i++];\n                    i += 1;\n                    var anticlockwise = !!(1 - data[i++]);\n                    x1 = Math.cos(theta) * rx + cx;\n                    y1 = Math.sin(theta) * ry + cy;\n                    if (!isFirst) {\n                        w += windingLine(xi, yi, x1, y1, x, y);\n                    }\n                    else {\n                        x0 = x1;\n                        y0 = y1;\n                    }\n                    var _x = (x - cx) * ry / rx + cx;\n                    if (isStroke) {\n                        if (containStroke$3(cx, cy, ry, theta, theta + dTheta, anticlockwise, lineWidth, _x, y)) {\n                            return true;\n                        }\n                    }\n                    else {\n                        w += windingArc(cx, cy, ry, theta, theta + dTheta, anticlockwise, _x, y);\n                    }\n                    xi = Math.cos(theta + dTheta) * rx + cx;\n                    yi = Math.sin(theta + dTheta) * ry + cy;\n                    break;\n                case CMD$1.R:\n                    x0 = xi = data[i++];\n                    y0 = yi = data[i++];\n                    var width = data[i++];\n                    var height = data[i++];\n                    x1 = x0 + width;\n                    y1 = y0 + height;\n                    if (isStroke) {\n                        if (containStroke(x0, y0, x1, y0, lineWidth, x, y)\n                            || containStroke(x1, y0, x1, y1, lineWidth, x, y)\n                            || containStroke(x1, y1, x0, y1, lineWidth, x, y)\n                            || containStroke(x0, y1, x0, y0, lineWidth, x, y)) {\n                            return true;\n                        }\n                    }\n                    else {\n                        w += windingLine(x1, y0, x1, y1, x, y);\n                        w += windingLine(x0, y1, x0, y0, x, y);\n                    }\n                    break;\n                case CMD$1.Z:\n                    if (isStroke) {\n                        if (containStroke(xi, yi, x0, y0, lineWidth, x, y)) {\n                            return true;\n                        }\n                    }\n                    else {\n                        w += windingLine(xi, yi, x0, y0, x, y);\n                    }\n                    xi = x0;\n                    yi = y0;\n                    break;\n            }\n        }\n        if (!isStroke && !isAroundEqual(yi, y0)) {\n            w += windingLine(xi, yi, x0, y0, x, y) || 0;\n        }\n        return w !== 0;\n    }\n    function contain(pathProxy, x, y) {\n        return containPath(pathProxy, 0, false, x, y);\n    }\n    function containStroke$4(pathProxy, lineWidth, x, y) {\n        return containPath(pathProxy, lineWidth, true, x, y);\n    }\n\n    var DEFAULT_PATH_STYLE = defaults({\n        fill: '#000',\n        stroke: null,\n        strokePercent: 1,\n        fillOpacity: 1,\n        strokeOpacity: 1,\n        lineDashOffset: 0,\n        lineWidth: 1,\n        lineCap: 'butt',\n        miterLimit: 10,\n        strokeNoScale: false,\n        strokeFirst: false\n    }, DEFAULT_COMMON_STYLE);\n    var DEFAULT_PATH_ANIMATION_PROPS = {\n        style: defaults({\n            fill: true,\n            stroke: true,\n            strokePercent: true,\n            fillOpacity: true,\n            strokeOpacity: true,\n            lineDashOffset: true,\n            lineWidth: true,\n            miterLimit: true\n        }, DEFAULT_COMMON_ANIMATION_PROPS.style)\n    };\n    var pathCopyParams = TRANSFORMABLE_PROPS.concat(['invisible',\n        'culling', 'z', 'z2', 'zlevel', 'parent'\n    ]);\n    var Path = (function (_super) {\n        __extends(Path, _super);\n        function Path(opts) {\n            return _super.call(this, opts) || this;\n        }\n        Path.prototype.update = function () {\n            var _this = this;\n            _super.prototype.update.call(this);\n            var style = this.style;\n            if (style.decal) {\n                var decalEl = this._decalEl = this._decalEl || new Path();\n                if (decalEl.buildPath === Path.prototype.buildPath) {\n                    decalEl.buildPath = function (ctx) {\n                        _this.buildPath(ctx, _this.shape);\n                    };\n                }\n                decalEl.silent = true;\n                var decalElStyle = decalEl.style;\n                for (var key in style) {\n                    if (decalElStyle[key] !== style[key]) {\n                        decalElStyle[key] = style[key];\n                    }\n                }\n                decalElStyle.fill = style.fill ? style.decal : null;\n                decalElStyle.decal = null;\n                decalElStyle.shadowColor = null;\n                style.strokeFirst && (decalElStyle.stroke = null);\n                for (var i = 0; i < pathCopyParams.length; ++i) {\n                    decalEl[pathCopyParams[i]] = this[pathCopyParams[i]];\n                }\n                decalEl.__dirty |= REDRAW_BIT;\n            }\n            else if (this._decalEl) {\n                this._decalEl = null;\n            }\n        };\n        Path.prototype.getDecalElement = function () {\n            return this._decalEl;\n        };\n        Path.prototype._init = function (props) {\n            var keysArr = keys(props);\n            this.shape = this.getDefaultShape();\n            var defaultStyle = this.getDefaultStyle();\n            if (defaultStyle) {\n                this.useStyle(defaultStyle);\n            }\n            for (var i = 0; i < keysArr.length; i++) {\n                var key = keysArr[i];\n                var value = props[key];\n                if (key === 'style') {\n                    if (!this.style) {\n                        this.useStyle(value);\n                    }\n                    else {\n                        extend(this.style, value);\n                    }\n                }\n                else if (key === 'shape') {\n                    extend(this.shape, value);\n                }\n                else {\n                    _super.prototype.attrKV.call(this, key, value);\n                }\n            }\n            if (!this.style) {\n                this.useStyle({});\n            }\n        };\n        Path.prototype.getDefaultStyle = function () {\n            return null;\n        };\n        Path.prototype.getDefaultShape = function () {\n            return {};\n        };\n        Path.prototype.canBeInsideText = function () {\n            return this.hasFill();\n        };\n        Path.prototype.getInsideTextFill = function () {\n            var pathFill = this.style.fill;\n            if (pathFill !== 'none') {\n                if (isString(pathFill)) {\n                    var fillLum = lum(pathFill, 0);\n                    if (fillLum > 0.5) {\n                        return DARK_LABEL_COLOR;\n                    }\n                    else if (fillLum > 0.2) {\n                        return LIGHTER_LABEL_COLOR;\n                    }\n                    return LIGHT_LABEL_COLOR;\n                }\n                else if (pathFill) {\n                    return LIGHT_LABEL_COLOR;\n                }\n            }\n            return DARK_LABEL_COLOR;\n        };\n        Path.prototype.getInsideTextStroke = function (textFill) {\n            var pathFill = this.style.fill;\n            if (isString(pathFill)) {\n                var zr = this.__zr;\n                var isDarkMode = !!(zr && zr.isDarkMode());\n                var isDarkLabel = lum(textFill, 0) < DARK_MODE_THRESHOLD;\n                if (isDarkMode === isDarkLabel) {\n                    return pathFill;\n                }\n            }\n        };\n        Path.prototype.buildPath = function (ctx, shapeCfg, inBatch) { };\n        Path.prototype.pathUpdated = function () {\n            this.__dirty &= ~SHAPE_CHANGED_BIT;\n        };\n        Path.prototype.getUpdatedPathProxy = function (inBatch) {\n            !this.path && this.createPathProxy();\n            this.path.beginPath();\n            this.buildPath(this.path, this.shape, inBatch);\n            return this.path;\n        };\n        Path.prototype.createPathProxy = function () {\n            this.path = new PathProxy(false);\n        };\n        Path.prototype.hasStroke = function () {\n            var style = this.style;\n            var stroke = style.stroke;\n            return !(stroke == null || stroke === 'none' || !(style.lineWidth > 0));\n        };\n        Path.prototype.hasFill = function () {\n            var style = this.style;\n            var fill = style.fill;\n            return fill != null && fill !== 'none';\n        };\n        Path.prototype.getBoundingRect = function () {\n            var rect = this._rect;\n            var style = this.style;\n            var needsUpdateRect = !rect;\n            if (needsUpdateRect) {\n                var firstInvoke = false;\n                if (!this.path) {\n                    firstInvoke = true;\n                    this.createPathProxy();\n                }\n                var path = this.path;\n                if (firstInvoke || (this.__dirty & SHAPE_CHANGED_BIT)) {\n                    path.beginPath();\n                    this.buildPath(path, this.shape, false);\n                    this.pathUpdated();\n                }\n                rect = path.getBoundingRect();\n            }\n            this._rect = rect;\n            if (this.hasStroke() && this.path && this.path.len() > 0) {\n                var rectStroke = this._rectStroke || (this._rectStroke = rect.clone());\n                if (this.__dirty || needsUpdateRect) {\n                    rectStroke.copy(rect);\n                    var lineScale = style.strokeNoScale ? this.getLineScale() : 1;\n                    var w = style.lineWidth;\n                    if (!this.hasFill()) {\n                        var strokeContainThreshold = this.strokeContainThreshold;\n                        w = Math.max(w, strokeContainThreshold == null ? 4 : strokeContainThreshold);\n                    }\n                    if (lineScale > 1e-10) {\n                        rectStroke.width += w / lineScale;\n                        rectStroke.height += w / lineScale;\n                        rectStroke.x -= w / lineScale / 2;\n                        rectStroke.y -= w / lineScale / 2;\n                    }\n                }\n                return rectStroke;\n            }\n            return rect;\n        };\n        Path.prototype.contain = function (x, y) {\n            var localPos = this.transformCoordToLocal(x, y);\n            var rect = this.getBoundingRect();\n            var style = this.style;\n            x = localPos[0];\n            y = localPos[1];\n            if (rect.contain(x, y)) {\n                var pathProxy = this.path;\n                if (this.hasStroke()) {\n                    var lineWidth = style.lineWidth;\n                    var lineScale = style.strokeNoScale ? this.getLineScale() : 1;\n                    if (lineScale > 1e-10) {\n                        if (!this.hasFill()) {\n                            lineWidth = Math.max(lineWidth, this.strokeContainThreshold);\n                        }\n                        if (containStroke$4(pathProxy, lineWidth / lineScale, x, y)) {\n                            return true;\n                        }\n                    }\n                }\n                if (this.hasFill()) {\n                    return contain(pathProxy, x, y);\n                }\n            }\n            return false;\n        };\n        Path.prototype.dirtyShape = function () {\n            this.__dirty |= SHAPE_CHANGED_BIT;\n            if (this._rect) {\n                this._rect = null;\n            }\n            if (this._decalEl) {\n                this._decalEl.dirtyShape();\n            }\n            this.markRedraw();\n        };\n        Path.prototype.dirty = function () {\n            this.dirtyStyle();\n            this.dirtyShape();\n        };\n        Path.prototype.animateShape = function (loop) {\n            return this.animate('shape', loop);\n        };\n        Path.prototype.updateDuringAnimation = function (targetKey) {\n            if (targetKey === 'style') {\n                this.dirtyStyle();\n            }\n            else if (targetKey === 'shape') {\n                this.dirtyShape();\n            }\n            else {\n                this.markRedraw();\n            }\n        };\n        Path.prototype.attrKV = function (key, value) {\n            if (key === 'shape') {\n                this.setShape(value);\n            }\n            else {\n                _super.prototype.attrKV.call(this, key, value);\n            }\n        };\n        Path.prototype.setShape = function (keyOrObj, value) {\n            var shape = this.shape;\n            if (!shape) {\n                shape = this.shape = {};\n            }\n            if (typeof keyOrObj === 'string') {\n                shape[keyOrObj] = value;\n            }\n            else {\n                extend(shape, keyOrObj);\n            }\n            this.dirtyShape();\n            return this;\n        };\n        Path.prototype.shapeChanged = function () {\n            return !!(this.__dirty & SHAPE_CHANGED_BIT);\n        };\n        Path.prototype.createStyle = function (obj) {\n            return createObject(DEFAULT_PATH_STYLE, obj);\n        };\n        Path.prototype._innerSaveToNormal = function (toState) {\n            _super.prototype._innerSaveToNormal.call(this, toState);\n            var normalState = this._normalState;\n            if (toState.shape && !normalState.shape) {\n                normalState.shape = extend({}, this.shape);\n            }\n        };\n        Path.prototype._applyStateObj = function (stateName, state, normalState, keepCurrentStates, transition, animationCfg) {\n            _super.prototype._applyStateObj.call(this, stateName, state, normalState, keepCurrentStates, transition, animationCfg);\n            var needsRestoreToNormal = !(state && keepCurrentStates);\n            var targetShape;\n            if (state && state.shape) {\n                if (transition) {\n                    if (keepCurrentStates) {\n                        targetShape = state.shape;\n                    }\n                    else {\n                        targetShape = extend({}, normalState.shape);\n                        extend(targetShape, state.shape);\n                    }\n                }\n                else {\n                    targetShape = extend({}, keepCurrentStates ? this.shape : normalState.shape);\n                    extend(targetShape, state.shape);\n                }\n            }\n            else if (needsRestoreToNormal) {\n                targetShape = normalState.shape;\n            }\n            if (targetShape) {\n                if (transition) {\n                    this.shape = extend({}, this.shape);\n                    var targetShapePrimaryProps = {};\n                    var shapeKeys = keys(targetShape);\n                    for (var i = 0; i < shapeKeys.length; i++) {\n                        var key = shapeKeys[i];\n                        if (typeof targetShape[key] === 'object') {\n                            this.shape[key] = targetShape[key];\n                        }\n                        else {\n                            targetShapePrimaryProps[key] = targetShape[key];\n                        }\n                    }\n                    this._transitionState(stateName, {\n                        shape: targetShapePrimaryProps\n                    }, animationCfg);\n                }\n                else {\n                    this.shape = targetShape;\n                    this.dirtyShape();\n                }\n            }\n        };\n        Path.prototype._mergeStates = function (states) {\n            var mergedState = _super.prototype._mergeStates.call(this, states);\n            var mergedShape;\n            for (var i = 0; i < states.length; i++) {\n                var state = states[i];\n                if (state.shape) {\n                    mergedShape = mergedShape || {};\n                    this._mergeStyle(mergedShape, state.shape);\n                }\n            }\n            if (mergedShape) {\n                mergedState.shape = mergedShape;\n            }\n            return mergedState;\n        };\n        Path.prototype.getAnimationStyleProps = function () {\n            return DEFAULT_PATH_ANIMATION_PROPS;\n        };\n        Path.prototype.isZeroArea = function () {\n            return false;\n        };\n        Path.extend = function (defaultProps) {\n            var Sub = (function (_super) {\n                __extends(Sub, _super);\n                function Sub(opts) {\n                    var _this = _super.call(this, opts) || this;\n                    defaultProps.init && defaultProps.init.call(_this, opts);\n                    return _this;\n                }\n                Sub.prototype.getDefaultStyle = function () {\n                    return clone(defaultProps.style);\n                };\n                Sub.prototype.getDefaultShape = function () {\n                    return clone(defaultProps.shape);\n                };\n                return Sub;\n            }(Path));\n            for (var key in defaultProps) {\n                if (typeof defaultProps[key] === 'function') {\n                    Sub.prototype[key] = defaultProps[key];\n                }\n            }\n            return Sub;\n        };\n        Path.initDefaultProps = (function () {\n            var pathProto = Path.prototype;\n            pathProto.type = 'path';\n            pathProto.strokeContainThreshold = 5;\n            pathProto.segmentIgnoreThreshold = 0;\n            pathProto.subPixelOptimize = false;\n            pathProto.autoBatch = false;\n            pathProto.__dirty = REDRAW_BIT | STYLE_CHANGED_BIT | SHAPE_CHANGED_BIT;\n        })();\n        return Path;\n    }(Displayable));\n\n    var DEFAULT_TSPAN_STYLE = defaults({\n        strokeFirst: true,\n        font: DEFAULT_FONT,\n        x: 0,\n        y: 0,\n        textAlign: 'left',\n        textBaseline: 'top',\n        miterLimit: 2\n    }, DEFAULT_PATH_STYLE);\n    var TSpan = (function (_super) {\n        __extends(TSpan, _super);\n        function TSpan() {\n            return _super !== null && _super.apply(this, arguments) || this;\n        }\n        TSpan.prototype.hasStroke = function () {\n            var style = this.style;\n            var stroke = style.stroke;\n            return stroke != null && stroke !== 'none' && style.lineWidth > 0;\n        };\n        TSpan.prototype.hasFill = function () {\n            var style = this.style;\n            var fill = style.fill;\n            return fill != null && fill !== 'none';\n        };\n        TSpan.prototype.createStyle = function (obj) {\n            return createObject(DEFAULT_TSPAN_STYLE, obj);\n        };\n        TSpan.prototype.setBoundingRect = function (rect) {\n            this._rect = rect;\n        };\n        TSpan.prototype.getBoundingRect = function () {\n            var style = this.style;\n            if (!this._rect) {\n                var text = style.text;\n                text != null ? (text += '') : (text = '');\n                var rect = getBoundingRect(text, style.font, style.textAlign, style.textBaseline);\n                rect.x += style.x || 0;\n                rect.y += style.y || 0;\n                if (this.hasStroke()) {\n                    var w = style.lineWidth;\n                    rect.x -= w / 2;\n                    rect.y -= w / 2;\n                    rect.width += w;\n                    rect.height += w;\n                }\n                this._rect = rect;\n            }\n            return this._rect;\n        };\n        TSpan.initDefaultProps = (function () {\n            var tspanProto = TSpan.prototype;\n            tspanProto.dirtyRectTolerance = 10;\n        })();\n        return TSpan;\n    }(Displayable));\n    TSpan.prototype.type = 'tspan';\n\n    var DEFAULT_IMAGE_STYLE = defaults({\n        x: 0,\n        y: 0\n    }, DEFAULT_COMMON_STYLE);\n    var DEFAULT_IMAGE_ANIMATION_PROPS = {\n        style: defaults({\n            x: true,\n            y: true,\n            width: true,\n            height: true,\n            sx: true,\n            sy: true,\n            sWidth: true,\n            sHeight: true\n        }, DEFAULT_COMMON_ANIMATION_PROPS.style)\n    };\n    function isImageLike(source) {\n        return !!(source\n            && typeof source !== 'string'\n            && source.width && source.height);\n    }\n    var ZRImage = (function (_super) {\n        __extends(ZRImage, _super);\n        function ZRImage() {\n            return _super !== null && _super.apply(this, arguments) || this;\n        }\n        ZRImage.prototype.createStyle = function (obj) {\n            return createObject(DEFAULT_IMAGE_STYLE, obj);\n        };\n        ZRImage.prototype._getSize = function (dim) {\n            var style = this.style;\n            var size = style[dim];\n            if (size != null) {\n                return size;\n            }\n            var imageSource = isImageLike(style.image)\n                ? style.image : this.__image;\n            if (!imageSource) {\n                return 0;\n            }\n            var otherDim = dim === 'width' ? 'height' : 'width';\n            var otherDimSize = style[otherDim];\n            if (otherDimSize == null) {\n                return imageSource[dim];\n            }\n            else {\n                return imageSource[dim] / imageSource[otherDim] * otherDimSize;\n            }\n        };\n        ZRImage.prototype.getWidth = function () {\n            return this._getSize('width');\n        };\n        ZRImage.prototype.getHeight = function () {\n            return this._getSize('height');\n        };\n        ZRImage.prototype.getAnimationStyleProps = function () {\n            return DEFAULT_IMAGE_ANIMATION_PROPS;\n        };\n        ZRImage.prototype.getBoundingRect = function () {\n            var style = this.style;\n            if (!this._rect) {\n                this._rect = new BoundingRect(style.x || 0, style.y || 0, this.getWidth(), this.getHeight());\n            }\n            return this._rect;\n        };\n        return ZRImage;\n    }(Displayable));\n    ZRImage.prototype.type = 'image';\n\n    function buildPath(ctx, shape) {\n        var x = shape.x;\n        var y = shape.y;\n        var width = shape.width;\n        var height = shape.height;\n        var r = shape.r;\n        var r1;\n        var r2;\n        var r3;\n        var r4;\n        if (width < 0) {\n            x = x + width;\n            width = -width;\n        }\n        if (height < 0) {\n            y = y + height;\n            height = -height;\n        }\n        if (typeof r === 'number') {\n            r1 = r2 = r3 = r4 = r;\n        }\n        else if (r instanceof Array) {\n            if (r.length === 1) {\n                r1 = r2 = r3 = r4 = r[0];\n            }\n            else if (r.length === 2) {\n                r1 = r3 = r[0];\n                r2 = r4 = r[1];\n            }\n            else if (r.length === 3) {\n                r1 = r[0];\n                r2 = r4 = r[1];\n                r3 = r[2];\n            }\n            else {\n                r1 = r[0];\n                r2 = r[1];\n                r3 = r[2];\n                r4 = r[3];\n            }\n        }\n        else {\n            r1 = r2 = r3 = r4 = 0;\n        }\n        var total;\n        if (r1 + r2 > width) {\n            total = r1 + r2;\n            r1 *= width / total;\n            r2 *= width / total;\n        }\n        if (r3 + r4 > width) {\n            total = r3 + r4;\n            r3 *= width / total;\n            r4 *= width / total;\n        }\n        if (r2 + r3 > height) {\n            total = r2 + r3;\n            r2 *= height / total;\n            r3 *= height / total;\n        }\n        if (r1 + r4 > height) {\n            total = r1 + r4;\n            r1 *= height / total;\n            r4 *= height / total;\n        }\n        ctx.moveTo(x + r1, y);\n        ctx.lineTo(x + width - r2, y);\n        r2 !== 0 && ctx.arc(x + width - r2, y + r2, r2, -Math.PI / 2, 0);\n        ctx.lineTo(x + width, y + height - r3);\n        r3 !== 0 && ctx.arc(x + width - r3, y + height - r3, r3, 0, Math.PI / 2);\n        ctx.lineTo(x + r4, y + height);\n        r4 !== 0 && ctx.arc(x + r4, y + height - r4, r4, Math.PI / 2, Math.PI);\n        ctx.lineTo(x, y + r1);\n        r1 !== 0 && ctx.arc(x + r1, y + r1, r1, Math.PI, Math.PI * 1.5);\n    }\n\n    var round$1 = Math.round;\n    function subPixelOptimizeLine(outputShape, inputShape, style) {\n        if (!inputShape) {\n            return;\n        }\n        var x1 = inputShape.x1;\n        var x2 = inputShape.x2;\n        var y1 = inputShape.y1;\n        var y2 = inputShape.y2;\n        outputShape.x1 = x1;\n        outputShape.x2 = x2;\n        outputShape.y1 = y1;\n        outputShape.y2 = y2;\n        var lineWidth = style && style.lineWidth;\n        if (!lineWidth) {\n            return outputShape;\n        }\n        if (round$1(x1 * 2) === round$1(x2 * 2)) {\n            outputShape.x1 = outputShape.x2 = subPixelOptimize(x1, lineWidth, true);\n        }\n        if (round$1(y1 * 2) === round$1(y2 * 2)) {\n            outputShape.y1 = outputShape.y2 = subPixelOptimize(y1, lineWidth, true);\n        }\n        return outputShape;\n    }\n    function subPixelOptimizeRect(outputShape, inputShape, style) {\n        if (!inputShape) {\n            return;\n        }\n        var originX = inputShape.x;\n        var originY = inputShape.y;\n        var originWidth = inputShape.width;\n        var originHeight = inputShape.height;\n        outputShape.x = originX;\n        outputShape.y = originY;\n        outputShape.width = originWidth;\n        outputShape.height = originHeight;\n        var lineWidth = style && style.lineWidth;\n        if (!lineWidth) {\n            return outputShape;\n        }\n        outputShape.x = subPixelOptimize(originX, lineWidth, true);\n        outputShape.y = subPixelOptimize(originY, lineWidth, true);\n        outputShape.width = Math.max(subPixelOptimize(originX + originWidth, lineWidth, false) - outputShape.x, originWidth === 0 ? 0 : 1);\n        outputShape.height = Math.max(subPixelOptimize(originY + originHeight, lineWidth, false) - outputShape.y, originHeight === 0 ? 0 : 1);\n        return outputShape;\n    }\n    function subPixelOptimize(position, lineWidth, positiveOrNegative) {\n        if (!lineWidth) {\n            return position;\n        }\n        var doubledPosition = round$1(position * 2);\n        return (doubledPosition + round$1(lineWidth)) % 2 === 0\n            ? doubledPosition / 2\n            : (doubledPosition + (positiveOrNegative ? 1 : -1)) / 2;\n    }\n\n    var RectShape = (function () {\n        function RectShape() {\n            this.x = 0;\n            this.y = 0;\n            this.width = 0;\n            this.height = 0;\n        }\n        return RectShape;\n    }());\n    var subPixelOptimizeOutputShape = {};\n    var Rect = (function (_super) {\n        __extends(Rect, _super);\n        function Rect(opts) {\n            return _super.call(this, opts) || this;\n        }\n        Rect.prototype.getDefaultShape = function () {\n            return new RectShape();\n        };\n        Rect.prototype.buildPath = function (ctx, shape) {\n            var x;\n            var y;\n            var width;\n            var height;\n            if (this.subPixelOptimize) {\n                var optimizedShape = subPixelOptimizeRect(subPixelOptimizeOutputShape, shape, this.style);\n                x = optimizedShape.x;\n                y = optimizedShape.y;\n                width = optimizedShape.width;\n                height = optimizedShape.height;\n                optimizedShape.r = shape.r;\n                shape = optimizedShape;\n            }\n            else {\n                x = shape.x;\n                y = shape.y;\n                width = shape.width;\n                height = shape.height;\n            }\n            if (!shape.r) {\n                ctx.rect(x, y, width, height);\n            }\n            else {\n                buildPath(ctx, shape);\n            }\n        };\n        Rect.prototype.isZeroArea = function () {\n            return !this.shape.width || !this.shape.height;\n        };\n        return Rect;\n    }(Path));\n    Rect.prototype.type = 'rect';\n\n    var DEFAULT_RICH_TEXT_COLOR = {\n        fill: '#000'\n    };\n    var DEFAULT_STROKE_LINE_WIDTH = 2;\n    var DEFAULT_TEXT_ANIMATION_PROPS = {\n        style: defaults({\n            fill: true,\n            stroke: true,\n            fillOpacity: true,\n            strokeOpacity: true,\n            lineWidth: true,\n            fontSize: true,\n            lineHeight: true,\n            width: true,\n            height: true,\n            textShadowColor: true,\n            textShadowBlur: true,\n            textShadowOffsetX: true,\n            textShadowOffsetY: true,\n            backgroundColor: true,\n            padding: true,\n            borderColor: true,\n            borderWidth: true,\n            borderRadius: true\n        }, DEFAULT_COMMON_ANIMATION_PROPS.style)\n    };\n    var ZRText = (function (_super) {\n        __extends(ZRText, _super);\n        function ZRText(opts) {\n            var _this = _super.call(this) || this;\n            _this.type = 'text';\n            _this._children = [];\n            _this._defaultStyle = DEFAULT_RICH_TEXT_COLOR;\n            _this.attr(opts);\n            return _this;\n        }\n        ZRText.prototype.childrenRef = function () {\n            return this._children;\n        };\n        ZRText.prototype.update = function () {\n            _super.prototype.update.call(this);\n            if (this.styleChanged()) {\n                this._updateSubTexts();\n            }\n            for (var i = 0; i < this._children.length; i++) {\n                var child = this._children[i];\n                child.zlevel = this.zlevel;\n                child.z = this.z;\n                child.z2 = this.z2;\n                child.culling = this.culling;\n                child.cursor = this.cursor;\n                child.invisible = this.invisible;\n            }\n        };\n        ZRText.prototype.updateTransform = function () {\n            var innerTransformable = this.innerTransformable;\n            if (innerTransformable) {\n                innerTransformable.updateTransform();\n                if (innerTransformable.transform) {\n                    this.transform = innerTransformable.transform;\n                }\n            }\n            else {\n                _super.prototype.updateTransform.call(this);\n            }\n        };\n        ZRText.prototype.getLocalTransform = function (m) {\n            var innerTransformable = this.innerTransformable;\n            return innerTransformable\n                ? innerTransformable.getLocalTransform(m)\n                : _super.prototype.getLocalTransform.call(this, m);\n        };\n        ZRText.prototype.getComputedTransform = function () {\n            if (this.__hostTarget) {\n                this.__hostTarget.getComputedTransform();\n                this.__hostTarget.updateInnerText(true);\n            }\n            return _super.prototype.getComputedTransform.call(this);\n        };\n        ZRText.prototype._updateSubTexts = function () {\n            this._childCursor = 0;\n            normalizeTextStyle(this.style);\n            this.style.rich\n                ? this._updateRichTexts()\n                : this._updatePlainTexts();\n            this._children.length = this._childCursor;\n            this.styleUpdated();\n        };\n        ZRText.prototype.addSelfToZr = function (zr) {\n            _super.prototype.addSelfToZr.call(this, zr);\n            for (var i = 0; i < this._children.length; i++) {\n                this._children[i].__zr = zr;\n            }\n        };\n        ZRText.prototype.removeSelfFromZr = function (zr) {\n            _super.prototype.removeSelfFromZr.call(this, zr);\n            for (var i = 0; i < this._children.length; i++) {\n                this._children[i].__zr = null;\n            }\n        };\n        ZRText.prototype.getBoundingRect = function () {\n            if (this.styleChanged()) {\n                this._updateSubTexts();\n            }\n            if (!this._rect) {\n                var tmpRect = new BoundingRect(0, 0, 0, 0);\n                var children = this._children;\n                var tmpMat = [];\n                var rect = null;\n                for (var i = 0; i < children.length; i++) {\n                    var child = children[i];\n                    var childRect = child.getBoundingRect();\n                    var transform = child.getLocalTransform(tmpMat);\n                    if (transform) {\n                        tmpRect.copy(childRect);\n                        tmpRect.applyTransform(transform);\n                        rect = rect || tmpRect.clone();\n                        rect.union(tmpRect);\n                    }\n                    else {\n                        rect = rect || childRect.clone();\n                        rect.union(childRect);\n                    }\n                }\n                this._rect = rect || tmpRect;\n            }\n            return this._rect;\n        };\n        ZRText.prototype.setDefaultTextStyle = function (defaultTextStyle) {\n            this._defaultStyle = defaultTextStyle || DEFAULT_RICH_TEXT_COLOR;\n        };\n        ZRText.prototype.setTextContent = function (textContent) {\n            if (\"development\" !== 'production') {\n                throw new Error('Can\\'t attach text on another text');\n            }\n        };\n        ZRText.prototype._mergeStyle = function (targetStyle, sourceStyle) {\n            if (!sourceStyle) {\n                return targetStyle;\n            }\n            var sourceRich = sourceStyle.rich;\n            var targetRich = targetStyle.rich || (sourceRich && {});\n            extend(targetStyle, sourceStyle);\n            if (sourceRich && targetRich) {\n                this._mergeRich(targetRich, sourceRich);\n                targetStyle.rich = targetRich;\n            }\n            else if (targetRich) {\n                targetStyle.rich = targetRich;\n            }\n            return targetStyle;\n        };\n        ZRText.prototype._mergeRich = function (targetRich, sourceRich) {\n            var richNames = keys(sourceRich);\n            for (var i = 0; i < richNames.length; i++) {\n                var richName = richNames[i];\n                targetRich[richName] = targetRich[richName] || {};\n                extend(targetRich[richName], sourceRich[richName]);\n            }\n        };\n        ZRText.prototype.getAnimationStyleProps = function () {\n            return DEFAULT_TEXT_ANIMATION_PROPS;\n        };\n        ZRText.prototype._getOrCreateChild = function (Ctor) {\n            var child = this._children[this._childCursor];\n            if (!child || !(child instanceof Ctor)) {\n                child = new Ctor();\n            }\n            this._children[this._childCursor++] = child;\n            child.__zr = this.__zr;\n            child.parent = this;\n            return child;\n        };\n        ZRText.prototype._updatePlainTexts = function () {\n            var style = this.style;\n            var textFont = style.font || DEFAULT_FONT;\n            var textPadding = style.padding;\n            var text = getStyleText(style);\n            var contentBlock = parsePlainText(text, style);\n            var needDrawBg = needDrawBackground(style);\n            var bgColorDrawn = !!(style.backgroundColor);\n            var outerHeight = contentBlock.outerHeight;\n            var outerWidth = contentBlock.outerWidth;\n            var contentWidth = contentBlock.contentWidth;\n            var textLines = contentBlock.lines;\n            var lineHeight = contentBlock.lineHeight;\n            var defaultStyle = this._defaultStyle;\n            this.isTruncated = !!contentBlock.isTruncated;\n            var baseX = style.x || 0;\n            var baseY = style.y || 0;\n            var textAlign = style.align || defaultStyle.align || 'left';\n            var verticalAlign = style.verticalAlign || defaultStyle.verticalAlign || 'top';\n            var textX = baseX;\n            var textY = adjustTextY$1(baseY, contentBlock.contentHeight, verticalAlign);\n            if (needDrawBg || textPadding) {\n                var boxX = adjustTextX(baseX, outerWidth, textAlign);\n                var boxY = adjustTextY$1(baseY, outerHeight, verticalAlign);\n                needDrawBg && this._renderBackground(style, style, boxX, boxY, outerWidth, outerHeight);\n            }\n            textY += lineHeight / 2;\n            if (textPadding) {\n                textX = getTextXForPadding(baseX, textAlign, textPadding);\n                if (verticalAlign === 'top') {\n                    textY += textPadding[0];\n                }\n                else if (verticalAlign === 'bottom') {\n                    textY -= textPadding[2];\n                }\n            }\n            var defaultLineWidth = 0;\n            var useDefaultFill = false;\n            var textFill = getFill('fill' in style\n                ? style.fill\n                : (useDefaultFill = true, defaultStyle.fill));\n            var textStroke = getStroke('stroke' in style\n                ? style.stroke\n                : (!bgColorDrawn\n                    && (!defaultStyle.autoStroke || useDefaultFill))\n                    ? (defaultLineWidth = DEFAULT_STROKE_LINE_WIDTH, defaultStyle.stroke)\n                    : null);\n            var hasShadow = style.textShadowBlur > 0;\n            var fixedBoundingRect = style.width != null\n                && (style.overflow === 'truncate' || style.overflow === 'break' || style.overflow === 'breakAll');\n            var calculatedLineHeight = contentBlock.calculatedLineHeight;\n            for (var i = 0; i < textLines.length; i++) {\n                var el = this._getOrCreateChild(TSpan);\n                var subElStyle = el.createStyle();\n                el.useStyle(subElStyle);\n                subElStyle.text = textLines[i];\n                subElStyle.x = textX;\n                subElStyle.y = textY;\n                if (textAlign) {\n                    subElStyle.textAlign = textAlign;\n                }\n                subElStyle.textBaseline = 'middle';\n                subElStyle.opacity = style.opacity;\n                subElStyle.strokeFirst = true;\n                if (hasShadow) {\n                    subElStyle.shadowBlur = style.textShadowBlur || 0;\n                    subElStyle.shadowColor = style.textShadowColor || 'transparent';\n                    subElStyle.shadowOffsetX = style.textShadowOffsetX || 0;\n                    subElStyle.shadowOffsetY = style.textShadowOffsetY || 0;\n                }\n                subElStyle.stroke = textStroke;\n                subElStyle.fill = textFill;\n                if (textStroke) {\n                    subElStyle.lineWidth = style.lineWidth || defaultLineWidth;\n                    subElStyle.lineDash = style.lineDash;\n                    subElStyle.lineDashOffset = style.lineDashOffset || 0;\n                }\n                subElStyle.font = textFont;\n                setSeparateFont(subElStyle, style);\n                textY += lineHeight;\n                if (fixedBoundingRect) {\n                    el.setBoundingRect(new BoundingRect(adjustTextX(subElStyle.x, contentWidth, subElStyle.textAlign), adjustTextY$1(subElStyle.y, calculatedLineHeight, subElStyle.textBaseline), contentWidth, calculatedLineHeight));\n                }\n            }\n        };\n        ZRText.prototype._updateRichTexts = function () {\n            var style = this.style;\n            var text = getStyleText(style);\n            var contentBlock = parseRichText(text, style);\n            var contentWidth = contentBlock.width;\n            var outerWidth = contentBlock.outerWidth;\n            var outerHeight = contentBlock.outerHeight;\n            var textPadding = style.padding;\n            var baseX = style.x || 0;\n            var baseY = style.y || 0;\n            var defaultStyle = this._defaultStyle;\n            var textAlign = style.align || defaultStyle.align;\n            var verticalAlign = style.verticalAlign || defaultStyle.verticalAlign;\n            this.isTruncated = !!contentBlock.isTruncated;\n            var boxX = adjustTextX(baseX, outerWidth, textAlign);\n            var boxY = adjustTextY$1(baseY, outerHeight, verticalAlign);\n            var xLeft = boxX;\n            var lineTop = boxY;\n            if (textPadding) {\n                xLeft += textPadding[3];\n                lineTop += textPadding[0];\n            }\n            var xRight = xLeft + contentWidth;\n            if (needDrawBackground(style)) {\n                this._renderBackground(style, style, boxX, boxY, outerWidth, outerHeight);\n            }\n            var bgColorDrawn = !!(style.backgroundColor);\n            for (var i = 0; i < contentBlock.lines.length; i++) {\n                var line = contentBlock.lines[i];\n                var tokens = line.tokens;\n                var tokenCount = tokens.length;\n                var lineHeight = line.lineHeight;\n                var remainedWidth = line.width;\n                var leftIndex = 0;\n                var lineXLeft = xLeft;\n                var lineXRight = xRight;\n                var rightIndex = tokenCount - 1;\n                var token = void 0;\n                while (leftIndex < tokenCount\n                    && (token = tokens[leftIndex], !token.align || token.align === 'left')) {\n                    this._placeToken(token, style, lineHeight, lineTop, lineXLeft, 'left', bgColorDrawn);\n                    remainedWidth -= token.width;\n                    lineXLeft += token.width;\n                    leftIndex++;\n                }\n                while (rightIndex >= 0\n                    && (token = tokens[rightIndex], token.align === 'right')) {\n                    this._placeToken(token, style, lineHeight, lineTop, lineXRight, 'right', bgColorDrawn);\n                    remainedWidth -= token.width;\n                    lineXRight -= token.width;\n                    rightIndex--;\n                }\n                lineXLeft += (contentWidth - (lineXLeft - xLeft) - (xRight - lineXRight) - remainedWidth) / 2;\n                while (leftIndex <= rightIndex) {\n                    token = tokens[leftIndex];\n                    this._placeToken(token, style, lineHeight, lineTop, lineXLeft + token.width / 2, 'center', bgColorDrawn);\n                    lineXLeft += token.width;\n                    leftIndex++;\n                }\n                lineTop += lineHeight;\n            }\n        };\n        ZRText.prototype._placeToken = function (token, style, lineHeight, lineTop, x, textAlign, parentBgColorDrawn) {\n            var tokenStyle = style.rich[token.styleName] || {};\n            tokenStyle.text = token.text;\n            var verticalAlign = token.verticalAlign;\n            var y = lineTop + lineHeight / 2;\n            if (verticalAlign === 'top') {\n                y = lineTop + token.height / 2;\n            }\n            else if (verticalAlign === 'bottom') {\n                y = lineTop + lineHeight - token.height / 2;\n            }\n            var needDrawBg = !token.isLineHolder && needDrawBackground(tokenStyle);\n            needDrawBg && this._renderBackground(tokenStyle, style, textAlign === 'right'\n                ? x - token.width\n                : textAlign === 'center'\n                    ? x - token.width / 2\n                    : x, y - token.height / 2, token.width, token.height);\n            var bgColorDrawn = !!tokenStyle.backgroundColor;\n            var textPadding = token.textPadding;\n            if (textPadding) {\n                x = getTextXForPadding(x, textAlign, textPadding);\n                y -= token.height / 2 - textPadding[0] - token.innerHeight / 2;\n            }\n            var el = this._getOrCreateChild(TSpan);\n            var subElStyle = el.createStyle();\n            el.useStyle(subElStyle);\n            var defaultStyle = this._defaultStyle;\n            var useDefaultFill = false;\n            var defaultLineWidth = 0;\n            var textFill = getFill('fill' in tokenStyle ? tokenStyle.fill\n                : 'fill' in style ? style.fill\n                    : (useDefaultFill = true, defaultStyle.fill));\n            var textStroke = getStroke('stroke' in tokenStyle ? tokenStyle.stroke\n                : 'stroke' in style ? style.stroke\n                    : (!bgColorDrawn\n                        && !parentBgColorDrawn\n                        && (!defaultStyle.autoStroke || useDefaultFill)) ? (defaultLineWidth = DEFAULT_STROKE_LINE_WIDTH, defaultStyle.stroke)\n                        : null);\n            var hasShadow = tokenStyle.textShadowBlur > 0\n                || style.textShadowBlur > 0;\n            subElStyle.text = token.text;\n            subElStyle.x = x;\n            subElStyle.y = y;\n            if (hasShadow) {\n                subElStyle.shadowBlur = tokenStyle.textShadowBlur || style.textShadowBlur || 0;\n                subElStyle.shadowColor = tokenStyle.textShadowColor || style.textShadowColor || 'transparent';\n                subElStyle.shadowOffsetX = tokenStyle.textShadowOffsetX || style.textShadowOffsetX || 0;\n                subElStyle.shadowOffsetY = tokenStyle.textShadowOffsetY || style.textShadowOffsetY || 0;\n            }\n            subElStyle.textAlign = textAlign;\n            subElStyle.textBaseline = 'middle';\n            subElStyle.font = token.font || DEFAULT_FONT;\n            subElStyle.opacity = retrieve3(tokenStyle.opacity, style.opacity, 1);\n            setSeparateFont(subElStyle, tokenStyle);\n            if (textStroke) {\n                subElStyle.lineWidth = retrieve3(tokenStyle.lineWidth, style.lineWidth, defaultLineWidth);\n                subElStyle.lineDash = retrieve2(tokenStyle.lineDash, style.lineDash);\n                subElStyle.lineDashOffset = style.lineDashOffset || 0;\n                subElStyle.stroke = textStroke;\n            }\n            if (textFill) {\n                subElStyle.fill = textFill;\n            }\n            var textWidth = token.contentWidth;\n            var textHeight = token.contentHeight;\n            el.setBoundingRect(new BoundingRect(adjustTextX(subElStyle.x, textWidth, subElStyle.textAlign), adjustTextY$1(subElStyle.y, textHeight, subElStyle.textBaseline), textWidth, textHeight));\n        };\n        ZRText.prototype._renderBackground = function (style, topStyle, x, y, width, height) {\n            var textBackgroundColor = style.backgroundColor;\n            var textBorderWidth = style.borderWidth;\n            var textBorderColor = style.borderColor;\n            var isImageBg = textBackgroundColor && textBackgroundColor.image;\n            var isPlainOrGradientBg = textBackgroundColor && !isImageBg;\n            var textBorderRadius = style.borderRadius;\n            var self = this;\n            var rectEl;\n            var imgEl;\n            if (isPlainOrGradientBg || style.lineHeight || (textBorderWidth && textBorderColor)) {\n                rectEl = this._getOrCreateChild(Rect);\n                rectEl.useStyle(rectEl.createStyle());\n                rectEl.style.fill = null;\n                var rectShape = rectEl.shape;\n                rectShape.x = x;\n                rectShape.y = y;\n                rectShape.width = width;\n                rectShape.height = height;\n                rectShape.r = textBorderRadius;\n                rectEl.dirtyShape();\n            }\n            if (isPlainOrGradientBg) {\n                var rectStyle = rectEl.style;\n                rectStyle.fill = textBackgroundColor || null;\n                rectStyle.fillOpacity = retrieve2(style.fillOpacity, 1);\n            }\n            else if (isImageBg) {\n                imgEl = this._getOrCreateChild(ZRImage);\n                imgEl.onload = function () {\n                    self.dirtyStyle();\n                };\n                var imgStyle = imgEl.style;\n                imgStyle.image = textBackgroundColor.image;\n                imgStyle.x = x;\n                imgStyle.y = y;\n                imgStyle.width = width;\n                imgStyle.height = height;\n            }\n            if (textBorderWidth && textBorderColor) {\n                var rectStyle = rectEl.style;\n                rectStyle.lineWidth = textBorderWidth;\n                rectStyle.stroke = textBorderColor;\n                rectStyle.strokeOpacity = retrieve2(style.strokeOpacity, 1);\n                rectStyle.lineDash = style.borderDash;\n                rectStyle.lineDashOffset = style.borderDashOffset || 0;\n                rectEl.strokeContainThreshold = 0;\n                if (rectEl.hasFill() && rectEl.hasStroke()) {\n                    rectStyle.strokeFirst = true;\n                    rectStyle.lineWidth *= 2;\n                }\n            }\n            var commonStyle = (rectEl || imgEl).style;\n            commonStyle.shadowBlur = style.shadowBlur || 0;\n            commonStyle.shadowColor = style.shadowColor || 'transparent';\n            commonStyle.shadowOffsetX = style.shadowOffsetX || 0;\n            commonStyle.shadowOffsetY = style.shadowOffsetY || 0;\n            commonStyle.opacity = retrieve3(style.opacity, topStyle.opacity, 1);\n        };\n        ZRText.makeFont = function (style) {\n            var font = '';\n            if (hasSeparateFont(style)) {\n                font = [\n                    style.fontStyle,\n                    style.fontWeight,\n                    parseFontSize(style.fontSize),\n                    style.fontFamily || 'sans-serif'\n                ].join(' ');\n            }\n            return font && trim(font) || style.textFont || style.font;\n        };\n        return ZRText;\n    }(Displayable));\n    var VALID_TEXT_ALIGN = { left: true, right: 1, center: 1 };\n    var VALID_TEXT_VERTICAL_ALIGN = { top: 1, bottom: 1, middle: 1 };\n    var FONT_PARTS = ['fontStyle', 'fontWeight', 'fontSize', 'fontFamily'];\n    function parseFontSize(fontSize) {\n        if (typeof fontSize === 'string'\n            && (fontSize.indexOf('px') !== -1\n                || fontSize.indexOf('rem') !== -1\n                || fontSize.indexOf('em') !== -1)) {\n            return fontSize;\n        }\n        else if (!isNaN(+fontSize)) {\n            return fontSize + 'px';\n        }\n        else {\n            return DEFAULT_FONT_SIZE + 'px';\n        }\n    }\n    function setSeparateFont(targetStyle, sourceStyle) {\n        for (var i = 0; i < FONT_PARTS.length; i++) {\n            var fontProp = FONT_PARTS[i];\n            var val = sourceStyle[fontProp];\n            if (val != null) {\n                targetStyle[fontProp] = val;\n            }\n        }\n    }\n    function hasSeparateFont(style) {\n        return style.fontSize != null || style.fontFamily || style.fontWeight;\n    }\n    function normalizeTextStyle(style) {\n        normalizeStyle(style);\n        each(style.rich, normalizeStyle);\n        return style;\n    }\n    function normalizeStyle(style) {\n        if (style) {\n            style.font = ZRText.makeFont(style);\n            var textAlign = style.align;\n            textAlign === 'middle' && (textAlign = 'center');\n            style.align = (textAlign == null || VALID_TEXT_ALIGN[textAlign]) ? textAlign : 'left';\n            var verticalAlign = style.verticalAlign;\n            verticalAlign === 'center' && (verticalAlign = 'middle');\n            style.verticalAlign = (verticalAlign == null || VALID_TEXT_VERTICAL_ALIGN[verticalAlign]) ? verticalAlign : 'top';\n            var textPadding = style.padding;\n            if (textPadding) {\n                style.padding = normalizeCssArray(style.padding);\n            }\n        }\n    }\n    function getStroke(stroke, lineWidth) {\n        return (stroke == null || lineWidth <= 0 || stroke === 'transparent' || stroke === 'none')\n            ? null\n            : (stroke.image || stroke.colorStops)\n                ? '#000'\n                : stroke;\n    }\n    function getFill(fill) {\n        return (fill == null || fill === 'none')\n            ? null\n            : (fill.image || fill.colorStops)\n                ? '#000'\n                : fill;\n    }\n    function getTextXForPadding(x, textAlign, textPadding) {\n        return textAlign === 'right'\n            ? (x - textPadding[1])\n            : textAlign === 'center'\n                ? (x + textPadding[3] / 2 - textPadding[1] / 2)\n                : (x + textPadding[3]);\n    }\n    function getStyleText(style) {\n        var text = style.text;\n        text != null && (text += '');\n        return text;\n    }\n    function needDrawBackground(style) {\n        return !!(style.backgroundColor\n            || style.lineHeight\n            || (style.borderWidth && style.borderColor));\n    }\n\n    var getECData = makeInner();\n    var setCommonECData = function (seriesIndex, dataType, dataIdx, el) {\n      if (el) {\n        var ecData = getECData(el);\n        // Add data index and series index for indexing the data by element\n        // Useful in tooltip\n        ecData.dataIndex = dataIdx;\n        ecData.dataType = dataType;\n        ecData.seriesIndex = seriesIndex;\n        ecData.ssrType = 'chart';\n        // TODO: not store dataIndex on children.\n        if (el.type === 'group') {\n          el.traverse(function (child) {\n            var childECData = getECData(child);\n            childECData.seriesIndex = seriesIndex;\n            childECData.dataIndex = dataIdx;\n            childECData.dataType = dataType;\n            childECData.ssrType = 'chart';\n          });\n        }\n      }\n    };\n\n    // Reserve 0 as default.\n    var _highlightNextDigit = 1;\n    var _highlightKeyMap = {};\n    var getSavedStates = makeInner();\n    var getComponentStates = makeInner();\n    var HOVER_STATE_NORMAL = 0;\n    var HOVER_STATE_BLUR = 1;\n    var HOVER_STATE_EMPHASIS = 2;\n    var SPECIAL_STATES = ['emphasis', 'blur', 'select'];\n    var DISPLAY_STATES = ['normal', 'emphasis', 'blur', 'select'];\n    var Z2_EMPHASIS_LIFT = 10;\n    var Z2_SELECT_LIFT = 9;\n    var HIGHLIGHT_ACTION_TYPE = 'highlight';\n    var DOWNPLAY_ACTION_TYPE = 'downplay';\n    var SELECT_ACTION_TYPE = 'select';\n    var UNSELECT_ACTION_TYPE = 'unselect';\n    var TOGGLE_SELECT_ACTION_TYPE = 'toggleSelect';\n    function hasFillOrStroke(fillOrStroke) {\n      return fillOrStroke != null && fillOrStroke !== 'none';\n    }\n    function doChangeHoverState(el, stateName, hoverStateEnum) {\n      if (el.onHoverStateChange && (el.hoverState || 0) !== hoverStateEnum) {\n        el.onHoverStateChange(stateName);\n      }\n      el.hoverState = hoverStateEnum;\n    }\n    function singleEnterEmphasis(el) {\n      // Only mark the flag.\n      // States will be applied in the echarts.ts in next frame.\n      doChangeHoverState(el, 'emphasis', HOVER_STATE_EMPHASIS);\n    }\n    function singleLeaveEmphasis(el) {\n      // Only mark the flag.\n      // States will be applied in the echarts.ts in next frame.\n      if (el.hoverState === HOVER_STATE_EMPHASIS) {\n        doChangeHoverState(el, 'normal', HOVER_STATE_NORMAL);\n      }\n    }\n    function singleEnterBlur(el) {\n      doChangeHoverState(el, 'blur', HOVER_STATE_BLUR);\n    }\n    function singleLeaveBlur(el) {\n      if (el.hoverState === HOVER_STATE_BLUR) {\n        doChangeHoverState(el, 'normal', HOVER_STATE_NORMAL);\n      }\n    }\n    function singleEnterSelect(el) {\n      el.selected = true;\n    }\n    function singleLeaveSelect(el) {\n      el.selected = false;\n    }\n    function updateElementState(el, updater, commonParam) {\n      updater(el, commonParam);\n    }\n    function traverseUpdateState(el, updater, commonParam) {\n      updateElementState(el, updater, commonParam);\n      el.isGroup && el.traverse(function (child) {\n        updateElementState(child, updater, commonParam);\n      });\n    }\n    function setStatesFlag(el, stateName) {\n      switch (stateName) {\n        case 'emphasis':\n          el.hoverState = HOVER_STATE_EMPHASIS;\n          break;\n        case 'normal':\n          el.hoverState = HOVER_STATE_NORMAL;\n          break;\n        case 'blur':\n          el.hoverState = HOVER_STATE_BLUR;\n          break;\n        case 'select':\n          el.selected = true;\n      }\n    }\n    function getFromStateStyle(el, props, toStateName, defaultValue) {\n      var style = el.style;\n      var fromState = {};\n      for (var i = 0; i < props.length; i++) {\n        var propName = props[i];\n        var val = style[propName];\n        fromState[propName] = val == null ? defaultValue && defaultValue[propName] : val;\n      }\n      for (var i = 0; i < el.animators.length; i++) {\n        var animator = el.animators[i];\n        if (animator.__fromStateTransition\n        // Don't consider the animation to emphasis state.\n        && animator.__fromStateTransition.indexOf(toStateName) < 0 && animator.targetName === 'style') {\n          animator.saveTo(fromState, props);\n        }\n      }\n      return fromState;\n    }\n    function createEmphasisDefaultState(el, stateName, targetStates, state) {\n      var hasSelect = targetStates && indexOf(targetStates, 'select') >= 0;\n      var cloned = false;\n      if (el instanceof Path) {\n        var store = getSavedStates(el);\n        var fromFill = hasSelect ? store.selectFill || store.normalFill : store.normalFill;\n        var fromStroke = hasSelect ? store.selectStroke || store.normalStroke : store.normalStroke;\n        if (hasFillOrStroke(fromFill) || hasFillOrStroke(fromStroke)) {\n          state = state || {};\n          var emphasisStyle = state.style || {};\n          // inherit case\n          if (emphasisStyle.fill === 'inherit') {\n            cloned = true;\n            state = extend({}, state);\n            emphasisStyle = extend({}, emphasisStyle);\n            emphasisStyle.fill = fromFill;\n          }\n          // Apply default color lift\n          else if (!hasFillOrStroke(emphasisStyle.fill) && hasFillOrStroke(fromFill)) {\n            cloned = true;\n            // Not modify the original value.\n            state = extend({}, state);\n            emphasisStyle = extend({}, emphasisStyle);\n            // Already being applied 'emphasis'. DON'T lift color multiple times.\n            emphasisStyle.fill = liftColor(fromFill);\n          }\n          // Not highlight stroke if fill has been highlighted.\n          else if (!hasFillOrStroke(emphasisStyle.stroke) && hasFillOrStroke(fromStroke)) {\n            if (!cloned) {\n              state = extend({}, state);\n              emphasisStyle = extend({}, emphasisStyle);\n            }\n            emphasisStyle.stroke = liftColor(fromStroke);\n          }\n          state.style = emphasisStyle;\n        }\n      }\n      if (state) {\n        // TODO Share with textContent?\n        if (state.z2 == null) {\n          if (!cloned) {\n            state = extend({}, state);\n          }\n          var z2EmphasisLift = el.z2EmphasisLift;\n          state.z2 = el.z2 + (z2EmphasisLift != null ? z2EmphasisLift : Z2_EMPHASIS_LIFT);\n        }\n      }\n      return state;\n    }\n    function createSelectDefaultState(el, stateName, state) {\n      // const hasSelect = indexOf(el.currentStates, stateName) >= 0;\n      if (state) {\n        // TODO Share with textContent?\n        if (state.z2 == null) {\n          state = extend({}, state);\n          var z2SelectLift = el.z2SelectLift;\n          state.z2 = el.z2 + (z2SelectLift != null ? z2SelectLift : Z2_SELECT_LIFT);\n        }\n      }\n      return state;\n    }\n    function createBlurDefaultState(el, stateName, state) {\n      var hasBlur = indexOf(el.currentStates, stateName) >= 0;\n      var currentOpacity = el.style.opacity;\n      var fromState = !hasBlur ? getFromStateStyle(el, ['opacity'], stateName, {\n        opacity: 1\n      }) : null;\n      state = state || {};\n      var blurStyle = state.style || {};\n      if (blurStyle.opacity == null) {\n        // clone state\n        state = extend({}, state);\n        blurStyle = extend({\n          // Already being applied 'emphasis'. DON'T mul opacity multiple times.\n          opacity: hasBlur ? currentOpacity : fromState.opacity * 0.1\n        }, blurStyle);\n        state.style = blurStyle;\n      }\n      return state;\n    }\n    function elementStateProxy(stateName, targetStates) {\n      var state = this.states[stateName];\n      if (this.style) {\n        if (stateName === 'emphasis') {\n          return createEmphasisDefaultState(this, stateName, targetStates, state);\n        } else if (stateName === 'blur') {\n          return createBlurDefaultState(this, stateName, state);\n        } else if (stateName === 'select') {\n          return createSelectDefaultState(this, stateName, state);\n        }\n      }\n      return state;\n    }\n    /**\r\n     * Set hover style (namely \"emphasis style\") of element.\r\n     * @param el Should not be `zrender/graphic/Group`.\r\n     * @param focus 'self' | 'selfInSeries' | 'series'\r\n     */\n    function setDefaultStateProxy(el) {\n      el.stateProxy = elementStateProxy;\n      var textContent = el.getTextContent();\n      var textGuide = el.getTextGuideLine();\n      if (textContent) {\n        textContent.stateProxy = elementStateProxy;\n      }\n      if (textGuide) {\n        textGuide.stateProxy = elementStateProxy;\n      }\n    }\n    function enterEmphasisWhenMouseOver(el, e) {\n      !shouldSilent(el, e)\n      // \"emphasis\" event highlight has higher priority than mouse highlight.\n      && !el.__highByOuter && traverseUpdateState(el, singleEnterEmphasis);\n    }\n    function leaveEmphasisWhenMouseOut(el, e) {\n      !shouldSilent(el, e)\n      // \"emphasis\" event highlight has higher priority than mouse highlight.\n      && !el.__highByOuter && traverseUpdateState(el, singleLeaveEmphasis);\n    }\n    function enterEmphasis(el, highlightDigit) {\n      el.__highByOuter |= 1 << (highlightDigit || 0);\n      traverseUpdateState(el, singleEnterEmphasis);\n    }\n    function leaveEmphasis(el, highlightDigit) {\n      !(el.__highByOuter &= ~(1 << (highlightDigit || 0))) && traverseUpdateState(el, singleLeaveEmphasis);\n    }\n    function enterBlur(el) {\n      traverseUpdateState(el, singleEnterBlur);\n    }\n    function leaveBlur(el) {\n      traverseUpdateState(el, singleLeaveBlur);\n    }\n    function enterSelect(el) {\n      traverseUpdateState(el, singleEnterSelect);\n    }\n    function leaveSelect(el) {\n      traverseUpdateState(el, singleLeaveSelect);\n    }\n    function shouldSilent(el, e) {\n      return el.__highDownSilentOnTouch && e.zrByTouch;\n    }\n    function allLeaveBlur(api) {\n      var model = api.getModel();\n      var leaveBlurredSeries = [];\n      var allComponentViews = [];\n      model.eachComponent(function (componentType, componentModel) {\n        var componentStates = getComponentStates(componentModel);\n        var isSeries = componentType === 'series';\n        var view = isSeries ? api.getViewOfSeriesModel(componentModel) : api.getViewOfComponentModel(componentModel);\n        !isSeries && allComponentViews.push(view);\n        if (componentStates.isBlured) {\n          // Leave blur anyway\n          view.group.traverse(function (child) {\n            singleLeaveBlur(child);\n          });\n          isSeries && leaveBlurredSeries.push(componentModel);\n        }\n        componentStates.isBlured = false;\n      });\n      each(allComponentViews, function (view) {\n        if (view && view.toggleBlurSeries) {\n          view.toggleBlurSeries(leaveBlurredSeries, false, model);\n        }\n      });\n    }\n    function blurSeries(targetSeriesIndex, focus, blurScope, api) {\n      var ecModel = api.getModel();\n      blurScope = blurScope || 'coordinateSystem';\n      function leaveBlurOfIndices(data, dataIndices) {\n        for (var i = 0; i < dataIndices.length; i++) {\n          var itemEl = data.getItemGraphicEl(dataIndices[i]);\n          itemEl && leaveBlur(itemEl);\n        }\n      }\n      if (targetSeriesIndex == null) {\n        return;\n      }\n      if (!focus || focus === 'none') {\n        return;\n      }\n      var targetSeriesModel = ecModel.getSeriesByIndex(targetSeriesIndex);\n      var targetCoordSys = targetSeriesModel.coordinateSystem;\n      if (targetCoordSys && targetCoordSys.master) {\n        targetCoordSys = targetCoordSys.master;\n      }\n      var blurredSeries = [];\n      ecModel.eachSeries(function (seriesModel) {\n        var sameSeries = targetSeriesModel === seriesModel;\n        var coordSys = seriesModel.coordinateSystem;\n        if (coordSys && coordSys.master) {\n          coordSys = coordSys.master;\n        }\n        var sameCoordSys = coordSys && targetCoordSys ? coordSys === targetCoordSys : sameSeries; // If there is no coordinate system. use sameSeries instead.\n        if (!(\n        // Not blur other series if blurScope series\n        blurScope === 'series' && !sameSeries\n        // Not blur other coordinate system if blurScope is coordinateSystem\n        || blurScope === 'coordinateSystem' && !sameCoordSys\n        // Not blur self series if focus is series.\n        || focus === 'series' && sameSeries\n        // TODO blurScope: coordinate system\n        )) {\n          var view = api.getViewOfSeriesModel(seriesModel);\n          view.group.traverse(function (child) {\n            // For the elements that have been triggered by other components,\n            // and are still required to be highlighted,\n            // because the current is directly forced to blur the element,\n            // it will cause the focus self to be unable to highlight, so skip the blur of this element.\n            if (child.__highByOuter && sameSeries && focus === 'self') {\n              return;\n            }\n            singleEnterBlur(child);\n          });\n          if (isArrayLike(focus)) {\n            leaveBlurOfIndices(seriesModel.getData(), focus);\n          } else if (isObject(focus)) {\n            var dataTypes = keys(focus);\n            for (var d = 0; d < dataTypes.length; d++) {\n              leaveBlurOfIndices(seriesModel.getData(dataTypes[d]), focus[dataTypes[d]]);\n            }\n          }\n          blurredSeries.push(seriesModel);\n          getComponentStates(seriesModel).isBlured = true;\n        }\n      });\n      ecModel.eachComponent(function (componentType, componentModel) {\n        if (componentType === 'series') {\n          return;\n        }\n        var view = api.getViewOfComponentModel(componentModel);\n        if (view && view.toggleBlurSeries) {\n          view.toggleBlurSeries(blurredSeries, true, ecModel);\n        }\n      });\n    }\n    function blurComponent(componentMainType, componentIndex, api) {\n      if (componentMainType == null || componentIndex == null) {\n        return;\n      }\n      var componentModel = api.getModel().getComponent(componentMainType, componentIndex);\n      if (!componentModel) {\n        return;\n      }\n      getComponentStates(componentModel).isBlured = true;\n      var view = api.getViewOfComponentModel(componentModel);\n      if (!view || !view.focusBlurEnabled) {\n        return;\n      }\n      view.group.traverse(function (child) {\n        singleEnterBlur(child);\n      });\n    }\n    function blurSeriesFromHighlightPayload(seriesModel, payload, api) {\n      var seriesIndex = seriesModel.seriesIndex;\n      var data = seriesModel.getData(payload.dataType);\n      if (!data) {\n        if (\"development\" !== 'production') {\n          error(\"Unknown dataType \" + payload.dataType);\n        }\n        return;\n      }\n      var dataIndex = queryDataIndex(data, payload);\n      // Pick the first one if there is multiple/none exists.\n      dataIndex = (isArray(dataIndex) ? dataIndex[0] : dataIndex) || 0;\n      var el = data.getItemGraphicEl(dataIndex);\n      if (!el) {\n        var count = data.count();\n        var current = 0;\n        // If data on dataIndex is NaN.\n        while (!el && current < count) {\n          el = data.getItemGraphicEl(current++);\n        }\n      }\n      if (el) {\n        var ecData = getECData(el);\n        blurSeries(seriesIndex, ecData.focus, ecData.blurScope, api);\n      } else {\n        // If there is no element put on the data. Try getting it from raw option\n        // TODO Should put it on seriesModel?\n        var focus_1 = seriesModel.get(['emphasis', 'focus']);\n        var blurScope = seriesModel.get(['emphasis', 'blurScope']);\n        if (focus_1 != null) {\n          blurSeries(seriesIndex, focus_1, blurScope, api);\n        }\n      }\n    }\n    function findComponentHighDownDispatchers(componentMainType, componentIndex, name, api) {\n      var ret = {\n        focusSelf: false,\n        dispatchers: null\n      };\n      if (componentMainType == null || componentMainType === 'series' || componentIndex == null || name == null) {\n        return ret;\n      }\n      var componentModel = api.getModel().getComponent(componentMainType, componentIndex);\n      if (!componentModel) {\n        return ret;\n      }\n      var view = api.getViewOfComponentModel(componentModel);\n      if (!view || !view.findHighDownDispatchers) {\n        return ret;\n      }\n      var dispatchers = view.findHighDownDispatchers(name);\n      // At presnet, the component (like Geo) only blur inside itself.\n      // So we do not use `blurScope` in component.\n      var focusSelf;\n      for (var i = 0; i < dispatchers.length; i++) {\n        if (\"development\" !== 'production' && !isHighDownDispatcher(dispatchers[i])) {\n          error('param should be highDownDispatcher');\n        }\n        if (getECData(dispatchers[i]).focus === 'self') {\n          focusSelf = true;\n          break;\n        }\n      }\n      return {\n        focusSelf: focusSelf,\n        dispatchers: dispatchers\n      };\n    }\n    function handleGlobalMouseOverForHighDown(dispatcher, e, api) {\n      if (\"development\" !== 'production' && !isHighDownDispatcher(dispatcher)) {\n        error('param should be highDownDispatcher');\n      }\n      var ecData = getECData(dispatcher);\n      var _a = findComponentHighDownDispatchers(ecData.componentMainType, ecData.componentIndex, ecData.componentHighDownName, api),\n        dispatchers = _a.dispatchers,\n        focusSelf = _a.focusSelf;\n      // If `findHighDownDispatchers` is supported on the component,\n      // highlight/downplay elements with the same name.\n      if (dispatchers) {\n        if (focusSelf) {\n          blurComponent(ecData.componentMainType, ecData.componentIndex, api);\n        }\n        each(dispatchers, function (dispatcher) {\n          return enterEmphasisWhenMouseOver(dispatcher, e);\n        });\n      } else {\n        // Try blur all in the related series. Then emphasis the hoverred.\n        // TODO. progressive mode.\n        blurSeries(ecData.seriesIndex, ecData.focus, ecData.blurScope, api);\n        if (ecData.focus === 'self') {\n          blurComponent(ecData.componentMainType, ecData.componentIndex, api);\n        }\n        // Other than series, component that not support `findHighDownDispatcher` will\n        // also use it. But in this case, highlight/downplay are only supported in\n        // mouse hover but not in dispatchAction.\n        enterEmphasisWhenMouseOver(dispatcher, e);\n      }\n    }\n    function handleGlobalMouseOutForHighDown(dispatcher, e, api) {\n      if (\"development\" !== 'production' && !isHighDownDispatcher(dispatcher)) {\n        error('param should be highDownDispatcher');\n      }\n      allLeaveBlur(api);\n      var ecData = getECData(dispatcher);\n      var dispatchers = findComponentHighDownDispatchers(ecData.componentMainType, ecData.componentIndex, ecData.componentHighDownName, api).dispatchers;\n      if (dispatchers) {\n        each(dispatchers, function (dispatcher) {\n          return leaveEmphasisWhenMouseOut(dispatcher, e);\n        });\n      } else {\n        leaveEmphasisWhenMouseOut(dispatcher, e);\n      }\n    }\n    function toggleSelectionFromPayload(seriesModel, payload, api) {\n      if (!isSelectChangePayload(payload)) {\n        return;\n      }\n      var dataType = payload.dataType;\n      var data = seriesModel.getData(dataType);\n      var dataIndex = queryDataIndex(data, payload);\n      if (!isArray(dataIndex)) {\n        dataIndex = [dataIndex];\n      }\n      seriesModel[payload.type === TOGGLE_SELECT_ACTION_TYPE ? 'toggleSelect' : payload.type === SELECT_ACTION_TYPE ? 'select' : 'unselect'](dataIndex, dataType);\n    }\n    function updateSeriesElementSelection(seriesModel) {\n      var allData = seriesModel.getAllData();\n      each(allData, function (_a) {\n        var data = _a.data,\n          type = _a.type;\n        data.eachItemGraphicEl(function (el, idx) {\n          seriesModel.isSelected(idx, type) ? enterSelect(el) : leaveSelect(el);\n        });\n      });\n    }\n    function getAllSelectedIndices(ecModel) {\n      var ret = [];\n      ecModel.eachSeries(function (seriesModel) {\n        var allData = seriesModel.getAllData();\n        each(allData, function (_a) {\n          var data = _a.data,\n            type = _a.type;\n          var dataIndices = seriesModel.getSelectedDataIndices();\n          if (dataIndices.length > 0) {\n            var item = {\n              dataIndex: dataIndices,\n              seriesIndex: seriesModel.seriesIndex\n            };\n            if (type != null) {\n              item.dataType = type;\n            }\n            ret.push(item);\n          }\n        });\n      });\n      return ret;\n    }\n    /**\r\n     * Enable the function that mouseover will trigger the emphasis state.\r\n     *\r\n     * NOTE:\r\n     * This function should be used on the element with dataIndex, seriesIndex.\r\n     *\r\n     */\n    function enableHoverEmphasis(el, focus, blurScope) {\n      setAsHighDownDispatcher(el, true);\n      traverseUpdateState(el, setDefaultStateProxy);\n      enableHoverFocus(el, focus, blurScope);\n    }\n    function disableHoverEmphasis(el) {\n      setAsHighDownDispatcher(el, false);\n    }\n    function toggleHoverEmphasis(el, focus, blurScope, isDisabled) {\n      isDisabled ? disableHoverEmphasis(el) : enableHoverEmphasis(el, focus, blurScope);\n    }\n    function enableHoverFocus(el, focus, blurScope) {\n      var ecData = getECData(el);\n      if (focus != null) {\n        // TODO dataIndex may be set after this function. This check is not useful.\n        // if (ecData.dataIndex == null) {\n        //     if (__DEV__) {\n        //         console.warn('focus can only been set on element with dataIndex');\n        //     }\n        // }\n        // else {\n        ecData.focus = focus;\n        ecData.blurScope = blurScope;\n        // }\n      } else if (ecData.focus) {\n        ecData.focus = null;\n      }\n    }\n    var OTHER_STATES = ['emphasis', 'blur', 'select'];\n    var defaultStyleGetterMap = {\n      itemStyle: 'getItemStyle',\n      lineStyle: 'getLineStyle',\n      areaStyle: 'getAreaStyle'\n    };\n    /**\r\n     * Set emphasis/blur/selected states of element.\r\n     */\n    function setStatesStylesFromModel(el, itemModel, styleType,\n    // default itemStyle\n    getter) {\n      styleType = styleType || 'itemStyle';\n      for (var i = 0; i < OTHER_STATES.length; i++) {\n        var stateName = OTHER_STATES[i];\n        var model = itemModel.getModel([stateName, styleType]);\n        var state = el.ensureState(stateName);\n        // Let it throw error if getterType is not found.\n        state.style = getter ? getter(model) : model[defaultStyleGetterMap[styleType]]();\n      }\n    }\n    /**\r\n     *\r\n     * Set element as highlight / downplay dispatcher.\r\n     * It will be checked when element received mouseover event or from highlight action.\r\n     * It's in change of all highlight/downplay behavior of it's children.\r\n     *\r\n     * @param el\r\n     * @param el.highDownSilentOnTouch\r\n     *        In touch device, mouseover event will be trigger on touchstart event\r\n     *        (see module:zrender/dom/HandlerProxy). By this mechanism, we can\r\n     *        conveniently use hoverStyle when tap on touch screen without additional\r\n     *        code for compatibility.\r\n     *        But if the chart/component has select feature, which usually also use\r\n     *        hoverStyle, there might be conflict between 'select-highlight' and\r\n     *        'hover-highlight' especially when roam is enabled (see geo for example).\r\n     *        In this case, `highDownSilentOnTouch` should be used to disable\r\n     *        hover-highlight on touch device.\r\n     * @param asDispatcher If `false`, do not set as \"highDownDispatcher\".\r\n     */\n    function setAsHighDownDispatcher(el, asDispatcher) {\n      var disable = asDispatcher === false;\n      var extendedEl = el;\n      // Make `highDownSilentOnTouch` and `onStateChange` only work after\n      // `setAsHighDownDispatcher` called. Avoid it is modified by user unexpectedly.\n      if (el.highDownSilentOnTouch) {\n        extendedEl.__highDownSilentOnTouch = el.highDownSilentOnTouch;\n      }\n      // Simple optimize, since this method might be\n      // called for each elements of a group in some cases.\n      if (!disable || extendedEl.__highDownDispatcher) {\n        // Emphasis, normal can be triggered manually by API or other components like hover link.\n        // el[method]('emphasis', onElementEmphasisEvent)[method]('normal', onElementNormalEvent);\n        // Also keep previous record.\n        extendedEl.__highByOuter = extendedEl.__highByOuter || 0;\n        extendedEl.__highDownDispatcher = !disable;\n      }\n    }\n    function isHighDownDispatcher(el) {\n      return !!(el && el.__highDownDispatcher);\n    }\n    /**\r\n     * Enable component highlight/downplay features:\r\n     * + hover link (within the same name)\r\n     * + focus blur in component\r\n     */\n    function enableComponentHighDownFeatures(el, componentModel, componentHighDownName) {\n      var ecData = getECData(el);\n      ecData.componentMainType = componentModel.mainType;\n      ecData.componentIndex = componentModel.componentIndex;\n      ecData.componentHighDownName = componentHighDownName;\n    }\n    /**\r\n     * Support highlight/downplay record on each elements.\r\n     * For the case: hover highlight/downplay (legend, visualMap, ...) and\r\n     * user triggered highlight/downplay should not conflict.\r\n     * Only all of the highlightDigit cleared, return to normal.\r\n     * @param {string} highlightKey\r\n     * @return {number} highlightDigit\r\n     */\n    function getHighlightDigit(highlightKey) {\n      var highlightDigit = _highlightKeyMap[highlightKey];\n      if (highlightDigit == null && _highlightNextDigit <= 32) {\n        highlightDigit = _highlightKeyMap[highlightKey] = _highlightNextDigit++;\n      }\n      return highlightDigit;\n    }\n    function isSelectChangePayload(payload) {\n      var payloadType = payload.type;\n      return payloadType === SELECT_ACTION_TYPE || payloadType === UNSELECT_ACTION_TYPE || payloadType === TOGGLE_SELECT_ACTION_TYPE;\n    }\n    function isHighDownPayload(payload) {\n      var payloadType = payload.type;\n      return payloadType === HIGHLIGHT_ACTION_TYPE || payloadType === DOWNPLAY_ACTION_TYPE;\n    }\n    function savePathStates(el) {\n      var store = getSavedStates(el);\n      store.normalFill = el.style.fill;\n      store.normalStroke = el.style.stroke;\n      var selectState = el.states.select || {};\n      store.selectFill = selectState.style && selectState.style.fill || null;\n      store.selectStroke = selectState.style && selectState.style.stroke || null;\n    }\n\n    var CMD$2 = PathProxy.CMD;\n    var points = [[], [], []];\n    var mathSqrt$1 = Math.sqrt;\n    var mathAtan2 = Math.atan2;\n    function transformPath(path, m) {\n        if (!m) {\n            return;\n        }\n        var data = path.data;\n        var len = path.len();\n        var cmd;\n        var nPoint;\n        var i;\n        var j;\n        var k;\n        var p;\n        var M = CMD$2.M;\n        var C = CMD$2.C;\n        var L = CMD$2.L;\n        var R = CMD$2.R;\n        var A = CMD$2.A;\n        var Q = CMD$2.Q;\n        for (i = 0, j = 0; i < len;) {\n            cmd = data[i++];\n            j = i;\n            nPoint = 0;\n            switch (cmd) {\n                case M:\n                    nPoint = 1;\n                    break;\n                case L:\n                    nPoint = 1;\n                    break;\n                case C:\n                    nPoint = 3;\n                    break;\n                case Q:\n                    nPoint = 2;\n                    break;\n                case A:\n                    var x = m[4];\n                    var y = m[5];\n                    var sx = mathSqrt$1(m[0] * m[0] + m[1] * m[1]);\n                    var sy = mathSqrt$1(m[2] * m[2] + m[3] * m[3]);\n                    var angle = mathAtan2(-m[1] / sy, m[0] / sx);\n                    data[i] *= sx;\n                    data[i++] += x;\n                    data[i] *= sy;\n                    data[i++] += y;\n                    data[i++] *= sx;\n                    data[i++] *= sy;\n                    data[i++] += angle;\n                    data[i++] += angle;\n                    i += 2;\n                    j = i;\n                    break;\n                case R:\n                    p[0] = data[i++];\n                    p[1] = data[i++];\n                    applyTransform(p, p, m);\n                    data[j++] = p[0];\n                    data[j++] = p[1];\n                    p[0] += data[i++];\n                    p[1] += data[i++];\n                    applyTransform(p, p, m);\n                    data[j++] = p[0];\n                    data[j++] = p[1];\n            }\n            for (k = 0; k < nPoint; k++) {\n                var p_1 = points[k];\n                p_1[0] = data[i++];\n                p_1[1] = data[i++];\n                applyTransform(p_1, p_1, m);\n                data[j++] = p_1[0];\n                data[j++] = p_1[1];\n            }\n        }\n        path.increaseVersion();\n    }\n\n    var mathSqrt$2 = Math.sqrt;\n    var mathSin$2 = Math.sin;\n    var mathCos$2 = Math.cos;\n    var PI$1 = Math.PI;\n    function vMag(v) {\n        return Math.sqrt(v[0] * v[0] + v[1] * v[1]);\n    }\n    function vRatio(u, v) {\n        return (u[0] * v[0] + u[1] * v[1]) / (vMag(u) * vMag(v));\n    }\n    function vAngle(u, v) {\n        return (u[0] * v[1] < u[1] * v[0] ? -1 : 1)\n            * Math.acos(vRatio(u, v));\n    }\n    function processArc(x1, y1, x2, y2, fa, fs, rx, ry, psiDeg, cmd, path) {\n        var psi = psiDeg * (PI$1 / 180.0);\n        var xp = mathCos$2(psi) * (x1 - x2) / 2.0\n            + mathSin$2(psi) * (y1 - y2) / 2.0;\n        var yp = -1 * mathSin$2(psi) * (x1 - x2) / 2.0\n            + mathCos$2(psi) * (y1 - y2) / 2.0;\n        var lambda = (xp * xp) / (rx * rx) + (yp * yp) / (ry * ry);\n        if (lambda > 1) {\n            rx *= mathSqrt$2(lambda);\n            ry *= mathSqrt$2(lambda);\n        }\n        var f = (fa === fs ? -1 : 1)\n            * mathSqrt$2((((rx * rx) * (ry * ry))\n                - ((rx * rx) * (yp * yp))\n                - ((ry * ry) * (xp * xp))) / ((rx * rx) * (yp * yp)\n                + (ry * ry) * (xp * xp))) || 0;\n        var cxp = f * rx * yp / ry;\n        var cyp = f * -ry * xp / rx;\n        var cx = (x1 + x2) / 2.0\n            + mathCos$2(psi) * cxp\n            - mathSin$2(psi) * cyp;\n        var cy = (y1 + y2) / 2.0\n            + mathSin$2(psi) * cxp\n            + mathCos$2(psi) * cyp;\n        var theta = vAngle([1, 0], [(xp - cxp) / rx, (yp - cyp) / ry]);\n        var u = [(xp - cxp) / rx, (yp - cyp) / ry];\n        var v = [(-1 * xp - cxp) / rx, (-1 * yp - cyp) / ry];\n        var dTheta = vAngle(u, v);\n        if (vRatio(u, v) <= -1) {\n            dTheta = PI$1;\n        }\n        if (vRatio(u, v) >= 1) {\n            dTheta = 0;\n        }\n        if (dTheta < 0) {\n            var n = Math.round(dTheta / PI$1 * 1e6) / 1e6;\n            dTheta = PI$1 * 2 + (n % 2) * PI$1;\n        }\n        path.addData(cmd, cx, cy, rx, ry, theta, dTheta, psi, fs);\n    }\n    var commandReg = /([mlvhzcqtsa])([^mlvhzcqtsa]*)/ig;\n    var numberReg = /-?([0-9]*\\.)?[0-9]+([eE]-?[0-9]+)?/g;\n    function createPathProxyFromString(data) {\n        var path = new PathProxy();\n        if (!data) {\n            return path;\n        }\n        var cpx = 0;\n        var cpy = 0;\n        var subpathX = cpx;\n        var subpathY = cpy;\n        var prevCmd;\n        var CMD = PathProxy.CMD;\n        var cmdList = data.match(commandReg);\n        if (!cmdList) {\n            return path;\n        }\n        for (var l = 0; l < cmdList.length; l++) {\n            var cmdText = cmdList[l];\n            var cmdStr = cmdText.charAt(0);\n            var cmd = void 0;\n            var p = cmdText.match(numberReg) || [];\n            var pLen = p.length;\n            for (var i = 0; i < pLen; i++) {\n                p[i] = parseFloat(p[i]);\n            }\n            var off = 0;\n            while (off < pLen) {\n                var ctlPtx = void 0;\n                var ctlPty = void 0;\n                var rx = void 0;\n                var ry = void 0;\n                var psi = void 0;\n                var fa = void 0;\n                var fs = void 0;\n                var x1 = cpx;\n                var y1 = cpy;\n                var len = void 0;\n                var pathData = void 0;\n                switch (cmdStr) {\n                    case 'l':\n                        cpx += p[off++];\n                        cpy += p[off++];\n                        cmd = CMD.L;\n                        path.addData(cmd, cpx, cpy);\n                        break;\n                    case 'L':\n                        cpx = p[off++];\n                        cpy = p[off++];\n                        cmd = CMD.L;\n                        path.addData(cmd, cpx, cpy);\n                        break;\n                    case 'm':\n                        cpx += p[off++];\n                        cpy += p[off++];\n                        cmd = CMD.M;\n                        path.addData(cmd, cpx, cpy);\n                        subpathX = cpx;\n                        subpathY = cpy;\n                        cmdStr = 'l';\n                        break;\n                    case 'M':\n                        cpx = p[off++];\n                        cpy = p[off++];\n                        cmd = CMD.M;\n                        path.addData(cmd, cpx, cpy);\n                        subpathX = cpx;\n                        subpathY = cpy;\n                        cmdStr = 'L';\n                        break;\n                    case 'h':\n                        cpx += p[off++];\n                        cmd = CMD.L;\n                        path.addData(cmd, cpx, cpy);\n                        break;\n                    case 'H':\n                        cpx = p[off++];\n                        cmd = CMD.L;\n                        path.addData(cmd, cpx, cpy);\n                        break;\n                    case 'v':\n                        cpy += p[off++];\n                        cmd = CMD.L;\n                        path.addData(cmd, cpx, cpy);\n                        break;\n                    case 'V':\n                        cpy = p[off++];\n                        cmd = CMD.L;\n                        path.addData(cmd, cpx, cpy);\n                        break;\n                    case 'C':\n                        cmd = CMD.C;\n                        path.addData(cmd, p[off++], p[off++], p[off++], p[off++], p[off++], p[off++]);\n                        cpx = p[off - 2];\n                        cpy = p[off - 1];\n                        break;\n                    case 'c':\n                        cmd = CMD.C;\n                        path.addData(cmd, p[off++] + cpx, p[off++] + cpy, p[off++] + cpx, p[off++] + cpy, p[off++] + cpx, p[off++] + cpy);\n                        cpx += p[off - 2];\n                        cpy += p[off - 1];\n                        break;\n                    case 'S':\n                        ctlPtx = cpx;\n                        ctlPty = cpy;\n                        len = path.len();\n                        pathData = path.data;\n                        if (prevCmd === CMD.C) {\n                            ctlPtx += cpx - pathData[len - 4];\n                            ctlPty += cpy - pathData[len - 3];\n                        }\n                        cmd = CMD.C;\n                        x1 = p[off++];\n                        y1 = p[off++];\n                        cpx = p[off++];\n                        cpy = p[off++];\n                        path.addData(cmd, ctlPtx, ctlPty, x1, y1, cpx, cpy);\n                        break;\n                    case 's':\n                        ctlPtx = cpx;\n                        ctlPty = cpy;\n                        len = path.len();\n                        pathData = path.data;\n                        if (prevCmd === CMD.C) {\n                            ctlPtx += cpx - pathData[len - 4];\n                            ctlPty += cpy - pathData[len - 3];\n                        }\n                        cmd = CMD.C;\n                        x1 = cpx + p[off++];\n                        y1 = cpy + p[off++];\n                        cpx += p[off++];\n                        cpy += p[off++];\n                        path.addData(cmd, ctlPtx, ctlPty, x1, y1, cpx, cpy);\n                        break;\n                    case 'Q':\n                        x1 = p[off++];\n                        y1 = p[off++];\n                        cpx = p[off++];\n                        cpy = p[off++];\n                        cmd = CMD.Q;\n                        path.addData(cmd, x1, y1, cpx, cpy);\n                        break;\n                    case 'q':\n                        x1 = p[off++] + cpx;\n                        y1 = p[off++] + cpy;\n                        cpx += p[off++];\n                        cpy += p[off++];\n                        cmd = CMD.Q;\n                        path.addData(cmd, x1, y1, cpx, cpy);\n                        break;\n                    case 'T':\n                        ctlPtx = cpx;\n                        ctlPty = cpy;\n                        len = path.len();\n                        pathData = path.data;\n                        if (prevCmd === CMD.Q) {\n                            ctlPtx += cpx - pathData[len - 4];\n                            ctlPty += cpy - pathData[len - 3];\n                        }\n                        cpx = p[off++];\n                        cpy = p[off++];\n                        cmd = CMD.Q;\n                        path.addData(cmd, ctlPtx, ctlPty, cpx, cpy);\n                        break;\n                    case 't':\n                        ctlPtx = cpx;\n                        ctlPty = cpy;\n                        len = path.len();\n                        pathData = path.data;\n                        if (prevCmd === CMD.Q) {\n                            ctlPtx += cpx - pathData[len - 4];\n                            ctlPty += cpy - pathData[len - 3];\n                        }\n                        cpx += p[off++];\n                        cpy += p[off++];\n                        cmd = CMD.Q;\n                        path.addData(cmd, ctlPtx, ctlPty, cpx, cpy);\n                        break;\n                    case 'A':\n                        rx = p[off++];\n                        ry = p[off++];\n                        psi = p[off++];\n                        fa = p[off++];\n                        fs = p[off++];\n                        x1 = cpx, y1 = cpy;\n                        cpx = p[off++];\n                        cpy = p[off++];\n                        cmd = CMD.A;\n                        processArc(x1, y1, cpx, cpy, fa, fs, rx, ry, psi, cmd, path);\n                        break;\n                    case 'a':\n                        rx = p[off++];\n                        ry = p[off++];\n                        psi = p[off++];\n                        fa = p[off++];\n                        fs = p[off++];\n                        x1 = cpx, y1 = cpy;\n                        cpx += p[off++];\n                        cpy += p[off++];\n                        cmd = CMD.A;\n                        processArc(x1, y1, cpx, cpy, fa, fs, rx, ry, psi, cmd, path);\n                        break;\n                }\n            }\n            if (cmdStr === 'z' || cmdStr === 'Z') {\n                cmd = CMD.Z;\n                path.addData(cmd);\n                cpx = subpathX;\n                cpy = subpathY;\n            }\n            prevCmd = cmd;\n        }\n        path.toStatic();\n        return path;\n    }\n    var SVGPath = (function (_super) {\n        __extends(SVGPath, _super);\n        function SVGPath() {\n            return _super !== null && _super.apply(this, arguments) || this;\n        }\n        SVGPath.prototype.applyTransform = function (m) { };\n        return SVGPath;\n    }(Path));\n    function isPathProxy(path) {\n        return path.setData != null;\n    }\n    function createPathOptions(str, opts) {\n        var pathProxy = createPathProxyFromString(str);\n        var innerOpts = extend({}, opts);\n        innerOpts.buildPath = function (path) {\n            if (isPathProxy(path)) {\n                path.setData(pathProxy.data);\n                var ctx = path.getContext();\n                if (ctx) {\n                    path.rebuildPath(ctx, 1);\n                }\n            }\n            else {\n                var ctx = path;\n                pathProxy.rebuildPath(ctx, 1);\n            }\n        };\n        innerOpts.applyTransform = function (m) {\n            transformPath(pathProxy, m);\n            this.dirtyShape();\n        };\n        return innerOpts;\n    }\n    function createFromString(str, opts) {\n        return new SVGPath(createPathOptions(str, opts));\n    }\n    function extendFromString(str, defaultOpts) {\n        var innerOpts = createPathOptions(str, defaultOpts);\n        var Sub = (function (_super) {\n            __extends(Sub, _super);\n            function Sub(opts) {\n                var _this = _super.call(this, opts) || this;\n                _this.applyTransform = innerOpts.applyTransform;\n                _this.buildPath = innerOpts.buildPath;\n                return _this;\n            }\n            return Sub;\n        }(SVGPath));\n        return Sub;\n    }\n    function mergePath(pathEls, opts) {\n        var pathList = [];\n        var len = pathEls.length;\n        for (var i = 0; i < len; i++) {\n            var pathEl = pathEls[i];\n            pathList.push(pathEl.getUpdatedPathProxy(true));\n        }\n        var pathBundle = new Path(opts);\n        pathBundle.createPathProxy();\n        pathBundle.buildPath = function (path) {\n            if (isPathProxy(path)) {\n                path.appendPath(pathList);\n                var ctx = path.getContext();\n                if (ctx) {\n                    path.rebuildPath(ctx, 1);\n                }\n            }\n        };\n        return pathBundle;\n    }\n    function clonePath(sourcePath, opts) {\n        opts = opts || {};\n        var path = new Path();\n        if (sourcePath.shape) {\n            path.setShape(sourcePath.shape);\n        }\n        path.setStyle(sourcePath.style);\n        if (opts.bakeTransform) {\n            transformPath(path.path, sourcePath.getComputedTransform());\n        }\n        else {\n            if (opts.toLocal) {\n                path.setLocalTransform(sourcePath.getComputedTransform());\n            }\n            else {\n                path.copyTransform(sourcePath);\n            }\n        }\n        path.buildPath = sourcePath.buildPath;\n        path.applyTransform = path.applyTransform;\n        path.z = sourcePath.z;\n        path.z2 = sourcePath.z2;\n        path.zlevel = sourcePath.zlevel;\n        return path;\n    }\n\n    var CircleShape = (function () {\n        function CircleShape() {\n            this.cx = 0;\n            this.cy = 0;\n            this.r = 0;\n        }\n        return CircleShape;\n    }());\n    var Circle = (function (_super) {\n        __extends(Circle, _super);\n        function Circle(opts) {\n            return _super.call(this, opts) || this;\n        }\n        Circle.prototype.getDefaultShape = function () {\n            return new CircleShape();\n        };\n        Circle.prototype.buildPath = function (ctx, shape) {\n            ctx.moveTo(shape.cx + shape.r, shape.cy);\n            ctx.arc(shape.cx, shape.cy, shape.r, 0, Math.PI * 2);\n        };\n        return Circle;\n    }(Path));\n    Circle.prototype.type = 'circle';\n\n    var EllipseShape = (function () {\n        function EllipseShape() {\n            this.cx = 0;\n            this.cy = 0;\n            this.rx = 0;\n            this.ry = 0;\n        }\n        return EllipseShape;\n    }());\n    var Ellipse = (function (_super) {\n        __extends(Ellipse, _super);\n        function Ellipse(opts) {\n            return _super.call(this, opts) || this;\n        }\n        Ellipse.prototype.getDefaultShape = function () {\n            return new EllipseShape();\n        };\n        Ellipse.prototype.buildPath = function (ctx, shape) {\n            var k = 0.5522848;\n            var x = shape.cx;\n            var y = shape.cy;\n            var a = shape.rx;\n            var b = shape.ry;\n            var ox = a * k;\n            var oy = b * k;\n            ctx.moveTo(x - a, y);\n            ctx.bezierCurveTo(x - a, y - oy, x - ox, y - b, x, y - b);\n            ctx.bezierCurveTo(x + ox, y - b, x + a, y - oy, x + a, y);\n            ctx.bezierCurveTo(x + a, y + oy, x + ox, y + b, x, y + b);\n            ctx.bezierCurveTo(x - ox, y + b, x - a, y + oy, x - a, y);\n            ctx.closePath();\n        };\n        return Ellipse;\n    }(Path));\n    Ellipse.prototype.type = 'ellipse';\n\n    var PI$2 = Math.PI;\n    var PI2$5 = PI$2 * 2;\n    var mathSin$3 = Math.sin;\n    var mathCos$3 = Math.cos;\n    var mathACos = Math.acos;\n    var mathATan2 = Math.atan2;\n    var mathAbs$1 = Math.abs;\n    var mathSqrt$3 = Math.sqrt;\n    var mathMax$3 = Math.max;\n    var mathMin$3 = Math.min;\n    var e = 1e-4;\n    function intersect(x0, y0, x1, y1, x2, y2, x3, y3) {\n        var dx10 = x1 - x0;\n        var dy10 = y1 - y0;\n        var dx32 = x3 - x2;\n        var dy32 = y3 - y2;\n        var t = dy32 * dx10 - dx32 * dy10;\n        if (t * t < e) {\n            return;\n        }\n        t = (dx32 * (y0 - y2) - dy32 * (x0 - x2)) / t;\n        return [x0 + t * dx10, y0 + t * dy10];\n    }\n    function computeCornerTangents(x0, y0, x1, y1, radius, cr, clockwise) {\n        var x01 = x0 - x1;\n        var y01 = y0 - y1;\n        var lo = (clockwise ? cr : -cr) / mathSqrt$3(x01 * x01 + y01 * y01);\n        var ox = lo * y01;\n        var oy = -lo * x01;\n        var x11 = x0 + ox;\n        var y11 = y0 + oy;\n        var x10 = x1 + ox;\n        var y10 = y1 + oy;\n        var x00 = (x11 + x10) / 2;\n        var y00 = (y11 + y10) / 2;\n        var dx = x10 - x11;\n        var dy = y10 - y11;\n        var d2 = dx * dx + dy * dy;\n        var r = radius - cr;\n        var s = x11 * y10 - x10 * y11;\n        var d = (dy < 0 ? -1 : 1) * mathSqrt$3(mathMax$3(0, r * r * d2 - s * s));\n        var cx0 = (s * dy - dx * d) / d2;\n        var cy0 = (-s * dx - dy * d) / d2;\n        var cx1 = (s * dy + dx * d) / d2;\n        var cy1 = (-s * dx + dy * d) / d2;\n        var dx0 = cx0 - x00;\n        var dy0 = cy0 - y00;\n        var dx1 = cx1 - x00;\n        var dy1 = cy1 - y00;\n        if (dx0 * dx0 + dy0 * dy0 > dx1 * dx1 + dy1 * dy1) {\n            cx0 = cx1;\n            cy0 = cy1;\n        }\n        return {\n            cx: cx0,\n            cy: cy0,\n            x0: -ox,\n            y0: -oy,\n            x1: cx0 * (radius / r - 1),\n            y1: cy0 * (radius / r - 1)\n        };\n    }\n    function normalizeCornerRadius(cr) {\n        var arr;\n        if (isArray(cr)) {\n            var len = cr.length;\n            if (!len) {\n                return cr;\n            }\n            if (len === 1) {\n                arr = [cr[0], cr[0], 0, 0];\n            }\n            else if (len === 2) {\n                arr = [cr[0], cr[0], cr[1], cr[1]];\n            }\n            else if (len === 3) {\n                arr = cr.concat(cr[2]);\n            }\n            else {\n                arr = cr;\n            }\n        }\n        else {\n            arr = [cr, cr, cr, cr];\n        }\n        return arr;\n    }\n    function buildPath$1(ctx, shape) {\n        var _a;\n        var radius = mathMax$3(shape.r, 0);\n        var innerRadius = mathMax$3(shape.r0 || 0, 0);\n        var hasRadius = radius > 0;\n        var hasInnerRadius = innerRadius > 0;\n        if (!hasRadius && !hasInnerRadius) {\n            return;\n        }\n        if (!hasRadius) {\n            radius = innerRadius;\n            innerRadius = 0;\n        }\n        if (innerRadius > radius) {\n            var tmp = radius;\n            radius = innerRadius;\n            innerRadius = tmp;\n        }\n        var startAngle = shape.startAngle, endAngle = shape.endAngle;\n        if (isNaN(startAngle) || isNaN(endAngle)) {\n            return;\n        }\n        var cx = shape.cx, cy = shape.cy;\n        var clockwise = !!shape.clockwise;\n        var arc = mathAbs$1(endAngle - startAngle);\n        var mod = arc > PI2$5 && arc % PI2$5;\n        mod > e && (arc = mod);\n        if (!(radius > e)) {\n            ctx.moveTo(cx, cy);\n        }\n        else if (arc > PI2$5 - e) {\n            ctx.moveTo(cx + radius * mathCos$3(startAngle), cy + radius * mathSin$3(startAngle));\n            ctx.arc(cx, cy, radius, startAngle, endAngle, !clockwise);\n            if (innerRadius > e) {\n                ctx.moveTo(cx + innerRadius * mathCos$3(endAngle), cy + innerRadius * mathSin$3(endAngle));\n                ctx.arc(cx, cy, innerRadius, endAngle, startAngle, clockwise);\n            }\n        }\n        else {\n            var icrStart = void 0;\n            var icrEnd = void 0;\n            var ocrStart = void 0;\n            var ocrEnd = void 0;\n            var ocrs = void 0;\n            var ocre = void 0;\n            var icrs = void 0;\n            var icre = void 0;\n            var ocrMax = void 0;\n            var icrMax = void 0;\n            var limitedOcrMax = void 0;\n            var limitedIcrMax = void 0;\n            var xre = void 0;\n            var yre = void 0;\n            var xirs = void 0;\n            var yirs = void 0;\n            var xrs = radius * mathCos$3(startAngle);\n            var yrs = radius * mathSin$3(startAngle);\n            var xire = innerRadius * mathCos$3(endAngle);\n            var yire = innerRadius * mathSin$3(endAngle);\n            var hasArc = arc > e;\n            if (hasArc) {\n                var cornerRadius = shape.cornerRadius;\n                if (cornerRadius) {\n                    _a = normalizeCornerRadius(cornerRadius), icrStart = _a[0], icrEnd = _a[1], ocrStart = _a[2], ocrEnd = _a[3];\n                }\n                var halfRd = mathAbs$1(radius - innerRadius) / 2;\n                ocrs = mathMin$3(halfRd, ocrStart);\n                ocre = mathMin$3(halfRd, ocrEnd);\n                icrs = mathMin$3(halfRd, icrStart);\n                icre = mathMin$3(halfRd, icrEnd);\n                limitedOcrMax = ocrMax = mathMax$3(ocrs, ocre);\n                limitedIcrMax = icrMax = mathMax$3(icrs, icre);\n                if (ocrMax > e || icrMax > e) {\n                    xre = radius * mathCos$3(endAngle);\n                    yre = radius * mathSin$3(endAngle);\n                    xirs = innerRadius * mathCos$3(startAngle);\n                    yirs = innerRadius * mathSin$3(startAngle);\n                    if (arc < PI$2) {\n                        var it_1 = intersect(xrs, yrs, xirs, yirs, xre, yre, xire, yire);\n                        if (it_1) {\n                            var x0 = xrs - it_1[0];\n                            var y0 = yrs - it_1[1];\n                            var x1 = xre - it_1[0];\n                            var y1 = yre - it_1[1];\n                            var a = 1 / mathSin$3(mathACos((x0 * x1 + y0 * y1) / (mathSqrt$3(x0 * x0 + y0 * y0) * mathSqrt$3(x1 * x1 + y1 * y1))) / 2);\n                            var b = mathSqrt$3(it_1[0] * it_1[0] + it_1[1] * it_1[1]);\n                            limitedOcrMax = mathMin$3(ocrMax, (radius - b) / (a + 1));\n                            limitedIcrMax = mathMin$3(icrMax, (innerRadius - b) / (a - 1));\n                        }\n                    }\n                }\n            }\n            if (!hasArc) {\n                ctx.moveTo(cx + xrs, cy + yrs);\n            }\n            else if (limitedOcrMax > e) {\n                var crStart = mathMin$3(ocrStart, limitedOcrMax);\n                var crEnd = mathMin$3(ocrEnd, limitedOcrMax);\n                var ct0 = computeCornerTangents(xirs, yirs, xrs, yrs, radius, crStart, clockwise);\n                var ct1 = computeCornerTangents(xre, yre, xire, yire, radius, crEnd, clockwise);\n                ctx.moveTo(cx + ct0.cx + ct0.x0, cy + ct0.cy + ct0.y0);\n                if (limitedOcrMax < ocrMax && crStart === crEnd) {\n                    ctx.arc(cx + ct0.cx, cy + ct0.cy, limitedOcrMax, mathATan2(ct0.y0, ct0.x0), mathATan2(ct1.y0, ct1.x0), !clockwise);\n                }\n                else {\n                    crStart > 0 && ctx.arc(cx + ct0.cx, cy + ct0.cy, crStart, mathATan2(ct0.y0, ct0.x0), mathATan2(ct0.y1, ct0.x1), !clockwise);\n                    ctx.arc(cx, cy, radius, mathATan2(ct0.cy + ct0.y1, ct0.cx + ct0.x1), mathATan2(ct1.cy + ct1.y1, ct1.cx + ct1.x1), !clockwise);\n                    crEnd > 0 && ctx.arc(cx + ct1.cx, cy + ct1.cy, crEnd, mathATan2(ct1.y1, ct1.x1), mathATan2(ct1.y0, ct1.x0), !clockwise);\n                }\n            }\n            else {\n                ctx.moveTo(cx + xrs, cy + yrs);\n                ctx.arc(cx, cy, radius, startAngle, endAngle, !clockwise);\n            }\n            if (!(innerRadius > e) || !hasArc) {\n                ctx.lineTo(cx + xire, cy + yire);\n            }\n            else if (limitedIcrMax > e) {\n                var crStart = mathMin$3(icrStart, limitedIcrMax);\n                var crEnd = mathMin$3(icrEnd, limitedIcrMax);\n                var ct0 = computeCornerTangents(xire, yire, xre, yre, innerRadius, -crEnd, clockwise);\n                var ct1 = computeCornerTangents(xrs, yrs, xirs, yirs, innerRadius, -crStart, clockwise);\n                ctx.lineTo(cx + ct0.cx + ct0.x0, cy + ct0.cy + ct0.y0);\n                if (limitedIcrMax < icrMax && crStart === crEnd) {\n                    ctx.arc(cx + ct0.cx, cy + ct0.cy, limitedIcrMax, mathATan2(ct0.y0, ct0.x0), mathATan2(ct1.y0, ct1.x0), !clockwise);\n                }\n                else {\n                    crEnd > 0 && ctx.arc(cx + ct0.cx, cy + ct0.cy, crEnd, mathATan2(ct0.y0, ct0.x0), mathATan2(ct0.y1, ct0.x1), !clockwise);\n                    ctx.arc(cx, cy, innerRadius, mathATan2(ct0.cy + ct0.y1, ct0.cx + ct0.x1), mathATan2(ct1.cy + ct1.y1, ct1.cx + ct1.x1), clockwise);\n                    crStart > 0 && ctx.arc(cx + ct1.cx, cy + ct1.cy, crStart, mathATan2(ct1.y1, ct1.x1), mathATan2(ct1.y0, ct1.x0), !clockwise);\n                }\n            }\n            else {\n                ctx.lineTo(cx + xire, cy + yire);\n                ctx.arc(cx, cy, innerRadius, endAngle, startAngle, clockwise);\n            }\n        }\n        ctx.closePath();\n    }\n\n    var SectorShape = (function () {\n        function SectorShape() {\n            this.cx = 0;\n            this.cy = 0;\n            this.r0 = 0;\n            this.r = 0;\n            this.startAngle = 0;\n            this.endAngle = Math.PI * 2;\n            this.clockwise = true;\n            this.cornerRadius = 0;\n        }\n        return SectorShape;\n    }());\n    var Sector = (function (_super) {\n        __extends(Sector, _super);\n        function Sector(opts) {\n            return _super.call(this, opts) || this;\n        }\n        Sector.prototype.getDefaultShape = function () {\n            return new SectorShape();\n        };\n        Sector.prototype.buildPath = function (ctx, shape) {\n            buildPath$1(ctx, shape);\n        };\n        Sector.prototype.isZeroArea = function () {\n            return this.shape.startAngle === this.shape.endAngle\n                || this.shape.r === this.shape.r0;\n        };\n        return Sector;\n    }(Path));\n    Sector.prototype.type = 'sector';\n\n    var RingShape = (function () {\n        function RingShape() {\n            this.cx = 0;\n            this.cy = 0;\n            this.r = 0;\n            this.r0 = 0;\n        }\n        return RingShape;\n    }());\n    var Ring = (function (_super) {\n        __extends(Ring, _super);\n        function Ring(opts) {\n            return _super.call(this, opts) || this;\n        }\n        Ring.prototype.getDefaultShape = function () {\n            return new RingShape();\n        };\n        Ring.prototype.buildPath = function (ctx, shape) {\n            var x = shape.cx;\n            var y = shape.cy;\n            var PI2 = Math.PI * 2;\n            ctx.moveTo(x + shape.r, y);\n            ctx.arc(x, y, shape.r, 0, PI2, false);\n            ctx.moveTo(x + shape.r0, y);\n            ctx.arc(x, y, shape.r0, 0, PI2, true);\n        };\n        return Ring;\n    }(Path));\n    Ring.prototype.type = 'ring';\n\n    function smoothBezier(points, smooth, isLoop, constraint) {\n        var cps = [];\n        var v = [];\n        var v1 = [];\n        var v2 = [];\n        var prevPoint;\n        var nextPoint;\n        var min$1;\n        var max$1;\n        if (constraint) {\n            min$1 = [Infinity, Infinity];\n            max$1 = [-Infinity, -Infinity];\n            for (var i = 0, len = points.length; i < len; i++) {\n                min(min$1, min$1, points[i]);\n                max(max$1, max$1, points[i]);\n            }\n            min(min$1, min$1, constraint[0]);\n            max(max$1, max$1, constraint[1]);\n        }\n        for (var i = 0, len = points.length; i < len; i++) {\n            var point = points[i];\n            if (isLoop) {\n                prevPoint = points[i ? i - 1 : len - 1];\n                nextPoint = points[(i + 1) % len];\n            }\n            else {\n                if (i === 0 || i === len - 1) {\n                    cps.push(clone$1(points[i]));\n                    continue;\n                }\n                else {\n                    prevPoint = points[i - 1];\n                    nextPoint = points[i + 1];\n                }\n            }\n            sub(v, nextPoint, prevPoint);\n            scale(v, v, smooth);\n            var d0 = distance(point, prevPoint);\n            var d1 = distance(point, nextPoint);\n            var sum = d0 + d1;\n            if (sum !== 0) {\n                d0 /= sum;\n                d1 /= sum;\n            }\n            scale(v1, v, -d0);\n            scale(v2, v, d1);\n            var cp0 = add([], point, v1);\n            var cp1 = add([], point, v2);\n            if (constraint) {\n                max(cp0, cp0, min$1);\n                min(cp0, cp0, max$1);\n                max(cp1, cp1, min$1);\n                min(cp1, cp1, max$1);\n            }\n            cps.push(cp0);\n            cps.push(cp1);\n        }\n        if (isLoop) {\n            cps.push(cps.shift());\n        }\n        return cps;\n    }\n\n    function buildPath$2(ctx, shape, closePath) {\n        var smooth = shape.smooth;\n        var points = shape.points;\n        if (points && points.length >= 2) {\n            if (smooth) {\n                var controlPoints = smoothBezier(points, smooth, closePath, shape.smoothConstraint);\n                ctx.moveTo(points[0][0], points[0][1]);\n                var len = points.length;\n                for (var i = 0; i < (closePath ? len : len - 1); i++) {\n                    var cp1 = controlPoints[i * 2];\n                    var cp2 = controlPoints[i * 2 + 1];\n                    var p = points[(i + 1) % len];\n                    ctx.bezierCurveTo(cp1[0], cp1[1], cp2[0], cp2[1], p[0], p[1]);\n                }\n            }\n            else {\n                ctx.moveTo(points[0][0], points[0][1]);\n                for (var i = 1, l = points.length; i < l; i++) {\n                    ctx.lineTo(points[i][0], points[i][1]);\n                }\n            }\n            closePath && ctx.closePath();\n        }\n    }\n\n    var PolygonShape = (function () {\n        function PolygonShape() {\n            this.points = null;\n            this.smooth = 0;\n            this.smoothConstraint = null;\n        }\n        return PolygonShape;\n    }());\n    var Polygon = (function (_super) {\n        __extends(Polygon, _super);\n        function Polygon(opts) {\n            return _super.call(this, opts) || this;\n        }\n        Polygon.prototype.getDefaultShape = function () {\n            return new PolygonShape();\n        };\n        Polygon.prototype.buildPath = function (ctx, shape) {\n            buildPath$2(ctx, shape, true);\n        };\n        return Polygon;\n    }(Path));\n    Polygon.prototype.type = 'polygon';\n\n    var PolylineShape = (function () {\n        function PolylineShape() {\n            this.points = null;\n            this.percent = 1;\n            this.smooth = 0;\n            this.smoothConstraint = null;\n        }\n        return PolylineShape;\n    }());\n    var Polyline = (function (_super) {\n        __extends(Polyline, _super);\n        function Polyline(opts) {\n            return _super.call(this, opts) || this;\n        }\n        Polyline.prototype.getDefaultStyle = function () {\n            return {\n                stroke: '#000',\n                fill: null\n            };\n        };\n        Polyline.prototype.getDefaultShape = function () {\n            return new PolylineShape();\n        };\n        Polyline.prototype.buildPath = function (ctx, shape) {\n            buildPath$2(ctx, shape, false);\n        };\n        return Polyline;\n    }(Path));\n    Polyline.prototype.type = 'polyline';\n\n    var subPixelOptimizeOutputShape$1 = {};\n    var LineShape = (function () {\n        function LineShape() {\n            this.x1 = 0;\n            this.y1 = 0;\n            this.x2 = 0;\n            this.y2 = 0;\n            this.percent = 1;\n        }\n        return LineShape;\n    }());\n    var Line = (function (_super) {\n        __extends(Line, _super);\n        function Line(opts) {\n            return _super.call(this, opts) || this;\n        }\n        Line.prototype.getDefaultStyle = function () {\n            return {\n                stroke: '#000',\n                fill: null\n            };\n        };\n        Line.prototype.getDefaultShape = function () {\n            return new LineShape();\n        };\n        Line.prototype.buildPath = function (ctx, shape) {\n            var x1;\n            var y1;\n            var x2;\n            var y2;\n            if (this.subPixelOptimize) {\n                var optimizedShape = subPixelOptimizeLine(subPixelOptimizeOutputShape$1, shape, this.style);\n                x1 = optimizedShape.x1;\n                y1 = optimizedShape.y1;\n                x2 = optimizedShape.x2;\n                y2 = optimizedShape.y2;\n            }\n            else {\n                x1 = shape.x1;\n                y1 = shape.y1;\n                x2 = shape.x2;\n                y2 = shape.y2;\n            }\n            var percent = shape.percent;\n            if (percent === 0) {\n                return;\n            }\n            ctx.moveTo(x1, y1);\n            if (percent < 1) {\n                x2 = x1 * (1 - percent) + x2 * percent;\n                y2 = y1 * (1 - percent) + y2 * percent;\n            }\n            ctx.lineTo(x2, y2);\n        };\n        Line.prototype.pointAt = function (p) {\n            var shape = this.shape;\n            return [\n                shape.x1 * (1 - p) + shape.x2 * p,\n                shape.y1 * (1 - p) + shape.y2 * p\n            ];\n        };\n        return Line;\n    }(Path));\n    Line.prototype.type = 'line';\n\n    var out = [];\n    var BezierCurveShape = (function () {\n        function BezierCurveShape() {\n            this.x1 = 0;\n            this.y1 = 0;\n            this.x2 = 0;\n            this.y2 = 0;\n            this.cpx1 = 0;\n            this.cpy1 = 0;\n            this.percent = 1;\n        }\n        return BezierCurveShape;\n    }());\n    function someVectorAt(shape, t, isTangent) {\n        var cpx2 = shape.cpx2;\n        var cpy2 = shape.cpy2;\n        if (cpx2 != null || cpy2 != null) {\n            return [\n                (isTangent ? cubicDerivativeAt : cubicAt)(shape.x1, shape.cpx1, shape.cpx2, shape.x2, t),\n                (isTangent ? cubicDerivativeAt : cubicAt)(shape.y1, shape.cpy1, shape.cpy2, shape.y2, t)\n            ];\n        }\n        else {\n            return [\n                (isTangent ? quadraticDerivativeAt : quadraticAt)(shape.x1, shape.cpx1, shape.x2, t),\n                (isTangent ? quadraticDerivativeAt : quadraticAt)(shape.y1, shape.cpy1, shape.y2, t)\n            ];\n        }\n    }\n    var BezierCurve = (function (_super) {\n        __extends(BezierCurve, _super);\n        function BezierCurve(opts) {\n            return _super.call(this, opts) || this;\n        }\n        BezierCurve.prototype.getDefaultStyle = function () {\n            return {\n                stroke: '#000',\n                fill: null\n            };\n        };\n        BezierCurve.prototype.getDefaultShape = function () {\n            return new BezierCurveShape();\n        };\n        BezierCurve.prototype.buildPath = function (ctx, shape) {\n            var x1 = shape.x1;\n            var y1 = shape.y1;\n            var x2 = shape.x2;\n            var y2 = shape.y2;\n            var cpx1 = shape.cpx1;\n            var cpy1 = shape.cpy1;\n            var cpx2 = shape.cpx2;\n            var cpy2 = shape.cpy2;\n            var percent = shape.percent;\n            if (percent === 0) {\n                return;\n            }\n            ctx.moveTo(x1, y1);\n            if (cpx2 == null || cpy2 == null) {\n                if (percent < 1) {\n                    quadraticSubdivide(x1, cpx1, x2, percent, out);\n                    cpx1 = out[1];\n                    x2 = out[2];\n                    quadraticSubdivide(y1, cpy1, y2, percent, out);\n                    cpy1 = out[1];\n                    y2 = out[2];\n                }\n                ctx.quadraticCurveTo(cpx1, cpy1, x2, y2);\n            }\n            else {\n                if (percent < 1) {\n                    cubicSubdivide(x1, cpx1, cpx2, x2, percent, out);\n                    cpx1 = out[1];\n                    cpx2 = out[2];\n                    x2 = out[3];\n                    cubicSubdivide(y1, cpy1, cpy2, y2, percent, out);\n                    cpy1 = out[1];\n                    cpy2 = out[2];\n                    y2 = out[3];\n                }\n                ctx.bezierCurveTo(cpx1, cpy1, cpx2, cpy2, x2, y2);\n            }\n        };\n        BezierCurve.prototype.pointAt = function (t) {\n            return someVectorAt(this.shape, t, false);\n        };\n        BezierCurve.prototype.tangentAt = function (t) {\n            var p = someVectorAt(this.shape, t, true);\n            return normalize(p, p);\n        };\n        return BezierCurve;\n    }(Path));\n    BezierCurve.prototype.type = 'bezier-curve';\n\n    var ArcShape = (function () {\n        function ArcShape() {\n            this.cx = 0;\n            this.cy = 0;\n            this.r = 0;\n            this.startAngle = 0;\n            this.endAngle = Math.PI * 2;\n            this.clockwise = true;\n        }\n        return ArcShape;\n    }());\n    var Arc = (function (_super) {\n        __extends(Arc, _super);\n        function Arc(opts) {\n            return _super.call(this, opts) || this;\n        }\n        Arc.prototype.getDefaultStyle = function () {\n            return {\n                stroke: '#000',\n                fill: null\n            };\n        };\n        Arc.prototype.getDefaultShape = function () {\n            return new ArcShape();\n        };\n        Arc.prototype.buildPath = function (ctx, shape) {\n            var x = shape.cx;\n            var y = shape.cy;\n            var r = Math.max(shape.r, 0);\n            var startAngle = shape.startAngle;\n            var endAngle = shape.endAngle;\n            var clockwise = shape.clockwise;\n            var unitX = Math.cos(startAngle);\n            var unitY = Math.sin(startAngle);\n            ctx.moveTo(unitX * r + x, unitY * r + y);\n            ctx.arc(x, y, r, startAngle, endAngle, !clockwise);\n        };\n        return Arc;\n    }(Path));\n    Arc.prototype.type = 'arc';\n\n    var CompoundPath = (function (_super) {\n        __extends(CompoundPath, _super);\n        function CompoundPath() {\n            var _this = _super !== null && _super.apply(this, arguments) || this;\n            _this.type = 'compound';\n            return _this;\n        }\n        CompoundPath.prototype._updatePathDirty = function () {\n            var paths = this.shape.paths;\n            var dirtyPath = this.shapeChanged();\n            for (var i = 0; i < paths.length; i++) {\n                dirtyPath = dirtyPath || paths[i].shapeChanged();\n            }\n            if (dirtyPath) {\n                this.dirtyShape();\n            }\n        };\n        CompoundPath.prototype.beforeBrush = function () {\n            this._updatePathDirty();\n            var paths = this.shape.paths || [];\n            var scale = this.getGlobalScale();\n            for (var i = 0; i < paths.length; i++) {\n                if (!paths[i].path) {\n                    paths[i].createPathProxy();\n                }\n                paths[i].path.setScale(scale[0], scale[1], paths[i].segmentIgnoreThreshold);\n            }\n        };\n        CompoundPath.prototype.buildPath = function (ctx, shape) {\n            var paths = shape.paths || [];\n            for (var i = 0; i < paths.length; i++) {\n                paths[i].buildPath(ctx, paths[i].shape, true);\n            }\n        };\n        CompoundPath.prototype.afterBrush = function () {\n            var paths = this.shape.paths || [];\n            for (var i = 0; i < paths.length; i++) {\n                paths[i].pathUpdated();\n            }\n        };\n        CompoundPath.prototype.getBoundingRect = function () {\n            this._updatePathDirty.call(this);\n            return Path.prototype.getBoundingRect.call(this);\n        };\n        return CompoundPath;\n    }(Path));\n\n    var Gradient = (function () {\n        function Gradient(colorStops) {\n            this.colorStops = colorStops || [];\n        }\n        Gradient.prototype.addColorStop = function (offset, color) {\n            this.colorStops.push({\n                offset: offset,\n                color: color\n            });\n        };\n        return Gradient;\n    }());\n\n    var LinearGradient = (function (_super) {\n        __extends(LinearGradient, _super);\n        function LinearGradient(x, y, x2, y2, colorStops, globalCoord) {\n            var _this = _super.call(this, colorStops) || this;\n            _this.x = x == null ? 0 : x;\n            _this.y = y == null ? 0 : y;\n            _this.x2 = x2 == null ? 1 : x2;\n            _this.y2 = y2 == null ? 0 : y2;\n            _this.type = 'linear';\n            _this.global = globalCoord || false;\n            return _this;\n        }\n        return LinearGradient;\n    }(Gradient));\n\n    var RadialGradient = (function (_super) {\n        __extends(RadialGradient, _super);\n        function RadialGradient(x, y, r, colorStops, globalCoord) {\n            var _this = _super.call(this, colorStops) || this;\n            _this.x = x == null ? 0.5 : x;\n            _this.y = y == null ? 0.5 : y;\n            _this.r = r == null ? 0.5 : r;\n            _this.type = 'radial';\n            _this.global = globalCoord || false;\n            return _this;\n        }\n        return RadialGradient;\n    }(Gradient));\n\n    var extent = [0, 0];\n    var extent2 = [0, 0];\n    var minTv$1 = new Point();\n    var maxTv$1 = new Point();\n    var OrientedBoundingRect = (function () {\n        function OrientedBoundingRect(rect, transform) {\n            this._corners = [];\n            this._axes = [];\n            this._origin = [0, 0];\n            for (var i = 0; i < 4; i++) {\n                this._corners[i] = new Point();\n            }\n            for (var i = 0; i < 2; i++) {\n                this._axes[i] = new Point();\n            }\n            if (rect) {\n                this.fromBoundingRect(rect, transform);\n            }\n        }\n        OrientedBoundingRect.prototype.fromBoundingRect = function (rect, transform) {\n            var corners = this._corners;\n            var axes = this._axes;\n            var x = rect.x;\n            var y = rect.y;\n            var x2 = x + rect.width;\n            var y2 = y + rect.height;\n            corners[0].set(x, y);\n            corners[1].set(x2, y);\n            corners[2].set(x2, y2);\n            corners[3].set(x, y2);\n            if (transform) {\n                for (var i = 0; i < 4; i++) {\n                    corners[i].transform(transform);\n                }\n            }\n            Point.sub(axes[0], corners[1], corners[0]);\n            Point.sub(axes[1], corners[3], corners[0]);\n            axes[0].normalize();\n            axes[1].normalize();\n            for (var i = 0; i < 2; i++) {\n                this._origin[i] = axes[i].dot(corners[0]);\n            }\n        };\n        OrientedBoundingRect.prototype.intersect = function (other, mtv) {\n            var overlapped = true;\n            var noMtv = !mtv;\n            minTv$1.set(Infinity, Infinity);\n            maxTv$1.set(0, 0);\n            if (!this._intersectCheckOneSide(this, other, minTv$1, maxTv$1, noMtv, 1)) {\n                overlapped = false;\n                if (noMtv) {\n                    return overlapped;\n                }\n            }\n            if (!this._intersectCheckOneSide(other, this, minTv$1, maxTv$1, noMtv, -1)) {\n                overlapped = false;\n                if (noMtv) {\n                    return overlapped;\n                }\n            }\n            if (!noMtv) {\n                Point.copy(mtv, overlapped ? minTv$1 : maxTv$1);\n            }\n            return overlapped;\n        };\n        OrientedBoundingRect.prototype._intersectCheckOneSide = function (self, other, minTv, maxTv, noMtv, inverse) {\n            var overlapped = true;\n            for (var i = 0; i < 2; i++) {\n                var axis = this._axes[i];\n                this._getProjMinMaxOnAxis(i, self._corners, extent);\n                this._getProjMinMaxOnAxis(i, other._corners, extent2);\n                if (extent[1] < extent2[0] || extent[0] > extent2[1]) {\n                    overlapped = false;\n                    if (noMtv) {\n                        return overlapped;\n                    }\n                    var dist0 = Math.abs(extent2[0] - extent[1]);\n                    var dist1 = Math.abs(extent[0] - extent2[1]);\n                    if (Math.min(dist0, dist1) > maxTv.len()) {\n                        if (dist0 < dist1) {\n                            Point.scale(maxTv, axis, -dist0 * inverse);\n                        }\n                        else {\n                            Point.scale(maxTv, axis, dist1 * inverse);\n                        }\n                    }\n                }\n                else if (minTv) {\n                    var dist0 = Math.abs(extent2[0] - extent[1]);\n                    var dist1 = Math.abs(extent[0] - extent2[1]);\n                    if (Math.min(dist0, dist1) < minTv.len()) {\n                        if (dist0 < dist1) {\n                            Point.scale(minTv, axis, dist0 * inverse);\n                        }\n                        else {\n                            Point.scale(minTv, axis, -dist1 * inverse);\n                        }\n                    }\n                }\n            }\n            return overlapped;\n        };\n        OrientedBoundingRect.prototype._getProjMinMaxOnAxis = function (dim, corners, out) {\n            var axis = this._axes[dim];\n            var origin = this._origin;\n            var proj = corners[0].dot(axis) + origin[dim];\n            var min = proj;\n            var max = proj;\n            for (var i = 1; i < corners.length; i++) {\n                var proj_1 = corners[i].dot(axis) + origin[dim];\n                min = Math.min(proj_1, min);\n                max = Math.max(proj_1, max);\n            }\n            out[0] = min;\n            out[1] = max;\n        };\n        return OrientedBoundingRect;\n    }());\n\n    var m = [];\n    var IncrementalDisplayable = (function (_super) {\n        __extends(IncrementalDisplayable, _super);\n        function IncrementalDisplayable() {\n            var _this = _super !== null && _super.apply(this, arguments) || this;\n            _this.notClear = true;\n            _this.incremental = true;\n            _this._displayables = [];\n            _this._temporaryDisplayables = [];\n            _this._cursor = 0;\n            return _this;\n        }\n        IncrementalDisplayable.prototype.traverse = function (cb, context) {\n            cb.call(context, this);\n        };\n        IncrementalDisplayable.prototype.useStyle = function () {\n            this.style = {};\n        };\n        IncrementalDisplayable.prototype.getCursor = function () {\n            return this._cursor;\n        };\n        IncrementalDisplayable.prototype.innerAfterBrush = function () {\n            this._cursor = this._displayables.length;\n        };\n        IncrementalDisplayable.prototype.clearDisplaybles = function () {\n            this._displayables = [];\n            this._temporaryDisplayables = [];\n            this._cursor = 0;\n            this.markRedraw();\n            this.notClear = false;\n        };\n        IncrementalDisplayable.prototype.clearTemporalDisplayables = function () {\n            this._temporaryDisplayables = [];\n        };\n        IncrementalDisplayable.prototype.addDisplayable = function (displayable, notPersistent) {\n            if (notPersistent) {\n                this._temporaryDisplayables.push(displayable);\n            }\n            else {\n                this._displayables.push(displayable);\n            }\n            this.markRedraw();\n        };\n        IncrementalDisplayable.prototype.addDisplayables = function (displayables, notPersistent) {\n            notPersistent = notPersistent || false;\n            for (var i = 0; i < displayables.length; i++) {\n                this.addDisplayable(displayables[i], notPersistent);\n            }\n        };\n        IncrementalDisplayable.prototype.getDisplayables = function () {\n            return this._displayables;\n        };\n        IncrementalDisplayable.prototype.getTemporalDisplayables = function () {\n            return this._temporaryDisplayables;\n        };\n        IncrementalDisplayable.prototype.eachPendingDisplayable = function (cb) {\n            for (var i = this._cursor; i < this._displayables.length; i++) {\n                cb && cb(this._displayables[i]);\n            }\n            for (var i = 0; i < this._temporaryDisplayables.length; i++) {\n                cb && cb(this._temporaryDisplayables[i]);\n            }\n        };\n        IncrementalDisplayable.prototype.update = function () {\n            this.updateTransform();\n            for (var i = this._cursor; i < this._displayables.length; i++) {\n                var displayable = this._displayables[i];\n                displayable.parent = this;\n                displayable.update();\n                displayable.parent = null;\n            }\n            for (var i = 0; i < this._temporaryDisplayables.length; i++) {\n                var displayable = this._temporaryDisplayables[i];\n                displayable.parent = this;\n                displayable.update();\n                displayable.parent = null;\n            }\n        };\n        IncrementalDisplayable.prototype.getBoundingRect = function () {\n            if (!this._rect) {\n                var rect = new BoundingRect(Infinity, Infinity, -Infinity, -Infinity);\n                for (var i = 0; i < this._displayables.length; i++) {\n                    var displayable = this._displayables[i];\n                    var childRect = displayable.getBoundingRect().clone();\n                    if (displayable.needLocalTransform()) {\n                        childRect.applyTransform(displayable.getLocalTransform(m));\n                    }\n                    rect.union(childRect);\n                }\n                this._rect = rect;\n            }\n            return this._rect;\n        };\n        IncrementalDisplayable.prototype.contain = function (x, y) {\n            var localPos = this.transformCoordToLocal(x, y);\n            var rect = this.getBoundingRect();\n            if (rect.contain(localPos[0], localPos[1])) {\n                for (var i = 0; i < this._displayables.length; i++) {\n                    var displayable = this._displayables[i];\n                    if (displayable.contain(x, y)) {\n                        return true;\n                    }\n                }\n            }\n            return false;\n        };\n        return IncrementalDisplayable;\n    }(Displayable));\n\n    // Stored properties for further transition.\n    var transitionStore = makeInner();\n    /**\r\n     * Return null if animation is disabled.\r\n     */\n    function getAnimationConfig(animationType, animatableModel, dataIndex,\n    // Extra opts can override the option in animatable model.\n    extraOpts,\n    // TODO It's only for pictorial bar now.\n    extraDelayParams) {\n      var animationPayload;\n      // Check if there is global animation configuration from dataZoom/resize can override the config in option.\n      // If animation is enabled. Will use this animation config in payload.\n      // If animation is disabled. Just ignore it.\n      if (animatableModel && animatableModel.ecModel) {\n        var updatePayload = animatableModel.ecModel.getUpdatePayload();\n        animationPayload = updatePayload && updatePayload.animation;\n      }\n      var animationEnabled = animatableModel && animatableModel.isAnimationEnabled();\n      var isUpdate = animationType === 'update';\n      if (animationEnabled) {\n        var duration = void 0;\n        var easing = void 0;\n        var delay = void 0;\n        if (extraOpts) {\n          duration = retrieve2(extraOpts.duration, 200);\n          easing = retrieve2(extraOpts.easing, 'cubicOut');\n          delay = 0;\n        } else {\n          duration = animatableModel.getShallow(isUpdate ? 'animationDurationUpdate' : 'animationDuration');\n          easing = animatableModel.getShallow(isUpdate ? 'animationEasingUpdate' : 'animationEasing');\n          delay = animatableModel.getShallow(isUpdate ? 'animationDelayUpdate' : 'animationDelay');\n        }\n        // animation from payload has highest priority.\n        if (animationPayload) {\n          animationPayload.duration != null && (duration = animationPayload.duration);\n          animationPayload.easing != null && (easing = animationPayload.easing);\n          animationPayload.delay != null && (delay = animationPayload.delay);\n        }\n        if (isFunction(delay)) {\n          delay = delay(dataIndex, extraDelayParams);\n        }\n        if (isFunction(duration)) {\n          duration = duration(dataIndex);\n        }\n        var config = {\n          duration: duration || 0,\n          delay: delay,\n          easing: easing\n        };\n        return config;\n      } else {\n        return null;\n      }\n    }\n    function animateOrSetProps(animationType, el, props, animatableModel, dataIndex, cb, during) {\n      var isFrom = false;\n      var removeOpt;\n      if (isFunction(dataIndex)) {\n        during = cb;\n        cb = dataIndex;\n        dataIndex = null;\n      } else if (isObject(dataIndex)) {\n        cb = dataIndex.cb;\n        during = dataIndex.during;\n        isFrom = dataIndex.isFrom;\n        removeOpt = dataIndex.removeOpt;\n        dataIndex = dataIndex.dataIndex;\n      }\n      var isRemove = animationType === 'leave';\n      if (!isRemove) {\n        // Must stop the remove animation.\n        el.stopAnimation('leave');\n      }\n      var animationConfig = getAnimationConfig(animationType, animatableModel, dataIndex, isRemove ? removeOpt || {} : null, animatableModel && animatableModel.getAnimationDelayParams ? animatableModel.getAnimationDelayParams(el, dataIndex) : null);\n      if (animationConfig && animationConfig.duration > 0) {\n        var duration = animationConfig.duration;\n        var animationDelay = animationConfig.delay;\n        var animationEasing = animationConfig.easing;\n        var animateConfig = {\n          duration: duration,\n          delay: animationDelay || 0,\n          easing: animationEasing,\n          done: cb,\n          force: !!cb || !!during,\n          // Set to final state in update/init animation.\n          // So the post processing based on the path shape can be done correctly.\n          setToFinal: !isRemove,\n          scope: animationType,\n          during: during\n        };\n        isFrom ? el.animateFrom(props, animateConfig) : el.animateTo(props, animateConfig);\n      } else {\n        el.stopAnimation();\n        // If `isFrom`, the props is the \"from\" props.\n        !isFrom && el.attr(props);\n        // Call during at least once.\n        during && during(1);\n        cb && cb();\n      }\n    }\n    /**\r\n     * Update graphic element properties with or without animation according to the\r\n     * configuration in series.\r\n     *\r\n     * Caution: this method will stop previous animation.\r\n     * So do not use this method to one element twice before\r\n     * animation starts, unless you know what you are doing.\r\n     * @example\r\n     *     graphic.updateProps(el, {\r\n     *         position: [100, 100]\r\n     *     }, seriesModel, dataIndex, function () { console.log('Animation done!'); });\r\n     *     // Or\r\n     *     graphic.updateProps(el, {\r\n     *         position: [100, 100]\r\n     *     }, seriesModel, function () { console.log('Animation done!'); });\r\n     */\n    function updateProps(el, props,\n    // TODO: TYPE AnimatableModel\n    animatableModel, dataIndex, cb, during) {\n      animateOrSetProps('update', el, props, animatableModel, dataIndex, cb, during);\n    }\n    /**\r\n     * Init graphic element properties with or without animation according to the\r\n     * configuration in series.\r\n     *\r\n     * Caution: this method will stop previous animation.\r\n     * So do not use this method to one element twice before\r\n     * animation starts, unless you know what you are doing.\r\n     */\n    function initProps(el, props, animatableModel, dataIndex, cb, during) {\n      animateOrSetProps('enter', el, props, animatableModel, dataIndex, cb, during);\n    }\n    /**\r\n     * If element is removed.\r\n     * It can determine if element is having remove animation.\r\n     */\n    function isElementRemoved(el) {\n      if (!el.__zr) {\n        return true;\n      }\n      for (var i = 0; i < el.animators.length; i++) {\n        var animator = el.animators[i];\n        if (animator.scope === 'leave') {\n          return true;\n        }\n      }\n      return false;\n    }\n    /**\r\n     * Remove graphic element\r\n     */\n    function removeElement(el, props, animatableModel, dataIndex, cb, during) {\n      // Don't do remove animation twice.\n      if (isElementRemoved(el)) {\n        return;\n      }\n      animateOrSetProps('leave', el, props, animatableModel, dataIndex, cb, during);\n    }\n    function fadeOutDisplayable(el, animatableModel, dataIndex, done) {\n      el.removeTextContent();\n      el.removeTextGuideLine();\n      removeElement(el, {\n        style: {\n          opacity: 0\n        }\n      }, animatableModel, dataIndex, done);\n    }\n    function removeElementWithFadeOut(el, animatableModel, dataIndex) {\n      function doRemove() {\n        el.parent && el.parent.remove(el);\n      }\n      // Hide label and labelLine first\n      // TODO Also use fade out animation?\n      if (!el.isGroup) {\n        fadeOutDisplayable(el, animatableModel, dataIndex, doRemove);\n      } else {\n        el.traverse(function (disp) {\n          if (!disp.isGroup) {\n            // Can invoke doRemove multiple times.\n            fadeOutDisplayable(disp, animatableModel, dataIndex, doRemove);\n          }\n        });\n      }\n    }\n    /**\r\n     * Save old style for style transition in universalTransition module.\r\n     * It's used when element will be reused in each render.\r\n     * For chart like map, heatmap, which will always create new element.\r\n     * We don't need to save this because universalTransition can get old style from the old element\r\n     */\n    function saveOldStyle(el) {\n      transitionStore(el).oldStyle = el.style;\n    }\n    function getOldStyle(el) {\n      return transitionStore(el).oldStyle;\n    }\n\n    var mathMax$4 = Math.max;\n    var mathMin$4 = Math.min;\n    var _customShapeMap = {};\n    /**\r\n     * Extend shape with parameters\r\n     */\n    function extendShape(opts) {\n      return Path.extend(opts);\n    }\n    var extendPathFromString = extendFromString;\n    /**\r\n     * Extend path\r\n     */\n    function extendPath(pathData, opts) {\n      return extendPathFromString(pathData, opts);\n    }\n    /**\r\n     * Register a user defined shape.\r\n     * The shape class can be fetched by `getShapeClass`\r\n     * This method will overwrite the registered shapes, including\r\n     * the registered built-in shapes, if using the same `name`.\r\n     * The shape can be used in `custom series` and\r\n     * `graphic component` by declaring `{type: name}`.\r\n     *\r\n     * @param name\r\n     * @param ShapeClass Can be generated by `extendShape`.\r\n     */\n    function registerShape(name, ShapeClass) {\n      _customShapeMap[name] = ShapeClass;\n    }\n    /**\r\n     * Find shape class registered by `registerShape`. Usually used in\r\n     * fetching user defined shape.\r\n     *\r\n     * [Caution]:\r\n     * (1) This method **MUST NOT be used inside echarts !!!**, unless it is prepared\r\n     * to use user registered shapes.\r\n     * Because the built-in shape (see `getBuiltInShape`) will be registered by\r\n     * `registerShape` by default. That enables users to get both built-in\r\n     * shapes as well as the shapes belonging to themsleves. But users can overwrite\r\n     * the built-in shapes by using names like 'circle', 'rect' via calling\r\n     * `registerShape`. So the echarts inner featrues should not fetch shapes from here\r\n     * in case that it is overwritten by users, except that some features, like\r\n     * `custom series`, `graphic component`, do it deliberately.\r\n     *\r\n     * (2) In the features like `custom series`, `graphic component`, the user input\r\n     * `{tpye: 'xxx'}` does not only specify shapes but also specify other graphic\r\n     * elements like `'group'`, `'text'`, `'image'` or event `'path'`. Those names\r\n     * are reserved names, that is, if some user registers a shape named `'image'`,\r\n     * the shape will not be used. If we intending to add some more reserved names\r\n     * in feature, that might bring break changes (disable some existing user shape\r\n     * names). But that case probably rarely happens. So we don't make more mechanism\r\n     * to resolve this issue here.\r\n     *\r\n     * @param name\r\n     * @return The shape class. If not found, return nothing.\r\n     */\n    function getShapeClass(name) {\n      if (_customShapeMap.hasOwnProperty(name)) {\n        return _customShapeMap[name];\n      }\n    }\n    /**\r\n     * Create a path element from path data string\r\n     * @param pathData\r\n     * @param opts\r\n     * @param rect\r\n     * @param layout 'center' or 'cover' default to be cover\r\n     */\n    function makePath(pathData, opts, rect, layout) {\n      var path = createFromString(pathData, opts);\n      if (rect) {\n        if (layout === 'center') {\n          rect = centerGraphic(rect, path.getBoundingRect());\n        }\n        resizePath(path, rect);\n      }\n      return path;\n    }\n    /**\r\n     * Create a image element from image url\r\n     * @param imageUrl image url\r\n     * @param opts options\r\n     * @param rect constrain rect\r\n     * @param layout 'center' or 'cover'. Default to be 'cover'\r\n     */\n    function makeImage(imageUrl, rect, layout) {\n      var zrImg = new ZRImage({\n        style: {\n          image: imageUrl,\n          x: rect.x,\n          y: rect.y,\n          width: rect.width,\n          height: rect.height\n        },\n        onload: function (img) {\n          if (layout === 'center') {\n            var boundingRect = {\n              width: img.width,\n              height: img.height\n            };\n            zrImg.setStyle(centerGraphic(rect, boundingRect));\n          }\n        }\n      });\n      return zrImg;\n    }\n    /**\r\n     * Get position of centered element in bounding box.\r\n     *\r\n     * @param  rect         element local bounding box\r\n     * @param  boundingRect constraint bounding box\r\n     * @return element position containing x, y, width, and height\r\n     */\n    function centerGraphic(rect, boundingRect) {\n      // Set rect to center, keep width / height ratio.\n      var aspect = boundingRect.width / boundingRect.height;\n      var width = rect.height * aspect;\n      var height;\n      if (width <= rect.width) {\n        height = rect.height;\n      } else {\n        width = rect.width;\n        height = width / aspect;\n      }\n      var cx = rect.x + rect.width / 2;\n      var cy = rect.y + rect.height / 2;\n      return {\n        x: cx - width / 2,\n        y: cy - height / 2,\n        width: width,\n        height: height\n      };\n    }\n    var mergePath$1 = mergePath;\n    /**\r\n     * Resize a path to fit the rect\r\n     * @param path\r\n     * @param rect\r\n     */\n    function resizePath(path, rect) {\n      if (!path.applyTransform) {\n        return;\n      }\n      var pathRect = path.getBoundingRect();\n      var m = pathRect.calculateTransform(rect);\n      path.applyTransform(m);\n    }\n    /**\r\n     * Sub pixel optimize line for canvas\r\n     */\n    function subPixelOptimizeLine$1(shape, lineWidth) {\n      subPixelOptimizeLine(shape, shape, {\n        lineWidth: lineWidth\n      });\n      return shape;\n    }\n    /**\r\n     * Sub pixel optimize rect for canvas\r\n     */\n    function subPixelOptimizeRect$1(param) {\n      subPixelOptimizeRect(param.shape, param.shape, param.style);\n      return param;\n    }\n    /**\r\n     * Sub pixel optimize for canvas\r\n     *\r\n     * @param position Coordinate, such as x, y\r\n     * @param lineWidth Should be nonnegative integer.\r\n     * @param positiveOrNegative Default false (negative).\r\n     * @return Optimized position.\r\n     */\n    var subPixelOptimize$1 = subPixelOptimize;\n    /**\r\n     * Get transform matrix of target (param target),\r\n     * in coordinate of its ancestor (param ancestor)\r\n     *\r\n     * @param target\r\n     * @param [ancestor]\r\n     */\n    function getTransform(target, ancestor) {\n      var mat = identity([]);\n      while (target && target !== ancestor) {\n        mul$1(mat, target.getLocalTransform(), mat);\n        target = target.parent;\n      }\n      return mat;\n    }\n    /**\r\n     * Apply transform to an vertex.\r\n     * @param target [x, y]\r\n     * @param transform Can be:\r\n     *      + Transform matrix: like [1, 0, 0, 1, 0, 0]\r\n     *      + {position, rotation, scale}, the same as `zrender/Transformable`.\r\n     * @param invert Whether use invert matrix.\r\n     * @return [x, y]\r\n     */\n    function applyTransform$1(target, transform, invert$1) {\n      if (transform && !isArrayLike(transform)) {\n        transform = Transformable.getLocalTransform(transform);\n      }\n      if (invert$1) {\n        transform = invert([], transform);\n      }\n      return applyTransform([], target, transform);\n    }\n    /**\r\n     * @param direction 'left' 'right' 'top' 'bottom'\r\n     * @param transform Transform matrix: like [1, 0, 0, 1, 0, 0]\r\n     * @param invert Whether use invert matrix.\r\n     * @return Transformed direction. 'left' 'right' 'top' 'bottom'\r\n     */\n    function transformDirection(direction, transform, invert) {\n      // Pick a base, ensure that transform result will not be (0, 0).\n      var hBase = transform[4] === 0 || transform[5] === 0 || transform[0] === 0 ? 1 : Math.abs(2 * transform[4] / transform[0]);\n      var vBase = transform[4] === 0 || transform[5] === 0 || transform[2] === 0 ? 1 : Math.abs(2 * transform[4] / transform[2]);\n      var vertex = [direction === 'left' ? -hBase : direction === 'right' ? hBase : 0, direction === 'top' ? -vBase : direction === 'bottom' ? vBase : 0];\n      vertex = applyTransform$1(vertex, transform, invert);\n      return Math.abs(vertex[0]) > Math.abs(vertex[1]) ? vertex[0] > 0 ? 'right' : 'left' : vertex[1] > 0 ? 'bottom' : 'top';\n    }\n    function isNotGroup(el) {\n      return !el.isGroup;\n    }\n    function isPath(el) {\n      return el.shape != null;\n    }\n    /**\r\n     * Apply group transition animation from g1 to g2.\r\n     * If no animatableModel, no animation.\r\n     */\n    function groupTransition(g1, g2, animatableModel) {\n      if (!g1 || !g2) {\n        return;\n      }\n      function getElMap(g) {\n        var elMap = {};\n        g.traverse(function (el) {\n          if (isNotGroup(el) && el.anid) {\n            elMap[el.anid] = el;\n          }\n        });\n        return elMap;\n      }\n      function getAnimatableProps(el) {\n        var obj = {\n          x: el.x,\n          y: el.y,\n          rotation: el.rotation\n        };\n        if (isPath(el)) {\n          obj.shape = extend({}, el.shape);\n        }\n        return obj;\n      }\n      var elMap1 = getElMap(g1);\n      g2.traverse(function (el) {\n        if (isNotGroup(el) && el.anid) {\n          var oldEl = elMap1[el.anid];\n          if (oldEl) {\n            var newProp = getAnimatableProps(el);\n            el.attr(getAnimatableProps(oldEl));\n            updateProps(el, newProp, animatableModel, getECData(el).dataIndex);\n          }\n        }\n      });\n    }\n    function clipPointsByRect(points, rect) {\n      // FIXME: This way might be incorrect when graphic clipped by a corner\n      // and when element has a border.\n      return map(points, function (point) {\n        var x = point[0];\n        x = mathMax$4(x, rect.x);\n        x = mathMin$4(x, rect.x + rect.width);\n        var y = point[1];\n        y = mathMax$4(y, rect.y);\n        y = mathMin$4(y, rect.y + rect.height);\n        return [x, y];\n      });\n    }\n    /**\r\n     * Return a new clipped rect. If rect size are negative, return undefined.\r\n     */\n    function clipRectByRect(targetRect, rect) {\n      var x = mathMax$4(targetRect.x, rect.x);\n      var x2 = mathMin$4(targetRect.x + targetRect.width, rect.x + rect.width);\n      var y = mathMax$4(targetRect.y, rect.y);\n      var y2 = mathMin$4(targetRect.y + targetRect.height, rect.y + rect.height);\n      // If the total rect is cliped, nothing, including the border,\n      // should be painted. So return undefined.\n      if (x2 >= x && y2 >= y) {\n        return {\n          x: x,\n          y: y,\n          width: x2 - x,\n          height: y2 - y\n        };\n      }\n    }\n    function createIcon(iconStr,\n    // Support 'image://' or 'path://' or direct svg path.\n    opt, rect) {\n      var innerOpts = extend({\n        rectHover: true\n      }, opt);\n      var style = innerOpts.style = {\n        strokeNoScale: true\n      };\n      rect = rect || {\n        x: -1,\n        y: -1,\n        width: 2,\n        height: 2\n      };\n      if (iconStr) {\n        return iconStr.indexOf('image://') === 0 ? (style.image = iconStr.slice(8), defaults(style, rect), new ZRImage(innerOpts)) : makePath(iconStr.replace('path://', ''), innerOpts, rect, 'center');\n      }\n    }\n    /**\r\n     * Return `true` if the given line (line `a`) and the given polygon\r\n     * are intersect.\r\n     * Note that we do not count colinear as intersect here because no\r\n     * requirement for that. We could do that if required in future.\r\n     */\n    function linePolygonIntersect(a1x, a1y, a2x, a2y, points) {\n      for (var i = 0, p2 = points[points.length - 1]; i < points.length; i++) {\n        var p = points[i];\n        if (lineLineIntersect(a1x, a1y, a2x, a2y, p[0], p[1], p2[0], p2[1])) {\n          return true;\n        }\n        p2 = p;\n      }\n    }\n    /**\r\n     * Return `true` if the given two lines (line `a` and line `b`)\r\n     * are intersect.\r\n     * Note that we do not count colinear as intersect here because no\r\n     * requirement for that. We could do that if required in future.\r\n     */\n    function lineLineIntersect(a1x, a1y, a2x, a2y, b1x, b1y, b2x, b2y) {\n      // let `vec_m` to be `vec_a2 - vec_a1` and `vec_n` to be `vec_b2 - vec_b1`.\n      var mx = a2x - a1x;\n      var my = a2y - a1y;\n      var nx = b2x - b1x;\n      var ny = b2y - b1y;\n      // `vec_m` and `vec_n` are parallel iff\n      //     existing `k` such that `vec_m = k · vec_n`, equivalent to `vec_m X vec_n = 0`.\n      var nmCrossProduct = crossProduct2d(nx, ny, mx, my);\n      if (nearZero(nmCrossProduct)) {\n        return false;\n      }\n      // `vec_m` and `vec_n` are intersect iff\n      //     existing `p` and `q` in [0, 1] such that `vec_a1 + p * vec_m = vec_b1 + q * vec_n`,\n      //     such that `q = ((vec_a1 - vec_b1) X vec_m) / (vec_n X vec_m)`\n      //           and `p = ((vec_a1 - vec_b1) X vec_n) / (vec_n X vec_m)`.\n      var b1a1x = a1x - b1x;\n      var b1a1y = a1y - b1y;\n      var q = crossProduct2d(b1a1x, b1a1y, mx, my) / nmCrossProduct;\n      if (q < 0 || q > 1) {\n        return false;\n      }\n      var p = crossProduct2d(b1a1x, b1a1y, nx, ny) / nmCrossProduct;\n      if (p < 0 || p > 1) {\n        return false;\n      }\n      return true;\n    }\n    /**\r\n     * Cross product of 2-dimension vector.\r\n     */\n    function crossProduct2d(x1, y1, x2, y2) {\n      return x1 * y2 - x2 * y1;\n    }\n    function nearZero(val) {\n      return val <= 1e-6 && val >= -1e-6;\n    }\n    function setTooltipConfig(opt) {\n      var itemTooltipOption = opt.itemTooltipOption;\n      var componentModel = opt.componentModel;\n      var itemName = opt.itemName;\n      var itemTooltipOptionObj = isString(itemTooltipOption) ? {\n        formatter: itemTooltipOption\n      } : itemTooltipOption;\n      var mainType = componentModel.mainType;\n      var componentIndex = componentModel.componentIndex;\n      var formatterParams = {\n        componentType: mainType,\n        name: itemName,\n        $vars: ['name']\n      };\n      formatterParams[mainType + 'Index'] = componentIndex;\n      var formatterParamsExtra = opt.formatterParamsExtra;\n      if (formatterParamsExtra) {\n        each(keys(formatterParamsExtra), function (key) {\n          if (!hasOwn(formatterParams, key)) {\n            formatterParams[key] = formatterParamsExtra[key];\n            formatterParams.$vars.push(key);\n          }\n        });\n      }\n      var ecData = getECData(opt.el);\n      ecData.componentMainType = mainType;\n      ecData.componentIndex = componentIndex;\n      ecData.tooltipConfig = {\n        name: itemName,\n        option: defaults({\n          content: itemName,\n          encodeHTMLContent: true,\n          formatterParams: formatterParams\n        }, itemTooltipOptionObj)\n      };\n    }\n    function traverseElement(el, cb) {\n      var stopped;\n      // TODO\n      // Polyfill for fixing zrender group traverse don't visit it's root issue.\n      if (el.isGroup) {\n        stopped = cb(el);\n      }\n      if (!stopped) {\n        el.traverse(cb);\n      }\n    }\n    function traverseElements(els, cb) {\n      if (els) {\n        if (isArray(els)) {\n          for (var i = 0; i < els.length; i++) {\n            traverseElement(els[i], cb);\n          }\n        } else {\n          traverseElement(els, cb);\n        }\n      }\n    }\n    // Register built-in shapes. These shapes might be overwritten\n    // by users, although we do not recommend that.\n    registerShape('circle', Circle);\n    registerShape('ellipse', Ellipse);\n    registerShape('sector', Sector);\n    registerShape('ring', Ring);\n    registerShape('polygon', Polygon);\n    registerShape('polyline', Polyline);\n    registerShape('rect', Rect);\n    registerShape('line', Line);\n    registerShape('bezierCurve', BezierCurve);\n    registerShape('arc', Arc);\n\n    var graphic = /*#__PURE__*/Object.freeze({\n        __proto__: null,\n        updateProps: updateProps,\n        initProps: initProps,\n        removeElement: removeElement,\n        removeElementWithFadeOut: removeElementWithFadeOut,\n        isElementRemoved: isElementRemoved,\n        extendShape: extendShape,\n        extendPath: extendPath,\n        registerShape: registerShape,\n        getShapeClass: getShapeClass,\n        makePath: makePath,\n        makeImage: makeImage,\n        mergePath: mergePath$1,\n        resizePath: resizePath,\n        subPixelOptimizeLine: subPixelOptimizeLine$1,\n        subPixelOptimizeRect: subPixelOptimizeRect$1,\n        subPixelOptimize: subPixelOptimize$1,\n        getTransform: getTransform,\n        applyTransform: applyTransform$1,\n        transformDirection: transformDirection,\n        groupTransition: groupTransition,\n        clipPointsByRect: clipPointsByRect,\n        clipRectByRect: clipRectByRect,\n        createIcon: createIcon,\n        linePolygonIntersect: linePolygonIntersect,\n        lineLineIntersect: lineLineIntersect,\n        setTooltipConfig: setTooltipConfig,\n        traverseElements: traverseElements,\n        Group: Group,\n        Image: ZRImage,\n        Text: ZRText,\n        Circle: Circle,\n        Ellipse: Ellipse,\n        Sector: Sector,\n        Ring: Ring,\n        Polygon: Polygon,\n        Polyline: Polyline,\n        Rect: Rect,\n        Line: Line,\n        BezierCurve: BezierCurve,\n        Arc: Arc,\n        IncrementalDisplayable: IncrementalDisplayable,\n        CompoundPath: CompoundPath,\n        LinearGradient: LinearGradient,\n        RadialGradient: RadialGradient,\n        BoundingRect: BoundingRect,\n        OrientedBoundingRect: OrientedBoundingRect,\n        Point: Point,\n        Path: Path\n    });\n\n    var EMPTY_OBJ = {};\n    function setLabelText(label, labelTexts) {\n      for (var i = 0; i < SPECIAL_STATES.length; i++) {\n        var stateName = SPECIAL_STATES[i];\n        var text = labelTexts[stateName];\n        var state = label.ensureState(stateName);\n        state.style = state.style || {};\n        state.style.text = text;\n      }\n      var oldStates = label.currentStates.slice();\n      label.clearStates(true);\n      label.setStyle({\n        text: labelTexts.normal\n      });\n      label.useStates(oldStates, true);\n    }\n    function getLabelText(opt, stateModels, interpolatedValue) {\n      var labelFetcher = opt.labelFetcher;\n      var labelDataIndex = opt.labelDataIndex;\n      var labelDimIndex = opt.labelDimIndex;\n      var normalModel = stateModels.normal;\n      var baseText;\n      if (labelFetcher) {\n        baseText = labelFetcher.getFormattedLabel(labelDataIndex, 'normal', null, labelDimIndex, normalModel && normalModel.get('formatter'), interpolatedValue != null ? {\n          interpolatedValue: interpolatedValue\n        } : null);\n      }\n      if (baseText == null) {\n        baseText = isFunction(opt.defaultText) ? opt.defaultText(labelDataIndex, opt, interpolatedValue) : opt.defaultText;\n      }\n      var statesText = {\n        normal: baseText\n      };\n      for (var i = 0; i < SPECIAL_STATES.length; i++) {\n        var stateName = SPECIAL_STATES[i];\n        var stateModel = stateModels[stateName];\n        statesText[stateName] = retrieve2(labelFetcher ? labelFetcher.getFormattedLabel(labelDataIndex, stateName, null, labelDimIndex, stateModel && stateModel.get('formatter')) : null, baseText);\n      }\n      return statesText;\n    }\n    function setLabelStyle(targetEl, labelStatesModels, opt, stateSpecified\n    // TODO specified position?\n    ) {\n      opt = opt || EMPTY_OBJ;\n      var isSetOnText = targetEl instanceof ZRText;\n      var needsCreateText = false;\n      for (var i = 0; i < DISPLAY_STATES.length; i++) {\n        var stateModel = labelStatesModels[DISPLAY_STATES[i]];\n        if (stateModel && stateModel.getShallow('show')) {\n          needsCreateText = true;\n          break;\n        }\n      }\n      var textContent = isSetOnText ? targetEl : targetEl.getTextContent();\n      if (needsCreateText) {\n        if (!isSetOnText) {\n          // Reuse the previous\n          if (!textContent) {\n            textContent = new ZRText();\n            targetEl.setTextContent(textContent);\n          }\n          // Use same state proxy\n          if (targetEl.stateProxy) {\n            textContent.stateProxy = targetEl.stateProxy;\n          }\n        }\n        var labelStatesTexts = getLabelText(opt, labelStatesModels);\n        var normalModel = labelStatesModels.normal;\n        var showNormal = !!normalModel.getShallow('show');\n        var normalStyle = createTextStyle(normalModel, stateSpecified && stateSpecified.normal, opt, false, !isSetOnText);\n        normalStyle.text = labelStatesTexts.normal;\n        if (!isSetOnText) {\n          // Always create new\n          targetEl.setTextConfig(createTextConfig(normalModel, opt, false));\n        }\n        for (var i = 0; i < SPECIAL_STATES.length; i++) {\n          var stateName = SPECIAL_STATES[i];\n          var stateModel = labelStatesModels[stateName];\n          if (stateModel) {\n            var stateObj = textContent.ensureState(stateName);\n            var stateShow = !!retrieve2(stateModel.getShallow('show'), showNormal);\n            if (stateShow !== showNormal) {\n              stateObj.ignore = !stateShow;\n            }\n            stateObj.style = createTextStyle(stateModel, stateSpecified && stateSpecified[stateName], opt, true, !isSetOnText);\n            stateObj.style.text = labelStatesTexts[stateName];\n            if (!isSetOnText) {\n              var targetElEmphasisState = targetEl.ensureState(stateName);\n              targetElEmphasisState.textConfig = createTextConfig(stateModel, opt, true);\n            }\n          }\n        }\n        // PENDING: if there is many requirements that emphasis position\n        // need to be different from normal position, we might consider\n        // auto silent is those cases.\n        textContent.silent = !!normalModel.getShallow('silent');\n        // Keep x and y\n        if (textContent.style.x != null) {\n          normalStyle.x = textContent.style.x;\n        }\n        if (textContent.style.y != null) {\n          normalStyle.y = textContent.style.y;\n        }\n        textContent.ignore = !showNormal;\n        // Always create new style.\n        textContent.useStyle(normalStyle);\n        textContent.dirty();\n        if (opt.enableTextSetter) {\n          labelInner(textContent).setLabelText = function (interpolatedValue) {\n            var labelStatesTexts = getLabelText(opt, labelStatesModels, interpolatedValue);\n            setLabelText(textContent, labelStatesTexts);\n          };\n        }\n      } else if (textContent) {\n        // Not display rich text.\n        textContent.ignore = true;\n      }\n      targetEl.dirty();\n    }\n    function getLabelStatesModels(itemModel, labelName) {\n      labelName = labelName || 'label';\n      var statesModels = {\n        normal: itemModel.getModel(labelName)\n      };\n      for (var i = 0; i < SPECIAL_STATES.length; i++) {\n        var stateName = SPECIAL_STATES[i];\n        statesModels[stateName] = itemModel.getModel([stateName, labelName]);\n      }\n      return statesModels;\n    }\n    /**\r\n     * Set basic textStyle properties.\r\n     */\n    function createTextStyle(textStyleModel, specifiedTextStyle,\n    // Fixed style in the code. Can't be set by model.\n    opt, isNotNormal, isAttached // If text is attached on an element. If so, auto color will handling in zrender.\n    ) {\n      var textStyle = {};\n      setTextStyleCommon(textStyle, textStyleModel, opt, isNotNormal, isAttached);\n      specifiedTextStyle && extend(textStyle, specifiedTextStyle);\n      // textStyle.host && textStyle.host.dirty && textStyle.host.dirty(false);\n      return textStyle;\n    }\n    function createTextConfig(textStyleModel, opt, isNotNormal) {\n      opt = opt || {};\n      var textConfig = {};\n      var labelPosition;\n      var labelRotate = textStyleModel.getShallow('rotate');\n      var labelDistance = retrieve2(textStyleModel.getShallow('distance'), isNotNormal ? null : 5);\n      var labelOffset = textStyleModel.getShallow('offset');\n      labelPosition = textStyleModel.getShallow('position') || (isNotNormal ? null : 'inside');\n      // 'outside' is not a valid zr textPostion value, but used\n      // in bar series, and magric type should be considered.\n      labelPosition === 'outside' && (labelPosition = opt.defaultOutsidePosition || 'top');\n      if (labelPosition != null) {\n        textConfig.position = labelPosition;\n      }\n      if (labelOffset != null) {\n        textConfig.offset = labelOffset;\n      }\n      if (labelRotate != null) {\n        labelRotate *= Math.PI / 180;\n        textConfig.rotation = labelRotate;\n      }\n      if (labelDistance != null) {\n        textConfig.distance = labelDistance;\n      }\n      // fill and auto is determined by the color of path fill if it's not specified by developers.\n      textConfig.outsideFill = textStyleModel.get('color') === 'inherit' ? opt.inheritColor || null : 'auto';\n      return textConfig;\n    }\n    /**\r\n     * The uniform entry of set text style, that is, retrieve style definitions\r\n     * from `model` and set to `textStyle` object.\r\n     *\r\n     * Never in merge mode, but in overwrite mode, that is, all of the text style\r\n     * properties will be set. (Consider the states of normal and emphasis and\r\n     * default value can be adopted, merge would make the logic too complicated\r\n     * to manage.)\r\n     */\n    function setTextStyleCommon(textStyle, textStyleModel, opt, isNotNormal, isAttached) {\n      // Consider there will be abnormal when merge hover style to normal style if given default value.\n      opt = opt || EMPTY_OBJ;\n      var ecModel = textStyleModel.ecModel;\n      var globalTextStyle = ecModel && ecModel.option.textStyle;\n      // Consider case:\n      // {\n      //     data: [{\n      //         value: 12,\n      //         label: {\n      //             rich: {\n      //                 // no 'a' here but using parent 'a'.\n      //             }\n      //         }\n      //     }],\n      //     rich: {\n      //         a: { ... }\n      //     }\n      // }\n      var richItemNames = getRichItemNames(textStyleModel);\n      var richResult;\n      if (richItemNames) {\n        richResult = {};\n        for (var name_1 in richItemNames) {\n          if (richItemNames.hasOwnProperty(name_1)) {\n            // Cascade is supported in rich.\n            var richTextStyle = textStyleModel.getModel(['rich', name_1]);\n            // In rich, never `disableBox`.\n            // FIXME: consider `label: {formatter: '{a|xx}', color: 'blue', rich: {a: {}}}`,\n            // the default color `'blue'` will not be adopted if no color declared in `rich`.\n            // That might confuses users. So probably we should put `textStyleModel` as the\n            // root ancestor of the `richTextStyle`. But that would be a break change.\n            setTokenTextStyle(richResult[name_1] = {}, richTextStyle, globalTextStyle, opt, isNotNormal, isAttached, false, true);\n          }\n        }\n      }\n      if (richResult) {\n        textStyle.rich = richResult;\n      }\n      var overflow = textStyleModel.get('overflow');\n      if (overflow) {\n        textStyle.overflow = overflow;\n      }\n      var margin = textStyleModel.get('minMargin');\n      if (margin != null) {\n        textStyle.margin = margin;\n      }\n      setTokenTextStyle(textStyle, textStyleModel, globalTextStyle, opt, isNotNormal, isAttached, true, false);\n    }\n    // Consider case:\n    // {\n    //     data: [{\n    //         value: 12,\n    //         label: {\n    //             rich: {\n    //                 // no 'a' here but using parent 'a'.\n    //             }\n    //         }\n    //     }],\n    //     rich: {\n    //         a: { ... }\n    //     }\n    // }\n    // TODO TextStyleModel\n    function getRichItemNames(textStyleModel) {\n      // Use object to remove duplicated names.\n      var richItemNameMap;\n      while (textStyleModel && textStyleModel !== textStyleModel.ecModel) {\n        var rich = (textStyleModel.option || EMPTY_OBJ).rich;\n        if (rich) {\n          richItemNameMap = richItemNameMap || {};\n          var richKeys = keys(rich);\n          for (var i = 0; i < richKeys.length; i++) {\n            var richKey = richKeys[i];\n            richItemNameMap[richKey] = 1;\n          }\n        }\n        textStyleModel = textStyleModel.parentModel;\n      }\n      return richItemNameMap;\n    }\n    var TEXT_PROPS_WITH_GLOBAL = ['fontStyle', 'fontWeight', 'fontSize', 'fontFamily', 'textShadowColor', 'textShadowBlur', 'textShadowOffsetX', 'textShadowOffsetY'];\n    var TEXT_PROPS_SELF = ['align', 'lineHeight', 'width', 'height', 'tag', 'verticalAlign', 'ellipsis'];\n    var TEXT_PROPS_BOX = ['padding', 'borderWidth', 'borderRadius', 'borderDashOffset', 'backgroundColor', 'borderColor', 'shadowColor', 'shadowBlur', 'shadowOffsetX', 'shadowOffsetY'];\n    function setTokenTextStyle(textStyle, textStyleModel, globalTextStyle, opt, isNotNormal, isAttached, isBlock, inRich) {\n      // In merge mode, default value should not be given.\n      globalTextStyle = !isNotNormal && globalTextStyle || EMPTY_OBJ;\n      var inheritColor = opt && opt.inheritColor;\n      var fillColor = textStyleModel.getShallow('color');\n      var strokeColor = textStyleModel.getShallow('textBorderColor');\n      var opacity = retrieve2(textStyleModel.getShallow('opacity'), globalTextStyle.opacity);\n      if (fillColor === 'inherit' || fillColor === 'auto') {\n        if (\"development\" !== 'production') {\n          if (fillColor === 'auto') {\n            deprecateReplaceLog('color: \\'auto\\'', 'color: \\'inherit\\'');\n          }\n        }\n        if (inheritColor) {\n          fillColor = inheritColor;\n        } else {\n          fillColor = null;\n        }\n      }\n      if (strokeColor === 'inherit' || strokeColor === 'auto') {\n        if (\"development\" !== 'production') {\n          if (strokeColor === 'auto') {\n            deprecateReplaceLog('color: \\'auto\\'', 'color: \\'inherit\\'');\n          }\n        }\n        if (inheritColor) {\n          strokeColor = inheritColor;\n        } else {\n          strokeColor = null;\n        }\n      }\n      if (!isAttached) {\n        // Only use default global textStyle.color if text is individual.\n        // Otherwise it will use the strategy of attached text color because text may be on a path.\n        fillColor = fillColor || globalTextStyle.color;\n        strokeColor = strokeColor || globalTextStyle.textBorderColor;\n      }\n      if (fillColor != null) {\n        textStyle.fill = fillColor;\n      }\n      if (strokeColor != null) {\n        textStyle.stroke = strokeColor;\n      }\n      var textBorderWidth = retrieve2(textStyleModel.getShallow('textBorderWidth'), globalTextStyle.textBorderWidth);\n      if (textBorderWidth != null) {\n        textStyle.lineWidth = textBorderWidth;\n      }\n      var textBorderType = retrieve2(textStyleModel.getShallow('textBorderType'), globalTextStyle.textBorderType);\n      if (textBorderType != null) {\n        textStyle.lineDash = textBorderType;\n      }\n      var textBorderDashOffset = retrieve2(textStyleModel.getShallow('textBorderDashOffset'), globalTextStyle.textBorderDashOffset);\n      if (textBorderDashOffset != null) {\n        textStyle.lineDashOffset = textBorderDashOffset;\n      }\n      if (!isNotNormal && opacity == null && !inRich) {\n        opacity = opt && opt.defaultOpacity;\n      }\n      if (opacity != null) {\n        textStyle.opacity = opacity;\n      }\n      // TODO\n      if (!isNotNormal && !isAttached) {\n        // Set default finally.\n        if (textStyle.fill == null && opt.inheritColor) {\n          textStyle.fill = opt.inheritColor;\n        }\n      }\n      // Do not use `getFont` here, because merge should be supported, where\n      // part of these properties may be changed in emphasis style, and the\n      // others should remain their original value got from normal style.\n      for (var i = 0; i < TEXT_PROPS_WITH_GLOBAL.length; i++) {\n        var key = TEXT_PROPS_WITH_GLOBAL[i];\n        var val = retrieve2(textStyleModel.getShallow(key), globalTextStyle[key]);\n        if (val != null) {\n          textStyle[key] = val;\n        }\n      }\n      for (var i = 0; i < TEXT_PROPS_SELF.length; i++) {\n        var key = TEXT_PROPS_SELF[i];\n        var val = textStyleModel.getShallow(key);\n        if (val != null) {\n          textStyle[key] = val;\n        }\n      }\n      if (textStyle.verticalAlign == null) {\n        var baseline = textStyleModel.getShallow('baseline');\n        if (baseline != null) {\n          textStyle.verticalAlign = baseline;\n        }\n      }\n      if (!isBlock || !opt.disableBox) {\n        for (var i = 0; i < TEXT_PROPS_BOX.length; i++) {\n          var key = TEXT_PROPS_BOX[i];\n          var val = textStyleModel.getShallow(key);\n          if (val != null) {\n            textStyle[key] = val;\n          }\n        }\n        var borderType = textStyleModel.getShallow('borderType');\n        if (borderType != null) {\n          textStyle.borderDash = borderType;\n        }\n        if ((textStyle.backgroundColor === 'auto' || textStyle.backgroundColor === 'inherit') && inheritColor) {\n          if (\"development\" !== 'production') {\n            if (textStyle.backgroundColor === 'auto') {\n              deprecateReplaceLog('backgroundColor: \\'auto\\'', 'backgroundColor: \\'inherit\\'');\n            }\n          }\n          textStyle.backgroundColor = inheritColor;\n        }\n        if ((textStyle.borderColor === 'auto' || textStyle.borderColor === 'inherit') && inheritColor) {\n          if (\"development\" !== 'production') {\n            if (textStyle.borderColor === 'auto') {\n              deprecateReplaceLog('borderColor: \\'auto\\'', 'borderColor: \\'inherit\\'');\n            }\n          }\n          textStyle.borderColor = inheritColor;\n        }\n      }\n    }\n    function getFont(opt, ecModel) {\n      var gTextStyleModel = ecModel && ecModel.getModel('textStyle');\n      return trim([\n      // FIXME in node-canvas fontWeight is before fontStyle\n      opt.fontStyle || gTextStyleModel && gTextStyleModel.getShallow('fontStyle') || '', opt.fontWeight || gTextStyleModel && gTextStyleModel.getShallow('fontWeight') || '', (opt.fontSize || gTextStyleModel && gTextStyleModel.getShallow('fontSize') || 12) + 'px', opt.fontFamily || gTextStyleModel && gTextStyleModel.getShallow('fontFamily') || 'sans-serif'].join(' '));\n    }\n    var labelInner = makeInner();\n    function setLabelValueAnimation(label, labelStatesModels, value, getDefaultText) {\n      if (!label) {\n        return;\n      }\n      var obj = labelInner(label);\n      obj.prevValue = obj.value;\n      obj.value = value;\n      var normalLabelModel = labelStatesModels.normal;\n      obj.valueAnimation = normalLabelModel.get('valueAnimation');\n      if (obj.valueAnimation) {\n        obj.precision = normalLabelModel.get('precision');\n        obj.defaultInterpolatedText = getDefaultText;\n        obj.statesModels = labelStatesModels;\n      }\n    }\n    function animateLabelValue(textEl, dataIndex, data, animatableModel, labelFetcher) {\n      var labelInnerStore = labelInner(textEl);\n      if (!labelInnerStore.valueAnimation || labelInnerStore.prevValue === labelInnerStore.value) {\n        // Value not changed, no new label animation\n        return;\n      }\n      var defaultInterpolatedText = labelInnerStore.defaultInterpolatedText;\n      // Consider the case that being animating, do not use the `obj.value`,\n      // Otherwise it will jump to the `obj.value` when this new animation started.\n      var currValue = retrieve2(labelInnerStore.interpolatedValue, labelInnerStore.prevValue);\n      var targetValue = labelInnerStore.value;\n      function during(percent) {\n        var interpolated = interpolateRawValues(data, labelInnerStore.precision, currValue, targetValue, percent);\n        labelInnerStore.interpolatedValue = percent === 1 ? null : interpolated;\n        var labelText = getLabelText({\n          labelDataIndex: dataIndex,\n          labelFetcher: labelFetcher,\n          defaultText: defaultInterpolatedText ? defaultInterpolatedText(interpolated) : interpolated + ''\n        }, labelInnerStore.statesModels, interpolated);\n        setLabelText(textEl, labelText);\n      }\n      textEl.percent = 0;\n      (labelInnerStore.prevValue == null ? initProps : updateProps)(textEl, {\n        // percent is used to prevent animation from being aborted #15916\n        percent: 1\n      }, animatableModel, dataIndex, null, during);\n    }\n\n    var PATH_COLOR = ['textStyle', 'color'];\n    var textStyleParams = ['fontStyle', 'fontWeight', 'fontSize', 'fontFamily', 'padding', 'lineHeight', 'rich', 'width', 'height', 'overflow'];\n    // TODO Performance improvement?\n    var tmpText = new ZRText();\n    var TextStyleMixin = /** @class */function () {\n      function TextStyleMixin() {}\n      /**\r\n       * Get color property or get color from option.textStyle.color\r\n       */\n      // TODO Callback\n      TextStyleMixin.prototype.getTextColor = function (isEmphasis) {\n        var ecModel = this.ecModel;\n        return this.getShallow('color') || (!isEmphasis && ecModel ? ecModel.get(PATH_COLOR) : null);\n      };\n      /**\r\n       * Create font string from fontStyle, fontWeight, fontSize, fontFamily\r\n       * @return {string}\r\n       */\n      TextStyleMixin.prototype.getFont = function () {\n        return getFont({\n          fontStyle: this.getShallow('fontStyle'),\n          fontWeight: this.getShallow('fontWeight'),\n          fontSize: this.getShallow('fontSize'),\n          fontFamily: this.getShallow('fontFamily')\n        }, this.ecModel);\n      };\n      TextStyleMixin.prototype.getTextRect = function (text) {\n        var style = {\n          text: text,\n          verticalAlign: this.getShallow('verticalAlign') || this.getShallow('baseline')\n        };\n        for (var i = 0; i < textStyleParams.length; i++) {\n          style[textStyleParams[i]] = this.getShallow(textStyleParams[i]);\n        }\n        tmpText.useStyle(style);\n        tmpText.update();\n        return tmpText.getBoundingRect();\n      };\n      return TextStyleMixin;\n    }();\n\n    var LINE_STYLE_KEY_MAP = [['lineWidth', 'width'], ['stroke', 'color'], ['opacity'], ['shadowBlur'], ['shadowOffsetX'], ['shadowOffsetY'], ['shadowColor'], ['lineDash', 'type'], ['lineDashOffset', 'dashOffset'], ['lineCap', 'cap'], ['lineJoin', 'join'], ['miterLimit']\n    // Option decal is in `DecalObject` but style.decal is in `PatternObject`.\n    // So do not transfer decal directly.\n    ];\n    var getLineStyle = makeStyleMapper(LINE_STYLE_KEY_MAP);\n    var LineStyleMixin = /** @class */function () {\n      function LineStyleMixin() {}\n      LineStyleMixin.prototype.getLineStyle = function (excludes) {\n        return getLineStyle(this, excludes);\n      };\n      return LineStyleMixin;\n    }();\n\n    var ITEM_STYLE_KEY_MAP = [['fill', 'color'], ['stroke', 'borderColor'], ['lineWidth', 'borderWidth'], ['opacity'], ['shadowBlur'], ['shadowOffsetX'], ['shadowOffsetY'], ['shadowColor'], ['lineDash', 'borderType'], ['lineDashOffset', 'borderDashOffset'], ['lineCap', 'borderCap'], ['lineJoin', 'borderJoin'], ['miterLimit', 'borderMiterLimit']\n    // Option decal is in `DecalObject` but style.decal is in `PatternObject`.\n    // So do not transfer decal directly.\n    ];\n    var getItemStyle = makeStyleMapper(ITEM_STYLE_KEY_MAP);\n    var ItemStyleMixin = /** @class */function () {\n      function ItemStyleMixin() {}\n      ItemStyleMixin.prototype.getItemStyle = function (excludes, includes) {\n        return getItemStyle(this, excludes, includes);\n      };\n      return ItemStyleMixin;\n    }();\n\n    var Model = /** @class */function () {\n      function Model(option, parentModel, ecModel) {\n        this.parentModel = parentModel;\n        this.ecModel = ecModel;\n        this.option = option;\n        // Simple optimization\n        // if (this.init) {\n        //     if (arguments.length <= 4) {\n        //         this.init(option, parentModel, ecModel, extraOpt);\n        //     }\n        //     else {\n        //         this.init.apply(this, arguments);\n        //     }\n        // }\n      }\n      Model.prototype.init = function (option, parentModel, ecModel) {\n        var rest = [];\n        for (var _i = 3; _i < arguments.length; _i++) {\n          rest[_i - 3] = arguments[_i];\n        }\n      };\n      /**\r\n       * Merge the input option to me.\r\n       */\n      Model.prototype.mergeOption = function (option, ecModel) {\n        merge(this.option, option, true);\n      };\n      // `path` can be 'a.b.c', so the return value type have to be `ModelOption`\n      // TODO: TYPE strict key check?\n      // get(path: string | string[], ignoreParent?: boolean): ModelOption;\n      Model.prototype.get = function (path, ignoreParent) {\n        if (path == null) {\n          return this.option;\n        }\n        return this._doGet(this.parsePath(path), !ignoreParent && this.parentModel);\n      };\n      Model.prototype.getShallow = function (key, ignoreParent) {\n        var option = this.option;\n        var val = option == null ? option : option[key];\n        if (val == null && !ignoreParent) {\n          var parentModel = this.parentModel;\n          if (parentModel) {\n            // FIXME:TS do not know how to make it works\n            val = parentModel.getShallow(key);\n          }\n        }\n        return val;\n      };\n      // `path` can be 'a.b.c', so the return value type have to be `Model<ModelOption>`\n      // getModel(path: string | string[], parentModel?: Model): Model;\n      // TODO 'a.b.c' is deprecated\n      Model.prototype.getModel = function (path, parentModel) {\n        var hasPath = path != null;\n        var pathFinal = hasPath ? this.parsePath(path) : null;\n        var obj = hasPath ? this._doGet(pathFinal) : this.option;\n        parentModel = parentModel || this.parentModel && this.parentModel.getModel(this.resolveParentPath(pathFinal));\n        return new Model(obj, parentModel, this.ecModel);\n      };\n      /**\r\n       * If model has option\r\n       */\n      Model.prototype.isEmpty = function () {\n        return this.option == null;\n      };\n      Model.prototype.restoreData = function () {};\n      // Pending\n      Model.prototype.clone = function () {\n        var Ctor = this.constructor;\n        return new Ctor(clone(this.option));\n      };\n      // setReadOnly(properties): void {\n      // clazzUtil.setReadOnly(this, properties);\n      // }\n      // If path is null/undefined, return null/undefined.\n      Model.prototype.parsePath = function (path) {\n        if (typeof path === 'string') {\n          return path.split('.');\n        }\n        return path;\n      };\n      // Resolve path for parent. Perhaps useful when parent use a different property.\n      // Default to be a identity resolver.\n      // Can be modified to a different resolver.\n      Model.prototype.resolveParentPath = function (path) {\n        return path;\n      };\n      // FIXME:TS check whether put this method here\n      Model.prototype.isAnimationEnabled = function () {\n        if (!env.node && this.option) {\n          if (this.option.animation != null) {\n            return !!this.option.animation;\n          } else if (this.parentModel) {\n            return this.parentModel.isAnimationEnabled();\n          }\n        }\n      };\n      Model.prototype._doGet = function (pathArr, parentModel) {\n        var obj = this.option;\n        if (!pathArr) {\n          return obj;\n        }\n        for (var i = 0; i < pathArr.length; i++) {\n          // Ignore empty\n          if (!pathArr[i]) {\n            continue;\n          }\n          // obj could be number/string/... (like 0)\n          obj = obj && typeof obj === 'object' ? obj[pathArr[i]] : null;\n          if (obj == null) {\n            break;\n          }\n        }\n        if (obj == null && parentModel) {\n          obj = parentModel._doGet(this.resolveParentPath(pathArr), parentModel.parentModel);\n        }\n        return obj;\n      };\n      return Model;\n    }();\n    // Enable Model.extend.\n    enableClassExtend(Model);\n    enableClassCheck(Model);\n    mixin(Model, LineStyleMixin);\n    mixin(Model, ItemStyleMixin);\n    mixin(Model, AreaStyleMixin);\n    mixin(Model, TextStyleMixin);\n\n    // A random offset\n    var base = Math.round(Math.random() * 10);\n    /**\r\n     * @public\r\n     * @param {string} type\r\n     * @return {string}\r\n     */\n    function getUID(type) {\n      // Considering the case of crossing js context,\n      // use Math.random to make id as unique as possible.\n      return [type || '', base++].join('_');\n    }\n    /**\r\n     * Implements `SubTypeDefaulterManager` for `target`.\r\n     */\n    function enableSubTypeDefaulter(target) {\n      var subTypeDefaulters = {};\n      target.registerSubTypeDefaulter = function (componentType, defaulter) {\n        var componentTypeInfo = parseClassType(componentType);\n        subTypeDefaulters[componentTypeInfo.main] = defaulter;\n      };\n      target.determineSubType = function (componentType, option) {\n        var type = option.type;\n        if (!type) {\n          var componentTypeMain = parseClassType(componentType).main;\n          if (target.hasSubTypes(componentType) && subTypeDefaulters[componentTypeMain]) {\n            type = subTypeDefaulters[componentTypeMain](option);\n          }\n        }\n        return type;\n      };\n    }\n    /**\r\n     * Implements `TopologicalTravelable<any>` for `entity`.\r\n     *\r\n     * Topological travel on Activity Network (Activity On Vertices).\r\n     * Dependencies is defined in Model.prototype.dependencies, like ['xAxis', 'yAxis'].\r\n     * If 'xAxis' or 'yAxis' is absent in componentTypeList, just ignore it in topology.\r\n     * If there is circular dependencey, Error will be thrown.\r\n     */\n    function enableTopologicalTravel(entity, dependencyGetter) {\n      /**\r\n       * @param targetNameList Target Component type list.\r\n       *                       Can be ['aa', 'bb', 'aa.xx']\r\n       * @param fullNameList By which we can build dependency graph.\r\n       * @param callback Params: componentType, dependencies.\r\n       * @param context Scope of callback.\r\n       */\n      entity.topologicalTravel = function (targetNameList, fullNameList, callback, context) {\n        if (!targetNameList.length) {\n          return;\n        }\n        var result = makeDepndencyGraph(fullNameList);\n        var graph = result.graph;\n        var noEntryList = result.noEntryList;\n        var targetNameSet = {};\n        each(targetNameList, function (name) {\n          targetNameSet[name] = true;\n        });\n        while (noEntryList.length) {\n          var currComponentType = noEntryList.pop();\n          var currVertex = graph[currComponentType];\n          var isInTargetNameSet = !!targetNameSet[currComponentType];\n          if (isInTargetNameSet) {\n            callback.call(context, currComponentType, currVertex.originalDeps.slice());\n            delete targetNameSet[currComponentType];\n          }\n          each(currVertex.successor, isInTargetNameSet ? removeEdgeAndAdd : removeEdge);\n        }\n        each(targetNameSet, function () {\n          var errMsg = '';\n          if (\"development\" !== 'production') {\n            errMsg = makePrintable('Circular dependency may exists: ', targetNameSet, targetNameList, fullNameList);\n          }\n          throw new Error(errMsg);\n        });\n        function removeEdge(succComponentType) {\n          graph[succComponentType].entryCount--;\n          if (graph[succComponentType].entryCount === 0) {\n            noEntryList.push(succComponentType);\n          }\n        }\n        // Consider this case: legend depends on series, and we call\n        // chart.setOption({series: [...]}), where only series is in option.\n        // If we do not have 'removeEdgeAndAdd', legendModel.mergeOption will\n        // not be called, but only sereis.mergeOption is called. Thus legend\n        // have no chance to update its local record about series (like which\n        // name of series is available in legend).\n        function removeEdgeAndAdd(succComponentType) {\n          targetNameSet[succComponentType] = true;\n          removeEdge(succComponentType);\n        }\n      };\n      function makeDepndencyGraph(fullNameList) {\n        var graph = {};\n        var noEntryList = [];\n        each(fullNameList, function (name) {\n          var thisItem = createDependencyGraphItem(graph, name);\n          var originalDeps = thisItem.originalDeps = dependencyGetter(name);\n          var availableDeps = getAvailableDependencies(originalDeps, fullNameList);\n          thisItem.entryCount = availableDeps.length;\n          if (thisItem.entryCount === 0) {\n            noEntryList.push(name);\n          }\n          each(availableDeps, function (dependentName) {\n            if (indexOf(thisItem.predecessor, dependentName) < 0) {\n              thisItem.predecessor.push(dependentName);\n            }\n            var thatItem = createDependencyGraphItem(graph, dependentName);\n            if (indexOf(thatItem.successor, dependentName) < 0) {\n              thatItem.successor.push(name);\n            }\n          });\n        });\n        return {\n          graph: graph,\n          noEntryList: noEntryList\n        };\n      }\n      function createDependencyGraphItem(graph, name) {\n        if (!graph[name]) {\n          graph[name] = {\n            predecessor: [],\n            successor: []\n          };\n        }\n        return graph[name];\n      }\n      function getAvailableDependencies(originalDeps, fullNameList) {\n        var availableDeps = [];\n        each(originalDeps, function (dep) {\n          indexOf(fullNameList, dep) >= 0 && availableDeps.push(dep);\n        });\n        return availableDeps;\n      }\n    }\n    function inheritDefaultOption(superOption, subOption) {\n      // See also `model/Component.ts#getDefaultOption`\n      return merge(merge({}, superOption, true), subOption, true);\n    }\n\n    /*\n    * Licensed to the Apache Software Foundation (ASF) under one\n    * or more contributor license agreements.  See the NOTICE file\n    * distributed with this work for additional information\n    * regarding copyright ownership.  The ASF licenses this file\n    * to you under the Apache License, Version 2.0 (the\n    * \"License\"); you may not use this file except in compliance\n    * with the License.  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,\n    * software distributed under the License is distributed on an\n    * \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\n    * KIND, either express or implied.  See the License for the\n    * specific language governing permissions and limitations\n    * under the License.\n    */\n\n\n    /**\n     * AUTO-GENERATED FILE. DO NOT MODIFY.\n     */\n\n    /*\r\n     * Licensed to the Apache Software Foundation (ASF) under one\r\n     * or more contributor license agreements.  See the NOTICE file\r\n     * distributed with this work for additional information\r\n     * regarding copyright ownership.  The ASF licenses this file\r\n     * to you under the Apache License, Version 2.0 (the\r\n     * \"License\"); you may not use this file except in compliance\r\n     * with the License.  You may obtain a copy of the License at\r\n     *\r\n     *   http://www.apache.org/licenses/LICENSE-2.0\r\n     *\r\n     * Unless required by applicable law or agreed to in writing,\r\n     * software distributed under the License is distributed on an\r\n     * \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\r\n     * KIND, either express or implied.  See the License for the\r\n     * specific language governing permissions and limitations\r\n     * under the License.\r\n     */\n    /**\r\n     * Language: English.\r\n     */\n    var langEN = {\n      time: {\n        month: ['January', 'February', 'March', 'April', 'May', 'June', 'July', 'August', 'September', 'October', 'November', 'December'],\n        monthAbbr: ['Jan', 'Feb', 'Mar', 'Apr', 'May', 'Jun', 'Jul', 'Aug', 'Sep', 'Oct', 'Nov', 'Dec'],\n        dayOfWeek: ['Sunday', 'Monday', 'Tuesday', 'Wednesday', 'Thursday', 'Friday', 'Saturday'],\n        dayOfWeekAbbr: ['Sun', 'Mon', 'Tue', 'Wed', 'Thu', 'Fri', 'Sat']\n      },\n      legend: {\n        selector: {\n          all: 'All',\n          inverse: 'Inv'\n        }\n      },\n      toolbox: {\n        brush: {\n          title: {\n            rect: 'Box Select',\n            polygon: 'Lasso Select',\n            lineX: 'Horizontally Select',\n            lineY: 'Vertically Select',\n            keep: 'Keep Selections',\n            clear: 'Clear Selections'\n          }\n        },\n        dataView: {\n          title: 'Data View',\n          lang: ['Data View', 'Close', 'Refresh']\n        },\n        dataZoom: {\n          title: {\n            zoom: 'Zoom',\n            back: 'Zoom Reset'\n          }\n        },\n        magicType: {\n          title: {\n            line: 'Switch to Line Chart',\n            bar: 'Switch to Bar Chart',\n            stack: 'Stack',\n            tiled: 'Tile'\n          }\n        },\n        restore: {\n          title: 'Restore'\n        },\n        saveAsImage: {\n          title: 'Save as Image',\n          lang: ['Right Click to Save Image']\n        }\n      },\n      series: {\n        typeNames: {\n          pie: 'Pie chart',\n          bar: 'Bar chart',\n          line: 'Line chart',\n          scatter: 'Scatter plot',\n          effectScatter: 'Ripple scatter plot',\n          radar: 'Radar chart',\n          tree: 'Tree',\n          treemap: 'Treemap',\n          boxplot: 'Boxplot',\n          candlestick: 'Candlestick',\n          k: 'K line chart',\n          heatmap: 'Heat map',\n          map: 'Map',\n          parallel: 'Parallel coordinate map',\n          lines: 'Line graph',\n          graph: 'Relationship graph',\n          sankey: 'Sankey diagram',\n          funnel: 'Funnel chart',\n          gauge: 'Gauge',\n          pictorialBar: 'Pictorial bar',\n          themeRiver: 'Theme River Map',\n          sunburst: 'Sunburst',\n          custom: 'Custom chart',\n          chart: 'Chart'\n        }\n      },\n      aria: {\n        general: {\n          withTitle: 'This is a chart about \"{title}\"',\n          withoutTitle: 'This is a chart'\n        },\n        series: {\n          single: {\n            prefix: '',\n            withName: ' with type {seriesType} named {seriesName}.',\n            withoutName: ' with type {seriesType}.'\n          },\n          multiple: {\n            prefix: '. It consists of {seriesCount} series count.',\n            withName: ' The {seriesId} series is a {seriesType} representing {seriesName}.',\n            withoutName: ' The {seriesId} series is a {seriesType}.',\n            separator: {\n              middle: '',\n              end: ''\n            }\n          }\n        },\n        data: {\n          allData: 'The data is as follows: ',\n          partialData: 'The first {displayCnt} items are: ',\n          withName: 'the data for {name} is {value}',\n          withoutName: '{value}',\n          separator: {\n            middle: ', ',\n            end: '. '\n          }\n        }\n      }\n    };\n\n    /*\n    * Licensed to the Apache Software Foundation (ASF) under one\n    * or more contributor license agreements.  See the NOTICE file\n    * distributed with this work for additional information\n    * regarding copyright ownership.  The ASF licenses this file\n    * to you under the Apache License, Version 2.0 (the\n    * \"License\"); you may not use this file except in compliance\n    * with the License.  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,\n    * software distributed under the License is distributed on an\n    * \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\n    * KIND, either express or implied.  See the License for the\n    * specific language governing permissions and limitations\n    * under the License.\n    */\n\n\n    /**\n     * AUTO-GENERATED FILE. DO NOT MODIFY.\n     */\n\n    /*\r\n     * Licensed to the Apache Software Foundation (ASF) under one\r\n     * or more contributor license agreements.  See the NOTICE file\r\n     * distributed with this work for additional information\r\n     * regarding copyright ownership.  The ASF licenses this file\r\n     * to you under the Apache License, Version 2.0 (the\r\n     * \"License\"); you may not use this file except in compliance\r\n     * with the License.  You may obtain a copy of the License at\r\n     *\r\n     *   http://www.apache.org/licenses/LICENSE-2.0\r\n     *\r\n     * Unless required by applicable law or agreed to in writing,\r\n     * software distributed under the License is distributed on an\r\n     * \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\r\n     * KIND, either express or implied.  See the License for the\r\n     * specific language governing permissions and limitations\r\n     * under the License.\r\n     */\n    var langZH = {\n      time: {\n        month: ['一月', '二月', '三月', '四月', '五月', '六月', '七月', '八月', '九月', '十月', '十一月', '十二月'],\n        monthAbbr: ['1月', '2月', '3月', '4月', '5月', '6月', '7月', '8月', '9月', '10月', '11月', '12月'],\n        dayOfWeek: ['星期日', '星期一', '星期二', '星期三', '星期四', '星期五', '星期六'],\n        dayOfWeekAbbr: ['日', '一', '二', '三', '四', '五', '六']\n      },\n      legend: {\n        selector: {\n          all: '全选',\n          inverse: '反选'\n        }\n      },\n      toolbox: {\n        brush: {\n          title: {\n            rect: '矩形选择',\n            polygon: '圈选',\n            lineX: '横向选择',\n            lineY: '纵向选择',\n            keep: '保持选择',\n            clear: '清除选择'\n          }\n        },\n        dataView: {\n          title: '数据视图',\n          lang: ['数据视图', '关闭', '刷新']\n        },\n        dataZoom: {\n          title: {\n            zoom: '区域缩放',\n            back: '区域缩放还原'\n          }\n        },\n        magicType: {\n          title: {\n            line: '切换为折线图',\n            bar: '切换为柱状图',\n            stack: '切换为堆叠',\n            tiled: '切换为平铺'\n          }\n        },\n        restore: {\n          title: '还原'\n        },\n        saveAsImage: {\n          title: '保存为图片',\n          lang: ['右键另存为图片']\n        }\n      },\n      series: {\n        typeNames: {\n          pie: '饼图',\n          bar: '柱状图',\n          line: '折线图',\n          scatter: '散点图',\n          effectScatter: '涟漪散点图',\n          radar: '雷达图',\n          tree: '树图',\n          treemap: '矩形树图',\n          boxplot: '箱型图',\n          candlestick: 'K线图',\n          k: 'K线图',\n          heatmap: '热力图',\n          map: '地图',\n          parallel: '平行坐标图',\n          lines: '线图',\n          graph: '关系图',\n          sankey: '桑基图',\n          funnel: '漏斗图',\n          gauge: '仪表盘图',\n          pictorialBar: '象形柱图',\n          themeRiver: '主题河流图',\n          sunburst: '旭日图',\n          custom: '自定义图表',\n          chart: '图表'\n        }\n      },\n      aria: {\n        general: {\n          withTitle: '这是一个关于“{title}”的图表。',\n          withoutTitle: '这是一个图表，'\n        },\n        series: {\n          single: {\n            prefix: '',\n            withName: '图表类型是{seriesType}，表示{seriesName}。',\n            withoutName: '图表类型是{seriesType}。'\n          },\n          multiple: {\n            prefix: '它由{seriesCount}个图表系列组成。',\n            withName: '第{seriesId}个系列是一个表示{seriesName}的{seriesType}，',\n            withoutName: '第{seriesId}个系列是一个{seriesType}，',\n            separator: {\n              middle: '；',\n              end: '。'\n            }\n          }\n        },\n        data: {\n          allData: '其数据是——',\n          partialData: '其中，前{displayCnt}项是——',\n          withName: '{name}的数据是{value}',\n          withoutName: '{value}',\n          separator: {\n            middle: '，',\n            end: ''\n          }\n        }\n      }\n    };\n\n    var LOCALE_ZH = 'ZH';\n    var LOCALE_EN = 'EN';\n    var DEFAULT_LOCALE = LOCALE_EN;\n    var localeStorage = {};\n    var localeModels = {};\n    var SYSTEM_LANG = !env.domSupported ? DEFAULT_LOCALE : function () {\n      var langStr = (/* eslint-disable-next-line */\n      document.documentElement.lang || navigator.language || navigator.browserLanguage || DEFAULT_LOCALE).toUpperCase();\n      return langStr.indexOf(LOCALE_ZH) > -1 ? LOCALE_ZH : DEFAULT_LOCALE;\n    }();\n    function registerLocale(locale, localeObj) {\n      locale = locale.toUpperCase();\n      localeModels[locale] = new Model(localeObj);\n      localeStorage[locale] = localeObj;\n    }\n    // export function getLocale(locale: string) {\n    //     return localeStorage[locale];\n    // }\n    function createLocaleObject(locale) {\n      if (isString(locale)) {\n        var localeObj = localeStorage[locale.toUpperCase()] || {};\n        if (locale === LOCALE_ZH || locale === LOCALE_EN) {\n          return clone(localeObj);\n        } else {\n          return merge(clone(localeObj), clone(localeStorage[DEFAULT_LOCALE]), false);\n        }\n      } else {\n        return merge(clone(locale), clone(localeStorage[DEFAULT_LOCALE]), false);\n      }\n    }\n    function getLocaleModel(lang) {\n      return localeModels[lang];\n    }\n    function getDefaultLocaleModel() {\n      return localeModels[DEFAULT_LOCALE];\n    }\n    // Default locale\n    registerLocale(LOCALE_EN, langEN);\n    registerLocale(LOCALE_ZH, langZH);\n\n    var ONE_SECOND = 1000;\n    var ONE_MINUTE = ONE_SECOND * 60;\n    var ONE_HOUR = ONE_MINUTE * 60;\n    var ONE_DAY = ONE_HOUR * 24;\n    var ONE_YEAR = ONE_DAY * 365;\n    var defaultLeveledFormatter = {\n      year: '{yyyy}',\n      month: '{MMM}',\n      day: '{d}',\n      hour: '{HH}:{mm}',\n      minute: '{HH}:{mm}',\n      second: '{HH}:{mm}:{ss}',\n      millisecond: '{HH}:{mm}:{ss} {SSS}',\n      none: '{yyyy}-{MM}-{dd} {HH}:{mm}:{ss} {SSS}'\n    };\n    var fullDayFormatter = '{yyyy}-{MM}-{dd}';\n    var fullLeveledFormatter = {\n      year: '{yyyy}',\n      month: '{yyyy}-{MM}',\n      day: fullDayFormatter,\n      hour: fullDayFormatter + ' ' + defaultLeveledFormatter.hour,\n      minute: fullDayFormatter + ' ' + defaultLeveledFormatter.minute,\n      second: fullDayFormatter + ' ' + defaultLeveledFormatter.second,\n      millisecond: defaultLeveledFormatter.none\n    };\n    var primaryTimeUnits = ['year', 'month', 'day', 'hour', 'minute', 'second', 'millisecond'];\n    var timeUnits = ['year', 'half-year', 'quarter', 'month', 'week', 'half-week', 'day', 'half-day', 'quarter-day', 'hour', 'minute', 'second', 'millisecond'];\n    function pad(str, len) {\n      str += '';\n      return '0000'.substr(0, len - str.length) + str;\n    }\n    function getPrimaryTimeUnit(timeUnit) {\n      switch (timeUnit) {\n        case 'half-year':\n        case 'quarter':\n          return 'month';\n        case 'week':\n        case 'half-week':\n          return 'day';\n        case 'half-day':\n        case 'quarter-day':\n          return 'hour';\n        default:\n          // year, minutes, second, milliseconds\n          return timeUnit;\n      }\n    }\n    function isPrimaryTimeUnit(timeUnit) {\n      return timeUnit === getPrimaryTimeUnit(timeUnit);\n    }\n    function getDefaultFormatPrecisionOfInterval(timeUnit) {\n      switch (timeUnit) {\n        case 'year':\n        case 'month':\n          return 'day';\n        case 'millisecond':\n          return 'millisecond';\n        default:\n          // Also for day, hour, minute, second\n          return 'second';\n      }\n    }\n    function format(\n    // Note: The result based on `isUTC` are totally different, which can not be just simply\n    // substituted by the result without `isUTC`. So we make the param `isUTC` mandatory.\n    time, template, isUTC, lang) {\n      var date = parseDate(time);\n      var y = date[fullYearGetterName(isUTC)]();\n      var M = date[monthGetterName(isUTC)]() + 1;\n      var q = Math.floor((M - 1) / 3) + 1;\n      var d = date[dateGetterName(isUTC)]();\n      var e = date['get' + (isUTC ? 'UTC' : '') + 'Day']();\n      var H = date[hoursGetterName(isUTC)]();\n      var h = (H - 1) % 12 + 1;\n      var m = date[minutesGetterName(isUTC)]();\n      var s = date[secondsGetterName(isUTC)]();\n      var S = date[millisecondsGetterName(isUTC)]();\n      var a = H >= 12 ? 'pm' : 'am';\n      var A = a.toUpperCase();\n      var localeModel = lang instanceof Model ? lang : getLocaleModel(lang || SYSTEM_LANG) || getDefaultLocaleModel();\n      var timeModel = localeModel.getModel('time');\n      var month = timeModel.get('month');\n      var monthAbbr = timeModel.get('monthAbbr');\n      var dayOfWeek = timeModel.get('dayOfWeek');\n      var dayOfWeekAbbr = timeModel.get('dayOfWeekAbbr');\n      return (template || '').replace(/{a}/g, a + '').replace(/{A}/g, A + '').replace(/{yyyy}/g, y + '').replace(/{yy}/g, pad(y % 100 + '', 2)).replace(/{Q}/g, q + '').replace(/{MMMM}/g, month[M - 1]).replace(/{MMM}/g, monthAbbr[M - 1]).replace(/{MM}/g, pad(M, 2)).replace(/{M}/g, M + '').replace(/{dd}/g, pad(d, 2)).replace(/{d}/g, d + '').replace(/{eeee}/g, dayOfWeek[e]).replace(/{ee}/g, dayOfWeekAbbr[e]).replace(/{e}/g, e + '').replace(/{HH}/g, pad(H, 2)).replace(/{H}/g, H + '').replace(/{hh}/g, pad(h + '', 2)).replace(/{h}/g, h + '').replace(/{mm}/g, pad(m, 2)).replace(/{m}/g, m + '').replace(/{ss}/g, pad(s, 2)).replace(/{s}/g, s + '').replace(/{SSS}/g, pad(S, 3)).replace(/{S}/g, S + '');\n    }\n    function leveledFormat(tick, idx, formatter, lang, isUTC) {\n      var template = null;\n      if (isString(formatter)) {\n        // Single formatter for all units at all levels\n        template = formatter;\n      } else if (isFunction(formatter)) {\n        // Callback formatter\n        template = formatter(tick.value, idx, {\n          level: tick.level\n        });\n      } else {\n        var defaults$1 = extend({}, defaultLeveledFormatter);\n        if (tick.level > 0) {\n          for (var i = 0; i < primaryTimeUnits.length; ++i) {\n            defaults$1[primaryTimeUnits[i]] = \"{primary|\" + defaults$1[primaryTimeUnits[i]] + \"}\";\n          }\n        }\n        var mergedFormatter = formatter ? formatter.inherit === false ? formatter // Use formatter with bigger units\n        : defaults(formatter, defaults$1) : defaults$1;\n        var unit = getUnitFromValue(tick.value, isUTC);\n        if (mergedFormatter[unit]) {\n          template = mergedFormatter[unit];\n        } else if (mergedFormatter.inherit) {\n          // Unit formatter is not defined and should inherit from bigger units\n          var targetId = timeUnits.indexOf(unit);\n          for (var i = targetId - 1; i >= 0; --i) {\n            if (mergedFormatter[unit]) {\n              template = mergedFormatter[unit];\n              break;\n            }\n          }\n          template = template || defaults$1.none;\n        }\n        if (isArray(template)) {\n          var levelId = tick.level == null ? 0 : tick.level >= 0 ? tick.level : template.length + tick.level;\n          levelId = Math.min(levelId, template.length - 1);\n          template = template[levelId];\n        }\n      }\n      return format(new Date(tick.value), template, isUTC, lang);\n    }\n    function getUnitFromValue(value, isUTC) {\n      var date = parseDate(value);\n      var M = date[monthGetterName(isUTC)]() + 1;\n      var d = date[dateGetterName(isUTC)]();\n      var h = date[hoursGetterName(isUTC)]();\n      var m = date[minutesGetterName(isUTC)]();\n      var s = date[secondsGetterName(isUTC)]();\n      var S = date[millisecondsGetterName(isUTC)]();\n      var isSecond = S === 0;\n      var isMinute = isSecond && s === 0;\n      var isHour = isMinute && m === 0;\n      var isDay = isHour && h === 0;\n      var isMonth = isDay && d === 1;\n      var isYear = isMonth && M === 1;\n      if (isYear) {\n        return 'year';\n      } else if (isMonth) {\n        return 'month';\n      } else if (isDay) {\n        return 'day';\n      } else if (isHour) {\n        return 'hour';\n      } else if (isMinute) {\n        return 'minute';\n      } else if (isSecond) {\n        return 'second';\n      } else {\n        return 'millisecond';\n      }\n    }\n    function getUnitValue(value, unit, isUTC) {\n      var date = isNumber(value) ? parseDate(value) : value;\n      unit = unit || getUnitFromValue(value, isUTC);\n      switch (unit) {\n        case 'year':\n          return date[fullYearGetterName(isUTC)]();\n        case 'half-year':\n          return date[monthGetterName(isUTC)]() >= 6 ? 1 : 0;\n        case 'quarter':\n          return Math.floor((date[monthGetterName(isUTC)]() + 1) / 4);\n        case 'month':\n          return date[monthGetterName(isUTC)]();\n        case 'day':\n          return date[dateGetterName(isUTC)]();\n        case 'half-day':\n          return date[hoursGetterName(isUTC)]() / 24;\n        case 'hour':\n          return date[hoursGetterName(isUTC)]();\n        case 'minute':\n          return date[minutesGetterName(isUTC)]();\n        case 'second':\n          return date[secondsGetterName(isUTC)]();\n        case 'millisecond':\n          return date[millisecondsGetterName(isUTC)]();\n      }\n    }\n    function fullYearGetterName(isUTC) {\n      return isUTC ? 'getUTCFullYear' : 'getFullYear';\n    }\n    function monthGetterName(isUTC) {\n      return isUTC ? 'getUTCMonth' : 'getMonth';\n    }\n    function dateGetterName(isUTC) {\n      return isUTC ? 'getUTCDate' : 'getDate';\n    }\n    function hoursGetterName(isUTC) {\n      return isUTC ? 'getUTCHours' : 'getHours';\n    }\n    function minutesGetterName(isUTC) {\n      return isUTC ? 'getUTCMinutes' : 'getMinutes';\n    }\n    function secondsGetterName(isUTC) {\n      return isUTC ? 'getUTCSeconds' : 'getSeconds';\n    }\n    function millisecondsGetterName(isUTC) {\n      return isUTC ? 'getUTCMilliseconds' : 'getMilliseconds';\n    }\n    function fullYearSetterName(isUTC) {\n      return isUTC ? 'setUTCFullYear' : 'setFullYear';\n    }\n    function monthSetterName(isUTC) {\n      return isUTC ? 'setUTCMonth' : 'setMonth';\n    }\n    function dateSetterName(isUTC) {\n      return isUTC ? 'setUTCDate' : 'setDate';\n    }\n    function hoursSetterName(isUTC) {\n      return isUTC ? 'setUTCHours' : 'setHours';\n    }\n    function minutesSetterName(isUTC) {\n      return isUTC ? 'setUTCMinutes' : 'setMinutes';\n    }\n    function secondsSetterName(isUTC) {\n      return isUTC ? 'setUTCSeconds' : 'setSeconds';\n    }\n    function millisecondsSetterName(isUTC) {\n      return isUTC ? 'setUTCMilliseconds' : 'setMilliseconds';\n    }\n\n    function getTextRect(text, font, align, verticalAlign, padding, rich, truncate, lineHeight) {\n      var textEl = new ZRText({\n        style: {\n          text: text,\n          font: font,\n          align: align,\n          verticalAlign: verticalAlign,\n          padding: padding,\n          rich: rich,\n          overflow: truncate ? 'truncate' : null,\n          lineHeight: lineHeight\n        }\n      });\n      return textEl.getBoundingRect();\n    }\n\n    /**\r\n     * Add a comma each three digit.\r\n     */\n    function addCommas(x) {\n      if (!isNumeric(x)) {\n        return isString(x) ? x : '-';\n      }\n      var parts = (x + '').split('.');\n      return parts[0].replace(/(\\d{1,3})(?=(?:\\d{3})+(?!\\d))/g, '$1,') + (parts.length > 1 ? '.' + parts[1] : '');\n    }\n    function toCamelCase(str, upperCaseFirst) {\n      str = (str || '').toLowerCase().replace(/-(.)/g, function (match, group1) {\n        return group1.toUpperCase();\n      });\n      if (upperCaseFirst && str) {\n        str = str.charAt(0).toUpperCase() + str.slice(1);\n      }\n      return str;\n    }\n    var normalizeCssArray$1 = normalizeCssArray;\n    /**\r\n     * Make value user readable for tooltip and label.\r\n     * \"User readable\":\r\n     *     Try to not print programmer-specific text like NaN, Infinity, null, undefined.\r\n     *     Avoid to display an empty string, which users can not recognize there is\r\n     *     a value and it might look like a bug.\r\n     */\n    function makeValueReadable(value, valueType, useUTC) {\n      var USER_READABLE_DEFUALT_TIME_PATTERN = '{yyyy}-{MM}-{dd} {HH}:{mm}:{ss}';\n      function stringToUserReadable(str) {\n        return str && trim(str) ? str : '-';\n      }\n      function isNumberUserReadable(num) {\n        return !!(num != null && !isNaN(num) && isFinite(num));\n      }\n      var isTypeTime = valueType === 'time';\n      var isValueDate = value instanceof Date;\n      if (isTypeTime || isValueDate) {\n        var date = isTypeTime ? parseDate(value) : value;\n        if (!isNaN(+date)) {\n          return format(date, USER_READABLE_DEFUALT_TIME_PATTERN, useUTC);\n        } else if (isValueDate) {\n          return '-';\n        }\n        // In other cases, continue to try to display the value in the following code.\n      }\n      if (valueType === 'ordinal') {\n        return isStringSafe(value) ? stringToUserReadable(value) : isNumber(value) ? isNumberUserReadable(value) ? value + '' : '-' : '-';\n      }\n      // By default.\n      var numericResult = numericToNumber(value);\n      return isNumberUserReadable(numericResult) ? addCommas(numericResult) : isStringSafe(value) ? stringToUserReadable(value) : typeof value === 'boolean' ? value + '' : '-';\n    }\n    var TPL_VAR_ALIAS = ['a', 'b', 'c', 'd', 'e', 'f', 'g'];\n    var wrapVar = function (varName, seriesIdx) {\n      return '{' + varName + (seriesIdx == null ? '' : seriesIdx) + '}';\n    };\n    /**\r\n     * Template formatter\r\n     * @param {Array.<Object>|Object} paramsList\r\n     */\n    function formatTpl(tpl, paramsList, encode) {\n      if (!isArray(paramsList)) {\n        paramsList = [paramsList];\n      }\n      var seriesLen = paramsList.length;\n      if (!seriesLen) {\n        return '';\n      }\n      var $vars = paramsList[0].$vars || [];\n      for (var i = 0; i < $vars.length; i++) {\n        var alias = TPL_VAR_ALIAS[i];\n        tpl = tpl.replace(wrapVar(alias), wrapVar(alias, 0));\n      }\n      for (var seriesIdx = 0; seriesIdx < seriesLen; seriesIdx++) {\n        for (var k = 0; k < $vars.length; k++) {\n          var val = paramsList[seriesIdx][$vars[k]];\n          tpl = tpl.replace(wrapVar(TPL_VAR_ALIAS[k], seriesIdx), encode ? encodeHTML(val) : val);\n        }\n      }\n      return tpl;\n    }\n    /**\r\n     * simple Template formatter\r\n     */\n    function formatTplSimple(tpl, param, encode) {\n      each(param, function (value, key) {\n        tpl = tpl.replace('{' + key + '}', encode ? encodeHTML(value) : value);\n      });\n      return tpl;\n    }\n    function getTooltipMarker(inOpt, extraCssText) {\n      var opt = isString(inOpt) ? {\n        color: inOpt,\n        extraCssText: extraCssText\n      } : inOpt || {};\n      var color = opt.color;\n      var type = opt.type;\n      extraCssText = opt.extraCssText;\n      var renderMode = opt.renderMode || 'html';\n      if (!color) {\n        return '';\n      }\n      if (renderMode === 'html') {\n        return type === 'subItem' ? '<span style=\"display:inline-block;vertical-align:middle;margin-right:8px;margin-left:3px;' + 'border-radius:4px;width:4px;height:4px;background-color:'\n        // Only support string\n        + encodeHTML(color) + ';' + (extraCssText || '') + '\"></span>' : '<span style=\"display:inline-block;margin-right:4px;' + 'border-radius:10px;width:10px;height:10px;background-color:' + encodeHTML(color) + ';' + (extraCssText || '') + '\"></span>';\n      } else {\n        // Should better not to auto generate style name by auto-increment number here.\n        // Because this util is usually called in tooltip formatter, which is probably\n        // called repeatedly when mouse move and the auto-increment number increases fast.\n        // Users can make their own style name by theirselves, make it unique and readable.\n        var markerId = opt.markerId || 'markerX';\n        return {\n          renderMode: renderMode,\n          content: '{' + markerId + '|}  ',\n          style: type === 'subItem' ? {\n            width: 4,\n            height: 4,\n            borderRadius: 2,\n            backgroundColor: color\n          } : {\n            width: 10,\n            height: 10,\n            borderRadius: 5,\n            backgroundColor: color\n          }\n        };\n      }\n    }\n    /**\r\n     * @deprecated Use `time/format` instead.\r\n     * ISO Date format\r\n     * @param {string} tpl\r\n     * @param {number} value\r\n     * @param {boolean} [isUTC=false] Default in local time.\r\n     *           see `module:echarts/scale/Time`\r\n     *           and `module:echarts/util/number#parseDate`.\r\n     * @inner\r\n     */\n    function formatTime(tpl, value, isUTC) {\n      if (\"development\" !== 'production') {\n        deprecateReplaceLog('echarts.format.formatTime', 'echarts.time.format');\n      }\n      if (tpl === 'week' || tpl === 'month' || tpl === 'quarter' || tpl === 'half-year' || tpl === 'year') {\n        tpl = 'MM-dd\\nyyyy';\n      }\n      var date = parseDate(value);\n      var getUTC = isUTC ? 'getUTC' : 'get';\n      var y = date[getUTC + 'FullYear']();\n      var M = date[getUTC + 'Month']() + 1;\n      var d = date[getUTC + 'Date']();\n      var h = date[getUTC + 'Hours']();\n      var m = date[getUTC + 'Minutes']();\n      var s = date[getUTC + 'Seconds']();\n      var S = date[getUTC + 'Milliseconds']();\n      tpl = tpl.replace('MM', pad(M, 2)).replace('M', M).replace('yyyy', y).replace('yy', pad(y % 100 + '', 2)).replace('dd', pad(d, 2)).replace('d', d).replace('hh', pad(h, 2)).replace('h', h).replace('mm', pad(m, 2)).replace('m', m).replace('ss', pad(s, 2)).replace('s', s).replace('SSS', pad(S, 3));\n      return tpl;\n    }\n    /**\r\n     * Capital first\r\n     * @param {string} str\r\n     * @return {string}\r\n     */\n    function capitalFirst(str) {\n      return str ? str.charAt(0).toUpperCase() + str.substr(1) : str;\n    }\n    /**\r\n     * @return Never be null/undefined.\r\n     */\n    function convertToColorString(color, defaultColor) {\n      defaultColor = defaultColor || 'transparent';\n      return isString(color) ? color : isObject(color) ? color.colorStops && (color.colorStops[0] || {}).color || defaultColor : defaultColor;\n    }\n    /**\r\n     * open new tab\r\n     * @param link url\r\n     * @param target blank or self\r\n     */\n    function windowOpen(link, target) {\n      /* global window */\n      if (target === '_blank' || target === 'blank') {\n        var blank = window.open();\n        blank.opener = null;\n        blank.location.href = link;\n      } else {\n        window.open(link, target);\n      }\n    }\n\n    var each$1 = each;\n    /**\r\n     * @public\r\n     */\n    var LOCATION_PARAMS = ['left', 'right', 'top', 'bottom', 'width', 'height'];\n    /**\r\n     * @public\r\n     */\n    var HV_NAMES = [['width', 'left', 'right'], ['height', 'top', 'bottom']];\n    function boxLayout(orient, group, gap, maxWidth, maxHeight) {\n      var x = 0;\n      var y = 0;\n      if (maxWidth == null) {\n        maxWidth = Infinity;\n      }\n      if (maxHeight == null) {\n        maxHeight = Infinity;\n      }\n      var currentLineMaxSize = 0;\n      group.eachChild(function (child, idx) {\n        var rect = child.getBoundingRect();\n        var nextChild = group.childAt(idx + 1);\n        var nextChildRect = nextChild && nextChild.getBoundingRect();\n        var nextX;\n        var nextY;\n        if (orient === 'horizontal') {\n          var moveX = rect.width + (nextChildRect ? -nextChildRect.x + rect.x : 0);\n          nextX = x + moveX;\n          // Wrap when width exceeds maxWidth or meet a `newline` group\n          // FIXME compare before adding gap?\n          if (nextX > maxWidth || child.newline) {\n            x = 0;\n            nextX = moveX;\n            y += currentLineMaxSize + gap;\n            currentLineMaxSize = rect.height;\n          } else {\n            // FIXME: consider rect.y is not `0`?\n            currentLineMaxSize = Math.max(currentLineMaxSize, rect.height);\n          }\n        } else {\n          var moveY = rect.height + (nextChildRect ? -nextChildRect.y + rect.y : 0);\n          nextY = y + moveY;\n          // Wrap when width exceeds maxHeight or meet a `newline` group\n          if (nextY > maxHeight || child.newline) {\n            x += currentLineMaxSize + gap;\n            y = 0;\n            nextY = moveY;\n            currentLineMaxSize = rect.width;\n          } else {\n            currentLineMaxSize = Math.max(currentLineMaxSize, rect.width);\n          }\n        }\n        if (child.newline) {\n          return;\n        }\n        child.x = x;\n        child.y = y;\n        child.markRedraw();\n        orient === 'horizontal' ? x = nextX + gap : y = nextY + gap;\n      });\n    }\n    /**\r\n     * VBox or HBox layouting\r\n     * @param {string} orient\r\n     * @param {module:zrender/graphic/Group} group\r\n     * @param {number} gap\r\n     * @param {number} [width=Infinity]\r\n     * @param {number} [height=Infinity]\r\n     */\n    var box = boxLayout;\n    /**\r\n     * VBox layouting\r\n     * @param {module:zrender/graphic/Group} group\r\n     * @param {number} gap\r\n     * @param {number} [width=Infinity]\r\n     * @param {number} [height=Infinity]\r\n     */\n    var vbox = curry(boxLayout, 'vertical');\n    /**\r\n     * HBox layouting\r\n     * @param {module:zrender/graphic/Group} group\r\n     * @param {number} gap\r\n     * @param {number} [width=Infinity]\r\n     * @param {number} [height=Infinity]\r\n     */\n    var hbox = curry(boxLayout, 'horizontal');\n    /**\r\n     * If x or x2 is not specified or 'center' 'left' 'right',\r\n     * the width would be as long as possible.\r\n     * If y or y2 is not specified or 'middle' 'top' 'bottom',\r\n     * the height would be as long as possible.\r\n     */\n    function getAvailableSize(positionInfo, containerRect, margin) {\n      var containerWidth = containerRect.width;\n      var containerHeight = containerRect.height;\n      var x = parsePercent$1(positionInfo.left, containerWidth);\n      var y = parsePercent$1(positionInfo.top, containerHeight);\n      var x2 = parsePercent$1(positionInfo.right, containerWidth);\n      var y2 = parsePercent$1(positionInfo.bottom, containerHeight);\n      (isNaN(x) || isNaN(parseFloat(positionInfo.left))) && (x = 0);\n      (isNaN(x2) || isNaN(parseFloat(positionInfo.right))) && (x2 = containerWidth);\n      (isNaN(y) || isNaN(parseFloat(positionInfo.top))) && (y = 0);\n      (isNaN(y2) || isNaN(parseFloat(positionInfo.bottom))) && (y2 = containerHeight);\n      margin = normalizeCssArray$1(margin || 0);\n      return {\n        width: Math.max(x2 - x - margin[1] - margin[3], 0),\n        height: Math.max(y2 - y - margin[0] - margin[2], 0)\n      };\n    }\n    /**\r\n     * Parse position info.\r\n     */\n    function getLayoutRect(positionInfo, containerRect, margin) {\n      margin = normalizeCssArray$1(margin || 0);\n      var containerWidth = containerRect.width;\n      var containerHeight = containerRect.height;\n      var left = parsePercent$1(positionInfo.left, containerWidth);\n      var top = parsePercent$1(positionInfo.top, containerHeight);\n      var right = parsePercent$1(positionInfo.right, containerWidth);\n      var bottom = parsePercent$1(positionInfo.bottom, containerHeight);\n      var width = parsePercent$1(positionInfo.width, containerWidth);\n      var height = parsePercent$1(positionInfo.height, containerHeight);\n      var verticalMargin = margin[2] + margin[0];\n      var horizontalMargin = margin[1] + margin[3];\n      var aspect = positionInfo.aspect;\n      // If width is not specified, calculate width from left and right\n      if (isNaN(width)) {\n        width = containerWidth - right - horizontalMargin - left;\n      }\n      if (isNaN(height)) {\n        height = containerHeight - bottom - verticalMargin - top;\n      }\n      if (aspect != null) {\n        // If width and height are not given\n        // 1. Graph should not exceeds the container\n        // 2. Aspect must be keeped\n        // 3. Graph should take the space as more as possible\n        // FIXME\n        // Margin is not considered, because there is no case that both\n        // using margin and aspect so far.\n        if (isNaN(width) && isNaN(height)) {\n          if (aspect > containerWidth / containerHeight) {\n            width = containerWidth * 0.8;\n          } else {\n            height = containerHeight * 0.8;\n          }\n        }\n        // Calculate width or height with given aspect\n        if (isNaN(width)) {\n          width = aspect * height;\n        }\n        if (isNaN(height)) {\n          height = width / aspect;\n        }\n      }\n      // If left is not specified, calculate left from right and width\n      if (isNaN(left)) {\n        left = containerWidth - right - width - horizontalMargin;\n      }\n      if (isNaN(top)) {\n        top = containerHeight - bottom - height - verticalMargin;\n      }\n      // Align left and top\n      switch (positionInfo.left || positionInfo.right) {\n        case 'center':\n          left = containerWidth / 2 - width / 2 - margin[3];\n          break;\n        case 'right':\n          left = containerWidth - width - horizontalMargin;\n          break;\n      }\n      switch (positionInfo.top || positionInfo.bottom) {\n        case 'middle':\n        case 'center':\n          top = containerHeight / 2 - height / 2 - margin[0];\n          break;\n        case 'bottom':\n          top = containerHeight - height - verticalMargin;\n          break;\n      }\n      // If something is wrong and left, top, width, height are calculated as NaN\n      left = left || 0;\n      top = top || 0;\n      if (isNaN(width)) {\n        // Width may be NaN if only one value is given except width\n        width = containerWidth - horizontalMargin - left - (right || 0);\n      }\n      if (isNaN(height)) {\n        // Height may be NaN if only one value is given except height\n        height = containerHeight - verticalMargin - top - (bottom || 0);\n      }\n      var rect = new BoundingRect(left + margin[3], top + margin[0], width, height);\n      rect.margin = margin;\n      return rect;\n    }\n    /**\r\n     * Position a zr element in viewport\r\n     *  Group position is specified by either\r\n     *  {left, top}, {right, bottom}\r\n     *  If all properties exists, right and bottom will be igonred.\r\n     *\r\n     * Logic:\r\n     *     1. Scale (against origin point in parent coord)\r\n     *     2. Rotate (against origin point in parent coord)\r\n     *     3. Translate (with el.position by this method)\r\n     * So this method only fixes the last step 'Translate', which does not affect\r\n     * scaling and rotating.\r\n     *\r\n     * If be called repeatedly with the same input el, the same result will be gotten.\r\n     *\r\n     * Return true if the layout happened.\r\n     *\r\n     * @param el Should have `getBoundingRect` method.\r\n     * @param positionInfo\r\n     * @param positionInfo.left\r\n     * @param positionInfo.top\r\n     * @param positionInfo.right\r\n     * @param positionInfo.bottom\r\n     * @param positionInfo.width Only for opt.boundingModel: 'raw'\r\n     * @param positionInfo.height Only for opt.boundingModel: 'raw'\r\n     * @param containerRect\r\n     * @param margin\r\n     * @param opt\r\n     * @param opt.hv Only horizontal or only vertical. Default to be [1, 1]\r\n     * @param opt.boundingMode\r\n     *        Specify how to calculate boundingRect when locating.\r\n     *        'all': Position the boundingRect that is transformed and uioned\r\n     *               both itself and its descendants.\r\n     *               This mode simplies confine the elements in the bounding\r\n     *               of their container (e.g., using 'right: 0').\r\n     *        'raw': Position the boundingRect that is not transformed and only itself.\r\n     *               This mode is useful when you want a element can overflow its\r\n     *               container. (Consider a rotated circle needs to be located in a corner.)\r\n     *               In this mode positionInfo.width/height can only be number.\r\n     */\n    function positionElement(el, positionInfo, containerRect, margin, opt, out) {\n      var h = !opt || !opt.hv || opt.hv[0];\n      var v = !opt || !opt.hv || opt.hv[1];\n      var boundingMode = opt && opt.boundingMode || 'all';\n      out = out || el;\n      out.x = el.x;\n      out.y = el.y;\n      if (!h && !v) {\n        return false;\n      }\n      var rect;\n      if (boundingMode === 'raw') {\n        rect = el.type === 'group' ? new BoundingRect(0, 0, +positionInfo.width || 0, +positionInfo.height || 0) : el.getBoundingRect();\n      } else {\n        rect = el.getBoundingRect();\n        if (el.needLocalTransform()) {\n          var transform = el.getLocalTransform();\n          // Notice: raw rect may be inner object of el,\n          // which should not be modified.\n          rect = rect.clone();\n          rect.applyTransform(transform);\n        }\n      }\n      // The real width and height can not be specified but calculated by the given el.\n      var layoutRect = getLayoutRect(defaults({\n        width: rect.width,\n        height: rect.height\n      }, positionInfo), containerRect, margin);\n      // Because 'tranlate' is the last step in transform\n      // (see zrender/core/Transformable#getLocalTransform),\n      // we can just only modify el.position to get final result.\n      var dx = h ? layoutRect.x - rect.x : 0;\n      var dy = v ? layoutRect.y - rect.y : 0;\n      if (boundingMode === 'raw') {\n        out.x = dx;\n        out.y = dy;\n      } else {\n        out.x += dx;\n        out.y += dy;\n      }\n      if (out === el) {\n        el.markRedraw();\n      }\n      return true;\n    }\n    /**\r\n     * @param option Contains some of the properties in HV_NAMES.\r\n     * @param hvIdx 0: horizontal; 1: vertical.\r\n     */\n    function sizeCalculable(option, hvIdx) {\n      return option[HV_NAMES[hvIdx][0]] != null || option[HV_NAMES[hvIdx][1]] != null && option[HV_NAMES[hvIdx][2]] != null;\n    }\n    function fetchLayoutMode(ins) {\n      var layoutMode = ins.layoutMode || ins.constructor.layoutMode;\n      return isObject(layoutMode) ? layoutMode : layoutMode ? {\n        type: layoutMode\n      } : null;\n    }\n    /**\r\n     * Consider Case:\r\n     * When default option has {left: 0, width: 100}, and we set {right: 0}\r\n     * through setOption or media query, using normal zrUtil.merge will cause\r\n     * {right: 0} does not take effect.\r\n     *\r\n     * @example\r\n     * ComponentModel.extend({\r\n     *     init: function () {\r\n     *         ...\r\n     *         let inputPositionParams = layout.getLayoutParams(option);\r\n     *         this.mergeOption(inputPositionParams);\r\n     *     },\r\n     *     mergeOption: function (newOption) {\r\n     *         newOption && zrUtil.merge(thisOption, newOption, true);\r\n     *         layout.mergeLayoutParam(thisOption, newOption);\r\n     *     }\r\n     * });\r\n     *\r\n     * @param targetOption\r\n     * @param newOption\r\n     * @param opt\r\n     */\n    function mergeLayoutParam(targetOption, newOption, opt) {\n      var ignoreSize = opt && opt.ignoreSize;\n      !isArray(ignoreSize) && (ignoreSize = [ignoreSize, ignoreSize]);\n      var hResult = merge(HV_NAMES[0], 0);\n      var vResult = merge(HV_NAMES[1], 1);\n      copy(HV_NAMES[0], targetOption, hResult);\n      copy(HV_NAMES[1], targetOption, vResult);\n      function merge(names, hvIdx) {\n        var newParams = {};\n        var newValueCount = 0;\n        var merged = {};\n        var mergedValueCount = 0;\n        var enoughParamNumber = 2;\n        each$1(names, function (name) {\n          merged[name] = targetOption[name];\n        });\n        each$1(names, function (name) {\n          // Consider case: newOption.width is null, which is\n          // set by user for removing width setting.\n          hasProp(newOption, name) && (newParams[name] = merged[name] = newOption[name]);\n          hasValue(newParams, name) && newValueCount++;\n          hasValue(merged, name) && mergedValueCount++;\n        });\n        if (ignoreSize[hvIdx]) {\n          // Only one of left/right is premitted to exist.\n          if (hasValue(newOption, names[1])) {\n            merged[names[2]] = null;\n          } else if (hasValue(newOption, names[2])) {\n            merged[names[1]] = null;\n          }\n          return merged;\n        }\n        // Case: newOption: {width: ..., right: ...},\n        // or targetOption: {right: ...} and newOption: {width: ...},\n        // There is no conflict when merged only has params count\n        // little than enoughParamNumber.\n        if (mergedValueCount === enoughParamNumber || !newValueCount) {\n          return merged;\n        }\n        // Case: newOption: {width: ..., right: ...},\n        // Than we can make sure user only want those two, and ignore\n        // all origin params in targetOption.\n        else if (newValueCount >= enoughParamNumber) {\n          return newParams;\n        } else {\n          // Chose another param from targetOption by priority.\n          for (var i = 0; i < names.length; i++) {\n            var name_1 = names[i];\n            if (!hasProp(newParams, name_1) && hasProp(targetOption, name_1)) {\n              newParams[name_1] = targetOption[name_1];\n              break;\n            }\n          }\n          return newParams;\n        }\n      }\n      function hasProp(obj, name) {\n        return obj.hasOwnProperty(name);\n      }\n      function hasValue(obj, name) {\n        return obj[name] != null && obj[name] !== 'auto';\n      }\n      function copy(names, target, source) {\n        each$1(names, function (name) {\n          target[name] = source[name];\n        });\n      }\n    }\n    /**\r\n     * Retrieve 'left', 'right', 'top', 'bottom', 'width', 'height' from object.\r\n     */\n    function getLayoutParams(source) {\n      return copyLayoutParams({}, source);\n    }\n    /**\r\n     * Retrieve 'left', 'right', 'top', 'bottom', 'width', 'height' from object.\r\n     * @param {Object} source\r\n     * @return {Object} Result contains those props.\r\n     */\n    function copyLayoutParams(target, source) {\n      source && target && each$1(LOCATION_PARAMS, function (name) {\n        source.hasOwnProperty(name) && (target[name] = source[name]);\n      });\n      return target;\n    }\n\n    var inner = makeInner();\n    var ComponentModel = /** @class */function (_super) {\n      __extends(ComponentModel, _super);\n      function ComponentModel(option, parentModel, ecModel) {\n        var _this = _super.call(this, option, parentModel, ecModel) || this;\n        _this.uid = getUID('ec_cpt_model');\n        return _this;\n      }\n      ComponentModel.prototype.init = function (option, parentModel, ecModel) {\n        this.mergeDefaultAndTheme(option, ecModel);\n      };\n      ComponentModel.prototype.mergeDefaultAndTheme = function (option, ecModel) {\n        var layoutMode = fetchLayoutMode(this);\n        var inputPositionParams = layoutMode ? getLayoutParams(option) : {};\n        var themeModel = ecModel.getTheme();\n        merge(option, themeModel.get(this.mainType));\n        merge(option, this.getDefaultOption());\n        if (layoutMode) {\n          mergeLayoutParam(option, inputPositionParams, layoutMode);\n        }\n      };\n      ComponentModel.prototype.mergeOption = function (option, ecModel) {\n        merge(this.option, option, true);\n        var layoutMode = fetchLayoutMode(this);\n        if (layoutMode) {\n          mergeLayoutParam(this.option, option, layoutMode);\n        }\n      };\n      /**\r\n       * Called immediately after `init` or `mergeOption` of this instance called.\r\n       */\n      ComponentModel.prototype.optionUpdated = function (newCptOption, isInit) {};\n      /**\r\n       * [How to declare defaultOption]:\r\n       *\r\n       * (A) If using class declaration in typescript (since echarts 5):\r\n       * ```ts\r\n       * import {ComponentOption} from '../model/option.js';\r\n       * export interface XxxOption extends ComponentOption {\r\n       *     aaa: number\r\n       * }\r\n       * export class XxxModel extends Component {\r\n       *     static type = 'xxx';\r\n       *     static defaultOption: XxxOption = {\r\n       *         aaa: 123\r\n       *     }\r\n       * }\r\n       * Component.registerClass(XxxModel);\r\n       * ```\r\n       * ```ts\r\n       * import {inheritDefaultOption} from '../util/component.js';\r\n       * import {XxxModel, XxxOption} from './XxxModel.js';\r\n       * export interface XxxSubOption extends XxxOption {\r\n       *     bbb: number\r\n       * }\r\n       * class XxxSubModel extends XxxModel {\r\n       *     static defaultOption: XxxSubOption = inheritDefaultOption(XxxModel.defaultOption, {\r\n       *         bbb: 456\r\n       *     })\r\n       *     fn() {\r\n       *         let opt = this.getDefaultOption();\r\n       *         // opt is {aaa: 123, bbb: 456}\r\n       *     }\r\n       * }\r\n       * ```\r\n       *\r\n       * (B) If using class extend (previous approach in echarts 3 & 4):\r\n       * ```js\r\n       * let XxxComponent = Component.extend({\r\n       *     defaultOption: {\r\n       *         xx: 123\r\n       *     }\r\n       * })\r\n       * ```\r\n       * ```js\r\n       * let XxxSubComponent = XxxComponent.extend({\r\n       *     defaultOption: {\r\n       *         yy: 456\r\n       *     },\r\n       *     fn: function () {\r\n       *         let opt = this.getDefaultOption();\r\n       *         // opt is {xx: 123, yy: 456}\r\n       *     }\r\n       * })\r\n       * ```\r\n       */\n      ComponentModel.prototype.getDefaultOption = function () {\n        var ctor = this.constructor;\n        // If using class declaration, it is different to travel super class\n        // in legacy env and auto merge defaultOption. So if using class\n        // declaration, defaultOption should be merged manually.\n        if (!isExtendedClass(ctor)) {\n          // When using ts class, defaultOption must be declared as static.\n          return ctor.defaultOption;\n        }\n        // FIXME: remove this approach?\n        var fields = inner(this);\n        if (!fields.defaultOption) {\n          var optList = [];\n          var clz = ctor;\n          while (clz) {\n            var opt = clz.prototype.defaultOption;\n            opt && optList.push(opt);\n            clz = clz.superClass;\n          }\n          var defaultOption = {};\n          for (var i = optList.length - 1; i >= 0; i--) {\n            defaultOption = merge(defaultOption, optList[i], true);\n          }\n          fields.defaultOption = defaultOption;\n        }\n        return fields.defaultOption;\n      };\n      /**\r\n       * Notice: always force to input param `useDefault` in case that forget to consider it.\r\n       * The same behavior as `modelUtil.parseFinder`.\r\n       *\r\n       * @param useDefault In many cases like series refer axis and axis refer grid,\r\n       *        If axis index / axis id not specified, use the first target as default.\r\n       *        In other cases like dataZoom refer axis, if not specified, measn no refer.\r\n       */\n      ComponentModel.prototype.getReferringComponents = function (mainType, opt) {\n        var indexKey = mainType + 'Index';\n        var idKey = mainType + 'Id';\n        return queryReferringComponents(this.ecModel, mainType, {\n          index: this.get(indexKey, true),\n          id: this.get(idKey, true)\n        }, opt);\n      };\n      ComponentModel.prototype.getBoxLayoutParams = function () {\n        // Consider itself having box layout configs.\n        var boxLayoutModel = this;\n        return {\n          left: boxLayoutModel.get('left'),\n          top: boxLayoutModel.get('top'),\n          right: boxLayoutModel.get('right'),\n          bottom: boxLayoutModel.get('bottom'),\n          width: boxLayoutModel.get('width'),\n          height: boxLayoutModel.get('height')\n        };\n      };\n      /**\r\n       * Get key for zlevel.\r\n       * If developers don't configure zlevel. We will assign zlevel to series based on the key.\r\n       * For example, lines with trail effect and progressive series will in an individual zlevel.\r\n       */\n      ComponentModel.prototype.getZLevelKey = function () {\n        return '';\n      };\n      ComponentModel.prototype.setZLevel = function (zlevel) {\n        this.option.zlevel = zlevel;\n      };\n      ComponentModel.protoInitialize = function () {\n        var proto = ComponentModel.prototype;\n        proto.type = 'component';\n        proto.id = '';\n        proto.name = '';\n        proto.mainType = '';\n        proto.subType = '';\n        proto.componentIndex = 0;\n      }();\n      return ComponentModel;\n    }(Model);\n    mountExtend(ComponentModel, Model);\n    enableClassManagement(ComponentModel);\n    enableSubTypeDefaulter(ComponentModel);\n    enableTopologicalTravel(ComponentModel, getDependencies);\n    function getDependencies(componentType) {\n      var deps = [];\n      each(ComponentModel.getClassesByMainType(componentType), function (clz) {\n        deps = deps.concat(clz.dependencies || clz.prototype.dependencies || []);\n      });\n      // Ensure main type.\n      deps = map(deps, function (type) {\n        return parseClassType(type).main;\n      });\n      // Hack dataset for convenience.\n      if (componentType !== 'dataset' && indexOf(deps, 'dataset') <= 0) {\n        deps.unshift('dataset');\n      }\n      return deps;\n    }\n\n    /*\n    * Licensed to the Apache Software Foundation (ASF) under one\n    * or more contributor license agreements.  See the NOTICE file\n    * distributed with this work for additional information\n    * regarding copyright ownership.  The ASF licenses this file\n    * to you under the Apache License, Version 2.0 (the\n    * \"License\"); you may not use this file except in compliance\n    * with the License.  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,\n    * software distributed under the License is distributed on an\n    * \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\n    * KIND, either express or implied.  See the License for the\n    * specific language governing permissions and limitations\n    * under the License.\n    */\n\n\n    /**\n     * AUTO-GENERATED FILE. DO NOT MODIFY.\n     */\n\n    /*\r\n    * Licensed to the Apache Software Foundation (ASF) under one\r\n    * or more contributor license agreements.  See the NOTICE file\r\n    * distributed with this work for additional information\r\n    * regarding copyright ownership.  The ASF licenses this file\r\n    * to you under the Apache License, Version 2.0 (the\r\n    * \"License\"); you may not use this file except in compliance\r\n    * with the License.  You may obtain a copy of the License at\r\n    *\r\n    *   http://www.apache.org/licenses/LICENSE-2.0\r\n    *\r\n    * Unless required by applicable law or agreed to in writing,\r\n    * software distributed under the License is distributed on an\r\n    * \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\r\n    * KIND, either express or implied.  See the License for the\r\n    * specific language governing permissions and limitations\r\n    * under the License.\r\n    */\n    var platform = '';\n    // Navigator not exists in node\n    if (typeof navigator !== 'undefined') {\n      /* global navigator */\n      platform = navigator.platform || '';\n    }\n    var decalColor = 'rgba(0, 0, 0, 0.2)';\n    var globalDefault = {\n      darkMode: 'auto',\n      // backgroundColor: 'rgba(0,0,0,0)',\n      colorBy: 'series',\n      color: ['#5470c6', '#91cc75', '#fac858', '#ee6666', '#73c0de', '#3ba272', '#fc8452', '#9a60b4', '#ea7ccc'],\n      gradientColor: ['#f6efa6', '#d88273', '#bf444c'],\n      aria: {\n        decal: {\n          decals: [{\n            color: decalColor,\n            dashArrayX: [1, 0],\n            dashArrayY: [2, 5],\n            symbolSize: 1,\n            rotation: Math.PI / 6\n          }, {\n            color: decalColor,\n            symbol: 'circle',\n            dashArrayX: [[8, 8], [0, 8, 8, 0]],\n            dashArrayY: [6, 0],\n            symbolSize: 0.8\n          }, {\n            color: decalColor,\n            dashArrayX: [1, 0],\n            dashArrayY: [4, 3],\n            rotation: -Math.PI / 4\n          }, {\n            color: decalColor,\n            dashArrayX: [[6, 6], [0, 6, 6, 0]],\n            dashArrayY: [6, 0]\n          }, {\n            color: decalColor,\n            dashArrayX: [[1, 0], [1, 6]],\n            dashArrayY: [1, 0, 6, 0],\n            rotation: Math.PI / 4\n          }, {\n            color: decalColor,\n            symbol: 'triangle',\n            dashArrayX: [[9, 9], [0, 9, 9, 0]],\n            dashArrayY: [7, 2],\n            symbolSize: 0.75\n          }]\n        }\n      },\n      // If xAxis and yAxis declared, grid is created by default.\n      // grid: {},\n      textStyle: {\n        // color: '#000',\n        // decoration: 'none',\n        // PENDING\n        fontFamily: platform.match(/^Win/) ? 'Microsoft YaHei' : 'sans-serif',\n        // fontFamily: 'Arial, Verdana, sans-serif',\n        fontSize: 12,\n        fontStyle: 'normal',\n        fontWeight: 'normal'\n      },\n      // http://blogs.adobe.com/webplatform/2014/02/24/using-blend-modes-in-html-canvas/\n      // https://developer.mozilla.org/en-US/docs/Web/API/CanvasRenderingContext2D/globalCompositeOperation\n      // Default is source-over\n      blendMode: null,\n      stateAnimation: {\n        duration: 300,\n        easing: 'cubicOut'\n      },\n      animation: 'auto',\n      animationDuration: 1000,\n      animationDurationUpdate: 500,\n      animationEasing: 'cubicInOut',\n      animationEasingUpdate: 'cubicInOut',\n      animationThreshold: 2000,\n      // Configuration for progressive/incremental rendering\n      progressiveThreshold: 3000,\n      progressive: 400,\n      // Threshold of if use single hover layer to optimize.\n      // It is recommended that `hoverLayerThreshold` is equivalent to or less than\n      // `progressiveThreshold`, otherwise hover will cause restart of progressive,\n      // which is unexpected.\n      // see example <echarts/test/heatmap-large.html>.\n      hoverLayerThreshold: 3000,\n      // See: module:echarts/scale/Time\n      useUTC: false\n    };\n\n    var VISUAL_DIMENSIONS = createHashMap(['tooltip', 'label', 'itemName', 'itemId', 'itemGroupId', 'itemChildGroupId', 'seriesName']);\n    var SOURCE_FORMAT_ORIGINAL = 'original';\n    var SOURCE_FORMAT_ARRAY_ROWS = 'arrayRows';\n    var SOURCE_FORMAT_OBJECT_ROWS = 'objectRows';\n    var SOURCE_FORMAT_KEYED_COLUMNS = 'keyedColumns';\n    var SOURCE_FORMAT_TYPED_ARRAY = 'typedArray';\n    var SOURCE_FORMAT_UNKNOWN = 'unknown';\n    var SERIES_LAYOUT_BY_COLUMN = 'column';\n    var SERIES_LAYOUT_BY_ROW = 'row';\n\n    // The result of `guessOrdinal`.\n    var BE_ORDINAL = {\n      Must: 1,\n      Might: 2,\n      Not: 3 // Other cases\n    };\n    var innerGlobalModel = makeInner();\n    /**\r\n     * MUST be called before mergeOption of all series.\r\n     */\n    function resetSourceDefaulter(ecModel) {\n      // `datasetMap` is used to make default encode.\n      innerGlobalModel(ecModel).datasetMap = createHashMap();\n    }\n    /**\r\n     * [The strategy of the arrengment of data dimensions for dataset]:\r\n     * \"value way\": all axes are non-category axes. So series one by one take\r\n     *     several (the number is coordSysDims.length) dimensions from dataset.\r\n     *     The result of data arrengment of data dimensions like:\r\n     *     | ser0_x | ser0_y | ser1_x | ser1_y | ser2_x | ser2_y |\r\n     * \"category way\": at least one axis is category axis. So the the first data\r\n     *     dimension is always mapped to the first category axis and shared by\r\n     *     all of the series. The other data dimensions are taken by series like\r\n     *     \"value way\" does.\r\n     *     The result of data arrengment of data dimensions like:\r\n     *     | ser_shared_x | ser0_y | ser1_y | ser2_y |\r\n     *\r\n     * @return encode Never be `null/undefined`.\r\n     */\n    function makeSeriesEncodeForAxisCoordSys(coordDimensions, seriesModel, source) {\n      var encode = {};\n      var datasetModel = querySeriesUpstreamDatasetModel(seriesModel);\n      // Currently only make default when using dataset, util more reqirements occur.\n      if (!datasetModel || !coordDimensions) {\n        return encode;\n      }\n      var encodeItemName = [];\n      var encodeSeriesName = [];\n      var ecModel = seriesModel.ecModel;\n      var datasetMap = innerGlobalModel(ecModel).datasetMap;\n      var key = datasetModel.uid + '_' + source.seriesLayoutBy;\n      var baseCategoryDimIndex;\n      var categoryWayValueDimStart;\n      coordDimensions = coordDimensions.slice();\n      each(coordDimensions, function (coordDimInfoLoose, coordDimIdx) {\n        var coordDimInfo = isObject(coordDimInfoLoose) ? coordDimInfoLoose : coordDimensions[coordDimIdx] = {\n          name: coordDimInfoLoose\n        };\n        if (coordDimInfo.type === 'ordinal' && baseCategoryDimIndex == null) {\n          baseCategoryDimIndex = coordDimIdx;\n          categoryWayValueDimStart = getDataDimCountOnCoordDim(coordDimInfo);\n        }\n        encode[coordDimInfo.name] = [];\n      });\n      var datasetRecord = datasetMap.get(key) || datasetMap.set(key, {\n        categoryWayDim: categoryWayValueDimStart,\n        valueWayDim: 0\n      });\n      // TODO\n      // Auto detect first time axis and do arrangement.\n      each(coordDimensions, function (coordDimInfo, coordDimIdx) {\n        var coordDimName = coordDimInfo.name;\n        var count = getDataDimCountOnCoordDim(coordDimInfo);\n        // In value way.\n        if (baseCategoryDimIndex == null) {\n          var start = datasetRecord.valueWayDim;\n          pushDim(encode[coordDimName], start, count);\n          pushDim(encodeSeriesName, start, count);\n          datasetRecord.valueWayDim += count;\n          // ??? TODO give a better default series name rule?\n          // especially when encode x y specified.\n          // consider: when multiple series share one dimension\n          // category axis, series name should better use\n          // the other dimension name. On the other hand, use\n          // both dimensions name.\n        }\n        // In category way, the first category axis.\n        else if (baseCategoryDimIndex === coordDimIdx) {\n          pushDim(encode[coordDimName], 0, count);\n          pushDim(encodeItemName, 0, count);\n        }\n        // In category way, the other axis.\n        else {\n          var start = datasetRecord.categoryWayDim;\n          pushDim(encode[coordDimName], start, count);\n          pushDim(encodeSeriesName, start, count);\n          datasetRecord.categoryWayDim += count;\n        }\n      });\n      function pushDim(dimIdxArr, idxFrom, idxCount) {\n        for (var i = 0; i < idxCount; i++) {\n          dimIdxArr.push(idxFrom + i);\n        }\n      }\n      function getDataDimCountOnCoordDim(coordDimInfo) {\n        var dimsDef = coordDimInfo.dimsDef;\n        return dimsDef ? dimsDef.length : 1;\n      }\n      encodeItemName.length && (encode.itemName = encodeItemName);\n      encodeSeriesName.length && (encode.seriesName = encodeSeriesName);\n      return encode;\n    }\n    /**\r\n     * Work for data like [{name: ..., value: ...}, ...].\r\n     *\r\n     * @return encode Never be `null/undefined`.\r\n     */\n    function makeSeriesEncodeForNameBased(seriesModel, source, dimCount) {\n      var encode = {};\n      var datasetModel = querySeriesUpstreamDatasetModel(seriesModel);\n      // Currently only make default when using dataset, util more reqirements occur.\n      if (!datasetModel) {\n        return encode;\n      }\n      var sourceFormat = source.sourceFormat;\n      var dimensionsDefine = source.dimensionsDefine;\n      var potentialNameDimIndex;\n      if (sourceFormat === SOURCE_FORMAT_OBJECT_ROWS || sourceFormat === SOURCE_FORMAT_KEYED_COLUMNS) {\n        each(dimensionsDefine, function (dim, idx) {\n          if ((isObject(dim) ? dim.name : dim) === 'name') {\n            potentialNameDimIndex = idx;\n          }\n        });\n      }\n      var idxResult = function () {\n        var idxRes0 = {};\n        var idxRes1 = {};\n        var guessRecords = [];\n        // 5 is an experience value.\n        for (var i = 0, len = Math.min(5, dimCount); i < len; i++) {\n          var guessResult = doGuessOrdinal(source.data, sourceFormat, source.seriesLayoutBy, dimensionsDefine, source.startIndex, i);\n          guessRecords.push(guessResult);\n          var isPureNumber = guessResult === BE_ORDINAL.Not;\n          // [Strategy of idxRes0]: find the first BE_ORDINAL.Not as the value dim,\n          // and then find a name dim with the priority:\n          // \"BE_ORDINAL.Might|BE_ORDINAL.Must\" > \"other dim\" > \"the value dim itself\".\n          if (isPureNumber && idxRes0.v == null && i !== potentialNameDimIndex) {\n            idxRes0.v = i;\n          }\n          if (idxRes0.n == null || idxRes0.n === idxRes0.v || !isPureNumber && guessRecords[idxRes0.n] === BE_ORDINAL.Not) {\n            idxRes0.n = i;\n          }\n          if (fulfilled(idxRes0) && guessRecords[idxRes0.n] !== BE_ORDINAL.Not) {\n            return idxRes0;\n          }\n          // [Strategy of idxRes1]: if idxRes0 not satisfied (that is, no BE_ORDINAL.Not),\n          // find the first BE_ORDINAL.Might as the value dim,\n          // and then find a name dim with the priority:\n          // \"other dim\" > \"the value dim itself\".\n          // That is for backward compat: number-like (e.g., `'3'`, `'55'`) can be\n          // treated as number.\n          if (!isPureNumber) {\n            if (guessResult === BE_ORDINAL.Might && idxRes1.v == null && i !== potentialNameDimIndex) {\n              idxRes1.v = i;\n            }\n            if (idxRes1.n == null || idxRes1.n === idxRes1.v) {\n              idxRes1.n = i;\n            }\n          }\n        }\n        function fulfilled(idxResult) {\n          return idxResult.v != null && idxResult.n != null;\n        }\n        return fulfilled(idxRes0) ? idxRes0 : fulfilled(idxRes1) ? idxRes1 : null;\n      }();\n      if (idxResult) {\n        encode.value = [idxResult.v];\n        // `potentialNameDimIndex` has highest priority.\n        var nameDimIndex = potentialNameDimIndex != null ? potentialNameDimIndex : idxResult.n;\n        // By default, label uses itemName in charts.\n        // So we don't set encodeLabel here.\n        encode.itemName = [nameDimIndex];\n        encode.seriesName = [nameDimIndex];\n      }\n      return encode;\n    }\n    /**\r\n     * @return If return null/undefined, indicate that should not use datasetModel.\r\n     */\n    function querySeriesUpstreamDatasetModel(seriesModel) {\n      // Caution: consider the scenario:\n      // A dataset is declared and a series is not expected to use the dataset,\n      // and at the beginning `setOption({series: { noData })` (just prepare other\n      // option but no data), then `setOption({series: {data: [...]}); In this case,\n      // the user should set an empty array to avoid that dataset is used by default.\n      var thisData = seriesModel.get('data', true);\n      if (!thisData) {\n        return queryReferringComponents(seriesModel.ecModel, 'dataset', {\n          index: seriesModel.get('datasetIndex', true),\n          id: seriesModel.get('datasetId', true)\n        }, SINGLE_REFERRING).models[0];\n      }\n    }\n    /**\r\n     * @return Always return an array event empty.\r\n     */\n    function queryDatasetUpstreamDatasetModels(datasetModel) {\n      // Only these attributes declared, we by default reference to `datasetIndex: 0`.\n      // Otherwise, no reference.\n      if (!datasetModel.get('transform', true) && !datasetModel.get('fromTransformResult', true)) {\n        return [];\n      }\n      return queryReferringComponents(datasetModel.ecModel, 'dataset', {\n        index: datasetModel.get('fromDatasetIndex', true),\n        id: datasetModel.get('fromDatasetId', true)\n      }, SINGLE_REFERRING).models;\n    }\n    /**\r\n     * The rule should not be complex, otherwise user might not\r\n     * be able to known where the data is wrong.\r\n     * The code is ugly, but how to make it neat?\r\n     */\n    function guessOrdinal(source, dimIndex) {\n      return doGuessOrdinal(source.data, source.sourceFormat, source.seriesLayoutBy, source.dimensionsDefine, source.startIndex, dimIndex);\n    }\n    // dimIndex may be overflow source data.\n    // return {BE_ORDINAL}\n    function doGuessOrdinal(data, sourceFormat, seriesLayoutBy, dimensionsDefine, startIndex, dimIndex) {\n      var result;\n      // Experience value.\n      var maxLoop = 5;\n      if (isTypedArray(data)) {\n        return BE_ORDINAL.Not;\n      }\n      // When sourceType is 'objectRows' or 'keyedColumns', dimensionsDefine\n      // always exists in source.\n      var dimName;\n      var dimType;\n      if (dimensionsDefine) {\n        var dimDefItem = dimensionsDefine[dimIndex];\n        if (isObject(dimDefItem)) {\n          dimName = dimDefItem.name;\n          dimType = dimDefItem.type;\n        } else if (isString(dimDefItem)) {\n          dimName = dimDefItem;\n        }\n      }\n      if (dimType != null) {\n        return dimType === 'ordinal' ? BE_ORDINAL.Must : BE_ORDINAL.Not;\n      }\n      if (sourceFormat === SOURCE_FORMAT_ARRAY_ROWS) {\n        var dataArrayRows = data;\n        if (seriesLayoutBy === SERIES_LAYOUT_BY_ROW) {\n          var sample = dataArrayRows[dimIndex];\n          for (var i = 0; i < (sample || []).length && i < maxLoop; i++) {\n            if ((result = detectValue(sample[startIndex + i])) != null) {\n              return result;\n            }\n          }\n        } else {\n          for (var i = 0; i < dataArrayRows.length && i < maxLoop; i++) {\n            var row = dataArrayRows[startIndex + i];\n            if (row && (result = detectValue(row[dimIndex])) != null) {\n              return result;\n            }\n          }\n        }\n      } else if (sourceFormat === SOURCE_FORMAT_OBJECT_ROWS) {\n        var dataObjectRows = data;\n        if (!dimName) {\n          return BE_ORDINAL.Not;\n        }\n        for (var i = 0; i < dataObjectRows.length && i < maxLoop; i++) {\n          var item = dataObjectRows[i];\n          if (item && (result = detectValue(item[dimName])) != null) {\n            return result;\n          }\n        }\n      } else if (sourceFormat === SOURCE_FORMAT_KEYED_COLUMNS) {\n        var dataKeyedColumns = data;\n        if (!dimName) {\n          return BE_ORDINAL.Not;\n        }\n        var sample = dataKeyedColumns[dimName];\n        if (!sample || isTypedArray(sample)) {\n          return BE_ORDINAL.Not;\n        }\n        for (var i = 0; i < sample.length && i < maxLoop; i++) {\n          if ((result = detectValue(sample[i])) != null) {\n            return result;\n          }\n        }\n      } else if (sourceFormat === SOURCE_FORMAT_ORIGINAL) {\n        var dataOriginal = data;\n        for (var i = 0; i < dataOriginal.length && i < maxLoop; i++) {\n          var item = dataOriginal[i];\n          var val = getDataItemValue(item);\n          if (!isArray(val)) {\n            return BE_ORDINAL.Not;\n          }\n          if ((result = detectValue(val[dimIndex])) != null) {\n            return result;\n          }\n        }\n      }\n      function detectValue(val) {\n        var beStr = isString(val);\n        // Consider usage convenience, '1', '2' will be treated as \"number\".\n        // `Number('')` (or any whitespace) is `0`.\n        if (val != null && Number.isFinite(Number(val)) && val !== '') {\n          return beStr ? BE_ORDINAL.Might : BE_ORDINAL.Not;\n        } else if (beStr && val !== '-') {\n          return BE_ORDINAL.Must;\n        }\n      }\n      return BE_ORDINAL.Not;\n    }\n\n    var internalOptionCreatorMap = createHashMap();\n    function registerInternalOptionCreator(mainType, creator) {\n      assert(internalOptionCreatorMap.get(mainType) == null && creator);\n      internalOptionCreatorMap.set(mainType, creator);\n    }\n    function concatInternalOptions(ecModel, mainType, newCmptOptionList) {\n      var internalOptionCreator = internalOptionCreatorMap.get(mainType);\n      if (!internalOptionCreator) {\n        return newCmptOptionList;\n      }\n      var internalOptions = internalOptionCreator(ecModel);\n      if (!internalOptions) {\n        return newCmptOptionList;\n      }\n      if (\"development\" !== 'production') {\n        for (var i = 0; i < internalOptions.length; i++) {\n          assert(isComponentIdInternal(internalOptions[i]));\n        }\n      }\n      return newCmptOptionList.concat(internalOptions);\n    }\n\n    var innerColor = makeInner();\n    var innerDecal = makeInner();\n    var PaletteMixin = /** @class */function () {\n      function PaletteMixin() {}\n      PaletteMixin.prototype.getColorFromPalette = function (name, scope, requestNum) {\n        var defaultPalette = normalizeToArray(this.get('color', true));\n        var layeredPalette = this.get('colorLayer', true);\n        return getFromPalette(this, innerColor, defaultPalette, layeredPalette, name, scope, requestNum);\n      };\n      PaletteMixin.prototype.clearColorPalette = function () {\n        clearPalette(this, innerColor);\n      };\n      return PaletteMixin;\n    }();\n    function getDecalFromPalette(ecModel, name, scope, requestNum) {\n      var defaultDecals = normalizeToArray(ecModel.get(['aria', 'decal', 'decals']));\n      return getFromPalette(ecModel, innerDecal, defaultDecals, null, name, scope, requestNum);\n    }\n    function getNearestPalette(palettes, requestColorNum) {\n      var paletteNum = palettes.length;\n      // TODO palettes must be in order\n      for (var i = 0; i < paletteNum; i++) {\n        if (palettes[i].length > requestColorNum) {\n          return palettes[i];\n        }\n      }\n      return palettes[paletteNum - 1];\n    }\n    /**\r\n     * @param name MUST NOT be null/undefined. Otherwise call this function\r\n     *             twise with the same parameters will get different result.\r\n     * @param scope default this.\r\n     * @return Can be null/undefined\r\n     */\n    function getFromPalette(that, inner, defaultPalette, layeredPalette, name, scope, requestNum) {\n      scope = scope || that;\n      var scopeFields = inner(scope);\n      var paletteIdx = scopeFields.paletteIdx || 0;\n      var paletteNameMap = scopeFields.paletteNameMap = scopeFields.paletteNameMap || {};\n      // Use `hasOwnProperty` to avoid conflict with Object.prototype.\n      if (paletteNameMap.hasOwnProperty(name)) {\n        return paletteNameMap[name];\n      }\n      var palette = requestNum == null || !layeredPalette ? defaultPalette : getNearestPalette(layeredPalette, requestNum);\n      // In case can't find in layered color palette.\n      palette = palette || defaultPalette;\n      if (!palette || !palette.length) {\n        return;\n      }\n      var pickedPaletteItem = palette[paletteIdx];\n      if (name) {\n        paletteNameMap[name] = pickedPaletteItem;\n      }\n      scopeFields.paletteIdx = (paletteIdx + 1) % palette.length;\n      return pickedPaletteItem;\n    }\n    function clearPalette(that, inner) {\n      inner(that).paletteIdx = 0;\n      inner(that).paletteNameMap = {};\n    }\n\n    // -----------------------\n    // Internal method names:\n    // -----------------------\n    var reCreateSeriesIndices;\n    var assertSeriesInitialized;\n    var initBase;\n    var OPTION_INNER_KEY = '\\0_ec_inner';\n    var OPTION_INNER_VALUE = 1;\n    var BUITIN_COMPONENTS_MAP = {\n      grid: 'GridComponent',\n      polar: 'PolarComponent',\n      geo: 'GeoComponent',\n      singleAxis: 'SingleAxisComponent',\n      parallel: 'ParallelComponent',\n      calendar: 'CalendarComponent',\n      graphic: 'GraphicComponent',\n      toolbox: 'ToolboxComponent',\n      tooltip: 'TooltipComponent',\n      axisPointer: 'AxisPointerComponent',\n      brush: 'BrushComponent',\n      title: 'TitleComponent',\n      timeline: 'TimelineComponent',\n      markPoint: 'MarkPointComponent',\n      markLine: 'MarkLineComponent',\n      markArea: 'MarkAreaComponent',\n      legend: 'LegendComponent',\n      dataZoom: 'DataZoomComponent',\n      visualMap: 'VisualMapComponent',\n      // aria: 'AriaComponent',\n      // dataset: 'DatasetComponent',\n      // Dependencies\n      xAxis: 'GridComponent',\n      yAxis: 'GridComponent',\n      angleAxis: 'PolarComponent',\n      radiusAxis: 'PolarComponent'\n    };\n    var BUILTIN_CHARTS_MAP = {\n      line: 'LineChart',\n      bar: 'BarChart',\n      pie: 'PieChart',\n      scatter: 'ScatterChart',\n      radar: 'RadarChart',\n      map: 'MapChart',\n      tree: 'TreeChart',\n      treemap: 'TreemapChart',\n      graph: 'GraphChart',\n      gauge: 'GaugeChart',\n      funnel: 'FunnelChart',\n      parallel: 'ParallelChart',\n      sankey: 'SankeyChart',\n      boxplot: 'BoxplotChart',\n      candlestick: 'CandlestickChart',\n      effectScatter: 'EffectScatterChart',\n      lines: 'LinesChart',\n      heatmap: 'HeatmapChart',\n      pictorialBar: 'PictorialBarChart',\n      themeRiver: 'ThemeRiverChart',\n      sunburst: 'SunburstChart',\n      custom: 'CustomChart'\n    };\n    var componetsMissingLogPrinted = {};\n    function checkMissingComponents(option) {\n      each(option, function (componentOption, mainType) {\n        if (!ComponentModel.hasClass(mainType)) {\n          var componentImportName = BUITIN_COMPONENTS_MAP[mainType];\n          if (componentImportName && !componetsMissingLogPrinted[componentImportName]) {\n            error(\"Component \" + mainType + \" is used but not imported.\\nimport { \" + componentImportName + \" } from 'echarts/components';\\necharts.use([\" + componentImportName + \"]);\");\n            componetsMissingLogPrinted[componentImportName] = true;\n          }\n        }\n      });\n    }\n    var GlobalModel = /** @class */function (_super) {\n      __extends(GlobalModel, _super);\n      function GlobalModel() {\n        return _super !== null && _super.apply(this, arguments) || this;\n      }\n      GlobalModel.prototype.init = function (option, parentModel, ecModel, theme, locale, optionManager) {\n        theme = theme || {};\n        this.option = null; // Mark as not initialized.\n        this._theme = new Model(theme);\n        this._locale = new Model(locale);\n        this._optionManager = optionManager;\n      };\n      GlobalModel.prototype.setOption = function (option, opts, optionPreprocessorFuncs) {\n        if (\"development\" !== 'production') {\n          assert(option != null, 'option is null/undefined');\n          assert(option[OPTION_INNER_KEY] !== OPTION_INNER_VALUE, 'please use chart.getOption()');\n        }\n        var innerOpt = normalizeSetOptionInput(opts);\n        this._optionManager.setOption(option, optionPreprocessorFuncs, innerOpt);\n        this._resetOption(null, innerOpt);\n      };\n      /**\r\n       * @param type null/undefined: reset all.\r\n       *        'recreate': force recreate all.\r\n       *        'timeline': only reset timeline option\r\n       *        'media': only reset media query option\r\n       * @return Whether option changed.\r\n       */\n      GlobalModel.prototype.resetOption = function (type, opt) {\n        return this._resetOption(type, normalizeSetOptionInput(opt));\n      };\n      GlobalModel.prototype._resetOption = function (type, opt) {\n        var optionChanged = false;\n        var optionManager = this._optionManager;\n        if (!type || type === 'recreate') {\n          var baseOption = optionManager.mountOption(type === 'recreate');\n          if (\"development\" !== 'production') {\n            checkMissingComponents(baseOption);\n          }\n          if (!this.option || type === 'recreate') {\n            initBase(this, baseOption);\n          } else {\n            this.restoreData();\n            this._mergeOption(baseOption, opt);\n          }\n          optionChanged = true;\n        }\n        if (type === 'timeline' || type === 'media') {\n          this.restoreData();\n        }\n        // By design, if `setOption(option2)` at the second time, and `option2` is a `ECUnitOption`,\n        // it should better not have the same props with `MediaUnit['option']`.\n        // Because either `option2` or `MediaUnit['option']` will be always merged to \"current option\"\n        // rather than original \"baseOption\". If they both override a prop, the result might be\n        // unexpected when media state changed after `setOption` called.\n        // If we really need to modify a props in each `MediaUnit['option']`, use the full version\n        // (`{baseOption, media}`) in `setOption`.\n        // For `timeline`, the case is the same.\n        if (!type || type === 'recreate' || type === 'timeline') {\n          var timelineOption = optionManager.getTimelineOption(this);\n          if (timelineOption) {\n            optionChanged = true;\n            this._mergeOption(timelineOption, opt);\n          }\n        }\n        if (!type || type === 'recreate' || type === 'media') {\n          var mediaOptions = optionManager.getMediaOption(this);\n          if (mediaOptions.length) {\n            each(mediaOptions, function (mediaOption) {\n              optionChanged = true;\n              this._mergeOption(mediaOption, opt);\n            }, this);\n          }\n        }\n        return optionChanged;\n      };\n      GlobalModel.prototype.mergeOption = function (option) {\n        this._mergeOption(option, null);\n      };\n      GlobalModel.prototype._mergeOption = function (newOption, opt) {\n        var option = this.option;\n        var componentsMap = this._componentsMap;\n        var componentsCount = this._componentsCount;\n        var newCmptTypes = [];\n        var newCmptTypeMap = createHashMap();\n        var replaceMergeMainTypeMap = opt && opt.replaceMergeMainTypeMap;\n        resetSourceDefaulter(this);\n        // If no component class, merge directly.\n        // For example: color, animaiton options, etc.\n        each(newOption, function (componentOption, mainType) {\n          if (componentOption == null) {\n            return;\n          }\n          if (!ComponentModel.hasClass(mainType)) {\n            // globalSettingTask.dirty();\n            option[mainType] = option[mainType] == null ? clone(componentOption) : merge(option[mainType], componentOption, true);\n          } else if (mainType) {\n            newCmptTypes.push(mainType);\n            newCmptTypeMap.set(mainType, true);\n          }\n        });\n        if (replaceMergeMainTypeMap) {\n          // If there is a mainType `xxx` in `replaceMerge` but not declared in option,\n          // we trade it as it is declared in option as `{xxx: []}`. Because:\n          // (1) for normal merge, `{xxx: null/undefined}` are the same meaning as `{xxx: []}`.\n          // (2) some preprocessor may convert some of `{xxx: null/undefined}` to `{xxx: []}`.\n          replaceMergeMainTypeMap.each(function (val, mainTypeInReplaceMerge) {\n            if (ComponentModel.hasClass(mainTypeInReplaceMerge) && !newCmptTypeMap.get(mainTypeInReplaceMerge)) {\n              newCmptTypes.push(mainTypeInReplaceMerge);\n              newCmptTypeMap.set(mainTypeInReplaceMerge, true);\n            }\n          });\n        }\n        ComponentModel.topologicalTravel(newCmptTypes, ComponentModel.getAllClassMainTypes(), visitComponent, this);\n        function visitComponent(mainType) {\n          var newCmptOptionList = concatInternalOptions(this, mainType, normalizeToArray(newOption[mainType]));\n          var oldCmptList = componentsMap.get(mainType);\n          var mergeMode =\n          // `!oldCmptList` means init. See the comment in `mappingToExists`\n          !oldCmptList ? 'replaceAll' : replaceMergeMainTypeMap && replaceMergeMainTypeMap.get(mainType) ? 'replaceMerge' : 'normalMerge';\n          var mappingResult = mappingToExists(oldCmptList, newCmptOptionList, mergeMode);\n          // Set mainType and complete subType.\n          setComponentTypeToKeyInfo(mappingResult, mainType, ComponentModel);\n          // Empty it before the travel, in order to prevent `this._componentsMap`\n          // from being used in the `init`/`mergeOption`/`optionUpdated` of some\n          // components, which is probably incorrect logic.\n          option[mainType] = null;\n          componentsMap.set(mainType, null);\n          componentsCount.set(mainType, 0);\n          var optionsByMainType = [];\n          var cmptsByMainType = [];\n          var cmptsCountByMainType = 0;\n          var tooltipExists;\n          var tooltipWarningLogged;\n          each(mappingResult, function (resultItem, index) {\n            var componentModel = resultItem.existing;\n            var newCmptOption = resultItem.newOption;\n            if (!newCmptOption) {\n              if (componentModel) {\n                // Consider where is no new option and should be merged using {},\n                // see removeEdgeAndAdd in topologicalTravel and\n                // ComponentModel.getAllClassMainTypes.\n                componentModel.mergeOption({}, this);\n                componentModel.optionUpdated({}, false);\n              }\n              // If no both `resultItem.exist` and `resultItem.option`,\n              // either it is in `replaceMerge` and not matched by any id,\n              // or it has been removed in previous `replaceMerge` and left a \"hole\" in this component index.\n            } else {\n              var isSeriesType = mainType === 'series';\n              var ComponentModelClass = ComponentModel.getClass(mainType, resultItem.keyInfo.subType, !isSeriesType // Give a more detailed warn later if series don't exists\n              );\n              if (!ComponentModelClass) {\n                if (\"development\" !== 'production') {\n                  var subType = resultItem.keyInfo.subType;\n                  var seriesImportName = BUILTIN_CHARTS_MAP[subType];\n                  if (!componetsMissingLogPrinted[subType]) {\n                    componetsMissingLogPrinted[subType] = true;\n                    if (seriesImportName) {\n                      error(\"Series \" + subType + \" is used but not imported.\\nimport { \" + seriesImportName + \" } from 'echarts/charts';\\necharts.use([\" + seriesImportName + \"]);\");\n                    } else {\n                      error(\"Unknown series \" + subType);\n                    }\n                  }\n                }\n                return;\n              }\n              // TODO Before multiple tooltips get supported, we do this check to avoid unexpected exception.\n              if (mainType === 'tooltip') {\n                if (tooltipExists) {\n                  if (\"development\" !== 'production') {\n                    if (!tooltipWarningLogged) {\n                      warn('Currently only one tooltip component is allowed.');\n                      tooltipWarningLogged = true;\n                    }\n                  }\n                  return;\n                }\n                tooltipExists = true;\n              }\n              if (componentModel && componentModel.constructor === ComponentModelClass) {\n                componentModel.name = resultItem.keyInfo.name;\n                // componentModel.settingTask && componentModel.settingTask.dirty();\n                componentModel.mergeOption(newCmptOption, this);\n                componentModel.optionUpdated(newCmptOption, false);\n              } else {\n                // PENDING Global as parent ?\n                var extraOpt = extend({\n                  componentIndex: index\n                }, resultItem.keyInfo);\n                componentModel = new ComponentModelClass(newCmptOption, this, this, extraOpt);\n                // Assign `keyInfo`\n                extend(componentModel, extraOpt);\n                if (resultItem.brandNew) {\n                  componentModel.__requireNewView = true;\n                }\n                componentModel.init(newCmptOption, this, this);\n                // Call optionUpdated after init.\n                // newCmptOption has been used as componentModel.option\n                // and may be merged with theme and default, so pass null\n                // to avoid confusion.\n                componentModel.optionUpdated(null, true);\n              }\n            }\n            if (componentModel) {\n              optionsByMainType.push(componentModel.option);\n              cmptsByMainType.push(componentModel);\n              cmptsCountByMainType++;\n            } else {\n              // Always do assign to avoid elided item in array.\n              optionsByMainType.push(void 0);\n              cmptsByMainType.push(void 0);\n            }\n          }, this);\n          option[mainType] = optionsByMainType;\n          componentsMap.set(mainType, cmptsByMainType);\n          componentsCount.set(mainType, cmptsCountByMainType);\n          // Backup series for filtering.\n          if (mainType === 'series') {\n            reCreateSeriesIndices(this);\n          }\n        }\n        // If no series declared, ensure `_seriesIndices` initialized.\n        if (!this._seriesIndices) {\n          reCreateSeriesIndices(this);\n        }\n      };\n      /**\r\n       * Get option for output (cloned option and inner info removed)\r\n       */\n      GlobalModel.prototype.getOption = function () {\n        var option = clone(this.option);\n        each(option, function (optInMainType, mainType) {\n          if (ComponentModel.hasClass(mainType)) {\n            var opts = normalizeToArray(optInMainType);\n            // Inner cmpts need to be removed.\n            // Inner cmpts might not be at last since ec5.0, but still\n            // compatible for users: if inner cmpt at last, splice the returned array.\n            var realLen = opts.length;\n            var metNonInner = false;\n            for (var i = realLen - 1; i >= 0; i--) {\n              // Remove options with inner id.\n              if (opts[i] && !isComponentIdInternal(opts[i])) {\n                metNonInner = true;\n              } else {\n                opts[i] = null;\n                !metNonInner && realLen--;\n              }\n            }\n            opts.length = realLen;\n            option[mainType] = opts;\n          }\n        });\n        delete option[OPTION_INNER_KEY];\n        return option;\n      };\n      GlobalModel.prototype.getTheme = function () {\n        return this._theme;\n      };\n      GlobalModel.prototype.getLocaleModel = function () {\n        return this._locale;\n      };\n      GlobalModel.prototype.setUpdatePayload = function (payload) {\n        this._payload = payload;\n      };\n      GlobalModel.prototype.getUpdatePayload = function () {\n        return this._payload;\n      };\n      /**\r\n       * @param idx If not specified, return the first one.\r\n       */\n      GlobalModel.prototype.getComponent = function (mainType, idx) {\n        var list = this._componentsMap.get(mainType);\n        if (list) {\n          var cmpt = list[idx || 0];\n          if (cmpt) {\n            return cmpt;\n          } else if (idx == null) {\n            for (var i = 0; i < list.length; i++) {\n              if (list[i]) {\n                return list[i];\n              }\n            }\n          }\n        }\n      };\n      /**\r\n       * @return Never be null/undefined.\r\n       */\n      GlobalModel.prototype.queryComponents = function (condition) {\n        var mainType = condition.mainType;\n        if (!mainType) {\n          return [];\n        }\n        var index = condition.index;\n        var id = condition.id;\n        var name = condition.name;\n        var cmpts = this._componentsMap.get(mainType);\n        if (!cmpts || !cmpts.length) {\n          return [];\n        }\n        var result;\n        if (index != null) {\n          result = [];\n          each(normalizeToArray(index), function (idx) {\n            cmpts[idx] && result.push(cmpts[idx]);\n          });\n        } else if (id != null) {\n          result = queryByIdOrName('id', id, cmpts);\n        } else if (name != null) {\n          result = queryByIdOrName('name', name, cmpts);\n        } else {\n          // Return all non-empty components in that mainType\n          result = filter(cmpts, function (cmpt) {\n            return !!cmpt;\n          });\n        }\n        return filterBySubType(result, condition);\n      };\n      /**\r\n       * The interface is different from queryComponents,\r\n       * which is convenient for inner usage.\r\n       *\r\n       * @usage\r\n       * let result = findComponents(\r\n       *     {mainType: 'dataZoom', query: {dataZoomId: 'abc'}}\r\n       * );\r\n       * let result = findComponents(\r\n       *     {mainType: 'series', subType: 'pie', query: {seriesName: 'uio'}}\r\n       * );\r\n       * let result = findComponents(\r\n       *     {mainType: 'series',\r\n       *     filter: function (model, index) {...}}\r\n       * );\r\n       * // result like [component0, componnet1, ...]\r\n       */\n      GlobalModel.prototype.findComponents = function (condition) {\n        var query = condition.query;\n        var mainType = condition.mainType;\n        var queryCond = getQueryCond(query);\n        var result = queryCond ? this.queryComponents(queryCond)\n        // Retrieve all non-empty components.\n        : filter(this._componentsMap.get(mainType), function (cmpt) {\n          return !!cmpt;\n        });\n        return doFilter(filterBySubType(result, condition));\n        function getQueryCond(q) {\n          var indexAttr = mainType + 'Index';\n          var idAttr = mainType + 'Id';\n          var nameAttr = mainType + 'Name';\n          return q && (q[indexAttr] != null || q[idAttr] != null || q[nameAttr] != null) ? {\n            mainType: mainType,\n            // subType will be filtered finally.\n            index: q[indexAttr],\n            id: q[idAttr],\n            name: q[nameAttr]\n          } : null;\n        }\n        function doFilter(res) {\n          return condition.filter ? filter(res, condition.filter) : res;\n        }\n      };\n      GlobalModel.prototype.eachComponent = function (mainType, cb, context) {\n        var componentsMap = this._componentsMap;\n        if (isFunction(mainType)) {\n          var ctxForAll_1 = cb;\n          var cbForAll_1 = mainType;\n          componentsMap.each(function (cmpts, componentType) {\n            for (var i = 0; cmpts && i < cmpts.length; i++) {\n              var cmpt = cmpts[i];\n              cmpt && cbForAll_1.call(ctxForAll_1, componentType, cmpt, cmpt.componentIndex);\n            }\n          });\n        } else {\n          var cmpts = isString(mainType) ? componentsMap.get(mainType) : isObject(mainType) ? this.findComponents(mainType) : null;\n          for (var i = 0; cmpts && i < cmpts.length; i++) {\n            var cmpt = cmpts[i];\n            cmpt && cb.call(context, cmpt, cmpt.componentIndex);\n          }\n        }\n      };\n      /**\r\n       * Get series list before filtered by name.\r\n       */\n      GlobalModel.prototype.getSeriesByName = function (name) {\n        var nameStr = convertOptionIdName(name, null);\n        return filter(this._componentsMap.get('series'), function (oneSeries) {\n          return !!oneSeries && nameStr != null && oneSeries.name === nameStr;\n        });\n      };\n      /**\r\n       * Get series list before filtered by index.\r\n       */\n      GlobalModel.prototype.getSeriesByIndex = function (seriesIndex) {\n        return this._componentsMap.get('series')[seriesIndex];\n      };\n      /**\r\n       * Get series list before filtered by type.\r\n       * FIXME: rename to getRawSeriesByType?\r\n       */\n      GlobalModel.prototype.getSeriesByType = function (subType) {\n        return filter(this._componentsMap.get('series'), function (oneSeries) {\n          return !!oneSeries && oneSeries.subType === subType;\n        });\n      };\n      /**\r\n       * Get all series before filtered.\r\n       */\n      GlobalModel.prototype.getSeries = function () {\n        return filter(this._componentsMap.get('series'), function (oneSeries) {\n          return !!oneSeries;\n        });\n      };\n      /**\r\n       * Count series before filtered.\r\n       */\n      GlobalModel.prototype.getSeriesCount = function () {\n        return this._componentsCount.get('series');\n      };\n      /**\r\n       * After filtering, series may be different\r\n       * from raw series.\r\n       */\n      GlobalModel.prototype.eachSeries = function (cb, context) {\n        assertSeriesInitialized(this);\n        each(this._seriesIndices, function (rawSeriesIndex) {\n          var series = this._componentsMap.get('series')[rawSeriesIndex];\n          cb.call(context, series, rawSeriesIndex);\n        }, this);\n      };\n      /**\r\n       * Iterate raw series before filtered.\r\n       *\r\n       * @param {Function} cb\r\n       * @param {*} context\r\n       */\n      GlobalModel.prototype.eachRawSeries = function (cb, context) {\n        each(this._componentsMap.get('series'), function (series) {\n          series && cb.call(context, series, series.componentIndex);\n        });\n      };\n      /**\r\n       * After filtering, series may be different.\r\n       * from raw series.\r\n       */\n      GlobalModel.prototype.eachSeriesByType = function (subType, cb, context) {\n        assertSeriesInitialized(this);\n        each(this._seriesIndices, function (rawSeriesIndex) {\n          var series = this._componentsMap.get('series')[rawSeriesIndex];\n          if (series.subType === subType) {\n            cb.call(context, series, rawSeriesIndex);\n          }\n        }, this);\n      };\n      /**\r\n       * Iterate raw series before filtered of given type.\r\n       */\n      GlobalModel.prototype.eachRawSeriesByType = function (subType, cb, context) {\n        return each(this.getSeriesByType(subType), cb, context);\n      };\n      GlobalModel.prototype.isSeriesFiltered = function (seriesModel) {\n        assertSeriesInitialized(this);\n        return this._seriesIndicesMap.get(seriesModel.componentIndex) == null;\n      };\n      GlobalModel.prototype.getCurrentSeriesIndices = function () {\n        return (this._seriesIndices || []).slice();\n      };\n      GlobalModel.prototype.filterSeries = function (cb, context) {\n        assertSeriesInitialized(this);\n        var newSeriesIndices = [];\n        each(this._seriesIndices, function (seriesRawIdx) {\n          var series = this._componentsMap.get('series')[seriesRawIdx];\n          cb.call(context, series, seriesRawIdx) && newSeriesIndices.push(seriesRawIdx);\n        }, this);\n        this._seriesIndices = newSeriesIndices;\n        this._seriesIndicesMap = createHashMap(newSeriesIndices);\n      };\n      GlobalModel.prototype.restoreData = function (payload) {\n        reCreateSeriesIndices(this);\n        var componentsMap = this._componentsMap;\n        var componentTypes = [];\n        componentsMap.each(function (components, componentType) {\n          if (ComponentModel.hasClass(componentType)) {\n            componentTypes.push(componentType);\n          }\n        });\n        ComponentModel.topologicalTravel(componentTypes, ComponentModel.getAllClassMainTypes(), function (componentType) {\n          each(componentsMap.get(componentType), function (component) {\n            if (component && (componentType !== 'series' || !isNotTargetSeries(component, payload))) {\n              component.restoreData();\n            }\n          });\n        });\n      };\n      GlobalModel.internalField = function () {\n        reCreateSeriesIndices = function (ecModel) {\n          var seriesIndices = ecModel._seriesIndices = [];\n          each(ecModel._componentsMap.get('series'), function (series) {\n            // series may have been removed by `replaceMerge`.\n            series && seriesIndices.push(series.componentIndex);\n          });\n          ecModel._seriesIndicesMap = createHashMap(seriesIndices);\n        };\n        assertSeriesInitialized = function (ecModel) {\n          // Components that use _seriesIndices should depends on series component,\n          // which make sure that their initialization is after series.\n          if (\"development\" !== 'production') {\n            if (!ecModel._seriesIndices) {\n              throw new Error('Option should contains series.');\n            }\n          }\n        };\n        initBase = function (ecModel, baseOption) {\n          // Using OPTION_INNER_KEY to mark that this option cannot be used outside,\n          // i.e. `chart.setOption(chart.getModel().option);` is forbidden.\n          ecModel.option = {};\n          ecModel.option[OPTION_INNER_KEY] = OPTION_INNER_VALUE;\n          // Init with series: [], in case of calling findSeries method\n          // before series initialized.\n          ecModel._componentsMap = createHashMap({\n            series: []\n          });\n          ecModel._componentsCount = createHashMap();\n          // If user spefied `option.aria`, aria will be enable. This detection should be\n          // performed before theme and globalDefault merge.\n          var airaOption = baseOption.aria;\n          if (isObject(airaOption) && airaOption.enabled == null) {\n            airaOption.enabled = true;\n          }\n          mergeTheme(baseOption, ecModel._theme.option);\n          // TODO Needs clone when merging to the unexisted property\n          merge(baseOption, globalDefault, false);\n          ecModel._mergeOption(baseOption, null);\n        };\n      }();\n      return GlobalModel;\n    }(Model);\n    function isNotTargetSeries(seriesModel, payload) {\n      if (payload) {\n        var index = payload.seriesIndex;\n        var id = payload.seriesId;\n        var name_1 = payload.seriesName;\n        return index != null && seriesModel.componentIndex !== index || id != null && seriesModel.id !== id || name_1 != null && seriesModel.name !== name_1;\n      }\n    }\n    function mergeTheme(option, theme) {\n      // PENDING\n      // NOT use `colorLayer` in theme if option has `color`\n      var notMergeColorLayer = option.color && !option.colorLayer;\n      each(theme, function (themeItem, name) {\n        if (name === 'colorLayer' && notMergeColorLayer) {\n          return;\n        }\n        // If it is component model mainType, the model handles that merge later.\n        // otherwise, merge them here.\n        if (!ComponentModel.hasClass(name)) {\n          if (typeof themeItem === 'object') {\n            option[name] = !option[name] ? clone(themeItem) : merge(option[name], themeItem, false);\n          } else {\n            if (option[name] == null) {\n              option[name] = themeItem;\n            }\n          }\n        }\n      });\n    }\n    function queryByIdOrName(attr, idOrName, cmpts) {\n      // Here is a break from echarts4: string and number are\n      // treated as equal.\n      if (isArray(idOrName)) {\n        var keyMap_1 = createHashMap();\n        each(idOrName, function (idOrNameItem) {\n          if (idOrNameItem != null) {\n            var idName = convertOptionIdName(idOrNameItem, null);\n            idName != null && keyMap_1.set(idOrNameItem, true);\n          }\n        });\n        return filter(cmpts, function (cmpt) {\n          return cmpt && keyMap_1.get(cmpt[attr]);\n        });\n      } else {\n        var idName_1 = convertOptionIdName(idOrName, null);\n        return filter(cmpts, function (cmpt) {\n          return cmpt && idName_1 != null && cmpt[attr] === idName_1;\n        });\n      }\n    }\n    function filterBySubType(components, condition) {\n      // Using hasOwnProperty for restrict. Consider\n      // subType is undefined in user payload.\n      return condition.hasOwnProperty('subType') ? filter(components, function (cmpt) {\n        return cmpt && cmpt.subType === condition.subType;\n      }) : components;\n    }\n    function normalizeSetOptionInput(opts) {\n      var replaceMergeMainTypeMap = createHashMap();\n      opts && each(normalizeToArray(opts.replaceMerge), function (mainType) {\n        if (\"development\" !== 'production') {\n          assert(ComponentModel.hasClass(mainType), '\"' + mainType + '\" is not valid component main type in \"replaceMerge\"');\n        }\n        replaceMergeMainTypeMap.set(mainType, true);\n      });\n      return {\n        replaceMergeMainTypeMap: replaceMergeMainTypeMap\n      };\n    }\n    mixin(GlobalModel, PaletteMixin);\n\n    var availableMethods = ['getDom', 'getZr', 'getWidth', 'getHeight', 'getDevicePixelRatio', 'dispatchAction', 'isSSR', 'isDisposed', 'on', 'off', 'getDataURL', 'getConnectedDataURL',\n    // 'getModel',\n    'getOption',\n    // 'getViewOfComponentModel',\n    // 'getViewOfSeriesModel',\n    'getId', 'updateLabelLayout'];\n    var ExtensionAPI = /** @class */function () {\n      function ExtensionAPI(ecInstance) {\n        each(availableMethods, function (methodName) {\n          this[methodName] = bind(ecInstance[methodName], ecInstance);\n        }, this);\n      }\n      return ExtensionAPI;\n    }();\n\n    var coordinateSystemCreators = {};\n    var CoordinateSystemManager = /** @class */function () {\n      function CoordinateSystemManager() {\n        this._coordinateSystems = [];\n      }\n      CoordinateSystemManager.prototype.create = function (ecModel, api) {\n        var coordinateSystems = [];\n        each(coordinateSystemCreators, function (creator, type) {\n          var list = creator.create(ecModel, api);\n          coordinateSystems = coordinateSystems.concat(list || []);\n        });\n        this._coordinateSystems = coordinateSystems;\n      };\n      CoordinateSystemManager.prototype.update = function (ecModel, api) {\n        each(this._coordinateSystems, function (coordSys) {\n          coordSys.update && coordSys.update(ecModel, api);\n        });\n      };\n      CoordinateSystemManager.prototype.getCoordinateSystems = function () {\n        return this._coordinateSystems.slice();\n      };\n      CoordinateSystemManager.register = function (type, creator) {\n        coordinateSystemCreators[type] = creator;\n      };\n      CoordinateSystemManager.get = function (type) {\n        return coordinateSystemCreators[type];\n      };\n      return CoordinateSystemManager;\n    }();\n\n    var QUERY_REG = /^(min|max)?(.+)$/;\n    // Key: mainType\n    // type FakeComponentsMap = HashMap<(MappingExistingItem & { subType: string })[]>;\n    /**\r\n     * TERM EXPLANATIONS:\r\n     * See `ECOption` and `ECUnitOption` in `src/util/types.ts`.\r\n     */\n    var OptionManager = /** @class */function () {\n      // timeline.notMerge is not supported in ec3. Firstly there is rearly\n      // case that notMerge is needed. Secondly supporting 'notMerge' requires\n      // rawOption cloned and backuped when timeline changed, which does no\n      // good to performance. What's more, that both timeline and setOption\n      // method supply 'notMerge' brings complex and some problems.\n      // Consider this case:\n      // (step1) chart.setOption({timeline: {notMerge: false}, ...}, false);\n      // (step2) chart.setOption({timeline: {notMerge: true}, ...}, false);\n      function OptionManager(api) {\n        this._timelineOptions = [];\n        this._mediaList = [];\n        /**\r\n         * -1, means default.\r\n         * empty means no media.\r\n         */\n        this._currentMediaIndices = [];\n        this._api = api;\n      }\n      OptionManager.prototype.setOption = function (rawOption, optionPreprocessorFuncs, opt) {\n        if (rawOption) {\n          // That set dat primitive is dangerous if user reuse the data when setOption again.\n          each(normalizeToArray(rawOption.series), function (series) {\n            series && series.data && isTypedArray(series.data) && setAsPrimitive(series.data);\n          });\n          each(normalizeToArray(rawOption.dataset), function (dataset) {\n            dataset && dataset.source && isTypedArray(dataset.source) && setAsPrimitive(dataset.source);\n          });\n        }\n        // Caution: some series modify option data, if do not clone,\n        // it should ensure that the repeat modify correctly\n        // (create a new object when modify itself).\n        rawOption = clone(rawOption);\n        // FIXME\n        // If some property is set in timeline options or media option but\n        // not set in baseOption, a warning should be given.\n        var optionBackup = this._optionBackup;\n        var newParsedOption = parseRawOption(rawOption, optionPreprocessorFuncs, !optionBackup);\n        this._newBaseOption = newParsedOption.baseOption;\n        // For setOption at second time (using merge mode);\n        if (optionBackup) {\n          // FIXME\n          // the restore merge solution is essentially incorrect.\n          // the mapping can not be 100% consistent with ecModel, which probably brings\n          // potential bug!\n          // The first merge is delayed, because in most cases, users do not call `setOption` twice.\n          // let fakeCmptsMap = this._fakeCmptsMap;\n          // if (!fakeCmptsMap) {\n          //     fakeCmptsMap = this._fakeCmptsMap = createHashMap();\n          //     mergeToBackupOption(fakeCmptsMap, null, optionBackup.baseOption, null);\n          // }\n          // mergeToBackupOption(\n          //     fakeCmptsMap, optionBackup.baseOption, newParsedOption.baseOption, opt\n          // );\n          // For simplicity, timeline options and media options do not support merge,\n          // that is, if you `setOption` twice and both has timeline options, the latter\n          // timeline options will not be merged to the former, but just substitute them.\n          if (newParsedOption.timelineOptions.length) {\n            optionBackup.timelineOptions = newParsedOption.timelineOptions;\n          }\n          if (newParsedOption.mediaList.length) {\n            optionBackup.mediaList = newParsedOption.mediaList;\n          }\n          if (newParsedOption.mediaDefault) {\n            optionBackup.mediaDefault = newParsedOption.mediaDefault;\n          }\n        } else {\n          this._optionBackup = newParsedOption;\n        }\n      };\n      OptionManager.prototype.mountOption = function (isRecreate) {\n        var optionBackup = this._optionBackup;\n        this._timelineOptions = optionBackup.timelineOptions;\n        this._mediaList = optionBackup.mediaList;\n        this._mediaDefault = optionBackup.mediaDefault;\n        this._currentMediaIndices = [];\n        return clone(isRecreate\n        // this._optionBackup.baseOption, which is created at the first `setOption`\n        // called, and is merged into every new option by inner method `mergeToBackupOption`\n        // each time `setOption` called, can be only used in `isRecreate`, because\n        // its reliability is under suspicion. In other cases option merge is\n        // performed by `model.mergeOption`.\n        ? optionBackup.baseOption : this._newBaseOption);\n      };\n      OptionManager.prototype.getTimelineOption = function (ecModel) {\n        var option;\n        var timelineOptions = this._timelineOptions;\n        if (timelineOptions.length) {\n          // getTimelineOption can only be called after ecModel inited,\n          // so we can get currentIndex from timelineModel.\n          var timelineModel = ecModel.getComponent('timeline');\n          if (timelineModel) {\n            option = clone(\n            // FIXME:TS as TimelineModel or quivlant interface\n            timelineOptions[timelineModel.getCurrentIndex()]);\n          }\n        }\n        return option;\n      };\n      OptionManager.prototype.getMediaOption = function (ecModel) {\n        var ecWidth = this._api.getWidth();\n        var ecHeight = this._api.getHeight();\n        var mediaList = this._mediaList;\n        var mediaDefault = this._mediaDefault;\n        var indices = [];\n        var result = [];\n        // No media defined.\n        if (!mediaList.length && !mediaDefault) {\n          return result;\n        }\n        // Multi media may be applied, the latter defined media has higher priority.\n        for (var i = 0, len = mediaList.length; i < len; i++) {\n          if (applyMediaQuery(mediaList[i].query, ecWidth, ecHeight)) {\n            indices.push(i);\n          }\n        }\n        // FIXME\n        // Whether mediaDefault should force users to provide? Otherwise\n        // the change by media query can not be recorvered.\n        if (!indices.length && mediaDefault) {\n          indices = [-1];\n        }\n        if (indices.length && !indicesEquals(indices, this._currentMediaIndices)) {\n          result = map(indices, function (index) {\n            return clone(index === -1 ? mediaDefault.option : mediaList[index].option);\n          });\n        }\n        // Otherwise return nothing.\n        this._currentMediaIndices = indices;\n        return result;\n      };\n      return OptionManager;\n    }();\n    /**\r\n     * [RAW_OPTION_PATTERNS]\r\n     * (Note: \"series: []\" represents all other props in `ECUnitOption`)\r\n     *\r\n     * (1) No prop \"baseOption\" declared:\r\n     * Root option is used as \"baseOption\" (except prop \"options\" and \"media\").\r\n     * ```js\r\n     * option = {\r\n     *     series: [],\r\n     *     timeline: {},\r\n     *     options: [],\r\n     * };\r\n     * option = {\r\n     *     series: [],\r\n     *     media: {},\r\n     * };\r\n     * option = {\r\n     *     series: [],\r\n     *     timeline: {},\r\n     *     options: [],\r\n     *     media: {},\r\n     * }\r\n     * ```\r\n     *\r\n     * (2) Prop \"baseOption\" declared:\r\n     * If \"baseOption\" declared, `ECUnitOption` props can only be declared\r\n     * inside \"baseOption\" except prop \"timeline\" (compat ec2).\r\n     * ```js\r\n     * option = {\r\n     *     baseOption: {\r\n     *         timeline: {},\r\n     *         series: [],\r\n     *     },\r\n     *     options: []\r\n     * };\r\n     * option = {\r\n     *     baseOption: {\r\n     *         series: [],\r\n     *     },\r\n     *     media: []\r\n     * };\r\n     * option = {\r\n     *     baseOption: {\r\n     *         timeline: {},\r\n     *         series: [],\r\n     *     },\r\n     *     options: []\r\n     *     media: []\r\n     * };\r\n     * option = {\r\n     *     // ec3 compat ec2: allow (only) `timeline` declared\r\n     *     // outside baseOption. Keep this setting for compat.\r\n     *     timeline: {},\r\n     *     baseOption: {\r\n     *         series: [],\r\n     *     },\r\n     *     options: [],\r\n     *     media: []\r\n     * };\r\n     * ```\r\n     */\n    function parseRawOption(\n    // `rawOption` May be modified\n    rawOption, optionPreprocessorFuncs, isNew) {\n      var mediaList = [];\n      var mediaDefault;\n      var baseOption;\n      var declaredBaseOption = rawOption.baseOption;\n      // Compatible with ec2, [RAW_OPTION_PATTERNS] above.\n      var timelineOnRoot = rawOption.timeline;\n      var timelineOptionsOnRoot = rawOption.options;\n      var mediaOnRoot = rawOption.media;\n      var hasMedia = !!rawOption.media;\n      var hasTimeline = !!(timelineOptionsOnRoot || timelineOnRoot || declaredBaseOption && declaredBaseOption.timeline);\n      if (declaredBaseOption) {\n        baseOption = declaredBaseOption;\n        // For merge option.\n        if (!baseOption.timeline) {\n          baseOption.timeline = timelineOnRoot;\n        }\n      }\n      // For convenience, enable to use the root option as the `baseOption`:\n      // `{ ...normalOptionProps, media: [{ ... }, { ... }] }`\n      else {\n        if (hasTimeline || hasMedia) {\n          rawOption.options = rawOption.media = null;\n        }\n        baseOption = rawOption;\n      }\n      if (hasMedia) {\n        if (isArray(mediaOnRoot)) {\n          each(mediaOnRoot, function (singleMedia) {\n            if (\"development\" !== 'production') {\n              // Real case of wrong config.\n              if (singleMedia && !singleMedia.option && isObject(singleMedia.query) && isObject(singleMedia.query.option)) {\n                error('Illegal media option. Must be like { media: [ { query: {}, option: {} } ] }');\n              }\n            }\n            if (singleMedia && singleMedia.option) {\n              if (singleMedia.query) {\n                mediaList.push(singleMedia);\n              } else if (!mediaDefault) {\n                // Use the first media default.\n                mediaDefault = singleMedia;\n              }\n            }\n          });\n        } else {\n          if (\"development\" !== 'production') {\n            // Real case of wrong config.\n            error('Illegal media option. Must be an array. Like { media: [ {...}, {...} ] }');\n          }\n        }\n      }\n      doPreprocess(baseOption);\n      each(timelineOptionsOnRoot, function (option) {\n        return doPreprocess(option);\n      });\n      each(mediaList, function (media) {\n        return doPreprocess(media.option);\n      });\n      function doPreprocess(option) {\n        each(optionPreprocessorFuncs, function (preProcess) {\n          preProcess(option, isNew);\n        });\n      }\n      return {\n        baseOption: baseOption,\n        timelineOptions: timelineOptionsOnRoot || [],\n        mediaDefault: mediaDefault,\n        mediaList: mediaList\n      };\n    }\n    /**\r\n     * @see <http://www.w3.org/TR/css3-mediaqueries/#media1>\r\n     * Support: width, height, aspectRatio\r\n     * Can use max or min as prefix.\r\n     */\n    function applyMediaQuery(query, ecWidth, ecHeight) {\n      var realMap = {\n        width: ecWidth,\n        height: ecHeight,\n        aspectratio: ecWidth / ecHeight // lower case for convenience.\n      };\n      var applicable = true;\n      each(query, function (value, attr) {\n        var matched = attr.match(QUERY_REG);\n        if (!matched || !matched[1] || !matched[2]) {\n          return;\n        }\n        var operator = matched[1];\n        var realAttr = matched[2].toLowerCase();\n        if (!compare(realMap[realAttr], value, operator)) {\n          applicable = false;\n        }\n      });\n      return applicable;\n    }\n    function compare(real, expect, operator) {\n      if (operator === 'min') {\n        return real >= expect;\n      } else if (operator === 'max') {\n        return real <= expect;\n      } else {\n        // Equals\n        return real === expect;\n      }\n    }\n    function indicesEquals(indices1, indices2) {\n      // indices is always order by asc and has only finite number.\n      return indices1.join(',') === indices2.join(',');\n    }\n\n    var each$2 = each;\n    var isObject$1 = isObject;\n    var POSSIBLE_STYLES = ['areaStyle', 'lineStyle', 'nodeStyle', 'linkStyle', 'chordStyle', 'label', 'labelLine'];\n    function compatEC2ItemStyle(opt) {\n      var itemStyleOpt = opt && opt.itemStyle;\n      if (!itemStyleOpt) {\n        return;\n      }\n      for (var i = 0, len = POSSIBLE_STYLES.length; i < len; i++) {\n        var styleName = POSSIBLE_STYLES[i];\n        var normalItemStyleOpt = itemStyleOpt.normal;\n        var emphasisItemStyleOpt = itemStyleOpt.emphasis;\n        if (normalItemStyleOpt && normalItemStyleOpt[styleName]) {\n          if (\"development\" !== 'production') {\n            deprecateReplaceLog(\"itemStyle.normal.\" + styleName, styleName);\n          }\n          opt[styleName] = opt[styleName] || {};\n          if (!opt[styleName].normal) {\n            opt[styleName].normal = normalItemStyleOpt[styleName];\n          } else {\n            merge(opt[styleName].normal, normalItemStyleOpt[styleName]);\n          }\n          normalItemStyleOpt[styleName] = null;\n        }\n        if (emphasisItemStyleOpt && emphasisItemStyleOpt[styleName]) {\n          if (\"development\" !== 'production') {\n            deprecateReplaceLog(\"itemStyle.emphasis.\" + styleName, \"emphasis.\" + styleName);\n          }\n          opt[styleName] = opt[styleName] || {};\n          if (!opt[styleName].emphasis) {\n            opt[styleName].emphasis = emphasisItemStyleOpt[styleName];\n          } else {\n            merge(opt[styleName].emphasis, emphasisItemStyleOpt[styleName]);\n          }\n          emphasisItemStyleOpt[styleName] = null;\n        }\n      }\n    }\n    function convertNormalEmphasis(opt, optType, useExtend) {\n      if (opt && opt[optType] && (opt[optType].normal || opt[optType].emphasis)) {\n        var normalOpt = opt[optType].normal;\n        var emphasisOpt = opt[optType].emphasis;\n        if (normalOpt) {\n          if (\"development\" !== 'production') {\n            // eslint-disable-next-line max-len\n            deprecateLog(\"'normal' hierarchy in \" + optType + \" has been removed since 4.0. All style properties are configured in \" + optType + \" directly now.\");\n          }\n          // Timeline controlStyle has other properties besides normal and emphasis\n          if (useExtend) {\n            opt[optType].normal = opt[optType].emphasis = null;\n            defaults(opt[optType], normalOpt);\n          } else {\n            opt[optType] = normalOpt;\n          }\n        }\n        if (emphasisOpt) {\n          if (\"development\" !== 'production') {\n            deprecateLog(optType + \".emphasis has been changed to emphasis.\" + optType + \" since 4.0\");\n          }\n          opt.emphasis = opt.emphasis || {};\n          opt.emphasis[optType] = emphasisOpt;\n          // Also compat the case user mix the style and focus together in ec3 style\n          // for example: { itemStyle: { normal: {}, emphasis: {focus, shadowBlur} } }\n          if (emphasisOpt.focus) {\n            opt.emphasis.focus = emphasisOpt.focus;\n          }\n          if (emphasisOpt.blurScope) {\n            opt.emphasis.blurScope = emphasisOpt.blurScope;\n          }\n        }\n      }\n    }\n    function removeEC3NormalStatus(opt) {\n      convertNormalEmphasis(opt, 'itemStyle');\n      convertNormalEmphasis(opt, 'lineStyle');\n      convertNormalEmphasis(opt, 'areaStyle');\n      convertNormalEmphasis(opt, 'label');\n      convertNormalEmphasis(opt, 'labelLine');\n      // treemap\n      convertNormalEmphasis(opt, 'upperLabel');\n      // graph\n      convertNormalEmphasis(opt, 'edgeLabel');\n    }\n    function compatTextStyle(opt, propName) {\n      // Check whether is not object (string\\null\\undefined ...)\n      var labelOptSingle = isObject$1(opt) && opt[propName];\n      var textStyle = isObject$1(labelOptSingle) && labelOptSingle.textStyle;\n      if (textStyle) {\n        if (\"development\" !== 'production') {\n          // eslint-disable-next-line max-len\n          deprecateLog(\"textStyle hierarchy in \" + propName + \" has been removed since 4.0. All textStyle properties are configured in \" + propName + \" directly now.\");\n        }\n        for (var i = 0, len = TEXT_STYLE_OPTIONS.length; i < len; i++) {\n          var textPropName = TEXT_STYLE_OPTIONS[i];\n          if (textStyle.hasOwnProperty(textPropName)) {\n            labelOptSingle[textPropName] = textStyle[textPropName];\n          }\n        }\n      }\n    }\n    function compatEC3CommonStyles(opt) {\n      if (opt) {\n        removeEC3NormalStatus(opt);\n        compatTextStyle(opt, 'label');\n        opt.emphasis && compatTextStyle(opt.emphasis, 'label');\n      }\n    }\n    function processSeries(seriesOpt) {\n      if (!isObject$1(seriesOpt)) {\n        return;\n      }\n      compatEC2ItemStyle(seriesOpt);\n      removeEC3NormalStatus(seriesOpt);\n      compatTextStyle(seriesOpt, 'label');\n      // treemap\n      compatTextStyle(seriesOpt, 'upperLabel');\n      // graph\n      compatTextStyle(seriesOpt, 'edgeLabel');\n      if (seriesOpt.emphasis) {\n        compatTextStyle(seriesOpt.emphasis, 'label');\n        // treemap\n        compatTextStyle(seriesOpt.emphasis, 'upperLabel');\n        // graph\n        compatTextStyle(seriesOpt.emphasis, 'edgeLabel');\n      }\n      var markPoint = seriesOpt.markPoint;\n      if (markPoint) {\n        compatEC2ItemStyle(markPoint);\n        compatEC3CommonStyles(markPoint);\n      }\n      var markLine = seriesOpt.markLine;\n      if (markLine) {\n        compatEC2ItemStyle(markLine);\n        compatEC3CommonStyles(markLine);\n      }\n      var markArea = seriesOpt.markArea;\n      if (markArea) {\n        compatEC3CommonStyles(markArea);\n      }\n      var data = seriesOpt.data;\n      // Break with ec3: if `setOption` again, there may be no `type` in option,\n      // then the backward compat based on option type will not be performed.\n      if (seriesOpt.type === 'graph') {\n        data = data || seriesOpt.nodes;\n        var edgeData = seriesOpt.links || seriesOpt.edges;\n        if (edgeData && !isTypedArray(edgeData)) {\n          for (var i = 0; i < edgeData.length; i++) {\n            compatEC3CommonStyles(edgeData[i]);\n          }\n        }\n        each(seriesOpt.categories, function (opt) {\n          removeEC3NormalStatus(opt);\n        });\n      }\n      if (data && !isTypedArray(data)) {\n        for (var i = 0; i < data.length; i++) {\n          compatEC3CommonStyles(data[i]);\n        }\n      }\n      // mark point data\n      markPoint = seriesOpt.markPoint;\n      if (markPoint && markPoint.data) {\n        var mpData = markPoint.data;\n        for (var i = 0; i < mpData.length; i++) {\n          compatEC3CommonStyles(mpData[i]);\n        }\n      }\n      // mark line data\n      markLine = seriesOpt.markLine;\n      if (markLine && markLine.data) {\n        var mlData = markLine.data;\n        for (var i = 0; i < mlData.length; i++) {\n          if (isArray(mlData[i])) {\n            compatEC3CommonStyles(mlData[i][0]);\n            compatEC3CommonStyles(mlData[i][1]);\n          } else {\n            compatEC3CommonStyles(mlData[i]);\n          }\n        }\n      }\n      // Series\n      if (seriesOpt.type === 'gauge') {\n        compatTextStyle(seriesOpt, 'axisLabel');\n        compatTextStyle(seriesOpt, 'title');\n        compatTextStyle(seriesOpt, 'detail');\n      } else if (seriesOpt.type === 'treemap') {\n        convertNormalEmphasis(seriesOpt.breadcrumb, 'itemStyle');\n        each(seriesOpt.levels, function (opt) {\n          removeEC3NormalStatus(opt);\n        });\n      } else if (seriesOpt.type === 'tree') {\n        removeEC3NormalStatus(seriesOpt.leaves);\n      }\n      // sunburst starts from ec4, so it does not need to compat levels.\n    }\n    function toArr(o) {\n      return isArray(o) ? o : o ? [o] : [];\n    }\n    function toObj(o) {\n      return (isArray(o) ? o[0] : o) || {};\n    }\n    function globalCompatStyle(option, isTheme) {\n      each$2(toArr(option.series), function (seriesOpt) {\n        isObject$1(seriesOpt) && processSeries(seriesOpt);\n      });\n      var axes = ['xAxis', 'yAxis', 'radiusAxis', 'angleAxis', 'singleAxis', 'parallelAxis', 'radar'];\n      isTheme && axes.push('valueAxis', 'categoryAxis', 'logAxis', 'timeAxis');\n      each$2(axes, function (axisName) {\n        each$2(toArr(option[axisName]), function (axisOpt) {\n          if (axisOpt) {\n            compatTextStyle(axisOpt, 'axisLabel');\n            compatTextStyle(axisOpt.axisPointer, 'label');\n          }\n        });\n      });\n      each$2(toArr(option.parallel), function (parallelOpt) {\n        var parallelAxisDefault = parallelOpt && parallelOpt.parallelAxisDefault;\n        compatTextStyle(parallelAxisDefault, 'axisLabel');\n        compatTextStyle(parallelAxisDefault && parallelAxisDefault.axisPointer, 'label');\n      });\n      each$2(toArr(option.calendar), function (calendarOpt) {\n        convertNormalEmphasis(calendarOpt, 'itemStyle');\n        compatTextStyle(calendarOpt, 'dayLabel');\n        compatTextStyle(calendarOpt, 'monthLabel');\n        compatTextStyle(calendarOpt, 'yearLabel');\n      });\n      // radar.name.textStyle\n      each$2(toArr(option.radar), function (radarOpt) {\n        compatTextStyle(radarOpt, 'name');\n        // Use axisName instead of name because component has name property\n        if (radarOpt.name && radarOpt.axisName == null) {\n          radarOpt.axisName = radarOpt.name;\n          delete radarOpt.name;\n          if (\"development\" !== 'production') {\n            deprecateLog('name property in radar component has been changed to axisName');\n          }\n        }\n        if (radarOpt.nameGap != null && radarOpt.axisNameGap == null) {\n          radarOpt.axisNameGap = radarOpt.nameGap;\n          delete radarOpt.nameGap;\n          if (\"development\" !== 'production') {\n            deprecateLog('nameGap property in radar component has been changed to axisNameGap');\n          }\n        }\n        if (\"development\" !== 'production') {\n          each$2(radarOpt.indicator, function (indicatorOpt) {\n            if (indicatorOpt.text) {\n              deprecateReplaceLog('text', 'name', 'radar.indicator');\n            }\n          });\n        }\n      });\n      each$2(toArr(option.geo), function (geoOpt) {\n        if (isObject$1(geoOpt)) {\n          compatEC3CommonStyles(geoOpt);\n          each$2(toArr(geoOpt.regions), function (regionObj) {\n            compatEC3CommonStyles(regionObj);\n          });\n        }\n      });\n      each$2(toArr(option.timeline), function (timelineOpt) {\n        compatEC3CommonStyles(timelineOpt);\n        convertNormalEmphasis(timelineOpt, 'label');\n        convertNormalEmphasis(timelineOpt, 'itemStyle');\n        convertNormalEmphasis(timelineOpt, 'controlStyle', true);\n        var data = timelineOpt.data;\n        isArray(data) && each(data, function (item) {\n          if (isObject(item)) {\n            convertNormalEmphasis(item, 'label');\n            convertNormalEmphasis(item, 'itemStyle');\n          }\n        });\n      });\n      each$2(toArr(option.toolbox), function (toolboxOpt) {\n        convertNormalEmphasis(toolboxOpt, 'iconStyle');\n        each$2(toolboxOpt.feature, function (featureOpt) {\n          convertNormalEmphasis(featureOpt, 'iconStyle');\n        });\n      });\n      compatTextStyle(toObj(option.axisPointer), 'label');\n      compatTextStyle(toObj(option.tooltip).axisPointer, 'label');\n      // Clean logs\n      // storedLogs = {};\n    }\n\n    function get(opt, path) {\n      var pathArr = path.split(',');\n      var obj = opt;\n      for (var i = 0; i < pathArr.length; i++) {\n        obj = obj && obj[pathArr[i]];\n        if (obj == null) {\n          break;\n        }\n      }\n      return obj;\n    }\n    function set$1(opt, path, val, overwrite) {\n      var pathArr = path.split(',');\n      var obj = opt;\n      var key;\n      var i = 0;\n      for (; i < pathArr.length - 1; i++) {\n        key = pathArr[i];\n        if (obj[key] == null) {\n          obj[key] = {};\n        }\n        obj = obj[key];\n      }\n      if (overwrite || obj[pathArr[i]] == null) {\n        obj[pathArr[i]] = val;\n      }\n    }\n    function compatLayoutProperties(option) {\n      option && each(LAYOUT_PROPERTIES, function (prop) {\n        if (prop[0] in option && !(prop[1] in option)) {\n          option[prop[1]] = option[prop[0]];\n        }\n      });\n    }\n    var LAYOUT_PROPERTIES = [['x', 'left'], ['y', 'top'], ['x2', 'right'], ['y2', 'bottom']];\n    var COMPATITABLE_COMPONENTS = ['grid', 'geo', 'parallel', 'legend', 'toolbox', 'title', 'visualMap', 'dataZoom', 'timeline'];\n    var BAR_ITEM_STYLE_MAP = [['borderRadius', 'barBorderRadius'], ['borderColor', 'barBorderColor'], ['borderWidth', 'barBorderWidth']];\n    function compatBarItemStyle(option) {\n      var itemStyle = option && option.itemStyle;\n      if (itemStyle) {\n        for (var i = 0; i < BAR_ITEM_STYLE_MAP.length; i++) {\n          var oldName = BAR_ITEM_STYLE_MAP[i][1];\n          var newName = BAR_ITEM_STYLE_MAP[i][0];\n          if (itemStyle[oldName] != null) {\n            itemStyle[newName] = itemStyle[oldName];\n            if (\"development\" !== 'production') {\n              deprecateReplaceLog(oldName, newName);\n            }\n          }\n        }\n      }\n    }\n    function compatPieLabel(option) {\n      if (!option) {\n        return;\n      }\n      if (option.alignTo === 'edge' && option.margin != null && option.edgeDistance == null) {\n        if (\"development\" !== 'production') {\n          deprecateReplaceLog('label.margin', 'label.edgeDistance', 'pie');\n        }\n        option.edgeDistance = option.margin;\n      }\n    }\n    function compatSunburstState(option) {\n      if (!option) {\n        return;\n      }\n      if (option.downplay && !option.blur) {\n        option.blur = option.downplay;\n        if (\"development\" !== 'production') {\n          deprecateReplaceLog('downplay', 'blur', 'sunburst');\n        }\n      }\n    }\n    function compatGraphFocus(option) {\n      if (!option) {\n        return;\n      }\n      if (option.focusNodeAdjacency != null) {\n        option.emphasis = option.emphasis || {};\n        if (option.emphasis.focus == null) {\n          if (\"development\" !== 'production') {\n            deprecateReplaceLog('focusNodeAdjacency', 'emphasis: { focus: \\'adjacency\\'}', 'graph/sankey');\n          }\n          option.emphasis.focus = 'adjacency';\n        }\n      }\n    }\n    function traverseTree(data, cb) {\n      if (data) {\n        for (var i = 0; i < data.length; i++) {\n          cb(data[i]);\n          data[i] && traverseTree(data[i].children, cb);\n        }\n      }\n    }\n    function globalBackwardCompat(option, isTheme) {\n      globalCompatStyle(option, isTheme);\n      // Make sure series array for model initialization.\n      option.series = normalizeToArray(option.series);\n      each(option.series, function (seriesOpt) {\n        if (!isObject(seriesOpt)) {\n          return;\n        }\n        var seriesType = seriesOpt.type;\n        if (seriesType === 'line') {\n          if (seriesOpt.clipOverflow != null) {\n            seriesOpt.clip = seriesOpt.clipOverflow;\n            if (\"development\" !== 'production') {\n              deprecateReplaceLog('clipOverflow', 'clip', 'line');\n            }\n          }\n        } else if (seriesType === 'pie' || seriesType === 'gauge') {\n          if (seriesOpt.clockWise != null) {\n            seriesOpt.clockwise = seriesOpt.clockWise;\n            if (\"development\" !== 'production') {\n              deprecateReplaceLog('clockWise', 'clockwise');\n            }\n          }\n          compatPieLabel(seriesOpt.label);\n          var data = seriesOpt.data;\n          if (data && !isTypedArray(data)) {\n            for (var i = 0; i < data.length; i++) {\n              compatPieLabel(data[i]);\n            }\n          }\n          if (seriesOpt.hoverOffset != null) {\n            seriesOpt.emphasis = seriesOpt.emphasis || {};\n            if (seriesOpt.emphasis.scaleSize = null) {\n              if (\"development\" !== 'production') {\n                deprecateReplaceLog('hoverOffset', 'emphasis.scaleSize');\n              }\n              seriesOpt.emphasis.scaleSize = seriesOpt.hoverOffset;\n            }\n          }\n        } else if (seriesType === 'gauge') {\n          var pointerColor = get(seriesOpt, 'pointer.color');\n          pointerColor != null && set$1(seriesOpt, 'itemStyle.color', pointerColor);\n        } else if (seriesType === 'bar') {\n          compatBarItemStyle(seriesOpt);\n          compatBarItemStyle(seriesOpt.backgroundStyle);\n          compatBarItemStyle(seriesOpt.emphasis);\n          var data = seriesOpt.data;\n          if (data && !isTypedArray(data)) {\n            for (var i = 0; i < data.length; i++) {\n              if (typeof data[i] === 'object') {\n                compatBarItemStyle(data[i]);\n                compatBarItemStyle(data[i] && data[i].emphasis);\n              }\n            }\n          }\n        } else if (seriesType === 'sunburst') {\n          var highlightPolicy = seriesOpt.highlightPolicy;\n          if (highlightPolicy) {\n            seriesOpt.emphasis = seriesOpt.emphasis || {};\n            if (!seriesOpt.emphasis.focus) {\n              seriesOpt.emphasis.focus = highlightPolicy;\n              if (\"development\" !== 'production') {\n                deprecateReplaceLog('highlightPolicy', 'emphasis.focus', 'sunburst');\n              }\n            }\n          }\n          compatSunburstState(seriesOpt);\n          traverseTree(seriesOpt.data, compatSunburstState);\n        } else if (seriesType === 'graph' || seriesType === 'sankey') {\n          compatGraphFocus(seriesOpt);\n          // TODO nodes, edges?\n        } else if (seriesType === 'map') {\n          if (seriesOpt.mapType && !seriesOpt.map) {\n            if (\"development\" !== 'production') {\n              deprecateReplaceLog('mapType', 'map', 'map');\n            }\n            seriesOpt.map = seriesOpt.mapType;\n          }\n          if (seriesOpt.mapLocation) {\n            if (\"development\" !== 'production') {\n              deprecateLog('`mapLocation` is not used anymore.');\n            }\n            defaults(seriesOpt, seriesOpt.mapLocation);\n          }\n        }\n        if (seriesOpt.hoverAnimation != null) {\n          seriesOpt.emphasis = seriesOpt.emphasis || {};\n          if (seriesOpt.emphasis && seriesOpt.emphasis.scale == null) {\n            if (\"development\" !== 'production') {\n              deprecateReplaceLog('hoverAnimation', 'emphasis.scale');\n            }\n            seriesOpt.emphasis.scale = seriesOpt.hoverAnimation;\n          }\n        }\n        compatLayoutProperties(seriesOpt);\n      });\n      // dataRange has changed to visualMap\n      if (option.dataRange) {\n        option.visualMap = option.dataRange;\n      }\n      each(COMPATITABLE_COMPONENTS, function (componentName) {\n        var options = option[componentName];\n        if (options) {\n          if (!isArray(options)) {\n            options = [options];\n          }\n          each(options, function (option) {\n            compatLayoutProperties(option);\n          });\n        }\n      });\n    }\n\n    // (1) [Caution]: the logic is correct based on the premises:\n    //     data processing stage is blocked in stream.\n    //     See <module:echarts/stream/Scheduler#performDataProcessorTasks>\n    // (2) Only register once when import repeatedly.\n    //     Should be executed after series is filtered and before stack calculation.\n    function dataStack(ecModel) {\n      var stackInfoMap = createHashMap();\n      ecModel.eachSeries(function (seriesModel) {\n        var stack = seriesModel.get('stack');\n        // Compatible: when `stack` is set as '', do not stack.\n        if (stack) {\n          var stackInfoList = stackInfoMap.get(stack) || stackInfoMap.set(stack, []);\n          var data = seriesModel.getData();\n          var stackInfo = {\n            // Used for calculate axis extent automatically.\n            // TODO: Type getCalculationInfo return more specific type?\n            stackResultDimension: data.getCalculationInfo('stackResultDimension'),\n            stackedOverDimension: data.getCalculationInfo('stackedOverDimension'),\n            stackedDimension: data.getCalculationInfo('stackedDimension'),\n            stackedByDimension: data.getCalculationInfo('stackedByDimension'),\n            isStackedByIndex: data.getCalculationInfo('isStackedByIndex'),\n            data: data,\n            seriesModel: seriesModel\n          };\n          // If stacked on axis that do not support data stack.\n          if (!stackInfo.stackedDimension || !(stackInfo.isStackedByIndex || stackInfo.stackedByDimension)) {\n            return;\n          }\n          stackInfoList.length && data.setCalculationInfo('stackedOnSeries', stackInfoList[stackInfoList.length - 1].seriesModel);\n          stackInfoList.push(stackInfo);\n        }\n      });\n      stackInfoMap.each(calculateStack);\n    }\n    function calculateStack(stackInfoList) {\n      each(stackInfoList, function (targetStackInfo, idxInStack) {\n        var resultVal = [];\n        var resultNaN = [NaN, NaN];\n        var dims = [targetStackInfo.stackResultDimension, targetStackInfo.stackedOverDimension];\n        var targetData = targetStackInfo.data;\n        var isStackedByIndex = targetStackInfo.isStackedByIndex;\n        var stackStrategy = targetStackInfo.seriesModel.get('stackStrategy') || 'samesign';\n        // Should not write on raw data, because stack series model list changes\n        // depending on legend selection.\n        targetData.modify(dims, function (v0, v1, dataIndex) {\n          var sum = targetData.get(targetStackInfo.stackedDimension, dataIndex);\n          // Consider `connectNulls` of line area, if value is NaN, stackedOver\n          // should also be NaN, to draw a appropriate belt area.\n          if (isNaN(sum)) {\n            return resultNaN;\n          }\n          var byValue;\n          var stackedDataRawIndex;\n          if (isStackedByIndex) {\n            stackedDataRawIndex = targetData.getRawIndex(dataIndex);\n          } else {\n            byValue = targetData.get(targetStackInfo.stackedByDimension, dataIndex);\n          }\n          // If stackOver is NaN, chart view will render point on value start.\n          var stackedOver = NaN;\n          for (var j = idxInStack - 1; j >= 0; j--) {\n            var stackInfo = stackInfoList[j];\n            // Has been optimized by inverted indices on `stackedByDimension`.\n            if (!isStackedByIndex) {\n              stackedDataRawIndex = stackInfo.data.rawIndexOf(stackInfo.stackedByDimension, byValue);\n            }\n            if (stackedDataRawIndex >= 0) {\n              var val = stackInfo.data.getByRawIndex(stackInfo.stackResultDimension, stackedDataRawIndex);\n              // Considering positive stack, negative stack and empty data\n              if (stackStrategy === 'all' // single stack group\n              || stackStrategy === 'positive' && val > 0 || stackStrategy === 'negative' && val < 0 || stackStrategy === 'samesign' && sum >= 0 && val > 0 // All positive stack\n              || stackStrategy === 'samesign' && sum <= 0 && val < 0 // All negative stack\n              ) {\n                // The sum has to be very small to be affected by the\n                // floating arithmetic problem. An incorrect result will probably\n                // cause axis min/max to be filtered incorrectly.\n                sum = addSafe(sum, val);\n                stackedOver = val;\n                break;\n              }\n            }\n          }\n          resultVal[0] = sum;\n          resultVal[1] = stackedOver;\n          return resultVal;\n        });\n      });\n    }\n\n    // @inner\n    var SourceImpl = /** @class */function () {\n      function SourceImpl(fields) {\n        this.data = fields.data || (fields.sourceFormat === SOURCE_FORMAT_KEYED_COLUMNS ? {} : []);\n        this.sourceFormat = fields.sourceFormat || SOURCE_FORMAT_UNKNOWN;\n        // Visit config\n        this.seriesLayoutBy = fields.seriesLayoutBy || SERIES_LAYOUT_BY_COLUMN;\n        this.startIndex = fields.startIndex || 0;\n        this.dimensionsDetectedCount = fields.dimensionsDetectedCount;\n        this.metaRawOption = fields.metaRawOption;\n        var dimensionsDefine = this.dimensionsDefine = fields.dimensionsDefine;\n        if (dimensionsDefine) {\n          for (var i = 0; i < dimensionsDefine.length; i++) {\n            var dim = dimensionsDefine[i];\n            if (dim.type == null) {\n              if (guessOrdinal(this, i) === BE_ORDINAL.Must) {\n                dim.type = 'ordinal';\n              }\n            }\n          }\n        }\n      }\n      return SourceImpl;\n    }();\n    function isSourceInstance(val) {\n      return val instanceof SourceImpl;\n    }\n    /**\r\n     * Create a source from option.\r\n     * NOTE: Created source is immutable. Don't change any properties in it.\r\n     */\n    function createSource(sourceData, thisMetaRawOption,\n    // can be null. If not provided, auto detect it from `sourceData`.\n    sourceFormat) {\n      sourceFormat = sourceFormat || detectSourceFormat(sourceData);\n      var seriesLayoutBy = thisMetaRawOption.seriesLayoutBy;\n      var determined = determineSourceDimensions(sourceData, sourceFormat, seriesLayoutBy, thisMetaRawOption.sourceHeader, thisMetaRawOption.dimensions);\n      var source = new SourceImpl({\n        data: sourceData,\n        sourceFormat: sourceFormat,\n        seriesLayoutBy: seriesLayoutBy,\n        dimensionsDefine: determined.dimensionsDefine,\n        startIndex: determined.startIndex,\n        dimensionsDetectedCount: determined.dimensionsDetectedCount,\n        metaRawOption: clone(thisMetaRawOption)\n      });\n      return source;\n    }\n    /**\r\n     * Wrap original series data for some compatibility cases.\r\n     */\n    function createSourceFromSeriesDataOption(data) {\n      return new SourceImpl({\n        data: data,\n        sourceFormat: isTypedArray(data) ? SOURCE_FORMAT_TYPED_ARRAY : SOURCE_FORMAT_ORIGINAL\n      });\n    }\n    /**\r\n     * Clone source but excludes source data.\r\n     */\n    function cloneSourceShallow(source) {\n      return new SourceImpl({\n        data: source.data,\n        sourceFormat: source.sourceFormat,\n        seriesLayoutBy: source.seriesLayoutBy,\n        dimensionsDefine: clone(source.dimensionsDefine),\n        startIndex: source.startIndex,\n        dimensionsDetectedCount: source.dimensionsDetectedCount\n      });\n    }\n    /**\r\n     * Note: An empty array will be detected as `SOURCE_FORMAT_ARRAY_ROWS`.\r\n     */\n    function detectSourceFormat(data) {\n      var sourceFormat = SOURCE_FORMAT_UNKNOWN;\n      if (isTypedArray(data)) {\n        sourceFormat = SOURCE_FORMAT_TYPED_ARRAY;\n      } else if (isArray(data)) {\n        // FIXME Whether tolerate null in top level array?\n        if (data.length === 0) {\n          sourceFormat = SOURCE_FORMAT_ARRAY_ROWS;\n        }\n        for (var i = 0, len = data.length; i < len; i++) {\n          var item = data[i];\n          if (item == null) {\n            continue;\n          } else if (isArray(item) || isTypedArray(item)) {\n            sourceFormat = SOURCE_FORMAT_ARRAY_ROWS;\n            break;\n          } else if (isObject(item)) {\n            sourceFormat = SOURCE_FORMAT_OBJECT_ROWS;\n            break;\n          }\n        }\n      } else if (isObject(data)) {\n        for (var key in data) {\n          if (hasOwn(data, key) && isArrayLike(data[key])) {\n            sourceFormat = SOURCE_FORMAT_KEYED_COLUMNS;\n            break;\n          }\n        }\n      }\n      return sourceFormat;\n    }\n    /**\r\n     * Determine the source definitions from data standalone dimensions definitions\r\n     * are not specified.\r\n     */\n    function determineSourceDimensions(data, sourceFormat, seriesLayoutBy, sourceHeader,\n    // standalone raw dimensions definition, like:\n    // {\n    //     dimensions: ['aa', 'bb', { name: 'cc', type: 'time' }]\n    // }\n    // in `dataset` or `series`\n    dimensionsDefine) {\n      var dimensionsDetectedCount;\n      var startIndex;\n      // PENDING: Could data be null/undefined here?\n      // currently, if `dataset.source` not specified, error thrown.\n      // if `series.data` not specified, nothing rendered without error thrown.\n      // Should test these cases.\n      if (!data) {\n        return {\n          dimensionsDefine: normalizeDimensionsOption(dimensionsDefine),\n          startIndex: startIndex,\n          dimensionsDetectedCount: dimensionsDetectedCount\n        };\n      }\n      if (sourceFormat === SOURCE_FORMAT_ARRAY_ROWS) {\n        var dataArrayRows = data;\n        // Rule: Most of the first line are string: it is header.\n        // Caution: consider a line with 5 string and 1 number,\n        // it still can not be sure it is a head, because the\n        // 5 string may be 5 values of category columns.\n        if (sourceHeader === 'auto' || sourceHeader == null) {\n          arrayRowsTravelFirst(function (val) {\n            // '-' is regarded as null/undefined.\n            if (val != null && val !== '-') {\n              if (isString(val)) {\n                startIndex == null && (startIndex = 1);\n              } else {\n                startIndex = 0;\n              }\n            }\n            // 10 is an experience number, avoid long loop.\n          }, seriesLayoutBy, dataArrayRows, 10);\n        } else {\n          startIndex = isNumber(sourceHeader) ? sourceHeader : sourceHeader ? 1 : 0;\n        }\n        if (!dimensionsDefine && startIndex === 1) {\n          dimensionsDefine = [];\n          arrayRowsTravelFirst(function (val, index) {\n            dimensionsDefine[index] = val != null ? val + '' : '';\n          }, seriesLayoutBy, dataArrayRows, Infinity);\n        }\n        dimensionsDetectedCount = dimensionsDefine ? dimensionsDefine.length : seriesLayoutBy === SERIES_LAYOUT_BY_ROW ? dataArrayRows.length : dataArrayRows[0] ? dataArrayRows[0].length : null;\n      } else if (sourceFormat === SOURCE_FORMAT_OBJECT_ROWS) {\n        if (!dimensionsDefine) {\n          dimensionsDefine = objectRowsCollectDimensions(data);\n        }\n      } else if (sourceFormat === SOURCE_FORMAT_KEYED_COLUMNS) {\n        if (!dimensionsDefine) {\n          dimensionsDefine = [];\n          each(data, function (colArr, key) {\n            dimensionsDefine.push(key);\n          });\n        }\n      } else if (sourceFormat === SOURCE_FORMAT_ORIGINAL) {\n        var value0 = getDataItemValue(data[0]);\n        dimensionsDetectedCount = isArray(value0) && value0.length || 1;\n      } else if (sourceFormat === SOURCE_FORMAT_TYPED_ARRAY) {\n        if (\"development\" !== 'production') {\n          assert(!!dimensionsDefine, 'dimensions must be given if data is TypedArray.');\n        }\n      }\n      return {\n        startIndex: startIndex,\n        dimensionsDefine: normalizeDimensionsOption(dimensionsDefine),\n        dimensionsDetectedCount: dimensionsDetectedCount\n      };\n    }\n    function objectRowsCollectDimensions(data) {\n      var firstIndex = 0;\n      var obj;\n      while (firstIndex < data.length && !(obj = data[firstIndex++])) {} // jshint ignore: line\n      if (obj) {\n        return keys(obj);\n      }\n    }\n    // Consider dimensions defined like ['A', 'price', 'B', 'price', 'C', 'price'],\n    // which is reasonable. But dimension name is duplicated.\n    // Returns undefined or an array contains only object without null/undefined or string.\n    function normalizeDimensionsOption(dimensionsDefine) {\n      if (!dimensionsDefine) {\n        // The meaning of null/undefined is different from empty array.\n        return;\n      }\n      var nameMap = createHashMap();\n      return map(dimensionsDefine, function (rawItem, index) {\n        rawItem = isObject(rawItem) ? rawItem : {\n          name: rawItem\n        };\n        // Other fields will be discarded.\n        var item = {\n          name: rawItem.name,\n          displayName: rawItem.displayName,\n          type: rawItem.type\n        };\n        // User can set null in dimensions.\n        // We don't auto specify name, otherwise a given name may\n        // cause it to be referred unexpectedly.\n        if (item.name == null) {\n          return item;\n        }\n        // Also consider number form like 2012.\n        item.name += '';\n        // User may also specify displayName.\n        // displayName will always exists except user not\n        // specified or dim name is not specified or detected.\n        // (A auto generated dim name will not be used as\n        // displayName).\n        if (item.displayName == null) {\n          item.displayName = item.name;\n        }\n        var exist = nameMap.get(item.name);\n        if (!exist) {\n          nameMap.set(item.name, {\n            count: 1\n          });\n        } else {\n          item.name += '-' + exist.count++;\n        }\n        return item;\n      });\n    }\n    function arrayRowsTravelFirst(cb, seriesLayoutBy, data, maxLoop) {\n      if (seriesLayoutBy === SERIES_LAYOUT_BY_ROW) {\n        for (var i = 0; i < data.length && i < maxLoop; i++) {\n          cb(data[i] ? data[i][0] : null, i);\n        }\n      } else {\n        var value0 = data[0] || [];\n        for (var i = 0; i < value0.length && i < maxLoop; i++) {\n          cb(value0[i], i);\n        }\n      }\n    }\n    function shouldRetrieveDataByName(source) {\n      var sourceFormat = source.sourceFormat;\n      return sourceFormat === SOURCE_FORMAT_OBJECT_ROWS || sourceFormat === SOURCE_FORMAT_KEYED_COLUMNS;\n    }\n\n    /*\n    * Licensed to the Apache Software Foundation (ASF) under one\n    * or more contributor license agreements.  See the NOTICE file\n    * distributed with this work for additional information\n    * regarding copyright ownership.  The ASF licenses this file\n    * to you under the Apache License, Version 2.0 (the\n    * \"License\"); you may not use this file except in compliance\n    * with the License.  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,\n    * software distributed under the License is distributed on an\n    * \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\n    * KIND, either express or implied.  See the License for the\n    * specific language governing permissions and limitations\n    * under the License.\n    */\n\n\n    /**\n     * AUTO-GENERATED FILE. DO NOT MODIFY.\n     */\n\n    /*\r\n    * Licensed to the Apache Software Foundation (ASF) under one\r\n    * or more contributor license agreements.  See the NOTICE file\r\n    * distributed with this work for additional information\r\n    * regarding copyright ownership.  The ASF licenses this file\r\n    * to you under the Apache License, Version 2.0 (the\r\n    * \"License\"); you may not use this file except in compliance\r\n    * with the License.  You may obtain a copy of the License at\r\n    *\r\n    *   http://www.apache.org/licenses/LICENSE-2.0\r\n    *\r\n    * Unless required by applicable law or agreed to in writing,\r\n    * software distributed under the License is distributed on an\r\n    * \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\r\n    * KIND, either express or implied.  See the License for the\r\n    * specific language governing permissions and limitations\r\n    * under the License.\r\n    */\n    var _a, _b, _c;\n    var providerMethods;\n    var mountMethods;\n    /**\r\n     * If normal array used, mutable chunk size is supported.\r\n     * If typed array used, chunk size must be fixed.\r\n     */\n    var DefaultDataProvider = /** @class */function () {\n      function DefaultDataProvider(sourceParam, dimSize) {\n        // let source: Source;\n        var source = !isSourceInstance(sourceParam) ? createSourceFromSeriesDataOption(sourceParam) : sourceParam;\n        // declare source is Source;\n        this._source = source;\n        var data = this._data = source.data;\n        // Typed array. TODO IE10+?\n        if (source.sourceFormat === SOURCE_FORMAT_TYPED_ARRAY) {\n          if (\"development\" !== 'production') {\n            if (dimSize == null) {\n              throw new Error('Typed array data must specify dimension size');\n            }\n          }\n          this._offset = 0;\n          this._dimSize = dimSize;\n          this._data = data;\n        }\n        mountMethods(this, data, source);\n      }\n      DefaultDataProvider.prototype.getSource = function () {\n        return this._source;\n      };\n      DefaultDataProvider.prototype.count = function () {\n        return 0;\n      };\n      DefaultDataProvider.prototype.getItem = function (idx, out) {\n        return;\n      };\n      DefaultDataProvider.prototype.appendData = function (newData) {};\n      DefaultDataProvider.prototype.clean = function () {};\n      DefaultDataProvider.protoInitialize = function () {\n        // PENDING: To avoid potential incompat (e.g., prototype\n        // is visited somewhere), still init them on prototype.\n        var proto = DefaultDataProvider.prototype;\n        proto.pure = false;\n        proto.persistent = true;\n      }();\n      DefaultDataProvider.internalField = function () {\n        var _a;\n        mountMethods = function (provider, data, source) {\n          var sourceFormat = source.sourceFormat;\n          var seriesLayoutBy = source.seriesLayoutBy;\n          var startIndex = source.startIndex;\n          var dimsDef = source.dimensionsDefine;\n          var methods = providerMethods[getMethodMapKey(sourceFormat, seriesLayoutBy)];\n          if (\"development\" !== 'production') {\n            assert(methods, 'Invalide sourceFormat: ' + sourceFormat);\n          }\n          extend(provider, methods);\n          if (sourceFormat === SOURCE_FORMAT_TYPED_ARRAY) {\n            provider.getItem = getItemForTypedArray;\n            provider.count = countForTypedArray;\n            provider.fillStorage = fillStorageForTypedArray;\n          } else {\n            var rawItemGetter = getRawSourceItemGetter(sourceFormat, seriesLayoutBy);\n            provider.getItem = bind(rawItemGetter, null, data, startIndex, dimsDef);\n            var rawCounter = getRawSourceDataCounter(sourceFormat, seriesLayoutBy);\n            provider.count = bind(rawCounter, null, data, startIndex, dimsDef);\n          }\n        };\n        var getItemForTypedArray = function (idx, out) {\n          idx = idx - this._offset;\n          out = out || [];\n          var data = this._data;\n          var dimSize = this._dimSize;\n          var offset = dimSize * idx;\n          for (var i = 0; i < dimSize; i++) {\n            out[i] = data[offset + i];\n          }\n          return out;\n        };\n        var fillStorageForTypedArray = function (start, end, storage, extent) {\n          var data = this._data;\n          var dimSize = this._dimSize;\n          for (var dim = 0; dim < dimSize; dim++) {\n            var dimExtent = extent[dim];\n            var min = dimExtent[0] == null ? Infinity : dimExtent[0];\n            var max = dimExtent[1] == null ? -Infinity : dimExtent[1];\n            var count = end - start;\n            var arr = storage[dim];\n            for (var i = 0; i < count; i++) {\n              // appendData with TypedArray will always do replace in provider.\n              var val = data[i * dimSize + dim];\n              arr[start + i] = val;\n              val < min && (min = val);\n              val > max && (max = val);\n            }\n            dimExtent[0] = min;\n            dimExtent[1] = max;\n          }\n        };\n        var countForTypedArray = function () {\n          return this._data ? this._data.length / this._dimSize : 0;\n        };\n        providerMethods = (_a = {}, _a[SOURCE_FORMAT_ARRAY_ROWS + '_' + SERIES_LAYOUT_BY_COLUMN] = {\n          pure: true,\n          appendData: appendDataSimply\n        }, _a[SOURCE_FORMAT_ARRAY_ROWS + '_' + SERIES_LAYOUT_BY_ROW] = {\n          pure: true,\n          appendData: function () {\n            throw new Error('Do not support appendData when set seriesLayoutBy: \"row\".');\n          }\n        }, _a[SOURCE_FORMAT_OBJECT_ROWS] = {\n          pure: true,\n          appendData: appendDataSimply\n        }, _a[SOURCE_FORMAT_KEYED_COLUMNS] = {\n          pure: true,\n          appendData: function (newData) {\n            var data = this._data;\n            each(newData, function (newCol, key) {\n              var oldCol = data[key] || (data[key] = []);\n              for (var i = 0; i < (newCol || []).length; i++) {\n                oldCol.push(newCol[i]);\n              }\n            });\n          }\n        }, _a[SOURCE_FORMAT_ORIGINAL] = {\n          appendData: appendDataSimply\n        }, _a[SOURCE_FORMAT_TYPED_ARRAY] = {\n          persistent: false,\n          pure: true,\n          appendData: function (newData) {\n            if (\"development\" !== 'production') {\n              assert(isTypedArray(newData), 'Added data must be TypedArray if data in initialization is TypedArray');\n            }\n            this._data = newData;\n          },\n          // Clean self if data is already used.\n          clean: function () {\n            // PENDING\n            this._offset += this.count();\n            this._data = null;\n          }\n        }, _a);\n        function appendDataSimply(newData) {\n          for (var i = 0; i < newData.length; i++) {\n            this._data.push(newData[i]);\n          }\n        }\n      }();\n      return DefaultDataProvider;\n    }();\n    var getItemSimply = function (rawData, startIndex, dimsDef, idx) {\n      return rawData[idx];\n    };\n    var rawSourceItemGetterMap = (_a = {}, _a[SOURCE_FORMAT_ARRAY_ROWS + '_' + SERIES_LAYOUT_BY_COLUMN] = function (rawData, startIndex, dimsDef, idx) {\n      return rawData[idx + startIndex];\n    }, _a[SOURCE_FORMAT_ARRAY_ROWS + '_' + SERIES_LAYOUT_BY_ROW] = function (rawData, startIndex, dimsDef, idx, out) {\n      idx += startIndex;\n      var item = out || [];\n      var data = rawData;\n      for (var i = 0; i < data.length; i++) {\n        var row = data[i];\n        item[i] = row ? row[idx] : null;\n      }\n      return item;\n    }, _a[SOURCE_FORMAT_OBJECT_ROWS] = getItemSimply, _a[SOURCE_FORMAT_KEYED_COLUMNS] = function (rawData, startIndex, dimsDef, idx, out) {\n      var item = out || [];\n      for (var i = 0; i < dimsDef.length; i++) {\n        var dimName = dimsDef[i].name;\n        if (\"development\" !== 'production') {\n          if (dimName == null) {\n            throw new Error();\n          }\n        }\n        var col = rawData[dimName];\n        item[i] = col ? col[idx] : null;\n      }\n      return item;\n    }, _a[SOURCE_FORMAT_ORIGINAL] = getItemSimply, _a);\n    function getRawSourceItemGetter(sourceFormat, seriesLayoutBy) {\n      var method = rawSourceItemGetterMap[getMethodMapKey(sourceFormat, seriesLayoutBy)];\n      if (\"development\" !== 'production') {\n        assert(method, 'Do not support get item on \"' + sourceFormat + '\", \"' + seriesLayoutBy + '\".');\n      }\n      return method;\n    }\n    var countSimply = function (rawData, startIndex, dimsDef) {\n      return rawData.length;\n    };\n    var rawSourceDataCounterMap = (_b = {}, _b[SOURCE_FORMAT_ARRAY_ROWS + '_' + SERIES_LAYOUT_BY_COLUMN] = function (rawData, startIndex, dimsDef) {\n      return Math.max(0, rawData.length - startIndex);\n    }, _b[SOURCE_FORMAT_ARRAY_ROWS + '_' + SERIES_LAYOUT_BY_ROW] = function (rawData, startIndex, dimsDef) {\n      var row = rawData[0];\n      return row ? Math.max(0, row.length - startIndex) : 0;\n    }, _b[SOURCE_FORMAT_OBJECT_ROWS] = countSimply, _b[SOURCE_FORMAT_KEYED_COLUMNS] = function (rawData, startIndex, dimsDef) {\n      var dimName = dimsDef[0].name;\n      if (\"development\" !== 'production') {\n        if (dimName == null) {\n          throw new Error();\n        }\n      }\n      var col = rawData[dimName];\n      return col ? col.length : 0;\n    }, _b[SOURCE_FORMAT_ORIGINAL] = countSimply, _b);\n    function getRawSourceDataCounter(sourceFormat, seriesLayoutBy) {\n      var method = rawSourceDataCounterMap[getMethodMapKey(sourceFormat, seriesLayoutBy)];\n      if (\"development\" !== 'production') {\n        assert(method, 'Do not support count on \"' + sourceFormat + '\", \"' + seriesLayoutBy + '\".');\n      }\n      return method;\n    }\n    var getRawValueSimply = function (dataItem, dimIndex, property) {\n      return dataItem[dimIndex];\n    };\n    var rawSourceValueGetterMap = (_c = {}, _c[SOURCE_FORMAT_ARRAY_ROWS] = getRawValueSimply, _c[SOURCE_FORMAT_OBJECT_ROWS] = function (dataItem, dimIndex, property) {\n      return dataItem[property];\n    }, _c[SOURCE_FORMAT_KEYED_COLUMNS] = getRawValueSimply, _c[SOURCE_FORMAT_ORIGINAL] = function (dataItem, dimIndex, property) {\n      // FIXME: In some case (markpoint in geo (geo-map.html)),\n      // dataItem is {coord: [...]}\n      var value = getDataItemValue(dataItem);\n      return !(value instanceof Array) ? value : value[dimIndex];\n    }, _c[SOURCE_FORMAT_TYPED_ARRAY] = getRawValueSimply, _c);\n    function getRawSourceValueGetter(sourceFormat) {\n      var method = rawSourceValueGetterMap[sourceFormat];\n      if (\"development\" !== 'production') {\n        assert(method, 'Do not support get value on \"' + sourceFormat + '\".');\n      }\n      return method;\n    }\n    function getMethodMapKey(sourceFormat, seriesLayoutBy) {\n      return sourceFormat === SOURCE_FORMAT_ARRAY_ROWS ? sourceFormat + '_' + seriesLayoutBy : sourceFormat;\n    }\n    // ??? FIXME can these logic be more neat: getRawValue, getRawDataItem,\n    // Consider persistent.\n    // Caution: why use raw value to display on label or tooltip?\n    // A reason is to avoid format. For example time value we do not know\n    // how to format is expected. More over, if stack is used, calculated\n    // value may be 0.91000000001, which have brings trouble to display.\n    // TODO: consider how to treat null/undefined/NaN when display?\n    function retrieveRawValue(data, dataIndex,\n    // If dimIndex is null/undefined, return OptionDataItem.\n    // Otherwise, return OptionDataValue.\n    dim) {\n      if (!data) {\n        return;\n      }\n      // Consider data may be not persistent.\n      var dataItem = data.getRawDataItem(dataIndex);\n      if (dataItem == null) {\n        return;\n      }\n      var store = data.getStore();\n      var sourceFormat = store.getSource().sourceFormat;\n      if (dim != null) {\n        var dimIndex = data.getDimensionIndex(dim);\n        var property = store.getDimensionProperty(dimIndex);\n        return getRawSourceValueGetter(sourceFormat)(dataItem, dimIndex, property);\n      } else {\n        var result = dataItem;\n        if (sourceFormat === SOURCE_FORMAT_ORIGINAL) {\n          result = getDataItemValue(dataItem);\n        }\n        return result;\n      }\n    }\n\n    var DIMENSION_LABEL_REG = /\\{@(.+?)\\}/g;\n    var DataFormatMixin = /** @class */function () {\n      function DataFormatMixin() {}\n      /**\r\n       * Get params for formatter\r\n       */\n      DataFormatMixin.prototype.getDataParams = function (dataIndex, dataType) {\n        var data = this.getData(dataType);\n        var rawValue = this.getRawValue(dataIndex, dataType);\n        var rawDataIndex = data.getRawIndex(dataIndex);\n        var name = data.getName(dataIndex);\n        var itemOpt = data.getRawDataItem(dataIndex);\n        var style = data.getItemVisual(dataIndex, 'style');\n        var color = style && style[data.getItemVisual(dataIndex, 'drawType') || 'fill'];\n        var borderColor = style && style.stroke;\n        var mainType = this.mainType;\n        var isSeries = mainType === 'series';\n        var userOutput = data.userOutput && data.userOutput.get();\n        return {\n          componentType: mainType,\n          componentSubType: this.subType,\n          componentIndex: this.componentIndex,\n          seriesType: isSeries ? this.subType : null,\n          seriesIndex: this.seriesIndex,\n          seriesId: isSeries ? this.id : null,\n          seriesName: isSeries ? this.name : null,\n          name: name,\n          dataIndex: rawDataIndex,\n          data: itemOpt,\n          dataType: dataType,\n          value: rawValue,\n          color: color,\n          borderColor: borderColor,\n          dimensionNames: userOutput ? userOutput.fullDimensions : null,\n          encode: userOutput ? userOutput.encode : null,\n          // Param name list for mapping `a`, `b`, `c`, `d`, `e`\n          $vars: ['seriesName', 'name', 'value']\n        };\n      };\n      /**\r\n       * Format label\r\n       * @param dataIndex\r\n       * @param status 'normal' by default\r\n       * @param dataType\r\n       * @param labelDimIndex Only used in some chart that\r\n       *        use formatter in different dimensions, like radar.\r\n       * @param formatter Formatter given outside.\r\n       * @return return null/undefined if no formatter\r\n       */\n      DataFormatMixin.prototype.getFormattedLabel = function (dataIndex, status, dataType, labelDimIndex, formatter, extendParams) {\n        status = status || 'normal';\n        var data = this.getData(dataType);\n        var params = this.getDataParams(dataIndex, dataType);\n        if (extendParams) {\n          params.value = extendParams.interpolatedValue;\n        }\n        if (labelDimIndex != null && isArray(params.value)) {\n          params.value = params.value[labelDimIndex];\n        }\n        if (!formatter) {\n          var itemModel = data.getItemModel(dataIndex);\n          // @ts-ignore\n          formatter = itemModel.get(status === 'normal' ? ['label', 'formatter'] : [status, 'label', 'formatter']);\n        }\n        if (isFunction(formatter)) {\n          params.status = status;\n          params.dimensionIndex = labelDimIndex;\n          return formatter(params);\n        } else if (isString(formatter)) {\n          var str = formatTpl(formatter, params);\n          // Support 'aaa{@[3]}bbb{@product}ccc'.\n          // Do not support '}' in dim name util have to.\n          return str.replace(DIMENSION_LABEL_REG, function (origin, dimStr) {\n            var len = dimStr.length;\n            var dimLoose = dimStr;\n            if (dimLoose.charAt(0) === '[' && dimLoose.charAt(len - 1) === ']') {\n              dimLoose = +dimLoose.slice(1, len - 1); // Also support: '[]' => 0\n              if (\"development\" !== 'production') {\n                if (isNaN(dimLoose)) {\n                  error(\"Invalide label formatter: @\" + dimStr + \", only support @[0], @[1], @[2], ...\");\n                }\n              }\n            }\n            var val = retrieveRawValue(data, dataIndex, dimLoose);\n            if (extendParams && isArray(extendParams.interpolatedValue)) {\n              var dimIndex = data.getDimensionIndex(dimLoose);\n              if (dimIndex >= 0) {\n                val = extendParams.interpolatedValue[dimIndex];\n              }\n            }\n            return val != null ? val + '' : '';\n          });\n        }\n      };\n      /**\r\n       * Get raw value in option\r\n       */\n      DataFormatMixin.prototype.getRawValue = function (idx, dataType) {\n        return retrieveRawValue(this.getData(dataType), idx);\n      };\n      /**\r\n       * Should be implemented.\r\n       * @param {number} dataIndex\r\n       * @param {boolean} [multipleSeries=false]\r\n       * @param {string} [dataType]\r\n       */\n      DataFormatMixin.prototype.formatTooltip = function (dataIndex, multipleSeries, dataType) {\n        // Empty function\n        return;\n      };\n      return DataFormatMixin;\n    }();\n    // PENDING: previously we accept this type when calling `formatTooltip`,\n    // but guess little chance has been used outside. Do we need to backward\n    // compat it?\n    // type TooltipFormatResultLegacyObject = {\n    //     // `html` means the markup language text, either in 'html' or 'richText'.\n    //     // The name `html` is not appropriate because in 'richText' it is not a HTML\n    //     // string. But still support it for backward compatibility.\n    //     html: string;\n    //     markers: Dictionary<ColorString>;\n    // };\n    /**\r\n     * For backward compat, normalize the return from `formatTooltip`.\r\n     */\n    function normalizeTooltipFormatResult(result) {\n      var markupText;\n      // let markers: Dictionary<ColorString>;\n      var markupFragment;\n      if (isObject(result)) {\n        if (result.type) {\n          markupFragment = result;\n        } else {\n          if (\"development\" !== 'production') {\n            console.warn('The return type of `formatTooltip` is not supported: ' + makePrintable(result));\n          }\n        }\n        // else {\n        //     markupText = (result as TooltipFormatResultLegacyObject).html;\n        //     markers = (result as TooltipFormatResultLegacyObject).markers;\n        //     if (markersExisting) {\n        //         markers = zrUtil.merge(markersExisting, markers);\n        //     }\n        // }\n      } else {\n        markupText = result;\n      }\n      return {\n        text: markupText,\n        // markers: markers || markersExisting,\n        frag: markupFragment\n      };\n    }\n\n    /**\r\n     * @param {Object} define\r\n     * @return See the return of `createTask`.\r\n     */\n    function createTask(define) {\n      return new Task(define);\n    }\n    var Task = /** @class */function () {\n      function Task(define) {\n        define = define || {};\n        this._reset = define.reset;\n        this._plan = define.plan;\n        this._count = define.count;\n        this._onDirty = define.onDirty;\n        this._dirty = true;\n      }\n      /**\r\n       * @param step Specified step.\r\n       * @param skip Skip customer perform call.\r\n       * @param modBy Sampling window size.\r\n       * @param modDataCount Sampling count.\r\n       * @return whether unfinished.\r\n       */\n      Task.prototype.perform = function (performArgs) {\n        var upTask = this._upstream;\n        var skip = performArgs && performArgs.skip;\n        // TODO some refactor.\n        // Pull data. Must pull data each time, because context.data\n        // may be updated by Series.setData.\n        if (this._dirty && upTask) {\n          var context = this.context;\n          context.data = context.outputData = upTask.context.outputData;\n        }\n        if (this.__pipeline) {\n          this.__pipeline.currentTask = this;\n        }\n        var planResult;\n        if (this._plan && !skip) {\n          planResult = this._plan(this.context);\n        }\n        // Support sharding by mod, which changes the render sequence and makes the rendered graphic\n        // elements uniformed distributed when progress, especially when moving or zooming.\n        var lastModBy = normalizeModBy(this._modBy);\n        var lastModDataCount = this._modDataCount || 0;\n        var modBy = normalizeModBy(performArgs && performArgs.modBy);\n        var modDataCount = performArgs && performArgs.modDataCount || 0;\n        if (lastModBy !== modBy || lastModDataCount !== modDataCount) {\n          planResult = 'reset';\n        }\n        function normalizeModBy(val) {\n          !(val >= 1) && (val = 1); // jshint ignore:line\n          return val;\n        }\n        var forceFirstProgress;\n        if (this._dirty || planResult === 'reset') {\n          this._dirty = false;\n          forceFirstProgress = this._doReset(skip);\n        }\n        this._modBy = modBy;\n        this._modDataCount = modDataCount;\n        var step = performArgs && performArgs.step;\n        if (upTask) {\n          if (\"development\" !== 'production') {\n            assert(upTask._outputDueEnd != null);\n          }\n          this._dueEnd = upTask._outputDueEnd;\n        }\n        // DataTask or overallTask\n        else {\n          if (\"development\" !== 'production') {\n            assert(!this._progress || this._count);\n          }\n          this._dueEnd = this._count ? this._count(this.context) : Infinity;\n        }\n        // Note: Stubs, that its host overall task let it has progress, has progress.\n        // If no progress, pass index from upstream to downstream each time plan called.\n        if (this._progress) {\n          var start = this._dueIndex;\n          var end = Math.min(step != null ? this._dueIndex + step : Infinity, this._dueEnd);\n          if (!skip && (forceFirstProgress || start < end)) {\n            var progress = this._progress;\n            if (isArray(progress)) {\n              for (var i = 0; i < progress.length; i++) {\n                this._doProgress(progress[i], start, end, modBy, modDataCount);\n              }\n            } else {\n              this._doProgress(progress, start, end, modBy, modDataCount);\n            }\n          }\n          this._dueIndex = end;\n          // If no `outputDueEnd`, assume that output data and\n          // input data is the same, so use `dueIndex` as `outputDueEnd`.\n          var outputDueEnd = this._settedOutputEnd != null ? this._settedOutputEnd : end;\n          if (\"development\" !== 'production') {\n            // ??? Can not rollback.\n            assert(outputDueEnd >= this._outputDueEnd);\n          }\n          this._outputDueEnd = outputDueEnd;\n        } else {\n          // (1) Some overall task has no progress.\n          // (2) Stubs, that its host overall task do not let it has progress, has no progress.\n          // This should always be performed so it can be passed to downstream.\n          this._dueIndex = this._outputDueEnd = this._settedOutputEnd != null ? this._settedOutputEnd : this._dueEnd;\n        }\n        return this.unfinished();\n      };\n      Task.prototype.dirty = function () {\n        this._dirty = true;\n        this._onDirty && this._onDirty(this.context);\n      };\n      Task.prototype._doProgress = function (progress, start, end, modBy, modDataCount) {\n        iterator.reset(start, end, modBy, modDataCount);\n        this._callingProgress = progress;\n        this._callingProgress({\n          start: start,\n          end: end,\n          count: end - start,\n          next: iterator.next\n        }, this.context);\n      };\n      Task.prototype._doReset = function (skip) {\n        this._dueIndex = this._outputDueEnd = this._dueEnd = 0;\n        this._settedOutputEnd = null;\n        var progress;\n        var forceFirstProgress;\n        if (!skip && this._reset) {\n          progress = this._reset(this.context);\n          if (progress && progress.progress) {\n            forceFirstProgress = progress.forceFirstProgress;\n            progress = progress.progress;\n          }\n          // To simplify no progress checking, array must has item.\n          if (isArray(progress) && !progress.length) {\n            progress = null;\n          }\n        }\n        this._progress = progress;\n        this._modBy = this._modDataCount = null;\n        var downstream = this._downstream;\n        downstream && downstream.dirty();\n        return forceFirstProgress;\n      };\n      Task.prototype.unfinished = function () {\n        return this._progress && this._dueIndex < this._dueEnd;\n      };\n      /**\r\n       * @param downTask The downstream task.\r\n       * @return The downstream task.\r\n       */\n      Task.prototype.pipe = function (downTask) {\n        if (\"development\" !== 'production') {\n          assert(downTask && !downTask._disposed && downTask !== this);\n        }\n        // If already downstream, do not dirty downTask.\n        if (this._downstream !== downTask || this._dirty) {\n          this._downstream = downTask;\n          downTask._upstream = this;\n          downTask.dirty();\n        }\n      };\n      Task.prototype.dispose = function () {\n        if (this._disposed) {\n          return;\n        }\n        this._upstream && (this._upstream._downstream = null);\n        this._downstream && (this._downstream._upstream = null);\n        this._dirty = false;\n        this._disposed = true;\n      };\n      Task.prototype.getUpstream = function () {\n        return this._upstream;\n      };\n      Task.prototype.getDownstream = function () {\n        return this._downstream;\n      };\n      Task.prototype.setOutputEnd = function (end) {\n        // This only happens in dataTask, dataZoom, map, currently.\n        // where dataZoom do not set end each time, but only set\n        // when reset. So we should record the set end, in case\n        // that the stub of dataZoom perform again and earse the\n        // set end by upstream.\n        this._outputDueEnd = this._settedOutputEnd = end;\n      };\n      return Task;\n    }();\n    var iterator = function () {\n      var end;\n      var current;\n      var modBy;\n      var modDataCount;\n      var winCount;\n      var it = {\n        reset: function (s, e, sStep, sCount) {\n          current = s;\n          end = e;\n          modBy = sStep;\n          modDataCount = sCount;\n          winCount = Math.ceil(modDataCount / modBy);\n          it.next = modBy > 1 && modDataCount > 0 ? modNext : sequentialNext;\n        }\n      };\n      return it;\n      function sequentialNext() {\n        return current < end ? current++ : null;\n      }\n      function modNext() {\n        var dataIndex = current % winCount * modBy + Math.ceil(current / winCount);\n        var result = current >= end ? null : dataIndex < modDataCount ? dataIndex\n        // If modDataCount is smaller than data.count() (consider `appendData` case),\n        // Use normal linear rendering mode.\n        : current;\n        current++;\n        return result;\n      }\n    }();\n    // -----------------------------------------------------------------------------\n    // For stream debug (Should be commented out after used!)\n    // @usage: printTask(this, 'begin');\n    // @usage: printTask(this, null, {someExtraProp});\n    // @usage: Use `__idxInPipeline` as conditional breakpiont.\n    //\n    // window.printTask = function (task: any, prefix: string, extra: { [key: string]: unknown }): void {\n    //     window.ecTaskUID == null && (window.ecTaskUID = 0);\n    //     task.uidDebug == null && (task.uidDebug = `task_${window.ecTaskUID++}`);\n    //     task.agent && task.agent.uidDebug == null && (task.agent.uidDebug = `task_${window.ecTaskUID++}`);\n    //     let props = [];\n    //     if (task.__pipeline) {\n    //         let val = `${task.__idxInPipeline}/${task.__pipeline.tail.__idxInPipeline} ${task.agent ? '(stub)' : ''}`;\n    //         props.push({text: '__idxInPipeline/total', value: val});\n    //     } else {\n    //         let stubCount = 0;\n    //         task.agentStubMap.each(() => stubCount++);\n    //         props.push({text: 'idx', value: `overall (stubs: ${stubCount})`});\n    //     }\n    //     props.push({text: 'uid', value: task.uidDebug});\n    //     if (task.__pipeline) {\n    //         props.push({text: 'pipelineId', value: task.__pipeline.id});\n    //         task.agent && props.push(\n    //             {text: 'stubFor', value: task.agent.uidDebug}\n    //         );\n    //     }\n    //     props.push(\n    //         {text: 'dirty', value: task._dirty},\n    //         {text: 'dueIndex', value: task._dueIndex},\n    //         {text: 'dueEnd', value: task._dueEnd},\n    //         {text: 'outputDueEnd', value: task._outputDueEnd}\n    //     );\n    //     if (extra) {\n    //         Object.keys(extra).forEach(key => {\n    //             props.push({text: key, value: extra[key]});\n    //         });\n    //     }\n    //     let args = ['color: blue'];\n    //     let msg = `%c[${prefix || 'T'}] %c` + props.map(item => (\n    //         args.push('color: green', 'color: red'),\n    //         `${item.text}: %c${item.value}`\n    //     )).join('%c, ');\n    //     console.log.apply(console, [msg].concat(args));\n    //     // console.log(this);\n    // };\n    // window.printPipeline = function (task: any, prefix: string) {\n    //     const pipeline = task.__pipeline;\n    //     let currTask = pipeline.head;\n    //     while (currTask) {\n    //         window.printTask(currTask, prefix);\n    //         currTask = currTask._downstream;\n    //     }\n    // };\n    // window.showChain = function (chainHeadTask) {\n    //     var chain = [];\n    //     var task = chainHeadTask;\n    //     while (task) {\n    //         chain.push({\n    //             task: task,\n    //             up: task._upstream,\n    //             down: task._downstream,\n    //             idxInPipeline: task.__idxInPipeline\n    //         });\n    //         task = task._downstream;\n    //     }\n    //     return chain;\n    // };\n    // window.findTaskInChain = function (task, chainHeadTask) {\n    //     let chain = window.showChain(chainHeadTask);\n    //     let result = [];\n    //     for (let i = 0; i < chain.length; i++) {\n    //         let chainItem = chain[i];\n    //         if (chainItem.task === task) {\n    //             result.push(i);\n    //         }\n    //     }\n    //     return result;\n    // };\n    // window.printChainAEachInChainB = function (chainHeadTaskA, chainHeadTaskB) {\n    //     let chainA = window.showChain(chainHeadTaskA);\n    //     for (let i = 0; i < chainA.length; i++) {\n    //         console.log('chainAIdx:', i, 'inChainB:', window.findTaskInChain(chainA[i].task, chainHeadTaskB));\n    //     }\n    // };\n\n    /**\r\n     * Convert raw the value in to inner value in List.\r\n     *\r\n     * [Performance sensitive]\r\n     *\r\n     * [Caution]: this is the key logic of user value parser.\r\n     * For backward compatibility, do not modify it until you have to!\r\n     */\n    function parseDataValue(value,\n    // For high performance, do not omit the second param.\n    opt) {\n      // Performance sensitive.\n      var dimType = opt && opt.type;\n      if (dimType === 'ordinal') {\n        // If given value is a category string\n        return value;\n      }\n      if (dimType === 'time'\n      // spead up when using timestamp\n      && !isNumber(value) && value != null && value !== '-') {\n        value = +parseDate(value);\n      }\n      // dimType defaults 'number'.\n      // If dimType is not ordinal and value is null or undefined or NaN or '-',\n      // parse to NaN.\n      // number-like string (like ' 123 ') can be converted to a number.\n      // where null/undefined or other string will be converted to NaN.\n      return value == null || value === '' ? NaN\n      // If string (like '-'), using '+' parse to NaN\n      // If object, also parse to NaN\n      : Number(value);\n    }\n    var valueParserMap = createHashMap({\n      'number': function (val) {\n        // Do not use `numericToNumber` here. We have `numericToNumber` by default.\n        // Here the number parser can have loose rule:\n        // enable to cut suffix: \"120px\" => 120, \"14%\" => 14.\n        return parseFloat(val);\n      },\n      'time': function (val) {\n        // return timestamp.\n        return +parseDate(val);\n      },\n      'trim': function (val) {\n        return isString(val) ? trim(val) : val;\n      }\n    });\n    function getRawValueParser(type) {\n      return valueParserMap.get(type);\n    }\n    var ORDER_COMPARISON_OP_MAP = {\n      lt: function (lval, rval) {\n        return lval < rval;\n      },\n      lte: function (lval, rval) {\n        return lval <= rval;\n      },\n      gt: function (lval, rval) {\n        return lval > rval;\n      },\n      gte: function (lval, rval) {\n        return lval >= rval;\n      }\n    };\n    var FilterOrderComparator = /** @class */function () {\n      function FilterOrderComparator(op, rval) {\n        if (!isNumber(rval)) {\n          var errMsg = '';\n          if (\"development\" !== 'production') {\n            errMsg = 'rvalue of \"<\", \">\", \"<=\", \">=\" can only be number in filter.';\n          }\n          throwError(errMsg);\n        }\n        this._opFn = ORDER_COMPARISON_OP_MAP[op];\n        this._rvalFloat = numericToNumber(rval);\n      }\n      // Performance sensitive.\n      FilterOrderComparator.prototype.evaluate = function (lval) {\n        // Most cases is 'number', and typeof maybe 10 times faseter than parseFloat.\n        return isNumber(lval) ? this._opFn(lval, this._rvalFloat) : this._opFn(numericToNumber(lval), this._rvalFloat);\n      };\n      return FilterOrderComparator;\n    }();\n    var SortOrderComparator = /** @class */function () {\n      /**\r\n       * @param order by default: 'asc'\r\n       * @param incomparable by default: Always on the tail.\r\n       *        That is, if 'asc' => 'max', if 'desc' => 'min'\r\n       *        See the definition of \"incomparable\" in [SORT_COMPARISON_RULE].\r\n       */\n      function SortOrderComparator(order, incomparable) {\n        var isDesc = order === 'desc';\n        this._resultLT = isDesc ? 1 : -1;\n        if (incomparable == null) {\n          incomparable = isDesc ? 'min' : 'max';\n        }\n        this._incomparable = incomparable === 'min' ? -Infinity : Infinity;\n      }\n      // See [SORT_COMPARISON_RULE].\n      // Performance sensitive.\n      SortOrderComparator.prototype.evaluate = function (lval, rval) {\n        // Most cases is 'number', and typeof maybe 10 times faseter than parseFloat.\n        var lvalFloat = isNumber(lval) ? lval : numericToNumber(lval);\n        var rvalFloat = isNumber(rval) ? rval : numericToNumber(rval);\n        var lvalNotNumeric = isNaN(lvalFloat);\n        var rvalNotNumeric = isNaN(rvalFloat);\n        if (lvalNotNumeric) {\n          lvalFloat = this._incomparable;\n        }\n        if (rvalNotNumeric) {\n          rvalFloat = this._incomparable;\n        }\n        if (lvalNotNumeric && rvalNotNumeric) {\n          var lvalIsStr = isString(lval);\n          var rvalIsStr = isString(rval);\n          if (lvalIsStr) {\n            lvalFloat = rvalIsStr ? lval : 0;\n          }\n          if (rvalIsStr) {\n            rvalFloat = lvalIsStr ? rval : 0;\n          }\n        }\n        return lvalFloat < rvalFloat ? this._resultLT : lvalFloat > rvalFloat ? -this._resultLT : 0;\n      };\n      return SortOrderComparator;\n    }();\n    var FilterEqualityComparator = /** @class */function () {\n      function FilterEqualityComparator(isEq, rval) {\n        this._rval = rval;\n        this._isEQ = isEq;\n        this._rvalTypeof = typeof rval;\n        this._rvalFloat = numericToNumber(rval);\n      }\n      // Performance sensitive.\n      FilterEqualityComparator.prototype.evaluate = function (lval) {\n        var eqResult = lval === this._rval;\n        if (!eqResult) {\n          var lvalTypeof = typeof lval;\n          if (lvalTypeof !== this._rvalTypeof && (lvalTypeof === 'number' || this._rvalTypeof === 'number')) {\n            eqResult = numericToNumber(lval) === this._rvalFloat;\n          }\n        }\n        return this._isEQ ? eqResult : !eqResult;\n      };\n      return FilterEqualityComparator;\n    }();\n    /**\r\n     * [FILTER_COMPARISON_RULE]\r\n     * `lt`|`lte`|`gt`|`gte`:\r\n     * + rval must be a number. And lval will be converted to number (`numericToNumber`) to compare.\r\n     * `eq`:\r\n     * + If same type, compare with `===`.\r\n     * + If there is one number, convert to number (`numericToNumber`) to compare.\r\n     * + Else return `false`.\r\n     * `ne`:\r\n     * + Not `eq`.\r\n     *\r\n     *\r\n     * [SORT_COMPARISON_RULE]\r\n     * All the values are grouped into three categories:\r\n     * + \"numeric\" (number and numeric string)\r\n     * + \"non-numeric-string\" (string that excluding numeric string)\r\n     * + \"others\"\r\n     * \"numeric\" vs \"numeric\": values are ordered by number order.\r\n     * \"non-numeric-string\" vs \"non-numeric-string\": values are ordered by ES spec (#sec-abstract-relational-comparison).\r\n     * \"others\" vs \"others\": do not change order (always return 0).\r\n     * \"numeric\" vs \"non-numeric-string\": \"non-numeric-string\" is treated as \"incomparable\".\r\n     * \"number\" vs \"others\": \"others\" is treated as \"incomparable\".\r\n     * \"non-numeric-string\" vs \"others\": \"others\" is treated as \"incomparable\".\r\n     * \"incomparable\" will be seen as -Infinity or Infinity (depends on the settings).\r\n     * MEMO:\r\n     *   Non-numeric string sort makes sense when we need to put the items with the same tag together.\r\n     *   But if we support string sort, we still need to avoid the misleading like `'2' > '12'`,\r\n     *   So we treat \"numeric-string\" sorted by number order rather than string comparison.\r\n     *\r\n     *\r\n     * [CHECK_LIST_OF_THE_RULE_DESIGN]\r\n     * + Do not support string comparison until required. And also need to\r\n     *   avoid the misleading of \"2\" > \"12\".\r\n     * + Should avoid the misleading case:\r\n     *   `\" 22 \" gte \"22\"` is `true` but `\" 22 \" eq \"22\"` is `false`.\r\n     * + JS bad case should be avoided: null <= 0, [] <= 0, ' ' <= 0, ...\r\n     * + Only \"numeric\" can be converted to comparable number, otherwise converted to NaN.\r\n     *   See `util/number.ts#numericToNumber`.\r\n     *\r\n     * @return If `op` is not `RelationalOperator`, return null;\r\n     */\n    function createFilterComparator(op, rval) {\n      return op === 'eq' || op === 'ne' ? new FilterEqualityComparator(op === 'eq', rval) : hasOwn(ORDER_COMPARISON_OP_MAP, op) ? new FilterOrderComparator(op, rval) : null;\n    }\n\n    /**\r\n     * TODO: disable writable.\r\n     * This structure will be exposed to users.\r\n     */\n    var ExternalSource = /** @class */function () {\n      function ExternalSource() {}\n      ExternalSource.prototype.getRawData = function () {\n        // Only built-in transform available.\n        throw new Error('not supported');\n      };\n      ExternalSource.prototype.getRawDataItem = function (dataIndex) {\n        // Only built-in transform available.\n        throw new Error('not supported');\n      };\n      ExternalSource.prototype.cloneRawData = function () {\n        return;\n      };\n      /**\r\n       * @return If dimension not found, return null/undefined.\r\n       */\n      ExternalSource.prototype.getDimensionInfo = function (dim) {\n        return;\n      };\n      /**\r\n       * dimensions defined if and only if either:\r\n       * (a) dataset.dimensions are declared.\r\n       * (b) dataset data include dimensions definitions in data (detected or via specified `sourceHeader`).\r\n       * If dimensions are defined, `dimensionInfoAll` is corresponding to\r\n       * the defined dimensions.\r\n       * Otherwise, `dimensionInfoAll` is determined by data columns.\r\n       * @return Always return an array (even empty array).\r\n       */\n      ExternalSource.prototype.cloneAllDimensionInfo = function () {\n        return;\n      };\n      ExternalSource.prototype.count = function () {\n        return;\n      };\n      /**\r\n       * Only support by dimension index.\r\n       * No need to support by dimension name in transform function,\r\n       * because transform function is not case-specific, no need to use name literally.\r\n       */\n      ExternalSource.prototype.retrieveValue = function (dataIndex, dimIndex) {\n        return;\n      };\n      ExternalSource.prototype.retrieveValueFromItem = function (dataItem, dimIndex) {\n        return;\n      };\n      ExternalSource.prototype.convertValue = function (rawVal, dimInfo) {\n        return parseDataValue(rawVal, dimInfo);\n      };\n      return ExternalSource;\n    }();\n    function createExternalSource(internalSource, externalTransform) {\n      var extSource = new ExternalSource();\n      var data = internalSource.data;\n      var sourceFormat = extSource.sourceFormat = internalSource.sourceFormat;\n      var sourceHeaderCount = internalSource.startIndex;\n      var errMsg = '';\n      if (internalSource.seriesLayoutBy !== SERIES_LAYOUT_BY_COLUMN) {\n        // For the logic simplicity in transformer, only 'culumn' is\n        // supported in data transform. Otherwise, the `dimensionsDefine`\n        // might be detected by 'row', which probably confuses users.\n        if (\"development\" !== 'production') {\n          errMsg = '`seriesLayoutBy` of upstream dataset can only be \"column\" in data transform.';\n        }\n        throwError(errMsg);\n      }\n      // [MEMO]\n      // Create a new dimensions structure for exposing.\n      // Do not expose all dimension info to users directly.\n      // Because the dimension is probably auto detected from data and not might reliable.\n      // Should not lead the transformers to think that is reliable and return it.\n      // See [DIMENSION_INHERIT_RULE] in `sourceManager.ts`.\n      var dimensions = [];\n      var dimsByName = {};\n      var dimsDef = internalSource.dimensionsDefine;\n      if (dimsDef) {\n        each(dimsDef, function (dimDef, idx) {\n          var name = dimDef.name;\n          var dimDefExt = {\n            index: idx,\n            name: name,\n            displayName: dimDef.displayName\n          };\n          dimensions.push(dimDefExt);\n          // Users probably do not specify dimension name. For simplicity, data transform\n          // does not generate dimension name.\n          if (name != null) {\n            // Dimension name should not be duplicated.\n            // For simplicity, data transform forbids name duplication, do not generate\n            // new name like module `completeDimensions.ts` did, but just tell users.\n            var errMsg_1 = '';\n            if (hasOwn(dimsByName, name)) {\n              if (\"development\" !== 'production') {\n                errMsg_1 = 'dimension name \"' + name + '\" duplicated.';\n              }\n              throwError(errMsg_1);\n            }\n            dimsByName[name] = dimDefExt;\n          }\n        });\n      }\n      // If dimension definitions are not defined and can not be detected.\n      // e.g., pure data `[[11, 22], ...]`.\n      else {\n        for (var i = 0; i < internalSource.dimensionsDetectedCount || 0; i++) {\n          // Do not generete name or anything others. The consequence process in\n          // `transform` or `series` probably have there own name generation strategry.\n          dimensions.push({\n            index: i\n          });\n        }\n      }\n      // Implement public methods:\n      var rawItemGetter = getRawSourceItemGetter(sourceFormat, SERIES_LAYOUT_BY_COLUMN);\n      if (externalTransform.__isBuiltIn) {\n        extSource.getRawDataItem = function (dataIndex) {\n          return rawItemGetter(data, sourceHeaderCount, dimensions, dataIndex);\n        };\n        extSource.getRawData = bind(getRawData, null, internalSource);\n      }\n      extSource.cloneRawData = bind(cloneRawData, null, internalSource);\n      var rawCounter = getRawSourceDataCounter(sourceFormat, SERIES_LAYOUT_BY_COLUMN);\n      extSource.count = bind(rawCounter, null, data, sourceHeaderCount, dimensions);\n      var rawValueGetter = getRawSourceValueGetter(sourceFormat);\n      extSource.retrieveValue = function (dataIndex, dimIndex) {\n        var rawItem = rawItemGetter(data, sourceHeaderCount, dimensions, dataIndex);\n        return retrieveValueFromItem(rawItem, dimIndex);\n      };\n      var retrieveValueFromItem = extSource.retrieveValueFromItem = function (dataItem, dimIndex) {\n        if (dataItem == null) {\n          return;\n        }\n        var dimDef = dimensions[dimIndex];\n        // When `dimIndex` is `null`, `rawValueGetter` return the whole item.\n        if (dimDef) {\n          return rawValueGetter(dataItem, dimIndex, dimDef.name);\n        }\n      };\n      extSource.getDimensionInfo = bind(getDimensionInfo, null, dimensions, dimsByName);\n      extSource.cloneAllDimensionInfo = bind(cloneAllDimensionInfo, null, dimensions);\n      return extSource;\n    }\n    function getRawData(upstream) {\n      var sourceFormat = upstream.sourceFormat;\n      if (!isSupportedSourceFormat(sourceFormat)) {\n        var errMsg = '';\n        if (\"development\" !== 'production') {\n          errMsg = '`getRawData` is not supported in source format ' + sourceFormat;\n        }\n        throwError(errMsg);\n      }\n      return upstream.data;\n    }\n    function cloneRawData(upstream) {\n      var sourceFormat = upstream.sourceFormat;\n      var data = upstream.data;\n      if (!isSupportedSourceFormat(sourceFormat)) {\n        var errMsg = '';\n        if (\"development\" !== 'production') {\n          errMsg = '`cloneRawData` is not supported in source format ' + sourceFormat;\n        }\n        throwError(errMsg);\n      }\n      if (sourceFormat === SOURCE_FORMAT_ARRAY_ROWS) {\n        var result = [];\n        for (var i = 0, len = data.length; i < len; i++) {\n          // Not strictly clone for performance\n          result.push(data[i].slice());\n        }\n        return result;\n      } else if (sourceFormat === SOURCE_FORMAT_OBJECT_ROWS) {\n        var result = [];\n        for (var i = 0, len = data.length; i < len; i++) {\n          // Not strictly clone for performance\n          result.push(extend({}, data[i]));\n        }\n        return result;\n      }\n    }\n    function getDimensionInfo(dimensions, dimsByName, dim) {\n      if (dim == null) {\n        return;\n      }\n      // Keep the same logic as `List::getDimension` did.\n      if (isNumber(dim)\n      // If being a number-like string but not being defined a dimension name.\n      || !isNaN(dim) && !hasOwn(dimsByName, dim)) {\n        return dimensions[dim];\n      } else if (hasOwn(dimsByName, dim)) {\n        return dimsByName[dim];\n      }\n    }\n    function cloneAllDimensionInfo(dimensions) {\n      return clone(dimensions);\n    }\n    var externalTransformMap = createHashMap();\n    function registerExternalTransform(externalTransform) {\n      externalTransform = clone(externalTransform);\n      var type = externalTransform.type;\n      var errMsg = '';\n      if (!type) {\n        if (\"development\" !== 'production') {\n          errMsg = 'Must have a `type` when `registerTransform`.';\n        }\n        throwError(errMsg);\n      }\n      var typeParsed = type.split(':');\n      if (typeParsed.length !== 2) {\n        if (\"development\" !== 'production') {\n          errMsg = 'Name must include namespace like \"ns:regression\".';\n        }\n        throwError(errMsg);\n      }\n      // Namespace 'echarts:xxx' is official namespace, where the transforms should\n      // be called directly via 'xxx' rather than 'echarts:xxx'.\n      var isBuiltIn = false;\n      if (typeParsed[0] === 'echarts') {\n        type = typeParsed[1];\n        isBuiltIn = true;\n      }\n      externalTransform.__isBuiltIn = isBuiltIn;\n      externalTransformMap.set(type, externalTransform);\n    }\n    function applyDataTransform(rawTransOption, sourceList, infoForPrint) {\n      var pipedTransOption = normalizeToArray(rawTransOption);\n      var pipeLen = pipedTransOption.length;\n      var errMsg = '';\n      if (!pipeLen) {\n        if (\"development\" !== 'production') {\n          errMsg = 'If `transform` declared, it should at least contain one transform.';\n        }\n        throwError(errMsg);\n      }\n      for (var i = 0, len = pipeLen; i < len; i++) {\n        var transOption = pipedTransOption[i];\n        sourceList = applySingleDataTransform(transOption, sourceList, infoForPrint, pipeLen === 1 ? null : i);\n        // piped transform only support single input, except the fist one.\n        // piped transform only support single output, except the last one.\n        if (i !== len - 1) {\n          sourceList.length = Math.max(sourceList.length, 1);\n        }\n      }\n      return sourceList;\n    }\n    function applySingleDataTransform(transOption, upSourceList, infoForPrint,\n    // If `pipeIndex` is null/undefined, no piped transform.\n    pipeIndex) {\n      var errMsg = '';\n      if (!upSourceList.length) {\n        if (\"development\" !== 'production') {\n          errMsg = 'Must have at least one upstream dataset.';\n        }\n        throwError(errMsg);\n      }\n      if (!isObject(transOption)) {\n        if (\"development\" !== 'production') {\n          errMsg = 'transform declaration must be an object rather than ' + typeof transOption + '.';\n        }\n        throwError(errMsg);\n      }\n      var transType = transOption.type;\n      var externalTransform = externalTransformMap.get(transType);\n      if (!externalTransform) {\n        if (\"development\" !== 'production') {\n          errMsg = 'Can not find transform on type \"' + transType + '\".';\n        }\n        throwError(errMsg);\n      }\n      // Prepare source\n      var extUpSourceList = map(upSourceList, function (upSource) {\n        return createExternalSource(upSource, externalTransform);\n      });\n      var resultList = normalizeToArray(externalTransform.transform({\n        upstream: extUpSourceList[0],\n        upstreamList: extUpSourceList,\n        config: clone(transOption.config)\n      }));\n      if (\"development\" !== 'production') {\n        if (transOption.print) {\n          var printStrArr = map(resultList, function (extSource) {\n            var pipeIndexStr = pipeIndex != null ? ' === pipe index: ' + pipeIndex : '';\n            return ['=== dataset index: ' + infoForPrint.datasetIndex + pipeIndexStr + ' ===', '- transform result data:', makePrintable(extSource.data), '- transform result dimensions:', makePrintable(extSource.dimensions)].join('\\n');\n          }).join('\\n');\n          log(printStrArr);\n        }\n      }\n      return map(resultList, function (result, resultIndex) {\n        var errMsg = '';\n        if (!isObject(result)) {\n          if (\"development\" !== 'production') {\n            errMsg = 'A transform should not return some empty results.';\n          }\n          throwError(errMsg);\n        }\n        if (!result.data) {\n          if (\"development\" !== 'production') {\n            errMsg = 'Transform result data should be not be null or undefined';\n          }\n          throwError(errMsg);\n        }\n        var sourceFormat = detectSourceFormat(result.data);\n        if (!isSupportedSourceFormat(sourceFormat)) {\n          if (\"development\" !== 'production') {\n            errMsg = 'Transform result data should be array rows or object rows.';\n          }\n          throwError(errMsg);\n        }\n        var resultMetaRawOption;\n        var firstUpSource = upSourceList[0];\n        /**\r\n         * Intuitively, the end users known the content of the original `dataset.source`,\r\n         * calucating the transform result in mind.\r\n         * Suppose the original `dataset.source` is:\r\n         * ```js\r\n         * [\r\n         *     ['product', '2012', '2013', '2014', '2015'],\r\n         *     ['AAA', 41.1, 30.4, 65.1, 53.3],\r\n         *     ['BBB', 86.5, 92.1, 85.7, 83.1],\r\n         *     ['CCC', 24.1, 67.2, 79.5, 86.4]\r\n         * ]\r\n         * ```\r\n         * The dimension info have to be detected from the source data.\r\n         * Some of the transformers (like filter, sort) will follow the dimension info\r\n         * of upstream, while others use new dimensions (like aggregate).\r\n         * Transformer can output a field `dimensions` to define the its own output dimensions.\r\n         * We also allow transformers to ignore the output `dimensions` field, and\r\n         * inherit the upstream dimensions definition. It can reduce the burden of handling\r\n         * dimensions in transformers.\r\n         *\r\n         * See also [DIMENSION_INHERIT_RULE] in `sourceManager.ts`.\r\n         */\n        if (firstUpSource && resultIndex === 0\n        // If transformer returns `dimensions`, it means that the transformer has different\n        // dimensions definitions. We do not inherit anything from upstream.\n        && !result.dimensions) {\n          var startIndex = firstUpSource.startIndex;\n          // We copy the header of upstream to the result, because:\n          // (1) The returned data always does not contain header line and can not be used\n          // as dimension-detection. In this case we can not use \"detected dimensions\" of\n          // upstream directly, because it might be detected based on different `seriesLayoutBy`.\n          // (2) We should support that the series read the upstream source in `seriesLayoutBy: 'row'`.\n          // So the original detected header should be add to the result, otherwise they can not be read.\n          if (startIndex) {\n            result.data = firstUpSource.data.slice(0, startIndex).concat(result.data);\n          }\n          resultMetaRawOption = {\n            seriesLayoutBy: SERIES_LAYOUT_BY_COLUMN,\n            sourceHeader: startIndex,\n            dimensions: firstUpSource.metaRawOption.dimensions\n          };\n        } else {\n          resultMetaRawOption = {\n            seriesLayoutBy: SERIES_LAYOUT_BY_COLUMN,\n            sourceHeader: 0,\n            dimensions: result.dimensions\n          };\n        }\n        return createSource(result.data, resultMetaRawOption, null);\n      });\n    }\n    function isSupportedSourceFormat(sourceFormat) {\n      return sourceFormat === SOURCE_FORMAT_ARRAY_ROWS || sourceFormat === SOURCE_FORMAT_OBJECT_ROWS;\n    }\n\n    var UNDEFINED = 'undefined';\n    /* global Float64Array, Int32Array, Uint32Array, Uint16Array */\n    // Caution: MUST not use `new CtorUint32Array(arr, 0, len)`, because the Ctor of array is\n    // different from the Ctor of typed array.\n    var CtorUint32Array = typeof Uint32Array === UNDEFINED ? Array : Uint32Array;\n    var CtorUint16Array = typeof Uint16Array === UNDEFINED ? Array : Uint16Array;\n    var CtorInt32Array = typeof Int32Array === UNDEFINED ? Array : Int32Array;\n    var CtorFloat64Array = typeof Float64Array === UNDEFINED ? Array : Float64Array;\n    /**\r\n     * Multi dimensional data store\r\n     */\n    var dataCtors = {\n      'float': CtorFloat64Array,\n      'int': CtorInt32Array,\n      // Ordinal data type can be string or int\n      'ordinal': Array,\n      'number': Array,\n      'time': CtorFloat64Array\n    };\n    var defaultDimValueGetters;\n    function getIndicesCtor(rawCount) {\n      // The possible max value in this._indicies is always this._rawCount despite of filtering.\n      return rawCount > 65535 ? CtorUint32Array : CtorUint16Array;\n    }\n    function getInitialExtent() {\n      return [Infinity, -Infinity];\n    }\n    function cloneChunk(originalChunk) {\n      var Ctor = originalChunk.constructor;\n      // Only shallow clone is enough when Array.\n      return Ctor === Array ? originalChunk.slice() : new Ctor(originalChunk);\n    }\n    function prepareStore(store, dimIdx, dimType, end, append) {\n      var DataCtor = dataCtors[dimType || 'float'];\n      if (append) {\n        var oldStore = store[dimIdx];\n        var oldLen = oldStore && oldStore.length;\n        if (!(oldLen === end)) {\n          var newStore = new DataCtor(end);\n          // The cost of the copy is probably inconsiderable\n          // within the initial chunkSize.\n          for (var j = 0; j < oldLen; j++) {\n            newStore[j] = oldStore[j];\n          }\n          store[dimIdx] = newStore;\n        }\n      } else {\n        store[dimIdx] = new DataCtor(end);\n      }\n    }\n    /**\r\n     * Basically, DataStore API keep immutable.\r\n     */\n    var DataStore = /** @class */function () {\n      function DataStore() {\n        this._chunks = [];\n        // It will not be calculated until needed.\n        this._rawExtent = [];\n        this._extent = [];\n        this._count = 0;\n        this._rawCount = 0;\n        this._calcDimNameToIdx = createHashMap();\n      }\n      /**\r\n       * Initialize from data\r\n       */\n      DataStore.prototype.initData = function (provider, inputDimensions, dimValueGetter) {\n        if (\"development\" !== 'production') {\n          assert(isFunction(provider.getItem) && isFunction(provider.count), 'Invalid data provider.');\n        }\n        this._provider = provider;\n        // Clear\n        this._chunks = [];\n        this._indices = null;\n        this.getRawIndex = this._getRawIdxIdentity;\n        var source = provider.getSource();\n        var defaultGetter = this.defaultDimValueGetter = defaultDimValueGetters[source.sourceFormat];\n        // Default dim value getter\n        this._dimValueGetter = dimValueGetter || defaultGetter;\n        // Reset raw extent.\n        this._rawExtent = [];\n        var willRetrieveDataByName = shouldRetrieveDataByName(source);\n        this._dimensions = map(inputDimensions, function (dim) {\n          if (\"development\" !== 'production') {\n            if (willRetrieveDataByName) {\n              assert(dim.property != null);\n            }\n          }\n          return {\n            // Only pick these two props. Not leak other properties like orderMeta.\n            type: dim.type,\n            property: dim.property\n          };\n        });\n        this._initDataFromProvider(0, provider.count());\n      };\n      DataStore.prototype.getProvider = function () {\n        return this._provider;\n      };\n      /**\r\n       * Caution: even when a `source` instance owned by a series, the created data store\r\n       * may still be shared by different sereis (the source hash does not use all `source`\r\n       * props, see `sourceManager`). In this case, the `source` props that are not used in\r\n       * hash (like `source.dimensionDefine`) probably only belongs to a certain series and\r\n       * thus should not be fetch here.\r\n       */\n      DataStore.prototype.getSource = function () {\n        return this._provider.getSource();\n      };\n      /**\r\n       * @caution Only used in dataStack.\r\n       */\n      DataStore.prototype.ensureCalculationDimension = function (dimName, type) {\n        var calcDimNameToIdx = this._calcDimNameToIdx;\n        var dimensions = this._dimensions;\n        var calcDimIdx = calcDimNameToIdx.get(dimName);\n        if (calcDimIdx != null) {\n          if (dimensions[calcDimIdx].type === type) {\n            return calcDimIdx;\n          }\n        } else {\n          calcDimIdx = dimensions.length;\n        }\n        dimensions[calcDimIdx] = {\n          type: type\n        };\n        calcDimNameToIdx.set(dimName, calcDimIdx);\n        this._chunks[calcDimIdx] = new dataCtors[type || 'float'](this._rawCount);\n        this._rawExtent[calcDimIdx] = getInitialExtent();\n        return calcDimIdx;\n      };\n      DataStore.prototype.collectOrdinalMeta = function (dimIdx, ordinalMeta) {\n        var chunk = this._chunks[dimIdx];\n        var dim = this._dimensions[dimIdx];\n        var rawExtents = this._rawExtent;\n        var offset = dim.ordinalOffset || 0;\n        var len = chunk.length;\n        if (offset === 0) {\n          // We need to reset the rawExtent if collect is from start.\n          // Because this dimension may be guessed as number and calcuating a wrong extent.\n          rawExtents[dimIdx] = getInitialExtent();\n        }\n        var dimRawExtent = rawExtents[dimIdx];\n        // Parse from previous data offset. len may be changed after appendData\n        for (var i = offset; i < len; i++) {\n          var val = chunk[i] = ordinalMeta.parseAndCollect(chunk[i]);\n          if (!isNaN(val)) {\n            dimRawExtent[0] = Math.min(val, dimRawExtent[0]);\n            dimRawExtent[1] = Math.max(val, dimRawExtent[1]);\n          }\n        }\n        dim.ordinalMeta = ordinalMeta;\n        dim.ordinalOffset = len;\n        dim.type = 'ordinal'; // Force to be ordinal\n      };\n      DataStore.prototype.getOrdinalMeta = function (dimIdx) {\n        var dimInfo = this._dimensions[dimIdx];\n        var ordinalMeta = dimInfo.ordinalMeta;\n        return ordinalMeta;\n      };\n      DataStore.prototype.getDimensionProperty = function (dimIndex) {\n        var item = this._dimensions[dimIndex];\n        return item && item.property;\n      };\n      /**\r\n       * Caution: Can be only called on raw data (before `this._indices` created).\r\n       */\n      DataStore.prototype.appendData = function (data) {\n        if (\"development\" !== 'production') {\n          assert(!this._indices, 'appendData can only be called on raw data.');\n        }\n        var provider = this._provider;\n        var start = this.count();\n        provider.appendData(data);\n        var end = provider.count();\n        if (!provider.persistent) {\n          end += start;\n        }\n        if (start < end) {\n          this._initDataFromProvider(start, end, true);\n        }\n        return [start, end];\n      };\n      DataStore.prototype.appendValues = function (values, minFillLen) {\n        var chunks = this._chunks;\n        var dimensions = this._dimensions;\n        var dimLen = dimensions.length;\n        var rawExtent = this._rawExtent;\n        var start = this.count();\n        var end = start + Math.max(values.length, minFillLen || 0);\n        for (var i = 0; i < dimLen; i++) {\n          var dim = dimensions[i];\n          prepareStore(chunks, i, dim.type, end, true);\n        }\n        var emptyDataItem = [];\n        for (var idx = start; idx < end; idx++) {\n          var sourceIdx = idx - start;\n          // Store the data by dimensions\n          for (var dimIdx = 0; dimIdx < dimLen; dimIdx++) {\n            var dim = dimensions[dimIdx];\n            var val = defaultDimValueGetters.arrayRows.call(this, values[sourceIdx] || emptyDataItem, dim.property, sourceIdx, dimIdx);\n            chunks[dimIdx][idx] = val;\n            var dimRawExtent = rawExtent[dimIdx];\n            val < dimRawExtent[0] && (dimRawExtent[0] = val);\n            val > dimRawExtent[1] && (dimRawExtent[1] = val);\n          }\n        }\n        this._rawCount = this._count = end;\n        return {\n          start: start,\n          end: end\n        };\n      };\n      DataStore.prototype._initDataFromProvider = function (start, end, append) {\n        var provider = this._provider;\n        var chunks = this._chunks;\n        var dimensions = this._dimensions;\n        var dimLen = dimensions.length;\n        var rawExtent = this._rawExtent;\n        var dimNames = map(dimensions, function (dim) {\n          return dim.property;\n        });\n        for (var i = 0; i < dimLen; i++) {\n          var dim = dimensions[i];\n          if (!rawExtent[i]) {\n            rawExtent[i] = getInitialExtent();\n          }\n          prepareStore(chunks, i, dim.type, end, append);\n        }\n        if (provider.fillStorage) {\n          provider.fillStorage(start, end, chunks, rawExtent);\n        } else {\n          var dataItem = [];\n          for (var idx = start; idx < end; idx++) {\n            // NOTICE: Try not to write things into dataItem\n            dataItem = provider.getItem(idx, dataItem);\n            // Each data item is value\n            // [1, 2]\n            // 2\n            // Bar chart, line chart which uses category axis\n            // only gives the 'y' value. 'x' value is the indices of category\n            // Use a tempValue to normalize the value to be a (x, y) value\n            // Store the data by dimensions\n            for (var dimIdx = 0; dimIdx < dimLen; dimIdx++) {\n              var dimStorage = chunks[dimIdx];\n              // PENDING NULL is empty or zero\n              var val = this._dimValueGetter(dataItem, dimNames[dimIdx], idx, dimIdx);\n              dimStorage[idx] = val;\n              var dimRawExtent = rawExtent[dimIdx];\n              val < dimRawExtent[0] && (dimRawExtent[0] = val);\n              val > dimRawExtent[1] && (dimRawExtent[1] = val);\n            }\n          }\n        }\n        if (!provider.persistent && provider.clean) {\n          // Clean unused data if data source is typed array.\n          provider.clean();\n        }\n        this._rawCount = this._count = end;\n        // Reset data extent\n        this._extent = [];\n      };\n      DataStore.prototype.count = function () {\n        return this._count;\n      };\n      /**\r\n       * Get value. Return NaN if idx is out of range.\r\n       */\n      DataStore.prototype.get = function (dim, idx) {\n        if (!(idx >= 0 && idx < this._count)) {\n          return NaN;\n        }\n        var dimStore = this._chunks[dim];\n        return dimStore ? dimStore[this.getRawIndex(idx)] : NaN;\n      };\n      DataStore.prototype.getValues = function (dimensions, idx) {\n        var values = [];\n        var dimArr = [];\n        if (idx == null) {\n          idx = dimensions;\n          // TODO get all from store?\n          dimensions = [];\n          // All dimensions\n          for (var i = 0; i < this._dimensions.length; i++) {\n            dimArr.push(i);\n          }\n        } else {\n          dimArr = dimensions;\n        }\n        for (var i = 0, len = dimArr.length; i < len; i++) {\n          values.push(this.get(dimArr[i], idx));\n        }\n        return values;\n      };\n      /**\r\n       * @param dim concrete dim\r\n       */\n      DataStore.prototype.getByRawIndex = function (dim, rawIdx) {\n        if (!(rawIdx >= 0 && rawIdx < this._rawCount)) {\n          return NaN;\n        }\n        var dimStore = this._chunks[dim];\n        return dimStore ? dimStore[rawIdx] : NaN;\n      };\n      /**\r\n       * Get sum of data in one dimension\r\n       */\n      DataStore.prototype.getSum = function (dim) {\n        var dimData = this._chunks[dim];\n        var sum = 0;\n        if (dimData) {\n          for (var i = 0, len = this.count(); i < len; i++) {\n            var value = this.get(dim, i);\n            if (!isNaN(value)) {\n              sum += value;\n            }\n          }\n        }\n        return sum;\n      };\n      /**\r\n       * Get median of data in one dimension\r\n       */\n      DataStore.prototype.getMedian = function (dim) {\n        var dimDataArray = [];\n        // map all data of one dimension\n        this.each([dim], function (val) {\n          if (!isNaN(val)) {\n            dimDataArray.push(val);\n          }\n        });\n        // TODO\n        // Use quick select?\n        var sortedDimDataArray = dimDataArray.sort(function (a, b) {\n          return a - b;\n        });\n        var len = this.count();\n        // calculate median\n        return len === 0 ? 0 : len % 2 === 1 ? sortedDimDataArray[(len - 1) / 2] : (sortedDimDataArray[len / 2] + sortedDimDataArray[len / 2 - 1]) / 2;\n      };\n      /**\r\n       * Retrieve the index with given raw data index.\r\n       */\n      DataStore.prototype.indexOfRawIndex = function (rawIndex) {\n        if (rawIndex >= this._rawCount || rawIndex < 0) {\n          return -1;\n        }\n        if (!this._indices) {\n          return rawIndex;\n        }\n        // Indices are ascending\n        var indices = this._indices;\n        // If rawIndex === dataIndex\n        var rawDataIndex = indices[rawIndex];\n        if (rawDataIndex != null && rawDataIndex < this._count && rawDataIndex === rawIndex) {\n          return rawIndex;\n        }\n        var left = 0;\n        var right = this._count - 1;\n        while (left <= right) {\n          var mid = (left + right) / 2 | 0;\n          if (indices[mid] < rawIndex) {\n            left = mid + 1;\n          } else if (indices[mid] > rawIndex) {\n            right = mid - 1;\n          } else {\n            return mid;\n          }\n        }\n        return -1;\n      };\n      /**\r\n       * Retrieve the index of nearest value.\r\n       * @param dim\r\n       * @param value\r\n       * @param [maxDistance=Infinity]\r\n       * @return If and only if multiple indices have\r\n       *         the same value, they are put to the result.\r\n       */\n      DataStore.prototype.indicesOfNearest = function (dim, value, maxDistance) {\n        var chunks = this._chunks;\n        var dimData = chunks[dim];\n        var nearestIndices = [];\n        if (!dimData) {\n          return nearestIndices;\n        }\n        if (maxDistance == null) {\n          maxDistance = Infinity;\n        }\n        var minDist = Infinity;\n        var minDiff = -1;\n        var nearestIndicesLen = 0;\n        // Check the test case of `test/ut/spec/data/SeriesData.js`.\n        for (var i = 0, len = this.count(); i < len; i++) {\n          var dataIndex = this.getRawIndex(i);\n          var diff = value - dimData[dataIndex];\n          var dist = Math.abs(diff);\n          if (dist <= maxDistance) {\n            // When the `value` is at the middle of `this.get(dim, i)` and `this.get(dim, i+1)`,\n            // we'd better not push both of them to `nearestIndices`, otherwise it is easy to\n            // get more than one item in `nearestIndices` (more specifically, in `tooltip`).\n            // So we choose the one that `diff >= 0` in this case.\n            // But if `this.get(dim, i)` and `this.get(dim, j)` get the same value, both of them\n            // should be push to `nearestIndices`.\n            if (dist < minDist || dist === minDist && diff >= 0 && minDiff < 0) {\n              minDist = dist;\n              minDiff = diff;\n              nearestIndicesLen = 0;\n            }\n            if (diff === minDiff) {\n              nearestIndices[nearestIndicesLen++] = i;\n            }\n          }\n        }\n        nearestIndices.length = nearestIndicesLen;\n        return nearestIndices;\n      };\n      DataStore.prototype.getIndices = function () {\n        var newIndices;\n        var indices = this._indices;\n        if (indices) {\n          var Ctor = indices.constructor;\n          var thisCount = this._count;\n          // `new Array(a, b, c)` is different from `new Uint32Array(a, b, c)`.\n          if (Ctor === Array) {\n            newIndices = new Ctor(thisCount);\n            for (var i = 0; i < thisCount; i++) {\n              newIndices[i] = indices[i];\n            }\n          } else {\n            newIndices = new Ctor(indices.buffer, 0, thisCount);\n          }\n        } else {\n          var Ctor = getIndicesCtor(this._rawCount);\n          newIndices = new Ctor(this.count());\n          for (var i = 0; i < newIndices.length; i++) {\n            newIndices[i] = i;\n          }\n        }\n        return newIndices;\n      };\n      /**\r\n       * Data filter.\r\n       */\n      DataStore.prototype.filter = function (dims, cb) {\n        if (!this._count) {\n          return this;\n        }\n        var newStore = this.clone();\n        var count = newStore.count();\n        var Ctor = getIndicesCtor(newStore._rawCount);\n        var newIndices = new Ctor(count);\n        var value = [];\n        var dimSize = dims.length;\n        var offset = 0;\n        var dim0 = dims[0];\n        var chunks = newStore._chunks;\n        for (var i = 0; i < count; i++) {\n          var keep = void 0;\n          var rawIdx = newStore.getRawIndex(i);\n          // Simple optimization\n          if (dimSize === 0) {\n            keep = cb(i);\n          } else if (dimSize === 1) {\n            var val = chunks[dim0][rawIdx];\n            keep = cb(val, i);\n          } else {\n            var k = 0;\n            for (; k < dimSize; k++) {\n              value[k] = chunks[dims[k]][rawIdx];\n            }\n            value[k] = i;\n            keep = cb.apply(null, value);\n          }\n          if (keep) {\n            newIndices[offset++] = rawIdx;\n          }\n        }\n        // Set indices after filtered.\n        if (offset < count) {\n          newStore._indices = newIndices;\n        }\n        newStore._count = offset;\n        // Reset data extent\n        newStore._extent = [];\n        newStore._updateGetRawIdx();\n        return newStore;\n      };\n      /**\r\n       * Select data in range. (For optimization of filter)\r\n       * (Manually inline code, support 5 million data filtering in data zoom.)\r\n       */\n      DataStore.prototype.selectRange = function (range) {\n        var newStore = this.clone();\n        var len = newStore._count;\n        if (!len) {\n          return this;\n        }\n        var dims = keys(range);\n        var dimSize = dims.length;\n        if (!dimSize) {\n          return this;\n        }\n        var originalCount = newStore.count();\n        var Ctor = getIndicesCtor(newStore._rawCount);\n        var newIndices = new Ctor(originalCount);\n        var offset = 0;\n        var dim0 = dims[0];\n        var min = range[dim0][0];\n        var max = range[dim0][1];\n        var storeArr = newStore._chunks;\n        var quickFinished = false;\n        if (!newStore._indices) {\n          // Extreme optimization for common case. About 2x faster in chrome.\n          var idx = 0;\n          if (dimSize === 1) {\n            var dimStorage = storeArr[dims[0]];\n            for (var i = 0; i < len; i++) {\n              var val = dimStorage[i];\n              // NaN will not be filtered. Consider the case, in line chart, empty\n              // value indicates the line should be broken. But for the case like\n              // scatter plot, a data item with empty value will not be rendered,\n              // but the axis extent may be effected if some other dim of the data\n              // item has value. Fortunately it is not a significant negative effect.\n              if (val >= min && val <= max || isNaN(val)) {\n                newIndices[offset++] = idx;\n              }\n              idx++;\n            }\n            quickFinished = true;\n          } else if (dimSize === 2) {\n            var dimStorage = storeArr[dims[0]];\n            var dimStorage2 = storeArr[dims[1]];\n            var min2 = range[dims[1]][0];\n            var max2 = range[dims[1]][1];\n            for (var i = 0; i < len; i++) {\n              var val = dimStorage[i];\n              var val2 = dimStorage2[i];\n              // Do not filter NaN, see comment above.\n              if ((val >= min && val <= max || isNaN(val)) && (val2 >= min2 && val2 <= max2 || isNaN(val2))) {\n                newIndices[offset++] = idx;\n              }\n              idx++;\n            }\n            quickFinished = true;\n          }\n        }\n        if (!quickFinished) {\n          if (dimSize === 1) {\n            for (var i = 0; i < originalCount; i++) {\n              var rawIndex = newStore.getRawIndex(i);\n              var val = storeArr[dims[0]][rawIndex];\n              // Do not filter NaN, see comment above.\n              if (val >= min && val <= max || isNaN(val)) {\n                newIndices[offset++] = rawIndex;\n              }\n            }\n          } else {\n            for (var i = 0; i < originalCount; i++) {\n              var keep = true;\n              var rawIndex = newStore.getRawIndex(i);\n              for (var k = 0; k < dimSize; k++) {\n                var dimk = dims[k];\n                var val = storeArr[dimk][rawIndex];\n                // Do not filter NaN, see comment above.\n                if (val < range[dimk][0] || val > range[dimk][1]) {\n                  keep = false;\n                }\n              }\n              if (keep) {\n                newIndices[offset++] = newStore.getRawIndex(i);\n              }\n            }\n          }\n        }\n        // Set indices after filtered.\n        if (offset < originalCount) {\n          newStore._indices = newIndices;\n        }\n        newStore._count = offset;\n        // Reset data extent\n        newStore._extent = [];\n        newStore._updateGetRawIdx();\n        return newStore;\n      };\n      // /**\n      //  * Data mapping to a plain array\n      //  */\n      // mapArray(dims: DimensionIndex[], cb: MapArrayCb): any[] {\n      //     const result: any[] = [];\n      //     this.each(dims, function () {\n      //         result.push(cb && (cb as MapArrayCb).apply(null, arguments));\n      //     });\n      //     return result;\n      // }\n      /**\r\n       * Data mapping to a new List with given dimensions\r\n       */\n      DataStore.prototype.map = function (dims, cb) {\n        // TODO only clone picked chunks.\n        var target = this.clone(dims);\n        this._updateDims(target, dims, cb);\n        return target;\n      };\n      /**\r\n       * @caution Danger!! Only used in dataStack.\r\n       */\n      DataStore.prototype.modify = function (dims, cb) {\n        this._updateDims(this, dims, cb);\n      };\n      DataStore.prototype._updateDims = function (target, dims, cb) {\n        var targetChunks = target._chunks;\n        var tmpRetValue = [];\n        var dimSize = dims.length;\n        var dataCount = target.count();\n        var values = [];\n        var rawExtent = target._rawExtent;\n        for (var i = 0; i < dims.length; i++) {\n          rawExtent[dims[i]] = getInitialExtent();\n        }\n        for (var dataIndex = 0; dataIndex < dataCount; dataIndex++) {\n          var rawIndex = target.getRawIndex(dataIndex);\n          for (var k = 0; k < dimSize; k++) {\n            values[k] = targetChunks[dims[k]][rawIndex];\n          }\n          values[dimSize] = dataIndex;\n          var retValue = cb && cb.apply(null, values);\n          if (retValue != null) {\n            // a number or string (in oridinal dimension)?\n            if (typeof retValue !== 'object') {\n              tmpRetValue[0] = retValue;\n              retValue = tmpRetValue;\n            }\n            for (var i = 0; i < retValue.length; i++) {\n              var dim = dims[i];\n              var val = retValue[i];\n              var rawExtentOnDim = rawExtent[dim];\n              var dimStore = targetChunks[dim];\n              if (dimStore) {\n                dimStore[rawIndex] = val;\n              }\n              if (val < rawExtentOnDim[0]) {\n                rawExtentOnDim[0] = val;\n              }\n              if (val > rawExtentOnDim[1]) {\n                rawExtentOnDim[1] = val;\n              }\n            }\n          }\n        }\n      };\n      /**\r\n       * Large data down sampling using largest-triangle-three-buckets\r\n       * @param {string} valueDimension\r\n       * @param {number} targetCount\r\n       */\n      DataStore.prototype.lttbDownSample = function (valueDimension, rate) {\n        var target = this.clone([valueDimension], true);\n        var targetStorage = target._chunks;\n        var dimStore = targetStorage[valueDimension];\n        var len = this.count();\n        var sampledIndex = 0;\n        var frameSize = Math.floor(1 / rate);\n        var currentRawIndex = this.getRawIndex(0);\n        var maxArea;\n        var area;\n        var nextRawIndex;\n        var newIndices = new (getIndicesCtor(this._rawCount))(Math.min((Math.ceil(len / frameSize) + 2) * 2, len));\n        // First frame use the first data.\n        newIndices[sampledIndex++] = currentRawIndex;\n        for (var i = 1; i < len - 1; i += frameSize) {\n          var nextFrameStart = Math.min(i + frameSize, len - 1);\n          var nextFrameEnd = Math.min(i + frameSize * 2, len);\n          var avgX = (nextFrameEnd + nextFrameStart) / 2;\n          var avgY = 0;\n          for (var idx = nextFrameStart; idx < nextFrameEnd; idx++) {\n            var rawIndex = this.getRawIndex(idx);\n            var y = dimStore[rawIndex];\n            if (isNaN(y)) {\n              continue;\n            }\n            avgY += y;\n          }\n          avgY /= nextFrameEnd - nextFrameStart;\n          var frameStart = i;\n          var frameEnd = Math.min(i + frameSize, len);\n          var pointAX = i - 1;\n          var pointAY = dimStore[currentRawIndex];\n          maxArea = -1;\n          nextRawIndex = frameStart;\n          var firstNaNIndex = -1;\n          var countNaN = 0;\n          // Find a point from current frame that construct a triangle with largest area with previous selected point\n          // And the average of next frame.\n          for (var idx = frameStart; idx < frameEnd; idx++) {\n            var rawIndex = this.getRawIndex(idx);\n            var y = dimStore[rawIndex];\n            if (isNaN(y)) {\n              countNaN++;\n              if (firstNaNIndex < 0) {\n                firstNaNIndex = rawIndex;\n              }\n              continue;\n            }\n            // Calculate triangle area over three buckets\n            area = Math.abs((pointAX - avgX) * (y - pointAY) - (pointAX - idx) * (avgY - pointAY));\n            if (area > maxArea) {\n              maxArea = area;\n              nextRawIndex = rawIndex; // Next a is this b\n            }\n          }\n          if (countNaN > 0 && countNaN < frameEnd - frameStart) {\n            // Append first NaN point in every bucket.\n            // It is necessary to ensure the correct order of indices.\n            newIndices[sampledIndex++] = Math.min(firstNaNIndex, nextRawIndex);\n            nextRawIndex = Math.max(firstNaNIndex, nextRawIndex);\n          }\n          newIndices[sampledIndex++] = nextRawIndex;\n          currentRawIndex = nextRawIndex; // This a is the next a (chosen b)\n        }\n        // First frame use the last data.\n        newIndices[sampledIndex++] = this.getRawIndex(len - 1);\n        target._count = sampledIndex;\n        target._indices = newIndices;\n        target.getRawIndex = this._getRawIdx;\n        return target;\n      };\n      /**\r\n       * Large data down sampling using min-max\r\n       * @param {string} valueDimension\r\n       * @param {number} rate\r\n       */\n      DataStore.prototype.minmaxDownSample = function (valueDimension, rate) {\n        var target = this.clone([valueDimension], true);\n        var targetStorage = target._chunks;\n        var frameSize = Math.floor(1 / rate);\n        var dimStore = targetStorage[valueDimension];\n        var len = this.count();\n        // Each frame results in 2 data points, one for min and one for max\n        var newIndices = new (getIndicesCtor(this._rawCount))(Math.ceil(len / frameSize) * 2);\n        var offset = 0;\n        for (var i = 0; i < len; i += frameSize) {\n          var minIndex = i;\n          var minValue = dimStore[this.getRawIndex(minIndex)];\n          var maxIndex = i;\n          var maxValue = dimStore[this.getRawIndex(maxIndex)];\n          var thisFrameSize = frameSize;\n          // Handle final smaller frame\n          if (i + frameSize > len) {\n            thisFrameSize = len - i;\n          }\n          // Determine min and max within the current frame\n          for (var k = 0; k < thisFrameSize; k++) {\n            var rawIndex = this.getRawIndex(i + k);\n            var value = dimStore[rawIndex];\n            if (value < minValue) {\n              minValue = value;\n              minIndex = i + k;\n            }\n            if (value > maxValue) {\n              maxValue = value;\n              maxIndex = i + k;\n            }\n          }\n          var rawMinIndex = this.getRawIndex(minIndex);\n          var rawMaxIndex = this.getRawIndex(maxIndex);\n          // Set the order of the min and max values, based on their ordering in the frame\n          if (minIndex < maxIndex) {\n            newIndices[offset++] = rawMinIndex;\n            newIndices[offset++] = rawMaxIndex;\n          } else {\n            newIndices[offset++] = rawMaxIndex;\n            newIndices[offset++] = rawMinIndex;\n          }\n        }\n        target._count = offset;\n        target._indices = newIndices;\n        target._updateGetRawIdx();\n        return target;\n      };\n      /**\r\n       * Large data down sampling on given dimension\r\n       * @param sampleIndex Sample index for name and id\r\n       */\n      DataStore.prototype.downSample = function (dimension, rate, sampleValue, sampleIndex) {\n        var target = this.clone([dimension], true);\n        var targetStorage = target._chunks;\n        var frameValues = [];\n        var frameSize = Math.floor(1 / rate);\n        var dimStore = targetStorage[dimension];\n        var len = this.count();\n        var rawExtentOnDim = target._rawExtent[dimension] = getInitialExtent();\n        var newIndices = new (getIndicesCtor(this._rawCount))(Math.ceil(len / frameSize));\n        var offset = 0;\n        for (var i = 0; i < len; i += frameSize) {\n          // Last frame\n          if (frameSize > len - i) {\n            frameSize = len - i;\n            frameValues.length = frameSize;\n          }\n          for (var k = 0; k < frameSize; k++) {\n            var dataIdx = this.getRawIndex(i + k);\n            frameValues[k] = dimStore[dataIdx];\n          }\n          var value = sampleValue(frameValues);\n          var sampleFrameIdx = this.getRawIndex(Math.min(i + sampleIndex(frameValues, value) || 0, len - 1));\n          // Only write value on the filtered data\n          dimStore[sampleFrameIdx] = value;\n          if (value < rawExtentOnDim[0]) {\n            rawExtentOnDim[0] = value;\n          }\n          if (value > rawExtentOnDim[1]) {\n            rawExtentOnDim[1] = value;\n          }\n          newIndices[offset++] = sampleFrameIdx;\n        }\n        target._count = offset;\n        target._indices = newIndices;\n        target._updateGetRawIdx();\n        return target;\n      };\n      /**\r\n       * Data iteration\r\n       * @param ctx default this\r\n       * @example\r\n       *  list.each('x', function (x, idx) {});\r\n       *  list.each(['x', 'y'], function (x, y, idx) {});\r\n       *  list.each(function (idx) {})\r\n       */\n      DataStore.prototype.each = function (dims, cb) {\n        if (!this._count) {\n          return;\n        }\n        var dimSize = dims.length;\n        var chunks = this._chunks;\n        for (var i = 0, len = this.count(); i < len; i++) {\n          var rawIdx = this.getRawIndex(i);\n          // Simple optimization\n          switch (dimSize) {\n            case 0:\n              cb(i);\n              break;\n            case 1:\n              cb(chunks[dims[0]][rawIdx], i);\n              break;\n            case 2:\n              cb(chunks[dims[0]][rawIdx], chunks[dims[1]][rawIdx], i);\n              break;\n            default:\n              var k = 0;\n              var value = [];\n              for (; k < dimSize; k++) {\n                value[k] = chunks[dims[k]][rawIdx];\n              }\n              // Index\n              value[k] = i;\n              cb.apply(null, value);\n          }\n        }\n      };\n      /**\r\n       * Get extent of data in one dimension\r\n       */\n      DataStore.prototype.getDataExtent = function (dim) {\n        // Make sure use concrete dim as cache name.\n        var dimData = this._chunks[dim];\n        var initialExtent = getInitialExtent();\n        if (!dimData) {\n          return initialExtent;\n        }\n        // Make more strict checkings to ensure hitting cache.\n        var currEnd = this.count();\n        // Consider the most cases when using data zoom, `getDataExtent`\n        // happened before filtering. We cache raw extent, which is not\n        // necessary to be cleared and recalculated when restore data.\n        var useRaw = !this._indices;\n        var dimExtent;\n        if (useRaw) {\n          return this._rawExtent[dim].slice();\n        }\n        dimExtent = this._extent[dim];\n        if (dimExtent) {\n          return dimExtent.slice();\n        }\n        dimExtent = initialExtent;\n        var min = dimExtent[0];\n        var max = dimExtent[1];\n        for (var i = 0; i < currEnd; i++) {\n          var rawIdx = this.getRawIndex(i);\n          var value = dimData[rawIdx];\n          value < min && (min = value);\n          value > max && (max = value);\n        }\n        dimExtent = [min, max];\n        this._extent[dim] = dimExtent;\n        return dimExtent;\n      };\n      /**\r\n       * Get raw data item\r\n       */\n      DataStore.prototype.getRawDataItem = function (idx) {\n        var rawIdx = this.getRawIndex(idx);\n        if (!this._provider.persistent) {\n          var val = [];\n          var chunks = this._chunks;\n          for (var i = 0; i < chunks.length; i++) {\n            val.push(chunks[i][rawIdx]);\n          }\n          return val;\n        } else {\n          return this._provider.getItem(rawIdx);\n        }\n      };\n      /**\r\n       * Clone shallow.\r\n       *\r\n       * @param clonedDims Determine which dims to clone. Will share the data if not specified.\r\n       */\n      DataStore.prototype.clone = function (clonedDims, ignoreIndices) {\n        var target = new DataStore();\n        var chunks = this._chunks;\n        var clonedDimsMap = clonedDims && reduce(clonedDims, function (obj, dimIdx) {\n          obj[dimIdx] = true;\n          return obj;\n        }, {});\n        if (clonedDimsMap) {\n          for (var i = 0; i < chunks.length; i++) {\n            // Not clone if dim is not picked.\n            target._chunks[i] = !clonedDimsMap[i] ? chunks[i] : cloneChunk(chunks[i]);\n          }\n        } else {\n          target._chunks = chunks;\n        }\n        this._copyCommonProps(target);\n        if (!ignoreIndices) {\n          target._indices = this._cloneIndices();\n        }\n        target._updateGetRawIdx();\n        return target;\n      };\n      DataStore.prototype._copyCommonProps = function (target) {\n        target._count = this._count;\n        target._rawCount = this._rawCount;\n        target._provider = this._provider;\n        target._dimensions = this._dimensions;\n        target._extent = clone(this._extent);\n        target._rawExtent = clone(this._rawExtent);\n      };\n      DataStore.prototype._cloneIndices = function () {\n        if (this._indices) {\n          var Ctor = this._indices.constructor;\n          var indices = void 0;\n          if (Ctor === Array) {\n            var thisCount = this._indices.length;\n            indices = new Ctor(thisCount);\n            for (var i = 0; i < thisCount; i++) {\n              indices[i] = this._indices[i];\n            }\n          } else {\n            indices = new Ctor(this._indices);\n          }\n          return indices;\n        }\n        return null;\n      };\n      DataStore.prototype._getRawIdxIdentity = function (idx) {\n        return idx;\n      };\n      DataStore.prototype._getRawIdx = function (idx) {\n        if (idx < this._count && idx >= 0) {\n          return this._indices[idx];\n        }\n        return -1;\n      };\n      DataStore.prototype._updateGetRawIdx = function () {\n        this.getRawIndex = this._indices ? this._getRawIdx : this._getRawIdxIdentity;\n      };\n      DataStore.internalField = function () {\n        function getDimValueSimply(dataItem, property, dataIndex, dimIndex) {\n          return parseDataValue(dataItem[dimIndex], this._dimensions[dimIndex]);\n        }\n        defaultDimValueGetters = {\n          arrayRows: getDimValueSimply,\n          objectRows: function (dataItem, property, dataIndex, dimIndex) {\n            return parseDataValue(dataItem[property], this._dimensions[dimIndex]);\n          },\n          keyedColumns: getDimValueSimply,\n          original: function (dataItem, property, dataIndex, dimIndex) {\n            // Performance sensitive, do not use modelUtil.getDataItemValue.\n            // If dataItem is an plain object with no value field, the let `value`\n            // will be assigned with the object, but it will be tread correctly\n            // in the `convertValue`.\n            var value = dataItem && (dataItem.value == null ? dataItem : dataItem.value);\n            return parseDataValue(value instanceof Array ? value[dimIndex]\n            // If value is a single number or something else not array.\n            : value, this._dimensions[dimIndex]);\n          },\n          typedArray: function (dataItem, property, dataIndex, dimIndex) {\n            return dataItem[dimIndex];\n          }\n        };\n      }();\n      return DataStore;\n    }();\n\n    /**\r\n     * [REQUIREMENT_MEMO]:\r\n     * (0) `metaRawOption` means `dimensions`/`sourceHeader`/`seriesLayoutBy` in raw option.\r\n     * (1) Keep support the feature: `metaRawOption` can be specified both on `series` and\r\n     * `root-dataset`. Them on `series` has higher priority.\r\n     * (2) Do not support to set `metaRawOption` on a `non-root-dataset`, because it might\r\n     * confuse users: whether those props indicate how to visit the upstream source or visit\r\n     * the transform result source, and some transforms has nothing to do with these props,\r\n     * and some transforms might have multiple upstream.\r\n     * (3) Transforms should specify `metaRawOption` in each output, just like they can be\r\n     * declared in `root-dataset`.\r\n     * (4) At present only support visit source in `SERIES_LAYOUT_BY_COLUMN` in transforms.\r\n     * That is for reducing complexity in transforms.\r\n     * PENDING: Whether to provide transposition transform?\r\n     *\r\n     * [IMPLEMENTAION_MEMO]:\r\n     * \"sourceVisitConfig\" are calculated from `metaRawOption` and `data`.\r\n     * They will not be calculated until `source` is about to be visited (to prevent from\r\n     * duplicate calcuation). `source` is visited only in series and input to transforms.\r\n     *\r\n     * [DIMENSION_INHERIT_RULE]:\r\n     * By default the dimensions are inherited from ancestors, unless a transform return\r\n     * a new dimensions definition.\r\n     * Consider the case:\r\n     * ```js\r\n     * dataset: [{\r\n     *     source: [ ['Product', 'Sales', 'Prise'], ['Cookies', 321, 44.21], ...]\r\n     * }, {\r\n     *     transform: { type: 'filter', ... }\r\n     * }]\r\n     * dataset: [{\r\n     *     dimension: ['Product', 'Sales', 'Prise'],\r\n     *     source: [ ['Cookies', 321, 44.21], ...]\r\n     * }, {\r\n     *     transform: { type: 'filter', ... }\r\n     * }]\r\n     * ```\r\n     * The two types of option should have the same behavior after transform.\r\n     *\r\n     *\r\n     * [SCENARIO]:\r\n     * (1) Provide source data directly:\r\n     * ```js\r\n     * series: {\r\n     *     encode: {...},\r\n     *     dimensions: [...]\r\n     *     seriesLayoutBy: 'row',\r\n     *     data: [[...]]\r\n     * }\r\n     * ```\r\n     * (2) Series refer to dataset.\r\n     * ```js\r\n     * series: [{\r\n     *     encode: {...}\r\n     *     // Ignore datasetIndex means `datasetIndex: 0`\r\n     *     // and the dimensions defination in dataset is used\r\n     * }, {\r\n     *     encode: {...},\r\n     *     seriesLayoutBy: 'column',\r\n     *     datasetIndex: 1\r\n     * }]\r\n     * ```\r\n     * (3) dataset transform\r\n     * ```js\r\n     * dataset: [{\r\n     *     source: [...]\r\n     * }, {\r\n     *     source: [...]\r\n     * }, {\r\n     *     // By default from 0.\r\n     *     transform: { type: 'filter', config: {...} }\r\n     * }, {\r\n     *     // Piped.\r\n     *     transform: [\r\n     *         { type: 'filter', config: {...} },\r\n     *         { type: 'sort', config: {...} }\r\n     *     ]\r\n     * }, {\r\n     *     id: 'regressionData',\r\n     *     fromDatasetIndex: 1,\r\n     *     // Third-party transform\r\n     *     transform: { type: 'ecStat:regression', config: {...} }\r\n     * }, {\r\n     *     // retrieve the extra result.\r\n     *     id: 'regressionFormula',\r\n     *     fromDatasetId: 'regressionData',\r\n     *     fromTransformResult: 1\r\n     * }]\r\n     * ```\r\n     */\n    var SourceManager = /** @class */function () {\n      function SourceManager(sourceHost) {\n        // Cached source. Do not repeat calculating if not dirty.\n        this._sourceList = [];\n        this._storeList = [];\n        // version sign of each upstream source manager.\n        this._upstreamSignList = [];\n        this._versionSignBase = 0;\n        this._dirty = true;\n        this._sourceHost = sourceHost;\n      }\n      /**\r\n       * Mark dirty.\r\n       */\n      SourceManager.prototype.dirty = function () {\n        this._setLocalSource([], []);\n        this._storeList = [];\n        this._dirty = true;\n      };\n      SourceManager.prototype._setLocalSource = function (sourceList, upstreamSignList) {\n        this._sourceList = sourceList;\n        this._upstreamSignList = upstreamSignList;\n        this._versionSignBase++;\n        if (this._versionSignBase > 9e10) {\n          this._versionSignBase = 0;\n        }\n      };\n      /**\r\n       * For detecting whether the upstream source is dirty, so that\r\n       * the local cached source (in `_sourceList`) should be discarded.\r\n       */\n      SourceManager.prototype._getVersionSign = function () {\n        return this._sourceHost.uid + '_' + this._versionSignBase;\n      };\n      /**\r\n       * Always return a source instance. Otherwise throw error.\r\n       */\n      SourceManager.prototype.prepareSource = function () {\n        // For the case that call `setOption` multiple time but no data changed,\n        // cache the result source to prevent from repeating transform.\n        if (this._isDirty()) {\n          this._createSource();\n          this._dirty = false;\n        }\n      };\n      SourceManager.prototype._createSource = function () {\n        this._setLocalSource([], []);\n        var sourceHost = this._sourceHost;\n        var upSourceMgrList = this._getUpstreamSourceManagers();\n        var hasUpstream = !!upSourceMgrList.length;\n        var resultSourceList;\n        var upstreamSignList;\n        if (isSeries(sourceHost)) {\n          var seriesModel = sourceHost;\n          var data = void 0;\n          var sourceFormat = void 0;\n          var upSource = void 0;\n          // Has upstream dataset\n          if (hasUpstream) {\n            var upSourceMgr = upSourceMgrList[0];\n            upSourceMgr.prepareSource();\n            upSource = upSourceMgr.getSource();\n            data = upSource.data;\n            sourceFormat = upSource.sourceFormat;\n            upstreamSignList = [upSourceMgr._getVersionSign()];\n          }\n          // Series data is from own.\n          else {\n            data = seriesModel.get('data', true);\n            sourceFormat = isTypedArray(data) ? SOURCE_FORMAT_TYPED_ARRAY : SOURCE_FORMAT_ORIGINAL;\n            upstreamSignList = [];\n          }\n          // See [REQUIREMENT_MEMO], merge settings on series and parent dataset if it is root.\n          var newMetaRawOption = this._getSourceMetaRawOption() || {};\n          var upMetaRawOption = upSource && upSource.metaRawOption || {};\n          var seriesLayoutBy = retrieve2(newMetaRawOption.seriesLayoutBy, upMetaRawOption.seriesLayoutBy) || null;\n          var sourceHeader = retrieve2(newMetaRawOption.sourceHeader, upMetaRawOption.sourceHeader);\n          // Note here we should not use `upSource.dimensionsDefine`. Consider the case:\n          // `upSource.dimensionsDefine` is detected by `seriesLayoutBy: 'column'`,\n          // but series need `seriesLayoutBy: 'row'`.\n          var dimensions = retrieve2(newMetaRawOption.dimensions, upMetaRawOption.dimensions);\n          // We share source with dataset as much as possible\n          // to avoid extra memory cost of high dimensional data.\n          var needsCreateSource = seriesLayoutBy !== upMetaRawOption.seriesLayoutBy || !!sourceHeader !== !!upMetaRawOption.sourceHeader || dimensions;\n          resultSourceList = needsCreateSource ? [createSource(data, {\n            seriesLayoutBy: seriesLayoutBy,\n            sourceHeader: sourceHeader,\n            dimensions: dimensions\n          }, sourceFormat)] : [];\n        } else {\n          var datasetModel = sourceHost;\n          // Has upstream dataset.\n          if (hasUpstream) {\n            var result = this._applyTransform(upSourceMgrList);\n            resultSourceList = result.sourceList;\n            upstreamSignList = result.upstreamSignList;\n          }\n          // Is root dataset.\n          else {\n            var sourceData = datasetModel.get('source', true);\n            resultSourceList = [createSource(sourceData, this._getSourceMetaRawOption(), null)];\n            upstreamSignList = [];\n          }\n        }\n        if (\"development\" !== 'production') {\n          assert(resultSourceList && upstreamSignList);\n        }\n        this._setLocalSource(resultSourceList, upstreamSignList);\n      };\n      SourceManager.prototype._applyTransform = function (upMgrList) {\n        var datasetModel = this._sourceHost;\n        var transformOption = datasetModel.get('transform', true);\n        var fromTransformResult = datasetModel.get('fromTransformResult', true);\n        if (\"development\" !== 'production') {\n          assert(fromTransformResult != null || transformOption != null);\n        }\n        if (fromTransformResult != null) {\n          var errMsg = '';\n          if (upMgrList.length !== 1) {\n            if (\"development\" !== 'production') {\n              errMsg = 'When using `fromTransformResult`, there should be only one upstream dataset';\n            }\n            doThrow(errMsg);\n          }\n        }\n        var sourceList;\n        var upSourceList = [];\n        var upstreamSignList = [];\n        each(upMgrList, function (upMgr) {\n          upMgr.prepareSource();\n          var upSource = upMgr.getSource(fromTransformResult || 0);\n          var errMsg = '';\n          if (fromTransformResult != null && !upSource) {\n            if (\"development\" !== 'production') {\n              errMsg = 'Can not retrieve result by `fromTransformResult`: ' + fromTransformResult;\n            }\n            doThrow(errMsg);\n          }\n          upSourceList.push(upSource);\n          upstreamSignList.push(upMgr._getVersionSign());\n        });\n        if (transformOption) {\n          sourceList = applyDataTransform(transformOption, upSourceList, {\n            datasetIndex: datasetModel.componentIndex\n          });\n        } else if (fromTransformResult != null) {\n          sourceList = [cloneSourceShallow(upSourceList[0])];\n        }\n        return {\n          sourceList: sourceList,\n          upstreamSignList: upstreamSignList\n        };\n      };\n      SourceManager.prototype._isDirty = function () {\n        if (this._dirty) {\n          return true;\n        }\n        // All sourceList is from the some upstream.\n        var upSourceMgrList = this._getUpstreamSourceManagers();\n        for (var i = 0; i < upSourceMgrList.length; i++) {\n          var upSrcMgr = upSourceMgrList[i];\n          if (\n          // Consider the case that there is ancestor diry, call it recursively.\n          // The performance is probably not an issue because usually the chain is not long.\n          upSrcMgr._isDirty() || this._upstreamSignList[i] !== upSrcMgr._getVersionSign()) {\n            return true;\n          }\n        }\n      };\n      /**\r\n       * @param sourceIndex By default 0, means \"main source\".\r\n       *                    In most cases there is only one source.\r\n       */\n      SourceManager.prototype.getSource = function (sourceIndex) {\n        sourceIndex = sourceIndex || 0;\n        var source = this._sourceList[sourceIndex];\n        if (!source) {\n          // Series may share source instance with dataset.\n          var upSourceMgrList = this._getUpstreamSourceManagers();\n          return upSourceMgrList[0] && upSourceMgrList[0].getSource(sourceIndex);\n        }\n        return source;\n      };\n      /**\r\n       *\r\n       * Get a data store which can be shared across series.\r\n       * Only available for series.\r\n       *\r\n       * @param seriesDimRequest Dimensions that are generated in series.\r\n       *        Should have been sorted by `storeDimIndex` asc.\r\n       */\n      SourceManager.prototype.getSharedDataStore = function (seriesDimRequest) {\n        if (\"development\" !== 'production') {\n          assert(isSeries(this._sourceHost), 'Can only call getDataStore on series source manager.');\n        }\n        var schema = seriesDimRequest.makeStoreSchema();\n        return this._innerGetDataStore(schema.dimensions, seriesDimRequest.source, schema.hash);\n      };\n      SourceManager.prototype._innerGetDataStore = function (storeDims, seriesSource, sourceReadKey) {\n        // TODO Can use other sourceIndex?\n        var sourceIndex = 0;\n        var storeList = this._storeList;\n        var cachedStoreMap = storeList[sourceIndex];\n        if (!cachedStoreMap) {\n          cachedStoreMap = storeList[sourceIndex] = {};\n        }\n        var cachedStore = cachedStoreMap[sourceReadKey];\n        if (!cachedStore) {\n          var upSourceMgr = this._getUpstreamSourceManagers()[0];\n          if (isSeries(this._sourceHost) && upSourceMgr) {\n            cachedStore = upSourceMgr._innerGetDataStore(storeDims, seriesSource, sourceReadKey);\n          } else {\n            cachedStore = new DataStore();\n            // Always create store from source of series.\n            cachedStore.initData(new DefaultDataProvider(seriesSource, storeDims.length), storeDims);\n          }\n          cachedStoreMap[sourceReadKey] = cachedStore;\n        }\n        return cachedStore;\n      };\n      /**\r\n       * PENDING: Is it fast enough?\r\n       * If no upstream, return empty array.\r\n       */\n      SourceManager.prototype._getUpstreamSourceManagers = function () {\n        // Always get the relationship from the raw option.\n        // Do not cache the link of the dependency graph, so that\n        // there is no need to update them when change happens.\n        var sourceHost = this._sourceHost;\n        if (isSeries(sourceHost)) {\n          var datasetModel = querySeriesUpstreamDatasetModel(sourceHost);\n          return !datasetModel ? [] : [datasetModel.getSourceManager()];\n        } else {\n          return map(queryDatasetUpstreamDatasetModels(sourceHost), function (datasetModel) {\n            return datasetModel.getSourceManager();\n          });\n        }\n      };\n      SourceManager.prototype._getSourceMetaRawOption = function () {\n        var sourceHost = this._sourceHost;\n        var seriesLayoutBy;\n        var sourceHeader;\n        var dimensions;\n        if (isSeries(sourceHost)) {\n          seriesLayoutBy = sourceHost.get('seriesLayoutBy', true);\n          sourceHeader = sourceHost.get('sourceHeader', true);\n          dimensions = sourceHost.get('dimensions', true);\n        }\n        // See [REQUIREMENT_MEMO], `non-root-dataset` do not support them.\n        else if (!this._getUpstreamSourceManagers().length) {\n          var model = sourceHost;\n          seriesLayoutBy = model.get('seriesLayoutBy', true);\n          sourceHeader = model.get('sourceHeader', true);\n          dimensions = model.get('dimensions', true);\n        }\n        return {\n          seriesLayoutBy: seriesLayoutBy,\n          sourceHeader: sourceHeader,\n          dimensions: dimensions\n        };\n      };\n      return SourceManager;\n    }();\n    // Call this method after `super.init` and `super.mergeOption` to\n    // disable the transform merge, but do not disable transform clone from rawOption.\n    function disableTransformOptionMerge(datasetModel) {\n      var transformOption = datasetModel.option.transform;\n      transformOption && setAsPrimitive(datasetModel.option.transform);\n    }\n    function isSeries(sourceHost) {\n      // Avoid circular dependency with Series.ts\n      return sourceHost.mainType === 'series';\n    }\n    function doThrow(errMsg) {\n      throw new Error(errMsg);\n    }\n\n    var TOOLTIP_LINE_HEIGHT_CSS = 'line-height:1';\n    function getTooltipLineHeight(textStyle) {\n      var lineHeight = textStyle.lineHeight;\n      if (lineHeight == null) {\n        return TOOLTIP_LINE_HEIGHT_CSS;\n      } else {\n        return \"line-height:\" + encodeHTML(lineHeight + '') + \"px\";\n      }\n    }\n    // TODO: more textStyle option\n    function getTooltipTextStyle(textStyle, renderMode) {\n      var nameFontColor = textStyle.color || '#6e7079';\n      var nameFontSize = textStyle.fontSize || 12;\n      var nameFontWeight = textStyle.fontWeight || '400';\n      var valueFontColor = textStyle.color || '#464646';\n      var valueFontSize = textStyle.fontSize || 14;\n      var valueFontWeight = textStyle.fontWeight || '900';\n      if (renderMode === 'html') {\n        // `textStyle` is probably from user input, should be encoded to reduce security risk.\n        return {\n          // eslint-disable-next-line max-len\n          nameStyle: \"font-size:\" + encodeHTML(nameFontSize + '') + \"px;color:\" + encodeHTML(nameFontColor) + \";font-weight:\" + encodeHTML(nameFontWeight + ''),\n          // eslint-disable-next-line max-len\n          valueStyle: \"font-size:\" + encodeHTML(valueFontSize + '') + \"px;color:\" + encodeHTML(valueFontColor) + \";font-weight:\" + encodeHTML(valueFontWeight + '')\n        };\n      } else {\n        return {\n          nameStyle: {\n            fontSize: nameFontSize,\n            fill: nameFontColor,\n            fontWeight: nameFontWeight\n          },\n          valueStyle: {\n            fontSize: valueFontSize,\n            fill: valueFontColor,\n            fontWeight: valueFontWeight\n          }\n        };\n      }\n    }\n    // See `TooltipMarkupLayoutIntent['innerGapLevel']`.\n    // (value from UI design)\n    var HTML_GAPS = [0, 10, 20, 30];\n    var RICH_TEXT_GAPS = ['', '\\n', '\\n\\n', '\\n\\n\\n'];\n    // eslint-disable-next-line max-len\n    function createTooltipMarkup(type, option) {\n      option.type = type;\n      return option;\n    }\n    function isSectionFragment(frag) {\n      return frag.type === 'section';\n    }\n    function getBuilder(frag) {\n      return isSectionFragment(frag) ? buildSection : buildNameValue;\n    }\n    function getBlockGapLevel(frag) {\n      if (isSectionFragment(frag)) {\n        var gapLevel_1 = 0;\n        var subBlockLen = frag.blocks.length;\n        var hasInnerGap_1 = subBlockLen > 1 || subBlockLen > 0 && !frag.noHeader;\n        each(frag.blocks, function (subBlock) {\n          var subGapLevel = getBlockGapLevel(subBlock);\n          // If the some of the sub-blocks have some gaps (like 10px) inside, this block\n          // should use a larger gap (like 20px) to distinguish those sub-blocks.\n          if (subGapLevel >= gapLevel_1) {\n            gapLevel_1 = subGapLevel + +(hasInnerGap_1 && (\n            // 0 always can not be readable gap level.\n            !subGapLevel\n            // If no header, always keep the sub gap level. Otherwise\n            // look weird in case `multipleSeries`.\n            || isSectionFragment(subBlock) && !subBlock.noHeader));\n          }\n        });\n        return gapLevel_1;\n      }\n      return 0;\n    }\n    function buildSection(ctx, fragment, topMarginForOuterGap, toolTipTextStyle) {\n      var noHeader = fragment.noHeader;\n      var gaps = getGap(getBlockGapLevel(fragment));\n      var subMarkupTextList = [];\n      var subBlocks = fragment.blocks || [];\n      assert(!subBlocks || isArray(subBlocks));\n      subBlocks = subBlocks || [];\n      var orderMode = ctx.orderMode;\n      if (fragment.sortBlocks && orderMode) {\n        subBlocks = subBlocks.slice();\n        var orderMap = {\n          valueAsc: 'asc',\n          valueDesc: 'desc'\n        };\n        if (hasOwn(orderMap, orderMode)) {\n          var comparator_1 = new SortOrderComparator(orderMap[orderMode], null);\n          subBlocks.sort(function (a, b) {\n            return comparator_1.evaluate(a.sortParam, b.sortParam);\n          });\n        }\n        // FIXME 'seriesDesc' necessary?\n        else if (orderMode === 'seriesDesc') {\n          subBlocks.reverse();\n        }\n      }\n      each(subBlocks, function (subBlock, idx) {\n        var valueFormatter = fragment.valueFormatter;\n        var subMarkupText = getBuilder(subBlock)(\n        // Inherit valueFormatter\n        valueFormatter ? extend(extend({}, ctx), {\n          valueFormatter: valueFormatter\n        }) : ctx, subBlock, idx > 0 ? gaps.html : 0, toolTipTextStyle);\n        subMarkupText != null && subMarkupTextList.push(subMarkupText);\n      });\n      var subMarkupText = ctx.renderMode === 'richText' ? subMarkupTextList.join(gaps.richText) : wrapBlockHTML(toolTipTextStyle, subMarkupTextList.join(''), noHeader ? topMarginForOuterGap : gaps.html);\n      if (noHeader) {\n        return subMarkupText;\n      }\n      var displayableHeader = makeValueReadable(fragment.header, 'ordinal', ctx.useUTC);\n      var nameStyle = getTooltipTextStyle(toolTipTextStyle, ctx.renderMode).nameStyle;\n      var tooltipLineHeight = getTooltipLineHeight(toolTipTextStyle);\n      if (ctx.renderMode === 'richText') {\n        return wrapInlineNameRichText(ctx, displayableHeader, nameStyle) + gaps.richText + subMarkupText;\n      } else {\n        return wrapBlockHTML(toolTipTextStyle, \"<div style=\\\"\" + nameStyle + \";\" + tooltipLineHeight + \";\\\">\" + encodeHTML(displayableHeader) + '</div>' + subMarkupText, topMarginForOuterGap);\n      }\n    }\n    function buildNameValue(ctx, fragment, topMarginForOuterGap, toolTipTextStyle) {\n      var renderMode = ctx.renderMode;\n      var noName = fragment.noName;\n      var noValue = fragment.noValue;\n      var noMarker = !fragment.markerType;\n      var name = fragment.name;\n      var useUTC = ctx.useUTC;\n      var valueFormatter = fragment.valueFormatter || ctx.valueFormatter || function (value) {\n        value = isArray(value) ? value : [value];\n        return map(value, function (val, idx) {\n          return makeValueReadable(val, isArray(valueTypeOption) ? valueTypeOption[idx] : valueTypeOption, useUTC);\n        });\n      };\n      if (noName && noValue) {\n        return;\n      }\n      var markerStr = noMarker ? '' : ctx.markupStyleCreator.makeTooltipMarker(fragment.markerType, fragment.markerColor || '#333', renderMode);\n      var readableName = noName ? '' : makeValueReadable(name, 'ordinal', useUTC);\n      var valueTypeOption = fragment.valueType;\n      var readableValueList = noValue ? [] : valueFormatter(fragment.value, fragment.dataIndex);\n      var valueAlignRight = !noMarker || !noName;\n      // It little weird if only value next to marker but far from marker.\n      var valueCloseToMarker = !noMarker && noName;\n      var _a = getTooltipTextStyle(toolTipTextStyle, renderMode),\n        nameStyle = _a.nameStyle,\n        valueStyle = _a.valueStyle;\n      return renderMode === 'richText' ? (noMarker ? '' : markerStr) + (noName ? '' : wrapInlineNameRichText(ctx, readableName, nameStyle))\n      // Value has commas inside, so use ' ' as delimiter for multiple values.\n      + (noValue ? '' : wrapInlineValueRichText(ctx, readableValueList, valueAlignRight, valueCloseToMarker, valueStyle)) : wrapBlockHTML(toolTipTextStyle, (noMarker ? '' : markerStr) + (noName ? '' : wrapInlineNameHTML(readableName, !noMarker, nameStyle)) + (noValue ? '' : wrapInlineValueHTML(readableValueList, valueAlignRight, valueCloseToMarker, valueStyle)), topMarginForOuterGap);\n    }\n    /**\r\n     * @return markupText. null/undefined means no content.\r\n     */\n    function buildTooltipMarkup(fragment, markupStyleCreator, renderMode, orderMode, useUTC, toolTipTextStyle) {\n      if (!fragment) {\n        return;\n      }\n      var builder = getBuilder(fragment);\n      var ctx = {\n        useUTC: useUTC,\n        renderMode: renderMode,\n        orderMode: orderMode,\n        markupStyleCreator: markupStyleCreator,\n        valueFormatter: fragment.valueFormatter\n      };\n      return builder(ctx, fragment, 0, toolTipTextStyle);\n    }\n    function getGap(gapLevel) {\n      return {\n        html: HTML_GAPS[gapLevel],\n        richText: RICH_TEXT_GAPS[gapLevel]\n      };\n    }\n    function wrapBlockHTML(textStyle, encodedContent, topGap) {\n      var clearfix = '<div style=\"clear:both\"></div>';\n      var marginCSS = \"margin: \" + topGap + \"px 0 0\";\n      var tooltipLineHeight = getTooltipLineHeight(textStyle);\n      return \"<div style=\\\"\" + marginCSS + \";\" + tooltipLineHeight + \";\\\">\" + encodedContent + clearfix + '</div>';\n    }\n    function wrapInlineNameHTML(name, leftHasMarker, style) {\n      var marginCss = leftHasMarker ? 'margin-left:2px' : '';\n      return \"<span style=\\\"\" + style + \";\" + marginCss + \"\\\">\" + encodeHTML(name) + '</span>';\n    }\n    function wrapInlineValueHTML(valueList, alignRight, valueCloseToMarker, style) {\n      // Do not too close to marker, considering there are multiple values separated by spaces.\n      var paddingStr = valueCloseToMarker ? '10px' : '20px';\n      var alignCSS = alignRight ? \"float:right;margin-left:\" + paddingStr : '';\n      valueList = isArray(valueList) ? valueList : [valueList];\n      return \"<span style=\\\"\" + alignCSS + \";\" + style + \"\\\">\"\n      // Value has commas inside, so use '  ' as delimiter for multiple values.\n      + map(valueList, function (value) {\n        return encodeHTML(value);\n      }).join('&nbsp;&nbsp;') + '</span>';\n    }\n    function wrapInlineNameRichText(ctx, name, style) {\n      return ctx.markupStyleCreator.wrapRichTextStyle(name, style);\n    }\n    function wrapInlineValueRichText(ctx, values, alignRight, valueCloseToMarker, style) {\n      var styles = [style];\n      var paddingLeft = valueCloseToMarker ? 10 : 20;\n      alignRight && styles.push({\n        padding: [0, 0, 0, paddingLeft],\n        align: 'right'\n      });\n      // Value has commas inside, so use '  ' as delimiter for multiple values.\n      return ctx.markupStyleCreator.wrapRichTextStyle(isArray(values) ? values.join('  ') : values, styles);\n    }\n    function retrieveVisualColorForTooltipMarker(series, dataIndex) {\n      var style = series.getData().getItemVisual(dataIndex, 'style');\n      var color = style[series.visualDrawType];\n      return convertToColorString(color);\n    }\n    function getPaddingFromTooltipModel(model, renderMode) {\n      var padding = model.get('padding');\n      return padding != null ? padding\n      // We give slightly different to look pretty.\n      : renderMode === 'richText' ? [8, 10] : 10;\n    }\n    /**\r\n     * The major feature is generate styles for `renderMode: 'richText'`.\r\n     * But it also serves `renderMode: 'html'` to provide\r\n     * \"renderMode-independent\" API.\r\n     */\n    var TooltipMarkupStyleCreator = /** @class */function () {\n      function TooltipMarkupStyleCreator() {\n        this.richTextStyles = {};\n        // Notice that \"generate a style name\" usually happens repeatedly when mouse is moving and\n        // a tooltip is displayed. So we put the `_nextStyleNameId` as a member of each creator\n        // rather than static shared by all creators (which will cause it increase to fast).\n        this._nextStyleNameId = getRandomIdBase();\n      }\n      TooltipMarkupStyleCreator.prototype._generateStyleName = function () {\n        return '__EC_aUTo_' + this._nextStyleNameId++;\n      };\n      TooltipMarkupStyleCreator.prototype.makeTooltipMarker = function (markerType, colorStr, renderMode) {\n        var markerId = renderMode === 'richText' ? this._generateStyleName() : null;\n        var marker = getTooltipMarker({\n          color: colorStr,\n          type: markerType,\n          renderMode: renderMode,\n          markerId: markerId\n        });\n        if (isString(marker)) {\n          return marker;\n        } else {\n          if (\"development\" !== 'production') {\n            assert(markerId);\n          }\n          this.richTextStyles[markerId] = marker.style;\n          return marker.content;\n        }\n      };\n      /**\r\n       * @usage\r\n       * ```ts\r\n       * const styledText = markupStyleCreator.wrapRichTextStyle([\r\n       *     // The styles will be auto merged.\r\n       *     {\r\n       *         fontSize: 12,\r\n       *         color: 'blue'\r\n       *     },\r\n       *     {\r\n       *         padding: 20\r\n       *     }\r\n       * ]);\r\n       * ```\r\n       */\n      TooltipMarkupStyleCreator.prototype.wrapRichTextStyle = function (text, styles) {\n        var finalStl = {};\n        if (isArray(styles)) {\n          each(styles, function (stl) {\n            return extend(finalStl, stl);\n          });\n        } else {\n          extend(finalStl, styles);\n        }\n        var styleName = this._generateStyleName();\n        this.richTextStyles[styleName] = finalStl;\n        return \"{\" + styleName + \"|\" + text + \"}\";\n      };\n      return TooltipMarkupStyleCreator;\n    }();\n\n    function defaultSeriesFormatTooltip(opt) {\n      var series = opt.series;\n      var dataIndex = opt.dataIndex;\n      var multipleSeries = opt.multipleSeries;\n      var data = series.getData();\n      var tooltipDims = data.mapDimensionsAll('defaultedTooltip');\n      var tooltipDimLen = tooltipDims.length;\n      var value = series.getRawValue(dataIndex);\n      var isValueArr = isArray(value);\n      var markerColor = retrieveVisualColorForTooltipMarker(series, dataIndex);\n      // Complicated rule for pretty tooltip.\n      var inlineValue;\n      var inlineValueType;\n      var subBlocks;\n      var sortParam;\n      if (tooltipDimLen > 1 || isValueArr && !tooltipDimLen) {\n        var formatArrResult = formatTooltipArrayValue(value, series, dataIndex, tooltipDims, markerColor);\n        inlineValue = formatArrResult.inlineValues;\n        inlineValueType = formatArrResult.inlineValueTypes;\n        subBlocks = formatArrResult.blocks;\n        // Only support tooltip sort by the first inline value. It's enough in most cases.\n        sortParam = formatArrResult.inlineValues[0];\n      } else if (tooltipDimLen) {\n        var dimInfo = data.getDimensionInfo(tooltipDims[0]);\n        sortParam = inlineValue = retrieveRawValue(data, dataIndex, tooltipDims[0]);\n        inlineValueType = dimInfo.type;\n      } else {\n        sortParam = inlineValue = isValueArr ? value[0] : value;\n      }\n      // Do not show generated series name. It might not be readable.\n      var seriesNameSpecified = isNameSpecified(series);\n      var seriesName = seriesNameSpecified && series.name || '';\n      var itemName = data.getName(dataIndex);\n      var inlineName = multipleSeries ? seriesName : itemName;\n      return createTooltipMarkup('section', {\n        header: seriesName,\n        // When series name is not specified, do not show a header line with only '-'.\n        // This case always happens in tooltip.trigger: 'item'.\n        noHeader: multipleSeries || !seriesNameSpecified,\n        sortParam: sortParam,\n        blocks: [createTooltipMarkup('nameValue', {\n          markerType: 'item',\n          markerColor: markerColor,\n          // Do not mix display seriesName and itemName in one tooltip,\n          // which might confuses users.\n          name: inlineName,\n          // name dimension might be auto assigned, where the name might\n          // be not readable. So we check trim here.\n          noName: !trim(inlineName),\n          value: inlineValue,\n          valueType: inlineValueType,\n          dataIndex: dataIndex\n        })].concat(subBlocks || [])\n      });\n    }\n    function formatTooltipArrayValue(value, series, dataIndex, tooltipDims, colorStr) {\n      // check: category-no-encode-has-axis-data in dataset.html\n      var data = series.getData();\n      var isValueMultipleLine = reduce(value, function (isValueMultipleLine, val, idx) {\n        var dimItem = data.getDimensionInfo(idx);\n        return isValueMultipleLine = isValueMultipleLine || dimItem && dimItem.tooltip !== false && dimItem.displayName != null;\n      }, false);\n      var inlineValues = [];\n      var inlineValueTypes = [];\n      var blocks = [];\n      tooltipDims.length ? each(tooltipDims, function (dim) {\n        setEachItem(retrieveRawValue(data, dataIndex, dim), dim);\n      })\n      // By default, all dims is used on tooltip.\n      : each(value, setEachItem);\n      function setEachItem(val, dim) {\n        var dimInfo = data.getDimensionInfo(dim);\n        // If `dimInfo.tooltip` is not set, show tooltip.\n        if (!dimInfo || dimInfo.otherDims.tooltip === false) {\n          return;\n        }\n        if (isValueMultipleLine) {\n          blocks.push(createTooltipMarkup('nameValue', {\n            markerType: 'subItem',\n            markerColor: colorStr,\n            name: dimInfo.displayName,\n            value: val,\n            valueType: dimInfo.type\n          }));\n        } else {\n          inlineValues.push(val);\n          inlineValueTypes.push(dimInfo.type);\n        }\n      }\n      return {\n        inlineValues: inlineValues,\n        inlineValueTypes: inlineValueTypes,\n        blocks: blocks\n      };\n    }\n\n    var inner$1 = makeInner();\n    function getSelectionKey(data, dataIndex) {\n      return data.getName(dataIndex) || data.getId(dataIndex);\n    }\n    var SERIES_UNIVERSAL_TRANSITION_PROP = '__universalTransitionEnabled';\n    var SeriesModel = /** @class */function (_super) {\n      __extends(SeriesModel, _super);\n      function SeriesModel() {\n        // [Caution]: Because this class or desecendants can be used as `XXX.extend(subProto)`,\n        // the class members must not be initialized in constructor or declaration place.\n        // Otherwise there is bad case:\n        //   class A {xxx = 1;}\n        //   enableClassExtend(A);\n        //   class B extends A {}\n        //   var C = B.extend({xxx: 5});\n        //   var c = new C();\n        //   console.log(c.xxx); // expect 5 but always 1.\n        var _this = _super !== null && _super.apply(this, arguments) || this;\n        // ---------------------------------------\n        // Props about data selection\n        // ---------------------------------------\n        _this._selectedDataIndicesMap = {};\n        return _this;\n      }\n      SeriesModel.prototype.init = function (option, parentModel, ecModel) {\n        this.seriesIndex = this.componentIndex;\n        this.dataTask = createTask({\n          count: dataTaskCount,\n          reset: dataTaskReset\n        });\n        this.dataTask.context = {\n          model: this\n        };\n        this.mergeDefaultAndTheme(option, ecModel);\n        var sourceManager = inner$1(this).sourceManager = new SourceManager(this);\n        sourceManager.prepareSource();\n        var data = this.getInitialData(option, ecModel);\n        wrapData(data, this);\n        this.dataTask.context.data = data;\n        if (\"development\" !== 'production') {\n          assert(data, 'getInitialData returned invalid data.');\n        }\n        inner$1(this).dataBeforeProcessed = data;\n        // If we reverse the order (make data firstly, and then make\n        // dataBeforeProcessed by cloneShallow), cloneShallow will\n        // cause data.graph.data !== data when using\n        // module:echarts/data/Graph or module:echarts/data/Tree.\n        // See module:echarts/data/helper/linkSeriesData\n        // Theoretically, it is unreasonable to call `seriesModel.getData()` in the model\n        // init or merge stage, because the data can be restored. So we do not `restoreData`\n        // and `setData` here, which forbids calling `seriesModel.getData()` in this stage.\n        // Call `seriesModel.getRawData()` instead.\n        // this.restoreData();\n        autoSeriesName(this);\n        this._initSelectedMapFromData(data);\n      };\n      /**\r\n       * Util for merge default and theme to option\r\n       */\n      SeriesModel.prototype.mergeDefaultAndTheme = function (option, ecModel) {\n        var layoutMode = fetchLayoutMode(this);\n        var inputPositionParams = layoutMode ? getLayoutParams(option) : {};\n        // Backward compat: using subType on theme.\n        // But if name duplicate between series subType\n        // (for example: parallel) add component mainType,\n        // add suffix 'Series'.\n        var themeSubType = this.subType;\n        if (ComponentModel.hasClass(themeSubType)) {\n          themeSubType += 'Series';\n        }\n        merge(option, ecModel.getTheme().get(this.subType));\n        merge(option, this.getDefaultOption());\n        // Default label emphasis `show`\n        defaultEmphasis(option, 'label', ['show']);\n        this.fillDataTextStyle(option.data);\n        if (layoutMode) {\n          mergeLayoutParam(option, inputPositionParams, layoutMode);\n        }\n      };\n      SeriesModel.prototype.mergeOption = function (newSeriesOption, ecModel) {\n        // this.settingTask.dirty();\n        newSeriesOption = merge(this.option, newSeriesOption, true);\n        this.fillDataTextStyle(newSeriesOption.data);\n        var layoutMode = fetchLayoutMode(this);\n        if (layoutMode) {\n          mergeLayoutParam(this.option, newSeriesOption, layoutMode);\n        }\n        var sourceManager = inner$1(this).sourceManager;\n        sourceManager.dirty();\n        sourceManager.prepareSource();\n        var data = this.getInitialData(newSeriesOption, ecModel);\n        wrapData(data, this);\n        this.dataTask.dirty();\n        this.dataTask.context.data = data;\n        inner$1(this).dataBeforeProcessed = data;\n        autoSeriesName(this);\n        this._initSelectedMapFromData(data);\n      };\n      SeriesModel.prototype.fillDataTextStyle = function (data) {\n        // Default data label emphasis `show`\n        // FIXME Tree structure data ?\n        // FIXME Performance ?\n        if (data && !isTypedArray(data)) {\n          var props = ['show'];\n          for (var i = 0; i < data.length; i++) {\n            if (data[i] && data[i].label) {\n              defaultEmphasis(data[i], 'label', props);\n            }\n          }\n        }\n      };\n      /**\r\n       * Init a data structure from data related option in series\r\n       * Must be overridden.\r\n       */\n      SeriesModel.prototype.getInitialData = function (option, ecModel) {\n        return;\n      };\n      /**\r\n       * Append data to list\r\n       */\n      SeriesModel.prototype.appendData = function (params) {\n        // FIXME ???\n        // (1) If data from dataset, forbidden append.\n        // (2) support append data of dataset.\n        var data = this.getRawData();\n        data.appendData(params.data);\n      };\n      /**\r\n       * Consider some method like `filter`, `map` need make new data,\r\n       * We should make sure that `seriesModel.getData()` get correct\r\n       * data in the stream procedure. So we fetch data from upstream\r\n       * each time `task.perform` called.\r\n       */\n      SeriesModel.prototype.getData = function (dataType) {\n        var task = getCurrentTask(this);\n        if (task) {\n          var data = task.context.data;\n          return dataType == null || !data.getLinkedData ? data : data.getLinkedData(dataType);\n        } else {\n          // When series is not alive (that may happen when click toolbox\n          // restore or setOption with not merge mode), series data may\n          // be still need to judge animation or something when graphic\n          // elements want to know whether fade out.\n          return inner$1(this).data;\n        }\n      };\n      SeriesModel.prototype.getAllData = function () {\n        var mainData = this.getData();\n        return mainData && mainData.getLinkedDataAll ? mainData.getLinkedDataAll() : [{\n          data: mainData\n        }];\n      };\n      SeriesModel.prototype.setData = function (data) {\n        var task = getCurrentTask(this);\n        if (task) {\n          var context = task.context;\n          // Consider case: filter, data sample.\n          // FIXME:TS never used, so comment it\n          // if (context.data !== data && task.modifyOutputEnd) {\n          //     task.setOutputEnd(data.count());\n          // }\n          context.outputData = data;\n          // Caution: setData should update context.data,\n          // Because getData may be called multiply in a\n          // single stage and expect to get the data just\n          // set. (For example, AxisProxy, x y both call\n          // getData and setDate sequentially).\n          // So the context.data should be fetched from\n          // upstream each time when a stage starts to be\n          // performed.\n          if (task !== this.dataTask) {\n            context.data = data;\n          }\n        }\n        inner$1(this).data = data;\n      };\n      SeriesModel.prototype.getEncode = function () {\n        var encode = this.get('encode', true);\n        if (encode) {\n          return createHashMap(encode);\n        }\n      };\n      SeriesModel.prototype.getSourceManager = function () {\n        return inner$1(this).sourceManager;\n      };\n      SeriesModel.prototype.getSource = function () {\n        return this.getSourceManager().getSource();\n      };\n      /**\r\n       * Get data before processed\r\n       */\n      SeriesModel.prototype.getRawData = function () {\n        return inner$1(this).dataBeforeProcessed;\n      };\n      SeriesModel.prototype.getColorBy = function () {\n        var colorBy = this.get('colorBy');\n        return colorBy || 'series';\n      };\n      SeriesModel.prototype.isColorBySeries = function () {\n        return this.getColorBy() === 'series';\n      };\n      /**\r\n       * Get base axis if has coordinate system and has axis.\r\n       * By default use coordSys.getBaseAxis();\r\n       * Can be overridden for some chart.\r\n       * @return {type} description\r\n       */\n      SeriesModel.prototype.getBaseAxis = function () {\n        var coordSys = this.coordinateSystem;\n        // @ts-ignore\n        return coordSys && coordSys.getBaseAxis && coordSys.getBaseAxis();\n      };\n      /**\r\n       * Default tooltip formatter\r\n       *\r\n       * @param dataIndex\r\n       * @param multipleSeries\r\n       * @param dataType\r\n       * @param renderMode valid values: 'html'(by default) and 'richText'.\r\n       *        'html' is used for rendering tooltip in extra DOM form, and the result\r\n       *        string is used as DOM HTML content.\r\n       *        'richText' is used for rendering tooltip in rich text form, for those where\r\n       *        DOM operation is not supported.\r\n       * @return formatted tooltip with `html` and `markers`\r\n       *        Notice: The override method can also return string\r\n       */\n      SeriesModel.prototype.formatTooltip = function (dataIndex, multipleSeries, dataType) {\n        return defaultSeriesFormatTooltip({\n          series: this,\n          dataIndex: dataIndex,\n          multipleSeries: multipleSeries\n        });\n      };\n      SeriesModel.prototype.isAnimationEnabled = function () {\n        var ecModel = this.ecModel;\n        // Disable animation if using echarts in node but not give ssr flag.\n        // In ssr mode, renderToString will generate svg with css animation.\n        if (env.node && !(ecModel && ecModel.ssr)) {\n          return false;\n        }\n        var animationEnabled = this.getShallow('animation');\n        if (animationEnabled) {\n          if (this.getData().count() > this.getShallow('animationThreshold')) {\n            animationEnabled = false;\n          }\n        }\n        return !!animationEnabled;\n      };\n      SeriesModel.prototype.restoreData = function () {\n        this.dataTask.dirty();\n      };\n      SeriesModel.prototype.getColorFromPalette = function (name, scope, requestColorNum) {\n        var ecModel = this.ecModel;\n        // PENDING\n        var color = PaletteMixin.prototype.getColorFromPalette.call(this, name, scope, requestColorNum);\n        if (!color) {\n          color = ecModel.getColorFromPalette(name, scope, requestColorNum);\n        }\n        return color;\n      };\n      /**\r\n       * Use `data.mapDimensionsAll(coordDim)` instead.\r\n       * @deprecated\r\n       */\n      SeriesModel.prototype.coordDimToDataDim = function (coordDim) {\n        return this.getRawData().mapDimensionsAll(coordDim);\n      };\n      /**\r\n       * Get progressive rendering count each step\r\n       */\n      SeriesModel.prototype.getProgressive = function () {\n        return this.get('progressive');\n      };\n      /**\r\n       * Get progressive rendering count each step\r\n       */\n      SeriesModel.prototype.getProgressiveThreshold = function () {\n        return this.get('progressiveThreshold');\n      };\n      // PENGING If selectedMode is null ?\n      SeriesModel.prototype.select = function (innerDataIndices, dataType) {\n        this._innerSelect(this.getData(dataType), innerDataIndices);\n      };\n      SeriesModel.prototype.unselect = function (innerDataIndices, dataType) {\n        var selectedMap = this.option.selectedMap;\n        if (!selectedMap) {\n          return;\n        }\n        var selectedMode = this.option.selectedMode;\n        var data = this.getData(dataType);\n        if (selectedMode === 'series' || selectedMap === 'all') {\n          this.option.selectedMap = {};\n          this._selectedDataIndicesMap = {};\n          return;\n        }\n        for (var i = 0; i < innerDataIndices.length; i++) {\n          var dataIndex = innerDataIndices[i];\n          var nameOrId = getSelectionKey(data, dataIndex);\n          selectedMap[nameOrId] = false;\n          this._selectedDataIndicesMap[nameOrId] = -1;\n        }\n      };\n      SeriesModel.prototype.toggleSelect = function (innerDataIndices, dataType) {\n        var tmpArr = [];\n        for (var i = 0; i < innerDataIndices.length; i++) {\n          tmpArr[0] = innerDataIndices[i];\n          this.isSelected(innerDataIndices[i], dataType) ? this.unselect(tmpArr, dataType) : this.select(tmpArr, dataType);\n        }\n      };\n      SeriesModel.prototype.getSelectedDataIndices = function () {\n        if (this.option.selectedMap === 'all') {\n          return [].slice.call(this.getData().getIndices());\n        }\n        var selectedDataIndicesMap = this._selectedDataIndicesMap;\n        var nameOrIds = keys(selectedDataIndicesMap);\n        var dataIndices = [];\n        for (var i = 0; i < nameOrIds.length; i++) {\n          var dataIndex = selectedDataIndicesMap[nameOrIds[i]];\n          if (dataIndex >= 0) {\n            dataIndices.push(dataIndex);\n          }\n        }\n        return dataIndices;\n      };\n      SeriesModel.prototype.isSelected = function (dataIndex, dataType) {\n        var selectedMap = this.option.selectedMap;\n        if (!selectedMap) {\n          return false;\n        }\n        var data = this.getData(dataType);\n        return (selectedMap === 'all' || selectedMap[getSelectionKey(data, dataIndex)]) && !data.getItemModel(dataIndex).get(['select', 'disabled']);\n      };\n      SeriesModel.prototype.isUniversalTransitionEnabled = function () {\n        if (this[SERIES_UNIVERSAL_TRANSITION_PROP]) {\n          return true;\n        }\n        var universalTransitionOpt = this.option.universalTransition;\n        // Quick reject\n        if (!universalTransitionOpt) {\n          return false;\n        }\n        if (universalTransitionOpt === true) {\n          return true;\n        }\n        // Can be simply 'universalTransition: true'\n        return universalTransitionOpt && universalTransitionOpt.enabled;\n      };\n      SeriesModel.prototype._innerSelect = function (data, innerDataIndices) {\n        var _a, _b;\n        var option = this.option;\n        var selectedMode = option.selectedMode;\n        var len = innerDataIndices.length;\n        if (!selectedMode || !len) {\n          return;\n        }\n        if (selectedMode === 'series') {\n          option.selectedMap = 'all';\n        } else if (selectedMode === 'multiple') {\n          if (!isObject(option.selectedMap)) {\n            option.selectedMap = {};\n          }\n          var selectedMap = option.selectedMap;\n          for (var i = 0; i < len; i++) {\n            var dataIndex = innerDataIndices[i];\n            // TODO different types of data share same object.\n            var nameOrId = getSelectionKey(data, dataIndex);\n            selectedMap[nameOrId] = true;\n            this._selectedDataIndicesMap[nameOrId] = data.getRawIndex(dataIndex);\n          }\n        } else if (selectedMode === 'single' || selectedMode === true) {\n          var lastDataIndex = innerDataIndices[len - 1];\n          var nameOrId = getSelectionKey(data, lastDataIndex);\n          option.selectedMap = (_a = {}, _a[nameOrId] = true, _a);\n          this._selectedDataIndicesMap = (_b = {}, _b[nameOrId] = data.getRawIndex(lastDataIndex), _b);\n        }\n      };\n      SeriesModel.prototype._initSelectedMapFromData = function (data) {\n        // Ignore select info in data if selectedMap exists.\n        // NOTE It's only for legacy usage. edge data is not supported.\n        if (this.option.selectedMap) {\n          return;\n        }\n        var dataIndices = [];\n        if (data.hasItemOption) {\n          data.each(function (idx) {\n            var rawItem = data.getRawDataItem(idx);\n            if (rawItem && rawItem.selected) {\n              dataIndices.push(idx);\n            }\n          });\n        }\n        if (dataIndices.length > 0) {\n          this._innerSelect(data, dataIndices);\n        }\n      };\n      // /**\n      //  * @see {module:echarts/stream/Scheduler}\n      //  */\n      // abstract pipeTask: null\n      SeriesModel.registerClass = function (clz) {\n        return ComponentModel.registerClass(clz);\n      };\n      SeriesModel.protoInitialize = function () {\n        var proto = SeriesModel.prototype;\n        proto.type = 'series.__base__';\n        proto.seriesIndex = 0;\n        proto.ignoreStyleOnData = false;\n        proto.hasSymbolVisual = false;\n        proto.defaultSymbol = 'circle';\n        // Make sure the values can be accessed!\n        proto.visualStyleAccessPath = 'itemStyle';\n        proto.visualDrawType = 'fill';\n      }();\n      return SeriesModel;\n    }(ComponentModel);\n    mixin(SeriesModel, DataFormatMixin);\n    mixin(SeriesModel, PaletteMixin);\n    mountExtend(SeriesModel, ComponentModel);\n    /**\r\n     * MUST be called after `prepareSource` called\r\n     * Here we need to make auto series, especially for auto legend. But we\r\n     * do not modify series.name in option to avoid side effects.\r\n     */\n    function autoSeriesName(seriesModel) {\n      // User specified name has higher priority, otherwise it may cause\n      // series can not be queried unexpectedly.\n      var name = seriesModel.name;\n      if (!isNameSpecified(seriesModel)) {\n        seriesModel.name = getSeriesAutoName(seriesModel) || name;\n      }\n    }\n    function getSeriesAutoName(seriesModel) {\n      var data = seriesModel.getRawData();\n      var dataDims = data.mapDimensionsAll('seriesName');\n      var nameArr = [];\n      each(dataDims, function (dataDim) {\n        var dimInfo = data.getDimensionInfo(dataDim);\n        dimInfo.displayName && nameArr.push(dimInfo.displayName);\n      });\n      return nameArr.join(' ');\n    }\n    function dataTaskCount(context) {\n      return context.model.getRawData().count();\n    }\n    function dataTaskReset(context) {\n      var seriesModel = context.model;\n      seriesModel.setData(seriesModel.getRawData().cloneShallow());\n      return dataTaskProgress;\n    }\n    function dataTaskProgress(param, context) {\n      // Avoid repeat cloneShallow when data just created in reset.\n      if (context.outputData && param.end > context.outputData.count()) {\n        context.model.getRawData().cloneShallow(context.outputData);\n      }\n    }\n    // TODO refactor\n    function wrapData(data, seriesModel) {\n      each(concatArray(data.CHANGABLE_METHODS, data.DOWNSAMPLE_METHODS), function (methodName) {\n        data.wrapMethod(methodName, curry(onDataChange, seriesModel));\n      });\n    }\n    function onDataChange(seriesModel, newList) {\n      var task = getCurrentTask(seriesModel);\n      if (task) {\n        // Consider case: filter, selectRange\n        task.setOutputEnd((newList || this).count());\n      }\n      return newList;\n    }\n    function getCurrentTask(seriesModel) {\n      var scheduler = (seriesModel.ecModel || {}).scheduler;\n      var pipeline = scheduler && scheduler.getPipeline(seriesModel.uid);\n      if (pipeline) {\n        // When pipline finished, the currrentTask keep the last\n        // task (renderTask).\n        var task = pipeline.currentTask;\n        if (task) {\n          var agentStubMap = task.agentStubMap;\n          if (agentStubMap) {\n            task = agentStubMap.get(seriesModel.uid);\n          }\n        }\n        return task;\n      }\n    }\n\n    var ComponentView = /** @class */function () {\n      function ComponentView() {\n        this.group = new Group();\n        this.uid = getUID('viewComponent');\n      }\n      ComponentView.prototype.init = function (ecModel, api) {};\n      ComponentView.prototype.render = function (model, ecModel, api, payload) {};\n      ComponentView.prototype.dispose = function (ecModel, api) {};\n      ComponentView.prototype.updateView = function (model, ecModel, api, payload) {\n        // Do nothing;\n      };\n      ComponentView.prototype.updateLayout = function (model, ecModel, api, payload) {\n        // Do nothing;\n      };\n      ComponentView.prototype.updateVisual = function (model, ecModel, api, payload) {\n        // Do nothing;\n      };\n      /**\r\n       * Hook for toggle blur target series.\r\n       * Can be used in marker for blur or leave blur the markers\r\n       */\n      ComponentView.prototype.toggleBlurSeries = function (seriesModels, isBlur, ecModel) {\n        // Do nothing;\n      };\n      /**\r\n       * Traverse the new rendered elements.\r\n       *\r\n       * It will traverse the new added element in progressive rendering.\r\n       * And traverse all in normal rendering.\r\n       */\n      ComponentView.prototype.eachRendered = function (cb) {\n        var group = this.group;\n        if (group) {\n          group.traverse(cb);\n        }\n      };\n      return ComponentView;\n    }();\n    enableClassExtend(ComponentView);\n    enableClassManagement(ComponentView);\n\n    /**\r\n     * @return {string} If large mode changed, return string 'reset';\r\n     */\n    function createRenderPlanner() {\n      var inner = makeInner();\n      return function (seriesModel) {\n        var fields = inner(seriesModel);\n        var pipelineContext = seriesModel.pipelineContext;\n        var originalLarge = !!fields.large;\n        var originalProgressive = !!fields.progressiveRender;\n        // FIXME: if the planner works on a filtered series, `pipelineContext` does not\n        // exists. See #11611 . Probably we need to modify this structure, see the comment\n        // on `performRawSeries` in `Schedular.js`.\n        var large = fields.large = !!(pipelineContext && pipelineContext.large);\n        var progressive = fields.progressiveRender = !!(pipelineContext && pipelineContext.progressiveRender);\n        return !!(originalLarge !== large || originalProgressive !== progressive) && 'reset';\n      };\n    }\n\n    var inner$2 = makeInner();\n    var renderPlanner = createRenderPlanner();\n    var ChartView = /** @class */function () {\n      function ChartView() {\n        this.group = new Group();\n        this.uid = getUID('viewChart');\n        this.renderTask = createTask({\n          plan: renderTaskPlan,\n          reset: renderTaskReset\n        });\n        this.renderTask.context = {\n          view: this\n        };\n      }\n      ChartView.prototype.init = function (ecModel, api) {};\n      ChartView.prototype.render = function (seriesModel, ecModel, api, payload) {\n        if (\"development\" !== 'production') {\n          throw new Error('render method must been implemented');\n        }\n      };\n      /**\r\n       * Highlight series or specified data item.\r\n       */\n      ChartView.prototype.highlight = function (seriesModel, ecModel, api, payload) {\n        var data = seriesModel.getData(payload && payload.dataType);\n        if (!data) {\n          if (\"development\" !== 'production') {\n            error(\"Unknown dataType \" + payload.dataType);\n          }\n          return;\n        }\n        toggleHighlight(data, payload, 'emphasis');\n      };\n      /**\r\n       * Downplay series or specified data item.\r\n       */\n      ChartView.prototype.downplay = function (seriesModel, ecModel, api, payload) {\n        var data = seriesModel.getData(payload && payload.dataType);\n        if (!data) {\n          if (\"development\" !== 'production') {\n            error(\"Unknown dataType \" + payload.dataType);\n          }\n          return;\n        }\n        toggleHighlight(data, payload, 'normal');\n      };\n      /**\r\n       * Remove self.\r\n       */\n      ChartView.prototype.remove = function (ecModel, api) {\n        this.group.removeAll();\n      };\n      /**\r\n       * Dispose self.\r\n       */\n      ChartView.prototype.dispose = function (ecModel, api) {};\n      ChartView.prototype.updateView = function (seriesModel, ecModel, api, payload) {\n        this.render(seriesModel, ecModel, api, payload);\n      };\n      // FIXME never used?\n      ChartView.prototype.updateLayout = function (seriesModel, ecModel, api, payload) {\n        this.render(seriesModel, ecModel, api, payload);\n      };\n      // FIXME never used?\n      ChartView.prototype.updateVisual = function (seriesModel, ecModel, api, payload) {\n        this.render(seriesModel, ecModel, api, payload);\n      };\n      /**\r\n       * Traverse the new rendered elements.\r\n       *\r\n       * It will traverse the new added element in progressive rendering.\r\n       * And traverse all in normal rendering.\r\n       */\n      ChartView.prototype.eachRendered = function (cb) {\n        traverseElements(this.group, cb);\n      };\n      ChartView.markUpdateMethod = function (payload, methodName) {\n        inner$2(payload).updateMethod = methodName;\n      };\n      ChartView.protoInitialize = function () {\n        var proto = ChartView.prototype;\n        proto.type = 'chart';\n      }();\n      return ChartView;\n    }();\n    /**\r\n     * Set state of single element\r\n     */\n    function elSetState(el, state, highlightDigit) {\n      if (el && isHighDownDispatcher(el)) {\n        (state === 'emphasis' ? enterEmphasis : leaveEmphasis)(el, highlightDigit);\n      }\n    }\n    function toggleHighlight(data, payload, state) {\n      var dataIndex = queryDataIndex(data, payload);\n      var highlightDigit = payload && payload.highlightKey != null ? getHighlightDigit(payload.highlightKey) : null;\n      if (dataIndex != null) {\n        each(normalizeToArray(dataIndex), function (dataIdx) {\n          elSetState(data.getItemGraphicEl(dataIdx), state, highlightDigit);\n        });\n      } else {\n        data.eachItemGraphicEl(function (el) {\n          elSetState(el, state, highlightDigit);\n        });\n      }\n    }\n    enableClassExtend(ChartView, ['dispose']);\n    enableClassManagement(ChartView);\n    function renderTaskPlan(context) {\n      return renderPlanner(context.model);\n    }\n    function renderTaskReset(context) {\n      var seriesModel = context.model;\n      var ecModel = context.ecModel;\n      var api = context.api;\n      var payload = context.payload;\n      // FIXME: remove updateView updateVisual\n      var progressiveRender = seriesModel.pipelineContext.progressiveRender;\n      var view = context.view;\n      var updateMethod = payload && inner$2(payload).updateMethod;\n      var methodName = progressiveRender ? 'incrementalPrepareRender' : updateMethod && view[updateMethod] ? updateMethod\n      // `appendData` is also supported when data amount\n      // is less than progressive threshold.\n      : 'render';\n      if (methodName !== 'render') {\n        view[methodName](seriesModel, ecModel, api, payload);\n      }\n      return progressMethodMap[methodName];\n    }\n    var progressMethodMap = {\n      incrementalPrepareRender: {\n        progress: function (params, context) {\n          context.view.incrementalRender(params, context.model, context.ecModel, context.api, context.payload);\n        }\n      },\n      render: {\n        // Put view.render in `progress` to support appendData. But in this case\n        // view.render should not be called in reset, otherwise it will be called\n        // twise. Use `forceFirstProgress` to make sure that view.render is called\n        // in any cases.\n        forceFirstProgress: true,\n        progress: function (params, context) {\n          context.view.render(context.model, context.ecModel, context.api, context.payload);\n        }\n      }\n    };\n\n    /*\n    * Licensed to the Apache Software Foundation (ASF) under one\n    * or more contributor license agreements.  See the NOTICE file\n    * distributed with this work for additional information\n    * regarding copyright ownership.  The ASF licenses this file\n    * to you under the Apache License, Version 2.0 (the\n    * \"License\"); you may not use this file except in compliance\n    * with the License.  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,\n    * software distributed under the License is distributed on an\n    * \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\n    * KIND, either express or implied.  See the License for the\n    * specific language governing permissions and limitations\n    * under the License.\n    */\n\n\n    /**\n     * AUTO-GENERATED FILE. DO NOT MODIFY.\n     */\n\n    /*\r\n    * Licensed to the Apache Software Foundation (ASF) under one\r\n    * or more contributor license agreements.  See the NOTICE file\r\n    * distributed with this work for additional information\r\n    * regarding copyright ownership.  The ASF licenses this file\r\n    * to you under the Apache License, Version 2.0 (the\r\n    * \"License\"); you may not use this file except in compliance\r\n    * with the License.  You may obtain a copy of the License at\r\n    *\r\n    *   http://www.apache.org/licenses/LICENSE-2.0\r\n    *\r\n    * Unless required by applicable law or agreed to in writing,\r\n    * software distributed under the License is distributed on an\r\n    * \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\r\n    * KIND, either express or implied.  See the License for the\r\n    * specific language governing permissions and limitations\r\n    * under the License.\r\n    */\n    var ORIGIN_METHOD = '\\0__throttleOriginMethod';\n    var RATE = '\\0__throttleRate';\n    var THROTTLE_TYPE = '\\0__throttleType';\n    /**\r\n     * @public\r\n     * @param {(Function)} fn\r\n     * @param {number} [delay=0] Unit: ms.\r\n     * @param {boolean} [debounce=false]\r\n     *        true: If call interval less than `delay`, only the last call works.\r\n     *        false: If call interval less than `delay, call works on fixed rate.\r\n     * @return {(Function)} throttled fn.\r\n     */\n    function throttle(fn, delay, debounce) {\n      var currCall;\n      var lastCall = 0;\n      var lastExec = 0;\n      var timer = null;\n      var diff;\n      var scope;\n      var args;\n      var debounceNextCall;\n      delay = delay || 0;\n      function exec() {\n        lastExec = new Date().getTime();\n        timer = null;\n        fn.apply(scope, args || []);\n      }\n      var cb = function () {\n        var cbArgs = [];\n        for (var _i = 0; _i < arguments.length; _i++) {\n          cbArgs[_i] = arguments[_i];\n        }\n        currCall = new Date().getTime();\n        scope = this;\n        args = cbArgs;\n        var thisDelay = debounceNextCall || delay;\n        var thisDebounce = debounceNextCall || debounce;\n        debounceNextCall = null;\n        diff = currCall - (thisDebounce ? lastCall : lastExec) - thisDelay;\n        clearTimeout(timer);\n        // Here we should make sure that: the `exec` SHOULD NOT be called later\n        // than a new call of `cb`, that is, preserving the command order. Consider\n        // calculating \"scale rate\" when roaming as an example. When a call of `cb`\n        // happens, either the `exec` is called dierectly, or the call is delayed.\n        // But the delayed call should never be later than next call of `cb`. Under\n        // this assurance, we can simply update view state each time `dispatchAction`\n        // triggered by user roaming, but not need to add extra code to avoid the\n        // state being \"rolled-back\".\n        if (thisDebounce) {\n          timer = setTimeout(exec, thisDelay);\n        } else {\n          if (diff >= 0) {\n            exec();\n          } else {\n            timer = setTimeout(exec, -diff);\n          }\n        }\n        lastCall = currCall;\n      };\n      /**\r\n       * Clear throttle.\r\n       * @public\r\n       */\n      cb.clear = function () {\n        if (timer) {\n          clearTimeout(timer);\n          timer = null;\n        }\n      };\n      /**\r\n       * Enable debounce once.\r\n       */\n      cb.debounceNextCall = function (debounceDelay) {\n        debounceNextCall = debounceDelay;\n      };\n      return cb;\n    }\n    /**\r\n     * Create throttle method or update throttle rate.\r\n     *\r\n     * @example\r\n     * ComponentView.prototype.render = function () {\r\n     *     ...\r\n     *     throttle.createOrUpdate(\r\n     *         this,\r\n     *         '_dispatchAction',\r\n     *         this.model.get('throttle'),\r\n     *         'fixRate'\r\n     *     );\r\n     * };\r\n     * ComponentView.prototype.remove = function () {\r\n     *     throttle.clear(this, '_dispatchAction');\r\n     * };\r\n     * ComponentView.prototype.dispose = function () {\r\n     *     throttle.clear(this, '_dispatchAction');\r\n     * };\r\n     *\r\n     */\n    function createOrUpdate(obj, fnAttr, rate, throttleType) {\n      var fn = obj[fnAttr];\n      if (!fn) {\n        return;\n      }\n      var originFn = fn[ORIGIN_METHOD] || fn;\n      var lastThrottleType = fn[THROTTLE_TYPE];\n      var lastRate = fn[RATE];\n      if (lastRate !== rate || lastThrottleType !== throttleType) {\n        if (rate == null || !throttleType) {\n          return obj[fnAttr] = originFn;\n        }\n        fn = obj[fnAttr] = throttle(originFn, rate, throttleType === 'debounce');\n        fn[ORIGIN_METHOD] = originFn;\n        fn[THROTTLE_TYPE] = throttleType;\n        fn[RATE] = rate;\n      }\n      return fn;\n    }\n    /**\r\n     * Clear throttle. Example see throttle.createOrUpdate.\r\n     */\n    function clear(obj, fnAttr) {\n      var fn = obj[fnAttr];\n      if (fn && fn[ORIGIN_METHOD]) {\n        // Clear throttle\n        fn.clear && fn.clear();\n        obj[fnAttr] = fn[ORIGIN_METHOD];\n      }\n    }\n\n    var inner$3 = makeInner();\n    var defaultStyleMappers = {\n      itemStyle: makeStyleMapper(ITEM_STYLE_KEY_MAP, true),\n      lineStyle: makeStyleMapper(LINE_STYLE_KEY_MAP, true)\n    };\n    var defaultColorKey = {\n      lineStyle: 'stroke',\n      itemStyle: 'fill'\n    };\n    function getStyleMapper(seriesModel, stylePath) {\n      var styleMapper = seriesModel.visualStyleMapper || defaultStyleMappers[stylePath];\n      if (!styleMapper) {\n        console.warn(\"Unknown style type '\" + stylePath + \"'.\");\n        return defaultStyleMappers.itemStyle;\n      }\n      return styleMapper;\n    }\n    function getDefaultColorKey(seriesModel, stylePath) {\n      // return defaultColorKey[stylePath] ||\n      var colorKey = seriesModel.visualDrawType || defaultColorKey[stylePath];\n      if (!colorKey) {\n        console.warn(\"Unknown style type '\" + stylePath + \"'.\");\n        return 'fill';\n      }\n      return colorKey;\n    }\n    var seriesStyleTask = {\n      createOnAllSeries: true,\n      performRawSeries: true,\n      reset: function (seriesModel, ecModel) {\n        var data = seriesModel.getData();\n        var stylePath = seriesModel.visualStyleAccessPath || 'itemStyle';\n        // Set in itemStyle\n        var styleModel = seriesModel.getModel(stylePath);\n        var getStyle = getStyleMapper(seriesModel, stylePath);\n        var globalStyle = getStyle(styleModel);\n        var decalOption = styleModel.getShallow('decal');\n        if (decalOption) {\n          data.setVisual('decal', decalOption);\n          decalOption.dirty = true;\n        }\n        // TODO\n        var colorKey = getDefaultColorKey(seriesModel, stylePath);\n        var color = globalStyle[colorKey];\n        // TODO style callback\n        var colorCallback = isFunction(color) ? color : null;\n        var hasAutoColor = globalStyle.fill === 'auto' || globalStyle.stroke === 'auto';\n        // Get from color palette by default.\n        if (!globalStyle[colorKey] || colorCallback || hasAutoColor) {\n          // Note: If some series has color specified (e.g., by itemStyle.color), we DO NOT\n          // make it effect palette. Because some scenarios users need to make some series\n          // transparent or as background, which should better not effect the palette.\n          var colorPalette = seriesModel.getColorFromPalette(\n          // TODO series count changed.\n          seriesModel.name, null, ecModel.getSeriesCount());\n          if (!globalStyle[colorKey]) {\n            globalStyle[colorKey] = colorPalette;\n            data.setVisual('colorFromPalette', true);\n          }\n          globalStyle.fill = globalStyle.fill === 'auto' || isFunction(globalStyle.fill) ? colorPalette : globalStyle.fill;\n          globalStyle.stroke = globalStyle.stroke === 'auto' || isFunction(globalStyle.stroke) ? colorPalette : globalStyle.stroke;\n        }\n        data.setVisual('style', globalStyle);\n        data.setVisual('drawType', colorKey);\n        // Only visible series has each data be visual encoded\n        if (!ecModel.isSeriesFiltered(seriesModel) && colorCallback) {\n          data.setVisual('colorFromPalette', false);\n          return {\n            dataEach: function (data, idx) {\n              var dataParams = seriesModel.getDataParams(idx);\n              var itemStyle = extend({}, globalStyle);\n              itemStyle[colorKey] = colorCallback(dataParams);\n              data.setItemVisual(idx, 'style', itemStyle);\n            }\n          };\n        }\n      }\n    };\n    var sharedModel = new Model();\n    var dataStyleTask = {\n      createOnAllSeries: true,\n      performRawSeries: true,\n      reset: function (seriesModel, ecModel) {\n        if (seriesModel.ignoreStyleOnData || ecModel.isSeriesFiltered(seriesModel)) {\n          return;\n        }\n        var data = seriesModel.getData();\n        var stylePath = seriesModel.visualStyleAccessPath || 'itemStyle';\n        // Set in itemStyle\n        var getStyle = getStyleMapper(seriesModel, stylePath);\n        var colorKey = data.getVisual('drawType');\n        return {\n          dataEach: data.hasItemOption ? function (data, idx) {\n            // Not use getItemModel for performance considuration\n            var rawItem = data.getRawDataItem(idx);\n            if (rawItem && rawItem[stylePath]) {\n              sharedModel.option = rawItem[stylePath];\n              var style = getStyle(sharedModel);\n              var existsStyle = data.ensureUniqueItemVisual(idx, 'style');\n              extend(existsStyle, style);\n              if (sharedModel.option.decal) {\n                data.setItemVisual(idx, 'decal', sharedModel.option.decal);\n                sharedModel.option.decal.dirty = true;\n              }\n              if (colorKey in style) {\n                data.setItemVisual(idx, 'colorFromPalette', false);\n              }\n            }\n          } : null\n        };\n      }\n    };\n    // Pick color from palette for the data which has not been set with color yet.\n    // Note: do not support stream rendering. No such cases yet.\n    var dataColorPaletteTask = {\n      performRawSeries: true,\n      overallReset: function (ecModel) {\n        // Each type of series uses one scope.\n        // Pie and funnel are using different scopes.\n        var paletteScopeGroupByType = createHashMap();\n        ecModel.eachSeries(function (seriesModel) {\n          var colorBy = seriesModel.getColorBy();\n          if (seriesModel.isColorBySeries()) {\n            return;\n          }\n          var key = seriesModel.type + '-' + colorBy;\n          var colorScope = paletteScopeGroupByType.get(key);\n          if (!colorScope) {\n            colorScope = {};\n            paletteScopeGroupByType.set(key, colorScope);\n          }\n          inner$3(seriesModel).scope = colorScope;\n        });\n        ecModel.eachSeries(function (seriesModel) {\n          if (seriesModel.isColorBySeries() || ecModel.isSeriesFiltered(seriesModel)) {\n            return;\n          }\n          var dataAll = seriesModel.getRawData();\n          var idxMap = {};\n          var data = seriesModel.getData();\n          var colorScope = inner$3(seriesModel).scope;\n          var stylePath = seriesModel.visualStyleAccessPath || 'itemStyle';\n          var colorKey = getDefaultColorKey(seriesModel, stylePath);\n          data.each(function (idx) {\n            var rawIdx = data.getRawIndex(idx);\n            idxMap[rawIdx] = idx;\n          });\n          // Iterate on data before filtered. To make sure color from palette can be\n          // Consistent when toggling legend.\n          dataAll.each(function (rawIdx) {\n            var idx = idxMap[rawIdx];\n            var fromPalette = data.getItemVisual(idx, 'colorFromPalette');\n            // Get color from palette for each data only when the color is inherited from series color, which is\n            // also picked from color palette. So following situation is not in the case:\n            // 1. series.itemStyle.color is set\n            // 2. color is encoded by visualMap\n            if (fromPalette) {\n              var itemStyle = data.ensureUniqueItemVisual(idx, 'style');\n              var name_1 = dataAll.getName(rawIdx) || rawIdx + '';\n              var dataCount = dataAll.count();\n              itemStyle[colorKey] = seriesModel.getColorFromPalette(name_1, colorScope, dataCount);\n            }\n          });\n        });\n      }\n    };\n\n    var PI$3 = Math.PI;\n    /**\r\n     * @param {module:echarts/ExtensionAPI} api\r\n     * @param {Object} [opts]\r\n     * @param {string} [opts.text]\r\n     * @param {string} [opts.color]\r\n     * @param {string} [opts.textColor]\r\n     * @return {module:zrender/Element}\r\n     */\n    function defaultLoading(api, opts) {\n      opts = opts || {};\n      defaults(opts, {\n        text: 'loading',\n        textColor: '#000',\n        fontSize: 12,\n        fontWeight: 'normal',\n        fontStyle: 'normal',\n        fontFamily: 'sans-serif',\n        maskColor: 'rgba(255, 255, 255, 0.8)',\n        showSpinner: true,\n        color: '#5470c6',\n        spinnerRadius: 10,\n        lineWidth: 5,\n        zlevel: 0\n      });\n      var group = new Group();\n      var mask = new Rect({\n        style: {\n          fill: opts.maskColor\n        },\n        zlevel: opts.zlevel,\n        z: 10000\n      });\n      group.add(mask);\n      var textContent = new ZRText({\n        style: {\n          text: opts.text,\n          fill: opts.textColor,\n          fontSize: opts.fontSize,\n          fontWeight: opts.fontWeight,\n          fontStyle: opts.fontStyle,\n          fontFamily: opts.fontFamily\n        },\n        zlevel: opts.zlevel,\n        z: 10001\n      });\n      var labelRect = new Rect({\n        style: {\n          fill: 'none'\n        },\n        textContent: textContent,\n        textConfig: {\n          position: 'right',\n          distance: 10\n        },\n        zlevel: opts.zlevel,\n        z: 10001\n      });\n      group.add(labelRect);\n      var arc;\n      if (opts.showSpinner) {\n        arc = new Arc({\n          shape: {\n            startAngle: -PI$3 / 2,\n            endAngle: -PI$3 / 2 + 0.1,\n            r: opts.spinnerRadius\n          },\n          style: {\n            stroke: opts.color,\n            lineCap: 'round',\n            lineWidth: opts.lineWidth\n          },\n          zlevel: opts.zlevel,\n          z: 10001\n        });\n        arc.animateShape(true).when(1000, {\n          endAngle: PI$3 * 3 / 2\n        }).start('circularInOut');\n        arc.animateShape(true).when(1000, {\n          startAngle: PI$3 * 3 / 2\n        }).delay(300).start('circularInOut');\n        group.add(arc);\n      }\n      // Inject resize\n      group.resize = function () {\n        var textWidth = textContent.getBoundingRect().width;\n        var r = opts.showSpinner ? opts.spinnerRadius : 0;\n        // cx = (containerWidth - arcDiameter - textDistance - textWidth) / 2\n        // textDistance needs to be calculated when both animation and text exist\n        var cx = (api.getWidth() - r * 2 - (opts.showSpinner && textWidth ? 10 : 0) - textWidth) / 2 - (opts.showSpinner && textWidth ? 0 : 5 + textWidth / 2)\n        // only show the text\n        + (opts.showSpinner ? 0 : textWidth / 2)\n        // only show the spinner\n        + (textWidth ? 0 : r);\n        var cy = api.getHeight() / 2;\n        opts.showSpinner && arc.setShape({\n          cx: cx,\n          cy: cy\n        });\n        labelRect.setShape({\n          x: cx - r,\n          y: cy - r,\n          width: r * 2,\n          height: r * 2\n        });\n        mask.setShape({\n          x: 0,\n          y: 0,\n          width: api.getWidth(),\n          height: api.getHeight()\n        });\n      };\n      group.resize();\n      return group;\n    }\n\n    var Scheduler = /** @class */function () {\n      function Scheduler(ecInstance, api, dataProcessorHandlers, visualHandlers) {\n        // key: handlerUID\n        this._stageTaskMap = createHashMap();\n        this.ecInstance = ecInstance;\n        this.api = api;\n        // Fix current processors in case that in some rear cases that\n        // processors might be registered after echarts instance created.\n        // Register processors incrementally for a echarts instance is\n        // not supported by this stream architecture.\n        dataProcessorHandlers = this._dataProcessorHandlers = dataProcessorHandlers.slice();\n        visualHandlers = this._visualHandlers = visualHandlers.slice();\n        this._allHandlers = dataProcessorHandlers.concat(visualHandlers);\n      }\n      Scheduler.prototype.restoreData = function (ecModel, payload) {\n        // TODO: Only restore needed series and components, but not all components.\n        // Currently `restoreData` of all of the series and component will be called.\n        // But some independent components like `title`, `legend`, `graphic`, `toolbox`,\n        // `tooltip`, `axisPointer`, etc, do not need series refresh when `setOption`,\n        // and some components like coordinate system, axes, dataZoom, visualMap only\n        // need their target series refresh.\n        // (1) If we are implementing this feature some day, we should consider these cases:\n        // if a data processor depends on a component (e.g., dataZoomProcessor depends\n        // on the settings of `dataZoom`), it should be re-performed if the component\n        // is modified by `setOption`.\n        // (2) If a processor depends on sevral series, speicified by its `getTargetSeries`,\n        // it should be re-performed when the result array of `getTargetSeries` changed.\n        // We use `dependencies` to cover these issues.\n        // (3) How to update target series when coordinate system related components modified.\n        // TODO: simply the dirty mechanism? Check whether only the case here can set tasks dirty,\n        // and this case all of the tasks will be set as dirty.\n        ecModel.restoreData(payload);\n        // Theoretically an overall task not only depends on each of its target series, but also\n        // depends on all of the series.\n        // The overall task is not in pipeline, and `ecModel.restoreData` only set pipeline tasks\n        // dirty. If `getTargetSeries` of an overall task returns nothing, we should also ensure\n        // that the overall task is set as dirty and to be performed, otherwise it probably cause\n        // state chaos. So we have to set dirty of all of the overall tasks manually, otherwise it\n        // probably cause state chaos (consider `dataZoomProcessor`).\n        this._stageTaskMap.each(function (taskRecord) {\n          var overallTask = taskRecord.overallTask;\n          overallTask && overallTask.dirty();\n        });\n      };\n      // If seriesModel provided, incremental threshold is check by series data.\n      Scheduler.prototype.getPerformArgs = function (task, isBlock) {\n        // For overall task\n        if (!task.__pipeline) {\n          return;\n        }\n        var pipeline = this._pipelineMap.get(task.__pipeline.id);\n        var pCtx = pipeline.context;\n        var incremental = !isBlock && pipeline.progressiveEnabled && (!pCtx || pCtx.progressiveRender) && task.__idxInPipeline > pipeline.blockIndex;\n        var step = incremental ? pipeline.step : null;\n        var modDataCount = pCtx && pCtx.modDataCount;\n        var modBy = modDataCount != null ? Math.ceil(modDataCount / step) : null;\n        return {\n          step: step,\n          modBy: modBy,\n          modDataCount: modDataCount\n        };\n      };\n      Scheduler.prototype.getPipeline = function (pipelineId) {\n        return this._pipelineMap.get(pipelineId);\n      };\n      /**\r\n       * Current, progressive rendering starts from visual and layout.\r\n       * Always detect render mode in the same stage, avoiding that incorrect\r\n       * detection caused by data filtering.\r\n       * Caution:\r\n       * `updateStreamModes` use `seriesModel.getData()`.\r\n       */\n      Scheduler.prototype.updateStreamModes = function (seriesModel, view) {\n        var pipeline = this._pipelineMap.get(seriesModel.uid);\n        var data = seriesModel.getData();\n        var dataLen = data.count();\n        // `progressiveRender` means that can render progressively in each\n        // animation frame. Note that some types of series do not provide\n        // `view.incrementalPrepareRender` but support `chart.appendData`. We\n        // use the term `incremental` but not `progressive` to describe the\n        // case that `chart.appendData`.\n        var progressiveRender = pipeline.progressiveEnabled && view.incrementalPrepareRender && dataLen >= pipeline.threshold;\n        var large = seriesModel.get('large') && dataLen >= seriesModel.get('largeThreshold');\n        // TODO: modDataCount should not updated if `appendData`, otherwise cause whole repaint.\n        // see `test/candlestick-large3.html`\n        var modDataCount = seriesModel.get('progressiveChunkMode') === 'mod' ? dataLen : null;\n        seriesModel.pipelineContext = pipeline.context = {\n          progressiveRender: progressiveRender,\n          modDataCount: modDataCount,\n          large: large\n        };\n      };\n      Scheduler.prototype.restorePipelines = function (ecModel) {\n        var scheduler = this;\n        var pipelineMap = scheduler._pipelineMap = createHashMap();\n        ecModel.eachSeries(function (seriesModel) {\n          var progressive = seriesModel.getProgressive();\n          var pipelineId = seriesModel.uid;\n          pipelineMap.set(pipelineId, {\n            id: pipelineId,\n            head: null,\n            tail: null,\n            threshold: seriesModel.getProgressiveThreshold(),\n            progressiveEnabled: progressive && !(seriesModel.preventIncremental && seriesModel.preventIncremental()),\n            blockIndex: -1,\n            step: Math.round(progressive || 700),\n            count: 0\n          });\n          scheduler._pipe(seriesModel, seriesModel.dataTask);\n        });\n      };\n      Scheduler.prototype.prepareStageTasks = function () {\n        var stageTaskMap = this._stageTaskMap;\n        var ecModel = this.api.getModel();\n        var api = this.api;\n        each(this._allHandlers, function (handler) {\n          var record = stageTaskMap.get(handler.uid) || stageTaskMap.set(handler.uid, {});\n          var errMsg = '';\n          if (\"development\" !== 'production') {\n            // Currently do not need to support to sepecify them both.\n            errMsg = '\"reset\" and \"overallReset\" must not be both specified.';\n          }\n          assert(!(handler.reset && handler.overallReset), errMsg);\n          handler.reset && this._createSeriesStageTask(handler, record, ecModel, api);\n          handler.overallReset && this._createOverallStageTask(handler, record, ecModel, api);\n        }, this);\n      };\n      Scheduler.prototype.prepareView = function (view, model, ecModel, api) {\n        var renderTask = view.renderTask;\n        var context = renderTask.context;\n        context.model = model;\n        context.ecModel = ecModel;\n        context.api = api;\n        renderTask.__block = !view.incrementalPrepareRender;\n        this._pipe(model, renderTask);\n      };\n      Scheduler.prototype.performDataProcessorTasks = function (ecModel, payload) {\n        // If we do not use `block` here, it should be considered when to update modes.\n        this._performStageTasks(this._dataProcessorHandlers, ecModel, payload, {\n          block: true\n        });\n      };\n      Scheduler.prototype.performVisualTasks = function (ecModel, payload, opt) {\n        this._performStageTasks(this._visualHandlers, ecModel, payload, opt);\n      };\n      Scheduler.prototype._performStageTasks = function (stageHandlers, ecModel, payload, opt) {\n        opt = opt || {};\n        var unfinished = false;\n        var scheduler = this;\n        each(stageHandlers, function (stageHandler, idx) {\n          if (opt.visualType && opt.visualType !== stageHandler.visualType) {\n            return;\n          }\n          var stageHandlerRecord = scheduler._stageTaskMap.get(stageHandler.uid);\n          var seriesTaskMap = stageHandlerRecord.seriesTaskMap;\n          var overallTask = stageHandlerRecord.overallTask;\n          if (overallTask) {\n            var overallNeedDirty_1;\n            var agentStubMap = overallTask.agentStubMap;\n            agentStubMap.each(function (stub) {\n              if (needSetDirty(opt, stub)) {\n                stub.dirty();\n                overallNeedDirty_1 = true;\n              }\n            });\n            overallNeedDirty_1 && overallTask.dirty();\n            scheduler.updatePayload(overallTask, payload);\n            var performArgs_1 = scheduler.getPerformArgs(overallTask, opt.block);\n            // Execute stubs firstly, which may set the overall task dirty,\n            // then execute the overall task. And stub will call seriesModel.setData,\n            // which ensures that in the overallTask seriesModel.getData() will not\n            // return incorrect data.\n            agentStubMap.each(function (stub) {\n              stub.perform(performArgs_1);\n            });\n            if (overallTask.perform(performArgs_1)) {\n              unfinished = true;\n            }\n          } else if (seriesTaskMap) {\n            seriesTaskMap.each(function (task, pipelineId) {\n              if (needSetDirty(opt, task)) {\n                task.dirty();\n              }\n              var performArgs = scheduler.getPerformArgs(task, opt.block);\n              // FIXME\n              // if intending to declare `performRawSeries` in handlers, only\n              // stream-independent (specifically, data item independent) operations can be\n              // performed. Because if a series is filtered, most of the tasks will not\n              // be performed. A stream-dependent operation probably cause wrong biz logic.\n              // Perhaps we should not provide a separate callback for this case instead\n              // of providing the config `performRawSeries`. The stream-dependent operations\n              // and stream-independent operations should better not be mixed.\n              performArgs.skip = !stageHandler.performRawSeries && ecModel.isSeriesFiltered(task.context.model);\n              scheduler.updatePayload(task, payload);\n              if (task.perform(performArgs)) {\n                unfinished = true;\n              }\n            });\n          }\n        });\n        function needSetDirty(opt, task) {\n          return opt.setDirty && (!opt.dirtyMap || opt.dirtyMap.get(task.__pipeline.id));\n        }\n        this.unfinished = unfinished || this.unfinished;\n      };\n      Scheduler.prototype.performSeriesTasks = function (ecModel) {\n        var unfinished;\n        ecModel.eachSeries(function (seriesModel) {\n          // Progress to the end for dataInit and dataRestore.\n          unfinished = seriesModel.dataTask.perform() || unfinished;\n        });\n        this.unfinished = unfinished || this.unfinished;\n      };\n      Scheduler.prototype.plan = function () {\n        // Travel pipelines, check block.\n        this._pipelineMap.each(function (pipeline) {\n          var task = pipeline.tail;\n          do {\n            if (task.__block) {\n              pipeline.blockIndex = task.__idxInPipeline;\n              break;\n            }\n            task = task.getUpstream();\n          } while (task);\n        });\n      };\n      Scheduler.prototype.updatePayload = function (task, payload) {\n        payload !== 'remain' && (task.context.payload = payload);\n      };\n      Scheduler.prototype._createSeriesStageTask = function (stageHandler, stageHandlerRecord, ecModel, api) {\n        var scheduler = this;\n        var oldSeriesTaskMap = stageHandlerRecord.seriesTaskMap;\n        // The count of stages are totally about only several dozen, so\n        // do not need to reuse the map.\n        var newSeriesTaskMap = stageHandlerRecord.seriesTaskMap = createHashMap();\n        var seriesType = stageHandler.seriesType;\n        var getTargetSeries = stageHandler.getTargetSeries;\n        // If a stageHandler should cover all series, `createOnAllSeries` should be declared mandatorily,\n        // to avoid some typo or abuse. Otherwise if an extension do not specify a `seriesType`,\n        // it works but it may cause other irrelevant charts blocked.\n        if (stageHandler.createOnAllSeries) {\n          ecModel.eachRawSeries(create);\n        } else if (seriesType) {\n          ecModel.eachRawSeriesByType(seriesType, create);\n        } else if (getTargetSeries) {\n          getTargetSeries(ecModel, api).each(create);\n        }\n        function create(seriesModel) {\n          var pipelineId = seriesModel.uid;\n          // Init tasks for each seriesModel only once.\n          // Reuse original task instance.\n          var task = newSeriesTaskMap.set(pipelineId, oldSeriesTaskMap && oldSeriesTaskMap.get(pipelineId) || createTask({\n            plan: seriesTaskPlan,\n            reset: seriesTaskReset,\n            count: seriesTaskCount\n          }));\n          task.context = {\n            model: seriesModel,\n            ecModel: ecModel,\n            api: api,\n            // PENDING: `useClearVisual` not used?\n            useClearVisual: stageHandler.isVisual && !stageHandler.isLayout,\n            plan: stageHandler.plan,\n            reset: stageHandler.reset,\n            scheduler: scheduler\n          };\n          scheduler._pipe(seriesModel, task);\n        }\n      };\n      Scheduler.prototype._createOverallStageTask = function (stageHandler, stageHandlerRecord, ecModel, api) {\n        var scheduler = this;\n        var overallTask = stageHandlerRecord.overallTask = stageHandlerRecord.overallTask\n        // For overall task, the function only be called on reset stage.\n        || createTask({\n          reset: overallTaskReset\n        });\n        overallTask.context = {\n          ecModel: ecModel,\n          api: api,\n          overallReset: stageHandler.overallReset,\n          scheduler: scheduler\n        };\n        var oldAgentStubMap = overallTask.agentStubMap;\n        // The count of stages are totally about only several dozen, so\n        // do not need to reuse the map.\n        var newAgentStubMap = overallTask.agentStubMap = createHashMap();\n        var seriesType = stageHandler.seriesType;\n        var getTargetSeries = stageHandler.getTargetSeries;\n        var overallProgress = true;\n        var shouldOverallTaskDirty = false;\n        // FIXME:TS never used, so comment it\n        // let modifyOutputEnd = stageHandler.modifyOutputEnd;\n        // An overall task with seriesType detected or has `getTargetSeries`, we add\n        // stub in each pipelines, it will set the overall task dirty when the pipeline\n        // progress. Moreover, to avoid call the overall task each frame (too frequent),\n        // we set the pipeline block.\n        var errMsg = '';\n        if (\"development\" !== 'production') {\n          errMsg = '\"createOnAllSeries\" is not supported for \"overallReset\", ' + 'because it will block all streams.';\n        }\n        assert(!stageHandler.createOnAllSeries, errMsg);\n        if (seriesType) {\n          ecModel.eachRawSeriesByType(seriesType, createStub);\n        } else if (getTargetSeries) {\n          getTargetSeries(ecModel, api).each(createStub);\n        }\n        // Otherwise, (usually it is legacy case), the overall task will only be\n        // executed when upstream is dirty. Otherwise the progressive rendering of all\n        // pipelines will be disabled unexpectedly. But it still needs stubs to receive\n        // dirty info from upstream.\n        else {\n          overallProgress = false;\n          each(ecModel.getSeries(), createStub);\n        }\n        function createStub(seriesModel) {\n          var pipelineId = seriesModel.uid;\n          var stub = newAgentStubMap.set(pipelineId, oldAgentStubMap && oldAgentStubMap.get(pipelineId) || (\n          // When the result of `getTargetSeries` changed, the overallTask\n          // should be set as dirty and re-performed.\n          shouldOverallTaskDirty = true, createTask({\n            reset: stubReset,\n            onDirty: stubOnDirty\n          })));\n          stub.context = {\n            model: seriesModel,\n            overallProgress: overallProgress\n            // FIXME:TS never used, so comment it\n            // modifyOutputEnd: modifyOutputEnd\n          };\n          stub.agent = overallTask;\n          stub.__block = overallProgress;\n          scheduler._pipe(seriesModel, stub);\n        }\n        if (shouldOverallTaskDirty) {\n          overallTask.dirty();\n        }\n      };\n      Scheduler.prototype._pipe = function (seriesModel, task) {\n        var pipelineId = seriesModel.uid;\n        var pipeline = this._pipelineMap.get(pipelineId);\n        !pipeline.head && (pipeline.head = task);\n        pipeline.tail && pipeline.tail.pipe(task);\n        pipeline.tail = task;\n        task.__idxInPipeline = pipeline.count++;\n        task.__pipeline = pipeline;\n      };\n      Scheduler.wrapStageHandler = function (stageHandler, visualType) {\n        if (isFunction(stageHandler)) {\n          stageHandler = {\n            overallReset: stageHandler,\n            seriesType: detectSeriseType(stageHandler)\n          };\n        }\n        stageHandler.uid = getUID('stageHandler');\n        visualType && (stageHandler.visualType = visualType);\n        return stageHandler;\n      };\n      return Scheduler;\n    }();\n    function overallTaskReset(context) {\n      context.overallReset(context.ecModel, context.api, context.payload);\n    }\n    function stubReset(context) {\n      return context.overallProgress && stubProgress;\n    }\n    function stubProgress() {\n      this.agent.dirty();\n      this.getDownstream().dirty();\n    }\n    function stubOnDirty() {\n      this.agent && this.agent.dirty();\n    }\n    function seriesTaskPlan(context) {\n      return context.plan ? context.plan(context.model, context.ecModel, context.api, context.payload) : null;\n    }\n    function seriesTaskReset(context) {\n      if (context.useClearVisual) {\n        context.data.clearAllVisual();\n      }\n      var resetDefines = context.resetDefines = normalizeToArray(context.reset(context.model, context.ecModel, context.api, context.payload));\n      return resetDefines.length > 1 ? map(resetDefines, function (v, idx) {\n        return makeSeriesTaskProgress(idx);\n      }) : singleSeriesTaskProgress;\n    }\n    var singleSeriesTaskProgress = makeSeriesTaskProgress(0);\n    function makeSeriesTaskProgress(resetDefineIdx) {\n      return function (params, context) {\n        var data = context.data;\n        var resetDefine = context.resetDefines[resetDefineIdx];\n        if (resetDefine && resetDefine.dataEach) {\n          for (var i = params.start; i < params.end; i++) {\n            resetDefine.dataEach(data, i);\n          }\n        } else if (resetDefine && resetDefine.progress) {\n          resetDefine.progress(params, data);\n        }\n      };\n    }\n    function seriesTaskCount(context) {\n      return context.data.count();\n    }\n    /**\r\n     * Only some legacy stage handlers (usually in echarts extensions) are pure function.\r\n     * To ensure that they can work normally, they should work in block mode, that is,\r\n     * they should not be started util the previous tasks finished. So they cause the\r\n     * progressive rendering disabled. We try to detect the series type, to narrow down\r\n     * the block range to only the series type they concern, but not all series.\r\n     */\n    function detectSeriseType(legacyFunc) {\n      seriesType = null;\n      try {\n        // Assume there is no async when calling `eachSeriesByType`.\n        legacyFunc(ecModelMock, apiMock);\n      } catch (e) {}\n      return seriesType;\n    }\n    var ecModelMock = {};\n    var apiMock = {};\n    var seriesType;\n    mockMethods(ecModelMock, GlobalModel);\n    mockMethods(apiMock, ExtensionAPI);\n    ecModelMock.eachSeriesByType = ecModelMock.eachRawSeriesByType = function (type) {\n      seriesType = type;\n    };\n    ecModelMock.eachComponent = function (cond) {\n      if (cond.mainType === 'series' && cond.subType) {\n        seriesType = cond.subType;\n      }\n    };\n    function mockMethods(target, Clz) {\n      /* eslint-disable */\n      for (var name_1 in Clz.prototype) {\n        // Do not use hasOwnProperty\n        target[name_1] = noop;\n      }\n      /* eslint-enable */\n    }\n\n    /*\n    * Licensed to the Apache Software Foundation (ASF) under one\n    * or more contributor license agreements.  See the NOTICE file\n    * distributed with this work for additional information\n    * regarding copyright ownership.  The ASF licenses this file\n    * to you under the Apache License, Version 2.0 (the\n    * \"License\"); you may not use this file except in compliance\n    * with the License.  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,\n    * software distributed under the License is distributed on an\n    * \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\n    * KIND, either express or implied.  See the License for the\n    * specific language governing permissions and limitations\n    * under the License.\n    */\n\n\n    /**\n     * AUTO-GENERATED FILE. DO NOT MODIFY.\n     */\n\n    /*\r\n    * Licensed to the Apache Software Foundation (ASF) under one\r\n    * or more contributor license agreements.  See the NOTICE file\r\n    * distributed with this work for additional information\r\n    * regarding copyright ownership.  The ASF licenses this file\r\n    * to you under the Apache License, Version 2.0 (the\r\n    * \"License\"); you may not use this file except in compliance\r\n    * with the License.  You may obtain a copy of the License at\r\n    *\r\n    *   http://www.apache.org/licenses/LICENSE-2.0\r\n    *\r\n    * Unless required by applicable law or agreed to in writing,\r\n    * software distributed under the License is distributed on an\r\n    * \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\r\n    * KIND, either express or implied.  See the License for the\r\n    * specific language governing permissions and limitations\r\n    * under the License.\r\n    */\n    var colorAll = ['#37A2DA', '#32C5E9', '#67E0E3', '#9FE6B8', '#FFDB5C', '#ff9f7f', '#fb7293', '#E062AE', '#E690D1', '#e7bcf3', '#9d96f5', '#8378EA', '#96BFFF'];\n    var lightTheme = {\n      color: colorAll,\n      colorLayer: [['#37A2DA', '#ffd85c', '#fd7b5f'], ['#37A2DA', '#67E0E3', '#FFDB5C', '#ff9f7f', '#E062AE', '#9d96f5'], ['#37A2DA', '#32C5E9', '#9FE6B8', '#FFDB5C', '#ff9f7f', '#fb7293', '#e7bcf3', '#8378EA', '#96BFFF'], colorAll]\n    };\n\n    /*\n    * Licensed to the Apache Software Foundation (ASF) under one\n    * or more contributor license agreements.  See the NOTICE file\n    * distributed with this work for additional information\n    * regarding copyright ownership.  The ASF licenses this file\n    * to you under the Apache License, Version 2.0 (the\n    * \"License\"); you may not use this file except in compliance\n    * with the License.  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,\n    * software distributed under the License is distributed on an\n    * \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\n    * KIND, either express or implied.  See the License for the\n    * specific language governing permissions and limitations\n    * under the License.\n    */\n\n\n    /**\n     * AUTO-GENERATED FILE. DO NOT MODIFY.\n     */\n\n    /*\r\n    * Licensed to the Apache Software Foundation (ASF) under one\r\n    * or more contributor license agreements.  See the NOTICE file\r\n    * distributed with this work for additional information\r\n    * regarding copyright ownership.  The ASF licenses this file\r\n    * to you under the Apache License, Version 2.0 (the\r\n    * \"License\"); you may not use this file except in compliance\r\n    * with the License.  You may obtain a copy of the License at\r\n    *\r\n    *   http://www.apache.org/licenses/LICENSE-2.0\r\n    *\r\n    * Unless required by applicable law or agreed to in writing,\r\n    * software distributed under the License is distributed on an\r\n    * \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\r\n    * KIND, either express or implied.  See the License for the\r\n    * specific language governing permissions and limitations\r\n    * under the License.\r\n    */\n    var contrastColor = '#B9B8CE';\n    var backgroundColor = '#100C2A';\n    var axisCommon = function () {\n      return {\n        axisLine: {\n          lineStyle: {\n            color: contrastColor\n          }\n        },\n        splitLine: {\n          lineStyle: {\n            color: '#484753'\n          }\n        },\n        splitArea: {\n          areaStyle: {\n            color: ['rgba(255,255,255,0.02)', 'rgba(255,255,255,0.05)']\n          }\n        },\n        minorSplitLine: {\n          lineStyle: {\n            color: '#20203B'\n          }\n        }\n      };\n    };\n    var colorPalette = ['#4992ff', '#7cffb2', '#fddd60', '#ff6e76', '#58d9f9', '#05c091', '#ff8a45', '#8d48e3', '#dd79ff'];\n    var theme = {\n      darkMode: true,\n      color: colorPalette,\n      backgroundColor: backgroundColor,\n      axisPointer: {\n        lineStyle: {\n          color: '#817f91'\n        },\n        crossStyle: {\n          color: '#817f91'\n        },\n        label: {\n          // TODO Contrast of label backgorundColor\n          color: '#fff'\n        }\n      },\n      legend: {\n        textStyle: {\n          color: contrastColor\n        },\n        pageTextStyle: {\n          color: contrastColor\n        }\n      },\n      textStyle: {\n        color: contrastColor\n      },\n      title: {\n        textStyle: {\n          color: '#EEF1FA'\n        },\n        subtextStyle: {\n          color: '#B9B8CE'\n        }\n      },\n      toolbox: {\n        iconStyle: {\n          borderColor: contrastColor\n        }\n      },\n      dataZoom: {\n        borderColor: '#71708A',\n        textStyle: {\n          color: contrastColor\n        },\n        brushStyle: {\n          color: 'rgba(135,163,206,0.3)'\n        },\n        handleStyle: {\n          color: '#353450',\n          borderColor: '#C5CBE3'\n        },\n        moveHandleStyle: {\n          color: '#B0B6C3',\n          opacity: 0.3\n        },\n        fillerColor: 'rgba(135,163,206,0.2)',\n        emphasis: {\n          handleStyle: {\n            borderColor: '#91B7F2',\n            color: '#4D587D'\n          },\n          moveHandleStyle: {\n            color: '#636D9A',\n            opacity: 0.7\n          }\n        },\n        dataBackground: {\n          lineStyle: {\n            color: '#71708A',\n            width: 1\n          },\n          areaStyle: {\n            color: '#71708A'\n          }\n        },\n        selectedDataBackground: {\n          lineStyle: {\n            color: '#87A3CE'\n          },\n          areaStyle: {\n            color: '#87A3CE'\n          }\n        }\n      },\n      visualMap: {\n        textStyle: {\n          color: contrastColor\n        }\n      },\n      timeline: {\n        lineStyle: {\n          color: contrastColor\n        },\n        label: {\n          color: contrastColor\n        },\n        controlStyle: {\n          color: contrastColor,\n          borderColor: contrastColor\n        }\n      },\n      calendar: {\n        itemStyle: {\n          color: backgroundColor\n        },\n        dayLabel: {\n          color: contrastColor\n        },\n        monthLabel: {\n          color: contrastColor\n        },\n        yearLabel: {\n          color: contrastColor\n        }\n      },\n      timeAxis: axisCommon(),\n      logAxis: axisCommon(),\n      valueAxis: axisCommon(),\n      categoryAxis: axisCommon(),\n      line: {\n        symbol: 'circle'\n      },\n      graph: {\n        color: colorPalette\n      },\n      gauge: {\n        title: {\n          color: contrastColor\n        },\n        axisLine: {\n          lineStyle: {\n            color: [[1, 'rgba(207,212,219,0.2)']]\n          }\n        },\n        axisLabel: {\n          color: contrastColor\n        },\n        detail: {\n          color: '#EEF1FA'\n        }\n      },\n      candlestick: {\n        itemStyle: {\n          color: '#f64e56',\n          color0: '#54ea92',\n          borderColor: '#f64e56',\n          borderColor0: '#54ea92'\n          // borderColor: '#ca2824',\n          // borderColor0: '#09a443'\n        }\n      }\n    };\n    theme.categoryAxis.splitLine.show = false;\n\n    /**\r\n     * Usage of query:\r\n     * `chart.on('click', query, handler);`\r\n     * The `query` can be:\r\n     * + The component type query string, only `mainType` or `mainType.subType`,\r\n     *   like: 'xAxis', 'series', 'xAxis.category' or 'series.line'.\r\n     * + The component query object, like:\r\n     *   `{seriesIndex: 2}`, `{seriesName: 'xx'}`, `{seriesId: 'some'}`,\r\n     *   `{xAxisIndex: 2}`, `{xAxisName: 'xx'}`, `{xAxisId: 'some'}`.\r\n     * + The data query object, like:\r\n     *   `{dataIndex: 123}`, `{dataType: 'link'}`, `{name: 'some'}`.\r\n     * + The other query object (cmponent customized query), like:\r\n     *   `{element: 'some'}` (only available in custom series).\r\n     *\r\n     * Caveat: If a prop in the `query` object is `null/undefined`, it is the\r\n     * same as there is no such prop in the `query` object.\r\n     */\n    var ECEventProcessor = /** @class */function () {\n      function ECEventProcessor() {}\n      ECEventProcessor.prototype.normalizeQuery = function (query) {\n        var cptQuery = {};\n        var dataQuery = {};\n        var otherQuery = {};\n        // `query` is `mainType` or `mainType.subType` of component.\n        if (isString(query)) {\n          var condCptType = parseClassType(query);\n          // `.main` and `.sub` may be ''.\n          cptQuery.mainType = condCptType.main || null;\n          cptQuery.subType = condCptType.sub || null;\n        }\n        // `query` is an object, convert to {mainType, index, name, id}.\n        else {\n          // `xxxIndex`, `xxxName`, `xxxId`, `name`, `dataIndex`, `dataType` is reserved,\n          // can not be used in `compomentModel.filterForExposedEvent`.\n          var suffixes_1 = ['Index', 'Name', 'Id'];\n          var dataKeys_1 = {\n            name: 1,\n            dataIndex: 1,\n            dataType: 1\n          };\n          each(query, function (val, key) {\n            var reserved = false;\n            for (var i = 0; i < suffixes_1.length; i++) {\n              var propSuffix = suffixes_1[i];\n              var suffixPos = key.lastIndexOf(propSuffix);\n              if (suffixPos > 0 && suffixPos === key.length - propSuffix.length) {\n                var mainType = key.slice(0, suffixPos);\n                // Consider `dataIndex`.\n                if (mainType !== 'data') {\n                  cptQuery.mainType = mainType;\n                  cptQuery[propSuffix.toLowerCase()] = val;\n                  reserved = true;\n                }\n              }\n            }\n            if (dataKeys_1.hasOwnProperty(key)) {\n              dataQuery[key] = val;\n              reserved = true;\n            }\n            if (!reserved) {\n              otherQuery[key] = val;\n            }\n          });\n        }\n        return {\n          cptQuery: cptQuery,\n          dataQuery: dataQuery,\n          otherQuery: otherQuery\n        };\n      };\n      ECEventProcessor.prototype.filter = function (eventType, query) {\n        // They should be assigned before each trigger call.\n        var eventInfo = this.eventInfo;\n        if (!eventInfo) {\n          return true;\n        }\n        var targetEl = eventInfo.targetEl;\n        var packedEvent = eventInfo.packedEvent;\n        var model = eventInfo.model;\n        var view = eventInfo.view;\n        // For event like 'globalout'.\n        if (!model || !view) {\n          return true;\n        }\n        var cptQuery = query.cptQuery;\n        var dataQuery = query.dataQuery;\n        return check(cptQuery, model, 'mainType') && check(cptQuery, model, 'subType') && check(cptQuery, model, 'index', 'componentIndex') && check(cptQuery, model, 'name') && check(cptQuery, model, 'id') && check(dataQuery, packedEvent, 'name') && check(dataQuery, packedEvent, 'dataIndex') && check(dataQuery, packedEvent, 'dataType') && (!view.filterForExposedEvent || view.filterForExposedEvent(eventType, query.otherQuery, targetEl, packedEvent));\n        function check(query, host, prop, propOnHost) {\n          return query[prop] == null || host[propOnHost || prop] === query[prop];\n        }\n      };\n      ECEventProcessor.prototype.afterTrigger = function () {\n        // Make sure the eventInfo won't be used in next trigger.\n        this.eventInfo = null;\n      };\n      return ECEventProcessor;\n    }();\n\n    var SYMBOL_PROPS_WITH_CB = ['symbol', 'symbolSize', 'symbolRotate', 'symbolOffset'];\n    var SYMBOL_PROPS = SYMBOL_PROPS_WITH_CB.concat(['symbolKeepAspect']);\n    // Encoding visual for all series include which is filtered for legend drawing\n    var seriesSymbolTask = {\n      createOnAllSeries: true,\n      // For legend.\n      performRawSeries: true,\n      reset: function (seriesModel, ecModel) {\n        var data = seriesModel.getData();\n        if (seriesModel.legendIcon) {\n          data.setVisual('legendIcon', seriesModel.legendIcon);\n        }\n        if (!seriesModel.hasSymbolVisual) {\n          return;\n        }\n        var symbolOptions = {};\n        var symbolOptionsCb = {};\n        var hasCallback = false;\n        for (var i = 0; i < SYMBOL_PROPS_WITH_CB.length; i++) {\n          var symbolPropName = SYMBOL_PROPS_WITH_CB[i];\n          var val = seriesModel.get(symbolPropName);\n          if (isFunction(val)) {\n            hasCallback = true;\n            symbolOptionsCb[symbolPropName] = val;\n          } else {\n            symbolOptions[symbolPropName] = val;\n          }\n        }\n        symbolOptions.symbol = symbolOptions.symbol || seriesModel.defaultSymbol;\n        data.setVisual(extend({\n          legendIcon: seriesModel.legendIcon || symbolOptions.symbol,\n          symbolKeepAspect: seriesModel.get('symbolKeepAspect')\n        }, symbolOptions));\n        // Only visible series has each data be visual encoded\n        if (ecModel.isSeriesFiltered(seriesModel)) {\n          return;\n        }\n        var symbolPropsCb = keys(symbolOptionsCb);\n        function dataEach(data, idx) {\n          var rawValue = seriesModel.getRawValue(idx);\n          var params = seriesModel.getDataParams(idx);\n          for (var i = 0; i < symbolPropsCb.length; i++) {\n            var symbolPropName = symbolPropsCb[i];\n            data.setItemVisual(idx, symbolPropName, symbolOptionsCb[symbolPropName](rawValue, params));\n          }\n        }\n        return {\n          dataEach: hasCallback ? dataEach : null\n        };\n      }\n    };\n    var dataSymbolTask = {\n      createOnAllSeries: true,\n      // For legend.\n      performRawSeries: true,\n      reset: function (seriesModel, ecModel) {\n        if (!seriesModel.hasSymbolVisual) {\n          return;\n        }\n        // Only visible series has each data be visual encoded\n        if (ecModel.isSeriesFiltered(seriesModel)) {\n          return;\n        }\n        var data = seriesModel.getData();\n        function dataEach(data, idx) {\n          var itemModel = data.getItemModel(idx);\n          for (var i = 0; i < SYMBOL_PROPS.length; i++) {\n            var symbolPropName = SYMBOL_PROPS[i];\n            var val = itemModel.getShallow(symbolPropName, true);\n            if (val != null) {\n              data.setItemVisual(idx, symbolPropName, val);\n            }\n          }\n        }\n        return {\n          dataEach: data.hasItemOption ? dataEach : null\n        };\n      }\n    };\n\n    /*\n    * Licensed to the Apache Software Foundation (ASF) under one\n    * or more contributor license agreements.  See the NOTICE file\n    * distributed with this work for additional information\n    * regarding copyright ownership.  The ASF licenses this file\n    * to you under the Apache License, Version 2.0 (the\n    * \"License\"); you may not use this file except in compliance\n    * with the License.  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,\n    * software distributed under the License is distributed on an\n    * \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\n    * KIND, either express or implied.  See the License for the\n    * specific language governing permissions and limitations\n    * under the License.\n    */\n\n\n    /**\n     * AUTO-GENERATED FILE. DO NOT MODIFY.\n     */\n\n    /*\r\n    * Licensed to the Apache Software Foundation (ASF) under one\r\n    * or more contributor license agreements.  See the NOTICE file\r\n    * distributed with this work for additional information\r\n    * regarding copyright ownership.  The ASF licenses this file\r\n    * to you under the Apache License, Version 2.0 (the\r\n    * \"License\"); you may not use this file except in compliance\r\n    * with the License.  You may obtain a copy of the License at\r\n    *\r\n    *   http://www.apache.org/licenses/LICENSE-2.0\r\n    *\r\n    * Unless required by applicable law or agreed to in writing,\r\n    * software distributed under the License is distributed on an\r\n    * \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\r\n    * KIND, either express or implied.  See the License for the\r\n    * specific language governing permissions and limitations\r\n    * under the License.\r\n    */\n    function getItemVisualFromData(data, dataIndex, key) {\n      switch (key) {\n        case 'color':\n          var style = data.getItemVisual(dataIndex, 'style');\n          return style[data.getVisual('drawType')];\n        case 'opacity':\n          return data.getItemVisual(dataIndex, 'style').opacity;\n        case 'symbol':\n        case 'symbolSize':\n        case 'liftZ':\n          return data.getItemVisual(dataIndex, key);\n        default:\n          if (\"development\" !== 'production') {\n            console.warn(\"Unknown visual type \" + key);\n          }\n      }\n    }\n    function getVisualFromData(data, key) {\n      switch (key) {\n        case 'color':\n          var style = data.getVisual('style');\n          return style[data.getVisual('drawType')];\n        case 'opacity':\n          return data.getVisual('style').opacity;\n        case 'symbol':\n        case 'symbolSize':\n        case 'liftZ':\n          return data.getVisual(key);\n        default:\n          if (\"development\" !== 'production') {\n            console.warn(\"Unknown visual type \" + key);\n          }\n      }\n    }\n    function setItemVisualFromData(data, dataIndex, key, value) {\n      switch (key) {\n        case 'color':\n          // Make sure not sharing style object.\n          var style = data.ensureUniqueItemVisual(dataIndex, 'style');\n          style[data.getVisual('drawType')] = value;\n          // Mark the color has been changed, not from palette anymore\n          data.setItemVisual(dataIndex, 'colorFromPalette', false);\n          break;\n        case 'opacity':\n          data.ensureUniqueItemVisual(dataIndex, 'style').opacity = value;\n          break;\n        case 'symbol':\n        case 'symbolSize':\n        case 'liftZ':\n          data.setItemVisual(dataIndex, key, value);\n          break;\n        default:\n          if (\"development\" !== 'production') {\n            console.warn(\"Unknown visual type \" + key);\n          }\n      }\n    }\n\n    // Legacy data selection action.\n    // Includes: pieSelect, pieUnSelect, pieToggleSelect, mapSelect, mapUnSelect, mapToggleSelect\n    function createLegacyDataSelectAction(seriesType, ecRegisterAction) {\n      function getSeriesIndices(ecModel, payload) {\n        var seriesIndices = [];\n        ecModel.eachComponent({\n          mainType: 'series',\n          subType: seriesType,\n          query: payload\n        }, function (seriesModel) {\n          seriesIndices.push(seriesModel.seriesIndex);\n        });\n        return seriesIndices;\n      }\n      each([[seriesType + 'ToggleSelect', 'toggleSelect'], [seriesType + 'Select', 'select'], [seriesType + 'UnSelect', 'unselect']], function (eventsMap) {\n        ecRegisterAction(eventsMap[0], function (payload, ecModel, api) {\n          payload = extend({}, payload);\n          if (\"development\" !== 'production') {\n            deprecateReplaceLog(payload.type, eventsMap[1]);\n          }\n          api.dispatchAction(extend(payload, {\n            type: eventsMap[1],\n            seriesIndex: getSeriesIndices(ecModel, payload)\n          }));\n        });\n      });\n    }\n    function handleSeriesLegacySelectEvents(type, eventPostfix, ecIns, ecModel, payload) {\n      var legacyEventName = type + eventPostfix;\n      if (!ecIns.isSilent(legacyEventName)) {\n        if (\"development\" !== 'production') {\n          deprecateLog(\"event \" + legacyEventName + \" is deprecated.\");\n        }\n        ecModel.eachComponent({\n          mainType: 'series',\n          subType: 'pie'\n        }, function (seriesModel) {\n          var seriesIndex = seriesModel.seriesIndex;\n          var selectedMap = seriesModel.option.selectedMap;\n          var selected = payload.selected;\n          for (var i = 0; i < selected.length; i++) {\n            if (selected[i].seriesIndex === seriesIndex) {\n              var data = seriesModel.getData();\n              var dataIndex = queryDataIndex(data, payload.fromActionPayload);\n              ecIns.trigger(legacyEventName, {\n                type: legacyEventName,\n                seriesId: seriesModel.id,\n                name: isArray(dataIndex) ? data.getName(dataIndex[0]) : data.getName(dataIndex),\n                selected: isString(selectedMap) ? selectedMap : extend({}, selectedMap)\n              });\n            }\n          }\n        });\n      }\n    }\n    function handleLegacySelectEvents(messageCenter, ecIns, api) {\n      messageCenter.on('selectchanged', function (params) {\n        var ecModel = api.getModel();\n        if (params.isFromClick) {\n          handleSeriesLegacySelectEvents('map', 'selectchanged', ecIns, ecModel, params);\n          handleSeriesLegacySelectEvents('pie', 'selectchanged', ecIns, ecModel, params);\n        } else if (params.fromAction === 'select') {\n          handleSeriesLegacySelectEvents('map', 'selected', ecIns, ecModel, params);\n          handleSeriesLegacySelectEvents('pie', 'selected', ecIns, ecModel, params);\n        } else if (params.fromAction === 'unselect') {\n          handleSeriesLegacySelectEvents('map', 'unselected', ecIns, ecModel, params);\n          handleSeriesLegacySelectEvents('pie', 'unselected', ecIns, ecModel, params);\n        }\n      });\n    }\n\n    /*\n    * Licensed to the Apache Software Foundation (ASF) under one\n    * or more contributor license agreements.  See the NOTICE file\n    * distributed with this work for additional information\n    * regarding copyright ownership.  The ASF licenses this file\n    * to you under the Apache License, Version 2.0 (the\n    * \"License\"); you may not use this file except in compliance\n    * with the License.  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,\n    * software distributed under the License is distributed on an\n    * \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\n    * KIND, either express or implied.  See the License for the\n    * specific language governing permissions and limitations\n    * under the License.\n    */\n\n\n    /**\n     * AUTO-GENERATED FILE. DO NOT MODIFY.\n     */\n\n    /*\r\n    * Licensed to the Apache Software Foundation (ASF) under one\r\n    * or more contributor license agreements.  See the NOTICE file\r\n    * distributed with this work for additional information\r\n    * regarding copyright ownership.  The ASF licenses this file\r\n    * to you under the Apache License, Version 2.0 (the\r\n    * \"License\"); you may not use this file except in compliance\r\n    * with the License.  You may obtain a copy of the License at\r\n    *\r\n    *   http://www.apache.org/licenses/LICENSE-2.0\r\n    *\r\n    * Unless required by applicable law or agreed to in writing,\r\n    * software distributed under the License is distributed on an\r\n    * \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\r\n    * KIND, either express or implied.  See the License for the\r\n    * specific language governing permissions and limitations\r\n    * under the License.\r\n    */\n    function findEventDispatcher(target, det, returnFirstMatch) {\n      var found;\n      while (target) {\n        if (det(target)) {\n          found = target;\n          if (returnFirstMatch) {\n            break;\n          }\n        }\n        target = target.__hostTarget || target.parent;\n      }\n      return found;\n    }\n\n    var wmUniqueIndex = Math.round(Math.random() * 9);\n    var supportDefineProperty = typeof Object.defineProperty === 'function';\n    var WeakMap = (function () {\n        function WeakMap() {\n            this._id = '__ec_inner_' + wmUniqueIndex++;\n        }\n        WeakMap.prototype.get = function (key) {\n            return this._guard(key)[this._id];\n        };\n        WeakMap.prototype.set = function (key, value) {\n            var target = this._guard(key);\n            if (supportDefineProperty) {\n                Object.defineProperty(target, this._id, {\n                    value: value,\n                    enumerable: false,\n                    configurable: true\n                });\n            }\n            else {\n                target[this._id] = value;\n            }\n            return this;\n        };\n        WeakMap.prototype[\"delete\"] = function (key) {\n            if (this.has(key)) {\n                delete this._guard(key)[this._id];\n                return true;\n            }\n            return false;\n        };\n        WeakMap.prototype.has = function (key) {\n            return !!this._guard(key)[this._id];\n        };\n        WeakMap.prototype._guard = function (key) {\n            if (key !== Object(key)) {\n                throw TypeError('Value of WeakMap is not a non-null object.');\n            }\n            return key;\n        };\n        return WeakMap;\n    }());\n\n    /**\r\n     * Triangle shape\r\n     * @inner\r\n     */\n    var Triangle = Path.extend({\n      type: 'triangle',\n      shape: {\n        cx: 0,\n        cy: 0,\n        width: 0,\n        height: 0\n      },\n      buildPath: function (path, shape) {\n        var cx = shape.cx;\n        var cy = shape.cy;\n        var width = shape.width / 2;\n        var height = shape.height / 2;\n        path.moveTo(cx, cy - height);\n        path.lineTo(cx + width, cy + height);\n        path.lineTo(cx - width, cy + height);\n        path.closePath();\n      }\n    });\n    /**\r\n     * Diamond shape\r\n     * @inner\r\n     */\n    var Diamond = Path.extend({\n      type: 'diamond',\n      shape: {\n        cx: 0,\n        cy: 0,\n        width: 0,\n        height: 0\n      },\n      buildPath: function (path, shape) {\n        var cx = shape.cx;\n        var cy = shape.cy;\n        var width = shape.width / 2;\n        var height = shape.height / 2;\n        path.moveTo(cx, cy - height);\n        path.lineTo(cx + width, cy);\n        path.lineTo(cx, cy + height);\n        path.lineTo(cx - width, cy);\n        path.closePath();\n      }\n    });\n    /**\r\n     * Pin shape\r\n     * @inner\r\n     */\n    var Pin = Path.extend({\n      type: 'pin',\n      shape: {\n        // x, y on the cusp\n        x: 0,\n        y: 0,\n        width: 0,\n        height: 0\n      },\n      buildPath: function (path, shape) {\n        var x = shape.x;\n        var y = shape.y;\n        var w = shape.width / 5 * 3;\n        // Height must be larger than width\n        var h = Math.max(w, shape.height);\n        var r = w / 2;\n        // Dist on y with tangent point and circle center\n        var dy = r * r / (h - r);\n        var cy = y - h + r + dy;\n        var angle = Math.asin(dy / r);\n        // Dist on x with tangent point and circle center\n        var dx = Math.cos(angle) * r;\n        var tanX = Math.sin(angle);\n        var tanY = Math.cos(angle);\n        var cpLen = r * 0.6;\n        var cpLen2 = r * 0.7;\n        path.moveTo(x - dx, cy + dy);\n        path.arc(x, cy, r, Math.PI - angle, Math.PI * 2 + angle);\n        path.bezierCurveTo(x + dx - tanX * cpLen, cy + dy + tanY * cpLen, x, y - cpLen2, x, y);\n        path.bezierCurveTo(x, y - cpLen2, x - dx + tanX * cpLen, cy + dy + tanY * cpLen, x - dx, cy + dy);\n        path.closePath();\n      }\n    });\n    /**\r\n     * Arrow shape\r\n     * @inner\r\n     */\n    var Arrow = Path.extend({\n      type: 'arrow',\n      shape: {\n        x: 0,\n        y: 0,\n        width: 0,\n        height: 0\n      },\n      buildPath: function (ctx, shape) {\n        var height = shape.height;\n        var width = shape.width;\n        var x = shape.x;\n        var y = shape.y;\n        var dx = width / 3 * 2;\n        ctx.moveTo(x, y);\n        ctx.lineTo(x + dx, y + height);\n        ctx.lineTo(x, y + height / 4 * 3);\n        ctx.lineTo(x - dx, y + height);\n        ctx.lineTo(x, y);\n        ctx.closePath();\n      }\n    });\n    /**\r\n     * Map of path constructors\r\n     */\n    // TODO Use function to build symbol path.\n    var symbolCtors = {\n      line: Line,\n      rect: Rect,\n      roundRect: Rect,\n      square: Rect,\n      circle: Circle,\n      diamond: Diamond,\n      pin: Pin,\n      arrow: Arrow,\n      triangle: Triangle\n    };\n    var symbolShapeMakers = {\n      line: function (x, y, w, h, shape) {\n        shape.x1 = x;\n        shape.y1 = y + h / 2;\n        shape.x2 = x + w;\n        shape.y2 = y + h / 2;\n      },\n      rect: function (x, y, w, h, shape) {\n        shape.x = x;\n        shape.y = y;\n        shape.width = w;\n        shape.height = h;\n      },\n      roundRect: function (x, y, w, h, shape) {\n        shape.x = x;\n        shape.y = y;\n        shape.width = w;\n        shape.height = h;\n        shape.r = Math.min(w, h) / 4;\n      },\n      square: function (x, y, w, h, shape) {\n        var size = Math.min(w, h);\n        shape.x = x;\n        shape.y = y;\n        shape.width = size;\n        shape.height = size;\n      },\n      circle: function (x, y, w, h, shape) {\n        // Put circle in the center of square\n        shape.cx = x + w / 2;\n        shape.cy = y + h / 2;\n        shape.r = Math.min(w, h) / 2;\n      },\n      diamond: function (x, y, w, h, shape) {\n        shape.cx = x + w / 2;\n        shape.cy = y + h / 2;\n        shape.width = w;\n        shape.height = h;\n      },\n      pin: function (x, y, w, h, shape) {\n        shape.x = x + w / 2;\n        shape.y = y + h / 2;\n        shape.width = w;\n        shape.height = h;\n      },\n      arrow: function (x, y, w, h, shape) {\n        shape.x = x + w / 2;\n        shape.y = y + h / 2;\n        shape.width = w;\n        shape.height = h;\n      },\n      triangle: function (x, y, w, h, shape) {\n        shape.cx = x + w / 2;\n        shape.cy = y + h / 2;\n        shape.width = w;\n        shape.height = h;\n      }\n    };\n    var symbolBuildProxies = {};\n    each(symbolCtors, function (Ctor, name) {\n      symbolBuildProxies[name] = new Ctor();\n    });\n    var SymbolClz = Path.extend({\n      type: 'symbol',\n      shape: {\n        symbolType: '',\n        x: 0,\n        y: 0,\n        width: 0,\n        height: 0\n      },\n      calculateTextPosition: function (out, config, rect) {\n        var res = calculateTextPosition(out, config, rect);\n        var shape = this.shape;\n        if (shape && shape.symbolType === 'pin' && config.position === 'inside') {\n          res.y = rect.y + rect.height * 0.4;\n        }\n        return res;\n      },\n      buildPath: function (ctx, shape, inBundle) {\n        var symbolType = shape.symbolType;\n        if (symbolType !== 'none') {\n          var proxySymbol = symbolBuildProxies[symbolType];\n          if (!proxySymbol) {\n            // Default rect\n            symbolType = 'rect';\n            proxySymbol = symbolBuildProxies[symbolType];\n          }\n          symbolShapeMakers[symbolType](shape.x, shape.y, shape.width, shape.height, proxySymbol.shape);\n          proxySymbol.buildPath(ctx, proxySymbol.shape, inBundle);\n        }\n      }\n    });\n    // Provide setColor helper method to avoid determine if set the fill or stroke outside\n    function symbolPathSetColor(color, innerColor) {\n      if (this.type !== 'image') {\n        var symbolStyle = this.style;\n        if (this.__isEmptyBrush) {\n          symbolStyle.stroke = color;\n          symbolStyle.fill = innerColor || '#fff';\n          // TODO Same width with lineStyle in LineView\n          symbolStyle.lineWidth = 2;\n        } else if (this.shape.symbolType === 'line') {\n          symbolStyle.stroke = color;\n        } else {\n          symbolStyle.fill = color;\n        }\n        this.markRedraw();\n      }\n    }\n    /**\r\n     * Create a symbol element with given symbol configuration: shape, x, y, width, height, color\r\n     */\n    function createSymbol(symbolType, x, y, w, h, color,\n    // whether to keep the ratio of w/h,\n    keepAspect) {\n      // TODO Support image object, DynamicImage.\n      var isEmpty = symbolType.indexOf('empty') === 0;\n      if (isEmpty) {\n        symbolType = symbolType.substr(5, 1).toLowerCase() + symbolType.substr(6);\n      }\n      var symbolPath;\n      if (symbolType.indexOf('image://') === 0) {\n        symbolPath = makeImage(symbolType.slice(8), new BoundingRect(x, y, w, h), keepAspect ? 'center' : 'cover');\n      } else if (symbolType.indexOf('path://') === 0) {\n        symbolPath = makePath(symbolType.slice(7), {}, new BoundingRect(x, y, w, h), keepAspect ? 'center' : 'cover');\n      } else {\n        symbolPath = new SymbolClz({\n          shape: {\n            symbolType: symbolType,\n            x: x,\n            y: y,\n            width: w,\n            height: h\n          }\n        });\n      }\n      symbolPath.__isEmptyBrush = isEmpty;\n      // TODO Should deprecate setColor\n      symbolPath.setColor = symbolPathSetColor;\n      if (color) {\n        symbolPath.setColor(color);\n      }\n      return symbolPath;\n    }\n    function normalizeSymbolSize(symbolSize) {\n      if (!isArray(symbolSize)) {\n        symbolSize = [+symbolSize, +symbolSize];\n      }\n      return [symbolSize[0] || 0, symbolSize[1] || 0];\n    }\n    function normalizeSymbolOffset(symbolOffset, symbolSize) {\n      if (symbolOffset == null) {\n        return;\n      }\n      if (!isArray(symbolOffset)) {\n        symbolOffset = [symbolOffset, symbolOffset];\n      }\n      return [parsePercent$1(symbolOffset[0], symbolSize[0]) || 0, parsePercent$1(retrieve2(symbolOffset[1], symbolOffset[0]), symbolSize[1]) || 0];\n    }\n\n    function isSafeNum(num) {\n        return isFinite(num);\n    }\n    function createLinearGradient(ctx, obj, rect) {\n        var x = obj.x == null ? 0 : obj.x;\n        var x2 = obj.x2 == null ? 1 : obj.x2;\n        var y = obj.y == null ? 0 : obj.y;\n        var y2 = obj.y2 == null ? 0 : obj.y2;\n        if (!obj.global) {\n            x = x * rect.width + rect.x;\n            x2 = x2 * rect.width + rect.x;\n            y = y * rect.height + rect.y;\n            y2 = y2 * rect.height + rect.y;\n        }\n        x = isSafeNum(x) ? x : 0;\n        x2 = isSafeNum(x2) ? x2 : 1;\n        y = isSafeNum(y) ? y : 0;\n        y2 = isSafeNum(y2) ? y2 : 0;\n        var canvasGradient = ctx.createLinearGradient(x, y, x2, y2);\n        return canvasGradient;\n    }\n    function createRadialGradient(ctx, obj, rect) {\n        var width = rect.width;\n        var height = rect.height;\n        var min = Math.min(width, height);\n        var x = obj.x == null ? 0.5 : obj.x;\n        var y = obj.y == null ? 0.5 : obj.y;\n        var r = obj.r == null ? 0.5 : obj.r;\n        if (!obj.global) {\n            x = x * width + rect.x;\n            y = y * height + rect.y;\n            r = r * min;\n        }\n        x = isSafeNum(x) ? x : 0.5;\n        y = isSafeNum(y) ? y : 0.5;\n        r = r >= 0 && isSafeNum(r) ? r : 0.5;\n        var canvasGradient = ctx.createRadialGradient(x, y, 0, x, y, r);\n        return canvasGradient;\n    }\n    function getCanvasGradient(ctx, obj, rect) {\n        var canvasGradient = obj.type === 'radial'\n            ? createRadialGradient(ctx, obj, rect)\n            : createLinearGradient(ctx, obj, rect);\n        var colorStops = obj.colorStops;\n        for (var i = 0; i < colorStops.length; i++) {\n            canvasGradient.addColorStop(colorStops[i].offset, colorStops[i].color);\n        }\n        return canvasGradient;\n    }\n    function isClipPathChanged(clipPaths, prevClipPaths) {\n        if (clipPaths === prevClipPaths || (!clipPaths && !prevClipPaths)) {\n            return false;\n        }\n        if (!clipPaths || !prevClipPaths || (clipPaths.length !== prevClipPaths.length)) {\n            return true;\n        }\n        for (var i = 0; i < clipPaths.length; i++) {\n            if (clipPaths[i] !== prevClipPaths[i]) {\n                return true;\n            }\n        }\n        return false;\n    }\n    function parseInt10(val) {\n        return parseInt(val, 10);\n    }\n    function getSize(root, whIdx, opts) {\n        var wh = ['width', 'height'][whIdx];\n        var cwh = ['clientWidth', 'clientHeight'][whIdx];\n        var plt = ['paddingLeft', 'paddingTop'][whIdx];\n        var prb = ['paddingRight', 'paddingBottom'][whIdx];\n        if (opts[wh] != null && opts[wh] !== 'auto') {\n            return parseFloat(opts[wh]);\n        }\n        var stl = document.defaultView.getComputedStyle(root);\n        return ((root[cwh] || parseInt10(stl[wh]) || parseInt10(root.style[wh]))\n            - (parseInt10(stl[plt]) || 0)\n            - (parseInt10(stl[prb]) || 0)) | 0;\n    }\n\n    function normalizeLineDash(lineType, lineWidth) {\n        if (!lineType || lineType === 'solid' || !(lineWidth > 0)) {\n            return null;\n        }\n        return lineType === 'dashed'\n            ? [4 * lineWidth, 2 * lineWidth]\n            : lineType === 'dotted'\n                ? [lineWidth]\n                : isNumber(lineType)\n                    ? [lineType] : isArray(lineType) ? lineType : null;\n    }\n    function getLineDash(el) {\n        var style = el.style;\n        var lineDash = style.lineDash && style.lineWidth > 0 && normalizeLineDash(style.lineDash, style.lineWidth);\n        var lineDashOffset = style.lineDashOffset;\n        if (lineDash) {\n            var lineScale_1 = (style.strokeNoScale && el.getLineScale) ? el.getLineScale() : 1;\n            if (lineScale_1 && lineScale_1 !== 1) {\n                lineDash = map(lineDash, function (rawVal) {\n                    return rawVal / lineScale_1;\n                });\n                lineDashOffset /= lineScale_1;\n            }\n        }\n        return [lineDash, lineDashOffset];\n    }\n\n    var pathProxyForDraw = new PathProxy(true);\n    function styleHasStroke(style) {\n        var stroke = style.stroke;\n        return !(stroke == null || stroke === 'none' || !(style.lineWidth > 0));\n    }\n    function isValidStrokeFillStyle(strokeOrFill) {\n        return typeof strokeOrFill === 'string' && strokeOrFill !== 'none';\n    }\n    function styleHasFill(style) {\n        var fill = style.fill;\n        return fill != null && fill !== 'none';\n    }\n    function doFillPath(ctx, style) {\n        if (style.fillOpacity != null && style.fillOpacity !== 1) {\n            var originalGlobalAlpha = ctx.globalAlpha;\n            ctx.globalAlpha = style.fillOpacity * style.opacity;\n            ctx.fill();\n            ctx.globalAlpha = originalGlobalAlpha;\n        }\n        else {\n            ctx.fill();\n        }\n    }\n    function doStrokePath(ctx, style) {\n        if (style.strokeOpacity != null && style.strokeOpacity !== 1) {\n            var originalGlobalAlpha = ctx.globalAlpha;\n            ctx.globalAlpha = style.strokeOpacity * style.opacity;\n            ctx.stroke();\n            ctx.globalAlpha = originalGlobalAlpha;\n        }\n        else {\n            ctx.stroke();\n        }\n    }\n    function createCanvasPattern(ctx, pattern, el) {\n        var image = createOrUpdateImage(pattern.image, pattern.__image, el);\n        if (isImageReady(image)) {\n            var canvasPattern = ctx.createPattern(image, pattern.repeat || 'repeat');\n            if (typeof DOMMatrix === 'function'\n                && canvasPattern\n                && canvasPattern.setTransform) {\n                var matrix = new DOMMatrix();\n                matrix.translateSelf((pattern.x || 0), (pattern.y || 0));\n                matrix.rotateSelf(0, 0, (pattern.rotation || 0) * RADIAN_TO_DEGREE);\n                matrix.scaleSelf((pattern.scaleX || 1), (pattern.scaleY || 1));\n                canvasPattern.setTransform(matrix);\n            }\n            return canvasPattern;\n        }\n    }\n    function brushPath(ctx, el, style, inBatch) {\n        var _a;\n        var hasStroke = styleHasStroke(style);\n        var hasFill = styleHasFill(style);\n        var strokePercent = style.strokePercent;\n        var strokePart = strokePercent < 1;\n        var firstDraw = !el.path;\n        if ((!el.silent || strokePart) && firstDraw) {\n            el.createPathProxy();\n        }\n        var path = el.path || pathProxyForDraw;\n        var dirtyFlag = el.__dirty;\n        if (!inBatch) {\n            var fill = style.fill;\n            var stroke = style.stroke;\n            var hasFillGradient = hasFill && !!fill.colorStops;\n            var hasStrokeGradient = hasStroke && !!stroke.colorStops;\n            var hasFillPattern = hasFill && !!fill.image;\n            var hasStrokePattern = hasStroke && !!stroke.image;\n            var fillGradient = void 0;\n            var strokeGradient = void 0;\n            var fillPattern = void 0;\n            var strokePattern = void 0;\n            var rect = void 0;\n            if (hasFillGradient || hasStrokeGradient) {\n                rect = el.getBoundingRect();\n            }\n            if (hasFillGradient) {\n                fillGradient = dirtyFlag\n                    ? getCanvasGradient(ctx, fill, rect)\n                    : el.__canvasFillGradient;\n                el.__canvasFillGradient = fillGradient;\n            }\n            if (hasStrokeGradient) {\n                strokeGradient = dirtyFlag\n                    ? getCanvasGradient(ctx, stroke, rect)\n                    : el.__canvasStrokeGradient;\n                el.__canvasStrokeGradient = strokeGradient;\n            }\n            if (hasFillPattern) {\n                fillPattern = (dirtyFlag || !el.__canvasFillPattern)\n                    ? createCanvasPattern(ctx, fill, el)\n                    : el.__canvasFillPattern;\n                el.__canvasFillPattern = fillPattern;\n            }\n            if (hasStrokePattern) {\n                strokePattern = (dirtyFlag || !el.__canvasStrokePattern)\n                    ? createCanvasPattern(ctx, stroke, el)\n                    : el.__canvasStrokePattern;\n                el.__canvasStrokePattern = fillPattern;\n            }\n            if (hasFillGradient) {\n                ctx.fillStyle = fillGradient;\n            }\n            else if (hasFillPattern) {\n                if (fillPattern) {\n                    ctx.fillStyle = fillPattern;\n                }\n                else {\n                    hasFill = false;\n                }\n            }\n            if (hasStrokeGradient) {\n                ctx.strokeStyle = strokeGradient;\n            }\n            else if (hasStrokePattern) {\n                if (strokePattern) {\n                    ctx.strokeStyle = strokePattern;\n                }\n                else {\n                    hasStroke = false;\n                }\n            }\n        }\n        var scale = el.getGlobalScale();\n        path.setScale(scale[0], scale[1], el.segmentIgnoreThreshold);\n        var lineDash;\n        var lineDashOffset;\n        if (ctx.setLineDash && style.lineDash) {\n            _a = getLineDash(el), lineDash = _a[0], lineDashOffset = _a[1];\n        }\n        var needsRebuild = true;\n        if (firstDraw || (dirtyFlag & SHAPE_CHANGED_BIT)) {\n            path.setDPR(ctx.dpr);\n            if (strokePart) {\n                path.setContext(null);\n            }\n            else {\n                path.setContext(ctx);\n                needsRebuild = false;\n            }\n            path.reset();\n            el.buildPath(path, el.shape, inBatch);\n            path.toStatic();\n            el.pathUpdated();\n        }\n        if (needsRebuild) {\n            path.rebuildPath(ctx, strokePart ? strokePercent : 1);\n        }\n        if (lineDash) {\n            ctx.setLineDash(lineDash);\n            ctx.lineDashOffset = lineDashOffset;\n        }\n        if (!inBatch) {\n            if (style.strokeFirst) {\n                if (hasStroke) {\n                    doStrokePath(ctx, style);\n                }\n                if (hasFill) {\n                    doFillPath(ctx, style);\n                }\n            }\n            else {\n                if (hasFill) {\n                    doFillPath(ctx, style);\n                }\n                if (hasStroke) {\n                    doStrokePath(ctx, style);\n                }\n            }\n        }\n        if (lineDash) {\n            ctx.setLineDash([]);\n        }\n    }\n    function brushImage(ctx, el, style) {\n        var image = el.__image = createOrUpdateImage(style.image, el.__image, el, el.onload);\n        if (!image || !isImageReady(image)) {\n            return;\n        }\n        var x = style.x || 0;\n        var y = style.y || 0;\n        var width = el.getWidth();\n        var height = el.getHeight();\n        var aspect = image.width / image.height;\n        if (width == null && height != null) {\n            width = height * aspect;\n        }\n        else if (height == null && width != null) {\n            height = width / aspect;\n        }\n        else if (width == null && height == null) {\n            width = image.width;\n            height = image.height;\n        }\n        if (style.sWidth && style.sHeight) {\n            var sx = style.sx || 0;\n            var sy = style.sy || 0;\n            ctx.drawImage(image, sx, sy, style.sWidth, style.sHeight, x, y, width, height);\n        }\n        else if (style.sx && style.sy) {\n            var sx = style.sx;\n            var sy = style.sy;\n            var sWidth = width - sx;\n            var sHeight = height - sy;\n            ctx.drawImage(image, sx, sy, sWidth, sHeight, x, y, width, height);\n        }\n        else {\n            ctx.drawImage(image, x, y, width, height);\n        }\n    }\n    function brushText(ctx, el, style) {\n        var _a;\n        var text = style.text;\n        text != null && (text += '');\n        if (text) {\n            ctx.font = style.font || DEFAULT_FONT;\n            ctx.textAlign = style.textAlign;\n            ctx.textBaseline = style.textBaseline;\n            var lineDash = void 0;\n            var lineDashOffset = void 0;\n            if (ctx.setLineDash && style.lineDash) {\n                _a = getLineDash(el), lineDash = _a[0], lineDashOffset = _a[1];\n            }\n            if (lineDash) {\n                ctx.setLineDash(lineDash);\n                ctx.lineDashOffset = lineDashOffset;\n            }\n            if (style.strokeFirst) {\n                if (styleHasStroke(style)) {\n                    ctx.strokeText(text, style.x, style.y);\n                }\n                if (styleHasFill(style)) {\n                    ctx.fillText(text, style.x, style.y);\n                }\n            }\n            else {\n                if (styleHasFill(style)) {\n                    ctx.fillText(text, style.x, style.y);\n                }\n                if (styleHasStroke(style)) {\n                    ctx.strokeText(text, style.x, style.y);\n                }\n            }\n            if (lineDash) {\n                ctx.setLineDash([]);\n            }\n        }\n    }\n    var SHADOW_NUMBER_PROPS = ['shadowBlur', 'shadowOffsetX', 'shadowOffsetY'];\n    var STROKE_PROPS = [\n        ['lineCap', 'butt'], ['lineJoin', 'miter'], ['miterLimit', 10]\n    ];\n    function bindCommonProps(ctx, style, prevStyle, forceSetAll, scope) {\n        var styleChanged = false;\n        if (!forceSetAll) {\n            prevStyle = prevStyle || {};\n            if (style === prevStyle) {\n                return false;\n            }\n        }\n        if (forceSetAll || style.opacity !== prevStyle.opacity) {\n            flushPathDrawn(ctx, scope);\n            styleChanged = true;\n            var opacity = Math.max(Math.min(style.opacity, 1), 0);\n            ctx.globalAlpha = isNaN(opacity) ? DEFAULT_COMMON_STYLE.opacity : opacity;\n        }\n        if (forceSetAll || style.blend !== prevStyle.blend) {\n            if (!styleChanged) {\n                flushPathDrawn(ctx, scope);\n                styleChanged = true;\n            }\n            ctx.globalCompositeOperation = style.blend || DEFAULT_COMMON_STYLE.blend;\n        }\n        for (var i = 0; i < SHADOW_NUMBER_PROPS.length; i++) {\n            var propName = SHADOW_NUMBER_PROPS[i];\n            if (forceSetAll || style[propName] !== prevStyle[propName]) {\n                if (!styleChanged) {\n                    flushPathDrawn(ctx, scope);\n                    styleChanged = true;\n                }\n                ctx[propName] = ctx.dpr * (style[propName] || 0);\n            }\n        }\n        if (forceSetAll || style.shadowColor !== prevStyle.shadowColor) {\n            if (!styleChanged) {\n                flushPathDrawn(ctx, scope);\n                styleChanged = true;\n            }\n            ctx.shadowColor = style.shadowColor || DEFAULT_COMMON_STYLE.shadowColor;\n        }\n        return styleChanged;\n    }\n    function bindPathAndTextCommonStyle(ctx, el, prevEl, forceSetAll, scope) {\n        var style = getStyle(el, scope.inHover);\n        var prevStyle = forceSetAll\n            ? null\n            : (prevEl && getStyle(prevEl, scope.inHover) || {});\n        if (style === prevStyle) {\n            return false;\n        }\n        var styleChanged = bindCommonProps(ctx, style, prevStyle, forceSetAll, scope);\n        if (forceSetAll || style.fill !== prevStyle.fill) {\n            if (!styleChanged) {\n                flushPathDrawn(ctx, scope);\n                styleChanged = true;\n            }\n            isValidStrokeFillStyle(style.fill) && (ctx.fillStyle = style.fill);\n        }\n        if (forceSetAll || style.stroke !== prevStyle.stroke) {\n            if (!styleChanged) {\n                flushPathDrawn(ctx, scope);\n                styleChanged = true;\n            }\n            isValidStrokeFillStyle(style.stroke) && (ctx.strokeStyle = style.stroke);\n        }\n        if (forceSetAll || style.opacity !== prevStyle.opacity) {\n            if (!styleChanged) {\n                flushPathDrawn(ctx, scope);\n                styleChanged = true;\n            }\n            ctx.globalAlpha = style.opacity == null ? 1 : style.opacity;\n        }\n        if (el.hasStroke()) {\n            var lineWidth = style.lineWidth;\n            var newLineWidth = lineWidth / ((style.strokeNoScale && el.getLineScale) ? el.getLineScale() : 1);\n            if (ctx.lineWidth !== newLineWidth) {\n                if (!styleChanged) {\n                    flushPathDrawn(ctx, scope);\n                    styleChanged = true;\n                }\n                ctx.lineWidth = newLineWidth;\n            }\n        }\n        for (var i = 0; i < STROKE_PROPS.length; i++) {\n            var prop = STROKE_PROPS[i];\n            var propName = prop[0];\n            if (forceSetAll || style[propName] !== prevStyle[propName]) {\n                if (!styleChanged) {\n                    flushPathDrawn(ctx, scope);\n                    styleChanged = true;\n                }\n                ctx[propName] = style[propName] || prop[1];\n            }\n        }\n        return styleChanged;\n    }\n    function bindImageStyle(ctx, el, prevEl, forceSetAll, scope) {\n        return bindCommonProps(ctx, getStyle(el, scope.inHover), prevEl && getStyle(prevEl, scope.inHover), forceSetAll, scope);\n    }\n    function setContextTransform(ctx, el) {\n        var m = el.transform;\n        var dpr = ctx.dpr || 1;\n        if (m) {\n            ctx.setTransform(dpr * m[0], dpr * m[1], dpr * m[2], dpr * m[3], dpr * m[4], dpr * m[5]);\n        }\n        else {\n            ctx.setTransform(dpr, 0, 0, dpr, 0, 0);\n        }\n    }\n    function updateClipStatus(clipPaths, ctx, scope) {\n        var allClipped = false;\n        for (var i = 0; i < clipPaths.length; i++) {\n            var clipPath = clipPaths[i];\n            allClipped = allClipped || clipPath.isZeroArea();\n            setContextTransform(ctx, clipPath);\n            ctx.beginPath();\n            clipPath.buildPath(ctx, clipPath.shape);\n            ctx.clip();\n        }\n        scope.allClipped = allClipped;\n    }\n    function isTransformChanged(m0, m1) {\n        if (m0 && m1) {\n            return m0[0] !== m1[0]\n                || m0[1] !== m1[1]\n                || m0[2] !== m1[2]\n                || m0[3] !== m1[3]\n                || m0[4] !== m1[4]\n                || m0[5] !== m1[5];\n        }\n        else if (!m0 && !m1) {\n            return false;\n        }\n        return true;\n    }\n    var DRAW_TYPE_PATH = 1;\n    var DRAW_TYPE_IMAGE = 2;\n    var DRAW_TYPE_TEXT = 3;\n    var DRAW_TYPE_INCREMENTAL = 4;\n    function canPathBatch(style) {\n        var hasFill = styleHasFill(style);\n        var hasStroke = styleHasStroke(style);\n        return !(style.lineDash\n            || !(+hasFill ^ +hasStroke)\n            || (hasFill && typeof style.fill !== 'string')\n            || (hasStroke && typeof style.stroke !== 'string')\n            || style.strokePercent < 1\n            || style.strokeOpacity < 1\n            || style.fillOpacity < 1);\n    }\n    function flushPathDrawn(ctx, scope) {\n        scope.batchFill && ctx.fill();\n        scope.batchStroke && ctx.stroke();\n        scope.batchFill = '';\n        scope.batchStroke = '';\n    }\n    function getStyle(el, inHover) {\n        return inHover ? (el.__hoverStyle || el.style) : el.style;\n    }\n    function brushSingle(ctx, el) {\n        brush(ctx, el, { inHover: false, viewWidth: 0, viewHeight: 0 }, true);\n    }\n    function brush(ctx, el, scope, isLast) {\n        var m = el.transform;\n        if (!el.shouldBePainted(scope.viewWidth, scope.viewHeight, false, false)) {\n            el.__dirty &= ~REDRAW_BIT;\n            el.__isRendered = false;\n            return;\n        }\n        var clipPaths = el.__clipPaths;\n        var prevElClipPaths = scope.prevElClipPaths;\n        var forceSetTransform = false;\n        var forceSetStyle = false;\n        if (!prevElClipPaths || isClipPathChanged(clipPaths, prevElClipPaths)) {\n            if (prevElClipPaths && prevElClipPaths.length) {\n                flushPathDrawn(ctx, scope);\n                ctx.restore();\n                forceSetStyle = forceSetTransform = true;\n                scope.prevElClipPaths = null;\n                scope.allClipped = false;\n                scope.prevEl = null;\n            }\n            if (clipPaths && clipPaths.length) {\n                flushPathDrawn(ctx, scope);\n                ctx.save();\n                updateClipStatus(clipPaths, ctx, scope);\n                forceSetTransform = true;\n            }\n            scope.prevElClipPaths = clipPaths;\n        }\n        if (scope.allClipped) {\n            el.__isRendered = false;\n            return;\n        }\n        el.beforeBrush && el.beforeBrush();\n        el.innerBeforeBrush();\n        var prevEl = scope.prevEl;\n        if (!prevEl) {\n            forceSetStyle = forceSetTransform = true;\n        }\n        var canBatchPath = el instanceof Path\n            && el.autoBatch\n            && canPathBatch(el.style);\n        if (forceSetTransform || isTransformChanged(m, prevEl.transform)) {\n            flushPathDrawn(ctx, scope);\n            setContextTransform(ctx, el);\n        }\n        else if (!canBatchPath) {\n            flushPathDrawn(ctx, scope);\n        }\n        var style = getStyle(el, scope.inHover);\n        if (el instanceof Path) {\n            if (scope.lastDrawType !== DRAW_TYPE_PATH) {\n                forceSetStyle = true;\n                scope.lastDrawType = DRAW_TYPE_PATH;\n            }\n            bindPathAndTextCommonStyle(ctx, el, prevEl, forceSetStyle, scope);\n            if (!canBatchPath || (!scope.batchFill && !scope.batchStroke)) {\n                ctx.beginPath();\n            }\n            brushPath(ctx, el, style, canBatchPath);\n            if (canBatchPath) {\n                scope.batchFill = style.fill || '';\n                scope.batchStroke = style.stroke || '';\n            }\n        }\n        else {\n            if (el instanceof TSpan) {\n                if (scope.lastDrawType !== DRAW_TYPE_TEXT) {\n                    forceSetStyle = true;\n                    scope.lastDrawType = DRAW_TYPE_TEXT;\n                }\n                bindPathAndTextCommonStyle(ctx, el, prevEl, forceSetStyle, scope);\n                brushText(ctx, el, style);\n            }\n            else if (el instanceof ZRImage) {\n                if (scope.lastDrawType !== DRAW_TYPE_IMAGE) {\n                    forceSetStyle = true;\n                    scope.lastDrawType = DRAW_TYPE_IMAGE;\n                }\n                bindImageStyle(ctx, el, prevEl, forceSetStyle, scope);\n                brushImage(ctx, el, style);\n            }\n            else if (el.getTemporalDisplayables) {\n                if (scope.lastDrawType !== DRAW_TYPE_INCREMENTAL) {\n                    forceSetStyle = true;\n                    scope.lastDrawType = DRAW_TYPE_INCREMENTAL;\n                }\n                brushIncremental(ctx, el, scope);\n            }\n        }\n        if (canBatchPath && isLast) {\n            flushPathDrawn(ctx, scope);\n        }\n        el.innerAfterBrush();\n        el.afterBrush && el.afterBrush();\n        scope.prevEl = el;\n        el.__dirty = 0;\n        el.__isRendered = true;\n    }\n    function brushIncremental(ctx, el, scope) {\n        var displayables = el.getDisplayables();\n        var temporalDisplayables = el.getTemporalDisplayables();\n        ctx.save();\n        var innerScope = {\n            prevElClipPaths: null,\n            prevEl: null,\n            allClipped: false,\n            viewWidth: scope.viewWidth,\n            viewHeight: scope.viewHeight,\n            inHover: scope.inHover\n        };\n        var i;\n        var len;\n        for (i = el.getCursor(), len = displayables.length; i < len; i++) {\n            var displayable = displayables[i];\n            displayable.beforeBrush && displayable.beforeBrush();\n            displayable.innerBeforeBrush();\n            brush(ctx, displayable, innerScope, i === len - 1);\n            displayable.innerAfterBrush();\n            displayable.afterBrush && displayable.afterBrush();\n            innerScope.prevEl = displayable;\n        }\n        for (var i_1 = 0, len_1 = temporalDisplayables.length; i_1 < len_1; i_1++) {\n            var displayable = temporalDisplayables[i_1];\n            displayable.beforeBrush && displayable.beforeBrush();\n            displayable.innerBeforeBrush();\n            brush(ctx, displayable, innerScope, i_1 === len_1 - 1);\n            displayable.innerAfterBrush();\n            displayable.afterBrush && displayable.afterBrush();\n            innerScope.prevEl = displayable;\n        }\n        el.clearTemporalDisplayables();\n        el.notClear = true;\n        ctx.restore();\n    }\n\n    var decalMap = new WeakMap();\n    var decalCache = new LRU(100);\n    var decalKeys = ['symbol', 'symbolSize', 'symbolKeepAspect', 'color', 'backgroundColor', 'dashArrayX', 'dashArrayY', 'maxTileWidth', 'maxTileHeight'];\n    /**\r\n     * Create or update pattern image from decal options\r\n     *\r\n     * @param {InnerDecalObject | 'none'} decalObject decal options, 'none' if no decal\r\n     * @return {Pattern} pattern with generated image, null if no decal\r\n     */\n    function createOrUpdatePatternFromDecal(decalObject, api) {\n      if (decalObject === 'none') {\n        return null;\n      }\n      var dpr = api.getDevicePixelRatio();\n      var zr = api.getZr();\n      var isSVG = zr.painter.type === 'svg';\n      if (decalObject.dirty) {\n        decalMap[\"delete\"](decalObject);\n      }\n      var oldPattern = decalMap.get(decalObject);\n      if (oldPattern) {\n        return oldPattern;\n      }\n      var decalOpt = defaults(decalObject, {\n        symbol: 'rect',\n        symbolSize: 1,\n        symbolKeepAspect: true,\n        color: 'rgba(0, 0, 0, 0.2)',\n        backgroundColor: null,\n        dashArrayX: 5,\n        dashArrayY: 5,\n        rotation: 0,\n        maxTileWidth: 512,\n        maxTileHeight: 512\n      });\n      if (decalOpt.backgroundColor === 'none') {\n        decalOpt.backgroundColor = null;\n      }\n      var pattern = {\n        repeat: 'repeat'\n      };\n      setPatternnSource(pattern);\n      pattern.rotation = decalOpt.rotation;\n      pattern.scaleX = pattern.scaleY = isSVG ? 1 : 1 / dpr;\n      decalMap.set(decalObject, pattern);\n      decalObject.dirty = false;\n      return pattern;\n      function setPatternnSource(pattern) {\n        var keys = [dpr];\n        var isValidKey = true;\n        for (var i = 0; i < decalKeys.length; ++i) {\n          var value = decalOpt[decalKeys[i]];\n          if (value != null && !isArray(value) && !isString(value) && !isNumber(value) && typeof value !== 'boolean') {\n            isValidKey = false;\n            break;\n          }\n          keys.push(value);\n        }\n        var cacheKey;\n        if (isValidKey) {\n          cacheKey = keys.join(',') + (isSVG ? '-svg' : '');\n          var cache = decalCache.get(cacheKey);\n          if (cache) {\n            isSVG ? pattern.svgElement = cache : pattern.image = cache;\n          }\n        }\n        var dashArrayX = normalizeDashArrayX(decalOpt.dashArrayX);\n        var dashArrayY = normalizeDashArrayY(decalOpt.dashArrayY);\n        var symbolArray = normalizeSymbolArray(decalOpt.symbol);\n        var lineBlockLengthsX = getLineBlockLengthX(dashArrayX);\n        var lineBlockLengthY = getLineBlockLengthY(dashArrayY);\n        var canvas = !isSVG && platformApi.createCanvas();\n        var svgRoot = isSVG && {\n          tag: 'g',\n          attrs: {},\n          key: 'dcl',\n          children: []\n        };\n        var pSize = getPatternSize();\n        var ctx;\n        if (canvas) {\n          canvas.width = pSize.width * dpr;\n          canvas.height = pSize.height * dpr;\n          ctx = canvas.getContext('2d');\n        }\n        brushDecal();\n        if (isValidKey) {\n          decalCache.put(cacheKey, canvas || svgRoot);\n        }\n        pattern.image = canvas;\n        pattern.svgElement = svgRoot;\n        pattern.svgWidth = pSize.width;\n        pattern.svgHeight = pSize.height;\n        /**\r\n         * Get minimum length that can make a repeatable pattern.\r\n         *\r\n         * @return {Object} pattern width and height\r\n         */\n        function getPatternSize() {\n          /**\r\n           * For example, if dash is [[3, 2], [2, 1]] for X, it looks like\r\n           * |---  ---  ---  ---  --- ...\r\n           * |-- -- -- -- -- -- -- -- ...\r\n           * |---  ---  ---  ---  --- ...\r\n           * |-- -- -- -- -- -- -- -- ...\r\n           * So the minimum length of X is 15,\r\n           * which is the least common multiple of `3 + 2` and `2 + 1`\r\n           * |---  ---  ---  |---  --- ...\r\n           * |-- -- -- -- -- |-- -- -- ...\r\n           */\n          var width = 1;\n          for (var i = 0, xlen = lineBlockLengthsX.length; i < xlen; ++i) {\n            width = getLeastCommonMultiple(width, lineBlockLengthsX[i]);\n          }\n          var symbolRepeats = 1;\n          for (var i = 0, xlen = symbolArray.length; i < xlen; ++i) {\n            symbolRepeats = getLeastCommonMultiple(symbolRepeats, symbolArray[i].length);\n          }\n          width *= symbolRepeats;\n          var height = lineBlockLengthY * lineBlockLengthsX.length * symbolArray.length;\n          if (\"development\" !== 'production') {\n            var warn = function (attrName) {\n              /* eslint-disable-next-line */\n              console.warn(\"Calculated decal size is greater than \" + attrName + \" due to decal option settings so \" + attrName + \" is used for the decal size. Please consider changing the decal option to make a smaller decal or set \" + attrName + \" to be larger to avoid incontinuity.\");\n            };\n            if (width > decalOpt.maxTileWidth) {\n              warn('maxTileWidth');\n            }\n            if (height > decalOpt.maxTileHeight) {\n              warn('maxTileHeight');\n            }\n          }\n          return {\n            width: Math.max(1, Math.min(width, decalOpt.maxTileWidth)),\n            height: Math.max(1, Math.min(height, decalOpt.maxTileHeight))\n          };\n        }\n        function brushDecal() {\n          if (ctx) {\n            ctx.clearRect(0, 0, canvas.width, canvas.height);\n            if (decalOpt.backgroundColor) {\n              ctx.fillStyle = decalOpt.backgroundColor;\n              ctx.fillRect(0, 0, canvas.width, canvas.height);\n            }\n          }\n          var ySum = 0;\n          for (var i = 0; i < dashArrayY.length; ++i) {\n            ySum += dashArrayY[i];\n          }\n          if (ySum <= 0) {\n            // dashArrayY is 0, draw nothing\n            return;\n          }\n          var y = -lineBlockLengthY;\n          var yId = 0;\n          var yIdTotal = 0;\n          var xId0 = 0;\n          while (y < pSize.height) {\n            if (yId % 2 === 0) {\n              var symbolYId = yIdTotal / 2 % symbolArray.length;\n              var x = 0;\n              var xId1 = 0;\n              var xId1Total = 0;\n              while (x < pSize.width * 2) {\n                var xSum = 0;\n                for (var i = 0; i < dashArrayX[xId0].length; ++i) {\n                  xSum += dashArrayX[xId0][i];\n                }\n                if (xSum <= 0) {\n                  // Skip empty line\n                  break;\n                }\n                // E.g., [15, 5, 20, 5] draws only for 15 and 20\n                if (xId1 % 2 === 0) {\n                  var size = (1 - decalOpt.symbolSize) * 0.5;\n                  var left = x + dashArrayX[xId0][xId1] * size;\n                  var top_1 = y + dashArrayY[yId] * size;\n                  var width = dashArrayX[xId0][xId1] * decalOpt.symbolSize;\n                  var height = dashArrayY[yId] * decalOpt.symbolSize;\n                  var symbolXId = xId1Total / 2 % symbolArray[symbolYId].length;\n                  brushSymbol(left, top_1, width, height, symbolArray[symbolYId][symbolXId]);\n                }\n                x += dashArrayX[xId0][xId1];\n                ++xId1Total;\n                ++xId1;\n                if (xId1 === dashArrayX[xId0].length) {\n                  xId1 = 0;\n                }\n              }\n              ++xId0;\n              if (xId0 === dashArrayX.length) {\n                xId0 = 0;\n              }\n            }\n            y += dashArrayY[yId];\n            ++yIdTotal;\n            ++yId;\n            if (yId === dashArrayY.length) {\n              yId = 0;\n            }\n          }\n          function brushSymbol(x, y, width, height, symbolType) {\n            var scale = isSVG ? 1 : dpr;\n            var symbol = createSymbol(symbolType, x * scale, y * scale, width * scale, height * scale, decalOpt.color, decalOpt.symbolKeepAspect);\n            if (isSVG) {\n              var symbolVNode = zr.painter.renderOneToVNode(symbol);\n              if (symbolVNode) {\n                svgRoot.children.push(symbolVNode);\n              }\n            } else {\n              // Paint to canvas for all other renderers.\n              brushSingle(ctx, symbol);\n            }\n          }\n        }\n      }\n    }\n    /**\r\n     * Convert symbol array into normalized array\r\n     *\r\n     * @param {string | (string | string[])[]} symbol symbol input\r\n     * @return {string[][]} normolized symbol array\r\n     */\n    function normalizeSymbolArray(symbol) {\n      if (!symbol || symbol.length === 0) {\n        return [['rect']];\n      }\n      if (isString(symbol)) {\n        return [[symbol]];\n      }\n      var isAllString = true;\n      for (var i = 0; i < symbol.length; ++i) {\n        if (!isString(symbol[i])) {\n          isAllString = false;\n          break;\n        }\n      }\n      if (isAllString) {\n        return normalizeSymbolArray([symbol]);\n      }\n      var result = [];\n      for (var i = 0; i < symbol.length; ++i) {\n        if (isString(symbol[i])) {\n          result.push([symbol[i]]);\n        } else {\n          result.push(symbol[i]);\n        }\n      }\n      return result;\n    }\n    /**\r\n     * Convert dash input into dashArray\r\n     *\r\n     * @param {DecalDashArrayX} dash dash input\r\n     * @return {number[][]} normolized dash array\r\n     */\n    function normalizeDashArrayX(dash) {\n      if (!dash || dash.length === 0) {\n        return [[0, 0]];\n      }\n      if (isNumber(dash)) {\n        var dashValue = Math.ceil(dash);\n        return [[dashValue, dashValue]];\n      }\n      /**\r\n       * [20, 5] should be normalized into [[20, 5]],\r\n       * while [20, [5, 10]] should be normalized into [[20, 20], [5, 10]]\r\n       */\n      var isAllNumber = true;\n      for (var i = 0; i < dash.length; ++i) {\n        if (!isNumber(dash[i])) {\n          isAllNumber = false;\n          break;\n        }\n      }\n      if (isAllNumber) {\n        return normalizeDashArrayX([dash]);\n      }\n      var result = [];\n      for (var i = 0; i < dash.length; ++i) {\n        if (isNumber(dash[i])) {\n          var dashValue = Math.ceil(dash[i]);\n          result.push([dashValue, dashValue]);\n        } else {\n          var dashValue = map(dash[i], function (n) {\n            return Math.ceil(n);\n          });\n          if (dashValue.length % 2 === 1) {\n            // [4, 2, 1] means |----  -    -- |----  -    -- |\n            // so normalize it to be [4, 2, 1, 4, 2, 1]\n            result.push(dashValue.concat(dashValue));\n          } else {\n            result.push(dashValue);\n          }\n        }\n      }\n      return result;\n    }\n    /**\r\n     * Convert dash input into dashArray\r\n     *\r\n     * @param {DecalDashArrayY} dash dash input\r\n     * @return {number[]} normolized dash array\r\n     */\n    function normalizeDashArrayY(dash) {\n      if (!dash || typeof dash === 'object' && dash.length === 0) {\n        return [0, 0];\n      }\n      if (isNumber(dash)) {\n        var dashValue_1 = Math.ceil(dash);\n        return [dashValue_1, dashValue_1];\n      }\n      var dashValue = map(dash, function (n) {\n        return Math.ceil(n);\n      });\n      return dash.length % 2 ? dashValue.concat(dashValue) : dashValue;\n    }\n    /**\r\n     * Get block length of each line. A block is the length of dash line and space.\r\n     * For example, a line with [4, 1] has a dash line of 4 and a space of 1 after\r\n     * that, so the block length of this line is 5.\r\n     *\r\n     * @param {number[][]} dash dash array of X or Y\r\n     * @return {number[]} block length of each line\r\n     */\n    function getLineBlockLengthX(dash) {\n      return map(dash, function (line) {\n        return getLineBlockLengthY(line);\n      });\n    }\n    function getLineBlockLengthY(dash) {\n      var blockLength = 0;\n      for (var i = 0; i < dash.length; ++i) {\n        blockLength += dash[i];\n      }\n      if (dash.length % 2 === 1) {\n        // [4, 2, 1] means |----  -    -- |----  -    -- |\n        // So total length is (4 + 2 + 1) * 2\n        return blockLength * 2;\n      }\n      return blockLength;\n    }\n\n    function decalVisual(ecModel, api) {\n      ecModel.eachRawSeries(function (seriesModel) {\n        if (ecModel.isSeriesFiltered(seriesModel)) {\n          return;\n        }\n        var data = seriesModel.getData();\n        if (data.hasItemVisual()) {\n          data.each(function (idx) {\n            var decal = data.getItemVisual(idx, 'decal');\n            if (decal) {\n              var itemStyle = data.ensureUniqueItemVisual(idx, 'style');\n              itemStyle.decal = createOrUpdatePatternFromDecal(decal, api);\n            }\n          });\n        }\n        var decal = data.getVisual('decal');\n        if (decal) {\n          var style = data.getVisual('style');\n          style.decal = createOrUpdatePatternFromDecal(decal, api);\n        }\n      });\n    }\n\n    var lifecycle = new Eventful();\n\n    // Implementation of exported APIs. For example registerMap, getMap.\n    // The implementations will be registered when installing the component.\n    // Avoid these code being bundled to the core module.\n    var implsStore = {};\n    // TODO Type\n    function registerImpl(name, impl) {\n      if (\"development\" !== 'production') {\n        if (implsStore[name]) {\n          error(\"Already has an implementation of \" + name + \".\");\n        }\n      }\n      implsStore[name] = impl;\n    }\n    function getImpl(name) {\n      if (\"development\" !== 'production') {\n        if (!implsStore[name]) {\n          error(\"Implementation of \" + name + \" doesn't exists.\");\n        }\n      }\n      return implsStore[name];\n    }\n\n    var version$1 = '5.6.0';\n    var dependencies = {\n      zrender: '5.6.1'\n    };\n    var TEST_FRAME_REMAIN_TIME = 1;\n    var PRIORITY_PROCESSOR_SERIES_FILTER = 800;\n    // Some data processors depends on the stack result dimension (to calculate data extent).\n    // So data stack stage should be in front of data processing stage.\n    var PRIORITY_PROCESSOR_DATASTACK = 900;\n    // \"Data filter\" will block the stream, so it should be\n    // put at the beginning of data processing.\n    var PRIORITY_PROCESSOR_FILTER = 1000;\n    var PRIORITY_PROCESSOR_DEFAULT = 2000;\n    var PRIORITY_PROCESSOR_STATISTIC = 5000;\n    var PRIORITY_VISUAL_LAYOUT = 1000;\n    var PRIORITY_VISUAL_PROGRESSIVE_LAYOUT = 1100;\n    var PRIORITY_VISUAL_GLOBAL = 2000;\n    var PRIORITY_VISUAL_CHART = 3000;\n    var PRIORITY_VISUAL_COMPONENT = 4000;\n    // Visual property in data. Greater than `PRIORITY_VISUAL_COMPONENT` to enable to\n    // overwrite the viusal result of component (like `visualMap`)\n    // using data item specific setting (like itemStyle.xxx on data item)\n    var PRIORITY_VISUAL_CHART_DATA_CUSTOM = 4500;\n    // Greater than `PRIORITY_VISUAL_CHART_DATA_CUSTOM` to enable to layout based on\n    // visual result like `symbolSize`.\n    var PRIORITY_VISUAL_POST_CHART_LAYOUT = 4600;\n    var PRIORITY_VISUAL_BRUSH = 5000;\n    var PRIORITY_VISUAL_ARIA = 6000;\n    var PRIORITY_VISUAL_DECAL = 7000;\n    var PRIORITY = {\n      PROCESSOR: {\n        FILTER: PRIORITY_PROCESSOR_FILTER,\n        SERIES_FILTER: PRIORITY_PROCESSOR_SERIES_FILTER,\n        STATISTIC: PRIORITY_PROCESSOR_STATISTIC\n      },\n      VISUAL: {\n        LAYOUT: PRIORITY_VISUAL_LAYOUT,\n        PROGRESSIVE_LAYOUT: PRIORITY_VISUAL_PROGRESSIVE_LAYOUT,\n        GLOBAL: PRIORITY_VISUAL_GLOBAL,\n        CHART: PRIORITY_VISUAL_CHART,\n        POST_CHART_LAYOUT: PRIORITY_VISUAL_POST_CHART_LAYOUT,\n        COMPONENT: PRIORITY_VISUAL_COMPONENT,\n        BRUSH: PRIORITY_VISUAL_BRUSH,\n        CHART_ITEM: PRIORITY_VISUAL_CHART_DATA_CUSTOM,\n        ARIA: PRIORITY_VISUAL_ARIA,\n        DECAL: PRIORITY_VISUAL_DECAL\n      }\n    };\n    // Main process have three entries: `setOption`, `dispatchAction` and `resize`,\n    // where they must not be invoked nestedly, except the only case: invoke\n    // dispatchAction with updateMethod \"none\" in main process.\n    // This flag is used to carry out this rule.\n    // All events will be triggered out side main process (i.e. when !this[IN_MAIN_PROCESS]).\n    var IN_MAIN_PROCESS_KEY = '__flagInMainProcess';\n    var PENDING_UPDATE = '__pendingUpdate';\n    var STATUS_NEEDS_UPDATE_KEY = '__needsUpdateStatus';\n    var ACTION_REG = /^[a-zA-Z0-9_]+$/;\n    var CONNECT_STATUS_KEY = '__connectUpdateStatus';\n    var CONNECT_STATUS_PENDING = 0;\n    var CONNECT_STATUS_UPDATING = 1;\n    var CONNECT_STATUS_UPDATED = 2;\n    function createRegisterEventWithLowercaseECharts(method) {\n      return function () {\n        var args = [];\n        for (var _i = 0; _i < arguments.length; _i++) {\n          args[_i] = arguments[_i];\n        }\n        if (this.isDisposed()) {\n          disposedWarning(this.id);\n          return;\n        }\n        return toLowercaseNameAndCallEventful(this, method, args);\n      };\n    }\n    function createRegisterEventWithLowercaseMessageCenter(method) {\n      return function () {\n        var args = [];\n        for (var _i = 0; _i < arguments.length; _i++) {\n          args[_i] = arguments[_i];\n        }\n        return toLowercaseNameAndCallEventful(this, method, args);\n      };\n    }\n    function toLowercaseNameAndCallEventful(host, method, args) {\n      // `args[0]` is event name. Event name is all lowercase.\n      args[0] = args[0] && args[0].toLowerCase();\n      return Eventful.prototype[method].apply(host, args);\n    }\n    var MessageCenter = /** @class */function (_super) {\n      __extends(MessageCenter, _super);\n      function MessageCenter() {\n        return _super !== null && _super.apply(this, arguments) || this;\n      }\n      return MessageCenter;\n    }(Eventful);\n    var messageCenterProto = MessageCenter.prototype;\n    messageCenterProto.on = createRegisterEventWithLowercaseMessageCenter('on');\n    messageCenterProto.off = createRegisterEventWithLowercaseMessageCenter('off');\n    // ---------------------------------------\n    // Internal method names for class ECharts\n    // ---------------------------------------\n    var prepare;\n    var prepareView;\n    var updateDirectly;\n    var updateMethods;\n    var doConvertPixel;\n    var updateStreamModes;\n    var doDispatchAction;\n    var flushPendingActions;\n    var triggerUpdatedEvent;\n    var bindRenderedEvent;\n    var bindMouseEvent;\n    var render;\n    var renderComponents;\n    var renderSeries;\n    var createExtensionAPI;\n    var enableConnect;\n    var markStatusToUpdate;\n    var applyChangedStates;\n    var ECharts = /** @class */function (_super) {\n      __extends(ECharts, _super);\n      function ECharts(dom,\n      // Theme name or themeOption.\n      theme, opts) {\n        var _this = _super.call(this, new ECEventProcessor()) || this;\n        _this._chartsViews = [];\n        _this._chartsMap = {};\n        _this._componentsViews = [];\n        _this._componentsMap = {};\n        // Can't dispatch action during rendering procedure\n        _this._pendingActions = [];\n        opts = opts || {};\n        // Get theme by name\n        if (isString(theme)) {\n          theme = themeStorage[theme];\n        }\n        _this._dom = dom;\n        var defaultRenderer = 'canvas';\n        var defaultCoarsePointer = 'auto';\n        var defaultUseDirtyRect = false;\n        if (\"development\" !== 'production') {\n          var root = /* eslint-disable-next-line */\n          env.hasGlobalWindow ? window : global;\n          if (root) {\n            defaultRenderer = retrieve2(root.__ECHARTS__DEFAULT__RENDERER__, defaultRenderer);\n            defaultCoarsePointer = retrieve2(root.__ECHARTS__DEFAULT__COARSE_POINTER, defaultCoarsePointer);\n            defaultUseDirtyRect = retrieve2(root.__ECHARTS__DEFAULT__USE_DIRTY_RECT__, defaultUseDirtyRect);\n          }\n        }\n        if (opts.ssr) {\n          registerSSRDataGetter(function (el) {\n            var ecData = getECData(el);\n            var dataIndex = ecData.dataIndex;\n            if (dataIndex == null) {\n              return;\n            }\n            var hashMap = createHashMap();\n            hashMap.set('series_index', ecData.seriesIndex);\n            hashMap.set('data_index', dataIndex);\n            ecData.ssrType && hashMap.set('ssr_type', ecData.ssrType);\n            return hashMap;\n          });\n        }\n        var zr = _this._zr = init(dom, {\n          renderer: opts.renderer || defaultRenderer,\n          devicePixelRatio: opts.devicePixelRatio,\n          width: opts.width,\n          height: opts.height,\n          ssr: opts.ssr,\n          useDirtyRect: retrieve2(opts.useDirtyRect, defaultUseDirtyRect),\n          useCoarsePointer: retrieve2(opts.useCoarsePointer, defaultCoarsePointer),\n          pointerSize: opts.pointerSize\n        });\n        _this._ssr = opts.ssr;\n        // Expect 60 fps.\n        _this._throttledZrFlush = throttle(bind(zr.flush, zr), 17);\n        theme = clone(theme);\n        theme && globalBackwardCompat(theme, true);\n        _this._theme = theme;\n        _this._locale = createLocaleObject(opts.locale || SYSTEM_LANG);\n        _this._coordSysMgr = new CoordinateSystemManager();\n        var api = _this._api = createExtensionAPI(_this);\n        // Sort on demand\n        function prioritySortFunc(a, b) {\n          return a.__prio - b.__prio;\n        }\n        sort(visualFuncs, prioritySortFunc);\n        sort(dataProcessorFuncs, prioritySortFunc);\n        _this._scheduler = new Scheduler(_this, api, dataProcessorFuncs, visualFuncs);\n        _this._messageCenter = new MessageCenter();\n        // Init mouse events\n        _this._initEvents();\n        // In case some people write `window.onresize = chart.resize`\n        _this.resize = bind(_this.resize, _this);\n        zr.animation.on('frame', _this._onframe, _this);\n        bindRenderedEvent(zr, _this);\n        bindMouseEvent(zr, _this);\n        // ECharts instance can be used as value.\n        setAsPrimitive(_this);\n        return _this;\n      }\n      ECharts.prototype._onframe = function () {\n        if (this._disposed) {\n          return;\n        }\n        applyChangedStates(this);\n        var scheduler = this._scheduler;\n        // Lazy update\n        if (this[PENDING_UPDATE]) {\n          var silent = this[PENDING_UPDATE].silent;\n          this[IN_MAIN_PROCESS_KEY] = true;\n          try {\n            prepare(this);\n            updateMethods.update.call(this, null, this[PENDING_UPDATE].updateParams);\n          } catch (e) {\n            this[IN_MAIN_PROCESS_KEY] = false;\n            this[PENDING_UPDATE] = null;\n            throw e;\n          }\n          // At present, in each frame, zrender performs:\n          //   (1) animation step forward.\n          //   (2) trigger('frame') (where this `_onframe` is called)\n          //   (3) zrender flush (render).\n          // If we do nothing here, since we use `setToFinal: true`, the step (3) above\n          // will render the final state of the elements before the real animation started.\n          this._zr.flush();\n          this[IN_MAIN_PROCESS_KEY] = false;\n          this[PENDING_UPDATE] = null;\n          flushPendingActions.call(this, silent);\n          triggerUpdatedEvent.call(this, silent);\n        }\n        // Avoid do both lazy update and progress in one frame.\n        else if (scheduler.unfinished) {\n          // Stream progress.\n          var remainTime = TEST_FRAME_REMAIN_TIME;\n          var ecModel = this._model;\n          var api = this._api;\n          scheduler.unfinished = false;\n          do {\n            var startTime = +new Date();\n            scheduler.performSeriesTasks(ecModel);\n            // Currently dataProcessorFuncs do not check threshold.\n            scheduler.performDataProcessorTasks(ecModel);\n            updateStreamModes(this, ecModel);\n            // Do not update coordinate system here. Because that coord system update in\n            // each frame is not a good user experience. So we follow the rule that\n            // the extent of the coordinate system is determined in the first frame (the\n            // frame is executed immediately after task reset.\n            // this._coordSysMgr.update(ecModel, api);\n            // console.log('--- ec frame visual ---', remainTime);\n            scheduler.performVisualTasks(ecModel);\n            renderSeries(this, this._model, api, 'remain', {});\n            remainTime -= +new Date() - startTime;\n          } while (remainTime > 0 && scheduler.unfinished);\n          // Call flush explicitly for trigger finished event.\n          if (!scheduler.unfinished) {\n            this._zr.flush();\n          }\n          // Else, zr flushing be ensue within the same frame,\n          // because zr flushing is after onframe event.\n        }\n      };\n      ECharts.prototype.getDom = function () {\n        return this._dom;\n      };\n      ECharts.prototype.getId = function () {\n        return this.id;\n      };\n      ECharts.prototype.getZr = function () {\n        return this._zr;\n      };\n      ECharts.prototype.isSSR = function () {\n        return this._ssr;\n      };\n      /* eslint-disable-next-line */\n      ECharts.prototype.setOption = function (option, notMerge, lazyUpdate) {\n        if (this[IN_MAIN_PROCESS_KEY]) {\n          if (\"development\" !== 'production') {\n            error('`setOption` should not be called during main process.');\n          }\n          return;\n        }\n        if (this._disposed) {\n          disposedWarning(this.id);\n          return;\n        }\n        var silent;\n        var replaceMerge;\n        var transitionOpt;\n        if (isObject(notMerge)) {\n          lazyUpdate = notMerge.lazyUpdate;\n          silent = notMerge.silent;\n          replaceMerge = notMerge.replaceMerge;\n          transitionOpt = notMerge.transition;\n          notMerge = notMerge.notMerge;\n        }\n        this[IN_MAIN_PROCESS_KEY] = true;\n        if (!this._model || notMerge) {\n          var optionManager = new OptionManager(this._api);\n          var theme = this._theme;\n          var ecModel = this._model = new GlobalModel();\n          ecModel.scheduler = this._scheduler;\n          ecModel.ssr = this._ssr;\n          ecModel.init(null, null, null, theme, this._locale, optionManager);\n        }\n        this._model.setOption(option, {\n          replaceMerge: replaceMerge\n        }, optionPreprocessorFuncs);\n        var updateParams = {\n          seriesTransition: transitionOpt,\n          optionChanged: true\n        };\n        if (lazyUpdate) {\n          this[PENDING_UPDATE] = {\n            silent: silent,\n            updateParams: updateParams\n          };\n          this[IN_MAIN_PROCESS_KEY] = false;\n          // `setOption(option, {lazyMode: true})` may be called when zrender has been slept.\n          // It should wake it up to make sure zrender start to render at the next frame.\n          this.getZr().wakeUp();\n        } else {\n          try {\n            prepare(this);\n            updateMethods.update.call(this, null, updateParams);\n          } catch (e) {\n            this[PENDING_UPDATE] = null;\n            this[IN_MAIN_PROCESS_KEY] = false;\n            throw e;\n          }\n          // Ensure zr refresh sychronously, and then pixel in canvas can be\n          // fetched after `setOption`.\n          if (!this._ssr) {\n            // not use flush when using ssr mode.\n            this._zr.flush();\n          }\n          this[PENDING_UPDATE] = null;\n          this[IN_MAIN_PROCESS_KEY] = false;\n          flushPendingActions.call(this, silent);\n          triggerUpdatedEvent.call(this, silent);\n        }\n      };\n      /**\r\n       * @deprecated\r\n       */\n      ECharts.prototype.setTheme = function () {\n        deprecateLog('ECharts#setTheme() is DEPRECATED in ECharts 3.0');\n      };\n      // We don't want developers to use getModel directly.\n      ECharts.prototype.getModel = function () {\n        return this._model;\n      };\n      ECharts.prototype.getOption = function () {\n        return this._model && this._model.getOption();\n      };\n      ECharts.prototype.getWidth = function () {\n        return this._zr.getWidth();\n      };\n      ECharts.prototype.getHeight = function () {\n        return this._zr.getHeight();\n      };\n      ECharts.prototype.getDevicePixelRatio = function () {\n        return this._zr.painter.dpr\n        /* eslint-disable-next-line */ || env.hasGlobalWindow && window.devicePixelRatio || 1;\n      };\n      /**\r\n       * Get canvas which has all thing rendered\r\n       * @deprecated Use renderToCanvas instead.\r\n       */\n      ECharts.prototype.getRenderedCanvas = function (opts) {\n        if (\"development\" !== 'production') {\n          deprecateReplaceLog('getRenderedCanvas', 'renderToCanvas');\n        }\n        return this.renderToCanvas(opts);\n      };\n      ECharts.prototype.renderToCanvas = function (opts) {\n        opts = opts || {};\n        var painter = this._zr.painter;\n        if (\"development\" !== 'production') {\n          if (painter.type !== 'canvas') {\n            throw new Error('renderToCanvas can only be used in the canvas renderer.');\n          }\n        }\n        return painter.getRenderedCanvas({\n          backgroundColor: opts.backgroundColor || this._model.get('backgroundColor'),\n          pixelRatio: opts.pixelRatio || this.getDevicePixelRatio()\n        });\n      };\n      ECharts.prototype.renderToSVGString = function (opts) {\n        opts = opts || {};\n        var painter = this._zr.painter;\n        if (\"development\" !== 'production') {\n          if (painter.type !== 'svg') {\n            throw new Error('renderToSVGString can only be used in the svg renderer.');\n          }\n        }\n        return painter.renderToString({\n          useViewBox: opts.useViewBox\n        });\n      };\n      /**\r\n       * Get svg data url\r\n       */\n      ECharts.prototype.getSvgDataURL = function () {\n        if (!env.svgSupported) {\n          return;\n        }\n        var zr = this._zr;\n        var list = zr.storage.getDisplayList();\n        // Stop animations\n        each(list, function (el) {\n          el.stopAnimation(null, true);\n        });\n        return zr.painter.toDataURL();\n      };\n      ECharts.prototype.getDataURL = function (opts) {\n        if (this._disposed) {\n          disposedWarning(this.id);\n          return;\n        }\n        opts = opts || {};\n        var excludeComponents = opts.excludeComponents;\n        var ecModel = this._model;\n        var excludesComponentViews = [];\n        var self = this;\n        each(excludeComponents, function (componentType) {\n          ecModel.eachComponent({\n            mainType: componentType\n          }, function (component) {\n            var view = self._componentsMap[component.__viewId];\n            if (!view.group.ignore) {\n              excludesComponentViews.push(view);\n              view.group.ignore = true;\n            }\n          });\n        });\n        var url = this._zr.painter.getType() === 'svg' ? this.getSvgDataURL() : this.renderToCanvas(opts).toDataURL('image/' + (opts && opts.type || 'png'));\n        each(excludesComponentViews, function (view) {\n          view.group.ignore = false;\n        });\n        return url;\n      };\n      ECharts.prototype.getConnectedDataURL = function (opts) {\n        if (this._disposed) {\n          disposedWarning(this.id);\n          return;\n        }\n        var isSvg = opts.type === 'svg';\n        var groupId = this.group;\n        var mathMin = Math.min;\n        var mathMax = Math.max;\n        var MAX_NUMBER = Infinity;\n        if (connectedGroups[groupId]) {\n          var left_1 = MAX_NUMBER;\n          var top_1 = MAX_NUMBER;\n          var right_1 = -MAX_NUMBER;\n          var bottom_1 = -MAX_NUMBER;\n          var canvasList_1 = [];\n          var dpr_1 = opts && opts.pixelRatio || this.getDevicePixelRatio();\n          each(instances$1, function (chart, id) {\n            if (chart.group === groupId) {\n              var canvas = isSvg ? chart.getZr().painter.getSvgDom().innerHTML : chart.renderToCanvas(clone(opts));\n              var boundingRect = chart.getDom().getBoundingClientRect();\n              left_1 = mathMin(boundingRect.left, left_1);\n              top_1 = mathMin(boundingRect.top, top_1);\n              right_1 = mathMax(boundingRect.right, right_1);\n              bottom_1 = mathMax(boundingRect.bottom, bottom_1);\n              canvasList_1.push({\n                dom: canvas,\n                left: boundingRect.left,\n                top: boundingRect.top\n              });\n            }\n          });\n          left_1 *= dpr_1;\n          top_1 *= dpr_1;\n          right_1 *= dpr_1;\n          bottom_1 *= dpr_1;\n          var width = right_1 - left_1;\n          var height = bottom_1 - top_1;\n          var targetCanvas = platformApi.createCanvas();\n          var zr_1 = init(targetCanvas, {\n            renderer: isSvg ? 'svg' : 'canvas'\n          });\n          zr_1.resize({\n            width: width,\n            height: height\n          });\n          if (isSvg) {\n            var content_1 = '';\n            each(canvasList_1, function (item) {\n              var x = item.left - left_1;\n              var y = item.top - top_1;\n              content_1 += '<g transform=\"translate(' + x + ',' + y + ')\">' + item.dom + '</g>';\n            });\n            zr_1.painter.getSvgRoot().innerHTML = content_1;\n            if (opts.connectedBackgroundColor) {\n              zr_1.painter.setBackgroundColor(opts.connectedBackgroundColor);\n            }\n            zr_1.refreshImmediately();\n            return zr_1.painter.toDataURL();\n          } else {\n            // Background between the charts\n            if (opts.connectedBackgroundColor) {\n              zr_1.add(new Rect({\n                shape: {\n                  x: 0,\n                  y: 0,\n                  width: width,\n                  height: height\n                },\n                style: {\n                  fill: opts.connectedBackgroundColor\n                }\n              }));\n            }\n            each(canvasList_1, function (item) {\n              var img = new ZRImage({\n                style: {\n                  x: item.left * dpr_1 - left_1,\n                  y: item.top * dpr_1 - top_1,\n                  image: item.dom\n                }\n              });\n              zr_1.add(img);\n            });\n            zr_1.refreshImmediately();\n            return targetCanvas.toDataURL('image/' + (opts && opts.type || 'png'));\n          }\n        } else {\n          return this.getDataURL(opts);\n        }\n      };\n      ECharts.prototype.convertToPixel = function (finder, value) {\n        return doConvertPixel(this, 'convertToPixel', finder, value);\n      };\n      ECharts.prototype.convertFromPixel = function (finder, value) {\n        return doConvertPixel(this, 'convertFromPixel', finder, value);\n      };\n      /**\r\n       * Is the specified coordinate systems or components contain the given pixel point.\r\n       * @param {Array|number} value\r\n       * @return {boolean} result\r\n       */\n      ECharts.prototype.containPixel = function (finder, value) {\n        if (this._disposed) {\n          disposedWarning(this.id);\n          return;\n        }\n        var ecModel = this._model;\n        var result;\n        var findResult = parseFinder(ecModel, finder);\n        each(findResult, function (models, key) {\n          key.indexOf('Models') >= 0 && each(models, function (model) {\n            var coordSys = model.coordinateSystem;\n            if (coordSys && coordSys.containPoint) {\n              result = result || !!coordSys.containPoint(value);\n            } else if (key === 'seriesModels') {\n              var view = this._chartsMap[model.__viewId];\n              if (view && view.containPoint) {\n                result = result || view.containPoint(value, model);\n              } else {\n                if (\"development\" !== 'production') {\n                  warn(key + ': ' + (view ? 'The found component do not support containPoint.' : 'No view mapping to the found component.'));\n                }\n              }\n            } else {\n              if (\"development\" !== 'production') {\n                warn(key + ': containPoint is not supported');\n              }\n            }\n          }, this);\n        }, this);\n        return !!result;\n      };\n      /**\r\n       * Get visual from series or data.\r\n       * @param finder\r\n       *        If string, e.g., 'series', means {seriesIndex: 0}.\r\n       *        If Object, could contain some of these properties below:\r\n       *        {\r\n       *            seriesIndex / seriesId / seriesName,\r\n       *            dataIndex / dataIndexInside\r\n       *        }\r\n       *        If dataIndex is not specified, series visual will be fetched,\r\n       *        but not data item visual.\r\n       *        If all of seriesIndex, seriesId, seriesName are not specified,\r\n       *        visual will be fetched from first series.\r\n       * @param visualType 'color', 'symbol', 'symbolSize'\r\n       */\n      ECharts.prototype.getVisual = function (finder, visualType) {\n        var ecModel = this._model;\n        var parsedFinder = parseFinder(ecModel, finder, {\n          defaultMainType: 'series'\n        });\n        var seriesModel = parsedFinder.seriesModel;\n        if (\"development\" !== 'production') {\n          if (!seriesModel) {\n            warn('There is no specified series model');\n          }\n        }\n        var data = seriesModel.getData();\n        var dataIndexInside = parsedFinder.hasOwnProperty('dataIndexInside') ? parsedFinder.dataIndexInside : parsedFinder.hasOwnProperty('dataIndex') ? data.indexOfRawIndex(parsedFinder.dataIndex) : null;\n        return dataIndexInside != null ? getItemVisualFromData(data, dataIndexInside, visualType) : getVisualFromData(data, visualType);\n      };\n      /**\r\n       * Get view of corresponding component model\r\n       */\n      ECharts.prototype.getViewOfComponentModel = function (componentModel) {\n        return this._componentsMap[componentModel.__viewId];\n      };\n      /**\r\n       * Get view of corresponding series model\r\n       */\n      ECharts.prototype.getViewOfSeriesModel = function (seriesModel) {\n        return this._chartsMap[seriesModel.__viewId];\n      };\n      ECharts.prototype._initEvents = function () {\n        var _this = this;\n        each(MOUSE_EVENT_NAMES, function (eveName) {\n          var handler = function (e) {\n            var ecModel = _this.getModel();\n            var el = e.target;\n            var params;\n            var isGlobalOut = eveName === 'globalout';\n            // no e.target when 'globalout'.\n            if (isGlobalOut) {\n              params = {};\n            } else {\n              el && findEventDispatcher(el, function (parent) {\n                var ecData = getECData(parent);\n                if (ecData && ecData.dataIndex != null) {\n                  var dataModel = ecData.dataModel || ecModel.getSeriesByIndex(ecData.seriesIndex);\n                  params = dataModel && dataModel.getDataParams(ecData.dataIndex, ecData.dataType, el) || {};\n                  return true;\n                }\n                // If element has custom eventData of components\n                else if (ecData.eventData) {\n                  params = extend({}, ecData.eventData);\n                  return true;\n                }\n              }, true);\n            }\n            // Contract: if params prepared in mouse event,\n            // these properties must be specified:\n            // {\n            //    componentType: string (component main type)\n            //    componentIndex: number\n            // }\n            // Otherwise event query can not work.\n            if (params) {\n              var componentType = params.componentType;\n              var componentIndex = params.componentIndex;\n              // Special handling for historic reason: when trigger by\n              // markLine/markPoint/markArea, the componentType is\n              // 'markLine'/'markPoint'/'markArea', but we should better\n              // enable them to be queried by seriesIndex, since their\n              // option is set in each series.\n              if (componentType === 'markLine' || componentType === 'markPoint' || componentType === 'markArea') {\n                componentType = 'series';\n                componentIndex = params.seriesIndex;\n              }\n              var model = componentType && componentIndex != null && ecModel.getComponent(componentType, componentIndex);\n              var view = model && _this[model.mainType === 'series' ? '_chartsMap' : '_componentsMap'][model.__viewId];\n              if (\"development\" !== 'production') {\n                // `event.componentType` and `event[componentTpype + 'Index']` must not\n                // be missed, otherwise there is no way to distinguish source component.\n                // See `dataFormat.getDataParams`.\n                if (!isGlobalOut && !(model && view)) {\n                  warn('model or view can not be found by params');\n                }\n              }\n              params.event = e;\n              params.type = eveName;\n              _this._$eventProcessor.eventInfo = {\n                targetEl: el,\n                packedEvent: params,\n                model: model,\n                view: view\n              };\n              _this.trigger(eveName, params);\n            }\n          };\n          // Consider that some component (like tooltip, brush, ...)\n          // register zr event handler, but user event handler might\n          // do anything, such as call `setOption` or `dispatchAction`,\n          // which probably update any of the content and probably\n          // cause problem if it is called previous other inner handlers.\n          handler.zrEventfulCallAtLast = true;\n          _this._zr.on(eveName, handler, _this);\n        });\n        each(eventActionMap, function (actionType, eventType) {\n          _this._messageCenter.on(eventType, function (event) {\n            this.trigger(eventType, event);\n          }, _this);\n        });\n        // Extra events\n        // TODO register?\n        each(['selectchanged'], function (eventType) {\n          _this._messageCenter.on(eventType, function (event) {\n            this.trigger(eventType, event);\n          }, _this);\n        });\n        handleLegacySelectEvents(this._messageCenter, this, this._api);\n      };\n      ECharts.prototype.isDisposed = function () {\n        return this._disposed;\n      };\n      ECharts.prototype.clear = function () {\n        if (this._disposed) {\n          disposedWarning(this.id);\n          return;\n        }\n        this.setOption({\n          series: []\n        }, true);\n      };\n      ECharts.prototype.dispose = function () {\n        if (this._disposed) {\n          disposedWarning(this.id);\n          return;\n        }\n        this._disposed = true;\n        var dom = this.getDom();\n        if (dom) {\n          setAttribute(this.getDom(), DOM_ATTRIBUTE_KEY, '');\n        }\n        var chart = this;\n        var api = chart._api;\n        var ecModel = chart._model;\n        each(chart._componentsViews, function (component) {\n          component.dispose(ecModel, api);\n        });\n        each(chart._chartsViews, function (chart) {\n          chart.dispose(ecModel, api);\n        });\n        // Dispose after all views disposed\n        chart._zr.dispose();\n        // Set properties to null.\n        // To reduce the memory cost in case the top code still holds this instance unexpectedly.\n        chart._dom = chart._model = chart._chartsMap = chart._componentsMap = chart._chartsViews = chart._componentsViews = chart._scheduler = chart._api = chart._zr = chart._throttledZrFlush = chart._theme = chart._coordSysMgr = chart._messageCenter = null;\n        delete instances$1[chart.id];\n      };\n      /**\r\n       * Resize the chart\r\n       */\n      ECharts.prototype.resize = function (opts) {\n        if (this[IN_MAIN_PROCESS_KEY]) {\n          if (\"development\" !== 'production') {\n            error('`resize` should not be called during main process.');\n          }\n          return;\n        }\n        if (this._disposed) {\n          disposedWarning(this.id);\n          return;\n        }\n        this._zr.resize(opts);\n        var ecModel = this._model;\n        // Resize loading effect\n        this._loadingFX && this._loadingFX.resize();\n        if (!ecModel) {\n          return;\n        }\n        var needPrepare = ecModel.resetOption('media');\n        var silent = opts && opts.silent;\n        // There is some real cases that:\n        // chart.setOption(option, { lazyUpdate: true });\n        // chart.resize();\n        if (this[PENDING_UPDATE]) {\n          if (silent == null) {\n            silent = this[PENDING_UPDATE].silent;\n          }\n          needPrepare = true;\n          this[PENDING_UPDATE] = null;\n        }\n        this[IN_MAIN_PROCESS_KEY] = true;\n        try {\n          needPrepare && prepare(this);\n          updateMethods.update.call(this, {\n            type: 'resize',\n            animation: extend({\n              // Disable animation\n              duration: 0\n            }, opts && opts.animation)\n          });\n        } catch (e) {\n          this[IN_MAIN_PROCESS_KEY] = false;\n          throw e;\n        }\n        this[IN_MAIN_PROCESS_KEY] = false;\n        flushPendingActions.call(this, silent);\n        triggerUpdatedEvent.call(this, silent);\n      };\n      ECharts.prototype.showLoading = function (name, cfg) {\n        if (this._disposed) {\n          disposedWarning(this.id);\n          return;\n        }\n        if (isObject(name)) {\n          cfg = name;\n          name = '';\n        }\n        name = name || 'default';\n        this.hideLoading();\n        if (!loadingEffects[name]) {\n          if (\"development\" !== 'production') {\n            warn('Loading effects ' + name + ' not exists.');\n          }\n          return;\n        }\n        var el = loadingEffects[name](this._api, cfg);\n        var zr = this._zr;\n        this._loadingFX = el;\n        zr.add(el);\n      };\n      /**\r\n       * Hide loading effect\r\n       */\n      ECharts.prototype.hideLoading = function () {\n        if (this._disposed) {\n          disposedWarning(this.id);\n          return;\n        }\n        this._loadingFX && this._zr.remove(this._loadingFX);\n        this._loadingFX = null;\n      };\n      ECharts.prototype.makeActionFromEvent = function (eventObj) {\n        var payload = extend({}, eventObj);\n        payload.type = eventActionMap[eventObj.type];\n        return payload;\n      };\n      /**\r\n       * @param opt If pass boolean, means opt.silent\r\n       * @param opt.silent Default `false`. Whether trigger events.\r\n       * @param opt.flush Default `undefined`.\r\n       *        true: Flush immediately, and then pixel in canvas can be fetched\r\n       *            immediately. Caution: it might affect performance.\r\n       *        false: Not flush.\r\n       *        undefined: Auto decide whether perform flush.\r\n       */\n      ECharts.prototype.dispatchAction = function (payload, opt) {\n        if (this._disposed) {\n          disposedWarning(this.id);\n          return;\n        }\n        if (!isObject(opt)) {\n          opt = {\n            silent: !!opt\n          };\n        }\n        if (!actions[payload.type]) {\n          return;\n        }\n        // Avoid dispatch action before setOption. Especially in `connect`.\n        if (!this._model) {\n          return;\n        }\n        // May dispatchAction in rendering procedure\n        if (this[IN_MAIN_PROCESS_KEY]) {\n          this._pendingActions.push(payload);\n          return;\n        }\n        var silent = opt.silent;\n        doDispatchAction.call(this, payload, silent);\n        var flush = opt.flush;\n        if (flush) {\n          this._zr.flush();\n        } else if (flush !== false && env.browser.weChat) {\n          // In WeChat embedded browser, `requestAnimationFrame` and `setInterval`\n          // hang when sliding page (on touch event), which cause that zr does not\n          // refresh until user interaction finished, which is not expected.\n          // But `dispatchAction` may be called too frequently when pan on touch\n          // screen, which impacts performance if do not throttle them.\n          this._throttledZrFlush();\n        }\n        flushPendingActions.call(this, silent);\n        triggerUpdatedEvent.call(this, silent);\n      };\n      ECharts.prototype.updateLabelLayout = function () {\n        lifecycle.trigger('series:layoutlabels', this._model, this._api, {\n          // Not adding series labels.\n          // TODO\n          updatedSeries: []\n        });\n      };\n      ECharts.prototype.appendData = function (params) {\n        if (this._disposed) {\n          disposedWarning(this.id);\n          return;\n        }\n        var seriesIndex = params.seriesIndex;\n        var ecModel = this.getModel();\n        var seriesModel = ecModel.getSeriesByIndex(seriesIndex);\n        if (\"development\" !== 'production') {\n          assert(params.data && seriesModel);\n        }\n        seriesModel.appendData(params);\n        // Note: `appendData` does not support that update extent of coordinate\n        // system, util some scenario require that. In the expected usage of\n        // `appendData`, the initial extent of coordinate system should better\n        // be fixed by axis `min`/`max` setting or initial data, otherwise if\n        // the extent changed while `appendData`, the location of the painted\n        // graphic elements have to be changed, which make the usage of\n        // `appendData` meaningless.\n        this._scheduler.unfinished = true;\n        this.getZr().wakeUp();\n      };\n      // A work around for no `internal` modifier in ts yet but\n      // need to strictly hide private methods to JS users.\n      ECharts.internalField = function () {\n        prepare = function (ecIns) {\n          var scheduler = ecIns._scheduler;\n          scheduler.restorePipelines(ecIns._model);\n          scheduler.prepareStageTasks();\n          prepareView(ecIns, true);\n          prepareView(ecIns, false);\n          scheduler.plan();\n        };\n        /**\r\n         * Prepare view instances of charts and components\r\n         */\n        prepareView = function (ecIns, isComponent) {\n          var ecModel = ecIns._model;\n          var scheduler = ecIns._scheduler;\n          var viewList = isComponent ? ecIns._componentsViews : ecIns._chartsViews;\n          var viewMap = isComponent ? ecIns._componentsMap : ecIns._chartsMap;\n          var zr = ecIns._zr;\n          var api = ecIns._api;\n          for (var i = 0; i < viewList.length; i++) {\n            viewList[i].__alive = false;\n          }\n          isComponent ? ecModel.eachComponent(function (componentType, model) {\n            componentType !== 'series' && doPrepare(model);\n          }) : ecModel.eachSeries(doPrepare);\n          function doPrepare(model) {\n            // By default view will be reused if possible for the case that `setOption` with \"notMerge\"\n            // mode and need to enable transition animation. (Usually, when they have the same id, or\n            // especially no id but have the same type & name & index. See the `model.id` generation\n            // rule in `makeIdAndName` and `viewId` generation rule here).\n            // But in `replaceMerge` mode, this feature should be able to disabled when it is clear that\n            // the new model has nothing to do with the old model.\n            var requireNewView = model.__requireNewView;\n            // This command should not work twice.\n            model.__requireNewView = false;\n            // Consider: id same and type changed.\n            var viewId = '_ec_' + model.id + '_' + model.type;\n            var view = !requireNewView && viewMap[viewId];\n            if (!view) {\n              var classType = parseClassType(model.type);\n              var Clazz = isComponent ? ComponentView.getClass(classType.main, classType.sub) :\n              // FIXME:TS\n              // (ChartView as ChartViewConstructor).getClass('series', classType.sub)\n              // For backward compat, still support a chart type declared as only subType\n              // like \"liquidfill\", but recommend \"series.liquidfill\"\n              // But need a base class to make a type series.\n              ChartView.getClass(classType.sub);\n              if (\"development\" !== 'production') {\n                assert(Clazz, classType.sub + ' does not exist.');\n              }\n              view = new Clazz();\n              view.init(ecModel, api);\n              viewMap[viewId] = view;\n              viewList.push(view);\n              zr.add(view.group);\n            }\n            model.__viewId = view.__id = viewId;\n            view.__alive = true;\n            view.__model = model;\n            view.group.__ecComponentInfo = {\n              mainType: model.mainType,\n              index: model.componentIndex\n            };\n            !isComponent && scheduler.prepareView(view, model, ecModel, api);\n          }\n          for (var i = 0; i < viewList.length;) {\n            var view = viewList[i];\n            if (!view.__alive) {\n              !isComponent && view.renderTask.dispose();\n              zr.remove(view.group);\n              view.dispose(ecModel, api);\n              viewList.splice(i, 1);\n              if (viewMap[view.__id] === view) {\n                delete viewMap[view.__id];\n              }\n              view.__id = view.group.__ecComponentInfo = null;\n            } else {\n              i++;\n            }\n          }\n        };\n        updateDirectly = function (ecIns, method, payload, mainType, subType) {\n          var ecModel = ecIns._model;\n          ecModel.setUpdatePayload(payload);\n          // broadcast\n          if (!mainType) {\n            // FIXME\n            // Chart will not be update directly here, except set dirty.\n            // But there is no such scenario now.\n            each([].concat(ecIns._componentsViews).concat(ecIns._chartsViews), callView);\n            return;\n          }\n          var query = {};\n          query[mainType + 'Id'] = payload[mainType + 'Id'];\n          query[mainType + 'Index'] = payload[mainType + 'Index'];\n          query[mainType + 'Name'] = payload[mainType + 'Name'];\n          var condition = {\n            mainType: mainType,\n            query: query\n          };\n          subType && (condition.subType = subType); // subType may be '' by parseClassType;\n          var excludeSeriesId = payload.excludeSeriesId;\n          var excludeSeriesIdMap;\n          if (excludeSeriesId != null) {\n            excludeSeriesIdMap = createHashMap();\n            each(normalizeToArray(excludeSeriesId), function (id) {\n              var modelId = convertOptionIdName(id, null);\n              if (modelId != null) {\n                excludeSeriesIdMap.set(modelId, true);\n              }\n            });\n          }\n          // If dispatchAction before setOption, do nothing.\n          ecModel && ecModel.eachComponent(condition, function (model) {\n            var isExcluded = excludeSeriesIdMap && excludeSeriesIdMap.get(model.id) != null;\n            if (isExcluded) {\n              return;\n            }\n            if (isHighDownPayload(payload)) {\n              if (model instanceof SeriesModel) {\n                if (payload.type === HIGHLIGHT_ACTION_TYPE && !payload.notBlur && !model.get(['emphasis', 'disabled'])) {\n                  blurSeriesFromHighlightPayload(model, payload, ecIns._api);\n                }\n              } else {\n                var _a = findComponentHighDownDispatchers(model.mainType, model.componentIndex, payload.name, ecIns._api),\n                  focusSelf = _a.focusSelf,\n                  dispatchers = _a.dispatchers;\n                if (payload.type === HIGHLIGHT_ACTION_TYPE && focusSelf && !payload.notBlur) {\n                  blurComponent(model.mainType, model.componentIndex, ecIns._api);\n                }\n                // PENDING:\n                // Whether to put this \"enter emphasis\" code in `ComponentView`,\n                // which will be the same as `ChartView` but might be not necessary\n                // and will be far from this logic.\n                if (dispatchers) {\n                  each(dispatchers, function (dispatcher) {\n                    payload.type === HIGHLIGHT_ACTION_TYPE ? enterEmphasis(dispatcher) : leaveEmphasis(dispatcher);\n                  });\n                }\n              }\n            } else if (isSelectChangePayload(payload)) {\n              // TODO geo\n              if (model instanceof SeriesModel) {\n                toggleSelectionFromPayload(model, payload, ecIns._api);\n                updateSeriesElementSelection(model);\n                markStatusToUpdate(ecIns);\n              }\n            }\n          }, ecIns);\n          ecModel && ecModel.eachComponent(condition, function (model) {\n            var isExcluded = excludeSeriesIdMap && excludeSeriesIdMap.get(model.id) != null;\n            if (isExcluded) {\n              return;\n            }\n            callView(ecIns[mainType === 'series' ? '_chartsMap' : '_componentsMap'][model.__viewId]);\n          }, ecIns);\n          function callView(view) {\n            view && view.__alive && view[method] && view[method](view.__model, ecModel, ecIns._api, payload);\n          }\n        };\n        updateMethods = {\n          prepareAndUpdate: function (payload) {\n            prepare(this);\n            updateMethods.update.call(this, payload, {\n              // Needs to mark option changed if newOption is given.\n              // It's from MagicType.\n              // TODO If use a separate flag optionChanged in payload?\n              optionChanged: payload.newOption != null\n            });\n          },\n          update: function (payload, updateParams) {\n            var ecModel = this._model;\n            var api = this._api;\n            var zr = this._zr;\n            var coordSysMgr = this._coordSysMgr;\n            var scheduler = this._scheduler;\n            // update before setOption\n            if (!ecModel) {\n              return;\n            }\n            ecModel.setUpdatePayload(payload);\n            scheduler.restoreData(ecModel, payload);\n            scheduler.performSeriesTasks(ecModel);\n            // TODO\n            // Save total ecModel here for undo/redo (after restoring data and before processing data).\n            // Undo (restoration of total ecModel) can be carried out in 'action' or outside API call.\n            // Create new coordinate system each update\n            // In LineView may save the old coordinate system and use it to get the original point.\n            coordSysMgr.create(ecModel, api);\n            scheduler.performDataProcessorTasks(ecModel, payload);\n            // Current stream render is not supported in data process. So we can update\n            // stream modes after data processing, where the filtered data is used to\n            // determine whether to use progressive rendering.\n            updateStreamModes(this, ecModel);\n            // We update stream modes before coordinate system updated, then the modes info\n            // can be fetched when coord sys updating (consider the barGrid extent fix). But\n            // the drawback is the full coord info can not be fetched. Fortunately this full\n            // coord is not required in stream mode updater currently.\n            coordSysMgr.update(ecModel, api);\n            clearColorPalette(ecModel);\n            scheduler.performVisualTasks(ecModel, payload);\n            render(this, ecModel, api, payload, updateParams);\n            // Set background\n            var backgroundColor = ecModel.get('backgroundColor') || 'transparent';\n            var darkMode = ecModel.get('darkMode');\n            zr.setBackgroundColor(backgroundColor);\n            // Force set dark mode.\n            if (darkMode != null && darkMode !== 'auto') {\n              zr.setDarkMode(darkMode);\n            }\n            lifecycle.trigger('afterupdate', ecModel, api);\n          },\n          updateTransform: function (payload) {\n            var _this = this;\n            var ecModel = this._model;\n            var api = this._api;\n            // update before setOption\n            if (!ecModel) {\n              return;\n            }\n            ecModel.setUpdatePayload(payload);\n            // ChartView.markUpdateMethod(payload, 'updateTransform');\n            var componentDirtyList = [];\n            ecModel.eachComponent(function (componentType, componentModel) {\n              if (componentType === 'series') {\n                return;\n              }\n              var componentView = _this.getViewOfComponentModel(componentModel);\n              if (componentView && componentView.__alive) {\n                if (componentView.updateTransform) {\n                  var result = componentView.updateTransform(componentModel, ecModel, api, payload);\n                  result && result.update && componentDirtyList.push(componentView);\n                } else {\n                  componentDirtyList.push(componentView);\n                }\n              }\n            });\n            var seriesDirtyMap = createHashMap();\n            ecModel.eachSeries(function (seriesModel) {\n              var chartView = _this._chartsMap[seriesModel.__viewId];\n              if (chartView.updateTransform) {\n                var result = chartView.updateTransform(seriesModel, ecModel, api, payload);\n                result && result.update && seriesDirtyMap.set(seriesModel.uid, 1);\n              } else {\n                seriesDirtyMap.set(seriesModel.uid, 1);\n              }\n            });\n            clearColorPalette(ecModel);\n            // Keep pipe to the exist pipeline because it depends on the render task of the full pipeline.\n            // this._scheduler.performVisualTasks(ecModel, payload, 'layout', true);\n            this._scheduler.performVisualTasks(ecModel, payload, {\n              setDirty: true,\n              dirtyMap: seriesDirtyMap\n            });\n            // Currently, not call render of components. Geo render cost a lot.\n            // renderComponents(ecIns, ecModel, api, payload, componentDirtyList);\n            renderSeries(this, ecModel, api, payload, {}, seriesDirtyMap);\n            lifecycle.trigger('afterupdate', ecModel, api);\n          },\n          updateView: function (payload) {\n            var ecModel = this._model;\n            // update before setOption\n            if (!ecModel) {\n              return;\n            }\n            ecModel.setUpdatePayload(payload);\n            ChartView.markUpdateMethod(payload, 'updateView');\n            clearColorPalette(ecModel);\n            // Keep pipe to the exist pipeline because it depends on the render task of the full pipeline.\n            this._scheduler.performVisualTasks(ecModel, payload, {\n              setDirty: true\n            });\n            render(this, ecModel, this._api, payload, {});\n            lifecycle.trigger('afterupdate', ecModel, this._api);\n          },\n          updateVisual: function (payload) {\n            // updateMethods.update.call(this, payload);\n            var _this = this;\n            var ecModel = this._model;\n            // update before setOption\n            if (!ecModel) {\n              return;\n            }\n            ecModel.setUpdatePayload(payload);\n            // clear all visual\n            ecModel.eachSeries(function (seriesModel) {\n              seriesModel.getData().clearAllVisual();\n            });\n            // Perform visual\n            ChartView.markUpdateMethod(payload, 'updateVisual');\n            clearColorPalette(ecModel);\n            // Keep pipe to the exist pipeline because it depends on the render task of the full pipeline.\n            this._scheduler.performVisualTasks(ecModel, payload, {\n              visualType: 'visual',\n              setDirty: true\n            });\n            ecModel.eachComponent(function (componentType, componentModel) {\n              if (componentType !== 'series') {\n                var componentView = _this.getViewOfComponentModel(componentModel);\n                componentView && componentView.__alive && componentView.updateVisual(componentModel, ecModel, _this._api, payload);\n              }\n            });\n            ecModel.eachSeries(function (seriesModel) {\n              var chartView = _this._chartsMap[seriesModel.__viewId];\n              chartView.updateVisual(seriesModel, ecModel, _this._api, payload);\n            });\n            lifecycle.trigger('afterupdate', ecModel, this._api);\n          },\n          updateLayout: function (payload) {\n            updateMethods.update.call(this, payload);\n          }\n        };\n        doConvertPixel = function (ecIns, methodName, finder, value) {\n          if (ecIns._disposed) {\n            disposedWarning(ecIns.id);\n            return;\n          }\n          var ecModel = ecIns._model;\n          var coordSysList = ecIns._coordSysMgr.getCoordinateSystems();\n          var result;\n          var parsedFinder = parseFinder(ecModel, finder);\n          for (var i = 0; i < coordSysList.length; i++) {\n            var coordSys = coordSysList[i];\n            if (coordSys[methodName] && (result = coordSys[methodName](ecModel, parsedFinder, value)) != null) {\n              return result;\n            }\n          }\n          if (\"development\" !== 'production') {\n            warn('No coordinate system that supports ' + methodName + ' found by the given finder.');\n          }\n        };\n        updateStreamModes = function (ecIns, ecModel) {\n          var chartsMap = ecIns._chartsMap;\n          var scheduler = ecIns._scheduler;\n          ecModel.eachSeries(function (seriesModel) {\n            scheduler.updateStreamModes(seriesModel, chartsMap[seriesModel.__viewId]);\n          });\n        };\n        doDispatchAction = function (payload, silent) {\n          var _this = this;\n          var ecModel = this.getModel();\n          var payloadType = payload.type;\n          var escapeConnect = payload.escapeConnect;\n          var actionWrap = actions[payloadType];\n          var actionInfo = actionWrap.actionInfo;\n          var cptTypeTmp = (actionInfo.update || 'update').split(':');\n          var updateMethod = cptTypeTmp.pop();\n          var cptType = cptTypeTmp[0] != null && parseClassType(cptTypeTmp[0]);\n          this[IN_MAIN_PROCESS_KEY] = true;\n          var payloads = [payload];\n          var batched = false;\n          // Batch action\n          if (payload.batch) {\n            batched = true;\n            payloads = map(payload.batch, function (item) {\n              item = defaults(extend({}, item), payload);\n              item.batch = null;\n              return item;\n            });\n          }\n          var eventObjBatch = [];\n          var eventObj;\n          var isSelectChange = isSelectChangePayload(payload);\n          var isHighDown = isHighDownPayload(payload);\n          // Only leave blur once if there are multiple batches.\n          if (isHighDown) {\n            allLeaveBlur(this._api);\n          }\n          each(payloads, function (batchItem) {\n            // Action can specify the event by return it.\n            eventObj = actionWrap.action(batchItem, _this._model, _this._api);\n            // Emit event outside\n            eventObj = eventObj || extend({}, batchItem);\n            // Convert type to eventType\n            eventObj.type = actionInfo.event || eventObj.type;\n            eventObjBatch.push(eventObj);\n            // light update does not perform data process, layout and visual.\n            if (isHighDown) {\n              var _a = preParseFinder(payload),\n                queryOptionMap = _a.queryOptionMap,\n                mainTypeSpecified = _a.mainTypeSpecified;\n              var componentMainType = mainTypeSpecified ? queryOptionMap.keys()[0] : 'series';\n              updateDirectly(_this, updateMethod, batchItem, componentMainType);\n              markStatusToUpdate(_this);\n            } else if (isSelectChange) {\n              // At present `dispatchAction({ type: 'select', ... })` is not supported on components.\n              // geo still use 'geoselect'.\n              updateDirectly(_this, updateMethod, batchItem, 'series');\n              markStatusToUpdate(_this);\n            } else if (cptType) {\n              updateDirectly(_this, updateMethod, batchItem, cptType.main, cptType.sub);\n            }\n          });\n          if (updateMethod !== 'none' && !isHighDown && !isSelectChange && !cptType) {\n            try {\n              // Still dirty\n              if (this[PENDING_UPDATE]) {\n                prepare(this);\n                updateMethods.update.call(this, payload);\n                this[PENDING_UPDATE] = null;\n              } else {\n                updateMethods[updateMethod].call(this, payload);\n              }\n            } catch (e) {\n              this[IN_MAIN_PROCESS_KEY] = false;\n              throw e;\n            }\n          }\n          // Follow the rule of action batch\n          if (batched) {\n            eventObj = {\n              type: actionInfo.event || payloadType,\n              escapeConnect: escapeConnect,\n              batch: eventObjBatch\n            };\n          } else {\n            eventObj = eventObjBatch[0];\n          }\n          this[IN_MAIN_PROCESS_KEY] = false;\n          if (!silent) {\n            var messageCenter = this._messageCenter;\n            messageCenter.trigger(eventObj.type, eventObj);\n            // Extra triggered 'selectchanged' event\n            if (isSelectChange) {\n              var newObj = {\n                type: 'selectchanged',\n                escapeConnect: escapeConnect,\n                selected: getAllSelectedIndices(ecModel),\n                isFromClick: payload.isFromClick || false,\n                fromAction: payload.type,\n                fromActionPayload: payload\n              };\n              messageCenter.trigger(newObj.type, newObj);\n            }\n          }\n        };\n        flushPendingActions = function (silent) {\n          var pendingActions = this._pendingActions;\n          while (pendingActions.length) {\n            var payload = pendingActions.shift();\n            doDispatchAction.call(this, payload, silent);\n          }\n        };\n        triggerUpdatedEvent = function (silent) {\n          !silent && this.trigger('updated');\n        };\n        /**\r\n         * Event `rendered` is triggered when zr\r\n         * rendered. It is useful for realtime\r\n         * snapshot (reflect animation).\r\n         *\r\n         * Event `finished` is triggered when:\r\n         * (1) zrender rendering finished.\r\n         * (2) initial animation finished.\r\n         * (3) progressive rendering finished.\r\n         * (4) no pending action.\r\n         * (5) no delayed setOption needs to be processed.\r\n         */\n        bindRenderedEvent = function (zr, ecIns) {\n          zr.on('rendered', function (params) {\n            ecIns.trigger('rendered', params);\n            // The `finished` event should not be triggered repeatedly,\n            // so it should only be triggered when rendering indeed happens\n            // in zrender. (Consider the case that dipatchAction is keep\n            // triggering when mouse move).\n            if (\n            // Although zr is dirty if initial animation is not finished\n            // and this checking is called on frame, we also check\n            // animation finished for robustness.\n            zr.animation.isFinished() && !ecIns[PENDING_UPDATE] && !ecIns._scheduler.unfinished && !ecIns._pendingActions.length) {\n              ecIns.trigger('finished');\n            }\n          });\n        };\n        bindMouseEvent = function (zr, ecIns) {\n          zr.on('mouseover', function (e) {\n            var el = e.target;\n            var dispatcher = findEventDispatcher(el, isHighDownDispatcher);\n            if (dispatcher) {\n              handleGlobalMouseOverForHighDown(dispatcher, e, ecIns._api);\n              markStatusToUpdate(ecIns);\n            }\n          }).on('mouseout', function (e) {\n            var el = e.target;\n            var dispatcher = findEventDispatcher(el, isHighDownDispatcher);\n            if (dispatcher) {\n              handleGlobalMouseOutForHighDown(dispatcher, e, ecIns._api);\n              markStatusToUpdate(ecIns);\n            }\n          }).on('click', function (e) {\n            var el = e.target;\n            var dispatcher = findEventDispatcher(el, function (target) {\n              return getECData(target).dataIndex != null;\n            }, true);\n            if (dispatcher) {\n              var actionType = dispatcher.selected ? 'unselect' : 'select';\n              var ecData = getECData(dispatcher);\n              ecIns._api.dispatchAction({\n                type: actionType,\n                dataType: ecData.dataType,\n                dataIndexInside: ecData.dataIndex,\n                seriesIndex: ecData.seriesIndex,\n                isFromClick: true\n              });\n            }\n          });\n        };\n        function clearColorPalette(ecModel) {\n          ecModel.clearColorPalette();\n          ecModel.eachSeries(function (seriesModel) {\n            seriesModel.clearColorPalette();\n          });\n        }\n        // Allocate zlevels for series and components\n        function allocateZlevels(ecModel) {\n          var componentZLevels = [];\n          var seriesZLevels = [];\n          var hasSeparateZLevel = false;\n          ecModel.eachComponent(function (componentType, componentModel) {\n            var zlevel = componentModel.get('zlevel') || 0;\n            var z = componentModel.get('z') || 0;\n            var zlevelKey = componentModel.getZLevelKey();\n            hasSeparateZLevel = hasSeparateZLevel || !!zlevelKey;\n            (componentType === 'series' ? seriesZLevels : componentZLevels).push({\n              zlevel: zlevel,\n              z: z,\n              idx: componentModel.componentIndex,\n              type: componentType,\n              key: zlevelKey\n            });\n          });\n          if (hasSeparateZLevel) {\n            // Series after component\n            var zLevels = componentZLevels.concat(seriesZLevels);\n            var lastSeriesZLevel_1;\n            var lastSeriesKey_1;\n            sort(zLevels, function (a, b) {\n              if (a.zlevel === b.zlevel) {\n                return a.z - b.z;\n              }\n              return a.zlevel - b.zlevel;\n            });\n            each(zLevels, function (item) {\n              var componentModel = ecModel.getComponent(item.type, item.idx);\n              var zlevel = item.zlevel;\n              var key = item.key;\n              if (lastSeriesZLevel_1 != null) {\n                zlevel = Math.max(lastSeriesZLevel_1, zlevel);\n              }\n              if (key) {\n                if (zlevel === lastSeriesZLevel_1 && key !== lastSeriesKey_1) {\n                  zlevel++;\n                }\n                lastSeriesKey_1 = key;\n              } else if (lastSeriesKey_1) {\n                if (zlevel === lastSeriesZLevel_1) {\n                  zlevel++;\n                }\n                lastSeriesKey_1 = '';\n              }\n              lastSeriesZLevel_1 = zlevel;\n              componentModel.setZLevel(zlevel);\n            });\n          }\n        }\n        render = function (ecIns, ecModel, api, payload, updateParams) {\n          allocateZlevels(ecModel);\n          renderComponents(ecIns, ecModel, api, payload, updateParams);\n          each(ecIns._chartsViews, function (chart) {\n            chart.__alive = false;\n          });\n          renderSeries(ecIns, ecModel, api, payload, updateParams);\n          // Remove groups of unrendered charts\n          each(ecIns._chartsViews, function (chart) {\n            if (!chart.__alive) {\n              chart.remove(ecModel, api);\n            }\n          });\n        };\n        renderComponents = function (ecIns, ecModel, api, payload, updateParams, dirtyList) {\n          each(dirtyList || ecIns._componentsViews, function (componentView) {\n            var componentModel = componentView.__model;\n            clearStates(componentModel, componentView);\n            componentView.render(componentModel, ecModel, api, payload);\n            updateZ(componentModel, componentView);\n            updateStates(componentModel, componentView);\n          });\n        };\n        /**\r\n         * Render each chart and component\r\n         */\n        renderSeries = function (ecIns, ecModel, api, payload, updateParams, dirtyMap) {\n          // Render all charts\n          var scheduler = ecIns._scheduler;\n          updateParams = extend(updateParams || {}, {\n            updatedSeries: ecModel.getSeries()\n          });\n          // TODO progressive?\n          lifecycle.trigger('series:beforeupdate', ecModel, api, updateParams);\n          var unfinished = false;\n          ecModel.eachSeries(function (seriesModel) {\n            var chartView = ecIns._chartsMap[seriesModel.__viewId];\n            chartView.__alive = true;\n            var renderTask = chartView.renderTask;\n            scheduler.updatePayload(renderTask, payload);\n            // TODO states on marker.\n            clearStates(seriesModel, chartView);\n            if (dirtyMap && dirtyMap.get(seriesModel.uid)) {\n              renderTask.dirty();\n            }\n            if (renderTask.perform(scheduler.getPerformArgs(renderTask))) {\n              unfinished = true;\n            }\n            chartView.group.silent = !!seriesModel.get('silent');\n            // Should not call markRedraw on group, because it will disable zrender\n            // incremental render (always render from the __startIndex each frame)\n            // chartView.group.markRedraw();\n            updateBlend(seriesModel, chartView);\n            updateSeriesElementSelection(seriesModel);\n          });\n          scheduler.unfinished = unfinished || scheduler.unfinished;\n          lifecycle.trigger('series:layoutlabels', ecModel, api, updateParams);\n          // transition after label is layouted.\n          lifecycle.trigger('series:transition', ecModel, api, updateParams);\n          ecModel.eachSeries(function (seriesModel) {\n            var chartView = ecIns._chartsMap[seriesModel.__viewId];\n            // Update Z after labels updated. Before applying states.\n            updateZ(seriesModel, chartView);\n            // NOTE: Update states after label is updated.\n            // label should be in normal status when layouting.\n            updateStates(seriesModel, chartView);\n          });\n          // If use hover layer\n          updateHoverLayerStatus(ecIns, ecModel);\n          lifecycle.trigger('series:afterupdate', ecModel, api, updateParams);\n        };\n        markStatusToUpdate = function (ecIns) {\n          ecIns[STATUS_NEEDS_UPDATE_KEY] = true;\n          // Wake up zrender if it's sleep. Let it update states in the next frame.\n          ecIns.getZr().wakeUp();\n        };\n        applyChangedStates = function (ecIns) {\n          if (!ecIns[STATUS_NEEDS_UPDATE_KEY]) {\n            return;\n          }\n          ecIns.getZr().storage.traverse(function (el) {\n            // Not applied on removed elements, it may still in fading.\n            if (isElementRemoved(el)) {\n              return;\n            }\n            applyElementStates(el);\n          });\n          ecIns[STATUS_NEEDS_UPDATE_KEY] = false;\n        };\n        function applyElementStates(el) {\n          var newStates = [];\n          var oldStates = el.currentStates;\n          // Keep other states.\n          for (var i = 0; i < oldStates.length; i++) {\n            var stateName = oldStates[i];\n            if (!(stateName === 'emphasis' || stateName === 'blur' || stateName === 'select')) {\n              newStates.push(stateName);\n            }\n          }\n          // Only use states when it's exists.\n          if (el.selected && el.states.select) {\n            newStates.push('select');\n          }\n          if (el.hoverState === HOVER_STATE_EMPHASIS && el.states.emphasis) {\n            newStates.push('emphasis');\n          } else if (el.hoverState === HOVER_STATE_BLUR && el.states.blur) {\n            newStates.push('blur');\n          }\n          el.useStates(newStates);\n        }\n        function updateHoverLayerStatus(ecIns, ecModel) {\n          var zr = ecIns._zr;\n          var storage = zr.storage;\n          var elCount = 0;\n          storage.traverse(function (el) {\n            if (!el.isGroup) {\n              elCount++;\n            }\n          });\n          if (elCount > ecModel.get('hoverLayerThreshold') && !env.node && !env.worker) {\n            ecModel.eachSeries(function (seriesModel) {\n              if (seriesModel.preventUsingHoverLayer) {\n                return;\n              }\n              var chartView = ecIns._chartsMap[seriesModel.__viewId];\n              if (chartView.__alive) {\n                chartView.eachRendered(function (el) {\n                  if (el.states.emphasis) {\n                    el.states.emphasis.hoverLayer = true;\n                  }\n                });\n              }\n            });\n          }\n        }\n        /**\r\n         * Update chart and blend.\r\n         */\n        function updateBlend(seriesModel, chartView) {\n          var blendMode = seriesModel.get('blendMode') || null;\n          chartView.eachRendered(function (el) {\n            // FIXME marker and other components\n            if (!el.isGroup) {\n              // DON'T mark the element dirty. In case element is incremental and don't want to rerender.\n              el.style.blend = blendMode;\n            }\n          });\n        }\n        function updateZ(model, view) {\n          if (model.preventAutoZ) {\n            return;\n          }\n          var z = model.get('z') || 0;\n          var zlevel = model.get('zlevel') || 0;\n          // Set z and zlevel\n          view.eachRendered(function (el) {\n            doUpdateZ(el, z, zlevel, -Infinity);\n            // Don't traverse the children because it has been traversed in _updateZ.\n            return true;\n          });\n        }\n        function doUpdateZ(el, z, zlevel, maxZ2) {\n          // Group may also have textContent\n          var label = el.getTextContent();\n          var labelLine = el.getTextGuideLine();\n          var isGroup = el.isGroup;\n          if (isGroup) {\n            // set z & zlevel of children elements of Group\n            var children = el.childrenRef();\n            for (var i = 0; i < children.length; i++) {\n              maxZ2 = Math.max(doUpdateZ(children[i], z, zlevel, maxZ2), maxZ2);\n            }\n          } else {\n            // not Group\n            el.z = z;\n            el.zlevel = zlevel;\n            maxZ2 = Math.max(el.z2, maxZ2);\n          }\n          // always set z and zlevel if label/labelLine exists\n          if (label) {\n            label.z = z;\n            label.zlevel = zlevel;\n            // lift z2 of text content\n            // TODO if el.emphasis.z2 is spcefied, what about textContent.\n            isFinite(maxZ2) && (label.z2 = maxZ2 + 2);\n          }\n          if (labelLine) {\n            var textGuideLineConfig = el.textGuideLineConfig;\n            labelLine.z = z;\n            labelLine.zlevel = zlevel;\n            isFinite(maxZ2) && (labelLine.z2 = maxZ2 + (textGuideLineConfig && textGuideLineConfig.showAbove ? 1 : -1));\n          }\n          return maxZ2;\n        }\n        // Clear states without animation.\n        // TODO States on component.\n        function clearStates(model, view) {\n          view.eachRendered(function (el) {\n            // Not applied on removed elements, it may still in fading.\n            if (isElementRemoved(el)) {\n              return;\n            }\n            var textContent = el.getTextContent();\n            var textGuide = el.getTextGuideLine();\n            if (el.stateTransition) {\n              el.stateTransition = null;\n            }\n            if (textContent && textContent.stateTransition) {\n              textContent.stateTransition = null;\n            }\n            if (textGuide && textGuide.stateTransition) {\n              textGuide.stateTransition = null;\n            }\n            // TODO If el is incremental.\n            if (el.hasState()) {\n              el.prevStates = el.currentStates;\n              el.clearStates();\n            } else if (el.prevStates) {\n              el.prevStates = null;\n            }\n          });\n        }\n        function updateStates(model, view) {\n          var stateAnimationModel = model.getModel('stateAnimation');\n          var enableAnimation = model.isAnimationEnabled();\n          var duration = stateAnimationModel.get('duration');\n          var stateTransition = duration > 0 ? {\n            duration: duration,\n            delay: stateAnimationModel.get('delay'),\n            easing: stateAnimationModel.get('easing')\n            // additive: stateAnimationModel.get('additive')\n          } : null;\n          view.eachRendered(function (el) {\n            if (el.states && el.states.emphasis) {\n              // Not applied on removed elements, it may still in fading.\n              if (isElementRemoved(el)) {\n                return;\n              }\n              if (el instanceof Path) {\n                savePathStates(el);\n              }\n              // Only updated on changed element. In case element is incremental and don't want to rerender.\n              // TODO, a more proper way?\n              if (el.__dirty) {\n                var prevStates = el.prevStates;\n                // Restore states without animation\n                if (prevStates) {\n                  el.useStates(prevStates);\n                }\n              }\n              // Update state transition and enable animation again.\n              if (enableAnimation) {\n                el.stateTransition = stateTransition;\n                var textContent = el.getTextContent();\n                var textGuide = el.getTextGuideLine();\n                // TODO Is it necessary to animate label?\n                if (textContent) {\n                  textContent.stateTransition = stateTransition;\n                }\n                if (textGuide) {\n                  textGuide.stateTransition = stateTransition;\n                }\n              }\n              // Use highlighted and selected flag to toggle states.\n              if (el.__dirty) {\n                applyElementStates(el);\n              }\n            }\n          });\n        }\n        createExtensionAPI = function (ecIns) {\n          return new (/** @class */function (_super) {\n            __extends(class_1, _super);\n            function class_1() {\n              return _super !== null && _super.apply(this, arguments) || this;\n            }\n            class_1.prototype.getCoordinateSystems = function () {\n              return ecIns._coordSysMgr.getCoordinateSystems();\n            };\n            class_1.prototype.getComponentByElement = function (el) {\n              while (el) {\n                var modelInfo = el.__ecComponentInfo;\n                if (modelInfo != null) {\n                  return ecIns._model.getComponent(modelInfo.mainType, modelInfo.index);\n                }\n                el = el.parent;\n              }\n            };\n            class_1.prototype.enterEmphasis = function (el, highlightDigit) {\n              enterEmphasis(el, highlightDigit);\n              markStatusToUpdate(ecIns);\n            };\n            class_1.prototype.leaveEmphasis = function (el, highlightDigit) {\n              leaveEmphasis(el, highlightDigit);\n              markStatusToUpdate(ecIns);\n            };\n            class_1.prototype.enterBlur = function (el) {\n              enterBlur(el);\n              markStatusToUpdate(ecIns);\n            };\n            class_1.prototype.leaveBlur = function (el) {\n              leaveBlur(el);\n              markStatusToUpdate(ecIns);\n            };\n            class_1.prototype.enterSelect = function (el) {\n              enterSelect(el);\n              markStatusToUpdate(ecIns);\n            };\n            class_1.prototype.leaveSelect = function (el) {\n              leaveSelect(el);\n              markStatusToUpdate(ecIns);\n            };\n            class_1.prototype.getModel = function () {\n              return ecIns.getModel();\n            };\n            class_1.prototype.getViewOfComponentModel = function (componentModel) {\n              return ecIns.getViewOfComponentModel(componentModel);\n            };\n            class_1.prototype.getViewOfSeriesModel = function (seriesModel) {\n              return ecIns.getViewOfSeriesModel(seriesModel);\n            };\n            return class_1;\n          }(ExtensionAPI))(ecIns);\n        };\n        enableConnect = function (chart) {\n          function updateConnectedChartsStatus(charts, status) {\n            for (var i = 0; i < charts.length; i++) {\n              var otherChart = charts[i];\n              otherChart[CONNECT_STATUS_KEY] = status;\n            }\n          }\n          each(eventActionMap, function (actionType, eventType) {\n            chart._messageCenter.on(eventType, function (event) {\n              if (connectedGroups[chart.group] && chart[CONNECT_STATUS_KEY] !== CONNECT_STATUS_PENDING) {\n                if (event && event.escapeConnect) {\n                  return;\n                }\n                var action_1 = chart.makeActionFromEvent(event);\n                var otherCharts_1 = [];\n                each(instances$1, function (otherChart) {\n                  if (otherChart !== chart && otherChart.group === chart.group) {\n                    otherCharts_1.push(otherChart);\n                  }\n                });\n                updateConnectedChartsStatus(otherCharts_1, CONNECT_STATUS_PENDING);\n                each(otherCharts_1, function (otherChart) {\n                  if (otherChart[CONNECT_STATUS_KEY] !== CONNECT_STATUS_UPDATING) {\n                    otherChart.dispatchAction(action_1);\n                  }\n                });\n                updateConnectedChartsStatus(otherCharts_1, CONNECT_STATUS_UPDATED);\n              }\n            });\n          });\n        };\n      }();\n      return ECharts;\n    }(Eventful);\n    var echartsProto = ECharts.prototype;\n    echartsProto.on = createRegisterEventWithLowercaseECharts('on');\n    echartsProto.off = createRegisterEventWithLowercaseECharts('off');\n    /**\r\n     * @deprecated\r\n     */\n    // @ts-ignore\n    echartsProto.one = function (eventName, cb, ctx) {\n      var self = this;\n      deprecateLog('ECharts#one is deprecated.');\n      function wrapped() {\n        var args2 = [];\n        for (var _i = 0; _i < arguments.length; _i++) {\n          args2[_i] = arguments[_i];\n        }\n        cb && cb.apply && cb.apply(this, args2);\n        // @ts-ignore\n        self.off(eventName, wrapped);\n      }\n      // @ts-ignore\n      this.on.call(this, eventName, wrapped, ctx);\n    };\n    var MOUSE_EVENT_NAMES = ['click', 'dblclick', 'mouseover', 'mouseout', 'mousemove', 'mousedown', 'mouseup', 'globalout', 'contextmenu'];\n    function disposedWarning(id) {\n      if (\"development\" !== 'production') {\n        warn('Instance ' + id + ' has been disposed');\n      }\n    }\n    var actions = {};\n    /**\r\n     * Map eventType to actionType\r\n     */\n    var eventActionMap = {};\n    var dataProcessorFuncs = [];\n    var optionPreprocessorFuncs = [];\n    var visualFuncs = [];\n    var themeStorage = {};\n    var loadingEffects = {};\n    var instances$1 = {};\n    var connectedGroups = {};\n    var idBase = +new Date() - 0;\n    var groupIdBase = +new Date() - 0;\n    var DOM_ATTRIBUTE_KEY = '_echarts_instance_';\n    /**\r\n     * @param opts.devicePixelRatio Use window.devicePixelRatio by default\r\n     * @param opts.renderer Can choose 'canvas' or 'svg' to render the chart.\r\n     * @param opts.width Use clientWidth of the input `dom` by default.\r\n     *        Can be 'auto' (the same as null/undefined)\r\n     * @param opts.height Use clientHeight of the input `dom` by default.\r\n     *        Can be 'auto' (the same as null/undefined)\r\n     * @param opts.locale Specify the locale.\r\n     * @param opts.useDirtyRect Enable dirty rectangle rendering or not.\r\n     */\n    function init$1(dom, theme, opts) {\n      var isClient = !(opts && opts.ssr);\n      if (isClient) {\n        if (\"development\" !== 'production') {\n          if (!dom) {\n            throw new Error('Initialize failed: invalid dom.');\n          }\n        }\n        var existInstance = getInstanceByDom(dom);\n        if (existInstance) {\n          if (\"development\" !== 'production') {\n            warn('There is a chart instance already initialized on the dom.');\n          }\n          return existInstance;\n        }\n        if (\"development\" !== 'production') {\n          if (isDom(dom) && dom.nodeName.toUpperCase() !== 'CANVAS' && (!dom.clientWidth && (!opts || opts.width == null) || !dom.clientHeight && (!opts || opts.height == null))) {\n            warn('Can\\'t get DOM width or height. Please check ' + 'dom.clientWidth and dom.clientHeight. They should not be 0.' + 'For example, you may need to call this in the callback ' + 'of window.onload.');\n          }\n        }\n      }\n      var chart = new ECharts(dom, theme, opts);\n      chart.id = 'ec_' + idBase++;\n      instances$1[chart.id] = chart;\n      isClient && setAttribute(dom, DOM_ATTRIBUTE_KEY, chart.id);\n      enableConnect(chart);\n      lifecycle.trigger('afterinit', chart);\n      return chart;\n    }\n    /**\r\n     * @usage\r\n     * (A)\r\n     * ```js\r\n     * let chart1 = echarts.init(dom1);\r\n     * let chart2 = echarts.init(dom2);\r\n     * chart1.group = 'xxx';\r\n     * chart2.group = 'xxx';\r\n     * echarts.connect('xxx');\r\n     * ```\r\n     * (B)\r\n     * ```js\r\n     * let chart1 = echarts.init(dom1);\r\n     * let chart2 = echarts.init(dom2);\r\n     * echarts.connect('xxx', [chart1, chart2]);\r\n     * ```\r\n     */\n    function connect(groupId) {\n      // Is array of charts\n      if (isArray(groupId)) {\n        var charts = groupId;\n        groupId = null;\n        // If any chart has group\n        each(charts, function (chart) {\n          if (chart.group != null) {\n            groupId = chart.group;\n          }\n        });\n        groupId = groupId || 'g_' + groupIdBase++;\n        each(charts, function (chart) {\n          chart.group = groupId;\n        });\n      }\n      connectedGroups[groupId] = true;\n      return groupId;\n    }\n    function disconnect(groupId) {\n      connectedGroups[groupId] = false;\n    }\n    /**\r\n     * Alias and backward compatibility\r\n     * @deprecated\r\n     */\n    var disConnect = disconnect;\n    /**\r\n     * Dispose a chart instance\r\n     */\n    function dispose$1(chart) {\n      if (isString(chart)) {\n        chart = instances$1[chart];\n      } else if (!(chart instanceof ECharts)) {\n        // Try to treat as dom\n        chart = getInstanceByDom(chart);\n      }\n      if (chart instanceof ECharts && !chart.isDisposed()) {\n        chart.dispose();\n      }\n    }\n    function getInstanceByDom(dom) {\n      return instances$1[getAttribute(dom, DOM_ATTRIBUTE_KEY)];\n    }\n    function getInstanceById(key) {\n      return instances$1[key];\n    }\n    /**\r\n     * Register theme\r\n     */\n    function registerTheme(name, theme) {\n      themeStorage[name] = theme;\n    }\n    /**\r\n     * Register option preprocessor\r\n     */\n    function registerPreprocessor(preprocessorFunc) {\n      if (indexOf(optionPreprocessorFuncs, preprocessorFunc) < 0) {\n        optionPreprocessorFuncs.push(preprocessorFunc);\n      }\n    }\n    function registerProcessor(priority, processor) {\n      normalizeRegister(dataProcessorFuncs, priority, processor, PRIORITY_PROCESSOR_DEFAULT);\n    }\n    /**\r\n     * Register postIniter\r\n     * @param {Function} postInitFunc\r\n     */\n    function registerPostInit(postInitFunc) {\n      registerUpdateLifecycle('afterinit', postInitFunc);\n    }\n    /**\r\n     * Register postUpdater\r\n     * @param {Function} postUpdateFunc\r\n     */\n    function registerPostUpdate(postUpdateFunc) {\n      registerUpdateLifecycle('afterupdate', postUpdateFunc);\n    }\n    function registerUpdateLifecycle(name, cb) {\n      lifecycle.on(name, cb);\n    }\n    function registerAction(actionInfo, eventName, action) {\n      if (isFunction(eventName)) {\n        action = eventName;\n        eventName = '';\n      }\n      var actionType = isObject(actionInfo) ? actionInfo.type : [actionInfo, actionInfo = {\n        event: eventName\n      }][0];\n      // Event name is all lowercase\n      actionInfo.event = (actionInfo.event || actionType).toLowerCase();\n      eventName = actionInfo.event;\n      if (eventActionMap[eventName]) {\n        // Already registered.\n        return;\n      }\n      // Validate action type and event name.\n      assert(ACTION_REG.test(actionType) && ACTION_REG.test(eventName));\n      if (!actions[actionType]) {\n        actions[actionType] = {\n          action: action,\n          actionInfo: actionInfo\n        };\n      }\n      eventActionMap[eventName] = actionType;\n    }\n    function registerCoordinateSystem(type, coordSysCreator) {\n      CoordinateSystemManager.register(type, coordSysCreator);\n    }\n    /**\r\n     * Get dimensions of specified coordinate system.\r\n     * @param {string} type\r\n     * @return {Array.<string|Object>}\r\n     */\n    function getCoordinateSystemDimensions(type) {\n      var coordSysCreator = CoordinateSystemManager.get(type);\n      if (coordSysCreator) {\n        return coordSysCreator.getDimensionsInfo ? coordSysCreator.getDimensionsInfo() : coordSysCreator.dimensions.slice();\n      }\n    }\n    function registerLayout(priority, layoutTask) {\n      normalizeRegister(visualFuncs, priority, layoutTask, PRIORITY_VISUAL_LAYOUT, 'layout');\n    }\n    function registerVisual(priority, visualTask) {\n      normalizeRegister(visualFuncs, priority, visualTask, PRIORITY_VISUAL_CHART, 'visual');\n    }\n    var registeredTasks = [];\n    function normalizeRegister(targetList, priority, fn, defaultPriority, visualType) {\n      if (isFunction(priority) || isObject(priority)) {\n        fn = priority;\n        priority = defaultPriority;\n      }\n      if (\"development\" !== 'production') {\n        if (isNaN(priority) || priority == null) {\n          throw new Error('Illegal priority');\n        }\n        // Check duplicate\n        each(targetList, function (wrap) {\n          assert(wrap.__raw !== fn);\n        });\n      }\n      // Already registered\n      if (indexOf(registeredTasks, fn) >= 0) {\n        return;\n      }\n      registeredTasks.push(fn);\n      var stageHandler = Scheduler.wrapStageHandler(fn, visualType);\n      stageHandler.__prio = priority;\n      stageHandler.__raw = fn;\n      targetList.push(stageHandler);\n    }\n    function registerLoading(name, loadingFx) {\n      loadingEffects[name] = loadingFx;\n    }\n    /**\r\n     * ZRender need a canvas context to do measureText.\r\n     * But in node environment canvas may be created by node-canvas.\r\n     * So we need to specify how to create a canvas instead of using document.createElement('canvas')\r\n     *\r\n     *\r\n     * @deprecated use setPlatformAPI({ createCanvas }) instead.\r\n     *\r\n     * @example\r\n     *     let Canvas = require('canvas');\r\n     *     let echarts = require('echarts');\r\n     *     echarts.setCanvasCreator(function () {\r\n     *         // Small size is enough.\r\n     *         return new Canvas(32, 32);\r\n     *     });\r\n     */\n    function setCanvasCreator(creator) {\n      if (\"development\" !== 'production') {\n        deprecateLog('setCanvasCreator is deprecated. Use setPlatformAPI({ createCanvas }) instead.');\n      }\n      setPlatformAPI({\n        createCanvas: creator\n      });\n    }\n    /**\r\n     * The parameters and usage: see `geoSourceManager.registerMap`.\r\n     * Compatible with previous `echarts.registerMap`.\r\n     */\n    function registerMap(mapName, geoJson, specialAreas) {\n      var registerMap = getImpl('registerMap');\n      registerMap && registerMap(mapName, geoJson, specialAreas);\n    }\n    function getMap(mapName) {\n      var getMap = getImpl('getMap');\n      return getMap && getMap(mapName);\n    }\n    var registerTransform = registerExternalTransform;\n    /**\r\n     * Globa dispatchAction to a specified chart instance.\r\n     */\n    // export function dispatchAction(payload: { chartId: string } & Payload, opt?: Parameters<ECharts['dispatchAction']>[1]) {\n    //     if (!payload || !payload.chartId) {\n    //         // Must have chartId to find chart\n    //         return;\n    //     }\n    //     const chart = instances[payload.chartId];\n    //     if (chart) {\n    //         chart.dispatchAction(payload, opt);\n    //     }\n    // }\n    // Builtin global visual\n    registerVisual(PRIORITY_VISUAL_GLOBAL, seriesStyleTask);\n    registerVisual(PRIORITY_VISUAL_CHART_DATA_CUSTOM, dataStyleTask);\n    registerVisual(PRIORITY_VISUAL_CHART_DATA_CUSTOM, dataColorPaletteTask);\n    registerVisual(PRIORITY_VISUAL_GLOBAL, seriesSymbolTask);\n    registerVisual(PRIORITY_VISUAL_CHART_DATA_CUSTOM, dataSymbolTask);\n    registerVisual(PRIORITY_VISUAL_DECAL, decalVisual);\n    registerPreprocessor(globalBackwardCompat);\n    registerProcessor(PRIORITY_PROCESSOR_DATASTACK, dataStack);\n    registerLoading('default', defaultLoading);\n    // Default actions\n    registerAction({\n      type: HIGHLIGHT_ACTION_TYPE,\n      event: HIGHLIGHT_ACTION_TYPE,\n      update: HIGHLIGHT_ACTION_TYPE\n    }, noop);\n    registerAction({\n      type: DOWNPLAY_ACTION_TYPE,\n      event: DOWNPLAY_ACTION_TYPE,\n      update: DOWNPLAY_ACTION_TYPE\n    }, noop);\n    registerAction({\n      type: SELECT_ACTION_TYPE,\n      event: SELECT_ACTION_TYPE,\n      update: SELECT_ACTION_TYPE\n    }, noop);\n    registerAction({\n      type: UNSELECT_ACTION_TYPE,\n      event: UNSELECT_ACTION_TYPE,\n      update: UNSELECT_ACTION_TYPE\n    }, noop);\n    registerAction({\n      type: TOGGLE_SELECT_ACTION_TYPE,\n      event: TOGGLE_SELECT_ACTION_TYPE,\n      update: TOGGLE_SELECT_ACTION_TYPE\n    }, noop);\n    // Default theme\n    registerTheme('light', lightTheme);\n    registerTheme('dark', theme);\n    // For backward compatibility, where the namespace `dataTool` will\n    // be mounted on `echarts` is the extension `dataTool` is imported.\n    var dataTool = {};\n\n    var extensions = [];\n    var extensionRegisters = {\n      registerPreprocessor: registerPreprocessor,\n      registerProcessor: registerProcessor,\n      registerPostInit: registerPostInit,\n      registerPostUpdate: registerPostUpdate,\n      registerUpdateLifecycle: registerUpdateLifecycle,\n      registerAction: registerAction,\n      registerCoordinateSystem: registerCoordinateSystem,\n      registerLayout: registerLayout,\n      registerVisual: registerVisual,\n      registerTransform: registerTransform,\n      registerLoading: registerLoading,\n      registerMap: registerMap,\n      registerImpl: registerImpl,\n      PRIORITY: PRIORITY,\n      ComponentModel: ComponentModel,\n      ComponentView: ComponentView,\n      SeriesModel: SeriesModel,\n      ChartView: ChartView,\n      // TODO Use ComponentModel and SeriesModel instead of Constructor\n      registerComponentModel: function (ComponentModelClass) {\n        ComponentModel.registerClass(ComponentModelClass);\n      },\n      registerComponentView: function (ComponentViewClass) {\n        ComponentView.registerClass(ComponentViewClass);\n      },\n      registerSeriesModel: function (SeriesModelClass) {\n        SeriesModel.registerClass(SeriesModelClass);\n      },\n      registerChartView: function (ChartViewClass) {\n        ChartView.registerClass(ChartViewClass);\n      },\n      registerSubTypeDefaulter: function (componentType, defaulter) {\n        ComponentModel.registerSubTypeDefaulter(componentType, defaulter);\n      },\n      registerPainter: function (painterType, PainterCtor) {\n        registerPainter(painterType, PainterCtor);\n      }\n    };\n    function use(ext) {\n      if (isArray(ext)) {\n        // use([ChartLine, ChartBar]);\n        each(ext, function (singleExt) {\n          use(singleExt);\n        });\n        return;\n      }\n      if (indexOf(extensions, ext) >= 0) {\n        return;\n      }\n      extensions.push(ext);\n      if (isFunction(ext)) {\n        ext = {\n          install: ext\n        };\n      }\n      ext.install(extensionRegisters);\n    }\n\n    /*\n    * Licensed to the Apache Software Foundation (ASF) under one\n    * or more contributor license agreements.  See the NOTICE file\n    * distributed with this work for additional information\n    * regarding copyright ownership.  The ASF licenses this file\n    * to you under the Apache License, Version 2.0 (the\n    * \"License\"); you may not use this file except in compliance\n    * with the License.  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,\n    * software distributed under the License is distributed on an\n    * \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\n    * KIND, either express or implied.  See the License for the\n    * specific language governing permissions and limitations\n    * under the License.\n    */\n\n\n    /**\n     * AUTO-GENERATED FILE. DO NOT MODIFY.\n     */\n\n    /*\r\n    * Licensed to the Apache Software Foundation (ASF) under one\r\n    * or more contributor license agreements.  See the NOTICE file\r\n    * distributed with this work for additional information\r\n    * regarding copyright ownership.  The ASF licenses this file\r\n    * to you under the Apache License, Version 2.0 (the\r\n    * \"License\"); you may not use this file except in compliance\r\n    * with the License.  You may obtain a copy of the License at\r\n    *\r\n    *   http://www.apache.org/licenses/LICENSE-2.0\r\n    *\r\n    * Unless required by applicable law or agreed to in writing,\r\n    * software distributed under the License is distributed on an\r\n    * \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\r\n    * KIND, either express or implied.  See the License for the\r\n    * specific language governing permissions and limitations\r\n    * under the License.\r\n    */\n    function dataIndexMapValueLength(valNumOrArrLengthMoreThan2) {\n      return valNumOrArrLengthMoreThan2 == null ? 0 : valNumOrArrLengthMoreThan2.length || 1;\n    }\n    function defaultKeyGetter(item) {\n      return item;\n    }\n    var DataDiffer = /** @class */function () {\n      /**\r\n       * @param context Can be visited by this.context in callback.\r\n       */\n      function DataDiffer(oldArr, newArr, oldKeyGetter, newKeyGetter, context,\n      // By default: 'oneToOne'.\n      diffMode) {\n        this._old = oldArr;\n        this._new = newArr;\n        this._oldKeyGetter = oldKeyGetter || defaultKeyGetter;\n        this._newKeyGetter = newKeyGetter || defaultKeyGetter;\n        // Visible in callback via `this.context`;\n        this.context = context;\n        this._diffModeMultiple = diffMode === 'multiple';\n      }\n      /**\r\n       * Callback function when add a data\r\n       */\n      DataDiffer.prototype.add = function (func) {\n        this._add = func;\n        return this;\n      };\n      /**\r\n       * Callback function when update a data\r\n       */\n      DataDiffer.prototype.update = function (func) {\n        this._update = func;\n        return this;\n      };\n      /**\r\n       * Callback function when update a data and only work in `cbMode: 'byKey'`.\r\n       */\n      DataDiffer.prototype.updateManyToOne = function (func) {\n        this._updateManyToOne = func;\n        return this;\n      };\n      /**\r\n       * Callback function when update a data and only work in `cbMode: 'byKey'`.\r\n       */\n      DataDiffer.prototype.updateOneToMany = function (func) {\n        this._updateOneToMany = func;\n        return this;\n      };\n      /**\r\n       * Callback function when update a data and only work in `cbMode: 'byKey'`.\r\n       */\n      DataDiffer.prototype.updateManyToMany = function (func) {\n        this._updateManyToMany = func;\n        return this;\n      };\n      /**\r\n       * Callback function when remove a data\r\n       */\n      DataDiffer.prototype.remove = function (func) {\n        this._remove = func;\n        return this;\n      };\n      DataDiffer.prototype.execute = function () {\n        this[this._diffModeMultiple ? '_executeMultiple' : '_executeOneToOne']();\n      };\n      DataDiffer.prototype._executeOneToOne = function () {\n        var oldArr = this._old;\n        var newArr = this._new;\n        var newDataIndexMap = {};\n        var oldDataKeyArr = new Array(oldArr.length);\n        var newDataKeyArr = new Array(newArr.length);\n        this._initIndexMap(oldArr, null, oldDataKeyArr, '_oldKeyGetter');\n        this._initIndexMap(newArr, newDataIndexMap, newDataKeyArr, '_newKeyGetter');\n        for (var i = 0; i < oldArr.length; i++) {\n          var oldKey = oldDataKeyArr[i];\n          var newIdxMapVal = newDataIndexMap[oldKey];\n          var newIdxMapValLen = dataIndexMapValueLength(newIdxMapVal);\n          // idx can never be empty array here. see 'set null' logic below.\n          if (newIdxMapValLen > 1) {\n            // Consider there is duplicate key (for example, use dataItem.name as key).\n            // We should make sure every item in newArr and oldArr can be visited.\n            var newIdx = newIdxMapVal.shift();\n            if (newIdxMapVal.length === 1) {\n              newDataIndexMap[oldKey] = newIdxMapVal[0];\n            }\n            this._update && this._update(newIdx, i);\n          } else if (newIdxMapValLen === 1) {\n            newDataIndexMap[oldKey] = null;\n            this._update && this._update(newIdxMapVal, i);\n          } else {\n            this._remove && this._remove(i);\n          }\n        }\n        this._performRestAdd(newDataKeyArr, newDataIndexMap);\n      };\n      /**\r\n       * For example, consider the case:\r\n       * oldData: [o0, o1, o2, o3, o4, o5, o6, o7],\r\n       * newData: [n0, n1, n2, n3, n4, n5, n6, n7, n8],\r\n       * Where:\r\n       *     o0, o1, n0 has key 'a' (many to one)\r\n       *     o5, n4, n5, n6 has key 'b' (one to many)\r\n       *     o2, n1 has key 'c' (one to one)\r\n       *     n2, n3 has key 'd' (add)\r\n       *     o3, o4 has key 'e' (remove)\r\n       *     o6, o7, n7, n8 has key 'f' (many to many, treated as add and remove)\r\n       * Then:\r\n       *     (The order of the following directives are not ensured.)\r\n       *     this._updateManyToOne(n0, [o0, o1]);\r\n       *     this._updateOneToMany([n4, n5, n6], o5);\r\n       *     this._update(n1, o2);\r\n       *     this._remove(o3);\r\n       *     this._remove(o4);\r\n       *     this._remove(o6);\r\n       *     this._remove(o7);\r\n       *     this._add(n2);\r\n       *     this._add(n3);\r\n       *     this._add(n7);\r\n       *     this._add(n8);\r\n       */\n      DataDiffer.prototype._executeMultiple = function () {\n        var oldArr = this._old;\n        var newArr = this._new;\n        var oldDataIndexMap = {};\n        var newDataIndexMap = {};\n        var oldDataKeyArr = [];\n        var newDataKeyArr = [];\n        this._initIndexMap(oldArr, oldDataIndexMap, oldDataKeyArr, '_oldKeyGetter');\n        this._initIndexMap(newArr, newDataIndexMap, newDataKeyArr, '_newKeyGetter');\n        for (var i = 0; i < oldDataKeyArr.length; i++) {\n          var oldKey = oldDataKeyArr[i];\n          var oldIdxMapVal = oldDataIndexMap[oldKey];\n          var newIdxMapVal = newDataIndexMap[oldKey];\n          var oldIdxMapValLen = dataIndexMapValueLength(oldIdxMapVal);\n          var newIdxMapValLen = dataIndexMapValueLength(newIdxMapVal);\n          if (oldIdxMapValLen > 1 && newIdxMapValLen === 1) {\n            this._updateManyToOne && this._updateManyToOne(newIdxMapVal, oldIdxMapVal);\n            newDataIndexMap[oldKey] = null;\n          } else if (oldIdxMapValLen === 1 && newIdxMapValLen > 1) {\n            this._updateOneToMany && this._updateOneToMany(newIdxMapVal, oldIdxMapVal);\n            newDataIndexMap[oldKey] = null;\n          } else if (oldIdxMapValLen === 1 && newIdxMapValLen === 1) {\n            this._update && this._update(newIdxMapVal, oldIdxMapVal);\n            newDataIndexMap[oldKey] = null;\n          } else if (oldIdxMapValLen > 1 && newIdxMapValLen > 1) {\n            this._updateManyToMany && this._updateManyToMany(newIdxMapVal, oldIdxMapVal);\n            newDataIndexMap[oldKey] = null;\n          } else if (oldIdxMapValLen > 1) {\n            for (var i_1 = 0; i_1 < oldIdxMapValLen; i_1++) {\n              this._remove && this._remove(oldIdxMapVal[i_1]);\n            }\n          } else {\n            this._remove && this._remove(oldIdxMapVal);\n          }\n        }\n        this._performRestAdd(newDataKeyArr, newDataIndexMap);\n      };\n      DataDiffer.prototype._performRestAdd = function (newDataKeyArr, newDataIndexMap) {\n        for (var i = 0; i < newDataKeyArr.length; i++) {\n          var newKey = newDataKeyArr[i];\n          var newIdxMapVal = newDataIndexMap[newKey];\n          var idxMapValLen = dataIndexMapValueLength(newIdxMapVal);\n          if (idxMapValLen > 1) {\n            for (var j = 0; j < idxMapValLen; j++) {\n              this._add && this._add(newIdxMapVal[j]);\n            }\n          } else if (idxMapValLen === 1) {\n            this._add && this._add(newIdxMapVal);\n          }\n          // Support both `newDataKeyArr` are duplication removed or not removed.\n          newDataIndexMap[newKey] = null;\n        }\n      };\n      DataDiffer.prototype._initIndexMap = function (arr,\n      // Can be null.\n      map,\n      // In 'byKey', the output `keyArr` is duplication removed.\n      // In 'byIndex', the output `keyArr` is not duplication removed and\n      //     its indices are accurately corresponding to `arr`.\n      keyArr, keyGetterName) {\n        var cbModeMultiple = this._diffModeMultiple;\n        for (var i = 0; i < arr.length; i++) {\n          // Add prefix to avoid conflict with Object.prototype.\n          var key = '_ec_' + this[keyGetterName](arr[i], i);\n          if (!cbModeMultiple) {\n            keyArr[i] = key;\n          }\n          if (!map) {\n            continue;\n          }\n          var idxMapVal = map[key];\n          var idxMapValLen = dataIndexMapValueLength(idxMapVal);\n          if (idxMapValLen === 0) {\n            // Simple optimize: in most cases, one index has one key,\n            // do not need array.\n            map[key] = i;\n            if (cbModeMultiple) {\n              keyArr.push(key);\n            }\n          } else if (idxMapValLen === 1) {\n            map[key] = [idxMapVal, i];\n          } else {\n            idxMapVal.push(i);\n          }\n        }\n      };\n      return DataDiffer;\n    }();\n\n    var DimensionUserOuput = /** @class */function () {\n      function DimensionUserOuput(encode, dimRequest) {\n        this._encode = encode;\n        this._schema = dimRequest;\n      }\n      DimensionUserOuput.prototype.get = function () {\n        return {\n          // Do not generate full dimension name until fist used.\n          fullDimensions: this._getFullDimensionNames(),\n          encode: this._encode\n        };\n      };\n      /**\r\n       * Get all data store dimension names.\r\n       * Theoretically a series data store is defined both by series and used dataset (if any).\r\n       * If some dimensions are omitted for performance reason in `this.dimensions`,\r\n       * the dimension name may not be auto-generated if user does not specify a dimension name.\r\n       * In this case, the dimension name is `null`/`undefined`.\r\n       */\n      DimensionUserOuput.prototype._getFullDimensionNames = function () {\n        if (!this._cachedDimNames) {\n          this._cachedDimNames = this._schema ? this._schema.makeOutputDimensionNames() : [];\n        }\n        return this._cachedDimNames;\n      };\n      return DimensionUserOuput;\n    }();\n    function summarizeDimensions(data, schema) {\n      var summary = {};\n      var encode = summary.encode = {};\n      var notExtraCoordDimMap = createHashMap();\n      var defaultedLabel = [];\n      var defaultedTooltip = [];\n      var userOutputEncode = {};\n      each(data.dimensions, function (dimName) {\n        var dimItem = data.getDimensionInfo(dimName);\n        var coordDim = dimItem.coordDim;\n        if (coordDim) {\n          if (\"development\" !== 'production') {\n            assert(VISUAL_DIMENSIONS.get(coordDim) == null);\n          }\n          var coordDimIndex = dimItem.coordDimIndex;\n          getOrCreateEncodeArr(encode, coordDim)[coordDimIndex] = dimName;\n          if (!dimItem.isExtraCoord) {\n            notExtraCoordDimMap.set(coordDim, 1);\n            // Use the last coord dim (and label friendly) as default label,\n            // because when dataset is used, it is hard to guess which dimension\n            // can be value dimension. If both show x, y on label is not look good,\n            // and conventionally y axis is focused more.\n            if (mayLabelDimType(dimItem.type)) {\n              defaultedLabel[0] = dimName;\n            }\n            // User output encode do not contain generated coords.\n            // And it only has index. User can use index to retrieve value from the raw item array.\n            getOrCreateEncodeArr(userOutputEncode, coordDim)[coordDimIndex] = data.getDimensionIndex(dimItem.name);\n          }\n          if (dimItem.defaultTooltip) {\n            defaultedTooltip.push(dimName);\n          }\n        }\n        VISUAL_DIMENSIONS.each(function (v, otherDim) {\n          var encodeArr = getOrCreateEncodeArr(encode, otherDim);\n          var dimIndex = dimItem.otherDims[otherDim];\n          if (dimIndex != null && dimIndex !== false) {\n            encodeArr[dimIndex] = dimItem.name;\n          }\n        });\n      });\n      var dataDimsOnCoord = [];\n      var encodeFirstDimNotExtra = {};\n      notExtraCoordDimMap.each(function (v, coordDim) {\n        var dimArr = encode[coordDim];\n        encodeFirstDimNotExtra[coordDim] = dimArr[0];\n        // Not necessary to remove duplicate, because a data\n        // dim canot on more than one coordDim.\n        dataDimsOnCoord = dataDimsOnCoord.concat(dimArr);\n      });\n      summary.dataDimsOnCoord = dataDimsOnCoord;\n      summary.dataDimIndicesOnCoord = map(dataDimsOnCoord, function (dimName) {\n        return data.getDimensionInfo(dimName).storeDimIndex;\n      });\n      summary.encodeFirstDimNotExtra = encodeFirstDimNotExtra;\n      var encodeLabel = encode.label;\n      // FIXME `encode.label` is not recommended, because formatter cannot be set\n      // in this way. Use label.formatter instead. Maybe remove this approach someday.\n      if (encodeLabel && encodeLabel.length) {\n        defaultedLabel = encodeLabel.slice();\n      }\n      var encodeTooltip = encode.tooltip;\n      if (encodeTooltip && encodeTooltip.length) {\n        defaultedTooltip = encodeTooltip.slice();\n      } else if (!defaultedTooltip.length) {\n        defaultedTooltip = defaultedLabel.slice();\n      }\n      encode.defaultedLabel = defaultedLabel;\n      encode.defaultedTooltip = defaultedTooltip;\n      summary.userOutput = new DimensionUserOuput(userOutputEncode, schema);\n      return summary;\n    }\n    function getOrCreateEncodeArr(encode, dim) {\n      if (!encode.hasOwnProperty(dim)) {\n        encode[dim] = [];\n      }\n      return encode[dim];\n    }\n    // FIXME:TS should be type `AxisType`\n    function getDimensionTypeByAxis(axisType) {\n      return axisType === 'category' ? 'ordinal' : axisType === 'time' ? 'time' : 'float';\n    }\n    function mayLabelDimType(dimType) {\n      // In most cases, ordinal and time do not suitable for label.\n      // Ordinal info can be displayed on axis. Time is too long.\n      return !(dimType === 'ordinal' || dimType === 'time');\n    }\n    // function findTheLastDimMayLabel(data) {\n    //     // Get last value dim\n    //     let dimensions = data.dimensions.slice();\n    //     let valueType;\n    //     let valueDim;\n    //     while (dimensions.length && (\n    //         valueDim = dimensions.pop(),\n    //         valueType = data.getDimensionInfo(valueDim).type,\n    //         valueType === 'ordinal' || valueType === 'time'\n    //     )) {} // jshint ignore:line\n    //     return valueDim;\n    // }\n\n    var SeriesDimensionDefine = /** @class */function () {\n      /**\r\n       * @param opt All of the fields will be shallow copied.\r\n       */\n      function SeriesDimensionDefine(opt) {\n        /**\r\n         * The format of `otherDims` is:\r\n         * ```js\r\n         * {\r\n         *     tooltip?: number\r\n         *     label?: number\r\n         *     itemName?: number\r\n         *     seriesName?: number\r\n         * }\r\n         * ```\r\n         *\r\n         * A `series.encode` can specified these fields:\r\n         * ```js\r\n         * encode: {\r\n         *     // \"3, 1, 5\" is the index of data dimension.\r\n         *     tooltip: [3, 1, 5],\r\n         *     label: [0, 3],\r\n         *     ...\r\n         * }\r\n         * ```\r\n         * `otherDims` is the parse result of the `series.encode` above, like:\r\n         * ```js\r\n         * // Suppose the index of this data dimension is `3`.\r\n         * this.otherDims = {\r\n         *     // `3` is at the index `0` of the `encode.tooltip`\r\n         *     tooltip: 0,\r\n         *     // `3` is at the index `1` of the `encode.label`\r\n         *     label: 1\r\n         * };\r\n         * ```\r\n         *\r\n         * This prop should never be `null`/`undefined` after initialized.\r\n         */\n        this.otherDims = {};\n        if (opt != null) {\n          extend(this, opt);\n        }\n      }\n      return SeriesDimensionDefine;\n    }();\n\n    var inner$4 = makeInner();\n    var dimTypeShort = {\n      float: 'f',\n      int: 'i',\n      ordinal: 'o',\n      number: 'n',\n      time: 't'\n    };\n    /**\r\n     * Represents the dimension requirement of a series.\r\n     *\r\n     * NOTICE:\r\n     * When there are too many dimensions in dataset and many series, only the used dimensions\r\n     * (i.e., used by coord sys and declared in `series.encode`) are add to `dimensionDefineList`.\r\n     * But users may query data by other unused dimension names.\r\n     * In this case, users can only query data if and only if they have defined dimension names\r\n     * via ec option, so we provide `getDimensionIndexFromSource`, which only query them from\r\n     * `source` dimensions.\r\n     */\n    var SeriesDataSchema = /** @class */function () {\n      function SeriesDataSchema(opt) {\n        this.dimensions = opt.dimensions;\n        this._dimOmitted = opt.dimensionOmitted;\n        this.source = opt.source;\n        this._fullDimCount = opt.fullDimensionCount;\n        this._updateDimOmitted(opt.dimensionOmitted);\n      }\n      SeriesDataSchema.prototype.isDimensionOmitted = function () {\n        return this._dimOmitted;\n      };\n      SeriesDataSchema.prototype._updateDimOmitted = function (dimensionOmitted) {\n        this._dimOmitted = dimensionOmitted;\n        if (!dimensionOmitted) {\n          return;\n        }\n        if (!this._dimNameMap) {\n          this._dimNameMap = ensureSourceDimNameMap(this.source);\n        }\n      };\n      /**\r\n       * @caution Can only be used when `dimensionOmitted: true`.\r\n       *\r\n       * Get index by user defined dimension name (i.e., not internal generate name).\r\n       * That is, get index from `dimensionsDefine`.\r\n       * If no `dimensionsDefine`, or no name get, return -1.\r\n       */\n      SeriesDataSchema.prototype.getSourceDimensionIndex = function (dimName) {\n        return retrieve2(this._dimNameMap.get(dimName), -1);\n      };\n      /**\r\n       * @caution Can only be used when `dimensionOmitted: true`.\r\n       *\r\n       * Notice: may return `null`/`undefined` if user not specify dimension names.\r\n       */\n      SeriesDataSchema.prototype.getSourceDimension = function (dimIndex) {\n        var dimensionsDefine = this.source.dimensionsDefine;\n        if (dimensionsDefine) {\n          return dimensionsDefine[dimIndex];\n        }\n      };\n      SeriesDataSchema.prototype.makeStoreSchema = function () {\n        var dimCount = this._fullDimCount;\n        var willRetrieveDataByName = shouldRetrieveDataByName(this.source);\n        var makeHashStrict = !shouldOmitUnusedDimensions(dimCount);\n        // If source don't have dimensions or series don't omit unsed dimensions.\n        // Generate from seriesDimList directly\n        var dimHash = '';\n        var dims = [];\n        for (var fullDimIdx = 0, seriesDimIdx = 0; fullDimIdx < dimCount; fullDimIdx++) {\n          var property = void 0;\n          var type = void 0;\n          var ordinalMeta = void 0;\n          var seriesDimDef = this.dimensions[seriesDimIdx];\n          // The list has been sorted by `storeDimIndex` asc.\n          if (seriesDimDef && seriesDimDef.storeDimIndex === fullDimIdx) {\n            property = willRetrieveDataByName ? seriesDimDef.name : null;\n            type = seriesDimDef.type;\n            ordinalMeta = seriesDimDef.ordinalMeta;\n            seriesDimIdx++;\n          } else {\n            var sourceDimDef = this.getSourceDimension(fullDimIdx);\n            if (sourceDimDef) {\n              property = willRetrieveDataByName ? sourceDimDef.name : null;\n              type = sourceDimDef.type;\n            }\n          }\n          dims.push({\n            property: property,\n            type: type,\n            ordinalMeta: ordinalMeta\n          });\n          // If retrieving data by index,\n          //   use <index, type, ordinalMeta> to determine whether data can be shared.\n          //   (Because in this case there might be no dimension name defined in dataset, but indices always exists).\n          //   (Indices are always 0, 1, 2, ..., so we can ignore them to shorten the hash).\n          // Otherwise if retrieving data by property name (like `data: [{aa: 123, bb: 765}, ...]`),\n          //   use <property, type, ordinalMeta> in hash.\n          if (willRetrieveDataByName && property != null\n          // For data stack, we have make sure each series has its own dim on this store.\n          // So we do not add property to hash to make sure they can share this store.\n          && (!seriesDimDef || !seriesDimDef.isCalculationCoord)) {\n            dimHash += makeHashStrict\n            // Use escape character '`' in case that property name contains '$'.\n            ? property.replace(/\\`/g, '`1').replace(/\\$/g, '`2')\n            // For better performance, when there are large dimensions, tolerant this defects that hardly meet.\n            : property;\n          }\n          dimHash += '$';\n          dimHash += dimTypeShort[type] || 'f';\n          if (ordinalMeta) {\n            dimHash += ordinalMeta.uid;\n          }\n          dimHash += '$';\n        }\n        // Source from endpoint(usually series) will be read differently\n        // when seriesLayoutBy or startIndex(which is affected by sourceHeader) are different.\n        // So we use this three props as key.\n        var source = this.source;\n        var hash = [source.seriesLayoutBy, source.startIndex, dimHash].join('$$');\n        return {\n          dimensions: dims,\n          hash: hash\n        };\n      };\n      SeriesDataSchema.prototype.makeOutputDimensionNames = function () {\n        var result = [];\n        for (var fullDimIdx = 0, seriesDimIdx = 0; fullDimIdx < this._fullDimCount; fullDimIdx++) {\n          var name_1 = void 0;\n          var seriesDimDef = this.dimensions[seriesDimIdx];\n          // The list has been sorted by `storeDimIndex` asc.\n          if (seriesDimDef && seriesDimDef.storeDimIndex === fullDimIdx) {\n            if (!seriesDimDef.isCalculationCoord) {\n              name_1 = seriesDimDef.name;\n            }\n            seriesDimIdx++;\n          } else {\n            var sourceDimDef = this.getSourceDimension(fullDimIdx);\n            if (sourceDimDef) {\n              name_1 = sourceDimDef.name;\n            }\n          }\n          result.push(name_1);\n        }\n        return result;\n      };\n      SeriesDataSchema.prototype.appendCalculationDimension = function (dimDef) {\n        this.dimensions.push(dimDef);\n        dimDef.isCalculationCoord = true;\n        this._fullDimCount++;\n        // If append dimension on a data store, consider the store\n        // might be shared by different series, series dimensions not\n        // really map to store dimensions.\n        this._updateDimOmitted(true);\n      };\n      return SeriesDataSchema;\n    }();\n    function isSeriesDataSchema(schema) {\n      return schema instanceof SeriesDataSchema;\n    }\n    function createDimNameMap(dimsDef) {\n      var dataDimNameMap = createHashMap();\n      for (var i = 0; i < (dimsDef || []).length; i++) {\n        var dimDefItemRaw = dimsDef[i];\n        var userDimName = isObject(dimDefItemRaw) ? dimDefItemRaw.name : dimDefItemRaw;\n        if (userDimName != null && dataDimNameMap.get(userDimName) == null) {\n          dataDimNameMap.set(userDimName, i);\n        }\n      }\n      return dataDimNameMap;\n    }\n    function ensureSourceDimNameMap(source) {\n      var innerSource = inner$4(source);\n      return innerSource.dimNameMap || (innerSource.dimNameMap = createDimNameMap(source.dimensionsDefine));\n    }\n    function shouldOmitUnusedDimensions(dimCount) {\n      return dimCount > 30;\n    }\n\n    var isObject$2 = isObject;\n    var map$1 = map;\n    var CtorInt32Array$1 = typeof Int32Array === 'undefined' ? Array : Int32Array;\n    // Use prefix to avoid index to be the same as otherIdList[idx],\n    // which will cause weird update animation.\n    var ID_PREFIX = 'e\\0\\0';\n    var INDEX_NOT_FOUND = -1;\n    // type SeriesDimensionIndex = DimensionIndex;\n    var TRANSFERABLE_PROPERTIES = ['hasItemOption', '_nameList', '_idList', '_invertedIndicesMap', '_dimSummary', 'userOutput', '_rawData', '_dimValueGetter', '_nameDimIdx', '_idDimIdx', '_nameRepeatCount'];\n    var CLONE_PROPERTIES = ['_approximateExtent'];\n    // -----------------------------\n    // Internal method declarations:\n    // -----------------------------\n    var prepareInvertedIndex;\n    var getId;\n    var getIdNameFromStore;\n    var normalizeDimensions;\n    var transferProperties;\n    var cloneListForMapAndSample;\n    var makeIdFromName;\n    var SeriesData = /** @class */function () {\n      /**\r\n       * @param dimensionsInput.dimensions\r\n       *        For example, ['someDimName', {name: 'someDimName', type: 'someDimType'}, ...].\r\n       *        Dimensions should be concrete names like x, y, z, lng, lat, angle, radius\r\n       */\n      function SeriesData(dimensionsInput, hostModel) {\n        this.type = 'list';\n        this._dimOmitted = false;\n        this._nameList = [];\n        this._idList = [];\n        // Models of data option is stored sparse for optimizing memory cost\n        // Never used yet (not used yet).\n        // private _optionModels: Model[] = [];\n        // Global visual properties after visual coding\n        this._visual = {};\n        // Global layout properties.\n        this._layout = {};\n        // Item visual properties after visual coding\n        this._itemVisuals = [];\n        // Item layout properties after layout\n        this._itemLayouts = [];\n        // Graphic elements\n        this._graphicEls = [];\n        // key: dim, value: extent\n        this._approximateExtent = {};\n        this._calculationInfo = {};\n        // Having detected that there is data item is non primitive type\n        // (in type `OptionDataItemObject`).\n        // Like `data: [ { value: xx, itemStyle: {...} }, ...]`\n        // At present it only happen in `SOURCE_FORMAT_ORIGINAL`.\n        this.hasItemOption = false;\n        // Methods that create a new list based on this list should be listed here.\n        // Notice that those method should `RETURN` the new list.\n        this.TRANSFERABLE_METHODS = ['cloneShallow', 'downSample', 'minmaxDownSample', 'lttbDownSample', 'map'];\n        // Methods that change indices of this list should be listed here.\n        this.CHANGABLE_METHODS = ['filterSelf', 'selectRange'];\n        this.DOWNSAMPLE_METHODS = ['downSample', 'minmaxDownSample', 'lttbDownSample'];\n        var dimensions;\n        var assignStoreDimIdx = false;\n        if (isSeriesDataSchema(dimensionsInput)) {\n          dimensions = dimensionsInput.dimensions;\n          this._dimOmitted = dimensionsInput.isDimensionOmitted();\n          this._schema = dimensionsInput;\n        } else {\n          assignStoreDimIdx = true;\n          dimensions = dimensionsInput;\n        }\n        dimensions = dimensions || ['x', 'y'];\n        var dimensionInfos = {};\n        var dimensionNames = [];\n        var invertedIndicesMap = {};\n        var needsHasOwn = false;\n        var emptyObj = {};\n        for (var i = 0; i < dimensions.length; i++) {\n          // Use the original dimensions[i], where other flag props may exists.\n          var dimInfoInput = dimensions[i];\n          var dimensionInfo = isString(dimInfoInput) ? new SeriesDimensionDefine({\n            name: dimInfoInput\n          }) : !(dimInfoInput instanceof SeriesDimensionDefine) ? new SeriesDimensionDefine(dimInfoInput) : dimInfoInput;\n          var dimensionName = dimensionInfo.name;\n          dimensionInfo.type = dimensionInfo.type || 'float';\n          if (!dimensionInfo.coordDim) {\n            dimensionInfo.coordDim = dimensionName;\n            dimensionInfo.coordDimIndex = 0;\n          }\n          var otherDims = dimensionInfo.otherDims = dimensionInfo.otherDims || {};\n          dimensionNames.push(dimensionName);\n          dimensionInfos[dimensionName] = dimensionInfo;\n          if (emptyObj[dimensionName] != null) {\n            needsHasOwn = true;\n          }\n          if (dimensionInfo.createInvertedIndices) {\n            invertedIndicesMap[dimensionName] = [];\n          }\n          if (otherDims.itemName === 0) {\n            this._nameDimIdx = i;\n          }\n          if (otherDims.itemId === 0) {\n            this._idDimIdx = i;\n          }\n          if (\"development\" !== 'production') {\n            assert(assignStoreDimIdx || dimensionInfo.storeDimIndex >= 0);\n          }\n          if (assignStoreDimIdx) {\n            dimensionInfo.storeDimIndex = i;\n          }\n        }\n        this.dimensions = dimensionNames;\n        this._dimInfos = dimensionInfos;\n        this._initGetDimensionInfo(needsHasOwn);\n        this.hostModel = hostModel;\n        this._invertedIndicesMap = invertedIndicesMap;\n        if (this._dimOmitted) {\n          var dimIdxToName_1 = this._dimIdxToName = createHashMap();\n          each(dimensionNames, function (dimName) {\n            dimIdxToName_1.set(dimensionInfos[dimName].storeDimIndex, dimName);\n          });\n        }\n      }\n      /**\r\n       *\r\n       * Get concrete dimension name by dimension name or dimension index.\r\n       * If input a dimension name, do not validate whether the dimension name exits.\r\n       *\r\n       * @caution\r\n       * @param dim Must make sure the dimension is `SeriesDimensionLoose`.\r\n       * Because only those dimensions will have auto-generated dimension names if not\r\n       * have a user-specified name, and other dimensions will get a return of null/undefined.\r\n       *\r\n       * @notice Because of this reason, should better use `getDimensionIndex` instead, for examples:\r\n       * ```js\r\n       * const val = data.getStore().get(data.getDimensionIndex(dim), dataIdx);\r\n       * ```\r\n       *\r\n       * @return Concrete dim name.\r\n       */\n      SeriesData.prototype.getDimension = function (dim) {\n        var dimIdx = this._recognizeDimIndex(dim);\n        if (dimIdx == null) {\n          return dim;\n        }\n        dimIdx = dim;\n        if (!this._dimOmitted) {\n          return this.dimensions[dimIdx];\n        }\n        // Retrieve from series dimension definition because it probably contains\n        // generated dimension name (like 'x', 'y').\n        var dimName = this._dimIdxToName.get(dimIdx);\n        if (dimName != null) {\n          return dimName;\n        }\n        var sourceDimDef = this._schema.getSourceDimension(dimIdx);\n        if (sourceDimDef) {\n          return sourceDimDef.name;\n        }\n      };\n      /**\r\n       * Get dimension index in data store. Return -1 if not found.\r\n       * Can be used to index value from getRawValue.\r\n       */\n      SeriesData.prototype.getDimensionIndex = function (dim) {\n        var dimIdx = this._recognizeDimIndex(dim);\n        if (dimIdx != null) {\n          return dimIdx;\n        }\n        if (dim == null) {\n          return -1;\n        }\n        var dimInfo = this._getDimInfo(dim);\n        return dimInfo ? dimInfo.storeDimIndex : this._dimOmitted ? this._schema.getSourceDimensionIndex(dim) : -1;\n      };\n      /**\r\n       * The meanings of the input parameter `dim`:\r\n       *\r\n       * + If dim is a number (e.g., `1`), it means the index of the dimension.\r\n       *   For example, `getDimension(0)` will return 'x' or 'lng' or 'radius'.\r\n       * + If dim is a number-like string (e.g., `\"1\"`):\r\n       *     + If there is the same concrete dim name defined in `series.dimensions` or `dataset.dimensions`,\r\n       *        it means that concrete name.\r\n       *     + If not, it will be converted to a number, which means the index of the dimension.\r\n       *        (why? because of the backward compatibility. We have been tolerating number-like string in\r\n       *        dimension setting, although now it seems that it is not a good idea.)\r\n       *     For example, `visualMap[i].dimension: \"1\"` is the same meaning as `visualMap[i].dimension: 1`,\r\n       *     if no dimension name is defined as `\"1\"`.\r\n       * + If dim is a not-number-like string, it means the concrete dim name.\r\n       *   For example, it can be be default name `\"x\"`, `\"y\"`, `\"z\"`, `\"lng\"`, `\"lat\"`, `\"angle\"`, `\"radius\"`,\r\n       *   or customized in `dimensions` property of option like `\"age\"`.\r\n       *\r\n       * @return recognized `DimensionIndex`. Otherwise return null/undefined (means that dim is `DimensionName`).\r\n       */\n      SeriesData.prototype._recognizeDimIndex = function (dim) {\n        if (isNumber(dim)\n        // If being a number-like string but not being defined as a dimension name.\n        || dim != null && !isNaN(dim) && !this._getDimInfo(dim) && (!this._dimOmitted || this._schema.getSourceDimensionIndex(dim) < 0)) {\n          return +dim;\n        }\n      };\n      SeriesData.prototype._getStoreDimIndex = function (dim) {\n        var dimIdx = this.getDimensionIndex(dim);\n        if (\"development\" !== 'production') {\n          if (dimIdx == null) {\n            throw new Error('Unknown dimension ' + dim);\n          }\n        }\n        return dimIdx;\n      };\n      /**\r\n       * Get type and calculation info of particular dimension\r\n       * @param dim\r\n       *        Dimension can be concrete names like x, y, z, lng, lat, angle, radius\r\n       *        Or a ordinal number. For example getDimensionInfo(0) will return 'x' or 'lng' or 'radius'\r\n       */\n      SeriesData.prototype.getDimensionInfo = function (dim) {\n        // Do not clone, because there may be categories in dimInfo.\n        return this._getDimInfo(this.getDimension(dim));\n      };\n      SeriesData.prototype._initGetDimensionInfo = function (needsHasOwn) {\n        var dimensionInfos = this._dimInfos;\n        this._getDimInfo = needsHasOwn ? function (dimName) {\n          return dimensionInfos.hasOwnProperty(dimName) ? dimensionInfos[dimName] : undefined;\n        } : function (dimName) {\n          return dimensionInfos[dimName];\n        };\n      };\n      /**\r\n       * concrete dimension name list on coord.\r\n       */\n      SeriesData.prototype.getDimensionsOnCoord = function () {\n        return this._dimSummary.dataDimsOnCoord.slice();\n      };\n      SeriesData.prototype.mapDimension = function (coordDim, idx) {\n        var dimensionsSummary = this._dimSummary;\n        if (idx == null) {\n          return dimensionsSummary.encodeFirstDimNotExtra[coordDim];\n        }\n        var dims = dimensionsSummary.encode[coordDim];\n        return dims ? dims[idx] : null;\n      };\n      SeriesData.prototype.mapDimensionsAll = function (coordDim) {\n        var dimensionsSummary = this._dimSummary;\n        var dims = dimensionsSummary.encode[coordDim];\n        return (dims || []).slice();\n      };\n      SeriesData.prototype.getStore = function () {\n        return this._store;\n      };\n      /**\r\n       * Initialize from data\r\n       * @param data source or data or data store.\r\n       * @param nameList The name of a datum is used on data diff and\r\n       *        default label/tooltip.\r\n       *        A name can be specified in encode.itemName,\r\n       *        or dataItem.name (only for series option data),\r\n       *        or provided in nameList from outside.\r\n       */\n      SeriesData.prototype.initData = function (data, nameList, dimValueGetter) {\n        var _this = this;\n        var store;\n        if (data instanceof DataStore) {\n          store = data;\n        }\n        if (!store) {\n          var dimensions = this.dimensions;\n          var provider = isSourceInstance(data) || isArrayLike(data) ? new DefaultDataProvider(data, dimensions.length) : data;\n          store = new DataStore();\n          var dimensionInfos = map$1(dimensions, function (dimName) {\n            return {\n              type: _this._dimInfos[dimName].type,\n              property: dimName\n            };\n          });\n          store.initData(provider, dimensionInfos, dimValueGetter);\n        }\n        this._store = store;\n        // Reset\n        this._nameList = (nameList || []).slice();\n        this._idList = [];\n        this._nameRepeatCount = {};\n        this._doInit(0, store.count());\n        // Cache summary info for fast visit. See \"dimensionHelper\".\n        // Needs to be initialized after store is prepared.\n        this._dimSummary = summarizeDimensions(this, this._schema);\n        this.userOutput = this._dimSummary.userOutput;\n      };\n      /**\r\n       * Caution: Can be only called on raw data (before `this._indices` created).\r\n       */\n      SeriesData.prototype.appendData = function (data) {\n        var range = this._store.appendData(data);\n        this._doInit(range[0], range[1]);\n      };\n      /**\r\n       * Caution: Can be only called on raw data (before `this._indices` created).\r\n       * This method does not modify `rawData` (`dataProvider`), but only\r\n       * add values to store.\r\n       *\r\n       * The final count will be increased by `Math.max(values.length, names.length)`.\r\n       *\r\n       * @param values That is the SourceType: 'arrayRows', like\r\n       *        [\r\n       *            [12, 33, 44],\r\n       *            [NaN, 43, 1],\r\n       *            ['-', 'asdf', 0]\r\n       *        ]\r\n       *        Each item is exactly corresponding to a dimension.\r\n       */\n      SeriesData.prototype.appendValues = function (values, names) {\n        var _a = this._store.appendValues(values, names && names.length),\n          start = _a.start,\n          end = _a.end;\n        var shouldMakeIdFromName = this._shouldMakeIdFromName();\n        this._updateOrdinalMeta();\n        if (names) {\n          for (var idx = start; idx < end; idx++) {\n            var sourceIdx = idx - start;\n            this._nameList[idx] = names[sourceIdx];\n            if (shouldMakeIdFromName) {\n              makeIdFromName(this, idx);\n            }\n          }\n        }\n      };\n      SeriesData.prototype._updateOrdinalMeta = function () {\n        var store = this._store;\n        var dimensions = this.dimensions;\n        for (var i = 0; i < dimensions.length; i++) {\n          var dimInfo = this._dimInfos[dimensions[i]];\n          if (dimInfo.ordinalMeta) {\n            store.collectOrdinalMeta(dimInfo.storeDimIndex, dimInfo.ordinalMeta);\n          }\n        }\n      };\n      SeriesData.prototype._shouldMakeIdFromName = function () {\n        var provider = this._store.getProvider();\n        return this._idDimIdx == null && provider.getSource().sourceFormat !== SOURCE_FORMAT_TYPED_ARRAY && !provider.fillStorage;\n      };\n      SeriesData.prototype._doInit = function (start, end) {\n        if (start >= end) {\n          return;\n        }\n        var store = this._store;\n        var provider = store.getProvider();\n        this._updateOrdinalMeta();\n        var nameList = this._nameList;\n        var idList = this._idList;\n        var sourceFormat = provider.getSource().sourceFormat;\n        var isFormatOriginal = sourceFormat === SOURCE_FORMAT_ORIGINAL;\n        // Each data item is value\n        // [1, 2]\n        // 2\n        // Bar chart, line chart which uses category axis\n        // only gives the 'y' value. 'x' value is the indices of category\n        // Use a tempValue to normalize the value to be a (x, y) value\n        // If dataItem is {name: ...} or {id: ...}, it has highest priority.\n        // This kind of ids and names are always stored `_nameList` and `_idList`.\n        if (isFormatOriginal && !provider.pure) {\n          var sharedDataItem = [];\n          for (var idx = start; idx < end; idx++) {\n            // NOTICE: Try not to write things into dataItem\n            var dataItem = provider.getItem(idx, sharedDataItem);\n            if (!this.hasItemOption && isDataItemOption(dataItem)) {\n              this.hasItemOption = true;\n            }\n            if (dataItem) {\n              var itemName = dataItem.name;\n              if (nameList[idx] == null && itemName != null) {\n                nameList[idx] = convertOptionIdName(itemName, null);\n              }\n              var itemId = dataItem.id;\n              if (idList[idx] == null && itemId != null) {\n                idList[idx] = convertOptionIdName(itemId, null);\n              }\n            }\n          }\n        }\n        if (this._shouldMakeIdFromName()) {\n          for (var idx = start; idx < end; idx++) {\n            makeIdFromName(this, idx);\n          }\n        }\n        prepareInvertedIndex(this);\n      };\n      /**\r\n       * PENDING: In fact currently this function is only used to short-circuit\r\n       * the calling of `scale.unionExtentFromData` when data have been filtered by modules\r\n       * like \"dataZoom\". `scale.unionExtentFromData` is used to calculate data extent for series on\r\n       * an axis, but if a \"axis related data filter module\" is used, the extent of the axis have\r\n       * been fixed and no need to calling `scale.unionExtentFromData` actually.\r\n       * But if we add \"custom data filter\" in future, which is not \"axis related\", this method may\r\n       * be still needed.\r\n       *\r\n       * Optimize for the scenario that data is filtered by a given extent.\r\n       * Consider that if data amount is more than hundreds of thousand,\r\n       * extent calculation will cost more than 10ms and the cache will\r\n       * be erased because of the filtering.\r\n       */\n      SeriesData.prototype.getApproximateExtent = function (dim) {\n        return this._approximateExtent[dim] || this._store.getDataExtent(this._getStoreDimIndex(dim));\n      };\n      /**\r\n       * Calculate extent on a filtered data might be time consuming.\r\n       * Approximate extent is only used for: calculate extent of filtered data outside.\r\n       */\n      SeriesData.prototype.setApproximateExtent = function (extent, dim) {\n        dim = this.getDimension(dim);\n        this._approximateExtent[dim] = extent.slice();\n      };\n      SeriesData.prototype.getCalculationInfo = function (key) {\n        return this._calculationInfo[key];\n      };\n      SeriesData.prototype.setCalculationInfo = function (key, value) {\n        isObject$2(key) ? extend(this._calculationInfo, key) : this._calculationInfo[key] = value;\n      };\n      /**\r\n       * @return Never be null/undefined. `number` will be converted to string. Because:\r\n       * In most cases, name is used in display, where returning a string is more convenient.\r\n       * In other cases, name is used in query (see `indexOfName`), where we can keep the\r\n       * rule that name `2` equals to name `'2'`.\r\n       */\n      SeriesData.prototype.getName = function (idx) {\n        var rawIndex = this.getRawIndex(idx);\n        var name = this._nameList[rawIndex];\n        if (name == null && this._nameDimIdx != null) {\n          name = getIdNameFromStore(this, this._nameDimIdx, rawIndex);\n        }\n        if (name == null) {\n          name = '';\n        }\n        return name;\n      };\n      SeriesData.prototype._getCategory = function (dimIdx, idx) {\n        var ordinal = this._store.get(dimIdx, idx);\n        var ordinalMeta = this._store.getOrdinalMeta(dimIdx);\n        if (ordinalMeta) {\n          return ordinalMeta.categories[ordinal];\n        }\n        return ordinal;\n      };\n      /**\r\n       * @return Never null/undefined. `number` will be converted to string. Because:\r\n       * In all cases having encountered at present, id is used in making diff comparison, which\r\n       * are usually based on hash map. We can keep the rule that the internal id are always string\r\n       * (treat `2` is the same as `'2'`) to make the related logic simple.\r\n       */\n      SeriesData.prototype.getId = function (idx) {\n        return getId(this, this.getRawIndex(idx));\n      };\n      SeriesData.prototype.count = function () {\n        return this._store.count();\n      };\n      /**\r\n       * Get value. Return NaN if idx is out of range.\r\n       *\r\n       * @notice Should better to use `data.getStore().get(dimIndex, dataIdx)` instead.\r\n       */\n      SeriesData.prototype.get = function (dim, idx) {\n        var store = this._store;\n        var dimInfo = this._dimInfos[dim];\n        if (dimInfo) {\n          return store.get(dimInfo.storeDimIndex, idx);\n        }\n      };\n      /**\r\n       * @notice Should better to use `data.getStore().getByRawIndex(dimIndex, dataIdx)` instead.\r\n       */\n      SeriesData.prototype.getByRawIndex = function (dim, rawIdx) {\n        var store = this._store;\n        var dimInfo = this._dimInfos[dim];\n        if (dimInfo) {\n          return store.getByRawIndex(dimInfo.storeDimIndex, rawIdx);\n        }\n      };\n      SeriesData.prototype.getIndices = function () {\n        return this._store.getIndices();\n      };\n      SeriesData.prototype.getDataExtent = function (dim) {\n        return this._store.getDataExtent(this._getStoreDimIndex(dim));\n      };\n      SeriesData.prototype.getSum = function (dim) {\n        return this._store.getSum(this._getStoreDimIndex(dim));\n      };\n      SeriesData.prototype.getMedian = function (dim) {\n        return this._store.getMedian(this._getStoreDimIndex(dim));\n      };\n      SeriesData.prototype.getValues = function (dimensions, idx) {\n        var _this = this;\n        var store = this._store;\n        return isArray(dimensions) ? store.getValues(map$1(dimensions, function (dim) {\n          return _this._getStoreDimIndex(dim);\n        }), idx) : store.getValues(dimensions);\n      };\n      /**\r\n       * If value is NaN. Including '-'\r\n       * Only check the coord dimensions.\r\n       */\n      SeriesData.prototype.hasValue = function (idx) {\n        var dataDimIndicesOnCoord = this._dimSummary.dataDimIndicesOnCoord;\n        for (var i = 0, len = dataDimIndicesOnCoord.length; i < len; i++) {\n          // Ordinal type originally can be string or number.\n          // But when an ordinal type is used on coord, it can\n          // not be string but only number. So we can also use isNaN.\n          if (isNaN(this._store.get(dataDimIndicesOnCoord[i], idx))) {\n            return false;\n          }\n        }\n        return true;\n      };\n      /**\r\n       * Retrieve the index with given name\r\n       */\n      SeriesData.prototype.indexOfName = function (name) {\n        for (var i = 0, len = this._store.count(); i < len; i++) {\n          if (this.getName(i) === name) {\n            return i;\n          }\n        }\n        return -1;\n      };\n      SeriesData.prototype.getRawIndex = function (idx) {\n        return this._store.getRawIndex(idx);\n      };\n      SeriesData.prototype.indexOfRawIndex = function (rawIndex) {\n        return this._store.indexOfRawIndex(rawIndex);\n      };\n      /**\r\n       * Only support the dimension which inverted index created.\r\n       * Do not support other cases until required.\r\n       * @param dim concrete dim\r\n       * @param value ordinal index\r\n       * @return rawIndex\r\n       */\n      SeriesData.prototype.rawIndexOf = function (dim, value) {\n        var invertedIndices = dim && this._invertedIndicesMap[dim];\n        if (\"development\" !== 'production') {\n          if (!invertedIndices) {\n            throw new Error('Do not supported yet');\n          }\n        }\n        var rawIndex = invertedIndices && invertedIndices[value];\n        if (rawIndex == null || isNaN(rawIndex)) {\n          return INDEX_NOT_FOUND;\n        }\n        return rawIndex;\n      };\n      /**\r\n       * Retrieve the index of nearest value\r\n       * @param dim\r\n       * @param value\r\n       * @param [maxDistance=Infinity]\r\n       * @return If and only if multiple indices has\r\n       *         the same value, they are put to the result.\r\n       */\n      SeriesData.prototype.indicesOfNearest = function (dim, value, maxDistance) {\n        return this._store.indicesOfNearest(this._getStoreDimIndex(dim), value, maxDistance);\n      };\n      SeriesData.prototype.each = function (dims, cb, ctx) {\n\n        if (isFunction(dims)) {\n          ctx = cb;\n          cb = dims;\n          dims = [];\n        }\n        // ctxCompat just for compat echarts3\n        var fCtx = ctx || this;\n        var dimIndices = map$1(normalizeDimensions(dims), this._getStoreDimIndex, this);\n        this._store.each(dimIndices, fCtx ? bind(cb, fCtx) : cb);\n      };\n      SeriesData.prototype.filterSelf = function (dims, cb, ctx) {\n\n        if (isFunction(dims)) {\n          ctx = cb;\n          cb = dims;\n          dims = [];\n        }\n        // ctxCompat just for compat echarts3\n        var fCtx = ctx || this;\n        var dimIndices = map$1(normalizeDimensions(dims), this._getStoreDimIndex, this);\n        this._store = this._store.filter(dimIndices, fCtx ? bind(cb, fCtx) : cb);\n        return this;\n      };\n      /**\r\n       * Select data in range. (For optimization of filter)\r\n       * (Manually inline code, support 5 million data filtering in data zoom.)\r\n       */\n      SeriesData.prototype.selectRange = function (range) {\n\n        var _this = this;\n        var innerRange = {};\n        var dims = keys(range);\n        each(dims, function (dim) {\n          var dimIdx = _this._getStoreDimIndex(dim);\n          innerRange[dimIdx] = range[dim];\n        });\n        this._store = this._store.selectRange(innerRange);\n        return this;\n      };\n      /* eslint-enable max-len */\n      SeriesData.prototype.mapArray = function (dims, cb, ctx) {\n\n        if (isFunction(dims)) {\n          ctx = cb;\n          cb = dims;\n          dims = [];\n        }\n        // ctxCompat just for compat echarts3\n        ctx = ctx || this;\n        var result = [];\n        this.each(dims, function () {\n          result.push(cb && cb.apply(this, arguments));\n        }, ctx);\n        return result;\n      };\n      SeriesData.prototype.map = function (dims, cb, ctx, ctxCompat) {\n\n        // ctxCompat just for compat echarts3\n        var fCtx = ctx || ctxCompat || this;\n        var dimIndices = map$1(normalizeDimensions(dims), this._getStoreDimIndex, this);\n        var list = cloneListForMapAndSample(this);\n        list._store = this._store.map(dimIndices, fCtx ? bind(cb, fCtx) : cb);\n        return list;\n      };\n      SeriesData.prototype.modify = function (dims, cb, ctx, ctxCompat) {\n        var _this = this;\n        // ctxCompat just for compat echarts3\n        var fCtx = ctx || ctxCompat || this;\n        if (\"development\" !== 'production') {\n          each(normalizeDimensions(dims), function (dim) {\n            var dimInfo = _this.getDimensionInfo(dim);\n            if (!dimInfo.isCalculationCoord) {\n              console.error('Danger: only stack dimension can be modified');\n            }\n          });\n        }\n        var dimIndices = map$1(normalizeDimensions(dims), this._getStoreDimIndex, this);\n        // If do shallow clone here, if there are too many stacked series,\n        // it still cost lots of memory, because `_store.dimensions` are not shared.\n        // We should consider there probably be shallow clone happen in each series\n        // in consequent filter/map.\n        this._store.modify(dimIndices, fCtx ? bind(cb, fCtx) : cb);\n      };\n      /**\r\n       * Large data down sampling on given dimension\r\n       * @param sampleIndex Sample index for name and id\r\n       */\n      SeriesData.prototype.downSample = function (dimension, rate, sampleValue, sampleIndex) {\n        var list = cloneListForMapAndSample(this);\n        list._store = this._store.downSample(this._getStoreDimIndex(dimension), rate, sampleValue, sampleIndex);\n        return list;\n      };\n      /**\r\n       * Large data down sampling using min-max\r\n       * @param {string} valueDimension\r\n       * @param {number} rate\r\n       */\n      SeriesData.prototype.minmaxDownSample = function (valueDimension, rate) {\n        var list = cloneListForMapAndSample(this);\n        list._store = this._store.minmaxDownSample(this._getStoreDimIndex(valueDimension), rate);\n        return list;\n      };\n      /**\r\n       * Large data down sampling using largest-triangle-three-buckets\r\n       * @param {string} valueDimension\r\n       * @param {number} targetCount\r\n       */\n      SeriesData.prototype.lttbDownSample = function (valueDimension, rate) {\n        var list = cloneListForMapAndSample(this);\n        list._store = this._store.lttbDownSample(this._getStoreDimIndex(valueDimension), rate);\n        return list;\n      };\n      SeriesData.prototype.getRawDataItem = function (idx) {\n        return this._store.getRawDataItem(idx);\n      };\n      /**\r\n       * Get model of one data item.\r\n       */\n      // TODO: Type of data item\n      SeriesData.prototype.getItemModel = function (idx) {\n        var hostModel = this.hostModel;\n        var dataItem = this.getRawDataItem(idx);\n        return new Model(dataItem, hostModel, hostModel && hostModel.ecModel);\n      };\n      /**\r\n       * Create a data differ\r\n       */\n      SeriesData.prototype.diff = function (otherList) {\n        var thisList = this;\n        return new DataDiffer(otherList ? otherList.getStore().getIndices() : [], this.getStore().getIndices(), function (idx) {\n          return getId(otherList, idx);\n        }, function (idx) {\n          return getId(thisList, idx);\n        });\n      };\n      /**\r\n       * Get visual property.\r\n       */\n      SeriesData.prototype.getVisual = function (key) {\n        var visual = this._visual;\n        return visual && visual[key];\n      };\n      SeriesData.prototype.setVisual = function (kvObj, val) {\n        this._visual = this._visual || {};\n        if (isObject$2(kvObj)) {\n          extend(this._visual, kvObj);\n        } else {\n          this._visual[kvObj] = val;\n        }\n      };\n      /**\r\n       * Get visual property of single data item\r\n       */\n      // eslint-disable-next-line\n      SeriesData.prototype.getItemVisual = function (idx, key) {\n        var itemVisual = this._itemVisuals[idx];\n        var val = itemVisual && itemVisual[key];\n        if (val == null) {\n          // Use global visual property\n          return this.getVisual(key);\n        }\n        return val;\n      };\n      /**\r\n       * If exists visual property of single data item\r\n       */\n      SeriesData.prototype.hasItemVisual = function () {\n        return this._itemVisuals.length > 0;\n      };\n      /**\r\n       * Make sure itemVisual property is unique\r\n       */\n      // TODO: use key to save visual to reduce memory.\n      SeriesData.prototype.ensureUniqueItemVisual = function (idx, key) {\n        var itemVisuals = this._itemVisuals;\n        var itemVisual = itemVisuals[idx];\n        if (!itemVisual) {\n          itemVisual = itemVisuals[idx] = {};\n        }\n        var val = itemVisual[key];\n        if (val == null) {\n          val = this.getVisual(key);\n          // TODO Performance?\n          if (isArray(val)) {\n            val = val.slice();\n          } else if (isObject$2(val)) {\n            val = extend({}, val);\n          }\n          itemVisual[key] = val;\n        }\n        return val;\n      };\n      // eslint-disable-next-line\n      SeriesData.prototype.setItemVisual = function (idx, key, value) {\n        var itemVisual = this._itemVisuals[idx] || {};\n        this._itemVisuals[idx] = itemVisual;\n        if (isObject$2(key)) {\n          extend(itemVisual, key);\n        } else {\n          itemVisual[key] = value;\n        }\n      };\n      /**\r\n       * Clear itemVisuals and list visual.\r\n       */\n      SeriesData.prototype.clearAllVisual = function () {\n        this._visual = {};\n        this._itemVisuals = [];\n      };\n      SeriesData.prototype.setLayout = function (key, val) {\n        isObject$2(key) ? extend(this._layout, key) : this._layout[key] = val;\n      };\n      /**\r\n       * Get layout property.\r\n       */\n      SeriesData.prototype.getLayout = function (key) {\n        return this._layout[key];\n      };\n      /**\r\n       * Get layout of single data item\r\n       */\n      SeriesData.prototype.getItemLayout = function (idx) {\n        return this._itemLayouts[idx];\n      };\n      /**\r\n       * Set layout of single data item\r\n       */\n      SeriesData.prototype.setItemLayout = function (idx, layout, merge) {\n        this._itemLayouts[idx] = merge ? extend(this._itemLayouts[idx] || {}, layout) : layout;\n      };\n      /**\r\n       * Clear all layout of single data item\r\n       */\n      SeriesData.prototype.clearItemLayouts = function () {\n        this._itemLayouts.length = 0;\n      };\n      /**\r\n       * Set graphic element relative to data. It can be set as null\r\n       */\n      SeriesData.prototype.setItemGraphicEl = function (idx, el) {\n        var seriesIndex = this.hostModel && this.hostModel.seriesIndex;\n        setCommonECData(seriesIndex, this.dataType, idx, el);\n        this._graphicEls[idx] = el;\n      };\n      SeriesData.prototype.getItemGraphicEl = function (idx) {\n        return this._graphicEls[idx];\n      };\n      SeriesData.prototype.eachItemGraphicEl = function (cb, context) {\n        each(this._graphicEls, function (el, idx) {\n          if (el) {\n            cb && cb.call(context, el, idx);\n          }\n        });\n      };\n      /**\r\n       * Shallow clone a new list except visual and layout properties, and graph elements.\r\n       * New list only change the indices.\r\n       */\n      SeriesData.prototype.cloneShallow = function (list) {\n        if (!list) {\n          list = new SeriesData(this._schema ? this._schema : map$1(this.dimensions, this._getDimInfo, this), this.hostModel);\n        }\n        transferProperties(list, this);\n        list._store = this._store;\n        return list;\n      };\n      /**\r\n       * Wrap some method to add more feature\r\n       */\n      SeriesData.prototype.wrapMethod = function (methodName, injectFunction) {\n        var originalMethod = this[methodName];\n        if (!isFunction(originalMethod)) {\n          return;\n        }\n        this.__wrappedMethods = this.__wrappedMethods || [];\n        this.__wrappedMethods.push(methodName);\n        this[methodName] = function () {\n          var res = originalMethod.apply(this, arguments);\n          return injectFunction.apply(this, [res].concat(slice(arguments)));\n        };\n      };\n      // ----------------------------------------------------------\n      // A work around for internal method visiting private member.\n      // ----------------------------------------------------------\n      SeriesData.internalField = function () {\n        prepareInvertedIndex = function (data) {\n          var invertedIndicesMap = data._invertedIndicesMap;\n          each(invertedIndicesMap, function (invertedIndices, dim) {\n            var dimInfo = data._dimInfos[dim];\n            // Currently, only dimensions that has ordinalMeta can create inverted indices.\n            var ordinalMeta = dimInfo.ordinalMeta;\n            var store = data._store;\n            if (ordinalMeta) {\n              invertedIndices = invertedIndicesMap[dim] = new CtorInt32Array$1(ordinalMeta.categories.length);\n              // The default value of TypedArray is 0. To avoid miss\n              // mapping to 0, we should set it as INDEX_NOT_FOUND.\n              for (var i = 0; i < invertedIndices.length; i++) {\n                invertedIndices[i] = INDEX_NOT_FOUND;\n              }\n              for (var i = 0; i < store.count(); i++) {\n                // Only support the case that all values are distinct.\n                invertedIndices[store.get(dimInfo.storeDimIndex, i)] = i;\n              }\n            }\n          });\n        };\n        getIdNameFromStore = function (data, dimIdx, idx) {\n          return convertOptionIdName(data._getCategory(dimIdx, idx), null);\n        };\n        /**\r\n         * @see the comment of `List['getId']`.\r\n         */\n        getId = function (data, rawIndex) {\n          var id = data._idList[rawIndex];\n          if (id == null && data._idDimIdx != null) {\n            id = getIdNameFromStore(data, data._idDimIdx, rawIndex);\n          }\n          if (id == null) {\n            id = ID_PREFIX + rawIndex;\n          }\n          return id;\n        };\n        normalizeDimensions = function (dimensions) {\n          if (!isArray(dimensions)) {\n            dimensions = dimensions != null ? [dimensions] : [];\n          }\n          return dimensions;\n        };\n        /**\r\n         * Data in excludeDimensions is copied, otherwise transferred.\r\n         */\n        cloneListForMapAndSample = function (original) {\n          var list = new SeriesData(original._schema ? original._schema : map$1(original.dimensions, original._getDimInfo, original), original.hostModel);\n          // FIXME If needs stackedOn, value may already been stacked\n          transferProperties(list, original);\n          return list;\n        };\n        transferProperties = function (target, source) {\n          each(TRANSFERABLE_PROPERTIES.concat(source.__wrappedMethods || []), function (propName) {\n            if (source.hasOwnProperty(propName)) {\n              target[propName] = source[propName];\n            }\n          });\n          target.__wrappedMethods = source.__wrappedMethods;\n          each(CLONE_PROPERTIES, function (propName) {\n            target[propName] = clone(source[propName]);\n          });\n          target._calculationInfo = extend({}, source._calculationInfo);\n        };\n        makeIdFromName = function (data, idx) {\n          var nameList = data._nameList;\n          var idList = data._idList;\n          var nameDimIdx = data._nameDimIdx;\n          var idDimIdx = data._idDimIdx;\n          var name = nameList[idx];\n          var id = idList[idx];\n          if (name == null && nameDimIdx != null) {\n            nameList[idx] = name = getIdNameFromStore(data, nameDimIdx, idx);\n          }\n          if (id == null && idDimIdx != null) {\n            idList[idx] = id = getIdNameFromStore(data, idDimIdx, idx);\n          }\n          if (id == null && name != null) {\n            var nameRepeatCount = data._nameRepeatCount;\n            var nmCnt = nameRepeatCount[name] = (nameRepeatCount[name] || 0) + 1;\n            id = name;\n            if (nmCnt > 1) {\n              id += '__ec__' + nmCnt;\n            }\n            idList[idx] = id;\n          }\n        };\n      }();\n      return SeriesData;\n    }();\n\n    /**\r\n     * For outside usage compat (like echarts-gl are using it).\r\n     */\n    function createDimensions(source, opt) {\n      return prepareSeriesDataSchema(source, opt).dimensions;\n    }\n    /**\r\n     * This method builds the relationship between:\r\n     * + \"what the coord sys or series requires (see `coordDimensions`)\",\r\n     * + \"what the user defines (in `encode` and `dimensions`, see `opt.dimensionsDefine` and `opt.encodeDefine`)\"\r\n     * + \"what the data source provids (see `source`)\".\r\n     *\r\n     * Some guess strategy will be adapted if user does not define something.\r\n     * If no 'value' dimension specified, the first no-named dimension will be\r\n     * named as 'value'.\r\n     *\r\n     * @return The results are always sorted by `storeDimIndex` asc.\r\n     */\n    function prepareSeriesDataSchema(\n    // TODO: TYPE completeDimensions type\n    source, opt) {\n      if (!isSourceInstance(source)) {\n        source = createSourceFromSeriesDataOption(source);\n      }\n      opt = opt || {};\n      var sysDims = opt.coordDimensions || [];\n      var dimsDef = opt.dimensionsDefine || source.dimensionsDefine || [];\n      var coordDimNameMap = createHashMap();\n      var resultList = [];\n      var dimCount = getDimCount(source, sysDims, dimsDef, opt.dimensionsCount);\n      // Try to ignore unused dimensions if sharing a high dimension datastore\n      // 30 is an experience value.\n      var omitUnusedDimensions = opt.canOmitUnusedDimensions && shouldOmitUnusedDimensions(dimCount);\n      var isUsingSourceDimensionsDef = dimsDef === source.dimensionsDefine;\n      var dataDimNameMap = isUsingSourceDimensionsDef ? ensureSourceDimNameMap(source) : createDimNameMap(dimsDef);\n      var encodeDef = opt.encodeDefine;\n      if (!encodeDef && opt.encodeDefaulter) {\n        encodeDef = opt.encodeDefaulter(source, dimCount);\n      }\n      var encodeDefMap = createHashMap(encodeDef);\n      var indicesMap = new CtorInt32Array(dimCount);\n      for (var i = 0; i < indicesMap.length; i++) {\n        indicesMap[i] = -1;\n      }\n      function getResultItem(dimIdx) {\n        var idx = indicesMap[dimIdx];\n        if (idx < 0) {\n          var dimDefItemRaw = dimsDef[dimIdx];\n          var dimDefItem = isObject(dimDefItemRaw) ? dimDefItemRaw : {\n            name: dimDefItemRaw\n          };\n          var resultItem = new SeriesDimensionDefine();\n          var userDimName = dimDefItem.name;\n          if (userDimName != null && dataDimNameMap.get(userDimName) != null) {\n            // Only if `series.dimensions` is defined in option\n            // displayName, will be set, and dimension will be displayed vertically in\n            // tooltip by default.\n            resultItem.name = resultItem.displayName = userDimName;\n          }\n          dimDefItem.type != null && (resultItem.type = dimDefItem.type);\n          dimDefItem.displayName != null && (resultItem.displayName = dimDefItem.displayName);\n          var newIdx = resultList.length;\n          indicesMap[dimIdx] = newIdx;\n          resultItem.storeDimIndex = dimIdx;\n          resultList.push(resultItem);\n          return resultItem;\n        }\n        return resultList[idx];\n      }\n      if (!omitUnusedDimensions) {\n        for (var i = 0; i < dimCount; i++) {\n          getResultItem(i);\n        }\n      }\n      // Set `coordDim` and `coordDimIndex` by `encodeDefMap` and normalize `encodeDefMap`.\n      encodeDefMap.each(function (dataDimsRaw, coordDim) {\n        var dataDims = normalizeToArray(dataDimsRaw).slice();\n        // Note: It is allowed that `dataDims.length` is `0`, e.g., options is\n        // `{encode: {x: -1, y: 1}}`. Should not filter anything in\n        // this case.\n        if (dataDims.length === 1 && !isString(dataDims[0]) && dataDims[0] < 0) {\n          encodeDefMap.set(coordDim, false);\n          return;\n        }\n        var validDataDims = encodeDefMap.set(coordDim, []);\n        each(dataDims, function (resultDimIdxOrName, idx) {\n          // The input resultDimIdx can be dim name or index.\n          var resultDimIdx = isString(resultDimIdxOrName) ? dataDimNameMap.get(resultDimIdxOrName) : resultDimIdxOrName;\n          if (resultDimIdx != null && resultDimIdx < dimCount) {\n            validDataDims[idx] = resultDimIdx;\n            applyDim(getResultItem(resultDimIdx), coordDim, idx);\n          }\n        });\n      });\n      // Apply templates and default order from `sysDims`.\n      var availDimIdx = 0;\n      each(sysDims, function (sysDimItemRaw) {\n        var coordDim;\n        var sysDimItemDimsDef;\n        var sysDimItemOtherDims;\n        var sysDimItem;\n        if (isString(sysDimItemRaw)) {\n          coordDim = sysDimItemRaw;\n          sysDimItem = {};\n        } else {\n          sysDimItem = sysDimItemRaw;\n          coordDim = sysDimItem.name;\n          var ordinalMeta = sysDimItem.ordinalMeta;\n          sysDimItem.ordinalMeta = null;\n          sysDimItem = extend({}, sysDimItem);\n          sysDimItem.ordinalMeta = ordinalMeta;\n          // `coordDimIndex` should not be set directly.\n          sysDimItemDimsDef = sysDimItem.dimsDef;\n          sysDimItemOtherDims = sysDimItem.otherDims;\n          sysDimItem.name = sysDimItem.coordDim = sysDimItem.coordDimIndex = sysDimItem.dimsDef = sysDimItem.otherDims = null;\n        }\n        var dataDims = encodeDefMap.get(coordDim);\n        // negative resultDimIdx means no need to mapping.\n        if (dataDims === false) {\n          return;\n        }\n        dataDims = normalizeToArray(dataDims);\n        // dimensions provides default dim sequences.\n        if (!dataDims.length) {\n          for (var i = 0; i < (sysDimItemDimsDef && sysDimItemDimsDef.length || 1); i++) {\n            while (availDimIdx < dimCount && getResultItem(availDimIdx).coordDim != null) {\n              availDimIdx++;\n            }\n            availDimIdx < dimCount && dataDims.push(availDimIdx++);\n          }\n        }\n        // Apply templates.\n        each(dataDims, function (resultDimIdx, coordDimIndex) {\n          var resultItem = getResultItem(resultDimIdx);\n          // Coordinate system has a higher priority on dim type than source.\n          if (isUsingSourceDimensionsDef && sysDimItem.type != null) {\n            resultItem.type = sysDimItem.type;\n          }\n          applyDim(defaults(resultItem, sysDimItem), coordDim, coordDimIndex);\n          if (resultItem.name == null && sysDimItemDimsDef) {\n            var sysDimItemDimsDefItem = sysDimItemDimsDef[coordDimIndex];\n            !isObject(sysDimItemDimsDefItem) && (sysDimItemDimsDefItem = {\n              name: sysDimItemDimsDefItem\n            });\n            resultItem.name = resultItem.displayName = sysDimItemDimsDefItem.name;\n            resultItem.defaultTooltip = sysDimItemDimsDefItem.defaultTooltip;\n          }\n          // FIXME refactor, currently only used in case: {otherDims: {tooltip: false}}\n          sysDimItemOtherDims && defaults(resultItem.otherDims, sysDimItemOtherDims);\n        });\n      });\n      function applyDim(resultItem, coordDim, coordDimIndex) {\n        if (VISUAL_DIMENSIONS.get(coordDim) != null) {\n          resultItem.otherDims[coordDim] = coordDimIndex;\n        } else {\n          resultItem.coordDim = coordDim;\n          resultItem.coordDimIndex = coordDimIndex;\n          coordDimNameMap.set(coordDim, true);\n        }\n      }\n      // Make sure the first extra dim is 'value'.\n      var generateCoord = opt.generateCoord;\n      var generateCoordCount = opt.generateCoordCount;\n      var fromZero = generateCoordCount != null;\n      generateCoordCount = generateCoord ? generateCoordCount || 1 : 0;\n      var extra = generateCoord || 'value';\n      function ifNoNameFillWithCoordName(resultItem) {\n        if (resultItem.name == null) {\n          // Duplication will be removed in the next step.\n          resultItem.name = resultItem.coordDim;\n        }\n      }\n      // Set dim `name` and other `coordDim` and other props.\n      if (!omitUnusedDimensions) {\n        for (var resultDimIdx = 0; resultDimIdx < dimCount; resultDimIdx++) {\n          var resultItem = getResultItem(resultDimIdx);\n          var coordDim = resultItem.coordDim;\n          if (coordDim == null) {\n            // TODO no need to generate coordDim for isExtraCoord?\n            resultItem.coordDim = genCoordDimName(extra, coordDimNameMap, fromZero);\n            resultItem.coordDimIndex = 0;\n            // Series specified generateCoord is using out.\n            if (!generateCoord || generateCoordCount <= 0) {\n              resultItem.isExtraCoord = true;\n            }\n            generateCoordCount--;\n          }\n          ifNoNameFillWithCoordName(resultItem);\n          if (resultItem.type == null && (guessOrdinal(source, resultDimIdx) === BE_ORDINAL.Must\n          // Consider the case:\n          // {\n          //    dataset: {source: [\n          //        ['2001', 123],\n          //        ['2002', 456],\n          //        ...\n          //        ['The others', 987],\n          //    ]},\n          //    series: {type: 'pie'}\n          // }\n          // The first column should better be treated as a \"ordinal\" although it\n          // might not be detected as an \"ordinal\" by `guessOrdinal`.\n          || resultItem.isExtraCoord && (resultItem.otherDims.itemName != null || resultItem.otherDims.seriesName != null))) {\n            resultItem.type = 'ordinal';\n          }\n        }\n      } else {\n        each(resultList, function (resultItem) {\n          // PENDING: guessOrdinal or let user specify type: 'ordinal' manually?\n          ifNoNameFillWithCoordName(resultItem);\n        });\n        // Sort dimensions: there are some rule that use the last dim as label,\n        // and for some latter travel process easier.\n        resultList.sort(function (item0, item1) {\n          return item0.storeDimIndex - item1.storeDimIndex;\n        });\n      }\n      removeDuplication(resultList);\n      return new SeriesDataSchema({\n        source: source,\n        dimensions: resultList,\n        fullDimensionCount: dimCount,\n        dimensionOmitted: omitUnusedDimensions\n      });\n    }\n    function removeDuplication(result) {\n      var duplicationMap = createHashMap();\n      for (var i = 0; i < result.length; i++) {\n        var dim = result[i];\n        var dimOriginalName = dim.name;\n        var count = duplicationMap.get(dimOriginalName) || 0;\n        if (count > 0) {\n          // Starts from 0.\n          dim.name = dimOriginalName + (count - 1);\n        }\n        count++;\n        duplicationMap.set(dimOriginalName, count);\n      }\n    }\n    // ??? TODO\n    // Originally detect dimCount by data[0]. Should we\n    // optimize it to only by sysDims and dimensions and encode.\n    // So only necessary dims will be initialized.\n    // But\n    // (1) custom series should be considered. where other dims\n    // may be visited.\n    // (2) sometimes user need to calculate bubble size or use visualMap\n    // on other dimensions besides coordSys needed.\n    // So, dims that is not used by system, should be shared in data store?\n    function getDimCount(source, sysDims, dimsDef, optDimCount) {\n      // Note that the result dimCount should not small than columns count\n      // of data, otherwise `dataDimNameMap` checking will be incorrect.\n      var dimCount = Math.max(source.dimensionsDetectedCount || 1, sysDims.length, dimsDef.length, optDimCount || 0);\n      each(sysDims, function (sysDimItem) {\n        var sysDimItemDimsDef;\n        if (isObject(sysDimItem) && (sysDimItemDimsDef = sysDimItem.dimsDef)) {\n          dimCount = Math.max(dimCount, sysDimItemDimsDef.length);\n        }\n      });\n      return dimCount;\n    }\n    function genCoordDimName(name, map, fromZero) {\n      if (fromZero || map.hasKey(name)) {\n        var i = 0;\n        while (map.hasKey(name + i)) {\n          i++;\n        }\n        name += i;\n      }\n      map.set(name, true);\n      return name;\n    }\n\n    /**\r\n     * @class\r\n     * For example:\r\n     * {\r\n     *     coordSysName: 'cartesian2d',\r\n     *     coordSysDims: ['x', 'y', ...],\r\n     *     axisMap: HashMap({\r\n     *         x: xAxisModel,\r\n     *         y: yAxisModel\r\n     *     }),\r\n     *     categoryAxisMap: HashMap({\r\n     *         x: xAxisModel,\r\n     *         y: undefined\r\n     *     }),\r\n     *     // The index of the first category axis in `coordSysDims`.\r\n     *     // `null/undefined` means no category axis exists.\r\n     *     firstCategoryDimIndex: 1,\r\n     *     // To replace user specified encode.\r\n     * }\r\n     */\n    var CoordSysInfo = /** @class */function () {\n      function CoordSysInfo(coordSysName) {\n        this.coordSysDims = [];\n        this.axisMap = createHashMap();\n        this.categoryAxisMap = createHashMap();\n        this.coordSysName = coordSysName;\n      }\n      return CoordSysInfo;\n    }();\n    function getCoordSysInfoBySeries(seriesModel) {\n      var coordSysName = seriesModel.get('coordinateSystem');\n      var result = new CoordSysInfo(coordSysName);\n      var fetch = fetchers[coordSysName];\n      if (fetch) {\n        fetch(seriesModel, result, result.axisMap, result.categoryAxisMap);\n        return result;\n      }\n    }\n    var fetchers = {\n      cartesian2d: function (seriesModel, result, axisMap, categoryAxisMap) {\n        var xAxisModel = seriesModel.getReferringComponents('xAxis', SINGLE_REFERRING).models[0];\n        var yAxisModel = seriesModel.getReferringComponents('yAxis', SINGLE_REFERRING).models[0];\n        if (\"development\" !== 'production') {\n          if (!xAxisModel) {\n            throw new Error('xAxis \"' + retrieve(seriesModel.get('xAxisIndex'), seriesModel.get('xAxisId'), 0) + '\" not found');\n          }\n          if (!yAxisModel) {\n            throw new Error('yAxis \"' + retrieve(seriesModel.get('xAxisIndex'), seriesModel.get('yAxisId'), 0) + '\" not found');\n          }\n        }\n        result.coordSysDims = ['x', 'y'];\n        axisMap.set('x', xAxisModel);\n        axisMap.set('y', yAxisModel);\n        if (isCategory(xAxisModel)) {\n          categoryAxisMap.set('x', xAxisModel);\n          result.firstCategoryDimIndex = 0;\n        }\n        if (isCategory(yAxisModel)) {\n          categoryAxisMap.set('y', yAxisModel);\n          result.firstCategoryDimIndex == null && (result.firstCategoryDimIndex = 1);\n        }\n      },\n      singleAxis: function (seriesModel, result, axisMap, categoryAxisMap) {\n        var singleAxisModel = seriesModel.getReferringComponents('singleAxis', SINGLE_REFERRING).models[0];\n        if (\"development\" !== 'production') {\n          if (!singleAxisModel) {\n            throw new Error('singleAxis should be specified.');\n          }\n        }\n        result.coordSysDims = ['single'];\n        axisMap.set('single', singleAxisModel);\n        if (isCategory(singleAxisModel)) {\n          categoryAxisMap.set('single', singleAxisModel);\n          result.firstCategoryDimIndex = 0;\n        }\n      },\n      polar: function (seriesModel, result, axisMap, categoryAxisMap) {\n        var polarModel = seriesModel.getReferringComponents('polar', SINGLE_REFERRING).models[0];\n        var radiusAxisModel = polarModel.findAxisModel('radiusAxis');\n        var angleAxisModel = polarModel.findAxisModel('angleAxis');\n        if (\"development\" !== 'production') {\n          if (!angleAxisModel) {\n            throw new Error('angleAxis option not found');\n          }\n          if (!radiusAxisModel) {\n            throw new Error('radiusAxis option not found');\n          }\n        }\n        result.coordSysDims = ['radius', 'angle'];\n        axisMap.set('radius', radiusAxisModel);\n        axisMap.set('angle', angleAxisModel);\n        if (isCategory(radiusAxisModel)) {\n          categoryAxisMap.set('radius', radiusAxisModel);\n          result.firstCategoryDimIndex = 0;\n        }\n        if (isCategory(angleAxisModel)) {\n          categoryAxisMap.set('angle', angleAxisModel);\n          result.firstCategoryDimIndex == null && (result.firstCategoryDimIndex = 1);\n        }\n      },\n      geo: function (seriesModel, result, axisMap, categoryAxisMap) {\n        result.coordSysDims = ['lng', 'lat'];\n      },\n      parallel: function (seriesModel, result, axisMap, categoryAxisMap) {\n        var ecModel = seriesModel.ecModel;\n        var parallelModel = ecModel.getComponent('parallel', seriesModel.get('parallelIndex'));\n        var coordSysDims = result.coordSysDims = parallelModel.dimensions.slice();\n        each(parallelModel.parallelAxisIndex, function (axisIndex, index) {\n          var axisModel = ecModel.getComponent('parallelAxis', axisIndex);\n          var axisDim = coordSysDims[index];\n          axisMap.set(axisDim, axisModel);\n          if (isCategory(axisModel)) {\n            categoryAxisMap.set(axisDim, axisModel);\n            if (result.firstCategoryDimIndex == null) {\n              result.firstCategoryDimIndex = index;\n            }\n          }\n        });\n      }\n    };\n    function isCategory(axisModel) {\n      return axisModel.get('type') === 'category';\n    }\n\n    /**\r\n     * Note that it is too complicated to support 3d stack by value\r\n     * (have to create two-dimension inverted index), so in 3d case\r\n     * we just support that stacked by index.\r\n     *\r\n     * @param seriesModel\r\n     * @param dimensionsInput The same as the input of <module:echarts/data/SeriesData>.\r\n     *        The input will be modified.\r\n     * @param opt\r\n     * @param opt.stackedCoordDimension Specify a coord dimension if needed.\r\n     * @param opt.byIndex=false\r\n     * @return calculationInfo\r\n     * {\r\n     *     stackedDimension: string\r\n     *     stackedByDimension: string\r\n     *     isStackedByIndex: boolean\r\n     *     stackedOverDimension: string\r\n     *     stackResultDimension: string\r\n     * }\r\n     */\n    function enableDataStack(seriesModel, dimensionsInput, opt) {\n      opt = opt || {};\n      var byIndex = opt.byIndex;\n      var stackedCoordDimension = opt.stackedCoordDimension;\n      var dimensionDefineList;\n      var schema;\n      var store;\n      if (isLegacyDimensionsInput(dimensionsInput)) {\n        dimensionDefineList = dimensionsInput;\n      } else {\n        schema = dimensionsInput.schema;\n        dimensionDefineList = schema.dimensions;\n        store = dimensionsInput.store;\n      }\n      // Compatibal: when `stack` is set as '', do not stack.\n      var mayStack = !!(seriesModel && seriesModel.get('stack'));\n      var stackedByDimInfo;\n      var stackedDimInfo;\n      var stackResultDimension;\n      var stackedOverDimension;\n      each(dimensionDefineList, function (dimensionInfo, index) {\n        if (isString(dimensionInfo)) {\n          dimensionDefineList[index] = dimensionInfo = {\n            name: dimensionInfo\n          };\n        }\n        if (mayStack && !dimensionInfo.isExtraCoord) {\n          // Find the first ordinal dimension as the stackedByDimInfo.\n          if (!byIndex && !stackedByDimInfo && dimensionInfo.ordinalMeta) {\n            stackedByDimInfo = dimensionInfo;\n          }\n          // Find the first stackable dimension as the stackedDimInfo.\n          if (!stackedDimInfo && dimensionInfo.type !== 'ordinal' && dimensionInfo.type !== 'time' && (!stackedCoordDimension || stackedCoordDimension === dimensionInfo.coordDim)) {\n            stackedDimInfo = dimensionInfo;\n          }\n        }\n      });\n      if (stackedDimInfo && !byIndex && !stackedByDimInfo) {\n        // Compatible with previous design, value axis (time axis) only stack by index.\n        // It may make sense if the user provides elaborately constructed data.\n        byIndex = true;\n      }\n      // Add stack dimension, they can be both calculated by coordinate system in `unionExtent`.\n      // That put stack logic in List is for using conveniently in echarts extensions, but it\n      // might not be a good way.\n      if (stackedDimInfo) {\n        // Use a weird name that not duplicated with other names.\n        // Also need to use seriesModel.id as postfix because different\n        // series may share same data store. The stack dimension needs to be distinguished.\n        stackResultDimension = '__\\0ecstackresult_' + seriesModel.id;\n        stackedOverDimension = '__\\0ecstackedover_' + seriesModel.id;\n        // Create inverted index to fast query index by value.\n        if (stackedByDimInfo) {\n          stackedByDimInfo.createInvertedIndices = true;\n        }\n        var stackedDimCoordDim_1 = stackedDimInfo.coordDim;\n        var stackedDimType = stackedDimInfo.type;\n        var stackedDimCoordIndex_1 = 0;\n        each(dimensionDefineList, function (dimensionInfo) {\n          if (dimensionInfo.coordDim === stackedDimCoordDim_1) {\n            stackedDimCoordIndex_1++;\n          }\n        });\n        var stackedOverDimensionDefine = {\n          name: stackResultDimension,\n          coordDim: stackedDimCoordDim_1,\n          coordDimIndex: stackedDimCoordIndex_1,\n          type: stackedDimType,\n          isExtraCoord: true,\n          isCalculationCoord: true,\n          storeDimIndex: dimensionDefineList.length\n        };\n        var stackResultDimensionDefine = {\n          name: stackedOverDimension,\n          // This dimension contains stack base (generally, 0), so do not set it as\n          // `stackedDimCoordDim` to avoid extent calculation, consider log scale.\n          coordDim: stackedOverDimension,\n          coordDimIndex: stackedDimCoordIndex_1 + 1,\n          type: stackedDimType,\n          isExtraCoord: true,\n          isCalculationCoord: true,\n          storeDimIndex: dimensionDefineList.length + 1\n        };\n        if (schema) {\n          if (store) {\n            stackedOverDimensionDefine.storeDimIndex = store.ensureCalculationDimension(stackedOverDimension, stackedDimType);\n            stackResultDimensionDefine.storeDimIndex = store.ensureCalculationDimension(stackResultDimension, stackedDimType);\n          }\n          schema.appendCalculationDimension(stackedOverDimensionDefine);\n          schema.appendCalculationDimension(stackResultDimensionDefine);\n        } else {\n          dimensionDefineList.push(stackedOverDimensionDefine);\n          dimensionDefineList.push(stackResultDimensionDefine);\n        }\n      }\n      return {\n        stackedDimension: stackedDimInfo && stackedDimInfo.name,\n        stackedByDimension: stackedByDimInfo && stackedByDimInfo.name,\n        isStackedByIndex: byIndex,\n        stackedOverDimension: stackedOverDimension,\n        stackResultDimension: stackResultDimension\n      };\n    }\n    function isLegacyDimensionsInput(dimensionsInput) {\n      return !isSeriesDataSchema(dimensionsInput.schema);\n    }\n    function isDimensionStacked(data, stackedDim) {\n      // Each single series only maps to one pair of axis. So we do not need to\n      // check stackByDim, whatever stacked by a dimension or stacked by index.\n      return !!stackedDim && stackedDim === data.getCalculationInfo('stackedDimension');\n    }\n    function getStackedDimension(data, targetDim) {\n      return isDimensionStacked(data, targetDim) ? data.getCalculationInfo('stackResultDimension') : targetDim;\n    }\n\n    function getCoordSysDimDefs(seriesModel, coordSysInfo) {\n      var coordSysName = seriesModel.get('coordinateSystem');\n      var registeredCoordSys = CoordinateSystemManager.get(coordSysName);\n      var coordSysDimDefs;\n      if (coordSysInfo && coordSysInfo.coordSysDims) {\n        coordSysDimDefs = map(coordSysInfo.coordSysDims, function (dim) {\n          var dimInfo = {\n            name: dim\n          };\n          var axisModel = coordSysInfo.axisMap.get(dim);\n          if (axisModel) {\n            var axisType = axisModel.get('type');\n            dimInfo.type = getDimensionTypeByAxis(axisType);\n          }\n          return dimInfo;\n        });\n      }\n      if (!coordSysDimDefs) {\n        // Get dimensions from registered coordinate system\n        coordSysDimDefs = registeredCoordSys && (registeredCoordSys.getDimensionsInfo ? registeredCoordSys.getDimensionsInfo() : registeredCoordSys.dimensions.slice()) || ['x', 'y'];\n      }\n      return coordSysDimDefs;\n    }\n    function injectOrdinalMeta(dimInfoList, createInvertedIndices, coordSysInfo) {\n      var firstCategoryDimIndex;\n      var hasNameEncode;\n      coordSysInfo && each(dimInfoList, function (dimInfo, dimIndex) {\n        var coordDim = dimInfo.coordDim;\n        var categoryAxisModel = coordSysInfo.categoryAxisMap.get(coordDim);\n        if (categoryAxisModel) {\n          if (firstCategoryDimIndex == null) {\n            firstCategoryDimIndex = dimIndex;\n          }\n          dimInfo.ordinalMeta = categoryAxisModel.getOrdinalMeta();\n          if (createInvertedIndices) {\n            dimInfo.createInvertedIndices = true;\n          }\n        }\n        if (dimInfo.otherDims.itemName != null) {\n          hasNameEncode = true;\n        }\n      });\n      if (!hasNameEncode && firstCategoryDimIndex != null) {\n        dimInfoList[firstCategoryDimIndex].otherDims.itemName = 0;\n      }\n      return firstCategoryDimIndex;\n    }\n    /**\r\n     * Caution: there are side effects to `sourceManager` in this method.\r\n     * Should better only be called in `Series['getInitialData']`.\r\n     */\n    function createSeriesData(sourceRaw, seriesModel, opt) {\n      opt = opt || {};\n      var sourceManager = seriesModel.getSourceManager();\n      var source;\n      var isOriginalSource = false;\n      if (sourceRaw) {\n        isOriginalSource = true;\n        source = createSourceFromSeriesDataOption(sourceRaw);\n      } else {\n        source = sourceManager.getSource();\n        // Is series.data. not dataset.\n        isOriginalSource = source.sourceFormat === SOURCE_FORMAT_ORIGINAL;\n      }\n      var coordSysInfo = getCoordSysInfoBySeries(seriesModel);\n      var coordSysDimDefs = getCoordSysDimDefs(seriesModel, coordSysInfo);\n      var useEncodeDefaulter = opt.useEncodeDefaulter;\n      var encodeDefaulter = isFunction(useEncodeDefaulter) ? useEncodeDefaulter : useEncodeDefaulter ? curry(makeSeriesEncodeForAxisCoordSys, coordSysDimDefs, seriesModel) : null;\n      var createDimensionOptions = {\n        coordDimensions: coordSysDimDefs,\n        generateCoord: opt.generateCoord,\n        encodeDefine: seriesModel.getEncode(),\n        encodeDefaulter: encodeDefaulter,\n        canOmitUnusedDimensions: !isOriginalSource\n      };\n      var schema = prepareSeriesDataSchema(source, createDimensionOptions);\n      var firstCategoryDimIndex = injectOrdinalMeta(schema.dimensions, opt.createInvertedIndices, coordSysInfo);\n      var store = !isOriginalSource ? sourceManager.getSharedDataStore(schema) : null;\n      var stackCalculationInfo = enableDataStack(seriesModel, {\n        schema: schema,\n        store: store\n      });\n      var data = new SeriesData(schema, seriesModel);\n      data.setCalculationInfo(stackCalculationInfo);\n      var dimValueGetter = firstCategoryDimIndex != null && isNeedCompleteOrdinalData(source) ? function (itemOpt, dimName, dataIndex, dimIndex) {\n        // Use dataIndex as ordinal value in categoryAxis\n        return dimIndex === firstCategoryDimIndex ? dataIndex : this.defaultDimValueGetter(itemOpt, dimName, dataIndex, dimIndex);\n      } : null;\n      data.hasItemOption = false;\n      data.initData(\n      // Try to reuse the data store in sourceManager if using dataset.\n      isOriginalSource ? source : store, null, dimValueGetter);\n      return data;\n    }\n    function isNeedCompleteOrdinalData(source) {\n      if (source.sourceFormat === SOURCE_FORMAT_ORIGINAL) {\n        var sampleItem = firstDataNotNull(source.data || []);\n        return !isArray(getDataItemValue(sampleItem));\n      }\n    }\n    function firstDataNotNull(arr) {\n      var i = 0;\n      while (i < arr.length && arr[i] == null) {\n        i++;\n      }\n      return arr[i];\n    }\n\n    var Scale = /** @class */function () {\n      function Scale(setting) {\n        this._setting = setting || {};\n        this._extent = [Infinity, -Infinity];\n      }\n      Scale.prototype.getSetting = function (name) {\n        return this._setting[name];\n      };\n      /**\r\n       * Set extent from data\r\n       */\n      Scale.prototype.unionExtent = function (other) {\n        var extent = this._extent;\n        other[0] < extent[0] && (extent[0] = other[0]);\n        other[1] > extent[1] && (extent[1] = other[1]);\n        // not setExtent because in log axis it may transformed to power\n        // this.setExtent(extent[0], extent[1]);\n      };\n      /**\r\n       * Set extent from data\r\n       */\n      Scale.prototype.unionExtentFromData = function (data, dim) {\n        this.unionExtent(data.getApproximateExtent(dim));\n      };\n      /**\r\n       * Get extent\r\n       *\r\n       * Extent is always in increase order.\r\n       */\n      Scale.prototype.getExtent = function () {\n        return this._extent.slice();\n      };\n      /**\r\n       * Set extent\r\n       */\n      Scale.prototype.setExtent = function (start, end) {\n        var thisExtent = this._extent;\n        if (!isNaN(start)) {\n          thisExtent[0] = start;\n        }\n        if (!isNaN(end)) {\n          thisExtent[1] = end;\n        }\n      };\n      /**\r\n       * If value is in extent range\r\n       */\n      Scale.prototype.isInExtentRange = function (value) {\n        return this._extent[0] <= value && this._extent[1] >= value;\n      };\n      /**\r\n       * When axis extent depends on data and no data exists,\r\n       * axis ticks should not be drawn, which is named 'blank'.\r\n       */\n      Scale.prototype.isBlank = function () {\n        return this._isBlank;\n      };\n      /**\r\n       * When axis extent depends on data and no data exists,\r\n       * axis ticks should not be drawn, which is named 'blank'.\r\n       */\n      Scale.prototype.setBlank = function (isBlank) {\n        this._isBlank = isBlank;\n      };\n      return Scale;\n    }();\n    enableClassManagement(Scale);\n\n    var uidBase = 0;\n    var OrdinalMeta = /** @class */function () {\n      function OrdinalMeta(opt) {\n        this.categories = opt.categories || [];\n        this._needCollect = opt.needCollect;\n        this._deduplication = opt.deduplication;\n        this.uid = ++uidBase;\n      }\n      OrdinalMeta.createByAxisModel = function (axisModel) {\n        var option = axisModel.option;\n        var data = option.data;\n        var categories = data && map(data, getName);\n        return new OrdinalMeta({\n          categories: categories,\n          needCollect: !categories,\n          // deduplication is default in axis.\n          deduplication: option.dedplication !== false\n        });\n      };\n      OrdinalMeta.prototype.getOrdinal = function (category) {\n        // @ts-ignore\n        return this._getOrCreateMap().get(category);\n      };\n      /**\r\n       * @return The ordinal. If not found, return NaN.\r\n       */\n      OrdinalMeta.prototype.parseAndCollect = function (category) {\n        var index;\n        var needCollect = this._needCollect;\n        // The value of category dim can be the index of the given category set.\n        // This feature is only supported when !needCollect, because we should\n        // consider a common case: a value is 2017, which is a number but is\n        // expected to be tread as a category. This case usually happen in dataset,\n        // where it happent to be no need of the index feature.\n        if (!isString(category) && !needCollect) {\n          return category;\n        }\n        // Optimize for the scenario:\n        // category is ['2012-01-01', '2012-01-02', ...], where the input\n        // data has been ensured not duplicate and is large data.\n        // Notice, if a dataset dimension provide categroies, usually echarts\n        // should remove duplication except user tell echarts dont do that\n        // (set axis.deduplication = false), because echarts do not know whether\n        // the values in the category dimension has duplication (consider the\n        // parallel-aqi example)\n        if (needCollect && !this._deduplication) {\n          index = this.categories.length;\n          this.categories[index] = category;\n          return index;\n        }\n        var map = this._getOrCreateMap();\n        // @ts-ignore\n        index = map.get(category);\n        if (index == null) {\n          if (needCollect) {\n            index = this.categories.length;\n            this.categories[index] = category;\n            // @ts-ignore\n            map.set(category, index);\n          } else {\n            index = NaN;\n          }\n        }\n        return index;\n      };\n      // Consider big data, do not create map until needed.\n      OrdinalMeta.prototype._getOrCreateMap = function () {\n        return this._map || (this._map = createHashMap(this.categories));\n      };\n      return OrdinalMeta;\n    }();\n    function getName(obj) {\n      if (isObject(obj) && obj.value != null) {\n        return obj.value;\n      } else {\n        return obj + '';\n      }\n    }\n\n    function isValueNice(val) {\n      var exp10 = Math.pow(10, quantityExponent(Math.abs(val)));\n      var f = Math.abs(val / exp10);\n      return f === 0 || f === 1 || f === 2 || f === 3 || f === 5;\n    }\n    function isIntervalOrLogScale(scale) {\n      return scale.type === 'interval' || scale.type === 'log';\n    }\n    /**\r\n     * @param extent Both extent[0] and extent[1] should be valid number.\r\n     *               Should be extent[0] < extent[1].\r\n     * @param splitNumber splitNumber should be >= 1.\r\n     */\n    function intervalScaleNiceTicks(extent, splitNumber, minInterval, maxInterval) {\n      var result = {};\n      var span = extent[1] - extent[0];\n      var interval = result.interval = nice(span / splitNumber, true);\n      if (minInterval != null && interval < minInterval) {\n        interval = result.interval = minInterval;\n      }\n      if (maxInterval != null && interval > maxInterval) {\n        interval = result.interval = maxInterval;\n      }\n      // Tow more digital for tick.\n      var precision = result.intervalPrecision = getIntervalPrecision(interval);\n      // Niced extent inside original extent\n      var niceTickExtent = result.niceTickExtent = [round(Math.ceil(extent[0] / interval) * interval, precision), round(Math.floor(extent[1] / interval) * interval, precision)];\n      fixExtent(niceTickExtent, extent);\n      return result;\n    }\n    function increaseInterval(interval) {\n      var exp10 = Math.pow(10, quantityExponent(interval));\n      // Increase interval\n      var f = interval / exp10;\n      if (!f) {\n        f = 1;\n      } else if (f === 2) {\n        f = 3;\n      } else if (f === 3) {\n        f = 5;\n      } else {\n        // f is 1 or 5\n        f *= 2;\n      }\n      return round(f * exp10);\n    }\n    /**\r\n     * @return interval precision\r\n     */\n    function getIntervalPrecision(interval) {\n      // Tow more digital for tick.\n      return getPrecision(interval) + 2;\n    }\n    function clamp(niceTickExtent, idx, extent) {\n      niceTickExtent[idx] = Math.max(Math.min(niceTickExtent[idx], extent[1]), extent[0]);\n    }\n    // In some cases (e.g., splitNumber is 1), niceTickExtent may be out of extent.\n    function fixExtent(niceTickExtent, extent) {\n      !isFinite(niceTickExtent[0]) && (niceTickExtent[0] = extent[0]);\n      !isFinite(niceTickExtent[1]) && (niceTickExtent[1] = extent[1]);\n      clamp(niceTickExtent, 0, extent);\n      clamp(niceTickExtent, 1, extent);\n      if (niceTickExtent[0] > niceTickExtent[1]) {\n        niceTickExtent[0] = niceTickExtent[1];\n      }\n    }\n    function contain$1(val, extent) {\n      return val >= extent[0] && val <= extent[1];\n    }\n    function normalize$1(val, extent) {\n      if (extent[1] === extent[0]) {\n        return 0.5;\n      }\n      return (val - extent[0]) / (extent[1] - extent[0]);\n    }\n    function scale$2(val, extent) {\n      return val * (extent[1] - extent[0]) + extent[0];\n    }\n\n    var OrdinalScale = /** @class */function (_super) {\n      __extends(OrdinalScale, _super);\n      function OrdinalScale(setting) {\n        var _this = _super.call(this, setting) || this;\n        _this.type = 'ordinal';\n        var ordinalMeta = _this.getSetting('ordinalMeta');\n        // Caution: Should not use instanceof, consider ec-extensions using\n        // import approach to get OrdinalMeta class.\n        if (!ordinalMeta) {\n          ordinalMeta = new OrdinalMeta({});\n        }\n        if (isArray(ordinalMeta)) {\n          ordinalMeta = new OrdinalMeta({\n            categories: map(ordinalMeta, function (item) {\n              return isObject(item) ? item.value : item;\n            })\n          });\n        }\n        _this._ordinalMeta = ordinalMeta;\n        _this._extent = _this.getSetting('extent') || [0, ordinalMeta.categories.length - 1];\n        return _this;\n      }\n      OrdinalScale.prototype.parse = function (val) {\n        // Caution: Math.round(null) will return `0` rather than `NaN`\n        if (val == null) {\n          return NaN;\n        }\n        return isString(val) ? this._ordinalMeta.getOrdinal(val)\n        // val might be float.\n        : Math.round(val);\n      };\n      OrdinalScale.prototype.contain = function (rank) {\n        rank = this.parse(rank);\n        return contain$1(rank, this._extent) && this._ordinalMeta.categories[rank] != null;\n      };\n      /**\r\n       * Normalize given rank or name to linear [0, 1]\r\n       * @param val raw ordinal number.\r\n       * @return normalized value in [0, 1].\r\n       */\n      OrdinalScale.prototype.normalize = function (val) {\n        val = this._getTickNumber(this.parse(val));\n        return normalize$1(val, this._extent);\n      };\n      /**\r\n       * @param val normalized value in [0, 1].\r\n       * @return raw ordinal number.\r\n       */\n      OrdinalScale.prototype.scale = function (val) {\n        val = Math.round(scale$2(val, this._extent));\n        return this.getRawOrdinalNumber(val);\n      };\n      OrdinalScale.prototype.getTicks = function () {\n        var ticks = [];\n        var extent = this._extent;\n        var rank = extent[0];\n        while (rank <= extent[1]) {\n          ticks.push({\n            value: rank\n          });\n          rank++;\n        }\n        return ticks;\n      };\n      OrdinalScale.prototype.getMinorTicks = function (splitNumber) {\n        // Not support.\n        return;\n      };\n      /**\r\n       * @see `Ordinal['_ordinalNumbersByTick']`\r\n       */\n      OrdinalScale.prototype.setSortInfo = function (info) {\n        if (info == null) {\n          this._ordinalNumbersByTick = this._ticksByOrdinalNumber = null;\n          return;\n        }\n        var infoOrdinalNumbers = info.ordinalNumbers;\n        var ordinalsByTick = this._ordinalNumbersByTick = [];\n        var ticksByOrdinal = this._ticksByOrdinalNumber = [];\n        // Unnecessary support negative tick in `realtimeSort`.\n        var tickNum = 0;\n        var allCategoryLen = this._ordinalMeta.categories.length;\n        for (var len = Math.min(allCategoryLen, infoOrdinalNumbers.length); tickNum < len; ++tickNum) {\n          var ordinalNumber = infoOrdinalNumbers[tickNum];\n          ordinalsByTick[tickNum] = ordinalNumber;\n          ticksByOrdinal[ordinalNumber] = tickNum;\n        }\n        // Handle that `series.data` only covers part of the `axis.category.data`.\n        var unusedOrdinal = 0;\n        for (; tickNum < allCategoryLen; ++tickNum) {\n          while (ticksByOrdinal[unusedOrdinal] != null) {\n            unusedOrdinal++;\n          }\n          ordinalsByTick.push(unusedOrdinal);\n          ticksByOrdinal[unusedOrdinal] = tickNum;\n        }\n      };\n      OrdinalScale.prototype._getTickNumber = function (ordinal) {\n        var ticksByOrdinalNumber = this._ticksByOrdinalNumber;\n        // also support ordinal out of range of `ordinalMeta.categories.length`,\n        // where ordinal numbers are used as tick value directly.\n        return ticksByOrdinalNumber && ordinal >= 0 && ordinal < ticksByOrdinalNumber.length ? ticksByOrdinalNumber[ordinal] : ordinal;\n      };\n      /**\r\n       * @usage\r\n       * ```js\r\n       * const ordinalNumber = ordinalScale.getRawOrdinalNumber(tickVal);\r\n       *\r\n       * // case0\r\n       * const rawOrdinalValue = axisModel.getCategories()[ordinalNumber];\r\n       * // case1\r\n       * const rawOrdinalValue = this._ordinalMeta.categories[ordinalNumber];\r\n       * // case2\r\n       * const coord = axis.dataToCoord(ordinalNumber);\r\n       * ```\r\n       *\r\n       * @param {OrdinalNumber} tickNumber index of display\r\n       */\n      OrdinalScale.prototype.getRawOrdinalNumber = function (tickNumber) {\n        var ordinalNumbersByTick = this._ordinalNumbersByTick;\n        // tickNumber may be out of range, e.g., when axis max is larger than `ordinalMeta.categories.length`.,\n        // where ordinal numbers are used as tick value directly.\n        return ordinalNumbersByTick && tickNumber >= 0 && tickNumber < ordinalNumbersByTick.length ? ordinalNumbersByTick[tickNumber] : tickNumber;\n      };\n      /**\r\n       * Get item on tick\r\n       */\n      OrdinalScale.prototype.getLabel = function (tick) {\n        if (!this.isBlank()) {\n          var ordinalNumber = this.getRawOrdinalNumber(tick.value);\n          var cateogry = this._ordinalMeta.categories[ordinalNumber];\n          // Note that if no data, ordinalMeta.categories is an empty array.\n          // Return empty if it's not exist.\n          return cateogry == null ? '' : cateogry + '';\n        }\n      };\n      OrdinalScale.prototype.count = function () {\n        return this._extent[1] - this._extent[0] + 1;\n      };\n      OrdinalScale.prototype.unionExtentFromData = function (data, dim) {\n        this.unionExtent(data.getApproximateExtent(dim));\n      };\n      /**\r\n       * @override\r\n       * If value is in extent range\r\n       */\n      OrdinalScale.prototype.isInExtentRange = function (value) {\n        value = this._getTickNumber(value);\n        return this._extent[0] <= value && this._extent[1] >= value;\n      };\n      OrdinalScale.prototype.getOrdinalMeta = function () {\n        return this._ordinalMeta;\n      };\n      OrdinalScale.prototype.calcNiceTicks = function () {};\n      OrdinalScale.prototype.calcNiceExtent = function () {};\n      OrdinalScale.type = 'ordinal';\n      return OrdinalScale;\n    }(Scale);\n    Scale.registerClass(OrdinalScale);\n\n    var roundNumber = round;\n    var IntervalScale = /** @class */function (_super) {\n      __extends(IntervalScale, _super);\n      function IntervalScale() {\n        var _this = _super !== null && _super.apply(this, arguments) || this;\n        _this.type = 'interval';\n        // Step is calculated in adjustExtent.\n        _this._interval = 0;\n        _this._intervalPrecision = 2;\n        return _this;\n      }\n      IntervalScale.prototype.parse = function (val) {\n        return val;\n      };\n      IntervalScale.prototype.contain = function (val) {\n        return contain$1(val, this._extent);\n      };\n      IntervalScale.prototype.normalize = function (val) {\n        return normalize$1(val, this._extent);\n      };\n      IntervalScale.prototype.scale = function (val) {\n        return scale$2(val, this._extent);\n      };\n      IntervalScale.prototype.setExtent = function (start, end) {\n        var thisExtent = this._extent;\n        // start,end may be a Number like '25',so...\n        if (!isNaN(start)) {\n          thisExtent[0] = parseFloat(start);\n        }\n        if (!isNaN(end)) {\n          thisExtent[1] = parseFloat(end);\n        }\n      };\n      IntervalScale.prototype.unionExtent = function (other) {\n        var extent = this._extent;\n        other[0] < extent[0] && (extent[0] = other[0]);\n        other[1] > extent[1] && (extent[1] = other[1]);\n        // unionExtent may called by it's sub classes\n        this.setExtent(extent[0], extent[1]);\n      };\n      IntervalScale.prototype.getInterval = function () {\n        return this._interval;\n      };\n      IntervalScale.prototype.setInterval = function (interval) {\n        this._interval = interval;\n        // Dropped auto calculated niceExtent and use user-set extent.\n        // We assume user wants to set both interval, min, max to get a better result.\n        this._niceExtent = this._extent.slice();\n        this._intervalPrecision = getIntervalPrecision(interval);\n      };\n      /**\r\n       * @param expandToNicedExtent Whether expand the ticks to niced extent.\r\n       */\n      IntervalScale.prototype.getTicks = function (expandToNicedExtent) {\n        var interval = this._interval;\n        var extent = this._extent;\n        var niceTickExtent = this._niceExtent;\n        var intervalPrecision = this._intervalPrecision;\n        var ticks = [];\n        // If interval is 0, return [];\n        if (!interval) {\n          return ticks;\n        }\n        // Consider this case: using dataZoom toolbox, zoom and zoom.\n        var safeLimit = 10000;\n        if (extent[0] < niceTickExtent[0]) {\n          if (expandToNicedExtent) {\n            ticks.push({\n              value: roundNumber(niceTickExtent[0] - interval, intervalPrecision)\n            });\n          } else {\n            ticks.push({\n              value: extent[0]\n            });\n          }\n        }\n        var tick = niceTickExtent[0];\n        while (tick <= niceTickExtent[1]) {\n          ticks.push({\n            value: tick\n          });\n          // Avoid rounding error\n          tick = roundNumber(tick + interval, intervalPrecision);\n          if (tick === ticks[ticks.length - 1].value) {\n            // Consider out of safe float point, e.g.,\n            // -3711126.9907707 + 2e-10 === -3711126.9907707\n            break;\n          }\n          if (ticks.length > safeLimit) {\n            return [];\n          }\n        }\n        // Consider this case: the last item of ticks is smaller\n        // than niceTickExtent[1] and niceTickExtent[1] === extent[1].\n        var lastNiceTick = ticks.length ? ticks[ticks.length - 1].value : niceTickExtent[1];\n        if (extent[1] > lastNiceTick) {\n          if (expandToNicedExtent) {\n            ticks.push({\n              value: roundNumber(lastNiceTick + interval, intervalPrecision)\n            });\n          } else {\n            ticks.push({\n              value: extent[1]\n            });\n          }\n        }\n        return ticks;\n      };\n      IntervalScale.prototype.getMinorTicks = function (splitNumber) {\n        var ticks = this.getTicks(true);\n        var minorTicks = [];\n        var extent = this.getExtent();\n        for (var i = 1; i < ticks.length; i++) {\n          var nextTick = ticks[i];\n          var prevTick = ticks[i - 1];\n          var count = 0;\n          var minorTicksGroup = [];\n          var interval = nextTick.value - prevTick.value;\n          var minorInterval = interval / splitNumber;\n          while (count < splitNumber - 1) {\n            var minorTick = roundNumber(prevTick.value + (count + 1) * minorInterval);\n            // For the first and last interval. The count may be less than splitNumber.\n            if (minorTick > extent[0] && minorTick < extent[1]) {\n              minorTicksGroup.push(minorTick);\n            }\n            count++;\n          }\n          minorTicks.push(minorTicksGroup);\n        }\n        return minorTicks;\n      };\n      /**\r\n       * @param opt.precision If 'auto', use nice presision.\r\n       * @param opt.pad returns 1.50 but not 1.5 if precision is 2.\r\n       */\n      IntervalScale.prototype.getLabel = function (data, opt) {\n        if (data == null) {\n          return '';\n        }\n        var precision = opt && opt.precision;\n        if (precision == null) {\n          precision = getPrecision(data.value) || 0;\n        } else if (precision === 'auto') {\n          // Should be more precise then tick.\n          precision = this._intervalPrecision;\n        }\n        // (1) If `precision` is set, 12.005 should be display as '12.00500'.\n        // (2) Use roundNumber (toFixed) to avoid scientific notation like '3.5e-7'.\n        var dataNum = roundNumber(data.value, precision, true);\n        return addCommas(dataNum);\n      };\n      /**\r\n       * @param splitNumber By default `5`.\r\n       */\n      IntervalScale.prototype.calcNiceTicks = function (splitNumber, minInterval, maxInterval) {\n        splitNumber = splitNumber || 5;\n        var extent = this._extent;\n        var span = extent[1] - extent[0];\n        if (!isFinite(span)) {\n          return;\n        }\n        // User may set axis min 0 and data are all negative\n        // FIXME If it needs to reverse ?\n        if (span < 0) {\n          span = -span;\n          extent.reverse();\n        }\n        var result = intervalScaleNiceTicks(extent, splitNumber, minInterval, maxInterval);\n        this._intervalPrecision = result.intervalPrecision;\n        this._interval = result.interval;\n        this._niceExtent = result.niceTickExtent;\n      };\n      IntervalScale.prototype.calcNiceExtent = function (opt) {\n        var extent = this._extent;\n        // If extent start and end are same, expand them\n        if (extent[0] === extent[1]) {\n          if (extent[0] !== 0) {\n            // Expand extent\n            // Note that extents can be both negative. See #13154\n            var expandSize = Math.abs(extent[0]);\n            // In the fowllowing case\n            //      Axis has been fixed max 100\n            //      Plus data are all 100 and axis extent are [100, 100].\n            // Extend to the both side will cause expanded max is larger than fixed max.\n            // So only expand to the smaller side.\n            if (!opt.fixMax) {\n              extent[1] += expandSize / 2;\n              extent[0] -= expandSize / 2;\n            } else {\n              extent[0] -= expandSize / 2;\n            }\n          } else {\n            extent[1] = 1;\n          }\n        }\n        var span = extent[1] - extent[0];\n        // If there are no data and extent are [Infinity, -Infinity]\n        if (!isFinite(span)) {\n          extent[0] = 0;\n          extent[1] = 1;\n        }\n        this.calcNiceTicks(opt.splitNumber, opt.minInterval, opt.maxInterval);\n        // let extent = this._extent;\n        var interval = this._interval;\n        if (!opt.fixMin) {\n          extent[0] = roundNumber(Math.floor(extent[0] / interval) * interval);\n        }\n        if (!opt.fixMax) {\n          extent[1] = roundNumber(Math.ceil(extent[1] / interval) * interval);\n        }\n      };\n      IntervalScale.prototype.setNiceExtent = function (min, max) {\n        this._niceExtent = [min, max];\n      };\n      IntervalScale.type = 'interval';\n      return IntervalScale;\n    }(Scale);\n    Scale.registerClass(IntervalScale);\n\n    /* global Float32Array */\n    var supportFloat32Array = typeof Float32Array !== 'undefined';\n    var Float32ArrayCtor = !supportFloat32Array ? Array : Float32Array;\n    function createFloat32Array(arg) {\n      if (isArray(arg)) {\n        // Return self directly if don't support TypedArray.\n        return supportFloat32Array ? new Float32Array(arg) : arg;\n      }\n      // Else is number\n      return new Float32ArrayCtor(arg);\n    }\n\n    var STACK_PREFIX = '__ec_stack_';\n    function getSeriesStackId(seriesModel) {\n      return seriesModel.get('stack') || STACK_PREFIX + seriesModel.seriesIndex;\n    }\n    function getAxisKey(axis) {\n      return axis.dim + axis.index;\n    }\n    /**\r\n     * @return {Object} {width, offset, offsetCenter} If axis.type is not 'category', return undefined.\r\n     */\n    function getLayoutOnAxis(opt) {\n      var params = [];\n      var baseAxis = opt.axis;\n      var axisKey = 'axis0';\n      if (baseAxis.type !== 'category') {\n        return;\n      }\n      var bandWidth = baseAxis.getBandWidth();\n      for (var i = 0; i < opt.count || 0; i++) {\n        params.push(defaults({\n          bandWidth: bandWidth,\n          axisKey: axisKey,\n          stackId: STACK_PREFIX + i\n        }, opt));\n      }\n      var widthAndOffsets = doCalBarWidthAndOffset(params);\n      var result = [];\n      for (var i = 0; i < opt.count; i++) {\n        var item = widthAndOffsets[axisKey][STACK_PREFIX + i];\n        item.offsetCenter = item.offset + item.width / 2;\n        result.push(item);\n      }\n      return result;\n    }\n    function prepareLayoutBarSeries(seriesType, ecModel) {\n      var seriesModels = [];\n      ecModel.eachSeriesByType(seriesType, function (seriesModel) {\n        // Check series coordinate, do layout for cartesian2d only\n        if (isOnCartesian(seriesModel)) {\n          seriesModels.push(seriesModel);\n        }\n      });\n      return seriesModels;\n    }\n    /**\r\n     * Map from (baseAxis.dim + '_' + baseAxis.index) to min gap of two adjacent\r\n     * values.\r\n     * This works for time axes, value axes, and log axes.\r\n     * For a single time axis, return value is in the form like\r\n     * {'x_0': [1000000]}.\r\n     * The value of 1000000 is in milliseconds.\r\n     */\n    function getValueAxesMinGaps(barSeries) {\n      /**\r\n       * Map from axis.index to values.\r\n       * For a single time axis, axisValues is in the form like\r\n       * {'x_0': [1495555200000, 1495641600000, 1495728000000]}.\r\n       * Items in axisValues[x], e.g. 1495555200000, are time values of all\r\n       * series.\r\n       */\n      var axisValues = {};\n      each(barSeries, function (seriesModel) {\n        var cartesian = seriesModel.coordinateSystem;\n        var baseAxis = cartesian.getBaseAxis();\n        if (baseAxis.type !== 'time' && baseAxis.type !== 'value') {\n          return;\n        }\n        var data = seriesModel.getData();\n        var key = baseAxis.dim + '_' + baseAxis.index;\n        var dimIdx = data.getDimensionIndex(data.mapDimension(baseAxis.dim));\n        var store = data.getStore();\n        for (var i = 0, cnt = store.count(); i < cnt; ++i) {\n          var value = store.get(dimIdx, i);\n          if (!axisValues[key]) {\n            // No previous data for the axis\n            axisValues[key] = [value];\n          } else {\n            // No value in previous series\n            axisValues[key].push(value);\n          }\n          // Ignore duplicated time values in the same axis\n        }\n      });\n      var axisMinGaps = {};\n      for (var key in axisValues) {\n        if (axisValues.hasOwnProperty(key)) {\n          var valuesInAxis = axisValues[key];\n          if (valuesInAxis) {\n            // Sort axis values into ascending order to calculate gaps\n            valuesInAxis.sort(function (a, b) {\n              return a - b;\n            });\n            var min = null;\n            for (var j = 1; j < valuesInAxis.length; ++j) {\n              var delta = valuesInAxis[j] - valuesInAxis[j - 1];\n              if (delta > 0) {\n                // Ignore 0 delta because they are of the same axis value\n                min = min === null ? delta : Math.min(min, delta);\n              }\n            }\n            // Set to null if only have one data\n            axisMinGaps[key] = min;\n          }\n        }\n      }\n      return axisMinGaps;\n    }\n    function makeColumnLayout(barSeries) {\n      var axisMinGaps = getValueAxesMinGaps(barSeries);\n      var seriesInfoList = [];\n      each(barSeries, function (seriesModel) {\n        var cartesian = seriesModel.coordinateSystem;\n        var baseAxis = cartesian.getBaseAxis();\n        var axisExtent = baseAxis.getExtent();\n        var bandWidth;\n        if (baseAxis.type === 'category') {\n          bandWidth = baseAxis.getBandWidth();\n        } else if (baseAxis.type === 'value' || baseAxis.type === 'time') {\n          var key = baseAxis.dim + '_' + baseAxis.index;\n          var minGap = axisMinGaps[key];\n          var extentSpan = Math.abs(axisExtent[1] - axisExtent[0]);\n          var scale = baseAxis.scale.getExtent();\n          var scaleSpan = Math.abs(scale[1] - scale[0]);\n          bandWidth = minGap ? extentSpan / scaleSpan * minGap : extentSpan; // When there is only one data value\n        } else {\n          var data = seriesModel.getData();\n          bandWidth = Math.abs(axisExtent[1] - axisExtent[0]) / data.count();\n        }\n        var barWidth = parsePercent$1(seriesModel.get('barWidth'), bandWidth);\n        var barMaxWidth = parsePercent$1(seriesModel.get('barMaxWidth'), bandWidth);\n        var barMinWidth = parsePercent$1(\n        // barMinWidth by default is 0.5 / 1 in cartesian. Because in value axis,\n        // the auto-calculated bar width might be less than 0.5 / 1.\n        seriesModel.get('barMinWidth') || (isInLargeMode(seriesModel) ? 0.5 : 1), bandWidth);\n        var barGap = seriesModel.get('barGap');\n        var barCategoryGap = seriesModel.get('barCategoryGap');\n        seriesInfoList.push({\n          bandWidth: bandWidth,\n          barWidth: barWidth,\n          barMaxWidth: barMaxWidth,\n          barMinWidth: barMinWidth,\n          barGap: barGap,\n          barCategoryGap: barCategoryGap,\n          axisKey: getAxisKey(baseAxis),\n          stackId: getSeriesStackId(seriesModel)\n        });\n      });\n      return doCalBarWidthAndOffset(seriesInfoList);\n    }\n    function doCalBarWidthAndOffset(seriesInfoList) {\n      // Columns info on each category axis. Key is cartesian name\n      var columnsMap = {};\n      each(seriesInfoList, function (seriesInfo, idx) {\n        var axisKey = seriesInfo.axisKey;\n        var bandWidth = seriesInfo.bandWidth;\n        var columnsOnAxis = columnsMap[axisKey] || {\n          bandWidth: bandWidth,\n          remainedWidth: bandWidth,\n          autoWidthCount: 0,\n          categoryGap: null,\n          gap: '20%',\n          stacks: {}\n        };\n        var stacks = columnsOnAxis.stacks;\n        columnsMap[axisKey] = columnsOnAxis;\n        var stackId = seriesInfo.stackId;\n        if (!stacks[stackId]) {\n          columnsOnAxis.autoWidthCount++;\n        }\n        stacks[stackId] = stacks[stackId] || {\n          width: 0,\n          maxWidth: 0\n        };\n        // Caution: In a single coordinate system, these barGrid attributes\n        // will be shared by series. Consider that they have default values,\n        // only the attributes set on the last series will work.\n        // Do not change this fact unless there will be a break change.\n        var barWidth = seriesInfo.barWidth;\n        if (barWidth && !stacks[stackId].width) {\n          // See #6312, do not restrict width.\n          stacks[stackId].width = barWidth;\n          barWidth = Math.min(columnsOnAxis.remainedWidth, barWidth);\n          columnsOnAxis.remainedWidth -= barWidth;\n        }\n        var barMaxWidth = seriesInfo.barMaxWidth;\n        barMaxWidth && (stacks[stackId].maxWidth = barMaxWidth);\n        var barMinWidth = seriesInfo.barMinWidth;\n        barMinWidth && (stacks[stackId].minWidth = barMinWidth);\n        var barGap = seriesInfo.barGap;\n        barGap != null && (columnsOnAxis.gap = barGap);\n        var barCategoryGap = seriesInfo.barCategoryGap;\n        barCategoryGap != null && (columnsOnAxis.categoryGap = barCategoryGap);\n      });\n      var result = {};\n      each(columnsMap, function (columnsOnAxis, coordSysName) {\n        result[coordSysName] = {};\n        var stacks = columnsOnAxis.stacks;\n        var bandWidth = columnsOnAxis.bandWidth;\n        var categoryGapPercent = columnsOnAxis.categoryGap;\n        if (categoryGapPercent == null) {\n          var columnCount = keys(stacks).length;\n          // More columns in one group\n          // the spaces between group is smaller. Or the column will be too thin.\n          categoryGapPercent = Math.max(35 - columnCount * 4, 15) + '%';\n        }\n        var categoryGap = parsePercent$1(categoryGapPercent, bandWidth);\n        var barGapPercent = parsePercent$1(columnsOnAxis.gap, 1);\n        var remainedWidth = columnsOnAxis.remainedWidth;\n        var autoWidthCount = columnsOnAxis.autoWidthCount;\n        var autoWidth = (remainedWidth - categoryGap) / (autoWidthCount + (autoWidthCount - 1) * barGapPercent);\n        autoWidth = Math.max(autoWidth, 0);\n        // Find if any auto calculated bar exceeded maxBarWidth\n        each(stacks, function (column) {\n          var maxWidth = column.maxWidth;\n          var minWidth = column.minWidth;\n          if (!column.width) {\n            var finalWidth = autoWidth;\n            if (maxWidth && maxWidth < finalWidth) {\n              finalWidth = Math.min(maxWidth, remainedWidth);\n            }\n            // `minWidth` has higher priority. `minWidth` decide that whether the\n            // bar is able to be visible. So `minWidth` should not be restricted\n            // by `maxWidth` or `remainedWidth` (which is from `bandWidth`). In\n            // the extreme cases for `value` axis, bars are allowed to overlap\n            // with each other if `minWidth` specified.\n            if (minWidth && minWidth > finalWidth) {\n              finalWidth = minWidth;\n            }\n            if (finalWidth !== autoWidth) {\n              column.width = finalWidth;\n              remainedWidth -= finalWidth + barGapPercent * finalWidth;\n              autoWidthCount--;\n            }\n          } else {\n            // `barMinWidth/barMaxWidth` has higher priority than `barWidth`, as\n            // CSS does. Because barWidth can be a percent value, where\n            // `barMaxWidth` can be used to restrict the final width.\n            var finalWidth = column.width;\n            if (maxWidth) {\n              finalWidth = Math.min(finalWidth, maxWidth);\n            }\n            // `minWidth` has higher priority, as described above\n            if (minWidth) {\n              finalWidth = Math.max(finalWidth, minWidth);\n            }\n            column.width = finalWidth;\n            remainedWidth -= finalWidth + barGapPercent * finalWidth;\n            autoWidthCount--;\n          }\n        });\n        // Recalculate width again\n        autoWidth = (remainedWidth - categoryGap) / (autoWidthCount + (autoWidthCount - 1) * barGapPercent);\n        autoWidth = Math.max(autoWidth, 0);\n        var widthSum = 0;\n        var lastColumn;\n        each(stacks, function (column, idx) {\n          if (!column.width) {\n            column.width = autoWidth;\n          }\n          lastColumn = column;\n          widthSum += column.width * (1 + barGapPercent);\n        });\n        if (lastColumn) {\n          widthSum -= lastColumn.width * barGapPercent;\n        }\n        var offset = -widthSum / 2;\n        each(stacks, function (column, stackId) {\n          result[coordSysName][stackId] = result[coordSysName][stackId] || {\n            bandWidth: bandWidth,\n            offset: offset,\n            width: column.width\n          };\n          offset += column.width * (1 + barGapPercent);\n        });\n      });\n      return result;\n    }\n    function retrieveColumnLayout(barWidthAndOffset, axis, seriesModel) {\n      if (barWidthAndOffset && axis) {\n        var result = barWidthAndOffset[getAxisKey(axis)];\n        if (result != null && seriesModel != null) {\n          return result[getSeriesStackId(seriesModel)];\n        }\n        return result;\n      }\n    }\n    function layout(seriesType, ecModel) {\n      var seriesModels = prepareLayoutBarSeries(seriesType, ecModel);\n      var barWidthAndOffset = makeColumnLayout(seriesModels);\n      each(seriesModels, function (seriesModel) {\n        var data = seriesModel.getData();\n        var cartesian = seriesModel.coordinateSystem;\n        var baseAxis = cartesian.getBaseAxis();\n        var stackId = getSeriesStackId(seriesModel);\n        var columnLayoutInfo = barWidthAndOffset[getAxisKey(baseAxis)][stackId];\n        var columnOffset = columnLayoutInfo.offset;\n        var columnWidth = columnLayoutInfo.width;\n        data.setLayout({\n          bandWidth: columnLayoutInfo.bandWidth,\n          offset: columnOffset,\n          size: columnWidth\n        });\n      });\n    }\n    // TODO: Do not support stack in large mode yet.\n    function createProgressiveLayout(seriesType) {\n      return {\n        seriesType: seriesType,\n        plan: createRenderPlanner(),\n        reset: function (seriesModel) {\n          if (!isOnCartesian(seriesModel)) {\n            return;\n          }\n          var data = seriesModel.getData();\n          var cartesian = seriesModel.coordinateSystem;\n          var baseAxis = cartesian.getBaseAxis();\n          var valueAxis = cartesian.getOtherAxis(baseAxis);\n          var valueDimIdx = data.getDimensionIndex(data.mapDimension(valueAxis.dim));\n          var baseDimIdx = data.getDimensionIndex(data.mapDimension(baseAxis.dim));\n          var drawBackground = seriesModel.get('showBackground', true);\n          var valueDim = data.mapDimension(valueAxis.dim);\n          var stackResultDim = data.getCalculationInfo('stackResultDimension');\n          var stacked = isDimensionStacked(data, valueDim) && !!data.getCalculationInfo('stackedOnSeries');\n          var isValueAxisH = valueAxis.isHorizontal();\n          var valueAxisStart = getValueAxisStart(baseAxis, valueAxis);\n          var isLarge = isInLargeMode(seriesModel);\n          var barMinHeight = seriesModel.get('barMinHeight') || 0;\n          var stackedDimIdx = stackResultDim && data.getDimensionIndex(stackResultDim);\n          // Layout info.\n          var columnWidth = data.getLayout('size');\n          var columnOffset = data.getLayout('offset');\n          return {\n            progress: function (params, data) {\n              var count = params.count;\n              var largePoints = isLarge && createFloat32Array(count * 3);\n              var largeBackgroundPoints = isLarge && drawBackground && createFloat32Array(count * 3);\n              var largeDataIndices = isLarge && createFloat32Array(count);\n              var coordLayout = cartesian.master.getRect();\n              var bgSize = isValueAxisH ? coordLayout.width : coordLayout.height;\n              var dataIndex;\n              var store = data.getStore();\n              var idxOffset = 0;\n              while ((dataIndex = params.next()) != null) {\n                var value = store.get(stacked ? stackedDimIdx : valueDimIdx, dataIndex);\n                var baseValue = store.get(baseDimIdx, dataIndex);\n                var baseCoord = valueAxisStart;\n                var stackStartValue = void 0;\n                // Because of the barMinHeight, we can not use the value in\n                // stackResultDimension directly.\n                if (stacked) {\n                  stackStartValue = +value - store.get(valueDimIdx, dataIndex);\n                }\n                var x = void 0;\n                var y = void 0;\n                var width = void 0;\n                var height = void 0;\n                if (isValueAxisH) {\n                  var coord = cartesian.dataToPoint([value, baseValue]);\n                  if (stacked) {\n                    var startCoord = cartesian.dataToPoint([stackStartValue, baseValue]);\n                    baseCoord = startCoord[0];\n                  }\n                  x = baseCoord;\n                  y = coord[1] + columnOffset;\n                  width = coord[0] - baseCoord;\n                  height = columnWidth;\n                  if (Math.abs(width) < barMinHeight) {\n                    width = (width < 0 ? -1 : 1) * barMinHeight;\n                  }\n                } else {\n                  var coord = cartesian.dataToPoint([baseValue, value]);\n                  if (stacked) {\n                    var startCoord = cartesian.dataToPoint([baseValue, stackStartValue]);\n                    baseCoord = startCoord[1];\n                  }\n                  x = coord[0] + columnOffset;\n                  y = baseCoord;\n                  width = columnWidth;\n                  height = coord[1] - baseCoord;\n                  if (Math.abs(height) < barMinHeight) {\n                    // Include zero to has a positive bar\n                    height = (height <= 0 ? -1 : 1) * barMinHeight;\n                  }\n                }\n                if (!isLarge) {\n                  data.setItemLayout(dataIndex, {\n                    x: x,\n                    y: y,\n                    width: width,\n                    height: height\n                  });\n                } else {\n                  largePoints[idxOffset] = x;\n                  largePoints[idxOffset + 1] = y;\n                  largePoints[idxOffset + 2] = isValueAxisH ? width : height;\n                  if (largeBackgroundPoints) {\n                    largeBackgroundPoints[idxOffset] = isValueAxisH ? coordLayout.x : x;\n                    largeBackgroundPoints[idxOffset + 1] = isValueAxisH ? y : coordLayout.y;\n                    largeBackgroundPoints[idxOffset + 2] = bgSize;\n                  }\n                  largeDataIndices[dataIndex] = dataIndex;\n                }\n                idxOffset += 3;\n              }\n              if (isLarge) {\n                data.setLayout({\n                  largePoints: largePoints,\n                  largeDataIndices: largeDataIndices,\n                  largeBackgroundPoints: largeBackgroundPoints,\n                  valueAxisHorizontal: isValueAxisH\n                });\n              }\n            }\n          };\n        }\n      };\n    }\n    function isOnCartesian(seriesModel) {\n      return seriesModel.coordinateSystem && seriesModel.coordinateSystem.type === 'cartesian2d';\n    }\n    function isInLargeMode(seriesModel) {\n      return seriesModel.pipelineContext && seriesModel.pipelineContext.large;\n    }\n    // See cases in `test/bar-start.html` and `#7412`, `#8747`.\n    function getValueAxisStart(baseAxis, valueAxis) {\n      var startValue = valueAxis.model.get('startValue');\n      if (!startValue) {\n        startValue = 0;\n      }\n      return valueAxis.toGlobalCoord(valueAxis.dataToCoord(valueAxis.type === 'log' ? startValue > 0 ? startValue : 1 : startValue));\n    }\n\n    // FIXME 公用？\n    var bisect = function (a, x, lo, hi) {\n      while (lo < hi) {\n        var mid = lo + hi >>> 1;\n        if (a[mid][1] < x) {\n          lo = mid + 1;\n        } else {\n          hi = mid;\n        }\n      }\n      return lo;\n    };\n    var TimeScale = /** @class */function (_super) {\n      __extends(TimeScale, _super);\n      function TimeScale(settings) {\n        var _this = _super.call(this, settings) || this;\n        _this.type = 'time';\n        return _this;\n      }\n      /**\r\n       * Get label is mainly for other components like dataZoom, tooltip.\r\n       */\n      TimeScale.prototype.getLabel = function (tick) {\n        var useUTC = this.getSetting('useUTC');\n        return format(tick.value, fullLeveledFormatter[getDefaultFormatPrecisionOfInterval(getPrimaryTimeUnit(this._minLevelUnit))] || fullLeveledFormatter.second, useUTC, this.getSetting('locale'));\n      };\n      TimeScale.prototype.getFormattedLabel = function (tick, idx, labelFormatter) {\n        var isUTC = this.getSetting('useUTC');\n        var lang = this.getSetting('locale');\n        return leveledFormat(tick, idx, labelFormatter, lang, isUTC);\n      };\n      /**\r\n       * @override\r\n       */\n      TimeScale.prototype.getTicks = function () {\n        var interval = this._interval;\n        var extent = this._extent;\n        var ticks = [];\n        // If interval is 0, return [];\n        if (!interval) {\n          return ticks;\n        }\n        ticks.push({\n          value: extent[0],\n          level: 0\n        });\n        var useUTC = this.getSetting('useUTC');\n        var innerTicks = getIntervalTicks(this._minLevelUnit, this._approxInterval, useUTC, extent);\n        ticks = ticks.concat(innerTicks);\n        ticks.push({\n          value: extent[1],\n          level: 0\n        });\n        return ticks;\n      };\n      TimeScale.prototype.calcNiceExtent = function (opt) {\n        var extent = this._extent;\n        // If extent start and end are same, expand them\n        if (extent[0] === extent[1]) {\n          // Expand extent\n          extent[0] -= ONE_DAY;\n          extent[1] += ONE_DAY;\n        }\n        // If there are no data and extent are [Infinity, -Infinity]\n        if (extent[1] === -Infinity && extent[0] === Infinity) {\n          var d = new Date();\n          extent[1] = +new Date(d.getFullYear(), d.getMonth(), d.getDate());\n          extent[0] = extent[1] - ONE_DAY;\n        }\n        this.calcNiceTicks(opt.splitNumber, opt.minInterval, opt.maxInterval);\n      };\n      TimeScale.prototype.calcNiceTicks = function (approxTickNum, minInterval, maxInterval) {\n        approxTickNum = approxTickNum || 10;\n        var extent = this._extent;\n        var span = extent[1] - extent[0];\n        this._approxInterval = span / approxTickNum;\n        if (minInterval != null && this._approxInterval < minInterval) {\n          this._approxInterval = minInterval;\n        }\n        if (maxInterval != null && this._approxInterval > maxInterval) {\n          this._approxInterval = maxInterval;\n        }\n        var scaleIntervalsLen = scaleIntervals.length;\n        var idx = Math.min(bisect(scaleIntervals, this._approxInterval, 0, scaleIntervalsLen), scaleIntervalsLen - 1);\n        // Interval that can be used to calculate ticks\n        this._interval = scaleIntervals[idx][1];\n        // Min level used when picking ticks from top down.\n        // We check one more level to avoid the ticks are to sparse in some case.\n        this._minLevelUnit = scaleIntervals[Math.max(idx - 1, 0)][0];\n      };\n      TimeScale.prototype.parse = function (val) {\n        // val might be float.\n        return isNumber(val) ? val : +parseDate(val);\n      };\n      TimeScale.prototype.contain = function (val) {\n        return contain$1(this.parse(val), this._extent);\n      };\n      TimeScale.prototype.normalize = function (val) {\n        return normalize$1(this.parse(val), this._extent);\n      };\n      TimeScale.prototype.scale = function (val) {\n        return scale$2(val, this._extent);\n      };\n      TimeScale.type = 'time';\n      return TimeScale;\n    }(IntervalScale);\n    /**\r\n     * This implementation was originally copied from \"d3.js\"\r\n     * <https://github.com/d3/d3/blob/b516d77fb8566b576088e73410437494717ada26/src/time/scale.js>\r\n     * with some modifications made for this program.\r\n     * See the license statement at the head of this file.\r\n     */\n    var scaleIntervals = [\n    // Format                           interval\n    ['second', ONE_SECOND], ['minute', ONE_MINUTE], ['hour', ONE_HOUR], ['quarter-day', ONE_HOUR * 6], ['half-day', ONE_HOUR * 12], ['day', ONE_DAY * 1.2], ['half-week', ONE_DAY * 3.5], ['week', ONE_DAY * 7], ['month', ONE_DAY * 31], ['quarter', ONE_DAY * 95], ['half-year', ONE_YEAR / 2], ['year', ONE_YEAR] // 1Y\n    ];\n    function isUnitValueSame(unit, valueA, valueB, isUTC) {\n      var dateA = parseDate(valueA);\n      var dateB = parseDate(valueB);\n      var isSame = function (unit) {\n        return getUnitValue(dateA, unit, isUTC) === getUnitValue(dateB, unit, isUTC);\n      };\n      var isSameYear = function () {\n        return isSame('year');\n      };\n      // const isSameHalfYear = () => isSameYear() && isSame('half-year');\n      // const isSameQuater = () => isSameYear() && isSame('quarter');\n      var isSameMonth = function () {\n        return isSameYear() && isSame('month');\n      };\n      var isSameDay = function () {\n        return isSameMonth() && isSame('day');\n      };\n      // const isSameHalfDay = () => isSameDay() && isSame('half-day');\n      var isSameHour = function () {\n        return isSameDay() && isSame('hour');\n      };\n      var isSameMinute = function () {\n        return isSameHour() && isSame('minute');\n      };\n      var isSameSecond = function () {\n        return isSameMinute() && isSame('second');\n      };\n      var isSameMilliSecond = function () {\n        return isSameSecond() && isSame('millisecond');\n      };\n      switch (unit) {\n        case 'year':\n          return isSameYear();\n        case 'month':\n          return isSameMonth();\n        case 'day':\n          return isSameDay();\n        case 'hour':\n          return isSameHour();\n        case 'minute':\n          return isSameMinute();\n        case 'second':\n          return isSameSecond();\n        case 'millisecond':\n          return isSameMilliSecond();\n      }\n    }\n    // const primaryUnitGetters = {\n    //     year: fullYearGetterName(),\n    //     month: monthGetterName(),\n    //     day: dateGetterName(),\n    //     hour: hoursGetterName(),\n    //     minute: minutesGetterName(),\n    //     second: secondsGetterName(),\n    //     millisecond: millisecondsGetterName()\n    // };\n    // const primaryUnitUTCGetters = {\n    //     year: fullYearGetterName(true),\n    //     month: monthGetterName(true),\n    //     day: dateGetterName(true),\n    //     hour: hoursGetterName(true),\n    //     minute: minutesGetterName(true),\n    //     second: secondsGetterName(true),\n    //     millisecond: millisecondsGetterName(true)\n    // };\n    // function moveTick(date: Date, unitName: TimeUnit, step: number, isUTC: boolean) {\n    //     step = step || 1;\n    //     switch (getPrimaryTimeUnit(unitName)) {\n    //         case 'year':\n    //             date[fullYearSetterName(isUTC)](date[fullYearGetterName(isUTC)]() + step);\n    //             break;\n    //         case 'month':\n    //             date[monthSetterName(isUTC)](date[monthGetterName(isUTC)]() + step);\n    //             break;\n    //         case 'day':\n    //             date[dateSetterName(isUTC)](date[dateGetterName(isUTC)]() + step);\n    //             break;\n    //         case 'hour':\n    //             date[hoursSetterName(isUTC)](date[hoursGetterName(isUTC)]() + step);\n    //             break;\n    //         case 'minute':\n    //             date[minutesSetterName(isUTC)](date[minutesGetterName(isUTC)]() + step);\n    //             break;\n    //         case 'second':\n    //             date[secondsSetterName(isUTC)](date[secondsGetterName(isUTC)]() + step);\n    //             break;\n    //         case 'millisecond':\n    //             date[millisecondsSetterName(isUTC)](date[millisecondsGetterName(isUTC)]() + step);\n    //             break;\n    //     }\n    //     return date.getTime();\n    // }\n    // const DATE_INTERVALS = [[8, 7.5], [4, 3.5], [2, 1.5]];\n    // const MONTH_INTERVALS = [[6, 5.5], [3, 2.5], [2, 1.5]];\n    // const MINUTES_SECONDS_INTERVALS = [[30, 30], [20, 20], [15, 15], [10, 10], [5, 5], [2, 2]];\n    function getDateInterval(approxInterval, daysInMonth) {\n      approxInterval /= ONE_DAY;\n      return approxInterval > 16 ? 16\n      // Math.floor(daysInMonth / 2) + 1  // In this case we only want one tick between two months.\n      : approxInterval > 7.5 ? 7 // TODO week 7 or day 8?\n      : approxInterval > 3.5 ? 4 : approxInterval > 1.5 ? 2 : 1;\n    }\n    function getMonthInterval(approxInterval) {\n      var APPROX_ONE_MONTH = 30 * ONE_DAY;\n      approxInterval /= APPROX_ONE_MONTH;\n      return approxInterval > 6 ? 6 : approxInterval > 3 ? 3 : approxInterval > 2 ? 2 : 1;\n    }\n    function getHourInterval(approxInterval) {\n      approxInterval /= ONE_HOUR;\n      return approxInterval > 12 ? 12 : approxInterval > 6 ? 6 : approxInterval > 3.5 ? 4 : approxInterval > 2 ? 2 : 1;\n    }\n    function getMinutesAndSecondsInterval(approxInterval, isMinutes) {\n      approxInterval /= isMinutes ? ONE_MINUTE : ONE_SECOND;\n      return approxInterval > 30 ? 30 : approxInterval > 20 ? 20 : approxInterval > 15 ? 15 : approxInterval > 10 ? 10 : approxInterval > 5 ? 5 : approxInterval > 2 ? 2 : 1;\n    }\n    function getMillisecondsInterval(approxInterval) {\n      return nice(approxInterval, true);\n    }\n    function getFirstTimestampOfUnit(date, unitName, isUTC) {\n      var outDate = new Date(date);\n      switch (getPrimaryTimeUnit(unitName)) {\n        case 'year':\n        case 'month':\n          outDate[monthSetterName(isUTC)](0);\n        case 'day':\n          outDate[dateSetterName(isUTC)](1);\n        case 'hour':\n          outDate[hoursSetterName(isUTC)](0);\n        case 'minute':\n          outDate[minutesSetterName(isUTC)](0);\n        case 'second':\n          outDate[secondsSetterName(isUTC)](0);\n          outDate[millisecondsSetterName(isUTC)](0);\n      }\n      return outDate.getTime();\n    }\n    function getIntervalTicks(bottomUnitName, approxInterval, isUTC, extent) {\n      var safeLimit = 10000;\n      var unitNames = timeUnits;\n      var iter = 0;\n      function addTicksInSpan(interval, minTimestamp, maxTimestamp, getMethodName, setMethodName, isDate, out) {\n        var date = new Date(minTimestamp);\n        var dateTime = minTimestamp;\n        var d = date[getMethodName]();\n        // if (isDate) {\n        //     d -= 1; // Starts with 0;   PENDING\n        // }\n        while (dateTime < maxTimestamp && dateTime <= extent[1]) {\n          out.push({\n            value: dateTime\n          });\n          d += interval;\n          date[setMethodName](d);\n          dateTime = date.getTime();\n        }\n        // This extra tick is for calcuating ticks of next level. Will not been added to the final result\n        out.push({\n          value: dateTime,\n          notAdd: true\n        });\n      }\n      function addLevelTicks(unitName, lastLevelTicks, levelTicks) {\n        var newAddedTicks = [];\n        var isFirstLevel = !lastLevelTicks.length;\n        if (isUnitValueSame(getPrimaryTimeUnit(unitName), extent[0], extent[1], isUTC)) {\n          return;\n        }\n        if (isFirstLevel) {\n          lastLevelTicks = [{\n            // TODO Optimize. Not include so may ticks.\n            value: getFirstTimestampOfUnit(new Date(extent[0]), unitName, isUTC)\n          }, {\n            value: extent[1]\n          }];\n        }\n        for (var i = 0; i < lastLevelTicks.length - 1; i++) {\n          var startTick = lastLevelTicks[i].value;\n          var endTick = lastLevelTicks[i + 1].value;\n          if (startTick === endTick) {\n            continue;\n          }\n          var interval = void 0;\n          var getterName = void 0;\n          var setterName = void 0;\n          var isDate = false;\n          switch (unitName) {\n            case 'year':\n              interval = Math.max(1, Math.round(approxInterval / ONE_DAY / 365));\n              getterName = fullYearGetterName(isUTC);\n              setterName = fullYearSetterName(isUTC);\n              break;\n            case 'half-year':\n            case 'quarter':\n            case 'month':\n              interval = getMonthInterval(approxInterval);\n              getterName = monthGetterName(isUTC);\n              setterName = monthSetterName(isUTC);\n              break;\n            case 'week': // PENDING If week is added. Ignore day.\n            case 'half-week':\n            case 'day':\n              interval = getDateInterval(approxInterval); // Use 32 days and let interval been 16\n              getterName = dateGetterName(isUTC);\n              setterName = dateSetterName(isUTC);\n              isDate = true;\n              break;\n            case 'half-day':\n            case 'quarter-day':\n            case 'hour':\n              interval = getHourInterval(approxInterval);\n              getterName = hoursGetterName(isUTC);\n              setterName = hoursSetterName(isUTC);\n              break;\n            case 'minute':\n              interval = getMinutesAndSecondsInterval(approxInterval, true);\n              getterName = minutesGetterName(isUTC);\n              setterName = minutesSetterName(isUTC);\n              break;\n            case 'second':\n              interval = getMinutesAndSecondsInterval(approxInterval, false);\n              getterName = secondsGetterName(isUTC);\n              setterName = secondsSetterName(isUTC);\n              break;\n            case 'millisecond':\n              interval = getMillisecondsInterval(approxInterval);\n              getterName = millisecondsGetterName(isUTC);\n              setterName = millisecondsSetterName(isUTC);\n              break;\n          }\n          addTicksInSpan(interval, startTick, endTick, getterName, setterName, isDate, newAddedTicks);\n          if (unitName === 'year' && levelTicks.length > 1 && i === 0) {\n            // Add nearest years to the left extent.\n            levelTicks.unshift({\n              value: levelTicks[0].value - interval\n            });\n          }\n        }\n        for (var i = 0; i < newAddedTicks.length; i++) {\n          levelTicks.push(newAddedTicks[i]);\n        }\n        // newAddedTicks.length && console.log(unitName, newAddedTicks);\n        return newAddedTicks;\n      }\n      var levelsTicks = [];\n      var currentLevelTicks = [];\n      var tickCount = 0;\n      var lastLevelTickCount = 0;\n      for (var i = 0; i < unitNames.length && iter++ < safeLimit; ++i) {\n        var primaryTimeUnit = getPrimaryTimeUnit(unitNames[i]);\n        if (!isPrimaryTimeUnit(unitNames[i])) {\n          // TODO\n          continue;\n        }\n        addLevelTicks(unitNames[i], levelsTicks[levelsTicks.length - 1] || [], currentLevelTicks);\n        var nextPrimaryTimeUnit = unitNames[i + 1] ? getPrimaryTimeUnit(unitNames[i + 1]) : null;\n        if (primaryTimeUnit !== nextPrimaryTimeUnit) {\n          if (currentLevelTicks.length) {\n            lastLevelTickCount = tickCount;\n            // Remove the duplicate so the tick count can be precisely.\n            currentLevelTicks.sort(function (a, b) {\n              return a.value - b.value;\n            });\n            var levelTicksRemoveDuplicated = [];\n            for (var i_1 = 0; i_1 < currentLevelTicks.length; ++i_1) {\n              var tickValue = currentLevelTicks[i_1].value;\n              if (i_1 === 0 || currentLevelTicks[i_1 - 1].value !== tickValue) {\n                levelTicksRemoveDuplicated.push(currentLevelTicks[i_1]);\n                if (tickValue >= extent[0] && tickValue <= extent[1]) {\n                  tickCount++;\n                }\n              }\n            }\n            var targetTickNum = (extent[1] - extent[0]) / approxInterval;\n            // Added too much in this level and not too less in last level\n            if (tickCount > targetTickNum * 1.5 && lastLevelTickCount > targetTickNum / 1.5) {\n              break;\n            }\n            // Only treat primary time unit as one level.\n            levelsTicks.push(levelTicksRemoveDuplicated);\n            if (tickCount > targetTickNum || bottomUnitName === unitNames[i]) {\n              break;\n            }\n          }\n          // Reset if next unitName is primary\n          currentLevelTicks = [];\n        }\n      }\n      if (\"development\" !== 'production') {\n        if (iter >= safeLimit) {\n          warn('Exceed safe limit.');\n        }\n      }\n      var levelsTicksInExtent = filter(map(levelsTicks, function (levelTicks) {\n        return filter(levelTicks, function (tick) {\n          return tick.value >= extent[0] && tick.value <= extent[1] && !tick.notAdd;\n        });\n      }), function (levelTicks) {\n        return levelTicks.length > 0;\n      });\n      var ticks = [];\n      var maxLevel = levelsTicksInExtent.length - 1;\n      for (var i = 0; i < levelsTicksInExtent.length; ++i) {\n        var levelTicks = levelsTicksInExtent[i];\n        for (var k = 0; k < levelTicks.length; ++k) {\n          ticks.push({\n            value: levelTicks[k].value,\n            level: maxLevel - i\n          });\n        }\n      }\n      ticks.sort(function (a, b) {\n        return a.value - b.value;\n      });\n      // Remove duplicates\n      var result = [];\n      for (var i = 0; i < ticks.length; ++i) {\n        if (i === 0 || ticks[i].value !== ticks[i - 1].value) {\n          result.push(ticks[i]);\n        }\n      }\n      return result;\n    }\n    Scale.registerClass(TimeScale);\n\n    var scaleProto = Scale.prototype;\n    // FIXME:TS refactor: not good to call it directly with `this`?\n    var intervalScaleProto = IntervalScale.prototype;\n    var roundingErrorFix = round;\n    var mathFloor = Math.floor;\n    var mathCeil = Math.ceil;\n    var mathPow$1 = Math.pow;\n    var mathLog = Math.log;\n    var LogScale = /** @class */function (_super) {\n      __extends(LogScale, _super);\n      function LogScale() {\n        var _this = _super !== null && _super.apply(this, arguments) || this;\n        _this.type = 'log';\n        _this.base = 10;\n        _this._originalScale = new IntervalScale();\n        // FIXME:TS actually used by `IntervalScale`\n        _this._interval = 0;\n        return _this;\n      }\n      /**\r\n       * @param Whether expand the ticks to niced extent.\r\n       */\n      LogScale.prototype.getTicks = function (expandToNicedExtent) {\n        var originalScale = this._originalScale;\n        var extent = this._extent;\n        var originalExtent = originalScale.getExtent();\n        var ticks = intervalScaleProto.getTicks.call(this, expandToNicedExtent);\n        return map(ticks, function (tick) {\n          var val = tick.value;\n          var powVal = round(mathPow$1(this.base, val));\n          // Fix #4158\n          powVal = val === extent[0] && this._fixMin ? fixRoundingError(powVal, originalExtent[0]) : powVal;\n          powVal = val === extent[1] && this._fixMax ? fixRoundingError(powVal, originalExtent[1]) : powVal;\n          return {\n            value: powVal\n          };\n        }, this);\n      };\n      LogScale.prototype.setExtent = function (start, end) {\n        var base = mathLog(this.base);\n        // log(-Infinity) is NaN, so safe guard here\n        start = mathLog(Math.max(0, start)) / base;\n        end = mathLog(Math.max(0, end)) / base;\n        intervalScaleProto.setExtent.call(this, start, end);\n      };\n      /**\r\n       * @return {number} end\r\n       */\n      LogScale.prototype.getExtent = function () {\n        var base = this.base;\n        var extent = scaleProto.getExtent.call(this);\n        extent[0] = mathPow$1(base, extent[0]);\n        extent[1] = mathPow$1(base, extent[1]);\n        // Fix #4158\n        var originalScale = this._originalScale;\n        var originalExtent = originalScale.getExtent();\n        this._fixMin && (extent[0] = fixRoundingError(extent[0], originalExtent[0]));\n        this._fixMax && (extent[1] = fixRoundingError(extent[1], originalExtent[1]));\n        return extent;\n      };\n      LogScale.prototype.unionExtent = function (extent) {\n        this._originalScale.unionExtent(extent);\n        var base = this.base;\n        extent[0] = mathLog(extent[0]) / mathLog(base);\n        extent[1] = mathLog(extent[1]) / mathLog(base);\n        scaleProto.unionExtent.call(this, extent);\n      };\n      LogScale.prototype.unionExtentFromData = function (data, dim) {\n        // TODO\n        // filter value that <= 0\n        this.unionExtent(data.getApproximateExtent(dim));\n      };\n      /**\r\n       * Update interval and extent of intervals for nice ticks\r\n       * @param approxTickNum default 10 Given approx tick number\r\n       */\n      LogScale.prototype.calcNiceTicks = function (approxTickNum) {\n        approxTickNum = approxTickNum || 10;\n        var extent = this._extent;\n        var span = extent[1] - extent[0];\n        if (span === Infinity || span <= 0) {\n          return;\n        }\n        var interval = quantity(span);\n        var err = approxTickNum / span * interval;\n        // Filter ticks to get closer to the desired count.\n        if (err <= 0.5) {\n          interval *= 10;\n        }\n        // Interval should be integer\n        while (!isNaN(interval) && Math.abs(interval) < 1 && Math.abs(interval) > 0) {\n          interval *= 10;\n        }\n        var niceExtent = [round(mathCeil(extent[0] / interval) * interval), round(mathFloor(extent[1] / interval) * interval)];\n        this._interval = interval;\n        this._niceExtent = niceExtent;\n      };\n      LogScale.prototype.calcNiceExtent = function (opt) {\n        intervalScaleProto.calcNiceExtent.call(this, opt);\n        this._fixMin = opt.fixMin;\n        this._fixMax = opt.fixMax;\n      };\n      LogScale.prototype.parse = function (val) {\n        return val;\n      };\n      LogScale.prototype.contain = function (val) {\n        val = mathLog(val) / mathLog(this.base);\n        return contain$1(val, this._extent);\n      };\n      LogScale.prototype.normalize = function (val) {\n        val = mathLog(val) / mathLog(this.base);\n        return normalize$1(val, this._extent);\n      };\n      LogScale.prototype.scale = function (val) {\n        val = scale$2(val, this._extent);\n        return mathPow$1(this.base, val);\n      };\n      LogScale.type = 'log';\n      return LogScale;\n    }(Scale);\n    var proto = LogScale.prototype;\n    proto.getMinorTicks = intervalScaleProto.getMinorTicks;\n    proto.getLabel = intervalScaleProto.getLabel;\n    function fixRoundingError(val, originalVal) {\n      return roundingErrorFix(val, getPrecision(originalVal));\n    }\n    Scale.registerClass(LogScale);\n\n    var ScaleRawExtentInfo = /** @class */function () {\n      function ScaleRawExtentInfo(scale, model,\n      // Usually: data extent from all series on this axis.\n      originalExtent) {\n        this._prepareParams(scale, model, originalExtent);\n      }\n      /**\r\n       * Parameters depending on outside (like model, user callback)\r\n       * are prepared and fixed here.\r\n       */\n      ScaleRawExtentInfo.prototype._prepareParams = function (scale, model,\n      // Usually: data extent from all series on this axis.\n      dataExtent) {\n        if (dataExtent[1] < dataExtent[0]) {\n          dataExtent = [NaN, NaN];\n        }\n        this._dataMin = dataExtent[0];\n        this._dataMax = dataExtent[1];\n        var isOrdinal = this._isOrdinal = scale.type === 'ordinal';\n        this._needCrossZero = scale.type === 'interval' && model.getNeedCrossZero && model.getNeedCrossZero();\n        var axisMinValue = model.get('min', true);\n        if (axisMinValue == null) {\n          axisMinValue = model.get('startValue', true);\n        }\n        var modelMinRaw = this._modelMinRaw = axisMinValue;\n        if (isFunction(modelMinRaw)) {\n          // This callback always provides users the full data extent (before data is filtered).\n          this._modelMinNum = parseAxisModelMinMax(scale, modelMinRaw({\n            min: dataExtent[0],\n            max: dataExtent[1]\n          }));\n        } else if (modelMinRaw !== 'dataMin') {\n          this._modelMinNum = parseAxisModelMinMax(scale, modelMinRaw);\n        }\n        var modelMaxRaw = this._modelMaxRaw = model.get('max', true);\n        if (isFunction(modelMaxRaw)) {\n          // This callback always provides users the full data extent (before data is filtered).\n          this._modelMaxNum = parseAxisModelMinMax(scale, modelMaxRaw({\n            min: dataExtent[0],\n            max: dataExtent[1]\n          }));\n        } else if (modelMaxRaw !== 'dataMax') {\n          this._modelMaxNum = parseAxisModelMinMax(scale, modelMaxRaw);\n        }\n        if (isOrdinal) {\n          // FIXME: there is a flaw here: if there is no \"block\" data processor like `dataZoom`,\n          // and progressive rendering is using, here the category result might just only contain\n          // the processed chunk rather than the entire result.\n          this._axisDataLen = model.getCategories().length;\n        } else {\n          var boundaryGap = model.get('boundaryGap');\n          var boundaryGapArr = isArray(boundaryGap) ? boundaryGap : [boundaryGap || 0, boundaryGap || 0];\n          if (typeof boundaryGapArr[0] === 'boolean' || typeof boundaryGapArr[1] === 'boolean') {\n            if (\"development\" !== 'production') {\n              console.warn('Boolean type for boundaryGap is only ' + 'allowed for ordinal axis. Please use string in ' + 'percentage instead, e.g., \"20%\". Currently, ' + 'boundaryGap is set to be 0.');\n            }\n            this._boundaryGapInner = [0, 0];\n          } else {\n            this._boundaryGapInner = [parsePercent(boundaryGapArr[0], 1), parsePercent(boundaryGapArr[1], 1)];\n          }\n        }\n      };\n      /**\r\n       * Calculate extent by prepared parameters.\r\n       * This method has no external dependency and can be called duplicatedly,\r\n       * getting the same result.\r\n       * If parameters changed, should call this method to recalcuate.\r\n       */\n      ScaleRawExtentInfo.prototype.calculate = function () {\n        // Notice: When min/max is not set (that is, when there are null/undefined,\n        // which is the most common case), these cases should be ensured:\n        // (1) For 'ordinal', show all axis.data.\n        // (2) For others:\n        //      + `boundaryGap` is applied (if min/max set, boundaryGap is\n        //      disabled).\n        //      + If `needCrossZero`, min/max should be zero, otherwise, min/max should\n        //      be the result that originalExtent enlarged by boundaryGap.\n        // (3) If no data, it should be ensured that `scale.setBlank` is set.\n        var isOrdinal = this._isOrdinal;\n        var dataMin = this._dataMin;\n        var dataMax = this._dataMax;\n        var axisDataLen = this._axisDataLen;\n        var boundaryGapInner = this._boundaryGapInner;\n        var span = !isOrdinal ? dataMax - dataMin || Math.abs(dataMin) : null;\n        // Currently if a `'value'` axis model min is specified as 'dataMin'/'dataMax',\n        // `boundaryGap` will not be used. It's the different from specifying as `null`/`undefined`.\n        var min = this._modelMinRaw === 'dataMin' ? dataMin : this._modelMinNum;\n        var max = this._modelMaxRaw === 'dataMax' ? dataMax : this._modelMaxNum;\n        // If `_modelMinNum`/`_modelMaxNum` is `null`/`undefined`, should not be fixed.\n        var minFixed = min != null;\n        var maxFixed = max != null;\n        if (min == null) {\n          min = isOrdinal ? axisDataLen ? 0 : NaN : dataMin - boundaryGapInner[0] * span;\n        }\n        if (max == null) {\n          max = isOrdinal ? axisDataLen ? axisDataLen - 1 : NaN : dataMax + boundaryGapInner[1] * span;\n        }\n        (min == null || !isFinite(min)) && (min = NaN);\n        (max == null || !isFinite(max)) && (max = NaN);\n        var isBlank = eqNaN(min) || eqNaN(max) || isOrdinal && !axisDataLen;\n        // If data extent modified, need to recalculated to ensure cross zero.\n        if (this._needCrossZero) {\n          // Axis is over zero and min is not set\n          if (min > 0 && max > 0 && !minFixed) {\n            min = 0;\n            // minFixed = true;\n          }\n          // Axis is under zero and max is not set\n          if (min < 0 && max < 0 && !maxFixed) {\n            max = 0;\n            // maxFixed = true;\n          }\n          // PENDING:\n          // When `needCrossZero` and all data is positive/negative, should it be ensured\n          // that the results processed by boundaryGap are positive/negative?\n          // If so, here `minFixed`/`maxFixed` need to be set.\n        }\n        var determinedMin = this._determinedMin;\n        var determinedMax = this._determinedMax;\n        if (determinedMin != null) {\n          min = determinedMin;\n          minFixed = true;\n        }\n        if (determinedMax != null) {\n          max = determinedMax;\n          maxFixed = true;\n        }\n        // Ensure min/max be finite number or NaN here. (not to be null/undefined)\n        // `NaN` means min/max axis is blank.\n        return {\n          min: min,\n          max: max,\n          minFixed: minFixed,\n          maxFixed: maxFixed,\n          isBlank: isBlank\n        };\n      };\n      ScaleRawExtentInfo.prototype.modifyDataMinMax = function (minMaxName, val) {\n        if (\"development\" !== 'production') {\n          assert(!this.frozen);\n        }\n        this[DATA_MIN_MAX_ATTR[minMaxName]] = val;\n      };\n      ScaleRawExtentInfo.prototype.setDeterminedMinMax = function (minMaxName, val) {\n        var attr = DETERMINED_MIN_MAX_ATTR[minMaxName];\n        if (\"development\" !== 'production') {\n          assert(!this.frozen\n          // Earse them usually means logic flaw.\n          && this[attr] == null);\n        }\n        this[attr] = val;\n      };\n      ScaleRawExtentInfo.prototype.freeze = function () {\n        // @ts-ignore\n        this.frozen = true;\n      };\n      return ScaleRawExtentInfo;\n    }();\n    var DETERMINED_MIN_MAX_ATTR = {\n      min: '_determinedMin',\n      max: '_determinedMax'\n    };\n    var DATA_MIN_MAX_ATTR = {\n      min: '_dataMin',\n      max: '_dataMax'\n    };\n    /**\r\n     * Get scale min max and related info only depends on model settings.\r\n     * This method can be called after coordinate system created.\r\n     * For example, in data processing stage.\r\n     *\r\n     * Scale extent info probably be required multiple times during a workflow.\r\n     * For example:\r\n     * (1) `dataZoom` depends it to get the axis extent in \"100%\" state.\r\n     * (2) `processor/extentCalculator` depends it to make sure whether axis extent is specified.\r\n     * (3) `coordSys.update` use it to finally decide the scale extent.\r\n     * But the callback of `min`/`max` should not be called multiple times.\r\n     * The code below should not be implemented repeatedly either.\r\n     * So we cache the result in the scale instance, which will be recreated at the beginning\r\n     * of the workflow (because `scale` instance will be recreated each round of the workflow).\r\n     */\n    function ensureScaleRawExtentInfo(scale, model,\n    // Usually: data extent from all series on this axis.\n    originalExtent) {\n      // Do not permit to recreate.\n      var rawExtentInfo = scale.rawExtentInfo;\n      if (rawExtentInfo) {\n        return rawExtentInfo;\n      }\n      rawExtentInfo = new ScaleRawExtentInfo(scale, model, originalExtent);\n      // @ts-ignore\n      scale.rawExtentInfo = rawExtentInfo;\n      return rawExtentInfo;\n    }\n    function parseAxisModelMinMax(scale, minMax) {\n      return minMax == null ? null : eqNaN(minMax) ? NaN : scale.parse(minMax);\n    }\n\n    /**\r\n     * Get axis scale extent before niced.\r\n     * Item of returned array can only be number (including Infinity and NaN).\r\n     *\r\n     * Caution:\r\n     * Precondition of calling this method:\r\n     * The scale extent has been initialized using series data extent via\r\n     * `scale.setExtent` or `scale.unionExtentFromData`;\r\n     */\n    function getScaleExtent(scale, model) {\n      var scaleType = scale.type;\n      var rawExtentResult = ensureScaleRawExtentInfo(scale, model, scale.getExtent()).calculate();\n      scale.setBlank(rawExtentResult.isBlank);\n      var min = rawExtentResult.min;\n      var max = rawExtentResult.max;\n      // If bars are placed on a base axis of type time or interval account for axis boundary overflow and current axis\n      // is base axis\n      // FIXME\n      // (1) Consider support value axis, where below zero and axis `onZero` should be handled properly.\n      // (2) Refactor the logic with `barGrid`. Is it not need to `makeBarWidthAndOffsetInfo` twice with different extent?\n      //     Should not depend on series type `bar`?\n      // (3) Fix that might overlap when using dataZoom.\n      // (4) Consider other chart types using `barGrid`?\n      // See #6728, #4862, `test/bar-overflow-time-plot.html`\n      var ecModel = model.ecModel;\n      if (ecModel && scaleType === 'time' /* || scaleType === 'interval' */) {\n        var barSeriesModels = prepareLayoutBarSeries('bar', ecModel);\n        var isBaseAxisAndHasBarSeries_1 = false;\n        each(barSeriesModels, function (seriesModel) {\n          isBaseAxisAndHasBarSeries_1 = isBaseAxisAndHasBarSeries_1 || seriesModel.getBaseAxis() === model.axis;\n        });\n        if (isBaseAxisAndHasBarSeries_1) {\n          // Calculate placement of bars on axis. TODO should be decoupled\n          // with barLayout\n          var barWidthAndOffset = makeColumnLayout(barSeriesModels);\n          // Adjust axis min and max to account for overflow\n          var adjustedScale = adjustScaleForOverflow(min, max, model, barWidthAndOffset);\n          min = adjustedScale.min;\n          max = adjustedScale.max;\n        }\n      }\n      return {\n        extent: [min, max],\n        // \"fix\" means \"fixed\", the value should not be\n        // changed in the subsequent steps.\n        fixMin: rawExtentResult.minFixed,\n        fixMax: rawExtentResult.maxFixed\n      };\n    }\n    function adjustScaleForOverflow(min, max, model,\n    // Only support cartesian coord yet.\n    barWidthAndOffset) {\n      // Get Axis Length\n      var axisExtent = model.axis.getExtent();\n      var axisLength = Math.abs(axisExtent[1] - axisExtent[0]);\n      // Get bars on current base axis and calculate min and max overflow\n      var barsOnCurrentAxis = retrieveColumnLayout(barWidthAndOffset, model.axis);\n      if (barsOnCurrentAxis === undefined) {\n        return {\n          min: min,\n          max: max\n        };\n      }\n      var minOverflow = Infinity;\n      each(barsOnCurrentAxis, function (item) {\n        minOverflow = Math.min(item.offset, minOverflow);\n      });\n      var maxOverflow = -Infinity;\n      each(barsOnCurrentAxis, function (item) {\n        maxOverflow = Math.max(item.offset + item.width, maxOverflow);\n      });\n      minOverflow = Math.abs(minOverflow);\n      maxOverflow = Math.abs(maxOverflow);\n      var totalOverFlow = minOverflow + maxOverflow;\n      // Calculate required buffer based on old range and overflow\n      var oldRange = max - min;\n      var oldRangePercentOfNew = 1 - (minOverflow + maxOverflow) / axisLength;\n      var overflowBuffer = oldRange / oldRangePercentOfNew - oldRange;\n      max += overflowBuffer * (maxOverflow / totalOverFlow);\n      min -= overflowBuffer * (minOverflow / totalOverFlow);\n      return {\n        min: min,\n        max: max\n      };\n    }\n    // Precondition of calling this method:\n    // The scale extent has been initialized using series data extent via\n    // `scale.setExtent` or `scale.unionExtentFromData`;\n    function niceScaleExtent(scale, inModel) {\n      var model = inModel;\n      var extentInfo = getScaleExtent(scale, model);\n      var extent = extentInfo.extent;\n      var splitNumber = model.get('splitNumber');\n      if (scale instanceof LogScale) {\n        scale.base = model.get('logBase');\n      }\n      var scaleType = scale.type;\n      var interval = model.get('interval');\n      var isIntervalOrTime = scaleType === 'interval' || scaleType === 'time';\n      scale.setExtent(extent[0], extent[1]);\n      scale.calcNiceExtent({\n        splitNumber: splitNumber,\n        fixMin: extentInfo.fixMin,\n        fixMax: extentInfo.fixMax,\n        minInterval: isIntervalOrTime ? model.get('minInterval') : null,\n        maxInterval: isIntervalOrTime ? model.get('maxInterval') : null\n      });\n      // If some one specified the min, max. And the default calculated interval\n      // is not good enough. He can specify the interval. It is often appeared\n      // in angle axis with angle 0 - 360. Interval calculated in interval scale is hard\n      // to be 60.\n      // FIXME\n      if (interval != null) {\n        scale.setInterval && scale.setInterval(interval);\n      }\n    }\n    /**\r\n     * @param axisType Default retrieve from model.type\r\n     */\n    function createScaleByModel(model, axisType) {\n      axisType = axisType || model.get('type');\n      if (axisType) {\n        switch (axisType) {\n          // Buildin scale\n          case 'category':\n            return new OrdinalScale({\n              ordinalMeta: model.getOrdinalMeta ? model.getOrdinalMeta() : model.getCategories(),\n              extent: [Infinity, -Infinity]\n            });\n          case 'time':\n            return new TimeScale({\n              locale: model.ecModel.getLocaleModel(),\n              useUTC: model.ecModel.get('useUTC')\n            });\n          default:\n            // case 'value'/'interval', 'log', or others.\n            return new (Scale.getClass(axisType) || IntervalScale)();\n        }\n      }\n    }\n    /**\r\n     * Check if the axis cross 0\r\n     */\n    function ifAxisCrossZero(axis) {\n      var dataExtent = axis.scale.getExtent();\n      var min = dataExtent[0];\n      var max = dataExtent[1];\n      return !(min > 0 && max > 0 || min < 0 && max < 0);\n    }\n    /**\r\n     * @param axis\r\n     * @return Label formatter function.\r\n     *         param: {number} tickValue,\r\n     *         param: {number} idx, the index in all ticks.\r\n     *                         If category axis, this param is not required.\r\n     *         return: {string} label string.\r\n     */\n    function makeLabelFormatter(axis) {\n      var labelFormatter = axis.getLabelModel().get('formatter');\n      var categoryTickStart = axis.type === 'category' ? axis.scale.getExtent()[0] : null;\n      if (axis.scale.type === 'time') {\n        return function (tpl) {\n          return function (tick, idx) {\n            return axis.scale.getFormattedLabel(tick, idx, tpl);\n          };\n        }(labelFormatter);\n      } else if (isString(labelFormatter)) {\n        return function (tpl) {\n          return function (tick) {\n            // For category axis, get raw value; for numeric axis,\n            // get formatted label like '1,333,444'.\n            var label = axis.scale.getLabel(tick);\n            var text = tpl.replace('{value}', label != null ? label : '');\n            return text;\n          };\n        }(labelFormatter);\n      } else if (isFunction(labelFormatter)) {\n        return function (cb) {\n          return function (tick, idx) {\n            // The original intention of `idx` is \"the index of the tick in all ticks\".\n            // But the previous implementation of category axis do not consider the\n            // `axisLabel.interval`, which cause that, for example, the `interval` is\n            // `1`, then the ticks \"name5\", \"name7\", \"name9\" are displayed, where the\n            // corresponding `idx` are `0`, `2`, `4`, but not `0`, `1`, `2`. So we keep\n            // the definition here for back compatibility.\n            if (categoryTickStart != null) {\n              idx = tick.value - categoryTickStart;\n            }\n            return cb(getAxisRawValue(axis, tick), idx, tick.level != null ? {\n              level: tick.level\n            } : null);\n          };\n        }(labelFormatter);\n      } else {\n        return function (tick) {\n          return axis.scale.getLabel(tick);\n        };\n      }\n    }\n    function getAxisRawValue(axis, tick) {\n      // In category axis with data zoom, tick is not the original\n      // index of axis.data. So tick should not be exposed to user\n      // in category axis.\n      return axis.type === 'category' ? axis.scale.getLabel(tick) : tick.value;\n    }\n    /**\r\n     * @param axis\r\n     * @return Be null/undefined if no labels.\r\n     */\n    function estimateLabelUnionRect(axis) {\n      var axisModel = axis.model;\n      var scale = axis.scale;\n      if (!axisModel.get(['axisLabel', 'show']) || scale.isBlank()) {\n        return;\n      }\n      var realNumberScaleTicks;\n      var tickCount;\n      var categoryScaleExtent = scale.getExtent();\n      // Optimize for large category data, avoid call `getTicks()`.\n      if (scale instanceof OrdinalScale) {\n        tickCount = scale.count();\n      } else {\n        realNumberScaleTicks = scale.getTicks();\n        tickCount = realNumberScaleTicks.length;\n      }\n      var axisLabelModel = axis.getLabelModel();\n      var labelFormatter = makeLabelFormatter(axis);\n      var rect;\n      var step = 1;\n      // Simple optimization for large amount of labels\n      if (tickCount > 40) {\n        step = Math.ceil(tickCount / 40);\n      }\n      for (var i = 0; i < tickCount; i += step) {\n        var tick = realNumberScaleTicks ? realNumberScaleTicks[i] : {\n          value: categoryScaleExtent[0] + i\n        };\n        var label = labelFormatter(tick, i);\n        var unrotatedSingleRect = axisLabelModel.getTextRect(label);\n        var singleRect = rotateTextRect(unrotatedSingleRect, axisLabelModel.get('rotate') || 0);\n        rect ? rect.union(singleRect) : rect = singleRect;\n      }\n      return rect;\n    }\n    function rotateTextRect(textRect, rotate) {\n      var rotateRadians = rotate * Math.PI / 180;\n      var beforeWidth = textRect.width;\n      var beforeHeight = textRect.height;\n      var afterWidth = beforeWidth * Math.abs(Math.cos(rotateRadians)) + Math.abs(beforeHeight * Math.sin(rotateRadians));\n      var afterHeight = beforeWidth * Math.abs(Math.sin(rotateRadians)) + Math.abs(beforeHeight * Math.cos(rotateRadians));\n      var rotatedRect = new BoundingRect(textRect.x, textRect.y, afterWidth, afterHeight);\n      return rotatedRect;\n    }\n    /**\r\n     * @param model axisLabelModel or axisTickModel\r\n     * @return {number|String} Can be null|'auto'|number|function\r\n     */\n    function getOptionCategoryInterval(model) {\n      var interval = model.get('interval');\n      return interval == null ? 'auto' : interval;\n    }\n    /**\r\n     * Set `categoryInterval` as 0 implicitly indicates that\r\n     * show all labels regardless of overlap.\r\n     * @param {Object} axis axisModel.axis\r\n     */\n    function shouldShowAllLabels(axis) {\n      return axis.type === 'category' && getOptionCategoryInterval(axis.getLabelModel()) === 0;\n    }\n    function getDataDimensionsOnAxis(data, axisDim) {\n      // Remove duplicated dat dimensions caused by `getStackedDimension`.\n      var dataDimMap = {};\n      // Currently `mapDimensionsAll` will contain stack result dimension ('__\\0ecstackresult').\n      // PENDING: is it reasonable? Do we need to remove the original dim from \"coord dim\" since\n      // there has been stacked result dim?\n      each(data.mapDimensionsAll(axisDim), function (dataDim) {\n        // For example, the extent of the original dimension\n        // is [0.1, 0.5], the extent of the `stackResultDimension`\n        // is [7, 9], the final extent should NOT include [0.1, 0.5],\n        // because there is no graphic corresponding to [0.1, 0.5].\n        // See the case in `test/area-stack.html` `main1`, where area line\n        // stack needs `yAxis` not start from 0.\n        dataDimMap[getStackedDimension(data, dataDim)] = true;\n      });\n      return keys(dataDimMap);\n    }\n    function unionAxisExtentFromData(dataExtent, data, axisDim) {\n      if (data) {\n        each(getDataDimensionsOnAxis(data, axisDim), function (dim) {\n          var seriesExtent = data.getApproximateExtent(dim);\n          seriesExtent[0] < dataExtent[0] && (dataExtent[0] = seriesExtent[0]);\n          seriesExtent[1] > dataExtent[1] && (dataExtent[1] = seriesExtent[1]);\n        });\n      }\n    }\n\n    /*\n    * Licensed to the Apache Software Foundation (ASF) under one\n    * or more contributor license agreements.  See the NOTICE file\n    * distributed with this work for additional information\n    * regarding copyright ownership.  The ASF licenses this file\n    * to you under the Apache License, Version 2.0 (the\n    * \"License\"); you may not use this file except in compliance\n    * with the License.  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,\n    * software distributed under the License is distributed on an\n    * \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\n    * KIND, either express or implied.  See the License for the\n    * specific language governing permissions and limitations\n    * under the License.\n    */\n\n\n    /**\n     * AUTO-GENERATED FILE. DO NOT MODIFY.\n     */\n\n    /*\r\n    * Licensed to the Apache Software Foundation (ASF) under one\r\n    * or more contributor license agreements.  See the NOTICE file\r\n    * distributed with this work for additional information\r\n    * regarding copyright ownership.  The ASF licenses this file\r\n    * to you under the Apache License, Version 2.0 (the\r\n    * \"License\"); you may not use this file except in compliance\r\n    * with the License.  You may obtain a copy of the License at\r\n    *\r\n    *   http://www.apache.org/licenses/LICENSE-2.0\r\n    *\r\n    * Unless required by applicable law or agreed to in writing,\r\n    * software distributed under the License is distributed on an\r\n    * \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\r\n    * KIND, either express or implied.  See the License for the\r\n    * specific language governing permissions and limitations\r\n    * under the License.\r\n    */\n    // eslint-disable-next-line @typescript-eslint/no-unused-vars\n    var AxisModelCommonMixin = /** @class */function () {\n      function AxisModelCommonMixin() {}\n      AxisModelCommonMixin.prototype.getNeedCrossZero = function () {\n        var option = this.option;\n        return !option.scale;\n      };\n      /**\r\n       * Should be implemented by each axis model if necessary.\r\n       * @return coordinate system model\r\n       */\n      AxisModelCommonMixin.prototype.getCoordSysModel = function () {\n        return;\n      };\n      return AxisModelCommonMixin;\n    }();\n\n    /**\r\n     * Create a multi dimension List structure from seriesModel.\r\n     */\n    function createList(seriesModel) {\n      return createSeriesData(null, seriesModel);\n    }\n    var dataStack$1 = {\n      isDimensionStacked: isDimensionStacked,\n      enableDataStack: enableDataStack,\n      getStackedDimension: getStackedDimension\n    };\n    /**\r\n     * Create scale\r\n     * @param {Array.<number>} dataExtent\r\n     * @param {Object|module:echarts/Model} option If `optoin.type`\r\n     *        is secified, it can only be `'value'` currently.\r\n     */\n    function createScale(dataExtent, option) {\n      var axisModel = option;\n      if (!(option instanceof Model)) {\n        axisModel = new Model(option);\n        // FIXME\n        // Currently AxisModelCommonMixin has nothing to do with the\n        // the requirements of `axisHelper.createScaleByModel`. For\n        // example the methods `getCategories` and `getOrdinalMeta`\n        // are required for `'category'` axis, and ecModel is required\n        // for `'time'` axis. But occasionally echarts-gl happened\n        // to only use `'value'` axis.\n        // zrUtil.mixin(axisModel, AxisModelCommonMixin);\n      }\n      var scale = createScaleByModel(axisModel);\n      scale.setExtent(dataExtent[0], dataExtent[1]);\n      niceScaleExtent(scale, axisModel);\n      return scale;\n    }\n    /**\r\n     * Mixin common methods to axis model,\r\n     *\r\n     * Include methods\r\n     * `getFormattedLabels() => Array.<string>`\r\n     * `getCategories() => Array.<string>`\r\n     * `getMin(origin: boolean) => number`\r\n     * `getMax(origin: boolean) => number`\r\n     * `getNeedCrossZero() => boolean`\r\n     */\n    function mixinAxisModelCommonMethods(Model) {\n      mixin(Model, AxisModelCommonMixin);\n    }\n    function createTextStyle$1(textStyleModel, opts) {\n      opts = opts || {};\n      return createTextStyle(textStyleModel, null, null, opts.state !== 'normal');\n    }\n\n    var helper = /*#__PURE__*/Object.freeze({\n        __proto__: null,\n        createList: createList,\n        getLayoutRect: getLayoutRect,\n        dataStack: dataStack$1,\n        createScale: createScale,\n        mixinAxisModelCommonMethods: mixinAxisModelCommonMethods,\n        getECData: getECData,\n        createTextStyle: createTextStyle$1,\n        createDimensions: createDimensions,\n        createSymbol: createSymbol,\n        enableHoverEmphasis: enableHoverEmphasis\n    });\n\n    var EPSILON$4 = 1e-8;\n    function isAroundEqual$1(a, b) {\n        return Math.abs(a - b) < EPSILON$4;\n    }\n    function contain$2(points, x, y) {\n        var w = 0;\n        var p = points[0];\n        if (!p) {\n            return false;\n        }\n        for (var i = 1; i < points.length; i++) {\n            var p2 = points[i];\n            w += windingLine(p[0], p[1], p2[0], p2[1], x, y);\n            p = p2;\n        }\n        var p0 = points[0];\n        if (!isAroundEqual$1(p[0], p0[0]) || !isAroundEqual$1(p[1], p0[1])) {\n            w += windingLine(p[0], p[1], p0[0], p0[1], x, y);\n        }\n        return w !== 0;\n    }\n\n    var TMP_TRANSFORM = [];\n    function transformPoints(points, transform) {\n      for (var p = 0; p < points.length; p++) {\n        applyTransform(points[p], points[p], transform);\n      }\n    }\n    function updateBBoxFromPoints(points, min$1, max$1, projection) {\n      for (var i = 0; i < points.length; i++) {\n        var p = points[i];\n        if (projection) {\n          // projection may return null point.\n          p = projection.project(p);\n        }\n        if (p && isFinite(p[0]) && isFinite(p[1])) {\n          min(min$1, min$1, p);\n          max(max$1, max$1, p);\n        }\n      }\n    }\n    function centroid(points) {\n      var signedArea = 0;\n      var cx = 0;\n      var cy = 0;\n      var len = points.length;\n      var x0 = points[len - 1][0];\n      var y0 = points[len - 1][1];\n      // Polygon should been closed.\n      for (var i = 0; i < len; i++) {\n        var x1 = points[i][0];\n        var y1 = points[i][1];\n        var a = x0 * y1 - x1 * y0;\n        signedArea += a;\n        cx += (x0 + x1) * a;\n        cy += (y0 + y1) * a;\n        x0 = x1;\n        y0 = y1;\n      }\n      return signedArea ? [cx / signedArea / 3, cy / signedArea / 3, signedArea] : [points[0][0] || 0, points[0][1] || 0];\n    }\n    var Region = /** @class */function () {\n      function Region(name) {\n        this.name = name;\n      }\n      Region.prototype.setCenter = function (center) {\n        this._center = center;\n      };\n      /**\r\n       * Get center point in data unit. That is,\r\n       * for GeoJSONRegion, the unit is lat/lng,\r\n       * for GeoSVGRegion, the unit is SVG local coord.\r\n       */\n      Region.prototype.getCenter = function () {\n        var center = this._center;\n        if (!center) {\n          // In most cases there are no need to calculate this center.\n          // So calculate only when called.\n          center = this._center = this.calcCenter();\n        }\n        return center;\n      };\n      return Region;\n    }();\n    var GeoJSONPolygonGeometry = /** @class */function () {\n      function GeoJSONPolygonGeometry(exterior, interiors) {\n        this.type = 'polygon';\n        this.exterior = exterior;\n        this.interiors = interiors;\n      }\n      return GeoJSONPolygonGeometry;\n    }();\n    var GeoJSONLineStringGeometry = /** @class */function () {\n      function GeoJSONLineStringGeometry(points) {\n        this.type = 'linestring';\n        this.points = points;\n      }\n      return GeoJSONLineStringGeometry;\n    }();\n    var GeoJSONRegion = /** @class */function (_super) {\n      __extends(GeoJSONRegion, _super);\n      function GeoJSONRegion(name, geometries, cp) {\n        var _this = _super.call(this, name) || this;\n        _this.type = 'geoJSON';\n        _this.geometries = geometries;\n        _this._center = cp && [cp[0], cp[1]];\n        return _this;\n      }\n      GeoJSONRegion.prototype.calcCenter = function () {\n        var geometries = this.geometries;\n        var largestGeo;\n        var largestGeoSize = 0;\n        for (var i = 0; i < geometries.length; i++) {\n          var geo = geometries[i];\n          var exterior = geo.exterior;\n          // Simple trick to use points count instead of polygon area as region size.\n          // Ignore linestring\n          var size = exterior && exterior.length;\n          if (size > largestGeoSize) {\n            largestGeo = geo;\n            largestGeoSize = size;\n          }\n        }\n        if (largestGeo) {\n          return centroid(largestGeo.exterior);\n        }\n        // from bounding rect by default.\n        var rect = this.getBoundingRect();\n        return [rect.x + rect.width / 2, rect.y + rect.height / 2];\n      };\n      GeoJSONRegion.prototype.getBoundingRect = function (projection) {\n        var rect = this._rect;\n        // Always recalculate if using projection.\n        if (rect && !projection) {\n          return rect;\n        }\n        var min = [Infinity, Infinity];\n        var max = [-Infinity, -Infinity];\n        var geometries = this.geometries;\n        each(geometries, function (geo) {\n          if (geo.type === 'polygon') {\n            // Doesn't consider hole\n            updateBBoxFromPoints(geo.exterior, min, max, projection);\n          } else {\n            each(geo.points, function (points) {\n              updateBBoxFromPoints(points, min, max, projection);\n            });\n          }\n        });\n        // Normalie invalid bounding.\n        if (!(isFinite(min[0]) && isFinite(min[1]) && isFinite(max[0]) && isFinite(max[1]))) {\n          min[0] = min[1] = max[0] = max[1] = 0;\n        }\n        rect = new BoundingRect(min[0], min[1], max[0] - min[0], max[1] - min[1]);\n        if (!projection) {\n          this._rect = rect;\n        }\n        return rect;\n      };\n      GeoJSONRegion.prototype.contain = function (coord) {\n        var rect = this.getBoundingRect();\n        var geometries = this.geometries;\n        if (!rect.contain(coord[0], coord[1])) {\n          return false;\n        }\n        loopGeo: for (var i = 0, len = geometries.length; i < len; i++) {\n          var geo = geometries[i];\n          // Only support polygon.\n          if (geo.type !== 'polygon') {\n            continue;\n          }\n          var exterior = geo.exterior;\n          var interiors = geo.interiors;\n          if (contain$2(exterior, coord[0], coord[1])) {\n            // Not in the region if point is in the hole.\n            for (var k = 0; k < (interiors ? interiors.length : 0); k++) {\n              if (contain$2(interiors[k], coord[0], coord[1])) {\n                continue loopGeo;\n              }\n            }\n            return true;\n          }\n        }\n        return false;\n      };\n      /**\r\n       * Transform the raw coords to target bounding.\r\n       * @param x\r\n       * @param y\r\n       * @param width\r\n       * @param height\r\n       */\n      GeoJSONRegion.prototype.transformTo = function (x, y, width, height) {\n        var rect = this.getBoundingRect();\n        var aspect = rect.width / rect.height;\n        if (!width) {\n          width = aspect * height;\n        } else if (!height) {\n          height = width / aspect;\n        }\n        var target = new BoundingRect(x, y, width, height);\n        var transform = rect.calculateTransform(target);\n        var geometries = this.geometries;\n        for (var i = 0; i < geometries.length; i++) {\n          var geo = geometries[i];\n          if (geo.type === 'polygon') {\n            transformPoints(geo.exterior, transform);\n            each(geo.interiors, function (interior) {\n              transformPoints(interior, transform);\n            });\n          } else {\n            each(geo.points, function (points) {\n              transformPoints(points, transform);\n            });\n          }\n        }\n        rect = this._rect;\n        rect.copy(target);\n        // Update center\n        this._center = [rect.x + rect.width / 2, rect.y + rect.height / 2];\n      };\n      GeoJSONRegion.prototype.cloneShallow = function (name) {\n        name == null && (name = this.name);\n        var newRegion = new GeoJSONRegion(name, this.geometries, this._center);\n        newRegion._rect = this._rect;\n        newRegion.transformTo = null; // Simply avoid to be called.\n        return newRegion;\n      };\n      return GeoJSONRegion;\n    }(Region);\n    var GeoSVGRegion = /** @class */function (_super) {\n      __extends(GeoSVGRegion, _super);\n      function GeoSVGRegion(name, elOnlyForCalculate) {\n        var _this = _super.call(this, name) || this;\n        _this.type = 'geoSVG';\n        _this._elOnlyForCalculate = elOnlyForCalculate;\n        return _this;\n      }\n      GeoSVGRegion.prototype.calcCenter = function () {\n        var el = this._elOnlyForCalculate;\n        var rect = el.getBoundingRect();\n        var center = [rect.x + rect.width / 2, rect.y + rect.height / 2];\n        var mat = identity(TMP_TRANSFORM);\n        var target = el;\n        while (target && !target.isGeoSVGGraphicRoot) {\n          mul$1(mat, target.getLocalTransform(), mat);\n          target = target.parent;\n        }\n        invert(mat, mat);\n        applyTransform(center, center, mat);\n        return center;\n      };\n      return GeoSVGRegion;\n    }(Region);\n\n    function decode(json) {\n      if (!json.UTF8Encoding) {\n        return json;\n      }\n      var jsonCompressed = json;\n      var encodeScale = jsonCompressed.UTF8Scale;\n      if (encodeScale == null) {\n        encodeScale = 1024;\n      }\n      var features = jsonCompressed.features;\n      each(features, function (feature) {\n        var geometry = feature.geometry;\n        var encodeOffsets = geometry.encodeOffsets;\n        var coordinates = geometry.coordinates;\n        // Geometry may be appeded manually in the script after json loaded.\n        // In this case this geometry is usually not encoded.\n        if (!encodeOffsets) {\n          return;\n        }\n        switch (geometry.type) {\n          case 'LineString':\n            geometry.coordinates = decodeRing(coordinates, encodeOffsets, encodeScale);\n            break;\n          case 'Polygon':\n            decodeRings(coordinates, encodeOffsets, encodeScale);\n            break;\n          case 'MultiLineString':\n            decodeRings(coordinates, encodeOffsets, encodeScale);\n            break;\n          case 'MultiPolygon':\n            each(coordinates, function (rings, idx) {\n              return decodeRings(rings, encodeOffsets[idx], encodeScale);\n            });\n        }\n      });\n      // Has been decoded\n      jsonCompressed.UTF8Encoding = false;\n      return jsonCompressed;\n    }\n    function decodeRings(rings, encodeOffsets, encodeScale) {\n      for (var c = 0; c < rings.length; c++) {\n        rings[c] = decodeRing(rings[c], encodeOffsets[c], encodeScale);\n      }\n    }\n    function decodeRing(coordinate, encodeOffsets, encodeScale) {\n      var result = [];\n      var prevX = encodeOffsets[0];\n      var prevY = encodeOffsets[1];\n      for (var i = 0; i < coordinate.length; i += 2) {\n        var x = coordinate.charCodeAt(i) - 64;\n        var y = coordinate.charCodeAt(i + 1) - 64;\n        // ZigZag decoding\n        x = x >> 1 ^ -(x & 1);\n        y = y >> 1 ^ -(y & 1);\n        // Delta deocding\n        x += prevX;\n        y += prevY;\n        prevX = x;\n        prevY = y;\n        // Dequantize\n        result.push([x / encodeScale, y / encodeScale]);\n      }\n      return result;\n    }\n    function parseGeoJSON(geoJson, nameProperty) {\n      geoJson = decode(geoJson);\n      return map(filter(geoJson.features, function (featureObj) {\n        // Output of mapshaper may have geometry null\n        return featureObj.geometry && featureObj.properties && featureObj.geometry.coordinates.length > 0;\n      }), function (featureObj) {\n        var properties = featureObj.properties;\n        var geo = featureObj.geometry;\n        var geometries = [];\n        switch (geo.type) {\n          case 'Polygon':\n            var coordinates = geo.coordinates;\n            // According to the GeoJSON specification.\n            // First must be exterior, and the rest are all interior(holes).\n            geometries.push(new GeoJSONPolygonGeometry(coordinates[0], coordinates.slice(1)));\n            break;\n          case 'MultiPolygon':\n            each(geo.coordinates, function (item) {\n              if (item[0]) {\n                geometries.push(new GeoJSONPolygonGeometry(item[0], item.slice(1)));\n              }\n            });\n            break;\n          case 'LineString':\n            geometries.push(new GeoJSONLineStringGeometry([geo.coordinates]));\n            break;\n          case 'MultiLineString':\n            geometries.push(new GeoJSONLineStringGeometry(geo.coordinates));\n        }\n        var region = new GeoJSONRegion(properties[nameProperty || 'name'], geometries, properties.cp);\n        region.properties = properties;\n        return region;\n      });\n    }\n\n    var number = /*#__PURE__*/Object.freeze({\n        __proto__: null,\n        linearMap: linearMap,\n        round: round,\n        asc: asc,\n        getPrecision: getPrecision,\n        getPrecisionSafe: getPrecisionSafe,\n        getPixelPrecision: getPixelPrecision,\n        getPercentWithPrecision: getPercentWithPrecision,\n        MAX_SAFE_INTEGER: MAX_SAFE_INTEGER,\n        remRadian: remRadian,\n        isRadianAroundZero: isRadianAroundZero,\n        parseDate: parseDate,\n        quantity: quantity,\n        quantityExponent: quantityExponent,\n        nice: nice,\n        quantile: quantile,\n        reformIntervals: reformIntervals,\n        isNumeric: isNumeric,\n        numericToNumber: numericToNumber\n    });\n\n    var time = /*#__PURE__*/Object.freeze({\n        __proto__: null,\n        parse: parseDate,\n        format: format\n    });\n\n    var graphic$1 = /*#__PURE__*/Object.freeze({\n        __proto__: null,\n        extendShape: extendShape,\n        extendPath: extendPath,\n        makePath: makePath,\n        makeImage: makeImage,\n        mergePath: mergePath$1,\n        resizePath: resizePath,\n        createIcon: createIcon,\n        updateProps: updateProps,\n        initProps: initProps,\n        getTransform: getTransform,\n        clipPointsByRect: clipPointsByRect,\n        clipRectByRect: clipRectByRect,\n        registerShape: registerShape,\n        getShapeClass: getShapeClass,\n        Group: Group,\n        Image: ZRImage,\n        Text: ZRText,\n        Circle: Circle,\n        Ellipse: Ellipse,\n        Sector: Sector,\n        Ring: Ring,\n        Polygon: Polygon,\n        Polyline: Polyline,\n        Rect: Rect,\n        Line: Line,\n        BezierCurve: BezierCurve,\n        Arc: Arc,\n        IncrementalDisplayable: IncrementalDisplayable,\n        CompoundPath: CompoundPath,\n        LinearGradient: LinearGradient,\n        RadialGradient: RadialGradient,\n        BoundingRect: BoundingRect\n    });\n\n    var format$1 = /*#__PURE__*/Object.freeze({\n        __proto__: null,\n        addCommas: addCommas,\n        toCamelCase: toCamelCase,\n        normalizeCssArray: normalizeCssArray$1,\n        encodeHTML: encodeHTML,\n        formatTpl: formatTpl,\n        getTooltipMarker: getTooltipMarker,\n        formatTime: formatTime,\n        capitalFirst: capitalFirst,\n        truncateText: truncateText,\n        getTextRect: getTextRect\n    });\n\n    var util$1 = /*#__PURE__*/Object.freeze({\n        __proto__: null,\n        map: map,\n        each: each,\n        indexOf: indexOf,\n        inherits: inherits,\n        reduce: reduce,\n        filter: filter,\n        bind: bind,\n        curry: curry,\n        isArray: isArray,\n        isString: isString,\n        isObject: isObject,\n        isFunction: isFunction,\n        extend: extend,\n        defaults: defaults,\n        clone: clone,\n        merge: merge\n    });\n\n    var inner$5 = makeInner();\n    function tickValuesToNumbers(axis, values) {\n      var nums = map(values, function (val) {\n        return axis.scale.parse(val);\n      });\n      if (axis.type === 'time' && nums.length > 0) {\n        // Time axis needs duplicate first/last tick (see TimeScale.getTicks())\n        // The first and last tick/label don't get drawn\n        nums.sort();\n        nums.unshift(nums[0]);\n        nums.push(nums[nums.length - 1]);\n      }\n      return nums;\n    }\n    function createAxisLabels(axis) {\n      var custom = axis.getLabelModel().get('customValues');\n      if (custom) {\n        var labelFormatter_1 = makeLabelFormatter(axis);\n        var extent_1 = axis.scale.getExtent();\n        var tickNumbers = tickValuesToNumbers(axis, custom);\n        var ticks = filter(tickNumbers, function (val) {\n          return val >= extent_1[0] && val <= extent_1[1];\n        });\n        return {\n          labels: map(ticks, function (numval) {\n            var tick = {\n              value: numval\n            };\n            return {\n              formattedLabel: labelFormatter_1(tick),\n              rawLabel: axis.scale.getLabel(tick),\n              tickValue: numval\n            };\n          })\n        };\n      }\n      // Only ordinal scale support tick interval\n      return axis.type === 'category' ? makeCategoryLabels(axis) : makeRealNumberLabels(axis);\n    }\n    /**\r\n     * @param {module:echats/coord/Axis} axis\r\n     * @param {module:echarts/model/Model} tickModel For example, can be axisTick, splitLine, splitArea.\r\n     * @return {Object} {\r\n     *     ticks: Array.<number>\r\n     *     tickCategoryInterval: number\r\n     * }\r\n     */\n    function createAxisTicks(axis, tickModel) {\n      var custom = axis.getTickModel().get('customValues');\n      if (custom) {\n        var extent_2 = axis.scale.getExtent();\n        var tickNumbers = tickValuesToNumbers(axis, custom);\n        return {\n          ticks: filter(tickNumbers, function (val) {\n            return val >= extent_2[0] && val <= extent_2[1];\n          })\n        };\n      }\n      // Only ordinal scale support tick interval\n      return axis.type === 'category' ? makeCategoryTicks(axis, tickModel) : {\n        ticks: map(axis.scale.getTicks(), function (tick) {\n          return tick.value;\n        })\n      };\n    }\n    function makeCategoryLabels(axis) {\n      var labelModel = axis.getLabelModel();\n      var result = makeCategoryLabelsActually(axis, labelModel);\n      return !labelModel.get('show') || axis.scale.isBlank() ? {\n        labels: [],\n        labelCategoryInterval: result.labelCategoryInterval\n      } : result;\n    }\n    function makeCategoryLabelsActually(axis, labelModel) {\n      var labelsCache = getListCache(axis, 'labels');\n      var optionLabelInterval = getOptionCategoryInterval(labelModel);\n      var result = listCacheGet(labelsCache, optionLabelInterval);\n      if (result) {\n        return result;\n      }\n      var labels;\n      var numericLabelInterval;\n      if (isFunction(optionLabelInterval)) {\n        labels = makeLabelsByCustomizedCategoryInterval(axis, optionLabelInterval);\n      } else {\n        numericLabelInterval = optionLabelInterval === 'auto' ? makeAutoCategoryInterval(axis) : optionLabelInterval;\n        labels = makeLabelsByNumericCategoryInterval(axis, numericLabelInterval);\n      }\n      // Cache to avoid calling interval function repeatedly.\n      return listCacheSet(labelsCache, optionLabelInterval, {\n        labels: labels,\n        labelCategoryInterval: numericLabelInterval\n      });\n    }\n    function makeCategoryTicks(axis, tickModel) {\n      var ticksCache = getListCache(axis, 'ticks');\n      var optionTickInterval = getOptionCategoryInterval(tickModel);\n      var result = listCacheGet(ticksCache, optionTickInterval);\n      if (result) {\n        return result;\n      }\n      var ticks;\n      var tickCategoryInterval;\n      // Optimize for the case that large category data and no label displayed,\n      // we should not return all ticks.\n      if (!tickModel.get('show') || axis.scale.isBlank()) {\n        ticks = [];\n      }\n      if (isFunction(optionTickInterval)) {\n        ticks = makeLabelsByCustomizedCategoryInterval(axis, optionTickInterval, true);\n      }\n      // Always use label interval by default despite label show. Consider this\n      // scenario, Use multiple grid with the xAxis sync, and only one xAxis shows\n      // labels. `splitLine` and `axisTick` should be consistent in this case.\n      else if (optionTickInterval === 'auto') {\n        var labelsResult = makeCategoryLabelsActually(axis, axis.getLabelModel());\n        tickCategoryInterval = labelsResult.labelCategoryInterval;\n        ticks = map(labelsResult.labels, function (labelItem) {\n          return labelItem.tickValue;\n        });\n      } else {\n        tickCategoryInterval = optionTickInterval;\n        ticks = makeLabelsByNumericCategoryInterval(axis, tickCategoryInterval, true);\n      }\n      // Cache to avoid calling interval function repeatedly.\n      return listCacheSet(ticksCache, optionTickInterval, {\n        ticks: ticks,\n        tickCategoryInterval: tickCategoryInterval\n      });\n    }\n    function makeRealNumberLabels(axis) {\n      var ticks = axis.scale.getTicks();\n      var labelFormatter = makeLabelFormatter(axis);\n      return {\n        labels: map(ticks, function (tick, idx) {\n          return {\n            level: tick.level,\n            formattedLabel: labelFormatter(tick, idx),\n            rawLabel: axis.scale.getLabel(tick),\n            tickValue: tick.value\n          };\n        })\n      };\n    }\n    function getListCache(axis, prop) {\n      // Because key can be a function, and cache size always is small, we use array cache.\n      return inner$5(axis)[prop] || (inner$5(axis)[prop] = []);\n    }\n    function listCacheGet(cache, key) {\n      for (var i = 0; i < cache.length; i++) {\n        if (cache[i].key === key) {\n          return cache[i].value;\n        }\n      }\n    }\n    function listCacheSet(cache, key, value) {\n      cache.push({\n        key: key,\n        value: value\n      });\n      return value;\n    }\n    function makeAutoCategoryInterval(axis) {\n      var result = inner$5(axis).autoInterval;\n      return result != null ? result : inner$5(axis).autoInterval = axis.calculateCategoryInterval();\n    }\n    /**\r\n     * Calculate interval for category axis ticks and labels.\r\n     * To get precise result, at least one of `getRotate` and `isHorizontal`\r\n     * should be implemented in axis.\r\n     */\n    function calculateCategoryInterval(axis) {\n      var params = fetchAutoCategoryIntervalCalculationParams(axis);\n      var labelFormatter = makeLabelFormatter(axis);\n      var rotation = (params.axisRotate - params.labelRotate) / 180 * Math.PI;\n      var ordinalScale = axis.scale;\n      var ordinalExtent = ordinalScale.getExtent();\n      // Providing this method is for optimization:\n      // avoid generating a long array by `getTicks`\n      // in large category data case.\n      var tickCount = ordinalScale.count();\n      if (ordinalExtent[1] - ordinalExtent[0] < 1) {\n        return 0;\n      }\n      var step = 1;\n      // Simple optimization. Empirical value: tick count should less than 40.\n      if (tickCount > 40) {\n        step = Math.max(1, Math.floor(tickCount / 40));\n      }\n      var tickValue = ordinalExtent[0];\n      var unitSpan = axis.dataToCoord(tickValue + 1) - axis.dataToCoord(tickValue);\n      var unitW = Math.abs(unitSpan * Math.cos(rotation));\n      var unitH = Math.abs(unitSpan * Math.sin(rotation));\n      var maxW = 0;\n      var maxH = 0;\n      // Caution: Performance sensitive for large category data.\n      // Consider dataZoom, we should make appropriate step to avoid O(n) loop.\n      for (; tickValue <= ordinalExtent[1]; tickValue += step) {\n        var width = 0;\n        var height = 0;\n        // Not precise, do not consider align and vertical align\n        // and each distance from axis line yet.\n        var rect = getBoundingRect(labelFormatter({\n          value: tickValue\n        }), params.font, 'center', 'top');\n        // Magic number\n        width = rect.width * 1.3;\n        height = rect.height * 1.3;\n        // Min size, void long loop.\n        maxW = Math.max(maxW, width, 7);\n        maxH = Math.max(maxH, height, 7);\n      }\n      var dw = maxW / unitW;\n      var dh = maxH / unitH;\n      // 0/0 is NaN, 1/0 is Infinity.\n      isNaN(dw) && (dw = Infinity);\n      isNaN(dh) && (dh = Infinity);\n      var interval = Math.max(0, Math.floor(Math.min(dw, dh)));\n      var cache = inner$5(axis.model);\n      var axisExtent = axis.getExtent();\n      var lastAutoInterval = cache.lastAutoInterval;\n      var lastTickCount = cache.lastTickCount;\n      // Use cache to keep interval stable while moving zoom window,\n      // otherwise the calculated interval might jitter when the zoom\n      // window size is close to the interval-changing size.\n      // For example, if all of the axis labels are `a, b, c, d, e, f, g`.\n      // The jitter will cause that sometimes the displayed labels are\n      // `a, d, g` (interval: 2) sometimes `a, c, e`(interval: 1).\n      if (lastAutoInterval != null && lastTickCount != null && Math.abs(lastAutoInterval - interval) <= 1 && Math.abs(lastTickCount - tickCount) <= 1\n      // Always choose the bigger one, otherwise the critical\n      // point is not the same when zooming in or zooming out.\n      && lastAutoInterval > interval\n      // If the axis change is caused by chart resize, the cache should not\n      // be used. Otherwise some hidden labels might not be shown again.\n      && cache.axisExtent0 === axisExtent[0] && cache.axisExtent1 === axisExtent[1]) {\n        interval = lastAutoInterval;\n      }\n      // Only update cache if cache not used, otherwise the\n      // changing of interval is too insensitive.\n      else {\n        cache.lastTickCount = tickCount;\n        cache.lastAutoInterval = interval;\n        cache.axisExtent0 = axisExtent[0];\n        cache.axisExtent1 = axisExtent[1];\n      }\n      return interval;\n    }\n    function fetchAutoCategoryIntervalCalculationParams(axis) {\n      var labelModel = axis.getLabelModel();\n      return {\n        axisRotate: axis.getRotate ? axis.getRotate() : axis.isHorizontal && !axis.isHorizontal() ? 90 : 0,\n        labelRotate: labelModel.get('rotate') || 0,\n        font: labelModel.getFont()\n      };\n    }\n    function makeLabelsByNumericCategoryInterval(axis, categoryInterval, onlyTick) {\n      var labelFormatter = makeLabelFormatter(axis);\n      var ordinalScale = axis.scale;\n      var ordinalExtent = ordinalScale.getExtent();\n      var labelModel = axis.getLabelModel();\n      var result = [];\n      // TODO: axisType: ordinalTime, pick the tick from each month/day/year/...\n      var step = Math.max((categoryInterval || 0) + 1, 1);\n      var startTick = ordinalExtent[0];\n      var tickCount = ordinalScale.count();\n      // Calculate start tick based on zero if possible to keep label consistent\n      // while zooming and moving while interval > 0. Otherwise the selection\n      // of displayable ticks and symbols probably keep changing.\n      // 3 is empirical value.\n      if (startTick !== 0 && step > 1 && tickCount / step > 2) {\n        startTick = Math.round(Math.ceil(startTick / step) * step);\n      }\n      // (1) Only add min max label here but leave overlap checking\n      // to render stage, which also ensure the returned list\n      // suitable for splitLine and splitArea rendering.\n      // (2) Scales except category always contain min max label so\n      // do not need to perform this process.\n      var showAllLabel = shouldShowAllLabels(axis);\n      var includeMinLabel = labelModel.get('showMinLabel') || showAllLabel;\n      var includeMaxLabel = labelModel.get('showMaxLabel') || showAllLabel;\n      if (includeMinLabel && startTick !== ordinalExtent[0]) {\n        addItem(ordinalExtent[0]);\n      }\n      // Optimize: avoid generating large array by `ordinalScale.getTicks()`.\n      var tickValue = startTick;\n      for (; tickValue <= ordinalExtent[1]; tickValue += step) {\n        addItem(tickValue);\n      }\n      if (includeMaxLabel && tickValue - step !== ordinalExtent[1]) {\n        addItem(ordinalExtent[1]);\n      }\n      function addItem(tickValue) {\n        var tickObj = {\n          value: tickValue\n        };\n        result.push(onlyTick ? tickValue : {\n          formattedLabel: labelFormatter(tickObj),\n          rawLabel: ordinalScale.getLabel(tickObj),\n          tickValue: tickValue\n        });\n      }\n      return result;\n    }\n    function makeLabelsByCustomizedCategoryInterval(axis, categoryInterval, onlyTick) {\n      var ordinalScale = axis.scale;\n      var labelFormatter = makeLabelFormatter(axis);\n      var result = [];\n      each(ordinalScale.getTicks(), function (tick) {\n        var rawLabel = ordinalScale.getLabel(tick);\n        var tickValue = tick.value;\n        if (categoryInterval(tick.value, rawLabel)) {\n          result.push(onlyTick ? tickValue : {\n            formattedLabel: labelFormatter(tick),\n            rawLabel: rawLabel,\n            tickValue: tickValue\n          });\n        }\n      });\n      return result;\n    }\n\n    var NORMALIZED_EXTENT = [0, 1];\n    /**\r\n     * Base class of Axis.\r\n     */\n    var Axis = /** @class */function () {\n      function Axis(dim, scale, extent) {\n        this.onBand = false;\n        this.inverse = false;\n        this.dim = dim;\n        this.scale = scale;\n        this._extent = extent || [0, 0];\n      }\n      /**\r\n       * If axis extent contain given coord\r\n       */\n      Axis.prototype.contain = function (coord) {\n        var extent = this._extent;\n        var min = Math.min(extent[0], extent[1]);\n        var max = Math.max(extent[0], extent[1]);\n        return coord >= min && coord <= max;\n      };\n      /**\r\n       * If axis extent contain given data\r\n       */\n      Axis.prototype.containData = function (data) {\n        return this.scale.contain(data);\n      };\n      /**\r\n       * Get coord extent.\r\n       */\n      Axis.prototype.getExtent = function () {\n        return this._extent.slice();\n      };\n      /**\r\n       * Get precision used for formatting\r\n       */\n      Axis.prototype.getPixelPrecision = function (dataExtent) {\n        return getPixelPrecision(dataExtent || this.scale.getExtent(), this._extent);\n      };\n      /**\r\n       * Set coord extent\r\n       */\n      Axis.prototype.setExtent = function (start, end) {\n        var extent = this._extent;\n        extent[0] = start;\n        extent[1] = end;\n      };\n      /**\r\n       * Convert data to coord. Data is the rank if it has an ordinal scale\r\n       */\n      Axis.prototype.dataToCoord = function (data, clamp) {\n        var extent = this._extent;\n        var scale = this.scale;\n        data = scale.normalize(data);\n        if (this.onBand && scale.type === 'ordinal') {\n          extent = extent.slice();\n          fixExtentWithBands(extent, scale.count());\n        }\n        return linearMap(data, NORMALIZED_EXTENT, extent, clamp);\n      };\n      /**\r\n       * Convert coord to data. Data is the rank if it has an ordinal scale\r\n       */\n      Axis.prototype.coordToData = function (coord, clamp) {\n        var extent = this._extent;\n        var scale = this.scale;\n        if (this.onBand && scale.type === 'ordinal') {\n          extent = extent.slice();\n          fixExtentWithBands(extent, scale.count());\n        }\n        var t = linearMap(coord, extent, NORMALIZED_EXTENT, clamp);\n        return this.scale.scale(t);\n      };\n      /**\r\n       * Convert pixel point to data in axis\r\n       */\n      Axis.prototype.pointToData = function (point, clamp) {\n        // Should be implemented in derived class if necessary.\n        return;\n      };\n      /**\r\n       * Different from `zrUtil.map(axis.getTicks(), axis.dataToCoord, axis)`,\r\n       * `axis.getTicksCoords` considers `onBand`, which is used by\r\n       * `boundaryGap:true` of category axis and splitLine and splitArea.\r\n       * @param opt.tickModel default: axis.model.getModel('axisTick')\r\n       * @param opt.clamp If `true`, the first and the last\r\n       *        tick must be at the axis end points. Otherwise, clip ticks\r\n       *        that outside the axis extent.\r\n       */\n      Axis.prototype.getTicksCoords = function (opt) {\n        opt = opt || {};\n        var tickModel = opt.tickModel || this.getTickModel();\n        var result = createAxisTicks(this, tickModel);\n        var ticks = result.ticks;\n        var ticksCoords = map(ticks, function (tickVal) {\n          return {\n            coord: this.dataToCoord(this.scale.type === 'ordinal' ? this.scale.getRawOrdinalNumber(tickVal) : tickVal),\n            tickValue: tickVal\n          };\n        }, this);\n        var alignWithLabel = tickModel.get('alignWithLabel');\n        fixOnBandTicksCoords(this, ticksCoords, alignWithLabel, opt.clamp);\n        return ticksCoords;\n      };\n      Axis.prototype.getMinorTicksCoords = function () {\n        if (this.scale.type === 'ordinal') {\n          // Category axis doesn't support minor ticks\n          return [];\n        }\n        var minorTickModel = this.model.getModel('minorTick');\n        var splitNumber = minorTickModel.get('splitNumber');\n        // Protection.\n        if (!(splitNumber > 0 && splitNumber < 100)) {\n          splitNumber = 5;\n        }\n        var minorTicks = this.scale.getMinorTicks(splitNumber);\n        var minorTicksCoords = map(minorTicks, function (minorTicksGroup) {\n          return map(minorTicksGroup, function (minorTick) {\n            return {\n              coord: this.dataToCoord(minorTick),\n              tickValue: minorTick\n            };\n          }, this);\n        }, this);\n        return minorTicksCoords;\n      };\n      Axis.prototype.getViewLabels = function () {\n        return createAxisLabels(this).labels;\n      };\n      Axis.prototype.getLabelModel = function () {\n        return this.model.getModel('axisLabel');\n      };\n      /**\r\n       * Notice here we only get the default tick model. For splitLine\r\n       * or splitArea, we should pass the splitLineModel or splitAreaModel\r\n       * manually when calling `getTicksCoords`.\r\n       * In GL, this method may be overridden to:\r\n       * `axisModel.getModel('axisTick', grid3DModel.getModel('axisTick'));`\r\n       */\n      Axis.prototype.getTickModel = function () {\n        return this.model.getModel('axisTick');\n      };\n      /**\r\n       * Get width of band\r\n       */\n      Axis.prototype.getBandWidth = function () {\n        var axisExtent = this._extent;\n        var dataExtent = this.scale.getExtent();\n        var len = dataExtent[1] - dataExtent[0] + (this.onBand ? 1 : 0);\n        // Fix #2728, avoid NaN when only one data.\n        len === 0 && (len = 1);\n        var size = Math.abs(axisExtent[1] - axisExtent[0]);\n        return Math.abs(size) / len;\n      };\n      /**\r\n       * Only be called in category axis.\r\n       * Can be overridden, consider other axes like in 3D.\r\n       * @return Auto interval for cateogry axis tick and label\r\n       */\n      Axis.prototype.calculateCategoryInterval = function () {\n        return calculateCategoryInterval(this);\n      };\n      return Axis;\n    }();\n    function fixExtentWithBands(extent, nTick) {\n      var size = extent[1] - extent[0];\n      var len = nTick;\n      var margin = size / len / 2;\n      extent[0] += margin;\n      extent[1] -= margin;\n    }\n    // If axis has labels [1, 2, 3, 4]. Bands on the axis are\n    // |---1---|---2---|---3---|---4---|.\n    // So the displayed ticks and splitLine/splitArea should between\n    // each data item, otherwise cause misleading (e.g., split tow bars\n    // of a single data item when there are two bar series).\n    // Also consider if tickCategoryInterval > 0 and onBand, ticks and\n    // splitLine/spliteArea should layout appropriately corresponding\n    // to displayed labels. (So we should not use `getBandWidth` in this\n    // case).\n    function fixOnBandTicksCoords(axis, ticksCoords, alignWithLabel, clamp) {\n      var ticksLen = ticksCoords.length;\n      if (!axis.onBand || alignWithLabel || !ticksLen) {\n        return;\n      }\n      var axisExtent = axis.getExtent();\n      var last;\n      var diffSize;\n      if (ticksLen === 1) {\n        ticksCoords[0].coord = axisExtent[0];\n        last = ticksCoords[1] = {\n          coord: axisExtent[1],\n          tickValue: ticksCoords[0].tickValue\n        };\n      } else {\n        var crossLen = ticksCoords[ticksLen - 1].tickValue - ticksCoords[0].tickValue;\n        var shift_1 = (ticksCoords[ticksLen - 1].coord - ticksCoords[0].coord) / crossLen;\n        each(ticksCoords, function (ticksItem) {\n          ticksItem.coord -= shift_1 / 2;\n        });\n        var dataExtent = axis.scale.getExtent();\n        diffSize = 1 + dataExtent[1] - ticksCoords[ticksLen - 1].tickValue;\n        last = {\n          coord: ticksCoords[ticksLen - 1].coord + shift_1 * diffSize,\n          tickValue: dataExtent[1] + 1\n        };\n        ticksCoords.push(last);\n      }\n      var inverse = axisExtent[0] > axisExtent[1];\n      // Handling clamp.\n      if (littleThan(ticksCoords[0].coord, axisExtent[0])) {\n        clamp ? ticksCoords[0].coord = axisExtent[0] : ticksCoords.shift();\n      }\n      if (clamp && littleThan(axisExtent[0], ticksCoords[0].coord)) {\n        ticksCoords.unshift({\n          coord: axisExtent[0]\n        });\n      }\n      if (littleThan(axisExtent[1], last.coord)) {\n        clamp ? last.coord = axisExtent[1] : ticksCoords.pop();\n      }\n      if (clamp && littleThan(last.coord, axisExtent[1])) {\n        ticksCoords.push({\n          coord: axisExtent[1]\n        });\n      }\n      function littleThan(a, b) {\n        // Avoid rounding error cause calculated tick coord different with extent.\n        // It may cause an extra unnecessary tick added.\n        a = round(a);\n        b = round(b);\n        return inverse ? a > b : a < b;\n      }\n    }\n\n    // --------------------- Deprecated Extension Methods ---------------------\n    // Should use `ComponentModel.extend` or `class XXXX extend ComponentModel` to create class.\n    // Then use `registerComponentModel` in `install` parameter when `use` this extension. For example:\n    // class Bar3DModel extends ComponentModel {}\n    // export function install(registers) { registers.registerComponentModel(Bar3DModel); }\n    // echarts.use(install);\n    function extendComponentModel(proto) {\n      var Model = ComponentModel.extend(proto);\n      ComponentModel.registerClass(Model);\n      return Model;\n    }\n    function extendComponentView(proto) {\n      var View = ComponentView.extend(proto);\n      ComponentView.registerClass(View);\n      return View;\n    }\n    function extendSeriesModel(proto) {\n      var Model = SeriesModel.extend(proto);\n      SeriesModel.registerClass(Model);\n      return Model;\n    }\n    function extendChartView(proto) {\n      var View = ChartView.extend(proto);\n      ChartView.registerClass(View);\n      return View;\n    }\n\n    var PI2$6 = Math.PI * 2;\n    var CMD$3 = PathProxy.CMD;\n    var DEFAULT_SEARCH_SPACE = ['top', 'right', 'bottom', 'left'];\n    function getCandidateAnchor(pos, distance, rect, outPt, outDir) {\n      var width = rect.width;\n      var height = rect.height;\n      switch (pos) {\n        case 'top':\n          outPt.set(rect.x + width / 2, rect.y - distance);\n          outDir.set(0, -1);\n          break;\n        case 'bottom':\n          outPt.set(rect.x + width / 2, rect.y + height + distance);\n          outDir.set(0, 1);\n          break;\n        case 'left':\n          outPt.set(rect.x - distance, rect.y + height / 2);\n          outDir.set(-1, 0);\n          break;\n        case 'right':\n          outPt.set(rect.x + width + distance, rect.y + height / 2);\n          outDir.set(1, 0);\n          break;\n      }\n    }\n    function projectPointToArc(cx, cy, r, startAngle, endAngle, anticlockwise, x, y, out) {\n      x -= cx;\n      y -= cy;\n      var d = Math.sqrt(x * x + y * y);\n      x /= d;\n      y /= d;\n      // Intersect point.\n      var ox = x * r + cx;\n      var oy = y * r + cy;\n      if (Math.abs(startAngle - endAngle) % PI2$6 < 1e-4) {\n        // Is a circle\n        out[0] = ox;\n        out[1] = oy;\n        return d - r;\n      }\n      if (anticlockwise) {\n        var tmp = startAngle;\n        startAngle = normalizeRadian(endAngle);\n        endAngle = normalizeRadian(tmp);\n      } else {\n        startAngle = normalizeRadian(startAngle);\n        endAngle = normalizeRadian(endAngle);\n      }\n      if (startAngle > endAngle) {\n        endAngle += PI2$6;\n      }\n      var angle = Math.atan2(y, x);\n      if (angle < 0) {\n        angle += PI2$6;\n      }\n      if (angle >= startAngle && angle <= endAngle || angle + PI2$6 >= startAngle && angle + PI2$6 <= endAngle) {\n        // Project point is on the arc.\n        out[0] = ox;\n        out[1] = oy;\n        return d - r;\n      }\n      var x1 = r * Math.cos(startAngle) + cx;\n      var y1 = r * Math.sin(startAngle) + cy;\n      var x2 = r * Math.cos(endAngle) + cx;\n      var y2 = r * Math.sin(endAngle) + cy;\n      var d1 = (x1 - x) * (x1 - x) + (y1 - y) * (y1 - y);\n      var d2 = (x2 - x) * (x2 - x) + (y2 - y) * (y2 - y);\n      if (d1 < d2) {\n        out[0] = x1;\n        out[1] = y1;\n        return Math.sqrt(d1);\n      } else {\n        out[0] = x2;\n        out[1] = y2;\n        return Math.sqrt(d2);\n      }\n    }\n    function projectPointToLine(x1, y1, x2, y2, x, y, out, limitToEnds) {\n      var dx = x - x1;\n      var dy = y - y1;\n      var dx1 = x2 - x1;\n      var dy1 = y2 - y1;\n      var lineLen = Math.sqrt(dx1 * dx1 + dy1 * dy1);\n      dx1 /= lineLen;\n      dy1 /= lineLen;\n      // dot product\n      var projectedLen = dx * dx1 + dy * dy1;\n      var t = projectedLen / lineLen;\n      if (limitToEnds) {\n        t = Math.min(Math.max(t, 0), 1);\n      }\n      t *= lineLen;\n      var ox = out[0] = x1 + t * dx1;\n      var oy = out[1] = y1 + t * dy1;\n      return Math.sqrt((ox - x) * (ox - x) + (oy - y) * (oy - y));\n    }\n    function projectPointToRect(x1, y1, width, height, x, y, out) {\n      if (width < 0) {\n        x1 = x1 + width;\n        width = -width;\n      }\n      if (height < 0) {\n        y1 = y1 + height;\n        height = -height;\n      }\n      var x2 = x1 + width;\n      var y2 = y1 + height;\n      var ox = out[0] = Math.min(Math.max(x, x1), x2);\n      var oy = out[1] = Math.min(Math.max(y, y1), y2);\n      return Math.sqrt((ox - x) * (ox - x) + (oy - y) * (oy - y));\n    }\n    var tmpPt = [];\n    function nearestPointOnRect(pt, rect, out) {\n      var dist = projectPointToRect(rect.x, rect.y, rect.width, rect.height, pt.x, pt.y, tmpPt);\n      out.set(tmpPt[0], tmpPt[1]);\n      return dist;\n    }\n    /**\r\n     * Calculate min distance corresponding point.\r\n     * This method won't evaluate if point is in the path.\r\n     */\n    function nearestPointOnPath(pt, path, out) {\n      var xi = 0;\n      var yi = 0;\n      var x0 = 0;\n      var y0 = 0;\n      var x1;\n      var y1;\n      var minDist = Infinity;\n      var data = path.data;\n      var x = pt.x;\n      var y = pt.y;\n      for (var i = 0; i < data.length;) {\n        var cmd = data[i++];\n        if (i === 1) {\n          xi = data[i];\n          yi = data[i + 1];\n          x0 = xi;\n          y0 = yi;\n        }\n        var d = minDist;\n        switch (cmd) {\n          case CMD$3.M:\n            // moveTo 命令重新创建一个新的 subpath, 并且更新新的起点\n            // 在 closePath 的时候使用\n            x0 = data[i++];\n            y0 = data[i++];\n            xi = x0;\n            yi = y0;\n            break;\n          case CMD$3.L:\n            d = projectPointToLine(xi, yi, data[i], data[i + 1], x, y, tmpPt, true);\n            xi = data[i++];\n            yi = data[i++];\n            break;\n          case CMD$3.C:\n            d = cubicProjectPoint(xi, yi, data[i++], data[i++], data[i++], data[i++], data[i], data[i + 1], x, y, tmpPt);\n            xi = data[i++];\n            yi = data[i++];\n            break;\n          case CMD$3.Q:\n            d = quadraticProjectPoint(xi, yi, data[i++], data[i++], data[i], data[i + 1], x, y, tmpPt);\n            xi = data[i++];\n            yi = data[i++];\n            break;\n          case CMD$3.A:\n            // TODO Arc 判断的开销比较大\n            var cx = data[i++];\n            var cy = data[i++];\n            var rx = data[i++];\n            var ry = data[i++];\n            var theta = data[i++];\n            var dTheta = data[i++];\n            // TODO Arc 旋转\n            i += 1;\n            var anticlockwise = !!(1 - data[i++]);\n            x1 = Math.cos(theta) * rx + cx;\n            y1 = Math.sin(theta) * ry + cy;\n            // 不是直接使用 arc 命令\n            if (i <= 1) {\n              // 第一个命令起点还未定义\n              x0 = x1;\n              y0 = y1;\n            }\n            // zr 使用scale来模拟椭圆, 这里也对x做一定的缩放\n            var _x = (x - cx) * ry / rx + cx;\n            d = projectPointToArc(cx, cy, ry, theta, theta + dTheta, anticlockwise, _x, y, tmpPt);\n            xi = Math.cos(theta + dTheta) * rx + cx;\n            yi = Math.sin(theta + dTheta) * ry + cy;\n            break;\n          case CMD$3.R:\n            x0 = xi = data[i++];\n            y0 = yi = data[i++];\n            var width = data[i++];\n            var height = data[i++];\n            d = projectPointToRect(x0, y0, width, height, x, y, tmpPt);\n            break;\n          case CMD$3.Z:\n            d = projectPointToLine(xi, yi, x0, y0, x, y, tmpPt, true);\n            xi = x0;\n            yi = y0;\n            break;\n        }\n        if (d < minDist) {\n          minDist = d;\n          out.set(tmpPt[0], tmpPt[1]);\n        }\n      }\n      return minDist;\n    }\n    // Temporal variable for intermediate usage.\n    var pt0 = new Point();\n    var pt1 = new Point();\n    var pt2 = new Point();\n    var dir = new Point();\n    var dir2 = new Point();\n    /**\r\n     * Calculate a proper guide line based on the label position and graphic element definition\r\n     * @param label\r\n     * @param labelRect\r\n     * @param target\r\n     * @param targetRect\r\n     */\n    function updateLabelLinePoints(target, labelLineModel) {\n      if (!target) {\n        return;\n      }\n      var labelLine = target.getTextGuideLine();\n      var label = target.getTextContent();\n      // Needs to create text guide in each charts.\n      if (!(label && labelLine)) {\n        return;\n      }\n      var labelGuideConfig = target.textGuideLineConfig || {};\n      var points = [[0, 0], [0, 0], [0, 0]];\n      var searchSpace = labelGuideConfig.candidates || DEFAULT_SEARCH_SPACE;\n      var labelRect = label.getBoundingRect().clone();\n      labelRect.applyTransform(label.getComputedTransform());\n      var minDist = Infinity;\n      var anchorPoint = labelGuideConfig.anchor;\n      var targetTransform = target.getComputedTransform();\n      var targetInversedTransform = targetTransform && invert([], targetTransform);\n      var len = labelLineModel.get('length2') || 0;\n      if (anchorPoint) {\n        pt2.copy(anchorPoint);\n      }\n      for (var i = 0; i < searchSpace.length; i++) {\n        var candidate = searchSpace[i];\n        getCandidateAnchor(candidate, 0, labelRect, pt0, dir);\n        Point.scaleAndAdd(pt1, pt0, dir, len);\n        // Transform to target coord space.\n        pt1.transform(targetInversedTransform);\n        // Note: getBoundingRect will ensure the `path` being created.\n        var boundingRect = target.getBoundingRect();\n        var dist = anchorPoint ? anchorPoint.distance(pt1) : target instanceof Path ? nearestPointOnPath(pt1, target.path, pt2) : nearestPointOnRect(pt1, boundingRect, pt2);\n        // TODO pt2 is in the path\n        if (dist < minDist) {\n          minDist = dist;\n          // Transform back to global space.\n          pt1.transform(targetTransform);\n          pt2.transform(targetTransform);\n          pt2.toArray(points[0]);\n          pt1.toArray(points[1]);\n          pt0.toArray(points[2]);\n        }\n      }\n      limitTurnAngle(points, labelLineModel.get('minTurnAngle'));\n      labelLine.setShape({\n        points: points\n      });\n    }\n    // Temporal variable for the limitTurnAngle function\n    var tmpArr = [];\n    var tmpProjPoint = new Point();\n    /**\r\n     * Reduce the line segment attached to the label to limit the turn angle between two segments.\r\n     * @param linePoints\r\n     * @param minTurnAngle Radian of minimum turn angle. 0 - 180\r\n     */\n    function limitTurnAngle(linePoints, minTurnAngle) {\n      if (!(minTurnAngle <= 180 && minTurnAngle > 0)) {\n        return;\n      }\n      minTurnAngle = minTurnAngle / 180 * Math.PI;\n      // The line points can be\n      //      /pt1----pt2 (label)\n      //     /\n      // pt0/\n      pt0.fromArray(linePoints[0]);\n      pt1.fromArray(linePoints[1]);\n      pt2.fromArray(linePoints[2]);\n      Point.sub(dir, pt0, pt1);\n      Point.sub(dir2, pt2, pt1);\n      var len1 = dir.len();\n      var len2 = dir2.len();\n      if (len1 < 1e-3 || len2 < 1e-3) {\n        return;\n      }\n      dir.scale(1 / len1);\n      dir2.scale(1 / len2);\n      var angleCos = dir.dot(dir2);\n      var minTurnAngleCos = Math.cos(minTurnAngle);\n      if (minTurnAngleCos < angleCos) {\n        // Smaller than minTurnAngle\n        // Calculate project point of pt0 on pt1-pt2\n        var d = projectPointToLine(pt1.x, pt1.y, pt2.x, pt2.y, pt0.x, pt0.y, tmpArr, false);\n        tmpProjPoint.fromArray(tmpArr);\n        // Calculate new projected length with limited minTurnAngle and get the new connect point\n        tmpProjPoint.scaleAndAdd(dir2, d / Math.tan(Math.PI - minTurnAngle));\n        // Limit the new calculated connect point between pt1 and pt2.\n        var t = pt2.x !== pt1.x ? (tmpProjPoint.x - pt1.x) / (pt2.x - pt1.x) : (tmpProjPoint.y - pt1.y) / (pt2.y - pt1.y);\n        if (isNaN(t)) {\n          return;\n        }\n        if (t < 0) {\n          Point.copy(tmpProjPoint, pt1);\n        } else if (t > 1) {\n          Point.copy(tmpProjPoint, pt2);\n        }\n        tmpProjPoint.toArray(linePoints[1]);\n      }\n    }\n    /**\r\n     * Limit the angle of line and the surface\r\n     * @param maxSurfaceAngle Radian of minimum turn angle. 0 - 180. 0 is same direction to normal. 180 is opposite\r\n     */\n    function limitSurfaceAngle(linePoints, surfaceNormal, maxSurfaceAngle) {\n      if (!(maxSurfaceAngle <= 180 && maxSurfaceAngle > 0)) {\n        return;\n      }\n      maxSurfaceAngle = maxSurfaceAngle / 180 * Math.PI;\n      pt0.fromArray(linePoints[0]);\n      pt1.fromArray(linePoints[1]);\n      pt2.fromArray(linePoints[2]);\n      Point.sub(dir, pt1, pt0);\n      Point.sub(dir2, pt2, pt1);\n      var len1 = dir.len();\n      var len2 = dir2.len();\n      if (len1 < 1e-3 || len2 < 1e-3) {\n        return;\n      }\n      dir.scale(1 / len1);\n      dir2.scale(1 / len2);\n      var angleCos = dir.dot(surfaceNormal);\n      var maxSurfaceAngleCos = Math.cos(maxSurfaceAngle);\n      if (angleCos < maxSurfaceAngleCos) {\n        // Calculate project point of pt0 on pt1-pt2\n        var d = projectPointToLine(pt1.x, pt1.y, pt2.x, pt2.y, pt0.x, pt0.y, tmpArr, false);\n        tmpProjPoint.fromArray(tmpArr);\n        var HALF_PI = Math.PI / 2;\n        var angle2 = Math.acos(dir2.dot(surfaceNormal));\n        var newAngle = HALF_PI + angle2 - maxSurfaceAngle;\n        if (newAngle >= HALF_PI) {\n          // parallel\n          Point.copy(tmpProjPoint, pt2);\n        } else {\n          // Calculate new projected length with limited minTurnAngle and get the new connect point\n          tmpProjPoint.scaleAndAdd(dir2, d / Math.tan(Math.PI / 2 - newAngle));\n          // Limit the new calculated connect point between pt1 and pt2.\n          var t = pt2.x !== pt1.x ? (tmpProjPoint.x - pt1.x) / (pt2.x - pt1.x) : (tmpProjPoint.y - pt1.y) / (pt2.y - pt1.y);\n          if (isNaN(t)) {\n            return;\n          }\n          if (t < 0) {\n            Point.copy(tmpProjPoint, pt1);\n          } else if (t > 1) {\n            Point.copy(tmpProjPoint, pt2);\n          }\n        }\n        tmpProjPoint.toArray(linePoints[1]);\n      }\n    }\n    function setLabelLineState(labelLine, ignore, stateName, stateModel) {\n      var isNormal = stateName === 'normal';\n      var stateObj = isNormal ? labelLine : labelLine.ensureState(stateName);\n      // Make sure display.\n      stateObj.ignore = ignore;\n      // Set smooth\n      var smooth = stateModel.get('smooth');\n      if (smooth && smooth === true) {\n        smooth = 0.3;\n      }\n      stateObj.shape = stateObj.shape || {};\n      if (smooth > 0) {\n        stateObj.shape.smooth = smooth;\n      }\n      var styleObj = stateModel.getModel('lineStyle').getLineStyle();\n      isNormal ? labelLine.useStyle(styleObj) : stateObj.style = styleObj;\n    }\n    function buildLabelLinePath(path, shape) {\n      var smooth = shape.smooth;\n      var points = shape.points;\n      if (!points) {\n        return;\n      }\n      path.moveTo(points[0][0], points[0][1]);\n      if (smooth > 0 && points.length >= 3) {\n        var len1 = dist(points[0], points[1]);\n        var len2 = dist(points[1], points[2]);\n        if (!len1 || !len2) {\n          path.lineTo(points[1][0], points[1][1]);\n          path.lineTo(points[2][0], points[2][1]);\n          return;\n        }\n        var moveLen = Math.min(len1, len2) * smooth;\n        var midPoint0 = lerp([], points[1], points[0], moveLen / len1);\n        var midPoint2 = lerp([], points[1], points[2], moveLen / len2);\n        var midPoint1 = lerp([], midPoint0, midPoint2, 0.5);\n        path.bezierCurveTo(midPoint0[0], midPoint0[1], midPoint0[0], midPoint0[1], midPoint1[0], midPoint1[1]);\n        path.bezierCurveTo(midPoint2[0], midPoint2[1], midPoint2[0], midPoint2[1], points[2][0], points[2][1]);\n      } else {\n        for (var i = 1; i < points.length; i++) {\n          path.lineTo(points[i][0], points[i][1]);\n        }\n      }\n    }\n    /**\r\n     * Create a label line if necessary and set it's style.\r\n     */\n    function setLabelLineStyle(targetEl, statesModels, defaultStyle) {\n      var labelLine = targetEl.getTextGuideLine();\n      var label = targetEl.getTextContent();\n      if (!label) {\n        // Not show label line if there is no label.\n        if (labelLine) {\n          targetEl.removeTextGuideLine();\n        }\n        return;\n      }\n      var normalModel = statesModels.normal;\n      var showNormal = normalModel.get('show');\n      var labelIgnoreNormal = label.ignore;\n      for (var i = 0; i < DISPLAY_STATES.length; i++) {\n        var stateName = DISPLAY_STATES[i];\n        var stateModel = statesModels[stateName];\n        var isNormal = stateName === 'normal';\n        if (stateModel) {\n          var stateShow = stateModel.get('show');\n          var isLabelIgnored = isNormal ? labelIgnoreNormal : retrieve2(label.states[stateName] && label.states[stateName].ignore, labelIgnoreNormal);\n          if (isLabelIgnored // Not show when label is not shown in this state.\n          || !retrieve2(stateShow, showNormal) // Use normal state by default if not set.\n          ) {\n            var stateObj = isNormal ? labelLine : labelLine && labelLine.states[stateName];\n            if (stateObj) {\n              stateObj.ignore = true;\n            }\n            if (!!labelLine) {\n              setLabelLineState(labelLine, true, stateName, stateModel);\n            }\n            continue;\n          }\n          // Create labelLine if not exists\n          if (!labelLine) {\n            labelLine = new Polyline();\n            targetEl.setTextGuideLine(labelLine);\n            // Reset state of normal because it's new created.\n            // NOTE: NORMAL should always been the first!\n            if (!isNormal && (labelIgnoreNormal || !showNormal)) {\n              setLabelLineState(labelLine, true, 'normal', statesModels.normal);\n            }\n            // Use same state proxy.\n            if (targetEl.stateProxy) {\n              labelLine.stateProxy = targetEl.stateProxy;\n            }\n          }\n          setLabelLineState(labelLine, false, stateName, stateModel);\n        }\n      }\n      if (labelLine) {\n        defaults(labelLine.style, defaultStyle);\n        // Not fill.\n        labelLine.style.fill = null;\n        var showAbove = normalModel.get('showAbove');\n        var labelLineConfig = targetEl.textGuideLineConfig = targetEl.textGuideLineConfig || {};\n        labelLineConfig.showAbove = showAbove || false;\n        // Custom the buildPath.\n        labelLine.buildPath = buildLabelLinePath;\n      }\n    }\n    function getLabelLineStatesModels(itemModel, labelLineName) {\n      labelLineName = labelLineName || 'labelLine';\n      var statesModels = {\n        normal: itemModel.getModel(labelLineName)\n      };\n      for (var i = 0; i < SPECIAL_STATES.length; i++) {\n        var stateName = SPECIAL_STATES[i];\n        statesModels[stateName] = itemModel.getModel([stateName, labelLineName]);\n      }\n      return statesModels;\n    }\n\n    function prepareLayoutList(input) {\n      var list = [];\n      for (var i = 0; i < input.length; i++) {\n        var rawItem = input[i];\n        if (rawItem.defaultAttr.ignore) {\n          continue;\n        }\n        var label = rawItem.label;\n        var transform = label.getComputedTransform();\n        // NOTE: Get bounding rect after getComputedTransform, or label may not been updated by the host el.\n        var localRect = label.getBoundingRect();\n        var isAxisAligned = !transform || transform[1] < 1e-5 && transform[2] < 1e-5;\n        var minMargin = label.style.margin || 0;\n        var globalRect = localRect.clone();\n        globalRect.applyTransform(transform);\n        globalRect.x -= minMargin / 2;\n        globalRect.y -= minMargin / 2;\n        globalRect.width += minMargin;\n        globalRect.height += minMargin;\n        var obb = isAxisAligned ? new OrientedBoundingRect(localRect, transform) : null;\n        list.push({\n          label: label,\n          labelLine: rawItem.labelLine,\n          rect: globalRect,\n          localRect: localRect,\n          obb: obb,\n          priority: rawItem.priority,\n          defaultAttr: rawItem.defaultAttr,\n          layoutOption: rawItem.computedLayoutOption,\n          axisAligned: isAxisAligned,\n          transform: transform\n        });\n      }\n      return list;\n    }\n    function shiftLayout(list, xyDim, sizeDim, minBound, maxBound, balanceShift) {\n      var len = list.length;\n      if (len < 2) {\n        return;\n      }\n      list.sort(function (a, b) {\n        return a.rect[xyDim] - b.rect[xyDim];\n      });\n      var lastPos = 0;\n      var delta;\n      var adjusted = false;\n      var totalShifts = 0;\n      for (var i = 0; i < len; i++) {\n        var item = list[i];\n        var rect = item.rect;\n        delta = rect[xyDim] - lastPos;\n        if (delta < 0) {\n          // shiftForward(i, len, -delta);\n          rect[xyDim] -= delta;\n          item.label[xyDim] -= delta;\n          adjusted = true;\n        }\n        var shift = Math.max(-delta, 0);\n        totalShifts += shift;\n        lastPos = rect[xyDim] + rect[sizeDim];\n      }\n      if (totalShifts > 0 && balanceShift) {\n        // Shift back to make the distribution more equally.\n        shiftList(-totalShifts / len, 0, len);\n      }\n      // TODO bleedMargin?\n      var first = list[0];\n      var last = list[len - 1];\n      var minGap;\n      var maxGap;\n      updateMinMaxGap();\n      // If ends exceed two bounds, squeeze at most 80%, then take the gap of two bounds.\n      minGap < 0 && squeezeGaps(-minGap, 0.8);\n      maxGap < 0 && squeezeGaps(maxGap, 0.8);\n      updateMinMaxGap();\n      takeBoundsGap(minGap, maxGap, 1);\n      takeBoundsGap(maxGap, minGap, -1);\n      // Handle bailout when there is not enough space.\n      updateMinMaxGap();\n      if (minGap < 0) {\n        squeezeWhenBailout(-minGap);\n      }\n      if (maxGap < 0) {\n        squeezeWhenBailout(maxGap);\n      }\n      function updateMinMaxGap() {\n        minGap = first.rect[xyDim] - minBound;\n        maxGap = maxBound - last.rect[xyDim] - last.rect[sizeDim];\n      }\n      function takeBoundsGap(gapThisBound, gapOtherBound, moveDir) {\n        if (gapThisBound < 0) {\n          // Move from other gap if can.\n          var moveFromMaxGap = Math.min(gapOtherBound, -gapThisBound);\n          if (moveFromMaxGap > 0) {\n            shiftList(moveFromMaxGap * moveDir, 0, len);\n            var remained = moveFromMaxGap + gapThisBound;\n            if (remained < 0) {\n              squeezeGaps(-remained * moveDir, 1);\n            }\n          } else {\n            squeezeGaps(-gapThisBound * moveDir, 1);\n          }\n        }\n      }\n      function shiftList(delta, start, end) {\n        if (delta !== 0) {\n          adjusted = true;\n        }\n        for (var i = start; i < end; i++) {\n          var item = list[i];\n          var rect = item.rect;\n          rect[xyDim] += delta;\n          item.label[xyDim] += delta;\n        }\n      }\n      // Squeeze gaps if the labels exceed margin.\n      function squeezeGaps(delta, maxSqeezePercent) {\n        var gaps = [];\n        var totalGaps = 0;\n        for (var i = 1; i < len; i++) {\n          var prevItemRect = list[i - 1].rect;\n          var gap = Math.max(list[i].rect[xyDim] - prevItemRect[xyDim] - prevItemRect[sizeDim], 0);\n          gaps.push(gap);\n          totalGaps += gap;\n        }\n        if (!totalGaps) {\n          return;\n        }\n        var squeezePercent = Math.min(Math.abs(delta) / totalGaps, maxSqeezePercent);\n        if (delta > 0) {\n          for (var i = 0; i < len - 1; i++) {\n            // Distribute the shift delta to all gaps.\n            var movement = gaps[i] * squeezePercent;\n            // Forward\n            shiftList(movement, 0, i + 1);\n          }\n        } else {\n          // Backward\n          for (var i = len - 1; i > 0; i--) {\n            // Distribute the shift delta to all gaps.\n            var movement = gaps[i - 1] * squeezePercent;\n            shiftList(-movement, i, len);\n          }\n        }\n      }\n      /**\r\n       * Squeeze to allow overlap if there is no more space available.\r\n       * Let other overlapping strategy like hideOverlap do the job instead of keep exceeding the bounds.\r\n       */\n      function squeezeWhenBailout(delta) {\n        var dir = delta < 0 ? -1 : 1;\n        delta = Math.abs(delta);\n        var moveForEachLabel = Math.ceil(delta / (len - 1));\n        for (var i = 0; i < len - 1; i++) {\n          if (dir > 0) {\n            // Forward\n            shiftList(moveForEachLabel, 0, i + 1);\n          } else {\n            // Backward\n            shiftList(-moveForEachLabel, len - i - 1, len);\n          }\n          delta -= moveForEachLabel;\n          if (delta <= 0) {\n            return;\n          }\n        }\n      }\n      return adjusted;\n    }\n    /**\r\n     * Adjust labels on x direction to avoid overlap.\r\n     */\n    function shiftLayoutOnX(list, leftBound, rightBound,\n    // If average the shifts on all labels and add them to 0\n    // TODO: Not sure if should enable it.\n    // Pros: The angle of lines will distribute more equally\n    // Cons: In some layout. It may not what user wanted. like in pie. the label of last sector is usually changed unexpectedly.\n    balanceShift) {\n      return shiftLayout(list, 'x', 'width', leftBound, rightBound, balanceShift);\n    }\n    /**\r\n     * Adjust labels on y direction to avoid overlap.\r\n     */\n    function shiftLayoutOnY(list, topBound, bottomBound,\n    // If average the shifts on all labels and add them to 0\n    balanceShift) {\n      return shiftLayout(list, 'y', 'height', topBound, bottomBound, balanceShift);\n    }\n    function hideOverlap(labelList) {\n      var displayedLabels = [];\n      // TODO, render overflow visible first, put in the displayedLabels.\n      labelList.sort(function (a, b) {\n        return b.priority - a.priority;\n      });\n      var globalRect = new BoundingRect(0, 0, 0, 0);\n      function hideEl(el) {\n        if (!el.ignore) {\n          // Show on emphasis.\n          var emphasisState = el.ensureState('emphasis');\n          if (emphasisState.ignore == null) {\n            emphasisState.ignore = false;\n          }\n        }\n        el.ignore = true;\n      }\n      for (var i = 0; i < labelList.length; i++) {\n        var labelItem = labelList[i];\n        var isAxisAligned = labelItem.axisAligned;\n        var localRect = labelItem.localRect;\n        var transform = labelItem.transform;\n        var label = labelItem.label;\n        var labelLine = labelItem.labelLine;\n        globalRect.copy(labelItem.rect);\n        // Add a threshold because layout may be aligned precisely.\n        globalRect.width -= 0.1;\n        globalRect.height -= 0.1;\n        globalRect.x += 0.05;\n        globalRect.y += 0.05;\n        var obb = labelItem.obb;\n        var overlapped = false;\n        for (var j = 0; j < displayedLabels.length; j++) {\n          var existsTextCfg = displayedLabels[j];\n          // Fast rejection.\n          if (!globalRect.intersect(existsTextCfg.rect)) {\n            continue;\n          }\n          if (isAxisAligned && existsTextCfg.axisAligned) {\n            // Is overlapped\n            overlapped = true;\n            break;\n          }\n          if (!existsTextCfg.obb) {\n            // If self is not axis aligned. But other is.\n            existsTextCfg.obb = new OrientedBoundingRect(existsTextCfg.localRect, existsTextCfg.transform);\n          }\n          if (!obb) {\n            // If self is axis aligned. But other is not.\n            obb = new OrientedBoundingRect(localRect, transform);\n          }\n          if (obb.intersect(existsTextCfg.obb)) {\n            overlapped = true;\n            break;\n          }\n        }\n        // TODO Callback to determine if this overlap should be handled?\n        if (overlapped) {\n          hideEl(label);\n          labelLine && hideEl(labelLine);\n        } else {\n          label.attr('ignore', labelItem.defaultAttr.ignore);\n          labelLine && labelLine.attr('ignore', labelItem.defaultAttr.labelGuideIgnore);\n          displayedLabels.push(labelItem);\n        }\n      }\n    }\n\n    function cloneArr(points) {\n      if (points) {\n        var newPoints = [];\n        for (var i = 0; i < points.length; i++) {\n          newPoints.push(points[i].slice());\n        }\n        return newPoints;\n      }\n    }\n    function prepareLayoutCallbackParams(labelItem, hostEl) {\n      var label = labelItem.label;\n      var labelLine = hostEl && hostEl.getTextGuideLine();\n      return {\n        dataIndex: labelItem.dataIndex,\n        dataType: labelItem.dataType,\n        seriesIndex: labelItem.seriesModel.seriesIndex,\n        text: labelItem.label.style.text,\n        rect: labelItem.hostRect,\n        labelRect: labelItem.rect,\n        // x: labelAttr.x,\n        // y: labelAttr.y,\n        align: label.style.align,\n        verticalAlign: label.style.verticalAlign,\n        labelLinePoints: cloneArr(labelLine && labelLine.shape.points)\n      };\n    }\n    var LABEL_OPTION_TO_STYLE_KEYS = ['align', 'verticalAlign', 'width', 'height', 'fontSize'];\n    var dummyTransformable = new Transformable();\n    var labelLayoutInnerStore = makeInner();\n    var labelLineAnimationStore = makeInner();\n    function extendWithKeys(target, source, keys) {\n      for (var i = 0; i < keys.length; i++) {\n        var key = keys[i];\n        if (source[key] != null) {\n          target[key] = source[key];\n        }\n      }\n    }\n    var LABEL_LAYOUT_PROPS = ['x', 'y', 'rotation'];\n    var LabelManager = /** @class */function () {\n      function LabelManager() {\n        this._labelList = [];\n        this._chartViewList = [];\n      }\n      LabelManager.prototype.clearLabels = function () {\n        this._labelList = [];\n        this._chartViewList = [];\n      };\n      /**\r\n       * Add label to manager\r\n       */\n      LabelManager.prototype._addLabel = function (dataIndex, dataType, seriesModel, label, layoutOption) {\n        var labelStyle = label.style;\n        var hostEl = label.__hostTarget;\n        var textConfig = hostEl.textConfig || {};\n        // TODO: If label is in other state.\n        var labelTransform = label.getComputedTransform();\n        var labelRect = label.getBoundingRect().plain();\n        BoundingRect.applyTransform(labelRect, labelRect, labelTransform);\n        if (labelTransform) {\n          dummyTransformable.setLocalTransform(labelTransform);\n        } else {\n          // Identity transform.\n          dummyTransformable.x = dummyTransformable.y = dummyTransformable.rotation = dummyTransformable.originX = dummyTransformable.originY = 0;\n          dummyTransformable.scaleX = dummyTransformable.scaleY = 1;\n        }\n        dummyTransformable.rotation = normalizeRadian(dummyTransformable.rotation);\n        var host = label.__hostTarget;\n        var hostRect;\n        if (host) {\n          hostRect = host.getBoundingRect().plain();\n          var transform = host.getComputedTransform();\n          BoundingRect.applyTransform(hostRect, hostRect, transform);\n        }\n        var labelGuide = hostRect && host.getTextGuideLine();\n        this._labelList.push({\n          label: label,\n          labelLine: labelGuide,\n          seriesModel: seriesModel,\n          dataIndex: dataIndex,\n          dataType: dataType,\n          layoutOption: layoutOption,\n          computedLayoutOption: null,\n          rect: labelRect,\n          hostRect: hostRect,\n          // Label with lower priority will be hidden when overlapped\n          // Use rect size as default priority\n          priority: hostRect ? hostRect.width * hostRect.height : 0,\n          // Save default label attributes.\n          // For restore if developers want get back to default value in callback.\n          defaultAttr: {\n            ignore: label.ignore,\n            labelGuideIgnore: labelGuide && labelGuide.ignore,\n            x: dummyTransformable.x,\n            y: dummyTransformable.y,\n            scaleX: dummyTransformable.scaleX,\n            scaleY: dummyTransformable.scaleY,\n            rotation: dummyTransformable.rotation,\n            style: {\n              x: labelStyle.x,\n              y: labelStyle.y,\n              align: labelStyle.align,\n              verticalAlign: labelStyle.verticalAlign,\n              width: labelStyle.width,\n              height: labelStyle.height,\n              fontSize: labelStyle.fontSize\n            },\n            cursor: label.cursor,\n            attachedPos: textConfig.position,\n            attachedRot: textConfig.rotation\n          }\n        });\n      };\n      LabelManager.prototype.addLabelsOfSeries = function (chartView) {\n        var _this = this;\n        this._chartViewList.push(chartView);\n        var seriesModel = chartView.__model;\n        var layoutOption = seriesModel.get('labelLayout');\n        /**\r\n         * Ignore layouting if it's not specified anything.\r\n         */\n        if (!(isFunction(layoutOption) || keys(layoutOption).length)) {\n          return;\n        }\n        chartView.group.traverse(function (child) {\n          if (child.ignore) {\n            return true; // Stop traverse descendants.\n          }\n          // Only support label being hosted on graphic elements.\n          var textEl = child.getTextContent();\n          var ecData = getECData(child);\n          // Can only attach the text on the element with dataIndex\n          if (textEl && !textEl.disableLabelLayout) {\n            _this._addLabel(ecData.dataIndex, ecData.dataType, seriesModel, textEl, layoutOption);\n          }\n        });\n      };\n      LabelManager.prototype.updateLayoutConfig = function (api) {\n        var width = api.getWidth();\n        var height = api.getHeight();\n        function createDragHandler(el, labelLineModel) {\n          return function () {\n            updateLabelLinePoints(el, labelLineModel);\n          };\n        }\n        for (var i = 0; i < this._labelList.length; i++) {\n          var labelItem = this._labelList[i];\n          var label = labelItem.label;\n          var hostEl = label.__hostTarget;\n          var defaultLabelAttr = labelItem.defaultAttr;\n          var layoutOption = void 0;\n          // TODO A global layout option?\n          if (isFunction(labelItem.layoutOption)) {\n            layoutOption = labelItem.layoutOption(prepareLayoutCallbackParams(labelItem, hostEl));\n          } else {\n            layoutOption = labelItem.layoutOption;\n          }\n          layoutOption = layoutOption || {};\n          labelItem.computedLayoutOption = layoutOption;\n          var degreeToRadian = Math.PI / 180;\n          // TODO hostEl should always exists.\n          // Or label should not have parent because the x, y is all in global space.\n          if (hostEl) {\n            hostEl.setTextConfig({\n              // Force to set local false.\n              local: false,\n              // Ignore position and rotation config on the host el if x or y is changed.\n              position: layoutOption.x != null || layoutOption.y != null ? null : defaultLabelAttr.attachedPos,\n              // Ignore rotation config on the host el if rotation is changed.\n              rotation: layoutOption.rotate != null ? layoutOption.rotate * degreeToRadian : defaultLabelAttr.attachedRot,\n              offset: [layoutOption.dx || 0, layoutOption.dy || 0]\n            });\n          }\n          var needsUpdateLabelLine = false;\n          if (layoutOption.x != null) {\n            // TODO width of chart view.\n            label.x = parsePercent$1(layoutOption.x, width);\n            label.setStyle('x', 0); // Ignore movement in style. TODO: origin.\n            needsUpdateLabelLine = true;\n          } else {\n            label.x = defaultLabelAttr.x;\n            label.setStyle('x', defaultLabelAttr.style.x);\n          }\n          if (layoutOption.y != null) {\n            // TODO height of chart view.\n            label.y = parsePercent$1(layoutOption.y, height);\n            label.setStyle('y', 0); // Ignore movement in style.\n            needsUpdateLabelLine = true;\n          } else {\n            label.y = defaultLabelAttr.y;\n            label.setStyle('y', defaultLabelAttr.style.y);\n          }\n          if (layoutOption.labelLinePoints) {\n            var guideLine = hostEl.getTextGuideLine();\n            if (guideLine) {\n              guideLine.setShape({\n                points: layoutOption.labelLinePoints\n              });\n              // Not update\n              needsUpdateLabelLine = false;\n            }\n          }\n          var labelLayoutStore = labelLayoutInnerStore(label);\n          labelLayoutStore.needsUpdateLabelLine = needsUpdateLabelLine;\n          label.rotation = layoutOption.rotate != null ? layoutOption.rotate * degreeToRadian : defaultLabelAttr.rotation;\n          label.scaleX = defaultLabelAttr.scaleX;\n          label.scaleY = defaultLabelAttr.scaleY;\n          for (var k = 0; k < LABEL_OPTION_TO_STYLE_KEYS.length; k++) {\n            var key = LABEL_OPTION_TO_STYLE_KEYS[k];\n            label.setStyle(key, layoutOption[key] != null ? layoutOption[key] : defaultLabelAttr.style[key]);\n          }\n          if (layoutOption.draggable) {\n            label.draggable = true;\n            label.cursor = 'move';\n            if (hostEl) {\n              var hostModel = labelItem.seriesModel;\n              if (labelItem.dataIndex != null) {\n                var data = labelItem.seriesModel.getData(labelItem.dataType);\n                hostModel = data.getItemModel(labelItem.dataIndex);\n              }\n              label.on('drag', createDragHandler(hostEl, hostModel.getModel('labelLine')));\n            }\n          } else {\n            // TODO Other drag functions?\n            label.off('drag');\n            label.cursor = defaultLabelAttr.cursor;\n          }\n        }\n      };\n      LabelManager.prototype.layout = function (api) {\n        var width = api.getWidth();\n        var height = api.getHeight();\n        var labelList = prepareLayoutList(this._labelList);\n        var labelsNeedsAdjustOnX = filter(labelList, function (item) {\n          return item.layoutOption.moveOverlap === 'shiftX';\n        });\n        var labelsNeedsAdjustOnY = filter(labelList, function (item) {\n          return item.layoutOption.moveOverlap === 'shiftY';\n        });\n        shiftLayoutOnX(labelsNeedsAdjustOnX, 0, width);\n        shiftLayoutOnY(labelsNeedsAdjustOnY, 0, height);\n        var labelsNeedsHideOverlap = filter(labelList, function (item) {\n          return item.layoutOption.hideOverlap;\n        });\n        hideOverlap(labelsNeedsHideOverlap);\n      };\n      /**\r\n       * Process all labels. Not only labels with layoutOption.\r\n       */\n      LabelManager.prototype.processLabelsOverall = function () {\n        var _this = this;\n        each(this._chartViewList, function (chartView) {\n          var seriesModel = chartView.__model;\n          var ignoreLabelLineUpdate = chartView.ignoreLabelLineUpdate;\n          var animationEnabled = seriesModel.isAnimationEnabled();\n          chartView.group.traverse(function (child) {\n            if (child.ignore && !child.forceLabelAnimation) {\n              return true; // Stop traverse descendants.\n            }\n            var needsUpdateLabelLine = !ignoreLabelLineUpdate;\n            var label = child.getTextContent();\n            if (!needsUpdateLabelLine && label) {\n              needsUpdateLabelLine = labelLayoutInnerStore(label).needsUpdateLabelLine;\n            }\n            if (needsUpdateLabelLine) {\n              _this._updateLabelLine(child, seriesModel);\n            }\n            if (animationEnabled) {\n              _this._animateLabels(child, seriesModel);\n            }\n          });\n        });\n      };\n      LabelManager.prototype._updateLabelLine = function (el, seriesModel) {\n        // Only support label being hosted on graphic elements.\n        var textEl = el.getTextContent();\n        // Update label line style.\n        var ecData = getECData(el);\n        var dataIndex = ecData.dataIndex;\n        // Only support labelLine on the labels represent data.\n        if (textEl && dataIndex != null) {\n          var data = seriesModel.getData(ecData.dataType);\n          var itemModel = data.getItemModel(dataIndex);\n          var defaultStyle = {};\n          var visualStyle = data.getItemVisual(dataIndex, 'style');\n          if (visualStyle) {\n            var visualType = data.getVisual('drawType');\n            // Default to be same with main color\n            defaultStyle.stroke = visualStyle[visualType];\n          }\n          var labelLineModel = itemModel.getModel('labelLine');\n          setLabelLineStyle(el, getLabelLineStatesModels(itemModel), defaultStyle);\n          updateLabelLinePoints(el, labelLineModel);\n        }\n      };\n      LabelManager.prototype._animateLabels = function (el, seriesModel) {\n        var textEl = el.getTextContent();\n        var guideLine = el.getTextGuideLine();\n        // Animate\n        if (textEl\n        // `forceLabelAnimation` has the highest priority\n        && (el.forceLabelAnimation || !textEl.ignore && !textEl.invisible && !el.disableLabelAnimation && !isElementRemoved(el))) {\n          var layoutStore = labelLayoutInnerStore(textEl);\n          var oldLayout = layoutStore.oldLayout;\n          var ecData = getECData(el);\n          var dataIndex = ecData.dataIndex;\n          var newProps = {\n            x: textEl.x,\n            y: textEl.y,\n            rotation: textEl.rotation\n          };\n          var data = seriesModel.getData(ecData.dataType);\n          if (!oldLayout) {\n            textEl.attr(newProps);\n            // Disable fade in animation if value animation is enabled.\n            if (!labelInner(textEl).valueAnimation) {\n              var oldOpacity = retrieve2(textEl.style.opacity, 1);\n              // Fade in animation\n              textEl.style.opacity = 0;\n              initProps(textEl, {\n                style: {\n                  opacity: oldOpacity\n                }\n              }, seriesModel, dataIndex);\n            }\n          } else {\n            textEl.attr(oldLayout);\n            // Make sure the animation from is in the right status.\n            var prevStates = el.prevStates;\n            if (prevStates) {\n              if (indexOf(prevStates, 'select') >= 0) {\n                textEl.attr(layoutStore.oldLayoutSelect);\n              }\n              if (indexOf(prevStates, 'emphasis') >= 0) {\n                textEl.attr(layoutStore.oldLayoutEmphasis);\n              }\n            }\n            updateProps(textEl, newProps, seriesModel, dataIndex);\n          }\n          layoutStore.oldLayout = newProps;\n          if (textEl.states.select) {\n            var layoutSelect = layoutStore.oldLayoutSelect = {};\n            extendWithKeys(layoutSelect, newProps, LABEL_LAYOUT_PROPS);\n            extendWithKeys(layoutSelect, textEl.states.select, LABEL_LAYOUT_PROPS);\n          }\n          if (textEl.states.emphasis) {\n            var layoutEmphasis = layoutStore.oldLayoutEmphasis = {};\n            extendWithKeys(layoutEmphasis, newProps, LABEL_LAYOUT_PROPS);\n            extendWithKeys(layoutEmphasis, textEl.states.emphasis, LABEL_LAYOUT_PROPS);\n          }\n          animateLabelValue(textEl, dataIndex, data, seriesModel, seriesModel);\n        }\n        if (guideLine && !guideLine.ignore && !guideLine.invisible) {\n          var layoutStore = labelLineAnimationStore(guideLine);\n          var oldLayout = layoutStore.oldLayout;\n          var newLayout = {\n            points: guideLine.shape.points\n          };\n          if (!oldLayout) {\n            guideLine.setShape(newLayout);\n            guideLine.style.strokePercent = 0;\n            initProps(guideLine, {\n              style: {\n                strokePercent: 1\n              }\n            }, seriesModel);\n          } else {\n            guideLine.attr({\n              shape: oldLayout\n            });\n            updateProps(guideLine, {\n              shape: newLayout\n            }, seriesModel);\n          }\n          layoutStore.oldLayout = newLayout;\n        }\n      };\n      return LabelManager;\n    }();\n\n    var getLabelManager = makeInner();\n    function installLabelLayout(registers) {\n      registers.registerUpdateLifecycle('series:beforeupdate', function (ecModel, api, params) {\n        // TODO api provide an namespace that can save stuff per instance\n        var labelManager = getLabelManager(api).labelManager;\n        if (!labelManager) {\n          labelManager = getLabelManager(api).labelManager = new LabelManager();\n        }\n        labelManager.clearLabels();\n      });\n      registers.registerUpdateLifecycle('series:layoutlabels', function (ecModel, api, params) {\n        var labelManager = getLabelManager(api).labelManager;\n        params.updatedSeries.forEach(function (series) {\n          labelManager.addLabelsOfSeries(api.getViewOfSeriesModel(series));\n        });\n        labelManager.updateLayoutConfig(api);\n        labelManager.layout(api);\n        labelManager.processLabelsOverall();\n      });\n    }\n\n    var mathSin$4 = Math.sin;\n    var mathCos$4 = Math.cos;\n    var PI$4 = Math.PI;\n    var PI2$7 = Math.PI * 2;\n    var degree = 180 / PI$4;\n    var SVGPathRebuilder = (function () {\n        function SVGPathRebuilder() {\n        }\n        SVGPathRebuilder.prototype.reset = function (precision) {\n            this._start = true;\n            this._d = [];\n            this._str = '';\n            this._p = Math.pow(10, precision || 4);\n        };\n        SVGPathRebuilder.prototype.moveTo = function (x, y) {\n            this._add('M', x, y);\n        };\n        SVGPathRebuilder.prototype.lineTo = function (x, y) {\n            this._add('L', x, y);\n        };\n        SVGPathRebuilder.prototype.bezierCurveTo = function (x, y, x2, y2, x3, y3) {\n            this._add('C', x, y, x2, y2, x3, y3);\n        };\n        SVGPathRebuilder.prototype.quadraticCurveTo = function (x, y, x2, y2) {\n            this._add('Q', x, y, x2, y2);\n        };\n        SVGPathRebuilder.prototype.arc = function (cx, cy, r, startAngle, endAngle, anticlockwise) {\n            this.ellipse(cx, cy, r, r, 0, startAngle, endAngle, anticlockwise);\n        };\n        SVGPathRebuilder.prototype.ellipse = function (cx, cy, rx, ry, psi, startAngle, endAngle, anticlockwise) {\n            var dTheta = endAngle - startAngle;\n            var clockwise = !anticlockwise;\n            var dThetaPositive = Math.abs(dTheta);\n            var isCircle = isAroundZero$1(dThetaPositive - PI2$7)\n                || (clockwise ? dTheta >= PI2$7 : -dTheta >= PI2$7);\n            var unifiedTheta = dTheta > 0 ? dTheta % PI2$7 : (dTheta % PI2$7 + PI2$7);\n            var large = false;\n            if (isCircle) {\n                large = true;\n            }\n            else if (isAroundZero$1(dThetaPositive)) {\n                large = false;\n            }\n            else {\n                large = (unifiedTheta >= PI$4) === !!clockwise;\n            }\n            var x0 = cx + rx * mathCos$4(startAngle);\n            var y0 = cy + ry * mathSin$4(startAngle);\n            if (this._start) {\n                this._add('M', x0, y0);\n            }\n            var xRot = Math.round(psi * degree);\n            if (isCircle) {\n                var p = 1 / this._p;\n                var dTheta_1 = (clockwise ? 1 : -1) * (PI2$7 - p);\n                this._add('A', rx, ry, xRot, 1, +clockwise, cx + rx * mathCos$4(startAngle + dTheta_1), cy + ry * mathSin$4(startAngle + dTheta_1));\n                if (p > 1e-2) {\n                    this._add('A', rx, ry, xRot, 0, +clockwise, x0, y0);\n                }\n            }\n            else {\n                var x = cx + rx * mathCos$4(endAngle);\n                var y = cy + ry * mathSin$4(endAngle);\n                this._add('A', rx, ry, xRot, +large, +clockwise, x, y);\n            }\n        };\n        SVGPathRebuilder.prototype.rect = function (x, y, w, h) {\n            this._add('M', x, y);\n            this._add('l', w, 0);\n            this._add('l', 0, h);\n            this._add('l', -w, 0);\n            this._add('Z');\n        };\n        SVGPathRebuilder.prototype.closePath = function () {\n            if (this._d.length > 0) {\n                this._add('Z');\n            }\n        };\n        SVGPathRebuilder.prototype._add = function (cmd, a, b, c, d, e, f, g, h) {\n            var vals = [];\n            var p = this._p;\n            for (var i = 1; i < arguments.length; i++) {\n                var val = arguments[i];\n                if (isNaN(val)) {\n                    this._invalid = true;\n                    return;\n                }\n                vals.push(Math.round(val * p) / p);\n            }\n            this._d.push(cmd + vals.join(' '));\n            this._start = cmd === 'Z';\n        };\n        SVGPathRebuilder.prototype.generateStr = function () {\n            this._str = this._invalid ? '' : this._d.join('');\n            this._d = [];\n        };\n        SVGPathRebuilder.prototype.getStr = function () {\n            return this._str;\n        };\n        return SVGPathRebuilder;\n    }());\n\n    var NONE = 'none';\n    var mathRound$1 = Math.round;\n    function pathHasFill(style) {\n        var fill = style.fill;\n        return fill != null && fill !== NONE;\n    }\n    function pathHasStroke(style) {\n        var stroke = style.stroke;\n        return stroke != null && stroke !== NONE;\n    }\n    var strokeProps = ['lineCap', 'miterLimit', 'lineJoin'];\n    var svgStrokeProps = map(strokeProps, function (prop) { return \"stroke-\" + prop.toLowerCase(); });\n    function mapStyleToAttrs(updateAttr, style, el, forceUpdate) {\n        var opacity = style.opacity == null ? 1 : style.opacity;\n        if (el instanceof ZRImage) {\n            updateAttr('opacity', opacity);\n            return;\n        }\n        if (pathHasFill(style)) {\n            var fill = normalizeColor(style.fill);\n            updateAttr('fill', fill.color);\n            var fillOpacity = style.fillOpacity != null\n                ? style.fillOpacity * fill.opacity * opacity\n                : fill.opacity * opacity;\n            if (forceUpdate || fillOpacity < 1) {\n                updateAttr('fill-opacity', fillOpacity);\n            }\n        }\n        else {\n            updateAttr('fill', NONE);\n        }\n        if (pathHasStroke(style)) {\n            var stroke = normalizeColor(style.stroke);\n            updateAttr('stroke', stroke.color);\n            var strokeScale = style.strokeNoScale\n                ? el.getLineScale()\n                : 1;\n            var strokeWidth = (strokeScale ? (style.lineWidth || 0) / strokeScale : 0);\n            var strokeOpacity = style.strokeOpacity != null\n                ? style.strokeOpacity * stroke.opacity * opacity\n                : stroke.opacity * opacity;\n            var strokeFirst = style.strokeFirst;\n            if (forceUpdate || strokeWidth !== 1) {\n                updateAttr('stroke-width', strokeWidth);\n            }\n            if (forceUpdate || strokeFirst) {\n                updateAttr('paint-order', strokeFirst ? 'stroke' : 'fill');\n            }\n            if (forceUpdate || strokeOpacity < 1) {\n                updateAttr('stroke-opacity', strokeOpacity);\n            }\n            if (style.lineDash) {\n                var _a = getLineDash(el), lineDash = _a[0], lineDashOffset = _a[1];\n                if (lineDash) {\n                    lineDashOffset = mathRound$1(lineDashOffset || 0);\n                    updateAttr('stroke-dasharray', lineDash.join(','));\n                    if (lineDashOffset || forceUpdate) {\n                        updateAttr('stroke-dashoffset', lineDashOffset);\n                    }\n                }\n            }\n            else if (forceUpdate) {\n                updateAttr('stroke-dasharray', NONE);\n            }\n            for (var i = 0; i < strokeProps.length; i++) {\n                var propName = strokeProps[i];\n                if (forceUpdate || style[propName] !== DEFAULT_PATH_STYLE[propName]) {\n                    var val = style[propName] || DEFAULT_PATH_STYLE[propName];\n                    val && updateAttr(svgStrokeProps[i], val);\n                }\n            }\n        }\n        else if (forceUpdate) {\n            updateAttr('stroke', NONE);\n        }\n    }\n\n    var SVGNS = 'http://www.w3.org/2000/svg';\n    var XLINKNS = 'http://www.w3.org/1999/xlink';\n    var XMLNS = 'http://www.w3.org/2000/xmlns/';\n    var XML_NAMESPACE = 'http://www.w3.org/XML/1998/namespace';\n    var META_DATA_PREFIX = 'ecmeta_';\n    function createElement(name) {\n        return document.createElementNS(SVGNS, name);\n    }\n    function createVNode(tag, key, attrs, children, text) {\n        return {\n            tag: tag,\n            attrs: attrs || {},\n            children: children,\n            text: text,\n            key: key\n        };\n    }\n    function createElementOpen(name, attrs) {\n        var attrsStr = [];\n        if (attrs) {\n            for (var key in attrs) {\n                var val = attrs[key];\n                var part = key;\n                if (val === false) {\n                    continue;\n                }\n                else if (val !== true && val != null) {\n                    part += \"=\\\"\" + val + \"\\\"\";\n                }\n                attrsStr.push(part);\n            }\n        }\n        return \"<\" + name + \" \" + attrsStr.join(' ') + \">\";\n    }\n    function createElementClose(name) {\n        return \"</\" + name + \">\";\n    }\n    function vNodeToString(el, opts) {\n        opts = opts || {};\n        var S = opts.newline ? '\\n' : '';\n        function convertElToString(el) {\n            var children = el.children, tag = el.tag, attrs = el.attrs, text = el.text;\n            return createElementOpen(tag, attrs)\n                + (tag !== 'style' ? encodeHTML(text) : text || '')\n                + (children ? \"\" + S + map(children, function (child) { return convertElToString(child); }).join(S) + S : '')\n                + createElementClose(tag);\n        }\n        return convertElToString(el);\n    }\n    function getCssString(selectorNodes, animationNodes, opts) {\n        opts = opts || {};\n        var S = opts.newline ? '\\n' : '';\n        var bracketBegin = \" {\" + S;\n        var bracketEnd = S + \"}\";\n        var selectors = map(keys(selectorNodes), function (className) {\n            return className + bracketBegin + map(keys(selectorNodes[className]), function (attrName) {\n                return attrName + \":\" + selectorNodes[className][attrName] + \";\";\n            }).join(S) + bracketEnd;\n        }).join(S);\n        var animations = map(keys(animationNodes), function (animationName) {\n            return \"@keyframes \" + animationName + bracketBegin + map(keys(animationNodes[animationName]), function (percent) {\n                return percent + bracketBegin + map(keys(animationNodes[animationName][percent]), function (attrName) {\n                    var val = animationNodes[animationName][percent][attrName];\n                    if (attrName === 'd') {\n                        val = \"path(\\\"\" + val + \"\\\")\";\n                    }\n                    return attrName + \":\" + val + \";\";\n                }).join(S) + bracketEnd;\n            }).join(S) + bracketEnd;\n        }).join(S);\n        if (!selectors && !animations) {\n            return '';\n        }\n        return ['<![CDATA[', selectors, animations, ']]>'].join(S);\n    }\n    function createBrushScope(zrId) {\n        return {\n            zrId: zrId,\n            shadowCache: {},\n            patternCache: {},\n            gradientCache: {},\n            clipPathCache: {},\n            defs: {},\n            cssNodes: {},\n            cssAnims: {},\n            cssStyleCache: {},\n            cssAnimIdx: 0,\n            shadowIdx: 0,\n            gradientIdx: 0,\n            patternIdx: 0,\n            clipPathIdx: 0\n        };\n    }\n    function createSVGVNode(width, height, children, useViewBox) {\n        return createVNode('svg', 'root', {\n            'width': width,\n            'height': height,\n            'xmlns': SVGNS,\n            'xmlns:xlink': XLINKNS,\n            'version': '1.1',\n            'baseProfile': 'full',\n            'viewBox': useViewBox ? \"0 0 \" + width + \" \" + height : false\n        }, children);\n    }\n\n    var cssClassIdx = 0;\n    function getClassId() {\n        return cssClassIdx++;\n    }\n\n    var EASING_MAP = {\n        cubicIn: '0.32,0,0.67,0',\n        cubicOut: '0.33,1,0.68,1',\n        cubicInOut: '0.65,0,0.35,1',\n        quadraticIn: '0.11,0,0.5,0',\n        quadraticOut: '0.5,1,0.89,1',\n        quadraticInOut: '0.45,0,0.55,1',\n        quarticIn: '0.5,0,0.75,0',\n        quarticOut: '0.25,1,0.5,1',\n        quarticInOut: '0.76,0,0.24,1',\n        quinticIn: '0.64,0,0.78,0',\n        quinticOut: '0.22,1,0.36,1',\n        quinticInOut: '0.83,0,0.17,1',\n        sinusoidalIn: '0.12,0,0.39,0',\n        sinusoidalOut: '0.61,1,0.88,1',\n        sinusoidalInOut: '0.37,0,0.63,1',\n        exponentialIn: '0.7,0,0.84,0',\n        exponentialOut: '0.16,1,0.3,1',\n        exponentialInOut: '0.87,0,0.13,1',\n        circularIn: '0.55,0,1,0.45',\n        circularOut: '0,0.55,0.45,1',\n        circularInOut: '0.85,0,0.15,1'\n    };\n    var transformOriginKey = 'transform-origin';\n    function buildPathString(el, kfShape, path) {\n        var shape = extend({}, el.shape);\n        extend(shape, kfShape);\n        el.buildPath(path, shape);\n        var svgPathBuilder = new SVGPathRebuilder();\n        svgPathBuilder.reset(getPathPrecision(el));\n        path.rebuildPath(svgPathBuilder, 1);\n        svgPathBuilder.generateStr();\n        return svgPathBuilder.getStr();\n    }\n    function setTransformOrigin(target, transform) {\n        var originX = transform.originX, originY = transform.originY;\n        if (originX || originY) {\n            target[transformOriginKey] = originX + \"px \" + originY + \"px\";\n        }\n    }\n    var ANIMATE_STYLE_MAP = {\n        fill: 'fill',\n        opacity: 'opacity',\n        lineWidth: 'stroke-width',\n        lineDashOffset: 'stroke-dashoffset'\n    };\n    function addAnimation(cssAnim, scope) {\n        var animationName = scope.zrId + '-ani-' + scope.cssAnimIdx++;\n        scope.cssAnims[animationName] = cssAnim;\n        return animationName;\n    }\n    function createCompoundPathCSSAnimation(el, attrs, scope) {\n        var paths = el.shape.paths;\n        var composedAnim = {};\n        var cssAnimationCfg;\n        var cssAnimationName;\n        each(paths, function (path) {\n            var subScope = createBrushScope(scope.zrId);\n            subScope.animation = true;\n            createCSSAnimation(path, {}, subScope, true);\n            var cssAnims = subScope.cssAnims;\n            var cssNodes = subScope.cssNodes;\n            var animNames = keys(cssAnims);\n            var len = animNames.length;\n            if (!len) {\n                return;\n            }\n            cssAnimationName = animNames[len - 1];\n            var lastAnim = cssAnims[cssAnimationName];\n            for (var percent in lastAnim) {\n                var kf = lastAnim[percent];\n                composedAnim[percent] = composedAnim[percent] || { d: '' };\n                composedAnim[percent].d += kf.d || '';\n            }\n            for (var className in cssNodes) {\n                var val = cssNodes[className].animation;\n                if (val.indexOf(cssAnimationName) >= 0) {\n                    cssAnimationCfg = val;\n                }\n            }\n        });\n        if (!cssAnimationCfg) {\n            return;\n        }\n        attrs.d = false;\n        var animationName = addAnimation(composedAnim, scope);\n        return cssAnimationCfg.replace(cssAnimationName, animationName);\n    }\n    function getEasingFunc(easing) {\n        return isString(easing)\n            ? EASING_MAP[easing]\n                ? \"cubic-bezier(\" + EASING_MAP[easing] + \")\"\n                : createCubicEasingFunc(easing) ? easing : ''\n            : '';\n    }\n    function createCSSAnimation(el, attrs, scope, onlyShape) {\n        var animators = el.animators;\n        var len = animators.length;\n        var cssAnimations = [];\n        if (el instanceof CompoundPath) {\n            var animationCfg = createCompoundPathCSSAnimation(el, attrs, scope);\n            if (animationCfg) {\n                cssAnimations.push(animationCfg);\n            }\n            else if (!len) {\n                return;\n            }\n        }\n        else if (!len) {\n            return;\n        }\n        var groupAnimators = {};\n        for (var i = 0; i < len; i++) {\n            var animator = animators[i];\n            var cfgArr = [animator.getMaxTime() / 1000 + 's'];\n            var easing = getEasingFunc(animator.getClip().easing);\n            var delay = animator.getDelay();\n            if (easing) {\n                cfgArr.push(easing);\n            }\n            else {\n                cfgArr.push('linear');\n            }\n            if (delay) {\n                cfgArr.push(delay / 1000 + 's');\n            }\n            if (animator.getLoop()) {\n                cfgArr.push('infinite');\n            }\n            var cfg = cfgArr.join(' ');\n            groupAnimators[cfg] = groupAnimators[cfg] || [cfg, []];\n            groupAnimators[cfg][1].push(animator);\n        }\n        function createSingleCSSAnimation(groupAnimator) {\n            var animators = groupAnimator[1];\n            var len = animators.length;\n            var transformKfs = {};\n            var shapeKfs = {};\n            var finalKfs = {};\n            var animationTimingFunctionAttrName = 'animation-timing-function';\n            function saveAnimatorTrackToCssKfs(animator, cssKfs, toCssAttrName) {\n                var tracks = animator.getTracks();\n                var maxTime = animator.getMaxTime();\n                for (var k = 0; k < tracks.length; k++) {\n                    var track = tracks[k];\n                    if (track.needsAnimate()) {\n                        var kfs = track.keyframes;\n                        var attrName = track.propName;\n                        toCssAttrName && (attrName = toCssAttrName(attrName));\n                        if (attrName) {\n                            for (var i = 0; i < kfs.length; i++) {\n                                var kf = kfs[i];\n                                var percent = Math.round(kf.time / maxTime * 100) + '%';\n                                var kfEasing = getEasingFunc(kf.easing);\n                                var rawValue = kf.rawValue;\n                                if (isString(rawValue) || isNumber(rawValue)) {\n                                    cssKfs[percent] = cssKfs[percent] || {};\n                                    cssKfs[percent][attrName] = kf.rawValue;\n                                    if (kfEasing) {\n                                        cssKfs[percent][animationTimingFunctionAttrName] = kfEasing;\n                                    }\n                                }\n                            }\n                        }\n                    }\n                }\n            }\n            for (var i = 0; i < len; i++) {\n                var animator = animators[i];\n                var targetProp = animator.targetName;\n                if (!targetProp) {\n                    !onlyShape && saveAnimatorTrackToCssKfs(animator, transformKfs);\n                }\n                else if (targetProp === 'shape') {\n                    saveAnimatorTrackToCssKfs(animator, shapeKfs);\n                }\n            }\n            for (var percent in transformKfs) {\n                var transform = {};\n                copyTransform(transform, el);\n                extend(transform, transformKfs[percent]);\n                var str = getSRTTransformString(transform);\n                var timingFunction = transformKfs[percent][animationTimingFunctionAttrName];\n                finalKfs[percent] = str ? {\n                    transform: str\n                } : {};\n                setTransformOrigin(finalKfs[percent], transform);\n                if (timingFunction) {\n                    finalKfs[percent][animationTimingFunctionAttrName] = timingFunction;\n                }\n            }\n            var path;\n            var canAnimateShape = true;\n            for (var percent in shapeKfs) {\n                finalKfs[percent] = finalKfs[percent] || {};\n                var isFirst = !path;\n                var timingFunction = shapeKfs[percent][animationTimingFunctionAttrName];\n                if (isFirst) {\n                    path = new PathProxy();\n                }\n                var len_1 = path.len();\n                path.reset();\n                finalKfs[percent].d = buildPathString(el, shapeKfs[percent], path);\n                var newLen = path.len();\n                if (!isFirst && len_1 !== newLen) {\n                    canAnimateShape = false;\n                    break;\n                }\n                if (timingFunction) {\n                    finalKfs[percent][animationTimingFunctionAttrName] = timingFunction;\n                }\n            }\n            if (!canAnimateShape) {\n                for (var percent in finalKfs) {\n                    delete finalKfs[percent].d;\n                }\n            }\n            if (!onlyShape) {\n                for (var i = 0; i < len; i++) {\n                    var animator = animators[i];\n                    var targetProp = animator.targetName;\n                    if (targetProp === 'style') {\n                        saveAnimatorTrackToCssKfs(animator, finalKfs, function (propName) { return ANIMATE_STYLE_MAP[propName]; });\n                    }\n                }\n            }\n            var percents = keys(finalKfs);\n            var allTransformOriginSame = true;\n            var transformOrigin;\n            for (var i = 1; i < percents.length; i++) {\n                var p0 = percents[i - 1];\n                var p1 = percents[i];\n                if (finalKfs[p0][transformOriginKey] !== finalKfs[p1][transformOriginKey]) {\n                    allTransformOriginSame = false;\n                    break;\n                }\n                transformOrigin = finalKfs[p0][transformOriginKey];\n            }\n            if (allTransformOriginSame && transformOrigin) {\n                for (var percent in finalKfs) {\n                    if (finalKfs[percent][transformOriginKey]) {\n                        delete finalKfs[percent][transformOriginKey];\n                    }\n                }\n                attrs[transformOriginKey] = transformOrigin;\n            }\n            if (filter(percents, function (percent) { return keys(finalKfs[percent]).length > 0; }).length) {\n                var animationName = addAnimation(finalKfs, scope);\n                return animationName + \" \" + groupAnimator[0] + \" both\";\n            }\n        }\n        for (var key in groupAnimators) {\n            var animationCfg = createSingleCSSAnimation(groupAnimators[key]);\n            if (animationCfg) {\n                cssAnimations.push(animationCfg);\n            }\n        }\n        if (cssAnimations.length) {\n            var className = scope.zrId + '-cls-' + getClassId();\n            scope.cssNodes['.' + className] = {\n                animation: cssAnimations.join(',')\n            };\n            attrs[\"class\"] = className;\n        }\n    }\n\n    function createCSSEmphasis(el, attrs, scope) {\n        if (!el.ignore) {\n            if (el.isSilent()) {\n                var style = {\n                    'pointer-events': 'none'\n                };\n                setClassAttribute(style, attrs, scope, true);\n            }\n            else {\n                var emphasisStyle = el.states.emphasis && el.states.emphasis.style\n                    ? el.states.emphasis.style\n                    : {};\n                var fill = emphasisStyle.fill;\n                if (!fill) {\n                    var normalFill = el.style && el.style.fill;\n                    var selectFill = el.states.select\n                        && el.states.select.style\n                        && el.states.select.style.fill;\n                    var fromFill = el.currentStates.indexOf('select') >= 0\n                        ? (selectFill || normalFill)\n                        : normalFill;\n                    if (fromFill) {\n                        fill = liftColor(fromFill);\n                    }\n                }\n                var lineWidth = emphasisStyle.lineWidth;\n                if (lineWidth) {\n                    var scaleX = (!emphasisStyle.strokeNoScale && el.transform)\n                        ? el.transform[0]\n                        : 1;\n                    lineWidth = lineWidth / scaleX;\n                }\n                var style = {\n                    cursor: 'pointer'\n                };\n                if (fill) {\n                    style.fill = fill;\n                }\n                if (emphasisStyle.stroke) {\n                    style.stroke = emphasisStyle.stroke;\n                }\n                if (lineWidth) {\n                    style['stroke-width'] = lineWidth;\n                }\n                setClassAttribute(style, attrs, scope, true);\n            }\n        }\n    }\n    function setClassAttribute(style, attrs, scope, withHover) {\n        var styleKey = JSON.stringify(style);\n        var className = scope.cssStyleCache[styleKey];\n        if (!className) {\n            className = scope.zrId + '-cls-' + getClassId();\n            scope.cssStyleCache[styleKey] = className;\n            scope.cssNodes['.' + className + (withHover ? ':hover' : '')] = style;\n        }\n        attrs[\"class\"] = attrs[\"class\"] ? (attrs[\"class\"] + ' ' + className) : className;\n    }\n\n    var round$2 = Math.round;\n    function isImageLike$1(val) {\n        return val && isString(val.src);\n    }\n    function isCanvasLike(val) {\n        return val && isFunction(val.toDataURL);\n    }\n    function setStyleAttrs(attrs, style, el, scope) {\n        mapStyleToAttrs(function (key, val) {\n            var isFillStroke = key === 'fill' || key === 'stroke';\n            if (isFillStroke && isGradient(val)) {\n                setGradient(style, attrs, key, scope);\n            }\n            else if (isFillStroke && isPattern(val)) {\n                setPattern(el, attrs, key, scope);\n            }\n            else {\n                attrs[key] = val;\n            }\n            if (isFillStroke && scope.ssr && val === 'none') {\n                attrs['pointer-events'] = 'visible';\n            }\n        }, style, el, false);\n        setShadow(el, attrs, scope);\n    }\n    function setMetaData(attrs, el) {\n        var metaData = getElementSSRData(el);\n        if (metaData) {\n            metaData.each(function (val, key) {\n                val != null && (attrs[(META_DATA_PREFIX + key).toLowerCase()] = val + '');\n            });\n            if (el.isSilent()) {\n                attrs[META_DATA_PREFIX + 'silent'] = 'true';\n            }\n        }\n    }\n    function noRotateScale(m) {\n        return isAroundZero$1(m[0] - 1)\n            && isAroundZero$1(m[1])\n            && isAroundZero$1(m[2])\n            && isAroundZero$1(m[3] - 1);\n    }\n    function noTranslate(m) {\n        return isAroundZero$1(m[4]) && isAroundZero$1(m[5]);\n    }\n    function setTransform(attrs, m, compress) {\n        if (m && !(noTranslate(m) && noRotateScale(m))) {\n            var mul = compress ? 10 : 1e4;\n            attrs.transform = noRotateScale(m)\n                ? \"translate(\" + round$2(m[4] * mul) / mul + \" \" + round$2(m[5] * mul) / mul + \")\" : getMatrixStr(m);\n        }\n    }\n    function convertPolyShape(shape, attrs, mul) {\n        var points = shape.points;\n        var strArr = [];\n        for (var i = 0; i < points.length; i++) {\n            strArr.push(round$2(points[i][0] * mul) / mul);\n            strArr.push(round$2(points[i][1] * mul) / mul);\n        }\n        attrs.points = strArr.join(' ');\n    }\n    function validatePolyShape(shape) {\n        return !shape.smooth;\n    }\n    function createAttrsConvert(desc) {\n        var normalizedDesc = map(desc, function (item) {\n            return (typeof item === 'string' ? [item, item] : item);\n        });\n        return function (shape, attrs, mul) {\n            for (var i = 0; i < normalizedDesc.length; i++) {\n                var item = normalizedDesc[i];\n                var val = shape[item[0]];\n                if (val != null) {\n                    attrs[item[1]] = round$2(val * mul) / mul;\n                }\n            }\n        };\n    }\n    var builtinShapesDef = {\n        circle: [createAttrsConvert(['cx', 'cy', 'r'])],\n        polyline: [convertPolyShape, validatePolyShape],\n        polygon: [convertPolyShape, validatePolyShape]\n    };\n    function hasShapeAnimation(el) {\n        var animators = el.animators;\n        for (var i = 0; i < animators.length; i++) {\n            if (animators[i].targetName === 'shape') {\n                return true;\n            }\n        }\n        return false;\n    }\n    function brushSVGPath(el, scope) {\n        var style = el.style;\n        var shape = el.shape;\n        var builtinShpDef = builtinShapesDef[el.type];\n        var attrs = {};\n        var needsAnimate = scope.animation;\n        var svgElType = 'path';\n        var strokePercent = el.style.strokePercent;\n        var precision = (scope.compress && getPathPrecision(el)) || 4;\n        if (builtinShpDef\n            && !scope.willUpdate\n            && !(builtinShpDef[1] && !builtinShpDef[1](shape))\n            && !(needsAnimate && hasShapeAnimation(el))\n            && !(strokePercent < 1)) {\n            svgElType = el.type;\n            var mul = Math.pow(10, precision);\n            builtinShpDef[0](shape, attrs, mul);\n        }\n        else {\n            var needBuildPath = !el.path || el.shapeChanged();\n            if (!el.path) {\n                el.createPathProxy();\n            }\n            var path = el.path;\n            if (needBuildPath) {\n                path.beginPath();\n                el.buildPath(path, el.shape);\n                el.pathUpdated();\n            }\n            var pathVersion = path.getVersion();\n            var elExt = el;\n            var svgPathBuilder = elExt.__svgPathBuilder;\n            if (elExt.__svgPathVersion !== pathVersion\n                || !svgPathBuilder\n                || strokePercent !== elExt.__svgPathStrokePercent) {\n                if (!svgPathBuilder) {\n                    svgPathBuilder = elExt.__svgPathBuilder = new SVGPathRebuilder();\n                }\n                svgPathBuilder.reset(precision);\n                path.rebuildPath(svgPathBuilder, strokePercent);\n                svgPathBuilder.generateStr();\n                elExt.__svgPathVersion = pathVersion;\n                elExt.__svgPathStrokePercent = strokePercent;\n            }\n            attrs.d = svgPathBuilder.getStr();\n        }\n        setTransform(attrs, el.transform);\n        setStyleAttrs(attrs, style, el, scope);\n        setMetaData(attrs, el);\n        scope.animation && createCSSAnimation(el, attrs, scope);\n        scope.emphasis && createCSSEmphasis(el, attrs, scope);\n        return createVNode(svgElType, el.id + '', attrs);\n    }\n    function brushSVGImage(el, scope) {\n        var style = el.style;\n        var image = style.image;\n        if (image && !isString(image)) {\n            if (isImageLike$1(image)) {\n                image = image.src;\n            }\n            else if (isCanvasLike(image)) {\n                image = image.toDataURL();\n            }\n        }\n        if (!image) {\n            return;\n        }\n        var x = style.x || 0;\n        var y = style.y || 0;\n        var dw = style.width;\n        var dh = style.height;\n        var attrs = {\n            href: image,\n            width: dw,\n            height: dh\n        };\n        if (x) {\n            attrs.x = x;\n        }\n        if (y) {\n            attrs.y = y;\n        }\n        setTransform(attrs, el.transform);\n        setStyleAttrs(attrs, style, el, scope);\n        setMetaData(attrs, el);\n        scope.animation && createCSSAnimation(el, attrs, scope);\n        return createVNode('image', el.id + '', attrs);\n    }\n    function brushSVGTSpan(el, scope) {\n        var style = el.style;\n        var text = style.text;\n        text != null && (text += '');\n        if (!text || isNaN(style.x) || isNaN(style.y)) {\n            return;\n        }\n        var font = style.font || DEFAULT_FONT;\n        var x = style.x || 0;\n        var y = adjustTextY(style.y || 0, getLineHeight(font), style.textBaseline);\n        var textAlign = TEXT_ALIGN_TO_ANCHOR[style.textAlign]\n            || style.textAlign;\n        var attrs = {\n            'dominant-baseline': 'central',\n            'text-anchor': textAlign\n        };\n        if (hasSeparateFont(style)) {\n            var separatedFontStr = '';\n            var fontStyle = style.fontStyle;\n            var fontSize = parseFontSize(style.fontSize);\n            if (!parseFloat(fontSize)) {\n                return;\n            }\n            var fontFamily = style.fontFamily || DEFAULT_FONT_FAMILY;\n            var fontWeight = style.fontWeight;\n            separatedFontStr += \"font-size:\" + fontSize + \";font-family:\" + fontFamily + \";\";\n            if (fontStyle && fontStyle !== 'normal') {\n                separatedFontStr += \"font-style:\" + fontStyle + \";\";\n            }\n            if (fontWeight && fontWeight !== 'normal') {\n                separatedFontStr += \"font-weight:\" + fontWeight + \";\";\n            }\n            attrs.style = separatedFontStr;\n        }\n        else {\n            attrs.style = \"font: \" + font;\n        }\n        if (text.match(/\\s/)) {\n            attrs['xml:space'] = 'preserve';\n        }\n        if (x) {\n            attrs.x = x;\n        }\n        if (y) {\n            attrs.y = y;\n        }\n        setTransform(attrs, el.transform);\n        setStyleAttrs(attrs, style, el, scope);\n        setMetaData(attrs, el);\n        scope.animation && createCSSAnimation(el, attrs, scope);\n        return createVNode('text', el.id + '', attrs, undefined, text);\n    }\n    function brush$1(el, scope) {\n        if (el instanceof Path) {\n            return brushSVGPath(el, scope);\n        }\n        else if (el instanceof ZRImage) {\n            return brushSVGImage(el, scope);\n        }\n        else if (el instanceof TSpan) {\n            return brushSVGTSpan(el, scope);\n        }\n    }\n    function setShadow(el, attrs, scope) {\n        var style = el.style;\n        if (hasShadow(style)) {\n            var shadowKey = getShadowKey(el);\n            var shadowCache = scope.shadowCache;\n            var shadowId = shadowCache[shadowKey];\n            if (!shadowId) {\n                var globalScale = el.getGlobalScale();\n                var scaleX = globalScale[0];\n                var scaleY = globalScale[1];\n                if (!scaleX || !scaleY) {\n                    return;\n                }\n                var offsetX = style.shadowOffsetX || 0;\n                var offsetY = style.shadowOffsetY || 0;\n                var blur_1 = style.shadowBlur;\n                var _a = normalizeColor(style.shadowColor), opacity = _a.opacity, color = _a.color;\n                var stdDx = blur_1 / 2 / scaleX;\n                var stdDy = blur_1 / 2 / scaleY;\n                var stdDeviation = stdDx + ' ' + stdDy;\n                shadowId = scope.zrId + '-s' + scope.shadowIdx++;\n                scope.defs[shadowId] = createVNode('filter', shadowId, {\n                    'id': shadowId,\n                    'x': '-100%',\n                    'y': '-100%',\n                    'width': '300%',\n                    'height': '300%'\n                }, [\n                    createVNode('feDropShadow', '', {\n                        'dx': offsetX / scaleX,\n                        'dy': offsetY / scaleY,\n                        'stdDeviation': stdDeviation,\n                        'flood-color': color,\n                        'flood-opacity': opacity\n                    })\n                ]);\n                shadowCache[shadowKey] = shadowId;\n            }\n            attrs.filter = getIdURL(shadowId);\n        }\n    }\n    function setGradient(style, attrs, target, scope) {\n        var val = style[target];\n        var gradientTag;\n        var gradientAttrs = {\n            'gradientUnits': val.global\n                ? 'userSpaceOnUse'\n                : 'objectBoundingBox'\n        };\n        if (isLinearGradient(val)) {\n            gradientTag = 'linearGradient';\n            gradientAttrs.x1 = val.x;\n            gradientAttrs.y1 = val.y;\n            gradientAttrs.x2 = val.x2;\n            gradientAttrs.y2 = val.y2;\n        }\n        else if (isRadialGradient(val)) {\n            gradientTag = 'radialGradient';\n            gradientAttrs.cx = retrieve2(val.x, 0.5);\n            gradientAttrs.cy = retrieve2(val.y, 0.5);\n            gradientAttrs.r = retrieve2(val.r, 0.5);\n        }\n        else {\n            if (\"development\" !== 'production') {\n                logError('Illegal gradient type.');\n            }\n            return;\n        }\n        var colors = val.colorStops;\n        var colorStops = [];\n        for (var i = 0, len = colors.length; i < len; ++i) {\n            var offset = round4(colors[i].offset) * 100 + '%';\n            var stopColor = colors[i].color;\n            var _a = normalizeColor(stopColor), color = _a.color, opacity = _a.opacity;\n            var stopsAttrs = {\n                'offset': offset\n            };\n            stopsAttrs['stop-color'] = color;\n            if (opacity < 1) {\n                stopsAttrs['stop-opacity'] = opacity;\n            }\n            colorStops.push(createVNode('stop', i + '', stopsAttrs));\n        }\n        var gradientVNode = createVNode(gradientTag, '', gradientAttrs, colorStops);\n        var gradientKey = vNodeToString(gradientVNode);\n        var gradientCache = scope.gradientCache;\n        var gradientId = gradientCache[gradientKey];\n        if (!gradientId) {\n            gradientId = scope.zrId + '-g' + scope.gradientIdx++;\n            gradientCache[gradientKey] = gradientId;\n            gradientAttrs.id = gradientId;\n            scope.defs[gradientId] = createVNode(gradientTag, gradientId, gradientAttrs, colorStops);\n        }\n        attrs[target] = getIdURL(gradientId);\n    }\n    function setPattern(el, attrs, target, scope) {\n        var val = el.style[target];\n        var boundingRect = el.getBoundingRect();\n        var patternAttrs = {};\n        var repeat = val.repeat;\n        var noRepeat = repeat === 'no-repeat';\n        var repeatX = repeat === 'repeat-x';\n        var repeatY = repeat === 'repeat-y';\n        var child;\n        if (isImagePattern(val)) {\n            var imageWidth_1 = val.imageWidth;\n            var imageHeight_1 = val.imageHeight;\n            var imageSrc = void 0;\n            var patternImage = val.image;\n            if (isString(patternImage)) {\n                imageSrc = patternImage;\n            }\n            else if (isImageLike$1(patternImage)) {\n                imageSrc = patternImage.src;\n            }\n            else if (isCanvasLike(patternImage)) {\n                imageSrc = patternImage.toDataURL();\n            }\n            if (typeof Image === 'undefined') {\n                var errMsg = 'Image width/height must been given explictly in svg-ssr renderer.';\n                assert(imageWidth_1, errMsg);\n                assert(imageHeight_1, errMsg);\n            }\n            else if (imageWidth_1 == null || imageHeight_1 == null) {\n                var setSizeToVNode_1 = function (vNode, img) {\n                    if (vNode) {\n                        var svgEl = vNode.elm;\n                        var width = imageWidth_1 || img.width;\n                        var height = imageHeight_1 || img.height;\n                        if (vNode.tag === 'pattern') {\n                            if (repeatX) {\n                                height = 1;\n                                width /= boundingRect.width;\n                            }\n                            else if (repeatY) {\n                                width = 1;\n                                height /= boundingRect.height;\n                            }\n                        }\n                        vNode.attrs.width = width;\n                        vNode.attrs.height = height;\n                        if (svgEl) {\n                            svgEl.setAttribute('width', width);\n                            svgEl.setAttribute('height', height);\n                        }\n                    }\n                };\n                var createdImage = createOrUpdateImage(imageSrc, null, el, function (img) {\n                    noRepeat || setSizeToVNode_1(patternVNode, img);\n                    setSizeToVNode_1(child, img);\n                });\n                if (createdImage && createdImage.width && createdImage.height) {\n                    imageWidth_1 = imageWidth_1 || createdImage.width;\n                    imageHeight_1 = imageHeight_1 || createdImage.height;\n                }\n            }\n            child = createVNode('image', 'img', {\n                href: imageSrc,\n                width: imageWidth_1,\n                height: imageHeight_1\n            });\n            patternAttrs.width = imageWidth_1;\n            patternAttrs.height = imageHeight_1;\n        }\n        else if (val.svgElement) {\n            child = clone(val.svgElement);\n            patternAttrs.width = val.svgWidth;\n            patternAttrs.height = val.svgHeight;\n        }\n        if (!child) {\n            return;\n        }\n        var patternWidth;\n        var patternHeight;\n        if (noRepeat) {\n            patternWidth = patternHeight = 1;\n        }\n        else if (repeatX) {\n            patternHeight = 1;\n            patternWidth = patternAttrs.width / boundingRect.width;\n        }\n        else if (repeatY) {\n            patternWidth = 1;\n            patternHeight = patternAttrs.height / boundingRect.height;\n        }\n        else {\n            patternAttrs.patternUnits = 'userSpaceOnUse';\n        }\n        if (patternWidth != null && !isNaN(patternWidth)) {\n            patternAttrs.width = patternWidth;\n        }\n        if (patternHeight != null && !isNaN(patternHeight)) {\n            patternAttrs.height = patternHeight;\n        }\n        var patternTransform = getSRTTransformString(val);\n        patternTransform && (patternAttrs.patternTransform = patternTransform);\n        var patternVNode = createVNode('pattern', '', patternAttrs, [child]);\n        var patternKey = vNodeToString(patternVNode);\n        var patternCache = scope.patternCache;\n        var patternId = patternCache[patternKey];\n        if (!patternId) {\n            patternId = scope.zrId + '-p' + scope.patternIdx++;\n            patternCache[patternKey] = patternId;\n            patternAttrs.id = patternId;\n            patternVNode = scope.defs[patternId] = createVNode('pattern', patternId, patternAttrs, [child]);\n        }\n        attrs[target] = getIdURL(patternId);\n    }\n    function setClipPath(clipPath, attrs, scope) {\n        var clipPathCache = scope.clipPathCache, defs = scope.defs;\n        var clipPathId = clipPathCache[clipPath.id];\n        if (!clipPathId) {\n            clipPathId = scope.zrId + '-c' + scope.clipPathIdx++;\n            var clipPathAttrs = {\n                id: clipPathId\n            };\n            clipPathCache[clipPath.id] = clipPathId;\n            defs[clipPathId] = createVNode('clipPath', clipPathId, clipPathAttrs, [brushSVGPath(clipPath, scope)]);\n        }\n        attrs['clip-path'] = getIdURL(clipPathId);\n    }\n\n    function createTextNode(text) {\n        return document.createTextNode(text);\n    }\n    function insertBefore(parentNode, newNode, referenceNode) {\n        parentNode.insertBefore(newNode, referenceNode);\n    }\n    function removeChild(node, child) {\n        node.removeChild(child);\n    }\n    function appendChild(node, child) {\n        node.appendChild(child);\n    }\n    function parentNode(node) {\n        return node.parentNode;\n    }\n    function nextSibling(node) {\n        return node.nextSibling;\n    }\n    function setTextContent(node, text) {\n        node.textContent = text;\n    }\n\n    var colonChar = 58;\n    var xChar = 120;\n    var emptyNode = createVNode('', '');\n    function isUndef(s) {\n        return s === undefined;\n    }\n    function isDef(s) {\n        return s !== undefined;\n    }\n    function createKeyToOldIdx(children, beginIdx, endIdx) {\n        var map = {};\n        for (var i = beginIdx; i <= endIdx; ++i) {\n            var key = children[i].key;\n            if (key !== undefined) {\n                if (\"development\" !== 'production') {\n                    if (map[key] != null) {\n                        console.error(\"Duplicate key \" + key);\n                    }\n                }\n                map[key] = i;\n            }\n        }\n        return map;\n    }\n    function sameVnode(vnode1, vnode2) {\n        var isSameKey = vnode1.key === vnode2.key;\n        var isSameTag = vnode1.tag === vnode2.tag;\n        return isSameTag && isSameKey;\n    }\n    function createElm(vnode) {\n        var i;\n        var children = vnode.children;\n        var tag = vnode.tag;\n        if (isDef(tag)) {\n            var elm = (vnode.elm = createElement(tag));\n            updateAttrs(emptyNode, vnode);\n            if (isArray(children)) {\n                for (i = 0; i < children.length; ++i) {\n                    var ch = children[i];\n                    if (ch != null) {\n                        appendChild(elm, createElm(ch));\n                    }\n                }\n            }\n            else if (isDef(vnode.text) && !isObject(vnode.text)) {\n                appendChild(elm, createTextNode(vnode.text));\n            }\n        }\n        else {\n            vnode.elm = createTextNode(vnode.text);\n        }\n        return vnode.elm;\n    }\n    function addVnodes(parentElm, before, vnodes, startIdx, endIdx) {\n        for (; startIdx <= endIdx; ++startIdx) {\n            var ch = vnodes[startIdx];\n            if (ch != null) {\n                insertBefore(parentElm, createElm(ch), before);\n            }\n        }\n    }\n    function removeVnodes(parentElm, vnodes, startIdx, endIdx) {\n        for (; startIdx <= endIdx; ++startIdx) {\n            var ch = vnodes[startIdx];\n            if (ch != null) {\n                if (isDef(ch.tag)) {\n                    var parent_1 = parentNode(ch.elm);\n                    removeChild(parent_1, ch.elm);\n                }\n                else {\n                    removeChild(parentElm, ch.elm);\n                }\n            }\n        }\n    }\n    function updateAttrs(oldVnode, vnode) {\n        var key;\n        var elm = vnode.elm;\n        var oldAttrs = oldVnode && oldVnode.attrs || {};\n        var attrs = vnode.attrs || {};\n        if (oldAttrs === attrs) {\n            return;\n        }\n        for (key in attrs) {\n            var cur = attrs[key];\n            var old = oldAttrs[key];\n            if (old !== cur) {\n                if (cur === true) {\n                    elm.setAttribute(key, '');\n                }\n                else if (cur === false) {\n                    elm.removeAttribute(key);\n                }\n                else {\n                    if (key === 'style') {\n                        elm.style.cssText = cur;\n                    }\n                    else if (key.charCodeAt(0) !== xChar) {\n                        elm.setAttribute(key, cur);\n                    }\n                    else if (key === 'xmlns:xlink' || key === 'xmlns') {\n                        elm.setAttributeNS(XMLNS, key, cur);\n                    }\n                    else if (key.charCodeAt(3) === colonChar) {\n                        elm.setAttributeNS(XML_NAMESPACE, key, cur);\n                    }\n                    else if (key.charCodeAt(5) === colonChar) {\n                        elm.setAttributeNS(XLINKNS, key, cur);\n                    }\n                    else {\n                        elm.setAttribute(key, cur);\n                    }\n                }\n            }\n        }\n        for (key in oldAttrs) {\n            if (!(key in attrs)) {\n                elm.removeAttribute(key);\n            }\n        }\n    }\n    function updateChildren(parentElm, oldCh, newCh) {\n        var oldStartIdx = 0;\n        var newStartIdx = 0;\n        var oldEndIdx = oldCh.length - 1;\n        var oldStartVnode = oldCh[0];\n        var oldEndVnode = oldCh[oldEndIdx];\n        var newEndIdx = newCh.length - 1;\n        var newStartVnode = newCh[0];\n        var newEndVnode = newCh[newEndIdx];\n        var oldKeyToIdx;\n        var idxInOld;\n        var elmToMove;\n        var before;\n        while (oldStartIdx <= oldEndIdx && newStartIdx <= newEndIdx) {\n            if (oldStartVnode == null) {\n                oldStartVnode = oldCh[++oldStartIdx];\n            }\n            else if (oldEndVnode == null) {\n                oldEndVnode = oldCh[--oldEndIdx];\n            }\n            else if (newStartVnode == null) {\n                newStartVnode = newCh[++newStartIdx];\n            }\n            else if (newEndVnode == null) {\n                newEndVnode = newCh[--newEndIdx];\n            }\n            else if (sameVnode(oldStartVnode, newStartVnode)) {\n                patchVnode(oldStartVnode, newStartVnode);\n                oldStartVnode = oldCh[++oldStartIdx];\n                newStartVnode = newCh[++newStartIdx];\n            }\n            else if (sameVnode(oldEndVnode, newEndVnode)) {\n                patchVnode(oldEndVnode, newEndVnode);\n                oldEndVnode = oldCh[--oldEndIdx];\n                newEndVnode = newCh[--newEndIdx];\n            }\n            else if (sameVnode(oldStartVnode, newEndVnode)) {\n                patchVnode(oldStartVnode, newEndVnode);\n                insertBefore(parentElm, oldStartVnode.elm, nextSibling(oldEndVnode.elm));\n                oldStartVnode = oldCh[++oldStartIdx];\n                newEndVnode = newCh[--newEndIdx];\n            }\n            else if (sameVnode(oldEndVnode, newStartVnode)) {\n                patchVnode(oldEndVnode, newStartVnode);\n                insertBefore(parentElm, oldEndVnode.elm, oldStartVnode.elm);\n                oldEndVnode = oldCh[--oldEndIdx];\n                newStartVnode = newCh[++newStartIdx];\n            }\n            else {\n                if (isUndef(oldKeyToIdx)) {\n                    oldKeyToIdx = createKeyToOldIdx(oldCh, oldStartIdx, oldEndIdx);\n                }\n                idxInOld = oldKeyToIdx[newStartVnode.key];\n                if (isUndef(idxInOld)) {\n                    insertBefore(parentElm, createElm(newStartVnode), oldStartVnode.elm);\n                }\n                else {\n                    elmToMove = oldCh[idxInOld];\n                    if (elmToMove.tag !== newStartVnode.tag) {\n                        insertBefore(parentElm, createElm(newStartVnode), oldStartVnode.elm);\n                    }\n                    else {\n                        patchVnode(elmToMove, newStartVnode);\n                        oldCh[idxInOld] = undefined;\n                        insertBefore(parentElm, elmToMove.elm, oldStartVnode.elm);\n                    }\n                }\n                newStartVnode = newCh[++newStartIdx];\n            }\n        }\n        if (oldStartIdx <= oldEndIdx || newStartIdx <= newEndIdx) {\n            if (oldStartIdx > oldEndIdx) {\n                before = newCh[newEndIdx + 1] == null ? null : newCh[newEndIdx + 1].elm;\n                addVnodes(parentElm, before, newCh, newStartIdx, newEndIdx);\n            }\n            else {\n                removeVnodes(parentElm, oldCh, oldStartIdx, oldEndIdx);\n            }\n        }\n    }\n    function patchVnode(oldVnode, vnode) {\n        var elm = (vnode.elm = oldVnode.elm);\n        var oldCh = oldVnode.children;\n        var ch = vnode.children;\n        if (oldVnode === vnode) {\n            return;\n        }\n        updateAttrs(oldVnode, vnode);\n        if (isUndef(vnode.text)) {\n            if (isDef(oldCh) && isDef(ch)) {\n                if (oldCh !== ch) {\n                    updateChildren(elm, oldCh, ch);\n                }\n            }\n            else if (isDef(ch)) {\n                if (isDef(oldVnode.text)) {\n                    setTextContent(elm, '');\n                }\n                addVnodes(elm, null, ch, 0, ch.length - 1);\n            }\n            else if (isDef(oldCh)) {\n                removeVnodes(elm, oldCh, 0, oldCh.length - 1);\n            }\n            else if (isDef(oldVnode.text)) {\n                setTextContent(elm, '');\n            }\n        }\n        else if (oldVnode.text !== vnode.text) {\n            if (isDef(oldCh)) {\n                removeVnodes(elm, oldCh, 0, oldCh.length - 1);\n            }\n            setTextContent(elm, vnode.text);\n        }\n    }\n    function patch(oldVnode, vnode) {\n        if (sameVnode(oldVnode, vnode)) {\n            patchVnode(oldVnode, vnode);\n        }\n        else {\n            var elm = oldVnode.elm;\n            var parent_2 = parentNode(elm);\n            createElm(vnode);\n            if (parent_2 !== null) {\n                insertBefore(parent_2, vnode.elm, nextSibling(elm));\n                removeVnodes(parent_2, [oldVnode], 0, 0);\n            }\n        }\n        return vnode;\n    }\n\n    var svgId = 0;\n    var SVGPainter = (function () {\n        function SVGPainter(root, storage, opts) {\n            this.type = 'svg';\n            this.refreshHover = createMethodNotSupport('refreshHover');\n            this.configLayer = createMethodNotSupport('configLayer');\n            this.storage = storage;\n            this._opts = opts = extend({}, opts);\n            this.root = root;\n            this._id = 'zr' + svgId++;\n            this._oldVNode = createSVGVNode(opts.width, opts.height);\n            if (root && !opts.ssr) {\n                var viewport = this._viewport = document.createElement('div');\n                viewport.style.cssText = 'position:relative;overflow:hidden';\n                var svgDom = this._svgDom = this._oldVNode.elm = createElement('svg');\n                updateAttrs(null, this._oldVNode);\n                viewport.appendChild(svgDom);\n                root.appendChild(viewport);\n            }\n            this.resize(opts.width, opts.height);\n        }\n        SVGPainter.prototype.getType = function () {\n            return this.type;\n        };\n        SVGPainter.prototype.getViewportRoot = function () {\n            return this._viewport;\n        };\n        SVGPainter.prototype.getViewportRootOffset = function () {\n            var viewportRoot = this.getViewportRoot();\n            if (viewportRoot) {\n                return {\n                    offsetLeft: viewportRoot.offsetLeft || 0,\n                    offsetTop: viewportRoot.offsetTop || 0\n                };\n            }\n        };\n        SVGPainter.prototype.getSvgDom = function () {\n            return this._svgDom;\n        };\n        SVGPainter.prototype.refresh = function () {\n            if (this.root) {\n                var vnode = this.renderToVNode({\n                    willUpdate: true\n                });\n                vnode.attrs.style = 'position:absolute;left:0;top:0;user-select:none';\n                patch(this._oldVNode, vnode);\n                this._oldVNode = vnode;\n            }\n        };\n        SVGPainter.prototype.renderOneToVNode = function (el) {\n            return brush$1(el, createBrushScope(this._id));\n        };\n        SVGPainter.prototype.renderToVNode = function (opts) {\n            opts = opts || {};\n            var list = this.storage.getDisplayList(true);\n            var width = this._width;\n            var height = this._height;\n            var scope = createBrushScope(this._id);\n            scope.animation = opts.animation;\n            scope.willUpdate = opts.willUpdate;\n            scope.compress = opts.compress;\n            scope.emphasis = opts.emphasis;\n            scope.ssr = this._opts.ssr;\n            var children = [];\n            var bgVNode = this._bgVNode = createBackgroundVNode(width, height, this._backgroundColor, scope);\n            bgVNode && children.push(bgVNode);\n            var mainVNode = !opts.compress\n                ? (this._mainVNode = createVNode('g', 'main', {}, [])) : null;\n            this._paintList(list, scope, mainVNode ? mainVNode.children : children);\n            mainVNode && children.push(mainVNode);\n            var defs = map(keys(scope.defs), function (id) { return scope.defs[id]; });\n            if (defs.length) {\n                children.push(createVNode('defs', 'defs', {}, defs));\n            }\n            if (opts.animation) {\n                var animationCssStr = getCssString(scope.cssNodes, scope.cssAnims, { newline: true });\n                if (animationCssStr) {\n                    var styleNode = createVNode('style', 'stl', {}, [], animationCssStr);\n                    children.push(styleNode);\n                }\n            }\n            return createSVGVNode(width, height, children, opts.useViewBox);\n        };\n        SVGPainter.prototype.renderToString = function (opts) {\n            opts = opts || {};\n            return vNodeToString(this.renderToVNode({\n                animation: retrieve2(opts.cssAnimation, true),\n                emphasis: retrieve2(opts.cssEmphasis, true),\n                willUpdate: false,\n                compress: true,\n                useViewBox: retrieve2(opts.useViewBox, true)\n            }), { newline: true });\n        };\n        SVGPainter.prototype.setBackgroundColor = function (backgroundColor) {\n            this._backgroundColor = backgroundColor;\n        };\n        SVGPainter.prototype.getSvgRoot = function () {\n            return this._mainVNode && this._mainVNode.elm;\n        };\n        SVGPainter.prototype._paintList = function (list, scope, out) {\n            var listLen = list.length;\n            var clipPathsGroupsStack = [];\n            var clipPathsGroupsStackDepth = 0;\n            var currentClipPathGroup;\n            var prevClipPaths;\n            var clipGroupNodeIdx = 0;\n            for (var i = 0; i < listLen; i++) {\n                var displayable = list[i];\n                if (!displayable.invisible) {\n                    var clipPaths = displayable.__clipPaths;\n                    var len = clipPaths && clipPaths.length || 0;\n                    var prevLen = prevClipPaths && prevClipPaths.length || 0;\n                    var lca = void 0;\n                    for (lca = Math.max(len - 1, prevLen - 1); lca >= 0; lca--) {\n                        if (clipPaths && prevClipPaths\n                            && clipPaths[lca] === prevClipPaths[lca]) {\n                            break;\n                        }\n                    }\n                    for (var i_1 = prevLen - 1; i_1 > lca; i_1--) {\n                        clipPathsGroupsStackDepth--;\n                        currentClipPathGroup = clipPathsGroupsStack[clipPathsGroupsStackDepth - 1];\n                    }\n                    for (var i_2 = lca + 1; i_2 < len; i_2++) {\n                        var groupAttrs = {};\n                        setClipPath(clipPaths[i_2], groupAttrs, scope);\n                        var g = createVNode('g', 'clip-g-' + clipGroupNodeIdx++, groupAttrs, []);\n                        (currentClipPathGroup ? currentClipPathGroup.children : out).push(g);\n                        clipPathsGroupsStack[clipPathsGroupsStackDepth++] = g;\n                        currentClipPathGroup = g;\n                    }\n                    prevClipPaths = clipPaths;\n                    var ret = brush$1(displayable, scope);\n                    if (ret) {\n                        (currentClipPathGroup ? currentClipPathGroup.children : out).push(ret);\n                    }\n                }\n            }\n        };\n        SVGPainter.prototype.resize = function (width, height) {\n            var opts = this._opts;\n            var root = this.root;\n            var viewport = this._viewport;\n            width != null && (opts.width = width);\n            height != null && (opts.height = height);\n            if (root && viewport) {\n                viewport.style.display = 'none';\n                width = getSize(root, 0, opts);\n                height = getSize(root, 1, opts);\n                viewport.style.display = '';\n            }\n            if (this._width !== width || this._height !== height) {\n                this._width = width;\n                this._height = height;\n                if (viewport) {\n                    var viewportStyle = viewport.style;\n                    viewportStyle.width = width + 'px';\n                    viewportStyle.height = height + 'px';\n                }\n                if (!isPattern(this._backgroundColor)) {\n                    var svgDom = this._svgDom;\n                    if (svgDom) {\n                        svgDom.setAttribute('width', width);\n                        svgDom.setAttribute('height', height);\n                    }\n                    var bgEl = this._bgVNode && this._bgVNode.elm;\n                    if (bgEl) {\n                        bgEl.setAttribute('width', width);\n                        bgEl.setAttribute('height', height);\n                    }\n                }\n                else {\n                    this.refresh();\n                }\n            }\n        };\n        SVGPainter.prototype.getWidth = function () {\n            return this._width;\n        };\n        SVGPainter.prototype.getHeight = function () {\n            return this._height;\n        };\n        SVGPainter.prototype.dispose = function () {\n            if (this.root) {\n                this.root.innerHTML = '';\n            }\n            this._svgDom =\n                this._viewport =\n                    this.storage =\n                        this._oldVNode =\n                            this._bgVNode =\n                                this._mainVNode = null;\n        };\n        SVGPainter.prototype.clear = function () {\n            if (this._svgDom) {\n                this._svgDom.innerHTML = null;\n            }\n            this._oldVNode = null;\n        };\n        SVGPainter.prototype.toDataURL = function (base64) {\n            var str = this.renderToString();\n            var prefix = 'data:image/svg+xml;';\n            if (base64) {\n                str = encodeBase64(str);\n                return str && prefix + 'base64,' + str;\n            }\n            return prefix + 'charset=UTF-8,' + encodeURIComponent(str);\n        };\n        return SVGPainter;\n    }());\n    function createMethodNotSupport(method) {\n        return function () {\n            if (\"development\" !== 'production') {\n                logError('In SVG mode painter not support method \"' + method + '\"');\n            }\n        };\n    }\n    function createBackgroundVNode(width, height, backgroundColor, scope) {\n        var bgVNode;\n        if (backgroundColor && backgroundColor !== 'none') {\n            bgVNode = createVNode('rect', 'bg', {\n                width: width,\n                height: height,\n                x: '0',\n                y: '0'\n            });\n            if (isGradient(backgroundColor)) {\n                setGradient({ fill: backgroundColor }, bgVNode.attrs, 'fill', scope);\n            }\n            else if (isPattern(backgroundColor)) {\n                setPattern({\n                    style: {\n                        fill: backgroundColor\n                    },\n                    dirty: noop,\n                    getBoundingRect: function () { return ({ width: width, height: height }); }\n                }, bgVNode.attrs, 'fill', scope);\n            }\n            else {\n                var _a = normalizeColor(backgroundColor), color = _a.color, opacity = _a.opacity;\n                bgVNode.attrs.fill = color;\n                opacity < 1 && (bgVNode.attrs['fill-opacity'] = opacity);\n            }\n        }\n        return bgVNode;\n    }\n\n    function install(registers) {\n      registers.registerPainter('svg', SVGPainter);\n    }\n\n    function createDom(id, painter, dpr) {\n        var newDom = platformApi.createCanvas();\n        var width = painter.getWidth();\n        var height = painter.getHeight();\n        var newDomStyle = newDom.style;\n        if (newDomStyle) {\n            newDomStyle.position = 'absolute';\n            newDomStyle.left = '0';\n            newDomStyle.top = '0';\n            newDomStyle.width = width + 'px';\n            newDomStyle.height = height + 'px';\n            newDom.setAttribute('data-zr-dom-id', id);\n        }\n        newDom.width = width * dpr;\n        newDom.height = height * dpr;\n        return newDom;\n    }\n    var Layer = (function (_super) {\n        __extends(Layer, _super);\n        function Layer(id, painter, dpr) {\n            var _this = _super.call(this) || this;\n            _this.motionBlur = false;\n            _this.lastFrameAlpha = 0.7;\n            _this.dpr = 1;\n            _this.virtual = false;\n            _this.config = {};\n            _this.incremental = false;\n            _this.zlevel = 0;\n            _this.maxRepaintRectCount = 5;\n            _this.__dirty = true;\n            _this.__firstTimePaint = true;\n            _this.__used = false;\n            _this.__drawIndex = 0;\n            _this.__startIndex = 0;\n            _this.__endIndex = 0;\n            _this.__prevStartIndex = null;\n            _this.__prevEndIndex = null;\n            var dom;\n            dpr = dpr || devicePixelRatio;\n            if (typeof id === 'string') {\n                dom = createDom(id, painter, dpr);\n            }\n            else if (isObject(id)) {\n                dom = id;\n                id = dom.id;\n            }\n            _this.id = id;\n            _this.dom = dom;\n            var domStyle = dom.style;\n            if (domStyle) {\n                disableUserSelect(dom);\n                dom.onselectstart = function () { return false; };\n                domStyle.padding = '0';\n                domStyle.margin = '0';\n                domStyle.borderWidth = '0';\n            }\n            _this.painter = painter;\n            _this.dpr = dpr;\n            return _this;\n        }\n        Layer.prototype.getElementCount = function () {\n            return this.__endIndex - this.__startIndex;\n        };\n        Layer.prototype.afterBrush = function () {\n            this.__prevStartIndex = this.__startIndex;\n            this.__prevEndIndex = this.__endIndex;\n        };\n        Layer.prototype.initContext = function () {\n            this.ctx = this.dom.getContext('2d');\n            this.ctx.dpr = this.dpr;\n        };\n        Layer.prototype.setUnpainted = function () {\n            this.__firstTimePaint = true;\n        };\n        Layer.prototype.createBackBuffer = function () {\n            var dpr = this.dpr;\n            this.domBack = createDom('back-' + this.id, this.painter, dpr);\n            this.ctxBack = this.domBack.getContext('2d');\n            if (dpr !== 1) {\n                this.ctxBack.scale(dpr, dpr);\n            }\n        };\n        Layer.prototype.createRepaintRects = function (displayList, prevList, viewWidth, viewHeight) {\n            if (this.__firstTimePaint) {\n                this.__firstTimePaint = false;\n                return null;\n            }\n            var mergedRepaintRects = [];\n            var maxRepaintRectCount = this.maxRepaintRectCount;\n            var full = false;\n            var pendingRect = new BoundingRect(0, 0, 0, 0);\n            function addRectToMergePool(rect) {\n                if (!rect.isFinite() || rect.isZero()) {\n                    return;\n                }\n                if (mergedRepaintRects.length === 0) {\n                    var boundingRect = new BoundingRect(0, 0, 0, 0);\n                    boundingRect.copy(rect);\n                    mergedRepaintRects.push(boundingRect);\n                }\n                else {\n                    var isMerged = false;\n                    var minDeltaArea = Infinity;\n                    var bestRectToMergeIdx = 0;\n                    for (var i = 0; i < mergedRepaintRects.length; ++i) {\n                        var mergedRect = mergedRepaintRects[i];\n                        if (mergedRect.intersect(rect)) {\n                            var pendingRect_1 = new BoundingRect(0, 0, 0, 0);\n                            pendingRect_1.copy(mergedRect);\n                            pendingRect_1.union(rect);\n                            mergedRepaintRects[i] = pendingRect_1;\n                            isMerged = true;\n                            break;\n                        }\n                        else if (full) {\n                            pendingRect.copy(rect);\n                            pendingRect.union(mergedRect);\n                            var aArea = rect.width * rect.height;\n                            var bArea = mergedRect.width * mergedRect.height;\n                            var pendingArea = pendingRect.width * pendingRect.height;\n                            var deltaArea = pendingArea - aArea - bArea;\n                            if (deltaArea < minDeltaArea) {\n                                minDeltaArea = deltaArea;\n                                bestRectToMergeIdx = i;\n                            }\n                        }\n                    }\n                    if (full) {\n                        mergedRepaintRects[bestRectToMergeIdx].union(rect);\n                        isMerged = true;\n                    }\n                    if (!isMerged) {\n                        var boundingRect = new BoundingRect(0, 0, 0, 0);\n                        boundingRect.copy(rect);\n                        mergedRepaintRects.push(boundingRect);\n                    }\n                    if (!full) {\n                        full = mergedRepaintRects.length >= maxRepaintRectCount;\n                    }\n                }\n            }\n            for (var i = this.__startIndex; i < this.__endIndex; ++i) {\n                var el = displayList[i];\n                if (el) {\n                    var shouldPaint = el.shouldBePainted(viewWidth, viewHeight, true, true);\n                    var prevRect = el.__isRendered && ((el.__dirty & REDRAW_BIT) || !shouldPaint)\n                        ? el.getPrevPaintRect()\n                        : null;\n                    if (prevRect) {\n                        addRectToMergePool(prevRect);\n                    }\n                    var curRect = shouldPaint && ((el.__dirty & REDRAW_BIT) || !el.__isRendered)\n                        ? el.getPaintRect()\n                        : null;\n                    if (curRect) {\n                        addRectToMergePool(curRect);\n                    }\n                }\n            }\n            for (var i = this.__prevStartIndex; i < this.__prevEndIndex; ++i) {\n                var el = prevList[i];\n                var shouldPaint = el && el.shouldBePainted(viewWidth, viewHeight, true, true);\n                if (el && (!shouldPaint || !el.__zr) && el.__isRendered) {\n                    var prevRect = el.getPrevPaintRect();\n                    if (prevRect) {\n                        addRectToMergePool(prevRect);\n                    }\n                }\n            }\n            var hasIntersections;\n            do {\n                hasIntersections = false;\n                for (var i = 0; i < mergedRepaintRects.length;) {\n                    if (mergedRepaintRects[i].isZero()) {\n                        mergedRepaintRects.splice(i, 1);\n                        continue;\n                    }\n                    for (var j = i + 1; j < mergedRepaintRects.length;) {\n                        if (mergedRepaintRects[i].intersect(mergedRepaintRects[j])) {\n                            hasIntersections = true;\n                            mergedRepaintRects[i].union(mergedRepaintRects[j]);\n                            mergedRepaintRects.splice(j, 1);\n                        }\n                        else {\n                            j++;\n                        }\n                    }\n                    i++;\n                }\n            } while (hasIntersections);\n            this._paintRects = mergedRepaintRects;\n            return mergedRepaintRects;\n        };\n        Layer.prototype.debugGetPaintRects = function () {\n            return (this._paintRects || []).slice();\n        };\n        Layer.prototype.resize = function (width, height) {\n            var dpr = this.dpr;\n            var dom = this.dom;\n            var domStyle = dom.style;\n            var domBack = this.domBack;\n            if (domStyle) {\n                domStyle.width = width + 'px';\n                domStyle.height = height + 'px';\n            }\n            dom.width = width * dpr;\n            dom.height = height * dpr;\n            if (domBack) {\n                domBack.width = width * dpr;\n                domBack.height = height * dpr;\n                if (dpr !== 1) {\n                    this.ctxBack.scale(dpr, dpr);\n                }\n            }\n        };\n        Layer.prototype.clear = function (clearAll, clearColor, repaintRects) {\n            var dom = this.dom;\n            var ctx = this.ctx;\n            var width = dom.width;\n            var height = dom.height;\n            clearColor = clearColor || this.clearColor;\n            var haveMotionBLur = this.motionBlur && !clearAll;\n            var lastFrameAlpha = this.lastFrameAlpha;\n            var dpr = this.dpr;\n            var self = this;\n            if (haveMotionBLur) {\n                if (!this.domBack) {\n                    this.createBackBuffer();\n                }\n                this.ctxBack.globalCompositeOperation = 'copy';\n                this.ctxBack.drawImage(dom, 0, 0, width / dpr, height / dpr);\n            }\n            var domBack = this.domBack;\n            function doClear(x, y, width, height) {\n                ctx.clearRect(x, y, width, height);\n                if (clearColor && clearColor !== 'transparent') {\n                    var clearColorGradientOrPattern = void 0;\n                    if (isGradientObject(clearColor)) {\n                        var shouldCache = clearColor.global || (clearColor.__width === width\n                            && clearColor.__height === height);\n                        clearColorGradientOrPattern = shouldCache\n                            && clearColor.__canvasGradient\n                            || getCanvasGradient(ctx, clearColor, {\n                                x: 0,\n                                y: 0,\n                                width: width,\n                                height: height\n                            });\n                        clearColor.__canvasGradient = clearColorGradientOrPattern;\n                        clearColor.__width = width;\n                        clearColor.__height = height;\n                    }\n                    else if (isImagePatternObject(clearColor)) {\n                        clearColor.scaleX = clearColor.scaleX || dpr;\n                        clearColor.scaleY = clearColor.scaleY || dpr;\n                        clearColorGradientOrPattern = createCanvasPattern(ctx, clearColor, {\n                            dirty: function () {\n                                self.setUnpainted();\n                                self.painter.refresh();\n                            }\n                        });\n                    }\n                    ctx.save();\n                    ctx.fillStyle = clearColorGradientOrPattern || clearColor;\n                    ctx.fillRect(x, y, width, height);\n                    ctx.restore();\n                }\n                if (haveMotionBLur) {\n                    ctx.save();\n                    ctx.globalAlpha = lastFrameAlpha;\n                    ctx.drawImage(domBack, x, y, width, height);\n                    ctx.restore();\n                }\n            }\n            if (!repaintRects || haveMotionBLur) {\n                doClear(0, 0, width, height);\n            }\n            else if (repaintRects.length) {\n                each(repaintRects, function (rect) {\n                    doClear(rect.x * dpr, rect.y * dpr, rect.width * dpr, rect.height * dpr);\n                });\n            }\n        };\n        return Layer;\n    }(Eventful));\n\n    var HOVER_LAYER_ZLEVEL = 1e5;\n    var CANVAS_ZLEVEL = 314159;\n    var EL_AFTER_INCREMENTAL_INC = 0.01;\n    var INCREMENTAL_INC = 0.001;\n    function isLayerValid(layer) {\n        if (!layer) {\n            return false;\n        }\n        if (layer.__builtin__) {\n            return true;\n        }\n        if (typeof (layer.resize) !== 'function'\n            || typeof (layer.refresh) !== 'function') {\n            return false;\n        }\n        return true;\n    }\n    function createRoot(width, height) {\n        var domRoot = document.createElement('div');\n        domRoot.style.cssText = [\n            'position:relative',\n            'width:' + width + 'px',\n            'height:' + height + 'px',\n            'padding:0',\n            'margin:0',\n            'border-width:0'\n        ].join(';') + ';';\n        return domRoot;\n    }\n    var CanvasPainter = (function () {\n        function CanvasPainter(root, storage, opts, id) {\n            this.type = 'canvas';\n            this._zlevelList = [];\n            this._prevDisplayList = [];\n            this._layers = {};\n            this._layerConfig = {};\n            this._needsManuallyCompositing = false;\n            this.type = 'canvas';\n            var singleCanvas = !root.nodeName\n                || root.nodeName.toUpperCase() === 'CANVAS';\n            this._opts = opts = extend({}, opts || {});\n            this.dpr = opts.devicePixelRatio || devicePixelRatio;\n            this._singleCanvas = singleCanvas;\n            this.root = root;\n            var rootStyle = root.style;\n            if (rootStyle) {\n                disableUserSelect(root);\n                root.innerHTML = '';\n            }\n            this.storage = storage;\n            var zlevelList = this._zlevelList;\n            this._prevDisplayList = [];\n            var layers = this._layers;\n            if (!singleCanvas) {\n                this._width = getSize(root, 0, opts);\n                this._height = getSize(root, 1, opts);\n                var domRoot = this._domRoot = createRoot(this._width, this._height);\n                root.appendChild(domRoot);\n            }\n            else {\n                var rootCanvas = root;\n                var width = rootCanvas.width;\n                var height = rootCanvas.height;\n                if (opts.width != null) {\n                    width = opts.width;\n                }\n                if (opts.height != null) {\n                    height = opts.height;\n                }\n                this.dpr = opts.devicePixelRatio || 1;\n                rootCanvas.width = width * this.dpr;\n                rootCanvas.height = height * this.dpr;\n                this._width = width;\n                this._height = height;\n                var mainLayer = new Layer(rootCanvas, this, this.dpr);\n                mainLayer.__builtin__ = true;\n                mainLayer.initContext();\n                layers[CANVAS_ZLEVEL] = mainLayer;\n                mainLayer.zlevel = CANVAS_ZLEVEL;\n                zlevelList.push(CANVAS_ZLEVEL);\n                this._domRoot = root;\n            }\n        }\n        CanvasPainter.prototype.getType = function () {\n            return 'canvas';\n        };\n        CanvasPainter.prototype.isSingleCanvas = function () {\n            return this._singleCanvas;\n        };\n        CanvasPainter.prototype.getViewportRoot = function () {\n            return this._domRoot;\n        };\n        CanvasPainter.prototype.getViewportRootOffset = function () {\n            var viewportRoot = this.getViewportRoot();\n            if (viewportRoot) {\n                return {\n                    offsetLeft: viewportRoot.offsetLeft || 0,\n                    offsetTop: viewportRoot.offsetTop || 0\n                };\n            }\n        };\n        CanvasPainter.prototype.refresh = function (paintAll) {\n            var list = this.storage.getDisplayList(true);\n            var prevList = this._prevDisplayList;\n            var zlevelList = this._zlevelList;\n            this._redrawId = Math.random();\n            this._paintList(list, prevList, paintAll, this._redrawId);\n            for (var i = 0; i < zlevelList.length; i++) {\n                var z = zlevelList[i];\n                var layer = this._layers[z];\n                if (!layer.__builtin__ && layer.refresh) {\n                    var clearColor = i === 0 ? this._backgroundColor : null;\n                    layer.refresh(clearColor);\n                }\n            }\n            if (this._opts.useDirtyRect) {\n                this._prevDisplayList = list.slice();\n            }\n            return this;\n        };\n        CanvasPainter.prototype.refreshHover = function () {\n            this._paintHoverList(this.storage.getDisplayList(false));\n        };\n        CanvasPainter.prototype._paintHoverList = function (list) {\n            var len = list.length;\n            var hoverLayer = this._hoverlayer;\n            hoverLayer && hoverLayer.clear();\n            if (!len) {\n                return;\n            }\n            var scope = {\n                inHover: true,\n                viewWidth: this._width,\n                viewHeight: this._height\n            };\n            var ctx;\n            for (var i = 0; i < len; i++) {\n                var el = list[i];\n                if (el.__inHover) {\n                    if (!hoverLayer) {\n                        hoverLayer = this._hoverlayer = this.getLayer(HOVER_LAYER_ZLEVEL);\n                    }\n                    if (!ctx) {\n                        ctx = hoverLayer.ctx;\n                        ctx.save();\n                    }\n                    brush(ctx, el, scope, i === len - 1);\n                }\n            }\n            if (ctx) {\n                ctx.restore();\n            }\n        };\n        CanvasPainter.prototype.getHoverLayer = function () {\n            return this.getLayer(HOVER_LAYER_ZLEVEL);\n        };\n        CanvasPainter.prototype.paintOne = function (ctx, el) {\n            brushSingle(ctx, el);\n        };\n        CanvasPainter.prototype._paintList = function (list, prevList, paintAll, redrawId) {\n            if (this._redrawId !== redrawId) {\n                return;\n            }\n            paintAll = paintAll || false;\n            this._updateLayerStatus(list);\n            var _a = this._doPaintList(list, prevList, paintAll), finished = _a.finished, needsRefreshHover = _a.needsRefreshHover;\n            if (this._needsManuallyCompositing) {\n                this._compositeManually();\n            }\n            if (needsRefreshHover) {\n                this._paintHoverList(list);\n            }\n            if (!finished) {\n                var self_1 = this;\n                requestAnimationFrame$1(function () {\n                    self_1._paintList(list, prevList, paintAll, redrawId);\n                });\n            }\n            else {\n                this.eachLayer(function (layer) {\n                    layer.afterBrush && layer.afterBrush();\n                });\n            }\n        };\n        CanvasPainter.prototype._compositeManually = function () {\n            var ctx = this.getLayer(CANVAS_ZLEVEL).ctx;\n            var width = this._domRoot.width;\n            var height = this._domRoot.height;\n            ctx.clearRect(0, 0, width, height);\n            this.eachBuiltinLayer(function (layer) {\n                if (layer.virtual) {\n                    ctx.drawImage(layer.dom, 0, 0, width, height);\n                }\n            });\n        };\n        CanvasPainter.prototype._doPaintList = function (list, prevList, paintAll) {\n            var _this = this;\n            var layerList = [];\n            var useDirtyRect = this._opts.useDirtyRect;\n            for (var zi = 0; zi < this._zlevelList.length; zi++) {\n                var zlevel = this._zlevelList[zi];\n                var layer = this._layers[zlevel];\n                if (layer.__builtin__\n                    && layer !== this._hoverlayer\n                    && (layer.__dirty || paintAll)) {\n                    layerList.push(layer);\n                }\n            }\n            var finished = true;\n            var needsRefreshHover = false;\n            var _loop_1 = function (k) {\n                var layer = layerList[k];\n                var ctx = layer.ctx;\n                var repaintRects = useDirtyRect\n                    && layer.createRepaintRects(list, prevList, this_1._width, this_1._height);\n                var start = paintAll ? layer.__startIndex : layer.__drawIndex;\n                var useTimer = !paintAll && layer.incremental && Date.now;\n                var startTime = useTimer && Date.now();\n                var clearColor = layer.zlevel === this_1._zlevelList[0]\n                    ? this_1._backgroundColor : null;\n                if (layer.__startIndex === layer.__endIndex) {\n                    layer.clear(false, clearColor, repaintRects);\n                }\n                else if (start === layer.__startIndex) {\n                    var firstEl = list[start];\n                    if (!firstEl.incremental || !firstEl.notClear || paintAll) {\n                        layer.clear(false, clearColor, repaintRects);\n                    }\n                }\n                if (start === -1) {\n                    console.error('For some unknown reason. drawIndex is -1');\n                    start = layer.__startIndex;\n                }\n                var i;\n                var repaint = function (repaintRect) {\n                    var scope = {\n                        inHover: false,\n                        allClipped: false,\n                        prevEl: null,\n                        viewWidth: _this._width,\n                        viewHeight: _this._height\n                    };\n                    for (i = start; i < layer.__endIndex; i++) {\n                        var el = list[i];\n                        if (el.__inHover) {\n                            needsRefreshHover = true;\n                        }\n                        _this._doPaintEl(el, layer, useDirtyRect, repaintRect, scope, i === layer.__endIndex - 1);\n                        if (useTimer) {\n                            var dTime = Date.now() - startTime;\n                            if (dTime > 15) {\n                                break;\n                            }\n                        }\n                    }\n                    if (scope.prevElClipPaths) {\n                        ctx.restore();\n                    }\n                };\n                if (repaintRects) {\n                    if (repaintRects.length === 0) {\n                        i = layer.__endIndex;\n                    }\n                    else {\n                        var dpr = this_1.dpr;\n                        for (var r = 0; r < repaintRects.length; ++r) {\n                            var rect = repaintRects[r];\n                            ctx.save();\n                            ctx.beginPath();\n                            ctx.rect(rect.x * dpr, rect.y * dpr, rect.width * dpr, rect.height * dpr);\n                            ctx.clip();\n                            repaint(rect);\n                            ctx.restore();\n                        }\n                    }\n                }\n                else {\n                    ctx.save();\n                    repaint();\n                    ctx.restore();\n                }\n                layer.__drawIndex = i;\n                if (layer.__drawIndex < layer.__endIndex) {\n                    finished = false;\n                }\n            };\n            var this_1 = this;\n            for (var k = 0; k < layerList.length; k++) {\n                _loop_1(k);\n            }\n            if (env.wxa) {\n                each(this._layers, function (layer) {\n                    if (layer && layer.ctx && layer.ctx.draw) {\n                        layer.ctx.draw();\n                    }\n                });\n            }\n            return {\n                finished: finished,\n                needsRefreshHover: needsRefreshHover\n            };\n        };\n        CanvasPainter.prototype._doPaintEl = function (el, currentLayer, useDirtyRect, repaintRect, scope, isLast) {\n            var ctx = currentLayer.ctx;\n            if (useDirtyRect) {\n                var paintRect = el.getPaintRect();\n                if (!repaintRect || paintRect && paintRect.intersect(repaintRect)) {\n                    brush(ctx, el, scope, isLast);\n                    el.setPrevPaintRect(paintRect);\n                }\n            }\n            else {\n                brush(ctx, el, scope, isLast);\n            }\n        };\n        CanvasPainter.prototype.getLayer = function (zlevel, virtual) {\n            if (this._singleCanvas && !this._needsManuallyCompositing) {\n                zlevel = CANVAS_ZLEVEL;\n            }\n            var layer = this._layers[zlevel];\n            if (!layer) {\n                layer = new Layer('zr_' + zlevel, this, this.dpr);\n                layer.zlevel = zlevel;\n                layer.__builtin__ = true;\n                if (this._layerConfig[zlevel]) {\n                    merge(layer, this._layerConfig[zlevel], true);\n                }\n                else if (this._layerConfig[zlevel - EL_AFTER_INCREMENTAL_INC]) {\n                    merge(layer, this._layerConfig[zlevel - EL_AFTER_INCREMENTAL_INC], true);\n                }\n                if (virtual) {\n                    layer.virtual = virtual;\n                }\n                this.insertLayer(zlevel, layer);\n                layer.initContext();\n            }\n            return layer;\n        };\n        CanvasPainter.prototype.insertLayer = function (zlevel, layer) {\n            var layersMap = this._layers;\n            var zlevelList = this._zlevelList;\n            var len = zlevelList.length;\n            var domRoot = this._domRoot;\n            var prevLayer = null;\n            var i = -1;\n            if (layersMap[zlevel]) {\n                if (\"development\" !== 'production') {\n                    logError('ZLevel ' + zlevel + ' has been used already');\n                }\n                return;\n            }\n            if (!isLayerValid(layer)) {\n                if (\"development\" !== 'production') {\n                    logError('Layer of zlevel ' + zlevel + ' is not valid');\n                }\n                return;\n            }\n            if (len > 0 && zlevel > zlevelList[0]) {\n                for (i = 0; i < len - 1; i++) {\n                    if (zlevelList[i] < zlevel\n                        && zlevelList[i + 1] > zlevel) {\n                        break;\n                    }\n                }\n                prevLayer = layersMap[zlevelList[i]];\n            }\n            zlevelList.splice(i + 1, 0, zlevel);\n            layersMap[zlevel] = layer;\n            if (!layer.virtual) {\n                if (prevLayer) {\n                    var prevDom = prevLayer.dom;\n                    if (prevDom.nextSibling) {\n                        domRoot.insertBefore(layer.dom, prevDom.nextSibling);\n                    }\n                    else {\n                        domRoot.appendChild(layer.dom);\n                    }\n                }\n                else {\n                    if (domRoot.firstChild) {\n                        domRoot.insertBefore(layer.dom, domRoot.firstChild);\n                    }\n                    else {\n                        domRoot.appendChild(layer.dom);\n                    }\n                }\n            }\n            layer.painter || (layer.painter = this);\n        };\n        CanvasPainter.prototype.eachLayer = function (cb, context) {\n            var zlevelList = this._zlevelList;\n            for (var i = 0; i < zlevelList.length; i++) {\n                var z = zlevelList[i];\n                cb.call(context, this._layers[z], z);\n            }\n        };\n        CanvasPainter.prototype.eachBuiltinLayer = function (cb, context) {\n            var zlevelList = this._zlevelList;\n            for (var i = 0; i < zlevelList.length; i++) {\n                var z = zlevelList[i];\n                var layer = this._layers[z];\n                if (layer.__builtin__) {\n                    cb.call(context, layer, z);\n                }\n            }\n        };\n        CanvasPainter.prototype.eachOtherLayer = function (cb, context) {\n            var zlevelList = this._zlevelList;\n            for (var i = 0; i < zlevelList.length; i++) {\n                var z = zlevelList[i];\n                var layer = this._layers[z];\n                if (!layer.__builtin__) {\n                    cb.call(context, layer, z);\n                }\n            }\n        };\n        CanvasPainter.prototype.getLayers = function () {\n            return this._layers;\n        };\n        CanvasPainter.prototype._updateLayerStatus = function (list) {\n            this.eachBuiltinLayer(function (layer, z) {\n                layer.__dirty = layer.__used = false;\n            });\n            function updatePrevLayer(idx) {\n                if (prevLayer) {\n                    if (prevLayer.__endIndex !== idx) {\n                        prevLayer.__dirty = true;\n                    }\n                    prevLayer.__endIndex = idx;\n                }\n            }\n            if (this._singleCanvas) {\n                for (var i_1 = 1; i_1 < list.length; i_1++) {\n                    var el = list[i_1];\n                    if (el.zlevel !== list[i_1 - 1].zlevel || el.incremental) {\n                        this._needsManuallyCompositing = true;\n                        break;\n                    }\n                }\n            }\n            var prevLayer = null;\n            var incrementalLayerCount = 0;\n            var prevZlevel;\n            var i;\n            for (i = 0; i < list.length; i++) {\n                var el = list[i];\n                var zlevel = el.zlevel;\n                var layer = void 0;\n                if (prevZlevel !== zlevel) {\n                    prevZlevel = zlevel;\n                    incrementalLayerCount = 0;\n                }\n                if (el.incremental) {\n                    layer = this.getLayer(zlevel + INCREMENTAL_INC, this._needsManuallyCompositing);\n                    layer.incremental = true;\n                    incrementalLayerCount = 1;\n                }\n                else {\n                    layer = this.getLayer(zlevel + (incrementalLayerCount > 0 ? EL_AFTER_INCREMENTAL_INC : 0), this._needsManuallyCompositing);\n                }\n                if (!layer.__builtin__) {\n                    logError('ZLevel ' + zlevel + ' has been used by unkown layer ' + layer.id);\n                }\n                if (layer !== prevLayer) {\n                    layer.__used = true;\n                    if (layer.__startIndex !== i) {\n                        layer.__dirty = true;\n                    }\n                    layer.__startIndex = i;\n                    if (!layer.incremental) {\n                        layer.__drawIndex = i;\n                    }\n                    else {\n                        layer.__drawIndex = -1;\n                    }\n                    updatePrevLayer(i);\n                    prevLayer = layer;\n                }\n                if ((el.__dirty & REDRAW_BIT) && !el.__inHover) {\n                    layer.__dirty = true;\n                    if (layer.incremental && layer.__drawIndex < 0) {\n                        layer.__drawIndex = i;\n                    }\n                }\n            }\n            updatePrevLayer(i);\n            this.eachBuiltinLayer(function (layer, z) {\n                if (!layer.__used && layer.getElementCount() > 0) {\n                    layer.__dirty = true;\n                    layer.__startIndex = layer.__endIndex = layer.__drawIndex = 0;\n                }\n                if (layer.__dirty && layer.__drawIndex < 0) {\n                    layer.__drawIndex = layer.__startIndex;\n                }\n            });\n        };\n        CanvasPainter.prototype.clear = function () {\n            this.eachBuiltinLayer(this._clearLayer);\n            return this;\n        };\n        CanvasPainter.prototype._clearLayer = function (layer) {\n            layer.clear();\n        };\n        CanvasPainter.prototype.setBackgroundColor = function (backgroundColor) {\n            this._backgroundColor = backgroundColor;\n            each(this._layers, function (layer) {\n                layer.setUnpainted();\n            });\n        };\n        CanvasPainter.prototype.configLayer = function (zlevel, config) {\n            if (config) {\n                var layerConfig = this._layerConfig;\n                if (!layerConfig[zlevel]) {\n                    layerConfig[zlevel] = config;\n                }\n                else {\n                    merge(layerConfig[zlevel], config, true);\n                }\n                for (var i = 0; i < this._zlevelList.length; i++) {\n                    var _zlevel = this._zlevelList[i];\n                    if (_zlevel === zlevel || _zlevel === zlevel + EL_AFTER_INCREMENTAL_INC) {\n                        var layer = this._layers[_zlevel];\n                        merge(layer, layerConfig[zlevel], true);\n                    }\n                }\n            }\n        };\n        CanvasPainter.prototype.delLayer = function (zlevel) {\n            var layers = this._layers;\n            var zlevelList = this._zlevelList;\n            var layer = layers[zlevel];\n            if (!layer) {\n                return;\n            }\n            layer.dom.parentNode.removeChild(layer.dom);\n            delete layers[zlevel];\n            zlevelList.splice(indexOf(zlevelList, zlevel), 1);\n        };\n        CanvasPainter.prototype.resize = function (width, height) {\n            if (!this._domRoot.style) {\n                if (width == null || height == null) {\n                    return;\n                }\n                this._width = width;\n                this._height = height;\n                this.getLayer(CANVAS_ZLEVEL).resize(width, height);\n            }\n            else {\n                var domRoot = this._domRoot;\n                domRoot.style.display = 'none';\n                var opts = this._opts;\n                var root = this.root;\n                width != null && (opts.width = width);\n                height != null && (opts.height = height);\n                width = getSize(root, 0, opts);\n                height = getSize(root, 1, opts);\n                domRoot.style.display = '';\n                if (this._width !== width || height !== this._height) {\n                    domRoot.style.width = width + 'px';\n                    domRoot.style.height = height + 'px';\n                    for (var id in this._layers) {\n                        if (this._layers.hasOwnProperty(id)) {\n                            this._layers[id].resize(width, height);\n                        }\n                    }\n                    this.refresh(true);\n                }\n                this._width = width;\n                this._height = height;\n            }\n            return this;\n        };\n        CanvasPainter.prototype.clearLayer = function (zlevel) {\n            var layer = this._layers[zlevel];\n            if (layer) {\n                layer.clear();\n            }\n        };\n        CanvasPainter.prototype.dispose = function () {\n            this.root.innerHTML = '';\n            this.root =\n                this.storage =\n                    this._domRoot =\n                        this._layers = null;\n        };\n        CanvasPainter.prototype.getRenderedCanvas = function (opts) {\n            opts = opts || {};\n            if (this._singleCanvas && !this._compositeManually) {\n                return this._layers[CANVAS_ZLEVEL].dom;\n            }\n            var imageLayer = new Layer('image', this, opts.pixelRatio || this.dpr);\n            imageLayer.initContext();\n            imageLayer.clear(false, opts.backgroundColor || this._backgroundColor);\n            var ctx = imageLayer.ctx;\n            if (opts.pixelRatio <= this.dpr) {\n                this.refresh();\n                var width_1 = imageLayer.dom.width;\n                var height_1 = imageLayer.dom.height;\n                this.eachLayer(function (layer) {\n                    if (layer.__builtin__) {\n                        ctx.drawImage(layer.dom, 0, 0, width_1, height_1);\n                    }\n                    else if (layer.renderToCanvas) {\n                        ctx.save();\n                        layer.renderToCanvas(ctx);\n                        ctx.restore();\n                    }\n                });\n            }\n            else {\n                var scope = {\n                    inHover: false,\n                    viewWidth: this._width,\n                    viewHeight: this._height\n                };\n                var displayList = this.storage.getDisplayList(true);\n                for (var i = 0, len = displayList.length; i < len; i++) {\n                    var el = displayList[i];\n                    brush(ctx, el, scope, i === len - 1);\n                }\n            }\n            return imageLayer.dom;\n        };\n        CanvasPainter.prototype.getWidth = function () {\n            return this._width;\n        };\n        CanvasPainter.prototype.getHeight = function () {\n            return this._height;\n        };\n        return CanvasPainter;\n    }());\n\n    function install$1(registers) {\n      registers.registerPainter('canvas', CanvasPainter);\n    }\n\n    var LineSeriesModel = /** @class */function (_super) {\n      __extends(LineSeriesModel, _super);\n      function LineSeriesModel() {\n        var _this = _super !== null && _super.apply(this, arguments) || this;\n        _this.type = LineSeriesModel.type;\n        _this.hasSymbolVisual = true;\n        return _this;\n      }\n      LineSeriesModel.prototype.getInitialData = function (option) {\n        if (\"development\" !== 'production') {\n          var coordSys = option.coordinateSystem;\n          if (coordSys !== 'polar' && coordSys !== 'cartesian2d') {\n            throw new Error('Line not support coordinateSystem besides cartesian and polar');\n          }\n        }\n        return createSeriesData(null, this, {\n          useEncodeDefaulter: true\n        });\n      };\n      LineSeriesModel.prototype.getLegendIcon = function (opt) {\n        var group = new Group();\n        var line = createSymbol('line', 0, opt.itemHeight / 2, opt.itemWidth, 0, opt.lineStyle.stroke, false);\n        group.add(line);\n        line.setStyle(opt.lineStyle);\n        var visualType = this.getData().getVisual('symbol');\n        var visualRotate = this.getData().getVisual('symbolRotate');\n        var symbolType = visualType === 'none' ? 'circle' : visualType;\n        // Symbol size is 80% when there is a line\n        var size = opt.itemHeight * 0.8;\n        var symbol = createSymbol(symbolType, (opt.itemWidth - size) / 2, (opt.itemHeight - size) / 2, size, size, opt.itemStyle.fill);\n        group.add(symbol);\n        symbol.setStyle(opt.itemStyle);\n        var symbolRotate = opt.iconRotate === 'inherit' ? visualRotate : opt.iconRotate || 0;\n        symbol.rotation = symbolRotate * Math.PI / 180;\n        symbol.setOrigin([opt.itemWidth / 2, opt.itemHeight / 2]);\n        if (symbolType.indexOf('empty') > -1) {\n          symbol.style.stroke = symbol.style.fill;\n          symbol.style.fill = '#fff';\n          symbol.style.lineWidth = 2;\n        }\n        return group;\n      };\n      LineSeriesModel.type = 'series.line';\n      LineSeriesModel.dependencies = ['grid', 'polar'];\n      LineSeriesModel.defaultOption = {\n        // zlevel: 0,\n        z: 3,\n        coordinateSystem: 'cartesian2d',\n        legendHoverLink: true,\n        clip: true,\n        label: {\n          position: 'top'\n        },\n        // itemStyle: {\n        // },\n        endLabel: {\n          show: false,\n          valueAnimation: true,\n          distance: 8\n        },\n        lineStyle: {\n          width: 2,\n          type: 'solid'\n        },\n        emphasis: {\n          scale: true\n        },\n        // areaStyle: {\n        // origin of areaStyle. Valid values:\n        // `'auto'/null/undefined`: from axisLine to data\n        // `'start'`: from min to data\n        // `'end'`: from data to max\n        // origin: 'auto'\n        // },\n        // false, 'start', 'end', 'middle'\n        step: false,\n        // Disabled if step is true\n        smooth: false,\n        smoothMonotone: null,\n        symbol: 'emptyCircle',\n        symbolSize: 4,\n        symbolRotate: null,\n        showSymbol: true,\n        // `false`: follow the label interval strategy.\n        // `true`: show all symbols.\n        // `'auto'`: If possible, show all symbols, otherwise\n        //           follow the label interval strategy.\n        showAllSymbol: 'auto',\n        // Whether to connect break point.\n        connectNulls: false,\n        // Sampling for large data. Can be: 'average', 'max', 'min', 'sum', 'lttb'.\n        sampling: 'none',\n        animationEasing: 'linear',\n        // Disable progressive\n        progressive: 0,\n        hoverLayerThreshold: Infinity,\n        universalTransition: {\n          divideShape: 'clone'\n        },\n        triggerLineEvent: false\n      };\n      return LineSeriesModel;\n    }(SeriesModel);\n\n    /**\r\n     * @return label string. Not null/undefined\r\n     */\n    function getDefaultLabel(data, dataIndex) {\n      var labelDims = data.mapDimensionsAll('defaultedLabel');\n      var len = labelDims.length;\n      // Simple optimization (in lots of cases, label dims length is 1)\n      if (len === 1) {\n        var rawVal = retrieveRawValue(data, dataIndex, labelDims[0]);\n        return rawVal != null ? rawVal + '' : null;\n      } else if (len) {\n        var vals = [];\n        for (var i = 0; i < labelDims.length; i++) {\n          vals.push(retrieveRawValue(data, dataIndex, labelDims[i]));\n        }\n        return vals.join(' ');\n      }\n    }\n    function getDefaultInterpolatedLabel(data, interpolatedValue) {\n      var labelDims = data.mapDimensionsAll('defaultedLabel');\n      if (!isArray(interpolatedValue)) {\n        return interpolatedValue + '';\n      }\n      var vals = [];\n      for (var i = 0; i < labelDims.length; i++) {\n        var dimIndex = data.getDimensionIndex(labelDims[i]);\n        if (dimIndex >= 0) {\n          vals.push(interpolatedValue[dimIndex]);\n        }\n      }\n      return vals.join(' ');\n    }\n\n    var Symbol = /** @class */function (_super) {\n      __extends(Symbol, _super);\n      function Symbol(data, idx, seriesScope, opts) {\n        var _this = _super.call(this) || this;\n        _this.updateData(data, idx, seriesScope, opts);\n        return _this;\n      }\n      Symbol.prototype._createSymbol = function (symbolType, data, idx, symbolSize, keepAspect) {\n        // Remove paths created before\n        this.removeAll();\n        // let symbolPath = createSymbol(\n        //     symbolType, -0.5, -0.5, 1, 1, color\n        // );\n        // If width/height are set too small (e.g., set to 1) on ios10\n        // and macOS Sierra, a circle stroke become a rect, no matter what\n        // the scale is set. So we set width/height as 2. See #4150.\n        var symbolPath = createSymbol(symbolType, -1, -1, 2, 2, null, keepAspect);\n        symbolPath.attr({\n          z2: 100,\n          culling: true,\n          scaleX: symbolSize[0] / 2,\n          scaleY: symbolSize[1] / 2\n        });\n        // Rewrite drift method\n        symbolPath.drift = driftSymbol;\n        this._symbolType = symbolType;\n        this.add(symbolPath);\n      };\n      /**\r\n       * Stop animation\r\n       * @param {boolean} toLastFrame\r\n       */\n      Symbol.prototype.stopSymbolAnimation = function (toLastFrame) {\n        this.childAt(0).stopAnimation(null, toLastFrame);\n      };\n      Symbol.prototype.getSymbolType = function () {\n        return this._symbolType;\n      };\n      /**\r\n       * FIXME:\r\n       * Caution: This method breaks the encapsulation of this module,\r\n       * but it indeed brings convenience. So do not use the method\r\n       * unless you detailedly know all the implements of `Symbol`,\r\n       * especially animation.\r\n       *\r\n       * Get symbol path element.\r\n       */\n      Symbol.prototype.getSymbolPath = function () {\n        return this.childAt(0);\n      };\n      /**\r\n       * Highlight symbol\r\n       */\n      Symbol.prototype.highlight = function () {\n        enterEmphasis(this.childAt(0));\n      };\n      /**\r\n       * Downplay symbol\r\n       */\n      Symbol.prototype.downplay = function () {\n        leaveEmphasis(this.childAt(0));\n      };\n      /**\r\n       * @param {number} zlevel\r\n       * @param {number} z\r\n       */\n      Symbol.prototype.setZ = function (zlevel, z) {\n        var symbolPath = this.childAt(0);\n        symbolPath.zlevel = zlevel;\n        symbolPath.z = z;\n      };\n      Symbol.prototype.setDraggable = function (draggable, hasCursorOption) {\n        var symbolPath = this.childAt(0);\n        symbolPath.draggable = draggable;\n        symbolPath.cursor = !hasCursorOption && draggable ? 'move' : symbolPath.cursor;\n      };\n      /**\r\n       * Update symbol properties\r\n       */\n      Symbol.prototype.updateData = function (data, idx, seriesScope, opts) {\n        this.silent = false;\n        var symbolType = data.getItemVisual(idx, 'symbol') || 'circle';\n        var seriesModel = data.hostModel;\n        var symbolSize = Symbol.getSymbolSize(data, idx);\n        var isInit = symbolType !== this._symbolType;\n        var disableAnimation = opts && opts.disableAnimation;\n        if (isInit) {\n          var keepAspect = data.getItemVisual(idx, 'symbolKeepAspect');\n          this._createSymbol(symbolType, data, idx, symbolSize, keepAspect);\n        } else {\n          var symbolPath = this.childAt(0);\n          symbolPath.silent = false;\n          var target = {\n            scaleX: symbolSize[0] / 2,\n            scaleY: symbolSize[1] / 2\n          };\n          disableAnimation ? symbolPath.attr(target) : updateProps(symbolPath, target, seriesModel, idx);\n          saveOldStyle(symbolPath);\n        }\n        this._updateCommon(data, idx, symbolSize, seriesScope, opts);\n        if (isInit) {\n          var symbolPath = this.childAt(0);\n          if (!disableAnimation) {\n            var target = {\n              scaleX: this._sizeX,\n              scaleY: this._sizeY,\n              style: {\n                // Always fadeIn. Because it has fadeOut animation when symbol is removed..\n                opacity: symbolPath.style.opacity\n              }\n            };\n            symbolPath.scaleX = symbolPath.scaleY = 0;\n            symbolPath.style.opacity = 0;\n            initProps(symbolPath, target, seriesModel, idx);\n          }\n        }\n        if (disableAnimation) {\n          // Must stop leave transition manually if don't call initProps or updateProps.\n          this.childAt(0).stopAnimation('leave');\n        }\n      };\n      Symbol.prototype._updateCommon = function (data, idx, symbolSize, seriesScope, opts) {\n        var symbolPath = this.childAt(0);\n        var seriesModel = data.hostModel;\n        var emphasisItemStyle;\n        var blurItemStyle;\n        var selectItemStyle;\n        var focus;\n        var blurScope;\n        var emphasisDisabled;\n        var labelStatesModels;\n        var hoverScale;\n        var cursorStyle;\n        if (seriesScope) {\n          emphasisItemStyle = seriesScope.emphasisItemStyle;\n          blurItemStyle = seriesScope.blurItemStyle;\n          selectItemStyle = seriesScope.selectItemStyle;\n          focus = seriesScope.focus;\n          blurScope = seriesScope.blurScope;\n          labelStatesModels = seriesScope.labelStatesModels;\n          hoverScale = seriesScope.hoverScale;\n          cursorStyle = seriesScope.cursorStyle;\n          emphasisDisabled = seriesScope.emphasisDisabled;\n        }\n        if (!seriesScope || data.hasItemOption) {\n          var itemModel = seriesScope && seriesScope.itemModel ? seriesScope.itemModel : data.getItemModel(idx);\n          var emphasisModel = itemModel.getModel('emphasis');\n          emphasisItemStyle = emphasisModel.getModel('itemStyle').getItemStyle();\n          selectItemStyle = itemModel.getModel(['select', 'itemStyle']).getItemStyle();\n          blurItemStyle = itemModel.getModel(['blur', 'itemStyle']).getItemStyle();\n          focus = emphasisModel.get('focus');\n          blurScope = emphasisModel.get('blurScope');\n          emphasisDisabled = emphasisModel.get('disabled');\n          labelStatesModels = getLabelStatesModels(itemModel);\n          hoverScale = emphasisModel.getShallow('scale');\n          cursorStyle = itemModel.getShallow('cursor');\n        }\n        var symbolRotate = data.getItemVisual(idx, 'symbolRotate');\n        symbolPath.attr('rotation', (symbolRotate || 0) * Math.PI / 180 || 0);\n        var symbolOffset = normalizeSymbolOffset(data.getItemVisual(idx, 'symbolOffset'), symbolSize);\n        if (symbolOffset) {\n          symbolPath.x = symbolOffset[0];\n          symbolPath.y = symbolOffset[1];\n        }\n        cursorStyle && symbolPath.attr('cursor', cursorStyle);\n        var symbolStyle = data.getItemVisual(idx, 'style');\n        var visualColor = symbolStyle.fill;\n        if (symbolPath instanceof ZRImage) {\n          var pathStyle = symbolPath.style;\n          symbolPath.useStyle(extend({\n            // TODO other properties like x, y ?\n            image: pathStyle.image,\n            x: pathStyle.x,\n            y: pathStyle.y,\n            width: pathStyle.width,\n            height: pathStyle.height\n          }, symbolStyle));\n        } else {\n          if (symbolPath.__isEmptyBrush) {\n            // fill and stroke will be swapped if it's empty.\n            // So we cloned a new style to avoid it affecting the original style in visual storage.\n            // TODO Better implementation. No empty logic!\n            symbolPath.useStyle(extend({}, symbolStyle));\n          } else {\n            symbolPath.useStyle(symbolStyle);\n          }\n          // Disable decal because symbol scale will been applied on the decal.\n          symbolPath.style.decal = null;\n          symbolPath.setColor(visualColor, opts && opts.symbolInnerColor);\n          symbolPath.style.strokeNoScale = true;\n        }\n        var liftZ = data.getItemVisual(idx, 'liftZ');\n        var z2Origin = this._z2;\n        if (liftZ != null) {\n          if (z2Origin == null) {\n            this._z2 = symbolPath.z2;\n            symbolPath.z2 += liftZ;\n          }\n        } else if (z2Origin != null) {\n          symbolPath.z2 = z2Origin;\n          this._z2 = null;\n        }\n        var useNameLabel = opts && opts.useNameLabel;\n        setLabelStyle(symbolPath, labelStatesModels, {\n          labelFetcher: seriesModel,\n          labelDataIndex: idx,\n          defaultText: getLabelDefaultText,\n          inheritColor: visualColor,\n          defaultOpacity: symbolStyle.opacity\n        });\n        // Do not execute util needed.\n        function getLabelDefaultText(idx) {\n          return useNameLabel ? data.getName(idx) : getDefaultLabel(data, idx);\n        }\n        this._sizeX = symbolSize[0] / 2;\n        this._sizeY = symbolSize[1] / 2;\n        var emphasisState = symbolPath.ensureState('emphasis');\n        emphasisState.style = emphasisItemStyle;\n        symbolPath.ensureState('select').style = selectItemStyle;\n        symbolPath.ensureState('blur').style = blurItemStyle;\n        // null / undefined / true means to use default strategy.\n        // 0 / false / negative number / NaN / Infinity means no scale.\n        var scaleRatio = hoverScale == null || hoverScale === true ? Math.max(1.1, 3 / this._sizeY)\n        // PENDING: restrict hoverScale > 1? It seems unreasonable to scale down\n        : isFinite(hoverScale) && hoverScale > 0 ? +hoverScale : 1;\n        // always set scale to allow resetting\n        emphasisState.scaleX = this._sizeX * scaleRatio;\n        emphasisState.scaleY = this._sizeY * scaleRatio;\n        this.setSymbolScale(1);\n        toggleHoverEmphasis(this, focus, blurScope, emphasisDisabled);\n      };\n      Symbol.prototype.setSymbolScale = function (scale) {\n        this.scaleX = this.scaleY = scale;\n      };\n      Symbol.prototype.fadeOut = function (cb, seriesModel, opt) {\n        var symbolPath = this.childAt(0);\n        var dataIndex = getECData(this).dataIndex;\n        var animationOpt = opt && opt.animation;\n        // Avoid mistaken hover when fading out\n        this.silent = symbolPath.silent = true;\n        // Not show text when animating\n        if (opt && opt.fadeLabel) {\n          var textContent = symbolPath.getTextContent();\n          if (textContent) {\n            removeElement(textContent, {\n              style: {\n                opacity: 0\n              }\n            }, seriesModel, {\n              dataIndex: dataIndex,\n              removeOpt: animationOpt,\n              cb: function () {\n                symbolPath.removeTextContent();\n              }\n            });\n          }\n        } else {\n          symbolPath.removeTextContent();\n        }\n        removeElement(symbolPath, {\n          style: {\n            opacity: 0\n          },\n          scaleX: 0,\n          scaleY: 0\n        }, seriesModel, {\n          dataIndex: dataIndex,\n          cb: cb,\n          removeOpt: animationOpt\n        });\n      };\n      Symbol.getSymbolSize = function (data, idx) {\n        return normalizeSymbolSize(data.getItemVisual(idx, 'symbolSize'));\n      };\n      return Symbol;\n    }(Group);\n    function driftSymbol(dx, dy) {\n      this.parent.drift(dx, dy);\n    }\n\n    function symbolNeedsDraw(data, point, idx, opt) {\n      return point && !isNaN(point[0]) && !isNaN(point[1]) && !(opt.isIgnore && opt.isIgnore(idx))\n      // We do not set clipShape on group, because it will cut part of\n      // the symbol element shape. We use the same clip shape here as\n      // the line clip.\n      && !(opt.clipShape && !opt.clipShape.contain(point[0], point[1])) && data.getItemVisual(idx, 'symbol') !== 'none';\n    }\n    function normalizeUpdateOpt(opt) {\n      if (opt != null && !isObject(opt)) {\n        opt = {\n          isIgnore: opt\n        };\n      }\n      return opt || {};\n    }\n    function makeSeriesScope(data) {\n      var seriesModel = data.hostModel;\n      var emphasisModel = seriesModel.getModel('emphasis');\n      return {\n        emphasisItemStyle: emphasisModel.getModel('itemStyle').getItemStyle(),\n        blurItemStyle: seriesModel.getModel(['blur', 'itemStyle']).getItemStyle(),\n        selectItemStyle: seriesModel.getModel(['select', 'itemStyle']).getItemStyle(),\n        focus: emphasisModel.get('focus'),\n        blurScope: emphasisModel.get('blurScope'),\n        emphasisDisabled: emphasisModel.get('disabled'),\n        hoverScale: emphasisModel.get('scale'),\n        labelStatesModels: getLabelStatesModels(seriesModel),\n        cursorStyle: seriesModel.get('cursor')\n      };\n    }\n    var SymbolDraw = /** @class */function () {\n      function SymbolDraw(SymbolCtor) {\n        this.group = new Group();\n        this._SymbolCtor = SymbolCtor || Symbol;\n      }\n      /**\r\n       * Update symbols draw by new data\r\n       */\n      SymbolDraw.prototype.updateData = function (data, opt) {\n        // Remove progressive els.\n        this._progressiveEls = null;\n        opt = normalizeUpdateOpt(opt);\n        var group = this.group;\n        var seriesModel = data.hostModel;\n        var oldData = this._data;\n        var SymbolCtor = this._SymbolCtor;\n        var disableAnimation = opt.disableAnimation;\n        var seriesScope = makeSeriesScope(data);\n        var symbolUpdateOpt = {\n          disableAnimation: disableAnimation\n        };\n        var getSymbolPoint = opt.getSymbolPoint || function (idx) {\n          return data.getItemLayout(idx);\n        };\n        // There is no oldLineData only when first rendering or switching from\n        // stream mode to normal mode, where previous elements should be removed.\n        if (!oldData) {\n          group.removeAll();\n        }\n        data.diff(oldData).add(function (newIdx) {\n          var point = getSymbolPoint(newIdx);\n          if (symbolNeedsDraw(data, point, newIdx, opt)) {\n            var symbolEl = new SymbolCtor(data, newIdx, seriesScope, symbolUpdateOpt);\n            symbolEl.setPosition(point);\n            data.setItemGraphicEl(newIdx, symbolEl);\n            group.add(symbolEl);\n          }\n        }).update(function (newIdx, oldIdx) {\n          var symbolEl = oldData.getItemGraphicEl(oldIdx);\n          var point = getSymbolPoint(newIdx);\n          if (!symbolNeedsDraw(data, point, newIdx, opt)) {\n            group.remove(symbolEl);\n            return;\n          }\n          var newSymbolType = data.getItemVisual(newIdx, 'symbol') || 'circle';\n          var oldSymbolType = symbolEl && symbolEl.getSymbolType && symbolEl.getSymbolType();\n          if (!symbolEl\n          // Create a new if symbol type changed.\n          || oldSymbolType && oldSymbolType !== newSymbolType) {\n            group.remove(symbolEl);\n            symbolEl = new SymbolCtor(data, newIdx, seriesScope, symbolUpdateOpt);\n            symbolEl.setPosition(point);\n          } else {\n            symbolEl.updateData(data, newIdx, seriesScope, symbolUpdateOpt);\n            var target = {\n              x: point[0],\n              y: point[1]\n            };\n            disableAnimation ? symbolEl.attr(target) : updateProps(symbolEl, target, seriesModel);\n          }\n          // Add back\n          group.add(symbolEl);\n          data.setItemGraphicEl(newIdx, symbolEl);\n        }).remove(function (oldIdx) {\n          var el = oldData.getItemGraphicEl(oldIdx);\n          el && el.fadeOut(function () {\n            group.remove(el);\n          }, seriesModel);\n        }).execute();\n        this._getSymbolPoint = getSymbolPoint;\n        this._data = data;\n      };\n      SymbolDraw.prototype.updateLayout = function () {\n        var _this = this;\n        var data = this._data;\n        if (data) {\n          // Not use animation\n          data.eachItemGraphicEl(function (el, idx) {\n            var point = _this._getSymbolPoint(idx);\n            el.setPosition(point);\n            el.markRedraw();\n          });\n        }\n      };\n      SymbolDraw.prototype.incrementalPrepareUpdate = function (data) {\n        this._seriesScope = makeSeriesScope(data);\n        this._data = null;\n        this.group.removeAll();\n      };\n      /**\r\n       * Update symbols draw by new data\r\n       */\n      SymbolDraw.prototype.incrementalUpdate = function (taskParams, data, opt) {\n        // Clear\n        this._progressiveEls = [];\n        opt = normalizeUpdateOpt(opt);\n        function updateIncrementalAndHover(el) {\n          if (!el.isGroup) {\n            el.incremental = true;\n            el.ensureState('emphasis').hoverLayer = true;\n          }\n        }\n        for (var idx = taskParams.start; idx < taskParams.end; idx++) {\n          var point = data.getItemLayout(idx);\n          if (symbolNeedsDraw(data, point, idx, opt)) {\n            var el = new this._SymbolCtor(data, idx, this._seriesScope);\n            el.traverse(updateIncrementalAndHover);\n            el.setPosition(point);\n            this.group.add(el);\n            data.setItemGraphicEl(idx, el);\n            this._progressiveEls.push(el);\n          }\n        }\n      };\n      SymbolDraw.prototype.eachRendered = function (cb) {\n        traverseElements(this._progressiveEls || this.group, cb);\n      };\n      SymbolDraw.prototype.remove = function (enableAnimation) {\n        var group = this.group;\n        var data = this._data;\n        // Incremental model do not have this._data.\n        if (data && enableAnimation) {\n          data.eachItemGraphicEl(function (el) {\n            el.fadeOut(function () {\n              group.remove(el);\n            }, data.hostModel);\n          });\n        } else {\n          group.removeAll();\n        }\n      };\n      return SymbolDraw;\n    }();\n\n    function prepareDataCoordInfo(coordSys, data, valueOrigin) {\n      var baseAxis = coordSys.getBaseAxis();\n      var valueAxis = coordSys.getOtherAxis(baseAxis);\n      var valueStart = getValueStart(valueAxis, valueOrigin);\n      var baseAxisDim = baseAxis.dim;\n      var valueAxisDim = valueAxis.dim;\n      var valueDim = data.mapDimension(valueAxisDim);\n      var baseDim = data.mapDimension(baseAxisDim);\n      var baseDataOffset = valueAxisDim === 'x' || valueAxisDim === 'radius' ? 1 : 0;\n      var dims = map(coordSys.dimensions, function (coordDim) {\n        return data.mapDimension(coordDim);\n      });\n      var stacked = false;\n      var stackResultDim = data.getCalculationInfo('stackResultDimension');\n      if (isDimensionStacked(data, dims[0] /* , dims[1] */)) {\n        // jshint ignore:line\n        stacked = true;\n        dims[0] = stackResultDim;\n      }\n      if (isDimensionStacked(data, dims[1] /* , dims[0] */)) {\n        // jshint ignore:line\n        stacked = true;\n        dims[1] = stackResultDim;\n      }\n      return {\n        dataDimsForPoint: dims,\n        valueStart: valueStart,\n        valueAxisDim: valueAxisDim,\n        baseAxisDim: baseAxisDim,\n        stacked: !!stacked,\n        valueDim: valueDim,\n        baseDim: baseDim,\n        baseDataOffset: baseDataOffset,\n        stackedOverDimension: data.getCalculationInfo('stackedOverDimension')\n      };\n    }\n    function getValueStart(valueAxis, valueOrigin) {\n      var valueStart = 0;\n      var extent = valueAxis.scale.getExtent();\n      if (valueOrigin === 'start') {\n        valueStart = extent[0];\n      } else if (valueOrigin === 'end') {\n        valueStart = extent[1];\n      }\n      // If origin is specified as a number, use it as\n      // valueStart directly\n      else if (isNumber(valueOrigin) && !isNaN(valueOrigin)) {\n        valueStart = valueOrigin;\n      }\n      // auto\n      else {\n        // Both positive\n        if (extent[0] > 0) {\n          valueStart = extent[0];\n        }\n        // Both negative\n        else if (extent[1] < 0) {\n          valueStart = extent[1];\n        }\n        // If is one positive, and one negative, onZero shall be true\n      }\n      return valueStart;\n    }\n    function getStackedOnPoint(dataCoordInfo, coordSys, data, idx) {\n      var value = NaN;\n      if (dataCoordInfo.stacked) {\n        value = data.get(data.getCalculationInfo('stackedOverDimension'), idx);\n      }\n      if (isNaN(value)) {\n        value = dataCoordInfo.valueStart;\n      }\n      var baseDataOffset = dataCoordInfo.baseDataOffset;\n      var stackedData = [];\n      stackedData[baseDataOffset] = data.get(dataCoordInfo.baseDim, idx);\n      stackedData[1 - baseDataOffset] = value;\n      return coordSys.dataToPoint(stackedData);\n    }\n\n    function diffData(oldData, newData) {\n      var diffResult = [];\n      newData.diff(oldData).add(function (idx) {\n        diffResult.push({\n          cmd: '+',\n          idx: idx\n        });\n      }).update(function (newIdx, oldIdx) {\n        diffResult.push({\n          cmd: '=',\n          idx: oldIdx,\n          idx1: newIdx\n        });\n      }).remove(function (idx) {\n        diffResult.push({\n          cmd: '-',\n          idx: idx\n        });\n      }).execute();\n      return diffResult;\n    }\n    function lineAnimationDiff(oldData, newData, oldStackedOnPoints, newStackedOnPoints, oldCoordSys, newCoordSys, oldValueOrigin, newValueOrigin) {\n      var diff = diffData(oldData, newData);\n      // let newIdList = newData.mapArray(newData.getId);\n      // let oldIdList = oldData.mapArray(oldData.getId);\n      // convertToIntId(newIdList, oldIdList);\n      // // FIXME One data ?\n      // diff = arrayDiff(oldIdList, newIdList);\n      var currPoints = [];\n      var nextPoints = [];\n      // Points for stacking base line\n      var currStackedPoints = [];\n      var nextStackedPoints = [];\n      var status = [];\n      var sortedIndices = [];\n      var rawIndices = [];\n      var newDataOldCoordInfo = prepareDataCoordInfo(oldCoordSys, newData, oldValueOrigin);\n      // const oldDataNewCoordInfo = prepareDataCoordInfo(newCoordSys, oldData, newValueOrigin);\n      var oldPoints = oldData.getLayout('points') || [];\n      var newPoints = newData.getLayout('points') || [];\n      for (var i = 0; i < diff.length; i++) {\n        var diffItem = diff[i];\n        var pointAdded = true;\n        var oldIdx2 = void 0;\n        var newIdx2 = void 0;\n        // FIXME, animation is not so perfect when dataZoom window moves fast\n        // Which is in case remvoing or add more than one data in the tail or head\n        switch (diffItem.cmd) {\n          case '=':\n            oldIdx2 = diffItem.idx * 2;\n            newIdx2 = diffItem.idx1 * 2;\n            var currentX = oldPoints[oldIdx2];\n            var currentY = oldPoints[oldIdx2 + 1];\n            var nextX = newPoints[newIdx2];\n            var nextY = newPoints[newIdx2 + 1];\n            // If previous data is NaN, use next point directly\n            if (isNaN(currentX) || isNaN(currentY)) {\n              currentX = nextX;\n              currentY = nextY;\n            }\n            currPoints.push(currentX, currentY);\n            nextPoints.push(nextX, nextY);\n            currStackedPoints.push(oldStackedOnPoints[oldIdx2], oldStackedOnPoints[oldIdx2 + 1]);\n            nextStackedPoints.push(newStackedOnPoints[newIdx2], newStackedOnPoints[newIdx2 + 1]);\n            rawIndices.push(newData.getRawIndex(diffItem.idx1));\n            break;\n          case '+':\n            var newIdx = diffItem.idx;\n            var newDataDimsForPoint = newDataOldCoordInfo.dataDimsForPoint;\n            var oldPt = oldCoordSys.dataToPoint([newData.get(newDataDimsForPoint[0], newIdx), newData.get(newDataDimsForPoint[1], newIdx)]);\n            newIdx2 = newIdx * 2;\n            currPoints.push(oldPt[0], oldPt[1]);\n            nextPoints.push(newPoints[newIdx2], newPoints[newIdx2 + 1]);\n            var stackedOnPoint = getStackedOnPoint(newDataOldCoordInfo, oldCoordSys, newData, newIdx);\n            currStackedPoints.push(stackedOnPoint[0], stackedOnPoint[1]);\n            nextStackedPoints.push(newStackedOnPoints[newIdx2], newStackedOnPoints[newIdx2 + 1]);\n            rawIndices.push(newData.getRawIndex(newIdx));\n            break;\n          case '-':\n            pointAdded = false;\n        }\n        // Original indices\n        if (pointAdded) {\n          status.push(diffItem);\n          sortedIndices.push(sortedIndices.length);\n        }\n      }\n      // Diff result may be crossed if all items are changed\n      // Sort by data index\n      sortedIndices.sort(function (a, b) {\n        return rawIndices[a] - rawIndices[b];\n      });\n      var len = currPoints.length;\n      var sortedCurrPoints = createFloat32Array(len);\n      var sortedNextPoints = createFloat32Array(len);\n      var sortedCurrStackedPoints = createFloat32Array(len);\n      var sortedNextStackedPoints = createFloat32Array(len);\n      var sortedStatus = [];\n      for (var i = 0; i < sortedIndices.length; i++) {\n        var idx = sortedIndices[i];\n        var i2 = i * 2;\n        var idx2 = idx * 2;\n        sortedCurrPoints[i2] = currPoints[idx2];\n        sortedCurrPoints[i2 + 1] = currPoints[idx2 + 1];\n        sortedNextPoints[i2] = nextPoints[idx2];\n        sortedNextPoints[i2 + 1] = nextPoints[idx2 + 1];\n        sortedCurrStackedPoints[i2] = currStackedPoints[idx2];\n        sortedCurrStackedPoints[i2 + 1] = currStackedPoints[idx2 + 1];\n        sortedNextStackedPoints[i2] = nextStackedPoints[idx2];\n        sortedNextStackedPoints[i2 + 1] = nextStackedPoints[idx2 + 1];\n        sortedStatus[i] = status[idx];\n      }\n      return {\n        current: sortedCurrPoints,\n        next: sortedNextPoints,\n        stackedOnCurrent: sortedCurrStackedPoints,\n        stackedOnNext: sortedNextStackedPoints,\n        status: sortedStatus\n      };\n    }\n\n    var mathMin$5 = Math.min;\n    var mathMax$5 = Math.max;\n    function isPointNull(x, y) {\n      return isNaN(x) || isNaN(y);\n    }\n    /**\r\n     * Draw smoothed line in non-monotone, in may cause undesired curve in extreme\r\n     * situations. This should be used when points are non-monotone neither in x or\r\n     * y dimension.\r\n     */\n    function drawSegment(ctx, points, start, segLen, allLen, dir, smooth, smoothMonotone, connectNulls) {\n      var prevX;\n      var prevY;\n      var cpx0;\n      var cpy0;\n      var cpx1;\n      var cpy1;\n      var idx = start;\n      var k = 0;\n      for (; k < segLen; k++) {\n        var x = points[idx * 2];\n        var y = points[idx * 2 + 1];\n        if (idx >= allLen || idx < 0) {\n          break;\n        }\n        if (isPointNull(x, y)) {\n          if (connectNulls) {\n            idx += dir;\n            continue;\n          }\n          break;\n        }\n        if (idx === start) {\n          ctx[dir > 0 ? 'moveTo' : 'lineTo'](x, y);\n          cpx0 = x;\n          cpy0 = y;\n        } else {\n          var dx = x - prevX;\n          var dy = y - prevY;\n          // Ignore tiny segment.\n          if (dx * dx + dy * dy < 0.5) {\n            idx += dir;\n            continue;\n          }\n          if (smooth > 0) {\n            var nextIdx = idx + dir;\n            var nextX = points[nextIdx * 2];\n            var nextY = points[nextIdx * 2 + 1];\n            // Ignore duplicate point\n            while (nextX === x && nextY === y && k < segLen) {\n              k++;\n              nextIdx += dir;\n              idx += dir;\n              nextX = points[nextIdx * 2];\n              nextY = points[nextIdx * 2 + 1];\n              x = points[idx * 2];\n              y = points[idx * 2 + 1];\n              dx = x - prevX;\n              dy = y - prevY;\n            }\n            var tmpK = k + 1;\n            if (connectNulls) {\n              // Find next point not null\n              while (isPointNull(nextX, nextY) && tmpK < segLen) {\n                tmpK++;\n                nextIdx += dir;\n                nextX = points[nextIdx * 2];\n                nextY = points[nextIdx * 2 + 1];\n              }\n            }\n            var ratioNextSeg = 0.5;\n            var vx = 0;\n            var vy = 0;\n            var nextCpx0 = void 0;\n            var nextCpy0 = void 0;\n            // Is last point\n            if (tmpK >= segLen || isPointNull(nextX, nextY)) {\n              cpx1 = x;\n              cpy1 = y;\n            } else {\n              vx = nextX - prevX;\n              vy = nextY - prevY;\n              var dx0 = x - prevX;\n              var dx1 = nextX - x;\n              var dy0 = y - prevY;\n              var dy1 = nextY - y;\n              var lenPrevSeg = void 0;\n              var lenNextSeg = void 0;\n              if (smoothMonotone === 'x') {\n                lenPrevSeg = Math.abs(dx0);\n                lenNextSeg = Math.abs(dx1);\n                var dir_1 = vx > 0 ? 1 : -1;\n                cpx1 = x - dir_1 * lenPrevSeg * smooth;\n                cpy1 = y;\n                nextCpx0 = x + dir_1 * lenNextSeg * smooth;\n                nextCpy0 = y;\n              } else if (smoothMonotone === 'y') {\n                lenPrevSeg = Math.abs(dy0);\n                lenNextSeg = Math.abs(dy1);\n                var dir_2 = vy > 0 ? 1 : -1;\n                cpx1 = x;\n                cpy1 = y - dir_2 * lenPrevSeg * smooth;\n                nextCpx0 = x;\n                nextCpy0 = y + dir_2 * lenNextSeg * smooth;\n              } else {\n                lenPrevSeg = Math.sqrt(dx0 * dx0 + dy0 * dy0);\n                lenNextSeg = Math.sqrt(dx1 * dx1 + dy1 * dy1);\n                // Use ratio of seg length\n                ratioNextSeg = lenNextSeg / (lenNextSeg + lenPrevSeg);\n                cpx1 = x - vx * smooth * (1 - ratioNextSeg);\n                cpy1 = y - vy * smooth * (1 - ratioNextSeg);\n                // cp0 of next segment\n                nextCpx0 = x + vx * smooth * ratioNextSeg;\n                nextCpy0 = y + vy * smooth * ratioNextSeg;\n                // Smooth constraint between point and next point.\n                // Avoid exceeding extreme after smoothing.\n                nextCpx0 = mathMin$5(nextCpx0, mathMax$5(nextX, x));\n                nextCpy0 = mathMin$5(nextCpy0, mathMax$5(nextY, y));\n                nextCpx0 = mathMax$5(nextCpx0, mathMin$5(nextX, x));\n                nextCpy0 = mathMax$5(nextCpy0, mathMin$5(nextY, y));\n                // Reclaculate cp1 based on the adjusted cp0 of next seg.\n                vx = nextCpx0 - x;\n                vy = nextCpy0 - y;\n                cpx1 = x - vx * lenPrevSeg / lenNextSeg;\n                cpy1 = y - vy * lenPrevSeg / lenNextSeg;\n                // Smooth constraint between point and prev point.\n                // Avoid exceeding extreme after smoothing.\n                cpx1 = mathMin$5(cpx1, mathMax$5(prevX, x));\n                cpy1 = mathMin$5(cpy1, mathMax$5(prevY, y));\n                cpx1 = mathMax$5(cpx1, mathMin$5(prevX, x));\n                cpy1 = mathMax$5(cpy1, mathMin$5(prevY, y));\n                // Adjust next cp0 again.\n                vx = x - cpx1;\n                vy = y - cpy1;\n                nextCpx0 = x + vx * lenNextSeg / lenPrevSeg;\n                nextCpy0 = y + vy * lenNextSeg / lenPrevSeg;\n              }\n            }\n            ctx.bezierCurveTo(cpx0, cpy0, cpx1, cpy1, x, y);\n            cpx0 = nextCpx0;\n            cpy0 = nextCpy0;\n          } else {\n            ctx.lineTo(x, y);\n          }\n        }\n        prevX = x;\n        prevY = y;\n        idx += dir;\n      }\n      return k;\n    }\n    var ECPolylineShape = /** @class */function () {\n      function ECPolylineShape() {\n        this.smooth = 0;\n        this.smoothConstraint = true;\n      }\n      return ECPolylineShape;\n    }();\n    var ECPolyline = /** @class */function (_super) {\n      __extends(ECPolyline, _super);\n      function ECPolyline(opts) {\n        var _this = _super.call(this, opts) || this;\n        _this.type = 'ec-polyline';\n        return _this;\n      }\n      ECPolyline.prototype.getDefaultStyle = function () {\n        return {\n          stroke: '#000',\n          fill: null\n        };\n      };\n      ECPolyline.prototype.getDefaultShape = function () {\n        return new ECPolylineShape();\n      };\n      ECPolyline.prototype.buildPath = function (ctx, shape) {\n        var points = shape.points;\n        var i = 0;\n        var len = points.length / 2;\n        // const result = getBoundingBox(points, shape.smoothConstraint);\n        if (shape.connectNulls) {\n          // Must remove first and last null values avoid draw error in polygon\n          for (; len > 0; len--) {\n            if (!isPointNull(points[len * 2 - 2], points[len * 2 - 1])) {\n              break;\n            }\n          }\n          for (; i < len; i++) {\n            if (!isPointNull(points[i * 2], points[i * 2 + 1])) {\n              break;\n            }\n          }\n        }\n        while (i < len) {\n          i += drawSegment(ctx, points, i, len, len, 1, shape.smooth, shape.smoothMonotone, shape.connectNulls) + 1;\n        }\n      };\n      ECPolyline.prototype.getPointOn = function (xOrY, dim) {\n        if (!this.path) {\n          this.createPathProxy();\n          this.buildPath(this.path, this.shape);\n        }\n        var path = this.path;\n        var data = path.data;\n        var CMD = PathProxy.CMD;\n        var x0;\n        var y0;\n        var isDimX = dim === 'x';\n        var roots = [];\n        for (var i = 0; i < data.length;) {\n          var cmd = data[i++];\n          var x = void 0;\n          var y = void 0;\n          var x2 = void 0;\n          var y2 = void 0;\n          var x3 = void 0;\n          var y3 = void 0;\n          var t = void 0;\n          switch (cmd) {\n            case CMD.M:\n              x0 = data[i++];\n              y0 = data[i++];\n              break;\n            case CMD.L:\n              x = data[i++];\n              y = data[i++];\n              t = isDimX ? (xOrY - x0) / (x - x0) : (xOrY - y0) / (y - y0);\n              if (t <= 1 && t >= 0) {\n                var val = isDimX ? (y - y0) * t + y0 : (x - x0) * t + x0;\n                return isDimX ? [xOrY, val] : [val, xOrY];\n              }\n              x0 = x;\n              y0 = y;\n              break;\n            case CMD.C:\n              x = data[i++];\n              y = data[i++];\n              x2 = data[i++];\n              y2 = data[i++];\n              x3 = data[i++];\n              y3 = data[i++];\n              var nRoot = isDimX ? cubicRootAt(x0, x, x2, x3, xOrY, roots) : cubicRootAt(y0, y, y2, y3, xOrY, roots);\n              if (nRoot > 0) {\n                for (var i_1 = 0; i_1 < nRoot; i_1++) {\n                  var t_1 = roots[i_1];\n                  if (t_1 <= 1 && t_1 >= 0) {\n                    var val = isDimX ? cubicAt(y0, y, y2, y3, t_1) : cubicAt(x0, x, x2, x3, t_1);\n                    return isDimX ? [xOrY, val] : [val, xOrY];\n                  }\n                }\n              }\n              x0 = x3;\n              y0 = y3;\n              break;\n          }\n        }\n      };\n      return ECPolyline;\n    }(Path);\n    var ECPolygonShape = /** @class */function (_super) {\n      __extends(ECPolygonShape, _super);\n      function ECPolygonShape() {\n        return _super !== null && _super.apply(this, arguments) || this;\n      }\n      return ECPolygonShape;\n    }(ECPolylineShape);\n    var ECPolygon = /** @class */function (_super) {\n      __extends(ECPolygon, _super);\n      function ECPolygon(opts) {\n        var _this = _super.call(this, opts) || this;\n        _this.type = 'ec-polygon';\n        return _this;\n      }\n      ECPolygon.prototype.getDefaultShape = function () {\n        return new ECPolygonShape();\n      };\n      ECPolygon.prototype.buildPath = function (ctx, shape) {\n        var points = shape.points;\n        var stackedOnPoints = shape.stackedOnPoints;\n        var i = 0;\n        var len = points.length / 2;\n        var smoothMonotone = shape.smoothMonotone;\n        if (shape.connectNulls) {\n          // Must remove first and last null values avoid draw error in polygon\n          for (; len > 0; len--) {\n            if (!isPointNull(points[len * 2 - 2], points[len * 2 - 1])) {\n              break;\n            }\n          }\n          for (; i < len; i++) {\n            if (!isPointNull(points[i * 2], points[i * 2 + 1])) {\n              break;\n            }\n          }\n        }\n        while (i < len) {\n          var k = drawSegment(ctx, points, i, len, len, 1, shape.smooth, smoothMonotone, shape.connectNulls);\n          drawSegment(ctx, stackedOnPoints, i + k - 1, k, len, -1, shape.stackedOnSmooth, smoothMonotone, shape.connectNulls);\n          i += k + 1;\n          ctx.closePath();\n        }\n      };\n      return ECPolygon;\n    }(Path);\n\n    function createGridClipPath(cartesian, hasAnimation, seriesModel, done, during) {\n      var rect = cartesian.getArea();\n      var x = rect.x;\n      var y = rect.y;\n      var width = rect.width;\n      var height = rect.height;\n      var lineWidth = seriesModel.get(['lineStyle', 'width']) || 0;\n      // Expand the clip path a bit to avoid the border is clipped and looks thinner\n      x -= lineWidth / 2;\n      y -= lineWidth / 2;\n      width += lineWidth;\n      height += lineWidth;\n      // fix: https://github.com/apache/incubator-echarts/issues/11369\n      width = Math.ceil(width);\n      if (x !== Math.floor(x)) {\n        x = Math.floor(x);\n        // if no extra 1px on `width`, it will still be clipped since `x` is floored\n        width++;\n      }\n      var clipPath = new Rect({\n        shape: {\n          x: x,\n          y: y,\n          width: width,\n          height: height\n        }\n      });\n      if (hasAnimation) {\n        var baseAxis = cartesian.getBaseAxis();\n        var isHorizontal = baseAxis.isHorizontal();\n        var isAxisInversed = baseAxis.inverse;\n        if (isHorizontal) {\n          if (isAxisInversed) {\n            clipPath.shape.x += width;\n          }\n          clipPath.shape.width = 0;\n        } else {\n          if (!isAxisInversed) {\n            clipPath.shape.y += height;\n          }\n          clipPath.shape.height = 0;\n        }\n        var duringCb = isFunction(during) ? function (percent) {\n          during(percent, clipPath);\n        } : null;\n        initProps(clipPath, {\n          shape: {\n            width: width,\n            height: height,\n            x: x,\n            y: y\n          }\n        }, seriesModel, null, done, duringCb);\n      }\n      return clipPath;\n    }\n    function createPolarClipPath(polar, hasAnimation, seriesModel) {\n      var sectorArea = polar.getArea();\n      // Avoid float number rounding error for symbol on the edge of axis extent.\n      var r0 = round(sectorArea.r0, 1);\n      var r = round(sectorArea.r, 1);\n      var clipPath = new Sector({\n        shape: {\n          cx: round(polar.cx, 1),\n          cy: round(polar.cy, 1),\n          r0: r0,\n          r: r,\n          startAngle: sectorArea.startAngle,\n          endAngle: sectorArea.endAngle,\n          clockwise: sectorArea.clockwise\n        }\n      });\n      if (hasAnimation) {\n        var isRadial = polar.getBaseAxis().dim === 'angle';\n        if (isRadial) {\n          clipPath.shape.endAngle = sectorArea.startAngle;\n        } else {\n          clipPath.shape.r = r0;\n        }\n        initProps(clipPath, {\n          shape: {\n            endAngle: sectorArea.endAngle,\n            r: r\n          }\n        }, seriesModel);\n      }\n      return clipPath;\n    }\n    function createClipPath(coordSys, hasAnimation, seriesModel, done, during) {\n      if (!coordSys) {\n        return null;\n      } else if (coordSys.type === 'polar') {\n        return createPolarClipPath(coordSys, hasAnimation, seriesModel);\n      } else if (coordSys.type === 'cartesian2d') {\n        return createGridClipPath(coordSys, hasAnimation, seriesModel, done, during);\n      }\n      return null;\n    }\n\n    /*\n    * Licensed to the Apache Software Foundation (ASF) under one\n    * or more contributor license agreements.  See the NOTICE file\n    * distributed with this work for additional information\n    * regarding copyright ownership.  The ASF licenses this file\n    * to you under the Apache License, Version 2.0 (the\n    * \"License\"); you may not use this file except in compliance\n    * with the License.  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,\n    * software distributed under the License is distributed on an\n    * \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\n    * KIND, either express or implied.  See the License for the\n    * specific language governing permissions and limitations\n    * under the License.\n    */\n\n\n    /**\n     * AUTO-GENERATED FILE. DO NOT MODIFY.\n     */\n\n    /*\r\n    * Licensed to the Apache Software Foundation (ASF) under one\r\n    * or more contributor license agreements.  See the NOTICE file\r\n    * distributed with this work for additional information\r\n    * regarding copyright ownership.  The ASF licenses this file\r\n    * to you under the Apache License, Version 2.0 (the\r\n    * \"License\"); you may not use this file except in compliance\r\n    * with the License.  You may obtain a copy of the License at\r\n    *\r\n    *   http://www.apache.org/licenses/LICENSE-2.0\r\n    *\r\n    * Unless required by applicable law or agreed to in writing,\r\n    * software distributed under the License is distributed on an\r\n    * \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\r\n    * KIND, either express or implied.  See the License for the\r\n    * specific language governing permissions and limitations\r\n    * under the License.\r\n    */\n    function isCoordinateSystemType(coordSys, type) {\n      return coordSys.type === type;\n    }\n\n    function isPointsSame(points1, points2) {\n      if (points1.length !== points2.length) {\n        return;\n      }\n      for (var i = 0; i < points1.length; i++) {\n        if (points1[i] !== points2[i]) {\n          return;\n        }\n      }\n      return true;\n    }\n    function bboxFromPoints(points) {\n      var minX = Infinity;\n      var minY = Infinity;\n      var maxX = -Infinity;\n      var maxY = -Infinity;\n      for (var i = 0; i < points.length;) {\n        var x = points[i++];\n        var y = points[i++];\n        if (!isNaN(x)) {\n          minX = Math.min(x, minX);\n          maxX = Math.max(x, maxX);\n        }\n        if (!isNaN(y)) {\n          minY = Math.min(y, minY);\n          maxY = Math.max(y, maxY);\n        }\n      }\n      return [[minX, minY], [maxX, maxY]];\n    }\n    function getBoundingDiff(points1, points2) {\n      var _a = bboxFromPoints(points1),\n        min1 = _a[0],\n        max1 = _a[1];\n      var _b = bboxFromPoints(points2),\n        min2 = _b[0],\n        max2 = _b[1];\n      // Get a max value from each corner of two boundings.\n      return Math.max(Math.abs(min1[0] - min2[0]), Math.abs(min1[1] - min2[1]), Math.abs(max1[0] - max2[0]), Math.abs(max1[1] - max2[1]));\n    }\n    function getSmooth(smooth) {\n      return isNumber(smooth) ? smooth : smooth ? 0.5 : 0;\n    }\n    function getStackedOnPoints(coordSys, data, dataCoordInfo) {\n      if (!dataCoordInfo.valueDim) {\n        return [];\n      }\n      var len = data.count();\n      var points = createFloat32Array(len * 2);\n      for (var idx = 0; idx < len; idx++) {\n        var pt = getStackedOnPoint(dataCoordInfo, coordSys, data, idx);\n        points[idx * 2] = pt[0];\n        points[idx * 2 + 1] = pt[1];\n      }\n      return points;\n    }\n    /**\r\n     * Filter the null data and extend data for step considering `stepTurnAt`\r\n     *\r\n     * @param points data to convert, that may containing null\r\n     * @param basePoints base data to reference, used only for areaStyle points\r\n     * @param coordSys coordinate system\r\n     * @param stepTurnAt 'start' | 'end' | 'middle' | true\r\n     * @param connectNulls whether to connect nulls\r\n     * @returns converted point positions\r\n     */\n    function turnPointsIntoStep(points, basePoints, coordSys, stepTurnAt, connectNulls) {\n      var baseAxis = coordSys.getBaseAxis();\n      var baseIndex = baseAxis.dim === 'x' || baseAxis.dim === 'radius' ? 0 : 1;\n      var stepPoints = [];\n      var i = 0;\n      var stepPt = [];\n      var pt = [];\n      var nextPt = [];\n      var filteredPoints = [];\n      if (connectNulls) {\n        for (i = 0; i < points.length; i += 2) {\n          /**\r\n           * For areaStyle of stepped lines, `stackedOnPoints` should be\r\n           * filtered the same as `points` so that the base axis values\r\n           * should stay the same as the lines above. See #20021\r\n           */\n          var reference = basePoints || points;\n          if (!isNaN(reference[i]) && !isNaN(reference[i + 1])) {\n            filteredPoints.push(points[i], points[i + 1]);\n          }\n        }\n        points = filteredPoints;\n      }\n      for (i = 0; i < points.length - 2; i += 2) {\n        nextPt[0] = points[i + 2];\n        nextPt[1] = points[i + 3];\n        pt[0] = points[i];\n        pt[1] = points[i + 1];\n        stepPoints.push(pt[0], pt[1]);\n        switch (stepTurnAt) {\n          case 'end':\n            stepPt[baseIndex] = nextPt[baseIndex];\n            stepPt[1 - baseIndex] = pt[1 - baseIndex];\n            stepPoints.push(stepPt[0], stepPt[1]);\n            break;\n          case 'middle':\n            var middle = (pt[baseIndex] + nextPt[baseIndex]) / 2;\n            var stepPt2 = [];\n            stepPt[baseIndex] = stepPt2[baseIndex] = middle;\n            stepPt[1 - baseIndex] = pt[1 - baseIndex];\n            stepPt2[1 - baseIndex] = nextPt[1 - baseIndex];\n            stepPoints.push(stepPt[0], stepPt[1]);\n            stepPoints.push(stepPt2[0], stepPt2[1]);\n            break;\n          default:\n            // default is start\n            stepPt[baseIndex] = pt[baseIndex];\n            stepPt[1 - baseIndex] = nextPt[1 - baseIndex];\n            stepPoints.push(stepPt[0], stepPt[1]);\n        }\n      }\n      // Last points\n      stepPoints.push(points[i++], points[i++]);\n      return stepPoints;\n    }\n    /**\r\n     * Clip color stops to edge. Avoid creating too large gradients.\r\n     * Which may lead to blurry when GPU acceleration is enabled. See #15680\r\n     *\r\n     * The stops has been sorted from small to large.\r\n     */\n    function clipColorStops(colorStops, maxSize) {\n      var newColorStops = [];\n      var len = colorStops.length;\n      // coord will always < 0 in prevOutOfRangeColorStop.\n      var prevOutOfRangeColorStop;\n      var prevInRangeColorStop;\n      function lerpStop(stop0, stop1, clippedCoord) {\n        var coord0 = stop0.coord;\n        var p = (clippedCoord - coord0) / (stop1.coord - coord0);\n        var color = lerp$1(p, [stop0.color, stop1.color]);\n        return {\n          coord: clippedCoord,\n          color: color\n        };\n      }\n      for (var i = 0; i < len; i++) {\n        var stop_1 = colorStops[i];\n        var coord = stop_1.coord;\n        if (coord < 0) {\n          prevOutOfRangeColorStop = stop_1;\n        } else if (coord > maxSize) {\n          if (prevInRangeColorStop) {\n            newColorStops.push(lerpStop(prevInRangeColorStop, stop_1, maxSize));\n          } else if (prevOutOfRangeColorStop) {\n            // If there are two stops and coord range is between these two stops\n            newColorStops.push(lerpStop(prevOutOfRangeColorStop, stop_1, 0), lerpStop(prevOutOfRangeColorStop, stop_1, maxSize));\n          }\n          // All following stop will be out of range. So just ignore them.\n          break;\n        } else {\n          if (prevOutOfRangeColorStop) {\n            newColorStops.push(lerpStop(prevOutOfRangeColorStop, stop_1, 0));\n            // Reset\n            prevOutOfRangeColorStop = null;\n          }\n          newColorStops.push(stop_1);\n          prevInRangeColorStop = stop_1;\n        }\n      }\n      return newColorStops;\n    }\n    function getVisualGradient(data, coordSys, api) {\n      var visualMetaList = data.getVisual('visualMeta');\n      if (!visualMetaList || !visualMetaList.length || !data.count()) {\n        // When data.count() is 0, gradient range can not be calculated.\n        return;\n      }\n      if (coordSys.type !== 'cartesian2d') {\n        if (\"development\" !== 'production') {\n          console.warn('Visual map on line style is only supported on cartesian2d.');\n        }\n        return;\n      }\n      var coordDim;\n      var visualMeta;\n      for (var i = visualMetaList.length - 1; i >= 0; i--) {\n        var dimInfo = data.getDimensionInfo(visualMetaList[i].dimension);\n        coordDim = dimInfo && dimInfo.coordDim;\n        // Can only be x or y\n        if (coordDim === 'x' || coordDim === 'y') {\n          visualMeta = visualMetaList[i];\n          break;\n        }\n      }\n      if (!visualMeta) {\n        if (\"development\" !== 'production') {\n          console.warn('Visual map on line style only support x or y dimension.');\n        }\n        return;\n      }\n      // If the area to be rendered is bigger than area defined by LinearGradient,\n      // the canvas spec prescribes that the color of the first stop and the last\n      // stop should be used. But if two stops are added at offset 0, in effect\n      // browsers use the color of the second stop to render area outside\n      // LinearGradient. So we can only infinitesimally extend area defined in\n      // LinearGradient to render `outerColors`.\n      var axis = coordSys.getAxis(coordDim);\n      // dataToCoord mapping may not be linear, but must be monotonic.\n      var colorStops = map(visualMeta.stops, function (stop) {\n        // offset will be calculated later.\n        return {\n          coord: axis.toGlobalCoord(axis.dataToCoord(stop.value)),\n          color: stop.color\n        };\n      });\n      var stopLen = colorStops.length;\n      var outerColors = visualMeta.outerColors.slice();\n      if (stopLen && colorStops[0].coord > colorStops[stopLen - 1].coord) {\n        colorStops.reverse();\n        outerColors.reverse();\n      }\n      var colorStopsInRange = clipColorStops(colorStops, coordDim === 'x' ? api.getWidth() : api.getHeight());\n      var inRangeStopLen = colorStopsInRange.length;\n      if (!inRangeStopLen && stopLen) {\n        // All stops are out of range. All will be the same color.\n        return colorStops[0].coord < 0 ? outerColors[1] ? outerColors[1] : colorStops[stopLen - 1].color : outerColors[0] ? outerColors[0] : colorStops[0].color;\n      }\n      var tinyExtent = 10; // Arbitrary value: 10px\n      var minCoord = colorStopsInRange[0].coord - tinyExtent;\n      var maxCoord = colorStopsInRange[inRangeStopLen - 1].coord + tinyExtent;\n      var coordSpan = maxCoord - minCoord;\n      if (coordSpan < 1e-3) {\n        return 'transparent';\n      }\n      each(colorStopsInRange, function (stop) {\n        stop.offset = (stop.coord - minCoord) / coordSpan;\n      });\n      colorStopsInRange.push({\n        // NOTE: inRangeStopLen may still be 0 if stoplen is zero.\n        offset: inRangeStopLen ? colorStopsInRange[inRangeStopLen - 1].offset : 0.5,\n        color: outerColors[1] || 'transparent'\n      });\n      colorStopsInRange.unshift({\n        offset: inRangeStopLen ? colorStopsInRange[0].offset : 0.5,\n        color: outerColors[0] || 'transparent'\n      });\n      var gradient = new LinearGradient(0, 0, 0, 0, colorStopsInRange, true);\n      gradient[coordDim] = minCoord;\n      gradient[coordDim + '2'] = maxCoord;\n      return gradient;\n    }\n    function getIsIgnoreFunc(seriesModel, data, coordSys) {\n      var showAllSymbol = seriesModel.get('showAllSymbol');\n      var isAuto = showAllSymbol === 'auto';\n      if (showAllSymbol && !isAuto) {\n        return;\n      }\n      var categoryAxis = coordSys.getAxesByScale('ordinal')[0];\n      if (!categoryAxis) {\n        return;\n      }\n      // Note that category label interval strategy might bring some weird effect\n      // in some scenario: users may wonder why some of the symbols are not\n      // displayed. So we show all symbols as possible as we can.\n      if (isAuto\n      // Simplify the logic, do not determine label overlap here.\n      && canShowAllSymbolForCategory(categoryAxis, data)) {\n        return;\n      }\n      // Otherwise follow the label interval strategy on category axis.\n      var categoryDataDim = data.mapDimension(categoryAxis.dim);\n      var labelMap = {};\n      each(categoryAxis.getViewLabels(), function (labelItem) {\n        var ordinalNumber = categoryAxis.scale.getRawOrdinalNumber(labelItem.tickValue);\n        labelMap[ordinalNumber] = 1;\n      });\n      return function (dataIndex) {\n        return !labelMap.hasOwnProperty(data.get(categoryDataDim, dataIndex));\n      };\n    }\n    function canShowAllSymbolForCategory(categoryAxis, data) {\n      // In most cases, line is monotonous on category axis, and the label size\n      // is close with each other. So we check the symbol size and some of the\n      // label size alone with the category axis to estimate whether all symbol\n      // can be shown without overlap.\n      var axisExtent = categoryAxis.getExtent();\n      var availSize = Math.abs(axisExtent[1] - axisExtent[0]) / categoryAxis.scale.count();\n      isNaN(availSize) && (availSize = 0); // 0/0 is NaN.\n      // Sampling some points, max 5.\n      var dataLen = data.count();\n      var step = Math.max(1, Math.round(dataLen / 5));\n      for (var dataIndex = 0; dataIndex < dataLen; dataIndex += step) {\n        if (Symbol.getSymbolSize(data, dataIndex\n        // Only for cartesian, where `isHorizontal` exists.\n        )[categoryAxis.isHorizontal() ? 1 : 0]\n        // Empirical number\n        * 1.5 > availSize) {\n          return false;\n        }\n      }\n      return true;\n    }\n    function isPointNull$1(x, y) {\n      return isNaN(x) || isNaN(y);\n    }\n    function getLastIndexNotNull(points) {\n      var len = points.length / 2;\n      for (; len > 0; len--) {\n        if (!isPointNull$1(points[len * 2 - 2], points[len * 2 - 1])) {\n          break;\n        }\n      }\n      return len - 1;\n    }\n    function getPointAtIndex(points, idx) {\n      return [points[idx * 2], points[idx * 2 + 1]];\n    }\n    function getIndexRange(points, xOrY, dim) {\n      var len = points.length / 2;\n      var dimIdx = dim === 'x' ? 0 : 1;\n      var a;\n      var b;\n      var prevIndex = 0;\n      var nextIndex = -1;\n      for (var i = 0; i < len; i++) {\n        b = points[i * 2 + dimIdx];\n        if (isNaN(b) || isNaN(points[i * 2 + 1 - dimIdx])) {\n          continue;\n        }\n        if (i === 0) {\n          a = b;\n          continue;\n        }\n        if (a <= xOrY && b >= xOrY || a >= xOrY && b <= xOrY) {\n          nextIndex = i;\n          break;\n        }\n        prevIndex = i;\n        a = b;\n      }\n      return {\n        range: [prevIndex, nextIndex],\n        t: (xOrY - a) / (b - a)\n      };\n    }\n    function anyStateShowEndLabel(seriesModel) {\n      if (seriesModel.get(['endLabel', 'show'])) {\n        return true;\n      }\n      for (var i = 0; i < SPECIAL_STATES.length; i++) {\n        if (seriesModel.get([SPECIAL_STATES[i], 'endLabel', 'show'])) {\n          return true;\n        }\n      }\n      return false;\n    }\n    function createLineClipPath(lineView, coordSys, hasAnimation, seriesModel) {\n      if (isCoordinateSystemType(coordSys, 'cartesian2d')) {\n        var endLabelModel_1 = seriesModel.getModel('endLabel');\n        var valueAnimation_1 = endLabelModel_1.get('valueAnimation');\n        var data_1 = seriesModel.getData();\n        var labelAnimationRecord_1 = {\n          lastFrameIndex: 0\n        };\n        var during = anyStateShowEndLabel(seriesModel) ? function (percent, clipRect) {\n          lineView._endLabelOnDuring(percent, clipRect, data_1, labelAnimationRecord_1, valueAnimation_1, endLabelModel_1, coordSys);\n        } : null;\n        var isHorizontal = coordSys.getBaseAxis().isHorizontal();\n        var clipPath = createGridClipPath(coordSys, hasAnimation, seriesModel, function () {\n          var endLabel = lineView._endLabel;\n          if (endLabel && hasAnimation) {\n            if (labelAnimationRecord_1.originalX != null) {\n              endLabel.attr({\n                x: labelAnimationRecord_1.originalX,\n                y: labelAnimationRecord_1.originalY\n              });\n            }\n          }\n        }, during);\n        // Expand clip shape to avoid clipping when line value exceeds axis\n        if (!seriesModel.get('clip', true)) {\n          var rectShape = clipPath.shape;\n          var expandSize = Math.max(rectShape.width, rectShape.height);\n          if (isHorizontal) {\n            rectShape.y -= expandSize;\n            rectShape.height += expandSize * 2;\n          } else {\n            rectShape.x -= expandSize;\n            rectShape.width += expandSize * 2;\n          }\n        }\n        // Set to the final frame. To make sure label layout is right.\n        if (during) {\n          during(1, clipPath);\n        }\n        return clipPath;\n      } else {\n        if (\"development\" !== 'production') {\n          if (seriesModel.get(['endLabel', 'show'])) {\n            console.warn('endLabel is not supported for lines in polar systems.');\n          }\n        }\n        return createPolarClipPath(coordSys, hasAnimation, seriesModel);\n      }\n    }\n    function getEndLabelStateSpecified(endLabelModel, coordSys) {\n      var baseAxis = coordSys.getBaseAxis();\n      var isHorizontal = baseAxis.isHorizontal();\n      var isBaseInversed = baseAxis.inverse;\n      var align = isHorizontal ? isBaseInversed ? 'right' : 'left' : 'center';\n      var verticalAlign = isHorizontal ? 'middle' : isBaseInversed ? 'top' : 'bottom';\n      return {\n        normal: {\n          align: endLabelModel.get('align') || align,\n          verticalAlign: endLabelModel.get('verticalAlign') || verticalAlign\n        }\n      };\n    }\n    var LineView = /** @class */function (_super) {\n      __extends(LineView, _super);\n      function LineView() {\n        return _super !== null && _super.apply(this, arguments) || this;\n      }\n      LineView.prototype.init = function () {\n        var lineGroup = new Group();\n        var symbolDraw = new SymbolDraw();\n        this.group.add(symbolDraw.group);\n        this._symbolDraw = symbolDraw;\n        this._lineGroup = lineGroup;\n        this._changePolyState = bind(this._changePolyState, this);\n      };\n      LineView.prototype.render = function (seriesModel, ecModel, api) {\n        var coordSys = seriesModel.coordinateSystem;\n        var group = this.group;\n        var data = seriesModel.getData();\n        var lineStyleModel = seriesModel.getModel('lineStyle');\n        var areaStyleModel = seriesModel.getModel('areaStyle');\n        var points = data.getLayout('points') || [];\n        var isCoordSysPolar = coordSys.type === 'polar';\n        var prevCoordSys = this._coordSys;\n        var symbolDraw = this._symbolDraw;\n        var polyline = this._polyline;\n        var polygon = this._polygon;\n        var lineGroup = this._lineGroup;\n        var hasAnimation = !ecModel.ssr && seriesModel.get('animation');\n        var isAreaChart = !areaStyleModel.isEmpty();\n        var valueOrigin = areaStyleModel.get('origin');\n        var dataCoordInfo = prepareDataCoordInfo(coordSys, data, valueOrigin);\n        var stackedOnPoints = isAreaChart && getStackedOnPoints(coordSys, data, dataCoordInfo);\n        var showSymbol = seriesModel.get('showSymbol');\n        var connectNulls = seriesModel.get('connectNulls');\n        var isIgnoreFunc = showSymbol && !isCoordSysPolar && getIsIgnoreFunc(seriesModel, data, coordSys);\n        // Remove temporary symbols\n        var oldData = this._data;\n        oldData && oldData.eachItemGraphicEl(function (el, idx) {\n          if (el.__temp) {\n            group.remove(el);\n            oldData.setItemGraphicEl(idx, null);\n          }\n        });\n        // Remove previous created symbols if showSymbol changed to false\n        if (!showSymbol) {\n          symbolDraw.remove();\n        }\n        group.add(lineGroup);\n        // FIXME step not support polar\n        var step = !isCoordSysPolar ? seriesModel.get('step') : false;\n        var clipShapeForSymbol;\n        if (coordSys && coordSys.getArea && seriesModel.get('clip', true)) {\n          clipShapeForSymbol = coordSys.getArea();\n          // Avoid float number rounding error for symbol on the edge of axis extent.\n          // See #7913 and `test/dataZoom-clip.html`.\n          if (clipShapeForSymbol.width != null) {\n            clipShapeForSymbol.x -= 0.1;\n            clipShapeForSymbol.y -= 0.1;\n            clipShapeForSymbol.width += 0.2;\n            clipShapeForSymbol.height += 0.2;\n          } else if (clipShapeForSymbol.r0) {\n            clipShapeForSymbol.r0 -= 0.5;\n            clipShapeForSymbol.r += 0.5;\n          }\n        }\n        this._clipShapeForSymbol = clipShapeForSymbol;\n        var visualColor = getVisualGradient(data, coordSys, api) || data.getVisual('style')[data.getVisual('drawType')];\n        // Initialization animation or coordinate system changed\n        if (!(polyline && prevCoordSys.type === coordSys.type && step === this._step)) {\n          showSymbol && symbolDraw.updateData(data, {\n            isIgnore: isIgnoreFunc,\n            clipShape: clipShapeForSymbol,\n            disableAnimation: true,\n            getSymbolPoint: function (idx) {\n              return [points[idx * 2], points[idx * 2 + 1]];\n            }\n          });\n          hasAnimation && this._initSymbolLabelAnimation(data, coordSys, clipShapeForSymbol);\n          if (step) {\n            if (stackedOnPoints) {\n              stackedOnPoints = turnPointsIntoStep(stackedOnPoints, points, coordSys, step, connectNulls);\n            }\n            // TODO If stacked series is not step\n            points = turnPointsIntoStep(points, null, coordSys, step, connectNulls);\n          }\n          polyline = this._newPolyline(points);\n          if (isAreaChart) {\n            polygon = this._newPolygon(points, stackedOnPoints);\n          } // If areaStyle is removed\n          else if (polygon) {\n            lineGroup.remove(polygon);\n            polygon = this._polygon = null;\n          }\n          // NOTE: Must update _endLabel before setClipPath.\n          if (!isCoordSysPolar) {\n            this._initOrUpdateEndLabel(seriesModel, coordSys, convertToColorString(visualColor));\n          }\n          lineGroup.setClipPath(createLineClipPath(this, coordSys, true, seriesModel));\n        } else {\n          if (isAreaChart && !polygon) {\n            // If areaStyle is added\n            polygon = this._newPolygon(points, stackedOnPoints);\n          } else if (polygon && !isAreaChart) {\n            // If areaStyle is removed\n            lineGroup.remove(polygon);\n            polygon = this._polygon = null;\n          }\n          // NOTE: Must update _endLabel before setClipPath.\n          if (!isCoordSysPolar) {\n            this._initOrUpdateEndLabel(seriesModel, coordSys, convertToColorString(visualColor));\n          }\n          // Update clipPath\n          var oldClipPath = lineGroup.getClipPath();\n          if (oldClipPath) {\n            var newClipPath = createLineClipPath(this, coordSys, false, seriesModel);\n            initProps(oldClipPath, {\n              shape: newClipPath.shape\n            }, seriesModel);\n          } else {\n            lineGroup.setClipPath(createLineClipPath(this, coordSys, true, seriesModel));\n          }\n          // Always update, or it is wrong in the case turning on legend\n          // because points are not changed.\n          showSymbol && symbolDraw.updateData(data, {\n            isIgnore: isIgnoreFunc,\n            clipShape: clipShapeForSymbol,\n            disableAnimation: true,\n            getSymbolPoint: function (idx) {\n              return [points[idx * 2], points[idx * 2 + 1]];\n            }\n          });\n          // In the case data zoom triggered refreshing frequently\n          // Data may not change if line has a category axis. So it should animate nothing.\n          if (!isPointsSame(this._stackedOnPoints, stackedOnPoints) || !isPointsSame(this._points, points)) {\n            if (hasAnimation) {\n              this._doUpdateAnimation(data, stackedOnPoints, coordSys, api, step, valueOrigin, connectNulls);\n            } else {\n              // Not do it in update with animation\n              if (step) {\n                if (stackedOnPoints) {\n                  stackedOnPoints = turnPointsIntoStep(stackedOnPoints, points, coordSys, step, connectNulls);\n                }\n                // TODO If stacked series is not step\n                points = turnPointsIntoStep(points, null, coordSys, step, connectNulls);\n              }\n              polyline.setShape({\n                points: points\n              });\n              polygon && polygon.setShape({\n                points: points,\n                stackedOnPoints: stackedOnPoints\n              });\n            }\n          }\n        }\n        var emphasisModel = seriesModel.getModel('emphasis');\n        var focus = emphasisModel.get('focus');\n        var blurScope = emphasisModel.get('blurScope');\n        var emphasisDisabled = emphasisModel.get('disabled');\n        polyline.useStyle(defaults(\n        // Use color in lineStyle first\n        lineStyleModel.getLineStyle(), {\n          fill: 'none',\n          stroke: visualColor,\n          lineJoin: 'bevel'\n        }));\n        setStatesStylesFromModel(polyline, seriesModel, 'lineStyle');\n        if (polyline.style.lineWidth > 0 && seriesModel.get(['emphasis', 'lineStyle', 'width']) === 'bolder') {\n          var emphasisLineStyle = polyline.getState('emphasis').style;\n          emphasisLineStyle.lineWidth = +polyline.style.lineWidth + 1;\n        }\n        // Needs seriesIndex for focus\n        getECData(polyline).seriesIndex = seriesModel.seriesIndex;\n        toggleHoverEmphasis(polyline, focus, blurScope, emphasisDisabled);\n        var smooth = getSmooth(seriesModel.get('smooth'));\n        var smoothMonotone = seriesModel.get('smoothMonotone');\n        polyline.setShape({\n          smooth: smooth,\n          smoothMonotone: smoothMonotone,\n          connectNulls: connectNulls\n        });\n        if (polygon) {\n          var stackedOnSeries = data.getCalculationInfo('stackedOnSeries');\n          var stackedOnSmooth = 0;\n          polygon.useStyle(defaults(areaStyleModel.getAreaStyle(), {\n            fill: visualColor,\n            opacity: 0.7,\n            lineJoin: 'bevel',\n            decal: data.getVisual('style').decal\n          }));\n          if (stackedOnSeries) {\n            stackedOnSmooth = getSmooth(stackedOnSeries.get('smooth'));\n          }\n          polygon.setShape({\n            smooth: smooth,\n            stackedOnSmooth: stackedOnSmooth,\n            smoothMonotone: smoothMonotone,\n            connectNulls: connectNulls\n          });\n          setStatesStylesFromModel(polygon, seriesModel, 'areaStyle');\n          // Needs seriesIndex for focus\n          getECData(polygon).seriesIndex = seriesModel.seriesIndex;\n          toggleHoverEmphasis(polygon, focus, blurScope, emphasisDisabled);\n        }\n        var changePolyState = this._changePolyState;\n        data.eachItemGraphicEl(function (el) {\n          // Switch polyline / polygon state if element changed its state.\n          el && (el.onHoverStateChange = changePolyState);\n        });\n        this._polyline.onHoverStateChange = changePolyState;\n        this._data = data;\n        // Save the coordinate system for transition animation when data changed\n        this._coordSys = coordSys;\n        this._stackedOnPoints = stackedOnPoints;\n        this._points = points;\n        this._step = step;\n        this._valueOrigin = valueOrigin;\n        if (seriesModel.get('triggerLineEvent')) {\n          this.packEventData(seriesModel, polyline);\n          polygon && this.packEventData(seriesModel, polygon);\n        }\n      };\n      LineView.prototype.packEventData = function (seriesModel, el) {\n        getECData(el).eventData = {\n          componentType: 'series',\n          componentSubType: 'line',\n          componentIndex: seriesModel.componentIndex,\n          seriesIndex: seriesModel.seriesIndex,\n          seriesName: seriesModel.name,\n          seriesType: 'line'\n        };\n      };\n      LineView.prototype.highlight = function (seriesModel, ecModel, api, payload) {\n        var data = seriesModel.getData();\n        var dataIndex = queryDataIndex(data, payload);\n        this._changePolyState('emphasis');\n        if (!(dataIndex instanceof Array) && dataIndex != null && dataIndex >= 0) {\n          var points = data.getLayout('points');\n          var symbol = data.getItemGraphicEl(dataIndex);\n          if (!symbol) {\n            // Create a temporary symbol if it is not exists\n            var x = points[dataIndex * 2];\n            var y = points[dataIndex * 2 + 1];\n            if (isNaN(x) || isNaN(y)) {\n              // Null data\n              return;\n            }\n            // fix #11360: shouldn't draw symbol outside clipShapeForSymbol\n            if (this._clipShapeForSymbol && !this._clipShapeForSymbol.contain(x, y)) {\n              return;\n            }\n            var zlevel = seriesModel.get('zlevel') || 0;\n            var z = seriesModel.get('z') || 0;\n            symbol = new Symbol(data, dataIndex);\n            symbol.x = x;\n            symbol.y = y;\n            symbol.setZ(zlevel, z);\n            // ensure label text of the temporary symbol is in front of line and area polygon\n            var symbolLabel = symbol.getSymbolPath().getTextContent();\n            if (symbolLabel) {\n              symbolLabel.zlevel = zlevel;\n              symbolLabel.z = z;\n              symbolLabel.z2 = this._polyline.z2 + 1;\n            }\n            symbol.__temp = true;\n            data.setItemGraphicEl(dataIndex, symbol);\n            // Stop scale animation\n            symbol.stopSymbolAnimation(true);\n            this.group.add(symbol);\n          }\n          symbol.highlight();\n        } else {\n          // Highlight whole series\n          ChartView.prototype.highlight.call(this, seriesModel, ecModel, api, payload);\n        }\n      };\n      LineView.prototype.downplay = function (seriesModel, ecModel, api, payload) {\n        var data = seriesModel.getData();\n        var dataIndex = queryDataIndex(data, payload);\n        this._changePolyState('normal');\n        if (dataIndex != null && dataIndex >= 0) {\n          var symbol = data.getItemGraphicEl(dataIndex);\n          if (symbol) {\n            if (symbol.__temp) {\n              data.setItemGraphicEl(dataIndex, null);\n              this.group.remove(symbol);\n            } else {\n              symbol.downplay();\n            }\n          }\n        } else {\n          // FIXME\n          // can not downplay completely.\n          // Downplay whole series\n          ChartView.prototype.downplay.call(this, seriesModel, ecModel, api, payload);\n        }\n      };\n      LineView.prototype._changePolyState = function (toState) {\n        var polygon = this._polygon;\n        setStatesFlag(this._polyline, toState);\n        polygon && setStatesFlag(polygon, toState);\n      };\n      LineView.prototype._newPolyline = function (points) {\n        var polyline = this._polyline;\n        // Remove previous created polyline\n        if (polyline) {\n          this._lineGroup.remove(polyline);\n        }\n        polyline = new ECPolyline({\n          shape: {\n            points: points\n          },\n          segmentIgnoreThreshold: 2,\n          z2: 10\n        });\n        this._lineGroup.add(polyline);\n        this._polyline = polyline;\n        return polyline;\n      };\n      LineView.prototype._newPolygon = function (points, stackedOnPoints) {\n        var polygon = this._polygon;\n        // Remove previous created polygon\n        if (polygon) {\n          this._lineGroup.remove(polygon);\n        }\n        polygon = new ECPolygon({\n          shape: {\n            points: points,\n            stackedOnPoints: stackedOnPoints\n          },\n          segmentIgnoreThreshold: 2\n        });\n        this._lineGroup.add(polygon);\n        this._polygon = polygon;\n        return polygon;\n      };\n      LineView.prototype._initSymbolLabelAnimation = function (data, coordSys, clipShape) {\n        var isHorizontalOrRadial;\n        var isCoordSysPolar;\n        var baseAxis = coordSys.getBaseAxis();\n        var isAxisInverse = baseAxis.inverse;\n        if (coordSys.type === 'cartesian2d') {\n          isHorizontalOrRadial = baseAxis.isHorizontal();\n          isCoordSysPolar = false;\n        } else if (coordSys.type === 'polar') {\n          isHorizontalOrRadial = baseAxis.dim === 'angle';\n          isCoordSysPolar = true;\n        }\n        var seriesModel = data.hostModel;\n        var seriesDuration = seriesModel.get('animationDuration');\n        if (isFunction(seriesDuration)) {\n          seriesDuration = seriesDuration(null);\n        }\n        var seriesDelay = seriesModel.get('animationDelay') || 0;\n        var seriesDelayValue = isFunction(seriesDelay) ? seriesDelay(null) : seriesDelay;\n        data.eachItemGraphicEl(function (symbol, idx) {\n          var el = symbol;\n          if (el) {\n            var point = [symbol.x, symbol.y];\n            var start = void 0;\n            var end = void 0;\n            var current = void 0;\n            if (clipShape) {\n              if (isCoordSysPolar) {\n                var polarClip = clipShape;\n                var coord = coordSys.pointToCoord(point);\n                if (isHorizontalOrRadial) {\n                  start = polarClip.startAngle;\n                  end = polarClip.endAngle;\n                  current = -coord[1] / 180 * Math.PI;\n                } else {\n                  start = polarClip.r0;\n                  end = polarClip.r;\n                  current = coord[0];\n                }\n              } else {\n                var gridClip = clipShape;\n                if (isHorizontalOrRadial) {\n                  start = gridClip.x;\n                  end = gridClip.x + gridClip.width;\n                  current = symbol.x;\n                } else {\n                  start = gridClip.y + gridClip.height;\n                  end = gridClip.y;\n                  current = symbol.y;\n                }\n              }\n            }\n            var ratio = end === start ? 0 : (current - start) / (end - start);\n            if (isAxisInverse) {\n              ratio = 1 - ratio;\n            }\n            var delay = isFunction(seriesDelay) ? seriesDelay(idx) : seriesDuration * ratio + seriesDelayValue;\n            var symbolPath = el.getSymbolPath();\n            var text = symbolPath.getTextContent();\n            el.attr({\n              scaleX: 0,\n              scaleY: 0\n            });\n            el.animateTo({\n              scaleX: 1,\n              scaleY: 1\n            }, {\n              duration: 200,\n              setToFinal: true,\n              delay: delay\n            });\n            if (text) {\n              text.animateFrom({\n                style: {\n                  opacity: 0\n                }\n              }, {\n                duration: 300,\n                delay: delay\n              });\n            }\n            symbolPath.disableLabelAnimation = true;\n          }\n        });\n      };\n      LineView.prototype._initOrUpdateEndLabel = function (seriesModel, coordSys, inheritColor) {\n        var endLabelModel = seriesModel.getModel('endLabel');\n        if (anyStateShowEndLabel(seriesModel)) {\n          var data_2 = seriesModel.getData();\n          var polyline = this._polyline;\n          // series may be filtered.\n          var points = data_2.getLayout('points');\n          if (!points) {\n            polyline.removeTextContent();\n            this._endLabel = null;\n            return;\n          }\n          var endLabel = this._endLabel;\n          if (!endLabel) {\n            endLabel = this._endLabel = new ZRText({\n              z2: 200 // should be higher than item symbol\n            });\n            endLabel.ignoreClip = true;\n            polyline.setTextContent(this._endLabel);\n            polyline.disableLabelAnimation = true;\n          }\n          // Find last non-NaN data to display data\n          var dataIndex = getLastIndexNotNull(points);\n          if (dataIndex >= 0) {\n            setLabelStyle(polyline, getLabelStatesModels(seriesModel, 'endLabel'), {\n              inheritColor: inheritColor,\n              labelFetcher: seriesModel,\n              labelDataIndex: dataIndex,\n              defaultText: function (dataIndex, opt, interpolatedValue) {\n                return interpolatedValue != null ? getDefaultInterpolatedLabel(data_2, interpolatedValue) : getDefaultLabel(data_2, dataIndex);\n              },\n              enableTextSetter: true\n            }, getEndLabelStateSpecified(endLabelModel, coordSys));\n            polyline.textConfig.position = null;\n          }\n        } else if (this._endLabel) {\n          this._polyline.removeTextContent();\n          this._endLabel = null;\n        }\n      };\n      LineView.prototype._endLabelOnDuring = function (percent, clipRect, data, animationRecord, valueAnimation, endLabelModel, coordSys) {\n        var endLabel = this._endLabel;\n        var polyline = this._polyline;\n        if (endLabel) {\n          // NOTE: Don't remove percent < 1. percent === 1 means the first frame during render.\n          // The label is not prepared at this time.\n          if (percent < 1 && animationRecord.originalX == null) {\n            animationRecord.originalX = endLabel.x;\n            animationRecord.originalY = endLabel.y;\n          }\n          var points = data.getLayout('points');\n          var seriesModel = data.hostModel;\n          var connectNulls = seriesModel.get('connectNulls');\n          var precision = endLabelModel.get('precision');\n          var distance = endLabelModel.get('distance') || 0;\n          var baseAxis = coordSys.getBaseAxis();\n          var isHorizontal = baseAxis.isHorizontal();\n          var isBaseInversed = baseAxis.inverse;\n          var clipShape = clipRect.shape;\n          var xOrY = isBaseInversed ? isHorizontal ? clipShape.x : clipShape.y + clipShape.height : isHorizontal ? clipShape.x + clipShape.width : clipShape.y;\n          var distanceX = (isHorizontal ? distance : 0) * (isBaseInversed ? -1 : 1);\n          var distanceY = (isHorizontal ? 0 : -distance) * (isBaseInversed ? -1 : 1);\n          var dim = isHorizontal ? 'x' : 'y';\n          var dataIndexRange = getIndexRange(points, xOrY, dim);\n          var indices = dataIndexRange.range;\n          var diff = indices[1] - indices[0];\n          var value = void 0;\n          if (diff >= 1) {\n            // diff > 1 && connectNulls, which is on the null data.\n            if (diff > 1 && !connectNulls) {\n              var pt = getPointAtIndex(points, indices[0]);\n              endLabel.attr({\n                x: pt[0] + distanceX,\n                y: pt[1] + distanceY\n              });\n              valueAnimation && (value = seriesModel.getRawValue(indices[0]));\n            } else {\n              var pt = polyline.getPointOn(xOrY, dim);\n              pt && endLabel.attr({\n                x: pt[0] + distanceX,\n                y: pt[1] + distanceY\n              });\n              var startValue = seriesModel.getRawValue(indices[0]);\n              var endValue = seriesModel.getRawValue(indices[1]);\n              valueAnimation && (value = interpolateRawValues(data, precision, startValue, endValue, dataIndexRange.t));\n            }\n            animationRecord.lastFrameIndex = indices[0];\n          } else {\n            // If diff <= 0, which is the range is not found(Include NaN)\n            // Choose the first point or last point.\n            var idx = percent === 1 || animationRecord.lastFrameIndex > 0 ? indices[0] : 0;\n            var pt = getPointAtIndex(points, idx);\n            valueAnimation && (value = seriesModel.getRawValue(idx));\n            endLabel.attr({\n              x: pt[0] + distanceX,\n              y: pt[1] + distanceY\n            });\n          }\n          if (valueAnimation) {\n            var inner = labelInner(endLabel);\n            if (typeof inner.setLabelText === 'function') {\n              inner.setLabelText(value);\n            }\n          }\n        }\n      };\n      /**\r\n       * @private\r\n       */\n      // FIXME Two value axis\n      LineView.prototype._doUpdateAnimation = function (data, stackedOnPoints, coordSys, api, step, valueOrigin, connectNulls) {\n        var polyline = this._polyline;\n        var polygon = this._polygon;\n        var seriesModel = data.hostModel;\n        var diff = lineAnimationDiff(this._data, data, this._stackedOnPoints, stackedOnPoints, this._coordSys, coordSys, this._valueOrigin);\n        var current = diff.current;\n        var stackedOnCurrent = diff.stackedOnCurrent;\n        var next = diff.next;\n        var stackedOnNext = diff.stackedOnNext;\n        if (step) {\n          // TODO If stacked series is not step\n          stackedOnCurrent = turnPointsIntoStep(diff.stackedOnCurrent, diff.current, coordSys, step, connectNulls);\n          current = turnPointsIntoStep(diff.current, null, coordSys, step, connectNulls);\n          stackedOnNext = turnPointsIntoStep(diff.stackedOnNext, diff.next, coordSys, step, connectNulls);\n          next = turnPointsIntoStep(diff.next, null, coordSys, step, connectNulls);\n        }\n        // Don't apply animation if diff is large.\n        // For better result and avoid memory explosion problems like\n        // https://github.com/apache/incubator-echarts/issues/12229\n        if (getBoundingDiff(current, next) > 3000 || polygon && getBoundingDiff(stackedOnCurrent, stackedOnNext) > 3000) {\n          polyline.stopAnimation();\n          polyline.setShape({\n            points: next\n          });\n          if (polygon) {\n            polygon.stopAnimation();\n            polygon.setShape({\n              points: next,\n              stackedOnPoints: stackedOnNext\n            });\n          }\n          return;\n        }\n        polyline.shape.__points = diff.current;\n        polyline.shape.points = current;\n        var target = {\n          shape: {\n            points: next\n          }\n        };\n        // Also animate the original points.\n        // If points reference is changed when turning into step line.\n        if (diff.current !== current) {\n          target.shape.__points = diff.next;\n        }\n        // Stop previous animation.\n        polyline.stopAnimation();\n        updateProps(polyline, target, seriesModel);\n        if (polygon) {\n          polygon.setShape({\n            // Reuse the points with polyline.\n            points: current,\n            stackedOnPoints: stackedOnCurrent\n          });\n          polygon.stopAnimation();\n          updateProps(polygon, {\n            shape: {\n              stackedOnPoints: stackedOnNext\n            }\n          }, seriesModel);\n          // If use attr directly in updateProps.\n          if (polyline.shape.points !== polygon.shape.points) {\n            polygon.shape.points = polyline.shape.points;\n          }\n        }\n        var updatedDataInfo = [];\n        var diffStatus = diff.status;\n        for (var i = 0; i < diffStatus.length; i++) {\n          var cmd = diffStatus[i].cmd;\n          if (cmd === '=') {\n            var el = data.getItemGraphicEl(diffStatus[i].idx1);\n            if (el) {\n              updatedDataInfo.push({\n                el: el,\n                ptIdx: i // Index of points\n              });\n            }\n          }\n        }\n        if (polyline.animators && polyline.animators.length) {\n          polyline.animators[0].during(function () {\n            polygon && polygon.dirtyShape();\n            var points = polyline.shape.__points;\n            for (var i = 0; i < updatedDataInfo.length; i++) {\n              var el = updatedDataInfo[i].el;\n              var offset = updatedDataInfo[i].ptIdx * 2;\n              el.x = points[offset];\n              el.y = points[offset + 1];\n              el.markRedraw();\n            }\n          });\n        }\n      };\n      LineView.prototype.remove = function (ecModel) {\n        var group = this.group;\n        var oldData = this._data;\n        this._lineGroup.removeAll();\n        this._symbolDraw.remove(true);\n        // Remove temporary created elements when highlighting\n        oldData && oldData.eachItemGraphicEl(function (el, idx) {\n          if (el.__temp) {\n            group.remove(el);\n            oldData.setItemGraphicEl(idx, null);\n          }\n        });\n        this._polyline = this._polygon = this._coordSys = this._points = this._stackedOnPoints = this._endLabel = this._data = null;\n      };\n      LineView.type = 'line';\n      return LineView;\n    }(ChartView);\n\n    function pointsLayout(seriesType, forceStoreInTypedArray) {\n      return {\n        seriesType: seriesType,\n        plan: createRenderPlanner(),\n        reset: function (seriesModel) {\n          var data = seriesModel.getData();\n          var coordSys = seriesModel.coordinateSystem;\n          var pipelineContext = seriesModel.pipelineContext;\n          var useTypedArray = forceStoreInTypedArray || pipelineContext.large;\n          if (!coordSys) {\n            return;\n          }\n          var dims = map(coordSys.dimensions, function (dim) {\n            return data.mapDimension(dim);\n          }).slice(0, 2);\n          var dimLen = dims.length;\n          var stackResultDim = data.getCalculationInfo('stackResultDimension');\n          if (isDimensionStacked(data, dims[0])) {\n            dims[0] = stackResultDim;\n          }\n          if (isDimensionStacked(data, dims[1])) {\n            dims[1] = stackResultDim;\n          }\n          var store = data.getStore();\n          var dimIdx0 = data.getDimensionIndex(dims[0]);\n          var dimIdx1 = data.getDimensionIndex(dims[1]);\n          return dimLen && {\n            progress: function (params, data) {\n              var segCount = params.end - params.start;\n              var points = useTypedArray && createFloat32Array(segCount * dimLen);\n              var tmpIn = [];\n              var tmpOut = [];\n              for (var i = params.start, offset = 0; i < params.end; i++) {\n                var point = void 0;\n                if (dimLen === 1) {\n                  var x = store.get(dimIdx0, i);\n                  // NOTE: Make sure the second parameter is null to use default strategy.\n                  point = coordSys.dataToPoint(x, null, tmpOut);\n                } else {\n                  tmpIn[0] = store.get(dimIdx0, i);\n                  tmpIn[1] = store.get(dimIdx1, i);\n                  // Let coordinate system to handle the NaN data.\n                  point = coordSys.dataToPoint(tmpIn, null, tmpOut);\n                }\n                if (useTypedArray) {\n                  points[offset++] = point[0];\n                  points[offset++] = point[1];\n                } else {\n                  data.setItemLayout(i, point.slice());\n                }\n              }\n              useTypedArray && data.setLayout('points', points);\n            }\n          };\n        }\n      };\n    }\n\n    var samplers = {\n      average: function (frame) {\n        var sum = 0;\n        var count = 0;\n        for (var i = 0; i < frame.length; i++) {\n          if (!isNaN(frame[i])) {\n            sum += frame[i];\n            count++;\n          }\n        }\n        // Return NaN if count is 0\n        return count === 0 ? NaN : sum / count;\n      },\n      sum: function (frame) {\n        var sum = 0;\n        for (var i = 0; i < frame.length; i++) {\n          // Ignore NaN\n          sum += frame[i] || 0;\n        }\n        return sum;\n      },\n      max: function (frame) {\n        var max = -Infinity;\n        for (var i = 0; i < frame.length; i++) {\n          frame[i] > max && (max = frame[i]);\n        }\n        // NaN will cause illegal axis extent.\n        return isFinite(max) ? max : NaN;\n      },\n      min: function (frame) {\n        var min = Infinity;\n        for (var i = 0; i < frame.length; i++) {\n          frame[i] < min && (min = frame[i]);\n        }\n        // NaN will cause illegal axis extent.\n        return isFinite(min) ? min : NaN;\n      },\n      // TODO\n      // Median\n      nearest: function (frame) {\n        return frame[0];\n      }\n    };\n    var indexSampler = function (frame) {\n      return Math.round(frame.length / 2);\n    };\n    function dataSample(seriesType) {\n      return {\n        seriesType: seriesType,\n        // FIXME:TS never used, so comment it\n        // modifyOutputEnd: true,\n        reset: function (seriesModel, ecModel, api) {\n          var data = seriesModel.getData();\n          var sampling = seriesModel.get('sampling');\n          var coordSys = seriesModel.coordinateSystem;\n          var count = data.count();\n          // Only cartesian2d support down sampling. Disable it when there is few data.\n          if (count > 10 && coordSys.type === 'cartesian2d' && sampling) {\n            var baseAxis = coordSys.getBaseAxis();\n            var valueAxis = coordSys.getOtherAxis(baseAxis);\n            var extent = baseAxis.getExtent();\n            var dpr = api.getDevicePixelRatio();\n            // Coordinste system has been resized\n            var size = Math.abs(extent[1] - extent[0]) * (dpr || 1);\n            var rate = Math.round(count / size);\n            if (isFinite(rate) && rate > 1) {\n              if (sampling === 'lttb') {\n                seriesModel.setData(data.lttbDownSample(data.mapDimension(valueAxis.dim), 1 / rate));\n              } else if (sampling === 'minmax') {\n                seriesModel.setData(data.minmaxDownSample(data.mapDimension(valueAxis.dim), 1 / rate));\n              }\n              var sampler = void 0;\n              if (isString(sampling)) {\n                sampler = samplers[sampling];\n              } else if (isFunction(sampling)) {\n                sampler = sampling;\n              }\n              if (sampler) {\n                // Only support sample the first dim mapped from value axis.\n                seriesModel.setData(data.downSample(data.mapDimension(valueAxis.dim), 1 / rate, sampler, indexSampler));\n              }\n            }\n          }\n        }\n      };\n    }\n\n    function install$2(registers) {\n      registers.registerChartView(LineView);\n      registers.registerSeriesModel(LineSeriesModel);\n      registers.registerLayout(pointsLayout('line', true));\n      registers.registerVisual({\n        seriesType: 'line',\n        reset: function (seriesModel) {\n          var data = seriesModel.getData();\n          // Visual coding for legend\n          var lineStyle = seriesModel.getModel('lineStyle').getLineStyle();\n          if (lineStyle && !lineStyle.stroke) {\n            // Fill in visual should be palette color if\n            // has color callback\n            lineStyle.stroke = data.getVisual('style').fill;\n          }\n          data.setVisual('legendLineStyle', lineStyle);\n        }\n      });\n      // Down sample after filter\n      registers.registerProcessor(registers.PRIORITY.PROCESSOR.STATISTIC, dataSample('line'));\n    }\n\n    var BaseBarSeriesModel = /** @class */function (_super) {\n      __extends(BaseBarSeriesModel, _super);\n      function BaseBarSeriesModel() {\n        var _this = _super !== null && _super.apply(this, arguments) || this;\n        _this.type = BaseBarSeriesModel.type;\n        return _this;\n      }\n      BaseBarSeriesModel.prototype.getInitialData = function (option, ecModel) {\n        return createSeriesData(null, this, {\n          useEncodeDefaulter: true\n        });\n      };\n      BaseBarSeriesModel.prototype.getMarkerPosition = function (value, dims, startingAtTick) {\n        var coordSys = this.coordinateSystem;\n        if (coordSys && coordSys.clampData) {\n          // PENDING if clamp ?\n          var clampData_1 = coordSys.clampData(value);\n          var pt_1 = coordSys.dataToPoint(clampData_1);\n          if (startingAtTick) {\n            each(coordSys.getAxes(), function (axis, idx) {\n              // If axis type is category, use tick coords instead\n              if (axis.type === 'category' && dims != null) {\n                var tickCoords = axis.getTicksCoords();\n                var alignTicksWithLabel = axis.getTickModel().get('alignWithLabel');\n                var targetTickId = clampData_1[idx];\n                // The index of rightmost tick of markArea is 1 larger than x1/y1 index\n                var isEnd = dims[idx] === 'x1' || dims[idx] === 'y1';\n                if (isEnd && !alignTicksWithLabel) {\n                  targetTickId += 1;\n                }\n                // The only contains one tick, tickCoords is\n                // like [{coord: 0, tickValue: 0}, {coord: 0}]\n                // to the length should always be larger than 1\n                if (tickCoords.length < 2) {\n                  return;\n                } else if (tickCoords.length === 2) {\n                  // The left value and right value of the axis are\n                  // the same. coord is 0 in both items. Use the max\n                  // value of the axis as the coord\n                  pt_1[idx] = axis.toGlobalCoord(axis.getExtent()[isEnd ? 1 : 0]);\n                  return;\n                }\n                var leftCoord = void 0;\n                var coord = void 0;\n                var stepTickValue = 1;\n                for (var i = 0; i < tickCoords.length; i++) {\n                  var tickCoord = tickCoords[i].coord;\n                  // The last item of tickCoords doesn't contain\n                  // tickValue\n                  var tickValue = i === tickCoords.length - 1 ? tickCoords[i - 1].tickValue + stepTickValue : tickCoords[i].tickValue;\n                  if (tickValue === targetTickId) {\n                    coord = tickCoord;\n                    break;\n                  } else if (tickValue < targetTickId) {\n                    leftCoord = tickCoord;\n                  } else if (leftCoord != null && tickValue > targetTickId) {\n                    coord = (tickCoord + leftCoord) / 2;\n                    break;\n                  }\n                  if (i === 1) {\n                    // Here we assume the step of category axes is\n                    // the same\n                    stepTickValue = tickValue - tickCoords[0].tickValue;\n                  }\n                }\n                if (coord == null) {\n                  if (!leftCoord) {\n                    // targetTickId is smaller than all tick ids in the\n                    // visible area, use the leftmost tick coord\n                    coord = tickCoords[0].coord;\n                  } else if (leftCoord) {\n                    // targetTickId is larger than all tick ids in the\n                    // visible area, use the rightmost tick coord\n                    coord = tickCoords[tickCoords.length - 1].coord;\n                  }\n                }\n                pt_1[idx] = axis.toGlobalCoord(coord);\n              }\n            });\n          } else {\n            var data = this.getData();\n            var offset = data.getLayout('offset');\n            var size = data.getLayout('size');\n            var offsetIndex = coordSys.getBaseAxis().isHorizontal() ? 0 : 1;\n            pt_1[offsetIndex] += offset + size / 2;\n          }\n          return pt_1;\n        }\n        return [NaN, NaN];\n      };\n      BaseBarSeriesModel.type = 'series.__base_bar__';\n      BaseBarSeriesModel.defaultOption = {\n        // zlevel: 0,\n        z: 2,\n        coordinateSystem: 'cartesian2d',\n        legendHoverLink: true,\n        // stack: null\n        // Cartesian coordinate system\n        // xAxisIndex: 0,\n        // yAxisIndex: 0,\n        barMinHeight: 0,\n        barMinAngle: 0,\n        // cursor: null,\n        large: false,\n        largeThreshold: 400,\n        progressive: 3e3,\n        progressiveChunkMode: 'mod'\n      };\n      return BaseBarSeriesModel;\n    }(SeriesModel);\n    SeriesModel.registerClass(BaseBarSeriesModel);\n\n    var BarSeriesModel = /** @class */function (_super) {\n      __extends(BarSeriesModel, _super);\n      function BarSeriesModel() {\n        var _this = _super !== null && _super.apply(this, arguments) || this;\n        _this.type = BarSeriesModel.type;\n        return _this;\n      }\n      BarSeriesModel.prototype.getInitialData = function () {\n        return createSeriesData(null, this, {\n          useEncodeDefaulter: true,\n          createInvertedIndices: !!this.get('realtimeSort', true) || null\n        });\n      };\n      /**\r\n       * @override\r\n       */\n      BarSeriesModel.prototype.getProgressive = function () {\n        // Do not support progressive in normal mode.\n        return this.get('large') ? this.get('progressive') : false;\n      };\n      /**\r\n       * @override\r\n       */\n      BarSeriesModel.prototype.getProgressiveThreshold = function () {\n        // Do not support progressive in normal mode.\n        var progressiveThreshold = this.get('progressiveThreshold');\n        var largeThreshold = this.get('largeThreshold');\n        if (largeThreshold > progressiveThreshold) {\n          progressiveThreshold = largeThreshold;\n        }\n        return progressiveThreshold;\n      };\n      BarSeriesModel.prototype.brushSelector = function (dataIndex, data, selectors) {\n        return selectors.rect(data.getItemLayout(dataIndex));\n      };\n      BarSeriesModel.type = 'series.bar';\n      BarSeriesModel.dependencies = ['grid', 'polar'];\n      BarSeriesModel.defaultOption = inheritDefaultOption(BaseBarSeriesModel.defaultOption, {\n        // If clipped\n        // Only available on cartesian2d\n        clip: true,\n        roundCap: false,\n        showBackground: false,\n        backgroundStyle: {\n          color: 'rgba(180, 180, 180, 0.2)',\n          borderColor: null,\n          borderWidth: 0,\n          borderType: 'solid',\n          borderRadius: 0,\n          shadowBlur: 0,\n          shadowColor: null,\n          shadowOffsetX: 0,\n          shadowOffsetY: 0,\n          opacity: 1\n        },\n        select: {\n          itemStyle: {\n            borderColor: '#212121'\n          }\n        },\n        realtimeSort: false\n      });\n      return BarSeriesModel;\n    }(BaseBarSeriesModel);\n\n    /**\r\n     * Sausage: similar to sector, but have half circle on both sides\r\n     */\n    var SausageShape = /** @class */function () {\n      function SausageShape() {\n        this.cx = 0;\n        this.cy = 0;\n        this.r0 = 0;\n        this.r = 0;\n        this.startAngle = 0;\n        this.endAngle = Math.PI * 2;\n        this.clockwise = true;\n      }\n      return SausageShape;\n    }();\n    var SausagePath = /** @class */function (_super) {\n      __extends(SausagePath, _super);\n      function SausagePath(opts) {\n        var _this = _super.call(this, opts) || this;\n        _this.type = 'sausage';\n        return _this;\n      }\n      SausagePath.prototype.getDefaultShape = function () {\n        return new SausageShape();\n      };\n      SausagePath.prototype.buildPath = function (ctx, shape) {\n        var cx = shape.cx;\n        var cy = shape.cy;\n        var r0 = Math.max(shape.r0 || 0, 0);\n        var r = Math.max(shape.r, 0);\n        var dr = (r - r0) * 0.5;\n        var rCenter = r0 + dr;\n        var startAngle = shape.startAngle;\n        var endAngle = shape.endAngle;\n        var clockwise = shape.clockwise;\n        var PI2 = Math.PI * 2;\n        var lessThanCircle = clockwise ? endAngle - startAngle < PI2 : startAngle - endAngle < PI2;\n        if (!lessThanCircle) {\n          // Normalize angles\n          startAngle = endAngle - (clockwise ? PI2 : -PI2);\n        }\n        var unitStartX = Math.cos(startAngle);\n        var unitStartY = Math.sin(startAngle);\n        var unitEndX = Math.cos(endAngle);\n        var unitEndY = Math.sin(endAngle);\n        if (lessThanCircle) {\n          ctx.moveTo(unitStartX * r0 + cx, unitStartY * r0 + cy);\n          ctx.arc(unitStartX * rCenter + cx, unitStartY * rCenter + cy, dr, -Math.PI + startAngle, startAngle, !clockwise);\n        } else {\n          ctx.moveTo(unitStartX * r + cx, unitStartY * r + cy);\n        }\n        ctx.arc(cx, cy, r, startAngle, endAngle, !clockwise);\n        ctx.arc(unitEndX * rCenter + cx, unitEndY * rCenter + cy, dr, endAngle - Math.PI * 2, endAngle - Math.PI, !clockwise);\n        if (r0 !== 0) {\n          ctx.arc(cx, cy, r0, endAngle, startAngle, clockwise);\n        }\n        // ctx.closePath();\n      };\n      return SausagePath;\n    }(Path);\n\n    function createSectorCalculateTextPosition(positionMapping, opts) {\n      opts = opts || {};\n      var isRoundCap = opts.isRoundCap;\n      return function (out, opts, boundingRect) {\n        var textPosition = opts.position;\n        if (!textPosition || textPosition instanceof Array) {\n          return calculateTextPosition(out, opts, boundingRect);\n        }\n        var mappedSectorPosition = positionMapping(textPosition);\n        var distance = opts.distance != null ? opts.distance : 5;\n        var sector = this.shape;\n        var cx = sector.cx;\n        var cy = sector.cy;\n        var r = sector.r;\n        var r0 = sector.r0;\n        var middleR = (r + r0) / 2;\n        var startAngle = sector.startAngle;\n        var endAngle = sector.endAngle;\n        var middleAngle = (startAngle + endAngle) / 2;\n        var extraDist = isRoundCap ? Math.abs(r - r0) / 2 : 0;\n        var mathCos = Math.cos;\n        var mathSin = Math.sin;\n        // base position: top-left\n        var x = cx + r * mathCos(startAngle);\n        var y = cy + r * mathSin(startAngle);\n        var textAlign = 'left';\n        var textVerticalAlign = 'top';\n        switch (mappedSectorPosition) {\n          case 'startArc':\n            x = cx + (r0 - distance) * mathCos(middleAngle);\n            y = cy + (r0 - distance) * mathSin(middleAngle);\n            textAlign = 'center';\n            textVerticalAlign = 'top';\n            break;\n          case 'insideStartArc':\n            x = cx + (r0 + distance) * mathCos(middleAngle);\n            y = cy + (r0 + distance) * mathSin(middleAngle);\n            textAlign = 'center';\n            textVerticalAlign = 'bottom';\n            break;\n          case 'startAngle':\n            x = cx + middleR * mathCos(startAngle) + adjustAngleDistanceX(startAngle, distance + extraDist, false);\n            y = cy + middleR * mathSin(startAngle) + adjustAngleDistanceY(startAngle, distance + extraDist, false);\n            textAlign = 'right';\n            textVerticalAlign = 'middle';\n            break;\n          case 'insideStartAngle':\n            x = cx + middleR * mathCos(startAngle) + adjustAngleDistanceX(startAngle, -distance + extraDist, false);\n            y = cy + middleR * mathSin(startAngle) + adjustAngleDistanceY(startAngle, -distance + extraDist, false);\n            textAlign = 'left';\n            textVerticalAlign = 'middle';\n            break;\n          case 'middle':\n            x = cx + middleR * mathCos(middleAngle);\n            y = cy + middleR * mathSin(middleAngle);\n            textAlign = 'center';\n            textVerticalAlign = 'middle';\n            break;\n          case 'endArc':\n            x = cx + (r + distance) * mathCos(middleAngle);\n            y = cy + (r + distance) * mathSin(middleAngle);\n            textAlign = 'center';\n            textVerticalAlign = 'bottom';\n            break;\n          case 'insideEndArc':\n            x = cx + (r - distance) * mathCos(middleAngle);\n            y = cy + (r - distance) * mathSin(middleAngle);\n            textAlign = 'center';\n            textVerticalAlign = 'top';\n            break;\n          case 'endAngle':\n            x = cx + middleR * mathCos(endAngle) + adjustAngleDistanceX(endAngle, distance + extraDist, true);\n            y = cy + middleR * mathSin(endAngle) + adjustAngleDistanceY(endAngle, distance + extraDist, true);\n            textAlign = 'left';\n            textVerticalAlign = 'middle';\n            break;\n          case 'insideEndAngle':\n            x = cx + middleR * mathCos(endAngle) + adjustAngleDistanceX(endAngle, -distance + extraDist, true);\n            y = cy + middleR * mathSin(endAngle) + adjustAngleDistanceY(endAngle, -distance + extraDist, true);\n            textAlign = 'right';\n            textVerticalAlign = 'middle';\n            break;\n          default:\n            return calculateTextPosition(out, opts, boundingRect);\n        }\n        out = out || {};\n        out.x = x;\n        out.y = y;\n        out.align = textAlign;\n        out.verticalAlign = textVerticalAlign;\n        return out;\n      };\n    }\n    function setSectorTextRotation(sector, textPosition, positionMapping, rotateType) {\n      if (isNumber(rotateType)) {\n        // user-set rotation\n        sector.setTextConfig({\n          rotation: rotateType\n        });\n        return;\n      } else if (isArray(textPosition)) {\n        // user-set position, use 0 as auto rotation\n        sector.setTextConfig({\n          rotation: 0\n        });\n        return;\n      }\n      var shape = sector.shape;\n      var startAngle = shape.clockwise ? shape.startAngle : shape.endAngle;\n      var endAngle = shape.clockwise ? shape.endAngle : shape.startAngle;\n      var middleAngle = (startAngle + endAngle) / 2;\n      var anchorAngle;\n      var mappedSectorPosition = positionMapping(textPosition);\n      switch (mappedSectorPosition) {\n        case 'startArc':\n        case 'insideStartArc':\n        case 'middle':\n        case 'insideEndArc':\n        case 'endArc':\n          anchorAngle = middleAngle;\n          break;\n        case 'startAngle':\n        case 'insideStartAngle':\n          anchorAngle = startAngle;\n          break;\n        case 'endAngle':\n        case 'insideEndAngle':\n          anchorAngle = endAngle;\n          break;\n        default:\n          sector.setTextConfig({\n            rotation: 0\n          });\n          return;\n      }\n      var rotate = Math.PI * 1.5 - anchorAngle;\n      /**\r\n       * TODO: labels with rotate > Math.PI / 2 should be rotate another\r\n       * half round flipped to increase readability. However, only middle\r\n       * position supports this for now, because in other positions, the\r\n       * anchor point is not at the center of the text, so the positions\r\n       * after rotating is not as expected.\r\n       */\n      if (mappedSectorPosition === 'middle' && rotate > Math.PI / 2 && rotate < Math.PI * 1.5) {\n        rotate -= Math.PI;\n      }\n      sector.setTextConfig({\n        rotation: rotate\n      });\n    }\n    function adjustAngleDistanceX(angle, distance, isEnd) {\n      return distance * Math.sin(angle) * (isEnd ? -1 : 1);\n    }\n    function adjustAngleDistanceY(angle, distance, isEnd) {\n      return distance * Math.cos(angle) * (isEnd ? 1 : -1);\n    }\n\n    function getSectorCornerRadius(model, shape, zeroIfNull) {\n      var cornerRadius = model.get('borderRadius');\n      if (cornerRadius == null) {\n        return zeroIfNull ? {\n          cornerRadius: 0\n        } : null;\n      }\n      if (!isArray(cornerRadius)) {\n        cornerRadius = [cornerRadius, cornerRadius, cornerRadius, cornerRadius];\n      }\n      var dr = Math.abs(shape.r || 0 - shape.r0 || 0);\n      return {\n        cornerRadius: map(cornerRadius, function (cr) {\n          return parsePercent(cr, dr);\n        })\n      };\n    }\n\n    var mathMax$6 = Math.max;\n    var mathMin$6 = Math.min;\n    function getClipArea(coord, data) {\n      var coordSysClipArea = coord.getArea && coord.getArea();\n      if (isCoordinateSystemType(coord, 'cartesian2d')) {\n        var baseAxis = coord.getBaseAxis();\n        // When boundaryGap is false or using time axis. bar may exceed the grid.\n        // We should not clip this part.\n        // See test/bar2.html\n        if (baseAxis.type !== 'category' || !baseAxis.onBand) {\n          var expandWidth = data.getLayout('bandWidth');\n          if (baseAxis.isHorizontal()) {\n            coordSysClipArea.x -= expandWidth;\n            coordSysClipArea.width += expandWidth * 2;\n          } else {\n            coordSysClipArea.y -= expandWidth;\n            coordSysClipArea.height += expandWidth * 2;\n          }\n        }\n      }\n      return coordSysClipArea;\n    }\n    var BarView = /** @class */function (_super) {\n      __extends(BarView, _super);\n      function BarView() {\n        var _this = _super.call(this) || this;\n        _this.type = BarView.type;\n        _this._isFirstFrame = true;\n        return _this;\n      }\n      BarView.prototype.render = function (seriesModel, ecModel, api, payload) {\n        this._model = seriesModel;\n        this._removeOnRenderedListener(api);\n        this._updateDrawMode(seriesModel);\n        var coordinateSystemType = seriesModel.get('coordinateSystem');\n        if (coordinateSystemType === 'cartesian2d' || coordinateSystemType === 'polar') {\n          // Clear previously rendered progressive elements.\n          this._progressiveEls = null;\n          this._isLargeDraw ? this._renderLarge(seriesModel, ecModel, api) : this._renderNormal(seriesModel, ecModel, api, payload);\n        } else if (\"development\" !== 'production') {\n          warn('Only cartesian2d and polar supported for bar.');\n        }\n      };\n      BarView.prototype.incrementalPrepareRender = function (seriesModel) {\n        this._clear();\n        this._updateDrawMode(seriesModel);\n        // incremental also need to clip, otherwise might be overlow.\n        // But must not set clip in each frame, otherwise all of the children will be marked redraw.\n        this._updateLargeClip(seriesModel);\n      };\n      BarView.prototype.incrementalRender = function (params, seriesModel) {\n        // Reset\n        this._progressiveEls = [];\n        // Do not support progressive in normal mode.\n        this._incrementalRenderLarge(params, seriesModel);\n      };\n      BarView.prototype.eachRendered = function (cb) {\n        traverseElements(this._progressiveEls || this.group, cb);\n      };\n      BarView.prototype._updateDrawMode = function (seriesModel) {\n        var isLargeDraw = seriesModel.pipelineContext.large;\n        if (this._isLargeDraw == null || isLargeDraw !== this._isLargeDraw) {\n          this._isLargeDraw = isLargeDraw;\n          this._clear();\n        }\n      };\n      BarView.prototype._renderNormal = function (seriesModel, ecModel, api, payload) {\n        var group = this.group;\n        var data = seriesModel.getData();\n        var oldData = this._data;\n        var coord = seriesModel.coordinateSystem;\n        var baseAxis = coord.getBaseAxis();\n        var isHorizontalOrRadial;\n        if (coord.type === 'cartesian2d') {\n          isHorizontalOrRadial = baseAxis.isHorizontal();\n        } else if (coord.type === 'polar') {\n          isHorizontalOrRadial = baseAxis.dim === 'angle';\n        }\n        var animationModel = seriesModel.isAnimationEnabled() ? seriesModel : null;\n        var realtimeSortCfg = shouldRealtimeSort(seriesModel, coord);\n        if (realtimeSortCfg) {\n          this._enableRealtimeSort(realtimeSortCfg, data, api);\n        }\n        var needsClip = seriesModel.get('clip', true) || realtimeSortCfg;\n        var coordSysClipArea = getClipArea(coord, data);\n        // If there is clipPath created in large mode. Remove it.\n        group.removeClipPath();\n        // We don't use clipPath in normal mode because we needs a perfect animation\n        // And don't want the label are clipped.\n        var roundCap = seriesModel.get('roundCap', true);\n        var drawBackground = seriesModel.get('showBackground', true);\n        var backgroundModel = seriesModel.getModel('backgroundStyle');\n        var barBorderRadius = backgroundModel.get('borderRadius') || 0;\n        var bgEls = [];\n        var oldBgEls = this._backgroundEls;\n        var isInitSort = payload && payload.isInitSort;\n        var isChangeOrder = payload && payload.type === 'changeAxisOrder';\n        function createBackground(dataIndex) {\n          var bgLayout = getLayout[coord.type](data, dataIndex);\n          var bgEl = createBackgroundEl(coord, isHorizontalOrRadial, bgLayout);\n          bgEl.useStyle(backgroundModel.getItemStyle());\n          // Only cartesian2d support borderRadius.\n          if (coord.type === 'cartesian2d') {\n            bgEl.setShape('r', barBorderRadius);\n          } else {\n            bgEl.setShape('cornerRadius', barBorderRadius);\n          }\n          bgEls[dataIndex] = bgEl;\n          return bgEl;\n        }\n        data.diff(oldData).add(function (dataIndex) {\n          var itemModel = data.getItemModel(dataIndex);\n          var layout = getLayout[coord.type](data, dataIndex, itemModel);\n          if (drawBackground) {\n            createBackground(dataIndex);\n          }\n          // If dataZoom in filteMode: 'empty', the baseValue can be set as NaN in \"axisProxy\".\n          if (!data.hasValue(dataIndex) || !isValidLayout[coord.type](layout)) {\n            return;\n          }\n          var isClipped = false;\n          if (needsClip) {\n            // Clip will modify the layout params.\n            // And return a boolean to determine if the shape are fully clipped.\n            isClipped = clip[coord.type](coordSysClipArea, layout);\n          }\n          var el = elementCreator[coord.type](seriesModel, data, dataIndex, layout, isHorizontalOrRadial, animationModel, baseAxis.model, false, roundCap);\n          if (realtimeSortCfg) {\n            /**\r\n             * Force label animation because even if the element is\r\n             * ignored because it's clipped, it may not be clipped after\r\n             * changing order. Then, if not using forceLabelAnimation,\r\n             * the label animation was never started, in which case,\r\n             * the label will be the final value and doesn't have label\r\n             * animation.\r\n             */\n            el.forceLabelAnimation = true;\n          }\n          updateStyle(el, data, dataIndex, itemModel, layout, seriesModel, isHorizontalOrRadial, coord.type === 'polar');\n          if (isInitSort) {\n            el.attr({\n              shape: layout\n            });\n          } else if (realtimeSortCfg) {\n            updateRealtimeAnimation(realtimeSortCfg, animationModel, el, layout, dataIndex, isHorizontalOrRadial, false, false);\n          } else {\n            initProps(el, {\n              shape: layout\n            }, seriesModel, dataIndex);\n          }\n          data.setItemGraphicEl(dataIndex, el);\n          group.add(el);\n          el.ignore = isClipped;\n        }).update(function (newIndex, oldIndex) {\n          var itemModel = data.getItemModel(newIndex);\n          var layout = getLayout[coord.type](data, newIndex, itemModel);\n          if (drawBackground) {\n            var bgEl = void 0;\n            if (oldBgEls.length === 0) {\n              bgEl = createBackground(oldIndex);\n            } else {\n              bgEl = oldBgEls[oldIndex];\n              bgEl.useStyle(backgroundModel.getItemStyle());\n              // Only cartesian2d support borderRadius.\n              if (coord.type === 'cartesian2d') {\n                bgEl.setShape('r', barBorderRadius);\n              } else {\n                bgEl.setShape('cornerRadius', barBorderRadius);\n              }\n              bgEls[newIndex] = bgEl;\n            }\n            var bgLayout = getLayout[coord.type](data, newIndex);\n            var shape = createBackgroundShape(isHorizontalOrRadial, bgLayout, coord);\n            updateProps(bgEl, {\n              shape: shape\n            }, animationModel, newIndex);\n          }\n          var el = oldData.getItemGraphicEl(oldIndex);\n          if (!data.hasValue(newIndex) || !isValidLayout[coord.type](layout)) {\n            group.remove(el);\n            return;\n          }\n          var isClipped = false;\n          if (needsClip) {\n            isClipped = clip[coord.type](coordSysClipArea, layout);\n            if (isClipped) {\n              group.remove(el);\n            }\n          }\n          if (!el) {\n            el = elementCreator[coord.type](seriesModel, data, newIndex, layout, isHorizontalOrRadial, animationModel, baseAxis.model, !!el, roundCap);\n          } else {\n            saveOldStyle(el);\n          }\n          if (realtimeSortCfg) {\n            el.forceLabelAnimation = true;\n          }\n          if (isChangeOrder) {\n            var textEl = el.getTextContent();\n            if (textEl) {\n              var labelInnerStore = labelInner(textEl);\n              if (labelInnerStore.prevValue != null) {\n                /**\r\n                 * Set preValue to be value so that no new label\r\n                 * should be started, otherwise, it will take a full\r\n                 * `animationDurationUpdate` time to finish the\r\n                 * animation, which is not expected.\r\n                 */\n                labelInnerStore.prevValue = labelInnerStore.value;\n              }\n            }\n          }\n          // Not change anything if only order changed.\n          // Especially not change label.\n          else {\n            updateStyle(el, data, newIndex, itemModel, layout, seriesModel, isHorizontalOrRadial, coord.type === 'polar');\n          }\n          if (isInitSort) {\n            el.attr({\n              shape: layout\n            });\n          } else if (realtimeSortCfg) {\n            updateRealtimeAnimation(realtimeSortCfg, animationModel, el, layout, newIndex, isHorizontalOrRadial, true, isChangeOrder);\n          } else {\n            updateProps(el, {\n              shape: layout\n            }, seriesModel, newIndex, null);\n          }\n          data.setItemGraphicEl(newIndex, el);\n          el.ignore = isClipped;\n          group.add(el);\n        }).remove(function (dataIndex) {\n          var el = oldData.getItemGraphicEl(dataIndex);\n          el && removeElementWithFadeOut(el, seriesModel, dataIndex);\n        }).execute();\n        var bgGroup = this._backgroundGroup || (this._backgroundGroup = new Group());\n        bgGroup.removeAll();\n        for (var i = 0; i < bgEls.length; ++i) {\n          bgGroup.add(bgEls[i]);\n        }\n        group.add(bgGroup);\n        this._backgroundEls = bgEls;\n        this._data = data;\n      };\n      BarView.prototype._renderLarge = function (seriesModel, ecModel, api) {\n        this._clear();\n        createLarge(seriesModel, this.group);\n        this._updateLargeClip(seriesModel);\n      };\n      BarView.prototype._incrementalRenderLarge = function (params, seriesModel) {\n        this._removeBackground();\n        createLarge(seriesModel, this.group, this._progressiveEls, true);\n      };\n      BarView.prototype._updateLargeClip = function (seriesModel) {\n        // Use clipPath in large mode.\n        var clipPath = seriesModel.get('clip', true) && createClipPath(seriesModel.coordinateSystem, false, seriesModel);\n        var group = this.group;\n        if (clipPath) {\n          group.setClipPath(clipPath);\n        } else {\n          group.removeClipPath();\n        }\n      };\n      BarView.prototype._enableRealtimeSort = function (realtimeSortCfg, data, api) {\n        var _this = this;\n        // If no data in the first frame, wait for data to initSort\n        if (!data.count()) {\n          return;\n        }\n        var baseAxis = realtimeSortCfg.baseAxis;\n        if (this._isFirstFrame) {\n          this._dispatchInitSort(data, realtimeSortCfg, api);\n          this._isFirstFrame = false;\n        } else {\n          var orderMapping_1 = function (idx) {\n            var el = data.getItemGraphicEl(idx);\n            var shape = el && el.shape;\n            return shape &&\n            // The result should be consistent with the initial sort by data value.\n            // Do not support the case that both positive and negative exist.\n            Math.abs(baseAxis.isHorizontal() ? shape.height : shape.width)\n            // If data is NaN, shape.xxx may be NaN, so use || 0 here in case\n            || 0;\n          };\n          this._onRendered = function () {\n            _this._updateSortWithinSameData(data, orderMapping_1, baseAxis, api);\n          };\n          api.getZr().on('rendered', this._onRendered);\n        }\n      };\n      BarView.prototype._dataSort = function (data, baseAxis, orderMapping) {\n        var info = [];\n        data.each(data.mapDimension(baseAxis.dim), function (ordinalNumber, dataIdx) {\n          var mappedValue = orderMapping(dataIdx);\n          mappedValue = mappedValue == null ? NaN : mappedValue;\n          info.push({\n            dataIndex: dataIdx,\n            mappedValue: mappedValue,\n            ordinalNumber: ordinalNumber\n          });\n        });\n        info.sort(function (a, b) {\n          // If NaN, it will be treated as min val.\n          return b.mappedValue - a.mappedValue;\n        });\n        return {\n          ordinalNumbers: map(info, function (item) {\n            return item.ordinalNumber;\n          })\n        };\n      };\n      BarView.prototype._isOrderChangedWithinSameData = function (data, orderMapping, baseAxis) {\n        var scale = baseAxis.scale;\n        var ordinalDataDim = data.mapDimension(baseAxis.dim);\n        var lastValue = Number.MAX_VALUE;\n        for (var tickNum = 0, len = scale.getOrdinalMeta().categories.length; tickNum < len; ++tickNum) {\n          var rawIdx = data.rawIndexOf(ordinalDataDim, scale.getRawOrdinalNumber(tickNum));\n          var value = rawIdx < 0\n          // If some tick have no bar, the tick will be treated as min.\n          ? Number.MIN_VALUE\n          // PENDING: if dataZoom on baseAxis exits, is it a performance issue?\n          : orderMapping(data.indexOfRawIndex(rawIdx));\n          if (value > lastValue) {\n            return true;\n          }\n          lastValue = value;\n        }\n        return false;\n      };\n      /*\r\n       * Consider the case when A and B changed order, whose representing\r\n       * bars are both out of sight, we don't wish to trigger reorder action\r\n       * as long as the order in the view doesn't change.\r\n       */\n      BarView.prototype._isOrderDifferentInView = function (orderInfo, baseAxis) {\n        var scale = baseAxis.scale;\n        var extent = scale.getExtent();\n        var tickNum = Math.max(0, extent[0]);\n        var tickMax = Math.min(extent[1], scale.getOrdinalMeta().categories.length - 1);\n        for (; tickNum <= tickMax; ++tickNum) {\n          if (orderInfo.ordinalNumbers[tickNum] !== scale.getRawOrdinalNumber(tickNum)) {\n            return true;\n          }\n        }\n      };\n      BarView.prototype._updateSortWithinSameData = function (data, orderMapping, baseAxis, api) {\n        if (!this._isOrderChangedWithinSameData(data, orderMapping, baseAxis)) {\n          return;\n        }\n        var sortInfo = this._dataSort(data, baseAxis, orderMapping);\n        if (this._isOrderDifferentInView(sortInfo, baseAxis)) {\n          this._removeOnRenderedListener(api);\n          api.dispatchAction({\n            type: 'changeAxisOrder',\n            componentType: baseAxis.dim + 'Axis',\n            axisId: baseAxis.index,\n            sortInfo: sortInfo\n          });\n        }\n      };\n      BarView.prototype._dispatchInitSort = function (data, realtimeSortCfg, api) {\n        var baseAxis = realtimeSortCfg.baseAxis;\n        var sortResult = this._dataSort(data, baseAxis, function (dataIdx) {\n          return data.get(data.mapDimension(realtimeSortCfg.otherAxis.dim), dataIdx);\n        });\n        api.dispatchAction({\n          type: 'changeAxisOrder',\n          componentType: baseAxis.dim + 'Axis',\n          isInitSort: true,\n          axisId: baseAxis.index,\n          sortInfo: sortResult\n        });\n      };\n      BarView.prototype.remove = function (ecModel, api) {\n        this._clear(this._model);\n        this._removeOnRenderedListener(api);\n      };\n      BarView.prototype.dispose = function (ecModel, api) {\n        this._removeOnRenderedListener(api);\n      };\n      BarView.prototype._removeOnRenderedListener = function (api) {\n        if (this._onRendered) {\n          api.getZr().off('rendered', this._onRendered);\n          this._onRendered = null;\n        }\n      };\n      BarView.prototype._clear = function (model) {\n        var group = this.group;\n        var data = this._data;\n        if (model && model.isAnimationEnabled() && data && !this._isLargeDraw) {\n          this._removeBackground();\n          this._backgroundEls = [];\n          data.eachItemGraphicEl(function (el) {\n            removeElementWithFadeOut(el, model, getECData(el).dataIndex);\n          });\n        } else {\n          group.removeAll();\n        }\n        this._data = null;\n        this._isFirstFrame = true;\n      };\n      BarView.prototype._removeBackground = function () {\n        this.group.remove(this._backgroundGroup);\n        this._backgroundGroup = null;\n      };\n      BarView.type = 'bar';\n      return BarView;\n    }(ChartView);\n    var clip = {\n      cartesian2d: function (coordSysBoundingRect, layout) {\n        var signWidth = layout.width < 0 ? -1 : 1;\n        var signHeight = layout.height < 0 ? -1 : 1;\n        // Needs positive width and height\n        if (signWidth < 0) {\n          layout.x += layout.width;\n          layout.width = -layout.width;\n        }\n        if (signHeight < 0) {\n          layout.y += layout.height;\n          layout.height = -layout.height;\n        }\n        var coordSysX2 = coordSysBoundingRect.x + coordSysBoundingRect.width;\n        var coordSysY2 = coordSysBoundingRect.y + coordSysBoundingRect.height;\n        var x = mathMax$6(layout.x, coordSysBoundingRect.x);\n        var x2 = mathMin$6(layout.x + layout.width, coordSysX2);\n        var y = mathMax$6(layout.y, coordSysBoundingRect.y);\n        var y2 = mathMin$6(layout.y + layout.height, coordSysY2);\n        var xClipped = x2 < x;\n        var yClipped = y2 < y;\n        // When xClipped or yClipped, the element will be marked as `ignore`.\n        // But we should also place the element at the edge of the coord sys bounding rect.\n        // Because if data changed and the bar shows again, its transition animation\n        // will begin at this place.\n        layout.x = xClipped && x > coordSysX2 ? x2 : x;\n        layout.y = yClipped && y > coordSysY2 ? y2 : y;\n        layout.width = xClipped ? 0 : x2 - x;\n        layout.height = yClipped ? 0 : y2 - y;\n        // Reverse back\n        if (signWidth < 0) {\n          layout.x += layout.width;\n          layout.width = -layout.width;\n        }\n        if (signHeight < 0) {\n          layout.y += layout.height;\n          layout.height = -layout.height;\n        }\n        return xClipped || yClipped;\n      },\n      polar: function (coordSysClipArea, layout) {\n        var signR = layout.r0 <= layout.r ? 1 : -1;\n        // Make sure r is larger than r0\n        if (signR < 0) {\n          var tmp = layout.r;\n          layout.r = layout.r0;\n          layout.r0 = tmp;\n        }\n        var r = mathMin$6(layout.r, coordSysClipArea.r);\n        var r0 = mathMax$6(layout.r0, coordSysClipArea.r0);\n        layout.r = r;\n        layout.r0 = r0;\n        var clipped = r - r0 < 0;\n        // Reverse back\n        if (signR < 0) {\n          var tmp = layout.r;\n          layout.r = layout.r0;\n          layout.r0 = tmp;\n        }\n        return clipped;\n      }\n    };\n    var elementCreator = {\n      cartesian2d: function (seriesModel, data, newIndex, layout, isHorizontal, animationModel, axisModel, isUpdate, roundCap) {\n        var rect = new Rect({\n          shape: extend({}, layout),\n          z2: 1\n        });\n        rect.__dataIndex = newIndex;\n        rect.name = 'item';\n        if (animationModel) {\n          var rectShape = rect.shape;\n          var animateProperty = isHorizontal ? 'height' : 'width';\n          rectShape[animateProperty] = 0;\n        }\n        return rect;\n      },\n      polar: function (seriesModel, data, newIndex, layout, isRadial, animationModel, axisModel, isUpdate, roundCap) {\n        var ShapeClass = !isRadial && roundCap ? SausagePath : Sector;\n        var sector = new ShapeClass({\n          shape: layout,\n          z2: 1\n        });\n        sector.name = 'item';\n        var positionMap = createPolarPositionMapping(isRadial);\n        sector.calculateTextPosition = createSectorCalculateTextPosition(positionMap, {\n          isRoundCap: ShapeClass === SausagePath\n        });\n        // Animation\n        if (animationModel) {\n          var sectorShape = sector.shape;\n          var animateProperty = isRadial ? 'r' : 'endAngle';\n          var animateTarget = {};\n          sectorShape[animateProperty] = isRadial ? layout.r0 : layout.startAngle;\n          animateTarget[animateProperty] = layout[animateProperty];\n          (isUpdate ? updateProps : initProps)(sector, {\n            shape: animateTarget\n            // __value: typeof dataValue === 'string' ? parseInt(dataValue, 10) : dataValue\n          }, animationModel);\n        }\n        return sector;\n      }\n    };\n    function shouldRealtimeSort(seriesModel, coordSys) {\n      var realtimeSortOption = seriesModel.get('realtimeSort', true);\n      var baseAxis = coordSys.getBaseAxis();\n      if (\"development\" !== 'production') {\n        if (realtimeSortOption) {\n          if (baseAxis.type !== 'category') {\n            warn('`realtimeSort` will not work because this bar series is not based on a category axis.');\n          }\n          if (coordSys.type !== 'cartesian2d') {\n            warn('`realtimeSort` will not work because this bar series is not on cartesian2d.');\n          }\n        }\n      }\n      if (realtimeSortOption && baseAxis.type === 'category' && coordSys.type === 'cartesian2d') {\n        return {\n          baseAxis: baseAxis,\n          otherAxis: coordSys.getOtherAxis(baseAxis)\n        };\n      }\n    }\n    function updateRealtimeAnimation(realtimeSortCfg, seriesAnimationModel, el, layout, newIndex, isHorizontal, isUpdate, isChangeOrder) {\n      var seriesTarget;\n      var axisTarget;\n      if (isHorizontal) {\n        axisTarget = {\n          x: layout.x,\n          width: layout.width\n        };\n        seriesTarget = {\n          y: layout.y,\n          height: layout.height\n        };\n      } else {\n        axisTarget = {\n          y: layout.y,\n          height: layout.height\n        };\n        seriesTarget = {\n          x: layout.x,\n          width: layout.width\n        };\n      }\n      if (!isChangeOrder) {\n        // Keep the original growth animation if only axis order changed.\n        // Not start a new animation.\n        (isUpdate ? updateProps : initProps)(el, {\n          shape: seriesTarget\n        }, seriesAnimationModel, newIndex, null);\n      }\n      var axisAnimationModel = seriesAnimationModel ? realtimeSortCfg.baseAxis.model : null;\n      (isUpdate ? updateProps : initProps)(el, {\n        shape: axisTarget\n      }, axisAnimationModel, newIndex);\n    }\n    function checkPropertiesNotValid(obj, props) {\n      for (var i = 0; i < props.length; i++) {\n        if (!isFinite(obj[props[i]])) {\n          return true;\n        }\n      }\n      return false;\n    }\n    var rectPropties = ['x', 'y', 'width', 'height'];\n    var polarPropties = ['cx', 'cy', 'r', 'startAngle', 'endAngle'];\n    var isValidLayout = {\n      cartesian2d: function (layout) {\n        return !checkPropertiesNotValid(layout, rectPropties);\n      },\n      polar: function (layout) {\n        return !checkPropertiesNotValid(layout, polarPropties);\n      }\n    };\n    var getLayout = {\n      // itemModel is only used to get borderWidth, which is not needed\n      // when calculating bar background layout.\n      cartesian2d: function (data, dataIndex, itemModel) {\n        var layout = data.getItemLayout(dataIndex);\n        var fixedLineWidth = itemModel ? getLineWidth(itemModel, layout) : 0;\n        // fix layout with lineWidth\n        var signX = layout.width > 0 ? 1 : -1;\n        var signY = layout.height > 0 ? 1 : -1;\n        return {\n          x: layout.x + signX * fixedLineWidth / 2,\n          y: layout.y + signY * fixedLineWidth / 2,\n          width: layout.width - signX * fixedLineWidth,\n          height: layout.height - signY * fixedLineWidth\n        };\n      },\n      polar: function (data, dataIndex, itemModel) {\n        var layout = data.getItemLayout(dataIndex);\n        return {\n          cx: layout.cx,\n          cy: layout.cy,\n          r0: layout.r0,\n          r: layout.r,\n          startAngle: layout.startAngle,\n          endAngle: layout.endAngle,\n          clockwise: layout.clockwise\n        };\n      }\n    };\n    function isZeroOnPolar(layout) {\n      return layout.startAngle != null && layout.endAngle != null && layout.startAngle === layout.endAngle;\n    }\n    function createPolarPositionMapping(isRadial) {\n      return function (isRadial) {\n        var arcOrAngle = isRadial ? 'Arc' : 'Angle';\n        return function (position) {\n          switch (position) {\n            case 'start':\n            case 'insideStart':\n            case 'end':\n            case 'insideEnd':\n              return position + arcOrAngle;\n            default:\n              return position;\n          }\n        };\n      }(isRadial);\n    }\n    function updateStyle(el, data, dataIndex, itemModel, layout, seriesModel, isHorizontalOrRadial, isPolar) {\n      var style = data.getItemVisual(dataIndex, 'style');\n      if (!isPolar) {\n        var borderRadius = itemModel.get(['itemStyle', 'borderRadius']) || 0;\n        el.setShape('r', borderRadius);\n      } else if (!seriesModel.get('roundCap')) {\n        var sectorShape = el.shape;\n        var cornerRadius = getSectorCornerRadius(itemModel.getModel('itemStyle'), sectorShape, true);\n        extend(sectorShape, cornerRadius);\n        el.setShape(sectorShape);\n      }\n      el.useStyle(style);\n      var cursorStyle = itemModel.getShallow('cursor');\n      cursorStyle && el.attr('cursor', cursorStyle);\n      var labelPositionOutside = isPolar ? isHorizontalOrRadial ? layout.r >= layout.r0 ? 'endArc' : 'startArc' : layout.endAngle >= layout.startAngle ? 'endAngle' : 'startAngle' : isHorizontalOrRadial ? layout.height >= 0 ? 'bottom' : 'top' : layout.width >= 0 ? 'right' : 'left';\n      var labelStatesModels = getLabelStatesModels(itemModel);\n      setLabelStyle(el, labelStatesModels, {\n        labelFetcher: seriesModel,\n        labelDataIndex: dataIndex,\n        defaultText: getDefaultLabel(seriesModel.getData(), dataIndex),\n        inheritColor: style.fill,\n        defaultOpacity: style.opacity,\n        defaultOutsidePosition: labelPositionOutside\n      });\n      var label = el.getTextContent();\n      if (isPolar && label) {\n        var position = itemModel.get(['label', 'position']);\n        el.textConfig.inside = position === 'middle' ? true : null;\n        setSectorTextRotation(el, position === 'outside' ? labelPositionOutside : position, createPolarPositionMapping(isHorizontalOrRadial), itemModel.get(['label', 'rotate']));\n      }\n      setLabelValueAnimation(label, labelStatesModels, seriesModel.getRawValue(dataIndex), function (value) {\n        return getDefaultInterpolatedLabel(data, value);\n      });\n      var emphasisModel = itemModel.getModel(['emphasis']);\n      toggleHoverEmphasis(el, emphasisModel.get('focus'), emphasisModel.get('blurScope'), emphasisModel.get('disabled'));\n      setStatesStylesFromModel(el, itemModel);\n      if (isZeroOnPolar(layout)) {\n        el.style.fill = 'none';\n        el.style.stroke = 'none';\n        each(el.states, function (state) {\n          if (state.style) {\n            state.style.fill = state.style.stroke = 'none';\n          }\n        });\n      }\n    }\n    // In case width or height are too small.\n    function getLineWidth(itemModel, rawLayout) {\n      // Has no border.\n      var borderColor = itemModel.get(['itemStyle', 'borderColor']);\n      if (!borderColor || borderColor === 'none') {\n        return 0;\n      }\n      var lineWidth = itemModel.get(['itemStyle', 'borderWidth']) || 0;\n      // width or height may be NaN for empty data\n      var width = isNaN(rawLayout.width) ? Number.MAX_VALUE : Math.abs(rawLayout.width);\n      var height = isNaN(rawLayout.height) ? Number.MAX_VALUE : Math.abs(rawLayout.height);\n      return Math.min(lineWidth, width, height);\n    }\n    var LagePathShape = /** @class */function () {\n      function LagePathShape() {}\n      return LagePathShape;\n    }();\n    var LargePath = /** @class */function (_super) {\n      __extends(LargePath, _super);\n      function LargePath(opts) {\n        var _this = _super.call(this, opts) || this;\n        _this.type = 'largeBar';\n        return _this;\n      }\n      LargePath.prototype.getDefaultShape = function () {\n        return new LagePathShape();\n      };\n      LargePath.prototype.buildPath = function (ctx, shape) {\n        // Drawing lines is more efficient than drawing\n        // a whole line or drawing rects.\n        var points = shape.points;\n        var baseDimIdx = this.baseDimIdx;\n        var valueDimIdx = 1 - this.baseDimIdx;\n        var startPoint = [];\n        var size = [];\n        var barWidth = this.barWidth;\n        for (var i = 0; i < points.length; i += 3) {\n          size[baseDimIdx] = barWidth;\n          size[valueDimIdx] = points[i + 2];\n          startPoint[baseDimIdx] = points[i + baseDimIdx];\n          startPoint[valueDimIdx] = points[i + valueDimIdx];\n          ctx.rect(startPoint[0], startPoint[1], size[0], size[1]);\n        }\n      };\n      return LargePath;\n    }(Path);\n    function createLarge(seriesModel, group, progressiveEls, incremental) {\n      // TODO support polar\n      var data = seriesModel.getData();\n      var baseDimIdx = data.getLayout('valueAxisHorizontal') ? 1 : 0;\n      var largeDataIndices = data.getLayout('largeDataIndices');\n      var barWidth = data.getLayout('size');\n      var backgroundModel = seriesModel.getModel('backgroundStyle');\n      var bgPoints = data.getLayout('largeBackgroundPoints');\n      if (bgPoints) {\n        var bgEl = new LargePath({\n          shape: {\n            points: bgPoints\n          },\n          incremental: !!incremental,\n          silent: true,\n          z2: 0\n        });\n        bgEl.baseDimIdx = baseDimIdx;\n        bgEl.largeDataIndices = largeDataIndices;\n        bgEl.barWidth = barWidth;\n        bgEl.useStyle(backgroundModel.getItemStyle());\n        group.add(bgEl);\n        progressiveEls && progressiveEls.push(bgEl);\n      }\n      var el = new LargePath({\n        shape: {\n          points: data.getLayout('largePoints')\n        },\n        incremental: !!incremental,\n        ignoreCoarsePointer: true,\n        z2: 1\n      });\n      el.baseDimIdx = baseDimIdx;\n      el.largeDataIndices = largeDataIndices;\n      el.barWidth = barWidth;\n      group.add(el);\n      el.useStyle(data.getVisual('style'));\n      // Stroke is rendered first to avoid overlapping with fill\n      el.style.stroke = null;\n      // Enable tooltip and user mouse/touch event handlers.\n      getECData(el).seriesIndex = seriesModel.seriesIndex;\n      if (!seriesModel.get('silent')) {\n        el.on('mousedown', largePathUpdateDataIndex);\n        el.on('mousemove', largePathUpdateDataIndex);\n      }\n      progressiveEls && progressiveEls.push(el);\n    }\n    // Use throttle to avoid frequently traverse to find dataIndex.\n    var largePathUpdateDataIndex = throttle(function (event) {\n      var largePath = this;\n      var dataIndex = largePathFindDataIndex(largePath, event.offsetX, event.offsetY);\n      getECData(largePath).dataIndex = dataIndex >= 0 ? dataIndex : null;\n    }, 30, false);\n    function largePathFindDataIndex(largePath, x, y) {\n      var baseDimIdx = largePath.baseDimIdx;\n      var valueDimIdx = 1 - baseDimIdx;\n      var points = largePath.shape.points;\n      var largeDataIndices = largePath.largeDataIndices;\n      var startPoint = [];\n      var size = [];\n      var barWidth = largePath.barWidth;\n      for (var i = 0, len = points.length / 3; i < len; i++) {\n        var ii = i * 3;\n        size[baseDimIdx] = barWidth;\n        size[valueDimIdx] = points[ii + 2];\n        startPoint[baseDimIdx] = points[ii + baseDimIdx];\n        startPoint[valueDimIdx] = points[ii + valueDimIdx];\n        if (size[valueDimIdx] < 0) {\n          startPoint[valueDimIdx] += size[valueDimIdx];\n          size[valueDimIdx] = -size[valueDimIdx];\n        }\n        if (x >= startPoint[0] && x <= startPoint[0] + size[0] && y >= startPoint[1] && y <= startPoint[1] + size[1]) {\n          return largeDataIndices[i];\n        }\n      }\n      return -1;\n    }\n    function createBackgroundShape(isHorizontalOrRadial, layout, coord) {\n      if (isCoordinateSystemType(coord, 'cartesian2d')) {\n        var rectShape = layout;\n        var coordLayout = coord.getArea();\n        return {\n          x: isHorizontalOrRadial ? rectShape.x : coordLayout.x,\n          y: isHorizontalOrRadial ? coordLayout.y : rectShape.y,\n          width: isHorizontalOrRadial ? rectShape.width : coordLayout.width,\n          height: isHorizontalOrRadial ? coordLayout.height : rectShape.height\n        };\n      } else {\n        var coordLayout = coord.getArea();\n        var sectorShape = layout;\n        return {\n          cx: coordLayout.cx,\n          cy: coordLayout.cy,\n          r0: isHorizontalOrRadial ? coordLayout.r0 : sectorShape.r0,\n          r: isHorizontalOrRadial ? coordLayout.r : sectorShape.r,\n          startAngle: isHorizontalOrRadial ? sectorShape.startAngle : 0,\n          endAngle: isHorizontalOrRadial ? sectorShape.endAngle : Math.PI * 2\n        };\n      }\n    }\n    function createBackgroundEl(coord, isHorizontalOrRadial, layout) {\n      var ElementClz = coord.type === 'polar' ? Sector : Rect;\n      return new ElementClz({\n        shape: createBackgroundShape(isHorizontalOrRadial, layout, coord),\n        silent: true,\n        z2: 0\n      });\n    }\n\n    function install$3(registers) {\n      registers.registerChartView(BarView);\n      registers.registerSeriesModel(BarSeriesModel);\n      registers.registerLayout(registers.PRIORITY.VISUAL.LAYOUT, curry(layout, 'bar'));\n      // Do layout after other overall layout, which can prepare some information.\n      registers.registerLayout(registers.PRIORITY.VISUAL.PROGRESSIVE_LAYOUT, createProgressiveLayout('bar'));\n      // Down sample after filter\n      registers.registerProcessor(registers.PRIORITY.PROCESSOR.STATISTIC, dataSample('bar'));\n      /**\r\n       * @payload\r\n       * @property {string} [componentType=series]\r\n       * @property {number} [dx]\r\n       * @property {number} [dy]\r\n       * @property {number} [zoom]\r\n       * @property {number} [originX]\r\n       * @property {number} [originY]\r\n       */\n      registers.registerAction({\n        type: 'changeAxisOrder',\n        event: 'changeAxisOrder',\n        update: 'update'\n      }, function (payload, ecModel) {\n        var componentType = payload.componentType || 'series';\n        ecModel.eachComponent({\n          mainType: componentType,\n          query: payload\n        }, function (componentModel) {\n          if (payload.sortInfo) {\n            componentModel.axis.setCategorySortInfo(payload.sortInfo);\n          }\n        });\n      });\n    }\n\n    var PI2$8 = Math.PI * 2;\n    var RADIAN = Math.PI / 180;\n    function getViewRect(seriesModel, api) {\n      return getLayoutRect(seriesModel.getBoxLayoutParams(), {\n        width: api.getWidth(),\n        height: api.getHeight()\n      });\n    }\n    function getBasicPieLayout(seriesModel, api) {\n      var viewRect = getViewRect(seriesModel, api);\n      // center can be string or number when coordinateSystem is specified\n      var center = seriesModel.get('center');\n      var radius = seriesModel.get('radius');\n      if (!isArray(radius)) {\n        radius = [0, radius];\n      }\n      var width = parsePercent$1(viewRect.width, api.getWidth());\n      var height = parsePercent$1(viewRect.height, api.getHeight());\n      var size = Math.min(width, height);\n      var r0 = parsePercent$1(radius[0], size / 2);\n      var r = parsePercent$1(radius[1], size / 2);\n      var cx;\n      var cy;\n      var coordSys = seriesModel.coordinateSystem;\n      if (coordSys) {\n        // percentage is not allowed when coordinate system is specified\n        var point = coordSys.dataToPoint(center);\n        cx = point[0] || 0;\n        cy = point[1] || 0;\n      } else {\n        if (!isArray(center)) {\n          center = [center, center];\n        }\n        cx = parsePercent$1(center[0], width) + viewRect.x;\n        cy = parsePercent$1(center[1], height) + viewRect.y;\n      }\n      return {\n        cx: cx,\n        cy: cy,\n        r0: r0,\n        r: r\n      };\n    }\n    function pieLayout(seriesType, ecModel, api) {\n      ecModel.eachSeriesByType(seriesType, function (seriesModel) {\n        var data = seriesModel.getData();\n        var valueDim = data.mapDimension('value');\n        var viewRect = getViewRect(seriesModel, api);\n        var _a = getBasicPieLayout(seriesModel, api),\n          cx = _a.cx,\n          cy = _a.cy,\n          r = _a.r,\n          r0 = _a.r0;\n        var startAngle = -seriesModel.get('startAngle') * RADIAN;\n        var endAngle = seriesModel.get('endAngle');\n        var padAngle = seriesModel.get('padAngle') * RADIAN;\n        endAngle = endAngle === 'auto' ? startAngle - PI2$8 : -endAngle * RADIAN;\n        var minAngle = seriesModel.get('minAngle') * RADIAN;\n        var minAndPadAngle = minAngle + padAngle;\n        var validDataCount = 0;\n        data.each(valueDim, function (value) {\n          !isNaN(value) && validDataCount++;\n        });\n        var sum = data.getSum(valueDim);\n        // Sum may be 0\n        var unitRadian = Math.PI / (sum || validDataCount) * 2;\n        var clockwise = seriesModel.get('clockwise');\n        var roseType = seriesModel.get('roseType');\n        var stillShowZeroSum = seriesModel.get('stillShowZeroSum');\n        // [0...max]\n        var extent = data.getDataExtent(valueDim);\n        extent[0] = 0;\n        var dir = clockwise ? 1 : -1;\n        var angles = [startAngle, endAngle];\n        var halfPadAngle = dir * padAngle / 2;\n        normalizeArcAngles(angles, !clockwise);\n        startAngle = angles[0], endAngle = angles[1];\n        var layoutData = getSeriesLayoutData(seriesModel);\n        layoutData.startAngle = startAngle;\n        layoutData.endAngle = endAngle;\n        layoutData.clockwise = clockwise;\n        var angleRange = Math.abs(endAngle - startAngle);\n        // In the case some sector angle is smaller than minAngle\n        var restAngle = angleRange;\n        var valueSumLargerThanMinAngle = 0;\n        var currentAngle = startAngle;\n        data.setLayout({\n          viewRect: viewRect,\n          r: r\n        });\n        data.each(valueDim, function (value, idx) {\n          var angle;\n          if (isNaN(value)) {\n            data.setItemLayout(idx, {\n              angle: NaN,\n              startAngle: NaN,\n              endAngle: NaN,\n              clockwise: clockwise,\n              cx: cx,\n              cy: cy,\n              r0: r0,\n              r: roseType ? NaN : r\n            });\n            return;\n          }\n          // FIXME 兼容 2.0 但是 roseType 是 area 的时候才是这样？\n          if (roseType !== 'area') {\n            angle = sum === 0 && stillShowZeroSum ? unitRadian : value * unitRadian;\n          } else {\n            angle = angleRange / validDataCount;\n          }\n          if (angle < minAndPadAngle) {\n            angle = minAndPadAngle;\n            restAngle -= minAndPadAngle;\n          } else {\n            valueSumLargerThanMinAngle += value;\n          }\n          var endAngle = currentAngle + dir * angle;\n          // calculate display angle\n          var actualStartAngle = 0;\n          var actualEndAngle = 0;\n          if (padAngle > angle) {\n            actualStartAngle = currentAngle + dir * angle / 2;\n            actualEndAngle = actualStartAngle;\n          } else {\n            actualStartAngle = currentAngle + halfPadAngle;\n            actualEndAngle = endAngle - halfPadAngle;\n          }\n          data.setItemLayout(idx, {\n            angle: angle,\n            startAngle: actualStartAngle,\n            endAngle: actualEndAngle,\n            clockwise: clockwise,\n            cx: cx,\n            cy: cy,\n            r0: r0,\n            r: roseType ? linearMap(value, extent, [r0, r]) : r\n          });\n          currentAngle = endAngle;\n        });\n        // Some sector is constrained by minAngle and padAngle\n        // Rest sectors needs recalculate angle\n        if (restAngle < PI2$8 && validDataCount) {\n          // Average the angle if rest angle is not enough after all angles is\n          // Constrained by minAngle and padAngle\n          if (restAngle <= 1e-3) {\n            var angle_1 = angleRange / validDataCount;\n            data.each(valueDim, function (value, idx) {\n              if (!isNaN(value)) {\n                var layout_1 = data.getItemLayout(idx);\n                layout_1.angle = angle_1;\n                var actualStartAngle = 0;\n                var actualEndAngle = 0;\n                if (angle_1 < padAngle) {\n                  actualStartAngle = startAngle + dir * (idx + 1 / 2) * angle_1;\n                  actualEndAngle = actualStartAngle;\n                } else {\n                  actualStartAngle = startAngle + dir * idx * angle_1 + halfPadAngle;\n                  actualEndAngle = startAngle + dir * (idx + 1) * angle_1 - halfPadAngle;\n                }\n                layout_1.startAngle = actualStartAngle;\n                layout_1.endAngle = actualEndAngle;\n              }\n            });\n          } else {\n            unitRadian = restAngle / valueSumLargerThanMinAngle;\n            currentAngle = startAngle;\n            data.each(valueDim, function (value, idx) {\n              if (!isNaN(value)) {\n                var layout_2 = data.getItemLayout(idx);\n                var angle = layout_2.angle === minAndPadAngle ? minAndPadAngle : value * unitRadian;\n                var actualStartAngle = 0;\n                var actualEndAngle = 0;\n                if (angle < padAngle) {\n                  actualStartAngle = currentAngle + dir * angle / 2;\n                  actualEndAngle = actualStartAngle;\n                } else {\n                  actualStartAngle = currentAngle + halfPadAngle;\n                  actualEndAngle = currentAngle + dir * angle - halfPadAngle;\n                }\n                layout_2.startAngle = actualStartAngle;\n                layout_2.endAngle = actualEndAngle;\n                currentAngle += dir * angle;\n              }\n            });\n          }\n        }\n      });\n    }\n    var getSeriesLayoutData = makeInner();\n\n    /*\n    * Licensed to the Apache Software Foundation (ASF) under one\n    * or more contributor license agreements.  See the NOTICE file\n    * distributed with this work for additional information\n    * regarding copyright ownership.  The ASF licenses this file\n    * to you under the Apache License, Version 2.0 (the\n    * \"License\"); you may not use this file except in compliance\n    * with the License.  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,\n    * software distributed under the License is distributed on an\n    * \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\n    * KIND, either express or implied.  See the License for the\n    * specific language governing permissions and limitations\n    * under the License.\n    */\n\n\n    /**\n     * AUTO-GENERATED FILE. DO NOT MODIFY.\n     */\n\n    /*\r\n    * Licensed to the Apache Software Foundation (ASF) under one\r\n    * or more contributor license agreements.  See the NOTICE file\r\n    * distributed with this work for additional information\r\n    * regarding copyright ownership.  The ASF licenses this file\r\n    * to you under the Apache License, Version 2.0 (the\r\n    * \"License\"); you may not use this file except in compliance\r\n    * with the License.  You may obtain a copy of the License at\r\n    *\r\n    *   http://www.apache.org/licenses/LICENSE-2.0\r\n    *\r\n    * Unless required by applicable law or agreed to in writing,\r\n    * software distributed under the License is distributed on an\r\n    * \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\r\n    * KIND, either express or implied.  See the License for the\r\n    * specific language governing permissions and limitations\r\n    * under the License.\r\n    */\n    function dataFilter(seriesType) {\n      return {\n        seriesType: seriesType,\n        reset: function (seriesModel, ecModel) {\n          var legendModels = ecModel.findComponents({\n            mainType: 'legend'\n          });\n          if (!legendModels || !legendModels.length) {\n            return;\n          }\n          var data = seriesModel.getData();\n          data.filterSelf(function (idx) {\n            var name = data.getName(idx);\n            // If in any legend component the status is not selected.\n            for (var i = 0; i < legendModels.length; i++) {\n              // @ts-ignore FIXME: LegendModel\n              if (!legendModels[i].isSelected(name)) {\n                return false;\n              }\n            }\n            return true;\n          });\n        }\n      };\n    }\n\n    var RADIAN$1 = Math.PI / 180;\n    function adjustSingleSide(list, cx, cy, r, dir, viewWidth, viewHeight, viewLeft, viewTop, farthestX) {\n      if (list.length < 2) {\n        return;\n      }\n      function recalculateXOnSemiToAlignOnEllipseCurve(semi) {\n        var rB = semi.rB;\n        var rB2 = rB * rB;\n        for (var i = 0; i < semi.list.length; i++) {\n          var item = semi.list[i];\n          var dy = Math.abs(item.label.y - cy);\n          // horizontal r is always same with original r because x is not changed.\n          var rA = r + item.len;\n          var rA2 = rA * rA;\n          // Use ellipse implicit function to calculate x\n          var dx = Math.sqrt(Math.abs((1 - dy * dy / rB2) * rA2));\n          var newX = cx + (dx + item.len2) * dir;\n          var deltaX = newX - item.label.x;\n          var newTargetWidth = item.targetTextWidth - deltaX * dir;\n          // text x is changed, so need to recalculate width.\n          constrainTextWidth(item, newTargetWidth, true);\n          item.label.x = newX;\n        }\n      }\n      // Adjust X based on the shifted y. Make tight labels aligned on an ellipse curve.\n      function recalculateX(items) {\n        // Extremes of\n        var topSemi = {\n          list: [],\n          maxY: 0\n        };\n        var bottomSemi = {\n          list: [],\n          maxY: 0\n        };\n        for (var i = 0; i < items.length; i++) {\n          if (items[i].labelAlignTo !== 'none') {\n            continue;\n          }\n          var item = items[i];\n          var semi = item.label.y > cy ? bottomSemi : topSemi;\n          var dy = Math.abs(item.label.y - cy);\n          if (dy >= semi.maxY) {\n            var dx = item.label.x - cx - item.len2 * dir;\n            // horizontal r is always same with original r because x is not changed.\n            var rA = r + item.len;\n            // Canculate rB based on the topest / bottemest label.\n            var rB = Math.abs(dx) < rA ? Math.sqrt(dy * dy / (1 - dx * dx / rA / rA)) : rA;\n            semi.rB = rB;\n            semi.maxY = dy;\n          }\n          semi.list.push(item);\n        }\n        recalculateXOnSemiToAlignOnEllipseCurve(topSemi);\n        recalculateXOnSemiToAlignOnEllipseCurve(bottomSemi);\n      }\n      var len = list.length;\n      for (var i = 0; i < len; i++) {\n        if (list[i].position === 'outer' && list[i].labelAlignTo === 'labelLine') {\n          var dx = list[i].label.x - farthestX;\n          list[i].linePoints[1][0] += dx;\n          list[i].label.x = farthestX;\n        }\n      }\n      if (shiftLayoutOnY(list, viewTop, viewTop + viewHeight)) {\n        recalculateX(list);\n      }\n    }\n    function avoidOverlap(labelLayoutList, cx, cy, r, viewWidth, viewHeight, viewLeft, viewTop) {\n      var leftList = [];\n      var rightList = [];\n      var leftmostX = Number.MAX_VALUE;\n      var rightmostX = -Number.MAX_VALUE;\n      for (var i = 0; i < labelLayoutList.length; i++) {\n        var label = labelLayoutList[i].label;\n        if (isPositionCenter(labelLayoutList[i])) {\n          continue;\n        }\n        if (label.x < cx) {\n          leftmostX = Math.min(leftmostX, label.x);\n          leftList.push(labelLayoutList[i]);\n        } else {\n          rightmostX = Math.max(rightmostX, label.x);\n          rightList.push(labelLayoutList[i]);\n        }\n      }\n      for (var i = 0; i < labelLayoutList.length; i++) {\n        var layout = labelLayoutList[i];\n        if (!isPositionCenter(layout) && layout.linePoints) {\n          if (layout.labelStyleWidth != null) {\n            continue;\n          }\n          var label = layout.label;\n          var linePoints = layout.linePoints;\n          var targetTextWidth = void 0;\n          if (layout.labelAlignTo === 'edge') {\n            if (label.x < cx) {\n              targetTextWidth = linePoints[2][0] - layout.labelDistance - viewLeft - layout.edgeDistance;\n            } else {\n              targetTextWidth = viewLeft + viewWidth - layout.edgeDistance - linePoints[2][0] - layout.labelDistance;\n            }\n          } else if (layout.labelAlignTo === 'labelLine') {\n            if (label.x < cx) {\n              targetTextWidth = leftmostX - viewLeft - layout.bleedMargin;\n            } else {\n              targetTextWidth = viewLeft + viewWidth - rightmostX - layout.bleedMargin;\n            }\n          } else {\n            if (label.x < cx) {\n              targetTextWidth = label.x - viewLeft - layout.bleedMargin;\n            } else {\n              targetTextWidth = viewLeft + viewWidth - label.x - layout.bleedMargin;\n            }\n          }\n          layout.targetTextWidth = targetTextWidth;\n          constrainTextWidth(layout, targetTextWidth);\n        }\n      }\n      adjustSingleSide(rightList, cx, cy, r, 1, viewWidth, viewHeight, viewLeft, viewTop, rightmostX);\n      adjustSingleSide(leftList, cx, cy, r, -1, viewWidth, viewHeight, viewLeft, viewTop, leftmostX);\n      for (var i = 0; i < labelLayoutList.length; i++) {\n        var layout = labelLayoutList[i];\n        if (!isPositionCenter(layout) && layout.linePoints) {\n          var label = layout.label;\n          var linePoints = layout.linePoints;\n          var isAlignToEdge = layout.labelAlignTo === 'edge';\n          var padding = label.style.padding;\n          var paddingH = padding ? padding[1] + padding[3] : 0;\n          // textRect.width already contains paddingH if bgColor is set\n          var extraPaddingH = label.style.backgroundColor ? 0 : paddingH;\n          var realTextWidth = layout.rect.width + extraPaddingH;\n          var dist = linePoints[1][0] - linePoints[2][0];\n          if (isAlignToEdge) {\n            if (label.x < cx) {\n              linePoints[2][0] = viewLeft + layout.edgeDistance + realTextWidth + layout.labelDistance;\n            } else {\n              linePoints[2][0] = viewLeft + viewWidth - layout.edgeDistance - realTextWidth - layout.labelDistance;\n            }\n          } else {\n            if (label.x < cx) {\n              linePoints[2][0] = label.x + layout.labelDistance;\n            } else {\n              linePoints[2][0] = label.x - layout.labelDistance;\n            }\n            linePoints[1][0] = linePoints[2][0] + dist;\n          }\n          linePoints[1][1] = linePoints[2][1] = label.y;\n        }\n      }\n    }\n    /**\r\n     * Set max width of each label, and then wrap each label to the max width.\r\n     *\r\n     * @param layout label layout\r\n     * @param availableWidth max width for the label to display\r\n     * @param forceRecalculate recaculate the text layout even if the current width\r\n     * is smaller than `availableWidth`. This is useful when the text was previously\r\n     * wrapped by calling `constrainTextWidth` but now `availableWidth` changed, in\r\n     * which case, previous wrapping should be redo.\r\n     */\n    function constrainTextWidth(layout, availableWidth, forceRecalculate) {\n      if (forceRecalculate === void 0) {\n        forceRecalculate = false;\n      }\n      if (layout.labelStyleWidth != null) {\n        // User-defined style.width has the highest priority.\n        return;\n      }\n      var label = layout.label;\n      var style = label.style;\n      var textRect = layout.rect;\n      var bgColor = style.backgroundColor;\n      var padding = style.padding;\n      var paddingH = padding ? padding[1] + padding[3] : 0;\n      var overflow = style.overflow;\n      // textRect.width already contains paddingH if bgColor is set\n      var oldOuterWidth = textRect.width + (bgColor ? 0 : paddingH);\n      if (availableWidth < oldOuterWidth || forceRecalculate) {\n        var oldHeight = textRect.height;\n        if (overflow && overflow.match('break')) {\n          // Temporarily set background to be null to calculate\n          // the bounding box without background.\n          label.setStyle('backgroundColor', null);\n          // Set constraining width\n          label.setStyle('width', availableWidth - paddingH);\n          // This is the real bounding box of the text without padding.\n          var innerRect = label.getBoundingRect();\n          label.setStyle('width', Math.ceil(innerRect.width));\n          label.setStyle('backgroundColor', bgColor);\n        } else {\n          var availableInnerWidth = availableWidth - paddingH;\n          var newWidth = availableWidth < oldOuterWidth\n          // Current text is too wide, use `availableWidth` as max width.\n          ? availableInnerWidth :\n          // Current available width is enough, but the text may have\n          // already been wrapped with a smaller available width.\n          forceRecalculate ? availableInnerWidth > layout.unconstrainedWidth\n          // Current available is larger than text width,\n          // so don't constrain width (otherwise it may have\n          // empty space in the background).\n          ? null\n          // Current available is smaller than text width, so\n          // use the current available width as constraining\n          // width.\n          : availableInnerWidth\n          // Current available width is enough, so no need to\n          // constrain.\n          : null;\n          label.setStyle('width', newWidth);\n        }\n        var newRect = label.getBoundingRect();\n        textRect.width = newRect.width;\n        var margin = (label.style.margin || 0) + 2.1;\n        textRect.height = newRect.height + margin;\n        textRect.y -= (textRect.height - oldHeight) / 2;\n      }\n    }\n    function isPositionCenter(sectorShape) {\n      // Not change x for center label\n      return sectorShape.position === 'center';\n    }\n    function pieLabelLayout(seriesModel) {\n      var data = seriesModel.getData();\n      var labelLayoutList = [];\n      var cx;\n      var cy;\n      var hasLabelRotate = false;\n      var minShowLabelRadian = (seriesModel.get('minShowLabelAngle') || 0) * RADIAN$1;\n      var viewRect = data.getLayout('viewRect');\n      var r = data.getLayout('r');\n      var viewWidth = viewRect.width;\n      var viewLeft = viewRect.x;\n      var viewTop = viewRect.y;\n      var viewHeight = viewRect.height;\n      function setNotShow(el) {\n        el.ignore = true;\n      }\n      function isLabelShown(label) {\n        if (!label.ignore) {\n          return true;\n        }\n        for (var key in label.states) {\n          if (label.states[key].ignore === false) {\n            return true;\n          }\n        }\n        return false;\n      }\n      data.each(function (idx) {\n        var sector = data.getItemGraphicEl(idx);\n        var sectorShape = sector.shape;\n        var label = sector.getTextContent();\n        var labelLine = sector.getTextGuideLine();\n        var itemModel = data.getItemModel(idx);\n        var labelModel = itemModel.getModel('label');\n        // Use position in normal or emphasis\n        var labelPosition = labelModel.get('position') || itemModel.get(['emphasis', 'label', 'position']);\n        var labelDistance = labelModel.get('distanceToLabelLine');\n        var labelAlignTo = labelModel.get('alignTo');\n        var edgeDistance = parsePercent$1(labelModel.get('edgeDistance'), viewWidth);\n        var bleedMargin = labelModel.get('bleedMargin');\n        var labelLineModel = itemModel.getModel('labelLine');\n        var labelLineLen = labelLineModel.get('length');\n        labelLineLen = parsePercent$1(labelLineLen, viewWidth);\n        var labelLineLen2 = labelLineModel.get('length2');\n        labelLineLen2 = parsePercent$1(labelLineLen2, viewWidth);\n        if (Math.abs(sectorShape.endAngle - sectorShape.startAngle) < minShowLabelRadian) {\n          each(label.states, setNotShow);\n          label.ignore = true;\n          if (labelLine) {\n            each(labelLine.states, setNotShow);\n            labelLine.ignore = true;\n          }\n          return;\n        }\n        if (!isLabelShown(label)) {\n          return;\n        }\n        var midAngle = (sectorShape.startAngle + sectorShape.endAngle) / 2;\n        var nx = Math.cos(midAngle);\n        var ny = Math.sin(midAngle);\n        var textX;\n        var textY;\n        var linePoints;\n        var textAlign;\n        cx = sectorShape.cx;\n        cy = sectorShape.cy;\n        var isLabelInside = labelPosition === 'inside' || labelPosition === 'inner';\n        if (labelPosition === 'center') {\n          textX = sectorShape.cx;\n          textY = sectorShape.cy;\n          textAlign = 'center';\n        } else {\n          var x1 = (isLabelInside ? (sectorShape.r + sectorShape.r0) / 2 * nx : sectorShape.r * nx) + cx;\n          var y1 = (isLabelInside ? (sectorShape.r + sectorShape.r0) / 2 * ny : sectorShape.r * ny) + cy;\n          textX = x1 + nx * 3;\n          textY = y1 + ny * 3;\n          if (!isLabelInside) {\n            // For roseType\n            var x2 = x1 + nx * (labelLineLen + r - sectorShape.r);\n            var y2 = y1 + ny * (labelLineLen + r - sectorShape.r);\n            var x3 = x2 + (nx < 0 ? -1 : 1) * labelLineLen2;\n            var y3 = y2;\n            if (labelAlignTo === 'edge') {\n              // Adjust textX because text align of edge is opposite\n              textX = nx < 0 ? viewLeft + edgeDistance : viewLeft + viewWidth - edgeDistance;\n            } else {\n              textX = x3 + (nx < 0 ? -labelDistance : labelDistance);\n            }\n            textY = y3;\n            linePoints = [[x1, y1], [x2, y2], [x3, y3]];\n          }\n          textAlign = isLabelInside ? 'center' : labelAlignTo === 'edge' ? nx > 0 ? 'right' : 'left' : nx > 0 ? 'left' : 'right';\n        }\n        var PI = Math.PI;\n        var labelRotate = 0;\n        var rotate = labelModel.get('rotate');\n        if (isNumber(rotate)) {\n          labelRotate = rotate * (PI / 180);\n        } else if (labelPosition === 'center') {\n          labelRotate = 0;\n        } else if (rotate === 'radial' || rotate === true) {\n          var radialAngle = nx < 0 ? -midAngle + PI : -midAngle;\n          labelRotate = radialAngle;\n        } else if (rotate === 'tangential' && labelPosition !== 'outside' && labelPosition !== 'outer') {\n          var rad = Math.atan2(nx, ny);\n          if (rad < 0) {\n            rad = PI * 2 + rad;\n          }\n          var isDown = ny > 0;\n          if (isDown) {\n            rad = PI + rad;\n          }\n          labelRotate = rad - PI;\n        }\n        hasLabelRotate = !!labelRotate;\n        label.x = textX;\n        label.y = textY;\n        label.rotation = labelRotate;\n        label.setStyle({\n          verticalAlign: 'middle'\n        });\n        // Not sectorShape the inside label\n        if (!isLabelInside) {\n          var textRect = label.getBoundingRect().clone();\n          textRect.applyTransform(label.getComputedTransform());\n          // Text has a default 1px stroke. Exclude this.\n          var margin = (label.style.margin || 0) + 2.1;\n          textRect.y -= margin / 2;\n          textRect.height += margin;\n          labelLayoutList.push({\n            label: label,\n            labelLine: labelLine,\n            position: labelPosition,\n            len: labelLineLen,\n            len2: labelLineLen2,\n            minTurnAngle: labelLineModel.get('minTurnAngle'),\n            maxSurfaceAngle: labelLineModel.get('maxSurfaceAngle'),\n            surfaceNormal: new Point(nx, ny),\n            linePoints: linePoints,\n            textAlign: textAlign,\n            labelDistance: labelDistance,\n            labelAlignTo: labelAlignTo,\n            edgeDistance: edgeDistance,\n            bleedMargin: bleedMargin,\n            rect: textRect,\n            unconstrainedWidth: textRect.width,\n            labelStyleWidth: label.style.width\n          });\n        } else {\n          label.setStyle({\n            align: textAlign\n          });\n          var selectState = label.states.select;\n          if (selectState) {\n            selectState.x += label.x;\n            selectState.y += label.y;\n          }\n        }\n        sector.setTextConfig({\n          inside: isLabelInside\n        });\n      });\n      if (!hasLabelRotate && seriesModel.get('avoidLabelOverlap')) {\n        avoidOverlap(labelLayoutList, cx, cy, r, viewWidth, viewHeight, viewLeft, viewTop);\n      }\n      for (var i = 0; i < labelLayoutList.length; i++) {\n        var layout = labelLayoutList[i];\n        var label = layout.label;\n        var labelLine = layout.labelLine;\n        var notShowLabel = isNaN(label.x) || isNaN(label.y);\n        if (label) {\n          label.setStyle({\n            align: layout.textAlign\n          });\n          if (notShowLabel) {\n            each(label.states, setNotShow);\n            label.ignore = true;\n          }\n          var selectState = label.states.select;\n          if (selectState) {\n            selectState.x += label.x;\n            selectState.y += label.y;\n          }\n        }\n        if (labelLine) {\n          var linePoints = layout.linePoints;\n          if (notShowLabel || !linePoints) {\n            each(labelLine.states, setNotShow);\n            labelLine.ignore = true;\n          } else {\n            limitTurnAngle(linePoints, layout.minTurnAngle);\n            limitSurfaceAngle(linePoints, layout.surfaceNormal, layout.maxSurfaceAngle);\n            labelLine.setShape({\n              points: linePoints\n            });\n            // Set the anchor to the midpoint of sector\n            label.__hostTarget.textGuideLineConfig = {\n              anchor: new Point(linePoints[0][0], linePoints[0][1])\n            };\n          }\n        }\n      }\n    }\n\n    /**\r\n     * Piece of pie including Sector, Label, LabelLine\r\n     */\n    var PiePiece = /** @class */function (_super) {\n      __extends(PiePiece, _super);\n      function PiePiece(data, idx, startAngle) {\n        var _this = _super.call(this) || this;\n        _this.z2 = 2;\n        var text = new ZRText();\n        _this.setTextContent(text);\n        _this.updateData(data, idx, startAngle, true);\n        return _this;\n      }\n      PiePiece.prototype.updateData = function (data, idx, startAngle, firstCreate) {\n        var sector = this;\n        var seriesModel = data.hostModel;\n        var itemModel = data.getItemModel(idx);\n        var emphasisModel = itemModel.getModel('emphasis');\n        var layout = data.getItemLayout(idx);\n        // cornerRadius & innerCornerRadius doesn't exist in the item layout. Use `0` if null value is specified.\n        // see `setItemLayout` in `pieLayout.ts`.\n        var sectorShape = extend(getSectorCornerRadius(itemModel.getModel('itemStyle'), layout, true), layout);\n        // Ignore NaN data.\n        if (isNaN(sectorShape.startAngle)) {\n          // Use NaN shape to avoid drawing shape.\n          sector.setShape(sectorShape);\n          return;\n        }\n        if (firstCreate) {\n          sector.setShape(sectorShape);\n          var animationType = seriesModel.getShallow('animationType');\n          if (seriesModel.ecModel.ssr) {\n            // Use scale animation in SSR mode(opacity?)\n            // Because CSS SVG animation doesn't support very customized shape animation.\n            initProps(sector, {\n              scaleX: 0,\n              scaleY: 0\n            }, seriesModel, {\n              dataIndex: idx,\n              isFrom: true\n            });\n            sector.originX = sectorShape.cx;\n            sector.originY = sectorShape.cy;\n          } else if (animationType === 'scale') {\n            sector.shape.r = layout.r0;\n            initProps(sector, {\n              shape: {\n                r: layout.r\n              }\n            }, seriesModel, idx);\n          }\n          // Expansion\n          else {\n            if (startAngle != null) {\n              sector.setShape({\n                startAngle: startAngle,\n                endAngle: startAngle\n              });\n              initProps(sector, {\n                shape: {\n                  startAngle: layout.startAngle,\n                  endAngle: layout.endAngle\n                }\n              }, seriesModel, idx);\n            } else {\n              sector.shape.endAngle = layout.startAngle;\n              updateProps(sector, {\n                shape: {\n                  endAngle: layout.endAngle\n                }\n              }, seriesModel, idx);\n            }\n          }\n        } else {\n          saveOldStyle(sector);\n          // Transition animation from the old shape\n          updateProps(sector, {\n            shape: sectorShape\n          }, seriesModel, idx);\n        }\n        sector.useStyle(data.getItemVisual(idx, 'style'));\n        setStatesStylesFromModel(sector, itemModel);\n        var midAngle = (layout.startAngle + layout.endAngle) / 2;\n        var offset = seriesModel.get('selectedOffset');\n        var dx = Math.cos(midAngle) * offset;\n        var dy = Math.sin(midAngle) * offset;\n        var cursorStyle = itemModel.getShallow('cursor');\n        cursorStyle && sector.attr('cursor', cursorStyle);\n        this._updateLabel(seriesModel, data, idx);\n        sector.ensureState('emphasis').shape = extend({\n          r: layout.r + (emphasisModel.get('scale') ? emphasisModel.get('scaleSize') || 0 : 0)\n        }, getSectorCornerRadius(emphasisModel.getModel('itemStyle'), layout));\n        extend(sector.ensureState('select'), {\n          x: dx,\n          y: dy,\n          shape: getSectorCornerRadius(itemModel.getModel(['select', 'itemStyle']), layout)\n        });\n        extend(sector.ensureState('blur'), {\n          shape: getSectorCornerRadius(itemModel.getModel(['blur', 'itemStyle']), layout)\n        });\n        var labelLine = sector.getTextGuideLine();\n        var labelText = sector.getTextContent();\n        labelLine && extend(labelLine.ensureState('select'), {\n          x: dx,\n          y: dy\n        });\n        // TODO: needs dx, dy in zrender?\n        extend(labelText.ensureState('select'), {\n          x: dx,\n          y: dy\n        });\n        toggleHoverEmphasis(this, emphasisModel.get('focus'), emphasisModel.get('blurScope'), emphasisModel.get('disabled'));\n      };\n      PiePiece.prototype._updateLabel = function (seriesModel, data, idx) {\n        var sector = this;\n        var itemModel = data.getItemModel(idx);\n        var labelLineModel = itemModel.getModel('labelLine');\n        var style = data.getItemVisual(idx, 'style');\n        var visualColor = style && style.fill;\n        var visualOpacity = style && style.opacity;\n        setLabelStyle(sector, getLabelStatesModels(itemModel), {\n          labelFetcher: data.hostModel,\n          labelDataIndex: idx,\n          inheritColor: visualColor,\n          defaultOpacity: visualOpacity,\n          defaultText: seriesModel.getFormattedLabel(idx, 'normal') || data.getName(idx)\n        });\n        var labelText = sector.getTextContent();\n        // Set textConfig on sector.\n        sector.setTextConfig({\n          // reset position, rotation\n          position: null,\n          rotation: null\n        });\n        // Make sure update style on labelText after setLabelStyle.\n        // Because setLabelStyle will replace a new style on it.\n        labelText.attr({\n          z2: 10\n        });\n        var labelPosition = seriesModel.get(['label', 'position']);\n        if (labelPosition !== 'outside' && labelPosition !== 'outer') {\n          sector.removeTextGuideLine();\n        } else {\n          var polyline = this.getTextGuideLine();\n          if (!polyline) {\n            polyline = new Polyline();\n            this.setTextGuideLine(polyline);\n          }\n          // Default use item visual color\n          setLabelLineStyle(this, getLabelLineStatesModels(itemModel), {\n            stroke: visualColor,\n            opacity: retrieve3(labelLineModel.get(['lineStyle', 'opacity']), visualOpacity, 1)\n          });\n        }\n      };\n      return PiePiece;\n    }(Sector);\n    // Pie view\n    var PieView = /** @class */function (_super) {\n      __extends(PieView, _super);\n      function PieView() {\n        var _this = _super !== null && _super.apply(this, arguments) || this;\n        _this.ignoreLabelLineUpdate = true;\n        return _this;\n      }\n      PieView.prototype.render = function (seriesModel, ecModel, api, payload) {\n        var data = seriesModel.getData();\n        var oldData = this._data;\n        var group = this.group;\n        var startAngle;\n        // First render\n        if (!oldData && data.count() > 0) {\n          var shape = data.getItemLayout(0);\n          for (var s = 1; isNaN(shape && shape.startAngle) && s < data.count(); ++s) {\n            shape = data.getItemLayout(s);\n          }\n          if (shape) {\n            startAngle = shape.startAngle;\n          }\n        }\n        // remove empty-circle if it exists\n        if (this._emptyCircleSector) {\n          group.remove(this._emptyCircleSector);\n        }\n        // when all data are filtered, show lightgray empty circle\n        if (data.count() === 0 && seriesModel.get('showEmptyCircle')) {\n          var layoutData = getSeriesLayoutData(seriesModel);\n          var sector = new Sector({\n            shape: extend(getBasicPieLayout(seriesModel, api), layoutData)\n          });\n          sector.useStyle(seriesModel.getModel('emptyCircleStyle').getItemStyle());\n          this._emptyCircleSector = sector;\n          group.add(sector);\n        }\n        data.diff(oldData).add(function (idx) {\n          var piePiece = new PiePiece(data, idx, startAngle);\n          data.setItemGraphicEl(idx, piePiece);\n          group.add(piePiece);\n        }).update(function (newIdx, oldIdx) {\n          var piePiece = oldData.getItemGraphicEl(oldIdx);\n          piePiece.updateData(data, newIdx, startAngle);\n          piePiece.off('click');\n          group.add(piePiece);\n          data.setItemGraphicEl(newIdx, piePiece);\n        }).remove(function (idx) {\n          var piePiece = oldData.getItemGraphicEl(idx);\n          removeElementWithFadeOut(piePiece, seriesModel, idx);\n        }).execute();\n        pieLabelLayout(seriesModel);\n        // Always use initial animation.\n        if (seriesModel.get('animationTypeUpdate') !== 'expansion') {\n          this._data = data;\n        }\n      };\n      PieView.prototype.dispose = function () {};\n      PieView.prototype.containPoint = function (point, seriesModel) {\n        var data = seriesModel.getData();\n        var itemLayout = data.getItemLayout(0);\n        if (itemLayout) {\n          var dx = point[0] - itemLayout.cx;\n          var dy = point[1] - itemLayout.cy;\n          var radius = Math.sqrt(dx * dx + dy * dy);\n          return radius <= itemLayout.r && radius >= itemLayout.r0;\n        }\n      };\n      PieView.type = 'pie';\n      return PieView;\n    }(ChartView);\n\n    /**\r\n     * [Usage]:\r\n     * (1)\r\n     * createListSimply(seriesModel, ['value']);\r\n     * (2)\r\n     * createListSimply(seriesModel, {\r\n     *     coordDimensions: ['value'],\r\n     *     dimensionsCount: 5\r\n     * });\r\n     */\n    function createSeriesDataSimply(seriesModel, opt, nameList) {\n      opt = isArray(opt) && {\n        coordDimensions: opt\n      } || extend({\n        encodeDefine: seriesModel.getEncode()\n      }, opt);\n      var source = seriesModel.getSource();\n      var dimensions = prepareSeriesDataSchema(source, opt).dimensions;\n      var list = new SeriesData(dimensions, seriesModel);\n      list.initData(source, nameList);\n      return list;\n    }\n\n    /*\n    * Licensed to the Apache Software Foundation (ASF) under one\n    * or more contributor license agreements.  See the NOTICE file\n    * distributed with this work for additional information\n    * regarding copyright ownership.  The ASF licenses this file\n    * to you under the Apache License, Version 2.0 (the\n    * \"License\"); you may not use this file except in compliance\n    * with the License.  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,\n    * software distributed under the License is distributed on an\n    * \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\n    * KIND, either express or implied.  See the License for the\n    * specific language governing permissions and limitations\n    * under the License.\n    */\n\n\n    /**\n     * AUTO-GENERATED FILE. DO NOT MODIFY.\n     */\n\n    /*\r\n    * Licensed to the Apache Software Foundation (ASF) under one\r\n    * or more contributor license agreements.  See the NOTICE file\r\n    * distributed with this work for additional information\r\n    * regarding copyright ownership.  The ASF licenses this file\r\n    * to you under the Apache License, Version 2.0 (the\r\n    * \"License\"); you may not use this file except in compliance\r\n    * with the License.  You may obtain a copy of the License at\r\n    *\r\n    *   http://www.apache.org/licenses/LICENSE-2.0\r\n    *\r\n    * Unless required by applicable law or agreed to in writing,\r\n    * software distributed under the License is distributed on an\r\n    * \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\r\n    * KIND, either express or implied.  See the License for the\r\n    * specific language governing permissions and limitations\r\n    * under the License.\r\n    */\n    /**\r\n     * LegendVisualProvider is an bridge that pick encoded color from data and\r\n     * provide to the legend component.\r\n     */\n    var LegendVisualProvider = /** @class */function () {\n      function LegendVisualProvider(\n      // Function to get data after filtered. It stores all the encoding info\n      getDataWithEncodedVisual,\n      // Function to get raw data before filtered.\n      getRawData) {\n        this._getDataWithEncodedVisual = getDataWithEncodedVisual;\n        this._getRawData = getRawData;\n      }\n      LegendVisualProvider.prototype.getAllNames = function () {\n        var rawData = this._getRawData();\n        // We find the name from the raw data. In case it's filtered by the legend component.\n        // Normally, the name can be found in rawData, but can't be found in filtered data will display as gray.\n        return rawData.mapArray(rawData.getName);\n      };\n      LegendVisualProvider.prototype.containName = function (name) {\n        var rawData = this._getRawData();\n        return rawData.indexOfName(name) >= 0;\n      };\n      LegendVisualProvider.prototype.indexOfName = function (name) {\n        // Only get data when necessary.\n        // Because LegendVisualProvider constructor may be new in the stage that data is not prepared yet.\n        // Invoking Series#getData immediately will throw an error.\n        var dataWithEncodedVisual = this._getDataWithEncodedVisual();\n        return dataWithEncodedVisual.indexOfName(name);\n      };\n      LegendVisualProvider.prototype.getItemVisual = function (dataIndex, key) {\n        // Get encoded visual properties from final filtered data.\n        var dataWithEncodedVisual = this._getDataWithEncodedVisual();\n        return dataWithEncodedVisual.getItemVisual(dataIndex, key);\n      };\n      return LegendVisualProvider;\n    }();\n\n    var innerData = makeInner();\n    var PieSeriesModel = /** @class */function (_super) {\n      __extends(PieSeriesModel, _super);\n      function PieSeriesModel() {\n        return _super !== null && _super.apply(this, arguments) || this;\n      }\n      /**\r\n       * @overwrite\r\n       */\n      PieSeriesModel.prototype.init = function (option) {\n        _super.prototype.init.apply(this, arguments);\n        // Enable legend selection for each data item\n        // Use a function instead of direct access because data reference may changed\n        this.legendVisualProvider = new LegendVisualProvider(bind(this.getData, this), bind(this.getRawData, this));\n        this._defaultLabelLine(option);\n      };\n      /**\r\n       * @overwrite\r\n       */\n      PieSeriesModel.prototype.mergeOption = function () {\n        _super.prototype.mergeOption.apply(this, arguments);\n      };\n      /**\r\n       * @overwrite\r\n       */\n      PieSeriesModel.prototype.getInitialData = function () {\n        return createSeriesDataSimply(this, {\n          coordDimensions: ['value'],\n          encodeDefaulter: curry(makeSeriesEncodeForNameBased, this)\n        });\n      };\n      /**\r\n       * @overwrite\r\n       */\n      PieSeriesModel.prototype.getDataParams = function (dataIndex) {\n        var data = this.getData();\n        // update seats when data is changed\n        var dataInner = innerData(data);\n        var seats = dataInner.seats;\n        if (!seats) {\n          var valueList_1 = [];\n          data.each(data.mapDimension('value'), function (value) {\n            valueList_1.push(value);\n          });\n          seats = dataInner.seats = getPercentSeats(valueList_1, data.hostModel.get('percentPrecision'));\n        }\n        var params = _super.prototype.getDataParams.call(this, dataIndex);\n        // seats may be empty when sum is 0\n        params.percent = seats[dataIndex] || 0;\n        params.$vars.push('percent');\n        return params;\n      };\n      PieSeriesModel.prototype._defaultLabelLine = function (option) {\n        // Extend labelLine emphasis\n        defaultEmphasis(option, 'labelLine', ['show']);\n        var labelLineNormalOpt = option.labelLine;\n        var labelLineEmphasisOpt = option.emphasis.labelLine;\n        // Not show label line if `label.normal.show = false`\n        labelLineNormalOpt.show = labelLineNormalOpt.show && option.label.show;\n        labelLineEmphasisOpt.show = labelLineEmphasisOpt.show && option.emphasis.label.show;\n      };\n      PieSeriesModel.type = 'series.pie';\n      PieSeriesModel.defaultOption = {\n        // zlevel: 0,\n        z: 2,\n        legendHoverLink: true,\n        colorBy: 'data',\n        // 默认全局居中\n        center: ['50%', '50%'],\n        radius: [0, '75%'],\n        // 默认顺时针\n        clockwise: true,\n        startAngle: 90,\n        endAngle: 'auto',\n        padAngle: 0,\n        // 最小角度改为0\n        minAngle: 0,\n        // If the angle of a sector less than `minShowLabelAngle`,\n        // the label will not be displayed.\n        minShowLabelAngle: 0,\n        // 选中时扇区偏移量\n        selectedOffset: 10,\n        // 选择模式，默认关闭，可选single，multiple\n        // selectedMode: false,\n        // 南丁格尔玫瑰图模式，'radius'（半径） | 'area'（面积）\n        // roseType: null,\n        percentPrecision: 2,\n        // If still show when all data zero.\n        stillShowZeroSum: true,\n        // cursor: null,\n        left: 0,\n        top: 0,\n        right: 0,\n        bottom: 0,\n        width: null,\n        height: null,\n        label: {\n          // color: 'inherit',\n          // If rotate around circle\n          rotate: 0,\n          show: true,\n          overflow: 'truncate',\n          // 'outer', 'inside', 'center'\n          position: 'outer',\n          // 'none', 'labelLine', 'edge'. Works only when position is 'outer'\n          alignTo: 'none',\n          // Closest distance between label and chart edge.\n          // Works only position is 'outer' and alignTo is 'edge'.\n          edgeDistance: '25%',\n          // Works only position is 'outer' and alignTo is not 'edge'.\n          bleedMargin: 10,\n          // Distance between text and label line.\n          distanceToLabelLine: 5\n          // formatter: 标签文本格式器，同 tooltip.formatter，不支持异步回调\n          // 默认使用全局文本样式，详见 textStyle\n          // distance: 当position为inner时有效，为label位置到圆心的距离与圆半径(环状图为内外半径和)的比例系数\n        },\n        // Enabled when label.normal.position is 'outer'\n        labelLine: {\n          show: true,\n          // 引导线两段中的第一段长度\n          length: 15,\n          // 引导线两段中的第二段长度\n          length2: 15,\n          smooth: false,\n          minTurnAngle: 90,\n          maxSurfaceAngle: 90,\n          lineStyle: {\n            // color: 各异,\n            width: 1,\n            type: 'solid'\n          }\n        },\n        itemStyle: {\n          borderWidth: 1,\n          borderJoin: 'round'\n        },\n        showEmptyCircle: true,\n        emptyCircleStyle: {\n          color: 'lightgray',\n          opacity: 1\n        },\n        labelLayout: {\n          // Hide the overlapped label.\n          hideOverlap: true\n        },\n        emphasis: {\n          scale: true,\n          scaleSize: 5\n        },\n        // If use strategy to avoid label overlapping\n        avoidLabelOverlap: true,\n        // Animation type. Valid values: expansion, scale\n        animationType: 'expansion',\n        animationDuration: 1000,\n        // Animation type when update. Valid values: transition, expansion\n        animationTypeUpdate: 'transition',\n        animationEasingUpdate: 'cubicInOut',\n        animationDurationUpdate: 500,\n        animationEasing: 'cubicInOut'\n      };\n      return PieSeriesModel;\n    }(SeriesModel);\n\n    function negativeDataFilter(seriesType) {\n      return {\n        seriesType: seriesType,\n        reset: function (seriesModel, ecModel) {\n          var data = seriesModel.getData();\n          data.filterSelf(function (idx) {\n            // handle negative value condition\n            var valueDim = data.mapDimension('value');\n            var curValue = data.get(valueDim, idx);\n            if (isNumber(curValue) && !isNaN(curValue) && curValue < 0) {\n              return false;\n            }\n            return true;\n          });\n        }\n      };\n    }\n\n    function install$4(registers) {\n      registers.registerChartView(PieView);\n      registers.registerSeriesModel(PieSeriesModel);\n      createLegacyDataSelectAction('pie', registers.registerAction);\n      registers.registerLayout(curry(pieLayout, 'pie'));\n      registers.registerProcessor(dataFilter('pie'));\n      registers.registerProcessor(negativeDataFilter('pie'));\n    }\n\n    var ScatterSeriesModel = /** @class */function (_super) {\n      __extends(ScatterSeriesModel, _super);\n      function ScatterSeriesModel() {\n        var _this = _super !== null && _super.apply(this, arguments) || this;\n        _this.type = ScatterSeriesModel.type;\n        _this.hasSymbolVisual = true;\n        return _this;\n      }\n      ScatterSeriesModel.prototype.getInitialData = function (option, ecModel) {\n        return createSeriesData(null, this, {\n          useEncodeDefaulter: true\n        });\n      };\n      ScatterSeriesModel.prototype.getProgressive = function () {\n        var progressive = this.option.progressive;\n        if (progressive == null) {\n          // PENDING\n          return this.option.large ? 5e3 : this.get('progressive');\n        }\n        return progressive;\n      };\n      ScatterSeriesModel.prototype.getProgressiveThreshold = function () {\n        var progressiveThreshold = this.option.progressiveThreshold;\n        if (progressiveThreshold == null) {\n          // PENDING\n          return this.option.large ? 1e4 : this.get('progressiveThreshold');\n        }\n        return progressiveThreshold;\n      };\n      ScatterSeriesModel.prototype.brushSelector = function (dataIndex, data, selectors) {\n        return selectors.point(data.getItemLayout(dataIndex));\n      };\n      ScatterSeriesModel.prototype.getZLevelKey = function () {\n        // Each progressive series has individual key.\n        return this.getData().count() > this.getProgressiveThreshold() ? this.id : '';\n      };\n      ScatterSeriesModel.type = 'series.scatter';\n      ScatterSeriesModel.dependencies = ['grid', 'polar', 'geo', 'singleAxis', 'calendar'];\n      ScatterSeriesModel.defaultOption = {\n        coordinateSystem: 'cartesian2d',\n        // zlevel: 0,\n        z: 2,\n        legendHoverLink: true,\n        symbolSize: 10,\n        // symbolRotate: null,  // 图形旋转控制\n        large: false,\n        // Available when large is true\n        largeThreshold: 2000,\n        // cursor: null,\n        itemStyle: {\n          opacity: 0.8\n          // color: 各异\n        },\n        emphasis: {\n          scale: true\n        },\n        // If clip the overflow graphics\n        // Works on cartesian / polar series\n        clip: true,\n        select: {\n          itemStyle: {\n            borderColor: '#212121'\n          }\n        },\n        universalTransition: {\n          divideShape: 'clone'\n        }\n        // progressive: null\n      };\n      return ScatterSeriesModel;\n    }(SeriesModel);\n\n    var BOOST_SIZE_THRESHOLD = 4;\n    var LargeSymbolPathShape = /** @class */function () {\n      function LargeSymbolPathShape() {}\n      return LargeSymbolPathShape;\n    }();\n    var LargeSymbolPath = /** @class */function (_super) {\n      __extends(LargeSymbolPath, _super);\n      function LargeSymbolPath(opts) {\n        var _this = _super.call(this, opts) || this;\n        _this._off = 0;\n        _this.hoverDataIdx = -1;\n        return _this;\n      }\n      LargeSymbolPath.prototype.getDefaultShape = function () {\n        return new LargeSymbolPathShape();\n      };\n      LargeSymbolPath.prototype.reset = function () {\n        this.notClear = false;\n        this._off = 0;\n      };\n      LargeSymbolPath.prototype.buildPath = function (path, shape) {\n        var points = shape.points;\n        var size = shape.size;\n        var symbolProxy = this.symbolProxy;\n        var symbolProxyShape = symbolProxy.shape;\n        var ctx = path.getContext ? path.getContext() : path;\n        var canBoost = ctx && size[0] < BOOST_SIZE_THRESHOLD;\n        var softClipShape = this.softClipShape;\n        var i;\n        // Do draw in afterBrush.\n        if (canBoost) {\n          this._ctx = ctx;\n          return;\n        }\n        this._ctx = null;\n        for (i = this._off; i < points.length;) {\n          var x = points[i++];\n          var y = points[i++];\n          if (isNaN(x) || isNaN(y)) {\n            continue;\n          }\n          if (softClipShape && !softClipShape.contain(x, y)) {\n            continue;\n          }\n          symbolProxyShape.x = x - size[0] / 2;\n          symbolProxyShape.y = y - size[1] / 2;\n          symbolProxyShape.width = size[0];\n          symbolProxyShape.height = size[1];\n          symbolProxy.buildPath(path, symbolProxyShape, true);\n        }\n        if (this.incremental) {\n          this._off = i;\n          this.notClear = true;\n        }\n      };\n      LargeSymbolPath.prototype.afterBrush = function () {\n        var shape = this.shape;\n        var points = shape.points;\n        var size = shape.size;\n        var ctx = this._ctx;\n        var softClipShape = this.softClipShape;\n        var i;\n        if (!ctx) {\n          return;\n        }\n        // PENDING If style or other canvas status changed?\n        for (i = this._off; i < points.length;) {\n          var x = points[i++];\n          var y = points[i++];\n          if (isNaN(x) || isNaN(y)) {\n            continue;\n          }\n          if (softClipShape && !softClipShape.contain(x, y)) {\n            continue;\n          }\n          // fillRect is faster than building a rect path and draw.\n          // And it support light globalCompositeOperation.\n          ctx.fillRect(x - size[0] / 2, y - size[1] / 2, size[0], size[1]);\n        }\n        if (this.incremental) {\n          this._off = i;\n          this.notClear = true;\n        }\n      };\n      LargeSymbolPath.prototype.findDataIndex = function (x, y) {\n        // TODO ???\n        // Consider transform\n        var shape = this.shape;\n        var points = shape.points;\n        var size = shape.size;\n        var w = Math.max(size[0], 4);\n        var h = Math.max(size[1], 4);\n        // Not consider transform\n        // Treat each element as a rect\n        // top down traverse\n        for (var idx = points.length / 2 - 1; idx >= 0; idx--) {\n          var i = idx * 2;\n          var x0 = points[i] - w / 2;\n          var y0 = points[i + 1] - h / 2;\n          if (x >= x0 && y >= y0 && x <= x0 + w && y <= y0 + h) {\n            return idx;\n          }\n        }\n        return -1;\n      };\n      LargeSymbolPath.prototype.contain = function (x, y) {\n        var localPos = this.transformCoordToLocal(x, y);\n        var rect = this.getBoundingRect();\n        x = localPos[0];\n        y = localPos[1];\n        if (rect.contain(x, y)) {\n          // Cache found data index.\n          var dataIdx = this.hoverDataIdx = this.findDataIndex(x, y);\n          return dataIdx >= 0;\n        }\n        this.hoverDataIdx = -1;\n        return false;\n      };\n      LargeSymbolPath.prototype.getBoundingRect = function () {\n        // Ignore stroke for large symbol draw.\n        var rect = this._rect;\n        if (!rect) {\n          var shape = this.shape;\n          var points = shape.points;\n          var size = shape.size;\n          var w = size[0];\n          var h = size[1];\n          var minX = Infinity;\n          var minY = Infinity;\n          var maxX = -Infinity;\n          var maxY = -Infinity;\n          for (var i = 0; i < points.length;) {\n            var x = points[i++];\n            var y = points[i++];\n            minX = Math.min(x, minX);\n            maxX = Math.max(x, maxX);\n            minY = Math.min(y, minY);\n            maxY = Math.max(y, maxY);\n          }\n          rect = this._rect = new BoundingRect(minX - w / 2, minY - h / 2, maxX - minX + w, maxY - minY + h);\n        }\n        return rect;\n      };\n      return LargeSymbolPath;\n    }(Path);\n    var LargeSymbolDraw = /** @class */function () {\n      function LargeSymbolDraw() {\n        this.group = new Group();\n      }\n      /**\r\n       * Update symbols draw by new data\r\n       */\n      LargeSymbolDraw.prototype.updateData = function (data, opt) {\n        this._clear();\n        var symbolEl = this._create();\n        symbolEl.setShape({\n          points: data.getLayout('points')\n        });\n        this._setCommon(symbolEl, data, opt);\n      };\n      LargeSymbolDraw.prototype.updateLayout = function (data) {\n        var points = data.getLayout('points');\n        this.group.eachChild(function (child) {\n          if (child.startIndex != null) {\n            var len = (child.endIndex - child.startIndex) * 2;\n            var byteOffset = child.startIndex * 4 * 2;\n            points = new Float32Array(points.buffer, byteOffset, len);\n          }\n          child.setShape('points', points);\n          // Reset draw cursor.\n          child.reset();\n        });\n      };\n      LargeSymbolDraw.prototype.incrementalPrepareUpdate = function (data) {\n        this._clear();\n      };\n      LargeSymbolDraw.prototype.incrementalUpdate = function (taskParams, data, opt) {\n        var lastAdded = this._newAdded[0];\n        var points = data.getLayout('points');\n        var oldPoints = lastAdded && lastAdded.shape.points;\n        // Merging the exists. Each element has 1e4 points.\n        // Consider the performance balance between too much elements and too much points in one shape(may affect hover optimization)\n        if (oldPoints && oldPoints.length < 2e4) {\n          var oldLen = oldPoints.length;\n          var newPoints = new Float32Array(oldLen + points.length);\n          // Concat two array\n          newPoints.set(oldPoints);\n          newPoints.set(points, oldLen);\n          // Update endIndex\n          lastAdded.endIndex = taskParams.end;\n          lastAdded.setShape({\n            points: newPoints\n          });\n        } else {\n          // Clear\n          this._newAdded = [];\n          var symbolEl = this._create();\n          symbolEl.startIndex = taskParams.start;\n          symbolEl.endIndex = taskParams.end;\n          symbolEl.incremental = true;\n          symbolEl.setShape({\n            points: points\n          });\n          this._setCommon(symbolEl, data, opt);\n        }\n      };\n      LargeSymbolDraw.prototype.eachRendered = function (cb) {\n        this._newAdded[0] && cb(this._newAdded[0]);\n      };\n      LargeSymbolDraw.prototype._create = function () {\n        var symbolEl = new LargeSymbolPath({\n          cursor: 'default'\n        });\n        symbolEl.ignoreCoarsePointer = true;\n        this.group.add(symbolEl);\n        this._newAdded.push(symbolEl);\n        return symbolEl;\n      };\n      LargeSymbolDraw.prototype._setCommon = function (symbolEl, data, opt) {\n        var hostModel = data.hostModel;\n        opt = opt || {};\n        var size = data.getVisual('symbolSize');\n        symbolEl.setShape('size', size instanceof Array ? size : [size, size]);\n        symbolEl.softClipShape = opt.clipShape || null;\n        // Create symbolProxy to build path for each data\n        symbolEl.symbolProxy = createSymbol(data.getVisual('symbol'), 0, 0, 0, 0);\n        // Use symbolProxy setColor method\n        symbolEl.setColor = symbolEl.symbolProxy.setColor;\n        var extrudeShadow = symbolEl.shape.size[0] < BOOST_SIZE_THRESHOLD;\n        symbolEl.useStyle(\n        // Draw shadow when doing fillRect is extremely slow.\n        hostModel.getModel('itemStyle').getItemStyle(extrudeShadow ? ['color', 'shadowBlur', 'shadowColor'] : ['color']));\n        var globalStyle = data.getVisual('style');\n        var visualColor = globalStyle && globalStyle.fill;\n        if (visualColor) {\n          symbolEl.setColor(visualColor);\n        }\n        var ecData = getECData(symbolEl);\n        // Enable tooltip\n        // PENDING May have performance issue when path is extremely large\n        ecData.seriesIndex = hostModel.seriesIndex;\n        symbolEl.on('mousemove', function (e) {\n          ecData.dataIndex = null;\n          var dataIndex = symbolEl.hoverDataIdx;\n          if (dataIndex >= 0) {\n            // Provide dataIndex for tooltip\n            ecData.dataIndex = dataIndex + (symbolEl.startIndex || 0);\n          }\n        });\n      };\n      LargeSymbolDraw.prototype.remove = function () {\n        this._clear();\n      };\n      LargeSymbolDraw.prototype._clear = function () {\n        this._newAdded = [];\n        this.group.removeAll();\n      };\n      return LargeSymbolDraw;\n    }();\n\n    var ScatterView = /** @class */function (_super) {\n      __extends(ScatterView, _super);\n      function ScatterView() {\n        var _this = _super !== null && _super.apply(this, arguments) || this;\n        _this.type = ScatterView.type;\n        return _this;\n      }\n      ScatterView.prototype.render = function (seriesModel, ecModel, api) {\n        var data = seriesModel.getData();\n        var symbolDraw = this._updateSymbolDraw(data, seriesModel);\n        symbolDraw.updateData(data, {\n          // TODO\n          // If this parameter should be a shape or a bounding volume\n          // shape will be more general.\n          // But bounding volume like bounding rect will be much faster in the contain calculation\n          clipShape: this._getClipShape(seriesModel)\n        });\n        this._finished = true;\n      };\n      ScatterView.prototype.incrementalPrepareRender = function (seriesModel, ecModel, api) {\n        var data = seriesModel.getData();\n        var symbolDraw = this._updateSymbolDraw(data, seriesModel);\n        symbolDraw.incrementalPrepareUpdate(data);\n        this._finished = false;\n      };\n      ScatterView.prototype.incrementalRender = function (taskParams, seriesModel, ecModel) {\n        this._symbolDraw.incrementalUpdate(taskParams, seriesModel.getData(), {\n          clipShape: this._getClipShape(seriesModel)\n        });\n        this._finished = taskParams.end === seriesModel.getData().count();\n      };\n      ScatterView.prototype.updateTransform = function (seriesModel, ecModel, api) {\n        var data = seriesModel.getData();\n        // Must mark group dirty and make sure the incremental layer will be cleared\n        // PENDING\n        this.group.dirty();\n        if (!this._finished || data.count() > 1e4) {\n          return {\n            update: true\n          };\n        } else {\n          var res = pointsLayout('').reset(seriesModel, ecModel, api);\n          if (res.progress) {\n            res.progress({\n              start: 0,\n              end: data.count(),\n              count: data.count()\n            }, data);\n          }\n          this._symbolDraw.updateLayout(data);\n        }\n      };\n      ScatterView.prototype.eachRendered = function (cb) {\n        this._symbolDraw && this._symbolDraw.eachRendered(cb);\n      };\n      ScatterView.prototype._getClipShape = function (seriesModel) {\n        if (!seriesModel.get('clip', true)) {\n          return;\n        }\n        var coordSys = seriesModel.coordinateSystem;\n        // PENDING make `0.1` configurable, for example, `clipTolerance`?\n        return coordSys && coordSys.getArea && coordSys.getArea(.1);\n      };\n      ScatterView.prototype._updateSymbolDraw = function (data, seriesModel) {\n        var symbolDraw = this._symbolDraw;\n        var pipelineContext = seriesModel.pipelineContext;\n        var isLargeDraw = pipelineContext.large;\n        if (!symbolDraw || isLargeDraw !== this._isLargeDraw) {\n          symbolDraw && symbolDraw.remove();\n          symbolDraw = this._symbolDraw = isLargeDraw ? new LargeSymbolDraw() : new SymbolDraw();\n          this._isLargeDraw = isLargeDraw;\n          this.group.removeAll();\n        }\n        this.group.add(symbolDraw.group);\n        return symbolDraw;\n      };\n      ScatterView.prototype.remove = function (ecModel, api) {\n        this._symbolDraw && this._symbolDraw.remove(true);\n        this._symbolDraw = null;\n      };\n      ScatterView.prototype.dispose = function () {};\n      ScatterView.type = 'scatter';\n      return ScatterView;\n    }(ChartView);\n\n    var GridModel = /** @class */function (_super) {\n      __extends(GridModel, _super);\n      function GridModel() {\n        return _super !== null && _super.apply(this, arguments) || this;\n      }\n      GridModel.type = 'grid';\n      GridModel.dependencies = ['xAxis', 'yAxis'];\n      GridModel.layoutMode = 'box';\n      GridModel.defaultOption = {\n        show: false,\n        // zlevel: 0,\n        z: 0,\n        left: '10%',\n        top: 60,\n        right: '10%',\n        bottom: 70,\n        // If grid size contain label\n        containLabel: false,\n        // width: {totalWidth} - left - right,\n        // height: {totalHeight} - top - bottom,\n        backgroundColor: 'rgba(0,0,0,0)',\n        borderWidth: 1,\n        borderColor: '#ccc'\n      };\n      return GridModel;\n    }(ComponentModel);\n\n    var CartesianAxisModel = /** @class */function (_super) {\n      __extends(CartesianAxisModel, _super);\n      function CartesianAxisModel() {\n        return _super !== null && _super.apply(this, arguments) || this;\n      }\n      CartesianAxisModel.prototype.getCoordSysModel = function () {\n        return this.getReferringComponents('grid', SINGLE_REFERRING).models[0];\n      };\n      CartesianAxisModel.type = 'cartesian2dAxis';\n      return CartesianAxisModel;\n    }(ComponentModel);\n    mixin(CartesianAxisModel, AxisModelCommonMixin);\n\n    var defaultOption = {\n      show: true,\n      // zlevel: 0,\n      z: 0,\n      // Inverse the axis.\n      inverse: false,\n      // Axis name displayed.\n      name: '',\n      // 'start' | 'middle' | 'end'\n      nameLocation: 'end',\n      // By degree. By default auto rotate by nameLocation.\n      nameRotate: null,\n      nameTruncate: {\n        maxWidth: null,\n        ellipsis: '...',\n        placeholder: '.'\n      },\n      // Use global text style by default.\n      nameTextStyle: {},\n      // The gap between axisName and axisLine.\n      nameGap: 15,\n      // Default `false` to support tooltip.\n      silent: false,\n      // Default `false` to avoid legacy user event listener fail.\n      triggerEvent: false,\n      tooltip: {\n        show: false\n      },\n      axisPointer: {},\n      axisLine: {\n        show: true,\n        onZero: true,\n        onZeroAxisIndex: null,\n        lineStyle: {\n          color: '#6E7079',\n          width: 1,\n          type: 'solid'\n        },\n        // The arrow at both ends the the axis.\n        symbol: ['none', 'none'],\n        symbolSize: [10, 15]\n      },\n      axisTick: {\n        show: true,\n        // Whether axisTick is inside the grid or outside the grid.\n        inside: false,\n        // The length of axisTick.\n        length: 5,\n        lineStyle: {\n          width: 1\n        }\n      },\n      axisLabel: {\n        show: true,\n        // Whether axisLabel is inside the grid or outside the grid.\n        inside: false,\n        rotate: 0,\n        // true | false | null/undefined (auto)\n        showMinLabel: null,\n        // true | false | null/undefined (auto)\n        showMaxLabel: null,\n        margin: 8,\n        // formatter: null,\n        fontSize: 12\n      },\n      splitLine: {\n        show: true,\n        showMinLine: true,\n        showMaxLine: true,\n        lineStyle: {\n          color: ['#E0E6F1'],\n          width: 1,\n          type: 'solid'\n        }\n      },\n      splitArea: {\n        show: false,\n        areaStyle: {\n          color: ['rgba(250,250,250,0.2)', 'rgba(210,219,238,0.2)']\n        }\n      }\n    };\n    var categoryAxis = merge({\n      // The gap at both ends of the axis. For categoryAxis, boolean.\n      boundaryGap: true,\n      // Set false to faster category collection.\n      deduplication: null,\n      // splitArea: {\n      // show: false\n      // },\n      splitLine: {\n        show: false\n      },\n      axisTick: {\n        // If tick is align with label when boundaryGap is true\n        alignWithLabel: false,\n        interval: 'auto'\n      },\n      axisLabel: {\n        interval: 'auto'\n      }\n    }, defaultOption);\n    var valueAxis = merge({\n      boundaryGap: [0, 0],\n      axisLine: {\n        // Not shown when other axis is categoryAxis in cartesian\n        show: 'auto'\n      },\n      axisTick: {\n        // Not shown when other axis is categoryAxis in cartesian\n        show: 'auto'\n      },\n      // TODO\n      // min/max: [30, datamin, 60] or [20, datamin] or [datamin, 60]\n      splitNumber: 5,\n      minorTick: {\n        // Minor tick, not available for cateogry axis.\n        show: false,\n        // Split number of minor ticks. The value should be in range of (0, 100)\n        splitNumber: 5,\n        // Length of minor tick\n        length: 3,\n        // Line style\n        lineStyle: {\n          // Default to be same with axisTick\n        }\n      },\n      minorSplitLine: {\n        show: false,\n        lineStyle: {\n          color: '#F4F7FD',\n          width: 1\n        }\n      }\n    }, defaultOption);\n    var timeAxis = merge({\n      splitNumber: 6,\n      axisLabel: {\n        // To eliminate labels that are not nice\n        showMinLabel: false,\n        showMaxLabel: false,\n        rich: {\n          primary: {\n            fontWeight: 'bold'\n          }\n        }\n      },\n      splitLine: {\n        show: false\n      }\n    }, valueAxis);\n    var logAxis = defaults({\n      logBase: 10\n    }, valueAxis);\n    var axisDefault = {\n      category: categoryAxis,\n      value: valueAxis,\n      time: timeAxis,\n      log: logAxis\n    };\n\n    /*\n    * Licensed to the Apache Software Foundation (ASF) under one\n    * or more contributor license agreements.  See the NOTICE file\n    * distributed with this work for additional information\n    * regarding copyright ownership.  The ASF licenses this file\n    * to you under the Apache License, Version 2.0 (the\n    * \"License\"); you may not use this file except in compliance\n    * with the License.  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,\n    * software distributed under the License is distributed on an\n    * \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\n    * KIND, either express or implied.  See the License for the\n    * specific language governing permissions and limitations\n    * under the License.\n    */\n\n\n    /**\n     * AUTO-GENERATED FILE. DO NOT MODIFY.\n     */\n\n    /*\r\n    * Licensed to the Apache Software Foundation (ASF) under one\r\n    * or more contributor license agreements.  See the NOTICE file\r\n    * distributed with this work for additional information\r\n    * regarding copyright ownership.  The ASF licenses this file\r\n    * to you under the Apache License, Version 2.0 (the\r\n    * \"License\"); you may not use this file except in compliance\r\n    * with the License.  You may obtain a copy of the License at\r\n    *\r\n    *   http://www.apache.org/licenses/LICENSE-2.0\r\n    *\r\n    * Unless required by applicable law or agreed to in writing,\r\n    * software distributed under the License is distributed on an\r\n    * \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\r\n    * KIND, either express or implied.  See the License for the\r\n    * specific language governing permissions and limitations\r\n    * under the License.\r\n    */\n    var AXIS_TYPES = {\n      value: 1,\n      category: 1,\n      time: 1,\n      log: 1\n    };\n\n    /**\r\n     * Generate sub axis model class\r\n     * @param axisName 'x' 'y' 'radius' 'angle' 'parallel' ...\r\n     */\n    function axisModelCreator(registers, axisName, BaseAxisModelClass, extraDefaultOption) {\n      each(AXIS_TYPES, function (v, axisType) {\n        var defaultOption = merge(merge({}, axisDefault[axisType], true), extraDefaultOption, true);\n        var AxisModel = /** @class */function (_super) {\n          __extends(AxisModel, _super);\n          function AxisModel() {\n            var _this = _super !== null && _super.apply(this, arguments) || this;\n            _this.type = axisName + 'Axis.' + axisType;\n            return _this;\n          }\n          AxisModel.prototype.mergeDefaultAndTheme = function (option, ecModel) {\n            var layoutMode = fetchLayoutMode(this);\n            var inputPositionParams = layoutMode ? getLayoutParams(option) : {};\n            var themeModel = ecModel.getTheme();\n            merge(option, themeModel.get(axisType + 'Axis'));\n            merge(option, this.getDefaultOption());\n            option.type = getAxisType(option);\n            if (layoutMode) {\n              mergeLayoutParam(option, inputPositionParams, layoutMode);\n            }\n          };\n          AxisModel.prototype.optionUpdated = function () {\n            var thisOption = this.option;\n            if (thisOption.type === 'category') {\n              this.__ordinalMeta = OrdinalMeta.createByAxisModel(this);\n            }\n          };\n          /**\r\n           * Should not be called before all of 'getInitailData' finished.\r\n           * Because categories are collected during initializing data.\r\n           */\n          AxisModel.prototype.getCategories = function (rawData) {\n            var option = this.option;\n            // FIXME\n            // warning if called before all of 'getInitailData' finished.\n            if (option.type === 'category') {\n              if (rawData) {\n                return option.data;\n              }\n              return this.__ordinalMeta.categories;\n            }\n          };\n          AxisModel.prototype.getOrdinalMeta = function () {\n            return this.__ordinalMeta;\n          };\n          AxisModel.type = axisName + 'Axis.' + axisType;\n          AxisModel.defaultOption = defaultOption;\n          return AxisModel;\n        }(BaseAxisModelClass);\n        registers.registerComponentModel(AxisModel);\n      });\n      registers.registerSubTypeDefaulter(axisName + 'Axis', getAxisType);\n    }\n    function getAxisType(option) {\n      // Default axis with data is category axis\n      return option.type || (option.data ? 'category' : 'value');\n    }\n\n    var Cartesian = /** @class */function () {\n      function Cartesian(name) {\n        this.type = 'cartesian';\n        this._dimList = [];\n        this._axes = {};\n        this.name = name || '';\n      }\n      Cartesian.prototype.getAxis = function (dim) {\n        return this._axes[dim];\n      };\n      Cartesian.prototype.getAxes = function () {\n        return map(this._dimList, function (dim) {\n          return this._axes[dim];\n        }, this);\n      };\n      Cartesian.prototype.getAxesByScale = function (scaleType) {\n        scaleType = scaleType.toLowerCase();\n        return filter(this.getAxes(), function (axis) {\n          return axis.scale.type === scaleType;\n        });\n      };\n      Cartesian.prototype.addAxis = function (axis) {\n        var dim = axis.dim;\n        this._axes[dim] = axis;\n        this._dimList.push(dim);\n      };\n      return Cartesian;\n    }();\n\n    var cartesian2DDimensions = ['x', 'y'];\n    function canCalculateAffineTransform(scale) {\n      return scale.type === 'interval' || scale.type === 'time';\n    }\n    var Cartesian2D = /** @class */function (_super) {\n      __extends(Cartesian2D, _super);\n      function Cartesian2D() {\n        var _this = _super !== null && _super.apply(this, arguments) || this;\n        _this.type = 'cartesian2d';\n        _this.dimensions = cartesian2DDimensions;\n        return _this;\n      }\n      /**\r\n       * Calculate an affine transform matrix if two axes are time or value.\r\n       * It's mainly for accelartion on the large time series data.\r\n       */\n      Cartesian2D.prototype.calcAffineTransform = function () {\n        this._transform = this._invTransform = null;\n        var xAxisScale = this.getAxis('x').scale;\n        var yAxisScale = this.getAxis('y').scale;\n        if (!canCalculateAffineTransform(xAxisScale) || !canCalculateAffineTransform(yAxisScale)) {\n          return;\n        }\n        var xScaleExtent = xAxisScale.getExtent();\n        var yScaleExtent = yAxisScale.getExtent();\n        var start = this.dataToPoint([xScaleExtent[0], yScaleExtent[0]]);\n        var end = this.dataToPoint([xScaleExtent[1], yScaleExtent[1]]);\n        var xScaleSpan = xScaleExtent[1] - xScaleExtent[0];\n        var yScaleSpan = yScaleExtent[1] - yScaleExtent[0];\n        if (!xScaleSpan || !yScaleSpan) {\n          return;\n        }\n        // Accelerate data to point calculation on the special large time series data.\n        var scaleX = (end[0] - start[0]) / xScaleSpan;\n        var scaleY = (end[1] - start[1]) / yScaleSpan;\n        var translateX = start[0] - xScaleExtent[0] * scaleX;\n        var translateY = start[1] - yScaleExtent[0] * scaleY;\n        var m = this._transform = [scaleX, 0, 0, scaleY, translateX, translateY];\n        this._invTransform = invert([], m);\n      };\n      /**\r\n       * Base axis will be used on stacking.\r\n       */\n      Cartesian2D.prototype.getBaseAxis = function () {\n        return this.getAxesByScale('ordinal')[0] || this.getAxesByScale('time')[0] || this.getAxis('x');\n      };\n      Cartesian2D.prototype.containPoint = function (point) {\n        var axisX = this.getAxis('x');\n        var axisY = this.getAxis('y');\n        return axisX.contain(axisX.toLocalCoord(point[0])) && axisY.contain(axisY.toLocalCoord(point[1]));\n      };\n      Cartesian2D.prototype.containData = function (data) {\n        return this.getAxis('x').containData(data[0]) && this.getAxis('y').containData(data[1]);\n      };\n      Cartesian2D.prototype.containZone = function (data1, data2) {\n        var zoneDiag1 = this.dataToPoint(data1);\n        var zoneDiag2 = this.dataToPoint(data2);\n        var area = this.getArea();\n        var zone = new BoundingRect(zoneDiag1[0], zoneDiag1[1], zoneDiag2[0] - zoneDiag1[0], zoneDiag2[1] - zoneDiag1[1]);\n        return area.intersect(zone);\n      };\n      Cartesian2D.prototype.dataToPoint = function (data, clamp, out) {\n        out = out || [];\n        var xVal = data[0];\n        var yVal = data[1];\n        // Fast path\n        if (this._transform\n        // It's supported that if data is like `[Inifity, 123]`, where only Y pixel calculated.\n        && xVal != null && isFinite(xVal) && yVal != null && isFinite(yVal)) {\n          return applyTransform(out, data, this._transform);\n        }\n        var xAxis = this.getAxis('x');\n        var yAxis = this.getAxis('y');\n        out[0] = xAxis.toGlobalCoord(xAxis.dataToCoord(xVal, clamp));\n        out[1] = yAxis.toGlobalCoord(yAxis.dataToCoord(yVal, clamp));\n        return out;\n      };\n      Cartesian2D.prototype.clampData = function (data, out) {\n        var xScale = this.getAxis('x').scale;\n        var yScale = this.getAxis('y').scale;\n        var xAxisExtent = xScale.getExtent();\n        var yAxisExtent = yScale.getExtent();\n        var x = xScale.parse(data[0]);\n        var y = yScale.parse(data[1]);\n        out = out || [];\n        out[0] = Math.min(Math.max(Math.min(xAxisExtent[0], xAxisExtent[1]), x), Math.max(xAxisExtent[0], xAxisExtent[1]));\n        out[1] = Math.min(Math.max(Math.min(yAxisExtent[0], yAxisExtent[1]), y), Math.max(yAxisExtent[0], yAxisExtent[1]));\n        return out;\n      };\n      Cartesian2D.prototype.pointToData = function (point, clamp) {\n        var out = [];\n        if (this._invTransform) {\n          return applyTransform(out, point, this._invTransform);\n        }\n        var xAxis = this.getAxis('x');\n        var yAxis = this.getAxis('y');\n        out[0] = xAxis.coordToData(xAxis.toLocalCoord(point[0]), clamp);\n        out[1] = yAxis.coordToData(yAxis.toLocalCoord(point[1]), clamp);\n        return out;\n      };\n      Cartesian2D.prototype.getOtherAxis = function (axis) {\n        return this.getAxis(axis.dim === 'x' ? 'y' : 'x');\n      };\n      /**\r\n       * Get rect area of cartesian.\r\n       * Area will have a contain function to determine if a point is in the coordinate system.\r\n       */\n      Cartesian2D.prototype.getArea = function (tolerance) {\n        tolerance = tolerance || 0;\n        var xExtent = this.getAxis('x').getGlobalExtent();\n        var yExtent = this.getAxis('y').getGlobalExtent();\n        var x = Math.min(xExtent[0], xExtent[1]) - tolerance;\n        var y = Math.min(yExtent[0], yExtent[1]) - tolerance;\n        var width = Math.max(xExtent[0], xExtent[1]) - x + tolerance;\n        var height = Math.max(yExtent[0], yExtent[1]) - y + tolerance;\n        return new BoundingRect(x, y, width, height);\n      };\n      return Cartesian2D;\n    }(Cartesian);\n\n    var Axis2D = /** @class */function (_super) {\n      __extends(Axis2D, _super);\n      function Axis2D(dim, scale, coordExtent, axisType, position) {\n        var _this = _super.call(this, dim, scale, coordExtent) || this;\n        /**\r\n         * Index of axis, can be used as key\r\n         * Injected outside.\r\n         */\n        _this.index = 0;\n        _this.type = axisType || 'value';\n        _this.position = position || 'bottom';\n        return _this;\n      }\n      Axis2D.prototype.isHorizontal = function () {\n        var position = this.position;\n        return position === 'top' || position === 'bottom';\n      };\n      /**\r\n       * Each item cooresponds to this.getExtent(), which\r\n       * means globalExtent[0] may greater than globalExtent[1],\r\n       * unless `asc` is input.\r\n       *\r\n       * @param {boolean} [asc]\r\n       * @return {Array.<number>}\r\n       */\n      Axis2D.prototype.getGlobalExtent = function (asc) {\n        var ret = this.getExtent();\n        ret[0] = this.toGlobalCoord(ret[0]);\n        ret[1] = this.toGlobalCoord(ret[1]);\n        asc && ret[0] > ret[1] && ret.reverse();\n        return ret;\n      };\n      Axis2D.prototype.pointToData = function (point, clamp) {\n        return this.coordToData(this.toLocalCoord(point[this.dim === 'x' ? 0 : 1]), clamp);\n      };\n      /**\r\n       * Set ordinalSortInfo\r\n       * @param info new OrdinalSortInfo\r\n       */\n      Axis2D.prototype.setCategorySortInfo = function (info) {\n        if (this.type !== 'category') {\n          return false;\n        }\n        this.model.option.categorySortInfo = info;\n        this.scale.setSortInfo(info);\n      };\n      return Axis2D;\n    }(Axis);\n\n    /**\r\n     * Can only be called after coordinate system creation stage.\r\n     * (Can be called before coordinate system update stage).\r\n     */\n    function layout$1(gridModel, axisModel, opt) {\n      opt = opt || {};\n      var grid = gridModel.coordinateSystem;\n      var axis = axisModel.axis;\n      var layout = {};\n      var otherAxisOnZeroOf = axis.getAxesOnZeroOf()[0];\n      var rawAxisPosition = axis.position;\n      var axisPosition = otherAxisOnZeroOf ? 'onZero' : rawAxisPosition;\n      var axisDim = axis.dim;\n      var rect = grid.getRect();\n      var rectBound = [rect.x, rect.x + rect.width, rect.y, rect.y + rect.height];\n      var idx = {\n        left: 0,\n        right: 1,\n        top: 0,\n        bottom: 1,\n        onZero: 2\n      };\n      var axisOffset = axisModel.get('offset') || 0;\n      var posBound = axisDim === 'x' ? [rectBound[2] - axisOffset, rectBound[3] + axisOffset] : [rectBound[0] - axisOffset, rectBound[1] + axisOffset];\n      if (otherAxisOnZeroOf) {\n        var onZeroCoord = otherAxisOnZeroOf.toGlobalCoord(otherAxisOnZeroOf.dataToCoord(0));\n        posBound[idx.onZero] = Math.max(Math.min(onZeroCoord, posBound[1]), posBound[0]);\n      }\n      // Axis position\n      layout.position = [axisDim === 'y' ? posBound[idx[axisPosition]] : rectBound[0], axisDim === 'x' ? posBound[idx[axisPosition]] : rectBound[3]];\n      // Axis rotation\n      layout.rotation = Math.PI / 2 * (axisDim === 'x' ? 0 : 1);\n      // Tick and label direction, x y is axisDim\n      var dirMap = {\n        top: -1,\n        bottom: 1,\n        left: -1,\n        right: 1\n      };\n      layout.labelDirection = layout.tickDirection = layout.nameDirection = dirMap[rawAxisPosition];\n      layout.labelOffset = otherAxisOnZeroOf ? posBound[idx[rawAxisPosition]] - posBound[idx.onZero] : 0;\n      if (axisModel.get(['axisTick', 'inside'])) {\n        layout.tickDirection = -layout.tickDirection;\n      }\n      if (retrieve(opt.labelInside, axisModel.get(['axisLabel', 'inside']))) {\n        layout.labelDirection = -layout.labelDirection;\n      }\n      // Special label rotation\n      var labelRotate = axisModel.get(['axisLabel', 'rotate']);\n      layout.labelRotate = axisPosition === 'top' ? -labelRotate : labelRotate;\n      // Over splitLine and splitArea\n      layout.z2 = 1;\n      return layout;\n    }\n    function isCartesian2DSeries(seriesModel) {\n      return seriesModel.get('coordinateSystem') === 'cartesian2d';\n    }\n    function findAxisModels(seriesModel) {\n      var axisModelMap = {\n        xAxisModel: null,\n        yAxisModel: null\n      };\n      each(axisModelMap, function (v, key) {\n        var axisType = key.replace(/Model$/, '');\n        var axisModel = seriesModel.getReferringComponents(axisType, SINGLE_REFERRING).models[0];\n        if (\"development\" !== 'production') {\n          if (!axisModel) {\n            throw new Error(axisType + ' \"' + retrieve3(seriesModel.get(axisType + 'Index'), seriesModel.get(axisType + 'Id'), 0) + '\" not found');\n          }\n        }\n        axisModelMap[key] = axisModel;\n      });\n      return axisModelMap;\n    }\n\n    var mathLog$1 = Math.log;\n    function alignScaleTicks(scale, axisModel, alignToScale) {\n      var intervalScaleProto = IntervalScale.prototype;\n      // NOTE: There is a precondition for log scale  here:\n      // In log scale we store _interval and _extent of exponent value.\n      // So if we use the method of InternalScale to set/get these data.\n      // It process the exponent value, which is linear and what we want here.\n      var alignToTicks = intervalScaleProto.getTicks.call(alignToScale);\n      var alignToNicedTicks = intervalScaleProto.getTicks.call(alignToScale, true);\n      var alignToSplitNumber = alignToTicks.length - 1;\n      var alignToInterval = intervalScaleProto.getInterval.call(alignToScale);\n      var scaleExtent = getScaleExtent(scale, axisModel);\n      var rawExtent = scaleExtent.extent;\n      var isMinFixed = scaleExtent.fixMin;\n      var isMaxFixed = scaleExtent.fixMax;\n      if (scale.type === 'log') {\n        var logBase = mathLog$1(scale.base);\n        rawExtent = [mathLog$1(rawExtent[0]) / logBase, mathLog$1(rawExtent[1]) / logBase];\n      }\n      scale.setExtent(rawExtent[0], rawExtent[1]);\n      scale.calcNiceExtent({\n        splitNumber: alignToSplitNumber,\n        fixMin: isMinFixed,\n        fixMax: isMaxFixed\n      });\n      var extent = intervalScaleProto.getExtent.call(scale);\n      // Need to update the rawExtent.\n      // Because value in rawExtent may be not parsed. e.g. 'dataMin', 'dataMax'\n      if (isMinFixed) {\n        rawExtent[0] = extent[0];\n      }\n      if (isMaxFixed) {\n        rawExtent[1] = extent[1];\n      }\n      var interval = intervalScaleProto.getInterval.call(scale);\n      var min = rawExtent[0];\n      var max = rawExtent[1];\n      if (isMinFixed && isMaxFixed) {\n        // User set min, max, divide to get new interval\n        interval = (max - min) / alignToSplitNumber;\n      } else if (isMinFixed) {\n        max = rawExtent[0] + interval * alignToSplitNumber;\n        // User set min, expand extent on the other side\n        while (max < rawExtent[1] && isFinite(max) && isFinite(rawExtent[1])) {\n          interval = increaseInterval(interval);\n          max = rawExtent[0] + interval * alignToSplitNumber;\n        }\n      } else if (isMaxFixed) {\n        // User set max, expand extent on the other side\n        min = rawExtent[1] - interval * alignToSplitNumber;\n        while (min > rawExtent[0] && isFinite(min) && isFinite(rawExtent[0])) {\n          interval = increaseInterval(interval);\n          min = rawExtent[1] - interval * alignToSplitNumber;\n        }\n      } else {\n        var nicedSplitNumber = scale.getTicks().length - 1;\n        if (nicedSplitNumber > alignToSplitNumber) {\n          interval = increaseInterval(interval);\n        }\n        var range = interval * alignToSplitNumber;\n        max = Math.ceil(rawExtent[1] / interval) * interval;\n        min = round(max - range);\n        // Not change the result that crossing zero.\n        if (min < 0 && rawExtent[0] >= 0) {\n          min = 0;\n          max = round(range);\n        } else if (max > 0 && rawExtent[1] <= 0) {\n          max = 0;\n          min = -round(range);\n        }\n      }\n      // Adjust min, max based on the extent of alignTo. When min or max is set in alignTo scale\n      var t0 = (alignToTicks[0].value - alignToNicedTicks[0].value) / alignToInterval;\n      var t1 = (alignToTicks[alignToSplitNumber].value - alignToNicedTicks[alignToSplitNumber].value) / alignToInterval;\n      // NOTE: Must in setExtent -> setInterval -> setNiceExtent order.\n      intervalScaleProto.setExtent.call(scale, min + interval * t0, max + interval * t1);\n      intervalScaleProto.setInterval.call(scale, interval);\n      if (t0 || t1) {\n        intervalScaleProto.setNiceExtent.call(scale, min + interval, max - interval);\n      }\n      if (\"development\" !== 'production') {\n        var ticks = intervalScaleProto.getTicks.call(scale);\n        if (ticks[1] && (!isValueNice(interval) || getPrecisionSafe(ticks[1].value) > getPrecisionSafe(interval))) {\n          warn(\n          // eslint-disable-next-line\n          \"The ticks may be not readable when set min: \" + axisModel.get('min') + \", max: \" + axisModel.get('max') + \" and alignTicks: true\");\n        }\n      }\n    }\n\n    var Grid = /** @class */function () {\n      function Grid(gridModel, ecModel, api) {\n        // FIXME:TS where used (different from registered type 'cartesian2d')?\n        this.type = 'grid';\n        this._coordsMap = {};\n        this._coordsList = [];\n        this._axesMap = {};\n        this._axesList = [];\n        this.axisPointerEnabled = true;\n        this.dimensions = cartesian2DDimensions;\n        this._initCartesian(gridModel, ecModel, api);\n        this.model = gridModel;\n      }\n      Grid.prototype.getRect = function () {\n        return this._rect;\n      };\n      Grid.prototype.update = function (ecModel, api) {\n        var axesMap = this._axesMap;\n        this._updateScale(ecModel, this.model);\n        function updateAxisTicks(axes) {\n          var alignTo;\n          // Axis is added in order of axisIndex.\n          var axesIndices = keys(axes);\n          var len = axesIndices.length;\n          if (!len) {\n            return;\n          }\n          var axisNeedsAlign = [];\n          // Process once and calculate the ticks for those don't use alignTicks.\n          for (var i = len - 1; i >= 0; i--) {\n            var idx = +axesIndices[i]; // Convert to number.\n            var axis = axes[idx];\n            var model = axis.model;\n            var scale = axis.scale;\n            if (\n            // Only value and log axis without interval support alignTicks.\n            isIntervalOrLogScale(scale) && model.get('alignTicks') && model.get('interval') == null) {\n              axisNeedsAlign.push(axis);\n            } else {\n              niceScaleExtent(scale, model);\n              if (isIntervalOrLogScale(scale)) {\n                // Can only align to interval or log axis.\n                alignTo = axis;\n              }\n            }\n          }\n          // All axes has set alignTicks. Pick the first one.\n          // PENDING. Should we find the axis that both set interval, min, max and align to this one?\n          if (axisNeedsAlign.length) {\n            if (!alignTo) {\n              alignTo = axisNeedsAlign.pop();\n              niceScaleExtent(alignTo.scale, alignTo.model);\n            }\n            each(axisNeedsAlign, function (axis) {\n              alignScaleTicks(axis.scale, axis.model, alignTo.scale);\n            });\n          }\n        }\n        updateAxisTicks(axesMap.x);\n        updateAxisTicks(axesMap.y);\n        // Key: axisDim_axisIndex, value: boolean, whether onZero target.\n        var onZeroRecords = {};\n        each(axesMap.x, function (xAxis) {\n          fixAxisOnZero(axesMap, 'y', xAxis, onZeroRecords);\n        });\n        each(axesMap.y, function (yAxis) {\n          fixAxisOnZero(axesMap, 'x', yAxis, onZeroRecords);\n        });\n        // Resize again if containLabel is enabled\n        // FIXME It may cause getting wrong grid size in data processing stage\n        this.resize(this.model, api);\n      };\n      /**\r\n       * Resize the grid\r\n       */\n      Grid.prototype.resize = function (gridModel, api, ignoreContainLabel) {\n        var boxLayoutParams = gridModel.getBoxLayoutParams();\n        var isContainLabel = !ignoreContainLabel && gridModel.get('containLabel');\n        var gridRect = getLayoutRect(boxLayoutParams, {\n          width: api.getWidth(),\n          height: api.getHeight()\n        });\n        this._rect = gridRect;\n        var axesList = this._axesList;\n        adjustAxes();\n        // Minus label size\n        if (isContainLabel) {\n          each(axesList, function (axis) {\n            if (!axis.model.get(['axisLabel', 'inside'])) {\n              var labelUnionRect = estimateLabelUnionRect(axis);\n              if (labelUnionRect) {\n                var dim = axis.isHorizontal() ? 'height' : 'width';\n                var margin = axis.model.get(['axisLabel', 'margin']);\n                gridRect[dim] -= labelUnionRect[dim] + margin;\n                if (axis.position === 'top') {\n                  gridRect.y += labelUnionRect.height + margin;\n                } else if (axis.position === 'left') {\n                  gridRect.x += labelUnionRect.width + margin;\n                }\n              }\n            }\n          });\n          adjustAxes();\n        }\n        each(this._coordsList, function (coord) {\n          // Calculate affine matrix to accelerate the data to point transform.\n          // If all the axes scales are time or value.\n          coord.calcAffineTransform();\n        });\n        function adjustAxes() {\n          each(axesList, function (axis) {\n            var isHorizontal = axis.isHorizontal();\n            var extent = isHorizontal ? [0, gridRect.width] : [0, gridRect.height];\n            var idx = axis.inverse ? 1 : 0;\n            axis.setExtent(extent[idx], extent[1 - idx]);\n            updateAxisTransform(axis, isHorizontal ? gridRect.x : gridRect.y);\n          });\n        }\n      };\n      Grid.prototype.getAxis = function (dim, axisIndex) {\n        var axesMapOnDim = this._axesMap[dim];\n        if (axesMapOnDim != null) {\n          return axesMapOnDim[axisIndex || 0];\n        }\n      };\n      Grid.prototype.getAxes = function () {\n        return this._axesList.slice();\n      };\n      Grid.prototype.getCartesian = function (xAxisIndex, yAxisIndex) {\n        if (xAxisIndex != null && yAxisIndex != null) {\n          var key = 'x' + xAxisIndex + 'y' + yAxisIndex;\n          return this._coordsMap[key];\n        }\n        if (isObject(xAxisIndex)) {\n          yAxisIndex = xAxisIndex.yAxisIndex;\n          xAxisIndex = xAxisIndex.xAxisIndex;\n        }\n        for (var i = 0, coordList = this._coordsList; i < coordList.length; i++) {\n          if (coordList[i].getAxis('x').index === xAxisIndex || coordList[i].getAxis('y').index === yAxisIndex) {\n            return coordList[i];\n          }\n        }\n      };\n      Grid.prototype.getCartesians = function () {\n        return this._coordsList.slice();\n      };\n      /**\r\n       * @implements\r\n       */\n      Grid.prototype.convertToPixel = function (ecModel, finder, value) {\n        var target = this._findConvertTarget(finder);\n        return target.cartesian ? target.cartesian.dataToPoint(value) : target.axis ? target.axis.toGlobalCoord(target.axis.dataToCoord(value)) : null;\n      };\n      /**\r\n       * @implements\r\n       */\n      Grid.prototype.convertFromPixel = function (ecModel, finder, value) {\n        var target = this._findConvertTarget(finder);\n        return target.cartesian ? target.cartesian.pointToData(value) : target.axis ? target.axis.coordToData(target.axis.toLocalCoord(value)) : null;\n      };\n      Grid.prototype._findConvertTarget = function (finder) {\n        var seriesModel = finder.seriesModel;\n        var xAxisModel = finder.xAxisModel || seriesModel && seriesModel.getReferringComponents('xAxis', SINGLE_REFERRING).models[0];\n        var yAxisModel = finder.yAxisModel || seriesModel && seriesModel.getReferringComponents('yAxis', SINGLE_REFERRING).models[0];\n        var gridModel = finder.gridModel;\n        var coordsList = this._coordsList;\n        var cartesian;\n        var axis;\n        if (seriesModel) {\n          cartesian = seriesModel.coordinateSystem;\n          indexOf(coordsList, cartesian) < 0 && (cartesian = null);\n        } else if (xAxisModel && yAxisModel) {\n          cartesian = this.getCartesian(xAxisModel.componentIndex, yAxisModel.componentIndex);\n        } else if (xAxisModel) {\n          axis = this.getAxis('x', xAxisModel.componentIndex);\n        } else if (yAxisModel) {\n          axis = this.getAxis('y', yAxisModel.componentIndex);\n        }\n        // Lowest priority.\n        else if (gridModel) {\n          var grid = gridModel.coordinateSystem;\n          if (grid === this) {\n            cartesian = this._coordsList[0];\n          }\n        }\n        return {\n          cartesian: cartesian,\n          axis: axis\n        };\n      };\n      /**\r\n       * @implements\r\n       */\n      Grid.prototype.containPoint = function (point) {\n        var coord = this._coordsList[0];\n        if (coord) {\n          return coord.containPoint(point);\n        }\n      };\n      /**\r\n       * Initialize cartesian coordinate systems\r\n       */\n      Grid.prototype._initCartesian = function (gridModel, ecModel, api) {\n        var _this = this;\n        var grid = this;\n        var axisPositionUsed = {\n          left: false,\n          right: false,\n          top: false,\n          bottom: false\n        };\n        var axesMap = {\n          x: {},\n          y: {}\n        };\n        var axesCount = {\n          x: 0,\n          y: 0\n        };\n        // Create axis\n        ecModel.eachComponent('xAxis', createAxisCreator('x'), this);\n        ecModel.eachComponent('yAxis', createAxisCreator('y'), this);\n        if (!axesCount.x || !axesCount.y) {\n          // Roll back when there no either x or y axis\n          this._axesMap = {};\n          this._axesList = [];\n          return;\n        }\n        this._axesMap = axesMap;\n        // Create cartesian2d\n        each(axesMap.x, function (xAxis, xAxisIndex) {\n          each(axesMap.y, function (yAxis, yAxisIndex) {\n            var key = 'x' + xAxisIndex + 'y' + yAxisIndex;\n            var cartesian = new Cartesian2D(key);\n            cartesian.master = _this;\n            cartesian.model = gridModel;\n            _this._coordsMap[key] = cartesian;\n            _this._coordsList.push(cartesian);\n            cartesian.addAxis(xAxis);\n            cartesian.addAxis(yAxis);\n          });\n        });\n        function createAxisCreator(dimName) {\n          return function (axisModel, idx) {\n            if (!isAxisUsedInTheGrid(axisModel, gridModel)) {\n              return;\n            }\n            var axisPosition = axisModel.get('position');\n            if (dimName === 'x') {\n              // Fix position\n              if (axisPosition !== 'top' && axisPosition !== 'bottom') {\n                // Default bottom of X\n                axisPosition = axisPositionUsed.bottom ? 'top' : 'bottom';\n              }\n            } else {\n              // Fix position\n              if (axisPosition !== 'left' && axisPosition !== 'right') {\n                // Default left of Y\n                axisPosition = axisPositionUsed.left ? 'right' : 'left';\n              }\n            }\n            axisPositionUsed[axisPosition] = true;\n            var axis = new Axis2D(dimName, createScaleByModel(axisModel), [0, 0], axisModel.get('type'), axisPosition);\n            var isCategory = axis.type === 'category';\n            axis.onBand = isCategory && axisModel.get('boundaryGap');\n            axis.inverse = axisModel.get('inverse');\n            // Inject axis into axisModel\n            axisModel.axis = axis;\n            // Inject axisModel into axis\n            axis.model = axisModel;\n            // Inject grid info axis\n            axis.grid = grid;\n            // Index of axis, can be used as key\n            axis.index = idx;\n            grid._axesList.push(axis);\n            axesMap[dimName][idx] = axis;\n            axesCount[dimName]++;\n          };\n        }\n      };\n      /**\r\n       * Update cartesian properties from series.\r\n       */\n      Grid.prototype._updateScale = function (ecModel, gridModel) {\n        // Reset scale\n        each(this._axesList, function (axis) {\n          axis.scale.setExtent(Infinity, -Infinity);\n          if (axis.type === 'category') {\n            var categorySortInfo = axis.model.get('categorySortInfo');\n            axis.scale.setSortInfo(categorySortInfo);\n          }\n        });\n        ecModel.eachSeries(function (seriesModel) {\n          if (isCartesian2DSeries(seriesModel)) {\n            var axesModelMap = findAxisModels(seriesModel);\n            var xAxisModel = axesModelMap.xAxisModel;\n            var yAxisModel = axesModelMap.yAxisModel;\n            if (!isAxisUsedInTheGrid(xAxisModel, gridModel) || !isAxisUsedInTheGrid(yAxisModel, gridModel)) {\n              return;\n            }\n            var cartesian = this.getCartesian(xAxisModel.componentIndex, yAxisModel.componentIndex);\n            var data = seriesModel.getData();\n            var xAxis = cartesian.getAxis('x');\n            var yAxis = cartesian.getAxis('y');\n            unionExtent(data, xAxis);\n            unionExtent(data, yAxis);\n          }\n        }, this);\n        function unionExtent(data, axis) {\n          each(getDataDimensionsOnAxis(data, axis.dim), function (dim) {\n            axis.scale.unionExtentFromData(data, dim);\n          });\n        }\n      };\n      /**\r\n       * @param dim 'x' or 'y' or 'auto' or null/undefined\r\n       */\n      Grid.prototype.getTooltipAxes = function (dim) {\n        var baseAxes = [];\n        var otherAxes = [];\n        each(this.getCartesians(), function (cartesian) {\n          var baseAxis = dim != null && dim !== 'auto' ? cartesian.getAxis(dim) : cartesian.getBaseAxis();\n          var otherAxis = cartesian.getOtherAxis(baseAxis);\n          indexOf(baseAxes, baseAxis) < 0 && baseAxes.push(baseAxis);\n          indexOf(otherAxes, otherAxis) < 0 && otherAxes.push(otherAxis);\n        });\n        return {\n          baseAxes: baseAxes,\n          otherAxes: otherAxes\n        };\n      };\n      Grid.create = function (ecModel, api) {\n        var grids = [];\n        ecModel.eachComponent('grid', function (gridModel, idx) {\n          var grid = new Grid(gridModel, ecModel, api);\n          grid.name = 'grid_' + idx;\n          // dataSampling requires axis extent, so resize\n          // should be performed in create stage.\n          grid.resize(gridModel, api, true);\n          gridModel.coordinateSystem = grid;\n          grids.push(grid);\n        });\n        // Inject the coordinateSystems into seriesModel\n        ecModel.eachSeries(function (seriesModel) {\n          if (!isCartesian2DSeries(seriesModel)) {\n            return;\n          }\n          var axesModelMap = findAxisModels(seriesModel);\n          var xAxisModel = axesModelMap.xAxisModel;\n          var yAxisModel = axesModelMap.yAxisModel;\n          var gridModel = xAxisModel.getCoordSysModel();\n          if (\"development\" !== 'production') {\n            if (!gridModel) {\n              throw new Error('Grid \"' + retrieve3(xAxisModel.get('gridIndex'), xAxisModel.get('gridId'), 0) + '\" not found');\n            }\n            if (xAxisModel.getCoordSysModel() !== yAxisModel.getCoordSysModel()) {\n              throw new Error('xAxis and yAxis must use the same grid');\n            }\n          }\n          var grid = gridModel.coordinateSystem;\n          seriesModel.coordinateSystem = grid.getCartesian(xAxisModel.componentIndex, yAxisModel.componentIndex);\n        });\n        return grids;\n      };\n      // For deciding which dimensions to use when creating list data\n      Grid.dimensions = cartesian2DDimensions;\n      return Grid;\n    }();\n    /**\r\n     * Check if the axis is used in the specified grid.\r\n     */\n    function isAxisUsedInTheGrid(axisModel, gridModel) {\n      return axisModel.getCoordSysModel() === gridModel;\n    }\n    function fixAxisOnZero(axesMap, otherAxisDim, axis,\n    // Key: see `getOnZeroRecordKey`\n    onZeroRecords) {\n      axis.getAxesOnZeroOf = function () {\n        // TODO: onZero of multiple axes.\n        return otherAxisOnZeroOf ? [otherAxisOnZeroOf] : [];\n      };\n      // onZero can not be enabled in these two situations:\n      // 1. When any other axis is a category axis.\n      // 2. When no axis is cross 0 point.\n      var otherAxes = axesMap[otherAxisDim];\n      var otherAxisOnZeroOf;\n      var axisModel = axis.model;\n      var onZero = axisModel.get(['axisLine', 'onZero']);\n      var onZeroAxisIndex = axisModel.get(['axisLine', 'onZeroAxisIndex']);\n      if (!onZero) {\n        return;\n      }\n      // If target axis is specified.\n      if (onZeroAxisIndex != null) {\n        if (canOnZeroToAxis(otherAxes[onZeroAxisIndex])) {\n          otherAxisOnZeroOf = otherAxes[onZeroAxisIndex];\n        }\n      } else {\n        // Find the first available other axis.\n        for (var idx in otherAxes) {\n          if (otherAxes.hasOwnProperty(idx) && canOnZeroToAxis(otherAxes[idx])\n          // Consider that two Y axes on one value axis,\n          // if both onZero, the two Y axes overlap.\n          && !onZeroRecords[getOnZeroRecordKey(otherAxes[idx])]) {\n            otherAxisOnZeroOf = otherAxes[idx];\n            break;\n          }\n        }\n      }\n      if (otherAxisOnZeroOf) {\n        onZeroRecords[getOnZeroRecordKey(otherAxisOnZeroOf)] = true;\n      }\n      function getOnZeroRecordKey(axis) {\n        return axis.dim + '_' + axis.index;\n      }\n    }\n    function canOnZeroToAxis(axis) {\n      return axis && axis.type !== 'category' && axis.type !== 'time' && ifAxisCrossZero(axis);\n    }\n    function updateAxisTransform(axis, coordBase) {\n      var axisExtent = axis.getExtent();\n      var axisExtentSum = axisExtent[0] + axisExtent[1];\n      // Fast transform\n      axis.toGlobalCoord = axis.dim === 'x' ? function (coord) {\n        return coord + coordBase;\n      } : function (coord) {\n        return axisExtentSum - coord + coordBase;\n      };\n      axis.toLocalCoord = axis.dim === 'x' ? function (coord) {\n        return coord - coordBase;\n      } : function (coord) {\n        return axisExtentSum - coord + coordBase;\n      };\n    }\n\n    var PI$5 = Math.PI;\n    /**\r\n     * A final axis is translated and rotated from a \"standard axis\".\r\n     * So opt.position and opt.rotation is required.\r\n     *\r\n     * A standard axis is and axis from [0, 0] to [0, axisExtent[1]],\r\n     * for example: (0, 0) ------------> (0, 50)\r\n     *\r\n     * nameDirection or tickDirection or labelDirection is 1 means tick\r\n     * or label is below the standard axis, whereas is -1 means above\r\n     * the standard axis. labelOffset means offset between label and axis,\r\n     * which is useful when 'onZero', where axisLabel is in the grid and\r\n     * label in outside grid.\r\n     *\r\n     * Tips: like always,\r\n     * positive rotation represents anticlockwise, and negative rotation\r\n     * represents clockwise.\r\n     * The direction of position coordinate is the same as the direction\r\n     * of screen coordinate.\r\n     *\r\n     * Do not need to consider axis 'inverse', which is auto processed by\r\n     * axis extent.\r\n     */\n    var AxisBuilder = /** @class */function () {\n      function AxisBuilder(axisModel, opt) {\n        this.group = new Group();\n        this.opt = opt;\n        this.axisModel = axisModel;\n        // Default value\n        defaults(opt, {\n          labelOffset: 0,\n          nameDirection: 1,\n          tickDirection: 1,\n          labelDirection: 1,\n          silent: true,\n          handleAutoShown: function () {\n            return true;\n          }\n        });\n        // FIXME Not use a separate text group?\n        var transformGroup = new Group({\n          x: opt.position[0],\n          y: opt.position[1],\n          rotation: opt.rotation\n        });\n        // this.group.add(transformGroup);\n        // this._transformGroup = transformGroup;\n        transformGroup.updateTransform();\n        this._transformGroup = transformGroup;\n      }\n      AxisBuilder.prototype.hasBuilder = function (name) {\n        return !!builders[name];\n      };\n      AxisBuilder.prototype.add = function (name) {\n        builders[name](this.opt, this.axisModel, this.group, this._transformGroup);\n      };\n      AxisBuilder.prototype.getGroup = function () {\n        return this.group;\n      };\n      AxisBuilder.innerTextLayout = function (axisRotation, textRotation, direction) {\n        var rotationDiff = remRadian(textRotation - axisRotation);\n        var textAlign;\n        var textVerticalAlign;\n        if (isRadianAroundZero(rotationDiff)) {\n          // Label is parallel with axis line.\n          textVerticalAlign = direction > 0 ? 'top' : 'bottom';\n          textAlign = 'center';\n        } else if (isRadianAroundZero(rotationDiff - PI$5)) {\n          // Label is inverse parallel with axis line.\n          textVerticalAlign = direction > 0 ? 'bottom' : 'top';\n          textAlign = 'center';\n        } else {\n          textVerticalAlign = 'middle';\n          if (rotationDiff > 0 && rotationDiff < PI$5) {\n            textAlign = direction > 0 ? 'right' : 'left';\n          } else {\n            textAlign = direction > 0 ? 'left' : 'right';\n          }\n        }\n        return {\n          rotation: rotationDiff,\n          textAlign: textAlign,\n          textVerticalAlign: textVerticalAlign\n        };\n      };\n      AxisBuilder.makeAxisEventDataBase = function (axisModel) {\n        var eventData = {\n          componentType: axisModel.mainType,\n          componentIndex: axisModel.componentIndex\n        };\n        eventData[axisModel.mainType + 'Index'] = axisModel.componentIndex;\n        return eventData;\n      };\n      AxisBuilder.isLabelSilent = function (axisModel) {\n        var tooltipOpt = axisModel.get('tooltip');\n        return axisModel.get('silent')\n        // Consider mouse cursor, add these restrictions.\n        || !(axisModel.get('triggerEvent') || tooltipOpt && tooltipOpt.show);\n      };\n      return AxisBuilder;\n    }();\n    var builders = {\n      axisLine: function (opt, axisModel, group, transformGroup) {\n        var shown = axisModel.get(['axisLine', 'show']);\n        if (shown === 'auto' && opt.handleAutoShown) {\n          shown = opt.handleAutoShown('axisLine');\n        }\n        if (!shown) {\n          return;\n        }\n        var extent = axisModel.axis.getExtent();\n        var matrix = transformGroup.transform;\n        var pt1 = [extent[0], 0];\n        var pt2 = [extent[1], 0];\n        var inverse = pt1[0] > pt2[0];\n        if (matrix) {\n          applyTransform(pt1, pt1, matrix);\n          applyTransform(pt2, pt2, matrix);\n        }\n        var lineStyle = extend({\n          lineCap: 'round'\n        }, axisModel.getModel(['axisLine', 'lineStyle']).getLineStyle());\n        var line = new Line({\n          shape: {\n            x1: pt1[0],\n            y1: pt1[1],\n            x2: pt2[0],\n            y2: pt2[1]\n          },\n          style: lineStyle,\n          strokeContainThreshold: opt.strokeContainThreshold || 5,\n          silent: true,\n          z2: 1\n        });\n        subPixelOptimizeLine$1(line.shape, line.style.lineWidth);\n        line.anid = 'line';\n        group.add(line);\n        var arrows = axisModel.get(['axisLine', 'symbol']);\n        if (arrows != null) {\n          var arrowSize = axisModel.get(['axisLine', 'symbolSize']);\n          if (isString(arrows)) {\n            // Use the same arrow for start and end point\n            arrows = [arrows, arrows];\n          }\n          if (isString(arrowSize) || isNumber(arrowSize)) {\n            // Use the same size for width and height\n            arrowSize = [arrowSize, arrowSize];\n          }\n          var arrowOffset = normalizeSymbolOffset(axisModel.get(['axisLine', 'symbolOffset']) || 0, arrowSize);\n          var symbolWidth_1 = arrowSize[0];\n          var symbolHeight_1 = arrowSize[1];\n          each([{\n            rotate: opt.rotation + Math.PI / 2,\n            offset: arrowOffset[0],\n            r: 0\n          }, {\n            rotate: opt.rotation - Math.PI / 2,\n            offset: arrowOffset[1],\n            r: Math.sqrt((pt1[0] - pt2[0]) * (pt1[0] - pt2[0]) + (pt1[1] - pt2[1]) * (pt1[1] - pt2[1]))\n          }], function (point, index) {\n            if (arrows[index] !== 'none' && arrows[index] != null) {\n              var symbol = createSymbol(arrows[index], -symbolWidth_1 / 2, -symbolHeight_1 / 2, symbolWidth_1, symbolHeight_1, lineStyle.stroke, true);\n              // Calculate arrow position with offset\n              var r = point.r + point.offset;\n              var pt = inverse ? pt2 : pt1;\n              symbol.attr({\n                rotation: point.rotate,\n                x: pt[0] + r * Math.cos(opt.rotation),\n                y: pt[1] - r * Math.sin(opt.rotation),\n                silent: true,\n                z2: 11\n              });\n              group.add(symbol);\n            }\n          });\n        }\n      },\n      axisTickLabel: function (opt, axisModel, group, transformGroup) {\n        var ticksEls = buildAxisMajorTicks(group, transformGroup, axisModel, opt);\n        var labelEls = buildAxisLabel(group, transformGroup, axisModel, opt);\n        fixMinMaxLabelShow(axisModel, labelEls, ticksEls);\n        buildAxisMinorTicks(group, transformGroup, axisModel, opt.tickDirection);\n        // This bit fixes the label overlap issue for the time chart.\n        // See https://github.com/apache/echarts/issues/14266 for more.\n        if (axisModel.get(['axisLabel', 'hideOverlap'])) {\n          var labelList = prepareLayoutList(map(labelEls, function (label) {\n            return {\n              label: label,\n              priority: label.z2,\n              defaultAttr: {\n                ignore: label.ignore\n              }\n            };\n          }));\n          hideOverlap(labelList);\n        }\n      },\n      axisName: function (opt, axisModel, group, transformGroup) {\n        var name = retrieve(opt.axisName, axisModel.get('name'));\n        if (!name) {\n          return;\n        }\n        var nameLocation = axisModel.get('nameLocation');\n        var nameDirection = opt.nameDirection;\n        var textStyleModel = axisModel.getModel('nameTextStyle');\n        var gap = axisModel.get('nameGap') || 0;\n        var extent = axisModel.axis.getExtent();\n        var gapSignal = extent[0] > extent[1] ? -1 : 1;\n        var pos = [nameLocation === 'start' ? extent[0] - gapSignal * gap : nameLocation === 'end' ? extent[1] + gapSignal * gap : (extent[0] + extent[1]) / 2,\n        // Reuse labelOffset.\n        isNameLocationCenter(nameLocation) ? opt.labelOffset + nameDirection * gap : 0];\n        var labelLayout;\n        var nameRotation = axisModel.get('nameRotate');\n        if (nameRotation != null) {\n          nameRotation = nameRotation * PI$5 / 180; // To radian.\n        }\n        var axisNameAvailableWidth;\n        if (isNameLocationCenter(nameLocation)) {\n          labelLayout = AxisBuilder.innerTextLayout(opt.rotation, nameRotation != null ? nameRotation : opt.rotation,\n          // Adapt to axis.\n          nameDirection);\n        } else {\n          labelLayout = endTextLayout(opt.rotation, nameLocation, nameRotation || 0, extent);\n          axisNameAvailableWidth = opt.axisNameAvailableWidth;\n          if (axisNameAvailableWidth != null) {\n            axisNameAvailableWidth = Math.abs(axisNameAvailableWidth / Math.sin(labelLayout.rotation));\n            !isFinite(axisNameAvailableWidth) && (axisNameAvailableWidth = null);\n          }\n        }\n        var textFont = textStyleModel.getFont();\n        var truncateOpt = axisModel.get('nameTruncate', true) || {};\n        var ellipsis = truncateOpt.ellipsis;\n        var maxWidth = retrieve(opt.nameTruncateMaxWidth, truncateOpt.maxWidth, axisNameAvailableWidth);\n        var textEl = new ZRText({\n          x: pos[0],\n          y: pos[1],\n          rotation: labelLayout.rotation,\n          silent: AxisBuilder.isLabelSilent(axisModel),\n          style: createTextStyle(textStyleModel, {\n            text: name,\n            font: textFont,\n            overflow: 'truncate',\n            width: maxWidth,\n            ellipsis: ellipsis,\n            fill: textStyleModel.getTextColor() || axisModel.get(['axisLine', 'lineStyle', 'color']),\n            align: textStyleModel.get('align') || labelLayout.textAlign,\n            verticalAlign: textStyleModel.get('verticalAlign') || labelLayout.textVerticalAlign\n          }),\n          z2: 1\n        });\n        setTooltipConfig({\n          el: textEl,\n          componentModel: axisModel,\n          itemName: name\n        });\n        textEl.__fullText = name;\n        // Id for animation\n        textEl.anid = 'name';\n        if (axisModel.get('triggerEvent')) {\n          var eventData = AxisBuilder.makeAxisEventDataBase(axisModel);\n          eventData.targetType = 'axisName';\n          eventData.name = name;\n          getECData(textEl).eventData = eventData;\n        }\n        // FIXME\n        transformGroup.add(textEl);\n        textEl.updateTransform();\n        group.add(textEl);\n        textEl.decomposeTransform();\n      }\n    };\n    function endTextLayout(rotation, textPosition, textRotate, extent) {\n      var rotationDiff = remRadian(textRotate - rotation);\n      var textAlign;\n      var textVerticalAlign;\n      var inverse = extent[0] > extent[1];\n      var onLeft = textPosition === 'start' && !inverse || textPosition !== 'start' && inverse;\n      if (isRadianAroundZero(rotationDiff - PI$5 / 2)) {\n        textVerticalAlign = onLeft ? 'bottom' : 'top';\n        textAlign = 'center';\n      } else if (isRadianAroundZero(rotationDiff - PI$5 * 1.5)) {\n        textVerticalAlign = onLeft ? 'top' : 'bottom';\n        textAlign = 'center';\n      } else {\n        textVerticalAlign = 'middle';\n        if (rotationDiff < PI$5 * 1.5 && rotationDiff > PI$5 / 2) {\n          textAlign = onLeft ? 'left' : 'right';\n        } else {\n          textAlign = onLeft ? 'right' : 'left';\n        }\n      }\n      return {\n        rotation: rotationDiff,\n        textAlign: textAlign,\n        textVerticalAlign: textVerticalAlign\n      };\n    }\n    function fixMinMaxLabelShow(axisModel, labelEls, tickEls) {\n      if (shouldShowAllLabels(axisModel.axis)) {\n        return;\n      }\n      // If min or max are user set, we need to check\n      // If the tick on min(max) are overlap on their neighbour tick\n      // If they are overlapped, we need to hide the min(max) tick label\n      var showMinLabel = axisModel.get(['axisLabel', 'showMinLabel']);\n      var showMaxLabel = axisModel.get(['axisLabel', 'showMaxLabel']);\n      // FIXME\n      // Have not consider onBand yet, where tick els is more than label els.\n      labelEls = labelEls || [];\n      tickEls = tickEls || [];\n      var firstLabel = labelEls[0];\n      var nextLabel = labelEls[1];\n      var lastLabel = labelEls[labelEls.length - 1];\n      var prevLabel = labelEls[labelEls.length - 2];\n      var firstTick = tickEls[0];\n      var nextTick = tickEls[1];\n      var lastTick = tickEls[tickEls.length - 1];\n      var prevTick = tickEls[tickEls.length - 2];\n      if (showMinLabel === false) {\n        ignoreEl(firstLabel);\n        ignoreEl(firstTick);\n      } else if (isTwoLabelOverlapped(firstLabel, nextLabel)) {\n        if (showMinLabel) {\n          ignoreEl(nextLabel);\n          ignoreEl(nextTick);\n        } else {\n          ignoreEl(firstLabel);\n          ignoreEl(firstTick);\n        }\n      }\n      if (showMaxLabel === false) {\n        ignoreEl(lastLabel);\n        ignoreEl(lastTick);\n      } else if (isTwoLabelOverlapped(prevLabel, lastLabel)) {\n        if (showMaxLabel) {\n          ignoreEl(prevLabel);\n          ignoreEl(prevTick);\n        } else {\n          ignoreEl(lastLabel);\n          ignoreEl(lastTick);\n        }\n      }\n    }\n    function ignoreEl(el) {\n      el && (el.ignore = true);\n    }\n    function isTwoLabelOverlapped(current, next) {\n      // current and next has the same rotation.\n      var firstRect = current && current.getBoundingRect().clone();\n      var nextRect = next && next.getBoundingRect().clone();\n      if (!firstRect || !nextRect) {\n        return;\n      }\n      // When checking intersect of two rotated labels, we use mRotationBack\n      // to avoid that boundingRect is enlarge when using `boundingRect.applyTransform`.\n      var mRotationBack = identity([]);\n      rotate(mRotationBack, mRotationBack, -current.rotation);\n      firstRect.applyTransform(mul$1([], mRotationBack, current.getLocalTransform()));\n      nextRect.applyTransform(mul$1([], mRotationBack, next.getLocalTransform()));\n      return firstRect.intersect(nextRect);\n    }\n    function isNameLocationCenter(nameLocation) {\n      return nameLocation === 'middle' || nameLocation === 'center';\n    }\n    function createTicks(ticksCoords, tickTransform, tickEndCoord, tickLineStyle, anidPrefix) {\n      var tickEls = [];\n      var pt1 = [];\n      var pt2 = [];\n      for (var i = 0; i < ticksCoords.length; i++) {\n        var tickCoord = ticksCoords[i].coord;\n        pt1[0] = tickCoord;\n        pt1[1] = 0;\n        pt2[0] = tickCoord;\n        pt2[1] = tickEndCoord;\n        if (tickTransform) {\n          applyTransform(pt1, pt1, tickTransform);\n          applyTransform(pt2, pt2, tickTransform);\n        }\n        // Tick line, Not use group transform to have better line draw\n        var tickEl = new Line({\n          shape: {\n            x1: pt1[0],\n            y1: pt1[1],\n            x2: pt2[0],\n            y2: pt2[1]\n          },\n          style: tickLineStyle,\n          z2: 2,\n          autoBatch: true,\n          silent: true\n        });\n        subPixelOptimizeLine$1(tickEl.shape, tickEl.style.lineWidth);\n        tickEl.anid = anidPrefix + '_' + ticksCoords[i].tickValue;\n        tickEls.push(tickEl);\n      }\n      return tickEls;\n    }\n    function buildAxisMajorTicks(group, transformGroup, axisModel, opt) {\n      var axis = axisModel.axis;\n      var tickModel = axisModel.getModel('axisTick');\n      var shown = tickModel.get('show');\n      if (shown === 'auto' && opt.handleAutoShown) {\n        shown = opt.handleAutoShown('axisTick');\n      }\n      if (!shown || axis.scale.isBlank()) {\n        return;\n      }\n      var lineStyleModel = tickModel.getModel('lineStyle');\n      var tickEndCoord = opt.tickDirection * tickModel.get('length');\n      var ticksCoords = axis.getTicksCoords();\n      var ticksEls = createTicks(ticksCoords, transformGroup.transform, tickEndCoord, defaults(lineStyleModel.getLineStyle(), {\n        stroke: axisModel.get(['axisLine', 'lineStyle', 'color'])\n      }), 'ticks');\n      for (var i = 0; i < ticksEls.length; i++) {\n        group.add(ticksEls[i]);\n      }\n      return ticksEls;\n    }\n    function buildAxisMinorTicks(group, transformGroup, axisModel, tickDirection) {\n      var axis = axisModel.axis;\n      var minorTickModel = axisModel.getModel('minorTick');\n      if (!minorTickModel.get('show') || axis.scale.isBlank()) {\n        return;\n      }\n      var minorTicksCoords = axis.getMinorTicksCoords();\n      if (!minorTicksCoords.length) {\n        return;\n      }\n      var lineStyleModel = minorTickModel.getModel('lineStyle');\n      var tickEndCoord = tickDirection * minorTickModel.get('length');\n      var minorTickLineStyle = defaults(lineStyleModel.getLineStyle(), defaults(axisModel.getModel('axisTick').getLineStyle(), {\n        stroke: axisModel.get(['axisLine', 'lineStyle', 'color'])\n      }));\n      for (var i = 0; i < minorTicksCoords.length; i++) {\n        var minorTicksEls = createTicks(minorTicksCoords[i], transformGroup.transform, tickEndCoord, minorTickLineStyle, 'minorticks_' + i);\n        for (var k = 0; k < minorTicksEls.length; k++) {\n          group.add(minorTicksEls[k]);\n        }\n      }\n    }\n    function buildAxisLabel(group, transformGroup, axisModel, opt) {\n      var axis = axisModel.axis;\n      var show = retrieve(opt.axisLabelShow, axisModel.get(['axisLabel', 'show']));\n      if (!show || axis.scale.isBlank()) {\n        return;\n      }\n      var labelModel = axisModel.getModel('axisLabel');\n      var labelMargin = labelModel.get('margin');\n      var labels = axis.getViewLabels();\n      // Special label rotate.\n      var labelRotation = (retrieve(opt.labelRotate, labelModel.get('rotate')) || 0) * PI$5 / 180;\n      var labelLayout = AxisBuilder.innerTextLayout(opt.rotation, labelRotation, opt.labelDirection);\n      var rawCategoryData = axisModel.getCategories && axisModel.getCategories(true);\n      var labelEls = [];\n      var silent = AxisBuilder.isLabelSilent(axisModel);\n      var triggerEvent = axisModel.get('triggerEvent');\n      each(labels, function (labelItem, index) {\n        var tickValue = axis.scale.type === 'ordinal' ? axis.scale.getRawOrdinalNumber(labelItem.tickValue) : labelItem.tickValue;\n        var formattedLabel = labelItem.formattedLabel;\n        var rawLabel = labelItem.rawLabel;\n        var itemLabelModel = labelModel;\n        if (rawCategoryData && rawCategoryData[tickValue]) {\n          var rawCategoryItem = rawCategoryData[tickValue];\n          if (isObject(rawCategoryItem) && rawCategoryItem.textStyle) {\n            itemLabelModel = new Model(rawCategoryItem.textStyle, labelModel, axisModel.ecModel);\n          }\n        }\n        var textColor = itemLabelModel.getTextColor() || axisModel.get(['axisLine', 'lineStyle', 'color']);\n        var tickCoord = axis.dataToCoord(tickValue);\n        var align = itemLabelModel.getShallow('align', true) || labelLayout.textAlign;\n        var alignMin = retrieve2(itemLabelModel.getShallow('alignMinLabel', true), align);\n        var alignMax = retrieve2(itemLabelModel.getShallow('alignMaxLabel', true), align);\n        var verticalAlign = itemLabelModel.getShallow('verticalAlign', true) || itemLabelModel.getShallow('baseline', true) || labelLayout.textVerticalAlign;\n        var verticalAlignMin = retrieve2(itemLabelModel.getShallow('verticalAlignMinLabel', true), verticalAlign);\n        var verticalAlignMax = retrieve2(itemLabelModel.getShallow('verticalAlignMaxLabel', true), verticalAlign);\n        var textEl = new ZRText({\n          x: tickCoord,\n          y: opt.labelOffset + opt.labelDirection * labelMargin,\n          rotation: labelLayout.rotation,\n          silent: silent,\n          z2: 10 + (labelItem.level || 0),\n          style: createTextStyle(itemLabelModel, {\n            text: formattedLabel,\n            align: index === 0 ? alignMin : index === labels.length - 1 ? alignMax : align,\n            verticalAlign: index === 0 ? verticalAlignMin : index === labels.length - 1 ? verticalAlignMax : verticalAlign,\n            fill: isFunction(textColor) ? textColor(\n            // (1) In category axis with data zoom, tick is not the original\n            // index of axis.data. So tick should not be exposed to user\n            // in category axis.\n            // (2) Compatible with previous version, which always use formatted label as\n            // input. But in interval scale the formatted label is like '223,445', which\n            // maked user replace ','. So we modify it to return original val but remain\n            // it as 'string' to avoid error in replacing.\n            axis.type === 'category' ? rawLabel : axis.type === 'value' ? tickValue + '' : tickValue, index) : textColor\n          })\n        });\n        textEl.anid = 'label_' + tickValue;\n        setTooltipConfig({\n          el: textEl,\n          componentModel: axisModel,\n          itemName: formattedLabel,\n          formatterParamsExtra: {\n            isTruncated: function () {\n              return textEl.isTruncated;\n            },\n            value: rawLabel,\n            tickIndex: index\n          }\n        });\n        // Pack data for mouse event\n        if (triggerEvent) {\n          var eventData = AxisBuilder.makeAxisEventDataBase(axisModel);\n          eventData.targetType = 'axisLabel';\n          eventData.value = rawLabel;\n          eventData.tickIndex = index;\n          if (axis.type === 'category') {\n            eventData.dataIndex = tickValue;\n          }\n          getECData(textEl).eventData = eventData;\n        }\n        // FIXME\n        transformGroup.add(textEl);\n        textEl.updateTransform();\n        labelEls.push(textEl);\n        group.add(textEl);\n        textEl.decomposeTransform();\n      });\n      return labelEls;\n    }\n\n    // Build axisPointerModel, mergin tooltip.axisPointer model for each axis.\n    // allAxesInfo should be updated when setOption performed.\n    function collect(ecModel, api) {\n      var result = {\n        /**\r\n         * key: makeKey(axis.model)\r\n         * value: {\r\n         *      axis,\r\n         *      coordSys,\r\n         *      axisPointerModel,\r\n         *      triggerTooltip,\r\n         *      triggerEmphasis,\r\n         *      involveSeries,\r\n         *      snap,\r\n         *      seriesModels,\r\n         *      seriesDataCount\r\n         * }\r\n         */\n        axesInfo: {},\n        seriesInvolved: false,\n        /**\r\n         * key: makeKey(coordSys.model)\r\n         * value: Object: key makeKey(axis.model), value: axisInfo\r\n         */\n        coordSysAxesInfo: {},\n        coordSysMap: {}\n      };\n      collectAxesInfo(result, ecModel, api);\n      // Check seriesInvolved for performance, in case too many series in some chart.\n      result.seriesInvolved && collectSeriesInfo(result, ecModel);\n      return result;\n    }\n    function collectAxesInfo(result, ecModel, api) {\n      var globalTooltipModel = ecModel.getComponent('tooltip');\n      var globalAxisPointerModel = ecModel.getComponent('axisPointer');\n      // links can only be set on global.\n      var linksOption = globalAxisPointerModel.get('link', true) || [];\n      var linkGroups = [];\n      // Collect axes info.\n      each(api.getCoordinateSystems(), function (coordSys) {\n        // Some coordinate system do not support axes, like geo.\n        if (!coordSys.axisPointerEnabled) {\n          return;\n        }\n        var coordSysKey = makeKey(coordSys.model);\n        var axesInfoInCoordSys = result.coordSysAxesInfo[coordSysKey] = {};\n        result.coordSysMap[coordSysKey] = coordSys;\n        // Set tooltip (like 'cross') is a convenient way to show axisPointer\n        // for user. So we enable setting tooltip on coordSys model.\n        var coordSysModel = coordSys.model;\n        var baseTooltipModel = coordSysModel.getModel('tooltip', globalTooltipModel);\n        each(coordSys.getAxes(), curry(saveTooltipAxisInfo, false, null));\n        // If axis tooltip used, choose tooltip axis for each coordSys.\n        // Notice this case: coordSys is `grid` but not `cartesian2D` here.\n        if (coordSys.getTooltipAxes && globalTooltipModel\n        // If tooltip.showContent is set as false, tooltip will not\n        // show but axisPointer will show as normal.\n        && baseTooltipModel.get('show')) {\n          // Compatible with previous logic. But series.tooltip.trigger: 'axis'\n          // or series.data[n].tooltip.trigger: 'axis' are not support any more.\n          var triggerAxis = baseTooltipModel.get('trigger') === 'axis';\n          var cross = baseTooltipModel.get(['axisPointer', 'type']) === 'cross';\n          var tooltipAxes = coordSys.getTooltipAxes(baseTooltipModel.get(['axisPointer', 'axis']));\n          if (triggerAxis || cross) {\n            each(tooltipAxes.baseAxes, curry(saveTooltipAxisInfo, cross ? 'cross' : true, triggerAxis));\n          }\n          if (cross) {\n            each(tooltipAxes.otherAxes, curry(saveTooltipAxisInfo, 'cross', false));\n          }\n        }\n        // fromTooltip: true | false | 'cross'\n        // triggerTooltip: true | false | null\n        function saveTooltipAxisInfo(fromTooltip, triggerTooltip, axis) {\n          var axisPointerModel = axis.model.getModel('axisPointer', globalAxisPointerModel);\n          var axisPointerShow = axisPointerModel.get('show');\n          if (!axisPointerShow || axisPointerShow === 'auto' && !fromTooltip && !isHandleTrigger(axisPointerModel)) {\n            return;\n          }\n          if (triggerTooltip == null) {\n            triggerTooltip = axisPointerModel.get('triggerTooltip');\n          }\n          axisPointerModel = fromTooltip ? makeAxisPointerModel(axis, baseTooltipModel, globalAxisPointerModel, ecModel, fromTooltip, triggerTooltip) : axisPointerModel;\n          var snap = axisPointerModel.get('snap');\n          var triggerEmphasis = axisPointerModel.get('triggerEmphasis');\n          var axisKey = makeKey(axis.model);\n          var involveSeries = triggerTooltip || snap || axis.type === 'category';\n          // If result.axesInfo[key] exist, override it (tooltip has higher priority).\n          var axisInfo = result.axesInfo[axisKey] = {\n            key: axisKey,\n            axis: axis,\n            coordSys: coordSys,\n            axisPointerModel: axisPointerModel,\n            triggerTooltip: triggerTooltip,\n            triggerEmphasis: triggerEmphasis,\n            involveSeries: involveSeries,\n            snap: snap,\n            useHandle: isHandleTrigger(axisPointerModel),\n            seriesModels: [],\n            linkGroup: null\n          };\n          axesInfoInCoordSys[axisKey] = axisInfo;\n          result.seriesInvolved = result.seriesInvolved || involveSeries;\n          var groupIndex = getLinkGroupIndex(linksOption, axis);\n          if (groupIndex != null) {\n            var linkGroup = linkGroups[groupIndex] || (linkGroups[groupIndex] = {\n              axesInfo: {}\n            });\n            linkGroup.axesInfo[axisKey] = axisInfo;\n            linkGroup.mapper = linksOption[groupIndex].mapper;\n            axisInfo.linkGroup = linkGroup;\n          }\n        }\n      });\n    }\n    function makeAxisPointerModel(axis, baseTooltipModel, globalAxisPointerModel, ecModel, fromTooltip, triggerTooltip) {\n      var tooltipAxisPointerModel = baseTooltipModel.getModel('axisPointer');\n      var fields = ['type', 'snap', 'lineStyle', 'shadowStyle', 'label', 'animation', 'animationDurationUpdate', 'animationEasingUpdate', 'z'];\n      var volatileOption = {};\n      each(fields, function (field) {\n        volatileOption[field] = clone(tooltipAxisPointerModel.get(field));\n      });\n      // category axis do not auto snap, otherwise some tick that do not\n      // has value can not be hovered. value/time/log axis default snap if\n      // triggered from tooltip and trigger tooltip.\n      volatileOption.snap = axis.type !== 'category' && !!triggerTooltip;\n      // Compatible with previous behavior, tooltip axis does not show label by default.\n      // Only these properties can be overridden from tooltip to axisPointer.\n      if (tooltipAxisPointerModel.get('type') === 'cross') {\n        volatileOption.type = 'line';\n      }\n      var labelOption = volatileOption.label || (volatileOption.label = {});\n      // Follow the convention, do not show label when triggered by tooltip by default.\n      labelOption.show == null && (labelOption.show = false);\n      if (fromTooltip === 'cross') {\n        // When 'cross', both axes show labels.\n        var tooltipAxisPointerLabelShow = tooltipAxisPointerModel.get(['label', 'show']);\n        labelOption.show = tooltipAxisPointerLabelShow != null ? tooltipAxisPointerLabelShow : true;\n        // If triggerTooltip, this is a base axis, which should better not use cross style\n        // (cross style is dashed by default)\n        if (!triggerTooltip) {\n          var crossStyle = volatileOption.lineStyle = tooltipAxisPointerModel.get('crossStyle');\n          crossStyle && defaults(labelOption, crossStyle.textStyle);\n        }\n      }\n      return axis.model.getModel('axisPointer', new Model(volatileOption, globalAxisPointerModel, ecModel));\n    }\n    function collectSeriesInfo(result, ecModel) {\n      // Prepare data for axis trigger\n      ecModel.eachSeries(function (seriesModel) {\n        // Notice this case: this coordSys is `cartesian2D` but not `grid`.\n        var coordSys = seriesModel.coordinateSystem;\n        var seriesTooltipTrigger = seriesModel.get(['tooltip', 'trigger'], true);\n        var seriesTooltipShow = seriesModel.get(['tooltip', 'show'], true);\n        if (!coordSys || seriesTooltipTrigger === 'none' || seriesTooltipTrigger === false || seriesTooltipTrigger === 'item' || seriesTooltipShow === false || seriesModel.get(['axisPointer', 'show'], true) === false) {\n          return;\n        }\n        each(result.coordSysAxesInfo[makeKey(coordSys.model)], function (axisInfo) {\n          var axis = axisInfo.axis;\n          if (coordSys.getAxis(axis.dim) === axis) {\n            axisInfo.seriesModels.push(seriesModel);\n            axisInfo.seriesDataCount == null && (axisInfo.seriesDataCount = 0);\n            axisInfo.seriesDataCount += seriesModel.getData().count();\n          }\n        });\n      });\n    }\n    /**\r\n     * For example:\r\n     * {\r\n     *     axisPointer: {\r\n     *         links: [{\r\n     *             xAxisIndex: [2, 4],\r\n     *             yAxisIndex: 'all'\r\n     *         }, {\r\n     *             xAxisId: ['a5', 'a7'],\r\n     *             xAxisName: 'xxx'\r\n     *         }]\r\n     *     }\r\n     * }\r\n     */\n    function getLinkGroupIndex(linksOption, axis) {\n      var axisModel = axis.model;\n      var dim = axis.dim;\n      for (var i = 0; i < linksOption.length; i++) {\n        var linkOption = linksOption[i] || {};\n        if (checkPropInLink(linkOption[dim + 'AxisId'], axisModel.id) || checkPropInLink(linkOption[dim + 'AxisIndex'], axisModel.componentIndex) || checkPropInLink(linkOption[dim + 'AxisName'], axisModel.name)) {\n          return i;\n        }\n      }\n    }\n    function checkPropInLink(linkPropValue, axisPropValue) {\n      return linkPropValue === 'all' || isArray(linkPropValue) && indexOf(linkPropValue, axisPropValue) >= 0 || linkPropValue === axisPropValue;\n    }\n    function fixValue(axisModel) {\n      var axisInfo = getAxisInfo(axisModel);\n      if (!axisInfo) {\n        return;\n      }\n      var axisPointerModel = axisInfo.axisPointerModel;\n      var scale = axisInfo.axis.scale;\n      var option = axisPointerModel.option;\n      var status = axisPointerModel.get('status');\n      var value = axisPointerModel.get('value');\n      // Parse init value for category and time axis.\n      if (value != null) {\n        value = scale.parse(value);\n      }\n      var useHandle = isHandleTrigger(axisPointerModel);\n      // If `handle` used, `axisPointer` will always be displayed, so value\n      // and status should be initialized.\n      if (status == null) {\n        option.status = useHandle ? 'show' : 'hide';\n      }\n      var extent = scale.getExtent().slice();\n      extent[0] > extent[1] && extent.reverse();\n      if (\n      // Pick a value on axis when initializing.\n      value == null\n      // If both `handle` and `dataZoom` are used, value may be out of axis extent,\n      // where we should re-pick a value to keep `handle` displaying normally.\n      || value > extent[1]) {\n        // Make handle displayed on the end of the axis when init, which looks better.\n        value = extent[1];\n      }\n      if (value < extent[0]) {\n        value = extent[0];\n      }\n      option.value = value;\n      if (useHandle) {\n        option.status = axisInfo.axis.scale.isBlank() ? 'hide' : 'show';\n      }\n    }\n    function getAxisInfo(axisModel) {\n      var coordSysAxesInfo = (axisModel.ecModel.getComponent('axisPointer') || {}).coordSysAxesInfo;\n      return coordSysAxesInfo && coordSysAxesInfo.axesInfo[makeKey(axisModel)];\n    }\n    function getAxisPointerModel(axisModel) {\n      var axisInfo = getAxisInfo(axisModel);\n      return axisInfo && axisInfo.axisPointerModel;\n    }\n    function isHandleTrigger(axisPointerModel) {\n      return !!axisPointerModel.get(['handle', 'show']);\n    }\n    /**\r\n     * @param {module:echarts/model/Model} model\r\n     * @return {string} unique key\r\n     */\n    function makeKey(model) {\n      return model.type + '||' + model.id;\n    }\n\n    var axisPointerClazz = {};\n    /**\r\n     * Base class of AxisView.\r\n     */\n    var AxisView = /** @class */function (_super) {\n      __extends(AxisView, _super);\n      function AxisView() {\n        var _this = _super !== null && _super.apply(this, arguments) || this;\n        _this.type = AxisView.type;\n        return _this;\n      }\n      /**\r\n       * @override\r\n       */\n      AxisView.prototype.render = function (axisModel, ecModel, api, payload) {\n        // FIXME\n        // This process should proformed after coordinate systems updated\n        // (axis scale updated), and should be performed each time update.\n        // So put it here temporarily, although it is not appropriate to\n        // put a model-writing procedure in `view`.\n        this.axisPointerClass && fixValue(axisModel);\n        _super.prototype.render.apply(this, arguments);\n        this._doUpdateAxisPointerClass(axisModel, api, true);\n      };\n      /**\r\n       * Action handler.\r\n       */\n      AxisView.prototype.updateAxisPointer = function (axisModel, ecModel, api, payload) {\n        this._doUpdateAxisPointerClass(axisModel, api, false);\n      };\n      /**\r\n       * @override\r\n       */\n      AxisView.prototype.remove = function (ecModel, api) {\n        var axisPointer = this._axisPointer;\n        axisPointer && axisPointer.remove(api);\n      };\n      /**\r\n       * @override\r\n       */\n      AxisView.prototype.dispose = function (ecModel, api) {\n        this._disposeAxisPointer(api);\n        _super.prototype.dispose.apply(this, arguments);\n      };\n      AxisView.prototype._doUpdateAxisPointerClass = function (axisModel, api, forceRender) {\n        var Clazz = AxisView.getAxisPointerClass(this.axisPointerClass);\n        if (!Clazz) {\n          return;\n        }\n        var axisPointerModel = getAxisPointerModel(axisModel);\n        axisPointerModel ? (this._axisPointer || (this._axisPointer = new Clazz())).render(axisModel, axisPointerModel, api, forceRender) : this._disposeAxisPointer(api);\n      };\n      AxisView.prototype._disposeAxisPointer = function (api) {\n        this._axisPointer && this._axisPointer.dispose(api);\n        this._axisPointer = null;\n      };\n      AxisView.registerAxisPointerClass = function (type, clazz) {\n        if (\"development\" !== 'production') {\n          if (axisPointerClazz[type]) {\n            throw new Error('axisPointer ' + type + ' exists');\n          }\n        }\n        axisPointerClazz[type] = clazz;\n      };\n      AxisView.getAxisPointerClass = function (type) {\n        return type && axisPointerClazz[type];\n      };\n      AxisView.type = 'axis';\n      return AxisView;\n    }(ComponentView);\n\n    var inner$6 = makeInner();\n    function rectCoordAxisBuildSplitArea(axisView, axisGroup, axisModel, gridModel) {\n      var axis = axisModel.axis;\n      if (axis.scale.isBlank()) {\n        return;\n      }\n      // TODO: TYPE\n      var splitAreaModel = axisModel.getModel('splitArea');\n      var areaStyleModel = splitAreaModel.getModel('areaStyle');\n      var areaColors = areaStyleModel.get('color');\n      var gridRect = gridModel.coordinateSystem.getRect();\n      var ticksCoords = axis.getTicksCoords({\n        tickModel: splitAreaModel,\n        clamp: true\n      });\n      if (!ticksCoords.length) {\n        return;\n      }\n      // For Making appropriate splitArea animation, the color and anid\n      // should be corresponding to previous one if possible.\n      var areaColorsLen = areaColors.length;\n      var lastSplitAreaColors = inner$6(axisView).splitAreaColors;\n      var newSplitAreaColors = createHashMap();\n      var colorIndex = 0;\n      if (lastSplitAreaColors) {\n        for (var i = 0; i < ticksCoords.length; i++) {\n          var cIndex = lastSplitAreaColors.get(ticksCoords[i].tickValue);\n          if (cIndex != null) {\n            colorIndex = (cIndex + (areaColorsLen - 1) * i) % areaColorsLen;\n            break;\n          }\n        }\n      }\n      var prev = axis.toGlobalCoord(ticksCoords[0].coord);\n      var areaStyle = areaStyleModel.getAreaStyle();\n      areaColors = isArray(areaColors) ? areaColors : [areaColors];\n      for (var i = 1; i < ticksCoords.length; i++) {\n        var tickCoord = axis.toGlobalCoord(ticksCoords[i].coord);\n        var x = void 0;\n        var y = void 0;\n        var width = void 0;\n        var height = void 0;\n        if (axis.isHorizontal()) {\n          x = prev;\n          y = gridRect.y;\n          width = tickCoord - x;\n          height = gridRect.height;\n          prev = x + width;\n        } else {\n          x = gridRect.x;\n          y = prev;\n          width = gridRect.width;\n          height = tickCoord - y;\n          prev = y + height;\n        }\n        var tickValue = ticksCoords[i - 1].tickValue;\n        tickValue != null && newSplitAreaColors.set(tickValue, colorIndex);\n        axisGroup.add(new Rect({\n          anid: tickValue != null ? 'area_' + tickValue : null,\n          shape: {\n            x: x,\n            y: y,\n            width: width,\n            height: height\n          },\n          style: defaults({\n            fill: areaColors[colorIndex]\n          }, areaStyle),\n          autoBatch: true,\n          silent: true\n        }));\n        colorIndex = (colorIndex + 1) % areaColorsLen;\n      }\n      inner$6(axisView).splitAreaColors = newSplitAreaColors;\n    }\n    function rectCoordAxisHandleRemove(axisView) {\n      inner$6(axisView).splitAreaColors = null;\n    }\n\n    var axisBuilderAttrs = ['axisLine', 'axisTickLabel', 'axisName'];\n    var selfBuilderAttrs = ['splitArea', 'splitLine', 'minorSplitLine'];\n    var CartesianAxisView = /** @class */function (_super) {\n      __extends(CartesianAxisView, _super);\n      function CartesianAxisView() {\n        var _this = _super !== null && _super.apply(this, arguments) || this;\n        _this.type = CartesianAxisView.type;\n        _this.axisPointerClass = 'CartesianAxisPointer';\n        return _this;\n      }\n      /**\r\n       * @override\r\n       */\n      CartesianAxisView.prototype.render = function (axisModel, ecModel, api, payload) {\n        this.group.removeAll();\n        var oldAxisGroup = this._axisGroup;\n        this._axisGroup = new Group();\n        this.group.add(this._axisGroup);\n        if (!axisModel.get('show')) {\n          return;\n        }\n        var gridModel = axisModel.getCoordSysModel();\n        var layout = layout$1(gridModel, axisModel);\n        var axisBuilder = new AxisBuilder(axisModel, extend({\n          handleAutoShown: function (elementType) {\n            var cartesians = gridModel.coordinateSystem.getCartesians();\n            for (var i = 0; i < cartesians.length; i++) {\n              if (isIntervalOrLogScale(cartesians[i].getOtherAxis(axisModel.axis).scale)) {\n                // Still show axis tick or axisLine if other axis is value / log\n                return true;\n              }\n            }\n            // Not show axisTick or axisLine if other axis is category / time\n            return false;\n          }\n        }, layout));\n        each(axisBuilderAttrs, axisBuilder.add, axisBuilder);\n        this._axisGroup.add(axisBuilder.getGroup());\n        each(selfBuilderAttrs, function (name) {\n          if (axisModel.get([name, 'show'])) {\n            axisElementBuilders[name](this, this._axisGroup, axisModel, gridModel);\n          }\n        }, this);\n        // THIS is a special case for bar racing chart.\n        // Update the axis label from the natural initial layout to\n        // sorted layout should has no animation.\n        var isInitialSortFromBarRacing = payload && payload.type === 'changeAxisOrder' && payload.isInitSort;\n        if (!isInitialSortFromBarRacing) {\n          groupTransition(oldAxisGroup, this._axisGroup, axisModel);\n        }\n        _super.prototype.render.call(this, axisModel, ecModel, api, payload);\n      };\n      CartesianAxisView.prototype.remove = function () {\n        rectCoordAxisHandleRemove(this);\n      };\n      CartesianAxisView.type = 'cartesianAxis';\n      return CartesianAxisView;\n    }(AxisView);\n    var axisElementBuilders = {\n      splitLine: function (axisView, axisGroup, axisModel, gridModel) {\n        var axis = axisModel.axis;\n        if (axis.scale.isBlank()) {\n          return;\n        }\n        var splitLineModel = axisModel.getModel('splitLine');\n        var lineStyleModel = splitLineModel.getModel('lineStyle');\n        var lineColors = lineStyleModel.get('color');\n        var showMinLine = splitLineModel.get('showMinLine') !== false;\n        var showMaxLine = splitLineModel.get('showMaxLine') !== false;\n        lineColors = isArray(lineColors) ? lineColors : [lineColors];\n        var gridRect = gridModel.coordinateSystem.getRect();\n        var isHorizontal = axis.isHorizontal();\n        var lineCount = 0;\n        var ticksCoords = axis.getTicksCoords({\n          tickModel: splitLineModel\n        });\n        var p1 = [];\n        var p2 = [];\n        var lineStyle = lineStyleModel.getLineStyle();\n        for (var i = 0; i < ticksCoords.length; i++) {\n          var tickCoord = axis.toGlobalCoord(ticksCoords[i].coord);\n          if (i === 0 && !showMinLine || i === ticksCoords.length - 1 && !showMaxLine) {\n            continue;\n          }\n          var tickValue = ticksCoords[i].tickValue;\n          if (isHorizontal) {\n            p1[0] = tickCoord;\n            p1[1] = gridRect.y;\n            p2[0] = tickCoord;\n            p2[1] = gridRect.y + gridRect.height;\n          } else {\n            p1[0] = gridRect.x;\n            p1[1] = tickCoord;\n            p2[0] = gridRect.x + gridRect.width;\n            p2[1] = tickCoord;\n          }\n          var colorIndex = lineCount++ % lineColors.length;\n          var line = new Line({\n            anid: tickValue != null ? 'line_' + tickValue : null,\n            autoBatch: true,\n            shape: {\n              x1: p1[0],\n              y1: p1[1],\n              x2: p2[0],\n              y2: p2[1]\n            },\n            style: defaults({\n              stroke: lineColors[colorIndex]\n            }, lineStyle),\n            silent: true\n          });\n          subPixelOptimizeLine$1(line.shape, lineStyle.lineWidth);\n          axisGroup.add(line);\n        }\n      },\n      minorSplitLine: function (axisView, axisGroup, axisModel, gridModel) {\n        var axis = axisModel.axis;\n        var minorSplitLineModel = axisModel.getModel('minorSplitLine');\n        var lineStyleModel = minorSplitLineModel.getModel('lineStyle');\n        var gridRect = gridModel.coordinateSystem.getRect();\n        var isHorizontal = axis.isHorizontal();\n        var minorTicksCoords = axis.getMinorTicksCoords();\n        if (!minorTicksCoords.length) {\n          return;\n        }\n        var p1 = [];\n        var p2 = [];\n        var lineStyle = lineStyleModel.getLineStyle();\n        for (var i = 0; i < minorTicksCoords.length; i++) {\n          for (var k = 0; k < minorTicksCoords[i].length; k++) {\n            var tickCoord = axis.toGlobalCoord(minorTicksCoords[i][k].coord);\n            if (isHorizontal) {\n              p1[0] = tickCoord;\n              p1[1] = gridRect.y;\n              p2[0] = tickCoord;\n              p2[1] = gridRect.y + gridRect.height;\n            } else {\n              p1[0] = gridRect.x;\n              p1[1] = tickCoord;\n              p2[0] = gridRect.x + gridRect.width;\n              p2[1] = tickCoord;\n            }\n            var line = new Line({\n              anid: 'minor_line_' + minorTicksCoords[i][k].tickValue,\n              autoBatch: true,\n              shape: {\n                x1: p1[0],\n                y1: p1[1],\n                x2: p2[0],\n                y2: p2[1]\n              },\n              style: lineStyle,\n              silent: true\n            });\n            subPixelOptimizeLine$1(line.shape, lineStyle.lineWidth);\n            axisGroup.add(line);\n          }\n        }\n      },\n      splitArea: function (axisView, axisGroup, axisModel, gridModel) {\n        rectCoordAxisBuildSplitArea(axisView, axisGroup, axisModel, gridModel);\n      }\n    };\n    var CartesianXAxisView = /** @class */function (_super) {\n      __extends(CartesianXAxisView, _super);\n      function CartesianXAxisView() {\n        var _this = _super !== null && _super.apply(this, arguments) || this;\n        _this.type = CartesianXAxisView.type;\n        return _this;\n      }\n      CartesianXAxisView.type = 'xAxis';\n      return CartesianXAxisView;\n    }(CartesianAxisView);\n    var CartesianYAxisView = /** @class */function (_super) {\n      __extends(CartesianYAxisView, _super);\n      function CartesianYAxisView() {\n        var _this = _super !== null && _super.apply(this, arguments) || this;\n        _this.type = CartesianXAxisView.type;\n        return _this;\n      }\n      CartesianYAxisView.type = 'yAxis';\n      return CartesianYAxisView;\n    }(CartesianAxisView);\n\n    // Grid view\n    var GridView = /** @class */function (_super) {\n      __extends(GridView, _super);\n      function GridView() {\n        var _this = _super !== null && _super.apply(this, arguments) || this;\n        _this.type = 'grid';\n        return _this;\n      }\n      GridView.prototype.render = function (gridModel, ecModel) {\n        this.group.removeAll();\n        if (gridModel.get('show')) {\n          this.group.add(new Rect({\n            shape: gridModel.coordinateSystem.getRect(),\n            style: defaults({\n              fill: gridModel.get('backgroundColor')\n            }, gridModel.getItemStyle()),\n            silent: true,\n            z2: -1\n          }));\n        }\n      };\n      GridView.type = 'grid';\n      return GridView;\n    }(ComponentView);\n    var extraOption = {\n      // gridIndex: 0,\n      // gridId: '',\n      offset: 0\n    };\n    function install$5(registers) {\n      registers.registerComponentView(GridView);\n      registers.registerComponentModel(GridModel);\n      registers.registerCoordinateSystem('cartesian2d', Grid);\n      axisModelCreator(registers, 'x', CartesianAxisModel, extraOption);\n      axisModelCreator(registers, 'y', CartesianAxisModel, extraOption);\n      registers.registerComponentView(CartesianXAxisView);\n      registers.registerComponentView(CartesianYAxisView);\n      registers.registerPreprocessor(function (option) {\n        // Only create grid when need\n        if (option.xAxis && option.yAxis && !option.grid) {\n          option.grid = {};\n        }\n      });\n    }\n\n    function install$6(registers) {\n      // In case developer forget to include grid component\n      use(install$5);\n      registers.registerSeriesModel(ScatterSeriesModel);\n      registers.registerChartView(ScatterView);\n      registers.registerLayout(pointsLayout('scatter'));\n    }\n\n    function radarLayout(ecModel) {\n      ecModel.eachSeriesByType('radar', function (seriesModel) {\n        var data = seriesModel.getData();\n        var points = [];\n        var coordSys = seriesModel.coordinateSystem;\n        if (!coordSys) {\n          return;\n        }\n        var axes = coordSys.getIndicatorAxes();\n        each(axes, function (axis, axisIndex) {\n          data.each(data.mapDimension(axes[axisIndex].dim), function (val, dataIndex) {\n            points[dataIndex] = points[dataIndex] || [];\n            var point = coordSys.dataToPoint(val, axisIndex);\n            points[dataIndex][axisIndex] = isValidPoint(point) ? point : getValueMissingPoint(coordSys);\n          });\n        });\n        // Close polygon\n        data.each(function (idx) {\n          // TODO\n          // Is it appropriate to connect to the next data when some data is missing?\n          // Or, should trade it like `connectNull` in line chart?\n          var firstPoint = find(points[idx], function (point) {\n            return isValidPoint(point);\n          }) || getValueMissingPoint(coordSys);\n          // Copy the first actual point to the end of the array\n          points[idx].push(firstPoint.slice());\n          data.setItemLayout(idx, points[idx]);\n        });\n      });\n    }\n    function isValidPoint(point) {\n      return !isNaN(point[0]) && !isNaN(point[1]);\n    }\n    function getValueMissingPoint(coordSys) {\n      // It is error-prone to input [NaN, NaN] into polygon, polygon.\n      // (probably cause problem when refreshing or animating)\n      return [coordSys.cx, coordSys.cy];\n    }\n\n    function radarBackwardCompat(option) {\n      var polarOptArr = option.polar;\n      if (polarOptArr) {\n        if (!isArray(polarOptArr)) {\n          polarOptArr = [polarOptArr];\n        }\n        var polarNotRadar_1 = [];\n        each(polarOptArr, function (polarOpt, idx) {\n          if (polarOpt.indicator) {\n            if (polarOpt.type && !polarOpt.shape) {\n              polarOpt.shape = polarOpt.type;\n            }\n            option.radar = option.radar || [];\n            if (!isArray(option.radar)) {\n              option.radar = [option.radar];\n            }\n            option.radar.push(polarOpt);\n          } else {\n            polarNotRadar_1.push(polarOpt);\n          }\n        });\n        option.polar = polarNotRadar_1;\n      }\n      each(option.series, function (seriesOpt) {\n        if (seriesOpt && seriesOpt.type === 'radar' && seriesOpt.polarIndex) {\n          seriesOpt.radarIndex = seriesOpt.polarIndex;\n        }\n      });\n    }\n\n    var RadarView = /** @class */function (_super) {\n      __extends(RadarView, _super);\n      function RadarView() {\n        var _this = _super !== null && _super.apply(this, arguments) || this;\n        _this.type = RadarView.type;\n        return _this;\n      }\n      RadarView.prototype.render = function (seriesModel, ecModel, api) {\n        var polar = seriesModel.coordinateSystem;\n        var group = this.group;\n        var data = seriesModel.getData();\n        var oldData = this._data;\n        function createSymbol$1(data, idx) {\n          var symbolType = data.getItemVisual(idx, 'symbol') || 'circle';\n          if (symbolType === 'none') {\n            return;\n          }\n          var symbolSize = normalizeSymbolSize(data.getItemVisual(idx, 'symbolSize'));\n          var symbolPath = createSymbol(symbolType, -1, -1, 2, 2);\n          var symbolRotate = data.getItemVisual(idx, 'symbolRotate') || 0;\n          symbolPath.attr({\n            style: {\n              strokeNoScale: true\n            },\n            z2: 100,\n            scaleX: symbolSize[0] / 2,\n            scaleY: symbolSize[1] / 2,\n            rotation: symbolRotate * Math.PI / 180 || 0\n          });\n          return symbolPath;\n        }\n        function updateSymbols(oldPoints, newPoints, symbolGroup, data, idx, isInit) {\n          // Simply rerender all\n          symbolGroup.removeAll();\n          for (var i = 0; i < newPoints.length - 1; i++) {\n            var symbolPath = createSymbol$1(data, idx);\n            if (symbolPath) {\n              symbolPath.__dimIdx = i;\n              if (oldPoints[i]) {\n                symbolPath.setPosition(oldPoints[i]);\n                graphic[isInit ? 'initProps' : 'updateProps'](symbolPath, {\n                  x: newPoints[i][0],\n                  y: newPoints[i][1]\n                }, seriesModel, idx);\n              } else {\n                symbolPath.setPosition(newPoints[i]);\n              }\n              symbolGroup.add(symbolPath);\n            }\n          }\n        }\n        function getInitialPoints(points) {\n          return map(points, function (pt) {\n            return [polar.cx, polar.cy];\n          });\n        }\n        data.diff(oldData).add(function (idx) {\n          var points = data.getItemLayout(idx);\n          if (!points) {\n            return;\n          }\n          var polygon = new Polygon();\n          var polyline = new Polyline();\n          var target = {\n            shape: {\n              points: points\n            }\n          };\n          polygon.shape.points = getInitialPoints(points);\n          polyline.shape.points = getInitialPoints(points);\n          initProps(polygon, target, seriesModel, idx);\n          initProps(polyline, target, seriesModel, idx);\n          var itemGroup = new Group();\n          var symbolGroup = new Group();\n          itemGroup.add(polyline);\n          itemGroup.add(polygon);\n          itemGroup.add(symbolGroup);\n          updateSymbols(polyline.shape.points, points, symbolGroup, data, idx, true);\n          data.setItemGraphicEl(idx, itemGroup);\n        }).update(function (newIdx, oldIdx) {\n          var itemGroup = oldData.getItemGraphicEl(oldIdx);\n          var polyline = itemGroup.childAt(0);\n          var polygon = itemGroup.childAt(1);\n          var symbolGroup = itemGroup.childAt(2);\n          var target = {\n            shape: {\n              points: data.getItemLayout(newIdx)\n            }\n          };\n          if (!target.shape.points) {\n            return;\n          }\n          updateSymbols(polyline.shape.points, target.shape.points, symbolGroup, data, newIdx, false);\n          saveOldStyle(polygon);\n          saveOldStyle(polyline);\n          updateProps(polyline, target, seriesModel);\n          updateProps(polygon, target, seriesModel);\n          data.setItemGraphicEl(newIdx, itemGroup);\n        }).remove(function (idx) {\n          group.remove(oldData.getItemGraphicEl(idx));\n        }).execute();\n        data.eachItemGraphicEl(function (itemGroup, idx) {\n          var itemModel = data.getItemModel(idx);\n          var polyline = itemGroup.childAt(0);\n          var polygon = itemGroup.childAt(1);\n          var symbolGroup = itemGroup.childAt(2);\n          // Radar uses the visual encoded from itemStyle.\n          var itemStyle = data.getItemVisual(idx, 'style');\n          var color = itemStyle.fill;\n          group.add(itemGroup);\n          polyline.useStyle(defaults(itemModel.getModel('lineStyle').getLineStyle(), {\n            fill: 'none',\n            stroke: color\n          }));\n          setStatesStylesFromModel(polyline, itemModel, 'lineStyle');\n          setStatesStylesFromModel(polygon, itemModel, 'areaStyle');\n          var areaStyleModel = itemModel.getModel('areaStyle');\n          var polygonIgnore = areaStyleModel.isEmpty() && areaStyleModel.parentModel.isEmpty();\n          polygon.ignore = polygonIgnore;\n          each(['emphasis', 'select', 'blur'], function (stateName) {\n            var stateModel = itemModel.getModel([stateName, 'areaStyle']);\n            var stateIgnore = stateModel.isEmpty() && stateModel.parentModel.isEmpty();\n            // Won't be ignore if normal state is not ignore.\n            polygon.ensureState(stateName).ignore = stateIgnore && polygonIgnore;\n          });\n          polygon.useStyle(defaults(areaStyleModel.getAreaStyle(), {\n            fill: color,\n            opacity: 0.7,\n            decal: itemStyle.decal\n          }));\n          var emphasisModel = itemModel.getModel('emphasis');\n          var itemHoverStyle = emphasisModel.getModel('itemStyle').getItemStyle();\n          symbolGroup.eachChild(function (symbolPath) {\n            if (symbolPath instanceof ZRImage) {\n              var pathStyle = symbolPath.style;\n              symbolPath.useStyle(extend({\n                // TODO other properties like x, y ?\n                image: pathStyle.image,\n                x: pathStyle.x,\n                y: pathStyle.y,\n                width: pathStyle.width,\n                height: pathStyle.height\n              }, itemStyle));\n            } else {\n              symbolPath.useStyle(itemStyle);\n              symbolPath.setColor(color);\n              symbolPath.style.strokeNoScale = true;\n            }\n            var pathEmphasisState = symbolPath.ensureState('emphasis');\n            pathEmphasisState.style = clone(itemHoverStyle);\n            var defaultText = data.getStore().get(data.getDimensionIndex(symbolPath.__dimIdx), idx);\n            (defaultText == null || isNaN(defaultText)) && (defaultText = '');\n            setLabelStyle(symbolPath, getLabelStatesModels(itemModel), {\n              labelFetcher: data.hostModel,\n              labelDataIndex: idx,\n              labelDimIndex: symbolPath.__dimIdx,\n              defaultText: defaultText,\n              inheritColor: color,\n              defaultOpacity: itemStyle.opacity\n            });\n          });\n          toggleHoverEmphasis(itemGroup, emphasisModel.get('focus'), emphasisModel.get('blurScope'), emphasisModel.get('disabled'));\n        });\n        this._data = data;\n      };\n      RadarView.prototype.remove = function () {\n        this.group.removeAll();\n        this._data = null;\n      };\n      RadarView.type = 'radar';\n      return RadarView;\n    }(ChartView);\n\n    var RadarSeriesModel = /** @class */function (_super) {\n      __extends(RadarSeriesModel, _super);\n      function RadarSeriesModel() {\n        var _this = _super !== null && _super.apply(this, arguments) || this;\n        _this.type = RadarSeriesModel.type;\n        _this.hasSymbolVisual = true;\n        return _this;\n      }\n      // Overwrite\n      RadarSeriesModel.prototype.init = function (option) {\n        _super.prototype.init.apply(this, arguments);\n        // Enable legend selection for each data item\n        // Use a function instead of direct access because data reference may changed\n        this.legendVisualProvider = new LegendVisualProvider(bind(this.getData, this), bind(this.getRawData, this));\n      };\n      RadarSeriesModel.prototype.getInitialData = function (option, ecModel) {\n        return createSeriesDataSimply(this, {\n          generateCoord: 'indicator_',\n          generateCoordCount: Infinity\n        });\n      };\n      RadarSeriesModel.prototype.formatTooltip = function (dataIndex, multipleSeries, dataType) {\n        var data = this.getData();\n        var coordSys = this.coordinateSystem;\n        var indicatorAxes = coordSys.getIndicatorAxes();\n        var name = this.getData().getName(dataIndex);\n        var nameToDisplay = name === '' ? this.name : name;\n        var markerColor = retrieveVisualColorForTooltipMarker(this, dataIndex);\n        return createTooltipMarkup('section', {\n          header: nameToDisplay,\n          sortBlocks: true,\n          blocks: map(indicatorAxes, function (axis) {\n            var val = data.get(data.mapDimension(axis.dim), dataIndex);\n            return createTooltipMarkup('nameValue', {\n              markerType: 'subItem',\n              markerColor: markerColor,\n              name: axis.name,\n              value: val,\n              sortParam: val\n            });\n          })\n        });\n      };\n      RadarSeriesModel.prototype.getTooltipPosition = function (dataIndex) {\n        if (dataIndex != null) {\n          var data_1 = this.getData();\n          var coordSys = this.coordinateSystem;\n          var values = data_1.getValues(map(coordSys.dimensions, function (dim) {\n            return data_1.mapDimension(dim);\n          }), dataIndex);\n          for (var i = 0, len = values.length; i < len; i++) {\n            if (!isNaN(values[i])) {\n              var indicatorAxes = coordSys.getIndicatorAxes();\n              return coordSys.coordToPoint(indicatorAxes[i].dataToCoord(values[i]), i);\n            }\n          }\n        }\n      };\n      RadarSeriesModel.type = 'series.radar';\n      RadarSeriesModel.dependencies = ['radar'];\n      RadarSeriesModel.defaultOption = {\n        // zlevel: 0,\n        z: 2,\n        colorBy: 'data',\n        coordinateSystem: 'radar',\n        legendHoverLink: true,\n        radarIndex: 0,\n        lineStyle: {\n          width: 2,\n          type: 'solid',\n          join: 'round'\n        },\n        label: {\n          position: 'top'\n        },\n        // areaStyle: {\n        // },\n        // itemStyle: {}\n        symbolSize: 8\n        // symbolRotate: null\n      };\n      return RadarSeriesModel;\n    }(SeriesModel);\n\n    var valueAxisDefault = axisDefault.value;\n    function defaultsShow(opt, show) {\n      return defaults({\n        show: show\n      }, opt);\n    }\n    var RadarModel = /** @class */function (_super) {\n      __extends(RadarModel, _super);\n      function RadarModel() {\n        var _this = _super !== null && _super.apply(this, arguments) || this;\n        _this.type = RadarModel.type;\n        return _this;\n      }\n      RadarModel.prototype.optionUpdated = function () {\n        var boundaryGap = this.get('boundaryGap');\n        var splitNumber = this.get('splitNumber');\n        var scale = this.get('scale');\n        var axisLine = this.get('axisLine');\n        var axisTick = this.get('axisTick');\n        // let axisType = this.get('axisType');\n        var axisLabel = this.get('axisLabel');\n        var nameTextStyle = this.get('axisName');\n        var showName = this.get(['axisName', 'show']);\n        var nameFormatter = this.get(['axisName', 'formatter']);\n        var nameGap = this.get('axisNameGap');\n        var triggerEvent = this.get('triggerEvent');\n        var indicatorModels = map(this.get('indicator') || [], function (indicatorOpt) {\n          // PENDING\n          if (indicatorOpt.max != null && indicatorOpt.max > 0 && !indicatorOpt.min) {\n            indicatorOpt.min = 0;\n          } else if (indicatorOpt.min != null && indicatorOpt.min < 0 && !indicatorOpt.max) {\n            indicatorOpt.max = 0;\n          }\n          var iNameTextStyle = nameTextStyle;\n          if (indicatorOpt.color != null) {\n            iNameTextStyle = defaults({\n              color: indicatorOpt.color\n            }, nameTextStyle);\n          }\n          // Use same configuration\n          var innerIndicatorOpt = merge(clone(indicatorOpt), {\n            boundaryGap: boundaryGap,\n            splitNumber: splitNumber,\n            scale: scale,\n            axisLine: axisLine,\n            axisTick: axisTick,\n            // axisType: axisType,\n            axisLabel: axisLabel,\n            // Compatible with 2 and use text\n            name: indicatorOpt.text,\n            showName: showName,\n            nameLocation: 'end',\n            nameGap: nameGap,\n            // min: 0,\n            nameTextStyle: iNameTextStyle,\n            triggerEvent: triggerEvent\n          }, false);\n          if (isString(nameFormatter)) {\n            var indName = innerIndicatorOpt.name;\n            innerIndicatorOpt.name = nameFormatter.replace('{value}', indName != null ? indName : '');\n          } else if (isFunction(nameFormatter)) {\n            innerIndicatorOpt.name = nameFormatter(innerIndicatorOpt.name, innerIndicatorOpt);\n          }\n          var model = new Model(innerIndicatorOpt, null, this.ecModel);\n          mixin(model, AxisModelCommonMixin.prototype);\n          // For triggerEvent.\n          model.mainType = 'radar';\n          model.componentIndex = this.componentIndex;\n          return model;\n        }, this);\n        this._indicatorModels = indicatorModels;\n      };\n      RadarModel.prototype.getIndicatorModels = function () {\n        return this._indicatorModels;\n      };\n      RadarModel.type = 'radar';\n      RadarModel.defaultOption = {\n        // zlevel: 0,\n        z: 0,\n        center: ['50%', '50%'],\n        radius: '75%',\n        startAngle: 90,\n        axisName: {\n          show: true\n          // formatter: null\n          // textStyle: {}\n        },\n        boundaryGap: [0, 0],\n        splitNumber: 5,\n        axisNameGap: 15,\n        scale: false,\n        // Polygon or circle\n        shape: 'polygon',\n        axisLine: merge({\n          lineStyle: {\n            color: '#bbb'\n          }\n        }, valueAxisDefault.axisLine),\n        axisLabel: defaultsShow(valueAxisDefault.axisLabel, false),\n        axisTick: defaultsShow(valueAxisDefault.axisTick, false),\n        // axisType: 'value',\n        splitLine: defaultsShow(valueAxisDefault.splitLine, true),\n        splitArea: defaultsShow(valueAxisDefault.splitArea, true),\n        // {text, min, max}\n        indicator: []\n      };\n      return RadarModel;\n    }(ComponentModel);\n\n    var axisBuilderAttrs$1 = ['axisLine', 'axisTickLabel', 'axisName'];\n    var RadarView$1 = /** @class */function (_super) {\n      __extends(RadarView, _super);\n      function RadarView() {\n        var _this = _super !== null && _super.apply(this, arguments) || this;\n        _this.type = RadarView.type;\n        return _this;\n      }\n      RadarView.prototype.render = function (radarModel, ecModel, api) {\n        var group = this.group;\n        group.removeAll();\n        this._buildAxes(radarModel);\n        this._buildSplitLineAndArea(radarModel);\n      };\n      RadarView.prototype._buildAxes = function (radarModel) {\n        var radar = radarModel.coordinateSystem;\n        var indicatorAxes = radar.getIndicatorAxes();\n        var axisBuilders = map(indicatorAxes, function (indicatorAxis) {\n          var axisName = indicatorAxis.model.get('showName') ? indicatorAxis.name : ''; // hide name\n          var axisBuilder = new AxisBuilder(indicatorAxis.model, {\n            axisName: axisName,\n            position: [radar.cx, radar.cy],\n            rotation: indicatorAxis.angle,\n            labelDirection: -1,\n            tickDirection: -1,\n            nameDirection: 1\n          });\n          return axisBuilder;\n        });\n        each(axisBuilders, function (axisBuilder) {\n          each(axisBuilderAttrs$1, axisBuilder.add, axisBuilder);\n          this.group.add(axisBuilder.getGroup());\n        }, this);\n      };\n      RadarView.prototype._buildSplitLineAndArea = function (radarModel) {\n        var radar = radarModel.coordinateSystem;\n        var indicatorAxes = radar.getIndicatorAxes();\n        if (!indicatorAxes.length) {\n          return;\n        }\n        var shape = radarModel.get('shape');\n        var splitLineModel = radarModel.getModel('splitLine');\n        var splitAreaModel = radarModel.getModel('splitArea');\n        var lineStyleModel = splitLineModel.getModel('lineStyle');\n        var areaStyleModel = splitAreaModel.getModel('areaStyle');\n        var showSplitLine = splitLineModel.get('show');\n        var showSplitArea = splitAreaModel.get('show');\n        var splitLineColors = lineStyleModel.get('color');\n        var splitAreaColors = areaStyleModel.get('color');\n        var splitLineColorsArr = isArray(splitLineColors) ? splitLineColors : [splitLineColors];\n        var splitAreaColorsArr = isArray(splitAreaColors) ? splitAreaColors : [splitAreaColors];\n        var splitLines = [];\n        var splitAreas = [];\n        function getColorIndex(areaOrLine, areaOrLineColorList, idx) {\n          var colorIndex = idx % areaOrLineColorList.length;\n          areaOrLine[colorIndex] = areaOrLine[colorIndex] || [];\n          return colorIndex;\n        }\n        if (shape === 'circle') {\n          var ticksRadius = indicatorAxes[0].getTicksCoords();\n          var cx = radar.cx;\n          var cy = radar.cy;\n          for (var i = 0; i < ticksRadius.length; i++) {\n            if (showSplitLine) {\n              var colorIndex = getColorIndex(splitLines, splitLineColorsArr, i);\n              splitLines[colorIndex].push(new Circle({\n                shape: {\n                  cx: cx,\n                  cy: cy,\n                  r: ticksRadius[i].coord\n                }\n              }));\n            }\n            if (showSplitArea && i < ticksRadius.length - 1) {\n              var colorIndex = getColorIndex(splitAreas, splitAreaColorsArr, i);\n              splitAreas[colorIndex].push(new Ring({\n                shape: {\n                  cx: cx,\n                  cy: cy,\n                  r0: ticksRadius[i].coord,\n                  r: ticksRadius[i + 1].coord\n                }\n              }));\n            }\n          }\n        }\n        // Polyyon\n        else {\n          var realSplitNumber_1;\n          var axesTicksPoints = map(indicatorAxes, function (indicatorAxis, idx) {\n            var ticksCoords = indicatorAxis.getTicksCoords();\n            realSplitNumber_1 = realSplitNumber_1 == null ? ticksCoords.length - 1 : Math.min(ticksCoords.length - 1, realSplitNumber_1);\n            return map(ticksCoords, function (tickCoord) {\n              return radar.coordToPoint(tickCoord.coord, idx);\n            });\n          });\n          var prevPoints = [];\n          for (var i = 0; i <= realSplitNumber_1; i++) {\n            var points = [];\n            for (var j = 0; j < indicatorAxes.length; j++) {\n              points.push(axesTicksPoints[j][i]);\n            }\n            // Close\n            if (points[0]) {\n              points.push(points[0].slice());\n            } else {\n              if (\"development\" !== 'production') {\n                console.error('Can\\'t draw value axis ' + i);\n              }\n            }\n            if (showSplitLine) {\n              var colorIndex = getColorIndex(splitLines, splitLineColorsArr, i);\n              splitLines[colorIndex].push(new Polyline({\n                shape: {\n                  points: points\n                }\n              }));\n            }\n            if (showSplitArea && prevPoints) {\n              var colorIndex = getColorIndex(splitAreas, splitAreaColorsArr, i - 1);\n              splitAreas[colorIndex].push(new Polygon({\n                shape: {\n                  points: points.concat(prevPoints)\n                }\n              }));\n            }\n            prevPoints = points.slice().reverse();\n          }\n        }\n        var lineStyle = lineStyleModel.getLineStyle();\n        var areaStyle = areaStyleModel.getAreaStyle();\n        // Add splitArea before splitLine\n        each(splitAreas, function (splitAreas, idx) {\n          this.group.add(mergePath$1(splitAreas, {\n            style: defaults({\n              stroke: 'none',\n              fill: splitAreaColorsArr[idx % splitAreaColorsArr.length]\n            }, areaStyle),\n            silent: true\n          }));\n        }, this);\n        each(splitLines, function (splitLines, idx) {\n          this.group.add(mergePath$1(splitLines, {\n            style: defaults({\n              fill: 'none',\n              stroke: splitLineColorsArr[idx % splitLineColorsArr.length]\n            }, lineStyle),\n            silent: true\n          }));\n        }, this);\n      };\n      RadarView.type = 'radar';\n      return RadarView;\n    }(ComponentView);\n\n    var IndicatorAxis = /** @class */function (_super) {\n      __extends(IndicatorAxis, _super);\n      function IndicatorAxis(dim, scale, radiusExtent) {\n        var _this = _super.call(this, dim, scale, radiusExtent) || this;\n        _this.type = 'value';\n        _this.angle = 0;\n        _this.name = '';\n        return _this;\n      }\n      return IndicatorAxis;\n    }(Axis);\n\n    var Radar = /** @class */function () {\n      function Radar(radarModel, ecModel, api) {\n        /**\r\n         *\r\n         * Radar dimensions\r\n         */\n        this.dimensions = [];\n        this._model = radarModel;\n        this._indicatorAxes = map(radarModel.getIndicatorModels(), function (indicatorModel, idx) {\n          var dim = 'indicator_' + idx;\n          var indicatorAxis = new IndicatorAxis(dim, new IntervalScale()\n          // (indicatorModel.get('axisType') === 'log') ? new LogScale() : new IntervalScale()\n          );\n          indicatorAxis.name = indicatorModel.get('name');\n          // Inject model and axis\n          indicatorAxis.model = indicatorModel;\n          indicatorModel.axis = indicatorAxis;\n          this.dimensions.push(dim);\n          return indicatorAxis;\n        }, this);\n        this.resize(radarModel, api);\n      }\n      Radar.prototype.getIndicatorAxes = function () {\n        return this._indicatorAxes;\n      };\n      Radar.prototype.dataToPoint = function (value, indicatorIndex) {\n        var indicatorAxis = this._indicatorAxes[indicatorIndex];\n        return this.coordToPoint(indicatorAxis.dataToCoord(value), indicatorIndex);\n      };\n      // TODO: API should be coordToPoint([coord, indicatorIndex])\n      Radar.prototype.coordToPoint = function (coord, indicatorIndex) {\n        var indicatorAxis = this._indicatorAxes[indicatorIndex];\n        var angle = indicatorAxis.angle;\n        var x = this.cx + coord * Math.cos(angle);\n        var y = this.cy - coord * Math.sin(angle);\n        return [x, y];\n      };\n      Radar.prototype.pointToData = function (pt) {\n        var dx = pt[0] - this.cx;\n        var dy = pt[1] - this.cy;\n        var radius = Math.sqrt(dx * dx + dy * dy);\n        dx /= radius;\n        dy /= radius;\n        var radian = Math.atan2(-dy, dx);\n        // Find the closest angle\n        // FIXME index can calculated directly\n        var minRadianDiff = Infinity;\n        var closestAxis;\n        var closestAxisIdx = -1;\n        for (var i = 0; i < this._indicatorAxes.length; i++) {\n          var indicatorAxis = this._indicatorAxes[i];\n          var diff = Math.abs(radian - indicatorAxis.angle);\n          if (diff < minRadianDiff) {\n            closestAxis = indicatorAxis;\n            closestAxisIdx = i;\n            minRadianDiff = diff;\n          }\n        }\n        return [closestAxisIdx, +(closestAxis && closestAxis.coordToData(radius))];\n      };\n      Radar.prototype.resize = function (radarModel, api) {\n        var center = radarModel.get('center');\n        var viewWidth = api.getWidth();\n        var viewHeight = api.getHeight();\n        var viewSize = Math.min(viewWidth, viewHeight) / 2;\n        this.cx = parsePercent$1(center[0], viewWidth);\n        this.cy = parsePercent$1(center[1], viewHeight);\n        this.startAngle = radarModel.get('startAngle') * Math.PI / 180;\n        // radius may be single value like `20`, `'80%'`, or array like `[10, '80%']`\n        var radius = radarModel.get('radius');\n        if (isString(radius) || isNumber(radius)) {\n          radius = [0, radius];\n        }\n        this.r0 = parsePercent$1(radius[0], viewSize);\n        this.r = parsePercent$1(radius[1], viewSize);\n        each(this._indicatorAxes, function (indicatorAxis, idx) {\n          indicatorAxis.setExtent(this.r0, this.r);\n          var angle = this.startAngle + idx * Math.PI * 2 / this._indicatorAxes.length;\n          // Normalize to [-PI, PI]\n          angle = Math.atan2(Math.sin(angle), Math.cos(angle));\n          indicatorAxis.angle = angle;\n        }, this);\n      };\n      Radar.prototype.update = function (ecModel, api) {\n        var indicatorAxes = this._indicatorAxes;\n        var radarModel = this._model;\n        each(indicatorAxes, function (indicatorAxis) {\n          indicatorAxis.scale.setExtent(Infinity, -Infinity);\n        });\n        ecModel.eachSeriesByType('radar', function (radarSeries, idx) {\n          if (radarSeries.get('coordinateSystem') !== 'radar'\n          // @ts-ignore\n          || ecModel.getComponent('radar', radarSeries.get('radarIndex')) !== radarModel) {\n            return;\n          }\n          var data = radarSeries.getData();\n          each(indicatorAxes, function (indicatorAxis) {\n            indicatorAxis.scale.unionExtentFromData(data, data.mapDimension(indicatorAxis.dim));\n          });\n        }, this);\n        var splitNumber = radarModel.get('splitNumber');\n        var dummyScale = new IntervalScale();\n        dummyScale.setExtent(0, splitNumber);\n        dummyScale.setInterval(1);\n        // Force all the axis fixing the maxSplitNumber.\n        each(indicatorAxes, function (indicatorAxis, idx) {\n          alignScaleTicks(indicatorAxis.scale, indicatorAxis.model, dummyScale);\n        });\n      };\n      Radar.prototype.convertToPixel = function (ecModel, finder, value) {\n        console.warn('Not implemented.');\n        return null;\n      };\n      Radar.prototype.convertFromPixel = function (ecModel, finder, pixel) {\n        console.warn('Not implemented.');\n        return null;\n      };\n      Radar.prototype.containPoint = function (point) {\n        console.warn('Not implemented.');\n        return false;\n      };\n      Radar.create = function (ecModel, api) {\n        var radarList = [];\n        ecModel.eachComponent('radar', function (radarModel) {\n          var radar = new Radar(radarModel, ecModel, api);\n          radarList.push(radar);\n          radarModel.coordinateSystem = radar;\n        });\n        ecModel.eachSeriesByType('radar', function (radarSeries) {\n          if (radarSeries.get('coordinateSystem') === 'radar') {\n            // Inject coordinate system\n            // @ts-ignore\n            radarSeries.coordinateSystem = radarList[radarSeries.get('radarIndex') || 0];\n          }\n        });\n        return radarList;\n      };\n      /**\r\n       * Radar dimensions is based on the data\r\n       */\n      Radar.dimensions = [];\n      return Radar;\n    }();\n\n    function install$7(registers) {\n      registers.registerCoordinateSystem('radar', Radar);\n      registers.registerComponentModel(RadarModel);\n      registers.registerComponentView(RadarView$1);\n      registers.registerVisual({\n        seriesType: 'radar',\n        reset: function (seriesModel) {\n          var data = seriesModel.getData();\n          // itemVisual symbol is for selected data\n          data.each(function (idx) {\n            data.setItemVisual(idx, 'legendIcon', 'roundRect');\n          });\n          // visual is for unselected data\n          data.setVisual('legendIcon', 'roundRect');\n        }\n      });\n    }\n\n    function install$8(registers) {\n      use(install$7);\n      registers.registerChartView(RadarView);\n      registers.registerSeriesModel(RadarSeriesModel);\n      registers.registerLayout(radarLayout);\n      registers.registerProcessor(dataFilter('radar'));\n      registers.registerPreprocessor(radarBackwardCompat);\n    }\n\n    var ATTR = '\\0_ec_interaction_mutex';\n    function take(zr, resourceKey, userKey) {\n      var store = getStore(zr);\n      store[resourceKey] = userKey;\n    }\n    function release(zr, resourceKey, userKey) {\n      var store = getStore(zr);\n      var uKey = store[resourceKey];\n      if (uKey === userKey) {\n        store[resourceKey] = null;\n      }\n    }\n    function isTaken(zr, resourceKey) {\n      return !!getStore(zr)[resourceKey];\n    }\n    function getStore(zr) {\n      return zr[ATTR] || (zr[ATTR] = {});\n    }\n    /**\r\n     * payload: {\r\n     *     type: 'takeGlobalCursor',\r\n     *     key: 'dataZoomSelect', or 'brush', or ...,\r\n     *         If no userKey, release global cursor.\r\n     * }\r\n     */\n    // TODO: SELF REGISTERED.\n    registerAction({\n      type: 'takeGlobalCursor',\n      event: 'globalCursorTaken',\n      update: 'update'\n    }, noop);\n\n    var RoamController = /** @class */function (_super) {\n      __extends(RoamController, _super);\n      function RoamController(zr) {\n        var _this = _super.call(this) || this;\n        _this._zr = zr;\n        // Avoid two roamController bind the same handler\n        var mousedownHandler = bind(_this._mousedownHandler, _this);\n        var mousemoveHandler = bind(_this._mousemoveHandler, _this);\n        var mouseupHandler = bind(_this._mouseupHandler, _this);\n        var mousewheelHandler = bind(_this._mousewheelHandler, _this);\n        var pinchHandler = bind(_this._pinchHandler, _this);\n        /**\r\n         * Notice: only enable needed types. For example, if 'zoom'\r\n         * is not needed, 'zoom' should not be enabled, otherwise\r\n         * default mousewheel behaviour (scroll page) will be disabled.\r\n         */\n        _this.enable = function (controlType, opt) {\n          // Disable previous first\n          this.disable();\n          this._opt = defaults(clone(opt) || {}, {\n            zoomOnMouseWheel: true,\n            moveOnMouseMove: true,\n            // By default, wheel do not trigger move.\n            moveOnMouseWheel: false,\n            preventDefaultMouseMove: true\n          });\n          if (controlType == null) {\n            controlType = true;\n          }\n          if (controlType === true || controlType === 'move' || controlType === 'pan') {\n            zr.on('mousedown', mousedownHandler);\n            zr.on('mousemove', mousemoveHandler);\n            zr.on('mouseup', mouseupHandler);\n          }\n          if (controlType === true || controlType === 'scale' || controlType === 'zoom') {\n            zr.on('mousewheel', mousewheelHandler);\n            zr.on('pinch', pinchHandler);\n          }\n        };\n        _this.disable = function () {\n          zr.off('mousedown', mousedownHandler);\n          zr.off('mousemove', mousemoveHandler);\n          zr.off('mouseup', mouseupHandler);\n          zr.off('mousewheel', mousewheelHandler);\n          zr.off('pinch', pinchHandler);\n        };\n        return _this;\n      }\n      RoamController.prototype.isDragging = function () {\n        return this._dragging;\n      };\n      RoamController.prototype.isPinching = function () {\n        return this._pinching;\n      };\n      RoamController.prototype.setPointerChecker = function (pointerChecker) {\n        this.pointerChecker = pointerChecker;\n      };\n      RoamController.prototype.dispose = function () {\n        this.disable();\n      };\n      RoamController.prototype._mousedownHandler = function (e) {\n        if (isMiddleOrRightButtonOnMouseUpDown(e)) {\n          return;\n        }\n        var el = e.target;\n        while (el) {\n          if (el.draggable) {\n            return;\n          }\n          // check if host is draggable\n          el = el.__hostTarget || el.parent;\n        }\n        var x = e.offsetX;\n        var y = e.offsetY;\n        // Only check on mosedown, but not mousemove.\n        // Mouse can be out of target when mouse moving.\n        if (this.pointerChecker && this.pointerChecker(e, x, y)) {\n          this._x = x;\n          this._y = y;\n          this._dragging = true;\n        }\n      };\n      RoamController.prototype._mousemoveHandler = function (e) {\n        if (!this._dragging || !isAvailableBehavior('moveOnMouseMove', e, this._opt) || e.gestureEvent === 'pinch' || isTaken(this._zr, 'globalPan')) {\n          return;\n        }\n        var x = e.offsetX;\n        var y = e.offsetY;\n        var oldX = this._x;\n        var oldY = this._y;\n        var dx = x - oldX;\n        var dy = y - oldY;\n        this._x = x;\n        this._y = y;\n        this._opt.preventDefaultMouseMove && stop(e.event);\n        trigger(this, 'pan', 'moveOnMouseMove', e, {\n          dx: dx,\n          dy: dy,\n          oldX: oldX,\n          oldY: oldY,\n          newX: x,\n          newY: y,\n          isAvailableBehavior: null\n        });\n      };\n      RoamController.prototype._mouseupHandler = function (e) {\n        if (!isMiddleOrRightButtonOnMouseUpDown(e)) {\n          this._dragging = false;\n        }\n      };\n      RoamController.prototype._mousewheelHandler = function (e) {\n        var shouldZoom = isAvailableBehavior('zoomOnMouseWheel', e, this._opt);\n        var shouldMove = isAvailableBehavior('moveOnMouseWheel', e, this._opt);\n        var wheelDelta = e.wheelDelta;\n        var absWheelDeltaDelta = Math.abs(wheelDelta);\n        var originX = e.offsetX;\n        var originY = e.offsetY;\n        // wheelDelta maybe -0 in chrome mac.\n        if (wheelDelta === 0 || !shouldZoom && !shouldMove) {\n          return;\n        }\n        // If both `shouldZoom` and `shouldMove` is true, trigger\n        // their event both, and the final behavior is determined\n        // by event listener themselves.\n        if (shouldZoom) {\n          // Convenience:\n          // Mac and VM Windows on Mac: scroll up: zoom out.\n          // Windows: scroll up: zoom in.\n          // FIXME: Should do more test in different environment.\n          // wheelDelta is too complicated in difference nvironment\n          // (https://developer.mozilla.org/en-US/docs/Web/Events/mousewheel),\n          // although it has been normallized by zrender.\n          // wheelDelta of mouse wheel is bigger than touch pad.\n          var factor = absWheelDeltaDelta > 3 ? 1.4 : absWheelDeltaDelta > 1 ? 1.2 : 1.1;\n          var scale = wheelDelta > 0 ? factor : 1 / factor;\n          checkPointerAndTrigger(this, 'zoom', 'zoomOnMouseWheel', e, {\n            scale: scale,\n            originX: originX,\n            originY: originY,\n            isAvailableBehavior: null\n          });\n        }\n        if (shouldMove) {\n          // FIXME: Should do more test in different environment.\n          var absDelta = Math.abs(wheelDelta);\n          // wheelDelta of mouse wheel is bigger than touch pad.\n          var scrollDelta = (wheelDelta > 0 ? 1 : -1) * (absDelta > 3 ? 0.4 : absDelta > 1 ? 0.15 : 0.05);\n          checkPointerAndTrigger(this, 'scrollMove', 'moveOnMouseWheel', e, {\n            scrollDelta: scrollDelta,\n            originX: originX,\n            originY: originY,\n            isAvailableBehavior: null\n          });\n        }\n      };\n      RoamController.prototype._pinchHandler = function (e) {\n        if (isTaken(this._zr, 'globalPan')) {\n          return;\n        }\n        var scale = e.pinchScale > 1 ? 1.1 : 1 / 1.1;\n        checkPointerAndTrigger(this, 'zoom', null, e, {\n          scale: scale,\n          originX: e.pinchX,\n          originY: e.pinchY,\n          isAvailableBehavior: null\n        });\n      };\n      return RoamController;\n    }(Eventful);\n    function checkPointerAndTrigger(controller, eventName, behaviorToCheck, e, contollerEvent) {\n      if (controller.pointerChecker && controller.pointerChecker(e, contollerEvent.originX, contollerEvent.originY)) {\n        // When mouse is out of roamController rect,\n        // default befavoius should not be be disabled, otherwise\n        // page sliding is disabled, contrary to expectation.\n        stop(e.event);\n        trigger(controller, eventName, behaviorToCheck, e, contollerEvent);\n      }\n    }\n    function trigger(controller, eventName, behaviorToCheck, e, contollerEvent) {\n      // Also provide behavior checker for event listener, for some case that\n      // multiple components share one listener.\n      contollerEvent.isAvailableBehavior = bind(isAvailableBehavior, null, behaviorToCheck, e);\n      // TODO should not have type issue.\n      controller.trigger(eventName, contollerEvent);\n    }\n    // settings: {\n    //     zoomOnMouseWheel\n    //     moveOnMouseMove\n    //     moveOnMouseWheel\n    // }\n    // The value can be: true / false / 'shift' / 'ctrl' / 'alt'.\n    function isAvailableBehavior(behaviorToCheck, e, settings) {\n      var setting = settings[behaviorToCheck];\n      return !behaviorToCheck || setting && (!isString(setting) || e.event[setting + 'Key']);\n    }\n\n    /*\n    * Licensed to the Apache Software Foundation (ASF) under one\n    * or more contributor license agreements.  See the NOTICE file\n    * distributed with this work for additional information\n    * regarding copyright ownership.  The ASF licenses this file\n    * to you under the Apache License, Version 2.0 (the\n    * \"License\"); you may not use this file except in compliance\n    * with the License.  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,\n    * software distributed under the License is distributed on an\n    * \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\n    * KIND, either express or implied.  See the License for the\n    * specific language governing permissions and limitations\n    * under the License.\n    */\n\n\n    /**\n     * AUTO-GENERATED FILE. DO NOT MODIFY.\n     */\n\n    /*\r\n    * Licensed to the Apache Software Foundation (ASF) under one\r\n    * or more contributor license agreements.  See the NOTICE file\r\n    * distributed with this work for additional information\r\n    * regarding copyright ownership.  The ASF licenses this file\r\n    * to you under the Apache License, Version 2.0 (the\r\n    * \"License\"); you may not use this file except in compliance\r\n    * with the License.  You may obtain a copy of the License at\r\n    *\r\n    *   http://www.apache.org/licenses/LICENSE-2.0\r\n    *\r\n    * Unless required by applicable law or agreed to in writing,\r\n    * software distributed under the License is distributed on an\r\n    * \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\r\n    * KIND, either express or implied.  See the License for the\r\n    * specific language governing permissions and limitations\r\n    * under the License.\r\n    */\n    /**\r\n     * For geo and graph.\r\n     */\n    function updateViewOnPan(controllerHost, dx, dy) {\n      var target = controllerHost.target;\n      target.x += dx;\n      target.y += dy;\n      target.dirty();\n    }\n    /**\r\n     * For geo and graph.\r\n     */\n    function updateViewOnZoom(controllerHost, zoomDelta, zoomX, zoomY) {\n      var target = controllerHost.target;\n      var zoomLimit = controllerHost.zoomLimit;\n      var newZoom = controllerHost.zoom = controllerHost.zoom || 1;\n      newZoom *= zoomDelta;\n      if (zoomLimit) {\n        var zoomMin = zoomLimit.min || 0;\n        var zoomMax = zoomLimit.max || Infinity;\n        newZoom = Math.max(Math.min(zoomMax, newZoom), zoomMin);\n      }\n      var zoomScale = newZoom / controllerHost.zoom;\n      controllerHost.zoom = newZoom;\n      // Keep the mouse center when scaling\n      target.x -= (zoomX - target.x) * (zoomScale - 1);\n      target.y -= (zoomY - target.y) * (zoomScale - 1);\n      target.scaleX *= zoomScale;\n      target.scaleY *= zoomScale;\n      target.dirty();\n    }\n\n    /*\n    * Licensed to the Apache Software Foundation (ASF) under one\n    * or more contributor license agreements.  See the NOTICE file\n    * distributed with this work for additional information\n    * regarding copyright ownership.  The ASF licenses this file\n    * to you under the Apache License, Version 2.0 (the\n    * \"License\"); you may not use this file except in compliance\n    * with the License.  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,\n    * software distributed under the License is distributed on an\n    * \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\n    * KIND, either express or implied.  See the License for the\n    * specific language governing permissions and limitations\n    * under the License.\n    */\n\n\n    /**\n     * AUTO-GENERATED FILE. DO NOT MODIFY.\n     */\n\n    /*\r\n    * Licensed to the Apache Software Foundation (ASF) under one\r\n    * or more contributor license agreements.  See the NOTICE file\r\n    * distributed with this work for additional information\r\n    * regarding copyright ownership.  The ASF licenses this file\r\n    * to you under the Apache License, Version 2.0 (the\r\n    * \"License\"); you may not use this file except in compliance\r\n    * with the License.  You may obtain a copy of the License at\r\n    *\r\n    *   http://www.apache.org/licenses/LICENSE-2.0\r\n    *\r\n    * Unless required by applicable law or agreed to in writing,\r\n    * software distributed under the License is distributed on an\r\n    * \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\r\n    * KIND, either express or implied.  See the License for the\r\n    * specific language governing permissions and limitations\r\n    * under the License.\r\n    */\n    var IRRELEVANT_EXCLUDES = {\n      'axisPointer': 1,\n      'tooltip': 1,\n      'brush': 1\n    };\n    /**\r\n     * Avoid that: mouse click on a elements that is over geo or graph,\r\n     * but roam is triggered.\r\n     */\n    function onIrrelevantElement(e, api, targetCoordSysModel) {\n      var model = api.getComponentByElement(e.topTarget);\n      // If model is axisModel, it works only if it is injected with coordinateSystem.\n      var coordSys = model && model.coordinateSystem;\n      return model && model !== targetCoordSysModel && !IRRELEVANT_EXCLUDES.hasOwnProperty(model.mainType) && coordSys && coordSys.model !== targetCoordSysModel;\n    }\n\n    function parseXML(svg) {\n        if (isString(svg)) {\n            var parser = new DOMParser();\n            svg = parser.parseFromString(svg, 'text/xml');\n        }\n        var svgNode = svg;\n        if (svgNode.nodeType === 9) {\n            svgNode = svgNode.firstChild;\n        }\n        while (svgNode.nodeName.toLowerCase() !== 'svg' || svgNode.nodeType !== 1) {\n            svgNode = svgNode.nextSibling;\n        }\n        return svgNode;\n    }\n\n    var nodeParsers;\n    var INHERITABLE_STYLE_ATTRIBUTES_MAP = {\n        'fill': 'fill',\n        'stroke': 'stroke',\n        'stroke-width': 'lineWidth',\n        'opacity': 'opacity',\n        'fill-opacity': 'fillOpacity',\n        'stroke-opacity': 'strokeOpacity',\n        'stroke-dasharray': 'lineDash',\n        'stroke-dashoffset': 'lineDashOffset',\n        'stroke-linecap': 'lineCap',\n        'stroke-linejoin': 'lineJoin',\n        'stroke-miterlimit': 'miterLimit',\n        'font-family': 'fontFamily',\n        'font-size': 'fontSize',\n        'font-style': 'fontStyle',\n        'font-weight': 'fontWeight',\n        'text-anchor': 'textAlign',\n        'visibility': 'visibility',\n        'display': 'display'\n    };\n    var INHERITABLE_STYLE_ATTRIBUTES_MAP_KEYS = keys(INHERITABLE_STYLE_ATTRIBUTES_MAP);\n    var SELF_STYLE_ATTRIBUTES_MAP = {\n        'alignment-baseline': 'textBaseline',\n        'stop-color': 'stopColor'\n    };\n    var SELF_STYLE_ATTRIBUTES_MAP_KEYS = keys(SELF_STYLE_ATTRIBUTES_MAP);\n    var SVGParser = (function () {\n        function SVGParser() {\n            this._defs = {};\n            this._root = null;\n        }\n        SVGParser.prototype.parse = function (xml, opt) {\n            opt = opt || {};\n            var svg = parseXML(xml);\n            if (\"development\" !== 'production') {\n                if (!svg) {\n                    throw new Error('Illegal svg');\n                }\n            }\n            this._defsUsePending = [];\n            var root = new Group();\n            this._root = root;\n            var named = [];\n            var viewBox = svg.getAttribute('viewBox') || '';\n            var width = parseFloat((svg.getAttribute('width') || opt.width));\n            var height = parseFloat((svg.getAttribute('height') || opt.height));\n            isNaN(width) && (width = null);\n            isNaN(height) && (height = null);\n            parseAttributes(svg, root, null, true, false);\n            var child = svg.firstChild;\n            while (child) {\n                this._parseNode(child, root, named, null, false, false);\n                child = child.nextSibling;\n            }\n            applyDefs(this._defs, this._defsUsePending);\n            this._defsUsePending = [];\n            var viewBoxRect;\n            var viewBoxTransform;\n            if (viewBox) {\n                var viewBoxArr = splitNumberSequence(viewBox);\n                if (viewBoxArr.length >= 4) {\n                    viewBoxRect = {\n                        x: parseFloat((viewBoxArr[0] || 0)),\n                        y: parseFloat((viewBoxArr[1] || 0)),\n                        width: parseFloat(viewBoxArr[2]),\n                        height: parseFloat(viewBoxArr[3])\n                    };\n                }\n            }\n            if (viewBoxRect && width != null && height != null) {\n                viewBoxTransform = makeViewBoxTransform(viewBoxRect, { x: 0, y: 0, width: width, height: height });\n                if (!opt.ignoreViewBox) {\n                    var elRoot = root;\n                    root = new Group();\n                    root.add(elRoot);\n                    elRoot.scaleX = elRoot.scaleY = viewBoxTransform.scale;\n                    elRoot.x = viewBoxTransform.x;\n                    elRoot.y = viewBoxTransform.y;\n                }\n            }\n            if (!opt.ignoreRootClip && width != null && height != null) {\n                root.setClipPath(new Rect({\n                    shape: { x: 0, y: 0, width: width, height: height }\n                }));\n            }\n            return {\n                root: root,\n                width: width,\n                height: height,\n                viewBoxRect: viewBoxRect,\n                viewBoxTransform: viewBoxTransform,\n                named: named\n            };\n        };\n        SVGParser.prototype._parseNode = function (xmlNode, parentGroup, named, namedFrom, isInDefs, isInText) {\n            var nodeName = xmlNode.nodeName.toLowerCase();\n            var el;\n            var namedFromForSub = namedFrom;\n            if (nodeName === 'defs') {\n                isInDefs = true;\n            }\n            if (nodeName === 'text') {\n                isInText = true;\n            }\n            if (nodeName === 'defs' || nodeName === 'switch') {\n                el = parentGroup;\n            }\n            else {\n                if (!isInDefs) {\n                    var parser_1 = nodeParsers[nodeName];\n                    if (parser_1 && hasOwn(nodeParsers, nodeName)) {\n                        el = parser_1.call(this, xmlNode, parentGroup);\n                        var nameAttr = xmlNode.getAttribute('name');\n                        if (nameAttr) {\n                            var newNamed = {\n                                name: nameAttr,\n                                namedFrom: null,\n                                svgNodeTagLower: nodeName,\n                                el: el\n                            };\n                            named.push(newNamed);\n                            if (nodeName === 'g') {\n                                namedFromForSub = newNamed;\n                            }\n                        }\n                        else if (namedFrom) {\n                            named.push({\n                                name: namedFrom.name,\n                                namedFrom: namedFrom,\n                                svgNodeTagLower: nodeName,\n                                el: el\n                            });\n                        }\n                        parentGroup.add(el);\n                    }\n                }\n                var parser = paintServerParsers[nodeName];\n                if (parser && hasOwn(paintServerParsers, nodeName)) {\n                    var def = parser.call(this, xmlNode);\n                    var id = xmlNode.getAttribute('id');\n                    if (id) {\n                        this._defs[id] = def;\n                    }\n                }\n            }\n            if (el && el.isGroup) {\n                var child = xmlNode.firstChild;\n                while (child) {\n                    if (child.nodeType === 1) {\n                        this._parseNode(child, el, named, namedFromForSub, isInDefs, isInText);\n                    }\n                    else if (child.nodeType === 3 && isInText) {\n                        this._parseText(child, el);\n                    }\n                    child = child.nextSibling;\n                }\n            }\n        };\n        SVGParser.prototype._parseText = function (xmlNode, parentGroup) {\n            var text = new TSpan({\n                style: {\n                    text: xmlNode.textContent\n                },\n                silent: true,\n                x: this._textX || 0,\n                y: this._textY || 0\n            });\n            inheritStyle(parentGroup, text);\n            parseAttributes(xmlNode, text, this._defsUsePending, false, false);\n            applyTextAlignment(text, parentGroup);\n            var textStyle = text.style;\n            var fontSize = textStyle.fontSize;\n            if (fontSize && fontSize < 9) {\n                textStyle.fontSize = 9;\n                text.scaleX *= fontSize / 9;\n                text.scaleY *= fontSize / 9;\n            }\n            var font = (textStyle.fontSize || textStyle.fontFamily) && [\n                textStyle.fontStyle,\n                textStyle.fontWeight,\n                (textStyle.fontSize || 12) + 'px',\n                textStyle.fontFamily || 'sans-serif'\n            ].join(' ');\n            textStyle.font = font;\n            var rect = text.getBoundingRect();\n            this._textX += rect.width;\n            parentGroup.add(text);\n            return text;\n        };\n        SVGParser.internalField = (function () {\n            nodeParsers = {\n                'g': function (xmlNode, parentGroup) {\n                    var g = new Group();\n                    inheritStyle(parentGroup, g);\n                    parseAttributes(xmlNode, g, this._defsUsePending, false, false);\n                    return g;\n                },\n                'rect': function (xmlNode, parentGroup) {\n                    var rect = new Rect();\n                    inheritStyle(parentGroup, rect);\n                    parseAttributes(xmlNode, rect, this._defsUsePending, false, false);\n                    rect.setShape({\n                        x: parseFloat(xmlNode.getAttribute('x') || '0'),\n                        y: parseFloat(xmlNode.getAttribute('y') || '0'),\n                        width: parseFloat(xmlNode.getAttribute('width') || '0'),\n                        height: parseFloat(xmlNode.getAttribute('height') || '0')\n                    });\n                    rect.silent = true;\n                    return rect;\n                },\n                'circle': function (xmlNode, parentGroup) {\n                    var circle = new Circle();\n                    inheritStyle(parentGroup, circle);\n                    parseAttributes(xmlNode, circle, this._defsUsePending, false, false);\n                    circle.setShape({\n                        cx: parseFloat(xmlNode.getAttribute('cx') || '0'),\n                        cy: parseFloat(xmlNode.getAttribute('cy') || '0'),\n                        r: parseFloat(xmlNode.getAttribute('r') || '0')\n                    });\n                    circle.silent = true;\n                    return circle;\n                },\n                'line': function (xmlNode, parentGroup) {\n                    var line = new Line();\n                    inheritStyle(parentGroup, line);\n                    parseAttributes(xmlNode, line, this._defsUsePending, false, false);\n                    line.setShape({\n                        x1: parseFloat(xmlNode.getAttribute('x1') || '0'),\n                        y1: parseFloat(xmlNode.getAttribute('y1') || '0'),\n                        x2: parseFloat(xmlNode.getAttribute('x2') || '0'),\n                        y2: parseFloat(xmlNode.getAttribute('y2') || '0')\n                    });\n                    line.silent = true;\n                    return line;\n                },\n                'ellipse': function (xmlNode, parentGroup) {\n                    var ellipse = new Ellipse();\n                    inheritStyle(parentGroup, ellipse);\n                    parseAttributes(xmlNode, ellipse, this._defsUsePending, false, false);\n                    ellipse.setShape({\n                        cx: parseFloat(xmlNode.getAttribute('cx') || '0'),\n                        cy: parseFloat(xmlNode.getAttribute('cy') || '0'),\n                        rx: parseFloat(xmlNode.getAttribute('rx') || '0'),\n                        ry: parseFloat(xmlNode.getAttribute('ry') || '0')\n                    });\n                    ellipse.silent = true;\n                    return ellipse;\n                },\n                'polygon': function (xmlNode, parentGroup) {\n                    var pointsStr = xmlNode.getAttribute('points');\n                    var pointsArr;\n                    if (pointsStr) {\n                        pointsArr = parsePoints(pointsStr);\n                    }\n                    var polygon = new Polygon({\n                        shape: {\n                            points: pointsArr || []\n                        },\n                        silent: true\n                    });\n                    inheritStyle(parentGroup, polygon);\n                    parseAttributes(xmlNode, polygon, this._defsUsePending, false, false);\n                    return polygon;\n                },\n                'polyline': function (xmlNode, parentGroup) {\n                    var pointsStr = xmlNode.getAttribute('points');\n                    var pointsArr;\n                    if (pointsStr) {\n                        pointsArr = parsePoints(pointsStr);\n                    }\n                    var polyline = new Polyline({\n                        shape: {\n                            points: pointsArr || []\n                        },\n                        silent: true\n                    });\n                    inheritStyle(parentGroup, polyline);\n                    parseAttributes(xmlNode, polyline, this._defsUsePending, false, false);\n                    return polyline;\n                },\n                'image': function (xmlNode, parentGroup) {\n                    var img = new ZRImage();\n                    inheritStyle(parentGroup, img);\n                    parseAttributes(xmlNode, img, this._defsUsePending, false, false);\n                    img.setStyle({\n                        image: xmlNode.getAttribute('xlink:href') || xmlNode.getAttribute('href'),\n                        x: +xmlNode.getAttribute('x'),\n                        y: +xmlNode.getAttribute('y'),\n                        width: +xmlNode.getAttribute('width'),\n                        height: +xmlNode.getAttribute('height')\n                    });\n                    img.silent = true;\n                    return img;\n                },\n                'text': function (xmlNode, parentGroup) {\n                    var x = xmlNode.getAttribute('x') || '0';\n                    var y = xmlNode.getAttribute('y') || '0';\n                    var dx = xmlNode.getAttribute('dx') || '0';\n                    var dy = xmlNode.getAttribute('dy') || '0';\n                    this._textX = parseFloat(x) + parseFloat(dx);\n                    this._textY = parseFloat(y) + parseFloat(dy);\n                    var g = new Group();\n                    inheritStyle(parentGroup, g);\n                    parseAttributes(xmlNode, g, this._defsUsePending, false, true);\n                    return g;\n                },\n                'tspan': function (xmlNode, parentGroup) {\n                    var x = xmlNode.getAttribute('x');\n                    var y = xmlNode.getAttribute('y');\n                    if (x != null) {\n                        this._textX = parseFloat(x);\n                    }\n                    if (y != null) {\n                        this._textY = parseFloat(y);\n                    }\n                    var dx = xmlNode.getAttribute('dx') || '0';\n                    var dy = xmlNode.getAttribute('dy') || '0';\n                    var g = new Group();\n                    inheritStyle(parentGroup, g);\n                    parseAttributes(xmlNode, g, this._defsUsePending, false, true);\n                    this._textX += parseFloat(dx);\n                    this._textY += parseFloat(dy);\n                    return g;\n                },\n                'path': function (xmlNode, parentGroup) {\n                    var d = xmlNode.getAttribute('d') || '';\n                    var path = createFromString(d);\n                    inheritStyle(parentGroup, path);\n                    parseAttributes(xmlNode, path, this._defsUsePending, false, false);\n                    path.silent = true;\n                    return path;\n                }\n            };\n        })();\n        return SVGParser;\n    }());\n    var paintServerParsers = {\n        'lineargradient': function (xmlNode) {\n            var x1 = parseInt(xmlNode.getAttribute('x1') || '0', 10);\n            var y1 = parseInt(xmlNode.getAttribute('y1') || '0', 10);\n            var x2 = parseInt(xmlNode.getAttribute('x2') || '10', 10);\n            var y2 = parseInt(xmlNode.getAttribute('y2') || '0', 10);\n            var gradient = new LinearGradient(x1, y1, x2, y2);\n            parsePaintServerUnit(xmlNode, gradient);\n            parseGradientColorStops(xmlNode, gradient);\n            return gradient;\n        },\n        'radialgradient': function (xmlNode) {\n            var cx = parseInt(xmlNode.getAttribute('cx') || '0', 10);\n            var cy = parseInt(xmlNode.getAttribute('cy') || '0', 10);\n            var r = parseInt(xmlNode.getAttribute('r') || '0', 10);\n            var gradient = new RadialGradient(cx, cy, r);\n            parsePaintServerUnit(xmlNode, gradient);\n            parseGradientColorStops(xmlNode, gradient);\n            return gradient;\n        }\n    };\n    function parsePaintServerUnit(xmlNode, gradient) {\n        var gradientUnits = xmlNode.getAttribute('gradientUnits');\n        if (gradientUnits === 'userSpaceOnUse') {\n            gradient.global = true;\n        }\n    }\n    function parseGradientColorStops(xmlNode, gradient) {\n        var stop = xmlNode.firstChild;\n        while (stop) {\n            if (stop.nodeType === 1\n                && stop.nodeName.toLocaleLowerCase() === 'stop') {\n                var offsetStr = stop.getAttribute('offset');\n                var offset = void 0;\n                if (offsetStr && offsetStr.indexOf('%') > 0) {\n                    offset = parseInt(offsetStr, 10) / 100;\n                }\n                else if (offsetStr) {\n                    offset = parseFloat(offsetStr);\n                }\n                else {\n                    offset = 0;\n                }\n                var styleVals = {};\n                parseInlineStyle(stop, styleVals, styleVals);\n                var stopColor = styleVals.stopColor\n                    || stop.getAttribute('stop-color')\n                    || '#000000';\n                gradient.colorStops.push({\n                    offset: offset,\n                    color: stopColor\n                });\n            }\n            stop = stop.nextSibling;\n        }\n    }\n    function inheritStyle(parent, child) {\n        if (parent && parent.__inheritedStyle) {\n            if (!child.__inheritedStyle) {\n                child.__inheritedStyle = {};\n            }\n            defaults(child.__inheritedStyle, parent.__inheritedStyle);\n        }\n    }\n    function parsePoints(pointsString) {\n        var list = splitNumberSequence(pointsString);\n        var points = [];\n        for (var i = 0; i < list.length; i += 2) {\n            var x = parseFloat(list[i]);\n            var y = parseFloat(list[i + 1]);\n            points.push([x, y]);\n        }\n        return points;\n    }\n    function parseAttributes(xmlNode, el, defsUsePending, onlyInlineStyle, isTextGroup) {\n        var disp = el;\n        var inheritedStyle = disp.__inheritedStyle = disp.__inheritedStyle || {};\n        var selfStyle = {};\n        if (xmlNode.nodeType === 1) {\n            parseTransformAttribute(xmlNode, el);\n            parseInlineStyle(xmlNode, inheritedStyle, selfStyle);\n            if (!onlyInlineStyle) {\n                parseAttributeStyle(xmlNode, inheritedStyle, selfStyle);\n            }\n        }\n        disp.style = disp.style || {};\n        if (inheritedStyle.fill != null) {\n            disp.style.fill = getFillStrokeStyle(disp, 'fill', inheritedStyle.fill, defsUsePending);\n        }\n        if (inheritedStyle.stroke != null) {\n            disp.style.stroke = getFillStrokeStyle(disp, 'stroke', inheritedStyle.stroke, defsUsePending);\n        }\n        each([\n            'lineWidth', 'opacity', 'fillOpacity', 'strokeOpacity', 'miterLimit', 'fontSize'\n        ], function (propName) {\n            if (inheritedStyle[propName] != null) {\n                disp.style[propName] = parseFloat(inheritedStyle[propName]);\n            }\n        });\n        each([\n            'lineDashOffset', 'lineCap', 'lineJoin', 'fontWeight', 'fontFamily', 'fontStyle', 'textAlign'\n        ], function (propName) {\n            if (inheritedStyle[propName] != null) {\n                disp.style[propName] = inheritedStyle[propName];\n            }\n        });\n        if (isTextGroup) {\n            disp.__selfStyle = selfStyle;\n        }\n        if (inheritedStyle.lineDash) {\n            disp.style.lineDash = map(splitNumberSequence(inheritedStyle.lineDash), function (str) {\n                return parseFloat(str);\n            });\n        }\n        if (inheritedStyle.visibility === 'hidden' || inheritedStyle.visibility === 'collapse') {\n            disp.invisible = true;\n        }\n        if (inheritedStyle.display === 'none') {\n            disp.ignore = true;\n        }\n    }\n    function applyTextAlignment(text, parentGroup) {\n        var parentSelfStyle = parentGroup.__selfStyle;\n        if (parentSelfStyle) {\n            var textBaseline = parentSelfStyle.textBaseline;\n            var zrTextBaseline = textBaseline;\n            if (!textBaseline || textBaseline === 'auto') {\n                zrTextBaseline = 'alphabetic';\n            }\n            else if (textBaseline === 'baseline') {\n                zrTextBaseline = 'alphabetic';\n            }\n            else if (textBaseline === 'before-edge' || textBaseline === 'text-before-edge') {\n                zrTextBaseline = 'top';\n            }\n            else if (textBaseline === 'after-edge' || textBaseline === 'text-after-edge') {\n                zrTextBaseline = 'bottom';\n            }\n            else if (textBaseline === 'central' || textBaseline === 'mathematical') {\n                zrTextBaseline = 'middle';\n            }\n            text.style.textBaseline = zrTextBaseline;\n        }\n        var parentInheritedStyle = parentGroup.__inheritedStyle;\n        if (parentInheritedStyle) {\n            var textAlign = parentInheritedStyle.textAlign;\n            var zrTextAlign = textAlign;\n            if (textAlign) {\n                if (textAlign === 'middle') {\n                    zrTextAlign = 'center';\n                }\n                text.style.textAlign = zrTextAlign;\n            }\n        }\n    }\n    var urlRegex = /^url\\(\\s*#(.*?)\\)/;\n    function getFillStrokeStyle(el, method, str, defsUsePending) {\n        var urlMatch = str && str.match(urlRegex);\n        if (urlMatch) {\n            var url = trim(urlMatch[1]);\n            defsUsePending.push([el, method, url]);\n            return;\n        }\n        if (str === 'none') {\n            str = null;\n        }\n        return str;\n    }\n    function applyDefs(defs, defsUsePending) {\n        for (var i = 0; i < defsUsePending.length; i++) {\n            var item = defsUsePending[i];\n            item[0].style[item[1]] = defs[item[2]];\n        }\n    }\n    var numberReg$1 = /-?([0-9]*\\.)?[0-9]+([eE]-?[0-9]+)?/g;\n    function splitNumberSequence(rawStr) {\n        return rawStr.match(numberReg$1) || [];\n    }\n    var transformRegex = /(translate|scale|rotate|skewX|skewY|matrix)\\(([\\-\\s0-9\\.eE,]*)\\)/g;\n    var DEGREE_TO_ANGLE = Math.PI / 180;\n    function parseTransformAttribute(xmlNode, node) {\n        var transform = xmlNode.getAttribute('transform');\n        if (transform) {\n            transform = transform.replace(/,/g, ' ');\n            var transformOps_1 = [];\n            var mt = null;\n            transform.replace(transformRegex, function (str, type, value) {\n                transformOps_1.push(type, value);\n                return '';\n            });\n            for (var i = transformOps_1.length - 1; i > 0; i -= 2) {\n                var value = transformOps_1[i];\n                var type = transformOps_1[i - 1];\n                var valueArr = splitNumberSequence(value);\n                mt = mt || create$1();\n                switch (type) {\n                    case 'translate':\n                        translate(mt, mt, [parseFloat(valueArr[0]), parseFloat(valueArr[1] || '0')]);\n                        break;\n                    case 'scale':\n                        scale$1(mt, mt, [parseFloat(valueArr[0]), parseFloat(valueArr[1] || valueArr[0])]);\n                        break;\n                    case 'rotate':\n                        rotate(mt, mt, -parseFloat(valueArr[0]) * DEGREE_TO_ANGLE, [\n                            parseFloat(valueArr[1] || '0'),\n                            parseFloat(valueArr[2] || '0')\n                        ]);\n                        break;\n                    case 'skewX':\n                        var sx = Math.tan(parseFloat(valueArr[0]) * DEGREE_TO_ANGLE);\n                        mul$1(mt, [1, 0, sx, 1, 0, 0], mt);\n                        break;\n                    case 'skewY':\n                        var sy = Math.tan(parseFloat(valueArr[0]) * DEGREE_TO_ANGLE);\n                        mul$1(mt, [1, sy, 0, 1, 0, 0], mt);\n                        break;\n                    case 'matrix':\n                        mt[0] = parseFloat(valueArr[0]);\n                        mt[1] = parseFloat(valueArr[1]);\n                        mt[2] = parseFloat(valueArr[2]);\n                        mt[3] = parseFloat(valueArr[3]);\n                        mt[4] = parseFloat(valueArr[4]);\n                        mt[5] = parseFloat(valueArr[5]);\n                        break;\n                }\n            }\n            node.setLocalTransform(mt);\n        }\n    }\n    var styleRegex = /([^\\s:;]+)\\s*:\\s*([^:;]+)/g;\n    function parseInlineStyle(xmlNode, inheritableStyleResult, selfStyleResult) {\n        var style = xmlNode.getAttribute('style');\n        if (!style) {\n            return;\n        }\n        styleRegex.lastIndex = 0;\n        var styleRegResult;\n        while ((styleRegResult = styleRegex.exec(style)) != null) {\n            var svgStlAttr = styleRegResult[1];\n            var zrInheritableStlAttr = hasOwn(INHERITABLE_STYLE_ATTRIBUTES_MAP, svgStlAttr)\n                ? INHERITABLE_STYLE_ATTRIBUTES_MAP[svgStlAttr]\n                : null;\n            if (zrInheritableStlAttr) {\n                inheritableStyleResult[zrInheritableStlAttr] = styleRegResult[2];\n            }\n            var zrSelfStlAttr = hasOwn(SELF_STYLE_ATTRIBUTES_MAP, svgStlAttr)\n                ? SELF_STYLE_ATTRIBUTES_MAP[svgStlAttr]\n                : null;\n            if (zrSelfStlAttr) {\n                selfStyleResult[zrSelfStlAttr] = styleRegResult[2];\n            }\n        }\n    }\n    function parseAttributeStyle(xmlNode, inheritableStyleResult, selfStyleResult) {\n        for (var i = 0; i < INHERITABLE_STYLE_ATTRIBUTES_MAP_KEYS.length; i++) {\n            var svgAttrName = INHERITABLE_STYLE_ATTRIBUTES_MAP_KEYS[i];\n            var attrValue = xmlNode.getAttribute(svgAttrName);\n            if (attrValue != null) {\n                inheritableStyleResult[INHERITABLE_STYLE_ATTRIBUTES_MAP[svgAttrName]] = attrValue;\n            }\n        }\n        for (var i = 0; i < SELF_STYLE_ATTRIBUTES_MAP_KEYS.length; i++) {\n            var svgAttrName = SELF_STYLE_ATTRIBUTES_MAP_KEYS[i];\n            var attrValue = xmlNode.getAttribute(svgAttrName);\n            if (attrValue != null) {\n                selfStyleResult[SELF_STYLE_ATTRIBUTES_MAP[svgAttrName]] = attrValue;\n            }\n        }\n    }\n    function makeViewBoxTransform(viewBoxRect, boundingRect) {\n        var scaleX = boundingRect.width / viewBoxRect.width;\n        var scaleY = boundingRect.height / viewBoxRect.height;\n        var scale = Math.min(scaleX, scaleY);\n        return {\n            scale: scale,\n            x: -(viewBoxRect.x + viewBoxRect.width / 2) * scale + (boundingRect.x + boundingRect.width / 2),\n            y: -(viewBoxRect.y + viewBoxRect.height / 2) * scale + (boundingRect.y + boundingRect.height / 2)\n        };\n    }\n    function parseSVG(xml, opt) {\n        var parser = new SVGParser();\n        return parser.parse(xml, opt);\n    }\n\n    /**\r\n     * \"region available\" means that: enable users to set attribute `name=\"xxx\"` on those tags\r\n     * to make it be a region.\r\n     * 1. region styles and its label styles can be defined in echarts opton:\r\n     * ```js\r\n     * geo: {\r\n     *     regions: [{\r\n     *         name: 'xxx',\r\n     *         itemStyle: { ... },\r\n     *         label: { ... }\r\n     *     }, {\r\n     *         ...\r\n     *     },\r\n     *     ...]\r\n     * };\r\n     * ```\r\n     * 2. name can be duplicated in different SVG tag. All of the tags with the same name share\r\n     * a region option. For exampel if there are two <path> representing two lung lobes. They have\r\n     * no common parents but both of them need to display label \"lung\" inside.\r\n     */\n    var REGION_AVAILABLE_SVG_TAG_MAP = createHashMap(['rect', 'circle', 'line', 'ellipse', 'polygon', 'polyline', 'path',\n    // <text> <tspan> are also enabled because some SVG might paint text itself,\n    // but still need to trigger events or tooltip.\n    'text', 'tspan',\n    // <g> is also enabled because this case: if multiple tags share one name\n    // and need label displayed, every tags will display the name, which is not\n    // expected. So we can put them into a <g name=\"xxx\">. Thereby only one label\n    // displayed and located based on the bounding rect of the <g>.\n    'g']);\n    var GeoSVGResource = /** @class */function () {\n      function GeoSVGResource(mapName, svg) {\n        this.type = 'geoSVG';\n        // All used graphics. key: hostKey, value: root\n        this._usedGraphicMap = createHashMap();\n        // All unused graphics.\n        this._freedGraphics = [];\n        this._mapName = mapName;\n        // Only perform parse to XML object here, which might be time\n        // consiming for large SVG.\n        // Although convert XML to zrender element is also time consiming,\n        // if we do it here, the clone of zrender elements has to be\n        // required. So we do it once for each geo instance, util real\n        // performance issues call for optimizing it.\n        this._parsedXML = parseXML(svg);\n      }\n      GeoSVGResource.prototype.load = function /* nameMap: NameMap */\n      () {\n        // In the \"load\" stage, graphic need to be built to\n        // get boundingRect for geo coordinate system.\n        var firstGraphic = this._firstGraphic;\n        // Create the return data structure only when first graphic created.\n        // Because they will be used in geo coordinate system update stage,\n        // and `regions` will be mounted at `geo` coordinate system,\n        // in which there is no \"view\" info, so that it should better not to\n        // make references to graphic elements.\n        if (!firstGraphic) {\n          firstGraphic = this._firstGraphic = this._buildGraphic(this._parsedXML);\n          this._freedGraphics.push(firstGraphic);\n          this._boundingRect = this._firstGraphic.boundingRect.clone();\n          // PENDING: `nameMap` will not be supported until some real requirement come.\n          // if (nameMap) {\n          //     named = applyNameMap(named, nameMap);\n          // }\n          var _a = createRegions(firstGraphic.named),\n            regions = _a.regions,\n            regionsMap = _a.regionsMap;\n          this._regions = regions;\n          this._regionsMap = regionsMap;\n        }\n        return {\n          boundingRect: this._boundingRect,\n          regions: this._regions,\n          regionsMap: this._regionsMap\n        };\n      };\n      GeoSVGResource.prototype._buildGraphic = function (svgXML) {\n        var result;\n        var rootFromParse;\n        try {\n          result = svgXML && parseSVG(svgXML, {\n            ignoreViewBox: true,\n            ignoreRootClip: true\n          }) || {};\n          rootFromParse = result.root;\n          assert(rootFromParse != null);\n        } catch (e) {\n          throw new Error('Invalid svg format\\n' + e.message);\n        }\n        // Note: we keep the covenant that the root has no transform. So always add an extra root.\n        var root = new Group();\n        root.add(rootFromParse);\n        root.isGeoSVGGraphicRoot = true;\n        // [THE_RULE_OF_VIEWPORT_AND_VIEWBOX]\n        //\n        // Consider: `<svg width=\"...\" height=\"...\" viewBox=\"...\">`\n        // - the `width/height` we call it `svgWidth/svgHeight` for short.\n        // - `(0, 0, svgWidth, svgHeight)` defines the viewport of the SVG, or say,\n        //   \"viewport boundingRect\", or `boundingRect` for short.\n        // - `viewBox` defines the transform from the real content ot the viewport.\n        //   `viewBox` has the same unit as the content of SVG.\n        //   If `viewBox` exists, a transform is defined, so the unit of `svgWidth/svgHeight` become\n        //   different from the content of SVG. Otherwise, they are the same.\n        //\n        // If both `svgWidth/svgHeight/viewBox` are specified in a SVG file, the transform rule will be:\n        // 0. `boundingRect` is `(0, 0, svgWidth, svgHeight)`. Set it to Geo['_rect'] (View['_rect']).\n        // 1. Make a transform from `viewBox` to `boundingRect`.\n        //    Note: only support `preserveAspectRatio 'xMidYMid'` here. That is, this transform will preserve\n        //    the aspect ratio.\n        // 2. Make a transform from boundingRect to Geo['_viewRect'] (View['_viewRect'])\n        //    (`Geo`/`View` will do this job).\n        //    Note: this transform might not preserve aspect radio, which depending on how users specify\n        //    viewRect in echarts option (e.g., `geo.left/top/width/height` will not preserve aspect ratio,\n        //    but `geo.layoutCenter/layoutSize` will preserve aspect ratio).\n        //\n        // If `svgWidth/svgHeight` not specified, we use `viewBox` as the `boundingRect` to make the SVG\n        // layout look good.\n        //\n        // If neither `svgWidth/svgHeight` nor `viewBox` are not specified, we calculate the boundingRect\n        // of the SVG content and use them to make SVG layout look good.\n        var svgWidth = result.width;\n        var svgHeight = result.height;\n        var viewBoxRect = result.viewBoxRect;\n        var boundingRect = this._boundingRect;\n        if (!boundingRect) {\n          var bRectX = void 0;\n          var bRectY = void 0;\n          var bRectWidth = void 0;\n          var bRectHeight = void 0;\n          if (svgWidth != null) {\n            bRectX = 0;\n            bRectWidth = svgWidth;\n          } else if (viewBoxRect) {\n            bRectX = viewBoxRect.x;\n            bRectWidth = viewBoxRect.width;\n          }\n          if (svgHeight != null) {\n            bRectY = 0;\n            bRectHeight = svgHeight;\n          } else if (viewBoxRect) {\n            bRectY = viewBoxRect.y;\n            bRectHeight = viewBoxRect.height;\n          }\n          // If both viewBox and svgWidth/svgHeight not specified,\n          // we have to determine how to layout those element to make them look good.\n          if (bRectX == null || bRectY == null) {\n            var calculatedBoundingRect = rootFromParse.getBoundingRect();\n            if (bRectX == null) {\n              bRectX = calculatedBoundingRect.x;\n              bRectWidth = calculatedBoundingRect.width;\n            }\n            if (bRectY == null) {\n              bRectY = calculatedBoundingRect.y;\n              bRectHeight = calculatedBoundingRect.height;\n            }\n          }\n          boundingRect = this._boundingRect = new BoundingRect(bRectX, bRectY, bRectWidth, bRectHeight);\n        }\n        if (viewBoxRect) {\n          var viewBoxTransform = makeViewBoxTransform(viewBoxRect, boundingRect);\n          // Only support `preserveAspectRatio 'xMidYMid'`\n          rootFromParse.scaleX = rootFromParse.scaleY = viewBoxTransform.scale;\n          rootFromParse.x = viewBoxTransform.x;\n          rootFromParse.y = viewBoxTransform.y;\n        }\n        // SVG needs to clip based on `viewBox`. And some SVG files really rely on this feature.\n        // They do not strictly confine all of the content inside a display rect, but deliberately\n        // use a `viewBox` to define a displayable rect.\n        // PENDING:\n        // The drawback of the `setClipPath` here is: the region label (genereted by echarts) near the\n        // edge might also be clipped, because region labels are put as `textContent` of the SVG path.\n        root.setClipPath(new Rect({\n          shape: boundingRect.plain()\n        }));\n        var named = [];\n        each(result.named, function (namedItem) {\n          if (REGION_AVAILABLE_SVG_TAG_MAP.get(namedItem.svgNodeTagLower) != null) {\n            named.push(namedItem);\n            setSilent(namedItem.el);\n          }\n        });\n        return {\n          root: root,\n          boundingRect: boundingRect,\n          named: named\n        };\n      };\n      /**\r\n       * Consider:\r\n       * (1) One graphic element can not be shared by different `geoView` running simultaneously.\r\n       *     Notice, also need to consider multiple echarts instances share a `mapRecord`.\r\n       * (2) Converting SVG to graphic elements is time consuming.\r\n       * (3) In the current architecture, `load` should be called frequently to get boundingRect,\r\n       *     and it is called without view info.\r\n       * So we maintain graphic elements in this module, and enables `view` to use/return these\r\n       * graphics from/to the pool with it's uid.\r\n       */\n      GeoSVGResource.prototype.useGraphic = function (hostKey /* , nameMap: NameMap */) {\n        var usedRootMap = this._usedGraphicMap;\n        var svgGraphic = usedRootMap.get(hostKey);\n        if (svgGraphic) {\n          return svgGraphic;\n        }\n        svgGraphic = this._freedGraphics.pop()\n        // use the first boundingRect to avoid duplicated boundingRect calculation.\n        || this._buildGraphic(this._parsedXML);\n        usedRootMap.set(hostKey, svgGraphic);\n        // PENDING: `nameMap` will not be supported until some real requirement come.\n        // `nameMap` can only be obtained from echarts option.\n        // The original `named` must not be modified.\n        // if (nameMap) {\n        //     svgGraphic = extend({}, svgGraphic);\n        //     svgGraphic.named = applyNameMap(svgGraphic.named, nameMap);\n        // }\n        return svgGraphic;\n      };\n      GeoSVGResource.prototype.freeGraphic = function (hostKey) {\n        var usedRootMap = this._usedGraphicMap;\n        var svgGraphic = usedRootMap.get(hostKey);\n        if (svgGraphic) {\n          usedRootMap.removeKey(hostKey);\n          this._freedGraphics.push(svgGraphic);\n        }\n      };\n      return GeoSVGResource;\n    }();\n    function setSilent(el) {\n      // Only named element has silent: false, other elements should\n      // act as background and has no user interaction.\n      el.silent = false;\n      // text|tspan will be converted to group.\n      if (el.isGroup) {\n        el.traverse(function (child) {\n          child.silent = false;\n        });\n      }\n    }\n    function createRegions(named) {\n      var regions = [];\n      var regionsMap = createHashMap();\n      // Create resions only for the first graphic.\n      each(named, function (namedItem) {\n        // Region has feature to calculate center for tooltip or other features.\n        // If there is a <g name=\"xxx\">, the center should be the center of the\n        // bounding rect of the g.\n        if (namedItem.namedFrom != null) {\n          return;\n        }\n        var region = new GeoSVGRegion(namedItem.name, namedItem.el);\n        // PENDING: if `nameMap` supported, this region can not be mounted on\n        // `this`, but can only be created each time `load()` called.\n        regions.push(region);\n        // PENDING: if multiple tag named with the same name, only one will be\n        // found by `_regionsMap`. `_regionsMap` is used to find a coordinate\n        // by name. We use `region.getCenter()` as the coordinate.\n        regionsMap.set(namedItem.name, region);\n      });\n      return {\n        regions: regions,\n        regionsMap: regionsMap\n      };\n    }\n    // PENDING: `nameMap` will not be supported until some real requirement come.\n    // /**\n    //  * Use the alias in geoNameMap.\n    //  * The input `named` must not be modified.\n    //  */\n    // function applyNameMap(\n    //     named: GeoSVGGraphicRecord['named'],\n    //     nameMap: NameMap\n    // ): GeoSVGGraphicRecord['named'] {\n    //     const result = [] as GeoSVGGraphicRecord['named'];\n    //     for (let i = 0; i < named.length; i++) {\n    //         let regionGraphic = named[i];\n    //         const name = regionGraphic.name;\n    //         if (nameMap && nameMap.hasOwnProperty(name)) {\n    //             regionGraphic = extend({}, regionGraphic);\n    //             regionGraphic.name = name;\n    //         }\n    //         result.push(regionGraphic);\n    //     }\n    //     return result;\n    // }\n\n    var geoCoord = [126, 25];\n    var nanhaiName = '南海诸岛';\n    var points$1 = [[[0, 3.5], [7, 11.2], [15, 11.9], [30, 7], [42, 0.7], [52, 0.7], [56, 7.7], [59, 0.7], [64, 0.7], [64, 0], [5, 0], [0, 3.5]], [[13, 16.1], [19, 14.7], [16, 21.7], [11, 23.1], [13, 16.1]], [[12, 32.2], [14, 38.5], [15, 38.5], [13, 32.2], [12, 32.2]], [[16, 47.6], [12, 53.2], [13, 53.2], [18, 47.6], [16, 47.6]], [[6, 64.4], [8, 70], [9, 70], [8, 64.4], [6, 64.4]], [[23, 82.6], [29, 79.8], [30, 79.8], [25, 82.6], [23, 82.6]], [[37, 70.7], [43, 62.3], [44, 62.3], [39, 70.7], [37, 70.7]], [[48, 51.1], [51, 45.5], [53, 45.5], [50, 51.1], [48, 51.1]], [[51, 35], [51, 28.7], [53, 28.7], [53, 35], [51, 35]], [[52, 22.4], [55, 17.5], [56, 17.5], [53, 22.4], [52, 22.4]], [[58, 12.6], [62, 7], [63, 7], [60, 12.6], [58, 12.6]], [[0, 3.5], [0, 93.1], [64, 93.1], [64, 0], [63, 0], [63, 92.4], [1, 92.4], [1, 3.5], [0, 3.5]]];\n    for (var i = 0; i < points$1.length; i++) {\n      for (var k = 0; k < points$1[i].length; k++) {\n        points$1[i][k][0] /= 10.5;\n        points$1[i][k][1] /= -10.5 / 0.75;\n        points$1[i][k][0] += geoCoord[0];\n        points$1[i][k][1] += geoCoord[1];\n      }\n    }\n    function fixNanhai(mapType, regions) {\n      if (mapType === 'china') {\n        for (var i = 0; i < regions.length; i++) {\n          // Already exists.\n          if (regions[i].name === nanhaiName) {\n            return;\n          }\n        }\n        regions.push(new GeoJSONRegion(nanhaiName, map(points$1, function (exterior) {\n          return {\n            type: 'polygon',\n            exterior: exterior\n          };\n        }), geoCoord));\n      }\n    }\n\n    /*\n    * Licensed to the Apache Software Foundation (ASF) under one\n    * or more contributor license agreements.  See the NOTICE file\n    * distributed with this work for additional information\n    * regarding copyright ownership.  The ASF licenses this file\n    * to you under the Apache License, Version 2.0 (the\n    * \"License\"); you may not use this file except in compliance\n    * with the License.  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,\n    * software distributed under the License is distributed on an\n    * \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\n    * KIND, either express or implied.  See the License for the\n    * specific language governing permissions and limitations\n    * under the License.\n    */\n\n\n    /**\n     * AUTO-GENERATED FILE. DO NOT MODIFY.\n     */\n\n    /*\r\n    * Licensed to the Apache Software Foundation (ASF) under one\r\n    * or more contributor license agreements.  See the NOTICE file\r\n    * distributed with this work for additional information\r\n    * regarding copyright ownership.  The ASF licenses this file\r\n    * to you under the Apache License, Version 2.0 (the\r\n    * \"License\"); you may not use this file except in compliance\r\n    * with the License.  You may obtain a copy of the License at\r\n    *\r\n    *   http://www.apache.org/licenses/LICENSE-2.0\r\n    *\r\n    * Unless required by applicable law or agreed to in writing,\r\n    * software distributed under the License is distributed on an\r\n    * \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\r\n    * KIND, either express or implied.  See the License for the\r\n    * specific language governing permissions and limitations\r\n    * under the License.\r\n    */\n    var coordsOffsetMap = {\n      '南海诸岛': [32, 80],\n      // 全国\n      '广东': [0, -10],\n      '香港': [10, 5],\n      '澳门': [-10, 10],\n      // '北京': [-10, 0],\n      '天津': [5, 5]\n    };\n    function fixTextCoords(mapType, region) {\n      if (mapType === 'china') {\n        var coordFix = coordsOffsetMap[region.name];\n        if (coordFix) {\n          var cp = region.getCenter();\n          cp[0] += coordFix[0] / 10.5;\n          cp[1] += -coordFix[1] / (10.5 / 0.75);\n          region.setCenter(cp);\n        }\n      }\n    }\n\n    /*\n    * Licensed to the Apache Software Foundation (ASF) under one\n    * or more contributor license agreements.  See the NOTICE file\n    * distributed with this work for additional information\n    * regarding copyright ownership.  The ASF licenses this file\n    * to you under the Apache License, Version 2.0 (the\n    * \"License\"); you may not use this file except in compliance\n    * with the License.  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,\n    * software distributed under the License is distributed on an\n    * \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\n    * KIND, either express or implied.  See the License for the\n    * specific language governing permissions and limitations\n    * under the License.\n    */\n\n\n    /**\n     * AUTO-GENERATED FILE. DO NOT MODIFY.\n     */\n\n    /*\r\n    * Licensed to the Apache Software Foundation (ASF) under one\r\n    * or more contributor license agreements.  See the NOTICE file\r\n    * distributed with this work for additional information\r\n    * regarding copyright ownership.  The ASF licenses this file\r\n    * to you under the Apache License, Version 2.0 (the\r\n    * \"License\"); you may not use this file except in compliance\r\n    * with the License.  You may obtain a copy of the License at\r\n    *\r\n    *   http://www.apache.org/licenses/LICENSE-2.0\r\n    *\r\n    * Unless required by applicable law or agreed to in writing,\r\n    * software distributed under the License is distributed on an\r\n    * \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\r\n    * KIND, either express or implied.  See the License for the\r\n    * specific language governing permissions and limitations\r\n    * under the License.\r\n    */\n    // Fix for 钓鱼岛\n    // let Region = require('../Region');\n    // let zrUtil = require('zrender/lib/core/util');\n    // let geoCoord = [126, 25];\n    var points$2 = [[[123.45165252685547, 25.73527164402261], [123.49731445312499, 25.73527164402261], [123.49731445312499, 25.750734064600884], [123.45165252685547, 25.750734064600884], [123.45165252685547, 25.73527164402261]]];\n    function fixDiaoyuIsland(mapType, region) {\n      if (mapType === 'china' && region.name === '台湾') {\n        region.geometries.push({\n          type: 'polygon',\n          exterior: points$2[0]\n        });\n      }\n    }\n\n    var DEFAULT_NAME_PROPERTY = 'name';\n    var GeoJSONResource = /** @class */function () {\n      function GeoJSONResource(mapName, geoJSON, specialAreas) {\n        this.type = 'geoJSON';\n        this._parsedMap = createHashMap();\n        this._mapName = mapName;\n        this._specialAreas = specialAreas;\n        // PENDING: delay the parse to the first usage to rapid up the FMP?\n        this._geoJSON = parseInput(geoJSON);\n      }\n      /**\r\n       * @param nameMap can be null/undefined\r\n       * @param nameProperty can be null/undefined\r\n       */\n      GeoJSONResource.prototype.load = function (nameMap, nameProperty) {\n        nameProperty = nameProperty || DEFAULT_NAME_PROPERTY;\n        var parsed = this._parsedMap.get(nameProperty);\n        if (!parsed) {\n          var rawRegions = this._parseToRegions(nameProperty);\n          parsed = this._parsedMap.set(nameProperty, {\n            regions: rawRegions,\n            boundingRect: calculateBoundingRect(rawRegions)\n          });\n        }\n        var regionsMap = createHashMap();\n        var finalRegions = [];\n        each(parsed.regions, function (region) {\n          var regionName = region.name;\n          // Try use the alias in geoNameMap\n          if (nameMap && hasOwn(nameMap, regionName)) {\n            region = region.cloneShallow(regionName = nameMap[regionName]);\n          }\n          finalRegions.push(region);\n          regionsMap.set(regionName, region);\n        });\n        return {\n          regions: finalRegions,\n          boundingRect: parsed.boundingRect || new BoundingRect(0, 0, 0, 0),\n          regionsMap: regionsMap\n        };\n      };\n      GeoJSONResource.prototype._parseToRegions = function (nameProperty) {\n        var mapName = this._mapName;\n        var geoJSON = this._geoJSON;\n        var rawRegions;\n        // https://jsperf.com/try-catch-performance-overhead\n        try {\n          rawRegions = geoJSON ? parseGeoJSON(geoJSON, nameProperty) : [];\n        } catch (e) {\n          throw new Error('Invalid geoJson format\\n' + e.message);\n        }\n        fixNanhai(mapName, rawRegions);\n        each(rawRegions, function (region) {\n          var regionName = region.name;\n          fixTextCoords(mapName, region);\n          fixDiaoyuIsland(mapName, region);\n          // Some area like Alaska in USA map needs to be tansformed\n          // to look better\n          var specialArea = this._specialAreas && this._specialAreas[regionName];\n          if (specialArea) {\n            region.transformTo(specialArea.left, specialArea.top, specialArea.width, specialArea.height);\n          }\n        }, this);\n        return rawRegions;\n      };\n      /**\r\n       * Only for exporting to users.\r\n       * **MUST NOT** used internally.\r\n       */\n      GeoJSONResource.prototype.getMapForUser = function () {\n        return {\n          // For backward compatibility, use geoJson\n          // PENDING: it has been returning them without clone.\n          // do we need to avoid outsite modification?\n          geoJson: this._geoJSON,\n          geoJSON: this._geoJSON,\n          specialAreas: this._specialAreas\n        };\n      };\n      return GeoJSONResource;\n    }();\n    function calculateBoundingRect(regions) {\n      var rect;\n      for (var i = 0; i < regions.length; i++) {\n        var regionRect = regions[i].getBoundingRect();\n        rect = rect || regionRect.clone();\n        rect.union(regionRect);\n      }\n      return rect;\n    }\n    function parseInput(source) {\n      return !isString(source) ? source : typeof JSON !== 'undefined' && JSON.parse ? JSON.parse(source) : new Function('return (' + source + ');')();\n    }\n\n    var storage = createHashMap();\n    var geoSourceManager = {\n      /**\r\n       * Compatible with previous `echarts.registerMap`.\r\n       *\r\n       * @usage\r\n       * ```js\r\n       *\r\n       * echarts.registerMap('USA', geoJson, specialAreas);\r\n       *\r\n       * echarts.registerMap('USA', {\r\n       *     geoJson: geoJson,\r\n       *     specialAreas: {...}\r\n       * });\r\n       * echarts.registerMap('USA', {\r\n       *     geoJSON: geoJson,\r\n       *     specialAreas: {...}\r\n       * });\r\n       *\r\n       * echarts.registerMap('airport', {\r\n       *     svg: svg\r\n       * }\r\n       * ```\r\n       *\r\n       * Note:\r\n       * Do not support that register multiple geoJSON or SVG\r\n       * one map name. Because different geoJSON and SVG have\r\n       * different unit. It's not easy to make sure how those\r\n       * units are mapping/normalize.\r\n       * If intending to use multiple geoJSON or SVG, we can\r\n       * use multiple geo coordinate system.\r\n       */\n      registerMap: function (mapName, rawDef, rawSpecialAreas) {\n        if (rawDef.svg) {\n          var resource = new GeoSVGResource(mapName, rawDef.svg);\n          storage.set(mapName, resource);\n        } else {\n          // Recommend:\n          //     echarts.registerMap('eu', { geoJSON: xxx, specialAreas: xxx });\n          // Backward compatibility:\n          //     echarts.registerMap('eu', geoJSON, specialAreas);\n          //     echarts.registerMap('eu', { geoJson: xxx, specialAreas: xxx });\n          var geoJSON = rawDef.geoJson || rawDef.geoJSON;\n          if (geoJSON && !rawDef.features) {\n            rawSpecialAreas = rawDef.specialAreas;\n          } else {\n            geoJSON = rawDef;\n          }\n          var resource = new GeoJSONResource(mapName, geoJSON, rawSpecialAreas);\n          storage.set(mapName, resource);\n        }\n      },\n      getGeoResource: function (mapName) {\n        return storage.get(mapName);\n      },\n      /**\r\n       * Only for exporting to users.\r\n       * **MUST NOT** used internally.\r\n       */\n      getMapForUser: function (mapName) {\n        var resource = storage.get(mapName);\n        // Do not support return SVG until some real requirement come.\n        return resource && resource.type === 'geoJSON' && resource.getMapForUser();\n      },\n      load: function (mapName, nameMap, nameProperty) {\n        var resource = storage.get(mapName);\n        if (!resource) {\n          if (\"development\" !== 'production') {\n            console.error('Map ' + mapName + ' not exists. The GeoJSON of the map must be provided.');\n          }\n          return;\n        }\n        return resource.load(nameMap, nameProperty);\n      }\n    };\n\n    /**\r\n     * Only these tags enable use `itemStyle` if they are named in SVG.\r\n     * Other tags like <text> <tspan> <image> might not suitable for `itemStyle`.\r\n     * They will not be considered to be styled until some requirements come.\r\n     */\n    var OPTION_STYLE_ENABLED_TAGS = ['rect', 'circle', 'line', 'ellipse', 'polygon', 'polyline', 'path'];\n    var OPTION_STYLE_ENABLED_TAG_MAP = createHashMap(OPTION_STYLE_ENABLED_TAGS);\n    var STATE_TRIGGER_TAG_MAP = createHashMap(OPTION_STYLE_ENABLED_TAGS.concat(['g']));\n    var LABEL_HOST_MAP = createHashMap(OPTION_STYLE_ENABLED_TAGS.concat(['g']));\n    var mapLabelRaw = makeInner();\n    function getFixedItemStyle(model) {\n      var itemStyle = model.getItemStyle();\n      var areaColor = model.get('areaColor');\n      // If user want the color not to be changed when hover,\n      // they should both set areaColor and color to be null.\n      if (areaColor != null) {\n        itemStyle.fill = areaColor;\n      }\n      return itemStyle;\n    }\n    // Only stroke can be used for line.\n    // Using fill in style if stroke not exits.\n    // TODO Not sure yet. Perhaps a separate `lineStyle`?\n    function fixLineStyle(styleHost) {\n      var style = styleHost.style;\n      if (style) {\n        style.stroke = style.stroke || style.fill;\n        style.fill = null;\n      }\n    }\n    var MapDraw = /** @class */function () {\n      function MapDraw(api) {\n        var group = new Group();\n        this.uid = getUID('ec_map_draw');\n        this._controller = new RoamController(api.getZr());\n        this._controllerHost = {\n          target: group\n        };\n        this.group = group;\n        group.add(this._regionsGroup = new Group());\n        group.add(this._svgGroup = new Group());\n      }\n      MapDraw.prototype.draw = function (mapOrGeoModel, ecModel, api, fromView, payload) {\n        var isGeo = mapOrGeoModel.mainType === 'geo';\n        // Map series has data. GEO model that controlled by map series\n        // will be assigned with map data. Other GEO model has no data.\n        var data = mapOrGeoModel.getData && mapOrGeoModel.getData();\n        isGeo && ecModel.eachComponent({\n          mainType: 'series',\n          subType: 'map'\n        }, function (mapSeries) {\n          if (!data && mapSeries.getHostGeoModel() === mapOrGeoModel) {\n            data = mapSeries.getData();\n          }\n        });\n        var geo = mapOrGeoModel.coordinateSystem;\n        var regionsGroup = this._regionsGroup;\n        var group = this.group;\n        var transformInfo = geo.getTransformInfo();\n        var transformInfoRaw = transformInfo.raw;\n        var transformInfoRoam = transformInfo.roam;\n        // No animation when first draw or in action\n        var isFirstDraw = !regionsGroup.childAt(0) || payload;\n        if (isFirstDraw) {\n          group.x = transformInfoRoam.x;\n          group.y = transformInfoRoam.y;\n          group.scaleX = transformInfoRoam.scaleX;\n          group.scaleY = transformInfoRoam.scaleY;\n          group.dirty();\n        } else {\n          updateProps(group, transformInfoRoam, mapOrGeoModel);\n        }\n        var isVisualEncodedByVisualMap = data && data.getVisual('visualMeta') && data.getVisual('visualMeta').length > 0;\n        var viewBuildCtx = {\n          api: api,\n          geo: geo,\n          mapOrGeoModel: mapOrGeoModel,\n          data: data,\n          isVisualEncodedByVisualMap: isVisualEncodedByVisualMap,\n          isGeo: isGeo,\n          transformInfoRaw: transformInfoRaw\n        };\n        if (geo.resourceType === 'geoJSON') {\n          this._buildGeoJSON(viewBuildCtx);\n        } else if (geo.resourceType === 'geoSVG') {\n          this._buildSVG(viewBuildCtx);\n        }\n        this._updateController(mapOrGeoModel, ecModel, api);\n        this._updateMapSelectHandler(mapOrGeoModel, regionsGroup, api, fromView);\n      };\n      MapDraw.prototype._buildGeoJSON = function (viewBuildCtx) {\n        var regionsGroupByName = this._regionsGroupByName = createHashMap();\n        var regionsInfoByName = createHashMap();\n        var regionsGroup = this._regionsGroup;\n        var transformInfoRaw = viewBuildCtx.transformInfoRaw;\n        var mapOrGeoModel = viewBuildCtx.mapOrGeoModel;\n        var data = viewBuildCtx.data;\n        var projection = viewBuildCtx.geo.projection;\n        var projectionStream = projection && projection.stream;\n        function transformPoint(point, project) {\n          if (project) {\n            // projection may return null point.\n            point = project(point);\n          }\n          return point && [point[0] * transformInfoRaw.scaleX + transformInfoRaw.x, point[1] * transformInfoRaw.scaleY + transformInfoRaw.y];\n        }\n        function transformPolygonPoints(inPoints) {\n          var outPoints = [];\n          // If projectionStream is provided. Use it instead of single point project.\n          var project = !projectionStream && projection && projection.project;\n          for (var i = 0; i < inPoints.length; ++i) {\n            var newPt = transformPoint(inPoints[i], project);\n            newPt && outPoints.push(newPt);\n          }\n          return outPoints;\n        }\n        function getPolyShape(points) {\n          return {\n            shape: {\n              points: transformPolygonPoints(points)\n            }\n          };\n        }\n        regionsGroup.removeAll();\n        // Only when the resource is GeoJSON, there is `geo.regions`.\n        each(viewBuildCtx.geo.regions, function (region) {\n          var regionName = region.name;\n          // Consider in GeoJson properties.name may be duplicated, for example,\n          // there is multiple region named \"United Kindom\" or \"France\" (so many\n          // colonies). And it is not appropriate to merge them in geo, which\n          // will make them share the same label and bring trouble in label\n          // location calculation.\n          var regionGroup = regionsGroupByName.get(regionName);\n          var _a = regionsInfoByName.get(regionName) || {},\n            dataIdx = _a.dataIdx,\n            regionModel = _a.regionModel;\n          if (!regionGroup) {\n            regionGroup = regionsGroupByName.set(regionName, new Group());\n            regionsGroup.add(regionGroup);\n            dataIdx = data ? data.indexOfName(regionName) : null;\n            regionModel = viewBuildCtx.isGeo ? mapOrGeoModel.getRegionModel(regionName) : data ? data.getItemModel(dataIdx) : null;\n            var silent = regionModel.get('silent', true);\n            silent != null && (regionGroup.silent = silent);\n            regionsInfoByName.set(regionName, {\n              dataIdx: dataIdx,\n              regionModel: regionModel\n            });\n          }\n          var polygonSubpaths = [];\n          var polylineSubpaths = [];\n          each(region.geometries, function (geometry) {\n            // Polygon and MultiPolygon\n            if (geometry.type === 'polygon') {\n              var polys = [geometry.exterior].concat(geometry.interiors || []);\n              if (projectionStream) {\n                polys = projectPolys(polys, projectionStream);\n              }\n              each(polys, function (poly) {\n                polygonSubpaths.push(new Polygon(getPolyShape(poly)));\n              });\n            }\n            // LineString and MultiLineString\n            else {\n              var points = geometry.points;\n              if (projectionStream) {\n                points = projectPolys(points, projectionStream, true);\n              }\n              each(points, function (points) {\n                polylineSubpaths.push(new Polyline(getPolyShape(points)));\n              });\n            }\n          });\n          var centerPt = transformPoint(region.getCenter(), projection && projection.project);\n          function createCompoundPath(subpaths, isLine) {\n            if (!subpaths.length) {\n              return;\n            }\n            var compoundPath = new CompoundPath({\n              culling: true,\n              segmentIgnoreThreshold: 1,\n              shape: {\n                paths: subpaths\n              }\n            });\n            regionGroup.add(compoundPath);\n            applyOptionStyleForRegion(viewBuildCtx, compoundPath, dataIdx, regionModel);\n            resetLabelForRegion(viewBuildCtx, compoundPath, regionName, regionModel, mapOrGeoModel, dataIdx, centerPt);\n            if (isLine) {\n              fixLineStyle(compoundPath);\n              each(compoundPath.states, fixLineStyle);\n            }\n          }\n          createCompoundPath(polygonSubpaths);\n          createCompoundPath(polylineSubpaths, true);\n        });\n        // Ensure children have been added to `regionGroup` before calling them.\n        regionsGroupByName.each(function (regionGroup, regionName) {\n          var _a = regionsInfoByName.get(regionName),\n            dataIdx = _a.dataIdx,\n            regionModel = _a.regionModel;\n          resetEventTriggerForRegion(viewBuildCtx, regionGroup, regionName, regionModel, mapOrGeoModel, dataIdx);\n          resetTooltipForRegion(viewBuildCtx, regionGroup, regionName, regionModel, mapOrGeoModel);\n          resetStateTriggerForRegion(viewBuildCtx, regionGroup, regionName, regionModel, mapOrGeoModel);\n        }, this);\n      };\n      MapDraw.prototype._buildSVG = function (viewBuildCtx) {\n        var mapName = viewBuildCtx.geo.map;\n        var transformInfoRaw = viewBuildCtx.transformInfoRaw;\n        this._svgGroup.x = transformInfoRaw.x;\n        this._svgGroup.y = transformInfoRaw.y;\n        this._svgGroup.scaleX = transformInfoRaw.scaleX;\n        this._svgGroup.scaleY = transformInfoRaw.scaleY;\n        if (this._svgResourceChanged(mapName)) {\n          this._freeSVG();\n          this._useSVG(mapName);\n        }\n        var svgDispatcherMap = this._svgDispatcherMap = createHashMap();\n        var focusSelf = false;\n        each(this._svgGraphicRecord.named, function (namedItem) {\n          // Note that we also allow different elements have the same name.\n          // For example, a glyph of a city and the label of the city have\n          // the same name and their tooltip info can be defined in a single\n          // region option.\n          var regionName = namedItem.name;\n          var mapOrGeoModel = viewBuildCtx.mapOrGeoModel;\n          var data = viewBuildCtx.data;\n          var svgNodeTagLower = namedItem.svgNodeTagLower;\n          var el = namedItem.el;\n          var dataIdx = data ? data.indexOfName(regionName) : null;\n          var regionModel = mapOrGeoModel.getRegionModel(regionName);\n          if (OPTION_STYLE_ENABLED_TAG_MAP.get(svgNodeTagLower) != null && el instanceof Displayable) {\n            applyOptionStyleForRegion(viewBuildCtx, el, dataIdx, regionModel);\n          }\n          if (el instanceof Displayable) {\n            el.culling = true;\n          }\n          var silent = regionModel.get('silent', true);\n          silent != null && (el.silent = silent);\n          // We do not know how the SVG like so we'd better not to change z2.\n          // Otherwise it might bring some unexpected result. For example,\n          // an area hovered that make some inner city can not be clicked.\n          el.z2EmphasisLift = 0;\n          // If self named:\n          if (!namedItem.namedFrom) {\n            // label should batter to be displayed based on the center of <g>\n            // if it is named rather than displayed on each child.\n            if (LABEL_HOST_MAP.get(svgNodeTagLower) != null) {\n              resetLabelForRegion(viewBuildCtx, el, regionName, regionModel, mapOrGeoModel, dataIdx, null);\n            }\n            resetEventTriggerForRegion(viewBuildCtx, el, regionName, regionModel, mapOrGeoModel, dataIdx);\n            resetTooltipForRegion(viewBuildCtx, el, regionName, regionModel, mapOrGeoModel);\n            if (STATE_TRIGGER_TAG_MAP.get(svgNodeTagLower) != null) {\n              var focus_1 = resetStateTriggerForRegion(viewBuildCtx, el, regionName, regionModel, mapOrGeoModel);\n              if (focus_1 === 'self') {\n                focusSelf = true;\n              }\n              var els = svgDispatcherMap.get(regionName) || svgDispatcherMap.set(regionName, []);\n              els.push(el);\n            }\n          }\n        }, this);\n        this._enableBlurEntireSVG(focusSelf, viewBuildCtx);\n      };\n      MapDraw.prototype._enableBlurEntireSVG = function (focusSelf, viewBuildCtx) {\n        // It's a little complicated to support blurring the entire geoSVG in series-map.\n        // So do not support it until some requirements come.\n        // At present, in series-map, only regions can be blurred.\n        if (focusSelf && viewBuildCtx.isGeo) {\n          var blurStyle = viewBuildCtx.mapOrGeoModel.getModel(['blur', 'itemStyle']).getItemStyle();\n          // Only support `opacity` here. Because not sure that other props are suitable for\n          // all of the elements generated by SVG (especially for Text/TSpan/Image/... ).\n          var opacity_1 = blurStyle.opacity;\n          this._svgGraphicRecord.root.traverse(function (el) {\n            if (!el.isGroup) {\n              // PENDING: clear those settings to SVG elements when `_freeSVG`.\n              // (Currently it happen not to be needed.)\n              setDefaultStateProxy(el);\n              var style = el.ensureState('blur').style || {};\n              // Do not overwrite the region style that already set from region option.\n              if (style.opacity == null && opacity_1 != null) {\n                style.opacity = opacity_1;\n              }\n              // If `ensureState('blur').style = {}`, there will be default opacity.\n              // Enable `stateTransition` (animation).\n              el.ensureState('emphasis');\n            }\n          });\n        }\n      };\n      MapDraw.prototype.remove = function () {\n        this._regionsGroup.removeAll();\n        this._regionsGroupByName = null;\n        this._svgGroup.removeAll();\n        this._freeSVG();\n        this._controller.dispose();\n        this._controllerHost = null;\n      };\n      MapDraw.prototype.findHighDownDispatchers = function (name, geoModel) {\n        if (name == null) {\n          return [];\n        }\n        var geo = geoModel.coordinateSystem;\n        if (geo.resourceType === 'geoJSON') {\n          var regionsGroupByName = this._regionsGroupByName;\n          if (regionsGroupByName) {\n            var regionGroup = regionsGroupByName.get(name);\n            return regionGroup ? [regionGroup] : [];\n          }\n        } else if (geo.resourceType === 'geoSVG') {\n          return this._svgDispatcherMap && this._svgDispatcherMap.get(name) || [];\n        }\n      };\n      MapDraw.prototype._svgResourceChanged = function (mapName) {\n        return this._svgMapName !== mapName;\n      };\n      MapDraw.prototype._useSVG = function (mapName) {\n        var resource = geoSourceManager.getGeoResource(mapName);\n        if (resource && resource.type === 'geoSVG') {\n          var svgGraphic = resource.useGraphic(this.uid);\n          this._svgGroup.add(svgGraphic.root);\n          this._svgGraphicRecord = svgGraphic;\n          this._svgMapName = mapName;\n        }\n      };\n      MapDraw.prototype._freeSVG = function () {\n        var mapName = this._svgMapName;\n        if (mapName == null) {\n          return;\n        }\n        var resource = geoSourceManager.getGeoResource(mapName);\n        if (resource && resource.type === 'geoSVG') {\n          resource.freeGraphic(this.uid);\n        }\n        this._svgGraphicRecord = null;\n        this._svgDispatcherMap = null;\n        this._svgGroup.removeAll();\n        this._svgMapName = null;\n      };\n      MapDraw.prototype._updateController = function (mapOrGeoModel, ecModel, api) {\n        var geo = mapOrGeoModel.coordinateSystem;\n        var controller = this._controller;\n        var controllerHost = this._controllerHost;\n        // @ts-ignore FIXME:TS\n        controllerHost.zoomLimit = mapOrGeoModel.get('scaleLimit');\n        controllerHost.zoom = geo.getZoom();\n        // roamType is will be set default true if it is null\n        // @ts-ignore FIXME:TS\n        controller.enable(mapOrGeoModel.get('roam') || false);\n        var mainType = mapOrGeoModel.mainType;\n        function makeActionBase() {\n          var action = {\n            type: 'geoRoam',\n            componentType: mainType\n          };\n          action[mainType + 'Id'] = mapOrGeoModel.id;\n          return action;\n        }\n        controller.off('pan').on('pan', function (e) {\n          this._mouseDownFlag = false;\n          updateViewOnPan(controllerHost, e.dx, e.dy);\n          api.dispatchAction(extend(makeActionBase(), {\n            dx: e.dx,\n            dy: e.dy,\n            animation: {\n              duration: 0\n            }\n          }));\n        }, this);\n        controller.off('zoom').on('zoom', function (e) {\n          this._mouseDownFlag = false;\n          updateViewOnZoom(controllerHost, e.scale, e.originX, e.originY);\n          api.dispatchAction(extend(makeActionBase(), {\n            totalZoom: controllerHost.zoom,\n            zoom: e.scale,\n            originX: e.originX,\n            originY: e.originY,\n            animation: {\n              duration: 0\n            }\n          }));\n        }, this);\n        controller.setPointerChecker(function (e, x, y) {\n          return geo.containPoint([x, y]) && !onIrrelevantElement(e, api, mapOrGeoModel);\n        });\n      };\n      /**\r\n       * FIXME: this is a temporarily workaround.\r\n       * When `geoRoam` the elements need to be reset in `MapView['render']`, because the props like\r\n       * `ignore` might have been modified by `LabelManager`, and `LabelManager#addLabelsOfSeries`\r\n       * will subsequently cache `defaultAttr` like `ignore`. If do not do this reset, the modified\r\n       * props will have no chance to be restored.\r\n       * Note: This reset should be after `clearStates` in `renderSeries` because `useStates` in\r\n       * `renderSeries` will cache the modified `ignore` to `el._normalState`.\r\n       * TODO:\r\n       * Use clone/immutable in `LabelManager`?\r\n       */\n      MapDraw.prototype.resetForLabelLayout = function () {\n        this.group.traverse(function (el) {\n          var label = el.getTextContent();\n          if (label) {\n            label.ignore = mapLabelRaw(label).ignore;\n          }\n        });\n      };\n      MapDraw.prototype._updateMapSelectHandler = function (mapOrGeoModel, regionsGroup, api, fromView) {\n        var mapDraw = this;\n        regionsGroup.off('mousedown');\n        regionsGroup.off('click');\n        // @ts-ignore FIXME:TS resolve type conflict\n        if (mapOrGeoModel.get('selectedMode')) {\n          regionsGroup.on('mousedown', function () {\n            mapDraw._mouseDownFlag = true;\n          });\n          regionsGroup.on('click', function (e) {\n            if (!mapDraw._mouseDownFlag) {\n              return;\n            }\n            mapDraw._mouseDownFlag = false;\n          });\n        }\n      };\n      return MapDraw;\n    }();\n    function applyOptionStyleForRegion(viewBuildCtx, el, dataIndex, regionModel) {\n      // All of the path are using `itemStyle`, because\n      // (1) Some SVG also use fill on polyline (The different between\n      // polyline and polygon is \"open\" or \"close\" but not fill or not).\n      // (2) For the common props like opacity, if some use itemStyle\n      // and some use `lineStyle`, it might confuse users.\n      // (3) Most SVG use <path>, where can not detect whether to draw a \"line\"\n      // or a filled shape, so use `itemStyle` for <path>.\n      var normalStyleModel = regionModel.getModel('itemStyle');\n      var emphasisStyleModel = regionModel.getModel(['emphasis', 'itemStyle']);\n      var blurStyleModel = regionModel.getModel(['blur', 'itemStyle']);\n      var selectStyleModel = regionModel.getModel(['select', 'itemStyle']);\n      // NOTE: DON'T use 'style' in visual when drawing map.\n      // This component is used for drawing underlying map for both geo component and map series.\n      var normalStyle = getFixedItemStyle(normalStyleModel);\n      var emphasisStyle = getFixedItemStyle(emphasisStyleModel);\n      var selectStyle = getFixedItemStyle(selectStyleModel);\n      var blurStyle = getFixedItemStyle(blurStyleModel);\n      // Update the itemStyle if has data visual\n      var data = viewBuildCtx.data;\n      if (data) {\n        // Only visual color of each item will be used. It can be encoded by visualMap\n        // But visual color of series is used in symbol drawing\n        // Visual color for each series is for the symbol draw\n        var style = data.getItemVisual(dataIndex, 'style');\n        var decal = data.getItemVisual(dataIndex, 'decal');\n        if (viewBuildCtx.isVisualEncodedByVisualMap && style.fill) {\n          normalStyle.fill = style.fill;\n        }\n        if (decal) {\n          normalStyle.decal = createOrUpdatePatternFromDecal(decal, viewBuildCtx.api);\n        }\n      }\n      // SVG text, tspan and image can be named but not supporeted\n      // to be styled by region option yet.\n      el.setStyle(normalStyle);\n      el.style.strokeNoScale = true;\n      el.ensureState('emphasis').style = emphasisStyle;\n      el.ensureState('select').style = selectStyle;\n      el.ensureState('blur').style = blurStyle;\n      // Enable blur\n      setDefaultStateProxy(el);\n    }\n    function resetLabelForRegion(viewBuildCtx, el, regionName, regionModel, mapOrGeoModel,\n    // Exist only if `viewBuildCtx.data` exists.\n    dataIdx,\n    // If labelXY not provided, use `textConfig.position: 'inside'`\n    labelXY) {\n      var data = viewBuildCtx.data;\n      var isGeo = viewBuildCtx.isGeo;\n      var isDataNaN = data && isNaN(data.get(data.mapDimension('value'), dataIdx));\n      var itemLayout = data && data.getItemLayout(dataIdx);\n      // In the following cases label will be drawn\n      // 1. In map series and data value is NaN\n      // 2. In geo component\n      // 3. Region has no series legendIcon, which will be add a showLabel flag in mapSymbolLayout\n      if (isGeo || isDataNaN || itemLayout && itemLayout.showLabel) {\n        var query = !isGeo ? dataIdx : regionName;\n        var labelFetcher = void 0;\n        // Consider dataIdx not found.\n        if (!data || dataIdx >= 0) {\n          labelFetcher = mapOrGeoModel;\n        }\n        var specifiedTextOpt = labelXY ? {\n          normal: {\n            align: 'center',\n            verticalAlign: 'middle'\n          }\n        } : null;\n        // Caveat: must be called after `setDefaultStateProxy(el);` called.\n        // because textContent will be assign with `el.stateProxy` inside.\n        setLabelStyle(el, getLabelStatesModels(regionModel), {\n          labelFetcher: labelFetcher,\n          labelDataIndex: query,\n          defaultText: regionName\n        }, specifiedTextOpt);\n        var textEl = el.getTextContent();\n        if (textEl) {\n          mapLabelRaw(textEl).ignore = textEl.ignore;\n          if (el.textConfig && labelXY) {\n            // Compute a relative offset based on the el bounding rect.\n            var rect = el.getBoundingRect().clone();\n            // Need to make sure the percent position base on the same rect in normal and\n            // emphasis state. Otherwise if using boundingRect of el, but the emphasis state\n            // has borderWidth (even 0.5px), the text position will be changed obviously\n            // if the position is very big like ['1234%', '1345%'].\n            el.textConfig.layoutRect = rect;\n            el.textConfig.position = [(labelXY[0] - rect.x) / rect.width * 100 + '%', (labelXY[1] - rect.y) / rect.height * 100 + '%'];\n          }\n        }\n        // PENDING:\n        // If labelLayout is enabled (test/label-layout.html), el.dataIndex should be specified.\n        // But el.dataIndex is also used to determine whether user event should be triggered,\n        // where el.seriesIndex or el.dataModel must be specified. At present for a single el\n        // there is not case that \"only label layout enabled but user event disabled\", so here\n        // we depends `resetEventTriggerForRegion` to do the job of setting `el.dataIndex`.\n        el.disableLabelAnimation = true;\n      } else {\n        el.removeTextContent();\n        el.removeTextConfig();\n        el.disableLabelAnimation = null;\n      }\n    }\n    function resetEventTriggerForRegion(viewBuildCtx, eventTrigger, regionName, regionModel, mapOrGeoModel,\n    // Exist only if `viewBuildCtx.data` exists.\n    dataIdx) {\n      // setItemGraphicEl, setHoverStyle after all polygons and labels\n      // are added to the regionGroup\n      if (viewBuildCtx.data) {\n        // FIXME: when series-map use a SVG map, and there are duplicated name specified\n        // on different SVG elements, after `data.setItemGraphicEl(...)`:\n        // (1) all of them will be mounted with `dataIndex`, `seriesIndex`, so that tooltip\n        // can be triggered only mouse hover. That's correct.\n        // (2) only the last element will be kept in `data`, so that if trigger tooltip\n        // by `dispatchAction`, only the last one can be found and triggered. That might be\n        // not correct. We will fix it in future if anyone demanding that.\n        viewBuildCtx.data.setItemGraphicEl(dataIdx, eventTrigger);\n      }\n      // series-map will not trigger \"geoselectchange\" no matter it is\n      // based on a declared geo component. Because series-map will\n      // trigger \"selectchange\". If it trigger both the two events,\n      // If users call `chart.dispatchAction({type: 'toggleSelect'})`,\n      // it not easy to also fire event \"geoselectchanged\".\n      else {\n        // Package custom mouse event for geo component\n        getECData(eventTrigger).eventData = {\n          componentType: 'geo',\n          componentIndex: mapOrGeoModel.componentIndex,\n          geoIndex: mapOrGeoModel.componentIndex,\n          name: regionName,\n          region: regionModel && regionModel.option || {}\n        };\n      }\n    }\n    function resetTooltipForRegion(viewBuildCtx, el, regionName, regionModel, mapOrGeoModel) {\n      if (!viewBuildCtx.data) {\n        setTooltipConfig({\n          el: el,\n          componentModel: mapOrGeoModel,\n          itemName: regionName,\n          // @ts-ignore FIXME:TS fix the \"compatible with each other\"?\n          itemTooltipOption: regionModel.get('tooltip')\n        });\n      }\n    }\n    function resetStateTriggerForRegion(viewBuildCtx, el, regionName, regionModel, mapOrGeoModel) {\n      // @ts-ignore FIXME:TS fix the \"compatible with each other\"?\n      el.highDownSilentOnTouch = !!mapOrGeoModel.get('selectedMode');\n      // @ts-ignore FIXME:TS fix the \"compatible with each other\"?\n      var emphasisModel = regionModel.getModel('emphasis');\n      var focus = emphasisModel.get('focus');\n      toggleHoverEmphasis(el, focus, emphasisModel.get('blurScope'), emphasisModel.get('disabled'));\n      if (viewBuildCtx.isGeo) {\n        enableComponentHighDownFeatures(el, mapOrGeoModel, regionName);\n      }\n      return focus;\n    }\n    function projectPolys(rings,\n    // Polygons include exterior and interiors. Or polylines.\n    createStream, isLine) {\n      var polygons = [];\n      var curPoly;\n      function startPolygon() {\n        curPoly = [];\n      }\n      function endPolygon() {\n        if (curPoly.length) {\n          polygons.push(curPoly);\n          curPoly = [];\n        }\n      }\n      var stream = createStream({\n        polygonStart: startPolygon,\n        polygonEnd: endPolygon,\n        lineStart: startPolygon,\n        lineEnd: endPolygon,\n        point: function (x, y) {\n          // May have NaN values from stream.\n          if (isFinite(x) && isFinite(y)) {\n            curPoly.push([x, y]);\n          }\n        },\n        sphere: function () {}\n      });\n      !isLine && stream.polygonStart();\n      each(rings, function (ring) {\n        stream.lineStart();\n        for (var i = 0; i < ring.length; i++) {\n          stream.point(ring[i][0], ring[i][1]);\n        }\n        stream.lineEnd();\n      });\n      !isLine && stream.polygonEnd();\n      return polygons;\n    }\n    // @ts-ignore FIXME:TS fix the \"compatible with each other\"?\n\n    var MapView = /** @class */function (_super) {\n      __extends(MapView, _super);\n      function MapView() {\n        var _this = _super !== null && _super.apply(this, arguments) || this;\n        _this.type = MapView.type;\n        return _this;\n      }\n      MapView.prototype.render = function (mapModel, ecModel, api, payload) {\n        // Not render if it is an toggleSelect action from self\n        if (payload && payload.type === 'mapToggleSelect' && payload.from === this.uid) {\n          return;\n        }\n        var group = this.group;\n        group.removeAll();\n        if (mapModel.getHostGeoModel()) {\n          return;\n        }\n        if (this._mapDraw && payload && payload.type === 'geoRoam') {\n          this._mapDraw.resetForLabelLayout();\n        }\n        // Not update map if it is an roam action from self\n        if (!(payload && payload.type === 'geoRoam' && payload.componentType === 'series' && payload.seriesId === mapModel.id)) {\n          if (mapModel.needsDrawMap) {\n            var mapDraw = this._mapDraw || new MapDraw(api);\n            group.add(mapDraw.group);\n            mapDraw.draw(mapModel, ecModel, api, this, payload);\n            this._mapDraw = mapDraw;\n          } else {\n            // Remove drawn map\n            this._mapDraw && this._mapDraw.remove();\n            this._mapDraw = null;\n          }\n        } else {\n          var mapDraw = this._mapDraw;\n          mapDraw && group.add(mapDraw.group);\n        }\n        mapModel.get('showLegendSymbol') && ecModel.getComponent('legend') && this._renderSymbols(mapModel, ecModel, api);\n      };\n      MapView.prototype.remove = function () {\n        this._mapDraw && this._mapDraw.remove();\n        this._mapDraw = null;\n        this.group.removeAll();\n      };\n      MapView.prototype.dispose = function () {\n        this._mapDraw && this._mapDraw.remove();\n        this._mapDraw = null;\n      };\n      MapView.prototype._renderSymbols = function (mapModel, ecModel, api) {\n        var originalData = mapModel.originalData;\n        var group = this.group;\n        originalData.each(originalData.mapDimension('value'), function (value, originalDataIndex) {\n          if (isNaN(value)) {\n            return;\n          }\n          var layout = originalData.getItemLayout(originalDataIndex);\n          if (!layout || !layout.point) {\n            // Not exists in map\n            return;\n          }\n          var point = layout.point;\n          var offset = layout.offset;\n          var circle = new Circle({\n            style: {\n              // Because the special of map draw.\n              // Which needs statistic of multiple series and draw on one map.\n              // And each series also need a symbol with legend color\n              //\n              // Layout and visual are put one the different data\n              // TODO\n              fill: mapModel.getData().getVisual('style').fill\n            },\n            shape: {\n              cx: point[0] + offset * 9,\n              cy: point[1],\n              r: 3\n            },\n            silent: true,\n            // Do not overlap the first series, on which labels are displayed.\n            z2: 8 + (!offset ? Z2_EMPHASIS_LIFT + 1 : 0)\n          });\n          // Only the series that has the first value on the same region is in charge of rendering the label.\n          // But consider the case:\n          // series: [\n          //     {id: 'X', type: 'map', map: 'm', {data: [{name: 'A', value: 11}, {name: 'B', {value: 22}]},\n          //     {id: 'Y', type: 'map', map: 'm', {data: [{name: 'A', value: 21}, {name: 'C', {value: 33}]}\n          // ]\n          // The offset `0` of item `A` is at series `X`, but of item `C` is at series `Y`.\n          // For backward compatibility, we follow the rule that render label `A` by the\n          // settings on series `X` but render label `C` by the settings on series `Y`.\n          if (!offset) {\n            var fullData = mapModel.mainSeries.getData();\n            var name_1 = originalData.getName(originalDataIndex);\n            var fullIndex_1 = fullData.indexOfName(name_1);\n            var itemModel = originalData.getItemModel(originalDataIndex);\n            var labelModel = itemModel.getModel('label');\n            var regionGroup = fullData.getItemGraphicEl(fullIndex_1);\n            // `getFormattedLabel` needs to use `getData` inside. Here\n            // `mapModel.getData()` is shallow cloned from `mainSeries.getData()`.\n            // FIXME\n            // If this is not the `mainSeries`, the item model (like label formatter)\n            // set on original data item will never get. But it has been working\n            // like that from the beginning, and this scenario is rarely encountered.\n            // So it won't be fixed until we have to.\n            setLabelStyle(circle, getLabelStatesModels(itemModel), {\n              labelFetcher: {\n                getFormattedLabel: function (idx, state) {\n                  return mapModel.getFormattedLabel(fullIndex_1, state);\n                }\n              },\n              defaultText: name_1\n            });\n            circle.disableLabelAnimation = true;\n            if (!labelModel.get('position')) {\n              circle.setTextConfig({\n                position: 'bottom'\n              });\n            }\n            regionGroup.onHoverStateChange = function (toState) {\n              setStatesFlag(circle, toState);\n            };\n          }\n          group.add(circle);\n        });\n      };\n      MapView.type = 'map';\n      return MapView;\n    }(ChartView);\n\n    var MapSeries = /** @class */function (_super) {\n      __extends(MapSeries, _super);\n      function MapSeries() {\n        var _this = _super !== null && _super.apply(this, arguments) || this;\n        _this.type = MapSeries.type;\n        // Only first map series of same mapType will drawMap.\n        _this.needsDrawMap = false;\n        // Group of all map series with same mapType\n        _this.seriesGroup = [];\n        _this.getTooltipPosition = function (dataIndex) {\n          if (dataIndex != null) {\n            var name_1 = this.getData().getName(dataIndex);\n            var geo = this.coordinateSystem;\n            var region = geo.getRegion(name_1);\n            return region && geo.dataToPoint(region.getCenter());\n          }\n        };\n        return _this;\n      }\n      MapSeries.prototype.getInitialData = function (option) {\n        var data = createSeriesDataSimply(this, {\n          coordDimensions: ['value'],\n          encodeDefaulter: curry(makeSeriesEncodeForNameBased, this)\n        });\n        var dataNameIndexMap = createHashMap();\n        var toAppendItems = [];\n        for (var i = 0, len = data.count(); i < len; i++) {\n          var name_2 = data.getName(i);\n          dataNameIndexMap.set(name_2, i);\n        }\n        var geoSource = geoSourceManager.load(this.getMapType(), this.option.nameMap, this.option.nameProperty);\n        each(geoSource.regions, function (region) {\n          var name = region.name;\n          var dataNameIdx = dataNameIndexMap.get(name);\n          // apply specified echarts style in GeoJSON data\n          var specifiedGeoJSONRegionStyle = region.properties && region.properties.echartsStyle;\n          var dataItem;\n          if (dataNameIdx == null) {\n            dataItem = {\n              name: name\n            };\n            toAppendItems.push(dataItem);\n          } else {\n            dataItem = data.getRawDataItem(dataNameIdx);\n          }\n          specifiedGeoJSONRegionStyle && merge(dataItem, specifiedGeoJSONRegionStyle);\n        });\n        // Complete data with missing regions. The consequent processes (like visual\n        // map and render) can not be performed without a \"full data\". For example,\n        // find `dataIndex` by name.\n        data.appendData(toAppendItems);\n        return data;\n      };\n      /**\r\n       * If no host geo model, return null, which means using a\r\n       * inner exclusive geo model.\r\n       */\n      MapSeries.prototype.getHostGeoModel = function () {\n        var geoIndex = this.option.geoIndex;\n        return geoIndex != null ? this.ecModel.getComponent('geo', geoIndex) : null;\n      };\n      MapSeries.prototype.getMapType = function () {\n        return (this.getHostGeoModel() || this).option.map;\n      };\n      // _fillOption(option, mapName) {\n      // Shallow clone\n      // option = zrUtil.extend({}, option);\n      // option.data = geoCreator.getFilledRegions(option.data, mapName, option.nameMap);\n      // return option;\n      // }\n      MapSeries.prototype.getRawValue = function (dataIndex) {\n        // Use value stored in data instead because it is calculated from multiple series\n        // FIXME Provide all value of multiple series ?\n        var data = this.getData();\n        return data.get(data.mapDimension('value'), dataIndex);\n      };\n      /**\r\n       * Get model of region\r\n       */\n      MapSeries.prototype.getRegionModel = function (regionName) {\n        var data = this.getData();\n        return data.getItemModel(data.indexOfName(regionName));\n      };\n      /**\r\n       * Map tooltip formatter\r\n       */\n      MapSeries.prototype.formatTooltip = function (dataIndex, multipleSeries, dataType) {\n        // FIXME orignalData and data is a bit confusing\n        var data = this.getData();\n        var value = this.getRawValue(dataIndex);\n        var name = data.getName(dataIndex);\n        var seriesGroup = this.seriesGroup;\n        var seriesNames = [];\n        for (var i = 0; i < seriesGroup.length; i++) {\n          var otherIndex = seriesGroup[i].originalData.indexOfName(name);\n          var valueDim = data.mapDimension('value');\n          if (!isNaN(seriesGroup[i].originalData.get(valueDim, otherIndex))) {\n            seriesNames.push(seriesGroup[i].name);\n          }\n        }\n        return createTooltipMarkup('section', {\n          header: seriesNames.join(', '),\n          noHeader: !seriesNames.length,\n          blocks: [createTooltipMarkup('nameValue', {\n            name: name,\n            value: value\n          })]\n        });\n      };\n      MapSeries.prototype.setZoom = function (zoom) {\n        this.option.zoom = zoom;\n      };\n      MapSeries.prototype.setCenter = function (center) {\n        this.option.center = center;\n      };\n      MapSeries.prototype.getLegendIcon = function (opt) {\n        var iconType = opt.icon || 'roundRect';\n        var icon = createSymbol(iconType, 0, 0, opt.itemWidth, opt.itemHeight, opt.itemStyle.fill);\n        icon.setStyle(opt.itemStyle);\n        // Map do not use itemStyle.borderWidth as border width\n        icon.style.stroke = 'none';\n        // No rotation because no series visual symbol for map\n        if (iconType.indexOf('empty') > -1) {\n          icon.style.stroke = icon.style.fill;\n          icon.style.fill = '#fff';\n          icon.style.lineWidth = 2;\n        }\n        return icon;\n      };\n      MapSeries.type = 'series.map';\n      MapSeries.dependencies = ['geo'];\n      MapSeries.layoutMode = 'box';\n      MapSeries.defaultOption = {\n        // 一级层叠\n        // zlevel: 0,\n        // 二级层叠\n        z: 2,\n        coordinateSystem: 'geo',\n        // map should be explicitly specified since ec3.\n        map: '',\n        // If `geoIndex` is not specified, a exclusive geo will be\n        // created. Otherwise use the specified geo component, and\n        // `map` and `mapType` are ignored.\n        // geoIndex: 0,\n        // 'center' | 'left' | 'right' | 'x%' | {number}\n        left: 'center',\n        // 'center' | 'top' | 'bottom' | 'x%' | {number}\n        top: 'center',\n        // right\n        // bottom\n        // width:\n        // height\n        // Aspect is width / height. Inited to be geoJson bbox aspect\n        // This parameter is used for scale this aspect\n        // Default value:\n        // for geoSVG source: 1,\n        // for geoJSON source: 0.75.\n        aspectScale: null,\n        // Layout with center and size\n        // If you want to put map in a fixed size box with right aspect ratio\n        // This two properties may be more convenient.\n        // layoutCenter: [50%, 50%]\n        // layoutSize: 100\n        showLegendSymbol: true,\n        // Define left-top, right-bottom coords to control view\n        // For example, [ [180, 90], [-180, -90] ],\n        // higher priority than center and zoom\n        boundingCoords: null,\n        // Default on center of map\n        center: null,\n        zoom: 1,\n        scaleLimit: null,\n        selectedMode: true,\n        label: {\n          show: false,\n          color: '#000'\n        },\n        // scaleLimit: null,\n        itemStyle: {\n          borderWidth: 0.5,\n          borderColor: '#444',\n          areaColor: '#eee'\n        },\n        emphasis: {\n          label: {\n            show: true,\n            color: 'rgb(100,0,0)'\n          },\n          itemStyle: {\n            areaColor: 'rgba(255,215,0,0.8)'\n          }\n        },\n        select: {\n          label: {\n            show: true,\n            color: 'rgb(100,0,0)'\n          },\n          itemStyle: {\n            color: 'rgba(255,215,0,0.8)'\n          }\n        },\n        nameProperty: 'name'\n      };\n      return MapSeries;\n    }(SeriesModel);\n\n    // FIXME 公用？\n    function dataStatistics(datas, statisticType) {\n      var dataNameMap = {};\n      each(datas, function (data) {\n        data.each(data.mapDimension('value'), function (value, idx) {\n          // Add prefix to avoid conflict with Object.prototype.\n          var mapKey = 'ec-' + data.getName(idx);\n          dataNameMap[mapKey] = dataNameMap[mapKey] || [];\n          if (!isNaN(value)) {\n            dataNameMap[mapKey].push(value);\n          }\n        });\n      });\n      return datas[0].map(datas[0].mapDimension('value'), function (value, idx) {\n        var mapKey = 'ec-' + datas[0].getName(idx);\n        var sum = 0;\n        var min = Infinity;\n        var max = -Infinity;\n        var len = dataNameMap[mapKey].length;\n        for (var i = 0; i < len; i++) {\n          min = Math.min(min, dataNameMap[mapKey][i]);\n          max = Math.max(max, dataNameMap[mapKey][i]);\n          sum += dataNameMap[mapKey][i];\n        }\n        var result;\n        if (statisticType === 'min') {\n          result = min;\n        } else if (statisticType === 'max') {\n          result = max;\n        } else if (statisticType === 'average') {\n          result = sum / len;\n        } else {\n          result = sum;\n        }\n        return len === 0 ? NaN : result;\n      });\n    }\n    function mapDataStatistic(ecModel) {\n      var seriesGroups = {};\n      ecModel.eachSeriesByType('map', function (seriesModel) {\n        var hostGeoModel = seriesModel.getHostGeoModel();\n        var key = hostGeoModel ? 'o' + hostGeoModel.id : 'i' + seriesModel.getMapType();\n        (seriesGroups[key] = seriesGroups[key] || []).push(seriesModel);\n      });\n      each(seriesGroups, function (seriesList, key) {\n        var data = dataStatistics(map(seriesList, function (seriesModel) {\n          return seriesModel.getData();\n        }), seriesList[0].get('mapValueCalculation'));\n        for (var i = 0; i < seriesList.length; i++) {\n          seriesList[i].originalData = seriesList[i].getData();\n        }\n        // FIXME Put where?\n        for (var i = 0; i < seriesList.length; i++) {\n          seriesList[i].seriesGroup = seriesList;\n          seriesList[i].needsDrawMap = i === 0 && !seriesList[i].getHostGeoModel();\n          seriesList[i].setData(data.cloneShallow());\n          seriesList[i].mainSeries = seriesList[0];\n        }\n      });\n    }\n\n    function mapSymbolLayout(ecModel) {\n      var processedMapType = {};\n      ecModel.eachSeriesByType('map', function (mapSeries) {\n        var mapType = mapSeries.getMapType();\n        if (mapSeries.getHostGeoModel() || processedMapType[mapType]) {\n          return;\n        }\n        var mapSymbolOffsets = {};\n        each(mapSeries.seriesGroup, function (subMapSeries) {\n          var geo = subMapSeries.coordinateSystem;\n          var data = subMapSeries.originalData;\n          if (subMapSeries.get('showLegendSymbol') && ecModel.getComponent('legend')) {\n            data.each(data.mapDimension('value'), function (value, idx) {\n              var name = data.getName(idx);\n              var region = geo.getRegion(name);\n              // If input series.data is [11, 22, '-'/null/undefined, 44],\n              // it will be filled with NaN: [11, 22, NaN, 44] and NaN will\n              // not be drawn. So here must validate if value is NaN.\n              if (!region || isNaN(value)) {\n                return;\n              }\n              var offset = mapSymbolOffsets[name] || 0;\n              var point = geo.dataToPoint(region.getCenter());\n              mapSymbolOffsets[name] = offset + 1;\n              data.setItemLayout(idx, {\n                point: point,\n                offset: offset\n              });\n            });\n          }\n        });\n        // Show label of those region not has legendIcon (which is offset 0)\n        var data = mapSeries.getData();\n        data.each(function (idx) {\n          var name = data.getName(idx);\n          var layout = data.getItemLayout(idx) || {};\n          layout.showLabel = !mapSymbolOffsets[name];\n          data.setItemLayout(idx, layout);\n        });\n        processedMapType[mapType] = true;\n      });\n    }\n\n    var v2ApplyTransform = applyTransform;\n    var View = /** @class */function (_super) {\n      __extends(View, _super);\n      function View(name) {\n        var _this = _super.call(this) || this;\n        _this.type = 'view';\n        _this.dimensions = ['x', 'y'];\n        /**\r\n         * Represents the transform brought by roam/zoom.\r\n         * If `View['_viewRect']` applies roam transform,\r\n         * we can get the final displayed rect.\r\n         */\n        _this._roamTransformable = new Transformable();\n        /**\r\n         * Represents the transform from `View['_rect']` to `View['_viewRect']`.\r\n         */\n        _this._rawTransformable = new Transformable();\n        _this.name = name;\n        return _this;\n      }\n      View.prototype.setBoundingRect = function (x, y, width, height) {\n        this._rect = new BoundingRect(x, y, width, height);\n        return this._rect;\n      };\n      /**\r\n       * @return {module:zrender/core/BoundingRect}\r\n       */\n      View.prototype.getBoundingRect = function () {\n        return this._rect;\n      };\n      View.prototype.setViewRect = function (x, y, width, height) {\n        this._transformTo(x, y, width, height);\n        this._viewRect = new BoundingRect(x, y, width, height);\n      };\n      /**\r\n       * Transformed to particular position and size\r\n       */\n      View.prototype._transformTo = function (x, y, width, height) {\n        var rect = this.getBoundingRect();\n        var rawTransform = this._rawTransformable;\n        rawTransform.transform = rect.calculateTransform(new BoundingRect(x, y, width, height));\n        var rawParent = rawTransform.parent;\n        rawTransform.parent = null;\n        rawTransform.decomposeTransform();\n        rawTransform.parent = rawParent;\n        this._updateTransform();\n      };\n      /**\r\n       * Set center of view\r\n       */\n      View.prototype.setCenter = function (centerCoord, api) {\n        if (!centerCoord) {\n          return;\n        }\n        this._center = [parsePercent$1(centerCoord[0], api.getWidth()), parsePercent$1(centerCoord[1], api.getHeight())];\n        this._updateCenterAndZoom();\n      };\n      View.prototype.setZoom = function (zoom) {\n        zoom = zoom || 1;\n        var zoomLimit = this.zoomLimit;\n        if (zoomLimit) {\n          if (zoomLimit.max != null) {\n            zoom = Math.min(zoomLimit.max, zoom);\n          }\n          if (zoomLimit.min != null) {\n            zoom = Math.max(zoomLimit.min, zoom);\n          }\n        }\n        this._zoom = zoom;\n        this._updateCenterAndZoom();\n      };\n      /**\r\n       * Get default center without roam\r\n       */\n      View.prototype.getDefaultCenter = function () {\n        // Rect before any transform\n        var rawRect = this.getBoundingRect();\n        var cx = rawRect.x + rawRect.width / 2;\n        var cy = rawRect.y + rawRect.height / 2;\n        return [cx, cy];\n      };\n      View.prototype.getCenter = function () {\n        return this._center || this.getDefaultCenter();\n      };\n      View.prototype.getZoom = function () {\n        return this._zoom || 1;\n      };\n      View.prototype.getRoamTransform = function () {\n        return this._roamTransformable.getLocalTransform();\n      };\n      /**\r\n       * Remove roam\r\n       */\n      View.prototype._updateCenterAndZoom = function () {\n        // Must update after view transform updated\n        var rawTransformMatrix = this._rawTransformable.getLocalTransform();\n        var roamTransform = this._roamTransformable;\n        var defaultCenter = this.getDefaultCenter();\n        var center = this.getCenter();\n        var zoom = this.getZoom();\n        center = applyTransform([], center, rawTransformMatrix);\n        defaultCenter = applyTransform([], defaultCenter, rawTransformMatrix);\n        roamTransform.originX = center[0];\n        roamTransform.originY = center[1];\n        roamTransform.x = defaultCenter[0] - center[0];\n        roamTransform.y = defaultCenter[1] - center[1];\n        roamTransform.scaleX = roamTransform.scaleY = zoom;\n        this._updateTransform();\n      };\n      /**\r\n       * Update transform props on `this` based on the current\r\n       * `this._roamTransformable` and `this._rawTransformable`.\r\n       */\n      View.prototype._updateTransform = function () {\n        var roamTransformable = this._roamTransformable;\n        var rawTransformable = this._rawTransformable;\n        rawTransformable.parent = roamTransformable;\n        roamTransformable.updateTransform();\n        rawTransformable.updateTransform();\n        copy$1(this.transform || (this.transform = []), rawTransformable.transform || create$1());\n        this._rawTransform = rawTransformable.getLocalTransform();\n        this.invTransform = this.invTransform || [];\n        invert(this.invTransform, this.transform);\n        this.decomposeTransform();\n      };\n      View.prototype.getTransformInfo = function () {\n        var rawTransformable = this._rawTransformable;\n        var roamTransformable = this._roamTransformable;\n        // Because roamTransformabel has `originX/originY` modified,\n        // but the caller of `getTransformInfo` can not handle `originX/originY`,\n        // so need to recalculate them.\n        var dummyTransformable = new Transformable();\n        dummyTransformable.transform = roamTransformable.transform;\n        dummyTransformable.decomposeTransform();\n        return {\n          roam: {\n            x: dummyTransformable.x,\n            y: dummyTransformable.y,\n            scaleX: dummyTransformable.scaleX,\n            scaleY: dummyTransformable.scaleY\n          },\n          raw: {\n            x: rawTransformable.x,\n            y: rawTransformable.y,\n            scaleX: rawTransformable.scaleX,\n            scaleY: rawTransformable.scaleY\n          }\n        };\n      };\n      View.prototype.getViewRect = function () {\n        return this._viewRect;\n      };\n      /**\r\n       * Get view rect after roam transform\r\n       */\n      View.prototype.getViewRectAfterRoam = function () {\n        var rect = this.getBoundingRect().clone();\n        rect.applyTransform(this.transform);\n        return rect;\n      };\n      /**\r\n       * Convert a single (lon, lat) data item to (x, y) point.\r\n       */\n      View.prototype.dataToPoint = function (data, noRoam, out) {\n        var transform = noRoam ? this._rawTransform : this.transform;\n        out = out || [];\n        return transform ? v2ApplyTransform(out, data, transform) : copy(out, data);\n      };\n      /**\r\n       * Convert a (x, y) point to (lon, lat) data\r\n       */\n      View.prototype.pointToData = function (point) {\n        var invTransform = this.invTransform;\n        return invTransform ? v2ApplyTransform([], point, invTransform) : [point[0], point[1]];\n      };\n      View.prototype.convertToPixel = function (ecModel, finder, value) {\n        var coordSys = getCoordSys(finder);\n        return coordSys === this ? coordSys.dataToPoint(value) : null;\n      };\n      View.prototype.convertFromPixel = function (ecModel, finder, pixel) {\n        var coordSys = getCoordSys(finder);\n        return coordSys === this ? coordSys.pointToData(pixel) : null;\n      };\n      /**\r\n       * @implements\r\n       */\n      View.prototype.containPoint = function (point) {\n        return this.getViewRectAfterRoam().contain(point[0], point[1]);\n      };\n      View.dimensions = ['x', 'y'];\n      return View;\n    }(Transformable);\n    function getCoordSys(finder) {\n      var seriesModel = finder.seriesModel;\n      return seriesModel ? seriesModel.coordinateSystem : null; // e.g., graph.\n    }\n\n    var GEO_DEFAULT_PARAMS = {\n      'geoJSON': {\n        aspectScale: 0.75,\n        invertLongitute: true\n      },\n      'geoSVG': {\n        aspectScale: 1,\n        invertLongitute: false\n      }\n    };\n    var geo2DDimensions = ['lng', 'lat'];\n    var Geo = /** @class */function (_super) {\n      __extends(Geo, _super);\n      function Geo(name, map, opt) {\n        var _this = _super.call(this, name) || this;\n        _this.dimensions = geo2DDimensions;\n        _this.type = 'geo';\n        // Only store specified name coord via `addGeoCoord`.\n        _this._nameCoordMap = createHashMap();\n        _this.map = map;\n        var projection = opt.projection;\n        var source = geoSourceManager.load(map, opt.nameMap, opt.nameProperty);\n        var resource = geoSourceManager.getGeoResource(map);\n        var resourceType = _this.resourceType = resource ? resource.type : null;\n        var regions = _this.regions = source.regions;\n        var defaultParams = GEO_DEFAULT_PARAMS[resource.type];\n        _this._regionsMap = source.regionsMap;\n        _this.regions = source.regions;\n        if (\"development\" !== 'production' && projection) {\n          // Do some check\n          if (resourceType === 'geoSVG') {\n            if (\"development\" !== 'production') {\n              warn(\"Map \" + map + \" with SVG source can't use projection. Only GeoJSON source supports projection.\");\n            }\n            projection = null;\n          }\n          if (!(projection.project && projection.unproject)) {\n            if (\"development\" !== 'production') {\n              warn('project and unproject must be both provided in the projeciton.');\n            }\n            projection = null;\n          }\n        }\n        _this.projection = projection;\n        var boundingRect;\n        if (projection) {\n          // Can't reuse the raw bounding rect\n          for (var i = 0; i < regions.length; i++) {\n            var regionRect = regions[i].getBoundingRect(projection);\n            boundingRect = boundingRect || regionRect.clone();\n            boundingRect.union(regionRect);\n          }\n        } else {\n          boundingRect = source.boundingRect;\n        }\n        _this.setBoundingRect(boundingRect.x, boundingRect.y, boundingRect.width, boundingRect.height);\n        // aspectScale and invertLongitute actually is the parameters default raw projection.\n        // So we ignore them if projection is given.\n        // Ignore default aspect scale if projection exits.\n        _this.aspectScale = projection ? 1 : retrieve2(opt.aspectScale, defaultParams.aspectScale);\n        // Not invert longitude if projection exits.\n        _this._invertLongitute = projection ? false : defaultParams.invertLongitute;\n        return _this;\n      }\n      Geo.prototype._transformTo = function (x, y, width, height) {\n        var rect = this.getBoundingRect();\n        var invertLongitute = this._invertLongitute;\n        rect = rect.clone();\n        if (invertLongitute) {\n          // Longitude is inverted.\n          rect.y = -rect.y - rect.height;\n        }\n        var rawTransformable = this._rawTransformable;\n        rawTransformable.transform = rect.calculateTransform(new BoundingRect(x, y, width, height));\n        var rawParent = rawTransformable.parent;\n        rawTransformable.parent = null;\n        rawTransformable.decomposeTransform();\n        rawTransformable.parent = rawParent;\n        if (invertLongitute) {\n          rawTransformable.scaleY = -rawTransformable.scaleY;\n        }\n        this._updateTransform();\n      };\n      Geo.prototype.getRegion = function (name) {\n        return this._regionsMap.get(name);\n      };\n      Geo.prototype.getRegionByCoord = function (coord) {\n        var regions = this.regions;\n        for (var i = 0; i < regions.length; i++) {\n          var region = regions[i];\n          if (region.type === 'geoJSON' && region.contain(coord)) {\n            return regions[i];\n          }\n        }\n      };\n      /**\r\n       * Add geoCoord for indexing by name\r\n       */\n      Geo.prototype.addGeoCoord = function (name, geoCoord) {\n        this._nameCoordMap.set(name, geoCoord);\n      };\n      /**\r\n       * Get geoCoord by name\r\n       */\n      Geo.prototype.getGeoCoord = function (name) {\n        var region = this._regionsMap.get(name);\n        // Calculate center only on demand.\n        return this._nameCoordMap.get(name) || region && region.getCenter();\n      };\n      Geo.prototype.dataToPoint = function (data, noRoam, out) {\n        if (isString(data)) {\n          // Map area name to geoCoord\n          data = this.getGeoCoord(data);\n        }\n        if (data) {\n          var projection = this.projection;\n          if (projection) {\n            // projection may return null point.\n            data = projection.project(data);\n          }\n          return data && this.projectedToPoint(data, noRoam, out);\n        }\n      };\n      Geo.prototype.pointToData = function (point) {\n        var projection = this.projection;\n        if (projection) {\n          // projection may return null point.\n          point = projection.unproject(point);\n        }\n        return point && this.pointToProjected(point);\n      };\n      /**\r\n       * Point to projected data. Same with pointToData when projection is used.\r\n       */\n      Geo.prototype.pointToProjected = function (point) {\n        return _super.prototype.pointToData.call(this, point);\n      };\n      Geo.prototype.projectedToPoint = function (projected, noRoam, out) {\n        return _super.prototype.dataToPoint.call(this, projected, noRoam, out);\n      };\n      Geo.prototype.convertToPixel = function (ecModel, finder, value) {\n        var coordSys = getCoordSys$1(finder);\n        return coordSys === this ? coordSys.dataToPoint(value) : null;\n      };\n      Geo.prototype.convertFromPixel = function (ecModel, finder, pixel) {\n        var coordSys = getCoordSys$1(finder);\n        return coordSys === this ? coordSys.pointToData(pixel) : null;\n      };\n      return Geo;\n    }(View);\n    mixin(Geo, View);\n    function getCoordSys$1(finder) {\n      var geoModel = finder.geoModel;\n      var seriesModel = finder.seriesModel;\n      return geoModel ? geoModel.coordinateSystem : seriesModel ? seriesModel.coordinateSystem // For map series.\n      || (seriesModel.getReferringComponents('geo', SINGLE_REFERRING).models[0] || {}).coordinateSystem : null;\n    }\n\n    /**\r\n     * Resize method bound to the geo\r\n     */\n    function resizeGeo(geoModel, api) {\n      var boundingCoords = geoModel.get('boundingCoords');\n      if (boundingCoords != null) {\n        var leftTop_1 = boundingCoords[0];\n        var rightBottom_1 = boundingCoords[1];\n        if (!(isFinite(leftTop_1[0]) && isFinite(leftTop_1[1]) && isFinite(rightBottom_1[0]) && isFinite(rightBottom_1[1]))) {\n          if (\"development\" !== 'production') {\n            console.error('Invalid boundingCoords');\n          }\n        } else {\n          // Sample around the lng/lat rect and use projection to calculate actual bounding rect.\n          var projection_1 = this.projection;\n          if (projection_1) {\n            var xMin = leftTop_1[0];\n            var yMin = leftTop_1[1];\n            var xMax = rightBottom_1[0];\n            var yMax = rightBottom_1[1];\n            leftTop_1 = [Infinity, Infinity];\n            rightBottom_1 = [-Infinity, -Infinity];\n            // TODO better way?\n            var sampleLine = function (x0, y0, x1, y1) {\n              var dx = x1 - x0;\n              var dy = y1 - y0;\n              for (var i = 0; i <= 100; i++) {\n                var p = i / 100;\n                var pt = projection_1.project([x0 + dx * p, y0 + dy * p]);\n                min(leftTop_1, leftTop_1, pt);\n                max(rightBottom_1, rightBottom_1, pt);\n              }\n            };\n            // Top\n            sampleLine(xMin, yMin, xMax, yMin);\n            // Right\n            sampleLine(xMax, yMin, xMax, yMax);\n            // Bottom\n            sampleLine(xMax, yMax, xMin, yMax);\n            // Left\n            sampleLine(xMin, yMax, xMax, yMin);\n          }\n          this.setBoundingRect(leftTop_1[0], leftTop_1[1], rightBottom_1[0] - leftTop_1[0], rightBottom_1[1] - leftTop_1[1]);\n        }\n      }\n      var rect = this.getBoundingRect();\n      var centerOption = geoModel.get('layoutCenter');\n      var sizeOption = geoModel.get('layoutSize');\n      var viewWidth = api.getWidth();\n      var viewHeight = api.getHeight();\n      var aspect = rect.width / rect.height * this.aspectScale;\n      var useCenterAndSize = false;\n      var center;\n      var size;\n      if (centerOption && sizeOption) {\n        center = [parsePercent$1(centerOption[0], viewWidth), parsePercent$1(centerOption[1], viewHeight)];\n        size = parsePercent$1(sizeOption, Math.min(viewWidth, viewHeight));\n        if (!isNaN(center[0]) && !isNaN(center[1]) && !isNaN(size)) {\n          useCenterAndSize = true;\n        } else {\n          if (\"development\" !== 'production') {\n            console.warn('Given layoutCenter or layoutSize data are invalid. Use left/top/width/height instead.');\n          }\n        }\n      }\n      var viewRect;\n      if (useCenterAndSize) {\n        viewRect = {};\n        if (aspect > 1) {\n          // Width is same with size\n          viewRect.width = size;\n          viewRect.height = size / aspect;\n        } else {\n          viewRect.height = size;\n          viewRect.width = size * aspect;\n        }\n        viewRect.y = center[1] - viewRect.height / 2;\n        viewRect.x = center[0] - viewRect.width / 2;\n      } else {\n        // Use left/top/width/height\n        var boxLayoutOption = geoModel.getBoxLayoutParams();\n        boxLayoutOption.aspect = aspect;\n        viewRect = getLayoutRect(boxLayoutOption, {\n          width: viewWidth,\n          height: viewHeight\n        });\n      }\n      this.setViewRect(viewRect.x, viewRect.y, viewRect.width, viewRect.height);\n      this.setCenter(geoModel.get('center'), api);\n      this.setZoom(geoModel.get('zoom'));\n    }\n    // Back compat for ECharts2, where the coord map is set on map series:\n    // {type: 'map', geoCoord: {'cityA': [116.46,39.92], 'cityA': [119.12,24.61]}},\n    function setGeoCoords(geo, model) {\n      each(model.get('geoCoord'), function (geoCoord, name) {\n        geo.addGeoCoord(name, geoCoord);\n      });\n    }\n    var GeoCreator = /** @class */function () {\n      function GeoCreator() {\n        // For deciding which dimensions to use when creating list data\n        this.dimensions = geo2DDimensions;\n      }\n      GeoCreator.prototype.create = function (ecModel, api) {\n        var geoList = [];\n        function getCommonGeoProperties(model) {\n          return {\n            nameProperty: model.get('nameProperty'),\n            aspectScale: model.get('aspectScale'),\n            projection: model.get('projection')\n          };\n        }\n        // FIXME Create each time may be slow\n        ecModel.eachComponent('geo', function (geoModel, idx) {\n          var mapName = geoModel.get('map');\n          var geo = new Geo(mapName + idx, mapName, extend({\n            nameMap: geoModel.get('nameMap')\n          }, getCommonGeoProperties(geoModel)));\n          geo.zoomLimit = geoModel.get('scaleLimit');\n          geoList.push(geo);\n          // setGeoCoords(geo, geoModel);\n          geoModel.coordinateSystem = geo;\n          geo.model = geoModel;\n          // Inject resize method\n          geo.resize = resizeGeo;\n          geo.resize(geoModel, api);\n        });\n        ecModel.eachSeries(function (seriesModel) {\n          var coordSys = seriesModel.get('coordinateSystem');\n          if (coordSys === 'geo') {\n            var geoIndex = seriesModel.get('geoIndex') || 0;\n            seriesModel.coordinateSystem = geoList[geoIndex];\n          }\n        });\n        // If has map series\n        var mapModelGroupBySeries = {};\n        ecModel.eachSeriesByType('map', function (seriesModel) {\n          if (!seriesModel.getHostGeoModel()) {\n            var mapType = seriesModel.getMapType();\n            mapModelGroupBySeries[mapType] = mapModelGroupBySeries[mapType] || [];\n            mapModelGroupBySeries[mapType].push(seriesModel);\n          }\n        });\n        each(mapModelGroupBySeries, function (mapSeries, mapType) {\n          var nameMapList = map(mapSeries, function (singleMapSeries) {\n            return singleMapSeries.get('nameMap');\n          });\n          var geo = new Geo(mapType, mapType, extend({\n            nameMap: mergeAll(nameMapList)\n          }, getCommonGeoProperties(mapSeries[0])));\n          geo.zoomLimit = retrieve.apply(null, map(mapSeries, function (singleMapSeries) {\n            return singleMapSeries.get('scaleLimit');\n          }));\n          geoList.push(geo);\n          // Inject resize method\n          geo.resize = resizeGeo;\n          geo.resize(mapSeries[0], api);\n          each(mapSeries, function (singleMapSeries) {\n            singleMapSeries.coordinateSystem = geo;\n            setGeoCoords(geo, singleMapSeries);\n          });\n        });\n        return geoList;\n      };\n      /**\r\n       * Fill given regions array\r\n       */\n      GeoCreator.prototype.getFilledRegions = function (originRegionArr, mapName, nameMap, nameProperty) {\n        // Not use the original\n        var regionsArr = (originRegionArr || []).slice();\n        var dataNameMap = createHashMap();\n        for (var i = 0; i < regionsArr.length; i++) {\n          dataNameMap.set(regionsArr[i].name, regionsArr[i]);\n        }\n        var source = geoSourceManager.load(mapName, nameMap, nameProperty);\n        each(source.regions, function (region) {\n          var name = region.name;\n          var regionOption = dataNameMap.get(name);\n          // apply specified echarts style in GeoJSON data\n          var specifiedGeoJSONRegionStyle = region.properties && region.properties.echartsStyle;\n          if (!regionOption) {\n            regionOption = {\n              name: name\n            };\n            regionsArr.push(regionOption);\n          }\n          specifiedGeoJSONRegionStyle && merge(regionOption, specifiedGeoJSONRegionStyle);\n        });\n        return regionsArr;\n      };\n      return GeoCreator;\n    }();\n    var geoCreator = new GeoCreator();\n\n    var GeoModel = /** @class */function (_super) {\n      __extends(GeoModel, _super);\n      function GeoModel() {\n        var _this = _super !== null && _super.apply(this, arguments) || this;\n        _this.type = GeoModel.type;\n        return _this;\n      }\n      GeoModel.prototype.init = function (option, parentModel, ecModel) {\n        var source = geoSourceManager.getGeoResource(option.map);\n        if (source && source.type === 'geoJSON') {\n          var itemStyle = option.itemStyle = option.itemStyle || {};\n          if (!('color' in itemStyle)) {\n            itemStyle.color = '#eee';\n          }\n        }\n        this.mergeDefaultAndTheme(option, ecModel);\n        // Default label emphasis `show`\n        defaultEmphasis(option, 'label', ['show']);\n      };\n      GeoModel.prototype.optionUpdated = function () {\n        var _this = this;\n        var option = this.option;\n        option.regions = geoCreator.getFilledRegions(option.regions, option.map, option.nameMap, option.nameProperty);\n        var selectedMap = {};\n        this._optionModelMap = reduce(option.regions || [], function (optionModelMap, regionOpt) {\n          var regionName = regionOpt.name;\n          if (regionName) {\n            optionModelMap.set(regionName, new Model(regionOpt, _this, _this.ecModel));\n            if (regionOpt.selected) {\n              selectedMap[regionName] = true;\n            }\n          }\n          return optionModelMap;\n        }, createHashMap());\n        if (!option.selectedMap) {\n          option.selectedMap = selectedMap;\n        }\n      };\n      /**\r\n       * Get model of region.\r\n       */\n      GeoModel.prototype.getRegionModel = function (name) {\n        return this._optionModelMap.get(name) || new Model(null, this, this.ecModel);\n      };\n      /**\r\n       * Format label\r\n       * @param name Region name\r\n       */\n      GeoModel.prototype.getFormattedLabel = function (name, status) {\n        var regionModel = this.getRegionModel(name);\n        var formatter = status === 'normal' ? regionModel.get(['label', 'formatter']) : regionModel.get(['emphasis', 'label', 'formatter']);\n        var params = {\n          name: name\n        };\n        if (isFunction(formatter)) {\n          params.status = status;\n          return formatter(params);\n        } else if (isString(formatter)) {\n          return formatter.replace('{a}', name != null ? name : '');\n        }\n      };\n      GeoModel.prototype.setZoom = function (zoom) {\n        this.option.zoom = zoom;\n      };\n      GeoModel.prototype.setCenter = function (center) {\n        this.option.center = center;\n      };\n      // PENGING If selectedMode is null ?\n      GeoModel.prototype.select = function (name) {\n        var option = this.option;\n        var selectedMode = option.selectedMode;\n        if (!selectedMode) {\n          return;\n        }\n        if (selectedMode !== 'multiple') {\n          option.selectedMap = null;\n        }\n        var selectedMap = option.selectedMap || (option.selectedMap = {});\n        selectedMap[name] = true;\n      };\n      GeoModel.prototype.unSelect = function (name) {\n        var selectedMap = this.option.selectedMap;\n        if (selectedMap) {\n          selectedMap[name] = false;\n        }\n      };\n      GeoModel.prototype.toggleSelected = function (name) {\n        this[this.isSelected(name) ? 'unSelect' : 'select'](name);\n      };\n      GeoModel.prototype.isSelected = function (name) {\n        var selectedMap = this.option.selectedMap;\n        return !!(selectedMap && selectedMap[name]);\n      };\n      GeoModel.type = 'geo';\n      GeoModel.layoutMode = 'box';\n      GeoModel.defaultOption = {\n        // zlevel: 0,\n        z: 0,\n        show: true,\n        left: 'center',\n        top: 'center',\n        // Default value:\n        // for geoSVG source: 1,\n        // for geoJSON source: 0.75.\n        aspectScale: null,\n        // /// Layout with center and size\n        // If you want to put map in a fixed size box with right aspect ratio\n        // This two properties may be more convenient\n        // layoutCenter: [50%, 50%]\n        // layoutSize: 100\n        silent: false,\n        // Map type\n        map: '',\n        // Define left-top, right-bottom coords to control view\n        // For example, [ [180, 90], [-180, -90] ]\n        boundingCoords: null,\n        // Default on center of map\n        center: null,\n        zoom: 1,\n        scaleLimit: null,\n        // selectedMode: false\n        label: {\n          show: false,\n          color: '#000'\n        },\n        itemStyle: {\n          borderWidth: 0.5,\n          borderColor: '#444'\n          // Default color:\n          // + geoJSON: #eee\n          // + geoSVG: null (use SVG original `fill`)\n          // color: '#eee'\n        },\n        emphasis: {\n          label: {\n            show: true,\n            color: 'rgb(100,0,0)'\n          },\n          itemStyle: {\n            color: 'rgba(255,215,0,0.8)'\n          }\n        },\n        select: {\n          label: {\n            show: true,\n            color: 'rgb(100,0,0)'\n          },\n          itemStyle: {\n            color: 'rgba(255,215,0,0.8)'\n          }\n        },\n        regions: []\n        // tooltip: {\n        //     show: false\n        // }\n      };\n      return GeoModel;\n    }(ComponentModel);\n\n    /*\n    * Licensed to the Apache Software Foundation (ASF) under one\n    * or more contributor license agreements.  See the NOTICE file\n    * distributed with this work for additional information\n    * regarding copyright ownership.  The ASF licenses this file\n    * to you under the Apache License, Version 2.0 (the\n    * \"License\"); you may not use this file except in compliance\n    * with the License.  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,\n    * software distributed under the License is distributed on an\n    * \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\n    * KIND, either express or implied.  See the License for the\n    * specific language governing permissions and limitations\n    * under the License.\n    */\n\n\n    /**\n     * AUTO-GENERATED FILE. DO NOT MODIFY.\n     */\n\n    /*\r\n    * Licensed to the Apache Software Foundation (ASF) under one\r\n    * or more contributor license agreements.  See the NOTICE file\r\n    * distributed with this work for additional information\r\n    * regarding copyright ownership.  The ASF licenses this file\r\n    * to you under the Apache License, Version 2.0 (the\r\n    * \"License\"); you may not use this file except in compliance\r\n    * with the License.  You may obtain a copy of the License at\r\n    *\r\n    *   http://www.apache.org/licenses/LICENSE-2.0\r\n    *\r\n    * Unless required by applicable law or agreed to in writing,\r\n    * software distributed under the License is distributed on an\r\n    * \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\r\n    * KIND, either express or implied.  See the License for the\r\n    * specific language governing permissions and limitations\r\n    * under the License.\r\n    */\n    function getCenterCoord(view, point) {\n      // Use projected coord as center because it's linear.\n      return view.pointToProjected ? view.pointToProjected(point) : view.pointToData(point);\n    }\n    function updateCenterAndZoom(view, payload, zoomLimit, api) {\n      var previousZoom = view.getZoom();\n      var center = view.getCenter();\n      var zoom = payload.zoom;\n      var point = view.projectedToPoint ? view.projectedToPoint(center) : view.dataToPoint(center);\n      if (payload.dx != null && payload.dy != null) {\n        point[0] -= payload.dx;\n        point[1] -= payload.dy;\n        view.setCenter(getCenterCoord(view, point), api);\n      }\n      if (zoom != null) {\n        if (zoomLimit) {\n          var zoomMin = zoomLimit.min || 0;\n          var zoomMax = zoomLimit.max || Infinity;\n          zoom = Math.max(Math.min(previousZoom * zoom, zoomMax), zoomMin) / previousZoom;\n        }\n        // Zoom on given point(originX, originY)\n        view.scaleX *= zoom;\n        view.scaleY *= zoom;\n        var fixX = (payload.originX - view.x) * (zoom - 1);\n        var fixY = (payload.originY - view.y) * (zoom - 1);\n        view.x -= fixX;\n        view.y -= fixY;\n        view.updateTransform();\n        // Get the new center\n        view.setCenter(getCenterCoord(view, point), api);\n        view.setZoom(zoom * previousZoom);\n      }\n      return {\n        center: view.getCenter(),\n        zoom: view.getZoom()\n      };\n    }\n\n    var GeoView = /** @class */function (_super) {\n      __extends(GeoView, _super);\n      function GeoView() {\n        var _this = _super !== null && _super.apply(this, arguments) || this;\n        _this.type = GeoView.type;\n        _this.focusBlurEnabled = true;\n        return _this;\n      }\n      GeoView.prototype.init = function (ecModel, api) {\n        this._api = api;\n      };\n      GeoView.prototype.render = function (geoModel, ecModel, api, payload) {\n        this._model = geoModel;\n        if (!geoModel.get('show')) {\n          this._mapDraw && this._mapDraw.remove();\n          this._mapDraw = null;\n          return;\n        }\n        if (!this._mapDraw) {\n          this._mapDraw = new MapDraw(api);\n        }\n        var mapDraw = this._mapDraw;\n        mapDraw.draw(geoModel, ecModel, api, this, payload);\n        mapDraw.group.on('click', this._handleRegionClick, this);\n        mapDraw.group.silent = geoModel.get('silent');\n        this.group.add(mapDraw.group);\n        this.updateSelectStatus(geoModel, ecModel, api);\n      };\n      GeoView.prototype._handleRegionClick = function (e) {\n        var eventData;\n        findEventDispatcher(e.target, function (current) {\n          return (eventData = getECData(current).eventData) != null;\n        }, true);\n        if (eventData) {\n          this._api.dispatchAction({\n            type: 'geoToggleSelect',\n            geoId: this._model.id,\n            name: eventData.name\n          });\n        }\n      };\n      GeoView.prototype.updateSelectStatus = function (model, ecModel, api) {\n        var _this = this;\n        this._mapDraw.group.traverse(function (node) {\n          var eventData = getECData(node).eventData;\n          if (eventData) {\n            _this._model.isSelected(eventData.name) ? api.enterSelect(node) : api.leaveSelect(node);\n            // No need to traverse children.\n            return true;\n          }\n        });\n      };\n      GeoView.prototype.findHighDownDispatchers = function (name) {\n        return this._mapDraw && this._mapDraw.findHighDownDispatchers(name, this._model);\n      };\n      GeoView.prototype.dispose = function () {\n        this._mapDraw && this._mapDraw.remove();\n      };\n      GeoView.type = 'geo';\n      return GeoView;\n    }(ComponentView);\n\n    function registerMap$1(mapName, geoJson, specialAreas) {\n      geoSourceManager.registerMap(mapName, geoJson, specialAreas);\n    }\n    function install$9(registers) {\n      registers.registerCoordinateSystem('geo', geoCreator);\n      registers.registerComponentModel(GeoModel);\n      registers.registerComponentView(GeoView);\n      registers.registerImpl('registerMap', registerMap$1);\n      registers.registerImpl('getMap', function (mapName) {\n        return geoSourceManager.getMapForUser(mapName);\n      });\n      function makeAction(method, actionInfo) {\n        actionInfo.update = 'geo:updateSelectStatus';\n        registers.registerAction(actionInfo, function (payload, ecModel) {\n          var selected = {};\n          var allSelected = [];\n          ecModel.eachComponent({\n            mainType: 'geo',\n            query: payload\n          }, function (geoModel) {\n            geoModel[method](payload.name);\n            var geo = geoModel.coordinateSystem;\n            each(geo.regions, function (region) {\n              selected[region.name] = geoModel.isSelected(region.name) || false;\n            });\n            // Notice: there might be duplicated name in different regions.\n            var names = [];\n            each(selected, function (v, name) {\n              selected[name] && names.push(name);\n            });\n            allSelected.push({\n              geoIndex: geoModel.componentIndex,\n              // Use singular, the same naming convention as the event `selectchanged`.\n              name: names\n            });\n          });\n          return {\n            selected: selected,\n            allSelected: allSelected,\n            name: payload.name\n          };\n        });\n      }\n      makeAction('toggleSelected', {\n        type: 'geoToggleSelect',\n        event: 'geoselectchanged'\n      });\n      makeAction('select', {\n        type: 'geoSelect',\n        event: 'geoselected'\n      });\n      makeAction('unSelect', {\n        type: 'geoUnSelect',\n        event: 'geounselected'\n      });\n      /**\r\n       * @payload\r\n       * @property {string} [componentType=series]\r\n       * @property {number} [dx]\r\n       * @property {number} [dy]\r\n       * @property {number} [zoom]\r\n       * @property {number} [originX]\r\n       * @property {number} [originY]\r\n       */\n      registers.registerAction({\n        type: 'geoRoam',\n        event: 'geoRoam',\n        update: 'updateTransform'\n      }, function (payload, ecModel, api) {\n        var componentType = payload.componentType || 'series';\n        ecModel.eachComponent({\n          mainType: componentType,\n          query: payload\n        }, function (componentModel) {\n          var geo = componentModel.coordinateSystem;\n          if (geo.type !== 'geo') {\n            return;\n          }\n          var res = updateCenterAndZoom(geo, payload, componentModel.get('scaleLimit'), api);\n          componentModel.setCenter && componentModel.setCenter(res.center);\n          componentModel.setZoom && componentModel.setZoom(res.zoom);\n          // All map series with same `map` use the same geo coordinate system\n          // So the center and zoom must be in sync. Include the series not selected by legend\n          if (componentType === 'series') {\n            each(componentModel.seriesGroup, function (seriesModel) {\n              seriesModel.setCenter(res.center);\n              seriesModel.setZoom(res.zoom);\n            });\n          }\n        });\n      });\n    }\n\n    function install$a(registers) {\n      use(install$9);\n      registers.registerChartView(MapView);\n      registers.registerSeriesModel(MapSeries);\n      registers.registerLayout(mapSymbolLayout);\n      registers.registerProcessor(registers.PRIORITY.PROCESSOR.STATISTIC, mapDataStatistic);\n      createLegacyDataSelectAction('map', registers.registerAction);\n    }\n\n    /**\r\n     * Initialize all computational message for following algorithm.\r\n     */\n    function init$2(inRoot) {\n      var root = inRoot;\n      root.hierNode = {\n        defaultAncestor: null,\n        ancestor: root,\n        prelim: 0,\n        modifier: 0,\n        change: 0,\n        shift: 0,\n        i: 0,\n        thread: null\n      };\n      var nodes = [root];\n      var node;\n      var children;\n      while (node = nodes.pop()) {\n        // jshint ignore:line\n        children = node.children;\n        if (node.isExpand && children.length) {\n          var n = children.length;\n          for (var i = n - 1; i >= 0; i--) {\n            var child = children[i];\n            child.hierNode = {\n              defaultAncestor: null,\n              ancestor: child,\n              prelim: 0,\n              modifier: 0,\n              change: 0,\n              shift: 0,\n              i: i,\n              thread: null\n            };\n            nodes.push(child);\n          }\n        }\n      }\n    }\n    /**\r\n     * The implementation of this function was originally copied from \"d3.js\"\r\n     * <https://github.com/d3/d3-hierarchy/blob/4c1f038f2725d6eae2e49b61d01456400694bac4/src/tree.js>\r\n     * with some modifications made for this program.\r\n     * See the license statement at the head of this file.\r\n     *\r\n     * Computes a preliminary x coordinate for node. Before that, this function is\r\n     * applied recursively to the children of node, as well as the function\r\n     * apportion(). After spacing out the children by calling executeShifts(), the\r\n     * node is placed to the midpoint of its outermost children.\r\n     */\n    function firstWalk(node, separation) {\n      var children = node.isExpand ? node.children : [];\n      var siblings = node.parentNode.children;\n      var subtreeW = node.hierNode.i ? siblings[node.hierNode.i - 1] : null;\n      if (children.length) {\n        executeShifts(node);\n        var midPoint = (children[0].hierNode.prelim + children[children.length - 1].hierNode.prelim) / 2;\n        if (subtreeW) {\n          node.hierNode.prelim = subtreeW.hierNode.prelim + separation(node, subtreeW);\n          node.hierNode.modifier = node.hierNode.prelim - midPoint;\n        } else {\n          node.hierNode.prelim = midPoint;\n        }\n      } else if (subtreeW) {\n        node.hierNode.prelim = subtreeW.hierNode.prelim + separation(node, subtreeW);\n      }\n      node.parentNode.hierNode.defaultAncestor = apportion(node, subtreeW, node.parentNode.hierNode.defaultAncestor || siblings[0], separation);\n    }\n    /**\r\n     * The implementation of this function was originally copied from \"d3.js\"\r\n     * <https://github.com/d3/d3-hierarchy/blob/4c1f038f2725d6eae2e49b61d01456400694bac4/src/tree.js>\r\n     * with some modifications made for this program.\r\n     * See the license statement at the head of this file.\r\n     *\r\n     * Computes all real x-coordinates by summing up the modifiers recursively.\r\n     */\n    function secondWalk(node) {\n      var nodeX = node.hierNode.prelim + node.parentNode.hierNode.modifier;\n      node.setLayout({\n        x: nodeX\n      }, true);\n      node.hierNode.modifier += node.parentNode.hierNode.modifier;\n    }\n    function separation(cb) {\n      return arguments.length ? cb : defaultSeparation;\n    }\n    /**\r\n     * Transform the common coordinate to radial coordinate.\r\n     */\n    function radialCoordinate(rad, r) {\n      rad -= Math.PI / 2;\n      return {\n        x: r * Math.cos(rad),\n        y: r * Math.sin(rad)\n      };\n    }\n    /**\r\n     * Get the layout position of the whole view.\r\n     */\n    function getViewRect$1(seriesModel, api) {\n      return getLayoutRect(seriesModel.getBoxLayoutParams(), {\n        width: api.getWidth(),\n        height: api.getHeight()\n      });\n    }\n    /**\r\n     * All other shifts, applied to the smaller subtrees between w- and w+, are\r\n     * performed by this function.\r\n     *\r\n     * The implementation of this function was originally copied from \"d3.js\"\r\n     * <https://github.com/d3/d3-hierarchy/blob/4c1f038f2725d6eae2e49b61d01456400694bac4/src/tree.js>\r\n     * with some modifications made for this program.\r\n     * See the license statement at the head of this file.\r\n     */\n    function executeShifts(node) {\n      var children = node.children;\n      var n = children.length;\n      var shift = 0;\n      var change = 0;\n      while (--n >= 0) {\n        var child = children[n];\n        child.hierNode.prelim += shift;\n        child.hierNode.modifier += shift;\n        change += child.hierNode.change;\n        shift += child.hierNode.shift + change;\n      }\n    }\n    /**\r\n     * The implementation of this function was originally copied from \"d3.js\"\r\n     * <https://github.com/d3/d3-hierarchy/blob/4c1f038f2725d6eae2e49b61d01456400694bac4/src/tree.js>\r\n     * with some modifications made for this program.\r\n     * See the license statement at the head of this file.\r\n     *\r\n     * The core of the algorithm. Here, a new subtree is combined with the\r\n     * previous subtrees. Threads are used to traverse the inside and outside\r\n     * contours of the left and right subtree up to the highest common level.\r\n     * Whenever two nodes of the inside contours conflict, we compute the left\r\n     * one of the greatest uncommon ancestors using the function nextAncestor()\r\n     * and call moveSubtree() to shift the subtree and prepare the shifts of\r\n     * smaller subtrees. Finally, we add a new thread (if necessary).\r\n     */\n    function apportion(subtreeV, subtreeW, ancestor, separation) {\n      if (subtreeW) {\n        var nodeOutRight = subtreeV;\n        var nodeInRight = subtreeV;\n        var nodeOutLeft = nodeInRight.parentNode.children[0];\n        var nodeInLeft = subtreeW;\n        var sumOutRight = nodeOutRight.hierNode.modifier;\n        var sumInRight = nodeInRight.hierNode.modifier;\n        var sumOutLeft = nodeOutLeft.hierNode.modifier;\n        var sumInLeft = nodeInLeft.hierNode.modifier;\n        while (nodeInLeft = nextRight(nodeInLeft), nodeInRight = nextLeft(nodeInRight), nodeInLeft && nodeInRight) {\n          nodeOutRight = nextRight(nodeOutRight);\n          nodeOutLeft = nextLeft(nodeOutLeft);\n          nodeOutRight.hierNode.ancestor = subtreeV;\n          var shift = nodeInLeft.hierNode.prelim + sumInLeft - nodeInRight.hierNode.prelim - sumInRight + separation(nodeInLeft, nodeInRight);\n          if (shift > 0) {\n            moveSubtree(nextAncestor(nodeInLeft, subtreeV, ancestor), subtreeV, shift);\n            sumInRight += shift;\n            sumOutRight += shift;\n          }\n          sumInLeft += nodeInLeft.hierNode.modifier;\n          sumInRight += nodeInRight.hierNode.modifier;\n          sumOutRight += nodeOutRight.hierNode.modifier;\n          sumOutLeft += nodeOutLeft.hierNode.modifier;\n        }\n        if (nodeInLeft && !nextRight(nodeOutRight)) {\n          nodeOutRight.hierNode.thread = nodeInLeft;\n          nodeOutRight.hierNode.modifier += sumInLeft - sumOutRight;\n        }\n        if (nodeInRight && !nextLeft(nodeOutLeft)) {\n          nodeOutLeft.hierNode.thread = nodeInRight;\n          nodeOutLeft.hierNode.modifier += sumInRight - sumOutLeft;\n          ancestor = subtreeV;\n        }\n      }\n      return ancestor;\n    }\n    /**\r\n     * This function is used to traverse the right contour of a subtree.\r\n     * It returns the rightmost child of node or the thread of node. The function\r\n     * returns null if and only if node is on the highest depth of its subtree.\r\n     */\n    function nextRight(node) {\n      var children = node.children;\n      return children.length && node.isExpand ? children[children.length - 1] : node.hierNode.thread;\n    }\n    /**\r\n     * This function is used to traverse the left contour of a subtree (or a subforest).\r\n     * It returns the leftmost child of node or the thread of node. The function\r\n     * returns null if and only if node is on the highest depth of its subtree.\r\n     */\n    function nextLeft(node) {\n      var children = node.children;\n      return children.length && node.isExpand ? children[0] : node.hierNode.thread;\n    }\n    /**\r\n     * If nodeInLeft’s ancestor is a sibling of node, returns nodeInLeft’s ancestor.\r\n     * Otherwise, returns the specified ancestor.\r\n     */\n    function nextAncestor(nodeInLeft, node, ancestor) {\n      return nodeInLeft.hierNode.ancestor.parentNode === node.parentNode ? nodeInLeft.hierNode.ancestor : ancestor;\n    }\n    /**\r\n     * The implementation of this function was originally copied from \"d3.js\"\r\n     * <https://github.com/d3/d3-hierarchy/blob/4c1f038f2725d6eae2e49b61d01456400694bac4/src/tree.js>\r\n     * with some modifications made for this program.\r\n     * See the license statement at the head of this file.\r\n     *\r\n     * Shifts the current subtree rooted at wr.\r\n     * This is done by increasing prelim(w+) and modifier(w+) by shift.\r\n     */\n    function moveSubtree(wl, wr, shift) {\n      var change = shift / (wr.hierNode.i - wl.hierNode.i);\n      wr.hierNode.change -= change;\n      wr.hierNode.shift += shift;\n      wr.hierNode.modifier += shift;\n      wr.hierNode.prelim += shift;\n      wl.hierNode.change += change;\n    }\n    /**\r\n     * The implementation of this function was originally copied from \"d3.js\"\r\n     * <https://github.com/d3/d3-hierarchy/blob/4c1f038f2725d6eae2e49b61d01456400694bac4/src/tree.js>\r\n     * with some modifications made for this program.\r\n     * See the license statement at the head of this file.\r\n     */\n    function defaultSeparation(node1, node2) {\n      return node1.parentNode === node2.parentNode ? 1 : 2;\n    }\n\n    var TreeEdgeShape = /** @class */function () {\n      function TreeEdgeShape() {\n        this.parentPoint = [];\n        this.childPoints = [];\n      }\n      return TreeEdgeShape;\n    }();\n    var TreePath = /** @class */function (_super) {\n      __extends(TreePath, _super);\n      function TreePath(opts) {\n        return _super.call(this, opts) || this;\n      }\n      TreePath.prototype.getDefaultStyle = function () {\n        return {\n          stroke: '#000',\n          fill: null\n        };\n      };\n      TreePath.prototype.getDefaultShape = function () {\n        return new TreeEdgeShape();\n      };\n      TreePath.prototype.buildPath = function (ctx, shape) {\n        var childPoints = shape.childPoints;\n        var childLen = childPoints.length;\n        var parentPoint = shape.parentPoint;\n        var firstChildPos = childPoints[0];\n        var lastChildPos = childPoints[childLen - 1];\n        if (childLen === 1) {\n          ctx.moveTo(parentPoint[0], parentPoint[1]);\n          ctx.lineTo(firstChildPos[0], firstChildPos[1]);\n          return;\n        }\n        var orient = shape.orient;\n        var forkDim = orient === 'TB' || orient === 'BT' ? 0 : 1;\n        var otherDim = 1 - forkDim;\n        var forkPosition = parsePercent$1(shape.forkPosition, 1);\n        var tmpPoint = [];\n        tmpPoint[forkDim] = parentPoint[forkDim];\n        tmpPoint[otherDim] = parentPoint[otherDim] + (lastChildPos[otherDim] - parentPoint[otherDim]) * forkPosition;\n        ctx.moveTo(parentPoint[0], parentPoint[1]);\n        ctx.lineTo(tmpPoint[0], tmpPoint[1]);\n        ctx.moveTo(firstChildPos[0], firstChildPos[1]);\n        tmpPoint[forkDim] = firstChildPos[forkDim];\n        ctx.lineTo(tmpPoint[0], tmpPoint[1]);\n        tmpPoint[forkDim] = lastChildPos[forkDim];\n        ctx.lineTo(tmpPoint[0], tmpPoint[1]);\n        ctx.lineTo(lastChildPos[0], lastChildPos[1]);\n        for (var i = 1; i < childLen - 1; i++) {\n          var point = childPoints[i];\n          ctx.moveTo(point[0], point[1]);\n          tmpPoint[forkDim] = point[forkDim];\n          ctx.lineTo(tmpPoint[0], tmpPoint[1]);\n        }\n      };\n      return TreePath;\n    }(Path);\n    var TreeView = /** @class */function (_super) {\n      __extends(TreeView, _super);\n      function TreeView() {\n        var _this = _super !== null && _super.apply(this, arguments) || this;\n        _this.type = TreeView.type;\n        _this._mainGroup = new Group();\n        return _this;\n      }\n      TreeView.prototype.init = function (ecModel, api) {\n        this._controller = new RoamController(api.getZr());\n        this._controllerHost = {\n          target: this.group\n        };\n        this.group.add(this._mainGroup);\n      };\n      TreeView.prototype.render = function (seriesModel, ecModel, api) {\n        var data = seriesModel.getData();\n        var layoutInfo = seriesModel.layoutInfo;\n        var group = this._mainGroup;\n        var layout = seriesModel.get('layout');\n        if (layout === 'radial') {\n          group.x = layoutInfo.x + layoutInfo.width / 2;\n          group.y = layoutInfo.y + layoutInfo.height / 2;\n        } else {\n          group.x = layoutInfo.x;\n          group.y = layoutInfo.y;\n        }\n        this._updateViewCoordSys(seriesModel, api);\n        this._updateController(seriesModel, ecModel, api);\n        var oldData = this._data;\n        data.diff(oldData).add(function (newIdx) {\n          if (symbolNeedsDraw$1(data, newIdx)) {\n            // Create node and edge\n            updateNode(data, newIdx, null, group, seriesModel);\n          }\n        }).update(function (newIdx, oldIdx) {\n          var symbolEl = oldData.getItemGraphicEl(oldIdx);\n          if (!symbolNeedsDraw$1(data, newIdx)) {\n            symbolEl && removeNode(oldData, oldIdx, symbolEl, group, seriesModel);\n            return;\n          }\n          // Update node and edge\n          updateNode(data, newIdx, symbolEl, group, seriesModel);\n        }).remove(function (oldIdx) {\n          var symbolEl = oldData.getItemGraphicEl(oldIdx);\n          // When remove a collapsed node of subtree, since the collapsed\n          // node haven't been initialized with a symbol element,\n          // you can't found it's symbol element through index.\n          // so if we want to remove the symbol element we should insure\n          // that the symbol element is not null.\n          if (symbolEl) {\n            removeNode(oldData, oldIdx, symbolEl, group, seriesModel);\n          }\n        }).execute();\n        this._nodeScaleRatio = seriesModel.get('nodeScaleRatio');\n        this._updateNodeAndLinkScale(seriesModel);\n        if (seriesModel.get('expandAndCollapse') === true) {\n          data.eachItemGraphicEl(function (el, dataIndex) {\n            el.off('click').on('click', function () {\n              api.dispatchAction({\n                type: 'treeExpandAndCollapse',\n                seriesId: seriesModel.id,\n                dataIndex: dataIndex\n              });\n            });\n          });\n        }\n        this._data = data;\n      };\n      TreeView.prototype._updateViewCoordSys = function (seriesModel, api) {\n        var data = seriesModel.getData();\n        var points = [];\n        data.each(function (idx) {\n          var layout = data.getItemLayout(idx);\n          if (layout && !isNaN(layout.x) && !isNaN(layout.y)) {\n            points.push([+layout.x, +layout.y]);\n          }\n        });\n        var min = [];\n        var max = [];\n        fromPoints(points, min, max);\n        // If don't Store min max when collapse the root node after roam,\n        // the root node will disappear.\n        var oldMin = this._min;\n        var oldMax = this._max;\n        // If width or height is 0\n        if (max[0] - min[0] === 0) {\n          min[0] = oldMin ? oldMin[0] : min[0] - 1;\n          max[0] = oldMax ? oldMax[0] : max[0] + 1;\n        }\n        if (max[1] - min[1] === 0) {\n          min[1] = oldMin ? oldMin[1] : min[1] - 1;\n          max[1] = oldMax ? oldMax[1] : max[1] + 1;\n        }\n        var viewCoordSys = seriesModel.coordinateSystem = new View();\n        viewCoordSys.zoomLimit = seriesModel.get('scaleLimit');\n        viewCoordSys.setBoundingRect(min[0], min[1], max[0] - min[0], max[1] - min[1]);\n        viewCoordSys.setCenter(seriesModel.get('center'), api);\n        viewCoordSys.setZoom(seriesModel.get('zoom'));\n        // Here we use viewCoordSys just for computing the 'position' and 'scale' of the group\n        this.group.attr({\n          x: viewCoordSys.x,\n          y: viewCoordSys.y,\n          scaleX: viewCoordSys.scaleX,\n          scaleY: viewCoordSys.scaleY\n        });\n        this._min = min;\n        this._max = max;\n      };\n      TreeView.prototype._updateController = function (seriesModel, ecModel, api) {\n        var _this = this;\n        var controller = this._controller;\n        var controllerHost = this._controllerHost;\n        var group = this.group;\n        controller.setPointerChecker(function (e, x, y) {\n          var rect = group.getBoundingRect();\n          rect.applyTransform(group.transform);\n          return rect.contain(x, y) && !onIrrelevantElement(e, api, seriesModel);\n        });\n        controller.enable(seriesModel.get('roam'));\n        controllerHost.zoomLimit = seriesModel.get('scaleLimit');\n        controllerHost.zoom = seriesModel.coordinateSystem.getZoom();\n        controller.off('pan').off('zoom').on('pan', function (e) {\n          updateViewOnPan(controllerHost, e.dx, e.dy);\n          api.dispatchAction({\n            seriesId: seriesModel.id,\n            type: 'treeRoam',\n            dx: e.dx,\n            dy: e.dy\n          });\n        }).on('zoom', function (e) {\n          updateViewOnZoom(controllerHost, e.scale, e.originX, e.originY);\n          api.dispatchAction({\n            seriesId: seriesModel.id,\n            type: 'treeRoam',\n            zoom: e.scale,\n            originX: e.originX,\n            originY: e.originY\n          });\n          _this._updateNodeAndLinkScale(seriesModel);\n          // Only update label layout on zoom\n          api.updateLabelLayout();\n        });\n      };\n      TreeView.prototype._updateNodeAndLinkScale = function (seriesModel) {\n        var data = seriesModel.getData();\n        var nodeScale = this._getNodeGlobalScale(seriesModel);\n        data.eachItemGraphicEl(function (el, idx) {\n          el.setSymbolScale(nodeScale);\n        });\n      };\n      TreeView.prototype._getNodeGlobalScale = function (seriesModel) {\n        var coordSys = seriesModel.coordinateSystem;\n        if (coordSys.type !== 'view') {\n          return 1;\n        }\n        var nodeScaleRatio = this._nodeScaleRatio;\n        var groupZoom = coordSys.scaleX || 1;\n        // Scale node when zoom changes\n        var roamZoom = coordSys.getZoom();\n        var nodeScale = (roamZoom - 1) * nodeScaleRatio + 1;\n        return nodeScale / groupZoom;\n      };\n      TreeView.prototype.dispose = function () {\n        this._controller && this._controller.dispose();\n        this._controllerHost = null;\n      };\n      TreeView.prototype.remove = function () {\n        this._mainGroup.removeAll();\n        this._data = null;\n      };\n      TreeView.type = 'tree';\n      return TreeView;\n    }(ChartView);\n    function symbolNeedsDraw$1(data, dataIndex) {\n      var layout = data.getItemLayout(dataIndex);\n      return layout && !isNaN(layout.x) && !isNaN(layout.y);\n    }\n    function updateNode(data, dataIndex, symbolEl, group, seriesModel) {\n      var isInit = !symbolEl;\n      var node = data.tree.getNodeByDataIndex(dataIndex);\n      var itemModel = node.getModel();\n      var visualColor = node.getVisual('style').fill;\n      var symbolInnerColor = node.isExpand === false && node.children.length !== 0 ? visualColor : '#fff';\n      var virtualRoot = data.tree.root;\n      var source = node.parentNode === virtualRoot ? node : node.parentNode || node;\n      var sourceSymbolEl = data.getItemGraphicEl(source.dataIndex);\n      var sourceLayout = source.getLayout();\n      var sourceOldLayout = sourceSymbolEl ? {\n        x: sourceSymbolEl.__oldX,\n        y: sourceSymbolEl.__oldY,\n        rawX: sourceSymbolEl.__radialOldRawX,\n        rawY: sourceSymbolEl.__radialOldRawY\n      } : sourceLayout;\n      var targetLayout = node.getLayout();\n      if (isInit) {\n        symbolEl = new Symbol(data, dataIndex, null, {\n          symbolInnerColor: symbolInnerColor,\n          useNameLabel: true\n        });\n        symbolEl.x = sourceOldLayout.x;\n        symbolEl.y = sourceOldLayout.y;\n      } else {\n        symbolEl.updateData(data, dataIndex, null, {\n          symbolInnerColor: symbolInnerColor,\n          useNameLabel: true\n        });\n      }\n      symbolEl.__radialOldRawX = symbolEl.__radialRawX;\n      symbolEl.__radialOldRawY = symbolEl.__radialRawY;\n      symbolEl.__radialRawX = targetLayout.rawX;\n      symbolEl.__radialRawY = targetLayout.rawY;\n      group.add(symbolEl);\n      data.setItemGraphicEl(dataIndex, symbolEl);\n      symbolEl.__oldX = symbolEl.x;\n      symbolEl.__oldY = symbolEl.y;\n      updateProps(symbolEl, {\n        x: targetLayout.x,\n        y: targetLayout.y\n      }, seriesModel);\n      var symbolPath = symbolEl.getSymbolPath();\n      if (seriesModel.get('layout') === 'radial') {\n        var realRoot = virtualRoot.children[0];\n        var rootLayout = realRoot.getLayout();\n        var length_1 = realRoot.children.length;\n        var rad = void 0;\n        var isLeft = void 0;\n        if (targetLayout.x === rootLayout.x && node.isExpand === true && realRoot.children.length) {\n          var center = {\n            x: (realRoot.children[0].getLayout().x + realRoot.children[length_1 - 1].getLayout().x) / 2,\n            y: (realRoot.children[0].getLayout().y + realRoot.children[length_1 - 1].getLayout().y) / 2\n          };\n          rad = Math.atan2(center.y - rootLayout.y, center.x - rootLayout.x);\n          if (rad < 0) {\n            rad = Math.PI * 2 + rad;\n          }\n          isLeft = center.x < rootLayout.x;\n          if (isLeft) {\n            rad = rad - Math.PI;\n          }\n        } else {\n          rad = Math.atan2(targetLayout.y - rootLayout.y, targetLayout.x - rootLayout.x);\n          if (rad < 0) {\n            rad = Math.PI * 2 + rad;\n          }\n          if (node.children.length === 0 || node.children.length !== 0 && node.isExpand === false) {\n            isLeft = targetLayout.x < rootLayout.x;\n            if (isLeft) {\n              rad = rad - Math.PI;\n            }\n          } else {\n            isLeft = targetLayout.x > rootLayout.x;\n            if (!isLeft) {\n              rad = rad - Math.PI;\n            }\n          }\n        }\n        var textPosition = isLeft ? 'left' : 'right';\n        var normalLabelModel = itemModel.getModel('label');\n        var rotate = normalLabelModel.get('rotate');\n        var labelRotateRadian = rotate * (Math.PI / 180);\n        var textContent = symbolPath.getTextContent();\n        if (textContent) {\n          symbolPath.setTextConfig({\n            position: normalLabelModel.get('position') || textPosition,\n            rotation: rotate == null ? -rad : labelRotateRadian,\n            origin: 'center'\n          });\n          textContent.setStyle('verticalAlign', 'middle');\n        }\n      }\n      // Handle status\n      var focus = itemModel.get(['emphasis', 'focus']);\n      var focusDataIndices = focus === 'relative' ? concatArray(node.getAncestorsIndices(), node.getDescendantIndices()) : focus === 'ancestor' ? node.getAncestorsIndices() : focus === 'descendant' ? node.getDescendantIndices() : null;\n      if (focusDataIndices) {\n        // Modify the focus to data indices.\n        getECData(symbolEl).focus = focusDataIndices;\n      }\n      drawEdge(seriesModel, node, virtualRoot, symbolEl, sourceOldLayout, sourceLayout, targetLayout, group);\n      if (symbolEl.__edge) {\n        symbolEl.onHoverStateChange = function (toState) {\n          if (toState !== 'blur') {\n            // NOTE: Ensure the parent elements will been blurred firstly.\n            // According to the return of getAncestorsIndices and getDescendantIndices\n            // TODO: A bit tricky.\n            var parentEl = node.parentNode && data.getItemGraphicEl(node.parentNode.dataIndex);\n            if (!(parentEl && parentEl.hoverState === HOVER_STATE_BLUR)) {\n              setStatesFlag(symbolEl.__edge, toState);\n            }\n          }\n        };\n      }\n    }\n    function drawEdge(seriesModel, node, virtualRoot, symbolEl, sourceOldLayout, sourceLayout, targetLayout, group) {\n      var itemModel = node.getModel();\n      var edgeShape = seriesModel.get('edgeShape');\n      var layout = seriesModel.get('layout');\n      var orient = seriesModel.getOrient();\n      var curvature = seriesModel.get(['lineStyle', 'curveness']);\n      var edgeForkPosition = seriesModel.get('edgeForkPosition');\n      var lineStyle = itemModel.getModel('lineStyle').getLineStyle();\n      var edge = symbolEl.__edge;\n      // curve edge from node -> parent\n      // polyline edge from node -> children\n      if (edgeShape === 'curve') {\n        if (node.parentNode && node.parentNode !== virtualRoot) {\n          if (!edge) {\n            edge = symbolEl.__edge = new BezierCurve({\n              shape: getEdgeShape(layout, orient, curvature, sourceOldLayout, sourceOldLayout)\n            });\n          }\n          updateProps(edge, {\n            shape: getEdgeShape(layout, orient, curvature, sourceLayout, targetLayout)\n          }, seriesModel);\n        }\n      } else if (edgeShape === 'polyline') {\n        if (layout === 'orthogonal') {\n          if (node !== virtualRoot && node.children && node.children.length !== 0 && node.isExpand === true) {\n            var children = node.children;\n            var childPoints = [];\n            for (var i = 0; i < children.length; i++) {\n              var childLayout = children[i].getLayout();\n              childPoints.push([childLayout.x, childLayout.y]);\n            }\n            if (!edge) {\n              edge = symbolEl.__edge = new TreePath({\n                shape: {\n                  parentPoint: [targetLayout.x, targetLayout.y],\n                  childPoints: [[targetLayout.x, targetLayout.y]],\n                  orient: orient,\n                  forkPosition: edgeForkPosition\n                }\n              });\n            }\n            updateProps(edge, {\n              shape: {\n                parentPoint: [targetLayout.x, targetLayout.y],\n                childPoints: childPoints\n              }\n            }, seriesModel);\n          }\n        } else {\n          if (\"development\" !== 'production') {\n            throw new Error('The polyline edgeShape can only be used in orthogonal layout');\n          }\n        }\n      }\n      // show all edge when edgeShape is 'curve', filter node `isExpand` is false when edgeShape is 'polyline'\n      if (edge && !(edgeShape === 'polyline' && !node.isExpand)) {\n        edge.useStyle(defaults({\n          strokeNoScale: true,\n          fill: null\n        }, lineStyle));\n        setStatesStylesFromModel(edge, itemModel, 'lineStyle');\n        setDefaultStateProxy(edge);\n        group.add(edge);\n      }\n    }\n    function removeNodeEdge(node, data, group, seriesModel, removeAnimationOpt) {\n      var virtualRoot = data.tree.root;\n      var _a = getSourceNode(virtualRoot, node),\n        source = _a.source,\n        sourceLayout = _a.sourceLayout;\n      var symbolEl = data.getItemGraphicEl(node.dataIndex);\n      if (!symbolEl) {\n        return;\n      }\n      var sourceSymbolEl = data.getItemGraphicEl(source.dataIndex);\n      var sourceEdge = sourceSymbolEl.__edge;\n      // 1. when expand the sub tree, delete the children node should delete the edge of\n      // the source at the same time. because the polyline edge shape is only owned by the source.\n      // 2.when the node is the only children of the source, delete the node should delete the edge of\n      // the source at the same time. the same reason as above.\n      var edge = symbolEl.__edge || (source.isExpand === false || source.children.length === 1 ? sourceEdge : undefined);\n      var edgeShape = seriesModel.get('edgeShape');\n      var layoutOpt = seriesModel.get('layout');\n      var orient = seriesModel.get('orient');\n      var curvature = seriesModel.get(['lineStyle', 'curveness']);\n      if (edge) {\n        if (edgeShape === 'curve') {\n          removeElement(edge, {\n            shape: getEdgeShape(layoutOpt, orient, curvature, sourceLayout, sourceLayout),\n            style: {\n              opacity: 0\n            }\n          }, seriesModel, {\n            cb: function () {\n              group.remove(edge);\n            },\n            removeOpt: removeAnimationOpt\n          });\n        } else if (edgeShape === 'polyline' && seriesModel.get('layout') === 'orthogonal') {\n          removeElement(edge, {\n            shape: {\n              parentPoint: [sourceLayout.x, sourceLayout.y],\n              childPoints: [[sourceLayout.x, sourceLayout.y]]\n            },\n            style: {\n              opacity: 0\n            }\n          }, seriesModel, {\n            cb: function () {\n              group.remove(edge);\n            },\n            removeOpt: removeAnimationOpt\n          });\n        }\n      }\n    }\n    function getSourceNode(virtualRoot, node) {\n      var source = node.parentNode === virtualRoot ? node : node.parentNode || node;\n      var sourceLayout;\n      while (sourceLayout = source.getLayout(), sourceLayout == null) {\n        source = source.parentNode === virtualRoot ? source : source.parentNode || source;\n      }\n      return {\n        source: source,\n        sourceLayout: sourceLayout\n      };\n    }\n    function removeNode(data, dataIndex, symbolEl, group, seriesModel) {\n      var node = data.tree.getNodeByDataIndex(dataIndex);\n      var virtualRoot = data.tree.root;\n      var sourceLayout = getSourceNode(virtualRoot, node).sourceLayout;\n      // Use same duration and easing with update to have more consistent animation.\n      var removeAnimationOpt = {\n        duration: seriesModel.get('animationDurationUpdate'),\n        easing: seriesModel.get('animationEasingUpdate')\n      };\n      removeElement(symbolEl, {\n        x: sourceLayout.x + 1,\n        y: sourceLayout.y + 1\n      }, seriesModel, {\n        cb: function () {\n          group.remove(symbolEl);\n          data.setItemGraphicEl(dataIndex, null);\n        },\n        removeOpt: removeAnimationOpt\n      });\n      symbolEl.fadeOut(null, data.hostModel, {\n        fadeLabel: true,\n        animation: removeAnimationOpt\n      });\n      // remove edge as parent node\n      node.children.forEach(function (childNode) {\n        removeNodeEdge(childNode, data, group, seriesModel, removeAnimationOpt);\n      });\n      // remove edge as child node\n      removeNodeEdge(node, data, group, seriesModel, removeAnimationOpt);\n    }\n    function getEdgeShape(layoutOpt, orient, curvature, sourceLayout, targetLayout) {\n      var cpx1;\n      var cpy1;\n      var cpx2;\n      var cpy2;\n      var x1;\n      var x2;\n      var y1;\n      var y2;\n      if (layoutOpt === 'radial') {\n        x1 = sourceLayout.rawX;\n        y1 = sourceLayout.rawY;\n        x2 = targetLayout.rawX;\n        y2 = targetLayout.rawY;\n        var radialCoor1 = radialCoordinate(x1, y1);\n        var radialCoor2 = radialCoordinate(x1, y1 + (y2 - y1) * curvature);\n        var radialCoor3 = radialCoordinate(x2, y2 + (y1 - y2) * curvature);\n        var radialCoor4 = radialCoordinate(x2, y2);\n        return {\n          x1: radialCoor1.x || 0,\n          y1: radialCoor1.y || 0,\n          x2: radialCoor4.x || 0,\n          y2: radialCoor4.y || 0,\n          cpx1: radialCoor2.x || 0,\n          cpy1: radialCoor2.y || 0,\n          cpx2: radialCoor3.x || 0,\n          cpy2: radialCoor3.y || 0\n        };\n      } else {\n        x1 = sourceLayout.x;\n        y1 = sourceLayout.y;\n        x2 = targetLayout.x;\n        y2 = targetLayout.y;\n        if (orient === 'LR' || orient === 'RL') {\n          cpx1 = x1 + (x2 - x1) * curvature;\n          cpy1 = y1;\n          cpx2 = x2 + (x1 - x2) * curvature;\n          cpy2 = y2;\n        }\n        if (orient === 'TB' || orient === 'BT') {\n          cpx1 = x1;\n          cpy1 = y1 + (y2 - y1) * curvature;\n          cpx2 = x2;\n          cpy2 = y2 + (y1 - y2) * curvature;\n        }\n      }\n      return {\n        x1: x1,\n        y1: y1,\n        x2: x2,\n        y2: y2,\n        cpx1: cpx1,\n        cpy1: cpy1,\n        cpx2: cpx2,\n        cpy2: cpy2\n      };\n    }\n\n    var inner$7 = makeInner();\n    function linkSeriesData(opt) {\n      var mainData = opt.mainData;\n      var datas = opt.datas;\n      if (!datas) {\n        datas = {\n          main: mainData\n        };\n        opt.datasAttr = {\n          main: 'data'\n        };\n      }\n      opt.datas = opt.mainData = null;\n      linkAll(mainData, datas, opt);\n      // Porxy data original methods.\n      each(datas, function (data) {\n        each(mainData.TRANSFERABLE_METHODS, function (methodName) {\n          data.wrapMethod(methodName, curry(transferInjection, opt));\n        });\n      });\n      // Beyond transfer, additional features should be added to `cloneShallow`.\n      mainData.wrapMethod('cloneShallow', curry(cloneShallowInjection, opt));\n      // Only mainData trigger change, because struct.update may trigger\n      // another changable methods, which may bring about dead lock.\n      each(mainData.CHANGABLE_METHODS, function (methodName) {\n        mainData.wrapMethod(methodName, curry(changeInjection, opt));\n      });\n      // Make sure datas contains mainData.\n      assert(datas[mainData.dataType] === mainData);\n    }\n    function transferInjection(opt, res) {\n      if (isMainData(this)) {\n        // Transfer datas to new main data.\n        var datas = extend({}, inner$7(this).datas);\n        datas[this.dataType] = res;\n        linkAll(res, datas, opt);\n      } else {\n        // Modify the reference in main data to point newData.\n        linkSingle(res, this.dataType, inner$7(this).mainData, opt);\n      }\n      return res;\n    }\n    function changeInjection(opt, res) {\n      opt.struct && opt.struct.update();\n      return res;\n    }\n    function cloneShallowInjection(opt, res) {\n      // cloneShallow, which brings about some fragilities, may be inappropriate\n      // to be exposed as an API. So for implementation simplicity we can make\n      // the restriction that cloneShallow of not-mainData should not be invoked\n      // outside, but only be invoked here.\n      each(inner$7(res).datas, function (data, dataType) {\n        data !== res && linkSingle(data.cloneShallow(), dataType, res, opt);\n      });\n      return res;\n    }\n    /**\r\n     * Supplement method to List.\r\n     *\r\n     * @public\r\n     * @param [dataType] If not specified, return mainData.\r\n     */\n    function getLinkedData(dataType) {\n      var mainData = inner$7(this).mainData;\n      return dataType == null || mainData == null ? mainData : inner$7(mainData).datas[dataType];\n    }\n    /**\r\n     * Get list of all linked data\r\n     */\n    function getLinkedDataAll() {\n      var mainData = inner$7(this).mainData;\n      return mainData == null ? [{\n        data: mainData\n      }] : map(keys(inner$7(mainData).datas), function (type) {\n        return {\n          type: type,\n          data: inner$7(mainData).datas[type]\n        };\n      });\n    }\n    function isMainData(data) {\n      return inner$7(data).mainData === data;\n    }\n    function linkAll(mainData, datas, opt) {\n      inner$7(mainData).datas = {};\n      each(datas, function (data, dataType) {\n        linkSingle(data, dataType, mainData, opt);\n      });\n    }\n    function linkSingle(data, dataType, mainData, opt) {\n      inner$7(mainData).datas[dataType] = data;\n      inner$7(data).mainData = mainData;\n      data.dataType = dataType;\n      if (opt.struct) {\n        data[opt.structAttr] = opt.struct;\n        opt.struct[opt.datasAttr[dataType]] = data;\n      }\n      // Supplement method.\n      data.getLinkedData = getLinkedData;\n      data.getLinkedDataAll = getLinkedDataAll;\n    }\n\n    var TreeNode = /** @class */function () {\n      function TreeNode(name, hostTree) {\n        this.depth = 0;\n        this.height = 0;\n        /**\r\n         * Reference to list item.\r\n         * Do not persistent dataIndex outside,\r\n         * besause it may be changed by list.\r\n         * If dataIndex -1,\r\n         * this node is logical deleted (filtered) in list.\r\n         */\n        this.dataIndex = -1;\n        this.children = [];\n        this.viewChildren = [];\n        this.isExpand = false;\n        this.name = name || '';\n        this.hostTree = hostTree;\n      }\n      /**\r\n       * The node is removed.\r\n       */\n      TreeNode.prototype.isRemoved = function () {\n        return this.dataIndex < 0;\n      };\n      TreeNode.prototype.eachNode = function (options, cb, context) {\n        if (isFunction(options)) {\n          context = cb;\n          cb = options;\n          options = null;\n        }\n        options = options || {};\n        if (isString(options)) {\n          options = {\n            order: options\n          };\n        }\n        var order = options.order || 'preorder';\n        var children = this[options.attr || 'children'];\n        var suppressVisitSub;\n        order === 'preorder' && (suppressVisitSub = cb.call(context, this));\n        for (var i = 0; !suppressVisitSub && i < children.length; i++) {\n          children[i].eachNode(options, cb, context);\n        }\n        order === 'postorder' && cb.call(context, this);\n      };\n      /**\r\n       * Update depth and height of this subtree.\r\n       */\n      TreeNode.prototype.updateDepthAndHeight = function (depth) {\n        var height = 0;\n        this.depth = depth;\n        for (var i = 0; i < this.children.length; i++) {\n          var child = this.children[i];\n          child.updateDepthAndHeight(depth + 1);\n          if (child.height > height) {\n            height = child.height;\n          }\n        }\n        this.height = height + 1;\n      };\n      TreeNode.prototype.getNodeById = function (id) {\n        if (this.getId() === id) {\n          return this;\n        }\n        for (var i = 0, children = this.children, len = children.length; i < len; i++) {\n          var res = children[i].getNodeById(id);\n          if (res) {\n            return res;\n          }\n        }\n      };\n      TreeNode.prototype.contains = function (node) {\n        if (node === this) {\n          return true;\n        }\n        for (var i = 0, children = this.children, len = children.length; i < len; i++) {\n          var res = children[i].contains(node);\n          if (res) {\n            return res;\n          }\n        }\n      };\n      /**\r\n       * @param includeSelf Default false.\r\n       * @return order: [root, child, grandchild, ...]\r\n       */\n      TreeNode.prototype.getAncestors = function (includeSelf) {\n        var ancestors = [];\n        var node = includeSelf ? this : this.parentNode;\n        while (node) {\n          ancestors.push(node);\n          node = node.parentNode;\n        }\n        ancestors.reverse();\n        return ancestors;\n      };\n      TreeNode.prototype.getAncestorsIndices = function () {\n        var indices = [];\n        var currNode = this;\n        while (currNode) {\n          indices.push(currNode.dataIndex);\n          currNode = currNode.parentNode;\n        }\n        indices.reverse();\n        return indices;\n      };\n      TreeNode.prototype.getDescendantIndices = function () {\n        var indices = [];\n        this.eachNode(function (childNode) {\n          indices.push(childNode.dataIndex);\n        });\n        return indices;\n      };\n      TreeNode.prototype.getValue = function (dimension) {\n        var data = this.hostTree.data;\n        return data.getStore().get(data.getDimensionIndex(dimension || 'value'), this.dataIndex);\n      };\n      TreeNode.prototype.setLayout = function (layout, merge) {\n        this.dataIndex >= 0 && this.hostTree.data.setItemLayout(this.dataIndex, layout, merge);\n      };\n      /**\r\n       * @return {Object} layout\r\n       */\n      TreeNode.prototype.getLayout = function () {\n        return this.hostTree.data.getItemLayout(this.dataIndex);\n      };\n      // @depcrecated\n      // getModel<T = unknown, S extends keyof T = keyof T>(path: S): Model<T[S]>\n      // eslint-disable-next-line @typescript-eslint/no-unused-vars\n      TreeNode.prototype.getModel = function (path) {\n        if (this.dataIndex < 0) {\n          return;\n        }\n        var hostTree = this.hostTree;\n        var itemModel = hostTree.data.getItemModel(this.dataIndex);\n        return itemModel.getModel(path);\n      };\n      // TODO: TYPE More specific model\n      TreeNode.prototype.getLevelModel = function () {\n        return (this.hostTree.levelModels || [])[this.depth];\n      };\n      TreeNode.prototype.setVisual = function (key, value) {\n        this.dataIndex >= 0 && this.hostTree.data.setItemVisual(this.dataIndex, key, value);\n      };\n      /**\r\n       * Get item visual\r\n       * FIXME: make return type better\r\n       */\n      TreeNode.prototype.getVisual = function (key) {\n        return this.hostTree.data.getItemVisual(this.dataIndex, key);\n      };\n      TreeNode.prototype.getRawIndex = function () {\n        return this.hostTree.data.getRawIndex(this.dataIndex);\n      };\n      TreeNode.prototype.getId = function () {\n        return this.hostTree.data.getId(this.dataIndex);\n      };\n      /**\r\n       * index in parent's children\r\n       */\n      TreeNode.prototype.getChildIndex = function () {\n        if (this.parentNode) {\n          var children = this.parentNode.children;\n          for (var i = 0; i < children.length; ++i) {\n            if (children[i] === this) {\n              return i;\n            }\n          }\n          return -1;\n        }\n        return -1;\n      };\n      /**\r\n       * if this is an ancestor of another node\r\n       *\r\n       * @param node another node\r\n       * @return if is ancestor\r\n       */\n      TreeNode.prototype.isAncestorOf = function (node) {\n        var parent = node.parentNode;\n        while (parent) {\n          if (parent === this) {\n            return true;\n          }\n          parent = parent.parentNode;\n        }\n        return false;\n      };\n      /**\r\n       * if this is an descendant of another node\r\n       *\r\n       * @param node another node\r\n       * @return if is descendant\r\n       */\n      TreeNode.prototype.isDescendantOf = function (node) {\n        return node !== this && node.isAncestorOf(this);\n      };\n      return TreeNode;\n    }();\n    var Tree = /** @class */function () {\n      function Tree(hostModel) {\n        this.type = 'tree';\n        this._nodes = [];\n        this.hostModel = hostModel;\n      }\n      Tree.prototype.eachNode = function (options, cb, context) {\n        this.root.eachNode(options, cb, context);\n      };\n      Tree.prototype.getNodeByDataIndex = function (dataIndex) {\n        var rawIndex = this.data.getRawIndex(dataIndex);\n        return this._nodes[rawIndex];\n      };\n      Tree.prototype.getNodeById = function (name) {\n        return this.root.getNodeById(name);\n      };\n      /**\r\n       * Update item available by list,\r\n       * when list has been performed options like 'filterSelf' or 'map'.\r\n       */\n      Tree.prototype.update = function () {\n        var data = this.data;\n        var nodes = this._nodes;\n        for (var i = 0, len = nodes.length; i < len; i++) {\n          nodes[i].dataIndex = -1;\n        }\n        for (var i = 0, len = data.count(); i < len; i++) {\n          nodes[data.getRawIndex(i)].dataIndex = i;\n        }\n      };\n      /**\r\n       * Clear all layouts\r\n       */\n      Tree.prototype.clearLayouts = function () {\n        this.data.clearItemLayouts();\n      };\n      /**\r\n       * data node format:\r\n       * {\r\n       *     name: ...\r\n       *     value: ...\r\n       *     children: [\r\n       *         {\r\n       *             name: ...\r\n       *             value: ...\r\n       *             children: ...\r\n       *         },\r\n       *         ...\r\n       *     ]\r\n       * }\r\n       */\n      Tree.createTree = function (dataRoot, hostModel, beforeLink) {\n        var tree = new Tree(hostModel);\n        var listData = [];\n        var dimMax = 1;\n        buildHierarchy(dataRoot);\n        function buildHierarchy(dataNode, parentNode) {\n          var value = dataNode.value;\n          dimMax = Math.max(dimMax, isArray(value) ? value.length : 1);\n          listData.push(dataNode);\n          var node = new TreeNode(convertOptionIdName(dataNode.name, ''), tree);\n          parentNode ? addChild(node, parentNode) : tree.root = node;\n          tree._nodes.push(node);\n          var children = dataNode.children;\n          if (children) {\n            for (var i = 0; i < children.length; i++) {\n              buildHierarchy(children[i], node);\n            }\n          }\n        }\n        tree.root.updateDepthAndHeight(0);\n        var dimensions = prepareSeriesDataSchema(listData, {\n          coordDimensions: ['value'],\n          dimensionsCount: dimMax\n        }).dimensions;\n        var list = new SeriesData(dimensions, hostModel);\n        list.initData(listData);\n        beforeLink && beforeLink(list);\n        linkSeriesData({\n          mainData: list,\n          struct: tree,\n          structAttr: 'tree'\n        });\n        tree.update();\n        return tree;\n      };\n      return Tree;\n    }();\n    /**\r\n     * It is needed to consider the mess of 'list', 'hostModel' when creating a TreeNote,\r\n     * so this function is not ready and not necessary to be public.\r\n     */\n    function addChild(child, node) {\n      var children = node.children;\n      if (child.parentNode === node) {\n        return;\n      }\n      children.push(child);\n      child.parentNode = node;\n    }\n\n    function retrieveTargetInfo(payload, validPayloadTypes, seriesModel) {\n      if (payload && indexOf(validPayloadTypes, payload.type) >= 0) {\n        var root = seriesModel.getData().tree.root;\n        var targetNode = payload.targetNode;\n        if (isString(targetNode)) {\n          targetNode = root.getNodeById(targetNode);\n        }\n        if (targetNode && root.contains(targetNode)) {\n          return {\n            node: targetNode\n          };\n        }\n        var targetNodeId = payload.targetNodeId;\n        if (targetNodeId != null && (targetNode = root.getNodeById(targetNodeId))) {\n          return {\n            node: targetNode\n          };\n        }\n      }\n    }\n    // Not includes the given node at the last item.\n    function getPathToRoot(node) {\n      var path = [];\n      while (node) {\n        node = node.parentNode;\n        node && path.push(node);\n      }\n      return path.reverse();\n    }\n    function aboveViewRoot(viewRoot, node) {\n      var viewPath = getPathToRoot(viewRoot);\n      return indexOf(viewPath, node) >= 0;\n    }\n    // From root to the input node (the input node will be included).\n    function wrapTreePathInfo(node, seriesModel) {\n      var treePathInfo = [];\n      while (node) {\n        var nodeDataIndex = node.dataIndex;\n        treePathInfo.push({\n          name: node.name,\n          dataIndex: nodeDataIndex,\n          value: seriesModel.getRawValue(nodeDataIndex)\n        });\n        node = node.parentNode;\n      }\n      treePathInfo.reverse();\n      return treePathInfo;\n    }\n\n    var TreeSeriesModel = /** @class */function (_super) {\n      __extends(TreeSeriesModel, _super);\n      function TreeSeriesModel() {\n        var _this = _super !== null && _super.apply(this, arguments) || this;\n        _this.hasSymbolVisual = true;\n        // Do it self.\n        _this.ignoreStyleOnData = true;\n        return _this;\n      }\n      /**\r\n       * Init a tree data structure from data in option series\r\n       */\n      TreeSeriesModel.prototype.getInitialData = function (option) {\n        // create a virtual root\n        var root = {\n          name: option.name,\n          children: option.data\n        };\n        var leaves = option.leaves || {};\n        var leavesModel = new Model(leaves, this, this.ecModel);\n        var tree = Tree.createTree(root, this, beforeLink);\n        function beforeLink(nodeData) {\n          nodeData.wrapMethod('getItemModel', function (model, idx) {\n            var node = tree.getNodeByDataIndex(idx);\n            if (!(node && node.children.length && node.isExpand)) {\n              model.parentModel = leavesModel;\n            }\n            return model;\n          });\n        }\n        var treeDepth = 0;\n        tree.eachNode('preorder', function (node) {\n          if (node.depth > treeDepth) {\n            treeDepth = node.depth;\n          }\n        });\n        var expandAndCollapse = option.expandAndCollapse;\n        var expandTreeDepth = expandAndCollapse && option.initialTreeDepth >= 0 ? option.initialTreeDepth : treeDepth;\n        tree.root.eachNode('preorder', function (node) {\n          var item = node.hostTree.data.getRawDataItem(node.dataIndex);\n          // Add item.collapsed != null, because users can collapse node original in the series.data.\n          node.isExpand = item && item.collapsed != null ? !item.collapsed : node.depth <= expandTreeDepth;\n        });\n        return tree.data;\n      };\n      /**\r\n       * Make the configuration 'orient' backward compatibly, with 'horizontal = LR', 'vertical = TB'.\r\n       * @returns {string} orient\r\n       */\n      TreeSeriesModel.prototype.getOrient = function () {\n        var orient = this.get('orient');\n        if (orient === 'horizontal') {\n          orient = 'LR';\n        } else if (orient === 'vertical') {\n          orient = 'TB';\n        }\n        return orient;\n      };\n      TreeSeriesModel.prototype.setZoom = function (zoom) {\n        this.option.zoom = zoom;\n      };\n      TreeSeriesModel.prototype.setCenter = function (center) {\n        this.option.center = center;\n      };\n      TreeSeriesModel.prototype.formatTooltip = function (dataIndex, multipleSeries, dataType) {\n        var tree = this.getData().tree;\n        var realRoot = tree.root.children[0];\n        var node = tree.getNodeByDataIndex(dataIndex);\n        var value = node.getValue();\n        var name = node.name;\n        while (node && node !== realRoot) {\n          name = node.parentNode.name + '.' + name;\n          node = node.parentNode;\n        }\n        return createTooltipMarkup('nameValue', {\n          name: name,\n          value: value,\n          noValue: isNaN(value) || value == null\n        });\n      };\n      // Add tree path to tooltip param\n      TreeSeriesModel.prototype.getDataParams = function (dataIndex) {\n        var params = _super.prototype.getDataParams.apply(this, arguments);\n        var node = this.getData().tree.getNodeByDataIndex(dataIndex);\n        params.treeAncestors = wrapTreePathInfo(node, this);\n        params.collapsed = !node.isExpand;\n        return params;\n      };\n      TreeSeriesModel.type = 'series.tree';\n      // can support the position parameters 'left', 'top','right','bottom', 'width',\n      // 'height' in the setOption() with 'merge' mode normal.\n      TreeSeriesModel.layoutMode = 'box';\n      TreeSeriesModel.defaultOption = {\n        // zlevel: 0,\n        z: 2,\n        coordinateSystem: 'view',\n        // the position of the whole view\n        left: '12%',\n        top: '12%',\n        right: '12%',\n        bottom: '12%',\n        // the layout of the tree, two value can be selected, 'orthogonal' or 'radial'\n        layout: 'orthogonal',\n        // value can be 'polyline'\n        edgeShape: 'curve',\n        edgeForkPosition: '50%',\n        // true | false | 'move' | 'scale', see module:component/helper/RoamController.\n        roam: false,\n        // Symbol size scale ratio in roam\n        nodeScaleRatio: 0.4,\n        // Default on center of graph\n        center: null,\n        zoom: 1,\n        orient: 'LR',\n        symbol: 'emptyCircle',\n        symbolSize: 7,\n        expandAndCollapse: true,\n        initialTreeDepth: 2,\n        lineStyle: {\n          color: '#ccc',\n          width: 1.5,\n          curveness: 0.5\n        },\n        itemStyle: {\n          color: 'lightsteelblue',\n          // borderColor: '#c23531',\n          borderWidth: 1.5\n        },\n        label: {\n          show: true\n        },\n        animationEasing: 'linear',\n        animationDuration: 700,\n        animationDurationUpdate: 500\n      };\n      return TreeSeriesModel;\n    }(SeriesModel);\n\n    /*\n    * Licensed to the Apache Software Foundation (ASF) under one\n    * or more contributor license agreements.  See the NOTICE file\n    * distributed with this work for additional information\n    * regarding copyright ownership.  The ASF licenses this file\n    * to you under the Apache License, Version 2.0 (the\n    * \"License\"); you may not use this file except in compliance\n    * with the License.  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,\n    * software distributed under the License is distributed on an\n    * \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\n    * KIND, either express or implied.  See the License for the\n    * specific language governing permissions and limitations\n    * under the License.\n    */\n\n\n    /**\n     * AUTO-GENERATED FILE. DO NOT MODIFY.\n     */\n\n    /*\r\n    * Licensed to the Apache Software Foundation (ASF) under one\r\n    * or more contributor license agreements.  See the NOTICE file\r\n    * distributed with this work for additional information\r\n    * regarding copyright ownership.  The ASF licenses this file\r\n    * to you under the Apache License, Version 2.0 (the\r\n    * \"License\"); you may not use this file except in compliance\r\n    * with the License.  You may obtain a copy of the License at\r\n    *\r\n    *   http://www.apache.org/licenses/LICENSE-2.0\r\n    *\r\n    * Unless required by applicable law or agreed to in writing,\r\n    * software distributed under the License is distributed on an\r\n    * \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\r\n    * KIND, either express or implied.  See the License for the\r\n    * specific language governing permissions and limitations\r\n    * under the License.\r\n    */\n    /**\r\n     * Traverse the tree from bottom to top and do something\r\n     */\n    function eachAfter(root, callback, separation) {\n      var nodes = [root];\n      var next = [];\n      var node;\n      while (node = nodes.pop()) {\n        // jshint ignore:line\n        next.push(node);\n        if (node.isExpand) {\n          var children = node.children;\n          if (children.length) {\n            for (var i = 0; i < children.length; i++) {\n              nodes.push(children[i]);\n            }\n          }\n        }\n      }\n      while (node = next.pop()) {\n        // jshint ignore:line\n        callback(node, separation);\n      }\n    }\n    /**\r\n     * Traverse the tree from top to bottom and do something\r\n     */\n    function eachBefore(root, callback) {\n      var nodes = [root];\n      var node;\n      while (node = nodes.pop()) {\n        // jshint ignore:line\n        callback(node);\n        if (node.isExpand) {\n          var children = node.children;\n          if (children.length) {\n            for (var i = children.length - 1; i >= 0; i--) {\n              nodes.push(children[i]);\n            }\n          }\n        }\n      }\n    }\n\n    function treeLayout(ecModel, api) {\n      ecModel.eachSeriesByType('tree', function (seriesModel) {\n        commonLayout(seriesModel, api);\n      });\n    }\n    function commonLayout(seriesModel, api) {\n      var layoutInfo = getViewRect$1(seriesModel, api);\n      seriesModel.layoutInfo = layoutInfo;\n      var layout = seriesModel.get('layout');\n      var width = 0;\n      var height = 0;\n      var separation$1 = null;\n      if (layout === 'radial') {\n        width = 2 * Math.PI;\n        height = Math.min(layoutInfo.height, layoutInfo.width) / 2;\n        separation$1 = separation(function (node1, node2) {\n          return (node1.parentNode === node2.parentNode ? 1 : 2) / node1.depth;\n        });\n      } else {\n        width = layoutInfo.width;\n        height = layoutInfo.height;\n        separation$1 = separation();\n      }\n      var virtualRoot = seriesModel.getData().tree.root;\n      var realRoot = virtualRoot.children[0];\n      if (realRoot) {\n        init$2(virtualRoot);\n        eachAfter(realRoot, firstWalk, separation$1);\n        virtualRoot.hierNode.modifier = -realRoot.hierNode.prelim;\n        eachBefore(realRoot, secondWalk);\n        var left_1 = realRoot;\n        var right_1 = realRoot;\n        var bottom_1 = realRoot;\n        eachBefore(realRoot, function (node) {\n          var x = node.getLayout().x;\n          if (x < left_1.getLayout().x) {\n            left_1 = node;\n          }\n          if (x > right_1.getLayout().x) {\n            right_1 = node;\n          }\n          if (node.depth > bottom_1.depth) {\n            bottom_1 = node;\n          }\n        });\n        var delta = left_1 === right_1 ? 1 : separation$1(left_1, right_1) / 2;\n        var tx_1 = delta - left_1.getLayout().x;\n        var kx_1 = 0;\n        var ky_1 = 0;\n        var coorX_1 = 0;\n        var coorY_1 = 0;\n        if (layout === 'radial') {\n          kx_1 = width / (right_1.getLayout().x + delta + tx_1);\n          // here we use (node.depth - 1), bucause the real root's depth is 1\n          ky_1 = height / (bottom_1.depth - 1 || 1);\n          eachBefore(realRoot, function (node) {\n            coorX_1 = (node.getLayout().x + tx_1) * kx_1;\n            coorY_1 = (node.depth - 1) * ky_1;\n            var finalCoor = radialCoordinate(coorX_1, coorY_1);\n            node.setLayout({\n              x: finalCoor.x,\n              y: finalCoor.y,\n              rawX: coorX_1,\n              rawY: coorY_1\n            }, true);\n          });\n        } else {\n          var orient_1 = seriesModel.getOrient();\n          if (orient_1 === 'RL' || orient_1 === 'LR') {\n            ky_1 = height / (right_1.getLayout().x + delta + tx_1);\n            kx_1 = width / (bottom_1.depth - 1 || 1);\n            eachBefore(realRoot, function (node) {\n              coorY_1 = (node.getLayout().x + tx_1) * ky_1;\n              coorX_1 = orient_1 === 'LR' ? (node.depth - 1) * kx_1 : width - (node.depth - 1) * kx_1;\n              node.setLayout({\n                x: coorX_1,\n                y: coorY_1\n              }, true);\n            });\n          } else if (orient_1 === 'TB' || orient_1 === 'BT') {\n            kx_1 = width / (right_1.getLayout().x + delta + tx_1);\n            ky_1 = height / (bottom_1.depth - 1 || 1);\n            eachBefore(realRoot, function (node) {\n              coorX_1 = (node.getLayout().x + tx_1) * kx_1;\n              coorY_1 = orient_1 === 'TB' ? (node.depth - 1) * ky_1 : height - (node.depth - 1) * ky_1;\n              node.setLayout({\n                x: coorX_1,\n                y: coorY_1\n              }, true);\n            });\n          }\n        }\n      }\n    }\n\n    function treeVisual(ecModel) {\n      ecModel.eachSeriesByType('tree', function (seriesModel) {\n        var data = seriesModel.getData();\n        var tree = data.tree;\n        tree.eachNode(function (node) {\n          var model = node.getModel();\n          // TODO Optimize\n          var style = model.getModel('itemStyle').getItemStyle();\n          var existsStyle = data.ensureUniqueItemVisual(node.dataIndex, 'style');\n          extend(existsStyle, style);\n        });\n      });\n    }\n\n    function installTreeAction(registers) {\n      registers.registerAction({\n        type: 'treeExpandAndCollapse',\n        event: 'treeExpandAndCollapse',\n        update: 'update'\n      }, function (payload, ecModel) {\n        ecModel.eachComponent({\n          mainType: 'series',\n          subType: 'tree',\n          query: payload\n        }, function (seriesModel) {\n          var dataIndex = payload.dataIndex;\n          var tree = seriesModel.getData().tree;\n          var node = tree.getNodeByDataIndex(dataIndex);\n          node.isExpand = !node.isExpand;\n        });\n      });\n      registers.registerAction({\n        type: 'treeRoam',\n        event: 'treeRoam',\n        // Here we set 'none' instead of 'update', because roam action\n        // just need to update the transform matrix without having to recalculate\n        // the layout. So don't need to go through the whole update process, such\n        // as 'dataPrcocess', 'coordSystemUpdate', 'layout' and so on.\n        update: 'none'\n      }, function (payload, ecModel, api) {\n        ecModel.eachComponent({\n          mainType: 'series',\n          subType: 'tree',\n          query: payload\n        }, function (seriesModel) {\n          var coordSys = seriesModel.coordinateSystem;\n          var res = updateCenterAndZoom(coordSys, payload, undefined, api);\n          seriesModel.setCenter && seriesModel.setCenter(res.center);\n          seriesModel.setZoom && seriesModel.setZoom(res.zoom);\n        });\n      });\n    }\n\n    function install$b(registers) {\n      registers.registerChartView(TreeView);\n      registers.registerSeriesModel(TreeSeriesModel);\n      registers.registerLayout(treeLayout);\n      registers.registerVisual(treeVisual);\n      installTreeAction(registers);\n    }\n\n    var actionTypes = ['treemapZoomToNode', 'treemapRender', 'treemapMove'];\n    function installTreemapAction(registers) {\n      for (var i = 0; i < actionTypes.length; i++) {\n        registers.registerAction({\n          type: actionTypes[i],\n          update: 'updateView'\n        }, noop);\n      }\n      registers.registerAction({\n        type: 'treemapRootToNode',\n        update: 'updateView'\n      }, function (payload, ecModel) {\n        ecModel.eachComponent({\n          mainType: 'series',\n          subType: 'treemap',\n          query: payload\n        }, handleRootToNode);\n        function handleRootToNode(model, index) {\n          var types = ['treemapZoomToNode', 'treemapRootToNode'];\n          var targetInfo = retrieveTargetInfo(payload, types, model);\n          if (targetInfo) {\n            var originViewRoot = model.getViewRoot();\n            if (originViewRoot) {\n              payload.direction = aboveViewRoot(originViewRoot, targetInfo.node) ? 'rollUp' : 'drillDown';\n            }\n            model.resetViewRoot(targetInfo.node);\n          }\n        }\n      });\n    }\n\n    function enableAriaDecalForTree(seriesModel) {\n      var data = seriesModel.getData();\n      var tree = data.tree;\n      var decalPaletteScope = {};\n      tree.eachNode(function (node) {\n        // Use decal of level 1 node\n        var current = node;\n        while (current && current.depth > 1) {\n          current = current.parentNode;\n        }\n        var decal = getDecalFromPalette(seriesModel.ecModel, current.name || current.dataIndex + '', decalPaletteScope);\n        node.setVisual('decal', decal);\n      });\n    }\n\n    var TreemapSeriesModel = /** @class */function (_super) {\n      __extends(TreemapSeriesModel, _super);\n      function TreemapSeriesModel() {\n        var _this = _super !== null && _super.apply(this, arguments) || this;\n        _this.type = TreemapSeriesModel.type;\n        _this.preventUsingHoverLayer = true;\n        return _this;\n      }\n      /**\r\n       * @override\r\n       */\n      TreemapSeriesModel.prototype.getInitialData = function (option, ecModel) {\n        // Create a virtual root.\n        var root = {\n          name: option.name,\n          children: option.data\n        };\n        completeTreeValue(root);\n        var levels = option.levels || [];\n        // Used in \"visual priority\" in `treemapVisual.js`.\n        // This way is a little tricky, must satisfy the precondition:\n        //   1. There is no `treeNode.getModel('itemStyle.xxx')` used.\n        //   2. The `Model.prototype.getModel()` will not use any clone-like way.\n        var designatedVisualItemStyle = this.designatedVisualItemStyle = {};\n        var designatedVisualModel = new Model({\n          itemStyle: designatedVisualItemStyle\n        }, this, ecModel);\n        levels = option.levels = setDefault(levels, ecModel);\n        var levelModels = map(levels || [], function (levelDefine) {\n          return new Model(levelDefine, designatedVisualModel, ecModel);\n        }, this);\n        // Make sure always a new tree is created when setOption,\n        // in TreemapView, we check whether oldTree === newTree\n        // to choose mappings approach among old shapes and new shapes.\n        var tree = Tree.createTree(root, this, beforeLink);\n        function beforeLink(nodeData) {\n          nodeData.wrapMethod('getItemModel', function (model, idx) {\n            var node = tree.getNodeByDataIndex(idx);\n            var levelModel = node ? levelModels[node.depth] : null;\n            // If no levelModel, we also need `designatedVisualModel`.\n            model.parentModel = levelModel || designatedVisualModel;\n            return model;\n          });\n        }\n        return tree.data;\n      };\n      TreemapSeriesModel.prototype.optionUpdated = function () {\n        this.resetViewRoot();\n      };\n      /**\r\n       * @override\r\n       * @param {number} dataIndex\r\n       * @param {boolean} [mutipleSeries=false]\r\n       */\n      TreemapSeriesModel.prototype.formatTooltip = function (dataIndex, multipleSeries, dataType) {\n        var data = this.getData();\n        var value = this.getRawValue(dataIndex);\n        var name = data.getName(dataIndex);\n        return createTooltipMarkup('nameValue', {\n          name: name,\n          value: value\n        });\n      };\n      /**\r\n       * Add tree path to tooltip param\r\n       *\r\n       * @override\r\n       * @param {number} dataIndex\r\n       * @return {Object}\r\n       */\n      TreemapSeriesModel.prototype.getDataParams = function (dataIndex) {\n        var params = _super.prototype.getDataParams.apply(this, arguments);\n        var node = this.getData().tree.getNodeByDataIndex(dataIndex);\n        params.treeAncestors = wrapTreePathInfo(node, this);\n        // compatitable the previous code.\n        params.treePathInfo = params.treeAncestors;\n        return params;\n      };\n      /**\r\n       * @public\r\n       * @param {Object} layoutInfo {\r\n       *                                x: containerGroup x\r\n       *                                y: containerGroup y\r\n       *                                width: containerGroup width\r\n       *                                height: containerGroup height\r\n       *                            }\r\n       */\n      TreemapSeriesModel.prototype.setLayoutInfo = function (layoutInfo) {\n        /**\r\n         * @readOnly\r\n         * @type {Object}\r\n         */\n        this.layoutInfo = this.layoutInfo || {};\n        extend(this.layoutInfo, layoutInfo);\n      };\n      /**\r\n       * @param  {string} id\r\n       * @return {number} index\r\n       */\n      TreemapSeriesModel.prototype.mapIdToIndex = function (id) {\n        // A feature is implemented:\n        // index is monotone increasing with the sequence of\n        // input id at the first time.\n        // This feature can make sure that each data item and its\n        // mapped color have the same index between data list and\n        // color list at the beginning, which is useful for user\n        // to adjust data-color mapping.\n        /**\r\n         * @private\r\n         * @type {Object}\r\n         */\n        var idIndexMap = this._idIndexMap;\n        if (!idIndexMap) {\n          idIndexMap = this._idIndexMap = createHashMap();\n          /**\r\n           * @private\r\n           * @type {number}\r\n           */\n          this._idIndexMapCount = 0;\n        }\n        var index = idIndexMap.get(id);\n        if (index == null) {\n          idIndexMap.set(id, index = this._idIndexMapCount++);\n        }\n        return index;\n      };\n      TreemapSeriesModel.prototype.getViewRoot = function () {\n        return this._viewRoot;\n      };\n      TreemapSeriesModel.prototype.resetViewRoot = function (viewRoot) {\n        viewRoot ? this._viewRoot = viewRoot : viewRoot = this._viewRoot;\n        var root = this.getRawData().tree.root;\n        if (!viewRoot || viewRoot !== root && !root.contains(viewRoot)) {\n          this._viewRoot = root;\n        }\n      };\n      TreemapSeriesModel.prototype.enableAriaDecal = function () {\n        enableAriaDecalForTree(this);\n      };\n      TreemapSeriesModel.type = 'series.treemap';\n      TreemapSeriesModel.layoutMode = 'box';\n      TreemapSeriesModel.defaultOption = {\n        // Disable progressive rendering\n        progressive: 0,\n        // size: ['80%', '80%'],            // deprecated, compatible with ec2.\n        left: 'center',\n        top: 'middle',\n        width: '80%',\n        height: '80%',\n        sort: true,\n        clipWindow: 'origin',\n        squareRatio: 0.5 * (1 + Math.sqrt(5)),\n        leafDepth: null,\n        drillDownIcon: '▶',\n        // to align specialized icon. ▷▶❒❐▼✚\n        zoomToNodeRatio: 0.32 * 0.32,\n        scaleLimit: null,\n        roam: true,\n        nodeClick: 'zoomToNode',\n        animation: true,\n        animationDurationUpdate: 900,\n        animationEasing: 'quinticInOut',\n        breadcrumb: {\n          show: true,\n          height: 22,\n          left: 'center',\n          top: 'bottom',\n          // right\n          // bottom\n          emptyItemWidth: 25,\n          itemStyle: {\n            color: 'rgba(0,0,0,0.7)',\n            textStyle: {\n              color: '#fff'\n            }\n          },\n          emphasis: {\n            itemStyle: {\n              color: 'rgba(0,0,0,0.9)' // '#5793f3',\n            }\n          }\n        },\n        label: {\n          show: true,\n          // Do not use textDistance, for ellipsis rect just the same as treemap node rect.\n          distance: 0,\n          padding: 5,\n          position: 'inside',\n          // formatter: null,\n          color: '#fff',\n          overflow: 'truncate'\n          // align\n          // verticalAlign\n        },\n        upperLabel: {\n          show: false,\n          position: [0, '50%'],\n          height: 20,\n          // formatter: null,\n          // color: '#fff',\n          overflow: 'truncate',\n          // align: null,\n          verticalAlign: 'middle'\n        },\n        itemStyle: {\n          color: null,\n          colorAlpha: null,\n          colorSaturation: null,\n          borderWidth: 0,\n          gapWidth: 0,\n          borderColor: '#fff',\n          borderColorSaturation: null // If specified, borderColor will be ineffective, and the\n          // border color is evaluated by color of current node and\n          // borderColorSaturation.\n        },\n        emphasis: {\n          upperLabel: {\n            show: true,\n            position: [0, '50%'],\n            overflow: 'truncate',\n            verticalAlign: 'middle'\n          }\n        },\n        visualDimension: 0,\n        visualMin: null,\n        visualMax: null,\n        color: [],\n        // level[n].color (if necessary).\n        // + Specify color list of each level. level[0].color would be global\n        // color list if not specified. (see method `setDefault`).\n        // + But set as a empty array to forbid fetch color from global palette\n        // when using nodeModel.get('color'), otherwise nodes on deep level\n        // will always has color palette set and are not able to inherit color\n        // from parent node.\n        // + TreemapSeries.color can not be set as 'none', otherwise effect\n        // legend color fetching (see seriesColor.js).\n        colorAlpha: null,\n        colorSaturation: null,\n        colorMappingBy: 'index',\n        visibleMin: 10,\n        // be rendered. Only works when sort is 'asc' or 'desc'.\n        childrenVisibleMin: null,\n        // grandchildren will not show.\n        // Why grandchildren? If not grandchildren but children,\n        // some siblings show children and some not,\n        // the appearance may be mess and not consistent,\n        levels: [] // Each item: {\n        //     visibleMin, itemStyle, visualDimension, label\n        // }\n      };\n      return TreemapSeriesModel;\n    }(SeriesModel);\n    /**\r\n     * @param {Object} dataNode\r\n     */\n    function completeTreeValue(dataNode) {\n      // Postorder travel tree.\n      // If value of none-leaf node is not set,\n      // calculate it by suming up the value of all children.\n      var sum = 0;\n      each(dataNode.children, function (child) {\n        completeTreeValue(child);\n        var childValue = child.value;\n        isArray(childValue) && (childValue = childValue[0]);\n        sum += childValue;\n      });\n      var thisValue = dataNode.value;\n      if (isArray(thisValue)) {\n        thisValue = thisValue[0];\n      }\n      if (thisValue == null || isNaN(thisValue)) {\n        thisValue = sum;\n      }\n      // Value should not less than 0.\n      if (thisValue < 0) {\n        thisValue = 0;\n      }\n      isArray(dataNode.value) ? dataNode.value[0] = thisValue : dataNode.value = thisValue;\n    }\n    /**\r\n     * set default to level configuration\r\n     */\n    function setDefault(levels, ecModel) {\n      var globalColorList = normalizeToArray(ecModel.get('color'));\n      var globalDecalList = normalizeToArray(ecModel.get(['aria', 'decal', 'decals']));\n      if (!globalColorList) {\n        return;\n      }\n      levels = levels || [];\n      var hasColorDefine;\n      var hasDecalDefine;\n      each(levels, function (levelDefine) {\n        var model = new Model(levelDefine);\n        var modelColor = model.get('color');\n        var modelDecal = model.get('decal');\n        if (model.get(['itemStyle', 'color']) || modelColor && modelColor !== 'none') {\n          hasColorDefine = true;\n        }\n        if (model.get(['itemStyle', 'decal']) || modelDecal && modelDecal !== 'none') {\n          hasDecalDefine = true;\n        }\n      });\n      var level0 = levels[0] || (levels[0] = {});\n      if (!hasColorDefine) {\n        level0.color = globalColorList.slice();\n      }\n      if (!hasDecalDefine && globalDecalList) {\n        level0.decal = globalDecalList.slice();\n      }\n      return levels;\n    }\n\n    var TEXT_PADDING = 8;\n    var ITEM_GAP = 8;\n    var ARRAY_LENGTH = 5;\n    var Breadcrumb = /** @class */function () {\n      function Breadcrumb(containerGroup) {\n        this.group = new Group();\n        containerGroup.add(this.group);\n      }\n      Breadcrumb.prototype.render = function (seriesModel, api, targetNode, onSelect) {\n        var model = seriesModel.getModel('breadcrumb');\n        var thisGroup = this.group;\n        thisGroup.removeAll();\n        if (!model.get('show') || !targetNode) {\n          return;\n        }\n        var normalStyleModel = model.getModel('itemStyle');\n        var emphasisModel = model.getModel('emphasis');\n        var textStyleModel = normalStyleModel.getModel('textStyle');\n        var emphasisTextStyleModel = emphasisModel.getModel(['itemStyle', 'textStyle']);\n        var layoutParam = {\n          pos: {\n            left: model.get('left'),\n            right: model.get('right'),\n            top: model.get('top'),\n            bottom: model.get('bottom')\n          },\n          box: {\n            width: api.getWidth(),\n            height: api.getHeight()\n          },\n          emptyItemWidth: model.get('emptyItemWidth'),\n          totalWidth: 0,\n          renderList: []\n        };\n        this._prepare(targetNode, layoutParam, textStyleModel);\n        this._renderContent(seriesModel, layoutParam, normalStyleModel, emphasisModel, textStyleModel, emphasisTextStyleModel, onSelect);\n        positionElement(thisGroup, layoutParam.pos, layoutParam.box);\n      };\n      /**\r\n       * Prepare render list and total width\r\n       * @private\r\n       */\n      Breadcrumb.prototype._prepare = function (targetNode, layoutParam, textStyleModel) {\n        for (var node = targetNode; node; node = node.parentNode) {\n          var text = convertOptionIdName(node.getModel().get('name'), '');\n          var textRect = textStyleModel.getTextRect(text);\n          var itemWidth = Math.max(textRect.width + TEXT_PADDING * 2, layoutParam.emptyItemWidth);\n          layoutParam.totalWidth += itemWidth + ITEM_GAP;\n          layoutParam.renderList.push({\n            node: node,\n            text: text,\n            width: itemWidth\n          });\n        }\n      };\n      /**\r\n       * @private\r\n       */\n      Breadcrumb.prototype._renderContent = function (seriesModel, layoutParam, normalStyleModel, emphasisModel, textStyleModel, emphasisTextStyleModel, onSelect) {\n        // Start rendering.\n        var lastX = 0;\n        var emptyItemWidth = layoutParam.emptyItemWidth;\n        var height = seriesModel.get(['breadcrumb', 'height']);\n        var availableSize = getAvailableSize(layoutParam.pos, layoutParam.box);\n        var totalWidth = layoutParam.totalWidth;\n        var renderList = layoutParam.renderList;\n        var emphasisItemStyle = emphasisModel.getModel('itemStyle').getItemStyle();\n        for (var i = renderList.length - 1; i >= 0; i--) {\n          var item = renderList[i];\n          var itemNode = item.node;\n          var itemWidth = item.width;\n          var text = item.text;\n          // Hdie text and shorten width if necessary.\n          if (totalWidth > availableSize.width) {\n            totalWidth -= itemWidth - emptyItemWidth;\n            itemWidth = emptyItemWidth;\n            text = null;\n          }\n          var el = new Polygon({\n            shape: {\n              points: makeItemPoints(lastX, 0, itemWidth, height, i === renderList.length - 1, i === 0)\n            },\n            style: defaults(normalStyleModel.getItemStyle(), {\n              lineJoin: 'bevel'\n            }),\n            textContent: new ZRText({\n              style: createTextStyle(textStyleModel, {\n                text: text\n              })\n            }),\n            textConfig: {\n              position: 'inside'\n            },\n            z2: Z2_EMPHASIS_LIFT * 1e4,\n            onclick: curry(onSelect, itemNode)\n          });\n          el.disableLabelAnimation = true;\n          el.getTextContent().ensureState('emphasis').style = createTextStyle(emphasisTextStyleModel, {\n            text: text\n          });\n          el.ensureState('emphasis').style = emphasisItemStyle;\n          toggleHoverEmphasis(el, emphasisModel.get('focus'), emphasisModel.get('blurScope'), emphasisModel.get('disabled'));\n          this.group.add(el);\n          packEventData(el, seriesModel, itemNode);\n          lastX += itemWidth + ITEM_GAP;\n        }\n      };\n      Breadcrumb.prototype.remove = function () {\n        this.group.removeAll();\n      };\n      return Breadcrumb;\n    }();\n    function makeItemPoints(x, y, itemWidth, itemHeight, head, tail) {\n      var points = [[head ? x : x - ARRAY_LENGTH, y], [x + itemWidth, y], [x + itemWidth, y + itemHeight], [head ? x : x - ARRAY_LENGTH, y + itemHeight]];\n      !tail && points.splice(2, 0, [x + itemWidth + ARRAY_LENGTH, y + itemHeight / 2]);\n      !head && points.push([x, y + itemHeight / 2]);\n      return points;\n    }\n    // Package custom mouse event.\n    function packEventData(el, seriesModel, itemNode) {\n      getECData(el).eventData = {\n        componentType: 'series',\n        componentSubType: 'treemap',\n        componentIndex: seriesModel.componentIndex,\n        seriesIndex: seriesModel.seriesIndex,\n        seriesName: seriesModel.name,\n        seriesType: 'treemap',\n        selfType: 'breadcrumb',\n        nodeData: {\n          dataIndex: itemNode && itemNode.dataIndex,\n          name: itemNode && itemNode.name\n        },\n        treePathInfo: itemNode && wrapTreePathInfo(itemNode, seriesModel)\n      };\n    }\n\n    /*\n    * Licensed to the Apache Software Foundation (ASF) under one\n    * or more contributor license agreements.  See the NOTICE file\n    * distributed with this work for additional information\n    * regarding copyright ownership.  The ASF licenses this file\n    * to you under the Apache License, Version 2.0 (the\n    * \"License\"); you may not use this file except in compliance\n    * with the License.  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,\n    * software distributed under the License is distributed on an\n    * \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\n    * KIND, either express or implied.  See the License for the\n    * specific language governing permissions and limitations\n    * under the License.\n    */\n\n\n    /**\n     * AUTO-GENERATED FILE. DO NOT MODIFY.\n     */\n\n    /*\r\n    * Licensed to the Apache Software Foundation (ASF) under one\r\n    * or more contributor license agreements.  See the NOTICE file\r\n    * distributed with this work for additional information\r\n    * regarding copyright ownership.  The ASF licenses this file\r\n    * to you under the Apache License, Version 2.0 (the\r\n    * \"License\"); you may not use this file except in compliance\r\n    * with the License.  You may obtain a copy of the License at\r\n    *\r\n    *   http://www.apache.org/licenses/LICENSE-2.0\r\n    *\r\n    * Unless required by applicable law or agreed to in writing,\r\n    * software distributed under the License is distributed on an\r\n    * \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\r\n    * KIND, either express or implied.  See the License for the\r\n    * specific language governing permissions and limitations\r\n    * under the License.\r\n    */\n    /**\r\n     * Animate multiple elements with a single done-callback.\r\n     *\r\n     * @example\r\n     *  animation\r\n     *      .createWrap()\r\n     *      .add(el1, {x: 10, y: 10})\r\n     *      .add(el2, {shape: {width: 500}, style: {fill: 'red'}}, 400)\r\n     *      .done(function () { // done })\r\n     *      .start('cubicOut');\r\n     */\n    var AnimationWrap = /** @class */function () {\n      function AnimationWrap() {\n        this._storage = [];\n        this._elExistsMap = {};\n      }\n      /**\r\n       * Caution: a el can only be added once, otherwise 'done'\r\n       * might not be called. This method checks this (by el.id),\r\n       * suppresses adding and returns false when existing el found.\r\n       *\r\n       * @return Whether adding succeeded.\r\n       */\n      AnimationWrap.prototype.add = function (el, target, duration, delay, easing) {\n        if (this._elExistsMap[el.id]) {\n          return false;\n        }\n        this._elExistsMap[el.id] = true;\n        this._storage.push({\n          el: el,\n          target: target,\n          duration: duration,\n          delay: delay,\n          easing: easing\n        });\n        return true;\n      };\n      /**\r\n       * Only execute when animation done/aborted.\r\n       */\n      AnimationWrap.prototype.finished = function (callback) {\n        this._finishedCallback = callback;\n        return this;\n      };\n      /**\r\n       * Will stop exist animation firstly.\r\n       */\n      AnimationWrap.prototype.start = function () {\n        var _this = this;\n        var count = this._storage.length;\n        var checkTerminate = function () {\n          count--;\n          if (count <= 0) {\n            // Guard.\n            _this._storage.length = 0;\n            _this._elExistsMap = {};\n            _this._finishedCallback && _this._finishedCallback();\n          }\n        };\n        for (var i = 0, len = this._storage.length; i < len; i++) {\n          var item = this._storage[i];\n          item.el.animateTo(item.target, {\n            duration: item.duration,\n            delay: item.delay,\n            easing: item.easing,\n            setToFinal: true,\n            done: checkTerminate,\n            aborted: checkTerminate\n          });\n        }\n        return this;\n      };\n      return AnimationWrap;\n    }();\n    function createWrap() {\n      return new AnimationWrap();\n    }\n\n    var Group$1 = Group;\n    var Rect$1 = Rect;\n    var DRAG_THRESHOLD = 3;\n    var PATH_LABEL_NOAMAL = 'label';\n    var PATH_UPPERLABEL_NORMAL = 'upperLabel';\n    // Should larger than emphasis states lift z\n    var Z2_BASE = Z2_EMPHASIS_LIFT * 10; // Should bigger than every z2.\n    var Z2_BG = Z2_EMPHASIS_LIFT * 2;\n    var Z2_CONTENT = Z2_EMPHASIS_LIFT * 3;\n    var getStateItemStyle = makeStyleMapper([['fill', 'color'],\n    // `borderColor` and `borderWidth` has been occupied,\n    // so use `stroke` to indicate the stroke of the rect.\n    ['stroke', 'strokeColor'], ['lineWidth', 'strokeWidth'], ['shadowBlur'], ['shadowOffsetX'], ['shadowOffsetY'], ['shadowColor']\n    // Option decal is in `DecalObject` but style.decal is in `PatternObject`.\n    // So do not transfer decal directly.\n    ]);\n    var getItemStyleNormal = function (model) {\n      // Normal style props should include emphasis style props.\n      var itemStyle = getStateItemStyle(model);\n      // Clear styles set by emphasis.\n      itemStyle.stroke = itemStyle.fill = itemStyle.lineWidth = null;\n      return itemStyle;\n    };\n    var inner$8 = makeInner();\n    var TreemapView = /** @class */function (_super) {\n      __extends(TreemapView, _super);\n      function TreemapView() {\n        var _this = _super !== null && _super.apply(this, arguments) || this;\n        _this.type = TreemapView.type;\n        _this._state = 'ready';\n        _this._storage = createStorage();\n        return _this;\n      }\n      /**\r\n       * @override\r\n       */\n      TreemapView.prototype.render = function (seriesModel, ecModel, api, payload) {\n        var models = ecModel.findComponents({\n          mainType: 'series',\n          subType: 'treemap',\n          query: payload\n        });\n        if (indexOf(models, seriesModel) < 0) {\n          return;\n        }\n        this.seriesModel = seriesModel;\n        this.api = api;\n        this.ecModel = ecModel;\n        var types = ['treemapZoomToNode', 'treemapRootToNode'];\n        var targetInfo = retrieveTargetInfo(payload, types, seriesModel);\n        var payloadType = payload && payload.type;\n        var layoutInfo = seriesModel.layoutInfo;\n        var isInit = !this._oldTree;\n        var thisStorage = this._storage;\n        // Mark new root when action is treemapRootToNode.\n        var reRoot = payloadType === 'treemapRootToNode' && targetInfo && thisStorage ? {\n          rootNodeGroup: thisStorage.nodeGroup[targetInfo.node.getRawIndex()],\n          direction: payload.direction\n        } : null;\n        var containerGroup = this._giveContainerGroup(layoutInfo);\n        var hasAnimation = seriesModel.get('animation');\n        var renderResult = this._doRender(containerGroup, seriesModel, reRoot);\n        hasAnimation && !isInit && (!payloadType || payloadType === 'treemapZoomToNode' || payloadType === 'treemapRootToNode') ? this._doAnimation(containerGroup, renderResult, seriesModel, reRoot) : renderResult.renderFinally();\n        this._resetController(api);\n        this._renderBreadcrumb(seriesModel, api, targetInfo);\n      };\n      TreemapView.prototype._giveContainerGroup = function (layoutInfo) {\n        var containerGroup = this._containerGroup;\n        if (!containerGroup) {\n          // FIXME\n          // 加一层containerGroup是为了clip，但是现在clip功能并没有实现。\n          containerGroup = this._containerGroup = new Group$1();\n          this._initEvents(containerGroup);\n          this.group.add(containerGroup);\n        }\n        containerGroup.x = layoutInfo.x;\n        containerGroup.y = layoutInfo.y;\n        return containerGroup;\n      };\n      TreemapView.prototype._doRender = function (containerGroup, seriesModel, reRoot) {\n        var thisTree = seriesModel.getData().tree;\n        var oldTree = this._oldTree;\n        // Clear last shape records.\n        var lastsForAnimation = createStorage();\n        var thisStorage = createStorage();\n        var oldStorage = this._storage;\n        var willInvisibleEls = [];\n        function doRenderNode(thisNode, oldNode, parentGroup, depth) {\n          return renderNode(seriesModel, thisStorage, oldStorage, reRoot, lastsForAnimation, willInvisibleEls, thisNode, oldNode, parentGroup, depth);\n        }\n        // Notice: When thisTree and oldTree are the same tree (see list.cloneShallow),\n        // the oldTree is actually losted, so we cannot find all of the old graphic\n        // elements from tree. So we use this strategy: make element storage, move\n        // from old storage to new storage, clear old storage.\n        dualTravel(thisTree.root ? [thisTree.root] : [], oldTree && oldTree.root ? [oldTree.root] : [], containerGroup, thisTree === oldTree || !oldTree, 0);\n        // Process all removing.\n        var willDeleteEls = clearStorage(oldStorage);\n        this._oldTree = thisTree;\n        this._storage = thisStorage;\n        if (this._controllerHost) {\n          var _oldRootLayout = this.seriesModel.layoutInfo;\n          var rootLayout = thisTree.root.getLayout();\n          if (rootLayout.width === _oldRootLayout.width && rootLayout.height === _oldRootLayout.height) {\n            this._controllerHost.zoom = 1;\n          }\n        }\n        return {\n          lastsForAnimation: lastsForAnimation,\n          willDeleteEls: willDeleteEls,\n          renderFinally: renderFinally\n        };\n        function dualTravel(thisViewChildren, oldViewChildren, parentGroup, sameTree, depth) {\n          // When 'render' is triggered by action,\n          // 'this' and 'old' may be the same tree,\n          // we use rawIndex in that case.\n          if (sameTree) {\n            oldViewChildren = thisViewChildren;\n            each(thisViewChildren, function (child, index) {\n              !child.isRemoved() && processNode(index, index);\n            });\n          }\n          // Diff hierarchically (diff only in each subtree, but not whole).\n          // because, consistency of view is important.\n          else {\n            new DataDiffer(oldViewChildren, thisViewChildren, getKey, getKey).add(processNode).update(processNode).remove(curry(processNode, null)).execute();\n          }\n          function getKey(node) {\n            // Identify by name or raw index.\n            return node.getId();\n          }\n          function processNode(newIndex, oldIndex) {\n            var thisNode = newIndex != null ? thisViewChildren[newIndex] : null;\n            var oldNode = oldIndex != null ? oldViewChildren[oldIndex] : null;\n            var group = doRenderNode(thisNode, oldNode, parentGroup, depth);\n            group && dualTravel(thisNode && thisNode.viewChildren || [], oldNode && oldNode.viewChildren || [], group, sameTree, depth + 1);\n          }\n        }\n        function clearStorage(storage) {\n          var willDeleteEls = createStorage();\n          storage && each(storage, function (store, storageName) {\n            var delEls = willDeleteEls[storageName];\n            each(store, function (el) {\n              el && (delEls.push(el), inner$8(el).willDelete = true);\n            });\n          });\n          return willDeleteEls;\n        }\n        function renderFinally() {\n          each(willDeleteEls, function (els) {\n            each(els, function (el) {\n              el.parent && el.parent.remove(el);\n            });\n          });\n          each(willInvisibleEls, function (el) {\n            el.invisible = true;\n            // Setting invisible is for optimizing, so no need to set dirty,\n            // just mark as invisible.\n            el.dirty();\n          });\n        }\n      };\n      TreemapView.prototype._doAnimation = function (containerGroup, renderResult, seriesModel, reRoot) {\n        var durationOption = seriesModel.get('animationDurationUpdate');\n        var easingOption = seriesModel.get('animationEasing');\n        // TODO: do not support function until necessary.\n        var duration = (isFunction(durationOption) ? 0 : durationOption) || 0;\n        var easing = (isFunction(easingOption) ? null : easingOption) || 'cubicOut';\n        var animationWrap = createWrap();\n        // Make delete animations.\n        each(renderResult.willDeleteEls, function (store, storageName) {\n          each(store, function (el, rawIndex) {\n            if (el.invisible) {\n              return;\n            }\n            var parent = el.parent; // Always has parent, and parent is nodeGroup.\n            var target;\n            var innerStore = inner$8(parent);\n            if (reRoot && reRoot.direction === 'drillDown') {\n              target = parent === reRoot.rootNodeGroup\n              // This is the content element of view root.\n              // Only `content` will enter this branch, because\n              // `background` and `nodeGroup` will not be deleted.\n              ? {\n                shape: {\n                  x: 0,\n                  y: 0,\n                  width: innerStore.nodeWidth,\n                  height: innerStore.nodeHeight\n                },\n                style: {\n                  opacity: 0\n                }\n              }\n              // Others.\n              : {\n                style: {\n                  opacity: 0\n                }\n              };\n            } else {\n              var targetX = 0;\n              var targetY = 0;\n              if (!innerStore.willDelete) {\n                // Let node animate to right-bottom corner, cooperating with fadeout,\n                // which is appropriate for user understanding.\n                // Divided by 2 for reRoot rolling up effect.\n                targetX = innerStore.nodeWidth / 2;\n                targetY = innerStore.nodeHeight / 2;\n              }\n              target = storageName === 'nodeGroup' ? {\n                x: targetX,\n                y: targetY,\n                style: {\n                  opacity: 0\n                }\n              } : {\n                shape: {\n                  x: targetX,\n                  y: targetY,\n                  width: 0,\n                  height: 0\n                },\n                style: {\n                  opacity: 0\n                }\n              };\n            }\n            // TODO: do not support delay until necessary.\n            target && animationWrap.add(el, target, duration, 0, easing);\n          });\n        });\n        // Make other animations\n        each(this._storage, function (store, storageName) {\n          each(store, function (el, rawIndex) {\n            var last = renderResult.lastsForAnimation[storageName][rawIndex];\n            var target = {};\n            if (!last) {\n              return;\n            }\n            if (el instanceof Group) {\n              if (last.oldX != null) {\n                target.x = el.x;\n                target.y = el.y;\n                el.x = last.oldX;\n                el.y = last.oldY;\n              }\n            } else {\n              if (last.oldShape) {\n                target.shape = extend({}, el.shape);\n                el.setShape(last.oldShape);\n              }\n              if (last.fadein) {\n                el.setStyle('opacity', 0);\n                target.style = {\n                  opacity: 1\n                };\n              }\n              // When animation is stopped for succedent animation starting,\n              // el.style.opacity might not be 1\n              else if (el.style.opacity !== 1) {\n                target.style = {\n                  opacity: 1\n                };\n              }\n            }\n            animationWrap.add(el, target, duration, 0, easing);\n          });\n        }, this);\n        this._state = 'animating';\n        animationWrap.finished(bind(function () {\n          this._state = 'ready';\n          renderResult.renderFinally();\n        }, this)).start();\n      };\n      TreemapView.prototype._resetController = function (api) {\n        var controller = this._controller;\n        var controllerHost = this._controllerHost;\n        if (!controllerHost) {\n          this._controllerHost = {\n            target: this.group\n          };\n          controllerHost = this._controllerHost;\n        }\n        // Init controller.\n        if (!controller) {\n          controller = this._controller = new RoamController(api.getZr());\n          controller.enable(this.seriesModel.get('roam'));\n          controllerHost.zoomLimit = this.seriesModel.get('scaleLimit');\n          controllerHost.zoom = this.seriesModel.get('zoom');\n          controller.on('pan', bind(this._onPan, this));\n          controller.on('zoom', bind(this._onZoom, this));\n        }\n        var rect = new BoundingRect(0, 0, api.getWidth(), api.getHeight());\n        controller.setPointerChecker(function (e, x, y) {\n          return rect.contain(x, y);\n        });\n      };\n      TreemapView.prototype._clearController = function () {\n        var controller = this._controller;\n        this._controllerHost = null;\n        if (controller) {\n          controller.dispose();\n          controller = null;\n        }\n      };\n      TreemapView.prototype._onPan = function (e) {\n        if (this._state !== 'animating' && (Math.abs(e.dx) > DRAG_THRESHOLD || Math.abs(e.dy) > DRAG_THRESHOLD)) {\n          // These param must not be cached.\n          var root = this.seriesModel.getData().tree.root;\n          if (!root) {\n            return;\n          }\n          var rootLayout = root.getLayout();\n          if (!rootLayout) {\n            return;\n          }\n          this.api.dispatchAction({\n            type: 'treemapMove',\n            from: this.uid,\n            seriesId: this.seriesModel.id,\n            rootRect: {\n              x: rootLayout.x + e.dx,\n              y: rootLayout.y + e.dy,\n              width: rootLayout.width,\n              height: rootLayout.height\n            }\n          });\n        }\n      };\n      TreemapView.prototype._onZoom = function (e) {\n        var mouseX = e.originX;\n        var mouseY = e.originY;\n        var zoomDelta = e.scale;\n        if (this._state !== 'animating') {\n          // These param must not be cached.\n          var root = this.seriesModel.getData().tree.root;\n          if (!root) {\n            return;\n          }\n          var rootLayout = root.getLayout();\n          if (!rootLayout) {\n            return;\n          }\n          var rect = new BoundingRect(rootLayout.x, rootLayout.y, rootLayout.width, rootLayout.height);\n          // scaleLimit\n          var zoomLimit = null;\n          var _controllerHost = this._controllerHost;\n          zoomLimit = _controllerHost.zoomLimit;\n          var newZoom = _controllerHost.zoom = _controllerHost.zoom || 1;\n          newZoom *= zoomDelta;\n          if (zoomLimit) {\n            var zoomMin = zoomLimit.min || 0;\n            var zoomMax = zoomLimit.max || Infinity;\n            newZoom = Math.max(Math.min(zoomMax, newZoom), zoomMin);\n          }\n          var zoomScale = newZoom / _controllerHost.zoom;\n          _controllerHost.zoom = newZoom;\n          var layoutInfo = this.seriesModel.layoutInfo;\n          // Transform mouse coord from global to containerGroup.\n          mouseX -= layoutInfo.x;\n          mouseY -= layoutInfo.y;\n          // Scale root bounding rect.\n          var m = create$1();\n          translate(m, m, [-mouseX, -mouseY]);\n          scale$1(m, m, [zoomScale, zoomScale]);\n          translate(m, m, [mouseX, mouseY]);\n          rect.applyTransform(m);\n          this.api.dispatchAction({\n            type: 'treemapRender',\n            from: this.uid,\n            seriesId: this.seriesModel.id,\n            rootRect: {\n              x: rect.x,\n              y: rect.y,\n              width: rect.width,\n              height: rect.height\n            }\n          });\n        }\n      };\n      TreemapView.prototype._initEvents = function (containerGroup) {\n        var _this = this;\n        containerGroup.on('click', function (e) {\n          if (_this._state !== 'ready') {\n            return;\n          }\n          var nodeClick = _this.seriesModel.get('nodeClick', true);\n          if (!nodeClick) {\n            return;\n          }\n          var targetInfo = _this.findTarget(e.offsetX, e.offsetY);\n          if (!targetInfo) {\n            return;\n          }\n          var node = targetInfo.node;\n          if (node.getLayout().isLeafRoot) {\n            _this._rootToNode(targetInfo);\n          } else {\n            if (nodeClick === 'zoomToNode') {\n              _this._zoomToNode(targetInfo);\n            } else if (nodeClick === 'link') {\n              var itemModel = node.hostTree.data.getItemModel(node.dataIndex);\n              var link = itemModel.get('link', true);\n              var linkTarget = itemModel.get('target', true) || 'blank';\n              link && windowOpen(link, linkTarget);\n            }\n          }\n        }, this);\n      };\n      TreemapView.prototype._renderBreadcrumb = function (seriesModel, api, targetInfo) {\n        var _this = this;\n        if (!targetInfo) {\n          targetInfo = seriesModel.get('leafDepth', true) != null ? {\n            node: seriesModel.getViewRoot()\n          }\n          // FIXME\n          // better way?\n          // Find breadcrumb tail on center of containerGroup.\n          : this.findTarget(api.getWidth() / 2, api.getHeight() / 2);\n          if (!targetInfo) {\n            targetInfo = {\n              node: seriesModel.getData().tree.root\n            };\n          }\n        }\n        (this._breadcrumb || (this._breadcrumb = new Breadcrumb(this.group))).render(seriesModel, api, targetInfo.node, function (node) {\n          if (_this._state !== 'animating') {\n            aboveViewRoot(seriesModel.getViewRoot(), node) ? _this._rootToNode({\n              node: node\n            }) : _this._zoomToNode({\n              node: node\n            });\n          }\n        });\n      };\n      /**\r\n       * @override\r\n       */\n      TreemapView.prototype.remove = function () {\n        this._clearController();\n        this._containerGroup && this._containerGroup.removeAll();\n        this._storage = createStorage();\n        this._state = 'ready';\n        this._breadcrumb && this._breadcrumb.remove();\n      };\n      TreemapView.prototype.dispose = function () {\n        this._clearController();\n      };\n      TreemapView.prototype._zoomToNode = function (targetInfo) {\n        this.api.dispatchAction({\n          type: 'treemapZoomToNode',\n          from: this.uid,\n          seriesId: this.seriesModel.id,\n          targetNode: targetInfo.node\n        });\n      };\n      TreemapView.prototype._rootToNode = function (targetInfo) {\n        this.api.dispatchAction({\n          type: 'treemapRootToNode',\n          from: this.uid,\n          seriesId: this.seriesModel.id,\n          targetNode: targetInfo.node\n        });\n      };\n      /**\r\n       * @public\r\n       * @param {number} x Global coord x.\r\n       * @param {number} y Global coord y.\r\n       * @return {Object} info If not found, return undefined;\r\n       * @return {number} info.node Target node.\r\n       * @return {number} info.offsetX x refer to target node.\r\n       * @return {number} info.offsetY y refer to target node.\r\n       */\n      TreemapView.prototype.findTarget = function (x, y) {\n        var targetInfo;\n        var viewRoot = this.seriesModel.getViewRoot();\n        viewRoot.eachNode({\n          attr: 'viewChildren',\n          order: 'preorder'\n        }, function (node) {\n          var bgEl = this._storage.background[node.getRawIndex()];\n          // If invisible, there might be no element.\n          if (bgEl) {\n            var point = bgEl.transformCoordToLocal(x, y);\n            var shape = bgEl.shape;\n            // For performance consideration, don't use 'getBoundingRect'.\n            if (shape.x <= point[0] && point[0] <= shape.x + shape.width && shape.y <= point[1] && point[1] <= shape.y + shape.height) {\n              targetInfo = {\n                node: node,\n                offsetX: point[0],\n                offsetY: point[1]\n              };\n            } else {\n              return false; // Suppress visit subtree.\n            }\n          }\n        }, this);\n        return targetInfo;\n      };\n      TreemapView.type = 'treemap';\n      return TreemapView;\n    }(ChartView);\n    /**\r\n     * @inner\r\n     */\n    function createStorage() {\n      return {\n        nodeGroup: [],\n        background: [],\n        content: []\n      };\n    }\n    /**\r\n     * @inner\r\n     * @return Return undefined means do not travel further.\r\n     */\n    function renderNode(seriesModel, thisStorage, oldStorage, reRoot, lastsForAnimation, willInvisibleEls, thisNode, oldNode, parentGroup, depth) {\n      // Whether under viewRoot.\n      if (!thisNode) {\n        // Deleting nodes will be performed finally. This method just find\n        // element from old storage, or create new element, set them to new\n        // storage, and set styles.\n        return;\n      }\n      // -------------------------------------------------------------------\n      // Start of closure variables available in \"Procedures in renderNode\".\n      var thisLayout = thisNode.getLayout();\n      var data = seriesModel.getData();\n      var nodeModel = thisNode.getModel();\n      // Only for enabling highlight/downplay. Clear firstly.\n      // Because some node will not be rendered.\n      data.setItemGraphicEl(thisNode.dataIndex, null);\n      if (!thisLayout || !thisLayout.isInView) {\n        return;\n      }\n      var thisWidth = thisLayout.width;\n      var thisHeight = thisLayout.height;\n      var borderWidth = thisLayout.borderWidth;\n      var thisInvisible = thisLayout.invisible;\n      var thisRawIndex = thisNode.getRawIndex();\n      var oldRawIndex = oldNode && oldNode.getRawIndex();\n      var thisViewChildren = thisNode.viewChildren;\n      var upperHeight = thisLayout.upperHeight;\n      var isParent = thisViewChildren && thisViewChildren.length;\n      var itemStyleNormalModel = nodeModel.getModel('itemStyle');\n      var itemStyleEmphasisModel = nodeModel.getModel(['emphasis', 'itemStyle']);\n      var itemStyleBlurModel = nodeModel.getModel(['blur', 'itemStyle']);\n      var itemStyleSelectModel = nodeModel.getModel(['select', 'itemStyle']);\n      var borderRadius = itemStyleNormalModel.get('borderRadius') || 0;\n      // End of closure ariables available in \"Procedures in renderNode\".\n      // -----------------------------------------------------------------\n      // Node group\n      var group = giveGraphic('nodeGroup', Group$1);\n      if (!group) {\n        return;\n      }\n      parentGroup.add(group);\n      // x,y are not set when el is above view root.\n      group.x = thisLayout.x || 0;\n      group.y = thisLayout.y || 0;\n      group.markRedraw();\n      inner$8(group).nodeWidth = thisWidth;\n      inner$8(group).nodeHeight = thisHeight;\n      if (thisLayout.isAboveViewRoot) {\n        return group;\n      }\n      // Background\n      var bg = giveGraphic('background', Rect$1, depth, Z2_BG);\n      bg && renderBackground(group, bg, isParent && thisLayout.upperLabelHeight);\n      var emphasisModel = nodeModel.getModel('emphasis');\n      var focus = emphasisModel.get('focus');\n      var blurScope = emphasisModel.get('blurScope');\n      var isDisabled = emphasisModel.get('disabled');\n      var focusOrIndices = focus === 'ancestor' ? thisNode.getAncestorsIndices() : focus === 'descendant' ? thisNode.getDescendantIndices() : focus;\n      // No children, render content.\n      if (isParent) {\n        // Because of the implementation about \"traverse\" in graphic hover style, we\n        // can not set hover listener on the \"group\" of non-leaf node. Otherwise the\n        // hover event from the descendents will be listenered.\n        if (isHighDownDispatcher(group)) {\n          setAsHighDownDispatcher(group, false);\n        }\n        if (bg) {\n          setAsHighDownDispatcher(bg, !isDisabled);\n          // Only for enabling highlight/downplay.\n          data.setItemGraphicEl(thisNode.dataIndex, bg);\n          enableHoverFocus(bg, focusOrIndices, blurScope);\n        }\n      } else {\n        var content = giveGraphic('content', Rect$1, depth, Z2_CONTENT);\n        content && renderContent(group, content);\n        bg.disableMorphing = true;\n        if (bg && isHighDownDispatcher(bg)) {\n          setAsHighDownDispatcher(bg, false);\n        }\n        setAsHighDownDispatcher(group, !isDisabled);\n        // Only for enabling highlight/downplay.\n        data.setItemGraphicEl(thisNode.dataIndex, group);\n        var cursorStyle = nodeModel.getShallow('cursor');\n        cursorStyle && content.attr('cursor', cursorStyle);\n        enableHoverFocus(group, focusOrIndices, blurScope);\n      }\n      return group;\n      // ----------------------------\n      // | Procedures in renderNode |\n      // ----------------------------\n      function renderBackground(group, bg, useUpperLabel) {\n        var ecData = getECData(bg);\n        // For tooltip.\n        ecData.dataIndex = thisNode.dataIndex;\n        ecData.seriesIndex = seriesModel.seriesIndex;\n        bg.setShape({\n          x: 0,\n          y: 0,\n          width: thisWidth,\n          height: thisHeight,\n          r: borderRadius\n        });\n        if (thisInvisible) {\n          // If invisible, do not set visual, otherwise the element will\n          // change immediately before animation. We think it is OK to\n          // remain its origin color when moving out of the view window.\n          processInvisible(bg);\n        } else {\n          bg.invisible = false;\n          var style = thisNode.getVisual('style');\n          var visualBorderColor = style.stroke;\n          var normalStyle = getItemStyleNormal(itemStyleNormalModel);\n          normalStyle.fill = visualBorderColor;\n          var emphasisStyle = getStateItemStyle(itemStyleEmphasisModel);\n          emphasisStyle.fill = itemStyleEmphasisModel.get('borderColor');\n          var blurStyle = getStateItemStyle(itemStyleBlurModel);\n          blurStyle.fill = itemStyleBlurModel.get('borderColor');\n          var selectStyle = getStateItemStyle(itemStyleSelectModel);\n          selectStyle.fill = itemStyleSelectModel.get('borderColor');\n          if (useUpperLabel) {\n            var upperLabelWidth = thisWidth - 2 * borderWidth;\n            prepareText(\n            // PENDING: convert ZRColor to ColorString for text.\n            bg, visualBorderColor, style.opacity, {\n              x: borderWidth,\n              y: 0,\n              width: upperLabelWidth,\n              height: upperHeight\n            });\n          }\n          // For old bg.\n          else {\n            bg.removeTextContent();\n          }\n          bg.setStyle(normalStyle);\n          bg.ensureState('emphasis').style = emphasisStyle;\n          bg.ensureState('blur').style = blurStyle;\n          bg.ensureState('select').style = selectStyle;\n          setDefaultStateProxy(bg);\n        }\n        group.add(bg);\n      }\n      function renderContent(group, content) {\n        var ecData = getECData(content);\n        // For tooltip.\n        ecData.dataIndex = thisNode.dataIndex;\n        ecData.seriesIndex = seriesModel.seriesIndex;\n        var contentWidth = Math.max(thisWidth - 2 * borderWidth, 0);\n        var contentHeight = Math.max(thisHeight - 2 * borderWidth, 0);\n        content.culling = true;\n        content.setShape({\n          x: borderWidth,\n          y: borderWidth,\n          width: contentWidth,\n          height: contentHeight,\n          r: borderRadius\n        });\n        if (thisInvisible) {\n          // If invisible, do not set visual, otherwise the element will\n          // change immediately before animation. We think it is OK to\n          // remain its origin color when moving out of the view window.\n          processInvisible(content);\n        } else {\n          content.invisible = false;\n          var nodeStyle = thisNode.getVisual('style');\n          var visualColor = nodeStyle.fill;\n          var normalStyle = getItemStyleNormal(itemStyleNormalModel);\n          normalStyle.fill = visualColor;\n          normalStyle.decal = nodeStyle.decal;\n          var emphasisStyle = getStateItemStyle(itemStyleEmphasisModel);\n          var blurStyle = getStateItemStyle(itemStyleBlurModel);\n          var selectStyle = getStateItemStyle(itemStyleSelectModel);\n          // PENDING: convert ZRColor to ColorString for text.\n          prepareText(content, visualColor, nodeStyle.opacity, null);\n          content.setStyle(normalStyle);\n          content.ensureState('emphasis').style = emphasisStyle;\n          content.ensureState('blur').style = blurStyle;\n          content.ensureState('select').style = selectStyle;\n          setDefaultStateProxy(content);\n        }\n        group.add(content);\n      }\n      function processInvisible(element) {\n        // Delay invisible setting utill animation finished,\n        // avoid element vanish suddenly before animation.\n        !element.invisible && willInvisibleEls.push(element);\n      }\n      function prepareText(rectEl, visualColor, visualOpacity,\n      // Can be null/undefined\n      upperLabelRect) {\n        var normalLabelModel = nodeModel.getModel(upperLabelRect ? PATH_UPPERLABEL_NORMAL : PATH_LABEL_NOAMAL);\n        var defaultText = convertOptionIdName(nodeModel.get('name'), null);\n        var isShow = normalLabelModel.getShallow('show');\n        setLabelStyle(rectEl, getLabelStatesModels(nodeModel, upperLabelRect ? PATH_UPPERLABEL_NORMAL : PATH_LABEL_NOAMAL), {\n          defaultText: isShow ? defaultText : null,\n          inheritColor: visualColor,\n          defaultOpacity: visualOpacity,\n          labelFetcher: seriesModel,\n          labelDataIndex: thisNode.dataIndex\n        });\n        var textEl = rectEl.getTextContent();\n        if (!textEl) {\n          return;\n        }\n        var textStyle = textEl.style;\n        var textPadding = normalizeCssArray(textStyle.padding || 0);\n        if (upperLabelRect) {\n          rectEl.setTextConfig({\n            layoutRect: upperLabelRect\n          });\n          textEl.disableLabelLayout = true;\n        }\n        textEl.beforeUpdate = function () {\n          var width = Math.max((upperLabelRect ? upperLabelRect.width : rectEl.shape.width) - textPadding[1] - textPadding[3], 0);\n          var height = Math.max((upperLabelRect ? upperLabelRect.height : rectEl.shape.height) - textPadding[0] - textPadding[2], 0);\n          if (textStyle.width !== width || textStyle.height !== height) {\n            textEl.setStyle({\n              width: width,\n              height: height\n            });\n          }\n        };\n        textStyle.truncateMinChar = 2;\n        textStyle.lineOverflow = 'truncate';\n        addDrillDownIcon(textStyle, upperLabelRect, thisLayout);\n        var textEmphasisState = textEl.getState('emphasis');\n        addDrillDownIcon(textEmphasisState ? textEmphasisState.style : null, upperLabelRect, thisLayout);\n      }\n      function addDrillDownIcon(style, upperLabelRect, thisLayout) {\n        var text = style ? style.text : null;\n        if (!upperLabelRect && thisLayout.isLeafRoot && text != null) {\n          var iconChar = seriesModel.get('drillDownIcon', true);\n          style.text = iconChar ? iconChar + ' ' + text : text;\n        }\n      }\n      function giveGraphic(storageName, Ctor, depth, z) {\n        var element = oldRawIndex != null && oldStorage[storageName][oldRawIndex];\n        var lasts = lastsForAnimation[storageName];\n        if (element) {\n          // Remove from oldStorage\n          oldStorage[storageName][oldRawIndex] = null;\n          prepareAnimationWhenHasOld(lasts, element);\n        }\n        // If invisible and no old element, do not create new element (for optimizing).\n        else if (!thisInvisible) {\n          element = new Ctor();\n          if (element instanceof Displayable) {\n            element.z2 = calculateZ2(depth, z);\n          }\n          prepareAnimationWhenNoOld(lasts, element);\n        }\n        // Set to thisStorage\n        return thisStorage[storageName][thisRawIndex] = element;\n      }\n      function prepareAnimationWhenHasOld(lasts, element) {\n        var lastCfg = lasts[thisRawIndex] = {};\n        if (element instanceof Group$1) {\n          lastCfg.oldX = element.x;\n          lastCfg.oldY = element.y;\n        } else {\n          lastCfg.oldShape = extend({}, element.shape);\n        }\n      }\n      // If a element is new, we need to find the animation start point carefully,\n      // otherwise it will looks strange when 'zoomToNode'.\n      function prepareAnimationWhenNoOld(lasts, element) {\n        var lastCfg = lasts[thisRawIndex] = {};\n        var parentNode = thisNode.parentNode;\n        var isGroup = element instanceof Group;\n        if (parentNode && (!reRoot || reRoot.direction === 'drillDown')) {\n          var parentOldX = 0;\n          var parentOldY = 0;\n          // New nodes appear from right-bottom corner in 'zoomToNode' animation.\n          // For convenience, get old bounding rect from background.\n          var parentOldBg = lastsForAnimation.background[parentNode.getRawIndex()];\n          if (!reRoot && parentOldBg && parentOldBg.oldShape) {\n            parentOldX = parentOldBg.oldShape.width;\n            parentOldY = parentOldBg.oldShape.height;\n          }\n          // When no parent old shape found, its parent is new too,\n          // so we can just use {x:0, y:0}.\n          if (isGroup) {\n            lastCfg.oldX = 0;\n            lastCfg.oldY = parentOldY;\n          } else {\n            lastCfg.oldShape = {\n              x: parentOldX,\n              y: parentOldY,\n              width: 0,\n              height: 0\n            };\n          }\n        }\n        // Fade in, user can be aware that these nodes are new.\n        lastCfg.fadein = !isGroup;\n      }\n    }\n    // We cannot set all background with the same z, because the behaviour of\n    // drill down and roll up differ background creation sequence from tree\n    // hierarchy sequence, which cause lower background elements to overlap\n    // upper ones. So we calculate z based on depth.\n    // Moreover, we try to shrink down z interval to [0, 1] to avoid that\n    // treemap with large z overlaps other components.\n    function calculateZ2(depth, z2InLevel) {\n      return depth * Z2_BASE + z2InLevel;\n    }\n\n    var each$3 = each;\n    var isObject$3 = isObject;\n    var CATEGORY_DEFAULT_VISUAL_INDEX = -1;\n    var VisualMapping = /** @class */function () {\n      function VisualMapping(option) {\n        var mappingMethod = option.mappingMethod;\n        var visualType = option.type;\n        var thisOption = this.option = clone(option);\n        this.type = visualType;\n        this.mappingMethod = mappingMethod;\n        this._normalizeData = normalizers[mappingMethod];\n        var visualHandler = VisualMapping.visualHandlers[visualType];\n        this.applyVisual = visualHandler.applyVisual;\n        this.getColorMapper = visualHandler.getColorMapper;\n        this._normalizedToVisual = visualHandler._normalizedToVisual[mappingMethod];\n        if (mappingMethod === 'piecewise') {\n          normalizeVisualRange(thisOption);\n          preprocessForPiecewise(thisOption);\n        } else if (mappingMethod === 'category') {\n          thisOption.categories ? preprocessForSpecifiedCategory(thisOption)\n          // categories is ordinal when thisOption.categories not specified,\n          // which need no more preprocess except normalize visual.\n          : normalizeVisualRange(thisOption, true);\n        } else {\n          // mappingMethod === 'linear' or 'fixed'\n          assert(mappingMethod !== 'linear' || thisOption.dataExtent);\n          normalizeVisualRange(thisOption);\n        }\n      }\n      VisualMapping.prototype.mapValueToVisual = function (value) {\n        var normalized = this._normalizeData(value);\n        return this._normalizedToVisual(normalized, value);\n      };\n      VisualMapping.prototype.getNormalizer = function () {\n        return bind(this._normalizeData, this);\n      };\n      /**\r\n       * List available visual types.\r\n       *\r\n       * @public\r\n       * @return {Array.<string>}\r\n       */\n      VisualMapping.listVisualTypes = function () {\n        return keys(VisualMapping.visualHandlers);\n      };\n      // /**\n      //  * @public\n      //  */\n      // static addVisualHandler(name, handler) {\n      //     visualHandlers[name] = handler;\n      // }\n      /**\r\n       * @public\r\n       */\n      VisualMapping.isValidType = function (visualType) {\n        return VisualMapping.visualHandlers.hasOwnProperty(visualType);\n      };\n      /**\r\n       * Convenient method.\r\n       * Visual can be Object or Array or primary type.\r\n       */\n      VisualMapping.eachVisual = function (visual, callback, context) {\n        if (isObject(visual)) {\n          each(visual, callback, context);\n        } else {\n          callback.call(context, visual);\n        }\n      };\n      VisualMapping.mapVisual = function (visual, callback, context) {\n        var isPrimary;\n        var newVisual = isArray(visual) ? [] : isObject(visual) ? {} : (isPrimary = true, null);\n        VisualMapping.eachVisual(visual, function (v, key) {\n          var newVal = callback.call(context, v, key);\n          isPrimary ? newVisual = newVal : newVisual[key] = newVal;\n        });\n        return newVisual;\n      };\n      /**\r\n       * Retrieve visual properties from given object.\r\n       */\n      VisualMapping.retrieveVisuals = function (obj) {\n        var ret = {};\n        var hasVisual;\n        obj && each$3(VisualMapping.visualHandlers, function (h, visualType) {\n          if (obj.hasOwnProperty(visualType)) {\n            ret[visualType] = obj[visualType];\n            hasVisual = true;\n          }\n        });\n        return hasVisual ? ret : null;\n      };\n      /**\r\n       * Give order to visual types, considering colorSaturation, colorAlpha depends on color.\r\n       *\r\n       * @public\r\n       * @param {(Object|Array)} visualTypes If Object, like: {color: ..., colorSaturation: ...}\r\n       *                                     IF Array, like: ['color', 'symbol', 'colorSaturation']\r\n       * @return {Array.<string>} Sorted visual types.\r\n       */\n      VisualMapping.prepareVisualTypes = function (visualTypes) {\n        if (isArray(visualTypes)) {\n          visualTypes = visualTypes.slice();\n        } else if (isObject$3(visualTypes)) {\n          var types_1 = [];\n          each$3(visualTypes, function (item, type) {\n            types_1.push(type);\n          });\n          visualTypes = types_1;\n        } else {\n          return [];\n        }\n        visualTypes.sort(function (type1, type2) {\n          // color should be front of colorSaturation, colorAlpha, ...\n          // symbol and symbolSize do not matter.\n          return type2 === 'color' && type1 !== 'color' && type1.indexOf('color') === 0 ? 1 : -1;\n        });\n        return visualTypes;\n      };\n      /**\r\n       * 'color', 'colorSaturation', 'colorAlpha', ... are depends on 'color'.\r\n       * Other visuals are only depends on themself.\r\n       */\n      VisualMapping.dependsOn = function (visualType1, visualType2) {\n        return visualType2 === 'color' ? !!(visualType1 && visualType1.indexOf(visualType2) === 0) : visualType1 === visualType2;\n      };\n      /**\r\n       * @param value\r\n       * @param pieceList [{value: ..., interval: [min, max]}, ...]\r\n       *                         Always from small to big.\r\n       * @param findClosestWhenOutside Default to be false\r\n       * @return index\r\n       */\n      VisualMapping.findPieceIndex = function (value, pieceList, findClosestWhenOutside) {\n        var possibleI;\n        var abs = Infinity;\n        // value has the higher priority.\n        for (var i = 0, len = pieceList.length; i < len; i++) {\n          var pieceValue = pieceList[i].value;\n          if (pieceValue != null) {\n            if (pieceValue === value\n            // FIXME\n            // It is supposed to compare value according to value type of dimension,\n            // but currently value type can exactly be string or number.\n            // Compromise for numeric-like string (like '12'), especially\n            // in the case that visualMap.categories is ['22', '33'].\n            || isString(pieceValue) && pieceValue === value + '') {\n              return i;\n            }\n            findClosestWhenOutside && updatePossible(pieceValue, i);\n          }\n        }\n        for (var i = 0, len = pieceList.length; i < len; i++) {\n          var piece = pieceList[i];\n          var interval = piece.interval;\n          var close_1 = piece.close;\n          if (interval) {\n            if (interval[0] === -Infinity) {\n              if (littleThan(close_1[1], value, interval[1])) {\n                return i;\n              }\n            } else if (interval[1] === Infinity) {\n              if (littleThan(close_1[0], interval[0], value)) {\n                return i;\n              }\n            } else if (littleThan(close_1[0], interval[0], value) && littleThan(close_1[1], value, interval[1])) {\n              return i;\n            }\n            findClosestWhenOutside && updatePossible(interval[0], i);\n            findClosestWhenOutside && updatePossible(interval[1], i);\n          }\n        }\n        if (findClosestWhenOutside) {\n          return value === Infinity ? pieceList.length - 1 : value === -Infinity ? 0 : possibleI;\n        }\n        function updatePossible(val, index) {\n          var newAbs = Math.abs(val - value);\n          if (newAbs < abs) {\n            abs = newAbs;\n            possibleI = index;\n          }\n        }\n      };\n      VisualMapping.visualHandlers = {\n        color: {\n          applyVisual: makeApplyVisual('color'),\n          getColorMapper: function () {\n            var thisOption = this.option;\n            return bind(thisOption.mappingMethod === 'category' ? function (value, isNormalized) {\n              !isNormalized && (value = this._normalizeData(value));\n              return doMapCategory.call(this, value);\n            } : function (value, isNormalized, out) {\n              // If output rgb array\n              // which will be much faster and useful in pixel manipulation\n              var returnRGBArray = !!out;\n              !isNormalized && (value = this._normalizeData(value));\n              out = fastLerp(value, thisOption.parsedVisual, out);\n              return returnRGBArray ? out : stringify(out, 'rgba');\n            }, this);\n          },\n          _normalizedToVisual: {\n            linear: function (normalized) {\n              return stringify(fastLerp(normalized, this.option.parsedVisual), 'rgba');\n            },\n            category: doMapCategory,\n            piecewise: function (normalized, value) {\n              var result = getSpecifiedVisual.call(this, value);\n              if (result == null) {\n                result = stringify(fastLerp(normalized, this.option.parsedVisual), 'rgba');\n              }\n              return result;\n            },\n            fixed: doMapFixed\n          }\n        },\n        colorHue: makePartialColorVisualHandler(function (color$1, value) {\n          return modifyHSL(color$1, value);\n        }),\n        colorSaturation: makePartialColorVisualHandler(function (color$1, value) {\n          return modifyHSL(color$1, null, value);\n        }),\n        colorLightness: makePartialColorVisualHandler(function (color$1, value) {\n          return modifyHSL(color$1, null, null, value);\n        }),\n        colorAlpha: makePartialColorVisualHandler(function (color$1, value) {\n          return modifyAlpha(color$1, value);\n        }),\n        decal: {\n          applyVisual: makeApplyVisual('decal'),\n          _normalizedToVisual: {\n            linear: null,\n            category: doMapCategory,\n            piecewise: null,\n            fixed: null\n          }\n        },\n        opacity: {\n          applyVisual: makeApplyVisual('opacity'),\n          _normalizedToVisual: createNormalizedToNumericVisual([0, 1])\n        },\n        liftZ: {\n          applyVisual: makeApplyVisual('liftZ'),\n          _normalizedToVisual: {\n            linear: doMapFixed,\n            category: doMapFixed,\n            piecewise: doMapFixed,\n            fixed: doMapFixed\n          }\n        },\n        symbol: {\n          applyVisual: function (value, getter, setter) {\n            var symbolCfg = this.mapValueToVisual(value);\n            setter('symbol', symbolCfg);\n          },\n          _normalizedToVisual: {\n            linear: doMapToArray,\n            category: doMapCategory,\n            piecewise: function (normalized, value) {\n              var result = getSpecifiedVisual.call(this, value);\n              if (result == null) {\n                result = doMapToArray.call(this, normalized);\n              }\n              return result;\n            },\n            fixed: doMapFixed\n          }\n        },\n        symbolSize: {\n          applyVisual: makeApplyVisual('symbolSize'),\n          _normalizedToVisual: createNormalizedToNumericVisual([0, 1])\n        }\n      };\n      return VisualMapping;\n    }();\n    function preprocessForPiecewise(thisOption) {\n      var pieceList = thisOption.pieceList;\n      thisOption.hasSpecialVisual = false;\n      each(pieceList, function (piece, index) {\n        piece.originIndex = index;\n        // piece.visual is \"result visual value\" but not\n        // a visual range, so it does not need to be normalized.\n        if (piece.visual != null) {\n          thisOption.hasSpecialVisual = true;\n        }\n      });\n    }\n    function preprocessForSpecifiedCategory(thisOption) {\n      // Hash categories.\n      var categories = thisOption.categories;\n      var categoryMap = thisOption.categoryMap = {};\n      var visual = thisOption.visual;\n      each$3(categories, function (cate, index) {\n        categoryMap[cate] = index;\n      });\n      // Process visual map input.\n      if (!isArray(visual)) {\n        var visualArr_1 = [];\n        if (isObject(visual)) {\n          each$3(visual, function (v, cate) {\n            var index = categoryMap[cate];\n            visualArr_1[index != null ? index : CATEGORY_DEFAULT_VISUAL_INDEX] = v;\n          });\n        } else {\n          // Is primary type, represents default visual.\n          visualArr_1[CATEGORY_DEFAULT_VISUAL_INDEX] = visual;\n        }\n        visual = setVisualToOption(thisOption, visualArr_1);\n      }\n      // Remove categories that has no visual,\n      // then we can mapping them to CATEGORY_DEFAULT_VISUAL_INDEX.\n      for (var i = categories.length - 1; i >= 0; i--) {\n        if (visual[i] == null) {\n          delete categoryMap[categories[i]];\n          categories.pop();\n        }\n      }\n    }\n    function normalizeVisualRange(thisOption, isCategory) {\n      var visual = thisOption.visual;\n      var visualArr = [];\n      if (isObject(visual)) {\n        each$3(visual, function (v) {\n          visualArr.push(v);\n        });\n      } else if (visual != null) {\n        visualArr.push(visual);\n      }\n      var doNotNeedPair = {\n        color: 1,\n        symbol: 1\n      };\n      if (!isCategory && visualArr.length === 1 && !doNotNeedPair.hasOwnProperty(thisOption.type)) {\n        // Do not care visualArr.length === 0, which is illegal.\n        visualArr[1] = visualArr[0];\n      }\n      setVisualToOption(thisOption, visualArr);\n    }\n    function makePartialColorVisualHandler(applyValue) {\n      return {\n        applyVisual: function (value, getter, setter) {\n          // Only used in HSL\n          var colorChannel = this.mapValueToVisual(value);\n          // Must not be array value\n          setter('color', applyValue(getter('color'), colorChannel));\n        },\n        _normalizedToVisual: createNormalizedToNumericVisual([0, 1])\n      };\n    }\n    function doMapToArray(normalized) {\n      var visual = this.option.visual;\n      return visual[Math.round(linearMap(normalized, [0, 1], [0, visual.length - 1], true))] || {}; // TODO {}?\n    }\n    function makeApplyVisual(visualType) {\n      return function (value, getter, setter) {\n        setter(visualType, this.mapValueToVisual(value));\n      };\n    }\n    function doMapCategory(normalized) {\n      var visual = this.option.visual;\n      return visual[this.option.loop && normalized !== CATEGORY_DEFAULT_VISUAL_INDEX ? normalized % visual.length : normalized];\n    }\n    function doMapFixed() {\n      // visual will be convert to array.\n      return this.option.visual[0];\n    }\n    /**\r\n     * Create mapped to numeric visual\r\n     */\n    function createNormalizedToNumericVisual(sourceExtent) {\n      return {\n        linear: function (normalized) {\n          return linearMap(normalized, sourceExtent, this.option.visual, true);\n        },\n        category: doMapCategory,\n        piecewise: function (normalized, value) {\n          var result = getSpecifiedVisual.call(this, value);\n          if (result == null) {\n            result = linearMap(normalized, sourceExtent, this.option.visual, true);\n          }\n          return result;\n        },\n        fixed: doMapFixed\n      };\n    }\n    function getSpecifiedVisual(value) {\n      var thisOption = this.option;\n      var pieceList = thisOption.pieceList;\n      if (thisOption.hasSpecialVisual) {\n        var pieceIndex = VisualMapping.findPieceIndex(value, pieceList);\n        var piece = pieceList[pieceIndex];\n        if (piece && piece.visual) {\n          return piece.visual[this.type];\n        }\n      }\n    }\n    function setVisualToOption(thisOption, visualArr) {\n      thisOption.visual = visualArr;\n      if (thisOption.type === 'color') {\n        thisOption.parsedVisual = map(visualArr, function (item) {\n          var color$1 = parse(item);\n          if (!color$1 && \"development\" !== 'production') {\n            warn(\"'\" + item + \"' is an illegal color, fallback to '#000000'\", true);\n          }\n          return color$1 || [0, 0, 0, 1];\n        });\n      }\n      return visualArr;\n    }\n    /**\r\n     * Normalizers by mapping methods.\r\n     */\n    var normalizers = {\n      linear: function (value) {\n        return linearMap(value, this.option.dataExtent, [0, 1], true);\n      },\n      piecewise: function (value) {\n        var pieceList = this.option.pieceList;\n        var pieceIndex = VisualMapping.findPieceIndex(value, pieceList, true);\n        if (pieceIndex != null) {\n          return linearMap(pieceIndex, [0, pieceList.length - 1], [0, 1], true);\n        }\n      },\n      category: function (value) {\n        var index = this.option.categories ? this.option.categoryMap[value] : value; // ordinal value\n        return index == null ? CATEGORY_DEFAULT_VISUAL_INDEX : index;\n      },\n      fixed: noop\n    };\n    function littleThan(close, a, b) {\n      return close ? a <= b : a < b;\n    }\n\n    var ITEM_STYLE_NORMAL = 'itemStyle';\n    var inner$9 = makeInner();\n    var treemapVisual = {\n      seriesType: 'treemap',\n      reset: function (seriesModel) {\n        var tree = seriesModel.getData().tree;\n        var root = tree.root;\n        if (root.isRemoved()) {\n          return;\n        }\n        travelTree(root,\n        // Visual should calculate from tree root but not view root.\n        {}, seriesModel.getViewRoot().getAncestors(), seriesModel);\n      }\n    };\n    function travelTree(node, designatedVisual, viewRootAncestors, seriesModel) {\n      var nodeModel = node.getModel();\n      var nodeLayout = node.getLayout();\n      var data = node.hostTree.data;\n      // Optimize\n      if (!nodeLayout || nodeLayout.invisible || !nodeLayout.isInView) {\n        return;\n      }\n      var nodeItemStyleModel = nodeModel.getModel(ITEM_STYLE_NORMAL);\n      var visuals = buildVisuals(nodeItemStyleModel, designatedVisual, seriesModel);\n      var existsStyle = data.ensureUniqueItemVisual(node.dataIndex, 'style');\n      // calculate border color\n      var borderColor = nodeItemStyleModel.get('borderColor');\n      var borderColorSaturation = nodeItemStyleModel.get('borderColorSaturation');\n      var thisNodeColor;\n      if (borderColorSaturation != null) {\n        // For performance, do not always execute 'calculateColor'.\n        thisNodeColor = calculateColor(visuals);\n        borderColor = calculateBorderColor(borderColorSaturation, thisNodeColor);\n      }\n      existsStyle.stroke = borderColor;\n      var viewChildren = node.viewChildren;\n      if (!viewChildren || !viewChildren.length) {\n        thisNodeColor = calculateColor(visuals);\n        // Apply visual to this node.\n        existsStyle.fill = thisNodeColor;\n      } else {\n        var mapping_1 = buildVisualMapping(node, nodeModel, nodeLayout, nodeItemStyleModel, visuals, viewChildren);\n        // Designate visual to children.\n        each(viewChildren, function (child, index) {\n          // If higher than viewRoot, only ancestors of viewRoot is needed to visit.\n          if (child.depth >= viewRootAncestors.length || child === viewRootAncestors[child.depth]) {\n            var childVisual = mapVisual(nodeModel, visuals, child, index, mapping_1, seriesModel);\n            travelTree(child, childVisual, viewRootAncestors, seriesModel);\n          }\n        });\n      }\n    }\n    function buildVisuals(nodeItemStyleModel, designatedVisual, seriesModel) {\n      var visuals = extend({}, designatedVisual);\n      var designatedVisualItemStyle = seriesModel.designatedVisualItemStyle;\n      each(['color', 'colorAlpha', 'colorSaturation'], function (visualName) {\n        // Priority: thisNode > thisLevel > parentNodeDesignated > seriesModel\n        designatedVisualItemStyle[visualName] = designatedVisual[visualName];\n        var val = nodeItemStyleModel.get(visualName);\n        designatedVisualItemStyle[visualName] = null;\n        val != null && (visuals[visualName] = val);\n      });\n      return visuals;\n    }\n    function calculateColor(visuals) {\n      var color = getValueVisualDefine(visuals, 'color');\n      if (color) {\n        var colorAlpha = getValueVisualDefine(visuals, 'colorAlpha');\n        var colorSaturation = getValueVisualDefine(visuals, 'colorSaturation');\n        if (colorSaturation) {\n          color = modifyHSL(color, null, null, colorSaturation);\n        }\n        if (colorAlpha) {\n          color = modifyAlpha(color, colorAlpha);\n        }\n        return color;\n      }\n    }\n    function calculateBorderColor(borderColorSaturation, thisNodeColor) {\n      return thisNodeColor != null\n      // Can only be string\n      ? modifyHSL(thisNodeColor, null, null, borderColorSaturation) : null;\n    }\n    function getValueVisualDefine(visuals, name) {\n      var value = visuals[name];\n      if (value != null && value !== 'none') {\n        return value;\n      }\n    }\n    function buildVisualMapping(node, nodeModel, nodeLayout, nodeItemStyleModel, visuals, viewChildren) {\n      if (!viewChildren || !viewChildren.length) {\n        return;\n      }\n      var rangeVisual = getRangeVisual(nodeModel, 'color') || visuals.color != null && visuals.color !== 'none' && (getRangeVisual(nodeModel, 'colorAlpha') || getRangeVisual(nodeModel, 'colorSaturation'));\n      if (!rangeVisual) {\n        return;\n      }\n      var visualMin = nodeModel.get('visualMin');\n      var visualMax = nodeModel.get('visualMax');\n      var dataExtent = nodeLayout.dataExtent.slice();\n      visualMin != null && visualMin < dataExtent[0] && (dataExtent[0] = visualMin);\n      visualMax != null && visualMax > dataExtent[1] && (dataExtent[1] = visualMax);\n      var colorMappingBy = nodeModel.get('colorMappingBy');\n      var opt = {\n        type: rangeVisual.name,\n        dataExtent: dataExtent,\n        visual: rangeVisual.range\n      };\n      if (opt.type === 'color' && (colorMappingBy === 'index' || colorMappingBy === 'id')) {\n        opt.mappingMethod = 'category';\n        opt.loop = true;\n        // categories is ordinal, so do not set opt.categories.\n      } else {\n        opt.mappingMethod = 'linear';\n      }\n      var mapping = new VisualMapping(opt);\n      inner$9(mapping).drColorMappingBy = colorMappingBy;\n      return mapping;\n    }\n    // Notice: If we don't have the attribute 'colorRange', but only use\n    // attribute 'color' to represent both concepts of 'colorRange' and 'color',\n    // (It means 'colorRange' when 'color' is Array, means 'color' when not array),\n    // this problem will be encountered:\n    // If a level-1 node doesn't have children, and its siblings have children,\n    // and colorRange is set on level-1, then the node cannot be colored.\n    // So we separate 'colorRange' and 'color' to different attributes.\n    function getRangeVisual(nodeModel, name) {\n      // 'colorRange', 'colorARange', 'colorSRange'.\n      // If not exists on this node, fetch from levels and series.\n      var range = nodeModel.get(name);\n      return isArray(range) && range.length ? {\n        name: name,\n        range: range\n      } : null;\n    }\n    function mapVisual(nodeModel, visuals, child, index, mapping, seriesModel) {\n      var childVisuals = extend({}, visuals);\n      if (mapping) {\n        // Only support color, colorAlpha, colorSaturation.\n        var mappingType = mapping.type;\n        var colorMappingBy = mappingType === 'color' && inner$9(mapping).drColorMappingBy;\n        var value = colorMappingBy === 'index' ? index : colorMappingBy === 'id' ? seriesModel.mapIdToIndex(child.getId()) : child.getValue(nodeModel.get('visualDimension'));\n        childVisuals[mappingType] = mapping.mapValueToVisual(value);\n      }\n      return childVisuals;\n    }\n\n    var mathMax$7 = Math.max;\n    var mathMin$7 = Math.min;\n    var retrieveValue = retrieve;\n    var each$4 = each;\n    var PATH_BORDER_WIDTH = ['itemStyle', 'borderWidth'];\n    var PATH_GAP_WIDTH = ['itemStyle', 'gapWidth'];\n    var PATH_UPPER_LABEL_SHOW = ['upperLabel', 'show'];\n    var PATH_UPPER_LABEL_HEIGHT = ['upperLabel', 'height'];\n    /**\r\n     * @public\r\n     */\n    var treemapLayout = {\n      seriesType: 'treemap',\n      reset: function (seriesModel, ecModel, api, payload) {\n        // Layout result in each node:\n        // {x, y, width, height, area, borderWidth}\n        var ecWidth = api.getWidth();\n        var ecHeight = api.getHeight();\n        var seriesOption = seriesModel.option;\n        var layoutInfo = getLayoutRect(seriesModel.getBoxLayoutParams(), {\n          width: api.getWidth(),\n          height: api.getHeight()\n        });\n        var size = seriesOption.size || []; // Compatible with ec2.\n        var containerWidth = parsePercent$1(retrieveValue(layoutInfo.width, size[0]), ecWidth);\n        var containerHeight = parsePercent$1(retrieveValue(layoutInfo.height, size[1]), ecHeight);\n        // Fetch payload info.\n        var payloadType = payload && payload.type;\n        var types = ['treemapZoomToNode', 'treemapRootToNode'];\n        var targetInfo = retrieveTargetInfo(payload, types, seriesModel);\n        var rootRect = payloadType === 'treemapRender' || payloadType === 'treemapMove' ? payload.rootRect : null;\n        var viewRoot = seriesModel.getViewRoot();\n        var viewAbovePath = getPathToRoot(viewRoot);\n        if (payloadType !== 'treemapMove') {\n          var rootSize = payloadType === 'treemapZoomToNode' ? estimateRootSize(seriesModel, targetInfo, viewRoot, containerWidth, containerHeight) : rootRect ? [rootRect.width, rootRect.height] : [containerWidth, containerHeight];\n          var sort_1 = seriesOption.sort;\n          if (sort_1 && sort_1 !== 'asc' && sort_1 !== 'desc') {\n            // Default to be desc order.\n            sort_1 = 'desc';\n          }\n          var options = {\n            squareRatio: seriesOption.squareRatio,\n            sort: sort_1,\n            leafDepth: seriesOption.leafDepth\n          };\n          // layout should be cleared because using updateView but not update.\n          viewRoot.hostTree.clearLayouts();\n          // TODO\n          // optimize: if out of view clip, do not layout.\n          // But take care that if do not render node out of view clip,\n          // how to calculate start po\n          var viewRootLayout_1 = {\n            x: 0,\n            y: 0,\n            width: rootSize[0],\n            height: rootSize[1],\n            area: rootSize[0] * rootSize[1]\n          };\n          viewRoot.setLayout(viewRootLayout_1);\n          squarify(viewRoot, options, false, 0);\n          // Supplement layout.\n          viewRootLayout_1 = viewRoot.getLayout();\n          each$4(viewAbovePath, function (node, index) {\n            var childValue = (viewAbovePath[index + 1] || viewRoot).getValue();\n            node.setLayout(extend({\n              dataExtent: [childValue, childValue],\n              borderWidth: 0,\n              upperHeight: 0\n            }, viewRootLayout_1));\n          });\n        }\n        var treeRoot = seriesModel.getData().tree.root;\n        treeRoot.setLayout(calculateRootPosition(layoutInfo, rootRect, targetInfo), true);\n        seriesModel.setLayoutInfo(layoutInfo);\n        // FIXME\n        // 现在没有clip功能，暂时取ec高宽。\n        prunning(treeRoot,\n        // Transform to base element coordinate system.\n        new BoundingRect(-layoutInfo.x, -layoutInfo.y, ecWidth, ecHeight), viewAbovePath, viewRoot, 0);\n      }\n    };\n    /**\r\n     * Layout treemap with squarify algorithm.\r\n     * The original presentation of this algorithm\r\n     * was made by Mark Bruls, Kees Huizing, and Jarke J. van Wijk\r\n     * <https://graphics.ethz.ch/teaching/scivis_common/Literature/squarifiedTreeMaps.pdf>.\r\n     * The implementation of this algorithm was originally copied from \"d3.js\"\r\n     * <https://github.com/d3/d3/blob/9cc9a875e636a1dcf36cc1e07bdf77e1ad6e2c74/src/layout/treemap.js>\r\n     * with some modifications made for this program.\r\n     * See the license statement at the head of this file.\r\n     *\r\n     * @protected\r\n     * @param {module:echarts/data/Tree~TreeNode} node\r\n     * @param {Object} options\r\n     * @param {string} options.sort 'asc' or 'desc'\r\n     * @param {number} options.squareRatio\r\n     * @param {boolean} hideChildren\r\n     * @param {number} depth\r\n     */\n    function squarify(node, options, hideChildren, depth) {\n      var width;\n      var height;\n      if (node.isRemoved()) {\n        return;\n      }\n      var thisLayout = node.getLayout();\n      width = thisLayout.width;\n      height = thisLayout.height;\n      // Considering border and gap\n      var nodeModel = node.getModel();\n      var borderWidth = nodeModel.get(PATH_BORDER_WIDTH);\n      var halfGapWidth = nodeModel.get(PATH_GAP_WIDTH) / 2;\n      var upperLabelHeight = getUpperLabelHeight(nodeModel);\n      var upperHeight = Math.max(borderWidth, upperLabelHeight);\n      var layoutOffset = borderWidth - halfGapWidth;\n      var layoutOffsetUpper = upperHeight - halfGapWidth;\n      node.setLayout({\n        borderWidth: borderWidth,\n        upperHeight: upperHeight,\n        upperLabelHeight: upperLabelHeight\n      }, true);\n      width = mathMax$7(width - 2 * layoutOffset, 0);\n      height = mathMax$7(height - layoutOffset - layoutOffsetUpper, 0);\n      var totalArea = width * height;\n      var viewChildren = initChildren(node, nodeModel, totalArea, options, hideChildren, depth);\n      if (!viewChildren.length) {\n        return;\n      }\n      var rect = {\n        x: layoutOffset,\n        y: layoutOffsetUpper,\n        width: width,\n        height: height\n      };\n      var rowFixedLength = mathMin$7(width, height);\n      var best = Infinity; // the best row score so far\n      var row = [];\n      row.area = 0;\n      for (var i = 0, len = viewChildren.length; i < len;) {\n        var child = viewChildren[i];\n        row.push(child);\n        row.area += child.getLayout().area;\n        var score = worst(row, rowFixedLength, options.squareRatio);\n        // continue with this orientation\n        if (score <= best) {\n          i++;\n          best = score;\n        }\n        // abort, and try a different orientation\n        else {\n          row.area -= row.pop().getLayout().area;\n          position(row, rowFixedLength, rect, halfGapWidth, false);\n          rowFixedLength = mathMin$7(rect.width, rect.height);\n          row.length = row.area = 0;\n          best = Infinity;\n        }\n      }\n      if (row.length) {\n        position(row, rowFixedLength, rect, halfGapWidth, true);\n      }\n      if (!hideChildren) {\n        var childrenVisibleMin = nodeModel.get('childrenVisibleMin');\n        if (childrenVisibleMin != null && totalArea < childrenVisibleMin) {\n          hideChildren = true;\n        }\n      }\n      for (var i = 0, len = viewChildren.length; i < len; i++) {\n        squarify(viewChildren[i], options, hideChildren, depth + 1);\n      }\n    }\n    /**\r\n     * Set area to each child, and calculate data extent for visual coding.\r\n     */\n    function initChildren(node, nodeModel, totalArea, options, hideChildren, depth) {\n      var viewChildren = node.children || [];\n      var orderBy = options.sort;\n      orderBy !== 'asc' && orderBy !== 'desc' && (orderBy = null);\n      var overLeafDepth = options.leafDepth != null && options.leafDepth <= depth;\n      // leafDepth has higher priority.\n      if (hideChildren && !overLeafDepth) {\n        return node.viewChildren = [];\n      }\n      // Sort children, order by desc.\n      viewChildren = filter(viewChildren, function (child) {\n        return !child.isRemoved();\n      });\n      sort$1(viewChildren, orderBy);\n      var info = statistic(nodeModel, viewChildren, orderBy);\n      if (info.sum === 0) {\n        return node.viewChildren = [];\n      }\n      info.sum = filterByThreshold(nodeModel, totalArea, info.sum, orderBy, viewChildren);\n      if (info.sum === 0) {\n        return node.viewChildren = [];\n      }\n      // Set area to each child.\n      for (var i = 0, len = viewChildren.length; i < len; i++) {\n        var area = viewChildren[i].getValue() / info.sum * totalArea;\n        // Do not use setLayout({...}, true), because it is needed to clear last layout.\n        viewChildren[i].setLayout({\n          area: area\n        });\n      }\n      if (overLeafDepth) {\n        viewChildren.length && node.setLayout({\n          isLeafRoot: true\n        }, true);\n        viewChildren.length = 0;\n      }\n      node.viewChildren = viewChildren;\n      node.setLayout({\n        dataExtent: info.dataExtent\n      }, true);\n      return viewChildren;\n    }\n    /**\r\n     * Consider 'visibleMin'. Modify viewChildren and get new sum.\r\n     */\n    function filterByThreshold(nodeModel, totalArea, sum, orderBy, orderedChildren) {\n      // visibleMin is not supported yet when no option.sort.\n      if (!orderBy) {\n        return sum;\n      }\n      var visibleMin = nodeModel.get('visibleMin');\n      var len = orderedChildren.length;\n      var deletePoint = len;\n      // Always travel from little value to big value.\n      for (var i = len - 1; i >= 0; i--) {\n        var value = orderedChildren[orderBy === 'asc' ? len - i - 1 : i].getValue();\n        if (value / sum * totalArea < visibleMin) {\n          deletePoint = i;\n          sum -= value;\n        }\n      }\n      orderBy === 'asc' ? orderedChildren.splice(0, len - deletePoint) : orderedChildren.splice(deletePoint, len - deletePoint);\n      return sum;\n    }\n    /**\r\n     * Sort\r\n     */\n    function sort$1(viewChildren, orderBy) {\n      if (orderBy) {\n        viewChildren.sort(function (a, b) {\n          var diff = orderBy === 'asc' ? a.getValue() - b.getValue() : b.getValue() - a.getValue();\n          return diff === 0 ? orderBy === 'asc' ? a.dataIndex - b.dataIndex : b.dataIndex - a.dataIndex : diff;\n        });\n      }\n      return viewChildren;\n    }\n    /**\r\n     * Statistic\r\n     */\n    function statistic(nodeModel, children, orderBy) {\n      // Calculate sum.\n      var sum = 0;\n      for (var i = 0, len = children.length; i < len; i++) {\n        sum += children[i].getValue();\n      }\n      // Statistic data extent for latter visual coding.\n      // Notice: data extent should be calculate based on raw children\n      // but not filtered view children, otherwise visual mapping will not\n      // be stable when zoom (where children is filtered by visibleMin).\n      var dimension = nodeModel.get('visualDimension');\n      var dataExtent;\n      // The same as area dimension.\n      if (!children || !children.length) {\n        dataExtent = [NaN, NaN];\n      } else if (dimension === 'value' && orderBy) {\n        dataExtent = [children[children.length - 1].getValue(), children[0].getValue()];\n        orderBy === 'asc' && dataExtent.reverse();\n      }\n      // Other dimension.\n      else {\n        dataExtent = [Infinity, -Infinity];\n        each$4(children, function (child) {\n          var value = child.getValue(dimension);\n          value < dataExtent[0] && (dataExtent[0] = value);\n          value > dataExtent[1] && (dataExtent[1] = value);\n        });\n      }\n      return {\n        sum: sum,\n        dataExtent: dataExtent\n      };\n    }\n    /**\r\n     * Computes the score for the specified row,\r\n     * as the worst aspect ratio.\r\n     */\n    function worst(row, rowFixedLength, ratio) {\n      var areaMax = 0;\n      var areaMin = Infinity;\n      for (var i = 0, area = void 0, len = row.length; i < len; i++) {\n        area = row[i].getLayout().area;\n        if (area) {\n          area < areaMin && (areaMin = area);\n          area > areaMax && (areaMax = area);\n        }\n      }\n      var squareArea = row.area * row.area;\n      var f = rowFixedLength * rowFixedLength * ratio;\n      return squareArea ? mathMax$7(f * areaMax / squareArea, squareArea / (f * areaMin)) : Infinity;\n    }\n    /**\r\n     * Positions the specified row of nodes. Modifies `rect`.\r\n     */\n    function position(row, rowFixedLength, rect, halfGapWidth, flush) {\n      // When rowFixedLength === rect.width,\n      // it is horizontal subdivision,\n      // rowFixedLength is the width of the subdivision,\n      // rowOtherLength is the height of the subdivision,\n      // and nodes will be positioned from left to right.\n      // wh[idx0WhenH] means: when horizontal,\n      //      wh[idx0WhenH] => wh[0] => 'width'.\n      //      xy[idx1WhenH] => xy[1] => 'y'.\n      var idx0WhenH = rowFixedLength === rect.width ? 0 : 1;\n      var idx1WhenH = 1 - idx0WhenH;\n      var xy = ['x', 'y'];\n      var wh = ['width', 'height'];\n      var last = rect[xy[idx0WhenH]];\n      var rowOtherLength = rowFixedLength ? row.area / rowFixedLength : 0;\n      if (flush || rowOtherLength > rect[wh[idx1WhenH]]) {\n        rowOtherLength = rect[wh[idx1WhenH]]; // over+underflow\n      }\n      for (var i = 0, rowLen = row.length; i < rowLen; i++) {\n        var node = row[i];\n        var nodeLayout = {};\n        var step = rowOtherLength ? node.getLayout().area / rowOtherLength : 0;\n        var wh1 = nodeLayout[wh[idx1WhenH]] = mathMax$7(rowOtherLength - 2 * halfGapWidth, 0);\n        // We use Math.max/min to avoid negative width/height when considering gap width.\n        var remain = rect[xy[idx0WhenH]] + rect[wh[idx0WhenH]] - last;\n        var modWH = i === rowLen - 1 || remain < step ? remain : step;\n        var wh0 = nodeLayout[wh[idx0WhenH]] = mathMax$7(modWH - 2 * halfGapWidth, 0);\n        nodeLayout[xy[idx1WhenH]] = rect[xy[idx1WhenH]] + mathMin$7(halfGapWidth, wh1 / 2);\n        nodeLayout[xy[idx0WhenH]] = last + mathMin$7(halfGapWidth, wh0 / 2);\n        last += modWH;\n        node.setLayout(nodeLayout, true);\n      }\n      rect[xy[idx1WhenH]] += rowOtherLength;\n      rect[wh[idx1WhenH]] -= rowOtherLength;\n    }\n    // Return [containerWidth, containerHeight] as default.\n    function estimateRootSize(seriesModel, targetInfo, viewRoot, containerWidth, containerHeight) {\n      // If targetInfo.node exists, we zoom to the node,\n      // so estimate whole width and height by target node.\n      var currNode = (targetInfo || {}).node;\n      var defaultSize = [containerWidth, containerHeight];\n      if (!currNode || currNode === viewRoot) {\n        return defaultSize;\n      }\n      var parent;\n      var viewArea = containerWidth * containerHeight;\n      var area = viewArea * seriesModel.option.zoomToNodeRatio;\n      while (parent = currNode.parentNode) {\n        // jshint ignore:line\n        var sum = 0;\n        var siblings = parent.children;\n        for (var i = 0, len = siblings.length; i < len; i++) {\n          sum += siblings[i].getValue();\n        }\n        var currNodeValue = currNode.getValue();\n        if (currNodeValue === 0) {\n          return defaultSize;\n        }\n        area *= sum / currNodeValue;\n        // Considering border, suppose aspect ratio is 1.\n        var parentModel = parent.getModel();\n        var borderWidth = parentModel.get(PATH_BORDER_WIDTH);\n        var upperHeight = Math.max(borderWidth, getUpperLabelHeight(parentModel));\n        area += 4 * borderWidth * borderWidth + (3 * borderWidth + upperHeight) * Math.pow(area, 0.5);\n        area > MAX_SAFE_INTEGER && (area = MAX_SAFE_INTEGER);\n        currNode = parent;\n      }\n      area < viewArea && (area = viewArea);\n      var scale = Math.pow(area / viewArea, 0.5);\n      return [containerWidth * scale, containerHeight * scale];\n    }\n    // Root position based on coord of containerGroup\n    function calculateRootPosition(layoutInfo, rootRect, targetInfo) {\n      if (rootRect) {\n        return {\n          x: rootRect.x,\n          y: rootRect.y\n        };\n      }\n      var defaultPosition = {\n        x: 0,\n        y: 0\n      };\n      if (!targetInfo) {\n        return defaultPosition;\n      }\n      // If targetInfo is fetched by 'retrieveTargetInfo',\n      // old tree and new tree are the same tree,\n      // so the node still exists and we can visit it.\n      var targetNode = targetInfo.node;\n      var layout = targetNode.getLayout();\n      if (!layout) {\n        return defaultPosition;\n      }\n      // Transform coord from local to container.\n      var targetCenter = [layout.width / 2, layout.height / 2];\n      var node = targetNode;\n      while (node) {\n        var nodeLayout = node.getLayout();\n        targetCenter[0] += nodeLayout.x;\n        targetCenter[1] += nodeLayout.y;\n        node = node.parentNode;\n      }\n      return {\n        x: layoutInfo.width / 2 - targetCenter[0],\n        y: layoutInfo.height / 2 - targetCenter[1]\n      };\n    }\n    // Mark nodes visible for prunning when visual coding and rendering.\n    // Prunning depends on layout and root position, so we have to do it after layout.\n    function prunning(node, clipRect, viewAbovePath, viewRoot, depth) {\n      var nodeLayout = node.getLayout();\n      var nodeInViewAbovePath = viewAbovePath[depth];\n      var isAboveViewRoot = nodeInViewAbovePath && nodeInViewAbovePath === node;\n      if (nodeInViewAbovePath && !isAboveViewRoot || depth === viewAbovePath.length && node !== viewRoot) {\n        return;\n      }\n      node.setLayout({\n        // isInView means: viewRoot sub tree + viewAbovePath\n        isInView: true,\n        // invisible only means: outside view clip so that the node can not\n        // see but still layout for animation preparation but not render.\n        invisible: !isAboveViewRoot && !clipRect.intersect(nodeLayout),\n        isAboveViewRoot: isAboveViewRoot\n      }, true);\n      // Transform to child coordinate.\n      var childClipRect = new BoundingRect(clipRect.x - nodeLayout.x, clipRect.y - nodeLayout.y, clipRect.width, clipRect.height);\n      each$4(node.viewChildren || [], function (child) {\n        prunning(child, childClipRect, viewAbovePath, viewRoot, depth + 1);\n      });\n    }\n    function getUpperLabelHeight(model) {\n      return model.get(PATH_UPPER_LABEL_SHOW) ? model.get(PATH_UPPER_LABEL_HEIGHT) : 0;\n    }\n\n    function install$c(registers) {\n      registers.registerSeriesModel(TreemapSeriesModel);\n      registers.registerChartView(TreemapView);\n      registers.registerVisual(treemapVisual);\n      registers.registerLayout(treemapLayout);\n      installTreemapAction(registers);\n    }\n\n    function categoryFilter(ecModel) {\n      var legendModels = ecModel.findComponents({\n        mainType: 'legend'\n      });\n      if (!legendModels || !legendModels.length) {\n        return;\n      }\n      ecModel.eachSeriesByType('graph', function (graphSeries) {\n        var categoriesData = graphSeries.getCategoriesData();\n        var graph = graphSeries.getGraph();\n        var data = graph.data;\n        var categoryNames = categoriesData.mapArray(categoriesData.getName);\n        data.filterSelf(function (idx) {\n          var model = data.getItemModel(idx);\n          var category = model.getShallow('category');\n          if (category != null) {\n            if (isNumber(category)) {\n              category = categoryNames[category];\n            }\n            // If in any legend component the status is not selected.\n            for (var i = 0; i < legendModels.length; i++) {\n              if (!legendModels[i].isSelected(category)) {\n                return false;\n              }\n            }\n          }\n          return true;\n        });\n      });\n    }\n\n    function categoryVisual(ecModel) {\n      var paletteScope = {};\n      ecModel.eachSeriesByType('graph', function (seriesModel) {\n        var categoriesData = seriesModel.getCategoriesData();\n        var data = seriesModel.getData();\n        var categoryNameIdxMap = {};\n        categoriesData.each(function (idx) {\n          var name = categoriesData.getName(idx);\n          // Add prefix to avoid conflict with Object.prototype.\n          categoryNameIdxMap['ec-' + name] = idx;\n          var itemModel = categoriesData.getItemModel(idx);\n          var style = itemModel.getModel('itemStyle').getItemStyle();\n          if (!style.fill) {\n            // Get color from palette.\n            style.fill = seriesModel.getColorFromPalette(name, paletteScope);\n          }\n          categoriesData.setItemVisual(idx, 'style', style);\n          var symbolVisualList = ['symbol', 'symbolSize', 'symbolKeepAspect'];\n          for (var i = 0; i < symbolVisualList.length; i++) {\n            var symbolVisual = itemModel.getShallow(symbolVisualList[i], true);\n            if (symbolVisual != null) {\n              categoriesData.setItemVisual(idx, symbolVisualList[i], symbolVisual);\n            }\n          }\n        });\n        // Assign category color to visual\n        if (categoriesData.count()) {\n          data.each(function (idx) {\n            var model = data.getItemModel(idx);\n            var categoryIdx = model.getShallow('category');\n            if (categoryIdx != null) {\n              if (isString(categoryIdx)) {\n                categoryIdx = categoryNameIdxMap['ec-' + categoryIdx];\n              }\n              var categoryStyle = categoriesData.getItemVisual(categoryIdx, 'style');\n              var style = data.ensureUniqueItemVisual(idx, 'style');\n              extend(style, categoryStyle);\n              var visualList = ['symbol', 'symbolSize', 'symbolKeepAspect'];\n              for (var i = 0; i < visualList.length; i++) {\n                data.setItemVisual(idx, visualList[i], categoriesData.getItemVisual(categoryIdx, visualList[i]));\n              }\n            }\n          });\n        }\n      });\n    }\n\n    function normalize$2(a) {\n      if (!(a instanceof Array)) {\n        a = [a, a];\n      }\n      return a;\n    }\n    function graphEdgeVisual(ecModel) {\n      ecModel.eachSeriesByType('graph', function (seriesModel) {\n        var graph = seriesModel.getGraph();\n        var edgeData = seriesModel.getEdgeData();\n        var symbolType = normalize$2(seriesModel.get('edgeSymbol'));\n        var symbolSize = normalize$2(seriesModel.get('edgeSymbolSize'));\n        // const colorQuery = ['lineStyle', 'color'] as const;\n        // const opacityQuery = ['lineStyle', 'opacity'] as const;\n        edgeData.setVisual('fromSymbol', symbolType && symbolType[0]);\n        edgeData.setVisual('toSymbol', symbolType && symbolType[1]);\n        edgeData.setVisual('fromSymbolSize', symbolSize && symbolSize[0]);\n        edgeData.setVisual('toSymbolSize', symbolSize && symbolSize[1]);\n        edgeData.setVisual('style', seriesModel.getModel('lineStyle').getLineStyle());\n        edgeData.each(function (idx) {\n          var itemModel = edgeData.getItemModel(idx);\n          var edge = graph.getEdgeByIndex(idx);\n          var symbolType = normalize$2(itemModel.getShallow('symbol', true));\n          var symbolSize = normalize$2(itemModel.getShallow('symbolSize', true));\n          // Edge visual must after node visual\n          var style = itemModel.getModel('lineStyle').getLineStyle();\n          var existsStyle = edgeData.ensureUniqueItemVisual(idx, 'style');\n          extend(existsStyle, style);\n          switch (existsStyle.stroke) {\n            case 'source':\n              {\n                var nodeStyle = edge.node1.getVisual('style');\n                existsStyle.stroke = nodeStyle && nodeStyle.fill;\n                break;\n              }\n            case 'target':\n              {\n                var nodeStyle = edge.node2.getVisual('style');\n                existsStyle.stroke = nodeStyle && nodeStyle.fill;\n                break;\n              }\n          }\n          symbolType[0] && edge.setVisual('fromSymbol', symbolType[0]);\n          symbolType[1] && edge.setVisual('toSymbol', symbolType[1]);\n          symbolSize[0] && edge.setVisual('fromSymbolSize', symbolSize[0]);\n          symbolSize[1] && edge.setVisual('toSymbolSize', symbolSize[1]);\n        });\n      });\n    }\n\n    var KEY_DELIMITER = '-->';\n    /**\r\n     * params handler\r\n     * @param {module:echarts/model/SeriesModel} seriesModel\r\n     * @returns {*}\r\n     */\n    var getAutoCurvenessParams = function (seriesModel) {\n      return seriesModel.get('autoCurveness') || null;\n    };\n    /**\r\n     * Generate a list of edge curvatures, 20 is the default\r\n     * @param {module:echarts/model/SeriesModel} seriesModel\r\n     * @param {number} appendLength\r\n     * @return  20 => [0, -0.2, 0.2, -0.4, 0.4, -0.6, 0.6, -0.8, 0.8, -1, 1, -1.2, 1.2, -1.4, 1.4, -1.6, 1.6, -1.8, 1.8, -2]\r\n     */\n    var createCurveness = function (seriesModel, appendLength) {\n      var autoCurvenessParmas = getAutoCurvenessParams(seriesModel);\n      var length = 20;\n      var curvenessList = [];\n      // handler the function set\n      if (isNumber(autoCurvenessParmas)) {\n        length = autoCurvenessParmas;\n      } else if (isArray(autoCurvenessParmas)) {\n        seriesModel.__curvenessList = autoCurvenessParmas;\n        return;\n      }\n      // append length\n      if (appendLength > length) {\n        length = appendLength;\n      }\n      // make sure the length is even\n      var len = length % 2 ? length + 2 : length + 3;\n      curvenessList = [];\n      for (var i = 0; i < len; i++) {\n        curvenessList.push((i % 2 ? i + 1 : i) / 10 * (i % 2 ? -1 : 1));\n      }\n      seriesModel.__curvenessList = curvenessList;\n    };\n    /**\r\n     * Create different cache key data in the positive and negative directions, in order to set the curvature later\r\n     * @param {number|string|module:echarts/data/Graph.Node} n1\r\n     * @param {number|string|module:echarts/data/Graph.Node} n2\r\n     * @param {module:echarts/model/SeriesModel} seriesModel\r\n     * @returns {string} key\r\n     */\n    var getKeyOfEdges = function (n1, n2, seriesModel) {\n      var source = [n1.id, n1.dataIndex].join('.');\n      var target = [n2.id, n2.dataIndex].join('.');\n      return [seriesModel.uid, source, target].join(KEY_DELIMITER);\n    };\n    /**\r\n     * get opposite key\r\n     * @param {string} key\r\n     * @returns {string}\r\n     */\n    var getOppositeKey = function (key) {\n      var keys = key.split(KEY_DELIMITER);\n      return [keys[0], keys[2], keys[1]].join(KEY_DELIMITER);\n    };\n    /**\r\n     * get edgeMap with key\r\n     * @param edge\r\n     * @param {module:echarts/model/SeriesModel} seriesModel\r\n     */\n    var getEdgeFromMap = function (edge, seriesModel) {\n      var key = getKeyOfEdges(edge.node1, edge.node2, seriesModel);\n      return seriesModel.__edgeMap[key];\n    };\n    /**\r\n     * calculate all cases total length\r\n     * @param edge\r\n     * @param seriesModel\r\n     * @returns {number}\r\n     */\n    var getTotalLengthBetweenNodes = function (edge, seriesModel) {\n      var len = getEdgeMapLengthWithKey(getKeyOfEdges(edge.node1, edge.node2, seriesModel), seriesModel);\n      var lenV = getEdgeMapLengthWithKey(getKeyOfEdges(edge.node2, edge.node1, seriesModel), seriesModel);\n      return len + lenV;\n    };\n    /**\r\n     *\r\n     * @param key\r\n     */\n    var getEdgeMapLengthWithKey = function (key, seriesModel) {\n      var edgeMap = seriesModel.__edgeMap;\n      return edgeMap[key] ? edgeMap[key].length : 0;\n    };\n    /**\r\n     * Count the number of edges between the same two points, used to obtain the curvature table and the parity of the edge\r\n     * @see /graph/GraphSeries.js@getInitialData\r\n     * @param {module:echarts/model/SeriesModel} seriesModel\r\n     */\n    function initCurvenessList(seriesModel) {\n      if (!getAutoCurvenessParams(seriesModel)) {\n        return;\n      }\n      seriesModel.__curvenessList = [];\n      seriesModel.__edgeMap = {};\n      // calc the array of curveness List\n      createCurveness(seriesModel);\n    }\n    /**\r\n     * set edgeMap with key\r\n     * @param {number|string|module:echarts/data/Graph.Node} n1\r\n     * @param {number|string|module:echarts/data/Graph.Node} n2\r\n     * @param {module:echarts/model/SeriesModel} seriesModel\r\n     * @param {number} index\r\n     */\n    function createEdgeMapForCurveness(n1, n2, seriesModel, index) {\n      if (!getAutoCurvenessParams(seriesModel)) {\n        return;\n      }\n      var key = getKeyOfEdges(n1, n2, seriesModel);\n      var edgeMap = seriesModel.__edgeMap;\n      var oppositeEdges = edgeMap[getOppositeKey(key)];\n      // set direction\n      if (edgeMap[key] && !oppositeEdges) {\n        edgeMap[key].isForward = true;\n      } else if (oppositeEdges && edgeMap[key]) {\n        oppositeEdges.isForward = true;\n        edgeMap[key].isForward = false;\n      }\n      edgeMap[key] = edgeMap[key] || [];\n      edgeMap[key].push(index);\n    }\n    /**\r\n     * get curvature for edge\r\n     * @param edge\r\n     * @param {module:echarts/model/SeriesModel} seriesModel\r\n     * @param index\r\n     */\n    function getCurvenessForEdge(edge, seriesModel, index, needReverse) {\n      var autoCurvenessParams = getAutoCurvenessParams(seriesModel);\n      var isArrayParam = isArray(autoCurvenessParams);\n      if (!autoCurvenessParams) {\n        return null;\n      }\n      var edgeArray = getEdgeFromMap(edge, seriesModel);\n      if (!edgeArray) {\n        return null;\n      }\n      var edgeIndex = -1;\n      for (var i = 0; i < edgeArray.length; i++) {\n        if (edgeArray[i] === index) {\n          edgeIndex = i;\n          break;\n        }\n      }\n      // if totalLen is Longer createCurveness\n      var totalLen = getTotalLengthBetweenNodes(edge, seriesModel);\n      createCurveness(seriesModel, totalLen);\n      edge.lineStyle = edge.lineStyle || {};\n      // if is opposite edge, must set curvenss to opposite number\n      var curKey = getKeyOfEdges(edge.node1, edge.node2, seriesModel);\n      var curvenessList = seriesModel.__curvenessList;\n      // if pass array no need parity\n      var parityCorrection = isArrayParam ? 0 : totalLen % 2 ? 0 : 1;\n      if (!edgeArray.isForward) {\n        // the opposite edge show outside\n        var oppositeKey = getOppositeKey(curKey);\n        var len = getEdgeMapLengthWithKey(oppositeKey, seriesModel);\n        var resValue = curvenessList[edgeIndex + len + parityCorrection];\n        // isNeedReverse, simple, force type need reverse the curveness in the junction of the forword and the opposite\n        if (needReverse) {\n          // set as array may make the parity handle with the len of opposite\n          if (isArrayParam) {\n            if (autoCurvenessParams && autoCurvenessParams[0] === 0) {\n              return (len + parityCorrection) % 2 ? resValue : -resValue;\n            } else {\n              return ((len % 2 ? 0 : 1) + parityCorrection) % 2 ? resValue : -resValue;\n            }\n          } else {\n            return (len + parityCorrection) % 2 ? resValue : -resValue;\n          }\n        } else {\n          return curvenessList[edgeIndex + len + parityCorrection];\n        }\n      } else {\n        return curvenessList[parityCorrection + edgeIndex];\n      }\n    }\n\n    function simpleLayout(seriesModel) {\n      var coordSys = seriesModel.coordinateSystem;\n      if (coordSys && coordSys.type !== 'view') {\n        return;\n      }\n      var graph = seriesModel.getGraph();\n      graph.eachNode(function (node) {\n        var model = node.getModel();\n        node.setLayout([+model.get('x'), +model.get('y')]);\n      });\n      simpleLayoutEdge(graph, seriesModel);\n    }\n    function simpleLayoutEdge(graph, seriesModel) {\n      graph.eachEdge(function (edge, index) {\n        var curveness = retrieve3(edge.getModel().get(['lineStyle', 'curveness']), -getCurvenessForEdge(edge, seriesModel, index, true), 0);\n        var p1 = clone$1(edge.node1.getLayout());\n        var p2 = clone$1(edge.node2.getLayout());\n        var points = [p1, p2];\n        if (+curveness) {\n          points.push([(p1[0] + p2[0]) / 2 - (p1[1] - p2[1]) * curveness, (p1[1] + p2[1]) / 2 - (p2[0] - p1[0]) * curveness]);\n        }\n        edge.setLayout(points);\n      });\n    }\n\n    function graphSimpleLayout(ecModel, api) {\n      ecModel.eachSeriesByType('graph', function (seriesModel) {\n        var layout = seriesModel.get('layout');\n        var coordSys = seriesModel.coordinateSystem;\n        if (coordSys && coordSys.type !== 'view') {\n          var data_1 = seriesModel.getData();\n          var dimensions_1 = [];\n          each(coordSys.dimensions, function (coordDim) {\n            dimensions_1 = dimensions_1.concat(data_1.mapDimensionsAll(coordDim));\n          });\n          for (var dataIndex = 0; dataIndex < data_1.count(); dataIndex++) {\n            var value = [];\n            var hasValue = false;\n            for (var i = 0; i < dimensions_1.length; i++) {\n              var val = data_1.get(dimensions_1[i], dataIndex);\n              if (!isNaN(val)) {\n                hasValue = true;\n              }\n              value.push(val);\n            }\n            if (hasValue) {\n              data_1.setItemLayout(dataIndex, coordSys.dataToPoint(value));\n            } else {\n              // Also {Array.<number>}, not undefined to avoid if...else... statement\n              data_1.setItemLayout(dataIndex, [NaN, NaN]);\n            }\n          }\n          simpleLayoutEdge(data_1.graph, seriesModel);\n        } else if (!layout || layout === 'none') {\n          simpleLayout(seriesModel);\n        }\n      });\n    }\n\n    /*\n    * Licensed to the Apache Software Foundation (ASF) under one\n    * or more contributor license agreements.  See the NOTICE file\n    * distributed with this work for additional information\n    * regarding copyright ownership.  The ASF licenses this file\n    * to you under the Apache License, Version 2.0 (the\n    * \"License\"); you may not use this file except in compliance\n    * with the License.  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,\n    * software distributed under the License is distributed on an\n    * \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\n    * KIND, either express or implied.  See the License for the\n    * specific language governing permissions and limitations\n    * under the License.\n    */\n\n\n    /**\n     * AUTO-GENERATED FILE. DO NOT MODIFY.\n     */\n\n    /*\r\n    * Licensed to the Apache Software Foundation (ASF) under one\r\n    * or more contributor license agreements.  See the NOTICE file\r\n    * distributed with this work for additional information\r\n    * regarding copyright ownership.  The ASF licenses this file\r\n    * to you under the Apache License, Version 2.0 (the\r\n    * \"License\"); you may not use this file except in compliance\r\n    * with the License.  You may obtain a copy of the License at\r\n    *\r\n    *   http://www.apache.org/licenses/LICENSE-2.0\r\n    *\r\n    * Unless required by applicable law or agreed to in writing,\r\n    * software distributed under the License is distributed on an\r\n    * \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\r\n    * KIND, either express or implied.  See the License for the\r\n    * specific language governing permissions and limitations\r\n    * under the License.\r\n    */\n    function getNodeGlobalScale(seriesModel) {\n      var coordSys = seriesModel.coordinateSystem;\n      if (coordSys.type !== 'view') {\n        return 1;\n      }\n      var nodeScaleRatio = seriesModel.option.nodeScaleRatio;\n      var groupZoom = coordSys.scaleX;\n      // Scale node when zoom changes\n      var roamZoom = coordSys.getZoom();\n      var nodeScale = (roamZoom - 1) * nodeScaleRatio + 1;\n      return nodeScale / groupZoom;\n    }\n    function getSymbolSize(node) {\n      var symbolSize = node.getVisual('symbolSize');\n      if (symbolSize instanceof Array) {\n        symbolSize = (symbolSize[0] + symbolSize[1]) / 2;\n      }\n      return +symbolSize;\n    }\n\n    var PI$6 = Math.PI;\n    var _symbolRadiansHalf = [];\n    /**\r\n     * `basedOn` can be:\r\n     * 'value':\r\n     *     This layout is not accurate and have same bad case. For example,\r\n     *     if the min value is very smaller than the max value, the nodes\r\n     *     with the min value probably overlap even though there is enough\r\n     *     space to layout them. So we only use this approach in the as the\r\n     *     init layout of the force layout.\r\n     *     FIXME\r\n     *     Probably we do not need this method any more but use\r\n     *     `basedOn: 'symbolSize'` in force layout if\r\n     *     delay its init operations to GraphView.\r\n     * 'symbolSize':\r\n     *     This approach work only if all of the symbol size calculated.\r\n     *     That is, the progressive rendering is not applied to graph.\r\n     *     FIXME\r\n     *     If progressive rendering is applied to graph some day,\r\n     *     probably we have to use `basedOn: 'value'`.\r\n     */\n    function circularLayout(seriesModel, basedOn, draggingNode, pointer) {\n      var coordSys = seriesModel.coordinateSystem;\n      if (coordSys && coordSys.type !== 'view') {\n        return;\n      }\n      var rect = coordSys.getBoundingRect();\n      var nodeData = seriesModel.getData();\n      var graph = nodeData.graph;\n      var cx = rect.width / 2 + rect.x;\n      var cy = rect.height / 2 + rect.y;\n      var r = Math.min(rect.width, rect.height) / 2;\n      var count = nodeData.count();\n      nodeData.setLayout({\n        cx: cx,\n        cy: cy\n      });\n      if (!count) {\n        return;\n      }\n      if (draggingNode) {\n        var _a = coordSys.pointToData(pointer),\n          tempX = _a[0],\n          tempY = _a[1];\n        var v = [tempX - cx, tempY - cy];\n        normalize(v, v);\n        scale(v, v, r);\n        draggingNode.setLayout([cx + v[0], cy + v[1]], true);\n        var circularRotateLabel = seriesModel.get(['circular', 'rotateLabel']);\n        rotateNodeLabel(draggingNode, circularRotateLabel, cx, cy);\n      }\n      _layoutNodesBasedOn[basedOn](seriesModel, graph, nodeData, r, cx, cy, count);\n      graph.eachEdge(function (edge, index) {\n        var curveness = retrieve3(edge.getModel().get(['lineStyle', 'curveness']), getCurvenessForEdge(edge, seriesModel, index), 0);\n        var p1 = clone$1(edge.node1.getLayout());\n        var p2 = clone$1(edge.node2.getLayout());\n        var cp1;\n        var x12 = (p1[0] + p2[0]) / 2;\n        var y12 = (p1[1] + p2[1]) / 2;\n        if (+curveness) {\n          curveness *= 3;\n          cp1 = [cx * curveness + x12 * (1 - curveness), cy * curveness + y12 * (1 - curveness)];\n        }\n        edge.setLayout([p1, p2, cp1]);\n      });\n    }\n    var _layoutNodesBasedOn = {\n      value: function (seriesModel, graph, nodeData, r, cx, cy, count) {\n        var angle = 0;\n        var sum = nodeData.getSum('value');\n        var unitAngle = Math.PI * 2 / (sum || count);\n        graph.eachNode(function (node) {\n          var value = node.getValue('value');\n          var radianHalf = unitAngle * (sum ? value : 1) / 2;\n          angle += radianHalf;\n          node.setLayout([r * Math.cos(angle) + cx, r * Math.sin(angle) + cy]);\n          angle += radianHalf;\n        });\n      },\n      symbolSize: function (seriesModel, graph, nodeData, r, cx, cy, count) {\n        var sumRadian = 0;\n        _symbolRadiansHalf.length = count;\n        var nodeScale = getNodeGlobalScale(seriesModel);\n        graph.eachNode(function (node) {\n          var symbolSize = getSymbolSize(node);\n          // Normally this case will not happen, but we still add\n          // some the defensive code (2px is an arbitrary value).\n          isNaN(symbolSize) && (symbolSize = 2);\n          symbolSize < 0 && (symbolSize = 0);\n          symbolSize *= nodeScale;\n          var symbolRadianHalf = Math.asin(symbolSize / 2 / r);\n          // when `symbolSize / 2` is bigger than `r`.\n          isNaN(symbolRadianHalf) && (symbolRadianHalf = PI$6 / 2);\n          _symbolRadiansHalf[node.dataIndex] = symbolRadianHalf;\n          sumRadian += symbolRadianHalf * 2;\n        });\n        var halfRemainRadian = (2 * PI$6 - sumRadian) / count / 2;\n        var angle = 0;\n        graph.eachNode(function (node) {\n          var radianHalf = halfRemainRadian + _symbolRadiansHalf[node.dataIndex];\n          angle += radianHalf;\n          // init circular layout for\n          // 1. layout undefined node\n          // 2. not fixed node\n          (!node.getLayout() || !node.getLayout().fixed) && node.setLayout([r * Math.cos(angle) + cx, r * Math.sin(angle) + cy]);\n          angle += radianHalf;\n        });\n      }\n    };\n    function rotateNodeLabel(node, circularRotateLabel, cx, cy) {\n      var el = node.getGraphicEl();\n      // need to check if el exists. '-' value may not create node element.\n      if (!el) {\n        return;\n      }\n      var nodeModel = node.getModel();\n      var labelRotate = nodeModel.get(['label', 'rotate']) || 0;\n      var symbolPath = el.getSymbolPath();\n      if (circularRotateLabel) {\n        var pos = node.getLayout();\n        var rad = Math.atan2(pos[1] - cy, pos[0] - cx);\n        if (rad < 0) {\n          rad = Math.PI * 2 + rad;\n        }\n        var isLeft = pos[0] < cx;\n        if (isLeft) {\n          rad = rad - Math.PI;\n        }\n        var textPosition = isLeft ? 'left' : 'right';\n        symbolPath.setTextConfig({\n          rotation: -rad,\n          position: textPosition,\n          origin: 'center'\n        });\n        var emphasisState = symbolPath.ensureState('emphasis');\n        extend(emphasisState.textConfig || (emphasisState.textConfig = {}), {\n          position: textPosition\n        });\n      } else {\n        symbolPath.setTextConfig({\n          rotation: labelRotate *= Math.PI / 180\n        });\n      }\n    }\n\n    function graphCircularLayout(ecModel) {\n      ecModel.eachSeriesByType('graph', function (seriesModel) {\n        if (seriesModel.get('layout') === 'circular') {\n          circularLayout(seriesModel, 'symbolSize');\n        }\n      });\n    }\n\n    var scaleAndAdd$1 = scaleAndAdd;\n    // function adjacentNode(n, e) {\n    //     return e.n1 === n ? e.n2 : e.n1;\n    // }\n    function forceLayout(inNodes, inEdges, opts) {\n      var nodes = inNodes;\n      var edges = inEdges;\n      var rect = opts.rect;\n      var width = rect.width;\n      var height = rect.height;\n      var center = [rect.x + width / 2, rect.y + height / 2];\n      // let scale = opts.scale || 1;\n      var gravity = opts.gravity == null ? 0.1 : opts.gravity;\n      // for (let i = 0; i < edges.length; i++) {\n      //     let e = edges[i];\n      //     let n1 = e.n1;\n      //     let n2 = e.n2;\n      //     n1.edges = n1.edges || [];\n      //     n2.edges = n2.edges || [];\n      //     n1.edges.push(e);\n      //     n2.edges.push(e);\n      // }\n      // Init position\n      for (var i = 0; i < nodes.length; i++) {\n        var n = nodes[i];\n        if (!n.p) {\n          n.p = create(width * (Math.random() - 0.5) + center[0], height * (Math.random() - 0.5) + center[1]);\n        }\n        n.pp = clone$1(n.p);\n        n.edges = null;\n      }\n      // Formula in 'Graph Drawing by Force-directed Placement'\n      // let k = scale * Math.sqrt(width * height / nodes.length);\n      // let k2 = k * k;\n      var initialFriction = opts.friction == null ? 0.6 : opts.friction;\n      var friction = initialFriction;\n      var beforeStepCallback;\n      var afterStepCallback;\n      return {\n        warmUp: function () {\n          friction = initialFriction * 0.8;\n        },\n        setFixed: function (idx) {\n          nodes[idx].fixed = true;\n        },\n        setUnfixed: function (idx) {\n          nodes[idx].fixed = false;\n        },\n        /**\r\n         * Before step hook\r\n         */\n        beforeStep: function (cb) {\n          beforeStepCallback = cb;\n        },\n        /**\r\n         * After step hook\r\n         */\n        afterStep: function (cb) {\n          afterStepCallback = cb;\n        },\n        /**\r\n         * Some formulas were originally copied from \"d3.js\"\r\n         * https://github.com/d3/d3/blob/b516d77fb8566b576088e73410437494717ada26/src/layout/force.js\r\n         * with some modifications made for this project.\r\n         * See the license statement at the head of this file.\r\n         */\n        step: function (cb) {\n          beforeStepCallback && beforeStepCallback(nodes, edges);\n          var v12 = [];\n          var nLen = nodes.length;\n          for (var i = 0; i < edges.length; i++) {\n            var e = edges[i];\n            if (e.ignoreForceLayout) {\n              continue;\n            }\n            var n1 = e.n1;\n            var n2 = e.n2;\n            sub(v12, n2.p, n1.p);\n            var d = len(v12) - e.d;\n            var w = n2.w / (n1.w + n2.w);\n            if (isNaN(w)) {\n              w = 0;\n            }\n            normalize(v12, v12);\n            !n1.fixed && scaleAndAdd$1(n1.p, n1.p, v12, w * d * friction);\n            !n2.fixed && scaleAndAdd$1(n2.p, n2.p, v12, -(1 - w) * d * friction);\n          }\n          // Gravity\n          for (var i = 0; i < nLen; i++) {\n            var n = nodes[i];\n            if (!n.fixed) {\n              sub(v12, center, n.p);\n              // let d = vec2.len(v12);\n              // vec2.scale(v12, v12, 1 / d);\n              // let gravityFactor = gravity;\n              scaleAndAdd$1(n.p, n.p, v12, gravity * friction);\n            }\n          }\n          // Repulsive\n          // PENDING\n          for (var i = 0; i < nLen; i++) {\n            var n1 = nodes[i];\n            for (var j = i + 1; j < nLen; j++) {\n              var n2 = nodes[j];\n              sub(v12, n2.p, n1.p);\n              var d = len(v12);\n              if (d === 0) {\n                // Random repulse\n                set(v12, Math.random() - 0.5, Math.random() - 0.5);\n                d = 1;\n              }\n              var repFact = (n1.rep + n2.rep) / d / d;\n              !n1.fixed && scaleAndAdd$1(n1.pp, n1.pp, v12, repFact);\n              !n2.fixed && scaleAndAdd$1(n2.pp, n2.pp, v12, -repFact);\n            }\n          }\n          var v = [];\n          for (var i = 0; i < nLen; i++) {\n            var n = nodes[i];\n            if (!n.fixed) {\n              sub(v, n.p, n.pp);\n              scaleAndAdd$1(n.p, n.p, v, friction);\n              copy(n.pp, n.p);\n            }\n          }\n          friction = friction * 0.992;\n          var finished = friction < 0.01;\n          afterStepCallback && afterStepCallback(nodes, edges, finished);\n          cb && cb(finished);\n        }\n      };\n    }\n\n    function graphForceLayout(ecModel) {\n      ecModel.eachSeriesByType('graph', function (graphSeries) {\n        var coordSys = graphSeries.coordinateSystem;\n        if (coordSys && coordSys.type !== 'view') {\n          return;\n        }\n        if (graphSeries.get('layout') === 'force') {\n          var preservedPoints_1 = graphSeries.preservedPoints || {};\n          var graph_1 = graphSeries.getGraph();\n          var nodeData_1 = graph_1.data;\n          var edgeData = graph_1.edgeData;\n          var forceModel = graphSeries.getModel('force');\n          var initLayout = forceModel.get('initLayout');\n          if (graphSeries.preservedPoints) {\n            nodeData_1.each(function (idx) {\n              var id = nodeData_1.getId(idx);\n              nodeData_1.setItemLayout(idx, preservedPoints_1[id] || [NaN, NaN]);\n            });\n          } else if (!initLayout || initLayout === 'none') {\n            simpleLayout(graphSeries);\n          } else if (initLayout === 'circular') {\n            circularLayout(graphSeries, 'value');\n          }\n          var nodeDataExtent_1 = nodeData_1.getDataExtent('value');\n          var edgeDataExtent_1 = edgeData.getDataExtent('value');\n          // let edgeDataExtent = edgeData.getDataExtent('value');\n          var repulsion = forceModel.get('repulsion');\n          var edgeLength = forceModel.get('edgeLength');\n          var repulsionArr_1 = isArray(repulsion) ? repulsion : [repulsion, repulsion];\n          var edgeLengthArr_1 = isArray(edgeLength) ? edgeLength : [edgeLength, edgeLength];\n          // Larger value has smaller length\n          edgeLengthArr_1 = [edgeLengthArr_1[1], edgeLengthArr_1[0]];\n          var nodes_1 = nodeData_1.mapArray('value', function (value, idx) {\n            var point = nodeData_1.getItemLayout(idx);\n            var rep = linearMap(value, nodeDataExtent_1, repulsionArr_1);\n            if (isNaN(rep)) {\n              rep = (repulsionArr_1[0] + repulsionArr_1[1]) / 2;\n            }\n            return {\n              w: rep,\n              rep: rep,\n              fixed: nodeData_1.getItemModel(idx).get('fixed'),\n              p: !point || isNaN(point[0]) || isNaN(point[1]) ? null : point\n            };\n          });\n          var edges = edgeData.mapArray('value', function (value, idx) {\n            var edge = graph_1.getEdgeByIndex(idx);\n            var d = linearMap(value, edgeDataExtent_1, edgeLengthArr_1);\n            if (isNaN(d)) {\n              d = (edgeLengthArr_1[0] + edgeLengthArr_1[1]) / 2;\n            }\n            var edgeModel = edge.getModel();\n            var curveness = retrieve3(edge.getModel().get(['lineStyle', 'curveness']), -getCurvenessForEdge(edge, graphSeries, idx, true), 0);\n            return {\n              n1: nodes_1[edge.node1.dataIndex],\n              n2: nodes_1[edge.node2.dataIndex],\n              d: d,\n              curveness: curveness,\n              ignoreForceLayout: edgeModel.get('ignoreForceLayout')\n            };\n          });\n          // let coordSys = graphSeries.coordinateSystem;\n          var rect = coordSys.getBoundingRect();\n          var forceInstance = forceLayout(nodes_1, edges, {\n            rect: rect,\n            gravity: forceModel.get('gravity'),\n            friction: forceModel.get('friction')\n          });\n          forceInstance.beforeStep(function (nodes, edges) {\n            for (var i = 0, l = nodes.length; i < l; i++) {\n              if (nodes[i].fixed) {\n                // Write back to layout instance\n                copy(nodes[i].p, graph_1.getNodeByIndex(i).getLayout());\n              }\n            }\n          });\n          forceInstance.afterStep(function (nodes, edges, stopped) {\n            for (var i = 0, l = nodes.length; i < l; i++) {\n              if (!nodes[i].fixed) {\n                graph_1.getNodeByIndex(i).setLayout(nodes[i].p);\n              }\n              preservedPoints_1[nodeData_1.getId(i)] = nodes[i].p;\n            }\n            for (var i = 0, l = edges.length; i < l; i++) {\n              var e = edges[i];\n              var edge = graph_1.getEdgeByIndex(i);\n              var p1 = e.n1.p;\n              var p2 = e.n2.p;\n              var points = edge.getLayout();\n              points = points ? points.slice() : [];\n              points[0] = points[0] || [];\n              points[1] = points[1] || [];\n              copy(points[0], p1);\n              copy(points[1], p2);\n              if (+e.curveness) {\n                points[2] = [(p1[0] + p2[0]) / 2 - (p1[1] - p2[1]) * e.curveness, (p1[1] + p2[1]) / 2 - (p2[0] - p1[0]) * e.curveness];\n              }\n              edge.setLayout(points);\n            }\n          });\n          graphSeries.forceLayout = forceInstance;\n          graphSeries.preservedPoints = preservedPoints_1;\n          // Step to get the layout\n          forceInstance.step();\n        } else {\n          // Remove prev injected forceLayout instance\n          graphSeries.forceLayout = null;\n        }\n      });\n    }\n\n    function getViewRect$2(seriesModel, api, aspect) {\n      var option = extend(seriesModel.getBoxLayoutParams(), {\n        aspect: aspect\n      });\n      return getLayoutRect(option, {\n        width: api.getWidth(),\n        height: api.getHeight()\n      });\n    }\n    function createViewCoordSys(ecModel, api) {\n      var viewList = [];\n      ecModel.eachSeriesByType('graph', function (seriesModel) {\n        var coordSysType = seriesModel.get('coordinateSystem');\n        if (!coordSysType || coordSysType === 'view') {\n          var data_1 = seriesModel.getData();\n          var positions = data_1.mapArray(function (idx) {\n            var itemModel = data_1.getItemModel(idx);\n            return [+itemModel.get('x'), +itemModel.get('y')];\n          });\n          var min = [];\n          var max = [];\n          fromPoints(positions, min, max);\n          // If width or height is 0\n          if (max[0] - min[0] === 0) {\n            max[0] += 1;\n            min[0] -= 1;\n          }\n          if (max[1] - min[1] === 0) {\n            max[1] += 1;\n            min[1] -= 1;\n          }\n          var aspect = (max[0] - min[0]) / (max[1] - min[1]);\n          // FIXME If get view rect after data processed?\n          var viewRect = getViewRect$2(seriesModel, api, aspect);\n          // Position may be NaN, use view rect instead\n          if (isNaN(aspect)) {\n            min = [viewRect.x, viewRect.y];\n            max = [viewRect.x + viewRect.width, viewRect.y + viewRect.height];\n          }\n          var bbWidth = max[0] - min[0];\n          var bbHeight = max[1] - min[1];\n          var viewWidth = viewRect.width;\n          var viewHeight = viewRect.height;\n          var viewCoordSys = seriesModel.coordinateSystem = new View();\n          viewCoordSys.zoomLimit = seriesModel.get('scaleLimit');\n          viewCoordSys.setBoundingRect(min[0], min[1], bbWidth, bbHeight);\n          viewCoordSys.setViewRect(viewRect.x, viewRect.y, viewWidth, viewHeight);\n          // Update roam info\n          viewCoordSys.setCenter(seriesModel.get('center'), api);\n          viewCoordSys.setZoom(seriesModel.get('zoom'));\n          viewList.push(viewCoordSys);\n        }\n      });\n      return viewList;\n    }\n\n    var straightLineProto = Line.prototype;\n    var bezierCurveProto = BezierCurve.prototype;\n    var StraightLineShape = /** @class */function () {\n      function StraightLineShape() {\n        // Start point\n        this.x1 = 0;\n        this.y1 = 0;\n        // End point\n        this.x2 = 0;\n        this.y2 = 0;\n        this.percent = 1;\n      }\n      return StraightLineShape;\n    }();\n    var CurveShape = /** @class */function (_super) {\n      __extends(CurveShape, _super);\n      function CurveShape() {\n        return _super !== null && _super.apply(this, arguments) || this;\n      }\n      return CurveShape;\n    }(StraightLineShape);\n    function isStraightLine(shape) {\n      return isNaN(+shape.cpx1) || isNaN(+shape.cpy1);\n    }\n    var ECLinePath = /** @class */function (_super) {\n      __extends(ECLinePath, _super);\n      function ECLinePath(opts) {\n        var _this = _super.call(this, opts) || this;\n        _this.type = 'ec-line';\n        return _this;\n      }\n      ECLinePath.prototype.getDefaultStyle = function () {\n        return {\n          stroke: '#000',\n          fill: null\n        };\n      };\n      ECLinePath.prototype.getDefaultShape = function () {\n        return new StraightLineShape();\n      };\n      ECLinePath.prototype.buildPath = function (ctx, shape) {\n        if (isStraightLine(shape)) {\n          straightLineProto.buildPath.call(this, ctx, shape);\n        } else {\n          bezierCurveProto.buildPath.call(this, ctx, shape);\n        }\n      };\n      ECLinePath.prototype.pointAt = function (t) {\n        if (isStraightLine(this.shape)) {\n          return straightLineProto.pointAt.call(this, t);\n        } else {\n          return bezierCurveProto.pointAt.call(this, t);\n        }\n      };\n      ECLinePath.prototype.tangentAt = function (t) {\n        var shape = this.shape;\n        var p = isStraightLine(shape) ? [shape.x2 - shape.x1, shape.y2 - shape.y1] : bezierCurveProto.tangentAt.call(this, t);\n        return normalize(p, p);\n      };\n      return ECLinePath;\n    }(Path);\n\n    var SYMBOL_CATEGORIES = ['fromSymbol', 'toSymbol'];\n    function makeSymbolTypeKey(symbolCategory) {\n      return '_' + symbolCategory + 'Type';\n    }\n    function makeSymbolTypeValue(name, lineData, idx) {\n      var symbolType = lineData.getItemVisual(idx, name);\n      if (!symbolType || symbolType === 'none') {\n        return symbolType;\n      }\n      var symbolSize = lineData.getItemVisual(idx, name + 'Size');\n      var symbolRotate = lineData.getItemVisual(idx, name + 'Rotate');\n      var symbolOffset = lineData.getItemVisual(idx, name + 'Offset');\n      var symbolKeepAspect = lineData.getItemVisual(idx, name + 'KeepAspect');\n      var symbolSizeArr = normalizeSymbolSize(symbolSize);\n      var symbolOffsetArr = normalizeSymbolOffset(symbolOffset || 0, symbolSizeArr);\n      return symbolType + symbolSizeArr + symbolOffsetArr + (symbolRotate || '') + (symbolKeepAspect || '');\n    }\n    /**\r\n     * @inner\r\n     */\n    function createSymbol$1(name, lineData, idx) {\n      var symbolType = lineData.getItemVisual(idx, name);\n      if (!symbolType || symbolType === 'none') {\n        return;\n      }\n      var symbolSize = lineData.getItemVisual(idx, name + 'Size');\n      var symbolRotate = lineData.getItemVisual(idx, name + 'Rotate');\n      var symbolOffset = lineData.getItemVisual(idx, name + 'Offset');\n      var symbolKeepAspect = lineData.getItemVisual(idx, name + 'KeepAspect');\n      var symbolSizeArr = normalizeSymbolSize(symbolSize);\n      var symbolOffsetArr = normalizeSymbolOffset(symbolOffset || 0, symbolSizeArr);\n      var symbolPath = createSymbol(symbolType, -symbolSizeArr[0] / 2 + symbolOffsetArr[0], -symbolSizeArr[1] / 2 + symbolOffsetArr[1], symbolSizeArr[0], symbolSizeArr[1], null, symbolKeepAspect);\n      symbolPath.__specifiedRotation = symbolRotate == null || isNaN(symbolRotate) ? void 0 : +symbolRotate * Math.PI / 180 || 0;\n      symbolPath.name = name;\n      return symbolPath;\n    }\n    function createLine(points) {\n      var line = new ECLinePath({\n        name: 'line',\n        subPixelOptimize: true\n      });\n      setLinePoints(line.shape, points);\n      return line;\n    }\n    function setLinePoints(targetShape, points) {\n      targetShape.x1 = points[0][0];\n      targetShape.y1 = points[0][1];\n      targetShape.x2 = points[1][0];\n      targetShape.y2 = points[1][1];\n      targetShape.percent = 1;\n      var cp1 = points[2];\n      if (cp1) {\n        targetShape.cpx1 = cp1[0];\n        targetShape.cpy1 = cp1[1];\n      } else {\n        targetShape.cpx1 = NaN;\n        targetShape.cpy1 = NaN;\n      }\n    }\n    var Line$1 = /** @class */function (_super) {\n      __extends(Line, _super);\n      function Line(lineData, idx, seriesScope) {\n        var _this = _super.call(this) || this;\n        _this._createLine(lineData, idx, seriesScope);\n        return _this;\n      }\n      Line.prototype._createLine = function (lineData, idx, seriesScope) {\n        var seriesModel = lineData.hostModel;\n        var linePoints = lineData.getItemLayout(idx);\n        var line = createLine(linePoints);\n        line.shape.percent = 0;\n        initProps(line, {\n          shape: {\n            percent: 1\n          }\n        }, seriesModel, idx);\n        this.add(line);\n        each(SYMBOL_CATEGORIES, function (symbolCategory) {\n          var symbol = createSymbol$1(symbolCategory, lineData, idx);\n          // symbols must added after line to make sure\n          // it will be updated after line#update.\n          // Or symbol position and rotation update in line#beforeUpdate will be one frame slow\n          this.add(symbol);\n          this[makeSymbolTypeKey(symbolCategory)] = makeSymbolTypeValue(symbolCategory, lineData, idx);\n        }, this);\n        this._updateCommonStl(lineData, idx, seriesScope);\n      };\n      // TODO More strict on the List type in parameters?\n      Line.prototype.updateData = function (lineData, idx, seriesScope) {\n        var seriesModel = lineData.hostModel;\n        var line = this.childOfName('line');\n        var linePoints = lineData.getItemLayout(idx);\n        var target = {\n          shape: {}\n        };\n        setLinePoints(target.shape, linePoints);\n        updateProps(line, target, seriesModel, idx);\n        each(SYMBOL_CATEGORIES, function (symbolCategory) {\n          var symbolType = makeSymbolTypeValue(symbolCategory, lineData, idx);\n          var key = makeSymbolTypeKey(symbolCategory);\n          // Symbol changed\n          if (this[key] !== symbolType) {\n            this.remove(this.childOfName(symbolCategory));\n            var symbol = createSymbol$1(symbolCategory, lineData, idx);\n            this.add(symbol);\n          }\n          this[key] = symbolType;\n        }, this);\n        this._updateCommonStl(lineData, idx, seriesScope);\n      };\n      Line.prototype.getLinePath = function () {\n        return this.childAt(0);\n      };\n      Line.prototype._updateCommonStl = function (lineData, idx, seriesScope) {\n        var seriesModel = lineData.hostModel;\n        var line = this.childOfName('line');\n        var emphasisLineStyle = seriesScope && seriesScope.emphasisLineStyle;\n        var blurLineStyle = seriesScope && seriesScope.blurLineStyle;\n        var selectLineStyle = seriesScope && seriesScope.selectLineStyle;\n        var labelStatesModels = seriesScope && seriesScope.labelStatesModels;\n        var emphasisDisabled = seriesScope && seriesScope.emphasisDisabled;\n        var focus = seriesScope && seriesScope.focus;\n        var blurScope = seriesScope && seriesScope.blurScope;\n        // Optimization for large dataset\n        if (!seriesScope || lineData.hasItemOption) {\n          var itemModel = lineData.getItemModel(idx);\n          var emphasisModel = itemModel.getModel('emphasis');\n          emphasisLineStyle = emphasisModel.getModel('lineStyle').getLineStyle();\n          blurLineStyle = itemModel.getModel(['blur', 'lineStyle']).getLineStyle();\n          selectLineStyle = itemModel.getModel(['select', 'lineStyle']).getLineStyle();\n          emphasisDisabled = emphasisModel.get('disabled');\n          focus = emphasisModel.get('focus');\n          blurScope = emphasisModel.get('blurScope');\n          labelStatesModels = getLabelStatesModels(itemModel);\n        }\n        var lineStyle = lineData.getItemVisual(idx, 'style');\n        var visualColor = lineStyle.stroke;\n        line.useStyle(lineStyle);\n        line.style.fill = null;\n        line.style.strokeNoScale = true;\n        line.ensureState('emphasis').style = emphasisLineStyle;\n        line.ensureState('blur').style = blurLineStyle;\n        line.ensureState('select').style = selectLineStyle;\n        // Update symbol\n        each(SYMBOL_CATEGORIES, function (symbolCategory) {\n          var symbol = this.childOfName(symbolCategory);\n          if (symbol) {\n            // Share opacity and color with line.\n            symbol.setColor(visualColor);\n            symbol.style.opacity = lineStyle.opacity;\n            for (var i = 0; i < SPECIAL_STATES.length; i++) {\n              var stateName = SPECIAL_STATES[i];\n              var lineState = line.getState(stateName);\n              if (lineState) {\n                var lineStateStyle = lineState.style || {};\n                var state = symbol.ensureState(stateName);\n                var stateStyle = state.style || (state.style = {});\n                if (lineStateStyle.stroke != null) {\n                  stateStyle[symbol.__isEmptyBrush ? 'stroke' : 'fill'] = lineStateStyle.stroke;\n                }\n                if (lineStateStyle.opacity != null) {\n                  stateStyle.opacity = lineStateStyle.opacity;\n                }\n              }\n            }\n            symbol.markRedraw();\n          }\n        }, this);\n        var rawVal = seriesModel.getRawValue(idx);\n        setLabelStyle(this, labelStatesModels, {\n          labelDataIndex: idx,\n          labelFetcher: {\n            getFormattedLabel: function (dataIndex, stateName) {\n              return seriesModel.getFormattedLabel(dataIndex, stateName, lineData.dataType);\n            }\n          },\n          inheritColor: visualColor || '#000',\n          defaultOpacity: lineStyle.opacity,\n          defaultText: (rawVal == null ? lineData.getName(idx) : isFinite(rawVal) ? round(rawVal) : rawVal) + ''\n        });\n        var label = this.getTextContent();\n        // Always set `textStyle` even if `normalStyle.text` is null, because default\n        // values have to be set on `normalStyle`.\n        if (label) {\n          var labelNormalModel = labelStatesModels.normal;\n          label.__align = label.style.align;\n          label.__verticalAlign = label.style.verticalAlign;\n          // 'start', 'middle', 'end'\n          label.__position = labelNormalModel.get('position') || 'middle';\n          var distance = labelNormalModel.get('distance');\n          if (!isArray(distance)) {\n            distance = [distance, distance];\n          }\n          label.__labelDistance = distance;\n        }\n        this.setTextConfig({\n          position: null,\n          local: true,\n          inside: false // Can't be inside for stroke element.\n        });\n        toggleHoverEmphasis(this, focus, blurScope, emphasisDisabled);\n      };\n      Line.prototype.highlight = function () {\n        enterEmphasis(this);\n      };\n      Line.prototype.downplay = function () {\n        leaveEmphasis(this);\n      };\n      Line.prototype.updateLayout = function (lineData, idx) {\n        this.setLinePoints(lineData.getItemLayout(idx));\n      };\n      Line.prototype.setLinePoints = function (points) {\n        var linePath = this.childOfName('line');\n        setLinePoints(linePath.shape, points);\n        linePath.dirty();\n      };\n      Line.prototype.beforeUpdate = function () {\n        var lineGroup = this;\n        var symbolFrom = lineGroup.childOfName('fromSymbol');\n        var symbolTo = lineGroup.childOfName('toSymbol');\n        var label = lineGroup.getTextContent();\n        // Quick reject\n        if (!symbolFrom && !symbolTo && (!label || label.ignore)) {\n          return;\n        }\n        var invScale = 1;\n        var parentNode = this.parent;\n        while (parentNode) {\n          if (parentNode.scaleX) {\n            invScale /= parentNode.scaleX;\n          }\n          parentNode = parentNode.parent;\n        }\n        var line = lineGroup.childOfName('line');\n        // If line not changed\n        // FIXME Parent scale changed\n        if (!this.__dirty && !line.__dirty) {\n          return;\n        }\n        var percent = line.shape.percent;\n        var fromPos = line.pointAt(0);\n        var toPos = line.pointAt(percent);\n        var d = sub([], toPos, fromPos);\n        normalize(d, d);\n        function setSymbolRotation(symbol, percent) {\n          // Fix #12388\n          // when symbol is set to be 'arrow' in markLine,\n          // symbolRotate value will be ignored, and compulsively use tangent angle.\n          // rotate by default if symbol rotation is not specified\n          var specifiedRotation = symbol.__specifiedRotation;\n          if (specifiedRotation == null) {\n            var tangent = line.tangentAt(percent);\n            symbol.attr('rotation', (percent === 1 ? -1 : 1) * Math.PI / 2 - Math.atan2(tangent[1], tangent[0]));\n          } else {\n            symbol.attr('rotation', specifiedRotation);\n          }\n        }\n        if (symbolFrom) {\n          symbolFrom.setPosition(fromPos);\n          setSymbolRotation(symbolFrom, 0);\n          symbolFrom.scaleX = symbolFrom.scaleY = invScale * percent;\n          symbolFrom.markRedraw();\n        }\n        if (symbolTo) {\n          symbolTo.setPosition(toPos);\n          setSymbolRotation(symbolTo, 1);\n          symbolTo.scaleX = symbolTo.scaleY = invScale * percent;\n          symbolTo.markRedraw();\n        }\n        if (label && !label.ignore) {\n          label.x = label.y = 0;\n          label.originX = label.originY = 0;\n          var textAlign = void 0;\n          var textVerticalAlign = void 0;\n          var distance = label.__labelDistance;\n          var distanceX = distance[0] * invScale;\n          var distanceY = distance[1] * invScale;\n          var halfPercent = percent / 2;\n          var tangent = line.tangentAt(halfPercent);\n          var n = [tangent[1], -tangent[0]];\n          var cp = line.pointAt(halfPercent);\n          if (n[1] > 0) {\n            n[0] = -n[0];\n            n[1] = -n[1];\n          }\n          var dir = tangent[0] < 0 ? -1 : 1;\n          if (label.__position !== 'start' && label.__position !== 'end') {\n            var rotation = -Math.atan2(tangent[1], tangent[0]);\n            if (toPos[0] < fromPos[0]) {\n              rotation = Math.PI + rotation;\n            }\n            label.rotation = rotation;\n          }\n          var dy = void 0;\n          switch (label.__position) {\n            case 'insideStartTop':\n            case 'insideMiddleTop':\n            case 'insideEndTop':\n            case 'middle':\n              dy = -distanceY;\n              textVerticalAlign = 'bottom';\n              break;\n            case 'insideStartBottom':\n            case 'insideMiddleBottom':\n            case 'insideEndBottom':\n              dy = distanceY;\n              textVerticalAlign = 'top';\n              break;\n            default:\n              dy = 0;\n              textVerticalAlign = 'middle';\n          }\n          switch (label.__position) {\n            case 'end':\n              label.x = d[0] * distanceX + toPos[0];\n              label.y = d[1] * distanceY + toPos[1];\n              textAlign = d[0] > 0.8 ? 'left' : d[0] < -0.8 ? 'right' : 'center';\n              textVerticalAlign = d[1] > 0.8 ? 'top' : d[1] < -0.8 ? 'bottom' : 'middle';\n              break;\n            case 'start':\n              label.x = -d[0] * distanceX + fromPos[0];\n              label.y = -d[1] * distanceY + fromPos[1];\n              textAlign = d[0] > 0.8 ? 'right' : d[0] < -0.8 ? 'left' : 'center';\n              textVerticalAlign = d[1] > 0.8 ? 'bottom' : d[1] < -0.8 ? 'top' : 'middle';\n              break;\n            case 'insideStartTop':\n            case 'insideStart':\n            case 'insideStartBottom':\n              label.x = distanceX * dir + fromPos[0];\n              label.y = fromPos[1] + dy;\n              textAlign = tangent[0] < 0 ? 'right' : 'left';\n              label.originX = -distanceX * dir;\n              label.originY = -dy;\n              break;\n            case 'insideMiddleTop':\n            case 'insideMiddle':\n            case 'insideMiddleBottom':\n            case 'middle':\n              label.x = cp[0];\n              label.y = cp[1] + dy;\n              textAlign = 'center';\n              label.originY = -dy;\n              break;\n            case 'insideEndTop':\n            case 'insideEnd':\n            case 'insideEndBottom':\n              label.x = -distanceX * dir + toPos[0];\n              label.y = toPos[1] + dy;\n              textAlign = tangent[0] >= 0 ? 'right' : 'left';\n              label.originX = distanceX * dir;\n              label.originY = -dy;\n              break;\n          }\n          label.scaleX = label.scaleY = invScale;\n          label.setStyle({\n            // Use the user specified text align and baseline first\n            verticalAlign: label.__verticalAlign || textVerticalAlign,\n            align: label.__align || textAlign\n          });\n        }\n      };\n      return Line;\n    }(Group);\n\n    var LineDraw = /** @class */function () {\n      function LineDraw(LineCtor) {\n        this.group = new Group();\n        this._LineCtor = LineCtor || Line$1;\n      }\n      LineDraw.prototype.updateData = function (lineData) {\n        var _this = this;\n        // Remove progressive els.\n        this._progressiveEls = null;\n        var lineDraw = this;\n        var group = lineDraw.group;\n        var oldLineData = lineDraw._lineData;\n        lineDraw._lineData = lineData;\n        // There is no oldLineData only when first rendering or switching from\n        // stream mode to normal mode, where previous elements should be removed.\n        if (!oldLineData) {\n          group.removeAll();\n        }\n        var seriesScope = makeSeriesScope$1(lineData);\n        lineData.diff(oldLineData).add(function (idx) {\n          _this._doAdd(lineData, idx, seriesScope);\n        }).update(function (newIdx, oldIdx) {\n          _this._doUpdate(oldLineData, lineData, oldIdx, newIdx, seriesScope);\n        }).remove(function (idx) {\n          group.remove(oldLineData.getItemGraphicEl(idx));\n        }).execute();\n      };\n      LineDraw.prototype.updateLayout = function () {\n        var lineData = this._lineData;\n        // Do not support update layout in incremental mode.\n        if (!lineData) {\n          return;\n        }\n        lineData.eachItemGraphicEl(function (el, idx) {\n          el.updateLayout(lineData, idx);\n        }, this);\n      };\n      LineDraw.prototype.incrementalPrepareUpdate = function (lineData) {\n        this._seriesScope = makeSeriesScope$1(lineData);\n        this._lineData = null;\n        this.group.removeAll();\n      };\n      LineDraw.prototype.incrementalUpdate = function (taskParams, lineData) {\n        this._progressiveEls = [];\n        function updateIncrementalAndHover(el) {\n          if (!el.isGroup && !isEffectObject(el)) {\n            el.incremental = true;\n            el.ensureState('emphasis').hoverLayer = true;\n          }\n        }\n        for (var idx = taskParams.start; idx < taskParams.end; idx++) {\n          var itemLayout = lineData.getItemLayout(idx);\n          if (lineNeedsDraw(itemLayout)) {\n            var el = new this._LineCtor(lineData, idx, this._seriesScope);\n            el.traverse(updateIncrementalAndHover);\n            this.group.add(el);\n            lineData.setItemGraphicEl(idx, el);\n            this._progressiveEls.push(el);\n          }\n        }\n      };\n      LineDraw.prototype.remove = function () {\n        this.group.removeAll();\n      };\n      LineDraw.prototype.eachRendered = function (cb) {\n        traverseElements(this._progressiveEls || this.group, cb);\n      };\n      LineDraw.prototype._doAdd = function (lineData, idx, seriesScope) {\n        var itemLayout = lineData.getItemLayout(idx);\n        if (!lineNeedsDraw(itemLayout)) {\n          return;\n        }\n        var el = new this._LineCtor(lineData, idx, seriesScope);\n        lineData.setItemGraphicEl(idx, el);\n        this.group.add(el);\n      };\n      LineDraw.prototype._doUpdate = function (oldLineData, newLineData, oldIdx, newIdx, seriesScope) {\n        var itemEl = oldLineData.getItemGraphicEl(oldIdx);\n        if (!lineNeedsDraw(newLineData.getItemLayout(newIdx))) {\n          this.group.remove(itemEl);\n          return;\n        }\n        if (!itemEl) {\n          itemEl = new this._LineCtor(newLineData, newIdx, seriesScope);\n        } else {\n          itemEl.updateData(newLineData, newIdx, seriesScope);\n        }\n        newLineData.setItemGraphicEl(newIdx, itemEl);\n        this.group.add(itemEl);\n      };\n      return LineDraw;\n    }();\n    function isEffectObject(el) {\n      return el.animators && el.animators.length > 0;\n    }\n    function makeSeriesScope$1(lineData) {\n      var hostModel = lineData.hostModel;\n      var emphasisModel = hostModel.getModel('emphasis');\n      return {\n        lineStyle: hostModel.getModel('lineStyle').getLineStyle(),\n        emphasisLineStyle: emphasisModel.getModel(['lineStyle']).getLineStyle(),\n        blurLineStyle: hostModel.getModel(['blur', 'lineStyle']).getLineStyle(),\n        selectLineStyle: hostModel.getModel(['select', 'lineStyle']).getLineStyle(),\n        emphasisDisabled: emphasisModel.get('disabled'),\n        blurScope: emphasisModel.get('blurScope'),\n        focus: emphasisModel.get('focus'),\n        labelStatesModels: getLabelStatesModels(hostModel)\n      };\n    }\n    function isPointNaN(pt) {\n      return isNaN(pt[0]) || isNaN(pt[1]);\n    }\n    function lineNeedsDraw(pts) {\n      return pts && !isPointNaN(pts[0]) && !isPointNaN(pts[1]);\n    }\n\n    var v1 = [];\n    var v2 = [];\n    var v3 = [];\n    var quadraticAt$1 = quadraticAt;\n    var v2DistSquare = distSquare;\n    var mathAbs$2 = Math.abs;\n    function intersectCurveCircle(curvePoints, center, radius) {\n      var p0 = curvePoints[0];\n      var p1 = curvePoints[1];\n      var p2 = curvePoints[2];\n      var d = Infinity;\n      var t;\n      var radiusSquare = radius * radius;\n      var interval = 0.1;\n      for (var _t = 0.1; _t <= 0.9; _t += 0.1) {\n        v1[0] = quadraticAt$1(p0[0], p1[0], p2[0], _t);\n        v1[1] = quadraticAt$1(p0[1], p1[1], p2[1], _t);\n        var diff = mathAbs$2(v2DistSquare(v1, center) - radiusSquare);\n        if (diff < d) {\n          d = diff;\n          t = _t;\n        }\n      }\n      // Assume the segment is monotone，Find root through Bisection method\n      // At most 32 iteration\n      for (var i = 0; i < 32; i++) {\n        // let prev = t - interval;\n        var next = t + interval;\n        // v1[0] = quadraticAt(p0[0], p1[0], p2[0], prev);\n        // v1[1] = quadraticAt(p0[1], p1[1], p2[1], prev);\n        v2[0] = quadraticAt$1(p0[0], p1[0], p2[0], t);\n        v2[1] = quadraticAt$1(p0[1], p1[1], p2[1], t);\n        v3[0] = quadraticAt$1(p0[0], p1[0], p2[0], next);\n        v3[1] = quadraticAt$1(p0[1], p1[1], p2[1], next);\n        var diff = v2DistSquare(v2, center) - radiusSquare;\n        if (mathAbs$2(diff) < 1e-2) {\n          break;\n        }\n        // let prevDiff = v2DistSquare(v1, center) - radiusSquare;\n        var nextDiff = v2DistSquare(v3, center) - radiusSquare;\n        interval /= 2;\n        if (diff < 0) {\n          if (nextDiff >= 0) {\n            t = t + interval;\n          } else {\n            t = t - interval;\n          }\n        } else {\n          if (nextDiff >= 0) {\n            t = t - interval;\n          } else {\n            t = t + interval;\n          }\n        }\n      }\n      return t;\n    }\n    // Adjust edge to avoid\n    function adjustEdge(graph, scale) {\n      var tmp0 = [];\n      var quadraticSubdivide$1 = quadraticSubdivide;\n      var pts = [[], [], []];\n      var pts2 = [[], []];\n      var v = [];\n      scale /= 2;\n      graph.eachEdge(function (edge, idx) {\n        var linePoints = edge.getLayout();\n        var fromSymbol = edge.getVisual('fromSymbol');\n        var toSymbol = edge.getVisual('toSymbol');\n        if (!linePoints.__original) {\n          linePoints.__original = [clone$1(linePoints[0]), clone$1(linePoints[1])];\n          if (linePoints[2]) {\n            linePoints.__original.push(clone$1(linePoints[2]));\n          }\n        }\n        var originalPoints = linePoints.__original;\n        // Quadratic curve\n        if (linePoints[2] != null) {\n          copy(pts[0], originalPoints[0]);\n          copy(pts[1], originalPoints[2]);\n          copy(pts[2], originalPoints[1]);\n          if (fromSymbol && fromSymbol !== 'none') {\n            var symbolSize = getSymbolSize(edge.node1);\n            var t = intersectCurveCircle(pts, originalPoints[0], symbolSize * scale);\n            // Subdivide and get the second\n            quadraticSubdivide$1(pts[0][0], pts[1][0], pts[2][0], t, tmp0);\n            pts[0][0] = tmp0[3];\n            pts[1][0] = tmp0[4];\n            quadraticSubdivide$1(pts[0][1], pts[1][1], pts[2][1], t, tmp0);\n            pts[0][1] = tmp0[3];\n            pts[1][1] = tmp0[4];\n          }\n          if (toSymbol && toSymbol !== 'none') {\n            var symbolSize = getSymbolSize(edge.node2);\n            var t = intersectCurveCircle(pts, originalPoints[1], symbolSize * scale);\n            // Subdivide and get the first\n            quadraticSubdivide$1(pts[0][0], pts[1][0], pts[2][0], t, tmp0);\n            pts[1][0] = tmp0[1];\n            pts[2][0] = tmp0[2];\n            quadraticSubdivide$1(pts[0][1], pts[1][1], pts[2][1], t, tmp0);\n            pts[1][1] = tmp0[1];\n            pts[2][1] = tmp0[2];\n          }\n          // Copy back to layout\n          copy(linePoints[0], pts[0]);\n          copy(linePoints[1], pts[2]);\n          copy(linePoints[2], pts[1]);\n        }\n        // Line\n        else {\n          copy(pts2[0], originalPoints[0]);\n          copy(pts2[1], originalPoints[1]);\n          sub(v, pts2[1], pts2[0]);\n          normalize(v, v);\n          if (fromSymbol && fromSymbol !== 'none') {\n            var symbolSize = getSymbolSize(edge.node1);\n            scaleAndAdd(pts2[0], pts2[0], v, symbolSize * scale);\n          }\n          if (toSymbol && toSymbol !== 'none') {\n            var symbolSize = getSymbolSize(edge.node2);\n            scaleAndAdd(pts2[1], pts2[1], v, -symbolSize * scale);\n          }\n          copy(linePoints[0], pts2[0]);\n          copy(linePoints[1], pts2[1]);\n        }\n      });\n    }\n\n    function isViewCoordSys(coordSys) {\n      return coordSys.type === 'view';\n    }\n    var GraphView = /** @class */function (_super) {\n      __extends(GraphView, _super);\n      function GraphView() {\n        var _this = _super !== null && _super.apply(this, arguments) || this;\n        _this.type = GraphView.type;\n        return _this;\n      }\n      GraphView.prototype.init = function (ecModel, api) {\n        var symbolDraw = new SymbolDraw();\n        var lineDraw = new LineDraw();\n        var group = this.group;\n        this._controller = new RoamController(api.getZr());\n        this._controllerHost = {\n          target: group\n        };\n        group.add(symbolDraw.group);\n        group.add(lineDraw.group);\n        this._symbolDraw = symbolDraw;\n        this._lineDraw = lineDraw;\n        this._firstRender = true;\n      };\n      GraphView.prototype.render = function (seriesModel, ecModel, api) {\n        var _this = this;\n        var coordSys = seriesModel.coordinateSystem;\n        this._model = seriesModel;\n        var symbolDraw = this._symbolDraw;\n        var lineDraw = this._lineDraw;\n        var group = this.group;\n        if (isViewCoordSys(coordSys)) {\n          var groupNewProp = {\n            x: coordSys.x,\n            y: coordSys.y,\n            scaleX: coordSys.scaleX,\n            scaleY: coordSys.scaleY\n          };\n          if (this._firstRender) {\n            group.attr(groupNewProp);\n          } else {\n            updateProps(group, groupNewProp, seriesModel);\n          }\n        }\n        // Fix edge contact point with node\n        adjustEdge(seriesModel.getGraph(), getNodeGlobalScale(seriesModel));\n        var data = seriesModel.getData();\n        symbolDraw.updateData(data);\n        var edgeData = seriesModel.getEdgeData();\n        // TODO: TYPE\n        lineDraw.updateData(edgeData);\n        this._updateNodeAndLinkScale();\n        this._updateController(seriesModel, ecModel, api);\n        clearTimeout(this._layoutTimeout);\n        var forceLayout = seriesModel.forceLayout;\n        var layoutAnimation = seriesModel.get(['force', 'layoutAnimation']);\n        if (forceLayout) {\n          this._startForceLayoutIteration(forceLayout, layoutAnimation);\n        }\n        var layout = seriesModel.get('layout');\n        data.graph.eachNode(function (node) {\n          var idx = node.dataIndex;\n          var el = node.getGraphicEl();\n          var itemModel = node.getModel();\n          if (!el) {\n            return;\n          }\n          // Update draggable\n          el.off('drag').off('dragend');\n          var draggable = itemModel.get('draggable');\n          if (draggable) {\n            el.on('drag', function (e) {\n              switch (layout) {\n                case 'force':\n                  forceLayout.warmUp();\n                  !_this._layouting && _this._startForceLayoutIteration(forceLayout, layoutAnimation);\n                  forceLayout.setFixed(idx);\n                  // Write position back to layout\n                  data.setItemLayout(idx, [el.x, el.y]);\n                  break;\n                case 'circular':\n                  data.setItemLayout(idx, [el.x, el.y]);\n                  // mark node fixed\n                  node.setLayout({\n                    fixed: true\n                  }, true);\n                  // recalculate circular layout\n                  circularLayout(seriesModel, 'symbolSize', node, [e.offsetX, e.offsetY]);\n                  _this.updateLayout(seriesModel);\n                  break;\n                case 'none':\n                default:\n                  data.setItemLayout(idx, [el.x, el.y]);\n                  // update edge\n                  simpleLayoutEdge(seriesModel.getGraph(), seriesModel);\n                  _this.updateLayout(seriesModel);\n                  break;\n              }\n            }).on('dragend', function () {\n              if (forceLayout) {\n                forceLayout.setUnfixed(idx);\n              }\n            });\n          }\n          el.setDraggable(draggable, !!itemModel.get('cursor'));\n          var focus = itemModel.get(['emphasis', 'focus']);\n          if (focus === 'adjacency') {\n            getECData(el).focus = node.getAdjacentDataIndices();\n          }\n        });\n        data.graph.eachEdge(function (edge) {\n          var el = edge.getGraphicEl();\n          var focus = edge.getModel().get(['emphasis', 'focus']);\n          if (!el) {\n            return;\n          }\n          if (focus === 'adjacency') {\n            getECData(el).focus = {\n              edge: [edge.dataIndex],\n              node: [edge.node1.dataIndex, edge.node2.dataIndex]\n            };\n          }\n        });\n        var circularRotateLabel = seriesModel.get('layout') === 'circular' && seriesModel.get(['circular', 'rotateLabel']);\n        var cx = data.getLayout('cx');\n        var cy = data.getLayout('cy');\n        data.graph.eachNode(function (node) {\n          rotateNodeLabel(node, circularRotateLabel, cx, cy);\n        });\n        this._firstRender = false;\n      };\n      GraphView.prototype.dispose = function () {\n        this.remove();\n        this._controller && this._controller.dispose();\n        this._controllerHost = null;\n      };\n      GraphView.prototype._startForceLayoutIteration = function (forceLayout, layoutAnimation) {\n        var self = this;\n        (function step() {\n          forceLayout.step(function (stopped) {\n            self.updateLayout(self._model);\n            (self._layouting = !stopped) && (layoutAnimation ? self._layoutTimeout = setTimeout(step, 16) : step());\n          });\n        })();\n      };\n      GraphView.prototype._updateController = function (seriesModel, ecModel, api) {\n        var _this = this;\n        var controller = this._controller;\n        var controllerHost = this._controllerHost;\n        var group = this.group;\n        controller.setPointerChecker(function (e, x, y) {\n          var rect = group.getBoundingRect();\n          rect.applyTransform(group.transform);\n          return rect.contain(x, y) && !onIrrelevantElement(e, api, seriesModel);\n        });\n        if (!isViewCoordSys(seriesModel.coordinateSystem)) {\n          controller.disable();\n          return;\n        }\n        controller.enable(seriesModel.get('roam'));\n        controllerHost.zoomLimit = seriesModel.get('scaleLimit');\n        controllerHost.zoom = seriesModel.coordinateSystem.getZoom();\n        controller.off('pan').off('zoom').on('pan', function (e) {\n          updateViewOnPan(controllerHost, e.dx, e.dy);\n          api.dispatchAction({\n            seriesId: seriesModel.id,\n            type: 'graphRoam',\n            dx: e.dx,\n            dy: e.dy\n          });\n        }).on('zoom', function (e) {\n          updateViewOnZoom(controllerHost, e.scale, e.originX, e.originY);\n          api.dispatchAction({\n            seriesId: seriesModel.id,\n            type: 'graphRoam',\n            zoom: e.scale,\n            originX: e.originX,\n            originY: e.originY\n          });\n          _this._updateNodeAndLinkScale();\n          adjustEdge(seriesModel.getGraph(), getNodeGlobalScale(seriesModel));\n          _this._lineDraw.updateLayout();\n          // Only update label layout on zoom\n          api.updateLabelLayout();\n        });\n      };\n      GraphView.prototype._updateNodeAndLinkScale = function () {\n        var seriesModel = this._model;\n        var data = seriesModel.getData();\n        var nodeScale = getNodeGlobalScale(seriesModel);\n        data.eachItemGraphicEl(function (el, idx) {\n          el && el.setSymbolScale(nodeScale);\n        });\n      };\n      GraphView.prototype.updateLayout = function (seriesModel) {\n        adjustEdge(seriesModel.getGraph(), getNodeGlobalScale(seriesModel));\n        this._symbolDraw.updateLayout();\n        this._lineDraw.updateLayout();\n      };\n      GraphView.prototype.remove = function () {\n        clearTimeout(this._layoutTimeout);\n        this._layouting = false;\n        this._layoutTimeout = null;\n        this._symbolDraw && this._symbolDraw.remove();\n        this._lineDraw && this._lineDraw.remove();\n      };\n      GraphView.type = 'graph';\n      return GraphView;\n    }(ChartView);\n\n    // id may be function name of Object, add a prefix to avoid this problem.\n    function generateNodeKey(id) {\n      return '_EC_' + id;\n    }\n    var Graph = /** @class */function () {\n      function Graph(directed) {\n        this.type = 'graph';\n        this.nodes = [];\n        this.edges = [];\n        this._nodesMap = {};\n        /**\r\n         * @type {Object.<string, module:echarts/data/Graph.Edge>}\r\n         * @private\r\n         */\n        this._edgesMap = {};\n        this._directed = directed || false;\n      }\n      /**\r\n       * If is directed graph\r\n       */\n      Graph.prototype.isDirected = function () {\n        return this._directed;\n      };\n      /**\r\n       * Add a new node\r\n       */\n      Graph.prototype.addNode = function (id, dataIndex) {\n        id = id == null ? '' + dataIndex : '' + id;\n        var nodesMap = this._nodesMap;\n        if (nodesMap[generateNodeKey(id)]) {\n          if (\"development\" !== 'production') {\n            console.error('Graph nodes have duplicate name or id');\n          }\n          return;\n        }\n        var node = new GraphNode(id, dataIndex);\n        node.hostGraph = this;\n        this.nodes.push(node);\n        nodesMap[generateNodeKey(id)] = node;\n        return node;\n      };\n      /**\r\n       * Get node by data index\r\n       */\n      Graph.prototype.getNodeByIndex = function (dataIndex) {\n        var rawIdx = this.data.getRawIndex(dataIndex);\n        return this.nodes[rawIdx];\n      };\n      /**\r\n       * Get node by id\r\n       */\n      Graph.prototype.getNodeById = function (id) {\n        return this._nodesMap[generateNodeKey(id)];\n      };\n      /**\r\n       * Add a new edge\r\n       */\n      Graph.prototype.addEdge = function (n1, n2, dataIndex) {\n        var nodesMap = this._nodesMap;\n        var edgesMap = this._edgesMap;\n        // PENDING\n        if (isNumber(n1)) {\n          n1 = this.nodes[n1];\n        }\n        if (isNumber(n2)) {\n          n2 = this.nodes[n2];\n        }\n        if (!(n1 instanceof GraphNode)) {\n          n1 = nodesMap[generateNodeKey(n1)];\n        }\n        if (!(n2 instanceof GraphNode)) {\n          n2 = nodesMap[generateNodeKey(n2)];\n        }\n        if (!n1 || !n2) {\n          return;\n        }\n        var key = n1.id + '-' + n2.id;\n        var edge = new GraphEdge(n1, n2, dataIndex);\n        edge.hostGraph = this;\n        if (this._directed) {\n          n1.outEdges.push(edge);\n          n2.inEdges.push(edge);\n        }\n        n1.edges.push(edge);\n        if (n1 !== n2) {\n          n2.edges.push(edge);\n        }\n        this.edges.push(edge);\n        edgesMap[key] = edge;\n        return edge;\n      };\n      /**\r\n       * Get edge by data index\r\n       */\n      Graph.prototype.getEdgeByIndex = function (dataIndex) {\n        var rawIdx = this.edgeData.getRawIndex(dataIndex);\n        return this.edges[rawIdx];\n      };\n      /**\r\n       * Get edge by two linked nodes\r\n       */\n      Graph.prototype.getEdge = function (n1, n2) {\n        if (n1 instanceof GraphNode) {\n          n1 = n1.id;\n        }\n        if (n2 instanceof GraphNode) {\n          n2 = n2.id;\n        }\n        var edgesMap = this._edgesMap;\n        if (this._directed) {\n          return edgesMap[n1 + '-' + n2];\n        } else {\n          return edgesMap[n1 + '-' + n2] || edgesMap[n2 + '-' + n1];\n        }\n      };\n      /**\r\n       * Iterate all nodes\r\n       */\n      Graph.prototype.eachNode = function (cb, context) {\n        var nodes = this.nodes;\n        var len = nodes.length;\n        for (var i = 0; i < len; i++) {\n          if (nodes[i].dataIndex >= 0) {\n            cb.call(context, nodes[i], i);\n          }\n        }\n      };\n      /**\r\n       * Iterate all edges\r\n       */\n      Graph.prototype.eachEdge = function (cb, context) {\n        var edges = this.edges;\n        var len = edges.length;\n        for (var i = 0; i < len; i++) {\n          if (edges[i].dataIndex >= 0 && edges[i].node1.dataIndex >= 0 && edges[i].node2.dataIndex >= 0) {\n            cb.call(context, edges[i], i);\n          }\n        }\n      };\n      /**\r\n       * Breadth first traverse\r\n       * Return true to stop traversing\r\n       */\n      Graph.prototype.breadthFirstTraverse = function (cb, startNode, direction, context) {\n        if (!(startNode instanceof GraphNode)) {\n          startNode = this._nodesMap[generateNodeKey(startNode)];\n        }\n        if (!startNode) {\n          return;\n        }\n        var edgeType = direction === 'out' ? 'outEdges' : direction === 'in' ? 'inEdges' : 'edges';\n        for (var i = 0; i < this.nodes.length; i++) {\n          this.nodes[i].__visited = false;\n        }\n        if (cb.call(context, startNode, null)) {\n          return;\n        }\n        var queue = [startNode];\n        while (queue.length) {\n          var currentNode = queue.shift();\n          var edges = currentNode[edgeType];\n          for (var i = 0; i < edges.length; i++) {\n            var e = edges[i];\n            var otherNode = e.node1 === currentNode ? e.node2 : e.node1;\n            if (!otherNode.__visited) {\n              if (cb.call(context, otherNode, currentNode)) {\n                // Stop traversing\n                return;\n              }\n              queue.push(otherNode);\n              otherNode.__visited = true;\n            }\n          }\n        }\n      };\n      // TODO\n      // depthFirstTraverse(\n      //     cb, startNode, direction, context\n      // ) {\n      // };\n      // Filter update\n      Graph.prototype.update = function () {\n        var data = this.data;\n        var edgeData = this.edgeData;\n        var nodes = this.nodes;\n        var edges = this.edges;\n        for (var i = 0, len = nodes.length; i < len; i++) {\n          nodes[i].dataIndex = -1;\n        }\n        for (var i = 0, len = data.count(); i < len; i++) {\n          nodes[data.getRawIndex(i)].dataIndex = i;\n        }\n        edgeData.filterSelf(function (idx) {\n          var edge = edges[edgeData.getRawIndex(idx)];\n          return edge.node1.dataIndex >= 0 && edge.node2.dataIndex >= 0;\n        });\n        // Update edge\n        for (var i = 0, len = edges.length; i < len; i++) {\n          edges[i].dataIndex = -1;\n        }\n        for (var i = 0, len = edgeData.count(); i < len; i++) {\n          edges[edgeData.getRawIndex(i)].dataIndex = i;\n        }\n      };\n      /**\r\n       * @return {module:echarts/data/Graph}\r\n       */\n      Graph.prototype.clone = function () {\n        var graph = new Graph(this._directed);\n        var nodes = this.nodes;\n        var edges = this.edges;\n        for (var i = 0; i < nodes.length; i++) {\n          graph.addNode(nodes[i].id, nodes[i].dataIndex);\n        }\n        for (var i = 0; i < edges.length; i++) {\n          var e = edges[i];\n          graph.addEdge(e.node1.id, e.node2.id, e.dataIndex);\n        }\n        return graph;\n      };\n      return Graph;\n    }();\n    var GraphNode = /** @class */function () {\n      function GraphNode(id, dataIndex) {\n        this.inEdges = [];\n        this.outEdges = [];\n        this.edges = [];\n        this.dataIndex = -1;\n        this.id = id == null ? '' : id;\n        this.dataIndex = dataIndex == null ? -1 : dataIndex;\n      }\n      /**\r\n       * @return {number}\r\n       */\n      GraphNode.prototype.degree = function () {\n        return this.edges.length;\n      };\n      /**\r\n       * @return {number}\r\n       */\n      GraphNode.prototype.inDegree = function () {\n        return this.inEdges.length;\n      };\n      /**\r\n      * @return {number}\r\n      */\n      GraphNode.prototype.outDegree = function () {\n        return this.outEdges.length;\n      };\n      GraphNode.prototype.getModel = function (path) {\n        if (this.dataIndex < 0) {\n          return;\n        }\n        var graph = this.hostGraph;\n        var itemModel = graph.data.getItemModel(this.dataIndex);\n        return itemModel.getModel(path);\n      };\n      GraphNode.prototype.getAdjacentDataIndices = function () {\n        var dataIndices = {\n          edge: [],\n          node: []\n        };\n        for (var i = 0; i < this.edges.length; i++) {\n          var adjacentEdge = this.edges[i];\n          if (adjacentEdge.dataIndex < 0) {\n            continue;\n          }\n          dataIndices.edge.push(adjacentEdge.dataIndex);\n          dataIndices.node.push(adjacentEdge.node1.dataIndex, adjacentEdge.node2.dataIndex);\n        }\n        return dataIndices;\n      };\n      GraphNode.prototype.getTrajectoryDataIndices = function () {\n        var connectedEdgesMap = createHashMap();\n        var connectedNodesMap = createHashMap();\n        for (var i = 0; i < this.edges.length; i++) {\n          var adjacentEdge = this.edges[i];\n          if (adjacentEdge.dataIndex < 0) {\n            continue;\n          }\n          connectedEdgesMap.set(adjacentEdge.dataIndex, true);\n          var sourceNodesQueue = [adjacentEdge.node1];\n          var targetNodesQueue = [adjacentEdge.node2];\n          var nodeIteratorIndex = 0;\n          while (nodeIteratorIndex < sourceNodesQueue.length) {\n            var sourceNode = sourceNodesQueue[nodeIteratorIndex];\n            nodeIteratorIndex++;\n            connectedNodesMap.set(sourceNode.dataIndex, true);\n            for (var j = 0; j < sourceNode.inEdges.length; j++) {\n              connectedEdgesMap.set(sourceNode.inEdges[j].dataIndex, true);\n              sourceNodesQueue.push(sourceNode.inEdges[j].node1);\n            }\n          }\n          nodeIteratorIndex = 0;\n          while (nodeIteratorIndex < targetNodesQueue.length) {\n            var targetNode = targetNodesQueue[nodeIteratorIndex];\n            nodeIteratorIndex++;\n            connectedNodesMap.set(targetNode.dataIndex, true);\n            for (var j = 0; j < targetNode.outEdges.length; j++) {\n              connectedEdgesMap.set(targetNode.outEdges[j].dataIndex, true);\n              targetNodesQueue.push(targetNode.outEdges[j].node2);\n            }\n          }\n        }\n        return {\n          edge: connectedEdgesMap.keys(),\n          node: connectedNodesMap.keys()\n        };\n      };\n      return GraphNode;\n    }();\n    var GraphEdge = /** @class */function () {\n      function GraphEdge(n1, n2, dataIndex) {\n        this.dataIndex = -1;\n        this.node1 = n1;\n        this.node2 = n2;\n        this.dataIndex = dataIndex == null ? -1 : dataIndex;\n      }\n      // eslint-disable-next-line @typescript-eslint/no-unused-vars\n      GraphEdge.prototype.getModel = function (path) {\n        if (this.dataIndex < 0) {\n          return;\n        }\n        var graph = this.hostGraph;\n        var itemModel = graph.edgeData.getItemModel(this.dataIndex);\n        return itemModel.getModel(path);\n      };\n      GraphEdge.prototype.getAdjacentDataIndices = function () {\n        return {\n          edge: [this.dataIndex],\n          node: [this.node1.dataIndex, this.node2.dataIndex]\n        };\n      };\n      GraphEdge.prototype.getTrajectoryDataIndices = function () {\n        var connectedEdgesMap = createHashMap();\n        var connectedNodesMap = createHashMap();\n        connectedEdgesMap.set(this.dataIndex, true);\n        var sourceNodes = [this.node1];\n        var targetNodes = [this.node2];\n        var nodeIteratorIndex = 0;\n        while (nodeIteratorIndex < sourceNodes.length) {\n          var sourceNode = sourceNodes[nodeIteratorIndex];\n          nodeIteratorIndex++;\n          connectedNodesMap.set(sourceNode.dataIndex, true);\n          for (var j = 0; j < sourceNode.inEdges.length; j++) {\n            connectedEdgesMap.set(sourceNode.inEdges[j].dataIndex, true);\n            sourceNodes.push(sourceNode.inEdges[j].node1);\n          }\n        }\n        nodeIteratorIndex = 0;\n        while (nodeIteratorIndex < targetNodes.length) {\n          var targetNode = targetNodes[nodeIteratorIndex];\n          nodeIteratorIndex++;\n          connectedNodesMap.set(targetNode.dataIndex, true);\n          for (var j = 0; j < targetNode.outEdges.length; j++) {\n            connectedEdgesMap.set(targetNode.outEdges[j].dataIndex, true);\n            targetNodes.push(targetNode.outEdges[j].node2);\n          }\n        }\n        return {\n          edge: connectedEdgesMap.keys(),\n          node: connectedNodesMap.keys()\n        };\n      };\n      return GraphEdge;\n    }();\n    function createGraphDataProxyMixin(hostName, dataName) {\n      return {\n        /**\r\n         * @param Default 'value'. can be 'a', 'b', 'c', 'd', 'e'.\r\n         */\n        getValue: function (dimension) {\n          var data = this[hostName][dataName];\n          return data.getStore().get(data.getDimensionIndex(dimension || 'value'), this.dataIndex);\n        },\n        // TODO: TYPE stricter type.\n        setVisual: function (key, value) {\n          this.dataIndex >= 0 && this[hostName][dataName].setItemVisual(this.dataIndex, key, value);\n        },\n        getVisual: function (key) {\n          return this[hostName][dataName].getItemVisual(this.dataIndex, key);\n        },\n        setLayout: function (layout, merge) {\n          this.dataIndex >= 0 && this[hostName][dataName].setItemLayout(this.dataIndex, layout, merge);\n        },\n        getLayout: function () {\n          return this[hostName][dataName].getItemLayout(this.dataIndex);\n        },\n        getGraphicEl: function () {\n          return this[hostName][dataName].getItemGraphicEl(this.dataIndex);\n        },\n        getRawIndex: function () {\n          return this[hostName][dataName].getRawIndex(this.dataIndex);\n        }\n      };\n    }\n    mixin(GraphNode, createGraphDataProxyMixin('hostGraph', 'data'));\n    mixin(GraphEdge, createGraphDataProxyMixin('hostGraph', 'edgeData'));\n\n    function createGraphFromNodeEdge(nodes, edges, seriesModel, directed, beforeLink) {\n      // ??? TODO\n      // support dataset?\n      var graph = new Graph(directed);\n      for (var i = 0; i < nodes.length; i++) {\n        graph.addNode(retrieve(\n        // Id, name, dataIndex\n        nodes[i].id, nodes[i].name, i), i);\n      }\n      var linkNameList = [];\n      var validEdges = [];\n      var linkCount = 0;\n      for (var i = 0; i < edges.length; i++) {\n        var link = edges[i];\n        var source = link.source;\n        var target = link.target;\n        // addEdge may fail when source or target not exists\n        if (graph.addEdge(source, target, linkCount)) {\n          validEdges.push(link);\n          linkNameList.push(retrieve(convertOptionIdName(link.id, null), source + ' > ' + target));\n          linkCount++;\n        }\n      }\n      var coordSys = seriesModel.get('coordinateSystem');\n      var nodeData;\n      if (coordSys === 'cartesian2d' || coordSys === 'polar') {\n        nodeData = createSeriesData(nodes, seriesModel);\n      } else {\n        var coordSysCtor = CoordinateSystemManager.get(coordSys);\n        var coordDimensions = coordSysCtor ? coordSysCtor.dimensions || [] : [];\n        // FIXME: Some geo do not need `value` dimenson, whereas `calendar` needs\n        // `value` dimension, but graph need `value` dimension. It's better to\n        // uniform this behavior.\n        if (indexOf(coordDimensions, 'value') < 0) {\n          coordDimensions.concat(['value']);\n        }\n        var dimensions = prepareSeriesDataSchema(nodes, {\n          coordDimensions: coordDimensions,\n          encodeDefine: seriesModel.getEncode()\n        }).dimensions;\n        nodeData = new SeriesData(dimensions, seriesModel);\n        nodeData.initData(nodes);\n      }\n      var edgeData = new SeriesData(['value'], seriesModel);\n      edgeData.initData(validEdges, linkNameList);\n      beforeLink && beforeLink(nodeData, edgeData);\n      linkSeriesData({\n        mainData: nodeData,\n        struct: graph,\n        structAttr: 'graph',\n        datas: {\n          node: nodeData,\n          edge: edgeData\n        },\n        datasAttr: {\n          node: 'data',\n          edge: 'edgeData'\n        }\n      });\n      // Update dataIndex of nodes and edges because invalid edge may be removed\n      graph.update();\n      return graph;\n    }\n\n    var GraphSeriesModel = /** @class */function (_super) {\n      __extends(GraphSeriesModel, _super);\n      function GraphSeriesModel() {\n        var _this = _super !== null && _super.apply(this, arguments) || this;\n        _this.type = GraphSeriesModel.type;\n        _this.hasSymbolVisual = true;\n        return _this;\n      }\n      GraphSeriesModel.prototype.init = function (option) {\n        _super.prototype.init.apply(this, arguments);\n        var self = this;\n        function getCategoriesData() {\n          return self._categoriesData;\n        }\n        // Provide data for legend select\n        this.legendVisualProvider = new LegendVisualProvider(getCategoriesData, getCategoriesData);\n        this.fillDataTextStyle(option.edges || option.links);\n        this._updateCategoriesData();\n      };\n      GraphSeriesModel.prototype.mergeOption = function (option) {\n        _super.prototype.mergeOption.apply(this, arguments);\n        this.fillDataTextStyle(option.edges || option.links);\n        this._updateCategoriesData();\n      };\n      GraphSeriesModel.prototype.mergeDefaultAndTheme = function (option) {\n        _super.prototype.mergeDefaultAndTheme.apply(this, arguments);\n        defaultEmphasis(option, 'edgeLabel', ['show']);\n      };\n      GraphSeriesModel.prototype.getInitialData = function (option, ecModel) {\n        var edges = option.edges || option.links || [];\n        var nodes = option.data || option.nodes || [];\n        var self = this;\n        if (nodes && edges) {\n          // auto curveness\n          initCurvenessList(this);\n          var graph = createGraphFromNodeEdge(nodes, edges, this, true, beforeLink);\n          each(graph.edges, function (edge) {\n            createEdgeMapForCurveness(edge.node1, edge.node2, this, edge.dataIndex);\n          }, this);\n          return graph.data;\n        }\n        function beforeLink(nodeData, edgeData) {\n          // Overwrite nodeData.getItemModel to\n          nodeData.wrapMethod('getItemModel', function (model) {\n            var categoriesModels = self._categoriesModels;\n            var categoryIdx = model.getShallow('category');\n            var categoryModel = categoriesModels[categoryIdx];\n            if (categoryModel) {\n              categoryModel.parentModel = model.parentModel;\n              model.parentModel = categoryModel;\n            }\n            return model;\n          });\n          // TODO Inherit resolveParentPath by default in Model#getModel?\n          var oldGetModel = Model.prototype.getModel;\n          function newGetModel(path, parentModel) {\n            var model = oldGetModel.call(this, path, parentModel);\n            model.resolveParentPath = resolveParentPath;\n            return model;\n          }\n          edgeData.wrapMethod('getItemModel', function (model) {\n            model.resolveParentPath = resolveParentPath;\n            model.getModel = newGetModel;\n            return model;\n          });\n          function resolveParentPath(pathArr) {\n            if (pathArr && (pathArr[0] === 'label' || pathArr[1] === 'label')) {\n              var newPathArr = pathArr.slice();\n              if (pathArr[0] === 'label') {\n                newPathArr[0] = 'edgeLabel';\n              } else if (pathArr[1] === 'label') {\n                newPathArr[1] = 'edgeLabel';\n              }\n              return newPathArr;\n            }\n            return pathArr;\n          }\n        }\n      };\n      GraphSeriesModel.prototype.getGraph = function () {\n        return this.getData().graph;\n      };\n      GraphSeriesModel.prototype.getEdgeData = function () {\n        return this.getGraph().edgeData;\n      };\n      GraphSeriesModel.prototype.getCategoriesData = function () {\n        return this._categoriesData;\n      };\n      GraphSeriesModel.prototype.formatTooltip = function (dataIndex, multipleSeries, dataType) {\n        if (dataType === 'edge') {\n          var nodeData = this.getData();\n          var params = this.getDataParams(dataIndex, dataType);\n          var edge = nodeData.graph.getEdgeByIndex(dataIndex);\n          var sourceName = nodeData.getName(edge.node1.dataIndex);\n          var targetName = nodeData.getName(edge.node2.dataIndex);\n          var nameArr = [];\n          sourceName != null && nameArr.push(sourceName);\n          targetName != null && nameArr.push(targetName);\n          return createTooltipMarkup('nameValue', {\n            name: nameArr.join(' > '),\n            value: params.value,\n            noValue: params.value == null\n          });\n        }\n        // dataType === 'node' or empty\n        var nodeMarkup = defaultSeriesFormatTooltip({\n          series: this,\n          dataIndex: dataIndex,\n          multipleSeries: multipleSeries\n        });\n        return nodeMarkup;\n      };\n      GraphSeriesModel.prototype._updateCategoriesData = function () {\n        var categories = map(this.option.categories || [], function (category) {\n          // Data must has value\n          return category.value != null ? category : extend({\n            value: 0\n          }, category);\n        });\n        var categoriesData = new SeriesData(['value'], this);\n        categoriesData.initData(categories);\n        this._categoriesData = categoriesData;\n        this._categoriesModels = categoriesData.mapArray(function (idx) {\n          return categoriesData.getItemModel(idx);\n        });\n      };\n      GraphSeriesModel.prototype.setZoom = function (zoom) {\n        this.option.zoom = zoom;\n      };\n      GraphSeriesModel.prototype.setCenter = function (center) {\n        this.option.center = center;\n      };\n      GraphSeriesModel.prototype.isAnimationEnabled = function () {\n        return _super.prototype.isAnimationEnabled.call(this)\n        // Not enable animation when do force layout\n        && !(this.get('layout') === 'force' && this.get(['force', 'layoutAnimation']));\n      };\n      GraphSeriesModel.type = 'series.graph';\n      GraphSeriesModel.dependencies = ['grid', 'polar', 'geo', 'singleAxis', 'calendar'];\n      GraphSeriesModel.defaultOption = {\n        // zlevel: 0,\n        z: 2,\n        coordinateSystem: 'view',\n        // Default option for all coordinate systems\n        // xAxisIndex: 0,\n        // yAxisIndex: 0,\n        // polarIndex: 0,\n        // geoIndex: 0,\n        legendHoverLink: true,\n        layout: null,\n        // Configuration of circular layout\n        circular: {\n          rotateLabel: false\n        },\n        // Configuration of force directed layout\n        force: {\n          initLayout: null,\n          // Node repulsion. Can be an array to represent range.\n          repulsion: [0, 50],\n          gravity: 0.1,\n          // Initial friction\n          friction: 0.6,\n          // Edge length. Can be an array to represent range.\n          edgeLength: 30,\n          layoutAnimation: true\n        },\n        left: 'center',\n        top: 'center',\n        // right: null,\n        // bottom: null,\n        // width: '80%',\n        // height: '80%',\n        symbol: 'circle',\n        symbolSize: 10,\n        edgeSymbol: ['none', 'none'],\n        edgeSymbolSize: 10,\n        edgeLabel: {\n          position: 'middle',\n          distance: 5\n        },\n        draggable: false,\n        roam: false,\n        // Default on center of graph\n        center: null,\n        zoom: 1,\n        // Symbol size scale ratio in roam\n        nodeScaleRatio: 0.6,\n        // cursor: null,\n        // categories: [],\n        // data: []\n        // Or\n        // nodes: []\n        //\n        // links: []\n        // Or\n        // edges: []\n        label: {\n          show: false,\n          formatter: '{b}'\n        },\n        itemStyle: {},\n        lineStyle: {\n          color: '#aaa',\n          width: 1,\n          opacity: 0.5\n        },\n        emphasis: {\n          scale: true,\n          label: {\n            show: true\n          }\n        },\n        select: {\n          itemStyle: {\n            borderColor: '#212121'\n          }\n        }\n      };\n      return GraphSeriesModel;\n    }(SeriesModel);\n\n    var actionInfo = {\n      type: 'graphRoam',\n      event: 'graphRoam',\n      update: 'none'\n    };\n    function install$d(registers) {\n      registers.registerChartView(GraphView);\n      registers.registerSeriesModel(GraphSeriesModel);\n      registers.registerProcessor(categoryFilter);\n      registers.registerVisual(categoryVisual);\n      registers.registerVisual(graphEdgeVisual);\n      registers.registerLayout(graphSimpleLayout);\n      registers.registerLayout(registers.PRIORITY.VISUAL.POST_CHART_LAYOUT, graphCircularLayout);\n      registers.registerLayout(graphForceLayout);\n      registers.registerCoordinateSystem('graphView', {\n        dimensions: View.dimensions,\n        create: createViewCoordSys\n      });\n      // Register legacy focus actions\n      registers.registerAction({\n        type: 'focusNodeAdjacency',\n        event: 'focusNodeAdjacency',\n        update: 'series:focusNodeAdjacency'\n      }, noop);\n      registers.registerAction({\n        type: 'unfocusNodeAdjacency',\n        event: 'unfocusNodeAdjacency',\n        update: 'series:unfocusNodeAdjacency'\n      }, noop);\n      // Register roam action.\n      registers.registerAction(actionInfo, function (payload, ecModel, api) {\n        ecModel.eachComponent({\n          mainType: 'series',\n          query: payload\n        }, function (seriesModel) {\n          var coordSys = seriesModel.coordinateSystem;\n          var res = updateCenterAndZoom(coordSys, payload, undefined, api);\n          seriesModel.setCenter && seriesModel.setCenter(res.center);\n          seriesModel.setZoom && seriesModel.setZoom(res.zoom);\n        });\n      });\n    }\n\n    var PointerShape = /** @class */function () {\n      function PointerShape() {\n        this.angle = 0;\n        this.width = 10;\n        this.r = 10;\n        this.x = 0;\n        this.y = 0;\n      }\n      return PointerShape;\n    }();\n    var PointerPath = /** @class */function (_super) {\n      __extends(PointerPath, _super);\n      function PointerPath(opts) {\n        var _this = _super.call(this, opts) || this;\n        _this.type = 'pointer';\n        return _this;\n      }\n      PointerPath.prototype.getDefaultShape = function () {\n        return new PointerShape();\n      };\n      PointerPath.prototype.buildPath = function (ctx, shape) {\n        var mathCos = Math.cos;\n        var mathSin = Math.sin;\n        var r = shape.r;\n        var width = shape.width;\n        var angle = shape.angle;\n        var x = shape.x - mathCos(angle) * width * (width >= r / 3 ? 1 : 2);\n        var y = shape.y - mathSin(angle) * width * (width >= r / 3 ? 1 : 2);\n        angle = shape.angle - Math.PI / 2;\n        ctx.moveTo(x, y);\n        ctx.lineTo(shape.x + mathCos(angle) * width, shape.y + mathSin(angle) * width);\n        ctx.lineTo(shape.x + mathCos(shape.angle) * r, shape.y + mathSin(shape.angle) * r);\n        ctx.lineTo(shape.x - mathCos(angle) * width, shape.y - mathSin(angle) * width);\n        ctx.lineTo(x, y);\n      };\n      return PointerPath;\n    }(Path);\n\n    function parsePosition(seriesModel, api) {\n      var center = seriesModel.get('center');\n      var width = api.getWidth();\n      var height = api.getHeight();\n      var size = Math.min(width, height);\n      var cx = parsePercent$1(center[0], api.getWidth());\n      var cy = parsePercent$1(center[1], api.getHeight());\n      var r = parsePercent$1(seriesModel.get('radius'), size / 2);\n      return {\n        cx: cx,\n        cy: cy,\n        r: r\n      };\n    }\n    function formatLabel(value, labelFormatter) {\n      var label = value == null ? '' : value + '';\n      if (labelFormatter) {\n        if (isString(labelFormatter)) {\n          label = labelFormatter.replace('{value}', label);\n        } else if (isFunction(labelFormatter)) {\n          label = labelFormatter(value);\n        }\n      }\n      return label;\n    }\n    var GaugeView = /** @class */function (_super) {\n      __extends(GaugeView, _super);\n      function GaugeView() {\n        var _this = _super !== null && _super.apply(this, arguments) || this;\n        _this.type = GaugeView.type;\n        return _this;\n      }\n      GaugeView.prototype.render = function (seriesModel, ecModel, api) {\n        this.group.removeAll();\n        var colorList = seriesModel.get(['axisLine', 'lineStyle', 'color']);\n        var posInfo = parsePosition(seriesModel, api);\n        this._renderMain(seriesModel, ecModel, api, colorList, posInfo);\n        this._data = seriesModel.getData();\n      };\n      GaugeView.prototype.dispose = function () {};\n      GaugeView.prototype._renderMain = function (seriesModel, ecModel, api, colorList, posInfo) {\n        var group = this.group;\n        var clockwise = seriesModel.get('clockwise');\n        var startAngle = -seriesModel.get('startAngle') / 180 * Math.PI;\n        var endAngle = -seriesModel.get('endAngle') / 180 * Math.PI;\n        var axisLineModel = seriesModel.getModel('axisLine');\n        var roundCap = axisLineModel.get('roundCap');\n        var MainPath = roundCap ? SausagePath : Sector;\n        var showAxis = axisLineModel.get('show');\n        var lineStyleModel = axisLineModel.getModel('lineStyle');\n        var axisLineWidth = lineStyleModel.get('width');\n        var angles = [startAngle, endAngle];\n        normalizeArcAngles(angles, !clockwise);\n        startAngle = angles[0];\n        endAngle = angles[1];\n        var angleRangeSpan = endAngle - startAngle;\n        var prevEndAngle = startAngle;\n        var sectors = [];\n        for (var i = 0; showAxis && i < colorList.length; i++) {\n          // Clamp\n          var percent = Math.min(Math.max(colorList[i][0], 0), 1);\n          endAngle = startAngle + angleRangeSpan * percent;\n          var sector = new MainPath({\n            shape: {\n              startAngle: prevEndAngle,\n              endAngle: endAngle,\n              cx: posInfo.cx,\n              cy: posInfo.cy,\n              clockwise: clockwise,\n              r0: posInfo.r - axisLineWidth,\n              r: posInfo.r\n            },\n            silent: true\n          });\n          sector.setStyle({\n            fill: colorList[i][1]\n          });\n          sector.setStyle(lineStyleModel.getLineStyle(\n          // Because we use sector to simulate arc\n          // so the properties for stroking are useless\n          ['color', 'width']));\n          sectors.push(sector);\n          prevEndAngle = endAngle;\n        }\n        sectors.reverse();\n        each(sectors, function (sector) {\n          return group.add(sector);\n        });\n        var getColor = function (percent) {\n          // Less than 0\n          if (percent <= 0) {\n            return colorList[0][1];\n          }\n          var i;\n          for (i = 0; i < colorList.length; i++) {\n            if (colorList[i][0] >= percent && (i === 0 ? 0 : colorList[i - 1][0]) < percent) {\n              return colorList[i][1];\n            }\n          }\n          // More than 1\n          return colorList[i - 1][1];\n        };\n        this._renderTicks(seriesModel, ecModel, api, getColor, posInfo, startAngle, endAngle, clockwise, axisLineWidth);\n        this._renderTitleAndDetail(seriesModel, ecModel, api, getColor, posInfo);\n        this._renderAnchor(seriesModel, posInfo);\n        this._renderPointer(seriesModel, ecModel, api, getColor, posInfo, startAngle, endAngle, clockwise, axisLineWidth);\n      };\n      GaugeView.prototype._renderTicks = function (seriesModel, ecModel, api, getColor, posInfo, startAngle, endAngle, clockwise, axisLineWidth) {\n        var group = this.group;\n        var cx = posInfo.cx;\n        var cy = posInfo.cy;\n        var r = posInfo.r;\n        var minVal = +seriesModel.get('min');\n        var maxVal = +seriesModel.get('max');\n        var splitLineModel = seriesModel.getModel('splitLine');\n        var tickModel = seriesModel.getModel('axisTick');\n        var labelModel = seriesModel.getModel('axisLabel');\n        var splitNumber = seriesModel.get('splitNumber');\n        var subSplitNumber = tickModel.get('splitNumber');\n        var splitLineLen = parsePercent$1(splitLineModel.get('length'), r);\n        var tickLen = parsePercent$1(tickModel.get('length'), r);\n        var angle = startAngle;\n        var step = (endAngle - startAngle) / splitNumber;\n        var subStep = step / subSplitNumber;\n        var splitLineStyle = splitLineModel.getModel('lineStyle').getLineStyle();\n        var tickLineStyle = tickModel.getModel('lineStyle').getLineStyle();\n        var splitLineDistance = splitLineModel.get('distance');\n        var unitX;\n        var unitY;\n        for (var i = 0; i <= splitNumber; i++) {\n          unitX = Math.cos(angle);\n          unitY = Math.sin(angle);\n          // Split line\n          if (splitLineModel.get('show')) {\n            var distance = splitLineDistance ? splitLineDistance + axisLineWidth : axisLineWidth;\n            var splitLine = new Line({\n              shape: {\n                x1: unitX * (r - distance) + cx,\n                y1: unitY * (r - distance) + cy,\n                x2: unitX * (r - splitLineLen - distance) + cx,\n                y2: unitY * (r - splitLineLen - distance) + cy\n              },\n              style: splitLineStyle,\n              silent: true\n            });\n            if (splitLineStyle.stroke === 'auto') {\n              splitLine.setStyle({\n                stroke: getColor(i / splitNumber)\n              });\n            }\n            group.add(splitLine);\n          }\n          // Label\n          if (labelModel.get('show')) {\n            var distance = labelModel.get('distance') + splitLineDistance;\n            var label = formatLabel(round(i / splitNumber * (maxVal - minVal) + minVal), labelModel.get('formatter'));\n            var autoColor = getColor(i / splitNumber);\n            var textStyleX = unitX * (r - splitLineLen - distance) + cx;\n            var textStyleY = unitY * (r - splitLineLen - distance) + cy;\n            var rotateType = labelModel.get('rotate');\n            var rotate = 0;\n            if (rotateType === 'radial') {\n              rotate = -angle + 2 * Math.PI;\n              if (rotate > Math.PI / 2) {\n                rotate += Math.PI;\n              }\n            } else if (rotateType === 'tangential') {\n              rotate = -angle - Math.PI / 2;\n            } else if (isNumber(rotateType)) {\n              rotate = rotateType * Math.PI / 180;\n            }\n            if (rotate === 0) {\n              group.add(new ZRText({\n                style: createTextStyle(labelModel, {\n                  text: label,\n                  x: textStyleX,\n                  y: textStyleY,\n                  verticalAlign: unitY < -0.8 ? 'top' : unitY > 0.8 ? 'bottom' : 'middle',\n                  align: unitX < -0.4 ? 'left' : unitX > 0.4 ? 'right' : 'center'\n                }, {\n                  inheritColor: autoColor\n                }),\n                silent: true\n              }));\n            } else {\n              group.add(new ZRText({\n                style: createTextStyle(labelModel, {\n                  text: label,\n                  x: textStyleX,\n                  y: textStyleY,\n                  verticalAlign: 'middle',\n                  align: 'center'\n                }, {\n                  inheritColor: autoColor\n                }),\n                silent: true,\n                originX: textStyleX,\n                originY: textStyleY,\n                rotation: rotate\n              }));\n            }\n          }\n          // Axis tick\n          if (tickModel.get('show') && i !== splitNumber) {\n            var distance = tickModel.get('distance');\n            distance = distance ? distance + axisLineWidth : axisLineWidth;\n            for (var j = 0; j <= subSplitNumber; j++) {\n              unitX = Math.cos(angle);\n              unitY = Math.sin(angle);\n              var tickLine = new Line({\n                shape: {\n                  x1: unitX * (r - distance) + cx,\n                  y1: unitY * (r - distance) + cy,\n                  x2: unitX * (r - tickLen - distance) + cx,\n                  y2: unitY * (r - tickLen - distance) + cy\n                },\n                silent: true,\n                style: tickLineStyle\n              });\n              if (tickLineStyle.stroke === 'auto') {\n                tickLine.setStyle({\n                  stroke: getColor((i + j / subSplitNumber) / splitNumber)\n                });\n              }\n              group.add(tickLine);\n              angle += subStep;\n            }\n            angle -= subStep;\n          } else {\n            angle += step;\n          }\n        }\n      };\n      GaugeView.prototype._renderPointer = function (seriesModel, ecModel, api, getColor, posInfo, startAngle, endAngle, clockwise, axisLineWidth) {\n        var group = this.group;\n        var oldData = this._data;\n        var oldProgressData = this._progressEls;\n        var progressList = [];\n        var showPointer = seriesModel.get(['pointer', 'show']);\n        var progressModel = seriesModel.getModel('progress');\n        var showProgress = progressModel.get('show');\n        var data = seriesModel.getData();\n        var valueDim = data.mapDimension('value');\n        var minVal = +seriesModel.get('min');\n        var maxVal = +seriesModel.get('max');\n        var valueExtent = [minVal, maxVal];\n        var angleExtent = [startAngle, endAngle];\n        function createPointer(idx, angle) {\n          var itemModel = data.getItemModel(idx);\n          var pointerModel = itemModel.getModel('pointer');\n          var pointerWidth = parsePercent$1(pointerModel.get('width'), posInfo.r);\n          var pointerLength = parsePercent$1(pointerModel.get('length'), posInfo.r);\n          var pointerStr = seriesModel.get(['pointer', 'icon']);\n          var pointerOffset = pointerModel.get('offsetCenter');\n          var pointerOffsetX = parsePercent$1(pointerOffset[0], posInfo.r);\n          var pointerOffsetY = parsePercent$1(pointerOffset[1], posInfo.r);\n          var pointerKeepAspect = pointerModel.get('keepAspect');\n          var pointer;\n          // not exist icon type will be set 'rect'\n          if (pointerStr) {\n            pointer = createSymbol(pointerStr, pointerOffsetX - pointerWidth / 2, pointerOffsetY - pointerLength, pointerWidth, pointerLength, null, pointerKeepAspect);\n          } else {\n            pointer = new PointerPath({\n              shape: {\n                angle: -Math.PI / 2,\n                width: pointerWidth,\n                r: pointerLength,\n                x: pointerOffsetX,\n                y: pointerOffsetY\n              }\n            });\n          }\n          pointer.rotation = -(angle + Math.PI / 2);\n          pointer.x = posInfo.cx;\n          pointer.y = posInfo.cy;\n          return pointer;\n        }\n        function createProgress(idx, endAngle) {\n          var roundCap = progressModel.get('roundCap');\n          var ProgressPath = roundCap ? SausagePath : Sector;\n          var isOverlap = progressModel.get('overlap');\n          var progressWidth = isOverlap ? progressModel.get('width') : axisLineWidth / data.count();\n          var r0 = isOverlap ? posInfo.r - progressWidth : posInfo.r - (idx + 1) * progressWidth;\n          var r = isOverlap ? posInfo.r : posInfo.r - idx * progressWidth;\n          var progress = new ProgressPath({\n            shape: {\n              startAngle: startAngle,\n              endAngle: endAngle,\n              cx: posInfo.cx,\n              cy: posInfo.cy,\n              clockwise: clockwise,\n              r0: r0,\n              r: r\n            }\n          });\n          isOverlap && (progress.z2 = linearMap(data.get(valueDim, idx), [minVal, maxVal], [100, 0], true));\n          return progress;\n        }\n        if (showProgress || showPointer) {\n          data.diff(oldData).add(function (idx) {\n            var val = data.get(valueDim, idx);\n            if (showPointer) {\n              var pointer = createPointer(idx, startAngle);\n              // TODO hide pointer on NaN value?\n              initProps(pointer, {\n                rotation: -((isNaN(+val) ? angleExtent[0] : linearMap(val, valueExtent, angleExtent, true)) + Math.PI / 2)\n              }, seriesModel);\n              group.add(pointer);\n              data.setItemGraphicEl(idx, pointer);\n            }\n            if (showProgress) {\n              var progress = createProgress(idx, startAngle);\n              var isClip = progressModel.get('clip');\n              initProps(progress, {\n                shape: {\n                  endAngle: linearMap(val, valueExtent, angleExtent, isClip)\n                }\n              }, seriesModel);\n              group.add(progress);\n              // Add data index and series index for indexing the data by element\n              // Useful in tooltip\n              setCommonECData(seriesModel.seriesIndex, data.dataType, idx, progress);\n              progressList[idx] = progress;\n            }\n          }).update(function (newIdx, oldIdx) {\n            var val = data.get(valueDim, newIdx);\n            if (showPointer) {\n              var previousPointer = oldData.getItemGraphicEl(oldIdx);\n              var previousRotate = previousPointer ? previousPointer.rotation : startAngle;\n              var pointer = createPointer(newIdx, previousRotate);\n              pointer.rotation = previousRotate;\n              updateProps(pointer, {\n                rotation: -((isNaN(+val) ? angleExtent[0] : linearMap(val, valueExtent, angleExtent, true)) + Math.PI / 2)\n              }, seriesModel);\n              group.add(pointer);\n              data.setItemGraphicEl(newIdx, pointer);\n            }\n            if (showProgress) {\n              var previousProgress = oldProgressData[oldIdx];\n              var previousEndAngle = previousProgress ? previousProgress.shape.endAngle : startAngle;\n              var progress = createProgress(newIdx, previousEndAngle);\n              var isClip = progressModel.get('clip');\n              updateProps(progress, {\n                shape: {\n                  endAngle: linearMap(val, valueExtent, angleExtent, isClip)\n                }\n              }, seriesModel);\n              group.add(progress);\n              // Add data index and series index for indexing the data by element\n              // Useful in tooltip\n              setCommonECData(seriesModel.seriesIndex, data.dataType, newIdx, progress);\n              progressList[newIdx] = progress;\n            }\n          }).execute();\n          data.each(function (idx) {\n            var itemModel = data.getItemModel(idx);\n            var emphasisModel = itemModel.getModel('emphasis');\n            var focus = emphasisModel.get('focus');\n            var blurScope = emphasisModel.get('blurScope');\n            var emphasisDisabled = emphasisModel.get('disabled');\n            if (showPointer) {\n              var pointer = data.getItemGraphicEl(idx);\n              var symbolStyle = data.getItemVisual(idx, 'style');\n              var visualColor = symbolStyle.fill;\n              if (pointer instanceof ZRImage) {\n                var pathStyle = pointer.style;\n                pointer.useStyle(extend({\n                  image: pathStyle.image,\n                  x: pathStyle.x,\n                  y: pathStyle.y,\n                  width: pathStyle.width,\n                  height: pathStyle.height\n                }, symbolStyle));\n              } else {\n                pointer.useStyle(symbolStyle);\n                pointer.type !== 'pointer' && pointer.setColor(visualColor);\n              }\n              pointer.setStyle(itemModel.getModel(['pointer', 'itemStyle']).getItemStyle());\n              if (pointer.style.fill === 'auto') {\n                pointer.setStyle('fill', getColor(linearMap(data.get(valueDim, idx), valueExtent, [0, 1], true)));\n              }\n              pointer.z2EmphasisLift = 0;\n              setStatesStylesFromModel(pointer, itemModel);\n              toggleHoverEmphasis(pointer, focus, blurScope, emphasisDisabled);\n            }\n            if (showProgress) {\n              var progress = progressList[idx];\n              progress.useStyle(data.getItemVisual(idx, 'style'));\n              progress.setStyle(itemModel.getModel(['progress', 'itemStyle']).getItemStyle());\n              progress.z2EmphasisLift = 0;\n              setStatesStylesFromModel(progress, itemModel);\n              toggleHoverEmphasis(progress, focus, blurScope, emphasisDisabled);\n            }\n          });\n          this._progressEls = progressList;\n        }\n      };\n      GaugeView.prototype._renderAnchor = function (seriesModel, posInfo) {\n        var anchorModel = seriesModel.getModel('anchor');\n        var showAnchor = anchorModel.get('show');\n        if (showAnchor) {\n          var anchorSize = anchorModel.get('size');\n          var anchorType = anchorModel.get('icon');\n          var offsetCenter = anchorModel.get('offsetCenter');\n          var anchorKeepAspect = anchorModel.get('keepAspect');\n          var anchor = createSymbol(anchorType, posInfo.cx - anchorSize / 2 + parsePercent$1(offsetCenter[0], posInfo.r), posInfo.cy - anchorSize / 2 + parsePercent$1(offsetCenter[1], posInfo.r), anchorSize, anchorSize, null, anchorKeepAspect);\n          anchor.z2 = anchorModel.get('showAbove') ? 1 : 0;\n          anchor.setStyle(anchorModel.getModel('itemStyle').getItemStyle());\n          this.group.add(anchor);\n        }\n      };\n      GaugeView.prototype._renderTitleAndDetail = function (seriesModel, ecModel, api, getColor, posInfo) {\n        var _this = this;\n        var data = seriesModel.getData();\n        var valueDim = data.mapDimension('value');\n        var minVal = +seriesModel.get('min');\n        var maxVal = +seriesModel.get('max');\n        var contentGroup = new Group();\n        var newTitleEls = [];\n        var newDetailEls = [];\n        var hasAnimation = seriesModel.isAnimationEnabled();\n        var showPointerAbove = seriesModel.get(['pointer', 'showAbove']);\n        data.diff(this._data).add(function (idx) {\n          newTitleEls[idx] = new ZRText({\n            silent: true\n          });\n          newDetailEls[idx] = new ZRText({\n            silent: true\n          });\n        }).update(function (idx, oldIdx) {\n          newTitleEls[idx] = _this._titleEls[oldIdx];\n          newDetailEls[idx] = _this._detailEls[oldIdx];\n        }).execute();\n        data.each(function (idx) {\n          var itemModel = data.getItemModel(idx);\n          var value = data.get(valueDim, idx);\n          var itemGroup = new Group();\n          var autoColor = getColor(linearMap(value, [minVal, maxVal], [0, 1], true));\n          var itemTitleModel = itemModel.getModel('title');\n          if (itemTitleModel.get('show')) {\n            var titleOffsetCenter = itemTitleModel.get('offsetCenter');\n            var titleX = posInfo.cx + parsePercent$1(titleOffsetCenter[0], posInfo.r);\n            var titleY = posInfo.cy + parsePercent$1(titleOffsetCenter[1], posInfo.r);\n            var labelEl = newTitleEls[idx];\n            labelEl.attr({\n              z2: showPointerAbove ? 0 : 2,\n              style: createTextStyle(itemTitleModel, {\n                x: titleX,\n                y: titleY,\n                text: data.getName(idx),\n                align: 'center',\n                verticalAlign: 'middle'\n              }, {\n                inheritColor: autoColor\n              })\n            });\n            itemGroup.add(labelEl);\n          }\n          var itemDetailModel = itemModel.getModel('detail');\n          if (itemDetailModel.get('show')) {\n            var detailOffsetCenter = itemDetailModel.get('offsetCenter');\n            var detailX = posInfo.cx + parsePercent$1(detailOffsetCenter[0], posInfo.r);\n            var detailY = posInfo.cy + parsePercent$1(detailOffsetCenter[1], posInfo.r);\n            var width = parsePercent$1(itemDetailModel.get('width'), posInfo.r);\n            var height = parsePercent$1(itemDetailModel.get('height'), posInfo.r);\n            var detailColor = seriesModel.get(['progress', 'show']) ? data.getItemVisual(idx, 'style').fill : autoColor;\n            var labelEl = newDetailEls[idx];\n            var formatter_1 = itemDetailModel.get('formatter');\n            labelEl.attr({\n              z2: showPointerAbove ? 0 : 2,\n              style: createTextStyle(itemDetailModel, {\n                x: detailX,\n                y: detailY,\n                text: formatLabel(value, formatter_1),\n                width: isNaN(width) ? null : width,\n                height: isNaN(height) ? null : height,\n                align: 'center',\n                verticalAlign: 'middle'\n              }, {\n                inheritColor: detailColor\n              })\n            });\n            setLabelValueAnimation(labelEl, {\n              normal: itemDetailModel\n            }, value, function (value) {\n              return formatLabel(value, formatter_1);\n            });\n            hasAnimation && animateLabelValue(labelEl, idx, data, seriesModel, {\n              getFormattedLabel: function (labelDataIndex, status, dataType, labelDimIndex, fmt, extendParams) {\n                return formatLabel(extendParams ? extendParams.interpolatedValue : value, formatter_1);\n              }\n            });\n            itemGroup.add(labelEl);\n          }\n          contentGroup.add(itemGroup);\n        });\n        this.group.add(contentGroup);\n        this._titleEls = newTitleEls;\n        this._detailEls = newDetailEls;\n      };\n      GaugeView.type = 'gauge';\n      return GaugeView;\n    }(ChartView);\n\n    var GaugeSeriesModel = /** @class */function (_super) {\n      __extends(GaugeSeriesModel, _super);\n      function GaugeSeriesModel() {\n        var _this = _super !== null && _super.apply(this, arguments) || this;\n        _this.type = GaugeSeriesModel.type;\n        _this.visualStyleAccessPath = 'itemStyle';\n        return _this;\n      }\n      GaugeSeriesModel.prototype.getInitialData = function (option, ecModel) {\n        return createSeriesDataSimply(this, ['value']);\n      };\n      GaugeSeriesModel.type = 'series.gauge';\n      GaugeSeriesModel.defaultOption = {\n        // zlevel: 0,\n        z: 2,\n        colorBy: 'data',\n        // 默认全局居中\n        center: ['50%', '50%'],\n        legendHoverLink: true,\n        radius: '75%',\n        startAngle: 225,\n        endAngle: -45,\n        clockwise: true,\n        // 最小值\n        min: 0,\n        // 最大值\n        max: 100,\n        // 分割段数，默认为10\n        splitNumber: 10,\n        // 坐标轴线\n        axisLine: {\n          // 默认显示，属性show控制显示与否\n          show: true,\n          roundCap: false,\n          lineStyle: {\n            color: [[1, '#E6EBF8']],\n            width: 10\n          }\n        },\n        // 坐标轴线\n        progress: {\n          // 默认显示，属性show控制显示与否\n          show: false,\n          overlap: true,\n          width: 10,\n          roundCap: false,\n          clip: true\n        },\n        // 分隔线\n        splitLine: {\n          // 默认显示，属性show控制显示与否\n          show: true,\n          // 属性length控制线长\n          length: 10,\n          distance: 10,\n          // 属性lineStyle（详见lineStyle）控制线条样式\n          lineStyle: {\n            color: '#63677A',\n            width: 3,\n            type: 'solid'\n          }\n        },\n        // 坐标轴小标记\n        axisTick: {\n          // 属性show控制显示与否，默认不显示\n          show: true,\n          // 每份split细分多少段\n          splitNumber: 5,\n          // 属性length控制线长\n          length: 6,\n          distance: 10,\n          // 属性lineStyle控制线条样式\n          lineStyle: {\n            color: '#63677A',\n            width: 1,\n            type: 'solid'\n          }\n        },\n        axisLabel: {\n          show: true,\n          distance: 15,\n          // formatter: null,\n          color: '#464646',\n          fontSize: 12,\n          rotate: 0\n        },\n        pointer: {\n          icon: null,\n          offsetCenter: [0, 0],\n          show: true,\n          showAbove: true,\n          length: '60%',\n          width: 6,\n          keepAspect: false\n        },\n        anchor: {\n          show: false,\n          showAbove: false,\n          size: 6,\n          icon: 'circle',\n          offsetCenter: [0, 0],\n          keepAspect: false,\n          itemStyle: {\n            color: '#fff',\n            borderWidth: 0,\n            borderColor: '#5470c6'\n          }\n        },\n        title: {\n          show: true,\n          // x, y，单位px\n          offsetCenter: [0, '20%'],\n          // 其余属性默认使用全局文本样式，详见TEXTSTYLE\n          color: '#464646',\n          fontSize: 16,\n          valueAnimation: false\n        },\n        detail: {\n          show: true,\n          backgroundColor: 'rgba(0,0,0,0)',\n          borderWidth: 0,\n          borderColor: '#ccc',\n          width: 100,\n          height: null,\n          padding: [5, 10],\n          // x, y，单位px\n          offsetCenter: [0, '40%'],\n          // formatter: null,\n          // 其余属性默认使用全局文本样式，详见TEXTSTYLE\n          color: '#464646',\n          fontSize: 30,\n          fontWeight: 'bold',\n          lineHeight: 30,\n          valueAnimation: false\n        }\n      };\n      return GaugeSeriesModel;\n    }(SeriesModel);\n\n    function install$e(registers) {\n      registers.registerChartView(GaugeView);\n      registers.registerSeriesModel(GaugeSeriesModel);\n    }\n\n    var opacityAccessPath = ['itemStyle', 'opacity'];\n    /**\r\n     * Piece of pie including Sector, Label, LabelLine\r\n     */\n    var FunnelPiece = /** @class */function (_super) {\n      __extends(FunnelPiece, _super);\n      function FunnelPiece(data, idx) {\n        var _this = _super.call(this) || this;\n        var polygon = _this;\n        var labelLine = new Polyline();\n        var text = new ZRText();\n        polygon.setTextContent(text);\n        _this.setTextGuideLine(labelLine);\n        _this.updateData(data, idx, true);\n        return _this;\n      }\n      FunnelPiece.prototype.updateData = function (data, idx, firstCreate) {\n        var polygon = this;\n        var seriesModel = data.hostModel;\n        var itemModel = data.getItemModel(idx);\n        var layout = data.getItemLayout(idx);\n        var emphasisModel = itemModel.getModel('emphasis');\n        var opacity = itemModel.get(opacityAccessPath);\n        opacity = opacity == null ? 1 : opacity;\n        if (!firstCreate) {\n          saveOldStyle(polygon);\n        }\n        // Update common style\n        polygon.useStyle(data.getItemVisual(idx, 'style'));\n        polygon.style.lineJoin = 'round';\n        if (firstCreate) {\n          polygon.setShape({\n            points: layout.points\n          });\n          polygon.style.opacity = 0;\n          initProps(polygon, {\n            style: {\n              opacity: opacity\n            }\n          }, seriesModel, idx);\n        } else {\n          updateProps(polygon, {\n            style: {\n              opacity: opacity\n            },\n            shape: {\n              points: layout.points\n            }\n          }, seriesModel, idx);\n        }\n        setStatesStylesFromModel(polygon, itemModel);\n        this._updateLabel(data, idx);\n        toggleHoverEmphasis(this, emphasisModel.get('focus'), emphasisModel.get('blurScope'), emphasisModel.get('disabled'));\n      };\n      FunnelPiece.prototype._updateLabel = function (data, idx) {\n        var polygon = this;\n        var labelLine = this.getTextGuideLine();\n        var labelText = polygon.getTextContent();\n        var seriesModel = data.hostModel;\n        var itemModel = data.getItemModel(idx);\n        var layout = data.getItemLayout(idx);\n        var labelLayout = layout.label;\n        var style = data.getItemVisual(idx, 'style');\n        var visualColor = style.fill;\n        setLabelStyle(\n        // position will not be used in setLabelStyle\n        labelText, getLabelStatesModels(itemModel), {\n          labelFetcher: data.hostModel,\n          labelDataIndex: idx,\n          defaultOpacity: style.opacity,\n          defaultText: data.getName(idx)\n        }, {\n          normal: {\n            align: labelLayout.textAlign,\n            verticalAlign: labelLayout.verticalAlign\n          }\n        });\n        polygon.setTextConfig({\n          local: true,\n          inside: !!labelLayout.inside,\n          insideStroke: visualColor,\n          // insideFill: 'auto',\n          outsideFill: visualColor\n        });\n        var linePoints = labelLayout.linePoints;\n        labelLine.setShape({\n          points: linePoints\n        });\n        polygon.textGuideLineConfig = {\n          anchor: linePoints ? new Point(linePoints[0][0], linePoints[0][1]) : null\n        };\n        // Make sure update style on labelText after setLabelStyle.\n        // Because setLabelStyle will replace a new style on it.\n        updateProps(labelText, {\n          style: {\n            x: labelLayout.x,\n            y: labelLayout.y\n          }\n        }, seriesModel, idx);\n        labelText.attr({\n          rotation: labelLayout.rotation,\n          originX: labelLayout.x,\n          originY: labelLayout.y,\n          z2: 10\n        });\n        setLabelLineStyle(polygon, getLabelLineStatesModels(itemModel), {\n          // Default use item visual color\n          stroke: visualColor\n        });\n      };\n      return FunnelPiece;\n    }(Polygon);\n    var FunnelView = /** @class */function (_super) {\n      __extends(FunnelView, _super);\n      function FunnelView() {\n        var _this = _super !== null && _super.apply(this, arguments) || this;\n        _this.type = FunnelView.type;\n        _this.ignoreLabelLineUpdate = true;\n        return _this;\n      }\n      FunnelView.prototype.render = function (seriesModel, ecModel, api) {\n        var data = seriesModel.getData();\n        var oldData = this._data;\n        var group = this.group;\n        data.diff(oldData).add(function (idx) {\n          var funnelPiece = new FunnelPiece(data, idx);\n          data.setItemGraphicEl(idx, funnelPiece);\n          group.add(funnelPiece);\n        }).update(function (newIdx, oldIdx) {\n          var piece = oldData.getItemGraphicEl(oldIdx);\n          piece.updateData(data, newIdx);\n          group.add(piece);\n          data.setItemGraphicEl(newIdx, piece);\n        }).remove(function (idx) {\n          var piece = oldData.getItemGraphicEl(idx);\n          removeElementWithFadeOut(piece, seriesModel, idx);\n        }).execute();\n        this._data = data;\n      };\n      FunnelView.prototype.remove = function () {\n        this.group.removeAll();\n        this._data = null;\n      };\n      FunnelView.prototype.dispose = function () {};\n      FunnelView.type = 'funnel';\n      return FunnelView;\n    }(ChartView);\n\n    var FunnelSeriesModel = /** @class */function (_super) {\n      __extends(FunnelSeriesModel, _super);\n      function FunnelSeriesModel() {\n        var _this = _super !== null && _super.apply(this, arguments) || this;\n        _this.type = FunnelSeriesModel.type;\n        return _this;\n      }\n      FunnelSeriesModel.prototype.init = function (option) {\n        _super.prototype.init.apply(this, arguments);\n        // Enable legend selection for each data item\n        // Use a function instead of direct access because data reference may changed\n        this.legendVisualProvider = new LegendVisualProvider(bind(this.getData, this), bind(this.getRawData, this));\n        // Extend labelLine emphasis\n        this._defaultLabelLine(option);\n      };\n      FunnelSeriesModel.prototype.getInitialData = function (option, ecModel) {\n        return createSeriesDataSimply(this, {\n          coordDimensions: ['value'],\n          encodeDefaulter: curry(makeSeriesEncodeForNameBased, this)\n        });\n      };\n      FunnelSeriesModel.prototype._defaultLabelLine = function (option) {\n        // Extend labelLine emphasis\n        defaultEmphasis(option, 'labelLine', ['show']);\n        var labelLineNormalOpt = option.labelLine;\n        var labelLineEmphasisOpt = option.emphasis.labelLine;\n        // Not show label line if `label.normal.show = false`\n        labelLineNormalOpt.show = labelLineNormalOpt.show && option.label.show;\n        labelLineEmphasisOpt.show = labelLineEmphasisOpt.show && option.emphasis.label.show;\n      };\n      // Overwrite\n      FunnelSeriesModel.prototype.getDataParams = function (dataIndex) {\n        var data = this.getData();\n        var params = _super.prototype.getDataParams.call(this, dataIndex);\n        var valueDim = data.mapDimension('value');\n        var sum = data.getSum(valueDim);\n        // Percent is 0 if sum is 0\n        params.percent = !sum ? 0 : +(data.get(valueDim, dataIndex) / sum * 100).toFixed(2);\n        params.$vars.push('percent');\n        return params;\n      };\n      FunnelSeriesModel.type = 'series.funnel';\n      FunnelSeriesModel.defaultOption = {\n        // zlevel: 0,                  // 一级层叠\n        z: 2,\n        legendHoverLink: true,\n        colorBy: 'data',\n        left: 80,\n        top: 60,\n        right: 80,\n        bottom: 60,\n        // width: {totalWidth} - left - right,\n        // height: {totalHeight} - top - bottom,\n        // 默认取数据最小最大值\n        // min: 0,\n        // max: 100,\n        minSize: '0%',\n        maxSize: '100%',\n        sort: 'descending',\n        orient: 'vertical',\n        gap: 0,\n        funnelAlign: 'center',\n        label: {\n          show: true,\n          position: 'outer'\n          // formatter: 标签文本格式器，同Tooltip.formatter，不支持异步回调\n        },\n        labelLine: {\n          show: true,\n          length: 20,\n          lineStyle: {\n            // color: 各异,\n            width: 1\n          }\n        },\n        itemStyle: {\n          // color: 各异,\n          borderColor: '#fff',\n          borderWidth: 1\n        },\n        emphasis: {\n          label: {\n            show: true\n          }\n        },\n        select: {\n          itemStyle: {\n            borderColor: '#212121'\n          }\n        }\n      };\n      return FunnelSeriesModel;\n    }(SeriesModel);\n\n    function getViewRect$3(seriesModel, api) {\n      return getLayoutRect(seriesModel.getBoxLayoutParams(), {\n        width: api.getWidth(),\n        height: api.getHeight()\n      });\n    }\n    function getSortedIndices(data, sort) {\n      var valueDim = data.mapDimension('value');\n      var valueArr = data.mapArray(valueDim, function (val) {\n        return val;\n      });\n      var indices = [];\n      var isAscending = sort === 'ascending';\n      for (var i = 0, len = data.count(); i < len; i++) {\n        indices[i] = i;\n      }\n      // Add custom sortable function & none sortable opetion by \"options.sort\"\n      if (isFunction(sort)) {\n        indices.sort(sort);\n      } else if (sort !== 'none') {\n        indices.sort(function (a, b) {\n          return isAscending ? valueArr[a] - valueArr[b] : valueArr[b] - valueArr[a];\n        });\n      }\n      return indices;\n    }\n    function labelLayout(data) {\n      var seriesModel = data.hostModel;\n      var orient = seriesModel.get('orient');\n      data.each(function (idx) {\n        var itemModel = data.getItemModel(idx);\n        var labelModel = itemModel.getModel('label');\n        var labelPosition = labelModel.get('position');\n        var labelLineModel = itemModel.getModel('labelLine');\n        var layout = data.getItemLayout(idx);\n        var points = layout.points;\n        var isLabelInside = labelPosition === 'inner' || labelPosition === 'inside' || labelPosition === 'center' || labelPosition === 'insideLeft' || labelPosition === 'insideRight';\n        var textAlign;\n        var textX;\n        var textY;\n        var linePoints;\n        if (isLabelInside) {\n          if (labelPosition === 'insideLeft') {\n            textX = (points[0][0] + points[3][0]) / 2 + 5;\n            textY = (points[0][1] + points[3][1]) / 2;\n            textAlign = 'left';\n          } else if (labelPosition === 'insideRight') {\n            textX = (points[1][0] + points[2][0]) / 2 - 5;\n            textY = (points[1][1] + points[2][1]) / 2;\n            textAlign = 'right';\n          } else {\n            textX = (points[0][0] + points[1][0] + points[2][0] + points[3][0]) / 4;\n            textY = (points[0][1] + points[1][1] + points[2][1] + points[3][1]) / 4;\n            textAlign = 'center';\n          }\n          linePoints = [[textX, textY], [textX, textY]];\n        } else {\n          var x1 = void 0;\n          var y1 = void 0;\n          var x2 = void 0;\n          var y2 = void 0;\n          var labelLineLen = labelLineModel.get('length');\n          if (\"development\" !== 'production') {\n            if (orient === 'vertical' && ['top', 'bottom'].indexOf(labelPosition) > -1) {\n              labelPosition = 'left';\n              console.warn('Position error: Funnel chart on vertical orient dose not support top and bottom.');\n            }\n            if (orient === 'horizontal' && ['left', 'right'].indexOf(labelPosition) > -1) {\n              labelPosition = 'bottom';\n              console.warn('Position error: Funnel chart on horizontal orient dose not support left and right.');\n            }\n          }\n          if (labelPosition === 'left') {\n            // Left side\n            x1 = (points[3][0] + points[0][0]) / 2;\n            y1 = (points[3][1] + points[0][1]) / 2;\n            x2 = x1 - labelLineLen;\n            textX = x2 - 5;\n            textAlign = 'right';\n          } else if (labelPosition === 'right') {\n            // Right side\n            x1 = (points[1][0] + points[2][0]) / 2;\n            y1 = (points[1][1] + points[2][1]) / 2;\n            x2 = x1 + labelLineLen;\n            textX = x2 + 5;\n            textAlign = 'left';\n          } else if (labelPosition === 'top') {\n            // Top side\n            x1 = (points[3][0] + points[0][0]) / 2;\n            y1 = (points[3][1] + points[0][1]) / 2;\n            y2 = y1 - labelLineLen;\n            textY = y2 - 5;\n            textAlign = 'center';\n          } else if (labelPosition === 'bottom') {\n            // Bottom side\n            x1 = (points[1][0] + points[2][0]) / 2;\n            y1 = (points[1][1] + points[2][1]) / 2;\n            y2 = y1 + labelLineLen;\n            textY = y2 + 5;\n            textAlign = 'center';\n          } else if (labelPosition === 'rightTop') {\n            // RightTop side\n            x1 = orient === 'horizontal' ? points[3][0] : points[1][0];\n            y1 = orient === 'horizontal' ? points[3][1] : points[1][1];\n            if (orient === 'horizontal') {\n              y2 = y1 - labelLineLen;\n              textY = y2 - 5;\n              textAlign = 'center';\n            } else {\n              x2 = x1 + labelLineLen;\n              textX = x2 + 5;\n              textAlign = 'top';\n            }\n          } else if (labelPosition === 'rightBottom') {\n            // RightBottom side\n            x1 = points[2][0];\n            y1 = points[2][1];\n            if (orient === 'horizontal') {\n              y2 = y1 + labelLineLen;\n              textY = y2 + 5;\n              textAlign = 'center';\n            } else {\n              x2 = x1 + labelLineLen;\n              textX = x2 + 5;\n              textAlign = 'bottom';\n            }\n          } else if (labelPosition === 'leftTop') {\n            // LeftTop side\n            x1 = points[0][0];\n            y1 = orient === 'horizontal' ? points[0][1] : points[1][1];\n            if (orient === 'horizontal') {\n              y2 = y1 - labelLineLen;\n              textY = y2 - 5;\n              textAlign = 'center';\n            } else {\n              x2 = x1 - labelLineLen;\n              textX = x2 - 5;\n              textAlign = 'right';\n            }\n          } else if (labelPosition === 'leftBottom') {\n            // LeftBottom side\n            x1 = orient === 'horizontal' ? points[1][0] : points[3][0];\n            y1 = orient === 'horizontal' ? points[1][1] : points[2][1];\n            if (orient === 'horizontal') {\n              y2 = y1 + labelLineLen;\n              textY = y2 + 5;\n              textAlign = 'center';\n            } else {\n              x2 = x1 - labelLineLen;\n              textX = x2 - 5;\n              textAlign = 'right';\n            }\n          } else {\n            // Right side or Bottom side\n            x1 = (points[1][0] + points[2][0]) / 2;\n            y1 = (points[1][1] + points[2][1]) / 2;\n            if (orient === 'horizontal') {\n              y2 = y1 + labelLineLen;\n              textY = y2 + 5;\n              textAlign = 'center';\n            } else {\n              x2 = x1 + labelLineLen;\n              textX = x2 + 5;\n              textAlign = 'left';\n            }\n          }\n          if (orient === 'horizontal') {\n            x2 = x1;\n            textX = x2;\n          } else {\n            y2 = y1;\n            textY = y2;\n          }\n          linePoints = [[x1, y1], [x2, y2]];\n        }\n        layout.label = {\n          linePoints: linePoints,\n          x: textX,\n          y: textY,\n          verticalAlign: 'middle',\n          textAlign: textAlign,\n          inside: isLabelInside\n        };\n      });\n    }\n    function funnelLayout(ecModel, api) {\n      ecModel.eachSeriesByType('funnel', function (seriesModel) {\n        var data = seriesModel.getData();\n        var valueDim = data.mapDimension('value');\n        var sort = seriesModel.get('sort');\n        var viewRect = getViewRect$3(seriesModel, api);\n        var orient = seriesModel.get('orient');\n        var viewWidth = viewRect.width;\n        var viewHeight = viewRect.height;\n        var indices = getSortedIndices(data, sort);\n        var x = viewRect.x;\n        var y = viewRect.y;\n        var sizeExtent = orient === 'horizontal' ? [parsePercent$1(seriesModel.get('minSize'), viewHeight), parsePercent$1(seriesModel.get('maxSize'), viewHeight)] : [parsePercent$1(seriesModel.get('minSize'), viewWidth), parsePercent$1(seriesModel.get('maxSize'), viewWidth)];\n        var dataExtent = data.getDataExtent(valueDim);\n        var min = seriesModel.get('min');\n        var max = seriesModel.get('max');\n        if (min == null) {\n          min = Math.min(dataExtent[0], 0);\n        }\n        if (max == null) {\n          max = dataExtent[1];\n        }\n        var funnelAlign = seriesModel.get('funnelAlign');\n        var gap = seriesModel.get('gap');\n        var viewSize = orient === 'horizontal' ? viewWidth : viewHeight;\n        var itemSize = (viewSize - gap * (data.count() - 1)) / data.count();\n        var getLinePoints = function (idx, offset) {\n          // End point index is data.count() and we assign it 0\n          if (orient === 'horizontal') {\n            var val_1 = data.get(valueDim, idx) || 0;\n            var itemHeight = linearMap(val_1, [min, max], sizeExtent, true);\n            var y0 = void 0;\n            switch (funnelAlign) {\n              case 'top':\n                y0 = y;\n                break;\n              case 'center':\n                y0 = y + (viewHeight - itemHeight) / 2;\n                break;\n              case 'bottom':\n                y0 = y + (viewHeight - itemHeight);\n                break;\n            }\n            return [[offset, y0], [offset, y0 + itemHeight]];\n          }\n          var val = data.get(valueDim, idx) || 0;\n          var itemWidth = linearMap(val, [min, max], sizeExtent, true);\n          var x0;\n          switch (funnelAlign) {\n            case 'left':\n              x0 = x;\n              break;\n            case 'center':\n              x0 = x + (viewWidth - itemWidth) / 2;\n              break;\n            case 'right':\n              x0 = x + viewWidth - itemWidth;\n              break;\n          }\n          return [[x0, offset], [x0 + itemWidth, offset]];\n        };\n        if (sort === 'ascending') {\n          // From bottom to top\n          itemSize = -itemSize;\n          gap = -gap;\n          if (orient === 'horizontal') {\n            x += viewWidth;\n          } else {\n            y += viewHeight;\n          }\n          indices = indices.reverse();\n        }\n        for (var i = 0; i < indices.length; i++) {\n          var idx = indices[i];\n          var nextIdx = indices[i + 1];\n          var itemModel = data.getItemModel(idx);\n          if (orient === 'horizontal') {\n            var width = itemModel.get(['itemStyle', 'width']);\n            if (width == null) {\n              width = itemSize;\n            } else {\n              width = parsePercent$1(width, viewWidth);\n              if (sort === 'ascending') {\n                width = -width;\n              }\n            }\n            var start = getLinePoints(idx, x);\n            var end = getLinePoints(nextIdx, x + width);\n            x += width + gap;\n            data.setItemLayout(idx, {\n              points: start.concat(end.slice().reverse())\n            });\n          } else {\n            var height = itemModel.get(['itemStyle', 'height']);\n            if (height == null) {\n              height = itemSize;\n            } else {\n              height = parsePercent$1(height, viewHeight);\n              if (sort === 'ascending') {\n                height = -height;\n              }\n            }\n            var start = getLinePoints(idx, y);\n            var end = getLinePoints(nextIdx, y + height);\n            y += height + gap;\n            data.setItemLayout(idx, {\n              points: start.concat(end.slice().reverse())\n            });\n          }\n        }\n        labelLayout(data);\n      });\n    }\n\n    function install$f(registers) {\n      registers.registerChartView(FunnelView);\n      registers.registerSeriesModel(FunnelSeriesModel);\n      registers.registerLayout(funnelLayout);\n      registers.registerProcessor(dataFilter('funnel'));\n    }\n\n    var DEFAULT_SMOOTH = 0.3;\n    var ParallelView = /** @class */function (_super) {\n      __extends(ParallelView, _super);\n      function ParallelView() {\n        var _this = _super !== null && _super.apply(this, arguments) || this;\n        _this.type = ParallelView.type;\n        _this._dataGroup = new Group();\n        _this._initialized = false;\n        return _this;\n      }\n      ParallelView.prototype.init = function () {\n        this.group.add(this._dataGroup);\n      };\n      /**\r\n       * @override\r\n       */\n      ParallelView.prototype.render = function (seriesModel, ecModel, api, payload) {\n        // Clear previously rendered progressive elements.\n        this._progressiveEls = null;\n        var dataGroup = this._dataGroup;\n        var data = seriesModel.getData();\n        var oldData = this._data;\n        var coordSys = seriesModel.coordinateSystem;\n        var dimensions = coordSys.dimensions;\n        var seriesScope = makeSeriesScope$2(seriesModel);\n        data.diff(oldData).add(add).update(update).remove(remove).execute();\n        function add(newDataIndex) {\n          var line = addEl(data, dataGroup, newDataIndex, dimensions, coordSys);\n          updateElCommon(line, data, newDataIndex, seriesScope);\n        }\n        function update(newDataIndex, oldDataIndex) {\n          var line = oldData.getItemGraphicEl(oldDataIndex);\n          var points = createLinePoints(data, newDataIndex, dimensions, coordSys);\n          data.setItemGraphicEl(newDataIndex, line);\n          updateProps(line, {\n            shape: {\n              points: points\n            }\n          }, seriesModel, newDataIndex);\n          saveOldStyle(line);\n          updateElCommon(line, data, newDataIndex, seriesScope);\n        }\n        function remove(oldDataIndex) {\n          var line = oldData.getItemGraphicEl(oldDataIndex);\n          dataGroup.remove(line);\n        }\n        // First create\n        if (!this._initialized) {\n          this._initialized = true;\n          var clipPath = createGridClipShape(coordSys, seriesModel, function () {\n            // Callback will be invoked immediately if there is no animation\n            setTimeout(function () {\n              dataGroup.removeClipPath();\n            });\n          });\n          dataGroup.setClipPath(clipPath);\n        }\n        this._data = data;\n      };\n      ParallelView.prototype.incrementalPrepareRender = function (seriesModel, ecModel, api) {\n        this._initialized = true;\n        this._data = null;\n        this._dataGroup.removeAll();\n      };\n      ParallelView.prototype.incrementalRender = function (taskParams, seriesModel, ecModel) {\n        var data = seriesModel.getData();\n        var coordSys = seriesModel.coordinateSystem;\n        var dimensions = coordSys.dimensions;\n        var seriesScope = makeSeriesScope$2(seriesModel);\n        var progressiveEls = this._progressiveEls = [];\n        for (var dataIndex = taskParams.start; dataIndex < taskParams.end; dataIndex++) {\n          var line = addEl(data, this._dataGroup, dataIndex, dimensions, coordSys);\n          line.incremental = true;\n          updateElCommon(line, data, dataIndex, seriesScope);\n          progressiveEls.push(line);\n        }\n      };\n      ParallelView.prototype.remove = function () {\n        this._dataGroup && this._dataGroup.removeAll();\n        this._data = null;\n      };\n      ParallelView.type = 'parallel';\n      return ParallelView;\n    }(ChartView);\n    function createGridClipShape(coordSys, seriesModel, cb) {\n      var parallelModel = coordSys.model;\n      var rect = coordSys.getRect();\n      var rectEl = new Rect({\n        shape: {\n          x: rect.x,\n          y: rect.y,\n          width: rect.width,\n          height: rect.height\n        }\n      });\n      var dim = parallelModel.get('layout') === 'horizontal' ? 'width' : 'height';\n      rectEl.setShape(dim, 0);\n      initProps(rectEl, {\n        shape: {\n          width: rect.width,\n          height: rect.height\n        }\n      }, seriesModel, cb);\n      return rectEl;\n    }\n    function createLinePoints(data, dataIndex, dimensions, coordSys) {\n      var points = [];\n      for (var i = 0; i < dimensions.length; i++) {\n        var dimName = dimensions[i];\n        var value = data.get(data.mapDimension(dimName), dataIndex);\n        if (!isEmptyValue(value, coordSys.getAxis(dimName).type)) {\n          points.push(coordSys.dataToPoint(value, dimName));\n        }\n      }\n      return points;\n    }\n    function addEl(data, dataGroup, dataIndex, dimensions, coordSys) {\n      var points = createLinePoints(data, dataIndex, dimensions, coordSys);\n      var line = new Polyline({\n        shape: {\n          points: points\n        },\n        // silent: true,\n        z2: 10\n      });\n      dataGroup.add(line);\n      data.setItemGraphicEl(dataIndex, line);\n      return line;\n    }\n    function makeSeriesScope$2(seriesModel) {\n      var smooth = seriesModel.get('smooth', true);\n      smooth === true && (smooth = DEFAULT_SMOOTH);\n      smooth = numericToNumber(smooth);\n      eqNaN(smooth) && (smooth = 0);\n      return {\n        smooth: smooth\n      };\n    }\n    function updateElCommon(el, data, dataIndex, seriesScope) {\n      el.useStyle(data.getItemVisual(dataIndex, 'style'));\n      el.style.fill = null;\n      el.setShape('smooth', seriesScope.smooth);\n      var itemModel = data.getItemModel(dataIndex);\n      var emphasisModel = itemModel.getModel('emphasis');\n      setStatesStylesFromModel(el, itemModel, 'lineStyle');\n      toggleHoverEmphasis(el, emphasisModel.get('focus'), emphasisModel.get('blurScope'), emphasisModel.get('disabled'));\n    }\n    // function simpleDiff(oldData, newData, dimensions) {\n    //     let oldLen;\n    //     if (!oldData\n    //         || !oldData.__plProgressive\n    //         || (oldLen = oldData.count()) !== newData.count()\n    //     ) {\n    //         return true;\n    //     }\n    //     let dimLen = dimensions.length;\n    //     for (let i = 0; i < oldLen; i++) {\n    //         for (let j = 0; j < dimLen; j++) {\n    //             if (oldData.get(dimensions[j], i) !== newData.get(dimensions[j], i)) {\n    //                 return true;\n    //             }\n    //         }\n    //     }\n    //     return false;\n    // }\n    // FIXME put in common util?\n    function isEmptyValue(val, axisType) {\n      return axisType === 'category' ? val == null : val == null || isNaN(val); // axisType === 'value'\n    }\n\n    var ParallelSeriesModel = /** @class */function (_super) {\n      __extends(ParallelSeriesModel, _super);\n      function ParallelSeriesModel() {\n        var _this = _super !== null && _super.apply(this, arguments) || this;\n        _this.type = ParallelSeriesModel.type;\n        _this.visualStyleAccessPath = 'lineStyle';\n        _this.visualDrawType = 'stroke';\n        return _this;\n      }\n      ParallelSeriesModel.prototype.getInitialData = function (option, ecModel) {\n        return createSeriesData(null, this, {\n          useEncodeDefaulter: bind(makeDefaultEncode, null, this)\n        });\n      };\n      /**\r\n       * User can get data raw indices on 'axisAreaSelected' event received.\r\n       *\r\n       * @return Raw indices\r\n       */\n      ParallelSeriesModel.prototype.getRawIndicesByActiveState = function (activeState) {\n        var coordSys = this.coordinateSystem;\n        var data = this.getData();\n        var indices = [];\n        coordSys.eachActiveState(data, function (theActiveState, dataIndex) {\n          if (activeState === theActiveState) {\n            indices.push(data.getRawIndex(dataIndex));\n          }\n        });\n        return indices;\n      };\n      ParallelSeriesModel.type = 'series.parallel';\n      ParallelSeriesModel.dependencies = ['parallel'];\n      ParallelSeriesModel.defaultOption = {\n        // zlevel: 0,\n        z: 2,\n        coordinateSystem: 'parallel',\n        parallelIndex: 0,\n        label: {\n          show: false\n        },\n        inactiveOpacity: 0.05,\n        activeOpacity: 1,\n        lineStyle: {\n          width: 1,\n          opacity: 0.45,\n          type: 'solid'\n        },\n        emphasis: {\n          label: {\n            show: false\n          }\n        },\n        progressive: 500,\n        smooth: false,\n        animationEasing: 'linear'\n      };\n      return ParallelSeriesModel;\n    }(SeriesModel);\n    function makeDefaultEncode(seriesModel) {\n      // The mapping of parallelAxis dimension to data dimension can\n      // be specified in parallelAxis.option.dim. For example, if\n      // parallelAxis.option.dim is 'dim3', it mapping to the third\n      // dimension of data. But `data.encode` has higher priority.\n      // Moreover, parallelModel.dimension should not be regarded as data\n      // dimensions. Consider dimensions = ['dim4', 'dim2', 'dim6'];\n      var parallelModel = seriesModel.ecModel.getComponent('parallel', seriesModel.get('parallelIndex'));\n      if (!parallelModel) {\n        return;\n      }\n      var encodeDefine = {};\n      each(parallelModel.dimensions, function (axisDim) {\n        var dataDimIndex = convertDimNameToNumber(axisDim);\n        encodeDefine[axisDim] = dataDimIndex;\n      });\n      return encodeDefine;\n    }\n    function convertDimNameToNumber(dimName) {\n      return +dimName.replace('dim', '');\n    }\n\n    /*\n    * Licensed to the Apache Software Foundation (ASF) under one\n    * or more contributor license agreements.  See the NOTICE file\n    * distributed with this work for additional information\n    * regarding copyright ownership.  The ASF licenses this file\n    * to you under the Apache License, Version 2.0 (the\n    * \"License\"); you may not use this file except in compliance\n    * with the License.  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,\n    * software distributed under the License is distributed on an\n    * \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\n    * KIND, either express or implied.  See the License for the\n    * specific language governing permissions and limitations\n    * under the License.\n    */\n\n\n    /**\n     * AUTO-GENERATED FILE. DO NOT MODIFY.\n     */\n\n    /*\r\n    * Licensed to the Apache Software Foundation (ASF) under one\r\n    * or more contributor license agreements.  See the NOTICE file\r\n    * distributed with this work for additional information\r\n    * regarding copyright ownership.  The ASF licenses this file\r\n    * to you under the Apache License, Version 2.0 (the\r\n    * \"License\"); you may not use this file except in compliance\r\n    * with the License.  You may obtain a copy of the License at\r\n    *\r\n    *   http://www.apache.org/licenses/LICENSE-2.0\r\n    *\r\n    * Unless required by applicable law or agreed to in writing,\r\n    * software distributed under the License is distributed on an\r\n    * \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\r\n    * KIND, either express or implied.  See the License for the\r\n    * specific language governing permissions and limitations\r\n    * under the License.\r\n    */\n    var opacityAccessPath$1 = ['lineStyle', 'opacity'];\n    var parallelVisual = {\n      seriesType: 'parallel',\n      reset: function (seriesModel, ecModel) {\n        var coordSys = seriesModel.coordinateSystem;\n        var opacityMap = {\n          normal: seriesModel.get(['lineStyle', 'opacity']),\n          active: seriesModel.get('activeOpacity'),\n          inactive: seriesModel.get('inactiveOpacity')\n        };\n        return {\n          progress: function (params, data) {\n            coordSys.eachActiveState(data, function (activeState, dataIndex) {\n              var opacity = opacityMap[activeState];\n              if (activeState === 'normal' && data.hasItemOption) {\n                var itemOpacity = data.getItemModel(dataIndex).get(opacityAccessPath$1, true);\n                itemOpacity != null && (opacity = itemOpacity);\n              }\n              var existsStyle = data.ensureUniqueItemVisual(dataIndex, 'style');\n              existsStyle.opacity = opacity;\n            }, params.start, params.end);\n          }\n        };\n      }\n    };\n\n    function parallelPreprocessor(option) {\n      createParallelIfNeeded(option);\n      mergeAxisOptionFromParallel(option);\n    }\n    /**\r\n     * Create a parallel coordinate if not exists.\r\n     * @inner\r\n     */\n    function createParallelIfNeeded(option) {\n      if (option.parallel) {\n        return;\n      }\n      var hasParallelSeries = false;\n      each(option.series, function (seriesOpt) {\n        if (seriesOpt && seriesOpt.type === 'parallel') {\n          hasParallelSeries = true;\n        }\n      });\n      if (hasParallelSeries) {\n        option.parallel = [{}];\n      }\n    }\n    /**\r\n     * Merge aixs definition from parallel option (if exists) to axis option.\r\n     * @inner\r\n     */\n    function mergeAxisOptionFromParallel(option) {\n      var axes = normalizeToArray(option.parallelAxis);\n      each(axes, function (axisOption) {\n        if (!isObject(axisOption)) {\n          return;\n        }\n        var parallelIndex = axisOption.parallelIndex || 0;\n        var parallelOption = normalizeToArray(option.parallel)[parallelIndex];\n        if (parallelOption && parallelOption.parallelAxisDefault) {\n          merge(axisOption, parallelOption.parallelAxisDefault, false);\n        }\n      });\n    }\n\n    var CLICK_THRESHOLD = 5; // > 4\n    var ParallelView$1 = /** @class */function (_super) {\n      __extends(ParallelView, _super);\n      function ParallelView() {\n        var _this = _super !== null && _super.apply(this, arguments) || this;\n        _this.type = ParallelView.type;\n        return _this;\n      }\n      ParallelView.prototype.render = function (parallelModel, ecModel, api) {\n        this._model = parallelModel;\n        this._api = api;\n        if (!this._handlers) {\n          this._handlers = {};\n          each(handlers, function (handler, eventName) {\n            api.getZr().on(eventName, this._handlers[eventName] = bind(handler, this));\n          }, this);\n        }\n        createOrUpdate(this, '_throttledDispatchExpand', parallelModel.get('axisExpandRate'), 'fixRate');\n      };\n      ParallelView.prototype.dispose = function (ecModel, api) {\n        clear(this, '_throttledDispatchExpand');\n        each(this._handlers, function (handler, eventName) {\n          api.getZr().off(eventName, handler);\n        });\n        this._handlers = null;\n      };\n      /**\r\n       * @internal\r\n       * @param {Object} [opt] If null, cancel the last action triggering for debounce.\r\n       */\n      ParallelView.prototype._throttledDispatchExpand = function (opt) {\n        this._dispatchExpand(opt);\n      };\n      /**\r\n       * @internal\r\n       */\n      ParallelView.prototype._dispatchExpand = function (opt) {\n        opt && this._api.dispatchAction(extend({\n          type: 'parallelAxisExpand'\n        }, opt));\n      };\n      ParallelView.type = 'parallel';\n      return ParallelView;\n    }(ComponentView);\n    var handlers = {\n      mousedown: function (e) {\n        if (checkTrigger(this, 'click')) {\n          this._mouseDownPoint = [e.offsetX, e.offsetY];\n        }\n      },\n      mouseup: function (e) {\n        var mouseDownPoint = this._mouseDownPoint;\n        if (checkTrigger(this, 'click') && mouseDownPoint) {\n          var point = [e.offsetX, e.offsetY];\n          var dist = Math.pow(mouseDownPoint[0] - point[0], 2) + Math.pow(mouseDownPoint[1] - point[1], 2);\n          if (dist > CLICK_THRESHOLD) {\n            return;\n          }\n          var result = this._model.coordinateSystem.getSlidedAxisExpandWindow([e.offsetX, e.offsetY]);\n          result.behavior !== 'none' && this._dispatchExpand({\n            axisExpandWindow: result.axisExpandWindow\n          });\n        }\n        this._mouseDownPoint = null;\n      },\n      mousemove: function (e) {\n        // Should do nothing when brushing.\n        if (this._mouseDownPoint || !checkTrigger(this, 'mousemove')) {\n          return;\n        }\n        var model = this._model;\n        var result = model.coordinateSystem.getSlidedAxisExpandWindow([e.offsetX, e.offsetY]);\n        var behavior = result.behavior;\n        behavior === 'jump' && this._throttledDispatchExpand.debounceNextCall(model.get('axisExpandDebounce'));\n        this._throttledDispatchExpand(behavior === 'none' ? null // Cancel the last trigger, in case that mouse slide out of the area quickly.\n        : {\n          axisExpandWindow: result.axisExpandWindow,\n          // Jumping uses animation, and sliding suppresses animation.\n          animation: behavior === 'jump' ? null : {\n            duration: 0 // Disable animation.\n          }\n        });\n      }\n    };\n    function checkTrigger(view, triggerOn) {\n      var model = view._model;\n      return model.get('axisExpandable') && model.get('axisExpandTriggerOn') === triggerOn;\n    }\n\n    var ParallelModel = /** @class */function (_super) {\n      __extends(ParallelModel, _super);\n      function ParallelModel() {\n        var _this = _super !== null && _super.apply(this, arguments) || this;\n        _this.type = ParallelModel.type;\n        return _this;\n      }\n      ParallelModel.prototype.init = function () {\n        _super.prototype.init.apply(this, arguments);\n        this.mergeOption({});\n      };\n      ParallelModel.prototype.mergeOption = function (newOption) {\n        var thisOption = this.option;\n        newOption && merge(thisOption, newOption, true);\n        this._initDimensions();\n      };\n      /**\r\n       * Whether series or axis is in this coordinate system.\r\n       */\n      ParallelModel.prototype.contains = function (model, ecModel) {\n        var parallelIndex = model.get('parallelIndex');\n        return parallelIndex != null && ecModel.getComponent('parallel', parallelIndex) === this;\n      };\n      ParallelModel.prototype.setAxisExpand = function (opt) {\n        each(['axisExpandable', 'axisExpandCenter', 'axisExpandCount', 'axisExpandWidth', 'axisExpandWindow'], function (name) {\n          if (opt.hasOwnProperty(name)) {\n            // @ts-ignore FIXME: why \"never\" inferred in this.option[name]?\n            this.option[name] = opt[name];\n          }\n        }, this);\n      };\n      ParallelModel.prototype._initDimensions = function () {\n        var dimensions = this.dimensions = [];\n        var parallelAxisIndex = this.parallelAxisIndex = [];\n        var axisModels = filter(this.ecModel.queryComponents({\n          mainType: 'parallelAxis'\n        }), function (axisModel) {\n          // Can not use this.contains here, because\n          // initialization has not been completed yet.\n          return (axisModel.get('parallelIndex') || 0) === this.componentIndex;\n        }, this);\n        each(axisModels, function (axisModel) {\n          dimensions.push('dim' + axisModel.get('dim'));\n          parallelAxisIndex.push(axisModel.componentIndex);\n        });\n      };\n      ParallelModel.type = 'parallel';\n      ParallelModel.dependencies = ['parallelAxis'];\n      ParallelModel.layoutMode = 'box';\n      ParallelModel.defaultOption = {\n        // zlevel: 0,\n        z: 0,\n        left: 80,\n        top: 60,\n        right: 80,\n        bottom: 60,\n        // width: {totalWidth} - left - right,\n        // height: {totalHeight} - top - bottom,\n        layout: 'horizontal',\n        // FIXME\n        // naming?\n        axisExpandable: false,\n        axisExpandCenter: null,\n        axisExpandCount: 0,\n        axisExpandWidth: 50,\n        axisExpandRate: 17,\n        axisExpandDebounce: 50,\n        // [out, in, jumpTarget]. In percentage. If use [null, 0.05], null means full.\n        // Do not doc to user until necessary.\n        axisExpandSlideTriggerArea: [-0.15, 0.05, 0.4],\n        axisExpandTriggerOn: 'click',\n        parallelAxisDefault: null\n      };\n      return ParallelModel;\n    }(ComponentModel);\n\n    var ParallelAxis = /** @class */function (_super) {\n      __extends(ParallelAxis, _super);\n      function ParallelAxis(dim, scale, coordExtent, axisType, axisIndex) {\n        var _this = _super.call(this, dim, scale, coordExtent) || this;\n        _this.type = axisType || 'value';\n        _this.axisIndex = axisIndex;\n        return _this;\n      }\n      ParallelAxis.prototype.isHorizontal = function () {\n        return this.coordinateSystem.getModel().get('layout') !== 'horizontal';\n      };\n      return ParallelAxis;\n    }(Axis);\n\n    /*\n    * Licensed to the Apache Software Foundation (ASF) under one\n    * or more contributor license agreements.  See the NOTICE file\n    * distributed with this work for additional information\n    * regarding copyright ownership.  The ASF licenses this file\n    * to you under the Apache License, Version 2.0 (the\n    * \"License\"); you may not use this file except in compliance\n    * with the License.  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,\n    * software distributed under the License is distributed on an\n    * \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\n    * KIND, either express or implied.  See the License for the\n    * specific language governing permissions and limitations\n    * under the License.\n    */\n\n\n    /**\n     * AUTO-GENERATED FILE. DO NOT MODIFY.\n     */\n\n    /*\r\n    * Licensed to the Apache Software Foundation (ASF) under one\r\n    * or more contributor license agreements.  See the NOTICE file\r\n    * distributed with this work for additional information\r\n    * regarding copyright ownership.  The ASF licenses this file\r\n    * to you under the Apache License, Version 2.0 (the\r\n    * \"License\"); you may not use this file except in compliance\r\n    * with the License.  You may obtain a copy of the License at\r\n    *\r\n    *   http://www.apache.org/licenses/LICENSE-2.0\r\n    *\r\n    * Unless required by applicable law or agreed to in writing,\r\n    * software distributed under the License is distributed on an\r\n    * \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\r\n    * KIND, either express or implied.  See the License for the\r\n    * specific language governing permissions and limitations\r\n    * under the License.\r\n    */\n    /**\r\n     * Calculate slider move result.\r\n     * Usage:\r\n     * (1) If both handle0 and handle1 are needed to be moved, set minSpan the same as\r\n     * maxSpan and the same as `Math.abs(handleEnd[1] - handleEnds[0])`.\r\n     * (2) If handle0 is forbidden to cross handle1, set minSpan as `0`.\r\n     *\r\n     * @param delta Move length.\r\n     * @param handleEnds handleEnds[0] can be bigger then handleEnds[1].\r\n     *              handleEnds will be modified in this method.\r\n     * @param extent handleEnds is restricted by extent.\r\n     *              extent[0] should less or equals than extent[1].\r\n     * @param handleIndex Can be 'all', means that both move the two handleEnds.\r\n     * @param minSpan The range of dataZoom can not be smaller than that.\r\n     *              If not set, handle0 and cross handle1. If set as a non-negative\r\n     *              number (including `0`), handles will push each other when reaching\r\n     *              the minSpan.\r\n     * @param maxSpan The range of dataZoom can not be larger than that.\r\n     * @return The input handleEnds.\r\n     */\n    function sliderMove(delta, handleEnds, extent, handleIndex, minSpan, maxSpan) {\n      delta = delta || 0;\n      var extentSpan = extent[1] - extent[0];\n      // Notice maxSpan and minSpan can be null/undefined.\n      if (minSpan != null) {\n        minSpan = restrict(minSpan, [0, extentSpan]);\n      }\n      if (maxSpan != null) {\n        maxSpan = Math.max(maxSpan, minSpan != null ? minSpan : 0);\n      }\n      if (handleIndex === 'all') {\n        var handleSpan = Math.abs(handleEnds[1] - handleEnds[0]);\n        handleSpan = restrict(handleSpan, [0, extentSpan]);\n        minSpan = maxSpan = restrict(handleSpan, [minSpan, maxSpan]);\n        handleIndex = 0;\n      }\n      handleEnds[0] = restrict(handleEnds[0], extent);\n      handleEnds[1] = restrict(handleEnds[1], extent);\n      var originalDistSign = getSpanSign(handleEnds, handleIndex);\n      handleEnds[handleIndex] += delta;\n      // Restrict in extent.\n      var extentMinSpan = minSpan || 0;\n      var realExtent = extent.slice();\n      originalDistSign.sign < 0 ? realExtent[0] += extentMinSpan : realExtent[1] -= extentMinSpan;\n      handleEnds[handleIndex] = restrict(handleEnds[handleIndex], realExtent);\n      // Expand span.\n      var currDistSign;\n      currDistSign = getSpanSign(handleEnds, handleIndex);\n      if (minSpan != null && (currDistSign.sign !== originalDistSign.sign || currDistSign.span < minSpan)) {\n        // If minSpan exists, 'cross' is forbidden.\n        handleEnds[1 - handleIndex] = handleEnds[handleIndex] + originalDistSign.sign * minSpan;\n      }\n      // Shrink span.\n      currDistSign = getSpanSign(handleEnds, handleIndex);\n      if (maxSpan != null && currDistSign.span > maxSpan) {\n        handleEnds[1 - handleIndex] = handleEnds[handleIndex] + currDistSign.sign * maxSpan;\n      }\n      return handleEnds;\n    }\n    function getSpanSign(handleEnds, handleIndex) {\n      var dist = handleEnds[handleIndex] - handleEnds[1 - handleIndex];\n      // If `handleEnds[0] === handleEnds[1]`, always believe that handleEnd[0]\n      // is at left of handleEnds[1] for non-cross case.\n      return {\n        span: Math.abs(dist),\n        sign: dist > 0 ? -1 : dist < 0 ? 1 : handleIndex ? -1 : 1\n      };\n    }\n    function restrict(value, extend) {\n      return Math.min(extend[1] != null ? extend[1] : Infinity, Math.max(extend[0] != null ? extend[0] : -Infinity, value));\n    }\n\n    var each$5 = each;\n    var mathMin$8 = Math.min;\n    var mathMax$8 = Math.max;\n    var mathFloor$1 = Math.floor;\n    var mathCeil$1 = Math.ceil;\n    var round$3 = round;\n    var PI$7 = Math.PI;\n    var Parallel = /** @class */function () {\n      function Parallel(parallelModel, ecModel, api) {\n        this.type = 'parallel';\n        /**\r\n         * key: dimension\r\n         */\n        this._axesMap = createHashMap();\n        /**\r\n         * key: dimension\r\n         * value: {position: [], rotation, }\r\n         */\n        this._axesLayout = {};\n        this.dimensions = parallelModel.dimensions;\n        this._model = parallelModel;\n        this._init(parallelModel, ecModel, api);\n      }\n      Parallel.prototype._init = function (parallelModel, ecModel, api) {\n        var dimensions = parallelModel.dimensions;\n        var parallelAxisIndex = parallelModel.parallelAxisIndex;\n        each$5(dimensions, function (dim, idx) {\n          var axisIndex = parallelAxisIndex[idx];\n          var axisModel = ecModel.getComponent('parallelAxis', axisIndex);\n          var axis = this._axesMap.set(dim, new ParallelAxis(dim, createScaleByModel(axisModel), [0, 0], axisModel.get('type'), axisIndex));\n          var isCategory = axis.type === 'category';\n          axis.onBand = isCategory && axisModel.get('boundaryGap');\n          axis.inverse = axisModel.get('inverse');\n          // Injection\n          axisModel.axis = axis;\n          axis.model = axisModel;\n          axis.coordinateSystem = axisModel.coordinateSystem = this;\n        }, this);\n      };\n      /**\r\n       * Update axis scale after data processed\r\n       */\n      Parallel.prototype.update = function (ecModel, api) {\n        this._updateAxesFromSeries(this._model, ecModel);\n      };\n      Parallel.prototype.containPoint = function (point) {\n        var layoutInfo = this._makeLayoutInfo();\n        var axisBase = layoutInfo.axisBase;\n        var layoutBase = layoutInfo.layoutBase;\n        var pixelDimIndex = layoutInfo.pixelDimIndex;\n        var pAxis = point[1 - pixelDimIndex];\n        var pLayout = point[pixelDimIndex];\n        return pAxis >= axisBase && pAxis <= axisBase + layoutInfo.axisLength && pLayout >= layoutBase && pLayout <= layoutBase + layoutInfo.layoutLength;\n      };\n      Parallel.prototype.getModel = function () {\n        return this._model;\n      };\n      /**\r\n       * Update properties from series\r\n       */\n      Parallel.prototype._updateAxesFromSeries = function (parallelModel, ecModel) {\n        ecModel.eachSeries(function (seriesModel) {\n          if (!parallelModel.contains(seriesModel, ecModel)) {\n            return;\n          }\n          var data = seriesModel.getData();\n          each$5(this.dimensions, function (dim) {\n            var axis = this._axesMap.get(dim);\n            axis.scale.unionExtentFromData(data, data.mapDimension(dim));\n            niceScaleExtent(axis.scale, axis.model);\n          }, this);\n        }, this);\n      };\n      /**\r\n       * Resize the parallel coordinate system.\r\n       */\n      Parallel.prototype.resize = function (parallelModel, api) {\n        this._rect = getLayoutRect(parallelModel.getBoxLayoutParams(), {\n          width: api.getWidth(),\n          height: api.getHeight()\n        });\n        this._layoutAxes();\n      };\n      Parallel.prototype.getRect = function () {\n        return this._rect;\n      };\n      Parallel.prototype._makeLayoutInfo = function () {\n        var parallelModel = this._model;\n        var rect = this._rect;\n        var xy = ['x', 'y'];\n        var wh = ['width', 'height'];\n        var layout = parallelModel.get('layout');\n        var pixelDimIndex = layout === 'horizontal' ? 0 : 1;\n        var layoutLength = rect[wh[pixelDimIndex]];\n        var layoutExtent = [0, layoutLength];\n        var axisCount = this.dimensions.length;\n        var axisExpandWidth = restrict$1(parallelModel.get('axisExpandWidth'), layoutExtent);\n        var axisExpandCount = restrict$1(parallelModel.get('axisExpandCount') || 0, [0, axisCount]);\n        var axisExpandable = parallelModel.get('axisExpandable') && axisCount > 3 && axisCount > axisExpandCount && axisExpandCount > 1 && axisExpandWidth > 0 && layoutLength > 0;\n        // `axisExpandWindow` is According to the coordinates of [0, axisExpandLength],\n        // for sake of consider the case that axisCollapseWidth is 0 (when screen is narrow),\n        // where collapsed axes should be overlapped.\n        var axisExpandWindow = parallelModel.get('axisExpandWindow');\n        var winSize;\n        if (!axisExpandWindow) {\n          winSize = restrict$1(axisExpandWidth * (axisExpandCount - 1), layoutExtent);\n          var axisExpandCenter = parallelModel.get('axisExpandCenter') || mathFloor$1(axisCount / 2);\n          axisExpandWindow = [axisExpandWidth * axisExpandCenter - winSize / 2];\n          axisExpandWindow[1] = axisExpandWindow[0] + winSize;\n        } else {\n          winSize = restrict$1(axisExpandWindow[1] - axisExpandWindow[0], layoutExtent);\n          axisExpandWindow[1] = axisExpandWindow[0] + winSize;\n        }\n        var axisCollapseWidth = (layoutLength - winSize) / (axisCount - axisExpandCount);\n        // Avoid axisCollapseWidth is too small.\n        axisCollapseWidth < 3 && (axisCollapseWidth = 0);\n        // Find the first and last indices > ewin[0] and < ewin[1].\n        var winInnerIndices = [mathFloor$1(round$3(axisExpandWindow[0] / axisExpandWidth, 1)) + 1, mathCeil$1(round$3(axisExpandWindow[1] / axisExpandWidth, 1)) - 1];\n        // Pos in ec coordinates.\n        var axisExpandWindow0Pos = axisCollapseWidth / axisExpandWidth * axisExpandWindow[0];\n        return {\n          layout: layout,\n          pixelDimIndex: pixelDimIndex,\n          layoutBase: rect[xy[pixelDimIndex]],\n          layoutLength: layoutLength,\n          axisBase: rect[xy[1 - pixelDimIndex]],\n          axisLength: rect[wh[1 - pixelDimIndex]],\n          axisExpandable: axisExpandable,\n          axisExpandWidth: axisExpandWidth,\n          axisCollapseWidth: axisCollapseWidth,\n          axisExpandWindow: axisExpandWindow,\n          axisCount: axisCount,\n          winInnerIndices: winInnerIndices,\n          axisExpandWindow0Pos: axisExpandWindow0Pos\n        };\n      };\n      Parallel.prototype._layoutAxes = function () {\n        var rect = this._rect;\n        var axes = this._axesMap;\n        var dimensions = this.dimensions;\n        var layoutInfo = this._makeLayoutInfo();\n        var layout = layoutInfo.layout;\n        axes.each(function (axis) {\n          var axisExtent = [0, layoutInfo.axisLength];\n          var idx = axis.inverse ? 1 : 0;\n          axis.setExtent(axisExtent[idx], axisExtent[1 - idx]);\n        });\n        each$5(dimensions, function (dim, idx) {\n          var posInfo = (layoutInfo.axisExpandable ? layoutAxisWithExpand : layoutAxisWithoutExpand)(idx, layoutInfo);\n          var positionTable = {\n            horizontal: {\n              x: posInfo.position,\n              y: layoutInfo.axisLength\n            },\n            vertical: {\n              x: 0,\n              y: posInfo.position\n            }\n          };\n          var rotationTable = {\n            horizontal: PI$7 / 2,\n            vertical: 0\n          };\n          var position = [positionTable[layout].x + rect.x, positionTable[layout].y + rect.y];\n          var rotation = rotationTable[layout];\n          var transform = create$1();\n          rotate(transform, transform, rotation);\n          translate(transform, transform, position);\n          // TODO\n          // tick layout info\n          // TODO\n          // update dimensions info based on axis order.\n          this._axesLayout[dim] = {\n            position: position,\n            rotation: rotation,\n            transform: transform,\n            axisNameAvailableWidth: posInfo.axisNameAvailableWidth,\n            axisLabelShow: posInfo.axisLabelShow,\n            nameTruncateMaxWidth: posInfo.nameTruncateMaxWidth,\n            tickDirection: 1,\n            labelDirection: 1\n          };\n        }, this);\n      };\n      /**\r\n       * Get axis by dim.\r\n       */\n      Parallel.prototype.getAxis = function (dim) {\n        return this._axesMap.get(dim);\n      };\n      /**\r\n       * Convert a dim value of a single item of series data to Point.\r\n       */\n      Parallel.prototype.dataToPoint = function (value, dim) {\n        return this.axisCoordToPoint(this._axesMap.get(dim).dataToCoord(value), dim);\n      };\n      /**\r\n       * Travel data for one time, get activeState of each data item.\r\n       * @param start the start dataIndex that travel from.\r\n       * @param end the next dataIndex of the last dataIndex will be travel.\r\n       */\n      Parallel.prototype.eachActiveState = function (data, callback, start, end) {\n        start == null && (start = 0);\n        end == null && (end = data.count());\n        var axesMap = this._axesMap;\n        var dimensions = this.dimensions;\n        var dataDimensions = [];\n        var axisModels = [];\n        each(dimensions, function (axisDim) {\n          dataDimensions.push(data.mapDimension(axisDim));\n          axisModels.push(axesMap.get(axisDim).model);\n        });\n        var hasActiveSet = this.hasAxisBrushed();\n        for (var dataIndex = start; dataIndex < end; dataIndex++) {\n          var activeState = void 0;\n          if (!hasActiveSet) {\n            activeState = 'normal';\n          } else {\n            activeState = 'active';\n            var values = data.getValues(dataDimensions, dataIndex);\n            for (var j = 0, lenj = dimensions.length; j < lenj; j++) {\n              var state = axisModels[j].getActiveState(values[j]);\n              if (state === 'inactive') {\n                activeState = 'inactive';\n                break;\n              }\n            }\n          }\n          callback(activeState, dataIndex);\n        }\n      };\n      /**\r\n       * Whether has any activeSet.\r\n       */\n      Parallel.prototype.hasAxisBrushed = function () {\n        var dimensions = this.dimensions;\n        var axesMap = this._axesMap;\n        var hasActiveSet = false;\n        for (var j = 0, lenj = dimensions.length; j < lenj; j++) {\n          if (axesMap.get(dimensions[j]).model.getActiveState() !== 'normal') {\n            hasActiveSet = true;\n          }\n        }\n        return hasActiveSet;\n      };\n      /**\r\n       * Convert coords of each axis to Point.\r\n       *  Return point. For example: [10, 20]\r\n       */\n      Parallel.prototype.axisCoordToPoint = function (coord, dim) {\n        var axisLayout = this._axesLayout[dim];\n        return applyTransform$1([coord, 0], axisLayout.transform);\n      };\n      /**\r\n       * Get axis layout.\r\n       */\n      Parallel.prototype.getAxisLayout = function (dim) {\n        return clone(this._axesLayout[dim]);\n      };\n      /**\r\n       * @return {Object} {axisExpandWindow, delta, behavior: 'jump' | 'slide' | 'none'}.\r\n       */\n      Parallel.prototype.getSlidedAxisExpandWindow = function (point) {\n        var layoutInfo = this._makeLayoutInfo();\n        var pixelDimIndex = layoutInfo.pixelDimIndex;\n        var axisExpandWindow = layoutInfo.axisExpandWindow.slice();\n        var winSize = axisExpandWindow[1] - axisExpandWindow[0];\n        var extent = [0, layoutInfo.axisExpandWidth * (layoutInfo.axisCount - 1)];\n        // Out of the area of coordinate system.\n        if (!this.containPoint(point)) {\n          return {\n            behavior: 'none',\n            axisExpandWindow: axisExpandWindow\n          };\n        }\n        // Convert the point from global to expand coordinates.\n        var pointCoord = point[pixelDimIndex] - layoutInfo.layoutBase - layoutInfo.axisExpandWindow0Pos;\n        // For dragging operation convenience, the window should not be\n        // slided when mouse is the center area of the window.\n        var delta;\n        var behavior = 'slide';\n        var axisCollapseWidth = layoutInfo.axisCollapseWidth;\n        var triggerArea = this._model.get('axisExpandSlideTriggerArea');\n        // But consider touch device, jump is necessary.\n        var useJump = triggerArea[0] != null;\n        if (axisCollapseWidth) {\n          if (useJump && axisCollapseWidth && pointCoord < winSize * triggerArea[0]) {\n            behavior = 'jump';\n            delta = pointCoord - winSize * triggerArea[2];\n          } else if (useJump && axisCollapseWidth && pointCoord > winSize * (1 - triggerArea[0])) {\n            behavior = 'jump';\n            delta = pointCoord - winSize * (1 - triggerArea[2]);\n          } else {\n            (delta = pointCoord - winSize * triggerArea[1]) >= 0 && (delta = pointCoord - winSize * (1 - triggerArea[1])) <= 0 && (delta = 0);\n          }\n          delta *= layoutInfo.axisExpandWidth / axisCollapseWidth;\n          delta ? sliderMove(delta, axisExpandWindow, extent, 'all')\n          // Avoid nonsense triger on mousemove.\n          : behavior = 'none';\n        }\n        // When screen is too narrow, make it visible and slidable, although it is hard to interact.\n        else {\n          var winSize2 = axisExpandWindow[1] - axisExpandWindow[0];\n          var pos = extent[1] * pointCoord / winSize2;\n          axisExpandWindow = [mathMax$8(0, pos - winSize2 / 2)];\n          axisExpandWindow[1] = mathMin$8(extent[1], axisExpandWindow[0] + winSize2);\n          axisExpandWindow[0] = axisExpandWindow[1] - winSize2;\n        }\n        return {\n          axisExpandWindow: axisExpandWindow,\n          behavior: behavior\n        };\n      };\n      return Parallel;\n    }();\n    function restrict$1(len, extent) {\n      return mathMin$8(mathMax$8(len, extent[0]), extent[1]);\n    }\n    function layoutAxisWithoutExpand(axisIndex, layoutInfo) {\n      var step = layoutInfo.layoutLength / (layoutInfo.axisCount - 1);\n      return {\n        position: step * axisIndex,\n        axisNameAvailableWidth: step,\n        axisLabelShow: true\n      };\n    }\n    function layoutAxisWithExpand(axisIndex, layoutInfo) {\n      var layoutLength = layoutInfo.layoutLength;\n      var axisExpandWidth = layoutInfo.axisExpandWidth;\n      var axisCount = layoutInfo.axisCount;\n      var axisCollapseWidth = layoutInfo.axisCollapseWidth;\n      var winInnerIndices = layoutInfo.winInnerIndices;\n      var position;\n      var axisNameAvailableWidth = axisCollapseWidth;\n      var axisLabelShow = false;\n      var nameTruncateMaxWidth;\n      if (axisIndex < winInnerIndices[0]) {\n        position = axisIndex * axisCollapseWidth;\n        nameTruncateMaxWidth = axisCollapseWidth;\n      } else if (axisIndex <= winInnerIndices[1]) {\n        position = layoutInfo.axisExpandWindow0Pos + axisIndex * axisExpandWidth - layoutInfo.axisExpandWindow[0];\n        axisNameAvailableWidth = axisExpandWidth;\n        axisLabelShow = true;\n      } else {\n        position = layoutLength - (axisCount - 1 - axisIndex) * axisCollapseWidth;\n        nameTruncateMaxWidth = axisCollapseWidth;\n      }\n      return {\n        position: position,\n        axisNameAvailableWidth: axisNameAvailableWidth,\n        axisLabelShow: axisLabelShow,\n        nameTruncateMaxWidth: nameTruncateMaxWidth\n      };\n    }\n\n    function createParallelCoordSys(ecModel, api) {\n      var coordSysList = [];\n      ecModel.eachComponent('parallel', function (parallelModel, idx) {\n        var coordSys = new Parallel(parallelModel, ecModel, api);\n        coordSys.name = 'parallel_' + idx;\n        coordSys.resize(parallelModel, api);\n        parallelModel.coordinateSystem = coordSys;\n        coordSys.model = parallelModel;\n        coordSysList.push(coordSys);\n      });\n      // Inject the coordinateSystems into seriesModel\n      ecModel.eachSeries(function (seriesModel) {\n        if (seriesModel.get('coordinateSystem') === 'parallel') {\n          var parallelModel = seriesModel.getReferringComponents('parallel', SINGLE_REFERRING).models[0];\n          seriesModel.coordinateSystem = parallelModel.coordinateSystem;\n        }\n      });\n      return coordSysList;\n    }\n    var parallelCoordSysCreator = {\n      create: createParallelCoordSys\n    };\n\n    var ParallelAxisModel = /** @class */function (_super) {\n      __extends(ParallelAxisModel, _super);\n      function ParallelAxisModel() {\n        var _this = _super !== null && _super.apply(this, arguments) || this;\n        _this.type = ParallelAxisModel.type;\n        /**\r\n         * @readOnly\r\n         */\n        _this.activeIntervals = [];\n        return _this;\n      }\n      ParallelAxisModel.prototype.getAreaSelectStyle = function () {\n        return makeStyleMapper([['fill', 'color'], ['lineWidth', 'borderWidth'], ['stroke', 'borderColor'], ['width', 'width'], ['opacity', 'opacity']\n        // Option decal is in `DecalObject` but style.decal is in `PatternObject`.\n        // So do not transfer decal directly.\n        ])(this.getModel('areaSelectStyle'));\n      };\n      /**\r\n       * The code of this feature is put on AxisModel but not ParallelAxis,\r\n       * because axisModel can be alive after echarts updating but instance of\r\n       * ParallelAxis having been disposed. this._activeInterval should be kept\r\n       * when action dispatched (i.e. legend click).\r\n       *\r\n       * @param intervals `interval.length === 0` means set all active.\r\n       */\n      ParallelAxisModel.prototype.setActiveIntervals = function (intervals) {\n        var activeIntervals = this.activeIntervals = clone(intervals);\n        // Normalize\n        if (activeIntervals) {\n          for (var i = activeIntervals.length - 1; i >= 0; i--) {\n            asc(activeIntervals[i]);\n          }\n        }\n      };\n      /**\r\n       * @param value When only attempting detect whether 'no activeIntervals set',\r\n       *        `value` is not needed to be input.\r\n       */\n      ParallelAxisModel.prototype.getActiveState = function (value) {\n        var activeIntervals = this.activeIntervals;\n        if (!activeIntervals.length) {\n          return 'normal';\n        }\n        if (value == null || isNaN(+value)) {\n          return 'inactive';\n        }\n        // Simple optimization\n        if (activeIntervals.length === 1) {\n          var interval = activeIntervals[0];\n          if (interval[0] <= value && value <= interval[1]) {\n            return 'active';\n          }\n        } else {\n          for (var i = 0, len = activeIntervals.length; i < len; i++) {\n            if (activeIntervals[i][0] <= value && value <= activeIntervals[i][1]) {\n              return 'active';\n            }\n          }\n        }\n        return 'inactive';\n      };\n      return ParallelAxisModel;\n    }(ComponentModel);\n    mixin(ParallelAxisModel, AxisModelCommonMixin);\n\n    var BRUSH_PANEL_GLOBAL = true;\n    var mathMin$9 = Math.min;\n    var mathMax$9 = Math.max;\n    var mathPow$2 = Math.pow;\n    var COVER_Z = 10000;\n    var UNSELECT_THRESHOLD = 6;\n    var MIN_RESIZE_LINE_WIDTH = 6;\n    var MUTEX_RESOURCE_KEY = 'globalPan';\n    var DIRECTION_MAP = {\n      w: [0, 0],\n      e: [0, 1],\n      n: [1, 0],\n      s: [1, 1]\n    };\n    var CURSOR_MAP = {\n      w: 'ew',\n      e: 'ew',\n      n: 'ns',\n      s: 'ns',\n      ne: 'nesw',\n      sw: 'nesw',\n      nw: 'nwse',\n      se: 'nwse'\n    };\n    var DEFAULT_BRUSH_OPT = {\n      brushStyle: {\n        lineWidth: 2,\n        stroke: 'rgba(210,219,238,0.3)',\n        fill: '#D2DBEE'\n      },\n      transformable: true,\n      brushMode: 'single',\n      removeOnClick: false\n    };\n    var baseUID = 0;\n    /**\r\n     * params:\r\n     *     areas: Array.<Array>, coord relates to container group,\r\n     *                             If no container specified, to global.\r\n     *     opt {\r\n     *         isEnd: boolean,\r\n     *         removeOnClick: boolean\r\n     *     }\r\n     */\n    var BrushController = /** @class */function (_super) {\n      __extends(BrushController, _super);\n      function BrushController(zr) {\n        var _this = _super.call(this) || this;\n        /**\r\n         * @internal\r\n         */\n        _this._track = [];\n        /**\r\n         * @internal\r\n         */\n        _this._covers = [];\n        _this._handlers = {};\n        if (\"development\" !== 'production') {\n          assert(zr);\n        }\n        _this._zr = zr;\n        _this.group = new Group();\n        _this._uid = 'brushController_' + baseUID++;\n        each(pointerHandlers, function (handler, eventName) {\n          this._handlers[eventName] = bind(handler, this);\n        }, _this);\n        return _this;\n      }\n      /**\r\n       * If set to `false`, select disabled.\r\n       */\n      BrushController.prototype.enableBrush = function (brushOption) {\n        if (\"development\" !== 'production') {\n          assert(this._mounted);\n        }\n        this._brushType && this._doDisableBrush();\n        brushOption.brushType && this._doEnableBrush(brushOption);\n        return this;\n      };\n      BrushController.prototype._doEnableBrush = function (brushOption) {\n        var zr = this._zr;\n        // Consider roam, which takes globalPan too.\n        if (!this._enableGlobalPan) {\n          take(zr, MUTEX_RESOURCE_KEY, this._uid);\n        }\n        each(this._handlers, function (handler, eventName) {\n          zr.on(eventName, handler);\n        });\n        this._brushType = brushOption.brushType;\n        this._brushOption = merge(clone(DEFAULT_BRUSH_OPT), brushOption, true);\n      };\n      BrushController.prototype._doDisableBrush = function () {\n        var zr = this._zr;\n        release(zr, MUTEX_RESOURCE_KEY, this._uid);\n        each(this._handlers, function (handler, eventName) {\n          zr.off(eventName, handler);\n        });\n        this._brushType = this._brushOption = null;\n      };\n      /**\r\n       * @param panelOpts If not pass, it is global brush.\r\n       */\n      BrushController.prototype.setPanels = function (panelOpts) {\n        if (panelOpts && panelOpts.length) {\n          var panels_1 = this._panels = {};\n          each(panelOpts, function (panelOpts) {\n            panels_1[panelOpts.panelId] = clone(panelOpts);\n          });\n        } else {\n          this._panels = null;\n        }\n        return this;\n      };\n      BrushController.prototype.mount = function (opt) {\n        opt = opt || {};\n        if (\"development\" !== 'production') {\n          this._mounted = true; // should be at first.\n        }\n        this._enableGlobalPan = opt.enableGlobalPan;\n        var thisGroup = this.group;\n        this._zr.add(thisGroup);\n        thisGroup.attr({\n          x: opt.x || 0,\n          y: opt.y || 0,\n          rotation: opt.rotation || 0,\n          scaleX: opt.scaleX || 1,\n          scaleY: opt.scaleY || 1\n        });\n        this._transform = thisGroup.getLocalTransform();\n        return this;\n      };\n      // eachCover(cb, context): void {\n      //     each(this._covers, cb, context);\n      // }\n      /**\r\n       * Update covers.\r\n       * @param coverConfigList\r\n       *        If coverConfigList is null/undefined, all covers removed.\r\n       */\n      BrushController.prototype.updateCovers = function (coverConfigList) {\n        if (\"development\" !== 'production') {\n          assert(this._mounted);\n        }\n        coverConfigList = map(coverConfigList, function (coverConfig) {\n          return merge(clone(DEFAULT_BRUSH_OPT), coverConfig, true);\n        });\n        var tmpIdPrefix = '\\0-brush-index-';\n        var oldCovers = this._covers;\n        var newCovers = this._covers = [];\n        var controller = this;\n        var creatingCover = this._creatingCover;\n        new DataDiffer(oldCovers, coverConfigList, oldGetKey, getKey).add(addOrUpdate).update(addOrUpdate).remove(remove).execute();\n        return this;\n        function getKey(brushOption, index) {\n          return (brushOption.id != null ? brushOption.id : tmpIdPrefix + index) + '-' + brushOption.brushType;\n        }\n        function oldGetKey(cover, index) {\n          return getKey(cover.__brushOption, index);\n        }\n        function addOrUpdate(newIndex, oldIndex) {\n          var newBrushInternal = coverConfigList[newIndex];\n          // Consider setOption in event listener of brushSelect,\n          // where updating cover when creating should be forbidden.\n          if (oldIndex != null && oldCovers[oldIndex] === creatingCover) {\n            newCovers[newIndex] = oldCovers[oldIndex];\n          } else {\n            var cover = newCovers[newIndex] = oldIndex != null ? (oldCovers[oldIndex].__brushOption = newBrushInternal, oldCovers[oldIndex]) : endCreating(controller, createCover(controller, newBrushInternal));\n            updateCoverAfterCreation(controller, cover);\n          }\n        }\n        function remove(oldIndex) {\n          if (oldCovers[oldIndex] !== creatingCover) {\n            controller.group.remove(oldCovers[oldIndex]);\n          }\n        }\n      };\n      BrushController.prototype.unmount = function () {\n        if (\"development\" !== 'production') {\n          if (!this._mounted) {\n            return;\n          }\n        }\n        this.enableBrush(false);\n        // container may 'removeAll' outside.\n        clearCovers(this);\n        this._zr.remove(this.group);\n        if (\"development\" !== 'production') {\n          this._mounted = false; // should be at last.\n        }\n        return this;\n      };\n      BrushController.prototype.dispose = function () {\n        this.unmount();\n        this.off();\n      };\n      return BrushController;\n    }(Eventful);\n    function createCover(controller, brushOption) {\n      var cover = coverRenderers[brushOption.brushType].createCover(controller, brushOption);\n      cover.__brushOption = brushOption;\n      updateZ(cover, brushOption);\n      controller.group.add(cover);\n      return cover;\n    }\n    function endCreating(controller, creatingCover) {\n      var coverRenderer = getCoverRenderer(creatingCover);\n      if (coverRenderer.endCreating) {\n        coverRenderer.endCreating(controller, creatingCover);\n        updateZ(creatingCover, creatingCover.__brushOption);\n      }\n      return creatingCover;\n    }\n    function updateCoverShape(controller, cover) {\n      var brushOption = cover.__brushOption;\n      getCoverRenderer(cover).updateCoverShape(controller, cover, brushOption.range, brushOption);\n    }\n    function updateZ(cover, brushOption) {\n      var z = brushOption.z;\n      z == null && (z = COVER_Z);\n      cover.traverse(function (el) {\n        el.z = z;\n        el.z2 = z; // Consider in given container.\n      });\n    }\n    function updateCoverAfterCreation(controller, cover) {\n      getCoverRenderer(cover).updateCommon(controller, cover);\n      updateCoverShape(controller, cover);\n    }\n    function getCoverRenderer(cover) {\n      return coverRenderers[cover.__brushOption.brushType];\n    }\n    // return target panel or `true` (means global panel)\n    function getPanelByPoint(controller, e, localCursorPoint) {\n      var panels = controller._panels;\n      if (!panels) {\n        return BRUSH_PANEL_GLOBAL; // Global panel\n      }\n      var panel;\n      var transform = controller._transform;\n      each(panels, function (pn) {\n        pn.isTargetByCursor(e, localCursorPoint, transform) && (panel = pn);\n      });\n      return panel;\n    }\n    // Return a panel or true\n    function getPanelByCover(controller, cover) {\n      var panels = controller._panels;\n      if (!panels) {\n        return BRUSH_PANEL_GLOBAL; // Global panel\n      }\n      var panelId = cover.__brushOption.panelId;\n      // User may give cover without coord sys info,\n      // which is then treated as global panel.\n      return panelId != null ? panels[panelId] : BRUSH_PANEL_GLOBAL;\n    }\n    function clearCovers(controller) {\n      var covers = controller._covers;\n      var originalLength = covers.length;\n      each(covers, function (cover) {\n        controller.group.remove(cover);\n      }, controller);\n      covers.length = 0;\n      return !!originalLength;\n    }\n    function trigger$1(controller, opt) {\n      var areas = map(controller._covers, function (cover) {\n        var brushOption = cover.__brushOption;\n        var range = clone(brushOption.range);\n        return {\n          brushType: brushOption.brushType,\n          panelId: brushOption.panelId,\n          range: range\n        };\n      });\n      controller.trigger('brush', {\n        areas: areas,\n        isEnd: !!opt.isEnd,\n        removeOnClick: !!opt.removeOnClick\n      });\n    }\n    function shouldShowCover(controller) {\n      var track = controller._track;\n      if (!track.length) {\n        return false;\n      }\n      var p2 = track[track.length - 1];\n      var p1 = track[0];\n      var dx = p2[0] - p1[0];\n      var dy = p2[1] - p1[1];\n      var dist = mathPow$2(dx * dx + dy * dy, 0.5);\n      return dist > UNSELECT_THRESHOLD;\n    }\n    function getTrackEnds(track) {\n      var tail = track.length - 1;\n      tail < 0 && (tail = 0);\n      return [track[0], track[tail]];\n    }\n    function createBaseRectCover(rectRangeConverter, controller, brushOption, edgeNameSequences) {\n      var cover = new Group();\n      cover.add(new Rect({\n        name: 'main',\n        style: makeStyle(brushOption),\n        silent: true,\n        draggable: true,\n        cursor: 'move',\n        drift: curry(driftRect, rectRangeConverter, controller, cover, ['n', 's', 'w', 'e']),\n        ondragend: curry(trigger$1, controller, {\n          isEnd: true\n        })\n      }));\n      each(edgeNameSequences, function (nameSequence) {\n        cover.add(new Rect({\n          name: nameSequence.join(''),\n          style: {\n            opacity: 0\n          },\n          draggable: true,\n          silent: true,\n          invisible: true,\n          drift: curry(driftRect, rectRangeConverter, controller, cover, nameSequence),\n          ondragend: curry(trigger$1, controller, {\n            isEnd: true\n          })\n        }));\n      });\n      return cover;\n    }\n    function updateBaseRect(controller, cover, localRange, brushOption) {\n      var lineWidth = brushOption.brushStyle.lineWidth || 0;\n      var handleSize = mathMax$9(lineWidth, MIN_RESIZE_LINE_WIDTH);\n      var x = localRange[0][0];\n      var y = localRange[1][0];\n      var xa = x - lineWidth / 2;\n      var ya = y - lineWidth / 2;\n      var x2 = localRange[0][1];\n      var y2 = localRange[1][1];\n      var x2a = x2 - handleSize + lineWidth / 2;\n      var y2a = y2 - handleSize + lineWidth / 2;\n      var width = x2 - x;\n      var height = y2 - y;\n      var widtha = width + lineWidth;\n      var heighta = height + lineWidth;\n      updateRectShape(controller, cover, 'main', x, y, width, height);\n      if (brushOption.transformable) {\n        updateRectShape(controller, cover, 'w', xa, ya, handleSize, heighta);\n        updateRectShape(controller, cover, 'e', x2a, ya, handleSize, heighta);\n        updateRectShape(controller, cover, 'n', xa, ya, widtha, handleSize);\n        updateRectShape(controller, cover, 's', xa, y2a, widtha, handleSize);\n        updateRectShape(controller, cover, 'nw', xa, ya, handleSize, handleSize);\n        updateRectShape(controller, cover, 'ne', x2a, ya, handleSize, handleSize);\n        updateRectShape(controller, cover, 'sw', xa, y2a, handleSize, handleSize);\n        updateRectShape(controller, cover, 'se', x2a, y2a, handleSize, handleSize);\n      }\n    }\n    function updateCommon(controller, cover) {\n      var brushOption = cover.__brushOption;\n      var transformable = brushOption.transformable;\n      var mainEl = cover.childAt(0);\n      mainEl.useStyle(makeStyle(brushOption));\n      mainEl.attr({\n        silent: !transformable,\n        cursor: transformable ? 'move' : 'default'\n      });\n      each([['w'], ['e'], ['n'], ['s'], ['s', 'e'], ['s', 'w'], ['n', 'e'], ['n', 'w']], function (nameSequence) {\n        var el = cover.childOfName(nameSequence.join(''));\n        var globalDir = nameSequence.length === 1 ? getGlobalDirection1(controller, nameSequence[0]) : getGlobalDirection2(controller, nameSequence);\n        el && el.attr({\n          silent: !transformable,\n          invisible: !transformable,\n          cursor: transformable ? CURSOR_MAP[globalDir] + '-resize' : null\n        });\n      });\n    }\n    function updateRectShape(controller, cover, name, x, y, w, h) {\n      var el = cover.childOfName(name);\n      el && el.setShape(pointsToRect(clipByPanel(controller, cover, [[x, y], [x + w, y + h]])));\n    }\n    function makeStyle(brushOption) {\n      return defaults({\n        strokeNoScale: true\n      }, brushOption.brushStyle);\n    }\n    function formatRectRange(x, y, x2, y2) {\n      var min = [mathMin$9(x, x2), mathMin$9(y, y2)];\n      var max = [mathMax$9(x, x2), mathMax$9(y, y2)];\n      return [[min[0], max[0]], [min[1], max[1]] // y range\n      ];\n    }\n    function getTransform$1(controller) {\n      return getTransform(controller.group);\n    }\n    function getGlobalDirection1(controller, localDirName) {\n      var map = {\n        w: 'left',\n        e: 'right',\n        n: 'top',\n        s: 'bottom'\n      };\n      var inverseMap = {\n        left: 'w',\n        right: 'e',\n        top: 'n',\n        bottom: 's'\n      };\n      var dir = transformDirection(map[localDirName], getTransform$1(controller));\n      return inverseMap[dir];\n    }\n    function getGlobalDirection2(controller, localDirNameSeq) {\n      var globalDir = [getGlobalDirection1(controller, localDirNameSeq[0]), getGlobalDirection1(controller, localDirNameSeq[1])];\n      (globalDir[0] === 'e' || globalDir[0] === 'w') && globalDir.reverse();\n      return globalDir.join('');\n    }\n    function driftRect(rectRangeConverter, controller, cover, dirNameSequence, dx, dy) {\n      var brushOption = cover.__brushOption;\n      var rectRange = rectRangeConverter.toRectRange(brushOption.range);\n      var localDelta = toLocalDelta(controller, dx, dy);\n      each(dirNameSequence, function (dirName) {\n        var ind = DIRECTION_MAP[dirName];\n        rectRange[ind[0]][ind[1]] += localDelta[ind[0]];\n      });\n      brushOption.range = rectRangeConverter.fromRectRange(formatRectRange(rectRange[0][0], rectRange[1][0], rectRange[0][1], rectRange[1][1]));\n      updateCoverAfterCreation(controller, cover);\n      trigger$1(controller, {\n        isEnd: false\n      });\n    }\n    function driftPolygon(controller, cover, dx, dy) {\n      var range = cover.__brushOption.range;\n      var localDelta = toLocalDelta(controller, dx, dy);\n      each(range, function (point) {\n        point[0] += localDelta[0];\n        point[1] += localDelta[1];\n      });\n      updateCoverAfterCreation(controller, cover);\n      trigger$1(controller, {\n        isEnd: false\n      });\n    }\n    function toLocalDelta(controller, dx, dy) {\n      var thisGroup = controller.group;\n      var localD = thisGroup.transformCoordToLocal(dx, dy);\n      var localZero = thisGroup.transformCoordToLocal(0, 0);\n      return [localD[0] - localZero[0], localD[1] - localZero[1]];\n    }\n    function clipByPanel(controller, cover, data) {\n      var panel = getPanelByCover(controller, cover);\n      return panel && panel !== BRUSH_PANEL_GLOBAL ? panel.clipPath(data, controller._transform) : clone(data);\n    }\n    function pointsToRect(points) {\n      var xmin = mathMin$9(points[0][0], points[1][0]);\n      var ymin = mathMin$9(points[0][1], points[1][1]);\n      var xmax = mathMax$9(points[0][0], points[1][0]);\n      var ymax = mathMax$9(points[0][1], points[1][1]);\n      return {\n        x: xmin,\n        y: ymin,\n        width: xmax - xmin,\n        height: ymax - ymin\n      };\n    }\n    function resetCursor(controller, e, localCursorPoint) {\n      if (\n      // Check active\n      !controller._brushType\n      // resetCursor should be always called when mouse is in zr area,\n      // but not called when mouse is out of zr area to avoid bad influence\n      // if `mousemove`, `mouseup` are triggered from `document` event.\n      || isOutsideZrArea(controller, e.offsetX, e.offsetY)) {\n        return;\n      }\n      var zr = controller._zr;\n      var covers = controller._covers;\n      var currPanel = getPanelByPoint(controller, e, localCursorPoint);\n      // Check whether in covers.\n      if (!controller._dragging) {\n        for (var i = 0; i < covers.length; i++) {\n          var brushOption = covers[i].__brushOption;\n          if (currPanel && (currPanel === BRUSH_PANEL_GLOBAL || brushOption.panelId === currPanel.panelId) && coverRenderers[brushOption.brushType].contain(covers[i], localCursorPoint[0], localCursorPoint[1])) {\n            // Use cursor style set on cover.\n            return;\n          }\n        }\n      }\n      currPanel && zr.setCursorStyle('crosshair');\n    }\n    function preventDefault(e) {\n      var rawE = e.event;\n      rawE.preventDefault && rawE.preventDefault();\n    }\n    function mainShapeContain(cover, x, y) {\n      return cover.childOfName('main').contain(x, y);\n    }\n    function updateCoverByMouse(controller, e, localCursorPoint, isEnd) {\n      var creatingCover = controller._creatingCover;\n      var panel = controller._creatingPanel;\n      var thisBrushOption = controller._brushOption;\n      var eventParams;\n      controller._track.push(localCursorPoint.slice());\n      if (shouldShowCover(controller) || creatingCover) {\n        if (panel && !creatingCover) {\n          thisBrushOption.brushMode === 'single' && clearCovers(controller);\n          var brushOption = clone(thisBrushOption);\n          brushOption.brushType = determineBrushType(brushOption.brushType, panel);\n          brushOption.panelId = panel === BRUSH_PANEL_GLOBAL ? null : panel.panelId;\n          creatingCover = controller._creatingCover = createCover(controller, brushOption);\n          controller._covers.push(creatingCover);\n        }\n        if (creatingCover) {\n          var coverRenderer = coverRenderers[determineBrushType(controller._brushType, panel)];\n          var coverBrushOption = creatingCover.__brushOption;\n          coverBrushOption.range = coverRenderer.getCreatingRange(clipByPanel(controller, creatingCover, controller._track));\n          if (isEnd) {\n            endCreating(controller, creatingCover);\n            coverRenderer.updateCommon(controller, creatingCover);\n          }\n          updateCoverShape(controller, creatingCover);\n          eventParams = {\n            isEnd: isEnd\n          };\n        }\n      } else if (isEnd && thisBrushOption.brushMode === 'single' && thisBrushOption.removeOnClick) {\n        // Help user to remove covers easily, only by a tiny drag, in 'single' mode.\n        // But a single click do not clear covers, because user may have casual\n        // clicks (for example, click on other component and do not expect covers\n        // disappear).\n        // Only some cover removed, trigger action, but not every click trigger action.\n        if (getPanelByPoint(controller, e, localCursorPoint) && clearCovers(controller)) {\n          eventParams = {\n            isEnd: isEnd,\n            removeOnClick: true\n          };\n        }\n      }\n      return eventParams;\n    }\n    function determineBrushType(brushType, panel) {\n      if (brushType === 'auto') {\n        if (\"development\" !== 'production') {\n          assert(panel && panel.defaultBrushType, 'MUST have defaultBrushType when brushType is \"atuo\"');\n        }\n        return panel.defaultBrushType;\n      }\n      return brushType;\n    }\n    var pointerHandlers = {\n      mousedown: function (e) {\n        if (this._dragging) {\n          // In case some browser do not support globalOut,\n          // and release mouse out side the browser.\n          handleDragEnd(this, e);\n        } else if (!e.target || !e.target.draggable) {\n          preventDefault(e);\n          var localCursorPoint = this.group.transformCoordToLocal(e.offsetX, e.offsetY);\n          this._creatingCover = null;\n          var panel = this._creatingPanel = getPanelByPoint(this, e, localCursorPoint);\n          if (panel) {\n            this._dragging = true;\n            this._track = [localCursorPoint.slice()];\n          }\n        }\n      },\n      mousemove: function (e) {\n        var x = e.offsetX;\n        var y = e.offsetY;\n        var localCursorPoint = this.group.transformCoordToLocal(x, y);\n        resetCursor(this, e, localCursorPoint);\n        if (this._dragging) {\n          preventDefault(e);\n          var eventParams = updateCoverByMouse(this, e, localCursorPoint, false);\n          eventParams && trigger$1(this, eventParams);\n        }\n      },\n      mouseup: function (e) {\n        handleDragEnd(this, e);\n      }\n    };\n    function handleDragEnd(controller, e) {\n      if (controller._dragging) {\n        preventDefault(e);\n        var x = e.offsetX;\n        var y = e.offsetY;\n        var localCursorPoint = controller.group.transformCoordToLocal(x, y);\n        var eventParams = updateCoverByMouse(controller, e, localCursorPoint, true);\n        controller._dragging = false;\n        controller._track = [];\n        controller._creatingCover = null;\n        // trigger event should be at final, after procedure will be nested.\n        eventParams && trigger$1(controller, eventParams);\n      }\n    }\n    function isOutsideZrArea(controller, x, y) {\n      var zr = controller._zr;\n      return x < 0 || x > zr.getWidth() || y < 0 || y > zr.getHeight();\n    }\n    /**\r\n     * key: brushType\r\n     */\n    var coverRenderers = {\n      lineX: getLineRenderer(0),\n      lineY: getLineRenderer(1),\n      rect: {\n        createCover: function (controller, brushOption) {\n          function returnInput(range) {\n            return range;\n          }\n          return createBaseRectCover({\n            toRectRange: returnInput,\n            fromRectRange: returnInput\n          }, controller, brushOption, [['w'], ['e'], ['n'], ['s'], ['s', 'e'], ['s', 'w'], ['n', 'e'], ['n', 'w']]);\n        },\n        getCreatingRange: function (localTrack) {\n          var ends = getTrackEnds(localTrack);\n          return formatRectRange(ends[1][0], ends[1][1], ends[0][0], ends[0][1]);\n        },\n        updateCoverShape: function (controller, cover, localRange, brushOption) {\n          updateBaseRect(controller, cover, localRange, brushOption);\n        },\n        updateCommon: updateCommon,\n        contain: mainShapeContain\n      },\n      polygon: {\n        createCover: function (controller, brushOption) {\n          var cover = new Group();\n          // Do not use graphic.Polygon because graphic.Polyline do not close the\n          // border of the shape when drawing, which is a better experience for user.\n          cover.add(new Polyline({\n            name: 'main',\n            style: makeStyle(brushOption),\n            silent: true\n          }));\n          return cover;\n        },\n        getCreatingRange: function (localTrack) {\n          return localTrack;\n        },\n        endCreating: function (controller, cover) {\n          cover.remove(cover.childAt(0));\n          // Use graphic.Polygon close the shape.\n          cover.add(new Polygon({\n            name: 'main',\n            draggable: true,\n            drift: curry(driftPolygon, controller, cover),\n            ondragend: curry(trigger$1, controller, {\n              isEnd: true\n            })\n          }));\n        },\n        updateCoverShape: function (controller, cover, localRange, brushOption) {\n          cover.childAt(0).setShape({\n            points: clipByPanel(controller, cover, localRange)\n          });\n        },\n        updateCommon: updateCommon,\n        contain: mainShapeContain\n      }\n    };\n    function getLineRenderer(xyIndex) {\n      return {\n        createCover: function (controller, brushOption) {\n          return createBaseRectCover({\n            toRectRange: function (range) {\n              var rectRange = [range, [0, 100]];\n              xyIndex && rectRange.reverse();\n              return rectRange;\n            },\n            fromRectRange: function (rectRange) {\n              return rectRange[xyIndex];\n            }\n          }, controller, brushOption, [[['w'], ['e']], [['n'], ['s']]][xyIndex]);\n        },\n        getCreatingRange: function (localTrack) {\n          var ends = getTrackEnds(localTrack);\n          var min = mathMin$9(ends[0][xyIndex], ends[1][xyIndex]);\n          var max = mathMax$9(ends[0][xyIndex], ends[1][xyIndex]);\n          return [min, max];\n        },\n        updateCoverShape: function (controller, cover, localRange, brushOption) {\n          var otherExtent;\n          // If brushWidth not specified, fit the panel.\n          var panel = getPanelByCover(controller, cover);\n          if (panel !== BRUSH_PANEL_GLOBAL && panel.getLinearBrushOtherExtent) {\n            otherExtent = panel.getLinearBrushOtherExtent(xyIndex);\n          } else {\n            var zr = controller._zr;\n            otherExtent = [0, [zr.getWidth(), zr.getHeight()][1 - xyIndex]];\n          }\n          var rectRange = [localRange, otherExtent];\n          xyIndex && rectRange.reverse();\n          updateBaseRect(controller, cover, rectRange, brushOption);\n        },\n        updateCommon: updateCommon,\n        contain: mainShapeContain\n      };\n    }\n\n    function makeRectPanelClipPath(rect) {\n      rect = normalizeRect(rect);\n      return function (localPoints) {\n        return clipPointsByRect(localPoints, rect);\n      };\n    }\n    function makeLinearBrushOtherExtent(rect, specifiedXYIndex) {\n      rect = normalizeRect(rect);\n      return function (xyIndex) {\n        var idx = specifiedXYIndex != null ? specifiedXYIndex : xyIndex;\n        var brushWidth = idx ? rect.width : rect.height;\n        var base = idx ? rect.x : rect.y;\n        return [base, base + (brushWidth || 0)];\n      };\n    }\n    function makeRectIsTargetByCursor(rect, api, targetModel) {\n      var boundingRect = normalizeRect(rect);\n      return function (e, localCursorPoint) {\n        return boundingRect.contain(localCursorPoint[0], localCursorPoint[1]) && !onIrrelevantElement(e, api, targetModel);\n      };\n    }\n    // Consider width/height is negative.\n    function normalizeRect(rect) {\n      return BoundingRect.create(rect);\n    }\n\n    var elementList = ['axisLine', 'axisTickLabel', 'axisName'];\n    var ParallelAxisView = /** @class */function (_super) {\n      __extends(ParallelAxisView, _super);\n      function ParallelAxisView() {\n        var _this = _super !== null && _super.apply(this, arguments) || this;\n        _this.type = ParallelAxisView.type;\n        return _this;\n      }\n      ParallelAxisView.prototype.init = function (ecModel, api) {\n        _super.prototype.init.apply(this, arguments);\n        (this._brushController = new BrushController(api.getZr())).on('brush', bind(this._onBrush, this));\n      };\n      ParallelAxisView.prototype.render = function (axisModel, ecModel, api, payload) {\n        if (fromAxisAreaSelect(axisModel, ecModel, payload)) {\n          return;\n        }\n        this.axisModel = axisModel;\n        this.api = api;\n        this.group.removeAll();\n        var oldAxisGroup = this._axisGroup;\n        this._axisGroup = new Group();\n        this.group.add(this._axisGroup);\n        if (!axisModel.get('show')) {\n          return;\n        }\n        var coordSysModel = getCoordSysModel(axisModel, ecModel);\n        var coordSys = coordSysModel.coordinateSystem;\n        var areaSelectStyle = axisModel.getAreaSelectStyle();\n        var areaWidth = areaSelectStyle.width;\n        var dim = axisModel.axis.dim;\n        var axisLayout = coordSys.getAxisLayout(dim);\n        var builderOpt = extend({\n          strokeContainThreshold: areaWidth\n        }, axisLayout);\n        var axisBuilder = new AxisBuilder(axisModel, builderOpt);\n        each(elementList, axisBuilder.add, axisBuilder);\n        this._axisGroup.add(axisBuilder.getGroup());\n        this._refreshBrushController(builderOpt, areaSelectStyle, axisModel, coordSysModel, areaWidth, api);\n        groupTransition(oldAxisGroup, this._axisGroup, axisModel);\n      };\n      // /**\n      //  * @override\n      //  */\n      // updateVisual(axisModel, ecModel, api, payload) {\n      //     this._brushController && this._brushController\n      //         .updateCovers(getCoverInfoList(axisModel));\n      // }\n      ParallelAxisView.prototype._refreshBrushController = function (builderOpt, areaSelectStyle, axisModel, coordSysModel, areaWidth, api) {\n        // After filtering, axis may change, select area needs to be update.\n        var extent = axisModel.axis.getExtent();\n        var extentLen = extent[1] - extent[0];\n        var extra = Math.min(30, Math.abs(extentLen) * 0.1); // Arbitrary value.\n        // width/height might be negative, which will be\n        // normalized in BoundingRect.\n        var rect = BoundingRect.create({\n          x: extent[0],\n          y: -areaWidth / 2,\n          width: extentLen,\n          height: areaWidth\n        });\n        rect.x -= extra;\n        rect.width += 2 * extra;\n        this._brushController.mount({\n          enableGlobalPan: true,\n          rotation: builderOpt.rotation,\n          x: builderOpt.position[0],\n          y: builderOpt.position[1]\n        }).setPanels([{\n          panelId: 'pl',\n          clipPath: makeRectPanelClipPath(rect),\n          isTargetByCursor: makeRectIsTargetByCursor(rect, api, coordSysModel),\n          getLinearBrushOtherExtent: makeLinearBrushOtherExtent(rect, 0)\n        }]).enableBrush({\n          brushType: 'lineX',\n          brushStyle: areaSelectStyle,\n          removeOnClick: true\n        }).updateCovers(getCoverInfoList(axisModel));\n      };\n      ParallelAxisView.prototype._onBrush = function (eventParam) {\n        var coverInfoList = eventParam.areas;\n        // Do not cache these object, because the mey be changed.\n        var axisModel = this.axisModel;\n        var axis = axisModel.axis;\n        var intervals = map(coverInfoList, function (coverInfo) {\n          return [axis.coordToData(coverInfo.range[0], true), axis.coordToData(coverInfo.range[1], true)];\n        });\n        // If realtime is true, action is not dispatched on drag end, because\n        // the drag end emits the same params with the last drag move event,\n        // and may have some delay when using touch pad.\n        if (!axisModel.option.realtime === eventParam.isEnd || eventParam.removeOnClick) {\n          // jshint ignore:line\n          this.api.dispatchAction({\n            type: 'axisAreaSelect',\n            parallelAxisId: axisModel.id,\n            intervals: intervals\n          });\n        }\n      };\n      ParallelAxisView.prototype.dispose = function () {\n        this._brushController.dispose();\n      };\n      ParallelAxisView.type = 'parallelAxis';\n      return ParallelAxisView;\n    }(ComponentView);\n    function fromAxisAreaSelect(axisModel, ecModel, payload) {\n      return payload && payload.type === 'axisAreaSelect' && ecModel.findComponents({\n        mainType: 'parallelAxis',\n        query: payload\n      })[0] === axisModel;\n    }\n    function getCoverInfoList(axisModel) {\n      var axis = axisModel.axis;\n      return map(axisModel.activeIntervals, function (interval) {\n        return {\n          brushType: 'lineX',\n          panelId: 'pl',\n          range: [axis.dataToCoord(interval[0], true), axis.dataToCoord(interval[1], true)]\n        };\n      });\n    }\n    function getCoordSysModel(axisModel, ecModel) {\n      return ecModel.getComponent('parallel', axisModel.get('parallelIndex'));\n    }\n\n    /*\n    * Licensed to the Apache Software Foundation (ASF) under one\n    * or more contributor license agreements.  See the NOTICE file\n    * distributed with this work for additional information\n    * regarding copyright ownership.  The ASF licenses this file\n    * to you under the Apache License, Version 2.0 (the\n    * \"License\"); you may not use this file except in compliance\n    * with the License.  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,\n    * software distributed under the License is distributed on an\n    * \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\n    * KIND, either express or implied.  See the License for the\n    * specific language governing permissions and limitations\n    * under the License.\n    */\n\n\n    /**\n     * AUTO-GENERATED FILE. DO NOT MODIFY.\n     */\n\n    /*\r\n    * Licensed to the Apache Software Foundation (ASF) under one\r\n    * or more contributor license agreements.  See the NOTICE file\r\n    * distributed with this work for additional information\r\n    * regarding copyright ownership.  The ASF licenses this file\r\n    * to you under the Apache License, Version 2.0 (the\r\n    * \"License\"); you may not use this file except in compliance\r\n    * with the License.  You may obtain a copy of the License at\r\n    *\r\n    *   http://www.apache.org/licenses/LICENSE-2.0\r\n    *\r\n    * Unless required by applicable law or agreed to in writing,\r\n    * software distributed under the License is distributed on an\r\n    * \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\r\n    * KIND, either express or implied.  See the License for the\r\n    * specific language governing permissions and limitations\r\n    * under the License.\r\n    */\n    var actionInfo$1 = {\n      type: 'axisAreaSelect',\n      event: 'axisAreaSelected'\n      // update: 'updateVisual'\n    };\n    function installParallelActions(registers) {\n      registers.registerAction(actionInfo$1, function (payload, ecModel) {\n        ecModel.eachComponent({\n          mainType: 'parallelAxis',\n          query: payload\n        }, function (parallelAxisModel) {\n          parallelAxisModel.axis.model.setActiveIntervals(payload.intervals);\n        });\n      });\n      /**\r\n       * @payload\r\n       */\n      registers.registerAction('parallelAxisExpand', function (payload, ecModel) {\n        ecModel.eachComponent({\n          mainType: 'parallel',\n          query: payload\n        }, function (parallelModel) {\n          parallelModel.setAxisExpand(payload);\n        });\n      });\n    }\n\n    var defaultAxisOption = {\n      type: 'value',\n      areaSelectStyle: {\n        width: 20,\n        borderWidth: 1,\n        borderColor: 'rgba(160,197,232)',\n        color: 'rgba(160,197,232)',\n        opacity: 0.3\n      },\n      realtime: true,\n      z: 10\n    };\n    function install$g(registers) {\n      registers.registerComponentView(ParallelView$1);\n      registers.registerComponentModel(ParallelModel);\n      registers.registerCoordinateSystem('parallel', parallelCoordSysCreator);\n      registers.registerPreprocessor(parallelPreprocessor);\n      registers.registerComponentModel(ParallelAxisModel);\n      registers.registerComponentView(ParallelAxisView);\n      axisModelCreator(registers, 'parallel', ParallelAxisModel, defaultAxisOption);\n      installParallelActions(registers);\n    }\n\n    function install$h(registers) {\n      use(install$g);\n      registers.registerChartView(ParallelView);\n      registers.registerSeriesModel(ParallelSeriesModel);\n      registers.registerVisual(registers.PRIORITY.VISUAL.BRUSH, parallelVisual);\n    }\n\n    var SankeyPathShape = /** @class */function () {\n      function SankeyPathShape() {\n        this.x1 = 0;\n        this.y1 = 0;\n        this.x2 = 0;\n        this.y2 = 0;\n        this.cpx1 = 0;\n        this.cpy1 = 0;\n        this.cpx2 = 0;\n        this.cpy2 = 0;\n        this.extent = 0;\n      }\n      return SankeyPathShape;\n    }();\n    var SankeyPath = /** @class */function (_super) {\n      __extends(SankeyPath, _super);\n      function SankeyPath(opts) {\n        return _super.call(this, opts) || this;\n      }\n      SankeyPath.prototype.getDefaultShape = function () {\n        return new SankeyPathShape();\n      };\n      SankeyPath.prototype.buildPath = function (ctx, shape) {\n        var extent = shape.extent;\n        ctx.moveTo(shape.x1, shape.y1);\n        ctx.bezierCurveTo(shape.cpx1, shape.cpy1, shape.cpx2, shape.cpy2, shape.x2, shape.y2);\n        if (shape.orient === 'vertical') {\n          ctx.lineTo(shape.x2 + extent, shape.y2);\n          ctx.bezierCurveTo(shape.cpx2 + extent, shape.cpy2, shape.cpx1 + extent, shape.cpy1, shape.x1 + extent, shape.y1);\n        } else {\n          ctx.lineTo(shape.x2, shape.y2 + extent);\n          ctx.bezierCurveTo(shape.cpx2, shape.cpy2 + extent, shape.cpx1, shape.cpy1 + extent, shape.x1, shape.y1 + extent);\n        }\n        ctx.closePath();\n      };\n      SankeyPath.prototype.highlight = function () {\n        enterEmphasis(this);\n      };\n      SankeyPath.prototype.downplay = function () {\n        leaveEmphasis(this);\n      };\n      return SankeyPath;\n    }(Path);\n    var SankeyView = /** @class */function (_super) {\n      __extends(SankeyView, _super);\n      function SankeyView() {\n        var _this = _super !== null && _super.apply(this, arguments) || this;\n        _this.type = SankeyView.type;\n        _this._focusAdjacencyDisabled = false;\n        return _this;\n      }\n      SankeyView.prototype.render = function (seriesModel, ecModel, api) {\n        var sankeyView = this;\n        var graph = seriesModel.getGraph();\n        var group = this.group;\n        var layoutInfo = seriesModel.layoutInfo;\n        // view width\n        var width = layoutInfo.width;\n        // view height\n        var height = layoutInfo.height;\n        var nodeData = seriesModel.getData();\n        var edgeData = seriesModel.getData('edge');\n        var orient = seriesModel.get('orient');\n        this._model = seriesModel;\n        group.removeAll();\n        group.x = layoutInfo.x;\n        group.y = layoutInfo.y;\n        // generate a bezire Curve for each edge\n        graph.eachEdge(function (edge) {\n          var curve = new SankeyPath();\n          var ecData = getECData(curve);\n          ecData.dataIndex = edge.dataIndex;\n          ecData.seriesIndex = seriesModel.seriesIndex;\n          ecData.dataType = 'edge';\n          var edgeModel = edge.getModel();\n          var lineStyleModel = edgeModel.getModel('lineStyle');\n          var curvature = lineStyleModel.get('curveness');\n          var n1Layout = edge.node1.getLayout();\n          var node1Model = edge.node1.getModel();\n          var dragX1 = node1Model.get('localX');\n          var dragY1 = node1Model.get('localY');\n          var n2Layout = edge.node2.getLayout();\n          var node2Model = edge.node2.getModel();\n          var dragX2 = node2Model.get('localX');\n          var dragY2 = node2Model.get('localY');\n          var edgeLayout = edge.getLayout();\n          var x1;\n          var y1;\n          var x2;\n          var y2;\n          var cpx1;\n          var cpy1;\n          var cpx2;\n          var cpy2;\n          curve.shape.extent = Math.max(1, edgeLayout.dy);\n          curve.shape.orient = orient;\n          if (orient === 'vertical') {\n            x1 = (dragX1 != null ? dragX1 * width : n1Layout.x) + edgeLayout.sy;\n            y1 = (dragY1 != null ? dragY1 * height : n1Layout.y) + n1Layout.dy;\n            x2 = (dragX2 != null ? dragX2 * width : n2Layout.x) + edgeLayout.ty;\n            y2 = dragY2 != null ? dragY2 * height : n2Layout.y;\n            cpx1 = x1;\n            cpy1 = y1 * (1 - curvature) + y2 * curvature;\n            cpx2 = x2;\n            cpy2 = y1 * curvature + y2 * (1 - curvature);\n          } else {\n            x1 = (dragX1 != null ? dragX1 * width : n1Layout.x) + n1Layout.dx;\n            y1 = (dragY1 != null ? dragY1 * height : n1Layout.y) + edgeLayout.sy;\n            x2 = dragX2 != null ? dragX2 * width : n2Layout.x;\n            y2 = (dragY2 != null ? dragY2 * height : n2Layout.y) + edgeLayout.ty;\n            cpx1 = x1 * (1 - curvature) + x2 * curvature;\n            cpy1 = y1;\n            cpx2 = x1 * curvature + x2 * (1 - curvature);\n            cpy2 = y2;\n          }\n          curve.setShape({\n            x1: x1,\n            y1: y1,\n            x2: x2,\n            y2: y2,\n            cpx1: cpx1,\n            cpy1: cpy1,\n            cpx2: cpx2,\n            cpy2: cpy2\n          });\n          curve.useStyle(lineStyleModel.getItemStyle());\n          // Special color, use source node color or target node color\n          applyCurveStyle(curve.style, orient, edge);\n          var defaultEdgeLabelText = \"\" + edgeModel.get('value');\n          var edgeLabelStateModels = getLabelStatesModels(edgeModel, 'edgeLabel');\n          setLabelStyle(curve, edgeLabelStateModels, {\n            labelFetcher: {\n              getFormattedLabel: function (dataIndex, stateName, dataType, labelDimIndex, formatter, extendParams) {\n                return seriesModel.getFormattedLabel(dataIndex, stateName, 'edge', labelDimIndex,\n                // ensure edgeLabel formatter is provided\n                // to prevent the inheritance from `label.formatter` of the series\n                retrieve3(formatter, edgeLabelStateModels.normal && edgeLabelStateModels.normal.get('formatter'), defaultEdgeLabelText), extendParams);\n              }\n            },\n            labelDataIndex: edge.dataIndex,\n            defaultText: defaultEdgeLabelText\n          });\n          curve.setTextConfig({\n            position: 'inside'\n          });\n          var emphasisModel = edgeModel.getModel('emphasis');\n          setStatesStylesFromModel(curve, edgeModel, 'lineStyle', function (model) {\n            var style = model.getItemStyle();\n            applyCurveStyle(style, orient, edge);\n            return style;\n          });\n          group.add(curve);\n          edgeData.setItemGraphicEl(edge.dataIndex, curve);\n          var focus = emphasisModel.get('focus');\n          toggleHoverEmphasis(curve, focus === 'adjacency' ? edge.getAdjacentDataIndices() : focus === 'trajectory' ? edge.getTrajectoryDataIndices() : focus, emphasisModel.get('blurScope'), emphasisModel.get('disabled'));\n        });\n        // Generate a rect for each node\n        graph.eachNode(function (node) {\n          var layout = node.getLayout();\n          var itemModel = node.getModel();\n          var dragX = itemModel.get('localX');\n          var dragY = itemModel.get('localY');\n          var emphasisModel = itemModel.getModel('emphasis');\n          var borderRadius = itemModel.get(['itemStyle', 'borderRadius']) || 0;\n          var rect = new Rect({\n            shape: {\n              x: dragX != null ? dragX * width : layout.x,\n              y: dragY != null ? dragY * height : layout.y,\n              width: layout.dx,\n              height: layout.dy,\n              r: borderRadius\n            },\n            style: itemModel.getModel('itemStyle').getItemStyle(),\n            z2: 10\n          });\n          setLabelStyle(rect, getLabelStatesModels(itemModel), {\n            labelFetcher: {\n              getFormattedLabel: function (dataIndex, stateName) {\n                return seriesModel.getFormattedLabel(dataIndex, stateName, 'node');\n              }\n            },\n            labelDataIndex: node.dataIndex,\n            defaultText: node.id\n          });\n          rect.disableLabelAnimation = true;\n          rect.setStyle('fill', node.getVisual('color'));\n          rect.setStyle('decal', node.getVisual('style').decal);\n          setStatesStylesFromModel(rect, itemModel);\n          group.add(rect);\n          nodeData.setItemGraphicEl(node.dataIndex, rect);\n          getECData(rect).dataType = 'node';\n          var focus = emphasisModel.get('focus');\n          toggleHoverEmphasis(rect, focus === 'adjacency' ? node.getAdjacentDataIndices() : focus === 'trajectory' ? node.getTrajectoryDataIndices() : focus, emphasisModel.get('blurScope'), emphasisModel.get('disabled'));\n        });\n        nodeData.eachItemGraphicEl(function (el, dataIndex) {\n          var itemModel = nodeData.getItemModel(dataIndex);\n          if (itemModel.get('draggable')) {\n            el.drift = function (dx, dy) {\n              sankeyView._focusAdjacencyDisabled = true;\n              this.shape.x += dx;\n              this.shape.y += dy;\n              this.dirty();\n              api.dispatchAction({\n                type: 'dragNode',\n                seriesId: seriesModel.id,\n                dataIndex: nodeData.getRawIndex(dataIndex),\n                localX: this.shape.x / width,\n                localY: this.shape.y / height\n              });\n            };\n            el.ondragend = function () {\n              sankeyView._focusAdjacencyDisabled = false;\n            };\n            el.draggable = true;\n            el.cursor = 'move';\n          }\n        });\n        if (!this._data && seriesModel.isAnimationEnabled()) {\n          group.setClipPath(createGridClipShape$1(group.getBoundingRect(), seriesModel, function () {\n            group.removeClipPath();\n          }));\n        }\n        this._data = seriesModel.getData();\n      };\n      SankeyView.prototype.dispose = function () {};\n      SankeyView.type = 'sankey';\n      return SankeyView;\n    }(ChartView);\n    /**\r\n     * Special color, use source node color or target node color\r\n     * @param curveProps curve's style to parse\r\n     * @param orient direction\r\n     * @param edge current curve data\r\n     */\n    function applyCurveStyle(curveProps, orient, edge) {\n      switch (curveProps.fill) {\n        case 'source':\n          curveProps.fill = edge.node1.getVisual('color');\n          curveProps.decal = edge.node1.getVisual('style').decal;\n          break;\n        case 'target':\n          curveProps.fill = edge.node2.getVisual('color');\n          curveProps.decal = edge.node2.getVisual('style').decal;\n          break;\n        case 'gradient':\n          var sourceColor = edge.node1.getVisual('color');\n          var targetColor = edge.node2.getVisual('color');\n          if (isString(sourceColor) && isString(targetColor)) {\n            curveProps.fill = new LinearGradient(0, 0, +(orient === 'horizontal'), +(orient === 'vertical'), [{\n              color: sourceColor,\n              offset: 0\n            }, {\n              color: targetColor,\n              offset: 1\n            }]);\n          }\n      }\n    }\n    // Add animation to the view\n    function createGridClipShape$1(rect, seriesModel, cb) {\n      var rectEl = new Rect({\n        shape: {\n          x: rect.x - 10,\n          y: rect.y - 10,\n          width: 0,\n          height: rect.height + 20\n        }\n      });\n      initProps(rectEl, {\n        shape: {\n          width: rect.width + 20\n        }\n      }, seriesModel, cb);\n      return rectEl;\n    }\n\n    var SankeySeriesModel = /** @class */function (_super) {\n      __extends(SankeySeriesModel, _super);\n      function SankeySeriesModel() {\n        var _this = _super !== null && _super.apply(this, arguments) || this;\n        _this.type = SankeySeriesModel.type;\n        return _this;\n      }\n      /**\r\n       * Init a graph data structure from data in option series\r\n       */\n      SankeySeriesModel.prototype.getInitialData = function (option, ecModel) {\n        var links = option.edges || option.links || [];\n        var nodes = option.data || option.nodes || [];\n        var levels = option.levels || [];\n        this.levelModels = [];\n        var levelModels = this.levelModels;\n        for (var i = 0; i < levels.length; i++) {\n          if (levels[i].depth != null && levels[i].depth >= 0) {\n            levelModels[levels[i].depth] = new Model(levels[i], this, ecModel);\n          } else {\n            if (\"development\" !== 'production') {\n              throw new Error('levels[i].depth is mandatory and should be natural number');\n            }\n          }\n        }\n        var graph = createGraphFromNodeEdge(nodes, links, this, true, beforeLink);\n        return graph.data;\n        function beforeLink(nodeData, edgeData) {\n          nodeData.wrapMethod('getItemModel', function (model, idx) {\n            var seriesModel = model.parentModel;\n            var layout = seriesModel.getData().getItemLayout(idx);\n            if (layout) {\n              var nodeDepth = layout.depth;\n              var levelModel = seriesModel.levelModels[nodeDepth];\n              if (levelModel) {\n                model.parentModel = levelModel;\n              }\n            }\n            return model;\n          });\n          edgeData.wrapMethod('getItemModel', function (model, idx) {\n            var seriesModel = model.parentModel;\n            var edge = seriesModel.getGraph().getEdgeByIndex(idx);\n            var layout = edge.node1.getLayout();\n            if (layout) {\n              var depth = layout.depth;\n              var levelModel = seriesModel.levelModels[depth];\n              if (levelModel) {\n                model.parentModel = levelModel;\n              }\n            }\n            return model;\n          });\n        }\n      };\n      SankeySeriesModel.prototype.setNodePosition = function (dataIndex, localPosition) {\n        var nodes = this.option.data || this.option.nodes;\n        var dataItem = nodes[dataIndex];\n        dataItem.localX = localPosition[0];\n        dataItem.localY = localPosition[1];\n      };\n      /**\r\n       * Return the graphic data structure\r\n       *\r\n       * @return graphic data structure\r\n       */\n      SankeySeriesModel.prototype.getGraph = function () {\n        return this.getData().graph;\n      };\n      /**\r\n       * Get edge data of graphic data structure\r\n       *\r\n       * @return data structure of list\r\n       */\n      SankeySeriesModel.prototype.getEdgeData = function () {\n        return this.getGraph().edgeData;\n      };\n      SankeySeriesModel.prototype.formatTooltip = function (dataIndex, multipleSeries, dataType) {\n        function noValue(val) {\n          return isNaN(val) || val == null;\n        }\n        // dataType === 'node' or empty do not show tooltip by default\n        if (dataType === 'edge') {\n          var params = this.getDataParams(dataIndex, dataType);\n          var rawDataOpt = params.data;\n          var edgeValue = params.value;\n          var edgeName = rawDataOpt.source + ' -- ' + rawDataOpt.target;\n          return createTooltipMarkup('nameValue', {\n            name: edgeName,\n            value: edgeValue,\n            noValue: noValue(edgeValue)\n          });\n        }\n        // dataType === 'node'\n        else {\n          var node = this.getGraph().getNodeByIndex(dataIndex);\n          var value = node.getLayout().value;\n          var name_1 = this.getDataParams(dataIndex, dataType).data.name;\n          return createTooltipMarkup('nameValue', {\n            name: name_1 != null ? name_1 + '' : null,\n            value: value,\n            noValue: noValue(value)\n          });\n        }\n      };\n      SankeySeriesModel.prototype.optionUpdated = function () {};\n      // Override Series.getDataParams()\n      SankeySeriesModel.prototype.getDataParams = function (dataIndex, dataType) {\n        var params = _super.prototype.getDataParams.call(this, dataIndex, dataType);\n        if (params.value == null && dataType === 'node') {\n          var node = this.getGraph().getNodeByIndex(dataIndex);\n          var nodeValue = node.getLayout().value;\n          params.value = nodeValue;\n        }\n        return params;\n      };\n      SankeySeriesModel.type = 'series.sankey';\n      SankeySeriesModel.defaultOption = {\n        // zlevel: 0,\n        z: 2,\n        coordinateSystem: 'view',\n        left: '5%',\n        top: '5%',\n        right: '20%',\n        bottom: '5%',\n        orient: 'horizontal',\n        nodeWidth: 20,\n        nodeGap: 8,\n        draggable: true,\n        layoutIterations: 32,\n        label: {\n          show: true,\n          position: 'right',\n          fontSize: 12\n        },\n        edgeLabel: {\n          show: false,\n          fontSize: 12\n        },\n        levels: [],\n        nodeAlign: 'justify',\n        lineStyle: {\n          color: '#314656',\n          opacity: 0.2,\n          curveness: 0.5\n        },\n        emphasis: {\n          label: {\n            show: true\n          },\n          lineStyle: {\n            opacity: 0.5\n          }\n        },\n        select: {\n          itemStyle: {\n            borderColor: '#212121'\n          }\n        },\n        animationEasing: 'linear',\n        animationDuration: 1000\n      };\n      return SankeySeriesModel;\n    }(SeriesModel);\n\n    function sankeyLayout(ecModel, api) {\n      ecModel.eachSeriesByType('sankey', function (seriesModel) {\n        var nodeWidth = seriesModel.get('nodeWidth');\n        var nodeGap = seriesModel.get('nodeGap');\n        var layoutInfo = getViewRect$4(seriesModel, api);\n        seriesModel.layoutInfo = layoutInfo;\n        var width = layoutInfo.width;\n        var height = layoutInfo.height;\n        var graph = seriesModel.getGraph();\n        var nodes = graph.nodes;\n        var edges = graph.edges;\n        computeNodeValues(nodes);\n        var filteredNodes = filter(nodes, function (node) {\n          return node.getLayout().value === 0;\n        });\n        var iterations = filteredNodes.length !== 0 ? 0 : seriesModel.get('layoutIterations');\n        var orient = seriesModel.get('orient');\n        var nodeAlign = seriesModel.get('nodeAlign');\n        layoutSankey(nodes, edges, nodeWidth, nodeGap, width, height, iterations, orient, nodeAlign);\n      });\n    }\n    /**\r\n     * Get the layout position of the whole view\r\n     */\n    function getViewRect$4(seriesModel, api) {\n      return getLayoutRect(seriesModel.getBoxLayoutParams(), {\n        width: api.getWidth(),\n        height: api.getHeight()\n      });\n    }\n    function layoutSankey(nodes, edges, nodeWidth, nodeGap, width, height, iterations, orient, nodeAlign) {\n      computeNodeBreadths(nodes, edges, nodeWidth, width, height, orient, nodeAlign);\n      computeNodeDepths(nodes, edges, height, width, nodeGap, iterations, orient);\n      computeEdgeDepths(nodes, orient);\n    }\n    /**\r\n     * Compute the value of each node by summing the associated edge's value\r\n     */\n    function computeNodeValues(nodes) {\n      each(nodes, function (node) {\n        var value1 = sum(node.outEdges, getEdgeValue);\n        var value2 = sum(node.inEdges, getEdgeValue);\n        var nodeRawValue = node.getValue() || 0;\n        var value = Math.max(value1, value2, nodeRawValue);\n        node.setLayout({\n          value: value\n        }, true);\n      });\n    }\n    /**\r\n     * Compute the x-position for each node.\r\n     *\r\n     * Here we use Kahn algorithm to detect cycle when we traverse\r\n     * the node to computer the initial x position.\r\n     */\n    function computeNodeBreadths(nodes, edges, nodeWidth, width, height, orient, nodeAlign) {\n      // Used to mark whether the edge is deleted. if it is deleted,\n      // the value is 0, otherwise it is 1.\n      var remainEdges = [];\n      // Storage each node's indegree.\n      var indegreeArr = [];\n      // Used to storage the node with indegree is equal to 0.\n      var zeroIndegrees = [];\n      var nextTargetNode = [];\n      var x = 0;\n      // let kx = 0;\n      for (var i = 0; i < edges.length; i++) {\n        remainEdges[i] = 1;\n      }\n      for (var i = 0; i < nodes.length; i++) {\n        indegreeArr[i] = nodes[i].inEdges.length;\n        if (indegreeArr[i] === 0) {\n          zeroIndegrees.push(nodes[i]);\n        }\n      }\n      var maxNodeDepth = -1;\n      // Traversing nodes using topological sorting to calculate the\n      // horizontal(if orient === 'horizontal') or vertical(if orient === 'vertical')\n      // position of the nodes.\n      while (zeroIndegrees.length) {\n        for (var idx = 0; idx < zeroIndegrees.length; idx++) {\n          var node = zeroIndegrees[idx];\n          var item = node.hostGraph.data.getRawDataItem(node.dataIndex);\n          var isItemDepth = item.depth != null && item.depth >= 0;\n          if (isItemDepth && item.depth > maxNodeDepth) {\n            maxNodeDepth = item.depth;\n          }\n          node.setLayout({\n            depth: isItemDepth ? item.depth : x\n          }, true);\n          orient === 'vertical' ? node.setLayout({\n            dy: nodeWidth\n          }, true) : node.setLayout({\n            dx: nodeWidth\n          }, true);\n          for (var edgeIdx = 0; edgeIdx < node.outEdges.length; edgeIdx++) {\n            var edge = node.outEdges[edgeIdx];\n            var indexEdge = edges.indexOf(edge);\n            remainEdges[indexEdge] = 0;\n            var targetNode = edge.node2;\n            var nodeIndex = nodes.indexOf(targetNode);\n            if (--indegreeArr[nodeIndex] === 0 && nextTargetNode.indexOf(targetNode) < 0) {\n              nextTargetNode.push(targetNode);\n            }\n          }\n        }\n        ++x;\n        zeroIndegrees = nextTargetNode;\n        nextTargetNode = [];\n      }\n      for (var i = 0; i < remainEdges.length; i++) {\n        if (remainEdges[i] === 1) {\n          throw new Error('Sankey is a DAG, the original data has cycle!');\n        }\n      }\n      var maxDepth = maxNodeDepth > x - 1 ? maxNodeDepth : x - 1;\n      if (nodeAlign && nodeAlign !== 'left') {\n        adjustNodeWithNodeAlign(nodes, nodeAlign, orient, maxDepth);\n      }\n      var kx = orient === 'vertical' ? (height - nodeWidth) / maxDepth : (width - nodeWidth) / maxDepth;\n      scaleNodeBreadths(nodes, kx, orient);\n    }\n    function isNodeDepth(node) {\n      var item = node.hostGraph.data.getRawDataItem(node.dataIndex);\n      return item.depth != null && item.depth >= 0;\n    }\n    function adjustNodeWithNodeAlign(nodes, nodeAlign, orient, maxDepth) {\n      if (nodeAlign === 'right') {\n        var nextSourceNode = [];\n        var remainNodes = nodes;\n        var nodeHeight = 0;\n        while (remainNodes.length) {\n          for (var i = 0; i < remainNodes.length; i++) {\n            var node = remainNodes[i];\n            node.setLayout({\n              skNodeHeight: nodeHeight\n            }, true);\n            for (var j = 0; j < node.inEdges.length; j++) {\n              var edge = node.inEdges[j];\n              if (nextSourceNode.indexOf(edge.node1) < 0) {\n                nextSourceNode.push(edge.node1);\n              }\n            }\n          }\n          remainNodes = nextSourceNode;\n          nextSourceNode = [];\n          ++nodeHeight;\n        }\n        each(nodes, function (node) {\n          if (!isNodeDepth(node)) {\n            node.setLayout({\n              depth: Math.max(0, maxDepth - node.getLayout().skNodeHeight)\n            }, true);\n          }\n        });\n      } else if (nodeAlign === 'justify') {\n        moveSinksRight(nodes, maxDepth);\n      }\n    }\n    /**\r\n     * All the node without outEgdes are assigned maximum x-position and\r\n     *     be aligned in the last column.\r\n     *\r\n     * @param nodes.  node of sankey view.\r\n     * @param maxDepth.  use to assign to node without outEdges as x-position.\r\n     */\n    function moveSinksRight(nodes, maxDepth) {\n      each(nodes, function (node) {\n        if (!isNodeDepth(node) && !node.outEdges.length) {\n          node.setLayout({\n            depth: maxDepth\n          }, true);\n        }\n      });\n    }\n    /**\r\n     * Scale node x-position to the width\r\n     *\r\n     * @param nodes  node of sankey view\r\n     * @param kx   multiple used to scale nodes\r\n     */\n    function scaleNodeBreadths(nodes, kx, orient) {\n      each(nodes, function (node) {\n        var nodeDepth = node.getLayout().depth * kx;\n        orient === 'vertical' ? node.setLayout({\n          y: nodeDepth\n        }, true) : node.setLayout({\n          x: nodeDepth\n        }, true);\n      });\n    }\n    /**\r\n     * Using Gauss-Seidel iterations method to compute the node depth(y-position)\r\n     *\r\n     * @param nodes  node of sankey view\r\n     * @param edges  edge of sankey view\r\n     * @param height  the whole height of the area to draw the view\r\n     * @param nodeGap  the vertical distance between two nodes\r\n     *     in the same column.\r\n     * @param iterations  the number of iterations for the algorithm\r\n     */\n    function computeNodeDepths(nodes, edges, height, width, nodeGap, iterations, orient) {\n      var nodesByBreadth = prepareNodesByBreadth(nodes, orient);\n      initializeNodeDepth(nodesByBreadth, edges, height, width, nodeGap, orient);\n      resolveCollisions(nodesByBreadth, nodeGap, height, width, orient);\n      for (var alpha = 1; iterations > 0; iterations--) {\n        // 0.99 is a experience parameter, ensure that each iterations of\n        // changes as small as possible.\n        alpha *= 0.99;\n        relaxRightToLeft(nodesByBreadth, alpha, orient);\n        resolveCollisions(nodesByBreadth, nodeGap, height, width, orient);\n        relaxLeftToRight(nodesByBreadth, alpha, orient);\n        resolveCollisions(nodesByBreadth, nodeGap, height, width, orient);\n      }\n    }\n    function prepareNodesByBreadth(nodes, orient) {\n      var nodesByBreadth = [];\n      var keyAttr = orient === 'vertical' ? 'y' : 'x';\n      var groupResult = groupData(nodes, function (node) {\n        return node.getLayout()[keyAttr];\n      });\n      groupResult.keys.sort(function (a, b) {\n        return a - b;\n      });\n      each(groupResult.keys, function (key) {\n        nodesByBreadth.push(groupResult.buckets.get(key));\n      });\n      return nodesByBreadth;\n    }\n    /**\r\n     * Compute the original y-position for each node\r\n     */\n    function initializeNodeDepth(nodesByBreadth, edges, height, width, nodeGap, orient) {\n      var minKy = Infinity;\n      each(nodesByBreadth, function (nodes) {\n        var n = nodes.length;\n        var sum = 0;\n        each(nodes, function (node) {\n          sum += node.getLayout().value;\n        });\n        var ky = orient === 'vertical' ? (width - (n - 1) * nodeGap) / sum : (height - (n - 1) * nodeGap) / sum;\n        if (ky < minKy) {\n          minKy = ky;\n        }\n      });\n      each(nodesByBreadth, function (nodes) {\n        each(nodes, function (node, i) {\n          var nodeDy = node.getLayout().value * minKy;\n          if (orient === 'vertical') {\n            node.setLayout({\n              x: i\n            }, true);\n            node.setLayout({\n              dx: nodeDy\n            }, true);\n          } else {\n            node.setLayout({\n              y: i\n            }, true);\n            node.setLayout({\n              dy: nodeDy\n            }, true);\n          }\n        });\n      });\n      each(edges, function (edge) {\n        var edgeDy = +edge.getValue() * minKy;\n        edge.setLayout({\n          dy: edgeDy\n        }, true);\n      });\n    }\n    /**\r\n     * Resolve the collision of initialized depth (y-position)\r\n     */\n    function resolveCollisions(nodesByBreadth, nodeGap, height, width, orient) {\n      var keyAttr = orient === 'vertical' ? 'x' : 'y';\n      each(nodesByBreadth, function (nodes) {\n        nodes.sort(function (a, b) {\n          return a.getLayout()[keyAttr] - b.getLayout()[keyAttr];\n        });\n        var nodeX;\n        var node;\n        var dy;\n        var y0 = 0;\n        var n = nodes.length;\n        var nodeDyAttr = orient === 'vertical' ? 'dx' : 'dy';\n        for (var i = 0; i < n; i++) {\n          node = nodes[i];\n          dy = y0 - node.getLayout()[keyAttr];\n          if (dy > 0) {\n            nodeX = node.getLayout()[keyAttr] + dy;\n            orient === 'vertical' ? node.setLayout({\n              x: nodeX\n            }, true) : node.setLayout({\n              y: nodeX\n            }, true);\n          }\n          y0 = node.getLayout()[keyAttr] + node.getLayout()[nodeDyAttr] + nodeGap;\n        }\n        var viewWidth = orient === 'vertical' ? width : height;\n        // If the bottommost node goes outside the bounds, push it back up\n        dy = y0 - nodeGap - viewWidth;\n        if (dy > 0) {\n          nodeX = node.getLayout()[keyAttr] - dy;\n          orient === 'vertical' ? node.setLayout({\n            x: nodeX\n          }, true) : node.setLayout({\n            y: nodeX\n          }, true);\n          y0 = nodeX;\n          for (var i = n - 2; i >= 0; --i) {\n            node = nodes[i];\n            dy = node.getLayout()[keyAttr] + node.getLayout()[nodeDyAttr] + nodeGap - y0;\n            if (dy > 0) {\n              nodeX = node.getLayout()[keyAttr] - dy;\n              orient === 'vertical' ? node.setLayout({\n                x: nodeX\n              }, true) : node.setLayout({\n                y: nodeX\n              }, true);\n            }\n            y0 = node.getLayout()[keyAttr];\n          }\n        }\n      });\n    }\n    /**\r\n     * Change the y-position of the nodes, except most the right side nodes\r\n     * @param nodesByBreadth\r\n     * @param alpha  parameter used to adjust the nodes y-position\r\n     */\n    function relaxRightToLeft(nodesByBreadth, alpha, orient) {\n      each(nodesByBreadth.slice().reverse(), function (nodes) {\n        each(nodes, function (node) {\n          if (node.outEdges.length) {\n            var y = sum(node.outEdges, weightedTarget, orient) / sum(node.outEdges, getEdgeValue);\n            if (isNaN(y)) {\n              var len = node.outEdges.length;\n              y = len ? sum(node.outEdges, centerTarget, orient) / len : 0;\n            }\n            if (orient === 'vertical') {\n              var nodeX = node.getLayout().x + (y - center$1(node, orient)) * alpha;\n              node.setLayout({\n                x: nodeX\n              }, true);\n            } else {\n              var nodeY = node.getLayout().y + (y - center$1(node, orient)) * alpha;\n              node.setLayout({\n                y: nodeY\n              }, true);\n            }\n          }\n        });\n      });\n    }\n    function weightedTarget(edge, orient) {\n      return center$1(edge.node2, orient) * edge.getValue();\n    }\n    function centerTarget(edge, orient) {\n      return center$1(edge.node2, orient);\n    }\n    function weightedSource(edge, orient) {\n      return center$1(edge.node1, orient) * edge.getValue();\n    }\n    function centerSource(edge, orient) {\n      return center$1(edge.node1, orient);\n    }\n    function center$1(node, orient) {\n      return orient === 'vertical' ? node.getLayout().x + node.getLayout().dx / 2 : node.getLayout().y + node.getLayout().dy / 2;\n    }\n    function getEdgeValue(edge) {\n      return edge.getValue();\n    }\n    function sum(array, cb, orient) {\n      var sum = 0;\n      var len = array.length;\n      var i = -1;\n      while (++i < len) {\n        var value = +cb(array[i], orient);\n        if (!isNaN(value)) {\n          sum += value;\n        }\n      }\n      return sum;\n    }\n    /**\r\n     * Change the y-position of the nodes, except most the left side nodes\r\n     */\n    function relaxLeftToRight(nodesByBreadth, alpha, orient) {\n      each(nodesByBreadth, function (nodes) {\n        each(nodes, function (node) {\n          if (node.inEdges.length) {\n            var y = sum(node.inEdges, weightedSource, orient) / sum(node.inEdges, getEdgeValue);\n            if (isNaN(y)) {\n              var len = node.inEdges.length;\n              y = len ? sum(node.inEdges, centerSource, orient) / len : 0;\n            }\n            if (orient === 'vertical') {\n              var nodeX = node.getLayout().x + (y - center$1(node, orient)) * alpha;\n              node.setLayout({\n                x: nodeX\n              }, true);\n            } else {\n              var nodeY = node.getLayout().y + (y - center$1(node, orient)) * alpha;\n              node.setLayout({\n                y: nodeY\n              }, true);\n            }\n          }\n        });\n      });\n    }\n    /**\r\n     * Compute the depth(y-position) of each edge\r\n     */\n    function computeEdgeDepths(nodes, orient) {\n      var keyAttr = orient === 'vertical' ? 'x' : 'y';\n      each(nodes, function (node) {\n        node.outEdges.sort(function (a, b) {\n          return a.node2.getLayout()[keyAttr] - b.node2.getLayout()[keyAttr];\n        });\n        node.inEdges.sort(function (a, b) {\n          return a.node1.getLayout()[keyAttr] - b.node1.getLayout()[keyAttr];\n        });\n      });\n      each(nodes, function (node) {\n        var sy = 0;\n        var ty = 0;\n        each(node.outEdges, function (edge) {\n          edge.setLayout({\n            sy: sy\n          }, true);\n          sy += edge.getLayout().dy;\n        });\n        each(node.inEdges, function (edge) {\n          edge.setLayout({\n            ty: ty\n          }, true);\n          ty += edge.getLayout().dy;\n        });\n      });\n    }\n\n    function sankeyVisual(ecModel) {\n      ecModel.eachSeriesByType('sankey', function (seriesModel) {\n        var graph = seriesModel.getGraph();\n        var nodes = graph.nodes;\n        var edges = graph.edges;\n        if (nodes.length) {\n          var minValue_1 = Infinity;\n          var maxValue_1 = -Infinity;\n          each(nodes, function (node) {\n            var nodeValue = node.getLayout().value;\n            if (nodeValue < minValue_1) {\n              minValue_1 = nodeValue;\n            }\n            if (nodeValue > maxValue_1) {\n              maxValue_1 = nodeValue;\n            }\n          });\n          each(nodes, function (node) {\n            var mapping = new VisualMapping({\n              type: 'color',\n              mappingMethod: 'linear',\n              dataExtent: [minValue_1, maxValue_1],\n              visual: seriesModel.get('color')\n            });\n            var mapValueToColor = mapping.mapValueToVisual(node.getLayout().value);\n            var customColor = node.getModel().get(['itemStyle', 'color']);\n            if (customColor != null) {\n              node.setVisual('color', customColor);\n              node.setVisual('style', {\n                fill: customColor\n              });\n            } else {\n              node.setVisual('color', mapValueToColor);\n              node.setVisual('style', {\n                fill: mapValueToColor\n              });\n            }\n          });\n        }\n        if (edges.length) {\n          each(edges, function (edge) {\n            var edgeStyle = edge.getModel().get('lineStyle');\n            edge.setVisual('style', edgeStyle);\n          });\n        }\n      });\n    }\n\n    function install$i(registers) {\n      registers.registerChartView(SankeyView);\n      registers.registerSeriesModel(SankeySeriesModel);\n      registers.registerLayout(sankeyLayout);\n      registers.registerVisual(sankeyVisual);\n      registers.registerAction({\n        type: 'dragNode',\n        event: 'dragnode',\n        // here can only use 'update' now, other value is not support in echarts.\n        update: 'update'\n      }, function (payload, ecModel) {\n        ecModel.eachComponent({\n          mainType: 'series',\n          subType: 'sankey',\n          query: payload\n        }, function (seriesModel) {\n          seriesModel.setNodePosition(payload.dataIndex, [payload.localX, payload.localY]);\n        });\n      });\n    }\n\n    var WhiskerBoxCommonMixin = /** @class */function () {\n      function WhiskerBoxCommonMixin() {}\n      /**\r\n       * @private\r\n       */\n      WhiskerBoxCommonMixin.prototype._hasEncodeRule = function (key) {\n        var encodeRules = this.getEncode();\n        return encodeRules && encodeRules.get(key) != null;\n      };\n      /**\r\n       * @override\r\n       */\n      WhiskerBoxCommonMixin.prototype.getInitialData = function (option, ecModel) {\n        // When both types of xAxis and yAxis are 'value', layout is\n        // needed to be specified by user. Otherwise, layout can be\n        // judged by which axis is category.\n        var ordinalMeta;\n        var xAxisModel = ecModel.getComponent('xAxis', this.get('xAxisIndex'));\n        var yAxisModel = ecModel.getComponent('yAxis', this.get('yAxisIndex'));\n        var xAxisType = xAxisModel.get('type');\n        var yAxisType = yAxisModel.get('type');\n        var addOrdinal;\n        // FIXME\n        // Consider time axis.\n        if (xAxisType === 'category') {\n          option.layout = 'horizontal';\n          ordinalMeta = xAxisModel.getOrdinalMeta();\n          addOrdinal = !this._hasEncodeRule('x');\n        } else if (yAxisType === 'category') {\n          option.layout = 'vertical';\n          ordinalMeta = yAxisModel.getOrdinalMeta();\n          addOrdinal = !this._hasEncodeRule('y');\n        } else {\n          option.layout = option.layout || 'horizontal';\n        }\n        var coordDims = ['x', 'y'];\n        var baseAxisDimIndex = option.layout === 'horizontal' ? 0 : 1;\n        var baseAxisDim = this._baseAxisDim = coordDims[baseAxisDimIndex];\n        var otherAxisDim = coordDims[1 - baseAxisDimIndex];\n        var axisModels = [xAxisModel, yAxisModel];\n        var baseAxisType = axisModels[baseAxisDimIndex].get('type');\n        var otherAxisType = axisModels[1 - baseAxisDimIndex].get('type');\n        var data = option.data;\n        // Clone a new data for next setOption({}) usage.\n        // Avoid modifying current data will affect further update.\n        if (data && addOrdinal) {\n          var newOptionData_1 = [];\n          each(data, function (item, index) {\n            var newItem;\n            if (isArray(item)) {\n              newItem = item.slice();\n              // Modify current using data.\n              item.unshift(index);\n            } else if (isArray(item.value)) {\n              newItem = extend({}, item);\n              newItem.value = newItem.value.slice();\n              // Modify current using data.\n              item.value.unshift(index);\n            } else {\n              newItem = item;\n            }\n            newOptionData_1.push(newItem);\n          });\n          option.data = newOptionData_1;\n        }\n        var defaultValueDimensions = this.defaultValueDimensions;\n        var coordDimensions = [{\n          name: baseAxisDim,\n          type: getDimensionTypeByAxis(baseAxisType),\n          ordinalMeta: ordinalMeta,\n          otherDims: {\n            tooltip: false,\n            itemName: 0\n          },\n          dimsDef: ['base']\n        }, {\n          name: otherAxisDim,\n          type: getDimensionTypeByAxis(otherAxisType),\n          dimsDef: defaultValueDimensions.slice()\n        }];\n        return createSeriesDataSimply(this, {\n          coordDimensions: coordDimensions,\n          dimensionsCount: defaultValueDimensions.length + 1,\n          encodeDefaulter: curry(makeSeriesEncodeForAxisCoordSys, coordDimensions, this)\n        });\n      };\n      /**\r\n       * If horizontal, base axis is x, otherwise y.\r\n       * @override\r\n       */\n      WhiskerBoxCommonMixin.prototype.getBaseAxis = function () {\n        var dim = this._baseAxisDim;\n        return this.ecModel.getComponent(dim + 'Axis', this.get(dim + 'AxisIndex')).axis;\n      };\n      return WhiskerBoxCommonMixin;\n    }();\n\n    var BoxplotSeriesModel = /** @class */function (_super) {\n      __extends(BoxplotSeriesModel, _super);\n      function BoxplotSeriesModel() {\n        var _this = _super !== null && _super.apply(this, arguments) || this;\n        _this.type = BoxplotSeriesModel.type;\n        // TODO\n        // box width represents group size, so dimension should have 'size'.\n        /**\r\n         * @see <https://en.wikipedia.org/wiki/Box_plot>\r\n         * The meanings of 'min' and 'max' depend on user,\r\n         * and echarts do not need to know it.\r\n         * @readOnly\r\n         */\n        _this.defaultValueDimensions = [{\n          name: 'min',\n          defaultTooltip: true\n        }, {\n          name: 'Q1',\n          defaultTooltip: true\n        }, {\n          name: 'median',\n          defaultTooltip: true\n        }, {\n          name: 'Q3',\n          defaultTooltip: true\n        }, {\n          name: 'max',\n          defaultTooltip: true\n        }];\n        _this.visualDrawType = 'stroke';\n        return _this;\n      }\n      BoxplotSeriesModel.type = 'series.boxplot';\n      BoxplotSeriesModel.dependencies = ['xAxis', 'yAxis', 'grid'];\n      BoxplotSeriesModel.defaultOption = {\n        // zlevel: 0,\n        z: 2,\n        coordinateSystem: 'cartesian2d',\n        legendHoverLink: true,\n        layout: null,\n        boxWidth: [7, 50],\n        itemStyle: {\n          color: '#fff',\n          borderWidth: 1\n        },\n        emphasis: {\n          scale: true,\n          itemStyle: {\n            borderWidth: 2,\n            shadowBlur: 5,\n            shadowOffsetX: 1,\n            shadowOffsetY: 1,\n            shadowColor: 'rgba(0,0,0,0.2)'\n          }\n        },\n        animationDuration: 800\n      };\n      return BoxplotSeriesModel;\n    }(SeriesModel);\n    mixin(BoxplotSeriesModel, WhiskerBoxCommonMixin, true);\n\n    var BoxplotView = /** @class */function (_super) {\n      __extends(BoxplotView, _super);\n      function BoxplotView() {\n        var _this = _super !== null && _super.apply(this, arguments) || this;\n        _this.type = BoxplotView.type;\n        return _this;\n      }\n      BoxplotView.prototype.render = function (seriesModel, ecModel, api) {\n        var data = seriesModel.getData();\n        var group = this.group;\n        var oldData = this._data;\n        // There is no old data only when first rendering or switching from\n        // stream mode to normal mode, where previous elements should be removed.\n        if (!this._data) {\n          group.removeAll();\n        }\n        var constDim = seriesModel.get('layout') === 'horizontal' ? 1 : 0;\n        data.diff(oldData).add(function (newIdx) {\n          if (data.hasValue(newIdx)) {\n            var itemLayout = data.getItemLayout(newIdx);\n            var symbolEl = createNormalBox(itemLayout, data, newIdx, constDim, true);\n            data.setItemGraphicEl(newIdx, symbolEl);\n            group.add(symbolEl);\n          }\n        }).update(function (newIdx, oldIdx) {\n          var symbolEl = oldData.getItemGraphicEl(oldIdx);\n          // Empty data\n          if (!data.hasValue(newIdx)) {\n            group.remove(symbolEl);\n            return;\n          }\n          var itemLayout = data.getItemLayout(newIdx);\n          if (!symbolEl) {\n            symbolEl = createNormalBox(itemLayout, data, newIdx, constDim);\n          } else {\n            saveOldStyle(symbolEl);\n            updateNormalBoxData(itemLayout, symbolEl, data, newIdx);\n          }\n          group.add(symbolEl);\n          data.setItemGraphicEl(newIdx, symbolEl);\n        }).remove(function (oldIdx) {\n          var el = oldData.getItemGraphicEl(oldIdx);\n          el && group.remove(el);\n        }).execute();\n        this._data = data;\n      };\n      BoxplotView.prototype.remove = function (ecModel) {\n        var group = this.group;\n        var data = this._data;\n        this._data = null;\n        data && data.eachItemGraphicEl(function (el) {\n          el && group.remove(el);\n        });\n      };\n      BoxplotView.type = 'boxplot';\n      return BoxplotView;\n    }(ChartView);\n    var BoxPathShape = /** @class */function () {\n      function BoxPathShape() {}\n      return BoxPathShape;\n    }();\n    var BoxPath = /** @class */function (_super) {\n      __extends(BoxPath, _super);\n      function BoxPath(opts) {\n        var _this = _super.call(this, opts) || this;\n        _this.type = 'boxplotBoxPath';\n        return _this;\n      }\n      BoxPath.prototype.getDefaultShape = function () {\n        return new BoxPathShape();\n      };\n      BoxPath.prototype.buildPath = function (ctx, shape) {\n        var ends = shape.points;\n        var i = 0;\n        ctx.moveTo(ends[i][0], ends[i][1]);\n        i++;\n        for (; i < 4; i++) {\n          ctx.lineTo(ends[i][0], ends[i][1]);\n        }\n        ctx.closePath();\n        for (; i < ends.length; i++) {\n          ctx.moveTo(ends[i][0], ends[i][1]);\n          i++;\n          ctx.lineTo(ends[i][0], ends[i][1]);\n        }\n      };\n      return BoxPath;\n    }(Path);\n    function createNormalBox(itemLayout, data, dataIndex, constDim, isInit) {\n      var ends = itemLayout.ends;\n      var el = new BoxPath({\n        shape: {\n          points: isInit ? transInit(ends, constDim, itemLayout) : ends\n        }\n      });\n      updateNormalBoxData(itemLayout, el, data, dataIndex, isInit);\n      return el;\n    }\n    function updateNormalBoxData(itemLayout, el, data, dataIndex, isInit) {\n      var seriesModel = data.hostModel;\n      var updateMethod = graphic[isInit ? 'initProps' : 'updateProps'];\n      updateMethod(el, {\n        shape: {\n          points: itemLayout.ends\n        }\n      }, seriesModel, dataIndex);\n      el.useStyle(data.getItemVisual(dataIndex, 'style'));\n      el.style.strokeNoScale = true;\n      el.z2 = 100;\n      var itemModel = data.getItemModel(dataIndex);\n      var emphasisModel = itemModel.getModel('emphasis');\n      setStatesStylesFromModel(el, itemModel);\n      toggleHoverEmphasis(el, emphasisModel.get('focus'), emphasisModel.get('blurScope'), emphasisModel.get('disabled'));\n    }\n    function transInit(points, dim, itemLayout) {\n      return map(points, function (point) {\n        point = point.slice();\n        point[dim] = itemLayout.initBaseline;\n        return point;\n      });\n    }\n\n    var each$6 = each;\n    function boxplotLayout(ecModel) {\n      var groupResult = groupSeriesByAxis(ecModel);\n      each$6(groupResult, function (groupItem) {\n        var seriesModels = groupItem.seriesModels;\n        if (!seriesModels.length) {\n          return;\n        }\n        calculateBase(groupItem);\n        each$6(seriesModels, function (seriesModel, idx) {\n          layoutSingleSeries(seriesModel, groupItem.boxOffsetList[idx], groupItem.boxWidthList[idx]);\n        });\n      });\n    }\n    /**\r\n     * Group series by axis.\r\n     */\n    function groupSeriesByAxis(ecModel) {\n      var result = [];\n      var axisList = [];\n      ecModel.eachSeriesByType('boxplot', function (seriesModel) {\n        var baseAxis = seriesModel.getBaseAxis();\n        var idx = indexOf(axisList, baseAxis);\n        if (idx < 0) {\n          idx = axisList.length;\n          axisList[idx] = baseAxis;\n          result[idx] = {\n            axis: baseAxis,\n            seriesModels: []\n          };\n        }\n        result[idx].seriesModels.push(seriesModel);\n      });\n      return result;\n    }\n    /**\r\n     * Calculate offset and box width for each series.\r\n     */\n    function calculateBase(groupItem) {\n      var baseAxis = groupItem.axis;\n      var seriesModels = groupItem.seriesModels;\n      var seriesCount = seriesModels.length;\n      var boxWidthList = groupItem.boxWidthList = [];\n      var boxOffsetList = groupItem.boxOffsetList = [];\n      var boundList = [];\n      var bandWidth;\n      if (baseAxis.type === 'category') {\n        bandWidth = baseAxis.getBandWidth();\n      } else {\n        var maxDataCount_1 = 0;\n        each$6(seriesModels, function (seriesModel) {\n          maxDataCount_1 = Math.max(maxDataCount_1, seriesModel.getData().count());\n        });\n        var extent = baseAxis.getExtent();\n        bandWidth = Math.abs(extent[1] - extent[0]) / maxDataCount_1;\n      }\n      each$6(seriesModels, function (seriesModel) {\n        var boxWidthBound = seriesModel.get('boxWidth');\n        if (!isArray(boxWidthBound)) {\n          boxWidthBound = [boxWidthBound, boxWidthBound];\n        }\n        boundList.push([parsePercent$1(boxWidthBound[0], bandWidth) || 0, parsePercent$1(boxWidthBound[1], bandWidth) || 0]);\n      });\n      var availableWidth = bandWidth * 0.8 - 2;\n      var boxGap = availableWidth / seriesCount * 0.3;\n      var boxWidth = (availableWidth - boxGap * (seriesCount - 1)) / seriesCount;\n      var base = boxWidth / 2 - availableWidth / 2;\n      each$6(seriesModels, function (seriesModel, idx) {\n        boxOffsetList.push(base);\n        base += boxGap + boxWidth;\n        boxWidthList.push(Math.min(Math.max(boxWidth, boundList[idx][0]), boundList[idx][1]));\n      });\n    }\n    /**\r\n     * Calculate points location for each series.\r\n     */\n    function layoutSingleSeries(seriesModel, offset, boxWidth) {\n      var coordSys = seriesModel.coordinateSystem;\n      var data = seriesModel.getData();\n      var halfWidth = boxWidth / 2;\n      var cDimIdx = seriesModel.get('layout') === 'horizontal' ? 0 : 1;\n      var vDimIdx = 1 - cDimIdx;\n      var coordDims = ['x', 'y'];\n      var cDim = data.mapDimension(coordDims[cDimIdx]);\n      var vDims = data.mapDimensionsAll(coordDims[vDimIdx]);\n      if (cDim == null || vDims.length < 5) {\n        return;\n      }\n      for (var dataIndex = 0; dataIndex < data.count(); dataIndex++) {\n        var axisDimVal = data.get(cDim, dataIndex);\n        var median = getPoint(axisDimVal, vDims[2], dataIndex);\n        var end1 = getPoint(axisDimVal, vDims[0], dataIndex);\n        var end2 = getPoint(axisDimVal, vDims[1], dataIndex);\n        var end4 = getPoint(axisDimVal, vDims[3], dataIndex);\n        var end5 = getPoint(axisDimVal, vDims[4], dataIndex);\n        var ends = [];\n        addBodyEnd(ends, end2, false);\n        addBodyEnd(ends, end4, true);\n        ends.push(end1, end2, end5, end4);\n        layEndLine(ends, end1);\n        layEndLine(ends, end5);\n        layEndLine(ends, median);\n        data.setItemLayout(dataIndex, {\n          initBaseline: median[vDimIdx],\n          ends: ends\n        });\n      }\n      function getPoint(axisDimVal, dim, dataIndex) {\n        var val = data.get(dim, dataIndex);\n        var p = [];\n        p[cDimIdx] = axisDimVal;\n        p[vDimIdx] = val;\n        var point;\n        if (isNaN(axisDimVal) || isNaN(val)) {\n          point = [NaN, NaN];\n        } else {\n          point = coordSys.dataToPoint(p);\n          point[cDimIdx] += offset;\n        }\n        return point;\n      }\n      function addBodyEnd(ends, point, start) {\n        var point1 = point.slice();\n        var point2 = point.slice();\n        point1[cDimIdx] += halfWidth;\n        point2[cDimIdx] -= halfWidth;\n        start ? ends.push(point1, point2) : ends.push(point2, point1);\n      }\n      function layEndLine(ends, endCenter) {\n        var from = endCenter.slice();\n        var to = endCenter.slice();\n        from[cDimIdx] -= halfWidth;\n        to[cDimIdx] += halfWidth;\n        ends.push(from, to);\n      }\n    }\n\n    /**\r\n     * See:\r\n     *  <https://en.wikipedia.org/wiki/Box_plot#cite_note-frigge_hoaglin_iglewicz-2>\r\n     *  <http://stat.ethz.ch/R-manual/R-devel/library/grDevices/html/boxplot.stats.html>\r\n     *\r\n     * Helper method for preparing data.\r\n     *\r\n     * @param rawData like\r\n     *        [\r\n     *            [12,232,443], (raw data set for the first box)\r\n     *            [3843,5545,1232], (raw data set for the second box)\r\n     *            ...\r\n     *        ]\r\n     * @param opt.boundIQR=1.5 Data less than min bound is outlier.\r\n     *      default 1.5, means Q1 - 1.5 * (Q3 - Q1).\r\n     *      If 'none'/0 passed, min bound will not be used.\r\n     */\n    function prepareBoxplotData(rawData, opt) {\n      opt = opt || {};\n      var boxData = [];\n      var outliers = [];\n      var boundIQR = opt.boundIQR;\n      var useExtreme = boundIQR === 'none' || boundIQR === 0;\n      for (var i = 0; i < rawData.length; i++) {\n        var ascList = asc(rawData[i].slice());\n        var Q1 = quantile(ascList, 0.25);\n        var Q2 = quantile(ascList, 0.5);\n        var Q3 = quantile(ascList, 0.75);\n        var min = ascList[0];\n        var max = ascList[ascList.length - 1];\n        var bound = (boundIQR == null ? 1.5 : boundIQR) * (Q3 - Q1);\n        var low = useExtreme ? min : Math.max(min, Q1 - bound);\n        var high = useExtreme ? max : Math.min(max, Q3 + bound);\n        var itemNameFormatter = opt.itemNameFormatter;\n        var itemName = isFunction(itemNameFormatter) ? itemNameFormatter({\n          value: i\n        }) : isString(itemNameFormatter) ? itemNameFormatter.replace('{value}', i + '') : i + '';\n        boxData.push([itemName, low, Q1, Q2, Q3, high]);\n        for (var j = 0; j < ascList.length; j++) {\n          var dataItem = ascList[j];\n          if (dataItem < low || dataItem > high) {\n            var outlier = [itemName, dataItem];\n            outliers.push(outlier);\n          }\n        }\n      }\n      return {\n        boxData: boxData,\n        outliers: outliers\n      };\n    }\n\n    var boxplotTransform = {\n      type: 'echarts:boxplot',\n      transform: function transform(params) {\n        var upstream = params.upstream;\n        if (upstream.sourceFormat !== SOURCE_FORMAT_ARRAY_ROWS) {\n          var errMsg = '';\n          if (\"development\" !== 'production') {\n            errMsg = makePrintable('source data is not applicable for this boxplot transform. Expect number[][].');\n          }\n          throwError(errMsg);\n        }\n        var result = prepareBoxplotData(upstream.getRawData(), params.config);\n        return [{\n          dimensions: ['ItemName', 'Low', 'Q1', 'Q2', 'Q3', 'High'],\n          data: result.boxData\n        }, {\n          data: result.outliers\n        }];\n      }\n    };\n\n    function install$j(registers) {\n      registers.registerSeriesModel(BoxplotSeriesModel);\n      registers.registerChartView(BoxplotView);\n      registers.registerLayout(boxplotLayout);\n      registers.registerTransform(boxplotTransform);\n    }\n\n    var positiveBorderColorQuery = ['itemStyle', 'borderColor'];\n    var negativeBorderColorQuery = ['itemStyle', 'borderColor0'];\n    var dojiBorderColorQuery = ['itemStyle', 'borderColorDoji'];\n    var positiveColorQuery = ['itemStyle', 'color'];\n    var negativeColorQuery = ['itemStyle', 'color0'];\n    function getColor(sign, model) {\n      return model.get(sign > 0 ? positiveColorQuery : negativeColorQuery);\n    }\n    function getBorderColor(sign, model) {\n      return model.get(sign === 0 ? dojiBorderColorQuery : sign > 0 ? positiveBorderColorQuery : negativeBorderColorQuery);\n    }\n    var candlestickVisual = {\n      seriesType: 'candlestick',\n      plan: createRenderPlanner(),\n      // For legend.\n      performRawSeries: true,\n      reset: function (seriesModel, ecModel) {\n        // Only visible series has each data be visual encoded\n        if (ecModel.isSeriesFiltered(seriesModel)) {\n          return;\n        }\n        var isLargeRender = seriesModel.pipelineContext.large;\n        return !isLargeRender && {\n          progress: function (params, data) {\n            var dataIndex;\n            while ((dataIndex = params.next()) != null) {\n              var itemModel = data.getItemModel(dataIndex);\n              var sign = data.getItemLayout(dataIndex).sign;\n              var style = itemModel.getItemStyle();\n              style.fill = getColor(sign, itemModel);\n              style.stroke = getBorderColor(sign, itemModel) || style.fill;\n              var existsStyle = data.ensureUniqueItemVisual(dataIndex, 'style');\n              extend(existsStyle, style);\n            }\n          }\n        };\n      }\n    };\n\n    var SKIP_PROPS = ['color', 'borderColor'];\n    var CandlestickView = /** @class */function (_super) {\n      __extends(CandlestickView, _super);\n      function CandlestickView() {\n        var _this = _super !== null && _super.apply(this, arguments) || this;\n        _this.type = CandlestickView.type;\n        return _this;\n      }\n      CandlestickView.prototype.render = function (seriesModel, ecModel, api) {\n        // If there is clipPath created in large mode. Remove it.\n        this.group.removeClipPath();\n        // Clear previously rendered progressive elements.\n        this._progressiveEls = null;\n        this._updateDrawMode(seriesModel);\n        this._isLargeDraw ? this._renderLarge(seriesModel) : this._renderNormal(seriesModel);\n      };\n      CandlestickView.prototype.incrementalPrepareRender = function (seriesModel, ecModel, api) {\n        this._clear();\n        this._updateDrawMode(seriesModel);\n      };\n      CandlestickView.prototype.incrementalRender = function (params, seriesModel, ecModel, api) {\n        this._progressiveEls = [];\n        this._isLargeDraw ? this._incrementalRenderLarge(params, seriesModel) : this._incrementalRenderNormal(params, seriesModel);\n      };\n      CandlestickView.prototype.eachRendered = function (cb) {\n        traverseElements(this._progressiveEls || this.group, cb);\n      };\n      CandlestickView.prototype._updateDrawMode = function (seriesModel) {\n        var isLargeDraw = seriesModel.pipelineContext.large;\n        if (this._isLargeDraw == null || isLargeDraw !== this._isLargeDraw) {\n          this._isLargeDraw = isLargeDraw;\n          this._clear();\n        }\n      };\n      CandlestickView.prototype._renderNormal = function (seriesModel) {\n        var data = seriesModel.getData();\n        var oldData = this._data;\n        var group = this.group;\n        var isSimpleBox = data.getLayout('isSimpleBox');\n        var needsClip = seriesModel.get('clip', true);\n        var coord = seriesModel.coordinateSystem;\n        var clipArea = coord.getArea && coord.getArea();\n        // There is no old data only when first rendering or switching from\n        // stream mode to normal mode, where previous elements should be removed.\n        if (!this._data) {\n          group.removeAll();\n        }\n        data.diff(oldData).add(function (newIdx) {\n          if (data.hasValue(newIdx)) {\n            var itemLayout = data.getItemLayout(newIdx);\n            if (needsClip && isNormalBoxClipped(clipArea, itemLayout)) {\n              return;\n            }\n            var el = createNormalBox$1(itemLayout, newIdx, true);\n            initProps(el, {\n              shape: {\n                points: itemLayout.ends\n              }\n            }, seriesModel, newIdx);\n            setBoxCommon(el, data, newIdx, isSimpleBox);\n            group.add(el);\n            data.setItemGraphicEl(newIdx, el);\n          }\n        }).update(function (newIdx, oldIdx) {\n          var el = oldData.getItemGraphicEl(oldIdx);\n          // Empty data\n          if (!data.hasValue(newIdx)) {\n            group.remove(el);\n            return;\n          }\n          var itemLayout = data.getItemLayout(newIdx);\n          if (needsClip && isNormalBoxClipped(clipArea, itemLayout)) {\n            group.remove(el);\n            return;\n          }\n          if (!el) {\n            el = createNormalBox$1(itemLayout);\n          } else {\n            updateProps(el, {\n              shape: {\n                points: itemLayout.ends\n              }\n            }, seriesModel, newIdx);\n            saveOldStyle(el);\n          }\n          setBoxCommon(el, data, newIdx, isSimpleBox);\n          group.add(el);\n          data.setItemGraphicEl(newIdx, el);\n        }).remove(function (oldIdx) {\n          var el = oldData.getItemGraphicEl(oldIdx);\n          el && group.remove(el);\n        }).execute();\n        this._data = data;\n      };\n      CandlestickView.prototype._renderLarge = function (seriesModel) {\n        this._clear();\n        createLarge$1(seriesModel, this.group);\n        var clipPath = seriesModel.get('clip', true) ? createClipPath(seriesModel.coordinateSystem, false, seriesModel) : null;\n        if (clipPath) {\n          this.group.setClipPath(clipPath);\n        } else {\n          this.group.removeClipPath();\n        }\n      };\n      CandlestickView.prototype._incrementalRenderNormal = function (params, seriesModel) {\n        var data = seriesModel.getData();\n        var isSimpleBox = data.getLayout('isSimpleBox');\n        var dataIndex;\n        while ((dataIndex = params.next()) != null) {\n          var itemLayout = data.getItemLayout(dataIndex);\n          var el = createNormalBox$1(itemLayout);\n          setBoxCommon(el, data, dataIndex, isSimpleBox);\n          el.incremental = true;\n          this.group.add(el);\n          this._progressiveEls.push(el);\n        }\n      };\n      CandlestickView.prototype._incrementalRenderLarge = function (params, seriesModel) {\n        createLarge$1(seriesModel, this.group, this._progressiveEls, true);\n      };\n      CandlestickView.prototype.remove = function (ecModel) {\n        this._clear();\n      };\n      CandlestickView.prototype._clear = function () {\n        this.group.removeAll();\n        this._data = null;\n      };\n      CandlestickView.type = 'candlestick';\n      return CandlestickView;\n    }(ChartView);\n    var NormalBoxPathShape = /** @class */function () {\n      function NormalBoxPathShape() {}\n      return NormalBoxPathShape;\n    }();\n    var NormalBoxPath = /** @class */function (_super) {\n      __extends(NormalBoxPath, _super);\n      function NormalBoxPath(opts) {\n        var _this = _super.call(this, opts) || this;\n        _this.type = 'normalCandlestickBox';\n        return _this;\n      }\n      NormalBoxPath.prototype.getDefaultShape = function () {\n        return new NormalBoxPathShape();\n      };\n      NormalBoxPath.prototype.buildPath = function (ctx, shape) {\n        var ends = shape.points;\n        if (this.__simpleBox) {\n          ctx.moveTo(ends[4][0], ends[4][1]);\n          ctx.lineTo(ends[6][0], ends[6][1]);\n        } else {\n          ctx.moveTo(ends[0][0], ends[0][1]);\n          ctx.lineTo(ends[1][0], ends[1][1]);\n          ctx.lineTo(ends[2][0], ends[2][1]);\n          ctx.lineTo(ends[3][0], ends[3][1]);\n          ctx.closePath();\n          ctx.moveTo(ends[4][0], ends[4][1]);\n          ctx.lineTo(ends[5][0], ends[5][1]);\n          ctx.moveTo(ends[6][0], ends[6][1]);\n          ctx.lineTo(ends[7][0], ends[7][1]);\n        }\n      };\n      return NormalBoxPath;\n    }(Path);\n    function createNormalBox$1(itemLayout, dataIndex, isInit) {\n      var ends = itemLayout.ends;\n      return new NormalBoxPath({\n        shape: {\n          points: isInit ? transInit$1(ends, itemLayout) : ends\n        },\n        z2: 100\n      });\n    }\n    function isNormalBoxClipped(clipArea, itemLayout) {\n      var clipped = true;\n      for (var i = 0; i < itemLayout.ends.length; i++) {\n        // If any point are in the region.\n        if (clipArea.contain(itemLayout.ends[i][0], itemLayout.ends[i][1])) {\n          clipped = false;\n          break;\n        }\n      }\n      return clipped;\n    }\n    function setBoxCommon(el, data, dataIndex, isSimpleBox) {\n      var itemModel = data.getItemModel(dataIndex);\n      el.useStyle(data.getItemVisual(dataIndex, 'style'));\n      el.style.strokeNoScale = true;\n      el.__simpleBox = isSimpleBox;\n      setStatesStylesFromModel(el, itemModel);\n      var sign = data.getItemLayout(dataIndex).sign;\n      each(el.states, function (state, stateName) {\n        var stateModel = itemModel.getModel(stateName);\n        var color = getColor(sign, stateModel);\n        var borderColor = getBorderColor(sign, stateModel) || color;\n        var stateStyle = state.style || (state.style = {});\n        color && (stateStyle.fill = color);\n        borderColor && (stateStyle.stroke = borderColor);\n      });\n      var emphasisModel = itemModel.getModel('emphasis');\n      toggleHoverEmphasis(el, emphasisModel.get('focus'), emphasisModel.get('blurScope'), emphasisModel.get('disabled'));\n    }\n    function transInit$1(points, itemLayout) {\n      return map(points, function (point) {\n        point = point.slice();\n        point[1] = itemLayout.initBaseline;\n        return point;\n      });\n    }\n    var LargeBoxPathShape = /** @class */function () {\n      function LargeBoxPathShape() {}\n      return LargeBoxPathShape;\n    }();\n    var LargeBoxPath = /** @class */function (_super) {\n      __extends(LargeBoxPath, _super);\n      function LargeBoxPath(opts) {\n        var _this = _super.call(this, opts) || this;\n        _this.type = 'largeCandlestickBox';\n        return _this;\n      }\n      LargeBoxPath.prototype.getDefaultShape = function () {\n        return new LargeBoxPathShape();\n      };\n      LargeBoxPath.prototype.buildPath = function (ctx, shape) {\n        // Drawing lines is more efficient than drawing\n        // a whole line or drawing rects.\n        var points = shape.points;\n        for (var i = 0; i < points.length;) {\n          if (this.__sign === points[i++]) {\n            var x = points[i++];\n            ctx.moveTo(x, points[i++]);\n            ctx.lineTo(x, points[i++]);\n          } else {\n            i += 3;\n          }\n        }\n      };\n      return LargeBoxPath;\n    }(Path);\n    function createLarge$1(seriesModel, group, progressiveEls, incremental) {\n      var data = seriesModel.getData();\n      var largePoints = data.getLayout('largePoints');\n      var elP = new LargeBoxPath({\n        shape: {\n          points: largePoints\n        },\n        __sign: 1,\n        ignoreCoarsePointer: true\n      });\n      group.add(elP);\n      var elN = new LargeBoxPath({\n        shape: {\n          points: largePoints\n        },\n        __sign: -1,\n        ignoreCoarsePointer: true\n      });\n      group.add(elN);\n      var elDoji = new LargeBoxPath({\n        shape: {\n          points: largePoints\n        },\n        __sign: 0,\n        ignoreCoarsePointer: true\n      });\n      group.add(elDoji);\n      setLargeStyle(1, elP, seriesModel);\n      setLargeStyle(-1, elN, seriesModel);\n      setLargeStyle(0, elDoji, seriesModel);\n      if (incremental) {\n        elP.incremental = true;\n        elN.incremental = true;\n      }\n      if (progressiveEls) {\n        progressiveEls.push(elP, elN);\n      }\n    }\n    function setLargeStyle(sign, el, seriesModel, data) {\n      // TODO put in visual?\n      var borderColor = getBorderColor(sign, seriesModel)\n      // Use color for border color by default.\n      || getColor(sign, seriesModel);\n      // Color must be excluded.\n      // Because symbol provide setColor individually to set fill and stroke\n      var itemStyle = seriesModel.getModel('itemStyle').getItemStyle(SKIP_PROPS);\n      el.useStyle(itemStyle);\n      el.style.fill = null;\n      el.style.stroke = borderColor;\n    }\n\n    var CandlestickSeriesModel = /** @class */function (_super) {\n      __extends(CandlestickSeriesModel, _super);\n      function CandlestickSeriesModel() {\n        var _this = _super !== null && _super.apply(this, arguments) || this;\n        _this.type = CandlestickSeriesModel.type;\n        _this.defaultValueDimensions = [{\n          name: 'open',\n          defaultTooltip: true\n        }, {\n          name: 'close',\n          defaultTooltip: true\n        }, {\n          name: 'lowest',\n          defaultTooltip: true\n        }, {\n          name: 'highest',\n          defaultTooltip: true\n        }];\n        return _this;\n      }\n      /**\r\n       * Get dimension for shadow in dataZoom\r\n       * @return dimension name\r\n       */\n      CandlestickSeriesModel.prototype.getShadowDim = function () {\n        return 'open';\n      };\n      CandlestickSeriesModel.prototype.brushSelector = function (dataIndex, data, selectors) {\n        var itemLayout = data.getItemLayout(dataIndex);\n        return itemLayout && selectors.rect(itemLayout.brushRect);\n      };\n      CandlestickSeriesModel.type = 'series.candlestick';\n      CandlestickSeriesModel.dependencies = ['xAxis', 'yAxis', 'grid'];\n      CandlestickSeriesModel.defaultOption = {\n        // zlevel: 0,\n        z: 2,\n        coordinateSystem: 'cartesian2d',\n        legendHoverLink: true,\n        // xAxisIndex: 0,\n        // yAxisIndex: 0,\n        layout: null,\n        clip: true,\n        itemStyle: {\n          color: '#eb5454',\n          color0: '#47b262',\n          borderColor: '#eb5454',\n          borderColor0: '#47b262',\n          borderColorDoji: null,\n          // borderColor: '#d24040',\n          // borderColor0: '#398f4f',\n          borderWidth: 1\n        },\n        emphasis: {\n          itemStyle: {\n            borderWidth: 2\n          }\n        },\n        barMaxWidth: null,\n        barMinWidth: null,\n        barWidth: null,\n        large: true,\n        largeThreshold: 600,\n        progressive: 3e3,\n        progressiveThreshold: 1e4,\n        progressiveChunkMode: 'mod',\n        animationEasing: 'linear',\n        animationDuration: 300\n      };\n      return CandlestickSeriesModel;\n    }(SeriesModel);\n    mixin(CandlestickSeriesModel, WhiskerBoxCommonMixin, true);\n\n    function candlestickPreprocessor(option) {\n      if (!option || !isArray(option.series)) {\n        return;\n      }\n      // Translate 'k' to 'candlestick'.\n      each(option.series, function (seriesItem) {\n        if (isObject(seriesItem) && seriesItem.type === 'k') {\n          seriesItem.type = 'candlestick';\n        }\n      });\n    }\n\n    var candlestickLayout = {\n      seriesType: 'candlestick',\n      plan: createRenderPlanner(),\n      reset: function (seriesModel) {\n        var coordSys = seriesModel.coordinateSystem;\n        var data = seriesModel.getData();\n        var candleWidth = calculateCandleWidth(seriesModel, data);\n        var cDimIdx = 0;\n        var vDimIdx = 1;\n        var coordDims = ['x', 'y'];\n        var cDimI = data.getDimensionIndex(data.mapDimension(coordDims[cDimIdx]));\n        var vDimsI = map(data.mapDimensionsAll(coordDims[vDimIdx]), data.getDimensionIndex, data);\n        var openDimI = vDimsI[0];\n        var closeDimI = vDimsI[1];\n        var lowestDimI = vDimsI[2];\n        var highestDimI = vDimsI[3];\n        data.setLayout({\n          candleWidth: candleWidth,\n          // The value is experimented visually.\n          isSimpleBox: candleWidth <= 1.3\n        });\n        if (cDimI < 0 || vDimsI.length < 4) {\n          return;\n        }\n        return {\n          progress: seriesModel.pipelineContext.large ? largeProgress : normalProgress\n        };\n        function normalProgress(params, data) {\n          var dataIndex;\n          var store = data.getStore();\n          while ((dataIndex = params.next()) != null) {\n            var axisDimVal = store.get(cDimI, dataIndex);\n            var openVal = store.get(openDimI, dataIndex);\n            var closeVal = store.get(closeDimI, dataIndex);\n            var lowestVal = store.get(lowestDimI, dataIndex);\n            var highestVal = store.get(highestDimI, dataIndex);\n            var ocLow = Math.min(openVal, closeVal);\n            var ocHigh = Math.max(openVal, closeVal);\n            var ocLowPoint = getPoint(ocLow, axisDimVal);\n            var ocHighPoint = getPoint(ocHigh, axisDimVal);\n            var lowestPoint = getPoint(lowestVal, axisDimVal);\n            var highestPoint = getPoint(highestVal, axisDimVal);\n            var ends = [];\n            addBodyEnd(ends, ocHighPoint, 0);\n            addBodyEnd(ends, ocLowPoint, 1);\n            ends.push(subPixelOptimizePoint(highestPoint), subPixelOptimizePoint(ocHighPoint), subPixelOptimizePoint(lowestPoint), subPixelOptimizePoint(ocLowPoint));\n            var itemModel = data.getItemModel(dataIndex);\n            var hasDojiColor = !!itemModel.get(['itemStyle', 'borderColorDoji']);\n            data.setItemLayout(dataIndex, {\n              sign: getSign(store, dataIndex, openVal, closeVal, closeDimI, hasDojiColor),\n              initBaseline: openVal > closeVal ? ocHighPoint[vDimIdx] : ocLowPoint[vDimIdx],\n              ends: ends,\n              brushRect: makeBrushRect(lowestVal, highestVal, axisDimVal)\n            });\n          }\n          function getPoint(val, axisDimVal) {\n            var p = [];\n            p[cDimIdx] = axisDimVal;\n            p[vDimIdx] = val;\n            return isNaN(axisDimVal) || isNaN(val) ? [NaN, NaN] : coordSys.dataToPoint(p);\n          }\n          function addBodyEnd(ends, point, start) {\n            var point1 = point.slice();\n            var point2 = point.slice();\n            point1[cDimIdx] = subPixelOptimize$1(point1[cDimIdx] + candleWidth / 2, 1, false);\n            point2[cDimIdx] = subPixelOptimize$1(point2[cDimIdx] - candleWidth / 2, 1, true);\n            start ? ends.push(point1, point2) : ends.push(point2, point1);\n          }\n          function makeBrushRect(lowestVal, highestVal, axisDimVal) {\n            var pmin = getPoint(lowestVal, axisDimVal);\n            var pmax = getPoint(highestVal, axisDimVal);\n            pmin[cDimIdx] -= candleWidth / 2;\n            pmax[cDimIdx] -= candleWidth / 2;\n            return {\n              x: pmin[0],\n              y: pmin[1],\n              width:  candleWidth ,\n              height:  pmax[1] - pmin[1] \n            };\n          }\n          function subPixelOptimizePoint(point) {\n            point[cDimIdx] = subPixelOptimize$1(point[cDimIdx], 1);\n            return point;\n          }\n        }\n        function largeProgress(params, data) {\n          // Structure: [sign, x, yhigh, ylow, sign, x, yhigh, ylow, ...]\n          var points = createFloat32Array(params.count * 4);\n          var offset = 0;\n          var point;\n          var tmpIn = [];\n          var tmpOut = [];\n          var dataIndex;\n          var store = data.getStore();\n          var hasDojiColor = !!seriesModel.get(['itemStyle', 'borderColorDoji']);\n          while ((dataIndex = params.next()) != null) {\n            var axisDimVal = store.get(cDimI, dataIndex);\n            var openVal = store.get(openDimI, dataIndex);\n            var closeVal = store.get(closeDimI, dataIndex);\n            var lowestVal = store.get(lowestDimI, dataIndex);\n            var highestVal = store.get(highestDimI, dataIndex);\n            if (isNaN(axisDimVal) || isNaN(lowestVal) || isNaN(highestVal)) {\n              points[offset++] = NaN;\n              offset += 3;\n              continue;\n            }\n            points[offset++] = getSign(store, dataIndex, openVal, closeVal, closeDimI, hasDojiColor);\n            tmpIn[cDimIdx] = axisDimVal;\n            tmpIn[vDimIdx] = lowestVal;\n            point = coordSys.dataToPoint(tmpIn, null, tmpOut);\n            points[offset++] = point ? point[0] : NaN;\n            points[offset++] = point ? point[1] : NaN;\n            tmpIn[vDimIdx] = highestVal;\n            point = coordSys.dataToPoint(tmpIn, null, tmpOut);\n            points[offset++] = point ? point[1] : NaN;\n          }\n          data.setLayout('largePoints', points);\n        }\n      }\n    };\n    /**\r\n     * Get the sign of a single data.\r\n     *\r\n     * @returns 0 for doji with hasDojiColor: true,\r\n     *          1 for positive,\r\n     *          -1 for negative.\r\n     */\n    function getSign(store, dataIndex, openVal, closeVal, closeDimI, hasDojiColor) {\n      var sign;\n      if (openVal > closeVal) {\n        sign = -1;\n      } else if (openVal < closeVal) {\n        sign = 1;\n      } else {\n        sign = hasDojiColor\n        // When doji color is set, use it instead of color/color0.\n        ? 0 : dataIndex > 0\n        // If close === open, compare with close of last record\n        ? store.get(closeDimI, dataIndex - 1) <= closeVal ? 1 : -1\n        // No record of previous, set to be positive\n        : 1;\n      }\n      return sign;\n    }\n    function calculateCandleWidth(seriesModel, data) {\n      var baseAxis = seriesModel.getBaseAxis();\n      var extent;\n      var bandWidth = baseAxis.type === 'category' ? baseAxis.getBandWidth() : (extent = baseAxis.getExtent(), Math.abs(extent[1] - extent[0]) / data.count());\n      var barMaxWidth = parsePercent$1(retrieve2(seriesModel.get('barMaxWidth'), bandWidth), bandWidth);\n      var barMinWidth = parsePercent$1(retrieve2(seriesModel.get('barMinWidth'), 1), bandWidth);\n      var barWidth = seriesModel.get('barWidth');\n      return barWidth != null ? parsePercent$1(barWidth, bandWidth)\n      // Put max outer to ensure bar visible in spite of overlap.\n      : Math.max(Math.min(bandWidth / 2, barMaxWidth), barMinWidth);\n    }\n\n    function install$k(registers) {\n      registers.registerChartView(CandlestickView);\n      registers.registerSeriesModel(CandlestickSeriesModel);\n      registers.registerPreprocessor(candlestickPreprocessor);\n      registers.registerVisual(candlestickVisual);\n      registers.registerLayout(candlestickLayout);\n    }\n\n    function updateRipplePath(rippleGroup, effectCfg) {\n      var color = effectCfg.rippleEffectColor || effectCfg.color;\n      rippleGroup.eachChild(function (ripplePath) {\n        ripplePath.attr({\n          z: effectCfg.z,\n          zlevel: effectCfg.zlevel,\n          style: {\n            stroke: effectCfg.brushType === 'stroke' ? color : null,\n            fill: effectCfg.brushType === 'fill' ? color : null\n          }\n        });\n      });\n    }\n    var EffectSymbol = /** @class */function (_super) {\n      __extends(EffectSymbol, _super);\n      function EffectSymbol(data, idx) {\n        var _this = _super.call(this) || this;\n        var symbol = new Symbol(data, idx);\n        var rippleGroup = new Group();\n        _this.add(symbol);\n        _this.add(rippleGroup);\n        _this.updateData(data, idx);\n        return _this;\n      }\n      EffectSymbol.prototype.stopEffectAnimation = function () {\n        this.childAt(1).removeAll();\n      };\n      EffectSymbol.prototype.startEffectAnimation = function (effectCfg) {\n        var symbolType = effectCfg.symbolType;\n        var color = effectCfg.color;\n        var rippleNumber = effectCfg.rippleNumber;\n        var rippleGroup = this.childAt(1);\n        for (var i = 0; i < rippleNumber; i++) {\n          // If width/height are set too small (e.g., set to 1) on ios10\n          // and macOS Sierra, a circle stroke become a rect, no matter what\n          // the scale is set. So we set width/height as 2. See #4136.\n          var ripplePath = createSymbol(symbolType, -1, -1, 2, 2, color);\n          ripplePath.attr({\n            style: {\n              strokeNoScale: true\n            },\n            z2: 99,\n            silent: true,\n            scaleX: 0.5,\n            scaleY: 0.5\n          });\n          var delay = -i / rippleNumber * effectCfg.period + effectCfg.effectOffset;\n          ripplePath.animate('', true).when(effectCfg.period, {\n            scaleX: effectCfg.rippleScale / 2,\n            scaleY: effectCfg.rippleScale / 2\n          }).delay(delay).start();\n          ripplePath.animateStyle(true).when(effectCfg.period, {\n            opacity: 0\n          }).delay(delay).start();\n          rippleGroup.add(ripplePath);\n        }\n        updateRipplePath(rippleGroup, effectCfg);\n      };\n      /**\r\n       * Update effect symbol\r\n       */\n      EffectSymbol.prototype.updateEffectAnimation = function (effectCfg) {\n        var oldEffectCfg = this._effectCfg;\n        var rippleGroup = this.childAt(1);\n        // Must reinitialize effect if following configuration changed\n        var DIFFICULT_PROPS = ['symbolType', 'period', 'rippleScale', 'rippleNumber'];\n        for (var i = 0; i < DIFFICULT_PROPS.length; i++) {\n          var propName = DIFFICULT_PROPS[i];\n          if (oldEffectCfg[propName] !== effectCfg[propName]) {\n            this.stopEffectAnimation();\n            this.startEffectAnimation(effectCfg);\n            return;\n          }\n        }\n        updateRipplePath(rippleGroup, effectCfg);\n      };\n      /**\r\n       * Highlight symbol\r\n       */\n      EffectSymbol.prototype.highlight = function () {\n        enterEmphasis(this);\n      };\n      /**\r\n       * Downplay symbol\r\n       */\n      EffectSymbol.prototype.downplay = function () {\n        leaveEmphasis(this);\n      };\n      EffectSymbol.prototype.getSymbolType = function () {\n        var symbol = this.childAt(0);\n        return symbol && symbol.getSymbolType();\n      };\n      /**\r\n       * Update symbol properties\r\n       */\n      EffectSymbol.prototype.updateData = function (data, idx) {\n        var _this = this;\n        var seriesModel = data.hostModel;\n        this.childAt(0).updateData(data, idx);\n        var rippleGroup = this.childAt(1);\n        var itemModel = data.getItemModel(idx);\n        var symbolType = data.getItemVisual(idx, 'symbol');\n        var symbolSize = normalizeSymbolSize(data.getItemVisual(idx, 'symbolSize'));\n        var symbolStyle = data.getItemVisual(idx, 'style');\n        var color = symbolStyle && symbolStyle.fill;\n        var emphasisModel = itemModel.getModel('emphasis');\n        rippleGroup.setScale(symbolSize);\n        rippleGroup.traverse(function (ripplePath) {\n          ripplePath.setStyle('fill', color);\n        });\n        var symbolOffset = normalizeSymbolOffset(data.getItemVisual(idx, 'symbolOffset'), symbolSize);\n        if (symbolOffset) {\n          rippleGroup.x = symbolOffset[0];\n          rippleGroup.y = symbolOffset[1];\n        }\n        var symbolRotate = data.getItemVisual(idx, 'symbolRotate');\n        rippleGroup.rotation = (symbolRotate || 0) * Math.PI / 180 || 0;\n        var effectCfg = {};\n        effectCfg.showEffectOn = seriesModel.get('showEffectOn');\n        effectCfg.rippleScale = itemModel.get(['rippleEffect', 'scale']);\n        effectCfg.brushType = itemModel.get(['rippleEffect', 'brushType']);\n        effectCfg.period = itemModel.get(['rippleEffect', 'period']) * 1000;\n        effectCfg.effectOffset = idx / data.count();\n        effectCfg.z = seriesModel.getShallow('z') || 0;\n        effectCfg.zlevel = seriesModel.getShallow('zlevel') || 0;\n        effectCfg.symbolType = symbolType;\n        effectCfg.color = color;\n        effectCfg.rippleEffectColor = itemModel.get(['rippleEffect', 'color']);\n        effectCfg.rippleNumber = itemModel.get(['rippleEffect', 'number']);\n        if (effectCfg.showEffectOn === 'render') {\n          this._effectCfg ? this.updateEffectAnimation(effectCfg) : this.startEffectAnimation(effectCfg);\n          this._effectCfg = effectCfg;\n        } else {\n          // Not keep old effect config\n          this._effectCfg = null;\n          this.stopEffectAnimation();\n          this.onHoverStateChange = function (toState) {\n            if (toState === 'emphasis') {\n              if (effectCfg.showEffectOn !== 'render') {\n                _this.startEffectAnimation(effectCfg);\n              }\n            } else if (toState === 'normal') {\n              if (effectCfg.showEffectOn !== 'render') {\n                _this.stopEffectAnimation();\n              }\n            }\n          };\n        }\n        this._effectCfg = effectCfg;\n        toggleHoverEmphasis(this, emphasisModel.get('focus'), emphasisModel.get('blurScope'), emphasisModel.get('disabled'));\n      };\n      EffectSymbol.prototype.fadeOut = function (cb) {\n        cb && cb();\n      };\n      return EffectSymbol;\n    }(Group);\n\n    var EffectScatterView = /** @class */function (_super) {\n      __extends(EffectScatterView, _super);\n      function EffectScatterView() {\n        var _this = _super !== null && _super.apply(this, arguments) || this;\n        _this.type = EffectScatterView.type;\n        return _this;\n      }\n      EffectScatterView.prototype.init = function () {\n        this._symbolDraw = new SymbolDraw(EffectSymbol);\n      };\n      EffectScatterView.prototype.render = function (seriesModel, ecModel, api) {\n        var data = seriesModel.getData();\n        var effectSymbolDraw = this._symbolDraw;\n        effectSymbolDraw.updateData(data, {\n          clipShape: this._getClipShape(seriesModel)\n        });\n        this.group.add(effectSymbolDraw.group);\n      };\n      EffectScatterView.prototype._getClipShape = function (seriesModel) {\n        var coordSys = seriesModel.coordinateSystem;\n        var clipArea = coordSys && coordSys.getArea && coordSys.getArea();\n        return seriesModel.get('clip', true) ? clipArea : null;\n      };\n      EffectScatterView.prototype.updateTransform = function (seriesModel, ecModel, api) {\n        var data = seriesModel.getData();\n        this.group.dirty();\n        var res = pointsLayout('').reset(seriesModel, ecModel, api);\n        if (res.progress) {\n          res.progress({\n            start: 0,\n            end: data.count(),\n            count: data.count()\n          }, data);\n        }\n        this._symbolDraw.updateLayout();\n      };\n      EffectScatterView.prototype._updateGroupTransform = function (seriesModel) {\n        var coordSys = seriesModel.coordinateSystem;\n        if (coordSys && coordSys.getRoamTransform) {\n          this.group.transform = clone$2(coordSys.getRoamTransform());\n          this.group.decomposeTransform();\n        }\n      };\n      EffectScatterView.prototype.remove = function (ecModel, api) {\n        this._symbolDraw && this._symbolDraw.remove(true);\n      };\n      EffectScatterView.type = 'effectScatter';\n      return EffectScatterView;\n    }(ChartView);\n\n    var EffectScatterSeriesModel = /** @class */function (_super) {\n      __extends(EffectScatterSeriesModel, _super);\n      function EffectScatterSeriesModel() {\n        var _this = _super !== null && _super.apply(this, arguments) || this;\n        _this.type = EffectScatterSeriesModel.type;\n        _this.hasSymbolVisual = true;\n        return _this;\n      }\n      EffectScatterSeriesModel.prototype.getInitialData = function (option, ecModel) {\n        return createSeriesData(null, this, {\n          useEncodeDefaulter: true\n        });\n      };\n      EffectScatterSeriesModel.prototype.brushSelector = function (dataIndex, data, selectors) {\n        return selectors.point(data.getItemLayout(dataIndex));\n      };\n      EffectScatterSeriesModel.type = 'series.effectScatter';\n      EffectScatterSeriesModel.dependencies = ['grid', 'polar'];\n      EffectScatterSeriesModel.defaultOption = {\n        coordinateSystem: 'cartesian2d',\n        // zlevel: 0,\n        z: 2,\n        legendHoverLink: true,\n        effectType: 'ripple',\n        progressive: 0,\n        // When to show the effect, option: 'render'|'emphasis'\n        showEffectOn: 'render',\n        clip: true,\n        // Ripple effect config\n        rippleEffect: {\n          period: 4,\n          // Scale of ripple\n          scale: 2.5,\n          // Brush type can be fill or stroke\n          brushType: 'fill',\n          // Ripple number\n          number: 3\n        },\n        universalTransition: {\n          divideShape: 'clone'\n        },\n        // Cartesian coordinate system\n        // xAxisIndex: 0,\n        // yAxisIndex: 0,\n        // Polar coordinate system\n        // polarIndex: 0,\n        // Geo coordinate system\n        // geoIndex: 0,\n        // symbol: null,        // 图形类型\n        symbolSize: 10 // 图形大小，半宽（半径）参数，当图形为方向或菱形则总宽度为symbolSize * 2\n        // symbolRotate: null,  // 图形旋转控制\n        // itemStyle: {\n        //     opacity: 1\n        // }\n      };\n      return EffectScatterSeriesModel;\n    }(SeriesModel);\n\n    function install$l(registers) {\n      registers.registerChartView(EffectScatterView);\n      registers.registerSeriesModel(EffectScatterSeriesModel);\n      registers.registerLayout(pointsLayout('effectScatter'));\n    }\n\n    var EffectLine = /** @class */function (_super) {\n      __extends(EffectLine, _super);\n      function EffectLine(lineData, idx, seriesScope) {\n        var _this = _super.call(this) || this;\n        _this.add(_this.createLine(lineData, idx, seriesScope));\n        _this._updateEffectSymbol(lineData, idx);\n        return _this;\n      }\n      EffectLine.prototype.createLine = function (lineData, idx, seriesScope) {\n        return new Line$1(lineData, idx, seriesScope);\n      };\n      EffectLine.prototype._updateEffectSymbol = function (lineData, idx) {\n        var itemModel = lineData.getItemModel(idx);\n        var effectModel = itemModel.getModel('effect');\n        var size = effectModel.get('symbolSize');\n        var symbolType = effectModel.get('symbol');\n        if (!isArray(size)) {\n          size = [size, size];\n        }\n        var lineStyle = lineData.getItemVisual(idx, 'style');\n        var color = effectModel.get('color') || lineStyle && lineStyle.stroke;\n        var symbol = this.childAt(1);\n        if (this._symbolType !== symbolType) {\n          // Remove previous\n          this.remove(symbol);\n          symbol = createSymbol(symbolType, -0.5, -0.5, 1, 1, color);\n          symbol.z2 = 100;\n          symbol.culling = true;\n          this.add(symbol);\n        }\n        // Symbol may be removed if loop is false\n        if (!symbol) {\n          return;\n        }\n        // Shadow color is same with color in default\n        symbol.setStyle('shadowColor', color);\n        symbol.setStyle(effectModel.getItemStyle(['color']));\n        symbol.scaleX = size[0];\n        symbol.scaleY = size[1];\n        symbol.setColor(color);\n        this._symbolType = symbolType;\n        this._symbolScale = size;\n        this._updateEffectAnimation(lineData, effectModel, idx);\n      };\n      EffectLine.prototype._updateEffectAnimation = function (lineData, effectModel, idx) {\n        var symbol = this.childAt(1);\n        if (!symbol) {\n          return;\n        }\n        var points = lineData.getItemLayout(idx);\n        var period = effectModel.get('period') * 1000;\n        var loop = effectModel.get('loop');\n        var roundTrip = effectModel.get('roundTrip');\n        var constantSpeed = effectModel.get('constantSpeed');\n        var delayExpr = retrieve(effectModel.get('delay'), function (idx) {\n          return idx / lineData.count() * period / 3;\n        });\n        // Ignore when updating\n        symbol.ignore = true;\n        this._updateAnimationPoints(symbol, points);\n        if (constantSpeed > 0) {\n          period = this._getLineLength(symbol) / constantSpeed * 1000;\n        }\n        if (period !== this._period || loop !== this._loop || roundTrip !== this._roundTrip) {\n          symbol.stopAnimation();\n          var delayNum = void 0;\n          if (isFunction(delayExpr)) {\n            delayNum = delayExpr(idx);\n          } else {\n            delayNum = delayExpr;\n          }\n          if (symbol.__t > 0) {\n            delayNum = -period * symbol.__t;\n          }\n          this._animateSymbol(symbol, period, delayNum, loop, roundTrip);\n        }\n        this._period = period;\n        this._loop = loop;\n        this._roundTrip = roundTrip;\n      };\n      EffectLine.prototype._animateSymbol = function (symbol, period, delayNum, loop, roundTrip) {\n        if (period > 0) {\n          symbol.__t = 0;\n          var self_1 = this;\n          var animator = symbol.animate('', loop).when(roundTrip ? period * 2 : period, {\n            __t: roundTrip ? 2 : 1\n          }).delay(delayNum).during(function () {\n            self_1._updateSymbolPosition(symbol);\n          });\n          if (!loop) {\n            animator.done(function () {\n              self_1.remove(symbol);\n            });\n          }\n          animator.start();\n        }\n      };\n      EffectLine.prototype._getLineLength = function (symbol) {\n        // Not so accurate\n        return dist(symbol.__p1, symbol.__cp1) + dist(symbol.__cp1, symbol.__p2);\n      };\n      EffectLine.prototype._updateAnimationPoints = function (symbol, points) {\n        symbol.__p1 = points[0];\n        symbol.__p2 = points[1];\n        symbol.__cp1 = points[2] || [(points[0][0] + points[1][0]) / 2, (points[0][1] + points[1][1]) / 2];\n      };\n      EffectLine.prototype.updateData = function (lineData, idx, seriesScope) {\n        this.childAt(0).updateData(lineData, idx, seriesScope);\n        this._updateEffectSymbol(lineData, idx);\n      };\n      EffectLine.prototype._updateSymbolPosition = function (symbol) {\n        var p1 = symbol.__p1;\n        var p2 = symbol.__p2;\n        var cp1 = symbol.__cp1;\n        var t = symbol.__t < 1 ? symbol.__t : 2 - symbol.__t;\n        var pos = [symbol.x, symbol.y];\n        var lastPos = pos.slice();\n        var quadraticAt$1 = quadraticAt;\n        var quadraticDerivativeAt$1 = quadraticDerivativeAt;\n        pos[0] = quadraticAt$1(p1[0], cp1[0], p2[0], t);\n        pos[1] = quadraticAt$1(p1[1], cp1[1], p2[1], t);\n        // Tangent\n        var tx = symbol.__t < 1 ? quadraticDerivativeAt$1(p1[0], cp1[0], p2[0], t) : quadraticDerivativeAt$1(p2[0], cp1[0], p1[0], 1 - t);\n        var ty = symbol.__t < 1 ? quadraticDerivativeAt$1(p1[1], cp1[1], p2[1], t) : quadraticDerivativeAt$1(p2[1], cp1[1], p1[1], 1 - t);\n        symbol.rotation = -Math.atan2(ty, tx) - Math.PI / 2;\n        // enable continuity trail for 'line', 'rect', 'roundRect' symbolType\n        if (this._symbolType === 'line' || this._symbolType === 'rect' || this._symbolType === 'roundRect') {\n          if (symbol.__lastT !== undefined && symbol.__lastT < symbol.__t) {\n            symbol.scaleY = dist(lastPos, pos) * 1.05;\n            // make sure the last segment render within endPoint\n            if (t === 1) {\n              pos[0] = lastPos[0] + (pos[0] - lastPos[0]) / 2;\n              pos[1] = lastPos[1] + (pos[1] - lastPos[1]) / 2;\n            }\n          } else if (symbol.__lastT === 1) {\n            // After first loop, symbol.__t does NOT start with 0, so connect p1 to pos directly.\n            symbol.scaleY = 2 * dist(p1, pos);\n          } else {\n            symbol.scaleY = this._symbolScale[1];\n          }\n        }\n        symbol.__lastT = symbol.__t;\n        symbol.ignore = false;\n        symbol.x = pos[0];\n        symbol.y = pos[1];\n      };\n      EffectLine.prototype.updateLayout = function (lineData, idx) {\n        this.childAt(0).updateLayout(lineData, idx);\n        var effectModel = lineData.getItemModel(idx).getModel('effect');\n        this._updateEffectAnimation(lineData, effectModel, idx);\n      };\n      return EffectLine;\n    }(Group);\n\n    var Polyline$1 = /** @class */function (_super) {\n      __extends(Polyline$1, _super);\n      function Polyline$1(lineData, idx, seriesScope) {\n        var _this = _super.call(this) || this;\n        _this._createPolyline(lineData, idx, seriesScope);\n        return _this;\n      }\n      Polyline$1.prototype._createPolyline = function (lineData, idx, seriesScope) {\n        // let seriesModel = lineData.hostModel;\n        var points = lineData.getItemLayout(idx);\n        var line = new Polyline({\n          shape: {\n            points: points\n          }\n        });\n        this.add(line);\n        this._updateCommonStl(lineData, idx, seriesScope);\n      };\n      Polyline$1.prototype.updateData = function (lineData, idx, seriesScope) {\n        var seriesModel = lineData.hostModel;\n        var line = this.childAt(0);\n        var target = {\n          shape: {\n            points: lineData.getItemLayout(idx)\n          }\n        };\n        updateProps(line, target, seriesModel, idx);\n        this._updateCommonStl(lineData, idx, seriesScope);\n      };\n      Polyline$1.prototype._updateCommonStl = function (lineData, idx, seriesScope) {\n        var line = this.childAt(0);\n        var itemModel = lineData.getItemModel(idx);\n        var emphasisLineStyle = seriesScope && seriesScope.emphasisLineStyle;\n        var focus = seriesScope && seriesScope.focus;\n        var blurScope = seriesScope && seriesScope.blurScope;\n        var emphasisDisabled = seriesScope && seriesScope.emphasisDisabled;\n        if (!seriesScope || lineData.hasItemOption) {\n          var emphasisModel = itemModel.getModel('emphasis');\n          emphasisLineStyle = emphasisModel.getModel('lineStyle').getLineStyle();\n          emphasisDisabled = emphasisModel.get('disabled');\n          focus = emphasisModel.get('focus');\n          blurScope = emphasisModel.get('blurScope');\n        }\n        line.useStyle(lineData.getItemVisual(idx, 'style'));\n        line.style.fill = null;\n        line.style.strokeNoScale = true;\n        var lineEmphasisState = line.ensureState('emphasis');\n        lineEmphasisState.style = emphasisLineStyle;\n        toggleHoverEmphasis(this, focus, blurScope, emphasisDisabled);\n      };\n      Polyline$1.prototype.updateLayout = function (lineData, idx) {\n        var polyline = this.childAt(0);\n        polyline.setShape('points', lineData.getItemLayout(idx));\n      };\n      return Polyline$1;\n    }(Group);\n\n    var EffectPolyline = /** @class */function (_super) {\n      __extends(EffectPolyline, _super);\n      function EffectPolyline() {\n        var _this = _super !== null && _super.apply(this, arguments) || this;\n        _this._lastFrame = 0;\n        _this._lastFramePercent = 0;\n        return _this;\n      }\n      // Override\n      EffectPolyline.prototype.createLine = function (lineData, idx, seriesScope) {\n        return new Polyline$1(lineData, idx, seriesScope);\n      };\n      // Override\n      EffectPolyline.prototype._updateAnimationPoints = function (symbol, points) {\n        this._points = points;\n        var accLenArr = [0];\n        var len = 0;\n        for (var i = 1; i < points.length; i++) {\n          var p1 = points[i - 1];\n          var p2 = points[i];\n          len += dist(p1, p2);\n          accLenArr.push(len);\n        }\n        if (len === 0) {\n          this._length = 0;\n          return;\n        }\n        for (var i = 0; i < accLenArr.length; i++) {\n          accLenArr[i] /= len;\n        }\n        this._offsets = accLenArr;\n        this._length = len;\n      };\n      // Override\n      EffectPolyline.prototype._getLineLength = function () {\n        return this._length;\n      };\n      // Override\n      EffectPolyline.prototype._updateSymbolPosition = function (symbol) {\n        var t = symbol.__t < 1 ? symbol.__t : 2 - symbol.__t;\n        var points = this._points;\n        var offsets = this._offsets;\n        var len = points.length;\n        if (!offsets) {\n          // Has length 0\n          return;\n        }\n        var lastFrame = this._lastFrame;\n        var frame;\n        if (t < this._lastFramePercent) {\n          // Start from the next frame\n          // PENDING start from lastFrame ?\n          var start = Math.min(lastFrame + 1, len - 1);\n          for (frame = start; frame >= 0; frame--) {\n            if (offsets[frame] <= t) {\n              break;\n            }\n          }\n          // PENDING really need to do this ?\n          frame = Math.min(frame, len - 2);\n        } else {\n          for (frame = lastFrame; frame < len; frame++) {\n            if (offsets[frame] > t) {\n              break;\n            }\n          }\n          frame = Math.min(frame - 1, len - 2);\n        }\n        var p = (t - offsets[frame]) / (offsets[frame + 1] - offsets[frame]);\n        var p0 = points[frame];\n        var p1 = points[frame + 1];\n        symbol.x = p0[0] * (1 - p) + p * p1[0];\n        symbol.y = p0[1] * (1 - p) + p * p1[1];\n        var tx = symbol.__t < 1 ? p1[0] - p0[0] : p0[0] - p1[0];\n        var ty = symbol.__t < 1 ? p1[1] - p0[1] : p0[1] - p1[1];\n        symbol.rotation = -Math.atan2(ty, tx) - Math.PI / 2;\n        this._lastFrame = frame;\n        this._lastFramePercent = t;\n        symbol.ignore = false;\n      };\n      return EffectPolyline;\n    }(EffectLine);\n\n    var LargeLinesPathShape = /** @class */function () {\n      function LargeLinesPathShape() {\n        this.polyline = false;\n        this.curveness = 0;\n        this.segs = [];\n      }\n      return LargeLinesPathShape;\n    }();\n    var LargeLinesPath = /** @class */function (_super) {\n      __extends(LargeLinesPath, _super);\n      function LargeLinesPath(opts) {\n        var _this = _super.call(this, opts) || this;\n        _this._off = 0;\n        _this.hoverDataIdx = -1;\n        return _this;\n      }\n      LargeLinesPath.prototype.reset = function () {\n        this.notClear = false;\n        this._off = 0;\n      };\n      LargeLinesPath.prototype.getDefaultStyle = function () {\n        return {\n          stroke: '#000',\n          fill: null\n        };\n      };\n      LargeLinesPath.prototype.getDefaultShape = function () {\n        return new LargeLinesPathShape();\n      };\n      LargeLinesPath.prototype.buildPath = function (ctx, shape) {\n        var segs = shape.segs;\n        var curveness = shape.curveness;\n        var i;\n        if (shape.polyline) {\n          for (i = this._off; i < segs.length;) {\n            var count = segs[i++];\n            if (count > 0) {\n              ctx.moveTo(segs[i++], segs[i++]);\n              for (var k = 1; k < count; k++) {\n                ctx.lineTo(segs[i++], segs[i++]);\n              }\n            }\n          }\n        } else {\n          for (i = this._off; i < segs.length;) {\n            var x0 = segs[i++];\n            var y0 = segs[i++];\n            var x1 = segs[i++];\n            var y1 = segs[i++];\n            ctx.moveTo(x0, y0);\n            if (curveness > 0) {\n              var x2 = (x0 + x1) / 2 - (y0 - y1) * curveness;\n              var y2 = (y0 + y1) / 2 - (x1 - x0) * curveness;\n              ctx.quadraticCurveTo(x2, y2, x1, y1);\n            } else {\n              ctx.lineTo(x1, y1);\n            }\n          }\n        }\n        if (this.incremental) {\n          this._off = i;\n          this.notClear = true;\n        }\n      };\n      LargeLinesPath.prototype.findDataIndex = function (x, y) {\n        var shape = this.shape;\n        var segs = shape.segs;\n        var curveness = shape.curveness;\n        var lineWidth = this.style.lineWidth;\n        if (shape.polyline) {\n          var dataIndex = 0;\n          for (var i = 0; i < segs.length;) {\n            var count = segs[i++];\n            if (count > 0) {\n              var x0 = segs[i++];\n              var y0 = segs[i++];\n              for (var k = 1; k < count; k++) {\n                var x1 = segs[i++];\n                var y1 = segs[i++];\n                if (containStroke(x0, y0, x1, y1, lineWidth, x, y)) {\n                  return dataIndex;\n                }\n              }\n            }\n            dataIndex++;\n          }\n        } else {\n          var dataIndex = 0;\n          for (var i = 0; i < segs.length;) {\n            var x0 = segs[i++];\n            var y0 = segs[i++];\n            var x1 = segs[i++];\n            var y1 = segs[i++];\n            if (curveness > 0) {\n              var x2 = (x0 + x1) / 2 - (y0 - y1) * curveness;\n              var y2 = (y0 + y1) / 2 - (x1 - x0) * curveness;\n              if (containStroke$2(x0, y0, x2, y2, x1, y1, lineWidth, x, y)) {\n                return dataIndex;\n              }\n            } else {\n              if (containStroke(x0, y0, x1, y1, lineWidth, x, y)) {\n                return dataIndex;\n              }\n            }\n            dataIndex++;\n          }\n        }\n        return -1;\n      };\n      LargeLinesPath.prototype.contain = function (x, y) {\n        var localPos = this.transformCoordToLocal(x, y);\n        var rect = this.getBoundingRect();\n        x = localPos[0];\n        y = localPos[1];\n        if (rect.contain(x, y)) {\n          // Cache found data index.\n          var dataIdx = this.hoverDataIdx = this.findDataIndex(x, y);\n          return dataIdx >= 0;\n        }\n        this.hoverDataIdx = -1;\n        return false;\n      };\n      LargeLinesPath.prototype.getBoundingRect = function () {\n        // Ignore stroke for large symbol draw.\n        var rect = this._rect;\n        if (!rect) {\n          var shape = this.shape;\n          var points = shape.segs;\n          var minX = Infinity;\n          var minY = Infinity;\n          var maxX = -Infinity;\n          var maxY = -Infinity;\n          for (var i = 0; i < points.length;) {\n            var x = points[i++];\n            var y = points[i++];\n            minX = Math.min(x, minX);\n            maxX = Math.max(x, maxX);\n            minY = Math.min(y, minY);\n            maxY = Math.max(y, maxY);\n          }\n          rect = this._rect = new BoundingRect(minX, minY, maxX, maxY);\n        }\n        return rect;\n      };\n      return LargeLinesPath;\n    }(Path);\n    var LargeLineDraw = /** @class */function () {\n      function LargeLineDraw() {\n        this.group = new Group();\n      }\n      /**\r\n       * Update symbols draw by new data\r\n       */\n      LargeLineDraw.prototype.updateData = function (data) {\n        this._clear();\n        var lineEl = this._create();\n        lineEl.setShape({\n          segs: data.getLayout('linesPoints')\n        });\n        this._setCommon(lineEl, data);\n      };\n      /**\r\n       * @override\r\n       */\n      LargeLineDraw.prototype.incrementalPrepareUpdate = function (data) {\n        this.group.removeAll();\n        this._clear();\n      };\n      /**\r\n       * @override\r\n       */\n      LargeLineDraw.prototype.incrementalUpdate = function (taskParams, data) {\n        var lastAdded = this._newAdded[0];\n        var linePoints = data.getLayout('linesPoints');\n        var oldSegs = lastAdded && lastAdded.shape.segs;\n        // Merging the exists. Each element has 1e4 points.\n        // Consider the performance balance between too much elements and too much points in one shape(may affect hover optimization)\n        if (oldSegs && oldSegs.length < 2e4) {\n          var oldLen = oldSegs.length;\n          var newSegs = new Float32Array(oldLen + linePoints.length);\n          // Concat two array\n          newSegs.set(oldSegs);\n          newSegs.set(linePoints, oldLen);\n          lastAdded.setShape({\n            segs: newSegs\n          });\n        } else {\n          // Clear\n          this._newAdded = [];\n          var lineEl = this._create();\n          lineEl.incremental = true;\n          lineEl.setShape({\n            segs: linePoints\n          });\n          this._setCommon(lineEl, data);\n          lineEl.__startIndex = taskParams.start;\n        }\n      };\n      /**\r\n       * @override\r\n       */\n      LargeLineDraw.prototype.remove = function () {\n        this._clear();\n      };\n      LargeLineDraw.prototype.eachRendered = function (cb) {\n        this._newAdded[0] && cb(this._newAdded[0]);\n      };\n      LargeLineDraw.prototype._create = function () {\n        var lineEl = new LargeLinesPath({\n          cursor: 'default',\n          ignoreCoarsePointer: true\n        });\n        this._newAdded.push(lineEl);\n        this.group.add(lineEl);\n        return lineEl;\n      };\n      LargeLineDraw.prototype._setCommon = function (lineEl, data, isIncremental) {\n        var hostModel = data.hostModel;\n        lineEl.setShape({\n          polyline: hostModel.get('polyline'),\n          curveness: hostModel.get(['lineStyle', 'curveness'])\n        });\n        lineEl.useStyle(hostModel.getModel('lineStyle').getLineStyle());\n        lineEl.style.strokeNoScale = true;\n        var style = data.getVisual('style');\n        if (style && style.stroke) {\n          lineEl.setStyle('stroke', style.stroke);\n        }\n        lineEl.setStyle('fill', null);\n        var ecData = getECData(lineEl);\n        // Enable tooltip\n        // PENDING May have performance issue when path is extremely large\n        ecData.seriesIndex = hostModel.seriesIndex;\n        lineEl.on('mousemove', function (e) {\n          ecData.dataIndex = null;\n          var dataIndex = lineEl.hoverDataIdx;\n          if (dataIndex > 0) {\n            // Provide dataIndex for tooltip\n            ecData.dataIndex = dataIndex + lineEl.__startIndex;\n          }\n        });\n      };\n      LargeLineDraw.prototype._clear = function () {\n        this._newAdded = [];\n        this.group.removeAll();\n      };\n      return LargeLineDraw;\n    }();\n\n    var linesLayout = {\n      seriesType: 'lines',\n      plan: createRenderPlanner(),\n      reset: function (seriesModel) {\n        var coordSys = seriesModel.coordinateSystem;\n        if (!coordSys) {\n          if (\"development\" !== 'production') {\n            error('The lines series must have a coordinate system.');\n          }\n          return;\n        }\n        var isPolyline = seriesModel.get('polyline');\n        var isLarge = seriesModel.pipelineContext.large;\n        return {\n          progress: function (params, lineData) {\n            var lineCoords = [];\n            if (isLarge) {\n              var points = void 0;\n              var segCount = params.end - params.start;\n              if (isPolyline) {\n                var totalCoordsCount = 0;\n                for (var i = params.start; i < params.end; i++) {\n                  totalCoordsCount += seriesModel.getLineCoordsCount(i);\n                }\n                points = new Float32Array(segCount + totalCoordsCount * 2);\n              } else {\n                points = new Float32Array(segCount * 4);\n              }\n              var offset = 0;\n              var pt = [];\n              for (var i = params.start; i < params.end; i++) {\n                var len = seriesModel.getLineCoords(i, lineCoords);\n                if (isPolyline) {\n                  points[offset++] = len;\n                }\n                for (var k = 0; k < len; k++) {\n                  pt = coordSys.dataToPoint(lineCoords[k], false, pt);\n                  points[offset++] = pt[0];\n                  points[offset++] = pt[1];\n                }\n              }\n              lineData.setLayout('linesPoints', points);\n            } else {\n              for (var i = params.start; i < params.end; i++) {\n                var itemModel = lineData.getItemModel(i);\n                var len = seriesModel.getLineCoords(i, lineCoords);\n                var pts = [];\n                if (isPolyline) {\n                  for (var j = 0; j < len; j++) {\n                    pts.push(coordSys.dataToPoint(lineCoords[j]));\n                  }\n                } else {\n                  pts[0] = coordSys.dataToPoint(lineCoords[0]);\n                  pts[1] = coordSys.dataToPoint(lineCoords[1]);\n                  var curveness = itemModel.get(['lineStyle', 'curveness']);\n                  if (+curveness) {\n                    pts[2] = [(pts[0][0] + pts[1][0]) / 2 - (pts[0][1] - pts[1][1]) * curveness, (pts[0][1] + pts[1][1]) / 2 - (pts[1][0] - pts[0][0]) * curveness];\n                  }\n                }\n                lineData.setItemLayout(i, pts);\n              }\n            }\n          }\n        };\n      }\n    };\n\n    var LinesView = /** @class */function (_super) {\n      __extends(LinesView, _super);\n      function LinesView() {\n        var _this = _super !== null && _super.apply(this, arguments) || this;\n        _this.type = LinesView.type;\n        return _this;\n      }\n      LinesView.prototype.render = function (seriesModel, ecModel, api) {\n        var data = seriesModel.getData();\n        var lineDraw = this._updateLineDraw(data, seriesModel);\n        var zlevel = seriesModel.get('zlevel');\n        var trailLength = seriesModel.get(['effect', 'trailLength']);\n        var zr = api.getZr();\n        // Avoid the drag cause ghost shadow\n        // FIXME Better way ?\n        // SVG doesn't support\n        var isSvg = zr.painter.getType() === 'svg';\n        if (!isSvg) {\n          zr.painter.getLayer(zlevel).clear(true);\n        }\n        // Config layer with motion blur\n        if (this._lastZlevel != null && !isSvg) {\n          zr.configLayer(this._lastZlevel, {\n            motionBlur: false\n          });\n        }\n        if (this._showEffect(seriesModel) && trailLength > 0) {\n          if (!isSvg) {\n            zr.configLayer(zlevel, {\n              motionBlur: true,\n              lastFrameAlpha: Math.max(Math.min(trailLength / 10 + 0.9, 1), 0)\n            });\n          } else if (\"development\" !== 'production') {\n            console.warn('SVG render mode doesn\\'t support lines with trail effect');\n          }\n        }\n        lineDraw.updateData(data);\n        var clipPath = seriesModel.get('clip', true) && createClipPath(seriesModel.coordinateSystem, false, seriesModel);\n        if (clipPath) {\n          this.group.setClipPath(clipPath);\n        } else {\n          this.group.removeClipPath();\n        }\n        this._lastZlevel = zlevel;\n        this._finished = true;\n      };\n      LinesView.prototype.incrementalPrepareRender = function (seriesModel, ecModel, api) {\n        var data = seriesModel.getData();\n        var lineDraw = this._updateLineDraw(data, seriesModel);\n        lineDraw.incrementalPrepareUpdate(data);\n        this._clearLayer(api);\n        this._finished = false;\n      };\n      LinesView.prototype.incrementalRender = function (taskParams, seriesModel, ecModel) {\n        this._lineDraw.incrementalUpdate(taskParams, seriesModel.getData());\n        this._finished = taskParams.end === seriesModel.getData().count();\n      };\n      LinesView.prototype.eachRendered = function (cb) {\n        this._lineDraw && this._lineDraw.eachRendered(cb);\n      };\n      LinesView.prototype.updateTransform = function (seriesModel, ecModel, api) {\n        var data = seriesModel.getData();\n        var pipelineContext = seriesModel.pipelineContext;\n        if (!this._finished || pipelineContext.large || pipelineContext.progressiveRender) {\n          // TODO Don't have to do update in large mode. Only do it when there are millions of data.\n          return {\n            update: true\n          };\n        } else {\n          // TODO Use same logic with ScatterView.\n          // Manually update layout\n          var res = linesLayout.reset(seriesModel, ecModel, api);\n          if (res.progress) {\n            res.progress({\n              start: 0,\n              end: data.count(),\n              count: data.count()\n            }, data);\n          }\n          // Not in large mode\n          this._lineDraw.updateLayout();\n          this._clearLayer(api);\n        }\n      };\n      LinesView.prototype._updateLineDraw = function (data, seriesModel) {\n        var lineDraw = this._lineDraw;\n        var hasEffect = this._showEffect(seriesModel);\n        var isPolyline = !!seriesModel.get('polyline');\n        var pipelineContext = seriesModel.pipelineContext;\n        var isLargeDraw = pipelineContext.large;\n        if (\"development\" !== 'production') {\n          if (hasEffect && isLargeDraw) {\n            console.warn('Large lines not support effect');\n          }\n        }\n        if (!lineDraw || hasEffect !== this._hasEffet || isPolyline !== this._isPolyline || isLargeDraw !== this._isLargeDraw) {\n          if (lineDraw) {\n            lineDraw.remove();\n          }\n          lineDraw = this._lineDraw = isLargeDraw ? new LargeLineDraw() : new LineDraw(isPolyline ? hasEffect ? EffectPolyline : Polyline$1 : hasEffect ? EffectLine : Line$1);\n          this._hasEffet = hasEffect;\n          this._isPolyline = isPolyline;\n          this._isLargeDraw = isLargeDraw;\n        }\n        this.group.add(lineDraw.group);\n        return lineDraw;\n      };\n      LinesView.prototype._showEffect = function (seriesModel) {\n        return !!seriesModel.get(['effect', 'show']);\n      };\n      LinesView.prototype._clearLayer = function (api) {\n        // Not use motion when dragging or zooming\n        var zr = api.getZr();\n        var isSvg = zr.painter.getType() === 'svg';\n        if (!isSvg && this._lastZlevel != null) {\n          zr.painter.getLayer(this._lastZlevel).clear(true);\n        }\n      };\n      LinesView.prototype.remove = function (ecModel, api) {\n        this._lineDraw && this._lineDraw.remove();\n        this._lineDraw = null;\n        // Clear motion when lineDraw is removed\n        this._clearLayer(api);\n      };\n      LinesView.prototype.dispose = function (ecModel, api) {\n        this.remove(ecModel, api);\n      };\n      LinesView.type = 'lines';\n      return LinesView;\n    }(ChartView);\n\n    var Uint32Arr = typeof Uint32Array === 'undefined' ? Array : Uint32Array;\n    var Float64Arr = typeof Float64Array === 'undefined' ? Array : Float64Array;\n    function compatEc2(seriesOpt) {\n      var data = seriesOpt.data;\n      if (data && data[0] && data[0][0] && data[0][0].coord) {\n        if (\"development\" !== 'production') {\n          console.warn('Lines data configuration has been changed to' + ' { coords:[[1,2],[2,3]] }');\n        }\n        seriesOpt.data = map(data, function (itemOpt) {\n          var coords = [itemOpt[0].coord, itemOpt[1].coord];\n          var target = {\n            coords: coords\n          };\n          if (itemOpt[0].name) {\n            target.fromName = itemOpt[0].name;\n          }\n          if (itemOpt[1].name) {\n            target.toName = itemOpt[1].name;\n          }\n          return mergeAll([target, itemOpt[0], itemOpt[1]]);\n        });\n      }\n    }\n    var LinesSeriesModel = /** @class */function (_super) {\n      __extends(LinesSeriesModel, _super);\n      function LinesSeriesModel() {\n        var _this = _super !== null && _super.apply(this, arguments) || this;\n        _this.type = LinesSeriesModel.type;\n        _this.visualStyleAccessPath = 'lineStyle';\n        _this.visualDrawType = 'stroke';\n        return _this;\n      }\n      LinesSeriesModel.prototype.init = function (option) {\n        // The input data may be null/undefined.\n        option.data = option.data || [];\n        // Not using preprocessor because mergeOption may not have series.type\n        compatEc2(option);\n        var result = this._processFlatCoordsArray(option.data);\n        this._flatCoords = result.flatCoords;\n        this._flatCoordsOffset = result.flatCoordsOffset;\n        if (result.flatCoords) {\n          option.data = new Float32Array(result.count);\n        }\n        _super.prototype.init.apply(this, arguments);\n      };\n      LinesSeriesModel.prototype.mergeOption = function (option) {\n        compatEc2(option);\n        if (option.data) {\n          // Only update when have option data to merge.\n          var result = this._processFlatCoordsArray(option.data);\n          this._flatCoords = result.flatCoords;\n          this._flatCoordsOffset = result.flatCoordsOffset;\n          if (result.flatCoords) {\n            option.data = new Float32Array(result.count);\n          }\n        }\n        _super.prototype.mergeOption.apply(this, arguments);\n      };\n      LinesSeriesModel.prototype.appendData = function (params) {\n        var result = this._processFlatCoordsArray(params.data);\n        if (result.flatCoords) {\n          if (!this._flatCoords) {\n            this._flatCoords = result.flatCoords;\n            this._flatCoordsOffset = result.flatCoordsOffset;\n          } else {\n            this._flatCoords = concatArray(this._flatCoords, result.flatCoords);\n            this._flatCoordsOffset = concatArray(this._flatCoordsOffset, result.flatCoordsOffset);\n          }\n          params.data = new Float32Array(result.count);\n        }\n        this.getRawData().appendData(params.data);\n      };\n      LinesSeriesModel.prototype._getCoordsFromItemModel = function (idx) {\n        var itemModel = this.getData().getItemModel(idx);\n        var coords = itemModel.option instanceof Array ? itemModel.option : itemModel.getShallow('coords');\n        if (\"development\" !== 'production') {\n          if (!(coords instanceof Array && coords.length > 0 && coords[0] instanceof Array)) {\n            throw new Error('Invalid coords ' + JSON.stringify(coords) + '. Lines must have 2d coords array in data item.');\n          }\n        }\n        return coords;\n      };\n      LinesSeriesModel.prototype.getLineCoordsCount = function (idx) {\n        if (this._flatCoordsOffset) {\n          return this._flatCoordsOffset[idx * 2 + 1];\n        } else {\n          return this._getCoordsFromItemModel(idx).length;\n        }\n      };\n      LinesSeriesModel.prototype.getLineCoords = function (idx, out) {\n        if (this._flatCoordsOffset) {\n          var offset = this._flatCoordsOffset[idx * 2];\n          var len = this._flatCoordsOffset[idx * 2 + 1];\n          for (var i = 0; i < len; i++) {\n            out[i] = out[i] || [];\n            out[i][0] = this._flatCoords[offset + i * 2];\n            out[i][1] = this._flatCoords[offset + i * 2 + 1];\n          }\n          return len;\n        } else {\n          var coords = this._getCoordsFromItemModel(idx);\n          for (var i = 0; i < coords.length; i++) {\n            out[i] = out[i] || [];\n            out[i][0] = coords[i][0];\n            out[i][1] = coords[i][1];\n          }\n          return coords.length;\n        }\n      };\n      LinesSeriesModel.prototype._processFlatCoordsArray = function (data) {\n        var startOffset = 0;\n        if (this._flatCoords) {\n          startOffset = this._flatCoords.length;\n        }\n        // Stored as a typed array. In format\n        // Points Count(2) | x | y | x | y | Points Count(3) | x |  y | x | y | x | y |\n        if (isNumber(data[0])) {\n          var len = data.length;\n          // Store offset and len of each segment\n          var coordsOffsetAndLenStorage = new Uint32Arr(len);\n          var coordsStorage = new Float64Arr(len);\n          var coordsCursor = 0;\n          var offsetCursor = 0;\n          var dataCount = 0;\n          for (var i = 0; i < len;) {\n            dataCount++;\n            var count = data[i++];\n            // Offset\n            coordsOffsetAndLenStorage[offsetCursor++] = coordsCursor + startOffset;\n            // Len\n            coordsOffsetAndLenStorage[offsetCursor++] = count;\n            for (var k = 0; k < count; k++) {\n              var x = data[i++];\n              var y = data[i++];\n              coordsStorage[coordsCursor++] = x;\n              coordsStorage[coordsCursor++] = y;\n              if (i > len) {\n                if (\"development\" !== 'production') {\n                  throw new Error('Invalid data format.');\n                }\n              }\n            }\n          }\n          return {\n            flatCoordsOffset: new Uint32Array(coordsOffsetAndLenStorage.buffer, 0, offsetCursor),\n            flatCoords: coordsStorage,\n            count: dataCount\n          };\n        }\n        return {\n          flatCoordsOffset: null,\n          flatCoords: null,\n          count: data.length\n        };\n      };\n      LinesSeriesModel.prototype.getInitialData = function (option, ecModel) {\n        if (\"development\" !== 'production') {\n          var CoordSys = CoordinateSystemManager.get(option.coordinateSystem);\n          if (!CoordSys) {\n            throw new Error('Unknown coordinate system ' + option.coordinateSystem);\n          }\n        }\n        var lineData = new SeriesData(['value'], this);\n        lineData.hasItemOption = false;\n        lineData.initData(option.data, [], function (dataItem, dimName, dataIndex, dimIndex) {\n          // dataItem is simply coords\n          if (dataItem instanceof Array) {\n            return NaN;\n          } else {\n            lineData.hasItemOption = true;\n            var value = dataItem.value;\n            if (value != null) {\n              return value instanceof Array ? value[dimIndex] : value;\n            }\n          }\n        });\n        return lineData;\n      };\n      LinesSeriesModel.prototype.formatTooltip = function (dataIndex, multipleSeries, dataType) {\n        var data = this.getData();\n        var itemModel = data.getItemModel(dataIndex);\n        var name = itemModel.get('name');\n        if (name) {\n          return name;\n        }\n        var fromName = itemModel.get('fromName');\n        var toName = itemModel.get('toName');\n        var nameArr = [];\n        fromName != null && nameArr.push(fromName);\n        toName != null && nameArr.push(toName);\n        return createTooltipMarkup('nameValue', {\n          name: nameArr.join(' > ')\n        });\n      };\n      LinesSeriesModel.prototype.preventIncremental = function () {\n        return !!this.get(['effect', 'show']);\n      };\n      LinesSeriesModel.prototype.getProgressive = function () {\n        var progressive = this.option.progressive;\n        if (progressive == null) {\n          return this.option.large ? 1e4 : this.get('progressive');\n        }\n        return progressive;\n      };\n      LinesSeriesModel.prototype.getProgressiveThreshold = function () {\n        var progressiveThreshold = this.option.progressiveThreshold;\n        if (progressiveThreshold == null) {\n          return this.option.large ? 2e4 : this.get('progressiveThreshold');\n        }\n        return progressiveThreshold;\n      };\n      LinesSeriesModel.prototype.getZLevelKey = function () {\n        var effectModel = this.getModel('effect');\n        var trailLength = effectModel.get('trailLength');\n        return this.getData().count() > this.getProgressiveThreshold()\n        // Each progressive series has individual key.\n        ? this.id : effectModel.get('show') && trailLength > 0 ? trailLength + '' : '';\n      };\n      LinesSeriesModel.type = 'series.lines';\n      LinesSeriesModel.dependencies = ['grid', 'polar', 'geo', 'calendar'];\n      LinesSeriesModel.defaultOption = {\n        coordinateSystem: 'geo',\n        // zlevel: 0,\n        z: 2,\n        legendHoverLink: true,\n        // Cartesian coordinate system\n        xAxisIndex: 0,\n        yAxisIndex: 0,\n        symbol: ['none', 'none'],\n        symbolSize: [10, 10],\n        // Geo coordinate system\n        geoIndex: 0,\n        effect: {\n          show: false,\n          period: 4,\n          constantSpeed: 0,\n          symbol: 'circle',\n          symbolSize: 3,\n          loop: true,\n          trailLength: 0.2\n        },\n        large: false,\n        // Available when large is true\n        largeThreshold: 2000,\n        polyline: false,\n        clip: true,\n        label: {\n          show: false,\n          position: 'end'\n          // distance: 5,\n          // formatter: 标签文本格式器，同Tooltip.formatter，不支持异步回调\n        },\n        lineStyle: {\n          opacity: 0.5\n        }\n      };\n      return LinesSeriesModel;\n    }(SeriesModel);\n\n    /*\n    * Licensed to the Apache Software Foundation (ASF) under one\n    * or more contributor license agreements.  See the NOTICE file\n    * distributed with this work for additional information\n    * regarding copyright ownership.  The ASF licenses this file\n    * to you under the Apache License, Version 2.0 (the\n    * \"License\"); you may not use this file except in compliance\n    * with the License.  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,\n    * software distributed under the License is distributed on an\n    * \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\n    * KIND, either express or implied.  See the License for the\n    * specific language governing permissions and limitations\n    * under the License.\n    */\n\n\n    /**\n     * AUTO-GENERATED FILE. DO NOT MODIFY.\n     */\n\n    /*\r\n    * Licensed to the Apache Software Foundation (ASF) under one\r\n    * or more contributor license agreements.  See the NOTICE file\r\n    * distributed with this work for additional information\r\n    * regarding copyright ownership.  The ASF licenses this file\r\n    * to you under the Apache License, Version 2.0 (the\r\n    * \"License\"); you may not use this file except in compliance\r\n    * with the License.  You may obtain a copy of the License at\r\n    *\r\n    *   http://www.apache.org/licenses/LICENSE-2.0\r\n    *\r\n    * Unless required by applicable law or agreed to in writing,\r\n    * software distributed under the License is distributed on an\r\n    * \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\r\n    * KIND, either express or implied.  See the License for the\r\n    * specific language governing permissions and limitations\r\n    * under the License.\r\n    */\n    function normalize$3(a) {\n      if (!(a instanceof Array)) {\n        a = [a, a];\n      }\n      return a;\n    }\n    var linesVisual = {\n      seriesType: 'lines',\n      reset: function (seriesModel) {\n        var symbolType = normalize$3(seriesModel.get('symbol'));\n        var symbolSize = normalize$3(seriesModel.get('symbolSize'));\n        var data = seriesModel.getData();\n        data.setVisual('fromSymbol', symbolType && symbolType[0]);\n        data.setVisual('toSymbol', symbolType && symbolType[1]);\n        data.setVisual('fromSymbolSize', symbolSize && symbolSize[0]);\n        data.setVisual('toSymbolSize', symbolSize && symbolSize[1]);\n        function dataEach(data, idx) {\n          var itemModel = data.getItemModel(idx);\n          var symbolType = normalize$3(itemModel.getShallow('symbol', true));\n          var symbolSize = normalize$3(itemModel.getShallow('symbolSize', true));\n          symbolType[0] && data.setItemVisual(idx, 'fromSymbol', symbolType[0]);\n          symbolType[1] && data.setItemVisual(idx, 'toSymbol', symbolType[1]);\n          symbolSize[0] && data.setItemVisual(idx, 'fromSymbolSize', symbolSize[0]);\n          symbolSize[1] && data.setItemVisual(idx, 'toSymbolSize', symbolSize[1]);\n        }\n        return {\n          dataEach: data.hasItemOption ? dataEach : null\n        };\n      }\n    };\n\n    function install$m(registers) {\n      registers.registerChartView(LinesView);\n      registers.registerSeriesModel(LinesSeriesModel);\n      registers.registerLayout(linesLayout);\n      registers.registerVisual(linesVisual);\n    }\n\n    var GRADIENT_LEVELS = 256;\n    var HeatmapLayer = /** @class */function () {\n      function HeatmapLayer() {\n        this.blurSize = 30;\n        this.pointSize = 20;\n        this.maxOpacity = 1;\n        this.minOpacity = 0;\n        this._gradientPixels = {\n          inRange: null,\n          outOfRange: null\n        };\n        var canvas = platformApi.createCanvas();\n        this.canvas = canvas;\n      }\n      /**\r\n       * Renders Heatmap and returns the rendered canvas\r\n       * @param data array of data, each has x, y, value\r\n       * @param width canvas width\r\n       * @param height canvas height\r\n       */\n      HeatmapLayer.prototype.update = function (data, width, height, normalize, colorFunc, isInRange) {\n        var brush = this._getBrush();\n        var gradientInRange = this._getGradient(colorFunc, 'inRange');\n        var gradientOutOfRange = this._getGradient(colorFunc, 'outOfRange');\n        var r = this.pointSize + this.blurSize;\n        var canvas = this.canvas;\n        var ctx = canvas.getContext('2d');\n        var len = data.length;\n        canvas.width = width;\n        canvas.height = height;\n        for (var i = 0; i < len; ++i) {\n          var p = data[i];\n          var x = p[0];\n          var y = p[1];\n          var value = p[2];\n          // calculate alpha using value\n          var alpha = normalize(value);\n          // draw with the circle brush with alpha\n          ctx.globalAlpha = alpha;\n          ctx.drawImage(brush, x - r, y - r);\n        }\n        if (!canvas.width || !canvas.height) {\n          // Avoid \"Uncaught DOMException: Failed to execute 'getImageData' on\n          // 'CanvasRenderingContext2D': The source height is 0.\"\n          return canvas;\n        }\n        // colorize the canvas using alpha value and set with gradient\n        var imageData = ctx.getImageData(0, 0, canvas.width, canvas.height);\n        var pixels = imageData.data;\n        var offset = 0;\n        var pixelLen = pixels.length;\n        var minOpacity = this.minOpacity;\n        var maxOpacity = this.maxOpacity;\n        var diffOpacity = maxOpacity - minOpacity;\n        while (offset < pixelLen) {\n          var alpha = pixels[offset + 3] / 256;\n          var gradientOffset = Math.floor(alpha * (GRADIENT_LEVELS - 1)) * 4;\n          // Simple optimize to ignore the empty data\n          if (alpha > 0) {\n            var gradient = isInRange(alpha) ? gradientInRange : gradientOutOfRange;\n            // Any alpha > 0 will be mapped to [minOpacity, maxOpacity]\n            alpha > 0 && (alpha = alpha * diffOpacity + minOpacity);\n            pixels[offset++] = gradient[gradientOffset];\n            pixels[offset++] = gradient[gradientOffset + 1];\n            pixels[offset++] = gradient[gradientOffset + 2];\n            pixels[offset++] = gradient[gradientOffset + 3] * alpha * 256;\n          } else {\n            offset += 4;\n          }\n        }\n        ctx.putImageData(imageData, 0, 0);\n        return canvas;\n      };\n      /**\r\n       * get canvas of a black circle brush used for canvas to draw later\r\n       */\n      HeatmapLayer.prototype._getBrush = function () {\n        var brushCanvas = this._brushCanvas || (this._brushCanvas = platformApi.createCanvas());\n        // set brush size\n        var r = this.pointSize + this.blurSize;\n        var d = r * 2;\n        brushCanvas.width = d;\n        brushCanvas.height = d;\n        var ctx = brushCanvas.getContext('2d');\n        ctx.clearRect(0, 0, d, d);\n        // in order to render shadow without the distinct circle,\n        // draw the distinct circle in an invisible place,\n        // and use shadowOffset to draw shadow in the center of the canvas\n        ctx.shadowOffsetX = d;\n        ctx.shadowBlur = this.blurSize;\n        // draw the shadow in black, and use alpha and shadow blur to generate\n        // color in color map\n        ctx.shadowColor = '#000';\n        // draw circle in the left to the canvas\n        ctx.beginPath();\n        ctx.arc(-r, r, this.pointSize, 0, Math.PI * 2, true);\n        ctx.closePath();\n        ctx.fill();\n        return brushCanvas;\n      };\n      /**\r\n       * get gradient color map\r\n       * @private\r\n       */\n      HeatmapLayer.prototype._getGradient = function (colorFunc, state) {\n        var gradientPixels = this._gradientPixels;\n        var pixelsSingleState = gradientPixels[state] || (gradientPixels[state] = new Uint8ClampedArray(256 * 4));\n        var color = [0, 0, 0, 0];\n        var off = 0;\n        for (var i = 0; i < 256; i++) {\n          colorFunc[state](i / 255, true, color);\n          pixelsSingleState[off++] = color[0];\n          pixelsSingleState[off++] = color[1];\n          pixelsSingleState[off++] = color[2];\n          pixelsSingleState[off++] = color[3];\n        }\n        return pixelsSingleState;\n      };\n      return HeatmapLayer;\n    }();\n\n    function getIsInPiecewiseRange(dataExtent, pieceList, selected) {\n      var dataSpan = dataExtent[1] - dataExtent[0];\n      pieceList = map(pieceList, function (piece) {\n        return {\n          interval: [(piece.interval[0] - dataExtent[0]) / dataSpan, (piece.interval[1] - dataExtent[0]) / dataSpan]\n        };\n      });\n      var len = pieceList.length;\n      var lastIndex = 0;\n      return function (val) {\n        var i;\n        // Try to find in the location of the last found\n        for (i = lastIndex; i < len; i++) {\n          var interval = pieceList[i].interval;\n          if (interval[0] <= val && val <= interval[1]) {\n            lastIndex = i;\n            break;\n          }\n        }\n        if (i === len) {\n          // Not found, back interation\n          for (i = lastIndex - 1; i >= 0; i--) {\n            var interval = pieceList[i].interval;\n            if (interval[0] <= val && val <= interval[1]) {\n              lastIndex = i;\n              break;\n            }\n          }\n        }\n        return i >= 0 && i < len && selected[i];\n      };\n    }\n    function getIsInContinuousRange(dataExtent, range) {\n      var dataSpan = dataExtent[1] - dataExtent[0];\n      range = [(range[0] - dataExtent[0]) / dataSpan, (range[1] - dataExtent[0]) / dataSpan];\n      return function (val) {\n        return val >= range[0] && val <= range[1];\n      };\n    }\n    function isGeoCoordSys(coordSys) {\n      var dimensions = coordSys.dimensions;\n      // Not use coordSys.type === 'geo' because coordSys maybe extended\n      return dimensions[0] === 'lng' && dimensions[1] === 'lat';\n    }\n    var HeatmapView = /** @class */function (_super) {\n      __extends(HeatmapView, _super);\n      function HeatmapView() {\n        var _this = _super !== null && _super.apply(this, arguments) || this;\n        _this.type = HeatmapView.type;\n        return _this;\n      }\n      HeatmapView.prototype.render = function (seriesModel, ecModel, api) {\n        var visualMapOfThisSeries;\n        ecModel.eachComponent('visualMap', function (visualMap) {\n          visualMap.eachTargetSeries(function (targetSeries) {\n            if (targetSeries === seriesModel) {\n              visualMapOfThisSeries = visualMap;\n            }\n          });\n        });\n        if (\"development\" !== 'production') {\n          if (!visualMapOfThisSeries) {\n            throw new Error('Heatmap must use with visualMap');\n          }\n        }\n        // Clear previously rendered progressive elements.\n        this._progressiveEls = null;\n        this.group.removeAll();\n        var coordSys = seriesModel.coordinateSystem;\n        if (coordSys.type === 'cartesian2d' || coordSys.type === 'calendar') {\n          this._renderOnCartesianAndCalendar(seriesModel, api, 0, seriesModel.getData().count());\n        } else if (isGeoCoordSys(coordSys)) {\n          this._renderOnGeo(coordSys, seriesModel, visualMapOfThisSeries, api);\n        }\n      };\n      HeatmapView.prototype.incrementalPrepareRender = function (seriesModel, ecModel, api) {\n        this.group.removeAll();\n      };\n      HeatmapView.prototype.incrementalRender = function (params, seriesModel, ecModel, api) {\n        var coordSys = seriesModel.coordinateSystem;\n        if (coordSys) {\n          // geo does not support incremental rendering?\n          if (isGeoCoordSys(coordSys)) {\n            this.render(seriesModel, ecModel, api);\n          } else {\n            this._progressiveEls = [];\n            this._renderOnCartesianAndCalendar(seriesModel, api, params.start, params.end, true);\n          }\n        }\n      };\n      HeatmapView.prototype.eachRendered = function (cb) {\n        traverseElements(this._progressiveEls || this.group, cb);\n      };\n      HeatmapView.prototype._renderOnCartesianAndCalendar = function (seriesModel, api, start, end, incremental) {\n        var coordSys = seriesModel.coordinateSystem;\n        var isCartesian2d = isCoordinateSystemType(coordSys, 'cartesian2d');\n        var width;\n        var height;\n        var xAxisExtent;\n        var yAxisExtent;\n        if (isCartesian2d) {\n          var xAxis = coordSys.getAxis('x');\n          var yAxis = coordSys.getAxis('y');\n          if (\"development\" !== 'production') {\n            if (!(xAxis.type === 'category' && yAxis.type === 'category')) {\n              throw new Error('Heatmap on cartesian must have two category axes');\n            }\n            if (!(xAxis.onBand && yAxis.onBand)) {\n              throw new Error('Heatmap on cartesian must have two axes with boundaryGap true');\n            }\n          }\n          // add 0.5px to avoid the gaps\n          width = xAxis.getBandWidth() + .5;\n          height = yAxis.getBandWidth() + .5;\n          xAxisExtent = xAxis.scale.getExtent();\n          yAxisExtent = yAxis.scale.getExtent();\n        }\n        var group = this.group;\n        var data = seriesModel.getData();\n        var emphasisStyle = seriesModel.getModel(['emphasis', 'itemStyle']).getItemStyle();\n        var blurStyle = seriesModel.getModel(['blur', 'itemStyle']).getItemStyle();\n        var selectStyle = seriesModel.getModel(['select', 'itemStyle']).getItemStyle();\n        var borderRadius = seriesModel.get(['itemStyle', 'borderRadius']);\n        var labelStatesModels = getLabelStatesModels(seriesModel);\n        var emphasisModel = seriesModel.getModel('emphasis');\n        var focus = emphasisModel.get('focus');\n        var blurScope = emphasisModel.get('blurScope');\n        var emphasisDisabled = emphasisModel.get('disabled');\n        var dataDims = isCartesian2d ? [data.mapDimension('x'), data.mapDimension('y'), data.mapDimension('value')] : [data.mapDimension('time'), data.mapDimension('value')];\n        for (var idx = start; idx < end; idx++) {\n          var rect = void 0;\n          var style = data.getItemVisual(idx, 'style');\n          if (isCartesian2d) {\n            var dataDimX = data.get(dataDims[0], idx);\n            var dataDimY = data.get(dataDims[1], idx);\n            // Ignore empty data and out of extent data\n            if (isNaN(data.get(dataDims[2], idx)) || isNaN(dataDimX) || isNaN(dataDimY) || dataDimX < xAxisExtent[0] || dataDimX > xAxisExtent[1] || dataDimY < yAxisExtent[0] || dataDimY > yAxisExtent[1]) {\n              continue;\n            }\n            var point = coordSys.dataToPoint([dataDimX, dataDimY]);\n            rect = new Rect({\n              shape: {\n                x: point[0] - width / 2,\n                y: point[1] - height / 2,\n                width: width,\n                height: height\n              },\n              style: style\n            });\n          } else {\n            // Ignore empty data\n            if (isNaN(data.get(dataDims[1], idx))) {\n              continue;\n            }\n            rect = new Rect({\n              z2: 1,\n              shape: coordSys.dataToRect([data.get(dataDims[0], idx)]).contentShape,\n              style: style\n            });\n          }\n          // Optimization for large dataset\n          if (data.hasItemOption) {\n            var itemModel = data.getItemModel(idx);\n            var emphasisModel_1 = itemModel.getModel('emphasis');\n            emphasisStyle = emphasisModel_1.getModel('itemStyle').getItemStyle();\n            blurStyle = itemModel.getModel(['blur', 'itemStyle']).getItemStyle();\n            selectStyle = itemModel.getModel(['select', 'itemStyle']).getItemStyle();\n            // Each item value struct in the data would be firstly\n            // {\n            //     itemStyle: { borderRadius: [30, 30] },\n            //     value: [2022, 02, 22]\n            // }\n            borderRadius = itemModel.get(['itemStyle', 'borderRadius']);\n            focus = emphasisModel_1.get('focus');\n            blurScope = emphasisModel_1.get('blurScope');\n            emphasisDisabled = emphasisModel_1.get('disabled');\n            labelStatesModels = getLabelStatesModels(itemModel);\n          }\n          rect.shape.r = borderRadius;\n          var rawValue = seriesModel.getRawValue(idx);\n          var defaultText = '-';\n          if (rawValue && rawValue[2] != null) {\n            defaultText = rawValue[2] + '';\n          }\n          setLabelStyle(rect, labelStatesModels, {\n            labelFetcher: seriesModel,\n            labelDataIndex: idx,\n            defaultOpacity: style.opacity,\n            defaultText: defaultText\n          });\n          rect.ensureState('emphasis').style = emphasisStyle;\n          rect.ensureState('blur').style = blurStyle;\n          rect.ensureState('select').style = selectStyle;\n          toggleHoverEmphasis(rect, focus, blurScope, emphasisDisabled);\n          rect.incremental = incremental;\n          // PENDING\n          if (incremental) {\n            // Rect must use hover layer if it's incremental.\n            rect.states.emphasis.hoverLayer = true;\n          }\n          group.add(rect);\n          data.setItemGraphicEl(idx, rect);\n          if (this._progressiveEls) {\n            this._progressiveEls.push(rect);\n          }\n        }\n      };\n      HeatmapView.prototype._renderOnGeo = function (geo, seriesModel, visualMapModel, api) {\n        var inRangeVisuals = visualMapModel.targetVisuals.inRange;\n        var outOfRangeVisuals = visualMapModel.targetVisuals.outOfRange;\n        // if (!visualMapping) {\n        //     throw new Error('Data range must have color visuals');\n        // }\n        var data = seriesModel.getData();\n        var hmLayer = this._hmLayer || this._hmLayer || new HeatmapLayer();\n        hmLayer.blurSize = seriesModel.get('blurSize');\n        hmLayer.pointSize = seriesModel.get('pointSize');\n        hmLayer.minOpacity = seriesModel.get('minOpacity');\n        hmLayer.maxOpacity = seriesModel.get('maxOpacity');\n        var rect = geo.getViewRect().clone();\n        var roamTransform = geo.getRoamTransform();\n        rect.applyTransform(roamTransform);\n        // Clamp on viewport\n        var x = Math.max(rect.x, 0);\n        var y = Math.max(rect.y, 0);\n        var x2 = Math.min(rect.width + rect.x, api.getWidth());\n        var y2 = Math.min(rect.height + rect.y, api.getHeight());\n        var width = x2 - x;\n        var height = y2 - y;\n        var dims = [data.mapDimension('lng'), data.mapDimension('lat'), data.mapDimension('value')];\n        var points = data.mapArray(dims, function (lng, lat, value) {\n          var pt = geo.dataToPoint([lng, lat]);\n          pt[0] -= x;\n          pt[1] -= y;\n          pt.push(value);\n          return pt;\n        });\n        var dataExtent = visualMapModel.getExtent();\n        var isInRange = visualMapModel.type === 'visualMap.continuous' ? getIsInContinuousRange(dataExtent, visualMapModel.option.range) : getIsInPiecewiseRange(dataExtent, visualMapModel.getPieceList(), visualMapModel.option.selected);\n        hmLayer.update(points, width, height, inRangeVisuals.color.getNormalizer(), {\n          inRange: inRangeVisuals.color.getColorMapper(),\n          outOfRange: outOfRangeVisuals.color.getColorMapper()\n        }, isInRange);\n        var img = new ZRImage({\n          style: {\n            width: width,\n            height: height,\n            x: x,\n            y: y,\n            image: hmLayer.canvas\n          },\n          silent: true\n        });\n        this.group.add(img);\n      };\n      HeatmapView.type = 'heatmap';\n      return HeatmapView;\n    }(ChartView);\n\n    var HeatmapSeriesModel = /** @class */function (_super) {\n      __extends(HeatmapSeriesModel, _super);\n      function HeatmapSeriesModel() {\n        var _this = _super !== null && _super.apply(this, arguments) || this;\n        _this.type = HeatmapSeriesModel.type;\n        return _this;\n      }\n      HeatmapSeriesModel.prototype.getInitialData = function (option, ecModel) {\n        return createSeriesData(null, this, {\n          generateCoord: 'value'\n        });\n      };\n      HeatmapSeriesModel.prototype.preventIncremental = function () {\n        var coordSysCreator = CoordinateSystemManager.get(this.get('coordinateSystem'));\n        if (coordSysCreator && coordSysCreator.dimensions) {\n          return coordSysCreator.dimensions[0] === 'lng' && coordSysCreator.dimensions[1] === 'lat';\n        }\n      };\n      HeatmapSeriesModel.type = 'series.heatmap';\n      HeatmapSeriesModel.dependencies = ['grid', 'geo', 'calendar'];\n      HeatmapSeriesModel.defaultOption = {\n        coordinateSystem: 'cartesian2d',\n        // zlevel: 0,\n        z: 2,\n        // Cartesian coordinate system\n        // xAxisIndex: 0,\n        // yAxisIndex: 0,\n        // Geo coordinate system\n        geoIndex: 0,\n        blurSize: 30,\n        pointSize: 20,\n        maxOpacity: 1,\n        minOpacity: 0,\n        select: {\n          itemStyle: {\n            borderColor: '#212121'\n          }\n        }\n      };\n      return HeatmapSeriesModel;\n    }(SeriesModel);\n\n    function install$n(registers) {\n      registers.registerChartView(HeatmapView);\n      registers.registerSeriesModel(HeatmapSeriesModel);\n    }\n\n    var BAR_BORDER_WIDTH_QUERY = ['itemStyle', 'borderWidth'];\n    // index: +isHorizontal\n    var LAYOUT_ATTRS = [{\n      xy: 'x',\n      wh: 'width',\n      index: 0,\n      posDesc: ['left', 'right']\n    }, {\n      xy: 'y',\n      wh: 'height',\n      index: 1,\n      posDesc: ['top', 'bottom']\n    }];\n    var pathForLineWidth = new Circle();\n    var PictorialBarView = /** @class */function (_super) {\n      __extends(PictorialBarView, _super);\n      function PictorialBarView() {\n        var _this = _super !== null && _super.apply(this, arguments) || this;\n        _this.type = PictorialBarView.type;\n        return _this;\n      }\n      PictorialBarView.prototype.render = function (seriesModel, ecModel, api) {\n        var group = this.group;\n        var data = seriesModel.getData();\n        var oldData = this._data;\n        var cartesian = seriesModel.coordinateSystem;\n        var baseAxis = cartesian.getBaseAxis();\n        var isHorizontal = baseAxis.isHorizontal();\n        var coordSysRect = cartesian.master.getRect();\n        var opt = {\n          ecSize: {\n            width: api.getWidth(),\n            height: api.getHeight()\n          },\n          seriesModel: seriesModel,\n          coordSys: cartesian,\n          coordSysExtent: [[coordSysRect.x, coordSysRect.x + coordSysRect.width], [coordSysRect.y, coordSysRect.y + coordSysRect.height]],\n          isHorizontal: isHorizontal,\n          valueDim: LAYOUT_ATTRS[+isHorizontal],\n          categoryDim: LAYOUT_ATTRS[1 - +isHorizontal]\n        };\n        data.diff(oldData).add(function (dataIndex) {\n          if (!data.hasValue(dataIndex)) {\n            return;\n          }\n          var itemModel = getItemModel(data, dataIndex);\n          var symbolMeta = getSymbolMeta(data, dataIndex, itemModel, opt);\n          var bar = createBar(data, opt, symbolMeta);\n          data.setItemGraphicEl(dataIndex, bar);\n          group.add(bar);\n          updateCommon$1(bar, opt, symbolMeta);\n        }).update(function (newIndex, oldIndex) {\n          var bar = oldData.getItemGraphicEl(oldIndex);\n          if (!data.hasValue(newIndex)) {\n            group.remove(bar);\n            return;\n          }\n          var itemModel = getItemModel(data, newIndex);\n          var symbolMeta = getSymbolMeta(data, newIndex, itemModel, opt);\n          var pictorialShapeStr = getShapeStr(data, symbolMeta);\n          if (bar && pictorialShapeStr !== bar.__pictorialShapeStr) {\n            group.remove(bar);\n            data.setItemGraphicEl(newIndex, null);\n            bar = null;\n          }\n          if (bar) {\n            updateBar(bar, opt, symbolMeta);\n          } else {\n            bar = createBar(data, opt, symbolMeta, true);\n          }\n          data.setItemGraphicEl(newIndex, bar);\n          bar.__pictorialSymbolMeta = symbolMeta;\n          // Add back\n          group.add(bar);\n          updateCommon$1(bar, opt, symbolMeta);\n        }).remove(function (dataIndex) {\n          var bar = oldData.getItemGraphicEl(dataIndex);\n          bar && removeBar(oldData, dataIndex, bar.__pictorialSymbolMeta.animationModel, bar);\n        }).execute();\n        // Do clipping\n        var clipPath = seriesModel.get('clip', true) ? createClipPath(seriesModel.coordinateSystem, false, seriesModel) : null;\n        if (clipPath) {\n          group.setClipPath(clipPath);\n        } else {\n          group.removeClipPath();\n        }\n        this._data = data;\n        return this.group;\n      };\n      PictorialBarView.prototype.remove = function (ecModel, api) {\n        var group = this.group;\n        var data = this._data;\n        if (ecModel.get('animation')) {\n          if (data) {\n            data.eachItemGraphicEl(function (bar) {\n              removeBar(data, getECData(bar).dataIndex, ecModel, bar);\n            });\n          }\n        } else {\n          group.removeAll();\n        }\n      };\n      PictorialBarView.type = 'pictorialBar';\n      return PictorialBarView;\n    }(ChartView);\n    // Set or calculate default value about symbol, and calculate layout info.\n    function getSymbolMeta(data, dataIndex, itemModel, opt) {\n      var layout = data.getItemLayout(dataIndex);\n      var symbolRepeat = itemModel.get('symbolRepeat');\n      var symbolClip = itemModel.get('symbolClip');\n      var symbolPosition = itemModel.get('symbolPosition') || 'start';\n      var symbolRotate = itemModel.get('symbolRotate');\n      var rotation = (symbolRotate || 0) * Math.PI / 180 || 0;\n      var symbolPatternSize = itemModel.get('symbolPatternSize') || 2;\n      var isAnimationEnabled = itemModel.isAnimationEnabled();\n      var symbolMeta = {\n        dataIndex: dataIndex,\n        layout: layout,\n        itemModel: itemModel,\n        symbolType: data.getItemVisual(dataIndex, 'symbol') || 'circle',\n        style: data.getItemVisual(dataIndex, 'style'),\n        symbolClip: symbolClip,\n        symbolRepeat: symbolRepeat,\n        symbolRepeatDirection: itemModel.get('symbolRepeatDirection'),\n        symbolPatternSize: symbolPatternSize,\n        rotation: rotation,\n        animationModel: isAnimationEnabled ? itemModel : null,\n        hoverScale: isAnimationEnabled && itemModel.get(['emphasis', 'scale']),\n        z2: itemModel.getShallow('z', true) || 0\n      };\n      prepareBarLength(itemModel, symbolRepeat, layout, opt, symbolMeta);\n      prepareSymbolSize(data, dataIndex, layout, symbolRepeat, symbolClip, symbolMeta.boundingLength, symbolMeta.pxSign, symbolPatternSize, opt, symbolMeta);\n      prepareLineWidth(itemModel, symbolMeta.symbolScale, rotation, opt, symbolMeta);\n      var symbolSize = symbolMeta.symbolSize;\n      var symbolOffset = normalizeSymbolOffset(itemModel.get('symbolOffset'), symbolSize);\n      prepareLayoutInfo(itemModel, symbolSize, layout, symbolRepeat, symbolClip, symbolOffset, symbolPosition, symbolMeta.valueLineWidth, symbolMeta.boundingLength, symbolMeta.repeatCutLength, opt, symbolMeta);\n      return symbolMeta;\n    }\n    // bar length can be negative.\n    function prepareBarLength(itemModel, symbolRepeat, layout, opt, outputSymbolMeta) {\n      var valueDim = opt.valueDim;\n      var symbolBoundingData = itemModel.get('symbolBoundingData');\n      var valueAxis = opt.coordSys.getOtherAxis(opt.coordSys.getBaseAxis());\n      var zeroPx = valueAxis.toGlobalCoord(valueAxis.dataToCoord(0));\n      var pxSignIdx = 1 - +(layout[valueDim.wh] <= 0);\n      var boundingLength;\n      if (isArray(symbolBoundingData)) {\n        var symbolBoundingExtent = [convertToCoordOnAxis(valueAxis, symbolBoundingData[0]) - zeroPx, convertToCoordOnAxis(valueAxis, symbolBoundingData[1]) - zeroPx];\n        symbolBoundingExtent[1] < symbolBoundingExtent[0] && symbolBoundingExtent.reverse();\n        boundingLength = symbolBoundingExtent[pxSignIdx];\n      } else if (symbolBoundingData != null) {\n        boundingLength = convertToCoordOnAxis(valueAxis, symbolBoundingData) - zeroPx;\n      } else if (symbolRepeat) {\n        boundingLength = opt.coordSysExtent[valueDim.index][pxSignIdx] - zeroPx;\n      } else {\n        boundingLength = layout[valueDim.wh];\n      }\n      outputSymbolMeta.boundingLength = boundingLength;\n      if (symbolRepeat) {\n        outputSymbolMeta.repeatCutLength = layout[valueDim.wh];\n      }\n      // if 'pxSign' means sign of pixel,  it can't be zero, or symbolScale will be zero\n      // and when borderWidth be settled, the actual linewidth will be NaN\n      var isXAxis = valueDim.xy === 'x';\n      var isInverse = valueAxis.inverse;\n      outputSymbolMeta.pxSign = isXAxis && !isInverse || !isXAxis && isInverse ? boundingLength >= 0 ? 1 : -1 : boundingLength > 0 ? 1 : -1;\n    }\n    function convertToCoordOnAxis(axis, value) {\n      return axis.toGlobalCoord(axis.dataToCoord(axis.scale.parse(value)));\n    }\n    // Support ['100%', '100%']\n    function prepareSymbolSize(data, dataIndex, layout, symbolRepeat, symbolClip, boundingLength, pxSign, symbolPatternSize, opt, outputSymbolMeta) {\n      var valueDim = opt.valueDim;\n      var categoryDim = opt.categoryDim;\n      var categorySize = Math.abs(layout[categoryDim.wh]);\n      var symbolSize = data.getItemVisual(dataIndex, 'symbolSize');\n      var parsedSymbolSize;\n      if (isArray(symbolSize)) {\n        parsedSymbolSize = symbolSize.slice();\n      } else {\n        if (symbolSize == null) {\n          // will parse to number below\n          parsedSymbolSize = ['100%', '100%'];\n        } else {\n          parsedSymbolSize = [symbolSize, symbolSize];\n        }\n      }\n      // Note: percentage symbolSize (like '100%') do not consider lineWidth, because it is\n      // to complicated to calculate real percent value if considering scaled lineWidth.\n      // So the actual size will bigger than layout size if lineWidth is bigger than zero,\n      // which can be tolerated in pictorial chart.\n      parsedSymbolSize[categoryDim.index] = parsePercent$1(parsedSymbolSize[categoryDim.index], categorySize);\n      parsedSymbolSize[valueDim.index] = parsePercent$1(parsedSymbolSize[valueDim.index], symbolRepeat ? categorySize : Math.abs(boundingLength));\n      outputSymbolMeta.symbolSize = parsedSymbolSize;\n      // If x or y is less than zero, show reversed shape.\n      var symbolScale = outputSymbolMeta.symbolScale = [parsedSymbolSize[0] / symbolPatternSize, parsedSymbolSize[1] / symbolPatternSize];\n      // Follow convention, 'right' and 'top' is the normal scale.\n      symbolScale[valueDim.index] *= (opt.isHorizontal ? -1 : 1) * pxSign;\n    }\n    function prepareLineWidth(itemModel, symbolScale, rotation, opt, outputSymbolMeta) {\n      // In symbols are drawn with scale, so do not need to care about the case that width\n      // or height are too small. But symbol use strokeNoScale, where acture lineWidth should\n      // be calculated.\n      var valueLineWidth = itemModel.get(BAR_BORDER_WIDTH_QUERY) || 0;\n      if (valueLineWidth) {\n        pathForLineWidth.attr({\n          scaleX: symbolScale[0],\n          scaleY: symbolScale[1],\n          rotation: rotation\n        });\n        pathForLineWidth.updateTransform();\n        valueLineWidth /= pathForLineWidth.getLineScale();\n        valueLineWidth *= symbolScale[opt.valueDim.index];\n      }\n      outputSymbolMeta.valueLineWidth = valueLineWidth || 0;\n    }\n    function prepareLayoutInfo(itemModel, symbolSize, layout, symbolRepeat, symbolClip, symbolOffset, symbolPosition, valueLineWidth, boundingLength, repeatCutLength, opt, outputSymbolMeta) {\n      var categoryDim = opt.categoryDim;\n      var valueDim = opt.valueDim;\n      var pxSign = outputSymbolMeta.pxSign;\n      var unitLength = Math.max(symbolSize[valueDim.index] + valueLineWidth, 0);\n      var pathLen = unitLength;\n      // Note: rotation will not effect the layout of symbols, because user may\n      // want symbols to rotate on its center, which should not be translated\n      // when rotating.\n      if (symbolRepeat) {\n        var absBoundingLength = Math.abs(boundingLength);\n        var symbolMargin = retrieve(itemModel.get('symbolMargin'), '15%') + '';\n        var hasEndGap = false;\n        if (symbolMargin.lastIndexOf('!') === symbolMargin.length - 1) {\n          hasEndGap = true;\n          symbolMargin = symbolMargin.slice(0, symbolMargin.length - 1);\n        }\n        var symbolMarginNumeric = parsePercent$1(symbolMargin, symbolSize[valueDim.index]);\n        var uLenWithMargin = Math.max(unitLength + symbolMarginNumeric * 2, 0);\n        // When symbol margin is less than 0, margin at both ends will be subtracted\n        // to ensure that all of the symbols will not be overflow the given area.\n        var endFix = hasEndGap ? 0 : symbolMarginNumeric * 2;\n        // Both final repeatTimes and final symbolMarginNumeric area calculated based on\n        // boundingLength.\n        var repeatSpecified = isNumeric(symbolRepeat);\n        var repeatTimes = repeatSpecified ? symbolRepeat : toIntTimes((absBoundingLength + endFix) / uLenWithMargin);\n        // Adjust calculate margin, to ensure each symbol is displayed\n        // entirely in the given layout area.\n        var mDiff = absBoundingLength - repeatTimes * unitLength;\n        symbolMarginNumeric = mDiff / 2 / (hasEndGap ? repeatTimes : Math.max(repeatTimes - 1, 1));\n        uLenWithMargin = unitLength + symbolMarginNumeric * 2;\n        endFix = hasEndGap ? 0 : symbolMarginNumeric * 2;\n        // Update repeatTimes when not all symbol will be shown.\n        if (!repeatSpecified && symbolRepeat !== 'fixed') {\n          repeatTimes = repeatCutLength ? toIntTimes((Math.abs(repeatCutLength) + endFix) / uLenWithMargin) : 0;\n        }\n        pathLen = repeatTimes * uLenWithMargin - endFix;\n        outputSymbolMeta.repeatTimes = repeatTimes;\n        outputSymbolMeta.symbolMargin = symbolMarginNumeric;\n      }\n      var sizeFix = pxSign * (pathLen / 2);\n      var pathPosition = outputSymbolMeta.pathPosition = [];\n      pathPosition[categoryDim.index] = layout[categoryDim.wh] / 2;\n      pathPosition[valueDim.index] = symbolPosition === 'start' ? sizeFix : symbolPosition === 'end' ? boundingLength - sizeFix : boundingLength / 2; // 'center'\n      if (symbolOffset) {\n        pathPosition[0] += symbolOffset[0];\n        pathPosition[1] += symbolOffset[1];\n      }\n      var bundlePosition = outputSymbolMeta.bundlePosition = [];\n      bundlePosition[categoryDim.index] = layout[categoryDim.xy];\n      bundlePosition[valueDim.index] = layout[valueDim.xy];\n      var barRectShape = outputSymbolMeta.barRectShape = extend({}, layout);\n      barRectShape[valueDim.wh] = pxSign * Math.max(Math.abs(layout[valueDim.wh]), Math.abs(pathPosition[valueDim.index] + sizeFix));\n      barRectShape[categoryDim.wh] = layout[categoryDim.wh];\n      var clipShape = outputSymbolMeta.clipShape = {};\n      // Consider that symbol may be overflow layout rect.\n      clipShape[categoryDim.xy] = -layout[categoryDim.xy];\n      clipShape[categoryDim.wh] = opt.ecSize[categoryDim.wh];\n      clipShape[valueDim.xy] = 0;\n      clipShape[valueDim.wh] = layout[valueDim.wh];\n    }\n    function createPath(symbolMeta) {\n      var symbolPatternSize = symbolMeta.symbolPatternSize;\n      var path = createSymbol(\n      // Consider texture img, make a big size.\n      symbolMeta.symbolType, -symbolPatternSize / 2, -symbolPatternSize / 2, symbolPatternSize, symbolPatternSize);\n      path.attr({\n        culling: true\n      });\n      path.type !== 'image' && path.setStyle({\n        strokeNoScale: true\n      });\n      return path;\n    }\n    function createOrUpdateRepeatSymbols(bar, opt, symbolMeta, isUpdate) {\n      var bundle = bar.__pictorialBundle;\n      var symbolSize = symbolMeta.symbolSize;\n      var valueLineWidth = symbolMeta.valueLineWidth;\n      var pathPosition = symbolMeta.pathPosition;\n      var valueDim = opt.valueDim;\n      var repeatTimes = symbolMeta.repeatTimes || 0;\n      var index = 0;\n      var unit = symbolSize[opt.valueDim.index] + valueLineWidth + symbolMeta.symbolMargin * 2;\n      eachPath(bar, function (path) {\n        path.__pictorialAnimationIndex = index;\n        path.__pictorialRepeatTimes = repeatTimes;\n        if (index < repeatTimes) {\n          updateAttr(path, null, makeTarget(index), symbolMeta, isUpdate);\n        } else {\n          updateAttr(path, null, {\n            scaleX: 0,\n            scaleY: 0\n          }, symbolMeta, isUpdate, function () {\n            bundle.remove(path);\n          });\n        }\n        // updateHoverAnimation(path, symbolMeta);\n        index++;\n      });\n      for (; index < repeatTimes; index++) {\n        var path = createPath(symbolMeta);\n        path.__pictorialAnimationIndex = index;\n        path.__pictorialRepeatTimes = repeatTimes;\n        bundle.add(path);\n        var target = makeTarget(index);\n        updateAttr(path, {\n          x: target.x,\n          y: target.y,\n          scaleX: 0,\n          scaleY: 0\n        }, {\n          scaleX: target.scaleX,\n          scaleY: target.scaleY,\n          rotation: target.rotation\n        }, symbolMeta, isUpdate);\n      }\n      function makeTarget(index) {\n        var position = pathPosition.slice();\n        // (start && pxSign > 0) || (end && pxSign < 0): i = repeatTimes - index\n        // Otherwise: i = index;\n        var pxSign = symbolMeta.pxSign;\n        var i = index;\n        if (symbolMeta.symbolRepeatDirection === 'start' ? pxSign > 0 : pxSign < 0) {\n          i = repeatTimes - 1 - index;\n        }\n        position[valueDim.index] = unit * (i - repeatTimes / 2 + 0.5) + pathPosition[valueDim.index];\n        return {\n          x: position[0],\n          y: position[1],\n          scaleX: symbolMeta.symbolScale[0],\n          scaleY: symbolMeta.symbolScale[1],\n          rotation: symbolMeta.rotation\n        };\n      }\n    }\n    function createOrUpdateSingleSymbol(bar, opt, symbolMeta, isUpdate) {\n      var bundle = bar.__pictorialBundle;\n      var mainPath = bar.__pictorialMainPath;\n      if (!mainPath) {\n        mainPath = bar.__pictorialMainPath = createPath(symbolMeta);\n        bundle.add(mainPath);\n        updateAttr(mainPath, {\n          x: symbolMeta.pathPosition[0],\n          y: symbolMeta.pathPosition[1],\n          scaleX: 0,\n          scaleY: 0,\n          rotation: symbolMeta.rotation\n        }, {\n          scaleX: symbolMeta.symbolScale[0],\n          scaleY: symbolMeta.symbolScale[1]\n        }, symbolMeta, isUpdate);\n      } else {\n        updateAttr(mainPath, null, {\n          x: symbolMeta.pathPosition[0],\n          y: symbolMeta.pathPosition[1],\n          scaleX: symbolMeta.symbolScale[0],\n          scaleY: symbolMeta.symbolScale[1],\n          rotation: symbolMeta.rotation\n        }, symbolMeta, isUpdate);\n      }\n    }\n    // bar rect is used for label.\n    function createOrUpdateBarRect(bar, symbolMeta, isUpdate) {\n      var rectShape = extend({}, symbolMeta.barRectShape);\n      var barRect = bar.__pictorialBarRect;\n      if (!barRect) {\n        barRect = bar.__pictorialBarRect = new Rect({\n          z2: 2,\n          shape: rectShape,\n          silent: true,\n          style: {\n            stroke: 'transparent',\n            fill: 'transparent',\n            lineWidth: 0\n          }\n        });\n        barRect.disableMorphing = true;\n        bar.add(barRect);\n      } else {\n        updateAttr(barRect, null, {\n          shape: rectShape\n        }, symbolMeta, isUpdate);\n      }\n    }\n    function createOrUpdateClip(bar, opt, symbolMeta, isUpdate) {\n      // If not clip, symbol will be remove and rebuilt.\n      if (symbolMeta.symbolClip) {\n        var clipPath = bar.__pictorialClipPath;\n        var clipShape = extend({}, symbolMeta.clipShape);\n        var valueDim = opt.valueDim;\n        var animationModel = symbolMeta.animationModel;\n        var dataIndex = symbolMeta.dataIndex;\n        if (clipPath) {\n          updateProps(clipPath, {\n            shape: clipShape\n          }, animationModel, dataIndex);\n        } else {\n          clipShape[valueDim.wh] = 0;\n          clipPath = new Rect({\n            shape: clipShape\n          });\n          bar.__pictorialBundle.setClipPath(clipPath);\n          bar.__pictorialClipPath = clipPath;\n          var target = {};\n          target[valueDim.wh] = symbolMeta.clipShape[valueDim.wh];\n          graphic[isUpdate ? 'updateProps' : 'initProps'](clipPath, {\n            shape: target\n          }, animationModel, dataIndex);\n        }\n      }\n    }\n    function getItemModel(data, dataIndex) {\n      var itemModel = data.getItemModel(dataIndex);\n      itemModel.getAnimationDelayParams = getAnimationDelayParams;\n      itemModel.isAnimationEnabled = isAnimationEnabled;\n      return itemModel;\n    }\n    function getAnimationDelayParams(path) {\n      // The order is the same as the z-order, see `symbolRepeatDiretion`.\n      return {\n        index: path.__pictorialAnimationIndex,\n        count: path.__pictorialRepeatTimes\n      };\n    }\n    function isAnimationEnabled() {\n      // `animation` prop can be set on itemModel in pictorial bar chart.\n      return this.parentModel.isAnimationEnabled() && !!this.getShallow('animation');\n    }\n    function createBar(data, opt, symbolMeta, isUpdate) {\n      // bar is the main element for each data.\n      var bar = new Group();\n      // bundle is used for location and clip.\n      var bundle = new Group();\n      bar.add(bundle);\n      bar.__pictorialBundle = bundle;\n      bundle.x = symbolMeta.bundlePosition[0];\n      bundle.y = symbolMeta.bundlePosition[1];\n      if (symbolMeta.symbolRepeat) {\n        createOrUpdateRepeatSymbols(bar, opt, symbolMeta);\n      } else {\n        createOrUpdateSingleSymbol(bar, opt, symbolMeta);\n      }\n      createOrUpdateBarRect(bar, symbolMeta, isUpdate);\n      createOrUpdateClip(bar, opt, symbolMeta, isUpdate);\n      bar.__pictorialShapeStr = getShapeStr(data, symbolMeta);\n      bar.__pictorialSymbolMeta = symbolMeta;\n      return bar;\n    }\n    function updateBar(bar, opt, symbolMeta) {\n      var animationModel = symbolMeta.animationModel;\n      var dataIndex = symbolMeta.dataIndex;\n      var bundle = bar.__pictorialBundle;\n      updateProps(bundle, {\n        x: symbolMeta.bundlePosition[0],\n        y: symbolMeta.bundlePosition[1]\n      }, animationModel, dataIndex);\n      if (symbolMeta.symbolRepeat) {\n        createOrUpdateRepeatSymbols(bar, opt, symbolMeta, true);\n      } else {\n        createOrUpdateSingleSymbol(bar, opt, symbolMeta, true);\n      }\n      createOrUpdateBarRect(bar, symbolMeta, true);\n      createOrUpdateClip(bar, opt, symbolMeta, true);\n    }\n    function removeBar(data, dataIndex, animationModel, bar) {\n      // Not show text when animating\n      var labelRect = bar.__pictorialBarRect;\n      labelRect && labelRect.removeTextContent();\n      var paths = [];\n      eachPath(bar, function (path) {\n        paths.push(path);\n      });\n      bar.__pictorialMainPath && paths.push(bar.__pictorialMainPath);\n      // I do not find proper remove animation for clip yet.\n      bar.__pictorialClipPath && (animationModel = null);\n      each(paths, function (path) {\n        removeElement(path, {\n          scaleX: 0,\n          scaleY: 0\n        }, animationModel, dataIndex, function () {\n          bar.parent && bar.parent.remove(bar);\n        });\n      });\n      data.setItemGraphicEl(dataIndex, null);\n    }\n    function getShapeStr(data, symbolMeta) {\n      return [data.getItemVisual(symbolMeta.dataIndex, 'symbol') || 'none', !!symbolMeta.symbolRepeat, !!symbolMeta.symbolClip].join(':');\n    }\n    function eachPath(bar, cb, context) {\n      // Do not use Group#eachChild, because it do not support remove.\n      each(bar.__pictorialBundle.children(), function (el) {\n        el !== bar.__pictorialBarRect && cb.call(context, el);\n      });\n    }\n    function updateAttr(el, immediateAttrs, animationAttrs, symbolMeta, isUpdate, cb) {\n      immediateAttrs && el.attr(immediateAttrs);\n      // when symbolCip used, only clip path has init animation, otherwise it would be weird effect.\n      if (symbolMeta.symbolClip && !isUpdate) {\n        animationAttrs && el.attr(animationAttrs);\n      } else {\n        animationAttrs && graphic[isUpdate ? 'updateProps' : 'initProps'](el, animationAttrs, symbolMeta.animationModel, symbolMeta.dataIndex, cb);\n      }\n    }\n    function updateCommon$1(bar, opt, symbolMeta) {\n      var dataIndex = symbolMeta.dataIndex;\n      var itemModel = symbolMeta.itemModel;\n      // Color must be excluded.\n      // Because symbol provide setColor individually to set fill and stroke\n      var emphasisModel = itemModel.getModel('emphasis');\n      var emphasisStyle = emphasisModel.getModel('itemStyle').getItemStyle();\n      var blurStyle = itemModel.getModel(['blur', 'itemStyle']).getItemStyle();\n      var selectStyle = itemModel.getModel(['select', 'itemStyle']).getItemStyle();\n      var cursorStyle = itemModel.getShallow('cursor');\n      var focus = emphasisModel.get('focus');\n      var blurScope = emphasisModel.get('blurScope');\n      var hoverScale = emphasisModel.get('scale');\n      eachPath(bar, function (path) {\n        if (path instanceof ZRImage) {\n          var pathStyle = path.style;\n          path.useStyle(extend({\n            // TODO other properties like dx, dy ?\n            image: pathStyle.image,\n            x: pathStyle.x,\n            y: pathStyle.y,\n            width: pathStyle.width,\n            height: pathStyle.height\n          }, symbolMeta.style));\n        } else {\n          path.useStyle(symbolMeta.style);\n        }\n        var emphasisState = path.ensureState('emphasis');\n        emphasisState.style = emphasisStyle;\n        if (hoverScale) {\n          // NOTE: Must after scale is set after updateAttr\n          emphasisState.scaleX = path.scaleX * 1.1;\n          emphasisState.scaleY = path.scaleY * 1.1;\n        }\n        path.ensureState('blur').style = blurStyle;\n        path.ensureState('select').style = selectStyle;\n        cursorStyle && (path.cursor = cursorStyle);\n        path.z2 = symbolMeta.z2;\n      });\n      var barPositionOutside = opt.valueDim.posDesc[+(symbolMeta.boundingLength > 0)];\n      var barRect = bar.__pictorialBarRect;\n      barRect.ignoreClip = true;\n      setLabelStyle(barRect, getLabelStatesModels(itemModel), {\n        labelFetcher: opt.seriesModel,\n        labelDataIndex: dataIndex,\n        defaultText: getDefaultLabel(opt.seriesModel.getData(), dataIndex),\n        inheritColor: symbolMeta.style.fill,\n        defaultOpacity: symbolMeta.style.opacity,\n        defaultOutsidePosition: barPositionOutside\n      });\n      toggleHoverEmphasis(bar, focus, blurScope, emphasisModel.get('disabled'));\n    }\n    function toIntTimes(times) {\n      var roundedTimes = Math.round(times);\n      // Escapse accurate error\n      return Math.abs(times - roundedTimes) < 1e-4 ? roundedTimes : Math.ceil(times);\n    }\n\n    var PictorialBarSeriesModel = /** @class */function (_super) {\n      __extends(PictorialBarSeriesModel, _super);\n      function PictorialBarSeriesModel() {\n        var _this = _super !== null && _super.apply(this, arguments) || this;\n        _this.type = PictorialBarSeriesModel.type;\n        _this.hasSymbolVisual = true;\n        _this.defaultSymbol = 'roundRect';\n        return _this;\n      }\n      PictorialBarSeriesModel.prototype.getInitialData = function (option) {\n        // Disable stack.\n        option.stack = null;\n        return _super.prototype.getInitialData.apply(this, arguments);\n      };\n      PictorialBarSeriesModel.type = 'series.pictorialBar';\n      PictorialBarSeriesModel.dependencies = ['grid'];\n      PictorialBarSeriesModel.defaultOption = inheritDefaultOption(BaseBarSeriesModel.defaultOption, {\n        symbol: 'circle',\n        symbolSize: null,\n        symbolRotate: null,\n        symbolPosition: null,\n        symbolOffset: null,\n        symbolMargin: null,\n        symbolRepeat: false,\n        symbolRepeatDirection: 'end',\n        symbolClip: false,\n        symbolBoundingData: null,\n        symbolPatternSize: 400,\n        barGap: '-100%',\n        // Pictorial bar do not clip by default because in many cases\n        // xAxis and yAxis are not displayed and it's expected not to clip\n        clip: false,\n        // z can be set in data item, which is z2 actually.\n        // Disable progressive\n        progressive: 0,\n        emphasis: {\n          // By default pictorialBar do not hover scale. Hover scale is not suitable\n          // for the case that both has foreground and background.\n          scale: false\n        },\n        select: {\n          itemStyle: {\n            borderColor: '#212121'\n          }\n        }\n      });\n      return PictorialBarSeriesModel;\n    }(BaseBarSeriesModel);\n\n    function install$o(registers) {\n      registers.registerChartView(PictorialBarView);\n      registers.registerSeriesModel(PictorialBarSeriesModel);\n      registers.registerLayout(registers.PRIORITY.VISUAL.LAYOUT, curry(layout, 'pictorialBar'));\n      // Do layout after other overall layout, which can prepare some information.\n      registers.registerLayout(registers.PRIORITY.VISUAL.PROGRESSIVE_LAYOUT, createProgressiveLayout('pictorialBar'));\n    }\n\n    var ThemeRiverView = /** @class */function (_super) {\n      __extends(ThemeRiverView, _super);\n      function ThemeRiverView() {\n        var _this = _super !== null && _super.apply(this, arguments) || this;\n        _this.type = ThemeRiverView.type;\n        _this._layers = [];\n        return _this;\n      }\n      ThemeRiverView.prototype.render = function (seriesModel, ecModel, api) {\n        var data = seriesModel.getData();\n        var self = this;\n        var group = this.group;\n        var layersSeries = seriesModel.getLayerSeries();\n        var layoutInfo = data.getLayout('layoutInfo');\n        var rect = layoutInfo.rect;\n        var boundaryGap = layoutInfo.boundaryGap;\n        group.x = 0;\n        group.y = rect.y + boundaryGap[0];\n        function keyGetter(item) {\n          return item.name;\n        }\n        var dataDiffer = new DataDiffer(this._layersSeries || [], layersSeries, keyGetter, keyGetter);\n        var newLayersGroups = [];\n        dataDiffer.add(bind(process, this, 'add')).update(bind(process, this, 'update')).remove(bind(process, this, 'remove')).execute();\n        function process(status, idx, oldIdx) {\n          var oldLayersGroups = self._layers;\n          if (status === 'remove') {\n            group.remove(oldLayersGroups[idx]);\n            return;\n          }\n          var points0 = [];\n          var points1 = [];\n          var style;\n          var indices = layersSeries[idx].indices;\n          var j = 0;\n          for (; j < indices.length; j++) {\n            var layout = data.getItemLayout(indices[j]);\n            var x = layout.x;\n            var y0 = layout.y0;\n            var y = layout.y;\n            points0.push(x, y0);\n            points1.push(x, y0 + y);\n            style = data.getItemVisual(indices[j], 'style');\n          }\n          var polygon;\n          var textLayout = data.getItemLayout(indices[0]);\n          var labelModel = seriesModel.getModel('label');\n          var margin = labelModel.get('margin');\n          var emphasisModel = seriesModel.getModel('emphasis');\n          if (status === 'add') {\n            var layerGroup = newLayersGroups[idx] = new Group();\n            polygon = new ECPolygon({\n              shape: {\n                points: points0,\n                stackedOnPoints: points1,\n                smooth: 0.4,\n                stackedOnSmooth: 0.4,\n                smoothConstraint: false\n              },\n              z2: 0\n            });\n            layerGroup.add(polygon);\n            group.add(layerGroup);\n            if (seriesModel.isAnimationEnabled()) {\n              polygon.setClipPath(createGridClipShape$2(polygon.getBoundingRect(), seriesModel, function () {\n                polygon.removeClipPath();\n              }));\n            }\n          } else {\n            var layerGroup = oldLayersGroups[oldIdx];\n            polygon = layerGroup.childAt(0);\n            group.add(layerGroup);\n            newLayersGroups[idx] = layerGroup;\n            updateProps(polygon, {\n              shape: {\n                points: points0,\n                stackedOnPoints: points1\n              }\n            }, seriesModel);\n            saveOldStyle(polygon);\n          }\n          setLabelStyle(polygon, getLabelStatesModels(seriesModel), {\n            labelDataIndex: indices[j - 1],\n            defaultText: data.getName(indices[j - 1]),\n            inheritColor: style.fill\n          }, {\n            normal: {\n              verticalAlign: 'middle'\n              // align: 'right'\n            }\n          });\n          polygon.setTextConfig({\n            position: null,\n            local: true\n          });\n          var labelEl = polygon.getTextContent();\n          // TODO More label position options.\n          if (labelEl) {\n            labelEl.x = textLayout.x - margin;\n            labelEl.y = textLayout.y0 + textLayout.y / 2;\n          }\n          polygon.useStyle(style);\n          data.setItemGraphicEl(idx, polygon);\n          setStatesStylesFromModel(polygon, seriesModel);\n          toggleHoverEmphasis(polygon, emphasisModel.get('focus'), emphasisModel.get('blurScope'), emphasisModel.get('disabled'));\n        }\n        this._layersSeries = layersSeries;\n        this._layers = newLayersGroups;\n      };\n      ThemeRiverView.type = 'themeRiver';\n      return ThemeRiverView;\n    }(ChartView);\n    // add animation to the view\n    function createGridClipShape$2(rect, seriesModel, cb) {\n      var rectEl = new Rect({\n        shape: {\n          x: rect.x - 10,\n          y: rect.y - 10,\n          width: 0,\n          height: rect.height + 20\n        }\n      });\n      initProps(rectEl, {\n        shape: {\n          x: rect.x - 50,\n          width: rect.width + 100,\n          height: rect.height + 20\n        }\n      }, seriesModel, cb);\n      return rectEl;\n    }\n\n    var DATA_NAME_INDEX = 2;\n    var ThemeRiverSeriesModel = /** @class */function (_super) {\n      __extends(ThemeRiverSeriesModel, _super);\n      function ThemeRiverSeriesModel() {\n        var _this = _super !== null && _super.apply(this, arguments) || this;\n        _this.type = ThemeRiverSeriesModel.type;\n        return _this;\n      }\n      /**\r\n       * @override\r\n       */\n      ThemeRiverSeriesModel.prototype.init = function (option) {\n        // eslint-disable-next-line\n        _super.prototype.init.apply(this, arguments);\n        // Put this function here is for the sake of consistency of code style.\n        // Enable legend selection for each data item\n        // Use a function instead of direct access because data reference may changed\n        this.legendVisualProvider = new LegendVisualProvider(bind(this.getData, this), bind(this.getRawData, this));\n      };\n      /**\r\n       * If there is no value of a certain point in the time for some event,set it value to 0.\r\n       *\r\n       * @param {Array} data  initial data in the option\r\n       * @return {Array}\r\n       */\n      ThemeRiverSeriesModel.prototype.fixData = function (data) {\n        var rawDataLength = data.length;\n        /**\r\n         * Make sure every layer data get the same keys.\r\n         * The value index tells which layer has visited.\r\n         * {\r\n         *  2014/01/01: -1\r\n         * }\r\n         */\n        var timeValueKeys = {};\n        // grouped data by name\n        var groupResult = groupData(data, function (item) {\n          if (!timeValueKeys.hasOwnProperty(item[0] + '')) {\n            timeValueKeys[item[0] + ''] = -1;\n          }\n          return item[2];\n        });\n        var layerData = [];\n        groupResult.buckets.each(function (items, key) {\n          layerData.push({\n            name: key,\n            dataList: items\n          });\n        });\n        var layerNum = layerData.length;\n        for (var k = 0; k < layerNum; ++k) {\n          var name_1 = layerData[k].name;\n          for (var j = 0; j < layerData[k].dataList.length; ++j) {\n            var timeValue = layerData[k].dataList[j][0] + '';\n            timeValueKeys[timeValue] = k;\n          }\n          for (var timeValue in timeValueKeys) {\n            if (timeValueKeys.hasOwnProperty(timeValue) && timeValueKeys[timeValue] !== k) {\n              timeValueKeys[timeValue] = k;\n              data[rawDataLength] = [timeValue, 0, name_1];\n              rawDataLength++;\n            }\n          }\n        }\n        return data;\n      };\n      /**\r\n       * @override\r\n       * @param  option  the initial option that user gave\r\n       * @param  ecModel  the model object for themeRiver option\r\n       */\n      ThemeRiverSeriesModel.prototype.getInitialData = function (option, ecModel) {\n        var singleAxisModel = this.getReferringComponents('singleAxis', SINGLE_REFERRING).models[0];\n        var axisType = singleAxisModel.get('type');\n        // filter the data item with the value of label is undefined\n        var filterData = filter(option.data, function (dataItem) {\n          return dataItem[2] !== undefined;\n        });\n        // ??? TODO design a stage to transfer data for themeRiver and lines?\n        var data = this.fixData(filterData || []);\n        var nameList = [];\n        var nameMap = this.nameMap = createHashMap();\n        var count = 0;\n        for (var i = 0; i < data.length; ++i) {\n          nameList.push(data[i][DATA_NAME_INDEX]);\n          if (!nameMap.get(data[i][DATA_NAME_INDEX])) {\n            nameMap.set(data[i][DATA_NAME_INDEX], count);\n            count++;\n          }\n        }\n        var dimensions = prepareSeriesDataSchema(data, {\n          coordDimensions: ['single'],\n          dimensionsDefine: [{\n            name: 'time',\n            type: getDimensionTypeByAxis(axisType)\n          }, {\n            name: 'value',\n            type: 'float'\n          }, {\n            name: 'name',\n            type: 'ordinal'\n          }],\n          encodeDefine: {\n            single: 0,\n            value: 1,\n            itemName: 2\n          }\n        }).dimensions;\n        var list = new SeriesData(dimensions, this);\n        list.initData(data);\n        return list;\n      };\n      /**\r\n       * The raw data is divided into multiple layers and each layer\r\n       *     has same name.\r\n       */\n      ThemeRiverSeriesModel.prototype.getLayerSeries = function () {\n        var data = this.getData();\n        var lenCount = data.count();\n        var indexArr = [];\n        for (var i = 0; i < lenCount; ++i) {\n          indexArr[i] = i;\n        }\n        var timeDim = data.mapDimension('single');\n        // data group by name\n        var groupResult = groupData(indexArr, function (index) {\n          return data.get('name', index);\n        });\n        var layerSeries = [];\n        groupResult.buckets.each(function (items, key) {\n          items.sort(function (index1, index2) {\n            return data.get(timeDim, index1) - data.get(timeDim, index2);\n          });\n          layerSeries.push({\n            name: key,\n            indices: items\n          });\n        });\n        return layerSeries;\n      };\n      /**\r\n       * Get data indices for show tooltip content\r\n       */\n      ThemeRiverSeriesModel.prototype.getAxisTooltipData = function (dim, value, baseAxis) {\n        if (!isArray(dim)) {\n          dim = dim ? [dim] : [];\n        }\n        var data = this.getData();\n        var layerSeries = this.getLayerSeries();\n        var indices = [];\n        var layerNum = layerSeries.length;\n        var nestestValue;\n        for (var i = 0; i < layerNum; ++i) {\n          var minDist = Number.MAX_VALUE;\n          var nearestIdx = -1;\n          var pointNum = layerSeries[i].indices.length;\n          for (var j = 0; j < pointNum; ++j) {\n            var theValue = data.get(dim[0], layerSeries[i].indices[j]);\n            var dist = Math.abs(theValue - value);\n            if (dist <= minDist) {\n              nestestValue = theValue;\n              minDist = dist;\n              nearestIdx = layerSeries[i].indices[j];\n            }\n          }\n          indices.push(nearestIdx);\n        }\n        return {\n          dataIndices: indices,\n          nestestValue: nestestValue\n        };\n      };\n      ThemeRiverSeriesModel.prototype.formatTooltip = function (dataIndex, multipleSeries, dataType) {\n        var data = this.getData();\n        var name = data.getName(dataIndex);\n        var value = data.get(data.mapDimension('value'), dataIndex);\n        return createTooltipMarkup('nameValue', {\n          name: name,\n          value: value\n        });\n      };\n      ThemeRiverSeriesModel.type = 'series.themeRiver';\n      ThemeRiverSeriesModel.dependencies = ['singleAxis'];\n      ThemeRiverSeriesModel.defaultOption = {\n        // zlevel: 0,\n        z: 2,\n        colorBy: 'data',\n        coordinateSystem: 'singleAxis',\n        // gap in axis's orthogonal orientation\n        boundaryGap: ['10%', '10%'],\n        // legendHoverLink: true,\n        singleAxisIndex: 0,\n        animationEasing: 'linear',\n        label: {\n          margin: 4,\n          show: true,\n          position: 'left',\n          fontSize: 11\n        },\n        emphasis: {\n          label: {\n            show: true\n          }\n        }\n      };\n      return ThemeRiverSeriesModel;\n    }(SeriesModel);\n\n    function themeRiverLayout(ecModel, api) {\n      ecModel.eachSeriesByType('themeRiver', function (seriesModel) {\n        var data = seriesModel.getData();\n        var single = seriesModel.coordinateSystem;\n        var layoutInfo = {};\n        // use the axis boundingRect for view\n        var rect = single.getRect();\n        layoutInfo.rect = rect;\n        var boundaryGap = seriesModel.get('boundaryGap');\n        var axis = single.getAxis();\n        layoutInfo.boundaryGap = boundaryGap;\n        if (axis.orient === 'horizontal') {\n          boundaryGap[0] = parsePercent$1(boundaryGap[0], rect.height);\n          boundaryGap[1] = parsePercent$1(boundaryGap[1], rect.height);\n          var height = rect.height - boundaryGap[0] - boundaryGap[1];\n          doThemeRiverLayout(data, seriesModel, height);\n        } else {\n          boundaryGap[0] = parsePercent$1(boundaryGap[0], rect.width);\n          boundaryGap[1] = parsePercent$1(boundaryGap[1], rect.width);\n          var width = rect.width - boundaryGap[0] - boundaryGap[1];\n          doThemeRiverLayout(data, seriesModel, width);\n        }\n        data.setLayout('layoutInfo', layoutInfo);\n      });\n    }\n    /**\r\n     * The layout information about themeriver\r\n     *\r\n     * @param data  data in the series\r\n     * @param seriesModel  the model object of themeRiver series\r\n     * @param height  value used to compute every series height\r\n     */\n    function doThemeRiverLayout(data, seriesModel, height) {\n      if (!data.count()) {\n        return;\n      }\n      var coordSys = seriesModel.coordinateSystem;\n      // the data in each layer are organized into a series.\n      var layerSeries = seriesModel.getLayerSeries();\n      // the points in each layer.\n      var timeDim = data.mapDimension('single');\n      var valueDim = data.mapDimension('value');\n      var layerPoints = map(layerSeries, function (singleLayer) {\n        return map(singleLayer.indices, function (idx) {\n          var pt = coordSys.dataToPoint(data.get(timeDim, idx));\n          pt[1] = data.get(valueDim, idx);\n          return pt;\n        });\n      });\n      var base = computeBaseline(layerPoints);\n      var baseLine = base.y0;\n      var ky = height / base.max;\n      // set layout information for each item.\n      var n = layerSeries.length;\n      var m = layerSeries[0].indices.length;\n      var baseY0;\n      for (var j = 0; j < m; ++j) {\n        baseY0 = baseLine[j] * ky;\n        data.setItemLayout(layerSeries[0].indices[j], {\n          layerIndex: 0,\n          x: layerPoints[0][j][0],\n          y0: baseY0,\n          y: layerPoints[0][j][1] * ky\n        });\n        for (var i = 1; i < n; ++i) {\n          baseY0 += layerPoints[i - 1][j][1] * ky;\n          data.setItemLayout(layerSeries[i].indices[j], {\n            layerIndex: i,\n            x: layerPoints[i][j][0],\n            y0: baseY0,\n            y: layerPoints[i][j][1] * ky\n          });\n        }\n      }\n    }\n    /**\r\n     * Compute the baseLine of the rawdata\r\n     * Inspired by Lee Byron's paper Stacked Graphs - Geometry & Aesthetics\r\n     *\r\n     * @param  data  the points in each layer\r\n     */\n    function computeBaseline(data) {\n      var layerNum = data.length;\n      var pointNum = data[0].length;\n      var sums = [];\n      var y0 = [];\n      var max = 0;\n      for (var i = 0; i < pointNum; ++i) {\n        var temp = 0;\n        for (var j = 0; j < layerNum; ++j) {\n          temp += data[j][i][1];\n        }\n        if (temp > max) {\n          max = temp;\n        }\n        sums.push(temp);\n      }\n      for (var k = 0; k < pointNum; ++k) {\n        y0[k] = (max - sums[k]) / 2;\n      }\n      max = 0;\n      for (var l = 0; l < pointNum; ++l) {\n        var sum = sums[l] + y0[l];\n        if (sum > max) {\n          max = sum;\n        }\n      }\n      return {\n        y0: y0,\n        max: max\n      };\n    }\n\n    function install$p(registers) {\n      registers.registerChartView(ThemeRiverView);\n      registers.registerSeriesModel(ThemeRiverSeriesModel);\n      registers.registerLayout(themeRiverLayout);\n      registers.registerProcessor(dataFilter('themeRiver'));\n    }\n\n    var DEFAULT_SECTOR_Z = 2;\n    var DEFAULT_TEXT_Z = 4;\n    /**\r\n     * Sunburstce of Sunburst including Sector, Label, LabelLine\r\n     */\n    var SunburstPiece = /** @class */function (_super) {\n      __extends(SunburstPiece, _super);\n      function SunburstPiece(node, seriesModel, ecModel, api) {\n        var _this = _super.call(this) || this;\n        _this.z2 = DEFAULT_SECTOR_Z;\n        _this.textConfig = {\n          inside: true\n        };\n        getECData(_this).seriesIndex = seriesModel.seriesIndex;\n        var text = new ZRText({\n          z2: DEFAULT_TEXT_Z,\n          silent: node.getModel().get(['label', 'silent'])\n        });\n        _this.setTextContent(text);\n        _this.updateData(true, node, seriesModel, ecModel, api);\n        return _this;\n      }\n      SunburstPiece.prototype.updateData = function (firstCreate, node,\n      // state: 'emphasis' | 'normal' | 'highlight' | 'downplay',\n      seriesModel, ecModel, api) {\n        this.node = node;\n        node.piece = this;\n        seriesModel = seriesModel || this._seriesModel;\n        ecModel = ecModel || this._ecModel;\n        var sector = this;\n        getECData(sector).dataIndex = node.dataIndex;\n        var itemModel = node.getModel();\n        var emphasisModel = itemModel.getModel('emphasis');\n        var layout = node.getLayout();\n        var sectorShape = extend({}, layout);\n        sectorShape.label = null;\n        var normalStyle = node.getVisual('style');\n        normalStyle.lineJoin = 'bevel';\n        var decal = node.getVisual('decal');\n        if (decal) {\n          normalStyle.decal = createOrUpdatePatternFromDecal(decal, api);\n        }\n        var cornerRadius = getSectorCornerRadius(itemModel.getModel('itemStyle'), sectorShape, true);\n        extend(sectorShape, cornerRadius);\n        each(SPECIAL_STATES, function (stateName) {\n          var state = sector.ensureState(stateName);\n          var itemStyleModel = itemModel.getModel([stateName, 'itemStyle']);\n          state.style = itemStyleModel.getItemStyle();\n          // border radius\n          var cornerRadius = getSectorCornerRadius(itemStyleModel, sectorShape);\n          if (cornerRadius) {\n            state.shape = cornerRadius;\n          }\n        });\n        if (firstCreate) {\n          sector.setShape(sectorShape);\n          sector.shape.r = layout.r0;\n          initProps(sector, {\n            shape: {\n              r: layout.r\n            }\n          }, seriesModel, node.dataIndex);\n        } else {\n          // Disable animation for gradient since no interpolation method\n          // is supported for gradient\n          updateProps(sector, {\n            shape: sectorShape\n          }, seriesModel);\n          saveOldStyle(sector);\n        }\n        sector.useStyle(normalStyle);\n        this._updateLabel(seriesModel);\n        var cursorStyle = itemModel.getShallow('cursor');\n        cursorStyle && sector.attr('cursor', cursorStyle);\n        this._seriesModel = seriesModel || this._seriesModel;\n        this._ecModel = ecModel || this._ecModel;\n        var focus = emphasisModel.get('focus');\n        var focusOrIndices = focus === 'relative' ? concatArray(node.getAncestorsIndices(), node.getDescendantIndices()) : focus === 'ancestor' ? node.getAncestorsIndices() : focus === 'descendant' ? node.getDescendantIndices() : focus;\n        toggleHoverEmphasis(this, focusOrIndices, emphasisModel.get('blurScope'), emphasisModel.get('disabled'));\n      };\n      SunburstPiece.prototype._updateLabel = function (seriesModel) {\n        var _this = this;\n        var itemModel = this.node.getModel();\n        var normalLabelModel = itemModel.getModel('label');\n        var layout = this.node.getLayout();\n        var angle = layout.endAngle - layout.startAngle;\n        var midAngle = (layout.startAngle + layout.endAngle) / 2;\n        var dx = Math.cos(midAngle);\n        var dy = Math.sin(midAngle);\n        var sector = this;\n        var label = sector.getTextContent();\n        var dataIndex = this.node.dataIndex;\n        var labelMinAngle = normalLabelModel.get('minAngle') / 180 * Math.PI;\n        var isNormalShown = normalLabelModel.get('show') && !(labelMinAngle != null && Math.abs(angle) < labelMinAngle);\n        label.ignore = !isNormalShown;\n        // TODO use setLabelStyle\n        each(DISPLAY_STATES, function (stateName) {\n          var labelStateModel = stateName === 'normal' ? itemModel.getModel('label') : itemModel.getModel([stateName, 'label']);\n          var isNormal = stateName === 'normal';\n          var state = isNormal ? label : label.ensureState(stateName);\n          var text = seriesModel.getFormattedLabel(dataIndex, stateName);\n          if (isNormal) {\n            text = text || _this.node.name;\n          }\n          state.style = createTextStyle(labelStateModel, {}, null, stateName !== 'normal', true);\n          if (text) {\n            state.style.text = text;\n          }\n          // Not displaying text when angle is too small\n          var isShown = labelStateModel.get('show');\n          if (isShown != null && !isNormal) {\n            state.ignore = !isShown;\n          }\n          var labelPosition = getLabelAttr(labelStateModel, 'position');\n          var sectorState = isNormal ? sector : sector.states[stateName];\n          var labelColor = sectorState.style.fill;\n          sectorState.textConfig = {\n            outsideFill: labelStateModel.get('color') === 'inherit' ? labelColor : null,\n            inside: labelPosition !== 'outside'\n          };\n          var r;\n          var labelPadding = getLabelAttr(labelStateModel, 'distance') || 0;\n          var textAlign = getLabelAttr(labelStateModel, 'align');\n          var rotateType = getLabelAttr(labelStateModel, 'rotate');\n          var flipStartAngle = Math.PI * 0.5;\n          var flipEndAngle = Math.PI * 1.5;\n          var midAngleNormal = normalizeRadian(rotateType === 'tangential' ? Math.PI / 2 - midAngle : midAngle);\n          // For text that is up-side down, rotate 180 degrees to make sure\n          // it's readable\n          var needsFlip = midAngleNormal > flipStartAngle && !isRadianAroundZero(midAngleNormal - flipStartAngle) && midAngleNormal < flipEndAngle;\n          if (labelPosition === 'outside') {\n            r = layout.r + labelPadding;\n            textAlign = needsFlip ? 'right' : 'left';\n          } else {\n            if (!textAlign || textAlign === 'center') {\n              // Put label in the center if it's a circle\n              if (angle === 2 * Math.PI && layout.r0 === 0) {\n                r = 0;\n              } else {\n                r = (layout.r + layout.r0) / 2;\n              }\n              textAlign = 'center';\n            } else if (textAlign === 'left') {\n              r = layout.r0 + labelPadding;\n              textAlign = needsFlip ? 'right' : 'left';\n            } else if (textAlign === 'right') {\n              r = layout.r - labelPadding;\n              textAlign = needsFlip ? 'left' : 'right';\n            }\n          }\n          state.style.align = textAlign;\n          state.style.verticalAlign = getLabelAttr(labelStateModel, 'verticalAlign') || 'middle';\n          state.x = r * dx + layout.cx;\n          state.y = r * dy + layout.cy;\n          var rotate = 0;\n          if (rotateType === 'radial') {\n            rotate = normalizeRadian(-midAngle) + (needsFlip ? Math.PI : 0);\n          } else if (rotateType === 'tangential') {\n            rotate = normalizeRadian(Math.PI / 2 - midAngle) + (needsFlip ? Math.PI : 0);\n          } else if (isNumber(rotateType)) {\n            rotate = rotateType * Math.PI / 180;\n          }\n          state.rotation = normalizeRadian(rotate);\n        });\n        function getLabelAttr(model, name) {\n          var stateAttr = model.get(name);\n          if (stateAttr == null) {\n            return normalLabelModel.get(name);\n          }\n          return stateAttr;\n        }\n        label.dirtyStyle();\n      };\n      return SunburstPiece;\n    }(Sector);\n\n    var ROOT_TO_NODE_ACTION = 'sunburstRootToNode';\n    var HIGHLIGHT_ACTION = 'sunburstHighlight';\n    var UNHIGHLIGHT_ACTION = 'sunburstUnhighlight';\n    function installSunburstAction(registers) {\n      registers.registerAction({\n        type: ROOT_TO_NODE_ACTION,\n        update: 'updateView'\n      }, function (payload, ecModel) {\n        ecModel.eachComponent({\n          mainType: 'series',\n          subType: 'sunburst',\n          query: payload\n        }, handleRootToNode);\n        function handleRootToNode(model, index) {\n          var targetInfo = retrieveTargetInfo(payload, [ROOT_TO_NODE_ACTION], model);\n          if (targetInfo) {\n            var originViewRoot = model.getViewRoot();\n            if (originViewRoot) {\n              payload.direction = aboveViewRoot(originViewRoot, targetInfo.node) ? 'rollUp' : 'drillDown';\n            }\n            model.resetViewRoot(targetInfo.node);\n          }\n        }\n      });\n      registers.registerAction({\n        type: HIGHLIGHT_ACTION,\n        update: 'none'\n      }, function (payload, ecModel, api) {\n        // Clone\n        payload = extend({}, payload);\n        ecModel.eachComponent({\n          mainType: 'series',\n          subType: 'sunburst',\n          query: payload\n        }, handleHighlight);\n        function handleHighlight(model) {\n          var targetInfo = retrieveTargetInfo(payload, [HIGHLIGHT_ACTION], model);\n          if (targetInfo) {\n            payload.dataIndex = targetInfo.node.dataIndex;\n          }\n        }\n        if (\"development\" !== 'production') {\n          deprecateReplaceLog('sunburstHighlight', 'highlight');\n        }\n        // Fast forward action\n        api.dispatchAction(extend(payload, {\n          type: 'highlight'\n        }));\n      });\n      registers.registerAction({\n        type: UNHIGHLIGHT_ACTION,\n        update: 'updateView'\n      }, function (payload, ecModel, api) {\n        payload = extend({}, payload);\n        if (\"development\" !== 'production') {\n          deprecateReplaceLog('sunburstUnhighlight', 'downplay');\n        }\n        api.dispatchAction(extend(payload, {\n          type: 'downplay'\n        }));\n      });\n    }\n\n    var SunburstView = /** @class */function (_super) {\n      __extends(SunburstView, _super);\n      function SunburstView() {\n        var _this = _super !== null && _super.apply(this, arguments) || this;\n        _this.type = SunburstView.type;\n        return _this;\n      }\n      SunburstView.prototype.render = function (seriesModel, ecModel, api,\n      // @ts-ignore\n      payload) {\n        var self = this;\n        this.seriesModel = seriesModel;\n        this.api = api;\n        this.ecModel = ecModel;\n        var data = seriesModel.getData();\n        var virtualRoot = data.tree.root;\n        var newRoot = seriesModel.getViewRoot();\n        var group = this.group;\n        var renderLabelForZeroData = seriesModel.get('renderLabelForZeroData');\n        var newChildren = [];\n        newRoot.eachNode(function (node) {\n          newChildren.push(node);\n        });\n        var oldChildren = this._oldChildren || [];\n        dualTravel(newChildren, oldChildren);\n        renderRollUp(virtualRoot, newRoot);\n        this._initEvents();\n        this._oldChildren = newChildren;\n        function dualTravel(newChildren, oldChildren) {\n          if (newChildren.length === 0 && oldChildren.length === 0) {\n            return;\n          }\n          new DataDiffer(oldChildren, newChildren, getKey, getKey).add(processNode).update(processNode).remove(curry(processNode, null)).execute();\n          function getKey(node) {\n            return node.getId();\n          }\n          function processNode(newIdx, oldIdx) {\n            var newNode = newIdx == null ? null : newChildren[newIdx];\n            var oldNode = oldIdx == null ? null : oldChildren[oldIdx];\n            doRenderNode(newNode, oldNode);\n          }\n        }\n        function doRenderNode(newNode, oldNode) {\n          if (!renderLabelForZeroData && newNode && !newNode.getValue()) {\n            // Not render data with value 0\n            newNode = null;\n          }\n          if (newNode !== virtualRoot && oldNode !== virtualRoot) {\n            if (oldNode && oldNode.piece) {\n              if (newNode) {\n                // Update\n                oldNode.piece.updateData(false, newNode, seriesModel, ecModel, api);\n                // For tooltip\n                data.setItemGraphicEl(newNode.dataIndex, oldNode.piece);\n              } else {\n                // Remove\n                removeNode(oldNode);\n              }\n            } else if (newNode) {\n              // Add\n              var piece = new SunburstPiece(newNode, seriesModel, ecModel, api);\n              group.add(piece);\n              // For tooltip\n              data.setItemGraphicEl(newNode.dataIndex, piece);\n            }\n          }\n        }\n        function removeNode(node) {\n          if (!node) {\n            return;\n          }\n          if (node.piece) {\n            group.remove(node.piece);\n            node.piece = null;\n          }\n        }\n        function renderRollUp(virtualRoot, viewRoot) {\n          if (viewRoot.depth > 0) {\n            // Render\n            if (self.virtualPiece) {\n              // Update\n              self.virtualPiece.updateData(false, virtualRoot, seriesModel, ecModel, api);\n            } else {\n              // Add\n              self.virtualPiece = new SunburstPiece(virtualRoot, seriesModel, ecModel, api);\n              group.add(self.virtualPiece);\n            }\n            // TODO event scope\n            viewRoot.piece.off('click');\n            self.virtualPiece.on('click', function (e) {\n              self._rootToNode(viewRoot.parentNode);\n            });\n          } else if (self.virtualPiece) {\n            // Remove\n            group.remove(self.virtualPiece);\n            self.virtualPiece = null;\n          }\n        }\n      };\n      /**\r\n       * @private\r\n       */\n      SunburstView.prototype._initEvents = function () {\n        var _this = this;\n        this.group.off('click');\n        this.group.on('click', function (e) {\n          var targetFound = false;\n          var viewRoot = _this.seriesModel.getViewRoot();\n          viewRoot.eachNode(function (node) {\n            if (!targetFound && node.piece && node.piece === e.target) {\n              var nodeClick = node.getModel().get('nodeClick');\n              if (nodeClick === 'rootToNode') {\n                _this._rootToNode(node);\n              } else if (nodeClick === 'link') {\n                var itemModel = node.getModel();\n                var link = itemModel.get('link');\n                if (link) {\n                  var linkTarget = itemModel.get('target', true) || '_blank';\n                  windowOpen(link, linkTarget);\n                }\n              }\n              targetFound = true;\n            }\n          });\n        });\n      };\n      /**\r\n       * @private\r\n       */\n      SunburstView.prototype._rootToNode = function (node) {\n        if (node !== this.seriesModel.getViewRoot()) {\n          this.api.dispatchAction({\n            type: ROOT_TO_NODE_ACTION,\n            from: this.uid,\n            seriesId: this.seriesModel.id,\n            targetNode: node\n          });\n        }\n      };\n      /**\r\n       * @implement\r\n       */\n      SunburstView.prototype.containPoint = function (point, seriesModel) {\n        var treeRoot = seriesModel.getData();\n        var itemLayout = treeRoot.getItemLayout(0);\n        if (itemLayout) {\n          var dx = point[0] - itemLayout.cx;\n          var dy = point[1] - itemLayout.cy;\n          var radius = Math.sqrt(dx * dx + dy * dy);\n          return radius <= itemLayout.r && radius >= itemLayout.r0;\n        }\n      };\n      SunburstView.type = 'sunburst';\n      return SunburstView;\n    }(ChartView);\n\n    var SunburstSeriesModel = /** @class */function (_super) {\n      __extends(SunburstSeriesModel, _super);\n      function SunburstSeriesModel() {\n        var _this = _super !== null && _super.apply(this, arguments) || this;\n        _this.type = SunburstSeriesModel.type;\n        _this.ignoreStyleOnData = true;\n        return _this;\n      }\n      SunburstSeriesModel.prototype.getInitialData = function (option, ecModel) {\n        // Create a virtual root.\n        var root = {\n          name: option.name,\n          children: option.data\n        };\n        completeTreeValue$1(root);\n        var levelModels = this._levelModels = map(option.levels || [], function (levelDefine) {\n          return new Model(levelDefine, this, ecModel);\n        }, this);\n        // Make sure always a new tree is created when setOption,\n        // in TreemapView, we check whether oldTree === newTree\n        // to choose mappings approach among old shapes and new shapes.\n        var tree = Tree.createTree(root, this, beforeLink);\n        function beforeLink(nodeData) {\n          nodeData.wrapMethod('getItemModel', function (model, idx) {\n            var node = tree.getNodeByDataIndex(idx);\n            var levelModel = levelModels[node.depth];\n            levelModel && (model.parentModel = levelModel);\n            return model;\n          });\n        }\n        return tree.data;\n      };\n      SunburstSeriesModel.prototype.optionUpdated = function () {\n        this.resetViewRoot();\n      };\n      /*\r\n       * @override\r\n       */\n      SunburstSeriesModel.prototype.getDataParams = function (dataIndex) {\n        var params = _super.prototype.getDataParams.apply(this, arguments);\n        var node = this.getData().tree.getNodeByDataIndex(dataIndex);\n        params.treePathInfo = wrapTreePathInfo(node, this);\n        return params;\n      };\n      SunburstSeriesModel.prototype.getLevelModel = function (node) {\n        return this._levelModels && this._levelModels[node.depth];\n      };\n      SunburstSeriesModel.prototype.getViewRoot = function () {\n        return this._viewRoot;\n      };\n      SunburstSeriesModel.prototype.resetViewRoot = function (viewRoot) {\n        viewRoot ? this._viewRoot = viewRoot : viewRoot = this._viewRoot;\n        var root = this.getRawData().tree.root;\n        if (!viewRoot || viewRoot !== root && !root.contains(viewRoot)) {\n          this._viewRoot = root;\n        }\n      };\n      SunburstSeriesModel.prototype.enableAriaDecal = function () {\n        enableAriaDecalForTree(this);\n      };\n      SunburstSeriesModel.type = 'series.sunburst';\n      SunburstSeriesModel.defaultOption = {\n        // zlevel: 0,\n        z: 2,\n        // 默认全局居中\n        center: ['50%', '50%'],\n        radius: [0, '75%'],\n        // 默认顺时针\n        clockwise: true,\n        startAngle: 90,\n        // 最小角度改为0\n        minAngle: 0,\n        // If still show when all data zero.\n        stillShowZeroSum: true,\n        // 'rootToNode', 'link', or false\n        nodeClick: 'rootToNode',\n        renderLabelForZeroData: false,\n        label: {\n          // could be: 'radial', 'tangential', or 'none'\n          rotate: 'radial',\n          show: true,\n          opacity: 1,\n          // 'left' is for inner side of inside, and 'right' is for outer\n          // side for inside\n          align: 'center',\n          position: 'inside',\n          distance: 5,\n          silent: true\n        },\n        itemStyle: {\n          borderWidth: 1,\n          borderColor: 'white',\n          borderType: 'solid',\n          shadowBlur: 0,\n          shadowColor: 'rgba(0, 0, 0, 0.2)',\n          shadowOffsetX: 0,\n          shadowOffsetY: 0,\n          opacity: 1\n        },\n        emphasis: {\n          focus: 'descendant'\n        },\n        blur: {\n          itemStyle: {\n            opacity: 0.2\n          },\n          label: {\n            opacity: 0.1\n          }\n        },\n        // Animation type can be expansion, scale.\n        animationType: 'expansion',\n        animationDuration: 1000,\n        animationDurationUpdate: 500,\n        data: [],\n        /**\r\n         * Sort order.\r\n         *\r\n         * Valid values: 'desc', 'asc', null, or callback function.\r\n         * 'desc' and 'asc' for descend and ascendant order;\r\n         * null for not sorting;\r\n         * example of callback function:\r\n         * function(nodeA, nodeB) {\r\n         *     return nodeA.getValue() - nodeB.getValue();\r\n         * }\r\n         */\n        sort: 'desc'\n      };\n      return SunburstSeriesModel;\n    }(SeriesModel);\n    function completeTreeValue$1(dataNode) {\n      // Postorder travel tree.\n      // If value of none-leaf node is not set,\n      // calculate it by suming up the value of all children.\n      var sum = 0;\n      each(dataNode.children, function (child) {\n        completeTreeValue$1(child);\n        var childValue = child.value;\n        // TODO First value of array must be a number\n        isArray(childValue) && (childValue = childValue[0]);\n        sum += childValue;\n      });\n      var thisValue = dataNode.value;\n      if (isArray(thisValue)) {\n        thisValue = thisValue[0];\n      }\n      if (thisValue == null || isNaN(thisValue)) {\n        thisValue = sum;\n      }\n      // Value should not less than 0.\n      if (thisValue < 0) {\n        thisValue = 0;\n      }\n      isArray(dataNode.value) ? dataNode.value[0] = thisValue : dataNode.value = thisValue;\n    }\n\n    // let PI2 = Math.PI * 2;\n    var RADIAN$2 = Math.PI / 180;\n    function sunburstLayout(seriesType, ecModel, api) {\n      ecModel.eachSeriesByType(seriesType, function (seriesModel) {\n        var center = seriesModel.get('center');\n        var radius = seriesModel.get('radius');\n        if (!isArray(radius)) {\n          radius = [0, radius];\n        }\n        if (!isArray(center)) {\n          center = [center, center];\n        }\n        var width = api.getWidth();\n        var height = api.getHeight();\n        var size = Math.min(width, height);\n        var cx = parsePercent$1(center[0], width);\n        var cy = parsePercent$1(center[1], height);\n        var r0 = parsePercent$1(radius[0], size / 2);\n        var r = parsePercent$1(radius[1], size / 2);\n        var startAngle = -seriesModel.get('startAngle') * RADIAN$2;\n        var minAngle = seriesModel.get('minAngle') * RADIAN$2;\n        var virtualRoot = seriesModel.getData().tree.root;\n        var treeRoot = seriesModel.getViewRoot();\n        var rootDepth = treeRoot.depth;\n        var sort = seriesModel.get('sort');\n        if (sort != null) {\n          initChildren$1(treeRoot, sort);\n        }\n        var validDataCount = 0;\n        each(treeRoot.children, function (child) {\n          !isNaN(child.getValue()) && validDataCount++;\n        });\n        var sum = treeRoot.getValue();\n        // Sum may be 0\n        var unitRadian = Math.PI / (sum || validDataCount) * 2;\n        var renderRollupNode = treeRoot.depth > 0;\n        var levels = treeRoot.height - (renderRollupNode ? -1 : 1);\n        var rPerLevel = (r - r0) / (levels || 1);\n        var clockwise = seriesModel.get('clockwise');\n        var stillShowZeroSum = seriesModel.get('stillShowZeroSum');\n        // In the case some sector angle is smaller than minAngle\n        // let restAngle = PI2;\n        // let valueSumLargerThanMinAngle = 0;\n        var dir = clockwise ? 1 : -1;\n        /**\r\n         * Render a tree\r\n         * @return increased angle\r\n         */\n        var renderNode = function (node, startAngle) {\n          if (!node) {\n            return;\n          }\n          var endAngle = startAngle;\n          // Render self\n          if (node !== virtualRoot) {\n            // Tree node is virtual, so it doesn't need to be drawn\n            var value = node.getValue();\n            var angle = sum === 0 && stillShowZeroSum ? unitRadian : value * unitRadian;\n            if (angle < minAngle) {\n              angle = minAngle;\n              // restAngle -= minAngle;\n            }\n            // else {\n            //     valueSumLargerThanMinAngle += value;\n            // }\n            endAngle = startAngle + dir * angle;\n            var depth = node.depth - rootDepth - (renderRollupNode ? -1 : 1);\n            var rStart = r0 + rPerLevel * depth;\n            var rEnd = r0 + rPerLevel * (depth + 1);\n            var levelModel = seriesModel.getLevelModel(node);\n            if (levelModel) {\n              var r0_1 = levelModel.get('r0', true);\n              var r_1 = levelModel.get('r', true);\n              var radius_1 = levelModel.get('radius', true);\n              if (radius_1 != null) {\n                r0_1 = radius_1[0];\n                r_1 = radius_1[1];\n              }\n              r0_1 != null && (rStart = parsePercent$1(r0_1, size / 2));\n              r_1 != null && (rEnd = parsePercent$1(r_1, size / 2));\n            }\n            node.setLayout({\n              angle: angle,\n              startAngle: startAngle,\n              endAngle: endAngle,\n              clockwise: clockwise,\n              cx: cx,\n              cy: cy,\n              r0: rStart,\n              r: rEnd\n            });\n          }\n          // Render children\n          if (node.children && node.children.length) {\n            // currentAngle = startAngle;\n            var siblingAngle_1 = 0;\n            each(node.children, function (node) {\n              siblingAngle_1 += renderNode(node, startAngle + siblingAngle_1);\n            });\n          }\n          return endAngle - startAngle;\n        };\n        // Virtual root node for roll up\n        if (renderRollupNode) {\n          var rStart = r0;\n          var rEnd = r0 + rPerLevel;\n          var angle = Math.PI * 2;\n          virtualRoot.setLayout({\n            angle: angle,\n            startAngle: startAngle,\n            endAngle: startAngle + angle,\n            clockwise: clockwise,\n            cx: cx,\n            cy: cy,\n            r0: rStart,\n            r: rEnd\n          });\n        }\n        renderNode(treeRoot, startAngle);\n      });\n    }\n    /**\r\n     * Init node children by order and update visual\r\n     */\n    function initChildren$1(node, sortOrder) {\n      var children = node.children || [];\n      node.children = sort$2(children, sortOrder);\n      // Init children recursively\n      if (children.length) {\n        each(node.children, function (child) {\n          initChildren$1(child, sortOrder);\n        });\n      }\n    }\n    /**\r\n     * Sort children nodes\r\n     *\r\n     * @param {TreeNode[]}               children children of node to be sorted\r\n     * @param {string | function | null} sort sort method\r\n     *                                   See SunburstSeries.js for details.\r\n     */\n    function sort$2(children, sortOrder) {\n      if (isFunction(sortOrder)) {\n        var sortTargets = map(children, function (child, idx) {\n          var value = child.getValue();\n          return {\n            params: {\n              depth: child.depth,\n              height: child.height,\n              dataIndex: child.dataIndex,\n              getValue: function () {\n                return value;\n              }\n            },\n            index: idx\n          };\n        });\n        sortTargets.sort(function (a, b) {\n          return sortOrder(a.params, b.params);\n        });\n        return map(sortTargets, function (target) {\n          return children[target.index];\n        });\n      } else {\n        var isAsc_1 = sortOrder === 'asc';\n        return children.sort(function (a, b) {\n          var diff = (a.getValue() - b.getValue()) * (isAsc_1 ? 1 : -1);\n          return diff === 0 ? (a.dataIndex - b.dataIndex) * (isAsc_1 ? -1 : 1) : diff;\n        });\n      }\n    }\n\n    function sunburstVisual(ecModel) {\n      var paletteScope = {};\n      // Default color strategy\n      function pickColor(node, seriesModel, treeHeight) {\n        // Choose color from palette based on the first level.\n        var current = node;\n        while (current && current.depth > 1) {\n          current = current.parentNode;\n        }\n        var color = seriesModel.getColorFromPalette(current.name || current.dataIndex + '', paletteScope);\n        if (node.depth > 1 && isString(color)) {\n          // Lighter on the deeper level.\n          color = lift(color, (node.depth - 1) / (treeHeight - 1) * 0.5);\n        }\n        return color;\n      }\n      ecModel.eachSeriesByType('sunburst', function (seriesModel) {\n        var data = seriesModel.getData();\n        var tree = data.tree;\n        tree.eachNode(function (node) {\n          var model = node.getModel();\n          var style = model.getModel('itemStyle').getItemStyle();\n          if (!style.fill) {\n            style.fill = pickColor(node, seriesModel, tree.root.height);\n          }\n          var existsStyle = data.ensureUniqueItemVisual(node.dataIndex, 'style');\n          extend(existsStyle, style);\n        });\n      });\n    }\n\n    function install$q(registers) {\n      registers.registerChartView(SunburstView);\n      registers.registerSeriesModel(SunburstSeriesModel);\n      registers.registerLayout(curry(sunburstLayout, 'sunburst'));\n      registers.registerProcessor(curry(dataFilter, 'sunburst'));\n      registers.registerVisual(sunburstVisual);\n      installSunburstAction(registers);\n    }\n\n    // Also compat with ec4, where\n    // `visual('color') visual('borderColor')` is supported.\n    var STYLE_VISUAL_TYPE = {\n      color: 'fill',\n      borderColor: 'stroke'\n    };\n    var NON_STYLE_VISUAL_PROPS = {\n      symbol: 1,\n      symbolSize: 1,\n      symbolKeepAspect: 1,\n      legendIcon: 1,\n      visualMeta: 1,\n      liftZ: 1,\n      decal: 1\n    };\n    var customInnerStore = makeInner();\n    var CustomSeriesModel = /** @class */function (_super) {\n      __extends(CustomSeriesModel, _super);\n      function CustomSeriesModel() {\n        var _this = _super !== null && _super.apply(this, arguments) || this;\n        _this.type = CustomSeriesModel.type;\n        return _this;\n      }\n      CustomSeriesModel.prototype.optionUpdated = function () {\n        this.currentZLevel = this.get('zlevel', true);\n        this.currentZ = this.get('z', true);\n      };\n      CustomSeriesModel.prototype.getInitialData = function (option, ecModel) {\n        return createSeriesData(null, this);\n      };\n      CustomSeriesModel.prototype.getDataParams = function (dataIndex, dataType, el) {\n        var params = _super.prototype.getDataParams.call(this, dataIndex, dataType);\n        el && (params.info = customInnerStore(el).info);\n        return params;\n      };\n      CustomSeriesModel.type = 'series.custom';\n      CustomSeriesModel.dependencies = ['grid', 'polar', 'geo', 'singleAxis', 'calendar'];\n      CustomSeriesModel.defaultOption = {\n        coordinateSystem: 'cartesian2d',\n        // zlevel: 0,\n        z: 2,\n        legendHoverLink: true,\n        // Custom series will not clip by default.\n        // Some case will use custom series to draw label\n        // For example https://echarts.apache.org/examples/en/editor.html?c=custom-gantt-flight\n        clip: false\n        // Cartesian coordinate system\n        // xAxisIndex: 0,\n        // yAxisIndex: 0,\n        // Polar coordinate system\n        // polarIndex: 0,\n        // Geo coordinate system\n        // geoIndex: 0,\n      };\n      return CustomSeriesModel;\n    }(SeriesModel);\n\n    function dataToCoordSize(dataSize, dataItem) {\n      // dataItem is necessary in log axis.\n      dataItem = dataItem || [0, 0];\n      return map(['x', 'y'], function (dim, dimIdx) {\n        var axis = this.getAxis(dim);\n        var val = dataItem[dimIdx];\n        var halfSize = dataSize[dimIdx] / 2;\n        return axis.type === 'category' ? axis.getBandWidth() : Math.abs(axis.dataToCoord(val - halfSize) - axis.dataToCoord(val + halfSize));\n      }, this);\n    }\n    function cartesianPrepareCustom(coordSys) {\n      var rect = coordSys.master.getRect();\n      return {\n        coordSys: {\n          // The name exposed to user is always 'cartesian2d' but not 'grid'.\n          type: 'cartesian2d',\n          x: rect.x,\n          y: rect.y,\n          width: rect.width,\n          height: rect.height\n        },\n        api: {\n          coord: function (data) {\n            // do not provide \"out\" param\n            return coordSys.dataToPoint(data);\n          },\n          size: bind(dataToCoordSize, coordSys)\n        }\n      };\n    }\n\n    function dataToCoordSize$1(dataSize, dataItem) {\n      dataItem = dataItem || [0, 0];\n      return map([0, 1], function (dimIdx) {\n        var val = dataItem[dimIdx];\n        var halfSize = dataSize[dimIdx] / 2;\n        var p1 = [];\n        var p2 = [];\n        p1[dimIdx] = val - halfSize;\n        p2[dimIdx] = val + halfSize;\n        p1[1 - dimIdx] = p2[1 - dimIdx] = dataItem[1 - dimIdx];\n        return Math.abs(this.dataToPoint(p1)[dimIdx] - this.dataToPoint(p2)[dimIdx]);\n      }, this);\n    }\n    function geoPrepareCustom(coordSys) {\n      var rect = coordSys.getBoundingRect();\n      return {\n        coordSys: {\n          type: 'geo',\n          x: rect.x,\n          y: rect.y,\n          width: rect.width,\n          height: rect.height,\n          zoom: coordSys.getZoom()\n        },\n        api: {\n          coord: function (data) {\n            // do not provide \"out\" and noRoam param,\n            // Compatible with this usage:\n            // echarts.util.map(item.points, api.coord)\n            return coordSys.dataToPoint(data);\n          },\n          size: bind(dataToCoordSize$1, coordSys)\n        }\n      };\n    }\n\n    function dataToCoordSize$2(dataSize, dataItem) {\n      // dataItem is necessary in log axis.\n      var axis = this.getAxis();\n      var val = dataItem instanceof Array ? dataItem[0] : dataItem;\n      var halfSize = (dataSize instanceof Array ? dataSize[0] : dataSize) / 2;\n      return axis.type === 'category' ? axis.getBandWidth() : Math.abs(axis.dataToCoord(val - halfSize) - axis.dataToCoord(val + halfSize));\n    }\n    function singlePrepareCustom(coordSys) {\n      var rect = coordSys.getRect();\n      return {\n        coordSys: {\n          type: 'singleAxis',\n          x: rect.x,\n          y: rect.y,\n          width: rect.width,\n          height: rect.height\n        },\n        api: {\n          coord: function (val) {\n            // do not provide \"out\" param\n            return coordSys.dataToPoint(val);\n          },\n          size: bind(dataToCoordSize$2, coordSys)\n        }\n      };\n    }\n\n    // import AngleAxis from './AngleAxis.js';\n    function dataToCoordSize$3(dataSize, dataItem) {\n      // dataItem is necessary in log axis.\n      dataItem = dataItem || [0, 0];\n      return map(['Radius', 'Angle'], function (dim, dimIdx) {\n        var getterName = 'get' + dim + 'Axis';\n        // TODO: TYPE Check Angle Axis\n        var axis = this[getterName]();\n        var val = dataItem[dimIdx];\n        var halfSize = dataSize[dimIdx] / 2;\n        var result = axis.type === 'category' ? axis.getBandWidth() : Math.abs(axis.dataToCoord(val - halfSize) - axis.dataToCoord(val + halfSize));\n        if (dim === 'Angle') {\n          result = result * Math.PI / 180;\n        }\n        return result;\n      }, this);\n    }\n    function polarPrepareCustom(coordSys) {\n      var radiusAxis = coordSys.getRadiusAxis();\n      var angleAxis = coordSys.getAngleAxis();\n      var radius = radiusAxis.getExtent();\n      radius[0] > radius[1] && radius.reverse();\n      return {\n        coordSys: {\n          type: 'polar',\n          cx: coordSys.cx,\n          cy: coordSys.cy,\n          r: radius[1],\n          r0: radius[0]\n        },\n        api: {\n          coord: function (data) {\n            var radius = radiusAxis.dataToRadius(data[0]);\n            var angle = angleAxis.dataToAngle(data[1]);\n            var coord = coordSys.coordToPoint([radius, angle]);\n            coord.push(radius, angle * Math.PI / 180);\n            return coord;\n          },\n          size: bind(dataToCoordSize$3, coordSys)\n        }\n      };\n    }\n\n    /*\n    * Licensed to the Apache Software Foundation (ASF) under one\n    * or more contributor license agreements.  See the NOTICE file\n    * distributed with this work for additional information\n    * regarding copyright ownership.  The ASF licenses this file\n    * to you under the Apache License, Version 2.0 (the\n    * \"License\"); you may not use this file except in compliance\n    * with the License.  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,\n    * software distributed under the License is distributed on an\n    * \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\n    * KIND, either express or implied.  See the License for the\n    * specific language governing permissions and limitations\n    * under the License.\n    */\n\n\n    /**\n     * AUTO-GENERATED FILE. DO NOT MODIFY.\n     */\n\n    /*\r\n    * Licensed to the Apache Software Foundation (ASF) under one\r\n    * or more contributor license agreements.  See the NOTICE file\r\n    * distributed with this work for additional information\r\n    * regarding copyright ownership.  The ASF licenses this file\r\n    * to you under the Apache License, Version 2.0 (the\r\n    * \"License\"); you may not use this file except in compliance\r\n    * with the License.  You may obtain a copy of the License at\r\n    *\r\n    *   http://www.apache.org/licenses/LICENSE-2.0\r\n    *\r\n    * Unless required by applicable law or agreed to in writing,\r\n    * software distributed under the License is distributed on an\r\n    * \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\r\n    * KIND, either express or implied.  See the License for the\r\n    * specific language governing permissions and limitations\r\n    * under the License.\r\n    */\n    function calendarPrepareCustom(coordSys) {\n      var rect = coordSys.getRect();\n      var rangeInfo = coordSys.getRangeInfo();\n      return {\n        coordSys: {\n          type: 'calendar',\n          x: rect.x,\n          y: rect.y,\n          width: rect.width,\n          height: rect.height,\n          cellWidth: coordSys.getCellWidth(),\n          cellHeight: coordSys.getCellHeight(),\n          rangeInfo: {\n            start: rangeInfo.start,\n            end: rangeInfo.end,\n            weeks: rangeInfo.weeks,\n            dayCount: rangeInfo.allDay\n          }\n        },\n        api: {\n          coord: function (data, clamp) {\n            return coordSys.dataToPoint(data, clamp);\n          }\n        }\n      };\n    }\n\n    var deprecatedLogs = {};\n    /**\r\n     * Whether need to call `convertEC4CompatibleStyle`.\r\n     */\n    function isEC4CompatibleStyle(style, elType, hasOwnTextContentOption, hasOwnTextConfig) {\n      // Since echarts5, `RectText` is separated from its host element and style.text\n      // does not exist any more. The compat work brings some extra burden on performance.\n      // So we provide:\n      // `legacy: true` force make compat.\n      // `legacy: false`, force do not compat.\n      // `legacy` not set: auto detect whether legacy.\n      //     But in this case we do not compat (difficult to detect and rare case):\n      //     Becuse custom series and graphic component support \"merge\", users may firstly\n      //     only set `textStrokeWidth` style or secondly only set `text`.\n      return style && (style.legacy || style.legacy !== false && !hasOwnTextContentOption && !hasOwnTextConfig && elType !== 'tspan'\n      // Difficult to detect whether legacy for a \"text\" el.\n      && (elType === 'text' || hasOwn(style, 'text')));\n    }\n    /**\r\n     * `EC4CompatibleStyle` is style that might be in echarts4 format or echarts5 format.\r\n     * @param hostStyle The properties might be modified.\r\n     * @return If be text el, `textContentStyle` and `textConfig` will not be returned.\r\n     *         Otherwise a `textContentStyle` and `textConfig` will be created, whose props area\r\n     *         retried from the `hostStyle`.\r\n     */\n    function convertFromEC4CompatibleStyle(hostStyle, elType, isNormal) {\n      var srcStyle = hostStyle;\n      var textConfig;\n      var textContent;\n      var textContentStyle;\n      if (elType === 'text') {\n        textContentStyle = srcStyle;\n      } else {\n        textContentStyle = {};\n        hasOwn(srcStyle, 'text') && (textContentStyle.text = srcStyle.text);\n        hasOwn(srcStyle, 'rich') && (textContentStyle.rich = srcStyle.rich);\n        hasOwn(srcStyle, 'textFill') && (textContentStyle.fill = srcStyle.textFill);\n        hasOwn(srcStyle, 'textStroke') && (textContentStyle.stroke = srcStyle.textStroke);\n        hasOwn(srcStyle, 'fontFamily') && (textContentStyle.fontFamily = srcStyle.fontFamily);\n        hasOwn(srcStyle, 'fontSize') && (textContentStyle.fontSize = srcStyle.fontSize);\n        hasOwn(srcStyle, 'fontStyle') && (textContentStyle.fontStyle = srcStyle.fontStyle);\n        hasOwn(srcStyle, 'fontWeight') && (textContentStyle.fontWeight = srcStyle.fontWeight);\n        textContent = {\n          type: 'text',\n          style: textContentStyle,\n          // ec4 does not support rectText trigger.\n          // And when text position is different in normal and emphasis\n          // => hover text trigger emphasis;\n          // => text position changed, leave mouse pointer immediately;\n          // That might cause incorrect state.\n          silent: true\n        };\n        textConfig = {};\n        var hasOwnPos = hasOwn(srcStyle, 'textPosition');\n        if (isNormal) {\n          textConfig.position = hasOwnPos ? srcStyle.textPosition : 'inside';\n        } else {\n          hasOwnPos && (textConfig.position = srcStyle.textPosition);\n        }\n        hasOwn(srcStyle, 'textPosition') && (textConfig.position = srcStyle.textPosition);\n        hasOwn(srcStyle, 'textOffset') && (textConfig.offset = srcStyle.textOffset);\n        hasOwn(srcStyle, 'textRotation') && (textConfig.rotation = srcStyle.textRotation);\n        hasOwn(srcStyle, 'textDistance') && (textConfig.distance = srcStyle.textDistance);\n      }\n      convertEC4CompatibleRichItem(textContentStyle, hostStyle);\n      each(textContentStyle.rich, function (richItem) {\n        convertEC4CompatibleRichItem(richItem, richItem);\n      });\n      return {\n        textConfig: textConfig,\n        textContent: textContent\n      };\n    }\n    /**\r\n     * The result will be set to `out`.\r\n     */\n    function convertEC4CompatibleRichItem(out, richItem) {\n      if (!richItem) {\n        return;\n      }\n      // (1) For simplicity, make textXXX properties (deprecated since ec5) has\n      // higher priority. For example, consider in ec4 `borderColor: 5, textBorderColor: 10`\n      // on a rect means `borderColor: 4` on the rect and `borderColor: 10` on an attached\n      // richText in ec5.\n      // (2) `out === richItem` if and only if `out` is text el or rich item.\n      // So we can overwrite existing props in `out` since textXXX has higher priority.\n      richItem.font = richItem.textFont || richItem.font;\n      hasOwn(richItem, 'textStrokeWidth') && (out.lineWidth = richItem.textStrokeWidth);\n      hasOwn(richItem, 'textAlign') && (out.align = richItem.textAlign);\n      hasOwn(richItem, 'textVerticalAlign') && (out.verticalAlign = richItem.textVerticalAlign);\n      hasOwn(richItem, 'textLineHeight') && (out.lineHeight = richItem.textLineHeight);\n      hasOwn(richItem, 'textWidth') && (out.width = richItem.textWidth);\n      hasOwn(richItem, 'textHeight') && (out.height = richItem.textHeight);\n      hasOwn(richItem, 'textBackgroundColor') && (out.backgroundColor = richItem.textBackgroundColor);\n      hasOwn(richItem, 'textPadding') && (out.padding = richItem.textPadding);\n      hasOwn(richItem, 'textBorderColor') && (out.borderColor = richItem.textBorderColor);\n      hasOwn(richItem, 'textBorderWidth') && (out.borderWidth = richItem.textBorderWidth);\n      hasOwn(richItem, 'textBorderRadius') && (out.borderRadius = richItem.textBorderRadius);\n      hasOwn(richItem, 'textBoxShadowColor') && (out.shadowColor = richItem.textBoxShadowColor);\n      hasOwn(richItem, 'textBoxShadowBlur') && (out.shadowBlur = richItem.textBoxShadowBlur);\n      hasOwn(richItem, 'textBoxShadowOffsetX') && (out.shadowOffsetX = richItem.textBoxShadowOffsetX);\n      hasOwn(richItem, 'textBoxShadowOffsetY') && (out.shadowOffsetY = richItem.textBoxShadowOffsetY);\n    }\n    /**\r\n     * Convert to pure echarts4 format style.\r\n     * `itemStyle` will be modified, added with ec4 style properties from\r\n     * `textStyle` and `textConfig`.\r\n     *\r\n     * [Caveat]: For simplicity, `insideRollback` in ec4 does not compat, where\r\n     * `styleEmphasis: {textFill: 'red'}` will remove the normal auto added stroke.\r\n     */\n    function convertToEC4StyleForCustomSerise(itemStl, txStl, txCfg) {\n      var out = itemStl;\n      // See `custom.ts`, a trick to set extra `textPosition` firstly.\n      out.textPosition = out.textPosition || txCfg.position || 'inside';\n      txCfg.offset != null && (out.textOffset = txCfg.offset);\n      txCfg.rotation != null && (out.textRotation = txCfg.rotation);\n      txCfg.distance != null && (out.textDistance = txCfg.distance);\n      var isInside = out.textPosition.indexOf('inside') >= 0;\n      var hostFill = itemStl.fill || '#000';\n      convertToEC4RichItem(out, txStl);\n      var textFillNotSet = out.textFill == null;\n      if (isInside) {\n        if (textFillNotSet) {\n          out.textFill = txCfg.insideFill || '#fff';\n          !out.textStroke && txCfg.insideStroke && (out.textStroke = txCfg.insideStroke);\n          !out.textStroke && (out.textStroke = hostFill);\n          out.textStrokeWidth == null && (out.textStrokeWidth = 2);\n        }\n      } else {\n        if (textFillNotSet) {\n          out.textFill = itemStl.fill || txCfg.outsideFill || '#000';\n        }\n        !out.textStroke && txCfg.outsideStroke && (out.textStroke = txCfg.outsideStroke);\n      }\n      out.text = txStl.text;\n      out.rich = txStl.rich;\n      each(txStl.rich, function (richItem) {\n        convertToEC4RichItem(richItem, richItem);\n      });\n      return out;\n    }\n    function convertToEC4RichItem(out, richItem) {\n      if (!richItem) {\n        return;\n      }\n      hasOwn(richItem, 'fill') && (out.textFill = richItem.fill);\n      hasOwn(richItem, 'stroke') && (out.textStroke = richItem.fill);\n      hasOwn(richItem, 'lineWidth') && (out.textStrokeWidth = richItem.lineWidth);\n      hasOwn(richItem, 'font') && (out.font = richItem.font);\n      hasOwn(richItem, 'fontStyle') && (out.fontStyle = richItem.fontStyle);\n      hasOwn(richItem, 'fontWeight') && (out.fontWeight = richItem.fontWeight);\n      hasOwn(richItem, 'fontSize') && (out.fontSize = richItem.fontSize);\n      hasOwn(richItem, 'fontFamily') && (out.fontFamily = richItem.fontFamily);\n      hasOwn(richItem, 'align') && (out.textAlign = richItem.align);\n      hasOwn(richItem, 'verticalAlign') && (out.textVerticalAlign = richItem.verticalAlign);\n      hasOwn(richItem, 'lineHeight') && (out.textLineHeight = richItem.lineHeight);\n      hasOwn(richItem, 'width') && (out.textWidth = richItem.width);\n      hasOwn(richItem, 'height') && (out.textHeight = richItem.height);\n      hasOwn(richItem, 'backgroundColor') && (out.textBackgroundColor = richItem.backgroundColor);\n      hasOwn(richItem, 'padding') && (out.textPadding = richItem.padding);\n      hasOwn(richItem, 'borderColor') && (out.textBorderColor = richItem.borderColor);\n      hasOwn(richItem, 'borderWidth') && (out.textBorderWidth = richItem.borderWidth);\n      hasOwn(richItem, 'borderRadius') && (out.textBorderRadius = richItem.borderRadius);\n      hasOwn(richItem, 'shadowColor') && (out.textBoxShadowColor = richItem.shadowColor);\n      hasOwn(richItem, 'shadowBlur') && (out.textBoxShadowBlur = richItem.shadowBlur);\n      hasOwn(richItem, 'shadowOffsetX') && (out.textBoxShadowOffsetX = richItem.shadowOffsetX);\n      hasOwn(richItem, 'shadowOffsetY') && (out.textBoxShadowOffsetY = richItem.shadowOffsetY);\n      hasOwn(richItem, 'textShadowColor') && (out.textShadowColor = richItem.textShadowColor);\n      hasOwn(richItem, 'textShadowBlur') && (out.textShadowBlur = richItem.textShadowBlur);\n      hasOwn(richItem, 'textShadowOffsetX') && (out.textShadowOffsetX = richItem.textShadowOffsetX);\n      hasOwn(richItem, 'textShadowOffsetY') && (out.textShadowOffsetY = richItem.textShadowOffsetY);\n    }\n    function warnDeprecated(deprecated, insteadApproach) {\n      if (\"development\" !== 'production') {\n        var key = deprecated + '^_^' + insteadApproach;\n        if (!deprecatedLogs[key]) {\n          console.warn(\"[ECharts] DEPRECATED: \\\"\" + deprecated + \"\\\" has been deprecated. \" + insteadApproach);\n          deprecatedLogs[key] = true;\n        }\n      }\n    }\n\n    var LEGACY_TRANSFORM_PROPS_MAP = {\n      position: ['x', 'y'],\n      scale: ['scaleX', 'scaleY'],\n      origin: ['originX', 'originY']\n    };\n    var LEGACY_TRANSFORM_PROPS = keys(LEGACY_TRANSFORM_PROPS_MAP);\n    var TRANSFORM_PROPS_MAP = reduce(TRANSFORMABLE_PROPS, function (obj, key) {\n      obj[key] = 1;\n      return obj;\n    }, {});\n    var transformPropNamesStr = TRANSFORMABLE_PROPS.join(', ');\n    // '' means root\n    var ELEMENT_ANIMATABLE_PROPS = ['', 'style', 'shape', 'extra'];\n    var transitionInnerStore = makeInner();\n    function getElementAnimationConfig(animationType, el, elOption, parentModel, dataIndex) {\n      var animationProp = animationType + \"Animation\";\n      var config = getAnimationConfig(animationType, parentModel, dataIndex) || {};\n      var userDuring = transitionInnerStore(el).userDuring;\n      // Only set when duration is > 0 and it's need to be animated.\n      if (config.duration > 0) {\n        // For simplicity, if during not specified, the previous during will not work any more.\n        config.during = userDuring ? bind(duringCall, {\n          el: el,\n          userDuring: userDuring\n        }) : null;\n        config.setToFinal = true;\n        config.scope = animationType;\n      }\n      extend(config, elOption[animationProp]);\n      return config;\n    }\n    function applyUpdateTransition(el, elOption, animatableModel, opts) {\n      opts = opts || {};\n      var dataIndex = opts.dataIndex,\n        isInit = opts.isInit,\n        clearStyle = opts.clearStyle;\n      var hasAnimation = animatableModel.isAnimationEnabled();\n      // Save the meta info for further morphing. Like apply on the sub morphing elements.\n      var store = transitionInnerStore(el);\n      var styleOpt = elOption.style;\n      store.userDuring = elOption.during;\n      var transFromProps = {};\n      var propsToSet = {};\n      prepareTransformAllPropsFinal(el, elOption, propsToSet);\n      prepareShapeOrExtraAllPropsFinal('shape', elOption, propsToSet);\n      prepareShapeOrExtraAllPropsFinal('extra', elOption, propsToSet);\n      if (!isInit && hasAnimation) {\n        prepareTransformTransitionFrom(el, elOption, transFromProps);\n        prepareShapeOrExtraTransitionFrom('shape', el, elOption, transFromProps);\n        prepareShapeOrExtraTransitionFrom('extra', el, elOption, transFromProps);\n        prepareStyleTransitionFrom(el, elOption, styleOpt, transFromProps);\n      }\n      propsToSet.style = styleOpt;\n      applyPropsDirectly(el, propsToSet, clearStyle);\n      applyMiscProps(el, elOption);\n      if (hasAnimation) {\n        if (isInit) {\n          var enterFromProps_1 = {};\n          each(ELEMENT_ANIMATABLE_PROPS, function (propName) {\n            var prop = propName ? elOption[propName] : elOption;\n            if (prop && prop.enterFrom) {\n              if (propName) {\n                enterFromProps_1[propName] = enterFromProps_1[propName] || {};\n              }\n              extend(propName ? enterFromProps_1[propName] : enterFromProps_1, prop.enterFrom);\n            }\n          });\n          var config = getElementAnimationConfig('enter', el, elOption, animatableModel, dataIndex);\n          if (config.duration > 0) {\n            el.animateFrom(enterFromProps_1, config);\n          }\n        } else {\n          applyPropsTransition(el, elOption, dataIndex || 0, animatableModel, transFromProps);\n        }\n      }\n      // Store leave to be used in leave transition.\n      updateLeaveTo(el, elOption);\n      styleOpt ? el.dirty() : el.markRedraw();\n    }\n    function updateLeaveTo(el, elOption) {\n      // Try merge to previous set leaveTo\n      var leaveToProps = transitionInnerStore(el).leaveToProps;\n      for (var i = 0; i < ELEMENT_ANIMATABLE_PROPS.length; i++) {\n        var propName = ELEMENT_ANIMATABLE_PROPS[i];\n        var prop = propName ? elOption[propName] : elOption;\n        if (prop && prop.leaveTo) {\n          if (!leaveToProps) {\n            leaveToProps = transitionInnerStore(el).leaveToProps = {};\n          }\n          if (propName) {\n            leaveToProps[propName] = leaveToProps[propName] || {};\n          }\n          extend(propName ? leaveToProps[propName] : leaveToProps, prop.leaveTo);\n        }\n      }\n    }\n    function applyLeaveTransition(el, elOption, animatableModel, onRemove) {\n      if (el) {\n        var parent_1 = el.parent;\n        var leaveToProps = transitionInnerStore(el).leaveToProps;\n        if (leaveToProps) {\n          // TODO TODO use leave after leaveAnimation in series is introduced\n          // TODO Data index?\n          var config = getElementAnimationConfig('update', el, elOption, animatableModel, 0);\n          config.done = function () {\n            parent_1.remove(el);\n            onRemove && onRemove();\n          };\n          el.animateTo(leaveToProps, config);\n        } else {\n          parent_1.remove(el);\n          onRemove && onRemove();\n        }\n      }\n    }\n    function isTransitionAll(transition) {\n      return transition === 'all';\n    }\n    function applyPropsDirectly(el,\n    // Can be null/undefined\n    allPropsFinal, clearStyle) {\n      var styleOpt = allPropsFinal.style;\n      if (!el.isGroup && styleOpt) {\n        if (clearStyle) {\n          el.useStyle({});\n          // When style object changed, how to trade the existing animation?\n          // It is probably complicated and not needed to cover all the cases.\n          // But still need consider the case:\n          // (1) When using init animation on `style.opacity`, and before the animation\n          //     ended users triggers an update by mousewhel. At that time the init\n          //     animation should better be continued rather than terminated.\n          //     So after `useStyle` called, we should change the animation target manually\n          //     to continue the effect of the init animation.\n          // (2) PENDING: If the previous animation targeted at a `val1`, and currently we need\n          //     to update the value to `val2` and no animation declared, should be terminate\n          //     the previous animation or just modify the target of the animation?\n          //     Therotically That will happen not only on `style` but also on `shape` and\n          //     `transfrom` props. But we haven't handle this case at present yet.\n          // (3) PENDING: Is it proper to visit `animators` and `targetName`?\n          var animators = el.animators;\n          for (var i = 0; i < animators.length; i++) {\n            var animator = animators[i];\n            // targetName is the \"topKey\".\n            if (animator.targetName === 'style') {\n              animator.changeTarget(el.style);\n            }\n          }\n        }\n        el.setStyle(styleOpt);\n      }\n      if (allPropsFinal) {\n        // Not set style here.\n        allPropsFinal.style = null;\n        // Set el to the final state firstly.\n        allPropsFinal && el.attr(allPropsFinal);\n        allPropsFinal.style = styleOpt;\n      }\n    }\n    function applyPropsTransition(el, elOption, dataIndex, model,\n    // Can be null/undefined\n    transFromProps) {\n      if (transFromProps) {\n        var config = getElementAnimationConfig('update', el, elOption, model, dataIndex);\n        if (config.duration > 0) {\n          el.animateFrom(transFromProps, config);\n        }\n      }\n    }\n    function applyMiscProps(el, elOption) {\n      // Merge by default.\n      hasOwn(elOption, 'silent') && (el.silent = elOption.silent);\n      hasOwn(elOption, 'ignore') && (el.ignore = elOption.ignore);\n      if (el instanceof Displayable) {\n        hasOwn(elOption, 'invisible') && (el.invisible = elOption.invisible);\n      }\n      if (el instanceof Path) {\n        hasOwn(elOption, 'autoBatch') && (el.autoBatch = elOption.autoBatch);\n      }\n    }\n    // Use it to avoid it be exposed to user.\n    var tmpDuringScope = {};\n    var transitionDuringAPI = {\n      // Usually other props do not need to be changed in animation during.\n      setTransform: function (key, val) {\n        if (\"development\" !== 'production') {\n          assert(hasOwn(TRANSFORM_PROPS_MAP, key), 'Only ' + transformPropNamesStr + ' available in `setTransform`.');\n        }\n        tmpDuringScope.el[key] = val;\n        return this;\n      },\n      getTransform: function (key) {\n        if (\"development\" !== 'production') {\n          assert(hasOwn(TRANSFORM_PROPS_MAP, key), 'Only ' + transformPropNamesStr + ' available in `getTransform`.');\n        }\n        return tmpDuringScope.el[key];\n      },\n      setShape: function (key, val) {\n        if (\"development\" !== 'production') {\n          assertNotReserved(key);\n        }\n        var el = tmpDuringScope.el;\n        var shape = el.shape || (el.shape = {});\n        shape[key] = val;\n        el.dirtyShape && el.dirtyShape();\n        return this;\n      },\n      getShape: function (key) {\n        if (\"development\" !== 'production') {\n          assertNotReserved(key);\n        }\n        var shape = tmpDuringScope.el.shape;\n        if (shape) {\n          return shape[key];\n        }\n      },\n      setStyle: function (key, val) {\n        if (\"development\" !== 'production') {\n          assertNotReserved(key);\n        }\n        var el = tmpDuringScope.el;\n        var style = el.style;\n        if (style) {\n          if (\"development\" !== 'production') {\n            if (eqNaN(val)) {\n              warn('style.' + key + ' must not be assigned with NaN.');\n            }\n          }\n          style[key] = val;\n          el.dirtyStyle && el.dirtyStyle();\n        }\n        return this;\n      },\n      getStyle: function (key) {\n        if (\"development\" !== 'production') {\n          assertNotReserved(key);\n        }\n        var style = tmpDuringScope.el.style;\n        if (style) {\n          return style[key];\n        }\n      },\n      setExtra: function (key, val) {\n        if (\"development\" !== 'production') {\n          assertNotReserved(key);\n        }\n        var extra = tmpDuringScope.el.extra || (tmpDuringScope.el.extra = {});\n        extra[key] = val;\n        return this;\n      },\n      getExtra: function (key) {\n        if (\"development\" !== 'production') {\n          assertNotReserved(key);\n        }\n        var extra = tmpDuringScope.el.extra;\n        if (extra) {\n          return extra[key];\n        }\n      }\n    };\n    function assertNotReserved(key) {\n      if (\"development\" !== 'production') {\n        if (key === 'transition' || key === 'enterFrom' || key === 'leaveTo') {\n          throw new Error('key must not be \"' + key + '\"');\n        }\n      }\n    }\n    function duringCall() {\n      // Do not provide \"percent\" until some requirements come.\n      // Because consider thies case:\n      // enterFrom: {x: 100, y: 30}, transition: 'x'.\n      // And enter duration is different from update duration.\n      // Thus it might be confused about the meaning of \"percent\" in during callback.\n      var scope = this;\n      var el = scope.el;\n      if (!el) {\n        return;\n      }\n      // If el is remove from zr by reason like legend, during still need to called,\n      // because el will be added back to zr and the prop value should not be incorrect.\n      var latestUserDuring = transitionInnerStore(el).userDuring;\n      var scopeUserDuring = scope.userDuring;\n      // Ensured a during is only called once in each animation frame.\n      // If a during is called multiple times in one frame, maybe some users' calculation logic\n      // might be wrong (not sure whether this usage exists).\n      // The case of a during might be called twice can be: by default there is a animator for\n      // 'x', 'y' when init. Before the init animation finished, call `setOption` to start\n      // another animators for 'style'/'shape'/'extra'.\n      if (latestUserDuring !== scopeUserDuring) {\n        // release\n        scope.el = scope.userDuring = null;\n        return;\n      }\n      tmpDuringScope.el = el;\n      // Give no `this` to user in \"during\" calling.\n      scopeUserDuring(transitionDuringAPI);\n      // FIXME: if in future meet the case that some prop will be both modified in `during` and `state`,\n      // consider the issue that the prop might be incorrect when return to \"normal\" state.\n    }\n    function prepareShapeOrExtraTransitionFrom(mainAttr, fromEl, elOption, transFromProps) {\n      var attrOpt = elOption[mainAttr];\n      if (!attrOpt) {\n        return;\n      }\n      var elPropsInAttr = fromEl[mainAttr];\n      var transFromPropsInAttr;\n      if (elPropsInAttr) {\n        var transition = elOption.transition;\n        var attrTransition = attrOpt.transition;\n        if (attrTransition) {\n          !transFromPropsInAttr && (transFromPropsInAttr = transFromProps[mainAttr] = {});\n          if (isTransitionAll(attrTransition)) {\n            extend(transFromPropsInAttr, elPropsInAttr);\n          } else {\n            var transitionKeys = normalizeToArray(attrTransition);\n            for (var i = 0; i < transitionKeys.length; i++) {\n              var key = transitionKeys[i];\n              var elVal = elPropsInAttr[key];\n              transFromPropsInAttr[key] = elVal;\n            }\n          }\n        } else if (isTransitionAll(transition) || indexOf(transition, mainAttr) >= 0) {\n          !transFromPropsInAttr && (transFromPropsInAttr = transFromProps[mainAttr] = {});\n          var elPropsInAttrKeys = keys(elPropsInAttr);\n          for (var i = 0; i < elPropsInAttrKeys.length; i++) {\n            var key = elPropsInAttrKeys[i];\n            var elVal = elPropsInAttr[key];\n            if (isNonStyleTransitionEnabled(attrOpt[key], elVal)) {\n              transFromPropsInAttr[key] = elVal;\n            }\n          }\n        }\n      }\n    }\n    function prepareShapeOrExtraAllPropsFinal(mainAttr, elOption, allProps) {\n      var attrOpt = elOption[mainAttr];\n      if (!attrOpt) {\n        return;\n      }\n      var allPropsInAttr = allProps[mainAttr] = {};\n      var keysInAttr = keys(attrOpt);\n      for (var i = 0; i < keysInAttr.length; i++) {\n        var key = keysInAttr[i];\n        // To avoid share one object with different element, and\n        // to avoid user modify the object inexpectedly, have to clone.\n        allPropsInAttr[key] = cloneValue(attrOpt[key]);\n      }\n    }\n    function prepareTransformTransitionFrom(el, elOption, transFromProps) {\n      var transition = elOption.transition;\n      var transitionKeys = isTransitionAll(transition) ? TRANSFORMABLE_PROPS : normalizeToArray(transition || []);\n      for (var i = 0; i < transitionKeys.length; i++) {\n        var key = transitionKeys[i];\n        if (key === 'style' || key === 'shape' || key === 'extra') {\n          continue;\n        }\n        var elVal = el[key];\n        if (\"development\" !== 'production') {\n          checkTransformPropRefer(key, 'el.transition');\n        }\n        // Do not clone, animator will perform that clone.\n        transFromProps[key] = elVal;\n      }\n    }\n    function prepareTransformAllPropsFinal(el, elOption, allProps) {\n      for (var i = 0; i < LEGACY_TRANSFORM_PROPS.length; i++) {\n        var legacyName = LEGACY_TRANSFORM_PROPS[i];\n        var xyName = LEGACY_TRANSFORM_PROPS_MAP[legacyName];\n        var legacyArr = elOption[legacyName];\n        if (legacyArr) {\n          allProps[xyName[0]] = legacyArr[0];\n          allProps[xyName[1]] = legacyArr[1];\n        }\n      }\n      for (var i = 0; i < TRANSFORMABLE_PROPS.length; i++) {\n        var key = TRANSFORMABLE_PROPS[i];\n        if (elOption[key] != null) {\n          allProps[key] = elOption[key];\n        }\n      }\n    }\n    function prepareStyleTransitionFrom(fromEl, elOption, styleOpt, transFromProps) {\n      if (!styleOpt) {\n        return;\n      }\n      var fromElStyle = fromEl.style;\n      var transFromStyleProps;\n      if (fromElStyle) {\n        var styleTransition = styleOpt.transition;\n        var elTransition = elOption.transition;\n        if (styleTransition && !isTransitionAll(styleTransition)) {\n          var transitionKeys = normalizeToArray(styleTransition);\n          !transFromStyleProps && (transFromStyleProps = transFromProps.style = {});\n          for (var i = 0; i < transitionKeys.length; i++) {\n            var key = transitionKeys[i];\n            var elVal = fromElStyle[key];\n            // Do not clone, see `checkNonStyleTansitionRefer`.\n            transFromStyleProps[key] = elVal;\n          }\n        } else if (fromEl.getAnimationStyleProps && (isTransitionAll(elTransition) || isTransitionAll(styleTransition) || indexOf(elTransition, 'style') >= 0)) {\n          var animationProps = fromEl.getAnimationStyleProps();\n          var animationStyleProps = animationProps ? animationProps.style : null;\n          if (animationStyleProps) {\n            !transFromStyleProps && (transFromStyleProps = transFromProps.style = {});\n            var styleKeys = keys(styleOpt);\n            for (var i = 0; i < styleKeys.length; i++) {\n              var key = styleKeys[i];\n              if (animationStyleProps[key]) {\n                var elVal = fromElStyle[key];\n                transFromStyleProps[key] = elVal;\n              }\n            }\n          }\n        }\n      }\n    }\n    function isNonStyleTransitionEnabled(optVal, elVal) {\n      // The same as `checkNonStyleTansitionRefer`.\n      return !isArrayLike(optVal) ? optVal != null && isFinite(optVal) : optVal !== elVal;\n    }\n    var checkTransformPropRefer;\n    if (\"development\" !== 'production') {\n      checkTransformPropRefer = function (key, usedIn) {\n        if (!hasOwn(TRANSFORM_PROPS_MAP, key)) {\n          warn('Prop `' + key + '` is not a permitted in `' + usedIn + '`. ' + 'Only `' + keys(TRANSFORM_PROPS_MAP).join('`, `') + '` are permitted.');\n        }\n      };\n    }\n\n    var getStateToRestore = makeInner();\n    var KEYFRAME_EXCLUDE_KEYS = ['percent', 'easing', 'shape', 'style', 'extra'];\n    /**\r\n     * Stop previous keyframe animation and restore the attributes.\r\n     * Avoid new keyframe animation starts with wrong internal state when the percent: 0 is not set.\r\n     */\n    function stopPreviousKeyframeAnimationAndRestore(el) {\n      // Stop previous keyframe animation.\n      el.stopAnimation('keyframe');\n      // Restore\n      el.attr(getStateToRestore(el));\n    }\n    function applyKeyframeAnimation(el, animationOpts, animatableModel) {\n      if (!animatableModel.isAnimationEnabled() || !animationOpts) {\n        return;\n      }\n      if (isArray(animationOpts)) {\n        each(animationOpts, function (singleAnimationOpts) {\n          applyKeyframeAnimation(el, singleAnimationOpts, animatableModel);\n        });\n        return;\n      }\n      var keyframes = animationOpts.keyframes;\n      var duration = animationOpts.duration;\n      if (animatableModel && duration == null) {\n        // Default to use duration of config.\n        // NOTE: animation config from payload will be ignored because they are mainly for transitions.\n        var config = getAnimationConfig('enter', animatableModel, 0);\n        duration = config && config.duration;\n      }\n      if (!keyframes || !duration) {\n        return;\n      }\n      var stateToRestore = getStateToRestore(el);\n      each(ELEMENT_ANIMATABLE_PROPS, function (targetPropName) {\n        if (targetPropName && !el[targetPropName]) {\n          return;\n        }\n        var animator;\n        var endFrameIsSet = false;\n        // Sort keyframes by percent.\n        keyframes.sort(function (a, b) {\n          return a.percent - b.percent;\n        });\n        each(keyframes, function (kf) {\n          // Stop current animation.\n          var animators = el.animators;\n          var kfValues = targetPropName ? kf[targetPropName] : kf;\n          if (\"development\" !== 'production') {\n            if (kf.percent >= 1) {\n              endFrameIsSet = true;\n            }\n          }\n          if (!kfValues) {\n            return;\n          }\n          var propKeys = keys(kfValues);\n          if (!targetPropName) {\n            // PENDING performance?\n            propKeys = filter(propKeys, function (key) {\n              return indexOf(KEYFRAME_EXCLUDE_KEYS, key) < 0;\n            });\n          }\n          if (!propKeys.length) {\n            return;\n          }\n          if (!animator) {\n            animator = el.animate(targetPropName, animationOpts.loop, true);\n            animator.scope = 'keyframe';\n          }\n          for (var i = 0; i < animators.length; i++) {\n            // Stop all other animation that is not keyframe.\n            if (animators[i] !== animator && animators[i].targetName === animator.targetName) {\n              animators[i].stopTracks(propKeys);\n            }\n          }\n          targetPropName && (stateToRestore[targetPropName] = stateToRestore[targetPropName] || {});\n          var savedTarget = targetPropName ? stateToRestore[targetPropName] : stateToRestore;\n          each(propKeys, function (key) {\n            // Save original value.\n            savedTarget[key] = ((targetPropName ? el[targetPropName] : el) || {})[key];\n          });\n          animator.whenWithKeys(duration * kf.percent, kfValues, propKeys, kf.easing);\n        });\n        if (!animator) {\n          return;\n        }\n        if (\"development\" !== 'production') {\n          if (!endFrameIsSet) {\n            warn('End frame with percent: 1 is missing in the keyframeAnimation.', true);\n          }\n        }\n        animator.delay(animationOpts.delay || 0).duration(duration).start(animationOpts.easing);\n      });\n    }\n\n    var EMPHASIS = 'emphasis';\n    var NORMAL = 'normal';\n    var BLUR = 'blur';\n    var SELECT = 'select';\n    var STATES = [NORMAL, EMPHASIS, BLUR, SELECT];\n    var PATH_ITEM_STYLE = {\n      normal: ['itemStyle'],\n      emphasis: [EMPHASIS, 'itemStyle'],\n      blur: [BLUR, 'itemStyle'],\n      select: [SELECT, 'itemStyle']\n    };\n    var PATH_LABEL = {\n      normal: ['label'],\n      emphasis: [EMPHASIS, 'label'],\n      blur: [BLUR, 'label'],\n      select: [SELECT, 'label']\n    };\n    var DEFAULT_TRANSITION = ['x', 'y'];\n    // Use prefix to avoid index to be the same as el.name,\n    // which will cause weird update animation.\n    var GROUP_DIFF_PREFIX = 'e\\0\\0';\n    var attachedTxInfoTmp = {\n      normal: {},\n      emphasis: {},\n      blur: {},\n      select: {}\n    };\n    /**\r\n     * To reduce total package size of each coordinate systems, the modules `prepareCustom`\r\n     * of each coordinate systems are not required by each coordinate systems directly, but\r\n     * required by the module `custom`.\r\n     *\r\n     * prepareInfoForCustomSeries {Function}: optional\r\n     *     @return {Object} {coordSys: {...}, api: {\r\n     *         coord: function (data, clamp) {}, // return point in global.\r\n     *         size: function (dataSize, dataItem) {} // return size of each axis in coordSys.\r\n     *     }}\r\n     */\n    var prepareCustoms = {\n      cartesian2d: cartesianPrepareCustom,\n      geo: geoPrepareCustom,\n      single: singlePrepareCustom,\n      polar: polarPrepareCustom,\n      calendar: calendarPrepareCustom\n    };\n    function isPath$1(el) {\n      return el instanceof Path;\n    }\n    function isDisplayable(el) {\n      return el instanceof Displayable;\n    }\n    function copyElement(sourceEl, targetEl) {\n      targetEl.copyTransform(sourceEl);\n      if (isDisplayable(targetEl) && isDisplayable(sourceEl)) {\n        targetEl.setStyle(sourceEl.style);\n        targetEl.z = sourceEl.z;\n        targetEl.z2 = sourceEl.z2;\n        targetEl.zlevel = sourceEl.zlevel;\n        targetEl.invisible = sourceEl.invisible;\n        targetEl.ignore = sourceEl.ignore;\n        if (isPath$1(targetEl) && isPath$1(sourceEl)) {\n          targetEl.setShape(sourceEl.shape);\n        }\n      }\n    }\n    var CustomChartView = /** @class */function (_super) {\n      __extends(CustomChartView, _super);\n      function CustomChartView() {\n        var _this = _super !== null && _super.apply(this, arguments) || this;\n        _this.type = CustomChartView.type;\n        return _this;\n      }\n      CustomChartView.prototype.render = function (customSeries, ecModel, api, payload) {\n        // Clear previously rendered progressive elements.\n        this._progressiveEls = null;\n        var oldData = this._data;\n        var data = customSeries.getData();\n        var group = this.group;\n        var renderItem = makeRenderItem(customSeries, data, ecModel, api);\n        if (!oldData) {\n          // Previous render is incremental render or first render.\n          // Needs remove the incremental rendered elements.\n          group.removeAll();\n        }\n        data.diff(oldData).add(function (newIdx) {\n          createOrUpdateItem(api, null, newIdx, renderItem(newIdx, payload), customSeries, group, data);\n        }).remove(function (oldIdx) {\n          var el = oldData.getItemGraphicEl(oldIdx);\n          el && applyLeaveTransition(el, customInnerStore(el).option, customSeries);\n        }).update(function (newIdx, oldIdx) {\n          var oldEl = oldData.getItemGraphicEl(oldIdx);\n          createOrUpdateItem(api, oldEl, newIdx, renderItem(newIdx, payload), customSeries, group, data);\n        }).execute();\n        // Do clipping\n        var clipPath = customSeries.get('clip', true) ? createClipPath(customSeries.coordinateSystem, false, customSeries) : null;\n        if (clipPath) {\n          group.setClipPath(clipPath);\n        } else {\n          group.removeClipPath();\n        }\n        this._data = data;\n      };\n      CustomChartView.prototype.incrementalPrepareRender = function (customSeries, ecModel, api) {\n        this.group.removeAll();\n        this._data = null;\n      };\n      CustomChartView.prototype.incrementalRender = function (params, customSeries, ecModel, api, payload) {\n        var data = customSeries.getData();\n        var renderItem = makeRenderItem(customSeries, data, ecModel, api);\n        var progressiveEls = this._progressiveEls = [];\n        function setIncrementalAndHoverLayer(el) {\n          if (!el.isGroup) {\n            el.incremental = true;\n            el.ensureState('emphasis').hoverLayer = true;\n          }\n        }\n        for (var idx = params.start; idx < params.end; idx++) {\n          var el = createOrUpdateItem(null, null, idx, renderItem(idx, payload), customSeries, this.group, data);\n          if (el) {\n            el.traverse(setIncrementalAndHoverLayer);\n            progressiveEls.push(el);\n          }\n        }\n      };\n      CustomChartView.prototype.eachRendered = function (cb) {\n        traverseElements(this._progressiveEls || this.group, cb);\n      };\n      CustomChartView.prototype.filterForExposedEvent = function (eventType, query, targetEl, packedEvent) {\n        var elementName = query.element;\n        if (elementName == null || targetEl.name === elementName) {\n          return true;\n        }\n        // Enable to give a name on a group made by `renderItem`, and listen\n        // events that are triggered by its descendents.\n        while ((targetEl = targetEl.__hostTarget || targetEl.parent) && targetEl !== this.group) {\n          if (targetEl.name === elementName) {\n            return true;\n          }\n        }\n        return false;\n      };\n      CustomChartView.type = 'custom';\n      return CustomChartView;\n    }(ChartView);\n    function createEl(elOption) {\n      var graphicType = elOption.type;\n      var el;\n      // Those graphic elements are not shapes. They should not be\n      // overwritten by users, so do them first.\n      if (graphicType === 'path') {\n        var shape = elOption.shape;\n        // Using pathRect brings convenience to users sacle svg path.\n        var pathRect = shape.width != null && shape.height != null ? {\n          x: shape.x || 0,\n          y: shape.y || 0,\n          width: shape.width,\n          height: shape.height\n        } : null;\n        var pathData = getPathData(shape);\n        // Path is also used for icon, so layout 'center' by default.\n        el = makePath(pathData, null, pathRect, shape.layout || 'center');\n        customInnerStore(el).customPathData = pathData;\n      } else if (graphicType === 'image') {\n        el = new ZRImage({});\n        customInnerStore(el).customImagePath = elOption.style.image;\n      } else if (graphicType === 'text') {\n        el = new ZRText({});\n        // customInnerStore(el).customText = (elOption.style as TextStyleProps).text;\n      } else if (graphicType === 'group') {\n        el = new Group();\n      } else if (graphicType === 'compoundPath') {\n        throw new Error('\"compoundPath\" is not supported yet.');\n      } else {\n        var Clz = getShapeClass(graphicType);\n        if (!Clz) {\n          var errMsg = '';\n          if (\"development\" !== 'production') {\n            errMsg = 'graphic type \"' + graphicType + '\" can not be found.';\n          }\n          throwError(errMsg);\n        }\n        el = new Clz();\n      }\n      customInnerStore(el).customGraphicType = graphicType;\n      el.name = elOption.name;\n      // Compat ec4: the default z2 lift is 1. If changing the number,\n      // some cases probably be broken: hierarchy layout along z, like circle packing,\n      // where emphasis only intending to modify color/border rather than lift z2.\n      el.z2EmphasisLift = 1;\n      el.z2SelectLift = 1;\n      return el;\n    }\n    function updateElNormal(\n    // Can be null/undefined\n    api, el, dataIndex, elOption, attachedTxInfo, seriesModel, isInit) {\n      // Stop and restore before update any other attributes.\n      stopPreviousKeyframeAnimationAndRestore(el);\n      var txCfgOpt = attachedTxInfo && attachedTxInfo.normal.cfg;\n      if (txCfgOpt) {\n        // PENDING: whether use user object directly rather than clone?\n        // TODO:5.0 textConfig transition animation?\n        el.setTextConfig(txCfgOpt);\n      }\n      // Default transition ['x', 'y']\n      if (elOption && elOption.transition == null) {\n        elOption.transition = DEFAULT_TRANSITION;\n      }\n      // Do some normalization on style.\n      var styleOpt = elOption && elOption.style;\n      if (styleOpt) {\n        if (el.type === 'text') {\n          var textOptionStyle = styleOpt;\n          // Compatible with ec4: if `textFill` or `textStroke` exists use them.\n          hasOwn(textOptionStyle, 'textFill') && (textOptionStyle.fill = textOptionStyle.textFill);\n          hasOwn(textOptionStyle, 'textStroke') && (textOptionStyle.stroke = textOptionStyle.textStroke);\n        }\n        var decalPattern = void 0;\n        var decalObj = isPath$1(el) ? styleOpt.decal : null;\n        if (api && decalObj) {\n          decalObj.dirty = true;\n          decalPattern = createOrUpdatePatternFromDecal(decalObj, api);\n        }\n        // Always overwrite in case user specify this prop.\n        styleOpt.__decalPattern = decalPattern;\n      }\n      if (isDisplayable(el)) {\n        if (styleOpt) {\n          var decalPattern = styleOpt.__decalPattern;\n          if (decalPattern) {\n            styleOpt.decal = decalPattern;\n          }\n        }\n      }\n      applyUpdateTransition(el, elOption, seriesModel, {\n        dataIndex: dataIndex,\n        isInit: isInit,\n        clearStyle: true\n      });\n      applyKeyframeAnimation(el, elOption.keyframeAnimation, seriesModel);\n    }\n    function updateElOnState(state, el, elStateOpt, styleOpt, attachedTxInfo) {\n      var elDisplayable = el.isGroup ? null : el;\n      var txCfgOpt = attachedTxInfo && attachedTxInfo[state].cfg;\n      // PENDING:5.0 support customize scale change and transition animation?\n      if (elDisplayable) {\n        // By default support auto lift color when hover whether `emphasis` specified.\n        var stateObj = elDisplayable.ensureState(state);\n        if (styleOpt === false) {\n          var existingEmphasisState = elDisplayable.getState(state);\n          if (existingEmphasisState) {\n            existingEmphasisState.style = null;\n          }\n        } else {\n          // style is needed to enable default emphasis.\n          stateObj.style = styleOpt || null;\n        }\n        // If `elOption.styleEmphasis` or `elOption.emphasis.style` is `false`,\n        // remove hover style.\n        // If `elOption.textConfig` or `elOption.emphasis.textConfig` is null/undefined, it does not\n        // make sense. So for simplicity, we do not ditinguish `hasOwnProperty` and null/undefined.\n        if (txCfgOpt) {\n          stateObj.textConfig = txCfgOpt;\n        }\n        setDefaultStateProxy(elDisplayable);\n      }\n    }\n    function updateZ$1(el, elOption, seriesModel) {\n      // Group not support textContent and not support z yet.\n      if (el.isGroup) {\n        return;\n      }\n      var elDisplayable = el;\n      var currentZ = seriesModel.currentZ;\n      var currentZLevel = seriesModel.currentZLevel;\n      // Always erase.\n      elDisplayable.z = currentZ;\n      elDisplayable.zlevel = currentZLevel;\n      // z2 must not be null/undefined, otherwise sort error may occur.\n      var optZ2 = elOption.z2;\n      optZ2 != null && (elDisplayable.z2 = optZ2 || 0);\n      for (var i = 0; i < STATES.length; i++) {\n        updateZForEachState(elDisplayable, elOption, STATES[i]);\n      }\n    }\n    function updateZForEachState(elDisplayable, elOption, state) {\n      var isNormal = state === NORMAL;\n      var elStateOpt = isNormal ? elOption : retrieveStateOption(elOption, state);\n      var optZ2 = elStateOpt ? elStateOpt.z2 : null;\n      var stateObj;\n      if (optZ2 != null) {\n        // Do not `ensureState` until required.\n        stateObj = isNormal ? elDisplayable : elDisplayable.ensureState(state);\n        stateObj.z2 = optZ2 || 0;\n      }\n    }\n    function makeRenderItem(customSeries, data, ecModel, api) {\n      var renderItem = customSeries.get('renderItem');\n      var coordSys = customSeries.coordinateSystem;\n      var prepareResult = {};\n      if (coordSys) {\n        if (\"development\" !== 'production') {\n          assert(renderItem, 'series.render is required.');\n          assert(coordSys.prepareCustoms || prepareCustoms[coordSys.type], 'This coordSys does not support custom series.');\n        }\n        // `coordSys.prepareCustoms` is used for external coord sys like bmap.\n        prepareResult = coordSys.prepareCustoms ? coordSys.prepareCustoms(coordSys) : prepareCustoms[coordSys.type](coordSys);\n      }\n      var userAPI = defaults({\n        getWidth: api.getWidth,\n        getHeight: api.getHeight,\n        getZr: api.getZr,\n        getDevicePixelRatio: api.getDevicePixelRatio,\n        value: value,\n        style: style,\n        ordinalRawValue: ordinalRawValue,\n        styleEmphasis: styleEmphasis,\n        visual: visual,\n        barLayout: barLayout,\n        currentSeriesIndices: currentSeriesIndices,\n        font: font\n      }, prepareResult.api || {});\n      var userParams = {\n        // The life cycle of context: current round of rendering.\n        // The global life cycle is probably not necessary, because\n        // user can store global status by themselves.\n        context: {},\n        seriesId: customSeries.id,\n        seriesName: customSeries.name,\n        seriesIndex: customSeries.seriesIndex,\n        coordSys: prepareResult.coordSys,\n        dataInsideLength: data.count(),\n        encode: wrapEncodeDef(customSeries.getData())\n      };\n      // If someday intending to refactor them to a class, should consider do not\n      // break change: currently these attribute member are encapsulated in a closure\n      // so that do not need to force user to call these method with a scope.\n      // Do not support call `api` asynchronously without dataIndexInside input.\n      var currDataIndexInside;\n      var currItemModel;\n      var currItemStyleModels = {};\n      var currLabelModels = {};\n      var seriesItemStyleModels = {};\n      var seriesLabelModels = {};\n      for (var i = 0; i < STATES.length; i++) {\n        var stateName = STATES[i];\n        seriesItemStyleModels[stateName] = customSeries.getModel(PATH_ITEM_STYLE[stateName]);\n        seriesLabelModels[stateName] = customSeries.getModel(PATH_LABEL[stateName]);\n      }\n      function getItemModel(dataIndexInside) {\n        return dataIndexInside === currDataIndexInside ? currItemModel || (currItemModel = data.getItemModel(dataIndexInside)) : data.getItemModel(dataIndexInside);\n      }\n      function getItemStyleModel(dataIndexInside, state) {\n        return !data.hasItemOption ? seriesItemStyleModels[state] : dataIndexInside === currDataIndexInside ? currItemStyleModels[state] || (currItemStyleModels[state] = getItemModel(dataIndexInside).getModel(PATH_ITEM_STYLE[state])) : getItemModel(dataIndexInside).getModel(PATH_ITEM_STYLE[state]);\n      }\n      function getLabelModel(dataIndexInside, state) {\n        return !data.hasItemOption ? seriesLabelModels[state] : dataIndexInside === currDataIndexInside ? currLabelModels[state] || (currLabelModels[state] = getItemModel(dataIndexInside).getModel(PATH_LABEL[state])) : getItemModel(dataIndexInside).getModel(PATH_LABEL[state]);\n      }\n      return function (dataIndexInside, payload) {\n        currDataIndexInside = dataIndexInside;\n        currItemModel = null;\n        currItemStyleModels = {};\n        currLabelModels = {};\n        return renderItem && renderItem(defaults({\n          dataIndexInside: dataIndexInside,\n          dataIndex: data.getRawIndex(dataIndexInside),\n          // Can be used for optimization when zoom or roam.\n          actionType: payload ? payload.type : null\n        }, userParams), userAPI);\n      };\n      /**\r\n       * @public\r\n       * @param dim by default 0.\r\n       * @param dataIndexInside by default `currDataIndexInside`.\r\n       */\n      function value(dim, dataIndexInside) {\n        dataIndexInside == null && (dataIndexInside = currDataIndexInside);\n        return data.getStore().get(data.getDimensionIndex(dim || 0), dataIndexInside);\n      }\n      /**\r\n       * @public\r\n       * @param dim by default 0.\r\n       * @param dataIndexInside by default `currDataIndexInside`.\r\n       */\n      function ordinalRawValue(dim, dataIndexInside) {\n        dataIndexInside == null && (dataIndexInside = currDataIndexInside);\n        dim = dim || 0;\n        var dimInfo = data.getDimensionInfo(dim);\n        if (!dimInfo) {\n          var dimIndex = data.getDimensionIndex(dim);\n          return dimIndex >= 0 ? data.getStore().get(dimIndex, dataIndexInside) : undefined;\n        }\n        var val = data.get(dimInfo.name, dataIndexInside);\n        var ordinalMeta = dimInfo && dimInfo.ordinalMeta;\n        return ordinalMeta ? ordinalMeta.categories[val] : val;\n      }\n      /**\r\n       * @deprecated The original intention of `api.style` is enable to set itemStyle\r\n       * like other series. But it is not necessary and not easy to give a strict definition\r\n       * of what it returns. And since echarts5 it needs to be make compat work. So\r\n       * deprecates it since echarts5.\r\n       *\r\n       * By default, `visual` is applied to style (to support visualMap).\r\n       * `visual.color` is applied at `fill`. If user want apply visual.color on `stroke`,\r\n       * it can be implemented as:\r\n       * `api.style({stroke: api.visual('color'), fill: null})`;\r\n       *\r\n       * [Compat]: since ec5, RectText has been separated from its hosts el.\r\n       * so `api.style()` will only return the style from `itemStyle` but not handle `label`\r\n       * any more. But `series.label` config is never published in doc.\r\n       * We still compat it in `api.style()`. But not encourage to use it and will still not\r\n       * to pulish it to doc.\r\n       * @public\r\n       * @param dataIndexInside by default `currDataIndexInside`.\r\n       */\n      function style(userProps, dataIndexInside) {\n        if (\"development\" !== 'production') {\n          warnDeprecated('api.style', 'Please write literal style directly instead.');\n        }\n        dataIndexInside == null && (dataIndexInside = currDataIndexInside);\n        var style = data.getItemVisual(dataIndexInside, 'style');\n        var visualColor = style && style.fill;\n        var opacity = style && style.opacity;\n        var itemStyle = getItemStyleModel(dataIndexInside, NORMAL).getItemStyle();\n        visualColor != null && (itemStyle.fill = visualColor);\n        opacity != null && (itemStyle.opacity = opacity);\n        var opt = {\n          inheritColor: isString(visualColor) ? visualColor : '#000'\n        };\n        var labelModel = getLabelModel(dataIndexInside, NORMAL);\n        // Now that the feature of \"auto adjust text fill/stroke\" has been migrated to zrender\n        // since ec5, we should set `isAttached` as `false` here and make compat in\n        // `convertToEC4StyleForCustomSerise`.\n        var textStyle = createTextStyle(labelModel, null, opt, false, true);\n        textStyle.text = labelModel.getShallow('show') ? retrieve2(customSeries.getFormattedLabel(dataIndexInside, NORMAL), getDefaultLabel(data, dataIndexInside)) : null;\n        var textConfig = createTextConfig(labelModel, opt, false);\n        preFetchFromExtra(userProps, itemStyle);\n        itemStyle = convertToEC4StyleForCustomSerise(itemStyle, textStyle, textConfig);\n        userProps && applyUserPropsAfter(itemStyle, userProps);\n        itemStyle.legacy = true;\n        return itemStyle;\n      }\n      /**\r\n       * @deprecated The reason see `api.style()`\r\n       * @public\r\n       * @param dataIndexInside by default `currDataIndexInside`.\r\n       */\n      function styleEmphasis(userProps, dataIndexInside) {\n        if (\"development\" !== 'production') {\n          warnDeprecated('api.styleEmphasis', 'Please write literal style directly instead.');\n        }\n        dataIndexInside == null && (dataIndexInside = currDataIndexInside);\n        var itemStyle = getItemStyleModel(dataIndexInside, EMPHASIS).getItemStyle();\n        var labelModel = getLabelModel(dataIndexInside, EMPHASIS);\n        var textStyle = createTextStyle(labelModel, null, null, true, true);\n        textStyle.text = labelModel.getShallow('show') ? retrieve3(customSeries.getFormattedLabel(dataIndexInside, EMPHASIS), customSeries.getFormattedLabel(dataIndexInside, NORMAL), getDefaultLabel(data, dataIndexInside)) : null;\n        var textConfig = createTextConfig(labelModel, null, true);\n        preFetchFromExtra(userProps, itemStyle);\n        itemStyle = convertToEC4StyleForCustomSerise(itemStyle, textStyle, textConfig);\n        userProps && applyUserPropsAfter(itemStyle, userProps);\n        itemStyle.legacy = true;\n        return itemStyle;\n      }\n      function applyUserPropsAfter(itemStyle, extra) {\n        for (var key in extra) {\n          if (hasOwn(extra, key)) {\n            itemStyle[key] = extra[key];\n          }\n        }\n      }\n      function preFetchFromExtra(extra, itemStyle) {\n        // A trick to retrieve those props firstly, which are used to\n        // apply auto inside fill/stroke in `convertToEC4StyleForCustomSerise`.\n        // (It's not reasonable but only for a degree of compat)\n        if (extra) {\n          extra.textFill && (itemStyle.textFill = extra.textFill);\n          extra.textPosition && (itemStyle.textPosition = extra.textPosition);\n        }\n      }\n      /**\r\n       * @public\r\n       * @param dataIndexInside by default `currDataIndexInside`.\r\n       */\n      function visual(visualType, dataIndexInside) {\n        dataIndexInside == null && (dataIndexInside = currDataIndexInside);\n        if (hasOwn(STYLE_VISUAL_TYPE, visualType)) {\n          var style_1 = data.getItemVisual(dataIndexInside, 'style');\n          return style_1 ? style_1[STYLE_VISUAL_TYPE[visualType]] : null;\n        }\n        // Only support these visuals. Other visual might be inner tricky\n        // for performance (like `style`), do not expose to users.\n        if (hasOwn(NON_STYLE_VISUAL_PROPS, visualType)) {\n          return data.getItemVisual(dataIndexInside, visualType);\n        }\n      }\n      /**\r\n       * @public\r\n       * @return If not support, return undefined.\r\n       */\n      function barLayout(opt) {\n        if (coordSys.type === 'cartesian2d') {\n          var baseAxis = coordSys.getBaseAxis();\n          return getLayoutOnAxis(defaults({\n            axis: baseAxis\n          }, opt));\n        }\n      }\n      /**\r\n       * @public\r\n       */\n      function currentSeriesIndices() {\n        return ecModel.getCurrentSeriesIndices();\n      }\n      /**\r\n       * @public\r\n       * @return font string\r\n       */\n      function font(opt) {\n        return getFont(opt, ecModel);\n      }\n    }\n    function wrapEncodeDef(data) {\n      var encodeDef = {};\n      each(data.dimensions, function (dimName) {\n        var dimInfo = data.getDimensionInfo(dimName);\n        if (!dimInfo.isExtraCoord) {\n          var coordDim = dimInfo.coordDim;\n          var dataDims = encodeDef[coordDim] = encodeDef[coordDim] || [];\n          dataDims[dimInfo.coordDimIndex] = data.getDimensionIndex(dimName);\n        }\n      });\n      return encodeDef;\n    }\n    function createOrUpdateItem(api, existsEl, dataIndex, elOption, seriesModel, group, data) {\n      // [Rule]\n      // If `renderItem` returns `null`/`undefined`/`false`, remove the previous el if existing.\n      //     (It seems that violate the \"merge\" principle, but most of users probably intuitively\n      //     regard \"return;\" as \"show nothing element whatever\", so make a exception to meet the\n      //     most cases.)\n      // The rule or \"merge\" see [STRATEGY_MERGE].\n      // If `elOption` is `null`/`undefined`/`false` (when `renderItem` returns nothing).\n      if (!elOption) {\n        group.remove(existsEl);\n        return;\n      }\n      var el = doCreateOrUpdateEl(api, existsEl, dataIndex, elOption, seriesModel, group);\n      el && data.setItemGraphicEl(dataIndex, el);\n      el && toggleHoverEmphasis(el, elOption.focus, elOption.blurScope, elOption.emphasisDisabled);\n      return el;\n    }\n    function doCreateOrUpdateEl(api, existsEl, dataIndex, elOption, seriesModel, group) {\n      if (\"development\" !== 'production') {\n        assert(elOption, 'should not have an null/undefined element setting');\n      }\n      var toBeReplacedIdx = -1;\n      var oldEl = existsEl;\n      if (existsEl && doesElNeedRecreate(existsEl, elOption, seriesModel)\n      // || (\n      //     // PENDING: even in one-to-one mapping case, if el is marked as morph,\n      //     // do not sure whether the el will be mapped to another el with different\n      //     // hierarchy in Group tree. So always recreate el rather than reuse the el.\n      //     morphHelper && morphHelper.isOneToOneFrom(el)\n      // )\n      ) {\n        // Should keep at the original index, otherwise \"merge by index\" will be incorrect.\n        toBeReplacedIdx = indexOf(group.childrenRef(), existsEl);\n        existsEl = null;\n      }\n      var isInit = !existsEl;\n      var el = existsEl;\n      if (!el) {\n        el = createEl(elOption);\n        if (oldEl) {\n          copyElement(oldEl, el);\n        }\n      } else {\n        // FIMXE:NEXT unified clearState?\n        // If in some case the performance issue arised, consider\n        // do not clearState but update cached normal state directly.\n        el.clearStates();\n      }\n      // Need to set morph: false explictly to disable automatically morphing.\n      if (elOption.morph === false) {\n        el.disableMorphing = true;\n      } else if (el.disableMorphing) {\n        el.disableMorphing = false;\n      }\n      attachedTxInfoTmp.normal.cfg = attachedTxInfoTmp.normal.conOpt = attachedTxInfoTmp.emphasis.cfg = attachedTxInfoTmp.emphasis.conOpt = attachedTxInfoTmp.blur.cfg = attachedTxInfoTmp.blur.conOpt = attachedTxInfoTmp.select.cfg = attachedTxInfoTmp.select.conOpt = null;\n      attachedTxInfoTmp.isLegacy = false;\n      doCreateOrUpdateAttachedTx(el, dataIndex, elOption, seriesModel, isInit, attachedTxInfoTmp);\n      doCreateOrUpdateClipPath(el, dataIndex, elOption, seriesModel, isInit);\n      updateElNormal(api, el, dataIndex, elOption, attachedTxInfoTmp, seriesModel, isInit);\n      // `elOption.info` enables user to mount some info on\n      // elements and use them in event handlers.\n      // Update them only when user specified, otherwise, remain.\n      hasOwn(elOption, 'info') && (customInnerStore(el).info = elOption.info);\n      for (var i = 0; i < STATES.length; i++) {\n        var stateName = STATES[i];\n        if (stateName !== NORMAL) {\n          var otherStateOpt = retrieveStateOption(elOption, stateName);\n          var otherStyleOpt = retrieveStyleOptionOnState(elOption, otherStateOpt, stateName);\n          updateElOnState(stateName, el, otherStateOpt, otherStyleOpt, attachedTxInfoTmp);\n        }\n      }\n      updateZ$1(el, elOption, seriesModel);\n      if (elOption.type === 'group') {\n        mergeChildren(api, el, dataIndex, elOption, seriesModel);\n      }\n      if (toBeReplacedIdx >= 0) {\n        group.replaceAt(el, toBeReplacedIdx);\n      } else {\n        group.add(el);\n      }\n      return el;\n    }\n    // `el` must not be null/undefined.\n    function doesElNeedRecreate(el, elOption, seriesModel) {\n      var elInner = customInnerStore(el);\n      var elOptionType = elOption.type;\n      var elOptionShape = elOption.shape;\n      var elOptionStyle = elOption.style;\n      return (\n        // Always create new if universal transition is enabled.\n        // Because we do transition after render. It needs to know what old element is. Replacement will loose it.\n        seriesModel.isUniversalTransitionEnabled()\n        // If `elOptionType` is `null`, follow the merge principle.\n        || elOptionType != null && elOptionType !== elInner.customGraphicType || elOptionType === 'path' && hasOwnPathData(elOptionShape) && getPathData(elOptionShape) !== elInner.customPathData || elOptionType === 'image' && hasOwn(elOptionStyle, 'image') && elOptionStyle.image !== elInner.customImagePath\n        // // FIXME test and remove this restriction?\n        // || (elOptionType === 'text'\n        //     && hasOwn(elOptionStyle, 'text')\n        //     && (elOptionStyle as TextStyleProps).text !== elInner.customText\n        // )\n      );\n    }\n    function doCreateOrUpdateClipPath(el, dataIndex, elOption, seriesModel, isInit) {\n      // Based on the \"merge\" principle, if no clipPath provided,\n      // do nothing. The exists clip will be totally removed only if\n      // `el.clipPath` is `false`. Otherwise it will be merged/replaced.\n      var clipPathOpt = elOption.clipPath;\n      if (clipPathOpt === false) {\n        if (el && el.getClipPath()) {\n          el.removeClipPath();\n        }\n      } else if (clipPathOpt) {\n        var clipPath = el.getClipPath();\n        if (clipPath && doesElNeedRecreate(clipPath, clipPathOpt, seriesModel)) {\n          clipPath = null;\n        }\n        if (!clipPath) {\n          clipPath = createEl(clipPathOpt);\n          if (\"development\" !== 'production') {\n            assert(isPath$1(clipPath), 'Only any type of `path` can be used in `clipPath`, rather than ' + clipPath.type + '.');\n          }\n          el.setClipPath(clipPath);\n        }\n        updateElNormal(null, clipPath, dataIndex, clipPathOpt, null, seriesModel, isInit);\n      }\n      // If not define `clipPath` in option, do nothing unnecessary.\n    }\n    function doCreateOrUpdateAttachedTx(el, dataIndex, elOption, seriesModel, isInit, attachedTxInfo) {\n      // Group does not support textContent temporarily until necessary.\n      if (el.isGroup) {\n        return;\n      }\n      // Normal must be called before emphasis, for `isLegacy` detection.\n      processTxInfo(elOption, null, attachedTxInfo);\n      processTxInfo(elOption, EMPHASIS, attachedTxInfo);\n      // If `elOption.textConfig` or `elOption.textContent` is null/undefined, it does not make sense.\n      // So for simplicity, if \"elOption hasOwnProperty of them but be null/undefined\", we do not\n      // trade them as set to null to el.\n      // Especially:\n      // `elOption.textContent: false` means remove textContent.\n      // `elOption.textContent.emphasis.style: false` means remove the style from emphasis state.\n      var txConOptNormal = attachedTxInfo.normal.conOpt;\n      var txConOptEmphasis = attachedTxInfo.emphasis.conOpt;\n      var txConOptBlur = attachedTxInfo.blur.conOpt;\n      var txConOptSelect = attachedTxInfo.select.conOpt;\n      if (txConOptNormal != null || txConOptEmphasis != null || txConOptSelect != null || txConOptBlur != null) {\n        var textContent = el.getTextContent();\n        if (txConOptNormal === false) {\n          textContent && el.removeTextContent();\n        } else {\n          txConOptNormal = attachedTxInfo.normal.conOpt = txConOptNormal || {\n            type: 'text'\n          };\n          if (!textContent) {\n            textContent = createEl(txConOptNormal);\n            el.setTextContent(textContent);\n          } else {\n            // If in some case the performance issue arised, consider\n            // do not clearState but update cached normal state directly.\n            textContent.clearStates();\n          }\n          updateElNormal(null, textContent, dataIndex, txConOptNormal, null, seriesModel, isInit);\n          var txConStlOptNormal = txConOptNormal && txConOptNormal.style;\n          for (var i = 0; i < STATES.length; i++) {\n            var stateName = STATES[i];\n            if (stateName !== NORMAL) {\n              var txConOptOtherState = attachedTxInfo[stateName].conOpt;\n              updateElOnState(stateName, textContent, txConOptOtherState, retrieveStyleOptionOnState(txConOptNormal, txConOptOtherState, stateName), null);\n            }\n          }\n          txConStlOptNormal ? textContent.dirty() : textContent.markRedraw();\n        }\n      }\n    }\n    function processTxInfo(elOption, state, attachedTxInfo) {\n      var stateOpt = !state ? elOption : retrieveStateOption(elOption, state);\n      var styleOpt = !state ? elOption.style : retrieveStyleOptionOnState(elOption, stateOpt, EMPHASIS);\n      var elType = elOption.type;\n      var txCfg = stateOpt ? stateOpt.textConfig : null;\n      var txConOptNormal = elOption.textContent;\n      var txConOpt = !txConOptNormal ? null : !state ? txConOptNormal : retrieveStateOption(txConOptNormal, state);\n      if (styleOpt && (\n      // Because emphasis style has little info to detect legacy,\n      // if normal is legacy, emphasis is trade as legacy.\n      attachedTxInfo.isLegacy || isEC4CompatibleStyle(styleOpt, elType, !!txCfg, !!txConOpt))) {\n        attachedTxInfo.isLegacy = true;\n        var convertResult = convertFromEC4CompatibleStyle(styleOpt, elType, !state);\n        // Explicitly specified `textConfig` and `textContent` has higher priority than\n        // the ones generated by legacy style. Otherwise if users use them and `api.style`\n        // at the same time, they not both work and hardly to known why.\n        if (!txCfg && convertResult.textConfig) {\n          txCfg = convertResult.textConfig;\n        }\n        if (!txConOpt && convertResult.textContent) {\n          txConOpt = convertResult.textContent;\n        }\n      }\n      if (!state && txConOpt) {\n        var txConOptNormal_1 = txConOpt;\n        // `textContent: {type: 'text'}`, the \"type\" is easy to be missing. So we tolerate it.\n        !txConOptNormal_1.type && (txConOptNormal_1.type = 'text');\n        if (\"development\" !== 'production') {\n          // Do not tolerate incorrcet type for forward compat.\n          assert(txConOptNormal_1.type === 'text', 'textContent.type must be \"text\"');\n        }\n      }\n      var info = !state ? attachedTxInfo.normal : attachedTxInfo[state];\n      info.cfg = txCfg;\n      info.conOpt = txConOpt;\n    }\n    function retrieveStateOption(elOption, state) {\n      return !state ? elOption : elOption ? elOption[state] : null;\n    }\n    function retrieveStyleOptionOnState(stateOptionNormal, stateOption, state) {\n      var style = stateOption && stateOption.style;\n      if (style == null && state === EMPHASIS && stateOptionNormal) {\n        style = stateOptionNormal.styleEmphasis;\n      }\n      return style;\n    }\n    // Usage:\n    // (1) By default, `elOption.$mergeChildren` is `'byIndex'`, which indicates\n    //     that the existing children will not be removed, and enables the feature\n    //     that update some of the props of some of the children simply by construct\n    //     the returned children of `renderItem` like:\n    //     `var children = group.children = []; children[3] = {opacity: 0.5};`\n    // (2) If `elOption.$mergeChildren` is `'byName'`, add/update/remove children\n    //     by child.name. But that might be lower performance.\n    // (3) If `elOption.$mergeChildren` is `false`, the existing children will be\n    //     replaced totally.\n    // (4) If `!elOption.children`, following the \"merge\" principle, nothing will\n    //     happen.\n    // (5) If `elOption.$mergeChildren` is not `false` neither `'byName'` and the\n    //     `el` is a group, and if any of the new child is null, it means to remove\n    //     the element at the same index, if exists. On the other hand, if the new\n    //     child is and empty object `{}`, it means to keep the element not changed.\n    //\n    // For implementation simpleness, do not provide a direct way to remove single\n    // child (otherwise the total indices of the children array have to be modified).\n    // User can remove a single child by setting its `ignore` to `true`.\n    function mergeChildren(api, el, dataIndex, elOption, seriesModel) {\n      var newChildren = elOption.children;\n      var newLen = newChildren ? newChildren.length : 0;\n      var mergeChildren = elOption.$mergeChildren;\n      // `diffChildrenByName` has been deprecated.\n      var byName = mergeChildren === 'byName' || elOption.diffChildrenByName;\n      var notMerge = mergeChildren === false;\n      // For better performance on roam update, only enter if necessary.\n      if (!newLen && !byName && !notMerge) {\n        return;\n      }\n      if (byName) {\n        diffGroupChildren({\n          api: api,\n          oldChildren: el.children() || [],\n          newChildren: newChildren || [],\n          dataIndex: dataIndex,\n          seriesModel: seriesModel,\n          group: el\n        });\n        return;\n      }\n      notMerge && el.removeAll();\n      // Mapping children of a group simply by index, which\n      // might be better performance.\n      var index = 0;\n      for (; index < newLen; index++) {\n        var newChild = newChildren[index];\n        var oldChild = el.childAt(index);\n        if (newChild) {\n          if (newChild.ignore == null) {\n            // The old child is set to be ignored if null (see comments\n            // below). So we need to set ignore to be false back.\n            newChild.ignore = false;\n          }\n          doCreateOrUpdateEl(api, oldChild, dataIndex, newChild, seriesModel, el);\n        } else {\n          if (\"development\" !== 'production') {\n            assert(oldChild, 'renderItem should not return a group containing elements' + ' as null/undefined/{} if they do not exist before.');\n          }\n          // If the new element option is null, it means to remove the old\n          // element. But we cannot really remove the element from the group\n          // directly, because the element order may not be stable when this\n          // element is added back. So we set the element to be ignored.\n          oldChild.ignore = true;\n        }\n      }\n      for (var i = el.childCount() - 1; i >= index; i--) {\n        var child = el.childAt(i);\n        removeChildFromGroup(el, child, seriesModel);\n      }\n    }\n    function removeChildFromGroup(group, child, seriesModel) {\n      // Do not support leave elements that are not mentioned in the latest\n      // `renderItem` return. Otherwise users may not have a clear and simple\n      // concept that how to control all of the elements.\n      child && applyLeaveTransition(child, customInnerStore(group).option, seriesModel);\n    }\n    function diffGroupChildren(context) {\n      new DataDiffer(context.oldChildren, context.newChildren, getKey, getKey, context).add(processAddUpdate).update(processAddUpdate).remove(processRemove).execute();\n    }\n    function getKey(item, idx) {\n      var name = item && item.name;\n      return name != null ? name : GROUP_DIFF_PREFIX + idx;\n    }\n    function processAddUpdate(newIndex, oldIndex) {\n      var context = this.context;\n      var childOption = newIndex != null ? context.newChildren[newIndex] : null;\n      var child = oldIndex != null ? context.oldChildren[oldIndex] : null;\n      doCreateOrUpdateEl(context.api, child, context.dataIndex, childOption, context.seriesModel, context.group);\n    }\n    function processRemove(oldIndex) {\n      var context = this.context;\n      var child = context.oldChildren[oldIndex];\n      child && applyLeaveTransition(child, customInnerStore(child).option, context.seriesModel);\n    }\n    /**\r\n     * @return SVG Path data.\r\n     */\n    function getPathData(shape) {\n      // \"d\" follows the SVG convention.\n      return shape && (shape.pathData || shape.d);\n    }\n    function hasOwnPathData(shape) {\n      return shape && (hasOwn(shape, 'pathData') || hasOwn(shape, 'd'));\n    }\n\n    function install$r(registers) {\n      registers.registerChartView(CustomChartView);\n      registers.registerSeriesModel(CustomSeriesModel);\n    }\n\n    var inner$a = makeInner();\n    var clone$3 = clone;\n    var bind$1 = bind;\n    /**\r\n     * Base axis pointer class in 2D.\r\n     */\n    var BaseAxisPointer = /** @class */function () {\n      function BaseAxisPointer() {\n        this._dragging = false;\n        /**\r\n         * In px, arbitrary value. Do not set too small,\r\n         * no animation is ok for most cases.\r\n         */\n        this.animationThreshold = 15;\n      }\n      /**\r\n       * @implement\r\n       */\n      BaseAxisPointer.prototype.render = function (axisModel, axisPointerModel, api, forceRender) {\n        var value = axisPointerModel.get('value');\n        var status = axisPointerModel.get('status');\n        // Bind them to `this`, not in closure, otherwise they will not\n        // be replaced when user calling setOption in not merge mode.\n        this._axisModel = axisModel;\n        this._axisPointerModel = axisPointerModel;\n        this._api = api;\n        // Optimize: `render` will be called repeatedly during mouse move.\n        // So it is power consuming if performing `render` each time,\n        // especially on mobile device.\n        if (!forceRender && this._lastValue === value && this._lastStatus === status) {\n          return;\n        }\n        this._lastValue = value;\n        this._lastStatus = status;\n        var group = this._group;\n        var handle = this._handle;\n        if (!status || status === 'hide') {\n          // Do not clear here, for animation better.\n          group && group.hide();\n          handle && handle.hide();\n          return;\n        }\n        group && group.show();\n        handle && handle.show();\n        // Otherwise status is 'show'\n        var elOption = {};\n        this.makeElOption(elOption, value, axisModel, axisPointerModel, api);\n        // Enable change axis pointer type.\n        var graphicKey = elOption.graphicKey;\n        if (graphicKey !== this._lastGraphicKey) {\n          this.clear(api);\n        }\n        this._lastGraphicKey = graphicKey;\n        var moveAnimation = this._moveAnimation = this.determineAnimation(axisModel, axisPointerModel);\n        if (!group) {\n          group = this._group = new Group();\n          this.createPointerEl(group, elOption, axisModel, axisPointerModel);\n          this.createLabelEl(group, elOption, axisModel, axisPointerModel);\n          api.getZr().add(group);\n        } else {\n          var doUpdateProps = curry(updateProps$1, axisPointerModel, moveAnimation);\n          this.updatePointerEl(group, elOption, doUpdateProps);\n          this.updateLabelEl(group, elOption, doUpdateProps, axisPointerModel);\n        }\n        updateMandatoryProps(group, axisPointerModel, true);\n        this._renderHandle(value);\n      };\n      /**\r\n       * @implement\r\n       */\n      BaseAxisPointer.prototype.remove = function (api) {\n        this.clear(api);\n      };\n      /**\r\n       * @implement\r\n       */\n      BaseAxisPointer.prototype.dispose = function (api) {\n        this.clear(api);\n      };\n      /**\r\n       * @protected\r\n       */\n      BaseAxisPointer.prototype.determineAnimation = function (axisModel, axisPointerModel) {\n        var animation = axisPointerModel.get('animation');\n        var axis = axisModel.axis;\n        var isCategoryAxis = axis.type === 'category';\n        var useSnap = axisPointerModel.get('snap');\n        // Value axis without snap always do not snap.\n        if (!useSnap && !isCategoryAxis) {\n          return false;\n        }\n        if (animation === 'auto' || animation == null) {\n          var animationThreshold = this.animationThreshold;\n          if (isCategoryAxis && axis.getBandWidth() > animationThreshold) {\n            return true;\n          }\n          // It is important to auto animation when snap used. Consider if there is\n          // a dataZoom, animation will be disabled when too many points exist, while\n          // it will be enabled for better visual effect when little points exist.\n          if (useSnap) {\n            var seriesDataCount = getAxisInfo(axisModel).seriesDataCount;\n            var axisExtent = axis.getExtent();\n            // Approximate band width\n            return Math.abs(axisExtent[0] - axisExtent[1]) / seriesDataCount > animationThreshold;\n          }\n          return false;\n        }\n        return animation === true;\n      };\n      /**\r\n       * add {pointer, label, graphicKey} to elOption\r\n       * @protected\r\n       */\n      BaseAxisPointer.prototype.makeElOption = function (elOption, value, axisModel, axisPointerModel, api) {\n        // Should be implemenented by sub-class.\n      };\n      /**\r\n       * @protected\r\n       */\n      BaseAxisPointer.prototype.createPointerEl = function (group, elOption, axisModel, axisPointerModel) {\n        var pointerOption = elOption.pointer;\n        if (pointerOption) {\n          var pointerEl = inner$a(group).pointerEl = new graphic[pointerOption.type](clone$3(elOption.pointer));\n          group.add(pointerEl);\n        }\n      };\n      /**\r\n       * @protected\r\n       */\n      BaseAxisPointer.prototype.createLabelEl = function (group, elOption, axisModel, axisPointerModel) {\n        if (elOption.label) {\n          var labelEl = inner$a(group).labelEl = new ZRText(clone$3(elOption.label));\n          group.add(labelEl);\n          updateLabelShowHide(labelEl, axisPointerModel);\n        }\n      };\n      /**\r\n       * @protected\r\n       */\n      BaseAxisPointer.prototype.updatePointerEl = function (group, elOption, updateProps) {\n        var pointerEl = inner$a(group).pointerEl;\n        if (pointerEl && elOption.pointer) {\n          pointerEl.setStyle(elOption.pointer.style);\n          updateProps(pointerEl, {\n            shape: elOption.pointer.shape\n          });\n        }\n      };\n      /**\r\n       * @protected\r\n       */\n      BaseAxisPointer.prototype.updateLabelEl = function (group, elOption, updateProps, axisPointerModel) {\n        var labelEl = inner$a(group).labelEl;\n        if (labelEl) {\n          labelEl.setStyle(elOption.label.style);\n          updateProps(labelEl, {\n            // Consider text length change in vertical axis, animation should\n            // be used on shape, otherwise the effect will be weird.\n            // TODOTODO\n            // shape: elOption.label.shape,\n            x: elOption.label.x,\n            y: elOption.label.y\n          });\n          updateLabelShowHide(labelEl, axisPointerModel);\n        }\n      };\n      /**\r\n       * @private\r\n       */\n      BaseAxisPointer.prototype._renderHandle = function (value) {\n        if (this._dragging || !this.updateHandleTransform) {\n          return;\n        }\n        var axisPointerModel = this._axisPointerModel;\n        var zr = this._api.getZr();\n        var handle = this._handle;\n        var handleModel = axisPointerModel.getModel('handle');\n        var status = axisPointerModel.get('status');\n        if (!handleModel.get('show') || !status || status === 'hide') {\n          handle && zr.remove(handle);\n          this._handle = null;\n          return;\n        }\n        var isInit;\n        if (!this._handle) {\n          isInit = true;\n          handle = this._handle = createIcon(handleModel.get('icon'), {\n            cursor: 'move',\n            draggable: true,\n            onmousemove: function (e) {\n              // For mobile device, prevent screen slider on the button.\n              stop(e.event);\n            },\n            onmousedown: bind$1(this._onHandleDragMove, this, 0, 0),\n            drift: bind$1(this._onHandleDragMove, this),\n            ondragend: bind$1(this._onHandleDragEnd, this)\n          });\n          zr.add(handle);\n        }\n        updateMandatoryProps(handle, axisPointerModel, false);\n        // update style\n        handle.setStyle(handleModel.getItemStyle(null, ['color', 'borderColor', 'borderWidth', 'opacity', 'shadowColor', 'shadowBlur', 'shadowOffsetX', 'shadowOffsetY']));\n        // update position\n        var handleSize = handleModel.get('size');\n        if (!isArray(handleSize)) {\n          handleSize = [handleSize, handleSize];\n        }\n        handle.scaleX = handleSize[0] / 2;\n        handle.scaleY = handleSize[1] / 2;\n        createOrUpdate(this, '_doDispatchAxisPointer', handleModel.get('throttle') || 0, 'fixRate');\n        this._moveHandleToValue(value, isInit);\n      };\n      BaseAxisPointer.prototype._moveHandleToValue = function (value, isInit) {\n        updateProps$1(this._axisPointerModel, !isInit && this._moveAnimation, this._handle, getHandleTransProps(this.getHandleTransform(value, this._axisModel, this._axisPointerModel)));\n      };\n      BaseAxisPointer.prototype._onHandleDragMove = function (dx, dy) {\n        var handle = this._handle;\n        if (!handle) {\n          return;\n        }\n        this._dragging = true;\n        // Persistent for throttle.\n        var trans = this.updateHandleTransform(getHandleTransProps(handle), [dx, dy], this._axisModel, this._axisPointerModel);\n        this._payloadInfo = trans;\n        handle.stopAnimation();\n        handle.attr(getHandleTransProps(trans));\n        inner$a(handle).lastProp = null;\n        this._doDispatchAxisPointer();\n      };\n      /**\r\n       * Throttled method.\r\n       */\n      BaseAxisPointer.prototype._doDispatchAxisPointer = function () {\n        var handle = this._handle;\n        if (!handle) {\n          return;\n        }\n        var payloadInfo = this._payloadInfo;\n        var axisModel = this._axisModel;\n        this._api.dispatchAction({\n          type: 'updateAxisPointer',\n          x: payloadInfo.cursorPoint[0],\n          y: payloadInfo.cursorPoint[1],\n          tooltipOption: payloadInfo.tooltipOption,\n          axesInfo: [{\n            axisDim: axisModel.axis.dim,\n            axisIndex: axisModel.componentIndex\n          }]\n        });\n      };\n      BaseAxisPointer.prototype._onHandleDragEnd = function () {\n        this._dragging = false;\n        var handle = this._handle;\n        if (!handle) {\n          return;\n        }\n        var value = this._axisPointerModel.get('value');\n        // Consider snap or categroy axis, handle may be not consistent with\n        // axisPointer. So move handle to align the exact value position when\n        // drag ended.\n        this._moveHandleToValue(value);\n        // For the effect: tooltip will be shown when finger holding on handle\n        // button, and will be hidden after finger left handle button.\n        this._api.dispatchAction({\n          type: 'hideTip'\n        });\n      };\n      /**\r\n       * @private\r\n       */\n      BaseAxisPointer.prototype.clear = function (api) {\n        this._lastValue = null;\n        this._lastStatus = null;\n        var zr = api.getZr();\n        var group = this._group;\n        var handle = this._handle;\n        if (zr && group) {\n          this._lastGraphicKey = null;\n          group && zr.remove(group);\n          handle && zr.remove(handle);\n          this._group = null;\n          this._handle = null;\n          this._payloadInfo = null;\n        }\n        clear(this, '_doDispatchAxisPointer');\n      };\n      /**\r\n       * @protected\r\n       */\n      BaseAxisPointer.prototype.doClear = function () {\n        // Implemented by sub-class if necessary.\n      };\n      BaseAxisPointer.prototype.buildLabel = function (xy, wh, xDimIndex) {\n        xDimIndex = xDimIndex || 0;\n        return {\n          x: xy[xDimIndex],\n          y: xy[1 - xDimIndex],\n          width: wh[xDimIndex],\n          height: wh[1 - xDimIndex]\n        };\n      };\n      return BaseAxisPointer;\n    }();\n    function updateProps$1(animationModel, moveAnimation, el, props) {\n      // Animation optimize.\n      if (!propsEqual(inner$a(el).lastProp, props)) {\n        inner$a(el).lastProp = props;\n        moveAnimation ? updateProps(el, props, animationModel) : (el.stopAnimation(), el.attr(props));\n      }\n    }\n    function propsEqual(lastProps, newProps) {\n      if (isObject(lastProps) && isObject(newProps)) {\n        var equals_1 = true;\n        each(newProps, function (item, key) {\n          equals_1 = equals_1 && propsEqual(lastProps[key], item);\n        });\n        return !!equals_1;\n      } else {\n        return lastProps === newProps;\n      }\n    }\n    function updateLabelShowHide(labelEl, axisPointerModel) {\n      labelEl[axisPointerModel.get(['label', 'show']) ? 'show' : 'hide']();\n    }\n    function getHandleTransProps(trans) {\n      return {\n        x: trans.x || 0,\n        y: trans.y || 0,\n        rotation: trans.rotation || 0\n      };\n    }\n    function updateMandatoryProps(group, axisPointerModel, silent) {\n      var z = axisPointerModel.get('z');\n      var zlevel = axisPointerModel.get('zlevel');\n      group && group.traverse(function (el) {\n        if (el.type !== 'group') {\n          z != null && (el.z = z);\n          zlevel != null && (el.zlevel = zlevel);\n          el.silent = silent;\n        }\n      });\n    }\n\n    function buildElStyle(axisPointerModel) {\n      var axisPointerType = axisPointerModel.get('type');\n      var styleModel = axisPointerModel.getModel(axisPointerType + 'Style');\n      var style;\n      if (axisPointerType === 'line') {\n        style = styleModel.getLineStyle();\n        style.fill = null;\n      } else if (axisPointerType === 'shadow') {\n        style = styleModel.getAreaStyle();\n        style.stroke = null;\n      }\n      return style;\n    }\n    /**\r\n     * @param {Function} labelPos {align, verticalAlign, position}\r\n     */\n    function buildLabelElOption(elOption, axisModel, axisPointerModel, api, labelPos) {\n      var value = axisPointerModel.get('value');\n      var text = getValueLabel(value, axisModel.axis, axisModel.ecModel, axisPointerModel.get('seriesDataIndices'), {\n        precision: axisPointerModel.get(['label', 'precision']),\n        formatter: axisPointerModel.get(['label', 'formatter'])\n      });\n      var labelModel = axisPointerModel.getModel('label');\n      var paddings = normalizeCssArray$1(labelModel.get('padding') || 0);\n      var font = labelModel.getFont();\n      var textRect = getBoundingRect(text, font);\n      var position = labelPos.position;\n      var width = textRect.width + paddings[1] + paddings[3];\n      var height = textRect.height + paddings[0] + paddings[2];\n      // Adjust by align.\n      var align = labelPos.align;\n      align === 'right' && (position[0] -= width);\n      align === 'center' && (position[0] -= width / 2);\n      var verticalAlign = labelPos.verticalAlign;\n      verticalAlign === 'bottom' && (position[1] -= height);\n      verticalAlign === 'middle' && (position[1] -= height / 2);\n      // Not overflow ec container\n      confineInContainer(position, width, height, api);\n      var bgColor = labelModel.get('backgroundColor');\n      if (!bgColor || bgColor === 'auto') {\n        bgColor = axisModel.get(['axisLine', 'lineStyle', 'color']);\n      }\n      elOption.label = {\n        // shape: {x: 0, y: 0, width: width, height: height, r: labelModel.get('borderRadius')},\n        x: position[0],\n        y: position[1],\n        style: createTextStyle(labelModel, {\n          text: text,\n          font: font,\n          fill: labelModel.getTextColor(),\n          padding: paddings,\n          backgroundColor: bgColor\n        }),\n        // Label should be over axisPointer.\n        z2: 10\n      };\n    }\n    // Do not overflow ec container\n    function confineInContainer(position, width, height, api) {\n      var viewWidth = api.getWidth();\n      var viewHeight = api.getHeight();\n      position[0] = Math.min(position[0] + width, viewWidth) - width;\n      position[1] = Math.min(position[1] + height, viewHeight) - height;\n      position[0] = Math.max(position[0], 0);\n      position[1] = Math.max(position[1], 0);\n    }\n    function getValueLabel(value, axis, ecModel, seriesDataIndices, opt) {\n      value = axis.scale.parse(value);\n      var text = axis.scale.getLabel({\n        value: value\n      }, {\n        // If `precision` is set, width can be fixed (like '12.00500'), which\n        // helps to debounce when when moving label.\n        precision: opt.precision\n      });\n      var formatter = opt.formatter;\n      if (formatter) {\n        var params_1 = {\n          value: getAxisRawValue(axis, {\n            value: value\n          }),\n          axisDimension: axis.dim,\n          axisIndex: axis.index,\n          seriesData: []\n        };\n        each(seriesDataIndices, function (idxItem) {\n          var series = ecModel.getSeriesByIndex(idxItem.seriesIndex);\n          var dataIndex = idxItem.dataIndexInside;\n          var dataParams = series && series.getDataParams(dataIndex);\n          dataParams && params_1.seriesData.push(dataParams);\n        });\n        if (isString(formatter)) {\n          text = formatter.replace('{value}', text);\n        } else if (isFunction(formatter)) {\n          text = formatter(params_1);\n        }\n      }\n      return text;\n    }\n    function getTransformedPosition(axis, value, layoutInfo) {\n      var transform = create$1();\n      rotate(transform, transform, layoutInfo.rotation);\n      translate(transform, transform, layoutInfo.position);\n      return applyTransform$1([axis.dataToCoord(value), (layoutInfo.labelOffset || 0) + (layoutInfo.labelDirection || 1) * (layoutInfo.labelMargin || 0)], transform);\n    }\n    function buildCartesianSingleLabelElOption(value, elOption, layoutInfo, axisModel, axisPointerModel, api) {\n      // @ts-ignore\n      var textLayout = AxisBuilder.innerTextLayout(layoutInfo.rotation, 0, layoutInfo.labelDirection);\n      layoutInfo.labelMargin = axisPointerModel.get(['label', 'margin']);\n      buildLabelElOption(elOption, axisModel, axisPointerModel, api, {\n        position: getTransformedPosition(axisModel.axis, value, layoutInfo),\n        align: textLayout.textAlign,\n        verticalAlign: textLayout.textVerticalAlign\n      });\n    }\n    function makeLineShape(p1, p2, xDimIndex) {\n      xDimIndex = xDimIndex || 0;\n      return {\n        x1: p1[xDimIndex],\n        y1: p1[1 - xDimIndex],\n        x2: p2[xDimIndex],\n        y2: p2[1 - xDimIndex]\n      };\n    }\n    function makeRectShape(xy, wh, xDimIndex) {\n      xDimIndex = xDimIndex || 0;\n      return {\n        x: xy[xDimIndex],\n        y: xy[1 - xDimIndex],\n        width: wh[xDimIndex],\n        height: wh[1 - xDimIndex]\n      };\n    }\n    function makeSectorShape(cx, cy, r0, r, startAngle, endAngle) {\n      return {\n        cx: cx,\n        cy: cy,\n        r0: r0,\n        r: r,\n        startAngle: startAngle,\n        endAngle: endAngle,\n        clockwise: true\n      };\n    }\n\n    var CartesianAxisPointer = /** @class */function (_super) {\n      __extends(CartesianAxisPointer, _super);\n      function CartesianAxisPointer() {\n        return _super !== null && _super.apply(this, arguments) || this;\n      }\n      /**\r\n       * @override\r\n       */\n      CartesianAxisPointer.prototype.makeElOption = function (elOption, value, axisModel, axisPointerModel, api) {\n        var axis = axisModel.axis;\n        var grid = axis.grid;\n        var axisPointerType = axisPointerModel.get('type');\n        var otherExtent = getCartesian(grid, axis).getOtherAxis(axis).getGlobalExtent();\n        var pixelValue = axis.toGlobalCoord(axis.dataToCoord(value, true));\n        if (axisPointerType && axisPointerType !== 'none') {\n          var elStyle = buildElStyle(axisPointerModel);\n          var pointerOption = pointerShapeBuilder[axisPointerType](axis, pixelValue, otherExtent);\n          pointerOption.style = elStyle;\n          elOption.graphicKey = pointerOption.type;\n          elOption.pointer = pointerOption;\n        }\n        var layoutInfo = layout$1(grid.model, axisModel);\n        buildCartesianSingleLabelElOption(\n        // @ts-ignore\n        value, elOption, layoutInfo, axisModel, axisPointerModel, api);\n      };\n      /**\r\n       * @override\r\n       */\n      CartesianAxisPointer.prototype.getHandleTransform = function (value, axisModel, axisPointerModel) {\n        var layoutInfo = layout$1(axisModel.axis.grid.model, axisModel, {\n          labelInside: false\n        });\n        // @ts-ignore\n        layoutInfo.labelMargin = axisPointerModel.get(['handle', 'margin']);\n        var pos = getTransformedPosition(axisModel.axis, value, layoutInfo);\n        return {\n          x: pos[0],\n          y: pos[1],\n          rotation: layoutInfo.rotation + (layoutInfo.labelDirection < 0 ? Math.PI : 0)\n        };\n      };\n      /**\r\n       * @override\r\n       */\n      CartesianAxisPointer.prototype.updateHandleTransform = function (transform, delta, axisModel, axisPointerModel) {\n        var axis = axisModel.axis;\n        var grid = axis.grid;\n        var axisExtent = axis.getGlobalExtent(true);\n        var otherExtent = getCartesian(grid, axis).getOtherAxis(axis).getGlobalExtent();\n        var dimIndex = axis.dim === 'x' ? 0 : 1;\n        var currPosition = [transform.x, transform.y];\n        currPosition[dimIndex] += delta[dimIndex];\n        currPosition[dimIndex] = Math.min(axisExtent[1], currPosition[dimIndex]);\n        currPosition[dimIndex] = Math.max(axisExtent[0], currPosition[dimIndex]);\n        var cursorOtherValue = (otherExtent[1] + otherExtent[0]) / 2;\n        var cursorPoint = [cursorOtherValue, cursorOtherValue];\n        cursorPoint[dimIndex] = currPosition[dimIndex];\n        // Make tooltip do not overlap axisPointer and in the middle of the grid.\n        var tooltipOptions = [{\n          verticalAlign: 'middle'\n        }, {\n          align: 'center'\n        }];\n        return {\n          x: currPosition[0],\n          y: currPosition[1],\n          rotation: transform.rotation,\n          cursorPoint: cursorPoint,\n          tooltipOption: tooltipOptions[dimIndex]\n        };\n      };\n      return CartesianAxisPointer;\n    }(BaseAxisPointer);\n    function getCartesian(grid, axis) {\n      var opt = {};\n      opt[axis.dim + 'AxisIndex'] = axis.index;\n      return grid.getCartesian(opt);\n    }\n    var pointerShapeBuilder = {\n      line: function (axis, pixelValue, otherExtent) {\n        var targetShape = makeLineShape([pixelValue, otherExtent[0]], [pixelValue, otherExtent[1]], getAxisDimIndex(axis));\n        return {\n          type: 'Line',\n          subPixelOptimize: true,\n          shape: targetShape\n        };\n      },\n      shadow: function (axis, pixelValue, otherExtent) {\n        var bandWidth = Math.max(1, axis.getBandWidth());\n        var span = otherExtent[1] - otherExtent[0];\n        return {\n          type: 'Rect',\n          shape: makeRectShape([pixelValue - bandWidth / 2, otherExtent[0]], [bandWidth, span], getAxisDimIndex(axis))\n        };\n      }\n    };\n    function getAxisDimIndex(axis) {\n      return axis.dim === 'x' ? 0 : 1;\n    }\n\n    var AxisPointerModel = /** @class */function (_super) {\n      __extends(AxisPointerModel, _super);\n      function AxisPointerModel() {\n        var _this = _super !== null && _super.apply(this, arguments) || this;\n        _this.type = AxisPointerModel.type;\n        return _this;\n      }\n      AxisPointerModel.type = 'axisPointer';\n      AxisPointerModel.defaultOption = {\n        // 'auto' means that show when triggered by tooltip or handle.\n        show: 'auto',\n        // zlevel: 0,\n        z: 50,\n        type: 'line',\n        // axispointer triggered by tootip determine snap automatically,\n        // see `modelHelper`.\n        snap: false,\n        triggerTooltip: true,\n        triggerEmphasis: true,\n        value: null,\n        status: null,\n        link: [],\n        // Do not set 'auto' here, otherwise global animation: false\n        // will not effect at this axispointer.\n        animation: null,\n        animationDurationUpdate: 200,\n        lineStyle: {\n          color: '#B9BEC9',\n          width: 1,\n          type: 'dashed'\n        },\n        shadowStyle: {\n          color: 'rgba(210,219,238,0.2)'\n        },\n        label: {\n          show: true,\n          formatter: null,\n          precision: 'auto',\n          margin: 3,\n          color: '#fff',\n          padding: [5, 7, 5, 7],\n          backgroundColor: 'auto',\n          borderColor: null,\n          borderWidth: 0,\n          borderRadius: 3\n        },\n        handle: {\n          show: false,\n          // eslint-disable-next-line\n          icon: 'M10.7,11.9v-1.3H9.3v1.3c-4.9,0.3-8.8,4.4-8.8,9.4c0,5,3.9,9.1,8.8,9.4h1.3c4.9-0.3,8.8-4.4,8.8-9.4C19.5,16.3,15.6,12.2,10.7,11.9z M13.3,24.4H6.7v-1.2h6.6z M13.3,22H6.7v-1.2h6.6z M13.3,19.6H6.7v-1.2h6.6z',\n          size: 45,\n          // handle margin is from symbol center to axis, which is stable when circular move.\n          margin: 50,\n          // color: '#1b8bbd'\n          // color: '#2f4554'\n          color: '#333',\n          shadowBlur: 3,\n          shadowColor: '#aaa',\n          shadowOffsetX: 0,\n          shadowOffsetY: 2,\n          // For mobile performance\n          throttle: 40\n        }\n      };\n      return AxisPointerModel;\n    }(ComponentModel);\n\n    var inner$b = makeInner();\n    var each$7 = each;\n    /**\r\n     * @param {string} key\r\n     * @param {module:echarts/ExtensionAPI} api\r\n     * @param {Function} handler\r\n     *      param: {string} currTrigger\r\n     *      param: {Array.<number>} point\r\n     */\n    function register(key, api, handler) {\n      if (env.node) {\n        return;\n      }\n      var zr = api.getZr();\n      inner$b(zr).records || (inner$b(zr).records = {});\n      initGlobalListeners(zr, api);\n      var record = inner$b(zr).records[key] || (inner$b(zr).records[key] = {});\n      record.handler = handler;\n    }\n    function initGlobalListeners(zr, api) {\n      if (inner$b(zr).initialized) {\n        return;\n      }\n      inner$b(zr).initialized = true;\n      useHandler('click', curry(doEnter, 'click'));\n      useHandler('mousemove', curry(doEnter, 'mousemove'));\n      // useHandler('mouseout', onLeave);\n      useHandler('globalout', onLeave);\n      function useHandler(eventType, cb) {\n        zr.on(eventType, function (e) {\n          var dis = makeDispatchAction(api);\n          each$7(inner$b(zr).records, function (record) {\n            record && cb(record, e, dis.dispatchAction);\n          });\n          dispatchTooltipFinally(dis.pendings, api);\n        });\n      }\n    }\n    function dispatchTooltipFinally(pendings, api) {\n      var showLen = pendings.showTip.length;\n      var hideLen = pendings.hideTip.length;\n      var actuallyPayload;\n      if (showLen) {\n        actuallyPayload = pendings.showTip[showLen - 1];\n      } else if (hideLen) {\n        actuallyPayload = pendings.hideTip[hideLen - 1];\n      }\n      if (actuallyPayload) {\n        actuallyPayload.dispatchAction = null;\n        api.dispatchAction(actuallyPayload);\n      }\n    }\n    function onLeave(record, e, dispatchAction) {\n      record.handler('leave', null, dispatchAction);\n    }\n    function doEnter(currTrigger, record, e, dispatchAction) {\n      record.handler(currTrigger, e, dispatchAction);\n    }\n    function makeDispatchAction(api) {\n      var pendings = {\n        showTip: [],\n        hideTip: []\n      };\n      // FIXME\n      // better approach?\n      // 'showTip' and 'hideTip' can be triggered by axisPointer and tooltip,\n      // which may be conflict, (axisPointer call showTip but tooltip call hideTip);\n      // So we have to add \"final stage\" to merge those dispatched actions.\n      var dispatchAction = function (payload) {\n        var pendingList = pendings[payload.type];\n        if (pendingList) {\n          pendingList.push(payload);\n        } else {\n          payload.dispatchAction = dispatchAction;\n          api.dispatchAction(payload);\n        }\n      };\n      return {\n        dispatchAction: dispatchAction,\n        pendings: pendings\n      };\n    }\n    function unregister(key, api) {\n      if (env.node) {\n        return;\n      }\n      var zr = api.getZr();\n      var record = (inner$b(zr).records || {})[key];\n      if (record) {\n        inner$b(zr).records[key] = null;\n      }\n    }\n\n    var AxisPointerView = /** @class */function (_super) {\n      __extends(AxisPointerView, _super);\n      function AxisPointerView() {\n        var _this = _super !== null && _super.apply(this, arguments) || this;\n        _this.type = AxisPointerView.type;\n        return _this;\n      }\n      AxisPointerView.prototype.render = function (globalAxisPointerModel, ecModel, api) {\n        var globalTooltipModel = ecModel.getComponent('tooltip');\n        var triggerOn = globalAxisPointerModel.get('triggerOn') || globalTooltipModel && globalTooltipModel.get('triggerOn') || 'mousemove|click';\n        // Register global listener in AxisPointerView to enable\n        // AxisPointerView to be independent to Tooltip.\n        register('axisPointer', api, function (currTrigger, e, dispatchAction) {\n          // If 'none', it is not controlled by mouse totally.\n          if (triggerOn !== 'none' && (currTrigger === 'leave' || triggerOn.indexOf(currTrigger) >= 0)) {\n            dispatchAction({\n              type: 'updateAxisPointer',\n              currTrigger: currTrigger,\n              x: e && e.offsetX,\n              y: e && e.offsetY\n            });\n          }\n        });\n      };\n      AxisPointerView.prototype.remove = function (ecModel, api) {\n        unregister('axisPointer', api);\n      };\n      AxisPointerView.prototype.dispose = function (ecModel, api) {\n        unregister('axisPointer', api);\n      };\n      AxisPointerView.type = 'axisPointer';\n      return AxisPointerView;\n    }(ComponentView);\n\n    /**\r\n     * @param finder contains {seriesIndex, dataIndex, dataIndexInside}\r\n     * @param ecModel\r\n     * @return  {point: [x, y], el: ...} point Will not be null.\r\n     */\n    function findPointFromSeries(finder, ecModel) {\n      var point = [];\n      var seriesIndex = finder.seriesIndex;\n      var seriesModel;\n      if (seriesIndex == null || !(seriesModel = ecModel.getSeriesByIndex(seriesIndex))) {\n        return {\n          point: []\n        };\n      }\n      var data = seriesModel.getData();\n      var dataIndex = queryDataIndex(data, finder);\n      if (dataIndex == null || dataIndex < 0 || isArray(dataIndex)) {\n        return {\n          point: []\n        };\n      }\n      var el = data.getItemGraphicEl(dataIndex);\n      var coordSys = seriesModel.coordinateSystem;\n      if (seriesModel.getTooltipPosition) {\n        point = seriesModel.getTooltipPosition(dataIndex) || [];\n      } else if (coordSys && coordSys.dataToPoint) {\n        if (finder.isStacked) {\n          var baseAxis = coordSys.getBaseAxis();\n          var valueAxis = coordSys.getOtherAxis(baseAxis);\n          var valueAxisDim = valueAxis.dim;\n          var baseAxisDim = baseAxis.dim;\n          var baseDataOffset = valueAxisDim === 'x' || valueAxisDim === 'radius' ? 1 : 0;\n          var baseDim = data.mapDimension(baseAxisDim);\n          var stackedData = [];\n          stackedData[baseDataOffset] = data.get(baseDim, dataIndex);\n          stackedData[1 - baseDataOffset] = data.get(data.getCalculationInfo('stackResultDimension'), dataIndex);\n          point = coordSys.dataToPoint(stackedData) || [];\n        } else {\n          point = coordSys.dataToPoint(data.getValues(map(coordSys.dimensions, function (dim) {\n            return data.mapDimension(dim);\n          }), dataIndex)) || [];\n        }\n      } else if (el) {\n        // Use graphic bounding rect\n        var rect = el.getBoundingRect().clone();\n        rect.applyTransform(el.transform);\n        point = [rect.x + rect.width / 2, rect.y + rect.height / 2];\n      }\n      return {\n        point: point,\n        el: el\n      };\n    }\n\n    var inner$c = makeInner();\n    /**\r\n     * Basic logic: check all axis, if they do not demand show/highlight,\r\n     * then hide/downplay them.\r\n     *\r\n     * @return content of event obj for echarts.connect.\r\n     */\n    function axisTrigger(payload, ecModel, api) {\n      var currTrigger = payload.currTrigger;\n      var point = [payload.x, payload.y];\n      var finder = payload;\n      var dispatchAction = payload.dispatchAction || bind(api.dispatchAction, api);\n      var coordSysAxesInfo = ecModel.getComponent('axisPointer').coordSysAxesInfo;\n      // Pending\n      // See #6121. But we are not able to reproduce it yet.\n      if (!coordSysAxesInfo) {\n        return;\n      }\n      if (illegalPoint(point)) {\n        // Used in the default behavior of `connection`: use the sample seriesIndex\n        // and dataIndex. And also used in the tooltipView trigger.\n        point = findPointFromSeries({\n          seriesIndex: finder.seriesIndex,\n          // Do not use dataIndexInside from other ec instance.\n          // FIXME: auto detect it?\n          dataIndex: finder.dataIndex\n        }, ecModel).point;\n      }\n      var isIllegalPoint = illegalPoint(point);\n      // Axis and value can be specified when calling dispatchAction({type: 'updateAxisPointer'}).\n      // Notice: In this case, it is difficult to get the `point` (which is necessary to show\n      // tooltip, so if point is not given, we just use the point found by sample seriesIndex\n      // and dataIndex.\n      var inputAxesInfo = finder.axesInfo;\n      var axesInfo = coordSysAxesInfo.axesInfo;\n      var shouldHide = currTrigger === 'leave' || illegalPoint(point);\n      var outputPayload = {};\n      var showValueMap = {};\n      var dataByCoordSys = {\n        list: [],\n        map: {}\n      };\n      var updaters = {\n        showPointer: curry(showPointer, showValueMap),\n        showTooltip: curry(showTooltip, dataByCoordSys)\n      };\n      // Process for triggered axes.\n      each(coordSysAxesInfo.coordSysMap, function (coordSys, coordSysKey) {\n        // If a point given, it must be contained by the coordinate system.\n        var coordSysContainsPoint = isIllegalPoint || coordSys.containPoint(point);\n        each(coordSysAxesInfo.coordSysAxesInfo[coordSysKey], function (axisInfo, key) {\n          var axis = axisInfo.axis;\n          var inputAxisInfo = findInputAxisInfo(inputAxesInfo, axisInfo);\n          // If no inputAxesInfo, no axis is restricted.\n          if (!shouldHide && coordSysContainsPoint && (!inputAxesInfo || inputAxisInfo)) {\n            var val = inputAxisInfo && inputAxisInfo.value;\n            if (val == null && !isIllegalPoint) {\n              val = axis.pointToData(point);\n            }\n            val != null && processOnAxis(axisInfo, val, updaters, false, outputPayload);\n          }\n        });\n      });\n      // Process for linked axes.\n      var linkTriggers = {};\n      each(axesInfo, function (tarAxisInfo, tarKey) {\n        var linkGroup = tarAxisInfo.linkGroup;\n        // If axis has been triggered in the previous stage, it should not be triggered by link.\n        if (linkGroup && !showValueMap[tarKey]) {\n          each(linkGroup.axesInfo, function (srcAxisInfo, srcKey) {\n            var srcValItem = showValueMap[srcKey];\n            // If srcValItem exist, source axis is triggered, so link to target axis.\n            if (srcAxisInfo !== tarAxisInfo && srcValItem) {\n              var val = srcValItem.value;\n              linkGroup.mapper && (val = tarAxisInfo.axis.scale.parse(linkGroup.mapper(val, makeMapperParam(srcAxisInfo), makeMapperParam(tarAxisInfo))));\n              linkTriggers[tarAxisInfo.key] = val;\n            }\n          });\n        }\n      });\n      each(linkTriggers, function (val, tarKey) {\n        processOnAxis(axesInfo[tarKey], val, updaters, true, outputPayload);\n      });\n      updateModelActually(showValueMap, axesInfo, outputPayload);\n      dispatchTooltipActually(dataByCoordSys, point, payload, dispatchAction);\n      dispatchHighDownActually(axesInfo, dispatchAction, api);\n      return outputPayload;\n    }\n    function processOnAxis(axisInfo, newValue, updaters, noSnap, outputFinder) {\n      var axis = axisInfo.axis;\n      if (axis.scale.isBlank() || !axis.containData(newValue)) {\n        return;\n      }\n      if (!axisInfo.involveSeries) {\n        updaters.showPointer(axisInfo, newValue);\n        return;\n      }\n      // Heavy calculation. So put it after axis.containData checking.\n      var payloadInfo = buildPayloadsBySeries(newValue, axisInfo);\n      var payloadBatch = payloadInfo.payloadBatch;\n      var snapToValue = payloadInfo.snapToValue;\n      // Fill content of event obj for echarts.connect.\n      // By default use the first involved series data as a sample to connect.\n      if (payloadBatch[0] && outputFinder.seriesIndex == null) {\n        extend(outputFinder, payloadBatch[0]);\n      }\n      // If no linkSource input, this process is for collecting link\n      // target, where snap should not be accepted.\n      if (!noSnap && axisInfo.snap) {\n        if (axis.containData(snapToValue) && snapToValue != null) {\n          newValue = snapToValue;\n        }\n      }\n      updaters.showPointer(axisInfo, newValue, payloadBatch);\n      // Tooltip should always be snapToValue, otherwise there will be\n      // incorrect \"axis value ~ series value\" mapping displayed in tooltip.\n      updaters.showTooltip(axisInfo, payloadInfo, snapToValue);\n    }\n    function buildPayloadsBySeries(value, axisInfo) {\n      var axis = axisInfo.axis;\n      var dim = axis.dim;\n      var snapToValue = value;\n      var payloadBatch = [];\n      var minDist = Number.MAX_VALUE;\n      var minDiff = -1;\n      each(axisInfo.seriesModels, function (series, idx) {\n        var dataDim = series.getData().mapDimensionsAll(dim);\n        var seriesNestestValue;\n        var dataIndices;\n        if (series.getAxisTooltipData) {\n          var result = series.getAxisTooltipData(dataDim, value, axis);\n          dataIndices = result.dataIndices;\n          seriesNestestValue = result.nestestValue;\n        } else {\n          dataIndices = series.getData().indicesOfNearest(dataDim[0], value,\n          // Add a threshold to avoid find the wrong dataIndex\n          // when data length is not same.\n          // false,\n          axis.type === 'category' ? 0.5 : null);\n          if (!dataIndices.length) {\n            return;\n          }\n          seriesNestestValue = series.getData().get(dataDim[0], dataIndices[0]);\n        }\n        if (seriesNestestValue == null || !isFinite(seriesNestestValue)) {\n          return;\n        }\n        var diff = value - seriesNestestValue;\n        var dist = Math.abs(diff);\n        // Consider category case\n        if (dist <= minDist) {\n          if (dist < minDist || diff >= 0 && minDiff < 0) {\n            minDist = dist;\n            minDiff = diff;\n            snapToValue = seriesNestestValue;\n            payloadBatch.length = 0;\n          }\n          each(dataIndices, function (dataIndex) {\n            payloadBatch.push({\n              seriesIndex: series.seriesIndex,\n              dataIndexInside: dataIndex,\n              dataIndex: series.getData().getRawIndex(dataIndex)\n            });\n          });\n        }\n      });\n      return {\n        payloadBatch: payloadBatch,\n        snapToValue: snapToValue\n      };\n    }\n    function showPointer(showValueMap, axisInfo, value, payloadBatch) {\n      showValueMap[axisInfo.key] = {\n        value: value,\n        payloadBatch: payloadBatch\n      };\n    }\n    function showTooltip(dataByCoordSys, axisInfo, payloadInfo, value) {\n      var payloadBatch = payloadInfo.payloadBatch;\n      var axis = axisInfo.axis;\n      var axisModel = axis.model;\n      var axisPointerModel = axisInfo.axisPointerModel;\n      // If no data, do not create anything in dataByCoordSys,\n      // whose length will be used to judge whether dispatch action.\n      if (!axisInfo.triggerTooltip || !payloadBatch.length) {\n        return;\n      }\n      var coordSysModel = axisInfo.coordSys.model;\n      var coordSysKey = makeKey(coordSysModel);\n      var coordSysItem = dataByCoordSys.map[coordSysKey];\n      if (!coordSysItem) {\n        coordSysItem = dataByCoordSys.map[coordSysKey] = {\n          coordSysId: coordSysModel.id,\n          coordSysIndex: coordSysModel.componentIndex,\n          coordSysType: coordSysModel.type,\n          coordSysMainType: coordSysModel.mainType,\n          dataByAxis: []\n        };\n        dataByCoordSys.list.push(coordSysItem);\n      }\n      coordSysItem.dataByAxis.push({\n        axisDim: axis.dim,\n        axisIndex: axisModel.componentIndex,\n        axisType: axisModel.type,\n        axisId: axisModel.id,\n        value: value,\n        // Caustion: viewHelper.getValueLabel is actually on \"view stage\", which\n        // depends that all models have been updated. So it should not be performed\n        // here. Considering axisPointerModel used here is volatile, which is hard\n        // to be retrieve in TooltipView, we prepare parameters here.\n        valueLabelOpt: {\n          precision: axisPointerModel.get(['label', 'precision']),\n          formatter: axisPointerModel.get(['label', 'formatter'])\n        },\n        seriesDataIndices: payloadBatch.slice()\n      });\n    }\n    function updateModelActually(showValueMap, axesInfo, outputPayload) {\n      var outputAxesInfo = outputPayload.axesInfo = [];\n      // Basic logic: If no 'show' required, 'hide' this axisPointer.\n      each(axesInfo, function (axisInfo, key) {\n        var option = axisInfo.axisPointerModel.option;\n        var valItem = showValueMap[key];\n        if (valItem) {\n          !axisInfo.useHandle && (option.status = 'show');\n          option.value = valItem.value;\n          // For label formatter param and highlight.\n          option.seriesDataIndices = (valItem.payloadBatch || []).slice();\n        }\n        // When always show (e.g., handle used), remain\n        // original value and status.\n        else {\n          // If hide, value still need to be set, consider\n          // click legend to toggle axis blank.\n          !axisInfo.useHandle && (option.status = 'hide');\n        }\n        // If status is 'hide', should be no info in payload.\n        option.status === 'show' && outputAxesInfo.push({\n          axisDim: axisInfo.axis.dim,\n          axisIndex: axisInfo.axis.model.componentIndex,\n          value: option.value\n        });\n      });\n    }\n    function dispatchTooltipActually(dataByCoordSys, point, payload, dispatchAction) {\n      // Basic logic: If no showTip required, hideTip will be dispatched.\n      if (illegalPoint(point) || !dataByCoordSys.list.length) {\n        dispatchAction({\n          type: 'hideTip'\n        });\n        return;\n      }\n      // In most case only one axis (or event one series is used). It is\n      // convenient to fetch payload.seriesIndex and payload.dataIndex\n      // directly. So put the first seriesIndex and dataIndex of the first\n      // axis on the payload.\n      var sampleItem = ((dataByCoordSys.list[0].dataByAxis[0] || {}).seriesDataIndices || [])[0] || {};\n      dispatchAction({\n        type: 'showTip',\n        escapeConnect: true,\n        x: point[0],\n        y: point[1],\n        tooltipOption: payload.tooltipOption,\n        position: payload.position,\n        dataIndexInside: sampleItem.dataIndexInside,\n        dataIndex: sampleItem.dataIndex,\n        seriesIndex: sampleItem.seriesIndex,\n        dataByCoordSys: dataByCoordSys.list\n      });\n    }\n    function dispatchHighDownActually(axesInfo, dispatchAction, api) {\n      // FIXME\n      // highlight status modification should be a stage of main process?\n      // (Consider confilct (e.g., legend and axisPointer) and setOption)\n      var zr = api.getZr();\n      var highDownKey = 'axisPointerLastHighlights';\n      var lastHighlights = inner$c(zr)[highDownKey] || {};\n      var newHighlights = inner$c(zr)[highDownKey] = {};\n      // Update highlight/downplay status according to axisPointer model.\n      // Build hash map and remove duplicate incidentally.\n      each(axesInfo, function (axisInfo, key) {\n        var option = axisInfo.axisPointerModel.option;\n        option.status === 'show' && axisInfo.triggerEmphasis && each(option.seriesDataIndices, function (batchItem) {\n          var key = batchItem.seriesIndex + ' | ' + batchItem.dataIndex;\n          newHighlights[key] = batchItem;\n        });\n      });\n      // Diff.\n      var toHighlight = [];\n      var toDownplay = [];\n      each(lastHighlights, function (batchItem, key) {\n        !newHighlights[key] && toDownplay.push(batchItem);\n      });\n      each(newHighlights, function (batchItem, key) {\n        !lastHighlights[key] && toHighlight.push(batchItem);\n      });\n      toDownplay.length && api.dispatchAction({\n        type: 'downplay',\n        escapeConnect: true,\n        // Not blur others when highlight in axisPointer.\n        notBlur: true,\n        batch: toDownplay\n      });\n      toHighlight.length && api.dispatchAction({\n        type: 'highlight',\n        escapeConnect: true,\n        // Not blur others when highlight in axisPointer.\n        notBlur: true,\n        batch: toHighlight\n      });\n    }\n    function findInputAxisInfo(inputAxesInfo, axisInfo) {\n      for (var i = 0; i < (inputAxesInfo || []).length; i++) {\n        var inputAxisInfo = inputAxesInfo[i];\n        if (axisInfo.axis.dim === inputAxisInfo.axisDim && axisInfo.axis.model.componentIndex === inputAxisInfo.axisIndex) {\n          return inputAxisInfo;\n        }\n      }\n    }\n    function makeMapperParam(axisInfo) {\n      var axisModel = axisInfo.axis.model;\n      var item = {};\n      var dim = item.axisDim = axisInfo.axis.dim;\n      item.axisIndex = item[dim + 'AxisIndex'] = axisModel.componentIndex;\n      item.axisName = item[dim + 'AxisName'] = axisModel.name;\n      item.axisId = item[dim + 'AxisId'] = axisModel.id;\n      return item;\n    }\n    function illegalPoint(point) {\n      return !point || point[0] == null || isNaN(point[0]) || point[1] == null || isNaN(point[1]);\n    }\n\n    function install$s(registers) {\n      // CartesianAxisPointer is not supposed to be required here. But consider\n      // echarts.simple.js and online build tooltip, which only require gridSimple,\n      // CartesianAxisPointer should be able to required somewhere.\n      AxisView.registerAxisPointerClass('CartesianAxisPointer', CartesianAxisPointer);\n      registers.registerComponentModel(AxisPointerModel);\n      registers.registerComponentView(AxisPointerView);\n      registers.registerPreprocessor(function (option) {\n        // Always has a global axisPointerModel for default setting.\n        if (option) {\n          (!option.axisPointer || option.axisPointer.length === 0) && (option.axisPointer = {});\n          var link = option.axisPointer.link;\n          // Normalize to array to avoid object mergin. But if link\n          // is not set, remain null/undefined, otherwise it will\n          // override existent link setting.\n          if (link && !isArray(link)) {\n            option.axisPointer.link = [link];\n          }\n        }\n      });\n      // This process should proformed after coordinate systems created\n      // and series data processed. So put it on statistic processing stage.\n      registers.registerProcessor(registers.PRIORITY.PROCESSOR.STATISTIC, function (ecModel, api) {\n        // Build axisPointerModel, mergin tooltip.axisPointer model for each axis.\n        // allAxesInfo should be updated when setOption performed.\n        ecModel.getComponent('axisPointer').coordSysAxesInfo = collect(ecModel, api);\n      });\n      // Broadcast to all views.\n      registers.registerAction({\n        type: 'updateAxisPointer',\n        event: 'updateAxisPointer',\n        update: ':updateAxisPointer'\n      }, axisTrigger);\n    }\n\n    function install$t(registers) {\n      use(install$5);\n      use(install$s);\n    }\n\n    var PolarAxisPointer = /** @class */function (_super) {\n      __extends(PolarAxisPointer, _super);\n      function PolarAxisPointer() {\n        return _super !== null && _super.apply(this, arguments) || this;\n      }\n      /**\r\n       * @override\r\n       */\n      PolarAxisPointer.prototype.makeElOption = function (elOption, value, axisModel, axisPointerModel, api) {\n        var axis = axisModel.axis;\n        if (axis.dim === 'angle') {\n          this.animationThreshold = Math.PI / 18;\n        }\n        var polar = axis.polar;\n        var otherAxis = polar.getOtherAxis(axis);\n        var otherExtent = otherAxis.getExtent();\n        var coordValue = axis.dataToCoord(value);\n        var axisPointerType = axisPointerModel.get('type');\n        if (axisPointerType && axisPointerType !== 'none') {\n          var elStyle = buildElStyle(axisPointerModel);\n          var pointerOption = pointerShapeBuilder$1[axisPointerType](axis, polar, coordValue, otherExtent);\n          pointerOption.style = elStyle;\n          elOption.graphicKey = pointerOption.type;\n          elOption.pointer = pointerOption;\n        }\n        var labelMargin = axisPointerModel.get(['label', 'margin']);\n        var labelPos = getLabelPosition(value, axisModel, axisPointerModel, polar, labelMargin);\n        buildLabelElOption(elOption, axisModel, axisPointerModel, api, labelPos);\n      };\n      return PolarAxisPointer;\n    }(BaseAxisPointer);\n    function getLabelPosition(value, axisModel, axisPointerModel, polar, labelMargin) {\n      var axis = axisModel.axis;\n      var coord = axis.dataToCoord(value);\n      var axisAngle = polar.getAngleAxis().getExtent()[0];\n      axisAngle = axisAngle / 180 * Math.PI;\n      var radiusExtent = polar.getRadiusAxis().getExtent();\n      var position;\n      var align;\n      var verticalAlign;\n      if (axis.dim === 'radius') {\n        var transform = create$1();\n        rotate(transform, transform, axisAngle);\n        translate(transform, transform, [polar.cx, polar.cy]);\n        position = applyTransform$1([coord, -labelMargin], transform);\n        var labelRotation = axisModel.getModel('axisLabel').get('rotate') || 0;\n        // @ts-ignore\n        var labelLayout = AxisBuilder.innerTextLayout(axisAngle, labelRotation * Math.PI / 180, -1);\n        align = labelLayout.textAlign;\n        verticalAlign = labelLayout.textVerticalAlign;\n      } else {\n        // angle axis\n        var r = radiusExtent[1];\n        position = polar.coordToPoint([r + labelMargin, coord]);\n        var cx = polar.cx;\n        var cy = polar.cy;\n        align = Math.abs(position[0] - cx) / r < 0.3 ? 'center' : position[0] > cx ? 'left' : 'right';\n        verticalAlign = Math.abs(position[1] - cy) / r < 0.3 ? 'middle' : position[1] > cy ? 'top' : 'bottom';\n      }\n      return {\n        position: position,\n        align: align,\n        verticalAlign: verticalAlign\n      };\n    }\n    var pointerShapeBuilder$1 = {\n      line: function (axis, polar, coordValue, otherExtent) {\n        return axis.dim === 'angle' ? {\n          type: 'Line',\n          shape: makeLineShape(polar.coordToPoint([otherExtent[0], coordValue]), polar.coordToPoint([otherExtent[1], coordValue]))\n        } : {\n          type: 'Circle',\n          shape: {\n            cx: polar.cx,\n            cy: polar.cy,\n            r: coordValue\n          }\n        };\n      },\n      shadow: function (axis, polar, coordValue, otherExtent) {\n        var bandWidth = Math.max(1, axis.getBandWidth());\n        var radian = Math.PI / 180;\n        return axis.dim === 'angle' ? {\n          type: 'Sector',\n          shape: makeSectorShape(polar.cx, polar.cy, otherExtent[0], otherExtent[1],\n          // In ECharts y is negative if angle is positive\n          (-coordValue - bandWidth / 2) * radian, (-coordValue + bandWidth / 2) * radian)\n        } : {\n          type: 'Sector',\n          shape: makeSectorShape(polar.cx, polar.cy, coordValue - bandWidth / 2, coordValue + bandWidth / 2, 0, Math.PI * 2)\n        };\n      }\n    };\n\n    var PolarModel = /** @class */function (_super) {\n      __extends(PolarModel, _super);\n      function PolarModel() {\n        var _this = _super !== null && _super.apply(this, arguments) || this;\n        _this.type = PolarModel.type;\n        return _this;\n      }\n      PolarModel.prototype.findAxisModel = function (axisType) {\n        var foundAxisModel;\n        var ecModel = this.ecModel;\n        ecModel.eachComponent(axisType, function (axisModel) {\n          if (axisModel.getCoordSysModel() === this) {\n            foundAxisModel = axisModel;\n          }\n        }, this);\n        return foundAxisModel;\n      };\n      PolarModel.type = 'polar';\n      PolarModel.dependencies = ['radiusAxis', 'angleAxis'];\n      PolarModel.defaultOption = {\n        // zlevel: 0,\n        z: 0,\n        center: ['50%', '50%'],\n        radius: '80%'\n      };\n      return PolarModel;\n    }(ComponentModel);\n\n    var PolarAxisModel = /** @class */function (_super) {\n      __extends(PolarAxisModel, _super);\n      function PolarAxisModel() {\n        return _super !== null && _super.apply(this, arguments) || this;\n      }\n      PolarAxisModel.prototype.getCoordSysModel = function () {\n        return this.getReferringComponents('polar', SINGLE_REFERRING).models[0];\n      };\n      PolarAxisModel.type = 'polarAxis';\n      return PolarAxisModel;\n    }(ComponentModel);\n    mixin(PolarAxisModel, AxisModelCommonMixin);\n    var AngleAxisModel = /** @class */function (_super) {\n      __extends(AngleAxisModel, _super);\n      function AngleAxisModel() {\n        var _this = _super !== null && _super.apply(this, arguments) || this;\n        _this.type = AngleAxisModel.type;\n        return _this;\n      }\n      AngleAxisModel.type = 'angleAxis';\n      return AngleAxisModel;\n    }(PolarAxisModel);\n    var RadiusAxisModel = /** @class */function (_super) {\n      __extends(RadiusAxisModel, _super);\n      function RadiusAxisModel() {\n        var _this = _super !== null && _super.apply(this, arguments) || this;\n        _this.type = RadiusAxisModel.type;\n        return _this;\n      }\n      RadiusAxisModel.type = 'radiusAxis';\n      return RadiusAxisModel;\n    }(PolarAxisModel);\n\n    var RadiusAxis = /** @class */function (_super) {\n      __extends(RadiusAxis, _super);\n      function RadiusAxis(scale, radiusExtent) {\n        return _super.call(this, 'radius', scale, radiusExtent) || this;\n      }\n      RadiusAxis.prototype.pointToData = function (point, clamp) {\n        return this.polar.pointToData(point, clamp)[this.dim === 'radius' ? 0 : 1];\n      };\n      return RadiusAxis;\n    }(Axis);\n    RadiusAxis.prototype.dataToRadius = Axis.prototype.dataToCoord;\n    RadiusAxis.prototype.radiusToData = Axis.prototype.coordToData;\n\n    var inner$d = makeInner();\n    var AngleAxis = /** @class */function (_super) {\n      __extends(AngleAxis, _super);\n      function AngleAxis(scale, angleExtent) {\n        return _super.call(this, 'angle', scale, angleExtent || [0, 360]) || this;\n      }\n      AngleAxis.prototype.pointToData = function (point, clamp) {\n        return this.polar.pointToData(point, clamp)[this.dim === 'radius' ? 0 : 1];\n      };\n      /**\r\n       * Only be called in category axis.\r\n       * Angle axis uses text height to decide interval\r\n       *\r\n       * @override\r\n       * @return {number} Auto interval for cateogry axis tick and label\r\n       */\n      AngleAxis.prototype.calculateCategoryInterval = function () {\n        var axis = this;\n        var labelModel = axis.getLabelModel();\n        var ordinalScale = axis.scale;\n        var ordinalExtent = ordinalScale.getExtent();\n        // Providing this method is for optimization:\n        // avoid generating a long array by `getTicks`\n        // in large category data case.\n        var tickCount = ordinalScale.count();\n        if (ordinalExtent[1] - ordinalExtent[0] < 1) {\n          return 0;\n        }\n        var tickValue = ordinalExtent[0];\n        var unitSpan = axis.dataToCoord(tickValue + 1) - axis.dataToCoord(tickValue);\n        var unitH = Math.abs(unitSpan);\n        // Not precise, just use height as text width\n        // and each distance from axis line yet.\n        var rect = getBoundingRect(tickValue == null ? '' : tickValue + '', labelModel.getFont(), 'center', 'top');\n        var maxH = Math.max(rect.height, 7);\n        var dh = maxH / unitH;\n        // 0/0 is NaN, 1/0 is Infinity.\n        isNaN(dh) && (dh = Infinity);\n        var interval = Math.max(0, Math.floor(dh));\n        var cache = inner$d(axis.model);\n        var lastAutoInterval = cache.lastAutoInterval;\n        var lastTickCount = cache.lastTickCount;\n        // Use cache to keep interval stable while moving zoom window,\n        // otherwise the calculated interval might jitter when the zoom\n        // window size is close to the interval-changing size.\n        if (lastAutoInterval != null && lastTickCount != null && Math.abs(lastAutoInterval - interval) <= 1 && Math.abs(lastTickCount - tickCount) <= 1\n        // Always choose the bigger one, otherwise the critical\n        // point is not the same when zooming in or zooming out.\n        && lastAutoInterval > interval) {\n          interval = lastAutoInterval;\n        }\n        // Only update cache if cache not used, otherwise the\n        // changing of interval is too insensitive.\n        else {\n          cache.lastTickCount = tickCount;\n          cache.lastAutoInterval = interval;\n        }\n        return interval;\n      };\n      return AngleAxis;\n    }(Axis);\n    AngleAxis.prototype.dataToAngle = Axis.prototype.dataToCoord;\n    AngleAxis.prototype.angleToData = Axis.prototype.coordToData;\n\n    var polarDimensions = ['radius', 'angle'];\n    var Polar = /** @class */function () {\n      function Polar(name) {\n        this.dimensions = polarDimensions;\n        this.type = 'polar';\n        /**\r\n         * x of polar center\r\n         */\n        this.cx = 0;\n        /**\r\n         * y of polar center\r\n         */\n        this.cy = 0;\n        this._radiusAxis = new RadiusAxis();\n        this._angleAxis = new AngleAxis();\n        this.axisPointerEnabled = true;\n        this.name = name || '';\n        this._radiusAxis.polar = this._angleAxis.polar = this;\n      }\n      /**\r\n       * If contain coord\r\n       */\n      Polar.prototype.containPoint = function (point) {\n        var coord = this.pointToCoord(point);\n        return this._radiusAxis.contain(coord[0]) && this._angleAxis.contain(coord[1]);\n      };\n      /**\r\n       * If contain data\r\n       */\n      Polar.prototype.containData = function (data) {\n        return this._radiusAxis.containData(data[0]) && this._angleAxis.containData(data[1]);\n      };\n      Polar.prototype.getAxis = function (dim) {\n        var key = '_' + dim + 'Axis';\n        return this[key];\n      };\n      Polar.prototype.getAxes = function () {\n        return [this._radiusAxis, this._angleAxis];\n      };\n      /**\r\n       * Get axes by type of scale\r\n       */\n      Polar.prototype.getAxesByScale = function (scaleType) {\n        var axes = [];\n        var angleAxis = this._angleAxis;\n        var radiusAxis = this._radiusAxis;\n        angleAxis.scale.type === scaleType && axes.push(angleAxis);\n        radiusAxis.scale.type === scaleType && axes.push(radiusAxis);\n        return axes;\n      };\n      Polar.prototype.getAngleAxis = function () {\n        return this._angleAxis;\n      };\n      Polar.prototype.getRadiusAxis = function () {\n        return this._radiusAxis;\n      };\n      Polar.prototype.getOtherAxis = function (axis) {\n        var angleAxis = this._angleAxis;\n        return axis === angleAxis ? this._radiusAxis : angleAxis;\n      };\n      /**\r\n       * Base axis will be used on stacking.\r\n       *\r\n       */\n      Polar.prototype.getBaseAxis = function () {\n        return this.getAxesByScale('ordinal')[0] || this.getAxesByScale('time')[0] || this.getAngleAxis();\n      };\n      Polar.prototype.getTooltipAxes = function (dim) {\n        var baseAxis = dim != null && dim !== 'auto' ? this.getAxis(dim) : this.getBaseAxis();\n        return {\n          baseAxes: [baseAxis],\n          otherAxes: [this.getOtherAxis(baseAxis)]\n        };\n      };\n      /**\r\n       * Convert a single data item to (x, y) point.\r\n       * Parameter data is an array which the first element is radius and the second is angle\r\n       */\n      Polar.prototype.dataToPoint = function (data, clamp) {\n        return this.coordToPoint([this._radiusAxis.dataToRadius(data[0], clamp), this._angleAxis.dataToAngle(data[1], clamp)]);\n      };\n      /**\r\n       * Convert a (x, y) point to data\r\n       */\n      Polar.prototype.pointToData = function (point, clamp) {\n        var coord = this.pointToCoord(point);\n        return [this._radiusAxis.radiusToData(coord[0], clamp), this._angleAxis.angleToData(coord[1], clamp)];\n      };\n      /**\r\n       * Convert a (x, y) point to (radius, angle) coord\r\n       */\n      Polar.prototype.pointToCoord = function (point) {\n        var dx = point[0] - this.cx;\n        var dy = point[1] - this.cy;\n        var angleAxis = this.getAngleAxis();\n        var extent = angleAxis.getExtent();\n        var minAngle = Math.min(extent[0], extent[1]);\n        var maxAngle = Math.max(extent[0], extent[1]);\n        // Fix fixed extent in polarCreator\n        // FIXME\n        angleAxis.inverse ? minAngle = maxAngle - 360 : maxAngle = minAngle + 360;\n        var radius = Math.sqrt(dx * dx + dy * dy);\n        dx /= radius;\n        dy /= radius;\n        var radian = Math.atan2(-dy, dx) / Math.PI * 180;\n        // move to angleExtent\n        var dir = radian < minAngle ? 1 : -1;\n        while (radian < minAngle || radian > maxAngle) {\n          radian += dir * 360;\n        }\n        return [radius, radian];\n      };\n      /**\r\n       * Convert a (radius, angle) coord to (x, y) point\r\n       */\n      Polar.prototype.coordToPoint = function (coord) {\n        var radius = coord[0];\n        var radian = coord[1] / 180 * Math.PI;\n        var x = Math.cos(radian) * radius + this.cx;\n        // Inverse the y\n        var y = -Math.sin(radian) * radius + this.cy;\n        return [x, y];\n      };\n      /**\r\n       * Get ring area of cartesian.\r\n       * Area will have a contain function to determine if a point is in the coordinate system.\r\n       */\n      Polar.prototype.getArea = function () {\n        var angleAxis = this.getAngleAxis();\n        var radiusAxis = this.getRadiusAxis();\n        var radiusExtent = radiusAxis.getExtent().slice();\n        radiusExtent[0] > radiusExtent[1] && radiusExtent.reverse();\n        var angleExtent = angleAxis.getExtent();\n        var RADIAN = Math.PI / 180;\n        var EPSILON = 1e-4;\n        return {\n          cx: this.cx,\n          cy: this.cy,\n          r0: radiusExtent[0],\n          r: radiusExtent[1],\n          startAngle: -angleExtent[0] * RADIAN,\n          endAngle: -angleExtent[1] * RADIAN,\n          clockwise: angleAxis.inverse,\n          contain: function (x, y) {\n            // It's a ring shape.\n            // Start angle and end angle don't matter\n            var dx = x - this.cx;\n            var dy = y - this.cy;\n            var d2 = dx * dx + dy * dy;\n            var r = this.r;\n            var r0 = this.r0;\n            // minus a tiny value 1e-4 in double side to avoid being clipped unexpectedly\n            // r == r0 contain nothing\n            return r !== r0 && d2 - EPSILON <= r * r && d2 + EPSILON >= r0 * r0;\n          }\n        };\n      };\n      Polar.prototype.convertToPixel = function (ecModel, finder, value) {\n        var coordSys = getCoordSys$2(finder);\n        return coordSys === this ? this.dataToPoint(value) : null;\n      };\n      Polar.prototype.convertFromPixel = function (ecModel, finder, pixel) {\n        var coordSys = getCoordSys$2(finder);\n        return coordSys === this ? this.pointToData(pixel) : null;\n      };\n      return Polar;\n    }();\n    function getCoordSys$2(finder) {\n      var seriesModel = finder.seriesModel;\n      var polarModel = finder.polarModel;\n      return polarModel && polarModel.coordinateSystem || seriesModel && seriesModel.coordinateSystem;\n    }\n\n    /**\r\n     * Resize method bound to the polar\r\n     */\n    function resizePolar(polar, polarModel, api) {\n      var center = polarModel.get('center');\n      var width = api.getWidth();\n      var height = api.getHeight();\n      polar.cx = parsePercent$1(center[0], width);\n      polar.cy = parsePercent$1(center[1], height);\n      var radiusAxis = polar.getRadiusAxis();\n      var size = Math.min(width, height) / 2;\n      var radius = polarModel.get('radius');\n      if (radius == null) {\n        radius = [0, '100%'];\n      } else if (!isArray(radius)) {\n        // r0 = 0\n        radius = [0, radius];\n      }\n      var parsedRadius = [parsePercent$1(radius[0], size), parsePercent$1(radius[1], size)];\n      radiusAxis.inverse ? radiusAxis.setExtent(parsedRadius[1], parsedRadius[0]) : radiusAxis.setExtent(parsedRadius[0], parsedRadius[1]);\n    }\n    /**\r\n     * Update polar\r\n     */\n    function updatePolarScale(ecModel, api) {\n      var polar = this;\n      var angleAxis = polar.getAngleAxis();\n      var radiusAxis = polar.getRadiusAxis();\n      // Reset scale\n      angleAxis.scale.setExtent(Infinity, -Infinity);\n      radiusAxis.scale.setExtent(Infinity, -Infinity);\n      ecModel.eachSeries(function (seriesModel) {\n        if (seriesModel.coordinateSystem === polar) {\n          var data_1 = seriesModel.getData();\n          each(getDataDimensionsOnAxis(data_1, 'radius'), function (dim) {\n            radiusAxis.scale.unionExtentFromData(data_1, dim);\n          });\n          each(getDataDimensionsOnAxis(data_1, 'angle'), function (dim) {\n            angleAxis.scale.unionExtentFromData(data_1, dim);\n          });\n        }\n      });\n      niceScaleExtent(angleAxis.scale, angleAxis.model);\n      niceScaleExtent(radiusAxis.scale, radiusAxis.model);\n      // Fix extent of category angle axis\n      if (angleAxis.type === 'category' && !angleAxis.onBand) {\n        var extent = angleAxis.getExtent();\n        var diff = 360 / angleAxis.scale.count();\n        angleAxis.inverse ? extent[1] += diff : extent[1] -= diff;\n        angleAxis.setExtent(extent[0], extent[1]);\n      }\n    }\n    function isAngleAxisModel(axisModel) {\n      return axisModel.mainType === 'angleAxis';\n    }\n    /**\r\n     * Set common axis properties\r\n     */\n    function setAxis(axis, axisModel) {\n      var _a;\n      axis.type = axisModel.get('type');\n      axis.scale = createScaleByModel(axisModel);\n      axis.onBand = axisModel.get('boundaryGap') && axis.type === 'category';\n      axis.inverse = axisModel.get('inverse');\n      if (isAngleAxisModel(axisModel)) {\n        axis.inverse = axis.inverse !== axisModel.get('clockwise');\n        var startAngle = axisModel.get('startAngle');\n        var endAngle = (_a = axisModel.get('endAngle')) !== null && _a !== void 0 ? _a : startAngle + (axis.inverse ? -360 : 360);\n        axis.setExtent(startAngle, endAngle);\n      }\n      // Inject axis instance\n      axisModel.axis = axis;\n      axis.model = axisModel;\n    }\n    var polarCreator = {\n      dimensions: polarDimensions,\n      create: function (ecModel, api) {\n        var polarList = [];\n        ecModel.eachComponent('polar', function (polarModel, idx) {\n          var polar = new Polar(idx + '');\n          // Inject resize and update method\n          polar.update = updatePolarScale;\n          var radiusAxis = polar.getRadiusAxis();\n          var angleAxis = polar.getAngleAxis();\n          var radiusAxisModel = polarModel.findAxisModel('radiusAxis');\n          var angleAxisModel = polarModel.findAxisModel('angleAxis');\n          setAxis(radiusAxis, radiusAxisModel);\n          setAxis(angleAxis, angleAxisModel);\n          resizePolar(polar, polarModel, api);\n          polarList.push(polar);\n          polarModel.coordinateSystem = polar;\n          polar.model = polarModel;\n        });\n        // Inject coordinateSystem to series\n        ecModel.eachSeries(function (seriesModel) {\n          if (seriesModel.get('coordinateSystem') === 'polar') {\n            var polarModel = seriesModel.getReferringComponents('polar', SINGLE_REFERRING).models[0];\n            if (\"development\" !== 'production') {\n              if (!polarModel) {\n                throw new Error('Polar \"' + retrieve(seriesModel.get('polarIndex'), seriesModel.get('polarId'), 0) + '\" not found');\n              }\n            }\n            seriesModel.coordinateSystem = polarModel.coordinateSystem;\n          }\n        });\n        return polarList;\n      }\n    };\n\n    var elementList$1 = ['axisLine', 'axisLabel', 'axisTick', 'minorTick', 'splitLine', 'minorSplitLine', 'splitArea'];\n    function getAxisLineShape(polar, rExtent, angle) {\n      rExtent[1] > rExtent[0] && (rExtent = rExtent.slice().reverse());\n      var start = polar.coordToPoint([rExtent[0], angle]);\n      var end = polar.coordToPoint([rExtent[1], angle]);\n      return {\n        x1: start[0],\n        y1: start[1],\n        x2: end[0],\n        y2: end[1]\n      };\n    }\n    function getRadiusIdx(polar) {\n      var radiusAxis = polar.getRadiusAxis();\n      return radiusAxis.inverse ? 0 : 1;\n    }\n    // Remove the last tick which will overlap the first tick\n    function fixAngleOverlap(list) {\n      var firstItem = list[0];\n      var lastItem = list[list.length - 1];\n      if (firstItem && lastItem && Math.abs(Math.abs(firstItem.coord - lastItem.coord) - 360) < 1e-4) {\n        list.pop();\n      }\n    }\n    var AngleAxisView = /** @class */function (_super) {\n      __extends(AngleAxisView, _super);\n      function AngleAxisView() {\n        var _this = _super !== null && _super.apply(this, arguments) || this;\n        _this.type = AngleAxisView.type;\n        _this.axisPointerClass = 'PolarAxisPointer';\n        return _this;\n      }\n      AngleAxisView.prototype.render = function (angleAxisModel, ecModel) {\n        this.group.removeAll();\n        if (!angleAxisModel.get('show')) {\n          return;\n        }\n        var angleAxis = angleAxisModel.axis;\n        var polar = angleAxis.polar;\n        var radiusExtent = polar.getRadiusAxis().getExtent();\n        var ticksAngles = angleAxis.getTicksCoords();\n        var minorTickAngles = angleAxis.getMinorTicksCoords();\n        var labels = map(angleAxis.getViewLabels(), function (labelItem) {\n          labelItem = clone(labelItem);\n          var scale = angleAxis.scale;\n          var tickValue = scale.type === 'ordinal' ? scale.getRawOrdinalNumber(labelItem.tickValue) : labelItem.tickValue;\n          labelItem.coord = angleAxis.dataToCoord(tickValue);\n          return labelItem;\n        });\n        fixAngleOverlap(labels);\n        fixAngleOverlap(ticksAngles);\n        each(elementList$1, function (name) {\n          if (angleAxisModel.get([name, 'show']) && (!angleAxis.scale.isBlank() || name === 'axisLine')) {\n            angelAxisElementsBuilders[name](this.group, angleAxisModel, polar, ticksAngles, minorTickAngles, radiusExtent, labels);\n          }\n        }, this);\n      };\n      AngleAxisView.type = 'angleAxis';\n      return AngleAxisView;\n    }(AxisView);\n    var angelAxisElementsBuilders = {\n      axisLine: function (group, angleAxisModel, polar, ticksAngles, minorTickAngles, radiusExtent) {\n        var lineStyleModel = angleAxisModel.getModel(['axisLine', 'lineStyle']);\n        var angleAxis = polar.getAngleAxis();\n        var RADIAN = Math.PI / 180;\n        var angleExtent = angleAxis.getExtent();\n        // extent id of the axis radius (r0 and r)\n        var rId = getRadiusIdx(polar);\n        var r0Id = rId ? 0 : 1;\n        var shape;\n        var shapeType = Math.abs(angleExtent[1] - angleExtent[0]) === 360 ? 'Circle' : 'Arc';\n        if (radiusExtent[r0Id] === 0) {\n          shape = new graphic[shapeType]({\n            shape: {\n              cx: polar.cx,\n              cy: polar.cy,\n              r: radiusExtent[rId],\n              startAngle: -angleExtent[0] * RADIAN,\n              endAngle: -angleExtent[1] * RADIAN,\n              clockwise: angleAxis.inverse\n            },\n            style: lineStyleModel.getLineStyle(),\n            z2: 1,\n            silent: true\n          });\n        } else {\n          shape = new Ring({\n            shape: {\n              cx: polar.cx,\n              cy: polar.cy,\n              r: radiusExtent[rId],\n              r0: radiusExtent[r0Id]\n            },\n            style: lineStyleModel.getLineStyle(),\n            z2: 1,\n            silent: true\n          });\n        }\n        shape.style.fill = null;\n        group.add(shape);\n      },\n      axisTick: function (group, angleAxisModel, polar, ticksAngles, minorTickAngles, radiusExtent) {\n        var tickModel = angleAxisModel.getModel('axisTick');\n        var tickLen = (tickModel.get('inside') ? -1 : 1) * tickModel.get('length');\n        var radius = radiusExtent[getRadiusIdx(polar)];\n        var lines = map(ticksAngles, function (tickAngleItem) {\n          return new Line({\n            shape: getAxisLineShape(polar, [radius, radius + tickLen], tickAngleItem.coord)\n          });\n        });\n        group.add(mergePath$1(lines, {\n          style: defaults(tickModel.getModel('lineStyle').getLineStyle(), {\n            stroke: angleAxisModel.get(['axisLine', 'lineStyle', 'color'])\n          })\n        }));\n      },\n      minorTick: function (group, angleAxisModel, polar, tickAngles, minorTickAngles, radiusExtent) {\n        if (!minorTickAngles.length) {\n          return;\n        }\n        var tickModel = angleAxisModel.getModel('axisTick');\n        var minorTickModel = angleAxisModel.getModel('minorTick');\n        var tickLen = (tickModel.get('inside') ? -1 : 1) * minorTickModel.get('length');\n        var radius = radiusExtent[getRadiusIdx(polar)];\n        var lines = [];\n        for (var i = 0; i < minorTickAngles.length; i++) {\n          for (var k = 0; k < minorTickAngles[i].length; k++) {\n            lines.push(new Line({\n              shape: getAxisLineShape(polar, [radius, radius + tickLen], minorTickAngles[i][k].coord)\n            }));\n          }\n        }\n        group.add(mergePath$1(lines, {\n          style: defaults(minorTickModel.getModel('lineStyle').getLineStyle(), defaults(tickModel.getLineStyle(), {\n            stroke: angleAxisModel.get(['axisLine', 'lineStyle', 'color'])\n          }))\n        }));\n      },\n      axisLabel: function (group, angleAxisModel, polar, ticksAngles, minorTickAngles, radiusExtent, labels) {\n        var rawCategoryData = angleAxisModel.getCategories(true);\n        var commonLabelModel = angleAxisModel.getModel('axisLabel');\n        var labelMargin = commonLabelModel.get('margin');\n        var triggerEvent = angleAxisModel.get('triggerEvent');\n        // Use length of ticksAngles because it may remove the last tick to avoid overlapping\n        each(labels, function (labelItem, idx) {\n          var labelModel = commonLabelModel;\n          var tickValue = labelItem.tickValue;\n          var r = radiusExtent[getRadiusIdx(polar)];\n          var p = polar.coordToPoint([r + labelMargin, labelItem.coord]);\n          var cx = polar.cx;\n          var cy = polar.cy;\n          var labelTextAlign = Math.abs(p[0] - cx) / r < 0.3 ? 'center' : p[0] > cx ? 'left' : 'right';\n          var labelTextVerticalAlign = Math.abs(p[1] - cy) / r < 0.3 ? 'middle' : p[1] > cy ? 'top' : 'bottom';\n          if (rawCategoryData && rawCategoryData[tickValue]) {\n            var rawCategoryItem = rawCategoryData[tickValue];\n            if (isObject(rawCategoryItem) && rawCategoryItem.textStyle) {\n              labelModel = new Model(rawCategoryItem.textStyle, commonLabelModel, commonLabelModel.ecModel);\n            }\n          }\n          var textEl = new ZRText({\n            silent: AxisBuilder.isLabelSilent(angleAxisModel),\n            style: createTextStyle(labelModel, {\n              x: p[0],\n              y: p[1],\n              fill: labelModel.getTextColor() || angleAxisModel.get(['axisLine', 'lineStyle', 'color']),\n              text: labelItem.formattedLabel,\n              align: labelTextAlign,\n              verticalAlign: labelTextVerticalAlign\n            })\n          });\n          group.add(textEl);\n          // Pack data for mouse event\n          if (triggerEvent) {\n            var eventData = AxisBuilder.makeAxisEventDataBase(angleAxisModel);\n            eventData.targetType = 'axisLabel';\n            eventData.value = labelItem.rawLabel;\n            getECData(textEl).eventData = eventData;\n          }\n        }, this);\n      },\n      splitLine: function (group, angleAxisModel, polar, ticksAngles, minorTickAngles, radiusExtent) {\n        var splitLineModel = angleAxisModel.getModel('splitLine');\n        var lineStyleModel = splitLineModel.getModel('lineStyle');\n        var lineColors = lineStyleModel.get('color');\n        var lineCount = 0;\n        lineColors = lineColors instanceof Array ? lineColors : [lineColors];\n        var splitLines = [];\n        for (var i = 0; i < ticksAngles.length; i++) {\n          var colorIndex = lineCount++ % lineColors.length;\n          splitLines[colorIndex] = splitLines[colorIndex] || [];\n          splitLines[colorIndex].push(new Line({\n            shape: getAxisLineShape(polar, radiusExtent, ticksAngles[i].coord)\n          }));\n        }\n        // Simple optimization\n        // Batching the lines if color are the same\n        for (var i = 0; i < splitLines.length; i++) {\n          group.add(mergePath$1(splitLines[i], {\n            style: defaults({\n              stroke: lineColors[i % lineColors.length]\n            }, lineStyleModel.getLineStyle()),\n            silent: true,\n            z: angleAxisModel.get('z')\n          }));\n        }\n      },\n      minorSplitLine: function (group, angleAxisModel, polar, ticksAngles, minorTickAngles, radiusExtent) {\n        if (!minorTickAngles.length) {\n          return;\n        }\n        var minorSplitLineModel = angleAxisModel.getModel('minorSplitLine');\n        var lineStyleModel = minorSplitLineModel.getModel('lineStyle');\n        var lines = [];\n        for (var i = 0; i < minorTickAngles.length; i++) {\n          for (var k = 0; k < minorTickAngles[i].length; k++) {\n            lines.push(new Line({\n              shape: getAxisLineShape(polar, radiusExtent, minorTickAngles[i][k].coord)\n            }));\n          }\n        }\n        group.add(mergePath$1(lines, {\n          style: lineStyleModel.getLineStyle(),\n          silent: true,\n          z: angleAxisModel.get('z')\n        }));\n      },\n      splitArea: function (group, angleAxisModel, polar, ticksAngles, minorTickAngles, radiusExtent) {\n        if (!ticksAngles.length) {\n          return;\n        }\n        var splitAreaModel = angleAxisModel.getModel('splitArea');\n        var areaStyleModel = splitAreaModel.getModel('areaStyle');\n        var areaColors = areaStyleModel.get('color');\n        var lineCount = 0;\n        areaColors = areaColors instanceof Array ? areaColors : [areaColors];\n        var splitAreas = [];\n        var RADIAN = Math.PI / 180;\n        var prevAngle = -ticksAngles[0].coord * RADIAN;\n        var r0 = Math.min(radiusExtent[0], radiusExtent[1]);\n        var r1 = Math.max(radiusExtent[0], radiusExtent[1]);\n        var clockwise = angleAxisModel.get('clockwise');\n        for (var i = 1, len = ticksAngles.length; i <= len; i++) {\n          var coord = i === len ? ticksAngles[0].coord : ticksAngles[i].coord;\n          var colorIndex = lineCount++ % areaColors.length;\n          splitAreas[colorIndex] = splitAreas[colorIndex] || [];\n          splitAreas[colorIndex].push(new Sector({\n            shape: {\n              cx: polar.cx,\n              cy: polar.cy,\n              r0: r0,\n              r: r1,\n              startAngle: prevAngle,\n              endAngle: -coord * RADIAN,\n              clockwise: clockwise\n            },\n            silent: true\n          }));\n          prevAngle = -coord * RADIAN;\n        }\n        // Simple optimization\n        // Batching the lines if color are the same\n        for (var i = 0; i < splitAreas.length; i++) {\n          group.add(mergePath$1(splitAreas[i], {\n            style: defaults({\n              fill: areaColors[i % areaColors.length]\n            }, areaStyleModel.getAreaStyle()),\n            silent: true\n          }));\n        }\n      }\n    };\n\n    var axisBuilderAttrs$2 = ['axisLine', 'axisTickLabel', 'axisName'];\n    var selfBuilderAttrs$1 = ['splitLine', 'splitArea', 'minorSplitLine'];\n    var RadiusAxisView = /** @class */function (_super) {\n      __extends(RadiusAxisView, _super);\n      function RadiusAxisView() {\n        var _this = _super !== null && _super.apply(this, arguments) || this;\n        _this.type = RadiusAxisView.type;\n        _this.axisPointerClass = 'PolarAxisPointer';\n        return _this;\n      }\n      RadiusAxisView.prototype.render = function (radiusAxisModel, ecModel) {\n        this.group.removeAll();\n        if (!radiusAxisModel.get('show')) {\n          return;\n        }\n        var oldAxisGroup = this._axisGroup;\n        var newAxisGroup = this._axisGroup = new Group();\n        this.group.add(newAxisGroup);\n        var radiusAxis = radiusAxisModel.axis;\n        var polar = radiusAxis.polar;\n        var angleAxis = polar.getAngleAxis();\n        var ticksCoords = radiusAxis.getTicksCoords();\n        var minorTicksCoords = radiusAxis.getMinorTicksCoords();\n        var axisAngle = angleAxis.getExtent()[0];\n        var radiusExtent = radiusAxis.getExtent();\n        var layout = layoutAxis(polar, radiusAxisModel, axisAngle);\n        var axisBuilder = new AxisBuilder(radiusAxisModel, layout);\n        each(axisBuilderAttrs$2, axisBuilder.add, axisBuilder);\n        newAxisGroup.add(axisBuilder.getGroup());\n        groupTransition(oldAxisGroup, newAxisGroup, radiusAxisModel);\n        each(selfBuilderAttrs$1, function (name) {\n          if (radiusAxisModel.get([name, 'show']) && !radiusAxis.scale.isBlank()) {\n            axisElementBuilders$1[name](this.group, radiusAxisModel, polar, axisAngle, radiusExtent, ticksCoords, minorTicksCoords);\n          }\n        }, this);\n      };\n      RadiusAxisView.type = 'radiusAxis';\n      return RadiusAxisView;\n    }(AxisView);\n    var axisElementBuilders$1 = {\n      splitLine: function (group, radiusAxisModel, polar, axisAngle, radiusExtent, ticksCoords) {\n        var splitLineModel = radiusAxisModel.getModel('splitLine');\n        var lineStyleModel = splitLineModel.getModel('lineStyle');\n        var lineColors = lineStyleModel.get('color');\n        var lineCount = 0;\n        var angleAxis = polar.getAngleAxis();\n        var RADIAN = Math.PI / 180;\n        var angleExtent = angleAxis.getExtent();\n        var shapeType = Math.abs(angleExtent[1] - angleExtent[0]) === 360 ? 'Circle' : 'Arc';\n        lineColors = lineColors instanceof Array ? lineColors : [lineColors];\n        var splitLines = [];\n        for (var i = 0; i < ticksCoords.length; i++) {\n          var colorIndex = lineCount++ % lineColors.length;\n          splitLines[colorIndex] = splitLines[colorIndex] || [];\n          splitLines[colorIndex].push(new graphic[shapeType]({\n            shape: {\n              cx: polar.cx,\n              cy: polar.cy,\n              // ensure circle radius >= 0\n              r: Math.max(ticksCoords[i].coord, 0),\n              startAngle: -angleExtent[0] * RADIAN,\n              endAngle: -angleExtent[1] * RADIAN,\n              clockwise: angleAxis.inverse\n            }\n          }));\n        }\n        // Simple optimization\n        // Batching the lines if color are the same\n        for (var i = 0; i < splitLines.length; i++) {\n          group.add(mergePath$1(splitLines[i], {\n            style: defaults({\n              stroke: lineColors[i % lineColors.length],\n              fill: null\n            }, lineStyleModel.getLineStyle()),\n            silent: true\n          }));\n        }\n      },\n      minorSplitLine: function (group, radiusAxisModel, polar, axisAngle, radiusExtent, ticksCoords, minorTicksCoords) {\n        if (!minorTicksCoords.length) {\n          return;\n        }\n        var minorSplitLineModel = radiusAxisModel.getModel('minorSplitLine');\n        var lineStyleModel = minorSplitLineModel.getModel('lineStyle');\n        var lines = [];\n        for (var i = 0; i < minorTicksCoords.length; i++) {\n          for (var k = 0; k < minorTicksCoords[i].length; k++) {\n            lines.push(new Circle({\n              shape: {\n                cx: polar.cx,\n                cy: polar.cy,\n                r: minorTicksCoords[i][k].coord\n              }\n            }));\n          }\n        }\n        group.add(mergePath$1(lines, {\n          style: defaults({\n            fill: null\n          }, lineStyleModel.getLineStyle()),\n          silent: true\n        }));\n      },\n      splitArea: function (group, radiusAxisModel, polar, axisAngle, radiusExtent, ticksCoords) {\n        if (!ticksCoords.length) {\n          return;\n        }\n        var splitAreaModel = radiusAxisModel.getModel('splitArea');\n        var areaStyleModel = splitAreaModel.getModel('areaStyle');\n        var areaColors = areaStyleModel.get('color');\n        var lineCount = 0;\n        areaColors = areaColors instanceof Array ? areaColors : [areaColors];\n        var splitAreas = [];\n        var prevRadius = ticksCoords[0].coord;\n        for (var i = 1; i < ticksCoords.length; i++) {\n          var colorIndex = lineCount++ % areaColors.length;\n          splitAreas[colorIndex] = splitAreas[colorIndex] || [];\n          splitAreas[colorIndex].push(new Sector({\n            shape: {\n              cx: polar.cx,\n              cy: polar.cy,\n              r0: prevRadius,\n              r: ticksCoords[i].coord,\n              startAngle: 0,\n              endAngle: Math.PI * 2\n            },\n            silent: true\n          }));\n          prevRadius = ticksCoords[i].coord;\n        }\n        // Simple optimization\n        // Batching the lines if color are the same\n        for (var i = 0; i < splitAreas.length; i++) {\n          group.add(mergePath$1(splitAreas[i], {\n            style: defaults({\n              fill: areaColors[i % areaColors.length]\n            }, areaStyleModel.getAreaStyle()),\n            silent: true\n          }));\n        }\n      }\n    };\n    /**\r\n     * @inner\r\n     */\n    function layoutAxis(polar, radiusAxisModel, axisAngle) {\n      return {\n        position: [polar.cx, polar.cy],\n        rotation: axisAngle / 180 * Math.PI,\n        labelDirection: -1,\n        tickDirection: -1,\n        nameDirection: 1,\n        labelRotate: radiusAxisModel.getModel('axisLabel').get('rotate'),\n        // Over splitLine and splitArea\n        z2: 1\n      };\n    }\n\n    function getSeriesStackId$1(seriesModel) {\n      return seriesModel.get('stack') || '__ec_stack_' + seriesModel.seriesIndex;\n    }\n    function getAxisKey$1(polar, axis) {\n      return axis.dim + polar.model.componentIndex;\n    }\n    function barLayoutPolar(seriesType, ecModel, api) {\n      var lastStackCoords = {};\n      var barWidthAndOffset = calRadialBar(filter(ecModel.getSeriesByType(seriesType), function (seriesModel) {\n        return !ecModel.isSeriesFiltered(seriesModel) && seriesModel.coordinateSystem && seriesModel.coordinateSystem.type === 'polar';\n      }));\n      ecModel.eachSeriesByType(seriesType, function (seriesModel) {\n        // Check series coordinate, do layout for polar only\n        if (seriesModel.coordinateSystem.type !== 'polar') {\n          return;\n        }\n        var data = seriesModel.getData();\n        var polar = seriesModel.coordinateSystem;\n        var baseAxis = polar.getBaseAxis();\n        var axisKey = getAxisKey$1(polar, baseAxis);\n        var stackId = getSeriesStackId$1(seriesModel);\n        var columnLayoutInfo = barWidthAndOffset[axisKey][stackId];\n        var columnOffset = columnLayoutInfo.offset;\n        var columnWidth = columnLayoutInfo.width;\n        var valueAxis = polar.getOtherAxis(baseAxis);\n        var cx = seriesModel.coordinateSystem.cx;\n        var cy = seriesModel.coordinateSystem.cy;\n        var barMinHeight = seriesModel.get('barMinHeight') || 0;\n        var barMinAngle = seriesModel.get('barMinAngle') || 0;\n        lastStackCoords[stackId] = lastStackCoords[stackId] || [];\n        var valueDim = data.mapDimension(valueAxis.dim);\n        var baseDim = data.mapDimension(baseAxis.dim);\n        var stacked = isDimensionStacked(data, valueDim /* , baseDim */);\n        var clampLayout = baseAxis.dim !== 'radius' || !seriesModel.get('roundCap', true);\n        var valueAxisModel = valueAxis.model;\n        var startValue = valueAxisModel.get('startValue');\n        var valueAxisStart = valueAxis.dataToCoord(startValue || 0);\n        for (var idx = 0, len = data.count(); idx < len; idx++) {\n          var value = data.get(valueDim, idx);\n          var baseValue = data.get(baseDim, idx);\n          var sign = value >= 0 ? 'p' : 'n';\n          var baseCoord = valueAxisStart;\n          // Because of the barMinHeight, we can not use the value in\n          // stackResultDimension directly.\n          // Only ordinal axis can be stacked.\n          if (stacked) {\n            if (!lastStackCoords[stackId][baseValue]) {\n              lastStackCoords[stackId][baseValue] = {\n                p: valueAxisStart,\n                n: valueAxisStart // Negative stack\n              };\n            }\n            // Should also consider #4243\n            baseCoord = lastStackCoords[stackId][baseValue][sign];\n          }\n          var r0 = void 0;\n          var r = void 0;\n          var startAngle = void 0;\n          var endAngle = void 0;\n          // radial sector\n          if (valueAxis.dim === 'radius') {\n            var radiusSpan = valueAxis.dataToCoord(value) - valueAxisStart;\n            var angle = baseAxis.dataToCoord(baseValue);\n            if (Math.abs(radiusSpan) < barMinHeight) {\n              radiusSpan = (radiusSpan < 0 ? -1 : 1) * barMinHeight;\n            }\n            r0 = baseCoord;\n            r = baseCoord + radiusSpan;\n            startAngle = angle - columnOffset;\n            endAngle = startAngle - columnWidth;\n            stacked && (lastStackCoords[stackId][baseValue][sign] = r);\n          }\n          // tangential sector\n          else {\n            var angleSpan = valueAxis.dataToCoord(value, clampLayout) - valueAxisStart;\n            var radius = baseAxis.dataToCoord(baseValue);\n            if (Math.abs(angleSpan) < barMinAngle) {\n              angleSpan = (angleSpan < 0 ? -1 : 1) * barMinAngle;\n            }\n            r0 = radius + columnOffset;\n            r = r0 + columnWidth;\n            startAngle = baseCoord;\n            endAngle = baseCoord + angleSpan;\n            // if the previous stack is at the end of the ring,\n            // add a round to differentiate it from origin\n            // let extent = angleAxis.getExtent();\n            // let stackCoord = angle;\n            // if (stackCoord === extent[0] && value > 0) {\n            //     stackCoord = extent[1];\n            // }\n            // else if (stackCoord === extent[1] && value < 0) {\n            //     stackCoord = extent[0];\n            // }\n            stacked && (lastStackCoords[stackId][baseValue][sign] = endAngle);\n          }\n          data.setItemLayout(idx, {\n            cx: cx,\n            cy: cy,\n            r0: r0,\n            r: r,\n            // Consider that positive angle is anti-clockwise,\n            // while positive radian of sector is clockwise\n            startAngle: -startAngle * Math.PI / 180,\n            endAngle: -endAngle * Math.PI / 180,\n            /**\r\n             * Keep the same logic with bar in catesion: use end value to\r\n             * control direction. Notice that if clockwise is true (by\r\n             * default), the sector will always draw clockwisely, no matter\r\n             * whether endAngle is greater or less than startAngle.\r\n             */\n            clockwise: startAngle >= endAngle\n          });\n        }\n      });\n    }\n    /**\r\n     * Calculate bar width and offset for radial bar charts\r\n     */\n    function calRadialBar(barSeries) {\n      // Columns info on each category axis. Key is polar name\n      var columnsMap = {};\n      each(barSeries, function (seriesModel, idx) {\n        var data = seriesModel.getData();\n        var polar = seriesModel.coordinateSystem;\n        var baseAxis = polar.getBaseAxis();\n        var axisKey = getAxisKey$1(polar, baseAxis);\n        var axisExtent = baseAxis.getExtent();\n        var bandWidth = baseAxis.type === 'category' ? baseAxis.getBandWidth() : Math.abs(axisExtent[1] - axisExtent[0]) / data.count();\n        var columnsOnAxis = columnsMap[axisKey] || {\n          bandWidth: bandWidth,\n          remainedWidth: bandWidth,\n          autoWidthCount: 0,\n          categoryGap: '20%',\n          gap: '30%',\n          stacks: {}\n        };\n        var stacks = columnsOnAxis.stacks;\n        columnsMap[axisKey] = columnsOnAxis;\n        var stackId = getSeriesStackId$1(seriesModel);\n        if (!stacks[stackId]) {\n          columnsOnAxis.autoWidthCount++;\n        }\n        stacks[stackId] = stacks[stackId] || {\n          width: 0,\n          maxWidth: 0\n        };\n        var barWidth = parsePercent$1(seriesModel.get('barWidth'), bandWidth);\n        var barMaxWidth = parsePercent$1(seriesModel.get('barMaxWidth'), bandWidth);\n        var barGap = seriesModel.get('barGap');\n        var barCategoryGap = seriesModel.get('barCategoryGap');\n        if (barWidth && !stacks[stackId].width) {\n          barWidth = Math.min(columnsOnAxis.remainedWidth, barWidth);\n          stacks[stackId].width = barWidth;\n          columnsOnAxis.remainedWidth -= barWidth;\n        }\n        barMaxWidth && (stacks[stackId].maxWidth = barMaxWidth);\n        barGap != null && (columnsOnAxis.gap = barGap);\n        barCategoryGap != null && (columnsOnAxis.categoryGap = barCategoryGap);\n      });\n      var result = {};\n      each(columnsMap, function (columnsOnAxis, coordSysName) {\n        result[coordSysName] = {};\n        var stacks = columnsOnAxis.stacks;\n        var bandWidth = columnsOnAxis.bandWidth;\n        var categoryGap = parsePercent$1(columnsOnAxis.categoryGap, bandWidth);\n        var barGapPercent = parsePercent$1(columnsOnAxis.gap, 1);\n        var remainedWidth = columnsOnAxis.remainedWidth;\n        var autoWidthCount = columnsOnAxis.autoWidthCount;\n        var autoWidth = (remainedWidth - categoryGap) / (autoWidthCount + (autoWidthCount - 1) * barGapPercent);\n        autoWidth = Math.max(autoWidth, 0);\n        // Find if any auto calculated bar exceeded maxBarWidth\n        each(stacks, function (column, stack) {\n          var maxWidth = column.maxWidth;\n          if (maxWidth && maxWidth < autoWidth) {\n            maxWidth = Math.min(maxWidth, remainedWidth);\n            if (column.width) {\n              maxWidth = Math.min(maxWidth, column.width);\n            }\n            remainedWidth -= maxWidth;\n            column.width = maxWidth;\n            autoWidthCount--;\n          }\n        });\n        // Recalculate width again\n        autoWidth = (remainedWidth - categoryGap) / (autoWidthCount + (autoWidthCount - 1) * barGapPercent);\n        autoWidth = Math.max(autoWidth, 0);\n        var widthSum = 0;\n        var lastColumn;\n        each(stacks, function (column, idx) {\n          if (!column.width) {\n            column.width = autoWidth;\n          }\n          lastColumn = column;\n          widthSum += column.width * (1 + barGapPercent);\n        });\n        if (lastColumn) {\n          widthSum -= lastColumn.width * barGapPercent;\n        }\n        var offset = -widthSum / 2;\n        each(stacks, function (column, stackId) {\n          result[coordSysName][stackId] = result[coordSysName][stackId] || {\n            offset: offset,\n            width: column.width\n          };\n          offset += column.width * (1 + barGapPercent);\n        });\n      });\n      return result;\n    }\n\n    var angleAxisExtraOption = {\n      startAngle: 90,\n      clockwise: true,\n      splitNumber: 12,\n      axisLabel: {\n        rotate: 0\n      }\n    };\n    var radiusAxisExtraOption = {\n      splitNumber: 5\n    };\n    var PolarView = /** @class */function (_super) {\n      __extends(PolarView, _super);\n      function PolarView() {\n        var _this = _super !== null && _super.apply(this, arguments) || this;\n        _this.type = PolarView.type;\n        return _this;\n      }\n      PolarView.type = 'polar';\n      return PolarView;\n    }(ComponentView);\n    function install$u(registers) {\n      use(install$s);\n      AxisView.registerAxisPointerClass('PolarAxisPointer', PolarAxisPointer);\n      registers.registerCoordinateSystem('polar', polarCreator);\n      registers.registerComponentModel(PolarModel);\n      registers.registerComponentView(PolarView);\n      // Model and view for angleAxis and radiusAxis\n      axisModelCreator(registers, 'angle', AngleAxisModel, angleAxisExtraOption);\n      axisModelCreator(registers, 'radius', RadiusAxisModel, radiusAxisExtraOption);\n      registers.registerComponentView(AngleAxisView);\n      registers.registerComponentView(RadiusAxisView);\n      registers.registerLayout(curry(barLayoutPolar, 'bar'));\n    }\n\n    function layout$2(axisModel, opt) {\n      opt = opt || {};\n      var single = axisModel.coordinateSystem;\n      var axis = axisModel.axis;\n      var layout = {};\n      var axisPosition = axis.position;\n      var orient = axis.orient;\n      var rect = single.getRect();\n      var rectBound = [rect.x, rect.x + rect.width, rect.y, rect.y + rect.height];\n      var positionMap = {\n        horizontal: {\n          top: rectBound[2],\n          bottom: rectBound[3]\n        },\n        vertical: {\n          left: rectBound[0],\n          right: rectBound[1]\n        }\n      };\n      layout.position = [orient === 'vertical' ? positionMap.vertical[axisPosition] : rectBound[0], orient === 'horizontal' ? positionMap.horizontal[axisPosition] : rectBound[3]];\n      var r = {\n        horizontal: 0,\n        vertical: 1\n      };\n      layout.rotation = Math.PI / 2 * r[orient];\n      var directionMap = {\n        top: -1,\n        bottom: 1,\n        right: 1,\n        left: -1\n      };\n      layout.labelDirection = layout.tickDirection = layout.nameDirection = directionMap[axisPosition];\n      if (axisModel.get(['axisTick', 'inside'])) {\n        layout.tickDirection = -layout.tickDirection;\n      }\n      if (retrieve(opt.labelInside, axisModel.get(['axisLabel', 'inside']))) {\n        layout.labelDirection = -layout.labelDirection;\n      }\n      var labelRotation = opt.rotate;\n      labelRotation == null && (labelRotation = axisModel.get(['axisLabel', 'rotate']));\n      layout.labelRotation = axisPosition === 'top' ? -labelRotation : labelRotation;\n      layout.z2 = 1;\n      return layout;\n    }\n\n    var axisBuilderAttrs$3 = ['axisLine', 'axisTickLabel', 'axisName'];\n    var selfBuilderAttrs$2 = ['splitArea', 'splitLine'];\n    var SingleAxisView = /** @class */function (_super) {\n      __extends(SingleAxisView, _super);\n      function SingleAxisView() {\n        var _this = _super !== null && _super.apply(this, arguments) || this;\n        _this.type = SingleAxisView.type;\n        _this.axisPointerClass = 'SingleAxisPointer';\n        return _this;\n      }\n      SingleAxisView.prototype.render = function (axisModel, ecModel, api, payload) {\n        var group = this.group;\n        group.removeAll();\n        var oldAxisGroup = this._axisGroup;\n        this._axisGroup = new Group();\n        var layout = layout$2(axisModel);\n        var axisBuilder = new AxisBuilder(axisModel, layout);\n        each(axisBuilderAttrs$3, axisBuilder.add, axisBuilder);\n        group.add(this._axisGroup);\n        group.add(axisBuilder.getGroup());\n        each(selfBuilderAttrs$2, function (name) {\n          if (axisModel.get([name, 'show'])) {\n            axisElementBuilders$2[name](this, this.group, this._axisGroup, axisModel);\n          }\n        }, this);\n        groupTransition(oldAxisGroup, this._axisGroup, axisModel);\n        _super.prototype.render.call(this, axisModel, ecModel, api, payload);\n      };\n      SingleAxisView.prototype.remove = function () {\n        rectCoordAxisHandleRemove(this);\n      };\n      SingleAxisView.type = 'singleAxis';\n      return SingleAxisView;\n    }(AxisView);\n    var axisElementBuilders$2 = {\n      splitLine: function (axisView, group, axisGroup, axisModel) {\n        var axis = axisModel.axis;\n        if (axis.scale.isBlank()) {\n          return;\n        }\n        var splitLineModel = axisModel.getModel('splitLine');\n        var lineStyleModel = splitLineModel.getModel('lineStyle');\n        var lineColors = lineStyleModel.get('color');\n        lineColors = lineColors instanceof Array ? lineColors : [lineColors];\n        var lineWidth = lineStyleModel.get('width');\n        var gridRect = axisModel.coordinateSystem.getRect();\n        var isHorizontal = axis.isHorizontal();\n        var splitLines = [];\n        var lineCount = 0;\n        var ticksCoords = axis.getTicksCoords({\n          tickModel: splitLineModel\n        });\n        var p1 = [];\n        var p2 = [];\n        for (var i = 0; i < ticksCoords.length; ++i) {\n          var tickCoord = axis.toGlobalCoord(ticksCoords[i].coord);\n          if (isHorizontal) {\n            p1[0] = tickCoord;\n            p1[1] = gridRect.y;\n            p2[0] = tickCoord;\n            p2[1] = gridRect.y + gridRect.height;\n          } else {\n            p1[0] = gridRect.x;\n            p1[1] = tickCoord;\n            p2[0] = gridRect.x + gridRect.width;\n            p2[1] = tickCoord;\n          }\n          var line = new Line({\n            shape: {\n              x1: p1[0],\n              y1: p1[1],\n              x2: p2[0],\n              y2: p2[1]\n            },\n            silent: true\n          });\n          subPixelOptimizeLine$1(line.shape, lineWidth);\n          var colorIndex = lineCount++ % lineColors.length;\n          splitLines[colorIndex] = splitLines[colorIndex] || [];\n          splitLines[colorIndex].push(line);\n        }\n        var lineStyle = lineStyleModel.getLineStyle(['color']);\n        for (var i = 0; i < splitLines.length; ++i) {\n          group.add(mergePath$1(splitLines[i], {\n            style: defaults({\n              stroke: lineColors[i % lineColors.length]\n            }, lineStyle),\n            silent: true\n          }));\n        }\n      },\n      splitArea: function (axisView, group, axisGroup, axisModel) {\n        rectCoordAxisBuildSplitArea(axisView, axisGroup, axisModel, axisModel);\n      }\n    };\n\n    var SingleAxisModel = /** @class */function (_super) {\n      __extends(SingleAxisModel, _super);\n      function SingleAxisModel() {\n        var _this = _super !== null && _super.apply(this, arguments) || this;\n        _this.type = SingleAxisModel.type;\n        return _this;\n      }\n      SingleAxisModel.prototype.getCoordSysModel = function () {\n        return this;\n      };\n      SingleAxisModel.type = 'singleAxis';\n      SingleAxisModel.layoutMode = 'box';\n      SingleAxisModel.defaultOption = {\n        left: '5%',\n        top: '5%',\n        right: '5%',\n        bottom: '5%',\n        type: 'value',\n        position: 'bottom',\n        orient: 'horizontal',\n        axisLine: {\n          show: true,\n          lineStyle: {\n            width: 1,\n            type: 'solid'\n          }\n        },\n        // Single coordinate system and single axis is the,\n        // which is used as the parent tooltip model.\n        // same model, so we set default tooltip show as true.\n        tooltip: {\n          show: true\n        },\n        axisTick: {\n          show: true,\n          length: 6,\n          lineStyle: {\n            width: 1\n          }\n        },\n        axisLabel: {\n          show: true,\n          interval: 'auto'\n        },\n        splitLine: {\n          show: true,\n          lineStyle: {\n            type: 'dashed',\n            opacity: 0.2\n          }\n        }\n      };\n      return SingleAxisModel;\n    }(ComponentModel);\n    mixin(SingleAxisModel, AxisModelCommonMixin.prototype);\n\n    var SingleAxis = /** @class */function (_super) {\n      __extends(SingleAxis, _super);\n      function SingleAxis(dim, scale, coordExtent, axisType, position) {\n        var _this = _super.call(this, dim, scale, coordExtent) || this;\n        _this.type = axisType || 'value';\n        _this.position = position || 'bottom';\n        return _this;\n      }\n      /**\r\n       * Judge the orient of the axis.\r\n       */\n      SingleAxis.prototype.isHorizontal = function () {\n        var position = this.position;\n        return position === 'top' || position === 'bottom';\n      };\n      SingleAxis.prototype.pointToData = function (point, clamp) {\n        return this.coordinateSystem.pointToData(point)[0];\n      };\n      return SingleAxis;\n    }(Axis);\n\n    var singleDimensions = ['single'];\n    /**\r\n     * Create a single coordinates system.\r\n     */\n    var Single = /** @class */function () {\n      function Single(axisModel, ecModel, api) {\n        this.type = 'single';\n        this.dimension = 'single';\n        /**\r\n         * Add it just for draw tooltip.\r\n         */\n        this.dimensions = singleDimensions;\n        this.axisPointerEnabled = true;\n        this.model = axisModel;\n        this._init(axisModel, ecModel, api);\n      }\n      /**\r\n       * Initialize single coordinate system.\r\n       */\n      Single.prototype._init = function (axisModel, ecModel, api) {\n        var dim = this.dimension;\n        var axis = new SingleAxis(dim, createScaleByModel(axisModel), [0, 0], axisModel.get('type'), axisModel.get('position'));\n        var isCategory = axis.type === 'category';\n        axis.onBand = isCategory && axisModel.get('boundaryGap');\n        axis.inverse = axisModel.get('inverse');\n        axis.orient = axisModel.get('orient');\n        axisModel.axis = axis;\n        axis.model = axisModel;\n        axis.coordinateSystem = this;\n        this._axis = axis;\n      };\n      /**\r\n       * Update axis scale after data processed\r\n       */\n      Single.prototype.update = function (ecModel, api) {\n        ecModel.eachSeries(function (seriesModel) {\n          if (seriesModel.coordinateSystem === this) {\n            var data_1 = seriesModel.getData();\n            each(data_1.mapDimensionsAll(this.dimension), function (dim) {\n              this._axis.scale.unionExtentFromData(data_1, dim);\n            }, this);\n            niceScaleExtent(this._axis.scale, this._axis.model);\n          }\n        }, this);\n      };\n      /**\r\n       * Resize the single coordinate system.\r\n       */\n      Single.prototype.resize = function (axisModel, api) {\n        this._rect = getLayoutRect({\n          left: axisModel.get('left'),\n          top: axisModel.get('top'),\n          right: axisModel.get('right'),\n          bottom: axisModel.get('bottom'),\n          width: axisModel.get('width'),\n          height: axisModel.get('height')\n        }, {\n          width: api.getWidth(),\n          height: api.getHeight()\n        });\n        this._adjustAxis();\n      };\n      Single.prototype.getRect = function () {\n        return this._rect;\n      };\n      Single.prototype._adjustAxis = function () {\n        var rect = this._rect;\n        var axis = this._axis;\n        var isHorizontal = axis.isHorizontal();\n        var extent = isHorizontal ? [0, rect.width] : [0, rect.height];\n        var idx = axis.inverse ? 1 : 0;\n        axis.setExtent(extent[idx], extent[1 - idx]);\n        this._updateAxisTransform(axis, isHorizontal ? rect.x : rect.y);\n      };\n      Single.prototype._updateAxisTransform = function (axis, coordBase) {\n        var axisExtent = axis.getExtent();\n        var extentSum = axisExtent[0] + axisExtent[1];\n        var isHorizontal = axis.isHorizontal();\n        axis.toGlobalCoord = isHorizontal ? function (coord) {\n          return coord + coordBase;\n        } : function (coord) {\n          return extentSum - coord + coordBase;\n        };\n        axis.toLocalCoord = isHorizontal ? function (coord) {\n          return coord - coordBase;\n        } : function (coord) {\n          return extentSum - coord + coordBase;\n        };\n      };\n      /**\r\n       * Get axis.\r\n       */\n      Single.prototype.getAxis = function () {\n        return this._axis;\n      };\n      /**\r\n       * Get axis, add it just for draw tooltip.\r\n       */\n      Single.prototype.getBaseAxis = function () {\n        return this._axis;\n      };\n      Single.prototype.getAxes = function () {\n        return [this._axis];\n      };\n      Single.prototype.getTooltipAxes = function () {\n        return {\n          baseAxes: [this.getAxis()],\n          // Empty otherAxes\n          otherAxes: []\n        };\n      };\n      /**\r\n       * If contain point.\r\n       */\n      Single.prototype.containPoint = function (point) {\n        var rect = this.getRect();\n        var axis = this.getAxis();\n        var orient = axis.orient;\n        if (orient === 'horizontal') {\n          return axis.contain(axis.toLocalCoord(point[0])) && point[1] >= rect.y && point[1] <= rect.y + rect.height;\n        } else {\n          return axis.contain(axis.toLocalCoord(point[1])) && point[0] >= rect.y && point[0] <= rect.y + rect.height;\n        }\n      };\n      Single.prototype.pointToData = function (point) {\n        var axis = this.getAxis();\n        return [axis.coordToData(axis.toLocalCoord(point[axis.orient === 'horizontal' ? 0 : 1]))];\n      };\n      /**\r\n       * Convert the series data to concrete point.\r\n       * Can be [val] | val\r\n       */\n      Single.prototype.dataToPoint = function (val) {\n        var axis = this.getAxis();\n        var rect = this.getRect();\n        var pt = [];\n        var idx = axis.orient === 'horizontal' ? 0 : 1;\n        if (val instanceof Array) {\n          val = val[0];\n        }\n        pt[idx] = axis.toGlobalCoord(axis.dataToCoord(+val));\n        pt[1 - idx] = idx === 0 ? rect.y + rect.height / 2 : rect.x + rect.width / 2;\n        return pt;\n      };\n      Single.prototype.convertToPixel = function (ecModel, finder, value) {\n        var coordSys = getCoordSys$3(finder);\n        return coordSys === this ? this.dataToPoint(value) : null;\n      };\n      Single.prototype.convertFromPixel = function (ecModel, finder, pixel) {\n        var coordSys = getCoordSys$3(finder);\n        return coordSys === this ? this.pointToData(pixel) : null;\n      };\n      return Single;\n    }();\n    function getCoordSys$3(finder) {\n      var seriesModel = finder.seriesModel;\n      var singleModel = finder.singleAxisModel;\n      return singleModel && singleModel.coordinateSystem || seriesModel && seriesModel.coordinateSystem;\n    }\n\n    /**\r\n     * Create single coordinate system and inject it into seriesModel.\r\n     */\n    function create$2(ecModel, api) {\n      var singles = [];\n      ecModel.eachComponent('singleAxis', function (axisModel, idx) {\n        var single = new Single(axisModel, ecModel, api);\n        single.name = 'single_' + idx;\n        single.resize(axisModel, api);\n        axisModel.coordinateSystem = single;\n        singles.push(single);\n      });\n      ecModel.eachSeries(function (seriesModel) {\n        if (seriesModel.get('coordinateSystem') === 'singleAxis') {\n          var singleAxisModel = seriesModel.getReferringComponents('singleAxis', SINGLE_REFERRING).models[0];\n          seriesModel.coordinateSystem = singleAxisModel && singleAxisModel.coordinateSystem;\n        }\n      });\n      return singles;\n    }\n    var singleCreator = {\n      create: create$2,\n      dimensions: singleDimensions\n    };\n\n    var XY = ['x', 'y'];\n    var WH = ['width', 'height'];\n    var SingleAxisPointer = /** @class */function (_super) {\n      __extends(SingleAxisPointer, _super);\n      function SingleAxisPointer() {\n        return _super !== null && _super.apply(this, arguments) || this;\n      }\n      /**\r\n       * @override\r\n       */\n      SingleAxisPointer.prototype.makeElOption = function (elOption, value, axisModel, axisPointerModel, api) {\n        var axis = axisModel.axis;\n        var coordSys = axis.coordinateSystem;\n        var otherExtent = getGlobalExtent(coordSys, 1 - getPointDimIndex(axis));\n        var pixelValue = coordSys.dataToPoint(value)[0];\n        var axisPointerType = axisPointerModel.get('type');\n        if (axisPointerType && axisPointerType !== 'none') {\n          var elStyle = buildElStyle(axisPointerModel);\n          var pointerOption = pointerShapeBuilder$2[axisPointerType](axis, pixelValue, otherExtent);\n          pointerOption.style = elStyle;\n          elOption.graphicKey = pointerOption.type;\n          elOption.pointer = pointerOption;\n        }\n        var layoutInfo = layout$2(axisModel);\n        buildCartesianSingleLabelElOption(\n        // @ts-ignore\n        value, elOption, layoutInfo, axisModel, axisPointerModel, api);\n      };\n      /**\r\n       * @override\r\n       */\n      SingleAxisPointer.prototype.getHandleTransform = function (value, axisModel, axisPointerModel) {\n        var layoutInfo = layout$2(axisModel, {\n          labelInside: false\n        });\n        // @ts-ignore\n        layoutInfo.labelMargin = axisPointerModel.get(['handle', 'margin']);\n        var position = getTransformedPosition(axisModel.axis, value, layoutInfo);\n        return {\n          x: position[0],\n          y: position[1],\n          rotation: layoutInfo.rotation + (layoutInfo.labelDirection < 0 ? Math.PI : 0)\n        };\n      };\n      /**\r\n       * @override\r\n       */\n      SingleAxisPointer.prototype.updateHandleTransform = function (transform, delta, axisModel, axisPointerModel) {\n        var axis = axisModel.axis;\n        var coordSys = axis.coordinateSystem;\n        var dimIndex = getPointDimIndex(axis);\n        var axisExtent = getGlobalExtent(coordSys, dimIndex);\n        var currPosition = [transform.x, transform.y];\n        currPosition[dimIndex] += delta[dimIndex];\n        currPosition[dimIndex] = Math.min(axisExtent[1], currPosition[dimIndex]);\n        currPosition[dimIndex] = Math.max(axisExtent[0], currPosition[dimIndex]);\n        var otherExtent = getGlobalExtent(coordSys, 1 - dimIndex);\n        var cursorOtherValue = (otherExtent[1] + otherExtent[0]) / 2;\n        var cursorPoint = [cursorOtherValue, cursorOtherValue];\n        cursorPoint[dimIndex] = currPosition[dimIndex];\n        return {\n          x: currPosition[0],\n          y: currPosition[1],\n          rotation: transform.rotation,\n          cursorPoint: cursorPoint,\n          tooltipOption: {\n            verticalAlign: 'middle'\n          }\n        };\n      };\n      return SingleAxisPointer;\n    }(BaseAxisPointer);\n    var pointerShapeBuilder$2 = {\n      line: function (axis, pixelValue, otherExtent) {\n        var targetShape = makeLineShape([pixelValue, otherExtent[0]], [pixelValue, otherExtent[1]], getPointDimIndex(axis));\n        return {\n          type: 'Line',\n          subPixelOptimize: true,\n          shape: targetShape\n        };\n      },\n      shadow: function (axis, pixelValue, otherExtent) {\n        var bandWidth = axis.getBandWidth();\n        var span = otherExtent[1] - otherExtent[0];\n        return {\n          type: 'Rect',\n          shape: makeRectShape([pixelValue - bandWidth / 2, otherExtent[0]], [bandWidth, span], getPointDimIndex(axis))\n        };\n      }\n    };\n    function getPointDimIndex(axis) {\n      return axis.isHorizontal() ? 0 : 1;\n    }\n    function getGlobalExtent(coordSys, dimIndex) {\n      var rect = coordSys.getRect();\n      return [rect[XY[dimIndex]], rect[XY[dimIndex]] + rect[WH[dimIndex]]];\n    }\n\n    var SingleView = /** @class */function (_super) {\n      __extends(SingleView, _super);\n      function SingleView() {\n        var _this = _super !== null && _super.apply(this, arguments) || this;\n        _this.type = SingleView.type;\n        return _this;\n      }\n      SingleView.type = 'single';\n      return SingleView;\n    }(ComponentView);\n    function install$v(registers) {\n      use(install$s);\n      AxisView.registerAxisPointerClass('SingleAxisPointer', SingleAxisPointer);\n      registers.registerComponentView(SingleView);\n      // Axis\n      registers.registerComponentView(SingleAxisView);\n      registers.registerComponentModel(SingleAxisModel);\n      axisModelCreator(registers, 'single', SingleAxisModel, SingleAxisModel.defaultOption);\n      registers.registerCoordinateSystem('single', singleCreator);\n    }\n\n    var CalendarModel = /** @class */function (_super) {\n      __extends(CalendarModel, _super);\n      function CalendarModel() {\n        var _this = _super !== null && _super.apply(this, arguments) || this;\n        _this.type = CalendarModel.type;\n        return _this;\n      }\n      /**\r\n       * @override\r\n       */\n      CalendarModel.prototype.init = function (option, parentModel, ecModel) {\n        var inputPositionParams = getLayoutParams(option);\n        _super.prototype.init.apply(this, arguments);\n        mergeAndNormalizeLayoutParams(option, inputPositionParams);\n      };\n      /**\r\n       * @override\r\n       */\n      CalendarModel.prototype.mergeOption = function (option) {\n        _super.prototype.mergeOption.apply(this, arguments);\n        mergeAndNormalizeLayoutParams(this.option, option);\n      };\n      CalendarModel.prototype.getCellSize = function () {\n        // Has been normalized\n        return this.option.cellSize;\n      };\n      CalendarModel.type = 'calendar';\n      CalendarModel.defaultOption = {\n        // zlevel: 0,\n        z: 2,\n        left: 80,\n        top: 60,\n        cellSize: 20,\n        // horizontal vertical\n        orient: 'horizontal',\n        // month separate line style\n        splitLine: {\n          show: true,\n          lineStyle: {\n            color: '#000',\n            width: 1,\n            type: 'solid'\n          }\n        },\n        // rect style  temporarily unused emphasis\n        itemStyle: {\n          color: '#fff',\n          borderWidth: 1,\n          borderColor: '#ccc'\n        },\n        // week text style\n        dayLabel: {\n          show: true,\n          firstDay: 0,\n          // start end\n          position: 'start',\n          margin: '50%',\n          color: '#000'\n        },\n        // month text style\n        monthLabel: {\n          show: true,\n          // start end\n          position: 'start',\n          margin: 5,\n          // center or left\n          align: 'center',\n          formatter: null,\n          color: '#000'\n        },\n        // year text style\n        yearLabel: {\n          show: true,\n          // top bottom left right\n          position: null,\n          margin: 30,\n          formatter: null,\n          color: '#ccc',\n          fontFamily: 'sans-serif',\n          fontWeight: 'bolder',\n          fontSize: 20\n        }\n      };\n      return CalendarModel;\n    }(ComponentModel);\n    function mergeAndNormalizeLayoutParams(target, raw) {\n      // Normalize cellSize\n      var cellSize = target.cellSize;\n      var cellSizeArr;\n      if (!isArray(cellSize)) {\n        cellSizeArr = target.cellSize = [cellSize, cellSize];\n      } else {\n        cellSizeArr = cellSize;\n      }\n      if (cellSizeArr.length === 1) {\n        cellSizeArr[1] = cellSizeArr[0];\n      }\n      var ignoreSize = map([0, 1], function (hvIdx) {\n        // If user have set `width` or both `left` and `right`, cellSizeArr\n        // will be automatically set to 'auto', otherwise the default\n        // setting of cellSizeArr will make `width` setting not work.\n        if (sizeCalculable(raw, hvIdx)) {\n          cellSizeArr[hvIdx] = 'auto';\n        }\n        return cellSizeArr[hvIdx] != null && cellSizeArr[hvIdx] !== 'auto';\n      });\n      mergeLayoutParam(target, raw, {\n        type: 'box',\n        ignoreSize: ignoreSize\n      });\n    }\n\n    var CalendarView = /** @class */function (_super) {\n      __extends(CalendarView, _super);\n      function CalendarView() {\n        var _this = _super !== null && _super.apply(this, arguments) || this;\n        _this.type = CalendarView.type;\n        return _this;\n      }\n      CalendarView.prototype.render = function (calendarModel, ecModel, api) {\n        var group = this.group;\n        group.removeAll();\n        var coordSys = calendarModel.coordinateSystem;\n        // range info\n        var rangeData = coordSys.getRangeInfo();\n        var orient = coordSys.getOrient();\n        // locale\n        var localeModel = ecModel.getLocaleModel();\n        this._renderDayRect(calendarModel, rangeData, group);\n        // _renderLines must be called prior to following function\n        this._renderLines(calendarModel, rangeData, orient, group);\n        this._renderYearText(calendarModel, rangeData, orient, group);\n        this._renderMonthText(calendarModel, localeModel, orient, group);\n        this._renderWeekText(calendarModel, localeModel, rangeData, orient, group);\n      };\n      // render day rect\n      CalendarView.prototype._renderDayRect = function (calendarModel, rangeData, group) {\n        var coordSys = calendarModel.coordinateSystem;\n        var itemRectStyleModel = calendarModel.getModel('itemStyle').getItemStyle();\n        var sw = coordSys.getCellWidth();\n        var sh = coordSys.getCellHeight();\n        for (var i = rangeData.start.time; i <= rangeData.end.time; i = coordSys.getNextNDay(i, 1).time) {\n          var point = coordSys.dataToRect([i], false).tl;\n          // every rect\n          var rect = new Rect({\n            shape: {\n              x: point[0],\n              y: point[1],\n              width: sw,\n              height: sh\n            },\n            cursor: 'default',\n            style: itemRectStyleModel\n          });\n          group.add(rect);\n        }\n      };\n      // render separate line\n      CalendarView.prototype._renderLines = function (calendarModel, rangeData, orient, group) {\n        var self = this;\n        var coordSys = calendarModel.coordinateSystem;\n        var lineStyleModel = calendarModel.getModel(['splitLine', 'lineStyle']).getLineStyle();\n        var show = calendarModel.get(['splitLine', 'show']);\n        var lineWidth = lineStyleModel.lineWidth;\n        this._tlpoints = [];\n        this._blpoints = [];\n        this._firstDayOfMonth = [];\n        this._firstDayPoints = [];\n        var firstDay = rangeData.start;\n        for (var i = 0; firstDay.time <= rangeData.end.time; i++) {\n          addPoints(firstDay.formatedDate);\n          if (i === 0) {\n            firstDay = coordSys.getDateInfo(rangeData.start.y + '-' + rangeData.start.m);\n          }\n          var date = firstDay.date;\n          date.setMonth(date.getMonth() + 1);\n          firstDay = coordSys.getDateInfo(date);\n        }\n        addPoints(coordSys.getNextNDay(rangeData.end.time, 1).formatedDate);\n        function addPoints(date) {\n          self._firstDayOfMonth.push(coordSys.getDateInfo(date));\n          self._firstDayPoints.push(coordSys.dataToRect([date], false).tl);\n          var points = self._getLinePointsOfOneWeek(calendarModel, date, orient);\n          self._tlpoints.push(points[0]);\n          self._blpoints.push(points[points.length - 1]);\n          show && self._drawSplitline(points, lineStyleModel, group);\n        }\n        // render top/left line\n        show && this._drawSplitline(self._getEdgesPoints(self._tlpoints, lineWidth, orient), lineStyleModel, group);\n        // render bottom/right line\n        show && this._drawSplitline(self._getEdgesPoints(self._blpoints, lineWidth, orient), lineStyleModel, group);\n      };\n      // get points at both ends\n      CalendarView.prototype._getEdgesPoints = function (points, lineWidth, orient) {\n        var rs = [points[0].slice(), points[points.length - 1].slice()];\n        var idx = orient === 'horizontal' ? 0 : 1;\n        // both ends of the line are extend half lineWidth\n        rs[0][idx] = rs[0][idx] - lineWidth / 2;\n        rs[1][idx] = rs[1][idx] + lineWidth / 2;\n        return rs;\n      };\n      // render split line\n      CalendarView.prototype._drawSplitline = function (points, lineStyle, group) {\n        var poyline = new Polyline({\n          z2: 20,\n          shape: {\n            points: points\n          },\n          style: lineStyle\n        });\n        group.add(poyline);\n      };\n      // render month line of one week points\n      CalendarView.prototype._getLinePointsOfOneWeek = function (calendarModel, date, orient) {\n        var coordSys = calendarModel.coordinateSystem;\n        var parsedDate = coordSys.getDateInfo(date);\n        var points = [];\n        for (var i = 0; i < 7; i++) {\n          var tmpD = coordSys.getNextNDay(parsedDate.time, i);\n          var point = coordSys.dataToRect([tmpD.time], false);\n          points[2 * tmpD.day] = point.tl;\n          points[2 * tmpD.day + 1] = point[orient === 'horizontal' ? 'bl' : 'tr'];\n        }\n        return points;\n      };\n      CalendarView.prototype._formatterLabel = function (formatter, params) {\n        if (isString(formatter) && formatter) {\n          return formatTplSimple(formatter, params);\n        }\n        if (isFunction(formatter)) {\n          return formatter(params);\n        }\n        return params.nameMap;\n      };\n      CalendarView.prototype._yearTextPositionControl = function (textEl, point, orient, position, margin) {\n        var x = point[0];\n        var y = point[1];\n        var aligns = ['center', 'bottom'];\n        if (position === 'bottom') {\n          y += margin;\n          aligns = ['center', 'top'];\n        } else if (position === 'left') {\n          x -= margin;\n        } else if (position === 'right') {\n          x += margin;\n          aligns = ['center', 'top'];\n        } else {\n          // top\n          y -= margin;\n        }\n        var rotate = 0;\n        if (position === 'left' || position === 'right') {\n          rotate = Math.PI / 2;\n        }\n        return {\n          rotation: rotate,\n          x: x,\n          y: y,\n          style: {\n            align: aligns[0],\n            verticalAlign: aligns[1]\n          }\n        };\n      };\n      // render year\n      CalendarView.prototype._renderYearText = function (calendarModel, rangeData, orient, group) {\n        var yearLabel = calendarModel.getModel('yearLabel');\n        if (!yearLabel.get('show')) {\n          return;\n        }\n        var margin = yearLabel.get('margin');\n        var pos = yearLabel.get('position');\n        if (!pos) {\n          pos = orient !== 'horizontal' ? 'top' : 'left';\n        }\n        var points = [this._tlpoints[this._tlpoints.length - 1], this._blpoints[0]];\n        var xc = (points[0][0] + points[1][0]) / 2;\n        var yc = (points[0][1] + points[1][1]) / 2;\n        var idx = orient === 'horizontal' ? 0 : 1;\n        var posPoints = {\n          top: [xc, points[idx][1]],\n          bottom: [xc, points[1 - idx][1]],\n          left: [points[1 - idx][0], yc],\n          right: [points[idx][0], yc]\n        };\n        var name = rangeData.start.y;\n        if (+rangeData.end.y > +rangeData.start.y) {\n          name = name + '-' + rangeData.end.y;\n        }\n        var formatter = yearLabel.get('formatter');\n        var params = {\n          start: rangeData.start.y,\n          end: rangeData.end.y,\n          nameMap: name\n        };\n        var content = this._formatterLabel(formatter, params);\n        var yearText = new ZRText({\n          z2: 30,\n          style: createTextStyle(yearLabel, {\n            text: content\n          }),\n          silent: yearLabel.get('silent')\n        });\n        yearText.attr(this._yearTextPositionControl(yearText, posPoints[pos], orient, pos, margin));\n        group.add(yearText);\n      };\n      CalendarView.prototype._monthTextPositionControl = function (point, isCenter, orient, position, margin) {\n        var align = 'left';\n        var vAlign = 'top';\n        var x = point[0];\n        var y = point[1];\n        if (orient === 'horizontal') {\n          y = y + margin;\n          if (isCenter) {\n            align = 'center';\n          }\n          if (position === 'start') {\n            vAlign = 'bottom';\n          }\n        } else {\n          x = x + margin;\n          if (isCenter) {\n            vAlign = 'middle';\n          }\n          if (position === 'start') {\n            align = 'right';\n          }\n        }\n        return {\n          x: x,\n          y: y,\n          align: align,\n          verticalAlign: vAlign\n        };\n      };\n      // render month and year text\n      CalendarView.prototype._renderMonthText = function (calendarModel, localeModel, orient, group) {\n        var monthLabel = calendarModel.getModel('monthLabel');\n        if (!monthLabel.get('show')) {\n          return;\n        }\n        var nameMap = monthLabel.get('nameMap');\n        var margin = monthLabel.get('margin');\n        var pos = monthLabel.get('position');\n        var align = monthLabel.get('align');\n        var termPoints = [this._tlpoints, this._blpoints];\n        if (!nameMap || isString(nameMap)) {\n          if (nameMap) {\n            // case-sensitive\n            localeModel = getLocaleModel(nameMap) || localeModel;\n          }\n          // PENDING\n          // for ZH locale, original form is `一月` but current form is `1月`\n          nameMap = localeModel.get(['time', 'monthAbbr']) || [];\n        }\n        var idx = pos === 'start' ? 0 : 1;\n        var axis = orient === 'horizontal' ? 0 : 1;\n        margin = pos === 'start' ? -margin : margin;\n        var isCenter = align === 'center';\n        var labelSilent = monthLabel.get('silent');\n        for (var i = 0; i < termPoints[idx].length - 1; i++) {\n          var tmp = termPoints[idx][i].slice();\n          var firstDay = this._firstDayOfMonth[i];\n          if (isCenter) {\n            var firstDayPoints = this._firstDayPoints[i];\n            tmp[axis] = (firstDayPoints[axis] + termPoints[0][i + 1][axis]) / 2;\n          }\n          var formatter = monthLabel.get('formatter');\n          var name_1 = nameMap[+firstDay.m - 1];\n          var params = {\n            yyyy: firstDay.y,\n            yy: (firstDay.y + '').slice(2),\n            MM: firstDay.m,\n            M: +firstDay.m,\n            nameMap: name_1\n          };\n          var content = this._formatterLabel(formatter, params);\n          var monthText = new ZRText({\n            z2: 30,\n            style: extend(createTextStyle(monthLabel, {\n              text: content\n            }), this._monthTextPositionControl(tmp, isCenter, orient, pos, margin)),\n            silent: labelSilent\n          });\n          group.add(monthText);\n        }\n      };\n      CalendarView.prototype._weekTextPositionControl = function (point, orient, position, margin, cellSize) {\n        var align = 'center';\n        var vAlign = 'middle';\n        var x = point[0];\n        var y = point[1];\n        var isStart = position === 'start';\n        if (orient === 'horizontal') {\n          x = x + margin + (isStart ? 1 : -1) * cellSize[0] / 2;\n          align = isStart ? 'right' : 'left';\n        } else {\n          y = y + margin + (isStart ? 1 : -1) * cellSize[1] / 2;\n          vAlign = isStart ? 'bottom' : 'top';\n        }\n        return {\n          x: x,\n          y: y,\n          align: align,\n          verticalAlign: vAlign\n        };\n      };\n      // render weeks\n      CalendarView.prototype._renderWeekText = function (calendarModel, localeModel, rangeData, orient, group) {\n        var dayLabel = calendarModel.getModel('dayLabel');\n        if (!dayLabel.get('show')) {\n          return;\n        }\n        var coordSys = calendarModel.coordinateSystem;\n        var pos = dayLabel.get('position');\n        var nameMap = dayLabel.get('nameMap');\n        var margin = dayLabel.get('margin');\n        var firstDayOfWeek = coordSys.getFirstDayOfWeek();\n        if (!nameMap || isString(nameMap)) {\n          if (nameMap) {\n            // case-sensitive\n            localeModel = getLocaleModel(nameMap) || localeModel;\n          }\n          // Use the first letter of `dayOfWeekAbbr` if `dayOfWeekShort` doesn't exist in the locale file\n          var dayOfWeekShort = localeModel.get(['time', 'dayOfWeekShort']);\n          nameMap = dayOfWeekShort || map(localeModel.get(['time', 'dayOfWeekAbbr']), function (val) {\n            return val[0];\n          });\n        }\n        var start = coordSys.getNextNDay(rangeData.end.time, 7 - rangeData.lweek).time;\n        var cellSize = [coordSys.getCellWidth(), coordSys.getCellHeight()];\n        margin = parsePercent$1(margin, Math.min(cellSize[1], cellSize[0]));\n        if (pos === 'start') {\n          start = coordSys.getNextNDay(rangeData.start.time, -(7 + rangeData.fweek)).time;\n          margin = -margin;\n        }\n        var labelSilent = dayLabel.get('silent');\n        for (var i = 0; i < 7; i++) {\n          var tmpD = coordSys.getNextNDay(start, i);\n          var point = coordSys.dataToRect([tmpD.time], false).center;\n          var day = i;\n          day = Math.abs((i + firstDayOfWeek) % 7);\n          var weekText = new ZRText({\n            z2: 30,\n            style: extend(createTextStyle(dayLabel, {\n              text: nameMap[day]\n            }), this._weekTextPositionControl(point, orient, pos, margin, cellSize)),\n            silent: labelSilent\n          });\n          group.add(weekText);\n        }\n      };\n      CalendarView.type = 'calendar';\n      return CalendarView;\n    }(ComponentView);\n\n    // (24*60*60*1000)\n    var PROXIMATE_ONE_DAY = 86400000;\n    var Calendar = /** @class */function () {\n      function Calendar(calendarModel, ecModel, api) {\n        this.type = 'calendar';\n        this.dimensions = Calendar.dimensions;\n        // Required in createListFromData\n        this.getDimensionsInfo = Calendar.getDimensionsInfo;\n        this._model = calendarModel;\n      }\n      Calendar.getDimensionsInfo = function () {\n        return [{\n          name: 'time',\n          type: 'time'\n        }, 'value'];\n      };\n      Calendar.prototype.getRangeInfo = function () {\n        return this._rangeInfo;\n      };\n      Calendar.prototype.getModel = function () {\n        return this._model;\n      };\n      Calendar.prototype.getRect = function () {\n        return this._rect;\n      };\n      Calendar.prototype.getCellWidth = function () {\n        return this._sw;\n      };\n      Calendar.prototype.getCellHeight = function () {\n        return this._sh;\n      };\n      Calendar.prototype.getOrient = function () {\n        return this._orient;\n      };\n      /**\r\n       * getFirstDayOfWeek\r\n       *\r\n       * @example\r\n       *     0 : start at Sunday\r\n       *     1 : start at Monday\r\n       *\r\n       * @return {number}\r\n       */\n      Calendar.prototype.getFirstDayOfWeek = function () {\n        return this._firstDayOfWeek;\n      };\n      /**\r\n       * get date info\r\n       * }\r\n       */\n      Calendar.prototype.getDateInfo = function (date) {\n        date = parseDate(date);\n        var y = date.getFullYear();\n        var m = date.getMonth() + 1;\n        var mStr = m < 10 ? '0' + m : '' + m;\n        var d = date.getDate();\n        var dStr = d < 10 ? '0' + d : '' + d;\n        var day = date.getDay();\n        day = Math.abs((day + 7 - this.getFirstDayOfWeek()) % 7);\n        return {\n          y: y + '',\n          m: mStr,\n          d: dStr,\n          day: day,\n          time: date.getTime(),\n          formatedDate: y + '-' + mStr + '-' + dStr,\n          date: date\n        };\n      };\n      Calendar.prototype.getNextNDay = function (date, n) {\n        n = n || 0;\n        if (n === 0) {\n          return this.getDateInfo(date);\n        }\n        date = new Date(this.getDateInfo(date).time);\n        date.setDate(date.getDate() + n);\n        return this.getDateInfo(date);\n      };\n      Calendar.prototype.update = function (ecModel, api) {\n        this._firstDayOfWeek = +this._model.getModel('dayLabel').get('firstDay');\n        this._orient = this._model.get('orient');\n        this._lineWidth = this._model.getModel('itemStyle').getItemStyle().lineWidth || 0;\n        this._rangeInfo = this._getRangeInfo(this._initRangeOption());\n        var weeks = this._rangeInfo.weeks || 1;\n        var whNames = ['width', 'height'];\n        var cellSize = this._model.getCellSize().slice();\n        var layoutParams = this._model.getBoxLayoutParams();\n        var cellNumbers = this._orient === 'horizontal' ? [weeks, 7] : [7, weeks];\n        each([0, 1], function (idx) {\n          if (cellSizeSpecified(cellSize, idx)) {\n            layoutParams[whNames[idx]] = cellSize[idx] * cellNumbers[idx];\n          }\n        });\n        var whGlobal = {\n          width: api.getWidth(),\n          height: api.getHeight()\n        };\n        var calendarRect = this._rect = getLayoutRect(layoutParams, whGlobal);\n        each([0, 1], function (idx) {\n          if (!cellSizeSpecified(cellSize, idx)) {\n            cellSize[idx] = calendarRect[whNames[idx]] / cellNumbers[idx];\n          }\n        });\n        function cellSizeSpecified(cellSize, idx) {\n          return cellSize[idx] != null && cellSize[idx] !== 'auto';\n        }\n        // Has been calculated out number.\n        this._sw = cellSize[0];\n        this._sh = cellSize[1];\n      };\n      /**\r\n       * Convert a time data(time, value) item to (x, y) point.\r\n       */\n      // TODO Clamp of calendar is not same with cartesian coordinate systems.\n      // It will return NaN if data exceeds.\n      Calendar.prototype.dataToPoint = function (data, clamp) {\n        isArray(data) && (data = data[0]);\n        clamp == null && (clamp = true);\n        var dayInfo = this.getDateInfo(data);\n        var range = this._rangeInfo;\n        var date = dayInfo.formatedDate;\n        // if not in range return [NaN, NaN]\n        if (clamp && !(dayInfo.time >= range.start.time && dayInfo.time < range.end.time + PROXIMATE_ONE_DAY)) {\n          return [NaN, NaN];\n        }\n        var week = dayInfo.day;\n        var nthWeek = this._getRangeInfo([range.start.time, date]).nthWeek;\n        if (this._orient === 'vertical') {\n          return [this._rect.x + week * this._sw + this._sw / 2, this._rect.y + nthWeek * this._sh + this._sh / 2];\n        }\n        return [this._rect.x + nthWeek * this._sw + this._sw / 2, this._rect.y + week * this._sh + this._sh / 2];\n      };\n      /**\r\n       * Convert a (x, y) point to time data\r\n       */\n      Calendar.prototype.pointToData = function (point) {\n        var date = this.pointToDate(point);\n        return date && date.time;\n      };\n      /**\r\n       * Convert a time date item to (x, y) four point.\r\n       */\n      Calendar.prototype.dataToRect = function (data, clamp) {\n        var point = this.dataToPoint(data, clamp);\n        return {\n          contentShape: {\n            x: point[0] - (this._sw - this._lineWidth) / 2,\n            y: point[1] - (this._sh - this._lineWidth) / 2,\n            width: this._sw - this._lineWidth,\n            height: this._sh - this._lineWidth\n          },\n          center: point,\n          tl: [point[0] - this._sw / 2, point[1] - this._sh / 2],\n          tr: [point[0] + this._sw / 2, point[1] - this._sh / 2],\n          br: [point[0] + this._sw / 2, point[1] + this._sh / 2],\n          bl: [point[0] - this._sw / 2, point[1] + this._sh / 2]\n        };\n      };\n      /**\r\n       * Convert a (x, y) point to time date\r\n       *\r\n       * @param  {Array} point point\r\n       * @return {Object}       date\r\n       */\n      Calendar.prototype.pointToDate = function (point) {\n        var nthX = Math.floor((point[0] - this._rect.x) / this._sw) + 1;\n        var nthY = Math.floor((point[1] - this._rect.y) / this._sh) + 1;\n        var range = this._rangeInfo.range;\n        if (this._orient === 'vertical') {\n          return this._getDateByWeeksAndDay(nthY, nthX - 1, range);\n        }\n        return this._getDateByWeeksAndDay(nthX, nthY - 1, range);\n      };\n      Calendar.prototype.convertToPixel = function (ecModel, finder, value) {\n        var coordSys = getCoordSys$4(finder);\n        return coordSys === this ? coordSys.dataToPoint(value) : null;\n      };\n      Calendar.prototype.convertFromPixel = function (ecModel, finder, pixel) {\n        var coordSys = getCoordSys$4(finder);\n        return coordSys === this ? coordSys.pointToData(pixel) : null;\n      };\n      Calendar.prototype.containPoint = function (point) {\n        console.warn('Not implemented.');\n        return false;\n      };\n      /**\r\n       * initRange\r\n       * Normalize to an [start, end] array\r\n       */\n      Calendar.prototype._initRangeOption = function () {\n        var range = this._model.get('range');\n        var normalizedRange;\n        // Convert [1990] to 1990\n        if (isArray(range) && range.length === 1) {\n          range = range[0];\n        }\n        if (!isArray(range)) {\n          var rangeStr = range.toString();\n          // One year.\n          if (/^\\d{4}$/.test(rangeStr)) {\n            normalizedRange = [rangeStr + '-01-01', rangeStr + '-12-31'];\n          }\n          // One month\n          if (/^\\d{4}[\\/|-]\\d{1,2}$/.test(rangeStr)) {\n            var start = this.getDateInfo(rangeStr);\n            var firstDay = start.date;\n            firstDay.setMonth(firstDay.getMonth() + 1);\n            var end = this.getNextNDay(firstDay, -1);\n            normalizedRange = [start.formatedDate, end.formatedDate];\n          }\n          // One day\n          if (/^\\d{4}[\\/|-]\\d{1,2}[\\/|-]\\d{1,2}$/.test(rangeStr)) {\n            normalizedRange = [rangeStr, rangeStr];\n          }\n        } else {\n          normalizedRange = range;\n        }\n        if (!normalizedRange) {\n          if (\"development\" !== 'production') {\n            logError('Invalid date range.');\n          }\n          // Not handling it.\n          return range;\n        }\n        var tmp = this._getRangeInfo(normalizedRange);\n        if (tmp.start.time > tmp.end.time) {\n          normalizedRange.reverse();\n        }\n        return normalizedRange;\n      };\n      /**\r\n       * range info\r\n       *\r\n       * @private\r\n       * @param  {Array} range range ['2017-01-01', '2017-07-08']\r\n       *  If range[0] > range[1], they will not be reversed.\r\n       * @return {Object}       obj\r\n       */\n      Calendar.prototype._getRangeInfo = function (range) {\n        var parsedRange = [this.getDateInfo(range[0]), this.getDateInfo(range[1])];\n        var reversed;\n        if (parsedRange[0].time > parsedRange[1].time) {\n          reversed = true;\n          parsedRange.reverse();\n        }\n        var allDay = Math.floor(parsedRange[1].time / PROXIMATE_ONE_DAY) - Math.floor(parsedRange[0].time / PROXIMATE_ONE_DAY) + 1;\n        // Consider case1 (#11677 #10430):\n        // Set the system timezone as \"UK\", set the range to `['2016-07-01', '2016-12-31']`\n        // Consider case2:\n        // Firstly set system timezone as \"Time Zone: America/Toronto\",\n        // ```\n        // let first = new Date(1478412000000 - 3600 * 1000 * 2.5);\n        // let second = new Date(1478412000000);\n        // let allDays = Math.floor(second / ONE_DAY) - Math.floor(first / ONE_DAY) + 1;\n        // ```\n        // will get wrong result because of DST. So we should fix it.\n        var date = new Date(parsedRange[0].time);\n        var startDateNum = date.getDate();\n        var endDateNum = parsedRange[1].date.getDate();\n        date.setDate(startDateNum + allDay - 1);\n        // The bias can not over a month, so just compare date.\n        var dateNum = date.getDate();\n        if (dateNum !== endDateNum) {\n          var sign = date.getTime() - parsedRange[1].time > 0 ? 1 : -1;\n          while ((dateNum = date.getDate()) !== endDateNum && (date.getTime() - parsedRange[1].time) * sign > 0) {\n            allDay -= sign;\n            date.setDate(dateNum - sign);\n          }\n        }\n        var weeks = Math.floor((allDay + parsedRange[0].day + 6) / 7);\n        var nthWeek = reversed ? -weeks + 1 : weeks - 1;\n        reversed && parsedRange.reverse();\n        return {\n          range: [parsedRange[0].formatedDate, parsedRange[1].formatedDate],\n          start: parsedRange[0],\n          end: parsedRange[1],\n          allDay: allDay,\n          weeks: weeks,\n          // From 0.\n          nthWeek: nthWeek,\n          fweek: parsedRange[0].day,\n          lweek: parsedRange[1].day\n        };\n      };\n      /**\r\n       * get date by nthWeeks and week day in range\r\n       *\r\n       * @private\r\n       * @param  {number} nthWeek the week\r\n       * @param  {number} day   the week day\r\n       * @param  {Array} range [d1, d2]\r\n       * @return {Object}\r\n       */\n      Calendar.prototype._getDateByWeeksAndDay = function (nthWeek, day, range) {\n        var rangeInfo = this._getRangeInfo(range);\n        if (nthWeek > rangeInfo.weeks || nthWeek === 0 && day < rangeInfo.fweek || nthWeek === rangeInfo.weeks && day > rangeInfo.lweek) {\n          return null;\n        }\n        var nthDay = (nthWeek - 1) * 7 - rangeInfo.fweek + day;\n        var date = new Date(rangeInfo.start.time);\n        date.setDate(+rangeInfo.start.d + nthDay);\n        return this.getDateInfo(date);\n      };\n      Calendar.create = function (ecModel, api) {\n        var calendarList = [];\n        ecModel.eachComponent('calendar', function (calendarModel) {\n          var calendar = new Calendar(calendarModel, ecModel, api);\n          calendarList.push(calendar);\n          calendarModel.coordinateSystem = calendar;\n        });\n        ecModel.eachSeries(function (calendarSeries) {\n          if (calendarSeries.get('coordinateSystem') === 'calendar') {\n            // Inject coordinate system\n            calendarSeries.coordinateSystem = calendarList[calendarSeries.get('calendarIndex') || 0];\n          }\n        });\n        return calendarList;\n      };\n      Calendar.dimensions = ['time', 'value'];\n      return Calendar;\n    }();\n    function getCoordSys$4(finder) {\n      var calendarModel = finder.calendarModel;\n      var seriesModel = finder.seriesModel;\n      var coordSys = calendarModel ? calendarModel.coordinateSystem : seriesModel ? seriesModel.coordinateSystem : null;\n      return coordSys;\n    }\n\n    function install$w(registers) {\n      registers.registerComponentModel(CalendarModel);\n      registers.registerComponentView(CalendarView);\n      registers.registerCoordinateSystem('calendar', Calendar);\n    }\n\n    function setKeyInfoToNewElOption(resultItem, newElOption) {\n      var existElOption = resultItem.existing;\n      // Set id and type after id assigned.\n      newElOption.id = resultItem.keyInfo.id;\n      !newElOption.type && existElOption && (newElOption.type = existElOption.type);\n      // Set parent id if not specified\n      if (newElOption.parentId == null) {\n        var newElParentOption = newElOption.parentOption;\n        if (newElParentOption) {\n          newElOption.parentId = newElParentOption.id;\n        } else if (existElOption) {\n          newElOption.parentId = existElOption.parentId;\n        }\n      }\n      // Clear\n      newElOption.parentOption = null;\n    }\n    function isSetLoc(obj, props) {\n      var isSet;\n      each(props, function (prop) {\n        obj[prop] != null && obj[prop] !== 'auto' && (isSet = true);\n      });\n      return isSet;\n    }\n    function mergeNewElOptionToExist(existList, index, newElOption) {\n      // Update existing options, for `getOption` feature.\n      var newElOptCopy = extend({}, newElOption);\n      var existElOption = existList[index];\n      var $action = newElOption.$action || 'merge';\n      if ($action === 'merge') {\n        if (existElOption) {\n          if (\"development\" !== 'production') {\n            var newType = newElOption.type;\n            assert(!newType || existElOption.type === newType, 'Please set $action: \"replace\" to change `type`');\n          }\n          // We can ensure that newElOptCopy and existElOption are not\n          // the same object, so `merge` will not change newElOptCopy.\n          merge(existElOption, newElOptCopy, true);\n          // Rigid body, use ignoreSize.\n          mergeLayoutParam(existElOption, newElOptCopy, {\n            ignoreSize: true\n          });\n          // Will be used in render.\n          copyLayoutParams(newElOption, existElOption);\n          // Copy transition info to new option so it can be used in the transition.\n          // DO IT AFTER merge\n          copyTransitionInfo(newElOption, existElOption);\n          copyTransitionInfo(newElOption, existElOption, 'shape');\n          copyTransitionInfo(newElOption, existElOption, 'style');\n          copyTransitionInfo(newElOption, existElOption, 'extra');\n          // Copy clipPath\n          newElOption.clipPath = existElOption.clipPath;\n        } else {\n          existList[index] = newElOptCopy;\n        }\n      } else if ($action === 'replace') {\n        existList[index] = newElOptCopy;\n      } else if ($action === 'remove') {\n        // null will be cleaned later.\n        existElOption && (existList[index] = null);\n      }\n    }\n    var TRANSITION_PROPS_TO_COPY = ['transition', 'enterFrom', 'leaveTo'];\n    var ROOT_TRANSITION_PROPS_TO_COPY = TRANSITION_PROPS_TO_COPY.concat(['enterAnimation', 'updateAnimation', 'leaveAnimation']);\n    function copyTransitionInfo(target, source, targetProp) {\n      if (targetProp) {\n        if (!target[targetProp] && source[targetProp]) {\n          // TODO avoid creating this empty object when there is no transition configuration.\n          target[targetProp] = {};\n        }\n        target = target[targetProp];\n        source = source[targetProp];\n      }\n      if (!target || !source) {\n        return;\n      }\n      var props = targetProp ? TRANSITION_PROPS_TO_COPY : ROOT_TRANSITION_PROPS_TO_COPY;\n      for (var i = 0; i < props.length; i++) {\n        var prop = props[i];\n        if (target[prop] == null && source[prop] != null) {\n          target[prop] = source[prop];\n        }\n      }\n    }\n    function setLayoutInfoToExist(existItem, newElOption) {\n      if (!existItem) {\n        return;\n      }\n      existItem.hv = newElOption.hv = [\n      // Rigid body, don't care about `width`.\n      isSetLoc(newElOption, ['left', 'right']),\n      // Rigid body, don't care about `height`.\n      isSetLoc(newElOption, ['top', 'bottom'])];\n      // Give default group size. Otherwise layout error may occur.\n      if (existItem.type === 'group') {\n        var existingGroupOpt = existItem;\n        var newGroupOpt = newElOption;\n        existingGroupOpt.width == null && (existingGroupOpt.width = newGroupOpt.width = 0);\n        existingGroupOpt.height == null && (existingGroupOpt.height = newGroupOpt.height = 0);\n      }\n    }\n    var GraphicComponentModel = /** @class */function (_super) {\n      __extends(GraphicComponentModel, _super);\n      function GraphicComponentModel() {\n        var _this = _super !== null && _super.apply(this, arguments) || this;\n        _this.type = GraphicComponentModel.type;\n        _this.preventAutoZ = true;\n        return _this;\n      }\n      GraphicComponentModel.prototype.mergeOption = function (option, ecModel) {\n        // Prevent default merge to elements\n        var elements = this.option.elements;\n        this.option.elements = null;\n        _super.prototype.mergeOption.call(this, option, ecModel);\n        this.option.elements = elements;\n      };\n      GraphicComponentModel.prototype.optionUpdated = function (newOption, isInit) {\n        var thisOption = this.option;\n        var newList = (isInit ? thisOption : newOption).elements;\n        var existList = thisOption.elements = isInit ? [] : thisOption.elements;\n        var flattenedList = [];\n        this._flatten(newList, flattenedList, null);\n        var mappingResult = mappingToExists(existList, flattenedList, 'normalMerge');\n        // Clear elOptionsToUpdate\n        var elOptionsToUpdate = this._elOptionsToUpdate = [];\n        each(mappingResult, function (resultItem, index) {\n          var newElOption = resultItem.newOption;\n          if (\"development\" !== 'production') {\n            assert(isObject(newElOption) || resultItem.existing, 'Empty graphic option definition');\n          }\n          if (!newElOption) {\n            return;\n          }\n          elOptionsToUpdate.push(newElOption);\n          setKeyInfoToNewElOption(resultItem, newElOption);\n          mergeNewElOptionToExist(existList, index, newElOption);\n          setLayoutInfoToExist(existList[index], newElOption);\n        }, this);\n        // Clean\n        thisOption.elements = filter(existList, function (item) {\n          // $action should be volatile, otherwise option gotten from\n          // `getOption` will contain unexpected $action.\n          item && delete item.$action;\n          return item != null;\n        });\n      };\n      /**\r\n       * Convert\r\n       * [{\r\n       *  type: 'group',\r\n       *  id: 'xx',\r\n       *  children: [{type: 'circle'}, {type: 'polygon'}]\r\n       * }]\r\n       * to\r\n       * [\r\n       *  {type: 'group', id: 'xx'},\r\n       *  {type: 'circle', parentId: 'xx'},\r\n       *  {type: 'polygon', parentId: 'xx'}\r\n       * ]\r\n       */\n      GraphicComponentModel.prototype._flatten = function (optionList, result, parentOption) {\n        each(optionList, function (option) {\n          if (!option) {\n            return;\n          }\n          if (parentOption) {\n            option.parentOption = parentOption;\n          }\n          result.push(option);\n          var children = option.children;\n          // here we don't judge if option.type is `group`\n          // when new option doesn't provide `type`, it will cause that the children can't be updated.\n          if (children && children.length) {\n            this._flatten(children, result, option);\n          }\n          // Deleting for JSON output, and for not affecting group creation.\n          delete option.children;\n        }, this);\n      };\n      // FIXME\n      // Pass to view using payload? setOption has a payload?\n      GraphicComponentModel.prototype.useElOptionsToUpdate = function () {\n        var els = this._elOptionsToUpdate;\n        // Clear to avoid render duplicately when zooming.\n        this._elOptionsToUpdate = null;\n        return els;\n      };\n      GraphicComponentModel.type = 'graphic';\n      GraphicComponentModel.defaultOption = {\n        elements: []\n        // parentId: null\n      };\n      return GraphicComponentModel;\n    }(ComponentModel);\n\n    var nonShapeGraphicElements = {\n      // Reserved but not supported in graphic component.\n      path: null,\n      compoundPath: null,\n      // Supported in graphic component.\n      group: Group,\n      image: ZRImage,\n      text: ZRText\n    };\n    var inner$e = makeInner();\n    // ------------------------\n    // View\n    // ------------------------\n    var GraphicComponentView = /** @class */function (_super) {\n      __extends(GraphicComponentView, _super);\n      function GraphicComponentView() {\n        var _this = _super !== null && _super.apply(this, arguments) || this;\n        _this.type = GraphicComponentView.type;\n        return _this;\n      }\n      GraphicComponentView.prototype.init = function () {\n        this._elMap = createHashMap();\n      };\n      GraphicComponentView.prototype.render = function (graphicModel, ecModel, api) {\n        // Having leveraged between use cases and algorithm complexity, a very\n        // simple layout mechanism is used:\n        // The size(width/height) can be determined by itself or its parent (not\n        // implemented yet), but can not by its children. (Top-down travel)\n        // The location(x/y) can be determined by the bounding rect of itself\n        // (can including its descendants or not) and the size of its parent.\n        // (Bottom-up travel)\n        // When `chart.clear()` or `chart.setOption({...}, true)` with the same id,\n        // view will be reused.\n        if (graphicModel !== this._lastGraphicModel) {\n          this._clear();\n        }\n        this._lastGraphicModel = graphicModel;\n        this._updateElements(graphicModel);\n        this._relocate(graphicModel, api);\n      };\n      /**\r\n       * Update graphic elements.\r\n       */\n      GraphicComponentView.prototype._updateElements = function (graphicModel) {\n        var elOptionsToUpdate = graphicModel.useElOptionsToUpdate();\n        if (!elOptionsToUpdate) {\n          return;\n        }\n        var elMap = this._elMap;\n        var rootGroup = this.group;\n        var globalZ = graphicModel.get('z');\n        var globalZLevel = graphicModel.get('zlevel');\n        // Top-down tranverse to assign graphic settings to each elements.\n        each(elOptionsToUpdate, function (elOption) {\n          var id = convertOptionIdName(elOption.id, null);\n          var elExisting = id != null ? elMap.get(id) : null;\n          var parentId = convertOptionIdName(elOption.parentId, null);\n          var targetElParent = parentId != null ? elMap.get(parentId) : rootGroup;\n          var elType = elOption.type;\n          var elOptionStyle = elOption.style;\n          if (elType === 'text' && elOptionStyle) {\n            // In top/bottom mode, textVerticalAlign should not be used, which cause\n            // inaccurately locating.\n            if (elOption.hv && elOption.hv[1]) {\n              elOptionStyle.textVerticalAlign = elOptionStyle.textBaseline = elOptionStyle.verticalAlign = elOptionStyle.align = null;\n            }\n          }\n          var textContentOption = elOption.textContent;\n          var textConfig = elOption.textConfig;\n          if (elOptionStyle && isEC4CompatibleStyle(elOptionStyle, elType, !!textConfig, !!textContentOption)) {\n            var convertResult = convertFromEC4CompatibleStyle(elOptionStyle, elType, true);\n            if (!textConfig && convertResult.textConfig) {\n              textConfig = elOption.textConfig = convertResult.textConfig;\n            }\n            if (!textContentOption && convertResult.textContent) {\n              textContentOption = convertResult.textContent;\n            }\n          }\n          // Remove unnecessary props to avoid potential problems.\n          var elOptionCleaned = getCleanedElOption(elOption);\n          // For simple, do not support parent change, otherwise reorder is needed.\n          if (\"development\" !== 'production') {\n            elExisting && assert(targetElParent === elExisting.parent, 'Changing parent is not supported.');\n          }\n          var $action = elOption.$action || 'merge';\n          var isMerge = $action === 'merge';\n          var isReplace = $action === 'replace';\n          if (isMerge) {\n            var isInit = !elExisting;\n            var el_1 = elExisting;\n            if (isInit) {\n              el_1 = createEl$1(id, targetElParent, elOption.type, elMap);\n            } else {\n              el_1 && (inner$e(el_1).isNew = false);\n              // Stop and restore before update any other attributes.\n              stopPreviousKeyframeAnimationAndRestore(el_1);\n            }\n            if (el_1) {\n              applyUpdateTransition(el_1, elOptionCleaned, graphicModel, {\n                isInit: isInit\n              });\n              updateCommonAttrs(el_1, elOption, globalZ, globalZLevel);\n            }\n          } else if (isReplace) {\n            removeEl(elExisting, elOption, elMap, graphicModel);\n            var el_2 = createEl$1(id, targetElParent, elOption.type, elMap);\n            if (el_2) {\n              applyUpdateTransition(el_2, elOptionCleaned, graphicModel, {\n                isInit: true\n              });\n              updateCommonAttrs(el_2, elOption, globalZ, globalZLevel);\n            }\n          } else if ($action === 'remove') {\n            updateLeaveTo(elExisting, elOption);\n            removeEl(elExisting, elOption, elMap, graphicModel);\n          }\n          var el = elMap.get(id);\n          if (el && textContentOption) {\n            if (isMerge) {\n              var textContentExisting = el.getTextContent();\n              textContentExisting ? textContentExisting.attr(textContentOption) : el.setTextContent(new ZRText(textContentOption));\n            } else if (isReplace) {\n              el.setTextContent(new ZRText(textContentOption));\n            }\n          }\n          if (el) {\n            var clipPathOption = elOption.clipPath;\n            if (clipPathOption) {\n              var clipPathType = clipPathOption.type;\n              var clipPath = void 0;\n              var isInit = false;\n              if (isMerge) {\n                var oldClipPath = el.getClipPath();\n                isInit = !oldClipPath || inner$e(oldClipPath).type !== clipPathType;\n                clipPath = isInit ? newEl(clipPathType) : oldClipPath;\n              } else if (isReplace) {\n                isInit = true;\n                clipPath = newEl(clipPathType);\n              }\n              el.setClipPath(clipPath);\n              applyUpdateTransition(clipPath, clipPathOption, graphicModel, {\n                isInit: isInit\n              });\n              applyKeyframeAnimation(clipPath, clipPathOption.keyframeAnimation, graphicModel);\n            }\n            var elInner = inner$e(el);\n            el.setTextConfig(textConfig);\n            elInner.option = elOption;\n            setEventData(el, graphicModel, elOption);\n            setTooltipConfig({\n              el: el,\n              componentModel: graphicModel,\n              itemName: el.name,\n              itemTooltipOption: elOption.tooltip\n            });\n            applyKeyframeAnimation(el, elOption.keyframeAnimation, graphicModel);\n          }\n        });\n      };\n      /**\r\n       * Locate graphic elements.\r\n       */\n      GraphicComponentView.prototype._relocate = function (graphicModel, api) {\n        var elOptions = graphicModel.option.elements;\n        var rootGroup = this.group;\n        var elMap = this._elMap;\n        var apiWidth = api.getWidth();\n        var apiHeight = api.getHeight();\n        var xy = ['x', 'y'];\n        // Top-down to calculate percentage width/height of group\n        for (var i = 0; i < elOptions.length; i++) {\n          var elOption = elOptions[i];\n          var id = convertOptionIdName(elOption.id, null);\n          var el = id != null ? elMap.get(id) : null;\n          if (!el || !el.isGroup) {\n            continue;\n          }\n          var parentEl = el.parent;\n          var isParentRoot = parentEl === rootGroup;\n          // Like 'position:absolut' in css, default 0.\n          var elInner = inner$e(el);\n          var parentElInner = inner$e(parentEl);\n          elInner.width = parsePercent$1(elInner.option.width, isParentRoot ? apiWidth : parentElInner.width) || 0;\n          elInner.height = parsePercent$1(elInner.option.height, isParentRoot ? apiHeight : parentElInner.height) || 0;\n        }\n        // Bottom-up tranvese all elements (consider ec resize) to locate elements.\n        for (var i = elOptions.length - 1; i >= 0; i--) {\n          var elOption = elOptions[i];\n          var id = convertOptionIdName(elOption.id, null);\n          var el = id != null ? elMap.get(id) : null;\n          if (!el) {\n            continue;\n          }\n          var parentEl = el.parent;\n          var parentElInner = inner$e(parentEl);\n          var containerInfo = parentEl === rootGroup ? {\n            width: apiWidth,\n            height: apiHeight\n          } : {\n            width: parentElInner.width,\n            height: parentElInner.height\n          };\n          // PENDING\n          // Currently, when `bounding: 'all'`, the union bounding rect of the group\n          // does not include the rect of [0, 0, group.width, group.height], which\n          // is probably weird for users. Should we make a break change for it?\n          var layoutPos = {};\n          var layouted = positionElement(el, elOption, containerInfo, null, {\n            hv: elOption.hv,\n            boundingMode: elOption.bounding\n          }, layoutPos);\n          if (!inner$e(el).isNew && layouted) {\n            var transition = elOption.transition;\n            var animatePos = {};\n            for (var k = 0; k < xy.length; k++) {\n              var key = xy[k];\n              var val = layoutPos[key];\n              if (transition && (isTransitionAll(transition) || indexOf(transition, key) >= 0)) {\n                animatePos[key] = val;\n              } else {\n                el[key] = val;\n              }\n            }\n            updateProps(el, animatePos, graphicModel, 0);\n          } else {\n            el.attr(layoutPos);\n          }\n        }\n      };\n      /**\r\n       * Clear all elements.\r\n       */\n      GraphicComponentView.prototype._clear = function () {\n        var _this = this;\n        var elMap = this._elMap;\n        elMap.each(function (el) {\n          removeEl(el, inner$e(el).option, elMap, _this._lastGraphicModel);\n        });\n        this._elMap = createHashMap();\n      };\n      GraphicComponentView.prototype.dispose = function () {\n        this._clear();\n      };\n      GraphicComponentView.type = 'graphic';\n      return GraphicComponentView;\n    }(ComponentView);\n    function newEl(graphicType) {\n      if (\"development\" !== 'production') {\n        assert(graphicType, 'graphic type MUST be set');\n      }\n      var Clz = hasOwn(nonShapeGraphicElements, graphicType)\n      // Those graphic elements are not shapes. They should not be\n      // overwritten by users, so do them first.\n      ? nonShapeGraphicElements[graphicType] : getShapeClass(graphicType);\n      if (\"development\" !== 'production') {\n        assert(Clz, \"graphic type \" + graphicType + \" can not be found\");\n      }\n      var el = new Clz({});\n      inner$e(el).type = graphicType;\n      return el;\n    }\n    function createEl$1(id, targetElParent, graphicType, elMap) {\n      var el = newEl(graphicType);\n      targetElParent.add(el);\n      elMap.set(id, el);\n      inner$e(el).id = id;\n      inner$e(el).isNew = true;\n      return el;\n    }\n    function removeEl(elExisting, elOption, elMap, graphicModel) {\n      var existElParent = elExisting && elExisting.parent;\n      if (existElParent) {\n        elExisting.type === 'group' && elExisting.traverse(function (el) {\n          removeEl(el, elOption, elMap, graphicModel);\n        });\n        applyLeaveTransition(elExisting, elOption, graphicModel);\n        elMap.removeKey(inner$e(elExisting).id);\n      }\n    }\n    function updateCommonAttrs(el, elOption, defaultZ, defaultZlevel) {\n      if (!el.isGroup) {\n        each([['cursor', Displayable.prototype.cursor],\n        // We should not support configure z and zlevel in the element level.\n        // But seems we didn't limit it previously. So here still use it to avoid breaking.\n        ['zlevel', defaultZlevel || 0], ['z', defaultZ || 0],\n        // z2 must not be null/undefined, otherwise sort error may occur.\n        ['z2', 0]], function (item) {\n          var prop = item[0];\n          if (hasOwn(elOption, prop)) {\n            el[prop] = retrieve2(elOption[prop], item[1]);\n          } else if (el[prop] == null) {\n            el[prop] = item[1];\n          }\n        });\n      }\n      each(keys(elOption), function (key) {\n        // Assign event handlers.\n        // PENDING: should enumerate all event names or use pattern matching?\n        if (key.indexOf('on') === 0) {\n          var val = elOption[key];\n          el[key] = isFunction(val) ? val : null;\n        }\n      });\n      if (hasOwn(elOption, 'draggable')) {\n        el.draggable = elOption.draggable;\n      }\n      // Other attributes\n      elOption.name != null && (el.name = elOption.name);\n      elOption.id != null && (el.id = elOption.id);\n    }\n    // Remove unnecessary props to avoid potential problems.\n    function getCleanedElOption(elOption) {\n      elOption = extend({}, elOption);\n      each(['id', 'parentId', '$action', 'hv', 'bounding', 'textContent', 'clipPath'].concat(LOCATION_PARAMS), function (name) {\n        delete elOption[name];\n      });\n      return elOption;\n    }\n    function setEventData(el, graphicModel, elOption) {\n      var eventData = getECData(el).eventData;\n      // Simple optimize for large amount of elements that no need event.\n      if (!el.silent && !el.ignore && !eventData) {\n        eventData = getECData(el).eventData = {\n          componentType: 'graphic',\n          componentIndex: graphicModel.componentIndex,\n          name: el.name\n        };\n      }\n      // `elOption.info` enables user to mount some info on\n      // elements and use them in event handlers.\n      if (eventData) {\n        eventData.info = elOption.info;\n      }\n    }\n\n    function install$x(registers) {\n      registers.registerComponentModel(GraphicComponentModel);\n      registers.registerComponentView(GraphicComponentView);\n      registers.registerPreprocessor(function (option) {\n        var graphicOption = option.graphic;\n        // Convert\n        // {graphic: [{left: 10, type: 'circle'}, ...]}\n        // or\n        // {graphic: {left: 10, type: 'circle'}}\n        // to\n        // {graphic: [{elements: [{left: 10, type: 'circle'}, ...]}]}\n        if (isArray(graphicOption)) {\n          if (!graphicOption[0] || !graphicOption[0].elements) {\n            option.graphic = [{\n              elements: graphicOption\n            }];\n          } else {\n            // Only one graphic instance can be instantiated. (We don't\n            // want that too many views are created in echarts._viewMap.)\n            option.graphic = [option.graphic[0]];\n          }\n        } else if (graphicOption && !graphicOption.elements) {\n          option.graphic = [{\n            elements: [graphicOption]\n          }];\n        }\n      });\n    }\n\n    var DATA_ZOOM_AXIS_DIMENSIONS = ['x', 'y', 'radius', 'angle', 'single'];\n    // Supported coords.\n    // FIXME: polar has been broken (but rarely used).\n    var SERIES_COORDS = ['cartesian2d', 'polar', 'singleAxis'];\n    function isCoordSupported(seriesModel) {\n      var coordType = seriesModel.get('coordinateSystem');\n      return indexOf(SERIES_COORDS, coordType) >= 0;\n    }\n    function getAxisMainType(axisDim) {\n      if (\"development\" !== 'production') {\n        assert(axisDim);\n      }\n      return axisDim + 'Axis';\n    }\n    /**\r\n     * If two dataZoomModels has the same axis controlled, we say that they are 'linked'.\r\n     * This function finds all linked dataZoomModels start from the given payload.\r\n     */\n    function findEffectedDataZooms(ecModel, payload) {\n      // Key: `DataZoomAxisDimension`\n      var axisRecords = createHashMap();\n      var effectedModels = [];\n      // Key: uid of dataZoomModel\n      var effectedModelMap = createHashMap();\n      // Find the dataZooms specified by payload.\n      ecModel.eachComponent({\n        mainType: 'dataZoom',\n        query: payload\n      }, function (dataZoomModel) {\n        if (!effectedModelMap.get(dataZoomModel.uid)) {\n          addToEffected(dataZoomModel);\n        }\n      });\n      // Start from the given dataZoomModels, travel the graph to find\n      // all of the linked dataZoom models.\n      var foundNewLink;\n      do {\n        foundNewLink = false;\n        ecModel.eachComponent('dataZoom', processSingle);\n      } while (foundNewLink);\n      function processSingle(dataZoomModel) {\n        if (!effectedModelMap.get(dataZoomModel.uid) && isLinked(dataZoomModel)) {\n          addToEffected(dataZoomModel);\n          foundNewLink = true;\n        }\n      }\n      function addToEffected(dataZoom) {\n        effectedModelMap.set(dataZoom.uid, true);\n        effectedModels.push(dataZoom);\n        markAxisControlled(dataZoom);\n      }\n      function isLinked(dataZoomModel) {\n        var isLink = false;\n        dataZoomModel.eachTargetAxis(function (axisDim, axisIndex) {\n          var axisIdxArr = axisRecords.get(axisDim);\n          if (axisIdxArr && axisIdxArr[axisIndex]) {\n            isLink = true;\n          }\n        });\n        return isLink;\n      }\n      function markAxisControlled(dataZoomModel) {\n        dataZoomModel.eachTargetAxis(function (axisDim, axisIndex) {\n          (axisRecords.get(axisDim) || axisRecords.set(axisDim, []))[axisIndex] = true;\n        });\n      }\n      return effectedModels;\n    }\n    /**\r\n     * Find the first target coordinate system.\r\n     * Available after model built.\r\n     *\r\n     * @return Like {\r\n     *                  grid: [\r\n     *                      {model: coord0, axisModels: [axis1, axis3], coordIndex: 1},\r\n     *                      {model: coord1, axisModels: [axis0, axis2], coordIndex: 0},\r\n     *                      ...\r\n     *                  ],  // cartesians must not be null/undefined.\r\n     *                  polar: [\r\n     *                      {model: coord0, axisModels: [axis4], coordIndex: 0},\r\n     *                      ...\r\n     *                  ],  // polars must not be null/undefined.\r\n     *                  singleAxis: [\r\n     *                      {model: coord0, axisModels: [], coordIndex: 0}\r\n     *                  ]\r\n     *              }\r\n     */\n    function collectReferCoordSysModelInfo(dataZoomModel) {\n      var ecModel = dataZoomModel.ecModel;\n      var coordSysInfoWrap = {\n        infoList: [],\n        infoMap: createHashMap()\n      };\n      dataZoomModel.eachTargetAxis(function (axisDim, axisIndex) {\n        var axisModel = ecModel.getComponent(getAxisMainType(axisDim), axisIndex);\n        if (!axisModel) {\n          return;\n        }\n        var coordSysModel = axisModel.getCoordSysModel();\n        if (!coordSysModel) {\n          return;\n        }\n        var coordSysUid = coordSysModel.uid;\n        var coordSysInfo = coordSysInfoWrap.infoMap.get(coordSysUid);\n        if (!coordSysInfo) {\n          coordSysInfo = {\n            model: coordSysModel,\n            axisModels: []\n          };\n          coordSysInfoWrap.infoList.push(coordSysInfo);\n          coordSysInfoWrap.infoMap.set(coordSysUid, coordSysInfo);\n        }\n        coordSysInfo.axisModels.push(axisModel);\n      });\n      return coordSysInfoWrap;\n    }\n\n    var DataZoomAxisInfo = /** @class */function () {\n      function DataZoomAxisInfo() {\n        this.indexList = [];\n        this.indexMap = [];\n      }\n      DataZoomAxisInfo.prototype.add = function (axisCmptIdx) {\n        // Remove duplication.\n        if (!this.indexMap[axisCmptIdx]) {\n          this.indexList.push(axisCmptIdx);\n          this.indexMap[axisCmptIdx] = true;\n        }\n      };\n      return DataZoomAxisInfo;\n    }();\n    var DataZoomModel = /** @class */function (_super) {\n      __extends(DataZoomModel, _super);\n      function DataZoomModel() {\n        var _this = _super !== null && _super.apply(this, arguments) || this;\n        _this.type = DataZoomModel.type;\n        _this._autoThrottle = true;\n        _this._noTarget = true;\n        /**\r\n         * It is `[rangeModeForMin, rangeModeForMax]`.\r\n         * The optional values for `rangeMode`:\r\n         * + `'value'` mode: the axis extent will always be determined by\r\n         *     `dataZoom.startValue` and `dataZoom.endValue`, despite\r\n         *     how data like and how `axis.min` and `axis.max` are.\r\n         * + `'percent'` mode: `100` represents 100% of the `[dMin, dMax]`,\r\n         *     where `dMin` is `axis.min` if `axis.min` specified, otherwise `data.extent[0]`,\r\n         *     and `dMax` is `axis.max` if `axis.max` specified, otherwise `data.extent[1]`.\r\n         *     Axis extent will be determined by the result of the percent of `[dMin, dMax]`.\r\n         *\r\n         * For example, when users are using dynamic data (update data periodically via `setOption`),\r\n         * if in `'value`' mode, the window will be kept in a fixed value range despite how\r\n         * data are appended, while if in `'percent'` mode, whe window range will be changed alone with\r\n         * the appended data (suppose `axis.min` and `axis.max` are not specified).\r\n         */\n        _this._rangePropMode = ['percent', 'percent'];\n        return _this;\n      }\n      DataZoomModel.prototype.init = function (option, parentModel, ecModel) {\n        var inputRawOption = retrieveRawOption(option);\n        /**\r\n         * Suppose a \"main process\" start at the point that model prepared (that is,\r\n         * model initialized or merged or method called in `action`).\r\n         * We should keep the `main process` idempotent, that is, given a set of values\r\n         * on `option`, we get the same result.\r\n         *\r\n         * But sometimes, values on `option` will be updated for providing users\r\n         * a \"final calculated value\" (`dataZoomProcessor` will do that). Those value\r\n         * should not be the base/input of the `main process`.\r\n         *\r\n         * So in that case we should save and keep the input of the `main process`\r\n         * separately, called `settledOption`.\r\n         *\r\n         * For example, consider the case:\r\n         * (Step_1) brush zoom the grid by `toolbox.dataZoom`,\r\n         *     where the original input `option.startValue`, `option.endValue` are earsed by\r\n         *     calculated value.\r\n         * (Step)2) click the legend to hide and show a series,\r\n         *     where the new range is calculated by the earsed `startValue` and `endValue`,\r\n         *     which brings incorrect result.\r\n         */\n        this.settledOption = inputRawOption;\n        this.mergeDefaultAndTheme(option, ecModel);\n        this._doInit(inputRawOption);\n      };\n      DataZoomModel.prototype.mergeOption = function (newOption) {\n        var inputRawOption = retrieveRawOption(newOption);\n        // FIX #2591\n        merge(this.option, newOption, true);\n        merge(this.settledOption, inputRawOption, true);\n        this._doInit(inputRawOption);\n      };\n      DataZoomModel.prototype._doInit = function (inputRawOption) {\n        var thisOption = this.option;\n        this._setDefaultThrottle(inputRawOption);\n        this._updateRangeUse(inputRawOption);\n        var settledOption = this.settledOption;\n        each([['start', 'startValue'], ['end', 'endValue']], function (names, index) {\n          // start/end has higher priority over startValue/endValue if they\n          // both set, but we should make chart.setOption({endValue: 1000})\n          // effective, rather than chart.setOption({endValue: 1000, end: null}).\n          if (this._rangePropMode[index] === 'value') {\n            thisOption[names[0]] = settledOption[names[0]] = null;\n          }\n          // Otherwise do nothing and use the merge result.\n        }, this);\n        this._resetTarget();\n      };\n      DataZoomModel.prototype._resetTarget = function () {\n        var optionOrient = this.get('orient', true);\n        var targetAxisIndexMap = this._targetAxisInfoMap = createHashMap();\n        var hasAxisSpecified = this._fillSpecifiedTargetAxis(targetAxisIndexMap);\n        if (hasAxisSpecified) {\n          this._orient = optionOrient || this._makeAutoOrientByTargetAxis();\n        } else {\n          this._orient = optionOrient || 'horizontal';\n          this._fillAutoTargetAxisByOrient(targetAxisIndexMap, this._orient);\n        }\n        this._noTarget = true;\n        targetAxisIndexMap.each(function (axisInfo) {\n          if (axisInfo.indexList.length) {\n            this._noTarget = false;\n          }\n        }, this);\n      };\n      DataZoomModel.prototype._fillSpecifiedTargetAxis = function (targetAxisIndexMap) {\n        var hasAxisSpecified = false;\n        each(DATA_ZOOM_AXIS_DIMENSIONS, function (axisDim) {\n          var refering = this.getReferringComponents(getAxisMainType(axisDim), MULTIPLE_REFERRING);\n          // When user set axisIndex as a empty array, we think that user specify axisIndex\n          // but do not want use auto mode. Because empty array may be encountered when\n          // some error occurred.\n          if (!refering.specified) {\n            return;\n          }\n          hasAxisSpecified = true;\n          var axisInfo = new DataZoomAxisInfo();\n          each(refering.models, function (axisModel) {\n            axisInfo.add(axisModel.componentIndex);\n          });\n          targetAxisIndexMap.set(axisDim, axisInfo);\n        }, this);\n        return hasAxisSpecified;\n      };\n      DataZoomModel.prototype._fillAutoTargetAxisByOrient = function (targetAxisIndexMap, orient) {\n        var ecModel = this.ecModel;\n        var needAuto = true;\n        // Find axis that parallel to dataZoom as default.\n        if (needAuto) {\n          var axisDim = orient === 'vertical' ? 'y' : 'x';\n          var axisModels = ecModel.findComponents({\n            mainType: axisDim + 'Axis'\n          });\n          setParallelAxis(axisModels, axisDim);\n        }\n        // Find axis that parallel to dataZoom as default.\n        if (needAuto) {\n          var axisModels = ecModel.findComponents({\n            mainType: 'singleAxis',\n            filter: function (axisModel) {\n              return axisModel.get('orient', true) === orient;\n            }\n          });\n          setParallelAxis(axisModels, 'single');\n        }\n        function setParallelAxis(axisModels, axisDim) {\n          // At least use the first parallel axis as the target axis.\n          var axisModel = axisModels[0];\n          if (!axisModel) {\n            return;\n          }\n          var axisInfo = new DataZoomAxisInfo();\n          axisInfo.add(axisModel.componentIndex);\n          targetAxisIndexMap.set(axisDim, axisInfo);\n          needAuto = false;\n          // Find parallel axes in the same grid.\n          if (axisDim === 'x' || axisDim === 'y') {\n            var gridModel_1 = axisModel.getReferringComponents('grid', SINGLE_REFERRING).models[0];\n            gridModel_1 && each(axisModels, function (axModel) {\n              if (axisModel.componentIndex !== axModel.componentIndex && gridModel_1 === axModel.getReferringComponents('grid', SINGLE_REFERRING).models[0]) {\n                axisInfo.add(axModel.componentIndex);\n              }\n            });\n          }\n        }\n        if (needAuto) {\n          // If no parallel axis, find the first category axis as default. (Also consider polar).\n          each(DATA_ZOOM_AXIS_DIMENSIONS, function (axisDim) {\n            if (!needAuto) {\n              return;\n            }\n            var axisModels = ecModel.findComponents({\n              mainType: getAxisMainType(axisDim),\n              filter: function (axisModel) {\n                return axisModel.get('type', true) === 'category';\n              }\n            });\n            if (axisModels[0]) {\n              var axisInfo = new DataZoomAxisInfo();\n              axisInfo.add(axisModels[0].componentIndex);\n              targetAxisIndexMap.set(axisDim, axisInfo);\n              needAuto = false;\n            }\n          }, this);\n        }\n      };\n      DataZoomModel.prototype._makeAutoOrientByTargetAxis = function () {\n        var dim;\n        // Find the first axis\n        this.eachTargetAxis(function (axisDim) {\n          !dim && (dim = axisDim);\n        }, this);\n        return dim === 'y' ? 'vertical' : 'horizontal';\n      };\n      DataZoomModel.prototype._setDefaultThrottle = function (inputRawOption) {\n        // When first time user set throttle, auto throttle ends.\n        if (inputRawOption.hasOwnProperty('throttle')) {\n          this._autoThrottle = false;\n        }\n        if (this._autoThrottle) {\n          var globalOption = this.ecModel.option;\n          this.option.throttle = globalOption.animation && globalOption.animationDurationUpdate > 0 ? 100 : 20;\n        }\n      };\n      DataZoomModel.prototype._updateRangeUse = function (inputRawOption) {\n        var rangePropMode = this._rangePropMode;\n        var rangeModeInOption = this.get('rangeMode');\n        each([['start', 'startValue'], ['end', 'endValue']], function (names, index) {\n          var percentSpecified = inputRawOption[names[0]] != null;\n          var valueSpecified = inputRawOption[names[1]] != null;\n          if (percentSpecified && !valueSpecified) {\n            rangePropMode[index] = 'percent';\n          } else if (!percentSpecified && valueSpecified) {\n            rangePropMode[index] = 'value';\n          } else if (rangeModeInOption) {\n            rangePropMode[index] = rangeModeInOption[index];\n          } else if (percentSpecified) {\n            // percentSpecified && valueSpecified\n            rangePropMode[index] = 'percent';\n          }\n          // else remain its original setting.\n        });\n      };\n      DataZoomModel.prototype.noTarget = function () {\n        return this._noTarget;\n      };\n      DataZoomModel.prototype.getFirstTargetAxisModel = function () {\n        var firstAxisModel;\n        this.eachTargetAxis(function (axisDim, axisIndex) {\n          if (firstAxisModel == null) {\n            firstAxisModel = this.ecModel.getComponent(getAxisMainType(axisDim), axisIndex);\n          }\n        }, this);\n        return firstAxisModel;\n      };\n      /**\r\n       * @param {Function} callback param: axisModel, dimNames, axisIndex, dataZoomModel, ecModel\r\n       */\n      DataZoomModel.prototype.eachTargetAxis = function (callback, context) {\n        this._targetAxisInfoMap.each(function (axisInfo, axisDim) {\n          each(axisInfo.indexList, function (axisIndex) {\n            callback.call(context, axisDim, axisIndex);\n          });\n        });\n      };\n      /**\r\n       * @return If not found, return null/undefined.\r\n       */\n      DataZoomModel.prototype.getAxisProxy = function (axisDim, axisIndex) {\n        var axisModel = this.getAxisModel(axisDim, axisIndex);\n        if (axisModel) {\n          return axisModel.__dzAxisProxy;\n        }\n      };\n      /**\r\n       * @return If not found, return null/undefined.\r\n       */\n      DataZoomModel.prototype.getAxisModel = function (axisDim, axisIndex) {\n        if (\"development\" !== 'production') {\n          assert(axisDim && axisIndex != null);\n        }\n        var axisInfo = this._targetAxisInfoMap.get(axisDim);\n        if (axisInfo && axisInfo.indexMap[axisIndex]) {\n          return this.ecModel.getComponent(getAxisMainType(axisDim), axisIndex);\n        }\n      };\n      /**\r\n       * If not specified, set to undefined.\r\n       */\n      DataZoomModel.prototype.setRawRange = function (opt) {\n        var thisOption = this.option;\n        var settledOption = this.settledOption;\n        each([['start', 'startValue'], ['end', 'endValue']], function (names) {\n          // Consider the pair <start, startValue>:\n          // If one has value and the other one is `null/undefined`, we both set them\n          // to `settledOption`. This strategy enables the feature to clear the original\n          // value in `settledOption` to `null/undefined`.\n          // But if both of them are `null/undefined`, we do not set them to `settledOption`\n          // and keep `settledOption` with the original value. This strategy enables users to\n          // only set <end or endValue> but not set <start or startValue> when calling\n          // `dispatchAction`.\n          // The pair <end, endValue> is treated in the same way.\n          if (opt[names[0]] != null || opt[names[1]] != null) {\n            thisOption[names[0]] = settledOption[names[0]] = opt[names[0]];\n            thisOption[names[1]] = settledOption[names[1]] = opt[names[1]];\n          }\n        }, this);\n        this._updateRangeUse(opt);\n      };\n      DataZoomModel.prototype.setCalculatedRange = function (opt) {\n        var option = this.option;\n        each(['start', 'startValue', 'end', 'endValue'], function (name) {\n          option[name] = opt[name];\n        });\n      };\n      DataZoomModel.prototype.getPercentRange = function () {\n        var axisProxy = this.findRepresentativeAxisProxy();\n        if (axisProxy) {\n          return axisProxy.getDataPercentWindow();\n        }\n      };\n      /**\r\n       * For example, chart.getModel().getComponent('dataZoom').getValueRange('y', 0);\r\n       *\r\n       * @return [startValue, endValue] value can only be '-' or finite number.\r\n       */\n      DataZoomModel.prototype.getValueRange = function (axisDim, axisIndex) {\n        if (axisDim == null && axisIndex == null) {\n          var axisProxy = this.findRepresentativeAxisProxy();\n          if (axisProxy) {\n            return axisProxy.getDataValueWindow();\n          }\n        } else {\n          return this.getAxisProxy(axisDim, axisIndex).getDataValueWindow();\n        }\n      };\n      /**\r\n       * @param axisModel If axisModel given, find axisProxy\r\n       *      corresponding to the axisModel\r\n       */\n      DataZoomModel.prototype.findRepresentativeAxisProxy = function (axisModel) {\n        if (axisModel) {\n          return axisModel.__dzAxisProxy;\n        }\n        // Find the first hosted axisProxy\n        var firstProxy;\n        var axisDimList = this._targetAxisInfoMap.keys();\n        for (var i = 0; i < axisDimList.length; i++) {\n          var axisDim = axisDimList[i];\n          var axisInfo = this._targetAxisInfoMap.get(axisDim);\n          for (var j = 0; j < axisInfo.indexList.length; j++) {\n            var proxy = this.getAxisProxy(axisDim, axisInfo.indexList[j]);\n            if (proxy.hostedBy(this)) {\n              return proxy;\n            }\n            if (!firstProxy) {\n              firstProxy = proxy;\n            }\n          }\n        }\n        // If no hosted proxy found, still need to return a proxy.\n        // This case always happens in toolbox dataZoom, where axes are all hosted by\n        // other dataZooms.\n        return firstProxy;\n      };\n      DataZoomModel.prototype.getRangePropMode = function () {\n        return this._rangePropMode.slice();\n      };\n      DataZoomModel.prototype.getOrient = function () {\n        if (\"development\" !== 'production') {\n          // Should not be called before initialized.\n          assert(this._orient);\n        }\n        return this._orient;\n      };\n      DataZoomModel.type = 'dataZoom';\n      DataZoomModel.dependencies = ['xAxis', 'yAxis', 'radiusAxis', 'angleAxis', 'singleAxis', 'series', 'toolbox'];\n      DataZoomModel.defaultOption = {\n        // zlevel: 0,\n        z: 4,\n        filterMode: 'filter',\n        start: 0,\n        end: 100\n      };\n      return DataZoomModel;\n    }(ComponentModel);\n    /**\r\n     * Retrieve those raw params from option, which will be cached separately,\r\n     * because they will be overwritten by normalized/calculated values in the main\r\n     * process.\r\n     */\n    function retrieveRawOption(option) {\n      var ret = {};\n      each(['start', 'end', 'startValue', 'endValue', 'throttle'], function (name) {\n        option.hasOwnProperty(name) && (ret[name] = option[name]);\n      });\n      return ret;\n    }\n\n    var SelectDataZoomModel = /** @class */function (_super) {\n      __extends(SelectDataZoomModel, _super);\n      function SelectDataZoomModel() {\n        var _this = _super !== null && _super.apply(this, arguments) || this;\n        _this.type = SelectDataZoomModel.type;\n        return _this;\n      }\n      SelectDataZoomModel.type = 'dataZoom.select';\n      return SelectDataZoomModel;\n    }(DataZoomModel);\n\n    var DataZoomView = /** @class */function (_super) {\n      __extends(DataZoomView, _super);\n      function DataZoomView() {\n        var _this = _super !== null && _super.apply(this, arguments) || this;\n        _this.type = DataZoomView.type;\n        return _this;\n      }\n      DataZoomView.prototype.render = function (dataZoomModel, ecModel, api, payload) {\n        this.dataZoomModel = dataZoomModel;\n        this.ecModel = ecModel;\n        this.api = api;\n      };\n      DataZoomView.type = 'dataZoom';\n      return DataZoomView;\n    }(ComponentView);\n\n    var SelectDataZoomView = /** @class */function (_super) {\n      __extends(SelectDataZoomView, _super);\n      function SelectDataZoomView() {\n        var _this = _super !== null && _super.apply(this, arguments) || this;\n        _this.type = SelectDataZoomView.type;\n        return _this;\n      }\n      SelectDataZoomView.type = 'dataZoom.select';\n      return SelectDataZoomView;\n    }(DataZoomView);\n\n    var each$8 = each;\n    var asc$1 = asc;\n    /**\r\n     * Operate single axis.\r\n     * One axis can only operated by one axis operator.\r\n     * Different dataZoomModels may be defined to operate the same axis.\r\n     * (i.e. 'inside' data zoom and 'slider' data zoom components)\r\n     * So dataZoomModels share one axisProxy in that case.\r\n     */\n    var AxisProxy = /** @class */function () {\n      function AxisProxy(dimName, axisIndex, dataZoomModel, ecModel) {\n        this._dimName = dimName;\n        this._axisIndex = axisIndex;\n        this.ecModel = ecModel;\n        this._dataZoomModel = dataZoomModel;\n        // /**\n        //  * @readOnly\n        //  * @private\n        //  */\n        // this.hasSeriesStacked;\n      }\n      /**\r\n       * Whether the axisProxy is hosted by dataZoomModel.\r\n       */\n      AxisProxy.prototype.hostedBy = function (dataZoomModel) {\n        return this._dataZoomModel === dataZoomModel;\n      };\n      /**\r\n       * @return Value can only be NaN or finite value.\r\n       */\n      AxisProxy.prototype.getDataValueWindow = function () {\n        return this._valueWindow.slice();\n      };\n      /**\r\n       * @return {Array.<number>}\r\n       */\n      AxisProxy.prototype.getDataPercentWindow = function () {\n        return this._percentWindow.slice();\n      };\n      AxisProxy.prototype.getTargetSeriesModels = function () {\n        var seriesModels = [];\n        this.ecModel.eachSeries(function (seriesModel) {\n          if (isCoordSupported(seriesModel)) {\n            var axisMainType = getAxisMainType(this._dimName);\n            var axisModel = seriesModel.getReferringComponents(axisMainType, SINGLE_REFERRING).models[0];\n            if (axisModel && this._axisIndex === axisModel.componentIndex) {\n              seriesModels.push(seriesModel);\n            }\n          }\n        }, this);\n        return seriesModels;\n      };\n      AxisProxy.prototype.getAxisModel = function () {\n        return this.ecModel.getComponent(this._dimName + 'Axis', this._axisIndex);\n      };\n      AxisProxy.prototype.getMinMaxSpan = function () {\n        return clone(this._minMaxSpan);\n      };\n      /**\r\n       * Only calculate by given range and this._dataExtent, do not change anything.\r\n       */\n      AxisProxy.prototype.calculateDataWindow = function (opt) {\n        var dataExtent = this._dataExtent;\n        var axisModel = this.getAxisModel();\n        var scale = axisModel.axis.scale;\n        var rangePropMode = this._dataZoomModel.getRangePropMode();\n        var percentExtent = [0, 100];\n        var percentWindow = [];\n        var valueWindow = [];\n        var hasPropModeValue;\n        each$8(['start', 'end'], function (prop, idx) {\n          var boundPercent = opt[prop];\n          var boundValue = opt[prop + 'Value'];\n          // Notice: dataZoom is based either on `percentProp` ('start', 'end') or\n          // on `valueProp` ('startValue', 'endValue'). (They are based on the data extent\n          // but not min/max of axis, which will be calculated by data window then).\n          // The former one is suitable for cases that a dataZoom component controls multiple\n          // axes with different unit or extent, and the latter one is suitable for accurate\n          // zoom by pixel (e.g., in dataZoomSelect).\n          // we use `getRangePropMode()` to mark which prop is used. `rangePropMode` is updated\n          // only when setOption or dispatchAction, otherwise it remains its original value.\n          // (Why not only record `percentProp` and always map to `valueProp`? Because\n          // the map `valueProp` -> `percentProp` -> `valueProp` probably not the original\n          // `valueProp`. consider two axes constrolled by one dataZoom. They have different\n          // data extent. All of values that are overflow the `dataExtent` will be calculated\n          // to percent '100%').\n          if (rangePropMode[idx] === 'percent') {\n            boundPercent == null && (boundPercent = percentExtent[idx]);\n            // Use scale.parse to math round for category or time axis.\n            boundValue = scale.parse(linearMap(boundPercent, percentExtent, dataExtent));\n          } else {\n            hasPropModeValue = true;\n            boundValue = boundValue == null ? dataExtent[idx] : scale.parse(boundValue);\n            // Calculating `percent` from `value` may be not accurate, because\n            // This calculation can not be inversed, because all of values that\n            // are overflow the `dataExtent` will be calculated to percent '100%'\n            boundPercent = linearMap(boundValue, dataExtent, percentExtent);\n          }\n          // valueWindow[idx] = round(boundValue);\n          // percentWindow[idx] = round(boundPercent);\n          // fallback to extent start/end when parsed value or percent is invalid\n          valueWindow[idx] = boundValue == null || isNaN(boundValue) ? dataExtent[idx] : boundValue;\n          percentWindow[idx] = boundPercent == null || isNaN(boundPercent) ? percentExtent[idx] : boundPercent;\n        });\n        asc$1(valueWindow);\n        asc$1(percentWindow);\n        // The windows from user calling of `dispatchAction` might be out of the extent,\n        // or do not obey the `min/maxSpan`, `min/maxValueSpan`. But we don't restrict window\n        // by `zoomLock` here, because we see `zoomLock` just as a interaction constraint,\n        // where API is able to initialize/modify the window size even though `zoomLock`\n        // specified.\n        var spans = this._minMaxSpan;\n        hasPropModeValue ? restrictSet(valueWindow, percentWindow, dataExtent, percentExtent, false) : restrictSet(percentWindow, valueWindow, percentExtent, dataExtent, true);\n        function restrictSet(fromWindow, toWindow, fromExtent, toExtent, toValue) {\n          var suffix = toValue ? 'Span' : 'ValueSpan';\n          sliderMove(0, fromWindow, fromExtent, 'all', spans['min' + suffix], spans['max' + suffix]);\n          for (var i = 0; i < 2; i++) {\n            toWindow[i] = linearMap(fromWindow[i], fromExtent, toExtent, true);\n            toValue && (toWindow[i] = scale.parse(toWindow[i]));\n          }\n        }\n        return {\n          valueWindow: valueWindow,\n          percentWindow: percentWindow\n        };\n      };\n      /**\r\n       * Notice: reset should not be called before series.restoreData() is called,\r\n       * so it is recommended to be called in \"process stage\" but not \"model init\r\n       * stage\".\r\n       */\n      AxisProxy.prototype.reset = function (dataZoomModel) {\n        if (dataZoomModel !== this._dataZoomModel) {\n          return;\n        }\n        var targetSeries = this.getTargetSeriesModels();\n        // Culculate data window and data extent, and record them.\n        this._dataExtent = calculateDataExtent(this, this._dimName, targetSeries);\n        // `calculateDataWindow` uses min/maxSpan.\n        this._updateMinMaxSpan();\n        var dataWindow = this.calculateDataWindow(dataZoomModel.settledOption);\n        this._valueWindow = dataWindow.valueWindow;\n        this._percentWindow = dataWindow.percentWindow;\n        // Update axis setting then.\n        this._setAxisModel();\n      };\n      AxisProxy.prototype.filterData = function (dataZoomModel, api) {\n        if (dataZoomModel !== this._dataZoomModel) {\n          return;\n        }\n        var axisDim = this._dimName;\n        var seriesModels = this.getTargetSeriesModels();\n        var filterMode = dataZoomModel.get('filterMode');\n        var valueWindow = this._valueWindow;\n        if (filterMode === 'none') {\n          return;\n        }\n        // FIXME\n        // Toolbox may has dataZoom injected. And if there are stacked bar chart\n        // with NaN data, NaN will be filtered and stack will be wrong.\n        // So we need to force the mode to be set empty.\n        // In fect, it is not a big deal that do not support filterMode-'filter'\n        // when using toolbox#dataZoom, utill tooltip#dataZoom support \"single axis\n        // selection\" some day, which might need \"adapt to data extent on the\n        // otherAxis\", which is disabled by filterMode-'empty'.\n        // But currently, stack has been fixed to based on value but not index,\n        // so this is not an issue any more.\n        // let otherAxisModel = this.getOtherAxisModel();\n        // if (dataZoomModel.get('$fromToolbox')\n        //     && otherAxisModel\n        //     && otherAxisModel.hasSeriesStacked\n        // ) {\n        //     filterMode = 'empty';\n        // }\n        // TODO\n        // filterMode 'weakFilter' and 'empty' is not optimized for huge data yet.\n        each$8(seriesModels, function (seriesModel) {\n          var seriesData = seriesModel.getData();\n          var dataDims = seriesData.mapDimensionsAll(axisDim);\n          if (!dataDims.length) {\n            return;\n          }\n          if (filterMode === 'weakFilter') {\n            var store_1 = seriesData.getStore();\n            var dataDimIndices_1 = map(dataDims, function (dim) {\n              return seriesData.getDimensionIndex(dim);\n            }, seriesData);\n            seriesData.filterSelf(function (dataIndex) {\n              var leftOut;\n              var rightOut;\n              var hasValue;\n              for (var i = 0; i < dataDims.length; i++) {\n                var value = store_1.get(dataDimIndices_1[i], dataIndex);\n                var thisHasValue = !isNaN(value);\n                var thisLeftOut = value < valueWindow[0];\n                var thisRightOut = value > valueWindow[1];\n                if (thisHasValue && !thisLeftOut && !thisRightOut) {\n                  return true;\n                }\n                thisHasValue && (hasValue = true);\n                thisLeftOut && (leftOut = true);\n                thisRightOut && (rightOut = true);\n              }\n              // If both left out and right out, do not filter.\n              return hasValue && leftOut && rightOut;\n            });\n          } else {\n            each$8(dataDims, function (dim) {\n              if (filterMode === 'empty') {\n                seriesModel.setData(seriesData = seriesData.map(dim, function (value) {\n                  return !isInWindow(value) ? NaN : value;\n                }));\n              } else {\n                var range = {};\n                range[dim] = valueWindow;\n                // console.time('select');\n                seriesData.selectRange(range);\n                // console.timeEnd('select');\n              }\n            });\n          }\n          each$8(dataDims, function (dim) {\n            seriesData.setApproximateExtent(valueWindow, dim);\n          });\n        });\n        function isInWindow(value) {\n          return value >= valueWindow[0] && value <= valueWindow[1];\n        }\n      };\n      AxisProxy.prototype._updateMinMaxSpan = function () {\n        var minMaxSpan = this._minMaxSpan = {};\n        var dataZoomModel = this._dataZoomModel;\n        var dataExtent = this._dataExtent;\n        each$8(['min', 'max'], function (minMax) {\n          var percentSpan = dataZoomModel.get(minMax + 'Span');\n          var valueSpan = dataZoomModel.get(minMax + 'ValueSpan');\n          valueSpan != null && (valueSpan = this.getAxisModel().axis.scale.parse(valueSpan));\n          // minValueSpan and maxValueSpan has higher priority than minSpan and maxSpan\n          if (valueSpan != null) {\n            percentSpan = linearMap(dataExtent[0] + valueSpan, dataExtent, [0, 100], true);\n          } else if (percentSpan != null) {\n            valueSpan = linearMap(percentSpan, [0, 100], dataExtent, true) - dataExtent[0];\n          }\n          minMaxSpan[minMax + 'Span'] = percentSpan;\n          minMaxSpan[minMax + 'ValueSpan'] = valueSpan;\n        }, this);\n      };\n      AxisProxy.prototype._setAxisModel = function () {\n        var axisModel = this.getAxisModel();\n        var percentWindow = this._percentWindow;\n        var valueWindow = this._valueWindow;\n        if (!percentWindow) {\n          return;\n        }\n        // [0, 500]: arbitrary value, guess axis extent.\n        var precision = getPixelPrecision(valueWindow, [0, 500]);\n        precision = Math.min(precision, 20);\n        // For value axis, if min/max/scale are not set, we just use the extent obtained\n        // by series data, which may be a little different from the extent calculated by\n        // `axisHelper.getScaleExtent`. But the different just affects the experience a\n        // little when zooming. So it will not be fixed until some users require it strongly.\n        var rawExtentInfo = axisModel.axis.scale.rawExtentInfo;\n        if (percentWindow[0] !== 0) {\n          rawExtentInfo.setDeterminedMinMax('min', +valueWindow[0].toFixed(precision));\n        }\n        if (percentWindow[1] !== 100) {\n          rawExtentInfo.setDeterminedMinMax('max', +valueWindow[1].toFixed(precision));\n        }\n        rawExtentInfo.freeze();\n      };\n      return AxisProxy;\n    }();\n    function calculateDataExtent(axisProxy, axisDim, seriesModels) {\n      var dataExtent = [Infinity, -Infinity];\n      each$8(seriesModels, function (seriesModel) {\n        unionAxisExtentFromData(dataExtent, seriesModel.getData(), axisDim);\n      });\n      // It is important to get \"consistent\" extent when more then one axes is\n      // controlled by a `dataZoom`, otherwise those axes will not be synchronized\n      // when zooming. But it is difficult to know what is \"consistent\", considering\n      // axes have different type or even different meanings (For example, two\n      // time axes are used to compare data of the same date in different years).\n      // So basically dataZoom just obtains extent by series.data (in category axis\n      // extent can be obtained from axis.data).\n      // Nevertheless, user can set min/max/scale on axes to make extent of axes\n      // consistent.\n      var axisModel = axisProxy.getAxisModel();\n      var rawExtentResult = ensureScaleRawExtentInfo(axisModel.axis.scale, axisModel, dataExtent).calculate();\n      return [rawExtentResult.min, rawExtentResult.max];\n    }\n\n    var dataZoomProcessor = {\n      // `dataZoomProcessor` will only be performed in needed series. Consider if\n      // there is a line series and a pie series, it is better not to update the\n      // line series if only pie series is needed to be updated.\n      getTargetSeries: function (ecModel) {\n        function eachAxisModel(cb) {\n          ecModel.eachComponent('dataZoom', function (dataZoomModel) {\n            dataZoomModel.eachTargetAxis(function (axisDim, axisIndex) {\n              var axisModel = ecModel.getComponent(getAxisMainType(axisDim), axisIndex);\n              cb(axisDim, axisIndex, axisModel, dataZoomModel);\n            });\n          });\n        }\n        // FIXME: it brings side-effect to `getTargetSeries`.\n        // Prepare axis proxies.\n        eachAxisModel(function (axisDim, axisIndex, axisModel, dataZoomModel) {\n          // dispose all last axis proxy, in case that some axis are deleted.\n          axisModel.__dzAxisProxy = null;\n        });\n        var proxyList = [];\n        eachAxisModel(function (axisDim, axisIndex, axisModel, dataZoomModel) {\n          // Different dataZooms may constrol the same axis. In that case,\n          // an axisProxy serves both of them.\n          if (!axisModel.__dzAxisProxy) {\n            // Use the first dataZoomModel as the main model of axisProxy.\n            axisModel.__dzAxisProxy = new AxisProxy(axisDim, axisIndex, dataZoomModel, ecModel);\n            proxyList.push(axisModel.__dzAxisProxy);\n          }\n        });\n        var seriesModelMap = createHashMap();\n        each(proxyList, function (axisProxy) {\n          each(axisProxy.getTargetSeriesModels(), function (seriesModel) {\n            seriesModelMap.set(seriesModel.uid, seriesModel);\n          });\n        });\n        return seriesModelMap;\n      },\n      // Consider appendData, where filter should be performed. Because data process is\n      // in block mode currently, it is not need to worry about that the overallProgress\n      // execute every frame.\n      overallReset: function (ecModel, api) {\n        ecModel.eachComponent('dataZoom', function (dataZoomModel) {\n          // We calculate window and reset axis here but not in model\n          // init stage and not after action dispatch handler, because\n          // reset should be called after seriesData.restoreData.\n          dataZoomModel.eachTargetAxis(function (axisDim, axisIndex) {\n            dataZoomModel.getAxisProxy(axisDim, axisIndex).reset(dataZoomModel);\n          });\n          // Caution: data zoom filtering is order sensitive when using\n          // percent range and no min/max/scale set on axis.\n          // For example, we have dataZoom definition:\n          // [\n          //      {xAxisIndex: 0, start: 30, end: 70},\n          //      {yAxisIndex: 0, start: 20, end: 80}\n          // ]\n          // In this case, [20, 80] of y-dataZoom should be based on data\n          // that have filtered by x-dataZoom using range of [30, 70],\n          // but should not be based on full raw data. Thus sliding\n          // x-dataZoom will change both ranges of xAxis and yAxis,\n          // while sliding y-dataZoom will only change the range of yAxis.\n          // So we should filter x-axis after reset x-axis immediately,\n          // and then reset y-axis and filter y-axis.\n          dataZoomModel.eachTargetAxis(function (axisDim, axisIndex) {\n            dataZoomModel.getAxisProxy(axisDim, axisIndex).filterData(dataZoomModel, api);\n          });\n        });\n        ecModel.eachComponent('dataZoom', function (dataZoomModel) {\n          // Fullfill all of the range props so that user\n          // is able to get them from chart.getOption().\n          var axisProxy = dataZoomModel.findRepresentativeAxisProxy();\n          if (axisProxy) {\n            var percentRange = axisProxy.getDataPercentWindow();\n            var valueRange = axisProxy.getDataValueWindow();\n            dataZoomModel.setCalculatedRange({\n              start: percentRange[0],\n              end: percentRange[1],\n              startValue: valueRange[0],\n              endValue: valueRange[1]\n            });\n          }\n        });\n      }\n    };\n\n    function installDataZoomAction(registers) {\n      registers.registerAction('dataZoom', function (payload, ecModel) {\n        var effectedModels = findEffectedDataZooms(ecModel, payload);\n        each(effectedModels, function (dataZoomModel) {\n          dataZoomModel.setRawRange({\n            start: payload.start,\n            end: payload.end,\n            startValue: payload.startValue,\n            endValue: payload.endValue\n          });\n        });\n      });\n    }\n\n    var installed = false;\n    function installCommon(registers) {\n      if (installed) {\n        return;\n      }\n      installed = true;\n      registers.registerProcessor(registers.PRIORITY.PROCESSOR.FILTER, dataZoomProcessor);\n      installDataZoomAction(registers);\n      registers.registerSubTypeDefaulter('dataZoom', function () {\n        // Default 'slider' when no type specified.\n        return 'slider';\n      });\n    }\n\n    function install$y(registers) {\n      registers.registerComponentModel(SelectDataZoomModel);\n      registers.registerComponentView(SelectDataZoomView);\n      installCommon(registers);\n    }\n\n    /*\n    * Licensed to the Apache Software Foundation (ASF) under one\n    * or more contributor license agreements.  See the NOTICE file\n    * distributed with this work for additional information\n    * regarding copyright ownership.  The ASF licenses this file\n    * to you under the Apache License, Version 2.0 (the\n    * \"License\"); you may not use this file except in compliance\n    * with the License.  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,\n    * software distributed under the License is distributed on an\n    * \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\n    * KIND, either express or implied.  See the License for the\n    * specific language governing permissions and limitations\n    * under the License.\n    */\n\n\n    /**\n     * AUTO-GENERATED FILE. DO NOT MODIFY.\n     */\n\n    var ToolboxFeature = /** @class */function () {\n      function ToolboxFeature() {}\n      return ToolboxFeature;\n    }();\n    var features = {};\n    function registerFeature(name, ctor) {\n      features[name] = ctor;\n    }\n    function getFeature(name) {\n      return features[name];\n    }\n\n    var ToolboxModel = /** @class */function (_super) {\n      __extends(ToolboxModel, _super);\n      function ToolboxModel() {\n        var _this = _super !== null && _super.apply(this, arguments) || this;\n        _this.type = ToolboxModel.type;\n        return _this;\n      }\n      ToolboxModel.prototype.optionUpdated = function () {\n        _super.prototype.optionUpdated.apply(this, arguments);\n        var ecModel = this.ecModel;\n        each(this.option.feature, function (featureOpt, featureName) {\n          var Feature = getFeature(featureName);\n          if (Feature) {\n            if (Feature.getDefaultOption) {\n              Feature.defaultOption = Feature.getDefaultOption(ecModel);\n            }\n            merge(featureOpt, Feature.defaultOption);\n          }\n        });\n      };\n      ToolboxModel.type = 'toolbox';\n      ToolboxModel.layoutMode = {\n        type: 'box',\n        ignoreSize: true\n      };\n      ToolboxModel.defaultOption = {\n        show: true,\n        z: 6,\n        // zlevel: 0,\n        orient: 'horizontal',\n        left: 'right',\n        top: 'top',\n        // right\n        // bottom\n        backgroundColor: 'transparent',\n        borderColor: '#ccc',\n        borderRadius: 0,\n        borderWidth: 0,\n        padding: 5,\n        itemSize: 15,\n        itemGap: 8,\n        showTitle: true,\n        iconStyle: {\n          borderColor: '#666',\n          color: 'none'\n        },\n        emphasis: {\n          iconStyle: {\n            borderColor: '#3E98C5'\n          }\n        },\n        // textStyle: {},\n        // feature\n        tooltip: {\n          show: false,\n          position: 'bottom'\n        }\n      };\n      return ToolboxModel;\n    }(ComponentModel);\n\n    /**\r\n     * Layout list like component.\r\n     * It will box layout each items in group of component and then position the whole group in the viewport\r\n     * @param {module:zrender/group/Group} group\r\n     * @param {module:echarts/model/Component} componentModel\r\n     * @param {module:echarts/ExtensionAPI}\r\n     */\n    function layout$3(group, componentModel, api) {\n      var boxLayoutParams = componentModel.getBoxLayoutParams();\n      var padding = componentModel.get('padding');\n      var viewportSize = {\n        width: api.getWidth(),\n        height: api.getHeight()\n      };\n      var rect = getLayoutRect(boxLayoutParams, viewportSize, padding);\n      box(componentModel.get('orient'), group, componentModel.get('itemGap'), rect.width, rect.height);\n      positionElement(group, boxLayoutParams, viewportSize, padding);\n    }\n    function makeBackground(rect, componentModel) {\n      var padding = normalizeCssArray$1(componentModel.get('padding'));\n      var style = componentModel.getItemStyle(['color', 'opacity']);\n      style.fill = componentModel.get('backgroundColor');\n      rect = new Rect({\n        shape: {\n          x: rect.x - padding[3],\n          y: rect.y - padding[0],\n          width: rect.width + padding[1] + padding[3],\n          height: rect.height + padding[0] + padding[2],\n          r: componentModel.get('borderRadius')\n        },\n        style: style,\n        silent: true,\n        z2: -1\n      });\n      // FIXME\n      // `subPixelOptimizeRect` may bring some gap between edge of viewpart\n      // and background rect when setting like `left: 0`, `top: 0`.\n      // graphic.subPixelOptimizeRect(rect);\n      return rect;\n    }\n\n    var ToolboxView = /** @class */function (_super) {\n      __extends(ToolboxView, _super);\n      function ToolboxView() {\n        return _super !== null && _super.apply(this, arguments) || this;\n      }\n      ToolboxView.prototype.render = function (toolboxModel, ecModel, api, payload) {\n        var group = this.group;\n        group.removeAll();\n        if (!toolboxModel.get('show')) {\n          return;\n        }\n        var itemSize = +toolboxModel.get('itemSize');\n        var isVertical = toolboxModel.get('orient') === 'vertical';\n        var featureOpts = toolboxModel.get('feature') || {};\n        var features = this._features || (this._features = {});\n        var featureNames = [];\n        each(featureOpts, function (opt, name) {\n          featureNames.push(name);\n        });\n        new DataDiffer(this._featureNames || [], featureNames).add(processFeature).update(processFeature).remove(curry(processFeature, null)).execute();\n        // Keep for diff.\n        this._featureNames = featureNames;\n        function processFeature(newIndex, oldIndex) {\n          var featureName = featureNames[newIndex];\n          var oldName = featureNames[oldIndex];\n          var featureOpt = featureOpts[featureName];\n          var featureModel = new Model(featureOpt, toolboxModel, toolboxModel.ecModel);\n          var feature;\n          // FIX#11236, merge feature title from MagicType newOption. TODO: consider seriesIndex ?\n          if (payload && payload.newTitle != null && payload.featureName === featureName) {\n            featureOpt.title = payload.newTitle;\n          }\n          if (featureName && !oldName) {\n            // Create\n            if (isUserFeatureName(featureName)) {\n              feature = {\n                onclick: featureModel.option.onclick,\n                featureName: featureName\n              };\n            } else {\n              var Feature = getFeature(featureName);\n              if (!Feature) {\n                return;\n              }\n              feature = new Feature();\n            }\n            features[featureName] = feature;\n          } else {\n            feature = features[oldName];\n            // If feature does not exist.\n            if (!feature) {\n              return;\n            }\n          }\n          feature.uid = getUID('toolbox-feature');\n          feature.model = featureModel;\n          feature.ecModel = ecModel;\n          feature.api = api;\n          var isToolboxFeature = feature instanceof ToolboxFeature;\n          if (!featureName && oldName) {\n            isToolboxFeature && feature.dispose && feature.dispose(ecModel, api);\n            return;\n          }\n          if (!featureModel.get('show') || isToolboxFeature && feature.unusable) {\n            isToolboxFeature && feature.remove && feature.remove(ecModel, api);\n            return;\n          }\n          createIconPaths(featureModel, feature, featureName);\n          featureModel.setIconStatus = function (iconName, status) {\n            var option = this.option;\n            var iconPaths = this.iconPaths;\n            option.iconStatus = option.iconStatus || {};\n            option.iconStatus[iconName] = status;\n            if (iconPaths[iconName]) {\n              (status === 'emphasis' ? enterEmphasis : leaveEmphasis)(iconPaths[iconName]);\n            }\n          };\n          if (feature instanceof ToolboxFeature) {\n            if (feature.render) {\n              feature.render(featureModel, ecModel, api, payload);\n            }\n          }\n        }\n        function createIconPaths(featureModel, feature, featureName) {\n          var iconStyleModel = featureModel.getModel('iconStyle');\n          var iconStyleEmphasisModel = featureModel.getModel(['emphasis', 'iconStyle']);\n          // If one feature has multiple icons, they are organized as\n          // {\n          //     icon: {\n          //         foo: '',\n          //         bar: ''\n          //     },\n          //     title: {\n          //         foo: '',\n          //         bar: ''\n          //     }\n          // }\n          var icons = feature instanceof ToolboxFeature && feature.getIcons ? feature.getIcons() : featureModel.get('icon');\n          var titles = featureModel.get('title') || {};\n          var iconsMap;\n          var titlesMap;\n          if (isString(icons)) {\n            iconsMap = {};\n            iconsMap[featureName] = icons;\n          } else {\n            iconsMap = icons;\n          }\n          if (isString(titles)) {\n            titlesMap = {};\n            titlesMap[featureName] = titles;\n          } else {\n            titlesMap = titles;\n          }\n          var iconPaths = featureModel.iconPaths = {};\n          each(iconsMap, function (iconStr, iconName) {\n            var path = createIcon(iconStr, {}, {\n              x: -itemSize / 2,\n              y: -itemSize / 2,\n              width: itemSize,\n              height: itemSize\n            }); // TODO handling image\n            path.setStyle(iconStyleModel.getItemStyle());\n            var pathEmphasisState = path.ensureState('emphasis');\n            pathEmphasisState.style = iconStyleEmphasisModel.getItemStyle();\n            // Text position calculation\n            // TODO: extract `textStyle` from `iconStyle` and use `createTextStyle`\n            var textContent = new ZRText({\n              style: {\n                text: titlesMap[iconName],\n                align: iconStyleEmphasisModel.get('textAlign'),\n                borderRadius: iconStyleEmphasisModel.get('textBorderRadius'),\n                padding: iconStyleEmphasisModel.get('textPadding'),\n                fill: null,\n                font: getFont({\n                  fontStyle: iconStyleEmphasisModel.get('textFontStyle'),\n                  fontFamily: iconStyleEmphasisModel.get('textFontFamily'),\n                  fontSize: iconStyleEmphasisModel.get('textFontSize'),\n                  fontWeight: iconStyleEmphasisModel.get('textFontWeight')\n                }, ecModel)\n              },\n              ignore: true\n            });\n            path.setTextContent(textContent);\n            setTooltipConfig({\n              el: path,\n              componentModel: toolboxModel,\n              itemName: iconName,\n              formatterParamsExtra: {\n                title: titlesMap[iconName]\n              }\n            });\n            path.__title = titlesMap[iconName];\n            path.on('mouseover', function () {\n              // Should not reuse above hoverStyle, which might be modified.\n              var hoverStyle = iconStyleEmphasisModel.getItemStyle();\n              var defaultTextPosition = isVertical ? toolboxModel.get('right') == null && toolboxModel.get('left') !== 'right' ? 'right' : 'left' : toolboxModel.get('bottom') == null && toolboxModel.get('top') !== 'bottom' ? 'bottom' : 'top';\n              textContent.setStyle({\n                fill: iconStyleEmphasisModel.get('textFill') || hoverStyle.fill || hoverStyle.stroke || '#000',\n                backgroundColor: iconStyleEmphasisModel.get('textBackgroundColor')\n              });\n              path.setTextConfig({\n                position: iconStyleEmphasisModel.get('textPosition') || defaultTextPosition\n              });\n              textContent.ignore = !toolboxModel.get('showTitle');\n              // Use enterEmphasis and leaveEmphasis provide by ec.\n              // There are flags managed by the echarts.\n              api.enterEmphasis(this);\n            }).on('mouseout', function () {\n              if (featureModel.get(['iconStatus', iconName]) !== 'emphasis') {\n                api.leaveEmphasis(this);\n              }\n              textContent.hide();\n            });\n            (featureModel.get(['iconStatus', iconName]) === 'emphasis' ? enterEmphasis : leaveEmphasis)(path);\n            group.add(path);\n            path.on('click', bind(feature.onclick, feature, ecModel, api, iconName));\n            iconPaths[iconName] = path;\n          });\n        }\n        layout$3(group, toolboxModel, api);\n        // Render background after group is layout\n        // FIXME\n        group.add(makeBackground(group.getBoundingRect(), toolboxModel));\n        // Adjust icon title positions to avoid them out of screen\n        isVertical || group.eachChild(function (icon) {\n          var titleText = icon.__title;\n          // const hoverStyle = icon.hoverStyle;\n          // TODO simplify code?\n          var emphasisState = icon.ensureState('emphasis');\n          var emphasisTextConfig = emphasisState.textConfig || (emphasisState.textConfig = {});\n          var textContent = icon.getTextContent();\n          var emphasisTextState = textContent && textContent.ensureState('emphasis');\n          // May be background element\n          if (emphasisTextState && !isFunction(emphasisTextState) && titleText) {\n            var emphasisTextStyle = emphasisTextState.style || (emphasisTextState.style = {});\n            var rect = getBoundingRect(titleText, ZRText.makeFont(emphasisTextStyle));\n            var offsetX = icon.x + group.x;\n            var offsetY = icon.y + group.y + itemSize;\n            var needPutOnTop = false;\n            if (offsetY + rect.height > api.getHeight()) {\n              emphasisTextConfig.position = 'top';\n              needPutOnTop = true;\n            }\n            var topOffset = needPutOnTop ? -5 - rect.height : itemSize + 10;\n            if (offsetX + rect.width / 2 > api.getWidth()) {\n              emphasisTextConfig.position = ['100%', topOffset];\n              emphasisTextStyle.align = 'right';\n            } else if (offsetX - rect.width / 2 < 0) {\n              emphasisTextConfig.position = [0, topOffset];\n              emphasisTextStyle.align = 'left';\n            }\n          }\n        });\n      };\n      ToolboxView.prototype.updateView = function (toolboxModel, ecModel, api, payload) {\n        each(this._features, function (feature) {\n          feature instanceof ToolboxFeature && feature.updateView && feature.updateView(feature.model, ecModel, api, payload);\n        });\n      };\n      // updateLayout(toolboxModel, ecModel, api, payload) {\n      //     zrUtil.each(this._features, function (feature) {\n      //         feature.updateLayout && feature.updateLayout(feature.model, ecModel, api, payload);\n      //     });\n      // },\n      ToolboxView.prototype.remove = function (ecModel, api) {\n        each(this._features, function (feature) {\n          feature instanceof ToolboxFeature && feature.remove && feature.remove(ecModel, api);\n        });\n        this.group.removeAll();\n      };\n      ToolboxView.prototype.dispose = function (ecModel, api) {\n        each(this._features, function (feature) {\n          feature instanceof ToolboxFeature && feature.dispose && feature.dispose(ecModel, api);\n        });\n      };\n      ToolboxView.type = 'toolbox';\n      return ToolboxView;\n    }(ComponentView);\n    function isUserFeatureName(featureName) {\n      return featureName.indexOf('my') === 0;\n    }\n\n    var SaveAsImage = /** @class */function (_super) {\n      __extends(SaveAsImage, _super);\n      function SaveAsImage() {\n        return _super !== null && _super.apply(this, arguments) || this;\n      }\n      SaveAsImage.prototype.onclick = function (ecModel, api) {\n        var model = this.model;\n        var title = model.get('name') || ecModel.get('title.0.text') || 'echarts';\n        var isSvg = api.getZr().painter.getType() === 'svg';\n        var type = isSvg ? 'svg' : model.get('type', true) || 'png';\n        var url = api.getConnectedDataURL({\n          type: type,\n          backgroundColor: model.get('backgroundColor', true) || ecModel.get('backgroundColor') || '#fff',\n          connectedBackgroundColor: model.get('connectedBackgroundColor'),\n          excludeComponents: model.get('excludeComponents'),\n          pixelRatio: model.get('pixelRatio')\n        });\n        var browser = env.browser;\n        // Chrome, Firefox, New Edge\n        if (typeof MouseEvent === 'function' && (browser.newEdge || !browser.ie && !browser.edge)) {\n          var $a = document.createElement('a');\n          $a.download = title + '.' + type;\n          $a.target = '_blank';\n          $a.href = url;\n          var evt = new MouseEvent('click', {\n            // some micro front-end framework， window maybe is a Proxy\n            view: document.defaultView,\n            bubbles: true,\n            cancelable: false\n          });\n          $a.dispatchEvent(evt);\n        }\n        // IE or old Edge\n        else {\n          // @ts-ignore\n          if (window.navigator.msSaveOrOpenBlob || isSvg) {\n            var parts = url.split(',');\n            // data:[<mime type>][;charset=<charset>][;base64],<encoded data>\n            var base64Encoded = parts[0].indexOf('base64') > -1;\n            var bstr = isSvg\n            // should decode the svg data uri first\n            ? decodeURIComponent(parts[1]) : parts[1];\n            // only `atob` when the data uri is encoded with base64\n            // otherwise, like `svg` data uri exported by zrender,\n            // there will be an error, for it's not encoded with base64.\n            // (just a url-encoded string through `encodeURIComponent`)\n            base64Encoded && (bstr = window.atob(bstr));\n            var filename = title + '.' + type;\n            // @ts-ignore\n            if (window.navigator.msSaveOrOpenBlob) {\n              var n = bstr.length;\n              var u8arr = new Uint8Array(n);\n              while (n--) {\n                u8arr[n] = bstr.charCodeAt(n);\n              }\n              var blob = new Blob([u8arr]); // @ts-ignore\n              window.navigator.msSaveOrOpenBlob(blob, filename);\n            } else {\n              var frame = document.createElement('iframe');\n              document.body.appendChild(frame);\n              var cw = frame.contentWindow;\n              var doc = cw.document;\n              doc.open('image/svg+xml', 'replace');\n              doc.write(bstr);\n              doc.close();\n              cw.focus();\n              doc.execCommand('SaveAs', true, filename);\n              document.body.removeChild(frame);\n            }\n          } else {\n            var lang = model.get('lang');\n            var html = '' + '<body style=\"margin:0;\">' + '<img src=\"' + url + '\" style=\"max-width:100%;\" title=\"' + (lang && lang[0] || '') + '\" />' + '</body>';\n            var tab = window.open();\n            tab.document.write(html);\n            tab.document.title = title;\n          }\n        }\n      };\n      SaveAsImage.getDefaultOption = function (ecModel) {\n        var defaultOption = {\n          show: true,\n          icon: 'M4.7,22.9L29.3,45.5L54.7,23.4M4.6,43.6L4.6,58L53.8,58L53.8,43.6M29.2,45.1L29.2,0',\n          title: ecModel.getLocaleModel().get(['toolbox', 'saveAsImage', 'title']),\n          type: 'png',\n          // Default use option.backgroundColor\n          // backgroundColor: '#fff',\n          connectedBackgroundColor: '#fff',\n          name: '',\n          excludeComponents: ['toolbox'],\n          // use current pixel ratio of device by default\n          // pixelRatio: 1,\n          lang: ecModel.getLocaleModel().get(['toolbox', 'saveAsImage', 'lang'])\n        };\n        return defaultOption;\n      };\n      return SaveAsImage;\n    }(ToolboxFeature);\n\n    var INNER_STACK_KEYWORD = '__ec_magicType_stack__';\n    var radioTypes = [['line', 'bar'], ['stack']];\n    var MagicType = /** @class */function (_super) {\n      __extends(MagicType, _super);\n      function MagicType() {\n        return _super !== null && _super.apply(this, arguments) || this;\n      }\n      MagicType.prototype.getIcons = function () {\n        var model = this.model;\n        var availableIcons = model.get('icon');\n        var icons = {};\n        each(model.get('type'), function (type) {\n          if (availableIcons[type]) {\n            icons[type] = availableIcons[type];\n          }\n        });\n        return icons;\n      };\n      MagicType.getDefaultOption = function (ecModel) {\n        var defaultOption = {\n          show: true,\n          type: [],\n          // Icon group\n          icon: {\n            line: 'M4.1,28.9h7.1l9.3-22l7.4,38l9.7-19.7l3,12.8h14.9M4.1,58h51.4',\n            bar: 'M6.7,22.9h10V48h-10V22.9zM24.9,13h10v35h-10V13zM43.2,2h10v46h-10V2zM3.1,58h53.7',\n            // eslint-disable-next-line\n            stack: 'M8.2,38.4l-8.4,4.1l30.6,15.3L60,42.5l-8.1-4.1l-21.5,11L8.2,38.4z M51.9,30l-8.1,4.2l-13.4,6.9l-13.9-6.9L8.2,30l-8.4,4.2l8.4,4.2l22.2,11l21.5-11l8.1-4.2L51.9,30z M51.9,21.7l-8.1,4.2L35.7,30l-5.3,2.8L24.9,30l-8.4-4.1l-8.3-4.2l-8.4,4.2L8.2,30l8.3,4.2l13.9,6.9l13.4-6.9l8.1-4.2l8.1-4.1L51.9,21.7zM30.4,2.2L-0.2,17.5l8.4,4.1l8.3,4.2l8.4,4.2l5.5,2.7l5.3-2.7l8.1-4.2l8.1-4.2l8.1-4.1L30.4,2.2z' // jshint ignore:line\n          },\n          // `line`, `bar`, `stack`, `tiled`\n          title: ecModel.getLocaleModel().get(['toolbox', 'magicType', 'title']),\n          option: {},\n          seriesIndex: {}\n        };\n        return defaultOption;\n      };\n      MagicType.prototype.onclick = function (ecModel, api, type) {\n        var model = this.model;\n        var seriesIndex = model.get(['seriesIndex', type]);\n        // Not supported magicType\n        if (!seriesOptGenreator[type]) {\n          return;\n        }\n        var newOption = {\n          series: []\n        };\n        var generateNewSeriesTypes = function (seriesModel) {\n          var seriesType = seriesModel.subType;\n          var seriesId = seriesModel.id;\n          var newSeriesOpt = seriesOptGenreator[type](seriesType, seriesId, seriesModel, model);\n          if (newSeriesOpt) {\n            // PENDING If merge original option?\n            defaults(newSeriesOpt, seriesModel.option);\n            newOption.series.push(newSeriesOpt);\n          }\n          // Modify boundaryGap\n          var coordSys = seriesModel.coordinateSystem;\n          if (coordSys && coordSys.type === 'cartesian2d' && (type === 'line' || type === 'bar')) {\n            var categoryAxis = coordSys.getAxesByScale('ordinal')[0];\n            if (categoryAxis) {\n              var axisDim = categoryAxis.dim;\n              var axisType = axisDim + 'Axis';\n              var axisModel = seriesModel.getReferringComponents(axisType, SINGLE_REFERRING).models[0];\n              var axisIndex = axisModel.componentIndex;\n              newOption[axisType] = newOption[axisType] || [];\n              for (var i = 0; i <= axisIndex; i++) {\n                newOption[axisType][axisIndex] = newOption[axisType][axisIndex] || {};\n              }\n              newOption[axisType][axisIndex].boundaryGap = type === 'bar';\n            }\n          }\n        };\n        each(radioTypes, function (radio) {\n          if (indexOf(radio, type) >= 0) {\n            each(radio, function (item) {\n              model.setIconStatus(item, 'normal');\n            });\n          }\n        });\n        model.setIconStatus(type, 'emphasis');\n        ecModel.eachComponent({\n          mainType: 'series',\n          query: seriesIndex == null ? null : {\n            seriesIndex: seriesIndex\n          }\n        }, generateNewSeriesTypes);\n        var newTitle;\n        var currentType = type;\n        // Change title of stack\n        if (type === 'stack') {\n          // use titles in model instead of ecModel\n          // as stack and tiled appears in pair, just flip them\n          // no need of checking stack state\n          newTitle = merge({\n            stack: model.option.title.tiled,\n            tiled: model.option.title.stack\n          }, model.option.title);\n          if (model.get(['iconStatus', type]) !== 'emphasis') {\n            currentType = 'tiled';\n          }\n        }\n        api.dispatchAction({\n          type: 'changeMagicType',\n          currentType: currentType,\n          newOption: newOption,\n          newTitle: newTitle,\n          featureName: 'magicType'\n        });\n      };\n      return MagicType;\n    }(ToolboxFeature);\n    var seriesOptGenreator = {\n      'line': function (seriesType, seriesId, seriesModel, model) {\n        if (seriesType === 'bar') {\n          return merge({\n            id: seriesId,\n            type: 'line',\n            // Preserve data related option\n            data: seriesModel.get('data'),\n            stack: seriesModel.get('stack'),\n            markPoint: seriesModel.get('markPoint'),\n            markLine: seriesModel.get('markLine')\n          }, model.get(['option', 'line']) || {}, true);\n        }\n      },\n      'bar': function (seriesType, seriesId, seriesModel, model) {\n        if (seriesType === 'line') {\n          return merge({\n            id: seriesId,\n            type: 'bar',\n            // Preserve data related option\n            data: seriesModel.get('data'),\n            stack: seriesModel.get('stack'),\n            markPoint: seriesModel.get('markPoint'),\n            markLine: seriesModel.get('markLine')\n          }, model.get(['option', 'bar']) || {}, true);\n        }\n      },\n      'stack': function (seriesType, seriesId, seriesModel, model) {\n        var isStack = seriesModel.get('stack') === INNER_STACK_KEYWORD;\n        if (seriesType === 'line' || seriesType === 'bar') {\n          model.setIconStatus('stack', isStack ? 'normal' : 'emphasis');\n          return merge({\n            id: seriesId,\n            stack: isStack ? '' : INNER_STACK_KEYWORD\n          }, model.get(['option', 'stack']) || {}, true);\n        }\n      }\n    };\n    // TODO: SELF REGISTERED.\n    registerAction({\n      type: 'changeMagicType',\n      event: 'magicTypeChanged',\n      update: 'prepareAndUpdate'\n    }, function (payload, ecModel) {\n      ecModel.mergeOption(payload.newOption);\n    });\n\n    /* global document */\n    var BLOCK_SPLITER = new Array(60).join('-');\n    var ITEM_SPLITER = '\\t';\n    /**\r\n     * Group series into two types\r\n     *  1. on category axis, like line, bar\r\n     *  2. others, like scatter, pie\r\n     */\n    function groupSeries(ecModel) {\n      var seriesGroupByCategoryAxis = {};\n      var otherSeries = [];\n      var meta = [];\n      ecModel.eachRawSeries(function (seriesModel) {\n        var coordSys = seriesModel.coordinateSystem;\n        if (coordSys && (coordSys.type === 'cartesian2d' || coordSys.type === 'polar')) {\n          // TODO: TYPE Consider polar? Include polar may increase unecessary bundle size.\n          var baseAxis = coordSys.getBaseAxis();\n          if (baseAxis.type === 'category') {\n            var key = baseAxis.dim + '_' + baseAxis.index;\n            if (!seriesGroupByCategoryAxis[key]) {\n              seriesGroupByCategoryAxis[key] = {\n                categoryAxis: baseAxis,\n                valueAxis: coordSys.getOtherAxis(baseAxis),\n                series: []\n              };\n              meta.push({\n                axisDim: baseAxis.dim,\n                axisIndex: baseAxis.index\n              });\n            }\n            seriesGroupByCategoryAxis[key].series.push(seriesModel);\n          } else {\n            otherSeries.push(seriesModel);\n          }\n        } else {\n          otherSeries.push(seriesModel);\n        }\n      });\n      return {\n        seriesGroupByCategoryAxis: seriesGroupByCategoryAxis,\n        other: otherSeries,\n        meta: meta\n      };\n    }\n    /**\r\n     * Assemble content of series on cateogory axis\r\n     * @inner\r\n     */\n    function assembleSeriesWithCategoryAxis(groups) {\n      var tables = [];\n      each(groups, function (group, key) {\n        var categoryAxis = group.categoryAxis;\n        var valueAxis = group.valueAxis;\n        var valueAxisDim = valueAxis.dim;\n        var headers = [' '].concat(map(group.series, function (series) {\n          return series.name;\n        }));\n        // @ts-ignore TODO Polar\n        var columns = [categoryAxis.model.getCategories()];\n        each(group.series, function (series) {\n          var rawData = series.getRawData();\n          columns.push(series.getRawData().mapArray(rawData.mapDimension(valueAxisDim), function (val) {\n            return val;\n          }));\n        });\n        // Assemble table content\n        var lines = [headers.join(ITEM_SPLITER)];\n        for (var i = 0; i < columns[0].length; i++) {\n          var items = [];\n          for (var j = 0; j < columns.length; j++) {\n            items.push(columns[j][i]);\n          }\n          lines.push(items.join(ITEM_SPLITER));\n        }\n        tables.push(lines.join('\\n'));\n      });\n      return tables.join('\\n\\n' + BLOCK_SPLITER + '\\n\\n');\n    }\n    /**\r\n     * Assemble content of other series\r\n     */\n    function assembleOtherSeries(series) {\n      return map(series, function (series) {\n        var data = series.getRawData();\n        var lines = [series.name];\n        var vals = [];\n        data.each(data.dimensions, function () {\n          var argLen = arguments.length;\n          var dataIndex = arguments[argLen - 1];\n          var name = data.getName(dataIndex);\n          for (var i = 0; i < argLen - 1; i++) {\n            vals[i] = arguments[i];\n          }\n          lines.push((name ? name + ITEM_SPLITER : '') + vals.join(ITEM_SPLITER));\n        });\n        return lines.join('\\n');\n      }).join('\\n\\n' + BLOCK_SPLITER + '\\n\\n');\n    }\n    function getContentFromModel(ecModel) {\n      var result = groupSeries(ecModel);\n      return {\n        value: filter([assembleSeriesWithCategoryAxis(result.seriesGroupByCategoryAxis), assembleOtherSeries(result.other)], function (str) {\n          return !!str.replace(/[\\n\\t\\s]/g, '');\n        }).join('\\n\\n' + BLOCK_SPLITER + '\\n\\n'),\n        meta: result.meta\n      };\n    }\n    function trim$1(str) {\n      return str.replace(/^\\s\\s*/, '').replace(/\\s\\s*$/, '');\n    }\n    /**\r\n     * If a block is tsv format\r\n     */\n    function isTSVFormat(block) {\n      // Simple method to find out if a block is tsv format\n      var firstLine = block.slice(0, block.indexOf('\\n'));\n      if (firstLine.indexOf(ITEM_SPLITER) >= 0) {\n        return true;\n      }\n    }\n    var itemSplitRegex = new RegExp('[' + ITEM_SPLITER + ']+', 'g');\n    /**\r\n     * @param {string} tsv\r\n     * @return {Object}\r\n     */\n    function parseTSVContents(tsv) {\n      var tsvLines = tsv.split(/\\n+/g);\n      var headers = trim$1(tsvLines.shift()).split(itemSplitRegex);\n      var categories = [];\n      var series = map(headers, function (header) {\n        return {\n          name: header,\n          data: []\n        };\n      });\n      for (var i = 0; i < tsvLines.length; i++) {\n        var items = trim$1(tsvLines[i]).split(itemSplitRegex);\n        categories.push(items.shift());\n        for (var j = 0; j < items.length; j++) {\n          series[j] && (series[j].data[i] = items[j]);\n        }\n      }\n      return {\n        series: series,\n        categories: categories\n      };\n    }\n    function parseListContents(str) {\n      var lines = str.split(/\\n+/g);\n      var seriesName = trim$1(lines.shift());\n      var data = [];\n      for (var i = 0; i < lines.length; i++) {\n        // if line is empty, ignore it.\n        // there is a case that a user forgot to delete `\\n`.\n        var line = trim$1(lines[i]);\n        if (!line) {\n          continue;\n        }\n        var items = line.split(itemSplitRegex);\n        var name_1 = '';\n        var value = void 0;\n        var hasName = false;\n        if (isNaN(items[0])) {\n          // First item is name\n          hasName = true;\n          name_1 = items[0];\n          items = items.slice(1);\n          data[i] = {\n            name: name_1,\n            value: []\n          };\n          value = data[i].value;\n        } else {\n          value = data[i] = [];\n        }\n        for (var j = 0; j < items.length; j++) {\n          value.push(+items[j]);\n        }\n        if (value.length === 1) {\n          hasName ? data[i].value = value[0] : data[i] = value[0];\n        }\n      }\n      return {\n        name: seriesName,\n        data: data\n      };\n    }\n    function parseContents(str, blockMetaList) {\n      var blocks = str.split(new RegExp('\\n*' + BLOCK_SPLITER + '\\n*', 'g'));\n      var newOption = {\n        series: []\n      };\n      each(blocks, function (block, idx) {\n        if (isTSVFormat(block)) {\n          var result = parseTSVContents(block);\n          var blockMeta = blockMetaList[idx];\n          var axisKey = blockMeta.axisDim + 'Axis';\n          if (blockMeta) {\n            newOption[axisKey] = newOption[axisKey] || [];\n            newOption[axisKey][blockMeta.axisIndex] = {\n              data: result.categories\n            };\n            newOption.series = newOption.series.concat(result.series);\n          }\n        } else {\n          var result = parseListContents(block);\n          newOption.series.push(result);\n        }\n      });\n      return newOption;\n    }\n    var DataView = /** @class */function (_super) {\n      __extends(DataView, _super);\n      function DataView() {\n        return _super !== null && _super.apply(this, arguments) || this;\n      }\n      DataView.prototype.onclick = function (ecModel, api) {\n        // FIXME: better way?\n        setTimeout(function () {\n          api.dispatchAction({\n            type: 'hideTip'\n          });\n        });\n        var container = api.getDom();\n        var model = this.model;\n        if (this._dom) {\n          container.removeChild(this._dom);\n        }\n        var root = document.createElement('div');\n        // use padding to avoid 5px whitespace\n        root.style.cssText = 'position:absolute;top:0;bottom:0;left:0;right:0;padding:5px';\n        root.style.backgroundColor = model.get('backgroundColor') || '#fff';\n        // Create elements\n        var header = document.createElement('h4');\n        var lang = model.get('lang') || [];\n        header.innerHTML = lang[0] || model.get('title');\n        header.style.cssText = 'margin:10px 20px';\n        header.style.color = model.get('textColor');\n        var viewMain = document.createElement('div');\n        var textarea = document.createElement('textarea');\n        viewMain.style.cssText = 'overflow:auto';\n        var optionToContent = model.get('optionToContent');\n        var contentToOption = model.get('contentToOption');\n        var result = getContentFromModel(ecModel);\n        if (isFunction(optionToContent)) {\n          var htmlOrDom = optionToContent(api.getOption());\n          if (isString(htmlOrDom)) {\n            viewMain.innerHTML = htmlOrDom;\n          } else if (isDom(htmlOrDom)) {\n            viewMain.appendChild(htmlOrDom);\n          }\n        } else {\n          // Use default textarea\n          textarea.readOnly = model.get('readOnly');\n          var style = textarea.style;\n          // eslint-disable-next-line max-len\n          style.cssText = 'display:block;width:100%;height:100%;font-family:monospace;font-size:14px;line-height:1.6rem;resize:none;box-sizing:border-box;outline:none';\n          style.color = model.get('textColor');\n          style.borderColor = model.get('textareaBorderColor');\n          style.backgroundColor = model.get('textareaColor');\n          textarea.value = result.value;\n          viewMain.appendChild(textarea);\n        }\n        var blockMetaList = result.meta;\n        var buttonContainer = document.createElement('div');\n        buttonContainer.style.cssText = 'position:absolute;bottom:5px;left:0;right:0';\n        // eslint-disable-next-line max-len\n        var buttonStyle = 'float:right;margin-right:20px;border:none;cursor:pointer;padding:2px 5px;font-size:12px;border-radius:3px';\n        var closeButton = document.createElement('div');\n        var refreshButton = document.createElement('div');\n        buttonStyle += ';background-color:' + model.get('buttonColor');\n        buttonStyle += ';color:' + model.get('buttonTextColor');\n        var self = this;\n        function close() {\n          container.removeChild(root);\n          self._dom = null;\n        }\n        addEventListener(closeButton, 'click', close);\n        addEventListener(refreshButton, 'click', function () {\n          if (contentToOption == null && optionToContent != null || contentToOption != null && optionToContent == null) {\n            if (\"development\" !== 'production') {\n              // eslint-disable-next-line\n              warn('It seems you have just provided one of `contentToOption` and `optionToContent` functions but missed the other one. Data change is ignored.');\n            }\n            close();\n            return;\n          }\n          var newOption;\n          try {\n            if (isFunction(contentToOption)) {\n              newOption = contentToOption(viewMain, api.getOption());\n            } else {\n              newOption = parseContents(textarea.value, blockMetaList);\n            }\n          } catch (e) {\n            close();\n            throw new Error('Data view format error ' + e);\n          }\n          if (newOption) {\n            api.dispatchAction({\n              type: 'changeDataView',\n              newOption: newOption\n            });\n          }\n          close();\n        });\n        closeButton.innerHTML = lang[1];\n        refreshButton.innerHTML = lang[2];\n        refreshButton.style.cssText = closeButton.style.cssText = buttonStyle;\n        !model.get('readOnly') && buttonContainer.appendChild(refreshButton);\n        buttonContainer.appendChild(closeButton);\n        root.appendChild(header);\n        root.appendChild(viewMain);\n        root.appendChild(buttonContainer);\n        viewMain.style.height = container.clientHeight - 80 + 'px';\n        container.appendChild(root);\n        this._dom = root;\n      };\n      DataView.prototype.remove = function (ecModel, api) {\n        this._dom && api.getDom().removeChild(this._dom);\n      };\n      DataView.prototype.dispose = function (ecModel, api) {\n        this.remove(ecModel, api);\n      };\n      DataView.getDefaultOption = function (ecModel) {\n        var defaultOption = {\n          show: true,\n          readOnly: false,\n          optionToContent: null,\n          contentToOption: null,\n          // eslint-disable-next-line\n          icon: 'M17.5,17.3H33 M17.5,17.3H33 M45.4,29.5h-28 M11.5,2v56H51V14.8L38.4,2H11.5z M38.4,2.2v12.7H51 M45.4,41.7h-28',\n          title: ecModel.getLocaleModel().get(['toolbox', 'dataView', 'title']),\n          lang: ecModel.getLocaleModel().get(['toolbox', 'dataView', 'lang']),\n          backgroundColor: '#fff',\n          textColor: '#000',\n          textareaColor: '#fff',\n          textareaBorderColor: '#333',\n          buttonColor: '#c23531',\n          buttonTextColor: '#fff'\n        };\n        return defaultOption;\n      };\n      return DataView;\n    }(ToolboxFeature);\n    /**\r\n     * @inner\r\n     */\n    function tryMergeDataOption(newData, originalData) {\n      return map(newData, function (newVal, idx) {\n        var original = originalData && originalData[idx];\n        if (isObject(original) && !isArray(original)) {\n          var newValIsObject = isObject(newVal) && !isArray(newVal);\n          if (!newValIsObject) {\n            newVal = {\n              value: newVal\n            };\n          }\n          // original data has name but new data has no name\n          var shouldDeleteName = original.name != null && newVal.name == null;\n          // Original data has option\n          newVal = defaults(newVal, original);\n          shouldDeleteName && delete newVal.name;\n          return newVal;\n        } else {\n          return newVal;\n        }\n      });\n    }\n    // TODO: SELF REGISTERED.\n    registerAction({\n      type: 'changeDataView',\n      event: 'dataViewChanged',\n      update: 'prepareAndUpdate'\n    }, function (payload, ecModel) {\n      var newSeriesOptList = [];\n      each(payload.newOption.series, function (seriesOpt) {\n        var seriesModel = ecModel.getSeriesByName(seriesOpt.name)[0];\n        if (!seriesModel) {\n          // New created series\n          // Geuss the series type\n          newSeriesOptList.push(extend({\n            // Default is scatter\n            type: 'scatter'\n          }, seriesOpt));\n        } else {\n          var originalData = seriesModel.get('data');\n          newSeriesOptList.push({\n            name: seriesOpt.name,\n            data: tryMergeDataOption(seriesOpt.data, originalData)\n          });\n        }\n      });\n      ecModel.mergeOption(defaults({\n        series: newSeriesOptList\n      }, payload.newOption));\n    });\n\n    var each$9 = each;\n    var inner$f = makeInner();\n    /**\r\n     * @param ecModel\r\n     * @param newSnapshot key is dataZoomId\r\n     */\n    function push(ecModel, newSnapshot) {\n      var storedSnapshots = getStoreSnapshots(ecModel);\n      // If previous dataZoom can not be found,\n      // complete an range with current range.\n      each$9(newSnapshot, function (batchItem, dataZoomId) {\n        var i = storedSnapshots.length - 1;\n        for (; i >= 0; i--) {\n          var snapshot = storedSnapshots[i];\n          if (snapshot[dataZoomId]) {\n            break;\n          }\n        }\n        if (i < 0) {\n          // No origin range set, create one by current range.\n          var dataZoomModel = ecModel.queryComponents({\n            mainType: 'dataZoom',\n            subType: 'select',\n            id: dataZoomId\n          })[0];\n          if (dataZoomModel) {\n            var percentRange = dataZoomModel.getPercentRange();\n            storedSnapshots[0][dataZoomId] = {\n              dataZoomId: dataZoomId,\n              start: percentRange[0],\n              end: percentRange[1]\n            };\n          }\n        }\n      });\n      storedSnapshots.push(newSnapshot);\n    }\n    function pop(ecModel) {\n      var storedSnapshots = getStoreSnapshots(ecModel);\n      var head = storedSnapshots[storedSnapshots.length - 1];\n      storedSnapshots.length > 1 && storedSnapshots.pop();\n      // Find top for all dataZoom.\n      var snapshot = {};\n      each$9(head, function (batchItem, dataZoomId) {\n        for (var i = storedSnapshots.length - 1; i >= 0; i--) {\n          batchItem = storedSnapshots[i][dataZoomId];\n          if (batchItem) {\n            snapshot[dataZoomId] = batchItem;\n            break;\n          }\n        }\n      });\n      return snapshot;\n    }\n    function clear$1(ecModel) {\n      inner$f(ecModel).snapshots = null;\n    }\n    function count(ecModel) {\n      return getStoreSnapshots(ecModel).length;\n    }\n    /**\r\n     * History length of each dataZoom may be different.\r\n     * this._history[0] is used to store origin range.\r\n     */\n    function getStoreSnapshots(ecModel) {\n      var store = inner$f(ecModel);\n      if (!store.snapshots) {\n        store.snapshots = [{}];\n      }\n      return store.snapshots;\n    }\n\n    var RestoreOption = /** @class */function (_super) {\n      __extends(RestoreOption, _super);\n      function RestoreOption() {\n        return _super !== null && _super.apply(this, arguments) || this;\n      }\n      RestoreOption.prototype.onclick = function (ecModel, api) {\n        clear$1(ecModel);\n        api.dispatchAction({\n          type: 'restore',\n          from: this.uid\n        });\n      };\n      RestoreOption.getDefaultOption = function (ecModel) {\n        var defaultOption = {\n          show: true,\n          // eslint-disable-next-line\n          icon: 'M3.8,33.4 M47,18.9h9.8V8.7 M56.3,20.1 C52.1,9,40.5,0.6,26.8,2.1C12.6,3.7,1.6,16.2,2.1,30.6 M13,41.1H3.1v10.2 M3.7,39.9c4.2,11.1,15.8,19.5,29.5,18 c14.2-1.6,25.2-14.1,24.7-28.5',\n          title: ecModel.getLocaleModel().get(['toolbox', 'restore', 'title'])\n        };\n        return defaultOption;\n      };\n      return RestoreOption;\n    }(ToolboxFeature);\n    // TODO: SELF REGISTERED.\n    registerAction({\n      type: 'restore',\n      event: 'restore',\n      update: 'prepareAndUpdate'\n    }, function (payload, ecModel) {\n      ecModel.resetOption('recreate');\n    });\n\n    // FIXME\n    // how to genarialize to more coordinate systems.\n    var INCLUDE_FINDER_MAIN_TYPES = ['grid', 'xAxis', 'yAxis', 'geo', 'graph', 'polar', 'radiusAxis', 'angleAxis', 'bmap'];\n    var BrushTargetManager = /** @class */function () {\n      /**\r\n       * @param finder contains Index/Id/Name of xAxis/yAxis/geo/grid\r\n       *        Each can be {number|Array.<number>}. like: {xAxisIndex: [3, 4]}\r\n       * @param opt.include include coordinate system types.\r\n       */\n      function BrushTargetManager(finder, ecModel, opt) {\n        var _this = this;\n        this._targetInfoList = [];\n        var foundCpts = parseFinder$1(ecModel, finder);\n        each(targetInfoBuilders, function (builder, type) {\n          if (!opt || !opt.include || indexOf(opt.include, type) >= 0) {\n            builder(foundCpts, _this._targetInfoList);\n          }\n        });\n      }\n      BrushTargetManager.prototype.setOutputRanges = function (areas, ecModel) {\n        this.matchOutputRanges(areas, ecModel, function (area, coordRange, coordSys) {\n          (area.coordRanges || (area.coordRanges = [])).push(coordRange);\n          // area.coordRange is the first of area.coordRanges\n          if (!area.coordRange) {\n            area.coordRange = coordRange;\n            // In 'category' axis, coord to pixel is not reversible, so we can not\n            // rebuild range by coordRange accrately, which may bring trouble when\n            // brushing only one item. So we use __rangeOffset to rebuilding range\n            // by coordRange. And this it only used in brush component so it is no\n            // need to be adapted to coordRanges.\n            var result = coordConvert[area.brushType](0, coordSys, coordRange);\n            area.__rangeOffset = {\n              offset: diffProcessor[area.brushType](result.values, area.range, [1, 1]),\n              xyMinMax: result.xyMinMax\n            };\n          }\n        });\n        return areas;\n      };\n      BrushTargetManager.prototype.matchOutputRanges = function (areas, ecModel, cb) {\n        each(areas, function (area) {\n          var targetInfo = this.findTargetInfo(area, ecModel);\n          if (targetInfo && targetInfo !== true) {\n            each(targetInfo.coordSyses, function (coordSys) {\n              var result = coordConvert[area.brushType](1, coordSys, area.range, true);\n              cb(area, result.values, coordSys, ecModel);\n            });\n          }\n        }, this);\n      };\n      /**\r\n       * the `areas` is `BrushModel.areas`.\r\n       * Called in layout stage.\r\n       * convert `area.coordRange` to global range and set panelId to `area.range`.\r\n       */\n      BrushTargetManager.prototype.setInputRanges = function (areas, ecModel) {\n        each(areas, function (area) {\n          var targetInfo = this.findTargetInfo(area, ecModel);\n          if (\"development\" !== 'production') {\n            assert(!targetInfo || targetInfo === true || area.coordRange, 'coordRange must be specified when coord index specified.');\n            assert(!targetInfo || targetInfo !== true || area.range, 'range must be specified in global brush.');\n          }\n          area.range = area.range || [];\n          // convert coordRange to global range and set panelId.\n          if (targetInfo && targetInfo !== true) {\n            area.panelId = targetInfo.panelId;\n            // (1) area.range should always be calculate from coordRange but does\n            // not keep its original value, for the sake of the dataZoom scenario,\n            // where area.coordRange remains unchanged but area.range may be changed.\n            // (2) Only support converting one coordRange to pixel range in brush\n            // component. So do not consider `coordRanges`.\n            // (3) About __rangeOffset, see comment above.\n            var result = coordConvert[area.brushType](0, targetInfo.coordSys, area.coordRange);\n            var rangeOffset = area.__rangeOffset;\n            area.range = rangeOffset ? diffProcessor[area.brushType](result.values, rangeOffset.offset, getScales(result.xyMinMax, rangeOffset.xyMinMax)) : result.values;\n          }\n        }, this);\n      };\n      BrushTargetManager.prototype.makePanelOpts = function (api, getDefaultBrushType) {\n        return map(this._targetInfoList, function (targetInfo) {\n          var rect = targetInfo.getPanelRect();\n          return {\n            panelId: targetInfo.panelId,\n            defaultBrushType: getDefaultBrushType ? getDefaultBrushType(targetInfo) : null,\n            clipPath: makeRectPanelClipPath(rect),\n            isTargetByCursor: makeRectIsTargetByCursor(rect, api, targetInfo.coordSysModel),\n            getLinearBrushOtherExtent: makeLinearBrushOtherExtent(rect)\n          };\n        });\n      };\n      BrushTargetManager.prototype.controlSeries = function (area, seriesModel, ecModel) {\n        // Check whether area is bound in coord, and series do not belong to that coord.\n        // If do not do this check, some brush (like lineX) will controll all axes.\n        var targetInfo = this.findTargetInfo(area, ecModel);\n        return targetInfo === true || targetInfo && indexOf(targetInfo.coordSyses, seriesModel.coordinateSystem) >= 0;\n      };\n      /**\r\n       * If return Object, a coord found.\r\n       * If return true, global found.\r\n       * Otherwise nothing found.\r\n       */\n      BrushTargetManager.prototype.findTargetInfo = function (area, ecModel) {\n        var targetInfoList = this._targetInfoList;\n        var foundCpts = parseFinder$1(ecModel, area);\n        for (var i = 0; i < targetInfoList.length; i++) {\n          var targetInfo = targetInfoList[i];\n          var areaPanelId = area.panelId;\n          if (areaPanelId) {\n            if (targetInfo.panelId === areaPanelId) {\n              return targetInfo;\n            }\n          } else {\n            for (var j = 0; j < targetInfoMatchers.length; j++) {\n              if (targetInfoMatchers[j](foundCpts, targetInfo)) {\n                return targetInfo;\n              }\n            }\n          }\n        }\n        return true;\n      };\n      return BrushTargetManager;\n    }();\n    function formatMinMax(minMax) {\n      minMax[0] > minMax[1] && minMax.reverse();\n      return minMax;\n    }\n    function parseFinder$1(ecModel, finder) {\n      return parseFinder(ecModel, finder, {\n        includeMainTypes: INCLUDE_FINDER_MAIN_TYPES\n      });\n    }\n    var targetInfoBuilders = {\n      grid: function (foundCpts, targetInfoList) {\n        var xAxisModels = foundCpts.xAxisModels;\n        var yAxisModels = foundCpts.yAxisModels;\n        var gridModels = foundCpts.gridModels;\n        // Remove duplicated.\n        var gridModelMap = createHashMap();\n        var xAxesHas = {};\n        var yAxesHas = {};\n        if (!xAxisModels && !yAxisModels && !gridModels) {\n          return;\n        }\n        each(xAxisModels, function (axisModel) {\n          var gridModel = axisModel.axis.grid.model;\n          gridModelMap.set(gridModel.id, gridModel);\n          xAxesHas[gridModel.id] = true;\n        });\n        each(yAxisModels, function (axisModel) {\n          var gridModel = axisModel.axis.grid.model;\n          gridModelMap.set(gridModel.id, gridModel);\n          yAxesHas[gridModel.id] = true;\n        });\n        each(gridModels, function (gridModel) {\n          gridModelMap.set(gridModel.id, gridModel);\n          xAxesHas[gridModel.id] = true;\n          yAxesHas[gridModel.id] = true;\n        });\n        gridModelMap.each(function (gridModel) {\n          var grid = gridModel.coordinateSystem;\n          var cartesians = [];\n          each(grid.getCartesians(), function (cartesian, index) {\n            if (indexOf(xAxisModels, cartesian.getAxis('x').model) >= 0 || indexOf(yAxisModels, cartesian.getAxis('y').model) >= 0) {\n              cartesians.push(cartesian);\n            }\n          });\n          targetInfoList.push({\n            panelId: 'grid--' + gridModel.id,\n            gridModel: gridModel,\n            coordSysModel: gridModel,\n            // Use the first one as the representitive coordSys.\n            coordSys: cartesians[0],\n            coordSyses: cartesians,\n            getPanelRect: panelRectBuilders.grid,\n            xAxisDeclared: xAxesHas[gridModel.id],\n            yAxisDeclared: yAxesHas[gridModel.id]\n          });\n        });\n      },\n      geo: function (foundCpts, targetInfoList) {\n        each(foundCpts.geoModels, function (geoModel) {\n          var coordSys = geoModel.coordinateSystem;\n          targetInfoList.push({\n            panelId: 'geo--' + geoModel.id,\n            geoModel: geoModel,\n            coordSysModel: geoModel,\n            coordSys: coordSys,\n            coordSyses: [coordSys],\n            getPanelRect: panelRectBuilders.geo\n          });\n        });\n      }\n    };\n    var targetInfoMatchers = [\n    // grid\n    function (foundCpts, targetInfo) {\n      var xAxisModel = foundCpts.xAxisModel;\n      var yAxisModel = foundCpts.yAxisModel;\n      var gridModel = foundCpts.gridModel;\n      !gridModel && xAxisModel && (gridModel = xAxisModel.axis.grid.model);\n      !gridModel && yAxisModel && (gridModel = yAxisModel.axis.grid.model);\n      return gridModel && gridModel === targetInfo.gridModel;\n    },\n    // geo\n    function (foundCpts, targetInfo) {\n      var geoModel = foundCpts.geoModel;\n      return geoModel && geoModel === targetInfo.geoModel;\n    }];\n    var panelRectBuilders = {\n      grid: function () {\n        // grid is not Transformable.\n        return this.coordSys.master.getRect().clone();\n      },\n      geo: function () {\n        var coordSys = this.coordSys;\n        var rect = coordSys.getBoundingRect().clone();\n        // geo roam and zoom transform\n        rect.applyTransform(getTransform(coordSys));\n        return rect;\n      }\n    };\n    var coordConvert = {\n      lineX: curry(axisConvert, 0),\n      lineY: curry(axisConvert, 1),\n      rect: function (to, coordSys, rangeOrCoordRange, clamp) {\n        var xminymin = to ? coordSys.pointToData([rangeOrCoordRange[0][0], rangeOrCoordRange[1][0]], clamp) : coordSys.dataToPoint([rangeOrCoordRange[0][0], rangeOrCoordRange[1][0]], clamp);\n        var xmaxymax = to ? coordSys.pointToData([rangeOrCoordRange[0][1], rangeOrCoordRange[1][1]], clamp) : coordSys.dataToPoint([rangeOrCoordRange[0][1], rangeOrCoordRange[1][1]], clamp);\n        var values = [formatMinMax([xminymin[0], xmaxymax[0]]), formatMinMax([xminymin[1], xmaxymax[1]])];\n        return {\n          values: values,\n          xyMinMax: values\n        };\n      },\n      polygon: function (to, coordSys, rangeOrCoordRange, clamp) {\n        var xyMinMax = [[Infinity, -Infinity], [Infinity, -Infinity]];\n        var values = map(rangeOrCoordRange, function (item) {\n          var p = to ? coordSys.pointToData(item, clamp) : coordSys.dataToPoint(item, clamp);\n          xyMinMax[0][0] = Math.min(xyMinMax[0][0], p[0]);\n          xyMinMax[1][0] = Math.min(xyMinMax[1][0], p[1]);\n          xyMinMax[0][1] = Math.max(xyMinMax[0][1], p[0]);\n          xyMinMax[1][1] = Math.max(xyMinMax[1][1], p[1]);\n          return p;\n        });\n        return {\n          values: values,\n          xyMinMax: xyMinMax\n        };\n      }\n    };\n    function axisConvert(axisNameIndex, to, coordSys, rangeOrCoordRange) {\n      if (\"development\" !== 'production') {\n        assert(coordSys.type === 'cartesian2d', 'lineX/lineY brush is available only in cartesian2d.');\n      }\n      var axis = coordSys.getAxis(['x', 'y'][axisNameIndex]);\n      var values = formatMinMax(map([0, 1], function (i) {\n        return to ? axis.coordToData(axis.toLocalCoord(rangeOrCoordRange[i]), true) : axis.toGlobalCoord(axis.dataToCoord(rangeOrCoordRange[i]));\n      }));\n      var xyMinMax = [];\n      xyMinMax[axisNameIndex] = values;\n      xyMinMax[1 - axisNameIndex] = [NaN, NaN];\n      return {\n        values: values,\n        xyMinMax: xyMinMax\n      };\n    }\n    var diffProcessor = {\n      lineX: curry(axisDiffProcessor, 0),\n      lineY: curry(axisDiffProcessor, 1),\n      rect: function (values, refer, scales) {\n        return [[values[0][0] - scales[0] * refer[0][0], values[0][1] - scales[0] * refer[0][1]], [values[1][0] - scales[1] * refer[1][0], values[1][1] - scales[1] * refer[1][1]]];\n      },\n      polygon: function (values, refer, scales) {\n        return map(values, function (item, idx) {\n          return [item[0] - scales[0] * refer[idx][0], item[1] - scales[1] * refer[idx][1]];\n        });\n      }\n    };\n    function axisDiffProcessor(axisNameIndex, values, refer, scales) {\n      return [values[0] - scales[axisNameIndex] * refer[0], values[1] - scales[axisNameIndex] * refer[1]];\n    }\n    // We have to process scale caused by dataZoom manually,\n    // although it might be not accurate.\n    // Return [0~1, 0~1]\n    function getScales(xyMinMaxCurr, xyMinMaxOrigin) {\n      var sizeCurr = getSize$1(xyMinMaxCurr);\n      var sizeOrigin = getSize$1(xyMinMaxOrigin);\n      var scales = [sizeCurr[0] / sizeOrigin[0], sizeCurr[1] / sizeOrigin[1]];\n      isNaN(scales[0]) && (scales[0] = 1);\n      isNaN(scales[1]) && (scales[1] = 1);\n      return scales;\n    }\n    function getSize$1(xyMinMax) {\n      return xyMinMax ? [xyMinMax[0][1] - xyMinMax[0][0], xyMinMax[1][1] - xyMinMax[1][0]] : [NaN, NaN];\n    }\n\n    var each$a = each;\n    var DATA_ZOOM_ID_BASE = makeInternalComponentId('toolbox-dataZoom_');\n    var DataZoomFeature = /** @class */function (_super) {\n      __extends(DataZoomFeature, _super);\n      function DataZoomFeature() {\n        return _super !== null && _super.apply(this, arguments) || this;\n      }\n      DataZoomFeature.prototype.render = function (featureModel, ecModel, api, payload) {\n        if (!this._brushController) {\n          this._brushController = new BrushController(api.getZr());\n          this._brushController.on('brush', bind(this._onBrush, this)).mount();\n        }\n        updateZoomBtnStatus(featureModel, ecModel, this, payload, api);\n        updateBackBtnStatus(featureModel, ecModel);\n      };\n      DataZoomFeature.prototype.onclick = function (ecModel, api, type) {\n        handlers$1[type].call(this);\n      };\n      DataZoomFeature.prototype.remove = function (ecModel, api) {\n        this._brushController && this._brushController.unmount();\n      };\n      DataZoomFeature.prototype.dispose = function (ecModel, api) {\n        this._brushController && this._brushController.dispose();\n      };\n      DataZoomFeature.prototype._onBrush = function (eventParam) {\n        var areas = eventParam.areas;\n        if (!eventParam.isEnd || !areas.length) {\n          return;\n        }\n        var snapshot = {};\n        var ecModel = this.ecModel;\n        this._brushController.updateCovers([]); // remove cover\n        var brushTargetManager = new BrushTargetManager(makeAxisFinder(this.model), ecModel, {\n          include: ['grid']\n        });\n        brushTargetManager.matchOutputRanges(areas, ecModel, function (area, coordRange, coordSys) {\n          if (coordSys.type !== 'cartesian2d') {\n            return;\n          }\n          var brushType = area.brushType;\n          if (brushType === 'rect') {\n            setBatch('x', coordSys, coordRange[0]);\n            setBatch('y', coordSys, coordRange[1]);\n          } else {\n            setBatch({\n              lineX: 'x',\n              lineY: 'y'\n            }[brushType], coordSys, coordRange);\n          }\n        });\n        push(ecModel, snapshot);\n        this._dispatchZoomAction(snapshot);\n        function setBatch(dimName, coordSys, minMax) {\n          var axis = coordSys.getAxis(dimName);\n          var axisModel = axis.model;\n          var dataZoomModel = findDataZoom(dimName, axisModel, ecModel);\n          // Restrict range.\n          var minMaxSpan = dataZoomModel.findRepresentativeAxisProxy(axisModel).getMinMaxSpan();\n          if (minMaxSpan.minValueSpan != null || minMaxSpan.maxValueSpan != null) {\n            minMax = sliderMove(0, minMax.slice(), axis.scale.getExtent(), 0, minMaxSpan.minValueSpan, minMaxSpan.maxValueSpan);\n          }\n          dataZoomModel && (snapshot[dataZoomModel.id] = {\n            dataZoomId: dataZoomModel.id,\n            startValue: minMax[0],\n            endValue: minMax[1]\n          });\n        }\n        function findDataZoom(dimName, axisModel, ecModel) {\n          var found;\n          ecModel.eachComponent({\n            mainType: 'dataZoom',\n            subType: 'select'\n          }, function (dzModel) {\n            var has = dzModel.getAxisModel(dimName, axisModel.componentIndex);\n            has && (found = dzModel);\n          });\n          return found;\n        }\n      };\n      DataZoomFeature.prototype._dispatchZoomAction = function (snapshot) {\n        var batch = [];\n        // Convert from hash map to array.\n        each$a(snapshot, function (batchItem, dataZoomId) {\n          batch.push(clone(batchItem));\n        });\n        batch.length && this.api.dispatchAction({\n          type: 'dataZoom',\n          from: this.uid,\n          batch: batch\n        });\n      };\n      DataZoomFeature.getDefaultOption = function (ecModel) {\n        var defaultOption = {\n          show: true,\n          filterMode: 'filter',\n          // Icon group\n          icon: {\n            zoom: 'M0,13.5h26.9 M13.5,26.9V0 M32.1,13.5H58V58H13.5 V32.1',\n            back: 'M22,1.4L9.9,13.5l12.3,12.3 M10.3,13.5H54.9v44.6 H10.3v-26'\n          },\n          // `zoom`, `back`\n          title: ecModel.getLocaleModel().get(['toolbox', 'dataZoom', 'title']),\n          brushStyle: {\n            borderWidth: 0,\n            color: 'rgba(210,219,238,0.2)'\n          }\n        };\n        return defaultOption;\n      };\n      return DataZoomFeature;\n    }(ToolboxFeature);\n    var handlers$1 = {\n      zoom: function () {\n        var nextActive = !this._isZoomActive;\n        this.api.dispatchAction({\n          type: 'takeGlobalCursor',\n          key: 'dataZoomSelect',\n          dataZoomSelectActive: nextActive\n        });\n      },\n      back: function () {\n        this._dispatchZoomAction(pop(this.ecModel));\n      }\n    };\n    function makeAxisFinder(dzFeatureModel) {\n      var setting = {\n        xAxisIndex: dzFeatureModel.get('xAxisIndex', true),\n        yAxisIndex: dzFeatureModel.get('yAxisIndex', true),\n        xAxisId: dzFeatureModel.get('xAxisId', true),\n        yAxisId: dzFeatureModel.get('yAxisId', true)\n      };\n      // If both `xAxisIndex` `xAxisId` not set, it means 'all'.\n      // If both `yAxisIndex` `yAxisId` not set, it means 'all'.\n      // Some old cases set like this below to close yAxis control but leave xAxis control:\n      // `{ feature: { dataZoom: { yAxisIndex: false } }`.\n      if (setting.xAxisIndex == null && setting.xAxisId == null) {\n        setting.xAxisIndex = 'all';\n      }\n      if (setting.yAxisIndex == null && setting.yAxisId == null) {\n        setting.yAxisIndex = 'all';\n      }\n      return setting;\n    }\n    function updateBackBtnStatus(featureModel, ecModel) {\n      featureModel.setIconStatus('back', count(ecModel) > 1 ? 'emphasis' : 'normal');\n    }\n    function updateZoomBtnStatus(featureModel, ecModel, view, payload, api) {\n      var zoomActive = view._isZoomActive;\n      if (payload && payload.type === 'takeGlobalCursor') {\n        zoomActive = payload.key === 'dataZoomSelect' ? payload.dataZoomSelectActive : false;\n      }\n      view._isZoomActive = zoomActive;\n      featureModel.setIconStatus('zoom', zoomActive ? 'emphasis' : 'normal');\n      var brushTargetManager = new BrushTargetManager(makeAxisFinder(featureModel), ecModel, {\n        include: ['grid']\n      });\n      var panels = brushTargetManager.makePanelOpts(api, function (targetInfo) {\n        return targetInfo.xAxisDeclared && !targetInfo.yAxisDeclared ? 'lineX' : !targetInfo.xAxisDeclared && targetInfo.yAxisDeclared ? 'lineY' : 'rect';\n      });\n      view._brushController.setPanels(panels).enableBrush(zoomActive && panels.length ? {\n        brushType: 'auto',\n        brushStyle: featureModel.getModel('brushStyle').getItemStyle()\n      } : false);\n    }\n    registerInternalOptionCreator('dataZoom', function (ecModel) {\n      var toolboxModel = ecModel.getComponent('toolbox', 0);\n      var featureDataZoomPath = ['feature', 'dataZoom'];\n      if (!toolboxModel || toolboxModel.get(featureDataZoomPath) == null) {\n        return;\n      }\n      var dzFeatureModel = toolboxModel.getModel(featureDataZoomPath);\n      var dzOptions = [];\n      var finder = makeAxisFinder(dzFeatureModel);\n      var finderResult = parseFinder(ecModel, finder);\n      each$a(finderResult.xAxisModels, function (axisModel) {\n        return buildInternalOptions(axisModel, 'xAxis', 'xAxisIndex');\n      });\n      each$a(finderResult.yAxisModels, function (axisModel) {\n        return buildInternalOptions(axisModel, 'yAxis', 'yAxisIndex');\n      });\n      function buildInternalOptions(axisModel, axisMainType, axisIndexPropName) {\n        var axisIndex = axisModel.componentIndex;\n        var newOpt = {\n          type: 'select',\n          $fromToolbox: true,\n          // Default to be filter\n          filterMode: dzFeatureModel.get('filterMode', true) || 'filter',\n          // Id for merge mapping.\n          id: DATA_ZOOM_ID_BASE + axisMainType + axisIndex\n        };\n        newOpt[axisIndexPropName] = axisIndex;\n        dzOptions.push(newOpt);\n      }\n      return dzOptions;\n    });\n\n    function install$z(registers) {\n      registers.registerComponentModel(ToolboxModel);\n      registers.registerComponentView(ToolboxView);\n      registerFeature('saveAsImage', SaveAsImage);\n      registerFeature('magicType', MagicType);\n      registerFeature('dataView', DataView);\n      registerFeature('dataZoom', DataZoomFeature);\n      registerFeature('restore', RestoreOption);\n      use(install$y);\n    }\n\n    var TooltipModel = /** @class */function (_super) {\n      __extends(TooltipModel, _super);\n      function TooltipModel() {\n        var _this = _super !== null && _super.apply(this, arguments) || this;\n        _this.type = TooltipModel.type;\n        return _this;\n      }\n      TooltipModel.type = 'tooltip';\n      TooltipModel.dependencies = ['axisPointer'];\n      TooltipModel.defaultOption = {\n        // zlevel: 0,\n        z: 60,\n        show: true,\n        // tooltip main content\n        showContent: true,\n        // 'trigger' only works on coordinate system.\n        // 'item' | 'axis' | 'none'\n        trigger: 'item',\n        // 'click' | 'mousemove' | 'none'\n        triggerOn: 'mousemove|click',\n        alwaysShowContent: false,\n        displayMode: 'single',\n        renderMode: 'auto',\n        // whether restraint content inside viewRect.\n        // If renderMode: 'richText', default true.\n        // If renderMode: 'html', defaut false (for backward compat).\n        confine: null,\n        showDelay: 0,\n        hideDelay: 100,\n        // Animation transition time, unit is second\n        transitionDuration: 0.4,\n        enterable: false,\n        backgroundColor: '#fff',\n        // box shadow\n        shadowBlur: 10,\n        shadowColor: 'rgba(0, 0, 0, .2)',\n        shadowOffsetX: 1,\n        shadowOffsetY: 2,\n        // tooltip border radius, unit is px, default is 4\n        borderRadius: 4,\n        // tooltip border width, unit is px, default is 0 (no border)\n        borderWidth: 1,\n        // Tooltip inside padding, default is 5 for all direction\n        // Array is allowed to set up, right, bottom, left, same with css\n        // The default value: See `tooltip/tooltipMarkup.ts#getPaddingFromTooltipModel`.\n        padding: null,\n        // Extra css text\n        extraCssText: '',\n        // axis indicator, trigger by axis\n        axisPointer: {\n          // default is line\n          // legal values: 'line' | 'shadow' | 'cross'\n          type: 'line',\n          // Valid when type is line, appoint tooltip line locate on which line. Optional\n          // legal values: 'x' | 'y' | 'angle' | 'radius' | 'auto'\n          // default is 'auto', chose the axis which type is category.\n          // for multiply y axis, cartesian coord chose x axis, polar chose angle axis\n          axis: 'auto',\n          animation: 'auto',\n          animationDurationUpdate: 200,\n          animationEasingUpdate: 'exponentialOut',\n          crossStyle: {\n            color: '#999',\n            width: 1,\n            type: 'dashed',\n            // TODO formatter\n            textStyle: {}\n          }\n          // lineStyle and shadowStyle should not be specified here,\n          // otherwise it will always override those styles on option.axisPointer.\n        },\n        textStyle: {\n          color: '#666',\n          fontSize: 14\n        }\n      };\n      return TooltipModel;\n    }(ComponentModel);\n\n    /* global document */\n    function shouldTooltipConfine(tooltipModel) {\n      var confineOption = tooltipModel.get('confine');\n      return confineOption != null ? !!confineOption\n      // In richText mode, the outside part can not be visible.\n      : tooltipModel.get('renderMode') === 'richText';\n    }\n    function testStyle(styleProps) {\n      if (!env.domSupported) {\n        return;\n      }\n      var style = document.documentElement.style;\n      for (var i = 0, len = styleProps.length; i < len; i++) {\n        if (styleProps[i] in style) {\n          return styleProps[i];\n        }\n      }\n    }\n    var TRANSFORM_VENDOR = testStyle(['transform', 'webkitTransform', 'OTransform', 'MozTransform', 'msTransform']);\n    var TRANSITION_VENDOR = testStyle(['webkitTransition', 'transition', 'OTransition', 'MozTransition', 'msTransition']);\n    function toCSSVendorPrefix(styleVendor, styleProp) {\n      if (!styleVendor) {\n        return styleProp;\n      }\n      styleProp = toCamelCase(styleProp, true);\n      var idx = styleVendor.indexOf(styleProp);\n      styleVendor = idx === -1 ? styleProp : \"-\" + styleVendor.slice(0, idx) + \"-\" + styleProp;\n      return styleVendor.toLowerCase();\n    }\n    function getComputedStyle(el, style) {\n      var stl = el.currentStyle || document.defaultView && document.defaultView.getComputedStyle(el);\n      return stl ? style ? stl[style] : stl : null;\n    }\n\n    /* global document, window */\n    var CSS_TRANSITION_VENDOR = toCSSVendorPrefix(TRANSITION_VENDOR, 'transition');\n    var CSS_TRANSFORM_VENDOR = toCSSVendorPrefix(TRANSFORM_VENDOR, 'transform');\n    // eslint-disable-next-line\n    var gCssText = \"position:absolute;display:block;border-style:solid;white-space:nowrap;z-index:9999999;\" + (env.transform3dSupported ? 'will-change:transform;' : '');\n    function mirrorPos(pos) {\n      pos = pos === 'left' ? 'right' : pos === 'right' ? 'left' : pos === 'top' ? 'bottom' : 'top';\n      return pos;\n    }\n    function assembleArrow(tooltipModel, borderColor, arrowPosition) {\n      if (!isString(arrowPosition) || arrowPosition === 'inside') {\n        return '';\n      }\n      var backgroundColor = tooltipModel.get('backgroundColor');\n      var borderWidth = tooltipModel.get('borderWidth');\n      borderColor = convertToColorString(borderColor);\n      var arrowPos = mirrorPos(arrowPosition);\n      var arrowSize = Math.max(Math.round(borderWidth) * 1.5, 6);\n      var positionStyle = '';\n      var transformStyle = CSS_TRANSFORM_VENDOR + ':';\n      var rotateDeg;\n      if (indexOf(['left', 'right'], arrowPos) > -1) {\n        positionStyle += 'top:50%';\n        transformStyle += \"translateY(-50%) rotate(\" + (rotateDeg = arrowPos === 'left' ? -225 : -45) + \"deg)\";\n      } else {\n        positionStyle += 'left:50%';\n        transformStyle += \"translateX(-50%) rotate(\" + (rotateDeg = arrowPos === 'top' ? 225 : 45) + \"deg)\";\n      }\n      var rotateRadian = rotateDeg * Math.PI / 180;\n      var arrowWH = arrowSize + borderWidth;\n      var rotatedWH = arrowWH * Math.abs(Math.cos(rotateRadian)) + arrowWH * Math.abs(Math.sin(rotateRadian));\n      var arrowOffset = Math.round(((rotatedWH - Math.SQRT2 * borderWidth) / 2 + Math.SQRT2 * borderWidth - (rotatedWH - arrowWH) / 2) * 100) / 100;\n      positionStyle += \";\" + arrowPos + \":-\" + arrowOffset + \"px\";\n      var borderStyle = borderColor + \" solid \" + borderWidth + \"px;\";\n      var styleCss = [\"position:absolute;width:\" + arrowSize + \"px;height:\" + arrowSize + \"px;z-index:-1;\", positionStyle + \";\" + transformStyle + \";\", \"border-bottom:\" + borderStyle, \"border-right:\" + borderStyle, \"background-color:\" + backgroundColor + \";\"];\n      return \"<div style=\\\"\" + styleCss.join('') + \"\\\"></div>\";\n    }\n    function assembleTransition(duration, onlyFade) {\n      var transitionCurve = 'cubic-bezier(0.23,1,0.32,1)';\n      var transitionOption = \" \" + duration / 2 + \"s \" + transitionCurve;\n      var transitionText = \"opacity\" + transitionOption + \",visibility\" + transitionOption;\n      if (!onlyFade) {\n        transitionOption = \" \" + duration + \"s \" + transitionCurve;\n        transitionText += env.transformSupported ? \",\" + CSS_TRANSFORM_VENDOR + transitionOption : \",left\" + transitionOption + \",top\" + transitionOption;\n      }\n      return CSS_TRANSITION_VENDOR + ':' + transitionText;\n    }\n    function assembleTransform(x, y, toString) {\n      // If using float on style, the final width of the dom might\n      // keep changing slightly while mouse move. So `toFixed(0)` them.\n      var x0 = x.toFixed(0) + 'px';\n      var y0 = y.toFixed(0) + 'px';\n      // not support transform, use `left` and `top` instead.\n      if (!env.transformSupported) {\n        return toString ? \"top:\" + y0 + \";left:\" + x0 + \";\" : [['top', y0], ['left', x0]];\n      }\n      // support transform\n      var is3d = env.transform3dSupported;\n      var translate = \"translate\" + (is3d ? '3d' : '') + \"(\" + x0 + \",\" + y0 + (is3d ? ',0' : '') + \")\";\n      return toString ? 'top:0;left:0;' + CSS_TRANSFORM_VENDOR + ':' + translate + ';' : [['top', 0], ['left', 0], [TRANSFORM_VENDOR, translate]];\n    }\n    /**\r\n     * @param {Object} textStyle\r\n     * @return {string}\r\n     * @inner\r\n     */\n    function assembleFont(textStyleModel) {\n      var cssText = [];\n      var fontSize = textStyleModel.get('fontSize');\n      var color = textStyleModel.getTextColor();\n      color && cssText.push('color:' + color);\n      cssText.push('font:' + textStyleModel.getFont());\n      // @ts-ignore, leave it to the tooltip refactor.\n      var lineHeight = retrieve2(textStyleModel.get('lineHeight'), Math.round(fontSize * 3 / 2));\n      fontSize && cssText.push('line-height:' + lineHeight + 'px');\n      var shadowColor = textStyleModel.get('textShadowColor');\n      var shadowBlur = textStyleModel.get('textShadowBlur') || 0;\n      var shadowOffsetX = textStyleModel.get('textShadowOffsetX') || 0;\n      var shadowOffsetY = textStyleModel.get('textShadowOffsetY') || 0;\n      shadowColor && shadowBlur && cssText.push('text-shadow:' + shadowOffsetX + 'px ' + shadowOffsetY + 'px ' + shadowBlur + 'px ' + shadowColor);\n      each(['decoration', 'align'], function (name) {\n        var val = textStyleModel.get(name);\n        val && cssText.push('text-' + name + ':' + val);\n      });\n      return cssText.join(';');\n    }\n    function assembleCssText(tooltipModel, enableTransition, onlyFade) {\n      var cssText = [];\n      var transitionDuration = tooltipModel.get('transitionDuration');\n      var backgroundColor = tooltipModel.get('backgroundColor');\n      var shadowBlur = tooltipModel.get('shadowBlur');\n      var shadowColor = tooltipModel.get('shadowColor');\n      var shadowOffsetX = tooltipModel.get('shadowOffsetX');\n      var shadowOffsetY = tooltipModel.get('shadowOffsetY');\n      var textStyleModel = tooltipModel.getModel('textStyle');\n      var padding = getPaddingFromTooltipModel(tooltipModel, 'html');\n      var boxShadow = shadowOffsetX + \"px \" + shadowOffsetY + \"px \" + shadowBlur + \"px \" + shadowColor;\n      cssText.push('box-shadow:' + boxShadow);\n      // Animation transition. Do not animate when transitionDuration is 0.\n      enableTransition && transitionDuration && cssText.push(assembleTransition(transitionDuration, onlyFade));\n      if (backgroundColor) {\n        cssText.push('background-color:' + backgroundColor);\n      }\n      // Border style\n      each(['width', 'color', 'radius'], function (name) {\n        var borderName = 'border-' + name;\n        var camelCase = toCamelCase(borderName);\n        var val = tooltipModel.get(camelCase);\n        val != null && cssText.push(borderName + ':' + val + (name === 'color' ? '' : 'px'));\n      });\n      // Text style\n      cssText.push(assembleFont(textStyleModel));\n      // Padding\n      if (padding != null) {\n        cssText.push('padding:' + normalizeCssArray$1(padding).join('px ') + 'px');\n      }\n      return cssText.join(';') + ';';\n    }\n    // If not able to make, do not modify the input `out`.\n    function makeStyleCoord(out, zr, container, zrX, zrY) {\n      var zrPainter = zr && zr.painter;\n      if (container) {\n        var zrViewportRoot = zrPainter && zrPainter.getViewportRoot();\n        if (zrViewportRoot) {\n          // Some APPs might use scale on body, so we support CSS transform here.\n          transformLocalCoord(out, zrViewportRoot, container, zrX, zrY);\n        }\n      } else {\n        out[0] = zrX;\n        out[1] = zrY;\n        // xy should be based on canvas root. But tooltipContent is\n        // the sibling of canvas root. So padding of ec container\n        // should be considered here.\n        var viewportRootOffset = zrPainter && zrPainter.getViewportRootOffset();\n        if (viewportRootOffset) {\n          out[0] += viewportRootOffset.offsetLeft;\n          out[1] += viewportRootOffset.offsetTop;\n        }\n      }\n      out[2] = out[0] / zr.getWidth();\n      out[3] = out[1] / zr.getHeight();\n    }\n    var TooltipHTMLContent = /** @class */function () {\n      function TooltipHTMLContent(api, opt) {\n        this._show = false;\n        this._styleCoord = [0, 0, 0, 0];\n        this._enterable = true;\n        this._alwaysShowContent = false;\n        this._firstShow = true;\n        this._longHide = true;\n        if (env.wxa) {\n          return null;\n        }\n        var el = document.createElement('div');\n        // TODO: TYPE\n        el.domBelongToZr = true;\n        this.el = el;\n        var zr = this._zr = api.getZr();\n        var appendTo = opt.appendTo;\n        var container = appendTo && (isString(appendTo) ? document.querySelector(appendTo) : isDom(appendTo) ? appendTo : isFunction(appendTo) && appendTo(api.getDom()));\n        makeStyleCoord(this._styleCoord, zr, container, api.getWidth() / 2, api.getHeight() / 2);\n        (container || api.getDom()).appendChild(el);\n        this._api = api;\n        this._container = container;\n        // FIXME\n        // Is it needed to trigger zr event manually if\n        // the browser do not support `pointer-events: none`.\n        var self = this;\n        el.onmouseenter = function () {\n          // clear the timeout in hideLater and keep showing tooltip\n          if (self._enterable) {\n            clearTimeout(self._hideTimeout);\n            self._show = true;\n          }\n          self._inContent = true;\n        };\n        el.onmousemove = function (e) {\n          e = e || window.event;\n          if (!self._enterable) {\n            // `pointer-events: none` is set to tooltip content div\n            // if `enterable` is set as `false`, and `el.onmousemove`\n            // can not be triggered. But in browser that do not\n            // support `pointer-events`, we need to do this:\n            // Try trigger zrender event to avoid mouse\n            // in and out shape too frequently\n            var handler = zr.handler;\n            var zrViewportRoot = zr.painter.getViewportRoot();\n            normalizeEvent(zrViewportRoot, e, true);\n            handler.dispatch('mousemove', e);\n          }\n        };\n        el.onmouseleave = function () {\n          // set `_inContent` to `false` before `hideLater`\n          self._inContent = false;\n          if (self._enterable) {\n            if (self._show) {\n              self.hideLater(self._hideDelay);\n            }\n          }\n        };\n      }\n      /**\r\n       * Update when tooltip is rendered\r\n       */\n      TooltipHTMLContent.prototype.update = function (tooltipModel) {\n        // FIXME\n        // Move this logic to ec main?\n        if (!this._container) {\n          var container = this._api.getDom();\n          var position = getComputedStyle(container, 'position');\n          var domStyle = container.style;\n          if (domStyle.position !== 'absolute' && position !== 'absolute') {\n            domStyle.position = 'relative';\n          }\n        }\n        // move tooltip if chart resized\n        var alwaysShowContent = tooltipModel.get('alwaysShowContent');\n        alwaysShowContent && this._moveIfResized();\n        // update alwaysShowContent\n        this._alwaysShowContent = alwaysShowContent;\n        // update className\n        this.el.className = tooltipModel.get('className') || '';\n        // Hide the tooltip\n        // PENDING\n        // this.hide();\n      };\n      TooltipHTMLContent.prototype.show = function (tooltipModel, nearPointColor) {\n        clearTimeout(this._hideTimeout);\n        clearTimeout(this._longHideTimeout);\n        var el = this.el;\n        var style = el.style;\n        var styleCoord = this._styleCoord;\n        if (!el.innerHTML) {\n          style.display = 'none';\n        } else {\n          style.cssText = gCssText + assembleCssText(tooltipModel, !this._firstShow, this._longHide)\n          // initial transform\n          + assembleTransform(styleCoord[0], styleCoord[1], true) + (\"border-color:\" + convertToColorString(nearPointColor) + \";\") + (tooltipModel.get('extraCssText') || '')\n          // If mouse occasionally move over the tooltip, a mouseout event will be\n          // triggered by canvas, and cause some unexpectable result like dragging\n          // stop, \"unfocusAdjacency\". Here `pointer-events: none` is used to solve\n          // it. Although it is not supported by IE8~IE10, fortunately it is a rare\n          // scenario.\n          + (\";pointer-events:\" + (this._enterable ? 'auto' : 'none'));\n        }\n        this._show = true;\n        this._firstShow = false;\n        this._longHide = false;\n      };\n      TooltipHTMLContent.prototype.setContent = function (content, markers, tooltipModel, borderColor, arrowPosition) {\n        var el = this.el;\n        if (content == null) {\n          el.innerHTML = '';\n          return;\n        }\n        var arrow = '';\n        if (isString(arrowPosition) && tooltipModel.get('trigger') === 'item' && !shouldTooltipConfine(tooltipModel)) {\n          arrow = assembleArrow(tooltipModel, borderColor, arrowPosition);\n        }\n        if (isString(content)) {\n          el.innerHTML = content + arrow;\n        } else if (content) {\n          // Clear previous\n          el.innerHTML = '';\n          if (!isArray(content)) {\n            content = [content];\n          }\n          for (var i = 0; i < content.length; i++) {\n            if (isDom(content[i]) && content[i].parentNode !== el) {\n              el.appendChild(content[i]);\n            }\n          }\n          // no arrow if empty\n          if (arrow && el.childNodes.length) {\n            // no need to create a new parent element, but it's not supported by IE 10 and older.\n            // const arrowEl = document.createRange().createContextualFragment(arrow);\n            var arrowEl = document.createElement('div');\n            arrowEl.innerHTML = arrow;\n            el.appendChild(arrowEl);\n          }\n        }\n      };\n      TooltipHTMLContent.prototype.setEnterable = function (enterable) {\n        this._enterable = enterable;\n      };\n      TooltipHTMLContent.prototype.getSize = function () {\n        var el = this.el;\n        return el ? [el.offsetWidth, el.offsetHeight] : [0, 0];\n      };\n      TooltipHTMLContent.prototype.moveTo = function (zrX, zrY) {\n        if (!this.el) {\n          return;\n        }\n        var styleCoord = this._styleCoord;\n        makeStyleCoord(styleCoord, this._zr, this._container, zrX, zrY);\n        if (styleCoord[0] != null && styleCoord[1] != null) {\n          var style_1 = this.el.style;\n          var transforms = assembleTransform(styleCoord[0], styleCoord[1]);\n          each(transforms, function (transform) {\n            style_1[transform[0]] = transform[1];\n          });\n        }\n      };\n      /**\r\n       * when `alwaysShowContent` is true,\r\n       * move the tooltip after chart resized\r\n       */\n      TooltipHTMLContent.prototype._moveIfResized = function () {\n        // The ratio of left to width\n        var ratioX = this._styleCoord[2];\n        // The ratio of top to height\n        var ratioY = this._styleCoord[3];\n        this.moveTo(ratioX * this._zr.getWidth(), ratioY * this._zr.getHeight());\n      };\n      TooltipHTMLContent.prototype.hide = function () {\n        var _this = this;\n        var style = this.el.style;\n        style.visibility = 'hidden';\n        style.opacity = '0';\n        env.transform3dSupported && (style.willChange = '');\n        this._show = false;\n        this._longHideTimeout = setTimeout(function () {\n          return _this._longHide = true;\n        }, 500);\n      };\n      TooltipHTMLContent.prototype.hideLater = function (time) {\n        if (this._show && !(this._inContent && this._enterable) && !this._alwaysShowContent) {\n          if (time) {\n            this._hideDelay = time;\n            // Set show false to avoid invoke hideLater multiple times\n            this._show = false;\n            this._hideTimeout = setTimeout(bind(this.hide, this), time);\n          } else {\n            this.hide();\n          }\n        }\n      };\n      TooltipHTMLContent.prototype.isShow = function () {\n        return this._show;\n      };\n      TooltipHTMLContent.prototype.dispose = function () {\n        clearTimeout(this._hideTimeout);\n        clearTimeout(this._longHideTimeout);\n        var parentNode = this.el.parentNode;\n        parentNode && parentNode.removeChild(this.el);\n        this.el = this._container = null;\n      };\n      return TooltipHTMLContent;\n    }();\n\n    var TooltipRichContent = /** @class */function () {\n      function TooltipRichContent(api) {\n        this._show = false;\n        this._styleCoord = [0, 0, 0, 0];\n        this._alwaysShowContent = false;\n        this._enterable = true;\n        this._zr = api.getZr();\n        makeStyleCoord$1(this._styleCoord, this._zr, api.getWidth() / 2, api.getHeight() / 2);\n      }\n      /**\r\n       * Update when tooltip is rendered\r\n       */\n      TooltipRichContent.prototype.update = function (tooltipModel) {\n        var alwaysShowContent = tooltipModel.get('alwaysShowContent');\n        alwaysShowContent && this._moveIfResized();\n        // update alwaysShowContent\n        this._alwaysShowContent = alwaysShowContent;\n      };\n      TooltipRichContent.prototype.show = function () {\n        if (this._hideTimeout) {\n          clearTimeout(this._hideTimeout);\n        }\n        this.el.show();\n        this._show = true;\n      };\n      /**\r\n       * Set tooltip content\r\n       */\n      TooltipRichContent.prototype.setContent = function (content, markupStyleCreator, tooltipModel, borderColor, arrowPosition) {\n        var _this = this;\n        if (isObject(content)) {\n          throwError(\"development\" !== 'production' ? 'Passing DOM nodes as content is not supported in richText tooltip!' : '');\n        }\n        if (this.el) {\n          this._zr.remove(this.el);\n        }\n        var textStyleModel = tooltipModel.getModel('textStyle');\n        this.el = new ZRText({\n          style: {\n            rich: markupStyleCreator.richTextStyles,\n            text: content,\n            lineHeight: 22,\n            borderWidth: 1,\n            borderColor: borderColor,\n            textShadowColor: textStyleModel.get('textShadowColor'),\n            fill: tooltipModel.get(['textStyle', 'color']),\n            padding: getPaddingFromTooltipModel(tooltipModel, 'richText'),\n            verticalAlign: 'top',\n            align: 'left'\n          },\n          z: tooltipModel.get('z')\n        });\n        each(['backgroundColor', 'borderRadius', 'shadowColor', 'shadowBlur', 'shadowOffsetX', 'shadowOffsetY'], function (propName) {\n          _this.el.style[propName] = tooltipModel.get(propName);\n        });\n        each(['textShadowBlur', 'textShadowOffsetX', 'textShadowOffsetY'], function (propName) {\n          _this.el.style[propName] = textStyleModel.get(propName) || 0;\n        });\n        this._zr.add(this.el);\n        var self = this;\n        this.el.on('mouseover', function () {\n          // clear the timeout in hideLater and keep showing tooltip\n          if (self._enterable) {\n            clearTimeout(self._hideTimeout);\n            self._show = true;\n          }\n          self._inContent = true;\n        });\n        this.el.on('mouseout', function () {\n          if (self._enterable) {\n            if (self._show) {\n              self.hideLater(self._hideDelay);\n            }\n          }\n          self._inContent = false;\n        });\n      };\n      TooltipRichContent.prototype.setEnterable = function (enterable) {\n        this._enterable = enterable;\n      };\n      TooltipRichContent.prototype.getSize = function () {\n        var el = this.el;\n        var bounding = this.el.getBoundingRect();\n        // bounding rect does not include shadow. For renderMode richText,\n        // if overflow, it will be cut. So calculate them accurately.\n        var shadowOuterSize = calcShadowOuterSize(el.style);\n        return [bounding.width + shadowOuterSize.left + shadowOuterSize.right, bounding.height + shadowOuterSize.top + shadowOuterSize.bottom];\n      };\n      TooltipRichContent.prototype.moveTo = function (x, y) {\n        var el = this.el;\n        if (el) {\n          var styleCoord = this._styleCoord;\n          makeStyleCoord$1(styleCoord, this._zr, x, y);\n          x = styleCoord[0];\n          y = styleCoord[1];\n          var style = el.style;\n          var borderWidth = mathMaxWith0(style.borderWidth || 0);\n          var shadowOuterSize = calcShadowOuterSize(style);\n          // rich text x, y do not include border.\n          el.x = x + borderWidth + shadowOuterSize.left;\n          el.y = y + borderWidth + shadowOuterSize.top;\n          el.markRedraw();\n        }\n      };\n      /**\r\n       * when `alwaysShowContent` is true,\r\n       * move the tooltip after chart resized\r\n       */\n      TooltipRichContent.prototype._moveIfResized = function () {\n        // The ratio of left to width\n        var ratioX = this._styleCoord[2];\n        // The ratio of top to height\n        var ratioY = this._styleCoord[3];\n        this.moveTo(ratioX * this._zr.getWidth(), ratioY * this._zr.getHeight());\n      };\n      TooltipRichContent.prototype.hide = function () {\n        if (this.el) {\n          this.el.hide();\n        }\n        this._show = false;\n      };\n      TooltipRichContent.prototype.hideLater = function (time) {\n        if (this._show && !(this._inContent && this._enterable) && !this._alwaysShowContent) {\n          if (time) {\n            this._hideDelay = time;\n            // Set show false to avoid invoke hideLater multiple times\n            this._show = false;\n            this._hideTimeout = setTimeout(bind(this.hide, this), time);\n          } else {\n            this.hide();\n          }\n        }\n      };\n      TooltipRichContent.prototype.isShow = function () {\n        return this._show;\n      };\n      TooltipRichContent.prototype.dispose = function () {\n        this._zr.remove(this.el);\n      };\n      return TooltipRichContent;\n    }();\n    function mathMaxWith0(val) {\n      return Math.max(0, val);\n    }\n    function calcShadowOuterSize(style) {\n      var shadowBlur = mathMaxWith0(style.shadowBlur || 0);\n      var shadowOffsetX = mathMaxWith0(style.shadowOffsetX || 0);\n      var shadowOffsetY = mathMaxWith0(style.shadowOffsetY || 0);\n      return {\n        left: mathMaxWith0(shadowBlur - shadowOffsetX),\n        right: mathMaxWith0(shadowBlur + shadowOffsetX),\n        top: mathMaxWith0(shadowBlur - shadowOffsetY),\n        bottom: mathMaxWith0(shadowBlur + shadowOffsetY)\n      };\n    }\n    function makeStyleCoord$1(out, zr, zrX, zrY) {\n      out[0] = zrX;\n      out[1] = zrY;\n      out[2] = out[0] / zr.getWidth();\n      out[3] = out[1] / zr.getHeight();\n    }\n\n    var proxyRect = new Rect({\n      shape: {\n        x: -1,\n        y: -1,\n        width: 2,\n        height: 2\n      }\n    });\n    var TooltipView = /** @class */function (_super) {\n      __extends(TooltipView, _super);\n      function TooltipView() {\n        var _this = _super !== null && _super.apply(this, arguments) || this;\n        _this.type = TooltipView.type;\n        return _this;\n      }\n      TooltipView.prototype.init = function (ecModel, api) {\n        if (env.node || !api.getDom()) {\n          return;\n        }\n        var tooltipModel = ecModel.getComponent('tooltip');\n        var renderMode = this._renderMode = getTooltipRenderMode(tooltipModel.get('renderMode'));\n        this._tooltipContent = renderMode === 'richText' ? new TooltipRichContent(api) : new TooltipHTMLContent(api, {\n          appendTo: tooltipModel.get('appendToBody', true) ? 'body' : tooltipModel.get('appendTo', true)\n        });\n      };\n      TooltipView.prototype.render = function (tooltipModel, ecModel, api) {\n        if (env.node || !api.getDom()) {\n          return;\n        }\n        // Reset\n        this.group.removeAll();\n        this._tooltipModel = tooltipModel;\n        this._ecModel = ecModel;\n        this._api = api;\n        var tooltipContent = this._tooltipContent;\n        tooltipContent.update(tooltipModel);\n        tooltipContent.setEnterable(tooltipModel.get('enterable'));\n        this._initGlobalListener();\n        this._keepShow();\n        // PENDING\n        // `mousemove` event will be triggered very frequently when the mouse moves fast,\n        // which causes that the `updatePosition` function was also called frequently.\n        // In Chrome with devtools open and Firefox, tooltip looks laggy and shakes. See #14695 #16101\n        // To avoid frequent triggering,\n        // consider throttling it in 50ms when transition is enabled\n        if (this._renderMode !== 'richText' && tooltipModel.get('transitionDuration')) {\n          createOrUpdate(this, '_updatePosition', 50, 'fixRate');\n        } else {\n          clear(this, '_updatePosition');\n        }\n      };\n      TooltipView.prototype._initGlobalListener = function () {\n        var tooltipModel = this._tooltipModel;\n        var triggerOn = tooltipModel.get('triggerOn');\n        register('itemTooltip', this._api, bind(function (currTrigger, e, dispatchAction) {\n          // If 'none', it is not controlled by mouse totally.\n          if (triggerOn !== 'none') {\n            if (triggerOn.indexOf(currTrigger) >= 0) {\n              this._tryShow(e, dispatchAction);\n            } else if (currTrigger === 'leave') {\n              this._hide(dispatchAction);\n            }\n          }\n        }, this));\n      };\n      TooltipView.prototype._keepShow = function () {\n        var tooltipModel = this._tooltipModel;\n        var ecModel = this._ecModel;\n        var api = this._api;\n        var triggerOn = tooltipModel.get('triggerOn');\n        // Try to keep the tooltip show when refreshing\n        if (this._lastX != null && this._lastY != null\n        // When user is willing to control tooltip totally using API,\n        // self.manuallyShowTip({x, y}) might cause tooltip hide,\n        // which is not expected.\n        && triggerOn !== 'none' && triggerOn !== 'click') {\n          var self_1 = this;\n          clearTimeout(this._refreshUpdateTimeout);\n          this._refreshUpdateTimeout = setTimeout(function () {\n            // Show tip next tick after other charts are rendered\n            // In case highlight action has wrong result\n            // FIXME\n            !api.isDisposed() && self_1.manuallyShowTip(tooltipModel, ecModel, api, {\n              x: self_1._lastX,\n              y: self_1._lastY,\n              dataByCoordSys: self_1._lastDataByCoordSys\n            });\n          });\n        }\n      };\n      /**\r\n       * Show tip manually by\r\n       * dispatchAction({\r\n       *     type: 'showTip',\r\n       *     x: 10,\r\n       *     y: 10\r\n       * });\r\n       * Or\r\n       * dispatchAction({\r\n       *      type: 'showTip',\r\n       *      seriesIndex: 0,\r\n       *      dataIndex or dataIndexInside or name\r\n       * });\r\n       *\r\n       *  TODO Batch\r\n       */\n      TooltipView.prototype.manuallyShowTip = function (tooltipModel, ecModel, api, payload) {\n        if (payload.from === this.uid || env.node || !api.getDom()) {\n          return;\n        }\n        var dispatchAction = makeDispatchAction$1(payload, api);\n        // Reset ticket\n        this._ticket = '';\n        // When triggered from axisPointer.\n        var dataByCoordSys = payload.dataByCoordSys;\n        var cmptRef = findComponentReference(payload, ecModel, api);\n        if (cmptRef) {\n          var rect = cmptRef.el.getBoundingRect().clone();\n          rect.applyTransform(cmptRef.el.transform);\n          this._tryShow({\n            offsetX: rect.x + rect.width / 2,\n            offsetY: rect.y + rect.height / 2,\n            target: cmptRef.el,\n            position: payload.position,\n            // When manully trigger, the mouse is not on the el, so we'd better to\n            // position tooltip on the bottom of the el and display arrow is possible.\n            positionDefault: 'bottom'\n          }, dispatchAction);\n        } else if (payload.tooltip && payload.x != null && payload.y != null) {\n          var el = proxyRect;\n          el.x = payload.x;\n          el.y = payload.y;\n          el.update();\n          getECData(el).tooltipConfig = {\n            name: null,\n            option: payload.tooltip\n          };\n          // Manually show tooltip while view is not using zrender elements.\n          this._tryShow({\n            offsetX: payload.x,\n            offsetY: payload.y,\n            target: el\n          }, dispatchAction);\n        } else if (dataByCoordSys) {\n          this._tryShow({\n            offsetX: payload.x,\n            offsetY: payload.y,\n            position: payload.position,\n            dataByCoordSys: dataByCoordSys,\n            tooltipOption: payload.tooltipOption\n          }, dispatchAction);\n        } else if (payload.seriesIndex != null) {\n          if (this._manuallyAxisShowTip(tooltipModel, ecModel, api, payload)) {\n            return;\n          }\n          var pointInfo = findPointFromSeries(payload, ecModel);\n          var cx = pointInfo.point[0];\n          var cy = pointInfo.point[1];\n          if (cx != null && cy != null) {\n            this._tryShow({\n              offsetX: cx,\n              offsetY: cy,\n              target: pointInfo.el,\n              position: payload.position,\n              // When manully trigger, the mouse is not on the el, so we'd better to\n              // position tooltip on the bottom of the el and display arrow is possible.\n              positionDefault: 'bottom'\n            }, dispatchAction);\n          }\n        } else if (payload.x != null && payload.y != null) {\n          // FIXME\n          // should wrap dispatchAction like `axisPointer/globalListener` ?\n          api.dispatchAction({\n            type: 'updateAxisPointer',\n            x: payload.x,\n            y: payload.y\n          });\n          this._tryShow({\n            offsetX: payload.x,\n            offsetY: payload.y,\n            position: payload.position,\n            target: api.getZr().findHover(payload.x, payload.y).target\n          }, dispatchAction);\n        }\n      };\n      TooltipView.prototype.manuallyHideTip = function (tooltipModel, ecModel, api, payload) {\n        var tooltipContent = this._tooltipContent;\n        if (this._tooltipModel) {\n          tooltipContent.hideLater(this._tooltipModel.get('hideDelay'));\n        }\n        this._lastX = this._lastY = this._lastDataByCoordSys = null;\n        if (payload.from !== this.uid) {\n          this._hide(makeDispatchAction$1(payload, api));\n        }\n      };\n      // Be compatible with previous design, that is, when tooltip.type is 'axis' and\n      // dispatchAction 'showTip' with seriesIndex and dataIndex will trigger axis pointer\n      // and tooltip.\n      TooltipView.prototype._manuallyAxisShowTip = function (tooltipModel, ecModel, api, payload) {\n        var seriesIndex = payload.seriesIndex;\n        var dataIndex = payload.dataIndex;\n        // @ts-ignore\n        var coordSysAxesInfo = ecModel.getComponent('axisPointer').coordSysAxesInfo;\n        if (seriesIndex == null || dataIndex == null || coordSysAxesInfo == null) {\n          return;\n        }\n        var seriesModel = ecModel.getSeriesByIndex(seriesIndex);\n        if (!seriesModel) {\n          return;\n        }\n        var data = seriesModel.getData();\n        var tooltipCascadedModel = buildTooltipModel([data.getItemModel(dataIndex), seriesModel, (seriesModel.coordinateSystem || {}).model], this._tooltipModel);\n        if (tooltipCascadedModel.get('trigger') !== 'axis') {\n          return;\n        }\n        api.dispatchAction({\n          type: 'updateAxisPointer',\n          seriesIndex: seriesIndex,\n          dataIndex: dataIndex,\n          position: payload.position\n        });\n        return true;\n      };\n      TooltipView.prototype._tryShow = function (e, dispatchAction) {\n        var el = e.target;\n        var tooltipModel = this._tooltipModel;\n        if (!tooltipModel) {\n          return;\n        }\n        // Save mouse x, mouse y. So we can try to keep showing the tip if chart is refreshed\n        this._lastX = e.offsetX;\n        this._lastY = e.offsetY;\n        var dataByCoordSys = e.dataByCoordSys;\n        if (dataByCoordSys && dataByCoordSys.length) {\n          this._showAxisTooltip(dataByCoordSys, e);\n        } else if (el) {\n          var ecData = getECData(el);\n          if (ecData.ssrType === 'legend') {\n            // Don't trigger tooltip for legend tooltip item\n            return;\n          }\n          this._lastDataByCoordSys = null;\n          var seriesDispatcher_1;\n          var cmptDispatcher_1;\n          findEventDispatcher(el, function (target) {\n            // Always show item tooltip if mouse is on the element with dataIndex\n            if (getECData(target).dataIndex != null) {\n              seriesDispatcher_1 = target;\n              return true;\n            }\n            // Tooltip provided directly. Like legend.\n            if (getECData(target).tooltipConfig != null) {\n              cmptDispatcher_1 = target;\n              return true;\n            }\n          }, true);\n          if (seriesDispatcher_1) {\n            this._showSeriesItemTooltip(e, seriesDispatcher_1, dispatchAction);\n          } else if (cmptDispatcher_1) {\n            this._showComponentItemTooltip(e, cmptDispatcher_1, dispatchAction);\n          } else {\n            this._hide(dispatchAction);\n          }\n        } else {\n          this._lastDataByCoordSys = null;\n          this._hide(dispatchAction);\n        }\n      };\n      TooltipView.prototype._showOrMove = function (tooltipModel, cb) {\n        // showDelay is used in this case: tooltip.enterable is set\n        // as true. User intent to move mouse into tooltip and click\n        // something. `showDelay` makes it easier to enter the content\n        // but tooltip do not move immediately.\n        var delay = tooltipModel.get('showDelay');\n        cb = bind(cb, this);\n        clearTimeout(this._showTimout);\n        delay > 0 ? this._showTimout = setTimeout(cb, delay) : cb();\n      };\n      TooltipView.prototype._showAxisTooltip = function (dataByCoordSys, e) {\n        var ecModel = this._ecModel;\n        var globalTooltipModel = this._tooltipModel;\n        var point = [e.offsetX, e.offsetY];\n        var singleTooltipModel = buildTooltipModel([e.tooltipOption], globalTooltipModel);\n        var renderMode = this._renderMode;\n        var cbParamsList = [];\n        var articleMarkup = createTooltipMarkup('section', {\n          blocks: [],\n          noHeader: true\n        });\n        // Only for legacy: `Serise['formatTooltip']` returns a string.\n        var markupTextArrLegacy = [];\n        var markupStyleCreator = new TooltipMarkupStyleCreator();\n        each(dataByCoordSys, function (itemCoordSys) {\n          each(itemCoordSys.dataByAxis, function (axisItem) {\n            var axisModel = ecModel.getComponent(axisItem.axisDim + 'Axis', axisItem.axisIndex);\n            var axisValue = axisItem.value;\n            if (!axisModel || axisValue == null) {\n              return;\n            }\n            var axisValueLabel = getValueLabel(axisValue, axisModel.axis, ecModel, axisItem.seriesDataIndices, axisItem.valueLabelOpt);\n            var axisSectionMarkup = createTooltipMarkup('section', {\n              header: axisValueLabel,\n              noHeader: !trim(axisValueLabel),\n              sortBlocks: true,\n              blocks: []\n            });\n            articleMarkup.blocks.push(axisSectionMarkup);\n            each(axisItem.seriesDataIndices, function (idxItem) {\n              var series = ecModel.getSeriesByIndex(idxItem.seriesIndex);\n              var dataIndex = idxItem.dataIndexInside;\n              var cbParams = series.getDataParams(dataIndex);\n              // Can't find data.\n              if (cbParams.dataIndex < 0) {\n                return;\n              }\n              cbParams.axisDim = axisItem.axisDim;\n              cbParams.axisIndex = axisItem.axisIndex;\n              cbParams.axisType = axisItem.axisType;\n              cbParams.axisId = axisItem.axisId;\n              cbParams.axisValue = getAxisRawValue(axisModel.axis, {\n                value: axisValue\n              });\n              cbParams.axisValueLabel = axisValueLabel;\n              // Pre-create marker style for makers. Users can assemble richText\n              // text in `formatter` callback and use those markers style.\n              cbParams.marker = markupStyleCreator.makeTooltipMarker('item', convertToColorString(cbParams.color), renderMode);\n              var seriesTooltipResult = normalizeTooltipFormatResult(series.formatTooltip(dataIndex, true, null));\n              var frag = seriesTooltipResult.frag;\n              if (frag) {\n                var valueFormatter = buildTooltipModel([series], globalTooltipModel).get('valueFormatter');\n                axisSectionMarkup.blocks.push(valueFormatter ? extend({\n                  valueFormatter: valueFormatter\n                }, frag) : frag);\n              }\n              if (seriesTooltipResult.text) {\n                markupTextArrLegacy.push(seriesTooltipResult.text);\n              }\n              cbParamsList.push(cbParams);\n            });\n          });\n        });\n        // In most cases, the second axis is displays upper on the first one.\n        // So we reverse it to look better.\n        articleMarkup.blocks.reverse();\n        markupTextArrLegacy.reverse();\n        var positionExpr = e.position;\n        var orderMode = singleTooltipModel.get('order');\n        var builtMarkupText = buildTooltipMarkup(articleMarkup, markupStyleCreator, renderMode, orderMode, ecModel.get('useUTC'), singleTooltipModel.get('textStyle'));\n        builtMarkupText && markupTextArrLegacy.unshift(builtMarkupText);\n        var blockBreak = renderMode === 'richText' ? '\\n\\n' : '<br/>';\n        var allMarkupText = markupTextArrLegacy.join(blockBreak);\n        this._showOrMove(singleTooltipModel, function () {\n          if (this._updateContentNotChangedOnAxis(dataByCoordSys, cbParamsList)) {\n            this._updatePosition(singleTooltipModel, positionExpr, point[0], point[1], this._tooltipContent, cbParamsList);\n          } else {\n            this._showTooltipContent(singleTooltipModel, allMarkupText, cbParamsList, Math.random() + '', point[0], point[1], positionExpr, null, markupStyleCreator);\n          }\n        });\n        // Do not trigger events here, because this branch only be entered\n        // from dispatchAction.\n      };\n      TooltipView.prototype._showSeriesItemTooltip = function (e, dispatcher, dispatchAction) {\n        var ecModel = this._ecModel;\n        var ecData = getECData(dispatcher);\n        // Use dataModel in element if possible\n        // Used when mouseover on a element like markPoint or edge\n        // In which case, the data is not main data in series.\n        var seriesIndex = ecData.seriesIndex;\n        var seriesModel = ecModel.getSeriesByIndex(seriesIndex);\n        // For example, graph link.\n        var dataModel = ecData.dataModel || seriesModel;\n        var dataIndex = ecData.dataIndex;\n        var dataType = ecData.dataType;\n        var data = dataModel.getData(dataType);\n        var renderMode = this._renderMode;\n        var positionDefault = e.positionDefault;\n        var tooltipModel = buildTooltipModel([data.getItemModel(dataIndex), dataModel, seriesModel && (seriesModel.coordinateSystem || {}).model], this._tooltipModel, positionDefault ? {\n          position: positionDefault\n        } : null);\n        var tooltipTrigger = tooltipModel.get('trigger');\n        if (tooltipTrigger != null && tooltipTrigger !== 'item') {\n          return;\n        }\n        var params = dataModel.getDataParams(dataIndex, dataType);\n        var markupStyleCreator = new TooltipMarkupStyleCreator();\n        // Pre-create marker style for makers. Users can assemble richText\n        // text in `formatter` callback and use those markers style.\n        params.marker = markupStyleCreator.makeTooltipMarker('item', convertToColorString(params.color), renderMode);\n        var seriesTooltipResult = normalizeTooltipFormatResult(dataModel.formatTooltip(dataIndex, false, dataType));\n        var orderMode = tooltipModel.get('order');\n        var valueFormatter = tooltipModel.get('valueFormatter');\n        var frag = seriesTooltipResult.frag;\n        var markupText = frag ? buildTooltipMarkup(valueFormatter ? extend({\n          valueFormatter: valueFormatter\n        }, frag) : frag, markupStyleCreator, renderMode, orderMode, ecModel.get('useUTC'), tooltipModel.get('textStyle')) : seriesTooltipResult.text;\n        var asyncTicket = 'item_' + dataModel.name + '_' + dataIndex;\n        this._showOrMove(tooltipModel, function () {\n          this._showTooltipContent(tooltipModel, markupText, params, asyncTicket, e.offsetX, e.offsetY, e.position, e.target, markupStyleCreator);\n        });\n        // FIXME\n        // duplicated showtip if manuallyShowTip is called from dispatchAction.\n        dispatchAction({\n          type: 'showTip',\n          dataIndexInside: dataIndex,\n          dataIndex: data.getRawIndex(dataIndex),\n          seriesIndex: seriesIndex,\n          from: this.uid\n        });\n      };\n      TooltipView.prototype._showComponentItemTooltip = function (e, el, dispatchAction) {\n        var isHTMLRenderMode = this._renderMode === 'html';\n        var ecData = getECData(el);\n        var tooltipConfig = ecData.tooltipConfig;\n        var tooltipOpt = tooltipConfig.option || {};\n        var encodeHTMLContent = tooltipOpt.encodeHTMLContent;\n        if (isString(tooltipOpt)) {\n          var content = tooltipOpt;\n          tooltipOpt = {\n            content: content,\n            // Fixed formatter\n            formatter: content\n          };\n          // when `tooltipConfig.option` is a string rather than an object,\n          // we can't know if the content needs to be encoded\n          // for the sake of security, encode it by default.\n          encodeHTMLContent = true;\n        }\n        if (encodeHTMLContent && isHTMLRenderMode && tooltipOpt.content) {\n          // clone might be unnecessary?\n          tooltipOpt = clone(tooltipOpt);\n          tooltipOpt.content = encodeHTML(tooltipOpt.content);\n        }\n        var tooltipModelCascade = [tooltipOpt];\n        var cmpt = this._ecModel.getComponent(ecData.componentMainType, ecData.componentIndex);\n        if (cmpt) {\n          tooltipModelCascade.push(cmpt);\n        }\n        // In most cases, component tooltip formatter has different params with series tooltip formatter,\n        // so that they cannot share the same formatter. Since the global tooltip formatter is used for series\n        // by convention, we do not use it as the default formatter for component.\n        tooltipModelCascade.push({\n          formatter: tooltipOpt.content\n        });\n        var positionDefault = e.positionDefault;\n        var subTooltipModel = buildTooltipModel(tooltipModelCascade, this._tooltipModel, positionDefault ? {\n          position: positionDefault\n        } : null);\n        var defaultHtml = subTooltipModel.get('content');\n        var asyncTicket = Math.random() + '';\n        // PENDING: this case do not support richText style yet.\n        var markupStyleCreator = new TooltipMarkupStyleCreator();\n        // Do not check whether `trigger` is 'none' here, because `trigger`\n        // only works on coordinate system. In fact, we have not found case\n        // that requires setting `trigger` nothing on component yet.\n        this._showOrMove(subTooltipModel, function () {\n          // Use formatterParams from element defined in component\n          // Avoid users modify it.\n          var formatterParams = clone(subTooltipModel.get('formatterParams') || {});\n          this._showTooltipContent(subTooltipModel, defaultHtml, formatterParams, asyncTicket, e.offsetX, e.offsetY, e.position, el, markupStyleCreator);\n        });\n        // If not dispatch showTip, tip may be hide triggered by axis.\n        dispatchAction({\n          type: 'showTip',\n          from: this.uid\n        });\n      };\n      TooltipView.prototype._showTooltipContent = function (\n      // Use Model<TooltipOption> insteadof TooltipModel because this model may be from series or other options.\n      // Instead of top level tooltip.\n      tooltipModel, defaultHtml, params, asyncTicket, x, y, positionExpr, el, markupStyleCreator) {\n        // Reset ticket\n        this._ticket = '';\n        if (!tooltipModel.get('showContent') || !tooltipModel.get('show')) {\n          return;\n        }\n        var tooltipContent = this._tooltipContent;\n        tooltipContent.setEnterable(tooltipModel.get('enterable'));\n        var formatter = tooltipModel.get('formatter');\n        positionExpr = positionExpr || tooltipModel.get('position');\n        var html = defaultHtml;\n        var nearPoint = this._getNearestPoint([x, y], params, tooltipModel.get('trigger'), tooltipModel.get('borderColor'));\n        var nearPointColor = nearPoint.color;\n        if (formatter) {\n          if (isString(formatter)) {\n            var useUTC = tooltipModel.ecModel.get('useUTC');\n            var params0 = isArray(params) ? params[0] : params;\n            var isTimeAxis = params0 && params0.axisType && params0.axisType.indexOf('time') >= 0;\n            html = formatter;\n            if (isTimeAxis) {\n              html = format(params0.axisValue, html, useUTC);\n            }\n            html = formatTpl(html, params, true);\n          } else if (isFunction(formatter)) {\n            var callback = bind(function (cbTicket, html) {\n              if (cbTicket === this._ticket) {\n                tooltipContent.setContent(html, markupStyleCreator, tooltipModel, nearPointColor, positionExpr);\n                this._updatePosition(tooltipModel, positionExpr, x, y, tooltipContent, params, el);\n              }\n            }, this);\n            this._ticket = asyncTicket;\n            html = formatter(params, asyncTicket, callback);\n          } else {\n            html = formatter;\n          }\n        }\n        tooltipContent.setContent(html, markupStyleCreator, tooltipModel, nearPointColor, positionExpr);\n        tooltipContent.show(tooltipModel, nearPointColor);\n        this._updatePosition(tooltipModel, positionExpr, x, y, tooltipContent, params, el);\n      };\n      TooltipView.prototype._getNearestPoint = function (point, tooltipDataParams, trigger, borderColor) {\n        if (trigger === 'axis' || isArray(tooltipDataParams)) {\n          return {\n            color: borderColor || (this._renderMode === 'html' ? '#fff' : 'none')\n          };\n        }\n        if (!isArray(tooltipDataParams)) {\n          return {\n            color: borderColor || tooltipDataParams.color || tooltipDataParams.borderColor\n          };\n        }\n      };\n      TooltipView.prototype._updatePosition = function (tooltipModel, positionExpr, x,\n      // Mouse x\n      y,\n      // Mouse y\n      content, params, el) {\n        var viewWidth = this._api.getWidth();\n        var viewHeight = this._api.getHeight();\n        positionExpr = positionExpr || tooltipModel.get('position');\n        var contentSize = content.getSize();\n        var align = tooltipModel.get('align');\n        var vAlign = tooltipModel.get('verticalAlign');\n        var rect = el && el.getBoundingRect().clone();\n        el && rect.applyTransform(el.transform);\n        if (isFunction(positionExpr)) {\n          // Callback of position can be an array or a string specify the position\n          positionExpr = positionExpr([x, y], params, content.el, rect, {\n            viewSize: [viewWidth, viewHeight],\n            contentSize: contentSize.slice()\n          });\n        }\n        if (isArray(positionExpr)) {\n          x = parsePercent$1(positionExpr[0], viewWidth);\n          y = parsePercent$1(positionExpr[1], viewHeight);\n        } else if (isObject(positionExpr)) {\n          var boxLayoutPosition = positionExpr;\n          boxLayoutPosition.width = contentSize[0];\n          boxLayoutPosition.height = contentSize[1];\n          var layoutRect = getLayoutRect(boxLayoutPosition, {\n            width: viewWidth,\n            height: viewHeight\n          });\n          x = layoutRect.x;\n          y = layoutRect.y;\n          align = null;\n          // When positionExpr is left/top/right/bottom,\n          // align and verticalAlign will not work.\n          vAlign = null;\n        }\n        // Specify tooltip position by string 'top' 'bottom' 'left' 'right' around graphic element\n        else if (isString(positionExpr) && el) {\n          var pos = calcTooltipPosition(positionExpr, rect, contentSize, tooltipModel.get('borderWidth'));\n          x = pos[0];\n          y = pos[1];\n        } else {\n          var pos = refixTooltipPosition(x, y, content, viewWidth, viewHeight, align ? null : 20, vAlign ? null : 20);\n          x = pos[0];\n          y = pos[1];\n        }\n        align && (x -= isCenterAlign(align) ? contentSize[0] / 2 : align === 'right' ? contentSize[0] : 0);\n        vAlign && (y -= isCenterAlign(vAlign) ? contentSize[1] / 2 : vAlign === 'bottom' ? contentSize[1] : 0);\n        if (shouldTooltipConfine(tooltipModel)) {\n          var pos = confineTooltipPosition(x, y, content, viewWidth, viewHeight);\n          x = pos[0];\n          y = pos[1];\n        }\n        content.moveTo(x, y);\n      };\n      // FIXME\n      // Should we remove this but leave this to user?\n      TooltipView.prototype._updateContentNotChangedOnAxis = function (dataByCoordSys, cbParamsList) {\n        var lastCoordSys = this._lastDataByCoordSys;\n        var lastCbParamsList = this._cbParamsList;\n        var contentNotChanged = !!lastCoordSys && lastCoordSys.length === dataByCoordSys.length;\n        contentNotChanged && each(lastCoordSys, function (lastItemCoordSys, indexCoordSys) {\n          var lastDataByAxis = lastItemCoordSys.dataByAxis || [];\n          var thisItemCoordSys = dataByCoordSys[indexCoordSys] || {};\n          var thisDataByAxis = thisItemCoordSys.dataByAxis || [];\n          contentNotChanged = contentNotChanged && lastDataByAxis.length === thisDataByAxis.length;\n          contentNotChanged && each(lastDataByAxis, function (lastItem, indexAxis) {\n            var thisItem = thisDataByAxis[indexAxis] || {};\n            var lastIndices = lastItem.seriesDataIndices || [];\n            var newIndices = thisItem.seriesDataIndices || [];\n            contentNotChanged = contentNotChanged && lastItem.value === thisItem.value && lastItem.axisType === thisItem.axisType && lastItem.axisId === thisItem.axisId && lastIndices.length === newIndices.length;\n            contentNotChanged && each(lastIndices, function (lastIdxItem, j) {\n              var newIdxItem = newIndices[j];\n              contentNotChanged = contentNotChanged && lastIdxItem.seriesIndex === newIdxItem.seriesIndex && lastIdxItem.dataIndex === newIdxItem.dataIndex;\n            });\n            // check is cbParams data value changed\n            lastCbParamsList && each(lastItem.seriesDataIndices, function (idxItem) {\n              var seriesIdx = idxItem.seriesIndex;\n              var cbParams = cbParamsList[seriesIdx];\n              var lastCbParams = lastCbParamsList[seriesIdx];\n              if (cbParams && lastCbParams && lastCbParams.data !== cbParams.data) {\n                contentNotChanged = false;\n              }\n            });\n          });\n        });\n        this._lastDataByCoordSys = dataByCoordSys;\n        this._cbParamsList = cbParamsList;\n        return !!contentNotChanged;\n      };\n      TooltipView.prototype._hide = function (dispatchAction) {\n        // Do not directly hideLater here, because this behavior may be prevented\n        // in dispatchAction when showTip is dispatched.\n        // FIXME\n        // duplicated hideTip if manuallyHideTip is called from dispatchAction.\n        this._lastDataByCoordSys = null;\n        dispatchAction({\n          type: 'hideTip',\n          from: this.uid\n        });\n      };\n      TooltipView.prototype.dispose = function (ecModel, api) {\n        if (env.node || !api.getDom()) {\n          return;\n        }\n        clear(this, '_updatePosition');\n        this._tooltipContent.dispose();\n        unregister('itemTooltip', api);\n      };\n      TooltipView.type = 'tooltip';\n      return TooltipView;\n    }(ComponentView);\n    /**\r\n     * From top to bottom. (the last one should be globalTooltipModel);\r\n     */\n    function buildTooltipModel(modelCascade, globalTooltipModel, defaultTooltipOption) {\n      // Last is always tooltip model.\n      var ecModel = globalTooltipModel.ecModel;\n      var resultModel;\n      if (defaultTooltipOption) {\n        resultModel = new Model(defaultTooltipOption, ecModel, ecModel);\n        resultModel = new Model(globalTooltipModel.option, resultModel, ecModel);\n      } else {\n        resultModel = globalTooltipModel;\n      }\n      for (var i = modelCascade.length - 1; i >= 0; i--) {\n        var tooltipOpt = modelCascade[i];\n        if (tooltipOpt) {\n          if (tooltipOpt instanceof Model) {\n            tooltipOpt = tooltipOpt.get('tooltip', true);\n          }\n          // In each data item tooltip can be simply write:\n          // {\n          //  value: 10,\n          //  tooltip: 'Something you need to know'\n          // }\n          if (isString(tooltipOpt)) {\n            tooltipOpt = {\n              formatter: tooltipOpt\n            };\n          }\n          if (tooltipOpt) {\n            resultModel = new Model(tooltipOpt, resultModel, ecModel);\n          }\n        }\n      }\n      return resultModel;\n    }\n    function makeDispatchAction$1(payload, api) {\n      return payload.dispatchAction || bind(api.dispatchAction, api);\n    }\n    function refixTooltipPosition(x, y, content, viewWidth, viewHeight, gapH, gapV) {\n      var size = content.getSize();\n      var width = size[0];\n      var height = size[1];\n      if (gapH != null) {\n        // Add extra 2 pixels for this case:\n        // At present the \"values\" in default tooltip are using CSS `float: right`.\n        // When the right edge of the tooltip box is on the right side of the\n        // viewport, the `float` layout might push the \"values\" to the second line.\n        if (x + width + gapH + 2 > viewWidth) {\n          x -= width + gapH;\n        } else {\n          x += gapH;\n        }\n      }\n      if (gapV != null) {\n        if (y + height + gapV > viewHeight) {\n          y -= height + gapV;\n        } else {\n          y += gapV;\n        }\n      }\n      return [x, y];\n    }\n    function confineTooltipPosition(x, y, content, viewWidth, viewHeight) {\n      var size = content.getSize();\n      var width = size[0];\n      var height = size[1];\n      x = Math.min(x + width, viewWidth) - width;\n      y = Math.min(y + height, viewHeight) - height;\n      x = Math.max(x, 0);\n      y = Math.max(y, 0);\n      return [x, y];\n    }\n    function calcTooltipPosition(position, rect, contentSize, borderWidth) {\n      var domWidth = contentSize[0];\n      var domHeight = contentSize[1];\n      var offset = Math.ceil(Math.SQRT2 * borderWidth) + 8;\n      var x = 0;\n      var y = 0;\n      var rectWidth = rect.width;\n      var rectHeight = rect.height;\n      switch (position) {\n        case 'inside':\n          x = rect.x + rectWidth / 2 - domWidth / 2;\n          y = rect.y + rectHeight / 2 - domHeight / 2;\n          break;\n        case 'top':\n          x = rect.x + rectWidth / 2 - domWidth / 2;\n          y = rect.y - domHeight - offset;\n          break;\n        case 'bottom':\n          x = rect.x + rectWidth / 2 - domWidth / 2;\n          y = rect.y + rectHeight + offset;\n          break;\n        case 'left':\n          x = rect.x - domWidth - offset;\n          y = rect.y + rectHeight / 2 - domHeight / 2;\n          break;\n        case 'right':\n          x = rect.x + rectWidth + offset;\n          y = rect.y + rectHeight / 2 - domHeight / 2;\n      }\n      return [x, y];\n    }\n    function isCenterAlign(align) {\n      return align === 'center' || align === 'middle';\n    }\n    /**\r\n     * Find target component by payload like:\r\n     * ```js\r\n     * { legendId: 'some_id', name: 'xxx' }\r\n     * { toolboxIndex: 1, name: 'xxx' }\r\n     * { geoName: 'some_name', name: 'xxx' }\r\n     * ```\r\n     * PENDING: at present only\r\n     *\r\n     * If not found, return null/undefined.\r\n     */\n    function findComponentReference(payload, ecModel, api) {\n      var queryOptionMap = preParseFinder(payload).queryOptionMap;\n      var componentMainType = queryOptionMap.keys()[0];\n      if (!componentMainType || componentMainType === 'series') {\n        return;\n      }\n      var queryResult = queryReferringComponents(ecModel, componentMainType, queryOptionMap.get(componentMainType), {\n        useDefault: false,\n        enableAll: false,\n        enableNone: false\n      });\n      var model = queryResult.models[0];\n      if (!model) {\n        return;\n      }\n      var view = api.getViewOfComponentModel(model);\n      var el;\n      view.group.traverse(function (subEl) {\n        var tooltipConfig = getECData(subEl).tooltipConfig;\n        if (tooltipConfig && tooltipConfig.name === payload.name) {\n          el = subEl;\n          return true; // stop\n        }\n      });\n      if (el) {\n        return {\n          componentMainType: componentMainType,\n          componentIndex: model.componentIndex,\n          el: el\n        };\n      }\n    }\n\n    function install$A(registers) {\n      use(install$s);\n      registers.registerComponentModel(TooltipModel);\n      registers.registerComponentView(TooltipView);\n      /**\r\n       * @action\r\n       * @property {string} type\r\n       * @property {number} seriesIndex\r\n       * @property {number} dataIndex\r\n       * @property {number} [x]\r\n       * @property {number} [y]\r\n       */\n      registers.registerAction({\n        type: 'showTip',\n        event: 'showTip',\n        update: 'tooltip:manuallyShowTip'\n      }, noop);\n      registers.registerAction({\n        type: 'hideTip',\n        event: 'hideTip',\n        update: 'tooltip:manuallyHideTip'\n      }, noop);\n    }\n\n    var DEFAULT_TOOLBOX_BTNS = ['rect', 'polygon', 'keep', 'clear'];\n    function brushPreprocessor(option, isNew) {\n      var brushComponents = normalizeToArray(option ? option.brush : []);\n      if (!brushComponents.length) {\n        return;\n      }\n      var brushComponentSpecifiedBtns = [];\n      each(brushComponents, function (brushOpt) {\n        var tbs = brushOpt.hasOwnProperty('toolbox') ? brushOpt.toolbox : [];\n        if (tbs instanceof Array) {\n          brushComponentSpecifiedBtns = brushComponentSpecifiedBtns.concat(tbs);\n        }\n      });\n      var toolbox = option && option.toolbox;\n      if (isArray(toolbox)) {\n        toolbox = toolbox[0];\n      }\n      if (!toolbox) {\n        toolbox = {\n          feature: {}\n        };\n        option.toolbox = [toolbox];\n      }\n      var toolboxFeature = toolbox.feature || (toolbox.feature = {});\n      var toolboxBrush = toolboxFeature.brush || (toolboxFeature.brush = {});\n      var brushTypes = toolboxBrush.type || (toolboxBrush.type = []);\n      brushTypes.push.apply(brushTypes, brushComponentSpecifiedBtns);\n      removeDuplicate(brushTypes);\n      if (isNew && !brushTypes.length) {\n        brushTypes.push.apply(brushTypes, DEFAULT_TOOLBOX_BTNS);\n      }\n    }\n    function removeDuplicate(arr) {\n      var map = {};\n      each(arr, function (val) {\n        map[val] = 1;\n      });\n      arr.length = 0;\n      each(map, function (flag, val) {\n        arr.push(val);\n      });\n    }\n\n    var each$b = each;\n    function hasKeys(obj) {\n      if (obj) {\n        for (var name_1 in obj) {\n          if (obj.hasOwnProperty(name_1)) {\n            return true;\n          }\n        }\n      }\n    }\n    function createVisualMappings(option, stateList, supplementVisualOption) {\n      var visualMappings = {};\n      each$b(stateList, function (state) {\n        var mappings = visualMappings[state] = createMappings();\n        each$b(option[state], function (visualData, visualType) {\n          if (!VisualMapping.isValidType(visualType)) {\n            return;\n          }\n          var mappingOption = {\n            type: visualType,\n            visual: visualData\n          };\n          supplementVisualOption && supplementVisualOption(mappingOption, state);\n          mappings[visualType] = new VisualMapping(mappingOption);\n          // Prepare a alpha for opacity, for some case that opacity\n          // is not supported, such as rendering using gradient color.\n          if (visualType === 'opacity') {\n            mappingOption = clone(mappingOption);\n            mappingOption.type = 'colorAlpha';\n            mappings.__hidden.__alphaForOpacity = new VisualMapping(mappingOption);\n          }\n        });\n      });\n      return visualMappings;\n      function createMappings() {\n        var Creater = function () {};\n        // Make sure hidden fields will not be visited by\n        // object iteration (with hasOwnProperty checking).\n        Creater.prototype.__hidden = Creater.prototype;\n        var obj = new Creater();\n        return obj;\n      }\n    }\n    function replaceVisualOption(thisOption, newOption, keys) {\n      // Visual attributes merge is not supported, otherwise it\n      // brings overcomplicated merge logic. See #2853. So if\n      // newOption has anyone of these keys, all of these keys\n      // will be reset. Otherwise, all keys remain.\n      var has;\n      each(keys, function (key) {\n        if (newOption.hasOwnProperty(key) && hasKeys(newOption[key])) {\n          has = true;\n        }\n      });\n      has && each(keys, function (key) {\n        if (newOption.hasOwnProperty(key) && hasKeys(newOption[key])) {\n          thisOption[key] = clone(newOption[key]);\n        } else {\n          delete thisOption[key];\n        }\n      });\n    }\n    /**\r\n     * @param stateList\r\n     * @param visualMappings\r\n     * @param list\r\n     * @param getValueState param: valueOrIndex, return: state.\r\n     * @param scope Scope for getValueState\r\n     * @param dimension Concrete dimension, if used.\r\n     */\n    // ???! handle brush?\n    function applyVisual(stateList, visualMappings, data, getValueState, scope, dimension) {\n      var visualTypesMap = {};\n      each(stateList, function (state) {\n        var visualTypes = VisualMapping.prepareVisualTypes(visualMappings[state]);\n        visualTypesMap[state] = visualTypes;\n      });\n      var dataIndex;\n      function getVisual(key) {\n        return getItemVisualFromData(data, dataIndex, key);\n      }\n      function setVisual(key, value) {\n        setItemVisualFromData(data, dataIndex, key, value);\n      }\n      if (dimension == null) {\n        data.each(eachItem);\n      } else {\n        data.each([dimension], eachItem);\n      }\n      function eachItem(valueOrIndex, index) {\n        dataIndex = dimension == null ? valueOrIndex // First argument is index\n        : index;\n        var rawDataItem = data.getRawDataItem(dataIndex);\n        // Consider performance\n        // @ts-ignore\n        if (rawDataItem && rawDataItem.visualMap === false) {\n          return;\n        }\n        var valueState = getValueState.call(scope, valueOrIndex);\n        var mappings = visualMappings[valueState];\n        var visualTypes = visualTypesMap[valueState];\n        for (var i = 0, len = visualTypes.length; i < len; i++) {\n          var type = visualTypes[i];\n          mappings[type] && mappings[type].applyVisual(valueOrIndex, getVisual, setVisual);\n        }\n      }\n    }\n    /**\r\n     * @param data\r\n     * @param stateList\r\n     * @param visualMappings <state, Object.<visualType, module:echarts/visual/VisualMapping>>\r\n     * @param getValueState param: valueOrIndex, return: state.\r\n     * @param dim dimension or dimension index.\r\n     */\n    function incrementalApplyVisual(stateList, visualMappings, getValueState, dim) {\n      var visualTypesMap = {};\n      each(stateList, function (state) {\n        var visualTypes = VisualMapping.prepareVisualTypes(visualMappings[state]);\n        visualTypesMap[state] = visualTypes;\n      });\n      return {\n        progress: function progress(params, data) {\n          var dimIndex;\n          if (dim != null) {\n            dimIndex = data.getDimensionIndex(dim);\n          }\n          function getVisual(key) {\n            return getItemVisualFromData(data, dataIndex, key);\n          }\n          function setVisual(key, value) {\n            setItemVisualFromData(data, dataIndex, key, value);\n          }\n          var dataIndex;\n          var store = data.getStore();\n          while ((dataIndex = params.next()) != null) {\n            var rawDataItem = data.getRawDataItem(dataIndex);\n            // Consider performance\n            // @ts-ignore\n            if (rawDataItem && rawDataItem.visualMap === false) {\n              continue;\n            }\n            var value = dim != null ? store.get(dimIndex, dataIndex) : dataIndex;\n            var valueState = getValueState(value);\n            var mappings = visualMappings[valueState];\n            var visualTypes = visualTypesMap[valueState];\n            for (var i = 0, len = visualTypes.length; i < len; i++) {\n              var type = visualTypes[i];\n              mappings[type] && mappings[type].applyVisual(value, getVisual, setVisual);\n            }\n          }\n        }\n      };\n    }\n\n    function makeBrushCommonSelectorForSeries(area) {\n      var brushType = area.brushType;\n      // Do not use function binding or curry for performance.\n      var selectors = {\n        point: function (itemLayout) {\n          return selector[brushType].point(itemLayout, selectors, area);\n        },\n        rect: function (itemLayout) {\n          return selector[brushType].rect(itemLayout, selectors, area);\n        }\n      };\n      return selectors;\n    }\n    var selector = {\n      lineX: getLineSelectors(0),\n      lineY: getLineSelectors(1),\n      rect: {\n        point: function (itemLayout, selectors, area) {\n          return itemLayout && area.boundingRect.contain(itemLayout[0], itemLayout[1]);\n        },\n        rect: function (itemLayout, selectors, area) {\n          return itemLayout && area.boundingRect.intersect(itemLayout);\n        }\n      },\n      polygon: {\n        point: function (itemLayout, selectors, area) {\n          return itemLayout && area.boundingRect.contain(itemLayout[0], itemLayout[1]) && contain$2(area.range, itemLayout[0], itemLayout[1]);\n        },\n        rect: function (itemLayout, selectors, area) {\n          var points = area.range;\n          if (!itemLayout || points.length <= 1) {\n            return false;\n          }\n          var x = itemLayout.x;\n          var y = itemLayout.y;\n          var width = itemLayout.width;\n          var height = itemLayout.height;\n          var p = points[0];\n          if (contain$2(points, x, y) || contain$2(points, x + width, y) || contain$2(points, x, y + height) || contain$2(points, x + width, y + height) || BoundingRect.create(itemLayout).contain(p[0], p[1]) || linePolygonIntersect(x, y, x + width, y, points) || linePolygonIntersect(x, y, x, y + height, points) || linePolygonIntersect(x + width, y, x + width, y + height, points) || linePolygonIntersect(x, y + height, x + width, y + height, points)) {\n            return true;\n          }\n        }\n      }\n    };\n    function getLineSelectors(xyIndex) {\n      var xy = ['x', 'y'];\n      var wh = ['width', 'height'];\n      return {\n        point: function (itemLayout, selectors, area) {\n          if (itemLayout) {\n            var range = area.range;\n            var p = itemLayout[xyIndex];\n            return inLineRange(p, range);\n          }\n        },\n        rect: function (itemLayout, selectors, area) {\n          if (itemLayout) {\n            var range = area.range;\n            var layoutRange = [itemLayout[xy[xyIndex]], itemLayout[xy[xyIndex]] + itemLayout[wh[xyIndex]]];\n            layoutRange[1] < layoutRange[0] && layoutRange.reverse();\n            return inLineRange(layoutRange[0], range) || inLineRange(layoutRange[1], range) || inLineRange(range[0], layoutRange) || inLineRange(range[1], layoutRange);\n          }\n        }\n      };\n    }\n    function inLineRange(p, range) {\n      return range[0] <= p && p <= range[1];\n    }\n\n    var STATE_LIST = ['inBrush', 'outOfBrush'];\n    var DISPATCH_METHOD = '__ecBrushSelect';\n    var DISPATCH_FLAG = '__ecInBrushSelectEvent';\n    function layoutCovers(ecModel) {\n      ecModel.eachComponent({\n        mainType: 'brush'\n      }, function (brushModel) {\n        var brushTargetManager = brushModel.brushTargetManager = new BrushTargetManager(brushModel.option, ecModel);\n        brushTargetManager.setInputRanges(brushModel.areas, ecModel);\n      });\n    }\n    /**\r\n     * Register the visual encoding if this modules required.\r\n     */\n    function brushVisual(ecModel, api, payload) {\n      var brushSelected = [];\n      var throttleType;\n      var throttleDelay;\n      ecModel.eachComponent({\n        mainType: 'brush'\n      }, function (brushModel) {\n        payload && payload.type === 'takeGlobalCursor' && brushModel.setBrushOption(payload.key === 'brush' ? payload.brushOption : {\n          brushType: false\n        });\n      });\n      layoutCovers(ecModel);\n      ecModel.eachComponent({\n        mainType: 'brush'\n      }, function (brushModel, brushIndex) {\n        var thisBrushSelected = {\n          brushId: brushModel.id,\n          brushIndex: brushIndex,\n          brushName: brushModel.name,\n          areas: clone(brushModel.areas),\n          selected: []\n        };\n        // Every brush component exists in event params, convenient\n        // for user to find by index.\n        brushSelected.push(thisBrushSelected);\n        var brushOption = brushModel.option;\n        var brushLink = brushOption.brushLink;\n        var linkedSeriesMap = [];\n        var selectedDataIndexForLink = [];\n        var rangeInfoBySeries = [];\n        var hasBrushExists = false;\n        if (!brushIndex) {\n          // Only the first throttle setting works.\n          throttleType = brushOption.throttleType;\n          throttleDelay = brushOption.throttleDelay;\n        }\n        // Add boundingRect and selectors to range.\n        var areas = map(brushModel.areas, function (area) {\n          var builder = boundingRectBuilders[area.brushType];\n          var selectableArea = defaults({\n            boundingRect: builder ? builder(area) : void 0\n          }, area);\n          selectableArea.selectors = makeBrushCommonSelectorForSeries(selectableArea);\n          return selectableArea;\n        });\n        var visualMappings = createVisualMappings(brushModel.option, STATE_LIST, function (mappingOption) {\n          mappingOption.mappingMethod = 'fixed';\n        });\n        isArray(brushLink) && each(brushLink, function (seriesIndex) {\n          linkedSeriesMap[seriesIndex] = 1;\n        });\n        function linkOthers(seriesIndex) {\n          return brushLink === 'all' || !!linkedSeriesMap[seriesIndex];\n        }\n        // If no supported brush or no brush on the series,\n        // all visuals should be in original state.\n        function brushed(rangeInfoList) {\n          return !!rangeInfoList.length;\n        }\n        /**\r\n         * Logic for each series: (If the logic has to be modified one day, do it carefully!)\r\n         *\r\n         * ( brushed ┬ && ┬hasBrushExist ┬ && linkOthers  ) => StepA: ┬record, ┬ StepB: ┬visualByRecord.\r\n         *   !brushed┘    ├hasBrushExist ┤                            └nothing,┘        ├visualByRecord.\r\n         *                └!hasBrushExist┘                                              └nothing.\r\n         * ( !brushed  && ┬hasBrushExist ┬ && linkOthers  ) => StepA:  nothing,  StepB: ┬visualByRecord.\r\n         *                └!hasBrushExist┘                                              └nothing.\r\n         * ( brushed ┬ &&                     !linkOthers ) => StepA:  nothing,  StepB: ┬visualByCheck.\r\n         *   !brushed┘                                                                  └nothing.\r\n         * ( !brushed  &&                     !linkOthers ) => StepA:  nothing,  StepB:  nothing.\r\n         */\n        // Step A\n        ecModel.eachSeries(function (seriesModel, seriesIndex) {\n          var rangeInfoList = rangeInfoBySeries[seriesIndex] = [];\n          seriesModel.subType === 'parallel' ? stepAParallel(seriesModel, seriesIndex) : stepAOthers(seriesModel, seriesIndex, rangeInfoList);\n        });\n        function stepAParallel(seriesModel, seriesIndex) {\n          var coordSys = seriesModel.coordinateSystem;\n          hasBrushExists = hasBrushExists || coordSys.hasAxisBrushed();\n          linkOthers(seriesIndex) && coordSys.eachActiveState(seriesModel.getData(), function (activeState, dataIndex) {\n            activeState === 'active' && (selectedDataIndexForLink[dataIndex] = 1);\n          });\n        }\n        function stepAOthers(seriesModel, seriesIndex, rangeInfoList) {\n          if (!seriesModel.brushSelector || brushModelNotControll(brushModel, seriesIndex)) {\n            return;\n          }\n          each(areas, function (area) {\n            if (brushModel.brushTargetManager.controlSeries(area, seriesModel, ecModel)) {\n              rangeInfoList.push(area);\n            }\n            hasBrushExists = hasBrushExists || brushed(rangeInfoList);\n          });\n          if (linkOthers(seriesIndex) && brushed(rangeInfoList)) {\n            var data_1 = seriesModel.getData();\n            data_1.each(function (dataIndex) {\n              if (checkInRange(seriesModel, rangeInfoList, data_1, dataIndex)) {\n                selectedDataIndexForLink[dataIndex] = 1;\n              }\n            });\n          }\n        }\n        // Step B\n        ecModel.eachSeries(function (seriesModel, seriesIndex) {\n          var seriesBrushSelected = {\n            seriesId: seriesModel.id,\n            seriesIndex: seriesIndex,\n            seriesName: seriesModel.name,\n            dataIndex: []\n          };\n          // Every series exists in event params, convenient\n          // for user to find series by seriesIndex.\n          thisBrushSelected.selected.push(seriesBrushSelected);\n          var rangeInfoList = rangeInfoBySeries[seriesIndex];\n          var data = seriesModel.getData();\n          var getValueState = linkOthers(seriesIndex) ? function (dataIndex) {\n            return selectedDataIndexForLink[dataIndex] ? (seriesBrushSelected.dataIndex.push(data.getRawIndex(dataIndex)), 'inBrush') : 'outOfBrush';\n          } : function (dataIndex) {\n            return checkInRange(seriesModel, rangeInfoList, data, dataIndex) ? (seriesBrushSelected.dataIndex.push(data.getRawIndex(dataIndex)), 'inBrush') : 'outOfBrush';\n          };\n          // If no supported brush or no brush, all visuals are in original state.\n          (linkOthers(seriesIndex) ? hasBrushExists : brushed(rangeInfoList)) && applyVisual(STATE_LIST, visualMappings, data, getValueState);\n        });\n      });\n      dispatchAction(api, throttleType, throttleDelay, brushSelected, payload);\n    }\n    function dispatchAction(api, throttleType, throttleDelay, brushSelected, payload) {\n      // This event will not be triggered when `setOpion`, otherwise dead lock may\n      // triggered when do `setOption` in event listener, which we do not find\n      // satisfactory way to solve yet. Some considered resolutions:\n      // (a) Diff with prevoius selected data ant only trigger event when changed.\n      // But store previous data and diff precisely (i.e., not only by dataIndex, but\n      // also detect value changes in selected data) might bring complexity or fragility.\n      // (b) Use spectial param like `silent` to suppress event triggering.\n      // But such kind of volatile param may be weird in `setOption`.\n      if (!payload) {\n        return;\n      }\n      var zr = api.getZr();\n      if (zr[DISPATCH_FLAG]) {\n        return;\n      }\n      if (!zr[DISPATCH_METHOD]) {\n        zr[DISPATCH_METHOD] = doDispatch;\n      }\n      var fn = createOrUpdate(zr, DISPATCH_METHOD, throttleDelay, throttleType);\n      fn(api, brushSelected);\n    }\n    function doDispatch(api, brushSelected) {\n      if (!api.isDisposed()) {\n        var zr = api.getZr();\n        zr[DISPATCH_FLAG] = true;\n        api.dispatchAction({\n          type: 'brushSelect',\n          batch: brushSelected\n        });\n        zr[DISPATCH_FLAG] = false;\n      }\n    }\n    function checkInRange(seriesModel, rangeInfoList, data, dataIndex) {\n      for (var i = 0, len = rangeInfoList.length; i < len; i++) {\n        var area = rangeInfoList[i];\n        if (seriesModel.brushSelector(dataIndex, data, area.selectors, area)) {\n          return true;\n        }\n      }\n    }\n    function brushModelNotControll(brushModel, seriesIndex) {\n      var seriesIndices = brushModel.option.seriesIndex;\n      return seriesIndices != null && seriesIndices !== 'all' && (isArray(seriesIndices) ? indexOf(seriesIndices, seriesIndex) < 0 : seriesIndex !== seriesIndices);\n    }\n    var boundingRectBuilders = {\n      rect: function (area) {\n        return getBoundingRectFromMinMax(area.range);\n      },\n      polygon: function (area) {\n        var minMax;\n        var range = area.range;\n        for (var i = 0, len = range.length; i < len; i++) {\n          minMax = minMax || [[Infinity, -Infinity], [Infinity, -Infinity]];\n          var rg = range[i];\n          rg[0] < minMax[0][0] && (minMax[0][0] = rg[0]);\n          rg[0] > minMax[0][1] && (minMax[0][1] = rg[0]);\n          rg[1] < minMax[1][0] && (minMax[1][0] = rg[1]);\n          rg[1] > minMax[1][1] && (minMax[1][1] = rg[1]);\n        }\n        return minMax && getBoundingRectFromMinMax(minMax);\n      }\n    };\n    function getBoundingRectFromMinMax(minMax) {\n      return new BoundingRect(minMax[0][0], minMax[1][0], minMax[0][1] - minMax[0][0], minMax[1][1] - minMax[1][0]);\n    }\n\n    var BrushView = /** @class */function (_super) {\n      __extends(BrushView, _super);\n      function BrushView() {\n        var _this = _super !== null && _super.apply(this, arguments) || this;\n        _this.type = BrushView.type;\n        return _this;\n      }\n      BrushView.prototype.init = function (ecModel, api) {\n        this.ecModel = ecModel;\n        this.api = api;\n        this.model;\n        (this._brushController = new BrushController(api.getZr())).on('brush', bind(this._onBrush, this)).mount();\n      };\n      BrushView.prototype.render = function (brushModel, ecModel, api, payload) {\n        this.model = brushModel;\n        this._updateController(brushModel, ecModel, api, payload);\n      };\n      BrushView.prototype.updateTransform = function (brushModel, ecModel, api, payload) {\n        // PENDING: `updateTransform` is a little tricky, whose layout need\n        // to be calculate mandatorily and other stages will not be performed.\n        // Take care the correctness of the logic. See #11754 .\n        layoutCovers(ecModel);\n        this._updateController(brushModel, ecModel, api, payload);\n      };\n      BrushView.prototype.updateVisual = function (brushModel, ecModel, api, payload) {\n        this.updateTransform(brushModel, ecModel, api, payload);\n      };\n      BrushView.prototype.updateView = function (brushModel, ecModel, api, payload) {\n        this._updateController(brushModel, ecModel, api, payload);\n      };\n      BrushView.prototype._updateController = function (brushModel, ecModel, api, payload) {\n        // Do not update controller when drawing.\n        (!payload || payload.$from !== brushModel.id) && this._brushController.setPanels(brushModel.brushTargetManager.makePanelOpts(api)).enableBrush(brushModel.brushOption).updateCovers(brushModel.areas.slice());\n      };\n      // updateLayout: updateController,\n      // updateVisual: updateController,\n      BrushView.prototype.dispose = function () {\n        this._brushController.dispose();\n      };\n      BrushView.prototype._onBrush = function (eventParam) {\n        var modelId = this.model.id;\n        var areas = this.model.brushTargetManager.setOutputRanges(eventParam.areas, this.ecModel);\n        // Action is not dispatched on drag end, because the drag end\n        // emits the same params with the last drag move event, and\n        // may have some delay when using touch pad, which makes\n        // animation not smooth (when using debounce).\n        (!eventParam.isEnd || eventParam.removeOnClick) && this.api.dispatchAction({\n          type: 'brush',\n          brushId: modelId,\n          areas: clone(areas),\n          $from: modelId\n        });\n        eventParam.isEnd && this.api.dispatchAction({\n          type: 'brushEnd',\n          brushId: modelId,\n          areas: clone(areas),\n          $from: modelId\n        });\n      };\n      BrushView.type = 'brush';\n      return BrushView;\n    }(ComponentView);\n\n    var DEFAULT_OUT_OF_BRUSH_COLOR = '#ddd';\n    var BrushModel = /** @class */function (_super) {\n      __extends(BrushModel, _super);\n      function BrushModel() {\n        var _this = _super !== null && _super.apply(this, arguments) || this;\n        _this.type = BrushModel.type;\n        /**\r\n         * @readOnly\r\n         */\n        _this.areas = [];\n        /**\r\n         * Current brush painting area settings.\r\n         * @readOnly\r\n         */\n        _this.brushOption = {};\n        return _this;\n      }\n      BrushModel.prototype.optionUpdated = function (newOption, isInit) {\n        var thisOption = this.option;\n        !isInit && replaceVisualOption(thisOption, newOption, ['inBrush', 'outOfBrush']);\n        var inBrush = thisOption.inBrush = thisOption.inBrush || {};\n        // Always give default visual, consider setOption at the second time.\n        thisOption.outOfBrush = thisOption.outOfBrush || {\n          color: DEFAULT_OUT_OF_BRUSH_COLOR\n        };\n        if (!inBrush.hasOwnProperty('liftZ')) {\n          // Bigger than the highlight z lift, otherwise it will\n          // be effected by the highlight z when brush.\n          inBrush.liftZ = 5;\n        }\n      };\n      /**\r\n       * If `areas` is null/undefined, range state remain.\r\n       */\n      BrushModel.prototype.setAreas = function (areas) {\n        if (\"development\" !== 'production') {\n          assert(isArray(areas));\n          each(areas, function (area) {\n            assert(area.brushType, 'Illegal areas');\n          });\n        }\n        // If areas is null/undefined, range state remain.\n        // This helps user to dispatchAction({type: 'brush'}) with no areas\n        // set but just want to get the current brush select info from a `brush` event.\n        if (!areas) {\n          return;\n        }\n        this.areas = map(areas, function (area) {\n          return generateBrushOption(this.option, area);\n        }, this);\n      };\n      /**\r\n       * Set the current painting brush option.\r\n       */\n      BrushModel.prototype.setBrushOption = function (brushOption) {\n        this.brushOption = generateBrushOption(this.option, brushOption);\n        this.brushType = this.brushOption.brushType;\n      };\n      BrushModel.type = 'brush';\n      BrushModel.dependencies = ['geo', 'grid', 'xAxis', 'yAxis', 'parallel', 'series'];\n      BrushModel.defaultOption = {\n        seriesIndex: 'all',\n        brushType: 'rect',\n        brushMode: 'single',\n        transformable: true,\n        brushStyle: {\n          borderWidth: 1,\n          color: 'rgba(210,219,238,0.3)',\n          borderColor: '#D2DBEE'\n        },\n        throttleType: 'fixRate',\n        throttleDelay: 0,\n        removeOnClick: true,\n        z: 10000\n      };\n      return BrushModel;\n    }(ComponentModel);\n    function generateBrushOption(option, brushOption) {\n      return merge({\n        brushType: option.brushType,\n        brushMode: option.brushMode,\n        transformable: option.transformable,\n        brushStyle: new Model(option.brushStyle).getItemStyle(),\n        removeOnClick: option.removeOnClick,\n        z: option.z\n      }, brushOption, true);\n    }\n\n    var ICON_TYPES = ['rect', 'polygon', 'lineX', 'lineY', 'keep', 'clear'];\n    var BrushFeature = /** @class */function (_super) {\n      __extends(BrushFeature, _super);\n      function BrushFeature() {\n        return _super !== null && _super.apply(this, arguments) || this;\n      }\n      BrushFeature.prototype.render = function (featureModel, ecModel, api) {\n        var brushType;\n        var brushMode;\n        var isBrushed;\n        ecModel.eachComponent({\n          mainType: 'brush'\n        }, function (brushModel) {\n          brushType = brushModel.brushType;\n          brushMode = brushModel.brushOption.brushMode || 'single';\n          isBrushed = isBrushed || !!brushModel.areas.length;\n        });\n        this._brushType = brushType;\n        this._brushMode = brushMode;\n        each(featureModel.get('type', true), function (type) {\n          featureModel.setIconStatus(type, (type === 'keep' ? brushMode === 'multiple' : type === 'clear' ? isBrushed : type === brushType) ? 'emphasis' : 'normal');\n        });\n      };\n      BrushFeature.prototype.updateView = function (featureModel, ecModel, api) {\n        this.render(featureModel, ecModel, api);\n      };\n      BrushFeature.prototype.getIcons = function () {\n        var model = this.model;\n        var availableIcons = model.get('icon', true);\n        var icons = {};\n        each(model.get('type', true), function (type) {\n          if (availableIcons[type]) {\n            icons[type] = availableIcons[type];\n          }\n        });\n        return icons;\n      };\n      BrushFeature.prototype.onclick = function (ecModel, api, type) {\n        var brushType = this._brushType;\n        var brushMode = this._brushMode;\n        if (type === 'clear') {\n          // Trigger parallel action firstly\n          api.dispatchAction({\n            type: 'axisAreaSelect',\n            intervals: []\n          });\n          api.dispatchAction({\n            type: 'brush',\n            command: 'clear',\n            // Clear all areas of all brush components.\n            areas: []\n          });\n        } else {\n          api.dispatchAction({\n            type: 'takeGlobalCursor',\n            key: 'brush',\n            brushOption: {\n              brushType: type === 'keep' ? brushType : brushType === type ? false : type,\n              brushMode: type === 'keep' ? brushMode === 'multiple' ? 'single' : 'multiple' : brushMode\n            }\n          });\n        }\n      };\n      BrushFeature.getDefaultOption = function (ecModel) {\n        var defaultOption = {\n          show: true,\n          type: ICON_TYPES.slice(),\n          icon: {\n            /* eslint-disable */\n            rect: 'M7.3,34.7 M0.4,10V-0.2h9.8 M89.6,10V-0.2h-9.8 M0.4,60v10.2h9.8 M89.6,60v10.2h-9.8 M12.3,22.4V10.5h13.1 M33.6,10.5h7.8 M49.1,10.5h7.8 M77.5,22.4V10.5h-13 M12.3,31.1v8.2 M77.7,31.1v8.2 M12.3,47.6v11.9h13.1 M33.6,59.5h7.6 M49.1,59.5 h7.7 M77.5,47.6v11.9h-13',\n            polygon: 'M55.2,34.9c1.7,0,3.1,1.4,3.1,3.1s-1.4,3.1-3.1,3.1 s-3.1-1.4-3.1-3.1S53.5,34.9,55.2,34.9z M50.4,51c1.7,0,3.1,1.4,3.1,3.1c0,1.7-1.4,3.1-3.1,3.1c-1.7,0-3.1-1.4-3.1-3.1 C47.3,52.4,48.7,51,50.4,51z M55.6,37.1l1.5-7.8 M60.1,13.5l1.6-8.7l-7.8,4 M59,19l-1,5.3 M24,16.1l6.4,4.9l6.4-3.3 M48.5,11.6 l-5.9,3.1 M19.1,12.8L9.7,5.1l1.1,7.7 M13.4,29.8l1,7.3l6.6,1.6 M11.6,18.4l1,6.1 M32.8,41.9 M26.6,40.4 M27.3,40.2l6.1,1.6 M49.9,52.1l-5.6-7.6l-4.9-1.2',\n            lineX: 'M15.2,30 M19.7,15.6V1.9H29 M34.8,1.9H40.4 M55.3,15.6V1.9H45.9 M19.7,44.4V58.1H29 M34.8,58.1H40.4 M55.3,44.4 V58.1H45.9 M12.5,20.3l-9.4,9.6l9.6,9.8 M3.1,29.9h16.5 M62.5,20.3l9.4,9.6L62.3,39.7 M71.9,29.9H55.4',\n            lineY: 'M38.8,7.7 M52.7,12h13.2v9 M65.9,26.6V32 M52.7,46.3h13.2v-9 M24.9,12H11.8v9 M11.8,26.6V32 M24.9,46.3H11.8v-9 M48.2,5.1l-9.3-9l-9.4,9.2 M38.9-3.9V12 M48.2,53.3l-9.3,9l-9.4-9.2 M38.9,62.3V46.4',\n            keep: 'M4,10.5V1h10.3 M20.7,1h6.1 M33,1h6.1 M55.4,10.5V1H45.2 M4,17.3v6.6 M55.6,17.3v6.6 M4,30.5V40h10.3 M20.7,40 h6.1 M33,40h6.1 M55.4,30.5V40H45.2 M21,18.9h62.9v48.6H21V18.9z',\n            clear: 'M22,14.7l30.9,31 M52.9,14.7L22,45.7 M4.7,16.8V4.2h13.1 M26,4.2h7.8 M41.6,4.2h7.8 M70.3,16.8V4.2H57.2 M4.7,25.9v8.6 M70.3,25.9v8.6 M4.7,43.2v12.6h13.1 M26,55.8h7.8 M41.6,55.8h7.8 M70.3,43.2v12.6H57.2' // jshint ignore:line\n            /* eslint-enable */\n          },\n          // `rect`, `polygon`, `lineX`, `lineY`, `keep`, `clear`\n          title: ecModel.getLocaleModel().get(['toolbox', 'brush', 'title'])\n        };\n        return defaultOption;\n      };\n      return BrushFeature;\n    }(ToolboxFeature);\n\n    function install$B(registers) {\n      registers.registerComponentView(BrushView);\n      registers.registerComponentModel(BrushModel);\n      registers.registerPreprocessor(brushPreprocessor);\n      registers.registerVisual(registers.PRIORITY.VISUAL.BRUSH, brushVisual);\n      registers.registerAction({\n        type: 'brush',\n        event: 'brush',\n        update: 'updateVisual'\n      }, function (payload, ecModel) {\n        ecModel.eachComponent({\n          mainType: 'brush',\n          query: payload\n        }, function (brushModel) {\n          brushModel.setAreas(payload.areas);\n        });\n      });\n      /**\r\n       * payload: {\r\n       *      brushComponents: [\r\n       *          {\r\n       *              brushId,\r\n       *              brushIndex,\r\n       *              brushName,\r\n       *              series: [\r\n       *                  {\r\n       *                      seriesId,\r\n       *                      seriesIndex,\r\n       *                      seriesName,\r\n       *                      rawIndices: [21, 34, ...]\r\n       *                  },\r\n       *                  ...\r\n       *              ]\r\n       *          },\r\n       *          ...\r\n       *      ]\r\n       * }\r\n       */\n      registers.registerAction({\n        type: 'brushSelect',\n        event: 'brushSelected',\n        update: 'none'\n      }, noop);\n      registers.registerAction({\n        type: 'brushEnd',\n        event: 'brushEnd',\n        update: 'none'\n      }, noop);\n      registerFeature('brush', BrushFeature);\n    }\n\n    var TitleModel = /** @class */function (_super) {\n      __extends(TitleModel, _super);\n      function TitleModel() {\n        var _this = _super !== null && _super.apply(this, arguments) || this;\n        _this.type = TitleModel.type;\n        _this.layoutMode = {\n          type: 'box',\n          ignoreSize: true\n        };\n        return _this;\n      }\n      TitleModel.type = 'title';\n      TitleModel.defaultOption = {\n        // zlevel: 0,\n        z: 6,\n        show: true,\n        text: '',\n        target: 'blank',\n        subtext: '',\n        subtarget: 'blank',\n        left: 0,\n        top: 0,\n        backgroundColor: 'rgba(0,0,0,0)',\n        borderColor: '#ccc',\n        borderWidth: 0,\n        padding: 5,\n        itemGap: 10,\n        textStyle: {\n          fontSize: 18,\n          fontWeight: 'bold',\n          color: '#464646'\n        },\n        subtextStyle: {\n          fontSize: 12,\n          color: '#6E7079'\n        }\n      };\n      return TitleModel;\n    }(ComponentModel);\n    // View\n    var TitleView = /** @class */function (_super) {\n      __extends(TitleView, _super);\n      function TitleView() {\n        var _this = _super !== null && _super.apply(this, arguments) || this;\n        _this.type = TitleView.type;\n        return _this;\n      }\n      TitleView.prototype.render = function (titleModel, ecModel, api) {\n        this.group.removeAll();\n        if (!titleModel.get('show')) {\n          return;\n        }\n        var group = this.group;\n        var textStyleModel = titleModel.getModel('textStyle');\n        var subtextStyleModel = titleModel.getModel('subtextStyle');\n        var textAlign = titleModel.get('textAlign');\n        var textVerticalAlign = retrieve2(titleModel.get('textBaseline'), titleModel.get('textVerticalAlign'));\n        var textEl = new ZRText({\n          style: createTextStyle(textStyleModel, {\n            text: titleModel.get('text'),\n            fill: textStyleModel.getTextColor()\n          }, {\n            disableBox: true\n          }),\n          z2: 10\n        });\n        var textRect = textEl.getBoundingRect();\n        var subText = titleModel.get('subtext');\n        var subTextEl = new ZRText({\n          style: createTextStyle(subtextStyleModel, {\n            text: subText,\n            fill: subtextStyleModel.getTextColor(),\n            y: textRect.height + titleModel.get('itemGap'),\n            verticalAlign: 'top'\n          }, {\n            disableBox: true\n          }),\n          z2: 10\n        });\n        var link = titleModel.get('link');\n        var sublink = titleModel.get('sublink');\n        var triggerEvent = titleModel.get('triggerEvent', true);\n        textEl.silent = !link && !triggerEvent;\n        subTextEl.silent = !sublink && !triggerEvent;\n        if (link) {\n          textEl.on('click', function () {\n            windowOpen(link, '_' + titleModel.get('target'));\n          });\n        }\n        if (sublink) {\n          subTextEl.on('click', function () {\n            windowOpen(sublink, '_' + titleModel.get('subtarget'));\n          });\n        }\n        getECData(textEl).eventData = getECData(subTextEl).eventData = triggerEvent ? {\n          componentType: 'title',\n          componentIndex: titleModel.componentIndex\n        } : null;\n        group.add(textEl);\n        subText && group.add(subTextEl);\n        // If no subText, but add subTextEl, there will be an empty line.\n        var groupRect = group.getBoundingRect();\n        var layoutOption = titleModel.getBoxLayoutParams();\n        layoutOption.width = groupRect.width;\n        layoutOption.height = groupRect.height;\n        var layoutRect = getLayoutRect(layoutOption, {\n          width: api.getWidth(),\n          height: api.getHeight()\n        }, titleModel.get('padding'));\n        // Adjust text align based on position\n        if (!textAlign) {\n          // Align left if title is on the left. center and right is same\n          textAlign = titleModel.get('left') || titleModel.get('right');\n          // @ts-ignore\n          if (textAlign === 'middle') {\n            textAlign = 'center';\n          }\n          // Adjust layout by text align\n          if (textAlign === 'right') {\n            layoutRect.x += layoutRect.width;\n          } else if (textAlign === 'center') {\n            layoutRect.x += layoutRect.width / 2;\n          }\n        }\n        if (!textVerticalAlign) {\n          textVerticalAlign = titleModel.get('top') || titleModel.get('bottom');\n          // @ts-ignore\n          if (textVerticalAlign === 'center') {\n            textVerticalAlign = 'middle';\n          }\n          if (textVerticalAlign === 'bottom') {\n            layoutRect.y += layoutRect.height;\n          } else if (textVerticalAlign === 'middle') {\n            layoutRect.y += layoutRect.height / 2;\n          }\n          textVerticalAlign = textVerticalAlign || 'top';\n        }\n        group.x = layoutRect.x;\n        group.y = layoutRect.y;\n        group.markRedraw();\n        var alignStyle = {\n          align: textAlign,\n          verticalAlign: textVerticalAlign\n        };\n        textEl.setStyle(alignStyle);\n        subTextEl.setStyle(alignStyle);\n        // Render background\n        // Get groupRect again because textAlign has been changed\n        groupRect = group.getBoundingRect();\n        var padding = layoutRect.margin;\n        var style = titleModel.getItemStyle(['color', 'opacity']);\n        style.fill = titleModel.get('backgroundColor');\n        var rect = new Rect({\n          shape: {\n            x: groupRect.x - padding[3],\n            y: groupRect.y - padding[0],\n            width: groupRect.width + padding[1] + padding[3],\n            height: groupRect.height + padding[0] + padding[2],\n            r: titleModel.get('borderRadius')\n          },\n          style: style,\n          subPixelOptimize: true,\n          silent: true\n        });\n        group.add(rect);\n      };\n      TitleView.type = 'title';\n      return TitleView;\n    }(ComponentView);\n    function install$C(registers) {\n      registers.registerComponentModel(TitleModel);\n      registers.registerComponentView(TitleView);\n    }\n\n    var TimelineModel = /** @class */function (_super) {\n      __extends(TimelineModel, _super);\n      function TimelineModel() {\n        var _this = _super !== null && _super.apply(this, arguments) || this;\n        _this.type = TimelineModel.type;\n        _this.layoutMode = 'box';\n        return _this;\n      }\n      /**\r\n       * @override\r\n       */\n      TimelineModel.prototype.init = function (option, parentModel, ecModel) {\n        this.mergeDefaultAndTheme(option, ecModel);\n        this._initData();\n      };\n      /**\r\n       * @override\r\n       */\n      TimelineModel.prototype.mergeOption = function (option) {\n        _super.prototype.mergeOption.apply(this, arguments);\n        this._initData();\n      };\n      TimelineModel.prototype.setCurrentIndex = function (currentIndex) {\n        if (currentIndex == null) {\n          currentIndex = this.option.currentIndex;\n        }\n        var count = this._data.count();\n        if (this.option.loop) {\n          currentIndex = (currentIndex % count + count) % count;\n        } else {\n          currentIndex >= count && (currentIndex = count - 1);\n          currentIndex < 0 && (currentIndex = 0);\n        }\n        this.option.currentIndex = currentIndex;\n      };\n      /**\r\n       * @return {number} currentIndex\r\n       */\n      TimelineModel.prototype.getCurrentIndex = function () {\n        return this.option.currentIndex;\n      };\n      /**\r\n       * @return {boolean}\r\n       */\n      TimelineModel.prototype.isIndexMax = function () {\n        return this.getCurrentIndex() >= this._data.count() - 1;\n      };\n      /**\r\n       * @param {boolean} state true: play, false: stop\r\n       */\n      TimelineModel.prototype.setPlayState = function (state) {\n        this.option.autoPlay = !!state;\n      };\n      /**\r\n       * @return {boolean} true: play, false: stop\r\n       */\n      TimelineModel.prototype.getPlayState = function () {\n        return !!this.option.autoPlay;\n      };\n      /**\r\n       * @private\r\n       */\n      TimelineModel.prototype._initData = function () {\n        var thisOption = this.option;\n        var dataArr = thisOption.data || [];\n        var axisType = thisOption.axisType;\n        var names = this._names = [];\n        var processedDataArr;\n        if (axisType === 'category') {\n          processedDataArr = [];\n          each(dataArr, function (item, index) {\n            var value = convertOptionIdName(getDataItemValue(item), '');\n            var newItem;\n            if (isObject(item)) {\n              newItem = clone(item);\n              newItem.value = index;\n            } else {\n              newItem = index;\n            }\n            processedDataArr.push(newItem);\n            names.push(value);\n          });\n        } else {\n          processedDataArr = dataArr;\n        }\n        var dimType = {\n          category: 'ordinal',\n          time: 'time',\n          value: 'number'\n        }[axisType] || 'number';\n        var data = this._data = new SeriesData([{\n          name: 'value',\n          type: dimType\n        }], this);\n        data.initData(processedDataArr, names);\n      };\n      TimelineModel.prototype.getData = function () {\n        return this._data;\n      };\n      /**\r\n       * @public\r\n       * @return {Array.<string>} categoreis\r\n       */\n      TimelineModel.prototype.getCategories = function () {\n        if (this.get('axisType') === 'category') {\n          return this._names.slice();\n        }\n      };\n      TimelineModel.type = 'timeline';\n      /**\r\n       * @protected\r\n       */\n      TimelineModel.defaultOption = {\n        // zlevel: 0,                  // 一级层叠\n        z: 4,\n        show: true,\n        axisType: 'time',\n        realtime: true,\n        left: '20%',\n        top: null,\n        right: '20%',\n        bottom: 0,\n        width: null,\n        height: 40,\n        padding: 5,\n        controlPosition: 'left',\n        autoPlay: false,\n        rewind: false,\n        loop: true,\n        playInterval: 2000,\n        currentIndex: 0,\n        itemStyle: {},\n        label: {\n          color: '#000'\n        },\n        data: []\n      };\n      return TimelineModel;\n    }(ComponentModel);\n\n    var SliderTimelineModel = /** @class */function (_super) {\n      __extends(SliderTimelineModel, _super);\n      function SliderTimelineModel() {\n        var _this = _super !== null && _super.apply(this, arguments) || this;\n        _this.type = SliderTimelineModel.type;\n        return _this;\n      }\n      SliderTimelineModel.type = 'timeline.slider';\n      /**\r\n       * @protected\r\n       */\n      SliderTimelineModel.defaultOption = inheritDefaultOption(TimelineModel.defaultOption, {\n        backgroundColor: 'rgba(0,0,0,0)',\n        borderColor: '#ccc',\n        borderWidth: 0,\n        orient: 'horizontal',\n        inverse: false,\n        tooltip: {\n          trigger: 'item' // data item may also have tootip attr.\n        },\n        symbol: 'circle',\n        symbolSize: 12,\n        lineStyle: {\n          show: true,\n          width: 2,\n          color: '#DAE1F5'\n        },\n        label: {\n          position: 'auto',\n          // When using number, label position is not\n          // restricted by viewRect.\n          // positive: right/bottom, negative: left/top\n          show: true,\n          interval: 'auto',\n          rotate: 0,\n          // formatter: null,\n          // 其余属性默认使用全局文本样式，详见TEXTSTYLE\n          color: '#A4B1D7'\n        },\n        itemStyle: {\n          color: '#A4B1D7',\n          borderWidth: 1\n        },\n        checkpointStyle: {\n          symbol: 'circle',\n          symbolSize: 15,\n          color: '#316bf3',\n          borderColor: '#fff',\n          borderWidth: 2,\n          shadowBlur: 2,\n          shadowOffsetX: 1,\n          shadowOffsetY: 1,\n          shadowColor: 'rgba(0, 0, 0, 0.3)',\n          // borderColor: 'rgba(194,53,49, 0.5)',\n          animation: true,\n          animationDuration: 300,\n          animationEasing: 'quinticInOut'\n        },\n        controlStyle: {\n          show: true,\n          showPlayBtn: true,\n          showPrevBtn: true,\n          showNextBtn: true,\n          itemSize: 24,\n          itemGap: 12,\n          position: 'left',\n          playIcon: 'path://M31.6,53C17.5,53,6,41.5,6,27.4S17.5,1.8,31.6,1.8C45.7,1.8,57.2,13.3,57.2,27.4S45.7,53,31.6,53z M31.6,3.3 C18.4,3.3,7.5,14.1,7.5,27.4c0,13.3,10.8,24.1,24.1,24.1C44.9,51.5,55.7,40.7,55.7,27.4C55.7,14.1,44.9,3.3,31.6,3.3z M24.9,21.3 c0-2.2,1.6-3.1,3.5-2l10.5,6.1c1.899,1.1,1.899,2.9,0,4l-10.5,6.1c-1.9,1.1-3.5,0.2-3.5-2V21.3z',\n          stopIcon: 'path://M30.9,53.2C16.8,53.2,5.3,41.7,5.3,27.6S16.8,2,30.9,2C45,2,56.4,13.5,56.4,27.6S45,53.2,30.9,53.2z M30.9,3.5C17.6,3.5,6.8,14.4,6.8,27.6c0,13.3,10.8,24.1,24.101,24.1C44.2,51.7,55,40.9,55,27.6C54.9,14.4,44.1,3.5,30.9,3.5z M36.9,35.8c0,0.601-0.4,1-0.9,1h-1.3c-0.5,0-0.9-0.399-0.9-1V19.5c0-0.6,0.4-1,0.9-1H36c0.5,0,0.9,0.4,0.9,1V35.8z M27.8,35.8 c0,0.601-0.4,1-0.9,1h-1.3c-0.5,0-0.9-0.399-0.9-1V19.5c0-0.6,0.4-1,0.9-1H27c0.5,0,0.9,0.4,0.9,1L27.8,35.8L27.8,35.8z',\n          // eslint-disable-next-line max-len\n          nextIcon: 'M2,18.5A1.52,1.52,0,0,1,.92,18a1.49,1.49,0,0,1,0-2.12L7.81,9.36,1,3.11A1.5,1.5,0,1,1,3,.89l8,7.34a1.48,1.48,0,0,1,.49,1.09,1.51,1.51,0,0,1-.46,1.1L3,18.08A1.5,1.5,0,0,1,2,18.5Z',\n          // eslint-disable-next-line max-len\n          prevIcon: 'M10,.5A1.52,1.52,0,0,1,11.08,1a1.49,1.49,0,0,1,0,2.12L4.19,9.64,11,15.89a1.5,1.5,0,1,1-2,2.22L1,10.77A1.48,1.48,0,0,1,.5,9.68,1.51,1.51,0,0,1,1,8.58L9,.92A1.5,1.5,0,0,1,10,.5Z',\n          prevBtnSize: 18,\n          nextBtnSize: 18,\n          color: '#A4B1D7',\n          borderColor: '#A4B1D7',\n          borderWidth: 1\n        },\n        emphasis: {\n          label: {\n            show: true,\n            // 其余属性默认使用全局文本样式，详见TEXTSTYLE\n            color: '#6f778d'\n          },\n          itemStyle: {\n            color: '#316BF3'\n          },\n          controlStyle: {\n            color: '#316BF3',\n            borderColor: '#316BF3',\n            borderWidth: 2\n          }\n        },\n        progress: {\n          lineStyle: {\n            color: '#316BF3'\n          },\n          itemStyle: {\n            color: '#316BF3'\n          },\n          label: {\n            color: '#6f778d'\n          }\n        },\n        data: []\n      });\n      return SliderTimelineModel;\n    }(TimelineModel);\n    mixin(SliderTimelineModel, DataFormatMixin.prototype);\n\n    var TimelineView = /** @class */function (_super) {\n      __extends(TimelineView, _super);\n      function TimelineView() {\n        var _this = _super !== null && _super.apply(this, arguments) || this;\n        _this.type = TimelineView.type;\n        return _this;\n      }\n      TimelineView.type = 'timeline';\n      return TimelineView;\n    }(ComponentView);\n\n    /**\r\n     * Extend axis 2d\r\n     */\n    var TimelineAxis = /** @class */function (_super) {\n      __extends(TimelineAxis, _super);\n      function TimelineAxis(dim, scale, coordExtent, axisType) {\n        var _this = _super.call(this, dim, scale, coordExtent) || this;\n        _this.type = axisType || 'value';\n        return _this;\n      }\n      /**\r\n       * @override\r\n       */\n      TimelineAxis.prototype.getLabelModel = function () {\n        // Force override\n        return this.model.getModel('label');\n      };\n      /**\r\n       * @override\r\n       */\n      TimelineAxis.prototype.isHorizontal = function () {\n        return this.model.get('orient') === 'horizontal';\n      };\n      return TimelineAxis;\n    }(Axis);\n\n    var PI$8 = Math.PI;\n    var labelDataIndexStore = makeInner();\n    var SliderTimelineView = /** @class */function (_super) {\n      __extends(SliderTimelineView, _super);\n      function SliderTimelineView() {\n        var _this = _super !== null && _super.apply(this, arguments) || this;\n        _this.type = SliderTimelineView.type;\n        return _this;\n      }\n      SliderTimelineView.prototype.init = function (ecModel, api) {\n        this.api = api;\n      };\n      /**\r\n       * @override\r\n       */\n      SliderTimelineView.prototype.render = function (timelineModel, ecModel, api) {\n        this.model = timelineModel;\n        this.api = api;\n        this.ecModel = ecModel;\n        this.group.removeAll();\n        if (timelineModel.get('show', true)) {\n          var layoutInfo_1 = this._layout(timelineModel, api);\n          var mainGroup_1 = this._createGroup('_mainGroup');\n          var labelGroup = this._createGroup('_labelGroup');\n          var axis_1 = this._axis = this._createAxis(layoutInfo_1, timelineModel);\n          timelineModel.formatTooltip = function (dataIndex) {\n            var name = axis_1.scale.getLabel({\n              value: dataIndex\n            });\n            return createTooltipMarkup('nameValue', {\n              noName: true,\n              value: name\n            });\n          };\n          each(['AxisLine', 'AxisTick', 'Control', 'CurrentPointer'], function (name) {\n            this['_render' + name](layoutInfo_1, mainGroup_1, axis_1, timelineModel);\n          }, this);\n          this._renderAxisLabel(layoutInfo_1, labelGroup, axis_1, timelineModel);\n          this._position(layoutInfo_1, timelineModel);\n        }\n        this._doPlayStop();\n        this._updateTicksStatus();\n      };\n      /**\r\n       * @override\r\n       */\n      SliderTimelineView.prototype.remove = function () {\n        this._clearTimer();\n        this.group.removeAll();\n      };\n      /**\r\n       * @override\r\n       */\n      SliderTimelineView.prototype.dispose = function () {\n        this._clearTimer();\n      };\n      SliderTimelineView.prototype._layout = function (timelineModel, api) {\n        var labelPosOpt = timelineModel.get(['label', 'position']);\n        var orient = timelineModel.get('orient');\n        var viewRect = getViewRect$5(timelineModel, api);\n        var parsedLabelPos;\n        // Auto label offset.\n        if (labelPosOpt == null || labelPosOpt === 'auto') {\n          parsedLabelPos = orient === 'horizontal' ? viewRect.y + viewRect.height / 2 < api.getHeight() / 2 ? '-' : '+' : viewRect.x + viewRect.width / 2 < api.getWidth() / 2 ? '+' : '-';\n        } else if (isString(labelPosOpt)) {\n          parsedLabelPos = {\n            horizontal: {\n              top: '-',\n              bottom: '+'\n            },\n            vertical: {\n              left: '-',\n              right: '+'\n            }\n          }[orient][labelPosOpt];\n        } else {\n          // is number\n          parsedLabelPos = labelPosOpt;\n        }\n        var labelAlignMap = {\n          horizontal: 'center',\n          vertical: parsedLabelPos >= 0 || parsedLabelPos === '+' ? 'left' : 'right'\n        };\n        var labelBaselineMap = {\n          horizontal: parsedLabelPos >= 0 || parsedLabelPos === '+' ? 'top' : 'bottom',\n          vertical: 'middle'\n        };\n        var rotationMap = {\n          horizontal: 0,\n          vertical: PI$8 / 2\n        };\n        // Position\n        var mainLength = orient === 'vertical' ? viewRect.height : viewRect.width;\n        var controlModel = timelineModel.getModel('controlStyle');\n        var showControl = controlModel.get('show', true);\n        var controlSize = showControl ? controlModel.get('itemSize') : 0;\n        var controlGap = showControl ? controlModel.get('itemGap') : 0;\n        var sizePlusGap = controlSize + controlGap;\n        // Special label rotate.\n        var labelRotation = timelineModel.get(['label', 'rotate']) || 0;\n        labelRotation = labelRotation * PI$8 / 180; // To radian.\n        var playPosition;\n        var prevBtnPosition;\n        var nextBtnPosition;\n        var controlPosition = controlModel.get('position', true);\n        var showPlayBtn = showControl && controlModel.get('showPlayBtn', true);\n        var showPrevBtn = showControl && controlModel.get('showPrevBtn', true);\n        var showNextBtn = showControl && controlModel.get('showNextBtn', true);\n        var xLeft = 0;\n        var xRight = mainLength;\n        // position[0] means left, position[1] means middle.\n        if (controlPosition === 'left' || controlPosition === 'bottom') {\n          showPlayBtn && (playPosition = [0, 0], xLeft += sizePlusGap);\n          showPrevBtn && (prevBtnPosition = [xLeft, 0], xLeft += sizePlusGap);\n          showNextBtn && (nextBtnPosition = [xRight - controlSize, 0], xRight -= sizePlusGap);\n        } else {\n          // 'top' 'right'\n          showPlayBtn && (playPosition = [xRight - controlSize, 0], xRight -= sizePlusGap);\n          showPrevBtn && (prevBtnPosition = [0, 0], xLeft += sizePlusGap);\n          showNextBtn && (nextBtnPosition = [xRight - controlSize, 0], xRight -= sizePlusGap);\n        }\n        var axisExtent = [xLeft, xRight];\n        if (timelineModel.get('inverse')) {\n          axisExtent.reverse();\n        }\n        return {\n          viewRect: viewRect,\n          mainLength: mainLength,\n          orient: orient,\n          rotation: rotationMap[orient],\n          labelRotation: labelRotation,\n          labelPosOpt: parsedLabelPos,\n          labelAlign: timelineModel.get(['label', 'align']) || labelAlignMap[orient],\n          labelBaseline: timelineModel.get(['label', 'verticalAlign']) || timelineModel.get(['label', 'baseline']) || labelBaselineMap[orient],\n          // Based on mainGroup.\n          playPosition: playPosition,\n          prevBtnPosition: prevBtnPosition,\n          nextBtnPosition: nextBtnPosition,\n          axisExtent: axisExtent,\n          controlSize: controlSize,\n          controlGap: controlGap\n        };\n      };\n      SliderTimelineView.prototype._position = function (layoutInfo, timelineModel) {\n        // Position is be called finally, because bounding rect is needed for\n        // adapt content to fill viewRect (auto adapt offset).\n        // Timeline may be not all in the viewRect when 'offset' is specified\n        // as a number, because it is more appropriate that label aligns at\n        // 'offset' but not the other edge defined by viewRect.\n        var mainGroup = this._mainGroup;\n        var labelGroup = this._labelGroup;\n        var viewRect = layoutInfo.viewRect;\n        if (layoutInfo.orient === 'vertical') {\n          // transform to horizontal, inverse rotate by left-top point.\n          var m = create$1();\n          var rotateOriginX = viewRect.x;\n          var rotateOriginY = viewRect.y + viewRect.height;\n          translate(m, m, [-rotateOriginX, -rotateOriginY]);\n          rotate(m, m, -PI$8 / 2);\n          translate(m, m, [rotateOriginX, rotateOriginY]);\n          viewRect = viewRect.clone();\n          viewRect.applyTransform(m);\n        }\n        var viewBound = getBound(viewRect);\n        var mainBound = getBound(mainGroup.getBoundingRect());\n        var labelBound = getBound(labelGroup.getBoundingRect());\n        var mainPosition = [mainGroup.x, mainGroup.y];\n        var labelsPosition = [labelGroup.x, labelGroup.y];\n        labelsPosition[0] = mainPosition[0] = viewBound[0][0];\n        var labelPosOpt = layoutInfo.labelPosOpt;\n        if (labelPosOpt == null || isString(labelPosOpt)) {\n          // '+' or '-'\n          var mainBoundIdx = labelPosOpt === '+' ? 0 : 1;\n          toBound(mainPosition, mainBound, viewBound, 1, mainBoundIdx);\n          toBound(labelsPosition, labelBound, viewBound, 1, 1 - mainBoundIdx);\n        } else {\n          var mainBoundIdx = labelPosOpt >= 0 ? 0 : 1;\n          toBound(mainPosition, mainBound, viewBound, 1, mainBoundIdx);\n          labelsPosition[1] = mainPosition[1] + labelPosOpt;\n        }\n        mainGroup.setPosition(mainPosition);\n        labelGroup.setPosition(labelsPosition);\n        mainGroup.rotation = labelGroup.rotation = layoutInfo.rotation;\n        setOrigin(mainGroup);\n        setOrigin(labelGroup);\n        function setOrigin(targetGroup) {\n          targetGroup.originX = viewBound[0][0] - targetGroup.x;\n          targetGroup.originY = viewBound[1][0] - targetGroup.y;\n        }\n        function getBound(rect) {\n          // [[xmin, xmax], [ymin, ymax]]\n          return [[rect.x, rect.x + rect.width], [rect.y, rect.y + rect.height]];\n        }\n        function toBound(fromPos, from, to, dimIdx, boundIdx) {\n          fromPos[dimIdx] += to[dimIdx][boundIdx] - from[dimIdx][boundIdx];\n        }\n      };\n      SliderTimelineView.prototype._createAxis = function (layoutInfo, timelineModel) {\n        var data = timelineModel.getData();\n        var axisType = timelineModel.get('axisType');\n        var scale = createScaleByModel$1(timelineModel, axisType);\n        // Customize scale. The `tickValue` is `dataIndex`.\n        scale.getTicks = function () {\n          return data.mapArray(['value'], function (value) {\n            return {\n              value: value\n            };\n          });\n        };\n        var dataExtent = data.getDataExtent('value');\n        scale.setExtent(dataExtent[0], dataExtent[1]);\n        scale.calcNiceTicks();\n        var axis = new TimelineAxis('value', scale, layoutInfo.axisExtent, axisType);\n        axis.model = timelineModel;\n        return axis;\n      };\n      SliderTimelineView.prototype._createGroup = function (key) {\n        var newGroup = this[key] = new Group();\n        this.group.add(newGroup);\n        return newGroup;\n      };\n      SliderTimelineView.prototype._renderAxisLine = function (layoutInfo, group, axis, timelineModel) {\n        var axisExtent = axis.getExtent();\n        if (!timelineModel.get(['lineStyle', 'show'])) {\n          return;\n        }\n        var line = new Line({\n          shape: {\n            x1: axisExtent[0],\n            y1: 0,\n            x2: axisExtent[1],\n            y2: 0\n          },\n          style: extend({\n            lineCap: 'round'\n          }, timelineModel.getModel('lineStyle').getLineStyle()),\n          silent: true,\n          z2: 1\n        });\n        group.add(line);\n        var progressLine = this._progressLine = new Line({\n          shape: {\n            x1: axisExtent[0],\n            x2: this._currentPointer ? this._currentPointer.x : axisExtent[0],\n            y1: 0,\n            y2: 0\n          },\n          style: defaults({\n            lineCap: 'round',\n            lineWidth: line.style.lineWidth\n          }, timelineModel.getModel(['progress', 'lineStyle']).getLineStyle()),\n          silent: true,\n          z2: 1\n        });\n        group.add(progressLine);\n      };\n      SliderTimelineView.prototype._renderAxisTick = function (layoutInfo, group, axis, timelineModel) {\n        var _this = this;\n        var data = timelineModel.getData();\n        // Show all ticks, despite ignoring strategy.\n        var ticks = axis.scale.getTicks();\n        this._tickSymbols = [];\n        // The value is dataIndex, see the customized scale.\n        each(ticks, function (tick) {\n          var tickCoord = axis.dataToCoord(tick.value);\n          var itemModel = data.getItemModel(tick.value);\n          var itemStyleModel = itemModel.getModel('itemStyle');\n          var hoverStyleModel = itemModel.getModel(['emphasis', 'itemStyle']);\n          var progressStyleModel = itemModel.getModel(['progress', 'itemStyle']);\n          var symbolOpt = {\n            x: tickCoord,\n            y: 0,\n            onclick: bind(_this._changeTimeline, _this, tick.value)\n          };\n          var el = giveSymbol(itemModel, itemStyleModel, group, symbolOpt);\n          el.ensureState('emphasis').style = hoverStyleModel.getItemStyle();\n          el.ensureState('progress').style = progressStyleModel.getItemStyle();\n          enableHoverEmphasis(el);\n          var ecData = getECData(el);\n          if (itemModel.get('tooltip')) {\n            ecData.dataIndex = tick.value;\n            ecData.dataModel = timelineModel;\n          } else {\n            ecData.dataIndex = ecData.dataModel = null;\n          }\n          _this._tickSymbols.push(el);\n        });\n      };\n      SliderTimelineView.prototype._renderAxisLabel = function (layoutInfo, group, axis, timelineModel) {\n        var _this = this;\n        var labelModel = axis.getLabelModel();\n        if (!labelModel.get('show')) {\n          return;\n        }\n        var data = timelineModel.getData();\n        var labels = axis.getViewLabels();\n        this._tickLabels = [];\n        each(labels, function (labelItem) {\n          // The tickValue is dataIndex, see the customized scale.\n          var dataIndex = labelItem.tickValue;\n          var itemModel = data.getItemModel(dataIndex);\n          var normalLabelModel = itemModel.getModel('label');\n          var hoverLabelModel = itemModel.getModel(['emphasis', 'label']);\n          var progressLabelModel = itemModel.getModel(['progress', 'label']);\n          var tickCoord = axis.dataToCoord(labelItem.tickValue);\n          var textEl = new ZRText({\n            x: tickCoord,\n            y: 0,\n            rotation: layoutInfo.labelRotation - layoutInfo.rotation,\n            onclick: bind(_this._changeTimeline, _this, dataIndex),\n            silent: false,\n            style: createTextStyle(normalLabelModel, {\n              text: labelItem.formattedLabel,\n              align: layoutInfo.labelAlign,\n              verticalAlign: layoutInfo.labelBaseline\n            })\n          });\n          textEl.ensureState('emphasis').style = createTextStyle(hoverLabelModel);\n          textEl.ensureState('progress').style = createTextStyle(progressLabelModel);\n          group.add(textEl);\n          enableHoverEmphasis(textEl);\n          labelDataIndexStore(textEl).dataIndex = dataIndex;\n          _this._tickLabels.push(textEl);\n        });\n      };\n      SliderTimelineView.prototype._renderControl = function (layoutInfo, group, axis, timelineModel) {\n        var controlSize = layoutInfo.controlSize;\n        var rotation = layoutInfo.rotation;\n        var itemStyle = timelineModel.getModel('controlStyle').getItemStyle();\n        var hoverStyle = timelineModel.getModel(['emphasis', 'controlStyle']).getItemStyle();\n        var playState = timelineModel.getPlayState();\n        var inverse = timelineModel.get('inverse', true);\n        makeBtn(layoutInfo.nextBtnPosition, 'next', bind(this._changeTimeline, this, inverse ? '-' : '+'));\n        makeBtn(layoutInfo.prevBtnPosition, 'prev', bind(this._changeTimeline, this, inverse ? '+' : '-'));\n        makeBtn(layoutInfo.playPosition, playState ? 'stop' : 'play', bind(this._handlePlayClick, this, !playState), true);\n        function makeBtn(position, iconName, onclick, willRotate) {\n          if (!position) {\n            return;\n          }\n          var iconSize = parsePercent(retrieve2(timelineModel.get(['controlStyle', iconName + 'BtnSize']), controlSize), controlSize);\n          var rect = [0, -iconSize / 2, iconSize, iconSize];\n          var btn = makeControlIcon(timelineModel, iconName + 'Icon', rect, {\n            x: position[0],\n            y: position[1],\n            originX: controlSize / 2,\n            originY: 0,\n            rotation: willRotate ? -rotation : 0,\n            rectHover: true,\n            style: itemStyle,\n            onclick: onclick\n          });\n          btn.ensureState('emphasis').style = hoverStyle;\n          group.add(btn);\n          enableHoverEmphasis(btn);\n        }\n      };\n      SliderTimelineView.prototype._renderCurrentPointer = function (layoutInfo, group, axis, timelineModel) {\n        var data = timelineModel.getData();\n        var currentIndex = timelineModel.getCurrentIndex();\n        var pointerModel = data.getItemModel(currentIndex).getModel('checkpointStyle');\n        var me = this;\n        var callback = {\n          onCreate: function (pointer) {\n            pointer.draggable = true;\n            pointer.drift = bind(me._handlePointerDrag, me);\n            pointer.ondragend = bind(me._handlePointerDragend, me);\n            pointerMoveTo(pointer, me._progressLine, currentIndex, axis, timelineModel, true);\n          },\n          onUpdate: function (pointer) {\n            pointerMoveTo(pointer, me._progressLine, currentIndex, axis, timelineModel);\n          }\n        };\n        // Reuse when exists, for animation and drag.\n        this._currentPointer = giveSymbol(pointerModel, pointerModel, this._mainGroup, {}, this._currentPointer, callback);\n      };\n      SliderTimelineView.prototype._handlePlayClick = function (nextState) {\n        this._clearTimer();\n        this.api.dispatchAction({\n          type: 'timelinePlayChange',\n          playState: nextState,\n          from: this.uid\n        });\n      };\n      SliderTimelineView.prototype._handlePointerDrag = function (dx, dy, e) {\n        this._clearTimer();\n        this._pointerChangeTimeline([e.offsetX, e.offsetY]);\n      };\n      SliderTimelineView.prototype._handlePointerDragend = function (e) {\n        this._pointerChangeTimeline([e.offsetX, e.offsetY], true);\n      };\n      SliderTimelineView.prototype._pointerChangeTimeline = function (mousePos, trigger) {\n        var toCoord = this._toAxisCoord(mousePos)[0];\n        var axis = this._axis;\n        var axisExtent = asc(axis.getExtent().slice());\n        toCoord > axisExtent[1] && (toCoord = axisExtent[1]);\n        toCoord < axisExtent[0] && (toCoord = axisExtent[0]);\n        this._currentPointer.x = toCoord;\n        this._currentPointer.markRedraw();\n        var progressLine = this._progressLine;\n        if (progressLine) {\n          progressLine.shape.x2 = toCoord;\n          progressLine.dirty();\n        }\n        var targetDataIndex = this._findNearestTick(toCoord);\n        var timelineModel = this.model;\n        if (trigger || targetDataIndex !== timelineModel.getCurrentIndex() && timelineModel.get('realtime')) {\n          this._changeTimeline(targetDataIndex);\n        }\n      };\n      SliderTimelineView.prototype._doPlayStop = function () {\n        var _this = this;\n        this._clearTimer();\n        if (this.model.getPlayState()) {\n          this._timer = setTimeout(function () {\n            // Do not cache\n            var timelineModel = _this.model;\n            _this._changeTimeline(timelineModel.getCurrentIndex() + (timelineModel.get('rewind', true) ? -1 : 1));\n          }, this.model.get('playInterval'));\n        }\n      };\n      SliderTimelineView.prototype._toAxisCoord = function (vertex) {\n        var trans = this._mainGroup.getLocalTransform();\n        return applyTransform$1(vertex, trans, true);\n      };\n      SliderTimelineView.prototype._findNearestTick = function (axisCoord) {\n        var data = this.model.getData();\n        var dist = Infinity;\n        var targetDataIndex;\n        var axis = this._axis;\n        data.each(['value'], function (value, dataIndex) {\n          var coord = axis.dataToCoord(value);\n          var d = Math.abs(coord - axisCoord);\n          if (d < dist) {\n            dist = d;\n            targetDataIndex = dataIndex;\n          }\n        });\n        return targetDataIndex;\n      };\n      SliderTimelineView.prototype._clearTimer = function () {\n        if (this._timer) {\n          clearTimeout(this._timer);\n          this._timer = null;\n        }\n      };\n      SliderTimelineView.prototype._changeTimeline = function (nextIndex) {\n        var currentIndex = this.model.getCurrentIndex();\n        if (nextIndex === '+') {\n          nextIndex = currentIndex + 1;\n        } else if (nextIndex === '-') {\n          nextIndex = currentIndex - 1;\n        }\n        this.api.dispatchAction({\n          type: 'timelineChange',\n          currentIndex: nextIndex,\n          from: this.uid\n        });\n      };\n      SliderTimelineView.prototype._updateTicksStatus = function () {\n        var currentIndex = this.model.getCurrentIndex();\n        var tickSymbols = this._tickSymbols;\n        var tickLabels = this._tickLabels;\n        if (tickSymbols) {\n          for (var i = 0; i < tickSymbols.length; i++) {\n            tickSymbols && tickSymbols[i] && tickSymbols[i].toggleState('progress', i < currentIndex);\n          }\n        }\n        if (tickLabels) {\n          for (var i = 0; i < tickLabels.length; i++) {\n            tickLabels && tickLabels[i] && tickLabels[i].toggleState('progress', labelDataIndexStore(tickLabels[i]).dataIndex <= currentIndex);\n          }\n        }\n      };\n      SliderTimelineView.type = 'timeline.slider';\n      return SliderTimelineView;\n    }(TimelineView);\n    function createScaleByModel$1(model, axisType) {\n      axisType = axisType || model.get('type');\n      if (axisType) {\n        switch (axisType) {\n          // Buildin scale\n          case 'category':\n            return new OrdinalScale({\n              ordinalMeta: model.getCategories(),\n              extent: [Infinity, -Infinity]\n            });\n          case 'time':\n            return new TimeScale({\n              locale: model.ecModel.getLocaleModel(),\n              useUTC: model.ecModel.get('useUTC')\n            });\n          default:\n            // default to be value\n            return new IntervalScale();\n        }\n      }\n    }\n    function getViewRect$5(model, api) {\n      return getLayoutRect(model.getBoxLayoutParams(), {\n        width: api.getWidth(),\n        height: api.getHeight()\n      }, model.get('padding'));\n    }\n    function makeControlIcon(timelineModel, objPath, rect, opts) {\n      var style = opts.style;\n      var icon = createIcon(timelineModel.get(['controlStyle', objPath]), opts || {}, new BoundingRect(rect[0], rect[1], rect[2], rect[3]));\n      // TODO createIcon won't use style in opt.\n      if (style) {\n        icon.setStyle(style);\n      }\n      return icon;\n    }\n    /**\r\n     * Create symbol or update symbol\r\n     * opt: basic position and event handlers\r\n     */\n    function giveSymbol(hostModel, itemStyleModel, group, opt, symbol, callback) {\n      var color = itemStyleModel.get('color');\n      if (!symbol) {\n        var symbolType = hostModel.get('symbol');\n        symbol = createSymbol(symbolType, -1, -1, 2, 2, color);\n        symbol.setStyle('strokeNoScale', true);\n        group.add(symbol);\n        callback && callback.onCreate(symbol);\n      } else {\n        symbol.setColor(color);\n        group.add(symbol); // Group may be new, also need to add.\n        callback && callback.onUpdate(symbol);\n      }\n      // Style\n      var itemStyle = itemStyleModel.getItemStyle(['color']);\n      symbol.setStyle(itemStyle);\n      // Transform and events.\n      opt = merge({\n        rectHover: true,\n        z2: 100\n      }, opt, true);\n      var symbolSize = normalizeSymbolSize(hostModel.get('symbolSize'));\n      opt.scaleX = symbolSize[0] / 2;\n      opt.scaleY = symbolSize[1] / 2;\n      var symbolOffset = normalizeSymbolOffset(hostModel.get('symbolOffset'), symbolSize);\n      if (symbolOffset) {\n        opt.x = (opt.x || 0) + symbolOffset[0];\n        opt.y = (opt.y || 0) + symbolOffset[1];\n      }\n      var symbolRotate = hostModel.get('symbolRotate');\n      opt.rotation = (symbolRotate || 0) * Math.PI / 180 || 0;\n      symbol.attr(opt);\n      // FIXME\n      // (1) When symbol.style.strokeNoScale is true and updateTransform is not performed,\n      // getBoundingRect will return wrong result.\n      // (This is supposed to be resolved in zrender, but it is a little difficult to\n      // leverage performance and auto updateTransform)\n      // (2) All of ancesters of symbol do not scale, so we can just updateTransform symbol.\n      symbol.updateTransform();\n      return symbol;\n    }\n    function pointerMoveTo(pointer, progressLine, dataIndex, axis, timelineModel, noAnimation) {\n      if (pointer.dragging) {\n        return;\n      }\n      var pointerModel = timelineModel.getModel('checkpointStyle');\n      var toCoord = axis.dataToCoord(timelineModel.getData().get('value', dataIndex));\n      if (noAnimation || !pointerModel.get('animation', true)) {\n        pointer.attr({\n          x: toCoord,\n          y: 0\n        });\n        progressLine && progressLine.attr({\n          shape: {\n            x2: toCoord\n          }\n        });\n      } else {\n        var animationCfg = {\n          duration: pointerModel.get('animationDuration', true),\n          easing: pointerModel.get('animationEasing', true)\n        };\n        pointer.stopAnimation(null, true);\n        pointer.animateTo({\n          x: toCoord,\n          y: 0\n        }, animationCfg);\n        progressLine && progressLine.animateTo({\n          shape: {\n            x2: toCoord\n          }\n        }, animationCfg);\n      }\n    }\n\n    function installTimelineAction(registers) {\n      registers.registerAction({\n        type: 'timelineChange',\n        event: 'timelineChanged',\n        update: 'prepareAndUpdate'\n      }, function (payload, ecModel, api) {\n        var timelineModel = ecModel.getComponent('timeline');\n        if (timelineModel && payload.currentIndex != null) {\n          timelineModel.setCurrentIndex(payload.currentIndex);\n          if (!timelineModel.get('loop', true) && timelineModel.isIndexMax() && timelineModel.getPlayState()) {\n            timelineModel.setPlayState(false);\n            // The timeline has played to the end, trigger event\n            api.dispatchAction({\n              type: 'timelinePlayChange',\n              playState: false,\n              from: payload.from\n            });\n          }\n        }\n        // Set normalized currentIndex to payload.\n        ecModel.resetOption('timeline', {\n          replaceMerge: timelineModel.get('replaceMerge', true)\n        });\n        return defaults({\n          currentIndex: timelineModel.option.currentIndex\n        }, payload);\n      });\n      registers.registerAction({\n        type: 'timelinePlayChange',\n        event: 'timelinePlayChanged',\n        update: 'update'\n      }, function (payload, ecModel) {\n        var timelineModel = ecModel.getComponent('timeline');\n        if (timelineModel && payload.playState != null) {\n          timelineModel.setPlayState(payload.playState);\n        }\n      });\n    }\n\n    function timelinePreprocessor(option) {\n      var timelineOpt = option && option.timeline;\n      if (!isArray(timelineOpt)) {\n        timelineOpt = timelineOpt ? [timelineOpt] : [];\n      }\n      each(timelineOpt, function (opt) {\n        if (!opt) {\n          return;\n        }\n        compatibleEC2(opt);\n      });\n    }\n    function compatibleEC2(opt) {\n      var type = opt.type;\n      var ec2Types = {\n        'number': 'value',\n        'time': 'time'\n      };\n      // Compatible with ec2\n      if (ec2Types[type]) {\n        opt.axisType = ec2Types[type];\n        delete opt.type;\n      }\n      transferItem(opt);\n      if (has(opt, 'controlPosition')) {\n        var controlStyle = opt.controlStyle || (opt.controlStyle = {});\n        if (!has(controlStyle, 'position')) {\n          controlStyle.position = opt.controlPosition;\n        }\n        if (controlStyle.position === 'none' && !has(controlStyle, 'show')) {\n          controlStyle.show = false;\n          delete controlStyle.position;\n        }\n        delete opt.controlPosition;\n      }\n      each(opt.data || [], function (dataItem) {\n        if (isObject(dataItem) && !isArray(dataItem)) {\n          if (!has(dataItem, 'value') && has(dataItem, 'name')) {\n            // In ec2, using name as value.\n            dataItem.value = dataItem.name;\n          }\n          transferItem(dataItem);\n        }\n      });\n    }\n    function transferItem(opt) {\n      var itemStyle = opt.itemStyle || (opt.itemStyle = {});\n      var itemStyleEmphasis = itemStyle.emphasis || (itemStyle.emphasis = {});\n      // Transfer label out\n      var label = opt.label || opt.label || {};\n      var labelNormal = label.normal || (label.normal = {});\n      var excludeLabelAttr = {\n        normal: 1,\n        emphasis: 1\n      };\n      each(label, function (value, name) {\n        if (!excludeLabelAttr[name] && !has(labelNormal, name)) {\n          labelNormal[name] = value;\n        }\n      });\n      if (itemStyleEmphasis.label && !has(label, 'emphasis')) {\n        label.emphasis = itemStyleEmphasis.label;\n        delete itemStyleEmphasis.label;\n      }\n    }\n    function has(obj, attr) {\n      return obj.hasOwnProperty(attr);\n    }\n\n    function install$D(registers) {\n      registers.registerComponentModel(SliderTimelineModel);\n      registers.registerComponentView(SliderTimelineView);\n      registers.registerSubTypeDefaulter('timeline', function () {\n        // Only slider now.\n        return 'slider';\n      });\n      installTimelineAction(registers);\n      registers.registerPreprocessor(timelinePreprocessor);\n    }\n\n    function checkMarkerInSeries(seriesOpts, markerType) {\n      if (!seriesOpts) {\n        return false;\n      }\n      var seriesOptArr = isArray(seriesOpts) ? seriesOpts : [seriesOpts];\n      for (var idx = 0; idx < seriesOptArr.length; idx++) {\n        if (seriesOptArr[idx] && seriesOptArr[idx][markerType]) {\n          return true;\n        }\n      }\n      return false;\n    }\n\n    function fillLabel(opt) {\n      defaultEmphasis(opt, 'label', ['show']);\n    }\n    // { [componentType]: MarkerModel }\n    var inner$g = makeInner();\n    var MarkerModel = /** @class */function (_super) {\n      __extends(MarkerModel, _super);\n      function MarkerModel() {\n        var _this = _super !== null && _super.apply(this, arguments) || this;\n        _this.type = MarkerModel.type;\n        /**\r\n         * If marker model is created by self from series\r\n         */\n        _this.createdBySelf = false;\n        return _this;\n      }\n      /**\r\n       * @overrite\r\n       */\n      MarkerModel.prototype.init = function (option, parentModel, ecModel) {\n        if (\"development\" !== 'production') {\n          if (this.type === 'marker') {\n            throw new Error('Marker component is abstract component. Use markLine, markPoint, markArea instead.');\n          }\n        }\n        this.mergeDefaultAndTheme(option, ecModel);\n        this._mergeOption(option, ecModel, false, true);\n      };\n      MarkerModel.prototype.isAnimationEnabled = function () {\n        if (env.node) {\n          return false;\n        }\n        var hostSeries = this.__hostSeries;\n        return this.getShallow('animation') && hostSeries && hostSeries.isAnimationEnabled();\n      };\n      /**\r\n       * @overrite\r\n       */\n      MarkerModel.prototype.mergeOption = function (newOpt, ecModel) {\n        this._mergeOption(newOpt, ecModel, false, false);\n      };\n      MarkerModel.prototype._mergeOption = function (newOpt, ecModel, createdBySelf, isInit) {\n        var componentType = this.mainType;\n        if (!createdBySelf) {\n          ecModel.eachSeries(function (seriesModel) {\n            // mainType can be markPoint, markLine, markArea\n            var markerOpt = seriesModel.get(this.mainType, true);\n            var markerModel = inner$g(seriesModel)[componentType];\n            if (!markerOpt || !markerOpt.data) {\n              inner$g(seriesModel)[componentType] = null;\n              return;\n            }\n            if (!markerModel) {\n              if (isInit) {\n                // Default label emphasis `position` and `show`\n                fillLabel(markerOpt);\n              }\n              each(markerOpt.data, function (item) {\n                // FIXME Overwrite fillLabel method ?\n                if (item instanceof Array) {\n                  fillLabel(item[0]);\n                  fillLabel(item[1]);\n                } else {\n                  fillLabel(item);\n                }\n              });\n              markerModel = this.createMarkerModelFromSeries(markerOpt, this, ecModel);\n              // markerModel = new ImplementedMarkerModel(\n              //     markerOpt, this, ecModel\n              // );\n              extend(markerModel, {\n                mainType: this.mainType,\n                // Use the same series index and name\n                seriesIndex: seriesModel.seriesIndex,\n                name: seriesModel.name,\n                createdBySelf: true\n              });\n              markerModel.__hostSeries = seriesModel;\n            } else {\n              markerModel._mergeOption(markerOpt, ecModel, true);\n            }\n            inner$g(seriesModel)[componentType] = markerModel;\n          }, this);\n        }\n      };\n      MarkerModel.prototype.formatTooltip = function (dataIndex, multipleSeries, dataType) {\n        var data = this.getData();\n        var value = this.getRawValue(dataIndex);\n        var itemName = data.getName(dataIndex);\n        return createTooltipMarkup('section', {\n          header: this.name,\n          blocks: [createTooltipMarkup('nameValue', {\n            name: itemName,\n            value: value,\n            noName: !itemName,\n            noValue: value == null\n          })]\n        });\n      };\n      MarkerModel.prototype.getData = function () {\n        return this._data;\n      };\n      MarkerModel.prototype.setData = function (data) {\n        this._data = data;\n      };\n      MarkerModel.prototype.getDataParams = function (dataIndex, dataType) {\n        var params = DataFormatMixin.prototype.getDataParams.call(this, dataIndex, dataType);\n        var hostSeries = this.__hostSeries;\n        if (hostSeries) {\n          params.seriesId = hostSeries.id;\n          params.seriesName = hostSeries.name;\n          params.seriesType = hostSeries.subType;\n        }\n        return params;\n      };\n      MarkerModel.getMarkerModelFromSeries = function (seriesModel,\n      // Support three types of markers. Strict check.\n      componentType) {\n        return inner$g(seriesModel)[componentType];\n      };\n      MarkerModel.type = 'marker';\n      MarkerModel.dependencies = ['series', 'grid', 'polar', 'geo'];\n      return MarkerModel;\n    }(ComponentModel);\n    mixin(MarkerModel, DataFormatMixin.prototype);\n\n    var MarkPointModel = /** @class */function (_super) {\n      __extends(MarkPointModel, _super);\n      function MarkPointModel() {\n        var _this = _super !== null && _super.apply(this, arguments) || this;\n        _this.type = MarkPointModel.type;\n        return _this;\n      }\n      MarkPointModel.prototype.createMarkerModelFromSeries = function (markerOpt, masterMarkerModel, ecModel) {\n        return new MarkPointModel(markerOpt, masterMarkerModel, ecModel);\n      };\n      MarkPointModel.type = 'markPoint';\n      MarkPointModel.defaultOption = {\n        // zlevel: 0,\n        z: 5,\n        symbol: 'pin',\n        symbolSize: 50,\n        // symbolRotate: 0,\n        // symbolOffset: [0, 0]\n        tooltip: {\n          trigger: 'item'\n        },\n        label: {\n          show: true,\n          position: 'inside'\n        },\n        itemStyle: {\n          borderWidth: 2\n        },\n        emphasis: {\n          label: {\n            show: true\n          }\n        }\n      };\n      return MarkPointModel;\n    }(MarkerModel);\n\n    function hasXOrY(item) {\n      return !(isNaN(parseFloat(item.x)) && isNaN(parseFloat(item.y)));\n    }\n    function hasXAndY(item) {\n      return !isNaN(parseFloat(item.x)) && !isNaN(parseFloat(item.y));\n    }\n    function markerTypeCalculatorWithExtent(markerType, data, otherDataDim, targetDataDim, otherCoordIndex, targetCoordIndex) {\n      var coordArr = [];\n      var stacked = isDimensionStacked(data, targetDataDim /* , otherDataDim */);\n      var calcDataDim = stacked ? data.getCalculationInfo('stackResultDimension') : targetDataDim;\n      var value = numCalculate(data, calcDataDim, markerType);\n      var dataIndex = data.indicesOfNearest(calcDataDim, value)[0];\n      coordArr[otherCoordIndex] = data.get(otherDataDim, dataIndex);\n      coordArr[targetCoordIndex] = data.get(calcDataDim, dataIndex);\n      var coordArrValue = data.get(targetDataDim, dataIndex);\n      // Make it simple, do not visit all stacked value to count precision.\n      var precision = getPrecision(data.get(targetDataDim, dataIndex));\n      precision = Math.min(precision, 20);\n      if (precision >= 0) {\n        coordArr[targetCoordIndex] = +coordArr[targetCoordIndex].toFixed(precision);\n      }\n      return [coordArr, coordArrValue];\n    }\n    // TODO Specified percent\n    var markerTypeCalculator = {\n      min: curry(markerTypeCalculatorWithExtent, 'min'),\n      max: curry(markerTypeCalculatorWithExtent, 'max'),\n      average: curry(markerTypeCalculatorWithExtent, 'average'),\n      median: curry(markerTypeCalculatorWithExtent, 'median')\n    };\n    /**\r\n     * Transform markPoint data item to format used in List by do the following\r\n     * 1. Calculate statistic like `max`, `min`, `average`\r\n     * 2. Convert `item.xAxis`, `item.yAxis` to `item.coord` array\r\n     */\n    function dataTransform(seriesModel, item) {\n      if (!item) {\n        return;\n      }\n      var data = seriesModel.getData();\n      var coordSys = seriesModel.coordinateSystem;\n      var dims = coordSys && coordSys.dimensions;\n      // 1. If not specify the position with pixel directly\n      // 2. If `coord` is not a data array. Which uses `xAxis`,\n      // `yAxis` to specify the coord on each dimension\n      // parseFloat first because item.x and item.y can be percent string like '20%'\n      if (!hasXAndY(item) && !isArray(item.coord) && isArray(dims)) {\n        var axisInfo = getAxisInfo$1(item, data, coordSys, seriesModel);\n        // Clone the option\n        // Transform the properties xAxis, yAxis, radiusAxis, angleAxis, geoCoord to value\n        item = clone(item);\n        if (item.type && markerTypeCalculator[item.type] && axisInfo.baseAxis && axisInfo.valueAxis) {\n          var otherCoordIndex = indexOf(dims, axisInfo.baseAxis.dim);\n          var targetCoordIndex = indexOf(dims, axisInfo.valueAxis.dim);\n          var coordInfo = markerTypeCalculator[item.type](data, axisInfo.baseDataDim, axisInfo.valueDataDim, otherCoordIndex, targetCoordIndex);\n          item.coord = coordInfo[0];\n          // Force to use the value of calculated value.\n          // let item use the value without stack.\n          item.value = coordInfo[1];\n        } else {\n          // FIXME Only has one of xAxis and yAxis.\n          item.coord = [item.xAxis != null ? item.xAxis : item.radiusAxis, item.yAxis != null ? item.yAxis : item.angleAxis];\n        }\n      }\n      // x y is provided\n      if (item.coord == null || !isArray(dims)) {\n        item.coord = [];\n      } else {\n        // Each coord support max, min, average\n        var coord = item.coord;\n        for (var i = 0; i < 2; i++) {\n          if (markerTypeCalculator[coord[i]]) {\n            coord[i] = numCalculate(data, data.mapDimension(dims[i]), coord[i]);\n          }\n        }\n      }\n      return item;\n    }\n    function getAxisInfo$1(item, data, coordSys, seriesModel) {\n      var ret = {};\n      if (item.valueIndex != null || item.valueDim != null) {\n        ret.valueDataDim = item.valueIndex != null ? data.getDimension(item.valueIndex) : item.valueDim;\n        ret.valueAxis = coordSys.getAxis(dataDimToCoordDim(seriesModel, ret.valueDataDim));\n        ret.baseAxis = coordSys.getOtherAxis(ret.valueAxis);\n        ret.baseDataDim = data.mapDimension(ret.baseAxis.dim);\n      } else {\n        ret.baseAxis = seriesModel.getBaseAxis();\n        ret.valueAxis = coordSys.getOtherAxis(ret.baseAxis);\n        ret.baseDataDim = data.mapDimension(ret.baseAxis.dim);\n        ret.valueDataDim = data.mapDimension(ret.valueAxis.dim);\n      }\n      return ret;\n    }\n    function dataDimToCoordDim(seriesModel, dataDim) {\n      var dimItem = seriesModel.getData().getDimensionInfo(dataDim);\n      return dimItem && dimItem.coordDim;\n    }\n    /**\r\n     * Filter data which is out of coordinateSystem range\r\n     * [dataFilter description]\r\n     */\n    function dataFilter$1(\n    // Currently only polar and cartesian has containData.\n    coordSys, item) {\n      // Always return true if there is no coordSys\n      return coordSys && coordSys.containData && item.coord && !hasXOrY(item) ? coordSys.containData(item.coord) : true;\n    }\n    function zoneFilter(\n    // Currently only polar and cartesian has containData.\n    coordSys, item1, item2) {\n      // Always return true if there is no coordSys\n      return coordSys && coordSys.containZone && item1.coord && item2.coord && !hasXOrY(item1) && !hasXOrY(item2) ? coordSys.containZone(item1.coord, item2.coord) : true;\n    }\n    function createMarkerDimValueGetter(inCoordSys, dims) {\n      return inCoordSys ? function (item, dimName, dataIndex, dimIndex) {\n        var rawVal = dimIndex < 2\n        // x, y, radius, angle\n        ? item.coord && item.coord[dimIndex] : item.value;\n        return parseDataValue(rawVal, dims[dimIndex]);\n      } : function (item, dimName, dataIndex, dimIndex) {\n        return parseDataValue(item.value, dims[dimIndex]);\n      };\n    }\n    function numCalculate(data, valueDataDim, type) {\n      if (type === 'average') {\n        var sum_1 = 0;\n        var count_1 = 0;\n        data.each(valueDataDim, function (val, idx) {\n          if (!isNaN(val)) {\n            sum_1 += val;\n            count_1++;\n          }\n        });\n        return sum_1 / count_1;\n      } else if (type === 'median') {\n        return data.getMedian(valueDataDim);\n      } else {\n        // max & min\n        return data.getDataExtent(valueDataDim)[type === 'max' ? 1 : 0];\n      }\n    }\n\n    var inner$h = makeInner();\n    var MarkerView = /** @class */function (_super) {\n      __extends(MarkerView, _super);\n      function MarkerView() {\n        var _this = _super !== null && _super.apply(this, arguments) || this;\n        _this.type = MarkerView.type;\n        return _this;\n      }\n      MarkerView.prototype.init = function () {\n        this.markerGroupMap = createHashMap();\n      };\n      MarkerView.prototype.render = function (markerModel, ecModel, api) {\n        var _this = this;\n        var markerGroupMap = this.markerGroupMap;\n        markerGroupMap.each(function (item) {\n          inner$h(item).keep = false;\n        });\n        ecModel.eachSeries(function (seriesModel) {\n          var markerModel = MarkerModel.getMarkerModelFromSeries(seriesModel, _this.type);\n          markerModel && _this.renderSeries(seriesModel, markerModel, ecModel, api);\n        });\n        markerGroupMap.each(function (item) {\n          !inner$h(item).keep && _this.group.remove(item.group);\n        });\n      };\n      MarkerView.prototype.markKeep = function (drawGroup) {\n        inner$h(drawGroup).keep = true;\n      };\n      MarkerView.prototype.toggleBlurSeries = function (seriesModelList, isBlur) {\n        var _this = this;\n        each(seriesModelList, function (seriesModel) {\n          var markerModel = MarkerModel.getMarkerModelFromSeries(seriesModel, _this.type);\n          if (markerModel) {\n            var data = markerModel.getData();\n            data.eachItemGraphicEl(function (el) {\n              if (el) {\n                isBlur ? enterBlur(el) : leaveBlur(el);\n              }\n            });\n          }\n        });\n      };\n      MarkerView.type = 'marker';\n      return MarkerView;\n    }(ComponentView);\n\n    function updateMarkerLayout(mpData, seriesModel, api) {\n      var coordSys = seriesModel.coordinateSystem;\n      mpData.each(function (idx) {\n        var itemModel = mpData.getItemModel(idx);\n        var point;\n        var xPx = parsePercent$1(itemModel.get('x'), api.getWidth());\n        var yPx = parsePercent$1(itemModel.get('y'), api.getHeight());\n        if (!isNaN(xPx) && !isNaN(yPx)) {\n          point = [xPx, yPx];\n        }\n        // Chart like bar may have there own marker positioning logic\n        else if (seriesModel.getMarkerPosition) {\n          // Use the getMarkerPosition\n          point = seriesModel.getMarkerPosition(mpData.getValues(mpData.dimensions, idx));\n        } else if (coordSys) {\n          var x = mpData.get(coordSys.dimensions[0], idx);\n          var y = mpData.get(coordSys.dimensions[1], idx);\n          point = coordSys.dataToPoint([x, y]);\n        }\n        // Use x, y if has any\n        if (!isNaN(xPx)) {\n          point[0] = xPx;\n        }\n        if (!isNaN(yPx)) {\n          point[1] = yPx;\n        }\n        mpData.setItemLayout(idx, point);\n      });\n    }\n    var MarkPointView = /** @class */function (_super) {\n      __extends(MarkPointView, _super);\n      function MarkPointView() {\n        var _this = _super !== null && _super.apply(this, arguments) || this;\n        _this.type = MarkPointView.type;\n        return _this;\n      }\n      MarkPointView.prototype.updateTransform = function (markPointModel, ecModel, api) {\n        ecModel.eachSeries(function (seriesModel) {\n          var mpModel = MarkerModel.getMarkerModelFromSeries(seriesModel, 'markPoint');\n          if (mpModel) {\n            updateMarkerLayout(mpModel.getData(), seriesModel, api);\n            this.markerGroupMap.get(seriesModel.id).updateLayout();\n          }\n        }, this);\n      };\n      MarkPointView.prototype.renderSeries = function (seriesModel, mpModel, ecModel, api) {\n        var coordSys = seriesModel.coordinateSystem;\n        var seriesId = seriesModel.id;\n        var seriesData = seriesModel.getData();\n        var symbolDrawMap = this.markerGroupMap;\n        var symbolDraw = symbolDrawMap.get(seriesId) || symbolDrawMap.set(seriesId, new SymbolDraw());\n        var mpData = createData(coordSys, seriesModel, mpModel);\n        // FIXME\n        mpModel.setData(mpData);\n        updateMarkerLayout(mpModel.getData(), seriesModel, api);\n        mpData.each(function (idx) {\n          var itemModel = mpData.getItemModel(idx);\n          var symbol = itemModel.getShallow('symbol');\n          var symbolSize = itemModel.getShallow('symbolSize');\n          var symbolRotate = itemModel.getShallow('symbolRotate');\n          var symbolOffset = itemModel.getShallow('symbolOffset');\n          var symbolKeepAspect = itemModel.getShallow('symbolKeepAspect');\n          // TODO: refactor needed: single data item should not support callback function\n          if (isFunction(symbol) || isFunction(symbolSize) || isFunction(symbolRotate) || isFunction(symbolOffset)) {\n            var rawIdx = mpModel.getRawValue(idx);\n            var dataParams = mpModel.getDataParams(idx);\n            if (isFunction(symbol)) {\n              symbol = symbol(rawIdx, dataParams);\n            }\n            if (isFunction(symbolSize)) {\n              // FIXME 这里不兼容 ECharts 2.x，2.x 貌似参数是整个数据？\n              symbolSize = symbolSize(rawIdx, dataParams);\n            }\n            if (isFunction(symbolRotate)) {\n              symbolRotate = symbolRotate(rawIdx, dataParams);\n            }\n            if (isFunction(symbolOffset)) {\n              symbolOffset = symbolOffset(rawIdx, dataParams);\n            }\n          }\n          var style = itemModel.getModel('itemStyle').getItemStyle();\n          var color = getVisualFromData(seriesData, 'color');\n          if (!style.fill) {\n            style.fill = color;\n          }\n          mpData.setItemVisual(idx, {\n            symbol: symbol,\n            symbolSize: symbolSize,\n            symbolRotate: symbolRotate,\n            symbolOffset: symbolOffset,\n            symbolKeepAspect: symbolKeepAspect,\n            style: style\n          });\n        });\n        // TODO Text are wrong\n        symbolDraw.updateData(mpData);\n        this.group.add(symbolDraw.group);\n        // Set host model for tooltip\n        // FIXME\n        mpData.eachItemGraphicEl(function (el) {\n          el.traverse(function (child) {\n            getECData(child).dataModel = mpModel;\n          });\n        });\n        this.markKeep(symbolDraw);\n        symbolDraw.group.silent = mpModel.get('silent') || seriesModel.get('silent');\n      };\n      MarkPointView.type = 'markPoint';\n      return MarkPointView;\n    }(MarkerView);\n    function createData(coordSys, seriesModel, mpModel) {\n      var coordDimsInfos;\n      if (coordSys) {\n        coordDimsInfos = map(coordSys && coordSys.dimensions, function (coordDim) {\n          var info = seriesModel.getData().getDimensionInfo(seriesModel.getData().mapDimension(coordDim)) || {};\n          // In map series data don't have lng and lat dimension. Fallback to same with coordSys\n          return extend(extend({}, info), {\n            name: coordDim,\n            // DON'T use ordinalMeta to parse and collect ordinal.\n            ordinalMeta: null\n          });\n        });\n      } else {\n        coordDimsInfos = [{\n          name: 'value',\n          type: 'float'\n        }];\n      }\n      var mpData = new SeriesData(coordDimsInfos, mpModel);\n      var dataOpt = map(mpModel.get('data'), curry(dataTransform, seriesModel));\n      if (coordSys) {\n        dataOpt = filter(dataOpt, curry(dataFilter$1, coordSys));\n      }\n      var dimValueGetter = createMarkerDimValueGetter(!!coordSys, coordDimsInfos);\n      mpData.initData(dataOpt, null, dimValueGetter);\n      return mpData;\n    }\n\n    function install$E(registers) {\n      registers.registerComponentModel(MarkPointModel);\n      registers.registerComponentView(MarkPointView);\n      registers.registerPreprocessor(function (opt) {\n        if (checkMarkerInSeries(opt.series, 'markPoint')) {\n          // Make sure markPoint component is enabled\n          opt.markPoint = opt.markPoint || {};\n        }\n      });\n    }\n\n    var MarkLineModel = /** @class */function (_super) {\n      __extends(MarkLineModel, _super);\n      function MarkLineModel() {\n        var _this = _super !== null && _super.apply(this, arguments) || this;\n        _this.type = MarkLineModel.type;\n        return _this;\n      }\n      MarkLineModel.prototype.createMarkerModelFromSeries = function (markerOpt, masterMarkerModel, ecModel) {\n        return new MarkLineModel(markerOpt, masterMarkerModel, ecModel);\n      };\n      MarkLineModel.type = 'markLine';\n      MarkLineModel.defaultOption = {\n        // zlevel: 0,\n        z: 5,\n        symbol: ['circle', 'arrow'],\n        symbolSize: [8, 16],\n        // symbolRotate: 0,\n        symbolOffset: 0,\n        precision: 2,\n        tooltip: {\n          trigger: 'item'\n        },\n        label: {\n          show: true,\n          position: 'end',\n          distance: 5\n        },\n        lineStyle: {\n          type: 'dashed'\n        },\n        emphasis: {\n          label: {\n            show: true\n          },\n          lineStyle: {\n            width: 3\n          }\n        },\n        animationEasing: 'linear'\n      };\n      return MarkLineModel;\n    }(MarkerModel);\n\n    var inner$i = makeInner();\n    var markLineTransform = function (seriesModel, coordSys, mlModel, item) {\n      var data = seriesModel.getData();\n      var itemArray;\n      if (!isArray(item)) {\n        // Special type markLine like 'min', 'max', 'average', 'median'\n        var mlType = item.type;\n        if (mlType === 'min' || mlType === 'max' || mlType === 'average' || mlType === 'median'\n        // In case\n        // data: [{\n        //   yAxis: 10\n        // }]\n        || item.xAxis != null || item.yAxis != null) {\n          var valueAxis = void 0;\n          var value = void 0;\n          if (item.yAxis != null || item.xAxis != null) {\n            valueAxis = coordSys.getAxis(item.yAxis != null ? 'y' : 'x');\n            value = retrieve(item.yAxis, item.xAxis);\n          } else {\n            var axisInfo = getAxisInfo$1(item, data, coordSys, seriesModel);\n            valueAxis = axisInfo.valueAxis;\n            var valueDataDim = getStackedDimension(data, axisInfo.valueDataDim);\n            value = numCalculate(data, valueDataDim, mlType);\n          }\n          var valueIndex = valueAxis.dim === 'x' ? 0 : 1;\n          var baseIndex = 1 - valueIndex;\n          // Normized to 2d data with start and end point\n          var mlFrom = clone(item);\n          var mlTo = {\n            coord: []\n          };\n          mlFrom.type = null;\n          mlFrom.coord = [];\n          mlFrom.coord[baseIndex] = -Infinity;\n          mlTo.coord[baseIndex] = Infinity;\n          var precision = mlModel.get('precision');\n          if (precision >= 0 && isNumber(value)) {\n            value = +value.toFixed(Math.min(precision, 20));\n          }\n          mlFrom.coord[valueIndex] = mlTo.coord[valueIndex] = value;\n          itemArray = [mlFrom, mlTo, {\n            type: mlType,\n            valueIndex: item.valueIndex,\n            // Force to use the value of calculated value.\n            value: value\n          }];\n        } else {\n          // Invalid data\n          if (\"development\" !== 'production') {\n            logError('Invalid markLine data.');\n          }\n          itemArray = [];\n        }\n      } else {\n        itemArray = item;\n      }\n      var normalizedItem = [dataTransform(seriesModel, itemArray[0]), dataTransform(seriesModel, itemArray[1]), extend({}, itemArray[2])];\n      // Avoid line data type is extended by from(to) data type\n      normalizedItem[2].type = normalizedItem[2].type || null;\n      // Merge from option and to option into line option\n      merge(normalizedItem[2], normalizedItem[0]);\n      merge(normalizedItem[2], normalizedItem[1]);\n      return normalizedItem;\n    };\n    function isInfinity(val) {\n      return !isNaN(val) && !isFinite(val);\n    }\n    // If a markLine has one dim\n    function ifMarkLineHasOnlyDim(dimIndex, fromCoord, toCoord, coordSys) {\n      var otherDimIndex = 1 - dimIndex;\n      var dimName = coordSys.dimensions[dimIndex];\n      return isInfinity(fromCoord[otherDimIndex]) && isInfinity(toCoord[otherDimIndex]) && fromCoord[dimIndex] === toCoord[dimIndex] && coordSys.getAxis(dimName).containData(fromCoord[dimIndex]);\n    }\n    function markLineFilter(coordSys, item) {\n      if (coordSys.type === 'cartesian2d') {\n        var fromCoord = item[0].coord;\n        var toCoord = item[1].coord;\n        // In case\n        // {\n        //  markLine: {\n        //    data: [{ yAxis: 2 }]\n        //  }\n        // }\n        if (fromCoord && toCoord && (ifMarkLineHasOnlyDim(1, fromCoord, toCoord, coordSys) || ifMarkLineHasOnlyDim(0, fromCoord, toCoord, coordSys))) {\n          return true;\n        }\n      }\n      return dataFilter$1(coordSys, item[0]) && dataFilter$1(coordSys, item[1]);\n    }\n    function updateSingleMarkerEndLayout(data, idx, isFrom, seriesModel, api) {\n      var coordSys = seriesModel.coordinateSystem;\n      var itemModel = data.getItemModel(idx);\n      var point;\n      var xPx = parsePercent$1(itemModel.get('x'), api.getWidth());\n      var yPx = parsePercent$1(itemModel.get('y'), api.getHeight());\n      if (!isNaN(xPx) && !isNaN(yPx)) {\n        point = [xPx, yPx];\n      } else {\n        // Chart like bar may have there own marker positioning logic\n        if (seriesModel.getMarkerPosition) {\n          // Use the getMarkerPosition\n          point = seriesModel.getMarkerPosition(data.getValues(data.dimensions, idx));\n        } else {\n          var dims = coordSys.dimensions;\n          var x = data.get(dims[0], idx);\n          var y = data.get(dims[1], idx);\n          point = coordSys.dataToPoint([x, y]);\n        }\n        // Expand line to the edge of grid if value on one axis is Inifnity\n        // In case\n        //  markLine: {\n        //    data: [{\n        //      yAxis: 2\n        //      // or\n        //      type: 'average'\n        //    }]\n        //  }\n        if (isCoordinateSystemType(coordSys, 'cartesian2d')) {\n          // TODO: TYPE ts@4.1 may still infer it as Axis instead of Axis2D. Not sure if it's a bug\n          var xAxis = coordSys.getAxis('x');\n          var yAxis = coordSys.getAxis('y');\n          var dims = coordSys.dimensions;\n          if (isInfinity(data.get(dims[0], idx))) {\n            point[0] = xAxis.toGlobalCoord(xAxis.getExtent()[isFrom ? 0 : 1]);\n          } else if (isInfinity(data.get(dims[1], idx))) {\n            point[1] = yAxis.toGlobalCoord(yAxis.getExtent()[isFrom ? 0 : 1]);\n          }\n        }\n        // Use x, y if has any\n        if (!isNaN(xPx)) {\n          point[0] = xPx;\n        }\n        if (!isNaN(yPx)) {\n          point[1] = yPx;\n        }\n      }\n      data.setItemLayout(idx, point);\n    }\n    var MarkLineView = /** @class */function (_super) {\n      __extends(MarkLineView, _super);\n      function MarkLineView() {\n        var _this = _super !== null && _super.apply(this, arguments) || this;\n        _this.type = MarkLineView.type;\n        return _this;\n      }\n      MarkLineView.prototype.updateTransform = function (markLineModel, ecModel, api) {\n        ecModel.eachSeries(function (seriesModel) {\n          var mlModel = MarkerModel.getMarkerModelFromSeries(seriesModel, 'markLine');\n          if (mlModel) {\n            var mlData_1 = mlModel.getData();\n            var fromData_1 = inner$i(mlModel).from;\n            var toData_1 = inner$i(mlModel).to;\n            // Update visual and layout of from symbol and to symbol\n            fromData_1.each(function (idx) {\n              updateSingleMarkerEndLayout(fromData_1, idx, true, seriesModel, api);\n              updateSingleMarkerEndLayout(toData_1, idx, false, seriesModel, api);\n            });\n            // Update layout of line\n            mlData_1.each(function (idx) {\n              mlData_1.setItemLayout(idx, [fromData_1.getItemLayout(idx), toData_1.getItemLayout(idx)]);\n            });\n            this.markerGroupMap.get(seriesModel.id).updateLayout();\n          }\n        }, this);\n      };\n      MarkLineView.prototype.renderSeries = function (seriesModel, mlModel, ecModel, api) {\n        var coordSys = seriesModel.coordinateSystem;\n        var seriesId = seriesModel.id;\n        var seriesData = seriesModel.getData();\n        var lineDrawMap = this.markerGroupMap;\n        var lineDraw = lineDrawMap.get(seriesId) || lineDrawMap.set(seriesId, new LineDraw());\n        this.group.add(lineDraw.group);\n        var mlData = createList$1(coordSys, seriesModel, mlModel);\n        var fromData = mlData.from;\n        var toData = mlData.to;\n        var lineData = mlData.line;\n        inner$i(mlModel).from = fromData;\n        inner$i(mlModel).to = toData;\n        // Line data for tooltip and formatter\n        mlModel.setData(lineData);\n        // TODO\n        // Functionally, `symbolSize` & `symbolOffset` can also be 2D array now.\n        // But the related logic and type definition are not finished yet.\n        // Finish it if required\n        var symbolType = mlModel.get('symbol');\n        var symbolSize = mlModel.get('symbolSize');\n        var symbolRotate = mlModel.get('symbolRotate');\n        var symbolOffset = mlModel.get('symbolOffset');\n        // TODO: support callback function like markPoint\n        if (!isArray(symbolType)) {\n          symbolType = [symbolType, symbolType];\n        }\n        if (!isArray(symbolSize)) {\n          symbolSize = [symbolSize, symbolSize];\n        }\n        if (!isArray(symbolRotate)) {\n          symbolRotate = [symbolRotate, symbolRotate];\n        }\n        if (!isArray(symbolOffset)) {\n          symbolOffset = [symbolOffset, symbolOffset];\n        }\n        // Update visual and layout of from symbol and to symbol\n        mlData.from.each(function (idx) {\n          updateDataVisualAndLayout(fromData, idx, true);\n          updateDataVisualAndLayout(toData, idx, false);\n        });\n        // Update visual and layout of line\n        lineData.each(function (idx) {\n          var lineStyle = lineData.getItemModel(idx).getModel('lineStyle').getLineStyle();\n          // lineData.setItemVisual(idx, {\n          //     color: lineColor || fromData.getItemVisual(idx, 'color')\n          // });\n          lineData.setItemLayout(idx, [fromData.getItemLayout(idx), toData.getItemLayout(idx)]);\n          if (lineStyle.stroke == null) {\n            lineStyle.stroke = fromData.getItemVisual(idx, 'style').fill;\n          }\n          lineData.setItemVisual(idx, {\n            fromSymbolKeepAspect: fromData.getItemVisual(idx, 'symbolKeepAspect'),\n            fromSymbolOffset: fromData.getItemVisual(idx, 'symbolOffset'),\n            fromSymbolRotate: fromData.getItemVisual(idx, 'symbolRotate'),\n            fromSymbolSize: fromData.getItemVisual(idx, 'symbolSize'),\n            fromSymbol: fromData.getItemVisual(idx, 'symbol'),\n            toSymbolKeepAspect: toData.getItemVisual(idx, 'symbolKeepAspect'),\n            toSymbolOffset: toData.getItemVisual(idx, 'symbolOffset'),\n            toSymbolRotate: toData.getItemVisual(idx, 'symbolRotate'),\n            toSymbolSize: toData.getItemVisual(idx, 'symbolSize'),\n            toSymbol: toData.getItemVisual(idx, 'symbol'),\n            style: lineStyle\n          });\n        });\n        lineDraw.updateData(lineData);\n        // Set host model for tooltip\n        // FIXME\n        mlData.line.eachItemGraphicEl(function (el) {\n          getECData(el).dataModel = mlModel;\n          el.traverse(function (child) {\n            getECData(child).dataModel = mlModel;\n          });\n        });\n        function updateDataVisualAndLayout(data, idx, isFrom) {\n          var itemModel = data.getItemModel(idx);\n          updateSingleMarkerEndLayout(data, idx, isFrom, seriesModel, api);\n          var style = itemModel.getModel('itemStyle').getItemStyle();\n          if (style.fill == null) {\n            style.fill = getVisualFromData(seriesData, 'color');\n          }\n          data.setItemVisual(idx, {\n            symbolKeepAspect: itemModel.get('symbolKeepAspect'),\n            // `0` should be considered as a valid value, so use `retrieve2` instead of `||`\n            symbolOffset: retrieve2(itemModel.get('symbolOffset', true), symbolOffset[isFrom ? 0 : 1]),\n            symbolRotate: retrieve2(itemModel.get('symbolRotate', true), symbolRotate[isFrom ? 0 : 1]),\n            // TODO: when 2d array is supported, it should ignore parent\n            symbolSize: retrieve2(itemModel.get('symbolSize'), symbolSize[isFrom ? 0 : 1]),\n            symbol: retrieve2(itemModel.get('symbol', true), symbolType[isFrom ? 0 : 1]),\n            style: style\n          });\n        }\n        this.markKeep(lineDraw);\n        lineDraw.group.silent = mlModel.get('silent') || seriesModel.get('silent');\n      };\n      MarkLineView.type = 'markLine';\n      return MarkLineView;\n    }(MarkerView);\n    function createList$1(coordSys, seriesModel, mlModel) {\n      var coordDimsInfos;\n      if (coordSys) {\n        coordDimsInfos = map(coordSys && coordSys.dimensions, function (coordDim) {\n          var info = seriesModel.getData().getDimensionInfo(seriesModel.getData().mapDimension(coordDim)) || {};\n          // In map series data don't have lng and lat dimension. Fallback to same with coordSys\n          return extend(extend({}, info), {\n            name: coordDim,\n            // DON'T use ordinalMeta to parse and collect ordinal.\n            ordinalMeta: null\n          });\n        });\n      } else {\n        coordDimsInfos = [{\n          name: 'value',\n          type: 'float'\n        }];\n      }\n      var fromData = new SeriesData(coordDimsInfos, mlModel);\n      var toData = new SeriesData(coordDimsInfos, mlModel);\n      // No dimensions\n      var lineData = new SeriesData([], mlModel);\n      var optData = map(mlModel.get('data'), curry(markLineTransform, seriesModel, coordSys, mlModel));\n      if (coordSys) {\n        optData = filter(optData, curry(markLineFilter, coordSys));\n      }\n      var dimValueGetter = createMarkerDimValueGetter(!!coordSys, coordDimsInfos);\n      fromData.initData(map(optData, function (item) {\n        return item[0];\n      }), null, dimValueGetter);\n      toData.initData(map(optData, function (item) {\n        return item[1];\n      }), null, dimValueGetter);\n      lineData.initData(map(optData, function (item) {\n        return item[2];\n      }));\n      lineData.hasItemOption = true;\n      return {\n        from: fromData,\n        to: toData,\n        line: lineData\n      };\n    }\n\n    function install$F(registers) {\n      registers.registerComponentModel(MarkLineModel);\n      registers.registerComponentView(MarkLineView);\n      registers.registerPreprocessor(function (opt) {\n        if (checkMarkerInSeries(opt.series, 'markLine')) {\n          // Make sure markLine component is enabled\n          opt.markLine = opt.markLine || {};\n        }\n      });\n    }\n\n    var MarkAreaModel = /** @class */function (_super) {\n      __extends(MarkAreaModel, _super);\n      function MarkAreaModel() {\n        var _this = _super !== null && _super.apply(this, arguments) || this;\n        _this.type = MarkAreaModel.type;\n        return _this;\n      }\n      MarkAreaModel.prototype.createMarkerModelFromSeries = function (markerOpt, masterMarkerModel, ecModel) {\n        return new MarkAreaModel(markerOpt, masterMarkerModel, ecModel);\n      };\n      MarkAreaModel.type = 'markArea';\n      MarkAreaModel.defaultOption = {\n        // zlevel: 0,\n        // PENDING\n        z: 1,\n        tooltip: {\n          trigger: 'item'\n        },\n        // markArea should fixed on the coordinate system\n        animation: false,\n        label: {\n          show: true,\n          position: 'top'\n        },\n        itemStyle: {\n          // color and borderColor default to use color from series\n          // color: 'auto'\n          // borderColor: 'auto'\n          borderWidth: 0\n        },\n        emphasis: {\n          label: {\n            show: true,\n            position: 'top'\n          }\n        }\n      };\n      return MarkAreaModel;\n    }(MarkerModel);\n\n    var inner$j = makeInner();\n    var markAreaTransform = function (seriesModel, coordSys, maModel, item) {\n      // item may be null\n      var item0 = item[0];\n      var item1 = item[1];\n      if (!item0 || !item1) {\n        return;\n      }\n      var lt = dataTransform(seriesModel, item0);\n      var rb = dataTransform(seriesModel, item1);\n      // FIXME make sure lt is less than rb\n      var ltCoord = lt.coord;\n      var rbCoord = rb.coord;\n      ltCoord[0] = retrieve(ltCoord[0], -Infinity);\n      ltCoord[1] = retrieve(ltCoord[1], -Infinity);\n      rbCoord[0] = retrieve(rbCoord[0], Infinity);\n      rbCoord[1] = retrieve(rbCoord[1], Infinity);\n      // Merge option into one\n      var result = mergeAll([{}, lt, rb]);\n      result.coord = [lt.coord, rb.coord];\n      result.x0 = lt.x;\n      result.y0 = lt.y;\n      result.x1 = rb.x;\n      result.y1 = rb.y;\n      return result;\n    };\n    function isInfinity$1(val) {\n      return !isNaN(val) && !isFinite(val);\n    }\n    // If a markArea has one dim\n    function ifMarkAreaHasOnlyDim(dimIndex, fromCoord, toCoord, coordSys) {\n      var otherDimIndex = 1 - dimIndex;\n      return isInfinity$1(fromCoord[otherDimIndex]) && isInfinity$1(toCoord[otherDimIndex]);\n    }\n    function markAreaFilter(coordSys, item) {\n      var fromCoord = item.coord[0];\n      var toCoord = item.coord[1];\n      var item0 = {\n        coord: fromCoord,\n        x: item.x0,\n        y: item.y0\n      };\n      var item1 = {\n        coord: toCoord,\n        x: item.x1,\n        y: item.y1\n      };\n      if (isCoordinateSystemType(coordSys, 'cartesian2d')) {\n        // In case\n        // {\n        //  markArea: {\n        //    data: [{ yAxis: 2 }]\n        //  }\n        // }\n        if (fromCoord && toCoord && (ifMarkAreaHasOnlyDim(1, fromCoord, toCoord) || ifMarkAreaHasOnlyDim(0, fromCoord, toCoord))) {\n          return true;\n        }\n        // Directly returning true may also do the work,\n        // because markArea will not be shown automatically\n        // when it's not included in coordinate system.\n        // But filtering ahead can avoid keeping rendering markArea\n        // when there are too many of them.\n        return zoneFilter(coordSys, item0, item1);\n      }\n      return dataFilter$1(coordSys, item0) || dataFilter$1(coordSys, item1);\n    }\n    // dims can be ['x0', 'y0'], ['x1', 'y1'], ['x0', 'y1'], ['x1', 'y0']\n    function getSingleMarkerEndPoint(data, idx, dims, seriesModel, api) {\n      var coordSys = seriesModel.coordinateSystem;\n      var itemModel = data.getItemModel(idx);\n      var point;\n      var xPx = parsePercent$1(itemModel.get(dims[0]), api.getWidth());\n      var yPx = parsePercent$1(itemModel.get(dims[1]), api.getHeight());\n      if (!isNaN(xPx) && !isNaN(yPx)) {\n        point = [xPx, yPx];\n      } else {\n        // Chart like bar may have there own marker positioning logic\n        if (seriesModel.getMarkerPosition) {\n          // Consider the case that user input the right-bottom point first\n          // Pick the larger x and y as 'x1' and 'y1'\n          var pointValue0 = data.getValues(['x0', 'y0'], idx);\n          var pointValue1 = data.getValues(['x1', 'y1'], idx);\n          var clampPointValue0 = coordSys.clampData(pointValue0);\n          var clampPointValue1 = coordSys.clampData(pointValue1);\n          var pointValue = [];\n          if (dims[0] === 'x0') {\n            pointValue[0] = clampPointValue0[0] > clampPointValue1[0] ? pointValue1[0] : pointValue0[0];\n          } else {\n            pointValue[0] = clampPointValue0[0] > clampPointValue1[0] ? pointValue0[0] : pointValue1[0];\n          }\n          if (dims[1] === 'y0') {\n            pointValue[1] = clampPointValue0[1] > clampPointValue1[1] ? pointValue1[1] : pointValue0[1];\n          } else {\n            pointValue[1] = clampPointValue0[1] > clampPointValue1[1] ? pointValue0[1] : pointValue1[1];\n          }\n          // Use the getMarkerPosition\n          point = seriesModel.getMarkerPosition(pointValue, dims, true);\n        } else {\n          var x = data.get(dims[0], idx);\n          var y = data.get(dims[1], idx);\n          var pt = [x, y];\n          coordSys.clampData && coordSys.clampData(pt, pt);\n          point = coordSys.dataToPoint(pt, true);\n        }\n        if (isCoordinateSystemType(coordSys, 'cartesian2d')) {\n          // TODO: TYPE ts@4.1 may still infer it as Axis instead of Axis2D. Not sure if it's a bug\n          var xAxis = coordSys.getAxis('x');\n          var yAxis = coordSys.getAxis('y');\n          var x = data.get(dims[0], idx);\n          var y = data.get(dims[1], idx);\n          if (isInfinity$1(x)) {\n            point[0] = xAxis.toGlobalCoord(xAxis.getExtent()[dims[0] === 'x0' ? 0 : 1]);\n          } else if (isInfinity$1(y)) {\n            point[1] = yAxis.toGlobalCoord(yAxis.getExtent()[dims[1] === 'y0' ? 0 : 1]);\n          }\n        }\n        // Use x, y if has any\n        if (!isNaN(xPx)) {\n          point[0] = xPx;\n        }\n        if (!isNaN(yPx)) {\n          point[1] = yPx;\n        }\n      }\n      return point;\n    }\n    var dimPermutations = [['x0', 'y0'], ['x1', 'y0'], ['x1', 'y1'], ['x0', 'y1']];\n    var MarkAreaView = /** @class */function (_super) {\n      __extends(MarkAreaView, _super);\n      function MarkAreaView() {\n        var _this = _super !== null && _super.apply(this, arguments) || this;\n        _this.type = MarkAreaView.type;\n        return _this;\n      }\n      MarkAreaView.prototype.updateTransform = function (markAreaModel, ecModel, api) {\n        ecModel.eachSeries(function (seriesModel) {\n          var maModel = MarkerModel.getMarkerModelFromSeries(seriesModel, 'markArea');\n          if (maModel) {\n            var areaData_1 = maModel.getData();\n            areaData_1.each(function (idx) {\n              var points = map(dimPermutations, function (dim) {\n                return getSingleMarkerEndPoint(areaData_1, idx, dim, seriesModel, api);\n              });\n              // Layout\n              areaData_1.setItemLayout(idx, points);\n              var el = areaData_1.getItemGraphicEl(idx);\n              el.setShape('points', points);\n            });\n          }\n        }, this);\n      };\n      MarkAreaView.prototype.renderSeries = function (seriesModel, maModel, ecModel, api) {\n        var coordSys = seriesModel.coordinateSystem;\n        var seriesId = seriesModel.id;\n        var seriesData = seriesModel.getData();\n        var areaGroupMap = this.markerGroupMap;\n        var polygonGroup = areaGroupMap.get(seriesId) || areaGroupMap.set(seriesId, {\n          group: new Group()\n        });\n        this.group.add(polygonGroup.group);\n        this.markKeep(polygonGroup);\n        var areaData = createList$2(coordSys, seriesModel, maModel);\n        // Line data for tooltip and formatter\n        maModel.setData(areaData);\n        // Update visual and layout of line\n        areaData.each(function (idx) {\n          // Layout\n          var points = map(dimPermutations, function (dim) {\n            return getSingleMarkerEndPoint(areaData, idx, dim, seriesModel, api);\n          });\n          var xAxisScale = coordSys.getAxis('x').scale;\n          var yAxisScale = coordSys.getAxis('y').scale;\n          var xAxisExtent = xAxisScale.getExtent();\n          var yAxisExtent = yAxisScale.getExtent();\n          var xPointExtent = [xAxisScale.parse(areaData.get('x0', idx)), xAxisScale.parse(areaData.get('x1', idx))];\n          var yPointExtent = [yAxisScale.parse(areaData.get('y0', idx)), yAxisScale.parse(areaData.get('y1', idx))];\n          asc(xPointExtent);\n          asc(yPointExtent);\n          var overlapped = !(xAxisExtent[0] > xPointExtent[1] || xAxisExtent[1] < xPointExtent[0] || yAxisExtent[0] > yPointExtent[1] || yAxisExtent[1] < yPointExtent[0]);\n          // If none of the area is inside coordSys, allClipped is set to be true\n          // in layout so that label will not be displayed. See #12591\n          var allClipped = !overlapped;\n          areaData.setItemLayout(idx, {\n            points: points,\n            allClipped: allClipped\n          });\n          var style = areaData.getItemModel(idx).getModel('itemStyle').getItemStyle();\n          var color$1 = getVisualFromData(seriesData, 'color');\n          if (!style.fill) {\n            style.fill = color$1;\n            if (isString(style.fill)) {\n              style.fill = modifyAlpha(style.fill, 0.4);\n            }\n          }\n          if (!style.stroke) {\n            style.stroke = color$1;\n          }\n          // Visual\n          areaData.setItemVisual(idx, 'style', style);\n        });\n        areaData.diff(inner$j(polygonGroup).data).add(function (idx) {\n          var layout = areaData.getItemLayout(idx);\n          if (!layout.allClipped) {\n            var polygon = new Polygon({\n              shape: {\n                points: layout.points\n              }\n            });\n            areaData.setItemGraphicEl(idx, polygon);\n            polygonGroup.group.add(polygon);\n          }\n        }).update(function (newIdx, oldIdx) {\n          var polygon = inner$j(polygonGroup).data.getItemGraphicEl(oldIdx);\n          var layout = areaData.getItemLayout(newIdx);\n          if (!layout.allClipped) {\n            if (polygon) {\n              updateProps(polygon, {\n                shape: {\n                  points: layout.points\n                }\n              }, maModel, newIdx);\n            } else {\n              polygon = new Polygon({\n                shape: {\n                  points: layout.points\n                }\n              });\n            }\n            areaData.setItemGraphicEl(newIdx, polygon);\n            polygonGroup.group.add(polygon);\n          } else if (polygon) {\n            polygonGroup.group.remove(polygon);\n          }\n        }).remove(function (idx) {\n          var polygon = inner$j(polygonGroup).data.getItemGraphicEl(idx);\n          polygonGroup.group.remove(polygon);\n        }).execute();\n        areaData.eachItemGraphicEl(function (polygon, idx) {\n          var itemModel = areaData.getItemModel(idx);\n          var style = areaData.getItemVisual(idx, 'style');\n          polygon.useStyle(areaData.getItemVisual(idx, 'style'));\n          setLabelStyle(polygon, getLabelStatesModels(itemModel), {\n            labelFetcher: maModel,\n            labelDataIndex: idx,\n            defaultText: areaData.getName(idx) || '',\n            inheritColor: isString(style.fill) ? modifyAlpha(style.fill, 1) : '#000'\n          });\n          setStatesStylesFromModel(polygon, itemModel);\n          toggleHoverEmphasis(polygon, null, null, itemModel.get(['emphasis', 'disabled']));\n          getECData(polygon).dataModel = maModel;\n        });\n        inner$j(polygonGroup).data = areaData;\n        polygonGroup.group.silent = maModel.get('silent') || seriesModel.get('silent');\n      };\n      MarkAreaView.type = 'markArea';\n      return MarkAreaView;\n    }(MarkerView);\n    function createList$2(coordSys, seriesModel, maModel) {\n      var areaData;\n      var dataDims;\n      var dims = ['x0', 'y0', 'x1', 'y1'];\n      if (coordSys) {\n        var coordDimsInfos_1 = map(coordSys && coordSys.dimensions, function (coordDim) {\n          var data = seriesModel.getData();\n          var info = data.getDimensionInfo(data.mapDimension(coordDim)) || {};\n          // In map series data don't have lng and lat dimension. Fallback to same with coordSys\n          return extend(extend({}, info), {\n            name: coordDim,\n            // DON'T use ordinalMeta to parse and collect ordinal.\n            ordinalMeta: null\n          });\n        });\n        dataDims = map(dims, function (dim, idx) {\n          return {\n            name: dim,\n            type: coordDimsInfos_1[idx % 2].type\n          };\n        });\n        areaData = new SeriesData(dataDims, maModel);\n      } else {\n        dataDims = [{\n          name: 'value',\n          type: 'float'\n        }];\n        areaData = new SeriesData(dataDims, maModel);\n      }\n      var optData = map(maModel.get('data'), curry(markAreaTransform, seriesModel, coordSys, maModel));\n      if (coordSys) {\n        optData = filter(optData, curry(markAreaFilter, coordSys));\n      }\n      var dimValueGetter = coordSys ? function (item, dimName, dataIndex, dimIndex) {\n        // TODO should convert to ParsedValue?\n        var rawVal = item.coord[Math.floor(dimIndex / 2)][dimIndex % 2];\n        return parseDataValue(rawVal, dataDims[dimIndex]);\n      } : function (item, dimName, dataIndex, dimIndex) {\n        return parseDataValue(item.value, dataDims[dimIndex]);\n      };\n      areaData.initData(optData, null, dimValueGetter);\n      areaData.hasItemOption = true;\n      return areaData;\n    }\n\n    function install$G(registers) {\n      registers.registerComponentModel(MarkAreaModel);\n      registers.registerComponentView(MarkAreaView);\n      registers.registerPreprocessor(function (opt) {\n        if (checkMarkerInSeries(opt.series, 'markArea')) {\n          // Make sure markArea component is enabled\n          opt.markArea = opt.markArea || {};\n        }\n      });\n    }\n\n    var getDefaultSelectorOptions = function (ecModel, type) {\n      if (type === 'all') {\n        return {\n          type: 'all',\n          title: ecModel.getLocaleModel().get(['legend', 'selector', 'all'])\n        };\n      } else if (type === 'inverse') {\n        return {\n          type: 'inverse',\n          title: ecModel.getLocaleModel().get(['legend', 'selector', 'inverse'])\n        };\n      }\n    };\n    var LegendModel = /** @class */function (_super) {\n      __extends(LegendModel, _super);\n      function LegendModel() {\n        var _this = _super !== null && _super.apply(this, arguments) || this;\n        _this.type = LegendModel.type;\n        _this.layoutMode = {\n          type: 'box',\n          // legend.width/height are maxWidth/maxHeight actually,\n          // whereas real width/height is calculated by its content.\n          // (Setting {left: 10, right: 10} does not make sense).\n          // So consider the case:\n          // `setOption({legend: {left: 10});`\n          // then `setOption({legend: {right: 10});`\n          // The previous `left` should be cleared by setting `ignoreSize`.\n          ignoreSize: true\n        };\n        return _this;\n      }\n      LegendModel.prototype.init = function (option, parentModel, ecModel) {\n        this.mergeDefaultAndTheme(option, ecModel);\n        option.selected = option.selected || {};\n        this._updateSelector(option);\n      };\n      LegendModel.prototype.mergeOption = function (option, ecModel) {\n        _super.prototype.mergeOption.call(this, option, ecModel);\n        this._updateSelector(option);\n      };\n      LegendModel.prototype._updateSelector = function (option) {\n        var selector = option.selector;\n        var ecModel = this.ecModel;\n        if (selector === true) {\n          selector = option.selector = ['all', 'inverse'];\n        }\n        if (isArray(selector)) {\n          each(selector, function (item, index) {\n            isString(item) && (item = {\n              type: item\n            });\n            selector[index] = merge(item, getDefaultSelectorOptions(ecModel, item.type));\n          });\n        }\n      };\n      LegendModel.prototype.optionUpdated = function () {\n        this._updateData(this.ecModel);\n        var legendData = this._data;\n        // If selectedMode is single, try to select one\n        if (legendData[0] && this.get('selectedMode') === 'single') {\n          var hasSelected = false;\n          // If has any selected in option.selected\n          for (var i = 0; i < legendData.length; i++) {\n            var name_1 = legendData[i].get('name');\n            if (this.isSelected(name_1)) {\n              // Force to unselect others\n              this.select(name_1);\n              hasSelected = true;\n              break;\n            }\n          }\n          // Try select the first if selectedMode is single\n          !hasSelected && this.select(legendData[0].get('name'));\n        }\n      };\n      LegendModel.prototype._updateData = function (ecModel) {\n        var potentialData = [];\n        var availableNames = [];\n        ecModel.eachRawSeries(function (seriesModel) {\n          var seriesName = seriesModel.name;\n          availableNames.push(seriesName);\n          var isPotential;\n          if (seriesModel.legendVisualProvider) {\n            var provider = seriesModel.legendVisualProvider;\n            var names = provider.getAllNames();\n            if (!ecModel.isSeriesFiltered(seriesModel)) {\n              availableNames = availableNames.concat(names);\n            }\n            if (names.length) {\n              potentialData = potentialData.concat(names);\n            } else {\n              isPotential = true;\n            }\n          } else {\n            isPotential = true;\n          }\n          if (isPotential && isNameSpecified(seriesModel)) {\n            potentialData.push(seriesModel.name);\n          }\n        });\n        /**\r\n         * @type {Array.<string>}\r\n         * @private\r\n         */\n        this._availableNames = availableNames;\n        // If legend.data is not specified in option, use availableNames as data,\n        // which is convenient for user preparing option.\n        var rawData = this.get('data') || potentialData;\n        var legendNameMap = createHashMap();\n        var legendData = map(rawData, function (dataItem) {\n          // Can be string or number\n          if (isString(dataItem) || isNumber(dataItem)) {\n            dataItem = {\n              name: dataItem\n            };\n          }\n          if (legendNameMap.get(dataItem.name)) {\n            // remove legend name duplicate\n            return null;\n          }\n          legendNameMap.set(dataItem.name, true);\n          return new Model(dataItem, this, this.ecModel);\n        }, this);\n        /**\r\n         * @type {Array.<module:echarts/model/Model>}\r\n         * @private\r\n         */\n        this._data = filter(legendData, function (item) {\n          return !!item;\n        });\n      };\n      LegendModel.prototype.getData = function () {\n        return this._data;\n      };\n      LegendModel.prototype.select = function (name) {\n        var selected = this.option.selected;\n        var selectedMode = this.get('selectedMode');\n        if (selectedMode === 'single') {\n          var data = this._data;\n          each(data, function (dataItem) {\n            selected[dataItem.get('name')] = false;\n          });\n        }\n        selected[name] = true;\n      };\n      LegendModel.prototype.unSelect = function (name) {\n        if (this.get('selectedMode') !== 'single') {\n          this.option.selected[name] = false;\n        }\n      };\n      LegendModel.prototype.toggleSelected = function (name) {\n        var selected = this.option.selected;\n        // Default is true\n        if (!selected.hasOwnProperty(name)) {\n          selected[name] = true;\n        }\n        this[selected[name] ? 'unSelect' : 'select'](name);\n      };\n      LegendModel.prototype.allSelect = function () {\n        var data = this._data;\n        var selected = this.option.selected;\n        each(data, function (dataItem) {\n          selected[dataItem.get('name', true)] = true;\n        });\n      };\n      LegendModel.prototype.inverseSelect = function () {\n        var data = this._data;\n        var selected = this.option.selected;\n        each(data, function (dataItem) {\n          var name = dataItem.get('name', true);\n          // Initially, default value is true\n          if (!selected.hasOwnProperty(name)) {\n            selected[name] = true;\n          }\n          selected[name] = !selected[name];\n        });\n      };\n      LegendModel.prototype.isSelected = function (name) {\n        var selected = this.option.selected;\n        return !(selected.hasOwnProperty(name) && !selected[name]) && indexOf(this._availableNames, name) >= 0;\n      };\n      LegendModel.prototype.getOrient = function () {\n        return this.get('orient') === 'vertical' ? {\n          index: 1,\n          name: 'vertical'\n        } : {\n          index: 0,\n          name: 'horizontal'\n        };\n      };\n      LegendModel.type = 'legend.plain';\n      LegendModel.dependencies = ['series'];\n      LegendModel.defaultOption = {\n        // zlevel: 0,\n        z: 4,\n        show: true,\n        orient: 'horizontal',\n        left: 'center',\n        // right: 'center',\n        top: 0,\n        // bottom: null,\n        align: 'auto',\n        backgroundColor: 'rgba(0,0,0,0)',\n        borderColor: '#ccc',\n        borderRadius: 0,\n        borderWidth: 0,\n        padding: 5,\n        itemGap: 10,\n        itemWidth: 25,\n        itemHeight: 14,\n        symbolRotate: 'inherit',\n        symbolKeepAspect: true,\n        inactiveColor: '#ccc',\n        inactiveBorderColor: '#ccc',\n        inactiveBorderWidth: 'auto',\n        itemStyle: {\n          color: 'inherit',\n          opacity: 'inherit',\n          borderColor: 'inherit',\n          borderWidth: 'auto',\n          borderCap: 'inherit',\n          borderJoin: 'inherit',\n          borderDashOffset: 'inherit',\n          borderMiterLimit: 'inherit'\n        },\n        lineStyle: {\n          width: 'auto',\n          color: 'inherit',\n          inactiveColor: '#ccc',\n          inactiveWidth: 2,\n          opacity: 'inherit',\n          type: 'inherit',\n          cap: 'inherit',\n          join: 'inherit',\n          dashOffset: 'inherit',\n          miterLimit: 'inherit'\n        },\n        textStyle: {\n          color: '#333'\n        },\n        selectedMode: true,\n        selector: false,\n        selectorLabel: {\n          show: true,\n          borderRadius: 10,\n          padding: [3, 5, 3, 5],\n          fontSize: 12,\n          fontFamily: 'sans-serif',\n          color: '#666',\n          borderWidth: 1,\n          borderColor: '#666'\n        },\n        emphasis: {\n          selectorLabel: {\n            show: true,\n            color: '#eee',\n            backgroundColor: '#666'\n          }\n        },\n        selectorPosition: 'auto',\n        selectorItemGap: 7,\n        selectorButtonGap: 10,\n        tooltip: {\n          show: false\n        }\n      };\n      return LegendModel;\n    }(ComponentModel);\n\n    var curry$1 = curry;\n    var each$c = each;\n    var Group$2 = Group;\n    var LegendView = /** @class */function (_super) {\n      __extends(LegendView, _super);\n      function LegendView() {\n        var _this = _super !== null && _super.apply(this, arguments) || this;\n        _this.type = LegendView.type;\n        _this.newlineDisabled = false;\n        return _this;\n      }\n      LegendView.prototype.init = function () {\n        this.group.add(this._contentGroup = new Group$2());\n        this.group.add(this._selectorGroup = new Group$2());\n        this._isFirstRender = true;\n      };\n      /**\r\n       * @protected\r\n       */\n      LegendView.prototype.getContentGroup = function () {\n        return this._contentGroup;\n      };\n      /**\r\n       * @protected\r\n       */\n      LegendView.prototype.getSelectorGroup = function () {\n        return this._selectorGroup;\n      };\n      /**\r\n       * @override\r\n       */\n      LegendView.prototype.render = function (legendModel, ecModel, api) {\n        var isFirstRender = this._isFirstRender;\n        this._isFirstRender = false;\n        this.resetInner();\n        if (!legendModel.get('show', true)) {\n          return;\n        }\n        var itemAlign = legendModel.get('align');\n        var orient = legendModel.get('orient');\n        if (!itemAlign || itemAlign === 'auto') {\n          itemAlign = legendModel.get('left') === 'right' && orient === 'vertical' ? 'right' : 'left';\n        }\n        // selector has been normalized to an array in model\n        var selector = legendModel.get('selector', true);\n        var selectorPosition = legendModel.get('selectorPosition', true);\n        if (selector && (!selectorPosition || selectorPosition === 'auto')) {\n          selectorPosition = orient === 'horizontal' ? 'end' : 'start';\n        }\n        this.renderInner(itemAlign, legendModel, ecModel, api, selector, orient, selectorPosition);\n        // Perform layout.\n        var positionInfo = legendModel.getBoxLayoutParams();\n        var viewportSize = {\n          width: api.getWidth(),\n          height: api.getHeight()\n        };\n        var padding = legendModel.get('padding');\n        var maxSize = getLayoutRect(positionInfo, viewportSize, padding);\n        var mainRect = this.layoutInner(legendModel, itemAlign, maxSize, isFirstRender, selector, selectorPosition);\n        // Place mainGroup, based on the calculated `mainRect`.\n        var layoutRect = getLayoutRect(defaults({\n          width: mainRect.width,\n          height: mainRect.height\n        }, positionInfo), viewportSize, padding);\n        this.group.x = layoutRect.x - mainRect.x;\n        this.group.y = layoutRect.y - mainRect.y;\n        this.group.markRedraw();\n        // Render background after group is layout.\n        this.group.add(this._backgroundEl = makeBackground(mainRect, legendModel));\n      };\n      LegendView.prototype.resetInner = function () {\n        this.getContentGroup().removeAll();\n        this._backgroundEl && this.group.remove(this._backgroundEl);\n        this.getSelectorGroup().removeAll();\n      };\n      LegendView.prototype.renderInner = function (itemAlign, legendModel, ecModel, api, selector, orient, selectorPosition) {\n        var contentGroup = this.getContentGroup();\n        var legendDrawnMap = createHashMap();\n        var selectMode = legendModel.get('selectedMode');\n        var excludeSeriesId = [];\n        ecModel.eachRawSeries(function (seriesModel) {\n          !seriesModel.get('legendHoverLink') && excludeSeriesId.push(seriesModel.id);\n        });\n        each$c(legendModel.getData(), function (legendItemModel, dataIndex) {\n          var name = legendItemModel.get('name');\n          // Use empty string or \\n as a newline string\n          if (!this.newlineDisabled && (name === '' || name === '\\n')) {\n            var g = new Group$2();\n            // @ts-ignore\n            g.newline = true;\n            contentGroup.add(g);\n            return;\n          }\n          // Representitive series.\n          var seriesModel = ecModel.getSeriesByName(name)[0];\n          if (legendDrawnMap.get(name)) {\n            // Have been drawn\n            return;\n          }\n          // Legend to control series.\n          if (seriesModel) {\n            var data = seriesModel.getData();\n            var lineVisualStyle = data.getVisual('legendLineStyle') || {};\n            var legendIcon = data.getVisual('legendIcon');\n            /**\r\n             * `data.getVisual('style')` may be the color from the register\r\n             * in series. For example, for line series,\r\n             */\n            var style = data.getVisual('style');\n            var itemGroup = this._createItem(seriesModel, name, dataIndex, legendItemModel, legendModel, itemAlign, lineVisualStyle, style, legendIcon, selectMode, api);\n            itemGroup.on('click', curry$1(dispatchSelectAction, name, null, api, excludeSeriesId)).on('mouseover', curry$1(dispatchHighlightAction, seriesModel.name, null, api, excludeSeriesId)).on('mouseout', curry$1(dispatchDownplayAction, seriesModel.name, null, api, excludeSeriesId));\n            if (ecModel.ssr) {\n              itemGroup.eachChild(function (child) {\n                var ecData = getECData(child);\n                ecData.seriesIndex = seriesModel.seriesIndex;\n                ecData.dataIndex = dataIndex;\n                ecData.ssrType = 'legend';\n              });\n            }\n            legendDrawnMap.set(name, true);\n          } else {\n            // Legend to control data. In pie and funnel.\n            ecModel.eachRawSeries(function (seriesModel) {\n              // In case multiple series has same data name\n              if (legendDrawnMap.get(name)) {\n                return;\n              }\n              if (seriesModel.legendVisualProvider) {\n                var provider = seriesModel.legendVisualProvider;\n                if (!provider.containName(name)) {\n                  return;\n                }\n                var idx = provider.indexOfName(name);\n                var style = provider.getItemVisual(idx, 'style');\n                var legendIcon = provider.getItemVisual(idx, 'legendIcon');\n                var colorArr = parse(style.fill);\n                // Color may be set to transparent in visualMap when data is out of range.\n                // Do not show nothing.\n                if (colorArr && colorArr[3] === 0) {\n                  colorArr[3] = 0.2;\n                  // TODO color is set to 0, 0, 0, 0. Should show correct RGBA\n                  style = extend(extend({}, style), {\n                    fill: stringify(colorArr, 'rgba')\n                  });\n                }\n                var itemGroup = this._createItem(seriesModel, name, dataIndex, legendItemModel, legendModel, itemAlign, {}, style, legendIcon, selectMode, api);\n                // FIXME: consider different series has items with the same name.\n                itemGroup.on('click', curry$1(dispatchSelectAction, null, name, api, excludeSeriesId))\n                // Should not specify the series name, consider legend controls\n                // more than one pie series.\n                .on('mouseover', curry$1(dispatchHighlightAction, null, name, api, excludeSeriesId)).on('mouseout', curry$1(dispatchDownplayAction, null, name, api, excludeSeriesId));\n                if (ecModel.ssr) {\n                  itemGroup.eachChild(function (child) {\n                    var ecData = getECData(child);\n                    ecData.seriesIndex = seriesModel.seriesIndex;\n                    ecData.dataIndex = dataIndex;\n                    ecData.ssrType = 'legend';\n                  });\n                }\n                legendDrawnMap.set(name, true);\n              }\n            }, this);\n          }\n          if (\"development\" !== 'production') {\n            if (!legendDrawnMap.get(name)) {\n              console.warn(name + ' series not exists. Legend data should be same with series name or data name.');\n            }\n          }\n        }, this);\n        if (selector) {\n          this._createSelector(selector, legendModel, api, orient, selectorPosition);\n        }\n      };\n      LegendView.prototype._createSelector = function (selector, legendModel, api, orient, selectorPosition) {\n        var selectorGroup = this.getSelectorGroup();\n        each$c(selector, function createSelectorButton(selectorItem) {\n          var type = selectorItem.type;\n          var labelText = new ZRText({\n            style: {\n              x: 0,\n              y: 0,\n              align: 'center',\n              verticalAlign: 'middle'\n            },\n            onclick: function () {\n              api.dispatchAction({\n                type: type === 'all' ? 'legendAllSelect' : 'legendInverseSelect',\n                legendId: legendModel.id\n              });\n            }\n          });\n          selectorGroup.add(labelText);\n          var labelModel = legendModel.getModel('selectorLabel');\n          var emphasisLabelModel = legendModel.getModel(['emphasis', 'selectorLabel']);\n          setLabelStyle(labelText, {\n            normal: labelModel,\n            emphasis: emphasisLabelModel\n          }, {\n            defaultText: selectorItem.title\n          });\n          enableHoverEmphasis(labelText);\n        });\n      };\n      LegendView.prototype._createItem = function (seriesModel, name, dataIndex, legendItemModel, legendModel, itemAlign, lineVisualStyle, itemVisualStyle, legendIcon, selectMode, api) {\n        var drawType = seriesModel.visualDrawType;\n        var itemWidth = legendModel.get('itemWidth');\n        var itemHeight = legendModel.get('itemHeight');\n        var isSelected = legendModel.isSelected(name);\n        var iconRotate = legendItemModel.get('symbolRotate');\n        var symbolKeepAspect = legendItemModel.get('symbolKeepAspect');\n        var legendIconType = legendItemModel.get('icon');\n        legendIcon = legendIconType || legendIcon || 'roundRect';\n        var style = getLegendStyle(legendIcon, legendItemModel, lineVisualStyle, itemVisualStyle, drawType, isSelected, api);\n        var itemGroup = new Group$2();\n        var textStyleModel = legendItemModel.getModel('textStyle');\n        if (isFunction(seriesModel.getLegendIcon) && (!legendIconType || legendIconType === 'inherit')) {\n          // Series has specific way to define legend icon\n          itemGroup.add(seriesModel.getLegendIcon({\n            itemWidth: itemWidth,\n            itemHeight: itemHeight,\n            icon: legendIcon,\n            iconRotate: iconRotate,\n            itemStyle: style.itemStyle,\n            lineStyle: style.lineStyle,\n            symbolKeepAspect: symbolKeepAspect\n          }));\n        } else {\n          // Use default legend icon policy for most series\n          var rotate = legendIconType === 'inherit' && seriesModel.getData().getVisual('symbol') ? iconRotate === 'inherit' ? seriesModel.getData().getVisual('symbolRotate') : iconRotate : 0; // No rotation for no icon\n          itemGroup.add(getDefaultLegendIcon({\n            itemWidth: itemWidth,\n            itemHeight: itemHeight,\n            icon: legendIcon,\n            iconRotate: rotate,\n            itemStyle: style.itemStyle,\n            lineStyle: style.lineStyle,\n            symbolKeepAspect: symbolKeepAspect\n          }));\n        }\n        var textX = itemAlign === 'left' ? itemWidth + 5 : -5;\n        var textAlign = itemAlign;\n        var formatter = legendModel.get('formatter');\n        var content = name;\n        if (isString(formatter) && formatter) {\n          content = formatter.replace('{name}', name != null ? name : '');\n        } else if (isFunction(formatter)) {\n          content = formatter(name);\n        }\n        var textColor = isSelected ? textStyleModel.getTextColor() : legendItemModel.get('inactiveColor');\n        itemGroup.add(new ZRText({\n          style: createTextStyle(textStyleModel, {\n            text: content,\n            x: textX,\n            y: itemHeight / 2,\n            fill: textColor,\n            align: textAlign,\n            verticalAlign: 'middle'\n          }, {\n            inheritColor: textColor\n          })\n        }));\n        // Add a invisible rect to increase the area of mouse hover\n        var hitRect = new Rect({\n          shape: itemGroup.getBoundingRect(),\n          style: {\n            // Cannot use 'invisible' because SVG SSR will miss the node\n            fill: 'transparent'\n          }\n        });\n        var tooltipModel = legendItemModel.getModel('tooltip');\n        if (tooltipModel.get('show')) {\n          setTooltipConfig({\n            el: hitRect,\n            componentModel: legendModel,\n            itemName: name,\n            itemTooltipOption: tooltipModel.option\n          });\n        }\n        itemGroup.add(hitRect);\n        itemGroup.eachChild(function (child) {\n          child.silent = true;\n        });\n        hitRect.silent = !selectMode;\n        this.getContentGroup().add(itemGroup);\n        enableHoverEmphasis(itemGroup);\n        // @ts-ignore\n        itemGroup.__legendDataIndex = dataIndex;\n        return itemGroup;\n      };\n      LegendView.prototype.layoutInner = function (legendModel, itemAlign, maxSize, isFirstRender, selector, selectorPosition) {\n        var contentGroup = this.getContentGroup();\n        var selectorGroup = this.getSelectorGroup();\n        // Place items in contentGroup.\n        box(legendModel.get('orient'), contentGroup, legendModel.get('itemGap'), maxSize.width, maxSize.height);\n        var contentRect = contentGroup.getBoundingRect();\n        var contentPos = [-contentRect.x, -contentRect.y];\n        selectorGroup.markRedraw();\n        contentGroup.markRedraw();\n        if (selector) {\n          // Place buttons in selectorGroup\n          box(\n          // Buttons in selectorGroup always layout horizontally\n          'horizontal', selectorGroup, legendModel.get('selectorItemGap', true));\n          var selectorRect = selectorGroup.getBoundingRect();\n          var selectorPos = [-selectorRect.x, -selectorRect.y];\n          var selectorButtonGap = legendModel.get('selectorButtonGap', true);\n          var orientIdx = legendModel.getOrient().index;\n          var wh = orientIdx === 0 ? 'width' : 'height';\n          var hw = orientIdx === 0 ? 'height' : 'width';\n          var yx = orientIdx === 0 ? 'y' : 'x';\n          if (selectorPosition === 'end') {\n            selectorPos[orientIdx] += contentRect[wh] + selectorButtonGap;\n          } else {\n            contentPos[orientIdx] += selectorRect[wh] + selectorButtonGap;\n          }\n          // Always align selector to content as 'middle'\n          selectorPos[1 - orientIdx] += contentRect[hw] / 2 - selectorRect[hw] / 2;\n          selectorGroup.x = selectorPos[0];\n          selectorGroup.y = selectorPos[1];\n          contentGroup.x = contentPos[0];\n          contentGroup.y = contentPos[1];\n          var mainRect = {\n            x: 0,\n            y: 0\n          };\n          mainRect[wh] = contentRect[wh] + selectorButtonGap + selectorRect[wh];\n          mainRect[hw] = Math.max(contentRect[hw], selectorRect[hw]);\n          mainRect[yx] = Math.min(0, selectorRect[yx] + selectorPos[1 - orientIdx]);\n          return mainRect;\n        } else {\n          contentGroup.x = contentPos[0];\n          contentGroup.y = contentPos[1];\n          return this.group.getBoundingRect();\n        }\n      };\n      /**\r\n       * @protected\r\n       */\n      LegendView.prototype.remove = function () {\n        this.getContentGroup().removeAll();\n        this._isFirstRender = true;\n      };\n      LegendView.type = 'legend.plain';\n      return LegendView;\n    }(ComponentView);\n    function getLegendStyle(iconType, legendItemModel, lineVisualStyle, itemVisualStyle, drawType, isSelected, api) {\n      /**\r\n       * Use series style if is inherit;\r\n       * elsewise, use legend style\r\n       */\n      function handleCommonProps(style, visualStyle) {\n        // If lineStyle.width is 'auto', it is set to be 2 if series has border\n        if (style.lineWidth === 'auto') {\n          style.lineWidth = visualStyle.lineWidth > 0 ? 2 : 0;\n        }\n        each$c(style, function (propVal, propName) {\n          style[propName] === 'inherit' && (style[propName] = visualStyle[propName]);\n        });\n      }\n      // itemStyle\n      var itemStyleModel = legendItemModel.getModel('itemStyle');\n      var itemStyle = itemStyleModel.getItemStyle();\n      var iconBrushType = iconType.lastIndexOf('empty', 0) === 0 ? 'fill' : 'stroke';\n      var decalStyle = itemStyleModel.getShallow('decal');\n      itemStyle.decal = !decalStyle || decalStyle === 'inherit' ? itemVisualStyle.decal : createOrUpdatePatternFromDecal(decalStyle, api);\n      if (itemStyle.fill === 'inherit') {\n        /**\r\n         * Series with visualDrawType as 'stroke' should have\r\n         * series stroke as legend fill\r\n         */\n        itemStyle.fill = itemVisualStyle[drawType];\n      }\n      if (itemStyle.stroke === 'inherit') {\n        /**\r\n         * icon type with \"emptyXXX\" should use fill color\r\n         * in visual style\r\n         */\n        itemStyle.stroke = itemVisualStyle[iconBrushType];\n      }\n      if (itemStyle.opacity === 'inherit') {\n        /**\r\n         * Use lineStyle.opacity if drawType is stroke\r\n         */\n        itemStyle.opacity = (drawType === 'fill' ? itemVisualStyle : lineVisualStyle).opacity;\n      }\n      handleCommonProps(itemStyle, itemVisualStyle);\n      // lineStyle\n      var legendLineModel = legendItemModel.getModel('lineStyle');\n      var lineStyle = legendLineModel.getLineStyle();\n      handleCommonProps(lineStyle, lineVisualStyle);\n      // Fix auto color to real color\n      itemStyle.fill === 'auto' && (itemStyle.fill = itemVisualStyle.fill);\n      itemStyle.stroke === 'auto' && (itemStyle.stroke = itemVisualStyle.fill);\n      lineStyle.stroke === 'auto' && (lineStyle.stroke = itemVisualStyle.fill);\n      if (!isSelected) {\n        var borderWidth = legendItemModel.get('inactiveBorderWidth');\n        /**\r\n         * Since stroke is set to be inactiveBorderColor, it may occur that\r\n         * there is no border in series but border in legend, so we need to\r\n         * use border only when series has border if is set to be auto\r\n         */\n        var visualHasBorder = itemStyle[iconBrushType];\n        itemStyle.lineWidth = borderWidth === 'auto' ? itemVisualStyle.lineWidth > 0 && visualHasBorder ? 2 : 0 : itemStyle.lineWidth;\n        itemStyle.fill = legendItemModel.get('inactiveColor');\n        itemStyle.stroke = legendItemModel.get('inactiveBorderColor');\n        lineStyle.stroke = legendLineModel.get('inactiveColor');\n        lineStyle.lineWidth = legendLineModel.get('inactiveWidth');\n      }\n      return {\n        itemStyle: itemStyle,\n        lineStyle: lineStyle\n      };\n    }\n    function getDefaultLegendIcon(opt) {\n      var symboType = opt.icon || 'roundRect';\n      var icon = createSymbol(symboType, 0, 0, opt.itemWidth, opt.itemHeight, opt.itemStyle.fill, opt.symbolKeepAspect);\n      icon.setStyle(opt.itemStyle);\n      icon.rotation = (opt.iconRotate || 0) * Math.PI / 180;\n      icon.setOrigin([opt.itemWidth / 2, opt.itemHeight / 2]);\n      if (symboType.indexOf('empty') > -1) {\n        icon.style.stroke = icon.style.fill;\n        icon.style.fill = '#fff';\n        icon.style.lineWidth = 2;\n      }\n      return icon;\n    }\n    function dispatchSelectAction(seriesName, dataName, api, excludeSeriesId) {\n      // downplay before unselect\n      dispatchDownplayAction(seriesName, dataName, api, excludeSeriesId);\n      api.dispatchAction({\n        type: 'legendToggleSelect',\n        name: seriesName != null ? seriesName : dataName\n      });\n      // highlight after select\n      // TODO highlight immediately may cause animation loss.\n      dispatchHighlightAction(seriesName, dataName, api, excludeSeriesId);\n    }\n    function isUseHoverLayer(api) {\n      var list = api.getZr().storage.getDisplayList();\n      var emphasisState;\n      var i = 0;\n      var len = list.length;\n      while (i < len && !(emphasisState = list[i].states.emphasis)) {\n        i++;\n      }\n      return emphasisState && emphasisState.hoverLayer;\n    }\n    function dispatchHighlightAction(seriesName, dataName, api, excludeSeriesId) {\n      // If element hover will move to a hoverLayer.\n      if (!isUseHoverLayer(api)) {\n        api.dispatchAction({\n          type: 'highlight',\n          seriesName: seriesName,\n          name: dataName,\n          excludeSeriesId: excludeSeriesId\n        });\n      }\n    }\n    function dispatchDownplayAction(seriesName, dataName, api, excludeSeriesId) {\n      // If element hover will move to a hoverLayer.\n      if (!isUseHoverLayer(api)) {\n        api.dispatchAction({\n          type: 'downplay',\n          seriesName: seriesName,\n          name: dataName,\n          excludeSeriesId: excludeSeriesId\n        });\n      }\n    }\n\n    /*\n    * Licensed to the Apache Software Foundation (ASF) under one\n    * or more contributor license agreements.  See the NOTICE file\n    * distributed with this work for additional information\n    * regarding copyright ownership.  The ASF licenses this file\n    * to you under the Apache License, Version 2.0 (the\n    * \"License\"); you may not use this file except in compliance\n    * with the License.  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,\n    * software distributed under the License is distributed on an\n    * \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\n    * KIND, either express or implied.  See the License for the\n    * specific language governing permissions and limitations\n    * under the License.\n    */\n\n\n    /**\n     * AUTO-GENERATED FILE. DO NOT MODIFY.\n     */\n\n    /*\r\n    * Licensed to the Apache Software Foundation (ASF) under one\r\n    * or more contributor license agreements.  See the NOTICE file\r\n    * distributed with this work for additional information\r\n    * regarding copyright ownership.  The ASF licenses this file\r\n    * to you under the Apache License, Version 2.0 (the\r\n    * \"License\"); you may not use this file except in compliance\r\n    * with the License.  You may obtain a copy of the License at\r\n    *\r\n    *   http://www.apache.org/licenses/LICENSE-2.0\r\n    *\r\n    * Unless required by applicable law or agreed to in writing,\r\n    * software distributed under the License is distributed on an\r\n    * \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\r\n    * KIND, either express or implied.  See the License for the\r\n    * specific language governing permissions and limitations\r\n    * under the License.\r\n    */\n    function legendFilter(ecModel) {\n      var legendModels = ecModel.findComponents({\n        mainType: 'legend'\n      });\n      if (legendModels && legendModels.length) {\n        ecModel.filterSeries(function (series) {\n          // If in any legend component the status is not selected.\n          // Because in legend series is assumed selected when it is not in the legend data.\n          for (var i = 0; i < legendModels.length; i++) {\n            if (!legendModels[i].isSelected(series.name)) {\n              return false;\n            }\n          }\n          return true;\n        });\n      }\n    }\n\n    function legendSelectActionHandler(methodName, payload, ecModel) {\n      var isAllSelect = methodName === 'allSelect' || methodName === 'inverseSelect';\n      var selectedMap = {};\n      var actionLegendIndices = [];\n      ecModel.eachComponent({\n        mainType: 'legend',\n        query: payload\n      }, function (legendModel) {\n        if (isAllSelect) {\n          legendModel[methodName]();\n        } else {\n          legendModel[methodName](payload.name);\n        }\n        makeSelectedMap(legendModel, selectedMap);\n        actionLegendIndices.push(legendModel.componentIndex);\n      });\n      var allSelectedMap = {};\n      // make selectedMap from all legend components\n      ecModel.eachComponent('legend', function (legendModel) {\n        each(selectedMap, function (isSelected, name) {\n          // Force other legend has same selected status\n          // Or the first is toggled to true and other are toggled to false\n          // In the case one legend has some item unSelected in option. And if other legend\n          // doesn't has the item, they will assume it is selected.\n          legendModel[isSelected ? 'select' : 'unSelect'](name);\n        });\n        makeSelectedMap(legendModel, allSelectedMap);\n      });\n      // Return the event explicitly\n      return isAllSelect ? {\n        selected: allSelectedMap,\n        // return legendIndex array to tell the developers which legends are allSelect / inverseSelect\n        legendIndex: actionLegendIndices\n      } : {\n        name: payload.name,\n        selected: allSelectedMap\n      };\n    }\n    function makeSelectedMap(legendModel, out) {\n      var selectedMap = out || {};\n      each(legendModel.getData(), function (model) {\n        var name = model.get('name');\n        // Wrap element\n        if (name === '\\n' || name === '') {\n          return;\n        }\n        var isItemSelected = legendModel.isSelected(name);\n        if (hasOwn(selectedMap, name)) {\n          // Unselected if any legend is unselected\n          selectedMap[name] = selectedMap[name] && isItemSelected;\n        } else {\n          selectedMap[name] = isItemSelected;\n        }\n      });\n      return selectedMap;\n    }\n    function installLegendAction(registers) {\n      /**\r\n       * @event legendToggleSelect\r\n       * @type {Object}\r\n       * @property {string} type 'legendToggleSelect'\r\n       * @property {string} [from]\r\n       * @property {string} name Series name or data item name\r\n       */\n      registers.registerAction('legendToggleSelect', 'legendselectchanged', curry(legendSelectActionHandler, 'toggleSelected'));\n      registers.registerAction('legendAllSelect', 'legendselectall', curry(legendSelectActionHandler, 'allSelect'));\n      registers.registerAction('legendInverseSelect', 'legendinverseselect', curry(legendSelectActionHandler, 'inverseSelect'));\n      /**\r\n       * @event legendSelect\r\n       * @type {Object}\r\n       * @property {string} type 'legendSelect'\r\n       * @property {string} name Series name or data item name\r\n       */\n      registers.registerAction('legendSelect', 'legendselected', curry(legendSelectActionHandler, 'select'));\n      /**\r\n       * @event legendUnSelect\r\n       * @type {Object}\r\n       * @property {string} type 'legendUnSelect'\r\n       * @property {string} name Series name or data item name\r\n       */\n      registers.registerAction('legendUnSelect', 'legendunselected', curry(legendSelectActionHandler, 'unSelect'));\n    }\n\n    function install$H(registers) {\n      registers.registerComponentModel(LegendModel);\n      registers.registerComponentView(LegendView);\n      registers.registerProcessor(registers.PRIORITY.PROCESSOR.SERIES_FILTER, legendFilter);\n      registers.registerSubTypeDefaulter('legend', function () {\n        return 'plain';\n      });\n      installLegendAction(registers);\n    }\n\n    var ScrollableLegendModel = /** @class */function (_super) {\n      __extends(ScrollableLegendModel, _super);\n      function ScrollableLegendModel() {\n        var _this = _super !== null && _super.apply(this, arguments) || this;\n        _this.type = ScrollableLegendModel.type;\n        return _this;\n      }\n      /**\r\n       * @param {number} scrollDataIndex\r\n       */\n      ScrollableLegendModel.prototype.setScrollDataIndex = function (scrollDataIndex) {\n        this.option.scrollDataIndex = scrollDataIndex;\n      };\n      ScrollableLegendModel.prototype.init = function (option, parentModel, ecModel) {\n        var inputPositionParams = getLayoutParams(option);\n        _super.prototype.init.call(this, option, parentModel, ecModel);\n        mergeAndNormalizeLayoutParams$1(this, option, inputPositionParams);\n      };\n      /**\r\n       * @override\r\n       */\n      ScrollableLegendModel.prototype.mergeOption = function (option, ecModel) {\n        _super.prototype.mergeOption.call(this, option, ecModel);\n        mergeAndNormalizeLayoutParams$1(this, this.option, option);\n      };\n      ScrollableLegendModel.type = 'legend.scroll';\n      ScrollableLegendModel.defaultOption = inheritDefaultOption(LegendModel.defaultOption, {\n        scrollDataIndex: 0,\n        pageButtonItemGap: 5,\n        pageButtonGap: null,\n        pageButtonPosition: 'end',\n        pageFormatter: '{current}/{total}',\n        pageIcons: {\n          horizontal: ['M0,0L12,-10L12,10z', 'M0,0L-12,-10L-12,10z'],\n          vertical: ['M0,0L20,0L10,-20z', 'M0,0L20,0L10,20z']\n        },\n        pageIconColor: '#2f4554',\n        pageIconInactiveColor: '#aaa',\n        pageIconSize: 15,\n        pageTextStyle: {\n          color: '#333'\n        },\n        animationDurationUpdate: 800\n      });\n      return ScrollableLegendModel;\n    }(LegendModel);\n    // Do not `ignoreSize` to enable setting {left: 10, right: 10}.\n    function mergeAndNormalizeLayoutParams$1(legendModel, target, raw) {\n      var orient = legendModel.getOrient();\n      var ignoreSize = [1, 1];\n      ignoreSize[orient.index] = 0;\n      mergeLayoutParam(target, raw, {\n        type: 'box',\n        ignoreSize: !!ignoreSize\n      });\n    }\n\n    var Group$3 = Group;\n    var WH$1 = ['width', 'height'];\n    var XY$1 = ['x', 'y'];\n    var ScrollableLegendView = /** @class */function (_super) {\n      __extends(ScrollableLegendView, _super);\n      function ScrollableLegendView() {\n        var _this = _super !== null && _super.apply(this, arguments) || this;\n        _this.type = ScrollableLegendView.type;\n        _this.newlineDisabled = true;\n        _this._currentIndex = 0;\n        return _this;\n      }\n      ScrollableLegendView.prototype.init = function () {\n        _super.prototype.init.call(this);\n        this.group.add(this._containerGroup = new Group$3());\n        this._containerGroup.add(this.getContentGroup());\n        this.group.add(this._controllerGroup = new Group$3());\n      };\n      /**\r\n       * @override\r\n       */\n      ScrollableLegendView.prototype.resetInner = function () {\n        _super.prototype.resetInner.call(this);\n        this._controllerGroup.removeAll();\n        this._containerGroup.removeClipPath();\n        this._containerGroup.__rectSize = null;\n      };\n      /**\r\n       * @override\r\n       */\n      ScrollableLegendView.prototype.renderInner = function (itemAlign, legendModel, ecModel, api, selector, orient, selectorPosition) {\n        var self = this;\n        // Render content items.\n        _super.prototype.renderInner.call(this, itemAlign, legendModel, ecModel, api, selector, orient, selectorPosition);\n        var controllerGroup = this._controllerGroup;\n        // FIXME: support be 'auto' adapt to size number text length,\n        // e.g., '3/12345' should not overlap with the control arrow button.\n        var pageIconSize = legendModel.get('pageIconSize', true);\n        var pageIconSizeArr = isArray(pageIconSize) ? pageIconSize : [pageIconSize, pageIconSize];\n        createPageButton('pagePrev', 0);\n        var pageTextStyleModel = legendModel.getModel('pageTextStyle');\n        controllerGroup.add(new ZRText({\n          name: 'pageText',\n          style: {\n            // Placeholder to calculate a proper layout.\n            text: 'xx/xx',\n            fill: pageTextStyleModel.getTextColor(),\n            font: pageTextStyleModel.getFont(),\n            verticalAlign: 'middle',\n            align: 'center'\n          },\n          silent: true\n        }));\n        createPageButton('pageNext', 1);\n        function createPageButton(name, iconIdx) {\n          var pageDataIndexName = name + 'DataIndex';\n          var icon = createIcon(legendModel.get('pageIcons', true)[legendModel.getOrient().name][iconIdx], {\n            // Buttons will be created in each render, so we do not need\n            // to worry about avoiding using legendModel kept in scope.\n            onclick: bind(self._pageGo, self, pageDataIndexName, legendModel, api)\n          }, {\n            x: -pageIconSizeArr[0] / 2,\n            y: -pageIconSizeArr[1] / 2,\n            width: pageIconSizeArr[0],\n            height: pageIconSizeArr[1]\n          });\n          icon.name = name;\n          controllerGroup.add(icon);\n        }\n      };\n      /**\r\n       * @override\r\n       */\n      ScrollableLegendView.prototype.layoutInner = function (legendModel, itemAlign, maxSize, isFirstRender, selector, selectorPosition) {\n        var selectorGroup = this.getSelectorGroup();\n        var orientIdx = legendModel.getOrient().index;\n        var wh = WH$1[orientIdx];\n        var xy = XY$1[orientIdx];\n        var hw = WH$1[1 - orientIdx];\n        var yx = XY$1[1 - orientIdx];\n        selector && box(\n        // Buttons in selectorGroup always layout horizontally\n        'horizontal', selectorGroup, legendModel.get('selectorItemGap', true));\n        var selectorButtonGap = legendModel.get('selectorButtonGap', true);\n        var selectorRect = selectorGroup.getBoundingRect();\n        var selectorPos = [-selectorRect.x, -selectorRect.y];\n        var processMaxSize = clone(maxSize);\n        selector && (processMaxSize[wh] = maxSize[wh] - selectorRect[wh] - selectorButtonGap);\n        var mainRect = this._layoutContentAndController(legendModel, isFirstRender, processMaxSize, orientIdx, wh, hw, yx, xy);\n        if (selector) {\n          if (selectorPosition === 'end') {\n            selectorPos[orientIdx] += mainRect[wh] + selectorButtonGap;\n          } else {\n            var offset = selectorRect[wh] + selectorButtonGap;\n            selectorPos[orientIdx] -= offset;\n            mainRect[xy] -= offset;\n          }\n          mainRect[wh] += selectorRect[wh] + selectorButtonGap;\n          selectorPos[1 - orientIdx] += mainRect[yx] + mainRect[hw] / 2 - selectorRect[hw] / 2;\n          mainRect[hw] = Math.max(mainRect[hw], selectorRect[hw]);\n          mainRect[yx] = Math.min(mainRect[yx], selectorRect[yx] + selectorPos[1 - orientIdx]);\n          selectorGroup.x = selectorPos[0];\n          selectorGroup.y = selectorPos[1];\n          selectorGroup.markRedraw();\n        }\n        return mainRect;\n      };\n      ScrollableLegendView.prototype._layoutContentAndController = function (legendModel, isFirstRender, maxSize, orientIdx, wh, hw, yx, xy) {\n        var contentGroup = this.getContentGroup();\n        var containerGroup = this._containerGroup;\n        var controllerGroup = this._controllerGroup;\n        // Place items in contentGroup.\n        box(legendModel.get('orient'), contentGroup, legendModel.get('itemGap'), !orientIdx ? null : maxSize.width, orientIdx ? null : maxSize.height);\n        box(\n        // Buttons in controller are layout always horizontally.\n        'horizontal', controllerGroup, legendModel.get('pageButtonItemGap', true));\n        var contentRect = contentGroup.getBoundingRect();\n        var controllerRect = controllerGroup.getBoundingRect();\n        var showController = this._showController = contentRect[wh] > maxSize[wh];\n        // In case that the inner elements of contentGroup layout do not based on [0, 0]\n        var contentPos = [-contentRect.x, -contentRect.y];\n        // Remain contentPos when scroll animation perfroming.\n        // If first rendering, `contentGroup.position` is [0, 0], which\n        // does not make sense and may cause unexepcted animation if adopted.\n        if (!isFirstRender) {\n          contentPos[orientIdx] = contentGroup[xy];\n        }\n        // Layout container group based on 0.\n        var containerPos = [0, 0];\n        var controllerPos = [-controllerRect.x, -controllerRect.y];\n        var pageButtonGap = retrieve2(legendModel.get('pageButtonGap', true), legendModel.get('itemGap', true));\n        // Place containerGroup and controllerGroup and contentGroup.\n        if (showController) {\n          var pageButtonPosition = legendModel.get('pageButtonPosition', true);\n          // controller is on the right / bottom.\n          if (pageButtonPosition === 'end') {\n            controllerPos[orientIdx] += maxSize[wh] - controllerRect[wh];\n          }\n          // controller is on the left / top.\n          else {\n            containerPos[orientIdx] += controllerRect[wh] + pageButtonGap;\n          }\n        }\n        // Always align controller to content as 'middle'.\n        controllerPos[1 - orientIdx] += contentRect[hw] / 2 - controllerRect[hw] / 2;\n        contentGroup.setPosition(contentPos);\n        containerGroup.setPosition(containerPos);\n        controllerGroup.setPosition(controllerPos);\n        // Calculate `mainRect` and set `clipPath`.\n        // mainRect should not be calculated by `this.group.getBoundingRect()`\n        // for sake of the overflow.\n        var mainRect = {\n          x: 0,\n          y: 0\n        };\n        // Consider content may be overflow (should be clipped).\n        mainRect[wh] = showController ? maxSize[wh] : contentRect[wh];\n        mainRect[hw] = Math.max(contentRect[hw], controllerRect[hw]);\n        // `containerRect[yx] + containerPos[1 - orientIdx]` is 0.\n        mainRect[yx] = Math.min(0, controllerRect[yx] + controllerPos[1 - orientIdx]);\n        containerGroup.__rectSize = maxSize[wh];\n        if (showController) {\n          var clipShape = {\n            x: 0,\n            y: 0\n          };\n          clipShape[wh] = Math.max(maxSize[wh] - controllerRect[wh] - pageButtonGap, 0);\n          clipShape[hw] = mainRect[hw];\n          containerGroup.setClipPath(new Rect({\n            shape: clipShape\n          }));\n          // Consider content may be larger than container, container rect\n          // can not be obtained from `containerGroup.getBoundingRect()`.\n          containerGroup.__rectSize = clipShape[wh];\n        } else {\n          // Do not remove or ignore controller. Keep them set as placeholders.\n          controllerGroup.eachChild(function (child) {\n            child.attr({\n              invisible: true,\n              silent: true\n            });\n          });\n        }\n        // Content translate animation.\n        var pageInfo = this._getPageInfo(legendModel);\n        pageInfo.pageIndex != null && updateProps(contentGroup, {\n          x: pageInfo.contentPosition[0],\n          y: pageInfo.contentPosition[1]\n        },\n        // When switch from \"show controller\" to \"not show controller\", view should be\n        // updated immediately without animation, otherwise causes weird effect.\n        showController ? legendModel : null);\n        this._updatePageInfoView(legendModel, pageInfo);\n        return mainRect;\n      };\n      ScrollableLegendView.prototype._pageGo = function (to, legendModel, api) {\n        var scrollDataIndex = this._getPageInfo(legendModel)[to];\n        scrollDataIndex != null && api.dispatchAction({\n          type: 'legendScroll',\n          scrollDataIndex: scrollDataIndex,\n          legendId: legendModel.id\n        });\n      };\n      ScrollableLegendView.prototype._updatePageInfoView = function (legendModel, pageInfo) {\n        var controllerGroup = this._controllerGroup;\n        each(['pagePrev', 'pageNext'], function (name) {\n          var key = name + 'DataIndex';\n          var canJump = pageInfo[key] != null;\n          var icon = controllerGroup.childOfName(name);\n          if (icon) {\n            icon.setStyle('fill', canJump ? legendModel.get('pageIconColor', true) : legendModel.get('pageIconInactiveColor', true));\n            icon.cursor = canJump ? 'pointer' : 'default';\n          }\n        });\n        var pageText = controllerGroup.childOfName('pageText');\n        var pageFormatter = legendModel.get('pageFormatter');\n        var pageIndex = pageInfo.pageIndex;\n        var current = pageIndex != null ? pageIndex + 1 : 0;\n        var total = pageInfo.pageCount;\n        pageText && pageFormatter && pageText.setStyle('text', isString(pageFormatter) ? pageFormatter.replace('{current}', current == null ? '' : current + '').replace('{total}', total == null ? '' : total + '') : pageFormatter({\n          current: current,\n          total: total\n        }));\n      };\n      /**\r\n       *  contentPosition: Array.<number>, null when data item not found.\r\n       *  pageIndex: number, null when data item not found.\r\n       *  pageCount: number, always be a number, can be 0.\r\n       *  pagePrevDataIndex: number, null when no previous page.\r\n       *  pageNextDataIndex: number, null when no next page.\r\n       * }\r\n       */\n      ScrollableLegendView.prototype._getPageInfo = function (legendModel) {\n        var scrollDataIndex = legendModel.get('scrollDataIndex', true);\n        var contentGroup = this.getContentGroup();\n        var containerRectSize = this._containerGroup.__rectSize;\n        var orientIdx = legendModel.getOrient().index;\n        var wh = WH$1[orientIdx];\n        var xy = XY$1[orientIdx];\n        var targetItemIndex = this._findTargetItemIndex(scrollDataIndex);\n        var children = contentGroup.children();\n        var targetItem = children[targetItemIndex];\n        var itemCount = children.length;\n        var pCount = !itemCount ? 0 : 1;\n        var result = {\n          contentPosition: [contentGroup.x, contentGroup.y],\n          pageCount: pCount,\n          pageIndex: pCount - 1,\n          pagePrevDataIndex: null,\n          pageNextDataIndex: null\n        };\n        if (!targetItem) {\n          return result;\n        }\n        var targetItemInfo = getItemInfo(targetItem);\n        result.contentPosition[orientIdx] = -targetItemInfo.s;\n        // Strategy:\n        // (1) Always align based on the left/top most item.\n        // (2) It is user-friendly that the last item shown in the\n        // current window is shown at the begining of next window.\n        // Otherwise if half of the last item is cut by the window,\n        // it will have no chance to display entirely.\n        // (3) Consider that item size probably be different, we\n        // have calculate pageIndex by size rather than item index,\n        // and we can not get page index directly by division.\n        // (4) The window is to narrow to contain more than\n        // one item, we should make sure that the page can be fliped.\n        for (var i = targetItemIndex + 1, winStartItemInfo = targetItemInfo, winEndItemInfo = targetItemInfo, currItemInfo = null; i <= itemCount; ++i) {\n          currItemInfo = getItemInfo(children[i]);\n          if (\n          // Half of the last item is out of the window.\n          !currItemInfo && winEndItemInfo.e > winStartItemInfo.s + containerRectSize\n          // If the current item does not intersect with the window, the new page\n          // can be started at the current item or the last item.\n          || currItemInfo && !intersect(currItemInfo, winStartItemInfo.s)) {\n            if (winEndItemInfo.i > winStartItemInfo.i) {\n              winStartItemInfo = winEndItemInfo;\n            } else {\n              // e.g., when page size is smaller than item size.\n              winStartItemInfo = currItemInfo;\n            }\n            if (winStartItemInfo) {\n              if (result.pageNextDataIndex == null) {\n                result.pageNextDataIndex = winStartItemInfo.i;\n              }\n              ++result.pageCount;\n            }\n          }\n          winEndItemInfo = currItemInfo;\n        }\n        for (var i = targetItemIndex - 1, winStartItemInfo = targetItemInfo, winEndItemInfo = targetItemInfo, currItemInfo = null; i >= -1; --i) {\n          currItemInfo = getItemInfo(children[i]);\n          if (\n          // If the the end item does not intersect with the window started\n          // from the current item, a page can be settled.\n          (!currItemInfo || !intersect(winEndItemInfo, currItemInfo.s)\n          // e.g., when page size is smaller than item size.\n          ) && winStartItemInfo.i < winEndItemInfo.i) {\n            winEndItemInfo = winStartItemInfo;\n            if (result.pagePrevDataIndex == null) {\n              result.pagePrevDataIndex = winStartItemInfo.i;\n            }\n            ++result.pageCount;\n            ++result.pageIndex;\n          }\n          winStartItemInfo = currItemInfo;\n        }\n        return result;\n        function getItemInfo(el) {\n          if (el) {\n            var itemRect = el.getBoundingRect();\n            var start = itemRect[xy] + el[xy];\n            return {\n              s: start,\n              e: start + itemRect[wh],\n              i: el.__legendDataIndex\n            };\n          }\n        }\n        function intersect(itemInfo, winStart) {\n          return itemInfo.e >= winStart && itemInfo.s <= winStart + containerRectSize;\n        }\n      };\n      ScrollableLegendView.prototype._findTargetItemIndex = function (targetDataIndex) {\n        if (!this._showController) {\n          return 0;\n        }\n        var index;\n        var contentGroup = this.getContentGroup();\n        var defaultIndex;\n        contentGroup.eachChild(function (child, idx) {\n          var legendDataIdx = child.__legendDataIndex;\n          // FIXME\n          // If the given targetDataIndex (from model) is illegal,\n          // we use defaultIndex. But the index on the legend model and\n          // action payload is still illegal. That case will not be\n          // changed until some scenario requires.\n          if (defaultIndex == null && legendDataIdx != null) {\n            defaultIndex = idx;\n          }\n          if (legendDataIdx === targetDataIndex) {\n            index = idx;\n          }\n        });\n        return index != null ? index : defaultIndex;\n      };\n      ScrollableLegendView.type = 'legend.scroll';\n      return ScrollableLegendView;\n    }(LegendView);\n\n    /*\n    * Licensed to the Apache Software Foundation (ASF) under one\n    * or more contributor license agreements.  See the NOTICE file\n    * distributed with this work for additional information\n    * regarding copyright ownership.  The ASF licenses this file\n    * to you under the Apache License, Version 2.0 (the\n    * \"License\"); you may not use this file except in compliance\n    * with the License.  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,\n    * software distributed under the License is distributed on an\n    * \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\n    * KIND, either express or implied.  See the License for the\n    * specific language governing permissions and limitations\n    * under the License.\n    */\n\n\n    /**\n     * AUTO-GENERATED FILE. DO NOT MODIFY.\n     */\n\n    /*\r\n    * Licensed to the Apache Software Foundation (ASF) under one\r\n    * or more contributor license agreements.  See the NOTICE file\r\n    * distributed with this work for additional information\r\n    * regarding copyright ownership.  The ASF licenses this file\r\n    * to you under the Apache License, Version 2.0 (the\r\n    * \"License\"); you may not use this file except in compliance\r\n    * with the License.  You may obtain a copy of the License at\r\n    *\r\n    *   http://www.apache.org/licenses/LICENSE-2.0\r\n    *\r\n    * Unless required by applicable law or agreed to in writing,\r\n    * software distributed under the License is distributed on an\r\n    * \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\r\n    * KIND, either express or implied.  See the License for the\r\n    * specific language governing permissions and limitations\r\n    * under the License.\r\n    */\n    function installScrollableLegendAction(registers) {\n      /**\r\n       * @event legendScroll\r\n       * @type {Object}\r\n       * @property {string} type 'legendScroll'\r\n       * @property {string} scrollDataIndex\r\n       */\n      registers.registerAction('legendScroll', 'legendscroll', function (payload, ecModel) {\n        var scrollDataIndex = payload.scrollDataIndex;\n        scrollDataIndex != null && ecModel.eachComponent({\n          mainType: 'legend',\n          subType: 'scroll',\n          query: payload\n        }, function (legendModel) {\n          legendModel.setScrollDataIndex(scrollDataIndex);\n        });\n      });\n    }\n\n    function install$I(registers) {\n      use(install$H);\n      registers.registerComponentModel(ScrollableLegendModel);\n      registers.registerComponentView(ScrollableLegendView);\n      installScrollableLegendAction(registers);\n    }\n\n    function install$J(registers) {\n      use(install$H);\n      use(install$I);\n    }\n\n    var InsideZoomModel = /** @class */function (_super) {\n      __extends(InsideZoomModel, _super);\n      function InsideZoomModel() {\n        var _this = _super !== null && _super.apply(this, arguments) || this;\n        _this.type = InsideZoomModel.type;\n        return _this;\n      }\n      InsideZoomModel.type = 'dataZoom.inside';\n      InsideZoomModel.defaultOption = inheritDefaultOption(DataZoomModel.defaultOption, {\n        disabled: false,\n        zoomLock: false,\n        zoomOnMouseWheel: true,\n        moveOnMouseMove: true,\n        moveOnMouseWheel: false,\n        preventDefaultMouseMove: true\n      });\n      return InsideZoomModel;\n    }(DataZoomModel);\n\n    var inner$k = makeInner();\n    function setViewInfoToCoordSysRecord(api, dataZoomModel, getRange) {\n      inner$k(api).coordSysRecordMap.each(function (coordSysRecord) {\n        var dzInfo = coordSysRecord.dataZoomInfoMap.get(dataZoomModel.uid);\n        if (dzInfo) {\n          dzInfo.getRange = getRange;\n        }\n      });\n    }\n    function disposeCoordSysRecordIfNeeded(api, dataZoomModel) {\n      var coordSysRecordMap = inner$k(api).coordSysRecordMap;\n      var coordSysKeyArr = coordSysRecordMap.keys();\n      for (var i = 0; i < coordSysKeyArr.length; i++) {\n        var coordSysKey = coordSysKeyArr[i];\n        var coordSysRecord = coordSysRecordMap.get(coordSysKey);\n        var dataZoomInfoMap = coordSysRecord.dataZoomInfoMap;\n        if (dataZoomInfoMap) {\n          var dzUid = dataZoomModel.uid;\n          var dzInfo = dataZoomInfoMap.get(dzUid);\n          if (dzInfo) {\n            dataZoomInfoMap.removeKey(dzUid);\n            if (!dataZoomInfoMap.keys().length) {\n              disposeCoordSysRecord(coordSysRecordMap, coordSysRecord);\n            }\n          }\n        }\n      }\n    }\n    function disposeCoordSysRecord(coordSysRecordMap, coordSysRecord) {\n      if (coordSysRecord) {\n        coordSysRecordMap.removeKey(coordSysRecord.model.uid);\n        var controller = coordSysRecord.controller;\n        controller && controller.dispose();\n      }\n    }\n    function createCoordSysRecord(api, coordSysModel) {\n      // These init props will never change after record created.\n      var coordSysRecord = {\n        model: coordSysModel,\n        containsPoint: curry(containsPoint, coordSysModel),\n        dispatchAction: curry(dispatchAction$1, api),\n        dataZoomInfoMap: null,\n        controller: null\n      };\n      // Must not do anything depends on coordSysRecord outside the event handler here,\n      // because coordSysRecord not completed yet.\n      var controller = coordSysRecord.controller = new RoamController(api.getZr());\n      each(['pan', 'zoom', 'scrollMove'], function (eventName) {\n        controller.on(eventName, function (event) {\n          var batch = [];\n          coordSysRecord.dataZoomInfoMap.each(function (dzInfo) {\n            // Check whether the behaviors (zoomOnMouseWheel, moveOnMouseMove,\n            // moveOnMouseWheel, ...) enabled.\n            if (!event.isAvailableBehavior(dzInfo.model.option)) {\n              return;\n            }\n            var method = (dzInfo.getRange || {})[eventName];\n            var range = method && method(dzInfo.dzReferCoordSysInfo, coordSysRecord.model.mainType, coordSysRecord.controller, event);\n            !dzInfo.model.get('disabled', true) && range && batch.push({\n              dataZoomId: dzInfo.model.id,\n              start: range[0],\n              end: range[1]\n            });\n          });\n          batch.length && coordSysRecord.dispatchAction(batch);\n        });\n      });\n      return coordSysRecord;\n    }\n    /**\r\n     * This action will be throttled.\r\n     */\n    function dispatchAction$1(api, batch) {\n      if (!api.isDisposed()) {\n        api.dispatchAction({\n          type: 'dataZoom',\n          animation: {\n            easing: 'cubicOut',\n            duration: 100\n          },\n          batch: batch\n        });\n      }\n    }\n    function containsPoint(coordSysModel, e, x, y) {\n      return coordSysModel.coordinateSystem.containPoint([x, y]);\n    }\n    /**\r\n     * Merge roamController settings when multiple dataZooms share one roamController.\r\n     */\n    function mergeControllerParams(dataZoomInfoMap) {\n      var controlType;\n      // DO NOT use reserved word (true, false, undefined) as key literally. Even if encapsulated\n      // as string, it is probably revert to reserved word by compress tool. See #7411.\n      var prefix = 'type_';\n      var typePriority = {\n        'type_true': 2,\n        'type_move': 1,\n        'type_false': 0,\n        'type_undefined': -1\n      };\n      var preventDefaultMouseMove = true;\n      dataZoomInfoMap.each(function (dataZoomInfo) {\n        var dataZoomModel = dataZoomInfo.model;\n        var oneType = dataZoomModel.get('disabled', true) ? false : dataZoomModel.get('zoomLock', true) ? 'move' : true;\n        if (typePriority[prefix + oneType] > typePriority[prefix + controlType]) {\n          controlType = oneType;\n        }\n        // Prevent default move event by default. If one false, do not prevent. Otherwise\n        // users may be confused why it does not work when multiple insideZooms exist.\n        preventDefaultMouseMove = preventDefaultMouseMove && dataZoomModel.get('preventDefaultMouseMove', true);\n      });\n      return {\n        controlType: controlType,\n        opt: {\n          // RoamController will enable all of these functionalities,\n          // and the final behavior is determined by its event listener\n          // provided by each inside zoom.\n          zoomOnMouseWheel: true,\n          moveOnMouseMove: true,\n          moveOnMouseWheel: true,\n          preventDefaultMouseMove: !!preventDefaultMouseMove\n        }\n      };\n    }\n    function installDataZoomRoamProcessor(registers) {\n      registers.registerProcessor(registers.PRIORITY.PROCESSOR.FILTER, function (ecModel, api) {\n        var apiInner = inner$k(api);\n        var coordSysRecordMap = apiInner.coordSysRecordMap || (apiInner.coordSysRecordMap = createHashMap());\n        coordSysRecordMap.each(function (coordSysRecord) {\n          // `coordSysRecordMap` always exists (because it holds the `roam controller`, which should\n          // better not re-create each time), but clear `dataZoomInfoMap` each round of the workflow.\n          coordSysRecord.dataZoomInfoMap = null;\n        });\n        ecModel.eachComponent({\n          mainType: 'dataZoom',\n          subType: 'inside'\n        }, function (dataZoomModel) {\n          var dzReferCoordSysWrap = collectReferCoordSysModelInfo(dataZoomModel);\n          each(dzReferCoordSysWrap.infoList, function (dzCoordSysInfo) {\n            var coordSysUid = dzCoordSysInfo.model.uid;\n            var coordSysRecord = coordSysRecordMap.get(coordSysUid) || coordSysRecordMap.set(coordSysUid, createCoordSysRecord(api, dzCoordSysInfo.model));\n            var dataZoomInfoMap = coordSysRecord.dataZoomInfoMap || (coordSysRecord.dataZoomInfoMap = createHashMap());\n            // Notice these props might be changed each time for a single dataZoomModel.\n            dataZoomInfoMap.set(dataZoomModel.uid, {\n              dzReferCoordSysInfo: dzCoordSysInfo,\n              model: dataZoomModel,\n              getRange: null\n            });\n          });\n        });\n        // (1) Merge dataZoom settings for each coord sys and set to the roam controller.\n        // (2) Clear coord sys if not refered by any dataZoom.\n        coordSysRecordMap.each(function (coordSysRecord) {\n          var controller = coordSysRecord.controller;\n          var firstDzInfo;\n          var dataZoomInfoMap = coordSysRecord.dataZoomInfoMap;\n          if (dataZoomInfoMap) {\n            var firstDzKey = dataZoomInfoMap.keys()[0];\n            if (firstDzKey != null) {\n              firstDzInfo = dataZoomInfoMap.get(firstDzKey);\n            }\n          }\n          if (!firstDzInfo) {\n            disposeCoordSysRecord(coordSysRecordMap, coordSysRecord);\n            return;\n          }\n          var controllerParams = mergeControllerParams(dataZoomInfoMap);\n          controller.enable(controllerParams.controlType, controllerParams.opt);\n          controller.setPointerChecker(coordSysRecord.containsPoint);\n          createOrUpdate(coordSysRecord, 'dispatchAction', firstDzInfo.model.get('throttle', true), 'fixRate');\n        });\n      });\n    }\n\n    var InsideZoomView = /** @class */function (_super) {\n      __extends(InsideZoomView, _super);\n      function InsideZoomView() {\n        var _this = _super !== null && _super.apply(this, arguments) || this;\n        _this.type = 'dataZoom.inside';\n        return _this;\n      }\n      InsideZoomView.prototype.render = function (dataZoomModel, ecModel, api) {\n        _super.prototype.render.apply(this, arguments);\n        if (dataZoomModel.noTarget()) {\n          this._clear();\n          return;\n        }\n        // Hence the `throttle` util ensures to preserve command order,\n        // here simply updating range all the time will not cause missing\n        // any of the the roam change.\n        this.range = dataZoomModel.getPercentRange();\n        // Reset controllers.\n        setViewInfoToCoordSysRecord(api, dataZoomModel, {\n          pan: bind(getRangeHandlers.pan, this),\n          zoom: bind(getRangeHandlers.zoom, this),\n          scrollMove: bind(getRangeHandlers.scrollMove, this)\n        });\n      };\n      InsideZoomView.prototype.dispose = function () {\n        this._clear();\n        _super.prototype.dispose.apply(this, arguments);\n      };\n      InsideZoomView.prototype._clear = function () {\n        disposeCoordSysRecordIfNeeded(this.api, this.dataZoomModel);\n        this.range = null;\n      };\n      InsideZoomView.type = 'dataZoom.inside';\n      return InsideZoomView;\n    }(DataZoomView);\n    var getRangeHandlers = {\n      zoom: function (coordSysInfo, coordSysMainType, controller, e) {\n        var lastRange = this.range;\n        var range = lastRange.slice();\n        // Calculate transform by the first axis.\n        var axisModel = coordSysInfo.axisModels[0];\n        if (!axisModel) {\n          return;\n        }\n        var directionInfo = getDirectionInfo[coordSysMainType](null, [e.originX, e.originY], axisModel, controller, coordSysInfo);\n        var percentPoint = (directionInfo.signal > 0 ? directionInfo.pixelStart + directionInfo.pixelLength - directionInfo.pixel : directionInfo.pixel - directionInfo.pixelStart) / directionInfo.pixelLength * (range[1] - range[0]) + range[0];\n        var scale = Math.max(1 / e.scale, 0);\n        range[0] = (range[0] - percentPoint) * scale + percentPoint;\n        range[1] = (range[1] - percentPoint) * scale + percentPoint;\n        // Restrict range.\n        var minMaxSpan = this.dataZoomModel.findRepresentativeAxisProxy().getMinMaxSpan();\n        sliderMove(0, range, [0, 100], 0, minMaxSpan.minSpan, minMaxSpan.maxSpan);\n        this.range = range;\n        if (lastRange[0] !== range[0] || lastRange[1] !== range[1]) {\n          return range;\n        }\n      },\n      pan: makeMover(function (range, axisModel, coordSysInfo, coordSysMainType, controller, e) {\n        var directionInfo = getDirectionInfo[coordSysMainType]([e.oldX, e.oldY], [e.newX, e.newY], axisModel, controller, coordSysInfo);\n        return directionInfo.signal * (range[1] - range[0]) * directionInfo.pixel / directionInfo.pixelLength;\n      }),\n      scrollMove: makeMover(function (range, axisModel, coordSysInfo, coordSysMainType, controller, e) {\n        var directionInfo = getDirectionInfo[coordSysMainType]([0, 0], [e.scrollDelta, e.scrollDelta], axisModel, controller, coordSysInfo);\n        return directionInfo.signal * (range[1] - range[0]) * e.scrollDelta;\n      })\n    };\n    function makeMover(getPercentDelta) {\n      return function (coordSysInfo, coordSysMainType, controller, e) {\n        var lastRange = this.range;\n        var range = lastRange.slice();\n        // Calculate transform by the first axis.\n        var axisModel = coordSysInfo.axisModels[0];\n        if (!axisModel) {\n          return;\n        }\n        var percentDelta = getPercentDelta(range, axisModel, coordSysInfo, coordSysMainType, controller, e);\n        sliderMove(percentDelta, range, [0, 100], 'all');\n        this.range = range;\n        if (lastRange[0] !== range[0] || lastRange[1] !== range[1]) {\n          return range;\n        }\n      };\n    }\n    var getDirectionInfo = {\n      grid: function (oldPoint, newPoint, axisModel, controller, coordSysInfo) {\n        var axis = axisModel.axis;\n        var ret = {};\n        var rect = coordSysInfo.model.coordinateSystem.getRect();\n        oldPoint = oldPoint || [0, 0];\n        if (axis.dim === 'x') {\n          ret.pixel = newPoint[0] - oldPoint[0];\n          ret.pixelLength = rect.width;\n          ret.pixelStart = rect.x;\n          ret.signal = axis.inverse ? 1 : -1;\n        } else {\n          // axis.dim === 'y'\n          ret.pixel = newPoint[1] - oldPoint[1];\n          ret.pixelLength = rect.height;\n          ret.pixelStart = rect.y;\n          ret.signal = axis.inverse ? -1 : 1;\n        }\n        return ret;\n      },\n      polar: function (oldPoint, newPoint, axisModel, controller, coordSysInfo) {\n        var axis = axisModel.axis;\n        var ret = {};\n        var polar = coordSysInfo.model.coordinateSystem;\n        var radiusExtent = polar.getRadiusAxis().getExtent();\n        var angleExtent = polar.getAngleAxis().getExtent();\n        oldPoint = oldPoint ? polar.pointToCoord(oldPoint) : [0, 0];\n        newPoint = polar.pointToCoord(newPoint);\n        if (axisModel.mainType === 'radiusAxis') {\n          ret.pixel = newPoint[0] - oldPoint[0];\n          // ret.pixelLength = Math.abs(radiusExtent[1] - radiusExtent[0]);\n          // ret.pixelStart = Math.min(radiusExtent[0], radiusExtent[1]);\n          ret.pixelLength = radiusExtent[1] - radiusExtent[0];\n          ret.pixelStart = radiusExtent[0];\n          ret.signal = axis.inverse ? 1 : -1;\n        } else {\n          // 'angleAxis'\n          ret.pixel = newPoint[1] - oldPoint[1];\n          // ret.pixelLength = Math.abs(angleExtent[1] - angleExtent[0]);\n          // ret.pixelStart = Math.min(angleExtent[0], angleExtent[1]);\n          ret.pixelLength = angleExtent[1] - angleExtent[0];\n          ret.pixelStart = angleExtent[0];\n          ret.signal = axis.inverse ? -1 : 1;\n        }\n        return ret;\n      },\n      singleAxis: function (oldPoint, newPoint, axisModel, controller, coordSysInfo) {\n        var axis = axisModel.axis;\n        var rect = coordSysInfo.model.coordinateSystem.getRect();\n        var ret = {};\n        oldPoint = oldPoint || [0, 0];\n        if (axis.orient === 'horizontal') {\n          ret.pixel = newPoint[0] - oldPoint[0];\n          ret.pixelLength = rect.width;\n          ret.pixelStart = rect.x;\n          ret.signal = axis.inverse ? 1 : -1;\n        } else {\n          // 'vertical'\n          ret.pixel = newPoint[1] - oldPoint[1];\n          ret.pixelLength = rect.height;\n          ret.pixelStart = rect.y;\n          ret.signal = axis.inverse ? -1 : 1;\n        }\n        return ret;\n      }\n    };\n\n    function install$K(registers) {\n      installCommon(registers);\n      registers.registerComponentModel(InsideZoomModel);\n      registers.registerComponentView(InsideZoomView);\n      installDataZoomRoamProcessor(registers);\n    }\n\n    var SliderZoomModel = /** @class */function (_super) {\n      __extends(SliderZoomModel, _super);\n      function SliderZoomModel() {\n        var _this = _super !== null && _super.apply(this, arguments) || this;\n        _this.type = SliderZoomModel.type;\n        return _this;\n      }\n      SliderZoomModel.type = 'dataZoom.slider';\n      SliderZoomModel.layoutMode = 'box';\n      SliderZoomModel.defaultOption = inheritDefaultOption(DataZoomModel.defaultOption, {\n        show: true,\n        // deault value can only be drived in view stage.\n        right: 'ph',\n        top: 'ph',\n        width: 'ph',\n        height: 'ph',\n        left: null,\n        bottom: null,\n        borderColor: '#d2dbee',\n        borderRadius: 3,\n        backgroundColor: 'rgba(47,69,84,0)',\n        // dataBackgroundColor: '#ddd',\n        dataBackground: {\n          lineStyle: {\n            color: '#d2dbee',\n            width: 0.5\n          },\n          areaStyle: {\n            color: '#d2dbee',\n            opacity: 0.2\n          }\n        },\n        selectedDataBackground: {\n          lineStyle: {\n            color: '#8fb0f7',\n            width: 0.5\n          },\n          areaStyle: {\n            color: '#8fb0f7',\n            opacity: 0.2\n          }\n        },\n        // Color of selected window.\n        fillerColor: 'rgba(135,175,274,0.2)',\n        handleIcon: 'path://M-9.35,34.56V42m0-40V9.5m-2,0h4a2,2,0,0,1,2,2v21a2,2,0,0,1-2,2h-4a2,2,0,0,1-2-2v-21A2,2,0,0,1-11.35,9.5Z',\n        // Percent of the slider height\n        handleSize: '100%',\n        handleStyle: {\n          color: '#fff',\n          borderColor: '#ACB8D1'\n        },\n        moveHandleSize: 7,\n        moveHandleIcon: 'path://M-320.9-50L-320.9-50c18.1,0,27.1,9,27.1,27.1V85.7c0,18.1-9,27.1-27.1,27.1l0,0c-18.1,0-27.1-9-27.1-27.1V-22.9C-348-41-339-50-320.9-50z M-212.3-50L-212.3-50c18.1,0,27.1,9,27.1,27.1V85.7c0,18.1-9,27.1-27.1,27.1l0,0c-18.1,0-27.1-9-27.1-27.1V-22.9C-239.4-41-230.4-50-212.3-50z M-103.7-50L-103.7-50c18.1,0,27.1,9,27.1,27.1V85.7c0,18.1-9,27.1-27.1,27.1l0,0c-18.1,0-27.1-9-27.1-27.1V-22.9C-130.9-41-121.8-50-103.7-50z',\n        moveHandleStyle: {\n          color: '#D2DBEE',\n          opacity: 0.7\n        },\n        showDetail: true,\n        showDataShadow: 'auto',\n        realtime: true,\n        zoomLock: false,\n        textStyle: {\n          color: '#6E7079'\n        },\n        brushSelect: true,\n        brushStyle: {\n          color: 'rgba(135,175,274,0.15)'\n        },\n        emphasis: {\n          handleLabel: {\n            show: true\n          },\n          handleStyle: {\n            borderColor: '#8FB0F7'\n          },\n          moveHandleStyle: {\n            color: '#8FB0F7'\n          }\n        }\n      });\n      return SliderZoomModel;\n    }(DataZoomModel);\n\n    var Rect$2 = Rect;\n    // Constants\n    var DEFAULT_LOCATION_EDGE_GAP = 7;\n    var DEFAULT_FRAME_BORDER_WIDTH = 1;\n    var DEFAULT_FILLER_SIZE = 30;\n    var DEFAULT_MOVE_HANDLE_SIZE = 7;\n    var HORIZONTAL = 'horizontal';\n    var VERTICAL = 'vertical';\n    var LABEL_GAP = 5;\n    var SHOW_DATA_SHADOW_SERIES_TYPE = ['line', 'bar', 'candlestick', 'scatter'];\n    var REALTIME_ANIMATION_CONFIG = {\n      easing: 'cubicOut',\n      duration: 100,\n      delay: 0\n    };\n    var SliderZoomView = /** @class */function (_super) {\n      __extends(SliderZoomView, _super);\n      function SliderZoomView() {\n        var _this = _super !== null && _super.apply(this, arguments) || this;\n        _this.type = SliderZoomView.type;\n        _this._displayables = {};\n        return _this;\n      }\n      SliderZoomView.prototype.init = function (ecModel, api) {\n        this.api = api;\n        // A unique handler for each dataZoom component\n        this._onBrush = bind(this._onBrush, this);\n        this._onBrushEnd = bind(this._onBrushEnd, this);\n      };\n      SliderZoomView.prototype.render = function (dataZoomModel, ecModel, api, payload) {\n        _super.prototype.render.apply(this, arguments);\n        createOrUpdate(this, '_dispatchZoomAction', dataZoomModel.get('throttle'), 'fixRate');\n        this._orient = dataZoomModel.getOrient();\n        if (dataZoomModel.get('show') === false) {\n          this.group.removeAll();\n          return;\n        }\n        if (dataZoomModel.noTarget()) {\n          this._clear();\n          this.group.removeAll();\n          return;\n        }\n        // Notice: this._resetInterval() should not be executed when payload.type\n        // is 'dataZoom', origin this._range should be maintained, otherwise 'pan'\n        // or 'zoom' info will be missed because of 'throttle' of this.dispatchAction,\n        if (!payload || payload.type !== 'dataZoom' || payload.from !== this.uid) {\n          this._buildView();\n        }\n        this._updateView();\n      };\n      SliderZoomView.prototype.dispose = function () {\n        this._clear();\n        _super.prototype.dispose.apply(this, arguments);\n      };\n      SliderZoomView.prototype._clear = function () {\n        clear(this, '_dispatchZoomAction');\n        var zr = this.api.getZr();\n        zr.off('mousemove', this._onBrush);\n        zr.off('mouseup', this._onBrushEnd);\n      };\n      SliderZoomView.prototype._buildView = function () {\n        var thisGroup = this.group;\n        thisGroup.removeAll();\n        this._brushing = false;\n        this._displayables.brushRect = null;\n        this._resetLocation();\n        this._resetInterval();\n        var barGroup = this._displayables.sliderGroup = new Group();\n        this._renderBackground();\n        this._renderHandle();\n        this._renderDataShadow();\n        thisGroup.add(barGroup);\n        this._positionGroup();\n      };\n      SliderZoomView.prototype._resetLocation = function () {\n        var dataZoomModel = this.dataZoomModel;\n        var api = this.api;\n        var showMoveHandle = dataZoomModel.get('brushSelect');\n        var moveHandleSize = showMoveHandle ? DEFAULT_MOVE_HANDLE_SIZE : 0;\n        // If some of x/y/width/height are not specified,\n        // auto-adapt according to target grid.\n        var coordRect = this._findCoordRect();\n        var ecSize = {\n          width: api.getWidth(),\n          height: api.getHeight()\n        };\n        // Default align by coordinate system rect.\n        var positionInfo = this._orient === HORIZONTAL ? {\n          // Why using 'right', because right should be used in vertical,\n          // and it is better to be consistent for dealing with position param merge.\n          right: ecSize.width - coordRect.x - coordRect.width,\n          top: ecSize.height - DEFAULT_FILLER_SIZE - DEFAULT_LOCATION_EDGE_GAP - moveHandleSize,\n          width: coordRect.width,\n          height: DEFAULT_FILLER_SIZE\n        } : {\n          right: DEFAULT_LOCATION_EDGE_GAP,\n          top: coordRect.y,\n          width: DEFAULT_FILLER_SIZE,\n          height: coordRect.height\n        };\n        // Do not write back to option and replace value 'ph', because\n        // the 'ph' value should be recalculated when resize.\n        var layoutParams = getLayoutParams(dataZoomModel.option);\n        // Replace the placeholder value.\n        each(['right', 'top', 'width', 'height'], function (name) {\n          if (layoutParams[name] === 'ph') {\n            layoutParams[name] = positionInfo[name];\n          }\n        });\n        var layoutRect = getLayoutRect(layoutParams, ecSize);\n        this._location = {\n          x: layoutRect.x,\n          y: layoutRect.y\n        };\n        this._size = [layoutRect.width, layoutRect.height];\n        this._orient === VERTICAL && this._size.reverse();\n      };\n      SliderZoomView.prototype._positionGroup = function () {\n        var thisGroup = this.group;\n        var location = this._location;\n        var orient = this._orient;\n        // Just use the first axis to determine mapping.\n        var targetAxisModel = this.dataZoomModel.getFirstTargetAxisModel();\n        var inverse = targetAxisModel && targetAxisModel.get('inverse');\n        var sliderGroup = this._displayables.sliderGroup;\n        var otherAxisInverse = (this._dataShadowInfo || {}).otherAxisInverse;\n        // Transform barGroup.\n        sliderGroup.attr(orient === HORIZONTAL && !inverse ? {\n          scaleY: otherAxisInverse ? 1 : -1,\n          scaleX: 1\n        } : orient === HORIZONTAL && inverse ? {\n          scaleY: otherAxisInverse ? 1 : -1,\n          scaleX: -1\n        } : orient === VERTICAL && !inverse ? {\n          scaleY: otherAxisInverse ? -1 : 1,\n          scaleX: 1,\n          rotation: Math.PI / 2\n        }\n        // Don't use Math.PI, considering shadow direction.\n        : {\n          scaleY: otherAxisInverse ? -1 : 1,\n          scaleX: -1,\n          rotation: Math.PI / 2\n        });\n        // Position barGroup\n        var rect = thisGroup.getBoundingRect([sliderGroup]);\n        thisGroup.x = location.x - rect.x;\n        thisGroup.y = location.y - rect.y;\n        thisGroup.markRedraw();\n      };\n      SliderZoomView.prototype._getViewExtent = function () {\n        return [0, this._size[0]];\n      };\n      SliderZoomView.prototype._renderBackground = function () {\n        var dataZoomModel = this.dataZoomModel;\n        var size = this._size;\n        var barGroup = this._displayables.sliderGroup;\n        var brushSelect = dataZoomModel.get('brushSelect');\n        barGroup.add(new Rect$2({\n          silent: true,\n          shape: {\n            x: 0,\n            y: 0,\n            width: size[0],\n            height: size[1]\n          },\n          style: {\n            fill: dataZoomModel.get('backgroundColor')\n          },\n          z2: -40\n        }));\n        // Click panel, over shadow, below handles.\n        var clickPanel = new Rect$2({\n          shape: {\n            x: 0,\n            y: 0,\n            width: size[0],\n            height: size[1]\n          },\n          style: {\n            fill: 'transparent'\n          },\n          z2: 0,\n          onclick: bind(this._onClickPanel, this)\n        });\n        var zr = this.api.getZr();\n        if (brushSelect) {\n          clickPanel.on('mousedown', this._onBrushStart, this);\n          clickPanel.cursor = 'crosshair';\n          zr.on('mousemove', this._onBrush);\n          zr.on('mouseup', this._onBrushEnd);\n        } else {\n          zr.off('mousemove', this._onBrush);\n          zr.off('mouseup', this._onBrushEnd);\n        }\n        barGroup.add(clickPanel);\n      };\n      SliderZoomView.prototype._renderDataShadow = function () {\n        var info = this._dataShadowInfo = this._prepareDataShadowInfo();\n        this._displayables.dataShadowSegs = [];\n        if (!info) {\n          return;\n        }\n        var size = this._size;\n        var oldSize = this._shadowSize || [];\n        var seriesModel = info.series;\n        var data = seriesModel.getRawData();\n        var candlestickDim = seriesModel.getShadowDim && seriesModel.getShadowDim();\n        var otherDim = candlestickDim && data.getDimensionInfo(candlestickDim) ? seriesModel.getShadowDim() // @see candlestick\n        : info.otherDim;\n        if (otherDim == null) {\n          return;\n        }\n        var polygonPts = this._shadowPolygonPts;\n        var polylinePts = this._shadowPolylinePts;\n        // Not re-render if data doesn't change.\n        if (data !== this._shadowData || otherDim !== this._shadowDim || size[0] !== oldSize[0] || size[1] !== oldSize[1]) {\n          var otherDataExtent_1 = data.getDataExtent(otherDim);\n          // Nice extent.\n          var otherOffset = (otherDataExtent_1[1] - otherDataExtent_1[0]) * 0.3;\n          otherDataExtent_1 = [otherDataExtent_1[0] - otherOffset, otherDataExtent_1[1] + otherOffset];\n          var otherShadowExtent_1 = [0, size[1]];\n          var thisShadowExtent = [0, size[0]];\n          var areaPoints_1 = [[size[0], 0], [0, 0]];\n          var linePoints_1 = [];\n          var step_1 = thisShadowExtent[1] / (data.count() - 1);\n          var thisCoord_1 = 0;\n          // Optimize for large data shadow\n          var stride_1 = Math.round(data.count() / size[0]);\n          var lastIsEmpty_1;\n          data.each([otherDim], function (value, index) {\n            if (stride_1 > 0 && index % stride_1) {\n              thisCoord_1 += step_1;\n              return;\n            }\n            // FIXME\n            // Should consider axis.min/axis.max when drawing dataShadow.\n            // FIXME\n            // 应该使用统一的空判断？还是在list里进行空判断？\n            var isEmpty = value == null || isNaN(value) || value === '';\n            // See #4235.\n            var otherCoord = isEmpty ? 0 : linearMap(value, otherDataExtent_1, otherShadowExtent_1, true);\n            // Attempt to draw data shadow precisely when there are empty value.\n            if (isEmpty && !lastIsEmpty_1 && index) {\n              areaPoints_1.push([areaPoints_1[areaPoints_1.length - 1][0], 0]);\n              linePoints_1.push([linePoints_1[linePoints_1.length - 1][0], 0]);\n            } else if (!isEmpty && lastIsEmpty_1) {\n              areaPoints_1.push([thisCoord_1, 0]);\n              linePoints_1.push([thisCoord_1, 0]);\n            }\n            areaPoints_1.push([thisCoord_1, otherCoord]);\n            linePoints_1.push([thisCoord_1, otherCoord]);\n            thisCoord_1 += step_1;\n            lastIsEmpty_1 = isEmpty;\n          });\n          polygonPts = this._shadowPolygonPts = areaPoints_1;\n          polylinePts = this._shadowPolylinePts = linePoints_1;\n        }\n        this._shadowData = data;\n        this._shadowDim = otherDim;\n        this._shadowSize = [size[0], size[1]];\n        var dataZoomModel = this.dataZoomModel;\n        function createDataShadowGroup(isSelectedArea) {\n          var model = dataZoomModel.getModel(isSelectedArea ? 'selectedDataBackground' : 'dataBackground');\n          var group = new Group();\n          var polygon = new Polygon({\n            shape: {\n              points: polygonPts\n            },\n            segmentIgnoreThreshold: 1,\n            style: model.getModel('areaStyle').getAreaStyle(),\n            silent: true,\n            z2: -20\n          });\n          var polyline = new Polyline({\n            shape: {\n              points: polylinePts\n            },\n            segmentIgnoreThreshold: 1,\n            style: model.getModel('lineStyle').getLineStyle(),\n            silent: true,\n            z2: -19\n          });\n          group.add(polygon);\n          group.add(polyline);\n          return group;\n        }\n        // let dataBackgroundModel = dataZoomModel.getModel('dataBackground');\n        for (var i = 0; i < 3; i++) {\n          var group = createDataShadowGroup(i === 1);\n          this._displayables.sliderGroup.add(group);\n          this._displayables.dataShadowSegs.push(group);\n        }\n      };\n      SliderZoomView.prototype._prepareDataShadowInfo = function () {\n        var dataZoomModel = this.dataZoomModel;\n        var showDataShadow = dataZoomModel.get('showDataShadow');\n        if (showDataShadow === false) {\n          return;\n        }\n        // Find a representative series.\n        var result;\n        var ecModel = this.ecModel;\n        dataZoomModel.eachTargetAxis(function (axisDim, axisIndex) {\n          var seriesModels = dataZoomModel.getAxisProxy(axisDim, axisIndex).getTargetSeriesModels();\n          each(seriesModels, function (seriesModel) {\n            if (result) {\n              return;\n            }\n            if (showDataShadow !== true && indexOf(SHOW_DATA_SHADOW_SERIES_TYPE, seriesModel.get('type')) < 0) {\n              return;\n            }\n            var thisAxis = ecModel.getComponent(getAxisMainType(axisDim), axisIndex).axis;\n            var otherDim = getOtherDim(axisDim);\n            var otherAxisInverse;\n            var coordSys = seriesModel.coordinateSystem;\n            if (otherDim != null && coordSys.getOtherAxis) {\n              otherAxisInverse = coordSys.getOtherAxis(thisAxis).inverse;\n            }\n            otherDim = seriesModel.getData().mapDimension(otherDim);\n            result = {\n              thisAxis: thisAxis,\n              series: seriesModel,\n              thisDim: axisDim,\n              otherDim: otherDim,\n              otherAxisInverse: otherAxisInverse\n            };\n          }, this);\n        }, this);\n        return result;\n      };\n      SliderZoomView.prototype._renderHandle = function () {\n        var thisGroup = this.group;\n        var displayables = this._displayables;\n        var handles = displayables.handles = [null, null];\n        var handleLabels = displayables.handleLabels = [null, null];\n        var sliderGroup = this._displayables.sliderGroup;\n        var size = this._size;\n        var dataZoomModel = this.dataZoomModel;\n        var api = this.api;\n        var borderRadius = dataZoomModel.get('borderRadius') || 0;\n        var brushSelect = dataZoomModel.get('brushSelect');\n        var filler = displayables.filler = new Rect$2({\n          silent: brushSelect,\n          style: {\n            fill: dataZoomModel.get('fillerColor')\n          },\n          textConfig: {\n            position: 'inside'\n          }\n        });\n        sliderGroup.add(filler);\n        // Frame border.\n        sliderGroup.add(new Rect$2({\n          silent: true,\n          subPixelOptimize: true,\n          shape: {\n            x: 0,\n            y: 0,\n            width: size[0],\n            height: size[1],\n            r: borderRadius\n          },\n          style: {\n            // deprecated option\n            stroke: dataZoomModel.get('dataBackgroundColor') || dataZoomModel.get('borderColor'),\n            lineWidth: DEFAULT_FRAME_BORDER_WIDTH,\n            fill: 'rgba(0,0,0,0)'\n          }\n        }));\n        // Left and right handle to resize\n        each([0, 1], function (handleIndex) {\n          var iconStr = dataZoomModel.get('handleIcon');\n          if (!symbolBuildProxies[iconStr] && iconStr.indexOf('path://') < 0 && iconStr.indexOf('image://') < 0) {\n            // Compatitable with the old icon parsers. Which can use a path string without path://\n            iconStr = 'path://' + iconStr;\n            if (\"development\" !== 'production') {\n              deprecateLog('handleIcon now needs \\'path://\\' prefix when using a path string');\n            }\n          }\n          var path = createSymbol(iconStr, -1, 0, 2, 2, null, true);\n          path.attr({\n            cursor: getCursor(this._orient),\n            draggable: true,\n            drift: bind(this._onDragMove, this, handleIndex),\n            ondragend: bind(this._onDragEnd, this),\n            onmouseover: bind(this._showDataInfo, this, true),\n            onmouseout: bind(this._showDataInfo, this, false),\n            z2: 5\n          });\n          var bRect = path.getBoundingRect();\n          var handleSize = dataZoomModel.get('handleSize');\n          this._handleHeight = parsePercent$1(handleSize, this._size[1]);\n          this._handleWidth = bRect.width / bRect.height * this._handleHeight;\n          path.setStyle(dataZoomModel.getModel('handleStyle').getItemStyle());\n          path.style.strokeNoScale = true;\n          path.rectHover = true;\n          path.ensureState('emphasis').style = dataZoomModel.getModel(['emphasis', 'handleStyle']).getItemStyle();\n          enableHoverEmphasis(path);\n          var handleColor = dataZoomModel.get('handleColor'); // deprecated option\n          // Compatitable with previous version\n          if (handleColor != null) {\n            path.style.fill = handleColor;\n          }\n          sliderGroup.add(handles[handleIndex] = path);\n          var textStyleModel = dataZoomModel.getModel('textStyle');\n          var handleLabel = dataZoomModel.get('handleLabel') || {};\n          var handleLabelShow = handleLabel.show || false;\n          thisGroup.add(handleLabels[handleIndex] = new ZRText({\n            silent: true,\n            invisible: !handleLabelShow,\n            style: createTextStyle(textStyleModel, {\n              x: 0,\n              y: 0,\n              text: '',\n              verticalAlign: 'middle',\n              align: 'center',\n              fill: textStyleModel.getTextColor(),\n              font: textStyleModel.getFont()\n            }),\n            z2: 10\n          }));\n        }, this);\n        // Handle to move. Only visible when brushSelect is set true.\n        var actualMoveZone = filler;\n        if (brushSelect) {\n          var moveHandleHeight = parsePercent$1(dataZoomModel.get('moveHandleSize'), size[1]);\n          var moveHandle_1 = displayables.moveHandle = new Rect({\n            style: dataZoomModel.getModel('moveHandleStyle').getItemStyle(),\n            silent: true,\n            shape: {\n              r: [0, 0, 2, 2],\n              y: size[1] - 0.5,\n              height: moveHandleHeight\n            }\n          });\n          var iconSize = moveHandleHeight * 0.8;\n          var moveHandleIcon = displayables.moveHandleIcon = createSymbol(dataZoomModel.get('moveHandleIcon'), -iconSize / 2, -iconSize / 2, iconSize, iconSize, '#fff', true);\n          moveHandleIcon.silent = true;\n          moveHandleIcon.y = size[1] + moveHandleHeight / 2 - 0.5;\n          moveHandle_1.ensureState('emphasis').style = dataZoomModel.getModel(['emphasis', 'moveHandleStyle']).getItemStyle();\n          var moveZoneExpandSize = Math.min(size[1] / 2, Math.max(moveHandleHeight, 10));\n          actualMoveZone = displayables.moveZone = new Rect({\n            invisible: true,\n            shape: {\n              y: size[1] - moveZoneExpandSize,\n              height: moveHandleHeight + moveZoneExpandSize\n            }\n          });\n          actualMoveZone.on('mouseover', function () {\n            api.enterEmphasis(moveHandle_1);\n          }).on('mouseout', function () {\n            api.leaveEmphasis(moveHandle_1);\n          });\n          sliderGroup.add(moveHandle_1);\n          sliderGroup.add(moveHandleIcon);\n          sliderGroup.add(actualMoveZone);\n        }\n        actualMoveZone.attr({\n          draggable: true,\n          cursor: getCursor(this._orient),\n          drift: bind(this._onDragMove, this, 'all'),\n          ondragstart: bind(this._showDataInfo, this, true),\n          ondragend: bind(this._onDragEnd, this),\n          onmouseover: bind(this._showDataInfo, this, true),\n          onmouseout: bind(this._showDataInfo, this, false)\n        });\n      };\n      SliderZoomView.prototype._resetInterval = function () {\n        var range = this._range = this.dataZoomModel.getPercentRange();\n        var viewExtent = this._getViewExtent();\n        this._handleEnds = [linearMap(range[0], [0, 100], viewExtent, true), linearMap(range[1], [0, 100], viewExtent, true)];\n      };\n      SliderZoomView.prototype._updateInterval = function (handleIndex, delta) {\n        var dataZoomModel = this.dataZoomModel;\n        var handleEnds = this._handleEnds;\n        var viewExtend = this._getViewExtent();\n        var minMaxSpan = dataZoomModel.findRepresentativeAxisProxy().getMinMaxSpan();\n        var percentExtent = [0, 100];\n        sliderMove(delta, handleEnds, viewExtend, dataZoomModel.get('zoomLock') ? 'all' : handleIndex, minMaxSpan.minSpan != null ? linearMap(minMaxSpan.minSpan, percentExtent, viewExtend, true) : null, minMaxSpan.maxSpan != null ? linearMap(minMaxSpan.maxSpan, percentExtent, viewExtend, true) : null);\n        var lastRange = this._range;\n        var range = this._range = asc([linearMap(handleEnds[0], viewExtend, percentExtent, true), linearMap(handleEnds[1], viewExtend, percentExtent, true)]);\n        return !lastRange || lastRange[0] !== range[0] || lastRange[1] !== range[1];\n      };\n      SliderZoomView.prototype._updateView = function (nonRealtime) {\n        var displaybles = this._displayables;\n        var handleEnds = this._handleEnds;\n        var handleInterval = asc(handleEnds.slice());\n        var size = this._size;\n        each([0, 1], function (handleIndex) {\n          // Handles\n          var handle = displaybles.handles[handleIndex];\n          var handleHeight = this._handleHeight;\n          handle.attr({\n            scaleX: handleHeight / 2,\n            scaleY: handleHeight / 2,\n            // This is a trick, by adding an extra tiny offset to let the default handle's end point align to the drag window.\n            // NOTE: It may affect some custom shapes a bit. But we prefer to have better result by default.\n            x: handleEnds[handleIndex] + (handleIndex ? -1 : 1),\n            y: size[1] / 2 - handleHeight / 2\n          });\n        }, this);\n        // Filler\n        displaybles.filler.setShape({\n          x: handleInterval[0],\n          y: 0,\n          width: handleInterval[1] - handleInterval[0],\n          height: size[1]\n        });\n        var viewExtent = {\n          x: handleInterval[0],\n          width: handleInterval[1] - handleInterval[0]\n        };\n        // Move handle\n        if (displaybles.moveHandle) {\n          displaybles.moveHandle.setShape(viewExtent);\n          displaybles.moveZone.setShape(viewExtent);\n          // Force update path on the invisible object\n          displaybles.moveZone.getBoundingRect();\n          displaybles.moveHandleIcon && displaybles.moveHandleIcon.attr('x', viewExtent.x + viewExtent.width / 2);\n        }\n        // update clip path of shadow.\n        var dataShadowSegs = displaybles.dataShadowSegs;\n        var segIntervals = [0, handleInterval[0], handleInterval[1], size[0]];\n        for (var i = 0; i < dataShadowSegs.length; i++) {\n          var segGroup = dataShadowSegs[i];\n          var clipPath = segGroup.getClipPath();\n          if (!clipPath) {\n            clipPath = new Rect();\n            segGroup.setClipPath(clipPath);\n          }\n          clipPath.setShape({\n            x: segIntervals[i],\n            y: 0,\n            width: segIntervals[i + 1] - segIntervals[i],\n            height: size[1]\n          });\n        }\n        this._updateDataInfo(nonRealtime);\n      };\n      SliderZoomView.prototype._updateDataInfo = function (nonRealtime) {\n        var dataZoomModel = this.dataZoomModel;\n        var displaybles = this._displayables;\n        var handleLabels = displaybles.handleLabels;\n        var orient = this._orient;\n        var labelTexts = ['', ''];\n        // FIXME\n        // date型，支持formatter，autoformatter（ec2 date.getAutoFormatter）\n        if (dataZoomModel.get('showDetail')) {\n          var axisProxy = dataZoomModel.findRepresentativeAxisProxy();\n          if (axisProxy) {\n            var axis = axisProxy.getAxisModel().axis;\n            var range = this._range;\n            var dataInterval = nonRealtime\n            // See #4434, data and axis are not processed and reset yet in non-realtime mode.\n            ? axisProxy.calculateDataWindow({\n              start: range[0],\n              end: range[1]\n            }).valueWindow : axisProxy.getDataValueWindow();\n            labelTexts = [this._formatLabel(dataInterval[0], axis), this._formatLabel(dataInterval[1], axis)];\n          }\n        }\n        var orderedHandleEnds = asc(this._handleEnds.slice());\n        setLabel.call(this, 0);\n        setLabel.call(this, 1);\n        function setLabel(handleIndex) {\n          // Label\n          // Text should not transform by barGroup.\n          // Ignore handlers transform\n          var barTransform = getTransform(displaybles.handles[handleIndex].parent, this.group);\n          var direction = transformDirection(handleIndex === 0 ? 'right' : 'left', barTransform);\n          var offset = this._handleWidth / 2 + LABEL_GAP;\n          var textPoint = applyTransform$1([orderedHandleEnds[handleIndex] + (handleIndex === 0 ? -offset : offset), this._size[1] / 2], barTransform);\n          handleLabels[handleIndex].setStyle({\n            x: textPoint[0],\n            y: textPoint[1],\n            verticalAlign: orient === HORIZONTAL ? 'middle' : direction,\n            align: orient === HORIZONTAL ? direction : 'center',\n            text: labelTexts[handleIndex]\n          });\n        }\n      };\n      SliderZoomView.prototype._formatLabel = function (value, axis) {\n        var dataZoomModel = this.dataZoomModel;\n        var labelFormatter = dataZoomModel.get('labelFormatter');\n        var labelPrecision = dataZoomModel.get('labelPrecision');\n        if (labelPrecision == null || labelPrecision === 'auto') {\n          labelPrecision = axis.getPixelPrecision();\n        }\n        var valueStr = value == null || isNaN(value) ? ''\n        // FIXME Glue code\n        : axis.type === 'category' || axis.type === 'time' ? axis.scale.getLabel({\n          value: Math.round(value)\n        })\n        // param of toFixed should less then 20.\n        : value.toFixed(Math.min(labelPrecision, 20));\n        return isFunction(labelFormatter) ? labelFormatter(value, valueStr) : isString(labelFormatter) ? labelFormatter.replace('{value}', valueStr) : valueStr;\n      };\n      /**\r\n       * @param isEmphasis true: show, false: hide\r\n       */\n      SliderZoomView.prototype._showDataInfo = function (isEmphasis) {\n        var handleLabel = this.dataZoomModel.get('handleLabel') || {};\n        var normalShow = handleLabel.show || false;\n        var emphasisHandleLabel = this.dataZoomModel.getModel(['emphasis', 'handleLabel']);\n        var emphasisShow = emphasisHandleLabel.get('show') || false;\n        // Dragging is considered as emphasis, unless emphasisShow is false\n        var toShow = isEmphasis || this._dragging ? emphasisShow : normalShow;\n        var displayables = this._displayables;\n        var handleLabels = displayables.handleLabels;\n        handleLabels[0].attr('invisible', !toShow);\n        handleLabels[1].attr('invisible', !toShow);\n        // Highlight move handle\n        displayables.moveHandle && this.api[toShow ? 'enterEmphasis' : 'leaveEmphasis'](displayables.moveHandle, 1);\n      };\n      SliderZoomView.prototype._onDragMove = function (handleIndex, dx, dy, event) {\n        this._dragging = true;\n        // For mobile device, prevent screen slider on the button.\n        stop(event.event);\n        // Transform dx, dy to bar coordination.\n        var barTransform = this._displayables.sliderGroup.getLocalTransform();\n        var vertex = applyTransform$1([dx, dy], barTransform, true);\n        var changed = this._updateInterval(handleIndex, vertex[0]);\n        var realtime = this.dataZoomModel.get('realtime');\n        this._updateView(!realtime);\n        // Avoid dispatch dataZoom repeatly but range not changed,\n        // which cause bad visual effect when progressive enabled.\n        changed && realtime && this._dispatchZoomAction(true);\n      };\n      SliderZoomView.prototype._onDragEnd = function () {\n        this._dragging = false;\n        this._showDataInfo(false);\n        // While in realtime mode and stream mode, dispatch action when\n        // drag end will cause the whole view rerender, which is unnecessary.\n        var realtime = this.dataZoomModel.get('realtime');\n        !realtime && this._dispatchZoomAction(false);\n      };\n      SliderZoomView.prototype._onClickPanel = function (e) {\n        var size = this._size;\n        var localPoint = this._displayables.sliderGroup.transformCoordToLocal(e.offsetX, e.offsetY);\n        if (localPoint[0] < 0 || localPoint[0] > size[0] || localPoint[1] < 0 || localPoint[1] > size[1]) {\n          return;\n        }\n        var handleEnds = this._handleEnds;\n        var center = (handleEnds[0] + handleEnds[1]) / 2;\n        var changed = this._updateInterval('all', localPoint[0] - center);\n        this._updateView();\n        changed && this._dispatchZoomAction(false);\n      };\n      SliderZoomView.prototype._onBrushStart = function (e) {\n        var x = e.offsetX;\n        var y = e.offsetY;\n        this._brushStart = new Point(x, y);\n        this._brushing = true;\n        this._brushStartTime = +new Date();\n        // this._updateBrushRect(x, y);\n      };\n      SliderZoomView.prototype._onBrushEnd = function (e) {\n        if (!this._brushing) {\n          return;\n        }\n        var brushRect = this._displayables.brushRect;\n        this._brushing = false;\n        if (!brushRect) {\n          return;\n        }\n        brushRect.attr('ignore', true);\n        var brushShape = brushRect.shape;\n        var brushEndTime = +new Date();\n        // console.log(brushEndTime - this._brushStartTime);\n        if (brushEndTime - this._brushStartTime < 200 && Math.abs(brushShape.width) < 5) {\n          // Will treat it as a click\n          return;\n        }\n        var viewExtend = this._getViewExtent();\n        var percentExtent = [0, 100];\n        this._range = asc([linearMap(brushShape.x, viewExtend, percentExtent, true), linearMap(brushShape.x + brushShape.width, viewExtend, percentExtent, true)]);\n        this._handleEnds = [brushShape.x, brushShape.x + brushShape.width];\n        this._updateView();\n        this._dispatchZoomAction(false);\n      };\n      SliderZoomView.prototype._onBrush = function (e) {\n        if (this._brushing) {\n          // For mobile device, prevent screen slider on the button.\n          stop(e.event);\n          this._updateBrushRect(e.offsetX, e.offsetY);\n        }\n      };\n      SliderZoomView.prototype._updateBrushRect = function (mouseX, mouseY) {\n        var displayables = this._displayables;\n        var dataZoomModel = this.dataZoomModel;\n        var brushRect = displayables.brushRect;\n        if (!brushRect) {\n          brushRect = displayables.brushRect = new Rect$2({\n            silent: true,\n            style: dataZoomModel.getModel('brushStyle').getItemStyle()\n          });\n          displayables.sliderGroup.add(brushRect);\n        }\n        brushRect.attr('ignore', false);\n        var brushStart = this._brushStart;\n        var sliderGroup = this._displayables.sliderGroup;\n        var endPoint = sliderGroup.transformCoordToLocal(mouseX, mouseY);\n        var startPoint = sliderGroup.transformCoordToLocal(brushStart.x, brushStart.y);\n        var size = this._size;\n        endPoint[0] = Math.max(Math.min(size[0], endPoint[0]), 0);\n        brushRect.setShape({\n          x: startPoint[0],\n          y: 0,\n          width: endPoint[0] - startPoint[0],\n          height: size[1]\n        });\n      };\n      /**\r\n       * This action will be throttled.\r\n       */\n      SliderZoomView.prototype._dispatchZoomAction = function (realtime) {\n        var range = this._range;\n        this.api.dispatchAction({\n          type: 'dataZoom',\n          from: this.uid,\n          dataZoomId: this.dataZoomModel.id,\n          animation: realtime ? REALTIME_ANIMATION_CONFIG : null,\n          start: range[0],\n          end: range[1]\n        });\n      };\n      SliderZoomView.prototype._findCoordRect = function () {\n        // Find the grid corresponding to the first axis referred by dataZoom.\n        var rect;\n        var coordSysInfoList = collectReferCoordSysModelInfo(this.dataZoomModel).infoList;\n        if (!rect && coordSysInfoList.length) {\n          var coordSys = coordSysInfoList[0].model.coordinateSystem;\n          rect = coordSys.getRect && coordSys.getRect();\n        }\n        if (!rect) {\n          var width = this.api.getWidth();\n          var height = this.api.getHeight();\n          rect = {\n            x: width * 0.2,\n            y: height * 0.2,\n            width: width * 0.6,\n            height: height * 0.6\n          };\n        }\n        return rect;\n      };\n      SliderZoomView.type = 'dataZoom.slider';\n      return SliderZoomView;\n    }(DataZoomView);\n    function getOtherDim(thisDim) {\n      // FIXME\n      // 这个逻辑和getOtherAxis里一致，但是写在这里是否不好\n      var map = {\n        x: 'y',\n        y: 'x',\n        radius: 'angle',\n        angle: 'radius'\n      };\n      return map[thisDim];\n    }\n    function getCursor(orient) {\n      return orient === 'vertical' ? 'ns-resize' : 'ew-resize';\n    }\n\n    function install$L(registers) {\n      registers.registerComponentModel(SliderZoomModel);\n      registers.registerComponentView(SliderZoomView);\n      installCommon(registers);\n    }\n\n    function install$M(registers) {\n      use(install$K);\n      use(install$L);\n      // Do not install './dataZoomSelect',\n      // since it only work for toolbox dataZoom.\n    }\n\n    var visualDefault = {\n      /**\r\n       * @public\r\n       */\n      get: function (visualType, key, isCategory) {\n        var value = clone((defaultOption$1[visualType] || {})[key]);\n        return isCategory ? isArray(value) ? value[value.length - 1] : value : value;\n      }\n    };\n    var defaultOption$1 = {\n      color: {\n        active: ['#006edd', '#e0ffff'],\n        inactive: ['rgba(0,0,0,0)']\n      },\n      colorHue: {\n        active: [0, 360],\n        inactive: [0, 0]\n      },\n      colorSaturation: {\n        active: [0.3, 1],\n        inactive: [0, 0]\n      },\n      colorLightness: {\n        active: [0.9, 0.5],\n        inactive: [0, 0]\n      },\n      colorAlpha: {\n        active: [0.3, 1],\n        inactive: [0, 0]\n      },\n      opacity: {\n        active: [0.3, 1],\n        inactive: [0, 0]\n      },\n      symbol: {\n        active: ['circle', 'roundRect', 'diamond'],\n        inactive: ['none']\n      },\n      symbolSize: {\n        active: [10, 50],\n        inactive: [0, 0]\n      }\n    };\n\n    var mapVisual$1 = VisualMapping.mapVisual;\n    var eachVisual = VisualMapping.eachVisual;\n    var isArray$1 = isArray;\n    var each$d = each;\n    var asc$2 = asc;\n    var linearMap$1 = linearMap;\n    var VisualMapModel = /** @class */function (_super) {\n      __extends(VisualMapModel, _super);\n      function VisualMapModel() {\n        var _this = _super !== null && _super.apply(this, arguments) || this;\n        _this.type = VisualMapModel.type;\n        _this.stateList = ['inRange', 'outOfRange'];\n        _this.replacableOptionKeys = ['inRange', 'outOfRange', 'target', 'controller', 'color'];\n        _this.layoutMode = {\n          type: 'box',\n          ignoreSize: true\n        };\n        /**\r\n         * [lowerBound, upperBound]\r\n         */\n        _this.dataBound = [-Infinity, Infinity];\n        _this.targetVisuals = {};\n        _this.controllerVisuals = {};\n        return _this;\n      }\n      VisualMapModel.prototype.init = function (option, parentModel, ecModel) {\n        this.mergeDefaultAndTheme(option, ecModel);\n      };\n      /**\r\n       * @protected\r\n       */\n      VisualMapModel.prototype.optionUpdated = function (newOption, isInit) {\n        var thisOption = this.option;\n        !isInit && replaceVisualOption(thisOption, newOption, this.replacableOptionKeys);\n        this.textStyleModel = this.getModel('textStyle');\n        this.resetItemSize();\n        this.completeVisualOption();\n      };\n      /**\r\n       * @protected\r\n       */\n      VisualMapModel.prototype.resetVisual = function (supplementVisualOption) {\n        var stateList = this.stateList;\n        supplementVisualOption = bind(supplementVisualOption, this);\n        this.controllerVisuals = createVisualMappings(this.option.controller, stateList, supplementVisualOption);\n        this.targetVisuals = createVisualMappings(this.option.target, stateList, supplementVisualOption);\n      };\n      /**\r\n       * @public\r\n       */\n      VisualMapModel.prototype.getItemSymbol = function () {\n        return null;\n      };\n      /**\r\n       * @protected\r\n       * @return {Array.<number>} An array of series indices.\r\n       */\n      VisualMapModel.prototype.getTargetSeriesIndices = function () {\n        var optionSeriesIndex = this.option.seriesIndex;\n        var seriesIndices = [];\n        if (optionSeriesIndex == null || optionSeriesIndex === 'all') {\n          this.ecModel.eachSeries(function (seriesModel, index) {\n            seriesIndices.push(index);\n          });\n        } else {\n          seriesIndices = normalizeToArray(optionSeriesIndex);\n        }\n        return seriesIndices;\n      };\n      /**\r\n       * @public\r\n       */\n      VisualMapModel.prototype.eachTargetSeries = function (callback, context) {\n        each(this.getTargetSeriesIndices(), function (seriesIndex) {\n          var seriesModel = this.ecModel.getSeriesByIndex(seriesIndex);\n          if (seriesModel) {\n            callback.call(context, seriesModel);\n          }\n        }, this);\n      };\n      /**\r\n       * @pubilc\r\n       */\n      VisualMapModel.prototype.isTargetSeries = function (seriesModel) {\n        var is = false;\n        this.eachTargetSeries(function (model) {\n          model === seriesModel && (is = true);\n        });\n        return is;\n      };\n      /**\r\n       * @example\r\n       * this.formatValueText(someVal); // format single numeric value to text.\r\n       * this.formatValueText(someVal, true); // format single category value to text.\r\n       * this.formatValueText([min, max]); // format numeric min-max to text.\r\n       * this.formatValueText([this.dataBound[0], max]); // using data lower bound.\r\n       * this.formatValueText([min, this.dataBound[1]]); // using data upper bound.\r\n       *\r\n       * @param value Real value, or this.dataBound[0 or 1].\r\n       * @param isCategory Only available when value is number.\r\n       * @param edgeSymbols Open-close symbol when value is interval.\r\n       * @protected\r\n       */\n      VisualMapModel.prototype.formatValueText = function (value, isCategory, edgeSymbols) {\n        var option = this.option;\n        var precision = option.precision;\n        var dataBound = this.dataBound;\n        var formatter = option.formatter;\n        var isMinMax;\n        edgeSymbols = edgeSymbols || ['<', '>'];\n        if (isArray(value)) {\n          value = value.slice();\n          isMinMax = true;\n        }\n        var textValue = isCategory ? value // Value is string when isCategory\n        : isMinMax ? [toFixed(value[0]), toFixed(value[1])] : toFixed(value);\n        if (isString(formatter)) {\n          return formatter.replace('{value}', isMinMax ? textValue[0] : textValue).replace('{value2}', isMinMax ? textValue[1] : textValue);\n        } else if (isFunction(formatter)) {\n          return isMinMax ? formatter(value[0], value[1]) : formatter(value);\n        }\n        if (isMinMax) {\n          if (value[0] === dataBound[0]) {\n            return edgeSymbols[0] + ' ' + textValue[1];\n          } else if (value[1] === dataBound[1]) {\n            return edgeSymbols[1] + ' ' + textValue[0];\n          } else {\n            return textValue[0] + ' - ' + textValue[1];\n          }\n        } else {\n          // Format single value (includes category case).\n          return textValue;\n        }\n        function toFixed(val) {\n          return val === dataBound[0] ? 'min' : val === dataBound[1] ? 'max' : (+val).toFixed(Math.min(precision, 20));\n        }\n      };\n      /**\r\n       * @protected\r\n       */\n      VisualMapModel.prototype.resetExtent = function () {\n        var thisOption = this.option;\n        // Can not calculate data extent by data here.\n        // Because series and data may be modified in processing stage.\n        // So we do not support the feature \"auto min/max\".\n        var extent = asc$2([thisOption.min, thisOption.max]);\n        this._dataExtent = extent;\n      };\n      /**\r\n       * PENDING:\r\n       * delete this method if no outer usage.\r\n       *\r\n       * Return  Concrete dimension. If null/undefined is returned, no dimension is used.\r\n       */\n      // getDataDimension(data: SeriesData) {\n      //     const optDim = this.option.dimension;\n      //     if (optDim != null) {\n      //         return data.getDimension(optDim);\n      //     }\n      //     const dimNames = data.dimensions;\n      //     for (let i = dimNames.length - 1; i >= 0; i--) {\n      //         const dimName = dimNames[i];\n      //         const dimInfo = data.getDimensionInfo(dimName);\n      //         if (!dimInfo.isCalculationCoord) {\n      //             return dimName;\n      //         }\n      //     }\n      // }\n      VisualMapModel.prototype.getDataDimensionIndex = function (data) {\n        var optDim = this.option.dimension;\n        if (optDim != null) {\n          return data.getDimensionIndex(optDim);\n        }\n        var dimNames = data.dimensions;\n        for (var i = dimNames.length - 1; i >= 0; i--) {\n          var dimName = dimNames[i];\n          var dimInfo = data.getDimensionInfo(dimName);\n          if (!dimInfo.isCalculationCoord) {\n            return dimInfo.storeDimIndex;\n          }\n        }\n      };\n      VisualMapModel.prototype.getExtent = function () {\n        return this._dataExtent.slice();\n      };\n      VisualMapModel.prototype.completeVisualOption = function () {\n        var ecModel = this.ecModel;\n        var thisOption = this.option;\n        var base = {\n          inRange: thisOption.inRange,\n          outOfRange: thisOption.outOfRange\n        };\n        var target = thisOption.target || (thisOption.target = {});\n        var controller = thisOption.controller || (thisOption.controller = {});\n        merge(target, base); // Do not override\n        merge(controller, base); // Do not override\n        var isCategory = this.isCategory();\n        completeSingle.call(this, target);\n        completeSingle.call(this, controller);\n        completeInactive.call(this, target, 'inRange', 'outOfRange');\n        // completeInactive.call(this, target, 'outOfRange', 'inRange');\n        completeController.call(this, controller);\n        function completeSingle(base) {\n          // Compatible with ec2 dataRange.color.\n          // The mapping order of dataRange.color is: [high value, ..., low value]\n          // whereas inRange.color and outOfRange.color is [low value, ..., high value]\n          // Notice: ec2 has no inverse.\n          if (isArray$1(thisOption.color)\n          // If there has been inRange: {symbol: ...}, adding color is a mistake.\n          // So adding color only when no inRange defined.\n          && !base.inRange) {\n            base.inRange = {\n              color: thisOption.color.slice().reverse()\n            };\n          }\n          // Compatible with previous logic, always give a default color, otherwise\n          // simple config with no inRange and outOfRange will not work.\n          // Originally we use visualMap.color as the default color, but setOption at\n          // the second time the default color will be erased. So we change to use\n          // constant DEFAULT_COLOR.\n          // If user do not want the default color, set inRange: {color: null}.\n          base.inRange = base.inRange || {\n            color: ecModel.get('gradientColor')\n          };\n        }\n        function completeInactive(base, stateExist, stateAbsent) {\n          var optExist = base[stateExist];\n          var optAbsent = base[stateAbsent];\n          if (optExist && !optAbsent) {\n            optAbsent = base[stateAbsent] = {};\n            each$d(optExist, function (visualData, visualType) {\n              if (!VisualMapping.isValidType(visualType)) {\n                return;\n              }\n              var defa = visualDefault.get(visualType, 'inactive', isCategory);\n              if (defa != null) {\n                optAbsent[visualType] = defa;\n                // Compatibable with ec2:\n                // Only inactive color to rgba(0,0,0,0) can not\n                // make label transparent, so use opacity also.\n                if (visualType === 'color' && !optAbsent.hasOwnProperty('opacity') && !optAbsent.hasOwnProperty('colorAlpha')) {\n                  optAbsent.opacity = [0, 0];\n                }\n              }\n            });\n          }\n        }\n        function completeController(controller) {\n          var symbolExists = (controller.inRange || {}).symbol || (controller.outOfRange || {}).symbol;\n          var symbolSizeExists = (controller.inRange || {}).symbolSize || (controller.outOfRange || {}).symbolSize;\n          var inactiveColor = this.get('inactiveColor');\n          var itemSymbol = this.getItemSymbol();\n          var defaultSymbol = itemSymbol || 'roundRect';\n          each$d(this.stateList, function (state) {\n            var itemSize = this.itemSize;\n            var visuals = controller[state];\n            // Set inactive color for controller if no other color\n            // attr (like colorAlpha) specified.\n            if (!visuals) {\n              visuals = controller[state] = {\n                color: isCategory ? inactiveColor : [inactiveColor]\n              };\n            }\n            // Consistent symbol and symbolSize if not specified.\n            if (visuals.symbol == null) {\n              visuals.symbol = symbolExists && clone(symbolExists) || (isCategory ? defaultSymbol : [defaultSymbol]);\n            }\n            if (visuals.symbolSize == null) {\n              visuals.symbolSize = symbolSizeExists && clone(symbolSizeExists) || (isCategory ? itemSize[0] : [itemSize[0], itemSize[0]]);\n            }\n            // Filter none\n            visuals.symbol = mapVisual$1(visuals.symbol, function (symbol) {\n              return symbol === 'none' ? defaultSymbol : symbol;\n            });\n            // Normalize symbolSize\n            var symbolSize = visuals.symbolSize;\n            if (symbolSize != null) {\n              var max_1 = -Infinity;\n              // symbolSize can be object when categories defined.\n              eachVisual(symbolSize, function (value) {\n                value > max_1 && (max_1 = value);\n              });\n              visuals.symbolSize = mapVisual$1(symbolSize, function (value) {\n                return linearMap$1(value, [0, max_1], [0, itemSize[0]], true);\n              });\n            }\n          }, this);\n        }\n      };\n      VisualMapModel.prototype.resetItemSize = function () {\n        this.itemSize = [parseFloat(this.get('itemWidth')), parseFloat(this.get('itemHeight'))];\n      };\n      VisualMapModel.prototype.isCategory = function () {\n        return !!this.option.categories;\n      };\n      /**\r\n       * @public\r\n       * @abstract\r\n       */\n      VisualMapModel.prototype.setSelected = function (selected) {};\n      VisualMapModel.prototype.getSelected = function () {\n        return null;\n      };\n      /**\r\n       * @public\r\n       * @abstract\r\n       */\n      VisualMapModel.prototype.getValueState = function (value) {\n        return null;\n      };\n      /**\r\n       * FIXME\r\n       * Do not publish to thirt-part-dev temporarily\r\n       * util the interface is stable. (Should it return\r\n       * a function but not visual meta?)\r\n       *\r\n       * @pubilc\r\n       * @abstract\r\n       * @param getColorVisual\r\n       *        params: value, valueState\r\n       *        return: color\r\n       * @return {Object} visualMeta\r\n       *        should includes {stops, outerColors}\r\n       *        outerColor means [colorBeyondMinValue, colorBeyondMaxValue]\r\n       */\n      VisualMapModel.prototype.getVisualMeta = function (getColorVisual) {\n        return null;\n      };\n      VisualMapModel.type = 'visualMap';\n      VisualMapModel.dependencies = ['series'];\n      VisualMapModel.defaultOption = {\n        show: true,\n        // zlevel: 0,\n        z: 4,\n        seriesIndex: 'all',\n        min: 0,\n        max: 200,\n        left: 0,\n        right: null,\n        top: null,\n        bottom: 0,\n        itemWidth: null,\n        itemHeight: null,\n        inverse: false,\n        orient: 'vertical',\n        backgroundColor: 'rgba(0,0,0,0)',\n        borderColor: '#ccc',\n        contentColor: '#5793f3',\n        inactiveColor: '#aaa',\n        borderWidth: 0,\n        padding: 5,\n        // 接受数组分别设定上右下左边距，同css\n        textGap: 10,\n        precision: 0,\n        textStyle: {\n          color: '#333' // 值域文字颜色\n        }\n      };\n      return VisualMapModel;\n    }(ComponentModel);\n\n    // Constant\n    var DEFAULT_BAR_BOUND = [20, 140];\n    var ContinuousModel = /** @class */function (_super) {\n      __extends(ContinuousModel, _super);\n      function ContinuousModel() {\n        var _this = _super !== null && _super.apply(this, arguments) || this;\n        _this.type = ContinuousModel.type;\n        return _this;\n      }\n      /**\r\n       * @override\r\n       */\n      ContinuousModel.prototype.optionUpdated = function (newOption, isInit) {\n        _super.prototype.optionUpdated.apply(this, arguments);\n        this.resetExtent();\n        this.resetVisual(function (mappingOption) {\n          mappingOption.mappingMethod = 'linear';\n          mappingOption.dataExtent = this.getExtent();\n        });\n        this._resetRange();\n      };\n      /**\r\n       * @protected\r\n       * @override\r\n       */\n      ContinuousModel.prototype.resetItemSize = function () {\n        _super.prototype.resetItemSize.apply(this, arguments);\n        var itemSize = this.itemSize;\n        (itemSize[0] == null || isNaN(itemSize[0])) && (itemSize[0] = DEFAULT_BAR_BOUND[0]);\n        (itemSize[1] == null || isNaN(itemSize[1])) && (itemSize[1] = DEFAULT_BAR_BOUND[1]);\n      };\n      /**\r\n       * @private\r\n       */\n      ContinuousModel.prototype._resetRange = function () {\n        var dataExtent = this.getExtent();\n        var range = this.option.range;\n        if (!range || range.auto) {\n          // `range` should always be array (so we don't use other\n          // value like 'auto') for user-friend. (consider getOption).\n          dataExtent.auto = 1;\n          this.option.range = dataExtent;\n        } else if (isArray(range)) {\n          if (range[0] > range[1]) {\n            range.reverse();\n          }\n          range[0] = Math.max(range[0], dataExtent[0]);\n          range[1] = Math.min(range[1], dataExtent[1]);\n        }\n      };\n      /**\r\n       * @protected\r\n       * @override\r\n       */\n      ContinuousModel.prototype.completeVisualOption = function () {\n        _super.prototype.completeVisualOption.apply(this, arguments);\n        each(this.stateList, function (state) {\n          var symbolSize = this.option.controller[state].symbolSize;\n          if (symbolSize && symbolSize[0] !== symbolSize[1]) {\n            symbolSize[0] = symbolSize[1] / 3; // For good looking.\n          }\n        }, this);\n      };\n      /**\r\n       * @override\r\n       */\n      ContinuousModel.prototype.setSelected = function (selected) {\n        this.option.range = selected.slice();\n        this._resetRange();\n      };\n      /**\r\n       * @public\r\n       */\n      ContinuousModel.prototype.getSelected = function () {\n        var dataExtent = this.getExtent();\n        var dataInterval = asc((this.get('range') || []).slice());\n        // Clamp\n        dataInterval[0] > dataExtent[1] && (dataInterval[0] = dataExtent[1]);\n        dataInterval[1] > dataExtent[1] && (dataInterval[1] = dataExtent[1]);\n        dataInterval[0] < dataExtent[0] && (dataInterval[0] = dataExtent[0]);\n        dataInterval[1] < dataExtent[0] && (dataInterval[1] = dataExtent[0]);\n        return dataInterval;\n      };\n      /**\r\n       * @override\r\n       */\n      ContinuousModel.prototype.getValueState = function (value) {\n        var range = this.option.range;\n        var dataExtent = this.getExtent();\n        // When range[0] === dataExtent[0], any value larger than dataExtent[0] maps to 'inRange'.\n        // range[1] is processed likewise.\n        return (range[0] <= dataExtent[0] || range[0] <= value) && (range[1] >= dataExtent[1] || value <= range[1]) ? 'inRange' : 'outOfRange';\n      };\n      ContinuousModel.prototype.findTargetDataIndices = function (range) {\n        var result = [];\n        this.eachTargetSeries(function (seriesModel) {\n          var dataIndices = [];\n          var data = seriesModel.getData();\n          data.each(this.getDataDimensionIndex(data), function (value, dataIndex) {\n            range[0] <= value && value <= range[1] && dataIndices.push(dataIndex);\n          }, this);\n          result.push({\n            seriesId: seriesModel.id,\n            dataIndex: dataIndices\n          });\n        }, this);\n        return result;\n      };\n      /**\r\n       * @implement\r\n       */\n      ContinuousModel.prototype.getVisualMeta = function (getColorVisual) {\n        var oVals = getColorStopValues(this, 'outOfRange', this.getExtent());\n        var iVals = getColorStopValues(this, 'inRange', this.option.range.slice());\n        var stops = [];\n        function setStop(value, valueState) {\n          stops.push({\n            value: value,\n            color: getColorVisual(value, valueState)\n          });\n        }\n        // Format to: outOfRange -- inRange -- outOfRange.\n        var iIdx = 0;\n        var oIdx = 0;\n        var iLen = iVals.length;\n        var oLen = oVals.length;\n        for (; oIdx < oLen && (!iVals.length || oVals[oIdx] <= iVals[0]); oIdx++) {\n          // If oVal[oIdx] === iVals[iIdx], oVal[oIdx] should be ignored.\n          if (oVals[oIdx] < iVals[iIdx]) {\n            setStop(oVals[oIdx], 'outOfRange');\n          }\n        }\n        for (var first = 1; iIdx < iLen; iIdx++, first = 0) {\n          // If range is full, value beyond min, max will be clamped.\n          // make a singularity\n          first && stops.length && setStop(iVals[iIdx], 'outOfRange');\n          setStop(iVals[iIdx], 'inRange');\n        }\n        for (var first = 1; oIdx < oLen; oIdx++) {\n          if (!iVals.length || iVals[iVals.length - 1] < oVals[oIdx]) {\n            // make a singularity\n            if (first) {\n              stops.length && setStop(stops[stops.length - 1].value, 'outOfRange');\n              first = 0;\n            }\n            setStop(oVals[oIdx], 'outOfRange');\n          }\n        }\n        var stopsLen = stops.length;\n        return {\n          stops: stops,\n          outerColors: [stopsLen ? stops[0].color : 'transparent', stopsLen ? stops[stopsLen - 1].color : 'transparent']\n        };\n      };\n      ContinuousModel.type = 'visualMap.continuous';\n      ContinuousModel.defaultOption = inheritDefaultOption(VisualMapModel.defaultOption, {\n        align: 'auto',\n        calculable: false,\n        hoverLink: true,\n        realtime: true,\n        handleIcon: 'path://M-11.39,9.77h0a3.5,3.5,0,0,1-3.5,3.5h-22a3.5,3.5,0,0,1-3.5-3.5h0a3.5,3.5,0,0,1,3.5-3.5h22A3.5,3.5,0,0,1-11.39,9.77Z',\n        handleSize: '120%',\n        handleStyle: {\n          borderColor: '#fff',\n          borderWidth: 1\n        },\n        indicatorIcon: 'circle',\n        indicatorSize: '50%',\n        indicatorStyle: {\n          borderColor: '#fff',\n          borderWidth: 2,\n          shadowBlur: 2,\n          shadowOffsetX: 1,\n          shadowOffsetY: 1,\n          shadowColor: 'rgba(0,0,0,0.2)'\n        }\n        // emphasis: {\n        //     handleStyle: {\n        //         shadowBlur: 3,\n        //         shadowOffsetX: 1,\n        //         shadowOffsetY: 1,\n        //         shadowColor: 'rgba(0,0,0,0.2)'\n        //     }\n        // }\n      });\n      return ContinuousModel;\n    }(VisualMapModel);\n    function getColorStopValues(visualMapModel, valueState, dataExtent) {\n      if (dataExtent[0] === dataExtent[1]) {\n        return dataExtent.slice();\n      }\n      // When using colorHue mapping, it is not linear color any more.\n      // Moreover, canvas gradient seems not to be accurate linear.\n      // FIXME\n      // Should be arbitrary value 100? or based on pixel size?\n      var count = 200;\n      var step = (dataExtent[1] - dataExtent[0]) / count;\n      var value = dataExtent[0];\n      var stopValues = [];\n      for (var i = 0; i <= count && value < dataExtent[1]; i++) {\n        stopValues.push(value);\n        value += step;\n      }\n      stopValues.push(dataExtent[1]);\n      return stopValues;\n    }\n\n    var VisualMapView = /** @class */function (_super) {\n      __extends(VisualMapView, _super);\n      function VisualMapView() {\n        var _this = _super !== null && _super.apply(this, arguments) || this;\n        _this.type = VisualMapView.type;\n        _this.autoPositionValues = {\n          left: 1,\n          right: 1,\n          top: 1,\n          bottom: 1\n        };\n        return _this;\n      }\n      VisualMapView.prototype.init = function (ecModel, api) {\n        this.ecModel = ecModel;\n        this.api = api;\n      };\n      /**\r\n       * @protected\r\n       */\n      VisualMapView.prototype.render = function (visualMapModel, ecModel, api, payload // TODO: TYPE\n      ) {\n        this.visualMapModel = visualMapModel;\n        if (visualMapModel.get('show') === false) {\n          this.group.removeAll();\n          return;\n        }\n        this.doRender(visualMapModel, ecModel, api, payload);\n      };\n      /**\r\n       * @protected\r\n       */\n      VisualMapView.prototype.renderBackground = function (group) {\n        var visualMapModel = this.visualMapModel;\n        var padding = normalizeCssArray$1(visualMapModel.get('padding') || 0);\n        var rect = group.getBoundingRect();\n        group.add(new Rect({\n          z2: -1,\n          silent: true,\n          shape: {\n            x: rect.x - padding[3],\n            y: rect.y - padding[0],\n            width: rect.width + padding[3] + padding[1],\n            height: rect.height + padding[0] + padding[2]\n          },\n          style: {\n            fill: visualMapModel.get('backgroundColor'),\n            stroke: visualMapModel.get('borderColor'),\n            lineWidth: visualMapModel.get('borderWidth')\n          }\n        }));\n      };\n      /**\r\n       * @protected\r\n       * @param targetValue can be Infinity or -Infinity\r\n       * @param visualCluster Only can be 'color' 'opacity' 'symbol' 'symbolSize'\r\n       * @param opts\r\n       * @param opts.forceState Specify state, instead of using getValueState method.\r\n       * @param opts.convertOpacityToAlpha For color gradient in controller widget.\r\n       * @return {*} Visual value.\r\n       */\n      VisualMapView.prototype.getControllerVisual = function (targetValue, visualCluster, opts) {\n        opts = opts || {};\n        var forceState = opts.forceState;\n        var visualMapModel = this.visualMapModel;\n        var visualObj = {};\n        // Default values.\n        if (visualCluster === 'color') {\n          var defaultColor = visualMapModel.get('contentColor');\n          visualObj.color = defaultColor;\n        }\n        function getter(key) {\n          return visualObj[key];\n        }\n        function setter(key, value) {\n          visualObj[key] = value;\n        }\n        var mappings = visualMapModel.controllerVisuals[forceState || visualMapModel.getValueState(targetValue)];\n        var visualTypes = VisualMapping.prepareVisualTypes(mappings);\n        each(visualTypes, function (type) {\n          var visualMapping = mappings[type];\n          if (opts.convertOpacityToAlpha && type === 'opacity') {\n            type = 'colorAlpha';\n            visualMapping = mappings.__alphaForOpacity;\n          }\n          if (VisualMapping.dependsOn(type, visualCluster)) {\n            visualMapping && visualMapping.applyVisual(targetValue, getter, setter);\n          }\n        });\n        return visualObj[visualCluster];\n      };\n      VisualMapView.prototype.positionGroup = function (group) {\n        var model = this.visualMapModel;\n        var api = this.api;\n        positionElement(group, model.getBoxLayoutParams(), {\n          width: api.getWidth(),\n          height: api.getHeight()\n        });\n      };\n      VisualMapView.prototype.doRender = function (visualMapModel, ecModel, api, payload) {};\n      VisualMapView.type = 'visualMap';\n      return VisualMapView;\n    }(ComponentView);\n\n    var paramsSet = [['left', 'right', 'width'], ['top', 'bottom', 'height']];\n    /**\r\n     * @param visualMapModel\r\n     * @param api\r\n     * @param itemSize always [short, long]\r\n     * @return {string} 'left' or 'right' or 'top' or 'bottom'\r\n     */\n    function getItemAlign(visualMapModel, api, itemSize) {\n      var modelOption = visualMapModel.option;\n      var itemAlign = modelOption.align;\n      if (itemAlign != null && itemAlign !== 'auto') {\n        return itemAlign;\n      }\n      // Auto decision align.\n      var ecSize = {\n        width: api.getWidth(),\n        height: api.getHeight()\n      };\n      var realIndex = modelOption.orient === 'horizontal' ? 1 : 0;\n      var reals = paramsSet[realIndex];\n      var fakeValue = [0, null, 10];\n      var layoutInput = {};\n      for (var i = 0; i < 3; i++) {\n        layoutInput[paramsSet[1 - realIndex][i]] = fakeValue[i];\n        layoutInput[reals[i]] = i === 2 ? itemSize[0] : modelOption[reals[i]];\n      }\n      var rParam = [['x', 'width', 3], ['y', 'height', 0]][realIndex];\n      var rect = getLayoutRect(layoutInput, ecSize, modelOption.padding);\n      return reals[(rect.margin[rParam[2]] || 0) + rect[rParam[0]] + rect[rParam[1]] * 0.5 < ecSize[rParam[1]] * 0.5 ? 0 : 1];\n    }\n    /**\r\n     * Prepare dataIndex for outside usage, where dataIndex means rawIndex, and\r\n     * dataIndexInside means filtered index.\r\n     */\n    // TODO: TYPE more specified payload types.\n    function makeHighDownBatch(batch, visualMapModel) {\n      each(batch || [], function (batchItem) {\n        if (batchItem.dataIndex != null) {\n          batchItem.dataIndexInside = batchItem.dataIndex;\n          batchItem.dataIndex = null;\n        }\n        batchItem.highlightKey = 'visualMap' + (visualMapModel ? visualMapModel.componentIndex : '');\n      });\n      return batch;\n    }\n\n    var linearMap$2 = linearMap;\n    var each$e = each;\n    var mathMin$a = Math.min;\n    var mathMax$a = Math.max;\n    // Arbitrary value\n    var HOVER_LINK_SIZE = 12;\n    var HOVER_LINK_OUT = 6;\n    // Notice:\n    // Any \"interval\" should be by the order of [low, high].\n    // \"handle0\" (handleIndex === 0) maps to\n    // low data value: this._dataInterval[0] and has low coord.\n    // \"handle1\" (handleIndex === 1) maps to\n    // high data value: this._dataInterval[1] and has high coord.\n    // The logic of transform is implemented in this._createBarGroup.\n    var ContinuousView = /** @class */function (_super) {\n      __extends(ContinuousView, _super);\n      function ContinuousView() {\n        var _this = _super !== null && _super.apply(this, arguments) || this;\n        _this.type = ContinuousView.type;\n        _this._shapes = {};\n        _this._dataInterval = [];\n        _this._handleEnds = [];\n        _this._hoverLinkDataIndices = [];\n        return _this;\n      }\n      ContinuousView.prototype.init = function (ecModel, api) {\n        _super.prototype.init.call(this, ecModel, api);\n        this._hoverLinkFromSeriesMouseOver = bind(this._hoverLinkFromSeriesMouseOver, this);\n        this._hideIndicator = bind(this._hideIndicator, this);\n      };\n      ContinuousView.prototype.doRender = function (visualMapModel, ecModel, api, payload) {\n        if (!payload || payload.type !== 'selectDataRange' || payload.from !== this.uid) {\n          this._buildView();\n        }\n      };\n      ContinuousView.prototype._buildView = function () {\n        this.group.removeAll();\n        var visualMapModel = this.visualMapModel;\n        var thisGroup = this.group;\n        this._orient = visualMapModel.get('orient');\n        this._useHandle = visualMapModel.get('calculable');\n        this._resetInterval();\n        this._renderBar(thisGroup);\n        var dataRangeText = visualMapModel.get('text');\n        this._renderEndsText(thisGroup, dataRangeText, 0);\n        this._renderEndsText(thisGroup, dataRangeText, 1);\n        // Do this for background size calculation.\n        this._updateView(true);\n        // After updating view, inner shapes is built completely,\n        // and then background can be rendered.\n        this.renderBackground(thisGroup);\n        // Real update view\n        this._updateView();\n        this._enableHoverLinkToSeries();\n        this._enableHoverLinkFromSeries();\n        this.positionGroup(thisGroup);\n      };\n      ContinuousView.prototype._renderEndsText = function (group, dataRangeText, endsIndex) {\n        if (!dataRangeText) {\n          return;\n        }\n        // Compatible with ec2, text[0] map to high value, text[1] map low value.\n        var text = dataRangeText[1 - endsIndex];\n        text = text != null ? text + '' : '';\n        var visualMapModel = this.visualMapModel;\n        var textGap = visualMapModel.get('textGap');\n        var itemSize = visualMapModel.itemSize;\n        var barGroup = this._shapes.mainGroup;\n        var position = this._applyTransform([itemSize[0] / 2, endsIndex === 0 ? -textGap : itemSize[1] + textGap], barGroup);\n        var align = this._applyTransform(endsIndex === 0 ? 'bottom' : 'top', barGroup);\n        var orient = this._orient;\n        var textStyleModel = this.visualMapModel.textStyleModel;\n        this.group.add(new ZRText({\n          style: createTextStyle(textStyleModel, {\n            x: position[0],\n            y: position[1],\n            verticalAlign: orient === 'horizontal' ? 'middle' : align,\n            align: orient === 'horizontal' ? align : 'center',\n            text: text\n          })\n        }));\n      };\n      ContinuousView.prototype._renderBar = function (targetGroup) {\n        var visualMapModel = this.visualMapModel;\n        var shapes = this._shapes;\n        var itemSize = visualMapModel.itemSize;\n        var orient = this._orient;\n        var useHandle = this._useHandle;\n        var itemAlign = getItemAlign(visualMapModel, this.api, itemSize);\n        var mainGroup = shapes.mainGroup = this._createBarGroup(itemAlign);\n        var gradientBarGroup = new Group();\n        mainGroup.add(gradientBarGroup);\n        // Bar\n        gradientBarGroup.add(shapes.outOfRange = createPolygon());\n        gradientBarGroup.add(shapes.inRange = createPolygon(null, useHandle ? getCursor$1(this._orient) : null, bind(this._dragHandle, this, 'all', false), bind(this._dragHandle, this, 'all', true)));\n        // A border radius clip.\n        gradientBarGroup.setClipPath(new Rect({\n          shape: {\n            x: 0,\n            y: 0,\n            width: itemSize[0],\n            height: itemSize[1],\n            r: 3\n          }\n        }));\n        var textRect = visualMapModel.textStyleModel.getTextRect('国');\n        var textSize = mathMax$a(textRect.width, textRect.height);\n        // Handle\n        if (useHandle) {\n          shapes.handleThumbs = [];\n          shapes.handleLabels = [];\n          shapes.handleLabelPoints = [];\n          this._createHandle(visualMapModel, mainGroup, 0, itemSize, textSize, orient);\n          this._createHandle(visualMapModel, mainGroup, 1, itemSize, textSize, orient);\n        }\n        this._createIndicator(visualMapModel, mainGroup, itemSize, textSize, orient);\n        targetGroup.add(mainGroup);\n      };\n      ContinuousView.prototype._createHandle = function (visualMapModel, mainGroup, handleIndex, itemSize, textSize, orient) {\n        var onDrift = bind(this._dragHandle, this, handleIndex, false);\n        var onDragEnd = bind(this._dragHandle, this, handleIndex, true);\n        var handleSize = parsePercent(visualMapModel.get('handleSize'), itemSize[0]);\n        var handleThumb = createSymbol(visualMapModel.get('handleIcon'), -handleSize / 2, -handleSize / 2, handleSize, handleSize, null, true);\n        var cursor = getCursor$1(this._orient);\n        handleThumb.attr({\n          cursor: cursor,\n          draggable: true,\n          drift: onDrift,\n          ondragend: onDragEnd,\n          onmousemove: function (e) {\n            stop(e.event);\n          }\n        });\n        handleThumb.x = itemSize[0] / 2;\n        handleThumb.useStyle(visualMapModel.getModel('handleStyle').getItemStyle());\n        handleThumb.setStyle({\n          strokeNoScale: true,\n          strokeFirst: true\n        });\n        handleThumb.style.lineWidth *= 2;\n        handleThumb.ensureState('emphasis').style = visualMapModel.getModel(['emphasis', 'handleStyle']).getItemStyle();\n        setAsHighDownDispatcher(handleThumb, true);\n        mainGroup.add(handleThumb);\n        // Text is always horizontal layout but should not be effected by\n        // transform (orient/inverse). So label is built separately but not\n        // use zrender/graphic/helper/RectText, and is located based on view\n        // group (according to handleLabelPoint) but not barGroup.\n        var textStyleModel = this.visualMapModel.textStyleModel;\n        var handleLabel = new ZRText({\n          cursor: cursor,\n          draggable: true,\n          drift: onDrift,\n          onmousemove: function (e) {\n            // For mobile device, prevent screen slider on the button.\n            stop(e.event);\n          },\n          ondragend: onDragEnd,\n          style: createTextStyle(textStyleModel, {\n            x: 0,\n            y: 0,\n            text: ''\n          })\n        });\n        handleLabel.ensureState('blur').style = {\n          opacity: 0.1\n        };\n        handleLabel.stateTransition = {\n          duration: 200\n        };\n        this.group.add(handleLabel);\n        var handleLabelPoint = [handleSize, 0];\n        var shapes = this._shapes;\n        shapes.handleThumbs[handleIndex] = handleThumb;\n        shapes.handleLabelPoints[handleIndex] = handleLabelPoint;\n        shapes.handleLabels[handleIndex] = handleLabel;\n      };\n      ContinuousView.prototype._createIndicator = function (visualMapModel, mainGroup, itemSize, textSize, orient) {\n        var scale = parsePercent(visualMapModel.get('indicatorSize'), itemSize[0]);\n        var indicator = createSymbol(visualMapModel.get('indicatorIcon'), -scale / 2, -scale / 2, scale, scale, null, true);\n        indicator.attr({\n          cursor: 'move',\n          invisible: true,\n          silent: true,\n          x: itemSize[0] / 2\n        });\n        var indicatorStyle = visualMapModel.getModel('indicatorStyle').getItemStyle();\n        if (indicator instanceof ZRImage) {\n          var pathStyle = indicator.style;\n          indicator.useStyle(extend({\n            // TODO other properties like x, y ?\n            image: pathStyle.image,\n            x: pathStyle.x,\n            y: pathStyle.y,\n            width: pathStyle.width,\n            height: pathStyle.height\n          }, indicatorStyle));\n        } else {\n          indicator.useStyle(indicatorStyle);\n        }\n        mainGroup.add(indicator);\n        var textStyleModel = this.visualMapModel.textStyleModel;\n        var indicatorLabel = new ZRText({\n          silent: true,\n          invisible: true,\n          style: createTextStyle(textStyleModel, {\n            x: 0,\n            y: 0,\n            text: ''\n          })\n        });\n        this.group.add(indicatorLabel);\n        var indicatorLabelPoint = [(orient === 'horizontal' ? textSize / 2 : HOVER_LINK_OUT) + itemSize[0] / 2, 0];\n        var shapes = this._shapes;\n        shapes.indicator = indicator;\n        shapes.indicatorLabel = indicatorLabel;\n        shapes.indicatorLabelPoint = indicatorLabelPoint;\n        this._firstShowIndicator = true;\n      };\n      ContinuousView.prototype._dragHandle = function (handleIndex, isEnd,\n      // dx is event from ondragend if isEnd is true. It's not used\n      dx, dy) {\n        if (!this._useHandle) {\n          return;\n        }\n        this._dragging = !isEnd;\n        if (!isEnd) {\n          // Transform dx, dy to bar coordination.\n          var vertex = this._applyTransform([dx, dy], this._shapes.mainGroup, true);\n          this._updateInterval(handleIndex, vertex[1]);\n          this._hideIndicator();\n          // Considering realtime, update view should be executed\n          // before dispatch action.\n          this._updateView();\n        }\n        // dragEnd do not dispatch action when realtime.\n        if (isEnd === !this.visualMapModel.get('realtime')) {\n          // jshint ignore:line\n          this.api.dispatchAction({\n            type: 'selectDataRange',\n            from: this.uid,\n            visualMapId: this.visualMapModel.id,\n            selected: this._dataInterval.slice()\n          });\n        }\n        if (isEnd) {\n          !this._hovering && this._clearHoverLinkToSeries();\n        } else if (useHoverLinkOnHandle(this.visualMapModel)) {\n          this._doHoverLinkToSeries(this._handleEnds[handleIndex], false);\n        }\n      };\n      ContinuousView.prototype._resetInterval = function () {\n        var visualMapModel = this.visualMapModel;\n        var dataInterval = this._dataInterval = visualMapModel.getSelected();\n        var dataExtent = visualMapModel.getExtent();\n        var sizeExtent = [0, visualMapModel.itemSize[1]];\n        this._handleEnds = [linearMap$2(dataInterval[0], dataExtent, sizeExtent, true), linearMap$2(dataInterval[1], dataExtent, sizeExtent, true)];\n      };\n      /**\r\n       * @private\r\n       * @param {(number|string)} handleIndex 0 or 1 or 'all'\r\n       * @param {number} dx\r\n       * @param {number} dy\r\n       */\n      ContinuousView.prototype._updateInterval = function (handleIndex, delta) {\n        delta = delta || 0;\n        var visualMapModel = this.visualMapModel;\n        var handleEnds = this._handleEnds;\n        var sizeExtent = [0, visualMapModel.itemSize[1]];\n        sliderMove(delta, handleEnds, sizeExtent, handleIndex,\n        // cross is forbidden\n        0);\n        var dataExtent = visualMapModel.getExtent();\n        // Update data interval.\n        this._dataInterval = [linearMap$2(handleEnds[0], sizeExtent, dataExtent, true), linearMap$2(handleEnds[1], sizeExtent, dataExtent, true)];\n      };\n      ContinuousView.prototype._updateView = function (forSketch) {\n        var visualMapModel = this.visualMapModel;\n        var dataExtent = visualMapModel.getExtent();\n        var shapes = this._shapes;\n        var outOfRangeHandleEnds = [0, visualMapModel.itemSize[1]];\n        var inRangeHandleEnds = forSketch ? outOfRangeHandleEnds : this._handleEnds;\n        var visualInRange = this._createBarVisual(this._dataInterval, dataExtent, inRangeHandleEnds, 'inRange');\n        var visualOutOfRange = this._createBarVisual(dataExtent, dataExtent, outOfRangeHandleEnds, 'outOfRange');\n        shapes.inRange.setStyle({\n          fill: visualInRange.barColor\n          // opacity: visualInRange.opacity\n        }).setShape('points', visualInRange.barPoints);\n        shapes.outOfRange.setStyle({\n          fill: visualOutOfRange.barColor\n          // opacity: visualOutOfRange.opacity\n        }).setShape('points', visualOutOfRange.barPoints);\n        this._updateHandle(inRangeHandleEnds, visualInRange);\n      };\n      ContinuousView.prototype._createBarVisual = function (dataInterval, dataExtent, handleEnds, forceState) {\n        var opts = {\n          forceState: forceState,\n          convertOpacityToAlpha: true\n        };\n        var colorStops = this._makeColorGradient(dataInterval, opts);\n        var symbolSizes = [this.getControllerVisual(dataInterval[0], 'symbolSize', opts), this.getControllerVisual(dataInterval[1], 'symbolSize', opts)];\n        var barPoints = this._createBarPoints(handleEnds, symbolSizes);\n        return {\n          barColor: new LinearGradient(0, 0, 0, 1, colorStops),\n          barPoints: barPoints,\n          handlesColor: [colorStops[0].color, colorStops[colorStops.length - 1].color]\n        };\n      };\n      ContinuousView.prototype._makeColorGradient = function (dataInterval, opts) {\n        // Considering colorHue, which is not linear, so we have to sample\n        // to calculate gradient color stops, but not only calculate head\n        // and tail.\n        var sampleNumber = 100; // Arbitrary value.\n        var colorStops = [];\n        var step = (dataInterval[1] - dataInterval[0]) / sampleNumber;\n        colorStops.push({\n          color: this.getControllerVisual(dataInterval[0], 'color', opts),\n          offset: 0\n        });\n        for (var i = 1; i < sampleNumber; i++) {\n          var currValue = dataInterval[0] + step * i;\n          if (currValue > dataInterval[1]) {\n            break;\n          }\n          colorStops.push({\n            color: this.getControllerVisual(currValue, 'color', opts),\n            offset: i / sampleNumber\n          });\n        }\n        colorStops.push({\n          color: this.getControllerVisual(dataInterval[1], 'color', opts),\n          offset: 1\n        });\n        return colorStops;\n      };\n      ContinuousView.prototype._createBarPoints = function (handleEnds, symbolSizes) {\n        var itemSize = this.visualMapModel.itemSize;\n        return [[itemSize[0] - symbolSizes[0], handleEnds[0]], [itemSize[0], handleEnds[0]], [itemSize[0], handleEnds[1]], [itemSize[0] - symbolSizes[1], handleEnds[1]]];\n      };\n      ContinuousView.prototype._createBarGroup = function (itemAlign) {\n        var orient = this._orient;\n        var inverse = this.visualMapModel.get('inverse');\n        return new Group(orient === 'horizontal' && !inverse ? {\n          scaleX: itemAlign === 'bottom' ? 1 : -1,\n          rotation: Math.PI / 2\n        } : orient === 'horizontal' && inverse ? {\n          scaleX: itemAlign === 'bottom' ? -1 : 1,\n          rotation: -Math.PI / 2\n        } : orient === 'vertical' && !inverse ? {\n          scaleX: itemAlign === 'left' ? 1 : -1,\n          scaleY: -1\n        } : {\n          scaleX: itemAlign === 'left' ? 1 : -1\n        });\n      };\n      ContinuousView.prototype._updateHandle = function (handleEnds, visualInRange) {\n        if (!this._useHandle) {\n          return;\n        }\n        var shapes = this._shapes;\n        var visualMapModel = this.visualMapModel;\n        var handleThumbs = shapes.handleThumbs;\n        var handleLabels = shapes.handleLabels;\n        var itemSize = visualMapModel.itemSize;\n        var dataExtent = visualMapModel.getExtent();\n        var align = this._applyTransform('left', shapes.mainGroup);\n        each$e([0, 1], function (handleIndex) {\n          var handleThumb = handleThumbs[handleIndex];\n          handleThumb.setStyle('fill', visualInRange.handlesColor[handleIndex]);\n          handleThumb.y = handleEnds[handleIndex];\n          var val = linearMap$2(handleEnds[handleIndex], [0, itemSize[1]], dataExtent, true);\n          var symbolSize = this.getControllerVisual(val, 'symbolSize');\n          handleThumb.scaleX = handleThumb.scaleY = symbolSize / itemSize[0];\n          handleThumb.x = itemSize[0] - symbolSize / 2;\n          // Update handle label position.\n          var textPoint = applyTransform$1(shapes.handleLabelPoints[handleIndex], getTransform(handleThumb, this.group));\n          if (this._orient === 'horizontal') {\n            // If visualMap controls symbol size, an additional offset needs to be added to labels to avoid collision at minimum size.\n            // Offset reaches value of 0 at \"maximum\" position, so maximum position is not altered at all.\n            var minimumOffset = align === 'left' || align === 'top' ? (itemSize[0] - symbolSize) / 2 : (itemSize[0] - symbolSize) / -2;\n            textPoint[1] += minimumOffset;\n          }\n          handleLabels[handleIndex].setStyle({\n            x: textPoint[0],\n            y: textPoint[1],\n            text: visualMapModel.formatValueText(this._dataInterval[handleIndex]),\n            verticalAlign: 'middle',\n            align: this._orient === 'vertical' ? this._applyTransform('left', shapes.mainGroup) : 'center'\n          });\n        }, this);\n      };\n      ContinuousView.prototype._showIndicator = function (cursorValue, textValue, rangeSymbol, halfHoverLinkSize) {\n        var visualMapModel = this.visualMapModel;\n        var dataExtent = visualMapModel.getExtent();\n        var itemSize = visualMapModel.itemSize;\n        var sizeExtent = [0, itemSize[1]];\n        var shapes = this._shapes;\n        var indicator = shapes.indicator;\n        if (!indicator) {\n          return;\n        }\n        indicator.attr('invisible', false);\n        var opts = {\n          convertOpacityToAlpha: true\n        };\n        var color = this.getControllerVisual(cursorValue, 'color', opts);\n        var symbolSize = this.getControllerVisual(cursorValue, 'symbolSize');\n        var y = linearMap$2(cursorValue, dataExtent, sizeExtent, true);\n        var x = itemSize[0] - symbolSize / 2;\n        var oldIndicatorPos = {\n          x: indicator.x,\n          y: indicator.y\n        };\n        // Update handle label position.\n        indicator.y = y;\n        indicator.x = x;\n        var textPoint = applyTransform$1(shapes.indicatorLabelPoint, getTransform(indicator, this.group));\n        var indicatorLabel = shapes.indicatorLabel;\n        indicatorLabel.attr('invisible', false);\n        var align = this._applyTransform('left', shapes.mainGroup);\n        var orient = this._orient;\n        var isHorizontal = orient === 'horizontal';\n        indicatorLabel.setStyle({\n          text: (rangeSymbol ? rangeSymbol : '') + visualMapModel.formatValueText(textValue),\n          verticalAlign: isHorizontal ? align : 'middle',\n          align: isHorizontal ? 'center' : align\n        });\n        var indicatorNewProps = {\n          x: x,\n          y: y,\n          style: {\n            fill: color\n          }\n        };\n        var labelNewProps = {\n          style: {\n            x: textPoint[0],\n            y: textPoint[1]\n          }\n        };\n        if (visualMapModel.ecModel.isAnimationEnabled() && !this._firstShowIndicator) {\n          var animationCfg = {\n            duration: 100,\n            easing: 'cubicInOut',\n            additive: true\n          };\n          indicator.x = oldIndicatorPos.x;\n          indicator.y = oldIndicatorPos.y;\n          indicator.animateTo(indicatorNewProps, animationCfg);\n          indicatorLabel.animateTo(labelNewProps, animationCfg);\n        } else {\n          indicator.attr(indicatorNewProps);\n          indicatorLabel.attr(labelNewProps);\n        }\n        this._firstShowIndicator = false;\n        var handleLabels = this._shapes.handleLabels;\n        if (handleLabels) {\n          for (var i = 0; i < handleLabels.length; i++) {\n            // Fade out handle labels.\n            // NOTE: Must use api enter/leave on emphasis/blur/select state. Or the global states manager will change it.\n            this.api.enterBlur(handleLabels[i]);\n          }\n        }\n      };\n      ContinuousView.prototype._enableHoverLinkToSeries = function () {\n        var self = this;\n        this._shapes.mainGroup.on('mousemove', function (e) {\n          self._hovering = true;\n          if (!self._dragging) {\n            var itemSize = self.visualMapModel.itemSize;\n            var pos = self._applyTransform([e.offsetX, e.offsetY], self._shapes.mainGroup, true, true);\n            // For hover link show when hover handle, which might be\n            // below or upper than sizeExtent.\n            pos[1] = mathMin$a(mathMax$a(0, pos[1]), itemSize[1]);\n            self._doHoverLinkToSeries(pos[1], 0 <= pos[0] && pos[0] <= itemSize[0]);\n          }\n        }).on('mouseout', function () {\n          // When mouse is out of handle, hoverLink still need\n          // to be displayed when realtime is set as false.\n          self._hovering = false;\n          !self._dragging && self._clearHoverLinkToSeries();\n        });\n      };\n      ContinuousView.prototype._enableHoverLinkFromSeries = function () {\n        var zr = this.api.getZr();\n        if (this.visualMapModel.option.hoverLink) {\n          zr.on('mouseover', this._hoverLinkFromSeriesMouseOver, this);\n          zr.on('mouseout', this._hideIndicator, this);\n        } else {\n          this._clearHoverLinkFromSeries();\n        }\n      };\n      ContinuousView.prototype._doHoverLinkToSeries = function (cursorPos, hoverOnBar) {\n        var visualMapModel = this.visualMapModel;\n        var itemSize = visualMapModel.itemSize;\n        if (!visualMapModel.option.hoverLink) {\n          return;\n        }\n        var sizeExtent = [0, itemSize[1]];\n        var dataExtent = visualMapModel.getExtent();\n        // For hover link show when hover handle, which might be below or upper than sizeExtent.\n        cursorPos = mathMin$a(mathMax$a(sizeExtent[0], cursorPos), sizeExtent[1]);\n        var halfHoverLinkSize = getHalfHoverLinkSize(visualMapModel, dataExtent, sizeExtent);\n        var hoverRange = [cursorPos - halfHoverLinkSize, cursorPos + halfHoverLinkSize];\n        var cursorValue = linearMap$2(cursorPos, sizeExtent, dataExtent, true);\n        var valueRange = [linearMap$2(hoverRange[0], sizeExtent, dataExtent, true), linearMap$2(hoverRange[1], sizeExtent, dataExtent, true)];\n        // Consider data range is out of visualMap range, see test/visualMap-continuous.html,\n        // where china and india has very large population.\n        hoverRange[0] < sizeExtent[0] && (valueRange[0] = -Infinity);\n        hoverRange[1] > sizeExtent[1] && (valueRange[1] = Infinity);\n        // Do not show indicator when mouse is over handle,\n        // otherwise labels overlap, especially when dragging.\n        if (hoverOnBar) {\n          if (valueRange[0] === -Infinity) {\n            this._showIndicator(cursorValue, valueRange[1], '< ', halfHoverLinkSize);\n          } else if (valueRange[1] === Infinity) {\n            this._showIndicator(cursorValue, valueRange[0], '> ', halfHoverLinkSize);\n          } else {\n            this._showIndicator(cursorValue, cursorValue, '≈ ', halfHoverLinkSize);\n          }\n        }\n        // When realtime is set as false, handles, which are in barGroup,\n        // also trigger hoverLink, which help user to realize where they\n        // focus on when dragging. (see test/heatmap-large.html)\n        // When realtime is set as true, highlight will not show when hover\n        // handle, because the label on handle, which displays a exact value\n        // but not range, might mislead users.\n        var oldBatch = this._hoverLinkDataIndices;\n        var newBatch = [];\n        if (hoverOnBar || useHoverLinkOnHandle(visualMapModel)) {\n          newBatch = this._hoverLinkDataIndices = visualMapModel.findTargetDataIndices(valueRange);\n        }\n        var resultBatches = compressBatches(oldBatch, newBatch);\n        this._dispatchHighDown('downplay', makeHighDownBatch(resultBatches[0], visualMapModel));\n        this._dispatchHighDown('highlight', makeHighDownBatch(resultBatches[1], visualMapModel));\n      };\n      ContinuousView.prototype._hoverLinkFromSeriesMouseOver = function (e) {\n        var ecData;\n        findEventDispatcher(e.target, function (target) {\n          var currECData = getECData(target);\n          if (currECData.dataIndex != null) {\n            ecData = currECData;\n            return true;\n          }\n        }, true);\n        if (!ecData) {\n          return;\n        }\n        var dataModel = this.ecModel.getSeriesByIndex(ecData.seriesIndex);\n        var visualMapModel = this.visualMapModel;\n        if (!visualMapModel.isTargetSeries(dataModel)) {\n          return;\n        }\n        var data = dataModel.getData(ecData.dataType);\n        var value = data.getStore().get(visualMapModel.getDataDimensionIndex(data), ecData.dataIndex);\n        if (!isNaN(value)) {\n          this._showIndicator(value, value);\n        }\n      };\n      ContinuousView.prototype._hideIndicator = function () {\n        var shapes = this._shapes;\n        shapes.indicator && shapes.indicator.attr('invisible', true);\n        shapes.indicatorLabel && shapes.indicatorLabel.attr('invisible', true);\n        var handleLabels = this._shapes.handleLabels;\n        if (handleLabels) {\n          for (var i = 0; i < handleLabels.length; i++) {\n            // Fade out handle labels.\n            // NOTE: Must use api enter/leave on emphasis/blur/select state. Or the global states manager will change it.\n            this.api.leaveBlur(handleLabels[i]);\n          }\n        }\n      };\n      ContinuousView.prototype._clearHoverLinkToSeries = function () {\n        this._hideIndicator();\n        var indices = this._hoverLinkDataIndices;\n        this._dispatchHighDown('downplay', makeHighDownBatch(indices, this.visualMapModel));\n        indices.length = 0;\n      };\n      ContinuousView.prototype._clearHoverLinkFromSeries = function () {\n        this._hideIndicator();\n        var zr = this.api.getZr();\n        zr.off('mouseover', this._hoverLinkFromSeriesMouseOver);\n        zr.off('mouseout', this._hideIndicator);\n      };\n      ContinuousView.prototype._applyTransform = function (vertex, element, inverse, global) {\n        var transform = getTransform(element, global ? null : this.group);\n        return isArray(vertex) ? applyTransform$1(vertex, transform, inverse) : transformDirection(vertex, transform, inverse);\n      };\n      // TODO: TYPE more specified payload types.\n      ContinuousView.prototype._dispatchHighDown = function (type, batch) {\n        batch && batch.length && this.api.dispatchAction({\n          type: type,\n          batch: batch\n        });\n      };\n      /**\r\n       * @override\r\n       */\n      ContinuousView.prototype.dispose = function () {\n        this._clearHoverLinkFromSeries();\n        this._clearHoverLinkToSeries();\n      };\n      ContinuousView.type = 'visualMap.continuous';\n      return ContinuousView;\n    }(VisualMapView);\n    function createPolygon(points, cursor, onDrift, onDragEnd) {\n      return new Polygon({\n        shape: {\n          points: points\n        },\n        draggable: !!onDrift,\n        cursor: cursor,\n        drift: onDrift,\n        onmousemove: function (e) {\n          // For mobile device, prevent screen slider on the button.\n          stop(e.event);\n        },\n        ondragend: onDragEnd\n      });\n    }\n    function getHalfHoverLinkSize(visualMapModel, dataExtent, sizeExtent) {\n      var halfHoverLinkSize = HOVER_LINK_SIZE / 2;\n      var hoverLinkDataSize = visualMapModel.get('hoverLinkDataSize');\n      if (hoverLinkDataSize) {\n        halfHoverLinkSize = linearMap$2(hoverLinkDataSize, dataExtent, sizeExtent, true) / 2;\n      }\n      return halfHoverLinkSize;\n    }\n    function useHoverLinkOnHandle(visualMapModel) {\n      var hoverLinkOnHandle = visualMapModel.get('hoverLinkOnHandle');\n      return !!(hoverLinkOnHandle == null ? visualMapModel.get('realtime') : hoverLinkOnHandle);\n    }\n    function getCursor$1(orient) {\n      return orient === 'vertical' ? 'ns-resize' : 'ew-resize';\n    }\n\n    /*\n    * Licensed to the Apache Software Foundation (ASF) under one\n    * or more contributor license agreements.  See the NOTICE file\n    * distributed with this work for additional information\n    * regarding copyright ownership.  The ASF licenses this file\n    * to you under the Apache License, Version 2.0 (the\n    * \"License\"); you may not use this file except in compliance\n    * with the License.  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,\n    * software distributed under the License is distributed on an\n    * \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\n    * KIND, either express or implied.  See the License for the\n    * specific language governing permissions and limitations\n    * under the License.\n    */\n\n\n    /**\n     * AUTO-GENERATED FILE. DO NOT MODIFY.\n     */\n\n    /*\r\n    * Licensed to the Apache Software Foundation (ASF) under one\r\n    * or more contributor license agreements.  See the NOTICE file\r\n    * distributed with this work for additional information\r\n    * regarding copyright ownership.  The ASF licenses this file\r\n    * to you under the Apache License, Version 2.0 (the\r\n    * \"License\"); you may not use this file except in compliance\r\n    * with the License.  You may obtain a copy of the License at\r\n    *\r\n    *   http://www.apache.org/licenses/LICENSE-2.0\r\n    *\r\n    * Unless required by applicable law or agreed to in writing,\r\n    * software distributed under the License is distributed on an\r\n    * \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\r\n    * KIND, either express or implied.  See the License for the\r\n    * specific language governing permissions and limitations\r\n    * under the License.\r\n    */\n    var visualMapActionInfo = {\n      type: 'selectDataRange',\n      event: 'dataRangeSelected',\n      // FIXME use updateView appears wrong\n      update: 'update'\n    };\n    var visualMapActionHander = function (payload, ecModel) {\n      ecModel.eachComponent({\n        mainType: 'visualMap',\n        query: payload\n      }, function (model) {\n        model.setSelected(payload.selected);\n      });\n    };\n\n    var visualMapEncodingHandlers = [{\n      createOnAllSeries: true,\n      reset: function (seriesModel, ecModel) {\n        var resetDefines = [];\n        ecModel.eachComponent('visualMap', function (visualMapModel) {\n          var pipelineContext = seriesModel.pipelineContext;\n          if (!visualMapModel.isTargetSeries(seriesModel) || pipelineContext && pipelineContext.large) {\n            return;\n          }\n          resetDefines.push(incrementalApplyVisual(visualMapModel.stateList, visualMapModel.targetVisuals, bind(visualMapModel.getValueState, visualMapModel), visualMapModel.getDataDimensionIndex(seriesModel.getData())));\n        });\n        return resetDefines;\n      }\n    },\n    // Only support color.\n    {\n      createOnAllSeries: true,\n      reset: function (seriesModel, ecModel) {\n        var data = seriesModel.getData();\n        var visualMetaList = [];\n        ecModel.eachComponent('visualMap', function (visualMapModel) {\n          if (visualMapModel.isTargetSeries(seriesModel)) {\n            var visualMeta = visualMapModel.getVisualMeta(bind(getColorVisual, null, seriesModel, visualMapModel)) || {\n              stops: [],\n              outerColors: []\n            };\n            var dimIdx = visualMapModel.getDataDimensionIndex(data);\n            if (dimIdx >= 0) {\n              // visualMeta.dimension should be dimension index, but not concrete dimension.\n              visualMeta.dimension = dimIdx;\n              visualMetaList.push(visualMeta);\n            }\n          }\n        });\n        // console.log(JSON.stringify(visualMetaList.map(a => a.stops)));\n        seriesModel.getData().setVisual('visualMeta', visualMetaList);\n      }\n    }];\n    // FIXME\n    // performance and export for heatmap?\n    // value can be Infinity or -Infinity\n    function getColorVisual(seriesModel, visualMapModel, value, valueState) {\n      var mappings = visualMapModel.targetVisuals[valueState];\n      var visualTypes = VisualMapping.prepareVisualTypes(mappings);\n      var resultVisual = {\n        color: getVisualFromData(seriesModel.getData(), 'color') // default color.\n      };\n      for (var i = 0, len = visualTypes.length; i < len; i++) {\n        var type = visualTypes[i];\n        var mapping = mappings[type === 'opacity' ? '__alphaForOpacity' : type];\n        mapping && mapping.applyVisual(value, getVisual, setVisual);\n      }\n      return resultVisual.color;\n      function getVisual(key) {\n        return resultVisual[key];\n      }\n      function setVisual(key, value) {\n        resultVisual[key] = value;\n      }\n    }\n\n    var each$f = each;\n    function visualMapPreprocessor(option) {\n      var visualMap = option && option.visualMap;\n      if (!isArray(visualMap)) {\n        visualMap = visualMap ? [visualMap] : [];\n      }\n      each$f(visualMap, function (opt) {\n        if (!opt) {\n          return;\n        }\n        // rename splitList to pieces\n        if (has$1(opt, 'splitList') && !has$1(opt, 'pieces')) {\n          opt.pieces = opt.splitList;\n          delete opt.splitList;\n        }\n        var pieces = opt.pieces;\n        if (pieces && isArray(pieces)) {\n          each$f(pieces, function (piece) {\n            if (isObject(piece)) {\n              if (has$1(piece, 'start') && !has$1(piece, 'min')) {\n                piece.min = piece.start;\n              }\n              if (has$1(piece, 'end') && !has$1(piece, 'max')) {\n                piece.max = piece.end;\n              }\n            }\n          });\n        }\n      });\n    }\n    function has$1(obj, name) {\n      return obj && obj.hasOwnProperty && obj.hasOwnProperty(name);\n    }\n\n    var installed$1 = false;\n    function installCommon$1(registers) {\n      if (installed$1) {\n        return;\n      }\n      installed$1 = true;\n      registers.registerSubTypeDefaulter('visualMap', function (option) {\n        // Compatible with ec2, when splitNumber === 0, continuous visualMap will be used.\n        return !option.categories && (!(option.pieces ? option.pieces.length > 0 : option.splitNumber > 0) || option.calculable) ? 'continuous' : 'piecewise';\n      });\n      registers.registerAction(visualMapActionInfo, visualMapActionHander);\n      each(visualMapEncodingHandlers, function (handler) {\n        registers.registerVisual(registers.PRIORITY.VISUAL.COMPONENT, handler);\n      });\n      registers.registerPreprocessor(visualMapPreprocessor);\n    }\n\n    function install$N(registers) {\n      registers.registerComponentModel(ContinuousModel);\n      registers.registerComponentView(ContinuousView);\n      installCommon$1(registers);\n    }\n\n    var PiecewiseModel = /** @class */function (_super) {\n      __extends(PiecewiseModel, _super);\n      function PiecewiseModel() {\n        var _this = _super !== null && _super.apply(this, arguments) || this;\n        _this.type = PiecewiseModel.type;\n        /**\r\n         * The order is always [low, ..., high].\r\n         * [{text: string, interval: Array.<number>}, ...]\r\n         */\n        _this._pieceList = [];\n        return _this;\n      }\n      PiecewiseModel.prototype.optionUpdated = function (newOption, isInit) {\n        _super.prototype.optionUpdated.apply(this, arguments);\n        this.resetExtent();\n        var mode = this._mode = this._determineMode();\n        this._pieceList = [];\n        resetMethods[this._mode].call(this, this._pieceList);\n        this._resetSelected(newOption, isInit);\n        var categories = this.option.categories;\n        this.resetVisual(function (mappingOption, state) {\n          if (mode === 'categories') {\n            mappingOption.mappingMethod = 'category';\n            mappingOption.categories = clone(categories);\n          } else {\n            mappingOption.dataExtent = this.getExtent();\n            mappingOption.mappingMethod = 'piecewise';\n            mappingOption.pieceList = map(this._pieceList, function (piece) {\n              piece = clone(piece);\n              if (state !== 'inRange') {\n                // FIXME\n                // outOfRange do not support special visual in pieces.\n                piece.visual = null;\n              }\n              return piece;\n            });\n          }\n        });\n      };\n      /**\r\n       * @protected\r\n       * @override\r\n       */\n      PiecewiseModel.prototype.completeVisualOption = function () {\n        // Consider this case:\n        // visualMap: {\n        //      pieces: [{symbol: 'circle', lt: 0}, {symbol: 'rect', gte: 0}]\n        // }\n        // where no inRange/outOfRange set but only pieces. So we should make\n        // default inRange/outOfRange for this case, otherwise visuals that only\n        // appear in `pieces` will not be taken into account in visual encoding.\n        var option = this.option;\n        var visualTypesInPieces = {};\n        var visualTypes = VisualMapping.listVisualTypes();\n        var isCategory = this.isCategory();\n        each(option.pieces, function (piece) {\n          each(visualTypes, function (visualType) {\n            if (piece.hasOwnProperty(visualType)) {\n              visualTypesInPieces[visualType] = 1;\n            }\n          });\n        });\n        each(visualTypesInPieces, function (v, visualType) {\n          var exists = false;\n          each(this.stateList, function (state) {\n            exists = exists || has(option, state, visualType) || has(option.target, state, visualType);\n          }, this);\n          !exists && each(this.stateList, function (state) {\n            (option[state] || (option[state] = {}))[visualType] = visualDefault.get(visualType, state === 'inRange' ? 'active' : 'inactive', isCategory);\n          });\n        }, this);\n        function has(obj, state, visualType) {\n          return obj && obj[state] && obj[state].hasOwnProperty(visualType);\n        }\n        _super.prototype.completeVisualOption.apply(this, arguments);\n      };\n      PiecewiseModel.prototype._resetSelected = function (newOption, isInit) {\n        var thisOption = this.option;\n        var pieceList = this._pieceList;\n        // Selected do not merge but all override.\n        var selected = (isInit ? thisOption : newOption).selected || {};\n        thisOption.selected = selected;\n        // Consider 'not specified' means true.\n        each(pieceList, function (piece, index) {\n          var key = this.getSelectedMapKey(piece);\n          if (!selected.hasOwnProperty(key)) {\n            selected[key] = true;\n          }\n        }, this);\n        if (thisOption.selectedMode === 'single') {\n          // Ensure there is only one selected.\n          var hasSel_1 = false;\n          each(pieceList, function (piece, index) {\n            var key = this.getSelectedMapKey(piece);\n            if (selected[key]) {\n              hasSel_1 ? selected[key] = false : hasSel_1 = true;\n            }\n          }, this);\n        }\n        // thisOption.selectedMode === 'multiple', default: all selected.\n      };\n      /**\r\n       * @public\r\n       */\n      PiecewiseModel.prototype.getItemSymbol = function () {\n        return this.get('itemSymbol');\n      };\n      /**\r\n       * @public\r\n       */\n      PiecewiseModel.prototype.getSelectedMapKey = function (piece) {\n        return this._mode === 'categories' ? piece.value + '' : piece.index + '';\n      };\n      /**\r\n       * @public\r\n       */\n      PiecewiseModel.prototype.getPieceList = function () {\n        return this._pieceList;\n      };\n      /**\r\n       * @return {string}\r\n       */\n      PiecewiseModel.prototype._determineMode = function () {\n        var option = this.option;\n        return option.pieces && option.pieces.length > 0 ? 'pieces' : this.option.categories ? 'categories' : 'splitNumber';\n      };\n      /**\r\n       * @override\r\n       */\n      PiecewiseModel.prototype.setSelected = function (selected) {\n        this.option.selected = clone(selected);\n      };\n      /**\r\n       * @override\r\n       */\n      PiecewiseModel.prototype.getValueState = function (value) {\n        var index = VisualMapping.findPieceIndex(value, this._pieceList);\n        return index != null ? this.option.selected[this.getSelectedMapKey(this._pieceList[index])] ? 'inRange' : 'outOfRange' : 'outOfRange';\n      };\n      /**\r\n       * @public\r\n       * @param pieceIndex piece index in visualMapModel.getPieceList()\r\n       */\n      PiecewiseModel.prototype.findTargetDataIndices = function (pieceIndex) {\n        var result = [];\n        var pieceList = this._pieceList;\n        this.eachTargetSeries(function (seriesModel) {\n          var dataIndices = [];\n          var data = seriesModel.getData();\n          data.each(this.getDataDimensionIndex(data), function (value, dataIndex) {\n            // Should always base on model pieceList, because it is order sensitive.\n            var pIdx = VisualMapping.findPieceIndex(value, pieceList);\n            pIdx === pieceIndex && dataIndices.push(dataIndex);\n          }, this);\n          result.push({\n            seriesId: seriesModel.id,\n            dataIndex: dataIndices\n          });\n        }, this);\n        return result;\n      };\n      /**\r\n       * @private\r\n       * @param piece piece.value or piece.interval is required.\r\n       * @return  Can be Infinity or -Infinity\r\n       */\n      PiecewiseModel.prototype.getRepresentValue = function (piece) {\n        var representValue;\n        if (this.isCategory()) {\n          representValue = piece.value;\n        } else {\n          if (piece.value != null) {\n            representValue = piece.value;\n          } else {\n            var pieceInterval = piece.interval || [];\n            representValue = pieceInterval[0] === -Infinity && pieceInterval[1] === Infinity ? 0 : (pieceInterval[0] + pieceInterval[1]) / 2;\n          }\n        }\n        return representValue;\n      };\n      PiecewiseModel.prototype.getVisualMeta = function (getColorVisual) {\n        // Do not support category. (category axis is ordinal, numerical)\n        if (this.isCategory()) {\n          return;\n        }\n        var stops = [];\n        var outerColors = ['', ''];\n        var visualMapModel = this;\n        function setStop(interval, valueState) {\n          var representValue = visualMapModel.getRepresentValue({\n            interval: interval\n          }); // Not category\n          if (!valueState) {\n            valueState = visualMapModel.getValueState(representValue);\n          }\n          var color = getColorVisual(representValue, valueState);\n          if (interval[0] === -Infinity) {\n            outerColors[0] = color;\n          } else if (interval[1] === Infinity) {\n            outerColors[1] = color;\n          } else {\n            stops.push({\n              value: interval[0],\n              color: color\n            }, {\n              value: interval[1],\n              color: color\n            });\n          }\n        }\n        // Suplement\n        var pieceList = this._pieceList.slice();\n        if (!pieceList.length) {\n          pieceList.push({\n            interval: [-Infinity, Infinity]\n          });\n        } else {\n          var edge = pieceList[0].interval[0];\n          edge !== -Infinity && pieceList.unshift({\n            interval: [-Infinity, edge]\n          });\n          edge = pieceList[pieceList.length - 1].interval[1];\n          edge !== Infinity && pieceList.push({\n            interval: [edge, Infinity]\n          });\n        }\n        var curr = -Infinity;\n        each(pieceList, function (piece) {\n          var interval = piece.interval;\n          if (interval) {\n            // Fulfill gap.\n            interval[0] > curr && setStop([curr, interval[0]], 'outOfRange');\n            setStop(interval.slice());\n            curr = interval[1];\n          }\n        }, this);\n        return {\n          stops: stops,\n          outerColors: outerColors\n        };\n      };\n      PiecewiseModel.type = 'visualMap.piecewise';\n      PiecewiseModel.defaultOption = inheritDefaultOption(VisualMapModel.defaultOption, {\n        selected: null,\n        minOpen: false,\n        maxOpen: false,\n        align: 'auto',\n        itemWidth: 20,\n        itemHeight: 14,\n        itemSymbol: 'roundRect',\n        pieces: null,\n        categories: null,\n        splitNumber: 5,\n        selectedMode: 'multiple',\n        itemGap: 10,\n        hoverLink: true // Enable hover highlight.\n      });\n      return PiecewiseModel;\n    }(VisualMapModel);\n    /**\r\n     * Key is this._mode\r\n     * @type {Object}\r\n     * @this {module:echarts/component/viusalMap/PiecewiseMode}\r\n     */\n    var resetMethods = {\n      splitNumber: function (outPieceList) {\n        var thisOption = this.option;\n        var precision = Math.min(thisOption.precision, 20);\n        var dataExtent = this.getExtent();\n        var splitNumber = thisOption.splitNumber;\n        splitNumber = Math.max(parseInt(splitNumber, 10), 1);\n        thisOption.splitNumber = splitNumber;\n        var splitStep = (dataExtent[1] - dataExtent[0]) / splitNumber;\n        // Precision auto-adaption\n        while (+splitStep.toFixed(precision) !== splitStep && precision < 5) {\n          precision++;\n        }\n        thisOption.precision = precision;\n        splitStep = +splitStep.toFixed(precision);\n        if (thisOption.minOpen) {\n          outPieceList.push({\n            interval: [-Infinity, dataExtent[0]],\n            close: [0, 0]\n          });\n        }\n        for (var index = 0, curr = dataExtent[0]; index < splitNumber; curr += splitStep, index++) {\n          var max = index === splitNumber - 1 ? dataExtent[1] : curr + splitStep;\n          outPieceList.push({\n            interval: [curr, max],\n            close: [1, 1]\n          });\n        }\n        if (thisOption.maxOpen) {\n          outPieceList.push({\n            interval: [dataExtent[1], Infinity],\n            close: [0, 0]\n          });\n        }\n        reformIntervals(outPieceList);\n        each(outPieceList, function (piece, index) {\n          piece.index = index;\n          piece.text = this.formatValueText(piece.interval);\n        }, this);\n      },\n      categories: function (outPieceList) {\n        var thisOption = this.option;\n        each(thisOption.categories, function (cate) {\n          // FIXME category模式也使用pieceList，但在visualMapping中不是使用pieceList。\n          // 是否改一致。\n          outPieceList.push({\n            text: this.formatValueText(cate, true),\n            value: cate\n          });\n        }, this);\n        // See \"Order Rule\".\n        normalizeReverse(thisOption, outPieceList);\n      },\n      pieces: function (outPieceList) {\n        var thisOption = this.option;\n        each(thisOption.pieces, function (pieceListItem, index) {\n          if (!isObject(pieceListItem)) {\n            pieceListItem = {\n              value: pieceListItem\n            };\n          }\n          var item = {\n            text: '',\n            index: index\n          };\n          if (pieceListItem.label != null) {\n            item.text = pieceListItem.label;\n          }\n          if (pieceListItem.hasOwnProperty('value')) {\n            var value = item.value = pieceListItem.value;\n            item.interval = [value, value];\n            item.close = [1, 1];\n          } else {\n            // `min` `max` is legacy option.\n            // `lt` `gt` `lte` `gte` is recommended.\n            var interval = item.interval = [];\n            var close_1 = item.close = [0, 0];\n            var closeList = [1, 0, 1];\n            var infinityList = [-Infinity, Infinity];\n            var useMinMax = [];\n            for (var lg = 0; lg < 2; lg++) {\n              var names = [['gte', 'gt', 'min'], ['lte', 'lt', 'max']][lg];\n              for (var i = 0; i < 3 && interval[lg] == null; i++) {\n                interval[lg] = pieceListItem[names[i]];\n                close_1[lg] = closeList[i];\n                useMinMax[lg] = i === 2;\n              }\n              interval[lg] == null && (interval[lg] = infinityList[lg]);\n            }\n            useMinMax[0] && interval[1] === Infinity && (close_1[0] = 0);\n            useMinMax[1] && interval[0] === -Infinity && (close_1[1] = 0);\n            if (\"development\" !== 'production') {\n              if (interval[0] > interval[1]) {\n                console.warn('Piece ' + index + 'is illegal: ' + interval + ' lower bound should not greater then uppper bound.');\n              }\n            }\n            if (interval[0] === interval[1] && close_1[0] && close_1[1]) {\n              // Consider: [{min: 5, max: 5, visual: {...}}, {min: 0, max: 5}],\n              // we use value to lift the priority when min === max\n              item.value = interval[0];\n            }\n          }\n          item.visual = VisualMapping.retrieveVisuals(pieceListItem);\n          outPieceList.push(item);\n        }, this);\n        // See \"Order Rule\".\n        normalizeReverse(thisOption, outPieceList);\n        // Only pieces\n        reformIntervals(outPieceList);\n        each(outPieceList, function (piece) {\n          var close = piece.close;\n          var edgeSymbols = [['<', '≤'][close[1]], ['>', '≥'][close[0]]];\n          piece.text = piece.text || this.formatValueText(piece.value != null ? piece.value : piece.interval, false, edgeSymbols);\n        }, this);\n      }\n    };\n    function normalizeReverse(thisOption, pieceList) {\n      var inverse = thisOption.inverse;\n      if (thisOption.orient === 'vertical' ? !inverse : inverse) {\n        pieceList.reverse();\n      }\n    }\n\n    var PiecewiseVisualMapView = /** @class */function (_super) {\n      __extends(PiecewiseVisualMapView, _super);\n      function PiecewiseVisualMapView() {\n        var _this = _super !== null && _super.apply(this, arguments) || this;\n        _this.type = PiecewiseVisualMapView.type;\n        return _this;\n      }\n      PiecewiseVisualMapView.prototype.doRender = function () {\n        var thisGroup = this.group;\n        thisGroup.removeAll();\n        var visualMapModel = this.visualMapModel;\n        var textGap = visualMapModel.get('textGap');\n        var textStyleModel = visualMapModel.textStyleModel;\n        var textFont = textStyleModel.getFont();\n        var textFill = textStyleModel.getTextColor();\n        var itemAlign = this._getItemAlign();\n        var itemSize = visualMapModel.itemSize;\n        var viewData = this._getViewData();\n        var endsText = viewData.endsText;\n        var showLabel = retrieve(visualMapModel.get('showLabel', true), !endsText);\n        var silent = !visualMapModel.get('selectedMode');\n        endsText && this._renderEndsText(thisGroup, endsText[0], itemSize, showLabel, itemAlign);\n        each(viewData.viewPieceList, function (item) {\n          var piece = item.piece;\n          var itemGroup = new Group();\n          itemGroup.onclick = bind(this._onItemClick, this, piece);\n          this._enableHoverLink(itemGroup, item.indexInModelPieceList);\n          // TODO Category\n          var representValue = visualMapModel.getRepresentValue(piece);\n          this._createItemSymbol(itemGroup, representValue, [0, 0, itemSize[0], itemSize[1]], silent);\n          if (showLabel) {\n            var visualState = this.visualMapModel.getValueState(representValue);\n            itemGroup.add(new ZRText({\n              style: {\n                x: itemAlign === 'right' ? -textGap : itemSize[0] + textGap,\n                y: itemSize[1] / 2,\n                text: piece.text,\n                verticalAlign: 'middle',\n                align: itemAlign,\n                font: textFont,\n                fill: textFill,\n                opacity: visualState === 'outOfRange' ? 0.5 : 1\n              },\n              silent: silent\n            }));\n          }\n          thisGroup.add(itemGroup);\n        }, this);\n        endsText && this._renderEndsText(thisGroup, endsText[1], itemSize, showLabel, itemAlign);\n        box(visualMapModel.get('orient'), thisGroup, visualMapModel.get('itemGap'));\n        this.renderBackground(thisGroup);\n        this.positionGroup(thisGroup);\n      };\n      PiecewiseVisualMapView.prototype._enableHoverLink = function (itemGroup, pieceIndex) {\n        var _this = this;\n        itemGroup.on('mouseover', function () {\n          return onHoverLink('highlight');\n        }).on('mouseout', function () {\n          return onHoverLink('downplay');\n        });\n        var onHoverLink = function (method) {\n          var visualMapModel = _this.visualMapModel;\n          // TODO: TYPE More detailed action types\n          visualMapModel.option.hoverLink && _this.api.dispatchAction({\n            type: method,\n            batch: makeHighDownBatch(visualMapModel.findTargetDataIndices(pieceIndex), visualMapModel)\n          });\n        };\n      };\n      PiecewiseVisualMapView.prototype._getItemAlign = function () {\n        var visualMapModel = this.visualMapModel;\n        var modelOption = visualMapModel.option;\n        if (modelOption.orient === 'vertical') {\n          return getItemAlign(visualMapModel, this.api, visualMapModel.itemSize);\n        } else {\n          // horizontal, most case left unless specifying right.\n          var align = modelOption.align;\n          if (!align || align === 'auto') {\n            align = 'left';\n          }\n          return align;\n        }\n      };\n      PiecewiseVisualMapView.prototype._renderEndsText = function (group, text, itemSize, showLabel, itemAlign) {\n        if (!text) {\n          return;\n        }\n        var itemGroup = new Group();\n        var textStyleModel = this.visualMapModel.textStyleModel;\n        itemGroup.add(new ZRText({\n          style: createTextStyle(textStyleModel, {\n            x: showLabel ? itemAlign === 'right' ? itemSize[0] : 0 : itemSize[0] / 2,\n            y: itemSize[1] / 2,\n            verticalAlign: 'middle',\n            align: showLabel ? itemAlign : 'center',\n            text: text\n          })\n        }));\n        group.add(itemGroup);\n      };\n      /**\r\n       * @private\r\n       * @return {Object} {peiceList, endsText} The order is the same as screen pixel order.\r\n       */\n      PiecewiseVisualMapView.prototype._getViewData = function () {\n        var visualMapModel = this.visualMapModel;\n        var viewPieceList = map(visualMapModel.getPieceList(), function (piece, index) {\n          return {\n            piece: piece,\n            indexInModelPieceList: index\n          };\n        });\n        var endsText = visualMapModel.get('text');\n        // Consider orient and inverse.\n        var orient = visualMapModel.get('orient');\n        var inverse = visualMapModel.get('inverse');\n        // Order of model pieceList is always [low, ..., high]\n        if (orient === 'horizontal' ? inverse : !inverse) {\n          viewPieceList.reverse();\n        }\n        // Origin order of endsText is [high, low]\n        else if (endsText) {\n          endsText = endsText.slice().reverse();\n        }\n        return {\n          viewPieceList: viewPieceList,\n          endsText: endsText\n        };\n      };\n      PiecewiseVisualMapView.prototype._createItemSymbol = function (group, representValue, shapeParam, silent) {\n        var itemSymbol = createSymbol(\n        // symbol will be string\n        this.getControllerVisual(representValue, 'symbol'), shapeParam[0], shapeParam[1], shapeParam[2], shapeParam[3],\n        // color will be string\n        this.getControllerVisual(representValue, 'color'));\n        itemSymbol.silent = silent;\n        group.add(itemSymbol);\n      };\n      PiecewiseVisualMapView.prototype._onItemClick = function (piece) {\n        var visualMapModel = this.visualMapModel;\n        var option = visualMapModel.option;\n        var selectedMode = option.selectedMode;\n        if (!selectedMode) {\n          return;\n        }\n        var selected = clone(option.selected);\n        var newKey = visualMapModel.getSelectedMapKey(piece);\n        if (selectedMode === 'single' || selectedMode === true) {\n          selected[newKey] = true;\n          each(selected, function (o, key) {\n            selected[key] = key === newKey;\n          });\n        } else {\n          selected[newKey] = !selected[newKey];\n        }\n        this.api.dispatchAction({\n          type: 'selectDataRange',\n          from: this.uid,\n          visualMapId: this.visualMapModel.id,\n          selected: selected\n        });\n      };\n      PiecewiseVisualMapView.type = 'visualMap.piecewise';\n      return PiecewiseVisualMapView;\n    }(VisualMapView);\n\n    function install$O(registers) {\n      registers.registerComponentModel(PiecewiseModel);\n      registers.registerComponentView(PiecewiseVisualMapView);\n      installCommon$1(registers);\n    }\n\n    function install$P(registers) {\n      use(install$N);\n      use(install$O);\n      // Do not install './dataZoomSelect',\n      // since it only work for toolbox dataZoom.\n    }\n\n    var DEFAULT_OPTION = {\n      label: {\n        enabled: true\n      },\n      decal: {\n        show: false\n      }\n    };\n    var inner$l = makeInner();\n    var decalPaletteScope = {};\n    function ariaVisual(ecModel, api) {\n      var ariaModel = ecModel.getModel('aria');\n      // See \"area enabled\" detection code in `GlobalModel.ts`.\n      if (!ariaModel.get('enabled')) {\n        return;\n      }\n      var defaultOption = clone(DEFAULT_OPTION);\n      merge(defaultOption.label, ecModel.getLocaleModel().get('aria'), false);\n      merge(ariaModel.option, defaultOption, false);\n      setDecal();\n      setLabel();\n      function setDecal() {\n        var decalModel = ariaModel.getModel('decal');\n        var useDecal = decalModel.get('show');\n        if (useDecal) {\n          // Each type of series use one scope.\n          // Pie and funnel are using different scopes.\n          var paletteScopeGroupByType_1 = createHashMap();\n          ecModel.eachSeries(function (seriesModel) {\n            if (seriesModel.isColorBySeries()) {\n              return;\n            }\n            var decalScope = paletteScopeGroupByType_1.get(seriesModel.type);\n            if (!decalScope) {\n              decalScope = {};\n              paletteScopeGroupByType_1.set(seriesModel.type, decalScope);\n            }\n            inner$l(seriesModel).scope = decalScope;\n          });\n          ecModel.eachRawSeries(function (seriesModel) {\n            if (ecModel.isSeriesFiltered(seriesModel)) {\n              return;\n            }\n            if (isFunction(seriesModel.enableAriaDecal)) {\n              // Let series define how to use decal palette on data\n              seriesModel.enableAriaDecal();\n              return;\n            }\n            var data = seriesModel.getData();\n            if (!seriesModel.isColorBySeries()) {\n              var dataAll_1 = seriesModel.getRawData();\n              var idxMap_1 = {};\n              var decalScope_1 = inner$l(seriesModel).scope;\n              data.each(function (idx) {\n                var rawIdx = data.getRawIndex(idx);\n                idxMap_1[rawIdx] = idx;\n              });\n              var dataCount_1 = dataAll_1.count();\n              dataAll_1.each(function (rawIdx) {\n                var idx = idxMap_1[rawIdx];\n                var name = dataAll_1.getName(rawIdx) || rawIdx + '';\n                var paletteDecal = getDecalFromPalette(seriesModel.ecModel, name, decalScope_1, dataCount_1);\n                var specifiedDecal = data.getItemVisual(idx, 'decal');\n                data.setItemVisual(idx, 'decal', mergeDecal(specifiedDecal, paletteDecal));\n              });\n            } else {\n              var paletteDecal = getDecalFromPalette(seriesModel.ecModel, seriesModel.name, decalPaletteScope, ecModel.getSeriesCount());\n              var specifiedDecal = data.getVisual('decal');\n              data.setVisual('decal', mergeDecal(specifiedDecal, paletteDecal));\n            }\n            function mergeDecal(specifiedDecal, paletteDecal) {\n              // Merge decal from palette to decal from itemStyle.\n              // User do not need to specify all of the decal props.\n              var resultDecal = specifiedDecal ? extend(extend({}, paletteDecal), specifiedDecal) : paletteDecal;\n              resultDecal.dirty = true;\n              return resultDecal;\n            }\n          });\n        }\n      }\n      function setLabel() {\n        var dom = api.getZr().dom;\n        // TODO: support for SSR\n        if (!dom) {\n          return;\n        }\n        var labelLocale = ecModel.getLocaleModel().get('aria');\n        var labelModel = ariaModel.getModel('label');\n        labelModel.option = defaults(labelModel.option, labelLocale);\n        if (!labelModel.get('enabled')) {\n          return;\n        }\n        dom.setAttribute('role', 'img');\n        if (labelModel.get('description')) {\n          dom.setAttribute('aria-label', labelModel.get('description'));\n          return;\n        }\n        var seriesCnt = ecModel.getSeriesCount();\n        var maxDataCnt = labelModel.get(['data', 'maxCount']) || 10;\n        var maxSeriesCnt = labelModel.get(['series', 'maxCount']) || 10;\n        var displaySeriesCnt = Math.min(seriesCnt, maxSeriesCnt);\n        var ariaLabel;\n        if (seriesCnt < 1) {\n          // No series, no aria label\n          return;\n        } else {\n          var title = getTitle();\n          if (title) {\n            var withTitle = labelModel.get(['general', 'withTitle']);\n            ariaLabel = replace(withTitle, {\n              title: title\n            });\n          } else {\n            ariaLabel = labelModel.get(['general', 'withoutTitle']);\n          }\n          var seriesLabels_1 = [];\n          var prefix = seriesCnt > 1 ? labelModel.get(['series', 'multiple', 'prefix']) : labelModel.get(['series', 'single', 'prefix']);\n          ariaLabel += replace(prefix, {\n            seriesCount: seriesCnt\n          });\n          ecModel.eachSeries(function (seriesModel, idx) {\n            if (idx < displaySeriesCnt) {\n              var seriesLabel = void 0;\n              var seriesName = seriesModel.get('name');\n              var withName = seriesName ? 'withName' : 'withoutName';\n              seriesLabel = seriesCnt > 1 ? labelModel.get(['series', 'multiple', withName]) : labelModel.get(['series', 'single', withName]);\n              seriesLabel = replace(seriesLabel, {\n                seriesId: seriesModel.seriesIndex,\n                seriesName: seriesModel.get('name'),\n                seriesType: getSeriesTypeName(seriesModel.subType)\n              });\n              var data = seriesModel.getData();\n              if (data.count() > maxDataCnt) {\n                // Show part of data\n                var partialLabel = labelModel.get(['data', 'partialData']);\n                seriesLabel += replace(partialLabel, {\n                  displayCnt: maxDataCnt\n                });\n              } else {\n                seriesLabel += labelModel.get(['data', 'allData']);\n              }\n              var middleSeparator_1 = labelModel.get(['data', 'separator', 'middle']);\n              var endSeparator_1 = labelModel.get(['data', 'separator', 'end']);\n              var excludeDimensionId_1 = labelModel.get(['data', 'excludeDimensionId']);\n              var dataLabels = [];\n              for (var i = 0; i < data.count(); i++) {\n                if (i < maxDataCnt) {\n                  var name_1 = data.getName(i);\n                  var value = !excludeDimensionId_1 ? data.getValues(i) : filter(data.getValues(i), function (v, j) {\n                    return indexOf(excludeDimensionId_1, j) === -1;\n                  });\n                  var dataLabel = labelModel.get(['data', name_1 ? 'withName' : 'withoutName']);\n                  dataLabels.push(replace(dataLabel, {\n                    name: name_1,\n                    value: value.join(middleSeparator_1)\n                  }));\n                }\n              }\n              seriesLabel += dataLabels.join(middleSeparator_1) + endSeparator_1;\n              seriesLabels_1.push(seriesLabel);\n            }\n          });\n          var separatorModel = labelModel.getModel(['series', 'multiple', 'separator']);\n          var middleSeparator = separatorModel.get('middle');\n          var endSeparator = separatorModel.get('end');\n          ariaLabel += seriesLabels_1.join(middleSeparator) + endSeparator;\n          dom.setAttribute('aria-label', ariaLabel);\n        }\n      }\n      function replace(str, keyValues) {\n        if (!isString(str)) {\n          return str;\n        }\n        var result = str;\n        each(keyValues, function (value, key) {\n          result = result.replace(new RegExp('\\\\{\\\\s*' + key + '\\\\s*\\\\}', 'g'), value);\n        });\n        return result;\n      }\n      function getTitle() {\n        var title = ecModel.get('title');\n        if (title && title.length) {\n          title = title[0];\n        }\n        return title && title.text;\n      }\n      function getSeriesTypeName(type) {\n        var typeNames = ecModel.getLocaleModel().get(['series', 'typeNames']);\n        return typeNames[type] || typeNames.chart;\n      }\n    }\n\n    function ariaPreprocessor(option) {\n      if (!option || !option.aria) {\n        return;\n      }\n      var aria = option.aria;\n      // aria.show is deprecated and should use aria.enabled instead\n      if (aria.show != null) {\n        aria.enabled = aria.show;\n      }\n      aria.label = aria.label || {};\n      // move description, general, series, data to be under aria.label\n      each(['description', 'general', 'series', 'data'], function (name) {\n        if (aria[name] != null) {\n          aria.label[name] = aria[name];\n        }\n      });\n    }\n\n    function install$Q(registers) {\n      registers.registerPreprocessor(ariaPreprocessor);\n      registers.registerVisual(registers.PRIORITY.VISUAL.ARIA, ariaVisual);\n    }\n\n    var RELATIONAL_EXPRESSION_OP_ALIAS_MAP = {\n      value: 'eq',\n      // PENDING: not good for literal semantic?\n      '<': 'lt',\n      '<=': 'lte',\n      '>': 'gt',\n      '>=': 'gte',\n      '=': 'eq',\n      '!=': 'ne',\n      '<>': 'ne'\n      // Might be misleading for sake of the difference between '==' and '===',\n      // so don't support them.\n      // '==': 'eq',\n      // '===': 'seq',\n      // '!==': 'sne'\n      // PENDING: Whether support some common alias \"ge\", \"le\", \"neq\"?\n      // ge: 'gte',\n      // le: 'lte',\n      // neq: 'ne',\n    };\n    // type RelationalExpressionOpEvaluate = (tarVal: unknown, condVal: unknown) => boolean;\n    var RegExpEvaluator = /** @class */function () {\n      function RegExpEvaluator(rVal) {\n        // Support condVal: RegExp | string\n        var condValue = this._condVal = isString(rVal) ? new RegExp(rVal) : isRegExp(rVal) ? rVal : null;\n        if (condValue == null) {\n          var errMsg = '';\n          if (\"development\" !== 'production') {\n            errMsg = makePrintable('Illegal regexp', rVal, 'in');\n          }\n          throwError(errMsg);\n        }\n      }\n      RegExpEvaluator.prototype.evaluate = function (lVal) {\n        var type = typeof lVal;\n        return isString(type) ? this._condVal.test(lVal) : isNumber(type) ? this._condVal.test(lVal + '') : false;\n      };\n      return RegExpEvaluator;\n    }();\n    var ConstConditionInternal = /** @class */function () {\n      function ConstConditionInternal() {}\n      ConstConditionInternal.prototype.evaluate = function () {\n        return this.value;\n      };\n      return ConstConditionInternal;\n    }();\n    var AndConditionInternal = /** @class */function () {\n      function AndConditionInternal() {}\n      AndConditionInternal.prototype.evaluate = function () {\n        var children = this.children;\n        for (var i = 0; i < children.length; i++) {\n          if (!children[i].evaluate()) {\n            return false;\n          }\n        }\n        return true;\n      };\n      return AndConditionInternal;\n    }();\n    var OrConditionInternal = /** @class */function () {\n      function OrConditionInternal() {}\n      OrConditionInternal.prototype.evaluate = function () {\n        var children = this.children;\n        for (var i = 0; i < children.length; i++) {\n          if (children[i].evaluate()) {\n            return true;\n          }\n        }\n        return false;\n      };\n      return OrConditionInternal;\n    }();\n    var NotConditionInternal = /** @class */function () {\n      function NotConditionInternal() {}\n      NotConditionInternal.prototype.evaluate = function () {\n        return !this.child.evaluate();\n      };\n      return NotConditionInternal;\n    }();\n    var RelationalConditionInternal = /** @class */function () {\n      function RelationalConditionInternal() {}\n      RelationalConditionInternal.prototype.evaluate = function () {\n        var needParse = !!this.valueParser;\n        // Call getValue with no `this`.\n        var getValue = this.getValue;\n        var tarValRaw = getValue(this.valueGetterParam);\n        var tarValParsed = needParse ? this.valueParser(tarValRaw) : null;\n        // Relational cond follow \"and\" logic internally.\n        for (var i = 0; i < this.subCondList.length; i++) {\n          if (!this.subCondList[i].evaluate(needParse ? tarValParsed : tarValRaw)) {\n            return false;\n          }\n        }\n        return true;\n      };\n      return RelationalConditionInternal;\n    }();\n    function parseOption(exprOption, getters) {\n      if (exprOption === true || exprOption === false) {\n        var cond = new ConstConditionInternal();\n        cond.value = exprOption;\n        return cond;\n      }\n      var errMsg = '';\n      if (!isObjectNotArray(exprOption)) {\n        if (\"development\" !== 'production') {\n          errMsg = makePrintable('Illegal config. Expect a plain object but actually', exprOption);\n        }\n        throwError(errMsg);\n      }\n      if (exprOption.and) {\n        return parseAndOrOption('and', exprOption, getters);\n      } else if (exprOption.or) {\n        return parseAndOrOption('or', exprOption, getters);\n      } else if (exprOption.not) {\n        return parseNotOption(exprOption, getters);\n      }\n      return parseRelationalOption(exprOption, getters);\n    }\n    function parseAndOrOption(op, exprOption, getters) {\n      var subOptionArr = exprOption[op];\n      var errMsg = '';\n      if (\"development\" !== 'production') {\n        errMsg = makePrintable('\"and\"/\"or\" condition should only be `' + op + ': [...]` and must not be empty array.', 'Illegal condition:', exprOption);\n      }\n      if (!isArray(subOptionArr)) {\n        throwError(errMsg);\n      }\n      if (!subOptionArr.length) {\n        throwError(errMsg);\n      }\n      var cond = op === 'and' ? new AndConditionInternal() : new OrConditionInternal();\n      cond.children = map(subOptionArr, function (subOption) {\n        return parseOption(subOption, getters);\n      });\n      if (!cond.children.length) {\n        throwError(errMsg);\n      }\n      return cond;\n    }\n    function parseNotOption(exprOption, getters) {\n      var subOption = exprOption.not;\n      var errMsg = '';\n      if (\"development\" !== 'production') {\n        errMsg = makePrintable('\"not\" condition should only be `not: {}`.', 'Illegal condition:', exprOption);\n      }\n      if (!isObjectNotArray(subOption)) {\n        throwError(errMsg);\n      }\n      var cond = new NotConditionInternal();\n      cond.child = parseOption(subOption, getters);\n      if (!cond.child) {\n        throwError(errMsg);\n      }\n      return cond;\n    }\n    function parseRelationalOption(exprOption, getters) {\n      var errMsg = '';\n      var valueGetterParam = getters.prepareGetValue(exprOption);\n      var subCondList = [];\n      var exprKeys = keys(exprOption);\n      var parserName = exprOption.parser;\n      var valueParser = parserName ? getRawValueParser(parserName) : null;\n      for (var i = 0; i < exprKeys.length; i++) {\n        var keyRaw = exprKeys[i];\n        if (keyRaw === 'parser' || getters.valueGetterAttrMap.get(keyRaw)) {\n          continue;\n        }\n        var op = hasOwn(RELATIONAL_EXPRESSION_OP_ALIAS_MAP, keyRaw) ? RELATIONAL_EXPRESSION_OP_ALIAS_MAP[keyRaw] : keyRaw;\n        var condValueRaw = exprOption[keyRaw];\n        var condValueParsed = valueParser ? valueParser(condValueRaw) : condValueRaw;\n        var evaluator = createFilterComparator(op, condValueParsed) || op === 'reg' && new RegExpEvaluator(condValueParsed);\n        if (!evaluator) {\n          if (\"development\" !== 'production') {\n            errMsg = makePrintable('Illegal relational operation: \"' + keyRaw + '\" in condition:', exprOption);\n          }\n          throwError(errMsg);\n        }\n        subCondList.push(evaluator);\n      }\n      if (!subCondList.length) {\n        if (\"development\" !== 'production') {\n          errMsg = makePrintable('Relational condition must have at least one operator.', 'Illegal condition:', exprOption);\n        }\n        // No relational operator always disabled in case of dangers result.\n        throwError(errMsg);\n      }\n      var cond = new RelationalConditionInternal();\n      cond.valueGetterParam = valueGetterParam;\n      cond.valueParser = valueParser;\n      cond.getValue = getters.getValue;\n      cond.subCondList = subCondList;\n      return cond;\n    }\n    function isObjectNotArray(val) {\n      return isObject(val) && !isArrayLike(val);\n    }\n    var ConditionalExpressionParsed = /** @class */function () {\n      function ConditionalExpressionParsed(exprOption, getters) {\n        this._cond = parseOption(exprOption, getters);\n      }\n      ConditionalExpressionParsed.prototype.evaluate = function () {\n        return this._cond.evaluate();\n      };\n      return ConditionalExpressionParsed;\n    }();\n    function parseConditionalExpression(exprOption, getters) {\n      return new ConditionalExpressionParsed(exprOption, getters);\n    }\n\n    var filterTransform = {\n      type: 'echarts:filter',\n      // PENDING: enhance to filter by index rather than create new data\n      transform: function (params) {\n        // [Caveat] Fail-Fast:\n        // Do not return the whole dataset unless user config indicates it explicitly.\n        // For example, if no condition is specified by mistake, returning an empty result\n        // is better than returning the entire raw source for the user to find the mistake.\n        var upstream = params.upstream;\n        var rawItem;\n        var condition = parseConditionalExpression(params.config, {\n          valueGetterAttrMap: createHashMap({\n            dimension: true\n          }),\n          prepareGetValue: function (exprOption) {\n            var errMsg = '';\n            var dimLoose = exprOption.dimension;\n            if (!hasOwn(exprOption, 'dimension')) {\n              if (\"development\" !== 'production') {\n                errMsg = makePrintable('Relation condition must has prop \"dimension\" specified.', 'Illegal condition:', exprOption);\n              }\n              throwError(errMsg);\n            }\n            var dimInfo = upstream.getDimensionInfo(dimLoose);\n            if (!dimInfo) {\n              if (\"development\" !== 'production') {\n                errMsg = makePrintable('Can not find dimension info via: ' + dimLoose + '.\\n', 'Existing dimensions: ', upstream.cloneAllDimensionInfo(), '.\\n', 'Illegal condition:', exprOption, '.\\n');\n              }\n              throwError(errMsg);\n            }\n            return {\n              dimIdx: dimInfo.index\n            };\n          },\n          getValue: function (param) {\n            return upstream.retrieveValueFromItem(rawItem, param.dimIdx);\n          }\n        });\n        var resultData = [];\n        for (var i = 0, len = upstream.count(); i < len; i++) {\n          rawItem = upstream.getRawDataItem(i);\n          if (condition.evaluate()) {\n            resultData.push(rawItem);\n          }\n        }\n        return {\n          data: resultData\n        };\n      }\n    };\n\n    var sampleLog = '';\n    if (\"development\" !== 'production') {\n      sampleLog = ['Valid config is like:', '{ dimension: \"age\", order: \"asc\" }', 'or [{ dimension: \"age\", order: \"asc\"], { dimension: \"date\", order: \"desc\" }]'].join(' ');\n    }\n    var sortTransform = {\n      type: 'echarts:sort',\n      transform: function (params) {\n        var upstream = params.upstream;\n        var config = params.config;\n        var errMsg = '';\n        // Normalize\n        // const orderExprList: OrderExpression[] = isArray(config[0])\n        //     ? config as OrderExpression[]\n        //     : [config as OrderExpression];\n        var orderExprList = normalizeToArray(config);\n        if (!orderExprList.length) {\n          if (\"development\" !== 'production') {\n            errMsg = 'Empty `config` in sort transform.';\n          }\n          throwError(errMsg);\n        }\n        var orderDefList = [];\n        each(orderExprList, function (orderExpr) {\n          var dimLoose = orderExpr.dimension;\n          var order = orderExpr.order;\n          var parserName = orderExpr.parser;\n          var incomparable = orderExpr.incomparable;\n          if (dimLoose == null) {\n            if (\"development\" !== 'production') {\n              errMsg = 'Sort transform config must has \"dimension\" specified.' + sampleLog;\n            }\n            throwError(errMsg);\n          }\n          if (order !== 'asc' && order !== 'desc') {\n            if (\"development\" !== 'production') {\n              errMsg = 'Sort transform config must has \"order\" specified.' + sampleLog;\n            }\n            throwError(errMsg);\n          }\n          if (incomparable && incomparable !== 'min' && incomparable !== 'max') {\n            var errMsg_1 = '';\n            if (\"development\" !== 'production') {\n              errMsg_1 = 'incomparable must be \"min\" or \"max\" rather than \"' + incomparable + '\".';\n            }\n            throwError(errMsg_1);\n          }\n          if (order !== 'asc' && order !== 'desc') {\n            var errMsg_2 = '';\n            if (\"development\" !== 'production') {\n              errMsg_2 = 'order must be \"asc\" or \"desc\" rather than \"' + order + '\".';\n            }\n            throwError(errMsg_2);\n          }\n          var dimInfo = upstream.getDimensionInfo(dimLoose);\n          if (!dimInfo) {\n            if (\"development\" !== 'production') {\n              errMsg = makePrintable('Can not find dimension info via: ' + dimLoose + '.\\n', 'Existing dimensions: ', upstream.cloneAllDimensionInfo(), '.\\n', 'Illegal config:', orderExpr, '.\\n');\n            }\n            throwError(errMsg);\n          }\n          var parser = parserName ? getRawValueParser(parserName) : null;\n          if (parserName && !parser) {\n            if (\"development\" !== 'production') {\n              errMsg = makePrintable('Invalid parser name ' + parserName + '.\\n', 'Illegal config:', orderExpr, '.\\n');\n            }\n            throwError(errMsg);\n          }\n          orderDefList.push({\n            dimIdx: dimInfo.index,\n            parser: parser,\n            comparator: new SortOrderComparator(order, incomparable)\n          });\n        });\n        // TODO: support it?\n        var sourceFormat = upstream.sourceFormat;\n        if (sourceFormat !== SOURCE_FORMAT_ARRAY_ROWS && sourceFormat !== SOURCE_FORMAT_OBJECT_ROWS) {\n          if (\"development\" !== 'production') {\n            errMsg = 'sourceFormat \"' + sourceFormat + '\" is not supported yet';\n          }\n          throwError(errMsg);\n        }\n        // Other upstream format are all array.\n        var resultData = [];\n        for (var i = 0, len = upstream.count(); i < len; i++) {\n          resultData.push(upstream.getRawDataItem(i));\n        }\n        resultData.sort(function (item0, item1) {\n          for (var i = 0; i < orderDefList.length; i++) {\n            var orderDef = orderDefList[i];\n            var val0 = upstream.retrieveValueFromItem(item0, orderDef.dimIdx);\n            var val1 = upstream.retrieveValueFromItem(item1, orderDef.dimIdx);\n            if (orderDef.parser) {\n              val0 = orderDef.parser(val0);\n              val1 = orderDef.parser(val1);\n            }\n            var result = orderDef.comparator.evaluate(val0, val1);\n            if (result !== 0) {\n              return result;\n            }\n          }\n          return 0;\n        });\n        return {\n          data: resultData\n        };\n      }\n    };\n\n    function install$R(registers) {\n      registers.registerTransform(filterTransform);\n      registers.registerTransform(sortTransform);\n    }\n\n    var DatasetModel = /** @class */function (_super) {\n      __extends(DatasetModel, _super);\n      function DatasetModel() {\n        var _this = _super !== null && _super.apply(this, arguments) || this;\n        _this.type = 'dataset';\n        return _this;\n      }\n      DatasetModel.prototype.init = function (option, parentModel, ecModel) {\n        _super.prototype.init.call(this, option, parentModel, ecModel);\n        this._sourceManager = new SourceManager(this);\n        disableTransformOptionMerge(this);\n      };\n      DatasetModel.prototype.mergeOption = function (newOption, ecModel) {\n        _super.prototype.mergeOption.call(this, newOption, ecModel);\n        disableTransformOptionMerge(this);\n      };\n      DatasetModel.prototype.optionUpdated = function () {\n        this._sourceManager.dirty();\n      };\n      DatasetModel.prototype.getSourceManager = function () {\n        return this._sourceManager;\n      };\n      DatasetModel.type = 'dataset';\n      DatasetModel.defaultOption = {\n        seriesLayoutBy: SERIES_LAYOUT_BY_COLUMN\n      };\n      return DatasetModel;\n    }(ComponentModel);\n    var DatasetView = /** @class */function (_super) {\n      __extends(DatasetView, _super);\n      function DatasetView() {\n        var _this = _super !== null && _super.apply(this, arguments) || this;\n        _this.type = 'dataset';\n        return _this;\n      }\n      DatasetView.type = 'dataset';\n      return DatasetView;\n    }(ComponentView);\n    function install$S(registers) {\n      registers.registerComponentModel(DatasetModel);\n      registers.registerComponentView(DatasetView);\n    }\n\n    var CMD$4 = PathProxy.CMD;\n    function aroundEqual(a, b) {\n        return Math.abs(a - b) < 1e-5;\n    }\n    function pathToBezierCurves(path) {\n        var data = path.data;\n        var len = path.len();\n        var bezierArrayGroups = [];\n        var currentSubpath;\n        var xi = 0;\n        var yi = 0;\n        var x0 = 0;\n        var y0 = 0;\n        function createNewSubpath(x, y) {\n            if (currentSubpath && currentSubpath.length > 2) {\n                bezierArrayGroups.push(currentSubpath);\n            }\n            currentSubpath = [x, y];\n        }\n        function addLine(x0, y0, x1, y1) {\n            if (!(aroundEqual(x0, x1) && aroundEqual(y0, y1))) {\n                currentSubpath.push(x0, y0, x1, y1, x1, y1);\n            }\n        }\n        function addArc(startAngle, endAngle, cx, cy, rx, ry) {\n            var delta = Math.abs(endAngle - startAngle);\n            var len = Math.tan(delta / 4) * 4 / 3;\n            var dir = endAngle < startAngle ? -1 : 1;\n            var c1 = Math.cos(startAngle);\n            var s1 = Math.sin(startAngle);\n            var c2 = Math.cos(endAngle);\n            var s2 = Math.sin(endAngle);\n            var x1 = c1 * rx + cx;\n            var y1 = s1 * ry + cy;\n            var x4 = c2 * rx + cx;\n            var y4 = s2 * ry + cy;\n            var hx = rx * len * dir;\n            var hy = ry * len * dir;\n            currentSubpath.push(x1 - hx * s1, y1 + hy * c1, x4 + hx * s2, y4 - hy * c2, x4, y4);\n        }\n        var x1;\n        var y1;\n        var x2;\n        var y2;\n        for (var i = 0; i < len;) {\n            var cmd = data[i++];\n            var isFirst = i === 1;\n            if (isFirst) {\n                xi = data[i];\n                yi = data[i + 1];\n                x0 = xi;\n                y0 = yi;\n                if (cmd === CMD$4.L || cmd === CMD$4.C || cmd === CMD$4.Q) {\n                    currentSubpath = [x0, y0];\n                }\n            }\n            switch (cmd) {\n                case CMD$4.M:\n                    xi = x0 = data[i++];\n                    yi = y0 = data[i++];\n                    createNewSubpath(x0, y0);\n                    break;\n                case CMD$4.L:\n                    x1 = data[i++];\n                    y1 = data[i++];\n                    addLine(xi, yi, x1, y1);\n                    xi = x1;\n                    yi = y1;\n                    break;\n                case CMD$4.C:\n                    currentSubpath.push(data[i++], data[i++], data[i++], data[i++], xi = data[i++], yi = data[i++]);\n                    break;\n                case CMD$4.Q:\n                    x1 = data[i++];\n                    y1 = data[i++];\n                    x2 = data[i++];\n                    y2 = data[i++];\n                    currentSubpath.push(xi + 2 / 3 * (x1 - xi), yi + 2 / 3 * (y1 - yi), x2 + 2 / 3 * (x1 - x2), y2 + 2 / 3 * (y1 - y2), x2, y2);\n                    xi = x2;\n                    yi = y2;\n                    break;\n                case CMD$4.A:\n                    var cx = data[i++];\n                    var cy = data[i++];\n                    var rx = data[i++];\n                    var ry = data[i++];\n                    var startAngle = data[i++];\n                    var endAngle = data[i++] + startAngle;\n                    i += 1;\n                    var anticlockwise = !data[i++];\n                    x1 = Math.cos(startAngle) * rx + cx;\n                    y1 = Math.sin(startAngle) * ry + cy;\n                    if (isFirst) {\n                        x0 = x1;\n                        y0 = y1;\n                        createNewSubpath(x0, y0);\n                    }\n                    else {\n                        addLine(xi, yi, x1, y1);\n                    }\n                    xi = Math.cos(endAngle) * rx + cx;\n                    yi = Math.sin(endAngle) * ry + cy;\n                    var step = (anticlockwise ? -1 : 1) * Math.PI / 2;\n                    for (var angle = startAngle; anticlockwise ? angle > endAngle : angle < endAngle; angle += step) {\n                        var nextAngle = anticlockwise ? Math.max(angle + step, endAngle)\n                            : Math.min(angle + step, endAngle);\n                        addArc(angle, nextAngle, cx, cy, rx, ry);\n                    }\n                    break;\n                case CMD$4.R:\n                    x0 = xi = data[i++];\n                    y0 = yi = data[i++];\n                    x1 = x0 + data[i++];\n                    y1 = y0 + data[i++];\n                    createNewSubpath(x1, y0);\n                    addLine(x1, y0, x1, y1);\n                    addLine(x1, y1, x0, y1);\n                    addLine(x0, y1, x0, y0);\n                    addLine(x0, y0, x1, y0);\n                    break;\n                case CMD$4.Z:\n                    currentSubpath && addLine(xi, yi, x0, y0);\n                    xi = x0;\n                    yi = y0;\n                    break;\n            }\n        }\n        if (currentSubpath && currentSubpath.length > 2) {\n            bezierArrayGroups.push(currentSubpath);\n        }\n        return bezierArrayGroups;\n    }\n    function adpativeBezier(x0, y0, x1, y1, x2, y2, x3, y3, out, scale) {\n        if (aroundEqual(x0, x1) && aroundEqual(y0, y1) && aroundEqual(x2, x3) && aroundEqual(y2, y3)) {\n            out.push(x3, y3);\n            return;\n        }\n        var PIXEL_DISTANCE = 2 / scale;\n        var PIXEL_DISTANCE_SQR = PIXEL_DISTANCE * PIXEL_DISTANCE;\n        var dx = x3 - x0;\n        var dy = y3 - y0;\n        var d = Math.sqrt(dx * dx + dy * dy);\n        dx /= d;\n        dy /= d;\n        var dx1 = x1 - x0;\n        var dy1 = y1 - y0;\n        var dx2 = x2 - x3;\n        var dy2 = y2 - y3;\n        var cp1LenSqr = dx1 * dx1 + dy1 * dy1;\n        var cp2LenSqr = dx2 * dx2 + dy2 * dy2;\n        if (cp1LenSqr < PIXEL_DISTANCE_SQR && cp2LenSqr < PIXEL_DISTANCE_SQR) {\n            out.push(x3, y3);\n            return;\n        }\n        var projLen1 = dx * dx1 + dy * dy1;\n        var projLen2 = -dx * dx2 - dy * dy2;\n        var d1Sqr = cp1LenSqr - projLen1 * projLen1;\n        var d2Sqr = cp2LenSqr - projLen2 * projLen2;\n        if (d1Sqr < PIXEL_DISTANCE_SQR && projLen1 >= 0\n            && d2Sqr < PIXEL_DISTANCE_SQR && projLen2 >= 0) {\n            out.push(x3, y3);\n            return;\n        }\n        var tmpSegX = [];\n        var tmpSegY = [];\n        cubicSubdivide(x0, x1, x2, x3, 0.5, tmpSegX);\n        cubicSubdivide(y0, y1, y2, y3, 0.5, tmpSegY);\n        adpativeBezier(tmpSegX[0], tmpSegY[0], tmpSegX[1], tmpSegY[1], tmpSegX[2], tmpSegY[2], tmpSegX[3], tmpSegY[3], out, scale);\n        adpativeBezier(tmpSegX[4], tmpSegY[4], tmpSegX[5], tmpSegY[5], tmpSegX[6], tmpSegY[6], tmpSegX[7], tmpSegY[7], out, scale);\n    }\n    function pathToPolygons(path, scale) {\n        var bezierArrayGroups = pathToBezierCurves(path);\n        var polygons = [];\n        scale = scale || 1;\n        for (var i = 0; i < bezierArrayGroups.length; i++) {\n            var beziers = bezierArrayGroups[i];\n            var polygon = [];\n            var x0 = beziers[0];\n            var y0 = beziers[1];\n            polygon.push(x0, y0);\n            for (var k = 2; k < beziers.length;) {\n                var x1 = beziers[k++];\n                var y1 = beziers[k++];\n                var x2 = beziers[k++];\n                var y2 = beziers[k++];\n                var x3 = beziers[k++];\n                var y3 = beziers[k++];\n                adpativeBezier(x0, y0, x1, y1, x2, y2, x3, y3, polygon, scale);\n                x0 = x3;\n                y0 = y3;\n            }\n            polygons.push(polygon);\n        }\n        return polygons;\n    }\n\n    function getDividingGrids(dimSize, rowDim, count) {\n        var rowSize = dimSize[rowDim];\n        var columnSize = dimSize[1 - rowDim];\n        var ratio = Math.abs(rowSize / columnSize);\n        var rowCount = Math.ceil(Math.sqrt(ratio * count));\n        var columnCount = Math.floor(count / rowCount);\n        if (columnCount === 0) {\n            columnCount = 1;\n            rowCount = count;\n        }\n        var grids = [];\n        for (var i = 0; i < rowCount; i++) {\n            grids.push(columnCount);\n        }\n        var currentCount = rowCount * columnCount;\n        var remained = count - currentCount;\n        if (remained > 0) {\n            for (var i = 0; i < remained; i++) {\n                grids[i % rowCount] += 1;\n            }\n        }\n        return grids;\n    }\n    function divideSector(sectorShape, count, outShapes) {\n        var r0 = sectorShape.r0;\n        var r = sectorShape.r;\n        var startAngle = sectorShape.startAngle;\n        var endAngle = sectorShape.endAngle;\n        var angle = Math.abs(endAngle - startAngle);\n        var arcLen = angle * r;\n        var deltaR = r - r0;\n        var isAngleRow = arcLen > Math.abs(deltaR);\n        var grids = getDividingGrids([arcLen, deltaR], isAngleRow ? 0 : 1, count);\n        var rowSize = (isAngleRow ? angle : deltaR) / grids.length;\n        for (var row = 0; row < grids.length; row++) {\n            var columnSize = (isAngleRow ? deltaR : angle) / grids[row];\n            for (var column = 0; column < grids[row]; column++) {\n                var newShape = {};\n                if (isAngleRow) {\n                    newShape.startAngle = startAngle + rowSize * row;\n                    newShape.endAngle = startAngle + rowSize * (row + 1);\n                    newShape.r0 = r0 + columnSize * column;\n                    newShape.r = r0 + columnSize * (column + 1);\n                }\n                else {\n                    newShape.startAngle = startAngle + columnSize * column;\n                    newShape.endAngle = startAngle + columnSize * (column + 1);\n                    newShape.r0 = r0 + rowSize * row;\n                    newShape.r = r0 + rowSize * (row + 1);\n                }\n                newShape.clockwise = sectorShape.clockwise;\n                newShape.cx = sectorShape.cx;\n                newShape.cy = sectorShape.cy;\n                outShapes.push(newShape);\n            }\n        }\n    }\n    function divideRect(rectShape, count, outShapes) {\n        var width = rectShape.width;\n        var height = rectShape.height;\n        var isHorizontalRow = width > height;\n        var grids = getDividingGrids([width, height], isHorizontalRow ? 0 : 1, count);\n        var rowSizeDim = isHorizontalRow ? 'width' : 'height';\n        var columnSizeDim = isHorizontalRow ? 'height' : 'width';\n        var rowDim = isHorizontalRow ? 'x' : 'y';\n        var columnDim = isHorizontalRow ? 'y' : 'x';\n        var rowSize = rectShape[rowSizeDim] / grids.length;\n        for (var row = 0; row < grids.length; row++) {\n            var columnSize = rectShape[columnSizeDim] / grids[row];\n            for (var column = 0; column < grids[row]; column++) {\n                var newShape = {};\n                newShape[rowDim] = row * rowSize;\n                newShape[columnDim] = column * columnSize;\n                newShape[rowSizeDim] = rowSize;\n                newShape[columnSizeDim] = columnSize;\n                newShape.x += rectShape.x;\n                newShape.y += rectShape.y;\n                outShapes.push(newShape);\n            }\n        }\n    }\n    function crossProduct2d$1(x1, y1, x2, y2) {\n        return x1 * y2 - x2 * y1;\n    }\n    function lineLineIntersect$1(a1x, a1y, a2x, a2y, b1x, b1y, b2x, b2y) {\n        var mx = a2x - a1x;\n        var my = a2y - a1y;\n        var nx = b2x - b1x;\n        var ny = b2y - b1y;\n        var nmCrossProduct = crossProduct2d$1(nx, ny, mx, my);\n        if (Math.abs(nmCrossProduct) < 1e-6) {\n            return null;\n        }\n        var b1a1x = a1x - b1x;\n        var b1a1y = a1y - b1y;\n        var p = crossProduct2d$1(b1a1x, b1a1y, nx, ny) / nmCrossProduct;\n        if (p < 0 || p > 1) {\n            return null;\n        }\n        return new Point(p * mx + a1x, p * my + a1y);\n    }\n    function projPtOnLine(pt, lineA, lineB) {\n        var dir = new Point();\n        Point.sub(dir, lineB, lineA);\n        dir.normalize();\n        var dir2 = new Point();\n        Point.sub(dir2, pt, lineA);\n        var len = dir2.dot(dir);\n        return len;\n    }\n    function addToPoly(poly, pt) {\n        var last = poly[poly.length - 1];\n        if (last && last[0] === pt[0] && last[1] === pt[1]) {\n            return;\n        }\n        poly.push(pt);\n    }\n    function splitPolygonByLine(points, lineA, lineB) {\n        var len = points.length;\n        var intersections = [];\n        for (var i = 0; i < len; i++) {\n            var p0 = points[i];\n            var p1 = points[(i + 1) % len];\n            var intersectionPt = lineLineIntersect$1(p0[0], p0[1], p1[0], p1[1], lineA.x, lineA.y, lineB.x, lineB.y);\n            if (intersectionPt) {\n                intersections.push({\n                    projPt: projPtOnLine(intersectionPt, lineA, lineB),\n                    pt: intersectionPt,\n                    idx: i\n                });\n            }\n        }\n        if (intersections.length < 2) {\n            return [{ points: points }, { points: points }];\n        }\n        intersections.sort(function (a, b) {\n            return a.projPt - b.projPt;\n        });\n        var splitPt0 = intersections[0];\n        var splitPt1 = intersections[intersections.length - 1];\n        if (splitPt1.idx < splitPt0.idx) {\n            var tmp = splitPt0;\n            splitPt0 = splitPt1;\n            splitPt1 = tmp;\n        }\n        var splitPt0Arr = [splitPt0.pt.x, splitPt0.pt.y];\n        var splitPt1Arr = [splitPt1.pt.x, splitPt1.pt.y];\n        var newPolyA = [splitPt0Arr];\n        var newPolyB = [splitPt1Arr];\n        for (var i = splitPt0.idx + 1; i <= splitPt1.idx; i++) {\n            addToPoly(newPolyA, points[i].slice());\n        }\n        addToPoly(newPolyA, splitPt1Arr);\n        addToPoly(newPolyA, splitPt0Arr);\n        for (var i = splitPt1.idx + 1; i <= splitPt0.idx + len; i++) {\n            addToPoly(newPolyB, points[i % len].slice());\n        }\n        addToPoly(newPolyB, splitPt0Arr);\n        addToPoly(newPolyB, splitPt1Arr);\n        return [{\n                points: newPolyA\n            }, {\n                points: newPolyB\n            }];\n    }\n    function binaryDividePolygon(polygonShape) {\n        var points = polygonShape.points;\n        var min = [];\n        var max = [];\n        fromPoints(points, min, max);\n        var boundingRect = new BoundingRect(min[0], min[1], max[0] - min[0], max[1] - min[1]);\n        var width = boundingRect.width;\n        var height = boundingRect.height;\n        var x = boundingRect.x;\n        var y = boundingRect.y;\n        var pt0 = new Point();\n        var pt1 = new Point();\n        if (width > height) {\n            pt0.x = pt1.x = x + width / 2;\n            pt0.y = y;\n            pt1.y = y + height;\n        }\n        else {\n            pt0.y = pt1.y = y + height / 2;\n            pt0.x = x;\n            pt1.x = x + width;\n        }\n        return splitPolygonByLine(points, pt0, pt1);\n    }\n    function binaryDivideRecursive(divider, shape, count, out) {\n        if (count === 1) {\n            out.push(shape);\n        }\n        else {\n            var mid = Math.floor(count / 2);\n            var sub = divider(shape);\n            binaryDivideRecursive(divider, sub[0], mid, out);\n            binaryDivideRecursive(divider, sub[1], count - mid, out);\n        }\n        return out;\n    }\n    function clone$4(path, count) {\n        var paths = [];\n        for (var i = 0; i < count; i++) {\n            paths.push(clonePath(path));\n        }\n        return paths;\n    }\n    function copyPathProps(source, target) {\n        target.setStyle(source.style);\n        target.z = source.z;\n        target.z2 = source.z2;\n        target.zlevel = source.zlevel;\n    }\n    function polygonConvert(points) {\n        var out = [];\n        for (var i = 0; i < points.length;) {\n            out.push([points[i++], points[i++]]);\n        }\n        return out;\n    }\n    function split(path, count) {\n        var outShapes = [];\n        var shape = path.shape;\n        var OutShapeCtor;\n        switch (path.type) {\n            case 'rect':\n                divideRect(shape, count, outShapes);\n                OutShapeCtor = Rect;\n                break;\n            case 'sector':\n                divideSector(shape, count, outShapes);\n                OutShapeCtor = Sector;\n                break;\n            case 'circle':\n                divideSector({\n                    r0: 0, r: shape.r, startAngle: 0, endAngle: Math.PI * 2,\n                    cx: shape.cx, cy: shape.cy\n                }, count, outShapes);\n                OutShapeCtor = Sector;\n                break;\n            default:\n                var m = path.getComputedTransform();\n                var scale = m ? Math.sqrt(Math.max(m[0] * m[0] + m[1] * m[1], m[2] * m[2] + m[3] * m[3])) : 1;\n                var polygons = map(pathToPolygons(path.getUpdatedPathProxy(), scale), function (poly) { return polygonConvert(poly); });\n                var polygonCount = polygons.length;\n                if (polygonCount === 0) {\n                    binaryDivideRecursive(binaryDividePolygon, {\n                        points: polygons[0]\n                    }, count, outShapes);\n                }\n                else if (polygonCount === count) {\n                    for (var i = 0; i < polygonCount; i++) {\n                        outShapes.push({\n                            points: polygons[i]\n                        });\n                    }\n                }\n                else {\n                    var totalArea_1 = 0;\n                    var items = map(polygons, function (poly) {\n                        var min = [];\n                        var max = [];\n                        fromPoints(poly, min, max);\n                        var area = (max[1] - min[1]) * (max[0] - min[0]);\n                        totalArea_1 += area;\n                        return { poly: poly, area: area };\n                    });\n                    items.sort(function (a, b) { return b.area - a.area; });\n                    var left = count;\n                    for (var i = 0; i < polygonCount; i++) {\n                        var item = items[i];\n                        if (left <= 0) {\n                            break;\n                        }\n                        var selfCount = i === polygonCount - 1\n                            ? left\n                            : Math.ceil(item.area / totalArea_1 * count);\n                        if (selfCount < 0) {\n                            continue;\n                        }\n                        binaryDivideRecursive(binaryDividePolygon, {\n                            points: item.poly\n                        }, selfCount, outShapes);\n                        left -= selfCount;\n                    }\n                }\n                OutShapeCtor = Polygon;\n                break;\n        }\n        if (!OutShapeCtor) {\n            return clone$4(path, count);\n        }\n        var out = [];\n        for (var i = 0; i < outShapes.length; i++) {\n            var subPath = new OutShapeCtor();\n            subPath.setShape(outShapes[i]);\n            copyPathProps(path, subPath);\n            out.push(subPath);\n        }\n        return out;\n    }\n\n    function alignSubpath(subpath1, subpath2) {\n        var len1 = subpath1.length;\n        var len2 = subpath2.length;\n        if (len1 === len2) {\n            return [subpath1, subpath2];\n        }\n        var tmpSegX = [];\n        var tmpSegY = [];\n        var shorterPath = len1 < len2 ? subpath1 : subpath2;\n        var shorterLen = Math.min(len1, len2);\n        var diff = Math.abs(len2 - len1) / 6;\n        var shorterBezierCount = (shorterLen - 2) / 6;\n        var eachCurveSubDivCount = Math.ceil(diff / shorterBezierCount) + 1;\n        var newSubpath = [shorterPath[0], shorterPath[1]];\n        var remained = diff;\n        for (var i = 2; i < shorterLen;) {\n            var x0 = shorterPath[i - 2];\n            var y0 = shorterPath[i - 1];\n            var x1 = shorterPath[i++];\n            var y1 = shorterPath[i++];\n            var x2 = shorterPath[i++];\n            var y2 = shorterPath[i++];\n            var x3 = shorterPath[i++];\n            var y3 = shorterPath[i++];\n            if (remained <= 0) {\n                newSubpath.push(x1, y1, x2, y2, x3, y3);\n                continue;\n            }\n            var actualSubDivCount = Math.min(remained, eachCurveSubDivCount - 1) + 1;\n            for (var k = 1; k <= actualSubDivCount; k++) {\n                var p = k / actualSubDivCount;\n                cubicSubdivide(x0, x1, x2, x3, p, tmpSegX);\n                cubicSubdivide(y0, y1, y2, y3, p, tmpSegY);\n                x0 = tmpSegX[3];\n                y0 = tmpSegY[3];\n                newSubpath.push(tmpSegX[1], tmpSegY[1], tmpSegX[2], tmpSegY[2], x0, y0);\n                x1 = tmpSegX[5];\n                y1 = tmpSegY[5];\n                x2 = tmpSegX[6];\n                y2 = tmpSegY[6];\n            }\n            remained -= actualSubDivCount - 1;\n        }\n        return shorterPath === subpath1 ? [newSubpath, subpath2] : [subpath1, newSubpath];\n    }\n    function createSubpath(lastSubpathSubpath, otherSubpath) {\n        var len = lastSubpathSubpath.length;\n        var lastX = lastSubpathSubpath[len - 2];\n        var lastY = lastSubpathSubpath[len - 1];\n        var newSubpath = [];\n        for (var i = 0; i < otherSubpath.length;) {\n            newSubpath[i++] = lastX;\n            newSubpath[i++] = lastY;\n        }\n        return newSubpath;\n    }\n    function alignBezierCurves(array1, array2) {\n        var _a;\n        var lastSubpath1;\n        var lastSubpath2;\n        var newArray1 = [];\n        var newArray2 = [];\n        for (var i = 0; i < Math.max(array1.length, array2.length); i++) {\n            var subpath1 = array1[i];\n            var subpath2 = array2[i];\n            var newSubpath1 = void 0;\n            var newSubpath2 = void 0;\n            if (!subpath1) {\n                newSubpath1 = createSubpath(lastSubpath1 || subpath2, subpath2);\n                newSubpath2 = subpath2;\n            }\n            else if (!subpath2) {\n                newSubpath2 = createSubpath(lastSubpath2 || subpath1, subpath1);\n                newSubpath1 = subpath1;\n            }\n            else {\n                _a = alignSubpath(subpath1, subpath2), newSubpath1 = _a[0], newSubpath2 = _a[1];\n                lastSubpath1 = newSubpath1;\n                lastSubpath2 = newSubpath2;\n            }\n            newArray1.push(newSubpath1);\n            newArray2.push(newSubpath2);\n        }\n        return [newArray1, newArray2];\n    }\n    function centroid$1(array) {\n        var signedArea = 0;\n        var cx = 0;\n        var cy = 0;\n        var len = array.length;\n        for (var i = 0, j = len - 2; i < len; j = i, i += 2) {\n            var x0 = array[j];\n            var y0 = array[j + 1];\n            var x1 = array[i];\n            var y1 = array[i + 1];\n            var a = x0 * y1 - x1 * y0;\n            signedArea += a;\n            cx += (x0 + x1) * a;\n            cy += (y0 + y1) * a;\n        }\n        if (signedArea === 0) {\n            return [array[0] || 0, array[1] || 0];\n        }\n        return [cx / signedArea / 3, cy / signedArea / 3, signedArea];\n    }\n    function findBestRingOffset(fromSubBeziers, toSubBeziers, fromCp, toCp) {\n        var bezierCount = (fromSubBeziers.length - 2) / 6;\n        var bestScore = Infinity;\n        var bestOffset = 0;\n        var len = fromSubBeziers.length;\n        var len2 = len - 2;\n        for (var offset = 0; offset < bezierCount; offset++) {\n            var cursorOffset = offset * 6;\n            var score = 0;\n            for (var k = 0; k < len; k += 2) {\n                var idx = k === 0 ? cursorOffset : ((cursorOffset + k - 2) % len2 + 2);\n                var x0 = fromSubBeziers[idx] - fromCp[0];\n                var y0 = fromSubBeziers[idx + 1] - fromCp[1];\n                var x1 = toSubBeziers[k] - toCp[0];\n                var y1 = toSubBeziers[k + 1] - toCp[1];\n                var dx = x1 - x0;\n                var dy = y1 - y0;\n                score += dx * dx + dy * dy;\n            }\n            if (score < bestScore) {\n                bestScore = score;\n                bestOffset = offset;\n            }\n        }\n        return bestOffset;\n    }\n    function reverse(array) {\n        var newArr = [];\n        var len = array.length;\n        for (var i = 0; i < len; i += 2) {\n            newArr[i] = array[len - i - 2];\n            newArr[i + 1] = array[len - i - 1];\n        }\n        return newArr;\n    }\n    function findBestMorphingRotation(fromArr, toArr, searchAngleIteration, searchAngleRange) {\n        var result = [];\n        var fromNeedsReverse;\n        for (var i = 0; i < fromArr.length; i++) {\n            var fromSubpathBezier = fromArr[i];\n            var toSubpathBezier = toArr[i];\n            var fromCp = centroid$1(fromSubpathBezier);\n            var toCp = centroid$1(toSubpathBezier);\n            if (fromNeedsReverse == null) {\n                fromNeedsReverse = fromCp[2] < 0 !== toCp[2] < 0;\n            }\n            var newFromSubpathBezier = [];\n            var newToSubpathBezier = [];\n            var bestAngle = 0;\n            var bestScore = Infinity;\n            var tmpArr = [];\n            var len = fromSubpathBezier.length;\n            if (fromNeedsReverse) {\n                fromSubpathBezier = reverse(fromSubpathBezier);\n            }\n            var offset = findBestRingOffset(fromSubpathBezier, toSubpathBezier, fromCp, toCp) * 6;\n            var len2 = len - 2;\n            for (var k = 0; k < len2; k += 2) {\n                var idx = (offset + k) % len2 + 2;\n                newFromSubpathBezier[k + 2] = fromSubpathBezier[idx] - fromCp[0];\n                newFromSubpathBezier[k + 3] = fromSubpathBezier[idx + 1] - fromCp[1];\n            }\n            newFromSubpathBezier[0] = fromSubpathBezier[offset] - fromCp[0];\n            newFromSubpathBezier[1] = fromSubpathBezier[offset + 1] - fromCp[1];\n            if (searchAngleIteration > 0) {\n                var step = searchAngleRange / searchAngleIteration;\n                for (var angle = -searchAngleRange / 2; angle <= searchAngleRange / 2; angle += step) {\n                    var sa = Math.sin(angle);\n                    var ca = Math.cos(angle);\n                    var score = 0;\n                    for (var k = 0; k < fromSubpathBezier.length; k += 2) {\n                        var x0 = newFromSubpathBezier[k];\n                        var y0 = newFromSubpathBezier[k + 1];\n                        var x1 = toSubpathBezier[k] - toCp[0];\n                        var y1 = toSubpathBezier[k + 1] - toCp[1];\n                        var newX1 = x1 * ca - y1 * sa;\n                        var newY1 = x1 * sa + y1 * ca;\n                        tmpArr[k] = newX1;\n                        tmpArr[k + 1] = newY1;\n                        var dx = newX1 - x0;\n                        var dy = newY1 - y0;\n                        score += dx * dx + dy * dy;\n                    }\n                    if (score < bestScore) {\n                        bestScore = score;\n                        bestAngle = angle;\n                        for (var m = 0; m < tmpArr.length; m++) {\n                            newToSubpathBezier[m] = tmpArr[m];\n                        }\n                    }\n                }\n            }\n            else {\n                for (var i_1 = 0; i_1 < len; i_1 += 2) {\n                    newToSubpathBezier[i_1] = toSubpathBezier[i_1] - toCp[0];\n                    newToSubpathBezier[i_1 + 1] = toSubpathBezier[i_1 + 1] - toCp[1];\n                }\n            }\n            result.push({\n                from: newFromSubpathBezier,\n                to: newToSubpathBezier,\n                fromCp: fromCp,\n                toCp: toCp,\n                rotation: -bestAngle\n            });\n        }\n        return result;\n    }\n    function isCombineMorphing(path) {\n        return path.__isCombineMorphing;\n    }\n    var SAVED_METHOD_PREFIX = '__mOriginal_';\n    function saveAndModifyMethod(obj, methodName, modifiers) {\n        var savedMethodName = SAVED_METHOD_PREFIX + methodName;\n        var originalMethod = obj[savedMethodName] || obj[methodName];\n        if (!obj[savedMethodName]) {\n            obj[savedMethodName] = obj[methodName];\n        }\n        var replace = modifiers.replace;\n        var after = modifiers.after;\n        var before = modifiers.before;\n        obj[methodName] = function () {\n            var args = arguments;\n            var res;\n            before && before.apply(this, args);\n            if (replace) {\n                res = replace.apply(this, args);\n            }\n            else {\n                res = originalMethod.apply(this, args);\n            }\n            after && after.apply(this, args);\n            return res;\n        };\n    }\n    function restoreMethod(obj, methodName) {\n        var savedMethodName = SAVED_METHOD_PREFIX + methodName;\n        if (obj[savedMethodName]) {\n            obj[methodName] = obj[savedMethodName];\n            obj[savedMethodName] = null;\n        }\n    }\n    function applyTransformOnBeziers(bezierCurves, mm) {\n        for (var i = 0; i < bezierCurves.length; i++) {\n            var subBeziers = bezierCurves[i];\n            for (var k = 0; k < subBeziers.length;) {\n                var x = subBeziers[k];\n                var y = subBeziers[k + 1];\n                subBeziers[k++] = mm[0] * x + mm[2] * y + mm[4];\n                subBeziers[k++] = mm[1] * x + mm[3] * y + mm[5];\n            }\n        }\n    }\n    function prepareMorphPath(fromPath, toPath) {\n        var fromPathProxy = fromPath.getUpdatedPathProxy();\n        var toPathProxy = toPath.getUpdatedPathProxy();\n        var _a = alignBezierCurves(pathToBezierCurves(fromPathProxy), pathToBezierCurves(toPathProxy)), fromBezierCurves = _a[0], toBezierCurves = _a[1];\n        var fromPathTransform = fromPath.getComputedTransform();\n        var toPathTransform = toPath.getComputedTransform();\n        function updateIdentityTransform() {\n            this.transform = null;\n        }\n        fromPathTransform && applyTransformOnBeziers(fromBezierCurves, fromPathTransform);\n        toPathTransform && applyTransformOnBeziers(toBezierCurves, toPathTransform);\n        saveAndModifyMethod(toPath, 'updateTransform', { replace: updateIdentityTransform });\n        toPath.transform = null;\n        var morphingData = findBestMorphingRotation(fromBezierCurves, toBezierCurves, 10, Math.PI);\n        var tmpArr = [];\n        saveAndModifyMethod(toPath, 'buildPath', { replace: function (path) {\n                var t = toPath.__morphT;\n                var onet = 1 - t;\n                var newCp = [];\n                for (var i = 0; i < morphingData.length; i++) {\n                    var item = morphingData[i];\n                    var from = item.from;\n                    var to = item.to;\n                    var angle = item.rotation * t;\n                    var fromCp = item.fromCp;\n                    var toCp = item.toCp;\n                    var sa = Math.sin(angle);\n                    var ca = Math.cos(angle);\n                    lerp(newCp, fromCp, toCp, t);\n                    for (var m = 0; m < from.length; m += 2) {\n                        var x0_1 = from[m];\n                        var y0_1 = from[m + 1];\n                        var x1 = to[m];\n                        var y1 = to[m + 1];\n                        var x = x0_1 * onet + x1 * t;\n                        var y = y0_1 * onet + y1 * t;\n                        tmpArr[m] = (x * ca - y * sa) + newCp[0];\n                        tmpArr[m + 1] = (x * sa + y * ca) + newCp[1];\n                    }\n                    var x0 = tmpArr[0];\n                    var y0 = tmpArr[1];\n                    path.moveTo(x0, y0);\n                    for (var m = 2; m < from.length;) {\n                        var x1 = tmpArr[m++];\n                        var y1 = tmpArr[m++];\n                        var x2 = tmpArr[m++];\n                        var y2 = tmpArr[m++];\n                        var x3 = tmpArr[m++];\n                        var y3 = tmpArr[m++];\n                        if (x0 === x1 && y0 === y1 && x2 === x3 && y2 === y3) {\n                            path.lineTo(x3, y3);\n                        }\n                        else {\n                            path.bezierCurveTo(x1, y1, x2, y2, x3, y3);\n                        }\n                        x0 = x3;\n                        y0 = y3;\n                    }\n                }\n            } });\n    }\n    function morphPath(fromPath, toPath, animationOpts) {\n        if (!fromPath || !toPath) {\n            return toPath;\n        }\n        var oldDone = animationOpts.done;\n        var oldDuring = animationOpts.during;\n        prepareMorphPath(fromPath, toPath);\n        toPath.__morphT = 0;\n        function restoreToPath() {\n            restoreMethod(toPath, 'buildPath');\n            restoreMethod(toPath, 'updateTransform');\n            toPath.__morphT = -1;\n            toPath.createPathProxy();\n            toPath.dirtyShape();\n        }\n        toPath.animateTo({\n            __morphT: 1\n        }, defaults({\n            during: function (p) {\n                toPath.dirtyShape();\n                oldDuring && oldDuring(p);\n            },\n            done: function () {\n                restoreToPath();\n                oldDone && oldDone();\n            }\n        }, animationOpts));\n        return toPath;\n    }\n    function hilbert(x, y, minX, minY, maxX, maxY) {\n        var bits = 16;\n        x = (maxX === minX) ? 0 : Math.round(32767 * (x - minX) / (maxX - minX));\n        y = (maxY === minY) ? 0 : Math.round(32767 * (y - minY) / (maxY - minY));\n        var d = 0;\n        var tmp;\n        for (var s = (1 << bits) / 2; s > 0; s /= 2) {\n            var rx = 0;\n            var ry = 0;\n            if ((x & s) > 0) {\n                rx = 1;\n            }\n            if ((y & s) > 0) {\n                ry = 1;\n            }\n            d += s * s * ((3 * rx) ^ ry);\n            if (ry === 0) {\n                if (rx === 1) {\n                    x = s - 1 - x;\n                    y = s - 1 - y;\n                }\n                tmp = x;\n                x = y;\n                y = tmp;\n            }\n        }\n        return d;\n    }\n    function sortPaths(pathList) {\n        var xMin = Infinity;\n        var yMin = Infinity;\n        var xMax = -Infinity;\n        var yMax = -Infinity;\n        var cps = map(pathList, function (path) {\n            var rect = path.getBoundingRect();\n            var m = path.getComputedTransform();\n            var x = rect.x + rect.width / 2 + (m ? m[4] : 0);\n            var y = rect.y + rect.height / 2 + (m ? m[5] : 0);\n            xMin = Math.min(x, xMin);\n            yMin = Math.min(y, yMin);\n            xMax = Math.max(x, xMax);\n            yMax = Math.max(y, yMax);\n            return [x, y];\n        });\n        var items = map(cps, function (cp, idx) {\n            return {\n                cp: cp,\n                z: hilbert(cp[0], cp[1], xMin, yMin, xMax, yMax),\n                path: pathList[idx]\n            };\n        });\n        return items.sort(function (a, b) { return a.z - b.z; }).map(function (item) { return item.path; });\n    }\n    function defaultDividePath(param) {\n        return split(param.path, param.count);\n    }\n    function createEmptyReturn() {\n        return {\n            fromIndividuals: [],\n            toIndividuals: [],\n            count: 0\n        };\n    }\n    function combineMorph(fromList, toPath, animationOpts) {\n        var fromPathList = [];\n        function addFromPath(fromList) {\n            for (var i = 0; i < fromList.length; i++) {\n                var from = fromList[i];\n                if (isCombineMorphing(from)) {\n                    addFromPath(from.childrenRef());\n                }\n                else if (from instanceof Path) {\n                    fromPathList.push(from);\n                }\n            }\n        }\n        addFromPath(fromList);\n        var separateCount = fromPathList.length;\n        if (!separateCount) {\n            return createEmptyReturn();\n        }\n        var dividePath = animationOpts.dividePath || defaultDividePath;\n        var toSubPathList = dividePath({\n            path: toPath, count: separateCount\n        });\n        if (toSubPathList.length !== separateCount) {\n            console.error('Invalid morphing: unmatched splitted path');\n            return createEmptyReturn();\n        }\n        fromPathList = sortPaths(fromPathList);\n        toSubPathList = sortPaths(toSubPathList);\n        var oldDone = animationOpts.done;\n        var oldDuring = animationOpts.during;\n        var individualDelay = animationOpts.individualDelay;\n        var identityTransform = new Transformable();\n        for (var i = 0; i < separateCount; i++) {\n            var from = fromPathList[i];\n            var to = toSubPathList[i];\n            to.parent = toPath;\n            to.copyTransform(identityTransform);\n            if (!individualDelay) {\n                prepareMorphPath(from, to);\n            }\n        }\n        toPath.__isCombineMorphing = true;\n        toPath.childrenRef = function () {\n            return toSubPathList;\n        };\n        function addToSubPathListToZr(zr) {\n            for (var i = 0; i < toSubPathList.length; i++) {\n                toSubPathList[i].addSelfToZr(zr);\n            }\n        }\n        saveAndModifyMethod(toPath, 'addSelfToZr', {\n            after: function (zr) {\n                addToSubPathListToZr(zr);\n            }\n        });\n        saveAndModifyMethod(toPath, 'removeSelfFromZr', {\n            after: function (zr) {\n                for (var i = 0; i < toSubPathList.length; i++) {\n                    toSubPathList[i].removeSelfFromZr(zr);\n                }\n            }\n        });\n        function restoreToPath() {\n            toPath.__isCombineMorphing = false;\n            toPath.__morphT = -1;\n            toPath.childrenRef = null;\n            restoreMethod(toPath, 'addSelfToZr');\n            restoreMethod(toPath, 'removeSelfFromZr');\n        }\n        var toLen = toSubPathList.length;\n        if (individualDelay) {\n            var animating_1 = toLen;\n            var eachDone = function () {\n                animating_1--;\n                if (animating_1 === 0) {\n                    restoreToPath();\n                    oldDone && oldDone();\n                }\n            };\n            for (var i = 0; i < toLen; i++) {\n                var indivdualAnimationOpts = individualDelay ? defaults({\n                    delay: (animationOpts.delay || 0) + individualDelay(i, toLen, fromPathList[i], toSubPathList[i]),\n                    done: eachDone\n                }, animationOpts) : animationOpts;\n                morphPath(fromPathList[i], toSubPathList[i], indivdualAnimationOpts);\n            }\n        }\n        else {\n            toPath.__morphT = 0;\n            toPath.animateTo({\n                __morphT: 1\n            }, defaults({\n                during: function (p) {\n                    for (var i = 0; i < toLen; i++) {\n                        var child = toSubPathList[i];\n                        child.__morphT = toPath.__morphT;\n                        child.dirtyShape();\n                    }\n                    oldDuring && oldDuring(p);\n                },\n                done: function () {\n                    restoreToPath();\n                    for (var i = 0; i < fromList.length; i++) {\n                        restoreMethod(fromList[i], 'updateTransform');\n                    }\n                    oldDone && oldDone();\n                }\n            }, animationOpts));\n        }\n        if (toPath.__zr) {\n            addToSubPathListToZr(toPath.__zr);\n        }\n        return {\n            fromIndividuals: fromPathList,\n            toIndividuals: toSubPathList,\n            count: toLen\n        };\n    }\n    function separateMorph(fromPath, toPathList, animationOpts) {\n        var toLen = toPathList.length;\n        var fromPathList = [];\n        var dividePath = animationOpts.dividePath || defaultDividePath;\n        function addFromPath(fromList) {\n            for (var i = 0; i < fromList.length; i++) {\n                var from = fromList[i];\n                if (isCombineMorphing(from)) {\n                    addFromPath(from.childrenRef());\n                }\n                else if (from instanceof Path) {\n                    fromPathList.push(from);\n                }\n            }\n        }\n        if (isCombineMorphing(fromPath)) {\n            addFromPath(fromPath.childrenRef());\n            var fromLen = fromPathList.length;\n            if (fromLen < toLen) {\n                var k = 0;\n                for (var i = fromLen; i < toLen; i++) {\n                    fromPathList.push(clonePath(fromPathList[k++ % fromLen]));\n                }\n            }\n            fromPathList.length = toLen;\n        }\n        else {\n            fromPathList = dividePath({ path: fromPath, count: toLen });\n            var fromPathTransform = fromPath.getComputedTransform();\n            for (var i = 0; i < fromPathList.length; i++) {\n                fromPathList[i].setLocalTransform(fromPathTransform);\n            }\n            if (fromPathList.length !== toLen) {\n                console.error('Invalid morphing: unmatched splitted path');\n                return createEmptyReturn();\n            }\n        }\n        fromPathList = sortPaths(fromPathList);\n        toPathList = sortPaths(toPathList);\n        var individualDelay = animationOpts.individualDelay;\n        for (var i = 0; i < toLen; i++) {\n            var indivdualAnimationOpts = individualDelay ? defaults({\n                delay: (animationOpts.delay || 0) + individualDelay(i, toLen, fromPathList[i], toPathList[i])\n            }, animationOpts) : animationOpts;\n            morphPath(fromPathList[i], toPathList[i], indivdualAnimationOpts);\n        }\n        return {\n            fromIndividuals: fromPathList,\n            toIndividuals: toPathList,\n            count: toPathList.length\n        };\n    }\n\n    function isMultiple(elements) {\n      return isArray(elements[0]);\n    }\n    function prepareMorphBatches(one, many) {\n      var batches = [];\n      var batchCount = one.length;\n      for (var i = 0; i < batchCount; i++) {\n        batches.push({\n          one: one[i],\n          many: []\n        });\n      }\n      for (var i = 0; i < many.length; i++) {\n        var len = many[i].length;\n        var k = void 0;\n        for (k = 0; k < len; k++) {\n          batches[k % batchCount].many.push(many[i][k]);\n        }\n      }\n      var off = 0;\n      // If one has more paths than each one of many. average them.\n      for (var i = batchCount - 1; i >= 0; i--) {\n        if (!batches[i].many.length) {\n          var moveFrom = batches[off].many;\n          if (moveFrom.length <= 1) {\n            // Not enough\n            // Start from the first one.\n            if (off) {\n              off = 0;\n            } else {\n              return batches;\n            }\n          }\n          var len = moveFrom.length;\n          var mid = Math.ceil(len / 2);\n          batches[i].many = moveFrom.slice(mid, len);\n          batches[off].many = moveFrom.slice(0, mid);\n          off++;\n        }\n      }\n      return batches;\n    }\n    var pathDividers = {\n      clone: function (params) {\n        var ret = [];\n        // Fitting the alpha\n        var approxOpacity = 1 - Math.pow(1 - params.path.style.opacity, 1 / params.count);\n        for (var i = 0; i < params.count; i++) {\n          var cloned = clonePath(params.path);\n          cloned.setStyle('opacity', approxOpacity);\n          ret.push(cloned);\n        }\n        return ret;\n      },\n      // Use the default divider\n      split: null\n    };\n    function applyMorphAnimation(from, to, divideShape, seriesModel, dataIndex, animateOtherProps) {\n      if (!from.length || !to.length) {\n        return;\n      }\n      var updateAnimationCfg = getAnimationConfig('update', seriesModel, dataIndex);\n      if (!(updateAnimationCfg && updateAnimationCfg.duration > 0)) {\n        return;\n      }\n      var animationDelay = seriesModel.getModel('universalTransition').get('delay');\n      var animationCfg = Object.assign({\n        // Need to setToFinal so the further calculation based on the style can be correct.\n        // Like emphasis color.\n        setToFinal: true\n      }, updateAnimationCfg);\n      var many;\n      var one;\n      if (isMultiple(from)) {\n        // manyToOne\n        many = from;\n        one = to;\n      }\n      if (isMultiple(to)) {\n        // oneToMany\n        many = to;\n        one = from;\n      }\n      function morphOneBatch(batch, fromIsMany, animateIndex, animateCount, forceManyOne) {\n        var batchMany = batch.many;\n        var batchOne = batch.one;\n        if (batchMany.length === 1 && !forceManyOne) {\n          // Is one to one\n          var batchFrom = fromIsMany ? batchMany[0] : batchOne;\n          var batchTo = fromIsMany ? batchOne : batchMany[0];\n          if (isCombineMorphing(batchFrom)) {\n            // Keep doing combine animation.\n            morphOneBatch({\n              many: [batchFrom],\n              one: batchTo\n            }, true, animateIndex, animateCount, true);\n          } else {\n            var individualAnimationCfg = animationDelay ? defaults({\n              delay: animationDelay(animateIndex, animateCount)\n            }, animationCfg) : animationCfg;\n            morphPath(batchFrom, batchTo, individualAnimationCfg);\n            animateOtherProps(batchFrom, batchTo, batchFrom, batchTo, individualAnimationCfg);\n          }\n        } else {\n          var separateAnimationCfg = defaults({\n            dividePath: pathDividers[divideShape],\n            individualDelay: animationDelay && function (idx, count, fromPath, toPath) {\n              return animationDelay(idx + animateIndex, animateCount);\n            }\n          }, animationCfg);\n          var _a = fromIsMany ? combineMorph(batchMany, batchOne, separateAnimationCfg) : separateMorph(batchOne, batchMany, separateAnimationCfg),\n            fromIndividuals = _a.fromIndividuals,\n            toIndividuals = _a.toIndividuals;\n          var count = fromIndividuals.length;\n          for (var k = 0; k < count; k++) {\n            var individualAnimationCfg = animationDelay ? defaults({\n              delay: animationDelay(k, count)\n            }, animationCfg) : animationCfg;\n            animateOtherProps(fromIndividuals[k], toIndividuals[k], fromIsMany ? batchMany[k] : batch.one, fromIsMany ? batch.one : batchMany[k], individualAnimationCfg);\n          }\n        }\n      }\n      var fromIsMany = many ? many === from\n      // Is one to one. If the path number not match. also needs do merge and separate morphing.\n      : from.length > to.length;\n      var morphBatches = many ? prepareMorphBatches(one, many) : prepareMorphBatches(fromIsMany ? to : from, [fromIsMany ? from : to]);\n      var animateCount = 0;\n      for (var i = 0; i < morphBatches.length; i++) {\n        animateCount += morphBatches[i].many.length;\n      }\n      var animateIndex = 0;\n      for (var i = 0; i < morphBatches.length; i++) {\n        morphOneBatch(morphBatches[i], fromIsMany, animateIndex, animateCount);\n        animateIndex += morphBatches[i].many.length;\n      }\n    }\n    function getPathList(elements) {\n      if (!elements) {\n        return [];\n      }\n      if (isArray(elements)) {\n        var pathList_1 = [];\n        for (var i = 0; i < elements.length; i++) {\n          pathList_1.push(getPathList(elements[i]));\n        }\n        return pathList_1;\n      }\n      var pathList = [];\n      elements.traverse(function (el) {\n        if (el instanceof Path && !el.disableMorphing && !el.invisible && !el.ignore) {\n          pathList.push(el);\n        }\n      });\n      return pathList;\n    }\n\n    var DATA_COUNT_THRESHOLD = 1e4;\n    var TRANSITION_NONE = 0;\n    var TRANSITION_P2C = 1;\n    var TRANSITION_C2P = 2;\n    var getUniversalTransitionGlobalStore = makeInner();\n    function getDimension(data, visualDimension) {\n      var dimensions = data.dimensions;\n      for (var i = 0; i < dimensions.length; i++) {\n        var dimInfo = data.getDimensionInfo(dimensions[i]);\n        if (dimInfo && dimInfo.otherDims[visualDimension] === 0) {\n          return dimensions[i];\n        }\n      }\n    }\n    // get value by dimension. (only get value of itemGroupId or childGroupId, so convert it to string)\n    function getValueByDimension(data, dataIndex, dimension) {\n      var dimInfo = data.getDimensionInfo(dimension);\n      var dimOrdinalMeta = dimInfo && dimInfo.ordinalMeta;\n      if (dimInfo) {\n        var value = data.get(dimInfo.name, dataIndex);\n        if (dimOrdinalMeta) {\n          return dimOrdinalMeta.categories[value] || value + '';\n        }\n        return value + '';\n      }\n    }\n    function getGroupId(data, dataIndex, dataGroupId, isChild) {\n      // try to get groupId from encode\n      var visualDimension = isChild ? 'itemChildGroupId' : 'itemGroupId';\n      var groupIdDim = getDimension(data, visualDimension);\n      if (groupIdDim) {\n        var groupId = getValueByDimension(data, dataIndex, groupIdDim);\n        return groupId;\n      }\n      // try to get groupId from raw data item\n      var rawDataItem = data.getRawDataItem(dataIndex);\n      var property = isChild ? 'childGroupId' : 'groupId';\n      if (rawDataItem && rawDataItem[property]) {\n        return rawDataItem[property] + '';\n      }\n      // fallback\n      if (isChild) {\n        return;\n      }\n      // try to use series.dataGroupId as groupId, otherwise use dataItem's id as groupId\n      return dataGroupId || data.getId(dataIndex);\n    }\n    // flatten all data items from different serieses into one arrary\n    function flattenDataDiffItems(list) {\n      var items = [];\n      each(list, function (seriesInfo) {\n        var data = seriesInfo.data;\n        var dataGroupId = seriesInfo.dataGroupId;\n        if (data.count() > DATA_COUNT_THRESHOLD) {\n          if (\"development\" !== 'production') {\n            warn('Universal transition is disabled on large data > 10k.');\n          }\n          return;\n        }\n        var indices = data.getIndices();\n        for (var dataIndex = 0; dataIndex < indices.length; dataIndex++) {\n          items.push({\n            data: data,\n            groupId: getGroupId(data, dataIndex, dataGroupId, false),\n            childGroupId: getGroupId(data, dataIndex, dataGroupId, true),\n            divide: seriesInfo.divide,\n            dataIndex: dataIndex\n          });\n        }\n      });\n      return items;\n    }\n    function fadeInElement(newEl, newSeries, newIndex) {\n      newEl.traverse(function (el) {\n        if (el instanceof Path) {\n          // TODO use fade in animation for target element.\n          initProps(el, {\n            style: {\n              opacity: 0\n            }\n          }, newSeries, {\n            dataIndex: newIndex,\n            isFrom: true\n          });\n        }\n      });\n    }\n    function removeEl$1(el) {\n      if (el.parent) {\n        // Bake parent transform to element.\n        // So it can still have proper transform to transition after it's removed.\n        var computedTransform = el.getComputedTransform();\n        el.setLocalTransform(computedTransform);\n        el.parent.remove(el);\n      }\n    }\n    function stopAnimation(el) {\n      el.stopAnimation();\n      if (el.isGroup) {\n        el.traverse(function (child) {\n          child.stopAnimation();\n        });\n      }\n    }\n    function animateElementStyles(el, dataIndex, seriesModel) {\n      var animationConfig = getAnimationConfig('update', seriesModel, dataIndex);\n      animationConfig && el.traverse(function (child) {\n        if (child instanceof Displayable) {\n          var oldStyle = getOldStyle(child);\n          if (oldStyle) {\n            child.animateFrom({\n              style: oldStyle\n            }, animationConfig);\n          }\n        }\n      });\n    }\n    function isAllIdSame(oldDiffItems, newDiffItems) {\n      var len = oldDiffItems.length;\n      if (len !== newDiffItems.length) {\n        return false;\n      }\n      for (var i = 0; i < len; i++) {\n        var oldItem = oldDiffItems[i];\n        var newItem = newDiffItems[i];\n        if (oldItem.data.getId(oldItem.dataIndex) !== newItem.data.getId(newItem.dataIndex)) {\n          return false;\n        }\n      }\n      return true;\n    }\n    function transitionBetween(oldList, newList, api) {\n      var oldDiffItems = flattenDataDiffItems(oldList);\n      var newDiffItems = flattenDataDiffItems(newList);\n      function updateMorphingPathProps(from, to, rawFrom, rawTo, animationCfg) {\n        if (rawFrom || from) {\n          to.animateFrom({\n            style: rawFrom && rawFrom !== from\n            // dividingMethod like clone may override the style(opacity)\n            // So extend it to raw style.\n            ? extend(extend({}, rawFrom.style), from.style) : from.style\n          }, animationCfg);\n        }\n      }\n      var hasMorphAnimation = false;\n      /**\r\n       * With groupId and childGroupId, we can build parent-child relationships between dataItems.\r\n       * However, we should mind the parent-child \"direction\" between old and new options.\r\n       *\r\n       * For example, suppose we have two dataItems from two series.data:\r\n       *\r\n       * dataA: [                          dataB: [\r\n       *   {                                 {\r\n       *     value: 5,                         value: 3,\r\n       *     groupId: 'creatures',             groupId: 'animals',\r\n       *     childGroupId: 'animals'           childGroupId: 'dogs'\r\n       *   },                                },\r\n       *   ...                               ...\r\n       * ]                                 ]\r\n       *\r\n       * where dataA is belong to optionA and dataB is belong to optionB.\r\n       *\r\n       * When we `setOption(optionB)` from optionA, we choose childGroupId of dataItemA and groupId of\r\n       * dataItemB as keys so the two keys are matched (both are 'animals'), then universalTransition\r\n       * will work. This derection is \"parent -> child\".\r\n       *\r\n       * If we `setOption(optionA)` from optionB, we also choose groupId of dataItemB and childGroupId\r\n       * of dataItemA as keys and universalTransition will work. This derection is \"child -> parent\".\r\n       *\r\n       * If there is no childGroupId specified, which means no multiLevelDrillDown/Up is needed and no\r\n       * parent-child relationship exists. This direction is \"none\".\r\n       *\r\n       * So we need to know whether to use groupId or childGroupId as the key when we call the keyGetter\r\n       * functions. Thus, we need to decide the direction first.\r\n       *\r\n       * The rule is:\r\n       *\r\n       * if (all childGroupIds in oldDiffItems and all groupIds in newDiffItems have common value) {\r\n       *   direction = 'parent -> child';\r\n       * } else if (all groupIds in oldDiffItems and all childGroupIds in newDiffItems have common value) {\r\n       *   direction = 'child -> parent';\r\n       * } else {\r\n       *   direction = 'none';\r\n       * }\r\n       */\n      var direction = TRANSITION_NONE;\n      // find all groupIds and childGroupIds from oldDiffItems\n      var oldGroupIds = createHashMap();\n      var oldChildGroupIds = createHashMap();\n      oldDiffItems.forEach(function (item) {\n        item.groupId && oldGroupIds.set(item.groupId, true);\n        item.childGroupId && oldChildGroupIds.set(item.childGroupId, true);\n      });\n      // traverse newDiffItems and decide the direction according to the rule\n      for (var i = 0; i < newDiffItems.length; i++) {\n        var newGroupId = newDiffItems[i].groupId;\n        if (oldChildGroupIds.get(newGroupId)) {\n          direction = TRANSITION_P2C;\n          break;\n        }\n        var newChildGroupId = newDiffItems[i].childGroupId;\n        if (newChildGroupId && oldGroupIds.get(newChildGroupId)) {\n          direction = TRANSITION_C2P;\n          break;\n        }\n      }\n      function createKeyGetter(isOld, onlyGetId) {\n        return function (diffItem) {\n          var data = diffItem.data;\n          var dataIndex = diffItem.dataIndex;\n          // TODO if specified dim\n          if (onlyGetId) {\n            return data.getId(dataIndex);\n          }\n          if (isOld) {\n            return direction === TRANSITION_P2C ? diffItem.childGroupId : diffItem.groupId;\n          } else {\n            return direction === TRANSITION_C2P ? diffItem.childGroupId : diffItem.groupId;\n          }\n        };\n      }\n      // Use id if it's very likely to be an one to one animation\n      // It's more robust than groupId\n      // TODO Check if key dimension is specified.\n      var useId = isAllIdSame(oldDiffItems, newDiffItems);\n      var isElementStillInChart = {};\n      if (!useId) {\n        // We may have different diff strategy with basicTransition if we use other dimension as key.\n        // If so, we can't simply check if oldEl is same with newEl. We need a map to check if oldEl is still being used in the new chart.\n        // We can't use the elements that already being morphed. Let it keep it's original basic transition.\n        for (var i = 0; i < newDiffItems.length; i++) {\n          var newItem = newDiffItems[i];\n          var el = newItem.data.getItemGraphicEl(newItem.dataIndex);\n          if (el) {\n            isElementStillInChart[el.id] = true;\n          }\n        }\n      }\n      function updateOneToOne(newIndex, oldIndex) {\n        var oldItem = oldDiffItems[oldIndex];\n        var newItem = newDiffItems[newIndex];\n        var newSeries = newItem.data.hostModel;\n        // TODO Mark this elements is morphed and don't morph them anymore\n        var oldEl = oldItem.data.getItemGraphicEl(oldItem.dataIndex);\n        var newEl = newItem.data.getItemGraphicEl(newItem.dataIndex);\n        // Can't handle same elements.\n        if (oldEl === newEl) {\n          newEl && animateElementStyles(newEl, newItem.dataIndex, newSeries);\n          return;\n        }\n        if (\n        // We can't use the elements that already being morphed\n        oldEl && isElementStillInChart[oldEl.id]) {\n          return;\n        }\n        if (newEl) {\n          // TODO: If keep animating the group in case\n          // some of the elements don't want to be morphed.\n          // TODO Label?\n          stopAnimation(newEl);\n          if (oldEl) {\n            stopAnimation(oldEl);\n            // If old element is doing leaving animation. stop it and remove it immediately.\n            removeEl$1(oldEl);\n            hasMorphAnimation = true;\n            applyMorphAnimation(getPathList(oldEl), getPathList(newEl), newItem.divide, newSeries, newIndex, updateMorphingPathProps);\n          } else {\n            fadeInElement(newEl, newSeries, newIndex);\n          }\n        }\n        // else keep oldEl leaving animation.\n      }\n      new DataDiffer(oldDiffItems, newDiffItems, createKeyGetter(true, useId), createKeyGetter(false, useId), null, 'multiple').update(updateOneToOne).updateManyToOne(function (newIndex, oldIndices) {\n        var newItem = newDiffItems[newIndex];\n        var newData = newItem.data;\n        var newSeries = newData.hostModel;\n        var newEl = newData.getItemGraphicEl(newItem.dataIndex);\n        var oldElsList = filter(map(oldIndices, function (idx) {\n          return oldDiffItems[idx].data.getItemGraphicEl(oldDiffItems[idx].dataIndex);\n        }), function (oldEl) {\n          return oldEl && oldEl !== newEl && !isElementStillInChart[oldEl.id];\n        });\n        if (newEl) {\n          stopAnimation(newEl);\n          if (oldElsList.length) {\n            // If old element is doing leaving animation. stop it and remove it immediately.\n            each(oldElsList, function (oldEl) {\n              stopAnimation(oldEl);\n              removeEl$1(oldEl);\n            });\n            hasMorphAnimation = true;\n            applyMorphAnimation(getPathList(oldElsList), getPathList(newEl), newItem.divide, newSeries, newIndex, updateMorphingPathProps);\n          } else {\n            fadeInElement(newEl, newSeries, newItem.dataIndex);\n          }\n        }\n        // else keep oldEl leaving animation.\n      }).updateOneToMany(function (newIndices, oldIndex) {\n        var oldItem = oldDiffItems[oldIndex];\n        var oldEl = oldItem.data.getItemGraphicEl(oldItem.dataIndex);\n        // We can't use the elements that already being morphed\n        if (oldEl && isElementStillInChart[oldEl.id]) {\n          return;\n        }\n        var newElsList = filter(map(newIndices, function (idx) {\n          return newDiffItems[idx].data.getItemGraphicEl(newDiffItems[idx].dataIndex);\n        }), function (el) {\n          return el && el !== oldEl;\n        });\n        var newSeris = newDiffItems[newIndices[0]].data.hostModel;\n        if (newElsList.length) {\n          each(newElsList, function (newEl) {\n            return stopAnimation(newEl);\n          });\n          if (oldEl) {\n            stopAnimation(oldEl);\n            // If old element is doing leaving animation. stop it and remove it immediately.\n            removeEl$1(oldEl);\n            hasMorphAnimation = true;\n            applyMorphAnimation(getPathList(oldEl), getPathList(newElsList), oldItem.divide,\n            // Use divide on old.\n            newSeris, newIndices[0], updateMorphingPathProps);\n          } else {\n            each(newElsList, function (newEl) {\n              return fadeInElement(newEl, newSeris, newIndices[0]);\n            });\n          }\n        }\n        // else keep oldEl leaving animation.\n      }).updateManyToMany(function (newIndices, oldIndices) {\n        // If two data are same and both have groupId.\n        // Normally they should be diff by id.\n        new DataDiffer(oldIndices, newIndices, function (rawIdx) {\n          return oldDiffItems[rawIdx].data.getId(oldDiffItems[rawIdx].dataIndex);\n        }, function (rawIdx) {\n          return newDiffItems[rawIdx].data.getId(newDiffItems[rawIdx].dataIndex);\n        }).update(function (newIndex, oldIndex) {\n          // Use the original index\n          updateOneToOne(newIndices[newIndex], oldIndices[oldIndex]);\n        }).execute();\n      }).execute();\n      if (hasMorphAnimation) {\n        each(newList, function (_a) {\n          var data = _a.data;\n          var seriesModel = data.hostModel;\n          var view = seriesModel && api.getViewOfSeriesModel(seriesModel);\n          var animationCfg = getAnimationConfig('update', seriesModel, 0); // use 0 index.\n          if (view && seriesModel.isAnimationEnabled() && animationCfg && animationCfg.duration > 0) {\n            view.group.traverse(function (el) {\n              if (el instanceof Path && !el.animators.length) {\n                // We can't accept there still exists element that has no animation\n                // if universalTransition is enabled\n                el.animateFrom({\n                  style: {\n                    opacity: 0\n                  }\n                }, animationCfg);\n              }\n            });\n          }\n        });\n      }\n    }\n    function getSeriesTransitionKey(series) {\n      var seriesKey = series.getModel('universalTransition').get('seriesKey');\n      if (!seriesKey) {\n        // Use series id by default.\n        return series.id;\n      }\n      return seriesKey;\n    }\n    function convertArraySeriesKeyToString(seriesKey) {\n      if (isArray(seriesKey)) {\n        // Order independent.\n        return seriesKey.sort().join(',');\n      }\n      return seriesKey;\n    }\n    function getDivideShapeFromData(data) {\n      if (data.hostModel) {\n        return data.hostModel.getModel('universalTransition').get('divideShape');\n      }\n    }\n    function findTransitionSeriesBatches(globalStore, params) {\n      var updateBatches = createHashMap();\n      var oldDataMap = createHashMap();\n      // Map that only store key in array seriesKey.\n      // Which is used to query the old data when transition from one to multiple series.\n      var oldDataMapForSplit = createHashMap();\n      each(globalStore.oldSeries, function (series, idx) {\n        var oldDataGroupId = globalStore.oldDataGroupIds[idx];\n        var oldData = globalStore.oldData[idx];\n        var transitionKey = getSeriesTransitionKey(series);\n        var transitionKeyStr = convertArraySeriesKeyToString(transitionKey);\n        oldDataMap.set(transitionKeyStr, {\n          dataGroupId: oldDataGroupId,\n          data: oldData\n        });\n        if (isArray(transitionKey)) {\n          // Same key can't in different array seriesKey.\n          each(transitionKey, function (key) {\n            oldDataMapForSplit.set(key, {\n              key: transitionKeyStr,\n              dataGroupId: oldDataGroupId,\n              data: oldData\n            });\n          });\n        }\n      });\n      function checkTransitionSeriesKeyDuplicated(transitionKeyStr) {\n        if (updateBatches.get(transitionKeyStr)) {\n          warn(\"Duplicated seriesKey in universalTransition \" + transitionKeyStr);\n        }\n      }\n      each(params.updatedSeries, function (series) {\n        if (series.isUniversalTransitionEnabled() && series.isAnimationEnabled()) {\n          var newDataGroupId = series.get('dataGroupId');\n          var newData = series.getData();\n          var transitionKey = getSeriesTransitionKey(series);\n          var transitionKeyStr = convertArraySeriesKeyToString(transitionKey);\n          // Only transition between series with same id.\n          var oldData = oldDataMap.get(transitionKeyStr);\n          // string transition key is the best match.\n          if (oldData) {\n            if (\"development\" !== 'production') {\n              checkTransitionSeriesKeyDuplicated(transitionKeyStr);\n            }\n            // TODO check if data is same?\n            updateBatches.set(transitionKeyStr, {\n              oldSeries: [{\n                dataGroupId: oldData.dataGroupId,\n                divide: getDivideShapeFromData(oldData.data),\n                data: oldData.data\n              }],\n              newSeries: [{\n                dataGroupId: newDataGroupId,\n                divide: getDivideShapeFromData(newData),\n                data: newData\n              }]\n            });\n          } else {\n            // Transition from multiple series.\n            // e.g. 'female', 'male' -> ['female', 'male']\n            if (isArray(transitionKey)) {\n              if (\"development\" !== 'production') {\n                checkTransitionSeriesKeyDuplicated(transitionKeyStr);\n              }\n              var oldSeries_1 = [];\n              each(transitionKey, function (key) {\n                var oldData = oldDataMap.get(key);\n                if (oldData.data) {\n                  oldSeries_1.push({\n                    dataGroupId: oldData.dataGroupId,\n                    divide: getDivideShapeFromData(oldData.data),\n                    data: oldData.data\n                  });\n                }\n              });\n              if (oldSeries_1.length) {\n                updateBatches.set(transitionKeyStr, {\n                  oldSeries: oldSeries_1,\n                  newSeries: [{\n                    dataGroupId: newDataGroupId,\n                    data: newData,\n                    divide: getDivideShapeFromData(newData)\n                  }]\n                });\n              }\n            } else {\n              // Try transition to multiple series.\n              // e.g. ['female', 'male'] -> 'female', 'male'\n              var oldData_1 = oldDataMapForSplit.get(transitionKey);\n              if (oldData_1) {\n                var batch = updateBatches.get(oldData_1.key);\n                if (!batch) {\n                  batch = {\n                    oldSeries: [{\n                      dataGroupId: oldData_1.dataGroupId,\n                      data: oldData_1.data,\n                      divide: getDivideShapeFromData(oldData_1.data)\n                    }],\n                    newSeries: []\n                  };\n                  updateBatches.set(oldData_1.key, batch);\n                }\n                batch.newSeries.push({\n                  dataGroupId: newDataGroupId,\n                  data: newData,\n                  divide: getDivideShapeFromData(newData)\n                });\n              }\n            }\n          }\n        }\n      });\n      return updateBatches;\n    }\n    function querySeries(series, finder) {\n      for (var i = 0; i < series.length; i++) {\n        var found = finder.seriesIndex != null && finder.seriesIndex === series[i].seriesIndex || finder.seriesId != null && finder.seriesId === series[i].id;\n        if (found) {\n          return i;\n        }\n      }\n    }\n    function transitionSeriesFromOpt(transitionOpt, globalStore, params, api) {\n      var from = [];\n      var to = [];\n      each(normalizeToArray(transitionOpt.from), function (finder) {\n        var idx = querySeries(globalStore.oldSeries, finder);\n        if (idx >= 0) {\n          from.push({\n            dataGroupId: globalStore.oldDataGroupIds[idx],\n            data: globalStore.oldData[idx],\n            // TODO can specify divideShape in transition.\n            divide: getDivideShapeFromData(globalStore.oldData[idx]),\n            groupIdDim: finder.dimension\n          });\n        }\n      });\n      each(normalizeToArray(transitionOpt.to), function (finder) {\n        var idx = querySeries(params.updatedSeries, finder);\n        if (idx >= 0) {\n          var data = params.updatedSeries[idx].getData();\n          to.push({\n            dataGroupId: globalStore.oldDataGroupIds[idx],\n            data: data,\n            divide: getDivideShapeFromData(data),\n            groupIdDim: finder.dimension\n          });\n        }\n      });\n      if (from.length > 0 && to.length > 0) {\n        transitionBetween(from, to, api);\n      }\n    }\n    function installUniversalTransition(registers) {\n      registers.registerUpdateLifecycle('series:beforeupdate', function (ecMOdel, api, params) {\n        each(normalizeToArray(params.seriesTransition), function (transOpt) {\n          each(normalizeToArray(transOpt.to), function (finder) {\n            var series = params.updatedSeries;\n            for (var i = 0; i < series.length; i++) {\n              if (finder.seriesIndex != null && finder.seriesIndex === series[i].seriesIndex || finder.seriesId != null && finder.seriesId === series[i].id) {\n                series[i][SERIES_UNIVERSAL_TRANSITION_PROP] = true;\n              }\n            }\n          });\n        });\n      });\n      registers.registerUpdateLifecycle('series:transition', function (ecModel, api, params) {\n        // TODO api provide an namespace that can save stuff per instance\n        var globalStore = getUniversalTransitionGlobalStore(api);\n        // TODO multiple to multiple series.\n        if (globalStore.oldSeries && params.updatedSeries && params.optionChanged) {\n          // TODO transitionOpt was used in an old implementation and can be removed now\n          // Use give transition config if its' give;\n          var transitionOpt = params.seriesTransition;\n          if (transitionOpt) {\n            each(normalizeToArray(transitionOpt), function (opt) {\n              transitionSeriesFromOpt(opt, globalStore, params, api);\n            });\n          } else {\n            // Else guess from series based on transition series key.\n            var updateBatches_1 = findTransitionSeriesBatches(globalStore, params);\n            each(updateBatches_1.keys(), function (key) {\n              var batch = updateBatches_1.get(key);\n              transitionBetween(batch.oldSeries, batch.newSeries, api);\n            });\n          }\n          // Reset\n          each(params.updatedSeries, function (series) {\n            // Reset;\n            if (series[SERIES_UNIVERSAL_TRANSITION_PROP]) {\n              series[SERIES_UNIVERSAL_TRANSITION_PROP] = false;\n            }\n          });\n        }\n        // Save all series of current update. Not only the updated one.\n        var allSeries = ecModel.getSeries();\n        var savedSeries = globalStore.oldSeries = [];\n        var savedDataGroupIds = globalStore.oldDataGroupIds = [];\n        var savedData = globalStore.oldData = [];\n        for (var i = 0; i < allSeries.length; i++) {\n          var data = allSeries[i].getData();\n          // Only save the data that can have transition.\n          // Avoid large data costing too much extra memory\n          if (data.count() < DATA_COUNT_THRESHOLD) {\n            savedSeries.push(allSeries[i]);\n            savedDataGroupIds.push(allSeries[i].get('dataGroupId'));\n            savedData.push(data);\n          }\n        }\n      });\n    }\n\n    // -----------------\n    // Render engines\n    // -----------------\n    // Render via Canvas.\n    // echarts.init(dom, null, { renderer: 'canvas' })\n    use([install$1]);\n    // Render via SVG.\n    // echarts.init(dom, null, { renderer: 'svg' })\n    use([install]);\n    // ----------------\n    // Charts (series)\n    // ----------------\n    // All of the series types, for example:\n    // chart.setOption({\n    //     series: [{\n    //         type: 'line' // or 'bar', 'pie', ...\n    //     }]\n    // });\n    use([install$2, install$3, install$4, install$6, install$8, install$a, install$b, install$c, install$d, install$e, install$f, install$h, install$i, install$j, install$k, install$l, install$m, install$n, install$o, install$p, install$q, install$r]);\n    // -------------------\n    // Coordinate systems\n    // -------------------\n    // All of the axis modules have been included in the\n    // coordinate system module below, do not need to\n    // make extra import.\n    // `cartesian` coordinate system. For some historical\n    // reasons, it is named as grid, for example:\n    // chart.setOption({\n    //     grid: {...},\n    //     xAxis: {...},\n    //     yAxis: {...},\n    //     series: [{...}]\n    // });\n    use(install$t);\n    // `polar` coordinate system, for example:\n    // chart.setOption({\n    //     polar: {...},\n    //     radiusAxis: {...},\n    //     angleAxis: {...},\n    //     series: [{\n    //         coordinateSystem: 'polar'\n    //     }]\n    // });\n    use(install$u);\n    // `geo` coordinate system, for example:\n    // chart.setOption({\n    //     geo: {...},\n    //     series: [{\n    //         coordinateSystem: 'geo'\n    //     }]\n    // });\n    use(install$9);\n    // `singleAxis` coordinate system (notice, it is a coordinate system\n    // with only one axis, work for chart like theme river), for example:\n    // chart.setOption({\n    //     singleAxis: {...}\n    //     series: [{type: 'themeRiver', ...}]\n    // });\n    use(install$v);\n    // `parallel` coordinate system, only work for parallel series, for example:\n    // chart.setOption({\n    //     parallel: {...},\n    //     parallelAxis: [{...}, ...],\n    //     series: [{\n    //         type: 'parallel'\n    //     }]\n    // });\n    use(install$g);\n    // `calendar` coordinate system. for example,\n    // chart.setOption({\n    //     calendar: {...},\n    //     series: [{\n    //         coordinateSystem: 'calendar'\n    //     }]\n    // );\n    use(install$w);\n    // ------------------\n    // Other components\n    // ------------------\n    // `graphic` component, for example:\n    // chart.setOption({\n    //     graphic: {...}\n    // });\n    use(install$x);\n    // `toolbox` component, for example:\n    // chart.setOption({\n    //     toolbox: {...}\n    // });\n    use(install$z);\n    // `tooltip` component, for example:\n    // chart.setOption({\n    //     tooltip: {...}\n    // });\n    use(install$A);\n    // `axisPointer` component, for example:\n    // chart.setOption({\n    //     tooltip: {axisPointer: {...}, ...}\n    // });\n    // Or\n    // chart.setOption({\n    //     axisPointer: {...}\n    // });\n    use(install$s);\n    // `brush` component, for example:\n    // chart.setOption({\n    //     brush: {...}\n    // });\n    // Or\n    // chart.setOption({\n    //     tooltip: {feature: {brush: {...}}\n    // })\n    use(install$B);\n    // `title` component, for example:\n    // chart.setOption({\n    //     title: {...}\n    // });\n    use(install$C);\n    // `timeline` component, for example:\n    // chart.setOption({\n    //     timeline: {...}\n    // });\n    use(install$D);\n    // `markPoint` component, for example:\n    // chart.setOption({\n    //     series: [{markPoint: {...}}]\n    // });\n    use(install$E);\n    // `markLine` component, for example:\n    // chart.setOption({\n    //     series: [{markLine: {...}}]\n    // });\n    use(install$F);\n    // `markArea` component, for example:\n    // chart.setOption({\n    //     series: [{markArea: {...}}]\n    // });\n    use(install$G);\n    // `legend` component not scrollable. for example:\n    // chart.setOption({\n    //     legend: {...}\n    // });\n    use(install$J);\n    // `dataZoom` component including both `dataZoomInside` and `dataZoomSlider`.\n    use(install$M);\n    // `dataZoom` component providing drag, pinch, wheel behaviors\n    // inside coordinate system, for example:\n    // chart.setOption({\n    //     dataZoom: {type: 'inside'}\n    // });\n    use(install$K);\n    // `dataZoom` component providing a slider bar, for example:\n    // chart.setOption({\n    //     dataZoom: {type: 'slider'}\n    // });\n    use(install$L);\n    // `visualMap` component including both `visualMapContinuous` and `visualMapPiecewise`.\n    use(install$P);\n    // `visualMap` component providing continuous bar, for example:\n    // chart.setOption({\n    //     visualMap: {type: 'continuous'}\n    // });\n    use(install$N);\n    // `visualMap` component providing pieces bar, for example:\n    // chart.setOption({\n    //     visualMap: {type: 'piecewise'}\n    // });\n    use(install$O);\n    // `aria` component providing aria, for example:\n    // chart.setOption({\n    //     aria: {...}\n    // });\n    use(install$Q);\n    // dataset transform\n    // chart.setOption({\n    //     dataset: {\n    //          transform: []\n    //     }\n    // });\n    use(install$R);\n    use(install$S);\n    // universal transition\n    // chart.setOption({\n    //     series: {\n    //         universalTransition: { enabled: true }\n    //     }\n    // })\n    use(installUniversalTransition);\n    // label layout\n    // chart.setOption({\n    //     series: {\n    //         labelLayout: { hideOverlap: true }\n    //     }\n    // })\n    use(installLabelLayout);\n\n    exports.Axis = Axis;\n    exports.ChartView = ChartView;\n    exports.ComponentModel = ComponentModel;\n    exports.ComponentView = ComponentView;\n    exports.List = SeriesData;\n    exports.Model = Model;\n    exports.PRIORITY = PRIORITY;\n    exports.SeriesModel = SeriesModel;\n    exports.color = color;\n    exports.connect = connect;\n    exports.dataTool = dataTool;\n    exports.dependencies = dependencies;\n    exports.disConnect = disConnect;\n    exports.disconnect = disconnect;\n    exports.dispose = dispose$1;\n    exports.env = env;\n    exports.extendChartView = extendChartView;\n    exports.extendComponentModel = extendComponentModel;\n    exports.extendComponentView = extendComponentView;\n    exports.extendSeriesModel = extendSeriesModel;\n    exports.format = format$1;\n    exports.getCoordinateSystemDimensions = getCoordinateSystemDimensions;\n    exports.getInstanceByDom = getInstanceByDom;\n    exports.getInstanceById = getInstanceById;\n    exports.getMap = getMap;\n    exports.graphic = graphic$1;\n    exports.helper = helper;\n    exports.init = init$1;\n    exports.innerDrawElementOnCanvas = brushSingle;\n    exports.matrix = matrix;\n    exports.number = number;\n    exports.parseGeoJSON = parseGeoJSON;\n    exports.parseGeoJson = parseGeoJSON;\n    exports.registerAction = registerAction;\n    exports.registerCoordinateSystem = registerCoordinateSystem;\n    exports.registerLayout = registerLayout;\n    exports.registerLoading = registerLoading;\n    exports.registerLocale = registerLocale;\n    exports.registerMap = registerMap;\n    exports.registerPostInit = registerPostInit;\n    exports.registerPostUpdate = registerPostUpdate;\n    exports.registerPreprocessor = registerPreprocessor;\n    exports.registerProcessor = registerProcessor;\n    exports.registerTheme = registerTheme;\n    exports.registerTransform = registerTransform;\n    exports.registerUpdateLifecycle = registerUpdateLifecycle;\n    exports.registerVisual = registerVisual;\n    exports.setCanvasCreator = setCanvasCreator;\n    exports.setPlatformAPI = setPlatformAPI;\n    exports.throttle = throttle;\n    exports.time = time;\n    exports.use = use;\n    exports.util = util$1;\n    exports.vector = vector;\n    exports.version = version$1;\n    exports.zrUtil = util;\n    exports.zrender = zrender;\n\n    Object.defineProperty(exports, '__esModule', { value: true });\n\n})));\n//# sourceMappingURL=echarts.js.map\n\n/**\n * Angular Dynamic Locale - 0.1.37\n * https://github.com/lgalfaso/angular-dynamic-locale\n * License: MIT\n */\n(function (root, factory) {\n  if (typeof define === 'function' && define.amd) {\n    // AMD. Register as an anonymous module unless amdModuleId is set\n    define([], function () {\n      return (factory());\n    });\n  } else if (typeof exports === 'object') {\n    // Node. Does not work with strict CommonJS, but\n    // only CommonJS-like environments that support module.exports,\n    // like Node.\n    module.exports = factory();\n  } else {\n    factory();\n  }\n}(this, function () {\n  'use strict';\n  angular.module('tmh.dynamicLocale', []).config(['$provide', function($provide) {\n    function makeStateful($delegate) {\n      $delegate.$stateful = true;\n      return $delegate;\n    }\n\n    $provide.decorator('dateFilter', ['$delegate', makeStateful]);\n    $provide.decorator('numberFilter', ['$delegate', makeStateful]);\n    $provide.decorator('currencyFilter', ['$delegate', makeStateful]);\n\n  }])\n    .constant('tmhDynamicLocale.STORAGE_KEY', 'tmhDynamicLocale.locale')\n    .provider('tmhDynamicLocale', ['tmhDynamicLocale.STORAGE_KEY', function(STORAGE_KEY) {\n\n      var defaultLocale,\n        localeLocationPattern = 'angular/i18n/angular-locale_{{locale}}.js',\n        nodeToAppend,\n        storageFactory = 'tmhDynamicLocaleStorageCache',\n        storage,\n        storageKey = STORAGE_KEY,\n        storageGet = 'get',\n        storagePut = 'put',\n        promiseCache = {},\n        activeLocale,\n        extraProperties = {};\n\n      /**\n   * Loads a script asynchronously\n   *\n   * @param {string} url The url for the script\n   @ @param {function} callback A function to be called once the script is loaded\n   */\n      function loadScript(url, callback, errorCallback, $timeout) {\n        var script = document.createElement('script'),\n          element = nodeToAppend ? nodeToAppend : document.getElementsByTagName('body')[0],\n          removed = false;\n\n        script.type = 'text/javascript';\n        if (script.readyState) { // IE\n          script.onreadystatechange = function () {\n            if (script.readyState === 'complete' ||\n            script.readyState === 'loaded') {\n              script.onreadystatechange = null;\n              $timeout(\n                function () {\n                  if (removed) return;\n                  removed = true;\n                  if (script.parentNode === element) {\n                    element.removeChild(script);\n                  }\n                  callback();\n                }, 30, false);\n            }\n          };\n        } else { // Others\n          script.onload = function () {\n            if (removed) return;\n            removed = true;\n            if (script.parentNode === element) {\n              element.removeChild(script);\n            }\n            callback();\n          };\n          script.onerror = function () {\n            if (removed) return;\n            removed = true;\n            if (script.parentNode === element) {\n              element.removeChild(script);\n            }\n            errorCallback();\n          };\n        }\n        script.src = url;\n        script.async = true;\n        element.appendChild(script);\n      }\n\n      /**\n   * Loads a locale and replaces the properties from the current locale with the new locale information\n   *\n   * @param {string} localeUrl The path to the new locale\n   * @param {Object} $locale The locale at the curent scope\n   * @param {string} localeId The locale id to load\n   * @param {Object} $rootScope The application $rootScope\n   * @param {Object} $q The application $q\n   * @param {Object} localeCache The current locale cache\n   * @param {Object} $timeout The application $timeout\n   */\n      function loadLocale(localeUrl, $locale, localeId, $rootScope, $q, localeCache, $timeout) {\n\n        function overrideValues(oldObject, newObject) {\n          if (activeLocale !== localeId) {\n            return;\n          }\n          angular.forEach(oldObject, function(value, key) {\n            if (!newObject[key]) {\n              delete oldObject[key];\n            } else if (angular.isArray(newObject[key])) {\n              oldObject[key].length = newObject[key].length;\n            }\n          });\n          angular.forEach(newObject, function(value, key) {\n            if (angular.isArray(newObject[key]) || angular.isObject(newObject[key])) {\n              if (!oldObject[key]) {\n                oldObject[key] = angular.isArray(newObject[key]) ? [] : {};\n              }\n              overrideValues(oldObject[key], newObject[key]);\n            } else {\n              oldObject[key] = newObject[key];\n            }\n          });\n        }\n\n\n        if (promiseCache[localeId]) {\n          activeLocale = localeId;\n          return promiseCache[localeId];\n        }\n\n        var cachedLocale,\n          deferred = $q.defer();\n        if (localeId === activeLocale) {\n          deferred.resolve($locale);\n        } else if ((cachedLocale = localeCache.get(localeId))) {\n          activeLocale = localeId;\n          $rootScope.$evalAsync(function() {\n            overrideValues($locale, cachedLocale);\n            storage[storagePut](storageKey, localeId);\n            $rootScope.$broadcast('$localeChangeSuccess', localeId, $locale);\n            deferred.resolve($locale);\n          });\n        } else {\n          activeLocale = localeId;\n          promiseCache[localeId] = deferred.promise;\n          loadScript(localeUrl, function() {\n            // Create a new injector with the new locale\n            var localInjector = angular.injector(['ngLocale']),\n              externalLocale = localInjector.get('$locale');\n\n            overrideValues($locale, externalLocale);\n            localeCache.put(localeId, externalLocale);\n            delete promiseCache[localeId];\n\n            $rootScope.$applyAsync(function() {\n              storage[storagePut](storageKey, localeId);\n              $rootScope.$broadcast('$localeChangeSuccess', localeId, $locale);\n              deferred.resolve($locale);\n            });\n          }, function() {\n            delete promiseCache[localeId];\n\n            $rootScope.$applyAsync(function() {\n              if (activeLocale === localeId) {\n                activeLocale = $locale.id;\n              }\n              $rootScope.$broadcast('$localeChangeError', localeId);\n              deferred.reject(localeId);\n            });\n          }, $timeout);\n        }\n        return deferred.promise;\n      }\n\n      this.localeLocationPattern = function(value) {\n        if (value) {\n          localeLocationPattern = value;\n          return this;\n        } else {\n          return localeLocationPattern;\n        }\n      };\n\n      this.appendScriptTo = function(nodeElement) {\n        nodeToAppend = nodeElement;\n      };\n\n      this.useStorage = function(storageName) {\n        storageFactory = storageName;\n        storageGet = 'get';\n        storagePut = 'put';\n      };\n\n      this.useCookieStorage = function() {\n        if (angular.version.minor < 7) {\n          this.useStorage('$cookieStore');\n        } else {\n          this.useStorage('$cookies');\n          storageGet = 'getObject';\n          storagePut = 'putObject';\n        }\n      };\n\n      this.defaultLocale = function(value) {\n        defaultLocale = value;\n      };\n\n      this.storageKey = function(value) {\n        if (value) {\n          storageKey = value;\n          return this;\n        } else {\n          return storageKey;\n        }\n      };\n\n      this.addLocalePatternValue = function(key, value) {\n        extraProperties[key] = value;\n      };\n\n      this.$get = ['$rootScope', '$injector', '$interpolate', '$locale', '$q', 'tmhDynamicLocaleCache', '$timeout', function($rootScope, $injector, interpolate, locale, $q, tmhDynamicLocaleCache, $timeout) {\n        var localeLocation = interpolate(localeLocationPattern);\n\n        storage = $injector.get(storageFactory);\n        $rootScope.$evalAsync(function() {\n          var initialLocale;\n          if ((initialLocale = (storage[storageGet](storageKey) || defaultLocale))) {\n            loadLocaleFn(initialLocale);\n          }\n        });\n        return {\n          /**\n       * @ngdoc method\n       * @description\n       * @param {string} value Sets the locale to the new locale. Changing the locale will trigger\n       *    a background task that will retrieve the new locale and configure the current $locale\n       *    instance with the information from the new locale\n       */\n          set: loadLocaleFn,\n          /**\n       * @ngdoc method\n       * @description Returns the configured locale\n       */\n          get: function() {\n            return activeLocale;\n          }\n        };\n\n        function loadLocaleFn(localeId) {\n          var baseProperties = {locale: localeId, angularVersion: angular.version.full};\n          return loadLocale(localeLocation(angular.extend({}, extraProperties, baseProperties)), locale, localeId, $rootScope, $q, tmhDynamicLocaleCache, $timeout);\n        }\n      }];\n    }]).provider('tmhDynamicLocaleCache', function() {\n      this.$get = ['$cacheFactory', function($cacheFactory) {\n        return $cacheFactory('tmh.dynamicLocales');\n      }];\n    }).provider('tmhDynamicLocaleStorageCache', function() {\n      this.$get = ['$cacheFactory', function($cacheFactory) {\n        return $cacheFactory('tmh.dynamicLocales.store');\n      }];\n    }).run(['tmhDynamicLocale', angular.noop]);\n\n  return 'tmh.dynamicLocale';\n\n}));\n\n/*!\n * FullCalendar v2.3.1\n * Docs & License: http://fullcalendar.io/\n * (c) 2015 Adam Shaw\n */\n\n(function(factory) {\n\tif (typeof define === 'function' && define.amd) {\n\t\tdefine([ 'jquery', 'moment' ], factory);\n\t}\n\telse if (typeof exports === 'object') { // Node/CommonJS\n\t\tmodule.exports = factory(require('jquery'), require('moment'));\n\t}\n\telse {\n\t\tfactory(jQuery, moment);\n\t}\n})(function($, moment) {\n\n;;\n\nvar fc = $.fullCalendar = { version: \"2.3.1\" };\nvar fcViews = fc.views = {};\n\n\n$.fn.fullCalendar = function(options) {\n\tvar args = Array.prototype.slice.call(arguments, 1); // for a possible method call\n\tvar res = this; // what this function will return (this jQuery object by default)\n\n\tthis.each(function(i, _element) { // loop each DOM element involved\n\t\tvar element = $(_element);\n\t\tvar calendar = element.data('fullCalendar'); // get the existing calendar object (if any)\n\t\tvar singleRes; // the returned value of this single method call\n\n\t\t// a method call\n\t\tif (typeof options === 'string') {\n\t\t\tif (calendar && $.isFunction(calendar[options])) {\n\t\t\t\tsingleRes = calendar[options].apply(calendar, args);\n\t\t\t\tif (!i) {\n\t\t\t\t\tres = singleRes; // record the first method call result\n\t\t\t\t}\n\t\t\t\tif (options === 'destroy') { // for the destroy method, must remove Calendar object data\n\t\t\t\t\telement.removeData('fullCalendar');\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\t// a new calendar initialization\n\t\telse if (!calendar) { // don't initialize twice\n\t\t\tcalendar = new fc.CalendarBase(element, options);\n\t\t\telement.data('fullCalendar', calendar);\n\t\t\tcalendar.render();\n\t\t}\n\t});\n\t\n\treturn res;\n};\n\n\nvar complexOptions = [ // names of options that are objects whose properties should be combined\n\t'header',\n\t'buttonText',\n\t'buttonIcons',\n\t'themeButtonIcons'\n];\n\n\n// Recursively combines all passed-in option-hash arguments into a new single option-hash.\n// Given option-hashes are ordered from lowest to highest priority.\nfunction mergeOptions() {\n\tvar chain = Array.prototype.slice.call(arguments); // convert to a real array\n\tvar complexVals = {}; // hash for each complex option's combined values\n\tvar i, name;\n\tvar combinedVal;\n\tvar j;\n\tvar val;\n\n\t// for each complex option, loop through each option-hash and accumulate the combined values\n\tfor (i = 0; i < complexOptions.length; i++) {\n\t\tname = complexOptions[i];\n\t\tcombinedVal = null; // an object holding the merge of all the values\n\n\t\tfor (j = 0; j < chain.length; j++) {\n\t\t\tval = chain[j][name];\n\n\t\t\tif ($.isPlainObject(val)) {\n\t\t\t\tcombinedVal = $.extend(combinedVal || {}, val); // merge new properties\n\t\t\t}\n\t\t\telse if (val != null) { // a non-null non-undefined atomic option\n\t\t\t\tcombinedVal = null; // signal to use the atomic value\n\t\t\t}\n\t\t}\n\n\t\t// if not null, the final value was a combination of other objects. record it\n\t\tif (combinedVal !== null) {\n\t\t\tcomplexVals[name] = combinedVal;\n\t\t}\n\t}\n\n\tchain.unshift({}); // $.extend will mutate this with the result\n\tchain.push(complexVals); // computed complex values are applied last\n\treturn $.extend.apply($, chain); // combine\n}\n\n\n// Given options specified for the calendar's constructor, massages any legacy options into a non-legacy form.\n// Converts View-Option-Hashes into the View-Specific-Options format.\nfunction massageOverrides(input) {\n\tvar overrides = { views: input.views || {} }; // the output. ensure a `views` hash\n\tvar subObj;\n\n\t// iterate through all option override properties (except `views`)\n\t$.each(input, function(name, val) {\n\t\tif (name != 'views') {\n\n\t\t\t// could the value be a legacy View-Option-Hash?\n\t\t\tif (\n\t\t\t\t$.isPlainObject(val) &&\n\t\t\t\t!/(time|duration|interval)$/i.test(name) && // exclude duration options. might be given as objects\n\t\t\t\t$.inArray(name, complexOptions) == -1 // complex options aren't allowed to be View-Option-Hashes\n\t\t\t) {\n\t\t\t\tsubObj = null;\n\n\t\t\t\t// iterate through the properties of this possible View-Option-Hash value\n\t\t\t\t$.each(val, function(subName, subVal) {\n\n\t\t\t\t\t// is the property targeting a view?\n\t\t\t\t\tif (/^(month|week|day|default|basic(Week|Day)?|agenda(Week|Day)?)$/.test(subName)) {\n\t\t\t\t\t\tif (!overrides.views[subName]) { // ensure the view-target entry exists\n\t\t\t\t\t\t\toverrides.views[subName] = {};\n\t\t\t\t\t\t}\n\t\t\t\t\t\toverrides.views[subName][name] = subVal; // record the value in the `views` object\n\t\t\t\t\t}\n\t\t\t\t\telse { // a non-View-Option-Hash property\n\t\t\t\t\t\tif (!subObj) {\n\t\t\t\t\t\t\tsubObj = {};\n\t\t\t\t\t\t}\n\t\t\t\t\t\tsubObj[subName] = subVal; // accumulate these unrelated values for later\n\t\t\t\t\t}\n\t\t\t\t});\n\n\t\t\t\tif (subObj) { // non-View-Option-Hash properties? transfer them as-is\n\t\t\t\t\toverrides[name] = subObj;\n\t\t\t\t}\n\t\t\t}\n\t\t\telse {\n\t\t\t\toverrides[name] = val; // transfer normal options as-is\n\t\t\t}\n\t\t}\n\t});\n\n\treturn overrides;\n}\n\n;;\n\n// exports\nfc.intersectionToSeg = intersectionToSeg;\nfc.applyAll = applyAll;\nfc.debounce = debounce;\nfc.isInt = isInt;\nfc.htmlEscape = htmlEscape;\nfc.cssToStr = cssToStr;\nfc.proxy = proxy;\n\n\n/* FullCalendar-specific DOM Utilities\n----------------------------------------------------------------------------------------------------------------------*/\n\n\n// Given the scrollbar widths of some other container, create borders/margins on rowEls in order to match the left\n// and right space that was offset by the scrollbars. A 1-pixel border first, then margin beyond that.\nfunction compensateScroll(rowEls, scrollbarWidths) {\n\tif (scrollbarWidths.left) {\n\t\trowEls.css({\n\t\t\t'border-left-width': 1,\n\t\t\t'margin-left': scrollbarWidths.left - 1\n\t\t});\n\t}\n\tif (scrollbarWidths.right) {\n\t\trowEls.css({\n\t\t\t'border-right-width': 1,\n\t\t\t'margin-right': scrollbarWidths.right - 1\n\t\t});\n\t}\n}\n\n\n// Undoes compensateScroll and restores all borders/margins\nfunction uncompensateScroll(rowEls) {\n\trowEls.css({\n\t\t'margin-left': '',\n\t\t'margin-right': '',\n\t\t'border-left-width': '',\n\t\t'border-right-width': ''\n\t});\n}\n\n\n// Make the mouse cursor express that an event is not allowed in the current area\nfunction disableCursor() {\n\t$('body').addClass('fc-not-allowed');\n}\n\n\n// Returns the mouse cursor to its original look\nfunction enableCursor() {\n\t$('body').removeClass('fc-not-allowed');\n}\n\n\n// Given a total available height to fill, have `els` (essentially child rows) expand to accomodate.\n// By default, all elements that are shorter than the recommended height are expanded uniformly, not considering\n// any other els that are already too tall. if `shouldRedistribute` is on, it considers these tall rows and \n// reduces the available height.\nfunction distributeHeight(els, availableHeight, shouldRedistribute) {\n\n\t// *FLOORING NOTE*: we floor in certain places because zoom can give inaccurate floating-point dimensions,\n\t// and it is better to be shorter than taller, to avoid creating unnecessary scrollbars.\n\n\tvar minOffset1 = Math.floor(availableHeight / els.length); // for non-last element\n\tvar minOffset2 = Math.floor(availableHeight - minOffset1 * (els.length - 1)); // for last element *FLOORING NOTE*\n\tvar flexEls = []; // elements that are allowed to expand. array of DOM nodes\n\tvar flexOffsets = []; // amount of vertical space it takes up\n\tvar flexHeights = []; // actual css height\n\tvar usedHeight = 0;\n\n\tundistributeHeight(els); // give all elements their natural height\n\n\t// find elements that are below the recommended height (expandable).\n\t// important to query for heights in a single first pass (to avoid reflow oscillation).\n\tels.each(function(i, el) {\n\t\tvar minOffset = i === els.length - 1 ? minOffset2 : minOffset1;\n\t\tvar naturalOffset = $(el).outerHeight(true);\n\n\t\tif (naturalOffset < minOffset) {\n\t\t\tflexEls.push(el);\n\t\t\tflexOffsets.push(naturalOffset);\n\t\t\tflexHeights.push($(el).height());\n\t\t}\n\t\telse {\n\t\t\t// this element stretches past recommended height (non-expandable). mark the space as occupied.\n\t\t\tusedHeight += naturalOffset;\n\t\t}\n\t});\n\n\t// readjust the recommended height to only consider the height available to non-maxed-out rows.\n\tif (shouldRedistribute) {\n\t\tavailableHeight -= usedHeight;\n\t\tminOffset1 = Math.floor(availableHeight / flexEls.length);\n\t\tminOffset2 = Math.floor(availableHeight - minOffset1 * (flexEls.length - 1)); // *FLOORING NOTE*\n\t}\n\n\t// assign heights to all expandable elements\n\t$(flexEls).each(function(i, el) {\n\t\tvar minOffset = i === flexEls.length - 1 ? minOffset2 : minOffset1;\n\t\tvar naturalOffset = flexOffsets[i];\n\t\tvar naturalHeight = flexHeights[i];\n\t\tvar newHeight = minOffset - (naturalOffset - naturalHeight); // subtract the margin/padding\n\n\t\tif (naturalOffset < minOffset) { // we check this again because redistribution might have changed things\n\t\t\t$(el).height(newHeight);\n\t\t}\n\t});\n}\n\n\n// Undoes distrubuteHeight, restoring all els to their natural height\nfunction undistributeHeight(els) {\n\tels.height('');\n}\n\n\n// Given `els`, a jQuery set of <td> cells, find the cell with the largest natural width and set the widths of all the\n// cells to be that width.\n// PREREQUISITE: if you want a cell to take up width, it needs to have a single inner element w/ display:inline\nfunction matchCellWidths(els) {\n\tvar maxInnerWidth = 0;\n\n\tels.find('> *').each(function(i, innerEl) {\n\t\tvar innerWidth = $(innerEl).outerWidth();\n\t\tif (innerWidth > maxInnerWidth) {\n\t\t\tmaxInnerWidth = innerWidth;\n\t\t}\n\t});\n\n\tmaxInnerWidth++; // sometimes not accurate of width the text needs to stay on one line. insurance\n\n\tels.width(maxInnerWidth);\n\n\treturn maxInnerWidth;\n}\n\n\n// Turns a container element into a scroller if its contents is taller than the allotted height.\n// Returns true if the element is now a scroller, false otherwise.\n// NOTE: this method is best because it takes weird zooming dimensions into account\nfunction setPotentialScroller(containerEl, height) {\n\tcontainerEl.height(height).addClass('fc-scroller');\n\n\t// are scrollbars needed?\n\tif (containerEl[0].scrollHeight - 1 > containerEl[0].clientHeight) { // !!! -1 because IE is often off-by-one :(\n\t\treturn true;\n\t}\n\n\tunsetScroller(containerEl); // undo\n\treturn false;\n}\n\n\n// Takes an element that might have been a scroller, and turns it back into a normal element.\nfunction unsetScroller(containerEl) {\n\tcontainerEl.height('').removeClass('fc-scroller');\n}\n\n\n/* General DOM Utilities\n----------------------------------------------------------------------------------------------------------------------*/\n\nfc.getClientRect = getClientRect;\nfc.getContentRect = getContentRect;\nfc.getScrollbarWidths = getScrollbarWidths;\n\n\n// borrowed from https://github.com/jquery/jquery-ui/blob/1.11.0/ui/core.js#L51\nfunction getScrollParent(el) {\n\tvar position = el.css('position'),\n\t\tscrollParent = el.parents().filter(function() {\n\t\t\tvar parent = $(this);\n\t\t\treturn (/(auto|scroll)/).test(\n\t\t\t\tparent.css('overflow') + parent.css('overflow-y') + parent.css('overflow-x')\n\t\t\t);\n\t\t}).eq(0);\n\n\treturn position === 'fixed' || !scrollParent.length ? $(el[0].ownerDocument || document) : scrollParent;\n}\n\n\n// Queries the outer bounding area of a jQuery element.\n// Returns a rectangle with absolute coordinates: left, right (exclusive), top, bottom (exclusive).\nfunction getOuterRect(el) {\n\tvar offset = el.offset();\n\n\treturn {\n\t\tleft: offset.left,\n\t\tright: offset.left + el.outerWidth(),\n\t\ttop: offset.top,\n\t\tbottom: offset.top + el.outerHeight()\n\t};\n}\n\n\n// Queries the area within the margin/border/scrollbars of a jQuery element. Does not go within the padding.\n// Returns a rectangle with absolute coordinates: left, right (exclusive), top, bottom (exclusive).\n// NOTE: should use clientLeft/clientTop, but very unreliable cross-browser.\nfunction getClientRect(el) {\n\tvar offset = el.offset();\n\tvar scrollbarWidths = getScrollbarWidths(el);\n\tvar left = offset.left + getCssFloat(el, 'border-left-width') + scrollbarWidths.left;\n\tvar top = offset.top + getCssFloat(el, 'border-top-width') + scrollbarWidths.top;\n\n\treturn {\n\t\tleft: left,\n\t\tright: left + el[0].clientWidth, // clientWidth includes padding but NOT scrollbars\n\t\ttop: top,\n\t\tbottom: top + el[0].clientHeight // clientHeight includes padding but NOT scrollbars\n\t};\n}\n\n\n// Queries the area within the margin/border/padding of a jQuery element. Assumed not to have scrollbars.\n// Returns a rectangle with absolute coordinates: left, right (exclusive), top, bottom (exclusive).\nfunction getContentRect(el) {\n\tvar offset = el.offset(); // just outside of border, margin not included\n\tvar left = offset.left + getCssFloat(el, 'border-left-width') + getCssFloat(el, 'padding-left');\n\tvar top = offset.top + getCssFloat(el, 'border-top-width') + getCssFloat(el, 'padding-top');\n\n\treturn {\n\t\tleft: left,\n\t\tright: left + el.width(),\n\t\ttop: top,\n\t\tbottom: top + el.height()\n\t};\n}\n\n\n// Returns the computed left/right/top/bottom scrollbar widths for the given jQuery element.\n// NOTE: should use clientLeft/clientTop, but very unreliable cross-browser.\nfunction getScrollbarWidths(el) {\n\tvar leftRightWidth = el.innerWidth() - el[0].clientWidth; // the paddings cancel out, leaving the scrollbars\n\tvar widths = {\n\t\tleft: 0,\n\t\tright: 0,\n\t\ttop: 0,\n\t\tbottom: el.innerHeight() - el[0].clientHeight // the paddings cancel out, leaving the bottom scrollbar\n\t};\n\n\tif (getIsLeftRtlScrollbars() && el.css('direction') == 'rtl') { // is the scrollbar on the left side?\n\t\twidths.left = leftRightWidth;\n\t}\n\telse {\n\t\twidths.right = leftRightWidth;\n\t}\n\n\treturn widths;\n}\n\n\n// Logic for determining if, when the element is right-to-left, the scrollbar appears on the left side\n\nvar _isLeftRtlScrollbars = null;\n\nfunction getIsLeftRtlScrollbars() { // responsible for caching the computation\n\tif (_isLeftRtlScrollbars === null) {\n\t\t_isLeftRtlScrollbars = computeIsLeftRtlScrollbars();\n\t}\n\treturn _isLeftRtlScrollbars;\n}\n\nfunction computeIsLeftRtlScrollbars() { // creates an offscreen test element, then removes it\n\tvar el = $('<div><div/></div>')\n\t\t.css({\n\t\t\tposition: 'absolute',\n\t\t\ttop: -1000,\n\t\t\tleft: 0,\n\t\t\tborder: 0,\n\t\t\tpadding: 0,\n\t\t\toverflow: 'scroll',\n\t\t\tdirection: 'rtl'\n\t\t})\n\t\t.appendTo('body');\n\tvar innerEl = el.children();\n\tvar res = innerEl.offset().left > el.offset().left; // is the inner div shifted to accommodate a left scrollbar?\n\tel.remove();\n\treturn res;\n}\n\n\n// Retrieves a jQuery element's computed CSS value as a floating-point number.\n// If the queried value is non-numeric (ex: IE can return \"medium\" for border width), will just return zero.\nfunction getCssFloat(el, prop) {\n\treturn parseFloat(el.css(prop)) || 0;\n}\n\n\n// Returns a boolean whether this was a left mouse click and no ctrl key (which means right click on Mac)\nfunction isPrimaryMouseButton(ev) {\n\treturn ev.which == 1 && !ev.ctrlKey;\n}\n\n\n/* Geometry\n----------------------------------------------------------------------------------------------------------------------*/\n\n\n// Returns a new rectangle that is the intersection of the two rectangles. If they don't intersect, returns false\nfunction intersectRects(rect1, rect2) {\n\tvar res = {\n\t\tleft: Math.max(rect1.left, rect2.left),\n\t\tright: Math.min(rect1.right, rect2.right),\n\t\ttop: Math.max(rect1.top, rect2.top),\n\t\tbottom: Math.min(rect1.bottom, rect2.bottom)\n\t};\n\n\tif (res.left < res.right && res.top < res.bottom) {\n\t\treturn res;\n\t}\n\treturn false;\n}\n\n\n// Returns a new point that will have been moved to reside within the given rectangle\nfunction constrainPoint(point, rect) {\n\treturn {\n\t\tleft: Math.min(Math.max(point.left, rect.left), rect.right),\n\t\ttop: Math.min(Math.max(point.top, rect.top), rect.bottom)\n\t};\n}\n\n\n// Returns a point that is the center of the given rectangle\nfunction getRectCenter(rect) {\n\treturn {\n\t\tleft: (rect.left + rect.right) / 2,\n\t\ttop: (rect.top + rect.bottom) / 2\n\t};\n}\n\n\n// Subtracts point2's coordinates from point1's coordinates, returning a delta\nfunction diffPoints(point1, point2) {\n\treturn {\n\t\tleft: point1.left - point2.left,\n\t\ttop: point1.top - point2.top\n\t};\n}\n\n\n/* FullCalendar-specific Misc Utilities\n----------------------------------------------------------------------------------------------------------------------*/\n\n\n// Creates a basic segment with the intersection of the two ranges. Returns undefined if no intersection.\n// Expects all dates to be normalized to the same timezone beforehand.\n// TODO: move to date section?\nfunction intersectionToSeg(subjectRange, constraintRange) {\n\tvar subjectStart = subjectRange.start;\n\tvar subjectEnd = subjectRange.end;\n\tvar constraintStart = constraintRange.start;\n\tvar constraintEnd = constraintRange.end;\n\tvar segStart, segEnd;\n\tvar isStart, isEnd;\n\n\tif (subjectEnd > constraintStart && subjectStart < constraintEnd) { // in bounds at all?\n\n\t\tif (subjectStart >= constraintStart) {\n\t\t\tsegStart = subjectStart.clone();\n\t\t\tisStart = true;\n\t\t}\n\t\telse {\n\t\t\tsegStart = constraintStart.clone();\n\t\t\tisStart =  false;\n\t\t}\n\n\t\tif (subjectEnd <= constraintEnd) {\n\t\t\tsegEnd = subjectEnd.clone();\n\t\t\tisEnd = true;\n\t\t}\n\t\telse {\n\t\t\tsegEnd = constraintEnd.clone();\n\t\t\tisEnd = false;\n\t\t}\n\n\t\treturn {\n\t\t\tstart: segStart,\n\t\t\tend: segEnd,\n\t\t\tisStart: isStart,\n\t\t\tisEnd: isEnd\n\t\t};\n\t}\n}\n\n\n/* Date Utilities\n----------------------------------------------------------------------------------------------------------------------*/\n\nfc.computeIntervalUnit = computeIntervalUnit;\nfc.durationHasTime = durationHasTime;\n\nvar dayIDs = [ 'sun', 'mon', 'tue', 'wed', 'thu', 'fri', 'sat' ];\nvar intervalUnits = [ 'year', 'month', 'week', 'day', 'hour', 'minute', 'second', 'millisecond' ];\n\n\n// Diffs the two moments into a Duration where full-days are recorded first, then the remaining time.\n// Moments will have their timezones normalized.\nfunction diffDayTime(a, b) {\n\treturn moment.duration({\n\t\tdays: a.clone().stripTime().diff(b.clone().stripTime(), 'days'),\n\t\tms: a.time() - b.time() // time-of-day from day start. disregards timezone\n\t});\n}\n\n\n// Diffs the two moments via their start-of-day (regardless of timezone). Produces whole-day durations.\nfunction diffDay(a, b) {\n\treturn moment.duration({\n\t\tdays: a.clone().stripTime().diff(b.clone().stripTime(), 'days')\n\t});\n}\n\n\n// Diffs two moments, producing a duration, made of a whole-unit-increment of the given unit. Uses rounding.\nfunction diffByUnit(a, b, unit) {\n\treturn moment.duration(\n\t\tMath.round(a.diff(b, unit, true)), // returnFloat=true\n\t\tunit\n\t);\n}\n\n\n// Computes the unit name of the largest whole-unit period of time.\n// For example, 48 hours will be \"days\" whereas 49 hours will be \"hours\".\n// Accepts start/end, a range object, or an original duration object.\nfunction computeIntervalUnit(start, end) {\n\tvar i, unit;\n\tvar val;\n\n\tfor (i = 0; i < intervalUnits.length; i++) {\n\t\tunit = intervalUnits[i];\n\t\tval = computeRangeAs(unit, start, end);\n\n\t\tif (val >= 1 && isInt(val)) {\n\t\t\tbreak;\n\t\t}\n\t}\n\n\treturn unit; // will be \"milliseconds\" if nothing else matches\n}\n\n\n// Computes the number of units (like \"hours\") in the given range.\n// Range can be a {start,end} object, separate start/end args, or a Duration.\n// Results are based on Moment's .as() and .diff() methods, so results can depend on internal handling\n// of month-diffing logic (which tends to vary from version to version).\nfunction computeRangeAs(unit, start, end) {\n\n\tif (end != null) { // given start, end\n\t\treturn end.diff(start, unit, true);\n\t}\n\telse if (moment.isDuration(start)) { // given duration\n\t\treturn start.as(unit);\n\t}\n\telse { // given { start, end } range object\n\t\treturn start.end.diff(start.start, unit, true);\n\t}\n}\n\n\n// Returns a boolean about whether the given duration has any time parts (hours/minutes/seconds/ms)\nfunction durationHasTime(dur) {\n\treturn Boolean(dur.hours() || dur.minutes() || dur.seconds() || dur.milliseconds());\n}\n\n\nfunction isNativeDate(input) {\n\treturn  Object.prototype.toString.call(input) === '[object Date]' || input instanceof Date;\n}\n\n\n// Returns a boolean about whether the given input is a time string, like \"06:40:00\" or \"06:00\"\nfunction isTimeString(str) {\n\treturn /^\\d+\\:\\d+(?:\\:\\d+\\.?(?:\\d{3})?)?$/.test(str);\n}\n\n\n/* General Utilities\n----------------------------------------------------------------------------------------------------------------------*/\n\nvar hasOwnPropMethod = {}.hasOwnProperty;\n\n\n// Create an object that has the given prototype. Just like Object.create\nfunction createObject(proto) {\n\tvar f = function() {};\n\tf.prototype = proto;\n\treturn new f();\n}\n\n\nfunction copyOwnProps(src, dest) {\n\tfor (var name in src) {\n\t\tif (hasOwnProp(src, name)) {\n\t\t\tdest[name] = src[name];\n\t\t}\n\t}\n}\n\n\n// Copies over certain methods with the same names as Object.prototype methods. Overcomes an IE<=8 bug:\n// https://developer.mozilla.org/en-US/docs/ECMAScript_DontEnum_attribute#JScript_DontEnum_Bug\nfunction copyNativeMethods(src, dest) {\n\tvar names = [ 'constructor', 'toString', 'valueOf' ];\n\tvar i, name;\n\n\tfor (i = 0; i < names.length; i++) {\n\t\tname = names[i];\n\n\t\tif (src[name] !== Object.prototype[name]) {\n\t\t\tdest[name] = src[name];\n\t\t}\n\t}\n}\n\n\nfunction hasOwnProp(obj, name) {\n\treturn hasOwnPropMethod.call(obj, name);\n}\n\n\n// Is the given value a non-object non-function value?\nfunction isAtomic(val) {\n\treturn /undefined|null|boolean|number|string/.test($.type(val));\n}\n\n\nfunction applyAll(functions, thisObj, args) {\n\tif ($.isFunction(functions)) {\n\t\tfunctions = [ functions ];\n\t}\n\tif (functions) {\n\t\tvar i;\n\t\tvar ret;\n\t\tfor (i=0; i<functions.length; i++) {\n\t\t\tret = functions[i].apply(thisObj, args) || ret;\n\t\t}\n\t\treturn ret;\n\t}\n}\n\n\nfunction firstDefined() {\n\tfor (var i=0; i<arguments.length; i++) {\n\t\tif (arguments[i] !== undefined) {\n\t\t\treturn arguments[i];\n\t\t}\n\t}\n}\n\n\nfunction htmlEscape(s) {\n\treturn (s + '').replace(/&/g, '&amp;')\n\t\t.replace(/</g, '&lt;')\n\t\t.replace(/>/g, '&gt;')\n\t\t.replace(/'/g, '&#039;')\n\t\t.replace(/\"/g, '&quot;')\n\t\t.replace(/\\n/g, '<br />');\n}\n\n\nfunction stripHtmlEntities(text) {\n\treturn text.replace(/&.*?;/g, '');\n}\n\n\n// Given a hash of CSS properties, returns a string of CSS.\n// Uses property names as-is (no camel-case conversion). Will not make statements for null/undefined values.\nfunction cssToStr(cssProps) {\n\tvar statements = [];\n\n\t$.each(cssProps, function(name, val) {\n\t\tif (val != null) {\n\t\t\tstatements.push(name + ':' + val);\n\t\t}\n\t});\n\n\treturn statements.join(';');\n}\n\n\nfunction capitaliseFirstLetter(str) {\n\treturn str.charAt(0).toUpperCase() + str.slice(1);\n}\n\n\nfunction compareNumbers(a, b) { // for .sort()\n\treturn a - b;\n}\n\n\nfunction isInt(n) {\n\treturn n % 1 === 0;\n}\n\n\n// Returns a method bound to the given object context.\n// Just like one of the jQuery.proxy signatures, but without the undesired behavior of treating the same method with\n// different contexts as identical when binding/unbinding events.\nfunction proxy(obj, methodName) {\n\tvar method = obj[methodName];\n\n\treturn function() {\n\t\treturn method.apply(obj, arguments);\n\t};\n}\n\n\n// Returns a function, that, as long as it continues to be invoked, will not\n// be triggered. The function will be called after it stops being called for\n// N milliseconds.\n// https://github.com/jashkenas/underscore/blob/1.6.0/underscore.js#L714\nfunction debounce(func, wait) {\n\tvar timeoutId;\n\tvar args;\n\tvar context;\n\tvar timestamp; // of most recent call\n\tvar later = function() {\n\t\tvar last = +new Date() - timestamp;\n\t\tif (last < wait && last > 0) {\n\t\t\ttimeoutId = setTimeout(later, wait - last);\n\t\t}\n\t\telse {\n\t\t\ttimeoutId = null;\n\t\t\tfunc.apply(context, args);\n\t\t\tif (!timeoutId) {\n\t\t\t\tcontext = args = null;\n\t\t\t}\n\t\t}\n\t};\n\n\treturn function() {\n\t\tcontext = this;\n\t\targs = arguments;\n\t\ttimestamp = +new Date();\n\t\tif (!timeoutId) {\n\t\t\ttimeoutId = setTimeout(later, wait);\n\t\t}\n\t};\n}\n\n;;\n\nvar ambigDateOfMonthRegex = /^\\s*\\d{4}-\\d\\d$/;\nvar ambigTimeOrZoneRegex =\n\t/^\\s*\\d{4}-(?:(\\d\\d-\\d\\d)|(W\\d\\d$)|(W\\d\\d-\\d)|(\\d\\d\\d))((T| )(\\d\\d(:\\d\\d(:\\d\\d(\\.\\d+)?)?)?)?)?$/;\nvar newMomentProto = moment.fn; // where we will attach our new methods\nvar oldMomentProto = $.extend({}, newMomentProto); // copy of original moment methods\nvar allowValueOptimization;\nvar setUTCValues; // function defined below\nvar setLocalValues; // function defined below\n\n\n// Creating\n// -------------------------------------------------------------------------------------------------\n\n// Creates a new moment, similar to the vanilla moment(...) constructor, but with\n// extra features (ambiguous time, enhanced formatting). When given an existing moment,\n// it will function as a clone (and retain the zone of the moment). Anything else will\n// result in a moment in the local zone.\nfc.moment = function() {\n\treturn makeMoment(arguments);\n};\n\n// Sames as fc.moment, but forces the resulting moment to be in the UTC timezone.\nfc.moment.utc = function() {\n\tvar mom = makeMoment(arguments, true);\n\n\t// Force it into UTC because makeMoment doesn't guarantee it\n\t// (if given a pre-existing moment for example)\n\tif (mom.hasTime()) { // don't give ambiguously-timed moments a UTC zone\n\t\tmom.utc();\n\t}\n\n\treturn mom;\n};\n\n// Same as fc.moment, but when given an ISO8601 string, the timezone offset is preserved.\n// ISO8601 strings with no timezone offset will become ambiguously zoned.\nfc.moment.parseZone = function() {\n\treturn makeMoment(arguments, true, true);\n};\n\n// Builds an enhanced moment from args. When given an existing moment, it clones. When given a\n// native Date, or called with no arguments (the current time), the resulting moment will be local.\n// Anything else needs to be \"parsed\" (a string or an array), and will be affected by:\n//    parseAsUTC - if there is no zone information, should we parse the input in UTC?\n//    parseZone - if there is zone information, should we force the zone of the moment?\nfunction makeMoment(args, parseAsUTC, parseZone) {\n\tvar input = args[0];\n\tvar isSingleString = args.length == 1 && typeof input === 'string';\n\tvar isAmbigTime;\n\tvar isAmbigZone;\n\tvar ambigMatch;\n\tvar mom;\n\n\tif (moment.isMoment(input)) {\n\t\tmom = moment.apply(null, args); // clone it\n\t\ttransferAmbigs(input, mom); // the ambig flags weren't transfered with the clone\n\t}\n\telse if (isNativeDate(input) || input === undefined) {\n\t\tmom = moment.apply(null, args); // will be local\n\t}\n\telse { // \"parsing\" is required\n\t\tisAmbigTime = false;\n\t\tisAmbigZone = false;\n\n\t\tif (isSingleString) {\n\t\t\tif (ambigDateOfMonthRegex.test(input)) {\n\t\t\t\t// accept strings like '2014-05', but convert to the first of the month\n\t\t\t\tinput += '-01';\n\t\t\t\targs = [ input ]; // for when we pass it on to moment's constructor\n\t\t\t\tisAmbigTime = true;\n\t\t\t\tisAmbigZone = true;\n\t\t\t}\n\t\t\telse if ((ambigMatch = ambigTimeOrZoneRegex.exec(input))) {\n\t\t\t\tisAmbigTime = !ambigMatch[5]; // no time part?\n\t\t\t\tisAmbigZone = true;\n\t\t\t}\n\t\t}\n\t\telse if ($.isArray(input)) {\n\t\t\t// arrays have no timezone information, so assume ambiguous zone\n\t\t\tisAmbigZone = true;\n\t\t}\n\t\t// otherwise, probably a string with a format\n\n\t\tif (parseAsUTC || isAmbigTime) {\n\t\t\tmom = moment.utc.apply(moment, args);\n\t\t}\n\t\telse {\n\t\t\tmom = moment.apply(null, args);\n\t\t}\n\n\t\tif (isAmbigTime) {\n\t\t\tmom._ambigTime = true;\n\t\t\tmom._ambigZone = true; // ambiguous time always means ambiguous zone\n\t\t}\n\t\telse if (parseZone) { // let's record the inputted zone somehow\n\t\t\tif (isAmbigZone) {\n\t\t\t\tmom._ambigZone = true;\n\t\t\t}\n\t\t\telse if (isSingleString) {\n\t\t\t\tif (mom.utcOffset) {\n\t\t\t\t\tmom.utcOffset(input); // if not a valid zone, will assign UTC\n\t\t\t\t}\n\t\t\t\telse {\n\t\t\t\t\tmom.zone(input); // for moment-pre-2.9\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\n\tmom._fullCalendar = true; // flag for extended functionality\n\n\treturn mom;\n}\n\n\n// A clone method that works with the flags related to our enhanced functionality.\n// In the future, use moment.momentProperties\nnewMomentProto.clone = function() {\n\tvar mom = oldMomentProto.clone.apply(this, arguments);\n\n\t// these flags weren't transfered with the clone\n\ttransferAmbigs(this, mom);\n\tif (this._fullCalendar) {\n\t\tmom._fullCalendar = true;\n\t}\n\n\treturn mom;\n};\n\n\n// Week Number\n// -------------------------------------------------------------------------------------------------\n\n\n// Returns the week number, considering the locale's custom week number calcuation\n// `weeks` is an alias for `week`\nnewMomentProto.week = newMomentProto.weeks = function(input) {\n\tvar weekCalc = (this._locale || this._lang) // works pre-moment-2.8\n\t\t._fullCalendar_weekCalc;\n\n\tif (input == null && typeof weekCalc === 'function') { // custom function only works for getter\n\t\treturn weekCalc(this);\n\t}\n\telse if (weekCalc === 'ISO') {\n\t\treturn oldMomentProto.isoWeek.apply(this, arguments); // ISO getter/setter\n\t}\n\n\treturn oldMomentProto.week.apply(this, arguments); // local getter/setter\n};\n\n\n// Time-of-day\n// -------------------------------------------------------------------------------------------------\n\n// GETTER\n// Returns a Duration with the hours/minutes/seconds/ms values of the moment.\n// If the moment has an ambiguous time, a duration of 00:00 will be returned.\n//\n// SETTER\n// You can supply a Duration, a Moment, or a Duration-like argument.\n// When setting the time, and the moment has an ambiguous time, it then becomes unambiguous.\nnewMomentProto.time = function(time) {\n\n\t// Fallback to the original method (if there is one) if this moment wasn't created via FullCalendar.\n\t// `time` is a generic enough method name where this precaution is necessary to avoid collisions w/ other plugins.\n\tif (!this._fullCalendar) {\n\t\treturn oldMomentProto.time.apply(this, arguments);\n\t}\n\n\tif (time == null) { // getter\n\t\treturn moment.duration({\n\t\t\thours: this.hours(),\n\t\t\tminutes: this.minutes(),\n\t\t\tseconds: this.seconds(),\n\t\t\tmilliseconds: this.milliseconds()\n\t\t});\n\t}\n\telse { // setter\n\n\t\tthis._ambigTime = false; // mark that the moment now has a time\n\n\t\tif (!moment.isDuration(time) && !moment.isMoment(time)) {\n\t\t\ttime = moment.duration(time);\n\t\t}\n\n\t\t// The day value should cause overflow (so 24 hours becomes 00:00:00 of next day).\n\t\t// Only for Duration times, not Moment times.\n\t\tvar dayHours = 0;\n\t\tif (moment.isDuration(time)) {\n\t\t\tdayHours = Math.floor(time.asDays()) * 24;\n\t\t}\n\n\t\t// We need to set the individual fields.\n\t\t// Can't use startOf('day') then add duration. In case of DST at start of day.\n\t\treturn this.hours(dayHours + time.hours())\n\t\t\t.minutes(time.minutes())\n\t\t\t.seconds(time.seconds())\n\t\t\t.milliseconds(time.milliseconds());\n\t}\n};\n\n// Converts the moment to UTC, stripping out its time-of-day and timezone offset,\n// but preserving its YMD. A moment with a stripped time will display no time\n// nor timezone offset when .format() is called.\nnewMomentProto.stripTime = function() {\n\tvar a;\n\n\tif (!this._ambigTime) {\n\n\t\t// get the values before any conversion happens\n\t\ta = this.toArray(); // array of y/m/d/h/m/s/ms\n\n\t\t// TODO: use keepLocalTime in the future\n\t\tthis.utc(); // set the internal UTC flag (will clear the ambig flags)\n\t\tsetUTCValues(this, a.slice(0, 3)); // set the year/month/date. time will be zero\n\n\t\t// Mark the time as ambiguous. This needs to happen after the .utc() call, which might call .utcOffset(),\n\t\t// which clears all ambig flags. Same with setUTCValues with moment-timezone.\n\t\tthis._ambigTime = true;\n\t\tthis._ambigZone = true; // if ambiguous time, also ambiguous timezone offset\n\t}\n\n\treturn this; // for chaining\n};\n\n// Returns if the moment has a non-ambiguous time (boolean)\nnewMomentProto.hasTime = function() {\n\treturn !this._ambigTime;\n};\n\n\n// Timezone\n// -------------------------------------------------------------------------------------------------\n\n// Converts the moment to UTC, stripping out its timezone offset, but preserving its\n// YMD and time-of-day. A moment with a stripped timezone offset will display no\n// timezone offset when .format() is called.\n// TODO: look into Moment's keepLocalTime functionality\nnewMomentProto.stripZone = function() {\n\tvar a, wasAmbigTime;\n\n\tif (!this._ambigZone) {\n\n\t\t// get the values before any conversion happens\n\t\ta = this.toArray(); // array of y/m/d/h/m/s/ms\n\t\twasAmbigTime = this._ambigTime;\n\n\t\tthis.utc(); // set the internal UTC flag (might clear the ambig flags, depending on Moment internals)\n\t\tsetUTCValues(this, a); // will set the year/month/date/hours/minutes/seconds/ms\n\n\t\t// the above call to .utc()/.utcOffset() unfortunately might clear the ambig flags, so restore\n\t\tthis._ambigTime = wasAmbigTime || false;\n\n\t\t// Mark the zone as ambiguous. This needs to happen after the .utc() call, which might call .utcOffset(),\n\t\t// which clears the ambig flags. Same with setUTCValues with moment-timezone.\n\t\tthis._ambigZone = true;\n\t}\n\n\treturn this; // for chaining\n};\n\n// Returns of the moment has a non-ambiguous timezone offset (boolean)\nnewMomentProto.hasZone = function() {\n\treturn !this._ambigZone;\n};\n\n\n// this method implicitly marks a zone\nnewMomentProto.local = function() {\n\tvar a = this.toArray(); // year,month,date,hours,minutes,seconds,ms as an array\n\tvar wasAmbigZone = this._ambigZone;\n\n\toldMomentProto.local.apply(this, arguments);\n\n\t// ensure non-ambiguous\n\t// this probably already happened via local() -> utcOffset(), but don't rely on Moment's internals\n\tthis._ambigTime = false;\n\tthis._ambigZone = false;\n\n\tif (wasAmbigZone) {\n\t\t// If the moment was ambiguously zoned, the date fields were stored as UTC.\n\t\t// We want to preserve these, but in local time.\n\t\t// TODO: look into Moment's keepLocalTime functionality\n\t\tsetLocalValues(this, a);\n\t}\n\n\treturn this; // for chaining\n};\n\n\n// implicitly marks a zone\nnewMomentProto.utc = function() {\n\toldMomentProto.utc.apply(this, arguments);\n\n\t// ensure non-ambiguous\n\t// this probably already happened via utc() -> utcOffset(), but don't rely on Moment's internals\n\tthis._ambigTime = false;\n\tthis._ambigZone = false;\n\n\treturn this;\n};\n\n\n// methods for arbitrarily manipulating timezone offset.\n// should clear time/zone ambiguity when called.\n$.each([\n\t'zone', // only in moment-pre-2.9. deprecated afterwards\n\t'utcOffset'\n], function(i, name) {\n\tif (oldMomentProto[name]) { // original method exists?\n\n\t\t// this method implicitly marks a zone (will probably get called upon .utc() and .local())\n\t\tnewMomentProto[name] = function(tzo) {\n\n\t\t\tif (tzo != null) { // setter\n\t\t\t\t// these assignments needs to happen before the original zone method is called.\n\t\t\t\t// I forget why, something to do with a browser crash.\n\t\t\t\tthis._ambigTime = false;\n\t\t\t\tthis._ambigZone = false;\n\t\t\t}\n\n\t\t\treturn oldMomentProto[name].apply(this, arguments);\n\t\t};\n\t}\n});\n\n\n// Formatting\n// -------------------------------------------------------------------------------------------------\n\nnewMomentProto.format = function() {\n\tif (this._fullCalendar && arguments[0]) { // an enhanced moment? and a format string provided?\n\t\treturn formatDate(this, arguments[0]); // our extended formatting\n\t}\n\tif (this._ambigTime) {\n\t\treturn oldMomentFormat(this, 'YYYY-MM-DD');\n\t}\n\tif (this._ambigZone) {\n\t\treturn oldMomentFormat(this, 'YYYY-MM-DD[T]HH:mm:ss');\n\t}\n\treturn oldMomentProto.format.apply(this, arguments);\n};\n\nnewMomentProto.toISOString = function() {\n\tif (this._ambigTime) {\n\t\treturn oldMomentFormat(this, 'YYYY-MM-DD');\n\t}\n\tif (this._ambigZone) {\n\t\treturn oldMomentFormat(this, 'YYYY-MM-DD[T]HH:mm:ss');\n\t}\n\treturn oldMomentProto.toISOString.apply(this, arguments);\n};\n\n\n// Querying\n// -------------------------------------------------------------------------------------------------\n\n// Is the moment within the specified range? `end` is exclusive.\n// FYI, this method is not a standard Moment method, so always do our enhanced logic.\nnewMomentProto.isWithin = function(start, end) {\n\tvar a = commonlyAmbiguate([ this, start, end ]);\n\treturn a[0] >= a[1] && a[0] < a[2];\n};\n\n// When isSame is called with units, timezone ambiguity is normalized before the comparison happens.\n// If no units specified, the two moments must be identically the same, with matching ambig flags.\nnewMomentProto.isSame = function(input, units) {\n\tvar a;\n\n\t// only do custom logic if this is an enhanced moment\n\tif (!this._fullCalendar) {\n\t\treturn oldMomentProto.isSame.apply(this, arguments);\n\t}\n\n\tif (units) {\n\t\ta = commonlyAmbiguate([ this, input ], true); // normalize timezones but don't erase times\n\t\treturn oldMomentProto.isSame.call(a[0], a[1], units);\n\t}\n\telse {\n\t\tinput = fc.moment.parseZone(input); // normalize input\n\t\treturn oldMomentProto.isSame.call(this, input) &&\n\t\t\tBoolean(this._ambigTime) === Boolean(input._ambigTime) &&\n\t\t\tBoolean(this._ambigZone) === Boolean(input._ambigZone);\n\t}\n};\n\n// Make these query methods work with ambiguous moments\n$.each([\n\t'isBefore',\n\t'isAfter'\n], function(i, methodName) {\n\tnewMomentProto[methodName] = function(input, units) {\n\t\tvar a;\n\n\t\t// only do custom logic if this is an enhanced moment\n\t\tif (!this._fullCalendar) {\n\t\t\treturn oldMomentProto[methodName].apply(this, arguments);\n\t\t}\n\n\t\ta = commonlyAmbiguate([ this, input ]);\n\t\treturn oldMomentProto[methodName].call(a[0], a[1], units);\n\t};\n});\n\n\n// Misc Internals\n// -------------------------------------------------------------------------------------------------\n\n// given an array of moment-like inputs, return a parallel array w/ moments similarly ambiguated.\n// for example, of one moment has ambig time, but not others, all moments will have their time stripped.\n// set `preserveTime` to `true` to keep times, but only normalize zone ambiguity.\n// returns the original moments if no modifications are necessary.\nfunction commonlyAmbiguate(inputs, preserveTime) {\n\tvar anyAmbigTime = false;\n\tvar anyAmbigZone = false;\n\tvar len = inputs.length;\n\tvar moms = [];\n\tvar i, mom;\n\n\t// parse inputs into real moments and query their ambig flags\n\tfor (i = 0; i < len; i++) {\n\t\tmom = inputs[i];\n\t\tif (!moment.isMoment(mom)) {\n\t\t\tmom = fc.moment.parseZone(mom);\n\t\t}\n\t\tanyAmbigTime = anyAmbigTime || mom._ambigTime;\n\t\tanyAmbigZone = anyAmbigZone || mom._ambigZone;\n\t\tmoms.push(mom);\n\t}\n\n\t// strip each moment down to lowest common ambiguity\n\t// use clones to avoid modifying the original moments\n\tfor (i = 0; i < len; i++) {\n\t\tmom = moms[i];\n\t\tif (!preserveTime && anyAmbigTime && !mom._ambigTime) {\n\t\t\tmoms[i] = mom.clone().stripTime();\n\t\t}\n\t\telse if (anyAmbigZone && !mom._ambigZone) {\n\t\t\tmoms[i] = mom.clone().stripZone();\n\t\t}\n\t}\n\n\treturn moms;\n}\n\n// Transfers all the flags related to ambiguous time/zone from the `src` moment to the `dest` moment\n// TODO: look into moment.momentProperties for this.\nfunction transferAmbigs(src, dest) {\n\tif (src._ambigTime) {\n\t\tdest._ambigTime = true;\n\t}\n\telse if (dest._ambigTime) {\n\t\tdest._ambigTime = false;\n\t}\n\n\tif (src._ambigZone) {\n\t\tdest._ambigZone = true;\n\t}\n\telse if (dest._ambigZone) {\n\t\tdest._ambigZone = false;\n\t}\n}\n\n\n// Sets the year/month/date/etc values of the moment from the given array.\n// Inefficient because it calls each individual setter.\nfunction setMomentValues(mom, a) {\n\tmom.year(a[0] || 0)\n\t\t.month(a[1] || 0)\n\t\t.date(a[2] || 0)\n\t\t.hours(a[3] || 0)\n\t\t.minutes(a[4] || 0)\n\t\t.seconds(a[5] || 0)\n\t\t.milliseconds(a[6] || 0);\n}\n\n// Can we set the moment's internal date directly?\nallowValueOptimization = '_d' in moment() && 'updateOffset' in moment;\n\n// Utility function. Accepts a moment and an array of the UTC year/month/date/etc values to set.\n// Assumes the given moment is already in UTC mode.\nsetUTCValues = allowValueOptimization ? function(mom, a) {\n\t// simlate what moment's accessors do\n\tmom._d.setTime(Date.UTC.apply(Date, a));\n\tmoment.updateOffset(mom, false); // keepTime=false\n} : setMomentValues;\n\n// Utility function. Accepts a moment and an array of the local year/month/date/etc values to set.\n// Assumes the given moment is already in local mode.\nsetLocalValues = allowValueOptimization ? function(mom, a) {\n\t// simlate what moment's accessors do\n\tmom._d.setTime(+new Date( // FYI, there is now way to apply an array of args to a constructor\n\t\ta[0] || 0,\n\t\ta[1] || 0,\n\t\ta[2] || 0,\n\t\ta[3] || 0,\n\t\ta[4] || 0,\n\t\ta[5] || 0,\n\t\ta[6] || 0\n\t));\n\tmoment.updateOffset(mom, false); // keepTime=false\n} : setMomentValues;\n\n;;\n\n// Single Date Formatting\n// -------------------------------------------------------------------------------------------------\n\n\n// call this if you want Moment's original format method to be used\nfunction oldMomentFormat(mom, formatStr) {\n\treturn oldMomentProto.format.call(mom, formatStr); // oldMomentProto defined in moment-ext.js\n}\n\n\n// Formats `date` with a Moment formatting string, but allow our non-zero areas and\n// additional token.\nfunction formatDate(date, formatStr) {\n\treturn formatDateWithChunks(date, getFormatStringChunks(formatStr));\n}\n\n\nfunction formatDateWithChunks(date, chunks) {\n\tvar s = '';\n\tvar i;\n\n\tfor (i=0; i<chunks.length; i++) {\n\t\ts += formatDateWithChunk(date, chunks[i]);\n\t}\n\n\treturn s;\n}\n\n\n// addition formatting tokens we want recognized\nvar tokenOverrides = {\n\tt: function(date) { // \"a\" or \"p\"\n\t\treturn oldMomentFormat(date, 'a').charAt(0);\n\t},\n\tT: function(date) { // \"A\" or \"P\"\n\t\treturn oldMomentFormat(date, 'A').charAt(0);\n\t}\n};\n\n\nfunction formatDateWithChunk(date, chunk) {\n\tvar token;\n\tvar maybeStr;\n\n\tif (typeof chunk === 'string') { // a literal string\n\t\treturn chunk;\n\t}\n\telse if ((token = chunk.token)) { // a token, like \"YYYY\"\n\t\tif (tokenOverrides[token]) {\n\t\t\treturn tokenOverrides[token](date); // use our custom token\n\t\t}\n\t\treturn oldMomentFormat(date, token);\n\t}\n\telse if (chunk.maybe) { // a grouping of other chunks that must be non-zero\n\t\tmaybeStr = formatDateWithChunks(date, chunk.maybe);\n\t\tif (maybeStr.match(/[1-9]/)) {\n\t\t\treturn maybeStr;\n\t\t}\n\t}\n\n\treturn '';\n}\n\n\n// Date Range Formatting\n// -------------------------------------------------------------------------------------------------\n// TODO: make it work with timezone offset\n\n// Using a formatting string meant for a single date, generate a range string, like\n// \"Sep 2 - 9 2013\", that intelligently inserts a separator where the dates differ.\n// If the dates are the same as far as the format string is concerned, just return a single\n// rendering of one date, without any separator.\nfunction formatRange(date1, date2, formatStr, separator, isRTL) {\n\tvar localeData;\n\n\tdate1 = fc.moment.parseZone(date1);\n\tdate2 = fc.moment.parseZone(date2);\n\n\tlocaleData = (date1.localeData || date1.lang).call(date1); // works with moment-pre-2.8\n\n\t// Expand localized format strings, like \"LL\" -> \"MMMM D YYYY\"\n\tformatStr = localeData.longDateFormat(formatStr) || formatStr;\n\t// BTW, this is not important for `formatDate` because it is impossible to put custom tokens\n\t// or non-zero areas in Moment's localized format strings.\n\n\tseparator = separator || ' - ';\n\n\treturn formatRangeWithChunks(\n\t\tdate1,\n\t\tdate2,\n\t\tgetFormatStringChunks(formatStr),\n\t\tseparator,\n\t\tisRTL\n\t);\n}\nfc.formatRange = formatRange; // expose\n\n\nfunction formatRangeWithChunks(date1, date2, chunks, separator, isRTL) {\n\tvar chunkStr; // the rendering of the chunk\n\tvar leftI;\n\tvar leftStr = '';\n\tvar rightI;\n\tvar rightStr = '';\n\tvar middleI;\n\tvar middleStr1 = '';\n\tvar middleStr2 = '';\n\tvar middleStr = '';\n\n\t// Start at the leftmost side of the formatting string and continue until you hit a token\n\t// that is not the same between dates.\n\tfor (leftI=0; leftI<chunks.length; leftI++) {\n\t\tchunkStr = formatSimilarChunk(date1, date2, chunks[leftI]);\n\t\tif (chunkStr === false) {\n\t\t\tbreak;\n\t\t}\n\t\tleftStr += chunkStr;\n\t}\n\n\t// Similarly, start at the rightmost side of the formatting string and move left\n\tfor (rightI=chunks.length-1; rightI>leftI; rightI--) {\n\t\tchunkStr = formatSimilarChunk(date1, date2, chunks[rightI]);\n\t\tif (chunkStr === false) {\n\t\t\tbreak;\n\t\t}\n\t\trightStr = chunkStr + rightStr;\n\t}\n\n\t// The area in the middle is different for both of the dates.\n\t// Collect them distinctly so we can jam them together later.\n\tfor (middleI=leftI; middleI<=rightI; middleI++) {\n\t\tmiddleStr1 += formatDateWithChunk(date1, chunks[middleI]);\n\t\tmiddleStr2 += formatDateWithChunk(date2, chunks[middleI]);\n\t}\n\n\tif (middleStr1 || middleStr2) {\n\t\tif (isRTL) {\n\t\t\tmiddleStr = middleStr2 + separator + middleStr1;\n\t\t}\n\t\telse {\n\t\t\tmiddleStr = middleStr1 + separator + middleStr2;\n\t\t}\n\t}\n\n\treturn leftStr + middleStr + rightStr;\n}\n\n\nvar similarUnitMap = {\n\tY: 'year',\n\tM: 'month',\n\tD: 'day', // day of month\n\td: 'day', // day of week\n\t// prevents a separator between anything time-related...\n\tA: 'second', // AM/PM\n\ta: 'second', // am/pm\n\tT: 'second', // A/P\n\tt: 'second', // a/p\n\tH: 'second', // hour (24)\n\th: 'second', // hour (12)\n\tm: 'second', // minute\n\ts: 'second' // second\n};\n// TODO: week maybe?\n\n\n// Given a formatting chunk, and given that both dates are similar in the regard the\n// formatting chunk is concerned, format date1 against `chunk`. Otherwise, return `false`.\nfunction formatSimilarChunk(date1, date2, chunk) {\n\tvar token;\n\tvar unit;\n\n\tif (typeof chunk === 'string') { // a literal string\n\t\treturn chunk;\n\t}\n\telse if ((token = chunk.token)) {\n\t\tunit = similarUnitMap[token.charAt(0)];\n\t\t// are the dates the same for this unit of measurement?\n\t\tif (unit && date1.isSame(date2, unit)) {\n\t\t\treturn oldMomentFormat(date1, token); // would be the same if we used `date2`\n\t\t\t// BTW, don't support custom tokens\n\t\t}\n\t}\n\n\treturn false; // the chunk is NOT the same for the two dates\n\t// BTW, don't support splitting on non-zero areas\n}\n\n\n// Chunking Utils\n// -------------------------------------------------------------------------------------------------\n\n\nvar formatStringChunkCache = {};\n\n\nfunction getFormatStringChunks(formatStr) {\n\tif (formatStr in formatStringChunkCache) {\n\t\treturn formatStringChunkCache[formatStr];\n\t}\n\treturn (formatStringChunkCache[formatStr] = chunkFormatString(formatStr));\n}\n\n\n// Break the formatting string into an array of chunks\nfunction chunkFormatString(formatStr) {\n\tvar chunks = [];\n\tvar chunker = /\\[([^\\]]*)\\]|\\(([^\\)]*)\\)|(LTS|LT|(\\w)\\4*o?)|([^\\w\\[\\(]+)/g; // TODO: more descrimination\n\tvar match;\n\n\twhile ((match = chunker.exec(formatStr))) {\n\t\tif (match[1]) { // a literal string inside [ ... ]\n\t\t\tchunks.push(match[1]);\n\t\t}\n\t\telse if (match[2]) { // non-zero formatting inside ( ... )\n\t\t\tchunks.push({ maybe: chunkFormatString(match[2]) });\n\t\t}\n\t\telse if (match[3]) { // a formatting token\n\t\t\tchunks.push({ token: match[3] });\n\t\t}\n\t\telse if (match[5]) { // an unenclosed literal string\n\t\t\tchunks.push(match[5]);\n\t\t}\n\t}\n\n\treturn chunks;\n}\n\n;;\n\nfc.Class = Class; // export\n\n// class that all other classes will inherit from\nfunction Class() { }\n\n// called upon a class to create a subclass\nClass.extend = function(members) {\n\tvar superClass = this;\n\tvar subClass;\n\n\tmembers = members || {};\n\n\t// ensure a constructor for the subclass, forwarding all arguments to the super-constructor if it doesn't exist\n\tif (hasOwnProp(members, 'constructor')) {\n\t\tsubClass = members.constructor;\n\t}\n\tif (typeof subClass !== 'function') {\n\t\tsubClass = members.constructor = function() {\n\t\t\tsuperClass.apply(this, arguments);\n\t\t};\n\t}\n\n\t// build the base prototype for the subclass, which is an new object chained to the superclass's prototype\n\tsubClass.prototype = createObject(superClass.prototype);\n\n\t// copy each member variable/method onto the the subclass's prototype\n\tcopyOwnProps(members, subClass.prototype);\n\tcopyNativeMethods(members, subClass.prototype); // hack for IE8\n\n\t// copy over all class variables/methods to the subclass, such as `extend` and `mixin`\n\tcopyOwnProps(superClass, subClass);\n\n\treturn subClass;\n};\n\n// adds new member variables/methods to the class's prototype.\n// can be called with another class, or a plain object hash containing new members.\nClass.mixin = function(members) {\n\tcopyOwnProps(members.prototype || members, this.prototype);\n};\n;;\n\n/* A rectangular panel that is absolutely positioned over other content\n------------------------------------------------------------------------------------------------------------------------\nOptions:\n\t- className (string)\n\t- content (HTML string or jQuery element set)\n\t- parentEl\n\t- top\n\t- left\n\t- right (the x coord of where the right edge should be. not a \"CSS\" right)\n\t- autoHide (boolean)\n\t- show (callback)\n\t- hide (callback)\n*/\n\nvar Popover = Class.extend({\n\n\tisHidden: true,\n\toptions: null,\n\tel: null, // the container element for the popover. generated by this object\n\tdocumentMousedownProxy: null, // document mousedown handler bound to `this`\n\tmargin: 10, // the space required between the popover and the edges of the scroll container\n\n\n\tconstructor: function(options) {\n\t\tthis.options = options || {};\n\t},\n\n\n\t// Shows the popover on the specified position. Renders it if not already\n\tshow: function() {\n\t\tif (this.isHidden) {\n\t\t\tif (!this.el) {\n\t\t\t\tthis.render();\n\t\t\t}\n\t\t\tthis.el.show();\n\t\t\tthis.position();\n\t\t\tthis.isHidden = false;\n\t\t\tthis.trigger('show');\n\t\t}\n\t},\n\n\n\t// Hides the popover, through CSS, but does not remove it from the DOM\n\thide: function() {\n\t\tif (!this.isHidden) {\n\t\t\tthis.el.hide();\n\t\t\tthis.isHidden = true;\n\t\t\tthis.trigger('hide');\n\t\t}\n\t},\n\n\n\t// Creates `this.el` and renders content inside of it\n\trender: function() {\n\t\tvar _this = this;\n\t\tvar options = this.options;\n\n\t\tthis.el = $('<div class=\"fc-popover\"/>')\n\t\t\t.addClass(options.className || '')\n\t\t\t.css({\n\t\t\t\t// position initially to the top left to avoid creating scrollbars\n\t\t\t\ttop: 0,\n\t\t\t\tleft: 0\n\t\t\t})\n\t\t\t.append(options.content)\n\t\t\t.appendTo(options.parentEl);\n\n\t\t// when a click happens on anything inside with a 'fc-close' className, hide the popover\n\t\tthis.el.on('click', '.fc-close', function() {\n\t\t\t_this.hide();\n\t\t});\n\n\t\tif (options.autoHide) {\n\t\t\t$(document).on('mousedown', this.documentMousedownProxy = proxy(this, 'documentMousedown'));\n\t\t}\n\t},\n\n\n\t// Triggered when the user clicks *anywhere* in the document, for the autoHide feature\n\tdocumentMousedown: function(ev) {\n\t\t// only hide the popover if the click happened outside the popover\n\t\tif (this.el && !$(ev.target).closest(this.el).length) {\n\t\t\tthis.hide();\n\t\t}\n\t},\n\n\n\t// Hides and unregisters any handlers\n\tdestroy: function() {\n\t\tthis.hide();\n\n\t\tif (this.el) {\n\t\t\tthis.el.remove();\n\t\t\tthis.el = null;\n\t\t}\n\n\t\t$(document).off('mousedown', this.documentMousedownProxy);\n\t},\n\n\n\t// Positions the popover optimally, using the top/left/right options\n\tposition: function() {\n\t\tvar options = this.options;\n\t\tvar origin = this.el.offsetParent().offset();\n\t\tvar width = this.el.outerWidth();\n\t\tvar height = this.el.outerHeight();\n\t\tvar windowEl = $(window);\n\t\tvar viewportEl = getScrollParent(this.el);\n\t\tvar viewportTop;\n\t\tvar viewportLeft;\n\t\tvar viewportOffset;\n\t\tvar top; // the \"position\" (not \"offset\") values for the popover\n\t\tvar left; //\n\n\t\t// compute top and left\n\t\ttop = options.top || 0;\n\t\tif (options.left !== undefined) {\n\t\t\tleft = options.left;\n\t\t}\n\t\telse if (options.right !== undefined) {\n\t\t\tleft = options.right - width; // derive the left value from the right value\n\t\t}\n\t\telse {\n\t\t\tleft = 0;\n\t\t}\n\n\t\tif (viewportEl.is(window) || viewportEl.is(document)) { // normalize getScrollParent's result\n\t\t\tviewportEl = windowEl;\n\t\t\tviewportTop = 0; // the window is always at the top left\n\t\t\tviewportLeft = 0; // (and .offset() won't work if called here)\n\t\t}\n\t\telse {\n\t\t\tviewportOffset = viewportEl.offset();\n\t\t\tviewportTop = viewportOffset.top;\n\t\t\tviewportLeft = viewportOffset.left;\n\t\t}\n\n\t\t// if the window is scrolled, it causes the visible area to be further down\n\t\tviewportTop += windowEl.scrollTop();\n\t\tviewportLeft += windowEl.scrollLeft();\n\n\t\t// constrain to the view port. if constrained by two edges, give precedence to top/left\n\t\tif (options.viewportConstrain !== false) {\n\t\t\ttop = Math.min(top, viewportTop + viewportEl.outerHeight() - height - this.margin);\n\t\t\ttop = Math.max(top, viewportTop + this.margin);\n\t\t\tleft = Math.min(left, viewportLeft + viewportEl.outerWidth() - width - this.margin);\n\t\t\tleft = Math.max(left, viewportLeft + this.margin);\n\t\t}\n\n\t\tthis.el.css({\n\t\t\ttop: top - origin.top,\n\t\t\tleft: left - origin.left\n\t\t});\n\t},\n\n\n\t// Triggers a callback. Calls a function in the option hash of the same name.\n\t// Arguments beyond the first `name` are forwarded on.\n\t// TODO: better code reuse for this. Repeat code\n\ttrigger: function(name) {\n\t\tif (this.options[name]) {\n\t\t\tthis.options[name].apply(this, Array.prototype.slice.call(arguments, 1));\n\t\t}\n\t}\n\n});\n\n;;\n\n/* A \"coordinate map\" converts pixel coordinates into an associated cell, which has an associated date\n------------------------------------------------------------------------------------------------------------------------\nCommon interface:\n\n\tCoordMap.prototype = {\n\t\tbuild: function() {},\n\t\tgetCell: function(x, y) {}\n\t};\n\n*/\n\n/* Coordinate map for a grid component\n----------------------------------------------------------------------------------------------------------------------*/\n\nvar GridCoordMap = Class.extend({\n\n\tgrid: null, // reference to the Grid\n\trowCoords: null, // array of {top,bottom} objects\n\tcolCoords: null, // array of {left,right} objects\n\n\tcontainerEl: null, // container element that all coordinates are constrained to. optionally assigned\n\tbounds: null,\n\n\n\tconstructor: function(grid) {\n\t\tthis.grid = grid;\n\t},\n\n\n\t// Queries the grid for the coordinates of all the cells\n\tbuild: function() {\n\t\tthis.rowCoords = this.grid.computeRowCoords();\n\t\tthis.colCoords = this.grid.computeColCoords();\n\t\tthis.computeBounds();\n\t},\n\n\n\t// Clears the coordinates data to free up memory\n\tclear: function() {\n\t\tthis.rowCoords = null;\n\t\tthis.colCoords = null;\n\t},\n\n\n\t// Given a coordinate of the document, gets the associated cell. If no cell is underneath, returns null\n\tgetCell: function(x, y) {\n\t\tvar rowCoords = this.rowCoords;\n\t\tvar rowCnt = rowCoords.length;\n\t\tvar colCoords = this.colCoords;\n\t\tvar colCnt = colCoords.length;\n\t\tvar hitRow = null;\n\t\tvar hitCol = null;\n\t\tvar i, coords;\n\t\tvar cell;\n\n\t\tif (this.inBounds(x, y)) {\n\n\t\t\tfor (i = 0; i < rowCnt; i++) {\n\t\t\t\tcoords = rowCoords[i];\n\t\t\t\tif (y >= coords.top && y < coords.bottom) {\n\t\t\t\t\thitRow = i;\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tfor (i = 0; i < colCnt; i++) {\n\t\t\t\tcoords = colCoords[i];\n\t\t\t\tif (x >= coords.left && x < coords.right) {\n\t\t\t\t\thitCol = i;\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tif (hitRow !== null && hitCol !== null) {\n\n\t\t\t\tcell = this.grid.getCell(hitRow, hitCol); // expected to return a fresh object we can modify\n\t\t\t\tcell.grid = this.grid; // for CellDragListener's isCellsEqual. dragging between grids\n\n\t\t\t\t// make the coordinates available on the cell object\n\t\t\t\t$.extend(cell, rowCoords[hitRow], colCoords[hitCol]);\n\n\t\t\t\treturn cell;\n\t\t\t}\n\t\t}\n\n\t\treturn null;\n\t},\n\n\n\t// If there is a containerEl, compute the bounds into min/max values\n\tcomputeBounds: function() {\n\t\tthis.bounds = this.containerEl ?\n\t\t\tgetClientRect(this.containerEl) : // area within scrollbars\n\t\t\tnull;\n\t},\n\n\n\t// Determines if the given coordinates are in bounds. If no `containerEl`, always true\n\tinBounds: function(x, y) {\n\t\tvar bounds = this.bounds;\n\n\t\tif (bounds) {\n\t\t\treturn x >= bounds.left && x < bounds.right && y >= bounds.top && y < bounds.bottom;\n\t\t}\n\n\t\treturn true;\n\t}\n\n});\n\n\n/* Coordinate map that is a combination of multiple other coordinate maps\n----------------------------------------------------------------------------------------------------------------------*/\n\nvar ComboCoordMap = Class.extend({\n\n\tcoordMaps: null, // an array of CoordMaps\n\n\n\tconstructor: function(coordMaps) {\n\t\tthis.coordMaps = coordMaps;\n\t},\n\n\n\t// Builds all coordMaps\n\tbuild: function() {\n\t\tvar coordMaps = this.coordMaps;\n\t\tvar i;\n\n\t\tfor (i = 0; i < coordMaps.length; i++) {\n\t\t\tcoordMaps[i].build();\n\t\t}\n\t},\n\n\n\t// Queries all coordMaps for the cell underneath the given coordinates, returning the first result\n\tgetCell: function(x, y) {\n\t\tvar coordMaps = this.coordMaps;\n\t\tvar cell = null;\n\t\tvar i;\n\n\t\tfor (i = 0; i < coordMaps.length && !cell; i++) {\n\t\t\tcell = coordMaps[i].getCell(x, y);\n\t\t}\n\n\t\treturn cell;\n\t},\n\n\n\t// Clears all coordMaps\n\tclear: function() {\n\t\tvar coordMaps = this.coordMaps;\n\t\tvar i;\n\n\t\tfor (i = 0; i < coordMaps.length; i++) {\n\t\t\tcoordMaps[i].clear();\n\t\t}\n\t}\n\n});\n\n;;\n\n/* Tracks a drag's mouse movement, firing various handlers\n----------------------------------------------------------------------------------------------------------------------*/\n\nvar DragListener = fc.DragListener = Class.extend({\n\n\toptions: null,\n\n\tisListening: false,\n\tisDragging: false,\n\n\t// coordinates of the initial mousedown\n\toriginX: null,\n\toriginY: null,\n\n\t// handler attached to the document, bound to the DragListener's `this`\n\tmousemoveProxy: null,\n\tmouseupProxy: null,\n\n\t// for IE8 bug-fighting behavior, for now\n\tsubjectEl: null, // the element being draged. optional\n\tsubjectHref: null,\n\n\tscrollEl: null,\n\tscrollBounds: null, // { top, bottom, left, right }\n\tscrollTopVel: null, // pixels per second\n\tscrollLeftVel: null, // pixels per second\n\tscrollIntervalId: null, // ID of setTimeout for scrolling animation loop\n\tscrollHandlerProxy: null, // this-scoped function for handling when scrollEl is scrolled\n\n\tscrollSensitivity: 30, // pixels from edge for scrolling to start\n\tscrollSpeed: 200, // pixels per second, at maximum speed\n\tscrollIntervalMs: 50, // millisecond wait between scroll increment\n\n\n\tconstructor: function(options) {\n\t\toptions = options || {};\n\t\tthis.options = options;\n\t\tthis.subjectEl = options.subjectEl;\n\t},\n\n\n\t// Call this when the user does a mousedown. Will probably lead to startListening\n\tmousedown: function(ev) {\n\t\tif (isPrimaryMouseButton(ev)) {\n\n\t\t\tev.preventDefault(); // prevents native selection in most browsers\n\n\t\t\tthis.startListening(ev);\n\n\t\t\t// start the drag immediately if there is no minimum distance for a drag start\n\t\t\tif (!this.options.distance) {\n\t\t\t\tthis.startDrag(ev);\n\t\t\t}\n\t\t}\n\t},\n\n\n\t// Call this to start tracking mouse movements\n\tstartListening: function(ev) {\n\t\tvar scrollParent;\n\n\t\tif (!this.isListening) {\n\n\t\t\t// grab scroll container and attach handler\n\t\t\tif (ev && this.options.scroll) {\n\t\t\t\tscrollParent = getScrollParent($(ev.target));\n\t\t\t\tif (!scrollParent.is(window) && !scrollParent.is(document)) {\n\t\t\t\t\tthis.scrollEl = scrollParent;\n\n\t\t\t\t\t// scope to `this`, and use `debounce` to make sure rapid calls don't happen\n\t\t\t\t\tthis.scrollHandlerProxy = debounce(proxy(this, 'scrollHandler'), 100);\n\t\t\t\t\tthis.scrollEl.on('scroll', this.scrollHandlerProxy);\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t$(document)\n\t\t\t\t.on('mousemove', this.mousemoveProxy = proxy(this, 'mousemove'))\n\t\t\t\t.on('mouseup', this.mouseupProxy = proxy(this, 'mouseup'))\n\t\t\t\t.on('selectstart', this.preventDefault); // prevents native selection in IE<=8\n\n\t\t\tif (ev) {\n\t\t\t\tthis.originX = ev.pageX;\n\t\t\t\tthis.originY = ev.pageY;\n\t\t\t}\n\t\t\telse {\n\t\t\t\t// if no starting information was given, origin will be the topleft corner of the screen.\n\t\t\t\t// if so, dx/dy in the future will be the absolute coordinates.\n\t\t\t\tthis.originX = 0;\n\t\t\t\tthis.originY = 0;\n\t\t\t}\n\n\t\t\tthis.isListening = true;\n\t\t\tthis.listenStart(ev);\n\t\t}\n\t},\n\n\n\t// Called when drag listening has started (but a real drag has not necessarily began)\n\tlistenStart: function(ev) {\n\t\tthis.trigger('listenStart', ev);\n\t},\n\n\n\t// Called when the user moves the mouse\n\tmousemove: function(ev) {\n\t\tvar dx = ev.pageX - this.originX;\n\t\tvar dy = ev.pageY - this.originY;\n\t\tvar minDistance;\n\t\tvar distanceSq; // current distance from the origin, squared\n\n\t\tif (!this.isDragging) { // if not already dragging...\n\t\t\t// then start the drag if the minimum distance criteria is met\n\t\t\tminDistance = this.options.distance || 1;\n\t\t\tdistanceSq = dx * dx + dy * dy;\n\t\t\tif (distanceSq >= minDistance * minDistance) { // use pythagorean theorem\n\t\t\t\tthis.startDrag(ev);\n\t\t\t}\n\t\t}\n\n\t\tif (this.isDragging) {\n\t\t\tthis.drag(dx, dy, ev); // report a drag, even if this mousemove initiated the drag\n\t\t}\n\t},\n\n\n\t// Call this to initiate a legitimate drag.\n\t// This function is called internally from this class, but can also be called explicitly from outside\n\tstartDrag: function(ev) {\n\n\t\tif (!this.isListening) { // startDrag must have manually initiated\n\t\t\tthis.startListening();\n\t\t}\n\n\t\tif (!this.isDragging) {\n\t\t\tthis.isDragging = true;\n\t\t\tthis.dragStart(ev);\n\t\t}\n\t},\n\n\n\t// Called when the actual drag has started (went beyond minDistance)\n\tdragStart: function(ev) {\n\t\tvar subjectEl = this.subjectEl;\n\n\t\tthis.trigger('dragStart', ev);\n\n\t\t// remove a mousedown'd <a>'s href so it is not visited (IE8 bug)\n\t\tif ((this.subjectHref = subjectEl ? subjectEl.attr('href') : null)) {\n\t\t\tsubjectEl.removeAttr('href');\n\t\t}\n\t},\n\n\n\t// Called while the mouse is being moved and when we know a legitimate drag is taking place\n\tdrag: function(dx, dy, ev) {\n\t\tthis.trigger('drag', dx, dy, ev);\n\t\tthis.updateScroll(ev); // will possibly cause scrolling\n\t},\n\n\n\t// Called when the user does a mouseup\n\tmouseup: function(ev) {\n\t\tthis.stopListening(ev);\n\t},\n\n\n\t// Called when the drag is over. Will not cause listening to stop however.\n\t// A concluding 'cellOut' event will NOT be triggered.\n\tstopDrag: function(ev) {\n\t\tif (this.isDragging) {\n\t\t\tthis.stopScrolling();\n\t\t\tthis.dragStop(ev);\n\t\t\tthis.isDragging = false;\n\t\t}\n\t},\n\n\n\t// Called when dragging has been stopped\n\tdragStop: function(ev) {\n\t\tvar _this = this;\n\n\t\tthis.trigger('dragStop', ev);\n\n\t\t// restore a mousedown'd <a>'s href (for IE8 bug)\n\t\tsetTimeout(function() { // must be outside of the click's execution\n\t\t\tif (_this.subjectHref) {\n\t\t\t\t_this.subjectEl.attr('href', _this.subjectHref);\n\t\t\t}\n\t\t}, 0);\n\t},\n\n\n\t// Call this to stop listening to the user's mouse events\n\tstopListening: function(ev) {\n\t\tthis.stopDrag(ev); // if there's a current drag, kill it\n\n\t\tif (this.isListening) {\n\n\t\t\t// remove the scroll handler if there is a scrollEl\n\t\t\tif (this.scrollEl) {\n\t\t\t\tthis.scrollEl.off('scroll', this.scrollHandlerProxy);\n\t\t\t\tthis.scrollHandlerProxy = null;\n\t\t\t}\n\n\t\t\t$(document)\n\t\t\t\t.off('mousemove', this.mousemoveProxy)\n\t\t\t\t.off('mouseup', this.mouseupProxy)\n\t\t\t\t.off('selectstart', this.preventDefault);\n\n\t\t\tthis.mousemoveProxy = null;\n\t\t\tthis.mouseupProxy = null;\n\n\t\t\tthis.isListening = false;\n\t\t\tthis.listenStop(ev);\n\t\t}\n\t},\n\n\n\t// Called when drag listening has stopped\n\tlistenStop: function(ev) {\n\t\tthis.trigger('listenStop', ev);\n\t},\n\n\n\t// Triggers a callback. Calls a function in the option hash of the same name.\n\t// Arguments beyond the first `name` are forwarded on.\n\ttrigger: function(name) {\n\t\tif (this.options[name]) {\n\t\t\tthis.options[name].apply(this, Array.prototype.slice.call(arguments, 1));\n\t\t}\n\t},\n\n\n\t// Stops a given mouse event from doing it's native browser action. In our case, text selection.\n\tpreventDefault: function(ev) {\n\t\tev.preventDefault();\n\t},\n\n\n\t/* Scrolling\n\t------------------------------------------------------------------------------------------------------------------*/\n\n\n\t// Computes and stores the bounding rectangle of scrollEl\n\tcomputeScrollBounds: function() {\n\t\tvar el = this.scrollEl;\n\n\t\tthis.scrollBounds = el ? getOuterRect(el) : null;\n\t\t\t// TODO: use getClientRect in future. but prevents auto scrolling when on top of scrollbars\n\t},\n\n\n\t// Called when the dragging is in progress and scrolling should be updated\n\tupdateScroll: function(ev) {\n\t\tvar sensitivity = this.scrollSensitivity;\n\t\tvar bounds = this.scrollBounds;\n\t\tvar topCloseness, bottomCloseness;\n\t\tvar leftCloseness, rightCloseness;\n\t\tvar topVel = 0;\n\t\tvar leftVel = 0;\n\n\t\tif (bounds) { // only scroll if scrollEl exists\n\n\t\t\t// compute closeness to edges. valid range is from 0.0 - 1.0\n\t\t\ttopCloseness = (sensitivity - (ev.pageY - bounds.top)) / sensitivity;\n\t\t\tbottomCloseness = (sensitivity - (bounds.bottom - ev.pageY)) / sensitivity;\n\t\t\tleftCloseness = (sensitivity - (ev.pageX - bounds.left)) / sensitivity;\n\t\t\trightCloseness = (sensitivity - (bounds.right - ev.pageX)) / sensitivity;\n\n\t\t\t// translate vertical closeness into velocity.\n\t\t\t// mouse must be completely in bounds for velocity to happen.\n\t\t\tif (topCloseness >= 0 && topCloseness <= 1) {\n\t\t\t\ttopVel = topCloseness * this.scrollSpeed * -1; // negative. for scrolling up\n\t\t\t}\n\t\t\telse if (bottomCloseness >= 0 && bottomCloseness <= 1) {\n\t\t\t\ttopVel = bottomCloseness * this.scrollSpeed;\n\t\t\t}\n\n\t\t\t// translate horizontal closeness into velocity\n\t\t\tif (leftCloseness >= 0 && leftCloseness <= 1) {\n\t\t\t\tleftVel = leftCloseness * this.scrollSpeed * -1; // negative. for scrolling left\n\t\t\t}\n\t\t\telse if (rightCloseness >= 0 && rightCloseness <= 1) {\n\t\t\t\tleftVel = rightCloseness * this.scrollSpeed;\n\t\t\t}\n\t\t}\n\n\t\tthis.setScrollVel(topVel, leftVel);\n\t},\n\n\n\t// Sets the speed-of-scrolling for the scrollEl\n\tsetScrollVel: function(topVel, leftVel) {\n\n\t\tthis.scrollTopVel = topVel;\n\t\tthis.scrollLeftVel = leftVel;\n\n\t\tthis.constrainScrollVel(); // massages into realistic values\n\n\t\t// if there is non-zero velocity, and an animation loop hasn't already started, then START\n\t\tif ((this.scrollTopVel || this.scrollLeftVel) && !this.scrollIntervalId) {\n\t\t\tthis.scrollIntervalId = setInterval(\n\t\t\t\tproxy(this, 'scrollIntervalFunc'), // scope to `this`\n\t\t\t\tthis.scrollIntervalMs\n\t\t\t);\n\t\t}\n\t},\n\n\n\t// Forces scrollTopVel and scrollLeftVel to be zero if scrolling has already gone all the way\n\tconstrainScrollVel: function() {\n\t\tvar el = this.scrollEl;\n\n\t\tif (this.scrollTopVel < 0) { // scrolling up?\n\t\t\tif (el.scrollTop() <= 0) { // already scrolled all the way up?\n\t\t\t\tthis.scrollTopVel = 0;\n\t\t\t}\n\t\t}\n\t\telse if (this.scrollTopVel > 0) { // scrolling down?\n\t\t\tif (el.scrollTop() + el[0].clientHeight >= el[0].scrollHeight) { // already scrolled all the way down?\n\t\t\t\tthis.scrollTopVel = 0;\n\t\t\t}\n\t\t}\n\n\t\tif (this.scrollLeftVel < 0) { // scrolling left?\n\t\t\tif (el.scrollLeft() <= 0) { // already scrolled all the left?\n\t\t\t\tthis.scrollLeftVel = 0;\n\t\t\t}\n\t\t}\n\t\telse if (this.scrollLeftVel > 0) { // scrolling right?\n\t\t\tif (el.scrollLeft() + el[0].clientWidth >= el[0].scrollWidth) { // already scrolled all the way right?\n\t\t\t\tthis.scrollLeftVel = 0;\n\t\t\t}\n\t\t}\n\t},\n\n\n\t// This function gets called during every iteration of the scrolling animation loop\n\tscrollIntervalFunc: function() {\n\t\tvar el = this.scrollEl;\n\t\tvar frac = this.scrollIntervalMs / 1000; // considering animation frequency, what the vel should be mult'd by\n\n\t\t// change the value of scrollEl's scroll\n\t\tif (this.scrollTopVel) {\n\t\t\tel.scrollTop(el.scrollTop() + this.scrollTopVel * frac);\n\t\t}\n\t\tif (this.scrollLeftVel) {\n\t\t\tel.scrollLeft(el.scrollLeft() + this.scrollLeftVel * frac);\n\t\t}\n\n\t\tthis.constrainScrollVel(); // since the scroll values changed, recompute the velocities\n\n\t\t// if scrolled all the way, which causes the vels to be zero, stop the animation loop\n\t\tif (!this.scrollTopVel && !this.scrollLeftVel) {\n\t\t\tthis.stopScrolling();\n\t\t}\n\t},\n\n\n\t// Kills any existing scrolling animation loop\n\tstopScrolling: function() {\n\t\tif (this.scrollIntervalId) {\n\t\t\tclearInterval(this.scrollIntervalId);\n\t\t\tthis.scrollIntervalId = null;\n\n\t\t\t// when all done with scrolling, recompute positions since they probably changed\n\t\t\tthis.scrollStop();\n\t\t}\n\t},\n\n\n\t// Get called when the scrollEl is scrolled (NOTE: this is delayed via debounce)\n\tscrollHandler: function() {\n\t\t// recompute all coordinates, but *only* if this is *not* part of our scrolling animation\n\t\tif (!this.scrollIntervalId) {\n\t\t\tthis.scrollStop();\n\t\t}\n\t},\n\n\n\t// Called when scrolling has stopped, whether through auto scroll, or the user scrolling\n\tscrollStop: function() {\n\t}\n\n});\n\n;;\n\n/* Tracks mouse movements over a CoordMap and raises events about which cell the mouse is over.\n------------------------------------------------------------------------------------------------------------------------\noptions:\n- subjectEl\n- subjectCenter\n*/\n\nvar CellDragListener = DragListener.extend({\n\n\tcoordMap: null, // converts coordinates to date cells\n\torigCell: null, // the cell the mouse was over when listening started\n\tcell: null, // the cell the mouse is over\n\tcoordAdjust: null, // delta that will be added to the mouse coordinates when computing collisions\n\n\n\tconstructor: function(coordMap, options) {\n\t\tDragListener.prototype.constructor.call(this, options); // call the super-constructor\n\n\t\tthis.coordMap = coordMap;\n\t},\n\n\n\t// Called when drag listening starts (but a real drag has not necessarily began).\n\t// ev might be undefined if dragging was started manually.\n\tlistenStart: function(ev) {\n\t\tvar subjectEl = this.subjectEl;\n\t\tvar subjectRect;\n\t\tvar origPoint;\n\t\tvar point;\n\n\t\tDragListener.prototype.listenStart.apply(this, arguments); // call the super-method\n\n\t\tthis.computeCoords();\n\n\t\tif (ev) {\n\t\t\torigPoint = { left: ev.pageX, top: ev.pageY };\n\t\t\tpoint = origPoint;\n\n\t\t\t// constrain the point to bounds of the element being dragged\n\t\t\tif (subjectEl) {\n\t\t\t\tsubjectRect = getOuterRect(subjectEl); // used for centering as well\n\t\t\t\tpoint = constrainPoint(point, subjectRect);\n\t\t\t}\n\n\t\t\tthis.origCell = this.getCell(point.left, point.top);\n\n\t\t\t// treat the center of the subject as the collision point?\n\t\t\tif (subjectEl && this.options.subjectCenter) {\n\n\t\t\t\t// only consider the area the subject overlaps the cell. best for large subjects\n\t\t\t\tif (this.origCell) {\n\t\t\t\t\tsubjectRect = intersectRects(this.origCell, subjectRect) ||\n\t\t\t\t\t\tsubjectRect; // in case there is no intersection\n\t\t\t\t}\n\n\t\t\t\tpoint = getRectCenter(subjectRect);\n\t\t\t}\n\n\t\t\tthis.coordAdjust = diffPoints(point, origPoint); // point - origPoint\n\t\t}\n\t\telse {\n\t\t\tthis.origCell = null;\n\t\t\tthis.coordAdjust = null;\n\t\t}\n\t},\n\n\n\t// Recomputes the drag-critical positions of elements\n\tcomputeCoords: function() {\n\t\tthis.coordMap.build();\n\t\tthis.computeScrollBounds();\n\t},\n\n\n\t// Called when the actual drag has started\n\tdragStart: function(ev) {\n\t\tvar cell;\n\n\t\tDragListener.prototype.dragStart.apply(this, arguments); // call the super-method\n\n\t\tcell = this.getCell(ev.pageX, ev.pageY); // might be different from this.origCell if the min-distance is large\n\n\t\t// report the initial cell the mouse is over\n\t\t// especially important if no min-distance and drag starts immediately\n\t\tif (cell) {\n\t\t\tthis.cellOver(cell);\n\t\t}\n\t},\n\n\n\t// Called when the drag moves\n\tdrag: function(dx, dy, ev) {\n\t\tvar cell;\n\n\t\tDragListener.prototype.drag.apply(this, arguments); // call the super-method\n\n\t\tcell = this.getCell(ev.pageX, ev.pageY);\n\n\t\tif (!isCellsEqual(cell, this.cell)) { // a different cell than before?\n\t\t\tif (this.cell) {\n\t\t\t\tthis.cellOut();\n\t\t\t}\n\t\t\tif (cell) {\n\t\t\t\tthis.cellOver(cell);\n\t\t\t}\n\t\t}\n\t},\n\n\n\t// Called when dragging has been stopped\n\tdragStop: function() {\n\t\tthis.cellDone();\n\t\tDragListener.prototype.dragStop.apply(this, arguments); // call the super-method\n\t},\n\n\n\t// Called when a the mouse has just moved over a new cell\n\tcellOver: function(cell) {\n\t\tthis.cell = cell;\n\t\tthis.trigger('cellOver', cell, isCellsEqual(cell, this.origCell), this.origCell);\n\t},\n\n\n\t// Called when the mouse has just moved out of a cell\n\tcellOut: function() {\n\t\tif (this.cell) {\n\t\t\tthis.trigger('cellOut', this.cell);\n\t\t\tthis.cellDone();\n\t\t\tthis.cell = null;\n\t\t}\n\t},\n\n\n\t// Called after a cellOut. Also called before a dragStop\n\tcellDone: function() {\n\t\tif (this.cell) {\n\t\t\tthis.trigger('cellDone', this.cell);\n\t\t}\n\t},\n\n\n\t// Called when drag listening has stopped\n\tlistenStop: function() {\n\t\tDragListener.prototype.listenStop.apply(this, arguments); // call the super-method\n\n\t\tthis.origCell = this.cell = null;\n\t\tthis.coordMap.clear();\n\t},\n\n\n\t// Called when scrolling has stopped, whether through auto scroll, or the user scrolling\n\tscrollStop: function() {\n\t\tDragListener.prototype.scrollStop.apply(this, arguments); // call the super-method\n\n\t\tthis.computeCoords(); // cells' absolute positions will be in new places. recompute\n\t},\n\n\n\t// Gets the cell underneath the coordinates for the given mouse event\n\tgetCell: function(left, top) {\n\n\t\tif (this.coordAdjust) {\n\t\t\tleft += this.coordAdjust.left;\n\t\t\ttop += this.coordAdjust.top;\n\t\t}\n\n\t\treturn this.coordMap.getCell(left, top);\n\t}\n\n});\n\n\n// Returns `true` if the cells are identically equal. `false` otherwise.\n// They must have the same row, col, and be from the same grid.\n// Two null values will be considered equal, as two \"out of the grid\" states are the same.\nfunction isCellsEqual(cell1, cell2) {\n\n\tif (!cell1 && !cell2) {\n\t\treturn true;\n\t}\n\n\tif (cell1 && cell2) {\n\t\treturn cell1.grid === cell2.grid &&\n\t\t\tcell1.row === cell2.row &&\n\t\t\tcell1.col === cell2.col;\n\t}\n\n\treturn false;\n}\n\n;;\n\n/* Creates a clone of an element and lets it track the mouse as it moves\n----------------------------------------------------------------------------------------------------------------------*/\n\nvar MouseFollower = Class.extend({\n\n\toptions: null,\n\n\tsourceEl: null, // the element that will be cloned and made to look like it is dragging\n\tel: null, // the clone of `sourceEl` that will track the mouse\n\tparentEl: null, // the element that `el` (the clone) will be attached to\n\n\t// the initial position of el, relative to the offset parent. made to match the initial offset of sourceEl\n\ttop0: null,\n\tleft0: null,\n\n\t// the initial position of the mouse\n\tmouseY0: null,\n\tmouseX0: null,\n\n\t// the number of pixels the mouse has moved from its initial position\n\ttopDelta: null,\n\tleftDelta: null,\n\n\tmousemoveProxy: null, // document mousemove handler, bound to the MouseFollower's `this`\n\n\tisFollowing: false,\n\tisHidden: false,\n\tisAnimating: false, // doing the revert animation?\n\n\tconstructor: function(sourceEl, options) {\n\t\tthis.options = options = options || {};\n\t\tthis.sourceEl = sourceEl;\n\t\tthis.parentEl = options.parentEl ? $(options.parentEl) : sourceEl.parent(); // default to sourceEl's parent\n\t},\n\n\n\t// Causes the element to start following the mouse\n\tstart: function(ev) {\n\t\tif (!this.isFollowing) {\n\t\t\tthis.isFollowing = true;\n\n\t\t\tthis.mouseY0 = ev.pageY;\n\t\t\tthis.mouseX0 = ev.pageX;\n\t\t\tthis.topDelta = 0;\n\t\t\tthis.leftDelta = 0;\n\n\t\t\tif (!this.isHidden) {\n\t\t\t\tthis.updatePosition();\n\t\t\t}\n\n\t\t\t$(document).on('mousemove', this.mousemoveProxy = proxy(this, 'mousemove'));\n\t\t}\n\t},\n\n\n\t// Causes the element to stop following the mouse. If shouldRevert is true, will animate back to original position.\n\t// `callback` gets invoked when the animation is complete. If no animation, it is invoked immediately.\n\tstop: function(shouldRevert, callback) {\n\t\tvar _this = this;\n\t\tvar revertDuration = this.options.revertDuration;\n\n\t\tfunction complete() {\n\t\t\tthis.isAnimating = false;\n\t\t\t_this.destroyEl();\n\n\t\t\tthis.top0 = this.left0 = null; // reset state for future updatePosition calls\n\n\t\t\tif (callback) {\n\t\t\t\tcallback();\n\t\t\t}\n\t\t}\n\n\t\tif (this.isFollowing && !this.isAnimating) { // disallow more than one stop animation at a time\n\t\t\tthis.isFollowing = false;\n\n\t\t\t$(document).off('mousemove', this.mousemoveProxy);\n\n\t\t\tif (shouldRevert && revertDuration && !this.isHidden) { // do a revert animation?\n\t\t\t\tthis.isAnimating = true;\n\t\t\t\tthis.el.animate({\n\t\t\t\t\ttop: this.top0,\n\t\t\t\t\tleft: this.left0\n\t\t\t\t}, {\n\t\t\t\t\tduration: revertDuration,\n\t\t\t\t\tcomplete: complete\n\t\t\t\t});\n\t\t\t}\n\t\t\telse {\n\t\t\t\tcomplete();\n\t\t\t}\n\t\t}\n\t},\n\n\n\t// Gets the tracking element. Create it if necessary\n\tgetEl: function() {\n\t\tvar el = this.el;\n\n\t\tif (!el) {\n\t\t\tthis.sourceEl.width(); // hack to force IE8 to compute correct bounding box\n\t\t\tel = this.el = this.sourceEl.clone()\n\t\t\t\t.css({\n\t\t\t\t\tposition: 'absolute',\n\t\t\t\t\tvisibility: '', // in case original element was hidden (commonly through hideEvents())\n\t\t\t\t\tdisplay: this.isHidden ? 'none' : '', // for when initially hidden\n\t\t\t\t\tmargin: 0,\n\t\t\t\t\tright: 'auto', // erase and set width instead\n\t\t\t\t\tbottom: 'auto', // erase and set height instead\n\t\t\t\t\twidth: this.sourceEl.width(), // explicit height in case there was a 'right' value\n\t\t\t\t\theight: this.sourceEl.height(), // explicit width in case there was a 'bottom' value\n\t\t\t\t\topacity: this.options.opacity || '',\n\t\t\t\t\tzIndex: this.options.zIndex\n\t\t\t\t})\n\t\t\t\t.appendTo(this.parentEl);\n\t\t}\n\n\t\treturn el;\n\t},\n\n\n\t// Removes the tracking element if it has already been created\n\tdestroyEl: function() {\n\t\tif (this.el) {\n\t\t\tthis.el.remove();\n\t\t\tthis.el = null;\n\t\t}\n\t},\n\n\n\t// Update the CSS position of the tracking element\n\tupdatePosition: function() {\n\t\tvar sourceOffset;\n\t\tvar origin;\n\n\t\tthis.getEl(); // ensure this.el\n\n\t\t// make sure origin info was computed\n\t\tif (this.top0 === null) {\n\t\t\tthis.sourceEl.width(); // hack to force IE8 to compute correct bounding box\n\t\t\tsourceOffset = this.sourceEl.offset();\n\t\t\torigin = this.el.offsetParent().offset();\n\t\t\tthis.top0 = sourceOffset.top - origin.top;\n\t\t\tthis.left0 = sourceOffset.left - origin.left;\n\t\t}\n\n\t\tthis.el.css({\n\t\t\ttop: this.top0 + this.topDelta,\n\t\t\tleft: this.left0 + this.leftDelta\n\t\t});\n\t},\n\n\n\t// Gets called when the user moves the mouse\n\tmousemove: function(ev) {\n\t\tthis.topDelta = ev.pageY - this.mouseY0;\n\t\tthis.leftDelta = ev.pageX - this.mouseX0;\n\n\t\tif (!this.isHidden) {\n\t\t\tthis.updatePosition();\n\t\t}\n\t},\n\n\n\t// Temporarily makes the tracking element invisible. Can be called before following starts\n\thide: function() {\n\t\tif (!this.isHidden) {\n\t\t\tthis.isHidden = true;\n\t\t\tif (this.el) {\n\t\t\t\tthis.el.hide();\n\t\t\t}\n\t\t}\n\t},\n\n\n\t// Show the tracking element after it has been temporarily hidden\n\tshow: function() {\n\t\tif (this.isHidden) {\n\t\t\tthis.isHidden = false;\n\t\t\tthis.updatePosition();\n\t\t\tthis.getEl().show();\n\t\t}\n\t}\n\n});\n\n;;\n\n/* A utility class for rendering <tr> rows.\n----------------------------------------------------------------------------------------------------------------------*/\n// It leverages methods of the subclass and the View to determine custom rendering behavior for each row \"type\"\n// (such as highlight rows, day rows, helper rows, etc).\n\nvar RowRenderer = Class.extend({\n\n\tview: null, // a View object\n\tisRTL: null, // shortcut to the view's isRTL option\n\tcellHtml: '<td/>', // plain default HTML used for a cell when no other is available\n\n\n\tconstructor: function(view) {\n\t\tthis.view = view;\n\t\tthis.isRTL = view.opt('isRTL');\n\t},\n\n\n\t// Renders the HTML for a row, leveraging custom cell-HTML-renderers based on the `rowType`.\n\t// Also applies the \"intro\" and \"outro\" cells, which are specified by the subclass and views.\n\t// `row` is an optional row number.\n\trowHtml: function(rowType, row) {\n\t\tvar renderCell = this.getHtmlRenderer('cell', rowType);\n\t\tvar rowCellHtml = '';\n\t\tvar col;\n\t\tvar cell;\n\n\t\trow = row || 0;\n\n\t\tfor (col = 0; col < this.colCnt; col++) {\n\t\t\tcell = this.getCell(row, col);\n\t\t\trowCellHtml += renderCell(cell);\n\t\t}\n\n\t\trowCellHtml = this.bookendCells(rowCellHtml, rowType, row); // apply intro and outro\n\n\t\treturn '<tr>' + rowCellHtml + '</tr>';\n\t},\n\n\n\t// Applies the \"intro\" and \"outro\" HTML to the given cells.\n\t// Intro means the leftmost cell when the calendar is LTR and the rightmost cell when RTL. Vice-versa for outro.\n\t// `cells` can be an HTML string of <td>'s or a jQuery <tr> element\n\t// `row` is an optional row number.\n\tbookendCells: function(cells, rowType, row) {\n\t\tvar intro = this.getHtmlRenderer('intro', rowType)(row || 0);\n\t\tvar outro = this.getHtmlRenderer('outro', rowType)(row || 0);\n\t\tvar prependHtml = this.isRTL ? outro : intro;\n\t\tvar appendHtml = this.isRTL ? intro : outro;\n\n\t\tif (typeof cells === 'string') {\n\t\t\treturn prependHtml + cells + appendHtml;\n\t\t}\n\t\telse { // a jQuery <tr> element\n\t\t\treturn cells.prepend(prependHtml).append(appendHtml);\n\t\t}\n\t},\n\n\n\t// Returns an HTML-rendering function given a specific `rendererName` (like cell, intro, or outro) and a specific\n\t// `rowType` (like day, eventSkeleton, helperSkeleton), which is optional.\n\t// If a renderer for the specific rowType doesn't exist, it will fall back to a generic renderer.\n\t// We will query the View object first for any custom rendering functions, then the methods of the subclass.\n\tgetHtmlRenderer: function(rendererName, rowType) {\n\t\tvar view = this.view;\n\t\tvar generalName; // like \"cellHtml\"\n\t\tvar specificName; // like \"dayCellHtml\". based on rowType\n\t\tvar provider; // either the View or the RowRenderer subclass, whichever provided the method\n\t\tvar renderer;\n\n\t\tgeneralName = rendererName + 'Html';\n\t\tif (rowType) {\n\t\t\tspecificName = rowType + capitaliseFirstLetter(rendererName) + 'Html';\n\t\t}\n\n\t\tif (specificName && (renderer = view[specificName])) {\n\t\t\tprovider = view;\n\t\t}\n\t\telse if (specificName && (renderer = this[specificName])) {\n\t\t\tprovider = this;\n\t\t}\n\t\telse if ((renderer = view[generalName])) {\n\t\t\tprovider = view;\n\t\t}\n\t\telse if ((renderer = this[generalName])) {\n\t\t\tprovider = this;\n\t\t}\n\n\t\tif (typeof renderer === 'function') {\n\t\t\treturn function() {\n\t\t\t\treturn renderer.apply(provider, arguments) || ''; // use correct `this` and always return a string\n\t\t\t};\n\t\t}\n\n\t\t// the rendered can be a plain string as well. if not specified, always an empty string.\n\t\treturn function() {\n\t\t\treturn renderer || '';\n\t\t};\n\t}\n\n});\n\n;;\n\n/* An abstract class comprised of a \"grid\" of cells that each represent a specific datetime\n----------------------------------------------------------------------------------------------------------------------*/\n\nvar Grid = fc.Grid = RowRenderer.extend({\n\n\tstart: null, // the date of the first cell\n\tend: null, // the date after the last cell\n\n\trowCnt: 0, // number of rows\n\tcolCnt: 0, // number of cols\n\trowData: null, // array of objects, holding misc data for each row\n\tcolData: null, // array of objects, holding misc data for each column\n\n\tel: null, // the containing element\n\tcoordMap: null, // a GridCoordMap that converts pixel values to datetimes\n\telsByFill: null, // a hash of jQuery element sets used for rendering each fill. Keyed by fill name.\n\n\texternalDragStartProxy: null, // binds the Grid's scope to externalDragStart (in DayGrid.events)\n\n\t// derived from options\n\tcolHeadFormat: null, // TODO: move to another class. not applicable to all Grids\n\teventTimeFormat: null,\n\tdisplayEventTime: null,\n\tdisplayEventEnd: null,\n\n\t// if all cells are the same length of time, the duration they all share. optional.\n\t// when defined, allows the computeCellRange shortcut, as well as improved resizing behavior.\n\tcellDuration: null,\n\n\t// if defined, holds the unit identified (ex: \"year\" or \"month\") that determines the level of granularity\n\t// of the date cells. if not defined, assumes to be day and time granularity.\n\tlargeUnit: null,\n\n\n\tconstructor: function() {\n\t\tRowRenderer.apply(this, arguments); // call the super-constructor\n\n\t\tthis.coordMap = new GridCoordMap(this);\n\t\tthis.elsByFill = {};\n\t\tthis.externalDragStartProxy = proxy(this, 'externalDragStart');\n\t},\n\n\n\t/* Options\n\t------------------------------------------------------------------------------------------------------------------*/\n\n\n\t// Generates the format string used for the text in column headers, if not explicitly defined by 'columnFormat'\n\t// TODO: move to another class. not applicable to all Grids\n\tcomputeColHeadFormat: function() {\n\t\t// subclasses must implement if they want to use headHtml()\n\t},\n\n\n\t// Generates the format string used for event time text, if not explicitly defined by 'timeFormat'\n\tcomputeEventTimeFormat: function() {\n\t\treturn this.view.opt('smallTimeFormat');\n\t},\n\n\n\t// Determines whether events should have their end times displayed, if not explicitly defined by 'displayEventTime'.\n\t// Only applies to non-all-day events.\n\tcomputeDisplayEventTime: function() {\n\t\treturn true;\n\t},\n\n\n\t// Determines whether events should have their end times displayed, if not explicitly defined by 'displayEventEnd'\n\tcomputeDisplayEventEnd: function() {\n\t\treturn true;\n\t},\n\n\n\t/* Dates\n\t------------------------------------------------------------------------------------------------------------------*/\n\n\n\t// Tells the grid about what period of time to display. Grid will subsequently compute dates for cell system.\n\tsetRange: function(range) {\n\t\tvar view = this.view;\n\t\tvar displayEventTime;\n\t\tvar displayEventEnd;\n\n\t\tthis.start = range.start.clone();\n\t\tthis.end = range.end.clone();\n\n\t\tthis.rowData = [];\n\t\tthis.colData = [];\n\t\tthis.updateCells();\n\n\t\t// Populate option-derived settings. Look for override first, then compute if necessary.\n\t\tthis.colHeadFormat = view.opt('columnFormat') || this.computeColHeadFormat();\n\n\t\tthis.eventTimeFormat =\n\t\t\tview.opt('eventTimeFormat') ||\n\t\t\tview.opt('timeFormat') || // deprecated\n\t\t\tthis.computeEventTimeFormat();\n\n\t\tdisplayEventTime = view.opt('displayEventTime');\n\t\tif (displayEventTime == null) {\n\t\t\tdisplayEventTime = this.computeDisplayEventTime(); // might be based off of range\n\t\t}\n\n\t\tdisplayEventEnd = view.opt('displayEventEnd');\n\t\tif (displayEventEnd == null) {\n\t\t\tdisplayEventEnd = this.computeDisplayEventEnd(); // might be based off of range\n\t\t}\n\n\t\tthis.displayEventTime = displayEventTime;\n\t\tthis.displayEventEnd = displayEventEnd;\n\t},\n\n\n\t// Responsible for setting rowCnt/colCnt and any other row/col data\n\tupdateCells: function() {\n\t\t// subclasses must implement\n\t},\n\n\n\t// Converts a range with an inclusive `start` and an exclusive `end` into an array of segment objects\n\trangeToSegs: function(range) {\n\t\t// subclasses must implement\n\t},\n\n\n\t// Diffs the two dates, returning a duration, based on granularity of the grid\n\tdiffDates: function(a, b) {\n\t\tif (this.largeUnit) {\n\t\t\treturn diffByUnit(a, b, this.largeUnit);\n\t\t}\n\t\telse {\n\t\t\treturn diffDayTime(a, b);\n\t\t}\n\t},\n\n\n\t/* Cells\n\t------------------------------------------------------------------------------------------------------------------*/\n\t// NOTE: columns are ordered left-to-right\n\n\n\t// Gets an object containing row/col number, misc data, and range information about the cell.\n\t// Accepts row/col values, an object with row/col properties, or a single-number offset from the first cell.\n\tgetCell: function(row, col) {\n\t\tvar cell;\n\n\t\tif (col == null) {\n\t\t\tif (typeof row === 'number') { // a single-number offset\n\t\t\t\tcol = row % this.colCnt;\n\t\t\t\trow = Math.floor(row / this.colCnt);\n\t\t\t}\n\t\t\telse { // an object with row/col properties\n\t\t\t\tcol = row.col;\n\t\t\t\trow = row.row;\n\t\t\t}\n\t\t}\n\n\t\tcell = { row: row, col: col };\n\n\t\t$.extend(cell, this.getRowData(row), this.getColData(col));\n\t\t$.extend(cell, this.computeCellRange(cell));\n\n\t\treturn cell;\n\t},\n\n\n\t// Given a cell object with index and misc data, generates a range object\n\t// If the grid is leveraging cellDuration, this doesn't need to be defined. Only computeCellDate does.\n\t// If being overridden, should return a range with reference-free date copies.\n\tcomputeCellRange: function(cell) {\n\t\tvar date = this.computeCellDate(cell);\n\n\t\treturn {\n\t\t\tstart: date,\n\t\t\tend: date.clone().add(this.cellDuration)\n\t\t};\n\t},\n\n\n\t// Given a cell, returns its start date. Should return a reference-free date copy.\n\tcomputeCellDate: function(cell) {\n\t\t// subclasses can implement\n\t},\n\n\n\t// Retrieves misc data about the given row\n\tgetRowData: function(row) {\n\t\treturn this.rowData[row] || {};\n\t},\n\n\n\t// Retrieves misc data baout the given column\n\tgetColData: function(col) {\n\t\treturn this.colData[col] || {};\n\t},\n\n\n\t// Retrieves the element representing the given row\n\tgetRowEl: function(row) {\n\t\t// subclasses should implement if leveraging the default getCellDayEl() or computeRowCoords()\n\t},\n\n\n\t// Retrieves the element representing the given column\n\tgetColEl: function(col) {\n\t\t// subclasses should implement if leveraging the default getCellDayEl() or computeColCoords()\n\t},\n\n\n\t// Given a cell object, returns the element that represents the cell's whole-day\n\tgetCellDayEl: function(cell) {\n\t\treturn this.getColEl(cell.col) || this.getRowEl(cell.row);\n\t},\n\n\n\t/* Cell Coordinates\n\t------------------------------------------------------------------------------------------------------------------*/\n\n\n\t// Computes the top/bottom coordinates of all rows.\n\t// By default, queries the dimensions of the element provided by getRowEl().\n\tcomputeRowCoords: function() {\n\t\tvar items = [];\n\t\tvar i, el;\n\t\tvar top;\n\n\t\tfor (i = 0; i < this.rowCnt; i++) {\n\t\t\tel = this.getRowEl(i);\n\t\t\ttop = el.offset().top;\n\t\t\titems.push({\n\t\t\t\ttop: top,\n\t\t\t\tbottom: top + el.outerHeight()\n\t\t\t});\n\t\t}\n\n\t\treturn items;\n\t},\n\n\n\t// Computes the left/right coordinates of all rows.\n\t// By default, queries the dimensions of the element provided by getColEl(). Columns can be LTR or RTL.\n\tcomputeColCoords: function() {\n\t\tvar items = [];\n\t\tvar i, el;\n\t\tvar left;\n\n\t\tfor (i = 0; i < this.colCnt; i++) {\n\t\t\tel = this.getColEl(i);\n\t\t\tleft = el.offset().left;\n\t\t\titems.push({\n\t\t\t\tleft: left,\n\t\t\t\tright: left + el.outerWidth()\n\t\t\t});\n\t\t}\n\n\t\treturn items;\n\t},\n\n\n\t/* Rendering\n\t------------------------------------------------------------------------------------------------------------------*/\n\n\n\t// Sets the container element that the grid should render inside of.\n\t// Does other DOM-related initializations.\n\tsetElement: function(el) {\n\t\tvar _this = this;\n\n\t\tthis.el = el;\n\n\t\t// attach a handler to the grid's root element.\n\t\t// jQuery will take care of unregistering them when removeElement gets called.\n\t\tel.on('mousedown', function(ev) {\n\t\t\tif (\n\t\t\t\t!$(ev.target).is('.fc-event-container *, .fc-more') && // not an an event element, or \"more..\" link\n\t\t\t\t!$(ev.target).closest('.fc-popover').length // not on a popover (like the \"more..\" events one)\n\t\t\t) {\n\t\t\t\t_this.dayMousedown(ev);\n\t\t\t}\n\t\t});\n\n\t\t// attach event-element-related handlers. in Grid.events\n\t\t// same garbage collection note as above.\n\t\tthis.bindSegHandlers();\n\n\t\tthis.bindGlobalHandlers();\n\t},\n\n\n\t// Removes the grid's container element from the DOM. Undoes any other DOM-related attachments.\n\t// DOES NOT remove any content before hand (doens't clear events or call destroyDates), unlike View\n\tremoveElement: function() {\n\t\tthis.unbindGlobalHandlers();\n\n\t\tthis.el.remove();\n\n\t\t// NOTE: we don't null-out this.el for the same reasons we don't do it within View::removeElement\n\t},\n\n\n\t// Renders the basic structure of grid view before any content is rendered\n\trenderSkeleton: function() {\n\t\t// subclasses should implement\n\t},\n\n\n\t// Renders the grid's date-related content (like cells that represent days/times).\n\t// Assumes setRange has already been called and the skeleton has already been rendered.\n\trenderDates: function() {\n\t\t// subclasses should implement\n\t},\n\n\n\t// Unrenders the grid's date-related content\n\tdestroyDates: function() {\n\t\t// subclasses should implement\n\t},\n\n\n\t/* Handlers\n\t------------------------------------------------------------------------------------------------------------------*/\n\n\n\t// Binds DOM handlers to elements that reside outside the grid, such as the document\n\tbindGlobalHandlers: function() {\n\t\t$(document).on('dragstart sortstart', this.externalDragStartProxy); // jqui\n\t},\n\n\n\t// Unbinds DOM handlers from elements that reside outside the grid\n\tunbindGlobalHandlers: function() {\n\t\t$(document).off('dragstart sortstart', this.externalDragStartProxy); // jqui\n\t},\n\n\n\t// Process a mousedown on an element that represents a day. For day clicking and selecting.\n\tdayMousedown: function(ev) {\n\t\tvar _this = this;\n\t\tvar view = this.view;\n\t\tvar isSelectable = view.opt('selectable');\n\t\tvar dayClickCell; // null if invalid dayClick\n\t\tvar selectionRange; // null if invalid selection\n\n\t\t// this listener tracks a mousedown on a day element, and a subsequent drag.\n\t\t// if the drag ends on the same day, it is a 'dayClick'.\n\t\t// if 'selectable' is enabled, this listener also detects selections.\n\t\tvar dragListener = new CellDragListener(this.coordMap, {\n\t\t\t//distance: 5, // needs more work if we want dayClick to fire correctly\n\t\t\tscroll: view.opt('dragScroll'),\n\t\t\tdragStart: function() {\n\t\t\t\tview.unselect(); // since we could be rendering a new selection, we want to clear any old one\n\t\t\t},\n\t\t\tcellOver: function(cell, isOrig, origCell) {\n\t\t\t\tif (origCell) { // click needs to have started on a cell\n\t\t\t\t\tdayClickCell = isOrig ? cell : null; // single-cell selection is a day click\n\t\t\t\t\tif (isSelectable) {\n\t\t\t\t\t\tselectionRange = _this.computeSelection(origCell, cell);\n\t\t\t\t\t\tif (selectionRange) {\n\t\t\t\t\t\t\t_this.renderSelection(selectionRange);\n\t\t\t\t\t\t}\n\t\t\t\t\t\telse {\n\t\t\t\t\t\t\tdisableCursor();\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t},\n\t\t\tcellOut: function(cell) {\n\t\t\t\tdayClickCell = null;\n\t\t\t\tselectionRange = null;\n\t\t\t\t_this.destroySelection();\n\t\t\t\tenableCursor();\n\t\t\t},\n\t\t\tlistenStop: function(ev) {\n\t\t\t\tif (dayClickCell) {\n\t\t\t\t\tview.trigger('dayClick', _this.getCellDayEl(dayClickCell), dayClickCell.start, ev);\n\t\t\t\t}\n\t\t\t\tif (selectionRange) {\n\t\t\t\t\t// the selection will already have been rendered. just report it\n\t\t\t\t\tview.reportSelection(selectionRange, ev);\n\t\t\t\t}\n\t\t\t\tenableCursor();\n\t\t\t}\n\t\t});\n\n\t\tdragListener.mousedown(ev); // start listening, which will eventually initiate a dragStart\n\t},\n\n\n\t/* Event Helper\n\t------------------------------------------------------------------------------------------------------------------*/\n\t// TODO: should probably move this to Grid.events, like we did event dragging / resizing\n\n\n\t// Renders a mock event over the given range\n\trenderRangeHelper: function(range, sourceSeg) {\n\t\tvar fakeEvent = this.fabricateHelperEvent(range, sourceSeg);\n\n\t\tthis.renderHelper(fakeEvent, sourceSeg); // do the actual rendering\n\t},\n\n\n\t// Builds a fake event given a date range it should cover, and a segment is should be inspired from.\n\t// The range's end can be null, in which case the mock event that is rendered will have a null end time.\n\t// `sourceSeg` is the internal segment object involved in the drag. If null, something external is dragging.\n\tfabricateHelperEvent: function(range, sourceSeg) {\n\t\tvar fakeEvent = sourceSeg ? createObject(sourceSeg.event) : {}; // mask the original event object if possible\n\n\t\tfakeEvent.start = range.start.clone();\n\t\tfakeEvent.end = range.end ? range.end.clone() : null;\n\t\tfakeEvent.allDay = null; // force it to be freshly computed by normalizeEventRange\n\t\tthis.view.calendar.normalizeEventRange(fakeEvent);\n\n\t\t// this extra className will be useful for differentiating real events from mock events in CSS\n\t\tfakeEvent.className = (fakeEvent.className || []).concat('fc-helper');\n\n\t\t// if something external is being dragged in, don't render a resizer\n\t\tif (!sourceSeg) {\n\t\t\tfakeEvent.editable = false;\n\t\t}\n\n\t\treturn fakeEvent;\n\t},\n\n\n\t// Renders a mock event\n\trenderHelper: function(event, sourceSeg) {\n\t\t// subclasses must implement\n\t},\n\n\n\t// Unrenders a mock event\n\tdestroyHelper: function() {\n\t\t// subclasses must implement\n\t},\n\n\n\t/* Selection\n\t------------------------------------------------------------------------------------------------------------------*/\n\n\n\t// Renders a visual indication of a selection. Will highlight by default but can be overridden by subclasses.\n\trenderSelection: function(range) {\n\t\tthis.renderHighlight(range);\n\t},\n\n\n\t// Unrenders any visual indications of a selection. Will unrender a highlight by default.\n\tdestroySelection: function() {\n\t\tthis.destroyHighlight();\n\t},\n\n\n\t// Given the first and last cells of a selection, returns a range object.\n\t// Will return something falsy if the selection is invalid (when outside of selectionConstraint for example).\n\t// Subclasses can override and provide additional data in the range object. Will be passed to renderSelection().\n\tcomputeSelection: function(firstCell, lastCell) {\n\t\tvar dates = [\n\t\t\tfirstCell.start,\n\t\t\tfirstCell.end,\n\t\t\tlastCell.start,\n\t\t\tlastCell.end\n\t\t];\n\t\tvar range;\n\n\t\tdates.sort(compareNumbers); // sorts chronologically. works with Moments\n\n\t\trange = {\n\t\t\tstart: dates[0].clone(),\n\t\t\tend: dates[3].clone()\n\t\t};\n\n\t\tif (!this.view.calendar.isSelectionRangeAllowed(range)) {\n\t\t\treturn null;\n\t\t}\n\n\t\treturn range;\n\t},\n\n\n\t/* Highlight\n\t------------------------------------------------------------------------------------------------------------------*/\n\n\n\t// Renders an emphasis on the given date range. `start` is inclusive. `end` is exclusive.\n\trenderHighlight: function(range) {\n\t\tthis.renderFill('highlight', this.rangeToSegs(range));\n\t},\n\n\n\t// Unrenders the emphasis on a date range\n\tdestroyHighlight: function() {\n\t\tthis.destroyFill('highlight');\n\t},\n\n\n\t// Generates an array of classNames for rendering the highlight. Used by the fill system.\n\thighlightSegClasses: function() {\n\t\treturn [ 'fc-highlight' ];\n\t},\n\n\n\t/* Fill System (highlight, background events, business hours)\n\t------------------------------------------------------------------------------------------------------------------*/\n\n\n\t// Renders a set of rectangles over the given segments of time.\n\t// Returns a subset of segs, the segs that were actually rendered.\n\t// Responsible for populating this.elsByFill. TODO: better API for expressing this requirement\n\trenderFill: function(type, segs) {\n\t\t// subclasses must implement\n\t},\n\n\n\t// Unrenders a specific type of fill that is currently rendered on the grid\n\tdestroyFill: function(type) {\n\t\tvar el = this.elsByFill[type];\n\n\t\tif (el) {\n\t\t\tel.remove();\n\t\t\tdelete this.elsByFill[type];\n\t\t}\n\t},\n\n\n\t// Renders and assigns an `el` property for each fill segment. Generic enough to work with different types.\n\t// Only returns segments that successfully rendered.\n\t// To be harnessed by renderFill (implemented by subclasses).\n\t// Analagous to renderFgSegEls.\n\trenderFillSegEls: function(type, segs) {\n\t\tvar _this = this;\n\t\tvar segElMethod = this[type + 'SegEl'];\n\t\tvar html = '';\n\t\tvar renderedSegs = [];\n\t\tvar i;\n\n\t\tif (segs.length) {\n\n\t\t\t// build a large concatenation of segment HTML\n\t\t\tfor (i = 0; i < segs.length; i++) {\n\t\t\t\thtml += this.fillSegHtml(type, segs[i]);\n\t\t\t}\n\n\t\t\t// Grab individual elements from the combined HTML string. Use each as the default rendering.\n\t\t\t// Then, compute the 'el' for each segment.\n\t\t\t$(html).each(function(i, node) {\n\t\t\t\tvar seg = segs[i];\n\t\t\t\tvar el = $(node);\n\n\t\t\t\t// allow custom filter methods per-type\n\t\t\t\tif (segElMethod) {\n\t\t\t\t\tel = segElMethod.call(_this, seg, el);\n\t\t\t\t}\n\n\t\t\t\tif (el) { // custom filters did not cancel the render\n\t\t\t\t\tel = $(el); // allow custom filter to return raw DOM node\n\n\t\t\t\t\t// correct element type? (would be bad if a non-TD were inserted into a table for example)\n\t\t\t\t\tif (el.is(_this.fillSegTag)) {\n\t\t\t\t\t\tseg.el = el;\n\t\t\t\t\t\trenderedSegs.push(seg);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t});\n\t\t}\n\n\t\treturn renderedSegs;\n\t},\n\n\n\tfillSegTag: 'div', // subclasses can override\n\n\n\t// Builds the HTML needed for one fill segment. Generic enought o work with different types.\n\tfillSegHtml: function(type, seg) {\n\n\t\t// custom hooks per-type\n\t\tvar classesMethod = this[type + 'SegClasses'];\n\t\tvar cssMethod = this[type + 'SegCss'];\n\n\t\tvar classes = classesMethod ? classesMethod.call(this, seg) : [];\n\t\tvar css = cssToStr(cssMethod ? cssMethod.call(this, seg) : {});\n\n\t\treturn '<' + this.fillSegTag +\n\t\t\t(classes.length ? ' class=\"' + classes.join(' ') + '\"' : '') +\n\t\t\t(css ? ' style=\"' + css + '\"' : '') +\n\t\t\t' />';\n\t},\n\n\n\t/* Generic rendering utilities for subclasses\n\t------------------------------------------------------------------------------------------------------------------*/\n\n\n\t// Renders a day-of-week header row.\n\t// TODO: move to another class. not applicable to all Grids\n\theadHtml: function() {\n\t\treturn '' +\n\t\t\t'<div class=\"fc-row ' + this.view.widgetHeaderClass + '\">' +\n\t\t\t\t'<table>' +\n\t\t\t\t\t'<thead>' +\n\t\t\t\t\t\tthis.rowHtml('head') + // leverages RowRenderer\n\t\t\t\t\t'</thead>' +\n\t\t\t\t'</table>' +\n\t\t\t'</div>';\n\t},\n\n\n\t// Used by the `headHtml` method, via RowRenderer, for rendering the HTML of a day-of-week header cell\n\t// TODO: move to another class. not applicable to all Grids\n\theadCellHtml: function(cell) {\n\t\tvar view = this.view;\n\t\tvar date = cell.start;\n\n\t\treturn '' +\n\t\t\t'<th class=\"fc-day-header ' + view.widgetHeaderClass + ' fc-' + dayIDs[date.day()] + '\">' +\n\t\t\t\thtmlEscape(date.format(this.colHeadFormat)) +\n\t\t\t'</th>';\n\t},\n\n\n\t// Renders the HTML for a single-day background cell\n\tbgCellHtml: function(cell) {\n\t\tvar view = this.view;\n\t\tvar date = cell.start;\n\t\tvar classes = this.getDayClasses(date);\n\n\t\tclasses.unshift('fc-day', view.widgetContentClass);\n\n\t\treturn '<td class=\"' + classes.join(' ') + '\"' +\n\t\t\t' data-date=\"' + date.format('YYYY-MM-DD') + '\"' + // if date has a time, won't format it\n\t\t\t'></td>';\n\t},\n\n\n\t// Computes HTML classNames for a single-day cell\n\tgetDayClasses: function(date) {\n\t\tvar view = this.view;\n\t\tvar today = view.calendar.getNow().stripTime();\n\t\tvar classes = [ 'fc-' + dayIDs[date.day()] ];\n\n\t\tif (\n\t\t\tview.intervalDuration.as('months') == 1 &&\n\t\t\tdate.month() != view.intervalStart.month()\n\t\t) {\n\t\t\tclasses.push('fc-other-month');\n\t\t}\n\n\t\tif (date.isSame(today, 'day')) {\n\t\t\tclasses.push(\n\t\t\t\t'fc-today',\n\t\t\t\tview.highlightStateClass\n\t\t\t);\n\t\t}\n\t\telse if (date < today) {\n\t\t\tclasses.push('fc-past');\n\t\t}\n\t\telse {\n\t\t\tclasses.push('fc-future');\n\t\t}\n\n\t\treturn classes;\n\t}\n\n});\n\n;;\n\n/* Event-rendering and event-interaction methods for the abstract Grid class\n----------------------------------------------------------------------------------------------------------------------*/\n\nGrid.mixin({\n\n\tmousedOverSeg: null, // the segment object the user's mouse is over. null if over nothing\n\tisDraggingSeg: false, // is a segment being dragged? boolean\n\tisResizingSeg: false, // is a segment being resized? boolean\n\tisDraggingExternal: false, // jqui-dragging an external element? boolean\n\tsegs: null, // the event segments currently rendered in the grid\n\n\n\t// Renders the given events onto the grid\n\trenderEvents: function(events) {\n\t\tvar segs = this.eventsToSegs(events);\n\t\tvar bgSegs = [];\n\t\tvar fgSegs = [];\n\t\tvar i, seg;\n\n\t\tfor (i = 0; i < segs.length; i++) {\n\t\t\tseg = segs[i];\n\n\t\t\tif (isBgEvent(seg.event)) {\n\t\t\t\tbgSegs.push(seg);\n\t\t\t}\n\t\t\telse {\n\t\t\t\tfgSegs.push(seg);\n\t\t\t}\n\t\t}\n\n\t\t// Render each different type of segment.\n\t\t// Each function may return a subset of the segs, segs that were actually rendered.\n\t\tbgSegs = this.renderBgSegs(bgSegs) || bgSegs;\n\t\tfgSegs = this.renderFgSegs(fgSegs) || fgSegs;\n\n\t\tthis.segs = bgSegs.concat(fgSegs);\n\t},\n\n\n\t// Unrenders all events currently rendered on the grid\n\tdestroyEvents: function() {\n\t\tthis.triggerSegMouseout(); // trigger an eventMouseout if user's mouse is over an event\n\n\t\tthis.destroyFgSegs();\n\t\tthis.destroyBgSegs();\n\n\t\tthis.segs = null;\n\t},\n\n\n\t// Retrieves all rendered segment objects currently rendered on the grid\n\tgetEventSegs: function() {\n\t\treturn this.segs || [];\n\t},\n\n\n\t/* Foreground Segment Rendering\n\t------------------------------------------------------------------------------------------------------------------*/\n\n\n\t// Renders foreground event segments onto the grid. May return a subset of segs that were rendered.\n\trenderFgSegs: function(segs) {\n\t\t// subclasses must implement\n\t},\n\n\n\t// Unrenders all currently rendered foreground segments\n\tdestroyFgSegs: function() {\n\t\t// subclasses must implement\n\t},\n\n\n\t// Renders and assigns an `el` property for each foreground event segment.\n\t// Only returns segments that successfully rendered.\n\t// A utility that subclasses may use.\n\trenderFgSegEls: function(segs, disableResizing) {\n\t\tvar view = this.view;\n\t\tvar html = '';\n\t\tvar renderedSegs = [];\n\t\tvar i;\n\n\t\tif (segs.length) { // don't build an empty html string\n\n\t\t\t// build a large concatenation of event segment HTML\n\t\t\tfor (i = 0; i < segs.length; i++) {\n\t\t\t\thtml += this.fgSegHtml(segs[i], disableResizing);\n\t\t\t}\n\n\t\t\t// Grab individual elements from the combined HTML string. Use each as the default rendering.\n\t\t\t// Then, compute the 'el' for each segment. An el might be null if the eventRender callback returned false.\n\t\t\t$(html).each(function(i, node) {\n\t\t\t\tvar seg = segs[i];\n\t\t\t\tvar el = view.resolveEventEl(seg.event, $(node));\n\n\t\t\t\tif (el) {\n\t\t\t\t\tel.data('fc-seg', seg); // used by handlers\n\t\t\t\t\tseg.el = el;\n\t\t\t\t\trenderedSegs.push(seg);\n\t\t\t\t}\n\t\t\t});\n\t\t}\n\n\t\treturn renderedSegs;\n\t},\n\n\n\t// Generates the HTML for the default rendering of a foreground event segment. Used by renderFgSegEls()\n\tfgSegHtml: function(seg, disableResizing) {\n\t\t// subclasses should implement\n\t},\n\n\n\t/* Background Segment Rendering\n\t------------------------------------------------------------------------------------------------------------------*/\n\n\n\t// Renders the given background event segments onto the grid.\n\t// Returns a subset of the segs that were actually rendered.\n\trenderBgSegs: function(segs) {\n\t\treturn this.renderFill('bgEvent', segs);\n\t},\n\n\n\t// Unrenders all the currently rendered background event segments\n\tdestroyBgSegs: function() {\n\t\tthis.destroyFill('bgEvent');\n\t},\n\n\n\t// Renders a background event element, given the default rendering. Called by the fill system.\n\tbgEventSegEl: function(seg, el) {\n\t\treturn this.view.resolveEventEl(seg.event, el); // will filter through eventRender\n\t},\n\n\n\t// Generates an array of classNames to be used for the default rendering of a background event.\n\t// Called by the fill system.\n\tbgEventSegClasses: function(seg) {\n\t\tvar event = seg.event;\n\t\tvar source = event.source || {};\n\n\t\treturn [ 'fc-bgevent' ].concat(\n\t\t\tevent.className,\n\t\t\tsource.className || []\n\t\t);\n\t},\n\n\n\t// Generates a semicolon-separated CSS string to be used for the default rendering of a background event.\n\t// Called by the fill system.\n\t// TODO: consolidate with getEventSkinCss?\n\tbgEventSegCss: function(seg) {\n\t\tvar view = this.view;\n\t\tvar event = seg.event;\n\t\tvar source = event.source || {};\n\n\t\treturn {\n\t\t\t'background-color':\n\t\t\t\tevent.backgroundColor ||\n\t\t\t\tevent.color ||\n\t\t\t\tsource.backgroundColor ||\n\t\t\t\tsource.color ||\n\t\t\t\tview.opt('eventBackgroundColor') ||\n\t\t\t\tview.opt('eventColor')\n\t\t};\n\t},\n\n\n\t// Generates an array of classNames to be used for the rendering business hours overlay. Called by the fill system.\n\tbusinessHoursSegClasses: function(seg) {\n\t\treturn [ 'fc-nonbusiness', 'fc-bgevent' ];\n\t},\n\n\n\t/* Handlers\n\t------------------------------------------------------------------------------------------------------------------*/\n\n\n\t// Attaches event-element-related handlers to the container element and leverage bubbling\n\tbindSegHandlers: function() {\n\t\tvar _this = this;\n\t\tvar view = this.view;\n\n\t\t$.each(\n\t\t\t{\n\t\t\t\tmouseenter: function(seg, ev) {\n\t\t\t\t\t_this.triggerSegMouseover(seg, ev);\n\t\t\t\t},\n\t\t\t\tmouseleave: function(seg, ev) {\n\t\t\t\t\t_this.triggerSegMouseout(seg, ev);\n\t\t\t\t},\n\t\t\t\tclick: function(seg, ev) {\n\t\t\t\t\treturn view.trigger('eventClick', this, seg.event, ev); // can return `false` to cancel\n\t\t\t\t},\n\t\t\t\tmousedown: function(seg, ev) {\n\t\t\t\t\tif ($(ev.target).is('.fc-resizer') && view.isEventResizable(seg.event)) {\n\t\t\t\t\t\t_this.segResizeMousedown(seg, ev, $(ev.target).is('.fc-start-resizer'));\n\t\t\t\t\t}\n\t\t\t\t\telse if (view.isEventDraggable(seg.event)) {\n\t\t\t\t\t\t_this.segDragMousedown(seg, ev);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t},\n\t\t\tfunction(name, func) {\n\t\t\t\t// attach the handler to the container element and only listen for real event elements via bubbling\n\t\t\t\t_this.el.on(name, '.fc-event-container > *', function(ev) {\n\t\t\t\t\tvar seg = $(this).data('fc-seg'); // grab segment data. put there by View::renderEvents\n\n\t\t\t\t\t// only call the handlers if there is not a drag/resize in progress\n\t\t\t\t\tif (seg && !_this.isDraggingSeg && !_this.isResizingSeg) {\n\t\t\t\t\t\treturn func.call(this, seg, ev); // `this` will be the event element\n\t\t\t\t\t}\n\t\t\t\t});\n\t\t\t}\n\t\t);\n\t},\n\n\n\t// Updates internal state and triggers handlers for when an event element is moused over\n\ttriggerSegMouseover: function(seg, ev) {\n\t\tif (!this.mousedOverSeg) {\n\t\t\tthis.mousedOverSeg = seg;\n\t\t\tthis.view.trigger('eventMouseover', seg.el[0], seg.event, ev);\n\t\t}\n\t},\n\n\n\t// Updates internal state and triggers handlers for when an event element is moused out.\n\t// Can be given no arguments, in which case it will mouseout the segment that was previously moused over.\n\ttriggerSegMouseout: function(seg, ev) {\n\t\tev = ev || {}; // if given no args, make a mock mouse event\n\n\t\tif (this.mousedOverSeg) {\n\t\t\tseg = seg || this.mousedOverSeg; // if given no args, use the currently moused-over segment\n\t\t\tthis.mousedOverSeg = null;\n\t\t\tthis.view.trigger('eventMouseout', seg.el[0], seg.event, ev);\n\t\t}\n\t},\n\n\n\t/* Event Dragging\n\t------------------------------------------------------------------------------------------------------------------*/\n\n\n\t// Called when the user does a mousedown on an event, which might lead to dragging.\n\t// Generic enough to work with any type of Grid.\n\tsegDragMousedown: function(seg, ev) {\n\t\tvar _this = this;\n\t\tvar view = this.view;\n\t\tvar calendar = view.calendar;\n\t\tvar el = seg.el;\n\t\tvar event = seg.event;\n\t\tvar dropLocation;\n\n\t\t// A clone of the original element that will move with the mouse\n\t\tvar mouseFollower = new MouseFollower(seg.el, {\n\t\t\tparentEl: view.el,\n\t\t\topacity: view.opt('dragOpacity'),\n\t\t\trevertDuration: view.opt('dragRevertDuration'),\n\t\t\tzIndex: 2 // one above the .fc-view\n\t\t});\n\n\t\t// Tracks mouse movement over the *view's* coordinate map. Allows dragging and dropping between subcomponents\n\t\t// of the view.\n\t\tvar dragListener = new CellDragListener(view.coordMap, {\n\t\t\tdistance: 5,\n\t\t\tscroll: view.opt('dragScroll'),\n\t\t\tsubjectEl: el,\n\t\t\tsubjectCenter: true,\n\t\t\tlistenStart: function(ev) {\n\t\t\t\tmouseFollower.hide(); // don't show until we know this is a real drag\n\t\t\t\tmouseFollower.start(ev);\n\t\t\t},\n\t\t\tdragStart: function(ev) {\n\t\t\t\t_this.triggerSegMouseout(seg, ev); // ensure a mouseout on the manipulated event has been reported\n\t\t\t\t_this.segDragStart(seg, ev);\n\t\t\t\tview.hideEvent(event); // hide all event segments. our mouseFollower will take over\n\t\t\t},\n\t\t\tcellOver: function(cell, isOrig, origCell) {\n\n\t\t\t\t// starting cell could be forced (DayGrid.limit)\n\t\t\t\tif (seg.cell) {\n\t\t\t\t\torigCell = seg.cell;\n\t\t\t\t}\n\n\t\t\t\tdropLocation = _this.computeEventDrop(origCell, cell, event);\n\n\t\t\t\tif (dropLocation && !calendar.isEventRangeAllowed(dropLocation, event)) {\n\t\t\t\t\tdisableCursor();\n\t\t\t\t\tdropLocation = null;\n\t\t\t\t}\n\n\t\t\t\t// if a valid drop location, have the subclass render a visual indication\n\t\t\t\tif (dropLocation && view.renderDrag(dropLocation, seg)) {\n\t\t\t\t\tmouseFollower.hide(); // if the subclass is already using a mock event \"helper\", hide our own\n\t\t\t\t}\n\t\t\t\telse {\n\t\t\t\t\tmouseFollower.show(); // otherwise, have the helper follow the mouse (no snapping)\n\t\t\t\t}\n\n\t\t\t\tif (isOrig) {\n\t\t\t\t\tdropLocation = null; // needs to have moved cells to be a valid drop\n\t\t\t\t}\n\t\t\t},\n\t\t\tcellOut: function() { // called before mouse moves to a different cell OR moved out of all cells\n\t\t\t\tview.destroyDrag(); // unrender whatever was done in renderDrag\n\t\t\t\tmouseFollower.show(); // show in case we are moving out of all cells\n\t\t\t\tdropLocation = null;\n\t\t\t},\n\t\t\tcellDone: function() { // Called after a cellOut OR before a dragStop\n\t\t\t\tenableCursor();\n\t\t\t},\n\t\t\tdragStop: function(ev) {\n\t\t\t\t// do revert animation if hasn't changed. calls a callback when finished (whether animation or not)\n\t\t\t\tmouseFollower.stop(!dropLocation, function() {\n\t\t\t\t\tview.destroyDrag();\n\t\t\t\t\tview.showEvent(event);\n\t\t\t\t\t_this.segDragStop(seg, ev);\n\n\t\t\t\t\tif (dropLocation) {\n\t\t\t\t\t\tview.reportEventDrop(event, dropLocation, this.largeUnit, el, ev);\n\t\t\t\t\t}\n\t\t\t\t});\n\t\t\t},\n\t\t\tlistenStop: function() {\n\t\t\t\tmouseFollower.stop(); // put in listenStop in case there was a mousedown but the drag never started\n\t\t\t}\n\t\t});\n\n\t\tdragListener.mousedown(ev); // start listening, which will eventually lead to a dragStart\n\t},\n\n\n\t// Called before event segment dragging starts\n\tsegDragStart: function(seg, ev) {\n\t\tthis.isDraggingSeg = true;\n\t\tthis.view.trigger('eventDragStart', seg.el[0], seg.event, ev, {}); // last argument is jqui dummy\n\t},\n\n\n\t// Called after event segment dragging stops\n\tsegDragStop: function(seg, ev) {\n\t\tthis.isDraggingSeg = false;\n\t\tthis.view.trigger('eventDragStop', seg.el[0], seg.event, ev, {}); // last argument is jqui dummy\n\t},\n\n\n\t// Given the cell an event drag began, and the cell event was dropped, calculates the new start/end/allDay\n\t// values for the event. Subclasses may override and set additional properties to be used by renderDrag.\n\t// A falsy returned value indicates an invalid drop.\n\tcomputeEventDrop: function(startCell, endCell, event) {\n\t\tvar calendar = this.view.calendar;\n\t\tvar dragStart = startCell.start;\n\t\tvar dragEnd = endCell.start;\n\t\tvar delta;\n\t\tvar dropLocation;\n\n\t\tif (dragStart.hasTime() === dragEnd.hasTime()) {\n\t\t\tdelta = this.diffDates(dragEnd, dragStart);\n\n\t\t\t// if an all-day event was in a timed area and it was dragged to a different time,\n\t\t\t// guarantee an end and adjust start/end to have times\n\t\t\tif (event.allDay && durationHasTime(delta)) {\n\t\t\t\tdropLocation = {\n\t\t\t\t\tstart: event.start.clone(),\n\t\t\t\t\tend: calendar.getEventEnd(event), // will be an ambig day\n\t\t\t\t\tallDay: false // for normalizeEventRangeTimes\n\t\t\t\t};\n\t\t\t\tcalendar.normalizeEventRangeTimes(dropLocation);\n\t\t\t}\n\t\t\t// othewise, work off existing values\n\t\t\telse {\n\t\t\t\tdropLocation = {\n\t\t\t\t\tstart: event.start.clone(),\n\t\t\t\t\tend: event.end ? event.end.clone() : null,\n\t\t\t\t\tallDay: event.allDay // keep it the same\n\t\t\t\t};\n\t\t\t}\n\n\t\t\tdropLocation.start.add(delta);\n\t\t\tif (dropLocation.end) {\n\t\t\t\tdropLocation.end.add(delta);\n\t\t\t}\n\t\t}\n\t\telse {\n\t\t\t// if switching from day <-> timed, start should be reset to the dropped date, and the end cleared\n\t\t\tdropLocation = {\n\t\t\t\tstart: dragEnd.clone(),\n\t\t\t\tend: null, // end should be cleared\n\t\t\t\tallDay: !dragEnd.hasTime()\n\t\t\t};\n\t\t}\n\n\t\treturn dropLocation;\n\t},\n\n\n\t// Utility for apply dragOpacity to a jQuery set\n\tapplyDragOpacity: function(els) {\n\t\tvar opacity = this.view.opt('dragOpacity');\n\n\t\tif (opacity != null) {\n\t\t\tels.each(function(i, node) {\n\t\t\t\t// Don't use jQuery (will set an IE filter), do it the old fashioned way.\n\t\t\t\t// In IE8, a helper element will disappears if there's a filter.\n\t\t\t\tnode.style.opacity = opacity;\n\t\t\t});\n\t\t}\n\t},\n\n\n\t/* External Element Dragging\n\t------------------------------------------------------------------------------------------------------------------*/\n\n\n\t// Called when a jQuery UI drag is initiated anywhere in the DOM\n\texternalDragStart: function(ev, ui) {\n\t\tvar view = this.view;\n\t\tvar el;\n\t\tvar accept;\n\n\t\tif (view.opt('droppable')) { // only listen if this setting is on\n\t\t\tel = $((ui ? ui.item : null) || ev.target);\n\n\t\t\t// Test that the dragged element passes the dropAccept selector or filter function.\n\t\t\t// FYI, the default is \"*\" (matches all)\n\t\t\taccept = view.opt('dropAccept');\n\t\t\tif ($.isFunction(accept) ? accept.call(el[0], el) : el.is(accept)) {\n\t\t\t\tif (!this.isDraggingExternal) { // prevent double-listening if fired twice\n\t\t\t\t\tthis.listenToExternalDrag(el, ev, ui);\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t},\n\n\n\t// Called when a jQuery UI drag starts and it needs to be monitored for cell dropping\n\tlistenToExternalDrag: function(el, ev, ui) {\n\t\tvar _this = this;\n\t\tvar meta = getDraggedElMeta(el); // extra data about event drop, including possible event to create\n\t\tvar dragListener;\n\t\tvar dropLocation; // a null value signals an unsuccessful drag\n\n\t\t// listener that tracks mouse movement over date-associated pixel regions\n\t\tdragListener = new CellDragListener(this.coordMap, {\n\t\t\tlistenStart: function() {\n\t\t\t\t_this.isDraggingExternal = true;\n\t\t\t},\n\t\t\tcellOver: function(cell) {\n\t\t\t\tdropLocation = _this.computeExternalDrop(cell, meta);\n\t\t\t\tif (dropLocation) {\n\t\t\t\t\t_this.renderDrag(dropLocation); // called without a seg parameter\n\t\t\t\t}\n\t\t\t\telse { // invalid drop cell\n\t\t\t\t\tdisableCursor();\n\t\t\t\t}\n\t\t\t},\n\t\t\tcellOut: function() {\n\t\t\t\tdropLocation = null; // signal unsuccessful\n\t\t\t\t_this.destroyDrag();\n\t\t\t\tenableCursor();\n\t\t\t},\n\t\t\tdragStop: function() {\n\t\t\t\t_this.destroyDrag();\n\t\t\t\tenableCursor();\n\n\t\t\t\tif (dropLocation) { // element was dropped on a valid date/time cell\n\t\t\t\t\t_this.view.reportExternalDrop(meta, dropLocation, el, ev, ui);\n\t\t\t\t}\n\t\t\t},\n\t\t\tlistenStop: function() {\n\t\t\t\t_this.isDraggingExternal = false;\n\t\t\t}\n\t\t});\n\n\t\tdragListener.startDrag(ev); // start listening immediately\n\t},\n\n\n\t// Given a cell to be dropped upon, and misc data associated with the jqui drag (guaranteed to be a plain object),\n\t// returns start/end dates for the event that would result from the hypothetical drop. end might be null.\n\t// Returning a null value signals an invalid drop cell.\n\tcomputeExternalDrop: function(cell, meta) {\n\t\tvar dropLocation = {\n\t\t\tstart: cell.start.clone(),\n\t\t\tend: null\n\t\t};\n\n\t\t// if dropped on an all-day cell, and element's metadata specified a time, set it\n\t\tif (meta.startTime && !dropLocation.start.hasTime()) {\n\t\t\tdropLocation.start.time(meta.startTime);\n\t\t}\n\n\t\tif (meta.duration) {\n\t\t\tdropLocation.end = dropLocation.start.clone().add(meta.duration);\n\t\t}\n\n\t\tif (!this.view.calendar.isExternalDropRangeAllowed(dropLocation, meta.eventProps)) {\n\t\t\treturn null;\n\t\t}\n\n\t\treturn dropLocation;\n\t},\n\n\n\n\t/* Drag Rendering (for both events and an external elements)\n\t------------------------------------------------------------------------------------------------------------------*/\n\n\n\t// Renders a visual indication of an event or external element being dragged.\n\t// `dropLocation` contains hypothetical start/end/allDay values the event would have if dropped. end can be null.\n\t// `seg` is the internal segment object that is being dragged. If dragging an external element, `seg` is null.\n\t// A truthy returned value indicates this method has rendered a helper element.\n\trenderDrag: function(dropLocation, seg) {\n\t\t// subclasses must implement\n\t},\n\n\n\t// Unrenders a visual indication of an event or external element being dragged\n\tdestroyDrag: function() {\n\t\t// subclasses must implement\n\t},\n\n\n\t/* Resizing\n\t------------------------------------------------------------------------------------------------------------------*/\n\n\n\t// Called when the user does a mousedown on an event's resizer, which might lead to resizing.\n\t// Generic enough to work with any type of Grid.\n\tsegResizeMousedown: function(seg, ev, isStart) {\n\t\tvar _this = this;\n\t\tvar view = this.view;\n\t\tvar calendar = view.calendar;\n\t\tvar el = seg.el;\n\t\tvar event = seg.event;\n\t\tvar eventEnd = calendar.getEventEnd(event);\n\t\tvar dragListener;\n\t\tvar resizeLocation; // falsy if invalid resize\n\n\t\t// Tracks mouse movement over the *grid's* coordinate map\n\t\tdragListener = new CellDragListener(this.coordMap, {\n\t\t\tdistance: 5,\n\t\t\tscroll: view.opt('dragScroll'),\n\t\t\tsubjectEl: el,\n\t\t\tdragStart: function(ev) {\n\t\t\t\t_this.triggerSegMouseout(seg, ev); // ensure a mouseout on the manipulated event has been reported\n\t\t\t\t_this.segResizeStart(seg, ev);\n\t\t\t},\n\t\t\tcellOver: function(cell, isOrig, origCell) {\n\t\t\t\tresizeLocation = isStart ?\n\t\t\t\t\t_this.computeEventStartResize(origCell, cell, event) :\n\t\t\t\t\t_this.computeEventEndResize(origCell, cell, event);\n\n\t\t\t\tif (resizeLocation) {\n\t\t\t\t\tif (!calendar.isEventRangeAllowed(resizeLocation, event)) {\n\t\t\t\t\t\tdisableCursor();\n\t\t\t\t\t\tresizeLocation = null;\n\t\t\t\t\t}\n\t\t\t\t\t// no change? (TODO: how does this work with timezones?)\n\t\t\t\t\telse if (resizeLocation.start.isSame(event.start) && resizeLocation.end.isSame(eventEnd)) {\n\t\t\t\t\t\tresizeLocation = null;\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\tif (resizeLocation) {\n\t\t\t\t\tview.hideEvent(event);\n\t\t\t\t\t_this.renderEventResize(resizeLocation, seg);\n\t\t\t\t}\n\t\t\t},\n\t\t\tcellOut: function() { // called before mouse moves to a different cell OR moved out of all cells\n\t\t\t\tresizeLocation = null;\n\t\t\t},\n\t\t\tcellDone: function() { // resets the rendering to show the original event\n\t\t\t\t_this.destroyEventResize();\n\t\t\t\tview.showEvent(event);\n\t\t\t\tenableCursor();\n\t\t\t},\n\t\t\tdragStop: function(ev) {\n\t\t\t\t_this.segResizeStop(seg, ev);\n\n\t\t\t\tif (resizeLocation) { // valid date to resize to?\n\t\t\t\t\tview.reportEventResize(event, resizeLocation, this.largeUnit, el, ev);\n\t\t\t\t}\n\t\t\t}\n\t\t});\n\n\t\tdragListener.mousedown(ev); // start listening, which will eventually lead to a dragStart\n\t},\n\n\n\t// Called before event segment resizing starts\n\tsegResizeStart: function(seg, ev) {\n\t\tthis.isResizingSeg = true;\n\t\tthis.view.trigger('eventResizeStart', seg.el[0], seg.event, ev, {}); // last argument is jqui dummy\n\t},\n\n\n\t// Called after event segment resizing stops\n\tsegResizeStop: function(seg, ev) {\n\t\tthis.isResizingSeg = false;\n\t\tthis.view.trigger('eventResizeStop', seg.el[0], seg.event, ev, {}); // last argument is jqui dummy\n\t},\n\n\n\t// Returns new date-information for an event segment being resized from its start\n\tcomputeEventStartResize: function(startCell, endCell, event) {\n\t\treturn this.computeEventResize('start', startCell, endCell, event);\n\t},\n\n\n\t// Returns new date-information for an event segment being resized from its end\n\tcomputeEventEndResize: function(startCell, endCell, event) {\n\t\treturn this.computeEventResize('end', startCell, endCell, event);\n\t},\n\n\n\t// Returns new date-information for an event segment being resized from its start OR end\n\t// `type` is either 'start' or 'end'\n\tcomputeEventResize: function(type, startCell, endCell, event) {\n\t\tvar calendar = this.view.calendar;\n\t\tvar delta = this.diffDates(endCell[type], startCell[type]);\n\t\tvar range;\n\t\tvar defaultDuration;\n\n\t\t// build original values to work from, guaranteeing a start and end\n\t\trange = {\n\t\t\tstart: event.start.clone(),\n\t\t\tend: calendar.getEventEnd(event),\n\t\t\tallDay: event.allDay\n\t\t};\n\n\t\t// if an all-day event was in a timed area and was resized to a time, adjust start/end to have times\n\t\tif (range.allDay && durationHasTime(delta)) {\n\t\t\trange.allDay = false;\n\t\t\tcalendar.normalizeEventRangeTimes(range);\n\t\t}\n\n\t\trange[type].add(delta); // apply delta to start or end\n\n\t\t// if the event was compressed too small, find a new reasonable duration for it\n\t\tif (!range.start.isBefore(range.end)) {\n\n\t\t\tdefaultDuration = event.allDay ?\n\t\t\t\tcalendar.defaultAllDayEventDuration :\n\t\t\t\tcalendar.defaultTimedEventDuration;\n\n\t\t\t// between the cell's duration and the event's default duration, use the smaller of the two.\n\t\t\t// example: if year-length slots, and compressed to one slot, we don't want the event to be a year long\n\t\t\tif (this.cellDuration && this.cellDuration < defaultDuration) {\n\t\t\t\tdefaultDuration = this.cellDuration;\n\t\t\t}\n\n\t\t\tif (type == 'start') { // resizing the start?\n\t\t\t\trange.start = range.end.clone().subtract(defaultDuration);\n\t\t\t}\n\t\t\telse { // resizing the end?\n\t\t\t\trange.end = range.start.clone().add(defaultDuration);\n\t\t\t}\n\t\t}\n\n\t\treturn range;\n\t},\n\n\n\t// Renders a visual indication of an event being resized.\n\t// `range` has the updated dates of the event. `seg` is the original segment object involved in the drag.\n\trenderEventResize: function(range, seg) {\n\t\t// subclasses must implement\n\t},\n\n\n\t// Unrenders a visual indication of an event being resized.\n\tdestroyEventResize: function() {\n\t\t// subclasses must implement\n\t},\n\n\n\t/* Rendering Utils\n\t------------------------------------------------------------------------------------------------------------------*/\n\n\n\t// Compute the text that should be displayed on an event's element.\n\t// `range` can be the Event object itself, or something range-like, with at least a `start`.\n\t// If event times are disabled, or the event has no time, will return a blank string.\n\t// If not specified, formatStr will default to the eventTimeFormat setting,\n\t// and displayEnd will default to the displayEventEnd setting.\n\tgetEventTimeText: function(range, formatStr, displayEnd) {\n\n\t\tif (formatStr == null) {\n\t\t\tformatStr = this.eventTimeFormat;\n\t\t}\n\n\t\tif (displayEnd == null) {\n\t\t\tdisplayEnd = this.displayEventEnd;\n\t\t}\n\n\t\tif (this.displayEventTime && range.start.hasTime()) {\n\t\t\tif (displayEnd && range.end) {\n\t\t\t\treturn this.view.formatRange(range, formatStr);\n\t\t\t}\n\t\t\telse {\n\t\t\t\treturn range.start.format(formatStr);\n\t\t\t}\n\t\t}\n\n\t\treturn '';\n\t},\n\n\n\t// Generic utility for generating the HTML classNames for an event segment's element\n\tgetSegClasses: function(seg, isDraggable, isResizable) {\n\t\tvar event = seg.event;\n\t\tvar classes = [\n\t\t\t'fc-event',\n\t\t\tseg.isStart ? 'fc-start' : 'fc-not-start',\n\t\t\tseg.isEnd ? 'fc-end' : 'fc-not-end'\n\t\t].concat(\n\t\t\tevent.className,\n\t\t\tevent.source ? event.source.className : []\n\t\t);\n\n\t\tif (isDraggable) {\n\t\t\tclasses.push('fc-draggable');\n\t\t}\n\t\tif (isResizable) {\n\t\t\tclasses.push('fc-resizable');\n\t\t}\n\n\t\treturn classes;\n\t},\n\n\n\t// Utility for generating event skin-related CSS properties\n\tgetEventSkinCss: function(event) {\n\t\tvar view = this.view;\n\t\tvar source = event.source || {};\n\t\tvar eventColor = event.color;\n\t\tvar sourceColor = source.color;\n\t\tvar optionColor = view.opt('eventColor');\n\n\t\treturn {\n\t\t\t'background-color':\n\t\t\t\tevent.backgroundColor ||\n\t\t\t\teventColor ||\n\t\t\t\tsource.backgroundColor ||\n\t\t\t\tsourceColor ||\n\t\t\t\tview.opt('eventBackgroundColor') ||\n\t\t\t\toptionColor,\n\t\t\t'border-color':\n\t\t\t\tevent.borderColor ||\n\t\t\t\teventColor ||\n\t\t\t\tsource.borderColor ||\n\t\t\t\tsourceColor ||\n\t\t\t\tview.opt('eventBorderColor') ||\n\t\t\t\toptionColor,\n\t\t\tcolor:\n\t\t\t\tevent.textColor ||\n\t\t\t\tsource.textColor ||\n\t\t\t\tview.opt('eventTextColor')\n\t\t};\n\t},\n\n\n\t/* Converting events -> ranges -> segs\n\t------------------------------------------------------------------------------------------------------------------*/\n\n\n\t// Converts an array of event objects into an array of event segment objects.\n\t// A custom `rangeToSegsFunc` may be given for arbitrarily slicing up events.\n\t// Doesn't guarantee an order for the resulting array.\n\teventsToSegs: function(events, rangeToSegsFunc) {\n\t\tvar eventRanges = this.eventsToRanges(events);\n\t\tvar segs = [];\n\t\tvar i;\n\n\t\tfor (i = 0; i < eventRanges.length; i++) {\n\t\t\tsegs.push.apply(\n\t\t\t\tsegs,\n\t\t\t\tthis.eventRangeToSegs(eventRanges[i], rangeToSegsFunc)\n\t\t\t);\n\t\t}\n\n\t\treturn segs;\n\t},\n\n\n\t// Converts an array of events into an array of \"range\" objects.\n\t// A \"range\" object is a plain object with start/end properties denoting the time it covers. Also an event property.\n\t// For \"normal\" events, this will be identical to the event's start/end, but for \"inverse-background\" events,\n\t// will create an array of ranges that span the time *not* covered by the given event.\n\t// Doesn't guarantee an order for the resulting array.\n\teventsToRanges: function(events) {\n\t\tvar _this = this;\n\t\tvar eventsById = groupEventsById(events);\n\t\tvar ranges = [];\n\n\t\t// group by ID so that related inverse-background events can be rendered together\n\t\t$.each(eventsById, function(id, eventGroup) {\n\t\t\tif (eventGroup.length) {\n\t\t\t\tranges.push.apply(\n\t\t\t\t\tranges,\n\t\t\t\t\tisInverseBgEvent(eventGroup[0]) ?\n\t\t\t\t\t\t_this.eventsToInverseRanges(eventGroup) :\n\t\t\t\t\t\t_this.eventsToNormalRanges(eventGroup)\n\t\t\t\t);\n\t\t\t}\n\t\t});\n\n\t\treturn ranges;\n\t},\n\n\n\t// Converts an array of \"normal\" events (not inverted rendering) into a parallel array of ranges\n\teventsToNormalRanges: function(events) {\n\t\tvar calendar = this.view.calendar;\n\t\tvar ranges = [];\n\t\tvar i, event;\n\t\tvar eventStart, eventEnd;\n\n\t\tfor (i = 0; i < events.length; i++) {\n\t\t\tevent = events[i];\n\n\t\t\t// make copies and normalize by stripping timezone\n\t\t\teventStart = event.start.clone().stripZone();\n\t\t\teventEnd = calendar.getEventEnd(event).stripZone();\n\n\t\t\tranges.push({\n\t\t\t\tevent: event,\n\t\t\t\tstart: eventStart,\n\t\t\t\tend: eventEnd,\n\t\t\t\teventStartMS: +eventStart,\n\t\t\t\teventDurationMS: eventEnd - eventStart\n\t\t\t});\n\t\t}\n\n\t\treturn ranges;\n\t},\n\n\n\t// Converts an array of events, with inverse-background rendering, into an array of range objects.\n\t// The range objects will cover all the time NOT covered by the events.\n\teventsToInverseRanges: function(events) {\n\t\tvar view = this.view;\n\t\tvar viewStart = view.start.clone().stripZone(); // normalize timezone\n\t\tvar viewEnd = view.end.clone().stripZone(); // normalize timezone\n\t\tvar normalRanges = this.eventsToNormalRanges(events); // will give us normalized dates we can use w/o copies\n\t\tvar inverseRanges = [];\n\t\tvar event0 = events[0]; // assign this to each range's `.event`\n\t\tvar start = viewStart; // the end of the previous range. the start of the new range\n\t\tvar i, normalRange;\n\n\t\t// ranges need to be in order. required for our date-walking algorithm\n\t\tnormalRanges.sort(compareNormalRanges);\n\n\t\tfor (i = 0; i < normalRanges.length; i++) {\n\t\t\tnormalRange = normalRanges[i];\n\n\t\t\t// add the span of time before the event (if there is any)\n\t\t\tif (normalRange.start > start) { // compare millisecond time (skip any ambig logic)\n\t\t\t\tinverseRanges.push({\n\t\t\t\t\tevent: event0,\n\t\t\t\t\tstart: start,\n\t\t\t\t\tend: normalRange.start\n\t\t\t\t});\n\t\t\t}\n\n\t\t\tstart = normalRange.end;\n\t\t}\n\n\t\t// add the span of time after the last event (if there is any)\n\t\tif (start < viewEnd) { // compare millisecond time (skip any ambig logic)\n\t\t\tinverseRanges.push({\n\t\t\t\tevent: event0,\n\t\t\t\tstart: start,\n\t\t\t\tend: viewEnd\n\t\t\t});\n\t\t}\n\n\t\treturn inverseRanges;\n\t},\n\n\n\t// Slices the given event range into one or more segment objects.\n\t// A `rangeToSegsFunc` custom slicing function can be given.\n\teventRangeToSegs: function(eventRange, rangeToSegsFunc) {\n\t\tvar segs;\n\t\tvar i, seg;\n\n\t\tif (rangeToSegsFunc) {\n\t\t\tsegs = rangeToSegsFunc(eventRange);\n\t\t}\n\t\telse {\n\t\t\tsegs = this.rangeToSegs(eventRange); // defined by the subclass\n\t\t}\n\n\t\tfor (i = 0; i < segs.length; i++) {\n\t\t\tseg = segs[i];\n\t\t\tseg.event = eventRange.event;\n\t\t\tseg.eventStartMS = eventRange.eventStartMS;\n\t\t\tseg.eventDurationMS = eventRange.eventDurationMS;\n\t\t}\n\n\t\treturn segs;\n\t}\n\n});\n\n\n/* Utilities\n----------------------------------------------------------------------------------------------------------------------*/\n\n\nfunction isBgEvent(event) { // returns true if background OR inverse-background\n\tvar rendering = getEventRendering(event);\n\treturn rendering === 'background' || rendering === 'inverse-background';\n}\n\n\nfunction isInverseBgEvent(event) {\n\treturn getEventRendering(event) === 'inverse-background';\n}\n\n\nfunction getEventRendering(event) {\n\treturn firstDefined((event.source || {}).rendering, event.rendering);\n}\n\n\nfunction groupEventsById(events) {\n\tvar eventsById = {};\n\tvar i, event;\n\n\tfor (i = 0; i < events.length; i++) {\n\t\tevent = events[i];\n\t\t(eventsById[event._id] || (eventsById[event._id] = [])).push(event);\n\t}\n\n\treturn eventsById;\n}\n\n\n// A cmp function for determining which non-inverted \"ranges\" (see above) happen earlier\nfunction compareNormalRanges(range1, range2) {\n\treturn range1.eventStartMS - range2.eventStartMS; // earlier ranges go first\n}\n\n\n// A cmp function for determining which segments should take visual priority\n// DOES NOT WORK ON INVERTED BACKGROUND EVENTS because they have no eventStartMS/eventDurationMS\nfunction compareSegs(seg1, seg2) {\n\treturn seg1.eventStartMS - seg2.eventStartMS || // earlier events go first\n\t\tseg2.eventDurationMS - seg1.eventDurationMS || // tie? longer events go first\n\t\tseg2.event.allDay - seg1.event.allDay || // tie? put all-day events first (booleans cast to 0/1)\n\t\t(seg1.event.title || '').localeCompare(seg2.event.title); // tie? alphabetically by title\n}\n\nfc.compareSegs = compareSegs; // export\n\n\n/* External-Dragging-Element Data\n----------------------------------------------------------------------------------------------------------------------*/\n\n// Require all HTML5 data-* attributes used by FullCalendar to have this prefix.\n// A value of '' will query attributes like data-event. A value of 'fc' will query attributes like data-fc-event.\nfc.dataAttrPrefix = '';\n\n// Given a jQuery element that might represent a dragged FullCalendar event, returns an intermediate data structure\n// to be used for Event Object creation.\n// A defined `.eventProps`, even when empty, indicates that an event should be created.\nfunction getDraggedElMeta(el) {\n\tvar prefix = fc.dataAttrPrefix;\n\tvar eventProps; // properties for creating the event, not related to date/time\n\tvar startTime; // a Duration\n\tvar duration;\n\tvar stick;\n\n\tif (prefix) { prefix += '-'; }\n\teventProps = el.data(prefix + 'event') || null;\n\n\tif (eventProps) {\n\t\tif (typeof eventProps === 'object') {\n\t\t\teventProps = $.extend({}, eventProps); // make a copy\n\t\t}\n\t\telse { // something like 1 or true. still signal event creation\n\t\t\teventProps = {};\n\t\t}\n\n\t\t// pluck special-cased date/time properties\n\t\tstartTime = eventProps.start;\n\t\tif (startTime == null) { startTime = eventProps.time; } // accept 'time' as well\n\t\tduration = eventProps.duration;\n\t\tstick = eventProps.stick;\n\t\tdelete eventProps.start;\n\t\tdelete eventProps.time;\n\t\tdelete eventProps.duration;\n\t\tdelete eventProps.stick;\n\t}\n\n\t// fallback to standalone attribute values for each of the date/time properties\n\tif (startTime == null) { startTime = el.data(prefix + 'start'); }\n\tif (startTime == null) { startTime = el.data(prefix + 'time'); } // accept 'time' as well\n\tif (duration == null) { duration = el.data(prefix + 'duration'); }\n\tif (stick == null) { stick = el.data(prefix + 'stick'); }\n\n\t// massage into correct data types\n\tstartTime = startTime != null ? moment.duration(startTime) : null;\n\tduration = duration != null ? moment.duration(duration) : null;\n\tstick = Boolean(stick);\n\n\treturn { eventProps: eventProps, startTime: startTime, duration: duration, stick: stick };\n}\n\n\n;;\n\n/* A component that renders a grid of whole-days that runs horizontally. There can be multiple rows, one per week.\n----------------------------------------------------------------------------------------------------------------------*/\n\nvar DayGrid = Grid.extend({\n\n\tnumbersVisible: false, // should render a row for day/week numbers? set by outside view. TODO: make internal\n\tbottomCoordPadding: 0, // hack for extending the hit area for the last row of the coordinate grid\n\tbreakOnWeeks: null, // should create a new row for each week? set by outside view\n\n\tcellDates: null, // flat chronological array of each cell's dates\n\tdayToCellOffsets: null, // maps days offsets from grid's start date, to cell offsets\n\n\trowEls: null, // set of fake row elements\n\tdayEls: null, // set of whole-day elements comprising the row's background\n\thelperEls: null, // set of cell skeleton elements for rendering the mock event \"helper\"\n\n\n\tconstructor: function() {\n\t\tGrid.apply(this, arguments);\n\n\t\tthis.cellDuration = moment.duration(1, 'day'); // for Grid system\n\t},\n\n\n\t// Renders the rows and columns into the component's `this.el`, which should already be assigned.\n\t// isRigid determins whether the individual rows should ignore the contents and be a constant height.\n\t// Relies on the view's colCnt and rowCnt. In the future, this component should probably be self-sufficient.\n\trenderDates: function(isRigid) {\n\t\tvar view = this.view;\n\t\tvar rowCnt = this.rowCnt;\n\t\tvar colCnt = this.colCnt;\n\t\tvar cellCnt = rowCnt * colCnt;\n\t\tvar html = '';\n\t\tvar row;\n\t\tvar i, cell;\n\n\t\tfor (row = 0; row < rowCnt; row++) {\n\t\t\thtml += this.dayRowHtml(row, isRigid);\n\t\t}\n\t\tthis.el.html(html);\n\n\t\tthis.rowEls = this.el.find('.fc-row');\n\t\tthis.dayEls = this.el.find('.fc-day');\n\n\t\t// trigger dayRender with each cell's element\n\t\tfor (i = 0; i < cellCnt; i++) {\n\t\t\tcell = this.getCell(i);\n\t\t\tview.trigger('dayRender', null, cell.start, this.dayEls.eq(i));\n\t\t}\n\t},\n\n\n\tdestroyDates: function() {\n\t\tthis.destroySegPopover();\n\t},\n\n\n\trenderBusinessHours: function() {\n\t\tvar events = this.view.calendar.getBusinessHoursEvents(true); // wholeDay=true\n\t\tvar segs = this.eventsToSegs(events);\n\n\t\tthis.renderFill('businessHours', segs, 'bgevent');\n\t},\n\n\n\t// Generates the HTML for a single row. `row` is the row number.\n\tdayRowHtml: function(row, isRigid) {\n\t\tvar view = this.view;\n\t\tvar classes = [ 'fc-row', 'fc-week', view.widgetContentClass ];\n\n\t\tif (isRigid) {\n\t\t\tclasses.push('fc-rigid');\n\t\t}\n\n\t\treturn '' +\n\t\t\t'<div class=\"' + classes.join(' ') + '\">' +\n\t\t\t\t'<div class=\"fc-bg\">' +\n\t\t\t\t\t'<table>' +\n\t\t\t\t\t\tthis.rowHtml('day', row) + // leverages RowRenderer. calls dayCellHtml()\n\t\t\t\t\t'</table>' +\n\t\t\t\t'</div>' +\n\t\t\t\t'<div class=\"fc-content-skeleton\">' +\n\t\t\t\t\t'<table>' +\n\t\t\t\t\t\t(this.numbersVisible ?\n\t\t\t\t\t\t\t'<thead>' +\n\t\t\t\t\t\t\t\tthis.rowHtml('number', row) + // leverages RowRenderer. View will define render method\n\t\t\t\t\t\t\t'</thead>' :\n\t\t\t\t\t\t\t''\n\t\t\t\t\t\t\t) +\n\t\t\t\t\t'</table>' +\n\t\t\t\t'</div>' +\n\t\t\t'</div>';\n\t},\n\n\n\t// Renders the HTML for a whole-day cell. Will eventually end up in the day-row's background.\n\t// We go through a 'day' row type instead of just doing a 'bg' row type so that the View can do custom rendering\n\t// specifically for whole-day rows, whereas a 'bg' might also be used for other purposes (TimeGrid bg for example).\n\tdayCellHtml: function(cell) {\n\t\treturn this.bgCellHtml(cell);\n\t},\n\n\n\t/* Options\n\t------------------------------------------------------------------------------------------------------------------*/\n\n\n\t// Computes a default column header formatting string if `colFormat` is not explicitly defined\n\tcomputeColHeadFormat: function() {\n\t\tif (this.rowCnt > 1) { // more than one week row. day numbers will be in each cell\n\t\t\treturn 'ddd'; // \"Sat\"\n\t\t}\n\t\telse if (this.colCnt > 1) { // multiple days, so full single date string WON'T be in title text\n\t\t\treturn this.view.opt('dayOfMonthFormat'); // \"Sat 12/10\"\n\t\t}\n\t\telse { // single day, so full single date string will probably be in title text\n\t\t\treturn 'dddd'; // \"Saturday\"\n\t\t}\n\t},\n\n\n\t// Computes a default event time formatting string if `timeFormat` is not explicitly defined\n\tcomputeEventTimeFormat: function() {\n\t\treturn this.view.opt('extraSmallTimeFormat'); // like \"6p\" or \"6:30p\"\n\t},\n\n\n\t// Computes a default `displayEventEnd` value if one is not expliclty defined\n\tcomputeDisplayEventEnd: function() {\n\t\treturn this.colCnt == 1; // we'll likely have space if there's only one day\n\t},\n\n\n\t/* Cell System\n\t------------------------------------------------------------------------------------------------------------------*/\n\n\n\t// Initializes row/col information\n\tupdateCells: function() {\n\t\tvar cellDates;\n\t\tvar firstDay;\n\t\tvar rowCnt;\n\t\tvar colCnt;\n\n\t\tthis.updateCellDates(); // populates cellDates and dayToCellOffsets\n\t\tcellDates = this.cellDates;\n\n\t\tif (this.breakOnWeeks) {\n\t\t\t// count columns until the day-of-week repeats\n\t\t\tfirstDay = cellDates[0].day();\n\t\t\tfor (colCnt = 1; colCnt < cellDates.length; colCnt++) {\n\t\t\t\tif (cellDates[colCnt].day() == firstDay) {\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t}\n\t\t\trowCnt = Math.ceil(cellDates.length / colCnt);\n\t\t}\n\t\telse {\n\t\t\trowCnt = 1;\n\t\t\tcolCnt = cellDates.length;\n\t\t}\n\n\t\tthis.rowCnt = rowCnt;\n\t\tthis.colCnt = colCnt;\n\t},\n\n\n\t// Populates cellDates and dayToCellOffsets\n\tupdateCellDates: function() {\n\t\tvar view = this.view;\n\t\tvar date = this.start.clone();\n\t\tvar dates = [];\n\t\tvar offset = -1;\n\t\tvar offsets = [];\n\n\t\twhile (date.isBefore(this.end)) { // loop each day from start to end\n\t\t\tif (view.isHiddenDay(date)) {\n\t\t\t\toffsets.push(offset + 0.5); // mark that it's between offsets\n\t\t\t}\n\t\t\telse {\n\t\t\t\toffset++;\n\t\t\t\toffsets.push(offset);\n\t\t\t\tdates.push(date.clone());\n\t\t\t}\n\t\t\tdate.add(1, 'days');\n\t\t}\n\n\t\tthis.cellDates = dates;\n\t\tthis.dayToCellOffsets = offsets;\n\t},\n\n\n\t// Given a cell object, generates its start date. Returns a reference-free copy.\n\tcomputeCellDate: function(cell) {\n\t\tvar colCnt = this.colCnt;\n\t\tvar index = cell.row * colCnt + (this.isRTL ? colCnt - cell.col - 1 : cell.col);\n\n\t\treturn this.cellDates[index].clone();\n\t},\n\n\n\t// Retrieves the element representing the given row\n\tgetRowEl: function(row) {\n\t\treturn this.rowEls.eq(row);\n\t},\n\n\n\t// Retrieves the element representing the given column\n\tgetColEl: function(col) {\n\t\treturn this.dayEls.eq(col);\n\t},\n\n\n\t// Gets the whole-day element associated with the cell\n\tgetCellDayEl: function(cell) {\n\t\treturn this.dayEls.eq(cell.row * this.colCnt + cell.col);\n\t},\n\n\n\t// Overrides Grid's method for when row coordinates are computed\n\tcomputeRowCoords: function() {\n\t\tvar rowCoords = Grid.prototype.computeRowCoords.call(this); // call the super-method\n\n\t\t// hack for extending last row (used by AgendaView)\n\t\trowCoords[rowCoords.length - 1].bottom += this.bottomCoordPadding;\n\n\t\treturn rowCoords;\n\t},\n\n\n\t/* Dates\n\t------------------------------------------------------------------------------------------------------------------*/\n\n\n\t// Slices up a date range by row into an array of segments\n\trangeToSegs: function(range) {\n\t\tvar isRTL = this.isRTL;\n\t\tvar rowCnt = this.rowCnt;\n\t\tvar colCnt = this.colCnt;\n\t\tvar segs = [];\n\t\tvar first, last; // inclusive cell-offset range for given range\n\t\tvar row;\n\t\tvar rowFirst, rowLast; // inclusive cell-offset range for current row\n\t\tvar isStart, isEnd;\n\t\tvar segFirst, segLast; // inclusive cell-offset range for segment\n\t\tvar seg;\n\n\t\trange = this.view.computeDayRange(range); // make whole-day range, considering nextDayThreshold\n\t\tfirst = this.dateToCellOffset(range.start);\n\t\tlast = this.dateToCellOffset(range.end.subtract(1, 'days')); // offset of inclusive end date\n\n\t\tfor (row = 0; row < rowCnt; row++) {\n\t\t\trowFirst = row * colCnt;\n\t\t\trowLast = rowFirst + colCnt - 1;\n\n\t\t\t// intersect segment's offset range with the row's\n\t\t\tsegFirst = Math.max(rowFirst, first);\n\t\t\tsegLast = Math.min(rowLast, last);\n\n\t\t\t// deal with in-between indices\n\t\t\tsegFirst = Math.ceil(segFirst); // in-between starts round to next cell\n\t\t\tsegLast = Math.floor(segLast); // in-between ends round to prev cell\n\n\t\t\tif (segFirst <= segLast) { // was there any intersection with the current row?\n\n\t\t\t\t// must be matching integers to be the segment's start/end\n\t\t\t\tisStart = segFirst === first;\n\t\t\t\tisEnd = segLast === last;\n\n\t\t\t\t// translate offsets to be relative to start-of-row\n\t\t\t\tsegFirst -= rowFirst;\n\t\t\t\tsegLast -= rowFirst;\n\n\t\t\t\tseg = { row: row, isStart: isStart, isEnd: isEnd };\n\t\t\t\tif (isRTL) {\n\t\t\t\t\tseg.leftCol = colCnt - segLast - 1;\n\t\t\t\t\tseg.rightCol = colCnt - segFirst - 1;\n\t\t\t\t}\n\t\t\t\telse {\n\t\t\t\t\tseg.leftCol = segFirst;\n\t\t\t\t\tseg.rightCol = segLast;\n\t\t\t\t}\n\t\t\t\tsegs.push(seg);\n\t\t\t}\n\t\t}\n\n\t\treturn segs;\n\t},\n\n\n\t// Given a date, returns its chronolocial cell-offset from the first cell of the grid.\n\t// If the date lies between cells (because of hiddenDays), returns a floating-point value between offsets.\n\t// If before the first offset, returns a negative number.\n\t// If after the last offset, returns an offset past the last cell offset.\n\t// Only works for *start* dates of cells. Will not work for exclusive end dates for cells.\n\tdateToCellOffset: function(date) {\n\t\tvar offsets = this.dayToCellOffsets;\n\t\tvar day = date.diff(this.start, 'days');\n\n\t\tif (day < 0) {\n\t\t\treturn offsets[0] - 1;\n\t\t}\n\t\telse if (day >= offsets.length) {\n\t\t\treturn offsets[offsets.length - 1] + 1;\n\t\t}\n\t\telse {\n\t\t\treturn offsets[day];\n\t\t}\n\t},\n\n\n\t/* Event Drag Visualization\n\t------------------------------------------------------------------------------------------------------------------*/\n\t// TODO: move to DayGrid.event, similar to what we did with Grid's drag methods\n\n\n\t// Renders a visual indication of an event or external element being dragged.\n\t// The dropLocation's end can be null. seg can be null. See Grid::renderDrag for more info.\n\trenderDrag: function(dropLocation, seg) {\n\n\t\t// always render a highlight underneath\n\t\tthis.renderHighlight(\n\t\t\tthis.view.calendar.ensureVisibleEventRange(dropLocation) // needs to be a proper range\n\t\t);\n\n\t\t// if a segment from the same calendar but another component is being dragged, render a helper event\n\t\tif (seg && !seg.el.closest(this.el).length) {\n\n\t\t\tthis.renderRangeHelper(dropLocation, seg);\n\t\t\tthis.applyDragOpacity(this.helperEls);\n\n\t\t\treturn true; // a helper has been rendered\n\t\t}\n\t},\n\n\n\t// Unrenders any visual indication of a hovering event\n\tdestroyDrag: function() {\n\t\tthis.destroyHighlight();\n\t\tthis.destroyHelper();\n\t},\n\n\n\t/* Event Resize Visualization\n\t------------------------------------------------------------------------------------------------------------------*/\n\n\n\t// Renders a visual indication of an event being resized\n\trenderEventResize: function(range, seg) {\n\t\tthis.renderHighlight(range);\n\t\tthis.renderRangeHelper(range, seg);\n\t},\n\n\n\t// Unrenders a visual indication of an event being resized\n\tdestroyEventResize: function() {\n\t\tthis.destroyHighlight();\n\t\tthis.destroyHelper();\n\t},\n\n\n\t/* Event Helper\n\t------------------------------------------------------------------------------------------------------------------*/\n\n\n\t// Renders a mock \"helper\" event. `sourceSeg` is the associated internal segment object. It can be null.\n\trenderHelper: function(event, sourceSeg) {\n\t\tvar helperNodes = [];\n\t\tvar segs = this.eventsToSegs([ event ]);\n\t\tvar rowStructs;\n\n\t\tsegs = this.renderFgSegEls(segs); // assigns each seg's el and returns a subset of segs that were rendered\n\t\trowStructs = this.renderSegRows(segs);\n\n\t\t// inject each new event skeleton into each associated row\n\t\tthis.rowEls.each(function(row, rowNode) {\n\t\t\tvar rowEl = $(rowNode); // the .fc-row\n\t\t\tvar skeletonEl = $('<div class=\"fc-helper-skeleton\"><table/></div>'); // will be absolutely positioned\n\t\t\tvar skeletonTop;\n\n\t\t\t// If there is an original segment, match the top position. Otherwise, put it at the row's top level\n\t\t\tif (sourceSeg && sourceSeg.row === row) {\n\t\t\t\tskeletonTop = sourceSeg.el.position().top;\n\t\t\t}\n\t\t\telse {\n\t\t\t\tskeletonTop = rowEl.find('.fc-content-skeleton tbody').position().top;\n\t\t\t}\n\n\t\t\tskeletonEl.css('top', skeletonTop)\n\t\t\t\t.find('table')\n\t\t\t\t\t.append(rowStructs[row].tbodyEl);\n\n\t\t\trowEl.append(skeletonEl);\n\t\t\thelperNodes.push(skeletonEl[0]);\n\t\t});\n\n\t\tthis.helperEls = $(helperNodes); // array -> jQuery set\n\t},\n\n\n\t// Unrenders any visual indication of a mock helper event\n\tdestroyHelper: function() {\n\t\tif (this.helperEls) {\n\t\t\tthis.helperEls.remove();\n\t\t\tthis.helperEls = null;\n\t\t}\n\t},\n\n\n\t/* Fill System (highlight, background events, business hours)\n\t------------------------------------------------------------------------------------------------------------------*/\n\n\n\tfillSegTag: 'td', // override the default tag name\n\n\n\t// Renders a set of rectangles over the given segments of days.\n\t// Only returns segments that successfully rendered.\n\trenderFill: function(type, segs, className) {\n\t\tvar nodes = [];\n\t\tvar i, seg;\n\t\tvar skeletonEl;\n\n\t\tsegs = this.renderFillSegEls(type, segs); // assignes `.el` to each seg. returns successfully rendered segs\n\n\t\tfor (i = 0; i < segs.length; i++) {\n\t\t\tseg = segs[i];\n\t\t\tskeletonEl = this.renderFillRow(type, seg, className);\n\t\t\tthis.rowEls.eq(seg.row).append(skeletonEl);\n\t\t\tnodes.push(skeletonEl[0]);\n\t\t}\n\n\t\tthis.elsByFill[type] = $(nodes);\n\n\t\treturn segs;\n\t},\n\n\n\t// Generates the HTML needed for one row of a fill. Requires the seg's el to be rendered.\n\trenderFillRow: function(type, seg, className) {\n\t\tvar colCnt = this.colCnt;\n\t\tvar startCol = seg.leftCol;\n\t\tvar endCol = seg.rightCol + 1;\n\t\tvar skeletonEl;\n\t\tvar trEl;\n\n\t\tclassName = className || type.toLowerCase();\n\n\t\tskeletonEl = $(\n\t\t\t'<div class=\"fc-' + className + '-skeleton\">' +\n\t\t\t\t'<table><tr/></table>' +\n\t\t\t'</div>'\n\t\t);\n\t\ttrEl = skeletonEl.find('tr');\n\n\t\tif (startCol > 0) {\n\t\t\ttrEl.append('<td colspan=\"' + startCol + '\"/>');\n\t\t}\n\n\t\ttrEl.append(\n\t\t\tseg.el.attr('colspan', endCol - startCol)\n\t\t);\n\n\t\tif (endCol < colCnt) {\n\t\t\ttrEl.append('<td colspan=\"' + (colCnt - endCol) + '\"/>');\n\t\t}\n\n\t\tthis.bookendCells(trEl, type);\n\n\t\treturn skeletonEl;\n\t}\n\n});\n\n;;\n\n/* Event-rendering methods for the DayGrid class\n----------------------------------------------------------------------------------------------------------------------*/\n\nDayGrid.mixin({\n\n\trowStructs: null, // an array of objects, each holding information about a row's foreground event-rendering\n\n\n\t// Unrenders all events currently rendered on the grid\n\tdestroyEvents: function() {\n\t\tthis.destroySegPopover(); // removes the \"more..\" events popover\n\t\tGrid.prototype.destroyEvents.apply(this, arguments); // calls the super-method\n\t},\n\n\n\t// Retrieves all rendered segment objects currently rendered on the grid\n\tgetEventSegs: function() {\n\t\treturn Grid.prototype.getEventSegs.call(this) // get the segments from the super-method\n\t\t\t.concat(this.popoverSegs || []); // append the segments from the \"more...\" popover\n\t},\n\n\n\t// Renders the given background event segments onto the grid\n\trenderBgSegs: function(segs) {\n\n\t\t// don't render timed background events\n\t\tvar allDaySegs = $.grep(segs, function(seg) {\n\t\t\treturn seg.event.allDay;\n\t\t});\n\n\t\treturn Grid.prototype.renderBgSegs.call(this, allDaySegs); // call the super-method\n\t},\n\n\n\t// Renders the given foreground event segments onto the grid\n\trenderFgSegs: function(segs) {\n\t\tvar rowStructs;\n\n\t\t// render an `.el` on each seg\n\t\t// returns a subset of the segs. segs that were actually rendered\n\t\tsegs = this.renderFgSegEls(segs);\n\n\t\trowStructs = this.rowStructs = this.renderSegRows(segs);\n\n\t\t// append to each row's content skeleton\n\t\tthis.rowEls.each(function(i, rowNode) {\n\t\t\t$(rowNode).find('.fc-content-skeleton > table').append(\n\t\t\t\trowStructs[i].tbodyEl\n\t\t\t);\n\t\t});\n\n\t\treturn segs; // return only the segs that were actually rendered\n\t},\n\n\n\t// Unrenders all currently rendered foreground event segments\n\tdestroyFgSegs: function() {\n\t\tvar rowStructs = this.rowStructs || [];\n\t\tvar rowStruct;\n\n\t\twhile ((rowStruct = rowStructs.pop())) {\n\t\t\trowStruct.tbodyEl.remove();\n\t\t}\n\n\t\tthis.rowStructs = null;\n\t},\n\n\n\t// Uses the given events array to generate <tbody> elements that should be appended to each row's content skeleton.\n\t// Returns an array of rowStruct objects (see the bottom of `renderSegRow`).\n\t// PRECONDITION: each segment shoud already have a rendered and assigned `.el`\n\trenderSegRows: function(segs) {\n\t\tvar rowStructs = [];\n\t\tvar segRows;\n\t\tvar row;\n\n\t\tsegRows = this.groupSegRows(segs); // group into nested arrays\n\n\t\t// iterate each row of segment groupings\n\t\tfor (row = 0; row < segRows.length; row++) {\n\t\t\trowStructs.push(\n\t\t\t\tthis.renderSegRow(row, segRows[row])\n\t\t\t);\n\t\t}\n\n\t\treturn rowStructs;\n\t},\n\n\n\t// Builds the HTML to be used for the default element for an individual segment\n\tfgSegHtml: function(seg, disableResizing) {\n\t\tvar view = this.view;\n\t\tvar event = seg.event;\n\t\tvar isDraggable = view.isEventDraggable(event);\n\t\tvar isResizableFromStart = !disableResizing && event.allDay &&\n\t\t\tseg.isStart && view.isEventResizableFromStart(event);\n\t\tvar isResizableFromEnd = !disableResizing && event.allDay &&\n\t\t\tseg.isEnd && view.isEventResizableFromEnd(event);\n\t\tvar classes = this.getSegClasses(seg, isDraggable, isResizableFromStart || isResizableFromEnd);\n\t\tvar skinCss = cssToStr(this.getEventSkinCss(event));\n\t\tvar timeHtml = '';\n\t\tvar timeText;\n\t\tvar titleHtml;\n\n\t\tclasses.unshift('fc-day-grid-event', 'fc-h-event');\n\n\t\t// Only display a timed events time if it is the starting segment\n\t\tif (seg.isStart) {\n\t\t\ttimeText = this.getEventTimeText(event);\n\t\t\tif (timeText) {\n\t\t\t\ttimeHtml = '<span class=\"fc-time\">' + htmlEscape(timeText) + '</span>';\n\t\t\t}\n\t\t}\n\n\t\ttitleHtml =\n\t\t\t'<span class=\"fc-title\">' +\n\t\t\t\t(htmlEscape(event.title || '') || '&nbsp;') + // we always want one line of height\n\t\t\t'</span>';\n\t\t\n\t\treturn '<a class=\"' + classes.join(' ') + '\"' +\n\t\t\t\t(event.url ?\n\t\t\t\t\t' href=\"' + htmlEscape(event.url) + '\"' :\n\t\t\t\t\t''\n\t\t\t\t\t) +\n\t\t\t\t(skinCss ?\n\t\t\t\t\t' style=\"' + skinCss + '\"' :\n\t\t\t\t\t''\n\t\t\t\t\t) +\n\t\t\t'>' +\n\t\t\t\t'<div class=\"fc-content\">' +\n\t\t\t\t\t(this.isRTL ?\n\t\t\t\t\t\ttitleHtml + ' ' + timeHtml : // put a natural space in between\n\t\t\t\t\t\ttimeHtml + ' ' + titleHtml   //\n\t\t\t\t\t\t) +\n\t\t\t\t'</div>' +\n\t\t\t\t(isResizableFromStart ?\n\t\t\t\t\t'<div class=\"fc-resizer fc-start-resizer\" />' :\n\t\t\t\t\t''\n\t\t\t\t\t) +\n\t\t\t\t(isResizableFromEnd ?\n\t\t\t\t\t'<div class=\"fc-resizer fc-end-resizer\" />' :\n\t\t\t\t\t''\n\t\t\t\t\t) +\n\t\t\t'</a>';\n\t},\n\n\n\t// Given a row # and an array of segments all in the same row, render a <tbody> element, a skeleton that contains\n\t// the segments. Returns object with a bunch of internal data about how the render was calculated.\n\t// NOTE: modifies rowSegs\n\trenderSegRow: function(row, rowSegs) {\n\t\tvar colCnt = this.colCnt;\n\t\tvar segLevels = this.buildSegLevels(rowSegs); // group into sub-arrays of levels\n\t\tvar levelCnt = Math.max(1, segLevels.length); // ensure at least one level\n\t\tvar tbody = $('<tbody/>');\n\t\tvar segMatrix = []; // lookup for which segments are rendered into which level+col cells\n\t\tvar cellMatrix = []; // lookup for all <td> elements of the level+col matrix\n\t\tvar loneCellMatrix = []; // lookup for <td> elements that only take up a single column\n\t\tvar i, levelSegs;\n\t\tvar col;\n\t\tvar tr;\n\t\tvar j, seg;\n\t\tvar td;\n\n\t\t// populates empty cells from the current column (`col`) to `endCol`\n\t\tfunction emptyCellsUntil(endCol) {\n\t\t\twhile (col < endCol) {\n\t\t\t\t// try to grab a cell from the level above and extend its rowspan. otherwise, create a fresh cell\n\t\t\t\ttd = (loneCellMatrix[i - 1] || [])[col];\n\t\t\t\tif (td) {\n\t\t\t\t\ttd.attr(\n\t\t\t\t\t\t'rowspan',\n\t\t\t\t\t\tparseInt(td.attr('rowspan') || 1, 10) + 1\n\t\t\t\t\t);\n\t\t\t\t}\n\t\t\t\telse {\n\t\t\t\t\ttd = $('<td/>');\n\t\t\t\t\ttr.append(td);\n\t\t\t\t}\n\t\t\t\tcellMatrix[i][col] = td;\n\t\t\t\tloneCellMatrix[i][col] = td;\n\t\t\t\tcol++;\n\t\t\t}\n\t\t}\n\n\t\tfor (i = 0; i < levelCnt; i++) { // iterate through all levels\n\t\t\tlevelSegs = segLevels[i];\n\t\t\tcol = 0;\n\t\t\ttr = $('<tr/>');\n\n\t\t\tsegMatrix.push([]);\n\t\t\tcellMatrix.push([]);\n\t\t\tloneCellMatrix.push([]);\n\n\t\t\t// levelCnt might be 1 even though there are no actual levels. protect against this.\n\t\t\t// this single empty row is useful for styling.\n\t\t\tif (levelSegs) {\n\t\t\t\tfor (j = 0; j < levelSegs.length; j++) { // iterate through segments in level\n\t\t\t\t\tseg = levelSegs[j];\n\n\t\t\t\t\temptyCellsUntil(seg.leftCol);\n\n\t\t\t\t\t// create a container that occupies or more columns. append the event element.\n\t\t\t\t\ttd = $('<td class=\"fc-event-container\"/>').append(seg.el);\n\t\t\t\t\tif (seg.leftCol != seg.rightCol) {\n\t\t\t\t\t\ttd.attr('colspan', seg.rightCol - seg.leftCol + 1);\n\t\t\t\t\t}\n\t\t\t\t\telse { // a single-column segment\n\t\t\t\t\t\tloneCellMatrix[i][col] = td;\n\t\t\t\t\t}\n\n\t\t\t\t\twhile (col <= seg.rightCol) {\n\t\t\t\t\t\tcellMatrix[i][col] = td;\n\t\t\t\t\t\tsegMatrix[i][col] = seg;\n\t\t\t\t\t\tcol++;\n\t\t\t\t\t}\n\n\t\t\t\t\ttr.append(td);\n\t\t\t\t}\n\t\t\t}\n\n\t\t\temptyCellsUntil(colCnt); // finish off the row\n\t\t\tthis.bookendCells(tr, 'eventSkeleton');\n\t\t\ttbody.append(tr);\n\t\t}\n\n\t\treturn { // a \"rowStruct\"\n\t\t\trow: row, // the row number\n\t\t\ttbodyEl: tbody,\n\t\t\tcellMatrix: cellMatrix,\n\t\t\tsegMatrix: segMatrix,\n\t\t\tsegLevels: segLevels,\n\t\t\tsegs: rowSegs\n\t\t};\n\t},\n\n\n\t// Stacks a flat array of segments, which are all assumed to be in the same row, into subarrays of vertical levels.\n\t// NOTE: modifies segs\n\tbuildSegLevels: function(segs) {\n\t\tvar levels = [];\n\t\tvar i, seg;\n\t\tvar j;\n\n\t\t// Give preference to elements with certain criteria, so they have\n\t\t// a chance to be closer to the top.\n\t\tsegs.sort(compareSegs);\n\t\t\n\t\tfor (i = 0; i < segs.length; i++) {\n\t\t\tseg = segs[i];\n\n\t\t\t// loop through levels, starting with the topmost, until the segment doesn't collide with other segments\n\t\t\tfor (j = 0; j < levels.length; j++) {\n\t\t\t\tif (!isDaySegCollision(seg, levels[j])) {\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t}\n\t\t\t// `j` now holds the desired subrow index\n\t\t\tseg.level = j;\n\n\t\t\t// create new level array if needed and append segment\n\t\t\t(levels[j] || (levels[j] = [])).push(seg);\n\t\t}\n\n\t\t// order segments left-to-right. very important if calendar is RTL\n\t\tfor (j = 0; j < levels.length; j++) {\n\t\t\tlevels[j].sort(compareDaySegCols);\n\t\t}\n\n\t\treturn levels;\n\t},\n\n\n\t// Given a flat array of segments, return an array of sub-arrays, grouped by each segment's row\n\tgroupSegRows: function(segs) {\n\t\tvar segRows = [];\n\t\tvar i;\n\n\t\tfor (i = 0; i < this.rowCnt; i++) {\n\t\t\tsegRows.push([]);\n\t\t}\n\n\t\tfor (i = 0; i < segs.length; i++) {\n\t\t\tsegRows[segs[i].row].push(segs[i]);\n\t\t}\n\n\t\treturn segRows;\n\t}\n\n});\n\n\n// Computes whether two segments' columns collide. They are assumed to be in the same row.\nfunction isDaySegCollision(seg, otherSegs) {\n\tvar i, otherSeg;\n\n\tfor (i = 0; i < otherSegs.length; i++) {\n\t\totherSeg = otherSegs[i];\n\n\t\tif (\n\t\t\totherSeg.leftCol <= seg.rightCol &&\n\t\t\totherSeg.rightCol >= seg.leftCol\n\t\t) {\n\t\t\treturn true;\n\t\t}\n\t}\n\n\treturn false;\n}\n\n\n// A cmp function for determining the leftmost event\nfunction compareDaySegCols(a, b) {\n\treturn a.leftCol - b.leftCol;\n}\n\n;;\n\n/* Methods relate to limiting the number events for a given day on a DayGrid\n----------------------------------------------------------------------------------------------------------------------*/\n// NOTE: all the segs being passed around in here are foreground segs\n\nDayGrid.mixin({\n\n\tsegPopover: null, // the Popover that holds events that can't fit in a cell. null when not visible\n\tpopoverSegs: null, // an array of segment objects that the segPopover holds. null when not visible\n\n\n\tdestroySegPopover: function() {\n\t\tif (this.segPopover) {\n\t\t\tthis.segPopover.hide(); // will trigger destruction of `segPopover` and `popoverSegs`\n\t\t}\n\t},\n\n\n\t// Limits the number of \"levels\" (vertically stacking layers of events) for each row of the grid.\n\t// `levelLimit` can be false (don't limit), a number, or true (should be computed).\n\tlimitRows: function(levelLimit) {\n\t\tvar rowStructs = this.rowStructs || [];\n\t\tvar row; // row #\n\t\tvar rowLevelLimit;\n\n\t\tfor (row = 0; row < rowStructs.length; row++) {\n\t\t\tthis.unlimitRow(row);\n\n\t\t\tif (!levelLimit) {\n\t\t\t\trowLevelLimit = false;\n\t\t\t}\n\t\t\telse if (typeof levelLimit === 'number') {\n\t\t\t\trowLevelLimit = levelLimit;\n\t\t\t}\n\t\t\telse {\n\t\t\t\trowLevelLimit = this.computeRowLevelLimit(row);\n\t\t\t}\n\n\t\t\tif (rowLevelLimit !== false) {\n\t\t\t\tthis.limitRow(row, rowLevelLimit);\n\t\t\t}\n\t\t}\n\t},\n\n\n\t// Computes the number of levels a row will accomodate without going outside its bounds.\n\t// Assumes the row is \"rigid\" (maintains a constant height regardless of what is inside).\n\t// `row` is the row number.\n\tcomputeRowLevelLimit: function(row) {\n\t\tvar rowEl = this.rowEls.eq(row); // the containing \"fake\" row div\n\t\tvar rowHeight = rowEl.height(); // TODO: cache somehow?\n\t\tvar trEls = this.rowStructs[row].tbodyEl.children();\n\t\tvar i, trEl;\n\t\tvar trHeight;\n\n\t\tfunction iterInnerHeights(i, childNode) {\n\t\t\ttrHeight = Math.max(trHeight, $(childNode).outerHeight());\n\t\t}\n\n\t\t// Reveal one level <tr> at a time and stop when we find one out of bounds\n\t\tfor (i = 0; i < trEls.length; i++) {\n\t\t\ttrEl = trEls.eq(i).removeClass('fc-limited'); // reset to original state (reveal)\n\n\t\t\t// with rowspans>1 and IE8, trEl.outerHeight() would return the height of the largest cell,\n\t\t\t// so instead, find the tallest inner content element.\n\t\t\ttrHeight = 0;\n\t\t\ttrEl.find('> td > :first-child').each(iterInnerHeights);\n\n\t\t\tif (trEl.position().top + trHeight > rowHeight) {\n\t\t\t\treturn i;\n\t\t\t}\n\t\t}\n\n\t\treturn false; // should not limit at all\n\t},\n\n\n\t// Limits the given grid row to the maximum number of levels and injects \"more\" links if necessary.\n\t// `row` is the row number.\n\t// `levelLimit` is a number for the maximum (inclusive) number of levels allowed.\n\tlimitRow: function(row, levelLimit) {\n\t\tvar _this = this;\n\t\tvar rowStruct = this.rowStructs[row];\n\t\tvar moreNodes = []; // array of \"more\" <a> links and <td> DOM nodes\n\t\tvar col = 0; // col #, left-to-right (not chronologically)\n\t\tvar cell;\n\t\tvar levelSegs; // array of segment objects in the last allowable level, ordered left-to-right\n\t\tvar cellMatrix; // a matrix (by level, then column) of all <td> jQuery elements in the row\n\t\tvar limitedNodes; // array of temporarily hidden level <tr> and segment <td> DOM nodes\n\t\tvar i, seg;\n\t\tvar segsBelow; // array of segment objects below `seg` in the current `col`\n\t\tvar totalSegsBelow; // total number of segments below `seg` in any of the columns `seg` occupies\n\t\tvar colSegsBelow; // array of segment arrays, below seg, one for each column (offset from segs's first column)\n\t\tvar td, rowspan;\n\t\tvar segMoreNodes; // array of \"more\" <td> cells that will stand-in for the current seg's cell\n\t\tvar j;\n\t\tvar moreTd, moreWrap, moreLink;\n\n\t\t// Iterates through empty level cells and places \"more\" links inside if need be\n\t\tfunction emptyCellsUntil(endCol) { // goes from current `col` to `endCol`\n\t\t\twhile (col < endCol) {\n\t\t\t\tcell = _this.getCell(row, col);\n\t\t\t\tsegsBelow = _this.getCellSegs(cell, levelLimit);\n\t\t\t\tif (segsBelow.length) {\n\t\t\t\t\ttd = cellMatrix[levelLimit - 1][col];\n\t\t\t\t\tmoreLink = _this.renderMoreLink(cell, segsBelow);\n\t\t\t\t\tmoreWrap = $('<div/>').append(moreLink);\n\t\t\t\t\ttd.append(moreWrap);\n\t\t\t\t\tmoreNodes.push(moreWrap[0]);\n\t\t\t\t}\n\t\t\t\tcol++;\n\t\t\t}\n\t\t}\n\n\t\tif (levelLimit && levelLimit < rowStruct.segLevels.length) { // is it actually over the limit?\n\t\t\tlevelSegs = rowStruct.segLevels[levelLimit - 1];\n\t\t\tcellMatrix = rowStruct.cellMatrix;\n\n\t\t\tlimitedNodes = rowStruct.tbodyEl.children().slice(levelLimit) // get level <tr> elements past the limit\n\t\t\t\t.addClass('fc-limited').get(); // hide elements and get a simple DOM-nodes array\n\n\t\t\t// iterate though segments in the last allowable level\n\t\t\tfor (i = 0; i < levelSegs.length; i++) {\n\t\t\t\tseg = levelSegs[i];\n\t\t\t\temptyCellsUntil(seg.leftCol); // process empty cells before the segment\n\n\t\t\t\t// determine *all* segments below `seg` that occupy the same columns\n\t\t\t\tcolSegsBelow = [];\n\t\t\t\ttotalSegsBelow = 0;\n\t\t\t\twhile (col <= seg.rightCol) {\n\t\t\t\t\tcell = this.getCell(row, col);\n\t\t\t\t\tsegsBelow = this.getCellSegs(cell, levelLimit);\n\t\t\t\t\tcolSegsBelow.push(segsBelow);\n\t\t\t\t\ttotalSegsBelow += segsBelow.length;\n\t\t\t\t\tcol++;\n\t\t\t\t}\n\n\t\t\t\tif (totalSegsBelow) { // do we need to replace this segment with one or many \"more\" links?\n\t\t\t\t\ttd = cellMatrix[levelLimit - 1][seg.leftCol]; // the segment's parent cell\n\t\t\t\t\trowspan = td.attr('rowspan') || 1;\n\t\t\t\t\tsegMoreNodes = [];\n\n\t\t\t\t\t// make a replacement <td> for each column the segment occupies. will be one for each colspan\n\t\t\t\t\tfor (j = 0; j < colSegsBelow.length; j++) {\n\t\t\t\t\t\tmoreTd = $('<td class=\"fc-more-cell\"/>').attr('rowspan', rowspan);\n\t\t\t\t\t\tsegsBelow = colSegsBelow[j];\n\t\t\t\t\t\tcell = this.getCell(row, seg.leftCol + j);\n\t\t\t\t\t\tmoreLink = this.renderMoreLink(cell, [ seg ].concat(segsBelow)); // count seg as hidden too\n\t\t\t\t\t\tmoreWrap = $('<div/>').append(moreLink);\n\t\t\t\t\t\tmoreTd.append(moreWrap);\n\t\t\t\t\t\tsegMoreNodes.push(moreTd[0]);\n\t\t\t\t\t\tmoreNodes.push(moreTd[0]);\n\t\t\t\t\t}\n\n\t\t\t\t\ttd.addClass('fc-limited').after($(segMoreNodes)); // hide original <td> and inject replacements\n\t\t\t\t\tlimitedNodes.push(td[0]);\n\t\t\t\t}\n\t\t\t}\n\n\t\t\temptyCellsUntil(this.colCnt); // finish off the level\n\t\t\trowStruct.moreEls = $(moreNodes); // for easy undoing later\n\t\t\trowStruct.limitedEls = $(limitedNodes); // for easy undoing later\n\t\t}\n\t},\n\n\n\t// Reveals all levels and removes all \"more\"-related elements for a grid's row.\n\t// `row` is a row number.\n\tunlimitRow: function(row) {\n\t\tvar rowStruct = this.rowStructs[row];\n\n\t\tif (rowStruct.moreEls) {\n\t\t\trowStruct.moreEls.remove();\n\t\t\trowStruct.moreEls = null;\n\t\t}\n\n\t\tif (rowStruct.limitedEls) {\n\t\t\trowStruct.limitedEls.removeClass('fc-limited');\n\t\t\trowStruct.limitedEls = null;\n\t\t}\n\t},\n\n\n\t// Renders an <a> element that represents hidden event element for a cell.\n\t// Responsible for attaching click handler as well.\n\trenderMoreLink: function(cell, hiddenSegs) {\n\t\tvar _this = this;\n\t\tvar view = this.view;\n\n\t\treturn $('<a class=\"fc-more\"/>')\n\t\t\t.text(\n\t\t\t\tthis.getMoreLinkText(hiddenSegs.length)\n\t\t\t)\n\t\t\t.on('click', function(ev) {\n\t\t\t\tvar clickOption = view.opt('eventLimitClick');\n\t\t\t\tvar date = cell.start;\n\t\t\t\tvar moreEl = $(this);\n\t\t\t\tvar dayEl = _this.getCellDayEl(cell);\n\t\t\t\tvar allSegs = _this.getCellSegs(cell);\n\n\t\t\t\t// rescope the segments to be within the cell's date\n\t\t\t\tvar reslicedAllSegs = _this.resliceDaySegs(allSegs, date);\n\t\t\t\tvar reslicedHiddenSegs = _this.resliceDaySegs(hiddenSegs, date);\n\n\t\t\t\tif (typeof clickOption === 'function') {\n\t\t\t\t\t// the returned value can be an atomic option\n\t\t\t\t\tclickOption = view.trigger('eventLimitClick', null, {\n\t\t\t\t\t\tdate: date,\n\t\t\t\t\t\tdayEl: dayEl,\n\t\t\t\t\t\tmoreEl: moreEl,\n\t\t\t\t\t\tsegs: reslicedAllSegs,\n\t\t\t\t\t\thiddenSegs: reslicedHiddenSegs\n\t\t\t\t\t}, ev);\n\t\t\t\t}\n\n\t\t\t\tif (clickOption === 'popover') {\n\t\t\t\t\t_this.showSegPopover(cell, moreEl, reslicedAllSegs);\n\t\t\t\t}\n\t\t\t\telse if (typeof clickOption === 'string') { // a view name\n\t\t\t\t\tview.calendar.zoomTo(date, clickOption);\n\t\t\t\t}\n\t\t\t});\n\t},\n\n\n\t// Reveals the popover that displays all events within a cell\n\tshowSegPopover: function(cell, moreLink, segs) {\n\t\tvar _this = this;\n\t\tvar view = this.view;\n\t\tvar moreWrap = moreLink.parent(); // the <div> wrapper around the <a>\n\t\tvar topEl; // the element we want to match the top coordinate of\n\t\tvar options;\n\n\t\tif (this.rowCnt == 1) {\n\t\t\ttopEl = view.el; // will cause the popover to cover any sort of header\n\t\t}\n\t\telse {\n\t\t\ttopEl = this.rowEls.eq(cell.row); // will align with top of row\n\t\t}\n\n\t\toptions = {\n\t\t\tclassName: 'fc-more-popover',\n\t\t\tcontent: this.renderSegPopoverContent(cell, segs),\n\t\t\tparentEl: this.el,\n\t\t\ttop: topEl.offset().top,\n\t\t\tautoHide: true, // when the user clicks elsewhere, hide the popover\n\t\t\tviewportConstrain: view.opt('popoverViewportConstrain'),\n\t\t\thide: function() {\n\t\t\t\t// destroy everything when the popover is hidden\n\t\t\t\t_this.segPopover.destroy();\n\t\t\t\t_this.segPopover = null;\n\t\t\t\t_this.popoverSegs = null;\n\t\t\t}\n\t\t};\n\n\t\t// Determine horizontal coordinate.\n\t\t// We use the moreWrap instead of the <td> to avoid border confusion.\n\t\tif (this.isRTL) {\n\t\t\toptions.right = moreWrap.offset().left + moreWrap.outerWidth() + 1; // +1 to be over cell border\n\t\t}\n\t\telse {\n\t\t\toptions.left = moreWrap.offset().left - 1; // -1 to be over cell border\n\t\t}\n\n\t\tthis.segPopover = new Popover(options);\n\t\tthis.segPopover.show();\n\t},\n\n\n\t// Builds the inner DOM contents of the segment popover\n\trenderSegPopoverContent: function(cell, segs) {\n\t\tvar view = this.view;\n\t\tvar isTheme = view.opt('theme');\n\t\tvar title = cell.start.format(view.opt('dayPopoverFormat'));\n\t\tvar content = $(\n\t\t\t'<div class=\"fc-header ' + view.widgetHeaderClass + '\">' +\n\t\t\t\t'<span class=\"fc-close ' +\n\t\t\t\t\t(isTheme ? 'ui-icon ui-icon-closethick' : 'fc-icon fc-icon-x') +\n\t\t\t\t'\"></span>' +\n\t\t\t\t'<span class=\"fc-title\">' +\n\t\t\t\t\thtmlEscape(title) +\n\t\t\t\t'</span>' +\n\t\t\t\t'<div class=\"fc-clear\"/>' +\n\t\t\t'</div>' +\n\t\t\t'<div class=\"fc-body ' + view.widgetContentClass + '\">' +\n\t\t\t\t'<div class=\"fc-event-container\"></div>' +\n\t\t\t'</div>'\n\t\t);\n\t\tvar segContainer = content.find('.fc-event-container');\n\t\tvar i;\n\n\t\t// render each seg's `el` and only return the visible segs\n\t\tsegs = this.renderFgSegEls(segs, true); // disableResizing=true\n\t\tthis.popoverSegs = segs;\n\n\t\tfor (i = 0; i < segs.length; i++) {\n\n\t\t\t// because segments in the popover are not part of a grid coordinate system, provide a hint to any\n\t\t\t// grids that want to do drag-n-drop about which cell it came from\n\t\t\tsegs[i].cell = cell;\n\n\t\t\tsegContainer.append(segs[i].el);\n\t\t}\n\n\t\treturn content;\n\t},\n\n\n\t// Given the events within an array of segment objects, reslice them to be in a single day\n\tresliceDaySegs: function(segs, dayDate) {\n\n\t\t// build an array of the original events\n\t\tvar events = $.map(segs, function(seg) {\n\t\t\treturn seg.event;\n\t\t});\n\n\t\tvar dayStart = dayDate.clone().stripTime();\n\t\tvar dayEnd = dayStart.clone().add(1, 'days');\n\t\tvar dayRange = { start: dayStart, end: dayEnd };\n\n\t\t// slice the events with a custom slicing function\n\t\tsegs = this.eventsToSegs(\n\t\t\tevents,\n\t\t\tfunction(range) {\n\t\t\t\tvar seg = intersectionToSeg(range, dayRange); // undefind if no intersection\n\t\t\t\treturn seg ? [ seg ] : []; // must return an array of segments\n\t\t\t}\n\t\t);\n\n\t\t// force an order because eventsToSegs doesn't guarantee one\n\t\tsegs.sort(compareSegs);\n\n\t\treturn segs;\n\t},\n\n\n\t// Generates the text that should be inside a \"more\" link, given the number of events it represents\n\tgetMoreLinkText: function(num) {\n\t\tvar opt = this.view.opt('eventLimitText');\n\n\t\tif (typeof opt === 'function') {\n\t\t\treturn opt(num);\n\t\t}\n\t\telse {\n\t\t\treturn '+' + num + ' ' + opt;\n\t\t}\n\t},\n\n\n\t// Returns segments within a given cell.\n\t// If `startLevel` is specified, returns only events including and below that level. Otherwise returns all segs.\n\tgetCellSegs: function(cell, startLevel) {\n\t\tvar segMatrix = this.rowStructs[cell.row].segMatrix;\n\t\tvar level = startLevel || 0;\n\t\tvar segs = [];\n\t\tvar seg;\n\n\t\twhile (level < segMatrix.length) {\n\t\t\tseg = segMatrix[level][cell.col];\n\t\t\tif (seg) {\n\t\t\t\tsegs.push(seg);\n\t\t\t}\n\t\t\tlevel++;\n\t\t}\n\n\t\treturn segs;\n\t}\n\n});\n\n;;\n\n/* A component that renders one or more columns of vertical time slots\n----------------------------------------------------------------------------------------------------------------------*/\n\nvar TimeGrid = Grid.extend({\n\n\tslotDuration: null, // duration of a \"slot\", a distinct time segment on given day, visualized by lines\n\tsnapDuration: null, // granularity of time for dragging and selecting\n\n\tminTime: null, // Duration object that denotes the first visible time of any given day\n\tmaxTime: null, // Duration object that denotes the exclusive visible end time of any given day\n\n\taxisFormat: null, // formatting string for times running along vertical axis\n\n\tdayEls: null, // cells elements in the day-row background\n\tslatEls: null, // elements running horizontally across all columns\n\n\tslatTops: null, // an array of top positions, relative to the container. last item holds bottom of last slot\n\n\thelperEl: null, // cell skeleton element for rendering the mock event \"helper\"\n\n\tbusinessHourSegs: null,\n\n\n\tconstructor: function() {\n\t\tGrid.apply(this, arguments); // call the super-constructor\n\t\tthis.processOptions();\n\t},\n\n\n\t// Renders the time grid into `this.el`, which should already be assigned.\n\t// Relies on the view's colCnt. In the future, this component should probably be self-sufficient.\n\trenderDates: function() {\n\t\tthis.el.html(this.renderHtml());\n\t\tthis.dayEls = this.el.find('.fc-day');\n\t\tthis.slatEls = this.el.find('.fc-slats tr');\n\t},\n\n\n\trenderBusinessHours: function() {\n\t\tvar events = this.view.calendar.getBusinessHoursEvents();\n\t\tthis.businessHourSegs = this.renderFill('businessHours', this.eventsToSegs(events), 'bgevent');\n\t},\n\n\n\t// Renders the basic HTML skeleton for the grid\n\trenderHtml: function() {\n\t\treturn '' +\n\t\t\t'<div class=\"fc-bg\">' +\n\t\t\t\t'<table>' +\n\t\t\t\t\tthis.rowHtml('slotBg') + // leverages RowRenderer, which will call slotBgCellHtml\n\t\t\t\t'</table>' +\n\t\t\t'</div>' +\n\t\t\t'<div class=\"fc-slats\">' +\n\t\t\t\t'<table>' +\n\t\t\t\t\tthis.slatRowHtml() +\n\t\t\t\t'</table>' +\n\t\t\t'</div>';\n\t},\n\n\n\t// Renders the HTML for a vertical background cell behind the slots.\n\t// This method is distinct from 'bg' because we wanted a new `rowType` so the View could customize the rendering.\n\tslotBgCellHtml: function(cell) {\n\t\treturn this.bgCellHtml(cell);\n\t},\n\n\n\t// Generates the HTML for the horizontal \"slats\" that run width-wise. Has a time axis on a side. Depends on RTL.\n\tslatRowHtml: function() {\n\t\tvar view = this.view;\n\t\tvar isRTL = this.isRTL;\n\t\tvar html = '';\n\t\tvar slotNormal = this.slotDuration.asMinutes() % 15 === 0;\n\t\tvar slotTime = moment.duration(+this.minTime); // wish there was .clone() for durations\n\t\tvar slotDate; // will be on the view's first day, but we only care about its time\n\t\tvar minutes;\n\t\tvar axisHtml;\n\n\t\t// Calculate the time for each slot\n\t\twhile (slotTime < this.maxTime) {\n\t\t\tslotDate = this.start.clone().time(slotTime); // will be in UTC but that's good. to avoid DST issues\n\t\t\tminutes = slotDate.minutes();\n\n\t\t\taxisHtml =\n\t\t\t\t'<td class=\"fc-axis fc-time ' + view.widgetContentClass + '\" ' + view.axisStyleAttr() + '>' +\n\t\t\t\t\t((!slotNormal || !minutes) ? // if irregular slot duration, or on the hour, then display the time\n\t\t\t\t\t\t'<span>' + // for matchCellWidths\n\t\t\t\t\t\t\thtmlEscape(slotDate.format(this.axisFormat)) +\n\t\t\t\t\t\t'</span>' :\n\t\t\t\t\t\t''\n\t\t\t\t\t\t) +\n\t\t\t\t'</td>';\n\n\t\t\thtml +=\n\t\t\t\t'<tr ' + (!minutes ? '' : 'class=\"fc-minor\"') + '>' +\n\t\t\t\t\t(!isRTL ? axisHtml : '') +\n\t\t\t\t\t'<td class=\"' + view.widgetContentClass + '\"/>' +\n\t\t\t\t\t(isRTL ? axisHtml : '') +\n\t\t\t\t\"</tr>\";\n\n\t\t\tslotTime.add(this.slotDuration);\n\t\t}\n\n\t\treturn html;\n\t},\n\n\n\t/* Options\n\t------------------------------------------------------------------------------------------------------------------*/\n\n\n\t// Parses various options into properties of this object\n\tprocessOptions: function() {\n\t\tvar view = this.view;\n\t\tvar slotDuration = view.opt('slotDuration');\n\t\tvar snapDuration = view.opt('snapDuration');\n\n\t\tslotDuration = moment.duration(slotDuration);\n\t\tsnapDuration = snapDuration ? moment.duration(snapDuration) : slotDuration;\n\n\t\tthis.slotDuration = slotDuration;\n\t\tthis.snapDuration = snapDuration;\n\t\tthis.cellDuration = snapDuration; // for Grid system\n\n\t\tthis.minTime = moment.duration(view.opt('minTime'));\n\t\tthis.maxTime = moment.duration(view.opt('maxTime'));\n\n\t\tthis.axisFormat = view.opt('axisFormat') || view.opt('smallTimeFormat');\n\t},\n\n\n\t// Computes a default column header formatting string if `colFormat` is not explicitly defined\n\tcomputeColHeadFormat: function() {\n\t\tif (this.colCnt > 1) { // multiple days, so full single date string WON'T be in title text\n\t\t\treturn this.view.opt('dayOfMonthFormat'); // \"Sat 12/10\"\n\t\t}\n\t\telse { // single day, so full single date string will probably be in title text\n\t\t\treturn 'dddd'; // \"Saturday\"\n\t\t}\n\t},\n\n\n\t// Computes a default event time formatting string if `timeFormat` is not explicitly defined\n\tcomputeEventTimeFormat: function() {\n\t\treturn this.view.opt('noMeridiemTimeFormat'); // like \"6:30\" (no AM/PM)\n\t},\n\n\n\t// Computes a default `displayEventEnd` value if one is not expliclty defined\n\tcomputeDisplayEventEnd: function() {\n\t\treturn true;\n\t},\n\n\n\t/* Cell System\n\t------------------------------------------------------------------------------------------------------------------*/\n\n\n\t// Initializes row/col information\n\tupdateCells: function() {\n\t\tvar view = this.view;\n\t\tvar colData = [];\n\t\tvar date;\n\n\t\tdate = this.start.clone();\n\t\twhile (date.isBefore(this.end)) {\n\t\t\tcolData.push({\n\t\t\t\tday: date.clone()\n\t\t\t});\n\t\t\tdate.add(1, 'day');\n\t\t\tdate = view.skipHiddenDays(date);\n\t\t}\n\n\t\tif (this.isRTL) {\n\t\t\tcolData.reverse();\n\t\t}\n\n\t\tthis.colData = colData;\n\t\tthis.colCnt = colData.length;\n\t\tthis.rowCnt = Math.ceil((this.maxTime - this.minTime) / this.snapDuration); // # of vertical snaps\n\t},\n\n\n\t// Given a cell object, generates its start date. Returns a reference-free copy.\n\tcomputeCellDate: function(cell) {\n\t\tvar time = this.computeSnapTime(cell.row);\n\n\t\treturn this.view.calendar.rezoneDate(cell.day).time(time);\n\t},\n\n\n\t// Retrieves the element representing the given column\n\tgetColEl: function(col) {\n\t\treturn this.dayEls.eq(col);\n\t},\n\n\n\t/* Dates\n\t------------------------------------------------------------------------------------------------------------------*/\n\n\n\t// Given a row number of the grid, representing a \"snap\", returns a time (Duration) from its start-of-day\n\tcomputeSnapTime: function(row) {\n\t\treturn moment.duration(this.minTime + this.snapDuration * row);\n\t},\n\n\n\t// Slices up a date range by column into an array of segments\n\trangeToSegs: function(range) {\n\t\tvar colCnt = this.colCnt;\n\t\tvar segs = [];\n\t\tvar seg;\n\t\tvar col;\n\t\tvar colDate;\n\t\tvar colRange;\n\n\t\t// normalize :(\n\t\trange = {\n\t\t\tstart: range.start.clone().stripZone(),\n\t\t\tend: range.end.clone().stripZone()\n\t\t};\n\n\t\tfor (col = 0; col < colCnt; col++) {\n\t\t\tcolDate = this.colData[col].day; // will be ambig time/timezone\n\t\t\tcolRange = {\n\t\t\t\tstart: colDate.clone().time(this.minTime),\n\t\t\t\tend: colDate.clone().time(this.maxTime)\n\t\t\t};\n\t\t\tseg = intersectionToSeg(range, colRange); // both will be ambig timezone\n\t\t\tif (seg) {\n\t\t\t\tseg.col = col;\n\t\t\t\tsegs.push(seg);\n\t\t\t}\n\t\t}\n\n\t\treturn segs;\n\t},\n\n\n\t/* Coordinates\n\t------------------------------------------------------------------------------------------------------------------*/\n\n\n\tupdateSize: function(isResize) { // NOT a standard Grid method\n\t\tthis.computeSlatTops();\n\n\t\tif (isResize) {\n\t\t\tthis.updateSegVerticals();\n\t\t}\n\t},\n\n\n\t// Computes the top/bottom coordinates of each \"snap\" rows\n\tcomputeRowCoords: function() {\n\t\tvar originTop = this.el.offset().top;\n\t\tvar items = [];\n\t\tvar i;\n\t\tvar item;\n\n\t\tfor (i = 0; i < this.rowCnt; i++) {\n\t\t\titem = {\n\t\t\t\ttop: originTop + this.computeTimeTop(this.computeSnapTime(i))\n\t\t\t};\n\t\t\tif (i > 0) {\n\t\t\t\titems[i - 1].bottom = item.top;\n\t\t\t}\n\t\t\titems.push(item);\n\t\t}\n\t\titem.bottom = item.top + this.computeTimeTop(this.computeSnapTime(i));\n\n\t\treturn items;\n\t},\n\n\n\t// Computes the top coordinate, relative to the bounds of the grid, of the given date.\n\t// A `startOfDayDate` must be given for avoiding ambiguity over how to treat midnight.\n\tcomputeDateTop: function(date, startOfDayDate) {\n\t\treturn this.computeTimeTop(\n\t\t\tmoment.duration(\n\t\t\t\tdate.clone().stripZone() - startOfDayDate.clone().stripTime()\n\t\t\t)\n\t\t);\n\t},\n\n\n\t// Computes the top coordinate, relative to the bounds of the grid, of the given time (a Duration).\n\tcomputeTimeTop: function(time) {\n\t\tvar slatCoverage = (time - this.minTime) / this.slotDuration; // floating-point value of # of slots covered\n\t\tvar slatIndex;\n\t\tvar slatRemainder;\n\t\tvar slatTop;\n\t\tvar slatBottom;\n\n\t\t// constrain. because minTime/maxTime might be customized\n\t\tslatCoverage = Math.max(0, slatCoverage);\n\t\tslatCoverage = Math.min(this.slatEls.length, slatCoverage);\n\n\t\tslatIndex = Math.floor(slatCoverage); // an integer index of the furthest whole slot\n\t\tslatRemainder = slatCoverage - slatIndex;\n\t\tslatTop = this.slatTops[slatIndex]; // the top position of the furthest whole slot\n\n\t\tif (slatRemainder) { // time spans part-way into the slot\n\t\t\tslatBottom = this.slatTops[slatIndex + 1];\n\t\t\treturn slatTop + (slatBottom - slatTop) * slatRemainder; // part-way between slots\n\t\t}\n\t\telse {\n\t\t\treturn slatTop;\n\t\t}\n\t},\n\n\n\t// Queries each `slatEl` for its position relative to the grid's container and stores it in `slatTops`.\n\t// Includes the the bottom of the last slat as the last item in the array.\n\tcomputeSlatTops: function() {\n\t\tvar tops = [];\n\t\tvar top;\n\n\t\tthis.slatEls.each(function(i, node) {\n\t\t\ttop = $(node).position().top;\n\t\t\ttops.push(top);\n\t\t});\n\n\t\ttops.push(top + this.slatEls.last().outerHeight()); // bottom of the last slat\n\n\t\tthis.slatTops = tops;\n\t},\n\n\n\t/* Event Drag Visualization\n\t------------------------------------------------------------------------------------------------------------------*/\n\n\n\t// Renders a visual indication of an event being dragged over the specified date(s).\n\t// dropLocation's end might be null, as well as `seg`. See Grid::renderDrag for more info.\n\t// A returned value of `true` signals that a mock \"helper\" event has been rendered.\n\trenderDrag: function(dropLocation, seg) {\n\n\t\tif (seg) { // if there is event information for this drag, render a helper event\n\t\t\tthis.renderRangeHelper(dropLocation, seg);\n\t\t\tthis.applyDragOpacity(this.helperEl);\n\n\t\t\treturn true; // signal that a helper has been rendered\n\t\t}\n\t\telse {\n\t\t\t// otherwise, just render a highlight\n\t\t\tthis.renderHighlight(\n\t\t\t\tthis.view.calendar.ensureVisibleEventRange(dropLocation) // needs to be a proper range\n\t\t\t);\n\t\t}\n\t},\n\n\n\t// Unrenders any visual indication of an event being dragged\n\tdestroyDrag: function() {\n\t\tthis.destroyHelper();\n\t\tthis.destroyHighlight();\n\t},\n\n\n\t/* Event Resize Visualization\n\t------------------------------------------------------------------------------------------------------------------*/\n\n\n\t// Renders a visual indication of an event being resized\n\trenderEventResize: function(range, seg) {\n\t\tthis.renderRangeHelper(range, seg);\n\t},\n\n\n\t// Unrenders any visual indication of an event being resized\n\tdestroyEventResize: function() {\n\t\tthis.destroyHelper();\n\t},\n\n\n\t/* Event Helper\n\t------------------------------------------------------------------------------------------------------------------*/\n\n\n\t// Renders a mock \"helper\" event. `sourceSeg` is the original segment object and might be null (an external drag)\n\trenderHelper: function(event, sourceSeg) {\n\t\tvar segs = this.eventsToSegs([ event ]);\n\t\tvar tableEl;\n\t\tvar i, seg;\n\t\tvar sourceEl;\n\n\t\tsegs = this.renderFgSegEls(segs); // assigns each seg's el and returns a subset of segs that were rendered\n\t\ttableEl = this.renderSegTable(segs);\n\n\t\t// Try to make the segment that is in the same row as sourceSeg look the same\n\t\tfor (i = 0; i < segs.length; i++) {\n\t\t\tseg = segs[i];\n\t\t\tif (sourceSeg && sourceSeg.col === seg.col) {\n\t\t\t\tsourceEl = sourceSeg.el;\n\t\t\t\tseg.el.css({\n\t\t\t\t\tleft: sourceEl.css('left'),\n\t\t\t\t\tright: sourceEl.css('right'),\n\t\t\t\t\t'margin-left': sourceEl.css('margin-left'),\n\t\t\t\t\t'margin-right': sourceEl.css('margin-right')\n\t\t\t\t});\n\t\t\t}\n\t\t}\n\n\t\tthis.helperEl = $('<div class=\"fc-helper-skeleton\"/>')\n\t\t\t.append(tableEl)\n\t\t\t\t.appendTo(this.el);\n\t},\n\n\n\t// Unrenders any mock helper event\n\tdestroyHelper: function() {\n\t\tif (this.helperEl) {\n\t\t\tthis.helperEl.remove();\n\t\t\tthis.helperEl = null;\n\t\t}\n\t},\n\n\n\t/* Selection\n\t------------------------------------------------------------------------------------------------------------------*/\n\n\n\t// Renders a visual indication of a selection. Overrides the default, which was to simply render a highlight.\n\trenderSelection: function(range) {\n\t\tif (this.view.opt('selectHelper')) { // this setting signals that a mock helper event should be rendered\n\t\t\tthis.renderRangeHelper(range);\n\t\t}\n\t\telse {\n\t\t\tthis.renderHighlight(range);\n\t\t}\n\t},\n\n\n\t// Unrenders any visual indication of a selection\n\tdestroySelection: function() {\n\t\tthis.destroyHelper();\n\t\tthis.destroyHighlight();\n\t},\n\n\n\t/* Fill System (highlight, background events, business hours)\n\t------------------------------------------------------------------------------------------------------------------*/\n\n\n\t// Renders a set of rectangles over the given time segments.\n\t// Only returns segments that successfully rendered.\n\trenderFill: function(type, segs, className) {\n\t\tvar segCols;\n\t\tvar skeletonEl;\n\t\tvar trEl;\n\t\tvar col, colSegs;\n\t\tvar tdEl;\n\t\tvar containerEl;\n\t\tvar dayDate;\n\t\tvar i, seg;\n\n\t\tif (segs.length) {\n\n\t\t\tsegs = this.renderFillSegEls(type, segs); // assignes `.el` to each seg. returns successfully rendered segs\n\t\t\tsegCols = this.groupSegCols(segs); // group into sub-arrays, and assigns 'col' to each seg\n\n\t\t\tclassName = className || type.toLowerCase();\n\t\t\tskeletonEl = $(\n\t\t\t\t'<div class=\"fc-' + className + '-skeleton\">' +\n\t\t\t\t\t'<table><tr/></table>' +\n\t\t\t\t'</div>'\n\t\t\t);\n\t\t\ttrEl = skeletonEl.find('tr');\n\n\t\t\tfor (col = 0; col < segCols.length; col++) {\n\t\t\t\tcolSegs = segCols[col];\n\t\t\t\ttdEl = $('<td/>').appendTo(trEl);\n\n\t\t\t\tif (colSegs.length) {\n\t\t\t\t\tcontainerEl = $('<div class=\"fc-' + className + '-container\"/>').appendTo(tdEl);\n\t\t\t\t\tdayDate = this.colData[col].day;\n\n\t\t\t\t\tfor (i = 0; i < colSegs.length; i++) {\n\t\t\t\t\t\tseg = colSegs[i];\n\t\t\t\t\t\tcontainerEl.append(\n\t\t\t\t\t\t\tseg.el.css({\n\t\t\t\t\t\t\t\ttop: this.computeDateTop(seg.start, dayDate),\n\t\t\t\t\t\t\t\tbottom: -this.computeDateTop(seg.end, dayDate) // the y position of the bottom edge\n\t\t\t\t\t\t\t})\n\t\t\t\t\t\t);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tthis.bookendCells(trEl, type);\n\n\t\t\tthis.el.append(skeletonEl);\n\t\t\tthis.elsByFill[type] = skeletonEl;\n\t\t}\n\n\t\treturn segs;\n\t}\n\n});\n\n;;\n\n/* Event-rendering methods for the TimeGrid class\n----------------------------------------------------------------------------------------------------------------------*/\n\nTimeGrid.mixin({\n\n\teventSkeletonEl: null, // has cells with event-containers, which contain absolutely positioned event elements\n\n\n\t// Renders the given foreground event segments onto the grid\n\trenderFgSegs: function(segs) {\n\t\tsegs = this.renderFgSegEls(segs); // returns a subset of the segs. segs that were actually rendered\n\n\t\tthis.el.append(\n\t\t\tthis.eventSkeletonEl = $('<div class=\"fc-content-skeleton\"/>')\n\t\t\t\t.append(this.renderSegTable(segs))\n\t\t);\n\n\t\treturn segs; // return only the segs that were actually rendered\n\t},\n\n\n\t// Unrenders all currently rendered foreground event segments\n\tdestroyFgSegs: function(segs) {\n\t\tif (this.eventSkeletonEl) {\n\t\t\tthis.eventSkeletonEl.remove();\n\t\t\tthis.eventSkeletonEl = null;\n\t\t}\n\t},\n\n\n\t// Renders and returns the <table> portion of the event-skeleton.\n\t// Returns an object with properties 'tbodyEl' and 'segs'.\n\trenderSegTable: function(segs) {\n\t\tvar tableEl = $('<table><tr/></table>');\n\t\tvar trEl = tableEl.find('tr');\n\t\tvar segCols;\n\t\tvar i, seg;\n\t\tvar col, colSegs;\n\t\tvar containerEl;\n\n\t\tsegCols = this.groupSegCols(segs); // group into sub-arrays, and assigns 'col' to each seg\n\n\t\tthis.computeSegVerticals(segs); // compute and assign top/bottom\n\n\t\tfor (col = 0; col < segCols.length; col++) { // iterate each column grouping\n\t\t\tcolSegs = segCols[col];\n\t\t\tplaceSlotSegs(colSegs); // compute horizontal coordinates, z-index's, and reorder the array\n\n\t\t\tcontainerEl = $('<div class=\"fc-event-container\"/>');\n\n\t\t\t// assign positioning CSS and insert into container\n\t\t\tfor (i = 0; i < colSegs.length; i++) {\n\t\t\t\tseg = colSegs[i];\n\t\t\t\tseg.el.css(this.generateSegPositionCss(seg));\n\n\t\t\t\t// if the height is short, add a className for alternate styling\n\t\t\t\tif (seg.bottom - seg.top < 30) {\n\t\t\t\t\tseg.el.addClass('fc-short');\n\t\t\t\t}\n\n\t\t\t\tcontainerEl.append(seg.el);\n\t\t\t}\n\n\t\t\ttrEl.append($('<td/>').append(containerEl));\n\t\t}\n\n\t\tthis.bookendCells(trEl, 'eventSkeleton');\n\n\t\treturn tableEl;\n\t},\n\n\n\t// Refreshes the CSS top/bottom coordinates for each segment element. Probably after a window resize/zoom.\n\t// Repositions business hours segs too, so not just for events. Maybe shouldn't be here.\n\tupdateSegVerticals: function() {\n\t\tvar allSegs = (this.segs || []).concat(this.businessHourSegs || []);\n\t\tvar i;\n\n\t\tthis.computeSegVerticals(allSegs);\n\n\t\tfor (i = 0; i < allSegs.length; i++) {\n\t\t\tallSegs[i].el.css(\n\t\t\t\tthis.generateSegVerticalCss(allSegs[i])\n\t\t\t);\n\t\t}\n\t},\n\n\n\t// For each segment in an array, computes and assigns its top and bottom properties\n\tcomputeSegVerticals: function(segs) {\n\t\tvar i, seg;\n\n\t\tfor (i = 0; i < segs.length; i++) {\n\t\t\tseg = segs[i];\n\t\t\tseg.top = this.computeDateTop(seg.start, seg.start);\n\t\t\tseg.bottom = this.computeDateTop(seg.end, seg.start);\n\t\t}\n\t},\n\n\n\t// Renders the HTML for a single event segment's default rendering\n\tfgSegHtml: function(seg, disableResizing) {\n\t\tvar view = this.view;\n\t\tvar event = seg.event;\n\t\tvar isDraggable = view.isEventDraggable(event);\n\t\tvar isResizableFromStart = !disableResizing && seg.isStart && view.isEventResizableFromStart(event);\n\t\tvar isResizableFromEnd = !disableResizing && seg.isEnd && view.isEventResizableFromEnd(event);\n\t\tvar classes = this.getSegClasses(seg, isDraggable, isResizableFromStart || isResizableFromEnd);\n\t\tvar skinCss = cssToStr(this.getEventSkinCss(event));\n\t\tvar timeText;\n\t\tvar fullTimeText; // more verbose time text. for the print stylesheet\n\t\tvar startTimeText; // just the start time text\n\n\t\tclasses.unshift('fc-time-grid-event', 'fc-v-event');\n\n\t\tif (view.isMultiDayEvent(event)) { // if the event appears to span more than one day...\n\t\t\t// Don't display time text on segments that run entirely through a day.\n\t\t\t// That would appear as midnight-midnight and would look dumb.\n\t\t\t// Otherwise, display the time text for the *segment's* times (like 6pm-midnight or midnight-10am)\n\t\t\tif (seg.isStart || seg.isEnd) {\n\t\t\t\ttimeText = this.getEventTimeText(seg);\n\t\t\t\tfullTimeText = this.getEventTimeText(seg, 'LT');\n\t\t\t\tstartTimeText = this.getEventTimeText(seg, null, false); // displayEnd=false\n\t\t\t}\n\t\t} else {\n\t\t\t// Display the normal time text for the *event's* times\n\t\t\ttimeText = this.getEventTimeText(event);\n\t\t\tfullTimeText = this.getEventTimeText(event, 'LT');\n\t\t\tstartTimeText = this.getEventTimeText(event, null, false); // displayEnd=false\n\t\t}\n\n\t\treturn '<a class=\"' + classes.join(' ') + '\"' +\n\t\t\t(event.url ?\n\t\t\t\t' href=\"' + htmlEscape(event.url) + '\"' :\n\t\t\t\t''\n\t\t\t\t) +\n\t\t\t(skinCss ?\n\t\t\t\t' style=\"' + skinCss + '\"' :\n\t\t\t\t''\n\t\t\t\t) +\n\t\t\t'>' +\n\t\t\t\t'<div class=\"fc-content\">' +\n\t\t\t\t\t(timeText ?\n\t\t\t\t\t\t'<div class=\"fc-time\"' +\n\t\t\t\t\t\t' data-start=\"' + htmlEscape(startTimeText) + '\"' +\n\t\t\t\t\t\t' data-full=\"' + htmlEscape(fullTimeText) + '\"' +\n\t\t\t\t\t\t'>' +\n\t\t\t\t\t\t\t'<span>' + htmlEscape(timeText) + '</span>' +\n\t\t\t\t\t\t'</div>' :\n\t\t\t\t\t\t''\n\t\t\t\t\t\t) +\n\t\t\t\t\t(event.title ?\n\t\t\t\t\t\t'<div class=\"fc-title\">' +\n\t\t\t\t\t\t\thtmlEscape(event.title) +\n\t\t\t\t\t\t'</div>' :\n\t\t\t\t\t\t''\n\t\t\t\t\t\t) +\n\t\t\t\t'</div>' +\n\t\t\t\t'<div class=\"fc-bg\"/>' +\n\t\t\t\t/* TODO: write CSS for this\n\t\t\t\t(isResizableFromStart ?\n\t\t\t\t\t'<div class=\"fc-resizer fc-start-resizer\" />' :\n\t\t\t\t\t''\n\t\t\t\t\t) +\n\t\t\t\t*/\n\t\t\t\t(isResizableFromEnd ?\n\t\t\t\t\t'<div class=\"fc-resizer fc-end-resizer\" />' :\n\t\t\t\t\t''\n\t\t\t\t\t) +\n\t\t\t'</a>';\n\t},\n\n\n\t// Generates an object with CSS properties/values that should be applied to an event segment element.\n\t// Contains important positioning-related properties that should be applied to any event element, customized or not.\n\tgenerateSegPositionCss: function(seg) {\n\t\tvar shouldOverlap = this.view.opt('slotEventOverlap');\n\t\tvar backwardCoord = seg.backwardCoord; // the left side if LTR. the right side if RTL. floating-point\n\t\tvar forwardCoord = seg.forwardCoord; // the right side if LTR. the left side if RTL. floating-point\n\t\tvar props = this.generateSegVerticalCss(seg); // get top/bottom first\n\t\tvar left; // amount of space from left edge, a fraction of the total width\n\t\tvar right; // amount of space from right edge, a fraction of the total width\n\n\t\tif (shouldOverlap) {\n\t\t\t// double the width, but don't go beyond the maximum forward coordinate (1.0)\n\t\t\tforwardCoord = Math.min(1, backwardCoord + (forwardCoord - backwardCoord) * 2);\n\t\t}\n\n\t\tif (this.isRTL) {\n\t\t\tleft = 1 - forwardCoord;\n\t\t\tright = backwardCoord;\n\t\t}\n\t\telse {\n\t\t\tleft = backwardCoord;\n\t\t\tright = 1 - forwardCoord;\n\t\t}\n\n\t\tprops.zIndex = seg.level + 1; // convert from 0-base to 1-based\n\t\tprops.left = left * 100 + '%';\n\t\tprops.right = right * 100 + '%';\n\n\t\tif (shouldOverlap && seg.forwardPressure) {\n\t\t\t// add padding to the edge so that forward stacked events don't cover the resizer's icon\n\t\t\tprops[this.isRTL ? 'marginLeft' : 'marginRight'] = 10 * 2; // 10 is a guesstimate of the icon's width\n\t\t}\n\n\t\treturn props;\n\t},\n\n\n\t// Generates an object with CSS properties for the top/bottom coordinates of a segment element\n\tgenerateSegVerticalCss: function(seg) {\n\t\treturn {\n\t\t\ttop: seg.top,\n\t\t\tbottom: -seg.bottom // flipped because needs to be space beyond bottom edge of event container\n\t\t};\n\t},\n\n\n\t// Given a flat array of segments, return an array of sub-arrays, grouped by each segment's col\n\tgroupSegCols: function(segs) {\n\t\tvar segCols = [];\n\t\tvar i;\n\n\t\tfor (i = 0; i < this.colCnt; i++) {\n\t\t\tsegCols.push([]);\n\t\t}\n\n\t\tfor (i = 0; i < segs.length; i++) {\n\t\t\tsegCols[segs[i].col].push(segs[i]);\n\t\t}\n\n\t\treturn segCols;\n\t}\n\n});\n\n\n// Given an array of segments that are all in the same column, sets the backwardCoord and forwardCoord on each.\n// NOTE: Also reorders the given array by date!\nfunction placeSlotSegs(segs) {\n\tvar levels;\n\tvar level0;\n\tvar i;\n\n\tsegs.sort(compareSegs); // order by date\n\tlevels = buildSlotSegLevels(segs);\n\tcomputeForwardSlotSegs(levels);\n\n\tif ((level0 = levels[0])) {\n\n\t\tfor (i = 0; i < level0.length; i++) {\n\t\t\tcomputeSlotSegPressures(level0[i]);\n\t\t}\n\n\t\tfor (i = 0; i < level0.length; i++) {\n\t\t\tcomputeSlotSegCoords(level0[i], 0, 0);\n\t\t}\n\t}\n}\n\n\n// Builds an array of segments \"levels\". The first level will be the leftmost tier of segments if the calendar is\n// left-to-right, or the rightmost if the calendar is right-to-left. Assumes the segments are already ordered by date.\nfunction buildSlotSegLevels(segs) {\n\tvar levels = [];\n\tvar i, seg;\n\tvar j;\n\n\tfor (i=0; i<segs.length; i++) {\n\t\tseg = segs[i];\n\n\t\t// go through all the levels and stop on the first level where there are no collisions\n\t\tfor (j=0; j<levels.length; j++) {\n\t\t\tif (!computeSlotSegCollisions(seg, levels[j]).length) {\n\t\t\t\tbreak;\n\t\t\t}\n\t\t}\n\n\t\tseg.level = j;\n\n\t\t(levels[j] || (levels[j] = [])).push(seg);\n\t}\n\n\treturn levels;\n}\n\n\n// For every segment, figure out the other segments that are in subsequent\n// levels that also occupy the same vertical space. Accumulate in seg.forwardSegs\nfunction computeForwardSlotSegs(levels) {\n\tvar i, level;\n\tvar j, seg;\n\tvar k;\n\n\tfor (i=0; i<levels.length; i++) {\n\t\tlevel = levels[i];\n\n\t\tfor (j=0; j<level.length; j++) {\n\t\t\tseg = level[j];\n\n\t\t\tseg.forwardSegs = [];\n\t\t\tfor (k=i+1; k<levels.length; k++) {\n\t\t\t\tcomputeSlotSegCollisions(seg, levels[k], seg.forwardSegs);\n\t\t\t}\n\t\t}\n\t}\n}\n\n\n// Figure out which path forward (via seg.forwardSegs) results in the longest path until\n// the furthest edge is reached. The number of segments in this path will be seg.forwardPressure\nfunction computeSlotSegPressures(seg) {\n\tvar forwardSegs = seg.forwardSegs;\n\tvar forwardPressure = 0;\n\tvar i, forwardSeg;\n\n\tif (seg.forwardPressure === undefined) { // not already computed\n\n\t\tfor (i=0; i<forwardSegs.length; i++) {\n\t\t\tforwardSeg = forwardSegs[i];\n\n\t\t\t// figure out the child's maximum forward path\n\t\t\tcomputeSlotSegPressures(forwardSeg);\n\n\t\t\t// either use the existing maximum, or use the child's forward pressure\n\t\t\t// plus one (for the forwardSeg itself)\n\t\t\tforwardPressure = Math.max(\n\t\t\t\tforwardPressure,\n\t\t\t\t1 + forwardSeg.forwardPressure\n\t\t\t);\n\t\t}\n\n\t\tseg.forwardPressure = forwardPressure;\n\t}\n}\n\n\n// Calculate seg.forwardCoord and seg.backwardCoord for the segment, where both values range\n// from 0 to 1. If the calendar is left-to-right, the seg.backwardCoord maps to \"left\" and\n// seg.forwardCoord maps to \"right\" (via percentage). Vice-versa if the calendar is right-to-left.\n//\n// The segment might be part of a \"series\", which means consecutive segments with the same pressure\n// who's width is unknown until an edge has been hit. `seriesBackwardPressure` is the number of\n// segments behind this one in the current series, and `seriesBackwardCoord` is the starting\n// coordinate of the first segment in the series.\nfunction computeSlotSegCoords(seg, seriesBackwardPressure, seriesBackwardCoord) {\n\tvar forwardSegs = seg.forwardSegs;\n\tvar i;\n\n\tif (seg.forwardCoord === undefined) { // not already computed\n\n\t\tif (!forwardSegs.length) {\n\n\t\t\t// if there are no forward segments, this segment should butt up against the edge\n\t\t\tseg.forwardCoord = 1;\n\t\t}\n\t\telse {\n\n\t\t\t// sort highest pressure first\n\t\t\tforwardSegs.sort(compareForwardSlotSegs);\n\n\t\t\t// this segment's forwardCoord will be calculated from the backwardCoord of the\n\t\t\t// highest-pressure forward segment.\n\t\t\tcomputeSlotSegCoords(forwardSegs[0], seriesBackwardPressure + 1, seriesBackwardCoord);\n\t\t\tseg.forwardCoord = forwardSegs[0].backwardCoord;\n\t\t}\n\n\t\t// calculate the backwardCoord from the forwardCoord. consider the series\n\t\tseg.backwardCoord = seg.forwardCoord -\n\t\t\t(seg.forwardCoord - seriesBackwardCoord) / // available width for series\n\t\t\t(seriesBackwardPressure + 1); // # of segments in the series\n\n\t\t// use this segment's coordinates to computed the coordinates of the less-pressurized\n\t\t// forward segments\n\t\tfor (i=0; i<forwardSegs.length; i++) {\n\t\t\tcomputeSlotSegCoords(forwardSegs[i], 0, seg.forwardCoord);\n\t\t}\n\t}\n}\n\n\n// Find all the segments in `otherSegs` that vertically collide with `seg`.\n// Append into an optionally-supplied `results` array and return.\nfunction computeSlotSegCollisions(seg, otherSegs, results) {\n\tresults = results || [];\n\n\tfor (var i=0; i<otherSegs.length; i++) {\n\t\tif (isSlotSegCollision(seg, otherSegs[i])) {\n\t\t\tresults.push(otherSegs[i]);\n\t\t}\n\t}\n\n\treturn results;\n}\n\n\n// Do these segments occupy the same vertical space?\nfunction isSlotSegCollision(seg1, seg2) {\n\treturn seg1.bottom > seg2.top && seg1.top < seg2.bottom;\n}\n\n\n// A cmp function for determining which forward segment to rely on more when computing coordinates.\nfunction compareForwardSlotSegs(seg1, seg2) {\n\t// put higher-pressure first\n\treturn seg2.forwardPressure - seg1.forwardPressure ||\n\t\t// put segments that are closer to initial edge first (and favor ones with no coords yet)\n\t\t(seg1.backwardCoord || 0) - (seg2.backwardCoord || 0) ||\n\t\t// do normal sorting...\n\t\tcompareSegs(seg1, seg2);\n}\n\n;;\n\n/* An abstract class from which other views inherit from\n----------------------------------------------------------------------------------------------------------------------*/\n\nvar View = fc.View = Class.extend({\n\n\ttype: null, // subclass' view name (string)\n\tname: null, // deprecated. use `type` instead\n\ttitle: null, // the text that will be displayed in the header's title\n\n\tcalendar: null, // owner Calendar object\n\toptions: null, // hash containing all options. already merged with view-specific-options\n\tcoordMap: null, // a CoordMap object for converting pixel regions to dates\n\tel: null, // the view's containing element. set by Calendar\n\n\tisDisplayed: false,\n\tisSkeletonRendered: false,\n\tisEventsRendered: false,\n\n\t// range the view is actually displaying (moments)\n\tstart: null,\n\tend: null, // exclusive\n\n\t// range the view is formally responsible for (moments)\n\t// may be different from start/end. for example, a month view might have 1st-31st, excluding padded dates\n\tintervalStart: null,\n\tintervalEnd: null, // exclusive\n\tintervalDuration: null,\n\tintervalUnit: null, // name of largest unit being displayed, like \"month\" or \"week\"\n\n\tisSelected: false, // boolean whether a range of time is user-selected or not\n\n\t// subclasses can optionally use a scroll container\n\tscrollerEl: null, // the element that will most likely scroll when content is too tall\n\tscrollTop: null, // cached vertical scroll value\n\n\t// classNames styled by jqui themes\n\twidgetHeaderClass: null,\n\twidgetContentClass: null,\n\thighlightStateClass: null,\n\n\t// for date utils, computed from options\n\tnextDayThreshold: null,\n\tisHiddenDayHash: null,\n\n\t// document handlers, bound to `this` object\n\tdocumentMousedownProxy: null, // TODO: doesn't work with touch\n\n\n\tconstructor: function(calendar, type, options, intervalDuration) {\n\n\t\tthis.calendar = calendar;\n\t\tthis.type = this.name = type; // .name is deprecated\n\t\tthis.options = options;\n\t\tthis.intervalDuration = intervalDuration || moment.duration(1, 'day');\n\n\t\tthis.nextDayThreshold = moment.duration(this.opt('nextDayThreshold'));\n\t\tthis.initThemingProps();\n\t\tthis.initHiddenDays();\n\n\t\tthis.documentMousedownProxy = proxy(this, 'documentMousedown');\n\n\t\tthis.initialize();\n\t},\n\n\n\t// A good place for subclasses to initialize member variables\n\tinitialize: function() {\n\t\t// subclasses can implement\n\t},\n\n\n\t// Retrieves an option with the given name\n\topt: function(name) {\n\t\treturn this.options[name];\n\t},\n\n\n\t// Triggers handlers that are view-related. Modifies args before passing to calendar.\n\ttrigger: function(name, thisObj) { // arguments beyond thisObj are passed along\n\t\tvar calendar = this.calendar;\n\n\t\treturn calendar.trigger.apply(\n\t\t\tcalendar,\n\t\t\t[name, thisObj || this].concat(\n\t\t\t\tArray.prototype.slice.call(arguments, 2), // arguments beyond thisObj\n\t\t\t\t[ this ] // always make the last argument a reference to the view. TODO: deprecate\n\t\t\t)\n\t\t);\n\t},\n\n\n\t/* Dates\n\t------------------------------------------------------------------------------------------------------------------*/\n\n\n\t// Updates all internal dates to center around the given current date\n\tsetDate: function(date) {\n\t\tthis.setRange(this.computeRange(date));\n\t},\n\n\n\t// Updates all internal dates for displaying the given range.\n\t// Expects all values to be normalized (like what computeRange does).\n\tsetRange: function(range) {\n\t\t$.extend(this, range);\n\t\tthis.updateTitle();\n\t},\n\n\n\t// Given a single current date, produce information about what range to display.\n\t// Subclasses can override. Must return all properties.\n\tcomputeRange: function(date) {\n\t\tvar intervalUnit = computeIntervalUnit(this.intervalDuration);\n\t\tvar intervalStart = date.clone().startOf(intervalUnit);\n\t\tvar intervalEnd = intervalStart.clone().add(this.intervalDuration);\n\t\tvar start, end;\n\n\t\t// normalize the range's time-ambiguity\n\t\tif (/year|month|week|day/.test(intervalUnit)) { // whole-days?\n\t\t\tintervalStart.stripTime();\n\t\t\tintervalEnd.stripTime();\n\t\t}\n\t\telse { // needs to have a time?\n\t\t\tif (!intervalStart.hasTime()) {\n\t\t\t\tintervalStart = this.calendar.rezoneDate(intervalStart); // convert to current timezone, with 00:00\n\t\t\t}\n\t\t\tif (!intervalEnd.hasTime()) {\n\t\t\t\tintervalEnd = this.calendar.rezoneDate(intervalEnd); // convert to current timezone, with 00:00\n\t\t\t}\n\t\t}\n\n\t\tstart = intervalStart.clone();\n\t\tstart = this.skipHiddenDays(start);\n\t\tend = intervalEnd.clone();\n\t\tend = this.skipHiddenDays(end, -1, true); // exclusively move backwards\n\n\t\treturn {\n\t\t\tintervalUnit: intervalUnit,\n\t\t\tintervalStart: intervalStart,\n\t\t\tintervalEnd: intervalEnd,\n\t\t\tstart: start,\n\t\t\tend: end\n\t\t};\n\t},\n\n\n\t// Computes the new date when the user hits the prev button, given the current date\n\tcomputePrevDate: function(date) {\n\t\treturn this.massageCurrentDate(\n\t\t\tdate.clone().startOf(this.intervalUnit).subtract(this.intervalDuration), -1\n\t\t);\n\t},\n\n\n\t// Computes the new date when the user hits the next button, given the current date\n\tcomputeNextDate: function(date) {\n\t\treturn this.massageCurrentDate(\n\t\t\tdate.clone().startOf(this.intervalUnit).add(this.intervalDuration)\n\t\t);\n\t},\n\n\n\t// Given an arbitrarily calculated current date of the calendar, returns a date that is ensured to be completely\n\t// visible. `direction` is optional and indicates which direction the current date was being\n\t// incremented or decremented (1 or -1).\n\tmassageCurrentDate: function(date, direction) {\n\t\tif (this.intervalDuration.as('days') <= 1) { // if the view displays a single day or smaller\n\t\t\tif (this.isHiddenDay(date)) {\n\t\t\t\tdate = this.skipHiddenDays(date, direction);\n\t\t\t\tdate.startOf('day');\n\t\t\t}\n\t\t}\n\n\t\treturn date;\n\t},\n\n\n\t/* Title and Date Formatting\n\t------------------------------------------------------------------------------------------------------------------*/\n\n\n\t// Sets the view's title property to the most updated computed value\n\tupdateTitle: function() {\n\t\tthis.title = this.computeTitle();\n\t},\n\n\n\t// Computes what the title at the top of the calendar should be for this view\n\tcomputeTitle: function() {\n\t\treturn this.formatRange(\n\t\t\t{ start: this.intervalStart, end: this.intervalEnd },\n\t\t\tthis.opt('titleFormat') || this.computeTitleFormat(),\n\t\t\tthis.opt('titleRangeSeparator')\n\t\t);\n\t},\n\n\n\t// Generates the format string that should be used to generate the title for the current date range.\n\t// Attempts to compute the most appropriate format if not explicitly specified with `titleFormat`.\n\tcomputeTitleFormat: function() {\n\t\tif (this.intervalUnit == 'year') {\n\t\t\treturn 'YYYY';\n\t\t}\n\t\telse if (this.intervalUnit == 'month') {\n\t\t\treturn this.opt('monthYearFormat'); // like \"September 2014\"\n\t\t}\n\t\telse if (this.intervalDuration.as('days') > 1) {\n\t\t\treturn 'll'; // multi-day range. shorter, like \"Sep 9 - 10 2014\"\n\t\t}\n\t\telse {\n\t\t\treturn 'LL'; // one day. longer, like \"September 9 2014\"\n\t\t}\n\t},\n\n\n\t// Utility for formatting a range. Accepts a range object, formatting string, and optional separator.\n\t// Displays all-day ranges naturally, with an inclusive end. Takes the current isRTL into account.\n\tformatRange: function(range, formatStr, separator) {\n\t\tvar end = range.end;\n\n\t\tif (!end.hasTime()) { // all-day?\n\t\t\tend = end.clone().subtract(1); // convert to inclusive. last ms of previous day\n\t\t}\n\n\t\treturn formatRange(range.start, end, formatStr, separator, this.opt('isRTL'));\n\t},\n\n\n\t/* Rendering\n\t------------------------------------------------------------------------------------------------------------------*/\n\n\n\t// Sets the container element that the view should render inside of.\n\t// Does other DOM-related initializations.\n\tsetElement: function(el) {\n\t\tthis.el = el;\n\t\tthis.bindGlobalHandlers();\n\t},\n\n\n\t// Removes the view's container element from the DOM, clearing any content beforehand.\n\t// Undoes any other DOM-related attachments.\n\tremoveElement: function() {\n\t\tthis.clear(); // clears all content\n\n\t\t// clean up the skeleton\n\t\tif (this.isSkeletonRendered) {\n\t\t\tthis.destroySkeleton();\n\t\t\tthis.isSkeletonRendered = false;\n\t\t}\n\n\t\tthis.unbindGlobalHandlers();\n\n\t\tthis.el.remove();\n\n\t\t// NOTE: don't null-out this.el in case the View was destroyed within an API callback.\n\t\t// We don't null-out the View's other jQuery element references upon destroy, so why should we kill this.el?\n\t},\n\n\n\t// Does everything necessary to display the view centered around the given date.\n\t// Does every type of rendering EXCEPT rendering events.\n\tdisplay: function(date) {\n\t\tvar scrollState = null;\n\n\t\tif (this.isDisplayed) {\n\t\t\tscrollState = this.queryScroll();\n\t\t}\n\n\t\tthis.clear(); // clear the old content\n\t\tthis.setDate(date);\n\t\tthis.render();\n\t\tthis.updateSize();\n\t\tthis.renderBusinessHours(); // might need coordinates, so should go after updateSize()\n\t\tthis.isDisplayed = true;\n\n\t\tscrollState = this.computeInitialScroll(scrollState);\n\t\tthis.forceScroll(scrollState);\n\n\t\tthis.triggerRender();\n\t},\n\n\n\t// Does everything necessary to clear the content of the view.\n\t// Clears dates and events. Does not clear the skeleton.\n\tclear: function() { // clears the view of *content* but not the skeleton\n\t\tif (this.isDisplayed) {\n\t\t\tthis.unselect();\n\t\t\tthis.clearEvents();\n\t\t\tthis.triggerDestroy();\n\t\t\tthis.destroyBusinessHours();\n\t\t\tthis.destroy();\n\t\t\tthis.isDisplayed = false;\n\t\t}\n\t},\n\n\n\t// Renders the view's date-related content, rendering the view's non-content skeleton if necessary\n\trender: function() {\n\t\tif (!this.isSkeletonRendered) {\n\t\t\tthis.renderSkeleton();\n\t\t\tthis.isSkeletonRendered = true;\n\t\t}\n\t\tthis.renderDates();\n\t},\n\n\n\t// Unrenders the view's date-related content.\n\t// Call this instead of destroyDates directly in case the View subclass wants to use a render/destroy pattern\n\t// where both the skeleton and the content always get rendered/unrendered together.\n\tdestroy: function() {\n\t\tthis.destroyDates();\n\t},\n\n\n\t// Renders the basic structure of the view before any content is rendered\n\trenderSkeleton: function() {\n\t\t// subclasses should implement\n\t},\n\n\n\t// Unrenders the basic structure of the view\n\tdestroySkeleton: function() {\n\t\t// subclasses should implement\n\t},\n\n\n\t// Renders the view's date-related content (like cells that represent days/times).\n\t// Assumes setRange has already been called and the skeleton has already been rendered.\n\trenderDates: function() {\n\t\t// subclasses should implement\n\t},\n\n\n\t// Unrenders the view's date-related content\n\tdestroyDates: function() {\n\t\t// subclasses should override\n\t},\n\n\n\t// Renders business-hours onto the view. Assumes updateSize has already been called.\n\trenderBusinessHours: function() {\n\t\t// subclasses should implement\n\t},\n\n\n\t// Unrenders previously-rendered business-hours\n\tdestroyBusinessHours: function() {\n\t\t// subclasses should implement\n\t},\n\n\n\t// Signals that the view's content has been rendered\n\ttriggerRender: function() {\n\t\tthis.trigger('viewRender', this, this, this.el);\n\t},\n\n\n\t// Signals that the view's content is about to be unrendered\n\ttriggerDestroy: function() {\n\t\tthis.trigger('viewDestroy', this, this, this.el);\n\t},\n\n\n\t// Binds DOM handlers to elements that reside outside the view container, such as the document\n\tbindGlobalHandlers: function() {\n\t\t$(document).on('mousedown', this.documentMousedownProxy);\n\t},\n\n\n\t// Unbinds DOM handlers from elements that reside outside the view container\n\tunbindGlobalHandlers: function() {\n\t\t$(document).off('mousedown', this.documentMousedownProxy);\n\t},\n\n\n\t// Initializes internal variables related to theming\n\tinitThemingProps: function() {\n\t\tvar tm = this.opt('theme') ? 'ui' : 'fc';\n\n\t\tthis.widgetHeaderClass = tm + '-widget-header';\n\t\tthis.widgetContentClass = tm + '-widget-content';\n\t\tthis.highlightStateClass = tm + '-state-highlight';\n\t},\n\n\n\t/* Dimensions\n\t------------------------------------------------------------------------------------------------------------------*/\n\n\n\t// Refreshes anything dependant upon sizing of the container element of the grid\n\tupdateSize: function(isResize) {\n\t\tvar scrollState;\n\n\t\tif (isResize) {\n\t\t\tscrollState = this.queryScroll();\n\t\t}\n\n\t\tthis.updateHeight();\n\t\tthis.updateWidth();\n\n\t\tif (isResize) {\n\t\t\tthis.setScroll(scrollState);\n\t\t}\n\t},\n\n\n\t// Refreshes the horizontal dimensions of the calendar\n\tupdateWidth: function() {\n\t\t// subclasses should implement\n\t},\n\n\n\t// Refreshes the vertical dimensions of the calendar\n\tupdateHeight: function() {\n\t\tvar calendar = this.calendar; // we poll the calendar for height information\n\n\t\tthis.setHeight(\n\t\t\tcalendar.getSuggestedViewHeight(),\n\t\t\tcalendar.isHeightAuto()\n\t\t);\n\t},\n\n\n\t// Updates the vertical dimensions of the calendar to the specified height.\n\t// if `isAuto` is set to true, height becomes merely a suggestion and the view should use its \"natural\" height.\n\tsetHeight: function(height, isAuto) {\n\t\t// subclasses should implement\n\t},\n\n\n\t/* Scroller\n\t------------------------------------------------------------------------------------------------------------------*/\n\n\n\t// Given the total height of the view, return the number of pixels that should be used for the scroller.\n\t// Utility for subclasses.\n\tcomputeScrollerHeight: function(totalHeight) {\n\t\tvar scrollerEl = this.scrollerEl;\n\t\tvar both;\n\t\tvar otherHeight; // cumulative height of everything that is not the scrollerEl in the view (header+borders)\n\n\t\tboth = this.el.add(scrollerEl);\n\n\t\t// fuckin IE8/9/10/11 sometimes returns 0 for dimensions. this weird hack was the only thing that worked\n\t\tboth.css({\n\t\t\tposition: 'relative', // cause a reflow, which will force fresh dimension recalculation\n\t\t\tleft: -1 // ensure reflow in case the el was already relative. negative is less likely to cause new scroll\n\t\t});\n\t\totherHeight = this.el.outerHeight() - scrollerEl.height(); // grab the dimensions\n\t\tboth.css({ position: '', left: '' }); // undo hack\n\n\t\treturn totalHeight - otherHeight;\n\t},\n\n\n\t// Computes the initial pre-configured scroll state prior to allowing the user to change it.\n\t// Given the scroll state from the previous rendering. If first time rendering, given null.\n\tcomputeInitialScroll: function(previousScrollState) {\n\t\treturn 0;\n\t},\n\n\n\t// Retrieves the view's current natural scroll state. Can return an arbitrary format.\n\tqueryScroll: function() {\n\t\tif (this.scrollerEl) {\n\t\t\treturn this.scrollerEl.scrollTop(); // operates on scrollerEl by default\n\t\t}\n\t},\n\n\n\t// Sets the view's scroll state. Will accept the same format computeInitialScroll and queryScroll produce.\n\tsetScroll: function(scrollState) {\n\t\tif (this.scrollerEl) {\n\t\t\treturn this.scrollerEl.scrollTop(scrollState); // operates on scrollerEl by default\n\t\t}\n\t},\n\n\n\t// Sets the scroll state, making sure to overcome any predefined scroll value the browser has in mind\n\tforceScroll: function(scrollState) {\n\t\tvar _this = this;\n\n\t\tthis.setScroll(scrollState);\n\t\tsetTimeout(function() {\n\t\t\t_this.setScroll(scrollState);\n\t\t}, 0);\n\t},\n\n\n\t/* Event Elements / Segments\n\t------------------------------------------------------------------------------------------------------------------*/\n\n\n\t// Does everything necessary to display the given events onto the current view\n\tdisplayEvents: function(events) {\n\t\tvar scrollState = this.queryScroll();\n\n\t\tthis.clearEvents();\n\t\tthis.renderEvents(events);\n\t\tthis.isEventsRendered = true;\n\t\tthis.setScroll(scrollState);\n\t\tthis.triggerEventRender();\n\t},\n\n\n\t// Does everything necessary to clear the view's currently-rendered events\n\tclearEvents: function() {\n\t\tif (this.isEventsRendered) {\n\t\t\tthis.triggerEventDestroy();\n\t\t\tthis.destroyEvents();\n\t\t\tthis.isEventsRendered = false;\n\t\t}\n\t},\n\n\n\t// Renders the events onto the view.\n\trenderEvents: function(events) {\n\t\t// subclasses should implement\n\t},\n\n\n\t// Removes event elements from the view.\n\tdestroyEvents: function() {\n\t\t// subclasses should implement\n\t},\n\n\n\t// Signals that all events have been rendered\n\ttriggerEventRender: function() {\n\t\tthis.renderedEventSegEach(function(seg) {\n\t\t\tthis.trigger('eventAfterRender', seg.event, seg.event, seg.el);\n\t\t});\n\t\tthis.trigger('eventAfterAllRender');\n\t},\n\n\n\t// Signals that all event elements are about to be removed\n\ttriggerEventDestroy: function() {\n\t\tthis.renderedEventSegEach(function(seg) {\n\t\t\tthis.trigger('eventDestroy', seg.event, seg.event, seg.el);\n\t\t});\n\t},\n\n\n\t// Given an event and the default element used for rendering, returns the element that should actually be used.\n\t// Basically runs events and elements through the eventRender hook.\n\tresolveEventEl: function(event, el) {\n\t\tvar custom = this.trigger('eventRender', event, event, el);\n\n\t\tif (custom === false) { // means don't render at all\n\t\t\tel = null;\n\t\t}\n\t\telse if (custom && custom !== true) {\n\t\t\tel = $(custom);\n\t\t}\n\n\t\treturn el;\n\t},\n\n\n\t// Hides all rendered event segments linked to the given event\n\tshowEvent: function(event) {\n\t\tthis.renderedEventSegEach(function(seg) {\n\t\t\tseg.el.css('visibility', '');\n\t\t}, event);\n\t},\n\n\n\t// Shows all rendered event segments linked to the given event\n\thideEvent: function(event) {\n\t\tthis.renderedEventSegEach(function(seg) {\n\t\t\tseg.el.css('visibility', 'hidden');\n\t\t}, event);\n\t},\n\n\n\t// Iterates through event segments that have been rendered (have an el). Goes through all by default.\n\t// If the optional `event` argument is specified, only iterates through segments linked to that event.\n\t// The `this` value of the callback function will be the view.\n\trenderedEventSegEach: function(func, event) {\n\t\tvar segs = this.getEventSegs();\n\t\tvar i;\n\n\t\tfor (i = 0; i < segs.length; i++) {\n\t\t\tif (!event || segs[i].event._id === event._id) {\n\t\t\t\tif (segs[i].el) {\n\t\t\t\t\tfunc.call(this, segs[i]);\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t},\n\n\n\t// Retrieves all the rendered segment objects for the view\n\tgetEventSegs: function() {\n\t\t// subclasses must implement\n\t\treturn [];\n\t},\n\n\n\t/* Event Drag-n-Drop\n\t------------------------------------------------------------------------------------------------------------------*/\n\n\n\t// Computes if the given event is allowed to be dragged by the user\n\tisEventDraggable: function(event) {\n\t\tvar source = event.source || {};\n\n\t\treturn firstDefined(\n\t\t\tevent.startEditable,\n\t\t\tsource.startEditable,\n\t\t\tthis.opt('eventStartEditable'),\n\t\t\tevent.editable,\n\t\t\tsource.editable,\n\t\t\tthis.opt('editable')\n\t\t);\n\t},\n\n\n\t// Must be called when an event in the view is dropped onto new location.\n\t// `dropLocation` is an object that contains the new start/end/allDay values for the event.\n\treportEventDrop: function(event, dropLocation, largeUnit, el, ev) {\n\t\tvar calendar = this.calendar;\n\t\tvar mutateResult = calendar.mutateEvent(event, dropLocation, largeUnit);\n\t\tvar undoFunc = function() {\n\t\t\tmutateResult.undo();\n\t\t\tcalendar.reportEventChange();\n\t\t};\n\n\t\tthis.triggerEventDrop(event, mutateResult.dateDelta, undoFunc, el, ev);\n\t\tcalendar.reportEventChange(); // will rerender events\n\t},\n\n\n\t// Triggers event-drop handlers that have subscribed via the API\n\ttriggerEventDrop: function(event, dateDelta, undoFunc, el, ev) {\n\t\tthis.trigger('eventDrop', el[0], event, dateDelta, undoFunc, ev, {}); // {} = jqui dummy\n\t},\n\n\n\t/* External Element Drag-n-Drop\n\t------------------------------------------------------------------------------------------------------------------*/\n\n\n\t// Must be called when an external element, via jQuery UI, has been dropped onto the calendar.\n\t// `meta` is the parsed data that has been embedded into the dragging event.\n\t// `dropLocation` is an object that contains the new start/end/allDay values for the event.\n\treportExternalDrop: function(meta, dropLocation, el, ev, ui) {\n\t\tvar eventProps = meta.eventProps;\n\t\tvar eventInput;\n\t\tvar event;\n\n\t\t// Try to build an event object and render it. TODO: decouple the two\n\t\tif (eventProps) {\n\t\t\teventInput = $.extend({}, eventProps, dropLocation);\n\t\t\tevent = this.calendar.renderEvent(eventInput, meta.stick)[0]; // renderEvent returns an array\n\t\t}\n\n\t\tthis.triggerExternalDrop(event, dropLocation, el, ev, ui);\n\t},\n\n\n\t// Triggers external-drop handlers that have subscribed via the API\n\ttriggerExternalDrop: function(event, dropLocation, el, ev, ui) {\n\n\t\t// trigger 'drop' regardless of whether element represents an event\n\t\tthis.trigger('drop', el[0], dropLocation.start, ev, ui);\n\n\t\tif (event) {\n\t\t\tthis.trigger('eventReceive', null, event); // signal an external event landed\n\t\t}\n\t},\n\n\n\t/* Drag-n-Drop Rendering (for both events and external elements)\n\t------------------------------------------------------------------------------------------------------------------*/\n\n\n\t// Renders a visual indication of a event or external-element drag over the given drop zone.\n\t// If an external-element, seg will be `null`\n\trenderDrag: function(dropLocation, seg) {\n\t\t// subclasses must implement\n\t},\n\n\n\t// Unrenders a visual indication of an event or external-element being dragged.\n\tdestroyDrag: function() {\n\t\t// subclasses must implement\n\t},\n\n\n\t/* Event Resizing\n\t------------------------------------------------------------------------------------------------------------------*/\n\n\n\t// Computes if the given event is allowed to be resized from its starting edge\n\tisEventResizableFromStart: function(event) {\n\t\treturn this.opt('eventResizableFromStart') && this.isEventResizable(event);\n\t},\n\n\n\t// Computes if the given event is allowed to be resized from its ending edge\n\tisEventResizableFromEnd: function(event) {\n\t\treturn this.isEventResizable(event);\n\t},\n\n\n\t// Computes if the given event is allowed to be resized by the user at all\n\tisEventResizable: function(event) {\n\t\tvar source = event.source || {};\n\n\t\treturn firstDefined(\n\t\t\tevent.durationEditable,\n\t\t\tsource.durationEditable,\n\t\t\tthis.opt('eventDurationEditable'),\n\t\t\tevent.editable,\n\t\t\tsource.editable,\n\t\t\tthis.opt('editable')\n\t\t);\n\t},\n\n\n\t// Must be called when an event in the view has been resized to a new length\n\treportEventResize: function(event, resizeLocation, largeUnit, el, ev) {\n\t\tvar calendar = this.calendar;\n\t\tvar mutateResult = calendar.mutateEvent(event, resizeLocation, largeUnit);\n\t\tvar undoFunc = function() {\n\t\t\tmutateResult.undo();\n\t\t\tcalendar.reportEventChange();\n\t\t};\n\n\t\tthis.triggerEventResize(event, mutateResult.durationDelta, undoFunc, el, ev);\n\t\tcalendar.reportEventChange(); // will rerender events\n\t},\n\n\n\t// Triggers event-resize handlers that have subscribed via the API\n\ttriggerEventResize: function(event, durationDelta, undoFunc, el, ev) {\n\t\tthis.trigger('eventResize', el[0], event, durationDelta, undoFunc, ev, {}); // {} = jqui dummy\n\t},\n\n\n\t/* Selection\n\t------------------------------------------------------------------------------------------------------------------*/\n\n\n\t// Selects a date range on the view. `start` and `end` are both Moments.\n\t// `ev` is the native mouse event that begin the interaction.\n\tselect: function(range, ev) {\n\t\tthis.unselect(ev);\n\t\tthis.renderSelection(range);\n\t\tthis.reportSelection(range, ev);\n\t},\n\n\n\t// Renders a visual indication of the selection\n\trenderSelection: function(range) {\n\t\t// subclasses should implement\n\t},\n\n\n\t// Called when a new selection is made. Updates internal state and triggers handlers.\n\treportSelection: function(range, ev) {\n\t\tthis.isSelected = true;\n\t\tthis.trigger('select', null, range.start, range.end, ev);\n\t},\n\n\n\t// Undoes a selection. updates in the internal state and triggers handlers.\n\t// `ev` is the native mouse event that began the interaction.\n\tunselect: function(ev) {\n\t\tif (this.isSelected) {\n\t\t\tthis.isSelected = false;\n\t\t\tthis.destroySelection();\n\t\t\tthis.trigger('unselect', null, ev);\n\t\t}\n\t},\n\n\n\t// Unrenders a visual indication of selection\n\tdestroySelection: function() {\n\t\t// subclasses should implement\n\t},\n\n\n\t// Handler for unselecting when the user clicks something and the 'unselectAuto' setting is on\n\tdocumentMousedown: function(ev) {\n\t\tvar ignore;\n\n\t\t// is there a selection, and has the user made a proper left click?\n\t\tif (this.isSelected && this.opt('unselectAuto') && isPrimaryMouseButton(ev)) {\n\n\t\t\t// only unselect if the clicked element is not identical to or inside of an 'unselectCancel' element\n\t\t\tignore = this.opt('unselectCancel');\n\t\t\tif (!ignore || !$(ev.target).closest(ignore).length) {\n\t\t\t\tthis.unselect(ev);\n\t\t\t}\n\t\t}\n\t},\n\n\n\t/* Date Utils\n\t------------------------------------------------------------------------------------------------------------------*/\n\n\n\t// Initializes internal variables related to calculating hidden days-of-week\n\tinitHiddenDays: function() {\n\t\tvar hiddenDays = this.opt('hiddenDays') || []; // array of day-of-week indices that are hidden\n\t\tvar isHiddenDayHash = []; // is the day-of-week hidden? (hash with day-of-week-index -> bool)\n\t\tvar dayCnt = 0;\n\t\tvar i;\n\n\t\tif (this.opt('weekends') === false) {\n\t\t\thiddenDays.push(0, 6); // 0=sunday, 6=saturday\n\t\t}\n\n\t\tfor (i = 0; i < 7; i++) {\n\t\t\tif (\n\t\t\t\t!(isHiddenDayHash[i] = $.inArray(i, hiddenDays) !== -1)\n\t\t\t) {\n\t\t\t\tdayCnt++;\n\t\t\t}\n\t\t}\n\n\t\tif (!dayCnt) {\n\t\t\tthrow 'invalid hiddenDays'; // all days were hidden? bad.\n\t\t}\n\n\t\tthis.isHiddenDayHash = isHiddenDayHash;\n\t},\n\n\n\t// Is the current day hidden?\n\t// `day` is a day-of-week index (0-6), or a Moment\n\tisHiddenDay: function(day) {\n\t\tif (moment.isMoment(day)) {\n\t\t\tday = day.day();\n\t\t}\n\t\treturn this.isHiddenDayHash[day];\n\t},\n\n\n\t// Incrementing the current day until it is no longer a hidden day, returning a copy.\n\t// If the initial value of `date` is not a hidden day, don't do anything.\n\t// Pass `isExclusive` as `true` if you are dealing with an end date.\n\t// `inc` defaults to `1` (increment one day forward each time)\n\tskipHiddenDays: function(date, inc, isExclusive) {\n\t\tvar out = date.clone();\n\t\tinc = inc || 1;\n\t\twhile (\n\t\t\tthis.isHiddenDayHash[(out.day() + (isExclusive ? inc : 0) + 7) % 7]\n\t\t) {\n\t\t\tout.add(inc, 'days');\n\t\t}\n\t\treturn out;\n\t},\n\n\n\t// Returns the date range of the full days the given range visually appears to occupy.\n\t// Returns a new range object.\n\tcomputeDayRange: function(range) {\n\t\tvar startDay = range.start.clone().stripTime(); // the beginning of the day the range starts\n\t\tvar end = range.end;\n\t\tvar endDay = null;\n\t\tvar endTimeMS;\n\n\t\tif (end) {\n\t\t\tendDay = end.clone().stripTime(); // the beginning of the day the range exclusively ends\n\t\t\tendTimeMS = +end.time(); // # of milliseconds into `endDay`\n\n\t\t\t// If the end time is actually inclusively part of the next day and is equal to or\n\t\t\t// beyond the next day threshold, adjust the end to be the exclusive end of `endDay`.\n\t\t\t// Otherwise, leaving it as inclusive will cause it to exclude `endDay`.\n\t\t\tif (endTimeMS && endTimeMS >= this.nextDayThreshold) {\n\t\t\t\tendDay.add(1, 'days');\n\t\t\t}\n\t\t}\n\n\t\t// If no end was specified, or if it is within `startDay` but not past nextDayThreshold,\n\t\t// assign the default duration of one day.\n\t\tif (!end || endDay <= startDay) {\n\t\t\tendDay = startDay.clone().add(1, 'days');\n\t\t}\n\n\t\treturn { start: startDay, end: endDay };\n\t},\n\n\n\t// Does the given event visually appear to occupy more than one day?\n\tisMultiDayEvent: function(event) {\n\t\tvar range = this.computeDayRange(event); // event is range-ish\n\n\t\treturn range.end.diff(range.start, 'days') > 1;\n\t}\n\n});\n\n;;\n\nvar Calendar = fc.Calendar = fc.CalendarBase = Class.extend({\n\n\tdirDefaults: null, // option defaults related to LTR or RTL\n\tlangDefaults: null, // option defaults related to current locale\n\toverrides: null, // option overrides given to the fullCalendar constructor\n\toptions: null, // all defaults combined with overrides\n\tviewSpecCache: null, // cache of view definitions\n\tview: null, // current View object\n\theader: null,\n\n\n\t// a lot of this class' OOP logic is scoped within this constructor function,\n\t// but in the future, write individual methods on the prototype.\n\tconstructor: Calendar_constructor,\n\n\n\t// Initializes `this.options` and other important options-related objects\n\tinitOptions: function(overrides) {\n\t\tvar lang, langDefaults;\n\t\tvar isRTL, dirDefaults;\n\n\t\t// converts legacy options into non-legacy ones.\n\t\t// in the future, when this is removed, don't use `overrides` reference. make a copy.\n\t\toverrides = massageOverrides(overrides);\n\n\t\tlang = overrides.lang;\n\t\tlangDefaults = langOptionHash[lang];\n\t\tif (!langDefaults) {\n\t\t\tlang = Calendar.defaults.lang;\n\t\t\tlangDefaults = langOptionHash[lang] || {};\n\t\t}\n\n\t\tisRTL = firstDefined(\n\t\t\toverrides.isRTL,\n\t\t\tlangDefaults.isRTL,\n\t\t\tCalendar.defaults.isRTL\n\t\t);\n\t\tdirDefaults = isRTL ? Calendar.rtlDefaults : {};\n\n\t\tthis.dirDefaults = dirDefaults;\n\t\tthis.langDefaults = langDefaults;\n\t\tthis.overrides = overrides;\n\t\tthis.options = mergeOptions( // merge defaults and overrides. lowest to highest precedence\n\t\t\tCalendar.defaults, // global defaults\n\t\t\tdirDefaults,\n\t\t\tlangDefaults,\n\t\t\toverrides\n\t\t);\n\t\tpopulateInstanceComputableOptions(this.options);\n\n\t\tthis.viewSpecCache = {}; // somewhat unrelated\n\t},\n\n\n\t// Gets information about how to create a view. Will use a cache.\n\tgetViewSpec: function(viewType) {\n\t\tvar cache = this.viewSpecCache;\n\n\t\treturn cache[viewType] || (cache[viewType] = this.buildViewSpec(viewType));\n\t},\n\n\n\t// Given a duration singular unit, like \"week\" or \"day\", finds a matching view spec.\n\t// Preference is given to views that have corresponding buttons.\n\tgetUnitViewSpec: function(unit) {\n\t\tvar viewTypes;\n\t\tvar i;\n\t\tvar spec;\n\n\t\tif ($.inArray(unit, intervalUnits) != -1) {\n\n\t\t\t// put views that have buttons first. there will be duplicates, but oh well\n\t\t\tviewTypes = this.header.getViewsWithButtons();\n\t\t\t$.each(fc.views, function(viewType) { // all views\n\t\t\t\tviewTypes.push(viewType);\n\t\t\t});\n\n\t\t\tfor (i = 0; i < viewTypes.length; i++) {\n\t\t\t\tspec = this.getViewSpec(viewTypes[i]);\n\t\t\t\tif (spec) {\n\t\t\t\t\tif (spec.singleUnit == unit) {\n\t\t\t\t\t\treturn spec;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t},\n\n\n\t// Builds an object with information on how to create a given view\n\tbuildViewSpec: function(requestedViewType) {\n\t\tvar viewOverrides = this.overrides.views || {};\n\t\tvar defaultsChain = []; // for the view. lowest to highest priority\n\t\tvar overridesChain = []; // for the view. lowest to highest priority\n\t\tvar viewType = requestedViewType;\n\t\tvar viewClass;\n\t\tvar defaults; // for the view\n\t\tvar overrides; // for the view\n\t\tvar duration;\n\t\tvar unit;\n\t\tvar spec;\n\n\t\t// iterate from the specific view definition to a more general one until we hit an actual View class\n\t\twhile (viewType && !viewClass) {\n\t\t\tdefaults = fcViews[viewType] || {};\n\t\t\toverrides = viewOverrides[viewType] || {};\n\t\t\tduration = duration || overrides.duration || defaults.duration;\n\t\t\tviewType = overrides.type || defaults.type; // for next iteration\n\n\t\t\tif (typeof defaults === 'function') { // a class\n\t\t\t\tviewClass = defaults;\n\t\t\t\tdefaultsChain.unshift(viewClass.defaults || {});\n\t\t\t}\n\t\t\telse { // an options object\n\t\t\t\tdefaultsChain.unshift(defaults);\n\t\t\t}\n\t\t\toverridesChain.unshift(overrides);\n\t\t}\n\n\t\tif (viewClass) {\n\t\t\tspec = { 'class': viewClass, type: requestedViewType };\n\n\t\t\tif (duration) {\n\t\t\t\tduration = moment.duration(duration);\n\t\t\t\tif (!duration.valueOf()) { // invalid?\n\t\t\t\t\tduration = null;\n\t\t\t\t}\n\t\t\t}\n\t\t\tif (duration) {\n\t\t\t\tspec.duration = duration;\n\t\t\t\tunit = computeIntervalUnit(duration);\n\n\t\t\t\t// view is a single-unit duration, like \"week\" or \"day\"\n\t\t\t\t// incorporate options for this. lowest priority\n\t\t\t\tif (duration.as(unit) === 1) {\n\t\t\t\t\tspec.singleUnit = unit;\n\t\t\t\t\toverridesChain.unshift(viewOverrides[unit] || {});\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t// collapse into single objects\n\t\t\tspec.defaults = mergeOptions.apply(null, defaultsChain);\n\t\t\tspec.overrides = mergeOptions.apply(null, overridesChain);\n\n\t\t\tthis.buildViewSpecOptions(spec);\n\t\t\tthis.buildViewSpecButtonText(spec, requestedViewType);\n\n\t\t\treturn spec;\n\t\t}\n\t},\n\n\n\t// Builds and assigns a view spec's options object from its already-assigned defaults and overrides\n\tbuildViewSpecOptions: function(spec) {\n\t\tspec.options = mergeOptions( // lowest to highest priority\n\t\t\tCalendar.defaults, // global defaults\n\t\t\tspec.defaults, // view's defaults (from ViewSubclass.defaults)\n\t\t\tthis.dirDefaults,\n\t\t\tthis.langDefaults, // locale and dir take precedence over view's defaults!\n\t\t\tthis.overrides, // calendar's overrides (options given to constructor)\n\t\t\tspec.overrides // view's overrides (view-specific options)\n\t\t);\n\t\tpopulateInstanceComputableOptions(spec.options);\n\t},\n\n\n\t// Computes and assigns a view spec's buttonText-related options\n\tbuildViewSpecButtonText: function(spec, requestedViewType) {\n\n\t\t// given an options object with a possible `buttonText` hash, lookup the buttonText for the\n\t\t// requested view, falling back to a generic unit entry like \"week\" or \"day\"\n\t\tfunction queryButtonText(options) {\n\t\t\tvar buttonText = options.buttonText || {};\n\t\t\treturn buttonText[requestedViewType] ||\n\t\t\t\t(spec.singleUnit ? buttonText[spec.singleUnit] : null);\n\t\t}\n\n\t\t// highest to lowest priority\n\t\tspec.buttonTextOverride =\n\t\t\tqueryButtonText(this.overrides) || // constructor-specified buttonText lookup hash takes precedence\n\t\t\tspec.overrides.buttonText; // `buttonText` for view-specific options is a string\n\n\t\t// highest to lowest priority. mirrors buildViewSpecOptions\n\t\tspec.buttonTextDefault =\n\t\t\tqueryButtonText(this.langDefaults) ||\n\t\t\tqueryButtonText(this.dirDefaults) ||\n\t\t\tspec.defaults.buttonText || // a single string. from ViewSubclass.defaults\n\t\t\tqueryButtonText(Calendar.defaults) ||\n\t\t\t(spec.duration ? this.humanizeDuration(spec.duration) : null) || // like \"3 days\"\n\t\t\trequestedViewType; // fall back to given view name\n\t},\n\n\n\t// Given a view name for a custom view or a standard view, creates a ready-to-go View object\n\tinstantiateView: function(viewType) {\n\t\tvar spec = this.getViewSpec(viewType);\n\n\t\treturn new spec['class'](this, viewType, spec.options, spec.duration);\n\t},\n\n\n\t// Returns a boolean about whether the view is okay to instantiate at some point\n\tisValidViewType: function(viewType) {\n\t\treturn Boolean(this.getViewSpec(viewType));\n\t}\n\n});\n\n\nfunction Calendar_constructor(element, overrides) {\n\tvar t = this;\n\n\n\tt.initOptions(overrides || {});\n\tvar options = this.options;\n\n\t\n\t// Exports\n\t// -----------------------------------------------------------------------------------\n\n\tt.render = render;\n\tt.destroy = destroy;\n\tt.refetchEvents = refetchEvents;\n\tt.reportEvents = reportEvents;\n\tt.reportEventChange = reportEventChange;\n\tt.rerenderEvents = renderEvents; // `renderEvents` serves as a rerender. an API method\n\tt.changeView = renderView; // `renderView` will switch to another view\n\tt.select = select;\n\tt.unselect = unselect;\n\tt.prev = prev;\n\tt.next = next;\n\tt.prevYear = prevYear;\n\tt.nextYear = nextYear;\n\tt.today = today;\n\tt.gotoDate = gotoDate;\n\tt.incrementDate = incrementDate;\n\tt.zoomTo = zoomTo;\n\tt.getDate = getDate;\n\tt.getCalendar = getCalendar;\n\tt.getView = getView;\n\tt.option = option;\n\tt.trigger = trigger;\n\n\n\n\t// Language-data Internals\n\t// -----------------------------------------------------------------------------------\n\t// Apply overrides to the current language's data\n\n\n\tvar localeData = createObject( // make a cheap copy\n\t\tgetMomentLocaleData(options.lang) // will fall back to en\n\t);\n\n\tif (options.monthNames) {\n\t\tlocaleData._months = options.monthNames;\n\t}\n\tif (options.monthNamesShort) {\n\t\tlocaleData._monthsShort = options.monthNamesShort;\n\t}\n\tif (options.dayNames) {\n\t\tlocaleData._weekdays = options.dayNames;\n\t}\n\tif (options.dayNamesShort) {\n\t\tlocaleData._weekdaysShort = options.dayNamesShort;\n\t}\n\tif (options.firstDay != null) {\n\t\tvar _week = createObject(localeData._week); // _week: { dow: # }\n\t\t_week.dow = options.firstDay;\n\t\tlocaleData._week = _week;\n\t}\n\n\t// assign a normalized value, to be used by our .week() moment extension\n\tlocaleData._fullCalendar_weekCalc = (function(weekCalc) {\n\t\tif (typeof weekCalc === 'function') {\n\t\t\treturn weekCalc;\n\t\t}\n\t\telse if (weekCalc === 'local') {\n\t\t\treturn weekCalc;\n\t\t}\n\t\telse if (weekCalc === 'iso' || weekCalc === 'ISO') {\n\t\t\treturn 'ISO';\n\t\t}\n\t})(options.weekNumberCalculation);\n\n\n\n\t// Calendar-specific Date Utilities\n\t// -----------------------------------------------------------------------------------\n\n\n\tt.defaultAllDayEventDuration = moment.duration(options.defaultAllDayEventDuration);\n\tt.defaultTimedEventDuration = moment.duration(options.defaultTimedEventDuration);\n\n\n\t// Builds a moment using the settings of the current calendar: timezone and language.\n\t// Accepts anything the vanilla moment() constructor accepts.\n\tt.moment = function() {\n\t\tvar mom;\n\n\t\tif (options.timezone === 'local') {\n\t\t\tmom = fc.moment.apply(null, arguments);\n\n\t\t\t// Force the moment to be local, because fc.moment doesn't guarantee it.\n\t\t\tif (mom.hasTime()) { // don't give ambiguously-timed moments a local zone\n\t\t\t\tmom.local();\n\t\t\t}\n\t\t}\n\t\telse if (options.timezone === 'UTC') {\n\t\t\tmom = fc.moment.utc.apply(null, arguments); // process as UTC\n\t\t}\n\t\telse {\n\t\t\tmom = fc.moment.parseZone.apply(null, arguments); // let the input decide the zone\n\t\t}\n\n\t\tif ('_locale' in mom) { // moment 2.8 and above\n\t\t\tmom._locale = localeData;\n\t\t}\n\t\telse { // pre-moment-2.8\n\t\t\tmom._lang = localeData;\n\t\t}\n\n\t\treturn mom;\n\t};\n\n\n\t// Returns a boolean about whether or not the calendar knows how to calculate\n\t// the timezone offset of arbitrary dates in the current timezone.\n\tt.getIsAmbigTimezone = function() {\n\t\treturn options.timezone !== 'local' && options.timezone !== 'UTC';\n\t};\n\n\n\t// Returns a copy of the given date in the current timezone of it is ambiguously zoned.\n\t// This will also give the date an unambiguous time.\n\tt.rezoneDate = function(date) {\n\t\treturn t.moment(date.toArray());\n\t};\n\n\n\t// Returns a moment for the current date, as defined by the client's computer,\n\t// or overridden by the `now` option.\n\tt.getNow = function() {\n\t\tvar now = options.now;\n\t\tif (typeof now === 'function') {\n\t\t\tnow = now();\n\t\t}\n\t\treturn t.moment(now);\n\t};\n\n\n\t// Get an event's normalized end date. If not present, calculate it from the defaults.\n\tt.getEventEnd = function(event) {\n\t\tif (event.end) {\n\t\t\treturn event.end.clone();\n\t\t}\n\t\telse {\n\t\t\treturn t.getDefaultEventEnd(event.allDay, event.start);\n\t\t}\n\t};\n\n\n\t// Given an event's allDay status and start date, return swhat its fallback end date should be.\n\tt.getDefaultEventEnd = function(allDay, start) { // TODO: rename to computeDefaultEventEnd\n\t\tvar end = start.clone();\n\n\t\tif (allDay) {\n\t\t\tend.stripTime().add(t.defaultAllDayEventDuration);\n\t\t}\n\t\telse {\n\t\t\tend.add(t.defaultTimedEventDuration);\n\t\t}\n\n\t\tif (t.getIsAmbigTimezone()) {\n\t\t\tend.stripZone(); // we don't know what the tzo should be\n\t\t}\n\n\t\treturn end;\n\t};\n\n\n\t// Produces a human-readable string for the given duration.\n\t// Side-effect: changes the locale of the given duration.\n\tt.humanizeDuration = function(duration) {\n\t\treturn (duration.locale || duration.lang).call(duration, options.lang) // works moment-pre-2.8\n\t\t\t.humanize();\n\t};\n\n\n\t\n\t// Imports\n\t// -----------------------------------------------------------------------------------\n\n\n\tEventManager.call(t, options);\n\tvar isFetchNeeded = t.isFetchNeeded;\n\tvar fetchEvents = t.fetchEvents;\n\n\n\n\t// Locals\n\t// -----------------------------------------------------------------------------------\n\n\n\tvar _element = element[0];\n\tvar header;\n\tvar headerElement;\n\tvar content;\n\tvar tm; // for making theme classes\n\tvar currentView; // NOTE: keep this in sync with this.view\n\tvar viewsByType = {}; // holds all instantiated view instances, current or not\n\tvar suggestedViewHeight;\n\tvar windowResizeProxy; // wraps the windowResize function\n\tvar ignoreWindowResize = 0;\n\tvar date;\n\tvar events = [];\n\t\n\t\n\t\n\t// Main Rendering\n\t// -----------------------------------------------------------------------------------\n\n\n\tif (options.defaultDate != null) {\n\t\tdate = t.moment(options.defaultDate);\n\t}\n\telse {\n\t\tdate = t.getNow();\n\t}\n\t\n\t\n\tfunction render() {\n\t\tif (!content) {\n\t\t\tinitialRender();\n\t\t}\n\t\telse if (elementVisible()) {\n\t\t\t// mainly for the public API\n\t\t\tcalcSize();\n\t\t\trenderView();\n\t\t}\n\t}\n\t\n\t\n\tfunction initialRender() {\n\t\ttm = options.theme ? 'ui' : 'fc';\n\t\telement.addClass('fc');\n\n\t\tif (options.isRTL) {\n\t\t\telement.addClass('fc-rtl');\n\t\t}\n\t\telse {\n\t\t\telement.addClass('fc-ltr');\n\t\t}\n\n\t\tif (options.theme) {\n\t\t\telement.addClass('ui-widget');\n\t\t}\n\t\telse {\n\t\t\telement.addClass('fc-unthemed');\n\t\t}\n\n\t\tcontent = $(\"<div class='fc-view-container'/>\").prependTo(element);\n\n\t\theader = t.header = new Header(t, options);\n\t\theaderElement = header.render();\n\t\tif (headerElement) {\n\t\t\telement.prepend(headerElement);\n\t\t}\n\n\t\trenderView(options.defaultView);\n\n\t\tif (options.handleWindowResize) {\n\t\t\twindowResizeProxy = debounce(windowResize, options.windowResizeDelay); // prevents rapid calls\n\t\t\t$(window).resize(windowResizeProxy);\n\t\t}\n\t}\n\t\n\t\n\tfunction destroy() {\n\n\t\tif (currentView) {\n\t\t\tcurrentView.removeElement();\n\n\t\t\t// NOTE: don't null-out currentView/t.view in case API methods are called after destroy.\n\t\t\t// It is still the \"current\" view, just not rendered.\n\t\t}\n\n\t\theader.destroy();\n\t\tcontent.remove();\n\t\telement.removeClass('fc fc-ltr fc-rtl fc-unthemed ui-widget');\n\n\t\tif (windowResizeProxy) {\n\t\t\t$(window).unbind('resize', windowResizeProxy);\n\t\t}\n\t}\n\t\n\t\n\tfunction elementVisible() {\n\t\treturn element.is(':visible');\n\t}\n\t\n\t\n\n\t// View Rendering\n\t// -----------------------------------------------------------------------------------\n\n\n\t// Renders a view because of a date change, view-type change, or for the first time.\n\t// If not given a viewType, keep the current view but render different dates.\n\tfunction renderView(viewType) {\n\t\tignoreWindowResize++;\n\n\t\t// if viewType is changing, destroy the old view\n\t\tif (currentView && viewType && currentView.type !== viewType) {\n\t\t\theader.deactivateButton(currentView.type);\n\t\t\tfreezeContentHeight(); // prevent a scroll jump when view element is removed\n\t\t\tcurrentView.removeElement();\n\t\t\tcurrentView = t.view = null;\n\t\t}\n\n\t\t// if viewType changed, or the view was never created, create a fresh view\n\t\tif (!currentView && viewType) {\n\t\t\tcurrentView = t.view =\n\t\t\t\tviewsByType[viewType] ||\n\t\t\t\t(viewsByType[viewType] = t.instantiateView(viewType));\n\n\t\t\tcurrentView.setElement(\n\t\t\t\t$(\"<div class='fc-view fc-\" + viewType + \"-view' />\").appendTo(content)\n\t\t\t);\n\t\t\theader.activateButton(viewType);\n\t\t}\n\n\t\tif (currentView) {\n\n\t\t\t// in case the view should render a period of time that is completely hidden\n\t\t\tdate = currentView.massageCurrentDate(date);\n\n\t\t\t// render or rerender the view\n\t\t\tif (\n\t\t\t\t!currentView.isDisplayed ||\n\t\t\t\t!date.isWithin(currentView.intervalStart, currentView.intervalEnd) // implicit date window change\n\t\t\t) {\n\t\t\t\tif (elementVisible()) {\n\n\t\t\t\t\tfreezeContentHeight();\n\t\t\t\t\tcurrentView.display(date);\n\t\t\t\t\tunfreezeContentHeight();\n\n\t\t\t\t\t// need to do this after View::render, so dates are calculated\n\t\t\t\t\tupdateHeaderTitle();\n\t\t\t\t\tupdateTodayButton();\n\n\t\t\t\t\tgetAndRenderEvents();\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\tunfreezeContentHeight(); // undo any lone freezeContentHeight calls\n\t\tignoreWindowResize--;\n\t}\n\n\t\n\n\t// Resizing\n\t// -----------------------------------------------------------------------------------\n\n\n\tt.getSuggestedViewHeight = function() {\n\t\tif (suggestedViewHeight === undefined) {\n\t\t\tcalcSize();\n\t\t}\n\t\treturn suggestedViewHeight;\n\t};\n\n\n\tt.isHeightAuto = function() {\n\t\treturn options.contentHeight === 'auto' || options.height === 'auto';\n\t};\n\t\n\t\n\tfunction updateSize(shouldRecalc) {\n\t\tif (elementVisible()) {\n\n\t\t\tif (shouldRecalc) {\n\t\t\t\t_calcSize();\n\t\t\t}\n\n\t\t\tignoreWindowResize++;\n\t\t\tcurrentView.updateSize(true); // isResize=true. will poll getSuggestedViewHeight() and isHeightAuto()\n\t\t\tignoreWindowResize--;\n\n\t\t\treturn true; // signal success\n\t\t}\n\t}\n\n\n\tfunction calcSize() {\n\t\tif (elementVisible()) {\n\t\t\t_calcSize();\n\t\t}\n\t}\n\t\n\t\n\tfunction _calcSize() { // assumes elementVisible\n\t\tif (typeof options.contentHeight === 'number') { // exists and not 'auto'\n\t\t\tsuggestedViewHeight = options.contentHeight;\n\t\t}\n\t\telse if (typeof options.height === 'number') { // exists and not 'auto'\n\t\t\tsuggestedViewHeight = options.height - (headerElement ? headerElement.outerHeight(true) : 0);\n\t\t}\n\t\telse {\n\t\t\tsuggestedViewHeight = Math.round(content.width() / Math.max(options.aspectRatio, .5));\n\t\t}\n\t}\n\t\n\t\n\tfunction windowResize(ev) {\n\t\tif (\n\t\t\t!ignoreWindowResize &&\n\t\t\tev.target === window && // so we don't process jqui \"resize\" events that have bubbled up\n\t\t\tcurrentView.start // view has already been rendered\n\t\t) {\n\t\t\tif (updateSize(true)) {\n\t\t\t\tcurrentView.trigger('windowResize', _element);\n\t\t\t}\n\t\t}\n\t}\n\t\n\t\n\t\n\t/* Event Fetching/Rendering\n\t-----------------------------------------------------------------------------*/\n\t// TODO: going forward, most of this stuff should be directly handled by the view\n\n\n\tfunction refetchEvents() { // can be called as an API method\n\t\tdestroyEvents(); // so that events are cleared before user starts waiting for AJAX\n\t\tfetchAndRenderEvents();\n\t}\n\n\n\tfunction renderEvents() { // destroys old events if previously rendered\n\t\tif (elementVisible()) {\n\t\t\tfreezeContentHeight();\n\t\t\tcurrentView.displayEvents(events);\n\t\t\tunfreezeContentHeight();\n\t\t}\n\t}\n\n\n\tfunction destroyEvents() {\n\t\tfreezeContentHeight();\n\t\tcurrentView.clearEvents();\n\t\tunfreezeContentHeight();\n\t}\n\t\n\n\tfunction getAndRenderEvents() {\n\t\tif (!options.lazyFetching || isFetchNeeded(currentView.start, currentView.end)) {\n\t\t\tfetchAndRenderEvents();\n\t\t}\n\t\telse {\n\t\t\trenderEvents();\n\t\t}\n\t}\n\n\n\tfunction fetchAndRenderEvents() {\n\t\tfetchEvents(currentView.start, currentView.end);\n\t\t\t// ... will call reportEvents\n\t\t\t// ... which will call renderEvents\n\t}\n\n\t\n\t// called when event data arrives\n\tfunction reportEvents(_events) {\n\t\tevents = _events;\n\t\trenderEvents();\n\t}\n\n\n\t// called when a single event's data has been changed\n\tfunction reportEventChange() {\n\t\trenderEvents();\n\t}\n\n\n\n\t/* Header Updating\n\t-----------------------------------------------------------------------------*/\n\n\n\tfunction updateHeaderTitle() {\n\t\theader.updateTitle(currentView.title);\n\t}\n\n\n\tfunction updateTodayButton() {\n\t\tvar now = t.getNow();\n\t\tif (now.isWithin(currentView.intervalStart, currentView.intervalEnd)) {\n\t\t\theader.disableButton('today');\n\t\t}\n\t\telse {\n\t\t\theader.enableButton('today');\n\t\t}\n\t}\n\t\n\n\n\t/* Selection\n\t-----------------------------------------------------------------------------*/\n\t\n\n\tfunction select(start, end) {\n\n\t\tstart = t.moment(start);\n\t\tif (end) {\n\t\t\tend = t.moment(end);\n\t\t}\n\t\telse if (start.hasTime()) {\n\t\t\tend = start.clone().add(t.defaultTimedEventDuration);\n\t\t}\n\t\telse {\n\t\t\tend = start.clone().add(t.defaultAllDayEventDuration);\n\t\t}\n\n\t\tcurrentView.select({ start: start, end: end }); // accepts a range\n\t}\n\t\n\n\tfunction unselect() { // safe to be called before renderView\n\t\tif (currentView) {\n\t\t\tcurrentView.unselect();\n\t\t}\n\t}\n\t\n\t\n\t\n\t/* Date\n\t-----------------------------------------------------------------------------*/\n\t\n\t\n\tfunction prev() {\n\t\tdate = currentView.computePrevDate(date);\n\t\trenderView();\n\t}\n\t\n\t\n\tfunction next() {\n\t\tdate = currentView.computeNextDate(date);\n\t\trenderView();\n\t}\n\t\n\t\n\tfunction prevYear() {\n\t\tdate.add(-1, 'years');\n\t\trenderView();\n\t}\n\t\n\t\n\tfunction nextYear() {\n\t\tdate.add(1, 'years');\n\t\trenderView();\n\t}\n\t\n\t\n\tfunction today() {\n\t\tdate = t.getNow();\n\t\trenderView();\n\t}\n\t\n\t\n\tfunction gotoDate(dateInput) {\n\t\tdate = t.moment(dateInput);\n\t\trenderView();\n\t}\n\t\n\t\n\tfunction incrementDate(delta) {\n\t\tdate.add(moment.duration(delta));\n\t\trenderView();\n\t}\n\n\n\t// Forces navigation to a view for the given date.\n\t// `viewType` can be a specific view name or a generic one like \"week\" or \"day\".\n\tfunction zoomTo(newDate, viewType) {\n\t\tvar spec;\n\n\t\tviewType = viewType || 'day'; // day is default zoom\n\t\tspec = t.getViewSpec(viewType) || t.getUnitViewSpec(viewType);\n\n\t\tdate = newDate;\n\t\trenderView(spec ? spec.type : null);\n\t}\n\t\n\t\n\tfunction getDate() {\n\t\treturn date.clone();\n\t}\n\n\n\n\t/* Height \"Freezing\"\n\t-----------------------------------------------------------------------------*/\n\t// TODO: move this into the view\n\n\n\tfunction freezeContentHeight() {\n\t\tcontent.css({\n\t\t\twidth: '100%',\n\t\t\theight: content.height(),\n\t\t\toverflow: 'hidden'\n\t\t});\n\t}\n\n\n\tfunction unfreezeContentHeight() {\n\t\tcontent.css({\n\t\t\twidth: '',\n\t\t\theight: '',\n\t\t\toverflow: ''\n\t\t});\n\t}\n\t\n\t\n\t\n\t/* Misc\n\t-----------------------------------------------------------------------------*/\n\t\n\n\tfunction getCalendar() {\n\t\treturn t;\n\t}\n\n\t\n\tfunction getView() {\n\t\treturn currentView;\n\t}\n\t\n\t\n\tfunction option(name, value) {\n\t\tif (value === undefined) {\n\t\t\treturn options[name];\n\t\t}\n\t\tif (name == 'height' || name == 'contentHeight' || name == 'aspectRatio') {\n\t\t\toptions[name] = value;\n\t\t\tupdateSize(true); // true = allow recalculation of height\n\t\t}\n\t}\n\t\n\t\n\tfunction trigger(name, thisObj) {\n\t\tif (options[name]) {\n\t\t\treturn options[name].apply(\n\t\t\t\tthisObj || _element,\n\t\t\t\tArray.prototype.slice.call(arguments, 2)\n\t\t\t);\n\t\t}\n\t}\n\n}\n\n;;\n\nCalendar.defaults = {\n\n\ttitleRangeSeparator: ' \\u2014 ', // emphasized dash\n\tmonthYearFormat: 'MMMM YYYY', // required for en. other languages rely on datepicker computable option\n\n\tdefaultTimedEventDuration: '02:00:00',\n\tdefaultAllDayEventDuration: { days: 1 },\n\tforceEventDuration: false,\n\tnextDayThreshold: '09:00:00', // 9am\n\n\t// display\n\tdefaultView: 'month',\n\taspectRatio: 1.35,\n\theader: {\n\t\tleft: 'title',\n\t\tcenter: '',\n\t\tright: 'today prev,next'\n\t},\n\tweekends: true,\n\tweekNumbers: false,\n\n\tweekNumberTitle: 'W',\n\tweekNumberCalculation: 'local',\n\t\n\t//editable: false,\n\t\n\t// event ajax\n\tlazyFetching: true,\n\tstartParam: 'start',\n\tendParam: 'end',\n\ttimezoneParam: 'timezone',\n\n\ttimezone: false,\n\n\t//allDayDefault: undefined,\n\n\t// locale\n\tisRTL: false,\n\tbuttonText: {\n\t\tprev: \"prev\",\n\t\tnext: \"next\",\n\t\tprevYear: \"prev year\",\n\t\tnextYear: \"next year\",\n\t\tyear: 'year', // TODO: locale files need to specify this\n\t\ttoday: 'today',\n\t\tmonth: 'month',\n\t\tweek: 'week',\n\t\tday: 'day'\n\t},\n\n\tbuttonIcons: {\n\t\tprev: 'left-single-arrow',\n\t\tnext: 'right-single-arrow',\n\t\tprevYear: 'left-double-arrow',\n\t\tnextYear: 'right-double-arrow'\n\t},\n\t\n\t// jquery-ui theming\n\ttheme: false,\n\tthemeButtonIcons: {\n\t\tprev: 'circle-triangle-w',\n\t\tnext: 'circle-triangle-e',\n\t\tprevYear: 'seek-prev',\n\t\tnextYear: 'seek-next'\n\t},\n\n\t//eventResizableFromStart: false,\n\tdragOpacity: .75,\n\tdragRevertDuration: 500,\n\tdragScroll: true,\n\t\n\t//selectable: false,\n\tunselectAuto: true,\n\t\n\tdropAccept: '*',\n\n\teventLimit: false,\n\teventLimitText: 'more',\n\teventLimitClick: 'popover',\n\tdayPopoverFormat: 'LL',\n\t\n\thandleWindowResize: true,\n\twindowResizeDelay: 200 // milliseconds before an updateSize happens\n\t\n};\n\n\nCalendar.englishDefaults = { // used by lang.js\n\tdayPopoverFormat: 'dddd, MMMM D'\n};\n\n\nCalendar.rtlDefaults = { // right-to-left defaults\n\theader: { // TODO: smarter solution (first/center/last ?)\n\t\tleft: 'next,prev today',\n\t\tcenter: '',\n\t\tright: 'title'\n\t},\n\tbuttonIcons: {\n\t\tprev: 'right-single-arrow',\n\t\tnext: 'left-single-arrow',\n\t\tprevYear: 'right-double-arrow',\n\t\tnextYear: 'left-double-arrow'\n\t},\n\tthemeButtonIcons: {\n\t\tprev: 'circle-triangle-e',\n\t\tnext: 'circle-triangle-w',\n\t\tnextYear: 'seek-prev',\n\t\tprevYear: 'seek-next'\n\t}\n};\n\n;;\n\nvar langOptionHash = fc.langs = {}; // initialize and expose\n\n\n// TODO: document the structure and ordering of a FullCalendar lang file\n// TODO: rename everything \"lang\" to \"locale\", like what the moment project did\n\n\n// Initialize jQuery UI datepicker translations while using some of the translations\n// Will set this as the default language for datepicker.\nfc.datepickerLang = function(langCode, dpLangCode, dpOptions) {\n\n\t// get the FullCalendar internal option hash for this language. create if necessary\n\tvar fcOptions = langOptionHash[langCode] || (langOptionHash[langCode] = {});\n\n\t// transfer some simple options from datepicker to fc\n\tfcOptions.isRTL = dpOptions.isRTL;\n\tfcOptions.weekNumberTitle = dpOptions.weekHeader;\n\n\t// compute some more complex options from datepicker\n\t$.each(dpComputableOptions, function(name, func) {\n\t\tfcOptions[name] = func(dpOptions);\n\t});\n\n\t// is jQuery UI Datepicker is on the page?\n\tif ($.datepicker) {\n\n\t\t// Register the language data.\n\t\t// FullCalendar and MomentJS use language codes like \"pt-br\" but Datepicker\n\t\t// does it like \"pt-BR\" or if it doesn't have the language, maybe just \"pt\".\n\t\t// Make an alias so the language can be referenced either way.\n\t\t$.datepicker.regional[dpLangCode] =\n\t\t\t$.datepicker.regional[langCode] = // alias\n\t\t\t\tdpOptions;\n\n\t\t// Alias 'en' to the default language data. Do this every time.\n\t\t$.datepicker.regional.en = $.datepicker.regional[''];\n\n\t\t// Set as Datepicker's global defaults.\n\t\t$.datepicker.setDefaults(dpOptions);\n\t}\n};\n\n\n// Sets FullCalendar-specific translations. Will set the language as the global default.\nfc.lang = function(langCode, newFcOptions) {\n\tvar fcOptions;\n\tvar momOptions;\n\n\t// get the FullCalendar internal option hash for this language. create if necessary\n\tfcOptions = langOptionHash[langCode] || (langOptionHash[langCode] = {});\n\n\t// provided new options for this language? merge them in\n\tif (newFcOptions) {\n\t\tfcOptions = langOptionHash[langCode] = mergeOptions(fcOptions, newFcOptions);\n\t}\n\n\t// compute language options that weren't defined.\n\t// always do this. newFcOptions can be undefined when initializing from i18n file,\n\t// so no way to tell if this is an initialization or a default-setting.\n\tmomOptions = getMomentLocaleData(langCode); // will fall back to en\n\t$.each(momComputableOptions, function(name, func) {\n\t\tif (fcOptions[name] == null) {\n\t\t\tfcOptions[name] = func(momOptions, fcOptions);\n\t\t}\n\t});\n\n\t// set it as the default language for FullCalendar\n\tCalendar.defaults.lang = langCode;\n};\n\n\n// NOTE: can't guarantee any of these computations will run because not every language has datepicker\n// configs, so make sure there are English fallbacks for these in the defaults file.\nvar dpComputableOptions = {\n\n\tbuttonText: function(dpOptions) {\n\t\treturn {\n\t\t\t// the translations sometimes wrongly contain HTML entities\n\t\t\tprev: stripHtmlEntities(dpOptions.prevText),\n\t\t\tnext: stripHtmlEntities(dpOptions.nextText),\n\t\t\ttoday: stripHtmlEntities(dpOptions.currentText)\n\t\t};\n\t},\n\n\t// Produces format strings like \"MMMM YYYY\" -> \"September 2014\"\n\tmonthYearFormat: function(dpOptions) {\n\t\treturn dpOptions.showMonthAfterYear ?\n\t\t\t'YYYY[' + dpOptions.yearSuffix + '] MMMM' :\n\t\t\t'MMMM YYYY[' + dpOptions.yearSuffix + ']';\n\t}\n\n};\n\nvar momComputableOptions = {\n\n\t// Produces format strings like \"ddd M/D\" -> \"Fri 9/15\"\n\tdayOfMonthFormat: function(momOptions, fcOptions) {\n\t\tvar format = momOptions.longDateFormat('l'); // for the format like \"M/D/YYYY\"\n\n\t\t// strip the year off the edge, as well as other misc non-whitespace chars\n\t\tformat = format.replace(/^Y+[^\\w\\s]*|[^\\w\\s]*Y+$/g, '');\n\n\t\tif (fcOptions.isRTL) {\n\t\t\tformat += ' ddd'; // for RTL, add day-of-week to end\n\t\t}\n\t\telse {\n\t\t\tformat = 'ddd ' + format; // for LTR, add day-of-week to beginning\n\t\t}\n\t\treturn format;\n\t},\n\n\t// Produces format strings like \"h:mma\" -> \"6:00pm\"\n\tmediumTimeFormat: function(momOptions) { // can't be called `timeFormat` because collides with option\n\t\treturn momOptions.longDateFormat('LT')\n\t\t\t.replace(/\\s*a$/i, 'a'); // convert AM/PM/am/pm to lowercase. remove any spaces beforehand\n\t},\n\n\t// Produces format strings like \"h(:mm)a\" -> \"6pm\" / \"6:30pm\"\n\tsmallTimeFormat: function(momOptions) {\n\t\treturn momOptions.longDateFormat('LT')\n\t\t\t.replace(':mm', '(:mm)')\n\t\t\t.replace(/(\\Wmm)$/, '($1)') // like above, but for foreign langs\n\t\t\t.replace(/\\s*a$/i, 'a'); // convert AM/PM/am/pm to lowercase. remove any spaces beforehand\n\t},\n\n\t// Produces format strings like \"h(:mm)t\" -> \"6p\" / \"6:30p\"\n\textraSmallTimeFormat: function(momOptions) {\n\t\treturn momOptions.longDateFormat('LT')\n\t\t\t.replace(':mm', '(:mm)')\n\t\t\t.replace(/(\\Wmm)$/, '($1)') // like above, but for foreign langs\n\t\t\t.replace(/\\s*a$/i, 't'); // convert to AM/PM/am/pm to lowercase one-letter. remove any spaces beforehand\n\t},\n\n\t// Produces format strings like \"ha\" / \"H\" -> \"6pm\" / \"18\"\n\thourFormat: function(momOptions) {\n\t\treturn momOptions.longDateFormat('LT')\n\t\t\t.replace(':mm', '')\n\t\t\t.replace(/(\\Wmm)$/, '') // like above, but for foreign langs\n\t\t\t.replace(/\\s*a$/i, 'a'); // convert AM/PM/am/pm to lowercase. remove any spaces beforehand\n\t},\n\n\t// Produces format strings like \"h:mm\" -> \"6:30\" (with no AM/PM)\n\tnoMeridiemTimeFormat: function(momOptions) {\n\t\treturn momOptions.longDateFormat('LT')\n\t\t\t.replace(/\\s*a$/i, ''); // remove trailing AM/PM\n\t}\n\n};\n\n\n// options that should be computed off live calendar options (considers override options)\nvar instanceComputableOptions = { // TODO: best place for this? related to lang?\n\n\t// Produces format strings for results like \"Mo 16\"\n\tsmallDayDateFormat: function(options) {\n\t\treturn options.isRTL ?\n\t\t\t'D dd' :\n\t\t\t'dd D';\n\t},\n\n\t// Produces format strings for results like \"Wk 5\"\n\tweekFormat: function(options) {\n\t\treturn options.isRTL ?\n\t\t\t'w[ ' + options.weekNumberTitle + ']' :\n\t\t\t'[' + options.weekNumberTitle + ' ]w';\n\t},\n\n\t// Produces format strings for results like \"Wk5\"\n\tsmallWeekFormat: function(options) {\n\t\treturn options.isRTL ?\n\t\t\t'w[' + options.weekNumberTitle + ']' :\n\t\t\t'[' + options.weekNumberTitle + ']w';\n\t}\n\n};\n\nfunction populateInstanceComputableOptions(options) {\n\t$.each(instanceComputableOptions, function(name, func) {\n\t\tif (options[name] == null) {\n\t\t\toptions[name] = func(options);\n\t\t}\n\t});\n}\n\n\n// Returns moment's internal locale data. If doesn't exist, returns English.\n// Works with moment-pre-2.8\nfunction getMomentLocaleData(langCode) {\n\tvar func = moment.localeData || moment.langData;\n\treturn func.call(moment, langCode) ||\n\t\tfunc.call(moment, 'en'); // the newer localData could return null, so fall back to en\n}\n\n\n// Initialize English by forcing computation of moment-derived options.\n// Also, sets it as the default.\nfc.lang('en', Calendar.englishDefaults);\n\n;;\n\n/* Top toolbar area with buttons and title\n----------------------------------------------------------------------------------------------------------------------*/\n// TODO: rename all header-related things to \"toolbar\"\n\nfunction Header(calendar, options) {\n\tvar t = this;\n\t\n\t// exports\n\tt.render = render;\n\tt.destroy = destroy;\n\tt.updateTitle = updateTitle;\n\tt.activateButton = activateButton;\n\tt.deactivateButton = deactivateButton;\n\tt.disableButton = disableButton;\n\tt.enableButton = enableButton;\n\tt.getViewsWithButtons = getViewsWithButtons;\n\t\n\t// locals\n\tvar el = $();\n\tvar viewsWithButtons = [];\n\tvar tm;\n\n\n\tfunction render() {\n\t\tvar sections = options.header;\n\n\t\ttm = options.theme ? 'ui' : 'fc';\n\n\t\tif (sections) {\n\t\t\tel = $(\"<div class='fc-toolbar'/>\")\n\t\t\t\t.append(renderSection('left'))\n\t\t\t\t.append(renderSection('right'))\n\t\t\t\t.append(renderSection('center'))\n\t\t\t\t.append('<div class=\"fc-clear\"/>');\n\n\t\t\treturn el;\n\t\t}\n\t}\n\t\n\t\n\tfunction destroy() {\n\t\tel.remove();\n\t}\n\t\n\t\n\tfunction renderSection(position) {\n\t\tvar sectionEl = $('<div class=\"fc-' + position + '\"/>');\n\t\tvar buttonStr = options.header[position];\n\n\t\tif (buttonStr) {\n\t\t\t$.each(buttonStr.split(' '), function(i) {\n\t\t\t\tvar groupChildren = $();\n\t\t\t\tvar isOnlyButtons = true;\n\t\t\t\tvar groupEl;\n\n\t\t\t\t$.each(this.split(','), function(j, buttonName) {\n\t\t\t\t\tvar viewSpec;\n\t\t\t\t\tvar buttonClick;\n\t\t\t\t\tvar overrideText; // text explicitly set by calendar's constructor options. overcomes icons\n\t\t\t\t\tvar defaultText;\n\t\t\t\t\tvar themeIcon;\n\t\t\t\t\tvar normalIcon;\n\t\t\t\t\tvar innerHtml;\n\t\t\t\t\tvar classes;\n\t\t\t\t\tvar button;\n\n\t\t\t\t\tif (buttonName == 'title') {\n\t\t\t\t\t\tgroupChildren = groupChildren.add($('<h2>&nbsp;</h2>')); // we always want it to take up height\n\t\t\t\t\t\tisOnlyButtons = false;\n\t\t\t\t\t}\n\t\t\t\t\telse {\n\t\t\t\t\t\tviewSpec = calendar.getViewSpec(buttonName);\n\n\t\t\t\t\t\tif (viewSpec) {\n\t\t\t\t\t\t\tbuttonClick = function() {\n\t\t\t\t\t\t\t\tcalendar.changeView(buttonName);\n\t\t\t\t\t\t\t};\n\t\t\t\t\t\t\tviewsWithButtons.push(buttonName);\n\t\t\t\t\t\t\toverrideText = viewSpec.buttonTextOverride;\n\t\t\t\t\t\t\tdefaultText = viewSpec.buttonTextDefault;\n\t\t\t\t\t\t}\n\t\t\t\t\t\telse if (calendar[buttonName]) { // a calendar method\n\t\t\t\t\t\t\tbuttonClick = function() {\n\t\t\t\t\t\t\t\tcalendar[buttonName]();\n\t\t\t\t\t\t\t};\n\t\t\t\t\t\t\toverrideText = (calendar.overrides.buttonText || {})[buttonName];\n\t\t\t\t\t\t\tdefaultText = options.buttonText[buttonName]; // everything else is considered default\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tif (buttonClick) {\n\n\t\t\t\t\t\t\tthemeIcon = options.themeButtonIcons[buttonName];\n\t\t\t\t\t\t\tnormalIcon = options.buttonIcons[buttonName];\n\n\t\t\t\t\t\t\tif (overrideText) {\n\t\t\t\t\t\t\t\tinnerHtml = htmlEscape(overrideText);\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\telse if (themeIcon && options.theme) {\n\t\t\t\t\t\t\t\tinnerHtml = \"<span class='ui-icon ui-icon-\" + themeIcon + \"'></span>\";\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\telse if (normalIcon && !options.theme) {\n\t\t\t\t\t\t\t\tinnerHtml = \"<span class='fc-icon fc-icon-\" + normalIcon + \"'></span>\";\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\telse {\n\t\t\t\t\t\t\t\tinnerHtml = htmlEscape(defaultText);\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\tclasses = [\n\t\t\t\t\t\t\t\t'fc-' + buttonName + '-button',\n\t\t\t\t\t\t\t\ttm + '-button',\n\t\t\t\t\t\t\t\ttm + '-state-default'\n\t\t\t\t\t\t\t];\n\n\t\t\t\t\t\t\tbutton = $( // type=\"button\" so that it doesn't submit a form\n\t\t\t\t\t\t\t\t'<button type=\"button\" class=\"' + classes.join(' ') + '\">' +\n\t\t\t\t\t\t\t\t\tinnerHtml +\n\t\t\t\t\t\t\t\t'</button>'\n\t\t\t\t\t\t\t\t)\n\t\t\t\t\t\t\t\t.click(function() {\n\t\t\t\t\t\t\t\t\t// don't process clicks for disabled buttons\n\t\t\t\t\t\t\t\t\tif (!button.hasClass(tm + '-state-disabled')) {\n\n\t\t\t\t\t\t\t\t\t\tbuttonClick();\n\n\t\t\t\t\t\t\t\t\t\t// after the click action, if the button becomes the \"active\" tab, or disabled,\n\t\t\t\t\t\t\t\t\t\t// it should never have a hover class, so remove it now.\n\t\t\t\t\t\t\t\t\t\tif (\n\t\t\t\t\t\t\t\t\t\t\tbutton.hasClass(tm + '-state-active') ||\n\t\t\t\t\t\t\t\t\t\t\tbutton.hasClass(tm + '-state-disabled')\n\t\t\t\t\t\t\t\t\t\t) {\n\t\t\t\t\t\t\t\t\t\t\tbutton.removeClass(tm + '-state-hover');\n\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t})\n\t\t\t\t\t\t\t\t.mousedown(function() {\n\t\t\t\t\t\t\t\t\t// the *down* effect (mouse pressed in).\n\t\t\t\t\t\t\t\t\t// only on buttons that are not the \"active\" tab, or disabled\n\t\t\t\t\t\t\t\t\tbutton\n\t\t\t\t\t\t\t\t\t\t.not('.' + tm + '-state-active')\n\t\t\t\t\t\t\t\t\t\t.not('.' + tm + '-state-disabled')\n\t\t\t\t\t\t\t\t\t\t.addClass(tm + '-state-down');\n\t\t\t\t\t\t\t\t})\n\t\t\t\t\t\t\t\t.mouseup(function() {\n\t\t\t\t\t\t\t\t\t// undo the *down* effect\n\t\t\t\t\t\t\t\t\tbutton.removeClass(tm + '-state-down');\n\t\t\t\t\t\t\t\t})\n\t\t\t\t\t\t\t\t.hover(\n\t\t\t\t\t\t\t\t\tfunction() {\n\t\t\t\t\t\t\t\t\t\t// the *hover* effect.\n\t\t\t\t\t\t\t\t\t\t// only on buttons that are not the \"active\" tab, or disabled\n\t\t\t\t\t\t\t\t\t\tbutton\n\t\t\t\t\t\t\t\t\t\t\t.not('.' + tm + '-state-active')\n\t\t\t\t\t\t\t\t\t\t\t.not('.' + tm + '-state-disabled')\n\t\t\t\t\t\t\t\t\t\t\t.addClass(tm + '-state-hover');\n\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\tfunction() {\n\t\t\t\t\t\t\t\t\t\t// undo the *hover* effect\n\t\t\t\t\t\t\t\t\t\tbutton\n\t\t\t\t\t\t\t\t\t\t\t.removeClass(tm + '-state-hover')\n\t\t\t\t\t\t\t\t\t\t\t.removeClass(tm + '-state-down'); // if mouseleave happens before mouseup\n\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t);\n\n\t\t\t\t\t\t\tgroupChildren = groupChildren.add(button);\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t});\n\n\t\t\t\tif (isOnlyButtons) {\n\t\t\t\t\tgroupChildren\n\t\t\t\t\t\t.first().addClass(tm + '-corner-left').end()\n\t\t\t\t\t\t.last().addClass(tm + '-corner-right').end();\n\t\t\t\t}\n\n\t\t\t\tif (groupChildren.length > 1) {\n\t\t\t\t\tgroupEl = $('<div/>');\n\t\t\t\t\tif (isOnlyButtons) {\n\t\t\t\t\t\tgroupEl.addClass('fc-button-group');\n\t\t\t\t\t}\n\t\t\t\t\tgroupEl.append(groupChildren);\n\t\t\t\t\tsectionEl.append(groupEl);\n\t\t\t\t}\n\t\t\t\telse {\n\t\t\t\t\tsectionEl.append(groupChildren); // 1 or 0 children\n\t\t\t\t}\n\t\t\t});\n\t\t}\n\n\t\treturn sectionEl;\n\t}\n\t\n\t\n\tfunction updateTitle(text) {\n\t\tel.find('h2').text(text);\n\t}\n\t\n\t\n\tfunction activateButton(buttonName) {\n\t\tel.find('.fc-' + buttonName + '-button')\n\t\t\t.addClass(tm + '-state-active');\n\t}\n\t\n\t\n\tfunction deactivateButton(buttonName) {\n\t\tel.find('.fc-' + buttonName + '-button')\n\t\t\t.removeClass(tm + '-state-active');\n\t}\n\t\n\t\n\tfunction disableButton(buttonName) {\n\t\tel.find('.fc-' + buttonName + '-button')\n\t\t\t.attr('disabled', 'disabled')\n\t\t\t.addClass(tm + '-state-disabled');\n\t}\n\t\n\t\n\tfunction enableButton(buttonName) {\n\t\tel.find('.fc-' + buttonName + '-button')\n\t\t\t.removeAttr('disabled')\n\t\t\t.removeClass(tm + '-state-disabled');\n\t}\n\n\n\tfunction getViewsWithButtons() {\n\t\treturn viewsWithButtons;\n\t}\n\n}\n\n;;\n\nfc.sourceNormalizers = [];\nfc.sourceFetchers = [];\n\nvar ajaxDefaults = {\n\tdataType: 'json',\n\tcache: false\n};\n\nvar eventGUID = 1;\n\n\nfunction EventManager(options) { // assumed to be a calendar\n\tvar t = this;\n\t\n\t\n\t// exports\n\tt.isFetchNeeded = isFetchNeeded;\n\tt.fetchEvents = fetchEvents;\n\tt.addEventSource = addEventSource;\n\tt.removeEventSource = removeEventSource;\n\tt.updateEvent = updateEvent;\n\tt.renderEvent = renderEvent;\n\tt.removeEvents = removeEvents;\n\tt.clientEvents = clientEvents;\n\tt.mutateEvent = mutateEvent;\n\tt.normalizeEventRange = normalizeEventRange;\n\tt.normalizeEventRangeTimes = normalizeEventRangeTimes;\n\tt.ensureVisibleEventRange = ensureVisibleEventRange;\n\t\n\t\n\t// imports\n\tvar trigger = t.trigger;\n\tvar getView = t.getView;\n\tvar reportEvents = t.reportEvents;\n\t\n\t\n\t// locals\n\tvar stickySource = { events: [] };\n\tvar sources = [ stickySource ];\n\tvar rangeStart, rangeEnd;\n\tvar currentFetchID = 0;\n\tvar pendingSourceCnt = 0;\n\tvar loadingLevel = 0;\n\tvar cache = []; // holds events that have already been expanded\n\n\n\t$.each(\n\t\t(options.events ? [ options.events ] : []).concat(options.eventSources || []),\n\t\tfunction(i, sourceInput) {\n\t\t\tvar source = buildEventSource(sourceInput);\n\t\t\tif (source) {\n\t\t\t\tsources.push(source);\n\t\t\t}\n\t\t}\n\t);\n\t\n\t\n\t\n\t/* Fetching\n\t-----------------------------------------------------------------------------*/\n\t\n\t\n\tfunction isFetchNeeded(start, end) {\n\t\treturn !rangeStart || // nothing has been fetched yet?\n\t\t\t// or, a part of the new range is outside of the old range? (after normalizing)\n\t\t\tstart.clone().stripZone() < rangeStart.clone().stripZone() ||\n\t\t\tend.clone().stripZone() > rangeEnd.clone().stripZone();\n\t}\n\t\n\t\n\tfunction fetchEvents(start, end) {\n\t\trangeStart = start;\n\t\trangeEnd = end;\n\t\tcache = [];\n\t\tvar fetchID = ++currentFetchID;\n\t\tvar len = sources.length;\n\t\tpendingSourceCnt = len;\n\t\tfor (var i=0; i<len; i++) {\n\t\t\tfetchEventSource(sources[i], fetchID);\n\t\t}\n\t}\n\t\n\t\n\tfunction fetchEventSource(source, fetchID) {\n\t\t_fetchEventSource(source, function(eventInputs) {\n\t\t\tvar isArraySource = $.isArray(source.events);\n\t\t\tvar i, eventInput;\n\t\t\tvar abstractEvent;\n\n\t\t\tif (fetchID == currentFetchID) {\n\n\t\t\t\tif (eventInputs) {\n\t\t\t\t\tfor (i = 0; i < eventInputs.length; i++) {\n\t\t\t\t\t\teventInput = eventInputs[i];\n\n\t\t\t\t\t\tif (isArraySource) { // array sources have already been convert to Event Objects\n\t\t\t\t\t\t\tabstractEvent = eventInput;\n\t\t\t\t\t\t}\n\t\t\t\t\t\telse {\n\t\t\t\t\t\t\tabstractEvent = buildEventFromInput(eventInput, source);\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tif (abstractEvent) { // not false (an invalid event)\n\t\t\t\t\t\t\tcache.push.apply(\n\t\t\t\t\t\t\t\tcache,\n\t\t\t\t\t\t\t\texpandEvent(abstractEvent) // add individual expanded events to the cache\n\t\t\t\t\t\t\t);\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\tpendingSourceCnt--;\n\t\t\t\tif (!pendingSourceCnt) {\n\t\t\t\t\treportEvents(cache);\n\t\t\t\t}\n\t\t\t}\n\t\t});\n\t}\n\t\n\t\n\tfunction _fetchEventSource(source, callback) {\n\t\tvar i;\n\t\tvar fetchers = fc.sourceFetchers;\n\t\tvar res;\n\n\t\tfor (i=0; i<fetchers.length; i++) {\n\t\t\tres = fetchers[i].call(\n\t\t\t\tt, // this, the Calendar object\n\t\t\t\tsource,\n\t\t\t\trangeStart.clone(),\n\t\t\t\trangeEnd.clone(),\n\t\t\t\toptions.timezone,\n\t\t\t\tcallback\n\t\t\t);\n\n\t\t\tif (res === true) {\n\t\t\t\t// the fetcher is in charge. made its own async request\n\t\t\t\treturn;\n\t\t\t}\n\t\t\telse if (typeof res == 'object') {\n\t\t\t\t// the fetcher returned a new source. process it\n\t\t\t\t_fetchEventSource(res, callback);\n\t\t\t\treturn;\n\t\t\t}\n\t\t}\n\n\t\tvar events = source.events;\n\t\tif (events) {\n\t\t\tif ($.isFunction(events)) {\n\t\t\t\tpushLoading();\n\t\t\t\tevents.call(\n\t\t\t\t\tt, // this, the Calendar object\n\t\t\t\t\trangeStart.clone(),\n\t\t\t\t\trangeEnd.clone(),\n\t\t\t\t\toptions.timezone,\n\t\t\t\t\tfunction(events) {\n\t\t\t\t\t\tcallback(events);\n\t\t\t\t\t\tpopLoading();\n\t\t\t\t\t}\n\t\t\t\t);\n\t\t\t}\n\t\t\telse if ($.isArray(events)) {\n\t\t\t\tcallback(events);\n\t\t\t}\n\t\t\telse {\n\t\t\t\tcallback();\n\t\t\t}\n\t\t}else{\n\t\t\tvar url = source.url;\n\t\t\tif (url) {\n\t\t\t\tvar success = source.success;\n\t\t\t\tvar error = source.error;\n\t\t\t\tvar complete = source.complete;\n\n\t\t\t\t// retrieve any outbound GET/POST $.ajax data from the options\n\t\t\t\tvar customData;\n\t\t\t\tif ($.isFunction(source.data)) {\n\t\t\t\t\t// supplied as a function that returns a key/value object\n\t\t\t\t\tcustomData = source.data();\n\t\t\t\t}\n\t\t\t\telse {\n\t\t\t\t\t// supplied as a straight key/value object\n\t\t\t\t\tcustomData = source.data;\n\t\t\t\t}\n\n\t\t\t\t// use a copy of the custom data so we can modify the parameters\n\t\t\t\t// and not affect the passed-in object.\n\t\t\t\tvar data = $.extend({}, customData || {});\n\n\t\t\t\tvar startParam = firstDefined(source.startParam, options.startParam);\n\t\t\t\tvar endParam = firstDefined(source.endParam, options.endParam);\n\t\t\t\tvar timezoneParam = firstDefined(source.timezoneParam, options.timezoneParam);\n\n\t\t\t\tif (startParam) {\n\t\t\t\t\tdata[startParam] = rangeStart.format();\n\t\t\t\t}\n\t\t\t\tif (endParam) {\n\t\t\t\t\tdata[endParam] = rangeEnd.format();\n\t\t\t\t}\n\t\t\t\tif (options.timezone && options.timezone != 'local') {\n\t\t\t\t\tdata[timezoneParam] = options.timezone;\n\t\t\t\t}\n\n\t\t\t\tpushLoading();\n\t\t\t\t$.ajax($.extend({}, ajaxDefaults, source, {\n\t\t\t\t\tdata: data,\n\t\t\t\t\tsuccess: function(events) {\n\t\t\t\t\t\tevents = events || [];\n\t\t\t\t\t\tvar res = applyAll(success, this, arguments);\n\t\t\t\t\t\tif ($.isArray(res)) {\n\t\t\t\t\t\t\tevents = res;\n\t\t\t\t\t\t}\n\t\t\t\t\t\tcallback(events);\n\t\t\t\t\t},\n\t\t\t\t\terror: function() {\n\t\t\t\t\t\tapplyAll(error, this, arguments);\n\t\t\t\t\t\tcallback();\n\t\t\t\t\t},\n\t\t\t\t\tcomplete: function() {\n\t\t\t\t\t\tapplyAll(complete, this, arguments);\n\t\t\t\t\t\tpopLoading();\n\t\t\t\t\t}\n\t\t\t\t}));\n\t\t\t}else{\n\t\t\t\tcallback();\n\t\t\t}\n\t\t}\n\t}\n\t\n\t\n\t\n\t/* Sources\n\t-----------------------------------------------------------------------------*/\n\t\n\n\tfunction addEventSource(sourceInput) {\n\t\tvar source = buildEventSource(sourceInput);\n\t\tif (source) {\n\t\t\tsources.push(source);\n\t\t\tpendingSourceCnt++;\n\t\t\tfetchEventSource(source, currentFetchID); // will eventually call reportEvents\n\t\t}\n\t}\n\n\n\tfunction buildEventSource(sourceInput) { // will return undefined if invalid source\n\t\tvar normalizers = fc.sourceNormalizers;\n\t\tvar source;\n\t\tvar i;\n\n\t\tif ($.isFunction(sourceInput) || $.isArray(sourceInput)) {\n\t\t\tsource = { events: sourceInput };\n\t\t}\n\t\telse if (typeof sourceInput === 'string') {\n\t\t\tsource = { url: sourceInput };\n\t\t}\n\t\telse if (typeof sourceInput === 'object') {\n\t\t\tsource = $.extend({}, sourceInput); // shallow copy\n\t\t}\n\n\t\tif (source) {\n\n\t\t\t// TODO: repeat code, same code for event classNames\n\t\t\tif (source.className) {\n\t\t\t\tif (typeof source.className === 'string') {\n\t\t\t\t\tsource.className = source.className.split(/\\s+/);\n\t\t\t\t}\n\t\t\t\t// otherwise, assumed to be an array\n\t\t\t}\n\t\t\telse {\n\t\t\t\tsource.className = [];\n\t\t\t}\n\n\t\t\t// for array sources, we convert to standard Event Objects up front\n\t\t\tif ($.isArray(source.events)) {\n\t\t\t\tsource.origArray = source.events; // for removeEventSource\n\t\t\t\tsource.events = $.map(source.events, function(eventInput) {\n\t\t\t\t\treturn buildEventFromInput(eventInput, source);\n\t\t\t\t});\n\t\t\t}\n\n\t\t\tfor (i=0; i<normalizers.length; i++) {\n\t\t\t\tnormalizers[i].call(t, source);\n\t\t\t}\n\n\t\t\treturn source;\n\t\t}\n\t}\n\n\n\tfunction removeEventSource(source) {\n\t\tsources = $.grep(sources, function(src) {\n\t\t\treturn !isSourcesEqual(src, source);\n\t\t});\n\t\t// remove all client events from that source\n\t\tcache = $.grep(cache, function(e) {\n\t\t\treturn !isSourcesEqual(e.source, source);\n\t\t});\n\t\treportEvents(cache);\n\t}\n\n\n\tfunction isSourcesEqual(source1, source2) {\n\t\treturn source1 && source2 && getSourcePrimitive(source1) == getSourcePrimitive(source2);\n\t}\n\n\n\tfunction getSourcePrimitive(source) {\n\t\treturn (\n\t\t\t(typeof source === 'object') ? // a normalized event source?\n\t\t\t\t(source.origArray || source.googleCalendarId || source.url || source.events) : // get the primitive\n\t\t\t\tnull\n\t\t) ||\n\t\tsource; // the given argument *is* the primitive\n\t}\n\t\n\t\n\t\n\t/* Manipulation\n\t-----------------------------------------------------------------------------*/\n\n\n\t// Only ever called from the externally-facing API\n\tfunction updateEvent(event) {\n\n\t\t// massage start/end values, even if date string values\n\t\tevent.start = t.moment(event.start);\n\t\tif (event.end) {\n\t\t\tevent.end = t.moment(event.end);\n\t\t}\n\t\telse {\n\t\t\tevent.end = null;\n\t\t}\n\n\t\tmutateEvent(event, getMiscEventProps(event)); // will handle start/end/allDay normalization\n\t\treportEvents(cache); // reports event modifications (so we can redraw)\n\t}\n\n\n\t// Returns a hash of misc event properties that should be copied over to related events.\n\tfunction getMiscEventProps(event) {\n\t\tvar props = {};\n\n\t\t$.each(event, function(name, val) {\n\t\t\tif (isMiscEventPropName(name)) {\n\t\t\t\tif (val !== undefined && isAtomic(val)) { // a defined non-object\n\t\t\t\t\tprops[name] = val;\n\t\t\t\t}\n\t\t\t}\n\t\t});\n\n\t\treturn props;\n\t}\n\n\t// non-date-related, non-id-related, non-secret\n\tfunction isMiscEventPropName(name) {\n\t\treturn !/^_|^(id|allDay|start|end)$/.test(name);\n\t}\n\n\t\n\t// returns the expanded events that were created\n\tfunction renderEvent(eventInput, stick) {\n\t\tvar abstractEvent = buildEventFromInput(eventInput);\n\t\tvar events;\n\t\tvar i, event;\n\n\t\tif (abstractEvent) { // not false (a valid input)\n\t\t\tevents = expandEvent(abstractEvent);\n\n\t\t\tfor (i = 0; i < events.length; i++) {\n\t\t\t\tevent = events[i];\n\n\t\t\t\tif (!event.source) {\n\t\t\t\t\tif (stick) {\n\t\t\t\t\t\tstickySource.events.push(event);\n\t\t\t\t\t\tevent.source = stickySource;\n\t\t\t\t\t}\n\t\t\t\t\tcache.push(event);\n\t\t\t\t}\n\t\t\t}\n\n\t\t\treportEvents(cache);\n\n\t\t\treturn events;\n\t\t}\n\n\t\treturn [];\n\t}\n\t\n\t\n\tfunction removeEvents(filter) {\n\t\tvar eventID;\n\t\tvar i;\n\n\t\tif (filter == null) { // null or undefined. remove all events\n\t\t\tfilter = function() { return true; }; // will always match\n\t\t}\n\t\telse if (!$.isFunction(filter)) { // an event ID\n\t\t\teventID = filter + '';\n\t\t\tfilter = function(event) {\n\t\t\t\treturn event._id == eventID;\n\t\t\t};\n\t\t}\n\n\t\t// Purge event(s) from our local cache\n\t\tcache = $.grep(cache, filter, true); // inverse=true\n\n\t\t// Remove events from array sources.\n\t\t// This works because they have been converted to official Event Objects up front.\n\t\t// (and as a result, event._id has been calculated).\n\t\tfor (i=0; i<sources.length; i++) {\n\t\t\tif ($.isArray(sources[i].events)) {\n\t\t\t\tsources[i].events = $.grep(sources[i].events, filter, true);\n\t\t\t}\n\t\t}\n\n\t\treportEvents(cache);\n\t}\n\t\n\t\n\tfunction clientEvents(filter) {\n\t\tif ($.isFunction(filter)) {\n\t\t\treturn $.grep(cache, filter);\n\t\t}\n\t\telse if (filter != null) { // not null, not undefined. an event ID\n\t\t\tfilter += '';\n\t\t\treturn $.grep(cache, function(e) {\n\t\t\t\treturn e._id == filter;\n\t\t\t});\n\t\t}\n\t\treturn cache; // else, return all\n\t}\n\t\n\t\n\t\n\t/* Loading State\n\t-----------------------------------------------------------------------------*/\n\t\n\t\n\tfunction pushLoading() {\n\t\tif (!(loadingLevel++)) {\n\t\t\ttrigger('loading', null, true, getView());\n\t\t}\n\t}\n\t\n\t\n\tfunction popLoading() {\n\t\tif (!(--loadingLevel)) {\n\t\t\ttrigger('loading', null, false, getView());\n\t\t}\n\t}\n\t\n\t\n\t\n\t/* Event Normalization\n\t-----------------------------------------------------------------------------*/\n\n\n\t// Given a raw object with key/value properties, returns an \"abstract\" Event object.\n\t// An \"abstract\" event is an event that, if recurring, will not have been expanded yet.\n\t// Will return `false` when input is invalid.\n\t// `source` is optional\n\tfunction buildEventFromInput(input, source) {\n\t\tvar out = {};\n\t\tvar start, end;\n\t\tvar allDay;\n\n\t\tif (options.eventDataTransform) {\n\t\t\tinput = options.eventDataTransform(input);\n\t\t}\n\t\tif (source && source.eventDataTransform) {\n\t\t\tinput = source.eventDataTransform(input);\n\t\t}\n\n\t\t// Copy all properties over to the resulting object.\n\t\t// The special-case properties will be copied over afterwards.\n\t\t$.extend(out, input);\n\n\t\tif (source) {\n\t\t\tout.source = source;\n\t\t}\n\n\t\tout._id = input._id || (input.id === undefined ? '_fc' + eventGUID++ : input.id + '');\n\n\t\tif (input.className) {\n\t\t\tif (typeof input.className == 'string') {\n\t\t\t\tout.className = input.className.split(/\\s+/);\n\t\t\t}\n\t\t\telse { // assumed to be an array\n\t\t\t\tout.className = input.className;\n\t\t\t}\n\t\t}\n\t\telse {\n\t\t\tout.className = [];\n\t\t}\n\n\t\tstart = input.start || input.date; // \"date\" is an alias for \"start\"\n\t\tend = input.end;\n\n\t\t// parse as a time (Duration) if applicable\n\t\tif (isTimeString(start)) {\n\t\t\tstart = moment.duration(start);\n\t\t}\n\t\tif (isTimeString(end)) {\n\t\t\tend = moment.duration(end);\n\t\t}\n\n\t\tif (input.dow || moment.isDuration(start) || moment.isDuration(end)) {\n\n\t\t\t// the event is \"abstract\" (recurring) so don't calculate exact start/end dates just yet\n\t\t\tout.start = start ? moment.duration(start) : null; // will be a Duration or null\n\t\t\tout.end = end ? moment.duration(end) : null; // will be a Duration or null\n\t\t\tout._recurring = true; // our internal marker\n\t\t}\n\t\telse {\n\n\t\t\tif (start) {\n\t\t\t\tstart = t.moment(start);\n\t\t\t\tif (!start.isValid()) {\n\t\t\t\t\treturn false;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tif (end) {\n\t\t\t\tend = t.moment(end);\n\t\t\t\tif (!end.isValid()) {\n\t\t\t\t\tend = null; // let defaults take over\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tallDay = input.allDay;\n\t\t\tif (allDay === undefined) { // still undefined? fallback to default\n\t\t\t\tallDay = firstDefined(\n\t\t\t\t\tsource ? source.allDayDefault : undefined,\n\t\t\t\t\toptions.allDayDefault\n\t\t\t\t);\n\t\t\t\t// still undefined? normalizeEventRange will calculate it\n\t\t\t}\n\n\t\t\tassignDatesToEvent(start, end, allDay, out);\n\t\t}\n\n\t\treturn out;\n\t}\n\n\n\t// Normalizes and assigns the given dates to the given partially-formed event object.\n\t// NOTE: mutates the given start/end moments. does not make a copy.\n\tfunction assignDatesToEvent(start, end, allDay, event) {\n\t\tevent.start = start;\n\t\tevent.end = end;\n\t\tevent.allDay = allDay;\n\t\tnormalizeEventRange(event);\n\t\tbackupEventDates(event);\n\t}\n\n\n\t// Ensures proper values for allDay/start/end. Accepts an Event object, or a plain object with event-ish properties.\n\t// NOTE: Will modify the given object.\n\tfunction normalizeEventRange(props) {\n\n\t\tnormalizeEventRangeTimes(props);\n\n\t\tif (props.end && !props.end.isAfter(props.start)) {\n\t\t\tprops.end = null;\n\t\t}\n\n\t\tif (!props.end) {\n\t\t\tif (options.forceEventDuration) {\n\t\t\t\tprops.end = t.getDefaultEventEnd(props.allDay, props.start);\n\t\t\t}\n\t\t\telse {\n\t\t\t\tprops.end = null;\n\t\t\t}\n\t\t}\n\t}\n\n\n\t// Ensures the allDay property exists and the timeliness of the start/end dates are consistent\n\tfunction normalizeEventRangeTimes(range) {\n\t\tif (range.allDay == null) {\n\t\t\trange.allDay = !(range.start.hasTime() || (range.end && range.end.hasTime()));\n\t\t}\n\n\t\tif (range.allDay) {\n\t\t\trange.start.stripTime();\n\t\t\tif (range.end) {\n\t\t\t\t// TODO: consider nextDayThreshold here? If so, will require a lot of testing and adjustment\n\t\t\t\trange.end.stripTime();\n\t\t\t}\n\t\t}\n\t\telse {\n\t\t\tif (!range.start.hasTime()) {\n\t\t\t\trange.start = t.rezoneDate(range.start); // will assign a 00:00 time\n\t\t\t}\n\t\t\tif (range.end && !range.end.hasTime()) {\n\t\t\t\trange.end = t.rezoneDate(range.end); // will assign a 00:00 time\n\t\t\t}\n\t\t}\n\t}\n\n\n\t// If `range` is a proper range with a start and end, returns the original object.\n\t// If missing an end, computes a new range with an end, computing it as if it were an event.\n\t// TODO: make this a part of the event -> eventRange system\n\tfunction ensureVisibleEventRange(range) {\n\t\tvar allDay;\n\n\t\tif (!range.end) {\n\n\t\t\tallDay = range.allDay; // range might be more event-ish than we think\n\t\t\tif (allDay == null) {\n\t\t\t\tallDay = !range.start.hasTime();\n\t\t\t}\n\n\t\t\trange = $.extend({}, range); // make a copy, copying over other misc properties\n\t\t\trange.end = t.getDefaultEventEnd(allDay, range.start);\n\t\t}\n\t\treturn range;\n\t}\n\n\n\t// If the given event is a recurring event, break it down into an array of individual instances.\n\t// If not a recurring event, return an array with the single original event.\n\t// If given a falsy input (probably because of a failed buildEventFromInput call), returns an empty array.\n\t// HACK: can override the recurring window by providing custom rangeStart/rangeEnd (for businessHours).\n\tfunction expandEvent(abstractEvent, _rangeStart, _rangeEnd) {\n\t\tvar events = [];\n\t\tvar dowHash;\n\t\tvar dow;\n\t\tvar i;\n\t\tvar date;\n\t\tvar startTime, endTime;\n\t\tvar start, end;\n\t\tvar event;\n\n\t\t_rangeStart = _rangeStart || rangeStart;\n\t\t_rangeEnd = _rangeEnd || rangeEnd;\n\n\t\tif (abstractEvent) {\n\t\t\tif (abstractEvent._recurring) {\n\n\t\t\t\t// make a boolean hash as to whether the event occurs on each day-of-week\n\t\t\t\tif ((dow = abstractEvent.dow)) {\n\t\t\t\t\tdowHash = {};\n\t\t\t\t\tfor (i = 0; i < dow.length; i++) {\n\t\t\t\t\t\tdowHash[dow[i]] = true;\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\t// iterate through every day in the current range\n\t\t\t\tdate = _rangeStart.clone().stripTime(); // holds the date of the current day\n\t\t\t\twhile (date.isBefore(_rangeEnd)) {\n\n\t\t\t\t\tif (!dowHash || dowHash[date.day()]) { // if everyday, or this particular day-of-week\n\n\t\t\t\t\t\tstartTime = abstractEvent.start; // the stored start and end properties are times (Durations)\n\t\t\t\t\t\tendTime = abstractEvent.end; // \"\n\t\t\t\t\t\tstart = date.clone();\n\t\t\t\t\t\tend = null;\n\n\t\t\t\t\t\tif (startTime) {\n\t\t\t\t\t\t\tstart = start.time(startTime);\n\t\t\t\t\t\t}\n\t\t\t\t\t\tif (endTime) {\n\t\t\t\t\t\t\tend = date.clone().time(endTime);\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tevent = $.extend({}, abstractEvent); // make a copy of the original\n\t\t\t\t\t\tassignDatesToEvent(\n\t\t\t\t\t\t\tstart, end,\n\t\t\t\t\t\t\t!startTime && !endTime, // allDay?\n\t\t\t\t\t\t\tevent\n\t\t\t\t\t\t);\n\t\t\t\t\t\tevents.push(event);\n\t\t\t\t\t}\n\n\t\t\t\t\tdate.add(1, 'days');\n\t\t\t\t}\n\t\t\t}\n\t\t\telse {\n\t\t\t\tevents.push(abstractEvent); // return the original event. will be a one-item array\n\t\t\t}\n\t\t}\n\n\t\treturn events;\n\t}\n\n\n\n\t/* Event Modification Math\n\t-----------------------------------------------------------------------------------------*/\n\n\n\t// Modifies an event and all related events by applying the given properties.\n\t// Special date-diffing logic is used for manipulation of dates.\n\t// If `props` does not contain start/end dates, the updated values are assumed to be the event's current start/end.\n\t// All date comparisons are done against the event's pristine _start and _end dates.\n\t// Returns an object with delta information and a function to undo all operations.\n\t// For making computations in a granularity greater than day/time, specify largeUnit.\n\t// NOTE: The given `newProps` might be mutated for normalization purposes.\n\tfunction mutateEvent(event, newProps, largeUnit) {\n\t\tvar miscProps = {};\n\t\tvar oldProps;\n\t\tvar clearEnd;\n\t\tvar startDelta;\n\t\tvar endDelta;\n\t\tvar durationDelta;\n\t\tvar undoFunc;\n\n\t\t// diffs the dates in the appropriate way, returning a duration\n\t\tfunction diffDates(date1, date0) { // date1 - date0\n\t\t\tif (largeUnit) {\n\t\t\t\treturn diffByUnit(date1, date0, largeUnit);\n\t\t\t}\n\t\t\telse if (newProps.allDay) {\n\t\t\t\treturn diffDay(date1, date0);\n\t\t\t}\n\t\t\telse {\n\t\t\t\treturn diffDayTime(date1, date0);\n\t\t\t}\n\t\t}\n\n\t\tnewProps = newProps || {};\n\n\t\t// normalize new date-related properties\n\t\tif (!newProps.start) {\n\t\t\tnewProps.start = event.start.clone();\n\t\t}\n\t\tif (newProps.end === undefined) {\n\t\t\tnewProps.end = event.end ? event.end.clone() : null;\n\t\t}\n\t\tif (newProps.allDay == null) { // is null or undefined?\n\t\t\tnewProps.allDay = event.allDay;\n\t\t}\n\t\tnormalizeEventRange(newProps);\n\n\t\t// create normalized versions of the original props to compare against\n\t\t// need a real end value, for diffing\n\t\toldProps = {\n\t\t\tstart: event._start.clone(),\n\t\t\tend: event._end ? event._end.clone() : t.getDefaultEventEnd(event._allDay, event._start),\n\t\t\tallDay: newProps.allDay // normalize the dates in the same regard as the new properties\n\t\t};\n\t\tnormalizeEventRange(oldProps);\n\n\t\t// need to clear the end date if explicitly changed to null\n\t\tclearEnd = event._end !== null && newProps.end === null;\n\n\t\t// compute the delta for moving the start date\n\t\tstartDelta = diffDates(newProps.start, oldProps.start);\n\n\t\t// compute the delta for moving the end date\n\t\tif (newProps.end) {\n\t\t\tendDelta = diffDates(newProps.end, oldProps.end);\n\t\t\tdurationDelta = endDelta.subtract(startDelta);\n\t\t}\n\t\telse {\n\t\t\tdurationDelta = null;\n\t\t}\n\n\t\t// gather all non-date-related properties\n\t\t$.each(newProps, function(name, val) {\n\t\t\tif (isMiscEventPropName(name)) {\n\t\t\t\tif (val !== undefined) {\n\t\t\t\t\tmiscProps[name] = val;\n\t\t\t\t}\n\t\t\t}\n\t\t});\n\n\t\t// apply the operations to the event and all related events\n\t\tundoFunc = mutateEvents(\n\t\t\tclientEvents(event._id), // get events with this ID\n\t\t\tclearEnd,\n\t\t\tnewProps.allDay,\n\t\t\tstartDelta,\n\t\t\tdurationDelta,\n\t\t\tmiscProps\n\t\t);\n\n\t\treturn {\n\t\t\tdateDelta: startDelta,\n\t\t\tdurationDelta: durationDelta,\n\t\t\tundo: undoFunc\n\t\t};\n\t}\n\n\n\t// Modifies an array of events in the following ways (operations are in order):\n\t// - clear the event's `end`\n\t// - convert the event to allDay\n\t// - add `dateDelta` to the start and end\n\t// - add `durationDelta` to the event's duration\n\t// - assign `miscProps` to the event\n\t//\n\t// Returns a function that can be called to undo all the operations.\n\t//\n\t// TODO: don't use so many closures. possible memory issues when lots of events with same ID.\n\t//\n\tfunction mutateEvents(events, clearEnd, allDay, dateDelta, durationDelta, miscProps) {\n\t\tvar isAmbigTimezone = t.getIsAmbigTimezone();\n\t\tvar undoFunctions = [];\n\n\t\t// normalize zero-length deltas to be null\n\t\tif (dateDelta && !dateDelta.valueOf()) { dateDelta = null; }\n\t\tif (durationDelta && !durationDelta.valueOf()) { durationDelta = null; }\n\n\t\t$.each(events, function(i, event) {\n\t\t\tvar oldProps;\n\t\t\tvar newProps;\n\n\t\t\t// build an object holding all the old values, both date-related and misc.\n\t\t\t// for the undo function.\n\t\t\toldProps = {\n\t\t\t\tstart: event.start.clone(),\n\t\t\t\tend: event.end ? event.end.clone() : null,\n\t\t\t\tallDay: event.allDay\n\t\t\t};\n\t\t\t$.each(miscProps, function(name) {\n\t\t\t\toldProps[name] = event[name];\n\t\t\t});\n\n\t\t\t// new date-related properties. work off the original date snapshot.\n\t\t\t// ok to use references because they will be thrown away when backupEventDates is called.\n\t\t\tnewProps = {\n\t\t\t\tstart: event._start,\n\t\t\t\tend: event._end,\n\t\t\t\tallDay: allDay // normalize the dates in the same regard as the new properties\n\t\t\t};\n\t\t\tnormalizeEventRange(newProps); // massages start/end/allDay\n\n\t\t\t// strip or ensure the end date\n\t\t\tif (clearEnd) {\n\t\t\t\tnewProps.end = null;\n\t\t\t}\n\t\t\telse if (durationDelta && !newProps.end) { // the duration translation requires an end date\n\t\t\t\tnewProps.end = t.getDefaultEventEnd(newProps.allDay, newProps.start);\n\t\t\t}\n\n\t\t\tif (dateDelta) {\n\t\t\t\tnewProps.start.add(dateDelta);\n\t\t\t\tif (newProps.end) {\n\t\t\t\t\tnewProps.end.add(dateDelta);\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tif (durationDelta) {\n\t\t\t\tnewProps.end.add(durationDelta); // end already ensured above\n\t\t\t}\n\n\t\t\t// if the dates have changed, and we know it is impossible to recompute the\n\t\t\t// timezone offsets, strip the zone.\n\t\t\tif (\n\t\t\t\tisAmbigTimezone &&\n\t\t\t\t!newProps.allDay &&\n\t\t\t\t(dateDelta || durationDelta)\n\t\t\t) {\n\t\t\t\tnewProps.start.stripZone();\n\t\t\t\tif (newProps.end) {\n\t\t\t\t\tnewProps.end.stripZone();\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t$.extend(event, miscProps, newProps); // copy over misc props, then date-related props\n\t\t\tbackupEventDates(event); // regenerate internal _start/_end/_allDay\n\n\t\t\tundoFunctions.push(function() {\n\t\t\t\t$.extend(event, oldProps);\n\t\t\t\tbackupEventDates(event); // regenerate internal _start/_end/_allDay\n\t\t\t});\n\t\t});\n\n\t\treturn function() {\n\t\t\tfor (var i = 0; i < undoFunctions.length; i++) {\n\t\t\t\tundoFunctions[i]();\n\t\t\t}\n\t\t};\n\t}\n\n\n\t/* Business Hours\n\t-----------------------------------------------------------------------------------------*/\n\n\tt.getBusinessHoursEvents = getBusinessHoursEvents;\n\n\n\t// Returns an array of events as to when the business hours occur in the given view.\n\t// Abuse of our event system :(\n\tfunction getBusinessHoursEvents(wholeDay) {\n\t\tvar optionVal = options.businessHours;\n\t\tvar defaultVal = {\n\t\t\tclassName: 'fc-nonbusiness',\n\t\t\tstart: '09:00',\n\t\t\tend: '17:00',\n\t\t\tdow: [ 1, 2, 3, 4, 5 ], // monday - friday\n\t\t\trendering: 'inverse-background'\n\t\t};\n\t\tvar view = t.getView();\n\t\tvar eventInput;\n\n\t\tif (optionVal) { // `true` (which means \"use the defaults\") or an override object\n\t\t\teventInput = $.extend(\n\t\t\t\t{}, // copy to a new object in either case\n\t\t\t\tdefaultVal,\n\t\t\t\ttypeof optionVal === 'object' ? optionVal : {} // override the defaults\n\t\t\t);\n\t\t}\n\n\t\tif (eventInput) {\n\n\t\t\t// if a whole-day series is requested, clear the start/end times\n\t\t\tif (wholeDay) {\n\t\t\t\teventInput.start = null;\n\t\t\t\teventInput.end = null;\n\t\t\t}\n\n\t\t\treturn expandEvent(\n\t\t\t\tbuildEventFromInput(eventInput),\n\t\t\t\tview.start,\n\t\t\t\tview.end\n\t\t\t);\n\t\t}\n\n\t\treturn [];\n\t}\n\n\n\t/* Overlapping / Constraining\n\t-----------------------------------------------------------------------------------------*/\n\n\tt.isEventRangeAllowed = isEventRangeAllowed;\n\tt.isSelectionRangeAllowed = isSelectionRangeAllowed;\n\tt.isExternalDropRangeAllowed = isExternalDropRangeAllowed;\n\n\n\tfunction isEventRangeAllowed(range, event) {\n\t\tvar source = event.source || {};\n\t\tvar constraint = firstDefined(\n\t\t\tevent.constraint,\n\t\t\tsource.constraint,\n\t\t\toptions.eventConstraint\n\t\t);\n\t\tvar overlap = firstDefined(\n\t\t\tevent.overlap,\n\t\t\tsource.overlap,\n\t\t\toptions.eventOverlap\n\t\t);\n\n\t\trange = ensureVisibleEventRange(range); // ensure a proper range with an end for isRangeAllowed\n\n\t\treturn isRangeAllowed(range, constraint, overlap, event);\n\t}\n\n\n\tfunction isSelectionRangeAllowed(range) {\n\t\treturn isRangeAllowed(range, options.selectConstraint, options.selectOverlap);\n\t}\n\n\n\t// when `eventProps` is defined, consider this an event.\n\t// `eventProps` can contain misc non-date-related info about the event.\n\tfunction isExternalDropRangeAllowed(range, eventProps) {\n\t\tvar eventInput;\n\t\tvar event;\n\n\t\t// note: very similar logic is in View's reportExternalDrop\n\t\tif (eventProps) {\n\t\t\teventInput = $.extend({}, eventProps, range);\n\t\t\tevent = expandEvent(buildEventFromInput(eventInput))[0];\n\t\t}\n\n\t\tif (event) {\n\t\t\treturn isEventRangeAllowed(range, event);\n\t\t}\n\t\telse { // treat it as a selection\n\n\t\t\trange = ensureVisibleEventRange(range); // ensure a proper range with an end for isSelectionRangeAllowed\n\n\t\t\treturn isSelectionRangeAllowed(range);\n\t\t}\n\t}\n\n\n\t// Returns true if the given range (caused by an event drop/resize or a selection) is allowed to exist\n\t// according to the constraint/overlap settings.\n\t// `event` is not required if checking a selection.\n\tfunction isRangeAllowed(range, constraint, overlap, event) {\n\t\tvar constraintEvents;\n\t\tvar anyContainment;\n\t\tvar peerEvents;\n\t\tvar i, peerEvent;\n\t\tvar peerOverlap;\n\n\t\t// normalize. fyi, we're normalizing in too many places :(\n\t\trange = $.extend({}, range); // copy all properties in case there are misc non-date properties\n\t\trange.start = range.start.clone().stripZone();\n\t\trange.end = range.end.clone().stripZone();\n\n\t\t// the range must be fully contained by at least one of produced constraint events\n\t\tif (constraint != null) {\n\n\t\t\t// not treated as an event! intermediate data structure\n\t\t\t// TODO: use ranges in the future\n\t\t\tconstraintEvents = constraintToEvents(constraint);\n\n\t\t\tanyContainment = false;\n\t\t\tfor (i = 0; i < constraintEvents.length; i++) {\n\t\t\t\tif (eventContainsRange(constraintEvents[i], range)) {\n\t\t\t\t\tanyContainment = true;\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tif (!anyContainment) {\n\t\t\t\treturn false;\n\t\t\t}\n\t\t}\n\n\t\tpeerEvents = t.getPeerEvents(event, range);\n\n\t\tfor (i = 0; i < peerEvents.length; i++)  {\n\t\t\tpeerEvent = peerEvents[i];\n\n\t\t\t// there needs to be an actual intersection before disallowing anything\n\t\t\tif (eventIntersectsRange(peerEvent, range)) {\n\n\t\t\t\t// evaluate overlap for the given range and short-circuit if necessary\n\t\t\t\tif (overlap === false) {\n\t\t\t\t\treturn false;\n\t\t\t\t}\n\t\t\t\t// if the event's overlap is a test function, pass the peer event in question as the first param\n\t\t\t\telse if (typeof overlap === 'function' && !overlap(peerEvent, event)) {\n\t\t\t\t\treturn false;\n\t\t\t\t}\n\n\t\t\t\t// if we are computing if the given range is allowable for an event, consider the other event's\n\t\t\t\t// EventObject-specific or Source-specific `overlap` property\n\t\t\t\tif (event) {\n\t\t\t\t\tpeerOverlap = firstDefined(\n\t\t\t\t\t\tpeerEvent.overlap,\n\t\t\t\t\t\t(peerEvent.source || {}).overlap\n\t\t\t\t\t\t// we already considered the global `eventOverlap`\n\t\t\t\t\t);\n\t\t\t\t\tif (peerOverlap === false) {\n\t\t\t\t\t\treturn false;\n\t\t\t\t\t}\n\t\t\t\t\t// if the peer event's overlap is a test function, pass the subject event as the first param\n\t\t\t\t\tif (typeof peerOverlap === 'function' && !peerOverlap(event, peerEvent)) {\n\t\t\t\t\t\treturn false;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\treturn true;\n\t}\n\n\n\t// Given an event input from the API, produces an array of event objects. Possible event inputs:\n\t// 'businessHours'\n\t// An event ID (number or string)\n\t// An object with specific start/end dates or a recurring event (like what businessHours accepts)\n\tfunction constraintToEvents(constraintInput) {\n\n\t\tif (constraintInput === 'businessHours') {\n\t\t\treturn getBusinessHoursEvents();\n\t\t}\n\n\t\tif (typeof constraintInput === 'object') {\n\t\t\treturn expandEvent(buildEventFromInput(constraintInput));\n\t\t}\n\n\t\treturn clientEvents(constraintInput); // probably an ID\n\t}\n\n\n\t// Does the event's date range fully contain the given range?\n\t// start/end already assumed to have stripped zones :(\n\tfunction eventContainsRange(event, range) {\n\t\tvar eventStart = event.start.clone().stripZone();\n\t\tvar eventEnd = t.getEventEnd(event).stripZone();\n\n\t\treturn range.start >= eventStart && range.end <= eventEnd;\n\t}\n\n\n\t// Does the event's date range intersect with the given range?\n\t// start/end already assumed to have stripped zones :(\n\tfunction eventIntersectsRange(event, range) {\n\t\tvar eventStart = event.start.clone().stripZone();\n\t\tvar eventEnd = t.getEventEnd(event).stripZone();\n\n\t\treturn range.start < eventEnd && range.end > eventStart;\n\t}\n\n\n\tt.getEventCache = function() {\n\t\treturn cache;\n\t};\n\n}\n\n\n// Returns a list of events that the given event should be compared against when being considered for a move to\n// the specified range. Attached to the Calendar's prototype because EventManager is a mixin for a Calendar.\nCalendar.prototype.getPeerEvents = function(event, range) {\n\tvar cache = this.getEventCache();\n\tvar peerEvents = [];\n\tvar i, otherEvent;\n\n\tfor (i = 0; i < cache.length; i++) {\n\t\totherEvent = cache[i];\n\t\tif (\n\t\t\t!event ||\n\t\t\tevent._id !== otherEvent._id // don't compare the event to itself or other related [repeating] events\n\t\t) {\n\t\t\tpeerEvents.push(otherEvent);\n\t\t}\n\t}\n\n\treturn peerEvents;\n};\n\n\n// updates the \"backup\" properties, which are preserved in order to compute diffs later on.\nfunction backupEventDates(event) {\n\tevent._allDay = event.allDay;\n\tevent._start = event.start.clone();\n\tevent._end = event.end ? event.end.clone() : null;\n}\n\n;;\n\n/* An abstract class for the \"basic\" views, as well as month view. Renders one or more rows of day cells.\n----------------------------------------------------------------------------------------------------------------------*/\n// It is a manager for a DayGrid subcomponent, which does most of the heavy lifting.\n// It is responsible for managing width/height.\n\nvar BasicView = fcViews.basic = View.extend({\n\n\tdayGrid: null, // the main subcomponent that does most of the heavy lifting\n\n\tdayNumbersVisible: false, // display day numbers on each day cell?\n\tweekNumbersVisible: false, // display week numbers along the side?\n\n\tweekNumberWidth: null, // width of all the week-number cells running down the side\n\n\theadRowEl: null, // the fake row element of the day-of-week header\n\n\n\tinitialize: function() {\n\t\tthis.dayGrid = new DayGrid(this);\n\t\tthis.coordMap = this.dayGrid.coordMap; // the view's date-to-cell mapping is identical to the subcomponent's\n\t},\n\n\n\t// Sets the display range and computes all necessary dates\n\tsetRange: function(range) {\n\t\tView.prototype.setRange.call(this, range); // call the super-method\n\n\t\tthis.dayGrid.breakOnWeeks = /year|month|week/.test(this.intervalUnit); // do before setRange\n\t\tthis.dayGrid.setRange(range);\n\t},\n\n\n\t// Compute the value to feed into setRange. Overrides superclass.\n\tcomputeRange: function(date) {\n\t\tvar range = View.prototype.computeRange.call(this, date); // get value from the super-method\n\n\t\t// year and month views should be aligned with weeks. this is already done for week\n\t\tif (/year|month/.test(range.intervalUnit)) {\n\t\t\trange.start.startOf('week');\n\t\t\trange.start = this.skipHiddenDays(range.start);\n\n\t\t\t// make end-of-week if not already\n\t\t\tif (range.end.weekday()) {\n\t\t\t\trange.end.add(1, 'week').startOf('week');\n\t\t\t\trange.end = this.skipHiddenDays(range.end, -1, true); // exclusively move backwards\n\t\t\t}\n\t\t}\n\n\t\treturn range;\n\t},\n\n\n\t// Renders the view into `this.el`, which should already be assigned\n\trender: function() {\n\n\t\tthis.dayNumbersVisible = this.dayGrid.rowCnt > 1; // TODO: make grid responsible\n\t\tthis.weekNumbersVisible = this.opt('weekNumbers');\n\t\tthis.dayGrid.numbersVisible = this.dayNumbersVisible || this.weekNumbersVisible;\n\n\t\tthis.el.addClass('fc-basic-view').html(this.renderHtml());\n\n\t\tthis.headRowEl = this.el.find('thead .fc-row');\n\n\t\tthis.scrollerEl = this.el.find('.fc-day-grid-container');\n\t\tthis.dayGrid.coordMap.containerEl = this.scrollerEl; // constrain clicks/etc to the dimensions of the scroller\n\n\t\tthis.dayGrid.setElement(this.el.find('.fc-day-grid'));\n\t\tthis.dayGrid.renderDates(this.hasRigidRows());\n\t},\n\n\n\t// Unrenders the content of the view. Since we haven't separated skeleton rendering from date rendering,\n\t// always completely kill the dayGrid's rendering.\n\tdestroy: function() {\n\t\tthis.dayGrid.destroyDates();\n\t\tthis.dayGrid.removeElement();\n\t},\n\n\n\trenderBusinessHours: function() {\n\t\tthis.dayGrid.renderBusinessHours();\n\t},\n\n\n\t// Builds the HTML skeleton for the view.\n\t// The day-grid component will render inside of a container defined by this HTML.\n\trenderHtml: function() {\n\t\treturn '' +\n\t\t\t'<table>' +\n\t\t\t\t'<thead class=\"fc-head\">' +\n\t\t\t\t\t'<tr>' +\n\t\t\t\t\t\t'<td class=\"' + this.widgetHeaderClass + '\">' +\n\t\t\t\t\t\t\tthis.dayGrid.headHtml() + // render the day-of-week headers\n\t\t\t\t\t\t'</td>' +\n\t\t\t\t\t'</tr>' +\n\t\t\t\t'</thead>' +\n\t\t\t\t'<tbody class=\"fc-body\">' +\n\t\t\t\t\t'<tr>' +\n\t\t\t\t\t\t'<td class=\"' + this.widgetContentClass + '\">' +\n\t\t\t\t\t\t\t'<div class=\"fc-day-grid-container\">' +\n\t\t\t\t\t\t\t\t'<div class=\"fc-day-grid\"/>' +\n\t\t\t\t\t\t\t'</div>' +\n\t\t\t\t\t\t'</td>' +\n\t\t\t\t\t'</tr>' +\n\t\t\t\t'</tbody>' +\n\t\t\t'</table>';\n\t},\n\n\n\t// Generates the HTML that will go before the day-of week header cells.\n\t// Queried by the DayGrid subcomponent when generating rows. Ordering depends on isRTL.\n\theadIntroHtml: function() {\n\t\tif (this.weekNumbersVisible) {\n\t\t\treturn '' +\n\t\t\t\t'<th class=\"fc-week-number ' + this.widgetHeaderClass + '\" ' + this.weekNumberStyleAttr() + '>' +\n\t\t\t\t\t'<span>' + // needed for matchCellWidths\n\t\t\t\t\t\thtmlEscape(this.opt('weekNumberTitle')) +\n\t\t\t\t\t'</span>' +\n\t\t\t\t'</th>';\n\t\t}\n\t},\n\n\n\t// Generates the HTML that will go before content-skeleton cells that display the day/week numbers.\n\t// Queried by the DayGrid subcomponent. Ordering depends on isRTL.\n\tnumberIntroHtml: function(row) {\n\t\tif (this.weekNumbersVisible) {\n\t\t\treturn '' +\n\t\t\t\t'<td class=\"fc-week-number\" ' + this.weekNumberStyleAttr() + '>' +\n\t\t\t\t\t'<span>' + // needed for matchCellWidths\n\t\t\t\t\t\tthis.dayGrid.getCell(row, 0).start.format('w') +\n\t\t\t\t\t'</span>' +\n\t\t\t\t'</td>';\n\t\t}\n\t},\n\n\n\t// Generates the HTML that goes before the day bg cells for each day-row.\n\t// Queried by the DayGrid subcomponent. Ordering depends on isRTL.\n\tdayIntroHtml: function() {\n\t\tif (this.weekNumbersVisible) {\n\t\t\treturn '<td class=\"fc-week-number ' + this.widgetContentClass + '\" ' +\n\t\t\t\tthis.weekNumberStyleAttr() + '></td>';\n\t\t}\n\t},\n\n\n\t// Generates the HTML that goes before every other type of row generated by DayGrid. Ordering depends on isRTL.\n\t// Affects helper-skeleton and highlight-skeleton rows.\n\tintroHtml: function() {\n\t\tif (this.weekNumbersVisible) {\n\t\t\treturn '<td class=\"fc-week-number\" ' + this.weekNumberStyleAttr() + '></td>';\n\t\t}\n\t},\n\n\n\t// Generates the HTML for the <td>s of the \"number\" row in the DayGrid's content skeleton.\n\t// The number row will only exist if either day numbers or week numbers are turned on.\n\tnumberCellHtml: function(cell) {\n\t\tvar date = cell.start;\n\t\tvar classes;\n\n\t\tif (!this.dayNumbersVisible) { // if there are week numbers but not day numbers\n\t\t\treturn '<td/>'; //  will create an empty space above events :(\n\t\t}\n\n\t\tclasses = this.dayGrid.getDayClasses(date);\n\t\tclasses.unshift('fc-day-number');\n\n\t\treturn '' +\n\t\t\t'<td class=\"' + classes.join(' ') + '\" data-date=\"' + date.format() + '\">' +\n\t\t\t\tdate.date() +\n\t\t\t'</td>';\n\t},\n\n\n\t// Generates an HTML attribute string for setting the width of the week number column, if it is known\n\tweekNumberStyleAttr: function() {\n\t\tif (this.weekNumberWidth !== null) {\n\t\t\treturn 'style=\"width:' + this.weekNumberWidth + 'px\"';\n\t\t}\n\t\treturn '';\n\t},\n\n\n\t// Determines whether each row should have a constant height\n\thasRigidRows: function() {\n\t\tvar eventLimit = this.opt('eventLimit');\n\t\treturn eventLimit && typeof eventLimit !== 'number';\n\t},\n\n\n\t/* Dimensions\n\t------------------------------------------------------------------------------------------------------------------*/\n\n\n\t// Refreshes the horizontal dimensions of the view\n\tupdateWidth: function() {\n\t\tif (this.weekNumbersVisible) {\n\t\t\t// Make sure all week number cells running down the side have the same width.\n\t\t\t// Record the width for cells created later.\n\t\t\tthis.weekNumberWidth = matchCellWidths(\n\t\t\t\tthis.el.find('.fc-week-number')\n\t\t\t);\n\t\t}\n\t},\n\n\n\t// Adjusts the vertical dimensions of the view to the specified values\n\tsetHeight: function(totalHeight, isAuto) {\n\t\tvar eventLimit = this.opt('eventLimit');\n\t\tvar scrollerHeight;\n\n\t\t// reset all heights to be natural\n\t\tunsetScroller(this.scrollerEl);\n\t\tuncompensateScroll(this.headRowEl);\n\n\t\tthis.dayGrid.destroySegPopover(); // kill the \"more\" popover if displayed\n\n\t\t// is the event limit a constant level number?\n\t\tif (eventLimit && typeof eventLimit === 'number') {\n\t\t\tthis.dayGrid.limitRows(eventLimit); // limit the levels first so the height can redistribute after\n\t\t}\n\n\t\tscrollerHeight = this.computeScrollerHeight(totalHeight);\n\t\tthis.setGridHeight(scrollerHeight, isAuto);\n\n\t\t// is the event limit dynamically calculated?\n\t\tif (eventLimit && typeof eventLimit !== 'number') {\n\t\t\tthis.dayGrid.limitRows(eventLimit); // limit the levels after the grid's row heights have been set\n\t\t}\n\n\t\tif (!isAuto && setPotentialScroller(this.scrollerEl, scrollerHeight)) { // using scrollbars?\n\n\t\t\tcompensateScroll(this.headRowEl, getScrollbarWidths(this.scrollerEl));\n\n\t\t\t// doing the scrollbar compensation might have created text overflow which created more height. redo\n\t\t\tscrollerHeight = this.computeScrollerHeight(totalHeight);\n\t\t\tthis.scrollerEl.height(scrollerHeight);\n\t\t}\n\t},\n\n\n\t// Sets the height of just the DayGrid component in this view\n\tsetGridHeight: function(height, isAuto) {\n\t\tif (isAuto) {\n\t\t\tundistributeHeight(this.dayGrid.rowEls); // let the rows be their natural height with no expanding\n\t\t}\n\t\telse {\n\t\t\tdistributeHeight(this.dayGrid.rowEls, height, true); // true = compensate for height-hogging rows\n\t\t}\n\t},\n\n\n\t/* Events\n\t------------------------------------------------------------------------------------------------------------------*/\n\n\n\t// Renders the given events onto the view and populates the segments array\n\trenderEvents: function(events) {\n\t\tthis.dayGrid.renderEvents(events);\n\n\t\tthis.updateHeight(); // must compensate for events that overflow the row\n\t},\n\n\n\t// Retrieves all segment objects that are rendered in the view\n\tgetEventSegs: function() {\n\t\treturn this.dayGrid.getEventSegs();\n\t},\n\n\n\t// Unrenders all event elements and clears internal segment data\n\tdestroyEvents: function() {\n\t\tthis.dayGrid.destroyEvents();\n\n\t\t// we DON'T need to call updateHeight() because:\n\t\t// A) a renderEvents() call always happens after this, which will eventually call updateHeight()\n\t\t// B) in IE8, this causes a flash whenever events are rerendered\n\t},\n\n\n\t/* Dragging (for both events and external elements)\n\t------------------------------------------------------------------------------------------------------------------*/\n\n\n\t// A returned value of `true` signals that a mock \"helper\" event has been rendered.\n\trenderDrag: function(dropLocation, seg) {\n\t\treturn this.dayGrid.renderDrag(dropLocation, seg);\n\t},\n\n\n\tdestroyDrag: function() {\n\t\tthis.dayGrid.destroyDrag();\n\t},\n\n\n\t/* Selection\n\t------------------------------------------------------------------------------------------------------------------*/\n\n\n\t// Renders a visual indication of a selection\n\trenderSelection: function(range) {\n\t\tthis.dayGrid.renderSelection(range);\n\t},\n\n\n\t// Unrenders a visual indications of a selection\n\tdestroySelection: function() {\n\t\tthis.dayGrid.destroySelection();\n\t}\n\n});\n\n;;\n\n/* A month view with day cells running in rows (one-per-week) and columns\n----------------------------------------------------------------------------------------------------------------------*/\n\nvar MonthView = fcViews.month = BasicView.extend({\n\n\t// Produces information about what range to display\n\tcomputeRange: function(date) {\n\t\tvar range = BasicView.prototype.computeRange.call(this, date); // get value from super-method\n\t\tvar rowCnt;\n\n\t\t// ensure 6 weeks\n\t\tif (this.isFixedWeeks()) {\n\t\t\trowCnt = Math.ceil(range.end.diff(range.start, 'weeks', true)); // could be partial weeks due to hiddenDays\n\t\t\trange.end.add(6 - rowCnt, 'weeks');\n\t\t}\n\n\t\treturn range;\n\t},\n\n\n\t// Overrides the default BasicView behavior to have special multi-week auto-height logic\n\tsetGridHeight: function(height, isAuto) {\n\n\t\tisAuto = isAuto || this.opt('weekMode') === 'variable'; // LEGACY: weekMode is deprecated\n\n\t\t// if auto, make the height of each row the height that it would be if there were 6 weeks\n\t\tif (isAuto) {\n\t\t\theight *= this.rowCnt / 6;\n\t\t}\n\n\t\tdistributeHeight(this.dayGrid.rowEls, height, !isAuto); // if auto, don't compensate for height-hogging rows\n\t},\n\n\n\tisFixedWeeks: function() {\n\t\tvar weekMode = this.opt('weekMode'); // LEGACY: weekMode is deprecated\n\t\tif (weekMode) {\n\t\t\treturn weekMode === 'fixed'; // if any other type of weekMode, assume NOT fixed\n\t\t}\n\n\t\treturn this.opt('fixedWeekCount');\n\t}\n\n});\n\nMonthView.duration = { months: 1 }; // important for prev/next\n\nMonthView.defaults = {\n\tfixedWeekCount: true\n};\n;;\n\n/* A week view with simple day cells running horizontally\n----------------------------------------------------------------------------------------------------------------------*/\n\nfcViews.basicWeek = {\n\ttype: 'basic',\n\tduration: { weeks: 1 }\n};\n;;\n\n/* A view with a single simple day cell\n----------------------------------------------------------------------------------------------------------------------*/\n\nfcViews.basicDay = {\n\ttype: 'basic',\n\tduration: { days: 1 }\n};\n;;\n\n/* An abstract class for all agenda-related views. Displays one more columns with time slots running vertically.\n----------------------------------------------------------------------------------------------------------------------*/\n// Is a manager for the TimeGrid subcomponent and possibly the DayGrid subcomponent (if allDaySlot is on).\n// Responsible for managing width/height.\n\nvar AGENDA_DEFAULTS = {\n\tallDaySlot: true,\n\tallDayText: 'all-day',\n\tscrollTime: '06:00:00',\n\tslotDuration: '00:30:00',\n\tminTime: '00:00:00',\n\tmaxTime: '24:00:00',\n\tslotEventOverlap: true // a bad name. confused with overlap/constraint system\n};\n\nvar AGENDA_ALL_DAY_EVENT_LIMIT = 5;\n\nvar AgendaView = fcViews.agenda = View.extend({\n\n\ttimeGrid: null, // the main time-grid subcomponent of this view\n\tdayGrid: null, // the \"all-day\" subcomponent. if all-day is turned off, this will be null\n\n\taxisWidth: null, // the width of the time axis running down the side\n\n\tnoScrollRowEls: null, // set of fake row elements that must compensate when scrollerEl has scrollbars\n\n\t// when the time-grid isn't tall enough to occupy the given height, we render an <hr> underneath\n\tbottomRuleEl: null,\n\tbottomRuleHeight: null,\n\n\n\tinitialize: function() {\n\t\tthis.timeGrid = new TimeGrid(this);\n\n\t\tif (this.opt('allDaySlot')) { // should we display the \"all-day\" area?\n\t\t\tthis.dayGrid = new DayGrid(this); // the all-day subcomponent of this view\n\n\t\t\t// the coordinate grid will be a combination of both subcomponents' grids\n\t\t\tthis.coordMap = new ComboCoordMap([\n\t\t\t\tthis.dayGrid.coordMap,\n\t\t\t\tthis.timeGrid.coordMap\n\t\t\t]);\n\t\t}\n\t\telse {\n\t\t\tthis.coordMap = this.timeGrid.coordMap;\n\t\t}\n\t},\n\n\n\t/* Rendering\n\t------------------------------------------------------------------------------------------------------------------*/\n\n\n\t// Sets the display range and computes all necessary dates\n\tsetRange: function(range) {\n\t\tView.prototype.setRange.call(this, range); // call the super-method\n\n\t\tthis.timeGrid.setRange(range);\n\t\tif (this.dayGrid) {\n\t\t\tthis.dayGrid.setRange(range);\n\t\t}\n\t},\n\n\n\t// Renders the view into `this.el`, which has already been assigned\n\trender: function() {\n\n\t\tthis.el.addClass('fc-agenda-view').html(this.renderHtml());\n\n\t\t// the element that wraps the time-grid that will probably scroll\n\t\tthis.scrollerEl = this.el.find('.fc-time-grid-container');\n\t\tthis.timeGrid.coordMap.containerEl = this.scrollerEl; // don't accept clicks/etc outside of this\n\n\t\tthis.timeGrid.setElement(this.el.find('.fc-time-grid'));\n\t\tthis.timeGrid.renderDates();\n\n\t\t// the <hr> that sometimes displays under the time-grid\n\t\tthis.bottomRuleEl = $('<hr class=\"fc-divider ' + this.widgetHeaderClass + '\"/>')\n\t\t\t.appendTo(this.timeGrid.el); // inject it into the time-grid\n\n\t\tif (this.dayGrid) {\n\t\t\tthis.dayGrid.setElement(this.el.find('.fc-day-grid'));\n\t\t\tthis.dayGrid.renderDates();\n\n\t\t\t// have the day-grid extend it's coordinate area over the <hr> dividing the two grids\n\t\t\tthis.dayGrid.bottomCoordPadding = this.dayGrid.el.next('hr').outerHeight();\n\t\t}\n\n\t\tthis.noScrollRowEls = this.el.find('.fc-row:not(.fc-scroller *)'); // fake rows not within the scroller\n\t},\n\n\n\t// Unrenders the content of the view. Since we haven't separated skeleton rendering from date rendering,\n\t// always completely kill each grid's rendering.\n\tdestroy: function() {\n\t\tthis.timeGrid.destroyDates();\n\t\tthis.timeGrid.removeElement();\n\n\t\tif (this.dayGrid) {\n\t\t\tthis.dayGrid.destroyDates();\n\t\t\tthis.dayGrid.removeElement();\n\t\t}\n\t},\n\n\n\trenderBusinessHours: function() {\n\t\tthis.timeGrid.renderBusinessHours();\n\n\t\tif (this.dayGrid) {\n\t\t\tthis.dayGrid.renderBusinessHours();\n\t\t}\n\t},\n\n\n\t// Builds the HTML skeleton for the view.\n\t// The day-grid and time-grid components will render inside containers defined by this HTML.\n\trenderHtml: function() {\n\t\treturn '' +\n\t\t\t'<table>' +\n\t\t\t\t'<thead class=\"fc-head\">' +\n\t\t\t\t\t'<tr>' +\n\t\t\t\t\t\t'<td class=\"' + this.widgetHeaderClass + '\">' +\n\t\t\t\t\t\t\tthis.timeGrid.headHtml() + // render the day-of-week headers\n\t\t\t\t\t\t'</td>' +\n\t\t\t\t\t'</tr>' +\n\t\t\t\t'</thead>' +\n\t\t\t\t'<tbody class=\"fc-body\">' +\n\t\t\t\t\t'<tr>' +\n\t\t\t\t\t\t'<td class=\"' + this.widgetContentClass + '\">' +\n\t\t\t\t\t\t\t(this.dayGrid ?\n\t\t\t\t\t\t\t\t'<div class=\"fc-day-grid\"/>' +\n\t\t\t\t\t\t\t\t'<hr class=\"fc-divider ' + this.widgetHeaderClass + '\"/>' :\n\t\t\t\t\t\t\t\t''\n\t\t\t\t\t\t\t\t) +\n\t\t\t\t\t\t\t'<div class=\"fc-time-grid-container\">' +\n\t\t\t\t\t\t\t\t'<div class=\"fc-time-grid\"/>' +\n\t\t\t\t\t\t\t'</div>' +\n\t\t\t\t\t\t'</td>' +\n\t\t\t\t\t'</tr>' +\n\t\t\t\t'</tbody>' +\n\t\t\t'</table>';\n\t},\n\n\n\t// Generates the HTML that will go before the day-of week header cells.\n\t// Queried by the TimeGrid subcomponent when generating rows. Ordering depends on isRTL.\n\theadIntroHtml: function() {\n\t\tvar date;\n\t\tvar weekText;\n\n\t\tif (this.opt('weekNumbers')) {\n\t\t\tdate = this.timeGrid.getCell(0).start;\n\t\t\tweekText = date.format(this.opt('smallWeekFormat'));\n\n\t\t\treturn '' +\n\t\t\t\t'<th class=\"fc-axis fc-week-number ' + this.widgetHeaderClass + '\" ' + this.axisStyleAttr() + '>' +\n\t\t\t\t\t'<span>' + // needed for matchCellWidths\n\t\t\t\t\t\thtmlEscape(weekText) +\n\t\t\t\t\t'</span>' +\n\t\t\t\t'</th>';\n\t\t}\n\t\telse {\n\t\t\treturn '<th class=\"fc-axis ' + this.widgetHeaderClass + '\" ' + this.axisStyleAttr() + '></th>';\n\t\t}\n\t},\n\n\n\t// Generates the HTML that goes before the all-day cells.\n\t// Queried by the DayGrid subcomponent when generating rows. Ordering depends on isRTL.\n\tdayIntroHtml: function() {\n\t\treturn '' +\n\t\t\t'<td class=\"fc-axis ' + this.widgetContentClass + '\" ' + this.axisStyleAttr() + '>' +\n\t\t\t\t'<span>' + // needed for matchCellWidths\n\t\t\t\t\t(this.opt('allDayHtml') || htmlEscape(this.opt('allDayText'))) +\n\t\t\t\t'</span>' +\n\t\t\t'</td>';\n\t},\n\n\n\t// Generates the HTML that goes before the bg of the TimeGrid slot area. Long vertical column.\n\tslotBgIntroHtml: function() {\n\t\treturn '<td class=\"fc-axis ' + this.widgetContentClass + '\" ' + this.axisStyleAttr() + '></td>';\n\t},\n\n\n\t// Generates the HTML that goes before all other types of cells.\n\t// Affects content-skeleton, helper-skeleton, highlight-skeleton for both the time-grid and day-grid.\n\t// Queried by the TimeGrid and DayGrid subcomponents when generating rows. Ordering depends on isRTL.\n\tintroHtml: function() {\n\t\treturn '<td class=\"fc-axis\" ' + this.axisStyleAttr() + '></td>';\n\t},\n\n\n\t// Generates an HTML attribute string for setting the width of the axis, if it is known\n\taxisStyleAttr: function() {\n\t\tif (this.axisWidth !== null) {\n\t\t\t return 'style=\"width:' + this.axisWidth + 'px\"';\n\t\t}\n\t\treturn '';\n\t},\n\n\n\t/* Dimensions\n\t------------------------------------------------------------------------------------------------------------------*/\n\n\n\tupdateSize: function(isResize) {\n\t\tthis.timeGrid.updateSize(isResize);\n\n\t\tView.prototype.updateSize.call(this, isResize); // call the super-method\n\t},\n\n\n\t// Refreshes the horizontal dimensions of the view\n\tupdateWidth: function() {\n\t\t// make all axis cells line up, and record the width so newly created axis cells will have it\n\t\tthis.axisWidth = matchCellWidths(this.el.find('.fc-axis'));\n\t},\n\n\n\t// Adjusts the vertical dimensions of the view to the specified values\n\tsetHeight: function(totalHeight, isAuto) {\n\t\tvar eventLimit;\n\t\tvar scrollerHeight;\n\n\t\tif (this.bottomRuleHeight === null) {\n\t\t\t// calculate the height of the rule the very first time\n\t\t\tthis.bottomRuleHeight = this.bottomRuleEl.outerHeight();\n\t\t}\n\t\tthis.bottomRuleEl.hide(); // .show() will be called later if this <hr> is necessary\n\n\t\t// reset all dimensions back to the original state\n\t\tthis.scrollerEl.css('overflow', '');\n\t\tunsetScroller(this.scrollerEl);\n\t\tuncompensateScroll(this.noScrollRowEls);\n\n\t\t// limit number of events in the all-day area\n\t\tif (this.dayGrid) {\n\t\t\tthis.dayGrid.destroySegPopover(); // kill the \"more\" popover if displayed\n\n\t\t\teventLimit = this.opt('eventLimit');\n\t\t\tif (eventLimit && typeof eventLimit !== 'number') {\n\t\t\t\teventLimit = AGENDA_ALL_DAY_EVENT_LIMIT; // make sure \"auto\" goes to a real number\n\t\t\t}\n\t\t\tif (eventLimit) {\n\t\t\t\tthis.dayGrid.limitRows(eventLimit);\n\t\t\t}\n\t\t}\n\n\t\tif (!isAuto) { // should we force dimensions of the scroll container, or let the contents be natural height?\n\n\t\t\tscrollerHeight = this.computeScrollerHeight(totalHeight);\n\t\t\tif (setPotentialScroller(this.scrollerEl, scrollerHeight)) { // using scrollbars?\n\n\t\t\t\t// make the all-day and header rows lines up\n\t\t\t\tcompensateScroll(this.noScrollRowEls, getScrollbarWidths(this.scrollerEl));\n\n\t\t\t\t// the scrollbar compensation might have changed text flow, which might affect height, so recalculate\n\t\t\t\t// and reapply the desired height to the scroller.\n\t\t\t\tscrollerHeight = this.computeScrollerHeight(totalHeight);\n\t\t\t\tthis.scrollerEl.height(scrollerHeight);\n\t\t\t}\n\t\t\telse { // no scrollbars\n\t\t\t\t// still, force a height and display the bottom rule (marks the end of day)\n\t\t\t\tthis.scrollerEl.height(scrollerHeight).css('overflow', 'hidden'); // in case <hr> goes outside\n\t\t\t\tthis.bottomRuleEl.show();\n\t\t\t}\n\t\t}\n\t},\n\n\n\t// Computes the initial pre-configured scroll state prior to allowing the user to change it\n\tcomputeInitialScroll: function() {\n\t\tvar scrollTime = moment.duration(this.opt('scrollTime'));\n\t\tvar top = this.timeGrid.computeTimeTop(scrollTime);\n\n\t\t// zoom can give weird floating-point values. rather scroll a little bit further\n\t\ttop = Math.ceil(top);\n\n\t\tif (top) {\n\t\t\ttop++; // to overcome top border that slots beyond the first have. looks better\n\t\t}\n\n\t\treturn top;\n\t},\n\n\n\t/* Events\n\t------------------------------------------------------------------------------------------------------------------*/\n\n\n\t// Renders events onto the view and populates the View's segment array\n\trenderEvents: function(events) {\n\t\tvar dayEvents = [];\n\t\tvar timedEvents = [];\n\t\tvar daySegs = [];\n\t\tvar timedSegs;\n\t\tvar i;\n\n\t\t// separate the events into all-day and timed\n\t\tfor (i = 0; i < events.length; i++) {\n\t\t\tif (events[i].allDay) {\n\t\t\t\tdayEvents.push(events[i]);\n\t\t\t}\n\t\t\telse {\n\t\t\t\ttimedEvents.push(events[i]);\n\t\t\t}\n\t\t}\n\n\t\t// render the events in the subcomponents\n\t\ttimedSegs = this.timeGrid.renderEvents(timedEvents);\n\t\tif (this.dayGrid) {\n\t\t\tdaySegs = this.dayGrid.renderEvents(dayEvents);\n\t\t}\n\n\t\t// the all-day area is flexible and might have a lot of events, so shift the height\n\t\tthis.updateHeight();\n\t},\n\n\n\t// Retrieves all segment objects that are rendered in the view\n\tgetEventSegs: function() {\n\t\treturn this.timeGrid.getEventSegs().concat(\n\t\t\tthis.dayGrid ? this.dayGrid.getEventSegs() : []\n\t\t);\n\t},\n\n\n\t// Unrenders all event elements and clears internal segment data\n\tdestroyEvents: function() {\n\n\t\t// destroy the events in the subcomponents\n\t\tthis.timeGrid.destroyEvents();\n\t\tif (this.dayGrid) {\n\t\t\tthis.dayGrid.destroyEvents();\n\t\t}\n\n\t\t// we DON'T need to call updateHeight() because:\n\t\t// A) a renderEvents() call always happens after this, which will eventually call updateHeight()\n\t\t// B) in IE8, this causes a flash whenever events are rerendered\n\t},\n\n\n\t/* Dragging (for events and external elements)\n\t------------------------------------------------------------------------------------------------------------------*/\n\n\n\t// A returned value of `true` signals that a mock \"helper\" event has been rendered.\n\trenderDrag: function(dropLocation, seg) {\n\t\tif (dropLocation.start.hasTime()) {\n\t\t\treturn this.timeGrid.renderDrag(dropLocation, seg);\n\t\t}\n\t\telse if (this.dayGrid) {\n\t\t\treturn this.dayGrid.renderDrag(dropLocation, seg);\n\t\t}\n\t},\n\n\n\tdestroyDrag: function() {\n\t\tthis.timeGrid.destroyDrag();\n\t\tif (this.dayGrid) {\n\t\t\tthis.dayGrid.destroyDrag();\n\t\t}\n\t},\n\n\n\t/* Selection\n\t------------------------------------------------------------------------------------------------------------------*/\n\n\n\t// Renders a visual indication of a selection\n\trenderSelection: function(range) {\n\t\tif (range.start.hasTime() || range.end.hasTime()) {\n\t\t\tthis.timeGrid.renderSelection(range);\n\t\t}\n\t\telse if (this.dayGrid) {\n\t\t\tthis.dayGrid.renderSelection(range);\n\t\t}\n\t},\n\n\n\t// Unrenders a visual indications of a selection\n\tdestroySelection: function() {\n\t\tthis.timeGrid.destroySelection();\n\t\tif (this.dayGrid) {\n\t\t\tthis.dayGrid.destroySelection();\n\t\t}\n\t}\n\n});\n\nAgendaView.defaults = AGENDA_DEFAULTS;\n\n;;\n\n/* A week view with an all-day cell area at the top, and a time grid below\n----------------------------------------------------------------------------------------------------------------------*/\n\nfcViews.agendaWeek = {\n\ttype: 'agenda',\n\tduration: { weeks: 1 }\n};\n;;\n\n/* A day view with an all-day cell area at the top, and a time grid below\n----------------------------------------------------------------------------------------------------------------------*/\n\nfcViews.agendaDay = {\n\ttype: 'agenda',\n\tduration: { days: 1 }\n};\n;;\n\nreturn fc; // export for Node/CommonJS\n});\n/*\r\n*  AngularJs Fullcalendar Wrapper for the JQuery FullCalendar\r\n*  API @ http://arshaw.com/fullcalendar/\r\n*\r\n*  Angular Calendar Directive that takes in the [eventSources] nested array object as the ng-model and watches it deeply changes.\r\n*       Can also take in multiple event urls as a source object(s) and feed the events per view.\r\n*       The calendar will watch any eventSource array and update itself when a change is made.\r\n*\r\n*/\r\n\r\nangular.module('ui.calendar', [])\r\n  .constant('uiCalendarConfig', {calendars: {}})\r\n  .controller('uiCalendarCtrl', ['$scope', \r\n                                 '$locale', function(\r\n                                  $scope, \r\n                                  $locale){\r\n\r\n      var sources = $scope.eventSources,\r\n          extraEventSignature = $scope.calendarWatchEvent ? $scope.calendarWatchEvent : angular.noop,\r\n\r\n          wrapFunctionWithScopeApply = function(functionToWrap){\r\n              return function(){\r\n                  // This may happen outside of angular context, so create one if outside.\r\n\r\n                  if ($scope.$root.$$phase) {\r\n                      return functionToWrap.apply(this, arguments);\r\n                  } else {\r\n                      var args = arguments;\r\n                      var self = this;\r\n                      return $scope.$root.$apply(function(){\r\n                          return functionToWrap.apply(self, args);\r\n                      });\r\n                  }\r\n              };\r\n          };\r\n\r\n      var eventSerialId = 1;\r\n      // @return {String} fingerprint of the event object and its properties\r\n      this.eventFingerprint = function(e) {\r\n        if (!e._id) {\r\n          e._id = eventSerialId++;\r\n        }\r\n        // This extracts all the information we need from the event. http://jsperf.com/angular-calendar-events-fingerprint/3\r\n        return \"\" + e._id + (e.id || '') + (e.title || '') + (e.url || '') + (+e.start || '') + (+e.end || '') +\r\n          (e.allDay || '') + (e.className || '') + extraEventSignature({event: e}) || '';\r\n      };\r\n\r\n      var sourceSerialId = 1, sourceEventsSerialId = 1;\r\n      // @return {String} fingerprint of the source object and its events array\r\n      this.sourceFingerprint = function(source) {\r\n          var fp = '' + (source.__id || (source.__id = sourceSerialId++)),\r\n              events = angular.isObject(source) && source.events;\r\n          if (events) {\r\n              fp = fp + '-' + (events.__id || (events.__id = sourceEventsSerialId++));\r\n          }\r\n          return fp;\r\n      };\r\n\r\n      // @return {Array} all events from all sources\r\n      this.allEvents = function() {\r\n        // do sources.map(&:events).flatten(), but we don't have flatten\r\n        var arraySources = [];\r\n        for (var i = 0, srcLen = sources.length; i < srcLen; i++) {\r\n          var source = sources[i];\r\n          if (angular.isArray(source)) {\r\n            // event source as array\r\n            arraySources.push(source);\r\n          } else if(angular.isObject(source) && angular.isArray(source.events)){\r\n            // event source as object, ie extended form\r\n            var extEvent = {};\r\n            for(var key in source){\r\n              if(key !== '_id' && key !== 'events'){\r\n                 extEvent[key] = source[key];\r\n              }\r\n            }\r\n            for(var eI = 0;eI < source.events.length;eI++){\r\n              angular.extend(source.events[eI],extEvent);\r\n            }\r\n            arraySources.push(source.events);\r\n          }\r\n        }\r\n        return Array.prototype.concat.apply([], arraySources);\r\n      };\r\n\r\n      // Track changes in array of objects by assigning id tokens to each element and watching the scope for changes in the tokens\r\n      // @param {Array|Function} arraySource array of objects to watch\r\n      // @param tokenFn {Function} that returns the token for a given object\r\n      // @return {Object}\r\n      //  subscribe: function(scope, function(newTokens, oldTokens))\r\n      //    called when source has changed. return false to prevent individual callbacks from firing\r\n      //  onAdded/Removed/Changed:\r\n      //    when set to a callback, called each item where a respective change is detected\r\n      this.changeWatcher = function(arraySource, tokenFn) {\r\n        var self;\r\n        var getTokens = function() {\r\n          var array = angular.isFunction(arraySource) ? arraySource() : arraySource;\r\n          var result = [], token, el;\r\n          for (var i = 0, n = array.length; i < n; i++) {\r\n            el = array[i];\r\n            token = tokenFn(el);\r\n            map[token] = el;\r\n            result.push(token);\r\n          }\r\n          return result;\r\n        };\r\n\r\n        // @param {Array} a\r\n        // @param {Array} b\r\n        // @return {Array} elements in that are in a but not in b\r\n        // @example\r\n        //  subtractAsSets([6, 100, 4, 5], [4, 5, 7]) // [6, 100]\r\n        var subtractAsSets = function(a, b) {\r\n          var result = [], inB = {}, i, n;\r\n          for (i = 0, n = b.length; i < n; i++) {\r\n            inB[b[i]] = true;\r\n          }\r\n          for (i = 0, n = a.length; i < n; i++) {\r\n            if (!inB[a[i]]) {\r\n              result.push(a[i]);\r\n            }\r\n          }\r\n          return result;\r\n        };\r\n\r\n        // Map objects to tokens and vice-versa\r\n        var map = {};\r\n\r\n        // Compare newTokens to oldTokens and call onAdded, onRemoved, and onChanged handlers for each affected event respectively.\r\n        var applyChanges = function(newTokens, oldTokens) {\r\n          var i, n, el, token;\r\n          var replacedTokens = {};\r\n          var removedTokens = subtractAsSets(oldTokens, newTokens);\r\n          for (i = 0, n = removedTokens.length; i < n; i++) {\r\n            var removedToken = removedTokens[i];\r\n            el = map[removedToken];\r\n            delete map[removedToken];\r\n            var newToken = tokenFn(el);\r\n            // if the element wasn't removed but simply got a new token, its old token will be different from the current one\r\n            if (newToken === removedToken) {\r\n              self.onRemoved(el);\r\n            } else {\r\n              replacedTokens[newToken] = removedToken;\r\n              self.onChanged(el);\r\n            }\r\n          }\r\n\r\n          var addedTokens = subtractAsSets(newTokens, oldTokens);\r\n          for (i = 0, n = addedTokens.length; i < n; i++) {\r\n            token = addedTokens[i];\r\n            el = map[token];\r\n            if (!replacedTokens[token]) {\r\n              self.onAdded(el);\r\n            }\r\n          }\r\n        };\r\n        return self = {\r\n          subscribe: function(scope, onArrayChanged) {\r\n            scope.$watch(getTokens, function(newTokens, oldTokens) {\r\n              var notify = !(onArrayChanged && onArrayChanged(newTokens, oldTokens) === false);\r\n              if (notify) {\r\n                applyChanges(newTokens, oldTokens);\r\n              }\r\n            }, true);\r\n          },\r\n          onAdded: angular.noop,\r\n          onChanged: angular.noop,\r\n          onRemoved: angular.noop\r\n        };\r\n      };\r\n\r\n      this.getFullCalendarConfig = function(calendarSettings, uiCalendarConfig){\r\n          var config = {};\r\n\r\n          angular.extend(config, uiCalendarConfig);\r\n          angular.extend(config, calendarSettings);\r\n\r\n          angular.forEach(config, function(value,key){\r\n            if (typeof value === 'function'){\r\n              config[key] = wrapFunctionWithScopeApply(config[key]);\r\n            }\r\n          });\r\n\r\n          return config;\r\n      };\r\n\r\n    this.getLocaleConfig = function(fullCalendarConfig) {\r\n      if (!fullCalendarConfig.lang || fullCalendarConfig.useNgLocale) {\r\n        // Configure to use locale names by default\r\n        var tValues = function(data) {\r\n          // convert {0: \"Jan\", 1: \"Feb\", ...} to [\"Jan\", \"Feb\", ...]\r\n          var r, k;\r\n          r = [];\r\n          for (k in data) {\r\n            r[k] = data[k];\r\n          }\r\n          return r;\r\n        };\r\n        var dtf = $locale.DATETIME_FORMATS;\r\n        return {\r\n          monthNames: tValues(dtf.MONTH),\r\n          monthNamesShort: tValues(dtf.SHORTMONTH),\r\n          dayNames: tValues(dtf.DAY),\r\n          dayNamesShort: tValues(dtf.SHORTDAY)\r\n        };\r\n      }\r\n      return {};\r\n    };\r\n  }])\r\n  .directive('uiCalendar', ['uiCalendarConfig', function(uiCalendarConfig) {\r\n    return {\r\n      restrict: 'A',\r\n      scope: {eventSources:'=ngModel',calendarWatchEvent: '&'},\r\n      controller: 'uiCalendarCtrl',\r\n      link: function(scope, elm, attrs, controller) {\r\n\r\n        var sources = scope.eventSources,\r\n            sourcesChanged = false,\r\n            calendar,\r\n            eventSourcesWatcher = controller.changeWatcher(sources, controller.sourceFingerprint),\r\n            eventsWatcher = controller.changeWatcher(controller.allEvents, controller.eventFingerprint),\r\n            options = null;\r\n\r\n        function getOptions(){\r\n          var calendarSettings = attrs.uiCalendar ? scope.$parent.$eval(attrs.uiCalendar) : {},\r\n              fullCalendarConfig;\r\n\r\n          fullCalendarConfig = controller.getFullCalendarConfig(calendarSettings, uiCalendarConfig);\r\n\r\n          var localeFullCalendarConfig = controller.getLocaleConfig(fullCalendarConfig);\r\n          angular.extend(localeFullCalendarConfig, fullCalendarConfig);\r\n          options = { eventSources: sources };\r\n          angular.extend(options, localeFullCalendarConfig);\r\n          //remove calendars from options\r\n          options.calendars = null;\r\n\r\n          var options2 = {};\r\n          for(var o in options){\r\n            if(o !== 'eventSources'){\r\n              options2[o] = options[o];\r\n            }\r\n          }\r\n          return JSON.stringify(options2);\r\n        }\r\n\r\n        scope.destroy = function(){\r\n          if(calendar && calendar.fullCalendar){\r\n            calendar.fullCalendar('destroy');\r\n          }\r\n          if(attrs.calendar) {\r\n            calendar = uiCalendarConfig.calendars[attrs.calendar] = $(elm).html('');\r\n          } else {\r\n            calendar = $(elm).html('');\r\n          }\r\n        };\r\n\r\n        scope.init = function(){\r\n          calendar.fullCalendar(options);\r\n          if(attrs.calendar) {\r\n            uiCalendarConfig.calendars[attrs.calendar] = calendar;\r\n          }          \r\n        };\r\n\r\n        eventSourcesWatcher.onAdded = function(source) {\r\n          calendar.fullCalendar('addEventSource', source);\r\n          sourcesChanged = true;\r\n        };\r\n\r\n        eventSourcesWatcher.onRemoved = function(source) {\r\n          calendar.fullCalendar('removeEventSource', source);\r\n          sourcesChanged = true;\r\n        };\r\n\r\n        eventSourcesWatcher.onChanged = function(source) {\r\n          calendar.fullCalendar('refetchEvents');\r\n          sourcesChanged = true;\r\n        };\r\n\r\n        eventsWatcher.onAdded = function(event) {\r\n          calendar.fullCalendar('renderEvent', event, (event.stick ? true : false));\r\n        };\r\n\r\n        eventsWatcher.onRemoved = function(event) {\r\n          calendar.fullCalendar('removeEvents', event._id);\r\n        };\r\n\r\n        eventsWatcher.onChanged = function(event) {\r\n          var clientEvents = calendar.fullCalendar('clientEvents', event._id);\r\n          for (var i = 0; i < clientEvents.length; i++) {\r\n            var clientEvent = clientEvents[i];\r\n            clientEvent = angular.extend(clientEvent, event);\r\n            calendar.fullCalendar('updateEvent', clientEvent);\r\n          }\r\n        };\r\n\r\n        eventSourcesWatcher.subscribe(scope);\r\n        eventsWatcher.subscribe(scope, function() {\r\n          if (sourcesChanged === true) {\r\n            sourcesChanged = false;\r\n            // return false to prevent onAdded/Removed/Changed handlers from firing in this case\r\n            return false;\r\n          }\r\n        });\r\n\r\n        scope.$watch(getOptions, function(newO,oldO){\r\n            scope.destroy();\r\n            scope.init();\r\n        });\r\n      }\r\n    };\r\n}]);\r\n\n/**\n * @license Angular UI Tree v2.22.6\n * (c) 2010-2017. https://github.com/angular-ui-tree/angular-ui-tree\n * License: MIT\n */\n(function () {\n  'use strict';\n\n  angular.module('ui.tree', [])\n    .constant('treeConfig', {\n      treeClass: 'angular-ui-tree',\n      emptyTreeClass: 'angular-ui-tree-empty',\n      dropzoneClass: 'angular-ui-tree-dropzone',\n      hiddenClass: 'angular-ui-tree-hidden',\n      nodesClass: 'angular-ui-tree-nodes',\n      nodeClass: 'angular-ui-tree-node',\n      handleClass: 'angular-ui-tree-handle',\n      placeholderClass: 'angular-ui-tree-placeholder',\n      dragClass: 'angular-ui-tree-drag',\n      dragThreshold: 3,\n      defaultCollapsed: false,\n      appendChildOnHover: true\n    });\n\n})();\n\n(function () {\n  'use strict';\n\n  angular.module('ui.tree')\n\n    .controller('TreeHandleController', ['$scope', '$element',\n      function ($scope, $element) {\n        this.scope = $scope;\n\n        $scope.$element = $element;\n        $scope.$nodeScope = null;\n        $scope.$type = 'uiTreeHandle';\n\n      }\n    ]);\n})();\n\n(function () {\n  'use strict';\n\n  angular.module('ui.tree')\n    .controller('TreeNodeController', ['$scope', '$element',\n      function ($scope, $element) {\n        this.scope = $scope;\n\n        $scope.$element = $element;\n        $scope.$modelValue = null; // Model value for node;\n        $scope.$parentNodeScope = null; // uiTreeNode Scope of parent node;\n        $scope.$childNodesScope = null; // uiTreeNodes Scope of child nodes.\n        $scope.$parentNodesScope = null; // uiTreeNodes Scope of parent nodes.\n        $scope.$treeScope = null; // uiTree scope\n        $scope.$handleScope = null; // it's handle scope\n        $scope.$type = 'uiTreeNode';\n        $scope.$$allowNodeDrop = false;\n        $scope.collapsed = false;\n        $scope.expandOnHover = false;\n\n        //Called by uiTreeNode Directive on load.\n        $scope.init = function (controllersArr) {\n          var treeNodesCtrl = controllersArr[0];\n          $scope.$treeScope = controllersArr[1] ? controllersArr[1].scope : null;\n\n          //Find the scope of it's parent node.\n          $scope.$parentNodeScope = treeNodesCtrl.scope.$nodeScope;\n\n          //modelValue for current node.\n          $scope.$modelValue = treeNodesCtrl.scope.$modelValue[$scope.$index];\n          $scope.$parentNodesScope = treeNodesCtrl.scope;\n\n          //Init sub nodes.\n          treeNodesCtrl.scope.initSubNode($scope);\n\n          $element.on('$destroy', function () {\n\n            //Destroy sub nodes.\n            treeNodesCtrl.scope.destroySubNode($scope);\n          });\n        };\n\n        //Return the index of child node in parent node (nodesScope).\n        $scope.index = function () {\n          return $scope.$parentNodesScope.$modelValue.indexOf($scope.$modelValue);\n        };\n\n        $scope.dragEnabled = function () {\n          return !($scope.$treeScope && !$scope.$treeScope.dragEnabled);\n        };\n\n        $scope.isSibling = function (targetNode) {\n          return $scope.$parentNodesScope == targetNode.$parentNodesScope;\n        };\n\n        $scope.isChild = function (targetNode) {\n          var nodes = $scope.childNodes();\n          return nodes && nodes.indexOf(targetNode) > -1;\n        };\n\n        //TODO(jcarter): This method is on uiTreeHelper already.\n        $scope.prev = function () {\n          var index = $scope.index();\n          if (index > 0) {\n            return $scope.siblings()[index - 1];\n          }\n          return null;\n        };\n\n        //Calls childNodes on parent.\n        $scope.siblings = function () {\n          return $scope.$parentNodesScope.childNodes();\n        };\n\n        $scope.childNodesCount = function () {\n          return $scope.childNodes() ? $scope.childNodes().length : 0;\n        };\n\n        $scope.hasChild = function () {\n          return $scope.childNodesCount() > 0;\n        };\n\n        $scope.childNodes = function () {\n          return $scope.$childNodesScope && $scope.$childNodesScope.$modelValue ?\n            $scope.$childNodesScope.childNodes() :\n            null;\n        };\n\n        $scope.accept = function (sourceNode, destIndex) {\n          return $scope.$childNodesScope &&\n            $scope.$childNodesScope.$modelValue &&\n            $scope.$childNodesScope.accept(sourceNode, destIndex);\n        };\n\n        $scope.remove = function () {\n          return $scope.$parentNodesScope.removeNode($scope);\n        };\n\n        $scope.toggle = function () {\n          $scope.collapsed = !$scope.collapsed;\n          $scope.$treeScope.$callbacks.toggle($scope.collapsed, $scope);\n        };\n\n        $scope.collapse = function () {\n          $scope.collapsed = true;\n        };\n\n        $scope.expand = function () {\n          $scope.collapsed = false;\n        };\n\n        $scope.depth = function () {\n          var parentNode = $scope.$parentNodeScope;\n          if (parentNode) {\n            return parentNode.depth() + 1;\n          }\n          return 1;\n        };\n\n        /**\n        * Returns the depth of the deepest subtree under this node\n        * @param scope a TreeNodesController scope object\n        * @returns Depth of all nodes *beneath* this node. If scope belongs to a leaf node, the\n        *   result is 0 (it has no subtree).\n        */\n        function countSubTreeDepth(scope) {\n          if (!scope) {\n            return 0;\n          }\n          var thisLevelDepth = 0,\n              childNodes = scope.childNodes(),\n              childNode,\n              childDepth,\n              i;\n          if (!childNodes || childNodes.length === 0) {\n            return 0;\n          }\n          for (i = childNodes.length - 1; i >= 0 ; i--) {\n            childNode = childNodes[i],\n            childDepth = 1 + countSubTreeDepth(childNode);\n            thisLevelDepth = Math.max(thisLevelDepth, childDepth);\n          }\n          return thisLevelDepth;\n        }\n\n        $scope.maxSubDepth = function () {\n          return $scope.$childNodesScope ? countSubTreeDepth($scope.$childNodesScope) : 0;\n        };\n      }\n    ]);\n})();\n\n(function () {\n  'use strict';\n\n  angular.module('ui.tree')\n\n    .controller('TreeNodesController', ['$scope', '$element', '$timeout',\n      function ($scope, $element, $timeout) {\n        this.scope = $scope;\n\n        $scope.$element = $element;\n        $scope.$modelValue = null;\n        $scope.$nodeScope = null; // the scope of node which the nodes belongs to\n        $scope.$treeScope = null;\n        $scope.$type = 'uiTreeNodes';\n        $scope.$nodesMap = {};\n\n        $scope.nodropEnabled = false;\n        $scope.maxDepth = 0;\n        $scope.cloneEnabled = false;\n\n        $scope.initSubNode = function (subNode) {\n          if (!subNode.$modelValue) {\n            return null;\n          }\n          $scope.$nodesMap[subNode.$modelValue.$$hashKey] = subNode;\n        };\n\n        $scope.destroySubNode = function (subNode) {\n          if (!subNode.$modelValue) {\n            return null;\n          }\n          $scope.$nodesMap[subNode.$modelValue.$$hashKey] = null;\n        };\n\n        $scope.accept = function (sourceNode, destIndex) {\n          return $scope.$treeScope.$callbacks.accept(sourceNode, $scope, destIndex);\n        };\n\n        $scope.beforeDrag = function (sourceNode) {\n          return $scope.$treeScope.$callbacks.beforeDrag(sourceNode);\n        };\n\n        $scope.isParent = function (node) {\n          return node.$parentNodesScope == $scope;\n        };\n\n        $scope.hasChild = function () {\n          return $scope.$modelValue.length > 0;\n        };\n\n        //Called in apply method of UiTreeHelper.dragInfo.\n        $scope.removeNode = function (node) {\n          var index = $scope.$modelValue.indexOf(node.$modelValue);\n          if (index > -1) {\n            $timeout(function () {\n              $scope.$modelValue.splice(index, 1)[0];\n            });\n            return $scope.$treeScope.$callbacks.removed(node);\n          }\n          return null;\n        };\n\n        //Called in apply method of UiTreeHelper.dragInfo.\n        $scope.insertNode = function (index, nodeData) {\n          $timeout(function () {\n            $scope.$modelValue.splice(index, 0, nodeData);\n          });\n        };\n\n        $scope.childNodes = function () {\n          var i, nodes = [];\n          if ($scope.$modelValue) {\n            for (i = 0; i < $scope.$modelValue.length; i++) {\n              nodes.push($scope.$nodesMap[$scope.$modelValue[i].$$hashKey]);\n            }\n          }\n          return nodes;\n        };\n\n        $scope.depth = function () {\n          if ($scope.$nodeScope) {\n            return $scope.$nodeScope.depth();\n          }\n          return 0; // if it has no $nodeScope, it's root\n        };\n\n        // check if depth limit has reached\n        $scope.outOfDepth = function (sourceNode) {\n          var maxDepth = $scope.maxDepth || $scope.$treeScope.maxDepth;\n          if (maxDepth > 0) {\n            return $scope.depth() + sourceNode.maxSubDepth() + 1 > maxDepth;\n          }\n          return false;\n        };\n\n      }\n    ]);\n})();\n\n(function () {\n  'use strict';\n\n  angular.module('ui.tree')\n\n    .controller('TreeController', ['$scope', '$element',\n      function ($scope, $element) {\n        this.scope = $scope;\n\n        $scope.$element = $element;\n        $scope.$nodesScope = null; // root nodes\n        $scope.$type = 'uiTree';\n        $scope.$emptyElm = null;\n        $scope.$dropzoneElm = null;\n        $scope.$callbacks = null;\n\n        $scope.dragEnabled = true;\n        $scope.emptyPlaceholderEnabled = true;\n        $scope.maxDepth = 0;\n        $scope.dragDelay = 0;\n        $scope.cloneEnabled = false;\n        $scope.nodropEnabled = false;\n        $scope.dropzoneEnabled = false;\n\n        // Check if it's a empty tree\n        $scope.isEmpty = function () {\n          return ($scope.$nodesScope && $scope.$nodesScope.$modelValue\n          && $scope.$nodesScope.$modelValue.length === 0);\n        };\n\n        // add placeholder to empty tree\n        $scope.place = function (placeElm) {\n          $scope.$nodesScope.$element.append(placeElm);\n          $scope.$emptyElm.remove();\n        };\n\n        this.resetEmptyElement = function () {\n          if ((!$scope.$nodesScope.$modelValue || $scope.$nodesScope.$modelValue.length === 0) &&\n            $scope.emptyPlaceholderEnabled) {\n            $element.append($scope.$emptyElm);\n          } else {\n            $scope.$emptyElm.remove();\n          }\n        };\n\n        this.resetDropzoneElement = function () {\n          if ((!$scope.$nodesScope.$modelValue || $scope.$nodesScope.$modelValue.length !== 0) &&\n            $scope.dropzoneEnabled) {\n            $element.append($scope.$dropzoneElm);\n          } else {\n            $scope.$dropzoneElm.remove();\n          }\n        };\n\n        $scope.resetEmptyElement = this.resetEmptyElement;\n        $scope.resetDropzoneElement = this.resetDropzoneElement;\n      }\n    ]);\n})();\n\n(function () {\n  'use strict';\n\n  angular.module('ui.tree')\n    .directive('uiTree', ['treeConfig', '$window',\n      function (treeConfig, $window) {\n        return {\n          restrict: 'A',\n          scope: true,\n          controller: 'TreeController',\n          link: function (scope, element, attrs, ctrl) {\n            var callbacks = {\n              accept: null,\n              beforeDrag: null\n            },\n            config = {},\n            tdElm,\n            $trElm,\n            emptyElmColspan;\n\n            //Adding configured class to uiTree.\n            angular.extend(config, treeConfig);\n\n            if (config.treeClass) {\n              element.addClass(config.treeClass);\n            }\n\n            //Determining if uiTree is on a table.\n            if (element.prop('tagName').toLowerCase() === 'table') {\n              scope.$emptyElm = angular.element($window.document.createElement('tr'));\n              $trElm = element.find('tr');\n              \n              //If we can find a tr, then we can use its td children as the empty element colspan.\n              if ($trElm.length > 0) {\n                emptyElmColspan = angular.element($trElm).children().length;\n              } else {\n                \n                //If not, by setting a huge colspan we make sure it takes full width.\n                //TODO(jcarter): Check for negative side effects.\n                emptyElmColspan = 1000000;\n              }\n              tdElm = angular.element($window.document.createElement('td'))\n                .attr('colspan', emptyElmColspan);\n              scope.$emptyElm.append(tdElm);\n            } else {\n              scope.$emptyElm = angular.element($window.document.createElement('div'));\n              scope.$dropzoneElm = angular.element($window.document.createElement('div'));\n            }\n\n            if (config.emptyTreeClass) {\n              scope.$emptyElm.addClass(config.emptyTreeClass);\n            }\n            if (config.dropzoneClass) {\n              scope.$dropzoneElm.addClass(config.dropzoneClass);\n            }\n\n            scope.$watch('$nodesScope.$modelValue.length', function (val) {\n              if (!angular.isNumber(val)) {\n                return;\n              }\n\n              ctrl.resetEmptyElement();\n              ctrl.resetDropzoneElement();\n            }, true);\n\n            scope.$watch(attrs.dragEnabled, function (val) {\n              if ((typeof val) == 'boolean') {\n                scope.dragEnabled = val;\n              }\n            });\n\n            scope.$watch(attrs.emptyPlaceholderEnabled, function (val) {\n              if ((typeof val) == 'boolean') {\n                scope.emptyPlaceholderEnabled = val;\n                ctrl.resetEmptyElement();\n              }\n            });\n\n            scope.$watch(attrs.nodropEnabled, function (val) {\n              if ((typeof val) == 'boolean') {\n                scope.nodropEnabled = val;\n              }\n            });\n\n            scope.$watch(attrs.dropzoneEnabled, function (val) {\n              if ((typeof val) == 'boolean') {\n                scope.dropzoneEnabled = val;\n                ctrl.resetDropzoneElement();\n              }\n            });\n\n            scope.$watch(attrs.cloneEnabled, function (val) {\n              if ((typeof val) == 'boolean') {\n                scope.cloneEnabled = val;\n              }\n            });\n\n            scope.$watch(attrs.maxDepth, function (val) {\n              if ((typeof val) == 'number') {\n                scope.maxDepth = val;\n              }\n            });\n\n            scope.$watch(attrs.dragDelay, function (val) {\n              if ((typeof val) == 'number') {\n                scope.dragDelay = val;\n              }\n            });\n\n            /**\n             * Callback checks if the destination node can accept the dragged node.\n             * By default, ui-tree will check that 'data-nodrop-enabled' is not set for the\n             * destination ui-tree-nodes, and that the 'max-depth' attribute will not be exceeded\n             * if it is set on the ui-tree or ui-tree-nodes.\n             * This callback can be overridden, but callers must manually enforce nodrop and max-depth\n             * themselves if they need those to be enforced.\n             * @param sourceNodeScope Scope of the ui-tree-node being dragged\n             * @param destNodesScope Scope of the ui-tree-nodes where the node is hovering\n             * @param destIndex Index in the destination nodes array where the source node will drop\n             * @returns {boolean} True if the node is permitted to be dropped here\n             */\n            callbacks.accept = function (sourceNodeScope, destNodesScope, destIndex) {\n              return !(destNodesScope.nodropEnabled || destNodesScope.$treeScope.nodropEnabled || destNodesScope.outOfDepth(sourceNodeScope));\n            };\n\n            callbacks.beforeDrag = function (sourceNodeScope) {\n              return true;\n            };\n\n            callbacks.expandTimeoutStart = function()\n            {\n\n            };\n\n            callbacks.expandTimeoutCancel = function()\n            {\n\n            };\n\n            callbacks.expandTimeoutEnd = function()\n            {\n\n            };\n\n            callbacks.removed = function (node) {\n\n            };\n\n            /**\n             * Callback is fired when a node is successfully dropped in a new location\n             * @param event\n             */\n            callbacks.dropped = function (event) {\n\n            };\n\n            /**\n             * Callback is fired each time the user starts dragging a node\n             * @param event\n             */\n            callbacks.dragStart = function (event) {\n\n            };\n\n            /**\n             * Callback is fired each time a dragged node is moved with the mouse/touch.\n             * @param event\n             */\n            callbacks.dragMove = function (event) {\n\n            };\n\n            /**\n             * Callback is fired when the tree exits drag mode. If the user dropped a node, the drop may have been\n             * accepted or reverted.\n             * @param event\n             */\n            callbacks.dragStop = function (event) {\n\n            };\n\n            /**\n             * Callback is fired when a user drops a node (but prior to processing the drop action)\n             * beforeDrop can return a Promise, truthy, or falsy (returning nothing is falsy).\n             * If it returns falsy, or a resolve Promise, the node move is accepted\n             * If it returns truthy, or a rejected Promise, the node move is reverted\n             * @param event\n             * @returns {Boolean|Promise} Truthy (or rejected Promise) to cancel node move; falsy (or resolved promise)\n             */\n            callbacks.beforeDrop = function (event) {\n\n            };\n\n            /**\n             * Callback is fired when a user toggles node (but after processing the toggle action)\n             * @param sourceNodeScope\n             * @param collapsed\n             */\n            callbacks.toggle = function (collapsed, sourceNodeScope) {\n\n            };\n\n            scope.$watch(attrs.uiTree, function (newVal, oldVal) {\n              angular.forEach(newVal, function (value, key) {\n                if (callbacks[key]) {\n                  if (typeof value === 'function') {\n                    callbacks[key] = value;\n                  }\n                }\n              });\n\n              scope.$callbacks = callbacks;\n            }, true);\n\n\n          }\n        };\n      }\n    ]);\n})();\n\n(function () {\n  'use strict';\n\n  angular.module('ui.tree')\n    .directive('uiTreeHandle', ['treeConfig',\n      function (treeConfig) {\n        return {\n          require: '^uiTreeNode',\n          restrict: 'A',\n          scope: true,\n          controller: 'TreeHandleController',\n          link: function (scope, element, attrs, treeNodeCtrl) {\n            var config = {};\n            angular.extend(config, treeConfig);\n            if (config.handleClass) {\n              element.addClass(config.handleClass);\n            }\n            // connect with the tree node.\n            if (scope != treeNodeCtrl.scope) {\n              scope.$nodeScope = treeNodeCtrl.scope;\n              treeNodeCtrl.scope.$handleScope = scope;\n            }\n          }\n        };\n      }\n    ]);\n})();\n\n(function () {\n  'use strict';\n\n  angular.module('ui.tree')\n\n    .directive('uiTreeNode', ['treeConfig', 'UiTreeHelper', '$window', '$document', '$timeout', '$q',\n      function (treeConfig, UiTreeHelper, $window, $document, $timeout, $q) {\n        return {\n          require: ['^uiTreeNodes', '^uiTree'],\n          restrict: 'A',\n          controller: 'TreeNodeController',\n          link: function (scope, element, attrs, controllersArr) {\n            var config = {},\n              hasTouch = 'ontouchstart' in window,\n              firstMoving,\n              dragInfo,\n              pos,\n              placeElm,\n              hiddenPlaceElm,\n              dragElm,\n              scrollContainerElm,\n              unhover,\n              treeScope = null,\n              elements, // As a parameter for callbacks\n              dragDelaying = true,\n              dragStarted = false,\n              dragTimer = null,\n              body = document.body,\n              html = document.documentElement,\n              document_height,\n              document_width,\n              dragStart,\n              tagName,\n              dragMove,\n              dragEnd,\n              dragStartEvent,\n              dragMoveEvent,\n              dragEndEvent,\n              dragCancelEvent,\n              dragDelay,\n              bindDragStartEvents,\n              bindDragMoveEvents,\n              unbindDragMoveEvents,\n              keydownHandler,\n              isHandleChild,\n              el,\n              isUiTreeRoot,\n              treeOfOrigin;\n\n            //Adding configured class to ui-tree-node.\n            angular.extend(config, treeConfig);\n\n            if (config.nodeClass) {\n              element.addClass(config.nodeClass);\n            }\n\n            //Call init function in nodeCtrl, sets parent node and sets up sub nodes.\n            scope.init(controllersArr);\n\n            scope.collapsed = !!UiTreeHelper.getNodeAttribute(scope, 'collapsed') || treeConfig.defaultCollapsed;\n            scope.expandOnHover = !!UiTreeHelper.getNodeAttribute(scope, 'expandOnHover');\n            scope.scrollContainer = UiTreeHelper.getNodeAttribute(scope, 'scrollContainer') || attrs.scrollContainer || null;\n            scope.sourceOnly = scope.nodropEnabled || scope.$treeScope.nodropEnabled;\n\n            scope.$watch(attrs.collapsed, function (val) {\n              if ((typeof val) == 'boolean') {\n                scope.collapsed = val;\n              }\n            });\n\n            //Watches to trigger behavior based on actions and settings.\n            scope.$watch('collapsed', function (val) {\n              UiTreeHelper.setNodeAttribute(scope, 'collapsed', val);\n              attrs.$set('collapsed', val);\n            });\n\n            scope.$watch(attrs.expandOnHover, function(val) {\n              if ((typeof val) === 'boolean' || (typeof val) === 'number') {\n                scope.expandOnHover = val;\n              }\n            });\n\n            scope.$watch('expandOnHover', function (val) {\n              UiTreeHelper.setNodeAttribute(scope, 'expandOnHover', val);\n              attrs.$set('expandOnHover', val);\n            });\n\n            attrs.$observe('scrollContainer', function(val) {\n              if ((typeof val) === 'string') {\n                scope.scrollContainer = val;\n              }\n            });\n\n            scope.$watch('scrollContainer', function(val) {\n              UiTreeHelper.setNodeAttribute(scope, 'scrollContainer', val);\n              attrs.$set('scrollContainer', val);\n              scrollContainerElm = document.querySelector(val);\n            });\n\n            scope.$on('angular-ui-tree:collapse-all', function () {\n              scope.collapsed = true;\n            });\n\n            scope.$on('angular-ui-tree:expand-all', function () {\n              scope.collapsed = false;\n            });\n\n            /**\n             * Called when the user has grabbed a node and started dragging it.\n             *\n             * @param {MouseEvent} e event that is triggered by DOM.\n             * @return undefined?\n             */\n            dragStart = function (e) {\n\n              //Disable right click.\n              if (!hasTouch && (e.button === 2 || e.which === 3)) {\n                return;\n              }\n\n              //Event has already fired in other scope.\n              if (e.uiTreeDragging || (e.originalEvent && e.originalEvent.uiTreeDragging)) {\n                return;\n              }\n\n              //The node being dragged.\n              var eventElm = angular.element(e.target),\n                isHandleChild,\n                cloneElm,\n                eventElmTagName,\n                tagName,\n                eventObj,\n                tdElm,\n                hStyle,\n                isTreeNode,\n                isTreeNodeHandle;\n\n              //If the target element is a child element of a ui-tree-handle,\n              // use the containing handle element as target element.\n              isHandleChild = UiTreeHelper.treeNodeHandlerContainerOfElement(eventElm);\n              if (isHandleChild) {\n                eventElm = angular.element(isHandleChild);\n              }\n\n              cloneElm = element.clone();\n              isTreeNode = UiTreeHelper.elementIsTreeNode(eventElm);\n              isTreeNodeHandle = UiTreeHelper.elementIsTreeNodeHandle(eventElm);\n\n              //If we are not triggering mousedown on our uiTree or any of it's parts, return.\n              if (!isTreeNode && !isTreeNodeHandle) {\n                return;\n              }\n\n              //If we are not triggering mousedown on our uiTree or any of it's parts, return.\n              if (isTreeNode && UiTreeHelper.elementContainsTreeNodeHandler(eventElm)) {\n                return;\n              }\n\n              //Dragging not allowed on inputs or buttons.\n              eventElmTagName = eventElm.prop('tagName').toLowerCase();\n              if (eventElmTagName == 'input' ||\n                  eventElmTagName == 'textarea' ||\n                  eventElmTagName == 'button' ||\n                  eventElmTagName == 'select') {\n                return;\n              }\n\n              //Check if it or it's parents has a 'data-nodrag' attribute\n              el = angular.element(e.target);\n              isUiTreeRoot = el[0].attributes['ui-tree'];\n              while (el && el[0] && el[0] !== element && !isUiTreeRoot) {\n\n                //Checking that I can access attributes.\n                if (el[0].attributes) {\n                  isUiTreeRoot = el[0].attributes['ui-tree'];\n                }\n\n                //If the node mark as `nodrag`, DONOT drag it.\n                if (UiTreeHelper.nodrag(el)) {\n                  return;\n                }\n                el = el.parent();\n              }\n\n              //If users beforeDrag calback returns falsey, do not initiate.\n              if (!scope.beforeDrag(scope)) {\n                return;\n              }\n\n              //Set property checked at start of function to prevent running logic again.\n              e.uiTreeDragging = true;\n              if (e.originalEvent) {\n                e.originalEvent.uiTreeDragging = true;\n              }\n              e.preventDefault();\n\n              //Get original event if TouchEvent.\n              eventObj = UiTreeHelper.eventObj(e);\n\n              //Set boolean used to specify beginning of move.\n              firstMoving = true;\n\n              //Setting drag info properties and methods in scope of node being moved.\n              dragInfo = UiTreeHelper.dragInfo(scope);\n\n              //Setting original tree to adjust horizontal behavior in drag move.\n              treeOfOrigin = dragInfo.source.$treeScope.$id;\n\n              //Determine tage name of element ui-tree-node is on.\n              tagName = element.prop('tagName');\n\n              if (tagName.toLowerCase() === 'tr') {\n\n                //Create a new table column as placeholder.\n                placeElm = angular.element($window.document.createElement(tagName));\n\n                //Create a column placeholder and set colspan to whole row length.\n                tdElm = angular.element($window.document.createElement('td'))\n                    .addClass(config.placeholderClass)\n                    .attr('colspan', element[0].children.length);\n                placeElm.append(tdElm);\n              } else {\n\n                //If not a table just duplicate element and add placeholder class.\n                placeElm = angular.element($window.document.createElement(tagName))\n                    .addClass(config.placeholderClass);\n              }\n\n              //Create a hidden placeholder and add class from config.\n              hiddenPlaceElm = angular.element($window.document.createElement(tagName));\n              if (config.hiddenClass) {\n                hiddenPlaceElm.addClass(config.hiddenClass);\n              }\n\n              //Getting starting position of element being moved.\n              pos = UiTreeHelper.positionStarted(eventObj, element);\n              placeElm.css('height', element.prop('offsetHeight') + 'px');\n\n              //Creating drag element to represent node.\n              dragElm = angular.element($window.document.createElement(scope.$parentNodesScope.$element.prop('tagName')))\n                  .addClass(scope.$parentNodesScope.$element.attr('class')).addClass(config.dragClass);\n              dragElm.css('width', UiTreeHelper.width(element) + 'px');\n              dragElm.css('z-index', 9999);\n\n              //Prevents cursor to change rapidly in Opera 12.16 and IE when dragging an element.\n              hStyle = (element[0].querySelector('.angular-ui-tree-handle') || element[0]).currentStyle;\n              if (hStyle) {\n                document.body.setAttribute('ui-tree-cursor', $document.find('body').css('cursor') || '');\n                $document.find('body').css({'cursor': hStyle.cursor + '!important'});\n              }\n\n              //If tree is sourceOnly (noDragDrop) don't show placeholder when moving about it.\n              if (scope.sourceOnly) {\n                placeElm.css('display', 'none');\n              }\n\n              //Insert placeholder.\n              element.after(placeElm);\n              element.after(hiddenPlaceElm);\n              if (dragInfo.isClone() && scope.sourceOnly) {\n                dragElm.append(cloneElm);\n              } else {\n                dragElm.append(element);\n              }\n\n              //Create drag element.\n              $document.find('body').append(dragElm);\n\n              //Set drag elements position on screen.\n              dragElm.css({\n                'left': eventObj.pageX - pos.offsetX + 'px',\n                'top': eventObj.pageY - pos.offsetY + 'px'\n              });\n              elements = {\n                placeholder: placeElm,\n                dragging: dragElm\n              };\n\n              //Create all drag/move bindings.\n              bindDragMoveEvents();\n\n              //Fire dragStart callback.\n              scope.$apply(function () {\n                scope.$treeScope.$callbacks.dragStart(dragInfo.eventArgs(elements, pos));\n              });\n\n              //Get bounds of document.\n              document_height = Math.max(body.scrollHeight, body.offsetHeight, html.clientHeight, html.scrollHeight, html.offsetHeight);\n              document_width = Math.max(body.scrollWidth, body.offsetWidth, html.clientWidth, html.scrollWidth, html.offsetWidth);\n            };\n\n            dragMove = function (e) {\n              var eventObj = UiTreeHelper.eventObj(e),\n                prev,\n                next,\n                leftElmPos,\n                topElmPos,\n                top_scroll,\n                bottom_scroll,\n                scrollContainerElmRect,\n                target,\n                targetX,\n                targetY,\n                displayElm,\n                targetNode,\n                targetElm,\n                isEmpty,\n                scrollDownBy,\n                scrollUpBy,\n                targetOffset,\n                targetBefore,\n                moveWithinTree,\n                targetBeforeBuffer,\n                targetHeight,\n                targetChildElm,\n                targetChildHeight,\n                isDropzone;\n\n              //If check ensures that drag element was created.\n              if (dragElm) {\n                e.preventDefault();\n\n                //Deselect anything (text, etc.) that was selected when move began.\n                if ($window.getSelection) {\n                  $window.getSelection().removeAllRanges();\n                } else if ($window.document.selection) {\n                  $window.document.selection.empty();\n                }\n\n                //Get top left positioning of element being moved.\n                leftElmPos = eventObj.pageX - pos.offsetX;\n                topElmPos = eventObj.pageY - pos.offsetY;\n\n                //dragElm can't leave the screen on the left.\n                if (leftElmPos < 0) {\n                  leftElmPos = 0;\n                }\n\n                //dragElm can't leave the screen on the top.\n                if (topElmPos < 0) {\n                  topElmPos = 0;\n                }\n\n                //dragElm can't leave the screen on the bottom.\n                if ((topElmPos + 10) > document_height) {\n                  topElmPos = document_height - 10;\n                }\n\n                //dragElm can't leave the screen on the right.\n                if ((leftElmPos + 10) > document_width) {\n                  leftElmPos = document_width - 10;\n                }\n\n                //Updating element being moved css.\n                dragElm.css({\n                  'left': leftElmPos + 'px',\n                  'top': topElmPos + 'px'\n                });\n\n                if (scrollContainerElm) {\n                  //Getting position to top and bottom of container element.\n                  scrollContainerElmRect = scrollContainerElm.getBoundingClientRect();\n                  top_scroll = scrollContainerElm.scrollTop;\n                  bottom_scroll = top_scroll + scrollContainerElm.clientHeight;\n\n                  //To scroll down if cursor y-position is greater than the bottom position of the container vertical scroll\n                  if (scrollContainerElmRect.bottom < eventObj.clientY && bottom_scroll < scrollContainerElm.scrollHeight) {\n                    scrollDownBy = Math.min(scrollContainerElm.scrollHeight - bottom_scroll, 10);\n                    scrollContainerElm.scrollTop += scrollDownBy;\n                  }\n\n                  //To scroll top if cursor y-position is less than the top position of the container vertical scroll\n                  if (scrollContainerElmRect.top > eventObj.clientY && top_scroll > 0) {\n                    scrollUpBy = Math.min(top_scroll, 10);\n                    scrollContainerElm.scrollTop -= scrollUpBy;\n                  }\n                } else {\n                  //Getting position to top and bottom of page.\n                  top_scroll = window.pageYOffset || $window.document.documentElement.scrollTop;\n                  bottom_scroll = top_scroll + (window.innerHeight || $window.document.clientHeight || $window.document.clientHeight);\n\n                  //To scroll down if cursor y-position is greater than the bottom position of the window vertical scroll\n                  if (bottom_scroll < eventObj.pageY && bottom_scroll < document_height) {\n                    scrollDownBy = Math.min(document_height - bottom_scroll, 10);\n                    window.scrollBy(0, scrollDownBy);\n                  }\n\n                  //To scroll top if cursor y-position is less than the top position of the window vertical scroll\n                  if (top_scroll > eventObj.pageY) {\n                    scrollUpBy = Math.min(top_scroll, 10);\n                    window.scrollBy(0, -scrollUpBy);\n                  }\n                }\n\n                //Calling service to update position coordinates based on move.\n                UiTreeHelper.positionMoved(e, pos, firstMoving);\n                if (firstMoving) {\n                  firstMoving = false;\n                  return;\n                }\n\n                //Setting X point for elementFromPoint.\n                targetX = eventObj.pageX - ($window.pageXOffset ||\n                    $window.document.body.scrollLeft ||\n                    $window.document.documentElement.scrollLeft) -\n                    ($window.document.documentElement.clientLeft || 0);\n\n                targetY = eventObj.pageY - ($window.pageYOffset ||\n                    $window.document.body.scrollTop ||\n                    $window.document.documentElement.scrollTop) -\n                    ($window.document.documentElement.clientTop || 0);\n\n                //Select the drag target. Because IE does not support CSS 'pointer-events: none', it will always\n                // pick the drag element itself as the target. To prevent this, we hide the drag element while\n                // selecting the target.\n                if (angular.isFunction(dragElm.hide)) {\n                  dragElm.hide();\n                } else {\n                  displayElm = dragElm[0].style.display;\n                  dragElm[0].style.display = 'none';\n                }\n\n                //When using elementFromPoint() inside an iframe, you have to call\n                // elementFromPoint() twice to make sure IE8 returns the correct value\n                //MDN: The elementFromPoint() method of the Document interface returns the topmost element at the specified coordinates.\n                $window.document.elementFromPoint(targetX, targetY);\n\n                //Set target element (element in specified x/y coordinates).\n                targetElm = angular.element($window.document.elementFromPoint(targetX, targetY));\n\n                //If the target element is a child element of a ui-tree-handle,\n                // use the containing handle element as target element\n                isHandleChild = UiTreeHelper.treeNodeHandlerContainerOfElement(targetElm);\n                if (isHandleChild) {\n                  targetElm = angular.element(isHandleChild);\n                }\n\n                if (angular.isFunction(dragElm.show)) {\n                  dragElm.show();\n                } else {\n                  dragElm[0].style.display = displayElm;\n                }\n\n                //Assigning scope to target you are moving draggable over.\n                if (UiTreeHelper.elementIsTree(targetElm)) {\n                  targetNode = targetElm.controller('uiTree').scope;\n                } else if (UiTreeHelper.elementIsTreeNodeHandle(targetElm)) {\n                  targetNode = targetElm.controller('uiTreeHandle').scope;\n                } else if (UiTreeHelper.elementIsTreeNode(targetElm)) {\n                  targetNode = targetElm.controller('uiTreeNode').scope;\n                } else if (UiTreeHelper.elementIsTreeNodes(targetElm)) {\n                  targetNode = targetElm.controller('uiTreeNodes').scope;\n                } else if (UiTreeHelper.elementIsPlaceholder(targetElm)) {\n                  targetNode = targetElm.controller('uiTreeNodes').scope;\n                } else if (UiTreeHelper.elementIsDropzone(targetElm)) {\n                  targetNode = targetElm.controller('uiTree').scope;\n                  isDropzone = true;\n                } else if (targetElm.controller('uiTreeNode')) {\n                  //Is a child element of a node.\n                  targetNode = targetElm.controller('uiTreeNode').scope;\n                }\n\n                moveWithinTree =  (targetNode && targetNode.$treeScope && targetNode.$treeScope.$id && targetNode.$treeScope.$id === treeOfOrigin);\n\n                /* (jcarter) Notes to developers:\n                 *  pos.dirAx is either 0 or 1\n                 *  1 means horizontal movement is happening\n                 *  0 means vertical movement is happening\n                 */\n\n                // Move nodes up and down in nesting level.\n                if (moveWithinTree && pos.dirAx) {\n\n                  // increase horizontal level if previous sibling exists and is not collapsed\n                  // example 1.1.1 becomes 1.2\n                  if (pos.distX > 0) {\n                    prev = dragInfo.prev();\n                    if (prev && !prev.collapsed\n                      && prev.accept(scope, prev.childNodesCount())) {\n                      prev.$childNodesScope.$element.append(placeElm);\n                      dragInfo.moveTo(prev.$childNodesScope, prev.childNodes(), prev.childNodesCount());\n                    }\n                  }\n\n                  // decrease horizontal level\n                  // example 1.2 become 1.1.1\n                  if (pos.distX < 0) {\n                    // we can't decrease a level if an item preceeds the current one\n                    next = dragInfo.next();\n                    if (!next) {\n                      target = dragInfo.parentNode(); // As a sibling of it's parent node\n                      if (target\n                        && target.$parentNodesScope.accept(scope, target.index() + 1)) {\n                        target.$element.after(placeElm);\n                        dragInfo.moveTo(target.$parentNodesScope, target.siblings(), target.index() + 1);\n                      }\n                    }\n                  }\n                } else { //Either in origin tree and moving horizontally OR you are moving within a new tree.\n\n                  //Check it's new position.\n                  isEmpty = false;\n\n                  //Exit if target is not a uiTree or child of one.\n                  if (!targetNode) {\n                    return;\n                  }\n\n                  //Show the placeholder if it was hidden for nodrop-enabled and this is a new tree\n                  if (targetNode.$treeScope && !targetNode.$parent.nodropEnabled && !targetNode.$treeScope.nodropEnabled) {\n                    placeElm.css('display', '');\n                  }\n\n                  //Set whether target tree is empty or not.\n                  if (targetNode.$type === 'uiTree' && targetNode.dragEnabled) {\n                    isEmpty = targetNode.isEmpty();\n                  }\n\n                  //If target is a handle set new target to handle's node.\n                  if (targetNode.$type === 'uiTreeHandle') {\n                    targetNode = targetNode.$nodeScope;\n                  }\n\n                  //Check if it is a uiTreeNode or it's an empty tree or it's a dropzone.\n                  if (targetNode.$type !== 'uiTreeNode' && !isEmpty && !isDropzone) {\n\n                    // Allow node to return to its original position if no longer hovering over target\n                    if (config.appendChildOnHover) {\n                      next = dragInfo.next();\n                      if (!next && unhover) {\n                        target = dragInfo.parentNode();\n                        target.$element.after(placeElm);\n                        dragInfo.moveTo(target.$parentNodesScope, target.siblings(), target.index() + 1);\n                        unhover = false;\n                      }\n                    }\n                    return;\n                  }\n\n                  //If placeholder move from empty tree, reset it.\n                  if (treeScope && placeElm.parent()[0] != treeScope.$element[0]) {\n                    treeScope.resetEmptyElement();\n                    treeScope.resetDropzoneElement();\n                    treeScope = null;\n                  }\n\n                  //It's an empty tree\n                  if (isEmpty) {\n                    treeScope = targetNode;\n                    if (targetNode.$nodesScope.accept(scope, 0)) {\n                      dragInfo.moveTo(targetNode.$nodesScope, targetNode.$nodesScope.childNodes(), 0);\n                    }\n                  //It's a dropzone\n                  } else if (isDropzone) {\n                    treeScope = targetNode;\n                    if (targetNode.$nodesScope.accept(scope, targetNode.$nodesScope.childNodes().length)) {\n                      dragInfo.moveTo(targetNode.$nodesScope, targetNode.$nodesScope.childNodes(), targetNode.$nodesScope.childNodes().length);\n                    }\n                  //Not empty and drag enabled.\n                  } else if (targetNode.dragEnabled()) {\n\n                      //Setting/Resetting data for exanding on hover.\n                      if (angular.isDefined(scope.expandTimeoutOn) && scope.expandTimeoutOn !== targetNode.id) {\n                        $timeout.cancel(scope.expandTimeout);\n                        delete scope.expandTimeout;\n                        delete scope.expandTimeoutOn;\n\n                        scope.$callbacks.expandTimeoutCancel();\n                      }\n\n                      //Determining if expansion is needed.\n                      if (targetNode.collapsed) {\n                        if (scope.expandOnHover === true || (angular.isNumber(scope.expandOnHover) && scope.expandOnHover === 0)) {\n                          targetNode.collapsed = false;\n                          targetNode.$treeScope.$callbacks.toggle(false, targetNode);\n                        } else if (scope.expandOnHover !== false && angular.isNumber(scope.expandOnHover) && scope.expandOnHover > 0) {\n\n                          //Triggering expansion.\n                          if (angular.isUndefined(scope.expandTimeoutOn)) {\n                            scope.expandTimeoutOn = targetNode.$id;\n\n                            scope.$callbacks.expandTimeoutStart();\n                            scope.expandTimeout = $timeout(function()\n                            {\n                              scope.$callbacks.expandTimeoutEnd();\n                              targetNode.collapsed = false;\n                              targetNode.$treeScope.$callbacks.toggle(false, targetNode);\n                            }, scope.expandOnHover);\n                          }\n                        }\n                      }\n\n                    //Get the element of ui-tree-node\n                    targetElm = targetNode.$element;\n                    targetOffset = UiTreeHelper.offset(targetElm);\n                    targetHeight = UiTreeHelper.height(targetElm);\n                    targetChildElm = targetNode.$childNodesScope ? targetNode.$childNodesScope.$element : null;\n                    targetChildHeight = targetChildElm ? UiTreeHelper.height(targetChildElm) : 0;\n                    targetHeight -= targetChildHeight;\n                    targetBeforeBuffer = config.appendChildOnHover ? targetHeight * 0.25 : UiTreeHelper.height(targetElm) / 2;\n                    targetBefore = eventObj.pageY < (targetOffset.top + targetBeforeBuffer);\n\n                    if (targetNode.$parentNodesScope.accept(scope, targetNode.index())) {\n                      if (targetBefore) {\n                        targetElm[0].parentNode.insertBefore(placeElm[0], targetElm[0]);\n                        dragInfo.moveTo(targetNode.$parentNodesScope, targetNode.siblings(), targetNode.index());\n                      } else {\n                        // Try to append as a child if dragged upwards onto targetNode\n                        if (config.appendChildOnHover && targetNode.accept(scope, targetNode.childNodesCount())) {\n                          targetNode.$childNodesScope.$element.prepend(placeElm);\n                          dragInfo.moveTo(targetNode.$childNodesScope, targetNode.childNodes(), 0);\n                          unhover = true;\n                        } else {\n                          targetElm.after(placeElm);\n                          dragInfo.moveTo(targetNode.$parentNodesScope, targetNode.siblings(), targetNode.index() + 1);\n                        }\n                      }\n\n                    //We have to check if it can add the dragging node as a child.\n                    } else if (!targetBefore && targetNode.accept(scope, targetNode.childNodesCount())) {\n                      targetNode.$childNodesScope.$element.append(placeElm);\n                      dragInfo.moveTo(targetNode.$childNodesScope, targetNode.childNodes(), targetNode.childNodesCount());\n                    }\n                  }\n                }\n\n                //Triggering dragMove callback.\n                scope.$apply(function () {\n                  scope.$treeScope.$callbacks.dragMove(dragInfo.eventArgs(elements, pos));\n                });\n              }\n            };\n\n            dragEnd = function (e) {\n\n              var dragEventArgs = dragInfo.eventArgs(elements, pos);\n\n              e.preventDefault();\n\n              //TODO(jcarter): Is dragStart need to be unbound?\n              unbindDragMoveEvents();\n\n              //This cancel the collapse/expand login running.\n              $timeout.cancel(scope.expandTimeout);\n\n              scope.$treeScope.$apply(function () {\n                $q.when(scope.$treeScope.$callbacks.beforeDrop(dragEventArgs))\n\n                     //Promise resolved (or callback didn't return false)\n                    .then(function (allowDrop) {\n                      if (allowDrop !== false && scope.$$allowNodeDrop) {\n                        //Node drop accepted.\n                        dragInfo.apply();\n\n                        //Fire the dropped callback only if the move was successful.\n                        scope.$treeScope.$callbacks.dropped(dragEventArgs);\n                      } else {\n                        //Drop canceled - revert the node to its original position.\n                        bindDragStartEvents();\n                      }\n                    })\n\n                    //Promise rejected - revert the node to its original position.\n                    .catch(function () {\n                      bindDragStartEvents();\n                    })\n                    .finally(function () {\n\n                      //Replace placeholder with newly dropped element.\n                      hiddenPlaceElm.replaceWith(scope.$element);\n                      placeElm.remove();\n\n                      //Remove drag element if still in DOM.\n                      if (dragElm) {\n                        dragElm.remove();\n                        dragElm = null;\n                      }\n\n                      //Fire dragStope callback.\n                      scope.$treeScope.$callbacks.dragStop(dragEventArgs);\n                      scope.$$allowNodeDrop = false;\n                      dragInfo = null;\n\n                      //Restore cursor in Opera 12.16 and IE\n                      var oldCur = document.body.getAttribute('ui-tree-cursor');\n                      if (oldCur !== null) {\n                        $document.find('body').css({'cursor': oldCur});\n                        document.body.removeAttribute('ui-tree-cursor');\n                      }\n                    });\n              });\n            };\n\n            dragStartEvent = function (e) {\n              if (scope.dragEnabled()) {\n                dragStart(e);\n              }\n            };\n\n            dragMoveEvent = function (e) {\n              dragMove(e);\n            };\n\n            dragEndEvent = function (e) {\n              scope.$$allowNodeDrop = true;\n              dragEnd(e);\n            };\n\n            dragCancelEvent = function (e) {\n              dragEnd(e);\n            };\n\n            dragDelay = (function () {\n              var to;\n\n              return {\n                exec: function (fn, ms) {\n                  if (!ms) {\n                    ms = 0;\n                  }\n                  this.cancel();\n                  to = $timeout(fn, ms);\n                },\n                cancel: function () {\n                  $timeout.cancel(to);\n                }\n              };\n            })();\n\n            keydownHandler = function (e) {\n              if (e.keyCode === 27) {\n                dragEndEvent(e);\n              }\n            };\n\n            /**\n             * Binds the mouse/touch events to enable drag start for this node.\n             */\n            //This is outside of bindDragMoveEvents because of the potential for a delay setting.\n            bindDragStartEvents = function () {\n              element.bind('touchstart mousedown', function (e) {\n                //Don't call drag delay if no delay was specified.\n                if (scope.dragDelay > 0) {\n                  dragDelay.exec(function () {\n                    dragStartEvent(e);\n                  }, scope.dragDelay);\n                } else {\n                  dragStartEvent(e);\n                }\n              });\n              element.bind('touchend touchcancel mouseup', function () {\n                if (scope.dragDelay > 0) {\n                  dragDelay.cancel();\n                }\n              });\n            };\n            bindDragStartEvents();\n\n            /**\n             * Binds mouse/touch events that handle moving/dropping this dragged node\n             */\n            bindDragMoveEvents = function () {\n              angular.element($document).bind('touchend', dragEndEvent);\n              angular.element($document).bind('touchcancel', dragEndEvent);\n              angular.element($document).bind('touchmove', dragMoveEvent);\n              angular.element($document).bind('mouseup', dragEndEvent);\n              angular.element($document).bind('mousemove', dragMoveEvent);\n              angular.element($document).bind('mouseleave', dragCancelEvent);\n              angular.element($document).bind('keydown', keydownHandler);\n            };\n\n            /**\n             * Unbinds mouse/touch events that handle moving/dropping this dragged node.\n             */\n            unbindDragMoveEvents = function () {\n              angular.element($document).unbind('touchend', dragEndEvent);\n              angular.element($document).unbind('touchcancel', dragEndEvent);\n              angular.element($document).unbind('touchmove', dragMoveEvent);\n              angular.element($document).unbind('mouseup', dragEndEvent);\n              angular.element($document).unbind('mousemove', dragMoveEvent);\n              angular.element($document).unbind('mouseleave', dragCancelEvent);\n              angular.element($document).unbind('keydown', keydownHandler);\n            };\n          }\n        };\n      }\n    ]);\n})();\n\n(function () {\n  'use strict';\n\n  angular.module('ui.tree')\n    .directive('uiTreeNodes', ['treeConfig', '$window',\n      function (treeConfig) {\n        return {\n          require: ['ngModel', '?^uiTreeNode', '^uiTree'],\n          restrict: 'A',\n          scope: true,\n          controller: 'TreeNodesController',\n          link: function (scope, element, attrs, controllersArr) {\n\n            var config = {},\n                ngModel = controllersArr[0],\n                treeNodeCtrl = controllersArr[1],\n                treeCtrl = controllersArr[2];\n\n            angular.extend(config, treeConfig);\n            if (config.nodesClass) {\n              element.addClass(config.nodesClass);\n            }\n\n            if (treeNodeCtrl) {\n              treeNodeCtrl.scope.$childNodesScope = scope;\n              scope.$nodeScope = treeNodeCtrl.scope;\n            } else {\n              // find the root nodes if there is no parent node and have a parent ui-tree\n              treeCtrl.scope.$nodesScope = scope;\n            }\n            scope.$treeScope = treeCtrl.scope;\n\n            if (ngModel) {\n              ngModel.$render = function () {\n                scope.$modelValue = ngModel.$modelValue;\n              };\n            }\n\n            scope.$watch(function () {\n              return attrs.maxDepth;\n            }, function (val) {\n              if ((typeof val) == 'number') {\n                scope.maxDepth = val;\n              }\n            });\n\n            scope.$watch(function () {\n              return attrs.nodropEnabled;\n            }, function (newVal) {\n              if ((typeof newVal) != 'undefined') {\n                scope.nodropEnabled = true;\n              }\n            }, true);\n\n          }\n        };\n      }\n    ]);\n})();\n\n(function () {\n  'use strict';\n\n  angular.module('ui.tree')\n\n  /**\n   * @ngdoc service\n   * @name ui.tree.service:UiTreeHelper\n   * @requires ng.$document\n   * @requires ng.$window\n   *\n   * @description\n   * angular-ui-tree.\n   */\n    .factory('UiTreeHelper', ['$document', '$window', 'treeConfig',\n      function ($document, $window, treeConfig) {\n        return {\n\n          /**\n           * A hashtable used to storage data of nodes\n           * @type {Object}\n           */\n          nodesData: {},\n\n          setNodeAttribute: function (scope, attrName, val) {\n            if (!scope.$modelValue) {\n              return null;\n            }\n            var data = this.nodesData[scope.$modelValue.$$hashKey];\n            if (!data) {\n              data = {};\n              this.nodesData[scope.$modelValue.$$hashKey] = data;\n            }\n            data[attrName] = val;\n          },\n\n          getNodeAttribute: function (scope, attrName) {\n            if (!scope.$modelValue) {\n              return null;\n            }\n            var data = this.nodesData[scope.$modelValue.$$hashKey];\n            if (data) {\n              return data[attrName];\n            }\n            return null;\n          },\n\n          /**\n           * @ngdoc method\n           * @methodOf ui.tree.service:$nodrag\n           * @param  {Object} targetElm angular element\n           * @return {Bool} check if the node can be dragged.\n           */\n          nodrag: function (targetElm) {\n            if (typeof targetElm.attr('data-nodrag') != 'undefined') {\n              return targetElm.attr('data-nodrag') !== 'false';\n            }\n            return false;\n          },\n\n          /**\n           * Get the event object for touches.\n           * \n           * @param  {MouseEvent|TouchEvent} e MouseEvent or TouchEvent that kicked off dragX method.\n           * @return {MouseEvent|TouchEvent} Object returned as original event object.\n           */\n          eventObj: function (e) {\n            var obj = e;\n            if (e.targetTouches !== undefined) {\n              //Set obj equal to the first Touch object in the TouchList.\n              obj = e.targetTouches.item(0);\n            //Logic to set obj to original TouchEvent.\n            } else if (e.originalEvent !== undefined && e.originalEvent.targetTouches !== undefined) {\n              obj = e.originalEvent.targetTouches.item(0);\n            }\n            return obj;\n          },\n\n          /**\n           * Generate object used to store data about node being moved.\n           * \n           * {angular.$scope} node Scope of the node that is being moved.\n           */\n          dragInfo: function (node) {\n            return {\n              source: node,\n              sourceInfo: {\n                cloneModel: node.$treeScope.cloneEnabled === true ? angular.copy(node.$modelValue) : undefined,\n                nodeScope: node,\n                index: node.index(),\n                nodesScope: node.$parentNodesScope\n              },\n              index: node.index(),\n\n              //Slice(0) just duplicates an array.\n              siblings: node.siblings().slice(0),\n              parent: node.$parentNodesScope,\n\n              //Reset parent to source parent.\n              resetParent: function() {\n                this.parent = node.$parentNodesScope;\n              },\n\n              //Move the node to a new position, determining where the node will be inserted to when dropped happens here.\n              moveTo: function (parent, siblings, index) {\n                this.parent = parent;\n\n                //Duplicate siblings array.\n                this.siblings = siblings.slice(0);\n\n                //If source node is in the target nodes\n                var i = this.siblings.indexOf(this.source);\n                if (i > -1) {\n                  this.siblings.splice(i, 1);\n                  if (this.source.index() < index) {\n                    index--;\n                  }\n                }\n\n                this.siblings.splice(index, 0, this.source);\n                this.index = index;\n              },\n\n              //Get parent nodes nodeScope.\n              parentNode: function () {\n                return this.parent.$nodeScope;\n              },\n\n              //Get previous sibling node.\n              prev: function () {\n                if (this.index > 0) {\n                  return this.siblings[this.index - 1];\n                }\n\n                return null;\n              },\n\n              //Get next sibling node.\n              next: function () {\n                if (this.index < this.siblings.length - 1) {\n                  return this.siblings[this.index + 1];\n                }\n\n                return null;\n              },\n\n              //Return what cloneEnabled is set to on uiTree.\n              isClone: function () {\n                return this.source.$treeScope.cloneEnabled === true;\n              },\n\n              //Returns a copy of node passed in.\n              clonedNode: function (node) {\n                return angular.copy(node);\n              },\n\n              //Returns true if parent or index have changed (move happened within any uiTree).\n              isDirty: function () {\n                return this.source.$parentNodesScope != this.parent ||\n                  this.source.index() != this.index;\n              },\n\n              //Return whether node has a new parent (set on moveTo method).\n              isForeign: function () {\n                return this.source.$treeScope !== this.parent.$treeScope;\n              },\n\n              //Sets arguments passed to user callbacks.\n              eventArgs: function (elements, pos) {\n                return {\n                  source: this.sourceInfo,\n                  dest: {\n                    index: this.index,\n                    nodesScope: this.parent\n                  },\n                  elements: elements,\n                  pos: pos\n                };\n              },\n\n              //Method that actually manipulates the node being moved.\n              apply: function () {\n\n                var nodeData = this.source.$modelValue;\n\n                //Nodrop enabled on tree or parent\n                if (this.parent.nodropEnabled || this.parent.$treeScope.nodropEnabled) {\n                  return;\n                }\n\n                //Node was dropped in the same place - do nothing.\n                if (!this.isDirty()) {\n                  return;\n                }\n\n                //CloneEnabled and cross-tree so copy and do not remove from source.\n                if (this.isClone() && this.isForeign()) {\n                  this.parent.insertNode(this.index, this.sourceInfo.cloneModel);\n                //Any other case, remove and reinsert.\n                } else {\n                  this.source.remove();\n                  this.parent.insertNode(this.index, nodeData);\n                }\n              }\n            };\n          },\n\n          /**\n           * @ngdoc method\n           * @name ui.tree#height\n           * @methodOf ui.tree.service:UiTreeHelper\n           *\n           * @description\n           * Get the height of an element.\n           *\n           * @param {Object} element Angular element.\n           * @returns {String} Height\n           */\n          height: function (element) {\n            return element.prop('scrollHeight');\n          },\n\n          /**\n           * @ngdoc method\n           * @name ui.tree#width\n           * @methodOf ui.tree.service:UiTreeHelper\n           *\n           * @description\n           * Get the width of an element.\n           *\n           * @param {Object} element Angular element.\n           * @returns {String} Width\n           */\n          width: function (element) {\n            return element.prop('scrollWidth');\n          },\n\n          /**\n           * @ngdoc method\n           * @name ui.tree#offset\n           * @methodOf ui.nestedSortable.service:UiTreeHelper\n           *\n           * @description\n           * Get the offset values of an element.\n           *\n           * @param {Object} element Angular element.\n           * @returns {Object} Object with properties width, height, top and left\n           */\n          offset: function (element) {\n            var boundingClientRect = element[0].getBoundingClientRect();\n\n            return {\n              width: element.prop('offsetWidth'),\n              height: element.prop('offsetHeight'),\n              top: boundingClientRect.top + ($window.pageYOffset || $document[0].body.scrollTop || $document[0].documentElement.scrollTop),\n              left: boundingClientRect.left + ($window.pageXOffset || $document[0].body.scrollLeft || $document[0].documentElement.scrollLeft)\n            };\n          },\n\n          /**\n           * @ngdoc method\n           * @name ui.tree#positionStarted\n           * @methodOf ui.tree.service:UiTreeHelper\n           *\n           * @description\n           * Get the start position of the target element according to the provided event properties.\n           *\n           * @param {Object} e Event\n           * @param {Object} target Target element\n           * @returns {Object} Object with properties offsetX, offsetY, startX, startY, nowX and dirX.\n           */\n          positionStarted: function (e, target) {\n            var pos = {},\n            pageX = e.pageX,\n            pageY = e.pageY;\n\n            //Check to set correct data for TouchEvents\n            if (e.originalEvent && e.originalEvent.touches && (e.originalEvent.touches.length > 0)) {\n              pageX = e.originalEvent.touches[0].pageX;\n              pageY = e.originalEvent.touches[0].pageY;\n            }\n            pos.offsetX = pageX - this.offset(target).left;\n            pos.offsetY = pageY - this.offset(target).top;\n            pos.startX = pos.lastX = pageX;\n            pos.startY = pos.lastY = pageY;\n            pos.nowX = pos.nowY = pos.distX = pos.distY = pos.dirAx = 0;\n            pos.dirX = pos.dirY = pos.lastDirX = pos.lastDirY = pos.distAxX = pos.distAxY = 0;\n            return pos;\n          },\n\n          positionMoved: function (e, pos, firstMoving) {\n\n            var pageX = e.pageX,\n            pageY = e.pageY,\n            newAx;\n\n            //If there are multiple touch points, choose one to use as X and Y.\n            if (e.originalEvent && e.originalEvent.touches && (e.originalEvent.touches.length > 0)) {\n              pageX = e.originalEvent.touches[0].pageX;\n              pageY = e.originalEvent.touches[0].pageY;\n            }\n\n            //Mouse position last event.\n            pos.lastX = pos.nowX;\n            pos.lastY = pos.nowY;\n\n            //Mouse position this event.\n            pos.nowX = pageX;\n            pos.nowY = pageY;\n\n            //Distance mouse moved between events.          \n            pos.distX = pos.nowX - pos.lastX;\n            pos.distY = pos.nowY - pos.lastY;\n\n            //Direction mouse was moving.           \n            pos.lastDirX = pos.dirX;\n            pos.lastDirY = pos.dirY;\n\n            //Direction mouse is now moving (on both axis).          \n            pos.dirX = pos.distX === 0 ? 0 : pos.distX > 0 ? 1 : -1;\n            pos.dirY = pos.distY === 0 ? 0 : pos.distY > 0 ? 1 : -1;\n\n            //Axis mouse is now moving on.         \n            newAx = Math.abs(pos.distX) > Math.abs(pos.distY) ? 1 : 0;\n\n            //Do nothing on first move.\n            if (firstMoving) {\n              pos.dirAx = newAx;\n              pos.moving = true;\n              return;\n            }\n\n            //Calc distance moved on this axis (and direction).          \n            if (pos.dirAx !== newAx) {\n              pos.distAxX = 0;\n              pos.distAxY = 0;\n            } else {\n              pos.distAxX += Math.abs(pos.distX);\n              if (pos.dirX !== 0 && pos.dirX !== pos.lastDirX) {\n                pos.distAxX = 0;\n              }\n              pos.distAxY += Math.abs(pos.distY);\n              if (pos.dirY !== 0 && pos.dirY !== pos.lastDirY) {\n                pos.distAxY = 0;\n              }\n            }\n            pos.dirAx = newAx;\n          },\n\n          elementIsTreeNode: function (element) {\n            return typeof element.attr('ui-tree-node') !== 'undefined';\n          },\n\n          elementIsTreeNodeHandle: function (element) {\n            return typeof element.attr('ui-tree-handle') !== 'undefined';\n          },\n          elementIsTree: function (element) {\n            return typeof element.attr('ui-tree') !== 'undefined';\n          },\n          elementIsTreeNodes: function (element) {\n            return typeof element.attr('ui-tree-nodes') !== 'undefined';\n          },\n          elementIsPlaceholder: function (element) {\n            return element.hasClass(treeConfig.placeholderClass);\n          },\n          elementIsDropzone: function (element) {\n            return element.hasClass(treeConfig.dropzoneClass);\n          },\n          elementContainsTreeNodeHandler: function (element) {\n            return element[0].querySelectorAll('[ui-tree-handle]').length >= 1;\n          },\n          treeNodeHandlerContainerOfElement: function (element) {\n            return findFirstParentElementWithAttribute('ui-tree-handle', element[0]);\n          }\n        };\n      }\n    ]);\n\n  // TODO: optimize this loop\n  //(Jcarter): Suggest adding a parent element property on uiTree, then all these bubble\n  // to <html> can trigger to stop when they reach the parent.\n  function findFirstParentElementWithAttribute(attributeName, childObj) {\n    //Undefined if the mouse leaves the browser window\n    if (childObj === undefined) {\n      return null;\n    }\n    var testObj = childObj.parentNode,\n    count = 1,\n    //Check for setAttribute due to exception thrown by Firefox when a node is dragged outside the browser window\n    res = (typeof testObj.setAttribute === 'function' && testObj.hasAttribute(attributeName)) ? testObj : null;\n    while (testObj && typeof testObj.setAttribute === 'function' && !testObj.hasAttribute(attributeName)) {\n      testObj = testObj.parentNode;\n      res = testObj;\n      //Stop once we reach top of page.\n      if (testObj === document.documentElement) {\n        res = null;\n        break;\n      }\n      count++;\n    }\n    return res;\n  }\n\n})();\n/*\n    ng-youtube-embed v1.7.17\n    Copyright (c) 2015 Arun Michael Dsouza (amdsouza92@gmail.com)\n    Licence: MIT\n    Demo on CodePen - http://codepen.io/amdsouza92/pen/yNxyJV\n*/\n!function () { \"use strict\"; function a() { var a = document.createElement(\"script\"), b = document.getElementsByTagName(\"script\")[0]; a.src = g, b.parentNode.insertBefore(a, b) } function b() { for (var a = g, b = document.getElementsByTagName(\"script\"), c = b.length; c--;)if (b[c].src == a) return !0; return !1 } function c(a, b, c) { var d = c ? c : \"\"; if (!a.origin) { var e = location.protocol, f = e.concat(\"//\"), g = f.concat(window.location.hostname); a.origin = g } var h = \"enablejsapi=\" + a.enablejsapi + \"&autoplay=\" + a.autoplay + \"&cc_load_policy=\" + a.ccloadpolicy + \"&color=\" + a.color + \"&controls=\" + a.controls + \"&disablekb=\" + a.disablekb + \"&end=\" + a.end + \"&fs=\" + a.fs + \"&hl=\" + a.hl + \"&iv_load_policy=\" + a.ivloadpolicy + \"&playlist=\" + b.playlistArray + \"&playsinline=\" + a.playsinline + \"&rel=\" + a.rel + \"&showinfo=\" + a.showinfo + \"&start=\" + a.start + \"&modestbranding=\" + a.modestbranding + \"&loop=\" + a.loop + \"&listType=\" + a.listType + \"&list=\" + a.list + \"&origin=\" + a.origin; h = h.replace(/([a-zA-Z_]+=&)/g, \"\").replace(/&$/, \"\").replace(/([a-zA-Z_]+=$)/g, \"\"); var i = \"\"; window.onNgYtIframeLoad && (i = 'onLoad=\"onNgYtIframeLoad()\"'); var j = '<iframe id=\"' + a.videoid + '\" width=\"' + a.width + '\" height=\"' + a.height + '\" src=\"https://www.youtube.com/embed/' + d + \"?\" + h + '\" frameborder=\"0\" allowfullscreen ' + i + \"></iframe>\"; return window.onNgYtIframeLoad || (window.onNgYtIframeLoad = function () { window.onYouTubeIframeAPIReady() }), j } function d(a, b, d, e) { var f = c(a, b, e); b.youtubeEmbedFrame = d.trustAsHtml(f) } var e = angular.module(\"ngYoutubeEmbed\", []), f = [], g = \"https://www.youtube.com/iframe_api\", h = /^(?:https?:\\/\\/)?(?:www\\.|m\\.)?(?:youtu\\.be\\/|youtube\\.com\\/(?:embed\\/|v\\/|watch\\?v=|watch\\?.+&v=))((\\w|-){11})(?:\\S+)?$/, i = /^(?:https?:\\/\\/)?(?:www\\.)?(?:gaming.youtube\\.com\\/(?:embed\\/|v\\/|watch\\?v=|watch\\?.+&v=))((\\w|-){11})(?:\\S+)?$/; e.service(\"ngYoutubeEmbedService\", [\"$window\", \"$rootScope\", function (a, b) { this.setReadyState = function () { a.onYouTubeIframeAPIReady = function () { f.forEach(function (a) { b.$emit(\"youtubeIframeEmbedApiLoaded\", a) }) } }; var c = []; b.$on(\"addNewPlayer\", function (a, b) { c[b.id] = b.player }), this.getPlayerById = function (a) { return c[a] }, this.getVideoIdByUrl = function (a) { var b = a.indexOf(\"gaming\") !== -1 ? i : h, c = a.match(b); return null !== c ? c[1] : a } }]), e.directive(\"ngYoutubeEmbed\", [\"$sce\", \"ngYoutubeEmbedService\", \"$rootScope\", function (c, e, g) { return { restrict: \"E\", template: '<div ng-bind-html=\"youtubeEmbedFrame\"></div>', scope: { video: \"=\", onready: \"=\", onstatechange: \"=\", onplaybackqualitychange: \"=\", onplaybackratechange: \"=\", onerror: \"=\", onapichange: \"=\", autoplay: \"@\", ccloadpolicy: \"@\", color: \"@\", controls: \"@\", disablekb: \"@\", end: \"@end\", fs: \"@\", hl: \"@\", ivloadpolicy: \"@\", playlist: \"@\", playsinline: \"@\", rel: \"@\", showinfo: \"@\", start: \"@\", width: \"@\", height: \"@\", enablejsapi: \"@\", videoid: \"@\", modestbranding: \"@\", loop: \"@\", listtype: \"@\", list: \"@\", origin: \"@\" }, link: function (h, i, j) { i[0].removeAttribute(\"id\"); var k = { width: h.width ? h.width : 500, height: h.height ? h.height : 350, autoplay: \"true\" == h.autoplay ? 1 : 0, ccloadpolicy: \"true\" == h.ccloadpolicy ? 1 : 0, color: \"white\" == h.color ? \"white\" : \"red\", controls: \"false\" == h.controls ? 0 : 1, disablekb: \"false\" == h.disablekb ? 1 : 0, end: h.end ? h.end : \"\", fs: \"false\" == h.fs ? 0 : 1, hl: h.hl ? h.hl : \"\", ivloadpolicy: \"false\" == h.ivloadpolicy ? 3 : 1, playlist: h.playlist ? h.playlist : \"\", playsinline: \"true\" == h.playsinline ? 1 : 0, rel: \"false\" == h.rel ? 0 : 1, showinfo: \"false\" == h.showinfo ? 0 : 1, start: h.start ? h.start : \"\", enablejsapi: \"true\" === h.enablejsapi ? 1 : 0, videoid: h.videoid ? h.videoid : \"\", modestbranding: \"true\" === h.modestbranding ? 1 : 0, loop: \"true\" === h.loop ? 1 : \"\", listType: h.listtype ? h.listtype : \"\", list: h.list ? h.list : \"\", origin: h.origin ? h.origin : \"\" }; if (k.enablejsapi && !b() && (a(), e.setReadyState()), k.enablejsapi && g.$on(\"youtubeIframeEmbedApiLoaded\", function (a, b) { if (b === k.videoid) { var c = {}; h.onready && (c.onReady = h.onready), h.onstatechange && (c.onStateChange = h.onstatechange), h.onplaybackqualitychange && (c.onPlaybackQualityChange = h.onplaybackqualitychange), h.onplaybackratechange && (c.onPlaybackRateChange = h.onplaybackratechange), h.onerror && (c.onError = h.onerror), h.onapichange && (c.onApiChange = h.onapichange); var d = new YT.Player(b, { events: c }); g.$emit(\"addNewPlayer\", { player: d, id: b }) } }), h.playlistArray = [], k.playlist) for (var l = h.playlist.split(\",\"), m = 0; m < l.length; m++)h.playlistArray.push(e.getVideoIdByUrl(l[m])); k.videoid && k.enablejsapi ? f.push(k.videoid) : null, k.list && (k.listType ? d(k, h, c) : console.warn(\"The list parameter works in conjunction with the listtype parameter, please provide a valid value for the listtype parameter in order to render a list. Read documentation here - https://github.com/ArunMichaelDsouza/ng-youtube-embed#list-string\")), k.listType && (k.list ? d(k, h, c) : console.warn(\"The listtype parameter works in conjunction with the list parameter, please provide a valid value for the list parameter in order to render a list. Read documentation here - https://github.com/ArunMichaelDsouza/ng-youtube-embed#listtype-string\")), k.listType || k.list || h.video || console.warn(\"Please provide a valid youtube video URL or ID to render the iframe embed player. Read documentation here - https://github.com/ArunMichaelDsouza/ng-youtube-embed\"), h.$watch(\"video\", function (a) { if (a) { var b = e.getVideoIdByUrl(a); d(k, h, c, b) } }) } } }]) }();\n\n/*!\n * ui-grid - v4.12.7 - 2024-04-12\n* http://ui-grid.info/\n * Copyright (c) 2024 ; License: MIT \n */\n\n(function() {\n\t'use strict';\n\n\tangular.module('ui.grid.i18n', []);\n\tangular.module('ui.grid', ['ui.grid.i18n']);\n})();\n\n(function() {\n  'use strict';\n  /**\n   *  @ngdoc overview\n   *  @name ui.grid.autoResize\n   *\n   *  @description\n   *\n   *  #ui.grid.autoResize\n   *\n   *  <div class=\"alert alert-warning\" role=\"alert\"><strong>Beta</strong> This feature is ready for testing, but it either hasn't seen a lot of use or has some known bugs.</div>\n   *\n   *  This module provides auto-resizing functionality to UI-Grid.\n   */\n  var module = angular.module('ui.grid.autoResize', ['ui.grid']);\n\n  /**\n   *  @ngdoc directive\n   *  @name ui.grid.autoResize.directive:uiGridAutoResize\n   *  @element div\n   *  @restrict A\n   *\n   *  @description Stacks on top of the ui-grid directive and\n   *  adds the a watch to the grid's height and width which refreshes\n   *  the grid content whenever its dimensions change.\n   *\n   */\n  module.directive('uiGridAutoResize', ['gridUtil', function(gridUtil) {\n    return {\n      require: 'uiGrid',\n      scope: false,\n      link: function($scope, $elm, $attrs, uiGridCtrl) {\n        var debouncedRefresh;\n\n        function getDimensions() {\n          return {\n            width: gridUtil.elementWidth($elm),\n            height: gridUtil.elementHeight($elm)\n          };\n        }\n\n        function refreshGrid(prevWidth, prevHeight, width, height) {\n          if ($elm[0].offsetParent !== null) {\n            uiGridCtrl.grid.gridWidth = width;\n            uiGridCtrl.grid.gridHeight = height;\n            uiGridCtrl.grid.queueGridRefresh()\n              .then(function() {\n                uiGridCtrl.grid.api.core.raise.gridDimensionChanged(prevHeight, prevWidth, height, width);\n              });\n          }\n        }\n\n        debouncedRefresh = gridUtil.debounce(refreshGrid, 400);\n\n        $scope.$watchCollection(getDimensions, function(newValues, oldValues) {\n          if (!angular.equals(newValues, oldValues)) {\n            debouncedRefresh(oldValues.width, oldValues.height, newValues.width, newValues.height);\n          }\n        });\n      }\n    };\n  }]);\n})();\n\n(function () {\n  'use strict';\n\n  /**\n   *  @ngdoc overview\n   *  @name ui.grid.cellNav\n   *\n   *  @description\n\n      #ui.grid.cellNav\n\n      <div class=\"alert alert-success\" role=\"alert\"><strong>Stable</strong> This feature is stable. There should no longer be breaking api changes without a deprecation warning.</div>\n\n      This module provides cell navigation functionality to UI-Grid.\n   */\n  var module = angular.module('ui.grid.cellNav', ['ui.grid']);\n\n  /**\n   *  @ngdoc object\n   *  @name ui.grid.cellNav.constant:uiGridCellNavConstants\n   *\n   *  @description constants available in cellNav\n   */\n  module.constant('uiGridCellNavConstants', {\n    FEATURE_NAME: 'gridCellNav',\n    CELL_NAV_EVENT: 'cellNav',\n    direction: {LEFT: 0, RIGHT: 1, UP: 2, DOWN: 3, PG_UP: 4, PG_DOWN: 5},\n    EVENT_TYPE: {\n      KEYDOWN: 0,\n      CLICK: 1,\n      CLEAR: 2\n    }\n  });\n\n\n  module.factory('uiGridCellNavFactory', ['uiGridCellNavConstants', 'GridRowColumn',\n    function (uiGridCellNavConstants, GridRowColumn) {\n      /**\n       *  @ngdoc object\n       *  @name ui.grid.cellNav.object:CellNav\n       *  @description returns a CellNav prototype function\n       *  @param {object} rowContainer container for rows\n       *  @param {object} colContainer parent column container\n       *  @param {object} leftColContainer column container to the left of parent\n       *  @param {object} rightColContainer column container to the right of parent\n       */\n      var UiGridCellNav = function UiGridCellNav(rowContainer, colContainer, leftColContainer, rightColContainer) {\n        this.rows = rowContainer.visibleRowCache;\n        this.columns = colContainer.visibleColumnCache;\n        this.leftColumns = leftColContainer ? leftColContainer.visibleColumnCache : [];\n        this.rightColumns = rightColContainer ? rightColContainer.visibleColumnCache : [];\n        this.bodyContainer = rowContainer;\n      };\n\n      /** returns focusable columns of all containers */\n      UiGridCellNav.prototype.getFocusableCols = function () {\n        var allColumns = this.leftColumns.concat(this.columns, this.rightColumns);\n\n        return allColumns.filter(function (col) {\n          return col.colDef.allowCellFocus;\n        });\n      };\n\n      /**\n       *  @ngdoc object\n       *  @name ui.grid.cellNav.api:GridRow\n       *\n       *  @description GridRow settings for cellNav feature, these are available to be\n       *  set only internally (for example, by other features)\n       */\n\n      /**\n       *  @ngdoc object\n       *  @name allowCellFocus\n       *  @propertyOf  ui.grid.cellNav.api:GridRow\n       *  @description Enable focus on a cell within this row.  If set to false then no cells\n       *  in this row can be focused - group header rows as an example would set this to false.\n       *  <br/>Defaults to true\n       */\n      /** returns focusable rows */\n      UiGridCellNav.prototype.getFocusableRows = function () {\n        return this.rows.filter(function(row) {\n          return row.allowCellFocus !== false;\n        });\n      };\n\n      UiGridCellNav.prototype.getNextRowCol = function (direction, curRow, curCol) {\n        switch (direction) {\n          case uiGridCellNavConstants.direction.LEFT:\n            return this.getRowColLeft(curRow, curCol);\n          case uiGridCellNavConstants.direction.RIGHT:\n            return this.getRowColRight(curRow, curCol);\n          case uiGridCellNavConstants.direction.UP:\n            return this.getRowColUp(curRow, curCol);\n          case uiGridCellNavConstants.direction.DOWN:\n            return this.getRowColDown(curRow, curCol);\n          case uiGridCellNavConstants.direction.PG_UP:\n            return this.getRowColPageUp(curRow, curCol);\n          case uiGridCellNavConstants.direction.PG_DOWN:\n            return this.getRowColPageDown(curRow, curCol);\n        }\n      };\n\n      UiGridCellNav.prototype.initializeSelection = function () {\n        var focusableCols = this.getFocusableCols();\n        var focusableRows = this.getFocusableRows();\n        if (focusableCols.length === 0 || focusableRows.length === 0) {\n          return null;\n        }\n\n        return new GridRowColumn(focusableRows[0], focusableCols[0]); // return same row\n      };\n\n      UiGridCellNav.prototype.getRowColLeft = function (curRow, curCol) {\n        var focusableCols = this.getFocusableCols();\n        var focusableRows = this.getFocusableRows();\n        var curColIndex = focusableCols.indexOf(curCol);\n        var curRowIndex = focusableRows.indexOf(curRow);\n\n        // could not find column in focusable Columns so set it to 1\n        if (curColIndex === -1) {\n          curColIndex = 1;\n        }\n\n        var nextColIndex = curColIndex === 0 ? focusableCols.length - 1 : curColIndex - 1;\n\n        // get column to left\n        if (nextColIndex >= curColIndex) {\n          // On the first row\n          // if (curRowIndex === 0 && curColIndex === 0) {\n          //   return null;\n          // }\n          if (curRowIndex === 0) {\n            return new GridRowColumn(curRow, focusableCols[nextColIndex]); // return same row\n          }\n          else {\n            // up one row and far right column\n            return new GridRowColumn(focusableRows[curRowIndex - 1], focusableCols[nextColIndex]);\n          }\n        }\n        else {\n          return new GridRowColumn(curRow, focusableCols[nextColIndex]);\n        }\n      };\n\n\n\n      UiGridCellNav.prototype.getRowColRight = function (curRow, curCol) {\n        var focusableCols = this.getFocusableCols();\n        var focusableRows = this.getFocusableRows();\n        var curColIndex = focusableCols.indexOf(curCol);\n        var curRowIndex = focusableRows.indexOf(curRow);\n\n        // could not find column in focusable Columns so set it to 0\n        if (curColIndex === -1) {\n          curColIndex = 0;\n        }\n        var nextColIndex = curColIndex === focusableCols.length - 1 ? 0 : curColIndex + 1;\n\n        if (nextColIndex <= curColIndex) {\n          if (curRowIndex === focusableRows.length - 1) {\n            return new GridRowColumn(curRow, focusableCols[nextColIndex]); // return same row\n          }\n          else {\n            // down one row and far left column\n            return new GridRowColumn(focusableRows[curRowIndex + 1], focusableCols[nextColIndex]);\n          }\n        }\n        else {\n          return new GridRowColumn(curRow, focusableCols[nextColIndex]);\n        }\n      };\n\n      UiGridCellNav.prototype.getRowColDown = function (curRow, curCol) {\n        var focusableCols = this.getFocusableCols();\n        var focusableRows = this.getFocusableRows();\n        var curColIndex = focusableCols.indexOf(curCol);\n        var curRowIndex = focusableRows.indexOf(curRow);\n\n        // could not find column in focusable Columns so set it to 0\n        if (curColIndex === -1) {\n          curColIndex = 0;\n        }\n\n        if (curRowIndex === focusableRows.length - 1) {\n          return new GridRowColumn(curRow, focusableCols[curColIndex]); // return same row\n        }\n        else {\n          // down one row\n          return new GridRowColumn(focusableRows[curRowIndex + 1], focusableCols[curColIndex]);\n        }\n      };\n\n      UiGridCellNav.prototype.getRowColPageDown = function (curRow, curCol) {\n        var focusableCols = this.getFocusableCols();\n        var focusableRows = this.getFocusableRows();\n        var curColIndex = focusableCols.indexOf(curCol);\n        var curRowIndex = focusableRows.indexOf(curRow);\n\n        // could not find column in focusable Columns so set it to 0\n        if (curColIndex === -1) {\n          curColIndex = 0;\n        }\n\n        var pageSize = this.bodyContainer.minRowsToRender();\n        if (curRowIndex >= focusableRows.length - pageSize) {\n          return new GridRowColumn(focusableRows[focusableRows.length - 1], focusableCols[curColIndex]); // return last row\n        }\n        else {\n          // down one page\n          return new GridRowColumn(focusableRows[curRowIndex + pageSize], focusableCols[curColIndex]);\n        }\n      };\n\n      UiGridCellNav.prototype.getRowColUp = function (curRow, curCol) {\n        var focusableCols = this.getFocusableCols();\n        var focusableRows = this.getFocusableRows();\n        var curColIndex = focusableCols.indexOf(curCol);\n        var curRowIndex = focusableRows.indexOf(curRow);\n\n        // could not find column in focusable Columns so set it to 0\n        if (curColIndex === -1) {\n          curColIndex = 0;\n        }\n\n        if (curRowIndex === 0) {\n          return new GridRowColumn(curRow, focusableCols[curColIndex]); // return same row\n        }\n        else {\n          // up one row\n          return new GridRowColumn(focusableRows[curRowIndex - 1], focusableCols[curColIndex]);\n        }\n      };\n\n      UiGridCellNav.prototype.getRowColPageUp = function (curRow, curCol) {\n        var focusableCols = this.getFocusableCols();\n        var focusableRows = this.getFocusableRows();\n        var curColIndex = focusableCols.indexOf(curCol);\n        var curRowIndex = focusableRows.indexOf(curRow);\n\n        // could not find column in focusable Columns so set it to 0\n        if (curColIndex === -1) {\n          curColIndex = 0;\n        }\n\n        var pageSize = this.bodyContainer.minRowsToRender();\n        if (curRowIndex - pageSize < 0) {\n          return new GridRowColumn(focusableRows[0], focusableCols[curColIndex]); // return first row\n        }\n        else {\n          // up one page\n          return new GridRowColumn(focusableRows[curRowIndex - pageSize], focusableCols[curColIndex]);\n        }\n      };\n      return UiGridCellNav;\n    }]);\n\n  /**\n   *  @ngdoc service\n   *  @name ui.grid.cellNav.service:uiGridCellNavService\n   *\n   *  @description Services for cell navigation features. If you don't like the key maps we use,\n   *  or the direction cells navigation, override with a service decorator (see angular docs)\n   */\n  module.service('uiGridCellNavService', ['uiGridConstants', 'uiGridCellNavConstants', '$q', 'uiGridCellNavFactory',\n    function (uiGridConstants, uiGridCellNavConstants, $q, UiGridCellNav) {\n\n      var service = {\n\n        initializeGrid: function (grid) {\n          grid.registerColumnBuilder(service.cellNavColumnBuilder);\n\n\n          /**\n           * @ngdoc object\n           * @name ui.grid.cellNav.Grid:cellNav\n           * @description cellNav properties added to grid class\n           */\n          grid.cellNav = {};\n          grid.cellNav.lastRowCol = null;\n          grid.cellNav.focusedCells = [];\n\n          service.defaultGridOptions(grid.options);\n\n          /**\n           *  @ngdoc object\n           *  @name ui.grid.cellNav.api:PublicApi\n           *\n           *  @description Public Api for cellNav feature\n           */\n          var publicApi = {\n            events: {\n              cellNav: {\n                /**\n                 * @ngdoc event\n                 * @name navigate\n                 * @eventOf  ui.grid.cellNav.api:PublicApi\n                 * @description raised when the active cell is changed\n                 * <pre>\n                 *      gridApi.cellNav.on.navigate(scope,function(newRowcol, oldRowCol) {})\n                 * </pre>\n                 * @param {object} newRowCol new position\n                 * @param {object} oldRowCol old position\n                 */\n                navigate: function (newRowCol, oldRowCol) {},\n                /**\n                 * @ngdoc event\n                 * @name viewPortKeyDown\n                 * @eventOf  ui.grid.cellNav.api:PublicApi\n                 * @description  is raised when the viewPort receives a keyDown event. Cells never get focus in uiGrid\n                 * due to the difficulties of setting focus on a cell that is not visible in the viewport.  Use this\n                 * event whenever you need a keydown event on a cell\n                 * <br/>\n                 * @param {object} event keydown event\n                 * @param {object} rowCol current rowCol position\n                 */\n                viewPortKeyDown: function (event, rowCol) {},\n\n                /**\n                 * @ngdoc event\n                 * @name viewPortKeyPress\n                 * @eventOf  ui.grid.cellNav.api:PublicApi\n                 * @description  is raised when the viewPort receives a keyPress event. Cells never get focus in uiGrid\n                 * due to the difficulties of setting focus on a cell that is not visible in the viewport.  Use this\n                 * event whenever you need a keypress event on a cell\n                 * <br/>\n                 * @param {object} event keypress event\n                 * @param {object} rowCol current rowCol position\n                 */\n                viewPortKeyPress: function (event, rowCol) {}\n              }\n            },\n            methods: {\n              cellNav: {\n                /**\n                 * @ngdoc function\n                 * @name scrollToFocus\n                 * @methodOf  ui.grid.cellNav.api:PublicApi\n                 * @description brings the specified row and column into view, and sets focus\n                 * to that cell\n                 * @param {object} rowEntity gridOptions.data[] array instance to make visible and set focus\n                 * @param {object} colDef to make visible and set focus\n                 * @returns {promise} a promise that is resolved after any scrolling is finished\n                 */\n                scrollToFocus: function (rowEntity, colDef) {\n                  return service.scrollToFocus(grid, rowEntity, colDef);\n                },\n\n                /**\n                 * @ngdoc function\n                 * @name getFocusedCell\n                 * @methodOf  ui.grid.cellNav.api:PublicApi\n                 * @description returns the current (or last if Grid does not have focus) focused row and column\n                 * <br> value is null if no selection has occurred\n                 */\n                getFocusedCell: function () {\n                  return grid.cellNav.lastRowCol;\n                },\n\n                /**\n                 * @ngdoc function\n                 * @name getCurrentSelection\n                 * @methodOf  ui.grid.cellNav.api:PublicApi\n                 * @description returns an array containing the current selection\n                 * <br> array is empty if no selection has occurred\n                 */\n                getCurrentSelection: function () {\n                  return grid.cellNav.focusedCells;\n                },\n\n                /**\n                 * @ngdoc function\n                 * @name rowColSelectIndex\n                 * @methodOf  ui.grid.cellNav.api:PublicApi\n                 * @description returns the index in the order in which the GridRowColumn was selected, returns -1 if the GridRowColumn\n                 * isn't selected\n                 * @param {object} rowCol the rowCol to evaluate\n                 */\n                rowColSelectIndex: function (rowCol) {\n                  // return gridUtil.arrayContainsObjectWithProperty(grid.cellNav.focusedCells, 'col.uid', rowCol.col.uid) &&\n                  var index = -1;\n                  for (var i = 0; i < grid.cellNav.focusedCells.length; i++) {\n                    if (grid.cellNav.focusedCells[i].col.uid === rowCol.col.uid &&\n                      grid.cellNav.focusedCells[i].row.uid === rowCol.row.uid) {\n                      index = i;\n                      break;\n                    }\n                  }\n                  return index;\n                }\n              }\n            }\n          };\n\n          grid.api.registerEventsFromObject(publicApi.events);\n\n          grid.api.registerMethodsFromObject(publicApi.methods);\n        },\n\n        defaultGridOptions: function (gridOptions) {\n          /**\n           *  @ngdoc object\n           *  @name ui.grid.cellNav.api:GridOptions\n           *\n           *  @description GridOptions for cellNav feature, these are available to be\n           *  set using the ui-grid {@link ui.grid.class:GridOptions gridOptions}\n           */\n\n          /**\n           *  @ngdoc object\n           *  @name modifierKeysToMultiSelectCells\n           *  @propertyOf  ui.grid.cellNav.api:GridOptions\n           *  @description Enable multiple cell selection only when using the ctrlKey or shiftKey.\n           *  <br/>Defaults to false\n           */\n          gridOptions.modifierKeysToMultiSelectCells = gridOptions.modifierKeysToMultiSelectCells === true;\n\n          /**\n           *  @ngdoc array\n           *  @name keyDownOverrides\n           *  @propertyOf  ui.grid.cellNav.api:GridOptions\n           *  @description An array of event objects to override on keydown. If an event is overridden, the viewPortKeyDown event will\n           *               be raised with the overridden events, allowing custom keydown behavior.\n           *  <br/>Defaults to []\n           */\n          gridOptions.keyDownOverrides = gridOptions.keyDownOverrides || [];\n\n        },\n\n        /**\n         * @ngdoc service\n         * @name decorateRenderContainers\n         * @methodOf ui.grid.cellNav.service:uiGridCellNavService\n         * @description  decorates grid renderContainers with cellNav functions\n         */\n        decorateRenderContainers: function (grid) {\n\n          var rightContainer = grid.hasRightContainer() ? grid.renderContainers.right : null;\n          var leftContainer = grid.hasLeftContainer() ? grid.renderContainers.left : null;\n\n          if (leftContainer !== null) {\n            grid.renderContainers.left.cellNav = new UiGridCellNav(grid.renderContainers.body, leftContainer, rightContainer, grid.renderContainers.body);\n          }\n          if (rightContainer !== null) {\n            grid.renderContainers.right.cellNav = new UiGridCellNav(grid.renderContainers.body, rightContainer, grid.renderContainers.body, leftContainer);\n          }\n\n          grid.renderContainers.body.cellNav = new UiGridCellNav(grid.renderContainers.body, grid.renderContainers.body, leftContainer, rightContainer);\n        },\n\n        /**\n         * @ngdoc service\n         * @name getDirection\n         * @methodOf ui.grid.cellNav.service:uiGridCellNavService\n         * @description  determines which direction to for a given keyDown event\n         * @returns {uiGridCellNavConstants.direction} direction\n         */\n        getDirection: function (evt) {\n          if (evt.keyCode === uiGridConstants.keymap.LEFT ||\n            (evt.keyCode === uiGridConstants.keymap.TAB && evt.shiftKey)) {\n            return uiGridCellNavConstants.direction.LEFT;\n          }\n          if (evt.keyCode === uiGridConstants.keymap.RIGHT ||\n            evt.keyCode === uiGridConstants.keymap.TAB) {\n            return uiGridCellNavConstants.direction.RIGHT;\n          }\n\n          if (evt.keyCode === uiGridConstants.keymap.UP ||\n            (evt.keyCode === uiGridConstants.keymap.ENTER && evt.shiftKey) ) {\n            return uiGridCellNavConstants.direction.UP;\n          }\n\n          if (evt.keyCode === uiGridConstants.keymap.PG_UP) {\n            return uiGridCellNavConstants.direction.PG_UP;\n          }\n\n          if (evt.keyCode === uiGridConstants.keymap.DOWN ||\n            evt.keyCode === uiGridConstants.keymap.ENTER && !(evt.ctrlKey || evt.altKey)) {\n            return uiGridCellNavConstants.direction.DOWN;\n          }\n\n          if (evt.keyCode === uiGridConstants.keymap.PG_DOWN) {\n            return uiGridCellNavConstants.direction.PG_DOWN;\n          }\n\n          return null;\n        },\n\n        /**\n         * @ngdoc service\n         * @name cellNavColumnBuilder\n         * @methodOf ui.grid.cellNav.service:uiGridCellNavService\n         * @description columnBuilder function that adds cell navigation properties to grid column\n         * @returns {promise} promise that will load any needed templates when resolved\n         */\n        cellNavColumnBuilder: function (colDef, col, gridOptions) {\n          var promises = [];\n\n          /**\n           *  @ngdoc object\n           *  @name ui.grid.cellNav.api:ColumnDef\n           *\n           *  @description Column Definitions for cellNav feature, these are available to be\n           *  set using the ui-grid {@link ui.grid.class:GridOptions.columnDef gridOptions.columnDefs}\n           */\n\n          /**\n           *  @ngdoc object\n           *  @name allowCellFocus\n           *  @propertyOf  ui.grid.cellNav.api:ColumnDef\n           *  @description Enable focus on a cell within this column.\n           *  <br/>Defaults to true\n           */\n          colDef.allowCellFocus = colDef.allowCellFocus === undefined ? true : colDef.allowCellFocus;\n\n          return $q.all(promises);\n        },\n\n        /**\n         * @ngdoc method\n         * @methodOf ui.grid.cellNav.service:uiGridCellNavService\n         * @name scrollToFocus\n         * @description Scroll the grid such that the specified\n         * row and column is in view, and set focus to the cell in that row and column\n         * @param {Grid} grid the grid you'd like to act upon, usually available\n         * from gridApi.grid\n         * @param {object} rowEntity gridOptions.data[] array instance to make visible and set focus to\n         * @param {object} colDef to make visible and set focus to\n         * @returns {promise} a promise that is resolved after any scrolling is finished\n         */\n        scrollToFocus: function (grid, rowEntity, colDef) {\n          var gridRow = null, gridCol = null;\n\n          if (typeof(rowEntity) !== 'undefined' && rowEntity !== null) {\n            gridRow = grid.getRow(rowEntity);\n          }\n\n          if (typeof(colDef) !== 'undefined' && colDef !== null) {\n            gridCol = grid.getColumn(colDef.name ? colDef.name : colDef.field);\n          }\n          return grid.api.core.scrollToIfNecessary(gridRow, gridCol).then(function () {\n            var rowCol = { row: gridRow, col: gridCol };\n\n            // Broadcast the navigation\n            if (gridRow !== null && gridCol !== null) {\n              grid.cellNav.broadcastCellNav(rowCol, null, null);\n            }\n          });\n        },\n\n\n        /**\n         * @ngdoc method\n         * @methodOf ui.grid.cellNav.service:uiGridCellNavService\n         * @name getLeftWidth\n         * @description Get the current drawn width of the columns in the\n         * grid up to the numbered column, and add an apportionment for the\n         * column that we're on.  So if we are on column 0, we want to scroll\n         * 0% (i.e. exclude this column from calc).  If we're on the last column\n         * we want to scroll to 100% (i.e. include this column in the calc). So\n         * we include (thisColIndex / totalNumberCols) % of this column width\n         * @param {Grid} grid the grid you'd like to act upon, usually available\n         * from gridApi.grid\n         * @param {GridColumn} upToCol the column to total up to and including\n         */\n        getLeftWidth: function (grid, upToCol) {\n          var width = 0;\n\n          if (!upToCol) {\n            return width;\n          }\n\n          var lastIndex = grid.renderContainers.body.visibleColumnCache.indexOf( upToCol );\n\n          // total column widths up-to but not including the passed in column\n          grid.renderContainers.body.visibleColumnCache.forEach( function( col, index ) {\n            if ( index < lastIndex ) {\n              width += col.drawnWidth;\n            }\n          });\n\n          // pro-rata the final column based on % of total columns.\n          var percentage = lastIndex === 0 ? 0 : (lastIndex + 1) / grid.renderContainers.body.visibleColumnCache.length;\n          width += upToCol.drawnWidth * percentage;\n\n          return width;\n        }\n      };\n\n      return service;\n    }]);\n\n  /**\n   *  @ngdoc directive\n   *  @name ui.grid.cellNav.directive:uiCellNav\n   *  @element div\n   *  @restrict EA\n   *\n   *  @description Adds cell navigation features to the grid columns\n   *\n   *  @example\n   <example module=\"app\">\n   <file name=\"app.js\">\n   var app = angular.module('app', ['ui.grid', 'ui.grid.cellNav']);\n\n   app.controller('MainCtrl', ['$scope', function ($scope) {\n      $scope.data = [\n        { name: 'Bob', title: 'CEO' },\n            { name: 'Frank', title: 'Lowly Developer' }\n      ];\n\n      $scope.columnDefs = [\n        {name: 'name'},\n        {name: 'title'}\n      ];\n    }]);\n   </file>\n   <file name=\"index.ced81ed4.html\">\n   <div ng-controller=\"MainCtrl\">\n   <div ui-grid=\"{ data: data, columnDefs: columnDefs }\" ui-grid-cellnav></div>\n   </div>\n   </file>\n   </example>\n   */\n  module.directive('uiGridCellnav', ['uiGridCellNavService', 'uiGridCellNavConstants', 'uiGridConstants', 'GridRowColumn', '$compile', 'i18nService',\n    function (uiGridCellNavService, uiGridCellNavConstants, uiGridConstants, GridRowColumn, $compile, i18nService) {\n      return {\n        replace: true,\n        priority: -150,\n        require: '^uiGrid',\n        scope: false,\n        controller: function () {},\n        compile: function () {\n          return {\n            pre: function ($scope, $elm, $attrs, uiGridCtrl) {\n              var _scope = $scope;\n\n              var grid = uiGridCtrl.grid;\n              uiGridCellNavService.initializeGrid(grid);\n\n              uiGridCtrl.cellNav = {};\n\n              // Ensure that the object has all of the methods we expect it to\n              uiGridCtrl.cellNav.makeRowCol = function (obj) {\n                if (!(obj instanceof GridRowColumn)) {\n                  obj = new GridRowColumn(obj.row, obj.col);\n                }\n                return obj;\n              };\n\n              uiGridCtrl.cellNav.getActiveCell = function () {\n                var elms = $elm[0].getElementsByClassName('ui-grid-cell-focus');\n                if (elms.length > 0) {\n                  return elms[0];\n                }\n\n                return undefined;\n              };\n\n              uiGridCtrl.cellNav.broadcastCellNav = grid.cellNav.broadcastCellNav = function (newRowCol, modifierDown, originEvt) {\n                modifierDown = !(modifierDown === undefined || !modifierDown);\n\n                newRowCol = uiGridCtrl.cellNav.makeRowCol(newRowCol);\n\n                uiGridCtrl.cellNav.broadcastFocus(newRowCol, modifierDown, originEvt);\n                _scope.$broadcast(uiGridCellNavConstants.CELL_NAV_EVENT, newRowCol, modifierDown, originEvt);\n              };\n\n              uiGridCtrl.cellNav.clearFocus = grid.cellNav.clearFocus = function () {\n                grid.cellNav.focusedCells = [];\n                _scope.$broadcast(uiGridCellNavConstants.CELL_NAV_EVENT);\n              };\n\n              uiGridCtrl.cellNav.broadcastFocus = function (rowCol, modifierDown, originEvt) {\n                modifierDown = !(modifierDown === undefined || !modifierDown);\n\n                rowCol = uiGridCtrl.cellNav.makeRowCol(rowCol);\n\n                var row = rowCol.row,\n                  col = rowCol.col;\n\n                var rowColSelectIndex = uiGridCtrl.grid.api.cellNav.rowColSelectIndex(rowCol);\n\n                if (grid.cellNav.lastRowCol === null || rowColSelectIndex === -1 || (grid.cellNav.lastRowCol.col === col && grid.cellNav.lastRowCol.row === row)) {\n                  var newRowCol = new GridRowColumn(row, col);\n\n                  if (grid.cellNav.lastRowCol === null || grid.cellNav.lastRowCol.row !== newRowCol.row || grid.cellNav.lastRowCol.col !== newRowCol.col || grid.options.enableCellEditOnFocus) {\n                    grid.api.cellNav.raise.navigate(newRowCol, grid.cellNav.lastRowCol, originEvt);\n                    grid.cellNav.lastRowCol = newRowCol;\n                  }\n                  if (uiGridCtrl.grid.options.modifierKeysToMultiSelectCells && modifierDown) {\n                    grid.cellNav.focusedCells.push(rowCol);\n                  } else {\n                    grid.cellNav.focusedCells = [rowCol];\n                  }\n                } else if (grid.options.modifierKeysToMultiSelectCells && modifierDown &&\n                  rowColSelectIndex >= 0) {\n\n                  grid.cellNav.focusedCells.splice(rowColSelectIndex, 1);\n                }\n              };\n\n              uiGridCtrl.cellNav.handleKeyDown = function (evt) {\n                var direction = uiGridCellNavService.getDirection(evt);\n                if (direction === null) {\n                  return null;\n                }\n\n                var containerId = 'body';\n                if (evt.uiGridTargetRenderContainerId) {\n                  containerId = evt.uiGridTargetRenderContainerId;\n                }\n\n                // Get the last-focused row+col combo\n                var lastRowCol = uiGridCtrl.grid.api.cellNav.getFocusedCell();\n                if (lastRowCol) {\n                  // Figure out which new row+combo we're navigating to\n                  var rowCol = uiGridCtrl.grid.renderContainers[containerId].cellNav.getNextRowCol(direction, lastRowCol.row, lastRowCol.col);\n                  var focusableCols = uiGridCtrl.grid.renderContainers[containerId].cellNav.getFocusableCols();\n                  var rowColSelectIndex = uiGridCtrl.grid.api.cellNav.rowColSelectIndex(rowCol);\n                  // Shift+tab on top-left cell should exit cellnav on render container\n                  if (\n                    // Navigating left\n                    direction === uiGridCellNavConstants.direction.LEFT &&\n                    // New col is last col (i.e. wrap around)\n                    rowCol.col === focusableCols[focusableCols.length - 1] &&\n                    // Staying on same row, which means we're at first row\n                    rowCol.row === lastRowCol.row &&\n                    evt.keyCode === uiGridConstants.keymap.TAB &&\n                    evt.shiftKey\n                  ) {\n                    grid.cellNav.focusedCells.splice(rowColSelectIndex, 1);\n                    uiGridCtrl.cellNav.clearFocus();\n                    return true;\n                  }\n                  // Tab on bottom-right cell should exit cellnav on render container\n                  else if (\n                    direction === uiGridCellNavConstants.direction.RIGHT &&\n                    // New col is first col (i.e. wrap around)\n                    rowCol.col === focusableCols[0] &&\n                    // Staying on same row, which means we're at first row\n                    rowCol.row === lastRowCol.row &&\n                    evt.keyCode === uiGridConstants.keymap.TAB &&\n                    !evt.shiftKey\n                  ) {\n                    grid.cellNav.focusedCells.splice(rowColSelectIndex, 1);\n                    uiGridCtrl.cellNav.clearFocus();\n                    return true;\n                  }\n\n                  // Scroll to the new cell, if it's not completely visible within the render container's viewport\n                  grid.scrollToIfNecessary(rowCol.row, rowCol.col).then(function () {\n                    uiGridCtrl.cellNav.broadcastCellNav(rowCol, null, evt);\n                  });\n\n\n                  evt.stopPropagation();\n                  evt.preventDefault();\n\n                  return false;\n                }\n              };\n            },\n            post: function ($scope, $elm, $attrs, uiGridCtrl) {\n              var grid = uiGridCtrl.grid;\n              var usesAria = true;\n\n              // Detect whether we are using ngAria\n              // (if ngAria module is not used then the stuff inside addAriaLiveRegion\n              // is not used and provides extra fluff)\n              try {\n                angular.module('ngAria');\n              }\n              catch (err) {\n                usesAria = false;\n              }\n\n              function addAriaLiveRegion() {\n                // Thanks to google docs for the inspiration behind how to do this\n                // XXX: Why is this entire mess nessasary?\n                // Because browsers take a lot of coercing to get them to read out live regions\n                // http://www.paciellogroup.com/blog/2012/06/html5-accessibility-chops-aria-rolealert-browser-support/\n                var ariaNotifierDomElt = '<div ' +\n                                           'id=\"' + grid.id +'-aria-speakable\" ' +\n                                           'class=\"ui-grid-a11y-ariascreenreader-speakable ui-grid-offscreen\" ' +\n                                           'aria-live=\"assertive\" ' +\n                                           'role=\"alert\" ' +\n                                           'aria-atomic=\"true\" ' +\n                                           'aria-hidden=\"false\" ' +\n                                           'aria-relevant=\"additions\" ' +\n                                           '>' +\n                                           '&nbsp;' +\n                                         '</div>';\n\n                var ariaNotifier = $compile(ariaNotifierDomElt)($scope);\n                $elm.prepend(ariaNotifier);\n                $scope.$on(uiGridCellNavConstants.CELL_NAV_EVENT, function (evt, rowCol, modifierDown, originEvt) {\n                  /*\n                   * If the cell nav event was because of a focus event then we don't want to\n                   * change the notifier text.\n                   * Reasoning: Voice Over fires a focus events when moving arround the grid.\n                   * If the screen reader is handing the grid nav properly then we don't need to\n                   * use the alert to notify the user of the movement.\n                   * In all other cases we do want a notification event.\n                   */\n                  if (originEvt && originEvt.type === 'focus') {return;}\n\n                  function setNotifyText(text) {\n                    if (text === ariaNotifier.text().trim()) {return;}\n                    ariaNotifier[0].style.clip = 'rect(0px,0px,0px,0px)';\n                    /*\n                     * This is how google docs handles clearing the div. Seems to work better than setting the text of the div to ''\n                     */\n                    ariaNotifier[0].innerHTML = \"\";\n                    ariaNotifier[0].style.visibility = 'hidden';\n                    ariaNotifier[0].style.visibility = 'visible';\n                    if (text !== '') {\n                      ariaNotifier[0].style.clip = 'auto';\n                      /*\n                       * The space after the text is something that google docs does.\n                       */\n                      ariaNotifier[0].appendChild(document.createTextNode(text + \" \"));\n                      ariaNotifier[0].style.visibility = 'hidden';\n                      ariaNotifier[0].style.visibility = 'visible';\n                    }\n                  }\n\n                  function getAppendedColumnHeaderText(col) {\n                    return ', ' + i18nService.getSafeText('headerCell.aria.column') + ' ' + col.displayName;\n                  }\n\n                  function getCellDisplayValue(currentRowColumn) {\n                    var prefix = '';\n\n                    if (currentRowColumn.col.field === 'selectionRowHeaderCol') {\n                      // This is the case when the 'selection' feature is used in the grid and the user has moved\n                      // to or inside of the left grid container which holds the checkboxes for selecting rows.\n                      // This is necessary for Accessibility. Without this a screen reader cannot determine if the row\n                      // is or is not currently selected.\n                        prefix = (currentRowColumn.row.isSelected ? i18nService.getSafeText('search.aria.selected') : i18nService.getSafeText('search.aria.notSelected')) + ', ';\n                      }\n                      return prefix + grid.getCellDisplayValue(currentRowColumn.row, currentRowColumn.col);\n                    }\n\n                  var values = [];\n                  var currentSelection = grid.api.cellNav.getCurrentSelection();\n                  for (var i = 0; i < currentSelection.length; i++) {\n                    var cellDisplayValue = getCellDisplayValue(currentSelection[i]) + getAppendedColumnHeaderText(currentSelection[i].col);\n                    values.push(cellDisplayValue);\n                  }\n                  setNotifyText(values.toString());\n                });\n              }\n              // Only add the ngAria stuff it will be used\n              if (usesAria) {\n                addAriaLiveRegion();\n              }\n            }\n          };\n        }\n      };\n    }]);\n\n  module.directive('uiGridRenderContainer', ['$timeout', 'gridUtil', 'uiGridCellNavService', '$compile','uiGridCellNavConstants',\n    function ($timeout, gridUtil, uiGridCellNavService, $compile, uiGridCellNavConstants) {\n      return {\n        replace: true,\n        priority: -99999, // this needs to run very last\n        require: ['^uiGrid', 'uiGridRenderContainer', '?^uiGridCellnav'],\n        scope: false,\n        compile: function () {\n          return {\n            post: function ($scope, $elm, $attrs, controllers) {\n              var uiGridCtrl = controllers[0],\n                 renderContainerCtrl = controllers[1],\n                 uiGridCellnavCtrl = controllers[2];\n\n              // Skip attaching cell-nav specific logic if the directive is not attached above us\n              if (!uiGridCtrl.grid.api.cellNav) { return; }\n\n              var containerId = renderContainerCtrl.containerId;\n\n              var grid = uiGridCtrl.grid;\n\n              // run each time a render container is created\n              uiGridCellNavService.decorateRenderContainers(grid);\n\n              // focusser only created for body\n              if (containerId !== 'body') {\n                return;\n              }\n\n              if (uiGridCtrl.grid.options.modifierKeysToMultiSelectCells) {\n                $elm.attr('aria-multiselectable', true);\n              }\n              else {\n                $elm.attr('aria-multiselectable', false);\n              }\n\n              // add an element with no dimensions that can be used to set focus and capture keystrokes\n              var focuser = $compile('<div class=\"ui-grid-focuser\" role=\"region\" aria-live=\"assertive\" aria-atomic=\"false\" tabindex=\"0\" aria-controls=\"' + grid.id +'-aria-speakable '+ grid.id + '-grid-container' +'\" aria-owns=\"' + grid.id + '-grid-container' + '\"></div>')($scope);\n              $elm.append(focuser);\n\n              focuser.on('focus', function (evt) {\n                evt.uiGridTargetRenderContainerId = containerId;\n                var rowCol = uiGridCtrl.grid.api.cellNav.getFocusedCell();\n                if (rowCol === null) {\n                  rowCol = uiGridCtrl.grid.renderContainers[containerId].cellNav.getNextRowCol(uiGridCellNavConstants.direction.DOWN, null, null);\n                  if (rowCol.row && rowCol.col) {\n                    uiGridCtrl.cellNav.broadcastCellNav(rowCol);\n                  }\n                }\n              });\n\n              uiGridCellnavCtrl.setAriaActivedescendant = function(id) {\n                $elm.attr('aria-activedescendant', id);\n              };\n\n              uiGridCellnavCtrl.removeAriaActivedescendant = function(id) {\n                if ($elm.attr('aria-activedescendant') === id) {\n                  $elm.attr('aria-activedescendant', '');\n                }\n              };\n\n\n              uiGridCtrl.focus = function () {\n                gridUtil.focus.byElement(focuser[0]);\n                // allow for first time grid focus\n              };\n\n              var viewPortKeyDownWasRaisedForRowCol = null;\n              // Bind to keydown events in the render container\n              focuser.on('keydown', function (evt) {\n                evt.uiGridTargetRenderContainerId = containerId;\n                var rowCol = uiGridCtrl.grid.api.cellNav.getFocusedCell();\n                var raiseViewPortKeyDown = uiGridCtrl.grid.options.keyDownOverrides.some(function (override) {\n                  return Object.keys(override).every( function (property) {\n                      return override[property] === evt[property];\n                  });\n                });\n                var result = raiseViewPortKeyDown ? null : uiGridCtrl.cellNav.handleKeyDown(evt);\n                if (result === null) {\n                  uiGridCtrl.grid.api.cellNav.raise.viewPortKeyDown(evt, rowCol, uiGridCtrl.cellNav.handleKeyDown);\n                  viewPortKeyDownWasRaisedForRowCol = rowCol;\n                }\n              });\n              // Bind to keypress events in the render container\n              // keypress events are needed by edit function so the key press\n              // that initiated an edit is not lost\n              // must fire the event in a timeout so the editor can\n              // initialize and subscribe to the event on another event loop\n              focuser.on('keypress', function (evt) {\n                if (viewPortKeyDownWasRaisedForRowCol) {\n                  $timeout(function () {\n                    uiGridCtrl.grid.api.cellNav.raise.viewPortKeyPress(evt, viewPortKeyDownWasRaisedForRowCol);\n                  }, 4);\n\n                  viewPortKeyDownWasRaisedForRowCol = null;\n                }\n              });\n\n              $scope.$on('$destroy', function() {\n                // Remove all event handlers associated with this focuser.\n                focuser.off();\n              });\n            }\n          };\n        }\n      };\n    }]);\n\n  module.directive('uiGridViewport',\n    function () {\n      return {\n        replace: true,\n        priority: -99999, // this needs to run very last\n        require: ['^uiGrid', '^uiGridRenderContainer', '?^uiGridCellnav'],\n        scope: false,\n        compile: function () {\n          return {\n            pre: function ($scope, $elm, $attrs, uiGridCtrl) {\n            },\n            post: function ($scope, $elm, $attrs, controllers) {\n              var uiGridCtrl = controllers[0],\n                renderContainerCtrl = controllers[1];\n\n              // Skip attaching cell-nav specific logic if the directive is not attached above us\n              if (!uiGridCtrl.grid.api.cellNav) { return; }\n\n              var containerId = renderContainerCtrl.containerId;\n              // no need to process for other containers\n              if (containerId !== 'body') {\n                return;\n              }\n\n              var grid = uiGridCtrl.grid;\n\n              grid.api.core.on.scrollBegin($scope, function () {\n\n                // Skip if there's no currently-focused cell\n                var lastRowCol = uiGridCtrl.grid.api.cellNav.getFocusedCell();\n                if (lastRowCol === null) {\n                  return;\n                }\n\n                // if not in my container, move on\n                // todo: worry about horiz scroll\n                if (!renderContainerCtrl.colContainer.containsColumn(lastRowCol.col)) {\n                  return;\n                }\n\n                uiGridCtrl.cellNav.clearFocus();\n\n              });\n\n              grid.api.core.on.scrollEnd($scope, function (args) {\n                // Skip if there's no currently-focused cell\n                var lastRowCol = uiGridCtrl.grid.api.cellNav.getFocusedCell();\n                if (lastRowCol === null) {\n                  return;\n                }\n\n                // if not in my container, move on\n                // todo: worry about horiz scroll\n                if (!renderContainerCtrl.colContainer.containsColumn(lastRowCol.col)) {\n                  return;\n                }\n\n                uiGridCtrl.cellNav.broadcastCellNav(lastRowCol);\n              });\n\n              grid.api.cellNav.on.navigate($scope, function () {\n                // focus again because it can be lost\n                 uiGridCtrl.focus();\n              });\n            }\n          };\n        }\n      };\n    });\n\n  /**\n   *  @ngdoc directive\n   *  @name ui.grid.cellNav.directive:uiGridCell\n   *  @element div\n   *  @restrict A\n   *  @description Stacks on top of ui.grid.uiGridCell to provide cell navigation\n   */\n  module.directive('uiGridCell', ['uiGridCellNavConstants', 'uiGridConstants', 'GridRowColumn',\n    function (uiGridCellNavConstants, uiGridConstants, GridRowColumn) {\n      return {\n        priority: -150, // run after default uiGridCell directive and ui.grid.edit uiGridCell\n        restrict: 'A',\n        require: ['^uiGrid', '?^uiGridCellnav'],\n        scope: false,\n        link: function ($scope, $elm, $attrs, controllers) {\n          var uiGridCtrl = controllers[0],\n              uiGridCellnavCtrl = controllers[1];\n          // Skip attaching cell-nav specific logic if the directive is not attached above us\n          if (!uiGridCtrl.grid.api.cellNav) { return; }\n\n          if (!$scope.col.colDef.allowCellFocus) {\n            return;\n          }\n\n          // Convinience local variables\n          var grid = uiGridCtrl.grid;\n          $scope.focused = false;\n\n          // Make this cell focusable but only with javascript/a mouse click\n          $elm.attr('tabindex', -1);\n\n          // When a cell is clicked, broadcast a cellNav event saying that this row+col combo is now focused\n          $elm.find('div').on('click', function (evt) {\n            uiGridCtrl.cellNav.broadcastCellNav(new GridRowColumn($scope.row, $scope.col), evt.ctrlKey || evt.metaKey, evt);\n\n            evt.stopPropagation();\n            $scope.$apply();\n          });\n\n\n          /*\n           * XXX Hack for screen readers.\n           * This allows the grid to focus using only the screen reader cursor.\n           * Since the focus event doesn't include key press information we can't use it\n           * as our primary source of the event.\n           */\n          $elm.on('mousedown', preventMouseDown);\n\n          // turn on and off for edit events\n          if (uiGridCtrl.grid.api.edit) {\n            uiGridCtrl.grid.api.edit.on.beginCellEdit($scope, function () {\n              $elm.off('mousedown', preventMouseDown);\n            });\n\n            uiGridCtrl.grid.api.edit.on.afterCellEdit($scope, function () {\n              $elm.on('mousedown', preventMouseDown);\n            });\n\n            uiGridCtrl.grid.api.edit.on.cancelCellEdit($scope, function () {\n              $elm.on('mousedown', preventMouseDown);\n            });\n          }\n\n          // In case we created a new row, and we are the new created row by ngRepeat\n          // then this cell content might have been selected previously\n          refreshCellFocus();\n\n          function preventMouseDown(evt) {\n            // Prevents the foucus event from firing if the click event is already going to fire.\n            // If both events fire it will cause bouncing behavior.\n            evt.preventDefault();\n          }\n\n          // You can only focus on elements with a tabindex value\n          $elm.on('focus', function (evt) {\n            uiGridCtrl.cellNav.broadcastCellNav(new GridRowColumn($scope.row, $scope.col), false, evt);\n            evt.stopPropagation();\n            $scope.$apply();\n          });\n\n          // This event is fired for all cells.  If the cell matches, then focus is set\n          $scope.$on(uiGridCellNavConstants.CELL_NAV_EVENT, refreshCellFocus);\n\n          // Refresh cell focus when a new row id added to the grid\n          var dataChangeDereg = uiGridCtrl.grid.registerDataChangeCallback(function (grid) {\n            // Clear the focus if it's set to avoid the wrong cell getting focused during\n            // a short period of time (from now until $timeout function executed)\n            clearFocus();\n\n            $scope.$applyAsync(refreshCellFocus);\n          }, [uiGridConstants.dataChange.ROW]);\n\n          function refreshCellFocus() {\n            var isFocused = grid.cellNav.focusedCells.some(function (focusedRowCol, index) {\n              return (focusedRowCol.row === $scope.row && focusedRowCol.col === $scope.col);\n            });\n            if (isFocused) {\n              setFocused();\n            } else {\n              clearFocus();\n            }\n          }\n\n          function setFocused() {\n            if (!$scope.focused) {\n              var div = $elm.find('div');\n              div.addClass('ui-grid-cell-focus');\n              $elm.attr('aria-selected', true);\n              uiGridCellnavCtrl.setAriaActivedescendant($elm.attr('id'));\n              $scope.focused = true;\n            }\n          }\n\n          function clearFocus() {\n            if ($scope.focused) {\n              var div = $elm.find('div');\n              div.removeClass('ui-grid-cell-focus');\n              $elm.attr('aria-selected', false);\n              uiGridCellnavCtrl.removeAriaActivedescendant($elm.attr('id'));\n              $scope.focused = false;\n            }\n          }\n\n          $scope.$on('$destroy', function () {\n            dataChangeDereg();\n\n            // .off withouth paramaters removes all handlers\n            $elm.find('div').off();\n            $elm.off();\n          });\n        }\n      };\n    }]);\n})();\n\n(function () {\n  'use strict';\n\n  /**\n   * @ngdoc object\n   * @name ui.grid.service:uiGridConstants\n   * @description Constants for use across many grid features\n   *\n   */\n\n\n  angular.module('ui.grid').constant('uiGridConstants', {\n    LOG_DEBUG_MESSAGES: true,\n    LOG_WARN_MESSAGES: true,\n    LOG_ERROR_MESSAGES: true,\n    CUSTOM_FILTERS: /CUSTOM_FILTERS/g,\n    COL_FIELD: /COL_FIELD/g,\n    MODEL_COL_FIELD: /MODEL_COL_FIELD/g,\n    TOOLTIP: /title=\\\"TOOLTIP\\\"/g,\n    DISPLAY_CELL_TEMPLATE: /DISPLAY_CELL_TEMPLATE/g,\n    TEMPLATE_REGEXP: /<.+>/,\n    FUNC_REGEXP: /(\\([^)]*\\))?$/,\n    DOT_REGEXP: /\\./g,\n    APOS_REGEXP: /'/g,\n    BRACKET_REGEXP: /^(.*)((?:\\s*\\[\\s*\\d+\\s*\\]\\s*)|(?:\\s*\\[\\s*\"(?:[^\"\\\\]|\\\\.)*\"\\s*\\]\\s*)|(?:\\s*\\[\\s*'(?:[^'\\\\]|\\\\.)*'\\s*\\]\\s*))(.*)$/,\n    COL_CLASS_PREFIX: 'ui-grid-col',\n    ENTITY_BINDING: '$$this',\n    events: {\n      GRID_SCROLL: 'uiGridScroll',\n      COLUMN_MENU_SHOWN: 'uiGridColMenuShown',\n      ITEM_DRAGGING: 'uiGridItemDragStart', // For any item being dragged\n      COLUMN_HEADER_CLICK: 'uiGridColumnHeaderClick'\n    },\n    // copied from http://www.lsauer.com/2011/08/javascript-keymap-keycodes-in-json.html\n    keymap: {\n      TAB: 9,\n      STRG: 17,\n      CAPSLOCK: 20,\n      CTRL: 17,\n      CTRLRIGHT: 18,\n      CTRLR: 18,\n      SHIFT: 16,\n      RETURN: 13,\n      ENTER: 13,\n      BACKSPACE: 8,\n      BCKSP: 8,\n      ALT: 18,\n      ALTR: 17,\n      ALTRIGHT: 17,\n      SPACE: 32,\n      WIN: 91,\n      MAC: 91,\n      FN: null,\n      PG_UP: 33,\n      PG_DOWN: 34,\n      UP: 38,\n      DOWN: 40,\n      LEFT: 37,\n      RIGHT: 39,\n      ESC: 27,\n      DEL: 46,\n      F1: 112,\n      F2: 113,\n      F3: 114,\n      F4: 115,\n      F5: 116,\n      F6: 117,\n      F7: 118,\n      F8: 119,\n      F9: 120,\n      F10: 121,\n      F11: 122,\n      F12: 123\n    },\n     /**\n     * @ngdoc object\n     * @name ASC\n     * @propertyOf ui.grid.service:uiGridConstants\n     * @description Used in {@link ui.grid.class:GridOptions.columnDef#properties_sort columnDef.sort} and\n     * {@link ui.grid.class:GridOptions.columnDef#properties_sortDirectionCycle columnDef.sortDirectionCycle}\n     * to configure the sorting direction of the column\n     */\n    ASC: 'asc',\n     /**\n     * @ngdoc object\n     * @name DESC\n     * @propertyOf ui.grid.service:uiGridConstants\n     * @description Used in {@link ui.grid.class:GridOptions.columnDef#properties_sort columnDef.sort} and\n     * {@link ui.grid.class:GridOptions.columnDef#properties_sortDirectionCycle columnDef.sortDirectionCycle}\n     * to configure the sorting direction of the column\n     */\n    DESC: 'desc',\n\n\n     /**\n     * @ngdoc object\n     * @name filter\n     * @propertyOf ui.grid.service:uiGridConstants\n     * @description Used in {@link ui.grid.class:GridOptions.columnDef#properties_filter columnDef.filter}\n     * to configure filtering on the column\n     *\n     * `SELECT` and `INPUT` are used with the `type` property of the filter, the rest are used to specify\n     * one of the built-in conditions.\n     *\n     * Available `condition` options are:\n     * - `uiGridConstants.filter.STARTS_WITH`\n     * - `uiGridConstants.filter.ENDS_WITH`\n     * - `uiGridConstants.filter.CONTAINS`\n     * - `uiGridConstants.filter.GREATER_THAN`\n     * - `uiGridConstants.filter.GREATER_THAN_OR_EQUAL`\n     * - `uiGridConstants.filter.LESS_THAN`\n     * - `uiGridConstants.filter.LESS_THAN_OR_EQUAL`\n     * - `uiGridConstants.filter.NOT_EQUAL`\n     *\n     *\n     * Available `type` options are:\n     * - `uiGridConstants.filter.SELECT` - use a dropdown box for the cell header filter field\n     * - `uiGridConstants.filter.INPUT` - use a text box for the cell header filter field\n     */\n    filter: {\n      STARTS_WITH: 2,\n      ENDS_WITH: 4,\n      EXACT: 8,\n      CONTAINS: 16,\n      GREATER_THAN: 32,\n      GREATER_THAN_OR_EQUAL: 64,\n      LESS_THAN: 128,\n      LESS_THAN_OR_EQUAL: 256,\n      NOT_EQUAL: 512,\n      SELECT: 'select',\n      INPUT: 'input'\n    },\n\n    /**\n     * @ngdoc object\n     * @name aggregationTypes\n     * @propertyOf ui.grid.service:uiGridConstants\n     * @description Used in {@link ui.grid.class:GridOptions.columnDef#properties_aggregationType columnDef.aggregationType}\n     * to specify the type of built-in aggregation the column should use.\n     *\n     * Available options are:\n     * - `uiGridConstants.aggregationTypes.sum` - add the values in this column to produce the aggregated value\n     * - `uiGridConstants.aggregationTypes.count` - count the number of rows to produce the aggregated value\n     * - `uiGridConstants.aggregationTypes.avg` - average the values in this column to produce the aggregated value\n     * - `uiGridConstants.aggregationTypes.min` - use the minimum value in this column as the aggregated value\n     * - `uiGridConstants.aggregationTypes.max` - use the maximum value in this column as the aggregated value\n     */\n    aggregationTypes: {\n      sum: 2,\n      count: 4,\n      avg: 8,\n      min: 16,\n      max: 32\n    },\n\n    /**\n     * @ngdoc array\n     * @name CURRENCY_SYMBOLS\n     * @propertyOf ui.grid.service:uiGridConstants\n     * @description A list of all presently circulating currency symbols that was copied from\n     * https://en.wikipedia.org/wiki/Currency_symbol#List_of_presently-circulating_currency_symbols\n     *\n     * Can be used on {@link ui.grid.class:rowSorter} to create a number string regex that ignores currency symbols.\n     */\n    CURRENCY_SYMBOLS: ['¤', '؋', 'Ar', 'Ƀ', '฿', 'B/.', 'Br', 'Bs.', 'Bs.F.', 'GH₵', '¢', 'c', 'Ch.', '₡', 'C$', 'D', 'ден',\n      'دج', '.د.ب', 'د.ع', 'JD', 'د.ك', 'ل.د', 'дин', 'د.ت', 'د.م.', 'د.إ', 'Db', '$', '₫', 'Esc', '€', 'ƒ', 'Ft', 'FBu',\n      'FCFA', 'CFA', 'Fr', 'FRw', 'G', 'gr', '₲', 'h', '₴', '₭', 'Kč', 'kr', 'kn', 'MK', 'ZK', 'Kz', 'K', 'L', 'Le', 'лв',\n      'E', 'lp', 'M', 'KM', 'MT', '₥', 'Nfk', '₦', 'Nu.', 'UM', 'T$', 'MOP$', '₱', 'Pt.', '£', 'ج.م.', 'LL', 'LS', 'P', 'Q',\n      'q', 'R', 'R$', 'ر.ع.', 'ر.ق', 'ر.س', '៛', 'RM', 'p', 'Rf.', '₹', '₨', 'SRe', 'Rp', '₪', 'Ksh', 'Sh.So.', 'USh', 'S/',\n      'SDR', 'сом', '৳\t', 'WS$', '₮', 'VT', '₩', '¥', 'zł'],\n\n    /**\n     * @ngdoc object\n     * @name scrollDirection\n     * @propertyOf ui.grid.service:uiGridConstants\n     * @description Set on {@link ui.grid.class:Grid#properties_scrollDirection Grid.scrollDirection},\n     * to indicate the direction the grid is currently scrolling in\n     *\n     * Available options are:\n     * - `uiGridConstants.scrollDirection.UP` - set when the grid is scrolling up\n     * - `uiGridConstants.scrollDirection.DOWN` - set when the grid is scrolling down\n     * - `uiGridConstants.scrollDirection.LEFT` - set when the grid is scrolling left\n     * - `uiGridConstants.scrollDirection.RIGHT` - set when the grid is scrolling right\n     * - `uiGridConstants.scrollDirection.NONE` - set when the grid is not scrolling, this is the default\n     */\n    scrollDirection: {\n      UP: 'up',\n      DOWN: 'down',\n      LEFT: 'left',\n      RIGHT: 'right',\n      NONE: 'none'\n\n    },\n\n    /**\n     * @ngdoc object\n     * @name dataChange\n     * @propertyOf ui.grid.service:uiGridConstants\n     * @description Used with {@link ui.grid.api:PublicApi#methods_notifyDataChange PublicApi.notifyDataChange},\n     * {@link ui.grid.class:Grid#methods_callDataChangeCallbacks Grid.callDataChangeCallbacks},\n     * and {@link ui.grid.class:Grid#methods_registerDataChangeCallback Grid.registerDataChangeCallback}\n     * to specify the type of the event(s).\n     *\n     * Available options are:\n     * - `uiGridConstants.dataChange.ALL` - listeners fired on any of these events, fires listeners on all events.\n     * - `uiGridConstants.dataChange.EDIT` - fired when the data in a cell is edited\n     * - `uiGridConstants.dataChange.ROW` - fired when a row is added or removed\n     * - `uiGridConstants.dataChange.COLUMN` - fired when the column definitions are modified\n     * - `uiGridConstants.dataChange.OPTIONS` - fired when the grid options are modified\n     */\n    dataChange: {\n      ALL: 'all',\n      EDIT: 'edit',\n      ROW: 'row',\n      COLUMN: 'column',\n      OPTIONS: 'options'\n    },\n\n    /**\n     * @ngdoc object\n     * @name scrollbars\n     * @propertyOf ui.grid.service:uiGridConstants\n     * @description Used with {@link ui.grid.class:GridOptions#properties_enableHorizontalScrollbar GridOptions.enableHorizontalScrollbar}\n     * and {@link ui.grid.class:GridOptions#properties_enableVerticalScrollbar GridOptions.enableVerticalScrollbar}\n     * to specify the scrollbar policy for that direction.\n     *\n     * Available options are:\n     * - `uiGridConstants.scrollbars.NEVER` - never show scrollbars in this direction\n     * - `uiGridConstants.scrollbars.ALWAYS` - always show scrollbars in this direction\n     * - `uiGridConstants.scrollbars.WHEN_NEEDED` - shows scrollbars in this direction when needed\n     */\n\n    scrollbars: {\n      NEVER: 0,\n      ALWAYS: 1,\n      WHEN_NEEDED: 2\n    }\n  });\n\n})();\n\nangular.module('ui.grid').directive('uiGridCell', ['$compile', '$parse', 'gridUtil', 'uiGridConstants', function ($compile, $parse, gridUtil, uiGridConstants) {\n  return {\n    priority: 0,\n    scope: false,\n    require: '?^uiGrid',\n    compile: function() {\n      return {\n        pre: function($scope, $elm, $attrs, uiGridCtrl) {\n          function compileTemplate() {\n            var compiledElementFn = $scope.col.compiledElementFn;\n\n            compiledElementFn($scope, function(clonedElement, scope) {\n              $elm.append(clonedElement);\n            });\n          }\n\n          // If the grid controller is present, use it to get the compiled cell template function\n          if (uiGridCtrl && $scope.col.compiledElementFn) {\n             compileTemplate();\n          }\n\n          // No controller, compile the element manually (for unit tests)\n          else {\n            if ( uiGridCtrl && !$scope.col.compiledElementFn ) {\n              $scope.col.getCompiledElementFn()\n                .then(function (compiledElementFn) {\n                  compiledElementFn($scope, function(clonedElement, scope) {\n                    $elm.append(clonedElement);\n                  });\n                }).catch(angular.noop);\n            }\n            else {\n              var html = $scope.col.cellTemplate\n                .replace(uiGridConstants.MODEL_COL_FIELD, 'row.entity.' + gridUtil.preEval($scope.col.field))\n                .replace(uiGridConstants.COL_FIELD, 'grid.getCellValue(row, col)');\n\n              var cellElement = $compile(html)($scope);\n              $elm.append(cellElement);\n            }\n          }\n        },\n        post: function($scope, $elm) {\n          var initColClass = $scope.col.getColClass(false),\n            classAdded;\n\n          $elm.addClass(initColClass);\n\n          function updateClass( grid ) {\n            var contents = $elm;\n\n            if ( classAdded ) {\n              contents.removeClass( classAdded );\n              classAdded = null;\n            }\n\n            if (angular.isFunction($scope.col.cellClass)) {\n              classAdded = $scope.col.cellClass($scope.grid, $scope.row, $scope.col, $scope.rowRenderIndex, $scope.colRenderIndex);\n            }\n            else {\n              classAdded = $scope.col.cellClass;\n            }\n            contents.addClass(classAdded);\n          }\n\n          if ($scope.col.cellClass) {\n            updateClass();\n          }\n\n          // Register a data change watch that would get triggered whenever someone edits a cell or modifies column defs\n          var dataChangeDereg = $scope.grid.registerDataChangeCallback( updateClass, [uiGridConstants.dataChange.COLUMN, uiGridConstants.dataChange.EDIT]);\n\n          // watch the col and row to see if they change - which would indicate that we've scrolled or sorted or otherwise\n          // changed the row/col that this cell relates to, and we need to re-evaluate cell classes and maybe other things\n          function cellChangeFunction( n, o ) {\n            if ( n !== o ) {\n              if ( classAdded || $scope.col.cellClass ) {\n                updateClass();\n              }\n\n              // See if the column's internal class has changed\n              var newColClass = $scope.col.getColClass(false);\n\n              if (newColClass !== initColClass) {\n                $elm.removeClass(initColClass);\n                $elm.addClass(newColClass);\n                initColClass = newColClass;\n              }\n            }\n          }\n\n          // TODO(c0bra): Turn this into a deep array watch\n          var rowWatchDereg = $scope.$watch( 'row', cellChangeFunction );\n\n          function deregisterFunction() {\n            dataChangeDereg();\n            rowWatchDereg();\n          }\n\n          $scope.$on('$destroy', deregisterFunction);\n          $elm.on('$destroy', deregisterFunction);\n        }\n      };\n    }\n  };\n}]);\n\n(function() {\n\nangular.module('ui.grid')\n.service('uiGridColumnMenuService', [ 'i18nService', 'uiGridConstants', 'gridUtil',\nfunction ( i18nService, uiGridConstants, gridUtil ) {\n/**\n *  @ngdoc service\n *  @name ui.grid.service:uiGridColumnMenuService\n *\n *  @description Services for working with column menus, factored out\n *  to make the code easier to understand\n */\n\n  var service = {\n    /**\n     * @ngdoc method\n     * @methodOf ui.grid.service:uiGridColumnMenuService\n     * @name initialize\n     * @description  Sets defaults, puts a reference to the $scope on\n     * the uiGridController\n     * @param {$scope} $scope the $scope from the uiGridColumnMenu\n     * @param {controller} uiGridCtrl the uiGridController for the grid\n     * we're on\n     *\n     */\n    initialize: function( $scope, uiGridCtrl ) {\n      $scope.grid = uiGridCtrl.grid;\n\n      // Store a reference to this link/controller in the main uiGrid controller\n      // to allow showMenu later\n      uiGridCtrl.columnMenuScope = $scope;\n\n      // Save whether we're shown or not so the columns can check\n      $scope.menuShown = false;\n    },\n\n\n    /**\n     * @ngdoc method\n     * @methodOf ui.grid.service:uiGridColumnMenuService\n     * @name setColMenuItemWatch\n     * @description  Setup a watch on $scope.col.menuItems, and update\n     * menuItems based on this.  $scope.col needs to be set by the column\n     * before calling the menu.\n     * @param {$scope} $scope the $scope from the uiGridColumnMenu\n     */\n    setColMenuItemWatch: function ( $scope ) {\n      var deregFunction = $scope.$watch('col.menuItems', function (n) {\n        if (typeof(n) !== 'undefined' && n && angular.isArray(n)) {\n          n.forEach(function (item) {\n            if (typeof(item.context) === 'undefined' || !item.context) {\n              item.context = {};\n            }\n            item.context.col = $scope.col;\n          });\n\n          $scope.menuItems = $scope.defaultMenuItems.concat(n);\n        }\n        else {\n          $scope.menuItems = $scope.defaultMenuItems;\n        }\n      });\n\n      $scope.$on( '$destroy', deregFunction );\n    },\n\n    getGridOption: function( $scope, option ) {\n      return typeof($scope.grid) !== 'undefined' && $scope.grid && $scope.grid.options && $scope.grid.options[option];\n    },\n\n    /**\n     * @ngdoc boolean\n     * @name enableSorting\n     * @propertyOf ui.grid.class:GridOptions.columnDef\n     * @description (optional) True by default. When enabled, this setting adds sort\n     * widgets to the column header, allowing sorting of the data in the individual column.\n     */\n    /**\n     * @ngdoc method\n     * @methodOf ui.grid.service:uiGridColumnMenuService\n     * @name sortable\n     * @description  determines whether this column is sortable\n     * @param {$scope} $scope the $scope from the uiGridColumnMenu\n     *\n     */\n    sortable: function( $scope ) {\n      return Boolean( this.getGridOption($scope, 'enableSorting') && typeof($scope.col) !== 'undefined' && $scope.col && $scope.col.enableSorting);\n    },\n\n    /**\n     * @ngdoc method\n     * @methodOf ui.grid.service:uiGridColumnMenuService\n     * @name isActiveSort\n     * @description  determines whether the requested sort direction is current active, to\n     * allow highlighting in the menu\n     * @param {$scope} $scope the $scope from the uiGridColumnMenu\n     * @param {string} direction the direction that we'd have selected for us to be active\n     *\n     */\n    isActiveSort: function( $scope, direction ) {\n      return Boolean(typeof($scope.col) !== 'undefined' && typeof($scope.col.sort) !== 'undefined' &&\n              typeof($scope.col.sort.direction) !== 'undefined' && $scope.col.sort.direction === direction);\n    },\n\n    /**\n     * @ngdoc method\n     * @methodOf ui.grid.service:uiGridColumnMenuService\n     * @name suppressRemoveSort\n     * @description  determines whether we should suppress the removeSort option\n     * @param {$scope} $scope the $scope from the uiGridColumnMenu\n     *\n     */\n    suppressRemoveSort: function( $scope ) {\n      return Boolean($scope.col && $scope.col.suppressRemoveSort);\n    },\n\n\n    /**\n     * @ngdoc boolean\n     * @name enableHiding\n     * @propertyOf ui.grid.class:GridOptions.columnDef\n     * @description (optional) True by default. When set to false, this setting prevents a user from hiding the column\n     * using the column menu or the grid menu.\n     */\n    /**\n     * @ngdoc method\n     * @methodOf ui.grid.service:uiGridColumnMenuService\n     * @name hideable\n     * @description  determines whether a column can be hidden, by checking the enableHiding columnDef option\n     * @param {$scope} $scope the $scope from the uiGridColumnMenu\n     *\n     */\n    hideable: function( $scope ) {\n      return Boolean(\n        (this.getGridOption($scope, 'enableHiding') &&\n        typeof($scope.col) !== 'undefined' && $scope.col &&\n        ($scope.col.colDef && $scope.col.colDef.enableHiding !== false || !$scope.col.colDef)) ||\n        (!this.getGridOption($scope, 'enableHiding') && $scope.col && $scope.col.colDef && $scope.col.colDef.enableHiding)\n      );\n    },\n\n\n    /**\n     * @ngdoc method\n     * @methodOf ui.grid.service:uiGridColumnMenuService\n     * @name getDefaultMenuItems\n     * @description  returns the default menu items for a column menu\n     * @param {$scope} $scope the $scope from the uiGridColumnMenu\n     *\n     */\n    getDefaultMenuItems: function( $scope ) {\n      return [\n        {\n          title: function() {return i18nService.getSafeText('sort.ascending');},\n          icon: 'ui-grid-icon-sort-alt-up',\n          action: function($event) {\n            $event.stopPropagation();\n            $scope.sortColumn($event, uiGridConstants.ASC);\n          },\n          shown: function () {\n            return service.sortable( $scope );\n          },\n          active: function() {\n            return service.isActiveSort( $scope, uiGridConstants.ASC);\n          }\n        },\n        {\n          title: function() {return i18nService.getSafeText('sort.descending');},\n          icon: 'ui-grid-icon-sort-alt-down',\n          action: function($event) {\n            $event.stopPropagation();\n            $scope.sortColumn($event, uiGridConstants.DESC);\n          },\n          shown: function() {\n            return service.sortable( $scope );\n          },\n          active: function() {\n            return service.isActiveSort( $scope, uiGridConstants.DESC);\n          }\n        },\n        {\n          title: function() {return i18nService.getSafeText('sort.remove');},\n          icon: 'ui-grid-icon-cancel',\n          action: function ($event) {\n            $event.stopPropagation();\n            $scope.unsortColumn();\n          },\n          shown: function() {\n            return service.sortable( $scope ) &&\n                   typeof($scope.col) !== 'undefined' && (typeof($scope.col.sort) !== 'undefined' &&\n                   typeof($scope.col.sort.direction) !== 'undefined') && $scope.col.sort.direction !== null &&\n                  !service.suppressRemoveSort( $scope );\n          }\n        },\n        {\n          title: function() {return i18nService.getSafeText('column.hide');},\n          icon: 'ui-grid-icon-cancel',\n          shown: function() {\n            return service.hideable( $scope );\n          },\n          action: function ($event) {\n            $event.stopPropagation();\n            $scope.hideColumn();\n          }\n        }\n      ];\n    },\n\n\n    /**\n     * @ngdoc method\n     * @methodOf ui.grid.service:uiGridColumnMenuService\n     * @name getColumnElementPosition\n     * @description  gets the position information needed to place the column\n     * menu below the column header\n     * @param {$scope} $scope the $scope from the uiGridColumnMenu\n     * @param {GridColumn} column the column we want to position below\n     * @param {element} $columnElement the column element we want to position below\n     * @returns {hash} containing left, top, offset, height, width\n     *\n     */\n    getColumnElementPosition: function( $scope, column, $columnElement ) {\n      var positionData = {};\n\n      positionData.left = $columnElement[0].offsetLeft;\n      positionData.top = $columnElement[0].offsetTop;\n      positionData.parentLeft = $columnElement[0].offsetParent.offsetLeft;\n\n      // Get the grid scrollLeft\n      positionData.offset = 0;\n      if (column.grid.options.offsetLeft) {\n        positionData.offset = column.grid.options.offsetLeft;\n      }\n\n      positionData.height = gridUtil.elementHeight($columnElement, true);\n      positionData.width = gridUtil.elementWidth($columnElement, true);\n\n      return positionData;\n    },\n\n\n    /**\n     * @ngdoc method\n     * @methodOf ui.grid.service:uiGridColumnMenuService\n     * @name repositionMenu\n     * @description  Reposition the menu below the new column.  If the menu has no child nodes\n     * (i.e. it's not currently visible) then we guess it's width at 100, we'll be called again\n     * later to fix it\n     * @param {$scope} $scope the $scope from the uiGridColumnMenu\n     * @param {GridColumn} column the column we want to position below\n     * @param {hash} positionData a hash containing left, top, offset, height, width\n     * @param {element} $elm the column menu element that we want to reposition\n     * @param {element} $columnElement the column element that we want to reposition underneath\n     *\n     */\n    repositionMenu: function( $scope, column, positionData, $elm, $columnElement ) {\n      var menu = $elm[0].querySelectorAll('.ui-grid-menu');\n\n      // It's possible that the render container of the column we're attaching to is\n      // offset from the grid (i.e. pinned containers), we need to get the difference in the offsetLeft\n      // between the render container and the grid\n      var renderContainerElm = gridUtil.closestElm($columnElement, '.ui-grid-render-container'),\n        renderContainerOffset = renderContainerElm.getBoundingClientRect().left - $scope.grid.element[0].getBoundingClientRect().left,\n        containerScrollLeft = renderContainerElm.querySelectorAll('.ui-grid-viewport')[0].scrollLeft;\n\n      // repositionMenu is now always called after it's visible in the DOM,\n      // allowing us to simply get the width every time the menu is opened\n      var myWidth = gridUtil.elementWidth(menu, true),\n        paddingRight = column.lastMenuPaddingRight ? column.lastMenuPaddingRight : ( $scope.lastMenuPaddingRight ? $scope.lastMenuPaddingRight : 10);\n\n      if ( menu.length !== 0 ) {\n        var mid = menu[0].querySelectorAll('.ui-grid-menu-mid');\n\n        if ( mid.length !== 0 ) {\n          // TODO(c0bra): use padding-left/padding-right based on document direction (ltr/rtl), place menu on proper side\n          // Get the column menu right padding\n          paddingRight = parseInt(gridUtil.getStyles(angular.element(menu)[0])['paddingRight'], 10);\n          $scope.lastMenuPaddingRight = paddingRight;\n          column.lastMenuPaddingRight = paddingRight;\n        }\n      }\n\n      var left = positionData.left + renderContainerOffset - containerScrollLeft + positionData.parentLeft + positionData.width + paddingRight;\n\n      if (left < positionData.offset + myWidth) {\n        left = Math.max(positionData.left - containerScrollLeft + positionData.parentLeft - paddingRight + myWidth, positionData.offset + myWidth);\n      }\n\n      $elm.css('left', left + 'px');\n      $elm.css('top', (positionData.top + positionData.height) + 'px');\n    }\n  };\n  return service;\n}])\n\n\n.directive('uiGridColumnMenu', ['$timeout', 'gridUtil', 'uiGridConstants', 'uiGridColumnMenuService', '$document',\nfunction ($timeout, gridUtil, uiGridConstants, uiGridColumnMenuService, $document) {\n/**\n * @ngdoc directive\n * @name ui.grid.directive:uiGridColumnMenu\n * @description  Provides the column menu framework, leverages uiGridMenu underneath\n *\n */\n\n  return {\n    priority: 0,\n    scope: true,\n    require: '^uiGrid',\n    templateUrl: 'ui-grid/uiGridColumnMenu',\n    replace: true,\n    link: function ($scope, $elm, $attrs, uiGridCtrl) {\n      uiGridColumnMenuService.initialize( $scope, uiGridCtrl );\n\n      $scope.defaultMenuItems = uiGridColumnMenuService.getDefaultMenuItems( $scope );\n\n      // Set the menu items for use with the column menu. The user can later add additional items via the watch\n      $scope.menuItems = $scope.defaultMenuItems;\n      uiGridColumnMenuService.setColMenuItemWatch( $scope );\n\n      function updateCurrentColStatus(menuShown) {\n        if ($scope.col) {\n          $scope.col.menuShown = menuShown;\n        }\n      }\n\n      /**\n       * @ngdoc method\n       * @methodOf ui.grid.directive:uiGridColumnMenu\n       * @name showMenu\n       * @description Shows the column menu.  If the menu is already displayed it\n       * calls the menu to ask it to hide (it will animate), then it repositions the menu\n       * to the right place whilst hidden (it will make an assumption on menu width),\n       * then it asks the menu to show (it will animate), then it repositions the menu again\n       * once we can calculate it's size.\n       * @param {GridColumn} column the column we want to position below\n       * @param {element} $columnElement the column element we want to position below\n       */\n      $scope.showMenu = function(column, $columnElement, event) {\n        // Update the menu status for the current column\n        updateCurrentColStatus(false);\n        // Swap to this column\n        $scope.col = column;\n        updateCurrentColStatus(true);\n\n        // Get the position information for the column element\n        var colElementPosition = uiGridColumnMenuService.getColumnElementPosition( $scope, column, $columnElement );\n\n        if ($scope.menuShown) {\n          // we want to hide, then reposition, then show, but we want to wait for animations\n          // we set a variable, and then rely on the menu-hidden event to call the reposition and show\n          $scope.colElement = $columnElement;\n          $scope.colElementPosition = colElementPosition;\n          $scope.hideThenShow = true;\n\n          $scope.$broadcast('hide-menu', { originalEvent: event });\n        } else {\n          $scope.menuShown = true;\n\n          $scope.colElement = $columnElement;\n          $scope.colElementPosition = colElementPosition;\n          $scope.$broadcast('show-menu', { originalEvent: event });\n        }\n      };\n\n\n      /**\n       * @ngdoc method\n       * @methodOf ui.grid.directive:uiGridColumnMenu\n       * @name hideMenu\n       * @description Hides the column menu.\n       * @param {boolean} broadcastTrigger true if we were triggered by a broadcast\n       * from the menu itself - in which case don't broadcast again as we'll get\n       * an infinite loop\n       */\n      $scope.hideMenu = function( broadcastTrigger ) {\n        $scope.menuShown = false;\n        updateCurrentColStatus(false);\n        if ( !broadcastTrigger ) {\n          $scope.$broadcast('hide-menu');\n        }\n      };\n\n\n      $scope.$on('menu-hidden', function() {\n        var menuItems = angular.element($elm[0].querySelector('.ui-grid-menu-items'))[0];\n\n        $elm[0].removeAttribute('style');\n\n        if ( $scope.hideThenShow ) {\n          delete $scope.hideThenShow;\n\n          $scope.$broadcast('show-menu');\n\n          $scope.menuShown = true;\n        } else {\n          $scope.hideMenu( true );\n\n          if ($scope.col && $scope.col.visible) {\n            // Focus on the menu button\n            gridUtil.focus.bySelector($document, '.ui-grid-header-cell.' + $scope.col.getColClass()+ ' .ui-grid-column-menu-button', $scope.col.grid, false)\n                .catch(angular.noop);\n          }\n        }\n\n        if (menuItems) {\n          menuItems.onkeydown = null;\n          angular.forEach(menuItems.children, function removeHandlers(item) {\n            item.onkeydown = null;\n          });\n        }\n      });\n\n      $scope.$on('menu-shown', function() {\n        $timeout(function() {\n          uiGridColumnMenuService.repositionMenu( $scope, $scope.col, $scope.colElementPosition, $elm, $scope.colElement );\n\n          var hasVisibleMenuItems = $scope.menuItems.some(function (menuItem) {\n              return menuItem.shown();\n          });\n\n          // automatically set the focus to the first button element in the now open menu.\n          if (hasVisibleMenuItems) {\n            gridUtil.focus.bySelector($document, '.ui-grid-menu-items .ui-grid-menu-item:not(.ng-hide)', true)\n                .catch(angular.noop);\n          }\n\n          delete $scope.colElementPosition;\n          delete $scope.columnElement;\n          addKeydownHandlersToMenu();\n        });\n      });\n\n\n      /* Column methods */\n      $scope.sortColumn = function (event, dir) {\n        event.stopPropagation();\n\n        $scope.grid.sortColumn($scope.col, dir, true)\n          .then(function () {\n            $scope.grid.refresh();\n            $scope.hideMenu();\n          }).catch(angular.noop);\n      };\n\n      $scope.unsortColumn = function () {\n        $scope.col.unsort();\n\n        $scope.grid.refresh();\n        $scope.hideMenu();\n      };\n\n      function addKeydownHandlersToMenu() {\n        var menu = angular.element($elm[0].querySelector('.ui-grid-menu-items'))[0],\n          menuItems,\n          visibleMenuItems = [];\n\n        if (menu) {\n          menu.onkeydown = function closeMenu(event) {\n            if (event.keyCode === uiGridConstants.keymap.ESC) {\n              event.preventDefault();\n              $scope.hideMenu();\n            }\n          };\n\n          menuItems = menu.querySelectorAll('.ui-grid-menu-item:not(.ng-hide)');\n          angular.forEach(menuItems, function filterVisibleItems(item) {\n            if (item.offsetParent !== null) {\n              this.push(item);\n            }\n          }, visibleMenuItems);\n\n          if (visibleMenuItems.length) {\n            if (visibleMenuItems.length === 1) {\n              visibleMenuItems[0].onkeydown = function singleItemHandler(event) {\n                circularFocusHandler(event, true);\n              };\n            } else {\n              visibleMenuItems[0].onkeydown = function firstItemHandler(event) {\n                circularFocusHandler(event, false, event.shiftKey, visibleMenuItems.length - 1);\n              };\n              visibleMenuItems[visibleMenuItems.length - 1].onkeydown = function lastItemHandler(event) {\n                circularFocusHandler(event, false, !event.shiftKey, 0);\n              };\n            }\n          }\n        }\n\n        function circularFocusHandler(event, isSingleItem, shiftKeyStatus, index) {\n          if (event.keyCode === uiGridConstants.keymap.TAB) {\n            if (isSingleItem) {\n              event.preventDefault();\n            } else if (shiftKeyStatus) {\n              event.preventDefault();\n              visibleMenuItems[index].focus();\n            }\n          }\n        }\n      }\n\n      // Since we are hiding this column the default hide action will fail so we need to focus somewhere else.\n      var setFocusOnHideColumn = function() {\n        $timeout(function() {\n          // Get the UID of the first\n          var focusToGridMenu = function() {\n            return gridUtil.focus.byId('grid-menu', $scope.grid);\n          };\n\n          var thisIndex;\n          $scope.grid.columns.some(function(element, index) {\n            if (angular.equals(element, $scope.col)) {\n              thisIndex = index;\n              return true;\n            }\n          });\n\n          var previousVisibleCol;\n          // Try and find the next lower or nearest column to focus on\n          $scope.grid.columns.some(function(element, index) {\n            if (!element.visible) {\n              return false;\n            } // This columns index is below the current column index\n            else if ( index < thisIndex) {\n              previousVisibleCol = element;\n            } // This elements index is above this column index and we haven't found one that is lower\n            else if ( index > thisIndex && !previousVisibleCol) {\n              // This is the next best thing\n              previousVisibleCol = element;\n              // We've found one so use it.\n              return true;\n            } // We've reached an element with an index above this column and the previousVisibleCol variable has been set\n            else if (index > thisIndex && previousVisibleCol) {\n              // We are done.\n              return true;\n            }\n          });\n          // If found then focus on it\n          if (previousVisibleCol) {\n            var colClass = previousVisibleCol.getColClass();\n            gridUtil.focus.bySelector($document, '.ui-grid-header-cell.' + colClass+ ' .ui-grid-header-cell-primary-focus', true).then(angular.noop, function(reason) {\n              if (reason !== 'canceled') { // If this is canceled then don't perform the action\n                // The fallback action is to focus on the grid menu\n                return focusToGridMenu();\n              }\n            }).catch(angular.noop);\n          } else {\n            // Fallback action to focus on the grid menu\n            focusToGridMenu();\n          }\n        });\n      };\n\n      $scope.hideColumn = function () {\n        $scope.col.colDef.visible = false;\n        $scope.col.visible = false;\n\n        $scope.grid.queueGridRefresh();\n        $scope.hideMenu();\n        $scope.grid.api.core.notifyDataChange( uiGridConstants.dataChange.COLUMN );\n        $scope.grid.api.core.raise.columnVisibilityChanged( $scope.col );\n\n        // We are hiding so the default action of focusing on the button that opened this menu will fail.\n        setFocusOnHideColumn();\n      };\n    },\n\n    controller: ['$scope', function ($scope) {\n      var self = this;\n\n      $scope.$watch('menuItems', function (n) {\n        self.menuItems = n;\n      });\n    }]\n  };\n}]);\n})();\n\n(function() {\n  'use strict';\n\n  angular.module('ui.grid').directive('uiGridFilter', ['$compile', '$templateCache', 'i18nService', 'gridUtil', function ($compile, $templateCache, i18nService, gridUtil) {\n\n    return {\n      compile: function() {\n        return {\n          pre: function ($scope, $elm) {\n            $scope.col.updateFilters = function( filterable ) {\n              $elm.children().remove();\n              if ( filterable ) {\n                var template = $scope.col.filterHeaderTemplate;\n                if (template === undefined && $scope.col.providedFilterHeaderTemplate !== '') {\n                  if ($scope.col.filterHeaderTemplatePromise) {\n                    $scope.col.filterHeaderTemplatePromise.then(function () {\n                      template = $scope.col.filterHeaderTemplate;\n                      $elm.append($compile(template)($scope));\n                    });\n                  }\n                }\n                else {\n                  $elm.append($compile(template)($scope));\n                }\n              }\n            };\n\n            $scope.$on( '$destroy', function() {\n              delete $scope.col.filterable;\n              delete $scope.col.updateFilters;\n            });\n          },\n          post: function ($scope, $elm) {\n            $scope.aria = i18nService.getSafeText('headerCell.aria');\n            $scope.removeFilter = function(colFilter, index) {\n              colFilter.term = null;\n              // Set the focus to the filter input after the action disables the button\n              gridUtil.focus.bySelector($elm, '.ui-grid-filter-input-' + index);\n            };\n          }\n        };\n      }\n    };\n  }]);\n})();\n\n(function () {\n  'use strict';\n\n  angular.module('ui.grid').directive('uiGridFooterCell', ['$timeout', 'gridUtil', 'uiGridConstants', '$compile',\n  function ($timeout, gridUtil, uiGridConstants, $compile) {\n    return {\n      priority: 0,\n      scope: {\n        col: '=',\n        row: '=',\n        renderIndex: '='\n      },\n      replace: true,\n      require: '^uiGrid',\n      compile: function compile() {\n        return {\n          pre: function ($scope, $elm) {\n            var template = $scope.col.footerCellTemplate;\n\n            if (template === undefined && $scope.col.providedFooterCellTemplate !== '') {\n              if ($scope.col.footerCellTemplatePromise) {\n                $scope.col.footerCellTemplatePromise.then(function () {\n                  template = $scope.col.footerCellTemplate;\n                  $elm.append($compile(template)($scope));\n                });\n              }\n            }\n            else {\n              $elm.append($compile(template)($scope));\n            }\n          },\n          post: function ($scope, $elm, $attrs, uiGridCtrl) {\n            // $elm.addClass($scope.col.getColClass(false));\n            $scope.grid = uiGridCtrl.grid;\n\n            var initColClass = $scope.col.getColClass(false);\n\n            $elm.addClass(initColClass);\n\n            // apply any footerCellClass\n            var classAdded;\n\n            var updateClass = function() {\n              var contents = $elm;\n\n              if ( classAdded ) {\n                contents.removeClass( classAdded );\n                classAdded = null;\n              }\n\n              if (angular.isFunction($scope.col.footerCellClass)) {\n                classAdded = $scope.col.footerCellClass($scope.grid, $scope.row, $scope.col, $scope.rowRenderIndex, $scope.colRenderIndex);\n              }\n              else {\n                classAdded = $scope.col.footerCellClass;\n              }\n              contents.addClass(classAdded);\n            };\n\n            if ($scope.col.footerCellClass) {\n              updateClass();\n            }\n\n            $scope.col.updateAggregationValue();\n\n            // Register a data change watch that would get triggered whenever someone edits a cell or modifies column defs\n            var dataChangeDereg = $scope.grid.registerDataChangeCallback( updateClass, [uiGridConstants.dataChange.COLUMN]);\n\n            // listen for visible rows change and update aggregation values\n            $scope.grid.api.core.on.rowsRendered( $scope, $scope.col.updateAggregationValue );\n            $scope.grid.api.core.on.rowsRendered( $scope, updateClass );\n            $scope.$on( '$destroy', dataChangeDereg );\n          }\n        };\n      }\n    };\n  }]);\n})();\n\n(function () {\n  'use strict';\n\n  angular.module('ui.grid').directive('uiGridFooter', ['$templateCache', '$compile', 'uiGridConstants', 'gridUtil', '$timeout', function ($templateCache, $compile, uiGridConstants, gridUtil, $timeout) {\n\n    return {\n      restrict: 'EA',\n      replace: true,\n      // priority: 1000,\n      require: ['^uiGrid', '^uiGridRenderContainer'],\n      scope: true,\n      compile: function ($elm, $attrs) {\n        return {\n          pre: function ($scope, $elm, $attrs, controllers) {\n            var uiGridCtrl = controllers[0];\n            var containerCtrl = controllers[1];\n\n            $scope.grid = uiGridCtrl.grid;\n            $scope.colContainer = containerCtrl.colContainer;\n\n            containerCtrl.footer = $elm;\n\n            var footerTemplate = $scope.grid.options.footerTemplate;\n            gridUtil.getTemplate(footerTemplate)\n              .then(function (contents) {\n                var template = angular.element(contents);\n\n                var newElm = $compile(template)($scope);\n                $elm.append(newElm);\n\n                if (containerCtrl) {\n                  // Inject a reference to the footer viewport (if it exists) into the grid controller for use in the horizontal scroll handler below\n                  var footerViewport = $elm[0].getElementsByClassName('ui-grid-footer-viewport')[0];\n\n                  if (footerViewport) {\n                    containerCtrl.footerViewport = footerViewport;\n                  }\n                }\n              }).catch(angular.noop);\n          },\n\n          post: function ($scope, $elm, $attrs, controllers) {\n            var uiGridCtrl = controllers[0];\n            var containerCtrl = controllers[1];\n\n            // gridUtil.logDebug('ui-grid-footer link');\n\n            var grid = uiGridCtrl.grid;\n\n            // Don't animate footer cells\n            gridUtil.disableAnimations($elm);\n\n            containerCtrl.footer = $elm;\n\n            var footerViewport = $elm[0].getElementsByClassName('ui-grid-footer-viewport')[0];\n            if (footerViewport) {\n              containerCtrl.footerViewport = footerViewport;\n            }\n          }\n        };\n      }\n    };\n  }]);\n\n})();\n\n(function() {\n\t'use strict';\n\n\tangular.module('ui.grid').directive('uiGridGridFooter', ['$templateCache', '$compile', 'uiGridConstants', 'gridUtil',\n\t\tfunction($templateCache, $compile, uiGridConstants, gridUtil) {\n\t\t\treturn {\n\t\t\t\trestrict: 'EA',\n\t\t\t\treplace: true,\n\t\t\t\trequire: '^uiGrid',\n\t\t\t\tscope: true,\n\t\t\t\tcompile: function() {\n\t\t\t\t\treturn {\n\t\t\t\t\t\tpre: function($scope, $elm, $attrs, uiGridCtrl) {\n\t\t\t\t\t\t\t$scope.grid = uiGridCtrl.grid;\n\n\t\t\t\t\t\t\tvar footerTemplate = $scope.grid.options.gridFooterTemplate;\n\n\t\t\t\t\t\t\tgridUtil.getTemplate(footerTemplate)\n\t\t\t\t\t\t\t\t.then(function(contents) {\n\t\t\t\t\t\t\t\t\tvar template = angular.element(contents),\n\t\t\t\t\t\t\t\t\t\tnewElm = $compile(template)($scope);\n\n\t\t\t\t\t\t\t\t\t$elm.append(newElm);\n\t\t\t\t\t\t\t\t}).catch(angular.noop);\n\t\t\t\t\t\t}\n\t\t\t\t\t};\n\t\t\t\t}\n\t\t\t};\n\t\t}]);\n})();\n\n(function() {\n  'use strict';\n\n  angular.module('ui.grid').directive('uiGridHeaderCell', ['$compile', '$timeout', '$window', '$document', 'gridUtil', 'uiGridConstants', 'ScrollEvent', 'i18nService', '$rootScope',\n  function ($compile, $timeout, $window, $document, gridUtil, uiGridConstants, ScrollEvent, i18nService, $rootScope) {\n    // Do stuff after mouse has been down this many ms on the header cell\n    var mousedownTimeout = 500,\n      changeModeTimeout = 500; // length of time between a touch event and a mouse event being recognised again, and vice versa\n\n    return {\n      priority: 0,\n      scope: {\n        col: '=',\n        row: '=',\n        renderIndex: '='\n      },\n      require: ['^uiGrid', '^uiGridRenderContainer'],\n      replace: true,\n      compile: function() {\n        return {\n          pre: function ($scope, $elm) {\n            var template = $scope.col.headerCellTemplate;\n            if (template === undefined && $scope.col.providedHeaderCellTemplate !== '') {\n              if ($scope.col.headerCellTemplatePromise) {\n                $scope.col.headerCellTemplatePromise.then(function () {\n                  template = $scope.col.headerCellTemplate;\n                  $elm.append($compile(template)($scope));\n                });\n              }\n            }\n            else {\n              $elm.append($compile(template)($scope));\n            }\n          },\n\n          post: function ($scope, $elm, $attrs, controllers) {\n            var uiGridCtrl = controllers[0];\n            var renderContainerCtrl = controllers[1];\n\n            $scope.i18n = {\n              headerCell: i18nService.getSafeText('headerCell'),\n              sort: i18nService.getSafeText('sort')\n            };\n            $scope.isSortPriorityVisible = function() {\n              // show sort priority if column is sorted and there is at least one other sorted column\n              return $scope.col && $scope.col.sort && angular.isNumber($scope.col.sort.priority) && $scope.grid.columns.some(function(element, index) {\n                  return angular.isNumber(element.sort.priority) && element !== $scope.col;\n                });\n            };\n            $scope.getSortDirectionAriaLabel = function() {\n              var col = $scope.col;\n              // Trying to recreate this sort of thing but it was getting messy having it in the template.\n              // Sort direction {{col.sort.direction == asc ? 'ascending' : ( col.sort.direction == desc ? 'descending': 'none')}}.\n              // {{col.sort.priority ? {{columnPriorityText}} {{col.sort.priority}} : ''}\n              var label = col.sort && col.sort.direction === uiGridConstants.ASC ? $scope.i18n.sort.ascending : ( col.sort && col.sort.direction === uiGridConstants.DESC ? $scope.i18n.sort.descending : $scope.i18n.sort.none);\n\n              if ($scope.isSortPriorityVisible()) {\n                label = label + '. ' + $scope.i18n.headerCell.priority + ' ' + (col.sort.priority + 1);\n              }\n              return label;\n            };\n\n            $scope.grid = uiGridCtrl.grid;\n\n            $scope.renderContainer = uiGridCtrl.grid.renderContainers[renderContainerCtrl.containerId];\n\n            var initColClass = $scope.col.getColClass(false);\n            $elm.addClass(initColClass);\n\n            // Hide the menu by default\n            $scope.menuShown = false;\n            $scope.col.menuShown = false;\n\n            // Put asc and desc sort directions in scope\n            $scope.asc = uiGridConstants.ASC;\n            $scope.desc = uiGridConstants.DESC;\n\n            // Store a reference to menu element\n            var $contentsElm = angular.element( $elm[0].querySelectorAll('.ui-grid-cell-contents') );\n\n\n            // apply any headerCellClass\n            var classAdded,\n              previousMouseX;\n\n            // filter watchers\n            var filterDeregisters = [];\n\n\n            /*\n             * Our basic approach here for event handlers is that we listen for a down event (mousedown or touchstart).\n             * Once we have a down event, we need to work out whether we have a click, a drag, or a\n             * hold.  A click would sort the grid (if sortable).  A drag would be used by moveable, so\n             * we ignore it.  A hold would open the menu.\n             *\n             * So, on down event, we put in place handlers for move and up events, and a timer.  If the\n             * timer expires before we see a move or up, then we have a long press and hence a column menu open.\n             * If the up happens before the timer, then we have a click, and we sort if the column is sortable.\n             * If a move happens before the timer, then we are doing column move, so we do nothing, the moveable feature\n             * will handle it.\n             *\n             * To deal with touch enabled devices that also have mice, we only create our handlers when\n             * we get the down event, and we create the corresponding handlers - if we're touchstart then\n             * we get touchmove and touchend, if we're mousedown then we get mousemove and mouseup.\n             *\n             * We also suppress the click action whilst this is happening - otherwise after the mouseup there\n             * will be a click event and that can cause the column menu to close\n             *\n             */\n            $scope.downFn = function( event ) {\n              event.stopPropagation();\n\n              if (typeof(event.originalEvent) !== 'undefined' && event.originalEvent !== undefined) {\n                event = event.originalEvent;\n              }\n\n              // Don't show the menu if it's not the left button\n              if (event.button && event.button !== 0) {\n                return;\n              }\n              previousMouseX = event.pageX;\n\n              $scope.mousedownStartTime = (new Date()).getTime();\n              $scope.mousedownTimeout = $timeout(function() { }, mousedownTimeout);\n\n              $scope.mousedownTimeout.then(function () {\n                if ( $scope.colMenu ) {\n                  uiGridCtrl.columnMenuScope.showMenu($scope.col, $elm, event);\n                }\n              }).catch(angular.noop);\n\n              uiGridCtrl.fireEvent(uiGridConstants.events.COLUMN_HEADER_CLICK, {event: event, columnName: $scope.col.colDef.name});\n\n              $scope.offAllEvents();\n              if ( event.type === 'touchstart') {\n                $document.on('touchend', $scope.upFn);\n                $document.on('touchmove', $scope.moveFn);\n              } else if ( event.type === 'mousedown' ) {\n                $document.on('mouseup', $scope.upFn);\n                $document.on('mousemove', $scope.moveFn);\n              }\n            };\n\n            $scope.upFn = function( event ) {\n              event.stopPropagation();\n              $timeout.cancel($scope.mousedownTimeout);\n              $scope.offAllEvents();\n              $scope.onDownEvents(event.type);\n\n              var mousedownEndTime = (new Date()).getTime();\n              var mousedownTime = mousedownEndTime - $scope.mousedownStartTime;\n\n              if (mousedownTime > mousedownTimeout) {\n                // long click, handled above with mousedown\n              }\n              else {\n                // short click\n                if ( $scope.sortable ) {\n                  $scope.handleClick(event);\n                }\n              }\n            };\n\n            $scope.handleKeyDown = function(event) {\n              if (event.keyCode === 32 || event.keyCode === 13) {\n                event.preventDefault();\n                $scope.handleClick(event);\n              }\n            };\n\n            $scope.moveFn = function( event ) {\n              // Chrome is known to fire some bogus move events.\n              var changeValue = event.pageX - previousMouseX;\n              if ( changeValue === 0 ) { return; }\n\n              // we're a move, so do nothing and leave for column move (if enabled) to take over\n              $timeout.cancel($scope.mousedownTimeout);\n              $scope.offAllEvents();\n              $scope.onDownEvents(event.type);\n            };\n\n            $scope.clickFn = function ( event ) {\n              event.stopPropagation();\n              $contentsElm.off('click', $scope.clickFn);\n            };\n\n\n            $scope.offAllEvents = function() {\n              $contentsElm.off('touchstart', $scope.downFn);\n              $contentsElm.off('mousedown', $scope.downFn);\n\n              $document.off('touchend', $scope.upFn);\n              $document.off('mouseup', $scope.upFn);\n\n              $document.off('touchmove', $scope.moveFn);\n              $document.off('mousemove', $scope.moveFn);\n\n              $contentsElm.off('click', $scope.clickFn);\n            };\n\n            $scope.onDownEvents = function( type ) {\n              // If there is a previous event, then wait a while before\n              // activating the other mode - i.e. if the last event was a touch event then\n              // don't enable mouse events for a wee while (500ms or so)\n              // Avoids problems with devices that emulate mouse events when you have touch events\n\n              switch (type) {\n                case 'touchmove':\n                case 'touchend':\n                  $contentsElm.on('click', $scope.clickFn);\n                  $contentsElm.on('touchstart', $scope.downFn);\n                  $timeout(function() {\n                    $contentsElm.on('mousedown', $scope.downFn);\n                  }, changeModeTimeout);\n                  break;\n                case 'mousemove':\n                case 'mouseup':\n                  $contentsElm.on('click', $scope.clickFn);\n                  $contentsElm.on('mousedown', $scope.downFn);\n                  $timeout(function() {\n                    $contentsElm.on('touchstart', $scope.downFn);\n                  }, changeModeTimeout);\n                  break;\n                default:\n                  $contentsElm.on('click', $scope.clickFn);\n                  $contentsElm.on('touchstart', $scope.downFn);\n                  $contentsElm.on('mousedown', $scope.downFn);\n              }\n            };\n\n            var setFilter = function (updateFilters) {\n              if ( updateFilters ) {\n                if ( typeof($scope.col.updateFilters) !== 'undefined' ) {\n                  $scope.col.updateFilters($scope.col.filterable);\n                }\n\n                // if column is filterable add a filter watcher\n                if ($scope.col.filterable) {\n                  $scope.col.filters.forEach( function(filter, i) {\n                    filterDeregisters.push($scope.$watch('col.filters[' + i + '].term', function(n, o) {\n                      if (n !== o) {\n                        uiGridCtrl.grid.api.core.raise.filterChanged( $scope.col );\n                        uiGridCtrl.grid.api.core.notifyDataChange( uiGridConstants.dataChange.COLUMN );\n                        uiGridCtrl.grid.queueGridRefresh();\n                      }\n                    }));\n                  });\n                  $scope.$on('$destroy', function() {\n                    filterDeregisters.forEach( function(filterDeregister) {\n                      filterDeregister();\n                    });\n                  });\n                } else {\n                  filterDeregisters.forEach( function(filterDeregister) {\n                    filterDeregister();\n                  });\n                }\n              }\n            };\n\n            var updateHeaderOptions = function() {\n              var contents = $elm;\n\n              if ( classAdded ) {\n                contents.removeClass( classAdded );\n                classAdded = null;\n              }\n\n              if (angular.isFunction($scope.col.headerCellClass)) {\n                classAdded = $scope.col.headerCellClass($scope.grid, $scope.row, $scope.col, $scope.rowRenderIndex, $scope.colRenderIndex);\n              }\n              else {\n                classAdded = $scope.col.headerCellClass;\n              }\n              contents.addClass(classAdded);\n\n              $scope.$applyAsync(function() {\n                var rightMostContainer = $scope.grid.renderContainers['right'] && $scope.grid.renderContainers['right'].visibleColumnCache.length ?\n                $scope.grid.renderContainers['right'] : $scope.grid.renderContainers['body'];\n                $scope.isLastCol = uiGridCtrl.grid.options && uiGridCtrl.grid.options.enableGridMenu &&\n                  $scope.col === rightMostContainer.visibleColumnCache[ rightMostContainer.visibleColumnCache.length - 1 ];\n              });\n\n              // Figure out whether this column is sortable or not\n              $scope.sortable = Boolean($scope.col.enableSorting);\n\n              // Figure out whether this column is filterable or not\n              var oldFilterable = $scope.col.filterable;\n              $scope.col.filterable = Boolean(uiGridCtrl.grid.options.enableFiltering && $scope.col.enableFiltering);\n\n              setFilter(oldFilterable !== $scope.col.filterable);\n\n              // figure out whether we support column menus\n              $scope.colMenu = ($scope.col.grid.options && $scope.col.grid.options.enableColumnMenus !== false &&\n                      $scope.col.colDef && $scope.col.colDef.enableColumnMenu !== false);\n\n              /**\n               * @ngdoc property\n               * @name enableColumnMenu\n               * @propertyOf ui.grid.class:GridOptions.columnDef\n               * @description if column menus are enabled, controls the column menus for this specific\n               * column (i.e. if gridOptions.enableColumnMenus, then you can control column menus\n               * using this option. If gridOptions.enableColumnMenus === false then you get no column\n               * menus irrespective of the value of this option ).  Defaults to true.\n               *\n               * By default column menu's trigger is hidden before mouse over, but you can always force it to be visible with CSS:\n               *\n               * <pre>\n               *  .ui-grid-column-menu-button {\n               *    display: block;\n               *  }\n               * </pre>\n               */\n              /**\n              * @ngdoc property\n              * @name enableColumnMenus\n              * @propertyOf ui.grid.class:GridOptions.columnDef\n              * @description Override for column menus everywhere - if set to false then you get no\n              * column menus.  Defaults to true.\n              *\n              */\n\n              $scope.offAllEvents();\n\n              if ($scope.sortable || $scope.colMenu) {\n                $scope.onDownEvents();\n\n                $scope.$on('$destroy', function () {\n                  $scope.offAllEvents();\n                });\n              }\n            };\n\n            updateHeaderOptions();\n\n            if ($scope.col.filterContainer === 'columnMenu' && $scope.col.filterable) {\n              $rootScope.$on('menu-shown', function() {\n                $scope.$applyAsync(function () {\n                  setFilter($scope.col.filterable);\n                });\n              });\n            }\n\n            // Register a data change watch that would get triggered whenever someone edits a cell or modifies column defs\n            var dataChangeDereg = $scope.grid.registerDataChangeCallback( updateHeaderOptions, [uiGridConstants.dataChange.COLUMN]);\n\n            $scope.$on( '$destroy', dataChangeDereg );\n\n            $scope.handleClick = function(event) {\n              // If the shift key is being held down, add this column to the sort\n              // Sort this column then rebuild the grid's rows\n              uiGridCtrl.grid.sortColumn($scope.col, event.shiftKey)\n                .then(function () {\n                  if (uiGridCtrl.columnMenuScope) { uiGridCtrl.columnMenuScope.hideMenu(); }\n                  uiGridCtrl.grid.refresh();\n                }).catch(angular.noop);\n            };\n\n            $scope.headerCellArrowKeyDown = function(event) {\n              if (event.keyCode === uiGridConstants.keymap.SPACE || event.keyCode === uiGridConstants.keymap.ENTER) {\n                event.preventDefault();\n                $scope.toggleMenu(event);\n              }\n            };\n\n            $scope.toggleMenu = function(event) {\n              event.stopPropagation();\n\n              // If the menu is already showing and we're the column the menu is on\n              if (uiGridCtrl.columnMenuScope.menuShown && uiGridCtrl.columnMenuScope.col === $scope.col) {\n                // ... hide it\n                uiGridCtrl.columnMenuScope.hideMenu();\n              }\n              // If the menu is NOT showing or is showing in a different column\n              else {\n                // ... show it on our column\n                uiGridCtrl.columnMenuScope.showMenu($scope.col, $elm);\n              }\n            };\n          }\n        };\n      }\n    };\n  }]);\n})();\n\n(function() {\n  'use strict';\n\n  angular.module('ui.grid').directive('uiGridHeader', ['$templateCache', '$compile', 'uiGridConstants', 'gridUtil', '$timeout', 'ScrollEvent',\n    function($templateCache, $compile, uiGridConstants, gridUtil, $timeout, ScrollEvent) {\n    var defaultTemplate = 'ui-grid/ui-grid-header',\n      emptyTemplate = 'ui-grid/ui-grid-no-header';\n\n    return {\n      restrict: 'EA',\n      replace: true,\n      require: ['^uiGrid', '^uiGridRenderContainer'],\n      scope: true,\n      compile: function() {\n        return {\n          pre: function ($scope, $elm, $attrs, controllers) {\n            var uiGridCtrl = controllers[0],\n              containerCtrl = controllers[1];\n\n            $scope.grid = uiGridCtrl.grid;\n            $scope.colContainer = containerCtrl.colContainer;\n\n            updateHeaderReferences();\n\n            var headerTemplate;\n            if (!$scope.grid.options.showHeader) {\n              headerTemplate = emptyTemplate;\n            }\n            else {\n              headerTemplate = ($scope.grid.options.headerTemplate) ? $scope.grid.options.headerTemplate : defaultTemplate;\n            }\n\n            gridUtil.getTemplate(headerTemplate)\n              .then(function (contents) {\n                var template = angular.element(contents);\n\n                var newElm = $compile(template)($scope);\n                $elm.replaceWith(newElm);\n\n                // And update $elm to be the new element\n                $elm = newElm;\n\n                updateHeaderReferences();\n\n                if (containerCtrl) {\n                  // Inject a reference to the header viewport (if it exists) into the grid controller for use in the horizontal scroll handler below\n                  var headerViewport = $elm[0].getElementsByClassName('ui-grid-header-viewport')[0];\n\n\n                  if (headerViewport) {\n                    containerCtrl.headerViewport = headerViewport;\n                    angular.element(headerViewport).on('scroll', scrollHandler);\n                    $scope.$on('$destroy', function () {\n                      angular.element(headerViewport).off('scroll', scrollHandler);\n                    });\n                  }\n                }\n\n                $scope.grid.queueRefresh();\n              }).catch(angular.noop);\n\n            function updateHeaderReferences() {\n              containerCtrl.header = containerCtrl.colContainer.header = $elm;\n\n              var headerCanvases = $elm[0].getElementsByClassName('ui-grid-header-canvas');\n\n              if (headerCanvases.length > 0) {\n                containerCtrl.headerCanvas = containerCtrl.colContainer.headerCanvas = headerCanvases[0];\n              }\n              else {\n                containerCtrl.headerCanvas = null;\n              }\n            }\n\n            function scrollHandler() {\n              if (uiGridCtrl.grid.isScrollingHorizontally) {\n                return;\n              }\n              var newScrollLeft = gridUtil.normalizeScrollLeft(containerCtrl.headerViewport, uiGridCtrl.grid);\n              var horizScrollPercentage = containerCtrl.colContainer.scrollHorizontal(newScrollLeft);\n\n              var scrollEvent = new ScrollEvent(uiGridCtrl.grid, null, containerCtrl.colContainer, ScrollEvent.Sources.ViewPortScroll);\n              scrollEvent.newScrollLeft = newScrollLeft;\n              if ( horizScrollPercentage > -1 ) {\n                scrollEvent.x = { percentage: horizScrollPercentage };\n              }\n\n              uiGridCtrl.grid.scrollContainers(null, scrollEvent);\n            }\n          },\n\n          post: function ($scope, $elm, $attrs, controllers) {\n            var uiGridCtrl = controllers[0];\n            var containerCtrl = controllers[1];\n\n            // gridUtil.logDebug('ui-grid-header link');\n\n            var grid = uiGridCtrl.grid;\n\n            // Don't animate header cells\n            gridUtil.disableAnimations($elm);\n\n            function updateColumnWidths() {\n              // this styleBuilder always runs after the renderContainer, so we can rely on the column widths\n              // already being populated correctly\n\n              var columnCache = containerCtrl.colContainer.visibleColumnCache;\n\n              // Build the CSS\n              // uiGridCtrl.grid.columns.forEach(function (column) {\n              var ret = '';\n              var canvasWidth = 0;\n              columnCache.forEach(function (column) {\n                ret = ret + column.getColClassDefinition();\n                canvasWidth += column.drawnWidth;\n              });\n\n              containerCtrl.colContainer.canvasWidth = canvasWidth;\n\n              // Return the styles back to buildStyles which pops them into the `customStyles` scope variable\n              return ret;\n            }\n\n            containerCtrl.header = $elm;\n\n            var headerViewport = $elm[0].getElementsByClassName('ui-grid-header-viewport')[0];\n            if (headerViewport) {\n              containerCtrl.headerViewport = headerViewport;\n            }\n\n            // todo: remove this if by injecting gridCtrl into unit tests\n            if (uiGridCtrl) {\n              uiGridCtrl.grid.registerStyleComputation({\n                priority: 15,\n                func: updateColumnWidths\n              });\n            }\n          }\n        };\n      }\n    };\n  }]);\n})();\n\n(function() {\n\nangular.module('ui.grid')\n.service('uiGridGridMenuService', [ 'gridUtil', 'i18nService', 'uiGridConstants', function( gridUtil, i18nService, uiGridConstants ) {\n  /**\n   *  @ngdoc service\n   *  @name ui.grid.uiGridGridMenuService\n   *\n   *  @description Methods for working with the grid menu\n   */\n\n  var service = {\n    /**\n     * @ngdoc method\n     * @methodOf ui.grid.uiGridGridMenuService\n     * @name initialize\n     * @description Sets up the gridMenu. Most importantly, sets our\n     * scope onto the grid object as grid.gridMenuScope, allowing us\n     * to operate when passed only the grid.  Second most importantly,\n     * we register the 'addToGridMenu' and 'removeFromGridMenu' methods\n     * on the core api.\n     * @param {$scope} $scope the scope of this gridMenu\n     * @param {Grid} grid the grid to which this gridMenu is associated\n     */\n    initialize: function( $scope, grid ) {\n      grid.gridMenuScope = $scope;\n      $scope.grid = grid;\n      $scope.registeredMenuItems = [];\n\n      // not certain this is needed, but would be bad to create a memory leak\n      $scope.$on('$destroy', function() {\n        if ( $scope.grid && $scope.grid.gridMenuScope ) {\n          $scope.grid.gridMenuScope = null;\n        }\n        if ( $scope.grid ) {\n          $scope.grid = null;\n        }\n        if ( $scope.registeredMenuItems ) {\n          $scope.registeredMenuItems = null;\n        }\n      });\n\n      $scope.registeredMenuItems = [];\n\n      /**\n       * @ngdoc function\n       * @name addToGridMenu\n       * @methodOf ui.grid.api:PublicApi\n       * @description add items to the grid menu.  Used by features\n       * to add their menu items if they are enabled, can also be used by\n       * end users to add menu items.  This method has the advantage of allowing\n       * remove again, which can simplify management of which items are included\n       * in the menu when.  (Noting that in most cases the shown and active functions\n       * provide a better way to handle visibility of menu items)\n       * @param {Grid} grid the grid on which we are acting\n       * @param {array} items menu items in the format as described in the tutorial, with\n       * the added note that if you want to use remove you must also specify an `id` field,\n       * which is provided when you want to remove an item.  The id should be unique.\n       *\n       */\n      grid.api.registerMethod( 'core', 'addToGridMenu', service.addToGridMenu );\n\n      /**\n       * @ngdoc function\n       * @name removeFromGridMenu\n       * @methodOf ui.grid.api:PublicApi\n       * @description Remove an item from the grid menu based on a provided id. Assumes\n       * that the id is unique, removes only the last instance of that id. Does nothing if\n       * the specified id is not found\n       * @param {Grid} grid the grid on which we are acting\n       * @param {string} id the id we'd like to remove from the menu\n       *\n       */\n      grid.api.registerMethod( 'core', 'removeFromGridMenu', service.removeFromGridMenu );\n    },\n\n\n    /**\n     * @ngdoc function\n     * @name addToGridMenu\n     * @propertyOf ui.grid.uiGridGridMenuService\n     * @description add items to the grid menu.  Used by features\n     * to add their menu items if they are enabled, can also be used by\n     * end users to add menu items.  This method has the advantage of allowing\n     * remove again, which can simplify management of which items are included\n     * in the menu when.  (Noting that in most cases the shown and active functions\n     * provide a better way to handle visibility of menu items)\n     * @param {Grid} grid the grid on which we are acting\n     * @param {array} menuItems menu items in the format as described in the tutorial, with\n     * the added note that if you want to use remove you must also specify an `id` field,\n     * which is provided when you want to remove an item.  The id should be unique.\n     *\n     */\n    addToGridMenu: function( grid, menuItems ) {\n      if ( !angular.isArray( menuItems ) ) {\n        gridUtil.logError( 'addToGridMenu: menuItems must be an array, and is not, not adding any items');\n      } else {\n        if ( grid.gridMenuScope ) {\n          grid.gridMenuScope.registeredMenuItems = grid.gridMenuScope.registeredMenuItems ? grid.gridMenuScope.registeredMenuItems : [];\n          grid.gridMenuScope.registeredMenuItems = grid.gridMenuScope.registeredMenuItems.concat( menuItems );\n        } else {\n          gridUtil.logError( 'Asked to addToGridMenu, but gridMenuScope not present.  Timing issue?  Please log issue with ui-grid');\n        }\n      }\n    },\n\n\n    /**\n     * @ngdoc function\n     * @name removeFromGridMenu\n     * @methodOf ui.grid.uiGridGridMenuService\n     * @description Remove an item from the grid menu based on a provided id.  Assumes\n     * that the id is unique, removes only the last instance of that id.  Does nothing if\n     * the specified id is not found.  If there is no gridMenuScope or registeredMenuItems\n     * then do nothing silently - the desired result is those menu items not be present and they\n     * aren't.\n     * @param {Grid} grid the grid on which we are acting\n     * @param {string} id the id we'd like to remove from the menu\n     *\n     */\n    removeFromGridMenu: function( grid, id ) {\n      var foundIndex = -1;\n\n      if ( grid && grid.gridMenuScope ) {\n        grid.gridMenuScope.registeredMenuItems.forEach( function( value, index ) {\n          if ( value.id === id ) {\n            if (foundIndex > -1) {\n              gridUtil.logError( 'removeFromGridMenu: found multiple items with the same id, removing only the last' );\n            } else {\n\n              foundIndex = index;\n            }\n          }\n        });\n      }\n\n      if ( foundIndex > -1 ) {\n        grid.gridMenuScope.registeredMenuItems.splice( foundIndex, 1 );\n      }\n    },\n\n\n    /**\n     * @ngdoc array\n     * @name gridMenuCustomItems\n     * @propertyOf ui.grid.class:GridOptions\n     * @description (optional) An array of menu items that should be added to\n     * the gridMenu.  Follow the format documented in the tutorial for column\n     * menu customisation.  The context provided to the action function will\n     * include context.grid.  An alternative if working with dynamic menus is to use the\n     * provided api - core.addToGridMenu and core.removeFromGridMenu, which handles\n     * some of the management of items for you.\n     *\n     */\n    /**\n     * @ngdoc boolean\n     * @name gridMenuShowHideColumns\n     * @propertyOf ui.grid.class:GridOptions\n     * @description true by default, whether the grid menu should allow hide/show\n     * of columns\n     *\n     */\n    /**\n     * @ngdoc method\n     * @methodOf ui.grid.uiGridGridMenuService\n     * @name getMenuItems\n     * @description Decides the menu items to show in the menu.  This is a\n     * combination of:\n     *\n     * - the default menu items that are always included,\n     * - any menu items that have been provided through the addMenuItem api. These\n     *   are typically added by features within the grid\n     * - any menu items included in grid.options.gridMenuCustomItems.  These can be\n     *   changed dynamically, as they're always recalculated whenever we show the\n     *   menu\n     * @param {$scope} $scope the scope of this gridMenu, from which we can find all\n     * the information that we need\n     * @returns {Array} an array of menu items that can be shown\n     */\n    getMenuItems: function( $scope ) {\n      var menuItems = [\n        // this is where we add any menu items we want to always include\n      ];\n\n      if ( $scope.grid.options.gridMenuCustomItems ) {\n        if ( !angular.isArray( $scope.grid.options.gridMenuCustomItems ) ) {\n          gridUtil.logError( 'gridOptions.gridMenuCustomItems must be an array, and is not');\n        } else {\n          menuItems = menuItems.concat( $scope.grid.options.gridMenuCustomItems );\n        }\n      }\n\n      var clearFilters = [{\n        title: i18nService.getSafeText('gridMenu.clearAllFilters'),\n        action: function ($event) {\n          $scope.grid.clearAllFilters();\n        },\n        shown: function() {\n          return $scope.grid.options.enableFiltering;\n        },\n        order: 100\n      }];\n      menuItems = menuItems.concat( clearFilters );\n\n      menuItems = menuItems.concat( $scope.registeredMenuItems );\n\n      if ( $scope.grid.options.gridMenuShowHideColumns !== false ) {\n        menuItems = menuItems.concat( service.showHideColumns( $scope ) );\n      }\n\n      menuItems.sort(function(a, b) {\n        return a.order - b.order;\n      });\n\n      return menuItems;\n    },\n\n\n    /**\n     * @ngdoc array\n     * @name gridMenuTitleFilter\n     * @propertyOf ui.grid.class:GridOptions\n     * @description (optional) A function that takes a title string\n     * (usually the col.displayName), and converts it into a display value.  The function\n     * must return either a string or a promise.\n     *\n     * Used for internationalization of the grid menu column names - for angular-translate\n     * you can pass $translate as the function, for i18nService you can pass getSafeText as the\n     * function\n     * @example\n     * <pre>\n     *   gridOptions = {\n     *     gridMenuTitleFilter: $translate\n     *   }\n     * </pre>\n     */\n    /**\n     * @ngdoc method\n     * @methodOf ui.grid.uiGridGridMenuService\n     * @name showHideColumns\n     * @description Adds two menu items for each of the columns in columnDefs.  One\n     * menu item for hide, one menu item for show.  Each is visible when appropriate\n     * (show when column is not visible, hide when column is visible).  Each toggles\n     * the visible property on the columnDef using toggleColumnVisibility\n     * @param {$scope} $scope of a gridMenu, which contains a reference to the grid\n     */\n    showHideColumns: function( $scope ) {\n      var showHideColumns = [];\n      if ( !$scope.grid.options.columnDefs || $scope.grid.options.columnDefs.length === 0 || $scope.grid.columns.length === 0 ) {\n        return showHideColumns;\n      }\n\n      function isColumnVisible(colDef) {\n        return colDef.visible === true || colDef.visible === undefined;\n      }\n\n      function getColumnIcon(colDef) {\n        return isColumnVisible(colDef) ? 'ui-grid-icon-ok' : 'ui-grid-icon-cancel';\n      }\n\n      $scope.grid.options.gridMenuTitleFilter = $scope.grid.options.gridMenuTitleFilter ? $scope.grid.options.gridMenuTitleFilter : function( title ) { return title; };\n\n      $scope.grid.options.columnDefs.forEach( function( colDef, index ) {\n        if ( $scope.grid.options.enableHiding !== false && colDef.enableHiding !== false || colDef.enableHiding ) {\n          // add hide menu item - shows an OK icon as we only show when column is already visible\n          var menuItem = {\n            icon: getColumnIcon(colDef),\n            action: function($event) {\n              $event.stopPropagation();\n\n              service.toggleColumnVisibility( this.context.gridCol );\n\n              if ($event.target && $event.target.firstChild) {\n                if (angular.element($event.target)[0].nodeName === 'I') {\n                  $event.target.className = getColumnIcon(this.context.gridCol.colDef);\n                }\n                else {\n                  $event.target.firstChild.className = getColumnIcon(this.context.gridCol.colDef);\n                }\n              }\n            },\n            shown: function() {\n              return this.context.gridCol.colDef.enableHiding !== false;\n            },\n            context: { gridCol: $scope.grid.getColumn(colDef.name || colDef.field) },\n            leaveOpen: true,\n            order: 301 + index\n          };\n          service.setMenuItemTitle( menuItem, colDef, $scope.grid );\n          showHideColumns.push( menuItem );\n        }\n      });\n\n      // add header for columns\n      if ( showHideColumns.length ) {\n        showHideColumns.unshift({\n          title: i18nService.getSafeText('gridMenu.columns'),\n          order: 300,\n          templateUrl: 'ui-grid/ui-grid-menu-header-item'\n        });\n      }\n\n      return showHideColumns;\n    },\n\n\n    /**\n     * @ngdoc method\n     * @methodOf ui.grid.uiGridGridMenuService\n     * @name setMenuItemTitle\n     * @description Handles the response from gridMenuTitleFilter, adding it directly to the menu\n     * item if it returns a string, otherwise waiting for the promise to resolve or reject then\n     * putting the result into the title\n     * @param {object} menuItem the menuItem we want to put the title on\n     * @param {object} colDef the colDef from which we can get displayName, name or field\n     * @param {Grid} grid the grid, from which we can get the options.gridMenuTitleFilter\n     *\n     */\n    setMenuItemTitle: function( menuItem, colDef, grid ) {\n      var title = grid.options.gridMenuTitleFilter( colDef.displayName || gridUtil.readableColumnName(colDef.name) || colDef.field );\n\n      if ( typeof(title) === 'string' ) {\n        menuItem.title = title;\n      } else if ( title.then ) {\n        // must be a promise\n        menuItem.title = \"\";\n        title.then( function( successValue ) {\n          menuItem.title = successValue;\n        }, function( errorValue ) {\n          menuItem.title = errorValue;\n        }).catch(angular.noop);\n      } else {\n        gridUtil.logError('Expected gridMenuTitleFilter to return a string or a promise, it has returned neither, bad config');\n        menuItem.title = 'badconfig';\n      }\n    },\n\n    /**\n     * @ngdoc method\n     * @methodOf ui.grid.uiGridGridMenuService\n     * @name toggleColumnVisibility\n     * @description Toggles the visibility of an individual column.  Expects to be\n     * provided a context that has on it a gridColumn, which is the column that\n     * we'll operate upon.  We change the visibility, and refresh the grid as appropriate\n     * @param {GridColumn} gridCol the column that we want to toggle\n     *\n     */\n    toggleColumnVisibility: function( gridCol ) {\n      gridCol.colDef.visible = !( gridCol.colDef.visible === true || gridCol.colDef.visible === undefined );\n\n      gridCol.grid.refresh();\n      gridCol.grid.api.core.notifyDataChange( uiGridConstants.dataChange.COLUMN );\n      gridCol.grid.api.core.raise.columnVisibilityChanged( gridCol );\n    }\n  };\n\n  return service;\n}])\n\n.directive('uiGridMenuButton', ['gridUtil', 'uiGridConstants', 'uiGridGridMenuService', 'i18nService',\nfunction (gridUtil, uiGridConstants, uiGridGridMenuService, i18nService) {\n\n  return {\n    priority: 0,\n    scope: true,\n    require: ['^uiGrid'],\n    templateUrl: 'ui-grid/ui-grid-menu-button',\n    replace: true,\n\n    link: function ($scope, $elm, $attrs, controllers) {\n      var uiGridCtrl = controllers[0];\n\n      // For the aria label\n      $scope.i18n = {\n        aria: i18nService.getSafeText('gridMenu.aria')\n      };\n\n      uiGridGridMenuService.initialize($scope, uiGridCtrl.grid);\n\n      $scope.shown = false;\n\n      $scope.toggleOnKeydown = function(event) {\n        if (\n          event.keyCode === uiGridConstants.keymap.ENTER ||\n          event.keyCode === uiGridConstants.keymap.SPACE ||\n          (event.keyCode === uiGridConstants.keymap.ESC && $scope.shown)\n        ) {\n          $scope.toggleMenu();\n        }\n      };\n\n      $scope.toggleMenu = function () {\n        if ( $scope.shown ) {\n          $scope.$broadcast('hide-menu');\n          $scope.shown = false;\n        } else {\n          $scope.menuItems = uiGridGridMenuService.getMenuItems( $scope );\n          $scope.$broadcast('show-menu');\n          $scope.shown = true;\n        }\n      };\n\n      $scope.$on('menu-hidden', function() {\n        $scope.shown = false;\n        gridUtil.focus.bySelector($elm, '.ui-grid-icon-container');\n      });\n    }\n  };\n}]);\n})();\n\n(function() {\n\n/**\n * @ngdoc directive\n * @name ui.grid.directive:uiGridMenu\n * @element style\n * @restrict A\n *\n * @description\n * Allows us to interpolate expressions in `<style>` elements. Angular doesn't do this by default as it can/will/might? break in IE8.\n *\n * @example\n <doc:example module=\"app\">\n <doc:source>\n <script>\n var app = angular.module('app', ['ui.grid']);\n\n app.controller('MainCtrl', ['$scope', function ($scope) {\n\n }]);\n </script>\n\n <div ng-controller=\"MainCtrl\">\n   <div ui-grid-menu shown=\"true\"  ></div>\n </div>\n </doc:source>\n <doc:scenario>\n </doc:scenario>\n </doc:example>\n */\nangular.module('ui.grid')\n\n.directive('uiGridMenu', ['$compile', '$timeout', '$window', '$document', 'gridUtil', 'uiGridConstants', 'i18nService',\nfunction ($compile, $timeout, $window, $document, gridUtil, uiGridConstants, i18nService) {\n  return {\n    priority: 0,\n    scope: {\n      // shown: '&',\n      menuItems: '=',\n      autoHide: '=?',\n      col: '=?'\n    },\n    require: '?^uiGrid',\n    templateUrl: 'ui-grid/uiGridMenu',\n    replace: false,\n    link: function ($scope, $elm, $attrs, uiGridCtrl) {\n      $scope.dynamicStyles = '';\n      if (uiGridCtrl && uiGridCtrl.grid && uiGridCtrl.grid.options && uiGridCtrl.grid.options.gridMenuTemplate) {\n        var gridMenuTemplate = uiGridCtrl.grid.options.gridMenuTemplate;\n        gridUtil.getTemplate(gridMenuTemplate).then(function (contents) {\n          var template = angular.element(contents);\n          var newElm = $compile(template)($scope);\n          $elm.replaceWith(newElm);\n        }).catch(angular.noop);\n      }\n\n      var setupHeightStyle = function(gridHeight) {\n        // menu appears under header row, so substract that height from it's total\n        // additional 20px for general padding\n        var gridMenuMaxHeight = gridHeight - uiGridCtrl.grid.headerHeight - 20;\n        $scope.dynamicStyles = [\n          '.grid' + uiGridCtrl.grid.id + ' .ui-grid-menu-mid {',\n          'max-height: ' + gridMenuMaxHeight + 'px;',\n          '}'\n        ].join(' ');\n      };\n\n      if (uiGridCtrl) {\n        setupHeightStyle(uiGridCtrl.grid.gridHeight);\n        uiGridCtrl.grid.api.core.on.gridDimensionChanged($scope, function(oldGridHeight, oldGridWidth, newGridHeight, newGridWidth) {\n          setupHeightStyle(newGridHeight);\n        });\n      }\n\n      $scope.i18n = {\n        close: i18nService.getSafeText('columnMenu.close')\n      };\n\n    // *** Show/Hide functions ******\n      $scope.showMenu = function(event, args) {\n        if ( !$scope.shown ) {\n\n          /*\n           * In order to animate cleanly we remove the ng-if, wait a digest cycle, then\n           * animate the removal of the ng-hide.  We can't successfully (so far as I can tell)\n           * animate removal of the ng-if, as the menu items aren't there yet.  And we don't want\n           * to rely on ng-show only, as that leaves elements in the DOM that are needlessly evaluated\n           * on scroll events.\n           *\n           * Note when testing animation that animations don't run on the tutorials.  When debugging it looks\n           * like they do, but angular has a default $animate provider that is just a stub, and that's what's\n           * being called.  ALso don't be fooled by the fact that your browser has actually loaded the\n           * angular-translate.js, it's not using it.  You need to test animations in an external application.\n           */\n          $scope.shown = true;\n\n          // Must be a timeout in order to work properly in Firefox. Issue #6533\n          $timeout(function() {\n            $scope.shownMid = true;\n            $scope.$emit('menu-shown');\n          });\n        } else if ( !$scope.shownMid ) {\n          // we're probably doing a hide then show, so we don't need to wait for ng-if\n          $scope.shownMid = true;\n          $scope.$emit('menu-shown');\n        }\n\n        var docEventType = 'click';\n        if (args && args.originalEvent && args.originalEvent.type && args.originalEvent.type === 'touchstart') {\n          docEventType = args.originalEvent.type;\n        }\n\n        // Turn off an existing document click handler\n        angular.element(document).off('click touchstart', applyHideMenu);\n\n        // Turn on the document click handler, but in a timeout so it doesn't apply to THIS click if there is one\n        $timeout(function() {\n          angular.element(document).on(docEventType, applyHideMenu);\n        });\n      };\n\n\n      $scope.hideMenu = function(event) {\n        if ( $scope.shown ) {\n          /*\n           * In order to animate cleanly we animate the addition of ng-hide, then use a $timeout to\n           * set the ng-if (shown = false) after the animation runs.  In theory we can cascade off the\n           * callback on the addClass method, but it is very unreliable with unit tests for no discernable reason.\n           *\n           * The user may have clicked on the menu again whilst\n           * we're waiting, so we check that the mid isn't shown before applying the ng-if.\n           */\n          $scope.shownMid = false;\n          $timeout( function() {\n            if ( !$scope.shownMid ) {\n              $scope.shown = false;\n              $scope.$emit('menu-hidden');\n            }\n          }, 40);\n        }\n\n        angular.element(document).off('click touchstart', applyHideMenu);\n      };\n\n      $scope.$on('hide-menu', function (event, args) {\n        $scope.hideMenu(event, args);\n      });\n\n      $scope.$on('show-menu', function (event, args) {\n        $scope.showMenu(event, args);\n      });\n\n\n    // *** Auto hide when click elsewhere ******\n      var applyHideMenu = function(event) {\n        if ($scope.shown) {\n          var disableGridMenuHideOnScroll = uiGridCtrl && uiGridCtrl.grid && uiGridCtrl.grid.options ? uiGridCtrl.grid.options.disableGridMenuHideOnScroll : null;\n\n          if (event.type !== 'scroll' || !disableGridMenuHideOnScroll) {\n            if ($scope.col && $scope.col.filterContainer === 'columnMenu') {\n              var elm = document.querySelector('.ui-grid-column-menu').querySelector('[ui-grid-filter]');\n              if (elm && elm.contains(event.target)) {\n                return false;\n              }\n            }\n\n            $scope.$apply(function () {\n              $scope.hideMenu();\n            });\n          }\n        }\n      };\n\n      $scope.checkKeyDown = function(event) {\n        var setFocus = function(elm) {\n          elm.focus();\n          event.preventDefault();\n        };\n        if (event.keyCode === uiGridConstants.keymap.ESC) {\n          $scope.hideMenu();\n        } else if (event.keyCode === uiGridConstants.keymap.TAB) {\n          var firstMenuItem, lastMenuItem;\n          var menuItemButtons = $elm[0].querySelectorAll('button:not(.ng-hide)');\n          if (menuItemButtons.length > 0) {\n            firstMenuItem = menuItemButtons[0];\n            lastMenuItem = menuItemButtons[menuItemButtons.length - 1];\n            if (event.target.parentElement.id === lastMenuItem.parentElement.id && !event.shiftKey) {\n              setFocus(firstMenuItem);\n            } else if (event.target.parentElement.id === firstMenuItem.parentElement.id && event.shiftKey) {\n              setFocus(lastMenuItem);\n            }\n          }\n        }\n      };\n\n      if (typeof($scope.autoHide) === 'undefined' || $scope.autoHide === undefined) {\n        $scope.autoHide = true;\n      }\n\n      if ($scope.autoHide) {\n        angular.element($window).on('resize', applyHideMenu);\n      }\n\n      $scope.$on('$destroy', function unbindEvents() {\n        angular.element($window).off('resize', applyHideMenu);\n        angular.element(document).off('click touchstart', applyHideMenu);\n      });\n\n      if (uiGridCtrl) {\n       $scope.$on('$destroy', uiGridCtrl.grid.api.core.on.scrollBegin($scope, applyHideMenu ));\n      }\n\n      $scope.$on('$destroy', $scope.$on(uiGridConstants.events.ITEM_DRAGGING, applyHideMenu ));\n    }\n  };\n}])\n\n.directive('uiGridMenuItem', ['gridUtil', '$compile', 'i18nService', function (gridUtil, $compile, i18nService) {\n  return {\n    priority: 0,\n    scope: {\n      name: '=',\n      active: '=',\n      action: '=',\n      icon: '=',\n      shown: '=',\n      context: '=',\n      templateUrl: '=',\n      leaveOpen: '=',\n      screenReaderOnly: '='\n    },\n    require: ['?^uiGrid'],\n    templateUrl: 'ui-grid/uiGridMenuItem',\n    replace: false,\n    compile: function() {\n      return {\n        pre: function ($scope, $elm) {\n          if ($scope.templateUrl) {\n            gridUtil.getTemplate($scope.templateUrl)\n                .then(function (contents) {\n                  var template = angular.element(contents);\n\n                  var newElm = $compile(template)($scope);\n                  $elm.replaceWith(newElm);\n                }).catch(angular.noop);\n          }\n        },\n        post: function ($scope, $elm, $attrs, controllers) {\n          var uiGridCtrl = controllers[0];\n\n          // TODO(c0bra): validate that shown and active are functions if they're defined. An exception is already thrown above this though\n          // if (typeof($scope.shown) !== 'undefined' && $scope.shown && typeof($scope.shown) !== 'function') {\n          //   throw new TypeError(\"$scope.shown is defined but not a function\");\n          // }\n          if (typeof($scope.shown) === 'undefined' || $scope.shown === null) {\n            $scope.shown = function() { return true; };\n          }\n\n          $scope.itemShown = function () {\n            var context = {};\n            if ($scope.context) {\n              context.context = $scope.context;\n            }\n\n            if (typeof(uiGridCtrl) !== 'undefined' && uiGridCtrl) {\n              context.grid = uiGridCtrl.grid;\n            }\n\n            return $scope.shown.call(context);\n          };\n\n          $scope.itemAction = function($event, title) {\n            $event.stopPropagation();\n\n            if (typeof($scope.action) === 'function') {\n              var context = {};\n\n              if ($scope.context) {\n                context.context = $scope.context;\n              }\n\n              // Add the grid to the function call context if the uiGrid controller is present\n              if (typeof(uiGridCtrl) !== 'undefined' && uiGridCtrl) {\n                context.grid = uiGridCtrl.grid;\n              }\n\n              $scope.action.call(context, $event, title);\n\n              if ( !$scope.leaveOpen ) {\n                $scope.$emit('hide-menu');\n              } else {\n                // Maintain focus on the selected item\n                var correctParent = $event.target.parentElement;\n\n                // nodeName of 'I' means target is i element, need the next parent\n                if (angular.element($event.target)[0].nodeName === 'I') {\n                  correctParent = correctParent.parentElement;\n                }\n\n                gridUtil.focus.bySelector(correctParent, 'button[type=button]', true);\n              }\n            }\n          };\n\n          $scope.label = function() {\n            var toBeDisplayed = $scope.name;\n\n            if (typeof($scope.name) === 'function') {\n              toBeDisplayed = $scope.name.call();\n            }\n\n            return toBeDisplayed;\n          };\n\n          $scope.i18n = i18nService.get();\n        }\n      };\n    }\n  };\n}]);\n\n})();\n\n(function() {\n  'use strict';\n  /**\n   * @ngdoc overview\n   * @name ui.grid.directive:uiGridOneBind\n   * @summary A group of directives that provide a one time bind to a dom element.\n   * @description A group of directives that provide a one time bind to a dom element.\n   * As one time bindings are not supported in Angular 1.2.* this directive provdes this capability.\n   * This is done to reduce the number of watchers on the dom.\n   * <br/>\n   * <h2>Short Example ({@link ui.grid.directive:uiGridOneBindSrc ui-grid-one-bind-src})</h2>\n   * <pre>\n        <div ng-init=\"imageName = 'myImageDir.jpg'\">\n          <img ui-grid-one-bind-src=\"imageName\"></img>\n        </div>\n     </pre>\n   * Will become:\n   * <pre>\n       <div ng-init=\"imageName = 'myImageDir.jpg'\">\n         <img ui-grid-one-bind-src=\"imageName\" src=\"myImageDir.jpg\"></img>\n       </div>\n     </pre>\n     </br>\n     <h2>Short Example ({@link ui.grid.directive:uiGridOneBindText ui-grid-one-bind-text})</h2>\n   * <pre>\n        <div ng-init=\"text='Add this text'\" ui-grid-one-bind-text=\"text\"></div>\n     </pre>\n   * Will become:\n   * <pre>\n   <div ng-init=\"text='Add this text'\" ui-grid-one-bind-text=\"text\">Add this text</div>\n     </pre>\n     </br>\n   * <b>Note:</b> This behavior is slightly different for the {@link ui.grid.directive:uiGridOneBindIdGrid uiGridOneBindIdGrid}\n   * and {@link ui.grid.directive:uiGridOneBindAriaLabelledbyGrid uiGridOneBindAriaLabelledbyGrid} directives.\n   *\n   */\n  // https://github.com/joshkurz/Black-Belt-AngularJS-Directives/blob/master/directives/Optimization/oneBind.js\n  var oneBinders = angular.module('ui.grid');\n  angular.forEach([\n      /**\n       * @ngdoc directive\n       * @name ui.grid.directive:uiGridOneBindSrc\n       * @memberof ui.grid.directive:uiGridOneBind\n       * @element img\n       * @restrict A\n       * @param {String} uiGridOneBindSrc The angular string you want to bind. Does not support interpolation. Don't use <code>{{scopeElt}}</code> instead use <code>scopeElt</code>.\n       * @description One time binding for the src dom tag.\n       *\n       */\n      {tag: 'Src', method: 'attr'},\n      /**\n       * @ngdoc directive\n       * @name ui.grid.directive:uiGridOneBindText\n       * @element div\n       * @restrict A\n       * @param {String} uiGridOneBindText The angular string you want to bind. Does not support interpolation. Don't use <code>{{scopeElt}}</code> instead use <code>scopeElt</code>.\n       * @description One time binding for the text dom tag.\n       */\n      {tag: 'Text', method: 'text'},\n      /**\n       * @ngdoc directive\n       * @name ui.grid.directive:uiGridOneBindHref\n       * @element div\n       * @restrict A\n       * @param {String} uiGridOneBindHref The angular string you want to bind. Does not support interpolation. Don't use <code>{{scopeElt}}</code> instead use <code>scopeElt</code>.\n       * @description One time binding for the href dom tag. For more information see {@link ui.grid.directive:uiGridOneBind}.\n       */\n      {tag: 'Href', method: 'attr'},\n      /**\n       * @ngdoc directive\n       * @name ui.grid.directive:uiGridOneBindClass\n       * @element div\n       * @restrict A\n       * @param {String} uiGridOneBindClass The angular string you want to bind. Does not support interpolation. Don't use <code>{{scopeElt}}</code> instead use <code>scopeElt</code>.\n       * @param {Object} uiGridOneBindClass The object that you want to bind. At least one of the values in the object must be something other than null or undefined for the watcher to be removed.\n       *                                    this is to prevent the watcher from being removed before the scope is initialized.\n       * @param {Array} uiGridOneBindClass An array of classes to bind to this element.\n       * @description One time binding for the class dom tag. For more information see {@link ui.grid.directive:uiGridOneBind}.\n       */\n      {tag: 'Class', method: 'addClass'},\n      /**\n       * @ngdoc directive\n       * @name ui.grid.directive:uiGridOneBindHtml\n       * @element div\n       * @restrict A\n       * @param {String} uiGridOneBindHtml The angular string you want to bind. Does not support interpolation. Don't use <code>{{scopeElt}}</code> instead use <code>scopeElt</code>.\n       * @description One time binding for the html method on a dom element. For more information see {@link ui.grid.directive:uiGridOneBind}.\n       */\n      {tag: 'Html', method: 'html'},\n      /**\n       * @ngdoc directive\n       * @name ui.grid.directive:uiGridOneBindAlt\n       * @element div\n       * @restrict A\n       * @param {String} uiGridOneBindAlt The angular string you want to bind. Does not support interpolation. Don't use <code>{{scopeElt}}</code> instead use <code>scopeElt</code>.\n       * @description One time binding for the alt dom tag. For more information see {@link ui.grid.directive:uiGridOneBind}.\n       */\n      {tag: 'Alt', method: 'attr'},\n      /**\n       * @ngdoc directive\n       * @name ui.grid.directive:uiGridOneBindStyle\n       * @element div\n       * @restrict A\n       * @param {String} uiGridOneBindStyle The angular string you want to bind. Does not support interpolation. Don't use <code>{{scopeElt}}</code> instead use <code>scopeElt</code>.\n       * @description One time binding for the style dom tag. For more information see {@link ui.grid.directive:uiGridOneBind}.\n       */\n      {tag: 'Style', method: 'css'},\n      /**\n       * @ngdoc directive\n       * @name ui.grid.directive:uiGridOneBindValue\n       * @element div\n       * @restrict A\n       * @param {String} uiGridOneBindValue The angular string you want to bind. Does not support interpolation. Don't use <code>{{scopeElt}}</code> instead use <code>scopeElt</code>.\n       * @description One time binding for the value dom tag. For more information see {@link ui.grid.directive:uiGridOneBind}.\n       */\n      {tag: 'Value', method: 'attr'},\n      /**\n       * @ngdoc directive\n       * @name ui.grid.directive:uiGridOneBindId\n       * @element div\n       * @restrict A\n       * @param {String} uiGridOneBindId The angular string you want to bind. Does not support interpolation. Don't use <code>{{scopeElt}}</code> instead use <code>scopeElt</code>.\n       * @description One time binding for the value dom tag. For more information see {@link ui.grid.directive:uiGridOneBind}.\n       */\n      {tag: 'Id', method: 'attr'},\n      /**\n       * @ngdoc directive\n       * @name ui.grid.directive:uiGridOneBindIdGrid\n       * @element div\n       * @restrict A\n       * @param {String} uiGridOneBindIdGrid The angular string you want to bind. Does not support interpolation. Don't use <code>{{scopeElt}}</code> instead use <code>scopeElt</code>.\n       * @description One time binding for the id dom tag.\n       * <h1>Important Note!</h1>\n       * If the id tag passed as a parameter does <b>not</b> contain the grid id as a substring\n       * then the directive will search the scope and the parent controller (if it is a uiGridController) for the grid.id value.\n       * If this value is found then it is appended to the begining of the id tag. If the grid is not found then the directive throws an error.\n       * This is done in order to ensure uniqueness of id tags across the grid.\n       * This is to prevent two grids in the same document having duplicate id tags.\n       */\n      {tag: 'Id', directiveName: 'IdGrid', method: 'attr', appendGridId: true},\n      /**\n       * @ngdoc directive\n       * @name ui.grid.directive:uiGridOneBindTitle\n       * @element div\n       * @restrict A\n       * @param {String} uiGridOneBindTitle The angular string you want to bind. Does not support interpolation. Don't use <code>{{scopeElt}}</code> instead use <code>scopeElt</code>.\n       * @description One time binding for the title dom tag. For more information see {@link ui.grid.directive:uiGridOneBind}.\n       */\n      {tag: 'Title', method: 'attr'},\n      /**\n       * @ngdoc directive\n       * @name ui.grid.directive:uiGridOneBindAriaLabel\n       * @element div\n       * @restrict A\n       * @param {String} uiGridOneBindAriaLabel The angular string you want to bind. Does not support interpolation. Don't use <code>{{scopeElt}}</code> instead use <code>scopeElt</code>.\n       * @description One time binding for the aria-label dom tag. For more information see {@link ui.grid.directive:uiGridOneBind}.\n       *<br/>\n       * <pre>\n            <div ng-init=\"text='Add this text'\" ui-grid-one-bind-aria-label=\"text\"></div>\n         </pre>\n       * Will become:\n       * <pre>\n            <div ng-init=\"text='Add this text'\" ui-grid-one-bind-aria-label=\"text\" aria-label=\"Add this text\"></div>\n         </pre>\n       */\n      {tag: 'Label', method: 'attr', aria: true},\n      /**\n       * @ngdoc directive\n       * @name ui.grid.directive:uiGridOneBindAriaLabelledby\n       * @element div\n       * @restrict A\n       * @param {String} uiGridOneBindAriaLabelledby The angular string you want to bind. Does not support interpolation. Don't use <code>{{scopeElt}}</code> instead use <code>scopeElt</code>.\n       * @description One time binding for the aria-labelledby dom tag. For more information see {@link ui.grid.directive:uiGridOneBind}.\n       *<br/>\n       * <pre>\n            <div ng-init=\"anId = 'gridID32'\" ui-grid-one-bind-aria-labelledby=\"anId\"></div>\n         </pre>\n       * Will become:\n       * <pre>\n            <div ng-init=\"anId = 'gridID32'\" ui-grid-one-bind-aria-labelledby=\"anId\" aria-labelledby=\"gridID32\"></div>\n         </pre>\n       */\n      {tag: 'Labelledby', method: 'attr', aria: true},\n      /**\n       * @ngdoc directive\n       * @name ui.grid.directive:uiGridOneBindAriaLabelledbyGrid\n       * @element div\n       * @restrict A\n       * @param {String} uiGridOneBindAriaLabelledbyGrid The angular string you want to bind. Does not support interpolation. Don't use <code>{{scopeElt}}</code> instead use <code>scopeElt</code>.\n       * @description One time binding for the aria-labelledby dom tag. For more information see {@link ui.grid.directive:uiGridOneBind}.\n       * Works somewhat like {@link ui.grid.directive:uiGridOneBindIdGrid} however this one supports a list of ids (seperated by a space) and will dynamically add the\n       * grid id to each one.\n       *<br/>\n       * <pre>\n            <div ng-init=\"anId = 'gridID32'\" ui-grid-one-bind-aria-labelledby-grid=\"anId\"></div>\n         </pre>\n       * Will become ([grid.id] will be replaced by the actual grid id):\n       * <pre>\n            <div ng-init=\"anId = 'gridID32'\" ui-grid-one-bind-aria-labelledby-grid=\"anId\" aria-labelledby-Grid=\"[grid.id]-gridID32\"></div>\n         </pre>\n       */\n      {tag: 'Labelledby', directiveName: 'LabelledbyGrid', appendGridId: true, method: 'attr', aria: true},\n      /**\n       * @ngdoc directive\n       * @name ui.grid.directive:uiGridOneBindAriaDescribedby\n       * @element ANY\n       * @restrict A\n       * @param {String} uiGridOneBindAriaDescribedby The angular string you want to bind. Does not support interpolation. Don't use <code>{{scopeElt}}</code> instead use <code>scopeElt</code>.\n       * @description One time binding for the aria-describedby dom tag. For more information see {@link ui.grid.directive:uiGridOneBind}.\n       *<br/>\n       * <pre>\n            <div ng-init=\"anId = 'gridID32'\" ui-grid-one-bind-aria-describedby=\"anId\"></div>\n         </pre>\n       * Will become:\n       * <pre>\n            <div ng-init=\"anId = 'gridID32'\" ui-grid-one-bind-aria-describedby=\"anId\" aria-describedby=\"gridID32\"></div>\n         </pre>\n       */\n      {tag: 'Describedby', method: 'attr', aria: true},\n      /**\n       * @ngdoc directive\n       * @name ui.grid.directive:uiGridOneBindAriaDescribedbyGrid\n       * @element ANY\n       * @restrict A\n       * @param {String} uiGridOneBindAriaDescribedbyGrid The angular string you want to bind. Does not support interpolation. Don't use <code>{{scopeElt}}</code> instead use <code>scopeElt</code>.\n       * @description One time binding for the aria-labelledby dom tag. For more information see {@link ui.grid.directive:uiGridOneBind}.\n       * Works somewhat like {@link ui.grid.directive:uiGridOneBindIdGrid} however this one supports a list of ids (seperated by a space) and will dynamically add the\n       * grid id to each one.\n       *<br/>\n       * <pre>\n            <div ng-init=\"anId = 'gridID32'\" ui-grid-one-bind-aria-describedby-grid=\"anId\"></div>\n         </pre>\n       * Will become ([grid.id] will be replaced by the actual grid id):\n       * <pre>\n            <div ng-init=\"anId = 'gridID32'\" ui-grid-one-bind-aria-describedby-grid=\"anId\" aria-describedby=\"[grid.id]-gridID32\"></div>\n         </pre>\n       */\n      {tag: 'Describedby', directiveName: 'DescribedbyGrid', appendGridId: true, method: 'attr', aria: true}],\n    function(v) {\n\n      var baseDirectiveName = 'uiGridOneBind';\n      // If it is an aria tag then append the aria label seperately\n      // This is done because the aria tags are formatted aria-* and the directive name can't have a '-' character in it.\n      // If the diretiveName has to be overridden then it does so here. This is because the tag being modified and the directive sometimes don't\n      // match up.\n      var directiveName = (v.aria ? baseDirectiveName + 'Aria' : baseDirectiveName) + (v.directiveName ? v.directiveName : v.tag);\n      oneBinders.directive(directiveName, ['gridUtil', function(gridUtil) {\n        return {\n          restrict: 'A',\n          require: ['?uiGrid','?^uiGrid'],\n          link: function(scope, iElement, iAttrs, controllers) {\n            /* Appends the grid id to the beginning of the value. */\n            var appendGridId = function(val) {\n              var grid; // Get an instance of the grid if its available\n\n              // If its available in the scope then we don't need to try to find it elsewhere\n              if (scope.grid) {\n                grid = scope.grid;\n              }\n\n              // Another possible location to try to find the grid\n              else if (scope.col && scope.col.grid) {\n                grid = scope.col.grid;\n              }\n\n              // Last ditch effort: Search through the provided controllers.\n              else if (!controllers.some( // Go through the controllers till one has the element we need\n                function(controller) {\n                  if (controller && controller.grid) {\n                    grid = controller.grid;\n                    return true; // We've found the grid\n                  }\n              })) {\n                // We tried our best to find it for you\n                gridUtil.logError(\"[\"+directiveName+\"] A valid grid could not be found to bind id. Are you using this directive \" +\n                                 \"within the correct scope? Trying to generate id: [gridID]-\" + val);\n                throw new Error(\"No valid grid could be found\");\n              }\n\n              if (grid) {\n                var idRegex = new RegExp(grid.id.toString());\n\n                // If the grid id hasn't been appended already in the template declaration\n                if (!idRegex.test(val)) {\n                  val = grid.id.toString() + '-' + val;\n                }\n              }\n              return val;\n            };\n\n            // The watch returns a function to remove itself.\n            var rmWatcher = scope.$watch(iAttrs[directiveName], function(newV) {\n              if (newV) {\n                // If we are trying to add an id element then we also apply the grid id if it isn't already there\n                if (v.appendGridId) {\n                  var newIdString = null;\n\n                  // Append the id to all of the new ids.\n                  angular.forEach( newV.split(' '), function(s) {\n                    newIdString = (newIdString ? (newIdString + ' ') : '') +  appendGridId(s);\n                  });\n                  newV = newIdString;\n                }\n\n                // Append this newValue to the dom element.\n                switch (v.method) {\n                  case 'attr': // The attr method takes two paraams the tag and the value\n                    if (v.aria) {\n                      // If it is an aria element then append the aria prefix\n                      iElement[v.method]('aria-' + v.tag.toLowerCase(),newV);\n                    } else {\n                      iElement[v.method](v.tag.toLowerCase(),newV);\n                    }\n                    break;\n                  case 'addClass':\n                    // Pulled from https://github.com/Pasvaz/bindonce/blob/master/bindonce.js\n                    if (angular.isObject(newV) && !angular.isArray(newV)) {\n                      var results = [],\n                        nonNullFound = false; // We don't want to remove the binding unless the key is actually defined\n\n                      angular.forEach(newV, function (value, index) {\n                        if (value !== null && typeof(value) !== \"undefined\") {\n                          nonNullFound = true; // A non null value for a key was found so the object must have been initialized\n                          if (value) {results.push(index);}\n                        }\n                      });\n                      // A non null value for a key wasn't found so assume that the scope values haven't been fully initialized\n                      if (!nonNullFound) {\n                        return; // If not initialized then the watcher should not be removed yet.\n                      }\n                      newV = results;\n                    }\n\n                    if (newV) {\n                      iElement.addClass(angular.isArray(newV) ? newV.join(' ') : newV);\n                    } else {\n                      return;\n                    }\n                    break;\n                  default:\n                    iElement[v.method](newV);\n                    break;\n                }\n\n                // Removes the watcher on itself after the bind\n                rmWatcher();\n              }\n            // True ensures that equality is determined using angular.equals instead of ===\n            }, true); // End rm watchers\n          } // End compile function\n        }; // End directive return\n      } // End directive function\n    ]); // End directive\n  }); // End angular foreach\n})();\n\n(function() {\n\t'use strict';\n\n\tvar module = angular.module('ui.grid');\n\n\tmodule.directive('uiGridRenderContainer', ['$timeout', '$document', 'uiGridConstants', 'gridUtil', 'ScrollEvent',\n\t\tfunction($timeout, $document, uiGridConstants, gridUtil, ScrollEvent) {\n\t\t\treturn {\n\t\t\t\treplace: true,\n\t\t\t\ttransclude: true,\n\t\t\t\ttemplateUrl: 'ui-grid/uiGridRenderContainer',\n\t\t\t\trequire: ['^uiGrid', 'uiGridRenderContainer'],\n\t\t\t\tscope: {\n\t\t\t\t\tcontainerId: '=',\n\t\t\t\t\trowContainerName: '=',\n\t\t\t\t\tcolContainerName: '=',\n\t\t\t\t\tbindScrollHorizontal: '=',\n\t\t\t\t\tbindScrollVertical: '=',\n\t\t\t\t\tenableVerticalScrollbar: '=',\n\t\t\t\t\tenableHorizontalScrollbar: '='\n\t\t\t\t},\n\t\t\t\tcontroller: 'uiGridRenderContainer as RenderContainer',\n\t\t\t\tcompile: function() {\n\t\t\t\t\treturn {\n\t\t\t\t\t\tpre: function prelink($scope, $elm, $attrs, controllers) {\n\t\t\t\t\t\t\tvar rowContainer, colContainer,\n\t\t\t\t\t\t\t\tuiGridCtrl = controllers[0],\n\t\t\t\t\t\t\t\tcontainerCtrl = controllers[1],\n\t\t\t\t\t\t\t\tgrid = $scope.grid = uiGridCtrl.grid;\n\n\t\t\t\t\t\t\t// Verify that the render container for this element exists\n\t\t\t\t\t\t\tif (!$scope.rowContainerName) {\n\t\t\t\t\t\t\t\tthrow new Error('No row render container name specified');\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\tif (!$scope.colContainerName) {\n\t\t\t\t\t\t\t\tthrow new Error('No column render container name specified');\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\tif (!grid.renderContainers[$scope.rowContainerName]) {\n\t\t\t\t\t\t\t\tthrow new Error('Row render container \"' + $scope.rowContainerName + '\" is not registered.');\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\tif (!grid.renderContainers[$scope.colContainerName]) {\n\t\t\t\t\t\t\t\tthrow new Error('Column render container \"' + $scope.colContainerName + '\" is not registered.');\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\trowContainer = $scope.rowContainer = grid.renderContainers[$scope.rowContainerName];\n\t\t\t\t\t\t\tcolContainer = $scope.colContainer = grid.renderContainers[$scope.colContainerName];\n\n\t\t\t\t\t\t\tcontainerCtrl.containerId = $scope.containerId;\n\t\t\t\t\t\t\tcontainerCtrl.rowContainer = rowContainer;\n\t\t\t\t\t\t\tcontainerCtrl.colContainer = colContainer;\n\t\t\t\t\t\t},\n\t\t\t\t\t\tpost: function postlink($scope, $elm, $attrs, controllers) {\n\t\t\t\t\t\t\tvar uiGridCtrl = controllers[0],\n\t\t\t\t\t\t\t\tcontainerCtrl = controllers[1],\n\t\t\t\t\t\t\t\tgrid = uiGridCtrl.grid,\n\t\t\t\t\t\t\t\trowContainer = containerCtrl.rowContainer,\n\t\t\t\t\t\t\t\tcolContainer = containerCtrl.colContainer,\n\t\t\t\t\t\t\t\tscrollTop = null,\n\t\t\t\t\t\t\t\tscrollLeft = null,\n\t\t\t\t\t\t\t\trenderContainer = grid.renderContainers[$scope.containerId];\n\n\t\t\t\t\t\t\t// Put the container name on this element as a class\n\t\t\t\t\t\t\t$elm.addClass('ui-grid-render-container-' + $scope.containerId);\n\n\t\t\t\t\t\t\t// Scroll the render container viewport when the mousewheel is used\n\t\t\t\t\t\t\tgridUtil.on.mousewheel($elm, function(event) {\n\t\t\t\t\t\t\t\tvar scrollEvent = new ScrollEvent(grid, rowContainer, colContainer, ScrollEvent.Sources.RenderContainerMouseWheel);\n\n\t\t\t\t\t\t\t\tif (event.deltaY !== 0) {\n\t\t\t\t\t\t\t\t\tvar scrollYAmount = event.deltaY * -1 * event.deltaFactor;\n\n\t\t\t\t\t\t\t\t\tscrollTop = containerCtrl.viewport[0].scrollTop;\n\n\t\t\t\t\t\t\t\t\t// Get the scroll percentage\n\t\t\t\t\t\t\t\t\tscrollEvent.verticalScrollLength = rowContainer.getVerticalScrollLength();\n\t\t\t\t\t\t\t\t\tvar scrollYPercentage = (scrollTop + scrollYAmount) / scrollEvent.verticalScrollLength;\n\n\t\t\t\t\t\t\t\t\t// If we should be scrolled 100%, make sure the scrollTop matches the maximum scroll length\n\t\t\t\t\t\t\t\t\t//   Viewports that have \"overflow: hidden\" don't let the mousewheel scroll all the way to the bottom without this check\n\t\t\t\t\t\t\t\t\tif (scrollYPercentage >= 1 && scrollTop < scrollEvent.verticalScrollLength) {\n\t\t\t\t\t\t\t\t\t\tcontainerCtrl.viewport[0].scrollTop = scrollEvent.verticalScrollLength;\n\t\t\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t\t\t// Keep scrollPercentage within the range 0-1.\n\t\t\t\t\t\t\t\t\tif (scrollYPercentage < 0) { scrollYPercentage = 0; }\n\t\t\t\t\t\t\t\t\telse if (scrollYPercentage > 1) { scrollYPercentage = 1; }\n\n\t\t\t\t\t\t\t\t\tscrollEvent.y = {percentage: scrollYPercentage, pixels: scrollYAmount};\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\tif (event.deltaX !== 0) {\n\t\t\t\t\t\t\t\t\tvar scrollXAmount = event.deltaX * event.deltaFactor;\n\n\t\t\t\t\t\t\t\t\t// Get the scroll percentage\n\t\t\t\t\t\t\t\t\tscrollLeft = gridUtil.normalizeScrollLeft(containerCtrl.viewport, grid);\n\t\t\t\t\t\t\t\t\tscrollEvent.horizontalScrollLength = (colContainer.getCanvasWidth() - colContainer.getViewportWidth());\n\t\t\t\t\t\t\t\t\tvar scrollXPercentage = (scrollLeft + scrollXAmount) / scrollEvent.horizontalScrollLength;\n\n\t\t\t\t\t\t\t\t\t// Keep scrollPercentage within the range 0-1.\n\t\t\t\t\t\t\t\t\tif (scrollXPercentage < 0) { scrollXPercentage = 0; }\n\t\t\t\t\t\t\t\t\telse if (scrollXPercentage > 1) { scrollXPercentage = 1; }\n\n\t\t\t\t\t\t\t\t\tscrollEvent.x = {percentage: scrollXPercentage, pixels: scrollXAmount};\n\t\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t\t// Let the parent container scroll if the grid is already at the top/bottom\n\t\t\t\t\t\t\t\tif (!((event.deltaY !== 0 && (scrollEvent.atTop(scrollTop) || scrollEvent.atBottom(scrollTop))) ||\n\t\t\t\t\t\t\t\t\t(event.deltaX !== 0 && (scrollEvent.atLeft(scrollLeft) || scrollEvent.atRight(scrollLeft))))) {\n\t\t\t\t\t\t\t\t\tevent.preventDefault();\n\t\t\t\t\t\t\t\t\tevent.stopPropagation();\n\t\t\t\t\t\t\t\t\tscrollEvent.fireThrottledScrollingEvent('', scrollEvent);\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t});\n\n\t\t\t\t\t\t\t$elm.bind('$destroy', function() {\n\t\t\t\t\t\t\t\t$elm.unbind('keydown');\n\n\t\t\t\t\t\t\t\t['touchstart', 'touchmove', 'touchend', 'keydown', 'wheel', 'mousewheel',\n\t\t\t\t\t\t\t\t\t'DomMouseScroll', 'MozMousePixelScroll'].forEach(function(eventName) {\n\t\t\t\t\t\t\t\t\t$elm.unbind(eventName);\n\t\t\t\t\t\t\t\t});\n\t\t\t\t\t\t\t});\n\n\t\t\t\t\t\t\t// TODO(c0bra): Handle resizing the inner canvas based on the number of elements\n\t\t\t\t\t\t\tfunction update() {\n\t\t\t\t\t\t\t\tvar ret = '';\n\n\t\t\t\t\t\t\t\tvar canvasWidth = colContainer.canvasWidth;\n\t\t\t\t\t\t\t\tvar viewportWidth = colContainer.getViewportWidth();\n\n\t\t\t\t\t\t\t\tvar canvasHeight = rowContainer.getCanvasHeight();\n\n\t\t\t\t\t\t\t\tvar viewportHeight = rowContainer.getViewportHeight();\n\t\t\t\t\t\t\t\t// shorten the height to make room for a scrollbar placeholder\n\t\t\t\t\t\t\t\tif (colContainer.needsHScrollbarPlaceholder()) {\n\t\t\t\t\t\t\t\t\tviewportHeight -= grid.scrollbarHeight;\n\t\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t\tvar headerViewportWidth,\n\t\t\t\t\t\t\t\t\tfooterViewportWidth;\n\t\t\t\t\t\t\t\theaderViewportWidth = footerViewportWidth = colContainer.getHeaderViewportWidth();\n\n\t\t\t\t\t\t\t\t// Set canvas dimensions\n\t\t\t\t\t\t\t\tret += '\\n .grid' + uiGridCtrl.grid.id + ' .ui-grid-render-container-' + $scope.containerId\n\t\t\t\t\t\t\t\t\t+ ' .ui-grid-canvas { width: ' + canvasWidth + 'px; height: ' + canvasHeight + 'px; }';\n\n\t\t\t\t\t\t\t\tret += '\\n .grid' + uiGridCtrl.grid.id + ' .ui-grid-render-container-' + $scope.containerId\n\t\t\t\t\t\t\t\t\t+ ' .ui-grid-header-canvas { width: ' + (canvasWidth + grid.scrollbarWidth) + 'px; }';\n\n\t\t\t\t\t\t\t\tif (renderContainer.explicitHeaderCanvasHeight) {\n\t\t\t\t\t\t\t\t\t// get height from body container\n\t\t\t\t\t\t\t\t\tvar reHCHeight = document.querySelector(\n\t\t\t\t\t\t\t\t\t\t'.grid' + uiGridCtrl.grid.id + ' .ui-grid-render-container-body .ui-grid-header-canvas');\n\n\t\t\t\t\t\t\t\t\tif (reHCHeight) {\n\t\t\t\t\t\t\t\t\t\trenderContainer.explicitHeaderCanvasHeight = reHCHeight.offsetHeight;\n\t\t\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t\t\tret += '\\n .grid' + uiGridCtrl.grid.id + ' .ui-grid-render-container-' + $scope.containerId\n\t\t\t\t\t\t\t\t\t\t+ ' .ui-grid-header-canvas { height: ' + renderContainer.explicitHeaderCanvasHeight + 'px; }';\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\telse {\n\t\t\t\t\t\t\t\t\tret += '\\n .grid' + uiGridCtrl.grid.id + ' .ui-grid-render-container-' + $scope.containerId\n\t\t\t\t\t\t\t\t\t\t+ ' .ui-grid-header-canvas { height: inherit; }';\n\t\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t\tret += '\\n .grid' + uiGridCtrl.grid.id + ' .ui-grid-render-container-' + $scope.containerId\n\t\t\t\t\t\t\t\t\t+ ' .ui-grid-viewport { width: ' + viewportWidth + 'px; height: ' + viewportHeight + 'px; }';\n\t\t\t\t\t\t\t\tret += '\\n .grid' + uiGridCtrl.grid.id + ' .ui-grid-render-container-' + $scope.containerId\n\t\t\t\t\t\t\t\t\t+ ' .ui-grid-header-viewport { width: ' + headerViewportWidth + 'px; }';\n\n\t\t\t\t\t\t\t\tret += '\\n .grid' + uiGridCtrl.grid.id + ' .ui-grid-render-container-' + $scope.containerId\n\t\t\t\t\t\t\t\t\t+ ' .ui-grid-footer-canvas { width: ' + (canvasWidth + grid.scrollbarWidth) + 'px; }';\n\t\t\t\t\t\t\t\tret += '\\n .grid' + uiGridCtrl.grid.id + ' .ui-grid-render-container-' + $scope.containerId\n\t\t\t\t\t\t\t\t\t+ ' .ui-grid-footer-viewport { width: ' + footerViewportWidth + 'px; }';\n\n\t\t\t\t\t\t\t\treturn ret;\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\tuiGridCtrl.grid.registerStyleComputation({\n\t\t\t\t\t\t\t\tpriority: 6,\n\t\t\t\t\t\t\t\tfunc: update\n\t\t\t\t\t\t\t});\n\t\t\t\t\t\t}\n\t\t\t\t\t};\n\t\t\t\t}\n\t\t\t};\n\t\t}]);\n\n\tmodule.controller('uiGridRenderContainer', ['$scope', 'gridUtil', function($scope, gridUtil) {\n\t}]);\n})();\n\n(function() {\n  'use strict';\n\n  angular.module('ui.grid').directive('uiGridRow', function() {\n    return {\n      replace: true,\n      require: ['^uiGrid', '^uiGridRenderContainer'],\n      scope: {\n         row: '=uiGridRow',\n         // rowRenderIndex is added to scope to give the true visual index of the row to any directives that need it\n         rowRenderIndex: '='\n      },\n      compile: function() {\n        return {\n          pre: function($scope, $elm, $attrs, controllers) {\n            var uiGridCtrl = controllers[0];\n            var containerCtrl = controllers[1];\n\n            $scope.grid = uiGridCtrl.grid;\n            $scope.colContainer = containerCtrl.colContainer;\n\n            // Function for attaching the template to this scope\n            var clonedElement, cloneScope;\n            function compileTemplate() {\n              $scope.row.getRowTemplateFn.then(function (compiledElementFn) {\n                // var compiledElementFn = $scope.row.compiledElementFn;\n\n                // Create a new scope for the contents of this row, so we can destroy it later if need be\n                var newScope = $scope.$new();\n\n                compiledElementFn(newScope, function (newElm, scope) {\n                  // If we already have a cloned element, we need to remove it and destroy its scope\n                  if (clonedElement) {\n                    clonedElement.remove();\n                    cloneScope.$destroy();\n                  }\n\n                  // Empty the row and append the new element\n                  $elm.empty().append(newElm);\n\n                  // Save the new cloned element and scope\n                  clonedElement = newElm;\n                  cloneScope = newScope;\n                });\n              }).catch(angular.noop);\n            }\n\n            // Initially attach the compiled template to this scope\n            compileTemplate();\n\n            // If the row's compiled element function changes, we need to replace this element's contents with the new compiled template\n            $scope.$watch('row.getRowTemplateFn', function (newFunc, oldFunc) {\n              if (newFunc !== oldFunc) {\n                compileTemplate();\n              }\n            });\n          },\n          post: function($scope, $elm) {\n            $scope.row.element = $elm;\n          }\n        };\n      }\n    };\n  });\n})();\n\n(function() {\n// 'use strict';\n\n  /**\n   * @ngdoc directive\n   * @name ui.grid.directive:uiGridStyle\n   * @element style\n   * @restrict A\n   *\n   * @description\n   * Allows us to interpolate expressions in `<style>` elements. Angular doesn't do this by default as it can/will/might? break in IE8.\n   *\n   * @example\n   <doc:example module=\"app\">\n   <doc:source>\n   <script>\n   var app = angular.module('app', ['ui.grid']);\n\n   app.controller('MainCtrl', ['$scope', function ($scope) {\n          $scope.myStyle = '.blah { border: 1px solid }';\n        }]);\n   </script>\n\n   <div ng-controller=\"MainCtrl\">\n   <style ui-grid-style>{{ myStyle }}</style>\n   <span class=\"blah\">I am in a box.</span>\n   </div>\n   </doc:source>\n   <doc:scenario>\n      xit('should apply the right class to the element', function () {\n        element(by.css('.blah')).getCssValue('border-top-width')\n          .then(function(c) {\n            expect(c).toContain('1px');\n          });\n      });\n   </doc:scenario>\n   </doc:example>\n   */\n\n\n  angular.module('ui.grid').directive('uiGridStyle', ['gridUtil', '$interpolate', function(gridUtil, $interpolate) {\n    return {\n      link: function($scope, $elm) {\n        var interpolateFn = $interpolate($elm.text(), true);\n\n        if (interpolateFn) {\n          $scope.$watch(interpolateFn, function(value) {\n            for (var i = 0; i < $elm.length; i++) {\n              $elm[i].textContent = value;\n            }\n          });\n        }\n      }\n    };\n  }]);\n})();\n\n(function() {\n  'use strict';\n\n  angular.module('ui.grid').directive('uiGridViewport', ['gridUtil', 'ScrollEvent',\n    function(gridUtil, ScrollEvent) {\n      return {\n        replace: true,\n        scope: {},\n        controllerAs: 'Viewport',\n        templateUrl: 'ui-grid/uiGridViewport',\n        require: ['^uiGrid', '^uiGridRenderContainer'],\n        link: function($scope, $elm, $attrs, controllers) {\n          // gridUtil.logDebug('viewport post-link');\n\n          var uiGridCtrl = controllers[0];\n          var containerCtrl = controllers[1];\n\n          $scope.containerCtrl = containerCtrl;\n\n          var rowContainer = containerCtrl.rowContainer;\n          var colContainer = containerCtrl.colContainer;\n\n          var grid = uiGridCtrl.grid;\n\n          $scope.grid = uiGridCtrl.grid;\n\n          // Put the containers in scope so we can get rows and columns from them\n          $scope.rowContainer = containerCtrl.rowContainer;\n          $scope.colContainer = containerCtrl.colContainer;\n\n          // Register this viewport with its container\n          containerCtrl.viewport = $elm;\n\n          /**\n           * @ngdoc function\n           * @name customScroller\n           * @methodOf ui.grid.class:GridOptions\n           * @description (optional) uiGridViewport.on('scroll', scrollHandler) by default.\n           * A function that allows you to provide your own scroller function. It is particularly helpful if you want to use third party scrollers\n           * as this allows you to do that.\n           *\n           * <div class=\"alert alert-info\" role=\"alert\"> <strong>NOTE:</strong> It is important to remember to always pass in an event object to\n           * the scrollHandler as the grid scrolling behavior will break without it.</div>\n           * <h5>Example</h5>\n           * <pre>\n           *   $scope.gridOptions = {\n           *       customScroller: function myScrolling(uiGridViewport, scrollHandler) {\n           *           uiGridViewport.on('scroll', function myScrollingOverride(event) {\n           *               // Do something here\n           *\n           *               scrollHandler(event);\n           *           });\n           *       }\n           *   };\n           * </pre>\n           * @param {object} uiGridViewport Element being scrolled. (this gets passed in by the grid).\n           * @param {function} scrollHandler Function that needs to be called when scrolling happens. (this gets passed in by the grid).\n           */\n          if (grid && grid.options && grid.options.customScroller) {\n            grid.options.customScroller($elm, scrollHandler);\n          } else {\n            $elm.on('scroll', scrollHandler);\n          }\n\n          var ignoreScroll = false;\n\n          function scrollHandler() {\n            var newScrollTop = $elm[0].scrollTop;\n            var newScrollLeft = gridUtil.normalizeScrollLeft($elm, grid);\n\n            var vertScrollPercentage = rowContainer.scrollVertical(newScrollTop);\n            var horizScrollPercentage = colContainer.scrollHorizontal(newScrollLeft);\n\n            var scrollEvent = new ScrollEvent(grid, rowContainer, colContainer, ScrollEvent.Sources.ViewPortScroll);\n            scrollEvent.newScrollLeft = newScrollLeft;\n            scrollEvent.newScrollTop = newScrollTop;\n            if ( horizScrollPercentage > -1 ) {\n              scrollEvent.x = { percentage: horizScrollPercentage };\n            }\n\n            if ( vertScrollPercentage > -1 ) {\n              scrollEvent.y = { percentage: vertScrollPercentage };\n            }\n\n            grid.scrollContainers($scope.$parent.containerId, scrollEvent);\n          }\n\n          if ($scope.$parent.bindScrollVertical) {\n            grid.addVerticalScrollSync($scope.$parent.containerId, syncVerticalScroll);\n          }\n\n          if ($scope.$parent.bindScrollHorizontal) {\n            grid.addHorizontalScrollSync($scope.$parent.containerId, syncHorizontalScroll);\n            grid.addHorizontalScrollSync($scope.$parent.containerId + 'header', syncHorizontalHeader);\n            grid.addHorizontalScrollSync($scope.$parent.containerId + 'footer', syncHorizontalFooter);\n          }\n\n          function syncVerticalScroll(scrollEvent) {\n            containerCtrl.prevScrollArgs = scrollEvent;\n            $elm[0].scrollTop = scrollEvent.getNewScrollTop(rowContainer,containerCtrl.viewport);\n          }\n\n          function syncHorizontalScroll(scrollEvent) {\n            containerCtrl.prevScrollArgs = scrollEvent;\n            var newScrollLeft = scrollEvent.getNewScrollLeft(colContainer, containerCtrl.viewport);\n\n            $elm[0].scrollLeft =  gridUtil.denormalizeScrollLeft(containerCtrl.viewport,newScrollLeft, grid);\n          }\n\n          function syncHorizontalHeader(scrollEvent) {\n            var newScrollLeft = scrollEvent.getNewScrollLeft(colContainer, containerCtrl.viewport);\n\n            if (containerCtrl.headerViewport) {\n              containerCtrl.headerViewport.scrollLeft = gridUtil.denormalizeScrollLeft(containerCtrl.viewport,newScrollLeft, grid);\n            }\n          }\n\n          function syncHorizontalFooter(scrollEvent) {\n            var newScrollLeft = scrollEvent.getNewScrollLeft(colContainer, containerCtrl.viewport);\n\n            if (containerCtrl.footerViewport) {\n              containerCtrl.footerViewport.scrollLeft =  gridUtil.denormalizeScrollLeft(containerCtrl.viewport,newScrollLeft, grid);\n            }\n          }\n\n          $scope.$on('$destroy', function unbindEvents() {\n            $elm.off();\n          });\n        },\n        controller: ['$scope', function ($scope) {\n          this.rowStyle = function () {\n            var rowContainer = $scope.rowContainer;\n            var colContainer = $scope.colContainer;\n\n            var styles = {};\n\n            if (rowContainer.currentTopRow !== 0) {\n              // top offset based on hidden rows count\n              var translateY = \"translateY(\"+ (rowContainer.currentTopRow * rowContainer.grid.options.rowHeight)  +\"px)\";\n\n              styles['transform'] = translateY;\n              styles['-webkit-transform'] = translateY;\n              styles['-ms-transform'] = translateY;\n            }\n\n            if (colContainer.currentFirstColumn !== 0) {\n              if (colContainer.grid.isRTL()) {\n                styles['margin-right'] = colContainer.columnOffset + 'px';\n              }\n              else {\n                styles['margin-left'] = colContainer.columnOffset + 'px';\n              }\n            }\n\n            return styles;\n          };\n        }]\n      };\n    }\n  ]);\n\n})();\n\n(function() {\n\tangular.module('ui.grid')\n\t\t.directive('uiGridVisible', function uiGridVisibleAction() {\n\t\t\treturn function($scope, $elm, $attr) {\n\t\t\t\t$scope.$watch($attr.uiGridVisible, function(visible) {\n\t\t\t\t\t$elm[visible ? 'removeClass' : 'addClass']('ui-grid-invisible');\n\t\t\t\t});\n\t\t\t};\n\t\t});\n})();\n\n(function () {\n  'use strict';\n\n  angular.module('ui.grid').controller('uiGridController', ['$scope', '$element', '$attrs', 'gridUtil', '$q', 'uiGridConstants',\n                    'gridClassFactory', '$parse', '$compile',\n    function ($scope, $elm, $attrs, gridUtil, $q, uiGridConstants,\n              gridClassFactory, $parse, $compile) {\n      // gridUtil.logDebug('ui-grid controller');\n      var self = this;\n      var deregFunctions = [];\n\n      self.grid = gridClassFactory.createGrid($scope.uiGrid);\n\n      // assign $scope.$parent if appScope not already assigned\n      self.grid.appScope = self.grid.appScope || $scope.$parent;\n\n      $elm.addClass('grid' + self.grid.id);\n      self.grid.rtl = gridUtil.getStyles($elm[0])['direction'] === 'rtl';\n\n\n      // angular.extend(self.grid.options, );\n\n      // all properties of grid are available on scope\n      $scope.grid = self.grid;\n\n      if ($attrs.uiGridColumns) {\n        deregFunctions.push( $attrs.$observe('uiGridColumns', function(value) {\n          self.grid.options.columnDefs = angular.isString(value) ? angular.fromJson(value) : value;\n          self.grid.buildColumns()\n            .then(function() {\n              self.grid.preCompileCellTemplates();\n\n              self.grid.refreshCanvas(true);\n            }).catch(angular.noop);\n        }) );\n      }\n\n      // prevents an error from being thrown when the array is not defined yet and fastWatch is on\n      function getSize(array) {\n        return array ? array.length : 0;\n      }\n\n      // if fastWatch is set we watch only the length and the reference, not every individual object\n      if (self.grid.options.fastWatch) {\n        self.uiGrid = $scope.uiGrid;\n        if (angular.isString($scope.uiGrid.data)) {\n          deregFunctions.push( $scope.$parent.$watch($scope.uiGrid.data, dataWatchFunction) );\n          deregFunctions.push( $scope.$parent.$watch(function() {\n            if ( self.grid.appScope[$scope.uiGrid.data] ) {\n              return self.grid.appScope[$scope.uiGrid.data].length;\n            } else {\n              return undefined;\n            }\n          }, dataWatchFunction) );\n        } else {\n          deregFunctions.push( $scope.$parent.$watch(function() { return $scope.uiGrid.data; }, dataWatchFunction) );\n          deregFunctions.push( $scope.$parent.$watch(function() { return getSize($scope.uiGrid.data); }, function() { dataWatchFunction($scope.uiGrid.data); }) );\n        }\n        deregFunctions.push( $scope.$parent.$watch(function() { return $scope.uiGrid.columnDefs; }, columnDefsWatchFunction) );\n        deregFunctions.push( $scope.$parent.$watch(function() { return getSize($scope.uiGrid.columnDefs); }, function() { columnDefsWatchFunction($scope.uiGrid.columnDefs); }) );\n      } else {\n        if (angular.isString($scope.uiGrid.data)) {\n          deregFunctions.push( $scope.$parent.$watchCollection($scope.uiGrid.data, dataWatchFunction) );\n        } else {\n          deregFunctions.push( $scope.$parent.$watchCollection(function() { return $scope.uiGrid.data; }, dataWatchFunction) );\n        }\n        deregFunctions.push( $scope.$parent.$watchCollection(function() { return $scope.uiGrid.columnDefs; }, columnDefsWatchFunction) );\n      }\n\n\n      function columnDefsWatchFunction(n, o) {\n        if (n && n !== o) {\n          self.grid.options.columnDefs = $scope.uiGrid.columnDefs;\n          self.grid.callDataChangeCallbacks(uiGridConstants.dataChange.COLUMN, {\n            orderByColumnDefs: true,\n            preCompileCellTemplates: true\n          });\n        }\n      }\n\n      var mostRecentData;\n\n      function dataWatchFunction(newData) {\n        // gridUtil.logDebug('dataWatch fired');\n        var promises = [];\n\n        if ( self.grid.options.fastWatch ) {\n          if (angular.isString($scope.uiGrid.data)) {\n            newData = self.grid.appScope.$eval($scope.uiGrid.data);\n          } else {\n            newData = $scope.uiGrid.data;\n          }\n        }\n\n        mostRecentData = newData;\n\n        if (newData) {\n          // columns length is greater than the number of row header columns, which don't count because they're created automatically\n          var hasColumns = self.grid.columns.length > (self.grid.rowHeaderColumns ? self.grid.rowHeaderColumns.length : 0);\n\n          if (\n            // If we have no columns\n            !hasColumns &&\n            // ... and we don't have a ui-grid-columns attribute, which would define columns for us\n            !$attrs.uiGridColumns &&\n            // ... and we have no pre-defined columns\n            self.grid.options.columnDefs.length === 0 &&\n            // ... but we DO have data\n            newData.length > 0\n          ) {\n            // ... then build the column definitions from the data that we have\n            self.grid.buildColumnDefsFromData(newData);\n          }\n\n          // If we haven't built columns before and either have some columns defined or some data defined\n          if (!hasColumns && (self.grid.options.columnDefs.length > 0 || newData.length > 0)) {\n            // Build the column set, then pre-compile the column cell templates\n            promises.push(self.grid.buildColumns()\n              .then(function() {\n                self.grid.preCompileCellTemplates();\n              }).catch(angular.noop));\n          }\n\n          $q.all(promises).then(function() {\n            // use most recent data, rather than the potentially outdated data passed into watcher handler\n            self.grid.modifyRows(mostRecentData)\n              .then(function () {\n                // if (self.viewport) {\n                  self.grid.redrawInPlace(true);\n                // }\n\n                $scope.$evalAsync(function() {\n                  self.grid.refreshCanvas(true);\n                  self.grid.callDataChangeCallbacks(uiGridConstants.dataChange.ROW);\n                });\n              }).catch(angular.noop);\n          }).catch(angular.noop);\n        }\n      }\n\n      var styleWatchDereg = $scope.$watch(function () { return self.grid.styleComputations; }, function() {\n        self.grid.refreshCanvas(true);\n      });\n\n      $scope.$on('$destroy', function() {\n        deregFunctions.forEach( function( deregFn ) { deregFn(); });\n        styleWatchDereg();\n      });\n\n      self.fireEvent = function(eventName, args) {\n        args = args || {};\n\n        // Add the grid to the event arguments if it's not there\n        if (angular.isUndefined(args.grid)) {\n          args.grid = self.grid;\n        }\n\n        $scope.$broadcast(eventName, args);\n      };\n\n      self.innerCompile = function innerCompile(elm) {\n        $compile(elm)($scope);\n      };\n    }]);\n\n/**\n *  @ngdoc directive\n *  @name ui.grid.directive:uiGrid\n *  @element div\n *  @restrict EA\n *  @param {Object} uiGrid Options for the grid to use\n *\n *  @description Create a very basic grid.\n *\n *  @example\n    <example module=\"app\">\n      <file name=\"app.js\">\n        var app = angular.module('app', ['ui.grid']);\n\n        app.controller('MainCtrl', ['$scope', function ($scope) {\n          $scope.data = [\n            { name: 'Bob', title: 'CEO' },\n            { name: 'Frank', title: 'Lowly Developer' }\n          ];\n        }]);\n      </file>\n      <file name=\"index.ced81ed4.html\">\n        <div ng-controller=\"MainCtrl\">\n          <div ui-grid=\"{ data: data }\"></div>\n        </div>\n      </file>\n    </example>\n */\nangular.module('ui.grid').directive('uiGrid', uiGridDirective);\n\nuiGridDirective.$inject = ['$window', 'gridUtil', 'uiGridConstants'];\nfunction uiGridDirective($window, gridUtil, uiGridConstants) {\n  return {\n    templateUrl: 'ui-grid/ui-grid',\n    scope: {\n      uiGrid: '='\n    },\n    replace: true,\n    transclude: true,\n    controller: 'uiGridController',\n    compile: function () {\n      return {\n        post: function ($scope, $elm, $attrs, uiGridCtrl) {\n          var grid = uiGridCtrl.grid;\n          // Initialize scrollbars (TODO: move to controller??)\n          uiGridCtrl.scrollbars = [];\n          grid.element = $elm;\n\n\n          // See if the grid has a rendered width, if not, wait a bit and try again\n          var sizeCheckInterval = 100; // ms\n          var maxSizeChecks = 20; // 2 seconds total\n          var sizeChecks = 0;\n\n          // Setup (event listeners) the grid\n          setup();\n\n          // And initialize it\n          init();\n\n          // Mark rendering complete so API events can happen\n          grid.renderingComplete();\n\n          // If the grid doesn't have size currently, wait for a bit to see if it gets size\n          checkSize();\n\n          /*-- Methods --*/\n\n          function checkSize() {\n            // If the grid has no width and we haven't checked more than <maxSizeChecks> times, check again in <sizeCheckInterval> milliseconds\n            if ($elm[0].offsetWidth <= 0 && sizeChecks < maxSizeChecks) {\n              setTimeout(checkSize, sizeCheckInterval);\n              sizeChecks++;\n            } else {\n              $scope.$applyAsync(init);\n            }\n          }\n\n          // Setup event listeners and watchers\n          function setup() {\n            var deregisterLeftWatcher, deregisterRightWatcher;\n\n            // Bind to window resize events\n            angular.element($window).on('resize', gridResize);\n\n            // Unbind from window resize events when the grid is destroyed\n            $elm.on('$destroy', function () {\n              angular.element($window).off('resize', gridResize);\n              deregisterLeftWatcher();\n              deregisterRightWatcher();\n            });\n\n            // If we add a left container after render, we need to watch and react\n            deregisterLeftWatcher = $scope.$watch(function () { return grid.hasLeftContainer();}, function (newValue, oldValue) {\n              if (newValue === oldValue) {\n                return;\n              }\n              grid.refreshCanvas(true);\n            });\n\n            // If we add a right container after render, we need to watch and react\n            deregisterRightWatcher = $scope.$watch(function () { return grid.hasRightContainer();}, function (newValue, oldValue) {\n              if (newValue === oldValue) {\n                return;\n              }\n              grid.refreshCanvas(true);\n            });\n          }\n\n          // Initialize the directive\n          function init() {\n            grid.gridWidth = $scope.gridWidth = gridUtil.elementWidth($elm);\n\n            // Default canvasWidth to the grid width, in case we don't get any column definitions to calculate it from\n            grid.canvasWidth = uiGridCtrl.grid.gridWidth;\n\n            grid.gridHeight = $scope.gridHeight = gridUtil.elementHeight($elm);\n\n            // If the grid isn't tall enough to fit a single row, it's kind of useless. Resize it to fit a minimum number of rows\n            if (grid.gridHeight - grid.scrollbarHeight <= grid.options.rowHeight && grid.options.enableMinHeightCheck) {\n              autoAdjustHeight();\n            }\n\n            // Run initial canvas refresh\n            grid.refreshCanvas(true);\n          }\n\n          // Set the grid's height ourselves in the case that its height would be unusably small\n          function autoAdjustHeight() {\n            // Figure out the new height\n            var contentHeight = grid.options.minRowsToShow * grid.options.rowHeight;\n            var headerHeight = grid.options.showHeader ? grid.options.headerRowHeight : 0;\n            var footerHeight = grid.calcFooterHeight();\n\n            var scrollbarHeight = 0;\n            if (grid.options.enableHorizontalScrollbar === uiGridConstants.scrollbars.ALWAYS) {\n              scrollbarHeight = gridUtil.getScrollbarWidth();\n            }\n\n            var maxNumberOfFilters = 0;\n            // Calculates the maximum number of filters in the columns\n            angular.forEach(grid.options.columnDefs, function(col) {\n              if (col.hasOwnProperty('filter')) {\n                if (maxNumberOfFilters < 1) {\n                    maxNumberOfFilters = 1;\n                }\n              }\n              else if (col.hasOwnProperty('filters')) {\n                if (maxNumberOfFilters < col.filters.length) {\n                    maxNumberOfFilters = col.filters.length;\n                }\n              }\n            });\n\n            if (grid.options.enableFiltering  && !maxNumberOfFilters) {\n              var allColumnsHaveFilteringTurnedOff = grid.options.columnDefs.length && grid.options.columnDefs.every(function(col) {\n                return col.enableFiltering === false;\n              });\n\n              if (!allColumnsHaveFilteringTurnedOff) {\n                maxNumberOfFilters = 1;\n              }\n            }\n\n            var filterHeight = maxNumberOfFilters * headerHeight;\n\n            var newHeight = headerHeight + contentHeight + footerHeight + scrollbarHeight + filterHeight;\n\n            $elm.css('height', newHeight + 'px');\n\n            grid.gridHeight = $scope.gridHeight = gridUtil.elementHeight($elm);\n          }\n\n          // Resize the grid on window resize events\n          function gridResize() {\n            if (!gridUtil.isVisible($elm)) {\n              return;\n            }\n            grid.gridWidth = $scope.gridWidth = gridUtil.elementWidth($elm);\n            grid.gridHeight = $scope.gridHeight = gridUtil.elementHeight($elm);\n\n            grid.refreshCanvas(true);\n          }\n        }\n      };\n    }\n  };\n}\n})();\n\n(function() {\n  'use strict';\n\n  angular.module('ui.grid').directive('uiGridPinnedContainer', ['gridUtil', function (gridUtil) {\n    return {\n      restrict: 'EA',\n      replace: true,\n      template: '<div class=\"ui-grid-pinned-container\">'\n              + '<div ui-grid-render-container container-id=\"side\"'\n              + ' row-container-name=\"\\'body\\'\" col-container-name=\"side\"'\n              + ' bind-scroll-vertical=\"true\"'\n              + ' class=\"{{ side }} ui-grid-render-container-{{ side }}\"></div>'\n              + '</div>',\n      scope: {\n        side: '=uiGridPinnedContainer'\n      },\n      require: '^uiGrid',\n      compile: function compile() {\n        return {\n          post: function ($scope, $elm, $attrs, uiGridCtrl) {\n            // gridUtil.logDebug('ui-grid-pinned-container ' + $scope.side + ' link');\n\n            var grid = uiGridCtrl.grid;\n\n            var myWidth = 0;\n\n            $elm.addClass('ui-grid-pinned-container-' + $scope.side);\n\n            // Monkey-patch the viewport width function\n            if ($scope.side === 'left' || $scope.side === 'right') {\n              grid.renderContainers[$scope.side].getViewportWidth = monkeyPatchedGetViewportWidth;\n            }\n\n            function monkeyPatchedGetViewportWidth() {\n              /*jshint validthis: true */\n              var self = this;\n\n              var viewportWidth = 0;\n              self.visibleColumnCache.forEach(function (column) {\n                viewportWidth += column.drawnWidth;\n              });\n\n              var adjustment = self.getViewportAdjustment();\n\n              viewportWidth = viewportWidth + adjustment.width;\n\n              return viewportWidth;\n            }\n\n            function updateContainerWidth() {\n              if ($scope.side === 'left' || $scope.side === 'right') {\n                var cols = grid.renderContainers[$scope.side].visibleColumnCache;\n                var width = 0;\n                for (var i = 0; i < cols.length; i++) {\n                  var col = cols[i];\n                  width += col.drawnWidth || col.width || 0;\n                }\n\n                return width;\n              }\n            }\n\n            function updateContainerDimensions() {\n              var ret = '';\n\n              // Column containers\n              if ($scope.side === 'left' || $scope.side === 'right') {\n                myWidth = updateContainerWidth();\n\n                // gridUtil.logDebug('myWidth', myWidth);\n\n                // TODO(c0bra): Subtract sum of col widths from grid viewport width and update it\n                $elm.attr('style', null);\n\n             //   var myHeight = grid.renderContainers.body.getViewportHeight(); // + grid.horizontalScrollbarHeight;\n\n                ret += '.grid' + grid.id + ' .ui-grid-pinned-container-' + $scope.side + ', .grid' + grid.id + ' .ui-grid-pinned-container-' + $scope.side + ' .ui-grid-render-container-' + $scope.side + ' .ui-grid-viewport { width: ' + myWidth + 'px; } ';\n              }\n\n              return ret;\n            }\n\n            grid.renderContainers.body.registerViewportAdjuster(function (adjustment) {\n              myWidth = updateContainerWidth();\n\n              // Subtract our own width\n              adjustment.width -= myWidth;\n              adjustment.side = $scope.side;\n\n              return adjustment;\n            });\n\n            // Register style computation to adjust for columns in `side`'s render container\n            grid.registerStyleComputation({\n              priority: 15,\n              func: updateContainerDimensions\n            });\n          }\n        };\n      }\n    };\n  }]);\n})();\n\n(function () {\n  angular.module('ui.grid').config(['$provide', function($provide) {\n    $provide.decorator('i18nService', ['$delegate', function($delegate) {\n      $delegate.add('en', {\n        headerCell: {\n          aria: {\n            defaultFilterLabel: 'Filter for column',\n            removeFilter: 'Remove Filter',\n            columnMenuButtonLabel: 'Column Menu',\n            column: 'Column'\n          },\n          priority: 'Priority:',\n          filterLabel: \"Filter for column: \"\n        },\n        aggregate: {\n          label: 'items'\n        },\n        groupPanel: {\n          description: 'Drag a column header here and drop it to group by that column.'\n        },\n        search: {\n          aria: {\n            selected: 'Row selected',\n            notSelected: 'Row not selected'\n          },\n          placeholder: 'Search...',\n          showingItems: 'Showing Items:',\n          selectedItems: 'Selected Items:',\n          totalItems: 'Total Items:',\n          size: 'Page Size:',\n          first: 'First Page',\n          next: 'Next Page',\n          previous: 'Previous Page',\n          last: 'Last Page'\n        },\n        selection: {\n          aria: {\n            row: 'Row'\n          },\n          selectAll: 'Select All',\n          displayName: 'Row Selection Checkbox'\n        },\n        menu: {\n          text: 'Choose Columns:'\n        },\n        sort: {\n          ascending: 'Sort Ascending',\n          descending: 'Sort Descending',\n          none: 'Sort None',\n          remove: 'Remove Sort'\n        },\n        column: {\n          hide: 'Hide Column'\n        },\n        aggregation: {\n          count: 'total rows: ',\n          sum: 'total: ',\n          avg: 'avg: ',\n          min: 'min: ',\n          max: 'max: '\n        },\n        pinning: {\n          pinLeft: 'Pin Left',\n          pinRight: 'Pin Right',\n          unpin: 'Unpin'\n        },\n        columnMenu: {\n          close: 'Close'\n        },\n        gridMenu: {\n          aria: {\n            buttonLabel: 'Grid Menu'\n          },\n          columns: 'Columns:',\n          importerTitle: 'Import file',\n          exporterAllAsCsv: 'Export all data as csv',\n          exporterVisibleAsCsv: 'Export visible data as csv',\n          exporterSelectedAsCsv: 'Export selected data as csv',\n          exporterAllAsPdf: 'Export all data as pdf',\n          exporterVisibleAsPdf: 'Export visible data as pdf',\n          exporterSelectedAsPdf: 'Export selected data as pdf',\n          exporterAllAsExcel: 'Export all data as excel',\n          exporterVisibleAsExcel: 'Export visible data as excel',\n          exporterSelectedAsExcel: 'Export selected data as excel',\n          clearAllFilters: 'Clear all filters'\n        },\n        importer: {\n          noHeaders: 'Column names were unable to be derived, does the file have a header?',\n          noObjects: 'Objects were not able to be derived, was there data in the file other than headers?',\n          invalidCsv: 'File was unable to be processed, is it valid CSV?',\n          invalidJson: 'File was unable to be processed, is it valid Json?',\n          jsonNotArray: 'Imported json file must contain an array, aborting.'\n        },\n        pagination: {\n          aria: {\n            pageToFirst: 'Page to first',\n            pageBack: 'Page back',\n            pageSelected: 'Selected page',\n            pageForward: 'Page forward',\n            pageToLast: 'Page to last'\n          },\n          sizes: 'items per page',\n          totalItems: 'items',\n          through: 'through',\n          of: 'of'\n        },\n        grouping: {\n          group: 'Group',\n          ungroup: 'Ungroup',\n          aggregate_count: 'Agg: Count',\n          aggregate_sum: 'Agg: Sum',\n          aggregate_max: 'Agg: Max',\n          aggregate_min: 'Agg: Min',\n          aggregate_avg: 'Agg: Avg',\n          aggregate_remove: 'Agg: Remove'\n        },\n        validate: {\n          error: 'Error:',\n          minLength: 'Value should be at least THRESHOLD characters long.',\n          maxLength: 'Value should be at most THRESHOLD characters long.',\n          required: 'A value is needed.'\n        }\n      });\n      return $delegate;\n    }]);\n  }]);\n})();\n\n(function() {\n\nangular.module('ui.grid')\n.factory('Grid', ['$q', '$compile', '$parse', 'gridUtil', 'uiGridConstants', 'GridOptions', 'GridColumn', 'GridRow', 'GridApi', 'rowSorter', 'rowSearcher', 'GridRenderContainer', '$timeout','ScrollEvent',\n    function($q, $compile, $parse, gridUtil, uiGridConstants, GridOptions, GridColumn, GridRow, GridApi, rowSorter, rowSearcher, GridRenderContainer, $timeout, ScrollEvent) {\n\n  /**\n   * @ngdoc object\n   * @name ui.grid.api:PublicApi\n   * @description Public Api for the core grid features\n   *\n   */\n\n  /**\n   * @ngdoc function\n   * @name ui.grid.class:Grid\n   * @description Grid is the main viewModel.  Any properties or methods needed to maintain state are defined in\n   * this prototype.  One instance of Grid is created per Grid directive instance.\n   * @param {object} options Object map of options to pass into the grid. An 'id' property is expected.\n   */\n  var Grid = function Grid(options) {\n    var self = this;\n    // Get the id out of the options, then remove it\n    if (options !== undefined && typeof(options.id) !== 'undefined' && options.id) {\n      if (!/^[_a-zA-Z0-9-]+$/.test(options.id)) {\n        throw new Error(\"Grid id '\" + options.id + '\" is invalid. It must follow CSS selector syntax rules.');\n      }\n    }\n    else {\n      throw new Error('No ID provided. An ID must be given when creating a grid.');\n    }\n\n    self.id = options.id;\n    delete options.id;\n\n    // Get default options\n    self.options = GridOptions.initialize( options );\n\n    /**\n     * @ngdoc object\n     * @name appScope\n     * @propertyOf ui.grid.class:Grid\n     * @description reference to the application scope (the parent scope of the ui-grid element).  Assigned in ui-grid controller\n     * <br/>\n     * use gridOptions.appScopeProvider to override the default assignment of $scope.$parent with any reference\n     */\n    self.appScope = self.options.appScopeProvider;\n\n    self.headerHeight = self.options.headerRowHeight;\n\n\n    /**\n     * @ngdoc object\n     * @name footerHeight\n     * @propertyOf ui.grid.class:Grid\n     * @description returns the total footer height gridFooter + columnFooter\n     */\n    self.footerHeight = self.calcFooterHeight();\n\n\n    /**\n     * @ngdoc object\n     * @name columnFooterHeight\n     * @propertyOf ui.grid.class:Grid\n     * @description returns the total column footer height\n     */\n    self.columnFooterHeight = self.calcColumnFooterHeight();\n\n    self.rtl = false;\n    self.gridHeight = 0;\n    self.gridWidth = 0;\n    self.columnBuilders = [];\n    self.rowBuilders = [];\n    self.rowsProcessors = [];\n    self.columnsProcessors = [];\n    self.styleComputations = [];\n    self.viewportAdjusters = [];\n    self.rowHeaderColumns = [];\n    self.dataChangeCallbacks = {};\n    self.verticalScrollSyncCallBackFns = {};\n    self.horizontalScrollSyncCallBackFns = {};\n\n    // self.visibleRowCache = [];\n\n    // Set of 'render' containers for self grid, which can render sets of rows\n    self.renderContainers = {};\n\n    // Create a\n    self.renderContainers.body = new GridRenderContainer('body', self);\n\n    self.cellValueGetterCache = {};\n\n    // Cached function to use with custom row templates\n    self.getRowTemplateFn = null;\n\n\n    // representation of the rows on the grid.\n    // these are wrapped references to the actual data rows (options.data)\n    self.rows = [];\n\n    // represents the columns on the grid\n    self.columns = [];\n\n    /**\n     * @ngdoc boolean\n     * @name isScrollingVertically\n     * @propertyOf ui.grid.class:Grid\n     * @description set to true when Grid is scrolling vertically. Set to false via debounced method\n     */\n    self.isScrollingVertically = false;\n\n    /**\n     * @ngdoc boolean\n     * @name isScrollingHorizontally\n     * @propertyOf ui.grid.class:Grid\n     * @description set to true when Grid is scrolling horizontally. Set to false via debounced method\n     */\n    self.isScrollingHorizontally = false;\n\n    /**\n     * @ngdoc property\n     * @name scrollDirection\n     * @propertyOf ui.grid.class:Grid\n     * @description set one of the {@link ui.grid.service:uiGridConstants#properties_scrollDirection uiGridConstants.scrollDirection}\n     *  values (UP, DOWN, LEFT, RIGHT, NONE), which tells us which direction we are scrolling.\n     * Set to NONE via debounced method\n     */\n    self.scrollDirection = uiGridConstants.scrollDirection.NONE;\n\n    // if true, grid will not respond to any scroll events\n    self.disableScrolling = false;\n\n\n    function vertical (scrollEvent) {\n      self.isScrollingVertically = false;\n      self.api.core.raise.scrollEnd(scrollEvent);\n      self.scrollDirection = uiGridConstants.scrollDirection.NONE;\n    }\n\n    var debouncedVertical = gridUtil.debounce(vertical, self.options.scrollDebounce);\n    var debouncedVerticalMinDelay = gridUtil.debounce(vertical, 0);\n\n    function horizontal (scrollEvent) {\n      self.isScrollingHorizontally = false;\n      self.api.core.raise.scrollEnd(scrollEvent);\n      self.scrollDirection = uiGridConstants.scrollDirection.NONE;\n    }\n\n    var debouncedHorizontal = gridUtil.debounce(horizontal, self.options.scrollDebounce);\n    var debouncedHorizontalMinDelay = gridUtil.debounce(horizontal, 0);\n\n\n    /**\n     * @ngdoc function\n     * @name flagScrollingVertically\n     * @methodOf ui.grid.class:Grid\n     * @description sets isScrollingVertically to true and sets it to false in a debounced function\n     */\n    self.flagScrollingVertically = function(scrollEvent) {\n      if (!self.isScrollingVertically && !self.isScrollingHorizontally) {\n        self.api.core.raise.scrollBegin(scrollEvent);\n      }\n      self.isScrollingVertically = true;\n      if (self.options.scrollDebounce === 0 || !scrollEvent.withDelay) {\n        debouncedVerticalMinDelay(scrollEvent);\n      }\n      else {\n        debouncedVertical(scrollEvent);\n      }\n    };\n\n    /**\n     * @ngdoc function\n     * @name flagScrollingHorizontally\n     * @methodOf ui.grid.class:Grid\n     * @description sets isScrollingHorizontally to true and sets it to false in a debounced function\n     */\n    self.flagScrollingHorizontally = function(scrollEvent) {\n      if (!self.isScrollingVertically && !self.isScrollingHorizontally) {\n        self.api.core.raise.scrollBegin(scrollEvent);\n      }\n      self.isScrollingHorizontally = true;\n      if (self.options.scrollDebounce === 0 || !scrollEvent.withDelay) {\n        debouncedHorizontalMinDelay(scrollEvent);\n      }\n      else {\n        debouncedHorizontal(scrollEvent);\n      }\n    };\n\n    self.scrollbarHeight = 0;\n    self.scrollbarWidth = 0;\n    if (self.options.enableHorizontalScrollbar !== uiGridConstants.scrollbars.NEVER) {\n      self.scrollbarHeight = gridUtil.getScrollbarWidth();\n    }\n\n    if (self.options.enableVerticalScrollbar !== uiGridConstants.scrollbars.NEVER) {\n      self.scrollbarWidth = gridUtil.getScrollbarWidth();\n    }\n\n    self.api = new GridApi(self);\n\n    /**\n     * @ngdoc function\n     * @name refresh\n     * @methodOf ui.grid.api:PublicApi\n     * @description Refresh the rendered grid on screen.\n     * The refresh method re-runs both the columnProcessors and the\n     * rowProcessors, as well as calling refreshCanvas to update all\n     * the grid sizing.  In general you should prefer to use queueGridRefresh\n     * instead, which is basically a debounced version of refresh.\n     *\n     * If you only want to resize the grid, not regenerate all the rows\n     * and columns, you should consider directly calling refreshCanvas instead.\n     *\n     * @param {boolean} [rowsAltered] Optional flag for refreshing when the number of rows has changed\n     */\n    self.api.registerMethod( 'core', 'refresh', this.refresh );\n\n    /**\n     * @ngdoc function\n     * @name queueGridRefresh\n     * @methodOf ui.grid.api:PublicApi\n     * @description Request a refresh of the rendered grid on screen, if multiple\n     * calls to queueGridRefresh are made within a digest cycle only one will execute.\n     * The refresh method re-runs both the columnProcessors and the\n     * rowProcessors, as well as calling refreshCanvas to update all\n     * the grid sizing.  In general you should prefer to use queueGridRefresh\n     * instead, which is basically a debounced version of refresh.\n     *\n     */\n    self.api.registerMethod( 'core', 'queueGridRefresh', this.queueGridRefresh );\n\n    /**\n     * @ngdoc function\n     * @name refreshRows\n     * @methodOf ui.grid.api:PublicApi\n     * @description Runs only the rowProcessors, columns remain as they were.\n     * It then calls redrawInPlace and refreshCanvas, which adjust the grid sizing.\n     * @returns {promise} promise that is resolved when render completes?\n     *\n     */\n    self.api.registerMethod( 'core', 'refreshRows', this.refreshRows );\n\n    /**\n     * @ngdoc function\n     * @name queueRefresh\n     * @methodOf ui.grid.api:PublicApi\n     * @description Requests execution of refreshCanvas, if multiple requests are made\n     * during a digest cycle only one will run.  RefreshCanvas updates the grid sizing.\n     * @returns {promise} promise that is resolved when render completes?\n     *\n     */\n    self.api.registerMethod( 'core', 'queueRefresh', this.queueRefresh );\n\n    /**\n     * @ngdoc function\n     * @name handleWindowResize\n     * @methodOf ui.grid.api:PublicApi\n     * @description Trigger a grid resize, normally this would be picked\n     * up by a watch on window size, but in some circumstances it is necessary\n     * to call this manually\n     * @returns {promise} promise that is resolved when render completes?\n     *\n     */\n    self.api.registerMethod( 'core', 'handleWindowResize', this.handleWindowResize );\n\n\n    /**\n     * @ngdoc function\n     * @name addRowHeaderColumn\n     * @methodOf ui.grid.api:PublicApi\n     * @description adds a row header column to the grid\n     * @param {object} column def\n     * @param {number} order Determines order of header column on grid.  Lower order means header\n     * is positioned to the left of higher order headers\n     *\n     */\n    self.api.registerMethod( 'core', 'addRowHeaderColumn', this.addRowHeaderColumn );\n\n    /**\n     * @ngdoc function\n     * @name scrollToIfNecessary\n     * @methodOf ui.grid.api:PublicApi\n     * @description Scrolls the grid to make a certain row and column combo visible,\n     *   in the case that it is not completely visible on the screen already.\n     * @param {GridRow} gridRow row to make visible\n     * @param {GridColumn} gridCol column to make visible\n     * @returns {promise} a promise that is resolved when scrolling is complete\n     *\n     */\n    self.api.registerMethod( 'core', 'scrollToIfNecessary', function(gridRow, gridCol) { return self.scrollToIfNecessary(gridRow, gridCol);} );\n\n    /**\n     * @ngdoc function\n     * @name scrollTo\n     * @methodOf ui.grid.api:PublicApi\n     * @description Scroll the grid such that the specified\n     * row and column is in view\n     * @param {object} rowEntity gridOptions.data[] array instance to make visible\n     * @param {object} colDef to make visible\n     * @returns {promise} a promise that is resolved after any scrolling is finished\n     */\n    self.api.registerMethod( 'core', 'scrollTo', function (rowEntity, colDef) { return self.scrollTo(rowEntity, colDef);}  );\n\n    /**\n     * @ngdoc function\n     * @name registerRowsProcessor\n     * @methodOf ui.grid.api:PublicApi\n     * @description\n     * Register a \"rows processor\" function. When the rows are updated,\n     * the grid calls each registered \"rows processor\", which has a chance\n     * to alter the set of rows (sorting, etc) as long as the count is not\n     * modified.\n     *\n     * @param {function(renderedRowsToProcess, columns )} processorFunction rows processor function, which\n     * is run in the context of the grid (i.e. this for the function will be the grid), and must\n     * return the updated rows list, which is passed to the next processor in the chain\n     * @param {number} priority the priority of this processor.  In general we try to do them in 100s to leave room\n     * for other people to inject rows processors at intermediate priorities.  Lower priority rowsProcessors run earlier.\n     *\n     * At present allRowsVisible is running at 50, sort manipulations running at 60-65, filter is running at 100,\n     * sort is at 200, grouping and treeview at 400-410, selectable rows at 500, pagination at 900 (pagination will generally want to be last)\n     */\n    self.api.registerMethod( 'core', 'registerRowsProcessor', this.registerRowsProcessor  );\n\n    /**\n     * @ngdoc function\n     * @name registerColumnsProcessor\n     * @methodOf ui.grid.api:PublicApi\n     * @description\n     * Register a \"columns processor\" function. When the columns are updated,\n     * the grid calls each registered \"columns processor\", which has a chance\n     * to alter the set of columns as long as the count is not\n     * modified.\n     *\n     * @param {function(renderedColumnsToProcess, rows )} processorFunction columns processor function, which\n     * is run in the context of the grid (i.e. this for the function will be the grid), and must\n     * return the updated columns list, which is passed to the next processor in the chain\n     * @param {number} priority the priority of this processor.  In general we try to do them in 100s to leave room\n     * for other people to inject columns processors at intermediate priorities.  Lower priority columnsProcessors run earlier.\n     *\n     * At present allRowsVisible is running at 50, filter is running at 100, sort is at 200, grouping at 400, selectable rows at 500, pagination at 900 (pagination will generally want to be last)\n     */\n    self.api.registerMethod( 'core', 'registerColumnsProcessor', this.registerColumnsProcessor  );\n\n    /**\n     * @ngdoc function\n     * @name sortHandleNulls\n     * @methodOf ui.grid.api:PublicApi\n     * @description A null handling method that can be used when building custom sort\n     * functions\n     * @example\n     * <pre>\n     *   mySortFn = function(a, b) {\n     *   var nulls = $scope.gridApi.core.sortHandleNulls(a, b);\n     *   if ( nulls !== null ) {\n     *     return nulls;\n     *   } else {\n     *     // your code for sorting here\n     *   };\n     * </pre>\n     * @param {object} a sort value a\n     * @param {object} b sort value b\n     * @returns {number} null if there were no nulls/undefineds, otherwise returns\n     * a sort value that should be passed back from the sort function\n     *\n     */\n    self.api.registerMethod( 'core', 'sortHandleNulls', rowSorter.handleNulls );\n\n    /**\n     * @ngdoc function\n     * @name sortChanged\n     * @methodOf  ui.grid.api:PublicApi\n     * @description The sort criteria on one or more columns has\n     * changed.  Provides as parameters the grid and the output of\n     * getColumnSorting, which is an array of gridColumns\n     * that have sorting on them, sorted in priority order.\n     *\n     * @param {$scope} scope The scope of the controller. This is used to deregister this event when the scope is destroyed.\n     * @param {Function} callBack Will be called when the event is emited. The function passes back the grid and an array of\n     * columns with sorts on them, in priority order.\n     *\n     * @example\n     * <pre>\n     *      gridApi.core.on.sortChanged( $scope, function(grid, sortColumns) {\n     *        // do something\n     *      });\n     * </pre>\n     */\n    self.api.registerEvent( 'core', 'sortChanged' );\n\n      /**\n     * @ngdoc function\n     * @name columnVisibilityChanged\n     * @methodOf  ui.grid.api:PublicApi\n     * @description The visibility of a column has changed,\n     * the column itself is passed out as a parameter of the event.\n     *\n     * @param {$scope} scope The scope of the controller. This is used to deregister this event when the scope is destroyed.\n     * @param {Function} callBack Will be called when the event is emited. The function passes back the GridCol that has changed.\n     *\n     * @example\n     * <pre>\n     *      gridApi.core.on.columnVisibilityChanged( $scope, function (column) {\n     *        // do something\n     *      } );\n     * </pre>\n     */\n    self.api.registerEvent( 'core', 'columnVisibilityChanged' );\n\n    /**\n     * @ngdoc method\n     * @name notifyDataChange\n     * @methodOf ui.grid.api:PublicApi\n     * @description Notify the grid that a data or config change has occurred,\n     * where that change isn't something the grid was otherwise noticing.  This\n     * might be particularly relevant where you've changed values within the data\n     * and you'd like cell classes to be re-evaluated, or changed config within\n     * the columnDef and you'd like headerCellClasses to be re-evaluated.\n     * @param {string} type one of the\n     * {@link ui.grid.service:uiGridConstants#properties_dataChange uiGridConstants.dataChange}\n     * values (ALL, ROW, EDIT, COLUMN, OPTIONS), which tells us which refreshes to fire.\n     *\n     * - ALL: listeners fired on any of these events, fires listeners on all events.\n     * - ROW: fired when a row is added or removed.\n     * - EDIT: fired when the data in a cell is edited.\n     * - COLUMN: fired when the column definitions are modified.\n     * - OPTIONS: fired when the grid options are modified.\n     */\n    self.api.registerMethod( 'core', 'notifyDataChange', this.notifyDataChange );\n\n    /**\n     * @ngdoc method\n     * @name clearAllFilters\n     * @methodOf ui.grid.api:PublicApi\n     * @description Clears all filters and optionally refreshes the visible rows.\n     * @param {object} refreshRows Defaults to true.\n     * @param {object} clearConditions Defaults to false.\n     * @param {object} clearFlags Defaults to false.\n     * @returns {promise} If `refreshRows` is true, returns a promise of the rows refreshing.\n     */\n    self.api.registerMethod('core', 'clearAllFilters', this.clearAllFilters);\n\n    self.registerDataChangeCallback( self.columnRefreshCallback, [uiGridConstants.dataChange.COLUMN]);\n    self.registerDataChangeCallback( self.processRowsCallback, [uiGridConstants.dataChange.EDIT]);\n    self.registerDataChangeCallback( self.updateFooterHeightCallback, [uiGridConstants.dataChange.OPTIONS]);\n\n    self.registerStyleComputation({\n      priority: 10,\n      func: self.getFooterStyles\n    });\n  };\n\n   Grid.prototype.calcFooterHeight = function () {\n     if (!this.hasFooter()) {\n       return 0;\n     }\n\n     var height = 0;\n     if (this.options.showGridFooter) {\n       height += this.options.gridFooterHeight;\n     }\n\n     height += this.calcColumnFooterHeight();\n\n     return height;\n   };\n\n   Grid.prototype.calcColumnFooterHeight = function () {\n     var height = 0;\n\n     if (this.options.showColumnFooter) {\n       height += this.options.columnFooterHeight;\n     }\n\n     return height;\n   };\n\n   Grid.prototype.getFooterStyles = function () {\n     var style = '.grid' + this.id + ' .ui-grid-footer-aggregates-row { height: ' + this.options.columnFooterHeight + 'px; }';\n     style += ' .grid' + this.id + ' .ui-grid-footer-info { height: ' + this.options.gridFooterHeight + 'px; }';\n     return style;\n   };\n\n  Grid.prototype.hasFooter = function () {\n   return this.options.showGridFooter || this.options.showColumnFooter;\n  };\n\n  /**\n   * @ngdoc function\n   * @name isRTL\n   * @methodOf ui.grid.class:Grid\n   * @description Returns true if grid is RightToLeft\n   */\n  Grid.prototype.isRTL = function () {\n    return this.rtl;\n  };\n\n\n  /**\n   * @ngdoc function\n   * @name registerColumnBuilder\n   * @methodOf ui.grid.class:Grid\n   * @description When the build creates columns from column definitions, the columnbuilders will be called to add\n   * additional properties to the column.\n   * @param {function(colDef, col, gridOptions)} columnBuilder function to be called\n   */\n  Grid.prototype.registerColumnBuilder = function registerColumnBuilder(columnBuilder) {\n    this.columnBuilders.push(columnBuilder);\n  };\n\n  /**\n   * @ngdoc function\n   * @name buildColumnDefsFromData\n   * @methodOf ui.grid.class:Grid\n   * @description Populates columnDefs from the provided data\n   * @param {function(colDef, col, gridOptions)} rowBuilder function to be called\n   */\n  Grid.prototype.buildColumnDefsFromData = function (dataRows) {\n    this.options.columnDefs =  gridUtil.getColumnsFromData(dataRows, this.options.excludeProperties);\n  };\n\n  /**\n   * @ngdoc function\n   * @name registerRowBuilder\n   * @methodOf ui.grid.class:Grid\n   * @description When the build creates rows from gridOptions.data, the rowBuilders will be called to add\n   * additional properties to the row.\n   * @param {function(row, gridOptions)} rowBuilder function to be called\n   */\n  Grid.prototype.registerRowBuilder = function registerRowBuilder(rowBuilder) {\n    this.rowBuilders.push(rowBuilder);\n  };\n\n  /**\n   * @ngdoc function\n   * @name registerDataChangeCallback\n   * @methodOf ui.grid.class:Grid\n   * @description When a data change occurs, the data change callbacks of the specified type\n   * will be called.  The rules are:\n   *\n   * - when the data watch fires, that is considered a ROW change (the data watch only notices\n   *   added or removed rows)\n   * - when the api is called to inform us of a change, the declared type of that change is used\n   * - when a cell edit completes, the EDIT callbacks are triggered\n   * - when the columnDef watch fires, the COLUMN callbacks are triggered\n   * - when the options watch fires, the OPTIONS callbacks are triggered\n   *\n   * For a given event:\n   * - ALL calls ROW, EDIT, COLUMN, OPTIONS and ALL callbacks\n   * - ROW calls ROW and ALL callbacks\n   * - EDIT calls EDIT and ALL callbacks\n   * - COLUMN calls COLUMN and ALL callbacks\n   * - OPTIONS calls OPTIONS and ALL callbacks\n   *\n   * @param {function(grid)} callback function to be called\n   * @param {array} types the types of data change you want to be informed of.  Values from\n   * the {@link ui.grid.service:uiGridConstants#properties_dataChange uiGridConstants.dataChange}\n   *  values ( ALL, EDIT, ROW, COLUMN, OPTIONS ).  Optional and defaults to ALL\n   * @returns {function} deregister function - a function that can be called to deregister this callback\n   */\n  Grid.prototype.registerDataChangeCallback = function registerDataChangeCallback(callback, types, _this) {\n    var self = this,\n      uid = gridUtil.nextUid();\n\n    if ( !types ) {\n      types = [uiGridConstants.dataChange.ALL];\n    }\n    if ( !Array.isArray(types)) {\n      gridUtil.logError(\"Expected types to be an array or null in registerDataChangeCallback, value passed was: \" + types );\n    }\n    this.dataChangeCallbacks[uid] = { callback: callback, types: types, _this: _this };\n\n    return function() {\n      delete self.dataChangeCallbacks[uid];\n    };\n  };\n\n  /**\n   * @ngdoc function\n   * @name callDataChangeCallbacks\n   * @methodOf ui.grid.class:Grid\n   * @description Calls the callbacks based on the type of data change that\n   * has occurred. Always calls the ALL callbacks, calls the ROW, EDIT, COLUMN and OPTIONS callbacks if the\n   * event type is matching, or if the type is ALL.\n   * @param {string} type the type of event that occurred - one of the\n   * {@link ui.grid.service:uiGridConstants#properties_dataChange uiGridConstants.dataChange}\n   *  values (ALL, ROW, EDIT, COLUMN, OPTIONS)\n   */\n  Grid.prototype.callDataChangeCallbacks = function callDataChangeCallbacks(type, options) {\n    angular.forEach( this.dataChangeCallbacks, function( callback, uid ) {\n      if ( callback.types.indexOf( uiGridConstants.dataChange.ALL ) !== -1 ||\n           callback.types.indexOf( type ) !== -1 ||\n           type === uiGridConstants.dataChange.ALL ) {\n        if (callback._this) {\n           callback.callback.apply(callback._this, this, options);\n        }\n        else {\n          callback.callback(this, options);\n        }\n      }\n    }, this);\n  };\n\n  /**\n   * @ngdoc function\n   * @name notifyDataChange\n   * @methodOf ui.grid.class:Grid\n   * @description Notifies us that a data change has occurred, used in the public\n   * api for users to tell us when they've changed data or some other event that\n   * our watches cannot pick up\n   * @param {string} type the type of event that occurred - one of the\n   * uiGridConstants.dataChange values (ALL, ROW, EDIT, COLUMN, OPTIONS)\n   *\n   * - ALL: listeners fired on any of these events, fires listeners on all events.\n   * - ROW: fired when a row is added or removed.\n   * - EDIT: fired when the data in a cell is edited.\n   * - COLUMN: fired when the column definitions are modified.\n   * - OPTIONS: fired when the grid options are modified.\n   */\n  Grid.prototype.notifyDataChange = function notifyDataChange(type) {\n    var constants = uiGridConstants.dataChange;\n\n    if ( type === constants.ALL ||\n         type === constants.COLUMN ||\n         type === constants.EDIT ||\n         type === constants.ROW ||\n         type === constants.OPTIONS ) {\n      this.callDataChangeCallbacks( type );\n    }\n    else {\n      gridUtil.logError(\"Notified of a data change, but the type was not recognised, so no action taken, type was: \" + type);\n    }\n  };\n\n  /**\n   * @ngdoc function\n   * @name columnRefreshCallback\n   * @methodOf ui.grid.class:Grid\n   * @description refreshes the grid when a column refresh\n   * is notified, which triggers handling of the visible flag.\n   * This is called on uiGridConstants.dataChange.COLUMN, and is\n   * registered as a dataChangeCallback in grid.js\n   * @param {object} grid The grid object.\n   * @param {object} options Any options passed into the callback.\n   */\n  Grid.prototype.columnRefreshCallback = function columnRefreshCallback(grid, options) {\n    grid.buildColumns(options);\n    grid.queueGridRefresh();\n  };\n\n  /**\n   * @ngdoc function\n   * @name processRowsCallback\n   * @methodOf ui.grid.class:Grid\n   * @description calls the row processors, specifically\n   * intended to reset the sorting when an edit is called,\n   * registered as a dataChangeCallback on uiGridConstants.dataChange.EDIT\n   * @param {object} grid The grid object.\n   */\n  Grid.prototype.processRowsCallback = function processRowsCallback( grid ) {\n    grid.queueGridRefresh();\n  };\n\n\n  /**\n   * @ngdoc function\n   * @name updateFooterHeightCallback\n   * @methodOf ui.grid.class:Grid\n   * @description recalculates the footer height,\n   * registered as a dataChangeCallback on uiGridConstants.dataChange.OPTIONS\n   * @param {object} grid The grid object.\n   */\n  Grid.prototype.updateFooterHeightCallback = function updateFooterHeightCallback( grid ) {\n    grid.footerHeight = grid.calcFooterHeight();\n    grid.columnFooterHeight = grid.calcColumnFooterHeight();\n  };\n\n\n  /**\n   * @ngdoc function\n   * @name getColumn\n   * @methodOf ui.grid.class:Grid\n   * @description returns a grid column for the column name\n   * @param {string} name column name\n   */\n  Grid.prototype.getColumn = function getColumn(name) {\n    return rowColumnFinder(this.columns, function (column) {\n      return column.colDef.name === name;\n    });\n  };\n\n  /**\n   * @ngdoc function\n   * @name getColDef\n   * @methodOf ui.grid.class:Grid\n   * @description returns a grid colDef for the column name\n   * @param {string} name column.field\n   */\n  Grid.prototype.getColDef = function getColDef(name) {\n    return rowColumnFinder(this.options.columnDefs, function (colDef) {\n      return colDef.name === name;\n    });\n  };\n\n  /**\n   * @ngdoc function\n   * @name assignTypes\n   * @methodOf ui.grid.class:Grid\n   * @description uses the first row of data to assign colDef.type for any types not defined.\n   */\n  /**\n   * @ngdoc property\n   * @name type\n   * @propertyOf ui.grid.class:GridOptions.columnDef\n   * @description the type of the column, used in sorting.  If not provided then the\n   * grid will guess the type.  Add this only if the grid guessing is not to your\n   * satisfaction.  One of:\n   * - 'string'\n   * - 'boolean'\n   * - 'number'\n   * - 'date'\n   * - 'object'\n   * - 'numberStr'\n   * Note that if you choose date, your dates should be in a javascript date type\n   *\n   */\n  Grid.prototype.assignTypes = function() {\n    var self = this;\n\n    self.options.columnDefs.forEach(function (colDef, index) {\n      // Assign colDef type if not specified\n      if (!colDef.type) {\n        var col = new GridColumn(colDef, index, self);\n        var firstRow = self.rows.length > 0 ? self.rows[0] : null;\n        if (firstRow) {\n          colDef.type = gridUtil.guessType(self.getCellValue(firstRow, col));\n        }\n        else {\n          colDef.type = 'string';\n        }\n      }\n    });\n  };\n\n\n  /**\n   * @ngdoc function\n   * @name isRowHeaderColumn\n   * @methodOf ui.grid.class:Grid\n   * @description returns true if the column is a row Header\n   * @param {object} column column\n   */\n  Grid.prototype.isRowHeaderColumn = function isRowHeaderColumn(column) {\n    return this.rowHeaderColumns.indexOf(column) !== -1;\n  };\n\n  /**\n  * @ngdoc function\n  * @name addRowHeaderColumn\n  * @methodOf ui.grid.class:Grid\n  * @description adds a row header column to the grid\n  * @param {object} colDef Column definition object.\n  * @param {float} order Number that indicates where the column should be placed in the grid.\n  * @param {boolean} stopColumnBuild Prevents the buildColumn callback from being triggered. This is useful to improve\n  * performance of the grid during initial load.\n  */\n  Grid.prototype.addRowHeaderColumn = function addRowHeaderColumn(colDef, order, stopColumnBuild) {\n    var self = this;\n\n    // default order\n    if (order === undefined) {\n      order = 0;\n    }\n\n    var rowHeaderCol = new GridColumn(colDef, gridUtil.nextUid(), self);\n    rowHeaderCol.isRowHeader = true;\n    if (self.isRTL()) {\n      self.createRightContainer();\n      rowHeaderCol.renderContainer = 'right';\n    }\n    else {\n      self.createLeftContainer();\n      rowHeaderCol.renderContainer = 'left';\n    }\n\n    // relies on the default column builder being first in array, as it is instantiated\n    // as part of grid creation\n    self.columnBuilders[0](colDef,rowHeaderCol,self.options)\n      .then(function() {\n        rowHeaderCol.enableFiltering = false;\n        rowHeaderCol.enableSorting = false;\n        rowHeaderCol.enableHiding = false;\n        rowHeaderCol.headerPriority = order;\n        self.rowHeaderColumns.push(rowHeaderCol);\n        self.rowHeaderColumns = self.rowHeaderColumns.sort(function (a, b) {\n          return a.headerPriority - b.headerPriority;\n        });\n\n        if (!stopColumnBuild) {\n          self.buildColumns()\n            .then(function() {\n              self.preCompileCellTemplates();\n              self.queueGridRefresh();\n            }).catch(angular.noop);\n        }\n      }).catch(angular.noop);\n  };\n\n  /**\n   * @ngdoc function\n   * @name getOnlyDataColumns\n   * @methodOf ui.grid.class:Grid\n   * @description returns all columns except for rowHeader columns\n   */\n  Grid.prototype.getOnlyDataColumns = function getOnlyDataColumns() {\n    var self = this,\n      cols = [];\n\n    self.columns.forEach(function (col) {\n      if (self.rowHeaderColumns.indexOf(col) === -1) {\n        cols.push(col);\n      }\n    });\n    return cols;\n  };\n\n  /**\n   * @ngdoc function\n   * @name buildColumns\n   * @methodOf ui.grid.class:Grid\n   * @description creates GridColumn objects from the columnDefinition.  Calls each registered\n   * columnBuilder to further process the column\n   * @param {object} opts An object contains options to use when building columns\n   *\n   * * **orderByColumnDefs**: defaults to **false**. When true, `buildColumns` will reorder existing columns according to the order within the column definitions.\n   *\n   * @returns {Promise} a promise to load any needed column resources\n   */\n  Grid.prototype.buildColumns = function buildColumns(opts) {\n    var options = {\n      orderByColumnDefs: false\n    };\n\n    angular.extend(options, opts);\n\n    // gridUtil.logDebug('buildColumns');\n    var self = this;\n    var builderPromises = [];\n    var headerOffset = self.rowHeaderColumns.length;\n    var i;\n\n    // Remove any columns for which a columnDef cannot be found\n    // Deliberately don't use forEach, as it doesn't like splice being called in the middle\n    // Also don't cache columns.length, as it will change during this operation\n    for (i = 0; i < self.columns.length; i++) {\n      if (!self.getColDef(self.columns[i].name)) {\n        self.columns.splice(i, 1);\n        i--;\n      }\n    }\n\n    // add row header columns to the grid columns array _after_ columns without columnDefs have been removed\n    // rowHeaderColumns is ordered by priority so insert in reverse\n    for (var j = self.rowHeaderColumns.length - 1; j >= 0; j--) {\n      self.columns.unshift(self.rowHeaderColumns[j]);\n    }\n\n    // look at each column def, and update column properties to match.  If the column def\n    // doesn't have a column, then splice in a new gridCol\n    self.options.columnDefs.forEach(function (colDef, index) {\n      self.preprocessColDef(colDef);\n      var col = self.getColumn(colDef.name);\n\n      if (!col) {\n        col = new GridColumn(colDef, gridUtil.nextUid(), self);\n        self.columns.splice(index + headerOffset, 0, col);\n      }\n      else {\n        // tell updateColumnDef that the column was pre-existing\n        col.updateColumnDef(colDef, false);\n      }\n\n      self.columnBuilders.forEach(function (builder) {\n        builderPromises.push(builder.call(self, colDef, col, self.options));\n      });\n    });\n\n    /*** Reorder columns if necessary ***/\n    if (!!options.orderByColumnDefs) {\n      // Create a shallow copy of the columns as a cache\n      var columnCache = self.columns.slice(0);\n\n      // We need to allow for the \"row headers\" when mapping from the column defs array to the columns array\n      //   If we have a row header in columns[0] and don't account for it   we'll overwrite it with the column in columnDefs[0]\n\n      // Go through all the column defs, use the shorter of columns length and colDefs.length because if a user has given two columns the same name then\n      // columns will be shorter than columnDefs.  In this situation we'll avoid an error, but the user will still get an unexpected result\n      var len = Math.min(self.options.columnDefs.length, self.columns.length);\n      for (i = 0; i < len; i++) {\n        // If the column at this index has a different name than the column at the same index in the column defs...\n        if (self.columns[i + headerOffset].name !== self.options.columnDefs[i].name) {\n          // Replace the one in the cache with the appropriate column\n          columnCache[i + headerOffset] = self.getColumn(self.options.columnDefs[i].name);\n        }\n        else {\n          // Otherwise just copy over the one from the initial columns\n          columnCache[i + headerOffset] = self.columns[i + headerOffset];\n        }\n      }\n\n      // Empty out the columns array, non-destructively\n      self.columns.length = 0;\n\n      // And splice in the updated, ordered columns from the cache\n      Array.prototype.splice.apply(self.columns, [0, 0].concat(columnCache));\n    }\n\n    return $q.all(builderPromises).then(function() {\n      if (self.rows.length > 0) {\n        self.assignTypes();\n      }\n      if (options.preCompileCellTemplates) {\n        self.preCompileCellTemplates();\n      }\n    }).catch(angular.noop);\n  };\n\n  Grid.prototype.preCompileCellTemplate = function(col) {\n    var self = this;\n    var html = col.cellTemplate.replace(uiGridConstants.MODEL_COL_FIELD, self.getQualifiedColField(col));\n    html = html.replace(uiGridConstants.COL_FIELD, 'grid.getCellValue(row, col)');\n\n    col.compiledElementFn = $compile(html);\n\n    if (col.compiledElementFnDefer) {\n      col.compiledElementFnDefer.resolve(col.compiledElementFn);\n    }\n  };\n\n/**\n * @ngdoc function\n * @name preCompileCellTemplates\n * @methodOf ui.grid.class:Grid\n * @description precompiles all cell templates\n */\n  Grid.prototype.preCompileCellTemplates = function() {\n    var self = this;\n    self.columns.forEach(function (col) {\n      if ( col.cellTemplate ) {\n        self.preCompileCellTemplate( col );\n      } else if ( col.cellTemplatePromise ) {\n        col.cellTemplatePromise.then( function() {\n          self.preCompileCellTemplate( col );\n        }).catch(angular.noop);\n      }\n    });\n  };\n\n  /**\n   * @ngdoc function\n   * @name getGridQualifiedColField\n   * @methodOf ui.grid.class:Grid\n   * @description Returns the $parse-able accessor for a column within its $scope\n   * @param {GridColumn} col col object\n   */\n  Grid.prototype.getQualifiedColField = function (col) {\n    var base = 'row.entity';\n    if ( col.field === uiGridConstants.ENTITY_BINDING ) {\n      return base;\n    }\n    return gridUtil.preEval(base + '.' + col.field);\n  };\n\n  /**\n   * @ngdoc function\n   * @name createLeftContainer\n   * @methodOf ui.grid.class:Grid\n   * @description creates the left render container if it doesn't already exist\n   */\n  Grid.prototype.createLeftContainer = function() {\n    if (!this.hasLeftContainer()) {\n      this.renderContainers.left = new GridRenderContainer('left', this, { disableColumnOffset: true });\n    }\n  };\n\n  /**\n   * @ngdoc function\n   * @name createRightContainer\n   * @methodOf ui.grid.class:Grid\n   * @description creates the right render container if it doesn't already exist\n   */\n  Grid.prototype.createRightContainer = function() {\n    if (!this.hasRightContainer()) {\n      this.renderContainers.right = new GridRenderContainer('right', this, { disableColumnOffset: true });\n    }\n  };\n\n  /**\n   * @ngdoc function\n   * @name hasLeftContainer\n   * @methodOf ui.grid.class:Grid\n   * @description returns true if leftContainer exists\n   */\n  Grid.prototype.hasLeftContainer = function() {\n    return this.renderContainers.left !== undefined;\n  };\n\n  /**\n   * @ngdoc function\n   * @name hasRightContainer\n   * @methodOf ui.grid.class:Grid\n   * @description returns true if rightContainer exists\n   */\n  Grid.prototype.hasRightContainer = function() {\n    return this.renderContainers.right !== undefined;\n  };\n\n\n      /**\n   * undocumented function\n   * @name preprocessColDef\n   * @methodOf ui.grid.class:Grid\n   * @description defaults the name property from field to maintain backwards compatibility with 2.x\n   * validates that name or field is present\n   */\n  Grid.prototype.preprocessColDef = function preprocessColDef(colDef) {\n    var self = this;\n\n    if (!colDef.field && !colDef.name) {\n      throw new Error('colDef.name or colDef.field property is required');\n    }\n\n    // maintain backwards compatibility with 2.x\n    // field was required in 2.x.  now name is required\n    if (colDef.name === undefined && colDef.field !== undefined) {\n      // See if the column name already exists:\n      var newName = colDef.field,\n        counter = 2;\n      while (self.getColumn(newName)) {\n        newName = colDef.field + counter.toString();\n        counter++;\n      }\n      colDef.name = newName;\n    }\n  };\n\n  // Return a list of items that exist in the `n` array but not the `o` array. Uses optional property accessors passed as third & fourth parameters\n  Grid.prototype.newInN = function newInN(o, n, oAccessor, nAccessor) {\n    var self = this;\n\n    var t = [];\n    for (var i = 0; i < n.length; i++) {\n      var nV = nAccessor ? n[i][nAccessor] : n[i];\n\n      var found = false;\n      for (var j = 0; j < o.length; j++) {\n        var oV = oAccessor ? o[j][oAccessor] : o[j];\n        if (self.options.rowEquality(nV, oV)) {\n          found = true;\n          break;\n        }\n      }\n      if (!found) {\n        t.push(nV);\n      }\n    }\n\n    return t;\n  };\n\n  var rowColumnFinder = function(array, func) {\n    if (array && array.length) {\n      if (angular.isFunction(array.find)) {\n        return array.find(func) || null;\n      }\n\n      var result = null;\n      array.every(function (entry) {\n        if (func(entry)) {\n          result = entry;\n          return false;\n        }\n        return true;\n      });\n      return result;\n    }\n    return null;\n  }\n\n  /**\n   * @ngdoc function\n   * @name getRow\n   * @methodOf ui.grid.class:Grid\n   * @description returns the GridRow that contains the rowEntity\n   * @param {object} rowEntity the gridOptions.data array element instance\n   * @param {array} lookInRows [optional] the rows to look in - if not provided then\n   * looks in grid.rows\n   */\n  Grid.prototype.getRow = function getRow(rowEntity, lookInRows) {\n    var self = this;\n    lookInRows = lookInRows == void 0 ? this.rows : lookInRows;\n    return rowColumnFinder(lookInRows, function (row) {\n      return self.options.rowEquality(row.entity, rowEntity);\n    });\n  };\n\n  /**\n   * @ngdoc function\n   * @name getRowsByKey\n   * @methodOf ui.grid.class:Grid\n   * @description returns all GridRows who have an key that is equal to comparator\n   * so for Example if isInEntity == false then it does this check: row[key] === comparator\n   * if isInEntity == true then it does this check: row.entity[key] === comparator\n   * @param {boolean} isInEntity if true then key is in entity else it's directly in row\n   * @param {(string|number)} key the key to look for\n   * @param {any} comparator the value that key should have\n   * @param {array} lookInRows [optional] the rows to look in - if not provided then\n   * looks in grid.rows\n   */\n  Grid.prototype.getRowsByKey = function getRowsByKey(isInEntity, key, comparator, lookInRows) {\n    if ( key == void 0 ) {\n      return null;\n    }\n\n    lookInRows = lookInRows == void 0 ? this.rows : lookInRows;\n    var func = isInEntity ? function (row) {\n      return row.entity != void 0 && row.entity.hasOwnProperty(key) && row.entity[key] === comparator;\n    } : function (row) {\n      return row.hasOwnProperty(key) && row[key] === comparator;\n    }\n\n    return lookInRows.filter(func);\n  };\n\n  /**\n   * @ngdoc function\n   * @name findRowByKey\n   * @methodOf ui.grid.class:Grid\n   * @description returns the first GridRow who has an key that is equal to comparator\n   * so for Example if isInEntity == false then it does this check: row[key] === comparator\n   * if isInEntity == true then it does this check: row.entity[key] === comparator\n   * @param {boolean} isInEntity if true then key is in entity else it's directly in row\n   * @param {(string|number)} key the key to look for\n   * @param {any} comparator the value that key should have\n   * @param {array} lookInRows [optional] the rows to look in - if not provided then\n   * looks in grid.rows\n   */\n  Grid.prototype.findRowByKey = function findRowByKey(isInEntity, key, comparator, lookInRows) {\n    var result = null;\n    if ( key != void 0 ) {\n      lookInRows = lookInRows == void 0 ? this.rows : lookInRows;\n      var func = isInEntity ? function (row) {\n        if ( row.entity != void 0 && row.entity.hasOwnProperty(key) && row.entity[key] === comparator ) {\n          result = row;\n          return false;\n        }\n        return true;\n      } : function (row) {\n        if ( row.hasOwnProperty(key) && row[key] === comparator ) {\n          result = row;\n          return false;\n        }\n        return true;\n      }\n\n      lookInRows.every(func);\n    }\n    return result\n  };\n\n  /**\n   * @ngdoc function\n   * @name modifyRows\n   * @methodOf ui.grid.class:Grid\n   * @description creates or removes GridRow objects from the newRawData array.  Calls each registered\n   * rowBuilder to further process the row\n   * @param {array} newRawData Modified set of data\n   *\n   * This method aims to achieve three things:\n   * 1. the resulting rows array is in the same order as the newRawData, we'll call\n   * rowsProcessors immediately after to sort the data anyway\n   * 2. if we have row hashing available, we try to use the rowHash to find the row\n   * 3. no memory leaks - rows that are no longer in newRawData need to be garbage collected\n   *\n   * The basic logic flow makes use of the newRawData, oldRows and oldHash, and creates\n   * the newRows and newHash\n   *\n   * ```\n   * newRawData.forEach newEntity\n   *   if (hashing enabled)\n   *     check oldHash for newEntity\n   *   else\n   *     look for old row directly in oldRows\n   *   if !oldRowFound     // must be a new row\n   *     create newRow\n   *   append to the newRows and add to newHash\n   *   run the processors\n   * ```\n   *\n   * Rows are identified using the hashKey if configured.  If not configured, then rows\n   * are identified using the gridOptions.rowEquality function\n   *\n   * This method is useful when trying to select rows immediately after loading data without\n   * using a $timeout/$interval, e.g.:\n   *\n   *   $scope.gridOptions.data =  someData;\n   *   $scope.gridApi.grid.modifyRows($scope.gridOptions.data);\n   *   $scope.gridApi.selection.selectRow($scope.gridOptions.data[0]);\n   *\n   * OR to persist row selection after data update (e.g. rows selected, new data loaded, want\n   * originally selected rows to be re-selected))\n   */\n  Grid.prototype.modifyRows = function modifyRows(newRawData) {\n    var self = this;\n    var oldRows = self.rows.slice(0);\n    var oldRowHash = self.rowHashMap || self.createRowHashMap();\n    var allRowsSelected = true;\n    self.rowHashMap = self.createRowHashMap();\n    self.rows.length = 0;\n\n    newRawData.forEach( function( newEntity, i ) {\n      var newRow, oldRow;\n\n      if ( self.options.enableRowHashing ) {\n        // if hashing is enabled, then this row will be in the hash if we already know about it\n        oldRow = oldRowHash.get( newEntity );\n      } else {\n        // otherwise, manually search the oldRows to see if we can find this row\n        oldRow = self.getRow(newEntity, oldRows);\n      }\n\n      // update newRow to have an entity\n      if ( oldRow ) {\n        newRow = oldRow;\n        newRow.entity = newEntity;\n        if (newRow.index !== i) {\n          newRow.index = i;\n        }\n      }\n\n      // if we didn't find the row, it must be new, so create it\n      if ( !newRow ) {\n        newRow = self.processRowBuilders(new GridRow(newEntity, i, self));\n      }\n\n      self.rows.push( newRow );\n      self.rowHashMap.put( newEntity, newRow );\n      if (!newRow.isSelected) {\n        allRowsSelected = false;\n      }\n    });\n\n    if (self.selection && self.rows.length) {\n      self.selection.selectAll = allRowsSelected;\n    }\n\n    self.assignTypes();\n\n    var p1 = $q.when(self.processRowsProcessors(self.rows))\n      .then(function (renderableRows) {\n        return self.setVisibleRows(renderableRows);\n      }).catch(angular.noop);\n\n    var p2 = $q.when(self.processColumnsProcessors(self.columns))\n      .then(function (renderableColumns) {\n        return self.setVisibleColumns(renderableColumns);\n      }).catch(angular.noop);\n\n    return $q.all([p1, p2]);\n  };\n\n\n  /**\n   * Private Undocumented Method\n   * @name addRows\n   * @methodOf ui.grid.class:Grid\n   * @description adds the newRawData array of rows to the grid and calls all registered\n   * rowBuilders. this keyword will reference the grid\n   */\n  Grid.prototype.addRows = function addRows(newRawData) {\n    var self = this,\n      existingRowCount = self.rows.length;\n\n    for (var i = 0; i < newRawData.length; i++) {\n      var newRow = self.processRowBuilders(new GridRow(newRawData[i], i + existingRowCount, self));\n\n      if (self.options.enableRowHashing) {\n        var found = self.rowHashMap.get(newRow.entity);\n        if (found) {\n          found.row = newRow;\n        }\n      }\n\n      self.rows.push(newRow);\n    }\n  };\n\n  /**\n   * @ngdoc function\n   * @name processRowBuilders\n   * @methodOf ui.grid.class:Grid\n   * @description processes all RowBuilders for the gridRow\n   * @param {GridRow} gridRow reference to gridRow\n   * @returns {GridRow} the gridRow with all additional behavior added\n   */\n  Grid.prototype.processRowBuilders = function processRowBuilders(gridRow) {\n    var self = this;\n\n    self.rowBuilders.forEach(function (builder) {\n      builder.call(self, gridRow, self.options);\n    });\n\n    return gridRow;\n  };\n\n  /**\n   * @ngdoc function\n   * @name registerStyleComputation\n   * @methodOf ui.grid.class:Grid\n   * @description registered a styleComputation function\n   *\n   * If the function returns a value it will be appended into the grid's `<style>` block\n   * @param {function($scope)} styleComputationInfo function\n   */\n  Grid.prototype.registerStyleComputation = function registerStyleComputation(styleComputationInfo) {\n    this.styleComputations.push(styleComputationInfo);\n  };\n\n  /**\n   * @ngdoc function\n   * @name registerRowsProcessor\n   * @methodOf ui.grid.class:Grid\n   * @description\n   *\n   * Register a \"rows processor\" function. When the rows are updated,\n   * the grid calls each registered \"rows processor\", which has a chance\n   * to alter the set of rows (sorting, etc) as long as the count is not\n   * modified.\n   *\n   * @param {function(renderedRowsToProcess, columns )} processor rows processor function, which\n   * is run in the context of the grid (i.e. this for the function will be the grid), and must\n   * return the updated rows list, which is passed to the next processor in the chain\n   * @param {number} priority the priority of this processor.  In general we try to do them in 100s to leave room\n   * for other people to inject rows processors at intermediate priorities.  Lower priority rowsProcessors run earlier.\n   *\n   * At present all rows visible is running at 50, filter is running at 100, sort is at 200, grouping at 400, selectable rows at 500, pagination at 900 (pagination will generally want to be last)\n   *\n   */\n  Grid.prototype.registerRowsProcessor = function registerRowsProcessor(processor, priority) {\n    if (!angular.isFunction(processor)) {\n      throw 'Attempt to register non-function rows processor: ' + processor;\n    }\n\n    this.rowsProcessors.push({processor: processor, priority: priority});\n    this.rowsProcessors.sort(function sortByPriority( a, b ) {\n      return a.priority - b.priority;\n    });\n  };\n\n  /**\n   * @ngdoc function\n   * @name removeRowsProcessor\n   * @methodOf ui.grid.class:Grid\n   * @param {function(renderableRows)} processor processor function\n   * @description Remove a registered rows processor\n   */\n  Grid.prototype.removeRowsProcessor = function removeRowsProcessor(processor) {\n    var idx = -1;\n    this.rowsProcessors.forEach(function(rowsProcessor, index) {\n      if ( rowsProcessor.processor === processor ) {\n        idx = index;\n      }\n    });\n\n    if ( idx !== -1 ) {\n      this.rowsProcessors.splice(idx, 1);\n    }\n  };\n\n  /**\n   * Private Undocumented Method\n   * @name processRowsProcessors\n   * @methodOf ui.grid.class:Grid\n   * @param {Array[GridRow]} renderableRows The array of \"renderable\" rows\n   * @description Run all the registered rows processors on the array of renderable rows\n   */\n  Grid.prototype.processRowsProcessors = function processRowsProcessors(renderableRows) {\n    var self = this;\n\n    // Create a shallow copy of the rows so that we can safely sort them without altering the original grid.rows sort order\n    var myRenderableRows = renderableRows.slice(0);\n\n    // Return myRenderableRows with no processing if we have no rows processors\n    if (self.rowsProcessors.length === 0) {\n      return $q.when(myRenderableRows);\n    }\n\n    // Counter for iterating through rows processors\n    var i = 0;\n\n    // Promise for when we're done with all the processors\n    var finished = $q.defer();\n\n    // This function will call the processor in self.rowsProcessors at index 'i', and then\n    //   when done will call the next processor in the list, using the output from the processor\n    //   at i as the argument for 'renderedRowsToProcess' on the next iteration.\n    //\n    //   If we're at the end of the list of processors, we resolve our 'finished' callback with\n    //   the result.\n    function startProcessor(i, renderedRowsToProcess) {\n      // Get the processor at 'i'\n      var processor = self.rowsProcessors[i].processor;\n\n      // Call the processor, passing in the rows to process and the current columns\n      //   (note: it's wrapped in $q.when() in case the processor does not return a promise)\n      return $q.when( processor.call(self, renderedRowsToProcess, self.columns) )\n        .then(function handleProcessedRows(processedRows) {\n          // Check for errors\n          if (!processedRows) {\n            throw \"Processor at index \" + i + \" did not return a set of renderable rows\";\n          }\n\n          if (!angular.isArray(processedRows)) {\n            throw \"Processor at index \" + i + \" did not return an array\";\n          }\n\n          // Processor is done, increment the counter\n          i++;\n\n          // If we're not done with the processors, call the next one\n          if (i <= self.rowsProcessors.length - 1) {\n            return startProcessor(i, processedRows);\n          }\n          // We're done! Resolve the 'finished' promise\n          else {\n            finished.resolve(processedRows);\n          }\n        }).catch(function(error) {\n          throw error;\n        });\n    }\n\n    // Start on the first processor\n    startProcessor(0, myRenderableRows);\n\n    return finished.promise;\n  };\n\n  Grid.prototype.setVisibleRows = function setVisibleRows(rows) {\n    var self = this;\n\n    // Reset all the render container row caches\n    for (var i in self.renderContainers) {\n      var container = self.renderContainers[i];\n\n      container.canvasHeightShouldUpdate = true;\n\n      if ( typeof(container.visibleRowCache) === 'undefined' ) {\n        container.visibleRowCache = [];\n      } else {\n        container.visibleRowCache.length = 0;\n      }\n    }\n\n    // rows.forEach(function (row) {\n    for (var ri = 0; ri < rows.length; ri++) {\n      var row = rows[ri];\n\n      var targetContainer = (typeof(row.renderContainer) !== 'undefined' && row.renderContainer) ? row.renderContainer : 'body';\n\n      // If the row is visible\n      if (row.visible) {\n        self.renderContainers[targetContainer].visibleRowCache.push(row);\n      }\n    }\n    self.api.core.raise.rowsVisibleChanged(this.api);\n    self.api.core.raise.rowsRendered(this.api);\n  };\n\n  /**\n   * @ngdoc function\n   * @name registerColumnsProcessor\n   * @methodOf ui.grid.class:Grid\n   * @param {function(renderedColumnsToProcess, rows)} processor column processor function, which\n   * is run in the context of the grid (i.e. this for the function will be the grid), and\n   * which must return an updated renderedColumnsToProcess which can be passed to the next processor\n   * in the chain\n   * @param {number} priority the priority of this processor.  In general we try to do them in 100s to leave room\n   * for other people to inject columns processors at intermediate priorities.  Lower priority columnsProcessors run earlier.\n   *\n   * At present all rows visible is running at 50, filter is running at 100, sort is at 200, grouping at 400, selectable rows at 500, pagination at 900 (pagination will generally want to be last)\n   * @description\n\n     Register a \"columns processor\" function. When the columns are updated,\n     the grid calls each registered \"columns processor\", which has a chance\n     to alter the set of columns, as long as the count is not modified.\n   */\n  Grid.prototype.registerColumnsProcessor = function registerColumnsProcessor(processor, priority) {\n    if (!angular.isFunction(processor)) {\n      throw 'Attempt to register non-function rows processor: ' + processor;\n    }\n\n    this.columnsProcessors.push({processor: processor, priority: priority});\n    this.columnsProcessors.sort(function sortByPriority( a, b ) {\n      return a.priority - b.priority;\n    });\n  };\n\n  Grid.prototype.removeColumnsProcessor = function removeColumnsProcessor(processor) {\n    var idx = this.columnsProcessors.indexOf(processor);\n\n    if (typeof(idx) !== 'undefined' && idx !== undefined) {\n      this.columnsProcessors.splice(idx, 1);\n    }\n  };\n\n  Grid.prototype.processColumnsProcessors = function processColumnsProcessors(renderableColumns) {\n    var self = this;\n\n    // Create a shallow copy of the rows so that we can safely sort them without altering the original grid.rows sort order\n    var myRenderableColumns = renderableColumns.slice(0);\n\n    // Return myRenderableRows with no processing if we have no rows processors\n    if (self.columnsProcessors.length === 0) {\n      return $q.when(myRenderableColumns);\n    }\n\n    // Promise for when we're done with all the processors\n    var finished = $q.defer();\n\n    // This function will call the processor in self.rowsProcessors at index 'i', and then\n    //   when done will call the next processor in the list, using the output from the processor\n    //   at i as the argument for 'renderedRowsToProcess' on the next iteration.\n    //\n    //   If we're at the end of the list of processors, we resolve our 'finished' callback with\n    //   the result.\n    function startProcessor(i, renderedColumnsToProcess) {\n      // Get the processor at 'i'\n      var processor = self.columnsProcessors[i].processor;\n\n      // Call the processor, passing in the rows to process and the current columns\n      //   (note: it's wrapped in $q.when() in case the processor does not return a promise)\n      return $q.when( processor.call(self, renderedColumnsToProcess, self.rows) )\n        .then(function handleProcessedRows(processedColumns) {\n          // Check for errors\n          if (!processedColumns) {\n            throw \"Processor at index \" + i + \" did not return a set of renderable rows\";\n          }\n\n          if (!angular.isArray(processedColumns)) {\n            throw \"Processor at index \" + i + \" did not return an array\";\n          }\n\n          // Processor is done, increment the counter\n          i++;\n\n          // If we're not done with the processors, call the next one\n          if (i <= self.columnsProcessors.length - 1) {\n            return startProcessor(i, myRenderableColumns);\n          }\n          // We're done! Resolve the 'finished' promise\n          else {\n            finished.resolve(myRenderableColumns);\n          }\n        }).catch(angular.noop);\n    }\n\n    // Start on the first processor\n    startProcessor(0, myRenderableColumns);\n\n    return finished.promise;\n  };\n\n  Grid.prototype.setVisibleColumns = function setVisibleColumns(columns) {\n    // gridUtil.logDebug('setVisibleColumns');\n\n    var self = this;\n\n    // Reset all the render container row caches\n    for (var i in self.renderContainers) {\n      var container = self.renderContainers[i];\n\n      container.visibleColumnCache.length = 0;\n    }\n\n    for (var ci = 0; ci < columns.length; ci++) {\n      var column = columns[ci];\n\n      // If the column is visible\n      if (column.visible) {\n        // If the column has a container specified\n        if (typeof(column.renderContainer) !== 'undefined' && column.renderContainer) {\n          self.renderContainers[column.renderContainer].visibleColumnCache.push(column);\n        }\n        // If not, put it into the body container\n        else {\n          self.renderContainers.body.visibleColumnCache.push(column);\n        }\n      }\n    }\n  };\n\n  /**\n   * @ngdoc function\n   * @name handleWindowResize\n   * @methodOf ui.grid.class:Grid\n   * @description Triggered when the browser window resizes; automatically resizes the grid\n   * @returns {Promise} A resolved promise once the window resize has completed.\n   */\n  Grid.prototype.handleWindowResize = function handleWindowResize($event) {\n    var self = this;\n\n    self.gridWidth = gridUtil.elementWidth(self.element);\n    self.gridHeight = gridUtil.elementHeight(self.element);\n\n    return self.queueRefresh();\n  };\n\n  /**\n   * @ngdoc function\n   * @name queueRefresh\n   * @methodOf ui.grid.class:Grid\n   * @description queues a grid refreshCanvas, a way of debouncing all the refreshes we might otherwise issue\n   */\n  Grid.prototype.queueRefresh = function queueRefresh() {\n    var self = this;\n\n    if (self.refreshCanceller) {\n      $timeout.cancel(self.refreshCanceller);\n    }\n\n    self.refreshCanceller = $timeout(function () {\n      self.refreshCanvas(true);\n    });\n\n    self.refreshCanceller.then(function () {\n      self.refreshCanceller = null;\n    }).catch(angular.noop);\n\n    return self.refreshCanceller;\n  };\n\n\n  /**\n   * @ngdoc function\n   * @name queueGridRefresh\n   * @methodOf ui.grid.class:Grid\n   * @description queues a grid refresh, a way of debouncing all the refreshes we might otherwise issue\n   */\n  Grid.prototype.queueGridRefresh = function queueGridRefresh() {\n    var self = this;\n\n    if (self.gridRefreshCanceller) {\n      $timeout.cancel(self.gridRefreshCanceller);\n    }\n\n    self.gridRefreshCanceller = $timeout(function () {\n      self.refresh(true);\n    });\n\n    self.gridRefreshCanceller.then(function () {\n      self.gridRefreshCanceller = null;\n    }).catch(angular.noop);\n\n    return self.gridRefreshCanceller;\n  };\n\n\n  /**\n   * @ngdoc function\n   * @name updateCanvasHeight\n   * @methodOf ui.grid.class:Grid\n   * @description flags all render containers to update their canvas height\n   */\n  Grid.prototype.updateCanvasHeight = function updateCanvasHeight() {\n    var self = this;\n\n    for (var containerId in self.renderContainers) {\n      if (self.renderContainers.hasOwnProperty(containerId)) {\n        var container = self.renderContainers[containerId];\n        container.canvasHeightShouldUpdate = true;\n      }\n    }\n  };\n\n  /**\n   * @ngdoc function\n   * @name buildStyles\n   * @methodOf ui.grid.class:Grid\n   * @description calls each styleComputation function\n   */\n  Grid.prototype.buildStyles = function buildStyles() {\n    var self = this;\n\n    // gridUtil.logDebug('buildStyles');\n\n    self.customStyles = '';\n\n    self.styleComputations\n      .sort(function(a, b) {\n        if (a.priority === null) { return 1; }\n        if (b.priority === null) { return -1; }\n        if (a.priority === null && b.priority === null) { return 0; }\n        return a.priority - b.priority;\n      })\n      .forEach(function (compInfo) {\n        // this used to provide $scope as a second parameter, but I couldn't find any\n        // style builders that used it, so removed it as part of moving to grid from controller\n        var ret = compInfo.func.call(self);\n\n        if (angular.isString(ret)) {\n          self.customStyles += '\\n' + ret;\n        }\n      });\n  };\n\n\n  Grid.prototype.minColumnsToRender = function minColumnsToRender() {\n    var self = this;\n    var viewport = this.getViewportWidth();\n\n    var min = 0;\n    var totalWidth = 0;\n    self.columns.forEach(function(col, i) {\n      if (totalWidth < viewport) {\n        totalWidth += col.drawnWidth;\n        min++;\n      }\n      else {\n        var currWidth = 0;\n        for (var j = i; j >= i - min; j--) {\n          currWidth += self.columns[j].drawnWidth;\n        }\n        if (currWidth < viewport) {\n          min++;\n        }\n      }\n    });\n\n    return min;\n  };\n\n  Grid.prototype.getBodyHeight = function getBodyHeight() {\n    return this.getViewportHeight();\n  };\n\n  // NOTE: viewport drawable height is the height of the grid minus the header row height (including any border)\n  // TODO(c0bra): account for footer height\n  Grid.prototype.getViewportHeight = function getViewportHeight() {\n    var self = this;\n\n    var viewPortHeight = this.gridHeight - this.headerHeight - this.footerHeight;\n\n    // Account for native horizontal scrollbar, if present\n    // if (typeof(this.horizontalScrollbarHeight) !== 'undefined' && this.horizontalScrollbarHeight !== undefined && this.horizontalScrollbarHeight > 0) {\n    //   viewPortHeight = viewPortHeight - this.horizontalScrollbarHeight;\n    // }\n\n    var adjustment = self.getViewportAdjustment();\n\n    viewPortHeight = viewPortHeight + adjustment.height;\n\n    // gridUtil.logDebug('viewPortHeight', viewPortHeight);\n\n    return viewPortHeight > 0 ? viewPortHeight : 0;\n  };\n\n  Grid.prototype.getViewportWidth = function getViewportWidth() {\n    var self = this;\n\n    var viewPortWidth = this.gridWidth;\n\n    // if (typeof(this.verticalScrollbarWidth) !== 'undefined' && this.verticalScrollbarWidth !== undefined && this.verticalScrollbarWidth > 0) {\n    //   viewPortWidth = viewPortWidth - this.verticalScrollbarWidth;\n    // }\n\n    var adjustment = self.getViewportAdjustment();\n\n    viewPortWidth = viewPortWidth + adjustment.width;\n\n    // gridUtil.logDebug('getviewPortWidth', viewPortWidth);\n\n    return viewPortWidth;\n  };\n\n  Grid.prototype.getHeaderViewportWidth = function getHeaderViewportWidth() {\n    return this.getViewportWidth();\n  };\n\n  Grid.prototype.addVerticalScrollSync = function (containerId, callBackFn) {\n    this.verticalScrollSyncCallBackFns[containerId] = callBackFn;\n  };\n\n  Grid.prototype.addHorizontalScrollSync = function (containerId, callBackFn) {\n    this.horizontalScrollSyncCallBackFns[containerId] = callBackFn;\n  };\n\n/**\n * Scroll needed containers by calling their ScrollSyncs\n * @param sourceContainerId the containerId that has already set it's top/left.\n *         can be empty string which means all containers need to set top/left\n * @param scrollEvent\n */\n  Grid.prototype.scrollContainers = function (sourceContainerId, scrollEvent) {\n    if (scrollEvent.y) {\n      // default for no container Id (ex. mousewheel means that all containers must set scrollTop/Left)\n      var verts = ['body','left', 'right'];\n\n      this.flagScrollingVertically(scrollEvent);\n\n      if (sourceContainerId === 'body') {\n        verts = ['left', 'right'];\n      }\n      else if (sourceContainerId === 'left') {\n        verts = ['body', 'right'];\n      }\n      else if (sourceContainerId === 'right') {\n        verts = ['body', 'left'];\n      }\n\n      for (var i = 0; i < verts.length; i++) {\n        var id = verts[i];\n        if (this.verticalScrollSyncCallBackFns[id]) {\n          this.verticalScrollSyncCallBackFns[id](scrollEvent);\n        }\n      }\n\n    }\n\n    if (scrollEvent.x) {\n      // default for no container Id (ex. mousewheel means that all containers must set scrollTop/Left)\n      var horizs = ['body','bodyheader', 'bodyfooter'];\n\n      this.flagScrollingHorizontally(scrollEvent);\n      if (sourceContainerId === 'body') {\n        horizs = ['bodyheader', 'bodyfooter'];\n      }\n\n      for (var j = 0; j < horizs.length; j++) {\n        var idh = horizs[j];\n        if (this.horizontalScrollSyncCallBackFns[idh]) {\n          this.horizontalScrollSyncCallBackFns[idh](scrollEvent);\n        }\n      }\n    }\n  };\n\n  Grid.prototype.registerViewportAdjuster = function registerViewportAdjuster(func) {\n    this.viewportAdjusters.push(func);\n  };\n\n  Grid.prototype.removeViewportAdjuster = function registerViewportAdjuster(func) {\n    var idx = this.viewportAdjusters.indexOf(func);\n\n    if (typeof(idx) !== 'undefined' && idx !== undefined) {\n      this.viewportAdjusters.splice(idx, 1);\n    }\n  };\n\n  Grid.prototype.getViewportAdjustment = function getViewportAdjustment() {\n    var self = this;\n\n    var adjustment = { height: 0, width: 0 };\n\n    self.viewportAdjusters.forEach(function (func) {\n      adjustment = func.call(this, adjustment);\n    });\n\n    return adjustment;\n  };\n\n  Grid.prototype.getVisibleRowCount = function getVisibleRowCount() {\n    // return this.visibleRowCache.length;\n    return this.renderContainers.body.visibleRowCache.length;\n  };\n\n   Grid.prototype.getVisibleRows = function getVisibleRows() {\n    return this.renderContainers.body.visibleRowCache;\n   };\n\n  Grid.prototype.getVisibleColumnCount = function getVisibleColumnCount() {\n    // return this.visibleRowCache.length;\n    return this.renderContainers.body.visibleColumnCache.length;\n  };\n\n\n  Grid.prototype.searchRows = function searchRows(renderableRows) {\n    return rowSearcher.search(this, renderableRows, this.columns);\n  };\n\n  Grid.prototype.sortByColumn = function sortByColumn(renderableRows) {\n    return rowSorter.sort(this, renderableRows, this.columns);\n  };\n\n  /**\n   * @ngdoc function\n   * @name getCellValue\n   * @methodOf ui.grid.class:Grid\n   * @description Gets the value of a cell for a particular row and column\n   * @param {GridRow} row Row to access\n   * @param {GridColumn} col Column to access\n   */\n  Grid.prototype.getCellValue = function getCellValue(row, col) {\n    if ( typeof(row.entity[ '$$' + col.uid ]) !== 'undefined' ) {\n      return row.entity[ '$$' + col.uid].rendered;\n    }\n    else if (this.options.flatEntityAccess && typeof(col.field) !== 'undefined' ) {\n      return row.entity[col.field];\n    }\n    else {\n      if (!col.cellValueGetterCache) {\n        col.cellValueGetterCache = $parse(row.getEntityQualifiedColField(col));\n      }\n\n      return col.cellValueGetterCache(row);\n    }\n  };\n\n  /**\n   * @ngdoc function\n   * @name getCellDisplayValue\n   * @methodOf ui.grid.class:Grid\n   * @description Gets the displayed value of a cell after applying any the `cellFilter`\n   * @param {GridRow} row Row to access\n   * @param {GridColumn} col Column to access\n   */\n  Grid.prototype.getCellDisplayValue = function getCellDisplayValue(row, col) {\n    if ( !col.cellDisplayGetterCache ) {\n      var custom_filter = col.cellFilter ? \" | \" + col.cellFilter : \"\";\n\n      if (typeof(row.entity['$$' + col.uid]) !== 'undefined') {\n        col.cellDisplayGetterCache = $parse(row.entity['$$' + col.uid].rendered + custom_filter);\n      }\n      else if (this.options.flatEntityAccess && typeof(col.field) !== 'undefined') {\n        var colField = col.field.replace(/(')|(\\\\)/g, \"\\\\$&\");\n\n        col.cellDisplayGetterCache = $parse('entity[\\'' + colField + '\\']' + custom_filter);\n      }\n      else {\n        col.cellDisplayGetterCache = $parse(row.getEntityQualifiedColField(col) + custom_filter);\n      }\n    }\n\n    var rowWithCol = angular.extend({}, row, {col: col});\n\n    return col.cellDisplayGetterCache(rowWithCol);\n  };\n\n\n  Grid.prototype.getNextColumnSortPriority = function getNextColumnSortPriority() {\n    var self = this,\n        p = 0;\n\n    self.columns.forEach(function (col) {\n      if (col.sort && col.sort.priority !== undefined && col.sort.priority >= p) {\n        p = col.sort.priority + 1;\n      }\n    });\n\n    return p;\n  };\n\n  /**\n   * @ngdoc function\n   * @name resetColumnSorting\n   * @methodOf ui.grid.class:Grid\n   * @description Return the columns that the grid is currently being sorted by\n   * @param {GridColumn} [excludedColumn] Optional GridColumn to exclude from having its sorting reset\n   */\n  Grid.prototype.resetColumnSorting = function resetColumnSorting(excludeCol) {\n    var self = this;\n\n    self.columns.forEach(function (col) {\n      if (col !== excludeCol && !col.suppressRemoveSort) {\n        col.sort = {};\n      }\n    });\n  };\n\n  /**\n   * @ngdoc function\n   * @name getColumnSorting\n   * @methodOf ui.grid.class:Grid\n   * @description Return the columns that the grid is currently being sorted by\n   * @returns {Array[GridColumn]} An array of GridColumn objects\n   */\n  Grid.prototype.getColumnSorting = function getColumnSorting() {\n    var self = this;\n\n    var sortedCols = [], myCols;\n\n    // Iterate through all the columns, sorted by priority\n    // Make local copy of column list, because sorting is in-place and we do not want to\n    // change the original sequence of columns\n    myCols = self.columns.slice(0);\n    myCols.sort(rowSorter.prioritySort).forEach(function (col) {\n      if (col.sort && typeof(col.sort.direction) !== 'undefined' && col.sort.direction && (col.sort.direction === uiGridConstants.ASC || col.sort.direction === uiGridConstants.DESC)) {\n        sortedCols.push(col);\n      }\n    });\n\n    return sortedCols;\n  };\n\n  /**\n   * @ngdoc function\n   * @name sortColumn\n   * @methodOf ui.grid.class:Grid\n   * @description Set the sorting on a given column, optionally resetting any existing sorting on the Grid.\n   * Emits the sortChanged event whenever the sort criteria are changed.\n   * @param {GridColumn} column Column to set the sorting on\n   * @param {uiGridConstants.ASC|uiGridConstants.DESC} [direction] Direction to sort by, either descending or ascending.\n   *   If not provided, the column will iterate through the sort directions\n   *   specified in the {@link ui.grid.class:GridOptions.columnDef#sortDirectionCycle sortDirectionCycle} attribute.\n   * @param {boolean} [add] Add this column to the sorting. If not provided or set to `false`, the Grid will reset any existing sorting and sort\n   *   by this column only\n   * @returns {Promise} A resolved promise that supplies the column.\n   */\n\n  Grid.prototype.sortColumn = function sortColumn(column, directionOrAdd, add) {\n    var self = this,\n        direction = null;\n\n    if (typeof(column) === 'undefined' || !column) {\n      throw new Error('No column parameter provided');\n    }\n\n    // Second argument can either be a direction or whether to add this column to the existing sort.\n    //   If it's a boolean, it's an add, otherwise, it's a direction\n    if (typeof(directionOrAdd) === 'boolean') {\n      add = directionOrAdd;\n    }\n    else {\n      direction = directionOrAdd;\n    }\n\n    if (!add || (self.options && self.options.suppressMultiSort)) {\n      self.resetColumnSorting(column);\n      column.sort.priority = undefined;\n      // Get the actual priority since there may be columns which have suppressRemoveSort set\n      column.sort.priority = self.getNextColumnSortPriority();\n    }\n    else if (column.sort.priority === undefined) {\n      column.sort.priority = self.getNextColumnSortPriority();\n    }\n\n    if (!direction) {\n      // Find the current position in the cycle (or -1).\n      var i = column.sortDirectionCycle.indexOf(column.sort && column.sort.direction ? column.sort.direction : null);\n      // Proceed to the next position in the cycle (or start at the beginning).\n      i = (i+1) % column.sortDirectionCycle.length;\n      // If suppressRemoveSort is set, and the next position in the cycle would\n      // remove the sort, skip it.\n      if (column.colDef && column.suppressRemoveSort && !column.sortDirectionCycle[i]) {\n        i = (i+1) % column.sortDirectionCycle.length;\n      }\n\n      if (column.sortDirectionCycle[i]) {\n        column.sort.direction = column.sortDirectionCycle[i];\n      } else {\n        removeSortOfColumn(column, self);\n      }\n    }\n    else {\n      column.sort.direction = direction;\n    }\n\n    self.api.core.raise.sortChanged( self, self.getColumnSorting() );\n\n    return $q.when(column);\n  };\n\n  var removeSortOfColumn = function removeSortOfColumn(column, grid) {\n    // Decrease priority for every col where priority is higher than the removed sort's priority.\n    grid.columns.forEach(function (col) {\n      if (col.sort && col.sort.priority !== undefined && col.sort.priority > column.sort.priority) {\n        col.sort.priority -= 1;\n      }\n    });\n\n    // Remove sort\n    column.sort = {};\n  };\n\n  /**\n   * communicate to outside world that we are done with initial rendering\n   */\n  Grid.prototype.renderingComplete = function() {\n    if (angular.isFunction(this.options.onRegisterApi)) {\n      this.options.onRegisterApi(this.api);\n    }\n    this.api.core.raise.renderingComplete( this.api );\n  };\n\n  Grid.prototype.createRowHashMap = function createRowHashMap() {\n    var self = this;\n\n    var hashMap = new RowHashMap();\n    hashMap.grid = self;\n\n    return hashMap;\n  };\n\n\n  /**\n   * @ngdoc function\n   * @name refresh\n   * @methodOf ui.grid.class:Grid\n   * @description Refresh the rendered grid on screen.\n   * @param {boolean} [rowsAltered] Optional flag for refreshing when the number of rows has changed.\n   */\n  Grid.prototype.refresh = function refresh(rowsAltered) {\n    var self = this;\n\n    var p1 = self.processRowsProcessors(self.rows).then(function (renderableRows) {\n      self.setVisibleRows(renderableRows);\n    }).catch(angular.noop);\n\n    var p2 = self.processColumnsProcessors(self.columns).then(function (renderableColumns) {\n      self.setVisibleColumns(renderableColumns);\n    }).catch(angular.noop);\n\n    return $q.all([p1, p2]).then(function () {\n      self.refreshCanvas(true);\n      self.redrawInPlace(rowsAltered);\n    }).catch(angular.noop);\n  };\n\n  /**\n   * @ngdoc function\n   * @name refreshRows\n   * @methodOf ui.grid.class:Grid\n   * @description Refresh the rendered rows on screen?  Note: not functional at present\n   * @returns {promise} promise that is resolved when render completes?\n   *\n   */\n  Grid.prototype.refreshRows = function refreshRows() {\n    var self = this;\n\n    return self.processRowsProcessors(self.rows)\n      .then(function (renderableRows) {\n        self.setVisibleRows(renderableRows);\n\n        self.redrawInPlace();\n\n        self.refreshCanvas( true );\n      }).catch(angular.noop);\n  };\n\n  /**\n   * @ngdoc function\n   * @name refreshCanvas\n   * @methodOf ui.grid.class:Grid\n   * @description Builds all styles and recalculates much of the grid sizing\n   * @param {object} buildStyles optional parameter.  Use TBD\n   * @returns {promise} promise that is resolved when the canvas\n   * has been refreshed\n   *\n   */\n  Grid.prototype.refreshCanvas = function(buildStyles) {\n    var self = this;\n\n    // gridUtil.logDebug('refreshCanvas');\n\n    var p = $q.defer();\n\n    // Get all the header heights\n    var containerHeadersToRecalc = [];\n    for (var containerId in self.renderContainers) {\n      if (self.renderContainers.hasOwnProperty(containerId)) {\n        var container = self.renderContainers[containerId];\n\n        // Skip containers that have no canvasWidth set yet\n        if (container.canvasWidth === null || isNaN(container.canvasWidth)) {\n          continue;\n        }\n\n        if (container.header || container.headerCanvas) {\n          container.explicitHeaderHeight = container.explicitHeaderHeight || null;\n          container.explicitHeaderCanvasHeight = container.explicitHeaderCanvasHeight || null;\n\n          containerHeadersToRecalc.push(container);\n        }\n      }\n    }\n\n    // Build the styles without the explicit header heights\n    if (buildStyles) {\n      self.buildStyles();\n    }\n\n    /*\n     *\n     * Here we loop through the headers, measuring each element as well as any header \"canvas\" it has within it.\n     *\n     * If any header is less than the largest header height, it will be resized to that so that we don't have headers\n     * with different heights, which looks like a rendering problem\n     *\n     * We'll do the same thing with the header canvases, and give the header CELLS an explicit height if their canvas\n     * is smaller than the largest canvas height. That was header cells without extra controls like filtering don't\n     * appear shorter than other cells.\n     *\n     */\n    if (containerHeadersToRecalc.length > 0) {\n      // Putting in a timeout as it's not calculating after the grid element is rendered and filled out\n      $timeout(function() {\n        // var oldHeaderHeight = self.grid.headerHeight;\n        // self.grid.headerHeight = gridUtil.outerElementHeight(self.header);\n\n        var rebuildStyles = false;\n\n        // Get all the header heights\n        var maxHeaderHeight = 0;\n        var maxHeaderCanvasHeight = 0;\n        var i, container;\n        var getHeight = function(oldVal, newVal) {\n          if ( oldVal !== newVal) {\n            rebuildStyles = true;\n          }\n          return newVal;\n        };\n        for (i = 0; i < containerHeadersToRecalc.length; i++) {\n          container = containerHeadersToRecalc[i];\n\n          // Skip containers that have no canvasWidth set yet\n          if (container.canvasWidth === null || isNaN(container.canvasWidth)) {\n            continue;\n          }\n\n          if (container.header) {\n            var headerHeight = container.headerHeight = getHeight(container.headerHeight, gridUtil.outerElementHeight(container.header));\n\n            // Get the \"inner\" header height, that is the height minus the top and bottom borders, if present. We'll use it to make sure all the headers have a consistent height\n            var topBorder = gridUtil.getBorderSize(container.header, 'top');\n            var bottomBorder = gridUtil.getBorderSize(container.header, 'bottom');\n            var innerHeaderHeight = parseInt(headerHeight - topBorder - bottomBorder, 10);\n\n            innerHeaderHeight  = innerHeaderHeight < 0 ? 0 : innerHeaderHeight;\n\n            container.innerHeaderHeight = innerHeaderHeight;\n\n            // If the header doesn't have an explicit height set, save the largest header height for use later\n            //   Explicit header heights are based off of the max we are calculating here. We never want to base the max on something we're setting explicitly\n            if (!container.explicitHeaderHeight && innerHeaderHeight > maxHeaderHeight) {\n              maxHeaderHeight = innerHeaderHeight;\n            }\n          }\n\n          if (container.headerCanvas) {\n            var headerCanvasHeight = container.headerCanvasHeight = getHeight(container.headerCanvasHeight, parseInt(gridUtil.outerElementHeight(container.headerCanvas), 10));\n\n\n            // If the header doesn't have an explicit canvas height, save the largest header canvas height for use later\n            //   Explicit header heights are based off of the max we are calculating here. We never want to base the max on something we're setting explicitly\n            if (!container.explicitHeaderCanvasHeight && headerCanvasHeight > maxHeaderCanvasHeight) {\n              maxHeaderCanvasHeight = headerCanvasHeight;\n            }\n          }\n        }\n\n        // Go through all the headers\n        for (i = 0; i < containerHeadersToRecalc.length; i++) {\n          container = containerHeadersToRecalc[i];\n\n          /* If:\n              1. We have a max header height\n              2. This container has a header height defined\n              3. And either this container has an explicit header height set, OR its header height is less than the max\n\n              then:\n\n              Give this container's header an explicit height so it will line up with the tallest header\n          */\n          if (\n            maxHeaderHeight > 0 && typeof(container.headerHeight) !== 'undefined' && container.headerHeight !== null &&\n            (container.explicitHeaderHeight || container.headerHeight < maxHeaderHeight)\n          ) {\n            container.explicitHeaderHeight = getHeight(container.explicitHeaderHeight, maxHeaderHeight);\n          }\n\n          // Do the same as above except for the header canvas\n          if (\n            maxHeaderCanvasHeight > 0 && typeof(container.headerCanvasHeight) !== 'undefined' && container.headerCanvasHeight !== null &&\n            (container.explicitHeaderCanvasHeight || container.headerCanvasHeight < maxHeaderCanvasHeight)\n          ) {\n            container.explicitHeaderCanvasHeight = getHeight(container.explicitHeaderCanvasHeight, maxHeaderCanvasHeight);\n          }\n        }\n\n        // Rebuild styles if the header height has changed\n        //   The header height is used in body/viewport calculations and those are then used in other styles so we need it to be available\n        if (buildStyles && rebuildStyles) {\n          self.buildStyles();\n        }\n\n        p.resolve();\n      });\n    }\n    else {\n      // Timeout still needs to be here to trigger digest after styles have been rebuilt\n      $timeout(function() {\n        p.resolve();\n      });\n    }\n\n    return p.promise;\n  };\n\n  function getPrevScrollValue(rowsAdded, prevScrollVal) {\n    return rowsAdded || prevScrollVal > 0 ? prevScrollVal : null;\n  }\n\n  /**\n   * @ngdoc function\n   * @name redrawInPlace\n   * @methodOf ui.grid.class:Grid\n   * @description Redraw the rows and columns based on our current scroll position\n   * @param {boolean} [rowsAdded] Optional to indicate rows are added and the scroll percentage must be recalculated\n   *\n   */\n  Grid.prototype.redrawInPlace = function redrawInPlace(rowsAdded) {\n    // gridUtil.logDebug('redrawInPlace');\n\n    var self = this;\n\n    for (var i in self.renderContainers) {\n      var container = self.renderContainers[i],\n        prevScrollTop = getPrevScrollValue(rowsAdded, container.prevScrollTop),\n        prevScrollLeft = getPrevScrollValue(rowsAdded, container.prevScrollLeft),\n        prevScrolltopPercentage = rowsAdded || prevScrollTop > 0 ? null : container.prevScrolltopPercentage;\n\n      // gridUtil.logDebug('redrawing container', i);\n\n      container.adjustRows(prevScrollTop, prevScrolltopPercentage);\n      container.adjustColumns(prevScrollLeft);\n    }\n  };\n\n    /**\n     * @ngdoc function\n     * @name hasLeftContainerColumns\n     * @methodOf ui.grid.class:Grid\n     * @description returns true if leftContainer has columns\n     */\n    Grid.prototype.hasLeftContainerColumns = function () {\n      return this.hasLeftContainer() && this.renderContainers.left.renderedColumns.length > 0;\n    };\n\n    /**\n     * @ngdoc function\n     * @name hasRightContainerColumns\n     * @methodOf ui.grid.class:Grid\n     * @description returns true if rightContainer has columns\n     */\n    Grid.prototype.hasRightContainerColumns = function () {\n      return this.hasRightContainer() && this.renderContainers.right.renderedColumns.length > 0;\n    };\n\n    // Turn the scroll position into a percentage and make it an argument for a scroll event\n    function getScrollPercentage(scrollPixels, scrollLength) {\n      var percentage = scrollPixels / scrollLength;\n\n      // if the percentage is greater than 1, set it to 1\n      return percentage <= 1 ? percentage : 1;\n    }\n\n    // Only returns the scroll Y position if the percentage is different from the previous\n    function getScrollY(scrollPixels, scrollLength, prevScrolltopPercentage) {\n      var scrollPercentage = getScrollPercentage(scrollPixels, scrollLength);\n\n      if (scrollPercentage !== prevScrolltopPercentage) {\n        return { percentage: getScrollPercentage(scrollPixels, scrollLength) };\n      }\n\n      return undefined;\n    }\n\n    // Only returns the scroll X position if the percentage is different from the previous\n    function getScrollX(horizScrollPixels, horizScrollLength, prevScrollleftPercentage) {\n      var horizPercentage = horizScrollPixels / horizScrollLength;\n      horizPercentage = (horizPercentage > 1) ? 1 : horizPercentage;\n\n      if (horizPercentage !== prevScrollleftPercentage) {\n        return { percentage: horizPercentage  };\n      }\n\n      return undefined;\n    }\n\n    /**\n     * @ngdoc method\n     * @methodOf  ui.grid.class:Grid\n     * @name scrollToIfNecessary\n     * @description Scrolls the grid to make a certain row and column combo visible,\n     *   in the case that it is not completely visible on the screen already.\n     * @param {GridRow} gridRow row to make visible\n     * @param {GridColumn} gridCol column to make visible\n     * @returns {promise} a promise that is resolved when scrolling is complete\n     */\n    Grid.prototype.scrollToIfNecessary = function (gridRow, gridCol) {\n      var self = this;\n\n      var scrollEvent = new ScrollEvent(self, 'uiGrid.scrollToIfNecessary');\n\n      // Alias the visible row and column caches\n      var visRowCache = self.renderContainers.body.visibleRowCache;\n      var visColCache = self.renderContainers.body.visibleColumnCache;\n\n      /*-- Get the top, left, right, and bottom \"scrolled\" edges of the grid --*/\n\n      // The top boundary is the current Y scroll position\n      var topBound = self.renderContainers.body.prevScrollTop;\n\n      // Don't the let top boundary be less than 0\n      topBound = (topBound < 0) ? 0 : topBound;\n\n      // The left boundary is the current X scroll position\n      var leftBound = self.renderContainers.body.prevScrollLeft;\n\n      // The bottom boundary is the current Y scroll position, plus the height of the grid, but minus the header height.\n      //   Basically this is the viewport height added on to the scroll position\n      var bottomBound = self.renderContainers.body.prevScrollTop + self.gridHeight - self.renderContainers.body.headerHeight - self.footerHeight -  self.scrollbarHeight;\n\n      // If there's a horizontal scrollbar, remove its height from the bottom boundary, otherwise we'll be letting it obscure rows\n      // if (self.horizontalScrollbarHeight) {\n      //   bottomBound = bottomBound - self.horizontalScrollbarHeight;\n      // }\n\n      // The right position is the current X scroll position minus the grid width\n      var rightBound = self.renderContainers.body.prevScrollLeft + Math.ceil(self.renderContainers.body.getViewportWidth());\n\n      // If there's a vertical scrollbar, subtract it from the right boundary or we'll allow it to obscure cells\n      // if (self.verticalScrollbarWidth) {\n      //   rightBound = rightBound - self.verticalScrollbarWidth;\n      // }\n\n      // We were given a row to scroll to\n      if (gridRow !== null) {\n        // This is the index of the row we want to scroll to, within the list of rows that can be visible\n        var seekRowIndex = visRowCache.indexOf(gridRow);\n\n        // Total vertical scroll length of the grid\n        var scrollLength = (self.renderContainers.body.getCanvasHeight() - self.renderContainers.body.getViewportHeight());\n\n        // Add the height of the native horizontal scrollbar to the scroll length, if it's there. Otherwise it will mask over the final row\n        // if (self.horizontalScrollbarHeight && self.horizontalScrollbarHeight > 0) {\n        //   scrollLength = scrollLength + self.horizontalScrollbarHeight;\n        // }\n\n        // This is the minimum amount of pixels we need to scroll vertical in order to see this row.\n        var pixelsToSeeRow = (seekRowIndex * self.options.rowHeight);\n\n        // Don't let the pixels required to see the row be less than zero\n        pixelsToSeeRow = (pixelsToSeeRow < 0) ? 0 : pixelsToSeeRow;\n\n        var scrollPixels;\n\n        // If the scroll position we need to see the row is LESS than the top boundary, i.e. obscured above the top of the self...\n        if (pixelsToSeeRow < Math.floor(topBound)) {\n          // Get the different between the top boundary and the required scroll position and subtract it from the current scroll position\\\n          //   to get the full position we need\n          scrollPixels = self.renderContainers.body.prevScrollTop - (topBound - pixelsToSeeRow);\n\n          // Since scrollIfNecessary is called multiple times when enableCellEditOnFocus is true we need to make sure the scrollbarWidth and\n          // footerHeight is accounted for to not cause a loop.\n          if (gridCol && gridCol.colDef && gridCol.colDef.enableCellEditOnFocus) {\n            scrollPixels = scrollPixels - self.footerHeight - self.scrollbarHeight;\n          }\n\n          scrollEvent.y = getScrollY(scrollPixels, scrollLength, self.renderContainers.body.prevScrolltopPercentage);\n        }\n        // Otherwise if the scroll position we need to see the row is MORE than the bottom boundary, i.e. obscured below the bottom of the self...\n        // add the height of one row since scrollPixels points to the top pixel of the row\n        else if ((pixelsToSeeRow + self.options.rowHeight) > Math.ceil(bottomBound)) {\n          // Get the different between the bottom boundary and the required scroll position and add it to the current scroll position\n          // plus the height of one row since scrollPixels points to the top pixel of the row\n          // to get the full position we need\n          scrollPixels = (pixelsToSeeRow + self.options.rowHeight) - bottomBound + self.renderContainers.body.prevScrollTop;\n\n          // Scroll to full position\n          scrollEvent.y = getScrollY(scrollPixels, scrollLength, self.renderContainers.body.prevScrolltopPercentage);\n        }\n      }\n\n      // We were given a column to scroll to\n      if (gridCol !== null) {\n        // This is the index of the column we want to scroll to, within the list of columns that can be visible\n        var seekColumnIndex = visColCache.indexOf(gridCol);\n\n        // Total horizontal scroll length of the grid\n        var horizScrollLength = (self.renderContainers.body.getCanvasWidth() - self.renderContainers.body.getViewportWidth());\n\n        // This is the minimum amount of pixels we need to scroll horizontal in order to see this column\n        var columnLeftEdge = 0;\n        for (var i = 0; i < seekColumnIndex; i++) {\n          var col = visColCache[i];\n          columnLeftEdge += col.drawnWidth;\n        }\n        columnLeftEdge = (columnLeftEdge < 0) ? 0 : columnLeftEdge;\n\n        var columnRightEdge = columnLeftEdge + gridCol.drawnWidth;\n\n        // Don't let the pixels required to see the column be less than zero\n        columnRightEdge = (columnRightEdge < 0) ? 0 : columnRightEdge;\n\n        var horizScrollPixels;\n\n        // If the scroll position we need to see the column is LESS than the left boundary, i.e. obscured before the left of the self...\n        if (columnLeftEdge < leftBound) {\n          // Get the different between the left boundary and the required scroll position and subtract it from the current scroll position\\\n          //   to get the full position we need\n          horizScrollPixels = self.renderContainers.body.prevScrollLeft - (leftBound - columnLeftEdge);\n\n          // Turn the scroll position into a percentage and make it an argument for a scroll event\n          scrollEvent.x = getScrollX(horizScrollPixels, horizScrollLength, self.renderContainers.body.prevScrollleftPercentage);\n        }\n        // Otherwise if the scroll position we need to see the column is MORE than the right boundary, i.e. obscured after the right of the self...\n        else if (columnRightEdge > rightBound) {\n          // Get the different between the right boundary and the required scroll position and add it to the current scroll position\n          //   to get the full position we need\n          horizScrollPixels = columnRightEdge - rightBound + self.renderContainers.body.prevScrollLeft;\n\n          // Turn the scroll position into a percentage and make it an argument for a scroll event\n          scrollEvent.x = getScrollX(horizScrollPixels, horizScrollLength, self.renderContainers.body.prevScrollleftPercentage);\n        }\n      }\n\n      var deferred = $q.defer();\n\n      // If we need to scroll on either the x or y axes, fire a scroll event\n      if (scrollEvent.y || scrollEvent.x) {\n        scrollEvent.withDelay = false;\n        self.scrollContainers('',scrollEvent);\n        var dereg = self.api.core.on.scrollEnd(null,function() {\n          deferred.resolve(scrollEvent);\n          dereg();\n        });\n      }\n      else {\n        deferred.resolve();\n      }\n\n      return deferred.promise;\n    };\n\n    /**\n     * @ngdoc method\n     * @methodOf ui.grid.class:Grid\n     * @name scrollTo\n     * @description Scroll the grid such that the specified\n     * row and column is in view\n     * @param {object} rowEntity gridOptions.data[] array instance to make visible\n     * @param {object} colDef to make visible\n     * @returns {promise} a promise that is resolved after any scrolling is finished\n     */\n    Grid.prototype.scrollTo = function (rowEntity, colDef) {\n      var gridRow = null, gridCol = null;\n\n      if (rowEntity !== null && typeof(rowEntity) !== 'undefined' ) {\n        gridRow = this.getRow(rowEntity);\n      }\n\n      if (colDef !== null && typeof(colDef) !== 'undefined' ) {\n        gridCol = this.getColumn(colDef.name ? colDef.name : colDef.field);\n      }\n      return this.scrollToIfNecessary(gridRow, gridCol);\n    };\n\n  /**\n   * @ngdoc function\n   * @name clearAllFilters\n   * @methodOf ui.grid.class:Grid\n   * @description Clears all filters and optionally refreshes the visible rows.\n   * @param {object} refreshRows Defaults to true.\n   * @param {object} clearConditions Defaults to false.\n   * @param {object} clearFlags Defaults to false.\n   * @returns {promise} If `refreshRows` is true, returns a promise of the rows refreshing.\n   */\n  Grid.prototype.clearAllFilters = function clearAllFilters(refreshRows, clearConditions, clearFlags) {\n    // Default `refreshRows` to true because it will be the most commonly desired behaviour.\n    if (refreshRows === undefined) {\n      refreshRows = true;\n    }\n    if (clearConditions === undefined) {\n      clearConditions = false;\n    }\n    if (clearFlags === undefined) {\n      clearFlags = false;\n    }\n\n    this.columns.forEach(function(column) {\n      column.filters.forEach(function(filter) {\n        filter.term = undefined;\n\n        if (clearConditions) {\n          filter.condition = undefined;\n        }\n\n        if (clearFlags) {\n          filter.flags = undefined;\n        }\n      });\n    });\n\n    if (refreshRows) {\n      return this.refreshRows();\n    }\n  };\n\n\n      // Blatantly stolen from Angular as it isn't exposed (yet? 2.0?)\n  function RowHashMap() {}\n\n  RowHashMap.prototype = {\n    /**\n     * Store key value pair\n     * @param key key to store can be any type\n     * @param value value to store can be any type\n     */\n    put: function(key, value) {\n      this[this.grid.options.rowIdentity(key)] = value;\n    },\n\n    /**\n     * @param key\n     * @returns {Object} the value for the key\n     */\n    get: function(key) {\n      return this[this.grid.options.rowIdentity(key)];\n    },\n\n    /**\n     * Remove the key/value pair\n     * @param key\n     */\n    remove: function(key) {\n      var value = this[key = this.grid.options.rowIdentity(key)];\n      delete this[key];\n      return value;\n    }\n  };\n\n  return Grid;\n}]);\n})();\n\n(function () {\n\n  angular.module('ui.grid')\n    .factory('GridApi', ['$q', '$rootScope', 'gridUtil', 'uiGridConstants', 'GridRow',\n      function ($q, $rootScope, gridUtil, uiGridConstants, GridRow) {\n        /**\n         * @ngdoc function\n         * @name ui.grid.class:GridApi\n         * @description GridApi provides the ability to register public methods events inside the grid and allow\n         * for other components to use the api via featureName.raise.methodName and featureName.on.eventName(function(args) {}.\n         * <br/>\n         * To listen to events, you must add a callback to gridOptions.onRegisterApi\n         * <pre>\n         *   $scope.gridOptions.onRegisterApi = function(gridApi) {\n         *      gridApi.cellNav.on.navigate($scope,function(newRowCol, oldRowCol) {\n         *          $log.log('navigation event');\n         *      });\n         *   };\n         * </pre>\n         * @param {object} grid grid that owns api\n         */\n        var GridApi = function GridApi(grid) {\n          this.grid = grid;\n          this.listeners = [];\n\n          /**\n           * @ngdoc function\n           * @name renderingComplete\n           * @methodOf  ui.grid.api:PublicApi\n           * @description Rendering is complete, called at the same\n           * time as `onRegisterApi`, but provides a way to obtain\n           * that same event within features without stopping end\n           * users from getting at the onRegisterApi method.\n           *\n           * Included in gridApi so that it's always there - otherwise\n           * there is still a timing problem with when a feature can\n           * call this.\n           *\n           * @param {GridApi} gridApi the grid api, as normally\n           * returned in the onRegisterApi method\n           *\n           * @example\n           * <pre>\n           *      gridApi.core.on.renderingComplete( grid );\n           * </pre>\n           */\n          this.registerEvent( 'core', 'renderingComplete' );\n\n          /**\n           * @ngdoc event\n           * @name filterChanged\n           * @eventOf  ui.grid.api:PublicApi\n           * @description  is raised after the filter is changed.  The nature\n           * of the watch expression doesn't allow notification of what changed,\n           * so the receiver of this event will need to re-extract the filter\n           * conditions from the columns.\n           *\n           */\n          this.registerEvent( 'core', 'filterChanged' );\n\n          /**\n           * @ngdoc function\n           * @name setRowInvisible\n           * @methodOf  ui.grid.api:PublicApi\n           * @description Sets an override on the row to make it always invisible,\n           * which will override any filtering or other visibility calculations.\n           * If the row is currently visible then sets it to invisible and calls\n           * both grid refresh and emits the rowsVisibleChanged event\n           * @param {GridRow} row the row we want to make invisible\n           */\n          this.registerMethod( 'core', 'setRowInvisible', GridRow.prototype.setRowInvisible );\n\n          /**\n           * @ngdoc function\n           * @name clearRowInvisible\n           * @methodOf  ui.grid.api:PublicApi\n           * @description Clears any override on visibility for the row so that it returns to\n           * using normal filtering and other visibility calculations.\n           * If the row is currently invisible then sets it to visible and calls\n           * both grid refresh and emits the rowsVisibleChanged event\n           * TODO: if a filter is active then we can't just set it to visible?\n           * @param {GridRow} row the row we want to make visible\n           */\n          this.registerMethod( 'core', 'clearRowInvisible', GridRow.prototype.clearRowInvisible );\n\n          /**\n           * @ngdoc function\n           * @name getVisibleRows\n           * @methodOf  ui.grid.api:PublicApi\n           * @description Returns all visible rows\n           * @param {Grid} grid the grid you want to get visible rows from\n           * @returns {array} an array of gridRow\n           */\n          this.registerMethod( 'core', 'getVisibleRows', this.grid.getVisibleRows );\n\n          /**\n           * @ngdoc event\n           * @name rowsVisibleChanged\n           * @eventOf  ui.grid.api:PublicApi\n           * @description  is raised after the rows that are visible\n           * change.  The filtering is zero-based, so it isn't possible\n           * to say which rows changed (unlike in the selection feature).\n           * We can plausibly know which row was changed when setRowInvisible\n           * is called, but in that situation the user already knows which row\n           * they changed.  When a filter runs we don't know what changed,\n           * and that is the one that would have been useful.\n           *\n           */\n          this.registerEvent( 'core', 'rowsVisibleChanged' );\n\n          /**\n           * @ngdoc event\n           * @name rowsRendered\n           * @eventOf  ui.grid.api:PublicApi\n           * @description  is raised after the cache of visible rows is changed.\n           */\n          this.registerEvent( 'core', 'rowsRendered' );\n\n\n          /**\n           * @ngdoc event\n           * @name scrollBegin\n           * @eventOf  ui.grid.api:PublicApi\n           * @description  is raised when scroll begins.  Is throttled, so won't be raised too frequently\n           */\n          this.registerEvent( 'core', 'scrollBegin' );\n\n          /**\n           * @ngdoc event\n           * @name scrollEnd\n           * @eventOf  ui.grid.api:PublicApi\n           * @description  is raised when scroll has finished.  Is throttled, so won't be raised too frequently\n           */\n          this.registerEvent( 'core', 'scrollEnd' );\n\n          /**\n           * @ngdoc event\n           * @name canvasHeightChanged\n           * @eventOf  ui.grid.api:PublicApi\n           * @description  is raised when the canvas height has changed\n           * <br/>\n           * arguments: oldHeight, newHeight\n           */\n          this.registerEvent( 'core', 'canvasHeightChanged');\n\n          /**\n           * @ngdoc event\n           * @name gridDimensionChanged\n           * @eventOf  ui.grid.api:PublicApi\n           * @description  is raised when the grid dimensions have changed (when autoResize is on)\n           * <br/>\n           * arguments: oldGridHeight, oldGridWidth, newGridHeight, newGridWidth\n           */\n          this.registerEvent( 'core', 'gridDimensionChanged');\n        };\n\n        /**\n         * @ngdoc function\n         * @name ui.grid.class:suppressEvents\n         * @methodOf ui.grid.class:GridApi\n         * @description Used to execute a function while disabling the specified event listeners.\n         * Disables the listenerFunctions, executes the callbackFn, and then enables\n         * the listenerFunctions again\n         * @param {object} listenerFuncs listenerFunc or array of listenerFuncs to suppress. These must be the same\n         * functions that were used in the .on.eventName method\n         * @param {object} callBackFn function to execute\n         * @example\n         * <pre>\n         *    var navigate = function (newRowCol, oldRowCol) {\n         *       //do something on navigate\n         *    }\n         *\n         *    gridApi.cellNav.on.navigate(scope,navigate);\n         *\n         *\n         *    //call the scrollTo event and suppress our navigate listener\n         *    //scrollTo will still raise the event for other listeners\n         *    gridApi.suppressEvents(navigate, function() {\n         *       gridApi.cellNav.scrollTo(aRow, aCol);\n         *    });\n         *\n         * </pre>\n         */\n        GridApi.prototype.suppressEvents = function (listenerFuncs, callBackFn) {\n          var self = this,\n            listeners = angular.isArray(listenerFuncs) ? listenerFuncs : [listenerFuncs];\n\n          // find all registered listeners\n          var foundListeners = self.listeners.filter(function(listener) {\n            return listeners.some(function(l) {\n              return listener.handler === l;\n            });\n          });\n\n          // deregister all the listeners\n          foundListeners.forEach(function(l) {\n            l.dereg();\n          });\n\n          callBackFn();\n\n          // reregister all the listeners\n          foundListeners.forEach(function(l) {\n              l.dereg = registerEventWithAngular(l.eventId, l.handler, self.grid, l._this);\n          });\n        };\n\n        /**\n         * @ngdoc function\n         * @name registerEvent\n         * @methodOf ui.grid.class:GridApi\n         * @description Registers a new event for the given feature.  The event will get a\n         * .raise and .on prepended to it\n         * <br>\n         * .raise.eventName() - takes no arguments\n         * <br/>\n         * <br/>\n         * .on.eventName(scope, callBackFn, _this)\n         * <br/>\n         * scope - a scope reference to add a deregister call to the scopes .$on('destroy').  Scope is optional and can be a null value,\n         * but in this case you must deregister it yourself via the returned deregister function\n         * <br/>\n         * callBackFn - The function to call\n         * <br/>\n         * _this - optional this context variable for callbackFn. If omitted, grid.api will be used for the context\n         * <br/>\n         * .on.eventName returns a dereg funtion that will remove the listener.  It's not necessary to use it as the listener\n         * will be removed when the scope is destroyed.\n         * @param {string} featureName name of the feature that raises the event\n         * @param {string} eventName  name of the event\n         */\n        GridApi.prototype.registerEvent = function (featureName, eventName) {\n          var self = this;\n          if (!self[featureName]) {\n            self[featureName] = {};\n          }\n\n          var feature = self[featureName];\n          if (!feature.on) {\n            feature.on = {};\n            feature.raise = {};\n          }\n\n          var eventId = self.grid.id + featureName + eventName;\n\n          // gridUtil.logDebug('Creating raise event method ' + featureName + '.raise.' + eventName);\n          feature.raise[eventName] = function () {\n            $rootScope.$emit.apply($rootScope, [eventId].concat(Array.prototype.slice.call(arguments)));\n          };\n\n          // gridUtil.logDebug('Creating on event method ' + featureName + '.on.' + eventName);\n          feature.on[eventName] = function (scope, handler, _this) {\n            if ( scope !== null && typeof(scope.$on) === 'undefined' ) {\n              gridUtil.logError('asked to listen on ' + featureName + '.on.' + eventName + ' but scope wasn\\'t passed in the input parameters.  It is legitimate to pass null, but you\\'ve passed something else, so you probably forgot to provide scope rather than did it deliberately, not registering');\n              return;\n            }\n            var deregAngularOn = registerEventWithAngular(eventId, handler, self.grid, _this);\n\n            // track our listener so we can turn off and on\n            var listener = {handler: handler, dereg: deregAngularOn, eventId: eventId, scope: scope, _this: _this};\n\n            self.listeners.push(listener);\n\n            var removeListener = function() {\n              listener.dereg();\n              var index = self.listeners.indexOf(listener);\n              self.listeners.splice(index,1);\n            };\n\n            // destroy tracking when scope is destroyed\n            if (scope) {\n              scope.$on('$destroy', function() {\n                removeListener();\n              });\n            }\n\n            return removeListener;\n          };\n        };\n\n        function registerEventWithAngular(eventId, handler, grid, _this) {\n          return $rootScope.$on(eventId, function (event) {\n            var args = Array.prototype.slice.call(arguments);\n            args.splice(0, 1); // remove evt argument\n            handler.apply(_this ? _this : grid.api, args);\n          });\n        }\n\n        /**\n         * @ngdoc function\n         * @name registerEventsFromObject\n         * @methodOf ui.grid.class:GridApi\n         * @description Registers features and events from a simple objectMap.\n         * eventObjectMap must be in this format (multiple features allowed)\n         * <pre>\n         * {featureName:\n         *        {\n         *          eventNameOne:function(args) {},\n         *          eventNameTwo:function(args) {}\n         *        }\n         *  }\n         * </pre>\n         * @param {object} eventObjectMap map of feature/event names\n         */\n        GridApi.prototype.registerEventsFromObject = function (eventObjectMap) {\n          var self = this,\n            features = [];\n\n          angular.forEach(eventObjectMap, function (featProp, featPropName) {\n            var feature = {name: featPropName, events: []};\n            angular.forEach(featProp, function (prop, propName) {\n              feature.events.push(propName);\n            });\n            features.push(feature);\n          });\n\n          features.forEach(function (feature) {\n            feature.events.forEach(function (event) {\n              self.registerEvent(feature.name, event);\n            });\n          });\n        };\n\n        /**\n         * @ngdoc function\n         * @name registerMethod\n         * @methodOf ui.grid.class:GridApi\n         * @description Registers a new event for the given feature\n         * @param {string} featureName name of the feature\n         * @param {string} methodName  name of the method\n         * @param {object} callBackFn function to execute\n         * @param {object} _this binds callBackFn 'this' to _this.  Defaults to gridApi.grid\n         */\n        GridApi.prototype.registerMethod = function (featureName, methodName, callBackFn, _this) {\n          if (!this[featureName]) {\n            this[featureName] = {};\n          }\n\n          var feature = this[featureName];\n\n          feature[methodName] = gridUtil.createBoundedWrapper(_this || this.grid, callBackFn);\n        };\n\n        /**\n         * @ngdoc function\n         * @name registerMethodsFromObject\n         * @methodOf ui.grid.class:GridApi\n         * @description Registers features and methods from a simple objectMap.\n         * eventObjectMap must be in this format (multiple features allowed)\n         * <br>\n         * {featureName:\n         *        {\n         *          methodNameOne:function(args) {},\n         *          methodNameTwo:function(args) {}\n         *        }\n         * @param {object} methodMap map of feature/event names\n         * @param {object} _this binds this to _this for all functions.  Defaults to gridApi.grid\n         */\n        GridApi.prototype.registerMethodsFromObject = function (methodMap, _this) {\n          var self = this;\n          var features = [];\n          angular.forEach(methodMap, function (featProp, featPropName) {\n            var feature = {name: featPropName, methods: []};\n            angular.forEach(featProp, function (prop, propName) {\n              feature.methods.push({name: propName, fn: prop});\n            });\n            features.push(feature);\n          });\n\n          features.forEach(function (feature) {\n            feature.methods.forEach(function (method) {\n              self.registerMethod(feature.name, method.name, method.fn, _this);\n            });\n          });\n\n        };\n\n        return GridApi;\n      }]);\n})();\n\n(function() {\n\nangular.module('ui.grid')\n.factory('GridColumn', ['gridUtil', 'uiGridConstants', 'i18nService', function(gridUtil, uiGridConstants, i18nService) {\n\n  /**\n   * ******************************************************************************************\n   * PaulL1: Ugly hack here in documentation.  These properties are clearly properties of GridColumn,\n   * and need to be noted as such for those extending and building ui-grid itself.\n   * However, from an end-developer perspective, they interact with all these through columnDefs,\n   * and they really need to be documented there.  I feel like they're relatively static, and\n   * I can't find an elegant way for ngDoc to reference to both....so I've duplicated each\n   * comment block.  Ugh.\n   *\n   */\n\n  /**\n   * @ngdoc property\n   * @name name\n   * @propertyOf ui.grid.class:GridColumn\n   * @description (mandatory) Each column should have a name, although for backward\n   * compatibility with 2.x name can be omitted if field is present.\n   *\n   * Important - This must be unique to each column on a web page since it can\n   * be used as a key for retrieving information such as custom sort algorithms.\n   *\n   */\n\n  /**\n   * @ngdoc property\n   * @name name\n   * @propertyOf ui.grid.class:GridOptions.columnDef\n   * @description (mandatory) Each column should have a name, although for backward\n   * compatibility with 2.x name can be omitted if field is present.\n   *\n   * Important - This must be unique to each column on a web page since it can\n   * be used as a key for retrieving information such as custom sort algorithms.\n   *\n   */\n\n  /**\n   * @ngdoc property\n   * @name displayName\n   * @propertyOf ui.grid.class:GridColumn\n   * @description Column name that will be shown in the header. If displayName is not\n   * provided then one is generated using the name.\n   *\n   */\n\n  /**\n   * @ngdoc property\n   * @name displayName\n   * @propertyOf ui.grid.class:GridOptions.columnDef\n   * @description Column name that will be shown in the header. If displayName is not\n   * provided then one is generated using the name.\n   *\n   */\n\n  /**\n   * @ngdoc property\n   * @name field\n   * @propertyOf ui.grid.class:GridColumn\n   * @description field must be provided if you wish to bind to a\n   * property in the data source.  Should be an angular expression that evaluates against grid.options.data\n   * array element.  Can be a complex expression: <code>employee.address.city</code>, or can be a function: <code>employee.getFullAddress()</code>.\n   * See the angular docs on binding expressions.\n   *\n   */\n\n  /**\n   * @ngdoc property\n   * @name field\n   * @propertyOf ui.grid.class:GridOptions.columnDef\n   * @description field must be provided if you wish to bind to a\n   * property in the data source.  Should be an angular expression that evaluates against grid.options.data\n   * array element.  Can be a complex expression: <code>employee.address.city</code>, or can be a function: <code>employee.getFullAddress()</code>.    * See the angular docs on binding expressions.    *\n   */\n\n  /**\n   * @ngdoc property\n   * @name filter\n   * @propertyOf ui.grid.class:GridColumn\n   * @description Filter on this column.\n   *\n   * Available built-in conditions and types are listed under {@link jui.grid.service:uiGridConstants#properties_filter uiGridOptions.filter}\n   * @example\n   * <pre>{ term: 'text', condition: uiGridConstants.filter.STARTS_WITH, placeholder: 'type to filter...', ariaLabel: 'Filter for text', flags: { caseSensitive: false }, type: uiGridConstants.filter.SELECT, [ { value: 1, label: 'male' }, { value: 2, label: 'female' } ] }</pre>\n   *\n   */\n\n  /**\n   * @ngdoc property\n   * @name extraStyle\n   * @propertyOf ui.grid.class:GridColumn\n   * @description additional on this column.\n   * @example\n   * <pre>{extraStyle: {display: 'table-cell'}}</pre>\n   *\n   */\n\n  /**\n   * @ngdoc object\n   * @name ui.grid.class:GridColumn\n   * @description Represents the viewModel for each column.  Any state or methods needed for a Grid Column\n   * are defined on this prototype\n   * @param {ColumnDef} colDef the column def to associate with this column\n   * @param {number} uid the unique and immutable uid we'd like to allocate to this column\n   * @param {Grid} grid the grid we'd like to create this column in\n   */\n  function GridColumn(colDef, uid, grid) {\n    var self = this;\n\n    self.grid = grid;\n    self.uid = uid;\n\n    self.updateColumnDef(colDef, true);\n\n    self.aggregationValue = undefined;\n\n    // The footer cell registers to listen for the rowsRendered event, and calls this.  Needed to be\n    // in something with a scope so that the dereg would get called\n    self.updateAggregationValue = function() {\n\n     // gridUtil.logDebug('getAggregationValue for Column ' + self.colDef.name);\n\n      /**\n       * @ngdoc property\n       * @name aggregationType\n       * @propertyOf ui.grid.class:GridOptions.columnDef\n       * @description The aggregation that you'd like to show in the columnFooter for this\n       * column.  Valid values are in\n       * {@link ui.grid.service:uiGridConstants#properties_aggregationTypes uiGridConstants.aggregationTypes},\n       * and currently include `uiGridConstants.aggregationTypes.count`,\n       * `uiGridConstants.aggregationTypes.sum`, `uiGridConstants.aggregationTypes.avg`, `uiGridConstants.aggregationTypes.min`,\n       * `uiGridConstants.aggregationTypes.max`.\n       *\n       * You can also provide a function as the aggregation type, in this case your function needs to accept the full\n       * set of visible rows, and return a value that should be shown\n       */\n      if (!self.aggregationType) {\n        self.aggregationValue = undefined;\n        return;\n      }\n\n      var result = 0;\n      var visibleRows = self.grid.getVisibleRows();\n\n      var cellValues = function() {\n        var values = [];\n        visibleRows.forEach(function (row) {\n          var cellValue = self.grid.getCellValue(row, self);\n          var cellNumber = Number(cellValue);\n          if (!isNaN(cellNumber)) {\n            values.push(cellNumber);\n          }\n        });\n        return values;\n      };\n\n      if (angular.isFunction(self.aggregationType)) {\n        self.aggregationValue = self.aggregationType(visibleRows, self);\n      }\n      else if (self.aggregationType === uiGridConstants.aggregationTypes.count) {\n        self.aggregationValue = self.grid.getVisibleRowCount();\n      }\n      else if (self.aggregationType === uiGridConstants.aggregationTypes.sum) {\n        cellValues().forEach(function (value) {\n          result += value;\n        });\n        self.aggregationValue = result;\n      }\n      else if (self.aggregationType === uiGridConstants.aggregationTypes.avg) {\n        cellValues().forEach(function (value) {\n          result += value;\n        });\n        result = result / cellValues().length;\n        self.aggregationValue = result;\n      }\n      else if (self.aggregationType === uiGridConstants.aggregationTypes.min) {\n        self.aggregationValue = Math.min.apply(null, cellValues());\n      }\n      else if (self.aggregationType === uiGridConstants.aggregationTypes.max) {\n        self.aggregationValue = Math.max.apply(null, cellValues());\n      }\n      else {\n        self.aggregationValue = '\\u00A0';\n      }\n    };\n\n//     var throttledUpdateAggregationValue = gridUtil.throttle(updateAggregationValue, self.grid.options.aggregationCalcThrottle, { trailing: true, context: self.name });\n\n    /**\n     * @ngdoc function\n     * @name getAggregationValue\n     * @methodOf ui.grid.class:GridColumn\n     * @description gets the aggregation value based on the aggregation type for this column.\n     * Debounced using scrollDebounce option setting\n     */\n    this.getAggregationValue =  function() {\n//      if (!self.grid.isScrollingVertically && !self.grid.isScrollingHorizontally) {\n//        throttledUpdateAggregationValue();\n//      }\n\n      return self.aggregationValue;\n    };\n  }\n\n  /**\n   * @ngdoc function\n   * @name hideColumn\n   * @methodOf ui.grid.class:GridColumn\n   * @description Hides the column by setting colDef.visible = false\n   */\n  GridColumn.prototype.hideColumn = function() {\n    this.colDef.visible = false;\n  };\n\n\n  /**\n   * @ngdoc method\n   * @methodOf ui.grid.class:GridColumn\n   * @name setPropertyOrDefault\n   * @description Sets a property on the column using the passed in columnDef, and\n   * setting the defaultValue if the value cannot be found on the colDef\n   * @param {GridColumn} colDef the column def to look in for the property value\n   * @param {string} propName the property name we'd like to set\n   * @param {object} defaultValue the value to use if the colDef doesn't provide the setting\n   */\n  GridColumn.prototype.setPropertyOrDefault = function (colDef, propName, defaultValue) {\n    var self = this;\n\n    // Use the column definition filter if we were passed it\n    if (typeof(colDef[propName]) !== 'undefined' && colDef[propName]) {\n      self[propName] = colDef[propName];\n    }\n    // Otherwise use our own if it's set\n    else if (typeof(self[propName]) !== 'undefined') {\n      self[propName] = self[propName];\n    }\n    // Default to empty object for the filter\n    else {\n      self[propName] = defaultValue ? defaultValue : {};\n    }\n  };\n\n\n\n  /**\n   * @ngdoc property\n   * @name width\n   * @propertyOf ui.grid.class:GridOptions.columnDef\n   * @description sets the column width.  Can be either\n   * a number or a percentage, or an * for auto.\n   * @example\n   * <pre>  $scope.gridOptions.columnDefs = [ { field: 'field1', width: 100},\n   *                                          { field: 'field2', width: '20%'},\n   *                                          { field: 'field3', width: '*' }]; </pre>\n   *\n   */\n\n  /**\n   * @ngdoc property\n   * @name allowFloatWidth\n   * @propertyOf ui.grid.class:GridOptions.columnDef\n   * @description Allows float number in column width calculation\n   * @example\n   * <pre>  $scope.gridOptions.columnDefs = [ { field: 'field1', width: 50.5, allowFloatWidth: true},\n   *                                          { field: 'field2', width: '20%', allowFloatWidth: true},\n   *                                          { field: 'field3', width: '*', allowFloatWidth: true }]; </pre>\n   *\n   */\n\n  /**\n   * @ngdoc property\n   * @name minWidth\n   * @propertyOf ui.grid.class:GridOptions.columnDef\n   * @description Sets the minimum column width.  Should be a number.\n   * Defaults to gridOptions.minimumColumnSize if minWidth is not provided.\n   * @example\n   * <pre>  $scope.gridOptions.columnDefs = [ { field: 'field1', minWidth: 100}]; </pre>\n   *\n   */\n\n  /**\n   * @ngdoc property\n   * @name maxWidth\n   * @propertyOf ui.grid.class:GridOptions.columnDef\n   * @description sets the maximum column width.  Should be a number.\n   * @example\n   * <pre>  $scope.gridOptions.columnDefs = [ { field: 'field1', maxWidth: 100}]; </pre>\n   *\n   */\n\n  /**\n   * @ngdoc property\n   * @name visible\n   * @propertyOf ui.grid.class:GridOptions.columnDef\n   * @description sets whether or not the column is visible\n   * </br>Default is true\n   * @example\n   * <pre>  $scope.gridOptions.columnDefs = [\n   *     { field: 'field1', visible: true},\n   *     { field: 'field2', visible: false }\n   *   ]; </pre>\n   *\n   */\n\n /**\n  * @ngdoc property\n  * @name sort\n  * @propertyOf ui.grid.class:GridOptions.columnDef\n  * @description An object of sort information, attributes are:\n  *\n  * - direction: values are {@link ui.grid.service:uiGridConstants#properties_ASC uiGridConstants.ASC}\n  *  or {@link ui.grid.service:uiGridConstants#properties_DESC uiGridConstants.DESC}\n  * - ignoreSort: if set to true this sort is ignored (used by tree to manipulate the sort functionality)\n  * - priority: says what order to sort the columns in (lower priority gets sorted first). Starts from 0.\n  * @example\n  * <pre>\n  *   $scope.gridOptions.columnDefs = [{\n  *     field: 'field1',\n  *     sort: {\n  *       direction: uiGridConstants.ASC,\n  *       ignoreSort: true,\n  *       priority: 0\n  *      }\n  *   }];\n  * </pre>\n  */\n\n\n  /**\n   * @ngdoc property\n   * @name sortingAlgorithm\n   * @propertyOf ui.grid.class:GridOptions.columnDef\n   * @description Algorithm to use for sorting this column. Takes 'a' and 'b' parameters\n   * like any normal sorting function with additional 'rowA', 'rowB', and 'direction' parameters\n   * that are the row objects and the current direction of the sort respectively.\n   *\n   */\n\n   /**\n    * @ngdoc property\n    * @name defaultSort\n    * @propertyOf ui.grid.class:GridOptions.columnDef\n    * @description An object of sort information, provides a hidden default ordering of the data\n    * when no user sorts are applied, or when a user-provided sort deems two rows to be equal.\n    *\n    * May be combined with a regular {@link ui.grid.class:GridOptions.columnDef#properties_sort columnDef.sort}\n    * to explicitly sort by that column by default.\n    *\n    * Shares the same object format as {@link ui.grid.class:GridOptions.columnDef#properties_sort columnDef.sort}.\n    *\n    * Note that a defaultSort can never take priority over an explicit sort.\n    * @example\n    * <pre>\n    *   $scope.gridOptions.columnDefs = [{\n    *     field: 'field1',\n    *     defaultSort: {\n    *       direction: uiGridConstants.ASC,\n    *       priority: 0\n    *      }\n    *   }];\n    * </pre>\n    */\n\n  /**\n   * @ngdoc array\n   * @name filters\n   * @propertyOf ui.grid.class:GridOptions.columnDef\n   * @description Specify multiple filter fields.\n   * @example\n   * <pre>$scope.gridOptions.columnDefs = [\n   *   {\n   *     field: 'field1', filters: [\n   *       {\n   *         term: 'aa',\n   *         condition: uiGridConstants.filter.STARTS_WITH,\n   *         placeholder: 'starts with...',\n   *         ariaLabel: 'Filter for field1',\n   *         flags: { caseSensitive: false },\n   *         type: uiGridConstants.filter.SELECT,\n   *         selectOptions: [ { value: 1, label: 'male' }, { value: 2, label: 'female' } ]\n   *       },\n   *       {\n   *         condition: uiGridConstants.filter.ENDS_WITH,\n   *         placeholder: 'ends with...'\n   *       }\n   *     ]\n   *   }\n   * ]; </pre>\n   *\n   *\n   */\n\n  /**\n   * @ngdoc array\n   * @name filters\n   * @propertyOf ui.grid.class:GridColumn\n   * @description Filters for this column. Includes 'term' property bound to filter input elements.\n   * @example\n   * <pre>[\n   *   {\n   *     term: 'foo', // ngModel for <input>\n   *     condition: uiGridConstants.filter.STARTS_WITH,\n   *     placeholder: 'starts with...',\n   *     ariaLabel: 'Filter for foo',\n   *     flags: { caseSensitive: false },\n   *     type: uiGridConstants.filter.SELECT,\n   *     selectOptions: [ { value: 1, label: 'male' }, { value: 2, label: 'female' } ]\n   *   },\n   *   {\n   *     term: 'baz',\n   *     condition: uiGridConstants.filter.ENDS_WITH,\n   *     placeholder: 'ends with...'\n   *   }\n   * ] </pre>\n   *\n   *\n   */\n\n  /**\n   * @ngdoc array\n   * @name menuItems\n   * @propertyOf ui.grid.class:GridOptions.columnDef\n   * @description used to add menu items to a column.  Refer to the tutorial on this\n   * functionality.  A number of settings are supported:\n   *\n   * - title: controls the title that is displayed in the menu\n   * - icon: the icon shown alongside that title\n   * - action: the method to call when the menu is clicked\n   * - shown: a function to evaluate to determine whether or not to show the item\n   * - active: a function to evaluate to determine whether or not the item is currently selected\n   * - context: context to pass to the action function, available in this.context in your handler\n   * - leaveOpen: if set to true, the menu should stay open after the action, defaults to false\n   * @example\n   * <pre>  $scope.gridOptions.columnDefs = [\n   *   { field: 'field1', menuItems: [\n   *     {\n   *       title: 'Outer Scope Alert',\n   *       icon: 'ui-grid-icon-info-circled',\n   *       action: function($event) {\n   *         this.context.blargh(); // $scope.blargh() would work too, this is just an example\n   *       },\n   *       shown: function() { return true; },\n   *       active: function() { return true; },\n   *       context: $scope\n   *     },\n   *     {\n   *       title: 'Grid ID',\n   *       action: function() {\n   *         alert('Grid ID: ' + this.grid.id);\n   *       }\n   *     }\n   *   ] }]; </pre>\n   *\n   */\n\n  // Use colDef.displayName as long as it's not undefined, otherwise default to the field name\n  function getDisplayName(colDef) {\n    return (colDef.displayName === undefined)\n      ? gridUtil.readableColumnName(colDef.name)\n      : colDef.displayName;\n  }\n\n  /**\n   * @ngdoc method\n   * @methodOf ui.grid.class:GridColumn\n   * @name updateColumnDef\n   * @description Moves settings from the columnDef down onto the column,\n   * and sets properties as appropriate\n   * @param {GridColumn} colDef the column def to look in for the property value\n   * @param {boolean} isNew whether the column is being newly created, if not\n   * we're updating an existing column, and some items such as the sort shouldn't\n   * be copied down\n   */\n  GridColumn.prototype.updateColumnDef = function(colDef, isNew) {\n    var self = this;\n\n    self.colDef = colDef;\n\n    if (colDef.name === undefined) {\n      throw new Error('colDef.name is required for column at index ' + self.grid.options.columnDefs.indexOf(colDef));\n    }\n\n    self.displayName = getDisplayName(colDef);\n\n    if (!angular.isNumber(self.width) || !self.hasCustomWidth || colDef.allowCustomWidthOverride) {\n      var colDefWidth = colDef.width;\n      var parseErrorMsg = \"Cannot parse column width '\" + colDefWidth + \"' for column named '\" + colDef.name + \"'\";\n      self.hasCustomWidth = false;\n\n      if (!angular.isString(colDefWidth) && !angular.isNumber(colDefWidth)) {\n        self.width = '*';\n      } else if (angular.isString(colDefWidth)) {\n        // See if it ends with a percent\n        if (gridUtil.endsWith(colDefWidth, '%')) {\n          // If so we should be able to parse the non-percent-sign part to a number\n          var percentStr = colDefWidth.replace(/%/g, '');\n          var percent = parseInt(percentStr, 10);\n          if (isNaN(percent)) {\n            throw new Error(parseErrorMsg);\n          }\n          self.width = colDefWidth;\n        }\n        // And see if it's a number string\n        else if (colDefWidth.match(/^(\\d+)$/)) {\n          self.width = parseInt(colDefWidth.match(/^(\\d+)$/)[1], 10);\n        }\n        // Otherwise it should be a string of asterisks\n        else if (colDefWidth.match(/^\\*+$/)) {\n          self.width = colDefWidth;\n        }\n        // No idea, throw an Error\n        else {\n          throw new Error(parseErrorMsg);\n        }\n      }\n      // Is a number, use it as the width\n      else {\n        self.width = colDefWidth;\n      }\n    }\n\n    function isValidWidthValue(value) {\n      return angular.isString(value) || angular.isNumber(value);\n    }\n\n    ['minWidth', 'maxWidth'].forEach(function (name) {\n      var minOrMaxWidth = colDef[name];\n      var parseErrorMsg = \"Cannot parse column \" + name + \" '\" + minOrMaxWidth + \"' for column named '\" + colDef.name + \"'\";\n\n      // default minWidth to the minimumColumnSize\n      if (name === 'minWidth' && !isValidWidthValue(minOrMaxWidth) && angular.isDefined(self.grid.options.minimumColumnSize)) {\n        minOrMaxWidth = self.grid.options.minimumColumnSize;\n      }\n\n      if (!isValidWidthValue(minOrMaxWidth)) {\n        // Sets default minWidth and maxWidth values\n        self[name] = ((name === 'minWidth') ? 30 : 9000);\n      } else if (angular.isString(minOrMaxWidth)) {\n        if (minOrMaxWidth.match(/^(\\d+)$/)) {\n          self[name] = parseInt(minOrMaxWidth.match(/^(\\d+)$/)[1], 10);\n        } else {\n          throw new Error(parseErrorMsg);\n        }\n      } else {\n        self[name] = minOrMaxWidth;\n      }\n    });\n\n    // use field if it is defined; name if it is not\n    self.field = (colDef.field === undefined) ? colDef.name : colDef.field;\n\n    if ( typeof( self.field ) !== 'string' ) {\n      gridUtil.logError( 'Field is not a string, this is likely to break the code, Field is: ' + self.field );\n    }\n\n    self.name = colDef.name;\n    self.displayName = getDisplayName(colDef);\n\n    // self.originalIndex = index;\n\n    self.aggregationType = angular.isDefined(colDef.aggregationType) ? colDef.aggregationType : null;\n    self.footerCellTemplate = angular.isDefined(colDef.footerCellTemplate) ? colDef.footerCellTemplate : null;\n\n    /**\n     * @ngdoc property\n     * @name cellTooltip\n     * @propertyOf ui.grid.class:GridOptions.columnDef\n     * @description Whether or not to show a tooltip when a user hovers over the cell.\n     * If set to false, no tooltip.  If true, the cell value is shown in the tooltip (useful\n     * if you have long values in your cells), if a function then that function is called\n     * passing in the row and the col `cellTooltip( row, col )`, and the return value is shown in the tooltip,\n     * if it is a static string then displays that static string.\n     *\n     * Defaults to false\n     *\n     */\n    if ( typeof(colDef.cellTooltip) === 'undefined' || colDef.cellTooltip === false ) {\n      self.cellTooltip = false;\n    } else if ( colDef.cellTooltip === true ) {\n      self.cellTooltip = function(row, col) {\n        return self.grid.getCellValue( row, col );\n      };\n    } else if (typeof(colDef.cellTooltip) === 'function' ) {\n      self.cellTooltip = colDef.cellTooltip;\n    } else {\n      self.cellTooltip = function ( row, col ) {\n        return col.colDef.cellTooltip;\n      };\n    }\n\n    /**\n     * @ngdoc property\n     * @name headerTooltip\n     * @propertyOf ui.grid.class:GridOptions.columnDef\n     * @description Whether or not to show a tooltip when a user hovers over the header cell.\n     * If set to false, no tooltip.  If true, the displayName is shown in the tooltip (useful\n     * if you have long values in your headers), if a function then that function is called\n     * passing in the row and the col `headerTooltip( col )`, and the return value is shown in the tooltip,\n     * if a static string then shows that static string.\n     *\n     * Defaults to false\n     *\n     */\n    if ( typeof(colDef.headerTooltip) === 'undefined' || colDef.headerTooltip === false ) {\n      self.headerTooltip = false;\n    }\n    else if ( colDef.headerTooltip === true ) {\n      self.headerTooltip = function(col) {\n        return col.displayName;\n      };\n    }\n    else if (typeof(colDef.headerTooltip) === 'function' ) {\n      self.headerTooltip = colDef.headerTooltip;\n    }\n    else {\n      self.headerTooltip = function ( col ) {\n        return col.colDef.headerTooltip;\n      };\n    }\n\n\n    /**\n     * @ngdoc property\n     * @name footerCellClass\n     * @propertyOf ui.grid.class:GridOptions.columnDef\n     * @description footerCellClass can be a string specifying the class to append to a cell\n     * or it can be a function(grid, row, col, rowRenderIndex, colRenderIndex) that returns a class name\n     *\n     */\n    self.footerCellClass = colDef.footerCellClass;\n\n    /**\n     * @ngdoc property\n     * @name cellClass\n     * @propertyOf ui.grid.class:GridOptions.columnDef\n     * @description cellClass can be a string specifying the class to append to a cell\n     * or it can be a function(grid, row, col, rowRenderIndex, colRenderIndex) that returns a class name\n     *\n     */\n    self.cellClass = colDef.cellClass;\n\n    /**\n     * @ngdoc property\n     * @name headerCellClass\n     * @propertyOf ui.grid.class:GridOptions.columnDef\n     * @description headerCellClass can be a string specifying the class to append to a cell\n     * or it can be a function(grid, row, col, rowRenderIndex, colRenderIndex) that returns a class name\n     *\n     */\n    self.headerCellClass = colDef.headerCellClass;\n\n    /**\n     * @ngdoc property\n     * @name cellFilter\n     * @propertyOf ui.grid.class:GridOptions.columnDef\n     * @description cellFilter is a filter to apply to the content of each cell\n     * @example\n     * <pre>\n     *   gridOptions.columnDefs[0].cellFilter = 'date'\n     *\n     */\n    self.cellFilter = colDef.cellFilter ? colDef.cellFilter : \"\";\n\n    /**\n     * @ngdoc boolean\n     * @name sortCellFiltered\n     * @propertyOf ui.grid.class:GridOptions.columnDef\n     * @description (optional) False by default. When `true` uiGrid will apply the cellFilter before\n     * sorting the data. Note that when using this option uiGrid will assume that the displayed value is\n     * a string, and use the {@link ui.grid.class:RowSorter#sortAlpha sortAlpha} `sortFn`. It is possible\n     * to return a non-string value from an angularjs filter, in which case you should define a {@link ui.grid.class:GridOptions.columnDef#sortingAlgorithm sortingAlgorithm}\n     * for the column which hanldes the returned type. You may specify one of the `sortingAlgorithms`\n     * found in the {@link ui.grid.RowSorter rowSorter} service.\n     */\n    self.sortCellFiltered = colDef.sortCellFiltered ? true : false;\n\n    /**\n     * @ngdoc boolean\n     * @name filterCellFiltered\n     * @propertyOf ui.grid.class:GridOptions.columnDef\n     * @description (optional) False by default. When `true` uiGrid will apply the cellFilter before\n     * applying \"search\" `filters`.\n     */\n    self.filterCellFiltered = colDef.filterCellFiltered ? true : false;\n\n    /**\n     * @ngdoc property\n     * @name headerCellFilter\n     * @propertyOf ui.grid.class:GridOptions.columnDef\n     * @description headerCellFilter is a filter to apply to the content of the column header\n     * @example\n     * <pre>\n     *   gridOptions.columnDefs[0].headerCellFilter = 'translate'\n     *\n     */\n    self.headerCellFilter = colDef.headerCellFilter ? colDef.headerCellFilter : \"\";\n\n    /**\n     * @ngdoc property\n     * @name footerCellFilter\n     * @propertyOf ui.grid.class:GridOptions.columnDef\n     * @description footerCellFilter is a filter to apply to the content of the column footer\n     * @example\n     * <pre>\n     *   gridOptions.columnDefs[0].footerCellFilter = 'date'\n     *\n     */\n    self.footerCellFilter = colDef.footerCellFilter ? colDef.footerCellFilter : \"\";\n\n    self.visible = gridUtil.isNullOrUndefined(colDef.visible) || colDef.visible;\n\n    self.headerClass = colDef.headerClass;\n    // self.cursor = self.sortable ? 'pointer' : 'default';\n\n    // Turn on sorting by default\n    self.enableSorting = typeof(colDef.enableSorting) !== 'undefined' ? colDef.enableSorting : self.grid.options.enableSorting;\n    self.sortingAlgorithm = colDef.sortingAlgorithm;\n\n    /**\n     * @ngdoc property\n     * @name sortDirectionCycle\n     * @propertyOf ui.grid.class:GridOptions.columnDef\n     * @description (optional) An array of {@link ui.grid.service:uiGridConstants#properties_ASC sort directions},\n     * specifying the order that they should cycle through as the user repeatedly clicks on the column heading.\n     * The default is `[null, uiGridConstants.ASC, uiGridConstants.DESC]`. Null\n     * refers to the unsorted state. This does not affect the initial sort\n     * direction; use the {@link ui.grid.class:GridOptions.columnDef#sort sort}\n     * property for that. If\n     * {@link ui.grid.class:GridOptions.columnDef#suppressRemoveSort suppressRemoveSort}\n     * is also set, the unsorted state will be skipped even if it is listed here.\n     * Each direction may not appear in the list more than once (e.g. `[ASC,\n     * DESC, DESC]` is not allowed), and the list may not be empty.\n     */\n    self.sortDirectionCycle = typeof(colDef.sortDirectionCycle) !== 'undefined' ?\n      colDef.sortDirectionCycle :\n      [null, uiGridConstants.ASC, uiGridConstants.DESC];\n\n    /**\n     * @ngdoc boolean\n     * @name suppressRemoveSort\n     * @propertyOf ui.grid.class:GridOptions.columnDef\n     * @description (optional) False by default. When enabled, this setting hides the removeSort option\n     * in the menu, and prevents users from manually removing the sort\n     */\n    if ( typeof(self.suppressRemoveSort) === 'undefined') {\n      self.suppressRemoveSort = typeof(colDef.suppressRemoveSort) !== 'undefined' ? colDef.suppressRemoveSort : false;\n    }\n\n    /**\n     * @ngdoc property\n     * @name enableFiltering\n     * @propertyOf ui.grid.class:GridOptions.columnDef\n     * @description turn off filtering for an individual column, where\n     * you've turned on filtering for the overall grid\n     * @example\n     * <pre>\n     *   gridOptions.columnDefs[0].enableFiltering = false;\n     *\n     */\n    // Turn on filtering by default (it's disabled by default at the Grid level)\n    self.enableFiltering = typeof(colDef.enableFiltering) !== 'undefined' ? colDef.enableFiltering : true;\n\n    // Place the filter in the header cell by default\n    self.filterContainer = typeof(colDef.filterContainer) !== 'undefined' ? colDef.filterContainer : self.grid.options.filterContainer;\n\n    // self.menuItems = colDef.menuItems;\n    self.setPropertyOrDefault(colDef, 'menuItems', []);\n\n    // Use the column definition sort if we were passed it, but only if this is a newly added column\n    if ( isNew ) {\n      self.setPropertyOrDefault(colDef, 'sort');\n    }\n\n    // Use the column definition defaultSort always, unlike normal sort\n    self.setPropertyOrDefault(colDef, 'defaultSort');\n\n    // Set up default filters array for when one is not provided.\n    //   In other words, this (in column def):\n    //\n    //       filter: { term: 'something', flags: {}, condition: [CONDITION] }\n    //\n    //   is just shorthand for this:\n    //\n    //       filters: [{ term: 'something', flags: {}, condition: [CONDITION] }]\n    //\n    var defaultFilters = [];\n    if (colDef.filter) {\n      defaultFilters.push(colDef.filter);\n    }\n    else if ( colDef.filters ) {\n      defaultFilters = colDef.filters;\n    }\n    else {\n      // Add an empty filter definition object, which will\n      // translate to a guessed condition and no pre-populated\n      // value for the filter <input>.\n      defaultFilters.push({});\n    }\n\n    /**\n     * @ngdoc property\n     * @name filter\n     * @propertyOf ui.grid.class:GridOptions.columnDef\n     * @description Specify a single filter field on this column.\n     *\n     * A filter consists of a condition, a term, and a placeholder:\n     *\n     * - condition defines how rows are chosen as matching the filter term. This can be set to\n     * one of the constants in {@link ui.grid.service:uiGridConstants#properties_filter uiGridConstants.filter},\n     * or you can supply a custom filter function\n     * that gets passed the following arguments: [searchTerm, cellValue, row, column].\n     * - term: If set, the filter field will be pre-populated\n     * with this value.\n     * - placeholder: String that will be set to the `<input>.placeholder` attribute.\n     * - ariaLabel: String that will be set to the `<input>.ariaLabel` attribute. This is what is read as a label to screen reader users.\n     * - noTerm: set this to true if you have defined a custom function in condition, and\n     * your custom function doesn't require a term (so it can run even when the term is null)\n     * - rawTerm: set this to true if you have defined a custom function in condition, and\n     * your custom function requires access to the raw unmodified search term that was entered\n     * - flags: only flag currently available is `caseSensitive`, set to false if you don't want\n     * case sensitive matching\n     * - type: defaults to {@link ui.grid.service:uiGridConstants#properties_filter uiGridConstants.filter.INPUT},\n     * which gives a text box.  If set to {@link ui.grid.service:uiGridConstants#properties_filter uiGridConstants.filter.SELECT}\n     * then a select box will be shown with options selectOptions\n     * - selectOptions: options in the format `[ { value: 1, label: 'male' }]`.  No i18n filter is provided, you need\n     * to perform the i18n on the values before you provide them\n     * - disableCancelFilterButton: defaults to false. If set to true then the 'x' button that cancels/clears the filter\n     * will not be shown.\n     * @example\n     * <pre>$scope.gridOptions.columnDefs = [\n     *   {\n     *     field: 'field1',\n     *     filter: {\n     *       term: 'xx',\n     *       condition: uiGridConstants.filter.STARTS_WITH,\n     *       placeholder: 'starts with...',\n     *       ariaLabel: 'Starts with filter for field1',\n     *       flags: { caseSensitive: false },\n     *       type: uiGridConstants.filter.SELECT,\n     *       selectOptions: [ { value: 1, label: 'male' }, { value: 2, label: 'female' } ],\n     *       disableCancelFilterButton: true\n     *     }\n     *   }\n     * ]; </pre>\n     *\n     */\n\n    // Only set filter if this is a newly added column, if we're updating an existing\n    // column then we don't want to put the default filter back if the user may have already\n    // removed it.\n    // However, we do want to keep the settings if they change, just not the term\n    if ( isNew ) {\n      self.setPropertyOrDefault(colDef, 'filter');\n      self.setPropertyOrDefault(colDef, 'extraStyle');\n      self.setPropertyOrDefault(colDef, 'filters', defaultFilters);\n    } else if ( self.filters.length === defaultFilters.length ) {\n      self.filters.forEach( function( filter, index ) {\n        if (typeof(defaultFilters[index].placeholder) !== 'undefined') {\n          filter.placeholder = defaultFilters[index].placeholder;\n        }\n        if (typeof(defaultFilters[index].ariaLabel) !== 'undefined') {\n          filter.ariaLabel = defaultFilters[index].ariaLabel;\n        }\n        if (typeof(defaultFilters[index].flags) !== 'undefined') {\n          filter.flags = defaultFilters[index].flags;\n        }\n        if (typeof(defaultFilters[index].type) !== 'undefined') {\n          filter.type = defaultFilters[index].type;\n        }\n        if (typeof(defaultFilters[index].selectOptions) !== 'undefined') {\n          filter.selectOptions = defaultFilters[index].selectOptions;\n        }\n      });\n    }\n  };\n\n  /**\n   * @ngdoc function\n   * @name unsort\n   * @methodOf ui.grid.class:GridColumn\n   * @description Removes column from the grid sorting\n   */\n  GridColumn.prototype.unsort = function () {\n    // Decrease priority for every col where priority is higher than the removed sort's priority.\n    var thisPriority = this.sort.priority;\n\n    this.grid.columns.forEach(function (col) {\n      if (col.sort && col.sort.priority !== undefined && col.sort.priority > thisPriority) {\n        col.sort.priority -= 1;\n      }\n    });\n\n    this.sort = {};\n    this.grid.api.core.raise.sortChanged( this.grid, this.grid.getColumnSorting() );\n  };\n\n\n  /**\n   * @ngdoc function\n   * @name getColClass\n   * @methodOf ui.grid.class:GridColumn\n   * @description Returns the class name for the column\n   * @param {bool} prefixDot  if true, will return .className instead of className\n   */\n  GridColumn.prototype.getColClass = function (prefixDot) {\n    var cls = uiGridConstants.COL_CLASS_PREFIX + this.uid;\n\n    return prefixDot ? '.' + cls : cls;\n  };\n\n    /**\n     * @ngdoc function\n     * @name isPinnedLeft\n     * @methodOf ui.grid.class:GridColumn\n     * @description Returns true if column is in the left render container\n     */\n    GridColumn.prototype.isPinnedLeft = function () {\n      return this.renderContainer === 'left';\n    };\n\n    /**\n     * @ngdoc function\n     * @name isPinnedRight\n     * @methodOf ui.grid.class:GridColumn\n     * @description Returns true if column is in the right render container\n     */\n    GridColumn.prototype.isPinnedRight = function () {\n      return this.renderContainer === 'right';\n    };\n\n\n    /**\n   * @ngdoc function\n   * @name getColClassDefinition\n   * @methodOf ui.grid.class:GridColumn\n   * @description Returns the class definition for th column\n   */\n  GridColumn.prototype.getColClassDefinition = function () {\n    return ' .grid' + this.grid.id + ' ' + this.getColClass(true) + ' { min-width: ' + this.drawnWidth + 'px; max-width: ' + this.drawnWidth + 'px; }';\n  };\n\n  /**\n   * @ngdoc function\n   * @name getRenderContainer\n   * @methodOf ui.grid.class:GridColumn\n   * @description Returns the render container object that this column belongs to.\n   *\n   * Columns will be default be in the `body` render container if they aren't allocated to one specifically.\n   */\n  GridColumn.prototype.getRenderContainer = function getRenderContainer() {\n    var self = this;\n\n    var containerId = self.renderContainer;\n\n    if (containerId === null || containerId === '' || containerId === undefined) {\n      containerId = 'body';\n    }\n\n    return self.grid.renderContainers[containerId];\n  };\n\n  /**\n   * @ngdoc function\n   * @name showColumn\n   * @methodOf ui.grid.class:GridColumn\n   * @description Makes the column visible by setting colDef.visible = true\n   */\n  GridColumn.prototype.showColumn = function() {\n      this.colDef.visible = true;\n  };\n\n\n  /**\n   * @ngdoc property\n   * @name aggregationHideLabel\n   * @propertyOf ui.grid.class:GridOptions.columnDef\n   * @description defaults to false, if set to true hides the label text\n   * in the aggregation footer, so only the value is displayed.\n   *\n   */\n  /**\n   * @ngdoc function\n   * @name getAggregationText\n   * @methodOf ui.grid.class:GridColumn\n   * @description Gets the aggregation label from colDef.aggregationLabel if\n   * specified or by using i18n, including deciding whether or not to display\n   * based on colDef.aggregationHideLabel.\n   *\n   * @param {string} label the i18n lookup value to use for the column label\n   *\n   */\n  GridColumn.prototype.getAggregationText = function () {\n    var self = this;\n    if ( self.colDef.aggregationHideLabel ) {\n      return '';\n    }\n    else if ( self.colDef.aggregationLabel ) {\n      return self.colDef.aggregationLabel;\n    }\n    else {\n      switch ( self.colDef.aggregationType ) {\n        case uiGridConstants.aggregationTypes.count:\n          return i18nService.getSafeText('aggregation.count');\n        case uiGridConstants.aggregationTypes.sum:\n          return i18nService.getSafeText('aggregation.sum');\n        case uiGridConstants.aggregationTypes.avg:\n          return i18nService.getSafeText('aggregation.avg');\n        case uiGridConstants.aggregationTypes.min:\n          return i18nService.getSafeText('aggregation.min');\n        case uiGridConstants.aggregationTypes.max:\n          return i18nService.getSafeText('aggregation.max');\n        default:\n          return '';\n      }\n    }\n  };\n\n  GridColumn.prototype.getCellTemplate = function () {\n    var self = this;\n\n    return self.cellTemplatePromise;\n  };\n\n  GridColumn.prototype.getCompiledElementFn = function () {\n    var self = this;\n\n    return self.compiledElementFnDefer.promise;\n  };\n\n  return GridColumn;\n}]);\n\n})();\n\n(function() {\nangular.module('ui.grid')\n.factory('GridOptions', ['gridUtil','uiGridConstants', function(gridUtil, uiGridConstants) {\n\n  /**\n   * @ngdoc function\n   * @name ui.grid.class:GridOptions\n   * @description Default GridOptions class.  GridOptions are defined by the application developer and overlaid\n   * over this object.  Setting gridOptions within your controller is the most common method for an application\n   * developer to configure the behaviour of their ui-grid\n   *\n   * @example To define your gridOptions within your controller:\n   * <pre>$scope.gridOptions = {\n   *   data: $scope.myData,\n   *   columnDefs: [\n   *     { name: 'field1', displayName: 'pretty display name' },\n   *     { name: 'field2', visible: false }\n   *  ]\n   * };</pre>\n   *\n   * You can then use this within your html template, when you define your grid:\n   * <pre>&lt;div ui-grid=\"gridOptions\"&gt;&lt;/div&gt;</pre>\n   *\n   * To provide default options for all of the grids within your application, use an angular\n   * decorator to modify the GridOptions factory.\n   * <pre>\n   * app.config(function($provide) {\n   *   $provide.decorator('GridOptions',function($delegate) {\n   *     var gridOptions;\n   *     gridOptions = angular.copy($delegate);\n   *     gridOptions.initialize = function(options) {\n   *       var initOptions;\n   *       initOptions = $delegate.initialize(options);\n   *       initOptions.enableColumnMenus = false;\n   *       return initOptions;\n   *     };\n   *     return gridOptions;\n   *   });\n   * });\n   * </pre>\n   */\n  return {\n    initialize: function( baseOptions ) {\n      /**\n       * @ngdoc function\n       * @name onRegisterApi\n       * @propertyOf ui.grid.class:GridOptions\n       * @description A callback that returns the gridApi once the grid is instantiated, which is\n       * then used to interact with the grid programatically.\n       *\n       * Note that the gridApi.core.renderingComplete event is identical to this\n       * callback, but has the advantage that it can be called from multiple places\n       * if needed\n       *\n       * @example\n       * <pre>\n       *   $scope.gridOptions.onRegisterApi = function ( gridApi ) {\n       *     $scope.gridApi = gridApi;\n       *     $scope.gridApi.selection.selectAllRows( $scope.gridApi.grid );\n       *   };\n       * </pre>\n       *\n       */\n      baseOptions.onRegisterApi = baseOptions.onRegisterApi || angular.noop();\n\n      /**\n       * @ngdoc object\n       * @name data\n       * @propertyOf ui.grid.class:GridOptions\n       * @description (mandatory) Array of data to be rendered into the grid, providing the data source or data binding for\n       * the grid.\n       *\n       * Most commonly the data is an array of objects, where each object has a number of attributes.\n       * Each attribute automatically becomes a column in your grid.  This array could, for example, be sourced from\n       * an angularJS $resource query request.  The array can also contain complex objects, refer the binding tutorial\n       * for examples of that.\n       *\n       * The most flexible usage is to set your data on $scope:\n       *\n       * `$scope.data = data;`\n       *\n       * And then direct the grid to resolve whatever is in $scope.data:\n       *\n       * `$scope.gridOptions.data = 'data';`\n       *\n       * This is the most flexible approach as it allows you to replace $scope.data whenever you feel like it without\n       * getting pointer issues.\n       *\n       * Alternatively you can directly set the data array:\n       *\n       * `$scope.gridOptions.data = [ ];`\n       * or\n       *\n       * `$http.get('/data/100.json')\n       * .success(function(data) {\n       *   $scope.myData = data;\n       *   $scope.gridOptions.data = $scope.myData;\n       *  });`\n       *\n       * Where you do this, you need to take care in updating the data - you can't just update `$scope.myData` to some other\n       * array, you need to update $scope.gridOptions.data to point to that new array as well.\n       *\n       */\n      baseOptions.data = baseOptions.data || [];\n\n      /**\n       * @ngdoc array\n       * @name columnDefs\n       * @propertyOf  ui.grid.class:GridOptions\n       * @description Array of columnDef objects.  Only required property is name.\n       * The individual options available in columnDefs are documented in the\n       * {@link ui.grid.class:GridOptions.columnDef columnDef} section\n       * </br>_field property can be used in place of name for backwards compatibility with 2.x_\n       *  @example\n       *\n       * <pre>var columnDefs = [{name: 'field1'}, {name: 'field2'}];</pre>\n       *\n       */\n      baseOptions.columnDefs = baseOptions.columnDefs || [];\n\n      /**\n       * @ngdoc object\n       * @name ui.grid.class:GridOptions.columnDef\n       * @description Definition / configuration of an individual column, which would typically be\n       * one of many column definitions within the gridOptions.columnDefs array\n       * @example\n       * <pre>{name: 'field1', field: 'field1', filter: { term: 'xxx' }}</pre>\n       *\n       */\n\n      /**\n       * @ngdoc object\n       * @name enableGridMenu\n       * @propertyOf ui.grid.class:GridOptions\n       * @description Takes a boolean that adds a settings icon in the top right of the grid, which floats above\n       * the column header, when true. The menu by default gives access to show/hide columns, but can be\n       * customised to show additional actions.\n       *\n       * See the {@link #!/tutorial/121_grid_menu Grid Menu tutorial} for more detailed information.\n       */\n\n      /**\n       * @ngdoc array\n       * @name excludeProperties\n       * @propertyOf ui.grid.class:GridOptions\n       * @description Array of property names in data to ignore when auto-generating column names.  Provides the\n       * inverse of columnDefs - columnDefs is a list of columns to include, excludeProperties is a list of columns\n       * to exclude.\n       *\n       * If columnDefs is defined, this will be ignored.\n       *\n       * Defaults to ['$$hashKey']\n       */\n\n      baseOptions.excludeProperties = baseOptions.excludeProperties || ['$$hashKey'];\n\n      /**\n       * @ngdoc boolean\n       * @name enableRowHashing\n       * @propertyOf ui.grid.class:GridOptions\n       * @description True by default. When enabled, this setting allows uiGrid to add\n       * `$$hashKey`-type properties (similar to Angular) to elements in the `data` array. This allows\n       * the grid to maintain state while vastly speeding up the process of altering `data` by adding/moving/removing rows.\n       *\n       * Note that this DOES add properties to your data that you may not want, but they are stripped out when using `angular.toJson()`. IF\n       * you do not want this at all you can disable this setting but you will take a performance hit if you are using large numbers of rows\n       * and are altering the data set often.\n       */\n      baseOptions.enableRowHashing = baseOptions.enableRowHashing !== false;\n\n      /**\n       * @ngdoc function\n       * @name rowIdentity\n       * @methodOf ui.grid.class:GridOptions\n       * @description This function is used to get and, if necessary, set the value uniquely identifying this row (i.e. if an identity is not present it will set one).\n       *\n       * By default it returns the `$$hashKey` property if it exists. If it doesn't it uses gridUtil.nextUid() to generate one\n       */\n      baseOptions.rowIdentity = baseOptions.rowIdentity || function rowIdentity(row) {\n        return gridUtil.hashKey(row);\n      };\n\n      /**\n       * @ngdoc function\n       * @name getRowIdentity\n       * @methodOf ui.grid.class:GridOptions\n       * @description This function returns the identity value uniquely identifying this row, if one is not present it does not set it.\n       *\n       * By default it returns the `$$hashKey` property but can be overridden to use any property or set of properties you want.\n       */\n      baseOptions.getRowIdentity = baseOptions.getRowIdentity || function getRowIdentity(row) {\n        return row.$$hashKey;\n      };\n\n      /**\n       * @ngdoc property\n       * @name flatEntityAccess\n       * @propertyOf ui.grid.class:GridOptions\n       * @description Set to true if your columns are all related directly to fields in a flat object structure - i.e.\n       * each of your columns associate directly with a property on each of the entities in your data array.\n       *\n       * In that situation we can avoid all the logic associated with complex binding to functions or to properties of sub-objects,\n       * which can provide a significant speed improvement with large data sets when filtering or sorting.\n       *\n       * By default false\n       */\n      baseOptions.flatEntityAccess = baseOptions.flatEntityAccess === true;\n\n      /**\n       * @ngdoc property\n       * @name showHeader\n       * @propertyOf ui.grid.class:GridOptions\n       * @description True by default. When set to false, this setting will replace the\n       * standard header template with '<div></div>', resulting in no header being shown.\n       */\n      baseOptions.showHeader = typeof(baseOptions.showHeader) !== \"undefined\" ? baseOptions.showHeader : true;\n\n      /**\n       * @ngdoc property\n       * @name headerRowHeight\n       * @propertyOf ui.grid.class:GridOptions\n       * @description The height of the header in pixels, defaults to 30.\n       * Although, we recommend that you alter header height with CSS rather than using this option:\n       *\n       * <pre>\n       *     .grid .ui-grid-header-cell {\n       *         height: 60px;\n       *     }\n       * </pre>\n       **/\n      if (!baseOptions.showHeader) {\n        baseOptions.headerRowHeight = 0;\n      }\n      else {\n        baseOptions.headerRowHeight = typeof(baseOptions.headerRowHeight) !== \"undefined\" ? baseOptions.headerRowHeight : 30;\n      }\n\n      /**\n       * @ngdoc property\n       * @name rowHeight\n       * @propertyOf ui.grid.class:GridOptions\n       * @description The height of the row in pixels,  Can be passed as integer or string. defaults to 30.\n       *\n       */\n\n      if (typeof baseOptions.rowHeight === \"string\") {\n        baseOptions.rowHeight = parseInt(baseOptions.rowHeight) || 30;\n      }\n\n      else {\n        baseOptions.rowHeight = baseOptions.rowHeight || 30;\n      }\n\n      /**\n       * @ngdoc integer\n       * @name minRowsToShow\n       * @propertyOf ui.grid.class:GridOptions\n       * @description Minimum number of rows to show when the grid doesn't have a defined height. Defaults to \"10\".\n       */\n      baseOptions.minRowsToShow = typeof(baseOptions.minRowsToShow) !== \"undefined\" ? baseOptions.minRowsToShow : 10;\n\n      /**\n       * @ngdoc property\n       * @name showGridFooter\n       * @propertyOf ui.grid.class:GridOptions\n       * @description Whether or not to show the footer, defaults to false\n       * The footer display Total Rows and Visible Rows (filtered rows)\n       */\n      baseOptions.showGridFooter = baseOptions.showGridFooter === true;\n\n      /**\n       * @ngdoc property\n       * @name showColumnFooter\n       * @propertyOf ui.grid.class:GridOptions\n       * @description Whether or not to show the column footer, defaults to false\n       * The column footer displays column aggregates\n       */\n      baseOptions.showColumnFooter = baseOptions.showColumnFooter === true;\n\n      /**\n       * @ngdoc property\n       * @name columnFooterHeight\n       * @propertyOf ui.grid.class:GridOptions\n       * @description The height of the footer rows (column footer and grid footer) in pixels\n       *\n       */\n      baseOptions.columnFooterHeight = typeof(baseOptions.columnFooterHeight) !== \"undefined\" ? baseOptions.columnFooterHeight : 30;\n      baseOptions.gridFooterHeight = typeof(baseOptions.gridFooterHeight) !== \"undefined\" ? baseOptions.gridFooterHeight : 30;\n\n      baseOptions.columnWidth = typeof(baseOptions.columnWidth) !== \"undefined\" ? baseOptions.columnWidth : 50;\n\n      /**\n       * @ngdoc property\n       * @name maxVisibleColumnCount\n       * @propertyOf ui.grid.class:GridOptions\n       * @description Defaults to 200\n       *\n       */\n      baseOptions.maxVisibleColumnCount = typeof(baseOptions.maxVisibleColumnCount) !== \"undefined\" ? baseOptions.maxVisibleColumnCount : 200;\n\n      /**\n       * @ngdoc property\n       * @name virtualizationThreshold\n       * @propertyOf ui.grid.class:GridOptions\n       * @description Turn virtualization on when number of data elements goes over this number, defaults to 20\n       */\n      baseOptions.virtualizationThreshold = typeof(baseOptions.virtualizationThreshold) !== \"undefined\" ? baseOptions.virtualizationThreshold : 20;\n\n      /**\n       * @ngdoc property\n       * @name columnVirtualizationThreshold\n       * @propertyOf ui.grid.class:GridOptions\n       * @description Turn virtualization on when number of columns goes over this number, defaults to 10\n       */\n      baseOptions.columnVirtualizationThreshold = typeof(baseOptions.columnVirtualizationThreshold) !== \"undefined\" ? baseOptions.columnVirtualizationThreshold : 10;\n\n      /**\n       * @ngdoc property\n       * @name excessRows\n       * @propertyOf ui.grid.class:GridOptions\n       * @description Extra rows to to render outside of the viewport, which helps with smoothness of scrolling.\n       * Defaults to 4\n       */\n      baseOptions.excessRows = typeof(baseOptions.excessRows) !== \"undefined\" ? baseOptions.excessRows : 4;\n\n      /**\n       * @ngdoc property\n       * @name scrollThreshold\n       * @propertyOf ui.grid.class:GridOptions\n       * @description Throttles the grid scrolling by the amount of rows set, which helps with smoothness of scrolling.\n       * Defaults to 4.\n       */\n      baseOptions.scrollThreshold = typeof(baseOptions.scrollThreshold) !== \"undefined\" ? baseOptions.scrollThreshold : 4;\n\n      /**\n       * @ngdoc property\n       * @name excessColumns\n       * @propertyOf ui.grid.class:GridOptions\n       * @description Extra columns to to render outside of the viewport, which helps with smoothness of scrolling.\n       * Defaults to 4\n       */\n      baseOptions.excessColumns = typeof(baseOptions.excessColumns) !== \"undefined\" ? baseOptions.excessColumns : 4;\n\n      /**\n       * @ngdoc property\n       * @name aggregationCalcThrottle\n       * @propertyOf ui.grid.class:GridOptions\n       * @description Default time in milliseconds to throttle aggregation calcuations, defaults to 500ms\n       */\n      baseOptions.aggregationCalcThrottle = typeof(baseOptions.aggregationCalcThrottle) !== \"undefined\" ? baseOptions.aggregationCalcThrottle : 500;\n\n      /**\n       * @ngdoc property\n       * @name wheelScrollThrottle\n       * @propertyOf ui.grid.class:GridOptions\n       * @description Default time in milliseconds to throttle scroll events to, defaults to 70ms\n       */\n      baseOptions.wheelScrollThrottle = typeof(baseOptions.wheelScrollThrottle) !== \"undefined\" ? baseOptions.wheelScrollThrottle : 70;\n\n\n      /**\n       * @ngdoc property\n       * @name scrollDebounce\n       * @propertyOf ui.grid.class:GridOptions\n       * @description Default time in milliseconds to debounce scroll events, defaults to 300ms\n       */\n      baseOptions.scrollDebounce = typeof(baseOptions.scrollDebounce) !== \"undefined\" ? baseOptions.scrollDebounce : 300;\n\n      /**\n       * @ngdoc boolean\n       * @name enableHiding\n       * @propertyOf ui.grid.class:GridOptions\n       * @description True by default. When enabled, this setting adds ability to hide\n       * the column headers, allowing hiding of the column from the grid.\n       * Column hiding can then be disabled / enabled on individual columns using the columnDefs,\n       * if it set, it will override GridOptions enableHiding setting.\n       */\n      baseOptions.enableHiding = baseOptions.enableHiding !== false;\n\n      /**\n       * @ngdoc boolean\n       * @name enableSorting\n       * @propertyOf ui.grid.class:GridOptions\n       * @description True by default. When enabled, this setting adds sort\n       * widgets to the column headers, allowing sorting of the data for the entire grid.\n       * Sorting can then be disabled / enabled on individual columns using the columnDefs,\n       * if it set, it will override GridOptions enableSorting setting.\n       */\n      baseOptions.enableSorting = baseOptions.enableSorting !== false;\n\n      /**\n       * @ngdoc boolean\n       * @name suppressMultiSort\n       * @propertyOf ui.grid.class:GridOptions\n       * @description False by default. When enabled, this setting disables the ability\n       * to sort multiple columns by using the shift key or interacting with the column\n       * menu. Instead, each column sort will remove all other sorting.\n       */\n      baseOptions.suppressMultiSort = baseOptions.suppressMultiSort === true;\n\n      /**\n       * @ngdoc boolean\n       * @name enableFiltering\n       * @propertyOf ui.grid.class:GridOptions\n       * @description False by default. When enabled, this setting adds filter\n       * boxes to each column header, allowing filtering within the column for the entire grid.\n       * Filtering can then be disabled on individual columns using the columnDefs.\n       */\n      baseOptions.enableFiltering = baseOptions.enableFiltering === true;\n\n      /**\n       * @ngdoc string\n       * @name filterContainer\n       * @propertyOf ui.grid.class:GridOptions\n       * @description Sets the parent element for the column filter. `headerCell` places\n       * it in the header cell. `columnMenu` places it in the column menu.\n       * Can be changed for individual columns using the columnDefs.\n       * Defaults to `headerCell`\n       */\n      baseOptions.filterContainer = typeof(baseOptions.filterContainer) !== \"undefined\" ? baseOptions.filterContainer : \"headerCell\";\n\n      /**\n       * @ngdoc boolean\n       * @name enableColumnMenus\n       * @propertyOf ui.grid.class:GridOptions\n       * @description True by default. When enabled, this setting displays a column\n       * menu within each column.\n       * By default column menu's trigger is hidden before mouse over, but you can always force it to be visible with CSS:\n       *\n       * <pre>\n       *  .ui-grid-column-menu-button {\n       *    display: block;\n       *  }\n       * </pre>\n       */\n      baseOptions.enableColumnMenus = baseOptions.enableColumnMenus !== false;\n\n      /**\n       * @ngdoc boolean\n       * @name enableVerticalScrollbar\n       * @propertyOf ui.grid.class:GridOptions\n       * @description {@link ui.grid.service:uiGridConstants#properties_scrollbars uiGridConstants.scrollbars.ALWAYS} by default.\n       * This settings controls the vertical scrollbar for the grid.\n       * Supported values: uiGridConstants.scrollbars.ALWAYS, uiGridConstants.scrollbars.NEVER, uiGridConstants.scrollbars.WHEN_NEEDED\n       */\n      baseOptions.enableVerticalScrollbar = typeof(baseOptions.enableVerticalScrollbar) !== \"undefined\" ? baseOptions.enableVerticalScrollbar : uiGridConstants.scrollbars.ALWAYS;\n\n      /**\n       * @ngdoc boolean\n       * @name enableHorizontalScrollbar\n       * @propertyOf ui.grid.class:GridOptions\n       * @description {@link ui.grid.service:uiGridConstants#properties_scrollbars uiGridConstants.scrollbars.ALWAYS} by default.\n       * This settings controls the horizontal scrollbar for the grid.\n       * Supported values: uiGridConstants.scrollbars.ALWAYS, uiGridConstants.scrollbars.NEVER, uiGridConstants.scrollbars.WHEN_NEEDED\n       */\n      baseOptions.enableHorizontalScrollbar = typeof(baseOptions.enableHorizontalScrollbar) !== \"undefined\" ? baseOptions.enableHorizontalScrollbar : uiGridConstants.scrollbars.ALWAYS;\n\n      /**\n       * @ngdoc boolean\n       * @name enableMinHeightCheck\n       * @propertyOf ui.grid.class:GridOptions\n       * @description True by default. When enabled, a newly initialized grid will check to see if it is tall enough to display\n       * at least one row of data.  If the grid is not tall enough, it will resize the DOM element to display minRowsToShow number\n       * of rows.\n       */\n       baseOptions.enableMinHeightCheck = baseOptions.enableMinHeightCheck !== false;\n\n      /**\n       * @ngdoc boolean\n       * @name minimumColumnSize\n       * @propertyOf ui.grid.class:GridOptions\n       * @description Sets the default minimum column width, in other words,\n       * it defines the default value for a column minWidth attribute if that is not otherwise specified.\n       * Should be a number. Defaults to 30 pixels.\n       */\n      baseOptions.minimumColumnSize = typeof(baseOptions.minimumColumnSize) !== \"undefined\" ? baseOptions.minimumColumnSize : 30;\n\n      /**\n       * @ngdoc function\n       * @name rowEquality\n       * @methodOf ui.grid.class:GridOptions\n       * @description By default, rows are compared using object equality.  This option can be overridden\n       * to compare on any data item property or function\n       * @param {object} entityA First Data Item to compare\n       * @param {object} entityB Second Data Item to compare\n       */\n      baseOptions.rowEquality = baseOptions.rowEquality || function(entityA, entityB) {\n        return entityA === entityB;\n      };\n\n      /**\n       * @ngdoc string\n       * @name headerTemplate\n       * @propertyOf ui.grid.class:GridOptions\n       * @description Null by default. When provided, this setting uses a custom header\n       * template, rather than the default template. Can be set to either the name of a template file:\n       * <pre>  $scope.gridOptions.headerTemplate = 'header_template.html';</pre>\n       * inline html\n       * <pre>  $scope.gridOptions.headerTemplate = '<div class=\"ui-grid-top-panel\" style=\"text-align: center\">I am a Custom Grid Header</div>'</pre>\n       * or the id of a precompiled template (TBD how to use this).\n       * </br>Refer to the custom header tutorial for more information.\n       * If you want no header at all, you can set to an empty div:\n       * <pre>  $scope.gridOptions.headerTemplate = '<div></div>';</pre>\n       *\n       * If you want to only have a static header, then you can set to static content.  If\n       * you want to tailor the existing column headers, then you should look at the\n       * current 'ui-grid-header.html' template in github as your starting point.\n       *\n       */\n      baseOptions.headerTemplate = baseOptions.headerTemplate || null;\n\n      /**\n       * @ngdoc string\n       * @name footerTemplate\n       * @propertyOf ui.grid.class:GridOptions\n       * @description (optional) ui-grid/ui-grid-footer by default.  This footer shows the per-column\n       * aggregation totals.\n       * When provided, this setting uses a custom footer template. Can be set to either the name of a template file 'footer_template.html', inline html\n       * <pre>'<div class=\"ui-grid-bottom-panel\" style=\"text-align: center\">I am a Custom Grid Footer</div>'</pre>, or the id\n       * of a precompiled template (TBD how to use this).  Refer to the custom footer tutorial for more information.\n       */\n      baseOptions.footerTemplate = baseOptions.footerTemplate || 'ui-grid/ui-grid-footer';\n\n      /**\n       * @ngdoc string\n       * @name gridFooterTemplate\n       * @propertyOf ui.grid.class:GridOptions\n       * @description (optional) ui-grid/ui-grid-grid-footer by default. This template by default shows the\n       * total items at the bottom of the grid, and the selected items if selection is enabled.\n       */\n      baseOptions.gridFooterTemplate = baseOptions.gridFooterTemplate || 'ui-grid/ui-grid-grid-footer';\n\n      /**\n       * @ngdoc string\n       * @name rowTemplate\n       * @propertyOf ui.grid.class:GridOptions\n       * @description 'ui-grid/ui-grid-row' by default. When provided, this setting uses a\n       * custom row template.  Can be set to either the name of a template file:\n       * <pre> $scope.gridOptions.rowTemplate = 'row_template.html';</pre>\n       * inline html\n       * <pre>  $scope.gridOptions.rowTemplate = '<div style=\"background-color: aquamarine\" ng-click=\"grid.appScope.fnOne(row)\" ng-repeat=\"col in colContainer.renderedColumns track by col.colDef.name\" class=\"ui-grid-cell\" ui-grid-cell></div>';</pre>\n       * or the id of a precompiled template (TBD how to use this) can be provided.\n       * </br>Refer to the custom row template tutorial for more information.\n       */\n      baseOptions.rowTemplate = baseOptions.rowTemplate || 'ui-grid/ui-grid-row';\n\n      /**\n      * @ngdoc string\n      * @name gridMenuTemplate\n      * @propertyOf ui.grid.class:GridOptions\n      * @description 'ui-grid/uiGridMenu' by default. When provided, this setting uses a\n      * custom grid menu template.\n      */\n      baseOptions.gridMenuTemplate = baseOptions.gridMenuTemplate || 'ui-grid/uiGridMenu';\n\n      /**\n       * @ngdoc string\n       * @name disableGridMenuHideOnScroll\n       * @propertyOf ui.grid.class:GridOptions\n       * @description 'false' by default. When provided, this setting disables Grid Menu Hide On Scroll\n       */\n      baseOptions.disableGridMenuHideOnScroll = baseOptions.disableGridMenuHideOnScroll || false;\n\n            /**\n       * @ngdoc string\n       * @name menuButtonTemplate\n       * @propertyOf ui.grid.class:GridOptions\n       * @description 'ui-grid/ui-grid-menu-button' by default. When provided, this setting uses a custom grid menu button\n       * template. Can be set to either the name of a template file 'menuButton_template.html', inline html\n       * <pre>'<div class=\"ui-grid-menu-button\" ng-click=\"customToggleMenu()\"><div class=\"ui-grid-icon-container\"><i class=\"ui-grid-icon=menu\">&nbsp;</i></div></div><div ui-grid-menu menu-items=\"menuItems\"></div>'</pre>, or the id\n       * of a precompiled template (TBD how to use this).  Refer to the custom footer tutorial for more information.\n       */\n      baseOptions.menuButtonTemplate = baseOptions.menuButtonTemplate || 'ui-grid/ui-grid-menu-button';\n\n      /**\n       * @ngdoc string\n       * @name menuItemTemplate\n       * @propertyOf ui.grid.class:GridOptions\n       * @description 'ui-grid/uiGridMenuItem' by default. When provided, this setting uses a custom grid menu item\n       * template. Can be set to either the name of a template file 'menuItem_template.html', inline html\n       * <pre>'<li class=\"ui-grid-menu-item\"><label>{{name}}</label></li>'</pre>, or the id\n       * of a precompiled template (TBD how to use this).  Refer to the custom footer tutorial for more information.\n       */\n      baseOptions.menuItemTemplate = baseOptions.menuItemTemplate || 'ui-grid/uiGridMenuItem';\n\n      /**\n       * @ngdoc object\n       * @name appScopeProvider\n       * @propertyOf ui.grid.class:GridOptions\n       * @description by default, the parent scope of the ui-grid element will be assigned to grid.appScope\n       * this property allows you to assign any reference you want to grid.appScope\n       */\n      baseOptions.appScopeProvider = baseOptions.appScopeProvider || null;\n\n      return baseOptions;\n    }\n  };\n}]);\n})();\n\n(function() {\n\nangular.module('ui.grid')\n\n  /**\n   * @ngdoc function\n   * @name ui.grid.class:GridRenderContainer\n   * @description The grid has render containers, allowing the ability to have pinned columns.  If the grid\n   * is right-to-left then there may be a right render container, if left-to-right then there may\n   * be a left render container.  There is always a body render container.\n   * @param {string} name The name of the render container ('body', 'left', or 'right')\n   * @param {Grid} grid the grid the render container is in\n   * @param {object} options the render container options\n   */\n.factory('GridRenderContainer', ['gridUtil', 'uiGridConstants', function(gridUtil, uiGridConstants) {\n  function GridRenderContainer(name, grid, options) {\n    var self = this;\n\n    // if (gridUtil.type(grid) !== 'Grid') {\n    //   throw new Error('Grid argument is not a Grid object');\n    // }\n\n    self.name = name;\n\n    self.grid = grid;\n\n    // self.rowCache = [];\n    // self.columnCache = [];\n\n    self.visibleRowCache = [];\n    self.visibleColumnCache = [];\n\n    self.renderedRows = [];\n    self.renderedColumns = [];\n\n    self.prevScrollTop = 0;\n    self.prevScrolltopPercentage = 0;\n    self.prevRowScrollIndex = 0;\n\n    self.prevScrollLeft = 0;\n    self.prevScrollleftPercentage = 0;\n    self.prevColumnScrollIndex = 0;\n\n    self.columnStyles = '';\n\n    self.viewportAdjusters = [];\n\n    /**\n     *  @ngdoc boolean\n     *  @name hasHScrollbar\n     *  @propertyOf  ui.grid.class:GridRenderContainer\n     *  @description flag to signal that container has a horizontal scrollbar\n     */\n    self.hasHScrollbar = false;\n\n    /**\n     *  @ngdoc boolean\n     *  @name hasVScrollbar\n     *  @propertyOf  ui.grid.class:GridRenderContainer\n     *  @description flag to signal that container has a vertical scrollbar\n     */\n    self.hasVScrollbar = false;\n\n    /**\n     *  @ngdoc boolean\n     *  @name canvasHeightShouldUpdate\n     *  @propertyOf  ui.grid.class:GridRenderContainer\n     *  @description flag to signal that container should recalculate the canvas size\n     */\n    self.canvasHeightShouldUpdate = true;\n\n    /**\n     *  @ngdoc boolean\n     *  @name canvasHeight\n     *  @propertyOf  ui.grid.class:GridRenderContainer\n     *  @description last calculated canvas height value\n     */\n    self.$$canvasHeight = 0;\n\n    if (options && angular.isObject(options)) {\n      angular.extend(self, options);\n    }\n\n    grid.registerStyleComputation({\n      priority: 5,\n      func: function () {\n        self.updateColumnWidths();\n        return self.columnStyles;\n      }\n    });\n  }\n\n\n  GridRenderContainer.prototype.reset = function reset() {\n    // this.rowCache.length = 0;\n    // this.columnCache.length = 0;\n\n    this.visibleColumnCache.length = 0;\n    this.visibleRowCache.length = 0;\n\n    this.renderedRows.length = 0;\n    this.renderedColumns.length = 0;\n  };\n\n  // TODO(c0bra): calculate size?? Should this be in a stackable directive?\n\n\n  GridRenderContainer.prototype.containsColumn = function (col) {\n     return this.visibleColumnCache.indexOf(col) !== -1;\n  };\n\n  GridRenderContainer.prototype.minRowsToRender = function minRowsToRender() {\n    var self = this;\n    var minRows = 0;\n    var rowAddedHeight = 0;\n    var viewPortHeight = self.getViewportHeight();\n    for (var i = self.visibleRowCache.length - 1; rowAddedHeight < viewPortHeight && i >= 0; i--) {\n      rowAddedHeight += self.visibleRowCache[i].height;\n      minRows++;\n    }\n    return minRows;\n  };\n\n  GridRenderContainer.prototype.minColumnsToRender = function minColumnsToRender() {\n    var self = this;\n    var viewportWidth = this.getViewportWidth();\n\n    var min = 0;\n    var totalWidth = 0;\n\n    for (var i = 0; i < self.visibleColumnCache.length; i++) {\n      var col = self.visibleColumnCache[i];\n\n      if (totalWidth < viewportWidth) {\n        totalWidth += col.drawnWidth ? col.drawnWidth : 0;\n        min++;\n      }\n      else {\n        var currWidth = 0;\n        for (var j = i; j >= i - min; j--) {\n          currWidth += self.visibleColumnCache[j].drawnWidth ? self.visibleColumnCache[j].drawnWidth : 0;\n        }\n        if (currWidth < viewportWidth) {\n          min++;\n        }\n      }\n    }\n\n    return min;\n  };\n\n  GridRenderContainer.prototype.getVisibleRowCount = function getVisibleRowCount() {\n    return this.visibleRowCache.length;\n  };\n\n  /**\n   * @ngdoc function\n   * @name registerViewportAdjuster\n   * @methodOf ui.grid.class:GridRenderContainer\n   * @description Registers an adjuster to the render container's available width or height.  Adjusters are used\n   * to tell the render container that there is something else consuming space, and to adjust it's size\n   * appropriately.\n   * @param {function} func the adjuster function we want to register\n   */\n\n  GridRenderContainer.prototype.registerViewportAdjuster = function registerViewportAdjuster(func) {\n    this.viewportAdjusters.push(func);\n  };\n\n  /**\n   * @ngdoc function\n   * @name removeViewportAdjuster\n   * @methodOf ui.grid.class:GridRenderContainer\n   * @description Removes an adjuster, should be used when your element is destroyed\n   * @param {function} func the adjuster function we want to remove\n   */\n  GridRenderContainer.prototype.removeViewportAdjuster = function removeViewportAdjuster(func) {\n    var idx = this.viewportAdjusters.indexOf(func);\n\n    if (idx > -1) {\n      this.viewportAdjusters.splice(idx, 1);\n    }\n  };\n\n  /**\n   * @ngdoc function\n   * @name getViewportAdjustment\n   * @methodOf ui.grid.class:GridRenderContainer\n   * @description Gets the adjustment based on the viewportAdjusters.\n   * @returns {object} a hash of { height: x, width: y }.  Usually the values will be negative\n   */\n  GridRenderContainer.prototype.getViewportAdjustment = function getViewportAdjustment() {\n    var self = this;\n\n    var adjustment = { height: 0, width: 0 };\n\n    self.viewportAdjusters.forEach(function (func) {\n      adjustment = func.call(this, adjustment);\n    });\n\n    return adjustment;\n  };\n\n  GridRenderContainer.prototype.getMargin = function getMargin(side) {\n    var self = this;\n\n    var amount = 0;\n\n    self.viewportAdjusters.forEach(function (func) {\n      var adjustment = func.call(this, { height: 0, width: 0 });\n\n      if (adjustment.side && adjustment.side === side) {\n        amount += adjustment.width * -1;\n      }\n    });\n\n    return amount;\n  };\n\n  GridRenderContainer.prototype.getViewportHeight = function getViewportHeight() {\n    var self = this;\n\n    var headerHeight = (self.headerHeight) ? self.headerHeight : self.grid.headerHeight;\n\n    var viewPortHeight = self.grid.gridHeight - headerHeight - self.grid.footerHeight;\n\n\n    var adjustment = self.getViewportAdjustment();\n\n    viewPortHeight = viewPortHeight + adjustment.height;\n\n    return viewPortHeight > 0 ? viewPortHeight : 0;\n  };\n\n  GridRenderContainer.prototype.getViewportWidth = function getViewportWidth() {\n    var self = this;\n\n    var viewportWidth = self.grid.gridWidth;\n\n    // if (typeof(self.grid.verticalScrollbarWidth) !== 'undefined' && self.grid.verticalScrollbarWidth !== undefined &&\n    //  self.grid.verticalScrollbarWidth > 0) {\n    //   viewPortWidth = viewPortWidth - self.grid.verticalScrollbarWidth;\n    // }\n\n    // var viewportWidth = 0;\\\n    // self.visibleColumnCache.forEach(function (column) {\n    //   viewportWidth += column.drawnWidth;\n    // });\n\n    var adjustment = self.getViewportAdjustment();\n\n    viewportWidth = viewportWidth + adjustment.width;\n\n    return viewportWidth;\n  };\n\n  GridRenderContainer.prototype.getHeaderViewportWidth = function getHeaderViewportWidth() {\n    return this.getViewportWidth();\n  };\n\n\n  /**\n   * @ngdoc function\n   * @name getCanvasHeight\n   * @methodOf ui.grid.class:GridRenderContainer\n   * @description Returns the total canvas height.   Only recalculates if canvasHeightShouldUpdate = false\n   * @returns {number} total height of all the visible rows in the container\n   */\n  GridRenderContainer.prototype.getCanvasHeight = function getCanvasHeight() {\n    var self = this;\n\n    if (!self.canvasHeightShouldUpdate) {\n      return self.$$canvasHeight;\n    }\n\n    var oldCanvasHeight = self.$$canvasHeight;\n\n    self.$$canvasHeight = 0;\n\n    self.visibleRowCache.forEach(function(row) {\n      self.$$canvasHeight += row.height;\n    });\n\n\n    self.canvasHeightShouldUpdate = false;\n\n    self.grid.api.core.raise.canvasHeightChanged(oldCanvasHeight, self.$$canvasHeight);\n\n    return self.$$canvasHeight;\n  };\n\n  GridRenderContainer.prototype.getVerticalScrollLength = function getVerticalScrollLength() {\n    return this.getCanvasHeight() - this.getViewportHeight() + this.grid.scrollbarHeight !== 0 ? this.getCanvasHeight() - this.getViewportHeight() + this.grid.scrollbarHeight : -1;\n  };\n\n  GridRenderContainer.prototype.getHorizontalScrollLength = function getHorizontalScrollLength() {\n    return this.getCanvasWidth() - this.getViewportWidth() + this.grid.scrollbarWidth !== 0 ? this.getCanvasWidth() - this.getViewportWidth() + this.grid.scrollbarWidth : -1;\n  };\n\n  GridRenderContainer.prototype.getCanvasWidth = function getCanvasWidth() {\n    var self = this;\n\n    return self.canvasWidth;\n  };\n\n  GridRenderContainer.prototype.setRenderedRows = function setRenderedRows(newRows) {\n    this.renderedRows.length = newRows.length;\n    for (var i = 0; i < newRows.length; i++) {\n      this.renderedRows[i] = newRows[i];\n    }\n  };\n\n  GridRenderContainer.prototype.setRenderedColumns = function setRenderedColumns(newColumns) {\n    // OLD:\n    this.renderedColumns.length = newColumns.length;\n    for (var i = 0; i < newColumns.length; i++) {\n      this.renderedColumns[i] = newColumns[i];\n    }\n\n    this.updateColumnOffset();\n  };\n\n  GridRenderContainer.prototype.updateColumnOffset = function updateColumnOffset() {\n    // Calculate the width of the columns on the left side that are no longer rendered.\n    //  That will be the offset for the columns as we scroll horizontally.\n    var hiddenColumnsWidth = 0;\n    for (var i = 0; i < this.currentFirstColumn; i++) {\n      hiddenColumnsWidth += this.visibleColumnCache[i].drawnWidth;\n    }\n\n    this.columnOffset = hiddenColumnsWidth;\n  };\n\n  GridRenderContainer.prototype.scrollVertical = function (newScrollTop) {\n    var vertScrollPercentage = -1;\n\n    if (newScrollTop !== this.prevScrollTop) {\n      var yDiff = newScrollTop - this.prevScrollTop;\n\n      if (yDiff > 0 ) { this.grid.scrollDirection = uiGridConstants.scrollDirection.DOWN; }\n      if (yDiff < 0 ) { this.grid.scrollDirection = uiGridConstants.scrollDirection.UP; }\n\n      var vertScrollLength = this.getVerticalScrollLength();\n\n      vertScrollPercentage = newScrollTop / vertScrollLength;\n\n      if (vertScrollPercentage > 1) { vertScrollPercentage = 1; }\n      if (vertScrollPercentage < 0) { vertScrollPercentage = 0; }\n\n      this.adjustScrollVertical(newScrollTop, vertScrollPercentage);\n      return vertScrollPercentage;\n    }\n  };\n\n  GridRenderContainer.prototype.scrollHorizontal = function(newScrollLeft) {\n    var horizScrollPercentage = -1;\n\n    // Handle RTL here\n    if (newScrollLeft !== this.prevScrollLeft) {\n      var xDiff = newScrollLeft - this.prevScrollLeft;\n\n      if (xDiff > 0) { this.grid.scrollDirection = uiGridConstants.scrollDirection.RIGHT; }\n      if (xDiff < 0) { this.grid.scrollDirection = uiGridConstants.scrollDirection.LEFT; }\n\n      var horizScrollLength = this.getHorizontalScrollLength();\n      if (horizScrollLength !== 0) {\n        horizScrollPercentage = newScrollLeft / horizScrollLength;\n      }\n      else {\n        horizScrollPercentage = 0;\n      }\n\n      this.adjustScrollHorizontal(newScrollLeft, horizScrollPercentage);\n      return horizScrollPercentage;\n    }\n  };\n\n  GridRenderContainer.prototype.adjustScrollVertical = function adjustScrollVertical(scrollTop, scrollPercentage, force) {\n    if (this.prevScrollTop === scrollTop && !force) {\n      return;\n    }\n\n    if (typeof(scrollTop) === 'undefined' || scrollTop === undefined || scrollTop === null) {\n      scrollTop = (this.getCanvasHeight() - this.getViewportHeight()) * scrollPercentage;\n    }\n\n    this.adjustRows(scrollTop, scrollPercentage, false);\n\n    this.prevScrollTop = scrollTop;\n    this.prevScrolltopPercentage = scrollPercentage;\n\n    this.grid.queueRefresh();\n  };\n\n  GridRenderContainer.prototype.adjustScrollHorizontal = function adjustScrollHorizontal(scrollLeft, scrollPercentage, force) {\n    if (this.prevScrollLeft === scrollLeft && !force) {\n      return;\n    }\n\n    if (typeof(scrollLeft) === 'undefined' || scrollLeft === undefined || scrollLeft === null) {\n      scrollLeft = (this.getCanvasWidth() - this.getViewportWidth()) * scrollPercentage;\n    }\n\n    this.adjustColumns(scrollLeft);\n\n    this.prevScrollLeft = scrollLeft;\n    this.prevScrollleftPercentage = scrollPercentage;\n\n    this.grid.queueRefresh();\n  };\n\n  GridRenderContainer.prototype.adjustRows = function adjustRows(scrollTop, scrollPercentage, postDataLoaded) {\n    var self = this;\n\n    var minRows = self.minRowsToRender();\n\n    var rowCache = self.visibleRowCache;\n\n    var maxRowIndex = rowCache.length - minRows;\n\n    // Calculate the scroll percentage according to the scrollTop location, if no percentage was provided\n    if ((typeof(scrollPercentage) === 'undefined' || scrollPercentage === null) && scrollTop) {\n      scrollPercentage = scrollTop / self.getVerticalScrollLength();\n    }\n\n    var rowIndex = Math.ceil(Math.min(maxRowIndex, maxRowIndex * scrollPercentage));\n\n    // Define a max row index that we can't scroll past\n    if (rowIndex > maxRowIndex) {\n      rowIndex = maxRowIndex;\n    }\n\n    var newRange = [];\n    if (rowCache.length > self.grid.options.virtualizationThreshold) {\n      if (!(typeof(scrollTop) === 'undefined' || scrollTop === null)) {\n        // Have we hit the threshold going down?\n        if ( !self.grid.suppressParentScrollDown && self.prevScrollTop < scrollTop && rowIndex < self.prevRowScrollIndex + self.grid.options.scrollThreshold && rowIndex < maxRowIndex) {\n          return;\n        }\n        // Have we hit the threshold going up?\n        if ( !self.grid.suppressParentScrollUp && self.prevScrollTop > scrollTop && rowIndex > self.prevRowScrollIndex - self.grid.options.scrollThreshold && rowIndex < maxRowIndex) {\n          return;\n        }\n      }\n\n      var rangeStart = Math.max(0, rowIndex - self.grid.options.excessRows);\n      var rangeEnd = Math.min(rowCache.length, rowIndex + minRows + self.grid.options.excessRows);\n\n      newRange = [rangeStart, rangeEnd];\n    }\n    else {\n      var maxLen = self.visibleRowCache.length;\n      newRange = [0, Math.max(maxLen, minRows + self.grid.options.excessRows)];\n    }\n\n    self.updateViewableRowRange(newRange);\n\n    self.prevRowScrollIndex = rowIndex;\n  };\n\n  GridRenderContainer.prototype.adjustColumns = function adjustColumns(scrollLeft) {\n    var self = this;\n\n    var minCols = self.minColumnsToRender();\n\n    var columnCache = self.visibleColumnCache;\n    var maxColumnIndex = columnCache.length - minCols;\n\n    var colIndex = Math.min(maxColumnIndex, self.getLeftIndex(scrollLeft));\n\n    var newRange = [];\n    if (columnCache.length > self.grid.options.columnVirtualizationThreshold && self.getCanvasWidth() > self.getViewportWidth()) {\n      var rangeStart = Math.max(0, colIndex - self.grid.options.excessColumns);\n      var rangeEnd = Math.min(columnCache.length, colIndex + minCols + self.grid.options.excessColumns);\n\n      newRange = [rangeStart, rangeEnd];\n    }\n    else {\n      var maxLen = self.visibleColumnCache.length;\n\n      newRange = [0, Math.max(maxLen, minCols + self.grid.options.excessColumns)];\n    }\n\n    self.updateViewableColumnRange(newRange);\n\n    self.prevColumnScrollIndex = colIndex;\n  };\n\n  GridRenderContainer.prototype.getLeftIndex = function getLeftIndex(scrollLeft) {\n    var wholeLeftWidth = 0;\n    var index = 0\n    for (index; index < this.visibleColumnCache.length; index++) {\n      if (this.visibleColumnCache[index] && this.visibleColumnCache[index].visible) {\n        // accumulate the whole width of columns on the left side, till the point of visibility is surpassed, this is our wanted index\n        wholeLeftWidth += this.visibleColumnCache[index].drawnWidth;\n        if (wholeLeftWidth >= scrollLeft) {\n          break;\n        }\n      }\n    }\n    return index;\n  }\n\n  // Method for updating the visible rows\n  GridRenderContainer.prototype.updateViewableRowRange = function updateViewableRowRange(renderedRange) {\n    // Slice out the range of rows from the data\n    // var rowArr = uiGridCtrl.grid.rows.slice(renderedRange[0], renderedRange[1]);\n    var rowArr = this.visibleRowCache.slice(renderedRange[0], renderedRange[1]);\n\n    // Define the top-most rendered row\n    this.currentTopRow = renderedRange[0];\n\n    this.setRenderedRows(rowArr);\n  };\n\n  // Method for updating the visible columns\n  GridRenderContainer.prototype.updateViewableColumnRange = function updateViewableColumnRange(renderedRange) {\n    // Slice out the range of rows from the data\n    // var columnArr = uiGridCtrl.grid.columns.slice(renderedRange[0], renderedRange[1]);\n    var columnArr = this.visibleColumnCache.slice(renderedRange[0], renderedRange[1]);\n\n    // Define the left-most rendered columns\n    this.currentFirstColumn = renderedRange[0];\n\n    this.setRenderedColumns(columnArr);\n  };\n\n  GridRenderContainer.prototype.headerCellWrapperStyle = function () {\n    var self = this;\n\n    if (self.currentFirstColumn !== 0) {\n      var offset = self.columnOffset;\n\n      if (self.grid.isRTL()) {\n        return { 'margin-right': offset + 'px' };\n      }\n      else {\n        return { 'margin-left': offset + 'px' };\n      }\n    }\n\n    return null;\n  };\n\n    /**\n     *  @ngdoc boolean\n     *  @name updateColumnWidths\n     *  @propertyOf  ui.grid.class:GridRenderContainer\n     *  @description Determine the appropriate column width of each column across all render containers.\n     *\n     *  Column width is easy when each column has a specified width.  When columns are variable width (i.e.\n     *  have an * or % of the viewport) then we try to calculate so that things fit in.  The problem is that\n     *  we have multiple render containers, and we don't want one render container to just take the whole viewport\n     *  when it doesn't need to - we want things to balance out across the render containers.\n     *\n     *  To do this, we use this method to calculate all the renderContainers, recognising that in a given render\n     *  cycle it'll get called once per render container, so it needs to return the same values each time.\n     *\n     *  The constraints on this method are therefore:\n     *  - must return the same value when called multiple times, to do this it needs to rely on properties of the\n     *    columns, but not properties that change when this is called (so it shouldn't rely on drawnWidth)\n     *\n     *  The general logic of this method is:\n     *  - calculate our total available width\n     *  - look at all the columns across all render containers, and work out which have widths and which have\n     *    constraints such as % or * or something else\n     *  - for those with *, count the total number of * we see and add it onto a running total, add this column to an * array\n     *  - for those with a %, allocate the % as a percentage of the viewport, having consideration of min and max\n     *  - for those with manual width (in pixels) we set the drawnWidth to the specified width\n     *  - we end up with an asterisks array still to process\n     *  - we look at our remaining width.  If it's greater than zero, we divide it up among the asterisk columns, then process\n     *    them for min and max width constraints\n     *  - if it's zero or less, we set the asterisk columns to their minimum widths\n     *  - we use parseInt quite a bit, as we try to make all our column widths integers\n     */\n  GridRenderContainer.prototype.updateColumnWidths = function () {\n    var self = this;\n\n    var asterisksArray = [],\n        asteriskNum = 0,\n        usedWidthSum = 0,\n        ret = '',\n        pinRightColumn = false,\n        fixedNumberArray = [],\n        percentageArray = [],\n        totalPercentage = 0;\n\n    // Get the width of the viewport\n    var availableWidth = self.grid.getViewportWidth() - self.grid.scrollbarWidth;\n\n    // get all the columns across all render containers, we have to calculate them all or one render container\n    // could consume the whole viewport\n    var columnCache = [];\n    angular.forEach(self.grid.renderContainers, function (container) {\n      columnCache = columnCache.concat(container.visibleColumnCache);\n    });\n\n    // look at each column, process any manual values or %, put the * into an array to look at later\n    columnCache.forEach(function (column) {\n      var width = 0;\n      // Skip hidden columns\n      if (!column.visible) { return; }\n\n      if (!pinRightColumn && column.colDef.pinnedRight) {\n        pinRightColumn = true;\n      }\n\n      if (pinRightColumn) {\n        availableWidth += self.grid.scrollbarWidth;\n      }\n\n      if (angular.isNumber(column.width)) {\n        // pixel width, set to this value\n        if (column.colDef.allowFloatWidth) {\n          width = parseFloat(column.width);\n        } else {\n          width = parseInt(column.width, 10);\n        }\n\n        usedWidthSum = usedWidthSum + width;\n        column.drawnWidth = width;\n\n        fixedNumberArray.push(column);\n      } else if (gridUtil.endsWith(column.width, '%')) {\n        // percentage width, set to percentage of the viewport\n        // round down to int - some browsers don't play nice with float maxWidth\n        var percentageIntegerValue = parseInt(column.width.replace(/%/g, ''), 10);\n        if (column.colDef.allowFloatWidth) {\n          width = parseFloat(percentageIntegerValue / 100 * availableWidth);\n        } else {\n          width = parseInt(percentageIntegerValue / 100 * availableWidth, 10);\n        }\n\n\n        if (width > column.maxWidth) {\n          width = column.maxWidth;\n        }\n\n        if (width < column.minWidth) {\n          width = column.minWidth;\n        }\n\n        usedWidthSum = usedWidthSum + width;\n        column.drawnWidth = width;\n\n        totalPercentage = totalPercentage + percentageIntegerValue;\n        percentageArray.push(column);\n      } else if (angular.isString(column.width) && column.width.indexOf('*') !== -1) {\n        // is an asterisk column, the gridColumn already checked the string consists only of '****'\n        asteriskNum = asteriskNum + column.width.length;\n        asterisksArray.push(column);\n      }\n    });\n\n    // Get the remaining width (available width subtracted by the used widths sum)\n    var remainingWidth = availableWidth - usedWidthSum;\n\n    if (asterisksArray.length > 0) {\n      // the width that each asterisk value would be assigned (this can be negative)\n      var asteriskVal = remainingWidth / asteriskNum;\n\n      asterisksArray.forEach(function (column) {\n        var width = parseInt(column.width.length * asteriskVal, 10);\n\n        if (column.colDef.allowFloatWidth) {\n          width = parseFloat(column.width.length * asteriskVal);\n        }\n\n\n        if (width > column.maxWidth) {\n            width = column.maxWidth;\n        }\n\n        if (width < column.minWidth) {\n            width = column.minWidth;\n        }\n\n        usedWidthSum = usedWidthSum + width;\n        column.drawnWidth = width;\n      });\n    }\n\n    // If there are no columns with asterisk widths then check if there are any with % widths and\n    // use them as a fallback for adjusting column widths up or down if we have remaining grid width\n    // or need to claw some width back\n    var variableWidthColumnArray;\n    if (asterisksArray.length > 0) {\n      variableWidthColumnArray = asterisksArray;\n    } else if (percentageArray.length > 0 && fixedNumberArray.length === 0 && totalPercentage === 100) {\n      variableWidthColumnArray = percentageArray;\n    }\n\n    if (!angular.isUndefined(variableWidthColumnArray)) {\n      // If the grid width didn't divide evenly into the column widths and we have pixels left over, or our\n      // calculated widths would have the grid narrower than the available space,\n      // dole the remainder out one by one to make everything fit\n      var processColumnUpwards = function (column) {\n        if (column.drawnWidth < column.maxWidth && leftoverWidth > 0) {\n          column.drawnWidth++;\n          usedWidthSum++;\n          leftoverWidth--;\n          columnsToChange = true;\n        }\n      };\n\n      var leftoverWidth = availableWidth - usedWidthSum;\n      var columnsToChange = true;\n\n      while (leftoverWidth > 0 && columnsToChange) {\n        columnsToChange = false;\n        variableWidthColumnArray.forEach(processColumnUpwards);\n      }\n\n      // We can end up with too much width even though some columns aren't at their max width, in this situation\n      // we can trim the columns a little\n      var processColumnDownwards = function (column) {\n        if (column.drawnWidth > column.minWidth && excessWidth > 0) {\n          column.drawnWidth--;\n          usedWidthSum--;\n          excessWidth--;\n          columnsToChange = true;\n        }\n      };\n\n      var excessWidth = usedWidthSum - availableWidth;\n      columnsToChange = true;\n\n      while (excessWidth > 0 && columnsToChange) {\n        columnsToChange = false;\n        variableWidthColumnArray.forEach(processColumnDownwards);\n      }\n    }\n\n    // all that was across all the renderContainers, now we need to work out what that calculation decided for\n    // our renderContainer\n    var canvasWidth = 0;\n    self.visibleColumnCache.forEach(function(column) {\n      if ( column.visible ) {\n        canvasWidth = canvasWidth + column.drawnWidth;\n      }\n    });\n\n    // Build the CSS\n    columnCache.forEach(function (column) {\n      ret = ret + column.getColClassDefinition();\n    });\n\n    self.canvasWidth = canvasWidth;\n\n    // Return the styles back to buildStyles which pops them into the `customStyles` scope variable\n    // return ret;\n\n    // Set this render container's column styles so they can be used in style computation\n    this.columnStyles = ret;\n  };\n\n  GridRenderContainer.prototype.needsHScrollbarPlaceholder = function () {\n    var self = this,\n      containerBody;\n\n    if (self.name === 'left' || self.name === 'right' && !this.hasHScrollbar && !this.grid.disableScrolling) {\n      if (self.grid.options.enableHorizontalScrollbar === uiGridConstants.scrollbars.ALWAYS) {\n        return true;\n      }\n      containerBody = this.grid.element[0].querySelector('.ui-grid-render-container-body .ui-grid-viewport');\n      return containerBody.scrollWidth > containerBody.offsetWidth;\n    }\n    return false;\n  };\n\n  GridRenderContainer.prototype.getViewportStyle = function () {\n    var self = this;\n    var styles = {};\n    var scrollbarVisibility = {};\n\n    scrollbarVisibility[uiGridConstants.scrollbars.ALWAYS] = 'scroll';\n    scrollbarVisibility[uiGridConstants.scrollbars.WHEN_NEEDED] = 'auto';\n\n    self.hasHScrollbar = false;\n    self.hasVScrollbar = false;\n\n    if (self.grid.disableScrolling) {\n      styles['overflow-x'] = 'hidden';\n      styles['overflow-y'] = 'hidden';\n      return styles;\n    }\n\n    if (self.name === 'body') {\n      self.hasHScrollbar = self.grid.options.enableHorizontalScrollbar !== uiGridConstants.scrollbars.NEVER;\n      if (!self.grid.isRTL()) {\n        if (!self.grid.hasRightContainerColumns()) {\n          self.hasVScrollbar = self.grid.options.enableVerticalScrollbar !== uiGridConstants.scrollbars.NEVER;\n        }\n      }\n      else {\n        if (!self.grid.hasLeftContainerColumns()) {\n          self.hasVScrollbar = self.grid.options.enableVerticalScrollbar !== uiGridConstants.scrollbars.NEVER;\n        }\n      }\n    }\n    else if (self.name === 'left') {\n      self.hasVScrollbar = self.grid.isRTL() ? self.grid.options.enableVerticalScrollbar !== uiGridConstants.scrollbars.NEVER : false;\n    }\n    else {\n      self.hasVScrollbar = !self.grid.isRTL() ? self.grid.options.enableVerticalScrollbar !== uiGridConstants.scrollbars.NEVER : false;\n    }\n\n    styles['overflow-x'] = self.hasHScrollbar ? scrollbarVisibility[self.grid.options.enableHorizontalScrollbar] : 'hidden';\n    styles['overflow-y'] = self.hasVScrollbar ? scrollbarVisibility[self.grid.options.enableVerticalScrollbar] : 'hidden';\n\n    return styles;\n  };\n\n  return GridRenderContainer;\n}]);\n\n})();\n\n(function() {\n\nangular.module('ui.grid')\n.factory('GridRow', ['gridUtil', 'uiGridConstants', function(gridUtil, uiGridConstants) {\n\n   /**\n   * @class GridRow\n   * @ngdoc function\n   * @name ui.grid.class:GridRow\n   * @description GridRow is the viewModel for one logical row on the grid.  A grid Row is not necessarily a one-to-one\n   * relation to gridOptions.data.\n   * @param {object} entity the array item from GridOptions.data\n   * @param {number} index the current position of the row in the array\n   * @param {Grid} grid reference to the parent grid\n   */\n  function GridRow(entity, index, grid) {\n\n     /**\n      *  @ngdoc object\n      *  @name grid\n      *  @propertyOf  ui.grid.class:GridRow\n      *  @description A reference back to the grid\n      */\n     this.grid = grid;\n\n     /**\n      *  @ngdoc object\n      *  @name entity\n      *  @propertyOf  ui.grid.class:GridRow\n      *  @description A reference to an item in gridOptions.data[]\n      */\n    this.entity = entity;\n\n    /**\n      *  @ngdoc object\n      *  @name index\n      *  @propertyOf  ui.grid.class:GridRow\n      *  @description The current position of the row in the array\n      */\n     this.index = index;\n\n     /**\n      *  @ngdoc object\n      *  @name uid\n      *  @propertyOf  ui.grid.class:GridRow\n      *  @description  UniqueId of row\n      */\n     this.uid = gridUtil.nextUid();\n\n     /**\n      *  @ngdoc object\n      *  @name visible\n      *  @propertyOf  ui.grid.class:GridRow\n      *  @description If true, the row will be rendered\n      */\n    // Default to true\n    this.visible = true;\n\n     /**\n      *  @ngdoc object\n      *  @name isSelected\n      *  @propertyOf  ui.grid.class:GridRow\n      *  @description Marks if the row has been selected\n      */\n     // Default to false\n     this.isSelected = false;\n\n\n    this.$$height = grid.options.rowHeight;\n\n  }\n\n    /**\n     *  @ngdoc object\n     *  @name height\n     *  @propertyOf ui.grid.class:GridRow\n     *  @description height of each individual row. changing the height will flag all\n     *  row renderContainers to recalculate their canvas height\n     */\n    Object.defineProperty(GridRow.prototype, 'height', {\n      get: function() {\n        return this.$$height;\n      },\n      set: function(height) {\n        if (height !== this.$$height) {\n          this.grid.updateCanvasHeight();\n          this.$$height = height;\n        }\n      }\n    });\n\n  /**\n   * @ngdoc function\n   * @name getQualifiedColField\n   * @methodOf ui.grid.class:GridRow\n   * @description returns the qualified field name as it exists on scope\n   * ie: row.entity.fieldA\n   * @param {GridColumn} col column instance\n   * @returns {string} resulting name that can be evaluated on scope\n   */\n    GridRow.prototype.getQualifiedColField = function(col) {\n      return 'row.' + this.getEntityQualifiedColField(col);\n    };\n\n    /**\n     * @ngdoc function\n     * @name getEntityQualifiedColField\n     * @methodOf ui.grid.class:GridRow\n     * @description returns the qualified field name minus the row path\n     * ie: entity.fieldA\n     * @param {GridColumn} col column instance\n     * @returns {string} resulting name that can be evaluated against a row\n     */\n  GridRow.prototype.getEntityQualifiedColField = function(col) {\n    var base = 'entity';\n    if ( col.field === uiGridConstants.ENTITY_BINDING ) {\n      return base;\n    }\n    return gridUtil.preEval(base + '.' + col.field);\n  };\n\n\n  /**\n   * @ngdoc function\n   * @name setRowInvisible\n   * @methodOf  ui.grid.class:GridRow\n   * @description Sets an override on the row that forces it to always\n   * be invisible. Emits the rowsVisibleChanged event if it changed the row visibility.\n   *\n   * This method can be called from the api, passing in the gridRow we want\n   * altered.  It should really work by calling gridRow.setRowInvisible, but that's\n   * not the way I coded it, and too late to change now.  Changed to just call\n   * the internal function row.setThisRowInvisible().\n   *\n   * @param {GridRow} row the row we want to set to invisible\n   *\n   */\n  GridRow.prototype.setRowInvisible = function ( row ) {\n    if (row && row.setThisRowInvisible) {\n      row.setThisRowInvisible( 'user' );\n    }\n  };\n\n\n  /**\n   * @ngdoc function\n   * @name clearRowInvisible\n   * @methodOf  ui.grid.class:GridRow\n   * @description Clears an override on the row that forces it to always\n   * be invisible. Emits the rowsVisibleChanged event if it changed the row visibility.\n   *\n   * This method can be called from the api, passing in the gridRow we want\n   * altered.  It should really work by calling gridRow.clearRowInvisible, but that's\n   * not the way I coded it, and too late to change now.  Changed to just call\n   * the internal function row.clearThisRowInvisible().\n   *\n   * @param {GridRow} row the row we want to clear the invisible flag\n   *\n   */\n  GridRow.prototype.clearRowInvisible = function ( row ) {\n    if (row && row.clearThisRowInvisible) {\n      row.clearThisRowInvisible( 'user' );\n    }\n  };\n\n\n  /**\n   * @ngdoc function\n   * @name setThisRowInvisible\n   * @methodOf  ui.grid.class:GridRow\n   * @description Sets an override on the row that forces it to always\n   * be invisible. Emits the rowsVisibleChanged event if it changed the row visibility\n   *\n   * @param {string} reason the reason (usually the module) for the row to be invisible.\n   * E.g. grouping, user, filter\n   * @param {boolean} fromRowsProcessor whether we were called from a rowsProcessor, passed through to evaluateRowVisibility\n   */\n  GridRow.prototype.setThisRowInvisible = function ( reason, fromRowsProcessor ) {\n    if ( !this.invisibleReason ) {\n      this.invisibleReason = {};\n    }\n    this.invisibleReason[reason] = true;\n    this.evaluateRowVisibility( fromRowsProcessor);\n  };\n\n\n  /**\n   * @ngdoc function\n   * @name clearRowInvisible\n   * @methodOf ui.grid.class:GridRow\n   * @description Clears any override on the row visibility, returning it\n   * to normal visibility calculations.  Emits the rowsVisibleChanged\n   * event\n   *\n   * @param {string} reason the reason (usually the module) for the row to be invisible.\n   * E.g. grouping, user, filter\n   * @param {boolean} fromRowsProcessor whether we were called from a rowsProcessor, passed through to evaluateRowVisibility\n   */\n  GridRow.prototype.clearThisRowInvisible = function ( reason, fromRowsProcessor ) {\n    if (typeof(this.invisibleReason) !== 'undefined' ) {\n      delete this.invisibleReason[reason];\n    }\n    this.evaluateRowVisibility( fromRowsProcessor );\n  };\n\n\n  /**\n   * @ngdoc function\n   * @name evaluateRowVisibility\n   * @methodOf ui.grid.class:GridRow\n   * @description Determines whether the row should be visible based on invisibleReason,\n   * and if it changes the row visibility, then emits the rowsVisibleChanged event.\n   *\n   * Queues a grid refresh, but doesn't call it directly to avoid hitting lots of grid refreshes.\n   * @param {boolean} fromRowProcessor if true, then it won't raise events or queue the refresh, the\n   * row processor does that already\n   */\n  GridRow.prototype.evaluateRowVisibility = function ( fromRowProcessor ) {\n    var newVisibility = true;\n    if ( typeof(this.invisibleReason) !== 'undefined' ) {\n      angular.forEach(this.invisibleReason, function( value, key ) {\n        if ( value ) {\n          newVisibility = false;\n        }\n      });\n    }\n\n    if ( typeof(this.visible) === 'undefined' || this.visible !== newVisibility ) {\n      this.visible = newVisibility;\n      if ( !fromRowProcessor ) {\n        this.grid.queueGridRefresh();\n        this.grid.api.core.raise.rowsVisibleChanged(this);\n      }\n    }\n  };\n\n\n  return GridRow;\n}]);\n\n})();\n\n(function() {\n  'use strict';\n  /**\n   * @ngdoc object\n   * @name ui.grid.class:GridRowColumn\n   * @param {GridRow} row The row for this pair\n   * @param {GridColumn} column The column for this pair\n   * @description A row and column pair that represents the intersection of these two entities.\n   * Must be instantiated as a constructor using the `new` keyword.\n   */\n  angular.module('ui.grid')\n  .factory('GridRowColumn', ['$parse', '$filter',\n    function GridRowColumnFactory($parse, $filter) {\n      var GridRowColumn = function GridRowColumn(row, col) {\n        if ( !(this instanceof GridRowColumn)) {\n          throw \"Using GridRowColumn as a function insead of as a constructor. Must be called with `new` keyword\";\n        }\n\n        /**\n         * @ngdoc object\n         * @name row\n         * @propertyOf ui.grid.class:GridRowColumn\n         * @description {@link ui.grid.class:GridRow }\n         */\n        this.row = row;\n        /**\n         * @ngdoc object\n         * @name col\n         * @propertyOf ui.grid.class:GridRowColumn\n         * @description {@link ui.grid.class:GridColumn }\n         */\n        this.col = col;\n      };\n\n      /**\n       * @ngdoc function\n       * @name getIntersectionValueRaw\n       * @methodOf ui.grid.class:GridRowColumn\n       * @description Gets the intersection of where the row and column meet.\n       * @returns {String|Number|Object} The value from the grid data that this GridRowColumn points too.\n       *          If the column has a cellFilter this will NOT return the filtered value.\n       */\n      GridRowColumn.prototype.getIntersectionValueRaw = function() {\n        var getter = $parse(this.row.getEntityQualifiedColField(this.col));\n        var context = this.row;\n        return getter(context);\n      };\n      return GridRowColumn;\n    }\n  ]);\n})();\n\n(function () {\n  angular.module('ui.grid')\n    .factory('ScrollEvent', ['gridUtil', function (gridUtil) {\n\n      /**\n       * @ngdoc function\n       * @name ui.grid.class:ScrollEvent\n       * @description Model for all scrollEvents\n       * @param {Grid} grid that owns the scroll event\n       * @param {GridRenderContainer} sourceRowContainer that owns the scroll event. Can be null\n       * @param {GridRenderContainer} sourceColContainer that owns the scroll event. Can be null\n       * @param {string} source the source of the event - from uiGridConstants.scrollEventSources or a string value of directive/service/factory.functionName\n       */\n      function ScrollEvent(grid, sourceRowContainer, sourceColContainer, source) {\n        var self = this;\n        if (!grid) {\n          throw new Error(\"grid argument is required\");\n        }\n\n        /**\n         *  @ngdoc object\n         *  @name grid\n         *  @propertyOf  ui.grid.class:ScrollEvent\n         *  @description A reference back to the grid\n         */\n         self.grid = grid;\n\n\n\n        /**\n         *  @ngdoc object\n         *  @name source\n         *  @propertyOf  ui.grid.class:ScrollEvent\n         *  @description the source of the scroll event. limited to values from uiGridConstants.scrollEventSources\n         */\n        self.source = source;\n\n\n        /**\n         *  @ngdoc object\n         *  @name noDelay\n         *  @propertyOf  ui.grid.class:ScrollEvent\n         *  @description most scroll events from the mouse or trackpad require delay to operate properly\n         *  set to false to eliminate delay.  Useful for scroll events that the grid causes, such as scrolling to make a row visible.\n         */\n        self.withDelay = true;\n\n        self.sourceRowContainer = sourceRowContainer;\n        self.sourceColContainer = sourceColContainer;\n\n        self.newScrollLeft = null;\n        self.newScrollTop = null;\n        self.x = null;\n        self.y = null;\n\n        self.verticalScrollLength = -9999999;\n        self.horizontalScrollLength = -999999;\n\n        self.type = 'scroll';\n\n        /**\n         *  @ngdoc function\n         *  @name fireThrottledScrollingEvent\n         *  @methodOf  ui.grid.class:ScrollEvent\n         *  @description fires a throttled event using grid.api.core.raise.scrollEvent\n         */\n        self.fireThrottledScrollingEvent = gridUtil.throttle(function(sourceContainerId) {\n          self.grid.scrollContainers(sourceContainerId, self);\n        }, self.grid.options.wheelScrollThrottle, {trailing: true});\n\n      }\n\n\n      /**\n       *  @ngdoc function\n       *  @name getNewScrollLeft\n       *  @methodOf  ui.grid.class:ScrollEvent\n       *  @description returns newScrollLeft property if available; calculates a new value if it isn't\n       */\n      ScrollEvent.prototype.getNewScrollLeft = function(colContainer, viewport) {\n        var self = this;\n\n        if (!self.newScrollLeft) {\n          var scrollWidth = (colContainer.getCanvasWidth() - colContainer.getViewportWidth());\n\n          var oldScrollLeft = gridUtil.normalizeScrollLeft(viewport, self.grid);\n\n          var scrollXPercentage;\n          if (typeof(self.x.percentage) !== 'undefined' && self.x.percentage !== undefined) {\n            scrollXPercentage = self.x.percentage;\n          }\n          else if (typeof(self.x.pixels) !== 'undefined' && self.x.pixels !== undefined) {\n            scrollXPercentage = self.x.percentage = (oldScrollLeft + self.x.pixels) / scrollWidth;\n          }\n          else {\n            throw new Error(\"No percentage or pixel value provided for scroll event X axis\");\n          }\n\n          return Math.max(0, scrollXPercentage * scrollWidth);\n        }\n\n        return self.newScrollLeft;\n      };\n\n\n      /**\n       *  @ngdoc function\n       *  @name getNewScrollTop\n       *  @methodOf  ui.grid.class:ScrollEvent\n       *  @description returns newScrollTop property if available; calculates a new value if it isn't\n       */\n      ScrollEvent.prototype.getNewScrollTop = function(rowContainer, viewport) {\n        var self = this;\n\n\n        if (!self.newScrollTop) {\n          var scrollLength = rowContainer.getVerticalScrollLength();\n\n          var oldScrollTop = viewport[0].scrollTop;\n\n          var scrollYPercentage;\n          if (typeof(self.y.percentage) !== 'undefined' && self.y.percentage !== undefined) {\n            scrollYPercentage = self.y.percentage;\n          }\n          else if (typeof(self.y.pixels) !== 'undefined' && self.y.pixels !== undefined) {\n            scrollYPercentage = self.y.percentage = (oldScrollTop + self.y.pixels) / scrollLength;\n          }\n          else {\n            throw new Error(\"No percentage or pixel value provided for scroll event Y axis\");\n          }\n\n          return Math.max(0, scrollYPercentage * scrollLength);\n        }\n\n        return self.newScrollTop;\n      };\n\n      ScrollEvent.prototype.atTop = function(scrollTop) {\n        return (this.y && (this.y.percentage === 0 || this.verticalScrollLength < 0) && scrollTop === 0);\n      };\n\n      ScrollEvent.prototype.atBottom = function(scrollTop) {\n        return (this.y && (this.y.percentage === 1 || this.verticalScrollLength === 0) && scrollTop > 0);\n      };\n\n      ScrollEvent.prototype.atLeft = function(scrollLeft) {\n        return (this.x && (this.x.percentage === 0 || this.horizontalScrollLength < 0) && scrollLeft === 0);\n      };\n\n      ScrollEvent.prototype.atRight = function(scrollLeft) {\n        return (this.x && (this.x.percentage === 1 || this.horizontalScrollLength ===0) && scrollLeft > 0);\n      };\n\n\n      ScrollEvent.Sources = {\n        ViewPortScroll: 'ViewPortScroll',\n        RenderContainerMouseWheel: 'RenderContainerMouseWheel',\n        RenderContainerTouchMove: 'RenderContainerTouchMove',\n        Other: 99\n      };\n\n      return ScrollEvent;\n    }]);\n\n\n\n})();\n\n(function () {\n  'use strict';\n  /**\n   *  @ngdoc object\n   *  @name ui.grid.service:gridClassFactory\n   *\n   *  @description factory to return dom specific instances of a grid\n   *\n   */\n  angular.module('ui.grid').service('gridClassFactory', ['gridUtil', '$q', '$compile', '$templateCache', 'uiGridConstants', 'Grid', 'GridColumn', 'GridRow',\n    function (gridUtil, $q, $compile, $templateCache, uiGridConstants, Grid, GridColumn, GridRow) {\n\n      var service = {\n        /**\n         * @ngdoc method\n         * @name createGrid\n         * @methodOf ui.grid.service:gridClassFactory\n         * @description Creates a new grid instance. Each instance will have a unique id\n         * @param {object} options An object map of options to pass into the created grid instance.\n         * @returns {Grid} grid\n         */\n        createGrid : function(options) {\n          options = (typeof(options) !== 'undefined') ? options : {};\n          options.id = gridUtil.newId();\n          var grid = new Grid(options);\n\n          // NOTE/TODO: rowTemplate should always be defined...\n          if (grid.options.rowTemplate) {\n            var rowTemplateFnPromise = $q.defer();\n            grid.getRowTemplateFn = rowTemplateFnPromise.promise;\n\n            gridUtil.getTemplate(grid.options.rowTemplate)\n              .then(\n                function (template) {\n                  var rowTemplateFn = $compile(template);\n                  rowTemplateFnPromise.resolve(rowTemplateFn);\n                },\n                function () {\n                  // Todo handle response error here?\n                  throw new Error(\"Couldn't fetch/use row template '\" + grid.options.rowTemplate + \"'\");\n                }).catch(angular.noop);\n          }\n\n          grid.registerColumnBuilder(service.defaultColumnBuilder);\n\n          // Row builder for custom row templates\n          grid.registerRowBuilder(service.rowTemplateAssigner);\n\n          // Reset all rows to visible initially\n          grid.registerRowsProcessor(function allRowsVisible(rows) {\n            rows.forEach(function (row) {\n              row.evaluateRowVisibility( true );\n            });\n\n            return rows;\n          }, 50);\n\n          grid.registerColumnsProcessor(function applyColumnVisibility(columns) {\n            columns.forEach(function (column) {\n              column.visible = angular.isDefined(column.colDef.visible) ? column.colDef.visible : true;\n            });\n\n            return columns;\n          }, 50);\n\n          grid.registerRowsProcessor(grid.searchRows, 100);\n\n          // Register the default row processor, it sorts rows by selected columns\n          if (grid.options.externalSort && angular.isFunction(grid.options.externalSort)) {\n            grid.registerRowsProcessor(grid.options.externalSort, 200);\n          }\n          else {\n            grid.registerRowsProcessor(grid.sortByColumn, 200);\n          }\n\n          return grid;\n        },\n\n        /**\n         * @ngdoc function\n         * @name defaultColumnBuilder\n         * @methodOf ui.grid.service:gridClassFactory\n         * @description Processes designTime column definitions and applies them to col for the\n         *              core grid features\n         * @param {object} colDef reference to column definition\n         * @param {GridColumn} col reference to gridCol\n         * @param {object} gridOptions reference to grid options\n         */\n        defaultColumnBuilder: function (colDef, col, gridOptions) {\n\n          var templateGetPromises = [];\n\n          // Abstracts the standard template processing we do for every template type.\n          var processTemplate = function( templateType, providedType, defaultTemplate, filterType, tooltipType ) {\n            if ( !colDef[templateType] ) {\n              col[providedType] = defaultTemplate;\n            } else {\n              col[providedType] = colDef[templateType];\n            }\n\n            var templatePromise = gridUtil.getTemplate(col[providedType])\n              .then(\n                function (template) {\n                  if ( angular.isFunction(template) ) { template = template(); }\n                  var tooltipCall = ( tooltipType === 'cellTooltip' )\n                      ? 'col.cellTooltip(row,col)'\n                      : 'col.headerTooltip(col)';\n                  if ( tooltipType && col[tooltipType] === false ) {\n                    template = template.replace(uiGridConstants.TOOLTIP, '');\n                  } else if ( tooltipType && col[tooltipType] ) {\n                    template = template.replace(uiGridConstants.TOOLTIP, 'title=\"{{' + tooltipCall + ' CUSTOM_FILTERS }}\"');\n                  }\n\n                  if ( filterType ) {\n                    template = template.replace(uiGridConstants.CUSTOM_FILTERS, function() {\n                      return col[filterType] ? \"|\" + col[filterType] : \"\";\n                    });\n                  }\n                  return gridUtil.postProcessTemplate(template).then(function(template) {\n                    col[templateType] = template;\n                  });\n                },\n                function () {\n                  throw new Error(\"Couldn't fetch/use colDef.\" + templateType + \" '\" + colDef[templateType] + \"'\");\n                }).catch(angular.noop);\n\n            templateGetPromises.push(templatePromise);\n\n            return templatePromise;\n          };\n\n\n          /**\n           * @ngdoc property\n           * @name cellTemplate\n           * @propertyOf ui.grid.class:GridOptions.columnDef\n           * @description a custom template for each cell in this column.  The default\n           * is ui-grid/uiGridCell.  If you are using the cellNav feature, this template\n           * must contain a div that can receive focus.\n           *\n           */\n          col.cellTemplatePromise = processTemplate( 'cellTemplate', 'providedCellTemplate', 'ui-grid/uiGridCell', 'cellFilter', 'cellTooltip' );\n\n          /**\n           * @ngdoc property\n           * @name headerCellTemplate\n           * @propertyOf ui.grid.class:GridOptions.columnDef\n           * @description a custom template for the header for this column.  The default\n           * is ui-grid/uiGridHeaderCell\n           *\n           */\n          col.headerCellTemplatePromise = processTemplate( 'headerCellTemplate', 'providedHeaderCellTemplate', 'ui-grid/uiGridHeaderCell', 'headerCellFilter', 'headerTooltip' );\n\n          /**\n           * @ngdoc property\n           * @name footerCellTemplate\n           * @propertyOf ui.grid.class:GridOptions.columnDef\n           * @description a custom template for the footer for this column.  The default\n           * is ui-grid/uiGridFooterCell\n           *\n           */\n          col.footerCellTemplatePromise = processTemplate( 'footerCellTemplate', 'providedFooterCellTemplate', 'ui-grid/uiGridFooterCell', 'footerCellFilter' );\n\n          /**\n           * @ngdoc property\n           * @name filterHeaderTemplate\n           * @propertyOf ui.grid.class:GridOptions.columnDef\n           * @description a custom template for the filter input.  The default is ui-grid/ui-grid-filter\n           *\n           */\n          col.filterHeaderTemplatePromise = processTemplate( 'filterHeaderTemplate', 'providedFilterHeaderTemplate', 'ui-grid/ui-grid-filter' );\n\n          // Create a promise for the compiled element function\n          col.compiledElementFnDefer = $q.defer();\n\n          return $q.all(templateGetPromises);\n        },\n\n        rowTemplateAssigner: function rowTemplateAssigner(row) {\n          var grid = this;\n\n          // Row has no template assigned to it\n          if (!row.rowTemplate) {\n            // Use the default row template from the grid\n            row.rowTemplate = grid.options.rowTemplate;\n\n            // Use the grid's function for fetching the compiled row template function\n            row.getRowTemplateFn = grid.getRowTemplateFn;\n          }\n          // Row has its own template assigned\n          else {\n            // Create a promise for the compiled row template function\n            var perRowTemplateFnPromise = $q.defer();\n            row.getRowTemplateFn = perRowTemplateFnPromise.promise;\n\n            // Get the row template\n            gridUtil.getTemplate(row.rowTemplate)\n              .then(function (template) {\n                // Compile the template\n                var rowTemplateFn = $compile(template);\n\n                // Resolve the compiled template function promise\n                perRowTemplateFnPromise.resolve(rowTemplateFn);\n              },\n              function () {\n                // Todo handle response error here?\n                throw new Error(\"Couldn't fetch/use row template '\" + row.rowTemplate + \"'\");\n              });\n          }\n\n          return row.getRowTemplateFn;\n        }\n      };\n\n      // class definitions (moved to separate factories)\n\n      return service;\n    }]);\n\n})();\n\n(function() {\n\nvar module = angular.module('ui.grid');\n\nfunction escapeRegExp(str) {\n  // based on https://github.com/sindresorhus/escape-string-regexp\n  // Escape characters with special meaning either inside or outside character sets.\n  // Use a simple backslash escape when it’s always valid, and a `\\xnn` escape when the simpler form would be disallowed by Unicode patterns’ stricter grammar.\n  return str.replace(/[|\\\\{}()[\\]^$+?*.]/g, '\\\\$&').replace(/-/g, '\\\\x2d');\n}\n\n\n/**\n *  @ngdoc service\n *  @name ui.grid.service:rowSearcher\n *\n *  @description Service for searching/filtering rows based on column value conditions.\n */\nmodule.service('rowSearcher', ['gridUtil', 'uiGridConstants', function (gridUtil, uiGridConstants) {\n  var defaultCondition = uiGridConstants.filter.CONTAINS;\n\n  var rowSearcher = {};\n\n  /**\n   * @ngdoc function\n   * @name getTerm\n   * @methodOf ui.grid.service:rowSearcher\n   * @description Get the term from a filter\n   * Trims leading and trailing whitespace\n   * @param {object} filter object to use\n   * @returns {object} Parsed term\n   */\n  rowSearcher.getTerm = function getTerm(filter) {\n    if (typeof(filter.term) === 'undefined') { return filter.term; }\n\n    var term = filter.term;\n\n    // Strip leading and trailing whitespace if the term is a string\n    if (typeof(term) === 'string') {\n      term = term.trim();\n    }\n\n    return term;\n  };\n\n  /**\n   * @ngdoc function\n   * @name stripTerm\n   * @methodOf ui.grid.service:rowSearcher\n   * @description Remove leading and trailing asterisk (*) from the filter's term\n   * @param {object} filter object to use\n   * @returns {uiGridConstants.filter<int>} Value representing the condition constant value\n   */\n  rowSearcher.stripTerm = function stripTerm(filter) {\n    var term = rowSearcher.getTerm(filter);\n\n    if (typeof(term) === 'string') {\n      return escapeRegExp(term.replace(/(^\\*|\\*$)/g, ''));\n    }\n    else {\n      return term;\n    }\n  };\n\n\n  /**\n   * @ngdoc function\n   * @name guessCondition\n   * @methodOf ui.grid.service:rowSearcher\n   * @description Guess the condition for a filter based on its term\n   * <br>\n   * Defaults to STARTS_WITH. Uses CONTAINS for strings beginning and ending with *s (*bob*).\n   * Uses STARTS_WITH for strings ending with * (bo*). Uses ENDS_WITH for strings starting with * (*ob).\n   * @param {object} filter object to use\n   * @returns {uiGridConstants.filter<int>} Value representing the condition constant value\n   */\n  rowSearcher.guessCondition = function guessCondition(filter) {\n    if (typeof(filter.term) === 'undefined' || !filter.term) {\n      return defaultCondition;\n    }\n\n    var term = rowSearcher.getTerm(filter);\n\n    if (/\\*/.test(term)) {// this would check only start and end -> /^\\*|\\*$/\n      var regexpFlags = (!filter.flags || !filter.flags.caseSensitive) ? 'i' : '';\n      term = escapeRegExp(term);\n      var reText = term.replace(/\\\\\\*/g, '.*?');// this would check only start and end -> /^\\\\\\*|\\\\\\*$/g\n      return new RegExp('^' + reText + '$', regexpFlags);\n    }\n    // Otherwise default to default condition\n    else {\n      return defaultCondition;\n    }\n  };\n\n\n  /**\n   * @ngdoc function\n   * @name setupFilters\n   * @methodOf ui.grid.service:rowSearcher\n   * @description For a given columns filters (either col.filters, or [col.filter] can be passed in),\n   * do all the parsing and pre-processing and store that data into a new filters object.  The object\n   * has the condition, the flags, the stripped term, and a parsed reg exp if there was one.\n   *\n   * We could use a forEach in here, since it's much less performance sensitive, but since we're using\n   * for loops everywhere else in this module...\n   *\n   * @param {array} filters the filters from the column (col.filters or [col.filter])\n   * @returns {array} An array of parsed/preprocessed filters\n   */\n  rowSearcher.setupFilters = function setupFilters( filters ) {\n    var newFilters = [];\n\n    for ( var i = 0; i < filters.length; i++ ) {\n      var filter = filters[i];\n\n      if ( filter.noTerm || !gridUtil.isNullOrUndefined(filter.term) ) {\n        var newFilter = {};\n\n        var regexpFlags = '';\n        if (!filter.flags || !filter.flags.caseSensitive) {\n          regexpFlags += 'i';\n        }\n\n        if ( !gridUtil.isNullOrUndefined(filter.term) ) {\n          // it is possible to have noTerm.\n          if ( filter.rawTerm ) {\n            newFilter.term = filter.term;\n          } else {\n            newFilter.term = rowSearcher.stripTerm(filter);\n          }\n        }\n\n        newFilter.noTerm = filter.noTerm;\n        newFilter.condition = filter.condition || rowSearcher.guessCondition(filter);\n        newFilter.flags = angular.extend( { caseSensitive: false, date: false }, filter.flags );\n\n        switch (newFilter.condition) {\n          case uiGridConstants.filter.STARTS_WITH:\n            newFilter.startswithRE = new RegExp('^' + newFilter.term, regexpFlags);\n            break;\n          case uiGridConstants.filter.ENDS_WITH:\n            newFilter.endswithRE = new RegExp(newFilter.term + '$', regexpFlags);\n            break;\n          case uiGridConstants.filter.EXACT:\n            newFilter.exactRE = new RegExp('^' + newFilter.term + '$', regexpFlags);\n            break;\n          case uiGridConstants.filter.CONTAINS:\n            newFilter.containsRE = new RegExp(newFilter.term, regexpFlags);\n            break;\n        }\n\n        newFilters.push(newFilter);\n      }\n    }\n    return newFilters;\n  };\n\n\n  /**\n   * @ngdoc function\n   * @name runColumnFilter\n   * @methodOf ui.grid.service:rowSearcher\n   * @description Runs a single pre-parsed filter against a cell, returning true\n   * if the cell matches that one filter.\n   *\n   * @param {Grid} grid the grid we're working against\n   * @param {GridRow} row the row we're matching against\n   * @param {GridColumn} column the column that we're working against\n   * @param {object} filter the specific, preparsed, filter that we want to test\n   * @returns {boolean} true if we match (row stays visible)\n   */\n  rowSearcher.runColumnFilter = function runColumnFilter(grid, row, column, filter) {\n    // Cache typeof condition\n    var conditionType = typeof(filter.condition);\n\n    // Term to search for.\n    var term = filter.term;\n\n    // Get the column value for this row\n    var value = column.filterCellFiltered ? grid.getCellDisplayValue(row, column) : grid.getCellValue(row, column);\n    if (value == void 0) {\n      value = \"\";\n    }\n\n    // If the filter's condition is a RegExp, then use it\n    if (filter.condition instanceof RegExp) {\n      return filter.condition.test(value);\n    }\n\n    // If the filter's condition is a function, run it\n    if (conditionType === 'function') {\n      return filter.condition(term, value, row, column);\n    }\n\n    if (filter.startswithRE) {\n      return filter.startswithRE.test(value);\n    }\n\n    if (filter.endswithRE) {\n      return filter.endswithRE.test(value);\n    }\n\n    if (filter.containsRE) {\n      return filter.containsRE.test(value);\n    }\n\n    if (filter.exactRE) {\n      return filter.exactRE.test(value);\n    }\n\n    if (filter.condition === uiGridConstants.filter.NOT_EQUAL) {\n      return !new RegExp('^' + term + '$').test(value);\n    }\n\n    if (typeof(value) === 'number' && typeof(term) === 'string' ) {\n      // if the term has a decimal in it, it comes through as '9\\.4', we need to take out the \\\n      // the same for negative numbers\n      // TODO: I suspect the right answer is to look at escapeRegExp at the top of this code file, maybe it's not needed?\n      var tempFloat = parseFloat(term.replace(/\\\\\\./,'.').replace(/\\\\\\-/,'-'));\n      if (!isNaN(tempFloat)) {\n        term = tempFloat;\n      }\n    }\n\n    if (filter.flags.date === true) {\n      value = new Date(value);\n      // If the term has a dash in it, it comes through as '\\-' -- we need to take out the '\\'.\n      term = new Date(term.replace(/\\\\/g, ''));\n    }\n\n    switch (filter.condition) {\n      case uiGridConstants.filter.GREATER_THAN:\n        return (value > term);\n      case uiGridConstants.filter.GREATER_THAN_OR_EQUAL:\n        return (value >= term);\n      case uiGridConstants.filter.LESS_THAN:\n        return (value < term);\n      case uiGridConstants.filter.LESS_THAN_OR_EQUAL:\n        return (value <= term);\n    }\n\n    return true;\n  };\n\n\n  /**\n   * @ngdoc boolean\n   * @name useExternalFiltering\n   * @propertyOf ui.grid.class:GridOptions\n   * @description False by default. When enabled, this setting suppresses the internal filtering.\n   * All UI logic will still operate, allowing filter conditions to be set and modified.\n   *\n   * The external filter logic can listen for the `filterChange` event, which fires whenever\n   * a filter has been adjusted.\n   */\n  /**\n   * @ngdoc function\n   * @name searchColumn\n   * @methodOf ui.grid.service:rowSearcher\n   * @description Process provided filters on provided column against a given row. If the row meets\n   * the conditions on all the filters, return true.\n   * @param {Grid} grid Grid to search in\n   * @param {GridRow} row Row to search on\n   * @param {GridColumn} column Column with the filters to use\n   * @param {array} filters array of pre-parsed/preprocessed filters to apply\n   * @returns {boolean} Whether the column matches or not.\n   */\n  rowSearcher.searchColumn = function searchColumn(grid, row, column, filters) {\n    if (grid.options.useExternalFiltering) {\n      return true;\n    }\n\n    for (var i = 0; i < filters.length; i++) {\n      var filter = filters[i];\n\n      if ( !gridUtil.isNullOrUndefined(filter.term) && filter.term !== '' || filter.noTerm ) {\n        if (!rowSearcher.runColumnFilter(grid, row, column, filter)) {\n          return false;\n        }\n      }\n    }\n\n    return true;\n  };\n\n\n  /**\n   * @ngdoc function\n   * @name search\n   * @methodOf ui.grid.service:rowSearcher\n   * @description Run a search across the given rows and columns, marking any rows that don't\n   * match the stored col.filters or col.filter as invisible.\n   * @param {Grid} grid Grid instance to search inside\n   * @param {Array[GridRow]} rows GridRows to filter\n   * @param {Array[GridColumn]} columns GridColumns with filters to process\n   */\n  rowSearcher.search = function search(grid, rows, columns) {\n    /*\n     * Added performance optimisations into this code base, as this logic creates deeply nested\n     * loops and is therefore very performance sensitive.  In particular, avoiding forEach as\n     * this impacts some browser optimisers (particularly Chrome), using iterators instead\n     */\n\n    // Don't do anything if we weren't passed any rows\n    if (!rows) {\n      return;\n    }\n\n    // don't filter if filtering currently disabled\n    if (!grid.options.enableFiltering) {\n      return rows;\n    }\n\n    // Build list of filters to apply\n    var filterData = [];\n\n    var hasTerm = function( filters ) {\n      var hasTerm = false;\n\n      filters.forEach( function (filter) {\n        if ( !gridUtil.isNullOrUndefined(filter.term) && filter.term !== '' || filter.noTerm ) {\n          hasTerm = true;\n        }\n      });\n\n      return hasTerm;\n    };\n\n    for (var i = 0; i < columns.length; i++) {\n      var col = columns[i];\n\n      if (typeof(col.filters) !== 'undefined' && hasTerm(col.filters) ) {\n        filterData.push( { col: col, filters: rowSearcher.setupFilters(col.filters) } );\n      }\n    }\n\n    if (filterData.length > 0) {\n      // define functions outside the loop, performance optimisation\n      var foreachRow = function(grid, row, col, filters) {\n        if ( row.visible && !rowSearcher.searchColumn(grid, row, col, filters) ) {\n          row.visible = false;\n        }\n      };\n\n      var foreachFilterCol = function(grid, filterData) {\n        for ( var i = 0; i < rows.length; i++) {\n          foreachRow(grid, rows[i], filterData.col, filterData.filters);\n        }\n      };\n\n      // nested loop itself - foreachFilterCol, which in turn calls foreachRow\n      for ( var j = 0; j < filterData.length; j++) {\n        foreachFilterCol( grid, filterData[j] );\n      }\n\n      if (grid.api.core.raise.rowsVisibleChanged) {\n        grid.api.core.raise.rowsVisibleChanged();\n      }\n\n      // drop any invisible rows\n      // keeping these, as needed with filtering for trees - we have to come back and make parent nodes visible if child nodes are selected in the filter\n      // rows = rows.filter(function(row) { return row.visible; });\n\n    }\n\n    return rows;\n  };\n\n  return rowSearcher;\n}]);\n\n})();\n\n(function() {\n\nvar module = angular.module('ui.grid');\n\n/**\n * @ngdoc object\n * @name ui.grid.class:rowSorter\n * @description rowSorter provides the default sorting mechanisms,\n * including guessing column types and applying appropriate sort\n * algorithms\n *\n */\n\nmodule.service('rowSorter', ['uiGridConstants', function (uiGridConstants) {\n  var rowSorter = {\n    // Cache of sorting functions. Once we create them, we don't want to keep re-doing it\n    //   this takes a piece of data from the cell and tries to determine its type and what sorting\n    //   function to use for it\n    colSortFnCache: {}\n  };\n\n\n  /**\n   * @ngdoc method\n   * @methodOf ui.grid.class:rowSorter\n   * @name guessSortFn\n   * @description Assigns a sort function to use based on the itemType in the column\n   * @param {string} itemType one of 'number', 'boolean', 'string', 'date', 'object'.  And\n   * error will be thrown for any other type.\n   * @returns {function} a sort function that will sort that type\n   */\n  rowSorter.guessSortFn = function guessSortFn(itemType) {\n    switch (itemType) {\n      case \"number\":\n        return rowSorter.sortNumber;\n      case \"numberStr\":\n        return rowSorter.sortNumberStr;\n      case \"boolean\":\n        return rowSorter.sortBool;\n      case \"string\":\n        return rowSorter.sortAlpha;\n      case \"date\":\n        return rowSorter.sortDate;\n      case \"object\":\n        return rowSorter.basicSort;\n      default:\n        throw new Error('No sorting function found for type: ' + itemType);\n    }\n  };\n\n\n  /**\n   * @ngdoc method\n   * @methodOf ui.grid.class:rowSorter\n   * @name handleNulls\n   * @description Sorts nulls and undefined to the bottom (top when\n   * descending).  Called by each of the internal sorters before\n   * attempting to sort.  Note that this method is available on the core api\n   * via gridApi.core.sortHandleNulls\n   * @param {object} a sort value a\n   * @param {object} b sort value b\n   * @returns {number} null if there were no nulls/undefineds, otherwise returns\n   * a sort value that should be passed back from the sort function\n   */\n  rowSorter.handleNulls = function handleNulls(a, b) {\n    // We want to allow zero values and false values to be evaluated in the sort function\n    if ((a == void 0) || (b == void 0)) {\n      // We want to force nulls and such to the bottom when we sort... which effectively is \"greater than\"\n      if ((a == void 0) && (b == void 0)) {\n        return 0;\n      }\n\n      if (a == void 0) {\n        return 1;\n      }\n      return -1;// b == void 0\n    }\n    return null;\n  };\n\n\n  /**\n   * @ngdoc method\n   * @methodOf ui.grid.class:rowSorter\n   * @name basicSort\n   * @description Sorts any values that provide the < method, including strings\n   * or numbers.  Handles nulls and undefined through calling handleNulls\n   * @param {object} a sort value a\n   * @param {object} b sort value b\n   * @returns {number} normal sort function, returns -ve, 0, +ve\n   */\n  rowSorter.basicSort = function basicSort(a, b) {\n    var nulls = rowSorter.handleNulls(a, b);\n    if (nulls !== null) {\n      return nulls;\n    }\n\n    if (a === b) {\n      return 0;\n    }\n\n    if (a < b) {\n      return -1;\n    }\n    return 1;\n  };\n\n\n  /**\n   * @ngdoc method\n   * @methodOf ui.grid.class:rowSorter\n   * @name sortNumber\n   * @description Sorts numerical values.  Handles nulls and undefined through calling handleNulls\n   * @param {object} a sort value a\n   * @param {object} b sort value b\n   * @returns {number} normal sort function, returns -ve, 0, +ve\n   */\n  rowSorter.sortNumber = function sortNumber(a, b) {\n    var nulls = rowSorter.handleNulls(a, b);\n    return (nulls !== null) ? nulls : a - b;\n  };\n\n\n  function parseNumStr(numStr) {\n    if (/^\\s*-?Infinity\\s*$/.test(numStr)) { // check for positive or negative Infinity and return that\n      return parseFloat(numStr);\n    }\n    return parseFloat(numStr.replace(/[^0-9.eE-]/g, ''));\n  }\n\n\n  /**\n   * @ngdoc method\n   * @methodOf ui.grid.class:rowSorter\n   * @name sortNumberStr\n   * @description Sorts numerical values that are stored in a string (i.e. parses them to numbers first).\n   * Handles nulls and undefined through calling handleNulls\n   * @param {object} a sort value a\n   * @param {object} b sort value b\n   * @returns {number} normal sort function, returns -ve, 0, +ve\n   */\n  rowSorter.sortNumberStr = function sortNumberStr(a, b) {\n    var nulls = rowSorter.handleNulls(a, b);\n    if (nulls !== null) {\n      return nulls;\n    }\n\n    var numA = parseNumStr(a), // The parsed number form of 'a'\n        numB = parseNumStr(b); // The parsed number form of 'b'\n\n    // If 'a' couldn't be parsed to float, flag it as bad\n    var badA = isNaN(numA),\n        badB = isNaN(numB);\n\n    // We want bad ones to get pushed to the bottom... which effectively is \"greater than\"\n    if (badA || badB) {\n      return (badA && badB) ? 0 : (badA ? 1 : -1);\n    }\n\n    return numA - numB;\n  };\n\n\n  /**\n   * @ngdoc method\n   * @methodOf ui.grid.class:rowSorter\n   * @name sortAlpha\n   * @description Sorts string values. Handles nulls and undefined through calling handleNulls\n   * @param {object} a sort value a\n   * @param {object} b sort value b\n   * @returns {number} normal sort function, returns -ve, 0, +ve\n   */\n  rowSorter.sortAlpha = function sortAlpha(a, b) {\n    var nulls = rowSorter.handleNulls(a, b);\n    if (nulls !== null) {\n      return nulls;\n    }\n\n    var strA = a.toString().toLowerCase(),\n        strB = b.toString().toLowerCase();\n    return strA === strB ? 0 : strA.localeCompare(strB);\n  };\n\n\n  /**\n   * @ngdoc method\n   * @methodOf ui.grid.class:rowSorter\n   * @name sortDate\n   * @description Sorts date values. Handles nulls and undefined through calling handleNulls.\n   * Handles date strings by converting to Date object if not already an instance of Date\n   * @param {object} a sort value a\n   * @param {object} b sort value b\n   * @returns {number} normal sort function, returns -ve, 0, +ve\n   */\n  rowSorter.sortDate = function sortDate(a, b) {\n    var nulls = rowSorter.handleNulls(a, b);\n    if (nulls !== null) {\n      return nulls;\n    }\n\n    var timeA = (a instanceof Date) ? a.getTime() : new Date(a).getTime();\n    var timeB = (b instanceof Date) ? b.getTime() : new Date(b).getTime();\n    return timeA === timeB ? 0 : (timeA < timeB ? -1 : 1);\n  };\n\n\n  /**\n   * @ngdoc method\n   * @methodOf ui.grid.class:rowSorter\n   * @name sortBool\n   * @description Sorts boolean values, true is considered larger than false.\n   * Handles nulls and undefined through calling handleNulls\n   * @param {object} a sort value a\n   * @param {object} b sort value b\n   * @returns {number} normal sort function, returns -ve, 0, +ve\n   */\n  rowSorter.sortBool = function sortBool(a, b) {\n    var nulls = rowSorter.handleNulls(a, b);\n    if (nulls !== null) {\n      return nulls;\n    }\n\n    if ((a && b) || (!a && !b)) {\n      return 0;\n    }\n    return a ? 1 : -1;\n  };\n\n\n  /**\n   * @ngdoc method\n   * @methodOf ui.grid.class:rowSorter\n   * @name getSortFn\n   * @description Get the sort function for the column.  Looks first in\n   * rowSorter.colSortFnCache using the column name, failing that it\n   * looks at col.sortingAlgorithm (and puts it in the cache), failing that\n   * it guesses the sort algorithm based on the data type.\n   *\n   * The cache currently seems a bit pointless, as none of the work we do is\n   * processor intensive enough to need caching.  Presumably in future we might\n   * inspect the row data itself to guess the sort function, and in that case\n   * it would make sense to have a cache, the infrastructure is in place to allow\n   * that.\n   *\n   * @param {Grid} grid the grid to consider\n   * @param {GridColumn} col the column to find a function for\n   * @param {array} rows an array of grid rows.  Currently unused, but presumably in future\n   * we might inspect the rows themselves to decide what sort of data might be there\n   * @returns {function} the sort function chosen for the column\n   */\n  rowSorter.getSortFn = function getSortFn(col) {\n    // See if we already figured out what to use to sort the column and have it in the cache\n    if (rowSorter.colSortFnCache[col.colDef.name]) {\n      return rowSorter.colSortFnCache[col.colDef.name];\n    }\n    // If the column has its OWN sorting algorithm, use that\n    if (col.sortingAlgorithm != void 0) {\n      rowSorter.colSortFnCache[col.colDef.name] = col.sortingAlgorithm;\n      return col.sortingAlgorithm;\n    }\n    // Always default to sortAlpha when sorting after a cellFilter\n    if (col.sortCellFiltered && col.cellFilter) {\n      rowSorter.colSortFnCache[col.colDef.name] = rowSorter.sortAlpha;\n      return rowSorter.sortAlpha;\n    }\n\n    // Try and guess what sort function to use\n    // Guess the sort function\n    var sortFn = rowSorter.guessSortFn(col.colDef.type);\n\n    // If we found a sort function, cache it\n    if (sortFn) {\n      rowSorter.colSortFnCache[col.colDef.name] = sortFn;\n      return sortFn;\n    }\n    // We assign the alpha sort because anything that is null/undefined will never get passed to\n    // the actual sorting function. It will get caught in our null check and returned to be sorted\n    // down to the bottom\n    return rowSorter.sortAlpha;\n  };\n\n\n  /**\n   * @ngdoc method\n   * @methodOf ui.grid.class:rowSorter\n   * @name prioritySort\n   * @description Used where multiple columns are present in the sort criteria,\n   * we determine which column should take precedence in the sort by sorting\n   * the columns based on their sort.priority\n   *\n   * @param {gridColumn} a column a\n   * @param {gridColumn} b column b\n   * @returns {number} normal sort function, returns -ve, 0, +ve\n   */\n  rowSorter.prioritySort = function (a, b) {\n    // Both columns have a sort priority\n    if (a.sort && a.sort.priority !== undefined && b.sort && b.sort.priority !== undefined) {\n      // A is higher priority\n      if (a.sort.priority < b.sort.priority) {\n        return -1;\n      }\n      // Equal\n      if (a.sort.priority === b.sort.priority) {\n        return 0;\n      }\n      // B is higher\n      return 1;\n    }\n    // Only A has a priority\n    if (a.sort && a.sort.priority !== undefined) {\n      return -1;\n    }\n    // Only B has a priority\n    if (b.sort && b.sort.priority !== undefined) {\n      return 1;\n    }\n    // Neither has a priority\n    return 0;\n  };\n\n\n  /**\n   * @ngdoc object\n   * @name useExternalSorting\n   * @propertyOf ui.grid.class:GridOptions\n   * @description Prevents the internal sorting from executing.  Events will\n   * still be fired when the sort changes, and the sort information on\n   * the columns will be updated, allowing an external sorter (for example,\n   * server sorting) to be implemented.  Defaults to false.\n   *\n   */\n  /**\n   * @ngdoc method\n   * @methodOf ui.grid.class:rowSorter\n   * @name sort\n   * @description sorts the grid\n   * @param {Object} grid the grid itself\n   * @param {array} rows the rows to be sorted\n   * @param {array} columns the columns in which to look\n   * for sort criteria\n   * @returns {array} sorted rows\n   */\n  rowSorter.sort = function rowSorterSort(grid, rows, columns) {\n    // first make sure we are even supposed to do work\n    if (!rows) {\n      return;\n    }\n\n    if (grid.options.useExternalSorting) {\n      return rows;\n    }\n\n    // Build the list of columns to sort by\n    var sortCols = [];\n    var defaultSortCols = [];\n    columns.forEach(function (col) {\n      if (col.sort && !col.sort.ignoreSort && col.sort.direction && (col.sort.direction === uiGridConstants.ASC || col.sort.direction === uiGridConstants.DESC)) {\n        sortCols.push({\n          col: col,\n          sort: col.sort\n        });\n      } else if ( col.defaultSort && col.defaultSort.direction && (col.defaultSort.direction === uiGridConstants.ASC || col.defaultSort.direction === uiGridConstants.DESC) ) {\n        defaultSortCols.push({\n          col: col,\n          sort: col.defaultSort\n        });\n      }\n    });\n\n    // Sort the \"sort columns\" by their sort priority\n    sortCols = sortCols.sort(rowSorter.prioritySort);\n    defaultSortCols = defaultSortCols.sort(rowSorter.prioritySort);\n    sortCols = sortCols.concat(defaultSortCols);\n\n    // Now rows to sort by, maintain original order\n    if (sortCols.length === 0) {\n      return rows;\n    }\n\n    // Re-usable variables\n    var col, direction;\n\n    // put a custom index field on each row, used to make a stable sort out of unstable sorts (e.g. Chrome)\n    rows.forEach(function (row, idx) {\n      row.entity.$$uiGridIndex = idx;\n    });\n\n    // Now actually sort the data\n    var rowSortFn = function (rowA, rowB) {\n      var tem = 0,\n          idx = 0,\n          sortFn;\n\n      while (tem === 0 && idx < sortCols.length) {\n        // grab the metadata for the rest of the logic\n        col = sortCols[idx].col;\n        direction = sortCols[idx].sort.direction;\n\n        sortFn = rowSorter.getSortFn(col);\n\n        // Webpack's compress will hoist and combine propA, propB into one var and break sorting functionality\n        // Wrapping in function prevents that unexpected behavior\n        var props = getCellValues(grid, rowA, rowB, col);\n        tem = sortFn(props[0], props[1], rowA, rowB, direction, col);\n\n        idx++;\n      }\n\n      // Chrome doesn't implement a stable sort function.  If our sort returns 0\n      // (i.e. the items are equal), and we're at the last sort column in the list,\n      // then return the previous order using our custom\n      // index variable\n      if (tem === 0 ) {\n        return rowA.entity.$$uiGridIndex - rowB.entity.$$uiGridIndex;\n      }\n\n      // Made it this far, we don't have to worry about null & undefined\n      return (direction === uiGridConstants.ASC) ? tem : 0 - tem;\n    };\n\n    var newRows = rows.sort(rowSortFn);\n\n    // remove the custom index field on each row, used to make a stable sort out of unstable sorts (e.g. Chrome)\n    rows.forEach(function (row, idx) {\n      delete row.entity.$$uiGridIndex;\n    });\n\n    return newRows;\n  };\n\n  function getCellValues(grid, rowA, rowB, col) {\n    var propA, propB;\n\n    if ( col.sortCellFiltered ) {\n      propA = grid.getCellDisplayValue(rowA, col);\n      propB = grid.getCellDisplayValue(rowB, col);\n    } else {\n      propA = grid.getCellValue(rowA, col);\n      propB = grid.getCellValue(rowB, col);\n    }\n\n    return [propA, propB];\n  }\n\n  return rowSorter;\n}]);\n\n})();\n\n(function() {\n\nvar module = angular.module('ui.grid');\n\nvar bindPolyfill;\nif (typeof Function.prototype.bind !== \"function\") {\n  bindPolyfill = function() {\n    var slice = Array.prototype.slice;\n    return function(context) {\n      var fn = this,\n        args = slice.call(arguments, 1);\n      if (args.length) {\n        return function() {\n          return arguments.length ? fn.apply(context, args.concat(slice.call(arguments))) : fn.apply(context, args);\n        };\n      }\n      return function() {\n        return arguments.length ? fn.apply(context, arguments) : fn.call(context);\n      };\n    };\n  };\n}\n\nfunction  getStyles (elem) {\n  var e = elem;\n  if (typeof(e.length) !== 'undefined' && e.length) {\n    e = elem[0];\n  }\n\n  return e.ownerDocument.defaultView.getComputedStyle(e, null);\n}\n\nvar rnumnonpx = new RegExp( \"^(\" + (/[+-]?(?:\\d*\\.|)\\d+(?:[eE][+-]?\\d+|)/).source + \")(?!px)[a-z%]+$\", \"i\" ),\n    // swappable if display is none or starts with table except \"table\", \"table-cell\", or \"table-caption\"\n    // see here for display values: https://developer.mozilla.org/en-US/docs/CSS/display\n    rdisplayswap = /^(block|none|table(?!-c[ea]).+)/,\n    cssShow = { position: \"absolute\", visibility: \"hidden\", display: \"block\" };\n\nfunction augmentWidthOrHeight( elem, name, extra, isBorderBox, styles ) {\n  var i = extra === ( isBorderBox ? 'border' : 'content' ) ?\n          // If we already have the right measurement, avoid augmentation\n          4 :\n          // Otherwise initialize for horizontal or vertical properties\n          name === 'width' ? 1 : 0,\n\n          val = 0;\n\n  var sides = ['Top', 'Right', 'Bottom', 'Left'];\n\n  for ( ; i < 4; i += 2 ) {\n    var side = sides[i];\n    // dump('side', side);\n\n    // both box models exclude margin, so add it if we want it\n    if ( extra === 'margin' ) {\n      var marg = parseFloat(styles[extra + side]);\n      if (!isNaN(marg)) {\n        val += marg;\n      }\n    }\n    // dump('val1', val);\n\n    if ( isBorderBox ) {\n      // border-box includes padding, so remove it if we want content\n      if ( extra === 'content' ) {\n        var padd = parseFloat(styles['padding' + side]);\n        if (!isNaN(padd)) {\n          val -= padd;\n          // dump('val2', val);\n        }\n      }\n\n      // at this point, extra isn't border nor margin, so remove border\n      if ( extra !== 'margin' ) {\n        var bordermarg = parseFloat(styles['border' + side + 'Width']);\n        if (!isNaN(bordermarg)) {\n          val -= bordermarg;\n          // dump('val3', val);\n        }\n      }\n    }\n    else {\n      // at this point, extra isn't content, so add padding\n      var nocontentPad = parseFloat(styles['padding' + side]);\n      if (!isNaN(nocontentPad)) {\n        val += nocontentPad;\n        // dump('val4', val);\n      }\n\n      // at this point, extra isn't content nor padding, so add border\n      if ( extra !== 'padding') {\n        var nocontentnopad = parseFloat(styles['border' + side + 'Width']);\n        if (!isNaN(nocontentnopad)) {\n          val += nocontentnopad;\n          // dump('val5', val);\n        }\n      }\n    }\n  }\n\n  // dump('augVal', val);\n\n  return val;\n}\n\nfunction getWidthOrHeight( elem, name, extra ) {\n  // Start with offset property, which is equivalent to the border-box value\n  var valueIsBorderBox = true,\n          val, // = name === 'width' ? elem.offsetWidth : elem.offsetHeight,\n          styles = getStyles(elem),\n          isBorderBox = styles['boxSizing'] === 'border-box';\n\n  // some non-html elements return undefined for offsetWidth, so check for null/undefined\n  // svg - https://bugzilla.mozilla.org/show_bug.cgi?id=649285\n  // MathML - https://bugzilla.mozilla.org/show_bug.cgi?id=491668\n  if ( val <= 0 || val == null ) {\n    // Fall back to computed then uncomputed css if necessary\n    val = styles[name];\n    if ( val < 0 || val == null ) {\n      val = elem.style[ name ];\n    }\n\n    // Computed unit is not pixels. Stop here and return.\n    if ( rnumnonpx.test(val) ) {\n      return val;\n    }\n\n    // we need the check for style in case a browser which returns unreliable values\n    // for getComputedStyle silently falls back to the reliable elem.style\n    valueIsBorderBox = isBorderBox &&\n            ( true || val === elem.style[ name ] ); // use 'true' instead of 'support.boxSizingReliable()'\n\n    // Normalize \"\", auto, and prepare for extra\n    val = parseFloat( val ) || 0;\n  }\n\n  // use the active box-sizing model to add/subtract irrelevant styles\n  var ret = ( val +\n    augmentWidthOrHeight(\n      elem,\n      name,\n      extra || ( isBorderBox ? \"border\" : \"content\" ),\n      valueIsBorderBox,\n      styles\n    )\n  );\n\n  // dump('ret', ret, val);\n  return ret;\n}\n\nfunction getLineHeight(elm) {\n  elm = angular.element(elm)[0];\n  var parent = elm.parentElement;\n\n  if (!parent) {\n    parent = document.getElementsByTagName('body')[0];\n  }\n\n  return parseInt( getStyles(parent).fontSize ) || parseInt( getStyles(elm).fontSize ) || 16;\n}\n\nvar uid = ['0', '0', '0', '0'];\nvar uidPrefix = 'uiGrid-';\n\n/**\n *  @ngdoc service\n *  @name ui.grid.service:GridUtil\n *\n *  @description Grid utility functions\n */\nmodule.service('gridUtil', ['$log', '$window', '$document', '$http', '$templateCache', '$timeout', '$interval', '$injector', '$q', '$interpolate', 'uiGridConstants',\n  function ($log, $window, $document, $http, $templateCache, $timeout, $interval, $injector, $q, $interpolate, uiGridConstants) {\n  var s = {\n\n    augmentWidthOrHeight: augmentWidthOrHeight,\n\n    getStyles: getStyles,\n\n    /**\n     * @ngdoc method\n     * @name createBoundedWrapper\n     * @methodOf ui.grid.service:GridUtil\n     *\n     * @param {object} object to bind 'this' to\n     * @param {method} method to bind\n     * @returns {Function} The wrapper that performs the binding\n     *\n     * @description\n     * Binds given method to given object.\n     *\n     * By means of a wrapper, ensures that ``method`` is always bound to\n     * ``object`` regardless of its calling environment.\n     * Iow, inside ``method``, ``this`` always points to ``object``.\n     *\n     * See http://alistapart.com/article/getoutbindingsituations\n     *\n     */\n    createBoundedWrapper: function(object, method) {\n        return function() {\n            return method.apply(object, arguments);\n        };\n    },\n\n\n    /**\n     * @ngdoc method\n     * @name readableColumnName\n     * @methodOf ui.grid.service:GridUtil\n     *\n     * @param {string} columnName Column name as a string\n     * @returns {string} Column name appropriately capitalized and split apart\n     *\n       @example\n       <example module=\"app\">\n        <file name=\"app.js\">\n          var app = angular.module('app', ['ui.grid']);\n\n          app.controller('MainCtrl', ['$scope', 'gridUtil', function ($scope, gridUtil) {\n            $scope.name = 'firstName';\n            $scope.columnName = function(name) {\n              return gridUtil.readableColumnName(name);\n            };\n          }]);\n        </file>\n        <file name=\"index.ced81ed4.html\">\n          <div ng-controller=\"MainCtrl\">\n            <strong>Column name:</strong> <input ng-model=\"name\" />\n            <br>\n            <strong>Output:</strong> <span ng-bind=\"columnName(name)\"></span>\n          </div>\n        </file>\n      </example>\n     */\n    readableColumnName: function (columnName) {\n      // Convert underscores to spaces\n      if (typeof(columnName) === 'undefined' || columnName === undefined || columnName === null) { return columnName; }\n\n      if (typeof(columnName) !== 'string') {\n        columnName = String(columnName);\n      }\n\n      return columnName.replace(/_+/g, ' ')\n        // Replace a completely all-capsed word with a first-letter-capitalized version\n        .replace(/^[A-Z]+$/, function (match) {\n          return match.toLowerCase();\n        })\n        // Capitalize the first letter of words\n        .replace(/([\\w\\u00C0-\\u017F]+)/g, function (match) {\n          return match.charAt(0).toUpperCase() + match.slice(1);\n        })\n        // Put a space in between words that have partial capilizations (i.e. 'firstName' becomes 'First Name')\n        // .replace(/([A-Z]|[A-Z]\\w+)([A-Z])/g, \"$1 $2\");\n        // .replace(/(\\w+?|\\w)([A-Z])/g, \"$1 $2\");\n        .replace(/(\\w+?(?=[A-Z]))/g, '$1 ');\n    },\n\n    /**\n     * @ngdoc method\n     * @name getColumnsFromData\n     * @methodOf ui.grid.service:GridUtil\n     * @description Return a list of column names, given a data set\n     *\n     * @param {string} data Data array for grid\n     * @returns {Object} Column definitions with field accessor and column name\n     *\n     * @example\n       <pre>\n         var data = [\n           { firstName: 'Bob', lastName: 'Jones' },\n           { firstName: 'Frank', lastName: 'Smith' }\n         ];\n\n         var columnDefs = GridUtil.getColumnsFromData(data, excludeProperties);\n\n         columnDefs == [\n          {\n            field: 'firstName',\n            name: 'First Name'\n          },\n          {\n            field: 'lastName',\n            name: 'Last Name'\n          }\n         ];\n       </pre>\n     */\n    getColumnsFromData: function (data, excludeProperties) {\n      var columnDefs = [];\n\n      if (!data || typeof(data[0]) === 'undefined' || data[0] === undefined) { return []; }\n      if (angular.isUndefined(excludeProperties)) { excludeProperties = []; }\n\n      var item = data[0];\n\n      angular.forEach(item,function (prop, propName) {\n        if ( excludeProperties.indexOf(propName) === -1) {\n          columnDefs.push({\n            name: propName\n          });\n        }\n      });\n\n      return columnDefs;\n    },\n\n    /**\n     * @ngdoc method\n     * @name newId\n     * @methodOf ui.grid.service:GridUtil\n     * @description Return a unique ID string\n     *\n     * @returns {string} Unique string\n     *\n     * @example\n       <pre>\n        var id = GridUtil.newId();\n\n        # 1387305700482;\n       </pre>\n     */\n    newId: (function() {\n      var seedId = new Date().getTime();\n      return function() {\n          return seedId += 1;\n      };\n    })(),\n\n\n    /**\n     * @ngdoc method\n     * @name getTemplate\n     * @methodOf ui.grid.service:GridUtil\n     * @description Get's template from cache / element / url\n     *\n     * @param {string|element|promise} template Either a string representing the template id, a string representing the template url,\n     *   an jQuery/Angualr element, or a promise that returns the template contents to use.\n     * @returns {object} a promise resolving to template contents\n     *\n     * @example\n     <pre>\n     GridUtil.getTemplate(url).then(function (contents) {\n          alert(contents);\n        })\n     </pre>\n     */\n    getTemplate: function (template) {\n      // Try to fetch the template out of the templateCache\n      if ($templateCache.get(template)) {\n        return s.postProcessTemplate($templateCache.get(template));\n      }\n\n      // See if the template is itself a promise\n      if (angular.isFunction(template.then)) {\n        return template.then(s.postProcessTemplate).catch(angular.noop);\n      }\n\n      // If the template is an element, return the element\n      try {\n        if (angular.element(template).length > 0) {\n          return $q.when(template).then(s.postProcessTemplate).catch(angular.noop);\n        }\n      }\n      catch (err) {\n        // do nothing; not valid html\n      }\n\n      // s.logDebug('fetching url', template);\n\n      // Default to trying to fetch the template as a url with $http\n      return $http({ method: 'GET', url: template})\n        .then(\n          function (result) {\n            var templateHtml = result.data.trim();\n            // put in templateCache for next call\n            $templateCache.put(template, templateHtml);\n            return templateHtml;\n          },\n          function (err) {\n            throw new Error(\"Could not get template \" + template + \": \" + err);\n          }\n        )\n        .then(s.postProcessTemplate).catch(angular.noop);\n    },\n\n    //\n    postProcessTemplate: function (template) {\n      var startSym = $interpolate.startSymbol(),\n          endSym = $interpolate.endSymbol();\n\n      // If either of the interpolation symbols have been changed, we need to alter this template\n      if (startSym !== '{{' || endSym !== '}}') {\n        template = template.replace(/\\{\\{/g, startSym);\n        template = template.replace(/\\}\\}/g, endSym);\n      }\n\n      return $q.when(template);\n    },\n\n    /**\n     * @ngdoc method\n     * @name guessType\n     * @methodOf ui.grid.service:GridUtil\n     * @description guesses the type of an argument\n     *\n     * @param {string/number/bool/object} item variable to examine\n     * @returns {string} one of the following\n     * - 'string'\n     * - 'boolean'\n     * - 'number'\n     * - 'date'\n     * - 'object'\n     */\n    guessType : function (item) {\n      var itemType = typeof(item);\n\n      // Check for numbers and booleans\n      switch (itemType) {\n        case \"number\":\n        case \"boolean\":\n        case \"string\":\n          return itemType;\n        default:\n          if (angular.isDate(item)) {\n            return \"date\";\n          }\n          return \"object\";\n      }\n    },\n\n\n  /**\n    * @ngdoc method\n    * @name elementWidth\n    * @methodOf ui.grid.service:GridUtil\n    *\n    * @param {element} elem DOM element\n    * @param {string} [extra] Optional modifier for calculation. Use 'margin' to account for margins on element\n    *\n    * @returns {number} Element width in pixels, accounting for any borders, etc.\n    */\n    elementWidth: function (elem) {\n\n    },\n\n    /**\n    * @ngdoc method\n    * @name elementHeight\n    * @methodOf ui.grid.service:GridUtil\n    *\n    * @param {element} elem DOM element\n    * @param {string} [extra] Optional modifier for calculation. Use 'margin' to account for margins on element\n    *\n    * @returns {number} Element height in pixels, accounting for any borders, etc.\n    */\n    elementHeight: function (elem) {\n\n    },\n\n    isVisible: function (elem) {\n      return !!( elem[0].offsetWidth || elem[0].offsetHeight || elem[0].getClientRects().length )\n    },\n\n    // Thanks to http://stackoverflow.com/a/13382873/888165\n    getScrollbarWidth: function() {\n        var outer = document.createElement(\"div\");\n\n        outer.style.visibility = \"hidden\";\n        outer.style.width = \"100px\";\n        outer.style.msOverflowStyle = \"scrollbar\"; // needed for WinJS apps\n\n        document.body.appendChild(outer);\n\n        var widthNoScroll = outer.offsetWidth;\n        // force scrollbars\n        outer.style.overflow = \"scroll\";\n        outer.style.position = \"absolute\"; // force Firefox to draw a scrollbar\n\n        // add innerdiv\n        var inner = document.createElement(\"div\");\n        inner.style.width = \"100%\";\n        outer.appendChild(inner);\n\n        var widthWithScroll = inner.offsetWidth;\n\n        // remove divs\n        outer.parentNode.removeChild(outer);\n\n        return widthNoScroll - widthWithScroll;\n    },\n\n    swap: function( elem, options, callback, args ) {\n      var ret, name,\n              old = {};\n\n      // Remember the old values, and insert the new ones\n      for ( name in options ) {\n        old[ name ] = elem.style[ name ];\n        elem.style[ name ] = options[ name ];\n      }\n\n      ret = callback.apply( elem, args || [] );\n\n      // Revert the old values\n      for ( name in options ) {\n        elem.style[ name ] = old[ name ];\n      }\n\n      return ret;\n    },\n\n    fakeElement: function( elem, options, callback, args ) {\n      var ret, name,\n          newElement = angular.element(elem).clone()[0];\n\n      for ( name in options ) {\n        newElement.style[ name ] = options[ name ];\n      }\n\n      angular.element(document.body).append(newElement);\n\n      ret = callback.call( newElement, newElement );\n\n      angular.element(newElement).remove();\n\n      return ret;\n    },\n\n    /**\n    * @ngdoc method\n    * @name normalizeWheelEvent\n    * @methodOf ui.grid.service:GridUtil\n    *\n    * @param {event} event A mouse wheel event\n    *\n    * @returns {event} A normalized event\n    *\n    * @description\n    * Given an event from this list:\n    *\n    * `wheel, mousewheel, DomMouseScroll, MozMousePixelScroll`\n    *\n    * \"normalize\" it\n    * so that it stays consistent no matter what browser it comes from (i.e. scale it correctly and make sure the direction is right.)\n    */\n    normalizeWheelEvent: function (event) {\n      // var toFix = ['wheel', 'mousewheel', 'DOMMouseScroll', 'MozMousePixelScroll'];\n      // var toBind = 'onwheel' in document || document.documentMode >= 9 ? ['wheel'] : ['mousewheel', 'DomMouseScroll', 'MozMousePixelScroll'];\n      var lowestDelta, lowestDeltaXY;\n\n      var orgEvent   = event || window.event,\n          args       = [].slice.call(arguments, 1),\n          delta      = 0,\n          deltaX     = 0,\n          deltaY     = 0,\n          absDelta   = 0,\n          absDeltaXY = 0,\n          fn;\n\n      // event = $.event.fix(orgEvent);\n      // event.type = 'mousewheel';\n\n      // NOTE: jQuery masks the event and stores it in the event as originalEvent\n      if (orgEvent.originalEvent) {\n        orgEvent = orgEvent.originalEvent;\n      }\n\n      // Old school scrollwheel delta\n      if ( orgEvent.wheelDelta ) { delta = orgEvent.wheelDelta; }\n      if ( orgEvent.detail )     { delta = orgEvent.detail * -1; }\n\n      // At a minimum, setup the deltaY to be delta\n      deltaY = delta;\n\n      // Firefox < 17 related to DOMMouseScroll event\n      if ( orgEvent.axis !== undefined && orgEvent.axis === orgEvent.HORIZONTAL_AXIS ) {\n          deltaY = 0;\n          deltaX = delta * -1;\n      }\n\n      // New school wheel delta (wheel event)\n      if ( orgEvent.deltaY ) {\n          deltaY = orgEvent.deltaY * -1;\n          delta  = deltaY;\n      }\n      if ( orgEvent.deltaX ) {\n          deltaX = orgEvent.deltaX;\n          delta  = deltaX * -1;\n      }\n\n      // Webkit\n      if ( orgEvent.wheelDeltaY !== undefined ) { deltaY = orgEvent.wheelDeltaY; }\n      if ( orgEvent.wheelDeltaX !== undefined ) { deltaX = orgEvent.wheelDeltaX; }\n\n      // Look for lowest delta to normalize the delta values\n      absDelta = Math.abs(delta);\n      if ( !lowestDelta || absDelta < lowestDelta ) { lowestDelta = absDelta; }\n      absDeltaXY = Math.max(Math.abs(deltaY), Math.abs(deltaX));\n      if ( !lowestDeltaXY || absDeltaXY < lowestDeltaXY ) { lowestDeltaXY = absDeltaXY; }\n\n      // Get a whole value for the deltas\n      fn     = delta > 0 ? 'floor' : 'ceil';\n      delta  = Math[fn](delta  / lowestDelta);\n      deltaX = Math[fn](deltaX / lowestDeltaXY);\n      deltaY = Math[fn](deltaY / lowestDeltaXY);\n\n      return {\n        delta: delta,\n        deltaX: deltaX,\n        deltaY: deltaY\n      };\n    },\n\n    // Stolen from Modernizr\n    // TODO: make this, and everythign that flows from it, robust\n    // http://www.stucox.com/blog/you-cant-detect-a-touchscreen/\n    isTouchEnabled: function() {\n      var bool;\n\n      if (('ontouchstart' in $window) || $window.DocumentTouch && $document instanceof DocumentTouch) {\n        bool = true;\n      }\n\n      return bool;\n    },\n\n    isNullOrUndefined: function(obj) {\n      return (obj === undefined || obj === null);\n    },\n\n    endsWith: function(str, suffix) {\n      if (!str || !suffix || typeof str !== \"string\") {\n        return false;\n      }\n      return str.indexOf(suffix, str.length - suffix.length) !== -1;\n    },\n\n    arrayContainsObjectWithProperty: function(array, propertyName, propertyValue) {\n        var found = false;\n        angular.forEach(array, function (object) {\n            if (object[propertyName] === propertyValue) {\n                found = true;\n            }\n        });\n        return found;\n    },\n\n    numericAndNullSort: function (a, b) {\n      if (a === null) { return 1; }\n      if (b === null) { return -1; }\n      if (a === null && b === null) { return 0; }\n      return a - b;\n    },\n\n    // Disable ngAnimate animations on an element\n    disableAnimations: function (element) {\n      var $animate;\n      try {\n        $animate = $injector.get('$animate');\n        // See: http://brianhann.com/angular-1-4-breaking-changes-to-be-aware-of/#animate\n        if (angular.version.major > 1 || (angular.version.major === 1 && angular.version.minor >= 4)) {\n          $animate.enabled(element, false);\n        } else {\n          $animate.enabled(false, element);\n        }\n      }\n      catch (e) {}\n    },\n\n    enableAnimations: function (element) {\n      var $animate;\n      try {\n        $animate = $injector.get('$animate');\n        // See: http://brianhann.com/angular-1-4-breaking-changes-to-be-aware-of/#animate\n        if (angular.version.major > 1 || (angular.version.major === 1 && angular.version.minor >= 4)) {\n          $animate.enabled(element, true);\n        } else {\n          $animate.enabled(true, element);\n        }\n        return $animate;\n      }\n      catch (e) {}\n    },\n\n    // Blatantly stolen from Angular as it isn't exposed (yet)\n    nextUid: function nextUid() {\n      var index = uid.length;\n      var digit;\n\n      while (index) {\n        index--;\n        digit = uid[index].charCodeAt(0);\n        if (digit === 57 /*'9'*/) {\n          uid[index] = 'A';\n          return uidPrefix + uid.join('');\n        }\n        if (digit === 90  /*'Z'*/) {\n          uid[index] = '0';\n        } else {\n          uid[index] = String.fromCharCode(digit + 1);\n          return uidPrefix + uid.join('');\n        }\n      }\n      uid.unshift('0');\n\n      return uidPrefix + uid.join('');\n    },\n\n    // Blatantly stolen from Angular as it isn't exposed (yet)\n    hashKey: function hashKey(obj) {\n      var objType = typeof obj,\n          key;\n\n      if (objType === 'object' && obj !== null) {\n        if (typeof (key = obj.$$hashKey) === 'function') {\n          // must invoke on object to keep the right this\n          key = obj.$$hashKey();\n        }\n        else if (typeof(obj.$$hashKey) !== 'undefined' && obj.$$hashKey) {\n          key = obj.$$hashKey;\n        }\n        else if (key === undefined) {\n          key = obj.$$hashKey = s.nextUid();\n        }\n      }\n      else {\n        key = obj;\n      }\n\n      return objType + ': ' + key;\n    },\n\n    resetUids: function () {\n      uid = ['0', '0', '0'];\n    },\n\n    /**\n     * @ngdoc method\n     * @methodOf ui.grid.service:GridUtil\n     * @name logError\n     * @description wraps the $log method, allowing us to choose different\n     * treatment within ui-grid if we so desired.  At present we only log\n     * error messages if uiGridConstants.LOG_ERROR_MESSAGES is set to true\n     * @param {string} logMessage message to be logged to the console\n     *\n     */\n    logError: function( logMessage ) {\n      if ( uiGridConstants.LOG_ERROR_MESSAGES ) {\n        $log.error( logMessage );\n      }\n    },\n\n    /**\n     * @ngdoc method\n     * @methodOf ui.grid.service:GridUtil\n     * @name logWarn\n     * @description wraps the $log method, allowing us to choose different\n     * treatment within ui-grid if we so desired.  At present we only log\n     * warning messages if uiGridConstants.LOG_WARN_MESSAGES is set to true\n     * @param {string} logMessage message to be logged to the console\n     *\n     */\n    logWarn: function( logMessage ) {\n      if ( uiGridConstants.LOG_WARN_MESSAGES ) {\n        $log.warn( logMessage );\n      }\n    },\n\n    /**\n     * @ngdoc method\n     * @methodOf ui.grid.service:GridUtil\n     * @name logDebug\n     * @description wraps the $log method, allowing us to choose different\n     * treatment within ui-grid if we so desired.  At present we only log\n     * debug messages if uiGridConstants.LOG_DEBUG_MESSAGES is set to true\n     *\n     */\n    logDebug: function() {\n      if ( uiGridConstants.LOG_DEBUG_MESSAGES ) {\n        $log.debug.apply($log, arguments);\n      }\n    }\n\n  };\n\n  /**\n   * @ngdoc object\n   * @name focus\n   * @propertyOf ui.grid.service:GridUtil\n   * @description Provides a set of methods to set the document focus inside the grid.\n   * See {@link ui.grid.service:GridUtil.focus} for more information.\n   */\n\n  /**\n   * @ngdoc object\n   * @name ui.grid.service:GridUtil.focus\n   * @description Provides a set of methods to set the document focus inside the grid.\n   * Timeouts are utilized to ensure that the focus is invoked after any other event has been triggered.\n   * e.g. click events that need to run before the focus or\n   * inputs elements that are in a disabled state but are enabled when those events\n   * are triggered.\n   */\n  s.focus = {\n    queue: [],\n    // http://stackoverflow.com/questions/25596399/set-element-focus-in-angular-way\n    /**\n     * @ngdoc method\n     * @methodOf ui.grid.service:GridUtil.focus\n     * @name byId\n     * @description Sets the focus of the document to the given id value.\n     * If provided with the grid object it will automatically append the grid id.\n     * This is done to encourage unique dom id's as it allows for multiple grids on a\n     * page.\n     * @param {String} id the id of the dom element to set the focus on\n     * @param {Object=} Grid the grid object for this grid instance. See: {@link ui.grid.class:Grid}\n     * @param {Number} Grid.id the unique id for this grid. Already set on an initialized grid object.\n     * @returns {Promise} The `$timeout` promise that will be resolved once focus is set. If another focus is requested before this request is evaluated.\n     * then the promise will fail with the `'canceled'` reason.\n     */\n    byId: function (id, Grid) {\n      this._purgeQueue();\n      var promise = $timeout(function() {\n        var elementID = (Grid && Grid.id ? Grid.id + '-' : '') + id;\n        var element = $window.document.getElementById(elementID);\n        if (element) {\n          element.focus();\n        } else {\n          s.logWarn('[focus.byId] Element id ' + elementID + ' was not found.');\n        }\n      }, 0, false);\n      this.queue.push(promise);\n      return promise;\n    },\n\n    /**\n     * @ngdoc method\n     * @methodOf ui.grid.service:GridUtil.focus\n     * @name byElement\n     * @description Sets the focus of the document to the given dom element.\n     * @param {(element|angular.element)} element the DOM element to set the focus on\n     * @returns {Promise} The `$timeout` promise that will be resolved once focus is set. If another focus is requested before this request is evaluated.\n     * then the promise will fail with the `'canceled'` reason.\n     */\n    byElement: function(element) {\n      if (!angular.isElement(element)) {\n        s.logWarn(\"Trying to focus on an element that isn\\'t an element.\");\n        return $q.reject('not-element');\n      }\n      element = angular.element(element);\n      this._purgeQueue();\n      var promise = $timeout(function() {\n        if (element) {\n          element[0].focus();\n        }\n      }, 0, false);\n      this.queue.push(promise);\n      return promise;\n    },\n    /**\n     * @ngdoc method\n     * @methodOf ui.grid.service:GridUtil.focus\n     * @name bySelector\n     * @description Sets the focus of the document to the given dom element.\n     * @param {(element|angular.element)} parentElement the parent/ancestor of the dom element that you are selecting using the query selector\n     * @param {String} querySelector finds the dom element using the {@link http://www.w3schools.com/jsref/met_document_queryselector.asp querySelector}\n     * @param {boolean} [aSync=false] If true then the selector will be querried inside of a timeout. Otherwise the selector will be querried imidately\n     * then the focus will be called.\n     * @returns {Promise} The `$timeout` promise that will be resolved once focus is set. If another focus is requested before this request is evaluated.\n     * then the promise will fail with the `'canceled'` reason.\n     */\n    bySelector: function(parentElement, querySelector, aSync) {\n      var self = this;\n      if (!angular.isElement(parentElement)) {\n        throw new Error(\"The parent element is not an element.\");\n      }\n      // Ensure that this is an angular element.\n      // It is fine if this is already an angular element.\n      parentElement = angular.element(parentElement);\n      var focusBySelector = function() {\n        var element = parentElement[0].querySelector(querySelector);\n        return self.byElement(element);\n      };\n      this._purgeQueue();\n      if (aSync) { // Do this asynchronysly\n        var promise = $timeout(focusBySelector, 0, false);\n        this.queue.push(promise);\n        return promise;\n      } else {\n        return focusBySelector();\n      }\n    },\n    _purgeQueue: function() {\n      this.queue.forEach(function(element) {\n        $timeout.cancel(element);\n      });\n      this.queue = [];\n    }\n  };\n\n\n  ['width', 'height'].forEach(function (name) {\n    var capsName = name.charAt(0).toUpperCase() + name.substr(1);\n\n    s['element' + capsName] = function (elem, extra) {\n      var e = elem;\n      if (e && typeof(e.length) !== 'undefined' && e.length) {\n        e = elem[0];\n      }\n\n      if (e && e !== null) {\n        var styles = getStyles(e);\n        return e.offsetWidth === 0 && rdisplayswap.test(styles.display) ?\n          s.swap(e, cssShow, function() {\n            return getWidthOrHeight(e, name, extra );\n          }) :\n          getWidthOrHeight( e, name, extra );\n      } else {\n        return null;\n      }\n    };\n\n    s['outerElement' + capsName] = function (elem, margin) {\n      return elem ? s['element' + capsName].call(this, elem, margin ? 'margin' : 'border') : null;\n    };\n  });\n\n  // http://stackoverflow.com/a/24107550/888165\n  s.closestElm = function closestElm(el, selector) {\n    if (typeof(el.length) !== 'undefined' && el.length) {\n      el = el[0];\n    }\n\n    var matchesFn;\n\n    // find vendor prefix\n    ['matches','webkitMatchesSelector','mozMatchesSelector','msMatchesSelector','oMatchesSelector'].some(function(fn) {\n        if (typeof document.body[fn] === 'function') {\n            matchesFn = fn;\n            return true;\n        }\n        return false;\n    });\n\n    // traverse parents\n    var parent;\n    while (el !== null) {\n      parent = el.parentElement;\n      if (parent !== null && parent[matchesFn](selector)) {\n          return parent;\n      }\n      el = parent;\n    }\n\n    return null;\n  };\n\n  s.type = function (obj) {\n    var text = Function.prototype.toString.call(obj.constructor);\n    return text.match(/function (.*?)\\(/)[1];\n  };\n\n  s.getBorderSize = function getBorderSize(elem, borderType) {\n    if (typeof(elem.length) !== 'undefined' && elem.length) {\n      elem = elem[0];\n    }\n\n    var styles = getStyles(elem);\n\n    // If a specific border is supplied, like 'top', read the 'borderTop' style property\n    if (borderType) {\n      borderType = 'border' + borderType.charAt(0).toUpperCase() + borderType.slice(1);\n    }\n    else {\n      borderType = 'border';\n    }\n\n    borderType += 'Width';\n\n    var val = parseInt(styles[borderType], 10);\n\n    if (isNaN(val)) {\n      return 0;\n    }\n    else {\n      return val;\n    }\n  };\n\n  // http://stackoverflow.com/a/22948274/888165\n  // TODO: Opera? Mobile?\n  s.detectBrowser = function detectBrowser() {\n    var userAgent = $window.navigator.userAgent;\n\n    var browsers = {chrome: /chrome/i, safari: /safari/i, firefox: /firefox/i, ie: /internet explorer|trident\\//i};\n\n    for (var key in browsers) {\n      if (browsers[key].test(userAgent)) {\n        return key;\n      }\n    }\n\n    return 'unknown';\n  };\n\n  // Borrowed from https://github.com/othree/jquery.rtl-scroll-type\n  // Determine the scroll \"type\" this browser is using for RTL\n  s.rtlScrollType = function rtlScrollType() {\n    if (rtlScrollType.type) {\n      return rtlScrollType.type;\n    }\n\n    var definer = angular.element('<div dir=\"rtl\" style=\"width: 1px; height: 1px; position: fixed; top: 0px; left: 0px; overflow: hidden\"><div style=\"width: 2px\"><span style=\"display: inline-block; width: 1px\"></span><span style=\"display: inline-block; width: 1px\"></span></div></div>')[0],\n        type = 'reverse';\n\n    document.body.appendChild(definer);\n\n    if (definer.scrollLeft > 0) {\n      type = 'default';\n    }\n    else {\n      if (typeof Element !== 'undefined' && Element.prototype.scrollIntoView) {\n        definer.children[0].children[1].scrollIntoView();\n        if (definer.scrollLeft < 0) {\n          type = 'negative';\n        }\n      } else {\n        definer.scrollLeft = 1;\n        if (definer.scrollLeft === 0) {\n          type = 'negative';\n        }\n      }\n    }\n\n    angular.element(definer).remove();\n    rtlScrollType.type = type;\n\n    return type;\n  };\n\n    /**\n     * @ngdoc method\n     * @name normalizeScrollLeft\n     * @methodOf ui.grid.service:GridUtil\n     *\n     * @param {element} element The element to get the `scrollLeft` from.\n     * @param {grid} grid -  grid used to normalize (uses the rtl property)\n     *\n     * @returns {number} A normalized scrollLeft value for the current browser.\n     *\n     * @description\n     * Browsers currently handle RTL in different ways, resulting in inconsistent scrollLeft values. This method normalizes them\n     */\n  s.normalizeScrollLeft = function normalizeScrollLeft(element, grid) {\n    if (typeof(element.length) !== 'undefined' && element.length) {\n      element = element[0];\n    }\n\n    var scrollLeft = element.scrollLeft;\n\n    if (grid.isRTL()) {\n      switch (s.rtlScrollType()) {\n        case 'default':\n          return element.scrollWidth - scrollLeft - element.clientWidth;\n        case 'negative':\n          return Math.abs(scrollLeft);\n        case 'reverse':\n          return scrollLeft;\n      }\n    }\n\n    return scrollLeft;\n  };\n\n  /**\n  * @ngdoc method\n  * @name denormalizeScrollLeft\n  * @methodOf ui.grid.service:GridUtil\n  *\n  * @param {element} element The element to normalize the `scrollLeft` value for\n  * @param {number} scrollLeft The `scrollLeft` value to denormalize.\n  * @param {grid} grid The grid that owns the scroll event.\n  *\n  * @returns {number} A normalized scrollLeft value for the current browser.\n  *\n  * @description\n  * Browsers currently handle RTL in different ways, resulting in inconsistent scrollLeft values. This method denormalizes a value for the current browser.\n  */\n  s.denormalizeScrollLeft = function denormalizeScrollLeft(element, scrollLeft, grid) {\n    if (typeof(element.length) !== 'undefined' && element.length) {\n      element = element[0];\n    }\n\n    if (grid.isRTL()) {\n      switch (s.rtlScrollType()) {\n        case 'default':\n          // Get the max scroll for the element\n          var maxScrollLeft = element.scrollWidth - element.clientWidth;\n\n          // Subtract the current scroll amount from the max scroll\n          return maxScrollLeft - scrollLeft;\n        case 'negative':\n          return scrollLeft * -1;\n        case 'reverse':\n          return scrollLeft;\n      }\n    }\n\n    return scrollLeft;\n  };\n\n    /**\n     * @ngdoc method\n     * @name preEval\n     * @methodOf ui.grid.service:GridUtil\n     *\n     * @param {string} path Path to evaluate\n     *\n     * @returns {string} A path that is normalized.\n     *\n     * @description\n     * Takes a field path and converts it to bracket notation to allow for special characters in path\n     * @example\n     * <pre>\n     * gridUtil.preEval('property') == 'property'\n     * gridUtil.preEval('nested.deep.prop-erty') = \"nested['deep']['prop-erty']\"\n     * </pre>\n     */\n  s.preEval = function (path) {\n    var m = uiGridConstants.BRACKET_REGEXP.exec(path);\n    if (m) {\n      return (m[1] ? s.preEval(m[1]) : m[1]) + m[2] + (m[3] ? s.preEval(m[3]) : m[3]);\n    } else {\n      path = path.replace(uiGridConstants.APOS_REGEXP, '\\\\\\'');\n      var parts = path.split(uiGridConstants.DOT_REGEXP);\n      var preparsed = [parts.shift()];    // first item must be var notation, thus skip\n      angular.forEach(parts, function (part) {\n        preparsed.push(part.replace(uiGridConstants.FUNC_REGEXP, '\\']$1'));\n      });\n      return preparsed.join('[\\'');\n    }\n  };\n\n  /**\n   * @ngdoc method\n   * @name debounce\n   * @methodOf ui.grid.service:GridUtil\n   *\n   * @param {function} func function to debounce\n   * @param {number} wait milliseconds to delay\n   * @param {boolean} immediate execute before delay\n   *\n   * @returns {function} A function that can be executed as debounced function\n   *\n   * @description\n   * Copied from https://github.com/shahata/angular-debounce\n   * Takes a function, decorates it to execute only 1 time after multiple calls, and returns the decorated function\n   * @example\n   * <pre>\n   * var debouncedFunc =  gridUtil.debounce(function() {alert('debounced');}, 500);\n   * debouncedFunc();\n   * debouncedFunc();\n   * debouncedFunc();\n   * </pre>\n   */\n  s.debounce =  function (func, wait, immediate) {\n    var timeout, args, context, result;\n    function debounce() {\n      /* jshint validthis: true */\n      context = this;\n      args = arguments;\n      var later = function () {\n        timeout = null;\n        if (!immediate) {\n          result = func.apply(context, args);\n        }\n      };\n      var callNow = immediate && !timeout;\n      if (timeout) {\n        $timeout.cancel(timeout);\n      }\n      timeout = $timeout(later, wait, false);\n      if (callNow) {\n        result = func.apply(context, args);\n      }\n      return result;\n    }\n    debounce.cancel = function () {\n      $timeout.cancel(timeout);\n      timeout = null;\n    };\n    return debounce;\n  };\n\n  /**\n   * @ngdoc method\n   * @name throttle\n   * @methodOf ui.grid.service:GridUtil\n   *\n   * @param {function} func function to throttle\n   * @param {number} wait milliseconds to delay after first trigger\n   * @param {Object} options to use in throttle.\n   *\n   * @returns {function} A function that can be executed as throttled function\n   *\n   * @description\n   * Adapted from debounce function (above)\n   * Potential keys for Params Object are:\n   *    trailing (bool) - whether to trigger after throttle time ends if called multiple times\n   * Updated to use $interval rather than $timeout, as protractor (e2e tests) is able to work with $interval,\n   * but not with $timeout\n   *\n   * Note that when using throttle, you need to use throttle to create a new function upfront, then use the function\n   * return from that call each time you need to call throttle.  If you call throttle itself repeatedly, the lastCall\n   * variable will get overwritten and the throttling won't work\n   *\n   * @example\n   * <pre>\n   * var throttledFunc =  gridUtil.throttle(function() {console.log('throttled');}, 500, {trailing: true});\n   * throttledFunc(); //=> logs throttled\n   * throttledFunc(); //=> queues attempt to log throttled for ~500ms (since trailing param is truthy)\n   * throttledFunc(); //=> updates arguments to keep most-recent request, but does not do anything else.\n   * </pre>\n   */\n  s.throttle = function(func, wait, options) {\n    options = options || {};\n    var lastCall = 0, queued = null, context, args;\n\n    function runFunc(endDate) {\n      lastCall = +new Date();\n      func.apply(context, args);\n      $interval(function() {queued = null; }, 0, 1, false);\n    }\n\n    return function() {\n      /* jshint validthis: true */\n      context = this;\n      args = arguments;\n      if (queued === null) {\n        var sinceLast = +new Date() - lastCall;\n        if (sinceLast > wait) {\n          runFunc();\n        }\n        else if (options.trailing) {\n          queued = $interval(runFunc, wait - sinceLast, 1, false);\n        }\n      }\n    };\n  };\n\n  s.on = {};\n  s.off = {};\n  s._events = {};\n\n  s.addOff = function (eventName) {\n    s.off[eventName] = function (elm, fn) {\n      var idx = s._events[eventName].indexOf(fn);\n      if (idx > 0) {\n        s._events[eventName].removeAt(idx);\n      }\n    };\n  };\n\n  var mouseWheeltoBind = ( 'onwheel' in document || document.documentMode >= 9 ) ? ['wheel'] : ['mousewheel', 'DomMouseScroll', 'MozMousePixelScroll'],\n      nullLowestDeltaTimeout,\n      lowestDelta;\n\n  s.on.mousewheel = function (elm, fn) {\n    if (!elm || !fn) { return; }\n\n    var $elm = angular.element(elm);\n\n    // Store the line height and page height for this particular element\n    $elm.data('mousewheel-line-height', getLineHeight($elm));\n    $elm.data('mousewheel-page-height', s.elementHeight($elm));\n    if (!$elm.data('mousewheel-callbacks')) { $elm.data('mousewheel-callbacks', {}); }\n\n    var cbs = $elm.data('mousewheel-callbacks');\n    cbs[fn] = (Function.prototype.bind || bindPolyfill).call(mousewheelHandler, $elm[0], fn);\n\n    // Bind all the mousew heel events\n    for ( var i = mouseWheeltoBind.length; i; ) {\n      $elm.on(mouseWheeltoBind[--i], cbs[fn]);\n    }\n    $elm.on('$destroy', function unbindEvents() {\n      for ( var i = mouseWheeltoBind.length; i; ) {\n        $elm.off(mouseWheeltoBind[--i], cbs[fn]);\n      }\n    });\n  };\n  s.off.mousewheel = function (elm, fn) {\n    var $elm = angular.element(elm);\n\n    var cbs = $elm.data('mousewheel-callbacks');\n    var handler = cbs[fn];\n\n    if (handler) {\n      for ( var i = mouseWheeltoBind.length; i; ) {\n        $elm.off(mouseWheeltoBind[--i], handler);\n      }\n    }\n\n    delete cbs[fn];\n\n    if (Object.keys(cbs).length === 0) {\n      $elm.removeData('mousewheel-line-height');\n      $elm.removeData('mousewheel-page-height');\n      $elm.removeData('mousewheel-callbacks');\n    }\n  };\n\n  function mousewheelHandler(fn, event) {\n    var $elm = angular.element(this);\n\n    var delta      = 0,\n        deltaX     = 0,\n        deltaY     = 0,\n        absDelta   = 0,\n        offsetX    = 0,\n        offsetY    = 0;\n\n    // jQuery masks events\n    if (event.originalEvent) { event = event.originalEvent; }\n\n    if ( 'detail'      in event ) { deltaY = event.detail * -1;      }\n    if ( 'wheelDelta'  in event ) { deltaY = event.wheelDelta;       }\n    if ( 'wheelDeltaY' in event ) { deltaY = event.wheelDeltaY;      }\n    if ( 'wheelDeltaX' in event ) { deltaX = event.wheelDeltaX * -1; }\n\n    // Firefox < 17 horizontal scrolling related to DOMMouseScroll event\n    if ( 'axis' in event && event.axis === event.HORIZONTAL_AXIS ) {\n      deltaX = deltaY * -1;\n      deltaY = 0;\n    }\n\n    // Set delta to be deltaY or deltaX if deltaY is 0 for backwards compatabilitiy\n    delta = deltaY === 0 ? deltaX : deltaY;\n\n    // New school wheel delta (wheel event)\n    if ( 'deltaY' in event ) {\n      deltaY = event.deltaY * -1;\n      delta  = deltaY;\n    }\n    if ( 'deltaX' in event ) {\n      deltaX = event.deltaX;\n      if ( deltaY === 0 ) { delta  = deltaX * -1; }\n    }\n\n    // No change actually happened, no reason to go any further\n    if ( deltaY === 0 && deltaX === 0 ) { return; }\n\n    // Need to convert lines and pages to pixels if we aren't already in pixels\n    // There are three delta modes:\n    //   * deltaMode 0 is by pixels, nothing to do\n    //   * deltaMode 1 is by lines\n    //   * deltaMode 2 is by pages\n    if ( event.deltaMode === 1 ) {\n        var lineHeight = $elm.data('mousewheel-line-height');\n        delta  *= lineHeight;\n        deltaY *= lineHeight;\n        deltaX *= lineHeight;\n    }\n    else if ( event.deltaMode === 2 ) {\n        var pageHeight = $elm.data('mousewheel-page-height');\n        delta  *= pageHeight;\n        deltaY *= pageHeight;\n        deltaX *= pageHeight;\n    }\n\n    // Store lowest absolute delta to normalize the delta values\n    absDelta = Math.max( Math.abs(deltaY), Math.abs(deltaX) );\n\n    if ( !lowestDelta || absDelta < lowestDelta ) {\n      lowestDelta = absDelta;\n\n      // Adjust older deltas if necessary\n      if ( shouldAdjustOldDeltas(event, absDelta) ) {\n        lowestDelta /= 40;\n      }\n    }\n\n    // Get a whole, normalized value for the deltas\n    delta  = Math[ delta  >= 1 ? 'floor' : 'ceil' ](delta  / lowestDelta);\n    deltaX = Math[ deltaX >= 1 ? 'floor' : 'ceil' ](deltaX / lowestDelta);\n    deltaY = Math[ deltaY >= 1 ? 'floor' : 'ceil' ](deltaY / lowestDelta);\n\n    var newEvent = {\n      originalEvent: event,\n      deltaX: deltaX,\n      deltaY: deltaY,\n      deltaFactor: lowestDelta,\n      preventDefault: function () { event.preventDefault(); },\n      stopPropagation: function () { event.stopPropagation(); }\n    };\n\n    // Clearout lowestDelta after sometime to better\n    // handle multiple device types that give\n    // a different lowestDelta\n    // Ex: trackpad = 3 and mouse wheel = 120\n    if (nullLowestDeltaTimeout) { clearTimeout(nullLowestDeltaTimeout); }\n    nullLowestDeltaTimeout = setTimeout(nullLowestDelta, 200);\n\n    fn.call($elm[0], newEvent);\n  }\n\n  function nullLowestDelta() {\n    lowestDelta = null;\n  }\n\n  function shouldAdjustOldDeltas(orgEvent, absDelta) {\n    // If this is an older event and the delta is divisable by 120,\n    // then we are assuming that the browser is treating this as an\n    // older mouse wheel event and that we should divide the deltas\n    // by 40 to try and get a more usable deltaFactor.\n    // Side note, this actually impacts the reported scroll distance\n    // in older browsers and can cause scrolling to be slower than native.\n    // Turn this off by setting $.event.special.mousewheel.settings.adjustOldDeltas to false.\n    return orgEvent.type === 'mousewheel' && absDelta % 120 === 0;\n  }\n\n  return s;\n}]);\n\n// Add 'px' to the end of a number string if it doesn't have it already\nmodule.filter('px', function() {\n  return function(str) {\n    if (str.match(/^[\\d\\.]+$/)) {\n      return str + 'px';\n    }\n    else {\n      return str;\n    }\n  };\n});\n\n})();\n\n/**\n * @ngdoc overview\n * @name ui.grid.i18n\n * @description\n *\n *  # ui.grid.i18n\n * This module provides i18n functions to ui.grid and any application that wants to use it\n\n *\n * <div doc-module-components=\"ui.grid.i18n\"></div>\n */\n\n(function () {\n  var DIRECTIVE_ALIASES = ['uiT', 'uiTranslate'];\n  var FILTER_ALIASES = ['t', 'uiTranslate'];\n\n  var module = angular.module('ui.grid.i18n');\n\n\n  /**\n   *  @ngdoc object\n   *  @name ui.grid.i18n.constant:i18nConstants\n   *\n   *  @description constants available in i18n module\n   */\n  module.constant('i18nConstants', {\n    MISSING: '[MISSING]',\n    UPDATE_EVENT: '$uiI18n',\n\n    LOCALE_DIRECTIVE_ALIAS: 'uiI18n',\n    // default to english\n    DEFAULT_LANG: 'en'\n  });\n\n//    module.config(['$provide', function($provide) {\n//        $provide.decorator('i18nService', ['$delegate', function($delegate) {}])}]);\n\n  /**\n   *  @ngdoc service\n   *  @name ui.grid.i18n.service:i18nService\n   *\n   *  @description Services for i18n\n   */\n  module.service('i18nService', ['$log', '$parse', 'i18nConstants', '$rootScope',\n    function ($log, $parse, i18nConstants, $rootScope) {\n\n      var langCache = {\n        _langs: {},\n        current: null,\n        fallback: i18nConstants.DEFAULT_LANG,\n        get: function (lang) {\n          var self = this,\n            fallbackLang = self.getFallbackLang();\n\n          if (lang !== self.fallback) {\n            return angular.extend({}, self._langs[fallbackLang],\n              self._langs[lang.toLowerCase()]);\n          }\n\n          return self._langs[lang.toLowerCase()];\n        },\n        add: function (lang, strings) {\n          var lower = lang.toLowerCase();\n          if (!this._langs[lower]) {\n            this._langs[lower] = {};\n          }\n          angular.merge(this._langs[lower], strings);\n        },\n        getAllLangs: function () {\n          var langs = [];\n          if (!this._langs) {\n            return langs;\n          }\n\n          for (var key in this._langs) {\n            langs.push(key);\n          }\n\n          return langs;\n        },\n        setCurrent: function (lang) {\n          this.current = lang.toLowerCase();\n        },\n        setFallback: function (lang) {\n          this.fallback = lang.toLowerCase();\n        },\n        getCurrentLang: function () {\n          return this.current;\n        },\n        getFallbackLang: function () {\n          return this.fallback.toLowerCase();\n        }\n      };\n\n      function getMissingText(path) {\n        $log.warn(i18nConstants.MISSING + path);\n        return '';\n      }\n\n      var service = {\n\n        /**\n         * @ngdoc service\n         * @name add\n         * @methodOf ui.grid.i18n.service:i18nService\n         * @description  Adds the languages and strings to the cache. Decorate this service to\n         * add more translation strings\n         * @param {string} langs languages to add\n         * @param {object} stringMaps of strings to add grouped by property names\n         * @example\n         * <pre>\n         *      i18nService.add('en', {\n         *         aggregate: {\n         *                 label1: 'items',\n         *                 label2: 'some more items'\n         *                 }\n         *         },\n         *         groupPanel: {\n         *              description: 'Drag a column header here and drop it to group by that column.'\n         *           }\n         *      }\n         * </pre>\n         */\n        add: function (langs, stringMaps) {\n          if (typeof(langs) === 'object') {\n            angular.forEach(langs, function (lang) {\n              if (lang) {\n                langCache.add(lang, stringMaps);\n              }\n            });\n          } else {\n            langCache.add(langs, stringMaps);\n          }\n        },\n\n        /**\n         * @ngdoc service\n         * @name getAllLangs\n         * @methodOf ui.grid.i18n.service:i18nService\n         * @description  return all currently loaded languages\n         * @returns {array} string\n         */\n        getAllLangs: function () {\n          return langCache.getAllLangs();\n        },\n\n        /**\n         * @ngdoc service\n         * @name get\n         * @methodOf ui.grid.i18n.service:i18nService\n         * @description  return all currently loaded languages\n         * @param {string} lang to return.  If not specified, returns current language\n         * @returns {object} the translation string maps for the language\n         */\n        get: function (lang) {\n          var language = lang ? lang : service.getCurrentLang();\n          return langCache.get(language);\n        },\n\n        /**\n         * @ngdoc service\n         * @name getSafeText\n         * @methodOf ui.grid.i18n.service:i18nService\n         * @description  returns the text specified in the path or a Missing text if text is not found\n         * @param {String} path property path to use for retrieving text from string map\n         * @param {String} [lang] to return.  If not specified, returns current language\n         * @returns {object} the translation for the path\n         * @example\n         * <pre>\n         * i18nService.getSafeText('sort.ascending')\n         * </pre>\n         */\n        getSafeText: function (path, lang) {\n          var language = lang || service.getCurrentLang(),\n            trans = langCache.get(language),\n            getter = $parse(path);\n\n          if (!trans) {\n            return getMissingText(path);\n          }\n\n          return getter(trans) || getMissingText(path);\n        },\n\n        /**\n         * @ngdoc service\n         * @name setCurrentLang\n         * @methodOf ui.grid.i18n.service:i18nService\n         * @description sets the current language to use in the application\n         * $broadcasts the i18nConstants.UPDATE_EVENT on the $rootScope\n         * @param {string} lang to set\n         * @example\n         * <pre>\n         * i18nService.setCurrentLang('fr');\n         * </pre>\n         */\n        setCurrentLang: function (lang) {\n          if (lang) {\n            langCache.setCurrent(lang);\n            $rootScope.$broadcast(i18nConstants.UPDATE_EVENT);\n          }\n        },\n\n        /**\n         * @ngdoc service\n         * @name setFallbackLang\n         * @methodOf ui.grid.i18n.service:i18nService\n         * @description sets the fallback language to use in the application.\n         * The default fallback language is english.\n         * @param {string} lang to set\n         * @example\n         * <pre>\n         * i18nService.setFallbackLang('en');\n         * </pre>\n         */\n        setFallbackLang: function (lang) {\n          if (lang) {\n            langCache.setFallback(lang);\n          }\n        },\n\n        /**\n         * @ngdoc service\n         * @name getCurrentLang\n         * @methodOf ui.grid.i18n.service:i18nService\n         * @description returns the current language used in the application\n         */\n        getCurrentLang: function () {\n          var lang = langCache.getCurrentLang();\n          if (!lang) {\n            lang = i18nConstants.DEFAULT_LANG;\n            langCache.setCurrent(lang);\n          }\n          return lang;\n        },\n\n        /**\n         * @ngdoc service\n         * @name getFallbackLang\n         * @methodOf ui.grid.i18n.service:i18nService\n         * @description returns the fallback language used in the application\n         */\n        getFallbackLang: function () {\n          return langCache.getFallbackLang();\n        }\n      };\n\n      return service;\n    }]);\n\n  function localeDirective(i18nService, i18nConstants) {\n    return {\n      compile: function () {\n        return {\n          pre: function ($scope, $elm, $attrs) {\n            var alias = i18nConstants.LOCALE_DIRECTIVE_ALIAS;\n            // check for watchable property\n            var lang = $scope.$eval($attrs[alias]);\n            if (lang) {\n              $scope.$watch($attrs[alias], function () {\n                i18nService.setCurrentLang(lang);\n              });\n            } else if ($attrs.$$observers) {\n              $attrs.$observe(alias, function () {\n                i18nService.setCurrentLang($attrs[alias] || i18nConstants.DEFAULT_LANG);\n              });\n            }\n          }\n        };\n      }\n    };\n  }\n\n  module.directive('uiI18n', ['i18nService', 'i18nConstants', localeDirective]);\n\n  // directive syntax\n  function uitDirective(i18nService, i18nConstants) {\n    return {\n      restrict: 'EA',\n      compile: function () {\n        return {\n          pre: function ($scope, $elm, $attrs) {\n            var listener, observer, prop,\n              alias1 = DIRECTIVE_ALIASES[0],\n              alias2 = DIRECTIVE_ALIASES[1],\n              token = $attrs[alias1] || $attrs[alias2] || $elm.html();\n\n            function translateToken(property) {\n              var safeText = i18nService.getSafeText(property);\n\n              $elm.html(safeText);\n            }\n\n            if ($attrs.$$observers) {\n              prop = $attrs[alias1] ? alias1 : alias2;\n              observer = $attrs.$observe(prop, function (result) {\n                if (result) {\n                  translateToken(result);\n                }\n              });\n            }\n\n            listener = $scope.$on(i18nConstants.UPDATE_EVENT, function() {\n              if (observer) {\n                observer($attrs[alias1] || $attrs[alias2]);\n              } else {\n                // set text based on i18n current language\n                translateToken(token);\n              }\n            });\n            $scope.$on('$destroy', listener);\n\n            translateToken(token);\n          }\n        };\n      }\n    };\n  }\n\n  angular.forEach(DIRECTIVE_ALIASES, function ( alias ) {\n    module.directive(alias, ['i18nService', 'i18nConstants', uitDirective]);\n  });\n\n  // optional filter syntax\n  function uitFilter(i18nService) {\n    return function (data, lang) {\n      // set text based on i18n current language\n      return i18nService.getSafeText(data, lang);\n    };\n  }\n\n  angular.forEach(FILTER_ALIASES, function ( alias ) {\n    module.filter(alias, ['i18nService', uitFilter]);\n  });\n})();\n\n(function () {\n  'use strict';\n\n  /**\n   * @ngdoc overview\n   * @name ui.grid.edit\n   * @description\n   *\n   * # ui.grid.edit\n   *\n   * <div class=\"alert alert-success\" role=\"alert\"><strong>Stable</strong> This feature is stable. There should no longer be breaking api changes without a deprecation warning.</div>\n   *\n   * This module provides cell editing capability to ui.grid. The goal was to emulate keying data in a spreadsheet via\n   * a keyboard.\n   * <br/>\n   * <br/>\n   * To really get the full spreadsheet-like data entry, the ui.grid.cellNav module should be used. This will allow the\n   * user to key data and then tab, arrow, or enter to the cells beside or below.\n   *\n   * <div doc-module-components=\"ui.grid.edit\"></div>\n   */\n\n  var module = angular.module('ui.grid.edit', ['ui.grid']);\n\n  /**\n   *  @ngdoc object\n   *  @name ui.grid.edit.constant:uiGridEditConstants\n   *\n   *  @description constants available in edit module\n   */\n  module.constant('uiGridEditConstants', {\n    EDITABLE_CELL_TEMPLATE: /EDITABLE_CELL_TEMPLATE/g,\n    // must be lowercase because template bulder converts to lower\n    EDITABLE_CELL_DIRECTIVE: /editable_cell_directive/g,\n    events: {\n      BEGIN_CELL_EDIT: 'uiGridEventBeginCellEdit',\n      END_CELL_EDIT: 'uiGridEventEndCellEdit',\n      CANCEL_CELL_EDIT: 'uiGridEventCancelCellEdit'\n    }\n  });\n\n  /**\n   *  @ngdoc service\n   *  @name ui.grid.edit.service:uiGridEditService\n   *\n   *  @description Services for editing features\n   */\n  module.service('uiGridEditService', ['$q', 'uiGridConstants', 'gridUtil',\n    function ($q, uiGridConstants, gridUtil) {\n\n      var service = {\n\n        initializeGrid: function (grid) {\n\n          service.defaultGridOptions(grid.options);\n\n          grid.registerColumnBuilder(service.editColumnBuilder);\n          grid.edit = {};\n\n          /**\n           *  @ngdoc object\n           *  @name ui.grid.edit.api:PublicApi\n           *\n           *  @description Public Api for edit feature\n           */\n          var publicApi = {\n            events: {\n              edit: {\n                /**\n                 * @ngdoc event\n                 * @name afterCellEdit\n                 * @eventOf  ui.grid.edit.api:PublicApi\n                 * @description raised when cell editing is complete\n                 * <pre>\n                 *      gridApi.edit.on.afterCellEdit(scope,function(rowEntity, colDef) {})\n                 * </pre>\n                 * @param {object} rowEntity the options.data element that was edited\n                 * @param {object} colDef the column that was edited\n                 * @param {object} newValue new value\n                 * @param {object} oldValue old value\n                 */\n                afterCellEdit: function (rowEntity, colDef, newValue, oldValue) {\n                },\n                /**\n                 * @ngdoc event\n                 * @name beginCellEdit\n                 * @eventOf  ui.grid.edit.api:PublicApi\n                 * @description raised when cell editing starts on a cell\n                 * <pre>\n                 *      gridApi.edit.on.beginCellEdit(scope,function(rowEntity, colDef) {})\n                 * </pre>\n                 * @param {object} rowEntity the options.data element that was edited\n                 * @param {object} colDef the column that was edited\n                 * @param {object} triggerEvent the event that triggered the edit.  Useful to prevent losing keystrokes on some\n                 *                 complex editors\n                 */\n                beginCellEdit: function (rowEntity, colDef, triggerEvent) {\n                },\n                /**\n                 * @ngdoc event\n                 * @name cancelCellEdit\n                 * @eventOf  ui.grid.edit.api:PublicApi\n                 * @description raised when cell editing is cancelled on a cell\n                 * <pre>\n                 *      gridApi.edit.on.cancelCellEdit(scope,function(rowEntity, colDef) {})\n                 * </pre>\n                 * @param {object} rowEntity the options.data element that was edited\n                 * @param {object} colDef the column that was edited\n                 */\n                cancelCellEdit: function (rowEntity, colDef) {\n                }\n              }\n            },\n            methods: {\n              edit: { }\n            }\n          };\n\n          grid.api.registerEventsFromObject(publicApi.events);\n          // grid.api.registerMethodsFromObject(publicApi.methods);\n        },\n\n        defaultGridOptions: function (gridOptions) {\n\n          /**\n           *  @ngdoc object\n           *  @name ui.grid.edit.api:GridOptions\n           *\n           *  @description Options for configuring the edit feature, these are available to be\n           *  set using the ui-grid {@link ui.grid.class:GridOptions gridOptions}\n           */\n\n          /**\n           *  @ngdoc object\n           *  @name enableCellEdit\n           *  @propertyOf  ui.grid.edit.api:GridOptions\n           *  @description If defined, sets the default value for the editable flag on each individual colDefs\n           *  if their individual enableCellEdit configuration is not defined. Defaults to undefined.\n           */\n\n          /**\n           *  @ngdoc object\n           *  @name cellEditableCondition\n           *  @propertyOf  ui.grid.edit.api:GridOptions\n           *  @description If specified, either a value or function to be used by all columns before editing.\n           *  If false, then editing of cell is not allowed.\n           *  @example\n           *  <pre>\n           *  function($scope, triggerEvent) {\n           *    //use $scope.row.entity, $scope.col.colDef and triggerEvent to determine if editing is allowed\n           *    return true;\n           *  }\n           *  </pre>\n           */\n          gridOptions.cellEditableCondition = gridOptions.cellEditableCondition === undefined ? true : gridOptions.cellEditableCondition;\n\n          /**\n           *  @ngdoc object\n           *  @name editableCellTemplate\n           *  @propertyOf  ui.grid.edit.api:GridOptions\n           *  @description If specified, cellTemplate to use as the editor for all columns.\n           *  <br/> defaults to 'ui-grid/cellTextEditor'\n           */\n\n          /**\n           *  @ngdoc object\n           *  @name enableCellEditOnFocus\n           *  @propertyOf  ui.grid.edit.api:GridOptions\n           *  @description If true, then editor is invoked as soon as cell receives focus. Default false.\n           *  <br/>_requires cellNav feature and the edit feature to be enabled_\n           */\n            // enableCellEditOnFocus can only be used if cellnav module is used\n          gridOptions.enableCellEditOnFocus = gridOptions.enableCellEditOnFocus === undefined ? false : gridOptions.enableCellEditOnFocus;\n        },\n\n        /**\n         * @ngdoc service\n         * @name editColumnBuilder\n         * @methodOf ui.grid.edit.service:uiGridEditService\n         * @description columnBuilder function that adds edit properties to grid column\n         * @returns {promise} promise that will load any needed templates when resolved\n         */\n        editColumnBuilder: function (colDef, col, gridOptions) {\n\n          var promises = [];\n\n          /**\n           *  @ngdoc object\n           *  @name ui.grid.edit.api:ColumnDef\n           *\n           *  @description Column Definition for edit feature, these are available to be\n           *  set using the ui-grid {@link ui.grid.class:GridOptions.columnDef gridOptions.columnDefs}\n           */\n\n          /**\n           *  @ngdoc object\n           *  @name enableCellEdit\n           *  @propertyOf  ui.grid.edit.api:ColumnDef\n           *  @description enable editing on column\n           */\n          colDef.enableCellEdit = colDef.enableCellEdit === undefined ? (gridOptions.enableCellEdit === undefined ?\n            (colDef.type !== 'object') : gridOptions.enableCellEdit) : colDef.enableCellEdit;\n\n          /**\n           *  @ngdoc object\n           *  @name cellEditableCondition\n           *  @propertyOf  ui.grid.edit.api:ColumnDef\n           *  @description If specified, either a value or function evaluated before editing cell.  If falsy, then editing of cell is not allowed.\n           *  @example\n           *  <pre>\n           *  function($scope, triggerEvent) {\n           *    //use $scope.row.entity, $scope.col.colDef and triggerEvent to determine if editing is allowed\n           *    return true;\n           *  }\n           *  </pre>\n           */\n          colDef.cellEditableCondition = colDef.cellEditableCondition === undefined ? gridOptions.cellEditableCondition :  colDef.cellEditableCondition;\n\n          /**\n           *  @ngdoc object\n           *  @name editableCellTemplate\n           *  @propertyOf  ui.grid.edit.api:ColumnDef\n           *  @description cell template to be used when editing this column. Can be Url or text template\n           *  <br/>Defaults to gridOptions.editableCellTemplate\n           */\n          if (colDef.enableCellEdit) {\n            colDef.editableCellTemplate = colDef.editableCellTemplate || gridOptions.editableCellTemplate || 'ui-grid/cellEditor';\n\n            promises.push(gridUtil.getTemplate(colDef.editableCellTemplate)\n              .then(\n              function (template) {\n                col.editableCellTemplate = template;\n              },\n              function (res) {\n                // Todo handle response error here?\n                throw new Error(\"Couldn't fetch/use colDef.editableCellTemplate '\" + colDef.editableCellTemplate + \"'\");\n              }));\n          }\n\n          /**\n           *  @ngdoc object\n           *  @name enableCellEditOnFocus\n           *  @propertyOf  ui.grid.edit.api:ColumnDef\n           *  @requires ui.grid.cellNav\n           *  @description If true, then editor is invoked as soon as cell receives focus. Default false.\n           *  <br>_requires both the cellNav feature and the edit feature to be enabled_\n           */\n            // enableCellEditOnFocus can only be used if cellnav module is used\n          colDef.enableCellEditOnFocus = colDef.enableCellEditOnFocus === undefined ? gridOptions.enableCellEditOnFocus : colDef.enableCellEditOnFocus;\n\n\n          /**\n           *  @ngdoc string\n           *  @name editModelField\n           *  @propertyOf  ui.grid.edit.api:ColumnDef\n           *  @description a bindable string value that is used when binding to edit controls instead of colDef.field\n           *  <br/> example: You have a complex property on and object like state:{abbrev: 'MS',name: 'Mississippi'}.  The\n           *  grid should display state.name in the cell and sort/filter based on the state.name property but the editor\n           *  requires the full state object.\n           *  <br/>colDef.field = 'state.name'\n           *  <br/>colDef.editModelField = 'state'\n           */\n          // colDef.editModelField\n\n          return $q.all(promises);\n        },\n\n        /**\n         * @ngdoc service\n         * @name isStartEditKey\n         * @methodOf ui.grid.edit.service:uiGridEditService\n         * @description  Determines if a keypress should start editing.  Decorate this service to override with your\n         * own key events.  See service decorator in angular docs.\n         * @param {Event} evt keydown event\n         * @returns {boolean} true if an edit should start\n         */\n        isStartEditKey: function (evt) {\n          return !(evt.metaKey ||\n              evt.keyCode === uiGridConstants.keymap.ESC ||\n              evt.keyCode === uiGridConstants.keymap.SHIFT ||\n              evt.keyCode === uiGridConstants.keymap.CTRL ||\n              evt.keyCode === uiGridConstants.keymap.ALT ||\n              evt.keyCode === uiGridConstants.keymap.WIN ||\n              evt.keyCode === uiGridConstants.keymap.CAPSLOCK ||\n\n             evt.keyCode === uiGridConstants.keymap.LEFT ||\n            (evt.keyCode === uiGridConstants.keymap.TAB && evt.shiftKey) ||\n\n            evt.keyCode === uiGridConstants.keymap.RIGHT ||\n            evt.keyCode === uiGridConstants.keymap.TAB ||\n\n            evt.keyCode === uiGridConstants.keymap.UP ||\n            (evt.keyCode === uiGridConstants.keymap.ENTER && evt.shiftKey) ||\n\n            evt.keyCode === uiGridConstants.keymap.DOWN ||\n            evt.keyCode === uiGridConstants.keymap.ENTER);\n        }\n      };\n\n      return service;\n\n    }]);\n\n  /**\n   *  @ngdoc directive\n   *  @name ui.grid.edit.directive:uiGridEdit\n   *  @element div\n   *  @restrict A\n   *\n   *  @description Adds editing features to the ui-grid directive.\n   *\n   *  @example\n   <example module=\"app\">\n   <file name=\"app.js\">\n   var app = angular.module('app', ['ui.grid', 'ui.grid.edit']);\n\n   app.controller('MainCtrl', ['$scope', function ($scope) {\n      $scope.data = [\n        { name: 'Bob', title: 'CEO' },\n            { name: 'Frank', title: 'Lowly Developer' }\n      ];\n\n      $scope.columnDefs = [\n        {name: 'name', enableCellEdit: true},\n        {name: 'title', enableCellEdit: true}\n      ];\n    }]);\n   </file>\n   <file name=\"index.ced81ed4.html\">\n   <div ng-controller=\"MainCtrl\">\n   <div ui-grid=\"{ data: data, columnDefs: columnDefs }\" ui-grid-edit></div>\n   </div>\n   </file>\n   </example>\n   */\n  module.directive('uiGridEdit', ['gridUtil', 'uiGridEditService', function (gridUtil, uiGridEditService) {\n    return {\n      replace: true,\n      priority: 0,\n      require: '^uiGrid',\n      scope: false,\n      compile: function () {\n        return {\n          pre: function ($scope, $elm, $attrs, uiGridCtrl) {\n            uiGridEditService.initializeGrid(uiGridCtrl.grid);\n          },\n          post: function ($scope, $elm, $attrs, uiGridCtrl) {\n          }\n        };\n      }\n    };\n  }]);\n\n  /**\n   *  @ngdoc directive\n   *  @name ui.grid.edit.directive:uiGridRenderContainer\n   *  @element div\n   *  @restrict A\n   *\n   *  @description Adds keydown listeners to renderContainer element so we can capture when to begin edits\n   *\n   */\n  module.directive('uiGridViewport', [ 'uiGridEditConstants',\n    function ( uiGridEditConstants) {\n      return {\n        replace: true,\n        priority: -99998, // run before cellNav\n        require: ['^uiGrid', '^uiGridRenderContainer'],\n        scope: false,\n        compile: function () {\n          return {\n            post: function ($scope, $elm, $attrs, controllers) {\n              var uiGridCtrl = controllers[0];\n\n              // Skip attaching if edit and cellNav is not enabled\n              if (!uiGridCtrl.grid.api.edit || !uiGridCtrl.grid.api.cellNav) { return; }\n\n              var containerId =  controllers[1].containerId;\n              // no need to process for other containers\n              if (containerId !== 'body') {\n                return;\n              }\n\n              // refocus on the grid\n              $scope.$on(uiGridEditConstants.events.CANCEL_CELL_EDIT, function () {\n                uiGridCtrl.focus();\n              });\n              $scope.$on(uiGridEditConstants.events.END_CELL_EDIT, function () {\n                uiGridCtrl.focus();\n              });\n            }\n          };\n        }\n      };\n    }]);\n\n  /**\n   *  @ngdoc directive\n   *  @name ui.grid.edit.directive:uiGridCell\n   *  @element div\n   *  @restrict A\n   *\n   *  @description Stacks on top of ui.grid.uiGridCell to provide in-line editing capabilities to the cell\n   *  Editing Actions.\n   *\n   *  Binds edit start events to the uiGridCell element.  When the events fire, the gridCell element is appended\n   *  with the columnDef.editableCellTemplate element ('cellEditor.html' by default).\n   *\n   *  The editableCellTemplate should respond to uiGridEditConstants.events.BEGIN\\_CELL\\_EDIT angular event\n   *  and do the initial steps needed to edit the cell (setfocus on input element, etc).\n   *\n   *  When the editableCellTemplate recognizes that the editing is ended (blur event, Enter key, etc.)\n   *  it should emit the uiGridEditConstants.events.END\\_CELL\\_EDIT event.\n   *\n   *  If editableCellTemplate recognizes that the editing has been cancelled (esc key)\n   *  it should emit the uiGridEditConstants.events.CANCEL\\_CELL\\_EDIT event.  The original value\n   *  will be set back on the model by the uiGridCell directive.\n   *\n   *  Events that invoke editing:\n   *    - dblclick\n   *    - F2 keydown (when using cell selection)\n   *\n   *  Events that end editing:\n   *    - Dependent on the specific editableCellTemplate\n   *    - Standards should be blur and enter keydown\n   *\n   *  Events that cancel editing:\n   *    - Dependent on the specific editableCellTemplate\n   *    - Standards should be Esc keydown\n   *\n   *  Grid Events that end editing:\n   *    - uiGridConstants.events.GRID_SCROLL\n   *\n   */\n\n  /**\n   *  @ngdoc object\n   *  @name ui.grid.edit.api:GridRow\n   *\n   *  @description GridRow options for edit feature, these are available to be\n   *  set internally only, by other features\n   */\n\n  /**\n   *  @ngdoc object\n   *  @name enableCellEdit\n   *  @propertyOf  ui.grid.edit.api:GridRow\n   *  @description enable editing on row, grouping for example might disable editing on group header rows\n   */\n\n  module.directive('uiGridCell',\n    ['$compile', '$injector', '$timeout', 'uiGridConstants', 'uiGridEditConstants', 'gridUtil', '$parse', 'uiGridEditService', '$rootScope', '$q',\n      function ($compile, $injector, $timeout, uiGridConstants, uiGridEditConstants, gridUtil, $parse, uiGridEditService, $rootScope, $q) {\n        var touchstartTimeout = 500;\n        if ($injector.has('uiGridCellNavService')) {\n          var uiGridCellNavService = $injector.get('uiGridCellNavService');\n        }\n\n        return {\n          priority: -100, // run after default uiGridCell directive\n          restrict: 'A',\n          scope: false,\n          require: '?^uiGrid',\n          link: function ($scope, $elm, $attrs, uiGridCtrl) {\n            var html,\n              origCellValue,\n              cellModel,\n              cancelTouchstartTimeout,\n              inEdit = false;\n\n            var editCellScope;\n\n            if (!$scope.col.colDef.enableCellEdit) {\n              return;\n            }\n\n            var cellNavNavigateDereg = function() {};\n            var viewPortKeyDownDereg = function() {};\n\n\n            var setEditable = function() {\n              if ($scope.col.colDef.enableCellEdit && $scope.row.enableCellEdit !== false) {\n                if (!$scope.beginEditEventsWired) { // prevent multiple attachments\n                  registerBeginEditEvents();\n                }\n              } else {\n                if ($scope.beginEditEventsWired) {\n                  cancelBeginEditEvents();\n                }\n              }\n            };\n\n            setEditable();\n\n            var rowWatchDereg = $scope.$watch('row', function (n, o) {\n              if (n !== o) {\n                setEditable();\n              }\n            });\n\n\n            $scope.$on('$destroy', function destroyEvents() {\n              rowWatchDereg();\n              // unbind all jquery events in order to avoid memory leaks\n              $elm.off();\n            });\n\n            function registerBeginEditEvents() {\n              $elm.on('dblclick', beginEdit);\n\n              // Add touchstart handling. If the users starts a touch and it doesn't end after X milliseconds, then start the edit\n              $elm.on('touchstart', touchStart);\n\n              if (uiGridCtrl && uiGridCtrl.grid.api.cellNav) {\n\n                viewPortKeyDownDereg = uiGridCtrl.grid.api.cellNav.on.viewPortKeyDown($scope, function (evt, rowCol) {\n                  if (rowCol === null) {\n                    return;\n                  }\n\n                  if (rowCol.row === $scope.row && rowCol.col === $scope.col && !$scope.col.colDef.enableCellEditOnFocus) {\n                    // important to do this before scrollToIfNecessary\n                    beginEditKeyDown(evt);\n                  }\n                });\n\n                cellNavNavigateDereg = uiGridCtrl.grid.api.cellNav.on.navigate($scope, function (newRowCol, oldRowCol, evt) {\n                  if ($scope.col.colDef.enableCellEditOnFocus) {\n                    // Don't begin edit if the cell hasn't changed\n                    if (newRowCol.row === $scope.row && newRowCol.col === $scope.col &&\n                      (evt === null || (evt && (evt.type === 'click' || evt.type === 'keydown')))) {\n                      $timeout(function() {\n                        beginEdit(evt);\n                      });\n                    }\n                  }\n                });\n              }\n\n              $scope.beginEditEventsWired = true;\n            }\n\n            function touchStart(event) {\n              // jQuery masks events\n              if (typeof(event.originalEvent) !== 'undefined' && event.originalEvent !== undefined) {\n                event = event.originalEvent;\n              }\n\n              // Bind touchend handler\n              $elm.on('touchend', touchEnd);\n\n              // Start a timeout\n              cancelTouchstartTimeout = $timeout(function() { }, touchstartTimeout);\n\n              // Timeout's done! Start the edit\n              cancelTouchstartTimeout.then(function () {\n                // Use setTimeout to start the edit because beginEdit expects to be outside of $digest\n                setTimeout(beginEdit, 0);\n\n                // Undbind the touchend handler, we don't need it anymore\n                $elm.off('touchend', touchEnd);\n              }).catch(angular.noop);\n            }\n\n            // Cancel any touchstart timeout\n            function touchEnd() {\n              $timeout.cancel(cancelTouchstartTimeout);\n              $elm.off('touchend', touchEnd);\n            }\n\n            function cancelBeginEditEvents() {\n              $elm.off('dblclick', beginEdit);\n              $elm.off('keydown', beginEditKeyDown);\n              $elm.off('touchstart', touchStart);\n              cellNavNavigateDereg();\n              viewPortKeyDownDereg();\n              $scope.beginEditEventsWired = false;\n            }\n\n            function beginEditKeyDown(evt) {\n              if (uiGridEditService.isStartEditKey(evt)) {\n                beginEdit(evt);\n              }\n            }\n\n            function shouldEdit(col, row, triggerEvent) {\n              return !row.isSaving &&\n                ( angular.isFunction(col.colDef.cellEditableCondition) ?\n                    col.colDef.cellEditableCondition($scope, triggerEvent) :\n                    col.colDef.cellEditableCondition );\n            }\n\n\n            function beginEdit(triggerEvent) {\n              // we need to scroll the cell into focus before invoking the editor\n              $scope.grid.api.core.scrollToIfNecessary($scope.row, $scope.col)\n                .then(function () {\n                  beginEditAfterScroll(triggerEvent);\n                });\n            }\n\n            /**\n             *  @ngdoc property\n             *  @name editDropdownOptionsArray\n             *  @propertyOf ui.grid.edit.api:ColumnDef\n             *  @description an array of values in the format\n             *  [ {id: xxx, value: xxx} ], which is populated\n             *  into the edit dropdown\n             *\n             */\n            /**\n             *  @ngdoc property\n             *  @name editDropdownIdLabel\n             *  @propertyOf ui.grid.edit.api:ColumnDef\n             *  @description the label for the \"id\" field\n             *  in the editDropdownOptionsArray.  Defaults\n             *  to 'id'\n             *  @example\n             *  <pre>\n             *    $scope.gridOptions = {\n             *      columnDefs: [\n             *        {name: 'status', editableCellTemplate: 'ui-grid/dropdownEditor',\n             *          editDropdownOptionsArray: [{code: 1, status: 'active'}, {code: 2, status: 'inactive'}],\n             *          editDropdownIdLabel: 'code', editDropdownValueLabel: 'status' }\n             *      ],\n             *  </pre>\n             *\n             */\n            /**\n             *  @ngdoc property\n             *  @name editDropdownRowEntityOptionsArrayPath\n             *  @propertyOf ui.grid.edit.api:ColumnDef\n             *  @description a path to a property on row.entity containing an\n             *  array of values in the format\n             *  [ {id: xxx, value: xxx} ], which will be used to populate\n             *  the edit dropdown.  This can be used when the dropdown values are dependent on\n             *  the backing row entity.\n             *  If this property is set then editDropdownOptionsArray will be ignored.\n             *  @example\n             *  <pre>\n             *    $scope.gridOptions = {\n             *      columnDefs: [\n             *        {name: 'status', editableCellTemplate: 'ui-grid/dropdownEditor',\n             *          editDropdownRowEntityOptionsArrayPath: 'foo.bars[0].baz',\n             *          editDropdownIdLabel: 'code', editDropdownValueLabel: 'status' }\n             *      ],\n             *  </pre>\n             *\n             */\n            /**\n             *  @ngdoc service\n             *  @name editDropdownOptionsFunction\n             *  @methodOf ui.grid.edit.api:ColumnDef\n             *  @description a function returning an array of values in the format\n             *  [ {id: xxx, value: xxx} ], which will be used to populate\n             *  the edit dropdown.  This can be used when the dropdown values are dependent on\n             *  the backing row entity with some kind of algorithm.\n             *  If this property is set then both editDropdownOptionsArray and\n             *  editDropdownRowEntityOptionsArrayPath will be ignored.\n             *  @param {object} rowEntity the options.data element that the returned array refers to\n             *  @param {object} colDef the column that implements this dropdown\n             *  @returns {object} an array of values in the format\n             *  [ {id: xxx, value: xxx} ] used to populate the edit dropdown\n             *  @example\n             *  <pre>\n             *    $scope.gridOptions = {\n             *      columnDefs: [\n             *        {name: 'status', editableCellTemplate: 'ui-grid/dropdownEditor',\n             *          editDropdownOptionsFunction: function(rowEntity, colDef) {\n             *            if (rowEntity.foo === 'bar') {\n             *              return [{id: 'bar1', value: 'BAR 1'},\n             *                      {id: 'bar2', value: 'BAR 2'},\n             *                      {id: 'bar3', value: 'BAR 3'}];\n             *            } else {\n             *              return [{id: 'foo1', value: 'FOO 1'},\n             *                      {id: 'foo2', value: 'FOO 2'}];\n             *            }\n             *          },\n             *          editDropdownIdLabel: 'code', editDropdownValueLabel: 'status' }\n             *      ],\n             *  </pre>\n             *\n             */\n            /**\n             *  @ngdoc property\n             *  @name editDropdownValueLabel\n             *  @propertyOf ui.grid.edit.api:ColumnDef\n             *  @description the label for the \"value\" field\n             *  in the editDropdownOptionsArray.  Defaults\n             *  to 'value'\n             *  @example\n             *  <pre>\n             *    $scope.gridOptions = {\n             *      columnDefs: [\n             *        {name: 'status', editableCellTemplate: 'ui-grid/dropdownEditor',\n             *          editDropdownOptionsArray: [{code: 1, status: 'active'}, {code: 2, status: 'inactive'}],\n             *          editDropdownIdLabel: 'code', editDropdownValueLabel: 'status' }\n             *      ],\n             *  </pre>\n             *\n             */\n            /**\n             *  @ngdoc property\n             *  @name editDropdownFilter\n             *  @propertyOf ui.grid.edit.api:ColumnDef\n             *  @description A filter that you would like to apply to the values in the options list\n             *  of the dropdown.  For example if you were using angular-translate you might set this\n             *  to `'translate'`\n             *  @example\n             *  <pre>\n             *    $scope.gridOptions = {\n             *      columnDefs: [\n             *        {name: 'status', editableCellTemplate: 'ui-grid/dropdownEditor',\n             *          editDropdownOptionsArray: [{code: 1, status: 'active'}, {code: 2, status: 'inactive'}],\n             *          editDropdownIdLabel: 'code', editDropdownValueLabel: 'status', editDropdownFilter: 'translate' }\n             *      ],\n             *  </pre>\n             *\n             */\n            function beginEditAfterScroll(triggerEvent) {\n              // If we are already editing, then just skip this so we don't try editing twice...\n              if (inEdit) {\n                return;\n              }\n\n              if (!shouldEdit($scope.col, $scope.row, triggerEvent)) {\n                return;\n              }\n\n              var modelField = $scope.row.getQualifiedColField($scope.col);\n              if ($scope.col.colDef.editModelField) {\n                modelField = gridUtil.preEval('row.entity.' + $scope.col.colDef.editModelField);\n              }\n\n              cellModel = $parse(modelField);\n\n              // get original value from the cell\n              origCellValue = cellModel($scope);\n\n              html = $scope.col.editableCellTemplate;\n              html = html.replace(uiGridConstants.MODEL_COL_FIELD, modelField);\n              html = html.replace(uiGridConstants.COL_FIELD, 'grid.getCellValue(row, col)');\n\n              var optionFilter = $scope.col.colDef.editDropdownFilter ? '|' + $scope.col.colDef.editDropdownFilter : '';\n              html = html.replace(uiGridConstants.CUSTOM_FILTERS, optionFilter);\n\n              var inputType = 'text';\n              switch ($scope.col.colDef.type) {\n                case 'boolean':\n                  inputType = 'checkbox';\n                  break;\n                case 'number':\n                  inputType = 'number';\n                  break;\n                case 'date':\n                  inputType = 'date';\n                  break;\n              }\n              html = html.replace('INPUT_TYPE', inputType);\n\n              // In order to fill dropdown options we use:\n              // - A function/promise or\n              // - An array inside of row entity if no function exists or\n              // - A single array for the whole column if none of the previous exists.\n              var editDropdownOptionsFunction = $scope.col.colDef.editDropdownOptionsFunction;\n              if (editDropdownOptionsFunction) {\n                $q.when(editDropdownOptionsFunction($scope.row.entity, $scope.col.colDef))\n                        .then(function(result) {\n                  $scope.editDropdownOptionsArray = result;\n                });\n              } else {\n                var editDropdownRowEntityOptionsArrayPath = $scope.col.colDef.editDropdownRowEntityOptionsArrayPath;\n                if (editDropdownRowEntityOptionsArrayPath) {\n                  $scope.editDropdownOptionsArray =  resolveObjectFromPath($scope.row.entity, editDropdownRowEntityOptionsArrayPath);\n                }\n                else {\n                  $scope.editDropdownOptionsArray = $scope.col.colDef.editDropdownOptionsArray;\n                }\n              }\n              $scope.editDropdownIdLabel = $scope.col.colDef.editDropdownIdLabel ? $scope.col.colDef.editDropdownIdLabel : 'id';\n              $scope.editDropdownValueLabel = $scope.col.colDef.editDropdownValueLabel ? $scope.col.colDef.editDropdownValueLabel : 'value';\n\n              var createEditor = function() {\n                inEdit = true;\n                cancelBeginEditEvents();\n                var cellElement = angular.element(html);\n                $elm.append(cellElement);\n                editCellScope = $scope.$new();\n                $compile(cellElement)(editCellScope);\n                var gridCellContentsEl = angular.element($elm.children()[0]);\n                gridCellContentsEl.addClass('ui-grid-cell-contents-hidden');\n              };\n              if (!$rootScope.$$phase) {\n                $scope.$apply(createEditor);\n              } else {\n                createEditor();\n              }\n\n              // stop editing when grid is scrolled\n              var deregOnGridScroll = $scope.col.grid.api.core.on.scrollBegin($scope, function () {\n                if ($scope.grid.disableScrolling) {\n                  return;\n                }\n                endEdit();\n                $scope.grid.api.edit.raise.afterCellEdit($scope.row.entity, $scope.col.colDef, cellModel($scope), origCellValue);\n                deregOnGridScroll();\n                deregOnEndCellEdit();\n                deregOnCancelCellEdit();\n              });\n\n              // end editing\n              var deregOnEndCellEdit = $scope.$on(uiGridEditConstants.events.END_CELL_EDIT, function () {\n                endEdit();\n                $scope.grid.api.edit.raise.afterCellEdit($scope.row.entity, $scope.col.colDef, cellModel($scope), origCellValue);\n                deregOnEndCellEdit();\n                deregOnGridScroll();\n                deregOnCancelCellEdit();\n              });\n\n              // cancel editing\n              var deregOnCancelCellEdit = $scope.$on(uiGridEditConstants.events.CANCEL_CELL_EDIT, function () {\n                cancelEdit();\n                deregOnCancelCellEdit();\n                deregOnGridScroll();\n                deregOnEndCellEdit();\n              });\n\n              $scope.$broadcast(uiGridEditConstants.events.BEGIN_CELL_EDIT, triggerEvent);\n              $timeout(function () {\n                // execute in a timeout to give any complex editor templates a cycle to completely render\n                $scope.grid.api.edit.raise.beginCellEdit($scope.row.entity, $scope.col.colDef, triggerEvent);\n              });\n            }\n\n            function endEdit() {\n              $scope.grid.disableScrolling = false;\n              if (!inEdit) {\n                return;\n              }\n\n              // sometimes the events can't keep up with the keyboard and grid focus is lost, so always focus\n              // back to grid here. The focus call needs to be before the $destroy and removal of the control,\n              // otherwise ng-model-options of UpdateOn: 'blur' will not work.\n              if (uiGridCtrl && uiGridCtrl.grid.api.cellNav) {\n                uiGridCtrl.focus();\n              }\n\n              var gridCellContentsEl = angular.element($elm.children()[0]);\n              // remove edit element\n              editCellScope.$destroy();\n              var children = $elm.children();\n              for (var i = 1; i < children.length; i++) {\n                angular.element(children[i]).remove();\n              }\n              gridCellContentsEl.removeClass('ui-grid-cell-contents-hidden');\n              inEdit = false;\n              registerBeginEditEvents();\n              $scope.grid.api.core.notifyDataChange( uiGridConstants.dataChange.EDIT );\n            }\n\n            function cancelEdit() {\n              $scope.grid.disableScrolling = false;\n              if (!inEdit) {\n                return;\n              }\n              cellModel.assign($scope, origCellValue);\n              $scope.$apply();\n\n              $scope.grid.api.edit.raise.cancelCellEdit($scope.row.entity, $scope.col.colDef);\n              endEdit();\n            }\n\n            // resolves a string path against the given object\n            // shamelessly borrowed from\n            // http://stackoverflow.com/questions/6491463/accessing-nested-javascript-objects-with-string-key\n            function resolveObjectFromPath(object, path) {\n              path = path.replace(/\\[(\\w+)\\]/g, '.$1'); // convert indexes to properties\n              path = path.replace(/^\\./, '');           // strip a leading dot\n              var a = path.split('.');\n              while (a.length) {\n                  var n = a.shift();\n                  if (n in object) {\n                      object = object[n];\n                  } else {\n                      return;\n                  }\n              }\n              return object;\n            }\n          }\n        };\n      }]);\n\n  /**\n   *  @ngdoc directive\n   *  @name ui.grid.edit.directive:uiGridEditor\n   *  @element div\n   *  @restrict A\n   *\n   *  @description input editor directive for editable fields.\n   *  Provides EndEdit and CancelEdit events\n   *\n   *  Events that end editing:\n   *     blur and enter keydown\n   *\n   *  Events that cancel editing:\n   *    - Esc keydown\n   *\n   */\n  module.directive('uiGridEditor',\n    ['gridUtil', 'uiGridConstants', 'uiGridEditConstants','$timeout', 'uiGridEditService',\n      function (gridUtil, uiGridConstants, uiGridEditConstants, $timeout, uiGridEditService) {\n        return {\n          scope: true,\n          require: ['?^uiGrid', '?^uiGridRenderContainer', 'ngModel'],\n          compile: function () {\n            return {\n              pre: function ($scope, $elm, $attrs) {\n\n              },\n              post: function ($scope, $elm, $attrs, controllers) {\n                var uiGridCtrl, renderContainerCtrl, ngModel;\n                if (controllers[0]) { uiGridCtrl = controllers[0]; }\n                if (controllers[1]) { renderContainerCtrl = controllers[1]; }\n                if (controllers[2]) { ngModel = controllers[2]; }\n\n                // set focus at start of edit\n                $scope.$on(uiGridEditConstants.events.BEGIN_CELL_EDIT, function () {\n                  // must be in a timeout since it requires a new digest cycle\n                  $timeout(function () {\n                    $elm[0].focus();\n                    // only select text if it is not being replaced below in the cellNav viewPortKeyPress\n                    if ($elm[0].select && ($scope.col.colDef.enableCellEditOnFocus || !(uiGridCtrl && uiGridCtrl.grid.api.cellNav))) {\n                      $elm[0].select();\n                    }\n                    else {\n                      // some browsers (Chrome) stupidly, imo, support the w3 standard that number, email, ...\n                      // fields should not allow setSelectionRange.  We ignore the error for those browsers\n                      // https://www.w3.org/Bugs/Public/show_bug.cgi?id=24796\n                      try {\n                        $elm[0].setSelectionRange($elm[0].value.length, $elm[0].value.length);\n                      }\n                      catch (ex) {\n                        // ignore\n                      }\n                    }\n                  });\n\n                  // set the keystroke that started the edit event\n                  // we must do this because the BeginEdit is done in a different event loop than the intitial\n                  // keydown event\n                  // fire this event for the keypress that is received\n                  if (uiGridCtrl && uiGridCtrl.grid.api.cellNav) {\n                    var viewPortKeyDownUnregister = uiGridCtrl.grid.api.cellNav.on.viewPortKeyPress($scope, function (evt, rowCol) {\n                      if (uiGridEditService.isStartEditKey(evt)) {\n                        var code = typeof evt.which === 'number' ? evt.which : evt.keyCode;\n                        if (code > 0) {\n                          ngModel.$setViewValue(String.fromCharCode(code), evt);\n                          ngModel.$render();\n                        }\n                      }\n                      viewPortKeyDownUnregister();\n                    });\n                  }\n\n                  // macOS will blur the checkbox when clicked in Safari and Firefox,\n                  // to get around this, we disable the blur handler on mousedown,\n                  // and then focus the checkbox and re-enable the blur handler after $timeout\n                  $elm.on('mousedown', function(evt) {\n                    if ($elm[0].type === 'checkbox') {\n                      $elm.off('blur', $scope.stopEdit);\n                      $timeout(function() {\n                        $elm[0].focus();\n                        $elm.on('blur', $scope.stopEdit);\n                      });\n                    }\n                  });\n\n                  if ($elm[0]) {\n                    $elm[0].focus();\n                  }\n                  $elm.on('blur', $scope.stopEdit);\n                });\n\n\n                $scope.deepEdit = false;\n\n                $scope.stopEdit = function (evt) {\n                  if ($scope.inputForm && !$scope.inputForm.$valid) {\n                    evt.stopPropagation();\n                    $scope.$emit(uiGridEditConstants.events.CANCEL_CELL_EDIT);\n                  }\n                  else {\n                    $scope.$emit(uiGridEditConstants.events.END_CELL_EDIT);\n                  }\n                  $scope.deepEdit = false;\n                };\n\n\n                $elm.on('click', function (evt) {\n                  if ($elm[0].type !== 'checkbox') {\n                    $scope.deepEdit = true;\n                    $scope.$applyAsync(function () {\n                      $scope.grid.disableScrolling = true;\n                    });\n                  }\n                });\n\n                $elm.on('keydown', function (evt) {\n                  switch (evt.keyCode) {\n                    case uiGridConstants.keymap.ESC:\n                      evt.stopPropagation();\n                      $scope.$emit(uiGridEditConstants.events.CANCEL_CELL_EDIT);\n                      break;\n                  }\n\n                  if ($scope.deepEdit &&\n                    (evt.keyCode === uiGridConstants.keymap.LEFT ||\n                     evt.keyCode === uiGridConstants.keymap.RIGHT ||\n                     evt.keyCode === uiGridConstants.keymap.UP ||\n                     evt.keyCode === uiGridConstants.keymap.DOWN)) {\n                    evt.stopPropagation();\n                  }\n                  // Pass the keydown event off to the cellNav service, if it exists\n                  else if (uiGridCtrl && uiGridCtrl.grid.api.cellNav) {\n                    evt.uiGridTargetRenderContainerId = renderContainerCtrl.containerId;\n                    if (uiGridCtrl.cellNav.handleKeyDown(evt) !== null) {\n                      $scope.stopEdit(evt);\n                    }\n                  }\n                  else {\n                    // handle enter and tab for editing not using cellNav\n                    switch (evt.keyCode) {\n                      case uiGridConstants.keymap.ENTER: // Enter (Leave Field)\n                      case uiGridConstants.keymap.TAB:\n                        evt.stopPropagation();\n                        evt.preventDefault();\n                        $scope.stopEdit(evt);\n                        break;\n                    }\n                  }\n\n                  return true;\n                });\n\n                $scope.$on('$destroy', function unbindEvents() {\n                  // unbind all jquery events in order to avoid memory leaks\n                  $elm.off();\n                });\n              }\n            };\n          }\n        };\n      }]);\n\n  /**\n   *  @ngdoc directive\n   *  @name ui.grid.edit.directive:input\n   *  @element input\n   *  @restrict E\n   *\n   *  @description directive to provide binding between input[date] value and ng-model for angular 1.2\n   *  It is similar to input[date] directive of angular 1.3\n   *\n   *  Supported date format for input is 'yyyy-MM-dd'\n   *  The directive will set the $valid property of input element and the enclosing form to false if\n   *  model is invalid date or value of input is entered wrong.\n   *\n   */\n    module.directive('uiGridEditor', ['$filter', function ($filter) {\n      function parseDateString(dateString) {\n        if (typeof(dateString) === 'undefined' || dateString === '') {\n          return null;\n        }\n        var parts = dateString.split('-');\n        if (parts.length !== 3) {\n          return null;\n        }\n        var year = parseInt(parts[0], 10);\n        var month = parseInt(parts[1], 10);\n        var day = parseInt(parts[2], 10);\n\n        if (month < 1 || year < 1 || day < 1) {\n          return null;\n        }\n        return new Date(year, (month - 1), day);\n      }\n      return {\n        priority: -100, // run after default uiGridEditor directive\n        require: '?ngModel',\n        link: function (scope, element, attrs, ngModel) {\n          if (angular.version.minor === 2 && attrs.type && attrs.type === 'date' && ngModel) {\n            ngModel.$formatters.push(function (modelValue) {\n              ngModel.$setValidity(null,(!modelValue || !isNaN(modelValue.getTime())));\n              return $filter('date')(modelValue, 'yyyy-MM-dd');\n            });\n\n            ngModel.$parsers.push(function (viewValue) {\n              if (viewValue && viewValue.length > 0) {\n                var dateValue = parseDateString(viewValue);\n                ngModel.$setValidity(null, (dateValue && !isNaN(dateValue.getTime())));\n                return dateValue;\n              }\n              else {\n                ngModel.$setValidity(null, true);\n                return null;\n              }\n            });\n          }\n        }\n      };\n    }]);\n\n\n  /**\n   *  @ngdoc directive\n   *  @name ui.grid.edit.directive:uiGridEditDropdown\n   *  @element div\n   *  @restrict A\n   *\n   *  @description dropdown editor for editable fields.\n   *  Provides EndEdit and CancelEdit events\n   *\n   *  Events that end editing:\n   *     blur and enter keydown, and any left/right nav\n   *\n   *  Events that cancel editing:\n   *    - Esc keydown\n   *\n   */\n  module.directive('uiGridEditDropdown',\n    ['uiGridConstants', 'uiGridEditConstants', '$timeout',\n      function (uiGridConstants, uiGridEditConstants, $timeout) {\n        return {\n          require: ['?^uiGrid', '?^uiGridRenderContainer'],\n          scope: true,\n          compile: function () {\n            return {\n              pre: function ($scope, $elm, $attrs) {\n\n              },\n              post: function ($scope, $elm, $attrs, controllers) {\n                var uiGridCtrl = controllers[0];\n                var renderContainerCtrl = controllers[1];\n\n                // set focus at start of edit\n                $scope.$on(uiGridEditConstants.events.BEGIN_CELL_EDIT, function () {\n                  $timeout(function() {\n                    $elm[0].focus();\n                  });\n\n                  $elm[0].style.width = ($elm[0].parentElement.offsetWidth - 1) + 'px';\n                  $elm.on('blur', function (evt) {\n                    $scope.stopEdit(evt);\n                  });\n                });\n\n\n                $scope.stopEdit = function (evt) {\n                  // no need to validate a dropdown - invalid values shouldn't be\n                  // available in the list\n                  $scope.$emit(uiGridEditConstants.events.END_CELL_EDIT);\n                };\n\n                $elm.on('keydown', function (evt) {\n                  switch (evt.keyCode) {\n                    case uiGridConstants.keymap.ESC:\n                      evt.stopPropagation();\n                      $scope.$emit(uiGridEditConstants.events.CANCEL_CELL_EDIT);\n                      break;\n                  }\n                  if (uiGridCtrl && uiGridCtrl.grid.api.cellNav) {\n                    evt.uiGridTargetRenderContainerId = renderContainerCtrl.containerId;\n                    if (uiGridCtrl.cellNav.handleKeyDown(evt) !== null) {\n                      $scope.stopEdit(evt);\n                    }\n                  }\n                  else {\n                    // handle enter and tab for editing not using cellNav\n                    switch (evt.keyCode) {\n                      case uiGridConstants.keymap.ENTER: // Enter (Leave Field)\n                      case uiGridConstants.keymap.TAB:\n                        evt.stopPropagation();\n                        evt.preventDefault();\n                        $scope.stopEdit(evt);\n                        break;\n                    }\n                  }\n                  return true;\n                });\n\n                $scope.$on('$destroy', function unbindEvents() {\n                  // unbind jquery events to prevent memory leaks\n                  $elm.off();\n                });\n              }\n            };\n          }\n        };\n      }]);\n\n  /**\n   *  @ngdoc directive\n   *  @name ui.grid.edit.directive:uiGridEditFileChooser\n   *  @element div\n   *  @restrict A\n   *\n   *  @description input editor directive for editable fields.\n   *  Provides EndEdit and CancelEdit events\n   *\n   *  Events that end editing:\n   *     blur and enter keydown\n   *\n   *  Events that cancel editing:\n   *    - Esc keydown\n   *\n   */\n  module.directive('uiGridEditFileChooser',\n    ['gridUtil', 'uiGridConstants', 'uiGridEditConstants',\n      function (gridUtil, uiGridConstants, uiGridEditConstants) {\n        return {\n          scope: true,\n          require: ['?^uiGrid', '?^uiGridRenderContainer'],\n          compile: function () {\n            return {\n              pre: function ($scope, $elm, $attrs) {\n\n              },\n              post: function ($scope, $elm) {\n                function handleFileSelect(event) {\n                  var target = event.srcElement || event.target;\n\n                  if (target && target.files && target.files.length > 0) {\n                    /**\n                     *  @ngdoc property\n                     *  @name editFileChooserCallback\n                     *  @propertyOf  ui.grid.edit.api:ColumnDef\n                     *  @description A function that should be called when any files have been chosen\n                     *  by the user.  You should use this to process the files appropriately for your\n                     *  application.\n                     *\n                     *  It passes the gridCol, the gridRow (from which you can get gridRow.entity),\n                     *  and the files.  The files are in the format as returned from the file chooser,\n                     *  an array of files, with each having useful information such as:\n                     *  - `files[0].lastModifiedDate`\n                     *  - `files[0].name`\n                     *  - `files[0].size`  (appears to be in bytes)\n                     *  - `files[0].type`  (MIME type by the looks)\n                     *\n                     *  Typically you would do something with these files - most commonly you would\n                     *  use the filename or read the file itself in.  The example function does both.\n                     *\n                     *  @example\n                     *  <pre>\n                     *  editFileChooserCallBack: function(gridRow, gridCol, files ) {\n                     *    // ignore all but the first file, it can only choose one anyway\n                     *    // set the filename into this column\n                     *    gridRow.entity.filename = file[0].name;\n                     *\n                     *    // read the file and set it into a hidden column, which we may do stuff with later\n                     *    var setFile = function(fileContent) {\n                     *      gridRow.entity.file = fileContent.currentTarget.result;\n                     *    };\n                     *    var reader = new FileReader();\n                     *    reader.onload = setFile;\n                     *    reader.readAsText( files[0] );\n                     *  }\n                     *  </pre>\n                     */\n                    if ( typeof($scope.col.colDef.editFileChooserCallback) === 'function' ) {\n                      $scope.col.colDef.editFileChooserCallback($scope.row, $scope.col, target.files);\n                    } else {\n                      gridUtil.logError('You need to set colDef.editFileChooserCallback to use the file chooser');\n                    }\n\n                    target.form.reset();\n                    $scope.$emit(uiGridEditConstants.events.END_CELL_EDIT);\n                  } else {\n                    $scope.$emit(uiGridEditConstants.events.CANCEL_CELL_EDIT);\n                  }\n                  $elm[0].removeEventListener('change', handleFileSelect, false);\n                }\n\n                $elm[0].addEventListener('change', handleFileSelect, false);\n\n                $scope.$on(uiGridEditConstants.events.BEGIN_CELL_EDIT, function () {\n                  $elm[0].focus();\n                  $elm[0].select();\n\n                  $elm.on('blur', function () {\n                    $scope.$emit(uiGridEditConstants.events.END_CELL_EDIT);\n                    $elm.off();\n                  });\n                });\n              }\n            };\n          }\n        };\n      }]);\n})();\n\n(function () {\n  'use strict';\n\n  /**\n   * @ngdoc overview\n   * @name ui.grid.emptyBaseLayer\n   * @description\n   *\n   * # ui.grid.emptyBaseLayer\n   *\n   * <div class=\"alert alert-warning\" role=\"alert\"><strong>Alpha</strong> This feature is in development. There will almost certainly be breaking api changes, or there are major outstanding bugs.</div>\n   *\n   * This module provides the ability to have the background of the ui-grid be empty rows, this would be displayed in the case were\n   * the grid height is greater then the amount of rows displayed.\n   *\n   * <div doc-module-components=\"ui.grid.emptyBaseLayer\"></div>\n   */\n  var module = angular.module('ui.grid.emptyBaseLayer', ['ui.grid']);\n\n\n  /**\n   *  @ngdoc service\n   *  @name ui.grid.emptyBaseLayer.service:uiGridBaseLayerService\n   *\n   *  @description Services for the empty base layer grid\n   */\n  module.service('uiGridBaseLayerService', ['gridUtil', '$compile', function (gridUtil, $compile) {\n    return {\n      initializeGrid: function (grid, disableEmptyBaseLayer) {\n\n        /**\n         *  @ngdoc object\n         *  @name ui.grid.emptyBaseLayer.api:GridOptions\n         *\n         *  @description GridOptions for emptyBaseLayer feature, these are available to be\n         *  set using the ui-grid {@link ui.grid.class:GridOptions gridOptions}\n         */\n        grid.baseLayer = {\n          emptyRows: []\n        };\n\n        /**\n         *  @ngdoc object\n         *  @name enableEmptyGridBaseLayer\n         *  @propertyOf  ui.grid.emptyBaseLayer.api:GridOptions\n         *  @description Enable empty base layer, which shows empty rows as background on the entire grid\n         *  <br/>Defaults to true, if the directive is used.\n         *  <br/>Set to false either by setting this attribute or passing false to the directive.\n         */\n        // default option to true unless it was explicitly set to false\n        if (grid.options.enableEmptyGridBaseLayer !== false) {\n          grid.options.enableEmptyGridBaseLayer = !disableEmptyBaseLayer;\n        }\n      },\n\n      setNumberOfEmptyRows: function(viewportHeight, grid) {\n        var rowHeight = grid.options.rowHeight,\n          rows = Math.ceil(viewportHeight / rowHeight);\n\n        if (rows > 0) {\n          grid.baseLayer.emptyRows = [];\n          for (var i = 0; i < rows; i++) {\n            grid.baseLayer.emptyRows.push({});\n          }\n        }\n      }\n    };\n  }]);\n\n  /**\n   *  @ngdoc object\n   *  @name ui.grid.emptyBaseLayer.directive:uiGridEmptyBaseLayer\n   *  @description Shows empty rows in the background of the ui-grid, these span\n   *  the full height of the ui-grid, so that there won't be blank space below the shown rows.\n   *  @example\n   *  <pre>\n   *  <div ui-grid=\"gridOptions\" class=\"grid\" ui-grid-empty-base-layer></div>\n   *  </pre>\n   *  Or you can enable/disable it dynamically by passing in true or false. It doesn't\n   *  the value, so it would only be set on initial render.\n   *  <pre>\n   *  <div ui-grid=\"gridOptions\" class=\"grid\" ui-grid-empty-base-layer=\"false\"></div>\n   *  </pre>\n   */\n  module.directive('uiGridEmptyBaseLayer', ['gridUtil', 'uiGridBaseLayerService',\n      '$parse',\n    function (gridUtil, uiGridBaseLayerService, $parse) {\n      return {\n        require: '^uiGrid',\n        scope: false,\n        compile: function () {\n          return {\n            pre: function ($scope, $elm, $attrs, uiGridCtrl) {\n              var disableEmptyBaseLayer = $parse($attrs.uiGridEmptyBaseLayer)($scope) === false;\n\n              uiGridBaseLayerService.initializeGrid(uiGridCtrl.grid, disableEmptyBaseLayer);\n            },\n            post: function ($scope, $elm, $attrs, uiGridCtrl) {\n              if (!uiGridCtrl.grid.options.enableEmptyGridBaseLayer) {\n                return;\n              }\n\n              var renderBodyContainer = uiGridCtrl.grid.renderContainers.body,\n                viewportHeight = renderBodyContainer.getViewportHeight();\n\n              function heightHasChanged() {\n                var newViewPortHeight = renderBodyContainer.getViewportHeight();\n\n                if (newViewPortHeight !== viewportHeight) {\n                  viewportHeight = newViewPortHeight;\n                  return true;\n                }\n                return false;\n              }\n\n              function getEmptyBaseLayerCss(viewportHeight) {\n                // Set ui-grid-empty-base-layer height\n                return '.grid' + uiGridCtrl.grid.id +\n                  ' .ui-grid-render-container ' +\n                  '.ui-grid-empty-base-layer-container.ui-grid-canvas ' +\n                  '{ height: ' + viewportHeight + 'px; }';\n              }\n\n              uiGridCtrl.grid.registerStyleComputation({\n                func: function() {\n                  if (heightHasChanged()) {\n                    uiGridBaseLayerService.setNumberOfEmptyRows(viewportHeight, uiGridCtrl.grid);\n                  }\n                  return getEmptyBaseLayerCss(viewportHeight);\n                }\n              });\n            }\n          };\n        }\n      };\n    }]);\n\n  /**\n   *  @ngdoc directive\n   *  @name ui.grid.emptyBaseLayer.directive:uiGridViewport\n   *  @description stacks on the uiGridViewport directive to append the empty grid base layer html elements to the\n   *  default gridRow template\n   */\n  module.directive('uiGridViewport',\n    ['$compile', 'gridUtil', '$templateCache',\n      function ($compile, gridUtil, $templateCache) {\n        return {\n          priority: -200,\n          scope: false,\n          compile: function ($elm) {\n            var emptyBaseLayerContainer = $templateCache.get('ui-grid/emptyBaseLayerContainer');\n            $elm.prepend(emptyBaseLayerContainer);\n            return {\n              pre: function ($scope, $elm, $attrs, controllers) {\n              },\n              post: function ($scope, $elm, $attrs, controllers) {\n              }\n            };\n          }\n        };\n      }]);\n\n})();\n\n(function () {\n  'use strict';\n\n  /**\n   * @ngdoc overview\n   * @name ui.grid.expandable\n   * @description\n   *\n   * # ui.grid.expandable\n   *\n   * <div class=\"alert alert-warning\" role=\"alert\"><strong>Alpha</strong> This feature is in development. There will almost certainly be breaking api changes, or there are major outstanding bugs.</div>\n   *\n   * This module provides the ability to create subgrids with the ability to expand a row\n   * to show the subgrid.\n   *\n   * <div doc-module-components=\"ui.grid.expandable\"></div>\n   */\n  var module = angular.module('ui.grid.expandable', ['ui.grid']);\n\n  /**\n   *  @ngdoc service\n   *  @name ui.grid.expandable.service:uiGridExpandableService\n   *\n   *  @description Services for the expandable grid\n   */\n  module.service('uiGridExpandableService', ['gridUtil', function (gridUtil) {\n    var service = {\n      initializeGrid: function (grid) {\n\n        grid.expandable = {};\n        grid.expandable.expandedAll = false;\n\n        /**\n         *  @ngdoc boolean\n         *  @name enableOnDblClickExpand\n         *  @propertyOf  ui.grid.expandable.api:GridOptions\n         *  @description Defaults to true.\n         *  @example\n         *  <pre>\n         *    $scope.gridOptions = {\n         *      onDblClickExpand: false\n         *    }\n         *  </pre>\n         */\n        grid.options.enableOnDblClickExpand = grid.options.enableOnDblClickExpand !== false;\n        /**\n         *  @ngdoc boolean\n         *  @name enableExpandable\n         *  @propertyOf  ui.grid.expandable.api:GridOptions\n         *  @description Whether or not to use expandable feature, allows you to turn off expandable on specific grids\n         *  within your application, or in specific modes on _this_ grid. Defaults to true.\n         *  @example\n         *  <pre>\n         *    $scope.gridOptions = {\n         *      enableExpandable: false\n         *    }\n         *  </pre>\n         */\n        grid.options.enableExpandable = grid.options.enableExpandable !== false;\n\n        /**\n         *  @ngdoc object\n         *  @name showExpandAllButton\n         *  @propertyOf  ui.grid.expandable.api:GridOptions\n         *  @description Whether or not to display the expand all button, allows you to hide expand all button on specific grids\n         *  within your application, or in specific modes on _this_ grid. Defaults to true.\n         *  @example\n         *  <pre>\n         *    $scope.gridOptions = {\n         *      showExpandAllButton: false\n         *    }\n         *  </pre>\n         */\n        grid.options.showExpandAllButton = grid.options.showExpandAllButton !== false;\n\n        /**\n         *  @ngdoc object\n         *  @name expandableRowHeight\n         *  @propertyOf  ui.grid.expandable.api:GridOptions\n         *  @description Height in pixels of the expanded subgrid.  Defaults to\n         *  150\n         *  @example\n         *  <pre>\n         *    $scope.gridOptions = {\n         *      expandableRowHeight: 150\n         *    }\n         *  </pre>\n         */\n        grid.options.expandableRowHeight = grid.options.expandableRowHeight || 150;\n\n        /**\n         *  @ngdoc object\n         *  @name expandableRowHeaderWidth\n         *  @propertyOf  ui.grid.expandable.api:GridOptions\n         *  @description Width in pixels of the expandable column. Defaults to 40\n         *  @example\n         *  <pre>\n         *    $scope.gridOptions = {\n         *      expandableRowHeaderWidth: 40\n         *    }\n         *  </pre>\n         */\n        grid.options.expandableRowHeaderWidth = grid.options.expandableRowHeaderWidth || 40;\n\n        /**\n         *  @ngdoc object\n         *  @name expandableRowTemplate\n         *  @propertyOf  ui.grid.expandable.api:GridOptions\n         *  @description Mandatory. The template for your expanded row\n         *  @example\n         *  <pre>\n         *    $scope.gridOptions = {\n         *      expandableRowTemplate: 'expandableRowTemplate.html'\n         *    }\n         *  </pre>\n         */\n        if ( grid.options.enableExpandable && !grid.options.expandableRowTemplate ) {\n          gridUtil.logError( 'You have not set the expandableRowTemplate, disabling expandable module' );\n          grid.options.enableExpandable = false;\n        }\n\n        /**\n         *  @ngdoc object\n         *  @name ui.grid.expandable.api:PublicApi\n         *\n         *  @description Public Api for expandable feature\n         */\n        /**\n         *  @ngdoc object\n         *  @name ui.grid.expandable.api:GridRow\n         *\n         *  @description Additional properties added to GridRow when using the expandable module\n         */\n        /**\n         *  @ngdoc object\n         *  @name ui.grid.expandable.api:GridOptions\n         *\n         *  @description Options for configuring the expandable feature, these are available to be\n         *  set using the ui-grid {@link ui.grid.class:GridOptions gridOptions}\n         */\n        var publicApi = {\n          events: {\n            expandable: {\n              /**\n               * @ngdoc event\n               * @name rowExpandedBeforeStateChanged\n               * @eventOf  ui.grid.expandable.api:PublicApi\n               * @description raised when row is expanding or collapsing\n               * <pre>\n               *      gridApi.expandable.on.rowExpandedBeforeStateChanged(scope,function(row, event) {})\n               * </pre>\n               * @param {scope} scope the application scope\n               * @param {GridRow} row the row that was expanded\n               * @param {Event} evt object if raised from an event\n               */\n              rowExpandedBeforeStateChanged: function(scope, row, evt) {},\n\n              /**\n               * @ngdoc event\n               * @name rowExpandedStateChanged\n               * @eventOf  ui.grid.expandable.api:PublicApi\n               * @description raised when row expanded or collapsed\n               * <pre>\n               *      gridApi.expandable.on.rowExpandedStateChanged(scope,function(row, event) {})\n               * </pre>\n               * @param {scope} scope the application scope\n               * @param {GridRow} row the row that was expanded\n               * @param {Event} evt object if raised from an event\n               */\n              rowExpandedStateChanged: function (scope, row, evt) {},\n\n              /**\n               * @ngdoc event\n               * @name rowExpandedRendered\n               * @eventOf  ui.grid.expandable.api:PublicApi\n               * @description raised when expanded row is rendered\n               * <pre>\n               *      gridApi.expandable.on.rowExpandedRendered(scope,function(row, event) {})\n               * </pre>\n               * @param {scope} scope the application scope\n               * @param {GridRow} row the row that was expanded\n               * @param {Event} evt object if raised from an event\n               */\n              rowExpandedRendered: function (scope, row, evt) {}\n            }\n          },\n\n          methods: {\n            expandable: {\n              /**\n               * @ngdoc method\n               * @name toggleRowExpansion\n               * @methodOf  ui.grid.expandable.api:PublicApi\n               * @description Toggle a specific row\n               * <pre>\n               *      gridApi.expandable.toggleRowExpansion(rowEntity, event);\n               * </pre>\n               * @param {object} rowEntity the data entity for the row you want to expand\n               * @param {Event} [e] event (if exist)\n               */\n              toggleRowExpansion: function (rowEntity, e) {\n                var row = grid.getRow(rowEntity);\n\n                if (row !== null) {\n                  service.toggleRowExpansion(grid, row, e);\n                }\n              },\n\n              /**\n               * @ngdoc method\n               * @name expandAllRows\n               * @methodOf  ui.grid.expandable.api:PublicApi\n               * @description Expand all subgrids.\n               * <pre>\n               *      gridApi.expandable.expandAllRows();\n               * </pre>\n               */\n              expandAllRows: function() {\n                service.expandAllRows(grid);\n              },\n\n              /**\n               * @ngdoc method\n               * @name collapseAllRows\n               * @methodOf  ui.grid.expandable.api:PublicApi\n               * @description Collapse all subgrids.\n               * <pre>\n               *      gridApi.expandable.collapseAllRows();\n               * </pre>\n               */\n              collapseAllRows: function() {\n                service.collapseAllRows(grid);\n              },\n\n              /**\n               * @ngdoc method\n               * @name toggleAllRows\n               * @methodOf  ui.grid.expandable.api:PublicApi\n               * @description Toggle all subgrids.\n               * <pre>\n               *      gridApi.expandable.toggleAllRows();\n               * </pre>\n               */\n              toggleAllRows: function() {\n                service.toggleAllRows(grid);\n              },\n              /**\n               * @ngdoc function\n               * @name expandRow\n               * @methodOf  ui.grid.expandable.api:PublicApi\n               * @description Expand the data row\n               * @param {object} rowEntity gridOptions.data[] array instance\n               */\n              expandRow: function (rowEntity) {\n                var row = grid.getRow(rowEntity);\n\n                if (row !== null && !row.isExpanded) {\n                  service.toggleRowExpansion(grid, row);\n                }\n              },\n              /**\n               * @ngdoc function\n               * @name collapseRow\n               * @methodOf  ui.grid.expandable.api:PublicApi\n               * @description Collapse the data row\n               * @param {object} rowEntity gridOptions.data[] array instance\n               */\n              collapseRow: function (rowEntity) {\n                var row = grid.getRow(rowEntity);\n\n                if (row !== null && row.isExpanded) {\n                  service.toggleRowExpansion(grid, row);\n                }\n              },\n              /**\n               * @ngdoc function\n               * @name getExpandedRows\n               * @methodOf  ui.grid.expandable.api:PublicApi\n               * @description returns all expandedRow's entity references\n               */\n              getExpandedRows: function () {\n                return service.getExpandedRows(grid).map(function (gridRow) {\n                  return gridRow.entity;\n                });\n              }\n            }\n          }\n        };\n        grid.api.registerEventsFromObject(publicApi.events);\n        grid.api.registerMethodsFromObject(publicApi.methods);\n      },\n\n      /**\n       *\n       * @param grid\n       * @param row\n       * @param {Event} [e] event (if exist)\n       */\n      toggleRowExpansion: function (grid, row, e) {\n        // trigger the \"before change\" event. Can change row height dynamically this way.\n        grid.api.expandable.raise.rowExpandedBeforeStateChanged(row);\n        /**\n         *  @ngdoc object\n         *  @name isExpanded\n         *  @propertyOf  ui.grid.expandable.api:GridRow\n         *  @description Whether or not the row is currently expanded.\n         *  @example\n         *  <pre>\n         *    $scope.api.expandable.on.rowExpandedStateChanged($scope, function (row) {\n         *      if (row.isExpanded) {\n         *        //...\n         *      }\n         *    });\n         *  </pre>\n         */\n        row.isExpanded = !row.isExpanded;\n        if (angular.isUndefined(row.expandedRowHeight)) {\n          row.expandedRowHeight = grid.options.expandableRowHeight;\n        }\n\n        if (row.isExpanded) {\n          row.height = row.grid.options.rowHeight + row.expandedRowHeight;\n          grid.expandable.expandedAll = service.getExpandedRows(grid).length === grid.rows.length;\n        }\n        else {\n          row.height = row.grid.options.rowHeight;\n          grid.expandable.expandedAll = false;\n        }\n        grid.api.expandable.raise.rowExpandedStateChanged(row, e);\n\n        // fire event on render complete\n        function _tWatcher() {\n          if (row.expandedRendered) {\n            grid.api.expandable.raise.rowExpandedRendered(row, e);\n          }\n          else {\n            window.setTimeout(_tWatcher, 1e2);\n          }\n        }\n        _tWatcher();\n      },\n\n      expandAllRows: function(grid) {\n        grid.renderContainers.body.visibleRowCache.forEach( function(row) {\n          if (!row.isExpanded && !(row.entity.subGridOptions && row.entity.subGridOptions.disableRowExpandable)) {\n            service.toggleRowExpansion(grid, row);\n          }\n        });\n        grid.expandable.expandedAll = true;\n        grid.queueGridRefresh();\n      },\n\n      collapseAllRows: function(grid) {\n        grid.renderContainers.body.visibleRowCache.forEach( function(row) {\n          if (row.isExpanded) {\n            service.toggleRowExpansion(grid, row);\n          }\n        });\n        grid.expandable.expandedAll = false;\n        grid.queueGridRefresh();\n      },\n\n      toggleAllRows: function(grid) {\n        if (grid.expandable.expandedAll) {\n          service.collapseAllRows(grid);\n        }\n        else {\n          service.expandAllRows(grid);\n        }\n      },\n\n      getExpandedRows: function (grid) {\n        return grid.rows.filter(function (row) {\n          return row.isExpanded;\n        });\n      }\n    };\n    return service;\n  }]);\n\n  /**\n   *  @ngdoc object\n   *  @name enableExpandableRowHeader\n   *  @propertyOf  ui.grid.expandable.api:GridOptions\n   *  @description Show a rowHeader to provide the expandable buttons.  If set to false then implies\n   *  you're going to use a custom method for expanding and collapsing the subgrids. Defaults to true.\n   *  @example\n   *  <pre>\n   *    $scope.gridOptions = {\n   *      enableExpandableRowHeader: false\n   *    }\n   *  </pre>\n   */\n\n  module.directive('uiGridExpandable', ['uiGridExpandableService', '$templateCache',\n    function (uiGridExpandableService, $templateCache) {\n      return {\n        replace: true,\n        priority: 0,\n        require: '^uiGrid',\n        scope: false,\n        compile: function () {\n          return {\n            pre: function ($scope, $elm, $attrs, uiGridCtrl) {\n              uiGridExpandableService.initializeGrid(uiGridCtrl.grid);\n\n              if (!uiGridCtrl.grid.options.enableExpandable) {\n                return;\n              }\n\n              if (uiGridCtrl.grid.options.enableExpandableRowHeader !== false ) {\n                var expandableRowHeaderColDef = {\n                  name: 'expandableButtons',\n                  displayName: '',\n                  exporterSuppressExport: true,\n                  enableColumnResizing: false,\n                  enableColumnMenu: false,\n                  width: uiGridCtrl.grid.options.expandableRowHeaderWidth || 30\n                };\n\n                expandableRowHeaderColDef.cellTemplate = $templateCache.get('ui-grid/expandableRowHeader');\n                expandableRowHeaderColDef.headerCellTemplate = $templateCache.get('ui-grid/expandableTopRowHeader');\n                uiGridCtrl.grid.addRowHeaderColumn(expandableRowHeaderColDef, -90);\n              }\n            },\n            post: function ($scope, $elm, $attrs, uiGridCtrl) {}\n          };\n        }\n      };\n    }]);\n\n  /**\n   *  @ngdoc directive\n   *  @name ui.grid.expandable.directive:uiGrid\n   *  @description stacks on the uiGrid directive to register child grid with parent row when child is created\n   */\n  module.directive('uiGrid',\n    function () {\n      return {\n        replace: true,\n        priority: 599,\n        require: '^uiGrid',\n        scope: false,\n        compile: function () {\n          return {\n            pre: function ($scope, $elm, $attrs, uiGridCtrl) {\n\n              uiGridCtrl.grid.api.core.on.renderingComplete($scope, function() {\n                // if a parent grid row is on the scope, then add the parentRow property to this childGrid\n                if ($scope.row && $scope.row.grid && $scope.row.grid.options\n                  && $scope.row.grid.options.enableExpandable) {\n\n                  /**\n                   *  @ngdoc directive\n                   *  @name ui.grid.expandable.class:Grid\n                   *  @description Additional Grid properties added by expandable module\n                   */\n\n                  /**\n                   *  @ngdoc object\n                   *  @name parentRow\n                   *  @propertyOf ui.grid.expandable.class:Grid\n                   *  @description reference to the expanded parent row that owns this grid\n                   */\n                  uiGridCtrl.grid.parentRow = $scope.row;\n\n                  // todo: adjust height on parent row when child grid height changes. we need some sort of gridHeightChanged event\n                 // uiGridCtrl.grid.core.on.canvasHeightChanged($scope, function(oldHeight, newHeight) {\n                 //   uiGridCtrl.grid.parentRow = newHeight;\n                 // });\n                }\n              });\n            },\n            post: function ($scope, $elm, $attrs, uiGridCtrl) {}\n          };\n        }\n      };\n    });\n\n  /**\n   *  @ngdoc directive\n   *  @name ui.grid.expandable.directive:uiGridExpandableRow\n   *  @description directive to render the Row template on Expand\n   */\n  module.directive('uiGridExpandableRow',\n  ['uiGridExpandableService', '$compile', 'uiGridConstants','gridUtil',\n    function (uiGridExpandableService, $compile, uiGridConstants, gridUtil) {\n\n      return {\n        replace: false,\n        priority: 0,\n        scope: false,\n        compile: function () {\n          return {\n            pre: function ($scope, $elm) {\n              gridUtil.getTemplate($scope.grid.options.expandableRowTemplate).then(\n                function (template) {\n                  if ($scope.grid.options.expandableRowScope) {\n                    /**\n                     *  @ngdoc object\n                     *  @name expandableRowScope\n                     *  @propertyOf  ui.grid.expandable.api:GridOptions\n                     *  @description  Variables of object expandableScope will be available in the scope of the expanded subgrid\n                     *  @example\n                     *  <pre>\n                     *    $scope.gridOptions = {\n                     *      expandableRowScope: expandableScope\n                     *    }\n                     *  </pre>\n                     */\n                    var expandableRowScope = $scope.grid.options.expandableRowScope;\n\n                    for (var property in expandableRowScope) {\n                      if (expandableRowScope.hasOwnProperty(property)) {\n                        $scope[property] = expandableRowScope[property];\n                      }\n                    }\n                  }\n                  var expandedRowElement = angular.element(template);\n\n                  expandedRowElement = $compile(expandedRowElement)($scope);\n                  $elm.append(expandedRowElement);\n                  $scope.row.element = $elm;\n                  $scope.row.expandedRendered = true;\n              });\n            },\n\n            post: function ($scope, $elm) {\n              $scope.row.element = $elm;\n              $scope.$on('$destroy', function() {\n                $scope.row.expandedRendered = false;\n              });\n            }\n          };\n        }\n      };\n    }]);\n\n  /**\n   *  @ngdoc directive\n   *  @name ui.grid.expandable.directive:uiGridRow\n   *  @description stacks on the uiGridRow directive to add support for expandable rows\n   */\n  module.directive('uiGridRow',\n      function () {\n        return {\n          priority: -200,\n          scope: false,\n          compile: function () {\n            return {\n              pre: function ($scope, $elm) {\n                if (!$scope.grid.options.enableExpandable) {\n                  return;\n                }\n\n                $scope.expandableRow = {};\n\n                $scope.expandableRow.shouldRenderExpand = function () {\n                  return $scope.colContainer.name === 'body'\n                    && $scope.grid.options.enableExpandable !== false\n                    && $scope.row.isExpanded\n                    && (!$scope.grid.isScrollingVertically || $scope.row.expandedRendered);\n                };\n\n                $scope.expandableRow.shouldRenderFiller = function () {\n                  return $scope.row.isExpanded\n                    && (\n                      $scope.colContainer.name !== 'body'\n                      || ($scope.grid.isScrollingVertically && !$scope.row.expandedRendered));\n                };\n\n                if ($scope.grid.options.enableOnDblClickExpand) {\n                  $elm.on('dblclick', function (event) {\n                    // if necessary, it is possible for everyone to stop the processing of a single click OR\n                    // Inside the Config in the output agent to enter a line:\n                    // event.stopPropagation()\n                    $scope.grid.api.expandable.toggleRowExpansion($scope.row.entity, event);\n                  });\n                }\n              },\n              post: function ($scope, $elm, $attrs, controllers) {}\n            };\n          }\n        };\n      });\n\n  /**\n   *  @ngdoc directive\n   *  @name ui.grid.expandable.directive:uiGridViewport\n   *  @description stacks on the uiGridViewport directive to append the expandable row html elements to the\n   *  default gridRow template\n   */\n  module.directive('uiGridViewport',\n    ['$compile', 'gridUtil', '$templateCache',\n      function ($compile, gridUtil, $templateCache) {\n        return {\n          priority: -200,\n          scope: false,\n          compile: function ($elm) {\n\n             // todo: this adds ng-if watchers to each row even if the grid is not using expandable directive\n             //      or options.enableExpandable == false\n             //      The alternative is to compile the template and append to each row in a uiGridRow directive\n\n            var rowRepeatDiv = angular.element($elm.children().children()[0]),\n              expandedRowFillerElement = $templateCache.get('ui-grid/expandableScrollFiller'),\n              expandedRowElement = $templateCache.get('ui-grid/expandableRow');\n\n            rowRepeatDiv.append(expandedRowElement);\n            rowRepeatDiv.append(expandedRowFillerElement);\n            return {\n              pre: function ($scope, $elm, $attrs, controllers) {\n              },\n              post: function ($scope, $elm, $attrs, controllers) {\n              }\n            };\n          }\n        };\n      }]);\n\n})();\n\n/* global ExcelBuilder */\n/* global console */\n\n(function () {\n  'use strict';\n\n  /**\n   * @ngdoc overview\n   * @name ui.grid.exporter\n   * @description\n   *\n   * # ui.grid.exporter\n   *\n   * <div class=\"alert alert-success\" role=\"alert\"><strong>Stable</strong> This feature is stable. There should no longer be breaking api changes without a deprecation warning.</div>\n   *\n   * This module provides the ability to export data from the grid.\n   *\n   * Data can be exported in a range of formats, and all data, visible\n   * data, or selected rows can be exported, with all columns or visible\n   * columns.\n   *\n   * No UI is provided, the caller should provide their own UI/buttons\n   * as appropriate, or enable the gridMenu\n   *\n   * <br/>\n   * <br/>\n   *\n   * <div doc-module-components=\"ui.grid.exporter\"></div>\n   */\n\n  var module = angular.module('ui.grid.exporter', ['ui.grid']);\n\n  /**\n   *  @ngdoc object\n   *  @name ui.grid.exporter.constant:uiGridExporterConstants\n   *\n   *  @description constants available in exporter module\n   */\n  /**\n   * @ngdoc property\n   * @propertyOf ui.grid.exporter.constant:uiGridExporterConstants\n   * @name ALL\n   * @description export all data, including data not visible.  Can\n   * be set for either rowTypes or colTypes\n   */\n  /**\n   * @ngdoc property\n   * @propertyOf ui.grid.exporter.constant:uiGridExporterConstants\n   * @name VISIBLE\n   * @description export only visible data, including data not visible.  Can\n   * be set for either rowTypes or colTypes\n   */\n  /**\n   * @ngdoc property\n   * @propertyOf ui.grid.exporter.constant:uiGridExporterConstants\n   * @name SELECTED\n   * @description export all data, including data not visible.  Can\n   * be set only for rowTypes, selection of only some columns is\n   * not supported\n   */\n  module.constant('uiGridExporterConstants', {\n    featureName: 'exporter',\n    rowHeaderColName: 'treeBaseRowHeaderCol',\n    selectionRowHeaderColName: 'selectionRowHeaderCol',\n    ALL: 'all',\n    VISIBLE: 'visible',\n    SELECTED: 'selected',\n    CSV_CONTENT: 'CSV_CONTENT',\n    BUTTON_LABEL: 'BUTTON_LABEL',\n    FILE_NAME: 'FILE_NAME'\n  });\n\n  /**\n   *  @ngdoc service\n   *  @name ui.grid.exporter.service:uiGridExporterService\n   *\n   *  @description Services for exporter feature\n   */\n  module.service('uiGridExporterService', ['$filter', '$q', 'uiGridExporterConstants', 'gridUtil', '$compile', '$interval', 'i18nService',\n    function ($filter, $q, uiGridExporterConstants, gridUtil, $compile, $interval, i18nService) {\n      var service = {\n\n        delay: 100,\n        type: null,\n\n        initializeGrid: function (grid) {\n\n          // add feature namespace and any properties to grid for needed state\n          grid.exporter = {};\n          this.defaultGridOptions(grid.options);\n\n          /**\n           *  @ngdoc object\n           *  @name ui.grid.exporter.api:PublicApi\n           *\n           *  @description Public Api for exporter feature\n           */\n          var publicApi = {\n            events: {\n              exporter: {\n              }\n            },\n            methods: {\n              exporter: {\n                /**\n                 * @ngdoc function\n                 * @name csvExport\n                 * @methodOf  ui.grid.exporter.api:PublicApi\n                 * @description Exports rows from the grid in csv format,\n                 * the data exported is selected based on the provided options\n                 * @param {string} rowTypes which rows to export, valid values are\n                 * uiGridExporterConstants.ALL, uiGridExporterConstants.VISIBLE,\n                 * uiGridExporterConstants.SELECTED\n                 * @param {string} colTypes which columns to export, valid values are\n                 * uiGridExporterConstants.ALL, uiGridExporterConstants.VISIBLE\n                 */\n                csvExport: function (rowTypes, colTypes) {\n                  service.csvExport(grid, rowTypes, colTypes);\n                },\n                /**\n                 * @ngdoc function\n                 * @name pdfExport\n                 * @methodOf  ui.grid.exporter.api:PublicApi\n                 * @description Exports rows from the grid in pdf format,\n                 * the data exported is selected based on the provided options\n                 * Note that this function has a dependency on pdfMake, all\n                 * going well this has been installed for you.\n                 * The resulting pdf opens in a new browser window.\n                 * @param {string} rowTypes which rows to export, valid values are\n                 * uiGridExporterConstants.ALL, uiGridExporterConstants.VISIBLE,\n                 * uiGridExporterConstants.SELECTED\n                 * @param {string} colTypes which columns to export, valid values are\n                 * uiGridExporterConstants.ALL, uiGridExporterConstants.VISIBLE\n                 */\n                pdfExport: function (rowTypes, colTypes) {\n                  service.pdfExport(grid, rowTypes, colTypes);\n                },\n                /**\n                 * @ngdoc function\n                 * @name excelExport\n                 * @methodOf  ui.grid.exporter.api:PublicApi\n                 * @description Exports rows from the grid in excel format,\n                 * the data exported is selected based on the provided options\n                 * @param {string} rowTypes which rows to export, valid values are\n                 * uiGridExporterConstants.ALL, uiGridExporterConstants.VISIBLE,\n                 * uiGridExporterConstants.SELECTED\n                 * @param {string} colTypes which columns to export, valid values are\n                 * uiGridExporterConstants.ALL, uiGridExporterConstants.VISIBLE\n                 */\n                excelExport: function (rowTypes, colTypes) {\n                  service.excelExport(grid, rowTypes, colTypes);\n                }\n              }\n            }\n          };\n\n          grid.api.registerEventsFromObject(publicApi.events);\n\n          grid.api.registerMethodsFromObject(publicApi.methods);\n\n          if (grid.api.core.addToGridMenu) {\n            service.addToMenu( grid );\n          } else {\n            // order of registration is not guaranteed, register in a little while\n            $interval( function() {\n              if (grid.api.core.addToGridMenu) {\n                service.addToMenu( grid );\n              }\n            }, this.delay, 1);\n          }\n\n        },\n\n        defaultGridOptions: function (gridOptions) {\n          // default option to true unless it was explicitly set to false\n          /**\n           * @ngdoc object\n           * @name ui.grid.exporter.api:GridOptions\n           *\n           * @description GridOptions for exporter feature, these are available to be\n           * set using the ui-grid {@link ui.grid.class:GridOptions gridOptions}\n           */\n          /**\n           * @ngdoc object\n           * @name ui.grid.exporter.api:ColumnDef\n           * @description ColumnDef settings for exporter\n           */\n          /**\n           * @ngdoc object\n           * @name exporterSuppressMenu\n           * @propertyOf  ui.grid.exporter.api:GridOptions\n           * @description Don't show the export menu button, implying the user\n           * will roll their own UI for calling the exporter\n           * <br/>Defaults to false\n           */\n          gridOptions.exporterSuppressMenu = gridOptions.exporterSuppressMenu === true;\n          /**\n           * @ngdoc object\n           * @name exporterMenuLabel\n           * @propertyOf  ui.grid.exporter.api:GridOptions\n           * @description The text to show on the exporter menu button\n           * link\n           * <br/>Defaults to 'Export'\n           */\n          gridOptions.exporterMenuLabel = gridOptions.exporterMenuLabel ? gridOptions.exporterMenuLabel : 'Export';\n          /**\n           * @ngdoc object\n           * @name exporterSuppressColumns\n           * @propertyOf  ui.grid.exporter.api:GridOptions\n           * @description Columns that should not be exported.  The selectionRowHeader is already automatically\n           * suppressed, but if you had a button column or some other \"system\" column that shouldn't be shown in the\n           * output then add it in this list.  You should provide an array of column names.\n           * <br/>Defaults to: []\n           * <pre>\n           *   gridOptions.exporterSuppressColumns = [ 'buttons' ];\n           * </pre>\n           */\n          gridOptions.exporterSuppressColumns = gridOptions.exporterSuppressColumns ? gridOptions.exporterSuppressColumns : [];\n          /**\n           * @ngdoc object\n           * @name exporterCsvColumnSeparator\n           * @propertyOf  ui.grid.exporter.api:GridOptions\n           * @description The character to use as column separator\n           * link\n           * <br/>Defaults to ','\n           */\n          gridOptions.exporterCsvColumnSeparator = gridOptions.exporterCsvColumnSeparator ? gridOptions.exporterCsvColumnSeparator : ',';\n          /**\n           * @ngdoc object\n           * @name exporterCsvFilename\n           * @propertyOf  ui.grid.exporter.api:GridOptions\n           * @description The default filename to use when saving the downloaded csv.\n           * This will only work in some browsers.\n           * <br/>Defaults to 'download.csv'\n           * <pre>\n           *   gridOptions.exporterCsvFilename = \"rows.csv\"\n           * </pre>\n           * <br/>Or a function returning a string:\n           * <pre>\n           *   gridOptions.exporterCsvFilename = function(grid, rowTypes, colTypes) { return \"rows\" + rowTypes + \".csv\" };\n           * </pre>\n           */\n          gridOptions.exporterCsvFilename = gridOptions.exporterCsvFilename ? gridOptions.exporterCsvFilename : 'download.csv';\n          /**\n           * @ngdoc object\n           * @name exporterPdfFilename\n           * @propertyOf  ui.grid.exporter.api:GridOptions\n           * @description The default filename to use when saving the downloaded pdf, only used in IE (other browsers open pdfs in a new window)\n           * <br/>Defaults to 'download.pdf'\n           * <pre>\n           *   gridOptions.exporterPdfFilename = \"rows.pdf\"\n           * </pre>\n           * <br/>Or a function returning a string:\n           * <pre>\n           *   gridOptions.exporterPdfFilename = function(grid, rowTypes, colTypes) { return \"rows\" + rowTypes + \".pdf\" };\n           * </pre>\n           */\n          gridOptions.exporterPdfFilename = gridOptions.exporterPdfFilename ? gridOptions.exporterPdfFilename : 'download.pdf';\n          /**\n           * @ngdoc object\n           * @name exporterExcelFilename\n           * @propertyOf  ui.grid.exporter.api:GridOptions\n           * @description The default filename to use when saving the downloaded excel, only used in IE (other browsers open excels in a new window)\n           * <br/>Defaults to 'download.xlsx'\n           * <pre>\n           *   gridOptions.exporterExcelFilename = \"rows.xlsx\"\n           * </pre>\n           * <br/>Or a function returning a string:\n           * <pre>\n           *   gridOptions.exporterExcelFilename = function(grid, rowTypes, colTypes) { return \"rows\" + rowTypes + \".xlsx\" };\n           * </pre>\n           */\n          gridOptions.exporterExcelFilename = gridOptions.exporterExcelFilename ? gridOptions.exporterExcelFilename : 'download.xlsx';\n\n          /**\n           * @ngdoc object\n           * @name exporterExcelSheetName\n           * @propertyOf  ui.grid.exporter.api:GridOptions\n           * @description The default sheetname to use when saving the downloaded to excel\n           * <br/>Defaults to 'Sheet1'\n           * <pre>\n           *   gridOptions.exporterExcelSheetName = \"HitListSheet\"\n           * </pre>\n           * <br/>Or a function returning a string:\n           * <pre>\n           *   gridOptions.exporterExcelSheetName = function(grid, rowTypes, colTypes) { return \"HitListSheet\" + rowTypes };\n           * </pre>\n           */\n          gridOptions.exporterExcelSheetName = gridOptions.exporterExcelSheetName ? gridOptions.exporterExcelSheetName : 'Sheet1';\n\n          /**\n           * @ngdoc object\n           * @name exporterOlderExcelCompatibility\n           * @propertyOf  ui.grid.exporter.api:GridOptions\n           * @description Some versions of excel don't like the utf-16 BOM on the front, and it comes\n           * through as ï»¿ in the first column header.  Setting this option to false will suppress this, at the\n           * expense of proper utf-16 handling in applications that do recognise the BOM\n           * <br/>Defaults to false\n           */\n          gridOptions.exporterOlderExcelCompatibility = gridOptions.exporterOlderExcelCompatibility === true;\n          /**\n           * @ngdoc object\n           * @name exporterIsExcelCompatible\n           * @propertyOf  ui.grid.exporter.api:GridOptions\n           * @description Separator header, used to set a custom column separator in a csv file, only works on MS Excel.\n           * Used it on other programs will make csv content display unproperly. Setting this option to false won't add this header.\n           * <br/>Defaults to false\n           */\n          gridOptions.exporterIsExcelCompatible = gridOptions.exporterIsExcelCompatible === true;\n          /**\n           * @ngdoc object\n           * @name exporterMenuItemOrder\n           * @propertyOf  ui.grid.exporter.api:GridOptions\n           * @description An option to determine the starting point for the menu items created by the exporter\n           * <br/>Defaults to 200\n           */\n          gridOptions.exporterMenuItemOrder = gridOptions.exporterMenuItemOrder ? gridOptions.exporterMenuItemOrder : 200;\n          /**\n           * @ngdoc object\n           * @name exporterPdfDefaultStyle\n           * @propertyOf  ui.grid.exporter.api:GridOptions\n           * @description The default style in pdfMake format\n           * <br/>Defaults to:\n           * <pre>\n           *   {\n           *     fontSize: 11\n           *   }\n           * </pre>\n           */\n          gridOptions.exporterPdfDefaultStyle = gridOptions.exporterPdfDefaultStyle ? gridOptions.exporterPdfDefaultStyle : { fontSize: 11 };\n          /**\n           * @ngdoc object\n           * @name exporterPdfTableStyle\n           * @propertyOf  ui.grid.exporter.api:GridOptions\n           * @description The table style in pdfMake format\n           * <br/>Defaults to:\n           * <pre>\n           *   {\n           *     margin: [0, 5, 0, 15]\n           *   }\n           * </pre>\n           */\n          gridOptions.exporterPdfTableStyle = gridOptions.exporterPdfTableStyle ? gridOptions.exporterPdfTableStyle : { margin: [0, 5, 0, 15] };\n          /**\n           * @ngdoc object\n           * @name exporterPdfTableHeaderStyle\n           * @propertyOf  ui.grid.exporter.api:GridOptions\n           * @description The tableHeader style in pdfMake format\n           * <br/>Defaults to:\n           * <pre>\n           *   {\n           *     bold: true,\n           *     fontSize: 12,\n           *     color: 'black'\n           *   }\n           * </pre>\n           */\n          gridOptions.exporterPdfTableHeaderStyle = gridOptions.exporterPdfTableHeaderStyle ? gridOptions.exporterPdfTableHeaderStyle : { bold: true, fontSize: 12, color: 'black' };\n          /**\n           * @ngdoc object\n           * @name exporterPdfHeader\n           * @propertyOf  ui.grid.exporter.api:GridOptions\n           * @description The header section for pdf exports.  Can be\n           * simple text:\n           * <pre>\n           *   gridOptions.exporterPdfHeader = 'My Header';\n           * </pre>\n           * Can be a more complex object in pdfMake format:\n           * <pre>\n           *   gridOptions.exporterPdfHeader = {\n           *     columns: [\n           *       'Left part',\n           *       { text: 'Right part', alignment: 'right' }\n           *     ]\n           *   };\n           * </pre>\n           * Or can be a function, allowing page numbers and the like\n           * <pre>\n           *   gridOptions.exporterPdfHeader: function(currentPage, pageCount) { return currentPage.toString() + ' of ' + pageCount; };\n           * </pre>\n           */\n          gridOptions.exporterPdfHeader = gridOptions.exporterPdfHeader ? gridOptions.exporterPdfHeader : null;\n          /**\n           * @ngdoc object\n           * @name exporterPdfFooter\n           * @propertyOf  ui.grid.exporter.api:GridOptions\n           * @description The header section for pdf exports.  Can be\n           * simple text:\n           * <pre>\n           *   gridOptions.exporterPdfFooter = 'My Footer';\n           * </pre>\n           * Can be a more complex object in pdfMake format:\n           * <pre>\n           *   gridOptions.exporterPdfFooter = {\n           *     columns: [\n           *       'Left part',\n           *       { text: 'Right part', alignment: 'right' }\n           *     ]\n           *   };\n           * </pre>\n           * Or can be a function, allowing page numbers and the like\n           * <pre>\n           *   gridOptions.exporterPdfFooter: function(currentPage, pageCount) { return currentPage.toString() + ' of ' + pageCount; };\n           * </pre>\n           */\n          gridOptions.exporterPdfFooter = gridOptions.exporterPdfFooter ? gridOptions.exporterPdfFooter : null;\n          /**\n           * @ngdoc object\n           * @name exporterPdfOrientation\n           * @propertyOf  ui.grid.exporter.api:GridOptions\n           * @description The orientation, should be a valid pdfMake value,\n           * 'landscape' or 'portrait'\n           * <br/>Defaults to landscape\n           */\n          gridOptions.exporterPdfOrientation = gridOptions.exporterPdfOrientation ? gridOptions.exporterPdfOrientation : 'landscape';\n          /**\n           * @ngdoc object\n           * @name exporterPdfPageSize\n           * @propertyOf  ui.grid.exporter.api:GridOptions\n           * @description The orientation, should be a valid pdfMake\n           * paper size, usually 'A4' or 'LETTER'\n           * {@link https://github.com/bpampuch/pdfmake/blob/master/src/standardPageSizes.js pdfMake page sizes}\n           * <br/>Defaults to A4\n           */\n          gridOptions.exporterPdfPageSize = gridOptions.exporterPdfPageSize ? gridOptions.exporterPdfPageSize : 'A4';\n          /**\n           * @ngdoc object\n           * @name exporterPdfMaxGridWidth\n           * @propertyOf  ui.grid.exporter.api:GridOptions\n           * @description The maxium grid width - the current grid width\n           * will be scaled to match this, with any fixed width columns\n           * being adjusted accordingly.\n           * <br/>Defaults to 720 (for A4 landscape), use 670 for LETTER\n           */\n          gridOptions.exporterPdfMaxGridWidth = gridOptions.exporterPdfMaxGridWidth ? gridOptions.exporterPdfMaxGridWidth : 720;\n          /**\n           * @ngdoc object\n           * @name exporterPdfTableLayout\n           * @propertyOf  ui.grid.exporter.api:GridOptions\n           * @description A tableLayout in pdfMake format,\n           * controls gridlines and the like.  We use the default\n           * layout usually.\n           * <br/>Defaults to null, which means no layout\n           */\n\n          /**\n           * @ngdoc object\n           * @name exporterMenuAllData\n           * @propertyOf ui.grid.exporter.api:GridOptions\n           * @description Add export all data as cvs/pdf menu items to the ui-grid grid menu, if it's present.  Defaults to true.\n           */\n          gridOptions.exporterMenuAllData = gridOptions.exporterMenuAllData !== undefined ? gridOptions.exporterMenuAllData : true;\n\n          /**\n           * @ngdoc object\n           * @name exporterMenuVisibleData\n           * @propertyOf ui.grid.exporter.api:GridOptions\n           * @description Add export visible data as cvs/pdf menu items to the ui-grid grid menu, if it's present.  Defaults to true.\n           */\n          gridOptions.exporterMenuVisibleData = gridOptions.exporterMenuVisibleData !== undefined ? gridOptions.exporterMenuVisibleData : true;\n\n          /**\n           * @ngdoc object\n           * @name exporterMenuSelectedData\n           * @propertyOf ui.grid.exporter.api:GridOptions\n           * @description Add export selected data as cvs/pdf menu items to the ui-grid grid menu, if it's present.  Defaults to true.\n           */\n          gridOptions.exporterMenuSelectedData = gridOptions.exporterMenuSelectedData !== undefined ? gridOptions.exporterMenuSelectedData : true;\n\n          /**\n           * @ngdoc object\n           * @name exporterMenuCsv\n           * @propertyOf ui.grid.exporter.api:GridOptions\n           * @description Add csv export menu items to the ui-grid grid menu, if it's present.  Defaults to true.\n           */\n          gridOptions.exporterMenuCsv = gridOptions.exporterMenuCsv !== undefined ? gridOptions.exporterMenuCsv : true;\n\n          /**\n           * @ngdoc object\n           * @name exporterMenuPdf\n           * @propertyOf  ui.grid.exporter.api:GridOptions\n           * @description Add pdf export menu items to the ui-grid grid menu, if it's present.  Defaults to true.\n           */\n          gridOptions.exporterMenuPdf = gridOptions.exporterMenuPdf !== undefined ? gridOptions.exporterMenuPdf : true;\n\n          /**\n           * @ngdoc object\n           * @name exporterMenuExcel\n           * @propertyOf  ui.grid.exporter.api:GridOptions\n           * @description Add excel export menu items to the ui-grid grid menu, if it's present.  Defaults to true.\n           */\n          gridOptions.exporterMenuExcel = gridOptions.exporterMenuExcel !== undefined ? gridOptions.exporterMenuExcel : true;\n\n          /**\n           * @ngdoc object\n           * @name exporterPdfCustomFormatter\n           * @propertyOf  ui.grid.exporter.api:GridOptions\n           * @description A custom callback routine that changes the pdf document, adding any\n           * custom styling or content that is supported by pdfMake.  Takes in the complete docDefinition, and\n           * must return an updated docDefinition ready for pdfMake.\n           * @example\n           * In this example we add a style to the style array, so that we can use it in our\n           * footer definition.\n           * <pre>\n           *   gridOptions.exporterPdfCustomFormatter = function ( docDefinition ) {\n           *     docDefinition.styles.footerStyle = { bold: true, fontSize: 10 };\n           *     return docDefinition;\n           *   }\n           *\n           *   gridOptions.exporterPdfFooter = { text: 'My footer', style: 'footerStyle' }\n           * </pre>\n           */\n          gridOptions.exporterPdfCustomFormatter = ( gridOptions.exporterPdfCustomFormatter && typeof( gridOptions.exporterPdfCustomFormatter ) === 'function' ) ? gridOptions.exporterPdfCustomFormatter : function ( docDef ) { return docDef; };\n\n          /**\n           * @ngdoc object\n           * @name exporterHeaderFilterUseName\n           * @propertyOf  ui.grid.exporter.api:GridOptions\n           * @description Defaults to false, which leads to `displayName` being passed into the headerFilter.\n           * If set to true, then will pass `name` instead.\n           *\n           *\n           * @example\n           * <pre>\n           *   gridOptions.exporterHeaderFilterUseName = true;\n           * </pre>\n           */\n          gridOptions.exporterHeaderFilterUseName = gridOptions.exporterHeaderFilterUseName === true;\n\n          /**\n           * @ngdoc object\n           * @name exporterHeaderFilter\n           * @propertyOf  ui.grid.exporter.api:GridOptions\n           * @description A function to apply to the header displayNames before exporting.  Useful for internationalisation,\n           * for example if you were using angular-translate you'd set this to `$translate.instant`.  Note that this\n           * call must be synchronous, it cannot be a call that returns a promise.\n           *\n           * Behaviour can be changed to pass in `name` instead of `displayName` through use of `exporterHeaderFilterUseName: true`.\n           *\n           * @example\n           * <pre>\n           *   gridOptions.exporterHeaderFilter = function( displayName ) { return 'col: ' + name; };\n           * </pre>\n           * OR\n           * <pre>\n           *   gridOptions.exporterHeaderFilter = $translate.instant;\n           * </pre>\n           */\n\n          /**\n           * @ngdoc function\n           * @name exporterFieldCallback\n           * @propertyOf  ui.grid.exporter.api:GridOptions\n           * @description A function to call for each field before exporting it.  Allows\n           * massaging of raw data into a display format, for example if you have applied\n           * filters to convert codes into decodes, or you require\n           * a specific date format in the exported content.\n           *\n           * The method is called once for each field exported, and provides the grid, the\n           * gridCol and the GridRow for you to use as context in massaging the data.\n           *\n           * @param {Grid} grid provides the grid in case you have need of it\n           * @param {GridRow} row the row from which the data comes\n           * @param {GridColumn} col the column from which the data comes\n           * @param {object} value the value for your massaging\n           * @returns {object} you must return the massaged value ready for exporting\n           *\n           * @example\n           * <pre>\n           *   gridOptions.exporterFieldCallback = function ( grid, row, col, value ) {\n           *     if ( col.name === 'status' ) {\n           *       value = decodeStatus( value );\n           *     }\n           *     return value;\n           *   }\n           * </pre>\n           */\n          gridOptions.exporterFieldCallback = gridOptions.exporterFieldCallback ? gridOptions.exporterFieldCallback : defaultExporterFieldCallback;\n\n          /**\n           * @ngdoc function\n           * @name exporterFieldFormatCallback\n           * @propertyOf  ui.grid.exporter.api:GridOptions\n           * @description A function to call for each field before exporting it.  Allows\n           * general object to be return to modify the format of a cell in the case of\n           * excel exports\n           *\n           * The method is called once for each field exported, and provides the grid, the\n           * gridCol and the GridRow for you to use as context in massaging the data.\n           *\n           * @param {Grid} grid provides the grid in case you have need of it\n           * @param {GridRow} row the row from which the data comes\n           * @param {GridColumn} col the column from which the data comes\n           * @param {object} value the value for your massaging\n           * @returns {object} you must return the massaged value ready for exporting\n           *\n           * @example\n           * <pre>\n           *   gridOptions.exporterFieldCallback = function ( grid, row, col, value ) {\n           *     if ( col.name === 'status' ) {\n           *       value = decodeStatus( value );\n           *     }\n           *     return value;\n           *   }\n           * </pre>\n           */\n          gridOptions.exporterFieldFormatCallback = gridOptions.exporterFieldFormatCallback ? gridOptions.exporterFieldFormatCallback : function( grid, row, col, value ) { return null; };\n\n          /**\n           * @ngdoc function\n           * @name exporterExcelCustomFormatters\n           * @propertyOf  ui.grid.exporter.api:GridOptions\n           * @description A function to call to setup formatters and store on docDefinition.\n           *\n           * The method is called at the start and can setup all the formatters to export to excel\n           *\n           * @param {Grid} grid provides the grid in case you have need of it\n           * @param {Workbook} row the row from which the data comes\n           * @param {docDefinition} The docDefinition that will have styles as a object to store formatters\n           * @returns {docDefinition} Updated docDefinition with formatter styles\n           *\n           * @example\n           * <pre>\n           *   gridOptions.exporterExcelCustomFormatters = function(grid, workbook, docDefinition) {\n           *     const formatters = {};\n           *     const stylesheet = workbook.getStyleSheet();\n           *     const headerFormatDefn = {\n           *       'font': { 'size': 11, 'fontName': 'Calibri', 'bold': true },\n           *       'alignment': { 'wrapText': false }\n           *     };\n           *\n           *     formatters['header'] = headerFormatter;\n           *     Object.assign(docDefinition.styles , formatters);\n           *     grid.docDefinition = docDefinition;\n           *     return docDefinition;\n           *   }\n           * </pre>\n           */\n          gridOptions.exporterExcelCustomFormatters = gridOptions.exporterExcelCustomFormatters ? gridOptions.exporterExcelCustomFormatters : function( grid, workbook, docDefinition ) { return docDefinition; };\n\n          /**\n           * @ngdoc function\n           * @name exporterExcelHeader\n           * @propertyOf  ui.grid.exporter.api:GridOptions\n           * @description A function to write formatted header data to sheet.\n           *\n           * The method is called to provide custom header building for Excel. This data comes before the grid header\n           *\n           * @param {grid} grid provides the grid in case you have need of it\n           * @param {Workbook} row the row from which the data comes\n           * @param {Sheet} the sheet to insert data\n           * @param {docDefinition} The docDefinition that will have styles as a object to store formatters\n           * @returns {docDefinition} Updated docDefinition with formatter styles\n           *\n           * @example\n           * <pre>\n           *   gridOptions.exporterExcelCustomFormatters = function (grid, workbook, sheet, docDefinition) {\n           *      const headerFormatter = docDefinition.styles['header'];\n           *      let cols = [];\n           *      // push data in A1 cell with metadata formatter\n           *      cols.push({ value: 'Summary Report', metadata: {style: headerFormatter.id} });\n           *      sheet.data.push(cols);\n           *   }\n           * </pre>\n           */\n          gridOptions.exporterExcelHeader = gridOptions.exporterExcelHeader ? gridOptions.exporterExcelHeader : function( grid, workbook, sheet, docDefinition ) { return null; };\n\n\n          /**\n           * @ngdoc object\n           * @name exporterColumnScaleFactor\n           * @propertyOf  ui.grid.exporter.api:GridOptions\n           * @description A scaling factor to divide the drawnwidth of a column to convert to target excel column\n           * format size\n           * @example\n           * In this example we add a number to divide the drawnwidth of a column to get the excel width.\n           * <br/>Defaults to 3.5\n           */\n          gridOptions.exporterColumnScaleFactor = gridOptions.exporterColumnScaleFactor ? gridOptions.exporterColumnScaleFactor : 3.5;\n\n          /**\n           * @ngdoc object\n           * @name exporterFieldApplyFilters\n           * @propertyOf  ui.grid.exporter.api:GridOptions\n           * @description Defaults to false, which leads to filters being evaluated on export           *\n           *\n           * @example\n           * <pre>\n           *   gridOptions.exporterFieldApplyFilters = true;\n           * </pre>\n           */\n          gridOptions.exporterFieldApplyFilters = gridOptions.exporterFieldApplyFilters === true;\n\n          /**\n           * @ngdoc function\n           * @name exporterAllDataFn\n           * @propertyOf  ui.grid.exporter.api:GridOptions\n           * @description This promise is needed when exporting all rows,\n           * and the data need to be provided by server side. Default is null.\n           * @returns {Promise} a promise to load all data from server\n           *\n           * @example\n           * <pre>\n           *   gridOptions.exporterAllDataFn = function () {\n           *     return $http.get('/data/100.json')\n           *   }\n           * </pre>\n           */\n          gridOptions.exporterAllDataFn = gridOptions.exporterAllDataFn ? gridOptions.exporterAllDataFn : null;\n\n          /**\n           * @ngdoc function\n           * @name exporterAllDataPromise\n           * @propertyOf  ui.grid.exporter.api:GridOptions\n           * @description DEPRECATED - exporterAllDataFn used to be\n           * called this, but it wasn't a promise, it was a function that returned\n           * a promise.  Deprecated, but supported for backward compatibility, use\n           * exporterAllDataFn instead.\n           * @returns {Promise} a promise to load all data from server\n           *\n           * @example\n           * <pre>\n           *   gridOptions.exporterAllDataFn = function () {\n           *     return $http.get('/data/100.json')\n           *   }\n           * </pre>\n           */\n          if ( gridOptions.exporterAllDataFn === null && gridOptions.exporterAllDataPromise ) {\n            gridOptions.exporterAllDataFn = gridOptions.exporterAllDataPromise;\n          }\n        },\n\n\n        /**\n         * @ngdoc function\n         * @name addToMenu\n         * @methodOf  ui.grid.exporter.service:uiGridExporterService\n         * @description Adds export items to the grid menu,\n         * allowing the user to select export options\n         * @param {Grid} grid the grid from which data should be exported\n         */\n        addToMenu: function ( grid ) {\n          grid.api.core.addToGridMenu( grid, [\n            {\n              title: i18nService.getSafeText('gridMenu.exporterAllAsCsv'),\n              action: function () {\n                grid.api.exporter.csvExport( uiGridExporterConstants.ALL, uiGridExporterConstants.ALL );\n              },\n              shown: function() {\n                return grid.options.exporterMenuCsv && grid.options.exporterMenuAllData;\n              },\n              order: grid.options.exporterMenuItemOrder\n            },\n            {\n              title: i18nService.getSafeText('gridMenu.exporterVisibleAsCsv'),\n              action: function () {\n                grid.api.exporter.csvExport( uiGridExporterConstants.VISIBLE, uiGridExporterConstants.VISIBLE );\n              },\n              shown: function() {\n                return grid.options.exporterMenuCsv && grid.options.exporterMenuVisibleData;\n              },\n              order: grid.options.exporterMenuItemOrder + 1\n            },\n            {\n              title: i18nService.getSafeText('gridMenu.exporterSelectedAsCsv'),\n              action: function () {\n                grid.api.exporter.csvExport( uiGridExporterConstants.SELECTED, uiGridExporterConstants.VISIBLE );\n              },\n              shown: function() {\n                return grid.options.exporterMenuCsv && grid.options.exporterMenuSelectedData &&\n                       ( grid.api.selection && grid.api.selection.getSelectedRows().length > 0 );\n              },\n              order: grid.options.exporterMenuItemOrder + 2\n            },\n            {\n              title: i18nService.getSafeText('gridMenu.exporterAllAsPdf'),\n              action: function () {\n                grid.api.exporter.pdfExport( uiGridExporterConstants.ALL, uiGridExporterConstants.ALL );\n              },\n              shown: function() {\n                return grid.options.exporterMenuPdf && grid.options.exporterMenuAllData;\n              },\n              order: grid.options.exporterMenuItemOrder + 3\n            },\n            {\n              title: i18nService.getSafeText('gridMenu.exporterVisibleAsPdf'),\n              action: function () {\n                grid.api.exporter.pdfExport( uiGridExporterConstants.VISIBLE, uiGridExporterConstants.VISIBLE );\n              },\n              shown: function() {\n                return grid.options.exporterMenuPdf && grid.options.exporterMenuVisibleData;\n              },\n              order: grid.options.exporterMenuItemOrder + 4\n            },\n            {\n              title: i18nService.getSafeText('gridMenu.exporterSelectedAsPdf'),\n              action: function () {\n                grid.api.exporter.pdfExport( uiGridExporterConstants.SELECTED, uiGridExporterConstants.VISIBLE );\n              },\n              shown: function() {\n                return grid.options.exporterMenuPdf && grid.options.exporterMenuSelectedData &&\n                       ( grid.api.selection && grid.api.selection.getSelectedRows().length > 0 );\n              },\n              order: grid.options.exporterMenuItemOrder + 5\n            },\n            {\n              title: i18nService.getSafeText('gridMenu.exporterAllAsExcel'),\n              action: function () {\n                grid.api.exporter.excelExport( uiGridExporterConstants.ALL, uiGridExporterConstants.ALL );\n              },\n              shown: function() {\n                return grid.options.exporterMenuExcel && grid.options.exporterMenuAllData;\n              },\n              order: grid.options.exporterMenuItemOrder + 6\n            },\n            {\n              title: i18nService.getSafeText('gridMenu.exporterVisibleAsExcel'),\n              action: function () {\n                grid.api.exporter.excelExport( uiGridExporterConstants.VISIBLE, uiGridExporterConstants.VISIBLE );\n              },\n              shown: function() {\n                return grid.options.exporterMenuExcel && grid.options.exporterMenuVisibleData;\n              },\n              order: grid.options.exporterMenuItemOrder + 7\n            },\n            {\n              title: i18nService.getSafeText('gridMenu.exporterSelectedAsExcel'),\n              action: function () {\n                grid.api.exporter.excelExport( uiGridExporterConstants.SELECTED, uiGridExporterConstants.VISIBLE );\n              },\n              shown: function() {\n                return grid.options.exporterMenuExcel && grid.options.exporterMenuSelectedData &&\n                  ( grid.api.selection && grid.api.selection.getSelectedRows().length > 0 );\n              },\n              order: grid.options.exporterMenuItemOrder + 8\n            }\n          ]);\n        },\n\n\n        /**\n         * @ngdoc function\n         * @name csvExport\n         * @methodOf  ui.grid.exporter.service:uiGridExporterService\n         * @description Exports rows from the grid in csv format,\n         * the data exported is selected based on the provided options\n         * @param {Grid} grid the grid from which data should be exported\n         * @param {string} rowTypes which rows to export, valid values are\n         * uiGridExporterConstants.ALL, uiGridExporterConstants.VISIBLE,\n         * uiGridExporterConstants.SELECTED\n         * @param {string} colTypes which columns to export, valid values are\n         * uiGridExporterConstants.ALL, uiGridExporterConstants.VISIBLE,\n         * uiGridExporterConstants.SELECTED\n         */\n        csvExport: function (grid, rowTypes, colTypes) {\n          var self = this;\n          self.type = 'csv';\n          this.loadAllDataIfNeeded(grid, rowTypes, colTypes).then(function() {\n            var exportColumnHeaders = grid.options.showHeader ? self.getColumnHeaders(grid, colTypes) : [];\n            var exportData = self.getData(grid, rowTypes, colTypes);\n            var csvContent = self.formatAsCsv(exportColumnHeaders, exportData, grid.options.exporterCsvColumnSeparator);\n\n            var fileName = angular.isFunction(grid.options.exporterCsvFilename) ? grid.options.exporterCsvFilename(grid, rowTypes, colTypes) : grid.options.exporterCsvFilename;\n            self.downloadFile(fileName, csvContent, grid.options.exporterCsvColumnSeparator, grid.options.exporterOlderExcelCompatibility, grid.options.exporterIsExcelCompatible);\n          });\n        },\n\n        /**\n         * @ngdoc function\n         * @name loadAllDataIfNeeded\n         * @methodOf  ui.grid.exporter.service:uiGridExporterService\n         * @description When using server side pagination, use exporterAllDataFn to\n         * load all data before continuing processing.\n         * When using client side pagination, return a resolved promise so processing\n         * continues immediately\n         * @param {Grid} grid the grid from which data should be exported\n         * @param {string} rowTypes which rows to export, valid values are\n         * uiGridExporterConstants.ALL, uiGridExporterConstants.VISIBLE,\n         * uiGridExporterConstants.SELECTED\n         * @param {string} colTypes which columns to export, valid values are\n         * uiGridExporterConstants.ALL, uiGridExporterConstants.VISIBLE,\n         * uiGridExporterConstants.SELECTED\n         */\n        loadAllDataIfNeeded: function (grid, rowTypes, colTypes) {\n          if ( rowTypes === uiGridExporterConstants.ALL && grid.rows.length !== grid.options.totalItems && grid.options.exporterAllDataFn) {\n            return grid.options.exporterAllDataFn()\n              .then(function(allData) {\n                grid.modifyRows(allData);\n              });\n          } else {\n            var deferred = $q.defer();\n            deferred.resolve();\n            return deferred.promise;\n          }\n        },\n\n        /**\n         * @ngdoc property\n         * @propertyOf ui.grid.exporter.api:ColumnDef\n         * @name exporterSuppressExport\n         * @description Suppresses export for this column.  Used by selection and expandable.\n         */\n\n        /**\n         * @ngdoc function\n         * @name getColumnHeaders\n         * @methodOf  ui.grid.exporter.service:uiGridExporterService\n         * @description Gets the column headers from the grid to use\n         * as a title row for the exported file, all headers have\n         * headerCellFilters applied as appropriate.\n         *\n         * Column headers are an array of objects, each object has\n         * name, displayName, width and align attributes.  Only name is\n         * used for csv, all attributes are used for pdf.\n         *\n         * @param {Grid} grid the grid from which data should be exported\n         * @param {string} colTypes which columns to export, valid values are\n         * uiGridExporterConstants.ALL, uiGridExporterConstants.VISIBLE,\n         * uiGridExporterConstants.SELECTED\n         */\n        getColumnHeaders: function (grid, colTypes) {\n          var headers = [],\n            columns;\n\n          if ( colTypes === uiGridExporterConstants.ALL ) {\n            columns = grid.columns;\n          } else {\n            var leftColumns = grid.renderContainers.left ? grid.renderContainers.left.visibleColumnCache.filter( function( column ) { return column.visible; } ) : [],\n              bodyColumns = grid.renderContainers.body ? grid.renderContainers.body.visibleColumnCache.filter( function( column ) { return column.visible; } ) : [],\n              rightColumns = grid.renderContainers.right ? grid.renderContainers.right.visibleColumnCache.filter( function( column ) { return column.visible; } ) : [];\n\n            columns = leftColumns.concat(bodyColumns, rightColumns);\n          }\n\n          columns.forEach( function( gridCol ) {\n            // $$hashKey check since when grouping and sorting pragmatically this ends up in export. Filtering it out\n            if ( gridCol.colDef.exporterSuppressExport !== true  && gridCol.field !== '$$hashKey' &&\n                 grid.options.exporterSuppressColumns.indexOf( gridCol.name ) === -1 ) {\n              var headerEntry = {\n                name: gridCol.field,\n                displayName: getDisplayName(grid, gridCol),\n                width: gridCol.drawnWidth ? gridCol.drawnWidth : gridCol.width,\n                align: gridCol.colDef.align ? gridCol.colDef.align : (gridCol.colDef.type === 'number' ? 'right' : 'left')\n              };\n\n              headers.push(headerEntry);\n            }\n          });\n\n          return headers;\n        },\n\n        /**\n         * @ngdoc property\n         * @propertyOf ui.grid.exporter.api:ColumnDef\n         * @name exporterPdfAlign\n         * @description the alignment you'd like for this specific column when\n         * exported into a pdf.  Can be 'left', 'right', 'center' or any other\n         * valid pdfMake alignment option.\n         */\n\n        /**\n         * @ngdoc object\n         * @name ui.grid.exporter.api:GridRow\n         * @description GridRow settings for exporter\n         */\n\n        /**\n         * @ngdoc object\n         * @name exporterEnableExporting\n         * @propertyOf  ui.grid.exporter.api:GridRow\n         * @description If set to false, then don't export this row, notwithstanding visible or\n         * other settings\n         * <br/>Defaults to true\n         */\n\n        /**\n         * @ngdoc function\n         * @name getRowsFromNode\n         * @methodOf  ui.grid.exporter.service:uiGridExporterService\n         * @description Gets rows from a node. If the node is grouped it will\n         * recurse down into the children to get to the raw data element\n         * which is a row without children (a leaf).\n         * @param {Node} aNode the tree node on the grid\n         * @returns {Array} an array with all child nodes from aNode\n         */\n        getRowsFromNode: function(aNode) {\n          var rows = [];\n\n          // Push parent node if it is not undefined and has values other than 'children'\n          var nodeKeys = aNode ? Object.keys(aNode) : ['children'];\n          if (nodeKeys.length > 1 || nodeKeys[0] != 'children') {\n            rows.push(aNode);\n          }\n\n          if (aNode && aNode.children && aNode.children.length > 0) {\n              for (var i = 0; i < aNode.children.length; i++) {\n                  rows = rows.concat(this.getRowsFromNode(aNode.children[i]));\n              }\n          }\n          return rows;\n        },\n        /**\n         * @ngdoc function\n         * @name getDataSorted\n         * @methodOf  ui.grid.exporter.service:uiGridExporterService\n         * @description Gets rows from a node. If the node is grouped it will\n         * recurse down into the children to get to the raw data element\n         * which is a row without children (a leaf). If the grid is not\n         * grouped this will return just the raw rows\n         * @param {Grid} grid the grid from which data should be exported\n         * @returns {Array} an array of leaf nodes\n         */\n        getDataSorted: function (grid) {\n          if (!grid.treeBase || grid.treeBase.numberLevels === 0) {\n            return grid.rows;\n          }\n          var rows = [];\n\n          for (var i = 0; i< grid.treeBase.tree.length; i++) {\n            var nodeRows = this.getRowsFromNode(grid.treeBase.tree[i]);\n\n            for (var j = 0; j<nodeRows.length; j++) {\n              rows.push(nodeRows[j].row);\n            }\n          }\n          return rows;\n        },\n\n        /**\n         * @ngdoc function\n         * @name getData\n         * @methodOf  ui.grid.exporter.service:uiGridExporterService\n         * @description Gets data from the grid based on the provided options,\n         * all cells have cellFilters applied as appropriate.  Any rows marked\n         * `exporterEnableExporting: false` will not be exported\n         * @param {Grid} grid the grid from which data should be exported\n         * @param {string} rowTypes which rows to export, valid values are\n         * uiGridExporterConstants.ALL, uiGridExporterConstants.VISIBLE,\n         * uiGridExporterConstants.SELECTED\n         * @param {string} colTypes which columns to export, valid values are\n         * uiGridExporterConstants.ALL, uiGridExporterConstants.VISIBLE,\n         * uiGridExporterConstants.SELECTED\n         * @param {boolean} applyCellFilters whether or not to get the display value or the raw value of the data\n         */\n        getData: function (grid, rowTypes, colTypes, applyCellFilters) {\n          var data = [],\n            rows,\n            columns;\n\n          switch ( rowTypes ) {\n            case uiGridExporterConstants.ALL:\n              rows = this.getDataSorted(grid, rowTypes, colTypes, applyCellFilters);\n              break;\n            case uiGridExporterConstants.VISIBLE:\n              rows = grid.getVisibleRows();\n              break;\n            case uiGridExporterConstants.SELECTED:\n              if ( grid.api.selection ) {\n                rows = grid.api.selection.getSelectedGridRows();\n              } else {\n                gridUtil.logError('selection feature must be enabled to allow selected rows to be exported');\n              }\n              break;\n          }\n\n          if ( colTypes === uiGridExporterConstants.ALL ) {\n            columns = grid.columns;\n          } else {\n            var leftColumns = grid.renderContainers.left ? grid.renderContainers.left.visibleColumnCache.filter( function( column ) { return column.visible; } ) : [];\n            var bodyColumns = grid.renderContainers.body ? grid.renderContainers.body.visibleColumnCache.filter( function( column ) { return column.visible; } ) : [];\n            var rightColumns = grid.renderContainers.right ? grid.renderContainers.right.visibleColumnCache.filter( function( column ) { return column.visible; } ) : [];\n\n            columns = leftColumns.concat(bodyColumns, rightColumns);\n          }\n\n          rows.forEach(function( row ) {\n            if (row.exporterEnableExporting !== false) {\n              var extractedRow = [];\n\n              columns.forEach( function( gridCol ) {\n                // $$hashKey check since when grouping and sorting programmatically this ends up in export. Filtering it out\n                if ( (gridCol.visible || colTypes === uiGridExporterConstants.ALL ) &&\n                     gridCol.colDef.exporterSuppressExport !== true && gridCol.field !== '$$hashKey' &&\n                     grid.options.exporterSuppressColumns.indexOf( gridCol.name ) === -1 ) {\n                  var cellValue = applyCellFilters ? grid.getCellDisplayValue( row, gridCol ) : grid.getCellValue( row, gridCol ),\n                    extractedField = { value: grid.options.exporterFieldCallback( grid, row, gridCol, cellValue, service.type ) },\n                    extension = grid.options.exporterFieldFormatCallback( grid, row, gridCol, cellValue, service.type );\n\n                  if (extension) {\n                    Object.assign(extractedField, extension);\n                  }\n                  if ( gridCol.colDef.exporterPdfAlign ) {\n                    extractedField.alignment = gridCol.colDef.exporterPdfAlign;\n                  }\n                  extractedRow.push(extractedField);\n                }\n              });\n\n              data.push(extractedRow);\n            }\n          });\n\n          return data;\n        },\n\n\n        /**\n         * @ngdoc function\n         * @name formatAsCsv\n         * @methodOf  ui.grid.exporter.service:uiGridExporterService\n         * @description Formats the column headers and data as a CSV,\n         * and sends that data to the user\n         * @param {array} exportColumnHeaders an array of column headers,\n         * where each header is an object with name, width and maybe alignment\n         * @param {array} exportData an array of rows, where each row is\n         * an array of column data\n         * @param {string} separator a string that represents the separator to be used in the csv file\n         * @returns {string} csv the formatted csv as a string\n         */\n        formatAsCsv: function (exportColumnHeaders, exportData, separator) {\n          var self = this,\n            bareHeaders = exportColumnHeaders.map(function(header) { return { value: header.displayName };}),\n            csv = bareHeaders.length > 0 ? (self.formatRowAsCsv(this, separator)(bareHeaders) + '\\n') : '';\n\n          csv += exportData.map(this.formatRowAsCsv(this, separator)).join('\\n');\n\n          return csv;\n        },\n\n        /**\n         * @ngdoc function\n         * @name formatRowAsCsv\n         * @methodOf  ui.grid.exporter.service:uiGridExporterService\n         * @description Renders a single field as a csv field, including\n         * quotes around the value\n         * @param {exporterService} exporter pass in exporter\n         * @param {string} separator the string to be used to join the row data\n         * @returns {function} A function that returns a csv-ified version of the row\n         */\n        formatRowAsCsv: function (exporter, separator) {\n          return function (row) {\n            return row.map(exporter.formatFieldAsCsv).join(separator);\n          };\n        },\n\n        /**\n         * @ngdoc function\n         * @name formatFieldAsCsv\n         * @methodOf  ui.grid.exporter.service:uiGridExporterService\n         * @description Renders a single field as a csv field, including\n         * quotes around the value\n         * @param {field} field the field to be turned into a csv string,\n         * may be of any type\n         * @returns {string} a csv-ified version of the field\n         */\n        formatFieldAsCsv: function (field) {\n          if (field.value == null) { // we want to catch anything null-ish, hence just == not ===\n            return '';\n          }\n          if (typeof(field.value) === 'number') {\n            return field.value;\n          }\n          if (typeof(field.value) === 'boolean') {\n            return (field.value ? 'TRUE' : 'FALSE') ;\n          }\n          if (typeof(field.value) === 'string') {\n            return '\"' + field.value.replace(/\"/g,'\"\"') + '\"';\n          }\n          if (typeof(field.value) === 'object' && !(field.value instanceof Date)) {\n            return '\"' + JSON.stringify(field.value).replace(/\"/g,'\"\"') + '\"';\n          }\n          // if field type is date, numberStr\n          return JSON.stringify(field.value);\n        },\n\n        /**\n         * @ngdoc function\n         * @name isIE\n         * @methodOf ui.grid.exporter.service:uiGridExporterService\n         * @description Checks whether current browser is IE and returns it's version if it is\n        */\n        isIE: function () {\n          var match = navigator.userAgent.search(/(?:Edge|MSIE|Trident\\/.*; rv:)/);\n          var isIE = false;\n\n          if (match !== -1) {\n            isIE = true;\n          }\n\n          return isIE;\n        },\n\n\n        /**\n         * @ngdoc function\n         * @name downloadFile\n         * @methodOf ui.grid.exporter.service:uiGridExporterService\n         * @description Triggers download of a csv file.  Logic provided\n         * by @cssensei (from his colleagues at https://github.com/ifeelgoods) in issue #2391\n         * @param {string} fileName the filename we'd like our file to be\n         * given\n         * @param {string} csvContent the csv content that we'd like to\n         * download as a file\n         * @param {string} columnSeparator The separator to be used by the columns\n         * @param {boolean} exporterOlderExcelCompatibility whether or not we put a utf-16 BOM on the from (\\uFEFF)\n          * @param {boolean} exporterIsExcelCompatible whether or not we add separator header ('sep=X')\n         */\n        downloadFile: function (fileName, csvContent, columnSeparator, exporterOlderExcelCompatibility, exporterIsExcelCompatible) {\n          var D = document,\n            a = D.createElement('a'),\n            strMimeType = 'application/octet-stream;charset=utf-8',\n            rawFile,\n            ieVersion = this.isIE();\n\n          if (exporterIsExcelCompatible) {\n              csvContent = 'sep=' + columnSeparator + '\\r\\n' + csvContent;\n          }\n\n          // IE10+\n          if (navigator.msSaveBlob) {\n            return navigator.msSaveOrOpenBlob(\n              new Blob(\n                [exporterOlderExcelCompatibility ? \"\\uFEFF\" : '', csvContent],\n                { type: strMimeType } ),\n              fileName\n            );\n          }\n\n          if (ieVersion) {\n            var frame = D.createElement('iframe');\n\n            document.body.appendChild(frame);\n\n            frame.contentWindow.document.open('text/html', 'replace');\n            frame.contentWindow.document.write(csvContent);\n            frame.contentWindow.document.close();\n            frame.contentWindow.focus();\n            frame.contentWindow.document.execCommand('SaveAs', true, fileName);\n\n            document.body.removeChild(frame);\n            return true;\n          }\n\n          // html5 A[download]\n          if ('download' in a) {\n            var blob = new Blob(\n              [exporterOlderExcelCompatibility ? \"\\uFEFF\" : '', csvContent],\n              { type: strMimeType }\n            );\n            rawFile = URL.createObjectURL(blob);\n            a.setAttribute('download', fileName);\n          } else {\n            rawFile = 'data: ' + strMimeType + ',' + encodeURIComponent(csvContent);\n            a.setAttribute('target', '_blank');\n          }\n\n          a.href = rawFile;\n          a.setAttribute('style', 'display:none;');\n          D.body.appendChild(a);\n          setTimeout(function() {\n            if (a.click) {\n              a.click();\n              // Workaround for Safari 5\n            } else if (document.createEvent) {\n              var eventObj = document.createEvent('MouseEvents');\n              eventObj.initEvent('click', true, true);\n              a.dispatchEvent(eventObj);\n            }\n            D.body.removeChild(a);\n\n          }, this.delay);\n        },\n\n        /**\n         * @ngdoc function\n         * @name pdfExport\n         * @methodOf  ui.grid.exporter.service:uiGridExporterService\n         * @description Exports rows from the grid in pdf format,\n         * the data exported is selected based on the provided options.\n         * Note that this function has a dependency on pdfMake, which must\n         * be installed.  The resulting pdf opens in a new\n         * browser window.\n         * @param {Grid} grid the grid from which data should be exported\n         * @param {string} rowTypes which rows to export, valid values are\n         * uiGridExporterConstants.ALL, uiGridExporterConstants.VISIBLE,\n         * uiGridExporterConstants.SELECTED\n         * @param {string} colTypes which columns to export, valid values are\n         * uiGridExporterConstants.ALL, uiGridExporterConstants.VISIBLE,\n         * uiGridExporterConstants.SELECTED\n         */\n        pdfExport: function (grid, rowTypes, colTypes) {\n          var self = this;\n          self.type = 'pdf';\n          this.loadAllDataIfNeeded(grid, rowTypes, colTypes).then(function () {\n            var exportColumnHeaders = self.getColumnHeaders(grid, colTypes),\n              exportData = self.getData(grid, rowTypes, colTypes),\n              docDefinition = self.prepareAsPdf(grid, exportColumnHeaders, exportData);\n\n            if (self.isIE() || navigator.appVersion.indexOf('Edge') !== -1) {\n              var fileName = angular.isFunction(grid.options.exporterPdfFilename) ? grid.options.exporterPdfFilename(grid, rowTypes, colTypes) : grid.options.exporterPdfFilename;\n              self.downloadPDF(fileName, docDefinition);\n            } else {\n              pdfMake.createPdf(docDefinition).open();\n            }\n          });\n        },\n\n\n        /**\n         * @ngdoc function\n         * @name downloadPdf\n         * @methodOf  ui.grid.exporter.service:uiGridExporterService\n         * @description Generates and retrieves the pdf as a blob, then downloads\n         * it as a file.  Only used in IE, in all other browsers we use the native\n         * pdfMake.open function to just open the PDF\n         * @param {string} fileName the filename to give to the pdf, can be set\n         * through exporterPdfFilename\n         * @param {object} docDefinition a pdf docDefinition that we can generate\n         * and get a blob from\n         */\n        downloadPDF: function (fileName, docDefinition) {\n          var D = document,\n            a = D.createElement('a'),\n            ieVersion;\n\n          ieVersion = this.isIE(); // This is now a boolean value\n          var doc = pdfMake.createPdf(docDefinition);\n          var blob;\n\n          doc.getBuffer( function (buffer) {\n            blob = new Blob([buffer]);\n\n            // IE10+\n            if (navigator.msSaveBlob) {\n              return navigator.msSaveBlob(\n                blob, fileName\n              );\n            }\n\n            // Previously:  && ieVersion < 10\n            // ieVersion now returns a boolean for the\n            // sake of sanity. We just check `msSaveBlob` first.\n            if (ieVersion) {\n              var frame = D.createElement('iframe');\n              document.body.appendChild(frame);\n\n              frame.contentWindow.document.open('text/html', 'replace');\n              frame.contentWindow.document.write(blob);\n              frame.contentWindow.document.close();\n              frame.contentWindow.focus();\n              frame.contentWindow.document.execCommand('SaveAs', true, fileName);\n\n              document.body.removeChild(frame);\n              return true;\n            }\n          });\n        },\n\n\n        /**\n         * @ngdoc function\n         * @name renderAsPdf\n         * @methodOf  ui.grid.exporter.service:uiGridExporterService\n         * @description Renders the data into a pdf, and opens that pdf.\n         *\n         * @param {Grid} grid the grid from which data should be exported\n         * @param {array} exportColumnHeaders an array of column headers,\n         * where each header is an object with name, width and maybe alignment\n         * @param {array} exportData an array of rows, where each row is\n         * an array of column data\n         * @returns {object} a pdfMake format document definition, ready\n         * for generation\n         */\n        prepareAsPdf: function(grid, exportColumnHeaders, exportData) {\n          var headerWidths = this.calculatePdfHeaderWidths( grid, exportColumnHeaders );\n\n          var headerColumns = exportColumnHeaders.map( function( header ) {\n            return { text: header.displayName, style: 'tableHeader' };\n          });\n\n          var stringData = exportData.map(this.formatRowAsPdf(this));\n\n          var allData = [headerColumns].concat(stringData);\n\n          var docDefinition = {\n            pageOrientation: grid.options.exporterPdfOrientation,\n            pageSize: grid.options.exporterPdfPageSize,\n            content: [{\n              style: 'tableStyle',\n              table: {\n                headerRows: 1,\n                widths: headerWidths,\n                body: allData\n              }\n            }],\n            styles: {\n              tableStyle: grid.options.exporterPdfTableStyle,\n              tableHeader: grid.options.exporterPdfTableHeaderStyle\n            },\n            defaultStyle: grid.options.exporterPdfDefaultStyle\n          };\n\n          if ( grid.options.exporterPdfLayout ) {\n            docDefinition.layout = grid.options.exporterPdfLayout;\n          }\n\n          if ( grid.options.exporterPdfHeader ) {\n            docDefinition.header = grid.options.exporterPdfHeader;\n          }\n\n          if ( grid.options.exporterPdfFooter ) {\n            docDefinition.footer = grid.options.exporterPdfFooter;\n          }\n\n          if ( grid.options.exporterPdfCustomFormatter ) {\n            docDefinition = grid.options.exporterPdfCustomFormatter( docDefinition );\n          }\n          return docDefinition;\n\n        },\n\n\n        /**\n         * @ngdoc function\n         * @name calculatePdfHeaderWidths\n         * @methodOf  ui.grid.exporter.service:uiGridExporterService\n         * @description Determines the column widths base on the\n         * widths we got from the grid.  If the column is drawn\n         * then we have a drawnWidth.  If the column is not visible\n         * then we have '*', 'x%' or a width.  When columns are\n         * not visible they don't contribute to the overall gridWidth,\n         * so we need to adjust to allow for extra columns\n         *\n         * Our basic heuristic is to take the current gridWidth, plus\n         * numeric columns and call this the base gridwidth.\n         *\n         * To that we add 100 for any '*' column, and x% of the base gridWidth\n         * for any column that is a %\n         *\n         * @param {Grid} grid the grid from which data should be exported\n         * @param {array} exportHeaders array of header information\n         * @returns {object} an array of header widths\n         */\n        calculatePdfHeaderWidths: function ( grid, exportHeaders ) {\n          var baseGridWidth = 0;\n\n          exportHeaders.forEach(function(value) {\n            if (typeof(value.width) === 'number') {\n              baseGridWidth += value.width;\n            }\n          });\n\n          var extraColumns = 0;\n\n          exportHeaders.forEach(function(value) {\n            if (value.width === '*') {\n              extraColumns += 100;\n            }\n            if (typeof(value.width) === 'string' && value.width.match(/(\\d)*%/)) {\n              var percent = parseInt(value.width.match(/(\\d)*%/)[0]);\n\n              value.width = baseGridWidth * percent / 100;\n              extraColumns += value.width;\n            }\n          });\n\n          var gridWidth = baseGridWidth + extraColumns;\n\n          return exportHeaders.map(function( header ) {\n            return header.width === '*' ? header.width : header.width * grid.options.exporterPdfMaxGridWidth / gridWidth;\n          });\n        },\n\n        /**\n         * @ngdoc function\n         * @name formatRowAsPdf\n         * @methodOf  ui.grid.exporter.service:uiGridExporterService\n         * @description Renders a row in a format consumable by PDF,\n         * mainly meaning casting everything to a string\n         * @param {exporterService} exporter pass in exporter\n         * @param {array} row the row to be turned into a csv string\n         * @returns {string} a csv-ified version of the row\n         */\n        formatRowAsPdf: function ( exporter ) {\n          return function( row ) {\n            return row.map(exporter.formatFieldAsPdfString);\n          };\n        },\n\n\n        /**\n         * @ngdoc function\n         * @name formatFieldAsCsv\n         * @methodOf  ui.grid.exporter.service:uiGridExporterService\n         * @description Renders a single field as a pdf-able field, which\n         * is different from a csv field only in that strings don't have quotes\n         * around them\n         * @param {field} field the field to be turned into a pdf string,\n         * may be of any type\n         * @returns {string} a string-ified version of the field\n         */\n        formatFieldAsPdfString: function (field) {\n          var returnVal;\n\n          if (field.value == null) { // we want to catch anything null-ish, hence just == not ===\n            returnVal = '';\n          } else if (typeof(field.value) === 'number') {\n            returnVal = field.value.toString();\n          } else if (typeof(field.value) === 'boolean') {\n            returnVal = (field.value ? 'TRUE' : 'FALSE') ;\n          } else if (typeof(field.value) === 'string') {\n            returnVal = field.value.replace(/\"/g,'\"\"');\n          } else if (field.value instanceof Date) {\n            returnVal = JSON.stringify(field.value).replace(/^\"/,'').replace(/\"$/,'');\n          } else if (typeof(field.value) === 'object') {\n            returnVal = field.value;\n          } else {\n            returnVal = JSON.stringify(field.value).replace(/^\"/,'').replace(/\"$/,'');\n          }\n\n          if (field.alignment && typeof(field.alignment) === 'string' ) {\n            returnVal = { text: returnVal, alignment: field.alignment };\n          }\n\n          return returnVal;\n        },\n\n        /**\n         * @ngdoc function\n         * @name formatAsExcel\n         * @methodOf  ui.grid.exporter.service:uiGridExporterService\n         * @description Formats the column headers and data as a excel,\n         * and sends that data to the user\n         * @param {array} exportColumnHeaders an array of column headers,\n         * where each header is an object with name, width and maybe alignment\n         * @param {array} exportData an array of rows, where each row is\n         * an array of column data\n         * @param {string} separator a string that represents the separator to be used in the csv file\n         * @returns {string} csv the formatted excel as a string\n         */\n        formatAsExcel: function (exportColumnHeaders, exportData, workbook, sheet, docDefinition) {\n          var bareHeaders = exportColumnHeaders.map(function(header) {return { value: header.displayName };});\n\n          var sheetData = [];\n          var headerData = [];\n          for (var i = 0; i < bareHeaders.length; i++) {\n            // TODO - probably need callback to determine header value and header styling\n            var exportStyle = 'header';\n            switch (exportColumnHeaders[i].align) {\n              case 'center':\n                exportStyle = 'headerCenter';\n                break;\n              case 'right':\n                exportStyle = 'headerRight';\n                break;\n            }\n            var metadata = (docDefinition.styles && docDefinition.styles[exportStyle]) ? {style: docDefinition.styles[exportStyle].id} : null;\n            headerData.push({value: bareHeaders[i].value, metadata: metadata});\n          }\n          sheetData.push(headerData);\n\n          var result = exportData.map(this.formatRowAsExcel(this, workbook, sheet));\n          for (var j = 0; j<result.length; j++) {\n            sheetData.push(result[j]);\n          }\n          return sheetData;\n        },\n\n        /**\n         * @ngdoc function\n         * @name formatRowAsExcel\n         * @methodOf  ui.grid.exporter.service:uiGridExporterService\n         * @description Renders a single field as a csv field, including\n         * quotes around the value\n         * @param {exporterService} exporter pass in exporter\n         * @param {array} row the row to be turned into a excel string\n         * @returns {array} array of cell objects (i.e. {value: x, metadata: y})\n         */\n        formatRowAsExcel: function (exporter, workbook, sheet) {\n          return function (row) {\n            var values = [];\n            for (var i = 0; i<row.length; i++) {\n              var value = exporter.formatFieldAsExcel(row[i], workbook, sheet);\n              values.push({value: value, metadata: row[i].metadata});\n            }\n            return values;\n          };\n        },\n\n        /**\n         * @ngdoc function\n         * @name formatFieldAsExcel\n         * @methodOf  ui.grid.exporter.service:uiGridExporterService\n         * @description Renders a single field as a excel-ified field\n         * @param {field} field the field to be excel-ified,\n         * may be of any type\n         * @returns {string} a excel-ified version of the field\n         */\n        formatFieldAsExcel: function (field, workbook, sheet, formatters) {\n          if (field.value == null) { // we want to catch anything null-ish, hence just == not ===\n            return '';\n          }\n          if ((typeof(field.value) === 'number') || (typeof(field.value) === 'string')) {\n            return field.value;\n          }\n          if (typeof(field.value) === 'boolean') {\n            return (field.value ? 'TRUE' : 'FALSE') ;\n          }\n\n          return JSON.stringify(field.value);\n        },\n\n        prepareAsExcel: function(grid, workbook, sheet) {\n          var docDefinition = {\n            styles: {\n\n            }\n          };\n\n          if ( grid.options.exporterExcelCustomFormatters ) {\n            docDefinition = grid.options.exporterExcelCustomFormatters( grid, workbook, docDefinition );\n          }\n          if ( grid.options.exporterExcelHeader ) {\n            if (angular.isFunction( grid.options.exporterExcelHeader )) {\n              grid.options.exporterExcelHeader(grid, workbook, sheet, docDefinition);\n            } else {\n              var headerText = grid.options.exporterExcelHeader.text;\n              var style = grid.options.exporterExcelHeader.style;\n              sheet.data.push([{value: headerText, metadata: {style: docDefinition.styles[style].id}}]);\n            }\n          }\n\n          return docDefinition;\n        },\n\n        excelExport: function (grid, rowTypes, colTypes) {\n          var self = this;\n          self.type = 'excel';\n          this.loadAllDataIfNeeded(grid, rowTypes, colTypes).then(function() {\n            var exportColumnHeaders = grid.options.showHeader ? self.getColumnHeaders(grid, colTypes) : [];\n\n            var aName = 'Sheet1';\n            if (grid.options.exporterExcelSheetName) {\n              aName = angular.isFunction(grid.options.exporterExcelSheetName) ? grid.options.exporterExcelSheetName(grid, rowTypes, colTypes) : grid.options.exporterExcelSheetName;\n            }\n\n            var sheet = new ExcelBuilder.Worksheet({name: aName});\n            var workbook = new ExcelBuilder.Workbook();\n            workbook.addWorksheet(sheet);\n            var docDefinition = self.prepareAsExcel(grid, workbook, sheet);\n\n            // The standard column width in Microsoft Excel 2000 is 8.43 characters based on fixed-width Courier font\n            // Width of 10 in excel is 75 pixels\n            var colWidths = [];\n            var startDataIndex = grid.treeBase ? grid.treeBase.numberLevels : (grid.enableRowSelection ? 1 : 0);\n            for (var i = startDataIndex; i < grid.columns.length; i++) {\n              if (grid.columns[i].field !== uiGridExporterConstants.rowHeaderColName &&\n                grid.columns[i].field !== uiGridExporterConstants.selectionRowHeaderColName) {\n\n                colWidths.push({width: (grid.columns[i].drawnWidth / grid.options.exporterColumnScaleFactor)});\n              }\n            }\n            sheet.setColumns(colWidths);\n\n            var exportData = self.getData(grid, rowTypes, colTypes, grid.options.exporterFieldApplyFilters);\n\n            var excelContent = self.formatAsExcel(exportColumnHeaders, exportData, workbook, sheet, docDefinition);\n            sheet.setData(sheet.data.concat(excelContent));\n\n            ExcelBuilder.Builder.createFile(workbook, {type: 'blob'}).then(function(result) {\n              var fileName = angular.isFunction(grid.options.exporterExcelFilename) ? grid.options.exporterExcelFilename(grid, rowTypes, colTypes) : grid.options.exporterExcelFilename;\n              self.downloadFile(fileName, result, grid.options.exporterCsvColumnSeparator, grid.options.exporterOlderExcelCompatibility);\n            });\n          });\n        }\n      };\n\n      function getDisplayName(grid, gridCol) {\n        if (grid.options.exporterHeaderFilter) {\n          return grid.options.exporterHeaderFilterUseName ?\n            grid.options.exporterHeaderFilter(gridCol.name) :\n            grid.options.exporterHeaderFilter(gridCol.displayName);\n        }\n\n        return gridCol.headerCellFilter ?\n          $filter(gridCol.headerCellFilter)(gridCol.displayName) :\n          gridCol.displayName;\n      }\n\n      function defaultExporterFieldCallback(grid, row, col, value) {\n        // fix to handle cases with 'number : 1' or 'date:\"MM-dd-YYYY HH:mm\"', etc.. We needed to split the string\n        if (col.cellFilter) {\n          var args, filter, arg1, arg2;\n          // Split on ':' except when in double quotes.\n          args = col.cellFilter.match(/(?:[^:\"]+|\"[^\"]*\")+/g);\n          // remove space, single/double to maintain retro-compatibility, but keep spaces in second argument (arg[1])\n          filter = args[0] ? args[0].replace(/[\\'\\\"\\s]/g, \"\") : null;\n          arg1 = args[1] ? args[1].replace(/[\\'\\\"]/g, \"\").trim() : null;\n          arg2 = args[2] ? args[2].replace(/[\\'\\\"\\s]/g, \"\") : null;\n          return $filter(filter)(value, arg1, arg2);\n        } else {\n          return value;\n        }\n      }\n\n      return service;\n    }\n  ]);\n\n  /**\n   *  @ngdoc directive\n   *  @name ui.grid.exporter.directive:uiGridExporter\n   *  @element div\n   *  @restrict A\n   *\n   *  @description Adds exporter features to grid\n   *\n   *  @example\n   <example module=\"app\">\n   <file name=\"app.js\">\n   var app = angular.module('app', ['ui.grid', 'ui.grid.exporter']);\n\n   app.controller('MainCtrl', ['$scope', function ($scope) {\n      $scope.data = [\n        { name: 'Bob', title: 'CEO' },\n            { name: 'Frank', title: 'Lowly Developer' }\n      ];\n\n      $scope.gridOptions = {\n        enableGridMenu: true,\n        exporterMenuCsv: false,\n        columnDefs: [\n          {name: 'name', enableCellEdit: true},\n          {name: 'title', enableCellEdit: true}\n        ],\n        data: $scope.data\n      };\n    }]);\n   </file>\n   <file name=\"index.ced81ed4.html\">\n   <div ng-controller=\"MainCtrl\">\n   <div ui-grid=\"gridOptions\" ui-grid-exporter></div>\n   </div>\n   </file>\n   </example>\n   */\n  module.directive('uiGridExporter', ['uiGridExporterConstants', 'uiGridExporterService', 'gridUtil', '$compile',\n    function (uiGridExporterConstants, uiGridExporterService, gridUtil, $compile) {\n      return {\n        replace: true,\n        priority: 0,\n        require: '^uiGrid',\n        scope: false,\n        link: function ($scope, $elm, $attrs, uiGridCtrl) {\n          uiGridExporterService.initializeGrid(uiGridCtrl.grid);\n          uiGridCtrl.grid.exporter.$scope = $scope;\n        }\n      };\n    }\n  ]);\n})();\n\n(function () {\n  'use strict';\n\n  /**\n   * @ngdoc overview\n   * @name ui.grid.grouping\n   * @description\n   *\n   * # ui.grid.grouping\n   *\n   * <div class=\"alert alert-warning\" role=\"alert\"><strong>Beta</strong> This feature is ready for testing, but it either hasn't seen a lot of use or has some known bugs.</div>\n   *\n   * This module provides grouping of rows based on the data in them, similar\n   * in concept to excel grouping.  You can group multiple columns, resulting in\n   * nested grouping.\n   *\n   * In concept this feature is similar to sorting + grid footer/aggregation, it\n   * sorts the data based on the grouped columns, then creates group rows that\n   * reflect a break in the data.  Each of those group rows can have aggregations for\n   * the data within that group.\n   *\n   * This feature leverages treeBase to provide the tree functionality itself,\n   * the key thing this feature does therefore is to set treeLevels on the rows\n   * and insert the group headers.\n   *\n   * Design information:\n   * -------------------\n   *\n   * Each column will get new menu items - group by, and aggregate by.  Group by\n   * will cause this column to be sorted (if not already), and will move this column\n   * to the front of the sorted columns (i.e. grouped columns take precedence over\n   * sorted columns).  It will respect the sort order already set if there is one,\n   * and it will allow the sorting logic to change that sort order, it just forces\n   * the column to the front of the sorting.  You can group by multiple columns, the\n   * logic will add this column to the sorting after any already grouped columns.\n   *\n   * Once a grouping is defined, grouping logic is added to the rowsProcessors.  This\n   * will process the rows, identifying a break in the data value, and inserting a grouping row.\n   * Grouping rows have specific attributes on them:\n   *\n   *  - internalRow = true: tells us that this isn't a real row, so we can ignore it\n   *    from any processing that it looking at core data rows.  This is used by the core\n   *    logic (or will be one day), as it's not grouping specific\n   *  - groupHeader = true: tells us this is a groupHeader.  This is used by the grouping logic\n   *    to know if this is a groupHeader row or not\n   *\n   * Since the logic is baked into the rowsProcessors, it should get triggered whenever\n   * row order or filtering or anything like that is changed.  In order to avoid the row instantiation\n   * time, and to preserve state across invocations, we hold a cache of the rows that we created\n   * last time, and we use them again this time if we can.\n   *\n   * By default rows are collapsed, which means all data rows have their visible property\n   * set to false, and only level 0 group rows are set to visible.\n   *\n   * <br/>\n   * <br/>\n   *\n   * <div doc-module-components=\"ui.grid.grouping\"></div>\n   */\n\n  var module = angular.module('ui.grid.grouping', ['ui.grid', 'ui.grid.treeBase']);\n\n  /**\n   *  @ngdoc object\n   *  @name ui.grid.grouping.constant:uiGridGroupingConstants\n   *\n   *  @description constants available in grouping module, this includes\n   *  all the constants declared in the treeBase module (these are manually copied\n   *  as there isn't an easy way to include constants in another constants file, and\n   *  we don't want to make users include treeBase)\n   *\n   */\n  module.constant('uiGridGroupingConstants', {\n    featureName: \"grouping\",\n    rowHeaderColName: 'treeBaseRowHeaderCol',\n    EXPANDED: 'expanded',\n    COLLAPSED: 'collapsed',\n    aggregation: {\n      COUNT: 'count',\n      SUM: 'sum',\n      MAX: 'max',\n      MIN: 'min',\n      AVG: 'avg'\n    }\n  });\n\n  /**\n   *  @ngdoc service\n   *  @name ui.grid.grouping.service:uiGridGroupingService\n   *\n   *  @description Services for grouping features\n   */\n  module.service('uiGridGroupingService', ['$q', 'uiGridGroupingConstants', 'gridUtil', 'rowSorter', 'GridRow', 'gridClassFactory', 'i18nService', 'uiGridConstants', 'uiGridTreeBaseService',\n  function ($q, uiGridGroupingConstants, gridUtil, rowSorter, GridRow, gridClassFactory, i18nService, uiGridConstants, uiGridTreeBaseService) {\n    var service = {\n      initializeGrid: function (grid, $scope) {\n        uiGridTreeBaseService.initializeGrid( grid, $scope );\n\n        // add feature namespace and any properties to grid for needed\n        /**\n         *  @ngdoc object\n         *  @name ui.grid.grouping.grid:grouping\n         *\n         *  @description Grid properties and functions added for grouping\n         */\n        grid.grouping = {};\n\n        /**\n         *  @ngdoc property\n         *  @propertyOf ui.grid.grouping.grid:grouping\n         *  @name groupHeaderCache\n         *\n         *  @description Cache that holds the group header rows we created last time, we'll\n         *  reuse these next time, not least because they hold our expanded states.\n         *\n         *  We need to take care with these that they don't become a memory leak, we\n         *  create a new cache each time using the values from the old cache.  This works\n         *  so long as we're creating group rows for invisible rows as well.\n         *\n         *  The cache is a nested hash, indexed on the value we grouped by.  So if we\n         *  grouped by gender then age, we'd maybe have something like:\n         *  ```\n         *    {\n         *      male: {\n         *        row: <pointer to the old row>,\n         *        children: {\n         *          22: { row: <pointer to the old row> },\n         *          31: { row: <pointer to the old row> }\n         *      },\n         *      female: {\n         *        row: <pointer to the old row>,\n         *        children: {\n         *          28: { row: <pointer to the old row> },\n         *          55: { row: <pointer to the old row> }\n         *      }\n         *    }\n         *  ```\n         *\n         *  We create new rows for any missing rows, this means that they come in as collapsed.\n         *\n         */\n        grid.grouping.groupHeaderCache = {};\n\n        service.defaultGridOptions(grid.options);\n\n        grid.registerRowsProcessor(service.groupRows, 400);\n\n        grid.registerColumnBuilder( service.groupingColumnBuilder);\n\n        grid.registerColumnsProcessor(service.groupingColumnProcessor, 400);\n\n        /**\n         *  @ngdoc object\n         *  @name ui.grid.grouping.api:PublicApi\n         *\n         *  @description Public Api for grouping feature\n         */\n        var publicApi = {\n          events: {\n            grouping: {\n              /**\n               * @ngdoc event\n               * @eventOf ui.grid.grouping.api:PublicApi\n               * @name aggregationChanged\n               * @description raised whenever aggregation is changed, added or removed from a column\n               *\n               * <pre>\n               *      gridApi.grouping.on.aggregationChanged(scope,function(col) {})\n               * </pre>\n               * @param {GridColumn} col the column on which aggregation changed. The aggregation\n               * type is available as `col.treeAggregation.type`\n               */\n              aggregationChanged: {},\n              /**\n               * @ngdoc event\n               * @eventOf ui.grid.grouping.api:PublicApi\n               * @name groupingChanged\n               * @description raised whenever the grouped columns changes\n               *\n               * <pre>\n               *      gridApi.grouping.on.groupingChanged(scope,function(col) {})\n               * </pre>\n               * @param {GridColumn} col the column on which grouping changed. The new grouping is\n               * available as `col.grouping`\n               */\n              groupingChanged: {}\n            }\n          },\n          methods: {\n            grouping: {\n              /**\n               * @ngdoc function\n               * @name getGrouping\n               * @methodOf  ui.grid.grouping.api:PublicApi\n               * @description Get the grouping configuration for this grid,\n               * used by the saveState feature.  Adds expandedState to the information\n               * provided by the internal getGrouping, and removes any aggregations that have a source\n               * of grouping (i.e. will be automatically reapplied when we regroup the column)\n               * Returned grouping is an object\n               *   `{ grouping: groupArray, treeAggregations: aggregateArray, expandedState: hash }`\n               * where grouping contains an array of objects:\n               *   `{ field: column.field, colName: column.name, groupPriority: column.grouping.groupPriority }`\n               * and aggregations contains an array of objects:\n               *   `{ field: column.field, colName: column.name, aggregation: column.grouping.aggregation }`\n               * and expandedState is a hash of the currently expanded nodes\n               *\n               * The groupArray will be sorted by groupPriority.\n               *\n               * @param {boolean} getExpanded whether or not to return the expanded state\n               * @returns {object} grouping configuration\n               */\n              getGrouping: function ( getExpanded ) {\n                var grouping = service.getGrouping(grid);\n\n                grouping.grouping.forEach( function( group ) {\n                  group.colName = group.col.name;\n                  delete group.col;\n                });\n\n                grouping.aggregations.forEach( function( aggregation ) {\n                  aggregation.colName = aggregation.col.name;\n                  delete aggregation.col;\n                });\n\n                grouping.aggregations = grouping.aggregations.filter( function( aggregation ) {\n                  return !aggregation.aggregation.source || aggregation.aggregation.source !== 'grouping';\n                });\n\n                if ( getExpanded ) {\n                  grouping.rowExpandedStates = service.getRowExpandedStates( grid.grouping.groupingHeaderCache );\n                }\n\n                return grouping;\n              },\n\n              /**\n               * @ngdoc function\n               * @name setGrouping\n               * @methodOf  ui.grid.grouping.api:PublicApi\n               * @description Set the grouping configuration for this grid,\n               * used by the saveState feature, but can also be used by any\n               * user to specify a combined grouping and aggregation configuration\n               * @param {object} config the config you want to apply, in the format\n               * provided out by getGrouping\n               */\n              setGrouping: function ( config ) {\n                service.setGrouping(grid, config);\n              },\n\n              /**\n               * @ngdoc function\n               * @name groupColumn\n               * @methodOf  ui.grid.grouping.api:PublicApi\n               * @description Adds this column to the existing grouping, at the end of the priority order.\n               * If the column doesn't have a sort, adds one, by default ASC\n               *\n               * This column will move to the left of any non-group columns, the\n               * move is handled in a columnProcessor, so gets called as part of refresh\n               *\n               * @param {string} columnName the name of the column we want to group\n               */\n              groupColumn: function(columnName) {\n                var column = grid.getColumn(columnName);\n\n                service.groupColumn(grid, column);\n              },\n\n              /**\n               * @ngdoc function\n               * @name ungroupColumn\n               * @methodOf  ui.grid.grouping.api:PublicApi\n               * @description Removes the groupPriority from this column.  If the\n               * column was previously aggregated the aggregation will come back.\n               * The sort will remain.\n               *\n               * This column will move to the right of any other group columns, the\n               * move is handled in a columnProcessor, so gets called as part of refresh\n               *\n               * @param {string} columnName the name of the column we want to ungroup\n               */\n              ungroupColumn: function(columnName) {\n                var column = grid.getColumn(columnName);\n\n                service.ungroupColumn(grid, column);\n              },\n\n              /**\n               * @ngdoc function\n               * @name clearGrouping\n               * @methodOf  ui.grid.grouping.api:PublicApi\n               * @description Clear any grouped columns and any aggregations.  Doesn't remove sorting,\n               * as we don't know whether that sorting was added by grouping or was there beforehand\n               *\n               */\n              clearGrouping: function() {\n                service.clearGrouping(grid);\n              },\n\n              /**\n               * @ngdoc function\n               * @name aggregateColumn\n               * @methodOf  ui.grid.grouping.api:PublicApi\n               * @description Sets the aggregation type on a column, if the\n               * column is currently grouped then it removes the grouping first.\n               * If the aggregationDef is null then will result in the aggregation\n               * being removed\n               *\n               * @param {string} columnName the column we want to aggregate\n               * @param {string|function} aggregationDef one of the recognised types\n               * from uiGridGroupingConstants or a custom aggregation function.\n               * @param {string} aggregationLabel (optional) The label to use for this aggregation.\n               */\n              aggregateColumn: function(columnName, aggregationDef, aggregationLabel) {\n                var column = grid.getColumn(columnName);\n\n                service.aggregateColumn(grid, column, aggregationDef, aggregationLabel);\n              }\n            }\n          }\n        };\n\n        grid.api.registerEventsFromObject(publicApi.events);\n\n        grid.api.registerMethodsFromObject(publicApi.methods);\n\n        grid.api.core.on.sortChanged($scope, service.tidyPriorities);\n      },\n\n      defaultGridOptions: function (gridOptions) {\n        // default option to true unless it was explicitly set to false\n        /**\n         *  @ngdoc object\n         *  @name ui.grid.grouping.api:GridOptions\n         *\n         *  @description GridOptions for grouping feature, these are available to be\n         *  set using the ui-grid {@link ui.grid.class:GridOptions gridOptions}\n         */\n\n        /**\n         *  @ngdoc object\n         *  @name enableGrouping\n         *  @propertyOf  ui.grid.grouping.api:GridOptions\n         *  @description Enable row grouping for entire grid.\n         *  <br/>Defaults to true\n         */\n        gridOptions.enableGrouping = gridOptions.enableGrouping !== false;\n\n        /**\n         *  @ngdoc object\n         *  @name groupingShowCounts\n         *  @propertyOf  ui.grid.grouping.api:GridOptions\n         *  @description shows counts on the groupHeader rows. Not that if you are using a cellFilter or a\n         *  sortingAlgorithm which relies on a specific format or data type, showing counts may cause that\n         *  to break, since the group header rows will always be a string with groupingShowCounts enabled.\n         *  <br/>Defaults to true except on columns of types 'date' and 'object'\n         */\n        gridOptions.groupingShowCounts = gridOptions.groupingShowCounts !== false;\n\n        /**\n         *  @ngdoc object\n         *  @name groupingNullLabel\n         *  @propertyOf  ui.grid.grouping.api:GridOptions\n         *  @description The string to use for the grouping header row label on rows which contain a null or undefined value in the grouped column.\n         *  <br/>Defaults to \"Null\"\n         */\n        gridOptions.groupingNullLabel = typeof(gridOptions.groupingNullLabel) === 'undefined' ? 'Null' : gridOptions.groupingNullLabel;\n\n        /**\n         *  @ngdoc object\n         *  @name enableGroupHeaderSelection\n         *  @propertyOf  ui.grid.grouping.api:GridOptions\n         *  @description Allows group header rows to be selected.\n         *  <br/>Defaults to false\n         */\n        gridOptions.enableGroupHeaderSelection = gridOptions.enableGroupHeaderSelection === true;\n      },\n\n\n      /**\n       * @ngdoc function\n       * @name groupingColumnBuilder\n       * @methodOf  ui.grid.grouping.service:uiGridGroupingService\n       * @description Sets the grouping defaults based on the columnDefs\n       *\n       * @param {object} colDef columnDef we're basing on\n       * @param {GridColumn} col the column we're to update\n       * @param {object} gridOptions the options we should use\n       * @returns {promise} promise for the builder - actually we do it all inline so it's immediately resolved\n       */\n      groupingColumnBuilder: function (colDef, col, gridOptions) {\n        /**\n         *  @ngdoc object\n         *  @name ui.grid.grouping.api:ColumnDef\n         *\n         *  @description ColumnDef for grouping feature, these are available to be\n         *  set using the ui-grid {@link ui.grid.class:GridOptions.columnDef gridOptions.columnDefs}\n         */\n\n        /**\n         *  @ngdoc object\n         *  @name enableGrouping\n         *  @propertyOf  ui.grid.grouping.api:ColumnDef\n         *  @description Enable grouping on this column\n         *  <br/>Defaults to true.\n         */\n        if (colDef.enableGrouping === false) {\n          return;\n        }\n\n        /**\n         *  @ngdoc object\n         *  @name grouping\n         *  @propertyOf  ui.grid.grouping.api:ColumnDef\n         *  @description Set the grouping for a column.  Format is:\n         *  ```\n         *    {\n         *      groupPriority: <number, starts at 0, if less than 0 or undefined then we're aggregating in this column>\n         *    }\n         *  ```\n         *\n         *  **Note that aggregation used to be included in grouping, but is now separately set on the column via treeAggregation\n         *  setting in treeBase**\n         *\n         *  We group in the priority order given, this will also put these columns to the high order of the sort irrespective\n         *  of the sort priority given them.  If there is no sort defined then we sort ascending, if there is a sort defined then\n         *  we use that sort.\n         *\n         *  If the groupPriority is undefined or less than 0, then we expect to be aggregating, and we look at the\n         *  aggregation types to determine what sort of aggregation we can do.  Values are in the constants file, but\n         *  include SUM, COUNT, MAX, MIN\n         *\n         *  groupPriorities should generally be sequential, if they're not then the next time getGrouping is called\n         *  we'll renumber them to be sequential.\n         *  <br/>Defaults to undefined.\n         */\n\n        if ( typeof(col.grouping) === 'undefined' && typeof(colDef.grouping) !== 'undefined') {\n          col.grouping = angular.copy(colDef.grouping);\n          if ( typeof(col.grouping.groupPriority) !== 'undefined' && col.grouping.groupPriority > -1 ) {\n            col.treeAggregationFn = uiGridTreeBaseService.nativeAggregations()[uiGridGroupingConstants.aggregation.COUNT].aggregationFn;\n            col.treeAggregationFinalizerFn = service.groupedFinalizerFn;\n          }\n        } else if (typeof(col.grouping) === 'undefined') {\n          col.grouping = {};\n        }\n\n        if (typeof(col.grouping) !== 'undefined' && typeof(col.grouping.groupPriority) !== 'undefined' && col.grouping.groupPriority >= 0) {\n          col.suppressRemoveSort = true;\n        }\n\n        var groupColumn = {\n          name: 'ui.grid.grouping.group',\n          title: i18nService.get().grouping.group,\n          icon: 'ui-grid-icon-indent-right',\n          shown: function () {\n            return typeof(this.context.col.grouping) === 'undefined' ||\n                   typeof(this.context.col.grouping.groupPriority) === 'undefined' ||\n                   this.context.col.grouping.groupPriority < 0;\n          },\n          action: function () {\n            service.groupColumn( this.context.col.grid, this.context.col );\n          }\n        };\n\n        var ungroupColumn = {\n          name: 'ui.grid.grouping.ungroup',\n          title: i18nService.get().grouping.ungroup,\n          icon: 'ui-grid-icon-indent-left',\n          shown: function () {\n            return typeof(this.context.col.grouping) !== 'undefined' &&\n                   typeof(this.context.col.grouping.groupPriority) !== 'undefined' &&\n                   this.context.col.grouping.groupPriority >= 0;\n          },\n          action: function () {\n            service.ungroupColumn( this.context.col.grid, this.context.col );\n          }\n        };\n\n        var aggregateRemove = {\n          name: 'ui.grid.grouping.aggregateRemove',\n          title: i18nService.get().grouping.aggregate_remove,\n          shown: function () {\n            return typeof(this.context.col.treeAggregationFn) !== 'undefined';\n          },\n          action: function () {\n            service.aggregateColumn( this.context.col.grid, this.context.col, null);\n          }\n        };\n\n        // generic adder for the aggregation menus, which follow a pattern\n        var addAggregationMenu = function(type, title) {\n          title = title || i18nService.get().grouping['aggregate_' + type] || type;\n          var menuItem = {\n            name: 'ui.grid.grouping.aggregate' + type,\n            title: title,\n            shown: function () {\n              return typeof(this.context.col.treeAggregation) === 'undefined' ||\n                     typeof(this.context.col.treeAggregation.type) === 'undefined' ||\n                     this.context.col.treeAggregation.type !== type;\n            },\n            action: function () {\n              service.aggregateColumn( this.context.col.grid, this.context.col, type);\n            }\n          };\n\n          if (!gridUtil.arrayContainsObjectWithProperty(col.menuItems, 'name', 'ui.grid.grouping.aggregate' + type)) {\n            col.menuItems.push(menuItem);\n          }\n        };\n\n        /**\n         *  @ngdoc object\n         *  @name groupingShowGroupingMenu\n         *  @propertyOf  ui.grid.grouping.api:ColumnDef\n         *  @description Show the grouping (group and ungroup items) menu on this column\n         *  <br/>Defaults to true.\n         */\n        if ( col.colDef.groupingShowGroupingMenu !== false ) {\n          if (!gridUtil.arrayContainsObjectWithProperty(col.menuItems, 'name', 'ui.grid.grouping.group')) {\n            col.menuItems.push(groupColumn);\n          }\n\n          if (!gridUtil.arrayContainsObjectWithProperty(col.menuItems, 'name', 'ui.grid.grouping.ungroup')) {\n            col.menuItems.push(ungroupColumn);\n          }\n        }\n\n\n        /**\n         *  @ngdoc object\n         *  @name groupingShowAggregationMenu\n         *  @propertyOf  ui.grid.grouping.api:ColumnDef\n         *  @description Show the aggregation menu on this column\n         *  <br/>Defaults to true.\n         */\n        if ( col.colDef.groupingShowAggregationMenu !== false ) {\n          angular.forEach(uiGridTreeBaseService.nativeAggregations(), function(aggregationDef, name) {\n            addAggregationMenu(name);\n          });\n          angular.forEach(gridOptions.treeCustomAggregations, function(aggregationDef, name) {\n            addAggregationMenu(name, aggregationDef.menuTitle);\n          });\n\n          if (!gridUtil.arrayContainsObjectWithProperty(col.menuItems, 'name', 'ui.grid.grouping.aggregateRemove')) {\n            col.menuItems.push(aggregateRemove);\n          }\n        }\n      },\n\n\n\n\n      /**\n       * @ngdoc function\n       * @name groupingColumnProcessor\n       * @methodOf  ui.grid.grouping.service:uiGridGroupingService\n       * @description Moves the columns around based on which are grouped\n       *\n       * @param {array} columns the columns to consider rendering\n       * @param {array} rows the grid rows, which we don't use but are passed to us\n       * @returns {array} updated columns array\n       */\n      groupingColumnProcessor: function( columns, rows ) {\n        columns = service.moveGroupColumns(this, columns, rows);\n        return columns;\n      },\n\n      /**\n       * @ngdoc function\n       * @name groupedFinalizerFn\n       * @methodOf  ui.grid.grouping.service:uiGridGroupingService\n       * @description Used on group columns to display the rendered value and optionally\n       * display the count of rows.\n       *\n       * @param {aggregation} aggregation The aggregation entity for a grouped column\n       */\n      groupedFinalizerFn: function( aggregation ) {\n        var col = this;\n\n        if ( typeof(aggregation.groupVal) !== 'undefined') {\n          aggregation.rendered = aggregation.groupVal;\n          if ( col.grid.options.groupingShowCounts && col.colDef.type !== 'date' && col.colDef.type !== 'object' ) {\n            aggregation.rendered += (' (' + aggregation.value + ')');\n          }\n        } else {\n          aggregation.rendered = null;\n        }\n      },\n\n      /**\n       * @ngdoc function\n       * @name moveGroupColumns\n       * @methodOf  ui.grid.grouping.service:uiGridGroupingService\n       * @description Moves the column order so that the grouped columns are lined up\n       * to the left (well, unless you're RTL, then it's the right).  By doing this in\n       * the columnsProcessor, we make it transient - when the column is ungrouped it'll\n       * go back to where it was.\n       *\n       * Does nothing if the option `moveGroupColumns` is set to false.\n       *\n       * @param {Grid} grid grid object\n       * @param {array} columns the columns that we should process/move\n       * @returns {array} updated columns\n       */\n      moveGroupColumns: function( grid, columns ) {\n        if ( grid.options.moveGroupColumns === false) {\n          return columns;\n        }\n\n        columns.forEach(function(column, index) {\n          // position used to make stable sort in moveGroupColumns\n          column.groupingPosition = index;\n        });\n\n        columns.sort(function(a, b) {\n          var a_group, b_group;\n\n          if (a.isRowHeader) {\n            a_group = a.headerPriority;\n          }\n          else if ( typeof(a.grouping) === 'undefined' || typeof(a.grouping.groupPriority) === 'undefined' || a.grouping.groupPriority < 0) {\n            a_group = null;\n          }\n          else {\n            a_group = a.grouping.groupPriority;\n          }\n\n          if (b.isRowHeader) {\n            b_group = b.headerPriority;\n          }\n          else if ( typeof(b.grouping) === 'undefined' || typeof(b.grouping.groupPriority) === 'undefined' || b.grouping.groupPriority < 0) {\n            b_group = null;\n          }\n          else {\n            b_group = b.grouping.groupPriority;\n          }\n\n          // groups get sorted to the top\n          if ( a_group !== null && b_group === null) { return -1; }\n          if ( b_group !== null && a_group === null) { return 1; }\n          if ( a_group !== null && b_group !== null) {return a_group - b_group; }\n\n          return a.groupingPosition - b.groupingPosition;\n        });\n\n        columns.forEach( function(column) {\n          delete column.groupingPosition;\n        });\n\n        return columns;\n      },\n\n\n      /**\n       * @ngdoc function\n       * @name groupColumn\n       * @methodOf  ui.grid.grouping.service:uiGridGroupingService\n       * @description Adds this column to the existing grouping, at the end of the priority order.\n       * If the column doesn't have a sort, adds one, by default ASC\n       *\n       * This column will move to the left of any non-group columns, the\n       * move is handled in a columnProcessor, so gets called as part of refresh\n       *\n       * @param {Grid} grid grid object\n       * @param {GridColumn} column the column we want to group\n       */\n      groupColumn: function( grid, column) {\n        if ( typeof(column.grouping) === 'undefined' ) {\n          column.grouping = {};\n        }\n\n        // set the group priority to the next number in the hierarchy\n        var existingGrouping = service.getGrouping( grid );\n        column.grouping.groupPriority = existingGrouping.grouping.length;\n\n        // save sort in order to restore it when column is ungrouped\n        column.previousSort = angular.copy(column.sort);\n\n        // add sort if not present\n        if ( !column.sort ) {\n          column.sort = { direction: uiGridConstants.ASC };\n        } else if ( typeof(column.sort.direction) === 'undefined' || column.sort.direction === null ) {\n          column.sort.direction = uiGridConstants.ASC;\n        }\n\n        column.treeAggregation = { type: uiGridGroupingConstants.aggregation.COUNT, source: 'grouping' };\n\n        if ( column.colDef && angular.isFunction(column.colDef.customTreeAggregationFn) ) {\n          column.treeAggregationFn = column.colDef.customTreeAggregationFn;\n        } else {\n          column.treeAggregationFn = uiGridTreeBaseService.nativeAggregations()[uiGridGroupingConstants.aggregation.COUNT].aggregationFn;\n        }\n\n        column.treeAggregationFinalizerFn = service.groupedFinalizerFn;\n\n        grid.api.grouping.raise.groupingChanged(column);\n        // This indirectly calls service.tidyPriorities( grid );\n        grid.api.core.raise.sortChanged(grid, grid.getColumnSorting());\n\n        grid.queueGridRefresh();\n      },\n\n\n       /**\n       * @ngdoc function\n       * @name ungroupColumn\n       * @methodOf  ui.grid.grouping.service:uiGridGroupingService\n       * @description Removes the groupPriority from this column.  If the\n       * column was previously aggregated the aggregation will come back.\n       * The sort will remain.\n       *\n       * This column will move to the right of any other group columns, the\n       * move is handled in a columnProcessor, so gets called as part of refresh\n       *\n       * @param {Grid} grid grid object\n       * @param {GridColumn} column the column we want to ungroup\n       */\n      ungroupColumn: function( grid, column) {\n        if ( typeof(column.grouping) === 'undefined' ) {\n          return;\n        }\n\n        delete column.grouping.groupPriority;\n        delete column.treeAggregation;\n        delete column.customTreeAggregationFinalizer;\n\n        if (column.previousSort) {\n          column.sort = column.previousSort;\n          delete column.previousSort;\n        }\n\n        service.tidyPriorities( grid );\n\n        grid.api.grouping.raise.groupingChanged(column);\n        grid.api.core.raise.sortChanged(grid, grid.getColumnSorting());\n\n        grid.queueGridRefresh();\n      },\n\n      /**\n       * @ngdoc function\n       * @name aggregateColumn\n       * @methodOf  ui.grid.grouping.service:uiGridGroupingService\n       * @description Sets the aggregation type on a column, if the\n       * column is currently grouped then it removes the grouping first.\n       *\n       * @param {Grid} grid grid object\n       * @param {GridColumn} column the column we want to aggregate\n       * @param {string} aggregationType of the recognised types from uiGridGroupingConstants or one of the custom aggregations from gridOptions\n       * @param {string} aggregationLabel to be used instead of the default label. If empty string is passed, label is omitted\n       */\n      aggregateColumn: function( grid, column, aggregationType, aggregationLabel ) {\n        if (typeof(column.grouping) !== 'undefined' && typeof(column.grouping.groupPriority) !== 'undefined' && column.grouping.groupPriority >= 0) {\n          service.ungroupColumn( grid, column );\n        }\n\n        var aggregationDef = {};\n\n        if ( typeof(grid.options.treeCustomAggregations[aggregationType]) !== 'undefined' ) {\n          aggregationDef = grid.options.treeCustomAggregations[aggregationType];\n        } else if ( typeof(uiGridTreeBaseService.nativeAggregations()[aggregationType]) !== 'undefined' ) {\n          aggregationDef = uiGridTreeBaseService.nativeAggregations()[aggregationType];\n        }\n\n        column.treeAggregation = {\n          type: aggregationType,\n          label: ( typeof aggregationLabel === 'string') ?\n            aggregationLabel :\n            i18nService.get().aggregation[aggregationDef.label] || aggregationDef.label\n        };\n        column.treeAggregationFn = aggregationDef.aggregationFn;\n        column.treeAggregationFinalizerFn = aggregationDef.finalizerFn;\n\n        grid.api.grouping.raise.aggregationChanged(column);\n\n        grid.queueGridRefresh();\n      },\n\n\n      /**\n       * @ngdoc function\n       * @name setGrouping\n       * @methodOf  ui.grid.grouping.service:uiGridGroupingService\n       * @description Set the grouping based on a config object, used by the save state feature\n       * (more specifically, by the restore function in that feature )\n       *\n       * @param {Grid} grid grid object\n       * @param {object} config the config we want to set, same format as that returned by getGrouping\n       */\n      setGrouping: function ( grid, config ) {\n        if ( typeof(config) === 'undefined' ) {\n          return;\n        }\n\n        // first remove any existing grouping\n        service.clearGrouping(grid);\n\n        if ( config.grouping && config.grouping.length && config.grouping.length > 0 ) {\n          config.grouping.forEach( function( group ) {\n            var col = grid.getColumn(group.colName);\n\n            if ( col ) {\n              service.groupColumn( grid, col );\n            }\n          });\n        }\n\n        if ( config.aggregations && config.aggregations.length ) {\n          config.aggregations.forEach( function( aggregation ) {\n            var col = grid.getColumn(aggregation.colName);\n\n            if ( col ) {\n              service.aggregateColumn( grid, col, aggregation.aggregation.type );\n            }\n          });\n        }\n\n        if ( config.rowExpandedStates ) {\n          service.applyRowExpandedStates( grid.grouping.groupingHeaderCache, config.rowExpandedStates );\n        }\n      },\n\n\n      /**\n       * @ngdoc function\n       * @name clearGrouping\n       * @methodOf  ui.grid.grouping.service:uiGridGroupingService\n       * @description Clear any grouped columns and any aggregations.  Doesn't remove sorting,\n       * as we don't know whether that sorting was added by grouping or was there beforehand\n       *\n       * @param {Grid} grid grid object\n       */\n      clearGrouping: function( grid ) {\n        var currentGrouping = service.getGrouping(grid);\n\n        if ( currentGrouping.grouping.length > 0 ) {\n          currentGrouping.grouping.forEach( function( group ) {\n            if (!group.col) {\n              // should have a group.colName if there's no col\n              group.col = grid.getColumn(group.colName);\n            }\n            service.ungroupColumn(grid, group.col);\n          });\n        }\n\n        if ( currentGrouping.aggregations.length > 0 ) {\n          currentGrouping.aggregations.forEach( function( aggregation ) {\n            if (!aggregation.col) {\n              // should have a group.colName if there's no col\n              aggregation.col = grid.getColumn(aggregation.colName);\n            }\n            service.aggregateColumn(grid, aggregation.col, null);\n          });\n        }\n      },\n\n\n      /**\n       * @ngdoc function\n       * @name tidyPriorities\n       * @methodOf  ui.grid.grouping.service:uiGridGroupingService\n       * @description Renumbers groupPriority and sortPriority such that\n       * groupPriority is contiguous, and sortPriority either matches\n       * groupPriority (for group columns), and otherwise is contiguous and\n       * higher than groupPriority.\n       *\n       * @param {Grid} grid grid object\n       */\n      tidyPriorities: function( grid ) {\n        // if we're called from sortChanged, grid is in this, not passed as param, the param can be a column or undefined\n        if ( ( typeof(grid) === 'undefined' || typeof(grid.grid) !== 'undefined' ) && typeof(this.grid) !== 'undefined' ) {\n          grid = this.grid;\n        }\n\n        var groupArray = [],\n          sortArray = [];\n\n        grid.columns.forEach( function(column, index) {\n          if ( typeof(column.grouping) !== 'undefined' && typeof(column.grouping.groupPriority) !== 'undefined' && column.grouping.groupPriority >= 0) {\n            groupArray.push(column);\n          }\n          else if ( typeof(column.sort) !== 'undefined' && typeof(column.sort.priority) !== 'undefined' && column.sort.priority >= 0) {\n            sortArray.push(column);\n          }\n        });\n\n        groupArray.sort(function(a, b) { return a.grouping.groupPriority - b.grouping.groupPriority; });\n        groupArray.forEach( function(column, index) {\n          column.grouping.groupPriority = index;\n          column.suppressRemoveSort = true;\n          if ( typeof(column.sort) === 'undefined') {\n            column.sort = {};\n          }\n          column.sort.priority = index;\n        });\n\n        var i = groupArray.length;\n\n        sortArray.sort(function(a, b) { return a.sort.priority - b.sort.priority; });\n        sortArray.forEach(function(column) {\n          column.sort.priority = i;\n          column.suppressRemoveSort = column.colDef.suppressRemoveSort;\n          i++;\n        });\n      },\n\n      /**\n       * @ngdoc function\n       * @name groupRows\n       * @methodOf  ui.grid.grouping.service:uiGridGroupingService\n       * @description The rowProcessor that creates the groupHeaders (i.e. does\n       * the actual grouping).\n       *\n       * Assumes it is always called after the sorting processor, guaranteed by the priority setting\n       *\n       * Processes all the rows in order, inserting a groupHeader row whenever there is a change\n       * in value of a grouped row, based on the sortAlgorithm used for the column.  The group header row\n       * is looked up in the groupHeaderCache, and used from there if there is one. The entity is reset\n       * to {} if one is found.\n       *\n       * As it processes it maintains a `processingState` array. This records, for each level of grouping we're\n       * working with, the following information:\n       * ```\n       *   {\n       *     fieldName: name,\n       *     col: col,\n       *     initialised: boolean,\n       *     currentValue: value,\n       *     currentRow: gridRow,\n       *   }\n       * ```\n       * We look for changes in the currentValue at any of the levels.  Where we find a change we:\n       *\n       * - create a new groupHeader row in the array\n       *\n       * @param {array} renderableRows the rows we want to process, usually the output from the previous rowProcessor\n       * @returns {array} the updated rows, including our new group rows\n       */\n      groupRows: function( renderableRows ) {\n        if (renderableRows.length === 0) {\n          return renderableRows;\n        }\n\n        var grid = this;\n        grid.grouping.oldGroupingHeaderCache = grid.grouping.groupingHeaderCache || {};\n        grid.grouping.groupingHeaderCache = {};\n\n        var processingState = service.initialiseProcessingState( grid );\n\n        // processes each of the fields we are grouping by, checks if the value has changed and inserts a groupHeader\n        // Broken out as shouldn't create functions in a loop.\n        var updateProcessingState = function( groupFieldState, stateIndex ) {\n          var fieldValue = grid.getCellValue(row, groupFieldState.col);\n\n          // look for change of value - and insert a header\n          if ( !groupFieldState.initialised || rowSorter.getSortFn(groupFieldState.col)(fieldValue, groupFieldState.currentValue) !== 0 ) {\n            service.insertGroupHeader( grid, renderableRows, i, processingState, stateIndex );\n            i++;\n          }\n        };\n\n        // use a for loop because it's tolerant of the array length changing whilst we go - we can\n        // manipulate the iterator when we insert groupHeader rows\n        for (var i = 0; i < renderableRows.length; i++ ) {\n          var row = renderableRows[i];\n\n          if ( row.visible ) {\n            processingState.forEach( updateProcessingState );\n          }\n        }\n\n        delete grid.grouping.oldGroupingHeaderCache;\n        return renderableRows;\n      },\n\n\n      /**\n       * @ngdoc function\n       * @name initialiseProcessingState\n       * @methodOf  ui.grid.grouping.service:uiGridGroupingService\n       * @description Creates the processing state array that is used\n       * for groupRows.\n       *\n       * @param {Grid} grid grid object\n       * @returns {array} an array in the format described in the groupRows method,\n       * initialised with blank values\n       */\n      initialiseProcessingState: function( grid ) {\n        var processingState = [];\n        var columnSettings = service.getGrouping( grid );\n\n        columnSettings.grouping.forEach( function( groupItem, index) {\n          processingState.push({\n            fieldName: groupItem.field,\n            col: groupItem.col,\n            initialised: false,\n            currentValue: null,\n            currentRow: null\n          });\n        });\n\n        return processingState;\n      },\n\n\n      /**\n       * @ngdoc function\n       * @name getGrouping\n       * @methodOf  ui.grid.grouping.service:uiGridGroupingService\n       * @description Get the grouping settings from the columns.  As a side effect\n       * this always renumbers the grouping starting at 0\n       * @param {Grid} grid grid object\n       * @returns {array} an array of the group fields, in order of priority\n       */\n      getGrouping: function( grid ) {\n        var groupArray = [],\n          aggregateArray = [];\n\n        // get all the grouping\n        grid.columns.forEach(function(column) {\n          if ( column.grouping ) {\n            if ( typeof(column.grouping.groupPriority) !== 'undefined' && column.grouping.groupPriority >= 0) {\n              groupArray.push({ field: column.field, col: column, groupPriority: column.grouping.groupPriority, grouping: column.grouping });\n            }\n          }\n          if ( column.treeAggregation && column.treeAggregation.type ) {\n            aggregateArray.push({ field: column.field, col: column, aggregation: column.treeAggregation });\n          }\n        });\n\n        // sort grouping into priority order\n        groupArray.sort( function(a, b) {\n          return a.groupPriority - b.groupPriority;\n        });\n\n        // renumber the priority in case it was somewhat messed up, then remove the grouping reference\n        groupArray.forEach( function( group, index) {\n          group.grouping.groupPriority = index;\n          group.groupPriority = index;\n          delete group.grouping;\n        });\n\n        return { grouping: groupArray, aggregations: aggregateArray };\n      },\n\n\n      /**\n       * @ngdoc function\n       * @name insertGroupHeader\n       * @methodOf  ui.grid.grouping.service:uiGridGroupingService\n       * @description Create a group header row, and link it to the various configuration\n       * items that we use.\n       *\n       * Look for the row in the oldGroupingHeaderCache, write the row into the new groupingHeaderCache.\n       *\n       * @param {Grid} grid grid object\n       * @param {array} renderableRows the rows that we are processing\n       * @param {number} rowIndex the row we were up to processing\n       * @param {array} processingState the current processing state\n       * @param {number} stateIndex the processing state item that we were on when we triggered a new group header -\n       * i.e. the column that we want to create a header for\n       */\n      insertGroupHeader: function( grid, renderableRows, rowIndex, processingState, stateIndex ) {\n        // set the value that caused the end of a group into the header row and the processing state\n        var col = processingState[stateIndex].col,\n          newValue = grid.getCellValue(renderableRows[rowIndex], col),\n          newDisplayValue = newValue;\n\n        if ( typeof(newValue) === 'undefined' || newValue === null ) {\n          newDisplayValue = grid.options.groupingNullLabel;\n        }\n\n        function getKeyAsValueForCacheMap(key) {\n          return angular.isObject(key) ? JSON.stringify(key) : key;\n        }\n\n        var cacheItem = grid.grouping.oldGroupingHeaderCache;\n\n        for ( var i = 0; i < stateIndex; i++ ) {\n          if ( cacheItem && cacheItem[getKeyAsValueForCacheMap(processingState[i].currentValue)] ) {\n            cacheItem = cacheItem[getKeyAsValueForCacheMap(processingState[i].currentValue)].children;\n          }\n        }\n\n        var headerRow;\n\n        if ( cacheItem && cacheItem[getKeyAsValueForCacheMap(newValue)]) {\n          headerRow = cacheItem[getKeyAsValueForCacheMap(newValue)].row;\n          headerRow.entity = {};\n        } else {\n          headerRow = new GridRow( {}, null, grid );\n          gridClassFactory.rowTemplateAssigner.call(grid, headerRow);\n        }\n\n        headerRow.entity['$$' + processingState[stateIndex].col.uid] = { groupVal: newDisplayValue };\n        headerRow.treeLevel = stateIndex;\n        headerRow.groupHeader = true;\n        headerRow.internalRow = true;\n        headerRow.enableCellEdit = false;\n        headerRow.enableSelection = grid.options.enableGroupHeaderSelection;\n        processingState[stateIndex].initialised = true;\n        processingState[stateIndex].currentValue = newValue;\n        processingState[stateIndex].currentRow = headerRow;\n\n        // set all processing states below this one to not be initialised - change of this state\n        // means all those need to start again\n        service.finaliseProcessingState( processingState, stateIndex + 1);\n\n        // insert our new header row\n        renderableRows.splice(rowIndex, 0, headerRow);\n\n        // add our new header row to the cache\n        cacheItem = grid.grouping.groupingHeaderCache;\n        for ( i = 0; i < stateIndex; i++ ) {\n          cacheItem = cacheItem[getKeyAsValueForCacheMap(processingState[i].currentValue)].children;\n        }\n        cacheItem[getKeyAsValueForCacheMap(newValue)] = { row: headerRow, children: {} };\n      },\n\n\n      /**\n       * @ngdoc function\n       * @name finaliseProcessingState\n       * @methodOf  ui.grid.grouping.service:uiGridGroupingService\n       * @description Set all processing states lower than the one that had a break in value to\n       * no longer be initialised.  Render the counts into the entity ready for display.\n       *\n       * @param {array} processingState the current processing state\n       * @param {number} stateIndex the processing state item that we were on when we triggered a new group header, all\n       * processing states after this need to be finalised\n       */\n      finaliseProcessingState: function( processingState, stateIndex ) {\n        for ( var i = stateIndex; i < processingState.length; i++) {\n          processingState[i].initialised = false;\n          processingState[i].currentRow = null;\n          processingState[i].currentValue = null;\n        }\n      },\n\n\n      /**\n       * @ngdoc function\n       * @name getRowExpandedStates\n       * @methodOf  ui.grid.grouping.service:uiGridGroupingService\n       * @description Extract the groupHeaderCache hash, pulling out only the states.\n       *\n       * The example below shows a grid that is grouped by gender then age\n       *\n       * <pre>\n       *   {\n       *     male: {\n       *       state: 'expanded',\n       *       children: {\n       *         22: { state: 'expanded' },\n       *         30: { state: 'collapsed' }\n       *       }\n       *     },\n       *     female: {\n       *       state: 'expanded',\n       *       children: {\n       *         28: { state: 'expanded' },\n       *         55: { state: 'collapsed' }\n       *       }\n       *     }\n       *   }\n       * </pre>\n       *\n       * @param {object} treeChildren The tree children elements object\n       * @returns {object} the expanded states as an object\n       */\n      getRowExpandedStates: function(treeChildren) {\n        if ( typeof(treeChildren) === 'undefined' ) {\n          return {};\n        }\n\n        var newChildren = {};\n\n        angular.forEach( treeChildren, function( value, key ) {\n          newChildren[key] = { state: value.row.treeNode.state };\n          if ( value.children ) {\n            newChildren[key].children = service.getRowExpandedStates( value.children );\n          } else {\n            newChildren[key].children = {};\n          }\n        });\n\n        return newChildren;\n      },\n\n\n      /**\n       * @ngdoc function\n       * @name applyRowExpandedStates\n       * @methodOf  ui.grid.grouping.service:uiGridGroupingService\n       * @description Take a hash in the format as created by getRowExpandedStates,\n       * and apply it to the grid.grouping.groupHeaderCache.\n       *\n       * Takes a treeSubset, and applies to a treeSubset - so can be called\n       * recursively.\n       *\n       * @param {object} currentNode can be grid.grouping.groupHeaderCache, or any of\n       * the children of that hash\n       * @param {object} expandedStates can be the full expanded states, or children\n       * of that expanded states (which hopefully matches the subset of the groupHeaderCache)\n       */\n      applyRowExpandedStates: function( currentNode, expandedStates ) {\n        if ( typeof(expandedStates) === 'undefined' ) {\n          return;\n        }\n\n        angular.forEach(expandedStates, function( value, key ) {\n          if ( currentNode[key] ) {\n            currentNode[key].row.treeNode.state = value.state;\n\n            if (value.children && currentNode[key].children) {\n              service.applyRowExpandedStates( currentNode[key].children, value.children );\n            }\n          }\n        });\n      }\n\n\n    };\n\n    return service;\n\n  }]);\n\n\n  /**\n   *  @ngdoc directive\n   *  @name ui.grid.grouping.directive:uiGridGrouping\n   *  @element div\n   *  @restrict A\n   *\n   *  @description Adds grouping features to grid\n   *\n   *  @example\n   <example module=\"app\">\n   <file name=\"app.js\">\n   var app = angular.module('app', ['ui.grid', 'ui.grid.grouping']);\n\n   app.controller('MainCtrl', ['$scope', function ($scope) {\n      $scope.data = [\n        { name: 'Bob', title: 'CEO' },\n            { name: 'Frank', title: 'Lowly Developer' }\n      ];\n\n      $scope.columnDefs = [\n        {name: 'name', enableCellEdit: true},\n        {name: 'title', enableCellEdit: true}\n      ];\n\n      $scope.gridOptions = { columnDefs: $scope.columnDefs, data: $scope.data };\n    }]);\n   </file>\n   <file name=\"index.ced81ed4.html\">\n   <div ng-controller=\"MainCtrl\">\n   <div ui-grid=\"gridOptions\" ui-grid-grouping></div>\n   </div>\n   </file>\n   </example>\n   */\n  module.directive('uiGridGrouping', ['uiGridGroupingConstants', 'uiGridGroupingService',\n  function (uiGridGroupingConstants, uiGridGroupingService) {\n    return {\n      replace: true,\n      priority: 0,\n      require: '^uiGrid',\n      scope: false,\n      compile: function () {\n        return {\n          pre: function ($scope, $elm, $attrs, uiGridCtrl) {\n            if (uiGridCtrl.grid.options.enableGrouping !== false) {\n              uiGridGroupingService.initializeGrid(uiGridCtrl.grid, $scope);\n            }\n          },\n          post: function ($scope, $elm, $attrs, uiGridCtrl) {\n          }\n        };\n      }\n    };\n  }]);\n\n})();\n\n(function() {\n\tangular.module('ui.grid').config(['$provide', function($provide) {\n\t\t$provide.decorator('i18nService', ['$delegate', function($delegate) {\n\t\t\t$delegate.add('ar', {\n\t\t\t\t\"headerCell\": {\n\t\t\t\t\t\"aria\": {\n\t\t\t\t\t\t\"defaultFilterLabel\": \"التصفيه بالعمود\",\n\t\t\t\t\t\t\"removeFilter\": \"محو التصفيه\",\n\t\t\t\t\t\t\"columnMenuButtonLabel\": \"قاءمه الاعمده\"\n\t\t\t\t\t},\n\t\t\t\t\t\"priority\": \"أولويه : \",\n\t\t\t\t\t\"filterLabel\": \"تصفيه بالاعمده :\"\n\t\t\t\t},\n\t\t\t\t\"aggregate\": {\n\t\t\t\t\t\"label\": \"العناصر\"\n\t\t\t\t},\n\t\t\t\t\"groupPanel\": {\n\t\t\t\t\t\"description\": \"اسحب رأس العمود هنا وأسقطه لإنشاء مجموعه\"\n\t\t\t\t},\n\t\t\t\t\"search\": {\n\t\t\t\t\t\"placeholder\": \"بحث  ...\",\n\t\t\t\t\t\"showingItems\": \"العناصر الظاهره :\",\n\t\t\t\t\t\"selectedItems\": \"العناصر المحدده :\",\n\t\t\t\t\t\"totalItems\": \"عدد العناصر :\",\n\t\t\t\t\t\"size\": \"حجم الصفحه :\",\n\t\t\t\t\t\"first\": \"اول صفحه\",\n\t\t\t\t\t\"next\": \"الصفحه التاليه\",\n\t\t\t\t\t\"previous\": \"الصفحه الصابقه\",\n\t\t\t\t\t\"last\": \"الصفحه الاخيره\"\n\t\t\t\t},\n\t\t\t\t\"menu\": {\n\t\t\t\t\t\"text\": \"اختيار العمود :\"\n\t\t\t\t},\n\t\t\t\t\"sort\": {\n\t\t\t\t\t\"ascending\": \"ترتيب تصاعدى\",\n\t\t\t\t\t\"descending\": \"ترتيب تنازلى\",\n\t\t\t\t\t\"none\": \"عدم التحديد\",\n\t\t\t\t\t\"remove\": \"حذف الترتيب\"\n\t\t\t\t},\n\t\t\t\t\"column\": {\n\t\t\t\t\t\"hide\": \"إخفاء عمود\"\n\t\t\t\t},\n\t\t\t\t\"aggregation\": {\n\t\t\t\t\t\"count\": \"عدد الصفوف: \",\n\t\t\t\t\t\"sum\": \"جمع: \",\n\t\t\t\t\t\"avg\": \"المتوسط الحسابى: \",\n\t\t\t\t\t\"min\": \"الادنى: \",\n\t\t\t\t\t\"max\": \"الاقصى: \"\n\t\t\t\t},\n\t\t\t\t\"pinning\": {\n\t\t\t\t\t\"pinLeft\": \"تثبيت لليسار\",\n\t\t\t\t\t\"pinRight\": \"تثبيت لليمين\",\n\t\t\t\t\t\"unpin\": \"فك التثبيت\"\n\t\t\t\t},\n\t\t\t\t\"columnMenu\": {\n\t\t\t\t\t\"close\": \"غلق\"\n\t\t\t\t},\n\t\t\t\t\"gridMenu\": {\n\t\t\t\t\t\"aria\": {\n\t\t\t\t\t\t\"buttonLabel\": \"قائمه الجدول\"\n\t\t\t\t\t},\n\t\t\t\t\t\"columns\": \"الاعمده:\",\n\t\t\t\t\t\"importerTitle\": \"إدخال ملف\",\n\t\t\t\t\t\"exporterAllAsCsv\": \"إخراج كل البيانات ك(csv)\",\n\t\t\t\t\t\"exporterVisibleAsCsv\": \"إخراج كل البيانات الواضحه ك (csv)\",\n\t\t\t\t\t\"exporterSelectedAsCsv\": \"إخراج كل البيانات المحدده ك (csv)\",\n\t\t\t\t\t\"exporterAllAsPdf\": \"إخراج كل البيانات ك(pdf)\",\n\t\t\t\t\t\"exporterVisibleAsPdf\": \"إخراج كل البيانات الواضحه ك (pdf)\",\n\t\t\t\t\t\"exporterSelectedAsPdf\": \"إخراج كل البيانات المحدده ك (pdf)\",\n\t\t\t\t\t\"clearAllFilters\": \"محو كل الترشيح\"\n\t\t\t\t},\n\t\t\t\t\"importer\": {\n\t\t\t\t\t\"noHeaders\": \"اسماء هؤلاء الاعمده غير واضحه، هل يوجد رأس للملف؟\",\n\t\t\t\t\t\"noObjects\": \"Objects were not able to be derived, was there data in the file other than headers?\",\n\t\t\t\t\t\"invalidCsv\": \"الملف غير قادر على الاتمام ، هل ال (CSV) صحيح؟\",\n\t\t\t\t\t\"invalidJson\": \"الملف غير قادر على الاتمام ، هل ال (JSON) صحيح؟\",\n\t\t\t\t\t\"jsonNotArray\": \"Imported json file must contain an array, aborting.\"\n\t\t\t\t},\n\t\t\t\t\"pagination\": {\n\t\t\t\t\t\"aria\": {\n\t\t\t\t\t\t\"pageToFirst\": \"الصفحه الاولى\",\n\t\t\t\t\t\t\"pageBack\": \"الصفه السابقه\",\n\t\t\t\t\t\t\"pageSelected\": \"الصفحه المحدده\",\n\t\t\t\t\t\t\"pageForward\": \"الصفحه التاليه\",\n\t\t\t\t\t\t\"pageToLast\": \"الصفحه الاخيره\"\n\t\t\t\t\t},\n\t\t\t\t\t\"sizes\": \"عدد العناصر فى الصفحه\",\n\t\t\t\t\t\"totalItems\": \"عناصر\",\n\t\t\t\t\t\"through\": \"إلى\",\n\t\t\t\t\t\"of\": \"من\"\n\t\t\t\t},\n\t\t\t\t\"grouping\": {\n\t\t\t\t\t\"group\": \"جمع\",\n\t\t\t\t\t\"ungroup\": \"فك الجمع\",\n\t\t\t\t\t\"aggregate_count\": \"جمله : العدد\",\n\t\t\t\t\t\"aggregate_sum\": \"جمله : الحاصل\",\n\t\t\t\t\t\"aggregate_max\": \"جمله : الاقصى\",\n\t\t\t\t\t\"aggregate_min\": \"جمله : الاقل\",\n\t\t\t\t\t\"aggregate_avg\": \"جمله :المتوسط \",\n\t\t\t\t\t\"aggregate_remove\": \"جمله : حذف\"\n\t\t\t\t},\n\t\t\t\t\"validate\": {\n\t\t\t\t\t\"error\": \"خطأ :\",\n\t\t\t\t\t\"minLength\": \"القيمه لابد ان لا تقل عن THRESHOLD حرف.\",\n\t\t\t\t\t\"maxLength\": \"القيمه لابد ان لا تزيد عن THRESHOLD حرف.\",\n\t\t\t\t\t\"required\": \"مطلوب قيمه\"\n\t\t\t\t}\n\t\t\t});\n\t\t\treturn $delegate;\n\t\t}]);\n\t}]);\n})();\n\n(function () {\n  angular.module('ui.grid').config(['$provide', function($provide) {\n    $provide.decorator('i18nService', ['$delegate', function($delegate) {\n      $delegate.add('bg', {\n        headerCell: {\n          aria: {\n            defaultFilterLabel: 'Филттър за колоната',\n            removeFilter: 'Премахни филтър',\n            columnMenuButtonLabel: 'Меню на колоната'\n          },\n          priority: 'Приоритет:',\n          filterLabel: \"Филтър за колоната: \"\n        },\n        aggregate: {\n          label: 'обекти'\n        },\n        search: {\n          placeholder: 'Търсене...',\n          showingItems: 'Показани обекти:',\n          selectedItems: 'избрани обекти:',\n          totalItems: 'Общо:',\n          size: 'Размер на страницата:',\n          first: 'Първа страница',\n          next: 'Следваща страница',\n          previous: 'Предишна страница',\n          last: 'Последна страница'\n        },\n        menu: {\n          text: 'Избери колони:'\n        },\n        sort: {\n          ascending: 'Сортиране по възходящ ред',\n          descending: 'Сортиране по низходящ ред',\n          none: 'Без сортиране',\n          remove: 'Премахни сортирането'\n        },\n        column: {\n          hide: 'Скрий колоната'\n        },\n        aggregation: {\n          count: 'Общо редове: ',\n          sum: 'общо: ',\n          avg: 'средно: ',\n          min: 'най-малко: ',\n          max: 'най-много: '\n        },\n        pinning: {\n          pinLeft: 'Прикрепи вляво',\n          pinRight: 'Прикрепи вдясно',\n          unpin: 'Премахване'\n        },\n        columnMenu: {\n          close: 'Затвори'\n        },\n        gridMenu: {\n          aria: {\n            buttonLabel: 'Меню на таблицата'\n          },\n          columns: 'Колони:',\n          importerTitle: 'Импортиране на файл',\n          exporterAllAsCsv: 'Експортиране на данните като csv',\n          exporterVisibleAsCsv: 'Експортиране на видимите данни като csv',\n          exporterSelectedAsCsv: 'Експортиране на избраните данни като csv',\n          exporterAllAsPdf: 'Експортиране на данните като pdf',\n          exporterVisibleAsPdf: 'Експортиране на видимите данни като pdf',\n          exporterSelectedAsPdf: 'Експортиране на избраните данни като pdf',\n          clearAllFilters: 'Премахни всички филтри'\n        },\n        importer: {\n          noHeaders: 'Имената на колоните не успяха да бъдат извлечени, файлът има ли хедър?',\n          noObjects: 'Обектите не успяха да бъдат извлечени, файлът съдържа ли данни, различни от хедър?',\n          invalidCsv: 'Файлът не може да бъде обработеб, уверете се, че е валиден CSV файл',\n          invalidJson: 'Файлът не може да бъде обработеб, уверете се, че е валиден JSON файл',\n          jsonNotArray: 'Импортираният JSON файл трябва да съдържа масив, прекратяване.'\n        },\n        pagination: {\n          aria: {\n            pageToFirst: 'Към първа страница',\n            pageBack: 'Страница назад',\n            pageSelected: 'Избрана страница',\n            pageForward: 'Страница напред',\n            pageToLast: 'Към последна страница'\n          },\n          sizes: 'обекта на страница',\n          totalItems: 'обекта',\n          through: 'до',\n          of: 'от'\n        },\n        grouping: {\n          group: 'Групиране',\n          ungroup: 'Премахване на групирането',\n          aggregate_count: 'Сбор: Брой',\n          aggregate_sum: 'Сбор: Сума',\n          aggregate_max: 'Сбор: Максимум',\n          aggregate_min: 'Сбор: Минимум',\n          aggregate_avg: 'Сбор: Средно',\n          aggregate_remove: 'Сбор: Премахване'\n        },\n        validate: {\n          error: 'Грешка:',\n          minLength: 'Стойността трябва да съдържа поне THRESHOLD символа.',\n          maxLength: 'Стойността не трябва да съдържа повече от THRESHOLD символа.',\n          required: 'Необходима е стойност.'\n        }\n      });\n      return $delegate;\n    }]);\n  }]);\n})();\n\n(function () {\n  angular.module('ui.grid').config(['$provide', function($provide) {\n    $provide.decorator('i18nService', ['$delegate', function($delegate) {\n      var lang = {\n              aggregate: {\n                  label: 'položky'\n              },\n              groupPanel: {\n                  description: 'Přesuňte záhlaví zde pro vytvoření skupiny dle sloupce.'\n              },\n              search: {\n                  placeholder: 'Hledat...',\n                  showingItems: 'Zobrazuji položky:',\n                  selectedItems: 'Vybrané položky:',\n                  totalItems: 'Celkem položek:',\n                  size: 'Velikost strany:',\n                  first: 'První strana',\n                  next: 'Další strana',\n                  previous: 'Předchozí strana',\n                  last: 'Poslední strana'\n              },\n              menu: {\n                  text: 'Vyberte sloupec:'\n              },\n              sort: {\n                  ascending: 'Seřadit od A-Z',\n                  descending: 'Seřadit od Z-A',\n                  remove: 'Odebrat seřazení'\n              },\n              column: {\n                  hide: 'Schovat sloupec'\n              },\n              aggregation: {\n                  count: 'celkem řádků: ',\n                  sum: 'celkem: ',\n                  avg: 'avg: ',\n                  min: 'min.: ',\n                  max: 'max.: '\n              },\n              pinning: {\n                  pinLeft: 'Zamknout vlevo',\n                  pinRight: 'Zamknout vpravo',\n                  unpin: 'Odemknout'\n              },\n              gridMenu: {\n                  columns: 'Sloupce:',\n                  importerTitle: 'Importovat soubor',\n                  exporterAllAsCsv: 'Exportovat všechna data do csv',\n                  exporterVisibleAsCsv: 'Exportovat viditelná data do csv',\n                  exporterSelectedAsCsv: 'Exportovat vybraná data do csv',\n                  exporterAllAsPdf: 'Exportovat všechna data do pdf',\n                  exporterVisibleAsPdf: 'Exportovat viditelná data do pdf',\n                  exporterSelectedAsPdf: 'Exportovat vybraná data do pdf',\n                  exporterAllAsExcel: 'Exportovat všechna data do excel',\n                  exporterVisibleAsExcel: 'Exportovat viditelná data do excel',\n                  exporterSelectedAsExcel: 'Exportovat vybraná data do excel',\n                  clearAllFilters: 'Odstranit všechny filtry'\n              },\n              importer: {\n                  noHeaders: 'Názvy sloupců se nepodařilo získat, obsahuje soubor záhlaví?',\n                  noObjects: 'Data se nepodařilo zpracovat, obsahuje soubor řádky mimo záhlaví?',\n                  invalidCsv: 'Soubor nelze zpracovat, jedná se o CSV?',\n                  invalidJson: 'Soubor nelze zpracovat, je to JSON?',\n                  jsonNotArray: 'Soubor musí obsahovat json. Ukončuji..'\n              },\n              pagination: {\n                  sizes: 'položek na stránku',\n                  totalItems: 'položek'\n              },\n              grouping: {\n                  group: 'Seskupit',\n                  ungroup: 'Odebrat seskupení',\n                  aggregate_count: 'Agregace: Count',\n                  aggregate_sum: 'Agregace: Sum',\n                  aggregate_max: 'Agregace: Max',\n                  aggregate_min: 'Agregace: Min',\n                  aggregate_avg: 'Agregace: Avg',\n                  aggregate_remove: 'Agregace: Odebrat'\n              }\n          };\n\n          // support varianty of different czech keys.\n          $delegate.add('cs', lang);\n          $delegate.add('cz', lang);\n          $delegate.add('cs-cz', lang);\n          $delegate.add('cs-CZ', lang);\n      return $delegate;\n    }]);\n  }]);\n})();\n\n(function() {\n\tangular.module('ui.grid').config(['$provide', function($provide) {\n\t\t$provide.decorator('i18nService', ['$delegate', function($delegate) {\n\t\t\t$delegate.add('da', {\n\t\t\t\taggregate: {\n\t\t\t\t\tlabel: 'artikler'\n\t\t\t\t},\n\t\t\t\tgroupPanel: {\n\t\t\t\t\tdescription: 'Grupér rækker udfra en kolonne ved at trække dens overskift hertil.'\n\t\t\t\t},\n\t\t\t\tsearch: {\n\t\t\t\t\tplaceholder: 'Søg...',\n\t\t\t\t\tshowingItems: 'Viste rækker:',\n\t\t\t\t\tselectedItems: 'Valgte rækker:',\n\t\t\t\t\ttotalItems: 'Rækker totalt:',\n\t\t\t\t\tsize: 'Side størrelse:',\n\t\t\t\t\tfirst: 'Første side',\n\t\t\t\t\tnext: 'Næste side',\n\t\t\t\t\tprevious: 'Forrige side',\n\t\t\t\t\tlast: 'Sidste side'\n\t\t\t\t},\n\t\t\t\tmenu: {\n\t\t\t\t\ttext: 'Vælg kolonner:'\n\t\t\t\t},\n\t\t\t\tsort: {\n\t\t\t\t\tascending: 'Sorter stigende',\n\t\t\t\t\tdescending: 'Sorter faldende',\n\t\t\t\t\tnone: 'Sorter ingen',\n\t\t\t\t\tremove: 'Fjern sortering'\n\t\t\t\t},\n\t\t\t\tcolumn: {\n\t\t\t\t\thide: 'Skjul kolonne'\n\t\t\t\t},\n\t\t\t\taggregation: {\n\t\t\t\t\tcount: 'antal rækker: ',\n\t\t\t\t\tsum: 'sum: ',\n\t\t\t\t\tavg: 'gns: ',\n\t\t\t\t\tmin: 'min: ',\n\t\t\t\t\tmax: 'max: '\n\t\t\t\t},\n\t\t\t\tpinning: {\n\t\t\t\t\tpinLeft: 'Fastgør til venstre',\n\t\t\t\t\tpinRight: 'Fastgør til højre',\n\t\t\t\t\tunpin: 'Frigør'\n\t\t\t\t},\n\t\t\t\tgridMenu: {\n\t\t\t\t\tcolumns: 'Kolonner:',\n\t\t\t\t\timporterTitle: 'Importer fil',\n\t\t\t\t\texporterAllAsCsv: 'Eksporter alle data som csv',\n\t\t\t\t\texporterVisibleAsCsv: 'Eksporter synlige data som csv',\n\t\t\t\t\texporterSelectedAsCsv: 'Eksporter markerede data som csv',\n\t\t\t\t\texporterAllAsPdf: 'Eksporter alle data som pdf',\n\t\t\t\t\texporterVisibleAsPdf: 'Eksporter synlige data som pdf',\n\t\t\t\t\texporterSelectedAsPdf: 'Eksporter markerede data som pdf',\n\t\t\t\t\texporterAllAsExcel: 'Eksporter alle data som excel',\n\t\t\t\t\texporterVisibleAsExcel: 'Eksporter synlige data som excel',\n\t\t\t\t\texporterSelectedAsExcel: 'Eksporter markerede data som excel',\n\t\t\t\t\tclearAllFilters: 'Clear all filters'\n\t\t\t\t},\n\t\t\t\timporter: {\n\t\t\t\t\tnoHeaders: 'Column names were unable to be derived, does the file have a header?',\n\t\t\t\t\tnoObjects: 'Objects were not able to be derived, was there data in the file other than headers?',\n\t\t\t\t\tinvalidCsv: 'File was unable to be processed, is it valid CSV?',\n\t\t\t\t\tinvalidJson: 'File was unable to be processed, is it valid Json?',\n\t\t\t\t\tjsonNotArray: 'Imported json file must contain an array, aborting.'\n\t\t\t\t},\n\t\t\t\tpagination: {\n\t\t\t\t\taria: {\n\t\t\t\t\t\tpageToFirst: 'Gå til første',\n\t\t\t\t\t\tpageBack: 'Gå tilbage',\n\t\t\t\t\t\tpageSelected: 'Valgte side',\n\t\t\t\t\t\tpageForward: 'Gå frem',\n\t\t\t\t\t\tpageToLast: 'Gå til sidste'\n\t\t\t\t\t},\n\t\t\t\t\tsizes: 'genstande per side',\n\t\t\t\t\ttotalItems: 'genstande',\n\t\t\t\t\tthrough: 'gennem',\n\t\t\t\t\tof: 'af'\n\t\t\t\t}\n\t\t\t});\n\t\t\treturn $delegate;\n\t\t}]);\n\t}]);\n})();\n\n(function () {\n  angular.module('ui.grid').config(['$provide', function ($provide) {\n    $provide.decorator('i18nService', ['$delegate', function ($delegate) {\n      $delegate.add('de', {\n        headerCell: {\n          aria: {\n            defaultFilterLabel: 'Filter für Spalte',\n            removeFilter: 'Filter löschen',\n            columnMenuButtonLabel: 'Spaltenmenü',\n            column: 'Spalte'\n          },\n          priority: 'Priorität:',\n          filterLabel: \"Filter für Spalte: \"\n        },\n        aggregate: {\n          label: 'Eintrag'\n        },\n        groupPanel: {\n          description: 'Ziehen Sie eine Spaltenüberschrift hierhin, um nach dieser Spalte zu gruppieren.'\n        },\n        search: {\n          aria: {\n            selected: 'Zeile markiert',\n            notSelected: 'Zeile nicht markiert'\n          },\n          placeholder: 'Suche...',\n          showingItems: 'Zeige Einträge:',\n          selectedItems: 'Ausgewählte Einträge:',\n          totalItems: 'Einträge gesamt:',\n          size: 'Einträge pro Seite:',\n          first: 'Erste Seite',\n          next: 'Nächste Seite',\n          previous: 'Vorherige Seite',\n          last: 'Letzte Seite'\n        },\n        selection: {\n          aria: {\n            row: 'Zeile'\n          },\n          selectAll: 'Alle auswählen',\n          displayName: 'Zeilenauswahlkasten'\n        },\n        menu: {\n          text: 'Spalten auswählen:'\n        },\n        sort: {\n          ascending: 'aufsteigend sortieren',\n          descending: 'absteigend sortieren',\n          none: 'keine Sortierung',\n          remove: 'Sortierung zurücksetzen'\n        },\n        column: {\n          hide: 'Spalte ausblenden'\n        },\n        aggregation: {\n          count: 'Zeilen insgesamt: ',\n          sum: 'gesamt: ',\n          avg: 'Durchschnitt: ',\n          min: 'min: ',\n          max: 'max: '\n        },\n        pinning: {\n            pinLeft: 'Links anheften',\n            pinRight: 'Rechts anheften',\n            unpin: 'Lösen'\n        },\n        columnMenu: {\n          close: 'Schließen'\n        },\n        gridMenu: {\n          aria: {\n            buttonLabel: 'Tabellenmenü'\n          },\n          columns: 'Spalten:',\n          importerTitle: 'Datei importieren',\n          exporterAllAsCsv: 'Alle Daten als CSV exportieren',\n          exporterVisibleAsCsv: 'Sichtbare Daten als CSV exportieren',\n          exporterSelectedAsCsv: 'Markierte Daten als CSV exportieren',\n          exporterAllAsPdf: 'Alle Daten als PDF exportieren',\n          exporterVisibleAsPdf: 'Sichtbare Daten als PDF exportieren',\n          exporterSelectedAsPdf: 'Markierte Daten als PDF exportieren',\n          exporterAllAsExcel: 'Alle Daten als Excel exportieren',\n          exporterVisibleAsExcel: 'Sichtbare Daten als Excel exportieren',\n          exporterSelectedAsExcel: 'Markierte Daten als Excel exportieren',\n          clearAllFilters: 'Alle Filter zurücksetzen'\n        },\n        importer: {\n          noHeaders: 'Es konnten keine Spaltennamen ermittelt werden. Sind in der Datei Spaltendefinitionen enthalten?',\n          noObjects: 'Es konnten keine Zeileninformationen gelesen werden, Sind in der Datei außer den Spaltendefinitionen auch Daten enthalten?',\n          invalidCsv: 'Die Datei konnte nicht eingelesen werden, ist es eine gültige CSV-Datei?',\n          invalidJson: 'Die Datei konnte nicht eingelesen werden. Enthält sie gültiges JSON?',\n          jsonNotArray: 'Die importierte JSON-Datei muß ein Array enthalten. Breche Import ab.'\n        },\n        pagination: {\n          aria: {\n            pageToFirst: 'Zum Anfang',\n            pageBack: 'Seite zurück',\n            pageSelected: 'Ausgewählte Seite',\n            pageForward: 'Seite vor',\n            pageToLast: 'Zum Ende'\n          },\n          sizes: 'Einträge pro Seite',\n          totalItems: 'Einträgen',\n          through: 'bis',\n          of: 'von'\n        },\n        grouping: {\n            group: 'Gruppieren',\n            ungroup: 'Gruppierung aufheben',\n            aggregate_count: 'Agg: Anzahl',\n            aggregate_sum: 'Agg: Summe',\n            aggregate_max: 'Agg: Maximum',\n            aggregate_min: 'Agg: Minimum',\n            aggregate_avg: 'Agg: Mittelwert',\n            aggregate_remove: 'Aggregation entfernen'\n        },\n        validate: {\n          error: 'Fehler:',\n          minLength: 'Der Wert sollte mindestens THRESHOLD Zeichen lang sein.',\n          maxLength: 'Der Wert sollte maximal THRESHOLD Zeichen lang sein.',\n          required: 'Ein Wert wird benötigt.'\n        }\n      });\n      return $delegate;\n    }]);\n  }]);\n})();\n\n(function () {\n  angular.module('ui.grid').config(['$provide', function($provide) {\n    $provide.decorator('i18nService', ['$delegate', function($delegate) {\n      $delegate.add('es-ct', {\n        headerCell: {\n          aria: {\n            defaultFilterLabel: 'Filtre per columna',\n            removeFilter: 'Elimina el filtre',\n            columnMenuButtonLabel: 'Menú de Columna',\n            column: 'Columna'\n          },\n          priority: 'Priority:',\n          filterLabel: 'Filtre per columna: '\n        },\n        aggregate: {\n          label: 'items'\n        },\n        groupPanel: {\n          description: 'Arrossegueu una capçalera de columna aquí i deixeu-lo anar per agrupar per aquesta columna.'\n        },\n        search: {\n          aria: {\n            selected: 'Fila seleccionada',\n            notSelected: 'Fila no seleccionada'\n          },\n          placeholder: 'Cerca...',\n          showingItems: 'Ítems Mostrats:',\n          selectedItems: 'Ítems Seleccionats:',\n          totalItems: 'Ítems Totals:',\n          size: 'Mida de la pàgina:',\n          first: 'Primera Pàgina',\n          next: 'Propera Pàgina',\n          previous: 'Pàgina Anterior',\n          last: 'Última Pàgina'\n        },\n        selection: {\n          aria: {\n            row: 'Fila'\n          },\n          selectAll: 'Seleccionar Todo',\n          displayName: 'Seleccionar Fila'\n        },\n        menu: {\n          text: 'Triar Columnes:'\n        },\n        sort: {\n          ascending: 'Ordena Ascendent',\n          descending: 'Ordena Descendent',\n          none: 'Sense Ordre',\n          remove: 'Eliminar Ordre'\n        },\n        column: {\n          hide: 'Amaga la Columna'\n        },\n        aggregation: {\n          count: 'Files Totals: ',\n          sum: 'total: ',\n          avg: 'mitjà: ',\n          min: 'mín: ',\n          max: 'màx: '\n        },\n        pinning: {\n          pinLeft: \"Fixar a l'Esquerra\",\n          pinRight: 'Fixar a la Dreta',\n          unpin: 'Treure Fixació'\n        },\n        columnMenu: {\n          close: 'Tanca'\n        },\n        gridMenu: {\n          aria: {\n            buttonLabel: 'Menú de Quadrícula'\n          },\n          columns: 'Columnes:',\n          importerTitle: 'Importa el fitxer',\n          exporterAllAsCsv: 'Exporta tot com CSV',\n          exporterVisibleAsCsv: 'Exporta les dades visibles com a CSV',\n          exporterSelectedAsCsv: 'Exporta les dades seleccionades com a CSV',\n          exporterAllAsPdf: 'Exporta tot com PDF',\n          exporterVisibleAsPdf: 'Exporta les dades visibles com a PDF',\n          exporterSelectedAsPdf: 'Exporta les dades seleccionades com a PDF',\n          exporterAllAsExcel: 'Exporta tot com Excel',\n          exporterVisibleAsExcel: 'Exporta les dades visibles com Excel',\n          exporterSelectedAsExcel: 'Exporta les dades seleccionades com Excel',\n          clearAllFilters: 'Netejar tots els filtres'\n        },\n        importer: {\n          noHeaders: \"No va ser possible derivar els noms de les columnes, té encapçalats l'arxiu?\",\n          noObjects: \"No va ser possible obtenir registres, conté dades l'arxiu, a part de les capçaleres?\",\n          invalidCsv: \"No va ser possible processar l'arxiu, ¿és un CSV vàlid?\",\n          invalidJson: \"No va ser possible processar l'arxiu, ¿és un JSON vàlid?\",\n          jsonNotArray: 'El fitxer json importat ha de contenir una matriu, avortant.'\n        },\n        pagination: {\n          aria: {\n            pageToFirst: 'Page to first',\n            pageBack: 'Page back',\n            pageSelected: 'Selected page',\n            pageForward: 'Page forward',\n            pageToLast: 'Page to last'\n          },\n          sizes: 'ítems per pàgina',\n          totalItems: 'ítems',\n          through: 'a',\n          of: 'de'\n        },\n        grouping: {\n          group: 'Agrupar',\n          ungroup: 'Desagrupar',\n          aggregate_count: 'Agr: Compte',\n          aggregate_sum: 'Agr: Sum',\n          aggregate_max: 'Agr: Máx',\n          aggregate_min: 'Agr: Mín',\n          aggregate_avg: 'Agr: Mitjà',\n          aggregate_remove: 'Agr: Treure'\n        },\n        validate: {\n          error: 'Error:',\n          minLength: 'El valor ha de tenir almenys caràcters THRESHOLD.',\n          maxLength: 'El valor ha de tenir com a màxim caràcters THRESHOLD.',\n          required: 'Un valor és necessari.'\n        }\n      });\n      return $delegate;\n    }]);\n  }]);\n})();\n\n(function () {\n  angular.module('ui.grid').config(['$provide', function($provide) {\n    $provide.decorator('i18nService', ['$delegate', function($delegate) {\n      $delegate.add('es', {\n        aggregate: {\n          label: 'Artículos'\n        },\n        groupPanel: {\n          description: 'Arrastre un encabezado de columna aquí y suéltelo para agrupar por esa columna.'\n        },\n        search: {\n          placeholder: 'Buscar...',\n          showingItems: 'Artículos Mostrados:',\n          selectedItems: 'Artículos Seleccionados:',\n          totalItems: 'Artículos Totales:',\n          size: 'Tamaño de Página:',\n          first: 'Primera Página',\n          next: 'Página Siguiente',\n          previous: 'Página Anterior',\n          last: 'Última Página'\n        },\n        selection: {\n          aria: {\n            row: 'Fila'\n          },\n          selectAll: 'Seleccionar Todo',\n          displayName: 'Seleccionar Fila'\n        },\n        menu: {\n          text: 'Elegir columnas:'\n        },\n        sort: {\n          ascending: 'Orden Ascendente',\n          descending: 'Orden Descendente',\n          remove: 'Sin Ordenar'\n        },\n        column: {\n          hide: 'Ocultar la columna'\n        },\n        aggregation: {\n          count: 'filas totales: ',\n          sum: 'total: ',\n          avg: 'media: ',\n          min: 'min: ',\n          max: 'max: '\n        },\n        pinning: {\n          pinLeft: 'Fijar a la Izquierda',\n          pinRight: 'Fijar a la Derecha',\n          unpin: 'Quitar Fijación'\n        },\n        gridMenu: {\n          columns: 'Columnas:',\n          importerTitle: 'Importar archivo',\n          exporterAllAsCsv: 'Exportar todo como csv',\n          exporterVisibleAsCsv: 'Exportar vista como csv',\n          exporterSelectedAsCsv: 'Exportar selección como csv',\n          exporterAllAsPdf: 'Exportar todo como pdf',\n          exporterVisibleAsPdf: 'Exportar vista como pdf',\n          exporterSelectedAsPdf: 'Exportar selección como pdf',\n          exporterAllAsExcel: 'Exportar todo como excel',\n          exporterVisibleAsExcel: 'Exportar vista como excel',\n          exporterSelectedAsExcel: 'Exportar selección como excel',\n          clearAllFilters: 'Limpiar todos los filtros'\n        },\n        importer: {\n          noHeaders: 'No fue posible derivar los nombres de las columnas, ¿tiene encabezados el archivo?',\n          noObjects: 'No fue posible obtener registros, ¿contiene datos el archivo, aparte de los encabezados?',\n          invalidCsv: 'No fue posible procesar el archivo, ¿es un CSV válido?',\n          invalidJson: 'No fue posible procesar el archivo, ¿es un Json válido?',\n          jsonNotArray: 'El archivo json importado debe contener un array, abortando.'\n        },\n        pagination: {\n          aria: {\n\t\t\t\t\t\t\t\t\t\tpageToFirst: 'Página para primero',\n\t\t\t\t\t\t\t\t\t\tpageBack: 'Página atrás',\n\t\t\t\t\t\t\t\t\t\tpageSelected: 'Página seleccionada',\n\t\t\t\t\t\t\t\t\t\tpageForward: 'Avance de página',\n\t\t\t\t\t\t\t\t\t\tpageToLast: 'Página para durar'\n\t\t\t\t\t\t\t\t\t},\n          through: 'mediante',\n          sizes: 'registros por página',\n          totalItems: 'registros',\n          of: 'de'\n        },\n        grouping: {\n          group: 'Agrupar',\n          ungroup: 'Desagrupar',\n          aggregate_count: 'Agr: Cont',\n          aggregate_sum: 'Agr: Sum',\n          aggregate_max: 'Agr: Máx',\n          aggregate_min: 'Agr: Min',\n          aggregate_avg: 'Agr: Prom',\n          aggregate_remove: 'Agr: Quitar'\n        }\n      });\n      return $delegate;\n    }]);\n}]);\n})();\n\n/**\n * Translated by: R. Salarmehr\n *                M. Hosseynzade\n *                Using Vajje.com online dictionary.\n */\n(function () {\n  angular.module('ui.grid').config(['$provide', function ($provide) {\n    $provide.decorator('i18nService', ['$delegate', function ($delegate) {\n      $delegate.add('fa', {\n        aggregate: {\n          label: 'قلم'\n        },\n        groupPanel: {\n          description: 'عنوان یک ستون را بگیر و به گروهی از آن ستون رها کن.'\n        },\n        search: {\n          placeholder: 'جستجو...',\n          showingItems: 'نمایش اقلام:',\n          selectedItems: 'قلم\\u200cهای انتخاب شده:',\n          totalItems: 'مجموع اقلام:',\n          size: 'اندازه\\u200cی صفحه:',\n          first: 'اولین صفحه',\n          next: 'صفحه\\u200cی\\u200cبعدی',\n          previous: 'صفحه\\u200cی\\u200c قبلی',\n          last: 'آخرین صفحه'\n        },\n        menu: {\n          text: 'ستون\\u200cهای انتخابی:'\n        },\n        sort: {\n          ascending: 'ترتیب صعودی',\n          descending: 'ترتیب نزولی',\n          remove: 'حذف مرتب کردن'\n        },\n        column: {\n          hide: 'پنهان\\u200cکردن ستون'\n        },\n        aggregation: {\n          count: 'تعداد: ',\n          sum: 'مجموع: ',\n          avg: 'میانگین: ',\n          min: 'کمترین: ',\n          max: 'بیشترین: '\n        },\n        pinning: {\n          pinLeft: 'پین کردن سمت چپ',\n          pinRight: 'پین کردن سمت راست',\n          unpin: 'حذف پین'\n        },\n        gridMenu: {\n          columns: 'ستون\\u200cها:',\n          importerTitle: 'وارد کردن فایل',\n          exporterAllAsCsv: 'خروجی تمام داده\\u200cها در فایل csv',\n          exporterVisibleAsCsv: 'خروجی داده\\u200cهای قابل مشاهده در فایل csv',\n          exporterSelectedAsCsv: 'خروجی داده\\u200cهای انتخاب\\u200cشده در فایل csv',\n          exporterAllAsPdf: 'خروجی تمام داده\\u200cها در فایل pdf',\n          exporterVisibleAsPdf: 'خروجی داده\\u200cهای قابل مشاهده در فایل pdf',\n          exporterSelectedAsPdf: 'خروجی داده\\u200cهای انتخاب\\u200cشده در فایل pdf',\n          clearAllFilters: 'پاک کردن تمام فیلتر'\n        },\n        importer: {\n          noHeaders: 'نام ستون قابل استخراج نیست. آیا فایل عنوان دارد؟',\n          noObjects: 'اشیا قابل استخراج نیستند. آیا به جز عنوان\\u200cها در فایل داده وجود دارد؟',\n          invalidCsv: 'فایل قابل پردازش نیست. آیا فرمت  csv  معتبر است؟',\n          invalidJson: 'فایل قابل پردازش نیست. آیا فرمت json   معتبر است؟',\n          jsonNotArray: 'فایل json وارد شده باید حاوی آرایه باشد. عملیات ساقط شد.'\n        },\n        pagination: {\n          sizes: 'اقلام در هر صفحه',\n          totalItems: 'اقلام',\n          of: 'از'\n        },\n        grouping: {\n          group: 'گروه\\u200cبندی',\n          ungroup: 'حذف گروه\\u200cبندی',\n          aggregate_count: 'Agg: تعداد',\n          aggregate_sum: 'Agg: جمع',\n          aggregate_max: 'Agg: بیشینه',\n          aggregate_min: 'Agg: کمینه',\n          aggregate_avg: 'Agg: میانگین',\n          aggregate_remove: 'Agg: حذف'\n        }\n      });\n      return $delegate;\n    }]);\n  }]);\n})();\n\n(function () {\n  angular.module('ui.grid').config(['$provide', function($provide) {\n    $provide.decorator('i18nService', ['$delegate', function($delegate) {\n      $delegate.add('fi', {\n        aggregate: {\n          label: 'rivit'\n        },\n        groupPanel: {\n          description: 'Raahaa ja pudota otsikko tähän ryhmittääksesi sarakkeen mukaan.'\n        },\n        search: {\n          placeholder: 'Hae...',\n          showingItems: 'Näytetään rivejä:',\n          selectedItems: 'Valitut rivit:',\n          totalItems: 'Rivejä yht.:',\n          size: 'Näytä:',\n          first: 'Ensimmäinen sivu',\n          next: 'Seuraava sivu',\n          previous: 'Edellinen sivu',\n          last: 'Viimeinen sivu'\n        },\n        menu: {\n          text: 'Valitse sarakkeet:'\n        },\n        sort: {\n          ascending: 'Järjestä nouseva',\n          descending: 'Järjestä laskeva',\n          remove: 'Poista järjestys'\n        },\n        column: {\n          hide: 'Piilota sarake'\n        },\n        aggregation: {\n          count: 'Rivejä yht.: ',\n          sum: 'Summa: ',\n          avg: 'K.a.: ',\n          min: 'Min: ',\n          max: 'Max: '\n        },\n        pinning: {\n         pinLeft: 'Lukitse vasemmalle',\n          pinRight: 'Lukitse oikealle',\n          unpin: 'Poista lukitus'\n        },\n        gridMenu: {\n          columns: 'Sarakkeet:',\n          importerTitle: 'Tuo tiedosto',\n          exporterAllAsCsv: 'Vie tiedot csv-muodossa',\n          exporterVisibleAsCsv: 'Vie näkyvä tieto csv-muodossa',\n          exporterSelectedAsCsv: 'Vie valittu tieto csv-muodossa',\n          exporterAllAsPdf: 'Vie tiedot pdf-muodossa',\n          exporterVisibleAsPdf: 'Vie näkyvä tieto pdf-muodossa',\n          exporterSelectedAsPdf: 'Vie valittu tieto pdf-muodossa',\n          exporterAllAsExcel: 'Vie tiedot excel-muodossa',\n          exporterVisibleAsExcel: 'Vie näkyvä tieto excel-muodossa',\n          exporterSelectedAsExcel: 'Vie valittu tieto excel-muodossa',\n          clearAllFilters: 'Puhdista kaikki suodattimet'\n        },\n        importer: {\n          noHeaders: 'Sarakkeen nimiä ei voitu päätellä, onko tiedostossa otsikkoriviä?',\n          noObjects: 'Tietoja ei voitu lukea, onko tiedostossa muuta kuin otsikkot?',\n          invalidCsv: 'Tiedostoa ei voitu käsitellä, oliko se CSV-muodossa?',\n          invalidJson: 'Tiedostoa ei voitu käsitellä, oliko se JSON-muodossa?',\n          jsonNotArray: 'Tiedosto ei sisältänyt taulukkoa, lopetetaan.'\n        }\n      });\n      return $delegate;\n    }]);\n  }]);\n})();\n\n(function () {\n  angular.module('ui.grid').config(['$provide', function($provide) {\n    $provide.decorator('i18nService', ['$delegate', function($delegate) {\n      $delegate.add('fr', {\n        headerCell: {\n          aria: {\n            defaultFilterLabel: 'Filtre de la colonne',\n            removeFilter: 'Supprimer le filtre',\n            columnMenuButtonLabel: 'Menu de la colonne'\n          },\n          priority: 'Priorité:',\n          filterLabel: \"Filtre de la colonne: \"\n        },\n        aggregate: {\n          label: 'éléments'\n        },\n        groupPanel: {\n          description: 'Faites glisser une en-tête de colonne ici pour créer un groupe de colonnes.'\n        },\n        search: {\n          placeholder: 'Recherche...',\n          showingItems: 'Affichage des éléments :',\n          selectedItems: 'Éléments sélectionnés :',\n          totalItems: 'Nombre total d\\'éléments:',\n          size: 'Taille de page:',\n          first: 'Première page',\n          next: 'Page Suivante',\n          previous: 'Page précédente',\n          last: 'Dernière page'\n        },\n        selection: {\n          aria: {\n            row: 'Ligne'\n          },\n          selectAll: 'Tout Sélectionner',\n          displayName: 'Sélectionnez la ligne'\n        },\n        menu: {\n          text: 'Choisir des colonnes :'\n        },\n        sort: {\n          ascending: 'Trier par ordre croissant',\n          descending: 'Trier par ordre décroissant',\n          none: 'Aucun tri',\n          remove: 'Enlever le tri'\n        },\n        column: {\n          hide: 'Cacher la colonne'\n        },\n        aggregation: {\n          count: 'lignes totales: ',\n          sum: 'total: ',\n          avg: 'moy: ',\n          min: 'min: ',\n          max: 'max: '\n        },\n        pinning: {\n          pinLeft: 'Épingler à gauche',\n          pinRight: 'Épingler à droite',\n          unpin: 'Détacher'\n        },\n        columnMenu: {\n          close: 'Fermer'\n        },\n        gridMenu: {\n          aria: {\n            buttonLabel: 'Menu du tableau'\n          },\n          columns: 'Colonnes:',\n          importerTitle: 'Importer un fichier',\n          exporterAllAsCsv: 'Exporter toutes les données en CSV',\n          exporterVisibleAsCsv: 'Exporter les données visibles en CSV',\n          exporterSelectedAsCsv: 'Exporter les données sélectionnées en CSV',\n          exporterAllAsPdf: 'Exporter toutes les données en PDF',\n          exporterVisibleAsPdf: 'Exporter les données visibles en PDF',\n          exporterSelectedAsPdf: 'Exporter les données sélectionnées en PDF',\n          exporterAllAsExcel: 'Exporter toutes les données en Excel',\n          exporterVisibleAsExcel: 'Exporter les données visibles en Excel',\n          exporterSelectedAsExcel: 'Exporter les données sélectionnées en Excel',\n          clearAllFilters: 'Nettoyez tous les filtres'\n        },\n        importer: {\n          noHeaders: 'Impossible de déterminer le nom des colonnes, le fichier possède-t-il une en-tête ?',\n          noObjects: 'Aucun objet trouvé, le fichier possède-t-il des données autres que l\\'en-tête ?',\n          invalidCsv: 'Le fichier n\\'a pas pu être traité, le CSV est-il valide ?',\n          invalidJson: 'Le fichier n\\'a pas pu être traité, le JSON est-il valide ?',\n          jsonNotArray: 'Le fichier JSON importé doit contenir un tableau, abandon.'\n        },\n        pagination: {\n          aria: {\n            pageToFirst: 'Aller à la première page',\n            pageBack: 'Page précédente',\n            pageSelected: 'Page sélectionnée',\n            pageForward: 'Page suivante',\n            pageToLast: 'Aller à la dernière page'\n          },\n          sizes: 'éléments par page',\n          totalItems: 'éléments',\n          through: 'à',\n          of: 'sur'\n        },\n        grouping: {\n          group: 'Grouper',\n          ungroup: 'Dégrouper',\n          aggregate_count: 'Agg: Compter',\n          aggregate_sum: 'Agg: Somme',\n          aggregate_max: 'Agg: Max',\n          aggregate_min: 'Agg: Min',\n          aggregate_avg: 'Agg: Moy',\n          aggregate_remove: 'Agg: Retirer'\n        },\n        validate: {\n          error: 'Erreur:',\n          minLength: 'La valeur doit être supérieure ou égale à THRESHOLD caractères.',\n          maxLength: 'La valeur doit être inférieure ou égale à THRESHOLD caractères.',\n          required: 'Une valeur est nécéssaire.'\n        }\n      });\n      return $delegate;\n    }]);\n  }]);\n})();\n\n(function () {\n  angular.module('ui.grid').config(['$provide', function ($provide) {\n    $provide.decorator('i18nService', ['$delegate', function ($delegate) {\n      $delegate.add('he', {\n        aggregate: {\n          label: 'items'\n        },\n        groupPanel: {\n          description: 'גרור עמודה לכאן ושחרר בכדי לקבץ עמודה זו.'\n        },\n        search: {\n          placeholder: 'חפש...',\n          showingItems: 'מציג:',\n          selectedItems: 'סה\"כ נבחרו:',\n          totalItems: 'סה\"כ רשומות:',\n          size: 'תוצאות בדף:',\n          first: 'דף ראשון',\n          next: 'דף הבא',\n          previous: 'דף קודם',\n          last: 'דף אחרון'\n        },\n        menu: {\n          text: 'בחר עמודות:'\n        },\n        sort: {\n          ascending: 'סדר עולה',\n          descending: 'סדר יורד',\n          remove: 'בטל'\n        },\n        column: {\n          hide: 'טור הסתר'\n        },\n        aggregation: {\n          count: 'total rows: ',\n          sum: 'total: ',\n          avg: 'avg: ',\n          min: 'min: ',\n          max: 'max: '\n        },\n        gridMenu: {\n          columns: 'Columns:',\n          importerTitle: 'Import file',\n          exporterAllAsCsv: 'Export all data as csv',\n          exporterVisibleAsCsv: 'Export visible data as csv',\n          exporterSelectedAsCsv: 'Export selected data as csv',\n          exporterAllAsPdf: 'Export all data as pdf',\n          exporterVisibleAsPdf: 'Export visible data as pdf',\n          exporterSelectedAsPdf: 'Export selected data as pdf',\n          exporterAllAsExcel: 'Export all data as excel',\n          exporterVisibleAsExcel: 'Export visible data as excel',\n          exporterSelectedAsExcel: 'Export selected data as excel',\n          clearAllFilters: 'Clean all filters'\n        },\n        importer: {\n          noHeaders: 'Column names were unable to be derived, does the file have a header?',\n          noObjects: 'Objects were not able to be derived, was there data in the file other than headers?',\n          invalidCsv: 'File was unable to be processed, is it valid CSV?',\n          invalidJson: 'File was unable to be processed, is it valid Json?',\n          jsonNotArray: 'Imported json file must contain an array, aborting.'\n        }\n      });\n      return $delegate;\n    }]);\n  }]);\n})();\n\n(function () {\n  angular.module('ui.grid').config(['$provide', function($provide) {\n    $provide.decorator('i18nService', ['$delegate', function($delegate) {\n      $delegate.add('hy', {\n        aggregate: {\n          label: 'տվյալներ'\n        },\n        groupPanel: {\n          description: 'Ըստ սյան խմբավորելու համար քաշեք և գցեք վերնագիրն այստեղ։'\n        },\n        search: {\n          placeholder: 'Փնտրում...',\n          showingItems: 'Ցուցադրված տվյալներ՝',\n          selectedItems: 'Ընտրված:',\n          totalItems: 'Ընդամենը՝',\n          size: 'Տողերի քանակը էջում՝',\n          first: 'Առաջին էջ',\n          next: 'Հաջորդ էջ',\n          previous: 'Նախորդ էջ',\n          last: 'Վերջին էջ'\n        },\n        menu: {\n          text: 'Ընտրել սյուները:'\n        },\n        sort: {\n          ascending: 'Աճման կարգով',\n          descending: 'Նվազման կարգով',\n          remove: 'Հանել '\n        },\n        column: {\n          hide: 'Թաքցնել սյունը'\n        },\n        aggregation: {\n          count: 'ընդամենը տող՝ ',\n          sum: 'ընդամենը՝ ',\n          avg: 'միջին՝ ',\n          min: 'մին՝ ',\n          max: 'մաքս՝ '\n        },\n        pinning: {\n          pinLeft: 'Կպցնել ձախ կողմում',\n          pinRight: 'Կպցնել աջ կողմում',\n          unpin: 'Արձակել'\n        },\n        gridMenu: {\n          columns: 'Սյուներ:',\n          importerTitle: 'Ներմուծել ֆայլ',\n          exporterAllAsCsv: 'Արտահանել ամբողջը CSV',\n          exporterVisibleAsCsv: 'Արտահանել երևացող տվյալները CSV',\n          exporterSelectedAsCsv: 'Արտահանել ընտրված տվյալները CSV',\n          exporterAllAsPdf: 'Արտահանել PDF',\n          exporterVisibleAsPdf: 'Արտահանել երևացող տվյալները PDF',\n          exporterSelectedAsPdf: 'Արտահանել ընտրված տվյալները PDF',\n          exporterAllAsExcel: 'Արտահանել excel',\n          exporterVisibleAsExcel: 'Արտահանել երևացող տվյալները excel',\n          exporterSelectedAsExcel: 'Արտահանել ընտրված տվյալները excel',\n          clearAllFilters: 'Մաքրել բոլոր ֆիլտրերը'\n        },\n        importer: {\n          noHeaders: 'Հնարավոր չեղավ որոշել սյան վերնագրերը։ Արդյո՞ք ֆայլը ունի վերնագրեր։',\n          noObjects: 'Հնարավոր չեղավ կարդալ տվյալները։ Արդյո՞ք ֆայլում կան տվյալներ։',\n          invalidCsv: 'Հնարավոր չեղավ մշակել ֆայլը։ Արդյո՞ք այն վավեր CSV է։',\n          invalidJson: 'Հնարավոր չեղավ մշակել ֆայլը։ Արդյո՞ք այն վավեր Json է։',\n          jsonNotArray: 'Ներմուծված json ֆայլը պետք է պարունակի զանգված, կասեցվում է։'\n        }\n      });\n      return $delegate;\n    }]);\n  }]);\n})();\n\n(function () {\n  angular.module('ui.grid').config(['$provide', function($provide) {\n    $provide.decorator('i18nService', ['$delegate', function($delegate) {\n      $delegate.add('is', {\n        headerCell: {\n          aria: {\n            defaultFilterLabel: 'Sía fyrir dálk',\n            removeFilter: 'Fjarlægja síu',\n            columnMenuButtonLabel: 'Dálkavalmynd'\n          },\n          priority: 'Forgangsröðun:',\n          filterLabel: \"Sía fyrir dálka: \"\n        },\n        aggregate: {\n          label: 'hlutir'\n        },\n        groupPanel: {\n          description: 'Dragðu dálkhaus hingað til að flokka saman eftir þeim dálki.'\n        },\n        search: {\n          placeholder: 'Leita...',\n          showingItems: 'Sýni hluti:',\n          selectedItems: 'Valdir hlutir:',\n          totalItems: 'Hlutir alls:',\n          size: 'Stærð síðu:',\n          first: 'Fyrsta síða',\n          next: 'Næsta síða',\n          previous: 'Fyrri síða',\n          last: 'Síðasta síða'\n        },\n        menu: {\n          text: 'Veldu dálka:'\n        },\n        sort: {\n          ascending: 'Raða hækkandi',\n          descending: 'Raða lækkandi',\n          none: 'Engin röðun',\n          remove: 'Fjarlægja röðun'\n        },\n        column: {\n          hide: 'Fela dálk'\n        },\n        aggregation: {\n          count: 'fjöldi raða: ',\n          sum: 'summa: ',\n          avg: 'meðaltal: ',\n          min: 'lágmark: ',\n          max: 'hámark: '\n        },\n        pinning: {\n          pinLeft: 'Festa til vinstri',\n          pinRight: 'Festa til hægri',\n          unpin: 'Losa'\n        },\n        columnMenu: {\n          close: 'Loka'\n        },\n        gridMenu: {\n          aria: {\n            buttonLabel: 'Töflu valmynd'\n          },\n          columns: 'Dálkar:',\n          importerTitle: 'Flytja inn skjal',\n          exporterAllAsCsv: 'Flytja út gögn sem csv',\n          exporterVisibleAsCsv: 'Flytja út sýnileg gögn sem csv',\n          exporterSelectedAsCsv: 'Flytja út valin gögn sem csv',\n          exporterAllAsPdf: 'Flytja út öll gögn sem pdf',\n          exporterVisibleAsPdf: 'Flytja út sýnileg gögn sem pdf',\n          exporterSelectedAsPdf: 'Flytja út valin gögn sem pdf',\n          clearAllFilters: 'Hreinsa allar síur'\n        },\n        importer: {\n          noHeaders: 'Ekki hægt að vinna dálkanöfn úr skjalinu, er skjalið örugglega með haus?',\n          noObjects: 'Ekki hægt að vinna hluti úr skjalinu, voru örugglega gögn í skjalinu önnur en hausinn?',\n          invalidCsv: 'Tókst ekki að vinna skjal, er það örggulega gilt CSV?',\n          invalidJson: 'Tókst ekki að vinna skjal, er það örugglega gilt Json?',\n          jsonNotArray: 'Innflutt json skjal verður að innihalda fylki, hætti við.'\n        },\n        pagination: {\n          aria: {\n            pageToFirst: 'Fletta að fyrstu',\n            pageBack: 'Fletta til baka',\n            pageSelected: 'Valin síða',\n            pageForward: 'Fletta áfram',\n            pageToLast: 'Fletta að síðustu'\n          },\n          sizes: 'hlutir á síðu',\n          totalItems: 'hlutir',\n          through: 'gegnum',\n          of: 'af'\n        },\n        grouping: {\n          group: 'Flokka',\n          ungroup: 'Sundurliða',\n          aggregate_count: 'Fjöldi: ',\n          aggregate_sum: 'Summa: ',\n          aggregate_max: 'Hámark: ',\n          aggregate_min: 'Lágmark: ',\n          aggregate_avg: 'Meðaltal: ',\n          aggregate_remove: 'Fjarlægja: '\n        },\n        validate: {\n          error: 'Villa:',\n          minLength: 'Gildi ætti að vera a.m.k. THRESHOLD stafa langt.',\n          maxLength: 'Gildi ætti að vera í mesta lagi THRESHOLD stafa langt.',\n          required: 'Þarf að hafa gildi.'\n        }\n      });\n      return $delegate;\n    }]);\n  }]);\n})();\n\n(function () {\n  angular.module('ui.grid').config(['$provide', function($provide) {\n    $provide.decorator('i18nService', ['$delegate', function($delegate) {\n      $delegate.add('it', {\n        aggregate: {\n          label: 'elementi'\n        },\n        groupPanel: {\n          description: 'Trascina un\\'intestazione all\\'interno del gruppo della colonna.'\n        },\n        search: {\n          placeholder: 'Ricerca...',\n          showingItems: 'Mostra:',\n          selectedItems: 'Selezionati:',\n          totalItems: 'Totali:',\n          size: 'Tot Pagine:',\n          first: 'Prima',\n          next: 'Prossima',\n          previous: 'Precedente',\n          last: 'Ultima'\n        },\n        selection: {\n          aria: {\n            row: 'Riga'\n          },\n          selectAll: 'Seleccionar Todo',\n          displayName: 'Seleziona Riga'\n        },\n        menu: {\n          text: 'Scegli le colonne:'\n        },\n        sort: {\n          ascending: 'Asc.',\n          descending: 'Desc.',\n          remove: 'Annulla ordinamento'\n        },\n        column: {\n          hide: 'Nascondi'\n        },\n        aggregation: {\n          count: 'righe totali: ',\n          sum: 'tot: ',\n          avg: 'media: ',\n          min: 'minimo: ',\n          max: 'massimo: '\n        },\n        pinning: {\n         pinLeft: 'Blocca a sx',\n          pinRight: 'Blocca a dx',\n          unpin: 'Blocca in alto'\n        },\n        gridMenu: {\n          columns: 'Colonne:',\n          importerTitle: 'Importa',\n          exporterAllAsCsv: 'Esporta tutti i dati in CSV',\n          exporterVisibleAsCsv: 'Esporta i dati visibili in CSV',\n          exporterSelectedAsCsv: 'Esporta i dati selezionati in CSV',\n          exporterAllAsPdf: 'Esporta tutti i dati in PDF',\n          exporterVisibleAsPdf: 'Esporta i dati visibili in PDF',\n          exporterSelectedAsPdf: 'Esporta i dati selezionati in PDF',\n          exporterAllAsExcel: 'Esporta tutti i dati in excel',\n          exporterVisibleAsExcel: 'Esporta i dati visibili in excel',\n          exporterSelectedAsExcel: 'Esporta i dati selezionati in excel',\n          clearAllFilters: 'Pulire tutti i filtri'\n        },\n        importer: {\n          noHeaders: 'Impossibile reperire i nomi delle colonne, sicuro che siano indicati all\\'interno del file?',\n          noObjects: 'Impossibile reperire gli oggetti, sicuro che siano indicati all\\'interno del file?',\n          invalidCsv: 'Impossibile elaborare il file, sicuro che sia un CSV?',\n          invalidJson: 'Impossibile elaborare il file, sicuro che sia un JSON valido?',\n          jsonNotArray: 'Errore! Il file JSON da importare deve contenere un array.'\n        },\n        pagination: {\n          aria: {\n            pageToFirst: 'Prima',\n            pageBack: 'Indietro',\n            pageSelected: 'Pagina selezionata',\n            pageForward: 'Avanti',\n            pageToLast: 'Ultima'\n          },\n          sizes: 'elementi per pagina',\n          totalItems: 'elementi',\n          through: 'a',\n          of: 'di'\n        },\n        grouping: {\n          group: 'Raggruppa',\n          ungroup: 'Separa',\n          aggregate_count: 'Agg: N. Elem.',\n          aggregate_sum: 'Agg: Somma',\n          aggregate_max: 'Agg: Massimo',\n          aggregate_min: 'Agg: Minimo',\n          aggregate_avg: 'Agg: Media',\n          aggregate_remove: 'Agg: Rimuovi'\n        },\n        validate: {\n          error: 'Errore:',\n          minLength: 'Lunghezza minima pari a THRESHOLD caratteri.',\n          maxLength: 'Lunghezza massima pari a THRESHOLD caratteri.',\n          required: 'Necessario inserire un valore.'\n        }\n      });\n      return $delegate;\n    }]);\n  }]);\n})();\n\n(function() {\n  angular.module('ui.grid').config(['$provide', function($provide) {\n    $provide.decorator('i18nService', ['$delegate', function($delegate) {\n      $delegate.add('ja', {\n        headerCell: {\n          aria: {\n            defaultFilterLabel: '列のフィルター',\n            removeFilter: 'フィルターの解除',\n            columnMenuButtonLabel: '列のメニュー'\n          },\n          priority: '優先度:',\n          filterLabel: \"列フィルター: \"\n        },\n        aggregate: {\n          label: '項目'\n        },\n        groupPanel: {\n          description: 'ここに列ヘッダをドラッグアンドドロップして、その列でグループ化します。'\n        },\n        search: {\n          placeholder: '検索...',\n          showingItems: '表示中の項目:',\n          selectedItems: '選択した項目:',\n          totalItems: '項目の総数:',\n          size: 'ページサイズ:',\n          first: '最初のページ',\n          next: '次のページ',\n          previous: '前のページ',\n          last: '前のページ'\n        },\n        menu: {\n          text: '列の選択:'\n        },\n        sort: {\n          ascending: '昇順に並べ替え',\n          descending: '降順に並べ替え',\n          none: '並べ替え無し',\n          remove: '並べ替えの解除'\n        },\n        column: {\n          hide: '列の非表示'\n        },\n        aggregation: {\n          count: '行数: ',\n          sum: '合計: ',\n          avg: '平均: ',\n          min: '最小: ',\n          max: '最大: '\n        },\n        pinning: {\n          pinLeft: '左に固定',\n          pinRight: '右に固定',\n          unpin: '固定解除'\n        },\n        columnMenu: {\n          close: '閉じる'\n        },\n        gridMenu: {\n          aria: {\n            buttonLabel: 'グリッドメニュー'\n          },\n          columns: '列の表示/非表示:',\n          importerTitle: 'ファイルのインポート',\n          exporterAllAsCsv: 'すべてのデータをCSV形式でエクスポート',\n          exporterVisibleAsCsv: '表示中のデータをCSV形式でエクスポート',\n          exporterSelectedAsCsv: '選択したデータをCSV形式でエクスポート',\n          exporterAllAsPdf: 'すべてのデータをPDF形式でエクスポート',\n          exporterVisibleAsPdf: '表示中のデータをPDF形式でエクスポート',\n          exporterSelectedAsPdf: '選択したデータをPDF形式でエクスポート',\n          clearAllFilters: 'すべてのフィルタをクリア'\n        },\n        importer: {\n          noHeaders: '列名を取得できません。ファイルにヘッダが含まれていることを確認してください。',\n          noObjects: 'オブジェクトを取得できません。ファイルにヘッダ以外のデータが含まれていることを確認してください。',\n          invalidCsv: 'ファイルを処理できません。ファイルが有効なCSV形式であることを確認してください。',\n          invalidJson: 'ファイルを処理できません。ファイルが有効なJSON形式であることを確認してください。',\n          jsonNotArray: 'インポートしたJSONファイルには配列が含まれている必要があります。処理を中止します。'\n        },\n        pagination: {\n          aria: {\n            pageToFirst: '最初のページ',\n            pageBack: '前のページ',\n            pageSelected: '現在のページ',\n            pageForward: '次のページ',\n            pageToLast: '最後のページ'\n          },\n          sizes: '件/ページ',\n          totalItems: '件',\n          through: 'から',\n          of: '件/全'\n        },\n        grouping: {\n          group: 'グループ化',\n          ungroup: 'グループ化の解除',\n          aggregate_count: '集計表示: 行数',\n          aggregate_sum: '集計表示: 合計',\n          aggregate_max: '集計表示: 最大',\n          aggregate_min: '集計表示: 最小',\n          aggregate_avg: '集計表示: 平均',\n          aggregate_remove: '集計表示: 解除'\n        },\n        validate: {\n          error: 'Error:',\n          minLength: 'THRESHOLD 文字以上で入力してください。',\n          maxLength: 'THRESHOLD 文字以下で入力してください。',\n          required: '値が必要です。'\n        }\n      });\n      return $delegate;\n    }]);\n  }]);\n})();\n\n(function () {\n  angular.module('ui.grid').config(['$provide', function($provide) {\n    $provide.decorator('i18nService', ['$delegate', function($delegate) {\n      $delegate.add('ko', {\n        aggregate: {\n          label: '아이템'\n        },\n        groupPanel: {\n          description: '컬럼으로 그룹핑하기 위해서는 컬럼 헤더를 끌어 떨어뜨려 주세요.'\n        },\n        search: {\n          placeholder: '검색...',\n          showingItems: '항목 보여주기:',\n          selectedItems: '선택 항목:',\n          totalItems: '전체 항목:',\n          size: '페이지 크기:',\n          first: '첫번째 페이지',\n          next: '다음 페이지',\n          previous: '이전 페이지',\n          last: '마지막 페이지'\n        },\n        menu: {\n          text: '컬럼을 선택하세요:'\n        },\n        sort: {\n          ascending: '오름차순 정렬',\n          descending: '내림차순 정렬',\n          remove: '소팅 제거'\n        },\n        column: {\n          hide: '컬럼 제거'\n        },\n        aggregation: {\n          count: '전체 갯수: ',\n          sum: '전체: ',\n          avg: '평균: ',\n          min: '최소: ',\n          max: '최대: '\n        },\n        pinning: {\n         pinLeft: '왼쪽 핀',\n          pinRight: '오른쪽 핀',\n          unpin: '핀 제거'\n        },\n        gridMenu: {\n          columns: '컬럼:',\n          importerTitle: '파일 가져오기',\n          exporterAllAsCsv: 'csv로 모든 데이터 내보내기',\n          exporterVisibleAsCsv: 'csv로 보이는 데이터 내보내기',\n          exporterSelectedAsCsv: 'csv로 선택된 데이터 내보내기',\n          exporterAllAsPdf: 'pdf로 모든 데이터 내보내기',\n          exporterVisibleAsPdf: 'pdf로 보이는 데이터 내보내기',\n          exporterSelectedAsPdf: 'pdf로 선택 데이터 내보내기',\n          clearAllFilters: '모든 필터를 청소'\n        },\n        importer: {\n          noHeaders: '컬럼명이 지정되어 있지 않습니다. 파일에 헤더가 명시되어 있는지 확인해 주세요.',\n          noObjects: '데이터가 지정되어 있지 않습니다. 데이터가 파일에 있는지 확인해 주세요.',\n          invalidCsv: '파일을 처리할 수 없습니다. 올바른 csv인지 확인해 주세요.',\n          invalidJson: '파일을 처리할 수 없습니다. 올바른 json인지 확인해 주세요.',\n          jsonNotArray: 'json 파일은 배열을 포함해야 합니다.'\n        },\n        pagination: {\n          sizes: '페이지당 항목',\n          totalItems: '전체 항목'\n        }\n      });\n      return $delegate;\n    }]);\n  }]);\n})();\n\n(function () {\n  angular.module('ui.grid').config(['$provide', function($provide) {\n    $provide.decorator('i18nService', ['$delegate', function($delegate) {\n      $delegate.add('nl', {\n        aggregate: {\n          label: 'items'\n        },\n        groupPanel: {\n          description: 'Sleep hier een kolomnaam heen om op te groeperen.'\n        },\n        search: {\n          placeholder: 'Zoeken...',\n          showingItems: 'Getoonde items:',\n          selectedItems: 'Geselecteerde items:',\n          totalItems: 'Totaal aantal items:',\n          size: 'Items per pagina:',\n          first: 'Eerste pagina',\n          next: 'Volgende pagina',\n          previous: 'Vorige pagina',\n          last: 'Laatste pagina'\n        },\n        menu: {\n          text: 'Kies kolommen:'\n        },\n        sort: {\n          ascending: 'Sorteer oplopend',\n          descending: 'Sorteer aflopend',\n          remove: 'Verwijder sortering'\n        },\n        column: {\n          hide: 'Verberg kolom'\n        },\n        aggregation: {\n          count: 'Aantal rijen: ',\n          sum: 'Som: ',\n          avg: 'Gemiddelde: ',\n          min: 'Min: ',\n          max: 'Max: '\n        },\n        pinning: {\n          pinLeft: 'Zet links vast',\n          pinRight: 'Zet rechts vast',\n          unpin: 'Maak los'\n        },\n        gridMenu: {\n          columns: 'Kolommen:',\n          importerTitle: 'Importeer bestand',\n          exporterAllAsCsv: 'Exporteer alle data als csv',\n          exporterVisibleAsCsv: 'Exporteer zichtbare data als csv',\n          exporterSelectedAsCsv: 'Exporteer geselecteerde data als csv',\n          exporterAllAsPdf: 'Exporteer alle data als pdf',\n          exporterVisibleAsPdf: 'Exporteer zichtbare data als pdf',\n          exporterSelectedAsPdf: 'Exporteer geselecteerde data als pdf',\n          exporterAllAsExcel: 'Exporteer alle data als excel',\n          exporterVisibleAsExcel: 'Exporteer zichtbare data als excel',\n          exporterSelectedAsExcel: 'Exporteer alle data als excel',\n          clearAllFilters: 'Alle filters wissen'\n        },\n        importer: {\n          noHeaders: 'Kolomnamen kunnen niet worden afgeleid. Heeft het bestand een header?',\n          noObjects: 'Objecten kunnen niet worden afgeleid. Bevat het bestand data naast de headers?',\n          invalidCsv: 'Het bestand kan niet verwerkt worden. Is het een valide csv bestand?',\n          invalidJson: 'Het bestand kan niet verwerkt worden. Is het valide json?',\n          jsonNotArray: 'Het json bestand moet een array bevatten. De actie wordt geannuleerd.'\n        },\n        pagination: {\n            sizes: 'items per pagina',\n            totalItems: 'items',\n            of: 'van de'\n        },\n        grouping: {\n            group: 'Groepeer',\n            ungroup: 'Groepering opheffen',\n            aggregate_count: 'Agg: Aantal',\n            aggregate_sum: 'Agg: Som',\n            aggregate_max: 'Agg: Max',\n            aggregate_min: 'Agg: Min',\n            aggregate_avg: 'Agg: Gem',\n            aggregate_remove: 'Agg: Verwijder'\n        }\n      });\n      return $delegate;\n    }]);\n  }]);\n})();\n\n(function () {\n  angular.module('ui.grid').config(['$provide', function($provide) {\n    $provide.decorator('i18nService', ['$delegate', function($delegate) {\n      $delegate.add('no', {\n        headerCell: {\n          aria: {\n            defaultFilterLabel: 'Filter for kolonne',\n            removeFilter: 'Fjern filter',\n            columnMenuButtonLabel: 'Kolonnemeny'\n          },\n          priority: 'Prioritet:',\n          filterLabel: \"Filter for kolonne: \"\n        },\n        aggregate: {\n          label: 'elementer'\n        },\n        groupPanel: {\n          description: 'Trekk en kolonneoverskrift hit og slipp den for å gruppere etter den kolonnen.'\n        },\n        search: {\n          placeholder: 'Søk...',\n          showingItems: 'Viste elementer:',\n          selectedItems: 'Valgte elementer:',\n          totalItems: 'Antall elementer:',\n          size: 'Sidestørrelse:',\n          first: 'Første side',\n          next: 'Neste side',\n          previous: 'Forrige side',\n          last: 'Siste side'\n        },\n        menu: {\n          text: 'Velg kolonner:'\n        },\n        sort: {\n          ascending: 'Sortere stigende',\n          descending: 'Sortere fallende',\n          none: 'Ingen sortering',\n          remove: 'Fjern sortering'\n        },\n        column: {\n          hide: 'Skjul kolonne'\n        },\n        aggregation: {\n          count: 'antall rader: ',\n          sum: 'total: ',\n          avg: 'gjennomsnitt: ',\n          min: 'minimum: ',\n          max: 'maksimum: '\n        },\n        pinning: {\n          pinLeft: 'Fest til venstre',\n          pinRight: 'Fest til høyre',\n          unpin: 'Løsne'\n        },\n        columnMenu: {\n          close: 'Lukk'\n        },\n        gridMenu: {\n          aria: {\n            buttonLabel: 'Grid Menu'\n          },\n          columns: 'Kolonner:',\n          importerTitle: 'Importer fil',\n          exporterAllAsCsv: 'Eksporter alle data som csv',\n          exporterVisibleAsCsv: 'Eksporter synlige data som csv',\n          exporterSelectedAsCsv: 'Eksporter utvalgte data som csv',\n          exporterAllAsPdf: 'Eksporter alle data som pdf',\n          exporterVisibleAsPdf: 'Eksporter synlige data som pdf',\n          exporterSelectedAsPdf: 'Eksporter utvalgte data som pdf',\n          exporterAllAsExcel: 'Eksporter alle data som excel',\n          exporterVisibleAsExcel: 'Eksporter synlige data som excel',\n          exporterSelectedAsExcel: 'Eksporter utvalgte data som excel',\n          clearAllFilters: 'Clear all filters'\n        },\n        importer: {\n          noHeaders: 'Kolonnenavn kunne ikke avledes. Har filen en overskrift?',\n          noObjects: 'Objekter kunne ikke avledes. Er der andre data i filen enn overskriften?',\n          invalidCsv: 'Filen kunne ikke behandles. Er den gyldig CSV?',\n          invalidJson: 'Filen kunne ikke behandles. Er den gyldig JSON?',\n          jsonNotArray: 'Importert JSON-fil må inneholde en liste. Avbryter.'\n        },\n        pagination: {\n          aria: {\n            pageToFirst: 'Gå til første side',\n            pageBack: 'Gå til forrige side',\n            pageSelected: 'Valgte side',\n            pageForward: 'Gå til neste side',\n            pageToLast: 'Gå til siste side'\n          },\n          sizes: 'elementer per side',\n          totalItems: 'elementer',\n          through: 'til',\n          of: 'av'\n        },\n        grouping: {\n          group: 'Gruppere',\n          ungroup: 'Fjerne gruppering',\n          aggregate_count: 'Agr: Antall',\n          aggregate_sum: 'Agr: Sum',\n          aggregate_max: 'Agr: Maksimum',\n          aggregate_min: 'Agr: Minimum',\n          aggregate_avg: 'Agr: Gjennomsnitt',\n          aggregate_remove: 'Agr: Fjern'\n        }\n      });\n      return $delegate;\n    }]);\n  }]);\n})();\n\n(function () {\n  angular.module('ui.grid').config(['$provide', function($provide) {\n    $provide.decorator('i18nService', ['$delegate', function($delegate) {\n      $delegate.add('pl', {\n        headerCell: {\n          aria: {\n            defaultFilterLabel: 'Filtr dla kolumny',\n            removeFilter: 'Usuń filtr',\n            columnMenuButtonLabel: 'Opcje kolumny',\n            column: 'Kolumna'\n          },\n          priority: 'Priorytet:',\n          filterLabel: \"Filtr dla kolumny: \"\n        },\n        aggregate: {\n          label: 'pozycji'\n        },\n        groupPanel: {\n          description: 'Przeciągnij nagłówek kolumny tutaj, aby pogrupować według niej.'\n        },\n        search: {\n          aria: {\n            selected: 'Wiersz zaznaczony',\n            notSelected: 'Wiersz niezaznaczony'\n          },\n          placeholder: 'Szukaj...',\n          showingItems: 'Widoczne pozycje:',\n          selectedItems: 'Zaznaczone pozycje:',\n          totalItems: 'Wszystkich pozycji:',\n          size: 'Rozmiar strony:',\n          first: 'Pierwsza strona',\n          next: 'Następna strona',\n          previous: 'Poprzednia strona',\n          last: 'Ostatnia strona'\n        },\n        menu: {\n          text: 'Wybierz kolumny:'\n        },\n        sort: {\n          ascending: 'Sortuj rosnąco',\n          descending: 'Sortuj malejąco',\n          none: 'Brak sortowania',\n          remove: 'Wyłącz sortowanie'\n        },\n        column: {\n          hide: 'Ukryj kolumnę'\n        },\n        aggregation: {\n          count: 'Razem pozycji: ',\n            sum: 'Razem: ',\n            avg: 'Średnia: ',\n            min: 'Min: ',\n            max: 'Max: '\n        },\n        pinning: {\n          pinLeft: 'Przypnij do lewej',\n          pinRight: 'Przypnij do prawej',\n          unpin: 'Odepnij'\n        },\n        columnMenu: {\n          close: 'Zamknij'\n        },\n        gridMenu: {\n          aria: {\n            buttonLabel: 'Opcje tabeli'\n          },\n          columns: 'Kolumny:',\n          importerTitle: 'Importuj plik',\n          exporterAllAsCsv: 'Eksportuj wszystkie dane do csv',\n          exporterVisibleAsCsv: 'Eksportuj widoczne dane do csv',\n          exporterSelectedAsCsv: 'Eksportuj zaznaczone dane do csv',\n          exporterAllAsPdf: 'Eksportuj wszystkie dane do pdf',\n          exporterVisibleAsPdf: 'Eksportuj widoczne dane do pdf',\n          exporterSelectedAsPdf: 'Eksportuj zaznaczone dane do pdf',\n          exporterAllAsExcel: 'Eksportuj wszystkie dane do excel',\n          exporterVisibleAsExcel: 'Eksportuj widoczne dane do excel',\n          exporterSelectedAsExcel: 'Eksportuj zaznaczone dane do excel',\n          clearAllFilters: 'Wyczyść filtry'\n        },\n        importer: {\n          noHeaders: 'Nie udało się wczytać nazw kolumn. Czy plik posiada nagłówek?',\n          noObjects: 'Nie udalo się wczytać pozycji. Czy plik zawiera dane?',\n          invalidCsv: 'Nie udało się przetworzyć pliku. Czy to prawidłowy plik CSV?',\n          invalidJson: 'Nie udało się przetworzyć pliku. Czy to prawidłowy plik JSON?',\n          jsonNotArray: 'Importowany plik JSON musi zawierać tablicę. Importowanie przerwane.'\n        },\n        pagination: {\n          aria: {\n            pageToFirst: 'Pierwsza strona',\n            pageBack: 'Poprzednia strona',\n            pageSelected: 'Wybrana strona',\n            pageForward: 'Następna strona',\n            pageToLast: 'Ostatnia strona'\n          },\n          sizes: 'pozycji na stronę',\n          totalItems: 'pozycji',\n          through: 'do',\n          of: 'z'\n        },\n        grouping: {\n          group: 'Grupuj',\n          ungroup: 'Rozgrupuj',\n          aggregate_count: 'Zbiorczo: Razem',\n          aggregate_sum: 'Zbiorczo: Suma',\n          aggregate_max: 'Zbiorczo: Max',\n          aggregate_min: 'Zbiorczo: Min',\n          aggregate_avg: 'Zbiorczo: Średnia',\n          aggregate_remove: 'Zbiorczo: Usuń'\n        },\n        validate: {\n          error: 'Błąd:',\n          minLength: 'Wartość powinna składać się z co najmniej THRESHOLD znaków.',\n          maxLength: 'Wartość powinna składać się z przynajmniej THRESHOLD znaków.',\n          required: 'Wartość jest wymagana.'\n        }\n      });\n      return $delegate;\n    }]);\n  }]);\n})();\n\n(function () {\n  angular.module('ui.grid').config(['$provide', function($provide) {\n    $provide.decorator('i18nService', ['$delegate', function($delegate) {\n      $delegate.add('pt-br', {\n        headerCell: {\n          aria: {\n            defaultFilterLabel: 'Filtro por coluna',\n            removeFilter: 'Remover filtro',\n            columnMenuButtonLabel: 'Menu coluna',\n            column: 'Coluna'\n          },\n          priority: 'Prioridade:',\n          filterLabel: \"Filtro por coluna: \"\n        },\n        aggregate: {\n          label: 'itens'\n        },\n        groupPanel: {\n          description: 'Arraste e solte uma coluna aqui para agrupar por essa coluna'\n        },\n        search: {\n          aria: {\n            selected: 'Linha selecionada',\n            notSelected: 'Linha não está selecionada'\n          },\n          placeholder: 'Procurar...',\n          showingItems: 'Mostrando os Itens:',\n          selectedItems: 'Items Selecionados:',\n          totalItems: 'Total de Itens:',\n          size: 'Tamanho da Página:',\n          first: 'Primeira Página',\n          next: 'Próxima Página',\n          previous: 'Página Anterior',\n          last: 'Última Página'\n        },\n        selection: {\n          aria: {\n            row: 'Linha'\n          },\n          selectAll: 'Selecionar Tudo',\n          displayName: 'Caixa de Seleção da Linha'\n        },\n        menu: {\n          text: 'Selecione as colunas:'\n        },\n        sort: {\n          ascending: 'Ordenar Ascendente',\n          descending: 'Ordenar Descendente',\n          none: 'Nenhuma Ordem',\n          remove: 'Remover Ordenação'\n        },\n        column: {\n          hide: 'Esconder coluna'\n        },\n        aggregation: {\n          count: 'total de linhas: ',\n          sum: 'total: ',\n          avg: 'med: ',\n          min: 'min: ',\n          max: 'max: '\n        },\n        pinning: {\n          pinLeft: 'Fixar Esquerda',\n          pinRight: 'Fixar Direita',\n          unpin: 'Desprender'\n        },\n        columnMenu: {\n          close: 'Fechar'\n        },\n        gridMenu: {\n          aria: {\n            buttonLabel: 'Menu Grid'\n          },\n          columns: 'Colunas:',\n          importerTitle: 'Importar arquivo',\n          exporterAllAsCsv: 'Exportar todos os dados como csv',\n          exporterVisibleAsCsv: 'Exportar dados visíveis como csv',\n          exporterSelectedAsCsv: 'Exportar dados selecionados como csv',\n          exporterAllAsPdf: 'Exportar todos os dados como pdf',\n          exporterVisibleAsPdf: 'Exportar dados visíveis como pdf',\n          exporterSelectedAsPdf: 'Exportar dados selecionados como pdf',\n          exporterAllAsExcel: 'Exportar todos os dados como excel',\n          exporterVisibleAsExcel: 'Exportar dados visíveis como excel',\n          exporterSelectedAsExcel: 'Exportar dados selecionados como excel',\n          clearAllFilters: 'Limpar todos os filtros'\n        },\n        importer: {\n          noHeaders: 'Nomes de colunas não puderam ser derivados. O arquivo tem um cabeçalho?',\n          noObjects: 'Objetos não puderam ser derivados. Havia dados no arquivo, além dos cabeçalhos?',\n          invalidCsv: 'Arquivo não pode ser processado. É um CSV válido?',\n          invalidJson: 'Arquivo não pode ser processado. É um Json válido?',\n          jsonNotArray: 'Arquivo json importado tem que conter um array. Abortando.'\n        },\n        pagination: {\n          aria: {\n            pageToFirst: 'Primeira página',\n            pageBack: 'Página anterior',\n            pageSelected: 'Página Selecionada',\n            pageForward: 'Proxima',\n            pageToLast: 'Anterior'\n          },\n          sizes: 'itens por página',\n          totalItems: 'itens',\n          through: 'através dos',\n          of: 'de'\n        },\n        grouping: {\n          group: 'Agrupar',\n          ungroup: 'Desagrupar',\n          aggregate_count: 'Agr: Contar',\n          aggregate_sum: 'Agr: Soma',\n          aggregate_max: 'Agr: Max',\n          aggregate_min: 'Agr: Min',\n          aggregate_avg: 'Agr: Med',\n          aggregate_remove: 'Agr: Remover'\n        },\n        validate: {\n          error: 'Erro:',\n          minLength: 'O valor deve ter, no minimo, THRESHOLD caracteres.',\n          maxLength: 'O valor deve ter, no máximo, THRESHOLD caracteres.',\n          required: 'Um valor é necessário.'\n        }\n      });\n      return $delegate;\n    }]);\n}]);\n})();\n\n(function () {\n  angular.module('ui.grid').config(['$provide', function($provide) {\n    $provide.decorator('i18nService', ['$delegate', function($delegate) {\n      $delegate.add('pt', {\n        headerCell: {\n          aria: {\n            defaultFilterLabel: 'Filtro por coluna',\n            removeFilter: 'Remover filtro',\n            columnMenuButtonLabel: 'Menu coluna',\n            column: 'Coluna'\n          },\n          priority: 'Prioridade:',\n          filterLabel: \"Filtro por coluna: \"\n        },\n        aggregate: {\n          label: 'itens'\n        },\n        groupPanel: {\n          description: 'Arraste e solte uma coluna aqui para agrupar por essa coluna'\n        },\n        search: {\n          aria: {\n            selected: 'Linha selecionada',\n            notSelected: 'Linha não está selecionada'\n          },\n          placeholder: 'Procurar...',\n          showingItems: 'Mostrando os Itens:',\n          selectedItems: 'Itens Selecionados:',\n          totalItems: 'Total de Itens:',\n          size: 'Tamanho da Página:',\n          first: 'Primeira Página',\n          next: 'Próxima Página',\n          previous: 'Página Anterior',\n          last: 'Última Página'\n        },\n        selection: {\n          aria: {\n            row: 'Linha'\n          },\n          selectAll: 'Selecionar Tudo',\n          displayName: 'Caixa de Seleção da Linha'\n        },\n        menu: {\n          text: 'Selecione as colunas:'\n        },\n        sort: {\n          ascending: 'Ordenar Ascendente',\n          descending: 'Ordenar Descendente',\n          none: 'Nenhuma Ordem',\n          remove: 'Remover Ordenação'\n        },\n        column: {\n          hide: 'Esconder coluna'\n        },\n        aggregation: {\n          count: 'total de linhas: ',\n          sum: 'total: ',\n          avg: 'med: ',\n          min: 'min: ',\n          max: 'max: '\n        },\n        pinning: {\n          pinLeft: 'Fixar Esquerda',\n          pinRight: 'Fixar Direita',\n          unpin: 'Desprender'\n        },\n        columnMenu: {\n          close: 'Fechar'\n        },\n        gridMenu: {\n          aria: {\n            buttonLabel: 'Menu Grid'\n          },\n          columns: 'Colunas:',\n          importerTitle: 'Importar ficheiro',\n          exporterAllAsCsv: 'Exportar todos os dados como csv',\n          exporterVisibleAsCsv: 'Exportar dados visíveis como csv',\n          exporterSelectedAsCsv: 'Exportar dados selecionados como csv',\n          exporterAllAsPdf: 'Exportar todos os dados como pdf',\n          exporterVisibleAsPdf: 'Exportar dados visíveis como pdf',\n          exporterSelectedAsPdf: 'Exportar dados selecionados como pdf',\n          exporterAllAsExcel: 'Exportar todos os dados como excel',\n          exporterVisibleAsExcel: 'Exportar dados visíveis como excel',\n          exporterSelectedAsExcel: 'Exportar dados selecionados como excel',\n          clearAllFilters: 'Limpar todos os filtros'\n        },\n        importer: {\n          noHeaders: 'Nomes de colunas não puderam ser derivados. O ficheiro tem um cabeçalho?',\n          noObjects: 'Objetos não puderam ser derivados. Havia dados no ficheiro, além dos cabeçalhos?',\n          invalidCsv: 'Ficheiro não pode ser processado. É um CSV válido?',\n          invalidJson: 'Ficheiro não pode ser processado. É um Json válido?',\n          jsonNotArray: 'Ficheiro json importado tem que conter um array. Interrompendo.'\n        },\n        pagination: {\n          aria: {\n            pageToFirst: 'Primeira página',\n            pageBack: 'Página anterior',\n            pageSelected: 'Página Selecionada',\n            pageForward: 'Próxima',\n            pageToLast: 'Anterior'\n          },\n          sizes: 'itens por página',\n          totalItems: 'itens',\n          through: 'a',\n          of: 'de'\n        },\n        grouping: {\n          group: 'Agrupar',\n          ungroup: 'Desagrupar',\n          aggregate_count: 'Agr: Contar',\n          aggregate_sum: 'Agr: Soma',\n          aggregate_max: 'Agr: Max',\n          aggregate_min: 'Agr: Min',\n          aggregate_avg: 'Agr: Med',\n          aggregate_remove: 'Agr: Remover'\n        },\n        validate: {\n          error: 'Erro:',\n          minLength: 'O valor deve ter, no minimo, THRESHOLD caracteres.',\n          maxLength: 'O valor deve ter, no máximo, THRESHOLD caracteres.',\n          required: 'Um valor é necessário.'\n        }\n      });\n      return $delegate;\n    }]);\n}]);\n})();\n\n(function () {\n  angular.module('ui.grid').config(['$provide', function($provide) {\n    $provide.decorator('i18nService', ['$delegate', function($delegate) {\n      $delegate.add('ro', {\n        headerCell: {\n          aria: {\n            defaultFilterLabel: 'Filtru pentru coloana',\n            removeFilter: 'Sterge filtru',\n            columnMenuButtonLabel: 'Column Menu'\n          },\n          priority: 'Prioritate:',\n          filterLabel: \"Filtru pentru coloana:\"\n        },\n        aggregate: {\n          label: 'Elemente'\n        },\n        groupPanel: {\n          description: 'Trage un cap de coloana aici pentru a grupa elementele dupa coloana respectiva'\n        },\n        search: {\n          placeholder: 'Cauta...',\n          showingItems: 'Arata elementele:',\n          selectedItems: 'Elementele selectate:',\n          totalItems: 'Total elemente:',\n          size: 'Marime pagina:',\n          first: 'Prima pagina',\n          next: 'Pagina urmatoare',\n          previous: 'Pagina anterioara',\n          last: 'Ultima pagina'\n        },\n        menu: {\n          text: 'Alege coloane:'\n        },\n        sort: {\n          ascending: 'Ordoneaza crescator',\n          descending: 'Ordoneaza descrescator',\n          none: 'Fara ordonare',\n          remove: 'Sterge ordonarea'\n        },\n        column: {\n          hide: 'Ascunde coloana'\n        },\n        aggregation: {\n          count: 'total linii: ',\n          sum: 'total: ',\n          avg: 'medie: ',\n          min: 'min: ',\n          max: 'max: '\n        },\n        pinning: {\n          pinLeft: 'Pin la stanga',\n          pinRight: 'Pin la dreapta',\n          unpin: 'Sterge pinul'\n        },\n        columnMenu: {\n          close: 'Inchide'\n        },\n        gridMenu: {\n          aria: {\n            buttonLabel: 'Grid Menu'\n          },\n          columns: 'Coloane:',\n          importerTitle: 'Incarca fisier',\n          exporterAllAsCsv: 'Exporta toate datele ca csv',\n          exporterVisibleAsCsv: 'Exporta datele vizibile ca csv',\n          exporterSelectedAsCsv: 'Exporta datele selectate ca csv',\n          exporterAllAsPdf: 'Exporta toate datele ca pdf',\n          exporterVisibleAsPdf: 'Exporta datele vizibile ca pdf',\n          exporterSelectedAsPdf: 'Exporta datele selectate ca csv pdf',\n          clearAllFilters: 'Sterge toate filtrele'\n        },\n        importer: {\n          noHeaders: 'Numele coloanelor nu a putut fi incarcat, acest fisier are un header?',\n          noObjects: 'Datele nu au putut fi incarcate, exista date in fisier in afara numelor de coloane?',\n          invalidCsv: 'Fisierul nu a putut fi procesat, ati incarcat un CSV valid ?',\n          invalidJson: 'Fisierul nu a putut fi procesat, ati incarcat un Json valid?',\n          jsonNotArray: 'Json-ul incarcat trebuie sa contina un array, inchidere.'\n        },\n        pagination: {\n          aria: {\n            pageToFirst: 'Prima pagina',\n            pageBack: 'O pagina inapoi',\n            pageSelected: 'Pagina selectata',\n            pageForward: 'O pagina inainte',\n            pageToLast: 'Ultima pagina'\n          },\n          sizes: 'Elemente per pagina',\n          totalItems: 'elemente',\n          through: 'prin',\n          of: 'of'\n        },\n        grouping: {\n          group: 'Grupeaza',\n          ungroup: 'Opreste gruparea',\n          aggregate_count: 'Agg: Count',\n          aggregate_sum: 'Agg: Sum',\n          aggregate_max: 'Agg: Max',\n          aggregate_min: 'Agg: Min',\n          aggregate_avg: 'Agg: Avg',\n          aggregate_remove: 'Agg: Remove'\n        }\n      });\n      return $delegate;\n    }]);\n  }]);\n})();\n\n(function() {\n\tangular.module('ui.grid').config(['$provide', function($provide) {\n\t\t$provide.decorator('i18nService', ['$delegate', function($delegate) {\n\t\t\t$delegate.add('rs-lat', {\n\t\t\t\theaderCell: {\n\t\t\t\t\taria: {\n\t\t\t\t\t\tdefaultFilterLabel: 'Filter za kolonu',\n\t\t\t\t\t\tremoveFilter: 'Ukloni Filter',\n\t\t\t\t\t\tcolumnMenuButtonLabel: 'Meni Kolone',\n\t\t\t\t\t\tcolumn: 'Kolona'\n\t\t\t\t\t},\n\t\t\t\t\tpriority: 'Prioritet:',\n\t\t\t\t\tfilterLabel: \"Filter za kolonu: \"\n\t\t\t\t},\n\t\t\t\taggregate: {\n\t\t\t\t\tlabel: 'stavke'\n\t\t\t\t},\n\t\t\t\tgroupPanel: {\n\t\t\t\t\tdescription: 'Ovde prevuci zaglavlje kolone i spusti do grupe pored te kolone.'\n\t\t\t\t},\n\t\t\t\tsearch: {\n\t\t\t\t\taria: {\n\t\t\t\t\t\tselected: 'Red odabran',\n\t\t\t\t\t\tnotSelected: 'Red nije odabran'\n\t\t\t\t\t},\n\t\t\t\t\tplaceholder: 'Pretraga...',\n\t\t\t\t\tshowingItems: 'Prikazane Stavke:',\n\t\t\t\t\tselectedItems: 'Odabrane Stavke:',\n\t\t\t\t\ttotalItems: 'Ukupno Stavki:',\n\t\t\t\t\tsize: 'Veličina Stranice:',\n\t\t\t\t\tfirst: 'Prva Stranica',\n\t\t\t\t\tnext: 'Sledeća Stranica',\n\t\t\t\t\tprevious: 'Prethodna Stranica',\n\t\t\t\t\tlast: 'Poslednja Stranica'\n\t\t\t\t},\n\t\t\t\tmenu: {\n\t\t\t\t\ttext: 'Odaberite kolonu:'\n\t\t\t\t},\n\t\t\t\tsort: {\n\t\t\t\t\tascending: 'Sortiraj po rastućem redosledu',\n\t\t\t\t\tdescending: 'Sortiraj po opadajućem redosledu',\n\t\t\t\t\tnone: 'Bez Sortiranja',\n\t\t\t\t\tremove: 'Ukloni Sortiranje'\n\t\t\t\t},\n\t\t\t\tcolumn: {\n\t\t\t\t\thide: 'Sakrij Kolonu'\n\t\t\t\t},\n\t\t\t\taggregation: {\n\t\t\t\t\tcount: 'ukupno redova: ',\n\t\t\t\t\tsum: 'ukupno: ',\n\t\t\t\t\tavg: 'prosecno: ',\n\t\t\t\t\tmin: 'minimum: ',\n\t\t\t\t\tmax: 'maksimum: '\n\t\t\t\t},\n\t\t\t\tpinning: {\n\t\t\t\t\tpinLeft: 'Zakači Levo',\n\t\t\t\t\tpinRight: 'Zakači Desno',\n\t\t\t\t\tunpin: 'Otkači'\n\t\t\t\t},\n\t\t\t\tcolumnMenu: {\n\t\t\t\t\tclose: 'Zatvori'\n\t\t\t\t},\n\t\t\t\tgridMenu: {\n\t\t\t\t\taria: {\n\t\t\t\t\t\tbuttonLabel: 'Rešetkasti Meni'\n\t\t\t\t\t},\n\t\t\t\t\tcolumns: 'Kolone:',\n\t\t\t\t\timporterTitle: 'Importuj fajl',\n\t\t\t\t\texporterAllAsCsv: 'Eksportuj sve podatke kao csv',\n\t\t\t\t\texporterVisibleAsCsv: 'Eksportuj vidljive podatke kao csv',\n\t\t\t\t\texporterSelectedAsCsv: 'Eksportuj obeležene podatke kao csv',\n\t\t\t\t\texporterAllAsPdf: 'Eksportuj sve podatke kao pdf',\n\t\t\t\t\texporterVisibleAsPdf: 'Eksportuj vidljive podake kao pdf',\n\t\t\t\t\texporterSelectedAsPdf: 'Eksportuj odabrane podatke kao pdf',\n\t\t\t\t\texporterAllAsExcel: 'Eksportuj sve podatke kao excel',\n\t\t\t\t\texporterVisibleAsExcel: 'Eksportuj vidljive podatke kao excel',\n\t\t\t\t\texporterSelectedAsExcel: 'Eksportuj odabrane podatke kao excel',\n\t\t\t\t\tclearAllFilters: 'Obriši sve filtere'\n\t\t\t\t},\n\t\t\t\timporter: {\n\t\t\t\t\tnoHeaders: 'Kolone se nisu mogle podeliti, da li fajl poseduje heder?',\n\t\t\t\t\tnoObjects: 'Objecti nisu mogli biti podeljeni, da li je bilo i drugih podataka sem hedera?',\n\t\t\t\t\tinvalidCsv: 'Fajl nije bilo moguće procesirati, da li je ispravni CSV?',\n\t\t\t\t\tinvalidJson: 'Fajl nije bilo moguće procesirati, da li je ispravni JSON',\n\t\t\t\t\tjsonNotArray: 'Importovani json fajl mora da sadrži niz, prekidam operaciju.'\n\t\t\t\t},\n\t\t\t\tpagination: {\n\t\t\t\t\taria: {\n\t\t\t\t\t\tpageToFirst: 'Prva stranica',\n\t\t\t\t\t\tpageBack: 'Stranica pre',\n\t\t\t\t\t\tpageSelected: 'Odabrana stranica',\n\t\t\t\t\t\tpageForward: 'Sledeća stranica',\n\t\t\t\t\t\tpageToLast: 'Poslednja stranica'\n\t\t\t\t\t},\n\t\t\t\t\tsizes: 'stavki po stranici',\n\t\t\t\t\ttotalItems: 'stavke',\n\t\t\t\t\tthrough: 'kroz',\n\t\t\t\t\tof: 'od'\n\t\t\t\t},\n\t\t\t\tgrouping: {\n\t\t\t\t\tgroup: 'Grupiši',\n\t\t\t\t\tungroup: 'Odrupiši',\n\t\t\t\t\taggregate_count: 'Agg: Broj',\n\t\t\t\t\taggregate_sum: 'Agg: Suma',\n\t\t\t\t\taggregate_max: 'Agg: Maksimum',\n\t\t\t\t\taggregate_min: 'Agg: Minimum',\n\t\t\t\t\taggregate_avg: 'Agg: Prosečna',\n\t\t\t\t\taggregate_remove: 'Agg: Ukloni'\n\t\t\t\t},\n\t\t\t\tvalidate: {\n\t\t\t\t\terror: 'Greška:',\n\t\t\t\t\tminLength: 'Vrednost bi trebala da bude duga bar THRESHOLD karaktera.',\n\t\t\t\t\tmaxLength: 'Vrednost bi trebalo da bude najviše duga THRESHOLD karaktera.',\n\t\t\t\t\trequired: 'Portreba je vrednost.'\n\t\t\t\t}\n\t\t\t});\n\t\t\treturn $delegate;\n\t\t}]);\n\t}]);\n})();\n\n(function () {\n  angular.module('ui.grid').config(['$provide', function($provide) {\n    $provide.decorator('i18nService', ['$delegate', function($delegate) {\n      $delegate.add('ru', {\n        headerCell: {\n          aria: {\n            defaultFilterLabel: 'Фильтр столбца',\n            removeFilter: 'Удалить фильтр',\n            columnMenuButtonLabel: 'Меню столбца'\n          },\n          priority: 'Приоритет:',\n          filterLabel: \"Фильтр столбца: \"\n        },\n        aggregate: {\n          label: 'элементы'\n        },\n        groupPanel: {\n          description: 'Для группировки по столбцу перетащите сюда его название.'\n        },\n        search: {\n          placeholder: 'Поиск...',\n          showingItems: 'Показать элементы:',\n          selectedItems: 'Выбранные элементы:',\n          totalItems: 'Всего элементов:',\n          size: 'Размер страницы:',\n          first: 'Первая страница',\n          next: 'Следующая страница',\n          previous: 'Предыдущая страница',\n          last: 'Последняя страница'\n        },\n        menu: {\n          text: 'Выбрать столбцы:'\n        },\n        sort: {\n          ascending: 'По возрастанию',\n          descending: 'По убыванию',\n          none: 'Без сортировки',\n          remove: 'Убрать сортировку'\n        },\n        column: {\n          hide: 'Спрятать столбец'\n        },\n        aggregation: {\n          count: 'всего строк: ',\n          sum: 'итого: ',\n          avg: 'среднее: ',\n          min: 'мин: ',\n          max: 'макс: '\n        },\n\t\t\t\tpinning: {\n\t\t\t\t\tpinLeft: 'Закрепить слева',\n\t\t\t\t\tpinRight: 'Закрепить справа',\n\t\t\t\t\tunpin: 'Открепить'\n\t\t\t\t},\n        columnMenu: {\n          close: 'Закрыть'\n        },\n        gridMenu: {\n          aria: {\n            buttonLabel: 'Меню'\n          },\n          columns: 'Столбцы:',\n          importerTitle: 'Импортировать файл',\n          exporterAllAsCsv: 'Экспортировать всё в CSV',\n          exporterVisibleAsCsv: 'Экспортировать видимые данные в CSV',\n          exporterSelectedAsCsv: 'Экспортировать выбранные данные в CSV',\n          exporterAllAsPdf: 'Экспортировать всё в PDF',\n          exporterVisibleAsPdf: 'Экспортировать видимые данные в PDF',\n          exporterSelectedAsPdf: 'Экспортировать выбранные данные в PDF',\n          exporterAllAsExcel: 'Экспортировать всё в Excel',\n          exporterVisibleAsExcel: 'Экспортировать видимые данные в Excel',\n          exporterSelectedAsExcel: 'Экспортировать выбранные данные в Excel',\n          clearAllFilters: 'Очистить все фильтры'\n        },\n        importer: {\n          noHeaders: 'Не удалось получить названия столбцов, есть ли в файле заголовок?',\n          noObjects: 'Не удалось получить данные, есть ли в файле строки кроме заголовка?',\n          invalidCsv: 'Не удалось обработать файл, это правильный CSV-файл?',\n          invalidJson: 'Не удалось обработать файл, это правильный JSON?',\n          jsonNotArray: 'Импортируемый JSON-файл должен содержать массив, операция отменена.'\n        },\n        pagination: {\n          aria: {\n            pageToFirst: 'Первая страница',\n            pageBack: 'Предыдущая страница',\n            pageSelected: 'Выбранная страница',\n            pageForward: 'Следующая страница',\n            pageToLast: 'Последняя страница'\n          },\n          sizes: 'строк на страницу',\n          totalItems: 'строк',\n          through: 'по',\n          of: 'из'\n        },\n        grouping: {\n          group: 'Группировать',\n          ungroup: 'Разгруппировать',\n          aggregate_count: 'Группировать: Количество',\n          aggregate_sum: 'Для группы: Сумма',\n          aggregate_max: 'Для группы: Максимум',\n          aggregate_min: 'Для группы: Минимум',\n          aggregate_avg: 'Для группы: Среднее',\n          aggregate_remove: 'Для группы: Пусто'\n        }\n      });\n      return $delegate;\n    }]);\n  }]);\n})();\n\n(function() {\n\tangular.module('ui.grid').config(['$provide', function($provide) {\n\t\t$provide.decorator('i18nService', ['$delegate', function($delegate) {\n\t\t\t$delegate.add('sk', {\n\t\t\t\theaderCell: {\n\t\t\t\t\taria: {\n\t\t\t\t\t\tdefaultFilterLabel: 'Filter pre stĺpec',\n\t\t\t\t\t\tremoveFilter: 'Odstrániť filter',\n\t\t\t\t\t\tcolumnMenuButtonLabel: 'Menu pre stĺpec',\n\t\t\t\t\t\tcolumn: 'Stĺpec'\n\t\t\t\t\t},\n\t\t\t\t\tpriority: 'Priorita:',\n\t\t\t\t\tfilterLabel: \"Filter pre stĺpec: \"\n\t\t\t\t},\n\t\t\t\taggregate: {\n\t\t\t\t\tlabel: 'položky'\n\t\t\t\t},\n\t\t\t\tgroupPanel: {\n\t\t\t\t\tdescription: 'Pretiahni sem názov stĺpca pre zoskupenie podľa toho stĺpca.'\n\t\t\t\t},\n\t\t\t\tsearch: {\n\t\t\t\t\taria: {\n\t\t\t\t\t\tselected: 'Označený riadok',\n\t\t\t\t\t\tnotSelected: 'Neoznačený riadok'\n\t\t\t\t\t},\n\t\t\t\t\tplaceholder: 'Hľadaj...',\n\t\t\t\t\tshowingItems: 'Zobrazujem položky:',\n\t\t\t\t\tselectedItems: 'Vybraté položky:',\n\t\t\t\t\ttotalItems: 'Počet položiek:',\n\t\t\t\t\tsize: 'Počet:',\n\t\t\t\t\tfirst: 'Prvá strana',\n\t\t\t\t\tnext: 'Ďalšia strana',\n\t\t\t\t\tprevious: 'Predchádzajúca strana',\n\t\t\t\t\tlast: 'Posledná strana'\n\t\t\t\t},\n\t\t\t\tmenu: {\n\t\t\t\t\ttext: 'Vyberte stĺpce:'\n\t\t\t\t},\n\t\t\t\tsort: {\n\t\t\t\t\tascending: 'Zotriediť vzostupne',\n\t\t\t\t\tdescending: 'Zotriediť zostupne',\n\t\t\t\t\tnone: 'Nezotriediť',\n\t\t\t\t\tremove: 'Vymazať triedenie'\n\t\t\t\t},\n\t\t\t\tcolumn: {\n\t\t\t\t\thide: 'Skryť stĺpec'\n\t\t\t\t},\n\t\t\t\taggregation: {\n\t\t\t\t\tcount: 'počet riadkov: ',\n\t\t\t\t\tsum: 'spolu: ',\n\t\t\t\t\tavg: 'avg: ',\n\t\t\t\t\tmin: 'min: ',\n\t\t\t\t\tmax: 'max: '\n\t\t\t\t},\n\t\t\t\tpinning: {\n\t\t\t\t\tpinLeft: 'Pripnúť vľavo',\n\t\t\t\t\tpinRight: 'Pripnúť vpravo',\n\t\t\t\t\tunpin: 'Odopnúť'\n\t\t\t\t},\n\t\t\t\tcolumnMenu: {\n\t\t\t\t\tclose: 'Zavrieť'\n\t\t\t\t},\n\t\t\t\tgridMenu: {\n\t\t\t\t\taria: {\n\t\t\t\t\t\tbuttonLabel: 'Grid Menu'\n\t\t\t\t\t},\n\t\t\t\t\tcolumns: 'Stĺpce:',\n\t\t\t\t\timporterTitle: 'Importovať súbor',\n\t\t\t\t\texporterAllAsCsv: 'Exportovať všetky údaje ako CSV',\n\t\t\t\t\texporterVisibleAsCsv: 'Exportovť viditeľné údaje ako CSV',\n\t\t\t\t\texporterSelectedAsCsv: 'Exportovať označené údaje ako CSV',\n\t\t\t\t\texporterAllAsPdf: 'Exportovať všetky údaje ako pdf',\n\t\t\t\t\texporterVisibleAsPdf: 'Exportovať viditeľné údaje ako pdf',\n\t\t\t\t\texporterSelectedAsPdf: 'Exportovať označené údaje ako pdf',\n\t\t\t\t\texporterAllAsExcel: 'Exportovať všetky údaje ako excel',\n\t\t\t\t\texporterVisibleAsExcel: 'Exportovať viditeľné údaje ako excel',\n\t\t\t\t\texporterSelectedAsExcel: 'Exportovať označené údaje ako excel',\n\t\t\t\t\tclearAllFilters: 'Zrušiť všetky filtre'\n\t\t\t\t},\n\t\t\t\timporter: {\n\t\t\t\t\tnoHeaders: 'Názvy stĺpcov sa nedali odvodiť, má súbor hlavičku?',\n\t\t\t\t\tnoObjects: 'Objekty nebolo možné odvodiť, existovali iné údaje v súbore ako hlavičky?',\n\t\t\t\t\tinvalidCsv: 'Súbor sa nepodarilo spracovať, je to platný súbor CSV?',\n\t\t\t\t\tinvalidJson: 'Súbor nebolo možné spracovať, je to platný súbor typu Json?',\n\t\t\t\t\tjsonNotArray: 'Importovaný súbor json musí obsahovať pole, ukončujem.'\n\t\t\t\t},\n\t\t\t\tpagination: {\n\t\t\t\t\taria: {\n\t\t\t\t\t\tpageToFirst: 'Strana na začiatok',\n\t\t\t\t\t\tpageBack: 'Strana dozadu',\n\t\t\t\t\t\tpageSelected: 'Označená strana',\n\t\t\t\t\t\tpageForward: 'Strana dopredu',\n\t\t\t\t\t\tpageToLast: 'Strana na koniec'\n\t\t\t\t\t},\n\t\t\t\t\tsizes: 'položky na stranu',\n\t\t\t\t\ttotalItems: 'položky spolu',\n\t\t\t\t\tthrough: 'do konca',\n\t\t\t\t\tof: 'z'\n\t\t\t\t},\n\t\t\t\tgrouping: {\n\t\t\t\t\tgroup: 'Zoskupiť',\n\t\t\t\t\tungroup: 'Zrušiť zoskupenie',\n\t\t\t\t\taggregate_count: 'Agg: Počet',\n\n\t\t\t\t\taggregate_sum: 'Agg: Suma',\n\t\t\t\t\taggregate_max: 'Agg: Max',\n\t\t\t\t\taggregate_min: 'Agg: Min',\n\t\t\t\t\taggregate_avg: 'Agg: Avg',\n\t\t\t\t\taggregate_remove: 'Agg: Zrušiť'\n\t\t\t\t},\n\t\t\t\tvalidate: {\n\t\t\t\t\terror: 'Chyba:',\n\t\t\t\t\tminLength: 'Hodnota by mala mať aspoň THRESHOLD znakov dlhá.',\n\t\t\t\t\tmaxLength: 'Hodnota by mala byť maximálne THRESHOLD znakov dlhá.',\n\t\t\t\t\trequired: 'Vyžaduje sa hodnota.'\n\t\t\t\t}\n\t\t\t});\n\t\t\treturn $delegate;\n\t\t}]);\n\t}]);\n})();\n\n(function () {\n  angular.module('ui.grid').config(['$provide', function($provide) {\n    $provide.decorator('i18nService', ['$delegate', function($delegate) {\n      $delegate.add('sv', {\n        headerCell: {\n          aria: {\n            defaultFilterLabel: 'Kolumnfilter',\n            removeFilter: 'Ta bort filter',\n            columnMenuButtonLabel: 'Kolumnmeny',\n            column: 'Kolumn'\n          },\n          priority: 'Prioritet:',\n          filterLabel: \"Filter för kolumn: \"\n        },\n        aggregate: {\n          label: 'Poster'\n        },\n        groupPanel: {\n          description: 'Dra en kolumnrubrik hit och släpp den för att gruppera efter den kolumnen.'\n        },\n        search: {\n          aria: {\n            selected: 'Rad är vald',\n            notSelected: 'Rad är inte vald'\n          },\n          placeholder: 'Sök...',\n          showingItems: 'Visar:',\n          selectedItems: 'Valda:',\n          totalItems: 'Antal:',\n          size: 'Sidstorlek:',\n          first: 'Första sidan',\n          next: 'Nästa sida',\n          previous: 'Föregående sida',\n          last: 'Sista sidan'\n        },\n        menu: {\n          text: 'Välj kolumner:'\n        },\n        sort: {\n          ascending: 'Sortera stigande',\n          descending: 'Sortera fallande',\n          none: 'Ingen sortering',\n          remove: 'Inaktivera sortering'\n        },\n        column: {\n          hide: 'Göm kolumn'\n        },\n        aggregation: {\n          count: 'Antal rader: ',\n          sum: 'Summa: ',\n          avg: 'Genomsnitt: ',\n          min: 'Min: ',\n          max: 'Max: '\n        },\n        pinning: {\n          pinLeft: 'Fäst vänster',\n          pinRight: 'Fäst höger',\n          unpin: 'Lösgör'\n        },\n        columnMenu: {\n          close: 'Stäng'\n        },\n        gridMenu: {\n          aria: {\n              buttonLabel: 'Meny'\n          },\n          columns: 'Kolumner:',\n          importerTitle: 'Importera fil',\n          exporterAllAsCsv: 'Exportera all data som CSV',\n          exporterVisibleAsCsv: 'Exportera synlig data som CSV',\n          exporterSelectedAsCsv: 'Exportera markerad data som CSV',\n          exporterAllAsPdf: 'Exportera all data som PDF',\n          exporterVisibleAsPdf: 'Exportera synlig data som PDF',\n          exporterSelectedAsPdf: 'Exportera markerad data som PDF',\n          exporterAllAsExcel: 'Exportera all data till Excel',\n          exporterVisibleAsExcel: 'Exportera synlig data till Excel',\n          exporterSelectedAsExcel: 'Exportera markerad data till Excel',\n          clearAllFilters: 'Nollställ alla filter'\n        },\n        importer: {\n          noHeaders: 'Kolumnnamn kunde inte härledas. Har filen ett sidhuvud?',\n          noObjects: 'Objekt kunde inte härledas. Har filen data undantaget sidhuvud?',\n          invalidCsv: 'Filen kunde inte behandlas, är den en giltig CSV?',\n          invalidJson: 'Filen kunde inte behandlas, är den en giltig JSON?',\n          jsonNotArray: 'Importerad JSON-fil måste innehålla ett fält. Import avbruten.'\n        },\n        pagination: {\n          aria: {\n            pageToFirst: 'Gå till första sidan',\n            pageBack: 'Gå en sida bakåt',\n            pageSelected: 'Vald sida',\n            pageForward: 'Gå en sida framåt',\n            pageToLast: 'Gå till sista sidan'\n          },\n          sizes: 'Poster per sida',\n          totalItems: 'Poster',\n          through: 'genom',\n          of: 'av'\n        },\n        grouping: {\n          group: 'Gruppera',\n          ungroup: 'Dela upp',\n          aggregate_count: 'Agg: Antal',\n          aggregate_sum: 'Agg: Summa',\n          aggregate_max: 'Agg: Max',\n          aggregate_min: 'Agg: Min',\n          aggregate_avg: 'Agg: Genomsnitt',\n          aggregate_remove: 'Agg: Ta bort'\n        },\n        validate: {\n          error: 'Error:',\n          minLength: 'Värdet borde vara minst THRESHOLD tecken långt.',\n          maxLength: 'Värdet borde vara max THRESHOLD tecken långt.',\n          required: 'Ett värde krävs.'\n        }\n      });\n      return $delegate;\n    }]);\n  }]);\n})();\n\n(function () {\n  angular.module('ui.grid').config(['$provide', function($provide) {\n    $provide.decorator('i18nService', ['$delegate', function($delegate) {\n      $delegate.add('ta', {\n        aggregate: {\n          label: 'உருப்படிகள்'\n        },\n        groupPanel: {\n          description: 'ஒரு பத்தியை குழுவாக அமைக்க அப்பத்தியின் தலைப்பை இங்கே  இழுத்து வரவும் '\n        },\n        search: {\n          placeholder: 'தேடல் ...',\n          showingItems: 'உருப்படிகளை காண்பித்தல்:',\n          selectedItems: 'தேர்ந்தெடுக்கப்பட்ட  உருப்படிகள்:',\n          totalItems: 'மொத்த உருப்படிகள்:',\n          size: 'பக்க அளவு: ',\n          first: 'முதல் பக்கம்',\n          next: 'அடுத்த பக்கம்',\n          previous: 'முந்தைய பக்கம் ',\n          last: 'இறுதி பக்கம்'\n        },\n        menu: {\n          text: 'பத்திகளை தேர்ந்தெடு:'\n        },\n        sort: {\n          ascending: 'மேலிருந்து கீழாக',\n          descending: 'கீழிருந்து மேலாக',\n          remove: 'வரிசையை நீக்கு'\n        },\n        column: {\n          hide: 'பத்தியை மறைத்து வை '\n        },\n        aggregation: {\n          count: 'மொத்த வரிகள்:',\n          sum: 'மொத்தம்: ',\n          avg: 'சராசரி: ',\n          min: 'குறைந்தபட்ச: ',\n          max: 'அதிகபட்ச: '\n        },\n        pinning: {\n         pinLeft: 'இடதுபுறமாக தைக்க ',\n          pinRight: 'வலதுபுறமாக தைக்க',\n          unpin: 'பிரி'\n        },\n        gridMenu: {\n          columns: 'பத்திகள்:',\n          importerTitle: 'கோப்பு : படித்தல்',\n          exporterAllAsCsv: 'எல்லா தரவுகளையும் கோப்பாக்கு: csv',\n          exporterVisibleAsCsv: 'இருக்கும் தரவுகளை கோப்பாக்கு: csv',\n          exporterSelectedAsCsv: 'தேர்ந்தெடுத்த தரவுகளை கோப்பாக்கு: csv',\n          exporterAllAsPdf: 'எல்லா தரவுகளையும் கோப்பாக்கு: pdf',\n          exporterVisibleAsPdf: 'இருக்கும் தரவுகளை கோப்பாக்கு: pdf',\n          exporterSelectedAsPdf: 'தேர்ந்தெடுத்த தரவுகளை கோப்பாக்கு: pdf',\n          clearAllFilters: 'Clear all filters'\n        },\n        importer: {\n          noHeaders: 'பத்தியின் தலைப்புகளை பெற இயலவில்லை, கோப்பிற்கு தலைப்பு உள்ளதா?',\n          noObjects: 'இலக்குகளை உருவாக்க முடியவில்லை, கோப்பில் தலைப்புகளை தவிர தரவு ஏதேனும் உள்ளதா? ',\n          invalidCsv:\t'சரிவர நடைமுறை படுத்த இயலவில்லை, கோப்பு சரிதானா? - csv',\n          invalidJson: 'சரிவர நடைமுறை படுத்த இயலவில்லை, கோப்பு சரிதானா? - json',\n          jsonNotArray: 'படித்த கோப்பில் வரிசைகள் உள்ளது, நடைமுறை ரத்து செய் : json'\n        },\n        pagination: {\n          sizes\t\t: 'உருப்படிகள் / பக்கம்',\n          totalItems\t: 'உருப்படிகள் '\n        },\n        grouping: {\n          group\t: 'குழு',\n          ungroup : 'பிரி',\n          aggregate_count\t: 'மதிப்பீட்டு : எண்ணு',\n          aggregate_sum : 'மதிப்பீட்டு : கூட்டல்',\n          aggregate_max\t: 'மதிப்பீட்டு : அதிகபட்சம்',\n          aggregate_min\t: 'மதிப்பீட்டு : குறைந்தபட்சம்',\n          aggregate_avg\t: 'மதிப்பீட்டு : சராசரி',\n          aggregate_remove : 'மதிப்பீட்டு : நீக்கு'\n        }\n      });\n      return $delegate;\n    }]);\n  }]);\n})();\n\n(function() {\n\tangular.module('ui.grid').config(['$provide', function($provide) {\n\t\t$provide.decorator('i18nService', ['$delegate', function($delegate) {\n\t\t\t$delegate.add('tr', {\n\t\t\t\theaderCell: {\n\t\t\t\t\taria: {\n\t\t\t\t\t\tdefaultFilterLabel: 'Sütun için filtre',\n\t\t\t\t\t\tremoveFilter: 'Filtreyi Kaldır',\n\t\t\t\t\t\tcolumnMenuButtonLabel: 'Sütun Menüsü'\n\t\t\t\t\t},\n\t\t\t\t\tpriority: 'Öncelik:',\n\t\t\t\t\tfilterLabel: \"Sütun için filtre: \"\n\t\t\t\t},\n\t\t\t\taggregate: {\n\t\t\t\t\tlabel: 'kayıtlar'\n\t\t\t\t},\n\t\t\t\tgroupPanel: {\n\t\t\t\t\tdescription: 'Sütuna göre gruplamak için sütun başlığını buraya sürükleyin ve bırakın.'\n\t\t\t\t},\n\t\t\t\tsearch: {\n\t\t\t\t\tplaceholder: 'Arama...',\n\t\t\t\t\tshowingItems: 'Gösterilen Kayıt:',\n\t\t\t\t\tselectedItems: 'Seçili Kayıt:',\n\t\t\t\t\ttotalItems: 'Toplam Kayıt:',\n\t\t\t\t\tsize: 'Sayfa Boyutu:',\n\t\t\t\t\tfirst: 'İlk Sayfa',\n\t\t\t\t\tnext: 'Sonraki Sayfa',\n\t\t\t\t\tprevious: 'Önceki Sayfa',\n\t\t\t\t\tlast: 'Son Sayfa'\n\t\t\t\t},\n\t\t\t\tmenu: {\n\t\t\t\t\ttext: 'Sütunları Seç:'\n\t\t\t\t},\n\t\t\t\tsort: {\n\t\t\t\t\tascending: 'Artan Sırada Sırala',\n\t\t\t\t\tdescending: 'Azalan Sırada Sırala',\n\t\t\t\t\tnone: 'Sıralama Yapma',\n\t\t\t\t\tremove: 'Sıralamayı Kaldır'\n\t\t\t\t},\n\t\t\t\tcolumn: {\n\t\t\t\t\thide: 'Sütunu Gizle'\n\t\t\t\t},\n\t\t\t\taggregation: {\n\t\t\t\t\tcount: 'toplam satır: ',\n\t\t\t\t\tsum: 'toplam: ',\n\t\t\t\t\tavg: 'ort: ',\n\t\t\t\t\tmin: 'min: ',\n\t\t\t\t\tmax: 'maks: '\n\t\t\t\t},\n\t\t\t\tpinning: {\n\t\t\t\t\tpinLeft: 'Sola Sabitle',\n\t\t\t\t\tpinRight: 'Sağa Sabitle',\n\t\t\t\t\tunpin: 'Sabitlemeyi Kaldır'\n\t\t\t\t},\n\t\t\t\tcolumnMenu: {\n\t\t\t\t\tclose: 'Kapat'\n\t\t\t\t},\n\t\t\t\tgridMenu: {\n\t\t\t\t\taria: {\n\t\t\t\t\t\tbuttonLabel: 'Tablo Menü'\n\t\t\t\t\t},\n\t\t\t\t\tcolumns: 'Sütunlar:',\n\t\t\t\t\timporterTitle: 'Dosya içeri aktar',\n\t\t\t\t\texporterAllAsCsv: 'Bütün veriyi CSV olarak dışarı aktar',\n\t\t\t\t\texporterVisibleAsCsv: 'Görünen veriyi CSV olarak dışarı aktar',\n\t\t\t\t\texporterSelectedAsCsv: 'Seçili veriyi CSV olarak dışarı aktar',\n\t\t\t\t\texporterAllAsPdf: 'Bütün veriyi PDF olarak dışarı aktar',\n\t\t\t\t\texporterVisibleAsPdf: 'Görünen veriyi PDF olarak dışarı aktar',\n\t\t\t\t\texporterSelectedAsPdf: 'Seçili veriyi PDF olarak dışarı aktar',\n\t\t\t\t\tclearAllFilters: 'Bütün filtreleri kaldır'\n\t\t\t\t},\n\t\t\t\timporter: {\n\t\t\t\t\tnoHeaders: 'Sütun isimleri üretilemiyor, dosyanın bir başlığı var mı?',\n\t\t\t\t\tnoObjects: 'Nesneler üretilemiyor, dosyada başlıktan başka bir veri var mı?',\n\t\t\t\t\tinvalidCsv: 'Dosya işlenemedi, geçerli bir CSV dosyası mı?',\n\t\t\t\t\tinvalidJson: 'Dosya işlenemedi, geçerli bir Json dosyası mı?',\n\t\t\t\t\tjsonNotArray: 'Alınan Json dosyasında bir dizi bulunmalıdır, işlem iptal ediliyor.'\n\t\t\t\t},\n\t\t\t\tpagination: {\n\t\t\t\t\taria: {\n\t\t\t\t\t\tpageToFirst: 'İlk sayfaya',\n\t\t\t\t\t\tpageBack: 'Geri git',\n\t\t\t\t\t\tpageSelected: 'Seçili sayfa',\n\t\t\t\t\t\tpageForward: 'İleri git',\n\t\t\t\t\t\tpageToLast: 'Sona git'\n\t\t\t\t\t},\n\t\t\t\t\tsizes: 'Sayfadaki nesne sayısı',\n\t\t\t\t\ttotalItems: 'kayıtlar',\n\t\t\t\t\tthrough: '', // note(fsw) : turkish dont have this preposition\n\t\t\t\t\tof: '' // note(fsw) : turkish dont have this preposition\n\t\t\t\t},\n\t\t\t\tgrouping: {\n\t\t\t\t\tgroup: 'Grupla',\n\t\t\t\t\tungroup: 'Gruplama',\n\t\t\t\t\taggregate_count: 'Yekun: Sayı',\n\t\t\t\t\taggregate_sum: 'Yekun: Toplam',\n\t\t\t\t\taggregate_max: 'Yekun: Maks',\n\t\t\t\t\taggregate_min: 'Yekun: Min',\n\t\t\t\t\taggregate_avg: 'Yekun: Ort',\n\t\t\t\t\taggregate_remove: 'Yekun: Sil'\n\t\t\t\t}\n\t\t\t});\n\t\t\treturn $delegate;\n\t\t}]);\n\t}]);\n})();\n\n(function () {\n  angular.module('ui.grid').config(['$provide', function($provide) {\n    $provide.decorator('i18nService', ['$delegate', function($delegate) {\n      $delegate.add('ua', {\n        headerCell: {\n          aria: {\n            defaultFilterLabel: 'Фільтр стовпчика',\n            removeFilter: 'Видалити фільтр',\n            columnMenuButtonLabel: 'Меню ствпчика'\n          },\n          priority: 'Пріоритет:',\n          filterLabel: \"Фільтр стовпчика: \"\n        },\n        aggregate: {\n          label: 'елементи'\n        },\n        groupPanel: {\n          description: 'Для групування за стовпчиком перетягніть сюди його назву.'\n        },\n        search: {\n          placeholder: 'Пошук...',\n          showingItems: 'Показати елементи:',\n          selectedItems: 'Обрані елементи:',\n          totalItems: 'Усього елементів:',\n          size: 'Розмір сторінки:',\n          first: 'Перша сторінка',\n          next: 'Наступна сторінка',\n          previous: 'Попередня сторінка',\n          last: 'Остання сторінка'\n        },\n        menu: {\n          text: 'Обрати ствпчики:'\n        },\n        sort: {\n          ascending: 'За зростанням',\n          descending: 'За спаданням',\n          none: 'Без сортування',\n          remove: 'Прибрати сортування'\n        },\n        column: {\n          hide: 'Приховати стовпчик'\n        },\n        aggregation: {\n          count: 'усього рядків: ',\n          sum: 'ітого: ',\n          avg: 'середнє: ',\n          min: 'мін: ',\n          max: 'макс: '\n        },\n\t\t\t\tpinning: {\n\t\t\t\t\tpinLeft: 'Закріпити ліворуч',\n\t\t\t\t\tpinRight: 'Закріпити праворуч',\n\t\t\t\t\tunpin: 'Відкріпити'\n\t\t\t\t},\n        columnMenu: {\n          close: 'Закрити'\n        },\n        gridMenu: {\n          aria: {\n            buttonLabel: 'Меню'\n          },\n          columns: 'Стовпчики:',\n          importerTitle: 'Імпортувати файл',\n          exporterAllAsCsv: 'Експортувати все в CSV',\n          exporterVisibleAsCsv: 'Експортувати видимі дані в CSV',\n          exporterSelectedAsCsv: 'Експортувати обрані дані в CSV',\n          exporterAllAsPdf: 'Експортувати все в PDF',\n          exporterVisibleAsPdf: 'Експортувати видимі дані в PDF',\n          exporterSelectedAsPdf: 'Експортувати обрані дані в PDF',\n          clearAllFilters: 'Очистити всі фільтри'\n        },\n        importer: {\n          noHeaders: 'Не вдалося отримати назви стовпчиків, чи є в файлі заголовок?',\n          noObjects: 'Не вдалося отримати дані, чи є в файлі рядки окрім заголовка?',\n          invalidCsv: 'Не вдалося обробити файл, чи це коректний CSV-файл?',\n          invalidJson: 'Не вдалося обробити файл, чи це коректний JSON?',\n          jsonNotArray: 'JSON-файл що імпортується повинен містити масив, операцію скасовано.'\n        },\n        pagination: {\n          aria: {\n            pageToFirst: 'Перша сторінка',\n            pageBack: 'Попередня сторінка',\n            pageSelected: 'Обрана сторінка',\n            pageForward: 'Наступна сторінка',\n            pageToLast: 'Остання сторінка'\n          },\n          sizes: 'рядків на сторінку',\n          totalItems: 'рядків',\n          through: 'по',\n          of: 'з'\n        },\n        grouping: {\n          group: 'Групувати',\n          ungroup: 'Розгрупувати',\n          aggregate_count: 'Групувати: Кількість',\n          aggregate_sum: 'Для групи: Сума',\n          aggregate_max: 'Для групи: Максимум',\n          aggregate_min: 'Для групи: Мінімум',\n          aggregate_avg: 'Для групи: Серднє',\n          aggregate_remove: 'Для групи: Пусто'\n        }\n      });\n      return $delegate;\n    }]);\n  }]);\n})();\n\n(function() {\n  angular.module('ui.grid').config(['$provide', function($provide) {\n    $provide.decorator('i18nService', ['$delegate', function($delegate) {\n      $delegate.add('zh-cn', {\n        headerCell: {\n          aria: {\n            defaultFilterLabel: '列过滤器',\n            removeFilter: '移除过滤器',\n            columnMenuButtonLabel: '列菜单'\n          },\n          priority: '优先级:',\n          filterLabel: \"列过滤器: \"\n        },\n        aggregate: {\n          label: '行'\n        },\n        groupPanel: {\n          description: '拖曳表头到此处进行分组'\n        },\n        search: {\n          placeholder: '查找',\n          showingItems: '已显示行数：',\n          selectedItems: '已选择行数：',\n          totalItems: '总行数：',\n          size: '每页显示行数：',\n          first: '首页',\n          next: '下一页',\n          previous: '上一页',\n          last: '末页'\n        },\n        menu: {\n          text: '选择列：'\n        },\n        sort: {\n          ascending: '升序',\n          descending: '降序',\n          none: '无序',\n          remove: '取消排序'\n        },\n        column: {\n          hide: '隐藏列'\n        },\n        aggregation: {\n          count: '计数：',\n          sum: '求和：',\n          avg: '均值：',\n          min: '最小值：',\n          max: '最大值：'\n        },\n        pinning: {\n          pinLeft: '左侧固定',\n          pinRight: '右侧固定',\n          unpin: '取消固定'\n        },\n        columnMenu: {\n          close: '关闭'\n        },\n        gridMenu: {\n          aria: {\n            buttonLabel: '表格菜单'\n          },\n          columns: '列：',\n          importerTitle: '导入文件',\n          exporterAllAsCsv: '导出全部数据到CSV',\n          exporterVisibleAsCsv: '导出可见数据到CSV',\n          exporterSelectedAsCsv: '导出已选数据到CSV',\n          exporterAllAsPdf: '导出全部数据到PDF',\n          exporterVisibleAsPdf: '导出可见数据到PDF',\n          exporterSelectedAsPdf: '导出已选数据到PDF',\n          clearAllFilters: '清除所有过滤器'\n        },\n        importer: {\n          noHeaders: '无法获取列名，确定文件包含表头？',\n          noObjects: '无法获取数据，确定文件包含数据？',\n          invalidCsv: '无法处理文件，确定是合法的CSV文件？',\n          invalidJson: '无法处理文件，确定是合法的JSON文件？',\n          jsonNotArray: '导入的文件不是JSON数组！'\n        },\n        pagination: {\n          aria: {\n            pageToFirst: '第一页',\n            pageBack: '上一页',\n            pageSelected: '当前页',\n            pageForward: '下一页',\n            pageToLast: '最后一页'\n          },\n          sizes: '行每页',\n          totalItems: '行',\n          through: '至',\n          of: '共'\n        },\n        grouping: {\n          group: '分组',\n          ungroup: '取消分组',\n          aggregate_count: '合计: 计数',\n          aggregate_sum: '合计: 求和',\n          aggregate_max: '合计: 最大',\n          aggregate_min: '合计: 最小',\n          aggregate_avg: '合计: 平均',\n          aggregate_remove: '合计: 移除'\n        }\n      });\n      return $delegate;\n    }]);\n  }]);\n})();\n\n(function() {\n  angular.module('ui.grid').config(['$provide', function($provide) {\n    $provide.decorator('i18nService', ['$delegate', function($delegate) {\n      $delegate.add('zh-tw', {\n        aggregate: {\n          label: '行'\n        },\n        groupPanel: {\n          description: '拖曳表頭到此處進行分組'\n        },\n        search: {\n          placeholder: '查找',\n          showingItems: '已顯示行數：',\n          selectedItems: '已選擇行數：',\n          totalItems: '總行數：',\n          size: '每頁顯示行數：',\n          first: '首頁',\n          next: '下壹頁',\n          previous: '上壹頁',\n          last: '末頁'\n        },\n        menu: {\n          text: '選擇列：'\n        },\n        sort: {\n          ascending: '升序',\n          descending: '降序',\n          remove: '取消排序'\n        },\n        column: {\n          hide: '隱藏列'\n        },\n        aggregation: {\n          count: '計數：',\n          sum: '求和：',\n          avg: '均值：',\n          min: '最小值：',\n          max: '最大值：'\n        },\n        pinning: {\n          pinLeft: '左側固定',\n          pinRight: '右側固定',\n          unpin: '取消固定'\n        },\n        gridMenu: {\n          columns: '列：',\n          importerTitle: '導入文件',\n          exporterAllAsCsv: '導出全部數據到CSV',\n          exporterVisibleAsCsv: '導出可見數據到CSV',\n          exporterSelectedAsCsv: '導出已選數據到CSV',\n          exporterAllAsPdf: '導出全部數據到PDF',\n          exporterVisibleAsPdf: '導出可見數據到PDF',\n          exporterSelectedAsPdf: '導出已選數據到PDF',\n          clearAllFilters: '清除所有过滤器'\n        },\n        importer: {\n          noHeaders: '無法獲取列名，確定文件包含表頭？',\n          noObjects: '無法獲取數據，確定文件包含數據？',\n          invalidCsv: '無法處理文件，確定是合法的CSV文件？',\n          invalidJson: '無法處理文件，確定是合法的JSON文件？',\n          jsonNotArray: '導入的文件不是JSON數組！'\n        },\n        pagination: {\n          sizes: '行每頁',\n          totalItems: '行'\n        }\n      });\n      return $delegate;\n    }]);\n  }]);\n})();\n\n(function () {\n  'use strict';\n\n  /**\n   * @ngdoc overview\n   * @name ui.grid.importer\n   * @description\n   *\n   * # ui.grid.importer\n   *\n   * <div class=\"alert alert-success\" role=\"alert\"><strong>Stable</strong> This feature is stable. There should no longer be breaking api changes without a deprecation warning.</div>\n   *\n   * This module provides the ability to import data into the grid. It\n   * uses the column defs to work out which data belongs in which column,\n   * and creates entities from a configured class (typically a $resource).\n   *\n   * If the rowEdit feature is enabled, it also calls save on those newly\n   * created objects, and then displays any errors in the imported data.\n   *\n   * Currently the importer imports only CSV and json files, although provision has been\n   * made to process other file formats, and these can be added over time.\n   *\n   * For json files, the properties within each object in the json must match the column names\n   * (to put it another way, the importer doesn't process the json, it just copies the objects\n   * within the json into a new instance of the specified object type)\n   *\n   * For CSV import, the default column identification relies on each column in the\n   * header row matching a column.name or column.displayName. Optionally, a column identification\n   * callback can be used.  This allows matching using other attributes, which is particularly\n   * useful if your application has internationalised column headings (i.e. the headings that\n   * the user sees don't match the column names).\n   *\n   * The importer makes use of the grid menu as the UI for requesting an\n   * import.\n   *\n   * <div ui-grid-importer></div>\n   */\n\n  var module = angular.module('ui.grid.importer', ['ui.grid']);\n\n  /**\n   *  @ngdoc object\n   *  @name ui.grid.importer.constant:uiGridImporterConstants\n   *\n   *  @description constants available in importer module\n   */\n\n  module.constant('uiGridImporterConstants', {\n    featureName: 'importer'\n  });\n\n  /**\n   *  @ngdoc service\n   *  @name ui.grid.importer.service:uiGridImporterService\n   *\n   *  @description Services for importer feature\n   */\n  module.service('uiGridImporterService', ['$q', 'uiGridConstants', 'uiGridImporterConstants', 'gridUtil', '$compile', '$interval', 'i18nService', '$window',\n    function ($q, uiGridConstants, uiGridImporterConstants, gridUtil, $compile, $interval, i18nService, $window) {\n\n      var service = {\n\n        initializeGrid: function ($scope, grid) {\n\n          // add feature namespace and any properties to grid for needed state\n          grid.importer = {\n            $scope: $scope\n          };\n\n          this.defaultGridOptions(grid.options);\n\n          /**\n           *  @ngdoc object\n           *  @name ui.grid.importer.api:PublicApi\n           *\n           *  @description Public Api for importer feature\n           */\n          var publicApi = {\n            events: {\n              importer: {\n              }\n            },\n            methods: {\n              importer: {\n                /**\n                 * @ngdoc function\n                 * @name importFile\n                 * @methodOf  ui.grid.importer.api:PublicApi\n                 * @description Imports a file into the grid using the file object\n                 * provided.  Bypasses the grid menu\n                 * @param {File} fileObject the file we want to import, as a javascript\n                 * File object\n                 */\n                importFile: function ( fileObject ) {\n                  service.importThisFile( grid, fileObject );\n                }\n              }\n            }\n          };\n\n          grid.api.registerEventsFromObject(publicApi.events);\n\n          grid.api.registerMethodsFromObject(publicApi.methods);\n\n          if ( grid.options.enableImporter && grid.options.importerShowMenu ) {\n            if ( grid.api.core.addToGridMenu ) {\n              service.addToMenu( grid );\n            } else {\n              // order of registration is not guaranteed, register in a little while\n              $interval( function() {\n                if (grid.api.core.addToGridMenu) {\n                  service.addToMenu( grid );\n                }\n              }, 100, 1);\n            }\n          }\n        },\n\n\n        defaultGridOptions: function (gridOptions) {\n          // default option to true unless it was explicitly set to false\n          /**\n           * @ngdoc object\n           * @name ui.grid.importer.api:GridOptions\n           *\n           * @description GridOptions for importer feature, these are available to be\n           * set using the ui-grid {@link ui.grid.class:GridOptions gridOptions}\n           */\n\n          /**\n           * @ngdoc property\n           * @propertyOf ui.grid.importer.api:GridOptions\n           * @name enableImporter\n           * @description Whether or not importer is enabled.  Automatically set\n           * to false if the user's browser does not support the required fileApi.\n           * Otherwise defaults to true.\n           *\n           */\n          if (gridOptions.enableImporter  || gridOptions.enableImporter === undefined) {\n            if ( !($window.hasOwnProperty('File') && $window.hasOwnProperty('FileReader') && $window.hasOwnProperty('FileList') && $window.hasOwnProperty('Blob')) ) {\n              gridUtil.logError('The File APIs are not fully supported in this browser, grid importer cannot be used.');\n              gridOptions.enableImporter = false;\n            } else {\n              gridOptions.enableImporter = true;\n            }\n          } else {\n            gridOptions.enableImporter = false;\n          }\n\n          /**\n           * @ngdoc method\n           * @name importerProcessHeaders\n           * @methodOf ui.grid.importer.api:GridOptions\n           * @description A callback function that will process headers using custom\n           * logic.  Set this callback function if the headers that your user will provide in their\n           * import file don't necessarily match the grid header or field names.  This might commonly\n           * occur where your application is internationalised, and therefore the field names\n           * that the user recognises are in a different language than the field names that\n           * ui-grid knows about.\n           *\n           * Defaults to the internal `processHeaders` method, which seeks to match using both\n           * displayName and column.name.  Any non-matching columns are discarded.\n           *\n           * Your callback routine should respond by processing the header array, and returning an array\n           * of matching column names.  A null value in any given position means \"don't import this column\"\n           *\n           * <pre>\n           *      gridOptions.importerProcessHeaders: function( grid, headerArray ) {\n           *        var myHeaderColumns = [];\n           *        var thisCol;\n           *        headerArray.forEach( function( value, index ) {\n           *          thisCol = mySpecialLookupFunction( value );\n           *          myHeaderColumns.push( thisCol.name );\n           *        });\n           *\n           *        return myHeaderCols;\n           *      })\n           * </pre>\n           * @param {Grid} grid the grid we're importing into\n           * @param {array} headerArray an array of the text from the first row of the csv file,\n           * which you need to match to column.names\n           * @returns {array} array of matching column names, in the same order as the headerArray\n           *\n           */\n          gridOptions.importerProcessHeaders = gridOptions.importerProcessHeaders || service.processHeaders;\n\n          /**\n           * @ngdoc method\n           * @name importerHeaderFilter\n           * @methodOf ui.grid.importer.api:GridOptions\n           * @description A callback function that will filter (usually translate) a single\n           * header.  Used when you want to match the passed in column names to the column\n           * displayName after the header filter.\n           *\n           * Your callback routine needs to return the filtered header value.\n           * <pre>\n           *      gridOptions.importerHeaderFilter: function( displayName ) {\n           *        return $translate.instant( displayName );\n           *      })\n           * </pre>\n           *\n           * or:\n           * <pre>\n           *      gridOptions.importerHeaderFilter: $translate.instant\n           * </pre>\n           * @param {string} displayName the displayName that we'd like to translate\n           * @returns {string} the translated name\n           *\n           */\n          gridOptions.importerHeaderFilter = gridOptions.importerHeaderFilter || function( displayName ) { return displayName; };\n\n          /**\n           * @ngdoc method\n           * @name importerErrorCallback\n           * @methodOf ui.grid.importer.api:GridOptions\n           * @description A callback function that provides custom error handling, rather\n           * than the standard grid behaviour of an alert box and a console message.  You\n           * might use this to internationalise the console log messages, or to write to a\n           * custom logging routine that returned errors to the server.\n           *\n           * <pre>\n           *      gridOptions.importerErrorCallback: function( grid, errorKey, consoleMessage, context ) {\n           *        myUserDisplayRoutine( errorKey );\n           *        myLoggingRoutine( consoleMessage, context );\n           *      })\n           * </pre>\n           * @param {Grid} grid the grid we're importing into, may be useful if you're positioning messages\n           * in some way\n           * @param {string} errorKey one of the i18n keys the importer can return - importer.noHeaders,\n           * importer.noObjects, importer.invalidCsv, importer.invalidJson, importer.jsonNotArray\n           * @param {string} consoleMessage the English console message that importer would have written\n           * @param {object} context the context data that importer would have appended to that console message,\n           * often the file content itself or the element that is in error\n           *\n           */\n          if ( !gridOptions.importerErrorCallback ||  typeof(gridOptions.importerErrorCallback) !== 'function' ) {\n            delete gridOptions.importerErrorCallback;\n          }\n\n          /**\n           * @ngdoc method\n           * @name importerDataAddCallback\n           * @methodOf ui.grid.importer.api:GridOptions\n           * @description A mandatory callback function that adds data to the source data array.  The grid\n           * generally doesn't add rows to the source data array, it is tidier to handle this through a user\n           * callback.\n           *\n           * <pre>\n           *      gridOptions.importerDataAddCallback: function( grid, newObjects ) {\n           *        $scope.myData = $scope.myData.concat( newObjects );\n           *      })\n           * </pre>\n           * @param {Grid} grid the grid we're importing into, may be useful in some way\n           * @param {array} newObjects an array of new objects that you should add to your data\n           *\n           */\n          if ( gridOptions.enableImporter === true && !gridOptions.importerDataAddCallback ) {\n            gridUtil.logError(\"You have not set an importerDataAddCallback, importer is disabled\");\n            gridOptions.enableImporter = false;\n          }\n\n          /**\n           * @ngdoc object\n           * @name importerNewObject\n           * @propertyOf  ui.grid.importer.api:GridOptions\n           * @description An object on which we call `new` to create each new row before inserting it into\n           * the data array.  Typically this would be a $resource entity, which means that if you're using\n           * the rowEdit feature, you can directly call save on this entity when the save event is triggered.\n           *\n           * Defaults to a vanilla javascript object\n           *\n           * @example\n           * <pre>\n           *   gridOptions.importerNewObject = MyRes;\n           * </pre>\n           *\n           */\n\n          /**\n           * @ngdoc property\n           * @propertyOf ui.grid.importer.api:GridOptions\n           * @name importerShowMenu\n           * @description Whether or not to show an item in the grid menu.  Defaults to true.\n           *\n           */\n          gridOptions.importerShowMenu = gridOptions.importerShowMenu !== false;\n\n          /**\n           * @ngdoc method\n           * @methodOf ui.grid.importer.api:GridOptions\n           * @name importerObjectCallback\n           * @description A callback that massages the data for each object.  For example,\n           * you might have data stored as a code value, but display the decode.  This callback\n           * can be used to change the decoded value back into a code.  Defaults to doing nothing.\n           * @param {Grid} grid in case you need it\n           * @param {object} newObject the new object as importer has created it, modify it\n           * then return the modified version\n           * @returns {object} the modified object\n           * @example\n           * <pre>\n           *   gridOptions.importerObjectCallback = function ( grid, newObject ) {\n           *     switch newObject.status {\n           *       case 'Active':\n           *         newObject.status = 1;\n           *         break;\n           *       case 'Inactive':\n           *         newObject.status = 2;\n           *         break;\n           *     }\n           *     return newObject;\n           *   };\n           * </pre>\n           */\n          gridOptions.importerObjectCallback = gridOptions.importerObjectCallback || function( grid, newObject ) { return newObject; };\n        },\n\n\n        /**\n         * @ngdoc function\n         * @name addToMenu\n         * @methodOf  ui.grid.importer.service:uiGridImporterService\n         * @description Adds import menu item to the grid menu,\n         * allowing the user to request import of a file\n         * @param {Grid} grid the grid into which data should be imported\n         */\n        addToMenu: function ( grid ) {\n          grid.api.core.addToGridMenu( grid, [\n            {\n              title: i18nService.getSafeText('gridMenu.importerTitle'),\n              order: 150\n            },\n            {\n              templateUrl: 'ui-grid/importerMenuItemContainer',\n              action: function () {\n                this.grid.api.importer.importAFile( grid );\n              },\n              order: 151\n            }\n          ]);\n        },\n\n\n        /**\n         * @ngdoc function\n         * @name importThisFile\n         * @methodOf ui.grid.importer.service:uiGridImporterService\n         * @description Imports the provided file into the grid using the file object\n         * provided.  Bypasses the grid menu\n         * @param {Grid} grid the grid we're importing into\n         * @param {File} fileObject the file we want to import, as returned from the File\n         * javascript object\n         */\n        importThisFile: function ( grid, fileObject ) {\n          if (!fileObject) {\n            gridUtil.logError( 'No file object provided to importThisFile, should be impossible, aborting');\n            return;\n          }\n\n          var reader = new FileReader();\n\n          switch ( fileObject.type ) {\n            case 'application/json':\n              reader.onload = service.importJsonClosure( grid );\n              break;\n            default:\n              reader.onload = service.importCsvClosure( grid );\n              break;\n          }\n\n          reader.readAsText( fileObject );\n        },\n\n\n        /**\n         * @ngdoc function\n         * @name importJson\n         * @methodOf ui.grid.importer.service:uiGridImporterService\n         * @description Creates a function that imports a json file into the grid.\n         * The json data is imported into new objects of type `gridOptions.importerNewObject`,\n         * and if the rowEdit feature is enabled the rows are marked as dirty\n         * @param {Grid} grid the grid we want to import into\n         * @return {function} Function that receives the file that we want to import, as\n         * a FileObject as an argument\n         */\n        importJsonClosure: function( grid ) {\n          return function( importFile ) {\n            var newObjects = [],\n              newObject,\n              importArray = service.parseJson( grid, importFile );\n\n            if (importArray === null) {\n              return;\n            }\n            importArray.forEach(  function( value ) {\n              newObject = service.newObject( grid );\n              angular.extend( newObject, value );\n              newObject = grid.options.importerObjectCallback( grid, newObject );\n              newObjects.push( newObject );\n            });\n\n            service.addObjects( grid, newObjects );\n          };\n        },\n\n\n        /**\n         * @ngdoc function\n         * @name parseJson\n         * @methodOf ui.grid.importer.service:uiGridImporterService\n         * @description Parses a json file, returns the parsed data.\n         * Displays an error if file doesn't parse\n         * @param {Grid} grid the grid that we want to import into\n         * @param {FileObject} importFile the file that we want to import, as\n         * a FileObject\n         * @returns {array} array of objects from the imported json\n         */\n        parseJson: function( grid, importFile ) {\n          var loadedObjects;\n\n          try {\n            loadedObjects = JSON.parse( importFile.target.result );\n          } catch (e) {\n            service.alertError( grid, 'importer.invalidJson', 'File could not be processed, is it valid json? Content was: ', importFile.target.result );\n            return;\n          }\n\n          if ( !Array.isArray( loadedObjects ) ) {\n            service.alertError( grid, 'importer.jsonNotarray', 'Import failed, file is not an array, file was: ', importFile.target.result );\n            return [];\n          } else {\n            return loadedObjects;\n          }\n        },\n\n\n\n        /**\n         * @ngdoc function\n         * @name importCsvClosure\n         * @methodOf ui.grid.importer.service:uiGridImporterService\n         * @description Creates a function that imports a csv file into the grid\n         * (allowing it to be used in the reader.onload event)\n         * @param {Grid} grid the grid that we want to import into\n         * @return {function} Function that receives the file that we want to import, as\n         * a file object\n         */\n        importCsvClosure: function( grid ) {\n          return function( importFile ) {\n            var importArray = service.parseCsv( importFile );\n\n            if ( !importArray || importArray.length < 1 ) {\n              service.alertError( grid, 'importer.invalidCsv', 'File could not be processed, is it valid csv? Content was: ', importFile.target.result );\n              return;\n            }\n\n            var newObjects = service.createCsvObjects( grid, importArray );\n\n            if ( !newObjects || newObjects.length === 0 ) {\n              service.alertError( grid, 'importer.noObjects', 'Objects were not able to be derived, content was: ', importFile.target.result );\n              return;\n            }\n\n            service.addObjects( grid, newObjects );\n          };\n        },\n\n\n        /**\n         * @ngdoc function\n         * @name parseCsv\n         * @methodOf ui.grid.importer.service:uiGridImporterService\n         * @description Parses a csv file into an array of arrays, with the first\n         * array being the headers, and the remaining arrays being the data.\n         * The logic for this comes from https://github.com/thetalecrafter/excel.js/blob/master/src/csv.js,\n         * which is noted as being under the MIT license.  The code is modified to pass the jscs yoda condition\n         * checker\n         * @param {FileObject} importFile the file that we want to import, as a\n         * file object\n         */\n        parseCsv: function( importFile ) {\n          var csv = importFile.target.result;\n\n          // use the CSV-JS library to parse\n          return CSV.parse(csv);\n        },\n\n\n        /**\n         * @ngdoc function\n         * @name createCsvObjects\n         * @methodOf ui.grid.importer.service:uiGridImporterService\n         * @description Converts an array of arrays (representing the csv file)\n         * into a set of objects.  Uses the provided `gridOptions.importerNewObject`\n         * to create the objects, and maps the header row into the individual columns\n         * using either `gridOptions.importerProcessHeaders`, or by using a native method\n         * of matching to either the displayName, column name or column field of\n         * the columns in the column defs.  The resulting objects will have attributes\n         * that are named based on the column.field or column.name, in that order.\n         * @param {Grid} grid the grid that we want to import into\n         * @param {Array} importArray the data that we want to import, as an array\n         */\n        createCsvObjects: function( grid, importArray ) {\n          // pull off header row and turn into headers\n          var headerMapping = grid.options.importerProcessHeaders( grid, importArray.shift() );\n\n          if ( !headerMapping || headerMapping.length === 0 ) {\n            service.alertError( grid, 'importer.noHeaders', 'Column names could not be derived, content was: ', importArray );\n            return [];\n          }\n\n          var newObjects = [],\n            newObject;\n\n          importArray.forEach( function( row ) {\n            newObject = service.newObject( grid );\n            if ( row !== null ) {\n              row.forEach( function( field, index ) {\n                if ( headerMapping[index] !== null ) {\n                  newObject[ headerMapping[index] ] = field;\n                }\n              });\n            }\n            newObject = grid.options.importerObjectCallback( grid, newObject );\n            newObjects.push( newObject );\n          });\n\n          return newObjects;\n        },\n\n\n        /**\n         * @ngdoc function\n         * @name processHeaders\n         * @methodOf ui.grid.importer.service:uiGridImporterService\n         * @description Determines the columns that the header row from\n         * a csv (or other) file represents.\n         * @param {Grid} grid the grid we're importing into\n         * @param {array} headerRow the header row that we wish to match against\n         * the column definitions\n         * @returns {array} an array of the attribute names that should be used\n         * for that column, based on matching the headers or creating the headers\n         *\n         */\n        processHeaders: function( grid, headerRow ) {\n          var headers = [];\n\n          if ( !grid.options.columnDefs || grid.options.columnDefs.length === 0 ) {\n            // we are going to create new columnDefs for all these columns, so just remove\n            // spaces from the names to create fields\n            headerRow.forEach( function( value ) {\n              headers.push( value.replace( /[^0-9a-zA-Z\\-_]/g, '_' ) );\n            });\n            return headers;\n          }\n          else {\n            var lookupHash = service.flattenColumnDefs( grid, grid.options.columnDefs );\n            headerRow.forEach(  function( value ) {\n              if ( lookupHash[value] ) {\n                headers.push( lookupHash[value] );\n              }\n              else if ( lookupHash[ value.toLowerCase() ] ) {\n                headers.push( lookupHash[ value.toLowerCase() ] );\n              }\n              else {\n                headers.push( null );\n              }\n            });\n            return headers;\n          }\n        },\n\n\n        /**\n         * @name flattenColumnDefs\n         * @methodOf ui.grid.importer.service:uiGridImporterService\n         * @description Runs through the column defs and creates a hash of\n         * the displayName, name and field, and of each of those values forced to lower case,\n         * with each pointing to the field or name\n         * (whichever is present).  Used to lookup column headers and decide what\n         * attribute name to give to the resulting field.\n         * @param {Grid} grid the grid we're importing into\n         * @param {array} columnDefs the columnDefs that we should flatten\n         * @returns {hash} the flattened version of the column def information, allowing\n         * us to look up a value by `flattenedHash[ headerValue ]`\n         */\n        flattenColumnDefs: function( grid, columnDefs ) {\n          var flattenedHash = {};\n\n          columnDefs.forEach(  function( columnDef) {\n            if ( columnDef.name ) {\n              flattenedHash[ columnDef.name ] = columnDef.field || columnDef.name;\n              flattenedHash[ columnDef.name.toLowerCase() ] = columnDef.field || columnDef.name;\n            }\n\n            if ( columnDef.field ) {\n              flattenedHash[ columnDef.field ] = columnDef.field || columnDef.name;\n              flattenedHash[ columnDef.field.toLowerCase() ] = columnDef.field || columnDef.name;\n            }\n\n            if ( columnDef.displayName ) {\n              flattenedHash[ columnDef.displayName ] = columnDef.field || columnDef.name;\n              flattenedHash[ columnDef.displayName.toLowerCase() ] = columnDef.field || columnDef.name;\n            }\n\n            if ( columnDef.displayName && grid.options.importerHeaderFilter ) {\n              flattenedHash[ grid.options.importerHeaderFilter(columnDef.displayName) ] = columnDef.field || columnDef.name;\n              flattenedHash[ grid.options.importerHeaderFilter(columnDef.displayName).toLowerCase() ] = columnDef.field || columnDef.name;\n            }\n          });\n\n          return flattenedHash;\n        },\n\n\n        /**\n         * @ngdoc function\n         * @name addObjects\n         * @methodOf ui.grid.importer.service:uiGridImporterService\n         * @description Inserts our new objects into the grid data, and\n         * sets the rows to dirty if the rowEdit feature is being used\n         *\n         * Does this by registering a watch on dataChanges, which essentially\n         * is waiting on the result of the grid data watch, and downstream processing.\n         *\n         * When the callback is called, it deregisters itself - we don't want to run\n         * again next time data is added.\n         *\n         * If we never get called, we deregister on destroy.\n         *\n         * @param {Grid} grid the grid we're importing into\n         * @param {array} newObjects the objects we want to insert into the grid data\n         * @returns {object} the new object\n         */\n        addObjects: function( grid, newObjects ) {\n          if ( grid.api.rowEdit ) {\n            var dataChangeDereg = grid.registerDataChangeCallback( function() {\n              grid.api.rowEdit.setRowsDirty( newObjects );\n              dataChangeDereg();\n            }, [uiGridConstants.dataChange.ROW] );\n\n            grid.importer.$scope.$on( '$destroy', dataChangeDereg );\n          }\n\n          grid.importer.$scope.$apply( grid.options.importerDataAddCallback( grid, newObjects ) );\n\n        },\n\n\n        /**\n         * @ngdoc function\n         * @name newObject\n         * @methodOf ui.grid.importer.service:uiGridImporterService\n         * @description Makes a new object based on `gridOptions.importerNewObject`,\n         * or based on an empty object if not present\n         * @param {Grid} grid the grid we're importing into\n         * @returns {object} the new object\n         */\n        newObject: function( grid ) {\n          if ( typeof(grid.options) !== \"undefined\" && typeof(grid.options.importerNewObject) !== \"undefined\" ) {\n            return new grid.options.importerNewObject();\n          }\n          else {\n            return {};\n          }\n        },\n\n\n        /**\n         * @ngdoc function\n         * @name alertError\n         * @methodOf ui.grid.importer.service:uiGridImporterService\n         * @description Provides an internationalised user alert for the failure,\n         * and logs a console message including diagnostic content.\n         * Optionally, if the the `gridOptions.importerErrorCallback` routine\n         * is defined, then calls that instead, allowing user specified error routines\n         * @param {Grid} grid the grid we're importing into\n         * @param {array} headerRow the header row that we wish to match against\n         * the column definitions\n         */\n        alertError: function( grid, alertI18nToken, consoleMessage, context ) {\n          if ( grid.options.importerErrorCallback ) {\n            grid.options.importerErrorCallback( grid, alertI18nToken, consoleMessage, context );\n          }\n          else {\n            $window.alert(i18nService.getSafeText( alertI18nToken ));\n            gridUtil.logError(consoleMessage + context );\n          }\n        }\n      };\n\n      return service;\n\n    }\n  ]);\n\n  /**\n   *  @ngdoc directive\n   *  @name ui.grid.importer.directive:uiGridImporter\n   *  @element div\n   *  @restrict A\n   *\n   *  @description Adds importer features to grid\n   *\n   */\n  module.directive('uiGridImporter', ['uiGridImporterConstants', 'uiGridImporterService', 'gridUtil', '$compile',\n    function (uiGridImporterConstants, uiGridImporterService, gridUtil, $compile) {\n      return {\n        replace: true,\n        priority: 0,\n        require: '^uiGrid',\n        scope: false,\n        link: function ($scope, $elm, $attrs, uiGridCtrl) {\n          uiGridImporterService.initializeGrid($scope, uiGridCtrl.grid);\n        }\n      };\n    }\n  ]);\n\n  /**\n   *  @ngdoc directive\n   *  @name ui.grid.importer.directive:uiGridImporterMenuItem\n   *  @element div\n   *  @restrict A\n   *\n   *  @description Handles the processing from the importer menu item - once a file is\n   *  selected\n   *\n   */\n  module.directive('uiGridImporterMenuItem', ['uiGridImporterConstants', 'uiGridImporterService', 'gridUtil', '$compile',\n    function (uiGridImporterConstants, uiGridImporterService, gridUtil, $compile) {\n      return {\n        replace: true,\n        priority: 0,\n        require: '?^uiGrid',\n        scope: false,\n        templateUrl: 'ui-grid/importerMenuItem',\n        link: function ($scope, $elm, $attrs, uiGridCtrl) {\n          var grid;\n\n          function handleFileSelect(event) {\n            var target = event.srcElement || event.target;\n\n            if (target && target.files && target.files.length === 1) {\n              var fileObject = target.files[0];\n\n              // Define grid if the uiGrid controller is present\n              if (typeof(uiGridCtrl) !== 'undefined' && uiGridCtrl) {\n                grid = uiGridCtrl.grid;\n\n                uiGridImporterService.importThisFile( grid, fileObject );\n                target.form.reset();\n              }\n              else {\n                gridUtil.logError('Could not import file because UI Grid was not found.');\n              }\n            }\n          }\n\n          var fileChooser = $elm[0].querySelectorAll('.ui-grid-importer-file-chooser');\n\n          if ( fileChooser.length !== 1 ) {\n            gridUtil.logError('Found > 1 or < 1 file choosers within the menu item, error, cannot continue');\n          }\n          else {\n            fileChooser[0].addEventListener('change', handleFileSelect, false);\n          }\n        }\n      };\n    }\n  ]);\n})();\n\n(function() {\n  'use strict';\n  /**\n   *  @ngdoc overview\n   *  @name ui.grid.infiniteScroll\n   *\n   *  @description\n   *\n   * #ui.grid.infiniteScroll\n   *\n   * <div class=\"alert alert-warning\" role=\"alert\"><strong>Beta</strong> This feature is ready for testing, but it either hasn't seen a lot of use or has some known bugs.</div>\n   *\n   * This module provides infinite scroll functionality to ui-grid\n   *\n   */\n  var module = angular.module('ui.grid.infiniteScroll', ['ui.grid']);\n  /**\n   *  @ngdoc service\n   *  @name ui.grid.infiniteScroll.service:uiGridInfiniteScrollService\n   *\n   *  @description Service for infinite scroll features\n   */\n  module.service('uiGridInfiniteScrollService', ['gridUtil', '$compile', '$rootScope', 'uiGridConstants', 'ScrollEvent', '$q', function (gridUtil, $compile, $rootScope, uiGridConstants, ScrollEvent, $q) {\n    var service = {\n\n      /**\n       * @ngdoc function\n       * @name initializeGrid\n       * @methodOf ui.grid.infiniteScroll.service:uiGridInfiniteScrollService\n       * @description This method register events and methods into grid public API\n       */\n\n      initializeGrid: function(grid, $scope) {\n        service.defaultGridOptions(grid.options);\n\n        if (!grid.options.enableInfiniteScroll) {\n          return;\n        }\n\n        grid.infiniteScroll = { dataLoading: false };\n        service.setScrollDirections( grid, grid.options.infiniteScrollUp, grid.options.infiniteScrollDown );\n          grid.api.core.on.scrollEnd($scope, service.handleScroll);\n\n        /**\n         *  @ngdoc object\n         *  @name ui.grid.infiniteScroll.api:PublicAPI\n         *\n         *  @description Public API for infinite scroll feature\n         */\n        var publicApi = {\n          events: {\n            infiniteScroll: {\n\n              /**\n               * @ngdoc event\n               * @name needLoadMoreData\n               * @eventOf ui.grid.infiniteScroll.api:PublicAPI\n               * @description This event fires when scroll reaches bottom percentage of grid\n               * and needs to load data\n               */\n\n              needLoadMoreData: function ($scope, fn) {\n              },\n\n              /**\n               * @ngdoc event\n               * @name needLoadMoreDataTop\n               * @eventOf ui.grid.infiniteScroll.api:PublicAPI\n               * @description This event fires when scroll reaches top percentage of grid\n               * and needs to load data\n               */\n\n              needLoadMoreDataTop: function ($scope, fn) {\n              }\n            }\n          },\n          methods: {\n            infiniteScroll: {\n\n              /**\n               * @ngdoc function\n               * @name dataLoaded\n               * @methodOf ui.grid.infiniteScroll.api:PublicAPI\n               * @description Call this function when you have loaded the additional data\n               * requested.  You should set scrollUp and scrollDown to indicate\n               * whether there are still more pages in each direction.\n               *\n               * If you call dataLoaded without first calling `saveScrollPercentage` then we will\n               * scroll the user to the start of the newly loaded data, which usually gives a smooth scroll\n               * experience, but can give a jumpy experience with large `infiniteScrollRowsFromEnd` values, and\n               * on variable speed internet connections.  Using `saveScrollPercentage` as demonstrated in the tutorial\n               * should give a smoother scrolling experience for users.\n               *\n               * See infinite_scroll tutorial for example of usage\n               * @param {boolean} scrollUp if set to false flags that there are no more pages upwards, so don't fire\n               * any more infinite scroll events upward\n               * @param {boolean} scrollDown if set to false flags that there are no more pages downwards, so don't\n               * fire any more infinite scroll events downward\n               * @returns {promise} a promise that is resolved when the grid scrolling is fully adjusted.  If you're\n               * planning to remove pages, you should wait on this promise first, or you'll break the scroll positioning\n               */\n              dataLoaded: function( scrollUp, scrollDown ) {\n                service.setScrollDirections(grid, scrollUp, scrollDown);\n\n                return service.adjustScroll(grid).then(function() {\n                  grid.infiniteScroll.dataLoading = false;\n                });\n              },\n\n              /**\n               * @ngdoc function\n               * @name resetScroll\n               * @methodOf ui.grid.infiniteScroll.api:PublicAPI\n               * @description Call this function when you have taken some action that makes the current\n               * scroll position invalid.  For example, if you're using external sorting and you've resorted\n               * then you might reset the scroll, or if you've otherwise substantially changed the data, perhaps\n               * you've reused an existing grid for a new data set\n               *\n               * You must tell us whether there is data upwards or downwards after the reset\n               *\n               * @param {boolean} scrollUp flag that there are pages upwards, fire\n               * infinite scroll events upward\n               * @param {boolean} scrollDown flag that there are pages downwards, so\n               * fire infinite scroll events downward\n               */\n              resetScroll: function( scrollUp, scrollDown ) {\n                service.setScrollDirections( grid, scrollUp, scrollDown);\n\n                service.adjustInfiniteScrollPosition(grid, 0);\n              },\n\n\n              /**\n               * @ngdoc function\n               * @name saveScrollPercentage\n               * @methodOf ui.grid.infiniteScroll.api:PublicAPI\n               * @description Saves the scroll percentage and number of visible rows before you adjust the data,\n               * used if you're subsequently going to call `dataRemovedTop` or `dataRemovedBottom`\n               */\n              saveScrollPercentage: function() {\n                grid.infiniteScroll.prevScrollTop = grid.renderContainers.body.prevScrollTop;\n                grid.infiniteScroll.previousVisibleRows = grid.getVisibleRowCount();\n              },\n\n\n              /**\n               * @ngdoc function\n               * @name dataRemovedTop\n               * @methodOf ui.grid.infiniteScroll.api:PublicAPI\n               * @description Adjusts the scroll position after you've removed data at the top\n               * @param {boolean} scrollUp flag that there are pages upwards, fire\n               * infinite scroll events upward\n               * @param {boolean} scrollDown flag that there are pages downwards, so\n               * fire infinite scroll events downward\n               */\n              dataRemovedTop: function( scrollUp, scrollDown ) {\n                service.dataRemovedTop( grid, scrollUp, scrollDown );\n              },\n\n              /**\n               * @ngdoc function\n               * @name dataRemovedBottom\n               * @methodOf ui.grid.infiniteScroll.api:PublicAPI\n               * @description Adjusts the scroll position after you've removed data at the bottom\n               * @param {boolean} scrollUp flag that there are pages upwards, fire\n               * infinite scroll events upward\n               * @param {boolean} scrollDown flag that there are pages downwards, so\n               * fire infinite scroll events downward\n               */\n              dataRemovedBottom: function( scrollUp, scrollDown ) {\n                service.dataRemovedBottom( grid, scrollUp, scrollDown );\n              },\n\n              /**\n               * @ngdoc function\n               * @name setScrollDirections\n               * @methodOf ui.grid.infiniteScroll.service:uiGridInfiniteScrollService\n               * @description Sets the scrollUp and scrollDown flags, handling nulls and undefined,\n               * and also sets the grid.suppressParentScroll\n               * @param {boolean} scrollUp whether there are pages available up - defaults to false\n               * @param {boolean} scrollDown whether there are pages available down - defaults to true\n               */\n              setScrollDirections:  function ( scrollUp, scrollDown ) {\n                service.setScrollDirections( grid, scrollUp, scrollDown );\n              }\n\n            }\n          }\n        };\n        grid.api.registerEventsFromObject(publicApi.events);\n        grid.api.registerMethodsFromObject(publicApi.methods);\n      },\n\n\n      defaultGridOptions: function (gridOptions) {\n        // default option to true unless it was explicitly set to false\n        /**\n         *  @ngdoc object\n         *  @name ui.grid.infiniteScroll.api:GridOptions\n         *\n         *  @description GridOptions for infinite scroll feature, these are available to be\n         *  set using the ui-grid {@link ui.grid.class:GridOptions gridOptions}\n         */\n\n        /**\n         *  @ngdoc object\n         *  @name enableInfiniteScroll\n         *  @propertyOf  ui.grid.infiniteScroll.api:GridOptions\n         *  @description Enable infinite scrolling for this grid\n         *  <br/>Defaults to true\n         */\n        gridOptions.enableInfiniteScroll = gridOptions.enableInfiniteScroll !== false;\n\n        /**\n         * @ngdoc property\n         * @name infiniteScrollRowsFromEnd\n         * @propertyOf ui.grid.class:GridOptions\n         * @description This setting controls how close to the end of the dataset a user gets before\n         * more data is requested by the infinite scroll, whether scrolling up or down.  This allows you to\n         * 'prefetch' rows before the user actually runs out of scrolling.\n         *\n         * Note that if you set this value too high it may give jumpy scrolling behaviour, if you're getting\n         * this behaviour you could use the `saveScrollPercentageMethod` right before loading your data, and we'll\n         * preserve that scroll position\n         *\n         * <br> Defaults to 20\n         */\n        gridOptions.infiniteScrollRowsFromEnd = gridOptions.infiniteScrollRowsFromEnd || 20;\n\n        /**\n         * @ngdoc property\n         * @name infiniteScrollUp\n         * @propertyOf ui.grid.class:GridOptions\n         * @description Whether you allow infinite scroll up, implying that the first page of data\n         * you have displayed is in the middle of your data set.  If set to true then we trigger the\n         * needMoreDataTop event when the user hits the top of the scrollbar.\n         * <br> Defaults to false\n         */\n        gridOptions.infiniteScrollUp = gridOptions.infiniteScrollUp === true;\n\n        /**\n         * @ngdoc property\n         * @name infiniteScrollDown\n         * @propertyOf ui.grid.class:GridOptions\n         * @description Whether you allow infinite scroll down, implying that the first page of data\n         * you have displayed is in the middle of your data set.  If set to true then we trigger the\n         * needMoreData event when the user hits the bottom of the scrollbar.\n         * <br> Defaults to true\n         */\n        gridOptions.infiniteScrollDown = gridOptions.infiniteScrollDown !== false;\n      },\n\n\n      /**\n       * @ngdoc function\n       * @name setScrollDirections\n       * @methodOf ui.grid.infiniteScroll.service:uiGridInfiniteScrollService\n       * @description Sets the scrollUp and scrollDown flags, handling nulls and undefined,\n       * and also sets the grid.suppressParentScroll\n       * @param {grid} grid the grid we're operating on\n       * @param {boolean} scrollUp whether there are pages available up - defaults to false\n       * @param {boolean} scrollDown whether there are pages available down - defaults to true\n       */\n      setScrollDirections:  function ( grid, scrollUp, scrollDown ) {\n        grid.infiniteScroll.scrollUp = ( scrollUp === true );\n        grid.suppressParentScrollUp = ( scrollUp === true );\n\n        grid.infiniteScroll.scrollDown = ( scrollDown !== false);\n        grid.suppressParentScrollDown = ( scrollDown !== false);\n      },\n\n\n      /**\n       * @ngdoc function\n       * @name handleScroll\n       * @methodOf ui.grid.infiniteScroll.service:uiGridInfiniteScrollService\n       * @description Called whenever the grid scrolls, determines whether the scroll should\n       * trigger an infinite scroll request for more data\n       * @param {object} args the args from the event\n       */\n      handleScroll:  function (args) {\n        // don't request data if already waiting for data, or if source is coming from ui.grid.adjustInfiniteScrollPosition() function\n        if ( args.grid.infiniteScroll && args.grid.infiniteScroll.dataLoading || args.source === 'ui.grid.adjustInfiniteScrollPosition' ) {\n          return;\n        }\n\n        if (args.y) {\n\n          // If the user is scrolling very quickly all the way to the top/bottom, the scroll handler can get confused\n          // about the direction. First we check if they've gone all the way, and data always is loaded in this case.\n          if (args.y.percentage === 0) {\n            args.grid.scrollDirection = uiGridConstants.scrollDirection.UP;\n            service.loadData(args.grid);\n          }\n          else if (args.y.percentage === 1) {\n            args.grid.scrollDirection = uiGridConstants.scrollDirection.DOWN;\n            service.loadData(args.grid);\n          }\n          else { // Scroll position is somewhere in between top/bottom, so determine whether it's far enough to load more data.\n            var percentage,\n              targetPercentage = args.grid.options.infiniteScrollRowsFromEnd / args.grid.renderContainers.body.visibleRowCache.length;\n\n            if (args.grid.scrollDirection === uiGridConstants.scrollDirection.UP ) {\n              percentage = args.y.percentage;\n              if (percentage <= targetPercentage) {\n                service.loadData(args.grid);\n              }\n            }\n            else if (args.grid.scrollDirection === uiGridConstants.scrollDirection.DOWN) {\n              percentage = 1 - args.y.percentage;\n              if (percentage <= targetPercentage) {\n                service.loadData(args.grid);\n              }\n            }\n          }\n        }\n      },\n\n\n      /**\n       * @ngdoc function\n       * @name loadData\n       * @methodOf ui.grid.infiniteScroll.service:uiGridInfiniteScrollService\n       * @description This function fires 'needLoadMoreData' or 'needLoadMoreDataTop' event based on scrollDirection\n       * and whether there are more pages upwards or downwards.  It also stores the number of rows that we had previously,\n       * and clears out any saved scroll position so that we know whether or not the user calls `saveScrollPercentage`\n       * @param {Grid} grid the grid we're working on\n       */\n      loadData: function (grid) {\n        // save number of currently visible rows to calculate new scroll position later - we know that we want\n        // to be at approximately the row we're currently at\n        grid.infiniteScroll.previousVisibleRows = grid.renderContainers.body.visibleRowCache.length;\n        grid.infiniteScroll.direction = grid.scrollDirection;\n        delete grid.infiniteScroll.prevScrollTop;\n\n        if (grid.scrollDirection === uiGridConstants.scrollDirection.UP && grid.infiniteScroll.scrollUp) {\n          grid.infiniteScroll.dataLoading = true;\n          grid.api.infiniteScroll.raise.needLoadMoreDataTop();\n        }\n        else if (grid.scrollDirection === uiGridConstants.scrollDirection.DOWN && grid.infiniteScroll.scrollDown) {\n          if (grid.cellNav && grid.cellNav.lastRowCol && grid.cellNav.lastRowCol.row.index === grid.infiniteScroll.previousVisibleRows - 1) {\n            return;\n          }\n          grid.infiniteScroll.dataLoading = true;\n          grid.api.infiniteScroll.raise.needLoadMoreData();\n        }\n      },\n\n\n      /**\n       * @ngdoc function\n       * @name adjustScroll\n       * @methodOf ui.grid.infiniteScroll.service:uiGridInfiniteScrollService\n       * @description Once we are informed that data has been loaded, adjust the scroll position to account for that\n       * addition and to make things look clean.\n       *\n       * If we're scrolling up we scroll to the first row of the old data set -\n       * so we're assuming that you would have gotten to the top of the grid (from the 20% need more data trigger) by\n       * the time the data comes back.  If we're scrolling down we scroll to the last row of the old data set - so we're\n       * assuming that you would have gotten to the bottom of the grid (from the 80% need more data trigger) by the time\n       * the data comes back.\n       *\n       * Neither of these are good assumptions, but making this a smoother experience really requires\n       * that trigger to not be a percentage, and to be much closer to the end of the data (say, 5 rows off the end).  Even then\n       * it'd be better still to actually run into the end.  But if the data takes a while to come back, they may have scrolled\n       * somewhere else in the mean-time, in which case they'll get a jump back to the new data.  Anyway, this will do for\n       * now, until someone wants to do better.\n       * @param {Grid} grid the grid we're working on\n       * @returns {promise} a promise that is resolved when scrolling has finished\n       */\n      adjustScroll: function(grid) {\n        var promise = $q.defer();\n        $rootScope.$applyAsync(function () {\n          var viewportHeight, rowHeight, newVisibleRows, oldTop, newTop;\n\n          viewportHeight = grid.getViewportHeight() + grid.headerHeight - grid.renderContainers.body.headerHeight - grid.scrollbarHeight;\n          rowHeight = grid.options.rowHeight;\n\n          if ( grid.infiniteScroll.direction === undefined ) {\n            // called from initialize, tweak our scroll up a little\n            service.adjustInfiniteScrollPosition(grid, 0);\n          }\n\n          newVisibleRows = grid.getVisibleRowCount();\n\n          // in case not enough data is loaded to enable scroller - load more data\n          var canvasHeight = rowHeight * newVisibleRows;\n          if (grid.infiniteScroll.scrollDown && (viewportHeight > canvasHeight)) {\n            grid.api.infiniteScroll.raise.needLoadMoreData();\n          }\n\n          if ( grid.infiniteScroll.direction === uiGridConstants.scrollDirection.UP ) {\n            oldTop = grid.infiniteScroll.prevScrollTop || 0;\n            newTop = oldTop + (newVisibleRows - grid.infiniteScroll.previousVisibleRows)*rowHeight;\n            service.adjustInfiniteScrollPosition(grid, newTop);\n            $rootScope.$applyAsync( function() {\n              promise.resolve();\n            });\n          }\n\n          if ( grid.infiniteScroll.direction === uiGridConstants.scrollDirection.DOWN ) {\n            newTop = grid.infiniteScroll.prevScrollTop || (grid.infiniteScroll.previousVisibleRows*rowHeight - viewportHeight);\n            service.adjustInfiniteScrollPosition(grid, newTop);\n            $rootScope.$applyAsync( function() {\n              promise.resolve();\n            });\n          }\n        }, 0);\n\n        return promise.promise;\n      },\n\n\n      /**\n       * @ngdoc function\n       * @name adjustInfiniteScrollPosition\n       * @methodOf ui.grid.infiniteScroll.service:uiGridInfiniteScrollService\n       * @description This function fires 'needLoadMoreData' or 'needLoadMoreDataTop' event based on scrollDirection\n       * @param {Grid} grid the grid we're working on\n       * @param {number} scrollTop the position through the grid that we want to scroll to\n       */\n      adjustInfiniteScrollPosition: function (grid, scrollTop) {\n        var scrollEvent = new ScrollEvent(grid, null, null, 'ui.grid.adjustInfiniteScrollPosition'),\n          visibleRows = grid.getVisibleRowCount(),\n          viewportHeight = grid.getViewportHeight() + grid.headerHeight - grid.renderContainers.body.headerHeight - grid.scrollbarHeight,\n          rowHeight = grid.options.rowHeight,\n          scrollHeight = visibleRows*rowHeight-viewportHeight;\n\n        // for infinite scroll, if there are pages upwards then never allow it to be at the zero position so the up button can be active\n        if (scrollTop === 0 && grid.infiniteScroll.scrollUp) {\n          // using pixels results in a relative scroll, hence we have to use percentage\n          scrollEvent.y = {pixels: 1};\n        }\n        else {\n          scrollEvent.y = {percentage: scrollTop/scrollHeight};\n        }\n        grid.scrollContainers('', scrollEvent);\n      },\n\n\n      /**\n       * @ngdoc function\n       * @name dataRemovedTop\n       * @methodOf ui.grid.infiniteScroll.api:PublicAPI\n       * @description Adjusts the scroll position after you've removed data at the top. You should\n       * have called `saveScrollPercentage` before you remove the data, and if you're doing this in\n       * response to a `needMoreData` you should wait until the promise from `loadData` has resolved\n       * before you start removing data\n       * @param {Grid} grid the grid we're working on\n       * @param {boolean} scrollUp flag that there are pages upwards, fire\n       * infinite scroll events upward\n       * @param {boolean} scrollDown flag that there are pages downwards, so\n       * fire infinite scroll events downward\n       */\n      dataRemovedTop: function( grid, scrollUp, scrollDown ) {\n        var newVisibleRows, oldTop, newTop, rowHeight;\n        service.setScrollDirections( grid, scrollUp, scrollDown );\n\n        newVisibleRows = grid.renderContainers.body.visibleRowCache.length;\n        oldTop = grid.infiniteScroll.prevScrollTop;\n        rowHeight = grid.options.rowHeight;\n\n        // since we removed from the top, our new scroll row will be the old scroll row less the number\n        // of rows removed\n        newTop = oldTop - ( grid.infiniteScroll.previousVisibleRows - newVisibleRows )*rowHeight;\n\n        service.adjustInfiniteScrollPosition( grid, newTop );\n      },\n\n      /**\n       * @ngdoc function\n       * @name dataRemovedBottom\n       * @methodOf ui.grid.infiniteScroll.api:PublicAPI\n       * @description Adjusts the scroll position after you've removed data at the bottom.  You should\n       * have called `saveScrollPercentage` before you remove the data, and if you're doing this in\n       * response to a `needMoreData` you should wait until the promise from `loadData` has resolved\n       * before you start removing data\n       * @param {Grid} grid the grid we're working on\n       * @param {boolean} scrollUp flag that there are pages upwards, fire\n       * infinite scroll events upward\n       * @param {boolean} scrollDown flag that there are pages downwards, so\n       * fire infinite scroll events downward\n       */\n      dataRemovedBottom: function( grid, scrollUp, scrollDown ) {\n        var newTop;\n\n        service.setScrollDirections( grid, scrollUp, scrollDown );\n\n        newTop = grid.infiniteScroll.prevScrollTop;\n\n        service.adjustInfiniteScrollPosition( grid, newTop );\n      }\n    };\n    return service;\n  }]);\n  /**\n   *  @ngdoc directive\n   *  @name ui.grid.infiniteScroll.directive:uiGridInfiniteScroll\n   *  @element div\n   *  @restrict A\n   *\n   *  @description Adds infinite scroll features to grid\n   *\n   *  @example\n   <example module=\"app\">\n   <file name=\"app.js\">\n   var app = angular.module('app', ['ui.grid', 'ui.grid.infiniteScroll']);\n\n   app.controller('MainCtrl', ['$scope', function ($scope) {\n      $scope.data = [\n        { name: 'Alex', car: 'Toyota' },\n            { name: 'Sam', car: 'Lexus' }\n      ];\n\n      $scope.columnDefs = [\n        {name: 'name'},\n        {name: 'car'}\n      ];\n    }]);\n   </file>\n   <file name=\"index.ced81ed4.html\">\n   <div ng-controller=\"MainCtrl\">\n   <div ui-grid=\"{ data: data, columnDefs: columnDefs }\" ui-grid-infinite-scroll=\"20\"></div>\n   </div>\n   </file>\n   </example>\n   */\n\n  module.directive('uiGridInfiniteScroll', ['uiGridInfiniteScrollService',\n    function (uiGridInfiniteScrollService) {\n      return {\n        priority: -200,\n        scope: false,\n        require: '^uiGrid',\n        compile: function() {\n          return {\n            pre: function($scope, $elm, $attr, uiGridCtrl) {\n              uiGridInfiniteScrollService.initializeGrid(uiGridCtrl.grid, $scope);\n            },\n            post: function($scope, $elm, $attr) {\n            }\n          };\n        }\n      };\n    }]);\n})();\n\n(function () {\n  'use strict';\n\n  /**\n   * @ngdoc overview\n   * @name ui.grid.moveColumns\n   * @description\n   *\n   * # ui.grid.moveColumns\n   *\n   * <div class=\"alert alert-warning\" role=\"alert\"><strong>Alpha</strong> This feature is in development. There will almost certainly be breaking api changes, or there are major outstanding bugs.</div>\n   *\n   * This module provides column moving capability to ui.grid. It enables to change the position of columns.\n   * <div doc-module-components=\"ui.grid.moveColumns\"></div>\n   */\n  var module = angular.module('ui.grid.moveColumns', ['ui.grid']);\n\n  /**\n   *  @ngdoc service\n   *  @name ui.grid.moveColumns.service:uiGridMoveColumnService\n   *  @description Service for column moving feature.\n   */\n  module.service('uiGridMoveColumnService', ['$q', '$rootScope', '$log', 'ScrollEvent', 'uiGridConstants', 'gridUtil', function ($q, $rootScope, $log, ScrollEvent, uiGridConstants, gridUtil) {\n    var service = {\n      initializeGrid: function (grid) {\n        var self = this;\n        this.registerPublicApi(grid);\n        this.defaultGridOptions(grid.options);\n        grid.moveColumns = {orderCache: []}; // Used to cache the order before columns are rebuilt\n        grid.registerColumnBuilder(self.movableColumnBuilder);\n        grid.registerDataChangeCallback(self.verifyColumnOrder, [uiGridConstants.dataChange.COLUMN]);\n      },\n      registerPublicApi: function (grid) {\n        var self = this;\n        /**\n         *  @ngdoc object\n         *  @name ui.grid.moveColumns.api:PublicApi\n         *  @description Public Api for column moving feature.\n         */\n        var publicApi = {\n          events: {\n            /**\n             * @ngdoc event\n             * @name columnPositionChanged\n             * @eventOf  ui.grid.moveColumns.api:PublicApi\n             * @description raised when column is moved\n             * <pre>\n             *      gridApi.colMovable.on.columnPositionChanged(scope,function(colDef, originalPosition, newPosition) {})\n             * </pre>\n             * @param {object} colDef the column that was moved\n             * @param {integer} originalPosition of the column\n             * @param {integer} finalPosition of the column\n             */\n            colMovable: {\n              columnPositionChanged: function (colDef, originalPosition, newPosition) {\n              }\n            }\n          },\n          methods: {\n            /**\n             * @ngdoc method\n             * @name moveColumn\n             * @methodOf  ui.grid.moveColumns.api:PublicApi\n             * @description Method can be used to change column position.\n             * <pre>\n             *      gridApi.colMovable.moveColumn(oldPosition, newPosition)\n             * </pre>\n             * @param {integer} originalPosition of the column\n             * @param {integer} finalPosition of the column\n             */\n            colMovable: {\n              moveColumn: function (originalPosition, finalPosition) {\n                var columns = grid.columns;\n                if (!angular.isNumber(originalPosition) || !angular.isNumber(finalPosition)) {\n                  gridUtil.logError('MoveColumn: Please provide valid values for originalPosition and finalPosition');\n                  return;\n                }\n                var nonMovableColumns = 0;\n                for (var i = 0; i < columns.length; i++) {\n                  if ((angular.isDefined(columns[i].colDef.visible) && columns[i].colDef.visible === false) || columns[i].isRowHeader === true) {\n                    nonMovableColumns++;\n                  }\n                }\n                if (originalPosition >= (columns.length - nonMovableColumns) || finalPosition >= (columns.length - nonMovableColumns)) {\n                  gridUtil.logError('MoveColumn: Invalid values for originalPosition, finalPosition');\n                  return;\n                }\n                var findPositionForRenderIndex = function (index) {\n                  var position = index;\n                  for (var i = 0; i <= position; i++) {\n                    if (angular.isDefined(columns[i]) && ((angular.isDefined(columns[i].colDef.visible) && columns[i].colDef.visible === false) || columns[i].isRowHeader === true)) {\n                      position++;\n                    }\n                  }\n                  return position;\n                };\n                self.redrawColumnAtPosition(grid, findPositionForRenderIndex(originalPosition), findPositionForRenderIndex(finalPosition));\n              }\n            }\n          }\n        };\n        grid.api.registerEventsFromObject(publicApi.events);\n        grid.api.registerMethodsFromObject(publicApi.methods);\n      },\n      defaultGridOptions: function (gridOptions) {\n        /**\n         *  @ngdoc object\n         *  @name ui.grid.moveColumns.api:GridOptions\n         *\n         *  @description Options for configuring the move column feature, these are available to be\n         *  set using the ui-grid {@link ui.grid.class:GridOptions gridOptions}\n         */\n        /**\n         *  @ngdoc object\n         *  @name enableColumnMoving\n         *  @propertyOf  ui.grid.moveColumns.api:GridOptions\n         *  @description If defined, sets the default value for the colMovable flag on each individual colDefs\n         *  if their individual enableColumnMoving configuration is not defined. Defaults to true.\n         */\n        gridOptions.enableColumnMoving = gridOptions.enableColumnMoving !== false;\n      },\n      movableColumnBuilder: function (colDef, col, gridOptions) {\n        var promises = [];\n        /**\n         *  @ngdoc object\n         *  @name ui.grid.moveColumns.api:ColumnDef\n         *\n         *  @description Column Definition for move column feature, these are available to be\n         *  set using the ui-grid {@link ui.grid.class:GridOptions.columnDef gridOptions.columnDefs}\n         */\n        /**\n         *  @ngdoc object\n         *  @name enableColumnMoving\n         *  @propertyOf  ui.grid.moveColumns.api:ColumnDef\n         *  @description Enable column moving for the column.\n         */\n        colDef.enableColumnMoving = colDef.enableColumnMoving === undefined ? gridOptions.enableColumnMoving\n          : colDef.enableColumnMoving;\n        return $q.all(promises);\n      },\n      /**\n       * @ngdoc method\n       * @name updateColumnCache\n       * @methodOf  ui.grid.moveColumns\n       * @description Cache the current order of columns, so we can restore them after new columnDefs are defined\n       */\n      updateColumnCache: function(grid) {\n        grid.moveColumns.orderCache = grid.getOnlyDataColumns();\n      },\n      /**\n       * @ngdoc method\n       * @name verifyColumnOrder\n       * @methodOf  ui.grid.moveColumns\n       * @description dataChangeCallback which uses the cached column order to restore the column order\n       * when it is reset by altering the columnDefs array.\n       */\n      verifyColumnOrder: function(grid) {\n        var headerRowOffset = grid.rowHeaderColumns.length;\n        var newIndex;\n\n        angular.forEach(grid.moveColumns.orderCache, function(cacheCol, cacheIndex) {\n          newIndex = grid.columns.indexOf(cacheCol);\n          if ( newIndex !== -1 && newIndex - headerRowOffset !== cacheIndex ) {\n            var column = grid.columns.splice(newIndex, 1)[0];\n            grid.columns.splice(cacheIndex + headerRowOffset, 0, column);\n          }\n        });\n      },\n      redrawColumnAtPosition: function (grid, originalPosition, newPosition) {\n        var columns = grid.columns;\n\n        if (originalPosition === newPosition) {\n          return;\n        }\n\n        // check columns in between move-range to make sure they are visible columns\n        var pos = (originalPosition < newPosition) ? originalPosition + 1 : originalPosition - 1;\n        var i0 = Math.min(pos, newPosition);\n        for (i0; i0 <= Math.max(pos, newPosition); i0++) {\n          if (columns[i0].visible) {\n            break;\n          }\n        }\n        if (i0 > Math.max(pos, newPosition)) {\n          // no visible column found, column did not visibly move\n          return;\n        }\n\n        var originalColumn = columns[originalPosition];\n        if (originalColumn.colDef.enableColumnMoving) {\n          if (originalPosition > newPosition) {\n            for (var i1 = originalPosition; i1 > newPosition; i1--) {\n              columns[i1] = columns[i1 - 1];\n            }\n          }\n          else if (newPosition > originalPosition) {\n            for (var i2 = originalPosition; i2 < newPosition; i2++) {\n              columns[i2] = columns[i2 + 1];\n            }\n          }\n          columns[newPosition] = originalColumn;\n          service.updateColumnCache(grid);\n          grid.queueGridRefresh();\n          $rootScope.$applyAsync(function () {\n            grid.api.core.notifyDataChange( uiGridConstants.dataChange.COLUMN );\n            grid.api.colMovable.raise.columnPositionChanged(originalColumn.colDef, originalPosition, newPosition);\n          });\n        }\n      }\n    };\n    return service;\n  }]);\n\n  /**\n   *  @ngdoc directive\n   *  @name ui.grid.moveColumns.directive:uiGridMoveColumns\n   *  @element div\n   *  @restrict A\n   *  @description Adds column moving features to the ui-grid directive.\n   *  @example\n   <example module=\"app\">\n   <file name=\"app.js\">\n   var app = angular.module('app', ['ui.grid', 'ui.grid.moveColumns']);\n   app.controller('MainCtrl', ['$scope', function ($scope) {\n        $scope.data = [\n          { name: 'Bob', title: 'CEO', age: 45 },\n          { name: 'Frank', title: 'Lowly Developer', age: 25 },\n          { name: 'Jenny', title: 'Highly Developer', age: 35 }\n        ];\n        $scope.columnDefs = [\n          {name: 'name'},\n          {name: 'title'},\n          {name: 'age'}\n        ];\n      }]);\n   </file>\n   <file name=\"main.css\">\n   .grid {\n      width: 100%;\n      height: 150px;\n    }\n   </file>\n   <file name=\"index.ced81ed4.html\">\n   <div ng-controller=\"MainCtrl\">\n   <div class=\"grid\" ui-grid=\"{ data: data, columnDefs: columnDefs }\" ui-grid-move-columns></div>\n   </div>\n   </file>\n   </example>\n   */\n  module.directive('uiGridMoveColumns', ['uiGridMoveColumnService', function (uiGridMoveColumnService) {\n    return {\n      replace: true,\n      priority: 0,\n      require: '^uiGrid',\n      scope: false,\n      compile: function () {\n        return {\n          pre: function ($scope, $elm, $attrs, uiGridCtrl) {\n            uiGridMoveColumnService.initializeGrid(uiGridCtrl.grid);\n          },\n          post: function ($scope, $elm, $attrs, uiGridCtrl) {\n          }\n        };\n      }\n    };\n  }]);\n\n  /**\n   *  @ngdoc directive\n   *  @name ui.grid.moveColumns.directive:uiGridHeaderCell\n   *  @element div\n   *  @restrict A\n   *\n   *  @description Stacks on top of ui.grid.uiGridHeaderCell to provide capability to be able to move it to reposition column.\n   *\n   *  On receiving mouseDown event headerCell is cloned, now as the mouse moves the cloned header cell also moved in the grid.\n   *  In case the moving cloned header cell reaches the left or right extreme of grid, grid scrolling is triggered (if horizontal scroll exists).\n   *  On mouseUp event column is repositioned at position where mouse is released and cloned header cell is removed.\n   *\n   *  Events that invoke cloning of header cell:\n   *    - mousedown\n   *\n   *  Events that invoke movement of cloned header cell:\n   *    - mousemove\n   *\n   *  Events that invoke repositioning of column:\n   *    - mouseup\n   */\n  module.directive('uiGridHeaderCell', ['$q', 'gridUtil', 'uiGridMoveColumnService', '$document', '$log', 'uiGridConstants', 'ScrollEvent',\n    function ($q, gridUtil, uiGridMoveColumnService, $document, $log, uiGridConstants, ScrollEvent) {\n      return {\n        priority: -10,\n        require: '^uiGrid',\n        compile: function () {\n          return {\n            post: function ($scope, $elm, $attrs, uiGridCtrl) {\n\n              if ($scope.col.colDef.enableColumnMoving) {\n\n                /*\n                 * Our general approach to column move is that we listen to a touchstart or mousedown\n                 * event over the column header.  When we hear one, then we wait for a move of the same type\n                 * - if we are a touchstart then we listen for a touchmove, if we are a mousedown we listen for\n                 * a mousemove (i.e. a drag) before we decide that there's a move underway.  If there's never a move,\n                 * and we instead get a mouseup or a touchend, then we just drop out again and do nothing.\n                 *\n                 */\n                var $contentsElm = angular.element( $elm[0].querySelectorAll('.ui-grid-cell-contents') );\n\n                var gridLeft;\n                var previousMouseX;\n                var totalMouseMovement;\n                var rightMoveLimit;\n                var elmCloned = false;\n                var movingElm;\n                var reducedWidth;\n                var moveOccurred = false;\n\n                var downFn = function( event ) {\n                  // Setting some variables required for calculations.\n                  gridLeft = $scope.grid.element[0].getBoundingClientRect().left;\n                  if ( $scope.grid.hasLeftContainer() ) {\n                    gridLeft += $scope.grid.renderContainers.left.header[0].getBoundingClientRect().width;\n                  }\n\n                  previousMouseX = event.pageX || (event.originalEvent ? event.originalEvent.pageX : 0);\n                  totalMouseMovement = 0;\n                  rightMoveLimit = gridLeft + $scope.grid.getViewportWidth();\n\n                  if ( event.type === 'mousedown' ) {\n                    $document.on('mousemove', moveFn);\n                    $document.on('mouseup', upFn);\n                  }\n                  else if ( event.type === 'touchstart' ) {\n                    $document.on('touchmove', moveFn);\n                    $document.on('touchend', upFn);\n                  }\n                };\n\n                var moveFn = function( event ) {\n                  var pageX = event.pageX || (event.originalEvent ? event.originalEvent.pageX : 0);\n                  var changeValue = pageX - previousMouseX;\n                  if ( changeValue === 0 ) { return; }\n                  // Disable text selection in Chrome during column move\n                  document.onselectstart = function() { return false; };\n\n                  moveOccurred = true;\n\n                  if (!elmCloned) {\n                    cloneElement();\n                  }\n                  else if (elmCloned) {\n                    moveElement(changeValue);\n                    previousMouseX = pageX;\n                  }\n                };\n\n                var upFn = function( event ) {\n                  // Re-enable text selection after column move\n                  document.onselectstart = null;\n\n                  // Remove the cloned element on mouse up.\n                  if (movingElm) {\n                    movingElm.remove();\n                    elmCloned = false;\n                  }\n\n                  offAllEvents();\n                  onDownEvents();\n\n                  if (!moveOccurred) {\n                    return;\n                  }\n\n                  var columns = $scope.grid.columns;\n                  var columnIndex = 0;\n                  for (var i = 0; i < columns.length; i++) {\n                    if (columns[i].colDef.name !== $scope.col.colDef.name) {\n                      columnIndex++;\n                    }\n                    else {\n                      break;\n                    }\n                  }\n\n                  var targetIndex;\n\n                  // Case where column should be moved to a position on its left\n                  if (totalMouseMovement < 0) {\n                    var totalColumnsLeftWidth = 0;\n                    var il;\n                    if ( $scope.grid.isRTL() ) {\n                      for (il = columnIndex + 1; il < columns.length; il++) {\n                        if (angular.isUndefined(columns[il].colDef.visible) || columns[il].colDef.visible === true) {\n                          totalColumnsLeftWidth += columns[il].drawnWidth || columns[il].width || columns[il].colDef.width;\n                          if (totalColumnsLeftWidth > Math.abs(totalMouseMovement)) {\n                            uiGridMoveColumnService.redrawColumnAtPosition\n                            ($scope.grid, columnIndex, il - 1);\n                            break;\n                          }\n                        }\n                      }\n                    }\n                    else {\n                      for (il = columnIndex - 1; il >= 0; il--) {\n                        if (angular.isUndefined(columns[il].colDef.visible) || columns[il].colDef.visible === true) {\n                          totalColumnsLeftWidth += columns[il].drawnWidth || columns[il].width || columns[il].colDef.width;\n                          if (totalColumnsLeftWidth > Math.abs(totalMouseMovement)) {\n                            uiGridMoveColumnService.redrawColumnAtPosition\n                            ($scope.grid, columnIndex, il + 1);\n                            break;\n                          }\n                        }\n                      }\n                    }\n\n                    // Case where column should be moved to beginning (or end in RTL) of the grid.\n                    if (totalColumnsLeftWidth < Math.abs(totalMouseMovement)) {\n                      targetIndex = 0;\n                      if ( $scope.grid.isRTL() ) {\n                        targetIndex = columns.length - 1;\n                      }\n                      uiGridMoveColumnService.redrawColumnAtPosition\n                      ($scope.grid, columnIndex, targetIndex);\n                    }\n                  }\n\n                  // Case where column should be moved to a position on its right\n                  else if (totalMouseMovement > 0) {\n                    var totalColumnsRightWidth = 0;\n                    var ir;\n                    if ( $scope.grid.isRTL() ) {\n                      for (ir = columnIndex - 1; ir > 0; ir--) {\n                        if (angular.isUndefined(columns[ir].colDef.visible) || columns[ir].colDef.visible === true) {\n                          totalColumnsRightWidth += columns[ir].drawnWidth || columns[ir].width || columns[ir].colDef.width;\n                          if (totalColumnsRightWidth > totalMouseMovement) {\n                            uiGridMoveColumnService.redrawColumnAtPosition\n                            ($scope.grid, columnIndex, ir);\n                            break;\n                          }\n                        }\n                      }\n                    }\n                    else {\n                      for (ir = columnIndex + 1; ir < columns.length; ir++) {\n                        if (angular.isUndefined(columns[ir].colDef.visible) || columns[ir].colDef.visible === true) {\n                          totalColumnsRightWidth += columns[ir].drawnWidth || columns[ir].width || columns[ir].colDef.width;\n                          if (totalColumnsRightWidth > totalMouseMovement) {\n                            uiGridMoveColumnService.redrawColumnAtPosition\n                            ($scope.grid, columnIndex, ir - 1);\n                            break;\n                          }\n                        }\n                      }\n                    }\n\n\n                    // Case where column should be moved to end (or beginning in RTL) of the grid.\n                    if (totalColumnsRightWidth < totalMouseMovement) {\n                      targetIndex = columns.length - 1;\n                      if ( $scope.grid.isRTL() ) {\n                        targetIndex = 0;\n                      }\n                      uiGridMoveColumnService.redrawColumnAtPosition\n                      ($scope.grid, columnIndex, targetIndex);\n                    }\n                  }\n\n\n\n                };\n\n                var onDownEvents = function() {\n                  $contentsElm.on('touchstart', downFn);\n                  $contentsElm.on('mousedown', downFn);\n                };\n\n                var offAllEvents = function() {\n                  $contentsElm.off('touchstart', downFn);\n                  $contentsElm.off('mousedown', downFn);\n\n                  $document.off('mousemove', moveFn);\n                  $document.off('touchmove', moveFn);\n\n                  $document.off('mouseup', upFn);\n                  $document.off('touchend', upFn);\n                };\n\n                onDownEvents();\n\n\n                var cloneElement = function () {\n                  elmCloned = true;\n\n                  // Cloning header cell and appending to current header cell.\n                  movingElm = $elm.clone();\n                  $elm.parent().append(movingElm);\n\n                  // Left of cloned element should be aligned to original header cell.\n                  movingElm.addClass('movingColumn');\n                  var movingElementStyles = {};\n                  movingElementStyles.left = $elm[0].offsetLeft + 'px';\n                  var gridRight = $scope.grid.element[0].getBoundingClientRect().right;\n                  var elmRight = $elm[0].getBoundingClientRect().right;\n                  if (elmRight > gridRight) {\n                    reducedWidth = $scope.col.drawnWidth + (gridRight - elmRight);\n                    movingElementStyles.width = reducedWidth + 'px';\n                  }\n                  movingElm.css(movingElementStyles);\n                };\n\n                var moveElement = function (changeValue) {\n                  // Calculate total column width\n                  var columns = $scope.grid.columns;\n                  var totalColumnWidth = 0;\n                  for (var i = 0; i < columns.length; i++) {\n                    if (angular.isUndefined(columns[i].colDef.visible) || columns[i].colDef.visible === true) {\n                      totalColumnWidth += columns[i].drawnWidth || columns[i].width || columns[i].colDef.width;\n                    }\n                  }\n\n                  // Calculate new position of left of column\n                  var currentElmLeft = movingElm[0].getBoundingClientRect().left - 1;\n                  var currentElmRight = movingElm[0].getBoundingClientRect().right;\n                  var newElementLeft;\n\n                  newElementLeft = currentElmLeft - gridLeft + changeValue;\n                  newElementLeft = newElementLeft < rightMoveLimit ? newElementLeft : rightMoveLimit;\n\n                  // Update css of moving column to adjust to new left value or fire scroll in case column has reached edge of grid\n                  if ((currentElmLeft >= gridLeft || changeValue > 0) && (currentElmRight <= rightMoveLimit || changeValue < 0)) {\n                    movingElm.css({visibility: 'visible', 'left': (movingElm[0].offsetLeft +\n                    (newElementLeft < rightMoveLimit ? changeValue : (rightMoveLimit - currentElmLeft))) + 'px'});\n                  }\n                  else if (totalColumnWidth > Math.ceil(uiGridCtrl.grid.gridWidth)) {\n                    changeValue *= 8;\n                    var scrollEvent = new ScrollEvent($scope.col.grid, null, null, 'uiGridHeaderCell.moveElement');\n                    scrollEvent.x = {pixels: changeValue};\n                    scrollEvent.grid.scrollContainers('',scrollEvent);\n                  }\n\n                  // Calculate total width of columns on the left of the moving column and the mouse movement\n                  var totalColumnsLeftWidth = 0;\n                  for (var il = 0; il < columns.length; il++) {\n                    if (angular.isUndefined(columns[il].colDef.visible) || columns[il].colDef.visible === true) {\n                      if (columns[il].colDef.name !== $scope.col.colDef.name) {\n                        totalColumnsLeftWidth += columns[il].drawnWidth || columns[il].width || columns[il].colDef.width;\n                      }\n                      else {\n                        break;\n                      }\n                    }\n                  }\n                  if ($scope.newScrollLeft === undefined) {\n                    totalMouseMovement += changeValue;\n                  }\n                  else {\n                    totalMouseMovement = $scope.newScrollLeft + newElementLeft - totalColumnsLeftWidth;\n                  }\n\n                  // Increase width of moving column, in case the rightmost column was moved and its width was\n                  // decreased because of overflow\n                  if (reducedWidth < $scope.col.drawnWidth) {\n                    reducedWidth += Math.abs(changeValue);\n                    movingElm.css({'width': reducedWidth + 'px'});\n                  }\n                };\n\n                $scope.$on('$destroy', offAllEvents);\n              }\n            }\n          };\n        }\n      };\n    }]);\n})();\n\n(function() {\n  'use strict';\n\n  /**\n   * @ngdoc overview\n   * @name ui.grid.pagination\n   *\n   * @description\n   *\n   * # ui.grid.pagination\n   *\n   * <div class=\"alert alert-warning\" role=\"alert\"><strong>Alpha</strong> This feature is in development. There will almost certainly be breaking api changes, or there are major outstanding bugs.</div>\n   *\n   * This module provides pagination support to ui-grid\n   */\n  var module = angular.module('ui.grid.pagination', ['ng', 'ui.grid']);\n\n  /**\n   * @ngdoc service\n   * @name ui.grid.pagination.service:uiGridPaginationService\n   *\n   * @description Service for the pagination feature\n   */\n  module.service('uiGridPaginationService', ['gridUtil',\n    function (gridUtil) {\n      var service = {\n        /**\n         * @ngdoc method\n         * @name initializeGrid\n         * @methodOf ui.grid.pagination.service:uiGridPaginationService\n         * @description Attaches the service to a certain grid\n         * @param {Grid} grid The grid we want to work with\n         */\n        initializeGrid: function (grid) {\n          service.defaultGridOptions(grid.options);\n\n          /**\n          * @ngdoc object\n          * @name ui.grid.pagination.api:PublicAPI\n          *\n          * @description Public API for the pagination feature\n          */\n          var publicApi = {\n            events: {\n              pagination: {\n              /**\n               * @ngdoc event\n               * @name paginationChanged\n               * @eventOf ui.grid.pagination.api:PublicAPI\n               * @description This event fires when the pageSize or currentPage changes\n               * @param {int} currentPage requested page number\n               * @param {int} pageSize requested page size\n               */\n                paginationChanged: function (currentPage, pageSize) { }\n              }\n            },\n            methods: {\n              pagination: {\n                /**\n                 * @ngdoc method\n                 * @name getPage\n                 * @methodOf ui.grid.pagination.api:PublicAPI\n                 * @description Returns the number of the current page\n                 */\n                getPage: function () {\n                  return grid.options.enablePagination ? grid.options.paginationCurrentPage : null;\n                },\n                /**\n                 * @ngdoc method\n                 * @name getFirstRowIndex\n                 * @methodOf ui.grid.pagination.api:PublicAPI\n                 * @description Returns the index of the first row of the current page.\n                 */\n                getFirstRowIndex: function () {\n                  if (grid.options.useCustomPagination) {\n                    return grid.options.paginationPageSizes.reduce(function(result, size, index) {\n                      return index < grid.options.paginationCurrentPage - 1 ? result + size : result;\n                    }, 0);\n                  }\n                  return ((grid.options.paginationCurrentPage - 1) * grid.options.paginationPageSize);\n                },\n                /**\n                 * @ngdoc method\n                 * @name getLastRowIndex\n                 * @methodOf ui.grid.pagination.api:PublicAPI\n                 * @description Returns the index of the last row of the current page.\n                 */\n                getLastRowIndex: function () {\n                  if (grid.options.useCustomPagination) {\n                    return publicApi.methods.pagination.getFirstRowIndex() + grid.options.paginationPageSizes[grid.options.paginationCurrentPage - 1] - 1;\n                  }\n                  return Math.min(grid.options.paginationCurrentPage * grid.options.paginationPageSize, grid.options.totalItems) - 1;\n                },\n                /**\n                 * @ngdoc method\n                 * @name getTotalPages\n                 * @methodOf ui.grid.pagination.api:PublicAPI\n                 * @description Returns the total number of pages\n                 */\n                getTotalPages: function () {\n                  if (!grid.options.enablePagination) {\n                    return null;\n                  }\n\n                  if (grid.options.useCustomPagination) {\n                    return grid.options.paginationPageSizes.length;\n                  }\n\n                  return (grid.options.totalItems === 0) ? 1 : Math.ceil(grid.options.totalItems / grid.options.paginationPageSize);\n                },\n                /**\n                 * @ngdoc method\n                 * @name nextPage\n                 * @methodOf ui.grid.pagination.api:PublicAPI\n                 * @description Moves to the next page, if possible\n                 */\n                nextPage: function () {\n                  if (!grid.options.enablePagination) {\n                    return;\n                  }\n\n                  if (grid.options.totalItems > 0) {\n                    grid.options.paginationCurrentPage = Math.min(\n                      grid.options.paginationCurrentPage + 1,\n                      publicApi.methods.pagination.getTotalPages()\n                    );\n                  }\n                  else {\n                    grid.options.paginationCurrentPage++;\n                  }\n                },\n                /**\n                 * @ngdoc method\n                 * @name previousPage\n                 * @methodOf ui.grid.pagination.api:PublicAPI\n                 * @description Moves to the previous page, if we're not on the first page\n                 */\n                previousPage: function () {\n                  if (!grid.options.enablePagination) {\n                    return;\n                  }\n\n                  grid.options.paginationCurrentPage = Math.max(grid.options.paginationCurrentPage - 1, 1);\n                },\n                /**\n                 * @ngdoc method\n                 * @name seek\n                 * @methodOf ui.grid.pagination.api:PublicAPI\n                 * @description Moves to the requested page\n                 * @param {int} page The number of the page that should be displayed\n                 */\n                seek: function (page) {\n                  if (!grid.options.enablePagination) {\n                    return;\n                  }\n                  if (!angular.isNumber(page) || page < 1) {\n                    throw 'Invalid page number: ' + page;\n                  }\n\n                  grid.options.paginationCurrentPage = Math.min(page, publicApi.methods.pagination.getTotalPages());\n                }\n              }\n            }\n          };\n\n          grid.api.registerEventsFromObject(publicApi.events);\n          grid.api.registerMethodsFromObject(publicApi.methods);\n\n          var processPagination = function( renderableRows ) {\n            if (grid.options.useExternalPagination || !grid.options.enablePagination) {\n              return renderableRows;\n            }\n            // client side pagination\n            var pageSize = parseInt(grid.options.paginationPageSize, 10);\n            var currentPage = parseInt(grid.options.paginationCurrentPage, 10);\n\n            var visibleRows = renderableRows.filter(function (row) { return row.visible; });\n            grid.options.totalItems = visibleRows.length;\n\n            var firstRow = publicApi.methods.pagination.getFirstRowIndex();\n            var lastRow  = publicApi.methods.pagination.getLastRowIndex();\n\n            if (firstRow > visibleRows.length) {\n              currentPage = grid.options.paginationCurrentPage = 1;\n              firstRow = (currentPage - 1) * pageSize;\n            }\n            return visibleRows.slice(firstRow, lastRow + 1);\n          };\n\n          grid.registerRowsProcessor(processPagination, 900 );\n\n        },\n        defaultGridOptions: function (gridOptions) {\n          /**\n           * @ngdoc object\n           * @name ui.grid.pagination.api:GridOptions\n           *\n           * @description GridOptions for the pagination feature, these are available to be\n           * set using the ui-grid {@link ui.grid.class:GridOptions gridOptions}\n           */\n\n          /**\n           * @ngdoc property\n           * @name enablePagination\n           * @propertyOf ui.grid.pagination.api:GridOptions\n           * @description Enables pagination.  Defaults to true.\n           */\n          gridOptions.enablePagination = gridOptions.enablePagination !== false;\n          /**\n           * @ngdoc property\n           * @name enablePaginationControls\n           * @propertyOf ui.grid.pagination.api:GridOptions\n           * @description Enables the paginator at the bottom of the grid. Turn this off if you want to implement your\n           *              own controls outside the grid.\n           */\n          gridOptions.enablePaginationControls = gridOptions.enablePaginationControls !== false;\n          /**\n           * @ngdoc property\n           * @name useExternalPagination\n           * @propertyOf ui.grid.pagination.api:GridOptions\n           * @description Disables client side pagination. When true, handle the paginationChanged event and set data\n           *              and totalItems.  Defaults to `false`\n           */\n          gridOptions.useExternalPagination = gridOptions.useExternalPagination === true;\n\n          /**\n           * @ngdoc property\n           * @name useCustomPagination\n           * @propertyOf ui.grid.pagination.api:GridOptions\n           * @description Disables client-side pagination. When true, handle the `paginationChanged` event and set `data`,\n           *              `firstRowIndex`, `lastRowIndex`, and `totalItems`.  Defaults to `false`.\n           */\n          gridOptions.useCustomPagination = gridOptions.useCustomPagination === true;\n\n          /**\n           * @ngdoc property\n           * @name totalItems\n           * @propertyOf ui.grid.pagination.api:GridOptions\n           * @description Total number of items, set automatically when using client side pagination, but needs set by user\n           *              for server side pagination\n           */\n          if (gridUtil.isNullOrUndefined(gridOptions.totalItems)) {\n            gridOptions.totalItems = 0;\n          }\n          /**\n           * @ngdoc property\n           * @name paginationPageSizes\n           * @propertyOf ui.grid.pagination.api:GridOptions\n           * @description Array of page sizes, defaults to `[250, 500, 1000]`\n           */\n          if (gridUtil.isNullOrUndefined(gridOptions.paginationPageSizes)) {\n            gridOptions.paginationPageSizes = [250, 500, 1000];\n          }\n          /**\n           * @ngdoc property\n           * @name paginationPageSize\n           * @propertyOf ui.grid.pagination.api:GridOptions\n           * @description Page size, defaults to the first item in paginationPageSizes, or 0 if paginationPageSizes is empty\n           */\n          if (gridUtil.isNullOrUndefined(gridOptions.paginationPageSize)) {\n            if (gridOptions.paginationPageSizes.length > 0) {\n              gridOptions.paginationPageSize = gridOptions.paginationPageSizes[0];\n            }\n            else {\n              gridOptions.paginationPageSize = 0;\n            }\n          }\n          /**\n           * @ngdoc property\n           * @name paginationCurrentPage\n           * @propertyOf ui.grid.pagination.api:GridOptions\n           * @description Current page number, defaults to 1\n           */\n          if (gridUtil.isNullOrUndefined(gridOptions.paginationCurrentPage)) {\n            gridOptions.paginationCurrentPage = 1;\n          }\n\n          /**\n           * @ngdoc property\n           * @name paginationTemplate\n           * @propertyOf ui.grid.pagination.api:GridOptions\n           * @description A custom template for the pager, defaults to `ui-grid/pagination`\n           */\n          if (gridUtil.isNullOrUndefined(gridOptions.paginationTemplate)) {\n            gridOptions.paginationTemplate = 'ui-grid/pagination';\n          }\n        },\n        /**\n         * @ngdoc method\n         * @methodOf ui.grid.pagination.service:uiGridPaginationService\n         * @name uiGridPaginationService\n         * @description  Raises paginationChanged and calls refresh for client side pagination\n         * @param {Grid} grid the grid for which the pagination changed\n         * @param {int} currentPage requested page number\n         * @param {int} pageSize requested page size\n         */\n        onPaginationChanged: function (grid, currentPage, pageSize) {\n          grid.api.pagination.raise.paginationChanged(currentPage, pageSize);\n          if (!grid.options.useExternalPagination) {\n            grid.queueGridRefresh(); // client side pagination\n          }\n        }\n      };\n\n      return service;\n    }\n  ]);\n  /**\n   *  @ngdoc directive\n   *  @name ui.grid.pagination.directive:uiGridPagination\n   *  @element div\n   *  @restrict A\n   *\n   *  @description Adds pagination features to grid\n   *  @example\n   <example module=\"app\">\n   <file name=\"app.js\">\n   var app = angular.module('app', ['ui.grid', 'ui.grid.pagination']);\n\n   app.controller('MainCtrl', ['$scope', function ($scope) {\n      $scope.data = [\n        { name: 'Alex', car: 'Toyota' },\n        { name: 'Sam', car: 'Lexus' },\n        { name: 'Joe', car: 'Dodge' },\n        { name: 'Bob', car: 'Buick' },\n        { name: 'Cindy', car: 'Ford' },\n        { name: 'Brian', car: 'Audi' },\n        { name: 'Malcom', car: 'Mercedes Benz' },\n        { name: 'Dave', car: 'Ford' },\n        { name: 'Stacey', car: 'Audi' },\n        { name: 'Amy', car: 'Acura' },\n        { name: 'Scott', car: 'Toyota' },\n        { name: 'Ryan', car: 'BMW' },\n      ];\n\n      $scope.gridOptions = {\n        data: 'data',\n        paginationPageSizes: [5, 10, 25],\n        paginationPageSize: 5,\n        columnDefs: [\n          {name: 'name'},\n          {name: 'car'}\n        ]\n       }\n    }]);\n   </file>\n   <file name=\"index.ced81ed4.html\">\n   <div ng-controller=\"MainCtrl\">\n   <div ui-grid=\"gridOptions\" ui-grid-pagination></div>\n   </div>\n   </file>\n   </example>\n   */\n  module.directive('uiGridPagination', ['gridUtil', 'uiGridPaginationService',\n    function (gridUtil, uiGridPaginationService) {\n      return {\n        priority: -200,\n        scope: false,\n        require: 'uiGrid',\n        link: {\n          pre: function ($scope, $elm, $attr, uiGridCtrl) {\n            uiGridPaginationService.initializeGrid(uiGridCtrl.grid);\n\n            gridUtil.getTemplate(uiGridCtrl.grid.options.paginationTemplate)\n              .then(function (contents) {\n                var template = angular.element(contents);\n\n                $elm.append(template);\n                uiGridCtrl.innerCompile(template);\n              });\n          }\n        }\n      };\n    }\n  ]);\n\n  /**\n   *  @ngdoc directive\n   *  @name ui.grid.pagination.directive:uiGridPager\n   *  @element div\n   *\n   *  @description Panel for handling pagination\n   */\n  module.directive('uiGridPager', ['uiGridPaginationService', 'uiGridConstants', 'gridUtil', 'i18nService', 'i18nConstants',\n    function (uiGridPaginationService, uiGridConstants, gridUtil, i18nService, i18nConstants) {\n      return {\n        priority: -200,\n        scope: true,\n        require: '^uiGrid',\n        link: function ($scope, $elm, $attr, uiGridCtrl) {\n          var defaultFocusElementSelector = '.ui-grid-pager-control-input';\n\n          $scope.aria = i18nService.getSafeText('pagination.aria'); // Returns an object with all of the aria labels\n\n          var updateLabels = function() {\n            $scope.paginationApi = uiGridCtrl.grid.api.pagination;\n            $scope.sizesLabel = i18nService.getSafeText('pagination.sizes');\n            $scope.totalItemsLabel = i18nService.getSafeText('pagination.totalItems');\n            $scope.paginationOf = i18nService.getSafeText('pagination.of');\n            $scope.paginationThrough = i18nService.getSafeText('pagination.through');\n          };\n\n          updateLabels();\n\n          $scope.$on(i18nConstants.UPDATE_EVENT, updateLabels);\n\n          var options = uiGridCtrl.grid.options;\n\n          uiGridCtrl.grid.renderContainers.body.registerViewportAdjuster(function (adjustment) {\n            if (options.enablePaginationControls) {\n              adjustment.height = adjustment.height - gridUtil.elementHeight($elm, \"padding\");\n            }\n            return adjustment;\n          });\n\n          var dataChangeDereg = uiGridCtrl.grid.registerDataChangeCallback(function (grid) {\n            if (!grid.options.useExternalPagination) {\n              grid.options.totalItems = grid.rows.length;\n            }\n          }, [uiGridConstants.dataChange.ROW]);\n\n          $scope.$on('$destroy', dataChangeDereg);\n\n          var deregP = $scope.$watch('grid.options.paginationCurrentPage + grid.options.paginationPageSize', function (newValues, oldValues) {\n            if (newValues === oldValues || oldValues === undefined) {\n              return;\n            }\n\n            if (!angular.isNumber(options.paginationCurrentPage) || options.paginationCurrentPage < 1) {\n              options.paginationCurrentPage = 1;\n              return;\n            }\n\n            if (options.totalItems > 0 && options.paginationCurrentPage > $scope.paginationApi.getTotalPages()) {\n              options.paginationCurrentPage = $scope.paginationApi.getTotalPages();\n              return;\n            }\n\n            uiGridPaginationService.onPaginationChanged($scope.grid, options.paginationCurrentPage, options.paginationPageSize);\n          });\n\n          $scope.$on('$destroy', function() {\n            deregP();\n          });\n\n          $scope.cantPageForward = function () {\n            if ($scope.paginationApi.getTotalPages()) {\n              return $scope.cantPageToLast();\n            }\n            else {\n              return options.data.length < 1;\n            }\n          };\n\n          $scope.cantPageToLast = function () {\n            var totalPages = $scope.paginationApi.getTotalPages();\n\n            return !totalPages || options.paginationCurrentPage >= totalPages;\n          };\n\n          $scope.cantPageBackward = function () {\n            return options.paginationCurrentPage <= 1;\n          };\n\n          var focusToInputIf = function(condition) {\n            if (condition) {\n              gridUtil.focus.bySelector($elm, defaultFocusElementSelector);\n            }\n          };\n\n          // Takes care of setting focus to the middle element when focus is lost\n          $scope.pageFirstPageClick = function () {\n            $scope.paginationApi.seek(1);\n            focusToInputIf($scope.cantPageBackward());\n          };\n\n          $scope.pagePreviousPageClick = function () {\n            $scope.paginationApi.previousPage();\n            focusToInputIf($scope.cantPageBackward());\n          };\n\n          $scope.pageNextPageClick = function () {\n            $scope.paginationApi.nextPage();\n            focusToInputIf($scope.cantPageForward());\n          };\n\n          $scope.pageLastPageClick = function () {\n            $scope.paginationApi.seek($scope.paginationApi.getTotalPages());\n            focusToInputIf($scope.cantPageToLast());\n          };\n        }\n      };\n    }\n  ]);\n})();\n\n(function () {\n  'use strict';\n\n  /**\n   * @ngdoc overview\n   * @name ui.grid.pinning\n   * @description\n   *\n   * # ui.grid.pinning\n   *\n   * <div class=\"alert alert-success\" role=\"alert\"><strong>Stable</strong> This feature is stable. There should no longer be breaking api changes without a deprecation warning.</div>\n   *\n   * This module provides column pinning to the end user via menu options in the column header\n   *\n   * <div doc-module-components=\"ui.grid.pinning\"></div>\n   */\n\n  var module = angular.module('ui.grid.pinning', ['ui.grid']);\n\n  module.constant('uiGridPinningConstants', {\n    container: {\n      LEFT: 'left',\n      RIGHT: 'right',\n      NONE: ''\n    }\n  });\n\n  module.service('uiGridPinningService', ['gridUtil', 'GridRenderContainer', 'i18nService', 'uiGridPinningConstants', function (gridUtil, GridRenderContainer, i18nService, uiGridPinningConstants) {\n    var service = {\n\n      initializeGrid: function (grid) {\n        service.defaultGridOptions(grid.options);\n\n        // Register a column builder to add new menu items for pinning left and right\n        grid.registerColumnBuilder(service.pinningColumnBuilder);\n\n        /**\n         *  @ngdoc object\n         *  @name ui.grid.pinning.api:PublicApi\n         *\n         *  @description Public Api for pinning feature\n         */\n        var publicApi = {\n          events: {\n            pinning: {\n              /**\n               * @ngdoc event\n               * @name columnPinned\n               * @eventOf ui.grid.pinning.api:PublicApi\n               * @description raised when column pin state has changed\n               * <pre>\n               *   gridApi.pinning.on.columnPinned(scope, function(colDef){})\n               * </pre>\n               * @param {object} colDef the column that was changed\n               * @param {string} container the render container the column is in ('left', 'right', '')\n               */\n              columnPinned: function(colDef, container) {\n              }\n            }\n          },\n          methods: {\n            pinning: {\n              /**\n               * @ngdoc function\n               * @name pinColumn\n               * @methodOf ui.grid.pinning.api:PublicApi\n               * @description pin column left, right, or none\n               * <pre>\n               *   gridApi.pinning.pinColumn(col, uiGridPinningConstants.container.LEFT)\n               * </pre>\n               * @param {gridColumn} col the column being pinned\n               * @param {string} container one of the recognised types\n               * from uiGridPinningConstants\n               */\n              pinColumn: function(col, container) {\n                service.pinColumn(grid, col, container);\n              }\n            }\n          }\n        };\n\n        grid.api.registerEventsFromObject(publicApi.events);\n        grid.api.registerMethodsFromObject(publicApi.methods);\n      },\n\n      defaultGridOptions: function (gridOptions) {\n        // default option to true unless it was explicitly set to false\n        /**\n         *  @ngdoc object\n         *  @name ui.grid.pinning.api:GridOptions\n         *\n         *  @description GridOptions for pinning feature, these are available to be\n           *  set using the ui-grid {@link ui.grid.class:GridOptions gridOptions}\n         */\n\n        /**\n         *  @ngdoc object\n         *  @name enablePinning\n         *  @propertyOf  ui.grid.pinning.api:GridOptions\n         *  @description Enable pinning for the entire grid.\n         *  <br/>Defaults to true\n         */\n        gridOptions.enablePinning = gridOptions.enablePinning !== false;\n        /**\n         *  @ngdoc object\n         *  @name hidePinLeft\n         *  @propertyOf  ui.grid.pinning.api:GridOptions\n         *  @description Hide Pin Left for the entire grid.\n         *  <br/>Defaults to false\n         */\n        gridOptions.hidePinLeft = gridOptions.enablePinning && gridOptions.hidePinLeft;\n        /**\n         *  @ngdoc object\n         *  @name hidePinRight\n         *  @propertyOf  ui.grid.pinning.api:GridOptions\n         *  @description Hide Pin Right pinning for the entire grid.\n         *  <br/>Defaults to false\n         */\n        gridOptions.hidePinRight = gridOptions.enablePinning && gridOptions.hidePinRight;\n      },\n\n      pinningColumnBuilder: function (colDef, col, gridOptions) {\n        // default to true unless gridOptions or colDef is explicitly false\n\n        /**\n         *  @ngdoc object\n         *  @name ui.grid.pinning.api:ColumnDef\n         *\n         *  @description ColumnDef for pinning feature, these are available to be\n         *  set using the ui-grid {@link ui.grid.class:GridOptions.columnDef gridOptions.columnDefs}\n         */\n\n        /**\n         *  @ngdoc object\n         *  @name enablePinning\n         *  @propertyOf  ui.grid.pinning.api:ColumnDef\n         *  @description Enable pinning for the individual column.\n         *  <br/>Defaults to true\n         */\n        colDef.enablePinning = colDef.enablePinning === undefined ? gridOptions.enablePinning : colDef.enablePinning;\n        /**\n         *  @ngdoc object\n         *  @name hidePinLeft\n         *  @propertyOf  ui.grid.pinning.api:ColumnDef\n         *  @description Hide Pin Left for the individual column.\n         *  <br/>Defaults to false\n         */\n        colDef.hidePinLeft = colDef.hidePinLeft === undefined ? gridOptions.hidePinLeft : colDef.hidePinLeft;\n        /**\n         *  @ngdoc object\n         *  @name hidePinRight\n         *  @propertyOf  ui.grid.pinning.api:ColumnDef\n         *  @description Hide Pin Right for the individual column.\n         *  <br/>Defaults to false\n         */\n        colDef.hidePinRight = colDef.hidePinRight === undefined ? gridOptions.hidePinRight : colDef.hidePinRight;\n\n        /**\n         *  @ngdoc object\n         *  @name pinnedLeft\n         *  @propertyOf  ui.grid.pinning.api:ColumnDef\n         *  @description Column is pinned left when grid is rendered\n         *  <br/>Defaults to false\n         */\n\n        /**\n         *  @ngdoc object\n         *  @name pinnedRight\n         *  @propertyOf  ui.grid.pinning.api:ColumnDef\n         *  @description Column is pinned right when grid is rendered\n         *  <br/>Defaults to false\n         */\n        if (colDef.pinnedLeft) {\n          col.renderContainer = 'left';\n          col.grid.createLeftContainer();\n        }\n        else if (colDef.pinnedRight) {\n          col.renderContainer = 'right';\n          col.grid.createRightContainer();\n        }\n\n        if (!colDef.enablePinning) {\n          return;\n        }\n\n        var pinColumnLeftAction = {\n          name: 'ui.grid.pinning.pinLeft',\n          title: i18nService.get().pinning.pinLeft,\n          icon: 'ui-grid-icon-left-open',\n          shown: function () {\n            return typeof(this.context.col.renderContainer) === 'undefined' || !this.context.col.renderContainer || this.context.col.renderContainer !== 'left';\n          },\n          action: function () {\n            service.pinColumn(this.context.col.grid, this.context.col, uiGridPinningConstants.container.LEFT);\n          }\n        };\n\n        var pinColumnRightAction = {\n          name: 'ui.grid.pinning.pinRight',\n          title: i18nService.get().pinning.pinRight,\n          icon: 'ui-grid-icon-right-open',\n          shown: function () {\n            return typeof(this.context.col.renderContainer) === 'undefined' || !this.context.col.renderContainer || this.context.col.renderContainer !== 'right';\n          },\n          action: function () {\n            service.pinColumn(this.context.col.grid, this.context.col, uiGridPinningConstants.container.RIGHT);\n          }\n        };\n\n        var removePinAction = {\n          name: 'ui.grid.pinning.unpin',\n          title: i18nService.get().pinning.unpin,\n          icon: 'ui-grid-icon-cancel',\n          shown: function () {\n            return typeof(this.context.col.renderContainer) !== 'undefined' && this.context.col.renderContainer !== null && this.context.col.renderContainer !== 'body';\n          },\n          action: function () {\n            service.pinColumn(this.context.col.grid, this.context.col, uiGridPinningConstants.container.NONE);\n          }\n        };\n\n        // Skip from menu if hidePinLeft or hidePinRight is true\n        if (!colDef.hidePinLeft && !gridUtil.arrayContainsObjectWithProperty(col.menuItems, 'name', 'ui.grid.pinning.pinLeft')) {\n          col.menuItems.push(pinColumnLeftAction);\n        }\n        if (!colDef.hidePinRight && !gridUtil.arrayContainsObjectWithProperty(col.menuItems, 'name', 'ui.grid.pinning.pinRight')) {\n          col.menuItems.push(pinColumnRightAction);\n        }\n        if (!gridUtil.arrayContainsObjectWithProperty(col.menuItems, 'name', 'ui.grid.pinning.unpin')) {\n          col.menuItems.push(removePinAction);\n        }\n      },\n\n      pinColumn: function(grid, col, container) {\n        if (container === uiGridPinningConstants.container.NONE) {\n          col.renderContainer = null;\n          col.colDef.pinnedLeft = col.colDef.pinnedRight = false;\n        }\n        else {\n          col.renderContainer = container;\n          if (container === uiGridPinningConstants.container.LEFT) {\n            grid.createLeftContainer();\n          }\n          else if (container === uiGridPinningConstants.container.RIGHT) {\n            grid.createRightContainer();\n          }\n        }\n\n        grid.refresh()\n        .then(function() {\n          grid.api.pinning.raise.columnPinned( col.colDef, container );\n        });\n      }\n    };\n\n    return service;\n  }]);\n\n  module.directive('uiGridPinning', ['gridUtil', 'uiGridPinningService',\n    function (gridUtil, uiGridPinningService) {\n      return {\n        require: 'uiGrid',\n        scope: false,\n        compile: function () {\n          return {\n            pre: function ($scope, $elm, $attrs, uiGridCtrl) {\n              uiGridPinningService.initializeGrid(uiGridCtrl.grid);\n            },\n            post: function ($scope, $elm, $attrs, uiGridCtrl) {\n            }\n          };\n        }\n      };\n    }]);\n})();\n\n(function() {\n  'use strict';\n\n  /**\n   * @ngdoc overview\n   * @name ui.grid.resizeColumns\n   * @description\n   *\n   * # ui.grid.resizeColumns\n   *\n   * <div class=\"alert alert-success\" role=\"alert\"><strong>Stable</strong> This feature is stable. There should no longer be breaking api changes without a deprecation warning.</div>\n   *\n   * This module allows columns to be resized.\n   */\n  var module = angular.module('ui.grid.resizeColumns', ['ui.grid']);\n\n  module.service('uiGridResizeColumnsService', ['gridUtil', '$q', '$rootScope',\n    function (gridUtil, $q, $rootScope) {\n      return {\n        defaultGridOptions: function(gridOptions) {\n          // default option to true unless it was explicitly set to false\n          /**\n           *  @ngdoc object\n           *  @name ui.grid.resizeColumns.api:GridOptions\n           *\n           *  @description GridOptions for resizeColumns feature, these are available to be\n           *  set using the ui-grid {@link ui.grid.class:GridOptions gridOptions}\n           */\n\n          /**\n           *  @ngdoc object\n           *  @name enableColumnResizing\n           *  @propertyOf  ui.grid.resizeColumns.api:GridOptions\n           *  @description Enable column resizing on the entire grid\n           *  <br/>Defaults to true\n           */\n          gridOptions.enableColumnResizing = gridOptions.enableColumnResizing !== false;\n\n          // legacy support\n          // use old name if it is explicitly false\n          if (gridOptions.enableColumnResize === false) {\n            gridOptions.enableColumnResizing = false;\n          }\n        },\n\n        colResizerColumnBuilder: function (colDef, col, gridOptions) {\n          var promises = [];\n\n          /**\n           *  @ngdoc object\n           *  @name ui.grid.resizeColumns.api:ColumnDef\n           *\n           *  @description ColumnDef for resizeColumns feature, these are available to be\n           *  set using the ui-grid {@link ui.grid.class:GridOptions.columnDef gridOptions.columnDefs}\n           */\n\n          /**\n           *  @ngdoc object\n           *  @name enableColumnResizing\n           *  @propertyOf  ui.grid.resizeColumns.api:ColumnDef\n           *  @description Enable column resizing on an individual column\n           *  <br/>Defaults to GridOptions.enableColumnResizing\n           */\n          // default to true unless gridOptions or colDef is explicitly false\n          colDef.enableColumnResizing = colDef.enableColumnResizing === undefined ? gridOptions.enableColumnResizing : colDef.enableColumnResizing;\n\n\n          // legacy support of old option name\n          if (colDef.enableColumnResize === false) {\n            colDef.enableColumnResizing = false;\n          }\n\n          return $q.all(promises);\n        },\n\n        registerPublicApi: function (grid) {\n            /**\n             *  @ngdoc object\n             *  @name ui.grid.resizeColumns.api:PublicApi\n             *  @description Public Api for column resize feature.\n             */\n            var publicApi = {\n              events: {\n                /**\n                 * @ngdoc event\n                 * @name columnSizeChanged\n                 * @eventOf  ui.grid.resizeColumns.api:PublicApi\n                 * @description raised when column is resized\n                 * <pre>\n                 *      gridApi.colResizable.on.columnSizeChanged(scope,function(colDef, deltaChange) {})\n                 * </pre>\n                 * @param {object} colDef the column that was resized\n                 * @param {integer} delta of the column size change\n                 */\n                colResizable: {\n                  columnSizeChanged: function (colDef, deltaChange) {\n                  }\n                }\n              }\n            };\n            grid.api.registerEventsFromObject(publicApi.events);\n        },\n\n        fireColumnSizeChanged: function (grid, colDef, deltaChange) {\n          $rootScope.$applyAsync(function () {\n            if ( grid.api.colResizable ) {\n              grid.api.colResizable.raise.columnSizeChanged(colDef, deltaChange);\n            } else {\n              gridUtil.logError(\"The resizeable api is not registered, this may indicate that you've included the module but not added the 'ui-grid-resize-columns' directive to your grid definition.  Cannot raise any events.\");\n            }\n          });\n        },\n\n        // get either this column, or the column next to this column, to resize,\n        // returns the column we're going to resize\n        findTargetCol: function(col, position, rtlMultiplier) {\n          var renderContainer = col.getRenderContainer();\n\n          if (position === 'left') {\n            // Get the column to the left of this one\n            var colIndex = renderContainer.visibleColumnCache.indexOf(col);\n            if (colIndex === 0) {\n              return renderContainer.visibleColumnCache[0];\n            }\n            return renderContainer.visibleColumnCache[colIndex - 1 * rtlMultiplier];\n          } else {\n            return col;\n          }\n        }\n      };\n    }]);\n\n\n  /**\n   * @ngdoc directive\n   * @name ui.grid.resizeColumns.directive:uiGridResizeColumns\n   * @element div\n   * @restrict A\n   * @description\n   * Enables resizing for all columns on the grid. If, for some reason, you want to use the ui-grid-resize-columns directive, but not allow column resizing, you can explicitly set the\n   * option to false. This prevents resizing for the entire grid, regardless of individual columnDef options.\n   *\n   * @example\n   <doc:example module=\"app\">\n   <doc:source>\n   <script>\n   var app = angular.module('app', ['ui.grid', 'ui.grid.resizeColumns']);\n\n   app.controller('MainCtrl', ['$scope', function ($scope) {\n          $scope.gridOpts = {\n            data: [\n              { \"name\": \"Ethel Price\", \"gender\": \"female\", \"company\": \"Enersol\" },\n              { \"name\": \"Claudine Neal\", \"gender\": \"female\", \"company\": \"Sealoud\" },\n              { \"name\": \"Beryl Rice\", \"gender\": \"female\", \"company\": \"Velity\" },\n              { \"name\": \"Wilder Gonzales\", \"gender\": \"male\", \"company\": \"Geekko\" }\n            ]\n          };\n        }]);\n   </script>\n\n   <div ng-controller=\"MainCtrl\">\n   <div class=\"testGrid\" ui-grid=\"gridOpts\" ui-grid-resize-columns ></div>\n   </div>\n   </doc:source>\n   <doc:scenario>\n\n   </doc:scenario>\n   </doc:example>\n   */\n  module.directive('uiGridResizeColumns', ['gridUtil', 'uiGridResizeColumnsService', function (gridUtil, uiGridResizeColumnsService) {\n    return {\n      replace: true,\n      priority: 0,\n      require: '^uiGrid',\n      scope: false,\n      compile: function () {\n        return {\n          pre: function ($scope, $elm, $attrs, uiGridCtrl) {\n            uiGridResizeColumnsService.defaultGridOptions(uiGridCtrl.grid.options);\n            uiGridCtrl.grid.registerColumnBuilder( uiGridResizeColumnsService.colResizerColumnBuilder);\n            uiGridResizeColumnsService.registerPublicApi(uiGridCtrl.grid);\n          },\n          post: function ($scope, $elm, $attrs, uiGridCtrl) {\n          }\n        };\n      }\n    };\n  }]);\n\n  // Extend the uiGridHeaderCell directive\n  module.directive('uiGridHeaderCell', ['gridUtil', '$templateCache', '$compile', '$q', 'uiGridResizeColumnsService', 'uiGridConstants', function (gridUtil, $templateCache, $compile, $q, uiGridResizeColumnsService, uiGridConstants) {\n    return {\n      // Run after the original uiGridHeaderCell\n      priority: -10,\n      require: '^uiGrid',\n      // scope: false,\n      compile: function() {\n        return {\n          post: function ($scope, $elm, $attrs, uiGridCtrl) {\n            var grid = uiGridCtrl.grid;\n\n            if (grid.options.enableColumnResizing) {\n              var columnResizerElm = $templateCache.get('ui-grid/columnResizer');\n\n              var rtlMultiplier = 1;\n              // when in RTL mode reverse the direction using the rtlMultiplier and change the position to left\n              if (grid.isRTL()) {\n                $scope.position = 'left';\n                rtlMultiplier = -1;\n              }\n\n              var displayResizers = function() {\n\n                // remove any existing resizers.\n                var resizers = $elm[0].getElementsByClassName('ui-grid-column-resizer');\n                for ( var i = 0; i < resizers.length; i++ ) {\n                  angular.element(resizers[i]).remove();\n                }\n\n                // get the target column for the left resizer\n                var otherCol = uiGridResizeColumnsService.findTargetCol($scope.col, 'left', rtlMultiplier);\n                var renderContainer = $scope.col.getRenderContainer();\n\n                // Don't append the left resizer if this is the first column or the column to the left of this one has resizing disabled\n                if (otherCol && renderContainer.visibleColumnCache.indexOf($scope.col) !== 0 && otherCol.colDef.enableColumnResizing !== false) {\n                  var resizerLeft = angular.element(columnResizerElm).clone();\n                  resizerLeft.attr('position', 'left');\n\n                  $elm.prepend(resizerLeft);\n                  $compile(resizerLeft)($scope);\n                }\n\n                // Don't append the right resizer if this column has resizing disabled\n                if ($scope.col.colDef.enableColumnResizing !== false) {\n                  var resizerRight = angular.element(columnResizerElm).clone();\n                  resizerRight.attr('position', 'right');\n\n                  $elm.append(resizerRight);\n                  $compile(resizerRight)($scope);\n                }\n              };\n\n              displayResizers();\n\n              var waitDisplay = function() {\n                $scope.$applyAsync(displayResizers);\n              };\n\n              var dataChangeDereg = grid.registerDataChangeCallback( waitDisplay, [uiGridConstants.dataChange.COLUMN] );\n\n              $scope.$on( '$destroy', dataChangeDereg );\n            }\n          }\n        };\n      }\n    };\n  }]);\n\n\n\n  /**\n   * @ngdoc directive\n   * @name ui.grid.resizeColumns.directive:uiGridColumnResizer\n   * @element div\n   * @restrict A\n   *\n   * @description\n   * Draggable handle that controls column resizing.\n   *\n   * @example\n   <doc:example module=\"app\">\n     <doc:source>\n       <script>\n        var app = angular.module('app', ['ui.grid', 'ui.grid.resizeColumns']);\n\n        app.controller('MainCtrl', ['$scope', function ($scope) {\n          $scope.gridOpts = {\n            enableColumnResizing: true,\n            data: [\n              { \"name\": \"Ethel Price\", \"gender\": \"female\", \"company\": \"Enersol\" },\n              { \"name\": \"Claudine Neal\", \"gender\": \"female\", \"company\": \"Sealoud\" },\n              { \"name\": \"Beryl Rice\", \"gender\": \"female\", \"company\": \"Velity\" },\n              { \"name\": \"Wilder Gonzales\", \"gender\": \"male\", \"company\": \"Geekko\" }\n            ]\n          };\n        }]);\n       </script>\n\n       <div ng-controller=\"MainCtrl\">\n        <div class=\"testGrid\" ui-grid=\"gridOpts\"></div>\n       </div>\n     </doc:source>\n     <doc:scenario>\n      // TODO: e2e specs?\n\n      // TODO: post-resize a horizontal scroll event should be fired\n     </doc:scenario>\n   </doc:example>\n   */\n  module.directive('uiGridColumnResizer', ['$document', 'gridUtil', 'uiGridConstants', 'uiGridResizeColumnsService', function ($document, gridUtil, uiGridConstants, uiGridResizeColumnsService) {\n    var resizeOverlay = angular.element('<div class=\"ui-grid-resize-overlay\"></div>');\n\n    return {\n      priority: 0,\n      scope: {\n        col: '=',\n        position: '@',\n        renderIndex: '='\n      },\n      require: '?^uiGrid',\n      link: function ($scope, $elm, $attrs, uiGridCtrl) {\n        var startX = 0,\n            x = 0,\n            gridLeft = 0,\n            rtlMultiplier = 1;\n\n        // when in RTL mode reverse the direction using the rtlMultiplier and change the position to left\n        if (uiGridCtrl.grid.isRTL()) {\n          $scope.position = 'left';\n          rtlMultiplier = -1;\n        }\n\n        if ($scope.position === 'left') {\n          $elm.addClass('left');\n        }\n        else if ($scope.position === 'right') {\n          $elm.addClass('right');\n        }\n\n        // Refresh the grid canvas\n        //   takes an argument representing the diff along the X-axis that the resize had\n        function refreshCanvas(xDiff) {\n          // Then refresh the grid canvas, rebuilding the styles so that the scrollbar updates its size\n          uiGridCtrl.grid.refreshCanvas(true).then( function() {\n            uiGridCtrl.grid.queueGridRefresh();\n          });\n        }\n\n        // Check that the requested width isn't wider than the maxWidth, or narrower than the minWidth\n        // Returns the new recommended with, after constraints applied\n        function constrainWidth(col, width) {\n          var newWidth = width;\n\n          // If the new width would be less than the column's allowably minimum width, don't allow it\n          if (col.minWidth && newWidth < col.minWidth) {\n            newWidth = col.minWidth;\n          }\n          else if (col.maxWidth && newWidth > col.maxWidth) {\n            newWidth = col.maxWidth;\n          }\n\n          return newWidth;\n        }\n\n\n        /*\n         * Our approach to event handling aims to deal with both touch devices and mouse devices\n         * We register down handlers on both touch and mouse.  When a touchstart or mousedown event\n         * occurs, we register the corresponding touchmove/touchend, or mousemove/mouseend events.\n         *\n         * This way we can listen for both without worrying about the fact many touch devices also emulate\n         * mouse events - basically whichever one we hear first is what we'll go with.\n         */\n        function moveFunction(event, args) {\n          if (event.originalEvent) { event = event.originalEvent; }\n          event.preventDefault();\n\n          x = (event.targetTouches ? event.targetTouches[0] : event).clientX - gridLeft;\n\n          if (x < 0) { x = 0; }\n          else if (x > uiGridCtrl.grid.gridWidth) { x = uiGridCtrl.grid.gridWidth; }\n\n          var col = uiGridResizeColumnsService.findTargetCol($scope.col, $scope.position, rtlMultiplier);\n\n          // Don't resize if it's disabled on this column\n          if (col.colDef.enableColumnResizing === false) {\n            return;\n          }\n\n          if (!uiGridCtrl.grid.element.hasClass('column-resizing')) {\n            uiGridCtrl.grid.element.addClass('column-resizing');\n          }\n\n          // Get the diff along the X axis\n          var xDiff = x - startX;\n\n          // Get the width that this mouse would give the column\n          var newWidth = parseInt(col.drawnWidth + xDiff * rtlMultiplier, 10);\n\n          // check we're not outside the allowable bounds for this column\n          x = x + ( constrainWidth(col, newWidth) - newWidth ) * rtlMultiplier;\n\n          resizeOverlay.css({ left: x + 'px' });\n\n          uiGridCtrl.fireEvent(uiGridConstants.events.ITEM_DRAGGING);\n        }\n\n\n        function upFunction(event) {\n          if (event.originalEvent) { event = event.originalEvent; }\n          event.preventDefault();\n\n          uiGridCtrl.grid.element.removeClass('column-resizing');\n\n          resizeOverlay.remove();\n\n          // Resize the column\n          x = (event.changedTouches ? event.changedTouches[0] : event).clientX - gridLeft;\n          var xDiff = x - startX;\n\n          if (xDiff === 0) {\n            // no movement, so just reset event handlers, including turning back on both\n            // down events - we turned one off when this event started\n            offAllEvents();\n            onDownEvents();\n            return;\n          }\n\n          var col = uiGridResizeColumnsService.findTargetCol($scope.col, $scope.position, rtlMultiplier);\n\n          // Don't resize if it's disabled on this column\n          if (col.colDef.enableColumnResizing === false) {\n            return;\n          }\n\n          // Get the new width\n          var newWidth = parseInt(col.drawnWidth + xDiff * rtlMultiplier, 10);\n\n          // check we're not outside the allowable bounds for this column\n          col.width = constrainWidth(col, newWidth);\n          col.hasCustomWidth = true;\n\n          refreshCanvas(xDiff);\n\n          uiGridResizeColumnsService.fireColumnSizeChanged(uiGridCtrl.grid, col.colDef, xDiff);\n\n          // stop listening of up and move events - wait for next down\n          // reset the down events - we will have turned one off when this event started\n          offAllEvents();\n          onDownEvents();\n        }\n\n\n        var downFunction = function(event, args) {\n          if (event.originalEvent) { event = event.originalEvent; }\n          event.stopPropagation();\n\n          // Get the left offset of the grid\n          // gridLeft = uiGridCtrl.grid.element[0].offsetLeft;\n          gridLeft = uiGridCtrl.grid.element[0].getBoundingClientRect().left;\n\n          // Get the starting X position, which is the X coordinate of the click minus the grid's offset\n          startX = (event.targetTouches ? event.targetTouches[0] : event).clientX - gridLeft;\n\n          // Append the resizer overlay\n          uiGridCtrl.grid.element.append(resizeOverlay);\n\n          // Place the resizer overlay at the start position\n          resizeOverlay.css({ left: startX });\n\n          // Add handlers for move and up events - if we were mousedown then we listen for mousemove and mouseup, if\n          // we were touchdown then we listen for touchmove and touchup.  Also remove the handler for the equivalent\n          // down event - so if we're touchdown, then remove the mousedown handler until this event is over, if we're\n          // mousedown then remove the touchdown handler until this event is over, this avoids processing duplicate events\n          if ( event.type === 'touchstart' ) {\n            $document.on('touchend', upFunction);\n            $document.on('touchmove', moveFunction);\n            $elm.off('mousedown', downFunction);\n          }\n          else {\n            $document.on('mouseup', upFunction);\n            $document.on('mousemove', moveFunction);\n            $elm.off('touchstart', downFunction);\n          }\n        };\n\n        var onDownEvents = function() {\n          $elm.on('mousedown', downFunction);\n          $elm.on('touchstart', downFunction);\n        };\n\n        var offAllEvents = function() {\n          $document.off('mouseup', upFunction);\n          $document.off('touchend', upFunction);\n          $document.off('mousemove', moveFunction);\n          $document.off('touchmove', moveFunction);\n          $elm.off('mousedown', downFunction);\n          $elm.off('touchstart', downFunction);\n        };\n\n        onDownEvents();\n\n\n        // On doubleclick, resize to fit all rendered cells\n        var dblClickFn = function(event, args) {\n          event.stopPropagation();\n\n          var col = uiGridResizeColumnsService.findTargetCol($scope.col, $scope.position, rtlMultiplier);\n\n          // Don't resize if it's disabled on this column\n          if (col.colDef.enableColumnResizing === false) {\n            return;\n          }\n\n          // Go through the rendered rows and find out the max size for the data in this column\n          var maxWidth = 0;\n\n          // Get the parent render container element\n          var renderContainerElm = gridUtil.closestElm($elm, '.ui-grid-render-container');\n\n          // Get the cell contents so we measure correctly. For the header cell we have to account for the sort icon and the menu buttons, if present\n          var cells = renderContainerElm.querySelectorAll('.' + uiGridConstants.COL_CLASS_PREFIX + col.uid + ' .ui-grid-cell-contents');\n          Array.prototype.forEach.call(cells, function (cell) {\n              // Get the cell width\n              // gridUtil.logDebug('width', gridUtil.elementWidth(cell));\n\n              // Account for the menu button if it exists\n              var menuButton;\n              if (angular.element(cell).parent().hasClass('ui-grid-header-cell')) {\n                menuButton = angular.element(cell).parent()[0].querySelectorAll('.ui-grid-column-menu-button');\n              }\n\n              gridUtil.fakeElement(cell, {}, function(newElm) {\n                // Make the element float since it's a div and can expand to fill its container\n                var e = angular.element(newElm);\n                e.attr('style', 'float: left');\n\n                var width = gridUtil.elementWidth(e) + 2;\n\n                if (menuButton) {\n                  var menuButtonWidth = gridUtil.elementWidth(menuButton);\n                  width = width + menuButtonWidth;\n                }\n\n                if (width > maxWidth) {\n                  maxWidth = width;\n                }\n              });\n            });\n\n          // check we're not outside the allowable bounds for this column\n          var newWidth = constrainWidth(col, maxWidth);\n          var xDiff = newWidth - col.drawnWidth;\n          col.width = newWidth;\n          col.hasCustomWidth = true;\n\n          refreshCanvas(xDiff);\n\n          uiGridResizeColumnsService.fireColumnSizeChanged(uiGridCtrl.grid, col.colDef, xDiff);        };\n        $elm.on('dblclick', dblClickFn);\n\n        $elm.on('$destroy', function() {\n          $elm.off('dblclick', dblClickFn);\n          offAllEvents();\n        });\n      }\n    };\n  }]);\n})();\n\n(function () {\n  'use strict';\n\n  /**\n   * @ngdoc overview\n   * @name ui.grid.rowEdit\n   * @description\n   *\n   * # ui.grid.rowEdit\n   *\n   * <div class=\"alert alert-success\" role=\"alert\"><strong>Stable</strong> This feature is stable. There should no longer be breaking api changes without a deprecation warning.</div>\n   *\n   * This module extends the edit feature to provide tracking and saving of rows\n   * of data.  The tutorial provides more information on how this feature is best\n   * used {@link tutorial/205_row_editable here}.\n   * <br/>\n   * This feature depends on usage of the ui-grid-edit feature, and also benefits\n   * from use of ui-grid-cellNav to provide the full spreadsheet-like editing\n   * experience\n   *\n   */\n\n  var module = angular.module('ui.grid.rowEdit', ['ui.grid', 'ui.grid.edit', 'ui.grid.cellNav']);\n\n  /**\n   *  @ngdoc object\n   *  @name ui.grid.rowEdit.constant:uiGridRowEditConstants\n   *\n   *  @description constants available in row edit module\n   */\n  module.constant('uiGridRowEditConstants', {\n  });\n\n  /**\n   *  @ngdoc service\n   *  @name ui.grid.rowEdit.service:uiGridRowEditService\n   *\n   *  @description Services for row editing features\n   */\n  module.service('uiGridRowEditService', ['$interval', '$q', 'uiGridConstants', 'uiGridRowEditConstants', 'gridUtil',\n    function ($interval, $q, uiGridConstants, uiGridRowEditConstants, gridUtil) {\n\n      var service = {\n\n        initializeGrid: function (scope, grid) {\n          /**\n           *  @ngdoc object\n           *  @name ui.grid.rowEdit.api:PublicApi\n           *\n           *  @description Public Api for rowEdit feature\n           */\n\n          grid.rowEdit = {};\n\n          var publicApi = {\n            events: {\n              rowEdit: {\n                /**\n                 * @ngdoc event\n                 * @eventOf ui.grid.rowEdit.api:PublicApi\n                 * @name saveRow\n                 * @description raised when a row is ready for saving.  Once your\n                 * row has saved you may need to use angular.extend to update the\n                 * data entity with any changed data from your save (for example,\n                 * lock version information if you're using optimistic locking,\n                 * or last update time/user information).\n                 *\n                 * Your method should call setSavePromise somewhere in the body before\n                 * returning control.  The feature will then wait, with the gridRow greyed out\n                 * whilst this promise is being resolved.\n                 *\n                 * <pre>\n                 *      gridApi.rowEdit.on.saveRow(scope,function(rowEntity) {})\n                 * </pre>\n                 * and somewhere within the event handler:\n                 * <pre>\n                 *      gridApi.rowEdit.setSavePromise( rowEntity, savePromise)\n                 * </pre>\n                 * @param {object} rowEntity the options.data element that was edited\n                 * @returns {promise} Your saveRow method should return a promise, the\n                 * promise should either be resolved (implying successful save), or\n                 * rejected (implying an error).\n                 */\n                saveRow: function (rowEntity) {\n                }\n              }\n            },\n            methods: {\n              rowEdit: {\n                /**\n                 * @ngdoc method\n                 * @methodOf ui.grid.rowEdit.api:PublicApi\n                 * @name setSavePromise\n                 * @description Sets the promise associated with the row save, mandatory that\n                 * the saveRow event handler calls this method somewhere before returning.\n                 * <pre>\n                 *      gridApi.rowEdit.setSavePromise(rowEntity, savePromise)\n                 * </pre>\n                 * @param {object} rowEntity a data row from the grid for which a save has\n                 * been initiated\n                 * @param {promise} savePromise the promise that will be resolved when the\n                 * save is successful, or rejected if the save fails\n                 *\n                 */\n                setSavePromise: function ( rowEntity, savePromise) {\n                  service.setSavePromise(grid, rowEntity, savePromise);\n                },\n                /**\n                 * @ngdoc method\n                 * @methodOf ui.grid.rowEdit.api:PublicApi\n                 * @name getDirtyRows\n                 * @description Returns all currently dirty rows\n                 * <pre>\n                 *      gridApi.rowEdit.getDirtyRows(grid)\n                 * </pre>\n                 * @returns {array} An array of gridRows that are currently dirty\n                 *\n                 */\n                getDirtyRows: function () {\n                  return grid.rowEdit.dirtyRows ? grid.rowEdit.dirtyRows : [];\n                },\n                /**\n                 * @ngdoc method\n                 * @methodOf ui.grid.rowEdit.api:PublicApi\n                 * @name getErrorRows\n                 * @description Returns all currently errored rows\n                 * <pre>\n                 *      gridApi.rowEdit.getErrorRows(grid)\n                 * </pre>\n                 * @returns {array} An array of gridRows that are currently in error\n                 *\n                 */\n                getErrorRows: function () {\n                  return grid.rowEdit.errorRows ? grid.rowEdit.errorRows : [];\n                },\n                /**\n                 * @ngdoc method\n                 * @methodOf ui.grid.rowEdit.api:PublicApi\n                 * @name flushDirtyRows\n                 * @description Triggers a save event for all currently dirty rows, could\n                 * be used where user presses a save button or navigates away from the page\n                 * <pre>\n                 *      gridApi.rowEdit.flushDirtyRows(grid)\n                 * </pre>\n                 * @returns {promise} a promise that represents the aggregate of all\n                 * of the individual save promises - i.e. it will be resolved when all\n                 * the individual save promises have been resolved.\n                 *\n                 */\n                flushDirtyRows: function () {\n                  return service.flushDirtyRows(grid);\n                },\n\n                /**\n                 * @ngdoc method\n                 * @methodOf ui.grid.rowEdit.api:PublicApi\n                 * @name setRowsDirty\n                 * @description Sets each of the rows passed in dataRows\n                 * to be dirty. Note that if you have only just inserted the\n                 * rows into your data you will need to wait for a $digest cycle\n                 * before the gridRows are present - so often you would wrap this\n                 * call in a $interval or $timeout. Also, you must pass row.entity\n                 * into this function rather than row objects themselves.\n                 * <pre>\n                 *      $interval( function() {\n                 *        gridApi.rowEdit.setRowsDirty(myDataRows);\n                 *      }, 0, 1);\n                 * </pre>\n                 * @param {array} dataRows the data entities for which the gridRows\n                 * should be set dirty.\n                 *\n                 */\n                setRowsDirty: function ( dataRows) {\n                  service.setRowsDirty(grid, dataRows);\n                },\n\n                /**\n                 * @ngdoc method\n                 * @methodOf ui.grid.rowEdit.api:PublicApi\n                 * @name setRowsClean\n                 * @description Sets each of the rows passed in dataRows\n                 * to be clean, removing them from the dirty cache and the error cache,\n                 * and clearing the error flag and the dirty flag\n                 * <pre>\n                 *      var gridRows = $scope.gridApi.rowEdit.getDirtyRows();\n                 *      var dataRows = gridRows.map( function( gridRow ) { return gridRow.entity; });\n                 *      $scope.gridApi.rowEdit.setRowsClean( dataRows );\n                 * </pre>\n                 * @param {array} dataRows the data entities for which the gridRows\n                 * should be set clean.\n                 *\n                 */\n                setRowsClean: function ( dataRows) {\n                  service.setRowsClean(grid, dataRows);\n                }\n              }\n            }\n          };\n\n          grid.api.registerEventsFromObject(publicApi.events);\n          grid.api.registerMethodsFromObject(publicApi.methods);\n\n          grid.api.core.on.renderingComplete( scope, function ( gridApi ) {\n            grid.api.edit.on.afterCellEdit( scope, service.endEditCell );\n            grid.api.edit.on.beginCellEdit( scope, service.beginEditCell );\n            grid.api.edit.on.cancelCellEdit( scope, service.cancelEditCell );\n\n            if ( grid.api.cellNav ) {\n              grid.api.cellNav.on.navigate( scope, service.navigate );\n            }\n          });\n\n        },\n\n        defaultGridOptions: function (gridOptions) {\n\n          /**\n           *  @ngdoc object\n           *  @name ui.grid.rowEdit.api:GridOptions\n           *\n           *  @description Options for configuring the rowEdit feature, these are available to be\n           *  set using the ui-grid {@link ui.grid.class:GridOptions gridOptions}\n           */\n\n        },\n\n\n        /**\n         * @ngdoc method\n         * @methodOf ui.grid.rowEdit.service:uiGridRowEditService\n         * @name saveRow\n         * @description  Returns a function that saves the specified row from the grid,\n         * and returns a promise\n         * @param {object} grid the grid for which dirty rows should be flushed\n         * @param {GridRow} gridRow the row that should be saved\n         * @returns {function} the saveRow function returns a function.  That function\n         * in turn, when called, returns a promise relating to the save callback\n         */\n        saveRow: function ( grid, gridRow ) {\n          var self = this;\n\n          return function() {\n            gridRow.isSaving = true;\n\n            if ( gridRow.rowEditSavePromise ) {\n              // don't save the row again if it's already saving - that causes stale object exceptions\n              return gridRow.rowEditSavePromise;\n            }\n\n            var promise = grid.api.rowEdit.raise.saveRow( gridRow.entity );\n\n            if ( gridRow.rowEditSavePromise ) {\n              gridRow.rowEditSavePromise.then( self.processSuccessPromise( grid, gridRow ), self.processErrorPromise( grid, gridRow ));\n            } else {\n              gridUtil.logError( 'A promise was not returned when saveRow event was raised, either nobody is listening to event, or event handler did not return a promise' );\n            }\n            return promise;\n          };\n        },\n\n\n        /**\n         * @ngdoc method\n         * @methodOf  ui.grid.rowEdit.service:uiGridRowEditService\n         * @name setSavePromise\n         * @description Sets the promise associated with the row save, mandatory that\n         * the saveRow event handler calls this method somewhere before returning.\n         * <pre>\n         *      gridApi.rowEdit.setSavePromise(grid, rowEntity)\n         * </pre>\n         * @param {object} grid the grid for which dirty rows should be returned\n         * @param {object} rowEntity a data row from the grid for which a save has\n         * been initiated\n         * @param {promise} savePromise the promise that will be resolved when the\n         * save is successful, or rejected if the save fails\n         *\n         */\n        setSavePromise: function (grid, rowEntity, savePromise) {\n          var gridRow = grid.getRow( rowEntity );\n          gridRow.rowEditSavePromise = savePromise;\n        },\n\n\n        /**\n         * @ngdoc method\n         * @methodOf ui.grid.rowEdit.service:uiGridRowEditService\n         * @name processSuccessPromise\n         * @description  Returns a function that processes the successful\n         * resolution of a save promise\n         * @param {object} grid the grid for which the promise should be processed\n         * @param {GridRow} gridRow the row that has been saved\n         * @returns {function} the success handling function\n         */\n        processSuccessPromise: function ( grid, gridRow ) {\n          var self = this;\n\n          return function() {\n            delete gridRow.isSaving;\n            delete gridRow.isDirty;\n            delete gridRow.isError;\n            delete gridRow.rowEditSaveTimer;\n            delete gridRow.rowEditSavePromise;\n            self.removeRow( grid.rowEdit.errorRows, gridRow );\n            self.removeRow( grid.rowEdit.dirtyRows, gridRow );\n          };\n        },\n\n\n        /**\n         * @ngdoc method\n         * @methodOf ui.grid.rowEdit.service:uiGridRowEditService\n         * @name processErrorPromise\n         * @description  Returns a function that processes the failed\n         * resolution of a save promise\n         * @param {object} grid the grid for which the promise should be processed\n         * @param {GridRow} gridRow the row that is now in error\n         * @returns {function} the error handling function\n         */\n        processErrorPromise: function ( grid, gridRow ) {\n          return function() {\n            delete gridRow.isSaving;\n            delete gridRow.rowEditSaveTimer;\n            delete gridRow.rowEditSavePromise;\n\n            gridRow.isError = true;\n\n            if (!grid.rowEdit.errorRows) {\n              grid.rowEdit.errorRows = [];\n            }\n            if (!service.isRowPresent( grid.rowEdit.errorRows, gridRow ) ) {\n              grid.rowEdit.errorRows.push( gridRow );\n            }\n          };\n        },\n\n\n        /**\n         * @ngdoc method\n         * @methodOf ui.grid.rowEdit.service:uiGridRowEditService\n         * @name removeRow\n         * @description  Removes a row from a cache of rows - either\n         * grid.rowEdit.errorRows or grid.rowEdit.dirtyRows.  If the row\n         * is not present silently does nothing.\n         * @param {array} rowArray the array from which to remove the row\n         * @param {GridRow} gridRow the row that should be removed\n         */\n        removeRow: function( rowArray, removeGridRow ) {\n          if (typeof(rowArray) === 'undefined' || rowArray === null) {\n            return;\n          }\n\n          rowArray.forEach( function( gridRow, index ) {\n            if ( gridRow.uid === removeGridRow.uid ) {\n              rowArray.splice( index, 1);\n            }\n          });\n        },\n\n\n        /**\n         * @ngdoc method\n         * @methodOf ui.grid.rowEdit.service:uiGridRowEditService\n         * @name isRowPresent\n         * @description  Checks whether a row is already present\n         * in the given array\n         * @param {array} rowArray the array in which to look for the row\n         * @param {GridRow} gridRow the row that should be looked for\n         */\n        isRowPresent: function( rowArray, removeGridRow ) {\n          var present = false;\n          rowArray.forEach( function( gridRow, index ) {\n            if ( gridRow.uid === removeGridRow.uid ) {\n              present = true;\n            }\n          });\n          return present;\n        },\n\n\n        /**\n         * @ngdoc method\n         * @methodOf ui.grid.rowEdit.service:uiGridRowEditService\n         * @name flushDirtyRows\n         * @description Triggers a save event for all currently dirty rows, could\n         * be used where user presses a save button or navigates away from the page\n         * <pre>\n         *      gridApi.rowEdit.flushDirtyRows(grid)\n         * </pre>\n         * @param {object} grid the grid for which dirty rows should be flushed\n         * @returns {promise} a promise that represents the aggregate of all\n         * of the individual save promises - i.e. it will be resolved when all\n         * the individual save promises have been resolved.\n         *\n         */\n        flushDirtyRows: function(grid) {\n          var promises = [];\n          grid.api.rowEdit.getDirtyRows().forEach( function( gridRow ) {\n            service.cancelTimer( grid, gridRow );\n            service.saveRow( grid, gridRow )();\n            promises.push( gridRow.rowEditSavePromise );\n          });\n\n          return $q.all( promises );\n        },\n\n\n        /**\n         * @ngdoc method\n         * @methodOf ui.grid.rowEdit.service:uiGridRowEditService\n         * @name endEditCell\n         * @description Receives an afterCellEdit event from the edit function,\n         * and sets flags as appropriate.  Only the rowEntity parameter\n         * is processed, although other params are available.  Grid\n         * is automatically provided by the gridApi.\n         * @param {object} rowEntity the data entity for which the cell\n         * was edited\n         */\n        endEditCell: function( rowEntity, colDef, newValue, previousValue ) {\n          var grid = this.grid;\n          var gridRow = grid.getRow( rowEntity );\n          if ( !gridRow ) { gridUtil.logError( 'Unable to find rowEntity in grid data, dirty flag cannot be set' ); return; }\n\n          if ( newValue !== previousValue || gridRow.isDirty ) {\n            if ( !grid.rowEdit.dirtyRows ) {\n              grid.rowEdit.dirtyRows = [];\n            }\n\n            if ( !gridRow.isDirty ) {\n              gridRow.isDirty = true;\n              grid.rowEdit.dirtyRows.push( gridRow );\n            }\n\n            delete gridRow.isError;\n\n            service.considerSetTimer( grid, gridRow );\n          }\n        },\n\n\n        /**\n         * @ngdoc method\n         * @methodOf ui.grid.rowEdit.service:uiGridRowEditService\n         * @name beginEditCell\n         * @description Receives a beginCellEdit event from the edit function,\n         * and cancels any rowEditSaveTimers if present, as the user is still editing\n         * this row.  Only the rowEntity parameter\n         * is processed, although other params are available.  Grid\n         * is automatically provided by the gridApi.\n         * @param {object} rowEntity the data entity for which the cell\n         * editing has commenced\n         */\n        beginEditCell: function( rowEntity, colDef ) {\n          var grid = this.grid;\n          var gridRow = grid.getRow( rowEntity );\n          if ( !gridRow ) { gridUtil.logError( 'Unable to find rowEntity in grid data, timer cannot be cancelled' ); return; }\n\n          service.cancelTimer( grid, gridRow );\n        },\n\n\n        /**\n         * @ngdoc method\n         * @methodOf ui.grid.rowEdit.service:uiGridRowEditService\n         * @name cancelEditCell\n         * @description Receives a cancelCellEdit event from the edit function,\n         * and if the row was already dirty, restarts the save timer.  If the row\n         * was not already dirty, then it's not dirty now either and does nothing.\n         *\n         * Only the rowEntity parameter\n         * is processed, although other params are available.  Grid\n         * is automatically provided by the gridApi.\n         *\n         * @param {object} rowEntity the data entity for which the cell\n         * editing was cancelled\n         */\n        cancelEditCell: function( rowEntity, colDef ) {\n          var grid = this.grid;\n          var gridRow = grid.getRow( rowEntity );\n          if ( !gridRow ) { gridUtil.logError( 'Unable to find rowEntity in grid data, timer cannot be set' ); return; }\n\n          service.considerSetTimer( grid, gridRow );\n        },\n\n\n        /**\n         * @ngdoc method\n         * @methodOf ui.grid.rowEdit.service:uiGridRowEditService\n         * @name navigate\n         * @description cellNav tells us that the selected cell has changed.  If\n         * the new row had a timer running, then stop it similar to in a beginCellEdit\n         * call.  If the old row is dirty and not the same as the new row, then\n         * start a timer on it.\n         * @param {object} newRowCol the row and column that were selected\n         * @param {object} oldRowCol the row and column that was left\n         *\n         */\n        navigate: function( newRowCol, oldRowCol ) {\n          var grid = this.grid;\n          if ( newRowCol.row.rowEditSaveTimer ) {\n            service.cancelTimer( grid, newRowCol.row );\n          }\n\n          if ( oldRowCol && oldRowCol.row && oldRowCol.row !== newRowCol.row ) {\n            service.considerSetTimer( grid, oldRowCol.row );\n          }\n        },\n\n\n        /**\n         * @ngdoc property\n         * @propertyOf ui.grid.rowEdit.api:GridOptions\n         * @name rowEditWaitInterval\n         * @description How long the grid should wait for another change on this row\n         * before triggering a save (in milliseconds).  If set to -1, then saves are\n         * never triggered by timer (implying that the user will call flushDirtyRows()\n         * manually)\n         *\n         * @example\n         * Setting the wait interval to 4 seconds\n         * <pre>\n         *   $scope.gridOptions = { rowEditWaitInterval: 4000 }\n         * </pre>\n         *\n         */\n        /**\n         * @ngdoc method\n         * @methodOf ui.grid.rowEdit.service:uiGridRowEditService\n         * @name considerSetTimer\n         * @description Consider setting a timer on this row (if it is dirty).  if there is a timer running\n         * on the row and the row isn't currently saving, cancel it, using cancelTimer, then if the row is\n         * dirty and not currently saving then set a new timer\n         * @param {object} grid the grid for which we are processing\n         * @param {GridRow} gridRow the row for which the timer should be adjusted\n         *\n         */\n        considerSetTimer: function( grid, gridRow ) {\n          service.cancelTimer( grid, gridRow );\n\n          if ( gridRow.isDirty && !gridRow.isSaving ) {\n            if ( grid.options.rowEditWaitInterval !== -1 ) {\n              var waitTime = grid.options.rowEditWaitInterval ? grid.options.rowEditWaitInterval : 2000;\n              gridRow.rowEditSaveTimer = $interval( service.saveRow( grid, gridRow ), waitTime, 1);\n            }\n          }\n        },\n\n\n        /**\n         * @ngdoc method\n         * @methodOf ui.grid.rowEdit.service:uiGridRowEditService\n         * @name cancelTimer\n         * @description cancel the $interval for any timer running on this row\n         * then delete the timer itself\n         * @param {object} grid the grid for which we are processing\n         * @param {GridRow} gridRow the row for which the timer should be adjusted\n         *\n         */\n        cancelTimer: function( grid, gridRow ) {\n          if ( gridRow.rowEditSaveTimer && !gridRow.isSaving ) {\n            $interval.cancel(gridRow.rowEditSaveTimer);\n            delete gridRow.rowEditSaveTimer;\n          }\n        },\n\n\n        /**\n         * @ngdoc method\n         * @methodOf ui.grid.rowEdit.service:uiGridRowEditService\n         * @name setRowsDirty\n         * @description Sets each of the rows passed in dataRows\n         * to be dirty.  note that if you have only just inserted the\n         * rows into your data you will need to wait for a $digest cycle\n         * before the gridRows are present - so often you would wrap this\n         * call in a $interval or $timeout\n         * <pre>\n         *      $interval( function() {\n         *        gridApi.rowEdit.setRowsDirty( myDataRows);\n         *      }, 0, 1);\n         * </pre>\n         * @param {object} grid the grid for which rows should be set dirty\n         * @param {array} dataRows the data entities for which the gridRows\n         * should be set dirty.\n         *\n         */\n        setRowsDirty: function( grid, myDataRows ) {\n          var gridRow;\n          myDataRows.forEach( function( value, index ) {\n            gridRow = grid.getRow( value );\n            if ( gridRow ) {\n              if ( !grid.rowEdit.dirtyRows ) {\n                grid.rowEdit.dirtyRows = [];\n              }\n\n              if ( !gridRow.isDirty ) {\n                gridRow.isDirty = true;\n                grid.rowEdit.dirtyRows.push( gridRow );\n              }\n\n              delete gridRow.isError;\n\n              service.considerSetTimer( grid, gridRow );\n            } else {\n              gridUtil.logError( \"requested row not found in rowEdit.setRowsDirty, row was: \" + value );\n            }\n          });\n        },\n\n\n        /**\n         * @ngdoc method\n         * @methodOf ui.grid.rowEdit.service:uiGridRowEditService\n         * @name setRowsClean\n         * @description Sets each of the rows passed in dataRows\n         * to be clean, clearing the dirty flag and the error flag, and removing\n         * the rows from the dirty and error caches.\n         * @param {object} grid the grid for which rows should be set clean\n         * @param {array} dataRows the data entities for which the gridRows\n         * should be set clean.\n         *\n         */\n        setRowsClean: function( grid, myDataRows ) {\n          var gridRow;\n\n          myDataRows.forEach( function( value, index ) {\n            gridRow = grid.getRow( value );\n            if ( gridRow ) {\n              delete gridRow.isDirty;\n              service.removeRow( grid.rowEdit.dirtyRows, gridRow );\n              service.cancelTimer( grid, gridRow );\n\n              delete gridRow.isError;\n              service.removeRow( grid.rowEdit.errorRows, gridRow );\n            } else {\n              gridUtil.logError( \"requested row not found in rowEdit.setRowsClean, row was: \" + value );\n            }\n          });\n        }\n\n      };\n\n      return service;\n\n    }]);\n\n  /**\n   *  @ngdoc directive\n   *  @name ui.grid.rowEdit.directive:uiGridEdit\n   *  @element div\n   *  @restrict A\n   *\n   *  @description Adds row editing features to the ui-grid-edit directive.\n   *\n   */\n  module.directive('uiGridRowEdit', ['gridUtil', 'uiGridRowEditService', 'uiGridEditConstants',\n  function (gridUtil, uiGridRowEditService, uiGridEditConstants) {\n    return {\n      replace: true,\n      priority: 0,\n      require: '^uiGrid',\n      scope: false,\n      compile: function () {\n        return {\n          pre: function ($scope, $elm, $attrs, uiGridCtrl) {\n            uiGridRowEditService.initializeGrid($scope, uiGridCtrl.grid);\n          },\n          post: function ($scope, $elm, $attrs, uiGridCtrl) {\n          }\n        };\n      }\n    };\n  }]);\n\n\n  /**\n   *  @ngdoc directive\n   *  @name ui.grid.rowEdit.directive:uiGridViewport\n   *  @element div\n   *\n   *  @description Stacks on top of ui.grid.uiGridViewport to alter the attributes used\n   *  for the grid row to allow coloring of saving and error rows\n   */\n  module.directive('uiGridViewport',\n    ['$compile', 'uiGridConstants', 'gridUtil', '$parse',\n      function ($compile, uiGridConstants, gridUtil, $parse) {\n        return {\n          priority: -200, // run after default  directive\n          scope: false,\n          compile: function ($elm, $attrs) {\n            var rowRepeatDiv = angular.element($elm.children().children()[0]);\n\n            var existingNgClass = rowRepeatDiv.attr(\"ng-class\");\n            var newNgClass = '';\n            if ( existingNgClass ) {\n              newNgClass = existingNgClass.slice(0, -1) + \", 'ui-grid-row-dirty': row.isDirty, 'ui-grid-row-saving': row.isSaving, 'ui-grid-row-error': row.isError}\";\n            } else {\n              newNgClass = \"{'ui-grid-row-dirty': row.isDirty, 'ui-grid-row-saving': row.isSaving, 'ui-grid-row-error': row.isError}\";\n            }\n            rowRepeatDiv.attr(\"ng-class\", newNgClass);\n\n            return {\n              pre: function ($scope, $elm, $attrs, controllers) {\n\n              },\n              post: function ($scope, $elm, $attrs, controllers) {\n              }\n            };\n          }\n        };\n      }]);\n\n})();\n\n(function () {\n  'use strict';\n\n  /**\n   * @ngdoc overview\n   * @name ui.grid.saveState\n   * @description\n   *\n   * # ui.grid.saveState\n   *\n   * <div class=\"alert alert-success\" role=\"alert\"><strong>Stable</strong> This feature is stable. There should no longer be breaking api changes without a deprecation warning.</div>\n   *\n   * This module provides the ability to save the grid state, and restore\n   * it when the user returns to the page.\n   *\n   * No UI is provided, the caller should provide their own UI/buttons\n   * as appropriate. Usually the navigate events would be used to save\n   * the grid state and restore it.\n   *\n   * <br/>\n   * <br/>\n   *\n   * <div doc-module-components=\"ui.grid.save-state\"></div>\n   */\n\n  var module = angular.module('ui.grid.saveState', ['ui.grid', 'ui.grid.selection', 'ui.grid.cellNav', 'ui.grid.grouping', 'ui.grid.pinning', 'ui.grid.treeView']);\n\n  /**\n   *  @ngdoc object\n   *  @name ui.grid.saveState.constant:uiGridSaveStateConstants\n   *\n   *  @description constants available in save state module\n   */\n\n  module.constant('uiGridSaveStateConstants', {\n    featureName: 'saveState'\n  });\n\n  /**\n   *  @ngdoc service\n   *  @name ui.grid.saveState.service:uiGridSaveStateService\n   *\n   *  @description Services for saveState feature\n   */\n  module.service('uiGridSaveStateService',\n    function () {\n      var service = {\n\n        initializeGrid: function (grid) {\n\n          // add feature namespace and any properties to grid for needed state\n          grid.saveState = {};\n          this.defaultGridOptions(grid.options);\n\n          /**\n           *  @ngdoc object\n           *  @name ui.grid.saveState.api:PublicApi\n           *\n           *  @description Public Api for saveState feature\n           */\n          var publicApi = {\n            events: {\n              saveState: {\n              }\n            },\n            methods: {\n              saveState: {\n                /**\n                 * @ngdoc function\n                 * @name save\n                 * @methodOf  ui.grid.saveState.api:PublicApi\n                 * @description Packages the current state of the grid into\n                 * an object, and provides it to the user for saving\n                 * @returns {object} the state as a javascript object that can be saved\n                 */\n                save: function () {\n                  return service.save(grid);\n                },\n                /**\n                 * @ngdoc function\n                 * @name restore\n                 * @methodOf  ui.grid.saveState.api:PublicApi\n                 * @description Restores the provided state into the grid\n                 * @param {scope} $scope a scope that we can broadcast on\n                 * @param {object} state the state that should be restored into the grid\n                 * @returns {object} the promise created by refresh\n                 */\n                restore: function ( $scope, state) {\n                  return service.restore(grid, $scope, state);\n                }\n              }\n            }\n          };\n\n          grid.api.registerEventsFromObject(publicApi.events);\n\n          grid.api.registerMethodsFromObject(publicApi.methods);\n        },\n\n        defaultGridOptions: function (gridOptions) {\n          // default option to true unless it was explicitly set to false\n          /**\n           * @ngdoc object\n           * @name ui.grid.saveState.api:GridOptions\n           *\n           * @description GridOptions for saveState feature, these are available to be\n           * set using the ui-grid {@link ui.grid.class:GridOptions gridOptions}\n           */\n          /**\n           * @ngdoc object\n           * @name saveWidths\n           * @propertyOf  ui.grid.saveState.api:GridOptions\n           * @description Save the current column widths.  Note that unless\n           * you've provided the user with some way to resize their columns (say\n           * the resize columns feature), then this makes little sense.\n           * <br/>Defaults to true\n           */\n          gridOptions.saveWidths = gridOptions.saveWidths !== false;\n          /**\n           * @ngdoc object\n           * @name saveOrder\n           * @propertyOf  ui.grid.saveState.api:GridOptions\n           * @description Restore the current column order.  Note that unless\n           * you've provided the user with some way to reorder their columns (for\n           * example the move columns feature), this makes little sense.\n           * <br/>Defaults to true\n           */\n          gridOptions.saveOrder = gridOptions.saveOrder !== false;\n          /**\n           * @ngdoc object\n           * @name saveScroll\n           * @propertyOf  ui.grid.saveState.api:GridOptions\n           * @description Save the current scroll position.  Note that this\n           * is saved as the percentage of the grid scrolled - so if your\n           * user returns to a grid with a significantly different number of\n           * rows (perhaps some data has been deleted) then the scroll won't\n           * actually show the same rows as before.  If you want to scroll to\n           * a specific row then you should instead use the saveFocus option, which\n           * is the default.\n           *\n           * Note that this element will only be saved if the cellNav feature is\n           * enabled\n           * <br/>Defaults to false\n           */\n          gridOptions.saveScroll = gridOptions.saveScroll === true;\n          /**\n           * @ngdoc object\n           * @name saveFocus\n           * @propertyOf  ui.grid.saveState.api:GridOptions\n           * @description Save the current focused cell.  On returning\n           * to this focused cell we'll also scroll.  This option is\n           * preferred to the saveScroll option, so is set to true by\n           * default.  If saveScroll is set to true then this option will\n           * be disabled.\n           *\n           * By default this option saves the current row number and column\n           * number, and returns to that row and column.  However, if you define\n           * a saveRowIdentity function, then it will return you to the currently\n           * selected column within that row (in a business sense - so if some\n           * rows have been deleted, it will still find the same data, presuming it\n           * still exists in the list.  If it isn't in the list then it will instead\n           * return to the same row number - i.e. scroll percentage)\n           *\n           * Note that this option will do nothing if the cellNav\n           * feature is not enabled.\n           *\n           * <br/>Defaults to true (unless saveScroll is true)\n           */\n          gridOptions.saveFocus = gridOptions.saveScroll !== true && gridOptions.saveFocus !== false;\n          /**\n           * @ngdoc object\n           * @name saveRowIdentity\n           * @propertyOf  ui.grid.saveState.api:GridOptions\n           * @description A function that can be called, passing in a rowEntity,\n           * and that will return a unique id for that row.  This might simply\n           * return the `id` field from that row (if you have one), or it might\n           * concatenate some fields within the row to make a unique value.\n           *\n           * This value will be used to find the same row again and set the focus\n           * to it, if it exists when we return.\n           *\n           * <br/>Defaults to undefined\n           */\n          /**\n           * @ngdoc object\n           * @name saveVisible\n           * @propertyOf  ui.grid.saveState.api:GridOptions\n           * @description Save whether or not columns are visible.\n           *\n           * <br/>Defaults to true\n           */\n          gridOptions.saveVisible = gridOptions.saveVisible !== false;\n          /**\n           * @ngdoc object\n           * @name saveSort\n           * @propertyOf  ui.grid.saveState.api:GridOptions\n           * @description Save the current sort state for each column\n           *\n           * <br/>Defaults to true\n           */\n          gridOptions.saveSort = gridOptions.saveSort !== false;\n          /**\n           * @ngdoc object\n           * @name saveFilter\n           * @propertyOf  ui.grid.saveState.api:GridOptions\n           * @description Save the current filter state for each column\n           *\n           * <br/>Defaults to true\n           */\n          gridOptions.saveFilter = gridOptions.saveFilter !== false;\n          /**\n           * @ngdoc object\n           * @name saveSelection\n           * @propertyOf  ui.grid.saveState.api:GridOptions\n           * @description Save the currently selected rows.  If the `saveRowIdentity` callback\n           * is defined, then it will save the id of the row and select that.  If not, then\n           * it will attempt to select the rows by row number, which will give the wrong results\n           * if the data set has changed in the mean-time.\n           *\n           * Note that this option only does anything\n           * if the selection feature is enabled.\n           *\n           * <br/>Defaults to true\n           */\n          gridOptions.saveSelection = gridOptions.saveSelection !== false;\n          /**\n           * @ngdoc object\n           * @name saveGrouping\n           * @propertyOf  ui.grid.saveState.api:GridOptions\n           * @description Save the grouping configuration.  If set to true and the\n           * grouping feature is not enabled then does nothing.\n           *\n           * <br/>Defaults to true\n           */\n          gridOptions.saveGrouping = gridOptions.saveGrouping !== false;\n          /**\n           * @ngdoc object\n           * @name saveGroupingExpandedStates\n           * @propertyOf  ui.grid.saveState.api:GridOptions\n           * @description Save the grouping row expanded states.  If set to true and the\n           * grouping feature is not enabled then does nothing.\n           *\n           * This can be quite a bit of data, in many cases you wouldn't want to save this\n           * information.\n           *\n           * <br/>Defaults to false\n           */\n          gridOptions.saveGroupingExpandedStates = gridOptions.saveGroupingExpandedStates === true;\n          /**\n           * @ngdoc object\n           * @name savePinning\n           * @propertyOf ui.grid.saveState.api:GridOptions\n           * @description Save pinning state for columns.\n           *\n           * <br/>Defaults to true\n           */\n          gridOptions.savePinning = gridOptions.savePinning !== false;\n          /**\n           * @ngdoc object\n           * @name saveTreeView\n           * @propertyOf  ui.grid.saveState.api:GridOptions\n           * @description Save the treeView configuration.  If set to true and the\n           * treeView feature is not enabled then does nothing.\n           *\n           * <br/>Defaults to true\n           */\n          gridOptions.saveTreeView = gridOptions.saveTreeView !== false;\n        },\n\n        /**\n         * @ngdoc function\n         * @name save\n         * @methodOf  ui.grid.saveState.service:uiGridSaveStateService\n         * @description Saves the current grid state into an object, and\n         * passes that object back to the caller\n         * @param {Grid} grid the grid whose state we'd like to save\n         * @returns {object} the state ready to be saved\n         */\n        save: function (grid) {\n          var savedState = {};\n\n          savedState.columns = service.saveColumns( grid );\n          savedState.scrollFocus = service.saveScrollFocus( grid );\n          savedState.selection = service.saveSelection( grid );\n          savedState.grouping = service.saveGrouping( grid );\n          savedState.treeView = service.saveTreeView( grid );\n          savedState.pagination = service.savePagination( grid );\n\n          return savedState;\n        },\n\n\n        /**\n         * @ngdoc function\n         * @name restore\n         * @methodOf  ui.grid.saveState.service:uiGridSaveStateService\n         * @description Applies the provided state to the grid\n         *\n         * @param {Grid} grid the grid whose state we'd like to restore\n         * @param {scope} $scope a scope that we can broadcast on\n         * @param {object} state the state we'd like to restore\n         * @returns {object} the promise created by refresh\n         */\n        restore: function( grid, $scope, state ) {\n          if ( state.columns ) {\n            service.restoreColumns( grid, state.columns );\n          }\n\n          if ( state.scrollFocus ) {\n            service.restoreScrollFocus( grid, $scope, state.scrollFocus );\n          }\n\n          if ( state.selection ) {\n            service.restoreSelection( grid, state.selection );\n          }\n\n          if ( state.grouping ) {\n            service.restoreGrouping( grid, state.grouping );\n          }\n\n          if ( state.treeView ) {\n            service.restoreTreeView( grid, state.treeView );\n          }\n\n          if ( state.pagination ) {\n            service.restorePagination( grid, state.pagination );\n          }\n\n          return grid.refresh();\n        },\n\n\n        /**\n         * @ngdoc function\n         * @name saveColumns\n         * @methodOf  ui.grid.saveState.service:uiGridSaveStateService\n         * @description Saves the column setup, including sort, filters, ordering,\n         * pinning and column widths.\n         *\n         * Works through the current columns, storing them in order.  Stores the\n         * column name, then the visible flag, width, sort and filters for each column.\n         *\n         * @param {Grid} grid the grid whose state we'd like to save\n         * @returns {array} the columns state ready to be saved\n         */\n        saveColumns: function( grid ) {\n          var columns = [];\n\n          grid.getOnlyDataColumns().forEach( function( column ) {\n            var savedColumn = {};\n            savedColumn.name = column.name;\n\n            if ( grid.options.saveVisible ) {\n              savedColumn.visible = column.visible;\n            }\n\n            if ( grid.options.saveWidths ) {\n              savedColumn.width = column.width;\n            }\n\n            // these two must be copied, not just pointed too - otherwise our saved state is pointing to the same object as current state\n            if ( grid.options.saveSort ) {\n              savedColumn.sort = angular.copy( column.sort );\n            }\n\n            if ( grid.options.saveFilter ) {\n              savedColumn.filters = [];\n              column.filters.forEach( function( filter ) {\n                var copiedFilter = {};\n                angular.forEach( filter, function( value, key) {\n                  if ( key !== 'condition' && key !== '$$hashKey' && key !== 'placeholder') {\n                    copiedFilter[key] = value;\n                  }\n                });\n                savedColumn.filters.push(copiedFilter);\n              });\n            }\n\n            if ( !!grid.api.pinning && grid.options.savePinning ) {\n              savedColumn.pinned = column.renderContainer ? column.renderContainer : '';\n            }\n\n            columns.push( savedColumn );\n          });\n\n          return columns;\n        },\n\n\n        /**\n         * @ngdoc function\n         * @name saveScrollFocus\n         * @methodOf  ui.grid.saveState.service:uiGridSaveStateService\n         * @description Saves the currently scroll or focus.\n         *\n         * If cellNav isn't present then does nothing - we can't return\n         * to the scroll position without cellNav anyway.\n         *\n         * If the cellNav module is present, and saveFocus is true, then\n         * it saves the currently focused cell.  If rowIdentity is present\n         * then saves using rowIdentity, otherwise saves visibleRowNum.\n         *\n         * If the cellNav module is not present, and saveScroll is true, then\n         * it approximates the current scroll row and column, and saves that.\n         *\n         * @param {Grid} grid the grid whose state we'd like to save\n         * @returns {object} the selection state ready to be saved\n         */\n        saveScrollFocus: function( grid ) {\n          if ( !grid.api.cellNav ) {\n            return {};\n          }\n\n          var scrollFocus = {};\n          if ( grid.options.saveFocus ) {\n            scrollFocus.focus = true;\n            var rowCol = grid.api.cellNav.getFocusedCell();\n            if ( rowCol !== null ) {\n              if ( rowCol.col !== null ) {\n                scrollFocus.colName = rowCol.col.colDef.name;\n              }\n              if ( rowCol.row !== null ) {\n                scrollFocus.rowVal = service.getRowVal( grid, rowCol.row );\n              }\n            }\n          }\n\n          if ( grid.options.saveScroll || grid.options.saveFocus && !scrollFocus.colName && !scrollFocus.rowVal ) {\n            scrollFocus.focus = false;\n            if ( grid.renderContainers.body.prevRowScrollIndex ) {\n              scrollFocus.rowVal = service.getRowVal( grid, grid.renderContainers.body.visibleRowCache[ grid.renderContainers.body.prevRowScrollIndex ]);\n            }\n\n            if ( grid.renderContainers.body.prevColScrollIndex ) {\n              scrollFocus.colName = grid.renderContainers.body.visibleColumnCache[ grid.renderContainers.body.prevColScrollIndex ].name;\n            }\n          }\n\n          return scrollFocus;\n        },\n\n\n        /**\n         * @ngdoc function\n         * @name saveSelection\n         * @methodOf  ui.grid.saveState.service:uiGridSaveStateService\n         * @description Saves the currently selected rows, if the selection feature is enabled\n         * @param {Grid} grid the grid whose state we'd like to save\n         * @returns {array} the selection state ready to be saved\n         */\n        saveSelection: function( grid ) {\n          if ( !grid.api.selection || !grid.options.saveSelection ) {\n            return [];\n          }\n\n          return grid.api.selection.getSelectedGridRows().map( function( gridRow ) {\n            return service.getRowVal( grid, gridRow );\n          });\n        },\n\n\n        /**\n         * @ngdoc function\n         * @name saveGrouping\n         * @methodOf  ui.grid.saveState.service:uiGridSaveStateService\n         * @description Saves the grouping state, if the grouping feature is enabled\n         * @param {Grid} grid the grid whose state we'd like to save\n         * @returns {object} the grouping state ready to be saved\n         */\n        saveGrouping: function( grid ) {\n          if ( !grid.api.grouping || !grid.options.saveGrouping ) {\n            return {};\n          }\n\n          return grid.api.grouping.getGrouping( grid.options.saveGroupingExpandedStates );\n        },\n\n\n        /**\n         * @ngdoc function\n         * @name savePagination\n         * @methodOf  ui.grid.saveState.service:uiGridSaveStateService\n         * @description Saves the pagination state, if the pagination feature is enabled\n         * @param {Grid} grid the grid whose state we'd like to save\n         * @returns {object} the pagination state ready to be saved\n         */\n        savePagination: function( grid ) {\n          if ( !grid.api.pagination || !grid.options.paginationPageSize ) {\n            return {};\n          }\n\n          return {\n            paginationCurrentPage: grid.options.paginationCurrentPage,\n            paginationPageSize: grid.options.paginationPageSize\n          };\n        },\n\n\n        /**\n         * @ngdoc function\n         * @name saveTreeView\n         * @methodOf  ui.grid.saveState.service:uiGridSaveStateService\n         * @description Saves the tree view state, if the tree feature is enabled\n         * @param {Grid} grid the grid whose state we'd like to save\n         * @returns {object} the tree view state ready to be saved\n         */\n        saveTreeView: function( grid ) {\n          if ( !grid.api.treeView || !grid.options.saveTreeView ) {\n            return {};\n          }\n\n          return grid.api.treeView.getTreeView();\n        },\n\n\n        /**\n         * @ngdoc function\n         * @name getRowVal\n         * @methodOf  ui.grid.saveState.service:uiGridSaveStateService\n         * @description Helper function that gets either the rowNum or\n         * the saveRowIdentity, given a gridRow\n         * @param {Grid} grid the grid the row is in\n         * @param {GridRow} gridRow the row we want the rowNum for\n         * @returns {object} an object containing { identity: true/false, row: rowNumber/rowIdentity }\n         *\n         */\n        getRowVal: function( grid, gridRow ) {\n          if ( !gridRow ) {\n            return null;\n          }\n\n          var rowVal = {};\n          if ( grid.options.saveRowIdentity ) {\n            rowVal.identity = true;\n            rowVal.row = grid.options.saveRowIdentity( gridRow.entity );\n          }\n          else {\n            rowVal.identity = false;\n            rowVal.row = grid.renderContainers.body.visibleRowCache.indexOf( gridRow );\n          }\n          return rowVal;\n        },\n\n\n        /**\n         * @ngdoc function\n         * @name restoreColumns\n         * @methodOf  ui.grid.saveState.service:uiGridSaveStateService\n         * @description Restores the columns, including order, visible, width,\n         * pinning, sort and filters.\n         *\n         * @param {Grid} grid the grid whose state we'd like to restore\n         * @param {object} columnsState the list of columns we had before, with their state\n         */\n        restoreColumns: function( grid, columnsState ) {\n          var isSortChanged = false;\n\n          columnsState.forEach( function( columnState, index ) {\n            var currentCol = grid.getColumn( columnState.name );\n\n            if ( currentCol && !grid.isRowHeaderColumn(currentCol) ) {\n              if ( grid.options.saveVisible &&\n                   ( currentCol.visible !== columnState.visible ||\n                     currentCol.colDef.visible !== columnState.visible ) ) {\n                currentCol.visible = columnState.visible;\n                currentCol.colDef.visible = columnState.visible;\n                grid.api.core.raise.columnVisibilityChanged(currentCol);\n              }\n\n              if ( grid.options.saveWidths && currentCol.width !== columnState.width) {\n                currentCol.width = columnState.width;\n                currentCol.hasCustomWidth = true;\n              }\n\n              if ( grid.options.saveSort &&\n                   !angular.equals(currentCol.sort, columnState.sort) &&\n                   !( currentCol.sort === undefined && angular.isEmpty(columnState.sort) ) ) {\n                currentCol.sort = angular.copy( columnState.sort );\n                isSortChanged = true;\n              }\n\n              if ( grid.options.saveFilter &&\n                   !angular.equals(currentCol.filters, columnState.filters ) ) {\n                columnState.filters.forEach( function( filter, index ) {\n                  angular.extend( currentCol.filters[index], filter );\n                  if ( typeof(filter.term) === 'undefined' || filter.term === null ) {\n                    delete currentCol.filters[index].term;\n                  }\n                });\n                grid.api.core.raise.filterChanged( currentCol );\n              }\n\n              if ( !!grid.api.pinning && grid.options.savePinning && currentCol.renderContainer !== columnState.pinned ) {\n                grid.api.pinning.pinColumn(currentCol, columnState.pinned);\n              }\n\n              var currentIndex = grid.getOnlyDataColumns().indexOf( currentCol );\n              if (currentIndex !== -1) {\n                if (grid.options.saveOrder && currentIndex !== index) {\n                  var column = grid.columns.splice(currentIndex + grid.rowHeaderColumns.length, 1)[0];\n                  grid.columns.splice(index + grid.rowHeaderColumns.length, 0, column);\n                }\n              }\n            }\n          });\n\n          if ( isSortChanged ) {\n            grid.api.core.raise.sortChanged( grid, grid.getColumnSorting() );\n          }\n        },\n\n\n        /**\n         * @ngdoc function\n         * @name restoreScrollFocus\n         * @methodOf  ui.grid.saveState.service:uiGridSaveStateService\n         * @description Scrolls to the position that was saved.  If focus is true, then\n         * sets focus to the specified row/col.  If focus is false, then scrolls to the\n         * specified row/col.\n         *\n         * @param {Grid} grid the grid whose state we'd like to restore\n         * @param {scope} $scope a scope that we can broadcast on\n         * @param {object} scrollFocusState the scroll/focus state ready to be restored\n         */\n        restoreScrollFocus: function( grid, $scope, scrollFocusState ) {\n          if ( !grid.api.cellNav ) {\n            return;\n          }\n\n          var colDef, row;\n          if ( scrollFocusState.colName ) {\n            var colDefs = grid.options.columnDefs.filter( function( colDef ) { return colDef.name === scrollFocusState.colName; });\n            if ( colDefs.length > 0 ) {\n              colDef = colDefs[0];\n            }\n          }\n\n          if ( scrollFocusState.rowVal && scrollFocusState.rowVal.row ) {\n            if ( scrollFocusState.rowVal.identity ) {\n              row = service.findRowByIdentity( grid, scrollFocusState.rowVal );\n            }\n            else {\n              row = grid.renderContainers.body.visibleRowCache[ scrollFocusState.rowVal.row ];\n            }\n          }\n\n          var entity = row && row.entity ? row.entity : null ;\n\n          if ( colDef || entity ) {\n            if (scrollFocusState.focus ) {\n              grid.api.cellNav.scrollToFocus( entity, colDef );\n            }\n            else {\n              grid.scrollTo( entity, colDef );\n            }\n          }\n        },\n\n\n        /**\n         * @ngdoc function\n         * @name restoreSelection\n         * @methodOf  ui.grid.saveState.service:uiGridSaveStateService\n         * @description Selects the rows that are provided in the selection\n         * state.  If you are using `saveRowIdentity` and more than one row matches the identity\n         * function then only the first is selected.\n         * @param {Grid} grid the grid whose state we'd like to restore\n         * @param {object} selectionState the selection state ready to be restored\n         */\n        restoreSelection: function( grid, selectionState ) {\n          if ( !grid.api.selection ) {\n            return;\n          }\n\n          grid.api.selection.clearSelectedRows();\n\n          selectionState.forEach(function( rowVal ) {\n            if ( rowVal.identity ) {\n              var foundRow = service.findRowByIdentity( grid, rowVal );\n\n              if ( foundRow ) {\n                grid.api.selection.selectRow( foundRow.entity );\n              }\n\n            }\n            else {\n              grid.api.selection.selectRowByVisibleIndex( rowVal.row );\n            }\n          });\n        },\n\n\n        /**\n         * @ngdoc function\n         * @name restoreGrouping\n         * @methodOf  ui.grid.saveState.service:uiGridSaveStateService\n         * @description Restores the grouping configuration, if the grouping feature\n         * is enabled.\n         * @param {Grid} grid the grid whose state we'd like to restore\n         * @param {object} groupingState the grouping state ready to be restored\n         */\n        restoreGrouping: function( grid, groupingState ) {\n          if ( !grid.api.grouping || typeof(groupingState) === 'undefined' || groupingState === null || angular.equals(groupingState, {}) ) {\n            return;\n          }\n\n          grid.api.grouping.setGrouping( groupingState );\n        },\n\n        /**\n         * @ngdoc function\n         * @name restoreTreeView\n         * @methodOf  ui.grid.saveState.service:uiGridSaveStateService\n         * @description Restores the tree view configuration, if the tree view feature\n         * is enabled.\n         * @param {Grid} grid the grid whose state we'd like to restore\n         * @param {object} treeViewState the tree view state ready to be restored\n         */\n        restoreTreeView: function( grid, treeViewState ) {\n          if ( !grid.api.treeView || typeof(treeViewState) === 'undefined' || treeViewState === null || angular.equals(treeViewState, {}) ) {\n            return;\n          }\n\n          grid.api.treeView.setTreeView( treeViewState );\n        },\n\n        /**\n         * @ngdoc function\n         * @name restorePagination\n         * @methodOf  ui.grid.saveState.service:uiGridSaveStateService\n         * @description Restores the pagination information, if pagination is enabled.\n         * @param {Grid} grid the grid whose state we'd like to restore\n         * @param {object} pagination the pagination object to be restored\n         * @param {number} pagination.paginationCurrentPage the page number to restore\n         * @param {number} pagination.paginationPageSize the number of items displayed per page\n         */\n        restorePagination: function( grid, pagination ) {\n          if ( !grid.api.pagination || !grid.options.paginationPageSize ) {\n            return;\n          }\n\n          grid.options.paginationCurrentPage = pagination.paginationCurrentPage;\n          grid.options.paginationPageSize = pagination.paginationPageSize;\n        },\n\n        /**\n         * @ngdoc function\n         * @name findRowByIdentity\n         * @methodOf  ui.grid.saveState.service:uiGridSaveStateService\n         * @description Finds a row given it's identity value, returns the first found row\n         * if any are found, otherwise returns null if no rows are found.\n         * @param {Grid} grid the grid whose state we'd like to restore\n         * @param {object} rowVal the row we'd like to find\n         * @returns {gridRow} the found row, or null if none found\n         */\n        findRowByIdentity: function( grid, rowVal ) {\n          if ( !grid.options.saveRowIdentity ) {\n            return null;\n          }\n\n          var filteredRows = grid.rows.filter( function( gridRow ) {\n            return ( grid.options.saveRowIdentity( gridRow.entity ) === rowVal.row );\n          });\n\n          if ( filteredRows.length > 0 ) {\n            return filteredRows[0];\n          } else {\n            return null;\n          }\n        }\n      };\n\n      return service;\n    }\n  );\n\n  /**\n   *  @ngdoc directive\n   *  @name ui.grid.saveState.directive:uiGridSaveState\n   *  @element div\n   *  @restrict A\n   *\n   *  @description Adds saveState features to grid\n   *\n   *  @example\n   <example module=\"app\">\n   <file name=\"app.js\">\n   var app = angular.module('app', ['ui.grid', 'ui.grid.saveState']);\n\n   app.controller('MainCtrl', ['$scope', function ($scope) {\n      $scope.data = [\n        { name: 'Bob', title: 'CEO' },\n        { name: 'Frank', title: 'Lowly Developer' }\n      ];\n\n      $scope.gridOptions = {\n        columnDefs: [\n          {name: 'name'},\n          {name: 'title', enableCellEdit: true}\n        ],\n        data: $scope.data\n      };\n    }]);\n   </file>\n   <file name=\"index.ced81ed4.html\">\n   <div ng-controller=\"MainCtrl\">\n   <div ui-grid=\"gridOptions\" ui-grid-save-state></div>\n   </div>\n   </file>\n   </example>\n   */\n  module.directive('uiGridSaveState', ['uiGridSaveStateConstants', 'uiGridSaveStateService', 'gridUtil', '$compile',\n    function (uiGridSaveStateConstants, uiGridSaveStateService, gridUtil, $compile) {\n      return {\n        replace: true,\n        priority: 0,\n        require: '^uiGrid',\n        scope: false,\n        link: function ($scope, $elm, $attrs, uiGridCtrl) {\n          uiGridSaveStateService.initializeGrid(uiGridCtrl.grid);\n        }\n      };\n    }\n  ]);\n})();\n\n(function () {\n  'use strict';\n\n  /**\n   * @ngdoc overview\n   * @name ui.grid.selection\n   * @description\n   *\n   * # ui.grid.selection\n   * This module provides row selection\n   *\n   * <div class=\"alert alert-success\" role=\"alert\"><strong>Stable</strong> This feature is stable. There should no longer be breaking api changes without a deprecation warning.</div>\n   *\n   * <div doc-module-components=\"ui.grid.selection\"></div>\n   */\n\n  var module = angular.module('ui.grid.selection', ['ui.grid']);\n\n  /**\n   *  @ngdoc object\n   *  @name ui.grid.selection.constant:uiGridSelectionConstants\n   *\n   *  @description constants available in selection module\n   */\n  module.constant('uiGridSelectionConstants', {\n    featureName: 'selection',\n    selectionRowHeaderColName: 'selectionRowHeaderCol'\n  });\n\n  // add methods to GridRow\n  angular.module('ui.grid').config(['$provide', function ($provide) {\n    $provide.decorator('GridRow', ['$delegate', function ($delegate) {\n\n      /**\n       *  @ngdoc object\n       *  @name ui.grid.selection.api:GridRow\n       *\n       *  @description GridRow prototype functions added for selection\n       */\n\n      /**\n       *  @ngdoc object\n       *  @name enableSelection\n       *  @propertyOf  ui.grid.selection.api:GridRow\n       *  @description Enable row selection for this row, only settable by internal code.\n       *\n       *  The grouping feature, for example, might set group header rows to not be selectable.\n       *  <br/>Defaults to true\n       */\n\n      /**\n       *  @ngdoc object\n       *  @name isSelected\n       *  @propertyOf  ui.grid.selection.api:GridRow\n       *  @description Selected state of row. Should be readonly. Make any changes to selected state using setSelected().\n       *  <br/>Defaults to false\n       */\n\n      /**\n       *  @ngdoc object\n       *  @name isFocused\n       *  @propertyOf  ui.grid.selection.api:GridRow\n       *  @description Focused state of row. Should be readonly. Make any changes to focused state using setFocused().\n       *  <br/>Defaults to false\n       */\n\n      /**\n       * @ngdoc function\n       * @name setSelected\n       * @methodOf ui.grid.selection.api:GridRow\n       * @description Sets the isSelected property and updates the selectedCount\n       * Changes to isSelected state should only be made via this function\n       * @param {Boolean} selected value to set\n       */\n      $delegate.prototype.setSelected = function (selected) {\n        if (selected !== this.isSelected) {\n          this.isSelected = selected;\n          this.grid.selection.selectedCount += selected ? 1 : -1;\n        }\n      };\n\n      /**\n       * @ngdoc function\n       * @name setFocused\n       * @methodOf ui.grid.selection.api:GridRow\n       * @description Sets the isFocused property\n       * Changes to isFocused state should only be made via this function\n       * @param {Boolean} val value to set\n       */\n      $delegate.prototype.setFocused = function(val) {\n        if (val !== this.isFocused) {\n          this.grid.selection.focusedRow && (this.grid.selection.focusedRow.isFocused = false);\n          this.grid.selection.focusedRow = val ? this : null;\n          this.isFocused = val;\n        }\n      };\n\n      return $delegate;\n    }]);\n  }]);\n\n  /**\n   *  @ngdoc service\n   *  @name ui.grid.selection.service:uiGridSelectionService\n   *\n   *  @description Services for selection features\n   */\n  module.service('uiGridSelectionService',\n    function () {\n      var service = {\n\n        initializeGrid: function (grid) {\n\n          // add feature namespace and any properties to grid for needed\n          /**\n           *  @ngdoc object\n           *  @name ui.grid.selection.grid:selection\n           *\n           *  @description Grid properties and functions added for selection\n           */\n          grid.selection = {\n            lastSelectedRow: null,\n            /**\n             *  @ngdoc object\n             *  @name focusedRow\n             *  @propertyOf  ui.grid.selection.grid:selection\n             *  @description Focused row.\n             */\n            focusedRow: null,\n            selectAll: false\n          };\n\n\n          /**\n           *  @ngdoc object\n           *  @name selectedCount\n           *  @propertyOf  ui.grid.selection.grid:selection\n           *  @description Current count of selected rows\n           *  @example\n           *  var count = grid.selection.selectedCount\n           */\n          grid.selection.selectedCount = 0;\n\n          service.defaultGridOptions(grid.options);\n\n          /**\n           *  @ngdoc object\n           *  @name ui.grid.selection.api:PublicApi\n           *\n           *  @description Public Api for selection feature\n           */\n          var publicApi = {\n            events: {\n              selection: {\n                /**\n                 * @ngdoc event\n                 * @name rowFocusChanged\n                 * @eventOf  ui.grid.selection.api:PublicApi\n                 * @description  is raised after the row.isFocused state is changed\n                 * @param {object} scope the scope associated with the grid\n                 * @param {GridRow} row the row that was focused/unfocused\n                 * @param {Event} evt object if raised from an event\n                 */\n                rowFocusChanged: function (scope, row, evt) {},\n                /**\n                 * @ngdoc event\n                 * @name rowSelectionChanged\n                 * @eventOf  ui.grid.selection.api:PublicApi\n                 * @description  is raised after the row.isSelected state is changed\n                 * @param {object} scope the scope associated with the grid\n                 * @param {GridRow} row the row that was selected/deselected\n                 * @param {Event} evt object if raised from an event\n                 */\n                rowSelectionChanged: function (scope, row, evt) {\n                },\n                /**\n                 * @ngdoc event\n                 * @name rowSelectionChangedBatch\n                 * @eventOf  ui.grid.selection.api:PublicApi\n                 * @description  is raised after the row.isSelected state is changed\n                 * in bulk, if the `enableSelectionBatchEvent` option is set to true\n                 * (which it is by default).  This allows more efficient processing\n                 * of bulk events.\n                 * @param {object} scope the scope associated with the grid\n                 * @param {array} rows the rows that were selected/deselected\n                 * @param {Event} evt object if raised from an event\n                 */\n                rowSelectionChangedBatch: function (scope, rows, evt) {\n                }\n              }\n            },\n            methods: {\n              selection: {\n                /**\n                 * @ngdoc function\n                 * @name toggleRowSelection\n                 * @methodOf  ui.grid.selection.api:PublicApi\n                 * @description Toggles data row as selected or unselected\n                 * @param {object} rowEntity gridOptions.data[] array instance\n                 * @param {Event} evt object if raised from an event\n                 */\n                toggleRowSelection: function (rowEntity, evt) {\n                  var row = grid.getRow(rowEntity);\n                  if (row != void 0 && row !== null) {\n                    service.toggleRowSelection(grid, row, evt, grid.options.multiSelect, grid.options.noUnselect, true);\n                  }\n                },\n                /**\n                 * @ngdoc function\n                 * @name selectRow\n                 * @methodOf  ui.grid.selection.api:PublicApi\n                 * @description Select the data row\n                 * @param {object} rowEntity gridOptions.data[] array instance\n                 * @param {Event} evt object if raised from an event\n                 */\n                selectRow: function (rowEntity, evt) {\n                  var row = grid.getRow(rowEntity);\n                  if (row != void 0 && row !== null && !row.isSelected) {\n                    service.toggleRowSelection(grid, row, evt, grid.options.multiSelect, grid.options.noUnselect, true);\n                  }\n                },\n                /**\n                 * @ngdoc function\n                 * @name selectRowByVisibleIndex\n                 * @methodOf  ui.grid.selection.api:PublicApi\n                 * @description Select the specified row by visible index (i.e. if you\n                 * specify row 0 you'll get the first visible row selected).  In this context\n                 * visible means of those rows that are theoretically visible (i.e. not filtered),\n                 * rather than rows currently rendered on the screen.\n                 * @param {number} rowNum index within the rowsVisible array\n                 * @param {Event} evt object if raised from an event\n                 */\n                selectRowByVisibleIndex: function (rowNum, evt) {\n                  var row = grid.renderContainers.body.visibleRowCache[rowNum];\n                  if (row != void 0 && row !== null && typeof (row) !== 'undefined' && !row.isSelected) {\n                    service.toggleRowSelection(grid, row, evt, grid.options.multiSelect, grid.options.noUnselect, false);\n                  }\n                },\n                /**\n                 * @ngdoc function\n                 * @name selectRowByKey\n                 * @methodOf  ui.grid.selection.api:PublicApi\n                 * @description selects all GridRows who have an key that is equal to comparator\n                 * so for Example if isInEntity == false then it does this check: row[key] === comparator\n                 * if isInEntity == true then it does this check: row.entity[key] === comparator\n                 * @param {boolean} isInEntity if true then key is in entity else it's directly in row\n                 * @param {string | number} key the key to look for\n                 * @param {any} comparator the value that key should have\n                 * @param {Event} evt [optional] object if raised from an event\n                 * @param {array} lookInRows [optional] the rows to look in - if not provided then looks in grid.rows\n                */\n                selectRowByKey: function (isInEntity, key, comparator, evt, lookInRows) {\n                  var row = grid.findRowByKey(isInEntity, key, comparator, lookInRows);\n                  if (row != void 0 && row !== null && typeof (row) !== 'undefined' && !row.isSelected) {\n                    service.toggleRowSelection(grid, row, evt, grid.options.multiSelect, grid.options.noUnselect, false);\n                  }\n                },\n                /**\n                 * @ngdoc function\n                 * @name unSelectRow\n                 * @methodOf  ui.grid.selection.api:PublicApi\n                 * @description UnSelect the data row\n                 * @param {object} rowEntity gridOptions.data[] array instance\n                 * @param {Event} evt object if raised from an event\n                 */\n                unSelectRow: function (rowEntity, evt) {\n                  var row = grid.getRow(rowEntity);\n                  if (row != void 0 && row !== null && row.isSelected) {\n                    service.toggleRowSelection(grid, row, evt, grid.options.multiSelect, grid.options.noUnselect, true);\n                  }\n                },\n                /**\n                 * @ngdoc function\n                 * @name unSelectRowByVisibleIndex\n                 * @methodOf  ui.grid.selection.api:PublicApi\n                 * @description Unselect the specified row by visible index (i.e. if you\n                 * specify row 0 you'll get the first visible row unselected).  In this context\n                 * visible means of those rows that are theoretically visible (i.e. not filtered),\n                 * rather than rows currently rendered on the screen.\n                 * @param {number} rowNum index within the rowsVisible array\n                 * @param {Event} evt object if raised from an event\n                 */\n                unSelectRowByVisibleIndex: function (rowNum, evt) {\n                  var row = grid.renderContainers.body.visibleRowCache[rowNum];\n                  if (row != void 0 && row !== null && typeof (row) !== 'undefined' &&  row.isSelected) {\n                    service.toggleRowSelection(grid, row, evt, grid.options.multiSelect, grid.options.noUnselect, false);\n                  }\n                },\n                /**\n                 * @ngdoc function\n                 * @name unSelectRowByKey\n                 * @methodOf  ui.grid.selection.api:PublicApi\n                 * @description unselects the GridRows who have an key that is equal to comparator\n                 * so for Example if isInEntity == false then it does this check: row[key] === comparator\n                 * if isInEntity == true then it does this check: row.entity[key] === comparator\n                 * @param {boolean} isInEntity if true then key is in entity else it's directly in row\n                 * @param {string | number} key the key to look for\n                 * @param {any} comparator the value that key should have\n                 * @param {Event} evt [optional] object if raised from an event\n                 * @param {array} lookInRows [optional] the rows to look in - if not provided then looks in grid.rows\n                */\n                unSelectRowByKey: function (isInEntity, key, comparator, evt, lookInRows) {\n                  var row = grid.findRowByKey(isInEntity, key, comparator, lookInRows);\n                  if (row != void 0 && row !== null && typeof (row) !== 'undefined' &&  row.isSelected) {\n                    service.toggleRowSelection(grid, row, evt, grid.options.multiSelect, grid.options.noUnselect, false);\n                  }\n                },\n                /**\n                 * @ngdoc function\n                 * @name selectAllRows\n                 * @methodOf  ui.grid.selection.api:PublicApi\n                 * @description Selects all rows.  Does nothing if multiSelect = false\n                 * @param {Event} evt object if raised from an event\n                 */\n                selectAllRows: function (evt) {\n                  if (grid.options.multiSelect !== false) {\n                    var changedRows = [];\n                    grid.rows.forEach(function (row) {\n                      if (!row.isSelected && row.enableSelection !== false && grid.options.isRowSelectable(row) !== false) {\n                        row.setSelected(true);\n                        service.decideRaiseSelectionEvent(grid, row, changedRows, evt);\n                      }\n                    });\n                    grid.selection.selectAll = true;\n                    service.decideRaiseSelectionBatchEvent(grid, changedRows, evt);\n                  }\n                },\n                /**\n                 * @ngdoc function\n                 * @name selectAllVisibleRows\n                 * @methodOf  ui.grid.selection.api:PublicApi\n                 * @description Selects all visible rows.  Does nothing if multiSelect = false\n                 * @param {Event} evt object if raised from an event\n                 */\n                selectAllVisibleRows: function (evt) {\n                  if (grid.options.multiSelect !== false) {\n                    var changedRows = [];\n                    grid.rows.forEach(function(row) {\n                      if (row.visible) {\n                        if (!row.isSelected && row.enableSelection !== false && grid.options.isRowSelectable(row) !== false) {\n                          row.setSelected(true);\n                          service.decideRaiseSelectionEvent(grid, row, changedRows, evt);\n                        }\n                      } else if (row.isSelected) {\n                        row.setSelected(false);\n                        service.decideRaiseSelectionEvent(grid, row, changedRows, evt);\n                      }\n                    });\n                    grid.selection.selectAll = true;\n                    service.decideRaiseSelectionBatchEvent(grid, changedRows, evt);\n                  }\n                },\n                /**\n                 * @ngdoc function\n                 * @name clearSelectedRows\n                 * @methodOf  ui.grid.selection.api:PublicApi\n                 * @description Unselects all rows\n                 * @param {Event} evt object if raised from an event\n                 */\n                clearSelectedRows: function (evt) {\n                  service.clearSelectedRows(grid, evt);\n                },\n                /**\n                 * @ngdoc function\n                 * @name getSelectedRows\n                 * @methodOf  ui.grid.selection.api:PublicApi\n                 * @description returns all selected Row's entity references\n                 */\n                getSelectedRows: function () {\n                  return service.mapAndFilterRowsByEntity(service.getSelectedRows(grid));\n                },\n                /**\n                 * @ngdoc function\n                 * @name getUnSelectedRows\n                 * @methodOf  ui.grid.selection.api:PublicApi\n                 * @description returns all unselected Row's entity references\n                 */\n                getUnSelectedRows: function () {\n                  return service.mapAndFilterRowsByEntity(service.getUnSelectedRows(grid));\n                },\n                /**\n                 * @ngdoc function\n                 * @name getSelectedGridRows\n                 * @methodOf  ui.grid.selection.api:PublicApi\n                 * @description returns all selectedRow's as gridRows\n                 */\n                getSelectedGridRows: function () {\n                  return service.getSelectedRows(grid);\n                },\n                /**\n                 * @ngdoc function\n                 * @name getSelectedGridRows\n                 * @methodOf  ui.grid.selection.api:PublicApi\n                 * @description returns all unselected Row's as gridRows\n                 */\n                getUnSelectedGridRows: function () {\n                  return service.getUnSelectedRows(grid);\n                },\n                /**\n                 * @ngdoc function\n                 * @name getSelectedCount\n                 * @methodOf  ui.grid.selection.api:PublicApi\n                 * @description returns the number of rows selected\n                 */\n                getSelectedCount: function () {\n                  return grid.selection.selectedCount;\n                },\n                /**\n                 * @ngdoc function\n                 * @name setMultiSelect\n                 * @methodOf  ui.grid.selection.api:PublicApi\n                 * @description Sets the current gridOption.multiSelect to true or false\n                 * @param {bool} multiSelect true to allow multiple rows\n                 */\n                setMultiSelect: function (multiSelect) {\n                  grid.options.multiSelect = multiSelect;\n                },\n                /**\n                 * @ngdoc function\n                 * @name setModifierKeysToMultiSelect\n                 * @methodOf  ui.grid.selection.api:PublicApi\n                 * @description Sets the current gridOption.modifierKeysToMultiSelect to true or false\n                 * @param {bool} modifierKeysToMultiSelect true to only allow multiple rows when using ctrlKey or shiftKey is used\n                 */\n                setModifierKeysToMultiSelect: function (modifierKeysToMultiSelect) {\n                  grid.options.modifierKeysToMultiSelect = modifierKeysToMultiSelect;\n                },\n                /**\n                 * @ngdoc function\n                 * @name getSelectAllState\n                 * @methodOf  ui.grid.selection.api:PublicApi\n                 * @description Returns whether or not the selectAll checkbox is currently ticked.  The\n                 * grid doesn't automatically select rows when you add extra data - so when you add data\n                 * you need to explicitly check whether the selectAll is set, and then call setVisible rows\n                 * if it is\n                 */\n                getSelectAllState: function () {\n                  return grid.selection.selectAll;\n                }\n\n              }\n            }\n          };\n\n          grid.api.registerEventsFromObject(publicApi.events);\n\n          grid.api.registerMethodsFromObject(publicApi.methods);\n\n        },\n\n        defaultGridOptions: function (gridOptions) {\n          // default option to true unless it was explicitly set to false\n          /**\n           *  @ngdoc object\n           *  @name ui.grid.selection.api:GridOptions\n           *\n           *  @description GridOptions for selection feature, these are available to be\n           *  set using the ui-grid {@link ui.grid.class:GridOptions gridOptions}\n           */\n\n          /**\n           *  @ngdoc object\n           *  @name enableRowSelection\n           *  @propertyOf  ui.grid.selection.api:GridOptions\n           *  @description Enable row selection for entire grid.\n           *  <br/>Defaults to true\n           */\n          gridOptions.enableRowSelection = gridOptions.enableRowSelection !== false;\n          /**\n           *  @ngdoc object\n           *  @name multiSelect\n           *  @propertyOf  ui.grid.selection.api:GridOptions\n           *  @description Enable multiple row selection for entire grid\n           *  <br/>Defaults to true\n           */\n          gridOptions.multiSelect = gridOptions.multiSelect !== false;\n          /**\n           *  @ngdoc object\n           *  @name noUnselect\n           *  @propertyOf  ui.grid.selection.api:GridOptions\n           *  @description Prevent a row from being unselected.  Works in conjunction\n           *  with `multiselect = false` and `gridApi.selection.selectRow()` to allow\n           *  you to create a single selection only grid - a row is always selected, you\n           *  can only select different rows, you can't unselect the row.\n           *  <br/>Defaults to false\n           */\n          gridOptions.noUnselect = gridOptions.noUnselect === true;\n          /**\n           *  @ngdoc object\n           *  @name modifierKeysToMultiSelect\n           *  @propertyOf  ui.grid.selection.api:GridOptions\n           *  @description Enable multiple row selection only when using the ctrlKey or shiftKey. Requires multiSelect to be true.\n           *  <br/>Defaults to false\n           */\n          gridOptions.modifierKeysToMultiSelect = gridOptions.modifierKeysToMultiSelect === true;\n          /**\n           *  @ngdoc object\n           *  @name enableRowHeaderSelection\n           *  @propertyOf  ui.grid.selection.api:GridOptions\n           *  @description Enable a row header to be used for selection\n           *  <br/>Defaults to true\n           */\n          gridOptions.enableRowHeaderSelection = gridOptions.enableRowHeaderSelection !== false;\n          /**\n           *  @ngdoc object\n           *  @name enableFullRowSelection\n           *  @propertyOf  ui.grid.selection.api:GridOptions\n           *  @description Enable selection by clicking anywhere on the row.  Defaults to\n           *  false if `enableRowHeaderSelection` is true, otherwise defaults to true.\n           */\n          if (typeof (gridOptions.enableFullRowSelection) === 'undefined') {\n            gridOptions.enableFullRowSelection = !gridOptions.enableRowHeaderSelection;\n          }\n          /**\n           *  @ngdoc object\n           *  @name enableFocusRowOnRowHeaderClick\n           *  @propertyOf  ui.grid.selection.api:GridOptions\n           *  @description Enable focuse row by clicking on the row header.  Defaults to\n           *  true if `enableRowHeaderSelection` is true, otherwise defaults to false.\n           */\n          gridOptions.enableFocusRowOnRowHeaderClick = (gridOptions.enableFocusRowOnRowHeaderClick !== false)\n            || !gridOptions.enableRowHeaderSelection;\n          /**\n           *  @ngdoc object\n           *  @name enableSelectRowOnFocus\n           *  @propertyOf  ui.grid.selection.api:GridOptions\n           *  @description Enable focuse row by clicking on the row anywhere.  Defaults true.\n           */\n          gridOptions.enableSelectRowOnFocus = (gridOptions.enableSelectRowOnFocus !== false);\n          /**\n           *  @ngdoc object\n           *  @name enableSelectAll\n           *  @propertyOf  ui.grid.selection.api:GridOptions\n           *  @description Enable the select all checkbox at the top of the selectionRowHeader\n           *  <br/>Defaults to true\n           */\n          gridOptions.enableSelectAll = gridOptions.enableSelectAll !== false;\n          /**\n           *  @ngdoc object\n           *  @name enableSelectionBatchEvent\n           *  @propertyOf  ui.grid.selection.api:GridOptions\n           *  @description If selected rows are changed in bulk, either via the API or\n           *  via the selectAll checkbox, then a separate event is fired.  Setting this\n           *  option to false will cause the rowSelectionChanged event to be called multiple times\n           *  instead\n           *  <br/>Defaults to true\n           */\n          gridOptions.enableSelectionBatchEvent = gridOptions.enableSelectionBatchEvent !== false;\n          /**\n           *  @ngdoc object\n           *  @name selectionRowHeaderWidth\n           *  @propertyOf  ui.grid.selection.api:GridOptions\n           *  @description can be used to set a custom width for the row header selection column\n           *  <br/>Defaults to 30px\n           */\n          gridOptions.selectionRowHeaderWidth = angular.isDefined(gridOptions.selectionRowHeaderWidth) ? gridOptions.selectionRowHeaderWidth : 30;\n          /**\n           *  @ngdoc object\n           *  @name enableFooterTotalSelected\n           *  @propertyOf  ui.grid.selection.api:GridOptions\n           *  @description Shows the total number of selected items in footer if true.\n           *  <br/>Defaults to true.\n           *  <br/>GridOptions.showGridFooter must also be set to true.\n           */\n          gridOptions.enableFooterTotalSelected = gridOptions.enableFooterTotalSelected !== false;\n\n          /**\n           *  @ngdoc object\n           *  @name isRowSelectable\n           *  @propertyOf  ui.grid.selection.api:GridOptions\n           *  @description Makes it possible to specify a method that evaluates for each row and sets its \"enableSelection\" property.\n           */\n          gridOptions.isRowSelectable = angular.isDefined(gridOptions.isRowSelectable) ? gridOptions.isRowSelectable : angular.noop;\n        },\n\n        /**\n         * @ngdoc function\n         * @name toggleRowSelection\n         * @methodOf  ui.grid.selection.service:uiGridSelectionService\n         * @description Toggles row as selected or unselected\n         * @param {Grid} grid grid object\n         * @param {GridRow} row row to select or deselect\n         * @param {Event} evt object if resulting from event\n         * @param {bool} multiSelect if false, only one row at time can be selected\n         * @param {bool} noUnselect if true then rows cannot be unselected\n         * @param {bool} [canBeInvisible=true] if false, row can only be selected when it's (theoretically) visible\n         */\n         toggleRowSelection: function (grid, row, evt, multiSelect, noUnselect, canBeInvisible) {\n          if ( row.enableSelection === false ) {\n            return;\n          }\n\n          if (canBeInvisible === void 0) {\n            canBeInvisible = true;\n          }\n\n          var selected = row.isSelected;\n\n          if (!multiSelect) {\n            if (!selected) {\n              service.clearSelectedRows(grid, evt);\n            }\n            else if (service.getSelectedRows(grid).length > 1) {\n              selected = false; // Enable reselect of the row\n              service.clearSelectedRows(grid, evt);\n            }\n          }\n\n          // only select row in this case\n          if (!(selected && noUnselect) && (canBeInvisible || row.visible)) {\n            row.setSelected(!selected);\n            if (row.isSelected === true) {\n              grid.selection.lastSelectedRow = row;\n            }\n\n            grid.selection.selectAll = grid.rows.length === service.getSelectedRows(grid).length;\n            grid.api.selection.raise.rowSelectionChanged(row, evt);\n          }\n        },\n        /**\n         * @ngdoc function\n         * @name shiftSelect\n         * @methodOf  ui.grid.selection.service:uiGridSelectionService\n         * @description selects a group of rows from the last selected row using the shift key\n         * @param {Grid} grid grid object\n         * @param {GridRow} row clicked row\n         * @param {Event} evt object if raised from an event\n         * @param {bool} multiSelect if false, does nothing this is for multiSelect only\n         */\n        shiftSelect: function (grid, row, evt, multiSelect) {\n          if (!multiSelect) {\n            return;\n          }\n          var selectedRows = service.getSelectedRows(grid);\n          var fromRow = selectedRows.length > 0 ? grid.renderContainers.body.visibleRowCache.indexOf(grid.selection.lastSelectedRow) : 0;\n          var toRow = grid.renderContainers.body.visibleRowCache.indexOf(row);\n          // reverse select direction\n          if (fromRow > toRow) {\n            var tmp = fromRow;\n            fromRow = toRow;\n            toRow = tmp;\n          }\n\n          var changedRows = [];\n          for (var i = fromRow; i <= toRow; i++) {\n            var rowToSelect = grid.renderContainers.body.visibleRowCache[i];\n            if (rowToSelect) {\n              if (!rowToSelect.isSelected && rowToSelect.enableSelection !== false) {\n                rowToSelect.setSelected(true);\n                grid.selection.lastSelectedRow = rowToSelect;\n                service.decideRaiseSelectionEvent(grid, rowToSelect, changedRows, evt);\n              }\n            }\n          }\n          service.decideRaiseSelectionBatchEvent(grid, changedRows, evt);\n        },\n        /**\n         * @ngdoc function\n         * @name getSelectedRows\n         * @methodOf  ui.grid.selection.service:uiGridSelectionService\n         * @description Returns all the selected rows\n         * @param {Grid} grid grid object\n         */\n        getSelectedRows: function (grid) {\n          return grid.rows.filter(function (row) {\n            return row.isSelected;\n          });\n        },\n        /**\n         * @ngdoc function\n         * @name getUnSelectedRows\n         * @methodOf  ui.grid.selection.service:uiGridSelectionService\n         * @description Returns all the unselected rows\n         * @param {Grid} grid grid object\n         */\n        getUnSelectedRows: function (grid) {\n          return grid.rows.filter(function (row) {\n            return !row.isSelected;\n          });\n        },\n        /**\n         * @ngdoc function\n         * @name mapAndFilterRowsByEntity\n         * @methodOf  ui.grid.selection.service:uiGridSelectionService\n         * @description Filters all rows by entity and then maps them to Array.\n         */\n        mapAndFilterRowsByEntity: function(gridRows) {\n          if (typeof gridRows.reduce === 'function') { // If reduce is available it will be taken, due to better performance\n            return gridRows.reduce(function (previousVal, currentRow) {\n              if (currentRow.entity.hasOwnProperty('$$hashKey') || !angular.isObject(currentRow.entity)) {\n                previousVal.push(currentRow.entity);\n              }\n              return previousVal;\n            }, []);\n          }\n\n          return gridRows.filter(function (gridRow) { // stays as polyfill\n            return gridRow.entity.hasOwnProperty('$$hashKey') || !angular.isObject(gridRow.entity);\n          }).map(function (gridRow) {\n            return gridRow.entity;\n          });\n        },\n\n        /**\n         * @ngdoc function\n         * @name clearSelectedRows\n         * @methodOf  ui.grid.selection.service:uiGridSelectionService\n         * @description Clears all selected rows\n         * @param {Grid} grid grid object\n         * @param {Event} evt object if raised from an event\n         */\n        clearSelectedRows: function (grid, evt) {\n          var changedRows = [];\n          service.getSelectedRows(grid).forEach(function (row) {\n            if (row.isSelected && row.enableSelection !== false) {\n              row.setSelected(false);\n              service.decideRaiseSelectionEvent(grid, row, changedRows, evt);\n            }\n          });\n          grid.selection.selectAll = false;\n          grid.selection.selectedCount = 0;\n          service.decideRaiseSelectionBatchEvent(grid, changedRows, evt);\n        },\n\n        /**\n         * @ngdoc function\n         * @name decideRaiseSelectionEvent\n         * @methodOf  ui.grid.selection.service:uiGridSelectionService\n         * @description Decides whether to raise a single event or a batch event\n         * @param {Grid} grid grid object\n         * @param {GridRow} row row that has changed\n         * @param {array} changedRows an array to which we can append the changed\n         * @param {Event} evt object if raised from an event\n         * row if we're doing batch events\n         */\n        decideRaiseSelectionEvent: function (grid, row, changedRows, evt) {\n          if (!grid.options.enableSelectionBatchEvent) {\n            grid.api.selection.raise.rowSelectionChanged(row, evt);\n          }\n          else {\n            changedRows.push(row);\n          }\n        },\n\n        /**\n         * @ngdoc function\n         * @name raiseSelectionEvent\n         * @methodOf  ui.grid.selection.service:uiGridSelectionService\n         * @description Decides whether we need to raise a batch event, and\n         * raises it if we do.\n         * @param {Grid} grid grid object\n         * @param {array} changedRows an array of changed rows, only populated\n         * @param {Event} evt object if raised from an event\n         * if we're doing batch events\n         */\n        decideRaiseSelectionBatchEvent: function (grid, changedRows, evt) {\n          if (changedRows.length > 0) {\n            grid.api.selection.raise.rowSelectionChangedBatch(changedRows, evt);\n          }\n        }\n      };\n\n      return service;\n    });\n\n  /**\n   *  @ngdoc directive\n   *  @name ui.grid.selection.directive:uiGridSelection\n   *  @element div\n   *  @restrict A\n   *\n   *  @description Adds selection features to grid\n   *\n   *  @example\n   <example module=\"app\">\n   <file name=\"app.js\">\n   var app = angular.module('app', ['ui.grid', 'ui.grid.selection']);\n\n   app.controller('MainCtrl', ['$scope', function ($scope) {\n      $scope.data = [\n        { name: 'Bob', title: 'CEO' },\n            { name: 'Frank', title: 'Lowly Developer' }\n      ];\n\n      $scope.columnDefs = [\n        {name: 'name', enableCellEdit: true},\n        {name: 'title', enableCellEdit: true}\n      ];\n    }]);\n   </file>\n   <file name=\"index.ced81ed4.html\">\n   <div ng-controller=\"MainCtrl\">\n   <div ui-grid=\"{ data: data, columnDefs: columnDefs }\" ui-grid-selection></div>\n   </div>\n   </file>\n   </example>\n   */\n  module.directive('uiGridSelection', ['i18nService', 'uiGridSelectionConstants', 'uiGridSelectionService', 'uiGridConstants',\n    function (i18nService, uiGridSelectionConstants, uiGridSelectionService, uiGridConstants) {\n      return {\n        replace: true,\n        priority: 0,\n        require: '^uiGrid',\n        scope: false,\n        compile: function () {\n          return {\n            pre: function ($scope, $elm, $attrs, uiGridCtrl) {\n              uiGridSelectionService.initializeGrid(uiGridCtrl.grid);\n              if (uiGridCtrl.grid.options.enableRowHeaderSelection) {\n                var selectionRowHeaderDef = {\n                  name: uiGridSelectionConstants.selectionRowHeaderColName,\n                  displayName: i18nService.getSafeText('selection.displayName'),\n                  width: uiGridCtrl.grid.options.selectionRowHeaderWidth,\n                  minWidth: 10,\n                  cellTemplate: 'ui-grid/selectionRowHeader',\n                  headerCellTemplate: 'ui-grid/selectionHeaderCell',\n                  enableColumnResizing: false,\n                  enableColumnMenu: false,\n                  exporterSuppressExport: true,\n                  allowCellFocus: true\n                };\n\n                uiGridCtrl.grid.addRowHeaderColumn(selectionRowHeaderDef, 0);\n              }\n\n              var processorSet = false;\n\n              var processSelectableRows = function (rows) {\n                rows.forEach(function (row) {\n                  row.enableSelection = uiGridCtrl.grid.options.isRowSelectable(row);\n                });\n                return rows;\n              };\n\n              var updateOptions = function () {\n                if (uiGridCtrl.grid.options.isRowSelectable !== angular.noop && processorSet !== true) {\n                  uiGridCtrl.grid.registerRowsProcessor(processSelectableRows, 500);\n                  processorSet = true;\n                }\n              };\n\n              updateOptions();\n\n              var dataChangeDereg = uiGridCtrl.grid.registerDataChangeCallback(updateOptions, [uiGridConstants.dataChange.OPTIONS]);\n\n              $scope.$on('$destroy', dataChangeDereg);\n            },\n            post: function ($scope, $elm, $attrs, uiGridCtrl) {\n\n            }\n          };\n        }\n      };\n    }]);\n\n  module.directive('uiGridSelectionRowHeaderButtons', ['$templateCache', 'uiGridSelectionService', 'gridUtil',\n    function ($templateCache, uiGridSelectionService, gridUtil) {\n      return {\n        replace: true,\n        restrict: 'E',\n        template: $templateCache.get('ui-grid/selectionRowHeaderButtons'),\n        scope: true,\n        require: '^uiGrid',\n        link: function ($scope, $elm, $attrs, uiGridCtrl) {\n          var self = uiGridCtrl.grid;\n          $scope.selectButtonClick = selectButtonClick;\n          $scope.selectButtonKeyDown = selectButtonKeyDown;\n\n          // On IE, prevent mousedowns on the select button from starting a selection.\n          // If this is not done and you shift+click on another row, the browser will select a big chunk of text\n          if (gridUtil.detectBrowser() === 'ie') {\n            $elm.on('mousedown', selectButtonMouseDown);\n          }\n\n          function selectButtonKeyDown(row, evt) {\n            if (evt.keyCode === 32 || evt.keyCode === 13) {\n              evt.preventDefault();\n              selectButtonClick(row, evt);\n            }\n          }\n\n          function selectButtonClick(row, evt) {\n            evt.stopPropagation();\n\n            if (evt.shiftKey) {\n              uiGridSelectionService.shiftSelect(self, row, evt, self.options.multiSelect);\n            }\n            else if (evt.ctrlKey || evt.metaKey) {\n              uiGridSelectionService.toggleRowSelection(self, row, evt,\n                self.options.multiSelect, self.options.noUnselect, false);\n            }\n            else if (row.groupHeader) {\n              uiGridSelectionService.toggleRowSelection(self, row, evt, self.options.multiSelect, self.options.noUnselect, false);\n              for (var i = 0; i < row.treeNode.children.length; i++) {\n                uiGridSelectionService.toggleRowSelection(self, row.treeNode.children[i].row, evt, self.options.multiSelect, self.options.noUnselect, false);\n              }\n            }\n            else {\n              uiGridSelectionService.toggleRowSelection(self, row, evt,\n                (self.options.multiSelect && !self.options.modifierKeysToMultiSelect), self.options.noUnselect, false);\n            }\n            self.options.enableFocusRowOnRowHeaderClick && row.setFocused(!row.isFocused) && self.api.selection.raise.rowFocusChanged(row, evt);\n          }\n\n          function selectButtonMouseDown(evt) {\n            if (evt.ctrlKey || evt.shiftKey) {\n              evt.target.onselectstart = function () { return false; };\n              window.setTimeout(function () { evt.target.onselectstart = null; }, 0);\n            }\n          }\n\n          $scope.$on('$destroy', function unbindEvents() {\n            $elm.off();\n          });\n        }\n      };\n    }]);\n\n  module.directive('uiGridSelectionSelectAllButtons', ['$templateCache', 'uiGridSelectionService',\n    function ($templateCache, uiGridSelectionService) {\n      return {\n        replace: true,\n        restrict: 'E',\n        template: $templateCache.get('ui-grid/selectionSelectAllButtons'),\n        scope: false,\n        link: function ($scope) {\n          var self = $scope.col.grid;\n\n          $scope.headerButtonKeyDown = function (evt) {\n            if (evt.keyCode === 32 || evt.keyCode === 13) {\n              evt.preventDefault();\n              $scope.headerButtonClick(evt);\n            }\n          };\n\n          $scope.headerButtonClick = function (evt) {\n            if (self.selection.selectAll) {\n              uiGridSelectionService.clearSelectedRows(self, evt);\n              if (self.options.noUnselect) {\n                self.api.selection.selectRowByVisibleIndex(0, evt);\n              }\n              self.selection.selectAll = false;\n            }\n            else if (self.options.multiSelect) {\n              self.api.selection.selectAllVisibleRows(evt);\n              self.selection.selectAll = true;\n            }\n          };\n        }\n      };\n    }]);\n\n  /**\n   *  @ngdoc directive\n   *  @name ui.grid.selection.directive:uiGridViewport\n   *  @element div\n   *\n   *  @description Stacks on top of ui.grid.uiGridViewport to alter the attributes used\n   *  for the grid row\n   */\n  module.directive('uiGridViewport',\n      function () {\n        return {\n          priority: -200, // run after default  directive\n          scope: false,\n          compile: function ($elm) {\n            var rowRepeatDiv = angular.element($elm[0].querySelector('.ui-grid-canvas:not(.ui-grid-empty-base-layer-container)').children[0]),\n              newNgClass = \"'ui-grid-row-selected': row.isSelected, 'ui-grid-row-focused': row.isFocused}\",\n              existingNgClass = rowRepeatDiv.attr('ng-class');\n\n            if (existingNgClass) {\n              newNgClass = existingNgClass.slice(0, -1) + ',' + newNgClass;\n            } else {\n              newNgClass = '{' + newNgClass;\n            }\n            rowRepeatDiv.attr('ng-class', newNgClass);\n\n            return {\n              pre: function ($scope, $elm, $attrs, controllers) {},\n              post: function ($scope, $elm, $attrs, controllers) {}\n            };\n          }\n        };\n      });\n\n  /**\n   *  @ngdoc directive\n   *  @name ui.grid.selection.directive:uiGridCell\n   *  @element div\n   *  @restrict A\n   *\n   *  @description Stacks on top of ui.grid.uiGridCell to provide selection feature\n   */\n  module.directive('uiGridCell',\n    ['uiGridConstants', 'uiGridSelectionService',\n      function (uiGridConstants, uiGridSelectionService) {\n        return {\n          priority: -200, // run after default uiGridCell directive\n          restrict: 'A',\n          require: '?^uiGrid',\n          scope: false,\n          link: function ($scope, $elm, $attrs, uiGridCtrl) {\n            var touchStartTime = 0,\n              touchStartPos = {},\n              touchTimeout = 300,\n              touchPosDiff = 100;\n\n            // Bind to keydown events in the render container\n            if (uiGridCtrl.grid.api.cellNav) {\n              uiGridCtrl.grid.api.cellNav.on.viewPortKeyDown($scope, function (evt, rowCol) {\n                if (rowCol === null ||\n                  rowCol.row !== $scope.row ||\n                  rowCol.col !== $scope.col) {\n                  return;\n                }\n\n                if (evt.keyCode === uiGridConstants.keymap.SPACE && $scope.col.colDef.name === 'selectionRowHeaderCol') {\n                  evt.preventDefault();\n                  uiGridSelectionService.toggleRowSelection($scope.grid, $scope.row, evt,\n                    ($scope.grid.options.multiSelect && !$scope.grid.options.modifierKeysToMultiSelect),\n                    $scope.grid.options.noUnselect, false);\n                  $scope.$apply();\n                }\n              });\n            }\n\n            var selectCells = function (evt) {\n              // if you click on expandable icon doesn't trigger selection\n              if (evt.target.className === \"ui-grid-icon-minus-squared\" || evt.target.className === \"ui-grid-icon-plus-squared\") {\n                return;\n              }\n\n              // if we get a click, then stop listening for touchend\n              $elm.off('touchend', touchEnd);\n\n              if (evt.shiftKey) {\n                uiGridSelectionService.shiftSelect($scope.grid, $scope.row, evt, $scope.grid.options.multiSelect);\n              }\n              else if (evt.ctrlKey || evt.metaKey) {\n                uiGridSelectionService.toggleRowSelection($scope.grid, $scope.row, evt,\n                  $scope.grid.options.multiSelect, $scope.grid.options.noUnselect, false);\n              }\n              else if ($scope.grid.options.enableSelectRowOnFocus) {\n                uiGridSelectionService.toggleRowSelection($scope.grid, $scope.row, evt,\n                  ($scope.grid.options.multiSelect && !$scope.grid.options.modifierKeysToMultiSelect),\n                  $scope.grid.options.noUnselect, false);\n              }\n              $scope.row.setFocused(!$scope.row.isFocused);\n              $scope.grid.api.selection.raise.rowFocusChanged($scope.row, evt);\n              $scope.$apply();\n\n              // don't re-enable the touchend handler for a little while - some devices generate both, and it will\n              // take a little while to move your hand from the mouse to the screen if you have both modes of input\n              window.setTimeout(function () {\n                $elm.on('touchend', touchEnd);\n              }, touchTimeout);\n            };\n\n            var touchStart = function (evt) {\n              touchStartTime = (new Date()).getTime();\n              touchStartPos = evt.changedTouches[0];\n\n              // if we get a touch event, then stop listening for click\n              $elm.off('click', selectCells);\n            };\n\n            var touchEnd = function (evt) {\n              var touchEndTime = (new Date()).getTime();\n              var touchEndPos = evt.changedTouches[0];\n              var touchTime = touchEndTime - touchStartTime;\n              var touchXDiff = Math.abs(touchStartPos.clientX - touchEndPos.clientX)\n              var touchYDiff = Math.abs(touchStartPos.clientY - touchEndPos.clientY)\n\n\n              if (touchXDiff < touchPosDiff && touchYDiff < touchPosDiff) {\n                if (touchTime < touchTimeout) {\n                // short touch\n                  selectCells(evt);\n                }\n              }\n\n              // don't re-enable the click handler for a little while - some devices generate both, and it will\n              // take a little while to move your hand from the screen to the mouse if you have both modes of input\n              window.setTimeout(function () {\n                $elm.on('click', selectCells);\n              }, touchTimeout);\n            };\n\n            function registerRowSelectionEvents() {\n              if ($scope.grid.options.enableRowSelection && $scope.grid.options.enableFullRowSelection && $scope.col.colDef.name !== 'selectionRowHeaderCol') {\n                $elm.addClass('ui-grid-disable-selection');\n                $elm.on('touchstart', touchStart);\n                $elm.on('touchend', touchEnd);\n                $elm.on('click', selectCells);\n\n                $scope.registered = true;\n              }\n            }\n\n            function unregisterRowSelectionEvents() {\n              if ($scope.registered) {\n                $elm.removeClass('ui-grid-disable-selection');\n                $elm.off('touchstart', touchStart);\n                $elm.off('touchend', touchEnd);\n                $elm.off('click', selectCells);\n\n                $scope.registered = false;\n              }\n            }\n\n            registerRowSelectionEvents();\n\n            // register a dataChange callback so that we can change the selection configuration dynamically\n            // if the user changes the options\n            var dataChangeUnreg = $scope.grid.registerDataChangeCallback(function () {\n              if ($scope.grid.options.enableRowSelection && $scope.grid.options.enableFullRowSelection &&\n                !$scope.registered) {\n                registerRowSelectionEvents();\n              }\n              else if ((!$scope.grid.options.enableRowSelection || !$scope.grid.options.enableFullRowSelection) &&\n                $scope.registered) {\n                unregisterRowSelectionEvents();\n              }\n            }, [uiGridConstants.dataChange.OPTIONS]);\n\n            $elm.on('$destroy', dataChangeUnreg);\n          }\n        };\n      }]);\n\n  module.directive('uiGridGridFooter', ['$compile', 'gridUtil', function ($compile, gridUtil) {\n    return {\n      restrict: 'EA',\n      replace: true,\n      priority: -1000,\n      require: '^uiGrid',\n      scope: true,\n      compile: function () {\n        return {\n          pre: function ($scope, $elm, $attrs, uiGridCtrl) {\n            if (!uiGridCtrl.grid.options.showGridFooter) {\n              return;\n            }\n\n            gridUtil.getTemplate('ui-grid/gridFooterSelectedItems')\n              .then(function (contents) {\n                var template = angular.element(contents);\n\n                var newElm = $compile(template)($scope);\n\n                angular.element($elm[0].getElementsByClassName('ui-grid-grid-footer')[0]).append(newElm);\n              });\n          },\n          post: function ($scope, $elm, $attrs, controllers) {\n\n          }\n        };\n      }\n    };\n  }]);\n})();\n\n(function () {\n  'use strict';\n\n  /**\n   * @ngdoc overview\n   * @name ui.grid.treeBase\n   * @description\n   *\n   * # ui.grid.treeBase\n   *\n   * <div class=\"alert alert-warning\" role=\"alert\"><strong>Beta</strong> This feature is ready for testing, but it either hasn't seen a lot of use or has some known bugs.</div>\n   *\n   * This module provides base tree handling functions that are shared by other features, notably grouping\n   * and treeView.  It provides a tree view of the data, with nodes in that\n   * tree and leaves.\n   *\n   * Design information:\n   * -------------------\n   *\n   * The raw data that is provided must come with a $$treeLevel on any non-leaf node.  Grouping will create\n   * these on all the group header rows, treeView will expect these to be set in the raw data by the user.\n   * TreeBase will run a rowsProcessor that:\n   *  - builds `treeBase.tree` out of the provided rows\n   *  - permits a recursive sort of the tree\n   *  - maintains the expand/collapse state of each node\n   *  - provides the expand/collapse all button and the expand/collapse buttons\n   *  - maintains the count of children for each node\n   *\n   * Each row is updated with a link to the tree node that represents it.  Refer {@link ui.grid.treeBase.grid:treeBase.tree tree documentation}\n   * for information.\n   *\n   *  TreeBase adds information to the rows\n   *  - treeLevel: if present and > -1 tells us the level (level 0 is the top level)\n   *  - treeNode: pointer to the node in the grid.treeBase.tree that refers\n   *    to this row, allowing us to manipulate the state\n   *\n   * Since the logic is baked into the rowsProcessors, it should get triggered whenever\n   * row order or filtering or anything like that is changed.  We recall the expanded state\n   * across invocations of the rowsProcessors by the reference to the treeNode on the individual\n   * rows.  We rebuild the tree itself quite frequently, when we do this we use the saved treeNodes to\n   * get the state, but we overwrite the other data in that treeNode.\n   *\n   * By default rows are collapsed, which means all data rows have their visible property\n   * set to false, and only level 0 group rows are set to visible.\n   *\n   * We rely on the rowsProcessors to do the actual expanding and collapsing, so we set the flags we want into\n   * grid.treeBase.tree, then call refresh.  This is because we can't easily change the visible\n   * row cache without calling the processors, and once we've built the logic into the rowProcessors we may as\n   * well use it all the time.\n   *\n   * Tree base provides sorting (on non-grouped columns).\n   *\n   * Sorting works in two passes.  The standard sorting is performed for any columns that are important to building\n   * the tree (for example, any grouped columns).  Then after the tree is built, a recursive tree sort is performed\n   * for the remaining sort columns (including the original sort) - these columns are sorted within each tree level\n   * (so all the level 1 nodes are sorted, then all the level 2 nodes within each level 1 node etc).\n   *\n   * To achieve this we make use of the `ignoreSort` property on the sort configuration.  The parent feature (treeView or grouping)\n   * must provide a rowsProcessor that runs with very low priority (typically in the 60-65 range), and that sets\n   * the `ignoreSort`on any sort that it wants to run on the tree.  TreeBase will clear the ignoreSort on all sorts - so it\n   * will turn on any sorts that haven't run.  It will then call a recursive sort on the tree.\n   *\n   * Tree base provides treeAggregation.  It checks the treeAggregation configuration on each column, and aggregates based on\n   * the logic provided as it builds the tree. Footer aggregation from the uiGrid core should not be used with treeBase aggregation,\n   * since it operates on all visible rows, as opposed to to leaf nodes only. Setting `showColumnFooter: true` will show the\n   * treeAggregations in the column footer.  Aggregation information will be collected in the format:\n   *\n   * ```\n   *   {\n   *     type: 'count',\n   *     value: 4,\n   *     label: 'count: ',\n   *     rendered: 'count: 4'\n   *   }\n   * ```\n   *\n   * A callback is provided to format the value once it is finalised (aka a valueFilter).\n   *\n   * <br/>\n   * <br/>\n   *\n   * <div doc-module-components=\"ui.grid.treeBase\"></div>\n   */\n\n  var module = angular.module('ui.grid.treeBase', ['ui.grid']);\n\n  /**\n   *  @ngdoc object\n   *  @name ui.grid.treeBase.constant:uiGridTreeBaseConstants\n   *\n   *  @description constants available in treeBase module.\n   *\n   *  These constants are manually copied into grouping and treeView,\n   *  as I haven't found a way to simply include them, and it's not worth\n   *  investing time in for something that changes very infrequently.\n   *\n   */\n  module.constant('uiGridTreeBaseConstants', {\n    featureName: \"treeBase\",\n    rowHeaderColName: 'treeBaseRowHeaderCol',\n    EXPANDED: 'expanded',\n    COLLAPSED: 'collapsed',\n    aggregation: {\n      COUNT: 'count',\n      SUM: 'sum',\n      MAX: 'max',\n      MIN: 'min',\n      AVG: 'avg'\n    }\n  });\n\n  /**\n   *  @ngdoc service\n   *  @name ui.grid.treeBase.service:uiGridTreeBaseService\n   *\n   *  @description Services for treeBase feature\n   */\n  /**\n   *  @ngdoc object\n   *  @name ui.grid.treeBase.api:ColumnDef\n   *\n   *  @description ColumnDef for tree feature, these are available to be\n   *  set using the ui-grid {@link ui.grid.class:GridOptions.columnDef gridOptions.columnDefs}\n   */\n\n  module.service('uiGridTreeBaseService', ['$q', 'uiGridTreeBaseConstants', 'gridUtil', 'GridRow', 'gridClassFactory', 'i18nService', 'uiGridConstants', 'rowSorter',\n  function ($q, uiGridTreeBaseConstants, gridUtil, GridRow, gridClassFactory, i18nService, uiGridConstants, rowSorter) {\n\n    var service = {\n\n      initializeGrid: function (grid) {\n\n        // add feature namespace and any properties to grid for needed\n        /**\n         *  @ngdoc object\n         *  @name ui.grid.treeBase.grid:treeBase\n         *\n         *  @description Grid properties and functions added for treeBase\n         */\n        grid.treeBase = {};\n\n        /**\n         *  @ngdoc property\n         *  @propertyOf ui.grid.treeBase.grid:treeBase\n         *  @name numberLevels\n         *\n         *  @description Total number of tree levels currently used, calculated by the rowsProcessor by\n         *  retaining the highest tree level it sees\n         */\n        grid.treeBase.numberLevels = 0;\n\n        /**\n         *  @ngdoc property\n         *  @propertyOf ui.grid.treeBase.grid:treeBase\n         *  @name expandAll\n         *\n         *  @description Whether or not the expandAll box is selected\n         */\n        grid.treeBase.expandAll = false;\n\n        /**\n         *  @ngdoc property\n         *  @propertyOf ui.grid.treeBase.grid:treeBase\n         *  @name tree\n         *\n         *  @description Tree represented as a nested array that holds the state of each node, along with a\n         *  pointer to the row.  The array order is material - we will display the children in the order\n         *  they are stored in the array\n         *\n         *  Each node stores:\n         *\n         *    - the state of this node\n         *    - an array of children of this node\n         *    - a pointer to the parent of this node (reverse pointer, allowing us to walk up the tree)\n         *    - the number of children of this node\n         *    - aggregation information calculated from the nodes\n         *\n         *  ```\n         *    [{\n         *      state: 'expanded',\n         *      row: <reference to row>,\n         *      parentRow: null,\n         *      aggregations: [{\n         *        type: 'count',\n         *        col: <gridCol>,\n         *        value: 2,\n         *        label: 'count: ',\n         *        rendered: 'count: 2'\n         *      }],\n         *      children: [\n         *        {\n         *          state: 'expanded',\n         *          row: <reference to row>,\n         *          parentRow: <reference to row>,\n         *          aggregations: [{\n         *            type: 'count',\n         *            col: '<gridCol>,\n         *            value: 4,\n         *            label: 'count: ',\n         *            rendered: 'count: 4'\n         *          }],\n         *          children: [\n         *            { state: 'expanded', row: <reference to row>, parentRow: <reference to row> },\n         *            { state: 'collapsed', row: <reference to row>, parentRow: <reference to row> },\n         *            { state: 'expanded', row: <reference to row>, parentRow: <reference to row> },\n         *            { state: 'collapsed', row: <reference to row>, parentRow: <reference to row> }\n         *          ]\n         *        },\n         *        {\n         *          state: 'collapsed',\n         *          row: <reference to row>,\n         *          parentRow: <reference to row>,\n         *          aggregations: [{\n         *            type: 'count',\n         *            col: <gridCol>,\n         *            value: 3,\n         *            label: 'count: ',\n         *            rendered: 'count: 3'\n         *          }],\n         *          children: [\n         *            { state: 'expanded', row: <reference to row>, parentRow: <reference to row> },\n         *            { state: 'collapsed', row: <reference to row>, parentRow: <reference to row> },\n         *            { state: 'expanded', row: <reference to row>, parentRow: <reference to row> }\n         *          ]\n         *        }\n         *      ]\n         *    }, {<another level 0 node maybe>} ]\n         *  ```\n         *  Missing state values are false - meaning they aren't expanded.\n         *\n         *  This is used because the rowProcessors run every time the grid is refreshed, so\n         *  we'd lose the expanded state every time the grid was refreshed.  This instead gives\n         *  us a reliable lookup that persists across rowProcessors.\n         *\n         *  This tree is rebuilt every time we run the rowsProcessors.  Since each row holds a pointer\n         *  to it's tree node we can persist expand/collapse state across calls to rowsProcessor, we discard\n         *  all transient information on the tree (children, childCount) and recalculate it\n         *\n         */\n        grid.treeBase.tree = [];\n\n        service.defaultGridOptions(grid.options);\n\n        grid.registerRowsProcessor(service.treeRows, 410);\n\n        grid.registerColumnBuilder( service.treeBaseColumnBuilder );\n\n        service.createRowHeader( grid );\n\n        /**\n         *  @ngdoc object\n         *  @name ui.grid.treeBase.api:PublicApi\n         *\n         *  @description Public Api for treeBase feature\n         */\n        var publicApi = {\n          events: {\n            treeBase: {\n              /**\n               * @ngdoc event\n               * @eventOf ui.grid.treeBase.api:PublicApi\n               * @name rowExpanded\n               * @description raised whenever a row is expanded.  If you are dynamically\n               * rendering your tree you can listen to this event, and then retrieve\n               * the children of this row and load them into the grid data.\n               *\n               * When the data is loaded the grid will automatically refresh to show these new rows\n               *\n               * <pre>\n               *      gridApi.treeBase.on.rowExpanded(scope,function(row) {})\n               * </pre>\n               * @param {gridRow} row the row that was expanded.  You can also\n               * retrieve the grid from this row with row.grid\n               */\n              rowExpanded: {},\n\n              /**\n               * @ngdoc event\n               * @eventOf ui.grid.treeBase.api:PublicApi\n               * @name rowCollapsed\n               * @description raised whenever a row is collapsed.  Doesn't really have\n               * a purpose at the moment, included for symmetry\n               *\n               * <pre>\n               *      gridApi.treeBase.on.rowCollapsed(scope,function(row) {})\n               * </pre>\n               * @param {gridRow} row the row that was collapsed.  You can also\n               * retrieve the grid from this row with row.grid\n               */\n              rowCollapsed: {}\n            }\n          },\n\n          methods: {\n            treeBase: {\n              /**\n               * @ngdoc function\n               * @name expandAllRows\n               * @methodOf  ui.grid.treeBase.api:PublicApi\n               * @description Expands all tree rows\n               */\n              expandAllRows: function () {\n                service.expandAllRows(grid);\n              },\n\n              /**\n               * @ngdoc function\n               * @name collapseAllRows\n               * @methodOf  ui.grid.treeBase.api:PublicApi\n               * @description collapse all tree rows\n               */\n              collapseAllRows: function () {\n                service.collapseAllRows(grid);\n              },\n\n              /**\n               * @ngdoc function\n               * @name toggleRowTreeState\n               * @methodOf  ui.grid.treeBase.api:PublicApi\n               * @description  call expand if the row is collapsed, collapse if it is expanded\n               * @param {gridRow} row the row you wish to toggle\n               */\n              toggleRowTreeState: function (row) {\n                service.toggleRowTreeState(grid, row);\n              },\n\n              /**\n               * @ngdoc function\n               * @name expandRow\n               * @methodOf  ui.grid.treeBase.api:PublicApi\n               * @description expand the immediate children of the specified row\n               * @param {gridRow} row the row you wish to expand\n               * @param {boolean} recursive true if you wish to expand the row's ancients\n               */\n              expandRow: function (row, recursive) {\n                service.expandRow(grid, row, recursive);\n              },\n\n              /**\n               * @ngdoc function\n               * @name expandRowChildren\n               * @methodOf  ui.grid.treeBase.api:PublicApi\n               * @description expand all children of the specified row\n               * @param {gridRow} row the row you wish to expand\n               */\n              expandRowChildren: function (row) {\n                service.expandRowChildren(grid, row);\n              },\n\n              /**\n               * @ngdoc function\n               * @name collapseRow\n               * @methodOf  ui.grid.treeBase.api:PublicApi\n               * @description collapse  the specified row.  When\n               * you expand the row again, all grandchildren will retain their state\n               * @param {gridRow} row the row you wish to collapse\n               */\n              collapseRow: function ( row ) {\n                service.collapseRow(grid, row);\n              },\n\n              /**\n               * @ngdoc function\n               * @name collapseRowChildren\n               * @methodOf  ui.grid.treeBase.api:PublicApi\n               * @description collapse all children of the specified row.  When\n               * you expand the row again, all grandchildren will be collapsed\n               * @param {gridRow} row the row you wish to collapse children for\n               */\n              collapseRowChildren: function ( row ) {\n                service.collapseRowChildren(grid, row);\n              },\n\n              /**\n               * @ngdoc function\n               * @name getTreeState\n               * @methodOf  ui.grid.treeBase.api:PublicApi\n               * @description Get the tree state for this grid,\n               * used by the saveState feature\n               * Returned treeState as an object\n               *   `{ expandedState: { uid: 'expanded', uid: 'collapsed' } }`\n               * where expandedState is a hash of row uid and the current expanded state\n               *\n               * @returns {object} tree state\n               *\n               * TODO - this needs work - we need an identifier that persists across instantiations,\n               * not uid.  This really means we need a row identity defined, but that won't work for\n               * grouping.  Perhaps this needs to be moved up to treeView and grouping, rather than\n               * being in base.\n               */\n              getTreeExpandedState: function () {\n                return { expandedState: service.getTreeState(grid) };\n              },\n\n              /**\n               * @ngdoc function\n               * @name setTreeState\n               * @methodOf  ui.grid.treeBase.api:PublicApi\n               * @description Set the expanded states of the tree\n               * @param {object} config the config you want to apply, in the format\n               * provided by getTreeState\n               */\n              setTreeState: function ( config ) {\n                service.setTreeState( grid, config );\n              },\n\n              /**\n               * @ngdoc function\n               * @name getRowChildren\n               * @methodOf  ui.grid.treeBase.api:PublicApi\n               * @description Get the children of the specified row\n               * @param {GridRow} row the row you want the children of\n               * @returns {Array} array of children of this row, the children\n               * are all gridRows\n               */\n              getRowChildren: function ( row ) {\n                return row.treeNode.children.map( function( childNode ) {\n                  return childNode.row;\n                });\n              }\n            }\n          }\n        };\n\n        grid.api.registerEventsFromObject(publicApi.events);\n\n        grid.api.registerMethodsFromObject(publicApi.methods);\n      },\n\n\n      defaultGridOptions: function (gridOptions) {\n        // default option to true unless it was explicitly set to false\n        /**\n         *  @ngdoc object\n         *  @name ui.grid.treeBase.api:GridOptions\n         *\n         *  @description GridOptions for treeBase feature, these are available to be\n         *  set using the ui-grid {@link ui.grid.class:GridOptions gridOptions}\n         */\n\n        /**\n         *  @ngdoc object\n         *  @name treeRowHeaderBaseWidth\n         *  @propertyOf  ui.grid.treeBase.api:GridOptions\n         *  @description Base width of the tree header, provides for a single level of tree.  This\n         *  is incremented by `treeIndent` for each extra level\n         *  <br/>Defaults to 30\n         */\n        gridOptions.treeRowHeaderBaseWidth = gridOptions.treeRowHeaderBaseWidth || 30;\n\n        /**\n         *  @ngdoc object\n         *  @name treeIndent\n         *  @propertyOf  ui.grid.treeBase.api:GridOptions\n         *  @description Number of pixels of indent for the icon at each tree level, wider indents are visually more pleasing,\n         *  but will make the tree row header wider\n         *  <br/>Defaults to 10\n         */\n        gridOptions.treeIndent = (gridOptions.treeIndent != null) ? gridOptions.treeIndent : 10;\n\n        /**\n         *  @ngdoc object\n         *  @name showTreeRowHeader\n         *  @propertyOf  ui.grid.treeBase.api:GridOptions\n         *  @description If set to false, don't create the row header.  You'll need to programmatically control the expand\n         *  states\n         *  <br/>Defaults to true\n         */\n        gridOptions.showTreeRowHeader = gridOptions.showTreeRowHeader !== false;\n\n        /**\n         *  @ngdoc object\n         *  @name showTreeExpandNoChildren\n         *  @propertyOf  ui.grid.treeBase.api:GridOptions\n         *  @description If set to true, show the expand/collapse button even if there are no\n         *  children of a node.  You'd use this if you're planning to dynamically load the children\n         *\n         *  <br/>Defaults to true, grouping overrides to false\n         */\n        gridOptions.showTreeExpandNoChildren = gridOptions.showTreeExpandNoChildren !== false;\n\n        /**\n         *  @ngdoc object\n         *  @name treeRowHeaderAlwaysVisible\n         *  @propertyOf  ui.grid.treeBase.api:GridOptions\n         *  @description If set to true, row header even if there are no tree nodes\n         *\n         *  <br/>Defaults to true\n         */\n        gridOptions.treeRowHeaderAlwaysVisible = gridOptions.treeRowHeaderAlwaysVisible !== false;\n\n        /**\n         *  @ngdoc object\n         *  @name treeCustomAggregations\n         *  @propertyOf  ui.grid.treeBase.api:GridOptions\n         *  @description Define custom aggregation functions. The properties of this object will be\n         *  aggregation types available for use on columnDef with {@link ui.grid.treeBase.api:ColumnDef treeAggregationType} or through the column menu.\n         *  If a function defined here uses the same name as one of the native aggregations, this one will take precedence.\n         *  The object format is:\n         *\n         *  <pre>\n         *    {\n         *      aggregationName: {\n         *        label: (optional) string,\n         *        aggregationFn: function( aggregation, fieldValue, numValue, row ) {...},\n         *        finalizerFn: (optional) function( aggregation ) {...}\n         *      },\n         *      mean: {\n         *        label: 'mean',\n         *        aggregationFn: function( aggregation, fieldValue, numValue ) {\n         *          aggregation.count = (aggregation.count || 1) + 1;\n         *          aggregation.sum = (aggregation.sum || 0) + numValue;\n         *        },\n         *        finalizerFn: function( aggregation ) {\n         *          aggregation.value = aggregation.sum / aggregation.count\n         *        }\n         *      }\n         *    }\n         *  </pre>\n         *\n         *  <br/>The `finalizerFn` may be used to manipulate the value before rendering, or to\n         *  apply a custom rendered value. If `aggregation.rendered` is left undefined, the value will be\n         *  rendered. Note that the native aggregation functions use an `finalizerFn` to concatenate\n         *  the label and the value.\n         *\n         *  <br/>Defaults to {}\n         */\n        gridOptions.treeCustomAggregations = gridOptions.treeCustomAggregations || {};\n\n        /**\n         *  @ngdoc object\n         *  @name enableExpandAll\n         *  @propertyOf  ui.grid.treeBase.api:GridOptions\n         *  @description Enable the expand all button at the top of the row header\n         *\n         *  <br/>Defaults to true\n         */\n        gridOptions.enableExpandAll = gridOptions.enableExpandAll !== false;\n      },\n\n\n      /**\n       * @ngdoc function\n       * @name treeBaseColumnBuilder\n       * @methodOf  ui.grid.treeBase.service:uiGridTreeBaseService\n       * @description Sets the tree defaults based on the columnDefs\n       *\n       * @param {object} colDef columnDef we're basing on\n       * @param {GridColumn} col the column we're to update\n       * @param {object} gridOptions the options we should use\n       * @returns {promise} promise for the builder - actually we do it all inline so it's immediately resolved\n       */\n      treeBaseColumnBuilder: function (colDef, col, gridOptions) {\n\n\n        /**\n         *  @ngdoc object\n         *  @name customTreeAggregationFn\n         *  @propertyOf  ui.grid.treeBase.api:ColumnDef\n         *  @description A custom function that aggregates rows into some form of\n         *  total.  Aggregations run row-by-row, the function needs to be capable of\n         *  creating a running total.\n         *\n         *  The function will be provided the aggregation item (in which you can store running\n         *  totals), the row value that is to be aggregated, and that same row value converted to\n         *  a number (most aggregations work on numbers)\n         *  @example\n         *  <pre>\n         *    customTreeAggregationFn = function ( aggregation, fieldValue, numValue, row ) {\n         *      // calculates the average of the squares of the values\n         *      if ( typeof(aggregation.count) === 'undefined' ) {\n         *        aggregation.count = 0;\n         *      }\n         *      aggregation.count++;\n         *\n         *      if ( !isNaN(numValue) ) {\n         *        if ( typeof(aggregation.total) === 'undefined' ) {\n         *          aggregation.total = 0;\n         *        }\n         *        aggregation.total = aggregation.total + numValue * numValue;\n         *      }\n         *\n         *      aggregation.value = aggregation.total / aggregation.count;\n         *    }\n         *  </pre>\n         *  <br/>Defaults to undefined. May be overwritten by treeAggregationType, the two options should not be used together.\n         */\n        if ( typeof(colDef.customTreeAggregationFn) !== 'undefined' ) {\n          col.treeAggregationFn = colDef.customTreeAggregationFn;\n        }\n\n        /**\n         *  @ngdoc object\n         *  @name treeAggregationType\n         *  @propertyOf  ui.grid.treeBase.api:ColumnDef\n         *  @description Use one of the native or grid-level aggregation methods for calculating aggregations on this column.\n         *  Native method are in the constants file and include: SUM, COUNT, MIN, MAX, AVG. This may also be the property the\n         *  name of an aggregation function defined with {@link ui.grid.treeBase.api:GridOptions treeCustomAggregations}.\n         *\n         *  <pre>\n         *      treeAggregationType = uiGridTreeBaseConstants.aggregation.SUM,\n         *    }\n         *  </pre>\n         *\n         *  If you are using aggregations you should either:\n         *\n         *   - also use grouping, in which case the aggregations are displayed in the group header, OR\n         *   - use treeView, in which case you can set `treeAggregationUpdateEntity: true` in the colDef, and\n         *     treeBase will store the aggregation information in the entity, or you can set `treeAggregationUpdateEntity: false`\n         *     in the colDef, and you need to manual retrieve the calculated aggregations from the row.treeNode.aggregations\n         *\n         *  <br/>Takes precendence over a treeAggregationFn, the two options should not be used together.\n         *  <br/>Defaults to undefined.\n         */\n        if ( typeof(colDef.treeAggregationType) !== 'undefined' ) {\n          col.treeAggregation = { type: colDef.treeAggregationType };\n          if ( typeof(gridOptions.treeCustomAggregations[colDef.treeAggregationType]) !== 'undefined' ) {\n            col.treeAggregationFn = gridOptions.treeCustomAggregations[colDef.treeAggregationType].aggregationFn;\n            col.treeAggregationFinalizerFn = gridOptions.treeCustomAggregations[colDef.treeAggregationType].finalizerFn;\n            col.treeAggregation.label = gridOptions.treeCustomAggregations[colDef.treeAggregationType].label;\n          }\n          else if ( typeof(service.nativeAggregations()[colDef.treeAggregationType]) !== 'undefined' ) {\n            col.treeAggregationFn = service.nativeAggregations()[colDef.treeAggregationType].aggregationFn;\n            col.treeAggregation.label = service.nativeAggregations()[colDef.treeAggregationType].label;\n          }\n        }\n\n         /**\n         *  @ngdoc object\n         *  @name treeAggregationLabel\n         *  @propertyOf  ui.grid.treeBase.api:ColumnDef\n         *  @description A custom label to use for this aggregation. If provided we don't use native i18n.\n         */\n        if ( typeof(colDef.treeAggregationLabel) !== 'undefined' ) {\n          if (typeof(col.treeAggregation) === 'undefined' ) {\n            col.treeAggregation = {};\n          }\n          col.treeAggregation.label = colDef.treeAggregationLabel;\n        }\n\n        /**\n         *  @ngdoc object\n         *  @name treeAggregationUpdateEntity\n         *  @propertyOf  ui.grid.treeBase.api:ColumnDef\n         *  @description Store calculated aggregations into the entity, allowing them\n         *  to be displayed in the grid using a standard cellTemplate.  This defaults to true,\n         *  if you are using grouping then you shouldn't set it to false, as then the aggregations won't\n         *  display.\n         *\n         *  If you are using treeView in most cases you'll want to set this to true.  This will result in\n         *  getCellValue returning the aggregation rather than whatever was stored in the cell attribute on\n         *  the entity.  If you want to render the underlying entity value (and do something else with the aggregation)\n         *  then you could use a custom cellTemplate to display `row.entity.myAttribute`, rather than using getCellValue.\n         *\n         *  <br/>Defaults to true\n         *\n         *  @example\n         *  <pre>\n         *    gridOptions.columns = [{\n         *      name: 'myCol',\n         *      treeAggregation: { type: uiGridTreeBaseConstants.aggregation.SUM },\n         *      treeAggregationUpdateEntity: true\n         *      cellTemplate: '<div>{{row.entity.myCol + \" \" + row.treeNode.aggregations[0].rendered}}</div>'\n         *    }];\n         * </pre>\n         */\n        col.treeAggregationUpdateEntity = colDef.treeAggregationUpdateEntity !== false;\n\n        /**\n         *  @ngdoc object\n         *  @name customTreeAggregationFinalizerFn\n         *  @propertyOf  ui.grid.treeBase.api:ColumnDef\n         *  @description A custom function that populates aggregation.rendered, this is called when\n         *  a particular aggregation has been fully calculated, and we want to render the value.\n         *\n         *  With the native aggregation options we just concatenate `aggregation.label` and\n         *  `aggregation.value`, but if you wanted to apply a filter or otherwise manipulate the label\n         *  or the value, you can do so with this function. This function will be called after the\n         *  the default `finalizerFn`.\n         *\n         *  @example\n         *  <pre>\n         *    customTreeAggregationFinalizerFn = function ( aggregation ) {\n         *      aggregation.rendered = aggregation.label + aggregation.value / 100 + '%';\n         *    }\n         *  </pre>\n         *  <br/>Defaults to undefined.\n         */\n        if ( typeof(col.customTreeAggregationFinalizerFn) === 'undefined' ) {\n          col.customTreeAggregationFinalizerFn = colDef.customTreeAggregationFinalizerFn;\n        }\n\n      },\n\n\n      /**\n       * @ngdoc function\n       * @name createRowHeader\n       * @methodOf  ui.grid.treeBase.service:uiGridTreeBaseService\n       * @description Create the rowHeader.  If treeRowHeaderAlwaysVisible then\n       * set it to visible, otherwise set it to invisible\n       *\n       * @param {Grid} grid grid object\n       */\n      createRowHeader: function( grid ) {\n        var rowHeaderColumnDef = {\n          name: uiGridTreeBaseConstants.rowHeaderColName,\n          displayName: '',\n          width:  grid.options.treeRowHeaderBaseWidth,\n          minWidth: 10,\n          cellTemplate: 'ui-grid/treeBaseRowHeader',\n          headerCellTemplate: 'ui-grid/treeBaseHeaderCell',\n          enableColumnResizing: false,\n          enableColumnMenu: false,\n          exporterSuppressExport: true,\n          allowCellFocus: true\n        };\n\n        rowHeaderColumnDef.visible = grid.options.treeRowHeaderAlwaysVisible;\n        grid.addRowHeaderColumn(rowHeaderColumnDef, -100);\n      },\n\n\n      /**\n       * @ngdoc function\n       * @name expandAllRows\n       * @methodOf  ui.grid.treeBase.service:uiGridTreeBaseService\n       * @description Expands all nodes in the tree\n       *\n       * @param {Grid} grid grid object\n       */\n      expandAllRows: function (grid) {\n        grid.treeBase.tree.forEach( function( node ) {\n          service.setAllNodes( grid, node, uiGridTreeBaseConstants.EXPANDED);\n        });\n        grid.treeBase.expandAll = true;\n        grid.queueGridRefresh();\n      },\n\n\n      /**\n       * @ngdoc function\n       * @name collapseAllRows\n       * @methodOf  ui.grid.treeBase.service:uiGridTreeBaseService\n       * @description Collapses all nodes in the tree\n       *\n       * @param {Grid} grid grid object\n       */\n      collapseAllRows: function (grid) {\n        grid.treeBase.tree.forEach( function( node ) {\n          service.setAllNodes( grid, node, uiGridTreeBaseConstants.COLLAPSED);\n        });\n        grid.treeBase.expandAll = false;\n        grid.queueGridRefresh();\n      },\n\n\n      /**\n       * @ngdoc function\n       * @name setAllNodes\n       * @methodOf  ui.grid.treeBase.service:uiGridTreeBaseService\n       * @description Works through a subset of grid.treeBase.rowExpandedStates, setting\n       * all child nodes (and their descendents) of the provided node to the given state.\n       *\n       * Calls itself recursively on all nodes so as to achieve this.\n       *\n       * @param {Grid} grid the grid we're operating on (so we can raise events)\n       * @param {object} treeNode a node in the tree that we want to update\n       * @param {string} targetState the state we want to set it to\n       */\n      setAllNodes: function (grid, treeNode, targetState) {\n        if ( typeof(treeNode.state) !== 'undefined' && treeNode.state !== targetState ) {\n          treeNode.state = targetState;\n\n          if ( targetState === uiGridTreeBaseConstants.EXPANDED ) {\n            grid.api.treeBase.raise.rowExpanded(treeNode.row);\n          }\n          else {\n            grid.api.treeBase.raise.rowCollapsed(treeNode.row);\n          }\n        }\n\n        // set all child nodes\n        if ( treeNode.children ) {\n          treeNode.children.forEach(function( childNode ) {\n            service.setAllNodes(grid, childNode, targetState);\n          });\n        }\n      },\n\n\n      /**\n       * @ngdoc function\n       * @name toggleRowTreeState\n       * @methodOf  ui.grid.treeBase.service:uiGridTreeBaseService\n       * @description Toggles the expand or collapse state of this grouped row, if\n       * it's a parent row\n       *\n       * @param {Grid} grid grid object\n       * @param {GridRow} row the row we want to toggle\n       */\n      toggleRowTreeState: function ( grid, row ) {\n        if ( typeof(row.treeLevel) === 'undefined' || row.treeLevel === null || row.treeLevel < 0 ) {\n          return;\n        }\n\n        if (row.treeNode.state === uiGridTreeBaseConstants.EXPANDED) {\n          service.collapseRow(grid, row);\n        }\n        else {\n          service.expandRow(grid, row, false);\n        }\n\n        grid.queueGridRefresh();\n      },\n\n\n      /**\n       * @ngdoc function\n       * @name expandRow\n       * @methodOf  ui.grid.treeBase.service:uiGridTreeBaseService\n       * @description Expands this specific row, showing only immediate children.\n       *\n       * @param {Grid} grid grid object\n       * @param {GridRow} row the row we want to expand\n       * @param {boolean} recursive true if you wish to expand the row's ancients\n       */\n      expandRow: function ( grid, row, recursive ) {\n        if ( recursive ) {\n          var parents = [];\n          while ( row && typeof(row.treeLevel) !== 'undefined' && row.treeLevel !== null && row.treeLevel >= 0 && row.treeNode.state !== uiGridTreeBaseConstants.EXPANDED ) {\n            parents.push(row);\n            row = row.treeNode.parentRow;\n          }\n\n          if ( parents.length > 0 ) {\n            row = parents.pop();\n            while ( row ) {\n                row.treeNode.state = uiGridTreeBaseConstants.EXPANDED;\n                grid.api.treeBase.raise.rowExpanded(row);\n                row = parents.pop();\n            }\n\n            grid.treeBase.expandAll = service.allExpanded(grid.treeBase.tree);\n            grid.queueGridRefresh();\n          }\n        }\n        else {\n          if ( typeof(row.treeLevel) === 'undefined' || row.treeLevel === null || row.treeLevel < 0 ) {\n            return;\n          }\n\n          if ( row.treeNode.state !== uiGridTreeBaseConstants.EXPANDED ) {\n            row.treeNode.state = uiGridTreeBaseConstants.EXPANDED;\n            grid.api.treeBase.raise.rowExpanded(row);\n            grid.treeBase.expandAll = service.allExpanded(grid.treeBase.tree);\n            grid.queueGridRefresh();\n          }\n        }\n      },\n\n\n      /**\n       * @ngdoc function\n       * @name expandRowChildren\n       * @methodOf  ui.grid.treeBase.service:uiGridTreeBaseService\n       * @description Expands this specific row, showing all children.\n       *\n       * @param {Grid} grid grid object\n       * @param {GridRow} row the row we want to expand\n       */\n      expandRowChildren: function ( grid, row ) {\n        if ( typeof(row.treeLevel) === 'undefined' || row.treeLevel === null || row.treeLevel < 0 ) {\n          return;\n        }\n\n        service.setAllNodes(grid, row.treeNode, uiGridTreeBaseConstants.EXPANDED);\n        grid.treeBase.expandAll = service.allExpanded(grid.treeBase.tree);\n        grid.queueGridRefresh();\n      },\n\n\n      /**\n       * @ngdoc function\n       * @name collapseRow\n       * @methodOf  ui.grid.treeBase.service:uiGridTreeBaseService\n       * @description Collapses this specific row\n       *\n       * @param {Grid} grid grid object\n       * @param {GridRow} row the row we want to collapse\n       */\n      collapseRow: function( grid, row ) {\n        if ( typeof(row.treeLevel) === 'undefined' || row.treeLevel === null || row.treeLevel < 0 ) {\n          return;\n        }\n\n        if ( row.treeNode.state !== uiGridTreeBaseConstants.COLLAPSED ) {\n          row.treeNode.state = uiGridTreeBaseConstants.COLLAPSED;\n          grid.treeBase.expandAll = false;\n          grid.api.treeBase.raise.rowCollapsed(row);\n          grid.queueGridRefresh();\n        }\n      },\n\n\n      /**\n       * @ngdoc function\n       * @name collapseRowChildren\n       * @methodOf  ui.grid.treeBase.service:uiGridTreeBaseService\n       * @description Collapses this specific row and all children\n       *\n       * @param {Grid} grid grid object\n       * @param {GridRow} row the row we want to collapse\n       */\n      collapseRowChildren: function( grid, row ) {\n        if ( typeof(row.treeLevel) === 'undefined' || row.treeLevel === null || row.treeLevel < 0 ) {\n          return;\n        }\n\n        service.setAllNodes(grid, row.treeNode, uiGridTreeBaseConstants.COLLAPSED);\n        grid.treeBase.expandAll = false;\n        grid.queueGridRefresh();\n      },\n\n\n      /**\n       * @ngdoc function\n       * @name allExpanded\n       * @methodOf  ui.grid.treeBase.service:uiGridTreeBaseService\n       * @description Returns true if all rows are expanded, false\n       * if they're not.  Walks the tree to determine this.  Used\n       * to set the expandAll state.\n       *\n       * If the node has no children, then return true (it's immaterial\n       * whether it is expanded).  If the node has children, then return\n       * false if this node is collapsed, or if any child node is not all expanded\n       *\n       * @param {object} tree the grid to check\n       * @returns {boolean} whether or not the tree is all expanded\n       */\n      allExpanded: function( tree ) {\n        var allExpanded = true;\n\n        tree.forEach(function( node ) {\n          if ( !service.allExpandedInternal( node ) ) {\n            allExpanded = false;\n          }\n        });\n        return allExpanded;\n      },\n\n      allExpandedInternal: function( treeNode ) {\n        if ( treeNode.children && treeNode.children.length > 0 ) {\n          if ( treeNode.state === uiGridTreeBaseConstants.COLLAPSED ) {\n            return false;\n          }\n          var allExpanded = true;\n          treeNode.children.forEach( function( node ) {\n            if ( !service.allExpandedInternal( node ) ) {\n              allExpanded = false;\n            }\n          });\n          return allExpanded;\n        }\n        else {\n          return true;\n        }\n      },\n\n\n      /**\n       * @ngdoc function\n       * @name treeRows\n       * @methodOf  ui.grid.treeBase.service:uiGridTreeBaseService\n       * @description The rowProcessor that adds the nodes to the tree, and sets the visible\n       * state of each row based on it's parent state\n       *\n       * Assumes it is always called after the sorting processor, and the grouping processor if there is one.\n       * Performs any tree sorts itself after having built the tree\n       *\n       * Processes all the rows in order, setting the group level based on the $$treeLevel in the associated\n       * entity, and setting the visible state based on the parent's state.\n       *\n       * Calculates the deepest level of tree whilst it goes, and updates that so that the header column can be correctly\n       * sized.\n       *\n       * Aggregates if necessary along the way.\n       *\n       * @param {array} renderableRows the rows we want to process, usually the output from the previous rowProcessor\n       * @returns {array} the updated rows\n       */\n      treeRows: function( renderableRows ) {\n        var grid = this;\n\n        if (renderableRows.length === 0) {\n          service.updateRowHeaderWidth( grid );\n          return renderableRows;\n        }\n\n        grid.treeBase.tree = service.createTree( grid, renderableRows );\n        service.updateRowHeaderWidth( grid );\n\n        service.sortTree( grid );\n        service.fixFilter( grid );\n\n        return service.renderTree( grid.treeBase.tree );\n      },\n\n\n      /**\n       * @ngdoc function\n       * @name createOrUpdateRowHeaderWidth\n       * @methodOf  ui.grid.treeBase.service:uiGridTreeBaseService\n       * @description Calculates the rowHeader width.\n       *\n       * If rowHeader is always present, updates the width.\n       *\n       * If rowHeader is only sometimes present (`treeRowHeaderAlwaysVisible: false`), determines whether there\n       * should be one, then creates or removes it as appropriate, with the created rowHeader having the\n       * right width.\n       *\n       * If there's never a rowHeader then never creates one: `showTreeRowHeader: false`\n       *\n       * @param {Grid} grid the grid we want to set the row header on\n       */\n      updateRowHeaderWidth: function( grid ) {\n        var rowHeader = grid.getColumn(uiGridTreeBaseConstants.rowHeaderColName),\n          newWidth = grid.options.treeRowHeaderBaseWidth + grid.options.treeIndent * Math.max(grid.treeBase.numberLevels - 1, 0);\n\n        if ( rowHeader && newWidth !== rowHeader.width ) {\n          rowHeader.width = newWidth;\n          grid.queueRefresh();\n        }\n\n        var newVisibility = true;\n\n        if ( grid.options.showTreeRowHeader === false ) {\n          newVisibility = false;\n        }\n        if ( grid.options.treeRowHeaderAlwaysVisible === false && grid.treeBase.numberLevels <= 0 ) {\n          newVisibility = false;\n        }\n        if ( rowHeader  && rowHeader.visible !== newVisibility ) {\n          rowHeader.visible = newVisibility;\n          rowHeader.colDef.visible = newVisibility;\n          grid.queueGridRefresh();\n        }\n      },\n\n\n      /**\n       * @ngdoc function\n       * @name renderTree\n       * @methodOf  ui.grid.treeBase.service:uiGridTreeBaseService\n       * @description Creates an array of rows based on the tree, exporting only\n       * the visible nodes and leaves\n       *\n       * @param {array} nodeList The list of nodes - can be grid.treeBase.tree, or can be node.children when\n       * we're calling recursively\n       * @returns {array} renderable rows\n       */\n      renderTree: function( nodeList ) {\n        var renderableRows = [];\n\n        nodeList.forEach( function ( node ) {\n          if ( node.row.visible ) {\n            renderableRows.push( node.row );\n          }\n          if ( node.state === uiGridTreeBaseConstants.EXPANDED && node.children && node.children.length > 0 ) {\n            renderableRows = renderableRows.concat( service.renderTree( node.children ) );\n          }\n        });\n        return renderableRows;\n      },\n\n\n      /**\n       * @ngdoc function\n       * @name createTree\n       * @methodOf  ui.grid.treeBase.service:uiGridTreeBaseService\n       * @description Creates a tree from the renderableRows\n       *\n       * @param {Grid} grid The grid\n       * @param {array} renderableRows The rows we want to create a tree from\n       * @returns {object} The tree we've build\n       */\n      createTree: function( grid, renderableRows ) {\n        var currentLevel = -1,\n          parentsCache = {},\n          parents = [],\n          currentState;\n\n        grid.treeBase.tree = [];\n        grid.treeBase.numberLevels = 0;\n\n        var aggregations = service.getAggregations( grid );\n\n        function createNode( row ) {\n          if ( !row.internalRow && row.treeLevel !== row.entity.$$treeLevel ) {\n            row.treeLevel = row.entity.$$treeLevel;\n          }\n\n          if ( row.treeLevel <= currentLevel ) {\n            // pop any levels that aren't parents of this level, formatting the aggregation at the same time\n            while ( row.treeLevel <= currentLevel ) {\n              var lastParent = parents.pop();\n              service.finaliseAggregations( lastParent );\n              currentLevel--;\n            }\n\n            // reset our current state based on the new parent, set to expanded if this is a level 0 node\n            if ( parents.length > 0 ) {\n              currentState = service.setCurrentState(parents);\n            }\n            else {\n              currentState = uiGridTreeBaseConstants.EXPANDED;\n            }\n          }\n\n          // If row header as parent exists in parentsCache\n          if (\n            typeof row.treeLevel !== 'undefined' &&\n            row.treeLevel !== null &&\n            row.treeLevel >= 0 &&\n            parentsCache.hasOwnProperty(row.uid)\n          ) {\n            parents.push(parentsCache[row.uid]);\n          }\n\n          // aggregate if this is a leaf node\n          if ( ( typeof(row.treeLevel) === 'undefined' || row.treeLevel === null || row.treeLevel < 0 ) && row.visible  ) {\n            service.aggregate( grid, row, parents );\n          }\n\n          // add this node to the tree\n          if (!parentsCache.hasOwnProperty(row.uid)) {\n            service.addOrUseNode(grid, row, parents, aggregations);\n          }\n\n          if ( typeof(row.treeLevel) !== 'undefined' && row.treeLevel !== null && row.treeLevel >= 0 ) {\n            if (!parentsCache.hasOwnProperty(row.uid)) {\n              parentsCache[row.uid] = row;\n              parents.push(row);\n            }\n            currentLevel++;\n            currentState = service.setCurrentState(parents);\n          }\n\n          // update the tree number of levels, so we can set header width if we need to\n          if ( grid.treeBase.numberLevels < row.treeLevel + 1) {\n            grid.treeBase.numberLevels = row.treeLevel + 1;\n          }\n        }\n\n        renderableRows.forEach( createNode );\n\n        // finalize remaining aggregations\n        while ( parents.length > 0 ) {\n          var lastParent = parents.pop();\n          service.finaliseAggregations( lastParent );\n        }\n\n        return grid.treeBase.tree;\n      },\n\n\n      /**\n       * @ngdoc function\n       * @name addOrUseNode\n       * @methodOf  ui.grid.treeBase.service:uiGridTreeBaseService\n       * @description Creates a tree node for this row.  If this row already has a treeNode\n       * recorded against it, preserves the state, but otherwise overwrites the data.\n       *\n       * @param {grid} grid The grid we're operating on\n       * @param {gridRow} row The row we want to set\n       * @param {array} parents An array of the parents this row should have\n       * @param {array} aggregationBase Empty aggregation information\n       * @returns {undefined} Updates the parents array, updates the row to have a treeNode, and updates the\n       * grid.treeBase.tree\n       */\n      addOrUseNode: function( grid, row, parents, aggregationBase ) {\n        var newAggregations = [];\n        aggregationBase.forEach( function(aggregation) {\n          newAggregations.push(service.buildAggregationObject(aggregation.col));\n        });\n\n        var newNode = { state: uiGridTreeBaseConstants.COLLAPSED, row: row, parentRow: null, aggregations: newAggregations, children: [] };\n        if ( row.treeNode ) {\n          newNode.state = row.treeNode.state;\n        }\n        if ( parents.length > 0 ) {\n          newNode.parentRow = parents[parents.length - 1];\n        }\n        row.treeNode = newNode;\n\n        if ( parents.length === 0 ) {\n          grid.treeBase.tree.push( newNode );\n        } else {\n          parents[parents.length - 1].treeNode.children.push( newNode );\n        }\n      },\n\n\n      /**\n       * @ngdoc function\n       * @name setCurrentState\n       * @methodOf  ui.grid.treeBase.service:uiGridTreeBaseService\n       * @description Looks at the parents array to determine our current state.\n       * If any node in the hierarchy is collapsed, then return collapsed, otherwise return\n       * expanded.\n       *\n       * @param {array} parents An array of the parents this row should have\n       * @returns {string} The state we should be setting to any nodes we see\n       */\n      setCurrentState: function( parents ) {\n        var currentState = uiGridTreeBaseConstants.EXPANDED;\n\n        parents.forEach( function(parent) {\n          if ( parent.treeNode.state === uiGridTreeBaseConstants.COLLAPSED ) {\n            currentState = uiGridTreeBaseConstants.COLLAPSED;\n          }\n        });\n        return currentState;\n      },\n\n\n      /**\n       * @ngdoc function\n       * @name sortTree\n       * @methodOf  ui.grid.treeBase.service:uiGridTreeBaseService\n       * @description Performs a recursive sort on the tree nodes, sorting the\n       * children of each node and putting them back into the children array.\n       *\n       * Before doing this it turns back on all the sortIgnore - things that were previously\n       * ignored we process now.  Since we're sorting within the nodes, presumably anything\n       * that was already sorted is how we derived the nodes, we can keep those sorts too.\n       *\n       * We only sort tree nodes that are expanded - no point in wasting effort sorting collapsed\n       * nodes\n       *\n       * @param {Grid} grid The grid to get the aggregation information from\n       * @returns {array} The aggregation information\n       */\n      sortTree: function( grid ) {\n        grid.columns.forEach( function( column ) {\n          if ( column.sort && column.sort.ignoreSort ) {\n            delete column.sort.ignoreSort;\n          }\n        });\n\n        grid.treeBase.tree = service.sortInternal( grid, grid.treeBase.tree );\n      },\n\n      sortInternal: function( grid, treeList ) {\n        var rows = treeList.map( function( node ) {\n          return node.row;\n        });\n\n        rows = rowSorter.sort( grid, rows, grid.columns );\n\n        var treeNodes = rows.map( function( row ) {\n          return row.treeNode;\n        });\n\n        treeNodes.forEach( function( node ) {\n          if ( node.state === uiGridTreeBaseConstants.EXPANDED && node.children && node.children.length > 0 ) {\n            node.children = service.sortInternal( grid, node.children );\n          }\n        });\n\n        return treeNodes;\n      },\n\n      /**\n       * @ngdoc function\n       * @name fixFilter\n       * @methodOf  ui.grid.treeBase.service:uiGridTreeBaseService\n       * @description After filtering has run, we need to go back through the tree\n       * and make sure the parent rows are always visible if any of the child rows\n       * are visible (filtering may make a child visible, but the parent may not\n       * match the filter criteria)\n       *\n       * This has a risk of being computationally expensive, we do it by walking\n       * the tree and remembering whether there are any invisible nodes on the\n       * way down.\n       *\n       * @param {Grid} grid the grid to fix filters on\n       */\n      fixFilter: function( grid ) {\n        var parentsVisible;\n\n        grid.treeBase.tree.forEach( function( node ) {\n          if ( node.children && node.children.length > 0 ) {\n            parentsVisible = node.row.visible;\n            service.fixFilterInternal( node.children, parentsVisible );\n          }\n        });\n      },\n\n      fixFilterInternal: function( nodes, parentsVisible) {\n        nodes.forEach(function( node ) {\n          if ( node.row.visible && !parentsVisible ) {\n            service.setParentsVisible( node );\n            parentsVisible = true;\n          }\n\n          if ( node.children && node.children.length > 0 ) {\n            if ( service.fixFilterInternal( node.children, ( parentsVisible && node.row.visible ) ) ) {\n              parentsVisible = true;\n            }\n          }\n        });\n\n        return parentsVisible;\n      },\n\n      setParentsVisible: function( node ) {\n        while ( node.parentRow ) {\n          node.parentRow.visible = true;\n          node = node.parentRow.treeNode;\n        }\n      },\n\n      /**\n       * @ngdoc function\n       * @name buildAggregationObject\n       * @methodOf  ui.grid.treeBase.service:uiGridTreeBaseService\n       * @description Build the object which is stored on the column for holding meta-data about the aggregation.\n       * This method should only be called with columns which have an aggregation.\n       *\n       * @param {GridColumn} column The column which this object relates to\n       * @returns {object} {col: GridColumn object, label: string, type: string (optional)}\n       */\n      buildAggregationObject: function( column ) {\n        var newAggregation = { col: column };\n\n        if ( column.treeAggregation && column.treeAggregation.type ) {\n          newAggregation.type = column.treeAggregation.type;\n        }\n\n        if ( column.treeAggregation && column.treeAggregation.label ) {\n          newAggregation.label = column.treeAggregation.label;\n        }\n\n        return newAggregation;\n      },\n\n      /**\n       * @ngdoc function\n       * @name getAggregations\n       * @methodOf  ui.grid.treeBase.service:uiGridTreeBaseService\n       * @description Looks through the grid columns to find those with aggregations,\n       * and collates the aggregation information into an array, returns that array\n       *\n       * @param {Grid} grid the grid to get the aggregation information from\n       * @returns {array} the aggregation information\n       */\n      getAggregations: function( grid ) {\n        var aggregateArray = [];\n\n        grid.columns.forEach( function(column) {\n          if ( typeof(column.treeAggregationFn) !== 'undefined' ) {\n            aggregateArray.push( service.buildAggregationObject(column) );\n\n            if ( grid.options.showColumnFooter && typeof(column.colDef.aggregationType) === 'undefined' && column.treeAggregation ) {\n              // Add aggregation object for footer\n              column.treeFooterAggregation = service.buildAggregationObject(column);\n              column.aggregationType = service.treeFooterAggregationType;\n            }\n          }\n        });\n        return aggregateArray;\n      },\n\n\n      /**\n       * @ngdoc function\n       * @name aggregate\n       * @methodOf  ui.grid.treeBase.service:uiGridTreeBaseService\n       * @description Accumulate the data from this row onto the aggregations for each parent\n       *\n       * Iterate over the parents, then iterate over the aggregations for each of those parents,\n       * and perform the aggregation for each individual aggregation\n       *\n       * @param {Grid} grid grid object\n       * @param {GridRow} row the row we want to set grouping visibility on\n       * @param {array} parents the parents that we would want to aggregate onto\n       */\n      aggregate: function( grid, row, parents ) {\n        if (parents.length === 0 && row.treeNode && row.treeNode.aggregations) {\n          row.treeNode.aggregations.forEach(function(aggregation) {\n            // Calculate aggregations for footer even if there are no grouped rows\n            if (typeof(aggregation.col.treeFooterAggregation) !== 'undefined') {\n              var fieldValue = grid.getCellValue(row, aggregation.col);\n              var numValue = Number(fieldValue);\n              if (aggregation.col.treeAggregationFn) {\n                aggregation.col.treeAggregationFn(aggregation.col.treeFooterAggregation, fieldValue, numValue, row);\n              } else {\n                aggregation.col.treeFooterAggregation.value = undefined;\n              }\n            }\n          });\n        }\n\n        parents.forEach( function( parent, index ) {\n          if (parent.treeNode.aggregations) {\n            parent.treeNode.aggregations.forEach( function( aggregation ) {\n              var fieldValue = grid.getCellValue(row, aggregation.col);\n              var numValue = Number(fieldValue);\n              aggregation.col.treeAggregationFn(aggregation, fieldValue, numValue, row);\n\n              if (index === 0 && typeof(aggregation.col.treeFooterAggregation) !== 'undefined') {\n                if (aggregation.col.treeAggregationFn) {\n                  aggregation.col.treeAggregationFn(aggregation.col.treeFooterAggregation, fieldValue, numValue, row);\n                } else {\n                  aggregation.col.treeFooterAggregation.value = undefined;\n                }\n              }\n            });\n          }\n        });\n      },\n\n\n      // Aggregation routines - no doco needed as self evident\n      nativeAggregations: function() {\n        return {\n          count: {\n            label: i18nService.get().aggregation.count,\n            menuTitle: i18nService.get().grouping.aggregate_count,\n            aggregationFn: function (aggregation, fieldValue, numValue) {\n              if (typeof(aggregation.value) === 'undefined') {\n                aggregation.value = 1;\n              } else {\n                aggregation.value++;\n              }\n            }\n          },\n\n          sum: {\n            label: i18nService.get().aggregation.sum,\n            menuTitle: i18nService.get().grouping.aggregate_sum,\n            aggregationFn: function( aggregation, fieldValue, numValue ) {\n              if (!isNaN(numValue)) {\n                if (typeof(aggregation.value) === 'undefined') {\n                  aggregation.value = numValue;\n                } else {\n                  aggregation.value += numValue;\n                }\n              }\n            }\n          },\n\n          min: {\n            label: i18nService.get().aggregation.min,\n            menuTitle: i18nService.get().grouping.aggregate_min,\n            aggregationFn: function( aggregation, fieldValue, numValue ) {\n              if (typeof(aggregation.value) === 'undefined') {\n                aggregation.value = fieldValue;\n              } else {\n                if (typeof(fieldValue) !== 'undefined' && fieldValue !== null && (fieldValue < aggregation.value || aggregation.value === null)) {\n                  aggregation.value = fieldValue;\n                }\n              }\n            }\n          },\n\n          max: {\n            label: i18nService.get().aggregation.max,\n            menuTitle: i18nService.get().grouping.aggregate_max,\n            aggregationFn: function( aggregation, fieldValue, numValue ) {\n              if ( typeof(aggregation.value) === 'undefined' ) {\n                aggregation.value = fieldValue;\n              } else {\n                if ( typeof(fieldValue) !== 'undefined' && fieldValue !== null && (fieldValue > aggregation.value || aggregation.value === null)) {\n                  aggregation.value = fieldValue;\n                }\n              }\n            }\n          },\n\n          avg: {\n            label: i18nService.get().aggregation.avg,\n            menuTitle: i18nService.get().grouping.aggregate_avg,\n            aggregationFn: function( aggregation, fieldValue, numValue ) {\n              if ( typeof(aggregation.count) === 'undefined' ) {\n                aggregation.count = 1;\n              } else {\n                aggregation.count++;\n              }\n\n              if ( isNaN(numValue) ) {\n                return;\n              }\n\n              if ( typeof(aggregation.value) === 'undefined' || typeof(aggregation.sum) === 'undefined' ) {\n                aggregation.value = numValue;\n                aggregation.sum = numValue;\n              } else {\n                aggregation.sum += numValue;\n                aggregation.value = aggregation.sum / aggregation.count;\n              }\n            }\n          }\n        };\n      },\n\n      /**\n       * @ngdoc function\n       * @name finaliseAggregation\n       * @methodOf  ui.grid.treeBase.service:uiGridTreeBaseService\n       * @description Helper function used to finalize aggregation nodes and footer cells\n       *\n       * @param {gridRow} row The parent we're finalising\n       * @param {aggregation} aggregation The aggregation object manipulated by the aggregationFn\n       */\n      finaliseAggregation: function(row, aggregation) {\n        if ( aggregation.col.treeAggregationUpdateEntity && typeof(row) !== 'undefined' && typeof(row.entity[ '$$' + aggregation.col.uid ]) !== 'undefined' ) {\n          angular.extend( aggregation, row.entity[ '$$' + aggregation.col.uid ]);\n        }\n\n        if ( typeof(aggregation.col.treeAggregationFinalizerFn) === 'function' ) {\n          aggregation.col.treeAggregationFinalizerFn( aggregation );\n        }\n        if ( typeof(aggregation.col.customTreeAggregationFinalizerFn) === 'function' ) {\n          aggregation.col.customTreeAggregationFinalizerFn( aggregation );\n        }\n        if ( typeof(aggregation.rendered) === 'undefined' ) {\n          aggregation.rendered = aggregation.label ? aggregation.label + aggregation.value : aggregation.value;\n        }\n      },\n\n      /**\n       * @ngdoc function\n       * @name finaliseAggregations\n       * @methodOf  ui.grid.treeBase.service:uiGridTreeBaseService\n       * @description Format the data from the aggregation into the rendered text\n       * e.g. if we had label: 'sum: ' and value: 25, we'd create 'sum: 25'.\n       *\n       * As part of this we call any formatting callback routines we've been provided.\n       *\n       * We write our aggregation out to the row.entity if treeAggregationUpdateEntity is\n       * set on the column - we don't overwrite any information that's already there, we append\n       * to it so that grouping can have set the groupVal beforehand without us overwriting it.\n       *\n       * We need to copy the data from the row.entity first before we finalise the aggregation,\n       * we need that information for the finaliserFn\n       *\n       * @param {gridRow} row the parent we're finalising\n       */\n      finaliseAggregations: function( row ) {\n        if ( row == null || typeof(row.treeNode.aggregations) === 'undefined' ) {\n          return;\n        }\n\n        row.treeNode.aggregations.forEach( function( aggregation ) {\n          service.finaliseAggregation(row, aggregation);\n\n          if ( aggregation.col.treeAggregationUpdateEntity ) {\n            var aggregationCopy = {};\n\n            angular.forEach( aggregation, function( value, key ) {\n              if ( aggregation.hasOwnProperty(key) && key !== 'col' ) {\n                aggregationCopy[key] = value;\n              }\n            });\n\n            row.entity[ '$$' + aggregation.col.uid ] = aggregationCopy;\n          }\n        });\n      },\n\n      /**\n       * @ngdoc function\n       * @name treeFooterAggregationType\n       * @methodOf  ui.grid.treeBase.service:uiGridTreeBaseService\n       * @description Uses the tree aggregation functions and finalizers to set the\n       * column footer aggregations.\n       *\n       * @param {rows} rows The visible rows. not used, but accepted to match signature of GridColumn.aggregationType\n       * @param {GridColumn} column The column we are finalizing\n       */\n      treeFooterAggregationType: function( rows, column ) {\n        service.finaliseAggregation(undefined, column.treeFooterAggregation);\n        if ( typeof(column.treeFooterAggregation.value) === 'undefined' || column.treeFooterAggregation.rendered === null ) {\n          // The was apparently no aggregation performed (perhaps this is a grouped column\n          return '';\n        }\n        return column.treeFooterAggregation.rendered;\n      }\n    };\n\n    return service;\n  }]);\n\n\n  /**\n   *  @ngdoc directive\n   *  @name ui.grid.treeBase.directive:uiGridTreeRowHeaderButtons\n   *  @element div\n   *\n   *  @description Provides the expand/collapse button on rows\n   */\n  module.directive('uiGridTreeBaseRowHeaderButtons', ['$templateCache', 'uiGridTreeBaseService',\n  function ($templateCache, uiGridTreeBaseService) {\n    return {\n      replace: true,\n      restrict: 'E',\n      template: $templateCache.get('ui-grid/treeBaseRowHeaderButtons'),\n      scope: true,\n      require: '^uiGrid',\n      link: function($scope, $elm, $attrs, uiGridCtrl) {\n        var self = uiGridCtrl.grid;\n        $scope.treeButtonClass = function(row) {\n          if ( ( self.options.showTreeExpandNoChildren && row.treeLevel > -1 ) || ( row.treeNode.children && row.treeNode.children.length > 0 ) ) {\n            if (row.treeNode.state === 'expanded' ) {\n              return 'ui-grid-icon-minus-squared';\n            }\n            if (row.treeNode.state === 'collapsed' ) {\n              return 'ui-grid-icon-plus-squared';\n            }\n          }\n        };\n        $scope.treeButtonClick = function(row, evt) {\n          evt.stopPropagation();\n          uiGridTreeBaseService.toggleRowTreeState(self, row, evt);\n        };\n        $scope.treeButtonKeyDown = function (row, evt) {\n          if (evt.keyCode === 32 || evt.keyCode === 13) {\n            $scope.treeButtonClick(row, evt);\n          }\n        };\n      }\n    };\n  }]);\n\n\n  /**\n   *  @ngdoc directive\n   *  @name ui.grid.treeBase.directive:uiGridTreeBaseExpandAllButtons\n   *  @element div\n   *\n   *  @description Provides the expand/collapse all button\n   */\n  module.directive('uiGridTreeBaseExpandAllButtons', ['$templateCache', 'uiGridTreeBaseService',\n  function ($templateCache, uiGridTreeBaseService) {\n    return {\n      replace: true,\n      restrict: 'E',\n      template: $templateCache.get('ui-grid/treeBaseExpandAllButtons'),\n      scope: false,\n      link: function($scope) {\n        var self = $scope.col.grid;\n        $scope.headerButtonClass = function() {\n          if (self.treeBase.numberLevels > 0 && self.treeBase.expandAll) {\n            return 'ui-grid-icon-minus-squared';\n          }\n          if (self.treeBase.numberLevels > 0 && !self.treeBase.expandAll) {\n            return 'ui-grid-icon-plus-squared';\n          }\n        };\n        $scope.headerButtonClick = function(row, evt) {\n          if ( self.treeBase.expandAll ) {\n            uiGridTreeBaseService.collapseAllRows(self, evt);\n          } else {\n            uiGridTreeBaseService.expandAllRows(self, evt);\n          }\n        };\n        $scope.headerButtonKeyDown = function (evt) {\n          if (evt.keyCode === 32 || evt.keyCode === 13) {\n            $scope.headerButtonClick(self, evt);\n          }\n        };\n      }\n    };\n  }]);\n\n\n  /**\n   *  @ngdoc directive\n   *  @name ui.grid.treeBase.directive:uiGridViewport\n   *  @element div\n   *\n   *  @description Stacks on top of ui.grid.uiGridViewport to set formatting on a tree header row\n   */\n  module.directive('uiGridViewport',\n    function () {\n      return {\n        priority: -200, // run after default  directive\n        scope: false,\n        compile: function ($elm) {\n          var rowRepeatDiv = angular.element($elm.children().children()[0]);\n\n          var existingNgClass = rowRepeatDiv.attr(\"ng-class\");\n          var newNgClass = '';\n          if ( existingNgClass ) {\n            newNgClass = existingNgClass.slice(0, -1) + \",'ui-grid-tree-header-row': row.treeLevel > -1}\";\n          } else {\n            newNgClass = \"{'ui-grid-tree-header-row': row.treeLevel > -1}\";\n          }\n          rowRepeatDiv.attr(\"ng-class\", newNgClass);\n\n          return {\n            pre: function ($scope, $elm, $attrs, controllers) {\n\n            },\n            post: function ($scope, $elm, $attrs, controllers) {\n            }\n          };\n        }\n      };\n    });\n})();\n\n(function () {\n  'use strict';\n\n  /**\n   * @ngdoc overview\n   * @name ui.grid.treeView\n   * @description\n   *\n   * # ui.grid.treeView\n   *\n   * <div class=\"alert alert-warning\" role=\"alert\"><strong>Beta</strong> This feature is ready for testing, but it either hasn't seen a lot of use or has some known bugs.</div>\n   *\n   * This module provides a tree view of the data that it is provided, with nodes in that\n   * tree and leaves.  Unlike grouping, the tree is an inherent property of the data and must\n   * be provided with your data array.\n   *\n   * Design information:\n   * -------------------\n   *\n   * TreeView uses treeBase for the underlying functionality, and is a very thin wrapper around\n   * that logic.  Most of the design information has now moved to treebase.\n   * <br/>\n   * <br/>\n   *\n   * <div doc-module-components=\"ui.grid.treeView\"></div>\n   */\n\n  var module = angular.module('ui.grid.treeView', ['ui.grid', 'ui.grid.treeBase']);\n\n  /**\n   *  @ngdoc object\n   *  @name ui.grid.treeView.constant:uiGridTreeViewConstants\n   *\n   *  @description constants available in treeView module, this includes\n   *  all the constants declared in the treeBase module (these are manually copied\n   *  as there isn't an easy way to include constants in another constants file, and\n   *  we don't want to make users include treeBase)\n   *\n   */\n  module.constant('uiGridTreeViewConstants', {\n    featureName: \"treeView\",\n    rowHeaderColName: 'treeBaseRowHeaderCol',\n    EXPANDED: 'expanded',\n    COLLAPSED: 'collapsed',\n    aggregation: {\n      COUNT: 'count',\n      SUM: 'sum',\n      MAX: 'max',\n      MIN: 'min',\n      AVG: 'avg'\n    }\n  });\n\n  /**\n   *  @ngdoc service\n   *  @name ui.grid.treeView.service:uiGridTreeViewService\n   *\n   *  @description Services for treeView features\n   */\n  module.service('uiGridTreeViewService', ['$q', 'uiGridTreeViewConstants', 'uiGridTreeBaseConstants', 'uiGridTreeBaseService', 'gridUtil', 'GridRow', 'gridClassFactory', 'i18nService', 'uiGridConstants',\n  function ($q, uiGridTreeViewConstants, uiGridTreeBaseConstants, uiGridTreeBaseService, gridUtil, GridRow, gridClassFactory, i18nService, uiGridConstants) {\n\n    var service = {\n\n      initializeGrid: function (grid, $scope) {\n        uiGridTreeBaseService.initializeGrid( grid, $scope );\n\n        /**\n         *  @ngdoc object\n         *  @name ui.grid.treeView.grid:treeView\n         *\n         *  @description Grid properties and functions added for treeView\n         */\n        grid.treeView = {};\n\n        grid.registerRowsProcessor(service.adjustSorting, 60);\n\n        /**\n         *  @ngdoc object\n         *  @name ui.grid.treeView.api:PublicApi\n         *\n         *  @description Public Api for treeView feature\n         */\n        var publicApi = {\n          events: {\n            treeView: {\n            }\n          },\n          methods: {\n            treeView: {\n            }\n          }\n        };\n\n        grid.api.registerEventsFromObject(publicApi.events);\n\n        grid.api.registerMethodsFromObject(publicApi.methods);\n\n      },\n\n      defaultGridOptions: function (gridOptions) {\n        // default option to true unless it was explicitly set to false\n        /**\n         *  @ngdoc object\n         *  @name ui.grid.treeView.api:GridOptions\n         *\n         *  @description GridOptions for treeView feature, these are available to be\n         *  set using the ui-grid {@link ui.grid.class:GridOptions gridOptions}\n         *\n         *  Many tree options are set on treeBase, make sure to look at that feature in\n         *  conjunction with these options.\n         */\n\n        /**\n         *  @ngdoc object\n         *  @name enableTreeView\n         *  @propertyOf  ui.grid.treeView.api:GridOptions\n         *  @description Enable row tree view for entire grid.\n         *  <br/>Defaults to true\n         */\n        gridOptions.enableTreeView = gridOptions.enableTreeView !== false;\n\n      },\n\n\n      /**\n       * @ngdoc function\n       * @name adjustSorting\n       * @methodOf  ui.grid.treeBase.service:uiGridTreeBaseService\n       * @description Trees cannot be sorted the same as flat lists of rows -\n       * trees are sorted recursively within each level - so the children of each\n       * node are sorted, but not the full set of rows.\n       *\n       * To achieve this, we suppress the normal sorting by setting ignoreSort on\n       * each of the sort columns.  When the treeBase rowsProcessor runs it will then\n       * unignore these, and will perform a recursive sort against the tree that it builds.\n       *\n       * @param {array} renderableRows the rows that we need to pass on through\n       * @returns {array} renderableRows that we passed on through\n       */\n      adjustSorting: function( renderableRows ) {\n        var grid = this;\n\n        grid.columns.forEach( function( column ) {\n          if ( column.sort ) {\n            column.sort.ignoreSort = true;\n          }\n        });\n\n        return renderableRows;\n      }\n    };\n\n    return service;\n  }]);\n\n  /**\n   *  @ngdoc directive\n   *  @name ui.grid.treeView.directive:uiGridTreeView\n   *  @element div\n   *  @restrict A\n   *\n   *  @description Adds treeView features to grid\n   *\n   *  @example\n   <example module=\"app\">\n   <file name=\"app.js\">\n   var app = angular.module('app', ['ui.grid', 'ui.grid.treeView']);\n\n   app.controller('MainCtrl', ['$scope', function ($scope) {\n      $scope.data = [\n        { name: 'Bob', title: 'CEO' },\n            { name: 'Frank', title: 'Lowly Developer' }\n      ];\n\n      $scope.columnDefs = [\n        {name: 'name', enableCellEdit: true},\n        {name: 'title', enableCellEdit: true}\n      ];\n\n      $scope.gridOptions = { columnDefs: $scope.columnDefs, data: $scope.data };\n    }]);\n   </file>\n   <file name=\"index.ced81ed4.html\">\n   <div ng-controller=\"MainCtrl\">\n   <div ui-grid=\"gridOptions\" ui-grid-tree-view></div>\n   </div>\n   </file>\n   </example>\n   */\n  module.directive('uiGridTreeView', ['uiGridTreeViewConstants', 'uiGridTreeViewService', '$templateCache',\n  function (uiGridTreeViewConstants, uiGridTreeViewService, $templateCache) {\n    return {\n      replace: true,\n      priority: 0,\n      require: '^uiGrid',\n      scope: false,\n      compile: function () {\n        return {\n          pre: function ($scope, $elm, $attrs, uiGridCtrl) {\n            if (uiGridCtrl.grid.options.enableTreeView !== false) {\n              uiGridTreeViewService.initializeGrid(uiGridCtrl.grid, $scope);\n            }\n          },\n          post: function ($scope, $elm, $attrs, uiGridCtrl) {\n\n          }\n        };\n      }\n    };\n  }]);\n})();\n\n(function () {\n  'use strict';\n\n  /**\n   * @ngdoc overview\n   * @name ui.grid.validate\n   * @description\n   *\n   * # ui.grid.validate\n   *\n   * <div class=\"alert alert-warning\" role=\"alert\"><strong>Alpha</strong> This feature is in development. There will almost certainly be breaking api changes, or there are major outstanding bugs.</div>\n   *\n   * This module provides the ability to validate cells upon change.\n   *\n   * Design information:\n   * -------------------\n   *\n   * Validation is not based on angularjs validation, since it would work only when editing the field.\n   *\n   * Instead it adds custom properties to any field considered as invalid.\n   *\n   * <br/>\n   * <br/>\n   *\n   * <div doc-module-components=\"ui.grid.expandable\"></div>\n   */\n  var module = angular.module('ui.grid.validate', ['ui.grid']);\n\n  /**\n   *  @ngdoc service\n   *  @name ui.grid.validate.service:uiGridValidateService\n   *\n   *  @description Services for validation features\n   */\n  module.service('uiGridValidateService', ['$sce', '$q', '$http', 'i18nService', 'uiGridConstants', function ($sce, $q, $http, i18nService, uiGridConstants) {\n\n    var service = {\n\n      /**\n       *  @ngdoc object\n       *  @name validatorFactories\n       *  @propertyOf ui.grid.validate.service:uiGridValidateService\n       *  @description object containing all the factories used to validate data.<br/>\n       *  These factories will be in the form <br/>\n       *  ```\n       *  {\n       *    validatorFactory: function(argument) {\n       *                        return function(newValue, oldValue, rowEntity, colDef) {\n       *                          return true || false || promise\n       *                        }\n       *                      },\n       *    messageFunction: function(argument) {\n       *                       return string\n       *                     }\n       *  }\n       *  ```\n       *\n       * Promises should return true or false as result according to the result of validation.\n       */\n      validatorFactories: {},\n\n      /**\n       * @ngdoc service\n       * @name setExternalFactoryFunction\n       * @methodOf ui.grid.validate.service:uiGridValidateService\n       * @description Adds a way to retrieve validators from an external service\n       * <p>Validators from this external service have a higher priority than default\n       * ones\n       * @param {function} externalFactoryFunction a function that accepts name and argument to pass to a\n       * validator factory and that returns an object with the same properties as\n       * you can see in {@link ui.grid.validate.service:uiGridValidateService#properties_validatorFactories validatorFactories}\n       */\n      setExternalFactoryFunction: function(externalFactoryFunction) {\n        service.externalFactoryFunction = externalFactoryFunction;\n      },\n\n      /**\n       * @ngdoc service\n       * @name clearExternalFactory\n       * @methodOf ui.grid.validate.service:uiGridValidateService\n       * @description Removes any link to external factory from this service\n       */\n      clearExternalFactory: function() {\n        delete service.externalFactoryFunction;\n      },\n\n      /**\n       * @ngdoc service\n       * @name getValidatorFromExternalFactory\n       * @methodOf ui.grid.validate.service:uiGridValidateService\n       * @description Retrieves a validator by executing a validatorFactory\n       * stored in an external service.\n       * @param {string} name the name of the validator to retrieve\n       * @param {object} argument an argument to pass to the validator factory\n       */\n      getValidatorFromExternalFactory: function(name, argument) {\n        return service.externalFactoryFunction(name, argument).validatorFactory(argument);\n      },\n\n      /**\n       * @ngdoc service\n       * @name getMessageFromExternalFactory\n       * @methodOf ui.grid.validate.service:uiGridValidateService\n       * @description Retrieves a message stored in an external service.\n       * @param {string} name the name of the validator\n       * @param {object} argument an argument to pass to the message function\n       */\n      getMessageFromExternalFactory: function(name, argument) {\n        return service.externalFactoryFunction(name, argument).messageFunction(argument);\n      },\n\n      /**\n       * @ngdoc service\n       * @name setValidator\n       * @methodOf ui.grid.validate.service:uiGridValidateService\n       * @description  Adds a new validator to the service\n       * @param {string} name the name of the validator, must be unique\n       * @param {function} validatorFactory a factory that return a validatorFunction\n       * @param {function} messageFunction a function that return the error message\n       */\n      setValidator: function(name, validatorFactory, messageFunction) {\n        service.validatorFactories[name] = {\n          validatorFactory: validatorFactory,\n          messageFunction: messageFunction\n        };\n      },\n\n      /**\n       * @ngdoc service\n       * @name getValidator\n       * @methodOf ui.grid.validate.service:uiGridValidateService\n       * @description Returns a validator registered to the service\n       * or retrieved from the external factory\n       * @param {string} name the name of the validator to retrieve\n       * @param {object} argument an argument to pass to the validator factory\n       * @returns {object} the validator function\n       */\n      getValidator: function(name, argument) {\n        if (service.externalFactoryFunction) {\n          var validator = service.getValidatorFromExternalFactory(name, argument);\n          if (validator) {\n            return validator;\n          }\n        }\n        if (!service.validatorFactories[name]) {\n          throw (\"Invalid validator name: \" + name);\n        }\n        return service.validatorFactories[name].validatorFactory(argument);\n      },\n\n      /**\n       * @ngdoc service\n       * @name getMessage\n       * @methodOf ui.grid.validate.service:uiGridValidateService\n       * @description Returns the error message related to the validator\n       * @param {string} name the name of the validator\n       * @param {object} argument an argument to pass to the message function\n       * @returns {string} the error message related to the validator\n       */\n      getMessage: function(name, argument) {\n        if (service.externalFactoryFunction) {\n          var message = service.getMessageFromExternalFactory(name, argument);\n          if (message) {\n            return message;\n          }\n        }\n        return service.validatorFactories[name].messageFunction(argument);\n      },\n\n      /**\n       * @ngdoc service\n       * @name isInvalid\n       * @methodOf ui.grid.validate.service:uiGridValidateService\n       * @description Returns true if the cell (identified by rowEntity, colDef) is invalid\n       * @param {object} rowEntity the row entity of the cell\n       * @param {object} colDef the colDef of the cell\n       * @returns {boolean} true if the cell is invalid\n       */\n      isInvalid: function (rowEntity, colDef) {\n        return rowEntity['$$invalid'+colDef.name];\n      },\n\n      /**\n       * @ngdoc service\n       * @name setInvalid\n       * @methodOf ui.grid.validate.service:uiGridValidateService\n       * @description Makes the cell invalid by adding the proper field to the entity\n       * @param {object} rowEntity the row entity of the cell\n       * @param {object} colDef the colDef of the cell\n       */\n      setInvalid: function (rowEntity, colDef) {\n        rowEntity['$$invalid'+colDef.name] = true;\n      },\n\n      /**\n       * @ngdoc service\n       * @name setValid\n       * @methodOf ui.grid.validate.service:uiGridValidateService\n       * @description Makes the cell valid by removing the proper error field from the entity\n       * @param {object} rowEntity the row entity of the cell\n       * @param {object} colDef the colDef of the cell\n       */\n      setValid: function (rowEntity, colDef) {\n        delete rowEntity['$$invalid'+colDef.name];\n      },\n\n      /**\n       * @ngdoc service\n       * @name setError\n       * @methodOf ui.grid.validate.service:uiGridValidateService\n       * @description Adds the proper error to the entity errors field\n       * @param {object} rowEntity the row entity of the cell\n       * @param {object} colDef the colDef of the cell\n       * @param {string} validatorName the name of the validator that is failing\n       */\n      setError: function(rowEntity, colDef, validatorName) {\n        if (!rowEntity['$$errors'+colDef.name]) {\n          rowEntity['$$errors'+colDef.name] = {};\n        }\n        rowEntity['$$errors'+colDef.name][validatorName] = true;\n      },\n\n      /**\n       * @ngdoc service\n       * @name clearError\n       * @methodOf ui.grid.validate.service:uiGridValidateService\n       * @description Removes the proper error from the entity errors field\n       * @param {object} rowEntity the row entity of the cell\n       * @param {object} colDef the colDef of the cell\n       * @param {string} validatorName the name of the validator that is failing\n       */\n      clearError: function(rowEntity, colDef, validatorName) {\n        if (!rowEntity['$$errors'+colDef.name]) {\n          return;\n        }\n        if (validatorName in rowEntity['$$errors'+colDef.name]) {\n            delete rowEntity['$$errors'+colDef.name][validatorName];\n        }\n      },\n\n      /**\n       * @ngdoc function\n       * @name getErrorMessages\n       * @methodOf ui.grid.validate.service:uiGridValidateService\n       * @description returns an array of i18n-ed error messages.\n       * @param {object} rowEntity gridOptions.data[] array instance whose errors we are looking for\n       * @param {object} colDef the column whose errors we are looking for\n       * @returns {array} An array of strings containing all the error messages for the cell\n       */\n      getErrorMessages: function(rowEntity, colDef) {\n        var errors = [];\n\n        if (!rowEntity['$$errors'+colDef.name] || Object.keys(rowEntity['$$errors'+colDef.name]).length === 0) {\n          return errors;\n        }\n\n        Object.keys(rowEntity['$$errors'+colDef.name]).sort().forEach(function(validatorName) {\n          errors.push(service.getMessage(validatorName, colDef.validators[validatorName]));\n        });\n\n        return errors;\n      },\n\n      /**\n       * @ngdoc function\n       * @name getFormattedErrors\n       * @methodOf  ui.grid.validate.service:uiGridValidateService\n       * @description returns the error i18n-ed and formatted in html to be shown inside the page.\n       * @param {object} rowEntity gridOptions.data[] array instance whose errors we are looking for\n       * @param {object} colDef the column whose errors we are looking for\n       * @returns {object} An object that can be used in a template (like a cellTemplate) to display the\n       * message inside the page (i.e. inside a div)\n       */\n      getFormattedErrors: function(rowEntity, colDef) {\n        var msgString = \"\",\n          errors = service.getErrorMessages(rowEntity, colDef);\n\n        if (!errors.length) {\n          return;\n        }\n\n        errors.forEach(function(errorMsg) {\n          msgString += errorMsg + \"<br/>\";\n        });\n\n        return $sce.trustAsHtml('<p><b>' + i18nService.getSafeText('validate.error') + '</b></p>' + msgString );\n      },\n\n      /**\n       * @ngdoc function\n       * @name getTitleFormattedErrors\n       * @methodOf ui.grid.validate.service:uiGridValidateService\n       * @description returns the error i18n-ed and formatted in javaScript to be shown inside an html\n       * title attribute.\n       * @param {object} rowEntity gridOptions.data[] array instance whose errors we are looking for\n       * @param {object} colDef the column whose errors we are looking for\n       * @returns {object} An object that can be used in a template (like a cellTemplate) to display the\n       * message inside an html title attribute\n       */\n      getTitleFormattedErrors: function(rowEntity, colDef) {\n        var newLine = \"\\n\",\n          msgString = \"\",\n          errors = service.getErrorMessages(rowEntity, colDef);\n\n        if (!errors.length) {\n          return;\n        }\n\n        errors.forEach(function(errorMsg) {\n          msgString += errorMsg + newLine;\n        });\n\n        return $sce.trustAsHtml(i18nService.getSafeText('validate.error') + newLine + msgString);\n      },\n\n      /**\n       * @ngdoc function\n       * @name getTitleFormattedErrors\n       * @methodOf ui.grid.validate.service:uiGridValidateService\n       * @description Executes all validators on a cell (identified by row entity and column definition) and sets or clears errors\n       * @param {object} rowEntity the row entity of the cell we want to run the validators on\n       * @param {object} colDef the column definition of the cell we want to run the validators on\n       * @param {object} newValue the value the user just entered\n       * @param {object} oldValue the value the field had before\n       */\n      runValidators: function(rowEntity, colDef, newValue, oldValue, grid) {\n        if (newValue === oldValue) {\n          // If the value has not changed we perform no validation\n          return;\n        }\n\n        if (typeof(colDef.name) === 'undefined' || !colDef.name) {\n          throw new Error('colDef.name is required to perform validation');\n        }\n\n        service.setValid(rowEntity, colDef);\n\n        var validateClosureFactory = function(rowEntity, colDef, validatorName) {\n          return function(value) {\n            if (!value) {\n              service.setInvalid(rowEntity, colDef);\n              service.setError(rowEntity, colDef, validatorName);\n              if (grid) {\n                grid.api.validate.raise.validationFailed(rowEntity, colDef, newValue, oldValue);\n              }\n            }\n          };\n        };\n\n        var promises = [];\n\n        for (var validatorName in colDef.validators) {\n          service.clearError(rowEntity, colDef, validatorName);\n          var validatorFunction = service.getValidator(validatorName, colDef.validators[validatorName]);\n\n          // We pass the arguments as oldValue, newValue so they are in the same order\n          // as ng-model validators (modelValue, viewValue)\n          var promise = $q.when(validatorFunction(oldValue, newValue, rowEntity, colDef))\n            .then(validateClosureFactory(rowEntity, colDef, validatorName));\n\n          promises.push(promise);\n        }\n\n        return $q.all(promises);\n      },\n\n      /**\n       * @ngdoc function\n       * @name createDefaultValidators\n       * @methodOf ui.grid.validate.service:uiGridValidateService\n       * @description adds the basic validators to the list of service validators\n       */\n      createDefaultValidators: function() {\n        service.setValidator('minLength', function (argument) {\n          return function (oldValue, newValue) {\n            if (newValue === undefined || newValue === null || newValue === '') {\n              return true;\n            }\n            return newValue.length >= argument;\n          };\n        }, function(argument) {\n          return i18nService.getSafeText('validate.minLength').replace('THRESHOLD', argument);\n        });\n\n        service.setValidator('maxLength', function (argument) {\n          return function (oldValue, newValue) {\n            if (newValue === undefined || newValue === null || newValue === '') {\n              return true;\n            }\n            return newValue.length <= argument;\n          };\n        }, function(threshold) {\n          return i18nService.getSafeText('validate.maxLength').replace('THRESHOLD', threshold);\n        });\n\n        service.setValidator('required', function (argument) {\n          return function (oldValue, newValue) {\n            if (argument) {\n              return !(newValue === undefined || newValue === null || newValue === '');\n            }\n            return true;\n          };\n        }, function() {\n          return i18nService.getSafeText('validate.required');\n        });\n      },\n\n      initializeGrid: function (scope, grid) {\n        grid.validate = {\n\n          isInvalid: service.isInvalid,\n\n          getErrorMessages: service.getErrorMessages,\n\n          getFormattedErrors: service.getFormattedErrors,\n\n          getTitleFormattedErrors: service.getTitleFormattedErrors,\n\n          runValidators: service.runValidators\n        };\n\n        /**\n         *  @ngdoc object\n         *  @name ui.grid.validate.api:PublicApi\n         *\n         *  @description Public Api for validation feature\n         */\n        var publicApi = {\n          events: {\n            validate: {\n              /**\n               * @ngdoc event\n               * @name validationFailed\n               * @eventOf ui.grid.validate.api:PublicApi\n               * @description raised when one or more failure happened during validation\n               * <pre>\n               *      gridApi.validate.on.validationFailed(scope, function(rowEntity, colDef, newValue, oldValue){...})\n               * </pre>\n               * @param {object} rowEntity the options.data element whose validation failed\n               * @param {object} colDef the column whose validation failed\n               * @param {object} newValue new value\n               * @param {object} oldValue old value\n               */\n              validationFailed: function (rowEntity, colDef, newValue, oldValue) {\n              }\n            }\n          },\n          methods: {\n            validate: {\n              /**\n               * @ngdoc function\n               * @name isInvalid\n               * @methodOf ui.grid.validate.api:PublicApi\n               * @description checks if a cell (identified by rowEntity, colDef) is invalid\n               * @param {object} rowEntity gridOptions.data[] array instance we want to check\n               * @param {object} colDef the column whose errors we want to check\n               * @returns {boolean} true if the cell value is not valid\n               */\n              isInvalid: function(rowEntity, colDef) {\n                return grid.validate.isInvalid(rowEntity, colDef);\n              },\n              /**\n               * @ngdoc function\n               * @name getErrorMessages\n               * @methodOf ui.grid.validate.api:PublicApi\n               * @description returns an array of i18n-ed error messages.\n               * @param {object} rowEntity gridOptions.data[] array instance whose errors we are looking for\n               * @param {object} colDef the column whose errors we are looking for\n               * @returns {array} An array of strings containing all the error messages for the cell\n               */\n              getErrorMessages: function (rowEntity, colDef) {\n                return grid.validate.getErrorMessages(rowEntity, colDef);\n              },\n              /**\n               * @ngdoc function\n               * @name getFormattedErrors\n               * @methodOf ui.grid.validate.api:PublicApi\n               * @description returns the error i18n-ed and formatted in html to be shown inside the page.\n               * @param {object} rowEntity gridOptions.data[] array instance whose errors we are looking for\n               * @param {object} colDef the column whose errors we are looking for\n               * @returns {object} An object that can be used in a template (like a cellTemplate) to display the\n               * message inside the page (i.e. inside a div)\n               */\n              getFormattedErrors: function (rowEntity, colDef) {\n                return grid.validate.getFormattedErrors(rowEntity, colDef);\n              },\n              /**\n               * @ngdoc function\n               * @name getTitleFormattedErrors\n               * @methodOf ui.grid.validate.api:PublicApi\n               * @description returns the error i18n-ed and formatted in javaScript to be shown inside an html\n               * title attribute.\n               * @param {object} rowEntity gridOptions.data[] array instance whose errors we are looking for\n               * @param {object} colDef the column whose errors we are looking for\n               * @returns {object} An object that can be used in a template (like a cellTemplate) to display the\n               * message inside an html title attribute\n               */\n              getTitleFormattedErrors: function (rowEntity, colDef) {\n                return grid.validate.getTitleFormattedErrors(rowEntity, colDef);\n              }\n            }\n          }\n        };\n\n        grid.api.registerEventsFromObject(publicApi.events);\n        grid.api.registerMethodsFromObject(publicApi.methods);\n\n        if (grid.edit) {\n          grid.api.edit.on.afterCellEdit(scope, function(rowEntity, colDef, newValue, oldValue) {\n            grid.validate.runValidators(rowEntity, colDef, newValue, oldValue, grid);\n          });\n        }\n\n        service.createDefaultValidators();\n      }\n    };\n\n    return service;\n  }]);\n\n  /**\n   *  @ngdoc directive\n   *  @name ui.grid.validate.directive:uiGridValidate\n   *  @element div\n   *  @restrict A\n   *  @description Adds validating features to the ui-grid directive.\n   *  @example\n   <example module=\"app\">\n   <file name=\"app.js\">\n   var app = angular.module('app', ['ui.grid', 'ui.grid.edit', 'ui.grid.validate']);\n\n   app.controller('MainCtrl', ['$scope', function ($scope) {\n      $scope.data = [\n        { name: 'Bob', title: 'CEO' },\n            { name: 'Frank', title: 'Lowly Developer' }\n      ];\n\n      $scope.columnDefs = [\n        {name: 'name', enableCellEdit: true, validators: {minLength: 3, maxLength: 9}, cellTemplate: 'ui-grid/cellTitleValidator'},\n        {name: 'title', enableCellEdit: true, validators: {required: true}, cellTemplate: 'ui-grid/cellTitleValidator'}\n      ];\n    }]);\n   </file>\n   <file name=\"index.ced81ed4.html\">\n   <div ng-controller=\"MainCtrl\">\n   <div ui-grid=\"{ data: data, columnDefs: columnDefs }\" ui-grid-edit ui-grid-validate></div>\n   </div>\n   </file>\n   </example>\n   */\n\n  module.directive('uiGridValidate', ['gridUtil', 'uiGridValidateService', function (gridUtil, uiGridValidateService) {\n    return {\n      priority: 0,\n      replace: true,\n      require: '^uiGrid',\n      scope: false,\n      compile: function () {\n        return {\n          pre: function ($scope, $elm, $attrs, uiGridCtrl) {\n            uiGridValidateService.initializeGrid($scope, uiGridCtrl.grid);\n          },\n          post: function ($scope, $elm, $attrs, uiGridCtrl) {\n          }\n        };\n      }\n    };\n  }]);\n})();\n\nangular.module('ui.grid').run(['$templateCache', function($templateCache) {\n  'use strict';\n\n  $templateCache.put('ui-grid/ui-grid-filter',\n    \"<div class=\\\"ui-grid-filter-container\\\" ng-style=\\\"col.extraStyle\\\" ng-repeat=\\\"colFilter in col.filters\\\" ng-class=\\\"{'ui-grid-filter-cancel-button-hidden' : colFilter.disableCancelFilterButton === true }\\\"><div ng-if=\\\"colFilter.type !== 'select'\\\"><input type=\\\"text\\\" class=\\\"ui-grid-filter-input ui-grid-filter-input-{{$index}}\\\" ng-model=\\\"colFilter.term\\\" ng-attr-placeholder=\\\"{{colFilter.placeholder || ''}}\\\" aria-label=\\\"{{colFilter.ariaLabel || aria.defaultFilterLabel}}\\\"><div role=\\\"button\\\" class=\\\"ui-grid-filter-button\\\" ng-click=\\\"removeFilter(colFilter, $index)\\\" ng-if=\\\"!colFilter.disableCancelFilterButton\\\" ng-disabled=\\\"colFilter.term === undefined || colFilter.term === null || colFilter.term === ''\\\" ng-show=\\\"colFilter.term !== undefined && colFilter.term !== null && colFilter.term !== ''\\\"><i class=\\\"ui-grid-icon-cancel\\\" ui-grid-one-bind-aria-label=\\\"aria.removeFilter\\\">&nbsp;</i></div></div><div ng-if=\\\"colFilter.type === 'select'\\\"><select class=\\\"ui-grid-filter-select ui-grid-filter-input-{{$index}}\\\" ng-model=\\\"colFilter.term\\\" ng-show=\\\"colFilter.selectOptions.length > 0\\\" ng-attr-placeholder=\\\"{{colFilter.placeholder || aria.defaultFilterLabel}}\\\" aria-label=\\\"{{colFilter.ariaLabel || ''}}\\\" ng-options=\\\"option.value as option.label for option in colFilter.selectOptions\\\"><option value=\\\"\\\"></option></select><div role=\\\"button\\\" class=\\\"ui-grid-filter-button-select\\\" ng-click=\\\"removeFilter(colFilter, $index)\\\" ng-if=\\\"!colFilter.disableCancelFilterButton\\\" ng-disabled=\\\"colFilter.term === undefined || colFilter.term === null || colFilter.term === ''\\\" ng-show=\\\"colFilter.term !== undefined && colFilter.term != null\\\"><i class=\\\"ui-grid-icon-cancel\\\" ui-grid-one-bind-aria-label=\\\"aria.removeFilter\\\">&nbsp;</i></div></div></div>\"\n  );\n\n\n  $templateCache.put('ui-grid/ui-grid-footer',\n    \"<div class=\\\"ui-grid-footer-panel ui-grid-footer-aggregates-row\\\"><!-- tfooter --><div class=\\\"ui-grid-footer ui-grid-footer-viewport\\\"><div class=\\\"ui-grid-footer-canvas\\\"><div class=\\\"ui-grid-footer-cell-wrapper\\\" ng-style=\\\"colContainer.headerCellWrapperStyle()\\\"><div role=\\\"row\\\" class=\\\"ui-grid-footer-cell-row\\\"><div ui-grid-footer-cell role=\\\"gridcell\\\" ng-repeat=\\\"col in colContainer.renderedColumns track by col.uid\\\" col=\\\"col\\\" render-index=\\\"$index\\\" class=\\\"ui-grid-footer-cell ui-grid-clearfix\\\"></div></div></div></div></div></div>\"\n  );\n\n\n  $templateCache.put('ui-grid/ui-grid-grid-footer',\n    \"<div class=\\\"ui-grid-footer-info ui-grid-grid-footer\\\"><span>{{'search.totalItems' | t}} {{grid.rows.length}}</span> <span ng-if=\\\"grid.renderContainers.body.visibleRowCache.length !== grid.rows.length\\\" class=\\\"ngLabel\\\">({{\\\"search.showingItems\\\" | t}} {{grid.renderContainers.body.visibleRowCache.length}})</span></div>\"\n  );\n\n\n  $templateCache.put('ui-grid/ui-grid-header',\n    \"<div role=\\\"rowgroup\\\" class=\\\"ui-grid-header\\\"><!-- theader --><div class=\\\"ui-grid-top-panel\\\"><div class=\\\"ui-grid-header-viewport\\\"><div class=\\\"ui-grid-header-canvas\\\"><div class=\\\"ui-grid-header-cell-wrapper\\\" ng-style=\\\"colContainer.headerCellWrapperStyle()\\\"><div role=\\\"row\\\" class=\\\"ui-grid-header-cell-row\\\"><div role=\\\"columnheader\\\" class=\\\"ui-grid-header-cell ui-grid-clearfix\\\" ng-repeat=\\\"col in colContainer.renderedColumns track by col.uid\\\" ui-grid-header-cell col=\\\"col\\\" render-index=\\\"$index\\\"></div></div></div></div></div></div></div>\"\n  );\n\n\n  $templateCache.put('ui-grid/ui-grid-menu-button',\n    \"<div class=\\\"ui-grid-menu-button\\\"><div role=\\\"button\\\" ui-grid-one-bind-id-grid=\\\"'grid-menu'\\\" ui-grid-one-bind-aria-label=\\\"i18n.aria.buttonLabel\\\" tabindex=\\\"0\\\" class=\\\"ui-grid-icon-container\\\" ng-click=\\\"toggleMenu()\\\" ng-keydown=\\\"toggleOnKeydown($event)\\\" aria-expanded=\\\"{{shown}}\\\" aria-haspopup=\\\"true\\\"><i class=\\\"ui-grid-icon-menu\\\" ui-grid-one-bind-aria-label=\\\"i18n.aria.buttonLabel\\\">&nbsp;</i></div><div ui-grid-menu menu-items=\\\"menuItems\\\"></div></div>\"\n  );\n\n\n  $templateCache.put('ui-grid/ui-grid-menu-header-item',\n    \"<li role=\\\"menuitem\\\"><div class=\\\"ui-grid-menu-item\\\" role=\\\"heading\\\" aria-level=\\\"2\\\" ng-show=\\\"itemShown()\\\"><i aria-hidden=\\\"true\\\">&nbsp; </i><span ng-bind=\\\"label()\\\"></span></div></li>\"\n  );\n\n\n  $templateCache.put('ui-grid/ui-grid-no-header',\n    \"<div class=\\\"ui-grid-top-panel\\\"></div>\"\n  );\n\n\n  $templateCache.put('ui-grid/ui-grid-row',\n    \"<div ng-repeat=\\\"(colRenderIndex, col) in colContainer.renderedColumns track by col.uid\\\" ui-grid-one-bind-id-grid=\\\"rowRenderIndex + '-' + col.uid + '-cell'\\\" class=\\\"ui-grid-cell\\\" ng-class=\\\"{ 'ui-grid-row-header-cell': col.isRowHeader }\\\" role=\\\"{{col.isRowHeader ? 'rowheader' : 'gridcell'}}\\\" ui-grid-cell></div>\"\n  );\n\n\n  $templateCache.put('ui-grid/ui-grid',\n    \"<div ui-i18n=\\\"en\\\" class=\\\"ui-grid\\\"><!-- TODO (c0bra): add \\\"scoped\\\" attr here, eventually? --><style ui-grid-style>.grid{{ grid.id }} {\\n\" +\n    \"      /* Styles for the grid */\\n\" +\n    \"    }\\n\" +\n    \"\\n\" +\n    \"    .grid{{ grid.id }} .ui-grid-row, .grid{{ grid.id }} .ui-grid-cell, .grid{{ grid.id }} .ui-grid-cell .ui-grid-vertical-bar {\\n\" +\n    \"      height: {{ grid.options.rowHeight }}px;\\n\" +\n    \"    }\\n\" +\n    \"\\n\" +\n    \"    .grid{{ grid.id }} .ui-grid-row:last-child .ui-grid-cell {\\n\" +\n    \"      border-bottom-width: {{ (((grid.getVisibleRowCount() * grid.options.rowHeight) < grid.getViewportHeight()) && '1') || '0' }}px;\\n\" +\n    \"    }\\n\" +\n    \"\\n\" +\n    \"    {{ grid.verticalScrollbarStyles }}\\n\" +\n    \"    {{ grid.horizontalScrollbarStyles }}\\n\" +\n    \"\\n\" +\n    \"    /*\\n\" +\n    \"    .ui-grid[dir=rtl] .ui-grid-viewport {\\n\" +\n    \"      padding-left: {{ grid.verticalScrollbarWidth }}px;\\n\" +\n    \"    }\\n\" +\n    \"    */\\n\" +\n    \"\\n\" +\n    \"    {{ grid.customStyles }}</style><div class=\\\"ui-grid-contents-wrapper\\\" role=\\\"grid\\\"><div ui-grid-menu-button ng-if=\\\"grid.options.enableGridMenu\\\"></div><div ng-if=\\\"grid.hasLeftContainer()\\\" style=\\\"width: 0\\\" ui-grid-pinned-container=\\\"'left'\\\"></div><div ui-grid-render-container container-id=\\\"'body'\\\" col-container-name=\\\"'body'\\\" row-container-name=\\\"'body'\\\" bind-scroll-horizontal=\\\"true\\\" bind-scroll-vertical=\\\"true\\\" enable-horizontal-scrollbar=\\\"grid.options.enableHorizontalScrollbar\\\" enable-vertical-scrollbar=\\\"grid.options.enableVerticalScrollbar\\\"></div><div ng-if=\\\"grid.hasRightContainer()\\\" style=\\\"width: 0\\\" ui-grid-pinned-container=\\\"'right'\\\"></div><div ui-grid-grid-footer ng-if=\\\"grid.options.showGridFooter\\\"></div><div ui-grid-column-menu ng-if=\\\"grid.options.enableColumnMenus\\\"></div><div ng-transclude></div></div></div>\"\n  );\n\n\n  $templateCache.put('ui-grid/uiGridCell',\n    \"<div class=\\\"ui-grid-cell-contents\\\" title=\\\"TOOLTIP\\\">{{COL_FIELD CUSTOM_FILTERS}}</div>\"\n  );\n\n\n  $templateCache.put('ui-grid/uiGridColumnMenu',\n    \"<div class=\\\"ui-grid-column-menu\\\"><div ui-grid-menu menu-items=\\\"menuItems\\\" col=\\\"col\\\"><!-- <div class=\\\"ui-grid-column-menu\\\">\\n\" +\n    \"    <div class=\\\"inner\\\" ng-show=\\\"menuShown\\\">\\n\" +\n    \"      <ul>\\n\" +\n    \"        <div ng-show=\\\"grid.options.enableSorting\\\">\\n\" +\n    \"          <li ng-click=\\\"sortColumn($event, asc)\\\" ng-class=\\\"{ 'selected' : col.sort.direction == asc }\\\"><i class=\\\"ui-grid-icon-sort-alt-up\\\"></i> Sort Ascending</li>\\n\" +\n    \"          <li ng-click=\\\"sortColumn($event, desc)\\\" ng-class=\\\"{ 'selected' : col.sort.direction == desc }\\\"><i class=\\\"ui-grid-icon-sort-alt-down\\\"></i> Sort Descending</li>\\n\" +\n    \"          <li ng-show=\\\"col.sort.direction\\\" ng-click=\\\"unsortColumn()\\\"><i class=\\\"ui-grid-icon-cancel\\\"></i> Remove Sort</li>\\n\" +\n    \"        </div>\\n\" +\n    \"      </ul>\\n\" +\n    \"    </div>\\n\" +\n    \"  </div> --></div></div>\"\n  );\n\n\n  $templateCache.put('ui-grid/uiGridFooterCell',\n    \"<div class=\\\"ui-grid-cell-contents\\\" col-index=\\\"renderIndex\\\"><div>{{ col.getAggregationText() + ( col.getAggregationValue() CUSTOM_FILTERS ) }}</div></div>\"\n  );\n\n\n  $templateCache.put('ui-grid/uiGridHeaderCell',\n    \"<div role=\\\"columnheader\\\" ng-class=\\\"{ 'sortable': sortable, 'ui-grid-header-cell-last-col': isLastCol }\\\" ui-grid-one-bind-aria-labelledby-grid=\\\"col.uid + '-header-text ' + col.uid + '-sortdir-text'\\\" aria-sort=\\\"{{col.sort.direction == asc ? 'ascending' : ( col.sort.direction == desc ? 'descending' : (!col.sort.direction ? 'none' : 'other'))}}\\\"><div role=\\\"button\\\" tabindex=\\\"0\\\" ng-keydown=\\\"handleKeyDown($event)\\\" class=\\\"ui-grid-cell-contents ui-grid-header-cell-primary-focus\\\" col-index=\\\"renderIndex\\\" title=\\\"TOOLTIP\\\"><span class=\\\"ui-grid-header-cell-label\\\" ui-grid-one-bind-id-grid=\\\"col.uid + '-header-text'\\\">{{ col.displayName CUSTOM_FILTERS }}</span> <span ui-grid-one-bind-id-grid=\\\"col.uid + '-sortdir-text'\\\" ui-grid-visible=\\\"col.sort.direction\\\" aria-label=\\\"{{getSortDirectionAriaLabel()}}\\\"><i ng-class=\\\"{ 'ui-grid-icon-up-dir': col.sort.direction == asc, 'ui-grid-icon-down-dir': col.sort.direction == desc, 'ui-grid-icon-blank': !col.sort.direction }\\\" title=\\\"{{isSortPriorityVisible() ? i18n.headerCell.priority + ' ' + ( col.sort.priority + 1 )  : null}}\\\" aria-hidden=\\\"true\\\"></i> <sub ui-grid-visible=\\\"isSortPriorityVisible()\\\" class=\\\"ui-grid-sort-priority-number\\\">{{col.sort.priority + 1}}</sub></span></div><div role=\\\"button\\\" tabindex=\\\"0\\\" ui-grid-one-bind-id-grid=\\\"col.uid + '-menu-button'\\\" class=\\\"ui-grid-column-menu-button\\\" ng-if=\\\"grid.options.enableColumnMenus && !col.isRowHeader  && col.colDef.enableColumnMenu !== false\\\" ng-click=\\\"toggleMenu($event)\\\" ng-keydown=\\\"headerCellArrowKeyDown($event)\\\" ui-grid-one-bind-aria-label=\\\"i18n.headerCell.aria.columnMenuButtonLabel\\\" aria-expanded=\\\"{{col.menuShown}}\\\" aria-haspopup=\\\"true\\\"><i class=\\\"ui-grid-icon-angle-down\\\" aria-hidden=\\\"true\\\">&nbsp;</i></div><div ui-grid-filter ng-hide=\\\"col.filterContainer === 'columnMenu'\\\"></div></div>\"\n  );\n\n\n  $templateCache.put('ui-grid/uiGridMenu',\n    \"<div class=\\\"ui-grid-menu\\\" ng-keydown=\\\"checkKeyDown($event)\\\" ng-show=\\\"shown\\\"><style ui-grid-style>{{dynamicStyles}}</style><div class=\\\"ui-grid-menu-mid\\\" ng-show=\\\"shownMid\\\"><div class=\\\"ui-grid-menu-inner\\\" ng-if=\\\"shown\\\"><ul role=\\\"menu\\\" class=\\\"ui-grid-menu-items\\\"><li ng-repeat=\\\"item in menuItems\\\" role=\\\"menuitem\\\" ui-grid-menu-item ui-grid-one-bind-id=\\\"'menuitem-'+$index\\\" action=\\\"item.action\\\" name=\\\"item.title\\\" active=\\\"item.active\\\" icon=\\\"item.icon\\\" shown=\\\"item.shown\\\" context=\\\"item.context\\\" template-url=\\\"item.templateUrl\\\" leave-open=\\\"item.leaveOpen\\\" screen-reader-only=\\\"item.screenReaderOnly\\\"></li><li ng-if=\\\"col.filterable && col.filterContainer === 'columnMenu'\\\"><div ui-grid-filter></div></li></ul></div></div></div>\"\n  );\n\n\n  $templateCache.put('ui-grid/uiGridMenuItem',\n    \"<button type=\\\"button\\\" class=\\\"ui-grid-menu-item\\\" ng-click=\\\"itemAction($event, title)\\\" ng-show=\\\"itemShown()\\\" ng-class=\\\"{ 'ui-grid-menu-item-active': active(), 'ui-grid-sr-only': (!focus && screenReaderOnly) }\\\" aria-pressed=\\\"{{active()}}\\\" tabindex=\\\"0\\\" ng-focus=\\\"focus=true\\\" ng-blur=\\\"focus=false\\\"><i ng-class=\\\"icon\\\" aria-hidden=\\\"true\\\">&nbsp; </i>{{ label() }}</button>\"\n  );\n\n\n  $templateCache.put('ui-grid/uiGridRenderContainer',\n    \"<div role=\\\"presentation\\\" ui-grid-one-bind-id-grid=\\\"containerId + '-grid-container'\\\" class=\\\"ui-grid-render-container\\\" ng-style=\\\"{ 'margin-left': colContainer.getMargin('left') + 'px', 'margin-right': colContainer.getMargin('right') + 'px' }\\\"><!-- All of these dom elements are replaced in place --><div ui-grid-header></div><div ui-grid-viewport></div><div ng-if=\\\"colContainer.needsHScrollbarPlaceholder()\\\" class=\\\"ui-grid-scrollbar-placeholder\\\" ng-style=\\\"{height: colContainer.grid.scrollbarHeight + 'px'}\\\"></div><ui-grid-footer ng-if=\\\"grid.options.showColumnFooter\\\"></ui-grid-footer></div>\"\n  );\n\n\n  $templateCache.put('ui-grid/uiGridViewport',\n    \"<div role=\\\"rowgroup\\\" class=\\\"ui-grid-viewport\\\" ng-style=\\\"colContainer.getViewportStyle()\\\"><!-- tbody --><div class=\\\"ui-grid-canvas\\\"><div ng-repeat=\\\"(rowRenderIndex, row) in rowContainer.renderedRows track by $index\\\" class=\\\"ui-grid-row\\\" ng-style=\\\"Viewport.rowStyle(rowRenderIndex)\\\"><div role=\\\"row\\\" ui-grid-row=\\\"row\\\" row-render-index=\\\"rowRenderIndex\\\"></div></div></div></div>\"\n  );\n\n\n  $templateCache.put('ui-grid/cellEditor',\n    \"<div><form name=\\\"inputForm\\\"><input type=\\\"INPUT_TYPE\\\" ng-class=\\\"'colt' + col.uid\\\" ui-grid-editor ng-model=\\\"MODEL_COL_FIELD\\\"></form></div>\"\n  );\n\n\n  $templateCache.put('ui-grid/dropdownEditor',\n    \"<div><form name=\\\"inputForm\\\"><select ng-class=\\\"'colt' + col.uid\\\" ui-grid-edit-dropdown ng-model=\\\"MODEL_COL_FIELD\\\" ng-options=\\\"field[editDropdownIdLabel] as field[editDropdownValueLabel] CUSTOM_FILTERS for field in editDropdownOptionsArray\\\"></select></form></div>\"\n  );\n\n\n  $templateCache.put('ui-grid/fileChooserEditor',\n    \"<div><form name=\\\"inputForm\\\"><input ng-class=\\\"'colt' + col.uid\\\" ui-grid-edit-file-chooser type=\\\"file\\\" id=\\\"files\\\" name=\\\"files[]\\\" ng-model=\\\"MODEL_COL_FIELD\\\"></form></div>\"\n  );\n\n\n  $templateCache.put('ui-grid/emptyBaseLayerContainer',\n    \"<div class=\\\"ui-grid-empty-base-layer-container ui-grid-canvas\\\"><div class=\\\"ui-grid-row\\\" ng-repeat=\\\"(rowRenderIndex, row) in grid.baseLayer.emptyRows track by $index\\\" ng-style=\\\"Viewport.rowStyle(rowRenderIndex)\\\"><div><div><div ng-repeat=\\\"(colRenderIndex, col) in colContainer.renderedColumns track by col.colDef.name\\\" class=\\\"ui-grid-cell {{ col.getColClass(false) }}\\\"></div></div></div></div></div>\"\n  );\n\n\n  $templateCache.put('ui-grid/expandableRow',\n    \"<div ui-grid-expandable-row ng-if=\\\"expandableRow.shouldRenderExpand()\\\" class=\\\"expandableRow\\\" style=\\\"float:left; margin-top: 1px; margin-bottom: 1px\\\" ng-style=\\\"{width: (grid.renderContainers.body.getCanvasWidth()) + 'px', height: row.expandedRowHeight + 'px'}\\\"></div>\"\n  );\n\n\n  $templateCache.put('ui-grid/expandableRowHeader',\n    \"<div class=\\\"ui-grid-row-header-cell ui-grid-expandable-buttons-cell\\\"><div class=\\\"ui-grid-cell-contents\\\"><i class=\\\"clickable\\\" ng-if=\\\"!(row.groupHeader==true || row.entity.subGridOptions.disableRowExpandable)\\\" ng-class=\\\"{ 'ui-grid-icon-plus-squared' : !row.isExpanded, 'ui-grid-icon-minus-squared' : row.isExpanded }\\\" ng-click=\\\"grid.api.expandable.toggleRowExpansion(row.entity, $event)\\\" aria-expanded=\\\"{{!!row.isExpanded}}\\\"></i></div></div>\"\n  );\n\n\n  $templateCache.put('ui-grid/expandableScrollFiller',\n    \"<div ng-if=\\\"expandableRow.shouldRenderFiller()\\\" ng-class=\\\"{scrollFiller: true, scrollFillerClass:(colContainer.name === 'body')}\\\" ng-style=\\\"{ width: (grid.getViewportWidth()) + 'px', height: row.expandedRowHeight + 2 + 'px', 'margin-left': grid.options.rowHeader.rowHeaderWidth + 'px' }\\\">&nbsp;</div>\"\n  );\n\n\n  $templateCache.put('ui-grid/expandableTopRowHeader',\n    \"<div class=\\\"ui-grid-row-header-cell ui-grid-expandable-buttons-cell\\\"><div class=\\\"ui-grid-cell-contents\\\"><span class=\\\"ui-grid-cell-empty\\\" ng-if=\\\"!grid.options.showExpandAllButton\\\"></span> <button type=\\\"button\\\" class=\\\"ui-grid-icon-button clickable\\\" ng-if=\\\"grid.options.showExpandAllButton\\\" ng-class=\\\"{ 'ui-grid-icon-plus-squared' : !grid.expandable.expandedAll, 'ui-grid-icon-minus-squared' : grid.expandable.expandedAll }\\\" ng-click=\\\"grid.api.expandable.toggleAllRows()\\\" aria-expanded=\\\"{{grid.expandable.expandedAll}}\\\"></button></div></div>\"\n  );\n\n\n  $templateCache.put('ui-grid/csvLink',\n    \"<span class=\\\"ui-grid-exporter-csv-link-span\\\"><a href=\\\"data:text/csv;charset=UTF-8,CSV_CONTENT\\\" download=\\\"FILE_NAME\\\">LINK_LABEL</a></span>\"\n  );\n\n\n  $templateCache.put('ui-grid/importerMenuItem',\n    \"<li class=\\\"ui-grid-menu-item\\\"><form><input class=\\\"ui-grid-importer-file-chooser\\\" type=\\\"file\\\" id=\\\"files\\\" name=\\\"files[]\\\"></form></li>\"\n  );\n\n\n  $templateCache.put('ui-grid/importerMenuItemContainer',\n    \"<div ui-grid-importer-menu-item></div>\"\n  );\n\n\n  $templateCache.put('ui-grid/pagination',\n    \"<div class=\\\"ui-grid-pager-panel\\\" ui-grid-pager ng-show=\\\"grid.options.enablePaginationControls\\\"><div role=\\\"navigation\\\" class=\\\"ui-grid-pager-container\\\"><div class=\\\"ui-grid-pager-control\\\"><button type=\\\"button\\\" class=\\\"ui-grid-pager-first\\\" ui-grid-one-bind-title=\\\"aria.pageToFirst\\\" ui-grid-one-bind-aria-label=\\\"aria.pageToFirst\\\" ng-click=\\\"pageFirstPageClick()\\\" ng-disabled=\\\"cantPageBackward()\\\"><div ng-class=\\\"grid.isRTL() ? 'last-triangle' : 'first-triangle'\\\"><div ng-class=\\\"grid.isRTL() ? 'last-bar-rtl' : 'first-bar'\\\"></div></div></button> <button type=\\\"button\\\" class=\\\"ui-grid-pager-previous\\\" ui-grid-one-bind-title=\\\"aria.pageBack\\\" ui-grid-one-bind-aria-label=\\\"aria.pageBack\\\" ng-click=\\\"pagePreviousPageClick()\\\" ng-disabled=\\\"cantPageBackward()\\\"><div ng-class=\\\"grid.isRTL() ? 'last-triangle prev-triangle' : 'first-triangle prev-triangle'\\\"></div></button> <input type=\\\"number\\\" ui-grid-one-bind-title=\\\"aria.pageSelected\\\" ui-grid-one-bind-aria-label=\\\"aria.pageSelected\\\" class=\\\"ui-grid-pager-control-input\\\" ng-model=\\\"grid.options.paginationCurrentPage\\\" min=\\\"1\\\" max=\\\"{{ paginationApi.getTotalPages() }}\\\" step=\\\"1\\\" required> <span class=\\\"ui-grid-pager-max-pages-number\\\" ng-show=\\\"paginationApi.getTotalPages() > 0\\\"><abbr ui-grid-one-bind-title=\\\"paginationOf\\\">/ </abbr>{{ paginationApi.getTotalPages() }} </span><button type=\\\"button\\\" class=\\\"ui-grid-pager-next\\\" ui-grid-one-bind-title=\\\"aria.pageForward\\\" ui-grid-one-bind-aria-label=\\\"aria.pageForward\\\" ng-click=\\\"pageNextPageClick()\\\" ng-disabled=\\\"cantPageForward()\\\"><div ng-class=\\\"grid.isRTL() ? 'first-triangle next-triangle' : 'last-triangle next-triangle'\\\"></div></button> <button type=\\\"button\\\" class=\\\"ui-grid-pager-last\\\" ui-grid-one-bind-title=\\\"aria.pageToLast\\\" ui-grid-one-bind-aria-label=\\\"aria.pageToLast\\\" ng-click=\\\"pageLastPageClick()\\\" ng-disabled=\\\"cantPageToLast()\\\"><div ng-class=\\\"grid.isRTL() ? 'first-triangle' : 'last-triangle'\\\"><div ng-class=\\\"grid.isRTL() ? 'first-bar-rtl' : 'last-bar'\\\"></div></div></button></div><div class=\\\"ui-grid-pager-row-count-picker\\\" ng-if=\\\"grid.options.paginationPageSizes.length > 1 && !grid.options.useCustomPagination\\\"><select ui-grid-one-bind-aria-labelledby-grid=\\\"'items-per-page-label'\\\" ng-model=\\\"grid.options.paginationPageSize\\\" ng-options=\\\"o as o for o in grid.options.paginationPageSizes\\\"></select> <span ui-grid-one-bind-id-grid=\\\"'items-per-page-label'\\\" class=\\\"ui-grid-pager-row-count-label\\\">&nbsp;{{sizesLabel}}</span></div><span ng-if=\\\"grid.options.paginationPageSizes.length <= 1\\\" class=\\\"ui-grid-pager-row-count-label\\\">{{grid.options.paginationPageSize}}&nbsp;{{sizesLabel}}</span></div><div class=\\\"ui-grid-pager-count-container\\\"><div class=\\\"ui-grid-pager-count\\\"><span ng-show=\\\"grid.options.totalItems > 0\\\">{{ 1 + paginationApi.getFirstRowIndex() }} <abbr ui-grid-one-bind-title=\\\"paginationThrough\\\">- </abbr>{{ 1 + paginationApi.getLastRowIndex() }} {{paginationOf}} {{grid.options.totalItems}} {{totalItemsLabel}}</span></div></div></div>\"\n  );\n\n\n  $templateCache.put('ui-grid/columnResizer',\n    \"<div ui-grid-column-resizer ng-if=\\\"grid.options.enableColumnResizing\\\" class=\\\"ui-grid-column-resizer\\\" col=\\\"col\\\" position=\\\"right\\\" render-index=\\\"renderIndex\\\" unselectable=\\\"on\\\"></div>\"\n  );\n\n\n  $templateCache.put('ui-grid/gridFooterSelectedItems',\n    \"<span ng-if=\\\"grid.selection.selectedCount !== 0 && grid.options.enableFooterTotalSelected\\\">({{\\\"search.selectedItems\\\" | t}} {{grid.selection.selectedCount}})</span>\"\n  );\n\n\n  $templateCache.put('ui-grid/selectionHeaderCell',\n    \"<div><!-- <div class=\\\"ui-grid-vertical-bar\\\">&nbsp;</div> --><div class=\\\"ui-grid-cell-contents\\\" col-index=\\\"renderIndex\\\"><ui-grid-selection-select-all-buttons ng-if=\\\"grid.options.enableSelectAll\\\" role=\\\"checkbox\\\" ng-model=\\\"grid.selection.selectAll\\\"></ui-grid-selection-select-all-buttons></div></div>\"\n  );\n\n\n  $templateCache.put('ui-grid/selectionRowHeader',\n    \"<div class=\\\"ui-grid-cell-contents ui-grid-disable-selection clickable\\\"><ui-grid-selection-row-header-buttons></ui-grid-selection-row-header-buttons></div>\"\n  );\n\n\n  $templateCache.put('ui-grid/selectionRowHeaderButtons',\n    \"<div class=\\\"ui-grid-selection-row-header-buttons ui-grid-icon-ok clickable\\\" ng-class=\\\"{'ui-grid-row-selected': row.isSelected}\\\" tabindex=\\\"0\\\" ng-click=\\\"selectButtonClick(row, $event)\\\" ng-keydown=\\\"selectButtonKeyDown(row, $event)\\\" ng-attr-aria-label=\\\"{{('selection.aria.row' | t) + ' ' + (row.index + 1) + ', ' + col.displayName}}\\\" aria-checked=\\\"{{row.isSelected}}\\\" role=\\\"checkbox\\\" ng-model=\\\"row.isSelected\\\">&nbsp;</div>\"\n  );\n\n\n  $templateCache.put('ui-grid/selectionSelectAllButtons',\n    \"<div role=\\\"checkbox\\\" tabindex=\\\"0\\\" class=\\\"ui-grid-selection-row-header-buttons ui-grid-icon-ok\\\" ui-grid-one-bind-aria-label=\\\"'selection.selectAll' | t\\\" aria-checked=\\\"{{grid.selection.selectAll}}\\\" ng-class=\\\"{'ui-grid-all-selected': grid.selection.selectAll}\\\" ng-click=\\\"headerButtonClick($event)\\\" ng-keydown=\\\"headerButtonKeyDown($event)\\\"></div>\"\n  );\n\n\n  $templateCache.put('ui-grid/treeBaseExpandAllButtons',\n    \"<div class=\\\"ui-grid-tree-base-row-header-buttons\\\" tabindex=\\\"0\\\" ng-class=\\\"headerButtonClass()\\\" ng-click=\\\"headerButtonClick($event)\\\" ng-keydown=\\\"headerButtonKeyDown($event)\\\"></div>\"\n  );\n\n\n  $templateCache.put('ui-grid/treeBaseHeaderCell',\n    \"<div><div class=\\\"ui-grid-cell-contents\\\" col-index=\\\"renderIndex\\\"><ui-grid-tree-base-expand-all-buttons ng-if=\\\"grid.options.enableExpandAll\\\"></ui-grid-tree-base-expand-all-buttons></div></div>\"\n  );\n\n\n  $templateCache.put('ui-grid/treeBaseRowHeader',\n    \"<div class=\\\"ui-grid-cell-contents\\\"><ui-grid-tree-base-row-header-buttons></ui-grid-tree-base-row-header-buttons></div>\"\n  );\n\n\n  $templateCache.put('ui-grid/treeBaseRowHeaderButtons',\n    \"<div class=\\\"ui-grid-tree-base-row-header-buttons\\\" ng-class=\\\"{'ui-grid-tree-base-header': row.treeLevel > -1 }\\\" tabindex=\\\"0\\\" ng-keydown=\\\"treeButtonKeyDown(row, $event)\\\" ng-click=\\\"treeButtonClick(row, $event)\\\"><i ng-class=\\\"treeButtonClass(row)\\\" ng-style=\\\"{'padding-left': grid.options.treeIndent * row.treeLevel + 'px'}\\\"></i> &nbsp;</div>\"\n  );\n\n\n  $templateCache.put('ui-grid/cellTitleValidator',\n    \"<div class=\\\"ui-grid-cell-contents\\\" ng-class=\\\"{invalid:grid.validate.isInvalid(row.entity,col.colDef)}\\\" title=\\\"{{grid.validate.getTitleFormattedErrors(row.entity,col.colDef)}}\\\">{{COL_FIELD CUSTOM_FILTERS}}</div>\"\n  );\n\n\n  $templateCache.put('ui-grid/cellTooltipValidator',\n    \"<div class=\\\"ui-grid-cell-contents\\\" ng-class=\\\"{invalid:grid.validate.isInvalid(row.entity,col.colDef)}\\\" tooltip-html-unsafe=\\\"{{grid.validate.getFormattedErrors(row.entity,col.colDef)}}\\\" tooltip-enable=\\\"grid.validate.isInvalid(row.entity,col.colDef)\\\" tooltip-append-to-body=\\\"true\\\" tooltip-placement=\\\"top\\\" title=\\\"TOOLTIP\\\">{{COL_FIELD CUSTOM_FILTERS}}</div>\"\n  );\n\n}]);\n"],"sourceRoot":"/source/"}